ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzODZiOQotLS0gL2Rldi9udWxsCisrKyBiLy5tYWlsbWFwCkBAIC0wLDAgKzEsMTAgQEAKK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4gQmVuamFtaW4gUmVlZCA8cmFuZ2VyQGJlZnVuay5jb20+CitCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+IEJlbmphbWluIFJlZWQgPHJhbmdlckBTaW4ubG9jYWw+CitDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbi5keXdhbkBsYW5lZG8uY29tPiBDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbkBsYW5lZG8uY29tPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQGxpZ2h0Ym94LmxvY2FsZG9tYWluPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHNwYWNlLWdob3N0LnZlcmJ1bS5wcml2YXRlPgorSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3guY29tPiBIYXZvYyBQZW5uaW5ndG9uIDxocEBsb2NhbGhvc3QubG9jYWxkb21haW4+CitSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+IFJhbGYgSGFiYWNrZXIgPFJhbGYuSGFiYWNrZXJAZnJlZW5ldC5kZT4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gUmFsZiBIYWJhY2tlciA8cmFsZkBzMTUyOTEzNTkub25saW5laG9tZS1zZXJ2ZXIuaW5mbz4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gdW5rbm93biA8QWRtaW5pc3RyYXRvckAuKG5vbmUpPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPiB1bmtub3duIDxIYWJhY2tlckAuKG5vbmUpPgpkaWZmIC0tZ2l0IGEvQVVUSE9SUyBiL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YWZkZgotLS0gL2Rldi9udWxsCisrKyBiL0FVVEhPUlMKQEAgLTAsMCArMSwxMjIgQEAKK0FsYmFuIENyZXF1eSA8YWxiYW4uY3JlcXV5QGNvbGxhYm9yYS5jby51az4KK0FsZXhhbmRlciBMYXJzc29uIDxhbGV4bEByZWRoYXQuY29tPgorQW5kZXJzIENhcmxzc29uIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KK0FuZHJlIEhlaW5lY2tlIDxhaGVpbmVja2VAaW50ZXZhdGlvbi5kZT4KK0FydGVtIEJpdHl1dHNraXkgPEFydGVtLkJpdHl1dHNraXlAbm9raWEuY29tPgorQXVyZWxpZW4gSmFybm8gPGF1cmVsMzJAZGViaWFuLm9yZz4KK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ab3JhY2xlLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KK0NocmlzIE1heW8gPGFrbGhmZXggZ21haWwgY29tPgorQ2hyaXN0aWFuIER5d2FuIDxjaHJpc3RpYW4uZHl3YW5AbGFuZWRvLmNvbT4KK0NocmlzdGlhbiBFaHJsaWNoZXIgPENoLkVocmxpY2hlckBnbXguZGU+CitDaHJpc3RpYW4gUGVyc2NoIChHTk9NRSkgPGNocGVAZ25vbWUub3JnPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPgorQ29saW4gV2F0c29uIDxjandhdHNvbkB1YnVudHUuY29tPgorQ29zaW1vIEFsZmFyYW5vIDxjb3NpbW8uYWxmYXJhbm9AY29sbGFib3JhLmNvLnVrPgorQ3Jpc3RpYW4gUm9kcsOtZ3VleiA8Y3Jpc3RpYW4ucm9kcmlndWV6QG9wZW5zdXNlLm9yZz4KK0N5cmlsIEJydWxlYm9pcyA8a2liaUBkZWJpYW4ub3JnPgorRGFuaWVsIFAuIEJlcnJhbmdlIDxkYW5AYmVycmFuZ2UuY29tPgorRGFuaWVsIFJlZWQgPGRqckByZWRoYXQuY29tPgorRGF2aWQgWmV1dGhlbiA8ZGF2aWR6QHJlZGhhdC5jb20+CitEZW5uaXMgS2FhcnNlbWFrZXIgPGRlbm5pc0BrYWFyc2VtYWtlci5uZXQ+CitEaWVnbyBFLiAnRmxhbWVleWVzJyBQZXR0ZW7DsiA8ZmxhbWVleWVzQGdtYWlsLmNvbT4KK0VhbW9uIFdhbHNoIDxld2Fsc2hAdHljaG8ubnNhLmdvdj4KK0ZlZGVyaWNvIE1lbmEgUXVpbnRlcm8gPGZlZGVyaWNvQG5vdmVsbC5jb20+CitGcmFuayBPc3RlcmZlbGQgPGZyYW5rQGtkYWIubmV0PgorRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLmNvbT4KK0ZyaWRyaWNoIMWgdHJiYSA8ZnJpZHJpY2guc3RyYmFAYmx1ZXdpbi5jaD4KK0dyemVnb3J6IETEhWJyb3dza2kgPGdkeEBwb2N6dGEuZm0+CitIYXJhbGQgRmVybmVuZ2VsIDxoYXJyeUBrZGV2ZWxvcC5vcmc+CitIYXJyaSBQb3J0ZW4gPHBvcnRlbkBrZGUub3JnPgorSGFzc28gVGVwcGVyIDxoYXNzb0Blc3RwYWsuZWU+CitIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CitIYXZvYyBQZW5uaW5ndG9uIDxocEByZWRoYXQuY29tPgorSGVuZHJpayBCdXNjaG1laWVyIDxoYnVzY2htZUBUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CitKYW1lcyBDYXJ0ZXIgPGp3Y2FydDJAdHljaG8ubnNhLmdvdj4KK0phbWVzIFdlc3RieSA8ancrZGViaWFuQGphbWVzd2VzdGJ5Lm5ldD4KK0phbWVzIFdpbGxjb3ggPGp3aWxsY294QGdub21lLm9yZz4KK0plbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KK0rDqXLDqW1pZSBEaW1pbm8gPGplcmVtaWVAZGltaW5vLm9yZz4KK0ppxZnDrSBLbGltZcWhIDxqa2xpbWVzQHJlZGhhdC5jb20+CitKb2UgTWFyY3VzIENsYXJrZSA8bWFyY3VzQGZyZWVkZXNrdG9wLm9yZz4KK0pvZSBTaGF3IDxqb2VzaGF3QG5vdmVsbC5jb20+CitKb2hhbiBHeWxsZW5zcGV0eiA8am9oYW5neUBheGlzLmNvbT4KK0pvaGFubmVzIENhcmxzc29uIDxqb2hhbm5lcy5jYXJsc3Nvbi54QHNvbnllcmljc3Nvbi5jb20+CitKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CitKb24gR29zdGluZyA8eXVrYXJpb25zZW5AZ21haWwuY29tPgorSm9uIFRyb3dicmlkZ2UgPHRyb3dAeGltaWFuLmNvbT4KK0theSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KK0tpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vLmhhbWFsYWluZW5Abm9raWEuY29tPgorS2phcnRhbiBNYXJhYXMgPGttYXJhYXNAZ25vbWUub3JnPgorS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KK0tyaXN0aWFuIFJpZXR2ZWxkIDxrcmlzQGd0ay5vcmc+CitLdXJ0IE1pbGxlciA8a3VydEBpbnRyaWNhdGVzb2Z0d2FyZS5jb20+CitMYXdyZW5jZSBSLiBTdGVlZ2VyIDxsc3RlZWdlckBnbWFpbC5jb20+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPG16cW9oZkAwcG9pbnRlci5kZT4KK0xpb25lbCBMYW5kd2VybGluIDxsaW9uZWwubGFuZHdlcmxpbkBvcGVud2lkZS5mcj4KK0x1aXogQXVndXN0byBWb24gRGVudHogPGx1aXouZGVudHotdm9uQG5va2lhLmNvbT4KK01hcmMgQnJvY2tzY2htaWR0IDxoZUBkZWJpYW4ub3JnPgorTWFyYyBNdXR6IDxtYXJjQGtkYWIubmV0PgorTWFyY3VzIEJyaW5rbWFubiA8bWFyY3VzLmJyaW5rbWFubkBydWhyLXVuaS1ib2NodW0uZGU+CitNYXJrIEJyYW5kIDxtYWJyYW5kQG1hYnJhbmQubmw+CitNYXJrIE1jTG91Z2hsaW4gPG1hcmtAc2t5bmV0LmllPgorTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuQHJlZGhhdC5jb20+CitNYXR0IE1jQ3V0Y2hlbiA8bWF0dEBtYXR0bWNjdXRjaGVuLm5ldD4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWwubWVla3NAbm92ZWxsLmNvbT4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWxAeGltaWFuLmNvbT4KK01pa2FlbCBIYWxsZW5kYWwgPG1pY2tlQGNvZGVmYWN0b3J5LnNlPgorTWlrYWVsIEhhbGxlbmRhbCA8bWlja2VAaW1lbmRpby5jb20+CitNaWtlIE1jUXVhaWQgPG1pa2VAbWlrZW1jcXVhaWQuY29tPgorTWlsb3NsYXYgVHJtYWMgPG1pdHJAdm9sbnkuY3o+CitNdXJyYXkgQ3VtbWluZyA8bXVycmF5Y0BtdXJyYXljLmNvbT4KK05ndXnhu4VuIFRow6FpIE5n4buNYyBEdXkgPHBjbG91ZHNAZ21haWwuY29tPgorT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KK09saXZpZXIgQW5kcmlldSA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAa2RlLm9yZz4KK093ZW4gRnJhc2VyLUdyZWVuIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CitQYXRyaWNrIHZvbiBSZXRoIDxwYXRyaWNrLnZvbnJldGhAZ21haWwuY29tPgorUGF1IEdhcmNpYSBpIFF1aWxlcyA8cGdxdWlsZXNAZWxwYXVlci5vcmc+CitQYXVsIEJvbGxlIDxwZWJvbGxlQHRpc2NhbGkubmw+CitQZXRlciBCcmVpdGVubG9obmVyIDxwZWJAbXBwbXUubXBnLmRlPgorUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHBAZ214Lm5ldD4KK1BldGVyIE1jQ3VyZHkgPHBtY2N1cmR5QHNrZXB0b3BvdGFtdXM+CitQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CitQbMOhY2lkbyBSZXZpbGxhIDx1bmtub3duQHVua25vd24uZG9tYWluPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorUmF5IFN0cm9kZSA8cnN0cm9kZUByZWRoYXQuY29tPgorUmljaGFyZCBBLiBIYW5raW5zIDxyaWNoYXJkLmEuaGFua2luc0BnbWFpbC5jb20+CitSaWNoYXJkIEh1Z2hlcyA8cmljaGFyZEBodWdoc2llLmNvbT4KK1JpY2hhcmQgSHVsdCA8cmh1bHRAY29kZWZhY3Rvcnkuc2U+CitSaWNoYXJkIEh1bHQgPHJpY2hhcmRAaW1lbmRpby5jb20+CitSb2JlcnQgTWNRdWVlbiA8cm9ib3QxMDFAZGViaWFuLm9yZz4KK1JvYmVydG8gR3VpZG8gPGJvYjRqb2JAZ21haWwuY29tPgorUm9tYWluIFBva3J6eXdrYSA8cm9tYWluQGtkYWIuY29tPgorUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+CitSeWFuIExvcnRpZSA8ZGVzcnRAZGVzcnQuY2E+CitTYXNjaGEgU2lsYmUgPHNhc2NoYS1wZ3BAc2lsYmUub3JnPgorU2FzY2hhIFNpbGJlIDxzYXNjaGEtd2ViLWJ1Z3MuZnJlZWRlc2t0b3Aub3JnQHNpbGJlLm9yZz4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CitTZWJhc3RpYW4gU2F1ZXIgPHNlYnNhdWVyQGtkYWIubmV0PgorU2V0aCBOaWNrZWxsIDxzZXRoQGdub21lLm9yZz4KK1NpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CitTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CitTbGVkeiA8c2xlZHpATU9CSUwtNDAwLTU4Ni5pbnRlcm4uZHJlc2VhcmNoLmRlPgorU3RldmUgR3J1YmIgPHNncnViYkByZWRoYXQuY29tPgorU3ZlbiBIZXJ6YmVyZyA8c3ZlbkBpbWVuZGlvLmNvbT4KK1RoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CitUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CitUb2JpYXMgTXVlbGxlciA8ZmRvLWJ1Z3NAY3J5cHRvYml0Y2guZGU+CitUb21hcyBIb2dlciA8dGhvZ2VyQHJlZGhhdC5jb20+CitUb21hcyBQZWxrYSA8dHBlbGthQHJlZGhhdC5jb20+CitUb20gSHVnaGVzIDx0b20uaHVnaGVzQHBhbG0uY29tPgorVG9yIExpbGxxdmlzdCA8dG1sQGlraS5maT4KK1dhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4KK1dpbGxpYW0gTGFjaGFuY2UgPHdybGFjaEBnbWFpbC5jb20+CitXaWxsIFRob21wc29uIDx3aWxsLnRob21wc29uQGNvbGxhYm9yYS5jby51az4KK1d1bGYgQy4gS3J1ZWdlciA8cGhpbGFudHJvcEBleGhlcmJvLm9yZz4KK1hhbiBMb3BleiA8eGFuQGdub21lLm9yZz4KK1lhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5tayBiL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1M2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYwYjEwCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDU1MiBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisob3IsIGF0IHlvdXIgb3B0aW9uIGFueSBsYXRlciB2ZXJzaW9uKS4KKworQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZQordi4gMi4xCisKK1RoaXMgQWNhZGVtaWMgRnJlZSBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKSBhcHBsaWVzIHRvIGFueSBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAgKHRoZSAiT3JpZ2luYWwgV29yayIpIHdob3NlIG93bmVyICh0aGUgIkxpY2Vuc29yIikgaGFzIHBsYWNlZCB0aGUgZm9sbG93aW5nIG5vdGljZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBPcmlnaW5hbCBXb3JrOgorCitMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKzEpIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhCit3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUKK2xpY2Vuc2UgdG8gZG8gdGhlIGZvbGxvd2luZzoKKworYSkgdG8gcmVwcm9kdWNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGNvcGllczsKKworYikgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzICgiRGVyaXZhdGl2ZSBXb3JrcyIpIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcms7CisKK2MpIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRvIHRoZSBwdWJsaWM7CisKK2QpIHRvIHBlcmZvcm0gdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHk7IGFuZAorCitlKSB0byBkaXNwbGF5IHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5LgorCisyKSBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAorcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlIGxpY2Vuc2UsIHVuZGVyCitwYXRlbnQgY2xhaW1zIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIExpY2Vuc29yIHRoYXQgYXJlIGVtYm9kaWVkIGluCit0aGUgT3JpZ2luYWwgV29yayBhcyBmdXJuaXNoZWQgYnkgdGhlIExpY2Vuc29yLCB0byBtYWtlLCB1c2UsIHNlbGwgYW5kCitvZmZlciBmb3Igc2FsZSB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3Jrcy4KKworMykgR3JhbnQgb2YgU291cmNlIENvZGUgTGljZW5zZS4gVGhlIHRlcm0gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUKK3ByZWZlcnJlZCBmb3JtIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdCBhbmQKK2FsbCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIGhvdyB0byBtb2RpZnkgdGhlIE9yaWdpbmFsCitXb3JrLiBMaWNlbnNvciBoZXJlYnkgYWdyZWVzIHRvIHByb3ZpZGUgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCitTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yayBhbG9uZyB3aXRoIGVhY2ggY29weSBvZiB0aGUgT3JpZ2luYWwKK1dvcmsgdGhhdCBMaWNlbnNvciBkaXN0cmlidXRlcy4gTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHNhdGlzZnkKK3RoaXMgb2JsaWdhdGlvbiBieSBwbGFjaW5nIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZQoraW4gYW4gaW5mb3JtYXRpb24gcmVwb3NpdG9yeSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gcGVybWl0CitpbmV4cGVuc2l2ZSBhbmQgY29udmVuaWVudCBhY2Nlc3MgYnkgWW91IGZvciBhcyBsb25nIGFzIExpY2Vuc29yCitjb250aW51ZXMgdG8gZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgV29yaywgYW5kIGJ5IHB1Ymxpc2hpbmcgdGhlCithZGRyZXNzIG9mIHRoYXQgaW5mb3JtYXRpb24gcmVwb3NpdG9yeSBpbiBhIG5vdGljZSBpbW1lZGlhdGVseQorZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIHRoYXQgYXBwbGllcyB0byB0aGUgT3JpZ2luYWwgV29yay4KKworNCkgRXhjbHVzaW9ucyBGcm9tIExpY2Vuc2UgR3JhbnQuIE5laXRoZXIgdGhlIG5hbWVzIG9mIExpY2Vuc29yLCBub3IKK3RoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLCBub3IgYW55IG9mIHRoZWlyCit0cmFkZW1hcmtzIG9yIHNlcnZpY2UgbWFya3MsIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgT3JpZ2luYWwgV29yayB3aXRob3V0IGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorcGVybWlzc2lvbiBvZiB0aGUgTGljZW5zb3IuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCB0bworZ3JhbnQgYW55IHJpZ2h0cyB0byB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBwYXRlbnRzLCB0cmFkZSBzZWNyZXRzIG9yCithbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIExpY2Vuc29yIGV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitoZXJlaW4uIE5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgdG8gbWFrZSwgdXNlLCBzZWxsIG9yIG9mZmVyIHRvCitzZWxsIGVtYm9kaW1lbnRzIG9mIGFueSBwYXRlbnQgY2xhaW1zIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2VkIGNsYWltcworZGVmaW5lZCBpbiBTZWN0aW9uIDIuIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdGhlIHRyYWRlbWFya3Mgb2YKK0xpY2Vuc29yIGV2ZW4gaWYgc3VjaCBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIE9yaWdpbmFsIFdvcmsuIE5vdGhpbmcKK2luIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBpbnRlcnByZXRlZCB0byBwcm9oaWJpdCBMaWNlbnNvciBmcm9tCitsaWNlbnNpbmcgdW5kZXIgZGlmZmVyZW50IHRlcm1zIGZyb20gdGhpcyBMaWNlbnNlIGFueSBPcmlnaW5hbCBXb3JrCit0aGF0IExpY2Vuc29yIG90aGVyd2lzZSB3b3VsZCBoYXZlIGEgcmlnaHQgdG8gbGljZW5zZS4KKworNSkgVGhpcyBzZWN0aW9uIGludGVudGlvbmFsbHkgb21pdHRlZC4KKworNikgQXR0cmlidXRpb24gUmlnaHRzLiBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgQ29kZSBvZiBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrCitub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrLCBhcyB3ZWxsIGFzIGFueQorbm90aWNlcyBvZiBsaWNlbnNpbmcgYW5kIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGlkZW50aWZpZWQgdGhlcmVpbiBhcyBhbgorIkF0dHJpYnV0aW9uIE5vdGljZS4iIFlvdSBtdXN0IGNhdXNlIHRoZSBTb3VyY2UgQ29kZSBmb3IgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSB0byBjYXJyeSBhIHByb21pbmVudCBBdHRyaWJ1dGlvbgorTm90aWNlIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gcmVjaXBpZW50cyB0aGF0IFlvdSBoYXZlCittb2RpZmllZCB0aGUgT3JpZ2luYWwgV29yay4KKworNykgV2FycmFudHkgb2YgUHJvdmVuYW5jZSBhbmQgRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gTGljZW5zb3IKK3dhcnJhbnRzIHRoYXQgdGhlIGNvcHlyaWdodCBpbiBhbmQgdG8gdGhlIE9yaWdpbmFsIFdvcmsgYW5kIHRoZSBwYXRlbnQKK3JpZ2h0cyBncmFudGVkIGhlcmVpbiBieSBMaWNlbnNvciBhcmUgb3duZWQgYnkgdGhlIExpY2Vuc29yIG9yIGFyZQorc3VibGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0aGUgcGVybWlzc2lvbgorb2YgdGhlIGNvbnRyaWJ1dG9yKHMpIG9mIHRob3NlIGNvcHlyaWdodHMgYW5kIHBhdGVudCByaWdodHMuIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGUgaW1tZWRpYXRlbHkgcHJvY2VlZGluZyBzZW50ZW5jZSwgdGhlIE9yaWdpbmFsCitXb3JrIGlzIHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZSBvbiBhbiAiQVMgSVMiIEJBU0lTIGFuZCBXSVRIT1VUCitXQVJSQU5UWSwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sCit0aGUgd2FycmFudGllcyBvZiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgT0YgVEhFIE9SSUdJTkFMCitXT1JLIElTIFdJVEggWU9VLiBUaGlzIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgY29uc3RpdHV0ZXMgYW4gZXNzZW50aWFsCitwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8gbGljZW5zZSB0byBPcmlnaW5hbCBXb3JrIGlzIGdyYW50ZWQgaGVyZXVuZGVyCitleGNlcHQgdW5kZXIgdGhpcyBkaXNjbGFpbWVyLgorCis4KSBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwKK3RoZW9yeSwgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvcgorb3RoZXJ3aXNlLCBzaGFsbCB0aGUgTGljZW5zb3IgYmUgbGlhYmxlIHRvIGFueSBwZXJzb24gZm9yIGFueSBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueQorY2hhcmFjdGVyIGFyaXNpbmcgYXMgYSByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSB1c2Ugb2YgdGhlCitPcmlnaW5hbCBXb3JrIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBkYW1hZ2VzIGZvciBsb3NzIG9mCitnb29kd2lsbCwgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZAorYWxsIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMuIFRoaXMgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkKK3NoYWxsIG5vdCBhcHBseSB0byBsaWFiaWxpdHkgZm9yIGRlYXRoIG9yIHBlcnNvbmFsIGluanVyeSByZXN1bHRpbmcKK2Zyb20gTGljZW5zb3IncyBuZWdsaWdlbmNlIHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcgcHJvaGliaXRzIHN1Y2gKK2xpbWl0YXRpb24uIFNvbWUganVyaXNkaWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvcgorbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc28gdGhpcyBleGNsdXNpb24KK2FuZCBsaW1pdGF0aW9uIG1heSBub3QgYXBwbHkgdG8gWW91LgorCis5KSBBY2NlcHRhbmNlIGFuZCBUZXJtaW5hdGlvbi4gSWYgWW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorT3JpZ2luYWwgV29yayBvciBhIERlcml2YXRpdmUgV29yaywgWW91IG11c3QgbWFrZSBhIHJlYXNvbmFibGUgZWZmb3J0Cit1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcyB0byBvYnRhaW4gdGhlIGV4cHJlc3MgYXNzZW50IG9mIHJlY2lwaWVudHMgdG8KK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIE5vdGhpbmcgZWxzZSBidXQgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyCit3cml0dGVuIGFncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGdyYW50cyBZb3UgcGVybWlzc2lvbiB0bworY3JlYXRlIERlcml2YXRpdmUgV29ya3MgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yayBvciB0byBleGVyY2lzZQorYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCBpbiBTZWN0aW9uIDEgaGVyZWluLCBhbmQgYW55IGF0dGVtcHQgdG8gZG8KK3NvIGV4Y2VwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyIHdyaXR0ZW4KK2FncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5CitVLlMuIGNvcHlyaWdodCBsYXcsIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgYnkKK2ludGVybmF0aW9uYWwgdHJlYXR5LiBUaGVyZWZvcmUsIGJ5IGV4ZXJjaXNpbmcgYW55IG9mIHRoZSByaWdodHMKK2dyYW50ZWQgdG8gWW91IGluIFNlY3Rpb24gMSBoZXJlaW4sIFlvdSBpbmRpY2F0ZSBZb3VyIGFjY2VwdGFuY2Ugb2YKK3RoaXMgTGljZW5zZSBhbmQgYWxsIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworMTApIFRlcm1pbmF0aW9uIGZvciBQYXRlbnQgQWN0aW9uLiBUaGlzIExpY2Vuc2Ugc2hhbGwgdGVybWluYXRlCithdXRvbWF0aWNhbGx5IGFuZCBZb3UgbWF5IG5vIGxvbmdlciBleGVyY2lzZSBhbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkCit0byBZb3UgYnkgdGhpcyBMaWNlbnNlIGFzIG9mIHRoZSBkYXRlIFlvdSBjb21tZW5jZSBhbiBhY3Rpb24sCitpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0sIGFnYWluc3QgTGljZW5zb3Igb3IgYW55CitsaWNlbnNlZSBhbGxlZ2luZyB0aGF0IHRoZSBPcmlnaW5hbCBXb3JrIGluZnJpbmdlcyBhIHBhdGVudC4gVGhpcwordGVybWluYXRpb24gcHJvdmlzaW9uIHNoYWxsIG5vdCBhcHBseSBmb3IgYW4gYWN0aW9uIGFsbGVnaW5nIHBhdGVudAoraW5mcmluZ2VtZW50IGJ5IGNvbWJpbmF0aW9ucyBvZiB0aGUgT3JpZ2luYWwgV29yayB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZS4KKworMTEpIEp1cmlzZGljdGlvbiwgVmVudWUgYW5kIEdvdmVybmluZyBMYXcuIEFueSBhY3Rpb24gb3Igc3VpdCByZWxhdGluZwordG8gdGhpcyBMaWNlbnNlIG1heSBiZSBicm91Z2h0IG9ubHkgaW4gdGhlIGNvdXJ0cyBvZiBhIGp1cmlzZGljdGlvbgord2hlcmVpbiB0aGUgTGljZW5zb3IgcmVzaWRlcyBvciBpbiB3aGljaCBMaWNlbnNvciBjb25kdWN0cyBpdHMgcHJpbWFyeQorYnVzaW5lc3MsIGFuZCB1bmRlciB0aGUgbGF3cyBvZiB0aGF0IGp1cmlzZGljdGlvbiBleGNsdWRpbmcgaXRzCitjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucworQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMKK2V4cHJlc3NseSBleGNsdWRlZC4gQW55IHVzZSBvZiB0aGUgT3JpZ2luYWwgV29yayBvdXRzaWRlIHRoZSBzY29wZSBvZgordGhpcyBMaWNlbnNlIG9yIGFmdGVyIGl0cyB0ZXJtaW5hdGlvbiBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorcmVxdWlyZW1lbnRzIGFuZCBwZW5hbHRpZXMgb2YgdGhlIFUuUy4gQ29weXJpZ2h0IEFjdCwgMTcgVS5TLkMuIMOCwqcgMTAxCitldCBzZXEuLCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGludGVybmF0aW9uYWwKK3RyZWF0eS4gVGhpcyBzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTIpIEF0dG9ybmV5cyBGZWVzLiBJbiBhbnkgYWN0aW9uIHRvIGVuZm9yY2UgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQorb3Igc2Vla2luZyBkYW1hZ2VzIHJlbGF0aW5nIHRoZXJldG8sIHRoZSBwcmV2YWlsaW5nIHBhcnR5IHNoYWxsIGJlCitlbnRpdGxlZCB0byByZWNvdmVyIGl0cyBjb3N0cyBhbmQgZXhwZW5zZXMsIGluY2x1ZGluZywgd2l0aG91dAorbGltaXRhdGlvbiwgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kIGNvc3RzIGluY3VycmVkIGluCitjb25uZWN0aW9uIHdpdGggc3VjaCBhY3Rpb24sIGluY2x1ZGluZyBhbnkgYXBwZWFsIG9mIHN1Y2ggYWN0aW9uLiBUaGlzCitzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTMpIE1pc2NlbGxhbmVvdXMuIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQKK2NvbmNlcm5pbmcgdGhlIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UKK2lzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0bwordGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4KKworMTQpIERlZmluaXRpb24gb2YgIllvdSIgaW4gVGhpcyBMaWNlbnNlLiAiWW91IiB0aHJvdWdob3V0IHRoaXMKK0xpY2Vuc2UsIHdoZXRoZXIgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSwgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhCitsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlCit0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkKK3RoYXQgY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGgKK3lvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsCitkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoCitlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eQorcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwKK293bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworMTUpIFJpZ2h0IHRvIFVzZS4gWW91IG1heSB1c2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gYWxsIHdheXMgbm90CitvdGhlcndpc2UgcmVzdHJpY3RlZCBvciBjb25kaXRpb25lZCBieSB0aGlzIExpY2Vuc2Ugb3IgYnkgbGF3LCBhbmQKK0xpY2Vuc29yIHByb21pc2VzIG5vdCB0byBpbnRlcmZlcmUgd2l0aCBvciBiZSByZXNwb25zaWJsZSBmb3Igc3VjaAordXNlcyBieSBZb3UuCisKK1RoaXMgbGljZW5zZSBpcyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBMYXdyZW5jZSBFLiBSb3Nlbi4gQWxsIHJpZ2h0cworcmVzZXJ2ZWQuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzCitsaWNlbnNlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiBUaGlzIGxpY2Vuc2UgbWF5IG5vdCBiZSBtb2RpZmllZCB3aXRob3V0Cit0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YgaXRzIGNvcHlyaWdodCBvd25lci4KKworCistLSAKK0VORCBPRiBBQ0FERU1JQyBGUkVFIExJQ0VOU0UuIFRoZSBmb2xsb3dpbmcgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgdGhlIGVzc2VudGlhbCAKK2RpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAoQUZMKSB2ZXJzaW9uIDEuMCBhbmQgb3RoZXIgCitvcGVuIHNvdXJjZSBsaWNlbnNlczoKKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSBpcyBzaW1pbGFyIHRvIHRoZSBCU0QsIE1JVCwgVW9JL05DU0EgYW5kIEFwYWNoZSAKK2xpY2Vuc2VzIGluIG1hbnkgcmVzcGVjdHMgYnV0IGl0IGlzIGludGVuZGVkIHRvIHNvbHZlIGEgZmV3IHByb2JsZW1zIHdpdGggCit0aG9zZSBsaWNlbnNlcy4KKyAgICAKKyogVGhlIEFGTCBpcyB3cml0dGVuIHNvIGFzIHRvIG1ha2UgaXQgY2xlYXIgd2hhdCBzb2Z0d2FyZSBpcyBiZWluZyAKK2xpY2Vuc2VkIChieSB0aGUgaW5jbHVzaW9uIG9mIGEgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSAKK2luIHRoZSBzb2Z0d2FyZSkuIFRoaXMgd2F5LCB0aGUgbGljZW5zZSBmdW5jdGlvbnMgYmV0dGVyIHRoYW4gYSB0ZW1wbGF0ZSAKK2xpY2Vuc2UuIFRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgYXBwbHkgdG8gdW5pZGVudGlmaWVkIHNvZnR3YXJlLgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgY29weXJpZ2h0IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCAKK2FuZCBBcGFjaGUgbGljZW5zZXMgYXJlIHZhZ3VlIGFuZCBpbmNvbXBsZXRlIGluIHRoYXQgcmVzcGVjdC4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIHBhdGVudCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QsIE1JVCwgCitVb0kvTkNTQSBhbmQgQXBhY2hlIGxpY2Vuc2VzIHJlbHkgb24gYW4gaW1wbGllZCBwYXRlbnQgbGljZW5zZSBhbmQgY29udGFpbiAKK25vIGV4cGxpY2l0IHBhdGVudCBncmFudC4KKyAgICAKKyogVGhlIEFGTCBtYWtlcyBpdCBjbGVhciB0aGF0IG5vIHRyYWRlbWFyayByaWdodHMgYXJlIGdyYW50ZWQgdG8gdGhlIAorbGljZW5zb3IncyB0cmFkZW1hcmtzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgc3VjaCBhIHByb3Zpc2lvbiwgYnV0IHRoZSAKK0JTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuCisgICAgCisqIFRoZSBBRkwgaW5jbHVkZXMgdGhlIHdhcnJhbnR5IGJ5IHRoZSBsaWNlbnNvciB0aGF0IGl0IGVpdGhlciBvd25zIHRoZSAKK2NvcHlyaWdodCBvciB0aGF0IGl0IGlzIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUgdW5kZXIgYSBsaWNlbnNlLiBOb25lIG9mIAordGhlIG90aGVyIGxpY2Vuc2VzIGNvbnRhaW4gdGhhdCB3YXJyYW50eS4gQWxsIG90aGVyIHdhcnJhbnRpZXMgYXJlIGRpc2NsYWltZWQsIAorYXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBvdGhlciBsaWNlbnNlcy4KKworKiBUaGUgQUZMIGlzIGl0c2VsZiBjb3B5cmlnaHRlZCAod2l0aCB0aGUgcmlnaHQgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIAord2l0aG91dCBtb2RpZmljYXRpb24pLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3duZXIgb2YgdGhlIGNvcHlyaWdodCB0byB0aGUgCitsaWNlbnNlIHdpbGwgY29udHJvbCBjaGFuZ2VzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgYSBjb3B5cmlnaHQgbm90aWNlLCAKK2J1dCB0aGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4gCistLQorU1RBUlQgT0YgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKy0tCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmMzM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNSBAQAorMjAwOC0wNC0xNiAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogdGFrZSBvdXQgdGhlIHRyYWlsaW5nIGNvbW1hIGluIHRoZQorCSAgUHJvZmlsZUF0dHJpYnV0ZUZsYWdzIGVudW0gYXMgaXQgaXNuJ3QgaW4gb3VyIHN0eWxlIGd1aWRlcworCSAgYW5kIGNhdXNlcyBzb21lIGNvbXBpbGVycyB0byBlcnJvciBvdXQKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy5wcmUtMS0wIGIvQ2hhbmdlTG9nLnByZS0xLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiNTk4MgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZy5wcmUtMS0wCkBAIC0wLDAgKzEsMTUxNDYgQEAKKzIwMDYtMTEtMDkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMC4wCisKKzIwMDYtMTEtMDkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEFVVEhPUlM6IGFkZGVkIFBldGVyIGFuZCBUb3Igb2Ygd2luZG93cyBwb3J0aW5nIGZhbWUKKworMjAwNi0xMS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhZGQgYSBub3RlIGFib3V0IHByb3RvY29sIHN0YWJpbGl0eQorCisJKiBkb2MvVE9ETzogUmVtb3ZlICJpbXBvcnRhbnQgZm9yIDEuMCIgc2VjdGlvbiwgcmVwbGFjZSB3aXRoCisJImltcG9ydGFudCBmb3IgMS4yIiBzZWN0aW9uCisJCisyMDA2LTExLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IHJlbW92ZSBzb21lIG9mIHRoZSBvdXQgb2YgZGF0ZSBmbGFncworCisJKiBkb2MvVE9ETzogUmVtb3ZlIHRvZG8gaXRlbXMgd2hpY2ggYXJlIGRvbmUKKworMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IEhhbmRsZSBzaWdpbnQgc28gd2UgZmx1c2ggc3Rkb3V0CisJKFBhdGNoIGZyb20gT2xsaSBTYWxsaSA8b2xsaSBkb3Qgc2FsbGkgYXQgY29sbGFib3JhIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTExLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuMTogdXBkYXRlIHRoZSBtYW5wYWdlIGZvciBkYnVzLW1vbml0b3IKKwkoUGF0Y2ggZnJvbSBPbGxpIFNhbGxpIDxvbGxpIGRvdCBzYWxsaSBhdCBjb2xsYWJvcmEgZG90IGNvIGRvdCB1az4pCisKKzIwMDYtMTEtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEFVVEhPUlM6IFVwZGF0ZSB3aXRoIGFsbCBwZW9wbGUgbGlzdGVkIGluIHRoZSBDaGFuZ2VMb2cKKworMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IGFkZCBwcm9maWxpbmcgdG9vbHMgdG8gZGJ1cy1tb25pdG9yCisJKFBhdGNoIGZyb20gT2xsaSBTYWxsaSA8b2xsaSBkb3Qgc2FsbGkgYXQgY29sbGFib3JhIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTExLTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogSEFDS0lORzogVXBkYXRlIHJlbGVhc2UgaW5zdHJ1Y3Rpb25zIHRvIGluY2x1ZGUgc3R1ZmYgYWJvdXQKKwlzdGFibGUgcmVsZWFzZXMsIGJyYW5jaGluZywgZXRjLiBNYXkgbm90IGJlIHRvdGFsbHkgY29ycmVjdCwKKwlwbGVhc2UgZml4IGlmIG5lZWRlZCwgYnV0IGtlZXAgaW5zdHJ1Y3Rpb25zIHVwLXRvLWRhdGUgc28gd2UgZG8KKwllYWNoIHN0YWJsZSByZWxlYXNlIGNvbnNpc3RlbnRseSBpbiB0aGUgZnV0dXJlLgorCisyMDA2LTExLTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwsIGRvYy9kYnVzLWZhcS54bWwsIFJFQURNRTogdmFyaW91cworCWRvY3VtZW50YXRpb24gdXBkYXRlcy4gQnVtcCBmYXEvc3BlYyB2ZXJzaW9ucyAobm90IHRvIDEuMDsgSSBkb24ndAorCXRoaW5rIHRoZSBzcGVjIHdpbGwgYmUgImZpbmlzaGVkIi8xLjAgd2hlbiB3ZSBzaGlwIHRoZSAxLjAgbGlicmFyeSkuCisKKzIwMDYtMTEtMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYzogTWlzc2VkIHBhdGNoIC0gcGFzcyBpbiB0aGUgY29udGV4dCB0byB0aGUgZGlyZWN0b3J5IHdhdGNoCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIEQtQnVzIDEuMCBSQyAzKDAuOTUpCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX25ldyk6IGRvbid0IGZhaWwgaWYgd2UgY2FuIG5vdCByZWFkCisJdGhlIGRpcmVjdG9yeSBhcyBpdCBtYXkgbm90IGV4aXN0CisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHNlcnZpY2VfZGlyc19maW5kX2Rpcik6IHVzZSAKKwlfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgc28gd2UgZG9uJ3QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AKKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKTogbW92ZSBwcm9jZXNzaW5nIG9mIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKwl0YWdzIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgbm8gY29udGVudAorCShidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogY2hlY2sgd2UgZG9uJ3QgaGF2ZSBjb250ZW50IGluIAorCXN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgdGFnCisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBNYWtlIHN1cmUgdGhlIC92YXIvbGliL2RidXMgZGlyZWN0b3J5IGlzIGNyZWF0ZWQKKwlQYWNrYWdlcnMgbmVlZCB0byBvd24gdGhpcyBkaXJlY3RvcnkKKworMjAwNi0xMS0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBmaXhlZCBzY3JpcHQgdG8gcmVwbGFjZSB0aGUgCisJPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnM+IHRhZyB3aXRoIGEgPHNldmljZWRpcj4gdGFnIHRoYXQKKwlwb2ludHMgdG8gdGhlIHRlc3Qgc2VydmljZSBkaXJlY3RvcnkKKworMjAwNi0xMS0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgYSBjaGVjayBmb3IgRElSICpkaXJwLT5kZF9mZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXg6IGlmIEhBVkVfRERGRCBpcyBkZWZpbmVkIHVzZSAKKwlESVIgKmRpcnAtPmRkX2ZkIGVsc2UgdXNlIERJUiAqZGlycC0+X19kZF9mZC4gIFRoaXMgdGFrZXMgY2FyZQorCW9mIGJvdGggU29sYXJpcyBhbmQgSXJpeAorCisyMDA2LTExLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IGRvY3VtZW50IHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKworMjAwNi0xMS0wMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBleHBvc2UgREJVU19EQVRBRElSCisJCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiBhZGQgdGhlIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgZWxlbWVudAorCXRvIHRoZSBwYXJzZXIKKwkoYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IHByb2Nlc3MgdGhlIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMKKwllbGVtZW50IGJ5IGdldHRpbmcgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZyb20gc3lzZGVwcyBhbmQgbWVyZ2luZworCXRoZW0gaW50byB0aGUgc2VydmljZSBkaXJlY3RvcnkgbGlzdAorCSh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6IG1ha2Ugc3VyZSB3ZSBnZXQgd2hhdCB3ZSBleHBlY3QKKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogcmVwbGFjZSB0aGUgc2VydmljZWRpciB0YWcgd2l0aCB0aGUgCisJc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyB0YWcKKworCSogZGJ1cy9kYnVzLWxpc3QuaDogcmVtb3ZlIHRoZSB0eXBlZGVmIG9mIERCdXNMaXN0IGFuZCBwbGFjZSBpdCBpbgorCWRidXMtc3lzZGVwcy5oIHRvIGF2b2lkIGNpcmN1bGFyIGhlYWRlciBkZXBlbmRlbmNpZXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogYWRkIHRoZSB0eXBlZGVmIG9mIERCdXNMaXN0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCk6IHV0aWxpdHkgZnVuY3Rpb24KKwl3aGljaCB0YWtlcyBhIHN0cmluZyBvZiBkaXJlY3RvcmllcyBkZWxpbWl0ZWQgYnkgY29sb25zLCBwYXJzZXMgdGhlbSAKKwlvdXQsIGFwcGVuZHMgYSBzdWZmaXggYW5kIHB1dHMgdGhlbSBpbiBhIGxpc3QgaWdub3JpbmcgZW1wdHkgZWxlbWVudHMKKwkoX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMpOiByZXR1cm5zIHRoZSBzdGFuZGFyZCAKKwlkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlIGFjdGl2YXRpb24gZmlsZXMKKwlvbiBVbml4IHdoaWNoIGluY2x1ZGVzIHRoZSBYREdfREFUQV9IT01FLCBYREdfREFUQV9ESVJTIGFuZCAKKwlEQlVTX0RBVEFESVIgZGlyZWN0b3JpZXMKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYW55LXJ1bGVzLmNvbmY6IGFkZCB0aGUgCisJc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyB0YWcgdG8gdGhlIHZhbGlkIGNvbmZpZyBmaWxlIHRlc3RzCisKKzIwMDYtMTAtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC4xLCBkb2MvVE9ETzogY2FwdHVyZSBpbnRlbnQgdG8gY2hhbmdlIHRoZQorCWNvbW1hbmQgbGluZSBvcHRpb25zIG9mIGRidXMtbGF1bmNoIGEgYml0IHBvc3QgMS4wCisKKzIwMDYtMTAtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSk6IGRvY3VtZW50CisJaG93IHRvIGNob29zZSBzaGFyZWQgdnMuIHByaXZhdGUgY29ubmVjdGlvbnMKKworMjAwNi0xMC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IGVuY2xvc2UgbW9yZSBvZiB0aGUgZmlsZSBpbiB0aGUKKwlEQlVTX0JVSUxEX1RFU1RTIGNoZWNrLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMgKFBUSFJFQURfQ0hFQ0spOiBmaXggZm9yCisJREJVU19ESVNBQkxFX0FTU0VSVCBjYXNlLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcik6IGRvY3VtZW50CisJdGhhdCBpdCBvbmx5IHdvcmtzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorCisJKiBkYnVzL2RidXMtYnVzLmM6IGFkZCBhIGdsb2JhbCBsb2NrIGNvdmVyaW5nIHRoZSBCdXNEYXRhIHdlCisJYXR0YWNoIHRvIGVhY2ggY29ubmVjdGlvbgorCShpbnRlcm5hbF9idXNfZ2V0KTogbG9jayBvdXIgYWNjZXNzIHRvIHRoZSBCdXNEYXRhCisJKGRidXNfYnVzX3JlZ2lzdGVyKTogbG9jayB0aGUgZW50aXJlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCisJd2l0aCBfREJVU19MT0NLKGJ1c19kYXRhcykuIElmIHdlIGdldCB0aGUgbG9jayBhbmQgCisJcmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGUsIHNpbGVudGx5IHJldHVybiAodnMuIHByZXZpb3VzCisJYmVoYXZpb3Igb2YgYWJvcnRpbmcpLgorCShkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUpOiBsb2NrIHRoZSBCdXNEYXRhCisJKGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSk6IGxvY2sgdGhlIEJ1c0RhdGEKKworMjAwNi0xMC0yNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc2VydmljZV9kaXJzX2ZpbmRfZGlyLCAKKwlzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlLCAKKwlzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUpOiBOZXcgc3RhdGljIG1ldGhvZHMKKwlmb3Igb25seSBhcHBlbmRpbmcgdW5pcXVlIHNlcnZpY2UgZGlyZWN0b3J5IG5hbWVzIGludG8KKwl0aGUgc2VydmljZSBkaXJlY3RvcnkgbGlzdAorCShtZXJnZV9pbmNsdWRlZCwgYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IE9ubHkgYWRkIHVuaXF1ZQorCXNlcnZpY2UgZGlyZWN0b3J5IG5hbWVzIGludG8gdGhlIGxpc3QKKworMjAwNi0xMC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYzogbWFrZSB0aGUgImNvdW50IiBhbmQgImhvbGRlciIKKwl2YXJpYWJsZXMgdm9sYXRpbGUsIHN1Z2dlc3RlZCBieSBUaGlhZ28uIERvY3VtZW50IHN0cnVjdCBmaWVsZHMuCisJKFBUSFJFQURfQ0hFQ0spOiByZW1vdmUgcHRocmVhZCBlcnJvciBjaGVja2luZyBpZiBhc3NlcnRpb25zIGFyZQorCWRpc2FibGVkLCBzaG91bGQgcmVkdWNlIHRoZSBuby1hc3NlcnRpb25zIGNhc2UgdG8gdGhlIGJhcmUKKwltaW5pbXVtIGNvZGUuCisKKzIwMDYtMTAtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jIChfZGJ1c19wdGhyZWFkX211dGV4X2xvY2spOiBjaGFuZ2UKKwl0byBiZSByZWN1cnNpdmUKKwkoX2RidXNfcHRocmVhZF9tdXRleF91bmxvY2spOiBtYWtlIGl0IHJlY3Vyc2l2ZQorCShfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdCk6IHNhdmUvcmVzdG9yZSB0aGUgcmVjdXJzaW9uIGNvdW50CisJKF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0X3RpbWVvdXQpOiBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudAorCisyMDA2LTEwLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGNsYXJpZnkgdGhlIFVVSUQgdGV4dCBzbGlnaHRseQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmM6IGNoZWNrIGZvciBhbmQgbW9zdGx5IGFib3J0IG9uCisJcHRocmVhZCBlcnJvcnMuIEFkZCBEQnVzTXV0ZXhQVGhyZWFkIGFuZCBEQnVzQ29uZFZhclBUaHJlYWQgCisJaW4gcHJlcGFyYXRpb24gZm9yIGJlaW5nIGFibGUgdG8gZXh0ZW5kIHRoZW0gZm9yIGUuZy4gcmVjdXJzaXZlCisJbXV0ZXhlcy4KKworMjAwNi0xMC0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtdGhyZWFkcy5baGNdOiBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cy4gQ2xhcmlmeSBob3cgCisJY29uZGl0aW9uIHZhcmlhYmxlcyByZWxhdGUgdG8gcmVjdXJzaXZlIG11dGV4ZXMuCisJCisgICAgICAgICogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jLCBkYnVzL2RidXMtc3lzZGVwcy13aW4tdGhyZWFkLmMsIAorCWRidXMvZGJ1cy10aHJlYWRzLmM6IFNwbGl0IHRoZSBwbGF0Zm9ybXMtc3BlY2lmaWMgdGhyZWFkIAorCWltcGxlbWVudGF0aW9ucyBpbnRvIHRoZWlyIG93biBmaWxlcy4KKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworCShfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdF90aW1lb3V0KTogaW52ZXJ0IHRoZSByZXR1cm4gdmFsdWUsIGl0CisJd2FzIGJhY2t3YXJkLiBOb3QgdGhhdCBhbnl0aGluZyB1c2VzIGl0LgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19zZXRfbG9jYWxfY3JlZHMpOiBDbGVhbiB1cCB0aGUKKwlMT0NBTF9DUkVEUyB2cyBDTVNHQ1JFRCBzdHVmZiBhIGJpdC4gIFByZWZlciBDTVNHQ1JFRC4gIFRoaXMKKwluZWVkcyB0byBiZSBjbGVhbmVkIHVwIG1vcmUuCisKKwkqIGRvYy9UT0RPOiBBZGQgYSB0b2RvIHRoYXQgKkJTRCBoYWNrZXJzIHNob3VsZCBsb29rIGF0IGNsZWFuaW5nCisJdXAgdGhlIENSRURTIGlzc3VlLgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4sIGRidXMtMS5wYy5pbjogQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBtZXRob2RzIAorCWFyZSBpbiBnbGliYyBvciBsaWJwdGhyZWFkIGFuZCBhZGQgLWxwdGhyZWFkIHRvIHRoZSBsaW5rIHN0YWdlIAorCWlmIGl0IGlzIHRoZSBsYXR0ZXIKKworMjAwNi0xMC0yNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCk6IEZpeAorICAgICAgICBidWcgODc4MDogdGhlIGNvbm5lY3Rpb24gbG9jayBpcyBvbmx5IHJlcXVpcmVkIHdoaWxlIHJlY29yZGluZworICAgICAgICB0aGUgc2hhcmVkIGNvbm5lY3Rpb24sIHNvIHByb3RlY3Qgb25seSB0aGF0IGNvZGUKKyAgICAgICAgc2VjdGlvbi4gRG9uJ3QgcmVxdWlyZSBjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgdG8gcmV0dXJuIGEKKyAgICAgICAgbG9ja2VkIGNvbm5lY3Rpb24uCisKKzIwMDYtMTAtMjYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYyAoZ2V0X3Nlc3Npb25fZmlsZSwgaW5pdF94X2F0b21zKToKKyAgICAgICAgY2hlY2sgaWYgZ2V0X21hY2hpbmVfdXVpZCgpIHJldHVybnMgTlVMTCBiZWZvcmUgcHJvY2VlZGluZyBhbnkKKyAgICAgICAgZnVydGhlcjogd2UgY2FuJ3QgaW5pdCB0aGUgWCBhdG9tcyBvciBjcmVhdGUgYSBzZXNzaW9uIGZpbGUKKyAgICAgICAgbmFtZSBpZiB0aGVyZSBpcyBubyBtYWNoaW5lIElELgorCVRoaXMgc29sdmVzIGEgY3Jhc2ggcmVwb3J0ZWQgYnkgc29tZSB1c2VycyBpZgorICAgICAgICAtLWV4aXQtd2l0aC1zZXNzaW9uIHdhcyB1c2VkIHdpdGhvdXQgLS1hdXRvbGF1bmNoPTxtYWNoaW5lLWlkPgorCisyMDA2LTEwLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogcnVuIHRoZSBkYnVzLWRhZW1vbiBpbiB0aGUgYnVpbGRkaXIKKwlpZiB0ZXN0cyBhcmUgZW5hYmxlZCBhbmQgdGhlIERCVVNfVVNFX1RFU1RfQklOQVJZIGVudiB2YXJpYWJsZSBpcyBzZXQKKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBzZXQgREJVU19VU0VfVEVTVF9CSU5BUlkKKwliZWZvcmUgd2UgcnVuIGRidXMtbGF1bmNoCisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIFRFU1RfQlVTX0JJTkFSWSB0byBiZSB0aGUgZnVsbCBwYXRoIHRvIAorCWRidXMtZGFlbW9uIGluIHRoZSBidWlsZCByb290IAorCisyMDA2LTEwLTI1ICBTam9lcmQgU2ltb25zICA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29zL2RidXMtdXVpZGdlbi4xOgorCQlNb3ZlIHRoZSBtYWNoaW5lLWlkIGZpbGUgdG8gL3Zhci9saWIvZGJ1cyAKKworMjAwNi0xMC0yNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBGaXggdHlwbyBzbyBpdCdzCisJX2RidXNfYXNzZXJ0ICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uICE9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKwlub3QgX2RidXNfYXNzZXJ0ICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKworMjAwNi0xMC0yNCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IEFkZCBmdW5jdGlvbgorCV9kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZSB0aGF0IGNobW9kcyBhIGZpbGUgdG8gMDY0NC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzKToKKyAgICAgICAgQXZvaWQgd3JpdGluZyB0byB0aGUgc3RhdGljICJhcmd2IiBhcnJheSwgdGhlcmVieSBhdm9pZGluZyBhCisgICAgICAgIENPVyBvbiB0aGUgY2hpbGQgcHJvY2Vzcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19jcmVhdGVfdXVpZF9maWxlX2V4Y2x1c2l2ZWx5KToKKyAgICAgICAgY2FsbCBfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgb24gdGhlIGNyZWF0ZWQgZmlsZS4KKworMjAwNi0xMC0yMyAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IFVzZSBhdG9taWMgdmFyaWFibGUgdG8gcHJvdGVjdAorCW5fYmxvY2tzX291dHN0YW5kaW5nIG90aGVyd2lzZSBPT00gd2lsbCBiZSByZXBvcnRlZCB1c2luZyBTTVAgb24KKwlzb21lIGFyY2hlcworCQorCSogYnVzL2Rpc3BhdGNoLmM6IEFkZCBtaXNzaW5nIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMKKworCSogYnVzL2Rlc2t0b3AtZmlsZS5jIChwYXJzZV9zZWN0aW9uX3N0YXJ0LCBwYXJzZV9rZXlfdmFsdWUpIAorCShidXNfZGVza3RvcF9maWxlX2xvYWQpOiBQcm9wZXJ0bHkgaGFuZGxlIE9PTQorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBDaGVjayB0aGF0CisJdGhyZWFkX2luaXRfZ2VuZXJhdGlvbiBlcXVhbHMgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uLCBub3QgMAorCisyMDA2LTEwLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDogbW92ZSBwcm90b3R5cGUgb2YKKwlfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCgpIGhlcmUgc28KKwlpdCBpc24ndCBpbiBhIHB1YmxpYyBoZWFkZXIgYW5kIGRvZXNuJ3QgZW5kIHVwIGluIHRoZSBEQnVzQnVzCisJZ3JvdXAgaW4gRG94eWdlbgorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBkaXN0IGNsZWFudXAtbWFuLXBhZ2VzLnNoIHNvIGl0J3MgaW4KKwl0aGUgdGFyYmFsbCBpZiBwYWNrYWdlcnMgd2FudCB0byBydW4gaXQKKworCSogY2xlYW51cC1tYW4tcGFnZXMuc2g6IEFkZCBhIHNjcmlwdCB3aGljaCBtdW5nZXMgYWxsIHRoZSBpbnRlcm5hbAorCUFQSSBtYW4gcGFnZXMgb3V0IG9mIHRoZSBEb3h5Z2VuIG91dHB1dC4gVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mCisJdGhlIGluc3RhbGxlZCBtYW4gcGFnZXMgZnJvbSA3IHRvIDIgbWVncywgYW5kIGF2b2lkcworCW5hbWVzcGFjZS1wb2xsdXRpbmcgcGFnZXMuIFJpZ2h0IG5vdyAobGlrZSBEb3h5Z2VuKSB0aGlzIHNjcmlwdAorCWlzbid0IGluIHRoZSBidWlsZCwgaXQncyBzb21ldGhpbmcgcGFja2FnZXJzIGNhbiBkbyBtYW51YWxseS4KKworMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IGRvbid0IGluY2x1ZGUgdGhlIHdhdGNoL3RpbWVvdXQKKwlmdW5jdGlvbnMgaW4gY29ubmVjdGlvbiBzZWN0aW9uCisKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBEb2N1bWVudGF0aW9uISBXaGVlISBEb3h5Z2VuIG5vdyAxMDAlIHNpbGVudC4gSWYgeW91IG1ha2UgaXQKKwlhbmdyeSBhZ2FpbiwgeW91IHdpbGwgYmUgcHVuaXNoZWQuCisJCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTW9yZSBkb2N1bWVudGF0aW9uIC0gYWxsIHB1YmxpYyBBUEkgbm93IGRvY3VtZW50ZWQgYWNjb3JkaW5nIHRvCisJRG94eWdlbgorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogRG9jdW1lbnQgYSBidW5jaCBvZiB1bmRvY3VtZW50ZWQgc3R1ZmYKKwkKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBDbGVhbiB1cCBEb3h5Z2VuIGdyb3VwIG1hcmtlcnMgZm9yIHB1YmxpYyBBUEkgc28gRG94eWdlbiBmaW5kcworCWV2ZXJ5dGhpbmcgKG5vdCBjb21wcmVoZW5zaXZlbHkgZml4ZWQgZm9yIHByaXZhdGUgQVBJKS4KKwlNZWFucyBhbGwgcmVtYWluaW5nIERveHlnZW4gd2FybmluZ3MgYXJlIGp1c3QgYWJvdXQgbWlzc2luZyBkb2NzCisJYW5kIHRodXMgcHJldHR5IHNpbXBsZSB0byByZXNvbHZlLgorCQorMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6IGFkZCBEQlVTX0dOVUNfREVQUkVDQVRFRCBtYWNybworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBtYXJrIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4oKSAKKwlhcyBEQlVTX0dOVUNfREVQUkVDQVRFRAorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIE1vdmUgYWxsIHByaXZhdGUgQVBJIGludG8gdGhlIHByaXZhdGUgRG94eWdlbiBncm91cCBzZWN0aW9ucyBvZgorCXRoZSBmaWxlcywgc28gdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBwdWJsaWMgQVBJIGRvY3MKKwkKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBwdXQgI2lmbmRlZiBEQlVTX0RJU0FCTEVfREVQUkVDQVRFRCBhcm91bmQgCisJZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbigpLgorCisJKiB0aHJvdWdob3V0OiBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cy4KKworMjAwNi0xMC0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlIGludDY0IHRoaW5nIGZyb20gMS4wIHNpbmNlIGl0IGRvZXNuJ3QKKwltYXR0ZXIsIGFuZCB0aGUgbWVzc2FnZS1sb2FkZXItYnJlYWtlciB0aGluZyBzaW5jZSBub2JvZHkgaXMgZ29pbmcKKwl0byBkbyBpdC4gIEFkZCBhbiBpdGVtIHRvIDEuMCBhYm91dCBzdXBwb3J0aW5nIHJlY3Vyc2l2ZSBsb2NrcworCWluIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSB0aG91Z2gsIHNpbmNlIGl0IHNob3VsZCBiZSBlYXN5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2gpOgorCUZpeCB0aGlzIGluIHRoZSAhZGlzcGF0Y2ggY2FzZSB0byBhdm9pZCBidXN5LWxvb3BpbmcgYWZ0ZXIKKwlkaXNjb25uZWN0aW9uCisKKyAgICAgICAgKiBNb3JlIG1pc2MgZG9jcyBpbXByb3ZlbWVudHMKKworMjAwNi0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIG1vcmUgRG94eWdlbi1yZWxhdGVkIGZpeGVzIChsb3RzIG9mIG1vdmluZyB0aGluZ3MgZnJvbSB0aGUKKwlwdWJsaWMgdG8gaW50ZXJuYWwgc2VjdGlvbiBpbiBkYnVzLWNvbm5lY3Rpb24uYykKKworMjAwNi0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEZpeCBhIHBpbGUgb2YgRG94eWdlbiB3YXJuaW5ncyBhbmQgbWlzc2luZyBkb2NzCisKKzIwMDYtMTAtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXItd2F0Y2gtZGVmYXVsdC5jLCBidXMvZGlyLXdhdGNoLWRub3RpZnkuYywgCisJYnVzL2Rpci13YXRjaC1rcXVldWUuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IFBhc3MgaW4gYSBCdXNDb250ZXh0IAorCWluc3RlYWQgb2YgYSB2b2lkICouICBrcXVldWUgdXNlcyB0aGlzIHRvIGdldCB0aGUgY29udGV4dCdzIGxvb3AKKwl3aGlsZSB0aGUgb3RoZXIgbW9kdWxlcyBpZ25vcmUgdGhlIHBhcmFtZXRlci4gIFRoaXMgYWxsb3dzIHVzIHRvCisJYXZvaWQgcGxhdGZvcm0gY29uZGl0aW9uYWxzCisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfcG9zdGluaXQpOiBQYXNzIGluIHRoZSBjb250ZXh0IHRvIHRoZSAKKwl3YXRjaAorCisyMDA2LTEwLTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbiwgYnVzL3JjLm1lc3NhZ2VidXMuaW46IHJ1biBkYnVzLXV1aWRnZW4gLS1lbnN1cmUKKwl3aGVuIHN0YXJ0aW5nIHRoZSBzeXN0ZW0gYnVzCisKKzIwMDYtMTAtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTW9yZSBmaXh1cHMgZm9yIGNyb3NzIGNvbXBpbGUgKFBhdGNoIGZyb20gCisJTWFyY28gUHJhY3VjY2kgPGRldmVsb3BtZW50IGF0IHByYWN1Y2NpIGRvdCBjb20+KQorCisyMDA2LTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBkb24ndCBjbG9zZSBzaGFyZWQgY29ubmVjdGlvbiwgZml4CisJZnJvbSBUaW1vIEhvZW5pZworCisyMDA2LTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChDUFBGTEFHUyk6IGRvbid0IGRvIC1EREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UgaGVyZQorCisJKiBkYnVzL2RidXMuaDogZHJvcCB0aGUgREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UgcmVxdWlyZW1lbnQsCisJc2luY2UgcmVhbGlzdGljYWxseSBpdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSdsbCBiZSBjaGFuZ2luZyBpdAorCWFueW1vcmUuCisKKzIwMDYtMTAtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkKTogbmV3IGZ1bmN0aW9uIHRvCisJYmUgdXNlZCBmb3IgcmV0dXJuX2lmX2ZhaWwgdHlwZSB3YXJuaW5nczsgcHJlZml4ZXMgdGhlIHBpZCwgYW5kCisJZmF0YWwgYnkgZGVmYXVsdC4KKworMjAwNi0xMC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZWxlYXNlZCAxLjAgUkMgMigwLjk0KQorCUFkZCBjaGVjayBmb3IgLWZQSUMgYW5kIGVuYWJsZSBpdCBpZiBhdmFpbGFibGUKKworMjAwNi0xMC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IFJlbW92ZSB0aGUgY2hlY2sgVE9ETyBpdGVtCisKKzIwMDYtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtdHJhbnNwb3J0LXNvY2tldC5jIChleGNoYW5nZV9jcmVkZW50aWFscyk6CisJUHJpbnQgb3V0IG1vcmUgZGV0YWlsZWQgZXJyb3JzIGlmIHJlYWRpbmcgb3Igc2VuZGluZworCWNyZWRlbnRpYWxzIGZhaWwgKFBhdGNoIGZyb20gSnVsaW8gTS4gTWVyaW5vIFZpZGFsIAorCTxqbW12IGF0IE5ldEJTRCBkb3Qgb3JnPikKKworMjAwNi0xMC0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiB3aGVuIGNoZWNraW5nIGZvciBwb3NpeCBnZXRwd25hbV9yIGFzc3VtZSB0cnVlCisJZm9yIGNyb3NzIGNvbXBpbGVzCisKKzIwMDYtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGdldGhvc3RieW5hbWUgZmlyc3QgYmVmb3JlIHdlIGNoZWNrIGZvciBpdAorCWluIGxpYm5zbC4gIE9uIGdudSBzeXN0ZW1zIGl0IGlzIGltcGxlbWVuZXRlZCAKKworMjAwNi0xMC0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBmaXggdG8gaGFuZGxlIGNsb3NlZAorCWNvbm5lY3Rpb25zLCBmcm9tIFRhbWJldCBJbmdvIGJ1ZyAjODYzMQorCisyMDA2LTEwLTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHVzZSBBQ19UUllfQ09NUElMRSBmb3IgZGlyZmQgaW5zdGVhZCBvZiBBQ19UUllfUlVOCisKKzIwMDYtMTAtMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtOiBkb24ndCBsaW5rIGFnYWluc3QgYm90aCBsaWJkYnVzIGFuZAorCWxpYmRidXMtY29udmVuaWVuY2UKKworMjAwNi0xMC0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3IgZGlyZmQgZXZlbiBpZiBpdCBpcyBhIG1hY3JvCisJKFBhdGNoIGZyb20gVGltb3RoeSBSZWRhZWxsaSA8ZHJpenp0IGF0IGd1ZmkgZG90IG9yZz4pCisKKzIwMDYtMTAtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyBvbiBzb2xhcmlzCisJYXZvaWQgdXNpbmcgZGlyZmQgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgZGlyZmQgCisJKFBhdGNoIGJ5IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPikgCisKKzIwMDYtMTAtMDIgIEpvaG4gKEo1KSBQYWxtaWVpciAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Fib3J0KTogUmVtb3ZlIGZyb20gCisJI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUUyBtYWNybyB0byBmaXggZGlzdGNoZWNrCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcHJpbnRfYmFja3RyYWNlKTogUmVtb3ZlIGZyb20KKwkjaWYgIWRlZmluZWQgKERCVVNfRElTQUJMRV9BU1NFUlQpIHx8IGRlZmluZWQoREJVU19CVUlMRF9URVNUUykKKwltYWNybyBiZWNhdXNlIF9kYnVzX2Fib3J0IGNhbGxzIGl0CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBBZGQgZGJ1cy1sYXVuY2guaCB0byB0aGUgc291cmNlIGxpc3Qgc28gZGlzdGNoZWNrCisJd29ya3MKKworMjAwNi0xMC0wMiAgSm9obiAoSjUpIFBhbG1pZWlyICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKGRpcmVudF9idWZfc2l6ZSk6IEFkZCBjaGVjayBmb3IKKwlNQVhOQU1FTEVOIGZvciBNYWMgT1NYLiAgKFBhdGNoIGZyb20gSm9uYXMgQiA8c2Fub2l4IGF0IGdtYWlsIGRvdCBjb20+KQorCisyMDA2LTEwLTAyICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ29Aa2RlLm9yZz4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAobWFpbik6IG1ha2UgaXQgY29tcGxhaW4gYW5kIGFib3J0CisJZXhlY3V0aW9uIGluIGNhc2UgYW4gdW5rbm93biBvcHRpb24gaXMgZ2l2ZW4uIEFsc28sIHByb2Nlc3MKKwl0aGUgJy0tJyBhcmd1bWVudCBhcyB0aGUgZW5kIG9mIGFyZ3VtZW50cy4KKworMjAwNi0xMC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKHByaW50X3ZhcmlhYmxlcyk6IGlmIG5vIHN5bnRheCBpcyBnaXZlbiwKKwlkb24ndCBwcmludCBzb21ldGhpbmcgdGhhdCdzIHNvcnQtb2YtaGFsZi1zaC1zeW50YXgsIGp1c3QgcHJpbnQKKwlhIHBsYWluIGtleS12YWx1ZSBwYWlycyB0aGluZy4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2gteDExLmM6IHVzZSBtYWNoaW5lIElEIHJhdGhlciB0aGFuIGhvc3RuYW1lIGZvcgorCXRoZSBsb2NhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uIChidXQgc3RpbGwgaGF2ZSB0aGUgaG9zdG5hbWUgaW4KKwl0aGUgZGlzcGxheSkuIFJlbW92ZSB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgZGlzcGxheSBpZiBpdCBpcworCWxvY2FsaG9zdC4gQ2hhbmdlIHNlc3Npb24gZmlsZXMgdG8gYmUgbmFtZWQKKwl+Ly5kYnVzL3Nlc3Npb24tYnVzL21hY2hpbmUtZGlzcGxheS4gQ2hhbmdlIFggYXRvbXMgdG8gYmUKKwl1bmRlcnNjb3JlLXByZWZpeGVkIHNvIG5vYm9keSB3aGluZXMgYWJvdXQgSUNDQ00gY29tcGxpYW5jZS4KKwlPdGhlcndpc2UgbmFtZSB0aGVtIHRoZSBzYW1lIGFzIHRoZSBlbnYgdmFyaWFibGVzLgorCUNoYW5nZSBzZXNzaW9uIGZpbGUgZm9ybWF0IHRvIGluY2x1ZGUga2V5LXZhbHVlIHBhaXJzIGFuZCBhbgorCWV4cGxhbmF0b3J5IGNvbW1lbnQuIEtleXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBlbnYgdmFyaWFibGVzLgorCShzZXRfYWRkcmVzc19pbl94MTEpOiBYIHByb3BlcnR5IGZvcm1hdCBjYW4ndCBkZXBlbmQgb24KKwlzaXplb2YocGlkX3QpIG9uIGEgcGFydGljdWxhciBtYWNoaW5lLCBmaXggdG8gYWx3YXlzIGJlIDMyIGJpdHMKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogbWFrZSAtLWF1dG9sYXVuY2ggdGFrZSBhIG1hY2hpbmUgaWQKKwlhcmd1bWVudC4gSWYgLS1hdXRvbGF1bmNoIGlzIHVzZWQgd2l0aCBhIHByb2dyYW0gdG8gcnVuLCBjb21wbGFpbgorCWZvciBub3cgKGJ1dCBhZGQgYSBGSVhNRSkuIEFsc28sIGRvbid0IGxvb2sgZm9yIGV4aXN0aW5nIGJ1cyBpZiAKKwl0aGVyZSdzIGEgcHJvZ3JhbSB0byBydW4gKGJ1dCBhZGQgYSBGSVhNRSkuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyk6IHBhc3MKKwltYWNoaW5lIHV1aWQgdG8gZGJ1cy1sYXVuY2ggKGF2b2lkcyBsaW5raW5nIGRidXMtbGF1bmNoIHRvIGxpYmRidXMKKwlqdXN0IHRvIGdldCB0aGlzLCBhbmQgYXZvaWRzIGR1cGxpY2F0aW5nIHV1aWQtcmVhZGluZyBjb2RlKS4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMTogY2xhcmlmeSB2YXJpb3VzIHRoaW5ncworCQorMjAwNi0xMC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogcmVtb3ZlIGJyb2tlbiBleHRyYQorCXVucmVmIHRoYXQgd2FzIGhpZGRlbiBieSB0aGUgYnVncyBpbiBkYnVzLWNvbm5lY3Rpb24uYy9kYnVzLWJ1cy5jCisKKwkqIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogc2FtZSBmaXgKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKTogYnJlYWsgdXAgdGhlCisJZnVuY3Rpb24gYSBsaXR0bGUgZm9yIGNsYXJpdHkgYW5kIGZpeCB0aGUgbm90aWZpY2F0aW9uIG9mCisJZGJ1cy1idXMuYyB0byBub3QgcmVxdWlyZSBkaXNwYXRjaCB0byBiZSBjb21wbGV0ZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fdW5yZWYpOiBpbXByb3ZlIHRoZQorCXdhcm5pbmcgd2hlbiB5b3UgdHJ5IHRvIGZpbmFsaXplIGFuIG9wZW4gY29ubmVjdGlvbi4KKwkKKzIwMDYtMTAtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMKKwkoaW50ZXJuYWxfYnVzX2dldCk6IG9ubHkgd2VhayByZWYgdGhlIGNvbm5lY3Rpb247IHRoaXMgbWVhbnMgCisJX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgY2FuIGJlCisJY2FsbGVkIHNhZmVseSBpbiBhbnkgY29udGV4dAorCShfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCk6IGRvbid0CisJdW5yZWYKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOiBtb3ZlCisJX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgaGVyZQorCXdoZW4gcXVldWluZyBEaXNjb25uZWN0ZWQgaW5zdGVhZCBvZiB3aGVuIHRoZSBEaXNjb25uZWN0ZWQgbWVzc2FnZQorCWFycml2ZXMsIHNvIGRidXNfYnVzX2dldCgpIHdvbid0IHJldHVybiBjbG9zZWQgY29ubmVjdGlvbnMuCisJCisyMDA2LTEwLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYpOiAKKwlBZGQgYSBoYWNrIHRvIG1ha2UgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiB3b3JrIHJpZ2h0LgorCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChoYW5kbGVfbmV3X2NsaWVudF9mZF9hbmRfdW5sb2NrKTogdXNlCisJdGhlIGhhY2sgaGVyZS4gQWxzbywgZml4IHRoZSB0b2RvIGFib3V0IHJlZmNvdW50IGxlYWsuCisJCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwlhbmQgdXNlIHRoZSBoYWNrIGhlcmUKKwkKKyAgICAgICAgKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBLaWxsIHRoZSAic2hhcmVkIiBmbGFnIHZzLiB0aGUKKwkic2hhcmVhYmxlIiBmbGFnOyB0aGlzIHdhcyBjb21wbGV0ZWx5IGJyb2tlbiwgc2luY2UgaXQgbWVhbnQgCisJZGJ1c19jb25uZWN0aW9uX29wZW4oKSByZXR1cm5lZCBhIGNvbm5lY3Rpb24gb2YgdW5rbm93bgorCXNoYXJlZC1uZXNzLiBOb3csIHdlIGFsd2F5cyBob2xkIGEgcmVmIG9uIGFueXRoaW5nIG9wZW5lZCAKKwlhcyBzaGFyZWFibGUuCisKKwlNb3ZlIHRoZSBjYWxsIHRvIG5vdGlmeSBkYnVzLWJ1cy5jIGludG8KKwljb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQsIHNvIGxpYmRidXMgY29uc2lzdGVudGx5IGZvcmdldHMKKwlhbGwgaXRzIGtub3dsZWRnZSBvZiBhIGNvbm5lY3Rpb24gYXQgb25jZS4gVGhpcyBleHBvc2VkIG51bWVyb3VzCisJcGxhY2VzIHdoZXJlIHRoaW5ncyB3ZXJlIHRvdGFsbHkgYnJva2VuIGlmIHdlIGRyb3BwZWQgYSByZWYgaW5zaWRlCisJZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCB3aGVyZQorCWNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCB3YXMgcHJldmlvdXNseSwgc28gbW92ZQorCWNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCBpbnRvCisJX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2suIEFsc28gbW92ZSB0aGUKKwlleGl0X29uX2Rpc2Nvbm5lY3QgaGVyZS4KKworCShzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24pOiB0aGlzIGFzc3VtZWQgd2VhayByZWZzIHRvIHRoZQorCXNoYXJlZCBjb25uZWN0aW9uczsgc2luY2Ugd2UgaGF2ZSBzdHJvbmcgcmVmcyBub3csIHRoZSBhc3NlcnRpb24gCisJd2FzIGZhaWxpbmcgYW5kIHN0dWZmIHdhcyBsZWZ0IGluIHRoZSBoYXNoLiBGaXggaXQgdG8gY2xvc2UKKwlzdGlsbC1vcGVuIHNoYXJlZCBjb25uZWN0aW9ucy4KKwkKKwkqIGJ1cy9kaXNwYXRjaC5jOiBmaXh1cCB0byB1c2UgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSBvbiB0aGUgCisJZGVidWcgcGlwZSBjb25uZWN0aW9ucworCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogb25seSBub3RpZnkKKwlkYnVzLWJ1cy5jIGlmIHRoZSBjbG9zZWQgY29ubmVjdGlvbiBpcyBpbiBmYWN0IHNoYXJlZAorCShfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCk6IHJlbmFtZSBmcm9tIAorCV9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWwKKwkoZGJ1c19jb25uZWN0aW9uX2Nsb3NlLCBkYnVzX2Nvbm5lY3Rpb25fb3BlbiwKKwlkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKTogSW1wcm92ZSBkb2NzIHRvIGV4cGxhaW4gdGhlIGRlYWwKKwl3aXRoIHdoZW4geW91IHNob3VsZCBjbG9zZSBvciB1bnJlZiBvciBib3RoCisKKwkqIGRidXMvZGJ1cy1idXMuYworCShfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCk6IHJlbmFtZQorCWZyb20gX2RidXNfYnVzX2NoZWNrX2Nvbm5lY3Rpb25fYW5kX3VucmVmX3VubG9ja2VkIGFuZCBtb2RpZnkgdG8KKwlsb29wIG92ZXIgYWxsIGNvbm5lY3Rpb25zCisKKwkqIHRlc3QvdGVzdC11dGlscy5jICh0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24pOiBkb24ndCB0cnkgdG8gY2xvc2UKKwlzaGFyZWQgY29ubmVjdGlvbnMuCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMgKG1haW4pOiBmaXggd2FybmluZ3MgaW4gaGVyZQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hYm9ydCk6IHN1cHBvcnQgREJVU19CTE9DS19PTl9BQk9SVAorCWVudiB2YXJpYWJsZSB0byBjYXVzZSBibG9ja2luZyB3YWl0aW5nIGZvciBnZGI7IGRyb3AKKwlEQlVTX1BSSU5UX0JBQ0tUUkFDRSBhbmQganVzdCBjYWxsIF9kYnVzX3ByaW50X2JhY2t0cmFjZSgpIAorCXVuY29uZGl0aW9uYWxseS4KKworCSogY29uZmlndXJlLmluOiBhZGQgLWV4cG9ydC1keW5hbWljIHRvIGxpYnRvb2wgZmxhZ3MgaWYgYXNzZXJ0aW9ucyBlbmFibGVkCisJc28gX2RidXNfcHJpbnRfYmFja3RyYWNlIHdvcmtzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX3ByaW50X2JhY2t0cmFjZSk6IHVzZSBmcHJpbnRmCisJaW5zdGVhZCBvZiBfZGJ1c192ZXJib3NlIHRvIHByaW50IHRoZSBiYWNrdHJhY2UsIGFuZCBkaWFnbm9zZSBsYWNrIAorCW9mIC1yZHluYW1pYy8tZXhwb3J0LWR5bmFtaWMKKwkKKzIwMDYtMDktMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldF9wcml2YXRlLCBkYnVzX2J1c19nZXQpIAorCShpbnRlcm5hbF9idXNfZ2V0KTogZml4IHNjcmV3eSBjb2RlIGZvcm1hdHRpbmcuIHdob2V2ZXIgY29tbWl0dGVkCisJdGhhdCB3YXMgbm90IHBheWluZyBhdHRlbnRpb24hCisKKzIwMDYtMDktMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUX0NVUlJFTlQsIExUX0FHRSk6IGluY3JlbWVudCBjdXJyZW50IGFuZCBhZ2UgdG8KKwlyZWZsZWN0IGFkZGl0aW9uIG9mIGludGVyZmFjZXMuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkZXNjcmliZSBhIG5ldworCW9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkIG1ldGhvZAorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19za2lwX3doaXRlX3JldmVyc2UpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc3RyaW5nX3NraXBfd2hpdGUsIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rKTogdXNlIG5ldworCURCVVNfSVNfQVNDSUlfQkxBTkssIERCVVNfSVNfQVNDSUlfV0hJVEUgbWFjcm9zIGFuZCBmaXggYXNzZXJ0aW9uCisJYXQgZW5kIG9mIHNraXBfd2hpdGUKKwkoX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUpOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBjYWxsCisJZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXJfdW5sb2NrZWRfbm9fdXBkYXRlKTogbW9kaWZ5IHRvCisJc3VwcG9ydCBhIEdldE1hY2hpbmVJZCBtZXRob2QuCisKKwlBbHNvLCBzdXBwb3J0IGEgbmV3IGZsYWcgdG8gbGV0IHRoZSBidXMgcGFzcyBwZWVyIG1ldGhvZHMgdGhyb3VnaAorCXRvIGFwcHMgb24gdGhlIGJ1cywgd2hpY2ggY2FuIGJlIHNldCB3aXRoCisJZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzLgorCisJRmluYWxseSwgaGFuZGxlIGFuZCByZXR1cm4gYW4gZXJyb3IgZm9yIGFueXRoaW5nIHVua25vd24gb24gdGhlCisJUGVlciBpbnRlcmZhY2UsIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZXh0ZW5kIHRoZSBQZWVyIGludGVyZmFjZQorCWluIHRoZSBmdXR1cmUgd2l0aG91dCBmZWFyIHRoYXQgd2UncmUgbm93IGludGVyY2VwdGluZyBzb21ldGhpbmcKKwlhcHBzIHdlcmUgd2FudGluZyB0byBzZWUuCisJCisJKiB0b29scy9kYnVzLXV1aWRnZW4uYzogYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBmdW5jdGlvbnMgaW4gCisJZGJ1cy9kYnVzLXV1aWRnZW4uYworCisJKiBkYnVzL2RidXMtdXVpZGdlbi5jOiBpbXBsZW1lbnQgdGhlIGJ1bGsgb2YgdGhlIGRidXMtdXVpZGdlbgorCWJpbmFyeSBoZXJlLCBzaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGFscmVhZHkgaW4gbGliZGJ1cworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCk6IHJlYWQgdGhlCisJdXVpZCBmcm9tIHRoZSBzeXN0ZW0gY29uZmlnIGZpbGUKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19nZW5lcmF0ZV91dWlkLCBfZGJ1c191dWlkX2VuY29kZSkgCisJKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcpIAorCShfZGJ1c19jcmVhdGVfdXVpZF9maWxlX2V4Y2x1c2l2ZWx5LCBfZGJ1c19yZWFkX3V1aWRfZmlsZSk6IG5ldworCXV1aWQtcmVsYXRlZCBmdW5jdGlvbnMsIHBhcnRseSBmYWN0b3JlZCBvdXQgZnJvbSBkYnVzLXNlcnZlci5jCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Vycm9yX2Zyb21fZXJybm8pOiBjb252ZXJ0IEVFWElTVCB0bworCURCVVNfRVJST1JfRklMRV9FWElTVFMgaW5zdGVhZCBvZiBFRVhJU1QKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfRklMRV9FWElTVFMpOiBhZGQgZmlsZSBleGlzdHMgZXJyb3IKKworCSogdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuMTogZXhwbGFpbiB3aGF0IHRoZSBwb2ludCBvZiB0aGlzCisJdGhpbmcgaXMgYSBiaXQgbW9yZQorCisJKiBhdXRvZ2VuLnNoIChydW5fY29uZmlndXJlKTogYWRkIC0tY29uZmlnLWNhY2hlIHRvIGRlZmF1bHQKKwljb25maWd1cmUgYXJncworCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQpOiBkaXNhYmxlIHRoZQorCWVycm9yIHNldC9jbGVhciBhc3NlcnRpb25zIHdoZW4gREJVU19ESVNBQkxFX0NIRUNLUyBpcyBkZWZpbmVkCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiBpZiB4ZGlzcGxheSBoYXNuJ3QgYmVlbiBvcGVuZWQsCisJZG9uJ3QgdHJ5IHRvIHNhdmUgYWRkcmVzcywgZml4ZXMgY3Jhc2ggaW4gbWFrZSBjaGVjaworCQorMjAwNi0wOS0zMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIERCVVNfQklORElSIGFzIGEgI2RlZmluZSB0byBDIHNvdXJjZSBjb2RlLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jCisJKiB0b29scy9kYnVzLWxhdW5jaC5oCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYzoKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IEFkZCB0aGUgLS1hdXRvbGF1bmNoIG9wdGlvbiB0bworCWRidXMtbGF1bmNoLCB3aGljaCBtYWtlcyBpdCBzY2FuIGZvciBhbiBleGlzdGluZyBzZXNzaW9uCisJc3RhcnRlZCB3aXRoIC0tYXV0b2xhdW5jaC4gV2l0aCB0aGF0IG9wdGlvbiwgaXQgYWxzbyBjcmVhdGVzCisJYW4gWDExIHdpbmRvdyBhbmQgc2F2ZXMgdGhlIGJ1cyBhZGRyZXNzIGFuZCBQSUQgdG8gaXQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MpOiBBZGQKKwlhIGZ1bmN0aW9uIHRoYXQgcnVucyAiZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIiB0byByZXRyaWV2ZQorCXRoZSBydW5uaW5nIEQtQnVzIHNlc3Npb24gYWRkcmVzcyAob3Igc3RhcnQgb25lIGlmIG5vbmUgd2FzIHJ1bm5pbmcpCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogQWRkIHRoZSBoYW5kbGVyIGZvciB0aGUgImF1dG9sYXVuY2g6IgorICAgICAgICBhZGRyZXNzIHByb3RvY29sLCB3aGljaCB0cmllcyB0byBnZXQgdGhlIHJ1bm5pbmcgc2Vzc2lvbiBmcm9tCisgICAgICAgIGRidXMtbGF1bmNoLgorCisJKiBkYnVzL2RidXMtYnVzLmM6CisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IE1ha2UgImF1dG9sYXVuY2g6IiBiZSB0aGUgZGVmYXVsdAorCUQtQnVzIHNlc3Npb24gYnVzIGFkZHJlc3MuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IEZpeCBob3JyaWJsZSB0eXBvIGluIGVycm9yIG1lc3NhZ2UuCisKKzIwMDYtMDktMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiB1c2UgQEVYUEFOREVEX0RBVEFESVJAIGluc3RlYWQgb2YgQERBVEFESVJOQU1FQCAgCisKKzIwMDYtMDktMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCk6CisJZml4IHNvIHRoYXQgaWYgdW5peF91c2VyX2Z1bmN0aW9uIGlzIHNldCBvbiB3aW5kb3dzLCB3ZSBzdGlsbAorCWRvIHRoZSBkZWZhdWx0IGNoZWNrIHRoYXQgdGhlIGF1dGggaWRlbnRpdHkgbWF0Y2hlcyB0aGUgYnVzIGlkZW50aXR5CisKKzIwMDYtMDktMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9vcGVuKTogbW9kaWZ5IHRvIGRlbGVnYXRlCisJdG8gX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMsCisJX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0LAorCWFuZCBfZGJ1c190cmFuc3BvcnRfb3Blbl9kZWJ1Z19waXBlCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg6IGFkZCBfZGJ1c190cmFuc3BvcnRfb3Blbl9wbGF0Zm9ybV9zcGVjaWZpYworCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBBdHRlbXB0IGF1ZGl0aW5nIHB1YmxpYyBBUEkgdG8gcmVtb3ZlIGFsbCBjYXNlcyB3aGVyZSBhIFVuaXgKKwlmdW5jdGlvbiByZXR1cm5zIHdlaXJkIGVtdWxhdGVkIGdvbyB0byBXaW5kb3dzLiBUaGlzIHByb2JhYmx5IAorCWJyZWFrcyB0aGUgYnVzIGRhZW1vbiBvbiBXaW5kb3dzLCB0byBmaXggaXQgYWdhaW4gd2UgbWF5IAorCW5lZWQgdG8gc3RvcCBwcm9jZXNzaW5nIHVuaXgtc3BlY2lmaWMgY29uZmlnIG9wdGlvbnMgb24gV2luZG93cywKKwlhbmQgbWF5IG5lZWQgdG8gYWRkIFdpbmRvd3Mtc3BlY2lmaWMgcHVibGljIEFQSSBvciBjb25maWcgb3B0aW9ucy4KKwkKKwkqIGNvbmZpZ3VyZS5pbiAoTFRfQ1VSUkVOVCwgTFRfQUdFKTogaW5jcmVtZW50IGN1cnJlbnQgYW5kIGFnZSwKKwl0byByZWZsZWN0IGFkZGVkIGludGVyZmFjZXM7IHNob3VsZCBub3QgYnJlYWsgc29uYW1lLgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOiBkbworCW5vdCBpbnZva2UgdW5peCB1c2VyIGZ1bmN0aW9uIG9uIFdpbmRvd3MuIEtpbmQgb2YgYSBoYWNreSBmaXgsIGJ1dCAKKwl3ZSBkb24ndCB3YW50IGEgInVuaXggdWlkIiBsZWFraW5nIG91dCBvbiBXaW5kb3dzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCk6IGFkZCBuZXcgQVBJCisJdG8gZ2V0IHRoZSBzb2NrZXQgZmQgb24gV2luZG93cyBvciBVTklYCisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCk6IG1ha2UgdGhpcyBhbHdheXMgZmFpbCBvbiBXaW5kb3dzCisKKzIwMDYtMDktMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IGNoYW5nZSBob3cgdGhpcyB3b3JrcworCXRvIGJlIGFibGUgdG8gZGVsZWdhdGUgdG8gYSBzZXQgb2YgaGFuZGxlcnMgdGhhdCBjYW4gc3VjY2VlZCwKKwlmYWlsLCBvciBjaG9vc2Ugbm90IHRvIGhhbmRsZS4gQWxsb3dzIHVzIHRvIGhhdmUgCisJZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlmYWN0b3Igb3V0IHRoZSB0Y3Agc29ja2V0IHN0dWZmIHRvIGJlIHVzZWQgb24gd2luZG93cywgbGVhdmluZworCXVuaXggZG9tYWluIHNvY2tldCBvbmx5IGluIGRidXMtc29ja2V0LXVuaXguYworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOiBmYWN0b3Igb3V0IHRoZSB0Y3Agc29ja2V0CisJc3R1ZmYgdG8gYmUgdXNlZCBvbiB3aW5kb3dzLCBsZWF2aW5nIHVuaXggZG9tYWluIHNvY2tldCBvbmx5IAorCWluIGRidXMtdHJhbnNwb3J0LXVuaXguYworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcik6IGluc2VydAorCXRlbXBvcmFyeSBoYWNrIHRvIGJlIHN1cmUgdGhpcyBmYWlscyBvbiB3aW5kb3dzCisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKTogZGl0dG8KKworMjAwNi0wOS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfb3Blbl90Y3Bfc29ja2V0KSAKKwkoX2RidXNfb3Blbl91bml4X3NvY2tldCwgX2RidXNfb3Blbl9zb2NrZXQpOiBjaGFuZ2UgQVBJIGZvciAKKwlfZGJ1c19vcGVuX3NvY2tldCBzbyB0aGUgZG9tYWluL3R5cGUvcHJvdG9jb2wgZnJvbSBzeXN0ZW0gaGVhZGVycworCWFyZSBub3QgcmVxdWlyZWQuIFRoaXMgaXMga2luZCBvZiBwb2ludGxlc3MgdGhvdWdoIHVubGVzcyB3ZSBtb3ZlCisJcGFydCBvZiBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgaW50byBzeXNkZXBzLmMgaW5zdGVhZCBvZgorCXN5c2RlcHMtdW5peC5jLCB3aGljaCB3b3VsZCBtZWFuIGFkZGluZyBhIHdyYXBwZXIgYXJvdW5kCisJYmluZC9saXN0ZW4vZXRjLgorCUFsc28sIGFkZCBEQnVzRXJyb3IgdG8gdGhlIHNvY2tldC1vcGVuaW5nIGZ1bmN0aW9ucyBzbyB0aGV5IAorCWRvbid0IHJlcXVpcmUgdXNlIG9mIGVycm5vLgorCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oOiBzbWFsbCBjaGFuZ2UgdG8gUGV0ZXIncyBwYXRjaCB0byBtYWtlCisJZGJ1cy1zeXNkZXBzLXVuaXgtdXRpbC5jIGJ1aWxkLCBhZGQgdW5peC1zcGVjaWZpYyBzeXNkZXBzIGhlYWRlci4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy1zeXNkZXBzLXVuaXguYzogcGF0Y2ggZnJvbSBQZXRlciAKKwlLw7xtbWVsIGJ1ZyAjODI0OSB0byBtYWtlIHRoZSBzeXNkZXBzLmggcmVhZC93cml0ZS9vcGVuL2Nsb3NlCisJZnVuY3Rpb25zIHNwZWNpZmljYWxseSBmb3Igc29ja2V0cyBvbmx5LCBhbmQgbW92ZSBnZW5lcmljIAorCXJlYWQvd3JpdGUvb3Blbi9jbG9zZSBpbnRvIHVuaXgtc3BlY2lmaWMgY29kZS4KKworMjAwNi0wOS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6IGZpeCBhIHZhbGdyaW5kCisJY29tcGxhaW50IGFib3V0IGFjY2Vzc2luZyByZXZlbnRzIHdoZW4gcG9sbCByZXR1cm5zIDAsIGZyb20gSnVsaWFuIFNld2FyZC4KKworMjAwNi0wOS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMS4wIFJDIDEgKDAuOTMpIAorCisyMDA2LTA5LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyAoX2RidXNfd3JpdGVfcGlkX2ZpbGUpOgorCXVzZSBfZGJ1c19jbG9zZSBpbnN0ZWFkIG9mIGNsb3NlCisKKzIwMDYtMDktMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IEFkZCBzdXBwb3J0IGZvciBMT0NBTF9DUkVEUyBzb2NrZXQKKwljcmVkZW50aWFscy4gIEZpeGVzICJleHRlcm5hbCIgYXV0aGVudGljYXRpb24gdW5kZXIgZS5nLiBOZXRCU0QKKwl3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlciBzb2NrZXQgY3JlZGVudGlhbHMgbWVjaGFuaXNtLgorCShQYXRjaCBmcm9tIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAgPGptbXYgYXQgTmV0QlNEIGRvdCBvcmc+KQorCisyMDA2LTA5LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBBbGxvdyByZWN1cnNpdmUgbXV0ZXgncyB0byBiZSBwYXNzZWQgaW50bworCWRidXNfdGhyZWFkc19pbml0IGFuZCBiZSB1c2VkIGJ5IHRoZSBkYnVzIG11dGV4IGZ1bmN0aW9ucyB0bworCWF2b2lkIGRlYWRsb2Nrcy4KKworCSogZG9jL1RPRE86IFJlbW92ZSByZWN1cnNpdmUgbXV0ZXggZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIFRPRE8gaXRlbQorCisyMDA2LTA5LTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUpOgorCXVzZSB0aHJlYWRzYWZlIHJlYWRkaXJfciBpbnN0ZWFkIG9mIHJlYWRkaXIKKworMjAwNi0wOS0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy10aHJlYWRzLmMgKGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQpOiBOZXcgbWV0aG9kIGZvcgorCWluaXRpYWxpemluZyB0aGUgaW50ZXJuYWwgdGhyZWFkIGltcGxlbWVudGF0aW9uIChQYXRjaCBmcm9tCisJQWxleGFuZGVyIExhcnNzb24gPGFsZXhsIGF0IHJlZGhhdCBkb3QgY29tPikKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcmVtb3ZlIGEgYnVuY2ggb2YgdG9kbyBpdGVtcyBmcm9tIHRoZSAxLjAgbGlzdAorCisyMDA2LTA5LTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jLCBidXMvZGVza3RvcC1maWxlLmM6IERpc3Rpbmd1aXNoIGJldHdlZW4gT09NIGFuZAorCWtleSBub3QgZm91bmQKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFsLmM6IEFkZCBkYnVzX2lzX3ZlcmJvc2Ugc28gd2UgY2FuIGhhdmUgbW9yZQorCWNvbXBsZXggZGVidWdnaW5nIGNvZGUKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpKTogTW92ZQorCWJldHdlZW4gdGhlIHRlc3Qgc3VpdGUgaWZkZWZzCisJKF9kYnVzX3ZlcmJvc2VfYnl0ZXMpOiByZXR1cm4gaWYgdmVyYm9zaXR5IGlzIG5vdCBlbmFibGVkIAorCisyMDA2LTA5LTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jLCBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYzoKKwlyZW1vdmUgREJ1c01hcmsKKworMjAwNi0wOS0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICBwYXRjaCBtb3N0bHkgYnkgUGV0ZXIgS8O8bW1lbCwgYnVnICM4MjExCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IG5ldyBmaWxlLCB3aGljaCBzcGxpdHMgb3V0CisJdW5peC1zcGVjaWZpYyBzdHVmZiBpbiBkYnVzLXN5c2RlcHMuYworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBkb24ndCBpbmNsdWRlIGFueSBVTklYLW9ubHkgaGVhZGVycywgCisJYW5kIG1vdmUgdW5peC1zcGVjaWZpYyBzdHVmZiB0byBkYnVzLXN5c2RlcHMtdW5peC5jCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgSEFWRV9FUlJOT19ICisJCisyMDA2LTA5LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvdGVzdC1tYWluLmMgKG1haW4pOiBJbml0aWFsaXplIHRocmVhZGluZyBkdXJpbmcgdGVzdHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6CisJVW5sb2NrIGNvbm5lY3Rpb24gb24gZXJyb3IKKwkoZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSk6IHN0YXRpYyBtZXRob2QgZm9yIGdlbmVyYXRpbmcKKwlhbiBlcnJvciBtZXNzYWdlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhIG1lc3NhZ2UgdG8gcmVwbHkgdG8KKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOiBTZW5kIGEgZGlzY29ubmVjdCBlcnJvcgorCWluc3RlYWQgb2YganVzdCBhIHRpbWVvdXQgKE5VTEwpIHdoZW4gdGhlIGJ1cyBnZXRzIGRpc2Nvbm5lY3RlZAorCXdoaWxlIGJsb2NraW5nIGZvciBhIHJlcGx5LgorCQorMjAwNi0wOS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogUHJvcGVybHkgcmVtb3ZlCisJZmlsdGVycyAoUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDogQWRkIHByb3RvdHlwZSBmb3IgCisJX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyB0byByZW1vdmUgd2FybmluZworCisyMDA2LTA5LTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKTogTWFrZSBzdXJlIHdlCisJY2xvc2UgY2hpbGRfZXJyX3JlcG9ydF9waXBlW1dSSVRFX0VORF0gb24gZXhlYyAoUGF0Y2ggZnJvbSAKKwlLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogQ2xlYW4gdXAgY2xvc2UgY2FsbHMgdG8gdXNlIF9kYnVzX2Nsb3NlIChQYXRjaCBmcm9tIAorCUtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+KQorCisyMDA2LTA5LTA2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzoKKwktIFJlbW92ZSBwZW5kaW5nIGNhbGwgbG9ja2luZyB0b2RvIGl0ZW0KKwktIGRidXNfY29ubmVjdGlvbl9vcGVuIG5vdyBob2xkcyBoYXJkIHJlZi4gIFJlbW92ZSB0b2RvIGl0ZW0KKwktIGRvIHByb3BlciBsb2NraW5nIG9uIF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZgorCSAgYW5kIGhhbmRsZSBEQlVTX0JVU19TVEFSVEVSLiBSZW1vdmUgdG9kbyBpdGVtCisJLSBXYXJuIG9uIGNsb3Npbmcgb2YgYSBzaGFyZWQgY29ubmVjdGlvbi4gIFJlbW92ZSB0b2RvIGl0ZW0KKworCSogYnVzL2J1cy5jLCBidXMvY29ubmVjdGlvbi5jLCBidXMvZGlzcGF0Y2guYywgZGJ1cy9kYnVzLWJ1cy5jLAorCWRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IFVzZSB0aGUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2ludGVybmFsCisJc28gd2UgZG9uJ3QgZ2V0IHRoZSB3YXJuaW5nIHdoZW4gY2xvc2luZyBzaGFyZWQgY29ubmVjdGlvbnMKKworCSogdGVzdC90ZXN0LXNlcnZpY2UuYywgdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYzogQXBwbGljYXRpb25zCisJZG9uJ3QgY2xvc2Ugc2hhcmVkIGNvbm5lY3Rpb25zIHRoZW1zZWx2ZXMgc28gd2UgdW5yZWYgaW5zdGVhZCBvZgorCWNsb3NlCisKKwkqIHRlc3QvdGVzdC11dGlscy5jICh0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24pOiBDbG9zZSB0aGUgY29ubmVjdGlvbgorCisJKiBkYnVzL2RidXMtYnVzLmMgKF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZik6IENoYW5nZWQgdG8KKwlfZGJ1c19idXNfY2hlY2tfY29ubmVjdGlvbl9hbmRfdW5yZWZfdW5sb2NrZWQgc2luY2Ugd2Ugb25seSBjYWxsIHRoaXMKKwltZXRob2Qgb24gYSBsb2NrZWQgY29ubmVjdGlvbi4gIAorCU1ha2Ugc3VyZSB3ZSBjYWxsIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgaW5zdGVhZCBvZiAKKwlkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgYWxzby4KKwlIYW5kbGUgREJVU19CVVNfU1RBUlRFUiBjb3JyZWN0bHkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoY29ubmVjdGlvbl9yZWNvcmRfc2hhcmVkX3VubG9ja2VkKToKKwlNYXJrIGFzIHNoYXJlZCBhbmQgaGFyZCByZWYgdGhlIGNvbm5lY3Rpb24KKwkoY29ubmVjdGlvbl9mb3JnZXRfc2hhcmVkX3VubG9ja2VkKTogUmVtb3ZlIHRoZSBoYXJkIHJlZiBmcm9tIHRoZSAKKwljb25uZWN0aW9uCisJKF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWxfYW5kX3VubG9jayk6ICBOZXcgaW50ZXJuYWwgZnVuY3Rpb24KKwl3aGljaCB0YWtlcyBhIGxvY2tlZCBjb25uZWN0aW9uIGFuZCB1bmxvY2tzIGl0IGFmdGVyIGNsb3NpbmcgaXQKKwkoX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pbnRlcm5hbCk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbiB3aGljaCBhY3RzCisJbGlrZSB0aGUgb3JpZ29uYWwgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIG1ldGhvZCBieSBncmFiYmluZyBhIGNvbm5lY3Rpb24KKwlsb2NrIGFuZCBjYWxsaW5nIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWxfYW5kX3VubG9jaworCShkYnVzX2Nvbm5lY3Rpb25fY2xvc2UpOiBQdWJsaWMgY2xvc2UgbWV0aG9kLCB3YXJucyB3aGVuIHRoZSBhcHAKKwl0cnlzIHRvIGNsb3NlIGEgc2hhcmVkIGNvbm5lY3Rpb24KKworMjAwNi0wOS0wNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jOgorCShidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nKTogTmV3IG1ldGhvZCBmb3IgcG9wdWxhdGluZworCWEgREJ1c1N0cmluZyB3aXRoIHRoZSBpbnRyb3NwZWN0IGRhdGEKKwkoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IE1vdmUgaW50cm9zcGVjdCBnZW5lcmF0aW9uIGNvZGUgdG8gCisJYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZworCisJKiBidXMvbWFpbi5jOgorCShpbnRyb3NwZWN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdGhlIGludHJvcGVjdCBkYXRhIGFuZAorCWV4aXRzCisJKG1haW4pOiBBZGQgYSAtLWludHJvc3BlY3Qgc3dpdGNoCisKKzIwMDYtMDktMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBSZW1vdmVkIGR0ZCBwdWJsaXNoaW5nIGl0ZW0uICAKKwlJdCBzZWVtcyB0aGUgZHRkIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgYXQKKwlodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQKKworMjAwNi0wOS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE8sIHZhcmlvdXMgc291cmNlIGZpbGVzOiBBdWRpdGVkIHRvZG8ncyBhbmQgRklYTUUncyBhbmQKKwlwcmVwZW5kZWQgdGhlIG9uZXMgd2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgd2l0aCAxLjAuICBUaG9zZQorCXByZXBlbmRlZCB3aXRoIDEuMD8gbmVlZCBjbGVyaWZpY2F0aW9uIG9yIG1pZ2h0IG5vdCBiZSBuZWVkZWQKKwlmb3IgMS4wCisKKzIwMDYtMDktMDUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogQWRkIHNvbWUgY2hlY2tzIHNvIHdlIGRvbid0IGNyYXNoIG9uCisJTlVMTCBpbiB0aGUgcHVibGljIEFQSSAoUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXggZm9yIE9TLVggY29tcGlsZSB0aW1lIGVuZGlhbiBpc3N1ZXMgKHBhdGNoIGZyb20KKwlCZW5qYW1pbiBSZWVkIDxyYW5nZXIgYXQgYmVmdW5rIGRvdCBjb20+KQorCisyMDA2LTA5LTA1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBuby1jb21tb24gY29tcGlsZXIgZmxhZyAoT1MtWCBmaXggZnJvbQorCUJlbmphbWluIFJlZWQgPHJhbmdlciBhdCBiZWZ1bmsgZG90IGNvbT4pCisKKzIwMDYtMDktMDEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IEFkZCBhIHNpZ3Rlcm0gaGFuZGxlciAocGF0Y2ggZnJvbSBGcmVkZXJpYyBDcm96YXQKKwk8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPikKKworMjAwNi0wOC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jKTogZml4IGxhY2sgb2YgcmV0dXJuIHZhbHVlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQpOiBmaXgKKwlmb3JtYXR0aW5nLCByZW1vdmUgI2lmZGVmLCBhbmQgZml4IGRvY3MuICNpZmRlZiBkb2Vzbid0IG1ha2UKKwlhbnkgbW9yZSBzZW5zZSB0aGFuIG9uIGFueXRoaW5nIGVsc2UgaW4gdGhpcyBmaWxlLgorCShfZGJ1c19nZXRfdG1wZGlyKTogYWRkIGNvbnN0IHRvIHJldHVybiB2YWx1ZSwgYW5kIGtlZXAgdGhlCisJcmVzdWx0cyBvZiB0aGUgdmFyaW91cyBnZXRlbnYgYXJvdW5kIGluIGEgc3RhdGljIHZhcmlhYmxlLgorCisyMDA2LTA4LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYzogY2hhbmdlCisJZnJvbSBSYWxmIEhhYmFja2VyIHRvIG1vdmUgVU5JWC1zcGVjaWZpYyBzeXNkZXBzIGludG8gYSBzZXBhcmF0ZSBmaWxlLgorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBjaGFuZ2UgZmluZCB0byB1c2Ugc3ludGF4IHRoYXQgd29ya3Mgd2l0aCBub24KKwlnbnUgdmVyc2lvbnMgb2YgZmluZAorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IGZpeCBpbnZhbGlkIGRlcmVmIHdoZW4gY2hlY2tpbmcgaWYKKwlhIHZ0YWJsZSBtZXRob2QgZXhpc3RzIChQYXRjaCBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIgCisJPGNoIGRvdCBlaHJsaWNoZXIgYXQgZ214IGRvdCBkZT4pCisKKzIwMDYtMDgtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiwgZGJ1cy9NYWtlZmlsZS5hbSwgdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gsIAorCXRlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtOiBGaXhlZCBzb21lIGlzc3VlcyB3aXRoIGdldHRpbmcgZ2V0IGRidXMgCisJdG8gYnVpbGQgd2l0aCBidWlsZGRpciAhPSBzcmNkaXIgKFRha2VuIGZyb20gYSBwYXRjaCBieSBCZXJuYXJkIExlYWsKKwk8YmVybmFyZCBhdCBicmVuZGEtYXJrbGUgZG90IGRlbW9uIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IEZpeCBEQlVTX0RBRU1PTkRJUiB0byB1c2UgRVhQQU5ERURfQklORElSIGZvciB0aGUKKwlkZWZhdWx0IGNhc2UKKworMjAwNi0wOC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjLCBidXMvTWFrZWZpbGUuYW06IEdlbmVyYWxpemUga3F1ZXVlIHN1cHBvcnQgc28gdGhhdAorCWl0IHdvcmtzIG9uIGFueSBzeXN0ZW0gcHJvdmlkaW5nIHRoaXMgaW50ZXJmYWNlLCBub3Qgb25seSBGcmVlQlNELgorCUZvciBleGFtcGxlLCBOZXRCU0QuIChQYXRjaCBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwgIDxqbW12IGF0IE5ldEJTRCBkb3Qgb3JnPikKKworMjAwNi0wOC0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLWZhcS54bWwsIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogc29tZSBpbXByb3ZlbWVudHMgdG8KKwl0aGUgZG9jcworCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjkyIAorCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChkYnVzX3RocmVhZHNfaW5pdCk6IGNoYW5nZSB0aGUgZG9jdW1lbnRhdGlvbgorCXRvIHJlZmxlY3QgdGhlIGluaXQgbGF0ZSBjaGFuZ2UKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBDaGVjayB1c2VyIGJlZm9yZSB3ZSBmb3JrIHNvIHdlIGNhbgorCXByaW50IG91dCBhbiBlcnJvciBtZXNzYWdlIGEgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlCisKKzIwMDYtMDgtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBwcm92aWRlZCBieSBSYWxmIEhhYmFja2VyIChyYWxmIGRvdCBoYWJhY2tlciBhdCBmcmVlbmV0IGRvdCBkZSkgCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy10aHJlYWRzLmMsIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDoKKwlBZGQgdHdvIG1vcmUgZ2xvYmFsIGxvY2tzIGZvciB1c2Ugb24gd2luZG93cyBwbGF0Zm9ybXMuICBUaGVzZSBhcmUKKwl1bnVzZWQgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIGJ1dCBhcmUgbm90IGlmZGVmZWQgb3V0IHRvIGF2b2lkCisJcG90ZW50aWFsIGJ1Z3MgKGkuZS4gdGhlIGZldyBieXRlcyBsb3N0IGRvZXMgbm90IHdhcnJlbnQgdGhlIGV4dHJhCisJbWFpbnRhbmVuY2UgYW5kIGNvbXBsZXhpdHkgdGhhdCBoYXZpbmcgc2VwZXJhdGUgc2V0cyBvZiBsb2NrcyB3b3VsZAorCWNhdXNlKQorCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFJldHVybiBhbiBlcnJvcgorCXdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVnaXN0ZXIgdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzIEJ1cyBOYW1lCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlKTogUmV0dXJuIGFuIGVycm9yCisJd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byByZWxlYXNlIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cyBCdXMgTmFtZQorCisyMDA2LTA4LTE3ICBBbHAgVG9rZXIgIDxhbHBAYXRva2VyLmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IEZpeCBzb21lIG1pbm9yIHR5cG9zLgorCisyMDA2LTA4LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHVzZSAkd2l0aF9pbml0X3NjcmlwdHMgaW5zdGVhZCBvZiAkb3BlcmF0aW5nX3N5c3RlbQorCXRvIGRldGVybWluZSB3aGVyZSB0byBzdG9yZSB0aGUgcGlkIHNpbmNlIHRoZSBpbml0IHNjcmlwdHMgbWFuaXB1bGF0ZSAKKwl0aGUgcGlkIGZpbGUgKHBhdGNoIGZyb20gTWFyY2VsbyBSaWNhcmRvIExlaXRuZXIgCisJPG1hcmNlbG8gZG90IGxlaXRuZXIgYXQgdGVycmEgZG90IGNvbSBkb3QgYnI+LiAgCisKKzIwMDYtMDgtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IEFkZCBzdGF0aWMgREJ1c0xpc3QgKnVuaW5pdGlhbGl6ZWRfbXV0ZXhfbGlzdCBhbmQKKwlzdGF0aWMgREJ1c0xpc3QgKnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0IHRvIHN1cHBvcnQgbmV3IGxhdGUgCisJaW5pdGlhbGl6YXRpb24gdGhyZWFkaW5nIG1vZGVsLiAgSW4gdGhpcyBtb2RlbCB0aHJlYWRzIGNhbiBiZSBpbml0aWFsaXplZAorCWV2ZW4gYWZ0ZXIgdGhlIEQtQnVzIEFQSSBoYXMgYmVlbiB1c2VkIGJ1dCBzdGlsbCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCAKKwliZWZvcmUgdGhlIHNlY29uZCB0aHJlYWQgaGFzIGJlZW4gc3RhcnRlZC4gIE11dGV4ZXMgYW5kIGNvbmR2YXIgYWRkcmVzc2VzCisJYXJlIHN0b3JlZCBpbiB0aGUgdHdvIHN0YXRpYyBsaXN0cyBhbmQgYXJlIHJlcGxhY2VkIHdpdGggYWN0dWFsbCBsb2NrcworCXdoZW4gdGhyZWFkcyBhcmUgaW5pdGFsaXplZC4KKwkoX2RidXNfbXV0ZXhfbmV3X2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBtdXRleCBhbmQgcGxhY2luZworCXRoZSBsb2NhdGlvbiBpbnRvIHRoZSBzdGF0aWMgbGlzdAorCShfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgcmVtb3ZpbmcgYSBtdXRleCBsb2NhdGlvbiAKKwlmcm9tIHRoZSBzdGF0aWMgbGlzdCBhbmQgZnJlZWluZyB0aGUgbXV0ZXgKKwkoX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24pOiBOZXcgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNvbmRpdGlvbmFsIAorCXZhcmlhYmxlIGFuZCBwbGFjaW5nIHRoZSBsb2NhdGlvbiBpbnRvIHRoZSBzdGF0aWMgbGlzdAorCShfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24pOiBOZXcgbWV0aG9kIGZvciByZW1vdmluZyBhIGNvbmRpdGlvbmFsCisJdmFyaWFibGUgbG9jYXRpb24gZnJvbSB0aGUgc3RhdGljIGxpc3QgYW5kIGZyZWVpbmcgdGhlIGNvbmRpdGlvbmFsIHZhcmlhYmxlIAorCShpbml0X3VuaW5pdGlhbGl6ZWRfbG9ja3MpOiBBdG9taWMgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCB0aGUgc3RhdGljIAorCWxpc3RzIG9mIG11dGV4IGFuZCBjb25kdmFyIGxvY2F0aW9uIGFuZCB1cGRhdGVzIHRoZW0gd2l0aCBhY3R1YWxsIGxvY2tzCisJKGluaXRfZ2xvYmFsX2xvY2tzKTogY2hhbmdlZCB0byBpbml0X2xvY2tzCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzKTogTmV3IG1ldGhvZCBmb3IgdGVzdHMgdG8gY2hlY2sgY29ubmVjdGlvbnMKKwkoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6IFVzZSB0aGUgbmV3IGF0X2xvY2F0aW9uIG11dGV4IGFuZAorCWNvbmR2YXIgQVBJCisJKGRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBQYXNzIGluIHRoZSBnbG9iYWwgbG9jayBhZGRyZXNzCisJdG8gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzoKKwkoX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyk6IFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgbXV0ZXgKKwlpbnN0ZWFkIG9mIHRoZSBtdXRleCBpdHNlbGYKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwkoZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCk6IFBhc3MgaW4gdGhlIGdsb2JhbCBsb2NrIGFkZHJlc3MKKwl0byBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jCisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzoKKwkoZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90KTogUGFzcyBpbiB0aGUgZ2xvYmFsIGxvY2sgYWRkcmVzcworCXRvIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOgorCShfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlKTogVXNlIHRoZSBuZXcgYXRfbG9jYXRpb24gbXV0ZXggQVBJCisJKGRidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCk6IFBhc3MgaW4gdGhlIGdsb2JhbCBsb2NrIGFkZHJlc3MKKwl0byBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmM6IE5ldyB0ZXN0IGNhc2UgZm9yIGxhdGUgdGhyZWFkCisJaW5pdGlhbGl6YXRpb24KKworMjAwNi0wOC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOgorCUNoYW5nZSBfZGJ1c19hYm9ydCB0byBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgYmVjYXVzZSBfZGJ1c19hYm9ydAorCWNhdXNlcyBjb21waWxlIHByb2JsZW1zIHdoZW4gYXNzZXJ0cyBhcmUgdHVybmVkIG9mZgorCUtlZXBpbmcgX2RidXNfd2FybiBmb3IgcHJpbnRpbmcgb3V0IHRoZSBtZXNzYWdlIHNvIGV2ZW4gaWYKKwlhc3NlcnRzIGFyZSB0dXJuZWQgb2ZmIHRoZSB1c2VyIGdldHMgdGhlIG1lc3NhZ2VzIHRoYXQgc29tZXRoaW5nIGlzIAorCXdyb25nIAorCisyMDA2LTA4LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJUGF0Y2hlcyBieSBLamFydGFuIE1hcmFhcyA8a21hcmFhcyBhdCBnbm9tZSBkb3Qgb3JnPgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzKToKKwlBZGQgYSBwb2ludGVyIGNhc3QgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmcKKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCk6CisJcmV0dXJuIGEgTlVMTCBpbnN0ZWFkIG9mIEZBTFNFIHNpbmNlIHRoZSByZXR1cm4gdHlwZQorCWlzIG5vdCBleHBlY3RpbmcgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jIChub2RlX25ldyk6CisJcmV0dXJuIGEgTlVMTCBpbnN0ZWFkIG9mIEZBTFNFIHNpbmNlIHRoZSByZXR1cm4gdHlwZQorCWlzIG5vdCBleHBlY3RpbmcgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIChfZGJ1c190cmFuc3BvcnRfZGVidWdfcGlwZV9uZXcpOgorCVNlbmQgYSBOVUxMIGludG8gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQgaW5zdGVhZCBvZiBhIEZBTFNFCisJYmVjYXVzZSB3ZSBhcmUgZXhwZWN0aW5nIGEgcG9pbnRlciBub3QgYSBib29sZWFuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfZ2V0X3RtcGRpcik6IAorCWFkZCB2b2lkIGFzIHRoZSBwYXJhbWV0ZXIgc28gc29tZSBjb21waWxlcnMKKwlkb24ndCBjb21wbGFpbgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCwKKwkgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCVNlbmQgYSBOVUxMIGludG8gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQgaW5zdGVhZCBvZiBhIEZBTFNFCisJYmVjYXVzZSB3ZSBhcmUgZXhwZWN0aW5nIGEgcG9pbnRlciBub3QgYSBib29sZWFuCisKKwkqIHRlc3Qvc2hlbGwtdGVzdC5jICh0ZXN0X2NvbW1hbmRfbGluZSk6CisJY2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIF9kYnVzX2xpc3RfYXBwZW5kIHRvIGF2b2lkIGNvbXBpbGVyCisJd2FybmluZ3MKKworCSogdGVzdC90ZXN0LW5hbWVzLmMgKG1haW4pOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKGNoZWNrX2hlbGxvX2Zyb21fc2VsZl9yZXBseSk6CisJSW5pdGlhbGl6ZSBlY2hvX21lc3NhZ2UgYW5kIGVjaG9fcmVwbHkgdG8gTlVMTAorCQorCSogdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYyAoaGFuZGxlX2VjaG8pOgorCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYW5kIGNhc3QgdGhlIHRoaXJkIHBhcmFtZXRlciBwYXNzZWQgdG8KKwlkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgdG8gYXZvaWQgY29tcGlsZXIgd2Fycm5pbmdzCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtbmFtZXMuYyAoY2xlYXJfbWVzc2FnZV9xdWV1ZSk6CisJUmVtb3ZlIHVudXNlZCBmdW5jdGlvbgorCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jOgorCUZpeCBmb3JtYXQgc3RyaW5nIGluIHByaW50ZgorCisKKzIwMDYtMDgtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYzoKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtbmFtZXMuYzoKKwlSZW1vdmUgdGVzdCBtZXRob2QgZGJ1c19idXNfY29ubmVjdGlvbl9nZXRfdW5pcXVlX25hbWUgYmVjYXVzZSAKKwl3ZSBhbHJlYWR5IGhhdmUgcHVibGljIG1ldGhvZCBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgdGhhdCAKKwlkb2VzIHRoZSBleGFjdCBzYW1lIHRoaW5nCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzoKKwlmaXggdHlwb3MgaW4gSnVsaW8ncyBwcmV2aW91cyBwYXRjaCB3aGljaCBjYXVzZSBtYWtlIGNoZWNrIHRvIGZhaWwKKworMjAwNi0wOC0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoX2RidXNfYWRkcmVzc190ZXN0KTogUmV2ZXJ0IGxlYWtpbmcgc3RyY21wLiAgCisJSW4gYW55IGNhc2UgaXQgd2FzIHdyb25nIHNpbmNlIHRoaXMgaXMgYSB0ZXN0IGNoZWNraW5nIHRvIHNlZSBpZgorCWFkZHJlc3MgcGFyc2luZyBpcyBjb3JyZWN0LiAgVGhlcmUgd2FzIG5vIG5lZWQgdG8gZ2V0IHRoZSB0cnVlCisJdG1wIGRpcmVjdG9yeS4gIAorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6IFJldmVydCB0aGUgYWRkaXRpb24gb2Ygc3RkZGVmLmgKKwlhcyB3ZSBzaG91bGQgbm90IGJlIGFkZGluZyBpdCB0byBsaWJyYXJ5IGhlYWRlcnMgCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzoKKwlGaXggdGhlIHVuaXQgdGVzdHMgc28gdGhhdCB0aGV5IHdvcmsgaWYgYXNzZXJ0aW9ucyBhcmUgbm90IGVuYWJsZWQuCisJKHBhdGNoIGZyb20gSnVsaW8gTS4gTWVyaW5vIFZpZGFsICA8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDoKKwkqIHRlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoOgorCVJlbW92ZSBiYXNoaXNtcyAocGF0Y2ggZnJvbSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwKKwk8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGEgdmVyc2lvbiAoPj0gMi42LjApIGNoZWNrIGZvciBsaWJ4bWwyCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogbWFrZSBzdXJlIHRoZSBjb21waWxlciBzdXBwb3J0cyAtV2Zsb2F0LWVxdWFsCisJCisJKiBidXMvZGlyLXdhdGNoLWRub3RpZnkuYzogbW92ZSBmdW5jdGlvbmFsIGNvZGUgYWZ0ZXIgCisJdmFyaWFibGUgZGVjbGVyYXRpb25zIChDOTkgZml4KSAgKHBhdGNoZXMgZnJvbSBKZW5zIEdyYW5zZXVlcgorCTxqZW5zZ3IgYXQgZ214IGRvdCBuZXQ+CisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaDoKKwlhZGQgI2luY2x1ZGUgPHN0ZGRlZi5oPiBzbyB0aGF0IFN1biBjb21waWxlcnMgZG9uJ3QgY29tcGxhaW4gYWJvdXQKKwl0aGUgZGVmaW5pbmcgTlVMTAorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuYzoKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6CisJKiB0ZXN0L3NoZWxsLXRlc3QuYzoKKwlkb24ndCBoYXJkY29kZSB0bXAgZGlyZWN0b3J5IChwYXRjaCBmcm9tIERhdmUgTWVpa2xlIAorCTxkbWsgYXQgZGF2ZW1laWtsZSBkb3QgY28gZG90IHVrPikKKworMjAwNi0wOC0wOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOgorCUNoYW5nZSBhbiBhc3NlcnQgdG8gYSBkZXRhaWxlZCB3YXJuaW5nIGFuZCBhYm9ydC4gIAorCVdoZW4gYWxsb2NhdG9yLT5sb2NrICE9IG11dGV4IGl0IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGhhcyBmYWlsZWQKKwl0byBpbml0YWxpemUgdGhyZWFkcyBiZWZvcmUgdXNpbmcgdGhlIEQtQnVzIGxpYnJhcnkuICBUaGlzIHdhcm5pbmcKKwloZWxwcyB0aGUgdXNlciBpZGVudGlmeSB0aGUgaXNzdWUgYW5kIGZpeCB0aGVpciBhcHAuCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlUaGVzZSBhcmUgYWxsIHBhdGNoZXMgZnJvbSBLamFydGFuIE1hcmFhcyA8a21hcmFhcyBhdCBnbm9tZSBkb3Qgb3JnPgorCXdpdGggY2xlYW51cHMgb2YgYnVncyBmb3VuZCBmcm9tIENvdmVyaXR5IHJlcG9ydHM6CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfd3JpdGVfcGlkX2ZpbGUpOgorCWNsb3NlIHRoZSBmaWxlIG9uIGVycm9yIHRvIGF2b2lkIGEgbGVhaworCisJKiBidXMvZXhwaXJlbGlzdC5jIChidXNfZXhwaXJlX2xpc3RfdGVzdCk6CisJQ2hlY2sgZm9yIE5VTEwgb24gZGJ1c19uZXcwCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKHVwZGF0ZV9kaXJlY3RvcnkpOgorCXJlbW92ZSBkZWFkIGNvZGUKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAobWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2gsIHN0YXJ0X3NlbGludXhfY2hpbGQpOgorCUZpeCBzb21lIGxlYWtzCisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6CisJRml4ZWQgYSBsZWFrCisKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYyAocGFyc2Vfa2V5X3ZhbHVlKToKKwlGaXhlZCBsZWFrCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCk6CisJRml4ZWQgbGVhaworCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3KToKKwlyZW1vdmUgZGVhZCBjb2RlCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogdXNlICMhL2Jpbi9zaCBpbnN0ZWFkIG9mCisJIyEvYmluL2Jhc2gKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogRG94eWZpbGUuaW46IGZpeCB0aGUgSU5QVVQgbGluZSBzbyB3ZSBjYW4gZ2VuZXJhdGUgZG9jcyAKKwl3aGVuIHNvdXJjZWRpciAhPSBidWlsZGRpciAocGF0Y2ggZnJvbSBDeWd3aW4gUG9ydHMgbWFpbnRhaW5lcgorCTx5c2Vsa293aXR6IGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IAorCXMvX2RidXNfcHJpbnRmX2xlbmd0aC9fZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIHRvIGNvbWZvcm0gd2l0aAorCUdMaWIncyBmdW5jdGlvbiB3aGljaCBkb2VzIHRoZSBzYW1lIHRoaW5nCisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9kaXItd2F0Y2gtZGVmYXVsdC5jOgorCSogYnVzL2Rpci13YXRjaC1kbm90aWZ5LmM6CisJKiBidXMvZGlyLXdhdGNoLWtxdWV1ZS5jOgorCUFkZCBrcXVldWUgZGlyZWN0b3J5IHdhdGNoaW5nIGZvciBmcmVlYnNkIGFuZCBzcGxpdCB0aGUgZGlyZWN0b3J5CisJd2F0Y2hpbmcgY29kZSBpbnRvIHNlcGVyYXRlIGZpbGVzIHBlciBtZXRob2QvYXJjaAorCShwYXRjaGVzIGZyb20gVGltb3RoeSBSZWRhZWxsaSA8ZHJpenp0IGF0IGd1ZmkgZG90b3JnPikKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29scy9kYnVzLWxhdW5jaC5jOgorCSogYnVzL01ha2VmaWxlLmFtOgorCWFsbG93IC0td2l0aC1kYnVzLWRhZW1vbmRpciBzd2l0Y2ggdG8gYmUgdXNlZCB0byBtYWtlIHRoZQorCWRhZW1vbiBpbnN0YWxsIHRvIGEgc2VwZXJhdGUgYmluZGlyIGxpa2UgL3Vzci9saWJleGVjCisJKHBhdGNoIGZyb20gQnJpYW4gQ2FtZXJvbiA8YnJpYW4gZG90IGNhbWVyb24gYXQgc3VuIGRvdCBjb20pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiByZW1vdmVkIHRoZSBzbGFzaCBhZnRlciAKKwkkKERFU1RESVIpIHNvIHdlIGRvbid0IGdldCB0aGUgZG91YmxlIHNsYXNoIHdoaWNoIGRvZXMgbm90IHdvcmsKKwlpbiB3aW5kb3dzIChwYXRjaCBmcm9tIEFuZHJhcyBQb3JqZXN6IAorCTxhbmRyYXMgZG90IHBvcmplc3ogYXQgc2llbWVucyBkb3QgY29tPikKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IAorCSAgYWRkIF9kYnVzX3ByaW50Zl9sZW5ndGggKHBhdGNoIGZyb20gUGV0ZXIgS8O8bW1lbCAKKwkgIDxzeW50aGV0aWNwcCBhdCBnbXggZG90IG5ldD4pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogdW5pc3RkLmggaXMgbm90IHVzZWQgCisJKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IG9ubHkgZW5hYmxlIHZlcmJvc2UgcHJpbnRpbmcgCisJaWYgREJVU19WRVJCT1NFIGVudmlyb25tZW50IHZhciBpcyBzZXQgdG8gJzEnCisJKHBhdGNoIGZyb20gUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHAgYXQgZ214IGRvdCBuZXQ+KQorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBhIEdDQyBmbGFnIGNoZWNrIGZvciAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorCXNvIHdlIHN0aWxsIGNvbXBpbGUgb24gb2xkZXIgZ2NjIChwYXRjaCBmcm9tIEZyZWRlcmljIFBldGVycyAKKwk8ZnBldGVycyBhdCAwZCBkb3QgYmU+CisKKzIwMDYtMDgtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBjaGFuZ2UgYWxsIHRoZSBwZW5kaW5nIGNhbGwgc3R1ZmYgdG8KKwlyZWZsZWN0IHRoZSBmYWN0IHRoYXQgcGVuZGluZyBjYWxsIG9wZXJhdGlvbnMgdXNlIHRoZSBjb25uZWN0aW9uCisJbG9jaworCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IGFkZCBsb2NraW5nIGhlcmUKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChzdHJ1Y3QgREJ1c1JlYWxFcnJvcik6IGRvbid0IG1ha2UgdGhlIG5hbWUKKwlmaWVsZCBjb25zdCBjb25zaXN0ZW50IHdpdGggaG93IG1lc3NhZ2UgZmllbGQgaXMgZG9uZQorCisyMDA2LTA4LTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBzL0QtQlVTL0QtQnVzL2cKKworMjAwNi0wOC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmM6IFBhdGNoIGJ5IEJlbmphbWluIE90dGUgCisJPGluN3kxMTggYXQgcHVibGljLnVuaS1oYW1idXJnIGRvdCBkZT4gLSBmaXggaW52YWxpZAorCXJlYWQvd3JpdGUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKworMjAwNi0wNy0yNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC45MQorCisyMDA2LTA3LTIyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQpOgorCShjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkKToKKwlNYWtlIHN1cmUgd2Ugc2V0IHRpbWVvdXRfYWRkZWQgb24gcGVuZGluZyBjYWxscyB0byBGQUxTRSB3aGVuCisJd2UgcmVtb3ZlIHRoZSB0aW1lb3V0IGZyb20gdGhlIGNvbm5lY3Rpb24KKworMjAwNi0wNy0yMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVtb3ZlZCBzb21lIGV4dHJhIGJpbmRpbmdzIHN0dWZmIGxpbmdlcmluZyBhcm91bmQgKHRoYW5rcyB0aW1vKQorCSogZGJ1cy1wZW5kaW5nY2FsbC5jIChfZGJ1c19wZW5kaW5nX2NhbGxfbmV3KTogCisJcy9kYnVzX2Nvbm5lY3Rpb25fcmVmL19kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIGZpeGVzIGFzc2VydGlvbgorCXdoZW4gd2UgdHJpZWQgdG8gdGFrZSBhIGxvY2sgb24gYW4gYWxyZWFkeSBsb2NrZWQgY29ubmVjdGlvbgorCisyMDA2LTA3LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjkwCisKKzIwMDYtMDctMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c190eXBlX3RvX3N0cmluZyk6IHN1cHBvcnQgNjQtYml0CisJaW50cywgcmVwb3J0ZWQgYnkgT3dlbiBUYXlsb3IKKworMjAwNi0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86CisJKiBkYnVzL2RidXMtYnVzLmM6CisJKiBkYnVzLWVycm9ycy5jOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYzoKKwkgIFJlbW92ZWQgVE9ETyBpdGVtcyB3aGljaCB3ZXJlIGZpeGVkIG9yIGFyZSBubyBsb25nZXIgcmVsZXZlbnQKKworMjAwNi0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy1xdDQtMS5wYy5pbiwgZGJ1cy1zaGFycC5wYy5pbjoKKwlSZW1vdmUgc3RyYXkgZmlsZXMgZnJvbSB0aGUgc3RyaXBwZWQgYmluZGluZ3MKKworMjAwNi0wNy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yKToKKwlJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIG9uIHJlcGx5IHRpbWVvdXQKKworMjAwNi0wNy0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVtb3ZlIGFsbCBiaW5kaW5ncworCisyMDA2LTA3LTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSk6IHJldHVybiBUUlVFCisJYW5kIHNldCBwZW5kaW5nX3JlcGx5IG91dCBhcmcgdG8gTlVMTCBpcyBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZAorCShjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkKTogTmV3CisJc3RhdGljIG1ldGhvZCBmb3IgY2xlYW5pbmcgdXAgcGVuZGluZyBjYWxscyBvbiBkaXNjb25uZWN0CisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IElmIHdlIGhhdmUgcGVuZGluZyAKKwljYWxscyBxdWV1ZWQgdGltZW91dHMgb24gZGlzY29ubmVjdCAKKworCSAqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX3NldF9jb25uZWN0aW9uKToKKwlSZW1vdmUgCisKKzIwMDYtMDctMTMgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2FybG9zZ2NAZ25vbWUub3JnPgorCisJKiBidXMvYWN0aXZhdGlvbi5bY2hdIChidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzKTogbmV3IGZ1bmN0aW9uIHRvIAorCWdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlcyB0aGF0IGNhbiBiZSBhY3RpdmF0ZWQKKworCSogYnVzL2Rpc3BhdGNoLmM6IHRlc3QgY292ZXJhZ2UgZm9yIHRoZSBuZXcgYnVzIG1ldGhvZAorCUxpc3RBY3RpdmF0YWJsZU5hbWVzCisKKwkqIGJ1cy9kcml2ZXIuYzogbmV3IGJ1cyBtZXRob2QgTGlzdEFjdGl2YXRhYmxlTmFtZXMgdG8gZ2V0IHRoZSBsaXN0IG9mCisJc2VydmljZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBMaXN0QWN0aXZhdGFibGVOYW1lcyBtZXRob2QgZG9jdW1lbnRhdGlvbgorCisyMDA2LTA3LTEyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogZGJ1cy9NYWtlZmlsZS5hbTogYWRkIGRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmggdG8gdGhlIGxpc3Qgb2YKKwlzb3VyY2UgZmlsZXMKKworMjAwNi0wNy0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYzoKKwlGaXggaW5kZXggaW50byBhbiBhcnJheSAocGF0Y2ggYnkgUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHAgYXQgZ214Lm5ldD4pCisKKzIwMDYtMDctMTIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGZpbGUgZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jOgorCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oOgorCU1ha2UgREJ1c1BlbmRpbmdDYWxsIGFuIG9wYXF1ZSB0eXBlIGV2ZW4gdG8gRC1CdXMgaW50ZXJuYWxzCisKKzIwMDYtMDctMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IHJlbW92ZSBjb25uZWN0aW9uX2Rpc2Nvbm5lY3QgYW5kIHJlcGxhY2Ugd2l0aAorCWNvbm5lY3Rpb25fY2xvc2UKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogaW5jbHVkZSBkYnVzLWJ1cy5oCisJKF9kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCk6IG1ha2Ugc3RhdGljCisKKzIwMDYtMDctMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9jbG9zZSk6IHJlbW92ZWQgZGVwcmVjYXRlZAorCWZ1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IE9uIGRpc2Nvbm5lY3QgdW5yZWYgYW55IHNoYXJlZCBjb25uZWN0aW9ucworCisJKiBkYnVzL2RidXMtYnVzLmMgKF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZik6IG5ldyBmdW5jdGlvbgorCWZvciBjbGVhbmluZyB1cCBzaGFyZWQgY29ubmVjdGlvbnMgb24gZGlzY29ubmVjdAorCShpbnRlcm5hbF9idXNfZ2V0KTogZ2V0IGEgaGFyZCByZWZyZW5jZSB0byBzaGFyZWQgY29ubmVjdGlvbnMgd2hlbgorCXRoZXkgYXJlIGNyZWF0ZWQKKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmUgaXRlbXMgd2hpY2ggYXJlIG5vIGxvbmdlciByZWxldmVudCBvciBoYXZlIGJlZW4gZml4ZWQKKwlTcGxpdCAxLjAgdG9kbyBpdGVtcyB3aXRoIGEgMC45MCBmcmVlemUgdG9kbyBsaXN0CisgCisyMDA2LTA2LTE0ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6CisJRnJlZSBhIGxlYWtpbmcgR0FycmF5IChzdXJlbHkgbm90ISkgaW4gZGJ1c19nX21ldGhvZF9yZXR1cm4uCisKKzIwMDYtMDYtMTQgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06CisJKiB0b29scy9kYnVzLW1vbml0b3IuYzoKKwlEb24ndCB1c2UgdGhlIEdMaWIgYmluZGluZ3MgaW4gZGJ1cy1tb25pdG9yIChwYXRjaCBmcm9tIFJhbGYKKwlIYWJhY2tlcikuCisJCisyMDA2LTA2LTE0ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jOgorCUFsc28gcHJpbnQgdGhlIG9iamVjdCBwYXRoIHdoZW4gb3V0cHV0dGluZyBzaWduYWxzIG9yIG1ldGhvZCBjYWxscy4KKworMjAwNi0wNi0xMyAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvc3JjL01ha2VmaWxlLmFtOiBpbnN0YWxsIHRoZSBxZGJ1cy5oIGhlYWRlci4KKwlUaGlzIGFsbG93cyBwZW9wbGUgdG8gYWN0dWFsbHkgdXNlIHRoZSBpbnN0YWxsZWQgY29kZS4KKworMjAwNi0wNi0xMiAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJRG9uJ3QgbGVhayBhIEdBcnJheSB3aGVuIGZpcmluZyBzaWduYWxzICh0aGFuayBSb2IgVGF5bG9yIGZvciByZXZpZXcpLgorCisyMDA2LTA2LTEyICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBSZWxlYXNlZCAwLjYyCisKKzIwMDYtMDYtMTIgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogUmVtb3ZlIHNwdXJpb3VzIHNlbWktY29sb25zIHRoYXQKKyAgICAgICAgYnJlYWsgcGVkYW50aWMgYnVpbGRzLiBDbG9zZXMgYnVnIDYwNDMgKHBhdGNoIGFwcHJvdmVkIGJ5CisgICAgICAgIEhhdm9jIGJhY2sgaW4gRmVicnVhcnkpLgorCisyMDA2LTA2LTEyICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9zcmMvcWRidXNpbnRlZ3JhdG9yLmNwcDogRml4IGJ1ZyBpbiBwYXJzaW5nIGFzeW5jIG1ldGhvZHMKKyAgICAgICAgdGhhdCB0b29rIGEgUURCdXNNZXNzYWdlIHBhcmFtZXRlci4KKwkqIHF0L3NyYy9xZGJ1c2J1cy5oOiBBZGQgYSBkZWZhdWx0IGZsYWcgZm9yIFJlcXVlc3ROYW1lLgorCSogcXQvdG9vbHMvZGJ1cy5jcHA6IERvbid0IHVzZSBhdXRvbWF0aWMgY2FsbCBiZWNhdXNlIHdlIG1pZ2h0CisgICAgICAgIGJlIGNhbGxpbmcgYW4gYXN5bmMgbWV0aG9kOiByZXF1ZXN0IGEgcmVwbHkuCisKKzIwMDYtMDYtMTEgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHRlc3QvcXQvKjogVXBkYXRlIHRoZSB0ZXN0Y2FzZXMsIGluY2x1ZGluZyB0ZXN0aW5nIHRoZSBuZXcKKyAgICAgICAgZnVuY3Rpb25hbGl0eSBvZiBzZW5kaW5nIG51bGwgUUJ5dGVBcnJheSBhbmQgUVN0cmluZyBvdmVyIHRoZQorICAgICAgICBidXMuIEFkZCBuZXcgaGVhZGVydGVzdCB0ZXN0IGFuZCByZXN0b3JlIHRoZSBvbGQKKyAgICAgICAgcWRidXN4bWxwYXJzZXIgdGVzdC4KKworMjAwNi0wNi0xMSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvdG9vbHMvZGJ1c2NwcDJ4bWwuY3BwOiBDb21waWxlIG9uIFdpbmRvd3MuCisJKiBxdC90b29scy9kYnVzaWRsMmNwcC5jcHA6IEFkZCBtaXNzaW5nIG5ld2xpbmUuCisKKwkqIHF0L2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcXQvZXhhbXBsZXMvY2hhdC5oOiBVc2UgVUktZ2VuZXJhdGVkIGZpbGVzIHdpdGggdGhlIHVpXyouaAorCWZvcm0uCisKKwkqIHF0L3NyYy9xZGJ1c21hcnNoYWxsLmNwcDogQWxsb3cgc2VuZGluZyBvZiBRU3RyaW5nKCkgYW5kCisJUUJ5dGVBcnJheSgpIChudWxscykgb3ZlciB0aGUgYnVzLgorCSogcXQvc3JjL3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuY3BwOiBVc2UgdGhlIGNvcnJlY3QgdmFyaWFibGUsCisJdGhlIG9uZSB0aGF0IGhhcyB0aGUgc2lnbmF0dXJlIHN1ZmZpeCBzdHJpcHBlZC4KKwkqIHF0L3NyYy9xZGJ1c3JlcGx5Lmg6IE1ha2Ugc29tZSBtZXRob2RzIGNvbnN0LgorCisyMDA2LTA2LTA5ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJUGF0Y2ggZnJvbSBUaW1vIEhvZW5pZyA8dGhvZW5pZ0BzdXNlLmRlPi4KKworCSogcXQvZGJ1cy9NYWtlZmlsZS5hbTogTmV3IGZpbGUuICBGaXggIm1ha2UgZGlzdCIsIGFkZCBhbGwgaGVhZGVycworCXJlcXVpcmVkIGR1cmluZyBidWlsZCB0byBFWFRSQV9ESVNULgorCSogcXQvc3JjL01ha2VmaWxlLmFtOiBGaXggIm1ha2UgZGlzdCIsIGFkZCAncWRidXMuaCcgdG8gRVhUUkFfRElTVC4KKwkqIHF0L01ha2VmaWxlLmFtOiBGaXggIm1ha2UgZGlzdCIsIGFkZCAnZGJ1cycgdG8gRElTVF9TVUJESVJTLgorCSogY29uZmlndXJlLmluOiBGaXggIm1ha2UgZGlzdCIsIHRha2UgY2FyZSB0aGF0IHRoZSBNYWtlZmlsZSBmb3IKKwlxdC9kYnVzIGlzIGJlaW5nIGdlbmVyYXRlZC4KKworMjAwNi0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jOiBGaXggZWF2ZXNkcm9wcGluZyBvbiBtZXRob2QgY2FsbHMKKworMjAwNi0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6CisJQWRkIFNvbGFyaXMgY29uc29sZSBvd25lciBwYXRjaCBmcm9tIEFydGVtIEthY2hpdGNoa2luZQorCisyMDA2LTA2LTA3ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtmaWxlLmFtOgorCSogcXQvc3JjL01ha2VmaWxlLmFtOiBGaXggdGhlIEVYVFJBX0RJU1QgYWZ0ZXIgdGhlCisJcmVvcmdhbmlzYXRpb24uIFRoYW5rcyB0byBUaW1vIEhvZW5pZyBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmM6IEZpeCBvYnZpb3VzIGxlYWsgb2YgR0FycmF5IGluIGV2ZXJ5CisJICBjYWxsIHRvIGRidXNfZ190eXBlX2dldF9zdHJ1Y3QuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBGaXggdGhlIGZhaWxpbmcgdGVzdCB3aGVyZSBzdGF0aWMgc3RyaW5nCisJICBwb2ludGVycyB3ZXJlIHB1dCBpbnRvIGEgR1B0ckFycmF5LWJhc2VkIHNwZWNpYWxpc2VkIGNvbGxlY3Rpb24sIGFuZAorCSAgdGhlbiBmcmVlZCBhbG9uZyB3aXRoIHRoZSBhcnJheS4gR1ZhbHVlcyB3aGljaCB5b3UgYWRkIGludG8KKwkgIGNvbGxlY3Rpb25zIG9yIG1hcHMgd2hpY2ggaGF2ZSB0aGUgTk9DT1BZIGZsYWcgc2V0IGFyZSBhc3N1bWVkIHRvIG5vdAorCSAgYmVsb25nIHRvIHRoZSBjYWxsZXIsIHNvIHJhdGhlciB0aGFuIHRoZSBleGlzdGluZyBwb2ludGVyLXN0ZWFsaW5nCisJICBzZW1hbnRpY3MsIHRoZXkgYXJlIGNvcGllZCBpbnN0ZWFkLiBHaXZlbiB0aGF0IHRoZSBtYWluIGNvbnN1bWVycyBvZgorCSAgdGhpcyBhYnN0cmFjdGlvbiBhcmUgdGhlIGJpbmRpbmdzIHRoZW1zZWx2ZXMsIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcworCSAgdG9vIGJhZCwgYnV0IG90aGVycyBzaG91bGQgd2F0Y2ggdGhlaXIgY2hvaWNlIG9mIHRha2UgdnMgc2V0X3N0YXRpYy4KKworMjAwNi0wNi0wNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmM6IFNwb3R0ZWQgYSB3YXJuaW5nIGFib3V0IHRoZSByZXR1cm4gdmFsdWUKKwkgIG9mIGdfc2xpc3RfcHJlcGVuZCBub3QgYmVpbmcgdXNlZC4gRml4ZWQgY29weWluZyBvZiBzbGlzdC1iYXNlZAorCSAgc3BlY2lhbGlzZWQgY29sbGVjdGlvbnMsIHRoZW4gd3JvdGUgYSB0ZXN0IGNhc2UgYW5kIGZvdW5kIHRoYXQgaXQgd2FzCisJICBhbGwgYnJva2VuLiBXZW50IG9uIHRvIGZpeCBpdGVyYXRpbmcgYW5kIGFwcGVuZGluZyB0b28uIEdvb2QgdGhpbmcKKwkgIG5vYm9keSB1c2VzIHRoaXMgY29kZSB5ZXQuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBSZW1vdmUgZHVwbGljYXRlZCBjb2RlIGJ5IGhhdmluZyBhbGwgb2YKKwkgIHRoZSBpdGVyYXRvcnMgdXNlIGd2YWx1ZV90YWtlX3B0cmFycmF5X3ZhbHVlICh0aGUgR1ZhbHVlcyB0aGVtc2VsdmVzCisJICBhcmUgZGlzY2FyZGVkIHdpdGhvdXQgdW5zZXR0aW5nLCBzbyBpdCBtYWtlcyBubyBkaWZmZXJlbmNlIHdoZXRoZXIKKwkgIHdlIHRha2Ugb3Igc2V0X3N0YXRpYykuIFJlbW92ZSBjYXNlcyBmb3IgR19UWVBFX1BPSU5URVIgYmVjYXVzZQorCSAgdGhlcmUgcmVhbGx5IGlzIG5vdGhpbmcgdXNlZnVsIHdlIGNhbiBkbyB3aXRoIHRoZW0gaW4gb3VyCisJICBzcGVjaWFsaXNlZCB0eXBlcyAtIHdlICpuZWVkKiBib3hlZCBjb3B5L2ZyZWUgZnVuY3Rpb25zIGF0IHRoZSB2ZXJ5CisJICBsZWFzdC4KKworMjAwNi0wNi0wNSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1czogQWRkIGRpcmVjdG9yeS4gSSBoYWQgZm9yZ290dGVuIHRvIGFkZCB0aGlzCisJeWVzdGVyZGF5IGFmdGVyIHRoZSBtb3ZlLi4uCisKKwkqIHF0L2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcXQvZXhhbXBsZXMvZGJ1cy5jcHA6IE1vdmVkIHRvIHF0L3Rvb2xzL2RidXMuY3BwLgorCisJKiBxdC90b29scy9NYWtlZmlsZS5hbToKKwkqIHF0L3Rvb2xzL2RidXMuY3BwOiBNb3ZlZCBmcm9tIHF0L2V4YW1wbGVzL2RidXMuY3BwLgorCUFkZGVkIGZlYXR1cmUgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcy4KKwlBZGRlZCB2YWxpZGF0aW9uIG9mIHNlcnZpY2UsIG9iamVjdCBwYXRoIGFuZCBpbnRlcmZhY2UgbmFtZXMuCisKKwkqIHF0L3Rvb2xzL2RidXNpZGwyY3BwLmNwcDogVHdvIG5ldyBmZWF0dXJlczoKKwkxKSBBbGxvdyBzcGVjaWZ5aW5nIGJvdGggdGhlIGhlYWRlciBhbmQgdGhlIHNvdXJjZSBmaWxlIG5hbWVzLAorCWJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGEgY29sb24uCisJMikgRG9uJ3Qgd3JpdGUgYW4gaW50ZXJmYWNlIG91dHB1dCBpZiB0aGUgLXAgc3dpdGNoIHdhc24ndAorCWdpdmVuLCBidXQgdGhlIC1hIHdhcy4KKworCSogcXQvc3JjLyo6IEZpeCB1c2FnZSBvZiBJdGVyYXRvcnMgYW5kIENvbnN0SXRlcmF0b3JzLgorCUZpeCBzaGFkb3dpbmcgb2YgdmFyaWFibGVzIGJ5IG90aGVyIHZhcmlhYmxlcyAoLVdzaGFkb3cpLgorCUZpeCBrZXl3b3JkLWNsZWFubGluZXNzIGluIGhlYWRlcnMuCisJRml4IEFTQ0lJLWNhc3QgKFFMYXRpbjFTdHJpbmcsIFFMYXRpbjFDaGFyKS4KKwlGaXggdmFsaWRhdGlvbiBvZiBtZW1iZXIgbmFtZXMuCisJQWRkIGV4dHJhIGNoZWNraW5nIG9mIGludHJvc3BlY3Rpb24gZGF0YSBkdXJpbmcgWE1MIHBhcnNpbmcuCisJVmFyaW91cyBidWcgZml4ZXMuCisKKzIwMDYtMDYtMDQgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL3FkYnVzLmg6IFJlbW92ZSB1bm5lY2Vzc2FyeSBmaWxlLiBUaGlzIGlzIG1pcnJvcmVkIGludG8KKyAgICAgICAgcXQvZGJ1cy9xZGJ1cy5oIG5vdy4KKworMjAwNi0wNi0wNCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBNYWtlIC0tZGlzYWJsZS1xdCBhY3R1YWxseSBkbworICAgICAgICAgIHNvbWV0aGluZy4gUGF0Y2ggaW5zcGlyZWQgYnkgWmFjayBSdXNpbi4KKworMjAwNi0wNi0wNCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvOiBVcGRhdGUgdG8gU3VidmVyc2lvbiByNTQ4MDMyLgorCVRoaXMgaW5jbHVkZXMgYSBiaWcgcmVvcmdhbmlzYXRpb24gb2YgdGhlIGZpbGVzIGluc2lkZSB0aGUKKwlzdWJkaXIuCisKKzIwMDYtMDUtMzAgIFNqb2VyZCBTaW1vbnMgIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IE1ha2UgdGNwIHNvY2tldCBjb25uZWN0aW9uIGVycm9yIHNvbWV3aGF0IG1vcmUKKwljbGVhcjogIAorCSJGYWlsZWQgdG8gY29ubmVjdCB0byBzb2NrZXQgPGhvc3Q+Ojxwb3J0PiA8ZXJyb3I+IiBpbnN0ZWFkIG9mCisJIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCA8aG9zdD46IDxlcnJvcj46PHBvcnQ+IgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogRml4IGNyYXNoIHdoZW4gbm8gaG9zdCBvcHRpb24gaXMgZ2l2ZW4KKwlmb3IgYSB0Y3AgdHJhbnNwb3J0LiAKKworMjAwNi0wNS0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0Lyo6IFVwZGF0ZSB0aGUgUXREQnVzIGJpbmRpbmdzIHVwIHRvIHJldmlzaW9uIDU0NjMxMCBpbgorICAgICAgICBTdWJ2ZXJzaW9uLgorCVRoaXMgYWRkcyB0aGUgZGJ1c2NwcDJ4bWwgdG9vbCwgdGhhdCBwYXJzZXMgYSBDKysgaGVhZGVyIGFuZAorICAgICAgICBvdXRwdXRzIGEgRC1CVVMgSW50cm9zcGVjdGlvbiBYTUwuCisKKzIwMDYtMDUtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IFB1dCBpbiBhIHBpbGUgb2YgYXNzZXJ0aW9ucyB0aGF0IHRoZSBwcm94eSBuYW1lCisJaXMgbm90IE5VTEwgd2hlbiBpdCBzaG91bGRuJ3QgYmUuIEFsc28gYSBjb3VwbGUgb2YgcG9zc2libGUgZml4ZXMKKwlmb3IgIzQ2MzcgdGhvdWdoIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhlIGJ1ZyBoYXBwZW5zLCB0byBiZQorCWhvbmVzdC4uLiBhbHNvIHRoZSBvYmplY3QgY29uc3RydWN0b3IgaGFzIGFuIGFzc2VydCBuYW1lICE9IE5VTEwKKwlhbmQgdGhlIG5hbWUgaXMgb25seSBjdXJyZW50bHkgTlVMTCBmb3IgcGVlci10by1wZWVyIHByb3hpZXMgdGhhdCAKKwlJIGRvbid0IHRoaW5rIGFueW9uZSB1c2VzPyBTbyBpdCBzaG91bGQgYmUgYXNzZXJ0aW5nLgorCUFueXdheSwgZm9yIG5vdyBhdCBsZWFzdCBzZWUgaWYgd2UgZ2V0IGFuIGVhcmxpZXIgYXNzZXJ0aW9uIGZhaWx1cmUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYzogUHV0IGluIGEgY291cGxlIG9mIGFzc2VydGlvbnMgZm9yCisJYXBwYXJlbnRseSBicm9rZW4gY29kZSB0byBiZSBzdXJlIHRoZSB0ZXN0cyBmYWlsIGFuZCBzb21lb25lIAorCXdpbGwgZml4IHRoZW0uLi4KKworMjAwNi0wNS0wNyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzbWFyc2hhbGwuY3BwOiBGaXggYSBwcm9ibGVtIG9mIGRlbWFyc2hhbGxpbmcgbGlzdHMKKyAgICAgICAgYW5kIGFycmF5cyB3aGVuIHRoZXkgaGFkIGEgc2luZ2xlIGVsZW1lbnQ6IGhhc19uZXh0IHJldHVybnMKKyAgICAgICAgZmFsc2UsIGV2ZW4gYmVmb3JlIHlvdSByZWFkIHRoZSBlbGVtZW50LiBTbywgaW5zdGVhZCwgY2hlY2sKKyAgICAgICAgdGhlIGFycmF5IGxlbmd0aC4KKworMjAwNi0wNS0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzbWVzc2FnZS5jcHA6CisJKiBxdC9xZGJ1c3R5cGVoZWxwZXJfcC5oOgorCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDogZ2NjIDMuNCBkb2Vzbid0IGxpa2UgUV9GT1JFQUNIIHdoZW4KKwl0aGUgbGlzdCBpcyBhIGNvbnN0LXJlZmVyZW5jZQorCisyMDA2LTA1LTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBBZGRpbmcgb2xkIGRvYyBwYXRjaCB0aGF0IG5ldmVyIGdvdCBhcHBsaWVkCisJCisJKiBkYnVzL2J1cy5jIChkYnVzX2J1c19hZGRfbWF0Y2gpOiBBZGQgZG9jdW1lbnRhdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSBtYXRjaCBydWxlcworCSAgYW5kIHRoZSBBZGRNYXRjaCBhbmQgUmVtb3ZlTWF0Y2ggbWV0aG9kcworCisyMDA2LTA1LTAyICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1c2lkbDJjcHAuY3BwOiBUaGVyZSdzIG5vIGNhbGxBc3luYy4gVXNlIHRoZSBjb3JyZWN0CisgICAgICAgIGNhbGwgKHI1MzU1MDYpCisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RhZGFwdG9yLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RhZGFwdG9yLmg6IE1ha2UgUURCdXNBZGFwdG9yQ29ubmVjdG9yIGJlIGEKKyAgICAgICAgc2libGluZyBvZiB0aGUgUURCdXNBYnN0cmFjdEFkYXB0b3Igb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZQorICAgICAgICBwYXJlbnQuIChyNTM1ODQ4KQorCisJKiBxdC9kYnVzaWRsMmNwcC5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuaDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2VfcC5oOgorCSogcXQvcWRidXNpbnRlcmZhY2UuY3BwOiBNYWtlIHByb3BlcnRpZXMgaW4gaW50ZXJmYWNlcworICAgICAgICBhY3R1YWxseSB3b3JrLiBUaGUgY29kZSB0aGF0IHdhcyBnZW5lcmF0ZWQgd291bGQgbm90IGNvbXBpbGUsCisgICAgICAgIGR1ZSB0byBtb2MgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgZGlkIG5vdCBleGlzdC4gVGhleSBub3cKKyAgICAgICAgc2hhbGwuIChyNTM2NTcxKQorCisyMDA2LTA0LTMwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJKiBkYnVzLXF0NC0xLnBjLmluOiBBZGQgYSBwa2ctY29uZmlnIGZpbGUgZm9yIGxpYmRidXMtcXQ0LTEuCisJVGhhbmtzIHRvIEJyYWQgSGFyZHMgZm9yIHByb3ZpZGluZyB0aGUgcGF0Y2gKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDogVGhlcmUncyBubyBjYWxsQXN5bmMuIFVzZSB0aGUgY29ycmVjdAorICAgICAgICBjYWxsLiAocjUzNTUwNikKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBFbmhhbmNlIGVycm9yIG1lc3NhZ2VzIGFuZCB1c2UKKyAgICAgICAgUURCdXNJbnRlcmZhY2VQdHIuCisKKzIwMDYtMDQtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2ludGVyZmFjZS5oOiBSZW5hbWUgUURCdXNSZWYgdG8gUURCdXNJbnRlcmZhY2VQdHIKKyAgICAgICAgYW5kIGRpc2FibGUgdGhlIGNvcHkgb3BlcmF0b3JzLiAocjUzMzc3MiwgcjUzNDc0NikKKworCSogcXQvcWRidXNlcnJvci5oOiBSZW1vdmUgdGhlIGF1dG9tYXRpYyBjYXN0IHRvIGJvb2wuIChyNTMzOTI5KQorCisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2UuaDogQ2hhbmdlIHRoZSBkZWZhdWx0IGNhbGwgbW9kZSB0bworICAgICAgICBub3QgdXNlIHRoZSBldmVudCBsb29wLiBBZGQgY29udmVuaWVuY2UgY2FsbCgpIG1ldGhvZHMgdGhhdAorICAgICAgICB0YWtlIGEgQ2FsbE1vZGUgcGFyYW1ldGVyLiAocjUzNDA0MikKKworCSogcXQvcWRidXNjb25uZWN0aW9uLmg6IENoYW5nZSB0aGUgZGVmYXVsdCBjYWxsIG1vZGUgdG8gbm90CisgICAgICAgIHVzZSB0aGUgZXZlbnQgbG9vcC4gKHI1MzQwNDIpCisKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmg6IEFkZCBhIG1ldGhvZCB0byB0ZWxsIHVzIGlmIHRoZQorCWludGVyZmFjZSBpcyB2YWxpZCAoc2luY2Ugd2UgZG9uJ3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyCisJYW55bW9yZSkgKHI1MzQwOTkpCisKKwkqIHF0L3FkYnVzaW50ZXJmYWNlX3AuaDogRG9uJ3QgY3Jhc2ggaWYgbWV0YU9iamVjdCBpcyAwCisgICAgICAgIChyNTM0MTAxKQorCisJKiBxdC9xZGJ1c2ludGVybmFsZmlsdGVycy5jcHA6IERlY291cGxlIHRoZSBpbnRyb3NwZWN0aW9uCisgICAgICAgIGZ1bmN0aW9uIGluIHR3byBzbyB0YWh0IHdlIGdldCB0aGUgY2hhbmNlIHRvIGludHJvc3BlY3QKKyAgICAgICAgd2l0aG91dCBoYXZpbmcgYSBRREJ1c01lc3NhZ2UgKHI1MzQxMDIpCisKKwkqIHF0L3FkYnVzYnVzLmg6CisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb24uY3BwOgorCSogcXQvcWRidXNjb25uZWN0aW9uX3AuaDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IEtlZXAgYSBsaXN0IG9mIG91ciBvd24gbmFtZXMgdG8KKyAgICAgICAgYXZvaWQgYSByb3VuZC10cmlwIHRvIHRoZSBzZXJ2ZXIgd2hlbiBhdHRlbXB0aW5nIHRvIGludHJvc3BlY3QKKyAgICAgICAgb25lIG9mIG91ciBvd24gb2JqZWN0cy4gQWxzbyBtYWtlIHN1cmUgdGhlIGZpbHRlciBmdW5jdGlvbnMKKyAgICAgICAgbWF0Y2ggdGhlIGVtcHR5IGludGVyZmFjZSBhcyB3ZWxsLiAocjUzNDEwOCkKKwlEb24ndCBrZWVwIHRoZSBjb25uZWN0aW9uIG5hbWVzLiBJbnN0ZWFkLCB0cnVzdCB0aGUgdW5pcXVlCisgICAgICAgIGNvbm5lY3Rpb24gbmFtZSAocjUzNDExMSkKKwlSZW1vdmUgZXZlbnQgbG9vcCB1c2FnZSAocjUzNDExMikKKworMjAwNi0wNC0yOSAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IEZpeCBhc3NlcnRpb24gZmFpbHVyZSBzcG90dGVkIGJ5CisJQnJhZCBIYXJkcy4KKworMjAwNi0wNC0yOCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IEZpeCBwcm9wZXJ0aWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgZ2l2ZW4gaW4KKwlhbnkgb3JkZXIsIG1ha2luZyBpdCBlYXNpZXIgZm9yIHBlb3BsZSB3aG8gaW5oZXJpdCBmcm9tIHRoaXMKKwlvYmplY3QuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBQYXRjaCBmcm9tIEpha3ViIFN0YWNob3dza2kgdG8gZml4IGxlYWtpbmcKKwlvZiBtZW1vcnkgZnJvbSB3aXRoaW4gcG9pbnRlciBhcnJheXMgYW5kIGxpc3RzLiBGaXhlcyBidWcgIzYzMDAuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBQYXRjaCBmcm9tIEpha3ViIFN0YWNob3dza2kgdG8gZml4IGEgbGVhayBpbgorCWdlbmVyYXRpbmcgc3RydWN0IHNpZ25hdHVyZXMuIEZpeGVzIGJ1ZyAjNjA4My4KKworMjAwNi0wNC0yOCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBxdC9NYWtlZmlsZS5hbTogVHdlYWsgQ0xFQU5GSUxFUyBmcm9tIHFkYnVzY29ubmVjdGlvbi5tb2MKKwl0byBxZGJ1c2Nvbm5lY3Rpb25fcC5tb2MuCisKKzIwMDYtMDQtMjQgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSRUFETUUsIElOU1RBTEw6IERvYyBmaXhlcworCVBhdGNoIGZyb20gQnJhZCBIYXJkcyA8YnJhZGggYXQgZnJvZ21vdXRoLm5ldD4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBVc2UgdGhlIG5ldyBtZXJnZWQtaW50ZXJmYWNlIG1vZGUgZm9yCisJdGhlIGR5bmFtaWMgbWV0YSBvYmplY3QuIE5vIG5lZWQgdG8gZ3Vlc3Mgd2hpY2ggaW50ZXJmYWNlIHRvCisJY2FsbC4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzY29ubmVjdGlvbl9wLmg6CisJKiBxdC9xZGJ1c21ldGFvYmplY3QuY3BwOgorCSogcXQvcWRidXNtZXRhb2JqZWN0X3AuaDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IFVzZSB0aGUgbmV3IG1lcmdlZC1pbnRlcmZhY2UgbW9kZQorCWZvciB0aGUgZHluYW1pYyBtZXRhIG9iamVjdC4gTm8gbmVlZCB0byBndWVzcyB3aGljaAorCWludGVyZmFjZSB0byBjYWxsLgorCSogcXQvcWRidXNhYnN0cmFjdGludGVyZmFjZV9wLmg6CisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb24uY3BwOgorCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmg6IE1ha2UgZmluZEludGVyZmFjZSBhbHdheXMgcmV0dXJuIGEgbm9uLW51bGwgcG9pbnRlci4KKwlBZGQgYSBRREJ1c1JlZiB0aGF0IGxvb2tzIGFuZCBiZWhhdmVzIGxpa2UgRENPUFJlZi4KKworMjAwNi0wNC0yMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IEludGVyZmFjZXMgYXJlIG9wdGlvbmFsIGluIG1ldGhvZAorICAgICAgICBjYWxscywgc28gZG9uJ3QgZ2l2ZSB1cCBpZiB0aGUgaW50ZXJmYWNlIHBhcmFtZXRlciBpcyBOVUxMLgorCVBhdGNoIHJldmlld2VkIGJ5IEhhdm9jIFBlbm5pbmd0b24uCisKKzIwMDYtMDQtMjMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c3JlcGx5Lmg6IEFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKyAgICAgICAgICAocjUzMjYyNSkKKwkqIHF0L3FkYnVzdHlwZWhlbHBlcl9wLmg6IFVzZSBhIGNsZWFuIG5hbWVzcGFjZTogbm8gZm9yZWFjaCgpCisgICAgICAgICAgaW4gcHVibGljIGhlYWRlcnMgKHI1MzI5NTIpCisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDoKKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2VfcC5oOiBBZGQgdGhlIEF1dG9EZXRlY3QgbW9kZSBhbmQKKyAgICAgICAgICBtYWtlIGl0IHRoZSBkZWZhdWx0IChyNTMyOTUxKQorCisyMDA2LTA0LTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBGaXggYXNzZXJ0cworCVBhdGNoIGZyb20gVGltIE1vbG9uZXkgPHQubW9sb25leSBhdCB2ZXJpem9uLm5ldD4KKworMjAwNi0wNC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzLCBtb25vL01lc3NhZ2UuY3M6IENoZWNrIFRhcmdldCB0eXBlCisJUGF0Y2ggZnJvbSBBYXJvbiBCb2Nrb3ZlciAoYWJvY2tvdmVyIGF0IG5vdmVsbC5jb20pCisKKzIwMDYtMDQtMTMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBJTlNUQUxMOiBmaW5lLXR1bmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIFF0NCBiaW5kaW5nLgorCisyMDA2LTA0LTE2ICBEYW5pZWwgUC4gQmVycmFuZ2UgIDxkYW5AYmVycmFuZ2UuY29tPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYzogQWRkZWQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgb2YgYWxsIAorCSAgcmVtYWluaW5nIGRhdGEgdHlwZXMuIEZpeGVkIGxvZ2ljIGZvciBpbmRlbnRhdGlvbiBvZiBjb21wb3VuZAorCSAgZGF0YSB0eXBlcy4KKwkKKzIwMDYtMDQtMTUgIERhbmllbCBQLiBCZXJyYW5nZSAgPGRhbkBiZXJyYW5nZS5jb20+CisKKwkqIElOU1RBTEw6IGZpbGwgb3V0IGNvbnRlbnQgb2YgZmlsZSBwcm92aWRpbmcgREJ1cyBzcGVjaWZpYworCSAgYnVpbGQgaW5zdGFsbGF0aW9ucywgZm9sbG93ZWQgYnkgZ2VuZXJpYyBBdXRvKiBJTlNUQUxMIGZpbGUKKwkgIGNvbnRlbnQKKwkKKzIwMDYtMDQtMTMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBXb3JrIGFyb3VuZCBnKysgMy4zIGJ1Zy4KKwkgIFBhdGNoIGJ5IFN0ZWZhbiBFaWxlcnMuIChyNTI5NTM3KQorCisyMDA2LTA0LTEzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlcm5hbGZpbHRlcnMuY3BwOiBEb24ndCBzaG93IHRoZSBwYXJlbnQncworICAJICBjb250ZW50cyAocjUyODIwOCkKKworMjAwNi0wNC0xMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L01ha2VmaWxlLmFtOiBmaXggdGhlIGRlcGVuZGVuY3kgZm9yCisgICAgICAgICAgcWRidXNjb25uZWN0aW9uX3AubW9jLiBJdCdzIGluY2x1ZGVkIGluIHFkYnVzaW50ZWdyYXRvci5jcHAsCisJICBub3QgaW4gcWRidXNjb25uZWN0aW9uLmNwcC4KKwkgIFRoYW5rcyB0byBKYWt1YiBTdGFjaG93c2tpIDxzdGFjaG93c2tpQGh5cGFpci5uZXQ+IGZvcgorICAgICAgICAgIHNwb3R0aW5nIHRoaXMuCisKKzIwMDYtMDQtMTAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9leGFtcGxlcy9saXN0bmFtZXMuY3BwOgorCSogcXQvZXhhbXBsZXMvTWFrZWZpbGUuYW06IFRocmVlIHdheXMgdG8gbGlzdCB0aGUgbmFtZXMgb24gdGhlCisJICBidXMuCisKKzIwMDYtMDQtMTAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiB0ZXN0L3F0L3RzdF9oYWwuY3BwOiBSZW1vdmUgdGhlIHdhaXRpbmcsIHNpbmNlIGl0J3Mgbm90CisgICAgICAgICAgbmVlZGVkIGFueW1vcmUuIFJlcXVpcmVzIFF0IDQuMS4zIHRvIHdvcmsgcHJvcGVybHkuIChyNTI4MTQ4KQorCisyMDA2LTA0LTEwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCU1lcmdlIGZyb20gU3VidmVyc2lvbjoKKwkqIHF0L3F0LWRidXMucWRvY2NvbmY6IFVwZGF0ZSBUcm9sbHRlY2gncyB3ZWJwYWdlIGxpbmsgdG8KKwkgIHNvbWV0aGluZyB0aGF0IGV4aXN0cyAocjUyNjMxNSkKKwkqIHF0L3FkYnVzaW50ZXJuYWxmaWx0ZXJzLmNwcDogQ29ycmVjdGx5IGRldGVjdCBub24tc2NyaXB0YWJsZQorCSAgc2xvdHMvc2lnbmFscyAocjUyNjMxNikKKwkqIHF0L3FkYnVzaW50ZXJuYWxmaWx0ZXJzLmNwcDogRml4IHRoZSBzZXRQcm9wZXJ0eSBjYWxsIGFuZAorCSAgYWxzbyByZXR1cm4gYW4gdW5rbm93bi1tZXRob2QgZXJyb3IgaWYgdGhlIHBhcmFtZXRlcnMgZG9uJ3QKKwkgIG1hdGNoIGZvciBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLiAocjUyNjg0MikKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBBbGxvdyBwYXNzaW5nIG9mIFFWYXJpYW50cyAocjUyNjg0MykKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IFJlc3RvcmUgdGhlIHByb3BlciBvcmRlciBvZgorCSAgZGVsaXZlcnk6IGRvbid0IG1ha2UgbWV0aG9kIHJldHVybnMgYmUgZGVsaXZlcmVkIG9uIHByaW9yaXR5CisJICAocjUyODE1MCkKKworMjAwNi0wMy0yOCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiBxdC9NYWtlZmlsZS5hbTogYWRkIHF0L2V4YW1wbGVzCisJKiBxdC9leGFtcGxlczogQWRkIFF0REJ1cyBleGFtcGxlIHByb2dyYW1zOgorCSAgLSBoZWxsbzogSGVsbG8sIFdvcmxkCisJICAtIHBpbmc6IFNpbXBsZSBtZXRob2QtY2FsbGluZyBwcm9ncmFtCisJICAtIHBvbmc6IFNpbXBsZSBvYmplY3QtZXhwb3J0aW5nIHByb2dyYW0gKG5vdCB1c2luZyBhZGFwdG9ycykKKwkgIC0gY29tcGxleHBpbmc6IEludGVyYWN0aXZlIG1ldGhvZC1jYWxsaW5nIHByb2dyYW0gCisJCShhbHNvIGdldHMgYW5kIHNldHMgcHJvcGVydGllcykuCisJICAtIGNvbXBsZXhwb25nOiBTYW1wbGUgcHJvZ3JhbSBleHBvcnRpbmcgbWV0aG9kcywgc2lnbmFscyBhbmQKKwkJcHJvcGVydGllcywgdXNpbmcgYWRhcHRvcnMuCisJICAtIGRidXM6IFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGdlbmVyaWMgbWV0aG9kLWNhbGxpbmcKKwkJcHJvZ3JhbSwgc2ltaWxhciB0byAnZGJ1cy1zZW5kJywgYnV0IHdpdGggc2VtYW50aWNzCisJCXNpbWlsYXIgdG8gJ2Rjb3AnLgorCSAgLSBjaGF0OiBTaW1wbGlzdGljIGNoYXQgcHJvZ3JhbSwgaW1wbGVtZW50ZWQgdXNpbmcgc2lnbmFscworCQlhbmQgdGhlIHN5c3RlbSBidXMuIExvb2tzIGxpa2UgSVJDLgorCisyMDA2LTAzLTI4ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEZXRlY3QgUXRHdWkgKG5lY2Vzc2FyeSBmb3Igb25lIG9mIHRoZQorICAgICAgICAgIGV4YW1wbGUgcHJvZ3JhbXMpLiBOb3RlOiB0aGlzIGluY3JlYXNlcyB0aGUgbWluaW11bSByZXF1aXJlZAorICAgICAgICAgIHZlcnNpb24gb2YgUXQgdG8gNC4xLjMuCisKKzIwMDYtMDMtMjggIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiB0ZXN0L3F0Lyo6IFN5bmMgd2l0aCBLREUgU3VidmVyc2lvbiByZXZpc2lvbiA1MjM2NDcuCisgICAgICAgIFVwZGF0ZSB0aGUgdGVzdGNhc2VzIHRvIHRoZSBuZXcgQVBJLiBSZW1vdmUgdGVzdGNhc2VzIGZvcgorICAgICAgICBjbGFzc2VzIHRoYXQgYXJlIG5vIGxvbmdlciBwdWJsaWMgb3IgaGF2ZSBiZWVuIHJlbW92ZWQuCisKKzIwMDYtMDMtMjggIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC8qOiAKKwkqIGRidXMvcWRidXMuaDogU3luYyB3aXRoIEtERSBTdWJ2ZXJzaW9uIHJldmlzaW9uCisJNTIzNjQ3LiBIb3BlZnVsbHksIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCBvZiB0aGUKKwlzb3VyY2UtaW5jb21wYXRpYmxlIGNoYW5nZXMuIERvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQ7CisJc3VwcG9ydCBmb3IgUUxpc3Q8YmFzaWMtdHlwZXM+IGhhcyBiZWVuIGFkZGVkOyBRREJ1c09iamVjdCBpcworCWdvbmU7IFFEQnVzKEFic3RyYWN0KUludGVyZmFjZSBpcyBub3cgYSBRT2JqZWN0IHdpdGgKKwlhdXRvLWdlbmVyYXRlZCBtZXRhLW9iamVjdDsgUURCdXNJbnRyb3NwZWN0aW9uIGlzIG1hcmtlZAorCXByaXZhdGUsIHNpbmNlIFFNZXRhT2JqZWN0IGNhbiBiZSB1c2VkIG5vdzsgbG90cyBvZiBidWdmaXhlcy4KKworMjAwNi0wMy0xNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gTWlsb3N6IERlcmV6eW5za2kgPGludGVybmFsZXJyb3IgYXQgZ21haWwuY29tPgorCQorCSogY29uZmlndXJlLmluOgorCU91dHB1dCB0aGUgc2VydmljZSBkaXJlY3RvcnkgaW4gdGhlIGNvbmZpZ3VyZSBzdW1tYXJ5CisKKwkqIGRidXMtMS5wYy5pbjoKKwlBZGQgc2Vzc2lvbl9idXNfc2VydmljZXNfZGlyCisKKzIwMDYtMDMtMTAgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmM6CisJQWRkIHN1cHBvcnQgZm9yIG9iamVjdCBwYXRocyBhbmQgc2lnbmF0dXJlcy4KKworMjAwNi0wMy0wNiAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBidXMvYnVzLmM6IChidXNfY29udGV4dF9yZWxvYWRfY29uZmlnKTogRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgb24KKwljb25maWcgcmVsb2FkLgorCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IEFsc28gbm90ZSB0aGF0IFNJR0hVUCBmbHVzaGVzIHRoZSB1c2VyL2dyb3VwCisJaW5mb3JtYXRpb24gY2FjaGVzCisJKiBkYnVzL2RidXMtaGFzaC5jOiAoX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKTogCisJKiBkYnVzL2RidXMtaGFzaC5oOiBBZGQgZnVuY3Rpb24gdG8gcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gYSBoYXNoIHRhYmxlCisJKiBkYnVzL2RidXMtdXNlcmRiLmM6IChfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoKToKKwkqIGRidXMvZGJ1cy11c2VyZGIuaDogQWRkIGZ1bmN0aW9uIHRvIGZsdXNoIGFsbCB1c2VyL2dyb3VwIGluZm9ybWF0aW9uCisJY2FjaGVzLgorCisyMDA2LTAzLTA2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZGJ1c2lkbDJjcHAuY3BwOgorCSogcXQvTWFrZWZpbGUuYW06IGFkZCB0aGUgZGJ1c2lkbDJjcHAgdG9vbCwgdGhlIHJlcGxhY2VtZW50CisJZm9yIGRjb3BpZGwyY3BwLCBmb3VuZCBpbiB0aGUgS0RFIGluc3RhbGxhdGlvbnMgKG9yIHRoZSBtb3JlCisJbW9kZXJuIGthbHlwdHVzKTogZ2VuZXJhdGUgUXQ0IEMrKyBjb2RlIGZvciB0aGUgaW5wdXQgWE1MCisJaW50cm9zcGVjdGlvbi4gQ3VycmVudGx5IG5vIElETCBwYXJzaW5nLgorCisyMDA2LTAzLTA2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogdGVzdC9xdC8qOiBVcGRhdGUgdGhlIHNlbGYtdGVzdHMuCisKKzIwMDYtMDMtMDYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC8qOiAKKwkqIGRidXMvcWRidXMuaDogU3luYyB3aXRoIEtERSBTdWJ2ZXJzaW9uIHJldmlzaW9uIDUxNjIzNy4gVGhpcworCXJlcHJlc2VudHMgdGhlIGZpcnN0IGZlYXR1cmUtY29tcGxldGUgdmVyc2lvbiBvZiB0aGUgUXQ0CisJYmluZGluZ3Mgc2luY2UgSSB0b29rIG92ZSBtYWludGFpbmVyc2hpcC4KKworMjAwNi0wMy0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L0RveHlmaWxlOiBBZGRpbmcgYSBEb3h5ZmlsZSBmb3IgdGhlIFF0NCBiaW5kaW5ncworICAgICAgICBkaXIuIFRoaXMgaXMgQysrLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIERCdXMgb25lcy4KKworMjAwNi0wMy0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBSZW1vdmUgcmVmcmVuY2UgdG8gc3lzL2NkZWZzLmgKKwkoUGF0Y2ggZnJvbSBBcnRlbSBLYWNoaXRjaGtpbmUgPEFydGVtLkthY2hpdGNoa2luIGF0IFN1bi5DT00+KQorCisyMDA2LTAzLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAKKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOgorCUNoZWNrIHRvIHNlZSBpZiBvdXIgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgb2ZmIHRoZSBjb25uZWN0aW9uCisJYnkgYW5vdGhlciBibG9ja2luZyBwZW5kaW5nIGNhbGwgYmVmb3JlIHdlIGJsb2NrIGluIHBvbGwuCisJKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkKToKKwlDb2RlIHRha2VuIGZyb20gX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwgLSBjaGVja3MgZm9yCisJYW4gYWxyZWFkeSByZWFkIHJlcGx5IGFuZCB1cGRhdGVzIHRoZSBkaXNwYXRjaCBpZiB0aGVyZSBpcyBvbmUuCisKKwkqIHRlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmM6CisJTmV3IHRlc3QgZm9yIG1ha2luZyBzdXJlIHdlIGRvbid0IGdldCBzdHVjayBwb2xsaW5nIGEgCisJZGJ1cyBjb25uZWN0aW9uIHdoaWNoIGhhcyBubyBkYXRhIG9uIHRoZSBzb2NrZXQgd2hlbgorCWJsb2NraW5nIG91dCBvZiBvcmRlciBvbiB0d28gb3IgbW9yZSBwZW5kaW5nIGNhbGxzLgorCisyMDA2LTAyLTI4ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtlZmlsZS5hbTogUGF0Y2ggYnkgU2pvZXJkIFNpbW9ucy4gTW9yZSAubW9jIGlzc3VlczoKKyAgICAgICAgbWFrZS9hdXRvbWFrZSBkb24ndCBkZXRlY3QgdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IHRoZSBzYW1lCisgICAgICAgIC5sbyBmaWxlIGlmIEkgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXMuCisKKzIwMDYtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZGJ1cy1kYWVtb24uMS5pbjogaW1wcm92ZSB0aGUgbGFuZ3VhZ2UgaW4gYSBjb3VwbGUgc3BvdHMgSSBub3RpY2VkCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW50ZXJuYWxfYnVzX2dldCk6IGluIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZQorCXNlc3Npb24gYnVzIHZhcmlhYmxlIGlzIHVuc2V0LCBzdWdnZXN0ICJtYW4gZGJ1cy1sYXVuY2giIGFuZCAibWFuCisJZGJ1cy1kYWVtb24iIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGZpeCB0aGUgcHJvYmxlbQorCisyMDA2LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jICh1c2FnZSk6IGZpeCB1cCB0aGUgdXNhZ2UgbWVzc2FnZSwgc29tZW9uZQorCXNob3VsZCBtYWtlIHRoaXMgdGhpbmcgdXNlIHRoZSBuZXcgZ2xpYiBvcHRpb25zIHBhcnNlcgorCisyMDA2LTAyLTI1ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtlZmlsZS5hbTogUGF0Y2ggYnkgU2pvZXJkIFNpbW9ucy4gRml4IHRoZSBwYXRoIHRvIHRoZQorICAgICAgICAubG8gZmlsZXMgdGFraW5nIG1vYyBzb3VyY2VzLgorCisyMDA2LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLmgsIGRidXMvTWFrZWZpbGUuYW06IGFkZCBkYnVzLXNpZ25hdHVyZS5oIHRvIGRidXMuaAorCWFuZCBpbnN0YWxsIGl0IGFzIGEgcHVibGljIGhlYWRlcgorCisyMDA2LTAyLTI0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAwLjYxCisKKzIwMDYtMDItMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwcm94aWVzLnB5OiBGaXggdGhlIGNhbGxjaGFpbgorCisyMDA2LTAyLTI0ICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBmcm9tIFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBkZWJpYW4ub3JnPjoJCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfZ3JvdXBfaW5mb19mcmVlKTogTW92ZWQgdG8gCisJZGJ1cy9kYnVzLXN5c2RlcHMuYworCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQpOiBEb24ndAorCWNhbGwgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCB3aGljaCBjYXVzZXMgaW5maW5pdGUgbG9vcCwKKwljb3JyZWN0bHkgY2FsbCBfZGJ1c19ncm91cF9pbmZvX2ZyZWUKKworMjAwNi0wMi0yMCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlcmZhY2VfcC5oOgorCSogcXQvcWRidXNpbnRlcmZhY2UuY3BwOiBVc2UgdGhlIHN0YW5kYXJkCisJb3JnLmZyZWVkZXNrdG9wLkRCdXMuTWV0aG9kLk5vUmVwbHkgYW5ub3RhdGlvbiBmb3IgdGhlICJhc3luYyIKKwljYWxscyBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZSBmb3IgdXMuCisKKwkqIHF0L3FkYnVzY29ubmVjdGlvbl9wLmg6CisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBSZW1vdmUgZGVidWdnaW5nIGNvZGUuCisKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6CisJKiBxdC9xZGJ1c21lc3NhZ2UuY3BwOgorCSogcXQvcWRidXNtZXNzYWdlX3AuaDoKKwkqIHF0L3FkYnVzbWVzc2FnZS5oOiBDaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiBhdXRvbWF0aWMKKwlyZXBseS1zZW5kaW5nOiBub3cgYSByZXBseSBpcyBhbHdheXMgc2VudCwgdW5sZXNzIHRoZSBjYWxsZXIKKwlkaWRuJ3QgcmVxdWVzdCBvbmUgb3IgaWYgdGhlIHVzZXIgc2xvdCBoYXMgYWxyZWFkeSBzZW50IG9uZS4KKworMjAwNi0wMi0xNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBjb25maWd1cmUuaW46IFBhdGNoIGZyb20gRGViaWFuIHBhY2thZ2VzIGJ5IFNqb2VyZCBTaW1vbnMKKwk8c2pvZXJkQGRlYmlhbi5vcmc+IHRvIGFkZCAtLXdpdGgtcXQtbW9jIGFuZCAtLXdpdGgtcXQzLW1vYworCWFyZ3VtZW50cyBzbyBpdCdzIHBvc3NpYmxlIHRvIGJ1aWxkIGJvdGggYmluZGluZ3MgaW4gdGhlCisJc2FtZSB0cmVlLgorCisJKiBxdC9NYWtlZmlsZS5hbTogRml4IHRydW5jYXRlZCB2YWx1ZSBzbyB0aGF0IG1ha2UgZGlzdCB3b3Jrcy4KKworMjAwNi0wMi0xNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogUGF0Y2ggZnJvbSBCcmFkIEhhcmRzCisJPGJyYWRoQGZyb2dtb3V0aC5uZXQ+IHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gYXV0b2NvbmYgMS45IGJ5CisJaW1wcm92aW5nIHF1b3RpbmcsIHJlLW9yZGVyaW5nIGEgZmV3IGNoZWNrcywgYW5kIGEgZmV3IG90aGVyCisJYWVzdGhldGljIHRpZHktdXBzLgorCisyMDA2LTAyLTE2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSk6CisJUGF0Y2ggZnJvbSBSb2IgVGF5bG9yIDxyb2IudGF5bG9yQGNvbGxhYm9yYS5jby51az4gdG8gY29ycmVjdCBhIGJvZ3VzCisJYXNzZXJ0aW9uIHRoYXQgdGhlIG5leHQgZWxlbWVudCB0byByZWFkIGZyb20gdGhlIGl0ZXIgaXMgZml4ZWQgaW4KKwlzaXplLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSB3aGVuIHlvdSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaXRlciwKKwliZWNhdXNlIHRoZSBuZXh0IGVsZW1lbnQgdHlwZSBpcyBJTlZBTElELgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbik6IENvcnJlY3QgYQorCWEgYm9ndXMgYXNzZXJ0IHdoaWNoIG1lYW5zIHRoYXQgeW91IG1heSBub3QgaW5pdGlhbGlzZSBhIDAtbGVuZ3RoCisJc3RyaW5nIHVubGVzcyB5b3UgcHJvdmlkZSBhIG5vbi1OVUxMIHBvaW50ZXIuIFRoaXMgcHJldmVudGVkCisJeW91IGZyb20gbWFyc2hhbGxpbmcgbWVzc2FnZXMgY29udGFpbmluZyB6ZXJvLWxlbmd0aCBhcnJheXMgaW4KKwlzb21lIGNhc2VzLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRlbWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5KTogQW5vdGhlciBwYXRjaAorCWZyb20gUm9iIHRvIGNvcnJlY3QgYm9ndXMgYXNzZXJ0cyB3aGVuIHRyeWluZyB0byBkZW1hcnNoYWwgYW4KKwlhcnJheSBhbmQgZ2V0X2ZpeGVkX2FycmF5IGdvdCB5b3UgMCBlbGVtZW50cy4gQXBwZW5kIG5vdGhpbmcgdG8KKwl0aGUgR0FycmF5IGluIHRoaXMgY2FzZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBhIHRlc3QgY2FzZSBmb3Igcm91bmQtdHJpcHBpbmcKKwlhbiBlbXB0eSBhcnJheSB2aWEgdGhlIGdsaWIgYmluZGluZ3MuIFdpdGhvdXQgYWxsIG9mIHRoZSBhYm92ZQorCXBhdGNoZXMsIHRoaXMgbmV3IHRlc3QgZmFpbHMuCisKKzIwMDYtMDItMTYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IE1ha2UgdGhlIHByZXZpb3VzIGNvbW1pdCBjb21waWxlLgorCisJKiBweXRob24vX2RidXMucHksIHB5dGhvbi9tYXRjaHJ1bGVzLnB5OiBQYXRjaCBmcm9tIE9sZSBBbmRyZQorCVJhdm5hYXMgPG9sZS5hbmRyZS5yYXZuYWFzQGNvbGxhYm9yYS5jby51az4gdG8gYWxsb3cgeW91IHRvCisJc3BlY2lmeSBzZW5kZXJfa2V5d29yZD0iZm9vIiwgcGF0aF9rZXl3b3JkPSJiYXIiIHdoZW4gYWRkaW5nCisJYSBzaWduYWwgbGlzdGVuZXIsIHNvIHRoYXQgeW91IGNhbiBiaW5kIHRvIHNpZ25hbHMgZ2VuZXJpY2FsbHkKKwlidXQgc3RpbGwgZG8gc29tZXRoaW5nIHVzZWZ1bCBpbiB5b3VyIGNhbGxiYWNrLgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IERlbWFyc2hhbCB0aGUgYnl0ZSB0eXBlIGFzIHVuc2lnbmVkCisJY2hhcnMgc28gdGhhdCB0aGV5J3JlIG5vdCBjYXN0IHRvIGNoYXJzIGFuZCBtYWRlIG5lZ2F0aXZlLiBUaGFua3MKKwl0byBKYWt1YiBTdGFjaG93c2tpIGZvciByZXBvcnRpbmcgdGhpcyBhbmQgdGVzdGluZyB0aGUgZml4LgorCisyMDA2LTAyLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdtYWluLmg6CisJKGRidXNfZ19jb25uZWN0aW9uX29wZW4pOiBuZXcgbWV0aG9kIGZvciBvcGVubmluZworCWEgY29ubmVjdGlvbiB0byBhbiBhcmJpdHJhcnkgYWRkcmVzcyBpbiB0aGUgZ2xpYiBiaW5kaW5ncworCisJKiBDaGFuZ2VMb2c6IGNoZWNraW4gbGFzdCBlbnRyeSB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgY29tbWl0ZWQKKworMjAwNi0wMi0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogRml4ZWQgc2ggc3ludGF4IG91dHB1dAorCisyMDA2LTAyLTEzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jLCBnbGliL2RidXMtZ21haW4uYywKKwlnbGliL2RidXMtZ3NpZ25hdHVyZS5jLCBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYywKKwlnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwgZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jLAorCWdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuaCwgZ2xpYi9kYnVzLWd2YWx1ZS5jOgorCVBhdGNoIGZyb20gUm9iIFRheWxvciA8cm9iLnRheWxvckBjb2xsYWJvcmEuY28udWs+IHRvIGFkZCBhIGJpZworCW1pc3NpbmcgcGllY2Ugb2YgdGhlIGdsaWIgYmluZGluZ3Mgamlnc2F3IHB1enpsZS4gVGhpcyBtb2RpZmllcworCXRoZSBleGlzdGluZyBzcGVjaWFsaXNlZCB0eXBlcyB0byBoYXZlIE4gdHlwZSBwYXJhbWV0ZXJzIChyYXRoZXIKKwl0aGFuIHRoZSBjdXJyZW50IDEgb3IgMiBmb3IgYXJyYXlzIGFuZCBkaWN0aW9uYXJpZXMgcmVzcGVjdGl2ZWx5KS4KKwlZb3UgY2FuIHRoZW4gdXNlIHRoaXMgdG8gZ2V0IGEgZ2xpYiB0eXBlIHRvIHJlcHJlc2VudCBhbnkgYXJiaXRyYXJ5CisJRC1CdXMgc3RydWN0IHR5cGUgdXNpbmcgZGJ1c19nX3R5cGVfZ2V0X3N0cnVjdC4gVGhlIG9ubHkKKwlpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSB0eXBlcyBpcyB3aXRoIEdWYWx1ZUFycmF5cyBhcyBiZWZvcmUsCisJYnV0IGl0J3Mgbm93IHBvc3NpYmxlIHRvIHN0b3JlIHRoZXNlIGluIGFycmF5cywgZW1pdCB0aGVtIGluCisJc2lnbmFscywgZXRjLgorCisyMDA2LTAyLTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmMgKGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSk6IENvcnJlY3RseQorCWRlYWwgd2l0aCBuZXN0ZWQgYXJyYXlzIChCdWcgIzU4MjMpIFBhdGNoIGJ5IFRoaWFnbyBNYWNpZWlyYSAKKwk8dGhpYWdvLm1hY2llaXJhIGF0IHRyb2xsdGVjaC5jb20+CisKKzIwMDYtMDItMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIG1vbm8vZG9jL01ha2VmaWxlLmFtOiBGaXggcGFyYWxsZWwgbWFrZSBwcm9ibGVtIHdpdGggbW9uby1kb2MKKwkoQnVnICM0MjEzKSBQYXRjaCBmcm9tIERvdWcgR29sZHN0ZWluIDxjYXJkb2UgYXQgZ2VudG9vLm9yZz4KKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSk6IE1ha2UKKwlwZW5kaW5nIHJlcGx5IGxpbWl0IG5vdCBjb21tb24gdG8gYWxsIGNvbm5lY3Rpb25zIChCdWcgIzU0MTYpCisJUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tby5oYW1hbGFpbmVuIGF0IG5va2lhLmNvbT4KKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogRml4ZWQgY3NoIHN5bnRheCBvdXRwdXQgKEJ1ZyAjNTcyMCkKKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2NqL01ha2VmaWxlLmFtOiBwb2ludCB0byBjb3JyZWN0IGphciBjb21tYW5kIChCdWcgIzQ1MjkpCisJcGF0Y2ggZnJvbSBEb3VnIEdvbGRzdGVpbiA8Y2FyZG9lIGF0IGdlbnRvby5vcmc+CisKKzIwMDYtMDItMDkgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0FyZ3VtZW50cy5jczogRml4IGEgbWFnaWMgbnVtYmVyIGluIHRoZSBtb25vIGJpbmRpbmdzCisJdGhhdCBkb2Vzbid0IHdvcmsgb24gNjQgYml0IGFyY2hlcy4gIFBhdGNoIGZyb20gUGV0ZXIgSm9oYW5zb24uCisKKzIwMDYtMDEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLltjaF06IFBhdGNoIGJhc2VkIG9uIFJpY2FyZG8gS2Vra2kncworCXBhdGNoIHRvIHVzZSBhbiBhbm5vdGF0aW9uIG9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ2xpZW50Q1N5bWJvbAorCXdoZW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50LXNpZGUgbWV0aG9kcywgaW5zdGVhZCBvZiBvdmVybG9hZGluZworCUNTeW1ib2wgd2hpY2ggYnJva2UgZXZlcnl0aGluZyBob3JyaWJseS4gTXkgYXBvbG9naWVzLgorCisyMDA2LTAxLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5bY2hdLCBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmM6IFBhdGNoCisJYnkgbWUgYW5kIFJvYiBUYXlsb3IgdG8gYWRkIGEgc2ltcGxlX2ZyZWUgZnVuY3Rpb24gdG8gRC1CdXMgbWFwCisJYW5kIGNvbGxlY3Rpb24gdHlwZXMsIHdoaWNoIGFsbG93cyB0aG9zZSB0eXBlcyB3aGljaCBjYW4gYmUgZnJlZWQKKwl3aXRoIGEgR0Rlc3Ryb3lOb3RpZnkgKHN1Y2ggYXMgR0hhc2hUYWJsZXMgYW5kIEdBcnJheXMsIGJ1dCBub3QKKwlHUHRyQXJyYXlzKSB0byBiZSBzdG9yZWQgYXMgdGhlIHZhbHVlcyBpbiBoYXNodGFibGVzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYywgdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLntjLHhtbH06CisJUGF0Y2ggYnkgUm9iIFRheWxvciB0byBhZGQgbmVzdGVkIGRpY3RzIHRvIHRoZSBnbGliIHRlc3RzIHRvIGNoZWNrCisJdGhlIGFib3ZlIGNvZGUgd29ya3MsIGFuZCBhcHBlYXJzIG5vdCB0byBsZWFrIHdoZW4gY2FsbGVkIHJlcGVhdGVkbHkuCisKKzIwMDYtMDEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkZW1hcnNoYWxfdmFsdWVhcnJheSk6IFBhdGNoIGZyb20gUm9iIFRheWxvcgorCXRvIGZyZWUgYSBELUJ1cyBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggZGJ1c19mcmVlICgpIGluc3RlYWQgb2YKKwlnX2ZyZWUgKCkuCisKKzIwMDYtMDEtMjcgIElhaW4gSG9sbWVzICA8aWFpbkBvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZGlzcG9zZSk6IFByb3RlY3QgdGhlIGRpc3Bvc2UKKwltZXRob2QgZnJvbSBiZWluZyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisKKzIwMDYtMDEtMTkgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IFBhdGNoIGZyb20gUm9iIFRheWxvcgorCTxyb2IudGF5bG9yQGNvbGxhYm9yYS5jby51az4gdG8gYWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MKKwl0byBhcnJheXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYXMgR1B0ckFycmF5cyByYXRoZXIgdGhhbiBHQXJyYXlzIChpZQorCXNpemUtdmFyaWFibGUgdGhpbmdzLCBzdWNoIGFzIHN0cmluZ3MsIG9iamVjdHMsIHN0cnVjdHMsIGV0YykuCisKKzIwMDYtMDEtMDUgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCwgZ2xpYi9kYnVzLWdwcm94eS5jOiBQYXRjaCBmcm9tIFJpY2FyZG8gS2Vra2kKKwk8cmljYXJkby5rZWtraUBtb3ZpYWwuZmk+IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaW5oZXJpdCBmcm9tCisJREJ1c0dQcm94eSwgYnkgc3BsaXR0aW5nIHRoZSBEQnVzR1Byb3h5IHN0cnVjdCBpbnRvIGEgcHVibGljIHBhcnQgYW5kCisJYSBwcml2YXRlIHBhcnQsIGFuZCBtb3ZpbmcgdGhlIHNldHRpbmcgb2YgdGhlIERCdXNHUHJveHlNYW5hZ2VyIGludG8gYQorCWNvbm5lY3Rpb24gcHJvcGVydHksIGFsbG93aW5nIHByb3BlciBHT2JqZWN0IGNvbnN0cnVjdGlvbi4KKworMjAwNi0wMS0wNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzogUGF0Y2ggZnJvbSBSaWNhcmRvIEtla2tpCisJPHJpY2FyZG8ua2Vra2lAbW92aWFsLmZpPiB0byBtYWtlIGRidXMtYmluZGluZy10b29sIGhlZWQgQyBzeW1ib2wgbmFtZQorCWFubm90YXRpb25zIHdoZW4gZ2VuZXJhdGluZyBnbGliIGNsaWVudCBiaW5kaW5ncy4KKworMjAwNS0xMi0xOSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2hhcmVkLmg6IENhbGwgaXQgc2hhcmVkIGNvbnN0YW50cyBpbnN0ZWFkIG9mIHNoYXJlZCBtYWNyb3MKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBET3h5Z2VuIG1hcmt1cCB0byBxdWlldCB3YXJuaW5ncworCisyMDA1LTEyLTE5IEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaGFyZWQuaDogYWRkIERPeHlnZW4gbWFya3VwIHRvIHF1aWV0IHdhcm5pbmdzCisKKzIwMDUtMTItMTkgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4gCisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaDogY29ycmVjdCBET3h5Z2VuIGVuZCBvZiBzZWN0aW9uIChzL31AL0B9KQorCisyMDA1LTEyLTE5ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDoKKwlEb2N1bWVudCB0aGUgR2xpYiBjbGllbnQtc2lkZSBiaW5kaW5ncywgYW5kIGxpc3QgYWxsIHBvc3NpYmxlIGFubm90YXRpb25zLgorCisyMDA1LTEyLTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2J1cy5jIChkYnVzX2J1c19yZWxlYXNlX25hbWUpOiBBZGQgZG9jdW1lbnRhdGlvbgorCisyMDA1LTEyLTA2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBzL3N1Y2Vzc2Z1bC9zdWNjZXNzZnVsLyBzbyB3ZSdyZSBhbGxvY2F0aW5nIHRvCisJYW5kIHJlYWRpbmcgZnJvbSB0aGUgc2FtZSB2YXJpYWJsZS4gT29wcy4KKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC42MAorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3F0L01ha2VmaWxlLmFtOiBidWlsZCBmcm9tIHNyY2RpcgorCisJKiBxdC9xdGNvbm5lY3Rpb24uY3BwIChyZXF1ZXN0TmFtZSk6IENoYW5nZWQgUFJPSElCSVRfUkVQTEFDRSB0byBBTExPV19SRVBMQUNFCisJTm90ZSAtIHRoaXMgY29kZSBpcyB3cm9uZyBhbmQgbmVlZHMgdG8gYmUgZml4ZWQgYnkgdGhlIFF0IGJpbmRpbmcKKwlkZXZlbG9wZXJzLiAgVGhlIGZsYWdzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGJpdGZpZWxkcyBhbmQgbm90IGVudW1zLgorCisJKiBxdC9xdGNvbm5lY3Rpb24uaDogQ2hhbmdlIFByb2hpYml0UmVwbGFjZSB0byBBbGxvd1JlcGxhY2UKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluaywgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIsIAorCSAgbGlua19hZnRlcik6IHJlbW92ZSAjaWZkZWYgREJVU19CVUlMRF9URVNUUyBzaW5jZSB3ZSB1c2UgdGhlc2UgbWV0aG9kcyAKKwkgIGluIHByb2R1Y3Rpb24gY29kZQorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSk6IEFkZCBuZXcKKwltZXRob2QgZm9yIGdldHRpbmcgbWVzc2FnZXMgb2ZmIHRoZSBidXMgaW4gdGhlIGFic2VuY2Ugb2YgYQorCW1haW5sb29wLiAgVGhpcyBtZXRob2QgaXMgbXVjaCBsaWtlIAorCWRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIGV4Y2VwdCBpdCBkb2VzIG5vdCBkaXNwYXRjaAorCXRoZSBtZXNzYWdlcyB0byBhIHJlZ2lzdGVyZWQgZmlsdGVyIGZ1bmN0aW9uLiAgSW5zdGVhZCBpdAorCWFsbG93cyBhIGRldmVsb3BlciB0byBwcm9jZXNzIG1lc3NhZ2VzIGJ5IGRpcmVjdGx5IHBvcHBpbmcKKwl0aGVtIG9mZiB0aGUgYnVzLgorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZGVza3RvcC1maWxlLmMgKHBhcnNlX2tleV92YWx1ZSk6IElnbm9yZSBsb2NhbGVzIGFsbG93aW5nIAorCXRoZSBwYXJzZXIgdG8gY29udGludWUgaW5zdGVhZCBvZiByZXR1cm5pbmcgZXJyb3IKKwkoYnVzX2Rlc2t0b3BfZmlsZV9sb2FkKTogRG8gbm90IGZyZWUgcGFyc2VyIGRhdGEgd2hlbgorCXBhcnNlX3NlY3Rpb25fc3RhcnQgb3IgcGFyc2Vfa2V5X3ZhbHVlIGZhaWxzIGJlY2F1c2UgaXQgd2FzIAorCWFscmVhZHkgZnJlZWQgYnkgcGFyc2VyX2ZyZWUgKHBhdGNoIGZyb20gQ2FybG9zIEdhcmNpYSBDYW1wb3MgIAorCTxjYXJsb3NnYyBhdCBnbm9tZS5vcmc+KQorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jLCBkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMta2V5cmluZy5jLAorCWRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jLCBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYworCWdsaWIvZGJ1cy1nbGliLXRvb2wuYywgZ2xpYi9kYnVzLWdwYXJzZXIuYywgZ2xpYi9kYnVzLWdwcm94eS5jCisJdGVzdC90ZXN0LXNlZ2ZhdWx0LmMsIHRlc3QvdGVzdC11dGlscy5jLAorCXRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jLCB0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCisJdG9vbHMvZGJ1cy1sYXVuY2guYywgdG9vbHMvZGJ1cy10cmVlLXZpZXcuYywgdG9vbHMvZGJ1cy12aWV3ZXIuYzoKKwlWYXJpb3VzIGNsZWFudXAgb2YgZGVhZCBjb2RlIGFuZCBjb21waWxlciB3YXJuaW5ncyAocGF0Y2ggZnJvbQorCUtqYXJ0YW4gTWFyYWFzIDxrbWFyYWFzIGF0IGdub21lLm9yZz4pIAorCisyMDA1LTExLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoY29ubmVjdGlvbl9zZXR1cF9hZGRfd2F0Y2gpOiBwbHVnZ2VkIGEgbGVhaworCShwYXRjaCBmcm9tIENhcmxvcyBHYXJuYWNobyBQYXJybyA8Y2FybG9zZyBhdCBnbm9tZS5vcmc+CisKKzIwMDUtMTEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBSZXBhaXIgbXkgcHJldmlvdXMgY29tbWl0IHdoaWNoIHJldmVydGVkCisJcGFydCBvZiB0aGUgcHJlY2VkaW5nIG9uZS4gT29wcy4gTWVyZ2UgcGF0Y2ggYnkgSm9oYW4gSGVkYmVyZworCTxqb2hhbi5oZWRiZXJnQG5va2lhLmNvbT4gdG8gZml4IG1hcnNoYWxsaW5nIG9mIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcworCW9uIGJpZy1lbmRpYW4gcGxhdGZvcm1zLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogQWRkIHNvbWUgMTYtYml0IGludGVnZXJzIHRvIHRoZSB0ZXN0CisJdmFsdWVzLgorCisyMDA1LTExLTI3ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNhcmxvc2djQGdub21lLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYzogQXBwZW5kIGEgR1ZhbHVlIGluc3RlYWQgb2YgYSBiYXNpYyB0eXBlIGluCisJbWV0aG9kIHJldHVybiBtZXNzYWdlIGZvciBwcm9wZXJ0eSBnZXR0ZXJzCisKKzIwMDUtMTEtMjcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBGaXggYSBidWcgd2hlcmUgZG9pbmcgYSBzdHJpY3QgYXBwZW5kCisJd2l0aCB0eXBlIHYgb2YgYW4gaW5zdGFuY2Ugb2YgZGJ1cy5WYXJpYW50KGZvbywgdHlwZT0neCcpIGNhdXNlZAorCWl0IHRvIGJlIGJveGVkIHR3aWNlIGJlZm9yZSBzZW5kaW5nIG92ZXIgdGhlIGJ1cy4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LCBweXRob24vc2VydmljZS5weSwKKwl0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogVXBkYXRlIHRoZSBjb25zdGFudHMgZm9yIHRoZSBuZXcKKwlyZXF1ZXN0X25hbWUgZmxhZ3MsIGFuZCB1cGRhdGUgY29tbWVudHMvdGVzdCBjYXNlcyBub3cgdGhhdCBxdWV1ZWluZworCWlzIHRoZSBkZWZhdWx0IGFjdGlvbi4KKworMjAwNS0xMS0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCS0gQ2hhbmdlIHZlcnNpb24gdG8gMC42MCBmb3IgaW1wZW5kaW5nIHJlbGVhc2UKKwktIHVwcGVkIHRoZSBzb25hbWVzIGJlY2F1c2Ugb2YgQUJJIGFuZCBBUEkgYnJlYWthZ2UKKworMjAwNS0xMS0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUgdG8gdGhlIGdlbmVyYXRlZAorCU1ha2VmaWxlIGxpc3QKKworCSogZGJ1cy9kYnVzLXNoYXJlZC5oICgjZGVmaW5lIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UKToKKwlOZXcgZmxhZyB3aGljaCByZXBsYWNlcyBEQlVTX05BTUVfRkxBR19QUk9ISUJJVF9SRVBMQUNFTUVOVAorCSgjZGVmaW5lIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSk6IE5ldyBmbGFnIGZvciBzcGVjaWZ5aW5nCisJbm90IHRvIHF1ZXVlIGFuIG93ZXIgaWYgaXQgY2FuJ3QgYmUgdGhlIHByaW1hcnkgb3duZXIKKworCSogYnVzL2J1cy5oOiBBZGQgbmV3IGludGVybmFsIEJ1c093bmVyIHN0cnVjdAorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKTogU2VuZCBmbGFncyAoMCBmb3IgZGVmYXVsdCkKKwl0byBidXNfcmVnaXN0cnlfZW5zdXJlIGFuZCBkb24ndCBzZXQgdGhlIHByb2hpYml0X3JlcGxhY2VtZW50IGZsYWcKKwlzaW5jZSB0aGV5IGFyZSBub3cgc2V0IHBlciBCdXNPd25lciBhbmQgbm90IHBlciBuYW1lLgorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3F1ZXVlZF9vd25lcnMpOiBidXMgbWV0aG9kIChMaXN0UXVldWVkT3duZXJzKSAKKwl0aGF0IHJldHVybnMgdGhlIGxpc3Qgb2YgY29ubmVjdGlvbnMgaW4gYSBuYW1lJ3MgY29ubmVjdGlvbiBxdWV1ZQorCQorCSogYnVzL3NlcnZpY2VzLmMgKHN0cnVjdCBCdXNTZXJ2aWNlKTogcmVtb3ZlIHByb2hpYml0X3JlcGxhY2VtZW50IGZpZWxkCisJKHN0cnVjdCBCdXNPd25lcik6IG5ldyBzdHJ1Y3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YgcXVldWVkIGNvbm5lY3Rpb25zCisJYW5kIHRoZWlyIGFzc29jaWF0ZWQgZmxhZ3MgZm9yIHRoZSBxdWV1ZQorCShzdHJ1Y3QgQnVzUmVnaXN0cnkpOiBhZGQgYSBCdXNPd25lciBtZW1vcnkgcG9vbAorCShidXNfcmVnaXN0cnlfbmV3KTogaW5pdGlhbGl6ZSB0aGUgQnVzT3duZXIgbWVtb3J5IHBvb2wKKwkoYnVzX3JlZ2lzdHJ5X3VucmVmKTogZnJlZSB0aGUgQnVzT3duZXIgbWVtb3J5IHBvb2wKKwkoX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayk6IG5ldyBpbnRlcm5hbCBtZXRob2QgZm9yCisJc2VhcmNoaW5nIHRoZSBxdWV1ZSBmb3IgYSBzcGVjaWZpYyBjb25uZWN0aW9uCisJKGJ1c19vd25lcl9zZXRfZmxhZ3MpOiBuZXcgbWV0aG9kIGZvciBhZGRpbmcgc2V0dGluZyB0aGUgZmxhZ3Mgb24gYQorCWJ1cyBvd25lcgorCShidXNfb3duZXJfbmV3KTogbmV3IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBCdXNPd25lciBvYmplY3QgZnJvbSB0aGUKKwlwb29sIGFuZCBzZXRzIGl0cyBmbGFncworCShidXNfb3duZXJfcmVmLCBidXNfb3duZXJfdW5yZWYpOiByZWYgY291bnRpbmcgZm9yIEJ1c093bmVyIG9iamVjdHMKKwkoYnVzX3JlZ2lzdHJ5X2Vuc3VyZSk6IEFkZCB0aGUgZmxhZ3MgcGFyYW1ldGVyCisJKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBTd2l0Y2ggZnJvbSB1c2luZyByYXcgY29ubmVjdGlvbnMgdG8KKwl1c2luZyB0aGUgQnVzT3duZXIgc3RydWN0CisJQWRkIG5ldyBzdGF0ZSBtYWNoaW5lIGZvciBkZWFsaW5nIHdpdGggdGhlIG5ldyBzZXQgb2YgZmxhZ3MKKwkoYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUsIHN0cnVjdCBPd25lcnNoaXBDYW5jZWxEYXRhLCAKKwljYW5jZWxfb3duZXJzaGlwLCBmcmVlX293bmVyc2hpcF9jYW5jZWxfZGF0YSwgCisJYWRkX2NhbmNlbF9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24sIHN0cnVjdCBPd25lcnNoaXBSZXN0b3JlRGF0YSwgCisJcmVzdG9yZV9vd25lcnNoaXAsIGZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSwgCisJYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uKTogU3dpdGNoIHRvIHVzaW5nIEJ1c093bmVyIAorCWluc3RlYWQgb2YgcmF3IGNvbm5lY3Rpb25zCisJKGJ1c19zZXJ2aWNlX2FkZF9vd25lcik6IEFkZCBmbGFncyBwYXJhbWV0ZXIKKwlTd2l0Y2ggdG8gdXNpbmcgQnVzT3duZXIgaW5zdGVhZCBvZiByYXcgY29ubmVjdGlvbnMKKwlBZGQgc3RhdGUgbWFjaGluZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBuZXcgc2V0IG9mIGZsYWdzCisJKGJ1c19zZXJ2aWNlX3N3YXBfb3duZXIpOiBTd2FwcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBvd25lcnMgaW4gdGhlCisJcXVldWUuICBVc2VkIHRvIG1ha2Ugc3VyZSBwcm9wZXIgc2lnbmFscyBhcmUgc2VudCB3aGVuIGEgc2VydmljZSBsb29zZXMgCisJb3IgZ2FpbnMgcHJpbWFyeSBvd25lcnNoaXAuICBXZSBuZXZlciBpbnNlcnQgYW4gb3duZXIgYXQgdGhlIHRvcCBvZiB0aGUKKwlxdWV1ZS4gIEluc3RlYWQgd2UgaW5zZXJ0IGl0IGluIHRoZSBzZWNvbmQgcG9zaXRpb24gYW5kIHRoZW4gc3dhcC4KKwkoYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyKTogUmVtb3ZlIHRoZSBvd25lciBmcm9tIHRoZSBxdWV1ZSBzZW5kaW5nCisJb3V0IHRoZSBOYW1lTG9zdCBhbmQgTmFtZU93bmVyQ2hhbmdlZCBzaWduYWxzIGlmIHRoZSB3ZSB3ZXJlIHRoZSAKKwlwcmltYXJ5IG93bmVyCisJKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uKTogTmV3IG1ldGhvZCB0aGF0IGV4dHJhY3RzCisJdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcHJpbWFyeSBvd25lcgorCShidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcik6IFJldHVybnMgdGhlIEJ1c093bmVyIGluc3RlYWQgb2YgdGhlIAorCWNvbm5lY3Rpb24KKwkoYnVzX3NlcnZpY2VfZ2V0X2FsbG93X3JlcGxhY2VtZW50KTogQ2hhbmdlZCBmcm9tIHRoZSBvbGQgCisJYnVzX3NlcnZpY2VfZ2V0X3Byb2hpYml0X3JlcGxhY2VtZW50IG1ldGhvZC4gIENoZWNrcyB0aGUgZmxhZ3Mgb2YgdGhlIAorCXByaW1hcnkgb3duZXIgYW5kIHJldHVybnMgaWYgaXQgY2FuIGJlIHJlcGxhY2VkIG9yIG5vdAorCShidXNfc2VydmljZV9zZXRfcHJvaGliaXRfcmVwbGFjZW1lbnQpOiByZW1vdmVkCisJKGJ1c19zZXJ2aWNlX2hhc19vd25lcik6IHJldHVybnMgVFJVRSBpZiBhbmQgb3duZXIgd2l0aAorCXRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBleGlzdHMgaW4gdGhlIHF1ZXVlCisJCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXF1ZV9uYW1lKTogTmV3IGhlbHBlcgorCW1ldGhvZCB0aGF0IG9ubHkgY29tcGlsZXMgaWYgdGVzdHMgYXJlIGVuYWJsZWQuICBBbGxvd3MgdXMgdG8gZ2V0IHRoZSAKKwl1bmlxdWUgbmFtZSBvZiBhIGNvbm5lY3Rpb24gc28gd2UgY2FuIGNoZWNrIGl0IGFnYWluc3QgdGhlIHF1ZXVlIHdoZW4KKwlkb2luZyByZWdyZXNzaW9uIHRlc3RzCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRlKSwKKwlidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoKSwgIAorCWJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X3NlcnZpY2Vfb3duZXIsIAorCWJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciwgCisJYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkLAorCWJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3NlbGludXhfc2VjdXJpdHlfY29udGV4dCksCisJYnVzL3NpZ25hbHMuYyAoY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyKTogCisJdXNlIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIGluc3RlYWQgb2YKKwlidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0LCAKKwlfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc29ja2V0CisJcGF0aCBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiB1c2luZyBhIGZpeGVkIGxlbmd0aCB3aGljaCB3YXMKKwljYXVzaW5nIHNvY2tldCBuYW1lcyB0byBjb250YWluIG1hbnkgdHJhaWxpbmcgTnVsIGJ5dGVzLgorCisJKiBkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oLCBnbGliL2RidXMtZ29iamVjdC5jCisJKGRidXNfZ19tZXRob2RfZ2V0X3NlbmRlcik6IE5ldyBtZXRob2QgZm9yIGV4dHJhY3RpbmcgdGhlIHNlbmRlciAKKwlmcm9tIGEgREJ1c0dNZXRob2RJbnZvY2F0aW9uCisJKGRidXNfZ19tZXRob2RfcmV0dXJuX2dldF9yZXBseSk6IGNoYW5nZWQgbmFtZSB0byAKKwlkYnVzX2dfbWV0aG9kX2dldF9yZXBseQorCShkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5KTogY2hhbmdlZCBuYW1lIHRvCisJZGJ1c19nX21ldGhvZF9zZW5kIHJlcGx5CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBOZXcgZG9jcyB0aGF0IGRlc2NyaWJlIGhvdyB0aGUgbmV3CisJcXVldWVpbmcgc3lzdGVtIHdvcmtzIGFuZCB0YWxrcyBhYm91dCB0aGUgY2hhbmdlcyB0byB0aGUgaG93CisJd2Ugc3BlY2lmeSBzb2NrZXQgbmFtZXMKKworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UuYywgCisJZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLmMsCisJZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci5jOgorCUNoYW5nZWQgdGhlIFJlcXVlc3ROYW1lIGZsYWdzIHRvIHRoZSBuZXcgc3lzdGVtCisKKwkqIHRlc3QvbmFtZS10ZXN0LyAodGVzdC1uYW1lcy5jLCBydW4tdGVzdC5zaCwgTWFrZWZpbGUuYW0pOiBOZXcKKwlyZWdyZXNzaW9uIHRlc3Qgc3VpdGUgZm9yIHRlc3RpbmcgdmFyaW91cyBzdGF0ZXMgb2YgdGhlIG5ldworCXF1ZXVlaW5nIHN5c3RlbQorCQorMjAwNS0xMS0xNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi1sb3dsZXZlbC5oLCBnbGliL2RidXMtZ29iamVjdC5jOiBQYXRjaCBmcm9tIFJvYgorCVRheWxvciB0byBhZGQgdHdvIG1ldGhvZHMsIGRidXNfZ19tZXRob2RfcmV0dXJuX2dldF9yZXBseSBhbmQKKwlkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5LCB0byBhbGxvdyB5b3UgdG8gZ2V0IHRoZSByZXBseQorCW1lc3NhZ2UgZnJvbSBhIERCdXNHTWV0aG9kSW52b2NhdGlvbiwgYXBwZW5kIGFyYml0cmFyeSBzdHVmZiB0byBpdCwKKwlhbmQgc2VuZCBpdC4gVGhlIEdMaWIgYmluZGluZ3MgY2FuJ3QgbWFyc2hhbCBhIHJldHVybiB2YWx1ZSBvZgorCXNvbWV0aGluZyBsaWtlIGEocykgaWYgdGhlIGFycmF5IGlzIGVtcHR5IC0gdWx0aW1hdGVseSB0aGV5IHNob3VsZCBiZQorCW1hZGUgdG8gaGVlZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBvdXQgYXJndW1lbnRzIGFzIHRoZSBQeXRob24gYmluZGluZ3MKKwlub3cgY2FuLCBidXQgdGhpcyBpcyBhIHdvcmthYmxlIGludGVyaW0gc29sdXRpb24gd2hpY2ggbWlnaHQgaGF2ZQorCW90aGVyIGFwcGxpY2F0aW9ucy4KKworMjAwNS0xMS0xNSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBidXMvZHJpdmVyLmMsIGJ1cy9zZXJ2aWNlcy5jLCBidXMvc2VydmljZXMuaDogQWRkIGEgUmVsZWFzZU5hbWUKKwltZXRob2QgdG8gb3JnLmZyZWVkZXNrdG9wLkRCdXMgdG8gcmVsZWFzZSBhIGJ1cyBuYW1lIG9yIGdpdmUgdXAKKwl3YWl0aW5nIGluIHRoZSBxdWV1ZSBmb3IgaXQuCisKKwkqIGRidXMvZGJ1cy1idXMuYywgZGJ1cy9kYnVzLWJ1cy5oLCBkYnVzL2RidXMtc2hhcmVkLmg6IEFkZCBhCisJZGJ1c19idXNfcmVsZWFzZV9uYW1lIG1ldGhvZCB0byBzZW5kIHRoZSBSZWxlYXNlTmFtZSBtZXRob2QgY2FsbHMuCisJQWRkIGNvbnN0YW50cyBmb3IgdGhlIHJldHVybiB2YWx1ZXMgdG8gZGJ1cy9kYnVzLXNoYXJlZC5oLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogRG9jdW1lbnQgdGhlIG5ldyBSZWxlYXNlTmFtZSBtZXRob2QKKwlpbiB0aGUgc3BlY2lmaWNhdGlvbi4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBBZGQgYSBsb3ctbGV2ZWwgcHl0aG9uIGJpbmRpbmcgZm9yIHRoZQorCXJlbGVhc2UgbmFtZSBtZXRob2QuCisKKwkqIHB5dGhvbi9leGNlcHRpb25zLnB5LCBweXRob24vc2VydmljZS5weTogTWFrZSBmcmVlaW5nIEJ1c05hbWUKKwlvYmplY3RzIHJlbGVhc2UgdGhlIG5hbWUuIEFkZCBhIE5hbWVFeGlzdHNFeGNlcHRpb24sIGFuZCBmaXggYQorCWJ1ZyB3aXRoIGNyZWF0aW5nIFVua25vd25NZXRob2RFeGNlcHRpb24uCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBBZGQgdGVzdHMgZm9yIGZyZWVpbmcgQnVzTmFtZQorCW9iamVjdHMgY2F1c2luZyBuYW1lcyB0byBiZSByZWxlYXNlZC4KKworMjAwNS0xMS0xNCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogSW5jbHVkZSB0aGUgdHJhY2ViYWNrIGluIHRoZSBlcnJvciByZXBseSB3aGVuIHdlCisJc2VuZCBhbiBleGNlcHRpb24gb3ZlciB0aGUgYnVzLiBfQkVTVF8gX1BBVENIXyBfRVZFUl8KKworMjAwNS0xMS0xNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJUGF0Y2ggZnJvbSBUaW1vIEhvZW5pZyA8dGhvZW5pZ0BzdXNlLmRlPi4KKworCSogYnVzL2J1cy5jOiBJJ3ZlIHJlY2VudGx5IGludmVzdGlnYXRlZCB3aHkgdGhlIGF1dG9tYXRpYyByZWxvYWQKKwlvZiBjb25maWd1cmF0aW9uIGZpbGVzIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQuCisKKwlDdXJyZW50bHksIHJlbG9hZGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGRvZXMgb25seSB3b3JrIHdoZW4KKwlydW5uaW5nIGRidXMtZGFlbW9uIHdpdGggLS1ub2RhZW1vbi4gIElmIHdlIGFyZSBydW5uaW5nIGFzIGRhZW1vbgorCXdlJ3JlIGhpdHRpbmcgYSBkbm90aWZ5IGJ1ZyBvbmNlIHdlIGZvcmsgdGhlIHByb2Nlc3MuCisKKwlXZSdyZSBpbml0aWFsaXppbmcgdGhlIGRub3RpZnkgZmRzIGJlZm9yZSBjYWxsaW5nIGZvcmsoKS4gIE9uY2UKKwl0aGUgY2hpbGQgcHJvY2VzcyBmb3JrZWQgaXQgZG9lcyBzdGlsbCBoYXZlIHRoZSBmZHMgKGFuZCB0aGV5CisJc3RpbGwgc2hvdyB1cCBpbiAvcHJvYy9gcGlkb2YgZGJ1cy1kYWVtb25gL2ZkLykgYnV0IHdlJ3JlIG5vdAorCWdldHRpbmcgU0lHSU8gYXMgY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4KKworCVRoZSBhdHRhY2hlZCBwYXRjaCBtb3ZlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRub3RpZnkgZmRzIHRvCisJcHJvY2Vzc19jb25maWdfcG9zdGluaXQoKS4gIFRoaXMgaXMgc2FmZSBmb3IgYWxsIGN1cnJlbnQgY29kZQorCXBhdGhzIGFuZCBzb2x2ZXMgdGhlIGRub3RpZnkgZGlzZnVuY3Rpb24uICBJZiB3ZSdyZSBydW5uaW5nCisJZGJ1cy1kYWVtb24gYXMgZGFlbW9uIHRoZSBmZHMgZm9yIGRub3RpZnkgYXJlIG5vdyBiZWluZworCWluaXRpYWxpemVkIGFmdGVyIGZvcmsoKSBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuCisKKwkqIGNvbmZpZ3VyZS5pbjogVGhlIGN1cnJlbnQgY29uZmlndXJlLmluIGNoZWNrIGZvciBkbm90aWZ5IHByb2JlcworCSd4JHRhcmdldF9vcycgZm9yIGJlaW5nICd4bGludXgtZ251Jy4gIEkndmUgY2hhbmdlZCB0aGUgY2hlY2sgdG8KKwltYXRjaCBmb3IgJ3hsaW51eCcsIHRvby4gQWRkaXRpb25hbGx5IEkgaGF2ZSBhZGFwdGVkIHRoZSBjb25maWd1cmUKKwlvcHRpb24ncyBzdHlsZSB0byBtYXRjaCB3aXRoIHRoZSBvdGhlcnMuCisKKzIwMDUtMTEtMTQgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RlY29yYXRvcnMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBBZGQgYSBuZXcgYXJndW1lbnQgdG8gdGhlCisJZGJ1cy5zZXJ2aWNlLm1ldGhvZCBkZWNvcmF0b3IgY2FsbGVkIHNlbmRlcl9rZXl3b3JkLCB3aGljaCBpZiBzZXQsCisJc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgdGhlIGJ1cworCW5hbWUgb2YgdGhlIG1ldGhvZCBjYWxsZXIuCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCBhCisJbWV0aG9kIGFuZCB0ZXN0IHRvIGNoZWNrIHRoZSBzZW5kZXJfa2V5d29yZCBmdW5jdGlvbmFsaXR5LgorCisyMDA1LTExLTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX3JlbG9hZF9jb25maWcpOiBNYWtlIHN1cmUgd2Ugc2VuZCBhbiAKKwllbXB0eSByZXBseSBzbyBibG9ja2luZyBjYWxscyBkb24ndCBibG9jayBmb3JldmVyIChQYXRjaCBmcm9tIFNqb2VyZCAKKwlTaW1vbnMgPHNqb2VyZCBhdCBsdW9uLm5ldD4pCisKKwkqIEFVVEhPUlM6IEFkZCBSb2JlcnQgTWNRdWVlbiBmb3IgaGlzIHdvcmsgb24gdGhlIFB5dGhvbgorCUJpbmRpbmdzIGFuZCBvdGhlciBwYXJ0cyBvZiBELUJ1cworCisyMDA1LTExLTA3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBDaGFuZ2UgZW1pdF9zaWduYWwgZnVuY3Rpb24gdG8gdXNlIHRoZQorCXNpZ25hdHVyZSBhbm5vdGF0aW9uIG9mIHRoZSBzaWduYWwgd2hlbiBtYXJoc2FsbGluZyB0aGUgYXJndW1lbnRzIGZyb20KKwl0aGUgc2VydmljZS4gRml4IGEgYnVnIHdoZXJlIHRoZSBjb2RlIGNoZWNraW5nIHNpZ25hdHVyZSBsZW5ndGgKKwlhZ2FpbnN0IGFyZ3VtZW50IGxlbmd0aCByZWZlcmVuY2VkIHRoZSB3cm9uZyB2YXJpYWJsZS4KKworCSogcHl0aG9uL2ludHJvc3BlY3RfcGFyc2VyLnB5OiBBdm9pZCBhZGRpbmcgdGhlIHR5cGUgc2lnbmF0dXJlIG9mCisJc2lnbmFsIGFyZ3VtZW50cyB0byBhbnkgbWV0aG9kcyB3aGljaCBvY2N1ciBhZnRlciB0aGVtIGluIHRoZQorCWludHJvc3BlY3Rpb24gZGF0YSAoISkgYnkgbWFraW5nIHRoZSBwYXJzZXIgYSBsaXR0bGUgbW9yZSBjYXJlZnVsCisJYWJvdXQgaXRzIGN1cnJlbnQgc3RhdGUuCisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBSZW1vdmUgZGVidWcgcHJpbnRzIGZyb20gbGFzdCBjb21taXQgKGFnYWluIDpEKS4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHksIHRlc3QvcHl0aG9uL3Rlc3Qtc2VydmljZS5weTogQWRkIHRlc3QKKwlzaWduYWxzIHdpdGggc2lnbmF0dXJlIGRlY29yYXRvcnMgdG8gdGVzdCB0aGUgc3RyaWN0IG1hcnNoYWxsaW5nIGNvZGUKKwlnaXZlcyBlcnJvcnMgYXQgdGhlIHJpZ2h0IHRpbWUuIENvdWxkIGRvIHdpdGggY2hlY2tpbmcgdGhlIHNpZ25hbHMKKwlhY3R1YWxseSBnZXQgZW1pdHRlZCB0b28sIGdpdmVuIHRoYXQgdGhlIHRlc3QgZG9lcyBub3RoaW5nIHdpdGgKKwlzaWduYWxzIGF0IHRoZSBtb21lbnQuLi4KKworMjAwNS0xMS0wNyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vX2RidXMucHk6IEFkZCBXZWFrUmVmZXJlbmNlRGljdGlvbmFyeSBjYWNoZSBvZiBkYnVzLkJ1cworCWluc3RhbmNlcyB0byBzdG9wIG1hZG5lc3Mgb2YgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyByZXByZXNlbnRpbmcKKwl0aGUgc2FtZSBidXMgY29ubmVjdGlvbiBhbGwgdGhlIHRpbWUsIHJlbmRlcmluZyBhbnkgdHJhY2tpbmcgb2YKKwltYXRjaCBydWxlcyBhbmQgYnVzIG5hbWVzIHF1aXRlIG1lYW5pbmdsZXNzLiBDYXVnaHQgYSBidWcgd2hlcmUKKwl0aGUgcHJpdmF0ZSBhcmd1bWVudCB0byBTZXNzaW9uQnVzKCkgYW5kIGZyaWVuZHMgd2FzIGJlaW5nIHBhc3NlZAorCWluIGFzIHVzZV9kZWZhdWx0X21haW5sb29wIGJ5IG1pc3Rha2UuIFN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aAorCW11bHRpcGxlIGRidXNfYmluZGluZy5Db25uZWN0aW9uIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlIHNhbWUKKwlsb3ctbGV2ZWwgY29ubmVjdGlvbiAoZWcgd2hlbiB5b3UgdXNlIGJvdGggU2Vzc2lvbkJ1cygpIGFuZAorCVN0YXJ0ZXJCdXMoKSBpbiBzYW1lIHByb2Nlc3MpLCBidXQgaXQncyBhIGxvdCBiZXR0ZXIgbm93IHRoYW4gaXQKKwl3YXMuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogQWRkIGNvbnN0YW50cyB3aXRoIHRoZSByZXR1cm4gdmFsdWVzCisJZm9yIGJ1c19yZXF1ZXN0X25hbWUoKS4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IFN0b3JlIGJ1cyBuYW1lIGluc3RhbmNlcyBpbiBhIHBlci1kYnVzLkJ1cyBjYWNoZQorCWFuZCByZXRyaWV2ZSB0aGUgc2FtZSBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIG5hbWUsIHNvIGRlbGV0aW9uIGNhbiBiZQorCWRvbmUgd2l0aCByZWZjb3VudGluZy4gQWxzbyBub3cgdGhyb3dzIHNvbWUga2luZCBvZiBlcnJvciBpZiB5b3UKKwlkb24ndCBhY3R1YWxseSBnZXQgdGhlIG5hbWUgeW91IHJlcXVlc3RlZCwgdW5saWtlIHByZXZpb3VzbHkuLi4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IEFkZCB0ZXN0cyBmb3IgaW5zdGFuY2UgY2FjaGluZyBvZiBidXNlcworCWFuZCBidXMgbmFtZSBvYmplY3RzLgorCisyMDA1LTExLTA0ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCwgdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IEZpeAorCW1hcnNoYWxsaW5nIG9mIGJvb2xlYW4gdmFsdWVzLiBBZGQgc29tZSBib29sZWFucyB0byB0aGUgdmFsdWVzIGluCisJdGhlIHRlc3QgY2xpZW50LgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weSwgcHl0aG9uL3NlcnZpY2UucHk6IEFkZCBhbiAnYXN5bmNfY2FsbGJhY2tzJworCWFyZ3VtZW50IHRvIHRoZSBkYnVzLnNlcnZpY2UubWV0aG9kIGRlY29yYXRvciwgd2hpY2ggYWxsb3dzIHlvdSB0bworCW5hbWUgYXJndW1lbnRzIHRvIHRha2UgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcmVwbHlpbmcgd2l0aAorCXJldHVybiB2YWx1ZXMgb3IgYW4gZXhjZXB0aW9uLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSwgdGVzdC9weXRob24vdGVzdC1zZXJ2aWNlLnB5OiBBZGQgdGVzdAorCWNhc2UgdXNpbmcgYXN5bmNocm9ub3VzIG1ldGhvZCByZXBseSBmdW5jdGlvbnMsIGJvdGggcmV0dXJuIHZhbHVlcyBhbmQKKwllcnJvcnMsIGFuZCBmcm9tIHdpdGhpbiBib3RoIHRoZSBmdW5jdGlvbiBpdHNlbGYgYW5kIGZyb20gYSBtYWlubG9vcAorCWNhbGxiYWNrLgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weSwgcHl0aG9uL3NlcnZpY2UucHk6IFBlcmZvcm0gY2hlY2tpbmcgdGhhdCB0aGUKKwludW1iZXIgb2YgbWV0aG9kL3NpZ25hbCBhcmd1bWVudHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoZQorCXNpZ25hdHVyZSBhdCBjbGFzcyBsb2FkaW5nIHRpbWUsIG5vdCB3aGVuIHlvdSBmaXJzdCBpbnRyb3NwZWN0IHRoZQorCWNsYXNzLgorCisJKiBweXRob24vc2VydmljZS5weTogUmVtb3ZlIGRlYnVnIHByaW50IGxlZnQgYnkgdGhlIGxhc3QgY29tbWl0LgorCisyMDA1LTExLTAzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBIZWF2eSByZWZhY3RvcmluZyBvZiBtZXRob2QgaW52b2NhdGlvbiwgd2l0aAorCWhvcGVmdWxseSBubyBlZmZlY3Qgb24gZnVuY3Rpb25hbGl0eS4gTnVrZWQgX2Rpc3BhdGNoX2RidXNfbWV0aG9kX2NhbGwKKwlpbiBmYXZvdXIgb2YgYSBuZXcgX21lc3NhZ2VfY2IgdGhhdCB1c2VzIHNlcGVyYXRlIGZ1bmN0aW9ucyBmb3IKKwlsb29raW5nIHVwIHRoZSBtZXRob2QgdG8gY2FsbCwgbWFyc2hhbGxpbmcgdGhlIHJldHVybiB2YWx1ZXMsIGFuZAorCXNlbmRpbmcgZXhjZXB0aW9ucyBhcyBlcnJvcnMsIGFuZCBpcyBlYXNpZXIgdG8gZm9sbG93IGFzIGEKKwljb25zZXF1ZW5jZS4gIEZpeGVzIHNvbWUgY29ybmVyIGNhc2VzIGFib3V0IHJldHVybmluZyB0aGluZ3MgdGhhdAorCWRvbid0IG1hdGNoIHlvdXIgZGVjbGFyZWQgb3V0X3NpZ25hdHVyZSwgYWxsb3dzIGV4Y2VwdGlvbnMgdG8gZGVmaW5lCisJX2RidXNfZXJyb3JfbmFtZSBhbmQgaGF2ZSBpdCBiZSBzZW50IG92ZXIgdGhlIGJ1cyBhcyB0aGUgZXJyb3IgbmFtZSwKKwlhbmQgcGF2ZXMgdGhlIHdheSBmb3IgY29vbCBzdHVmZiBsaWtlIGhlZWRpbmcgdGhlIG1lc3NhZ2Ugbm8gcmVwbHkKKwlmbGFnLCBhc3luY2hyb25vdXMgbWV0aG9kIGltcGxlbWVudGF0aW9ucywgaW5mb3JtaW5nIHRoZSBtZXRob2Qgb2YgdGhlCisJc2VuZGVyLCBhbmQgaW5jbHVkaW5nIGJhY2t0cmFjZXMgaW4gdGhlIGVycm9yIG1lc3NhZ2VzLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogQ2F0Y2ggYW5kIHByaW50IGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZQorCWFzeW5jIGNhbGxiYWNrIHRlc3RzLCByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZW0gdG8gdGhlIGxvdy1sZXZlbAorCWJpbmRpbmdzIHRvIGJlIGlnbm9yZWQgaW4gYSBub2lzeSBhbmQgZnJ1c3RyYXRpbmcgbWFubmVyLgorCisyMDA1LTExLTAzICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9fZGJ1cy5weSwgcHl0aG9uL3Byb3hpZXMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBBZGQgX19yZXByX18KKwlmdW5jdGlvbnMgdG8gZGJ1cy5CdXMsIGRidXMuc2VydmljZS5CdXNOYW1lIGFuZCBkYnVzLnNlcnZpY2UuT2JqZWN0LAorCXR3ZWFrIG90aGVycyB0byBiZSBjb25zaXN0ZW50LgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogVHdlYWsgb3V0cHV0IG9mIHRlc3RJbmhlcml0YW5jZS4KKworMjAwNS0xMC0yOSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogTWFqb3IgY2hhbmdlcyB0byBhbGxvdyBtdWx0aXBsZSBpbmhlcml0YW5jZQorCWZyb20gY2xhc3NlcyB0aGF0IGRlZmluZSBELUJ1cyBpbnRlcmZhY2VzOgorCQorCSAxLiBDcmVhdGUgYSBuZXcgSW50ZXJmYWNlIGNsYXNzIHdoaWNoIGlzIHRoZSBwYXJlbnQgY2xhc3Mgb2YKKwkgICAgT2JqZWN0LCBhbmQgbWFrZSB0aGUgT2JqZWN0VHlwZSBtZXRhY2xhc3MgaW50byBJbnRlcmZhY2VUeXBlLgorCQorCSAyLiBQYXRjaCB3cml0dGVuIHdpdGggUm9iIFRheWxvciB0byByZXBsYWNlIHVzZSBvZiBtZXRob2RfdnRhYmxlCisJICAgIHdpdGggY29kZSB0aGF0IHdhbGtzIHRoZSBjbGFzcydzIF9fTVJPX18gKG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyKQorCSAgICB0byBiZWhhdmUgbGlrZSBQeXRob24gZG9lcyB3aGVuIGludm9raW5nIG1ldGhvZHMgYW5kIGFsbG93CisJICAgIG92ZXJyaWRpbmcgYXMgeW91J2QgZXhwZWN0LiBDb2RlIGlzIHF1aXRlIHRyaWNreSBiZWNhdXNlCisJICAgIHdlIGhhdmUgdG8gZmluZCB0d28gbWV0aG9kcywgdGhlIG9uZSB0byBpbnZva2Ugd2hpY2ggaGFzIHRoZQorCSAgICByaWdodCBuYW1lIGFuZCBpc24ndCBkZWNvcmF0ZWQgd2l0aCB0aGUgL3dyb25nLyBpbnRlcmZhY2UsCisJICAgIGFuZCB0aGUgb25lIHRvIHBpY2sgdXAgdGhlIHNpZ25hdHVyZXMgZnJvbSB3aGljaCBpcyBkZWNvcmF0ZWQKKwkgICAgd2l0aCB0aGUgcmlnaHQgaW50ZXJmYWNlLgorCQorCSAgICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5IGFzIHRvIG5vcm1hbCBtdWx0aXBsZSBpbmhlcml0YW5jZSAtCisJICAgIHRoaXMgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgeW91IHRyeSBhbmQgaW5oZXJpdCBmcm9tIHR3bworCSAgICBjbGFzc2VzIHRoYXQgZGVmaW5lIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgYXJlCisJICAgIGRlY29yYXRlZCB3aXRoIGRpZmZlcmVudCBpbnRlcmZhY2VzLiBZb3Ugc2hvdWxkIGRlY29yYXRlCisJICAgIHlvdXIgb3ZlcnJpZGluZyBtZXRob2Qgd2l0aCB0aGUgaW50ZXJmYWNlIHlvdSB3YW50LgorCQorCSAzLiBSZXBsYWNlIGdydW5neSBpbnRyb3NwZWN0aW9uIFhNTCBnZW5lcmF0aW9uIGNvZGUgaW4gdGhlIG1ldGFjbGFzcworCSAgICB3aXRoIGRpY3Rpb25hcmllcyB0aGF0IGNvcGUgY29ycmVjdGx5IHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UKKwkgICAgYW5kIHRoZSBvdmVycmlkaW5nIG9mIG1ldGhvZHMuIFRoaXMgYWxzbyB1c2VzIHRoZSBzaWduYXR1cmUKKwkgICAgZGVjb3JhdGlvbnMgdG8gcHJvdmlkZSBjb3JyZWN0IGludHJvc3BlY3Rpb24gZGF0YSwgaW5jbHVkaW5nCisJICAgIHRoZSBkZWJ1dCBhcHBlYXJhbmNlIG9mIHRoZSB0eXBlcyBvZiB5b3VyIHJldHVybiB2YWx1ZXMuIDpECisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCBhIHRlc3QKKwljYXNlIHRvIHRyeSBpbnZva2luZyBhbiBtZXRob2QgdGhhdCBvdmVycmlkZXMgb25lIGluaGVyaXRlZCBmcm9tIGEKKwlELUJ1cyBpbnRlcmZhY2UgY2xhc3MuCisKKzIwMDUtMTAtMjkgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBUd2VhayAncmFpc2UgQXNzZXJ0aW9uRXJyb3InIHRvIGFzc2VydCgpLgorCUFkZCBjaGVja2luZyBmb3IgdGhlIGVuZCBvZiBzdHJ1Y3QgY2hhcmFjdGVyIHdoZW4gbWFyc2hhbGxpbmcgYQorCXN0cnVjdCBpbiBNZXNzYWdlSXRlci5hcHBlbmRfc3RyaWN0LgorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlMi5weTogVXBkYXRlIHRvIHVzZSBnb2JqZWN0CisJbWFpbmxvb3AgZGlyZWN0bHkgcmF0aGVyIHRoYW4gYXBwZWFyaW5nIHRvIGRlcGVuZCBvbiBndGsuCisKKwkqIHB5dGhvbi90ZXN0L3Rlc3QtY2xpZW50LnB5LCBweXRob24vdGVzdC90ZXN0LXNlcnZlci5weTogUmVtb3ZlCisJb2Jzb2xldGUgYW5kIGJyb2tlbiB0ZXN0IHNjcmlwdHMgZm9yIG9sZCBiaW5kaW5ncy4gV2UgaGF2ZSB1cCB0byBkYXRlCisJYW5kIHdvcmtpbmcgdGVzdHMgaW4gdGVzdC9weXRob24vLgorCisyMDA1LTEwLTI5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBBZGQgb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QgYW5kCisJc2lnbmFsIGRlY29yYXRvcnMgdG8gYWxsb3cgeW91IHRvIHNwZWNpZnkgdGhlIHNpZ25hdHVyZSBvZiBhcmd1bWVudHMKKwlhbmQgcmV0dXJuIHZhbHVlcy4gUHJlc2VydmUgdGhlIGRvYyBzdHJpbmdzIG9mIHNpZ25hbCBmdW5jdGlvbnMgaW4gdGhlCisJZGVjb3JhdGVkIHZlcnNpb24sIGZvciBweWRvYyBhbmQgZnJpZW5kcy4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LCBweXRob24vcHJveGllcy5weTogUmVwbGFjZSB0aGUKKwlwYXJzZV9zaWduYXR1cmVfYmxvY2sgZnVuY3Rpb24gd2l0aCBhbiBpdGVyYWJsZSBkYnVzLlNpZ25hdHVyZSgpCisJdHlwZS4gRml4IGEgYnVnIGluIE1lc3NhZ2VJdGVyLmFwcGVuZF9zdHJpY3Qgd2hlcmUgeW91IGNvdWxkIGFwcGVuZAorCWFueXRoaW5nIGJ5IGNsYWltaW5nIGl0IHdhcyBhIHN0cmluZy4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IFVzZSB0aGUgb3V0X3NpZ25hdHVyZSBkZWNvcmF0aW9uIG9uIG1ldGhvZHMgdG8KKwltYXJzaGFsIHJldHVybiB2YWx1ZXMsIG1lYW5pbmcgeW91IG5vIGxvbmdlciByZXF1aXJlIGRidXMuQXJyYXkoKQorCW9yIGRidXMuRGljdGlvbmFyeSgpIHRvIGluZGljYXRlIHRoZSB0eXBlIHdoZW4gcmV0dXJuaW5nIGVtcHR5CisJYXJyYXlzIG9yIGRpY3Rpb25hcmllcy4gRml4IGEgYnVnIHdoZXJlIGV4Y2VwdGlvbnMgd2hpY2ggYXJlIGRlZmluZWQKKwlpbiBfX21haW5fXyBhcmUgbm90IHR1cm5lZCBpbnRvIGVycm9yIHJlcGxpZXMuCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCB0ZXN0CisJZm9yIGNvcnJlY3QgbWFyc2hhbGxpbmcgb2YgcmV0dXJuIHZhbHVlcyBhY2NvcmRpbmcgdG8gb3V0X3NpZ25hdHVyZS4KKwlGaXggYSBidWcgaW4gdGhlIGFzeW5jIGNhbGwgdGVzdCB3aGVyZSB0aGUgZXJyb3JfaGFuZGxlciBpcyBtaXNzaW5nIGEKKwlzZWxmIGFyZ3VtZW50LgorCisyMDA1LTEwLTI5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW0sIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0sCisJZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvTWFrZWZpbGUuYW06IE1lcmdlIHBhdGNoIGZyb20gVWJ1bnR1IGJ5CisJRGFuaWVsIFN0b25lIHRvIHJlcGxhY2UgZXhwbGljaXQgY2FsbHMgdG8gbGlidG9vbCB3aXRoICQoTElCVE9PTCkuCisKKwkqIHRlc3QvcHl0aG9uLy5jdnNpZ25vcmU6IEFkZCBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZi4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjEsIHRvb2xzL2RidXMtbW9uaXRvci5jOiBNZXJnZSBkYnVzLW1vbml0b3IgcGF0Y2gKKwlmcm9tIFVidW50dSBieSBEYW5pZWwgU2lsdmVyc3RvbmUgdG8gYWxsb3cgc3BlY2lmeWluZyBtYXRjaCBydWxlcyBvbgorCXRoZSBjb21tYW5kIGxpbmUuCisKKzIwMDUtMTAtMjcgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6CisJUmVtb3ZlIGRlYWQgY29kZS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYzoKKwlTdG9wIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDUtMTAtMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzoKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOgorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJKiBnbGliL2RidXMtZ21haW4uYzoKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6CisJQWRkIHNvbWUgY29uc3Qga2V5d29yZHMuCisKKzIwMDUtMTAtMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6CisJRG9jdW1lbnQgdGhlIE5vUmVwbHkgYW5ub3RhdGlvbi4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6CisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzoKKwlSZXNwZWN0IHRoZSBOb1JlcGx5IGFubm90YXRpb24uCisKKzIwMDUtMTAtMjQgIFJvYmVydCBNY1F1ZWVuIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXggKFN0cmluZywgTWVzc2FnZUl0ZXIpOiBtYWtlIEQtQnVzIHN0cmluZ3MKKwlkZXJpdmUgZnJvbSB1bmljb2RlIGluc3RlYWQgb2Ygc3RyLCBhbmQgZW5jb2RlL2RlY29kZSBVVEYtOCB3aGVuCisJbWFyc2hhbGxpbmcvdW5tYXJzaGFsbGluZyBidXMgbWVzc2FnZXMKKworCSogcHl0aG9uL2ludHJvc3BlY3RfcGFyc2VyLnB5OiBlbmNvZGUgaW50cm9zcGVjdGlvbiBkYXRhIGFzIFVURi04CisJYmVmb3JlIHBhc3NpbmcgdGhlIGJ1ZmZlciBpbnRvIGxpYnhtbDIKKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IGFkZCB1bmljb2RlIHRlc3Qgc3RyaW5ncworCisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy8uY3ZzaWdub3JlLCB0ZXN0L3B5dGhvbi8uY3ZzaWdub3JlOgorCWlnbm9yZSBnZW5lcmF0ZWQgcHl0aG9uIHRlc3QgZmlsZXMKKworMjAwNS0xMC0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jIChoYXNoX2ZyZWVfZnJvbV9ndHlwZSk6IGhhbmRsZSBnZG91YmxlCisJYW5kIEdfVFlQRV9WQUxVRV9BUlJBWSAoREJVU19UWVBFX1NUUlVDVCkKKwkoZ3ZhbHVlX2Zyb21faGFzaF92YWx1ZSwgaGFzaF92YWx1ZV9mcm9tX2d2YWx1ZSk6IGhhbmRsZSBnZG91YmxlCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfdG9fc2lnbmF0dXJlKTogYWRkIG1pc3NpbmcKKwlEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIGFuZCBEQlVTX1NUUlVDVF9FTkRfQ0hBUiBjaGFyYXRlcnMKKwl3aGVuIGNvbnN0cnVjdGluZyBzdHJ1Y3Qgc2lnbmF0dXJlcworCisJKiBweXRob24vX2RidXMucHkgKEJ1cyk6IGhhbmRsZSBwcml2YXRlIGNvbm5lY3Rpb25zIHVzaW5nIHRoZQorCXByaXZhdGUga2V5d29yZCBpbiB0aGUgY29uc3RydWN0b3IuIGRlZmF1bHRzIHRvIHByaXZhdGU9RmFsc2UKKwkoQnVzOjpjbG9zZSk6IG5ldyBtZXRob2QgdG8gY2xvc2UgYSBjb25uZWN0aW9uIHRvIHRoZSBidXMKKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IChDb25uZWN0aW9uOjpjbG9zZSk6IHJlbmFtZWQgbWV0aG9kCisJd2FzIHByZXZpb3VzbHkgY2FsbGVkIGRpc2Nvbm5lY3QKKwkoYnVzX2dldCk6IG5vdyBzdXBwb3J0cyBnZXR0aW5nIGEgcHJpdmF0ZSBjb25uZWN0aW9uCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU1ldGhvZDo6X19jYWxsX18pOiBjaGVjayBpZiBpZ25vcmVfcmVwbHkKKwlrZXl3b3JkIGlzIHNldCB0byBUcnVlLiAgaWYgaXQgaXMsIGV4ZWN1dGUgdGhlIG1ldGhvZCB3aXRob3V0IHdhaXRpbmcKKwlmb3IgYSByZXBseQorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfZXhlY3V0ZV9xdWV1ZSk6IG5ldyBtZXRob2QgZm9yIGV4ZWN1dGluZworCWFsbCB0aGUgcGVuZGluZyBtZXRob2RzIHRoYXQgd2VyZSB3YWl0aW5nIGZvciB0aGUgaW50cm9zcGVjdCB0bworCWZpbmlzaC4gIHRoaXMgaXMgY2FsbGVkIHdoZW4gaW50cm9zcGVjdCBlaXRoZXIgc3VjY2VlZHMgb3IgZmFpbHMKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X2Vycm9yX2hhbmRsZXIpOiBjYWxsIHF1ZXVlZCBtZXRob2RzCisKKzIwMDUtMTAtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCAoTWVzc2FnZUl0ZXI6OmFwcGVuZF9zdHJpY3QpOiBjaGVjayBmb3IKKwlTVFJVQ1RfQkVHSU4gbm90IFRZUEVfU1RSVUNUIGluIGluZGljYXRlIHdlIGFyZSBtYXJzaGFsbGluZyBhIHN0cnVjdAorCisJKiBweXRob24vc2VydmljZS5weSAoT2JqZWN0OjpfbWVzc2FnZV9jYik6IGhhbmRsZSBleGNlcHRpb25zIGNvcnJlY3RseQorCWJ5IHNlbmRpbmcgdGhlbSBvdmVyIHRoZSB3aXJlIHRvIHRoZSBjYWxsaW5nIGFwcC4gIFRoaXMgbWFrZXMgc3VyZQorCXRoZSBjbGllbnQgcmV0dXJucyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgdGhlIDE1IHNlY29uZHMgdG8KKwl0aW1lb3V0LgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSAoVGVzdERCdXNCaW5kaW5nczo6dGVzdEJlbmNobWFya0ludHJvc3BlY3QpOiAKKwlBZGQgYSB0ZXN0IHRvIGJlbmNobWFyayBob3cgbG9uZyBpdCB0YWtlcyB0byBpbnRyb3NwZWN0IGEgc2VydmljZSBhbmQgCisJY2FsbCBhIG1ldGhvZCB3aGljaCByZXR1cm5zIGEgbGFyZ2UgZWxlbWVudCAocHJldHR5IGZhc3QpCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3Qtc2VydmljZS5weSAoVGVzdE9iamVjdDo6R2V0Q29tcGxleEFycmF5KTogbmV3IHRlc3QgCisJbWV0aG9kIHdoaWNoIHB1c2hlcyBhIGxvdCBvZiBkYXRhCisKKzIwMDUtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5KE9iamVjdFR5cGU6Ol9yZWZsZWN0X29uX3NpZ25hbCwgX3JlZmxlY3Rfb25fbWV0aG9kKTogCQorCXJlY2xhaW0gbWVtb3J5IG91dHNpZGUgb2YgdGhlIGxvb3AgYW5kIHVzZSBkZWwgaXN0ZWFkIG9mIGp1c3Qgc2V0dGluZworCXRoZSBrZXkgdG8gTm9uZQorCisyMDA1LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vc2VydmljZS5weSAoT2JqZWN0VHlwZTo6X3JlZmxlY3Rfb25fc2lnbmFsKTogQWx3YXlzIGNsb3NlCisJc2lnbmFsIHRhZyBldmVuIHdoZW4gdGhlcmUgYXJlIG5vIGFyZ3VtZW50cworCisyMDA1LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCBtb25vLCBtb25vLWRvY3MgYW5kIFF0MyB0byBkZWZhdWx0CisJdG8gbm8gaW5zdGVhZCBvZiBhdXRvIHdoZW4gYnVpbGRpbmcuICBUaGVzZSBiaW5kaW5ncyBkbyBub3QKKwloYXZlIGZ1bGwgdGltZSBtYWludGFpbmVycyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGZvciB0aGUKKwkxLjAgcmVsZWFzZS4KKworMjAwNS0xMC0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCXBhdGNoZXMgZnJvbSBNaWNoYWVsIEtyaXZvcnVjaGtvIDxtaXNoYSBhdCBzdW4uY29tPjogCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluaywKKwlfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudCwgCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUsIAorCV9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCk6IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHBhdGggCisJaXMgTlVMTCB3aGVuIGNhbGxpbmcgX2RidXNfdmVyYm9zZQorCisJKiBjb25maWd1cmUuaW46IGNoZWNrIGZvciBmdW5jdGlvbnMgZ2V0cGVlcnVjcmVkIGFuZCBnZXRwZWVyZWlkCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBwcm92aWRlcyAKKwlzdXBwb3J0IG9mIGF1dGggRVhURVJOQUwgb24gU29sYXJpcyAxMCsgKGdldHBlZXJ1Y3JlZCksIEZyZWVCU0QgNC42KywgCisJT3BlbkJTRCAzLjArIGFuZCBGcmVlQlNEIDUuMCsgYXMgd2VsbCBhcyBNYWNPU1ggMTAuMisgKGdldHBlZXJlaWQpLiAKKwlQYXRjaCB3YXMgb25seSB0ZXN0ZWQgb24gU29sYXJpcyAxMCB4ODYgc28gaXQgbWlnaHQgYmUgaXNzdWVzCisJd2l0aCBvdGhlciBwbGF0Zm9ybXMgKGkuZS4gQlNEcyBhbmQgTWFjT1NYKQorCQorCisyMDA1LTEwLTA1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKG1hcnNoYWxfdmFyaWFudCk6IGNhbGwgX2RidXNfZ3ZhbHVlX21hcnNoYWwgCisJaW5zdGVhZCBvZiBtYXJzaGFsIGJhc2ljIHNvIHdlIGNhbiBoYW5kbGUgcmVjdXJzaXZlIHR5cGVzIGluIGEgdmFyaWFudAorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogQWRkIHRlc3QgZm9yIG1hcnNoYWxpbmcgcmVjdXJpdmUgdHlwZXMKKwlpbiB2YXJpYW50cworCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYywgdGVzdC1zZXJ2aWNlLWdsaWIueG1sCisJKG15X29iamVjdF9lY2hvX3ZhcmlhbnQgW0VjaG9WYXJpYW50XSwgCisJbXlfb2JqZWN0X3Byb2Nlc3NfdmFyaWFudF9vZl9hcnJheV9vZl9pbnRzMTIzCisJW1Byb2Nlc3NWYXJpYW50T2ZBcnJheU9mSW50czEyM10pOiAKKwlBZGQgdHdvIHRlc3QgbWV0aG9kcworCisJKiBweXRob24vaW50cm9zcGVjdF9wYXJzZXIucHk6IE5ldyBtb2R1bGUgZm9yIHBhcnNpbmcgaW50cm9zcGVjdAorCWRhdGEuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDoKKwkodmFyaW91cyBwbGFjZXMpOiB3aGVuIHRocm93aW5nIGVycm9ycyBmaXggdG8gdXNlIGVycm9ybXNnIGluc3RlYWQgCisJb2YgbWVzc2FnZSBsb2NhbCB2YXJpYWJsZSBiZWNhdXNlIFB5cmV4IGNhbiBnZXQgY29uZnVzZWQgd2l0aCBvdGhlciAKKwltZXNzYWdlIHZhcmlhYmxlcyAoaW5pdGlhbCBwYXRjaCBieSBSb2JlcnQgTWNRdWVlbiAKKwk8cm9iZXJ0Lm1jcXVlZW4gYXQgY29sbGFib3JhLmNvLnVrPikKKwkoTWVzc2FnZUl0ZXI6OnBhcnNlX3NpZ25hdHVyZV9ibG9jayk6IG5ldyBtZXRob2QgZm9yIGdldHRpbmcgdGhlIG5leHQKKwlibG9jayBpbiBhIHNpZ25pdHVyZS4KKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF9zdHJpY3QpOiBuZXcgbWV0aG9kIGZvciBhcHBlbmRpbmcgdmFsdWVzIHN0cmljdGx5CisJdXNpbmcgdGhlIHBhc3NlZCBpbiBzaWduYXR1cmUgaW5zdGVhZCBvZiBndWVzc2luZyBhdCB0aGUgdHlwZQorCShNZXNzYWdlSXR0ZXI6OiBhcHBlbmRfZGljdCwgYXBwZW5kX3N0cnVjdCwgYXBwZW5kX2FycmF5KTogdXNlIAorCXNpZ25hdHVyZXMgdG8gbWFyc2hhbCBjaGlsZHJlbiBpZiB0aGUgc2lnbmF0dXJlIGlzIGF2YWlsYWJsZQorCQorCSogcHl0aG9uL2V4Y2VwdGlvbnMucHkgKEludHJvc3BlY3Rpb25QYXJzZXJFeGNlcHRpb24pOiBuZXcgZXhjZXB0aW9uCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU1ldGhvZDo6X19jYWxsX18pOiBNYXJzaGFsIGFyZ3Mgd2l0aCAKKwlpbnRyb3NwZWN0ZWQgc2lnbmF0dXJlcyBpZiBhdmFpbGFibGUsIGVsc2Ugd2UgZmFsbCBiYWNrIHRvIHRoZQorCW9sZCB3YXkgb2YgZG9pbmcgdGhpbmdzLgorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfcmVwbHlfaGFuZGxlciApOiBwYXJzZSBpbnRyb3NwZWN0aW9uIGRhdGEKKwkKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5IChPYmplY3RUeXBlOjpfcmVmbGVjdF9vbl9tZXRob2QpOiBQcm9wZXJseQorCXRlcm1pbmF0ZSA8bWV0aG9kPiBpZiB0aGVyZSBhcmUgbm8gYXJncyBpbiB0aGUgcmVmbGVjdGlvbiBkYXRhCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBhZGQgdGVzdHMgZm9yIHRhbGtpbmcgd2l0aCB0aGUgR0xpYgorCXRlc3Qgc2VydmVyLiAgVGhpcyBnaXZlcyB1cyBiZXR0ZXIgY292ZXJhZ2UgZm9yIGludHJvc3BlY3Rpb24gc2luY2UKKwlweXRob24gdG8gcHl0aG9uIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGFyZ3VtZW50cyBhcyB2YXJpYW50cy4gIEl0IGFsc28KKwlhbGxvd3MgdXMgdG8gdGVzdCB0aGUgcm9idXN0bmVzcyBvZiB0aGUgR0xpYiBiaW5kaW5ncyBhbmQgaW50ZXJsYW5ndWFnZQorCWNvbW11bmljYXRpb25zLgorCisJCisyMDA1LTEwLTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QpOiBBZGQgc2lnbmFscworCXRvIHRoZSBpbnRyb3NwZWN0IGRhdGEuIChwYXRjaCBmcm9tIERhbmllbCBQLiBCZXJyYW5nZSAKKwk8ZGFuIGF0IGJlcnJhbmdlLmNvbT4pCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19leGlzdGVudF9waW5nKTogQWRkIHRlc3RjYXNlIGZvciBQaW5nCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyLAorCV9kYnVzX2Nvbm5lY3Rpb25fcnVuX2J1aWx0aW5fZmlsdGVycyk6IENoYW5nZWQgdGhlc2UgdG8KKwliZSB1bmxvY2tfbm9fdXBkYXRlIGZ1bmN0aW9ucyBhbmQgY2FsbCAKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIGluc3RlYWQgb2YKKwlkYnVzX2Nvbm5lY3Rpb25fc2VuZCB0byBhdm9pZCBsb2NraW5nIGVycm9ycy4KKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmVkIHRoZSBtYWtlIFBpbmcgdGVzdCBUT0RPCisJCisyMDA1LTA5LTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL1B5dGhvbi5weXg6IEZpeGVkIG1lbW9yeSBsZWFrcyB3aGVuIHRocm93aW5nIGVycm9ycy4KKwlXZSBub3cgY29weSB0aGUgbWVzc2FnZSBmcm9tIGEgREJ1c0Vycm9yIGFuZCB0aGVuIGZyZWUgCisJdGhlIGVycm9yIG9iamVjdCBiZWZvciB0aHJvd2luZyB0aGUgZXJyb3IKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiByZW1vdmVkIGV4dHJhIGNvbW1hIGF0IHRoZSBlbmQgb2YgdGhlCisJREJ1c0JpbmRpbmdPdXRwdXRNb2RlIGVudW0gd2hpY2ggd2FzIGNhdXNpbmcgYSB3YXJuaW5nLgorCSNpbmNsdWRlIDx0aW1lLmg+IHNvIHVzaW5nIHRpbWVfdCBpcyBleHBsaWNpdGx5IGRlZmluZWQKKworMjAwNS0wOS0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogSW50ZWdyYXRlIHBhdGNoZXMgZnJvbSBMZW5uYXJ0IFBvZXR0ZXJpbmcgPG16c3FiIGF0IDBwb2ludGVyLmRlPjoKKwktIGRidXMvZGJ1cy1idXMuYworCShpbnRlcm5hbF9idXNfZ2V0KTogbmV3IG1ldGhvZCB0aGF0IHRha2Ugb3ZlciB0aGUgaGVhdnkgbGlmdGluZworCW9mIGRidXNfYnVzX2dldCBhbmQgYWRkcyB0aGUgYWJpbGl0eSB0byBnZXQgYSBwcml2YXRlIGNvbm5lY3Rpb24KKwl0byB0aGUgYnVzCisJKGRidXNfYnVzX2dldCk6IHdyYXBwZXIgdG8gaW50ZXJuYWxfYnVzX2dldCB0aGF0IHByb3ZpZGVzIHRoZSBzYW1lCisJaW50ZXJmYWNlIGFzIGluIHByZXZpb3VzIHZlcnNpb25zCisJKGRidXNfYnVzX2dldF9wcml2YXRlKTogbmV3IG1ldGhvZCB0aGF0IGlzIGEgd3JhcHBlciB0byAKKwlpbnRlcm5hbF9idXNfZ2V0IHRvIGdldCBhIHByaXZhdGUgY29ubmVjdGlvbiB0byB0aGUgYnVzCisKKwktIGRidXMvZGJ1cy1idXMuaAorCShkYnVzX2J1c19nZXRfcHJpdmF0ZSk6IGFkZCBhcyBhIHB1YmxpYyBsaWJkYnVzIGludGVyZmFjZQorCisJLSBkYnVzLTEucGMuaW46IG91dHB1dCBzeXN0ZW1fYnVzX2RlZmF1bHRfYWRkcmVzcyBhbmQgCisJc3lzY29uZmRpciB2YXJpYWJsZXMgc28gYXBwcyBjYW4gdXNlIHRoZW0gd2hlbiBjb21waWxpbmcKKworMjAwNS0wOS0yMyAgSGFyYWxkIEZlcm5lbmdlbCAgPGhhcnJ5QGtkZXZlbG9wLm9yZz4KKwkqIGRidXMvcXQ6IE5ldyBRdCBiaW5kaW5ncworCisyMDA1LTA5LTEyICBXYWxkbyBCYXN0aWFuICA8YmFzdGlhbkBrZGUub3JnPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jLAorCWRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sLCB0ZXN0L01ha2VmaWxlLmFtLAorCXRlc3QvdGVzdC1uYW1lcy5jOiBhbGxvdyBoeXBoZW5zIGluIGJ1cyBuYW1lcy4KKworMjAwNS0wOS0xMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIHRlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0OiB3ZSBkb24ndAorCXJldHJ5IHRoZSBFWFRFUk5BTCBtZXRob2Qgd2hlbiB3ZSBrbm93IGl0cyBnb2luZworCXRvIGZhaWwgYW55bW9yZS4KKworMjAwNS0wOS0xMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6IHJlbmFtZQorCShhZGR8cmVtb3ZlfHRvZ2dsZSlfKHdhdGNofHRpbWVvdXQpIHRvIHVubG9ja2VkKCkKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGRpdHRvLgorCQorCSogZGJ1cy9kYnVzLXRpbWVvdXQuYywgZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJVXBkYXRlIHNvbWUgY2FsbGVycyBmb3IgdGhlIHJlbmFtaW5nLgorCisyMDA1LTA5LTEwICBNYXJrIE1jTG91Z2hsaW4gIDxtYXJrQHNreW5ldC5pZT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogKHJlY29yZF9tZWNoYW5pc21zKTogZG9uJ3QKKwlyZXRyeSB0aGUgZmlyc3QgYXV0aCBtZWNoYW5pc20gYmVjYXVzZSB3ZSBrbm93CisJd2UncmUganVzdCBnb2luZyB0byBnZXQgcmVqZWN0ZWQgYWdhaW4uCisJCisJKiBkYnVzL2RidXMta2V5cmluZy5jOiAoX2RidXNfa2V5cmluZ19yZWxvYWQpOgorCUZpeCB0aGlua28gLi4uIGFuZCB3aGF0IGEgbmFzdHkgbGl0dGxlIGJ1Z2dlciB0bworCXRyYWNrIGRvd24geW91IHdlcmUgLi4uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKF9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoKSwKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2gpOiBhZGQgbm90ZSBhYm91dAorCXRoZXNlIG5lZWRpbmcgdGhlIGNvbm5lY3Rpb24gdG8gYmUgbG9ja2VkLgorCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOgorCXNldCBzdGF0dXMgdG8gREFUQV9SRU1BSU5TIHdoZW4gd2UgcXVldWUgdGhlCisJZGlzY29ubmVjdGVkIG1lc3NhZ2UuCisJCisJKiBidXMvZGlzcGF0Y2guYzoKKwkoYnVzX2Rpc3BhdGNoKTogZml4IHdhcm5pbmcuCisJKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk6CisJRXhwZWN0IENoaWxkU2lnbmFsZWQgZXJyb3IgdG9vLgorCShjaGVja19leGlzdGVudF9oZWxsb19mcm9tX3NlbGYpOiBmaXggYW5vdGhlcgorCWNvdXBsZSBvZiB3YXJuaW5ncy4KKwkKKzIwMDUtMDktMDggIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJUGF0Y2hlcyBmcm9tIEphbWVzIFdpbGxjb3ggPHNub3JwQHNub3JwLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbTogQWRkIEludDE2LmNzIGFuZCBVSW50MTYuY3MKKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jczogSGFuZGxlIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLCBhbmQKKwlzdXBwb3J0IGFycmF5ICJvdXQiIHBhcmFtZXRlcnMuCisKKwkqIG1vbm8vREJ1c1R5cGUvSW50MTYuY3MsIG1vbm8vREJ1c1R5cGUvVUludDE2LmNzOiBOZXcgZmlsZXMsCisJZm9yIDE2LWJpdCBpbnQgc3VwcG9ydC4KKworMjAwNS0wOS0wNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC41MAorCisJKiBQYXRjaCBmcm9tIFN0ZXZlIEdydWJiOgorCS0gYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9yZWxvYWRfdGVzdCk6IGNsZWFuIHVwCisJc29tZSBpbmRlbnRhdGlvbgorCS0gZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19yZWxvYWQpOiBmaXggY29uZGl0aW9uYWwgCisJLSBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgKGdlbmVyYXRlX3NwZWNpYWwpOiBmaXggYSBjb3VwbGUgb2YKKwlidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSB0ZXN0IHN1aXRlLiAgVGhpcyBpcyBub24gY3JpdGljYWwgYmVjYXVzZQorCWl0IGNhbiBub3QgYmUgZXhwbG9pdGVkIGFuZCB0aGlzIGNvZGUgaXMgb25seSBydW4gd2hlbiBkb2luZyBhIAorCW1ha2UgY2hlY2suCisKKwkqIFBhdGNoIGZyb20gWWFha292IFNlbGtvd2l0ejogQnVpbGQgZml4ZXMgZm9yIEN5Z3dpbgorCS0gY29uZmlndXJlLmluOiBEb24ndCBjaGVjayBhbmQgbGluayBhZ2FpbnN0IGtkZWNvcmUsIG9ubHkgcXQgaGVhZGVycworCS0gZGJ1cy9NYWtlZmlsZS5hbTogQWRkIC1uby11bmRlZmluZWQgdG8gbGliZGJ1c18xX2xhX0xERkxBR1MKKwktIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy9NYWtlZmlsZS5hbToKKwlhZGQgbGliZGJ1c19nY2pfMV9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZAorCS0gZ2xpYi9NYWtlZmlsZS5hbTogQWRkIC1uby11bmRlZmluZWQgdG8gbGliZGJ1c19nbGliXzFfbGFfTERGTEFHUworCWFuZCAkKERCVVNfR0xJQl9MSUJTKSB0byBkYnVzX2JpbmRpbmdfdG9vbF9MREFERAorCS0gcXQvTWFrZWZpbGUuYW06IEFkZCAtbm8tdW5kZWZpbmVkIHRvIGxpYmRidXNfcXRfMV9sYV9MREZMQUdTCisJLSB0b29scy9NYWtlZmlsZS5hbTogQWRkIHBsYXRmb3JtIGV4dGVudGlvbnMgdG8gYmluYXJpZXMgCisJKGkuZS4gLmV4ZSBvbiB3aW5kb3dzKQorCisJKiBjb25maWd1cmUuaW46IAorCS0gTWFrZSBpdCBzbyBpZiBubyBzdWl0YWJsZSB2ZXJzaW9uIG9mIHB5dGhvbiBpcyBmb3VuZCB3ZSBvbmx5IAorCWRpc2FibGUgYnVpbGRpbmcgcHl0aG9uIGluc3RlYWQgb2YgZXhpdGluZyB0aGUgY29uZmlndXJlIHNjcmlwdAorCS0gUmVxdWlyZSB2ZXJzaW9uIDIuNCBvZiBnbGliIGZvciBnbGliIGJpbmRpbmdzCisJLSBVcCB2ZXJzaW9uIHRvIDAuNTAKKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBTeW5jIHZlcnNpb24gd2l0aCBsaWJkYnVzIHRvICgwLDUwLDApCisJCisyMDA1LTA5LTA1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKGZpbmRfc3VidHJlZV9yZWN1cnNlKToKKwlhIGNvdXBsZSBvZiBvcHRpbWl6YXRpb25zIChidWcgIzcxMCk6CisJLSBkbyBhIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHRyZWUKKwktIGluc2VydCBhIG5ldyBjaGlsZCBhdCB0aGUgcmlnaHQgcGxhY2UgZGlyZWN0bHksIG5vIG5lZWQgZm9yCisJICBxc29ydCBhbnltb3JlCisJLSBkbyB0aGUgImRvdWJsZSBhbGxvYyIgdGhpbmcgd2hlbiBhbGxvY2F0aW5nIGNoaWxkcmVuCisKKzIwMDUtMDgtMzEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogQnJlYWsgb24gcHlyZXhjIGVycm9ycyBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZW0KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBNZW1vcnkgbWFuYWdlbWVudCBmb28KKwkoZ2xvYmFsKTogcmVtb3ZlIGhhY2t5IF91c2VyX2RhdGFfcmVmZXJlbmNlcyBnbG9iYWwgbGlzdAorCShHSUxfc2FmZV9jdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyKTogdXNlcmRhdGEgbm93IHN0dWZmZWQgaW50bworCXR1cGxlcy4gVW5yZWYgdXNlcl9kYXRhCisJKEdJTF9zYWZlX2NtZXNzYWdlX2Z1bmN0aW9uX2hhbmRsZXIpOiB1c2VyZGF0YSBub3cgc3R1ZmZlZCBpbnRvIHR1cGxlcworCShDb25uZWN0aW9uOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisJKENvbm5lY3Rpb246OmFkZF9maWx0ZXIpOiBTdHVmZiB1c2VyX2RhdGEgaW50byBhIHR1cGxlLiAgVXNlIFB5X0lOQ1JFRgorCXRvIGtlZXAgdHVwbGUgZnJvbSBiZWluZyBkZWFsbG9jYXRlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgdmFyIGhhY2sKKwkoQ29ubmVjdGlvbjo6cmVnaXN0ZXJfb2JqZWN0X3BhdGgpOiBTdHVmZiB1c2VyX2RhdGEgaW50byBhIHR1cGxlLgorCVVzZSBQeV9JTkNSRUYgdG8ga2VlcCB0dXBsZSBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkIGluc3RlYWQgb2YgdGhlIAorCWdsb2JhbCB2YXIgaGFjaworCShDb25uZWN0aW9uOjpyZWdpc3Rlcl9mYWxsYmFjayk6IFN0dWZmIHVzZXJfZGF0YSBpbnRvIGEgdHVwbGUuCisJVXNlIFB5X0lOQ1JFRiB0byBrZWVwIHR1cGxlIGZyb20gYmVpbmcgZGVhbGxvY2F0ZWQgaW5zdGVhZCBvZiB0aGUgCisJZ2xvYmFsIHZhciBoYWNrCisJKEdJTF9zYWZlX3BlbmRpbmdfY2FsbF9ub3RpZmljYXRpb24pOiBEb24ndCB1bnJlZiB0aGUgbWVzc2FnZQorCWJlY2F1c2UgaXQgZ2V0cyB1bnJlZmZlZCB3aGVuIGdvaW5nIG91dCBvZiBzY29wZS4gIFB5X1hERUNSRUYKKwl0aGUgdXNlcl9kYXRhCisJKFBlbmRpbmdDYWxsOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisJKFBlbmRpbmdDYWxsOjpzZXRfbm90aWZ5KTogcmVmIHRoZSBwZW5kaW5nIGNhbGwgYmVjYXVzZSB3ZSB3aWxsCisJbmVlZCBpdCB0byBzdGljayBhcm91bmQgZm9yIHdoZW4gdGhlIG5vdGlmeSBjYWxsYmFjayBnZXRzIGNhbGxlZAorCShNZXNzYWdlOjpfX2RlbF9fKTogUmVtb3ZlIGFuZCByZXBsYWNlIHdpdGggX19kZWFsbG9jX18gbWV0aG9kCisKKwkqIHB5dGhvbi9kYnVzX2dsaWJfYmluZGluZ3MucHl4IChpbml0X2d0aHJlYWRzKTogQ2hhbmdlZCB0byAKKwlndGhyZWFkc19pbml0IHRvIG1hdGNoIHVwIHdpdGggdGhlIGRidXMgY2FsbAorCisJKiBweXRob24vZ2xpYi5weSAoaW5pdF90aHJlYWRzKTogQ2hhbmdlZCB0byB0aHJlYWRzX2luaXQgdG8gbWF0Y2gKKwl1cCB3aXRoIGdvYmplY3QudGhyZWFkc19pbml0KCkuICBpbml0X3RocmVhZHMgaXMga2VwdCBmb3IgYmFja3dhcmRzCisJY29tcGF0IGJ1dCB3aWxsIG1vc3QgbGlrZWx5IGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZQorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogCisJLSByZXZhbXAgdG8gdXNlIFB5dGhvbidzIHVuaXR0ZXN0IGZ1bmN0aW9uYWxpdHkKKwktIGFkZCBhc3luYyBjYWxsIHRlc3RzCisJLSBzZXR1cCB0aHJlYWRzIGluIGdsaWIgYW5kIGRidXMgc28gd2UgbWFrZSBzdXJlIGxvY2tzIGFyZSB3b3JraW5nCisJCisyMDA1LTA4LTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXggCisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uLCBjdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyLCAKKwljbWVzc2FnZV9mdW5jdGlvbl9oYW5kbGVyKTogQWxsIGNhbGxiYWNrIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVhcnJhbmdlZCAKKwl0byB3b3JrYXJvdW5kIGEgYnVnIGluIFB5cmV4IHdoZW4gd29ya2luZyB3aXRoIHRoZSBHSUwgd2hpY2ggaXMgUHl0aG9uJ3MgCisJZ2xvYmFsIGxvY2sgd2hlbiBkZWFsaW5nIHdpdGggdGhyZWFkcy4gIFRoZXkgaGF2ZSBiZWVuIHNwbGl0IGludG8KKwlhIHdyYXBwZXIgZnVuY3Rpb24gKHdoaWNoIGFzc3VtZXMgdGhlIG5hbWUgb2YgdGhlIG9sZCBmdW5jdGlvbikgYW5kCisJYSBfR0lMX3NhZmVfPGZ1bmN0aW9uIG5hbWU+IGZ1bmN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsaXR5CisJb2YgdGhlIG9sZCBmdW5jdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IFB5cmV4IGRvZXMgbm90IHdyaXRlIGNvZGUKKwl0aGUgbG9jayBpcyByZWxlYXNlZC4KKwkKKworMjAwNS0wOC0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IChfcGVuZGluZ19jYWxsX25vdGlmaWNhdGlvbik6IE9idGFpbiB0aGUKKwlHSUwgZ2xvYmFsIGxvY2sgd2hlbiBjYWxsaW5nIGJhY2sgaW50byBQeXRob24KKworMjAwNS0wOC0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZSAwLjM2LjIKKworCSogQWRkIEhhdm9jJ3MgcGF0Y2ggdGhhdCBuZXZlciBnb3QgYXBwbGllZCB0byBIRUFEIChCdWcgIzI0MzYpOgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYWxsb3dfdXNlcik6IGNoYW5nZSBkZWZhdWx0ICJ1c2VyIGlzCisJYWxsb3dlZCIgdG8gYmUgInVzZXIgaGFzIHNhbWUgdWlkIGFzIHRoZSBidXMgaXRzZWxmIjsgYW55CisJYWxsb3cvZGVueSBydWxlcyB3aWxsIG92ZXJyaWRlLgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBkb24ndCBhbGxvdyBhbGwgdXNlcnMsIHNpbmNlIG5vdyBieSBkZWZhdWx0CisJdGhlIHVzZXIgdGhhdCByYW4gdGhlIGJ1cyBjYW4gY29ubmVjdC4KKworMjAwNS0wOC0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgKHByaW50X21lc3NhZ2UpOiBGbHVzaCBzdGRvdXQKKwlhZnRlciBwcmludGluZyBhIG1lc3NhZ2UsIHNvIHRoYXQgcmVkaXJlY3RpbmcgdG8gYSBmaWxlLCB0aGVuCisJaGl0dGluZyBDdHJsLUMgd29ya3MuCisKKzIwMDUtMDgtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogVHJhY2tlZCBkb3duIGEgbWFqb3IgbWVtbGVhayBhbmQgZml4ZWQgaXQKKwkoRW1wdHlNZXNzYWdlKTogbmV3IGNsYXNzIHRoYXQgc3ViY2xhc3NlcyBNZXNzYWdlLiAgVGhpcyBpcyBhIHdvcmthcm91bmQKKwl0byBhIFB5cmV4IGJ1ZyB0aGF0IGZhaWxzIHRvIGNhbGwgX19kZWxfXyB3aGVuIHRoZSBNZXNzYWdlIG9iamVjdCBnb2VzIG91dAorCW9mIHNjb3BlLiAgRm9yIHNvbWUgcmVhc29uIHN1YmNsYXNzaW5nIE1lc3NhZ2UgZml4ZXMgdGhpcyBidWcKKwkoQnVzOjpzZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogdXNlIEVtcHR5TWVzc2FnZSBpbnN0ZWFkIG9mIE1lc3NhZ2UKKwktIHMvTWVzc2FnZShfY3JlYXRlPTApL0VtcHR5TWVzc2FnZSBldmVyeXdoZXJlIGVsc2UKKwkKKwkqIHRlc3QvcHl0aG9uL3Rlc3Qte3NlcnZlcnxjbGllbnR9LnB5OiBhZGQgdGhlIHB5dGhvbi8ubGlicyBkaXJlY3RvcnkKKwl0byB0aGUgbG9va3VwIHBhdGggc28gZGJ1c19iaW5kaW5ncyBhbmQgZGJ1c19nbGliX2JpbmRpbmdzIGRvbid0CisJZ2V0IHBpY2tlZCB1cCBmcm9tIHRoZSBzeXN0ZW0KKworMjAwNS0wOC0yNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfY2FsbCk6IERvYyB1cGRhdGUsIHRoYW5rcworCXRvIFJ5YW4gTG9ydGllIGZvciB0aGUgc3VnZ2VzdGlvbi4KKworMjAwNS0wOC0yNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9weXRob246IEFkZCBweXRob24gcmVncmVzc2lvbiB0ZXN0CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QvcHl0aG9uL01ha2VmaWxlCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IEFkZCB0aGUgcHl0aG9uIGRpcmVjdG9yeSB0byBTVUJESVJTCisKKzIwMDUtMDgtMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2UgMC4zNi4xCisKKwkqIHB5dGhvbi9fZGJ1cy5weTogCisJKEludGVyZmFjZTo6Y29ubmVjdF90b19zaWduYWwpOiBwcm9waWdhdGUga2V5d29yZHMgZm9yIG1hdGNoIG9uIGFyZ3MKKwkoQnVzOjphZGRfc2lnbmFsX3JlY2VpdmVyKTogRml4IHR5cG8gcy9kYnVzX2ludGVmYWNlL2RidXNfaW50ZXJmYWNlCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU9iamVjdDo6Y29ubmVjdF90b19zaWduYWwpOgorCXByb3BpZ2F0ZSBrZXl3b3JkcyBmb3IgbWF0Y2ggb24gYXJncworCisJKiBNYWtlZmlsZS5hbTogcG9pbnQgZXZlcnl0aGluZyB0byBweWV4ZWNkaXIgc2luY2UgcHl0aG9uIGJvcmtzCisJb24gbXVsdGlsaWIKKworMjAwNS0wOC0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZSAwLjM2CisKKzIwMDUtMDgtMjMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogRG9uJ3QgbXVsdGlwbHktZGVmaW5lIEVYVFJBX0RJU1QuCisKKzIwMDUtMDgtMjMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2dsaWJfYmluZGluZ3MucHl4OiByZW9yZGVyIGltcG9ydHMgYW5kIGMgZGVmaW5pdGlvbnMKKwl0byBmaXggc29tZSB3cmFuaW5ncy4gV2Ugbm93IHVzZSBkYnVzX2JpbmRpbmdzLkRCdXNDb25uZWN0aW9uIGluc3RlYWQKKwlvZiBkZWZpbmluZyBEQnVzQ29ubmVjdGlvbiBvdXJzZWx2ZXMuCisKKzIwMDUtMDgtMTggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzLnB0aDogTmV3IHBhdGggZmlsZSB0byBmaXggdXAgcHJvYmxlbXMgd2hlbiBpbnN0YWxsaW5nCisJYyBsaWJyYXJpZXMgdG8gbGliNjQgYW5kIHB5dGhvbiBmaWxlcyB0byBsaWIuCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogaW5zdGFsbCBkYnVzLnB0aCBpbiB0aGUgY29ycmVjdCBzcG90CisKKzIwMDUtMDgtMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBDaGFuZ2VMb2c6IGNsZWFuIHVwIG15IGxhc3QgZW50cnkgYSBiaXQKKworCSogZG9jL2ludHJvc3BlY3QueHNsOiBOZXcgc3R5bGVzaGVldCBmb3IgY29udmVydGluZyBpbnRyb3NwZWN0aW9uIGRhdGEKKwlpbnRvIGJyb3dzZXIgcmVuZGVyYWJsZSB4aHRtbC4gQ29udHJpYnV0ZWQgYnkgTGVubmFydCBQb2V0dGVyaW5nLgorCisJKiBkb2MvaW50cm9zcGVjdC5kdGQ6IEZpeHVwcyBpbiB0aGUgaW50cm9zcGVjdCBmb3JtYXQgZnJvbSBMZW5uYXJ0CisJUG9ldHRlcmluZy4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiAKKwktIEFkZCBDb2xpbiBXYWx0ZXIgdG8gdGhlIEF1dGhvcnMgc2VjdGlvbiBmb3IgYXV0aG9yaW5nIHRoZSBHTGliCisJc2VjdGlvbgorCS0gQWRkIGRlc2NyaXB0aW9ucyBvZiB0aGUgbmV3IHNpZ25hdHVyZSBhbmQgdHlwZSBmdW5jdGlvbmFsaXR5CisJaW4gdGhlIFB5dGhvbiBjb21wbGV4IHR5cGUgbWFwcGluZyBzZWN0aW9uCisJLSBBZGQgYSBzaWRlbm90ZSBvbiB0aGUgbmV3IGFyZ3MgbWF0Y2hpbmcgZnVuY3Rpb25hbGl0eSBpbiAKKwl0aGUgUHl0aG9uIGJpbmRpbmdzCisJLSBGaXhlZCB1cCBzb21lIG9mIHRoZSBleGFtcGxlcyB0byB1c2UgdGhlIGdvYmplY3QuTWFpbkxvb3AKKwlpbnN0ZWFkIG9mIGd0ay5tYWluCisJCisJKiBweXRob24vX2RidXMucHk6CisJKEJ1czo6X2NyZWF0ZV9hcmdzX2RpY3QpOiBOZXcuIENvbnZlcnRzIGEgaGFzaCBvZiBhcmcgbWF0Y2hlcworCXRvIGEgbW9yZSB1c2VhYmxlIGZvcm1hdAorCShCdXM6OmFkZF9zaWduYWxfcmVjZWl2ZXIpOiBhZGQgYSAqKmtleXdvcmRzIHBhcmFtZXRlciBmb3IgY2F0Y2hpbmcKKwlhcmcgbWF0Y2ggcGFyYW1ldGVycworCShCdXM6OnJlbW92ZV9zaWduYWxfcmVjZWl2ZXIpOiBhZGQgYSAqKmtleXdvcmRzIHBhcmFtZXRlciBmb3IgY2F0Y2hpbmcKKwlhcmcgbWF0Y2ggcGFyYW1ldGVycworCQorCSogcHl0aG9uL21hdGNocnVsZXMucHk6CisJKE1hdGNoVHJlZTo6ZXhlY19tYXRjaGVzKTogQ2hlY2sgZm9yIGFyZyBtYXRjaGVzCisJKFNpZ25hbE1hdGNoUnVsZTo6YWRkX2FyZ3NfbWF0Y2gpOiBOZXcgbWV0aG9kCisJKFNpZ25hbE1hdGNoUnVsZTo6ZXhlY3V0ZSk6IEFkZGVkIGFyZ3NfbGlzdCBwYXJhbWV0ZXIgYXMgYW4gb3B0aW1pemF0aW9uCisJc28gd2UgZG9uJ3QgaGF2ZSB0byBtYXJzaGFsIHRoZSBhcmdzIG1vcmUgdGhhbiBvbmNlCisJKFNpZ25hbE1hdGNoUnVsZTo6bWF0Y2hfYXJnc19mcm9tX2xpc3QpOiBOZXcgbWV0aG9kIHRoYXQgY2hlY2tzIHRvIHNlZQorCWlmIHRoZSBydWxlJ3MgYXJnIG1hdGNoZXMgbWF0Y2ggYW4gYXJndW1lbnQgbGlzdC4gIE9ubHkgYXJndW1lbnRzCisJc2V0IGluIHRoZSBydWxlIGFyZSBjaGVja2VkLgorCShTaWduYWxNYXRjaFJ1bGU6Om1hdGNoX2FyZ3NfZnJvbV9ydWxlKTogTmV3IG1ldGhvZCB0aGF0IGNoZWNrcyB0byBzZWUKKwlpZiB0aGUgcnVsZSdzIGFyZyBtYXRjaGVzIG1hdGNoIGFub3RoZXIgcnVsZSdzLiAgQWxsIGFyZ3MgaGF2ZSB0byBtYXRjaAorCWluIG9yZGVyIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gdHJ1ZS4gIElmIGVpdGhlciBydWxlIGhhcyBtb3JlIGFyZ3MKKwl0aGVuIGl0IGlzIG5vdCBhIG1hdGNoLgorCShTaWduYWxNYXRjaFJ1bGU6OmlzX21hdGNoKTogQWRkIGFyZ3MgbWF0Y2gKKwkoU2lnbmFsTWF0Y2hSdWxlOjpyZXByKTogQWRkIGFyZ3MgdG8gdGhlIGZpbmFsIG91dHB1dCBpZiB0aGV5IGV4aXN0CisKKzIwMDUtMDgtMTcgIFJvc3MgQnVydG9uICA8cm9zc0BidXJ0b25pbmkuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJKGRidXNfZ19wcm94eV9jYWxsX25vX3JlcGx5KTogdW5yZWYgdGhlIG1lc3NhZ2Ugb25jZSBzZW50LgorCShkYnVzX2dfcHJveHlfY2FsbCk6IHByb3RlY3QgYWdhaW5zdCBOVUxMIHByb3h5LgorCisyMDA1LTA4LTE2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vX19pbml0X18ucHk6IFZlcnNpb24gdXBkYXRlZCAoMCwgNDMsIDApCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IAorCS0gRml4ZWQgdHlwZSBvYmplY3RzIHRvIGhhdmUgc2VsZiBwYXNzZWQgaW50byBfX2luaXRfXworCS0gQWRkZWQgdGhlIFZhcmlhbnQgdHlwZQorCS0gQWRkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgdHlwZXMgb3Igc2lnbmF0dXJlcyBmb3IgQXJyYXksIFZhcmlhbnQgCisJYW5kIERpY3Rpb25hcnkKKwkoQ29ubmVjdGlvbjo6c2VuZF93aXRoX3JlcGx5X2hhbmRsZXJzKTogcmV0dXJuIGEgUGVuZGluZ0NhbGwgb2JqZWN0CisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uKTogaGFuZGxlIHRoZSBjYXNlIHdoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQgCisJd2l0aG91dCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBib2R5CisJKE1lc3NhZ2VJdGVyOjpnZXRfYm9vbGVhbik6IHJldHVybiBUcnVlIG9yIEZhbHNlIGluc3RlYWQgb2YgYW4gaW50ZWdlcgorCShNZXNzYWdlSXRlcjo6cHl0aG9uX3ZhbHVlX3RvX2RidXNfc2lnKTogYWRkIGRpcmVjdCBjaGVja2luZyBvZiB0eXBlcyAKKwlhbmQgYWRkIGNoZWNrcyBmb3Igb2JqZWN0cyB3aXRoIGVtYmVkZWQgc2lnbmF0dXJlcyBvciB0eXBlcyAoQXJyYXksIAorCVZhcmlhbnQgYW5kIERpY3Rpb25hcnkpCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfYnl0ZSk6IGhhbmRsZSBjYXNlIHdoZW4gdGhlIHZhbHVlIGlzIGEgZGJ1cy5CeXRlCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfZGljdCk6IGhhbmRsZSBlbWJlZGVkIHR5cGVzIG9yIHNpZ25hdHVyZXMKKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF9hcnJheSk6IGhhbmRsZSBlbWJlZGVkIHR5cGVzIG9yIHNpZ25hdHVyZXMKKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZF92YXJpYW50KTogbmV3IG1ldGhvZAorCQorCSogcHl0aG9uL3Byb3hpZXMucHk6CisJKERlZmVyZWRNZXRob2QpOiBOZXcuIER1bW15IGV4ZWN1dGFibGUgb2JqZWN0IHVzZWQgd2hlbiBxdWV1aW5nIGNhbGxzIAorCWJsb2NraW5nIG9uIGludHJvc3BlY3Rpb24gZGF0YQorCShQcm94eU1ldGhvZDo6X19jYWxsX18pOiBhZGQgdGhlIHRpbWVvdXQga2V5d29yZCBmb3Igc3BlY2lmeWluZyBsb25nZXIgCisJb3Igc2hvcnRlciB0aW1lb3V0cyBmb3IgbWV0aG9kIGNhbGxzCisJKFByb3h5T2JqZWN0KTogQWRkIGZpcnN0IHBhc3MgYXQgYW4gaW50cm9zcGVjdGlvbiBzdGF0ZSBtYWNoaW5lCisJKFByb3h5T2JqZWN0OjpfX2luaXRfXyk6IEFkZCBpbnRyb3NwZWN0IGtleXdvcmQgZm9yIHR1cmluZyBvZmYgYW4gb24gCisJaW50cm9zcGVjdGlvbi4gCisJKFByb3h5T2JqZWN0OjpfSW50cm9zcGVjdCk6IEludGVybmFsIEludHJvc3BlY3QgY2FsbCB0aGF0IGJ5cGFzc2VzIAorCXRoZSB1c3VhbCBtZWNoYW5pc21zIGZvciBzZW5kaW5nIG1lc3NhZ2VzLiAgVGhpcyBpcyB0byBhdm9pZCBhIGRlYWRsb2NrCisJd2hlcmUgdGhlIEludG9zcGVjdCBjYWxsIHdvdWxkIGJlIHF1ZXVlZCB3YWl0aW5nIGZvciB0aGUgSW50cm9zcGVjdCAKKwljYWxsIHRvIGZpbmlzaCA7LSkKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X3JlcGx5X2hhbmRsZXIpOiBOZXcuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisJd2hlbiBpbnRyb3NwZWN0aW9uIHJldHVybnMgd2l0aCBubyBlcnJvcgorCShQcm94eU9iamVjdDo6X2ludHJvc3BlY3RfZXJyb3JfaGFuZGxlcik6IE5ldy4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAKKwl3aGVuIGludHJvc3BlY3Rpb24gZW5jb3VudGVycyBhbiBlcnJvcgorCShQcm94eU9iamVjdDo6X19nZXRhdHRyX18pOiBDb2RlIHRvIGhhbmRsZSBkaWZmZXJlbnQgaW50cm9zcGVjdGlvbiAKKwlzdGF0ZXMuICBRdWV1ZSBhc3luYyBjYWxscyBvciBibG9jayBibG9ja2luZyBjYWxscyBpZiB3ZSBhcmUgCisJaW50cm9zcGVjdGluZy4gIFBhc3MgdGhyb3VnaCBhcyBub3JtYWwgaWYgd2UgYXJlIG5vdCBvciBhcmUgZG9uZSB3aXRoIAorCWludHJvc3BlY3RpbmcuCisJCisJKiBweXRob24vc2VydmljZS5weTogSW1wb3J0IHNpZ25hbCBhbmQgbWV0aG9kIGZyb20gZGVjb3JhdG9ycy5weQorCisJKiBweXRob24vdHlwZXMucHk6IEFkZCBWYXJpYW50IHR5cGUKKworMjAwNS0wOC0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZGJ1c19zZXRfZ19lcnJvcik6IERvbid0IGxvc2UgaWYgdGhlCisJREJ1c0Vycm9yIG1lc3NhZ2UgaXMgTlVMTC4KKworMjAwNS0wOC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogYXBwbHkgcGF0Y2ggZnJvbSBUaW1vIFRlcmFzIHRvIG1ha2UgYQorCW1hbGxvYydkIGNvcHkgb2YgdGhlIG5hbWUgcGFyYW1ldGVyCisKKzIwMDUtMDgtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCk6IHByaW50CisJd2FybmluZyBpZiB0aGUgcmVwbHkgc2VyaWFsIGlzIHNldCB0byAwCisKKzIwMDUtMDgtMDQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuaCAoX2RidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQpCisJKGRidXNfZ190eXBlX2lzX2ZpeGVkLCBkYnVzX2dfdHlwZV9maXhlZF9nZXRfc2l6ZSkKKwkoZGJ1c19ndmFsdWVfc2V0X2Zyb21fcG9pbnRlciwgZGJ1c19nX2hhc2hfdGFibGVfdmFsdWVfZm9yZWFjaCkKKwkoZGJ1c19nX2hhc2hfdGFibGVfaW5zZXJ0X3ZhbHVlcywgZGJ1c19nX2hhc2hfdGFibGVfaW5zZXJ0X3N0ZWFsX3ZhbHVlcykKKwkoZGJ1c19ndHlwZV9pc192YWxpZF9oYXNoX2tleSwgZGJ1c19ndHlwZV9pc192YWxpZF9oYXNoX3ZhbHVlKQorCShkYnVzX2dfaGFzaF9mdW5jX2Zyb21fZ3R5cGUsIGRidXNfZ19oYXNoX2ZyZWVfZnJvbV9ndHlwZSkKKwkoZGJ1c19nX2hhc2hfZXF1YWxfZnJvbV9ndHlwZSwgZGJ1c19ndmFsdWVfc3RvciwgZGJ1c19ndmFsdWVfdGFrZSk6CisJKiBnbGliL2RidXMtZ3ZhbHVlLmggKGRidXNfZ192YWx1ZV90eXBlc19pbml0KQorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWwsIGRidXNfZ3ZhbHVlX2RlbWFyc2hhbF92YXJpYW50KQorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZSwgZGJ1c19ndmFsdWVfbWFyc2hhbCk6CisJCisJUHJlZml4IG5hbWUgd2l0aCBfIHRvIGVuc3VyZSB0aGV5J3JlIG5vdCBleHBvcnRlZC4gIEFsbCBjYWxsZXJzCisJdXBkYXRlZC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jICh0eXBlY29kZV90b19ndHlwZSkKKwkoZGJ1c190eXBlY29kZV9tYXBzX3RvX2Jhc2ljLCBiYXNpY190eXBlY29kZV90b19ndHlwZSkKKwkoc2lnbmF0dXJlX2l0ZXJfdG9fZ190eXBlX2RpY3QpCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSkKKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyLCBkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlc19mcm9tX2FyZ19zaWduYXR1cmUpOgorCU1vdmUgdG8gZGJ1cy1nc2lnbmF0dXJlLmMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9zZXJ2ZXIpOiBDYWxsCisJZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfYnVpbHRpbnNfaW5pdCBpbnN0ZWFkIG9mIGRidXNfZ192YWx1ZV90eXBlc19pbml0LgorCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQpOiBEaXR0by4KKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoREJVU19HTElCX0lOVEVSTkFMUyk6IEFkZCBkYnVzLWdzaWduYXR1cmUuYworCWFuZCBkYnVzLWdzaWduYXR1cmUuaAorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAobXlfb2JqZWN0X3JlY19hcnJheXMpOiBEZWxldGUKKwl1bnVzZWQgdmFyaWFibGUuCisKKzIwMDUtMDgtMDMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEFkZCB0ZXN0cyBvbiBoYXJkY29kZWQgb2JqZWN0IGluZm87IHRoaXMgc2hvdWxkCisJY2F0Y2ggYW55IGluY29tcGF0aWJsZSBjaGFuZ2VzIGFjY2lkZW50YWxseSBtYWRlLgorCisyMDA1LTA4LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6IGZpeAorCXR5cG8sIGZyb20gSnVsaWVuIFB1eWR0CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCk6IHdlIHdlcmUgYWx3YXlzCisJZG9pbmcgYSB3YWl0X2Zvcl9tZW1vcnkgZHVlIHRvIGEgYnVnZ3kgbG9vcCwgZm91bmQgYnkgVGltbyBIb2VuaWcKKworMjAwNS0wOC0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSm9lIE1hcmt1cyBDbGFya2U6CQorCQorCSogZ2xpYi9kYnVzLWdpZGwuYyAocHJvcGVydHlfaW5mb191bnJlZiwgYXJnX2luZm9fdW5yZWYpOiBGaXgKKwl1c2UtYWZ0ZXItZnJlZS4KKworMjAwNS0wOC0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIEpvZSBNYXJrdXMgQ2xhcmtlOgkKKwkKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluKTogCisJCisJRG9uJ3QgdXNlIEM5OSBzdHlsZSBpbml0aWFsaXplcnMgKGJ1ZyAjMzkzMykuCisJCisyMDA1LTA4LTAxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggZnJvbSBKb2UgTWFya3VzIENsYXJrZToJCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQpOiAKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfYnVpbHRpbnNfaW5pdCkgCisJKiBnbGliL2RidXMtZ29iamVjdC5jICh3cml0ZV9pbnRlcmZhY2UpOgorCisJRG9uJ3QgdXNlIEM5OSBzdHlsZSBpbml0aWFsaXplcnMgKGJ1ZyAjMzkzMykuCisKKzIwMDUtMDctMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXZpZXdlci5jIChsb2FkX2NoaWxkX25vZGVzKTogZml4IGludm9jYXRpb24gb2YKKwlkYnVzX2dfcHJveHlfY2FsbCwgZml4IGZyb20gUGlvdHIgWmllbGluc2tpIGJ1ZyAjMzkyMAorCisyMDA1LTA3LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZml4IGEgYnVuY2ggb2YgRG94eWdlbiB3YXJuaW5ncyBhbmQgbWlzdGFrZXMKKworMjAwNS0wNy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19wYXJzZV91aW50KTogcmVtb3ZlICNpZmRlZgorCURCVVNfQlVJTERfVEVTVFMgc2luY2UgaXQncyBub3cgdXNlZCBpbiBwcm9kdWN0aW9uIGNvZGUKKworMjAwNS0wNy0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAod3JpdGVfanVuayk6IGluaXRpYWxpemUgdGhlIGp1bmsKKwlidWZmZXIgc28gdmFsZ3JpbmQgZG9lc24ndCBoYXZlIGEgYnJlYWtkb3duCisKKzIwMDUtMDctMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvc2lnbmFscy5jIChidXNfc2lnbmFsc190ZXN0KTogYWRkIG1hdGNoX3J1bGVfZXF1YWwoKSB0ZXN0cworCShtYXRjaF9ydWxlX21hdGNoZXMpOiByZW1vdmUgdW51c2VkIGFyZworCSh0ZXN0X21hdGNoaW5nKTogYWRkIHRlc3RzIGZvciBtYXRjaF9ydWxlX21hdGNoZXMoKQorCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZV9hcmdfbWF0Y2gpOiBhZGQgYWJpbGl0eSB0bworCWRvIGFyZzA9J2ZvbycgYXJnNT0nYmFyJyBpbiB0aGUgbWF0Y2ggcnVsZXMKKwkobWF0Y2hfcnVsZV9tYXRjaGVzKTogZG9uJ3QgbWF0Y2ggaWYgdGhlIGFyZzA9J2ZvbycgZG9lc24ndCBtYXRjaC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0FSR19OVU1CRVIpOiBhZGQgdGhpcworCisyMDA1LTA3LTI5ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJRG9uJ3QgY3JlYXRlIGEgREJ1c0NvbmRWYXIgd2hpY2ggaXMgbmV2ZXIgdXNlZC4KKworMjAwNS0wNy0yNyAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCVJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBjYWNoZWQgbWVzc2FnZSB0byAxMEsuCisKKzIwMDUtMDctMjUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCVJlbW92ZSBtYXRjaGVzIHdoZW4gYWxsIHByb3hpZXMgYXJlIHVucmVnaXN0ZXJlZC4KKworMjAwNS0wNy0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfYXJyYXkpOiBEb24ndCByZXF1aXJlCisJdHlwZWRhdGE7IHJlY3Vyc2l2ZSBhcnJheXMgd29uJ3QgaGF2ZSBpdC4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IEFkZCByZWN1cnNpdmUgYXJyYXlzIHRlc3RzLgorCQorMjAwNS0wNy0yMCAgSm9obiAoSjUpIFBhbG1pZWlyICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19kYnVzLnB5LCBfdXRpbC5weSwgZGVjb3JhdG9ycy5weSwgZXh0cmFjdC5weSwgbWF0Y2hydWxlcy5weS4KKwlwcm94aWVzLnB5LCBzZXJ2aWNlLnB5OiBDbGVhbnVwIG9mIGNvZGUgYWZ0ZXIgcnVubmluZyBpdCB0aHJvdWdoIHRoZQorCXB5Zmxha2VzIGNvZGUgY2hlY2tlciBtb3N0bHkgZGVhbGluZyB3aXRoIHVuZGVmaW5lZCBuYW1lcy4gIAorCShCdWcgIzM4MjgsIFBhdGNoIGZyb20gQW50aG9ueSBCYXh0ZXIgPGFudGhvbnlAaW50ZXJsaW5rLmNvbS5hdT4pCisKKzIwMDUtMDctMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1LjIKKworMjAwNS0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19kYnVzLnB5OiBSZW1vdmUgaW1wb3J0IG9mIHRoZSBkYnVzLnNlcnZpY2VzCisJbW9kdWxlIGFzIGl0IG5vIGxvbmdlciBleGlzdHMgKHBhdGNoIGZyb20gRGltaXR1ciBLaXJvdikKKworCSogcHl0aG9uL3NlcnZpY2UucHkgKE9iamVjdDo6X19pbml0X18pOiBGaXhlZCB0eXBvCisJcy9uYW1lL2J1c19uYW1lIChwYXRjaCBmcm9tIERpbWl0dXIgS2lyb3YpCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnB5OiBpbXBvcnQgZGJ1cy5nbGliCisJdG8gZ2V0IHRoZSBtYWluIGxvb3AgYW5kIHVzZSBnbGliIG1haW5sb29wIGluc3RlYWQgb2YgZ3RrIHNvCisJWCBkb2Vzbid0IGhhdmUgdG8gYmUgcnVubmluZy4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLXJlY2lwaWVudC5weTogaW1wb3J0IGRidXMuZ2xpYgorCXRvIGdldCB0aGUgbWFpbiBsb29wIGFuZCB1c2UgZ2xpYiBtYWlubG9vcCBpbnN0ZWFkIG9mIGd0ayBzbworCVggZG9lc24ndCBoYXZlIHRvIGJlIHJ1bm5pbmcuIEltcG9ydCB0aGUgZGVjb3JhdG9ycyBtb2R1bGUKKwlkaXJlY3RseS4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtOiAgQWRkZWQgRElTVF9FWFRSQSBmaWxlcyB0aGF0IGRpc3RjaGVjaworCWRpZG4ndCBwaWNrIHVwIG9uIGJ1dCBhcmUgbmVlZGVkIHRvIGJ1aWxkCisKKwkqIGNvbmZpZ3VyZS5pbjogdXBwZWQgdmVyc2lvbiB0byAwLjM1LjIKKworCSogYnVzL2RyaXZlci5jLCBidXMvc2VsaW51eC5jLCBidXMvc2VsaW51eC5oLCBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlhZGRlZCBDb2xpbiBXYWx0ZXJzJyBTRUxpbnV4IEFQSSByZW5hbWUgcGF0Y2ggZnJvbSBoZWFkIAorCXMvdW5peCBzZXJjdXJpdHkgY29udGV4dC9zZWxpbnV4IHNlY3VyaXR5IGNvbnRleHQvCisKKzIwMDUtMDctMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogZGJ1c19iaW5kaW5nLnB4ZC5pbiBzaG91bGQgYmUgaW5jbHVkZWQgCisJaW4gRVhUUkFfRElTVCBub3QgZGJ1c19iaW5kaW5nLnB4ZAorCWZpeCB1cCAkKHNyY2RpcikgaG9wZWZ1bGx5IGZvciB0aGUgbGFzdCB0aW1lCisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1LjEKKworMjAwNS0wNy0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQpOiBSZW5hbWVkCisJZnJvbSBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3NlY3VyaXR5X2NvbnRleHQuICBVcGRhdGUgZm9yCisJZXJyb3IgdXNhZ2UuCisJKG1lc3NhZ2VfaGFuZGxlcnMpOiBVcGRhdGUgZm9yIHJlbmFtZXMuCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2FsbG93c19zZW5kKTogSGFuZGxlIE9PTSBvbgorCV9kYnVzX3N0cmluZ19pbml0IGZhaWx1cmUgY29ycmVjdGx5LgorCShidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCk6IENvbnZlcnQgU0lEIHRvIGNvbnRleHQuICBBcHBlbmQgaXQKKwlhcyBhIGJ5dGUgYXJyYXkuCisJKGJ1c19zZWxpbnV4X3NodXRkb3duKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGJ1c19zZWxpbnV4X2Z1bGxfaW5pdAorCWhhc24ndCBiZWVuIGNhbGxlZC4KKworCSogYnVzL3NlbGludXguaDogVXBkYXRlIHByb3RvdHlwZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfU0VMSU5VWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04pOiBSZW5hbWVkCisJZnJvbSBEQlVTX0VSUk9SX1VOSVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOLgorCisyMDA1LTA3LTE1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogQWRkIG5vdGUgYWJvdXQgY29udmVuaWVuY2Ugd3JhcHBlcnMuCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM1CisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEFkZCBtYWtlLWRidXMtZ2xpYi1lcnJvci1zd2l0Y2guc2ggdG8gRVhUUkFfRElTVAorCXNvIGRpc3RjaGVjayBkb2Vzbid0IGZhaWwKKworCSogZ2xpYi9leGFtcGxlcy9NYWtlZmlsZS5hbTogQWRkIGV4YW1wbGUtc2VydmljZS54bWwgYW5kIAorCWV4YW1wbGUtc2lnbmFsLWVtaXR0ZXIueG1sIHRvIEVYVFJBX0RJU1Qgc28gZGlzdGNoZWNrIGRvZXNuJ3QgZmFpbAorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9NYWtlZmlsZS5hbTogQWRkIHN0YXRlbWFjaGluZS54bWwgYW5kCisJc3RhdGVtYWNoaW5lLXNlcnZlci54bWwgdG8gRVhUUkFfRElTVCBzbyBkaXN0Y2hlY2sgZG9lc24ndCBmYWlsCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogUHJlcHJlbmQgJChzcmNkaXIpLyB0byBzb3VyY2UgZmlsZXMgc28gdGhlCisJY29tcGlsZXIgbG9va3MgaW4gdGhlIHJpZ2h0IHBsYWNlcyBkdXJpbmcgZGlzdGNoZWNrCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZXhhbXBsZS9NYWtlZmlsZS5hbTogRml4IGEgdHlwbyB3aGljaCBjYXVzZSBtYWtlIGRpc3RjaGVjaworCXRvIGZhaWwKKworMjAwNS0wNy0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogRml4ZWQgdXAgZXhhbXBsZXMKKwlmb3IgQVBJIGNoYW5nZXMKKworMjAwNS0wNy0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBVcHBlZCB0byB2ZXJzaW9uICgwLDQyLDApIGJlY2F1c2Ugb2YKKwl0aGUgQVBJIGNoYW5nZQorCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBDaGFuZ2VMb2c6IGZpeCBkYXRlIGluIGxhc3QgZW50cnkKKworCSogY29uZmlndXJlLmluLCBidXMvc3lzdGVtLmNvbmYuaW46IGFkZCB0aGUgYWJpbGl0eSB0byBjb25maWd1cmUgCisJdGhlIHN5c3RlbSBidXMgdXNlciBhdCBjb21waWxldGltZSB3aXRoIHRoZSAtLXdpdGgtZGJ1cy11c2VyIGZsYWcKKwkocGF0Y2ggZnJvbSBLcmlzdG9mIFZhbnNhbnQpCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jLCB0ZXN0L3Rlc3Qtc2VydmljZS5jOiBBZGQgdGVzdGNhc2UKKwlmb3Igc2VuZGluZyBtZXNzYWdlcyB0byBvbmVzZWxmIChUT0RPIGl0ZW0pLgorCisJKiBweXRob24vc2VydmljZS5weSAoY2xhc3MgT2JqZWN0KTogU3dhcCBvcmRlcmluZyBvZiBidXNfbmFtZSAKKwlhbmQgb2JqZWN0X3BhdGggcGFyYW1ldGVycyB0byBiZXR0ZXIgc3VwcG9ydCBpbmhlcml0YW5jZS4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiBjaGFuZ2UgUHl0aG9uIGRvY3MgdG8gcmVmbGVjdCBjaGFuZ2UKKwlpbiBwYXJhbWV0ZXIgb3JkZXJpbmcgYW5kIGZpeCB0aGUgaW5oZXJpdGFuY2Ugc2VjdGlvbi4KKworCSogZG9jL1RPRE86IHJlbW92ZSBzZW5kaW5nIG1lc3NhZ2UgdG8gb25lc2VsZiBUT0RPIGl0ZW0KKworMjAwNS0wNy0xNSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6CisJRml4IGEgbGVhayB3aGVuIGNhbGxpbmcgbWV0aG9kcyB2aWEgdGhlIHByb3h5LgorCisyMDA1LTA3LTE1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCk6IFdyYXAgaW4KKwlIQVZFX1NFTElOVVguCisKKzIwMDUtMDctMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fZGJ1cy5weSAoQnVzOjpyZW1vdmVfc2lnbmFsX3JlY2VpdmVyKToKKwlkb24ndCBhZGQgYSBjYWxsYmFjayB0byB0aGUgbWF0Y2ggaWYgbm9uZSBoYXMgYmVlbiBwYXNzZWQgaW4KKwkKKwkqIHB5dGhvbi9tYXRjaHJ1bGVzLnB5IChTaWduYWxNYXRjaFRyZWU6OnJlbW92ZSk6IGlmIHRoZSBydWxlCisJYmVpbmcgbWF0Y2hlZCBkb2VzIG5vdCBoYXZlIGEgY2FsbGJhY2sgdHJlYXQgaXQgYXMgYSB3aWxkY2FyZAorCWZpeCBtYXRjaGluZyBsb2dpYworCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IEFkZCBQeXRob24gdHV0b3JpYWwKKworMjAwNS0wNy0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL2RyaXZlci5jCisJKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfc2VjdXJpdHlfY29udGV4dCk6IE5ldyBmdW5jdGlvbi4KKwkobWVzc2FnZV9oYW5kbGVycyk6IEFkZC4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQpOiBOZXcgZnVuY3Rpb247IGFwcGVuZHMKKwlzZWN1cml0eSBjb250ZXh0IHRvIG1lc3NhZ2UuCisKKwkqIGJ1cy9zZWxpbnV4Lmg6IFByb3RvdHlwZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfVU5JWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04pOiBOZXcuCisKKzIwMDUtMDctMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGNsZWFuIHVwIGFsbCB0YWJzIHRvIGJlIDggc3BhY2VzIAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKTogbWFrZSBzdXJlIHdlIGNsZWFuIHVwCisJaWYgYWN0aXZhdGlvbiBmYWlscworCisJKiBidXMvZGlzcGF0Y2guYzogY2xlYW4gdXAgYWxsIHRhYnMgdG8gYmUgOCBzcGFjZXMgCisJKGNoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0KTogTmV3IGZ1bmN0aW9uCisJdGVzdHMgdG8gbWFrZSBzdXJlIHdlIGdldCBmYWlsIHByb3Blcmx5IHdoZW4gdHJ5aW5nIHRvIGF1dG8gc3RhcnQgYSBzZXJ2aWNlCisJd2l0aCBhIGZhdWx0eSBjb21tYW5kIGxpbmUKKwkoY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQpOiBOZXcgZnVuY3Rpb24gdGVzdHMgdG8gbWFrZSBzdXJlCisJYXV0byBzdGFydGVkIHNlcnZpY2VzIGdldCB0aGUgYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUKKworCSogdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYzogQWRkZWQgc2VydmljZSBmb3IgdGVzdGluZyBhdXRvLXN0YXJ0aW5nIHdpdGggCisJY29tbWFuZCBsaW5lIGFyZ3VtZW50cworCisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zaGVsbC1lY2hvLWZhaWwuc2VydmljZS5pbiwgCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvZGVidWctc2hlbGwtZWNoby1zdWNjZXNzLnNlcnZpY2UuaW46CisJQWRkZWQgc2VydmljZSBmaWxlcyBmb3IgdGVzdGluZyBhdXRvLXN0YXJ0aW5nIHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50cworCisJKiAqLy5jdnNpZ25vcmU6IGFkZGVkIGEgYnVuY2ggb2YgZ2VuZXJhdGVkIGZpbGVzIHRvIHZhcmlvdXMgLmN2c2lnbm9yZSBmaWxlcworCisyMDA1LTA3LTE0ICBSb2RyaWdvIE1veWEgIDxyb2RyaWdvQG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1zaGVsbC5bY2hdOiBjb3B5L3Bhc3RlZCBjb2RlIGZyb20gR0xpYi4KKwkKKwkqIGRidXMvTWFrZWZpbGUuYW06IGFkZGVkIG5ldyBmaWxlcyB0byBidWlsZC4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IHN1cHBvcnQKKwlhY3RpdmF0aW9uIGNvbW1hbmRzIHdpdGggcGFyYW1ldGVycy4KKworCSogdGVzdC9zaGVsbC10ZXN0LmM6IGFkZGVkIHRlc3QgcHJvZ3JhbSBmb3IgdGhlIHNoZWxsIHBhcnNpbmcKKwljb2RlLgorCisyMDA1LTA3LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChhcHBlbmRfYXJnLCB0eXBlX2Zyb21fbmFtZSk6IEFsc28gc3VwcG9ydCAxNiBhbmQKKwk2NCBiaXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBwYXJhbWV0ZXJzCisKKzIwMDUtMDctMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi8uY3ZzaWdub3JlOiByZW1vdmUgZGJ1c19iaW5kaW5ncy5weXgsIGFkZCBkYnVzX2JpbmRpbmdzLnB4ZAorCisJKiBweXRob24vc2VydmljZS5weSAoY2xhc3MgTmFtZSk6IHJlbmFtZWQgQnVzTmFtZSB0byBtYWtlIGl0IGNsZWFyZXIKKwl3aGF0IHRoZSBvYmplY3QgaXMgZm9yIChhIG5hbWUgb24gdGhlIGJ1cykKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogY2hhbmdlIHRoZSBOYW1lIG9iamVjdCB0bworCUJ1c05hbWUKKworMjAwNS0wNy0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSmltIEdldHR5cyA8SmltLkdldHR5c0BocC5jb20+LgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBJbmNsdWRlIHN5cy9zZWxlY3QuaC4KKworMjAwNS0wNy0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogcmVtb3ZlZAorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IEFkZGVkLgorCS0gRml4ZWQgc29tZSBtZW1sZWFrcyAocGF0Y2ggZnJvbSAKKwlTZWFuIE1laW5lcnMgPHNlYW4ubWVpbmVyc0BsaW5zcGlyZWluYy5jb20+KQorCS0gQnJva2Ugb3V0IHRoZSAjaW5jbHVkZSAiZGJ1c19oX3dyYXBwZXIuaCIgYW5kIHB1dCBpdCBpbiBpdHMKKwlvd24gcHhkIGZpbGUgKFB5cmV4IGRlZmluaXRpb24pCisJLSBCcm9rZSBvdXQgZ2xpYiBkZXBlbmRhbmNpZXMgaW50byBpdHMgb3duIHB5eCBtb2R1bGUKKwkKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnBkeDogQWRkZWQuCisJLSBEZWZpbmVzIEMgY2xhc3MgQ29ubmVjdGlvbiBmb3IgZXhwb3J0aW5nIHRvIG90aGVyIG1vZHVsZXMKKworCSogcHl0aG9uL2RidXNfZ2xpYl9iaW5kaW5ncy5weXg6IEFkZGVkLgorCS0gTmV3IG1vZHVsZSB0byBoYW5kbGUgbG93bGV2ZWwgZGJ1cy1nbGliIG1haW5sb29wIGludGVncmF0aW9uCisKKwkqIHB5dGhvbi9nbGliLnB5OiBBZGRlZC4KKwktIFJlZ2lzdGVycyB0aGUgZ2xpYiBtYWlubG9vcCB3aGVuIHlvdSBpbXBvcnQgdGhpcyBtb2R1bGUKKworCSogcHl0aG9uL3NlcnZpY2VzLnB5OiBSZW1vdmVkIChyZW5hbWVkIHRvIHNlcnZpY2UucHkpCisJCisJKiBweXRob24vc2VydmljZS5weTogQWRkZWQuCisJLSAoY2xhc3MgU2VydmVyKTogcmVuYW1lZCBOYW1lCisKKwkqIHB5dGhvbi9fX2luaXRfXy5weTogQnVtcCBybyB2ZXJzaW9uICgwLDQxLDApCisJLWRvbid0IGltcG9ydCB0aGUgZGVjb3JhdG9ycyBvciBzZXJ2aWNlIG1vZHVsZQorCWJ5IGRlZmF1bHQuICBUaGVzZSBub3cgcmVzaWRlIGluIHRoZSBkYnVzLnNlcnZpY2UgbmFtZXNwYWNlCisKKwkqIHB5dGhvbi9fZGJ1cy5weSAoQnVzOjpfX2luaXRfXyk6IEFkZCBjb2RlIHJ1biB0aGUgbWFpbiBsb29wIAorCXNldHVwIGZ1bmN0aW9uIG9uIGNyZWF0aW9uIAorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnB5OiB1cGRhdGUgZXhhbXBsZXMKKworCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHksCisJcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UyLnB5OiBUT0RPIGZpeCB0aGVzZSB1cAorCisJKiBkb2MvVE9ETzogQWRkaXRpb24KKwktIEFkZGVkIGEgUHl0aG9uIEJpbmRpbmdzIDEuMCBzZWN0aW9uCisJLSBhZGRlZCAiQWRkIG1hdGNoIG9uIGFyZ3Mgb3IgbWF0Y2ggb24gZGV0YWlscyB0byBtYXRjaCBydWxlcyIKKworCisyMDA1LTA3LTEyICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9NYWtlZmlsZS5hbSAoc3RhdGVtYWNoaW5lLXNlcnZlci1nbHVlLmgpIAorCShzdGF0ZW1hY2hpbmUtZ2x1ZS5oKTogCisJKiBnbGliL2V4YW1wbGVzL01ha2VmaWxlLmFtIChleGFtcGxlLXNlcnZpY2UtZ2x1ZS5oKSAKKwkoZXhhbXBsZS1zaWduYWwtZW1pdHRlci1nbHVlLmgpOiAKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGRidXMtZ2xpYi1lcnJvci1zd2l0Y2guaCk6IAorCUFkZCBsaWJ0b29sIC0tbW9kZT1leGVjdXRlIHNvIHdlIHVzZSB0aGUgYnVpbHQgbGlicmFyeSBpbnN0ZWFkCisJb2YgYW55IGluc3RhbGxlZCBvbmUuCisKKzIwMDUtMDctMTEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoc3RydWN0IF9EQnVzR1ZhbHVlKTogRGVsZXRlLgorCShkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCk6IFJlbW92ZSBhc3NlcnRpb24uCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlLCBkYnVzX2dfdmFsdWVfb3BlbikKKwkoZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZXMsIGRidXNfZ192YWx1ZV9nZXRfc2lnbmF0dXJlKQorCShkYnVzX2dfdmFsdWVfY29weSwgZGJ1c19nX3ZhbHVlX2ZyZWUpOiBEZWxldGUgdW5pbXBsZW1lbnRlZAorCWZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNHVmFsdWUuICBOb3cgd2UgbWFyc2hhbC9kZW1hcnNoYWwKKwlzdHJ1Y3R1cmVzIGFzIEdWYWx1ZUFycmF5LgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBSZXR1cm4gR19UWVBFX1ZBTFVFX0FSUkFZIGZvcgorCXN0cnVjdHVyZXMuCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSk6IERvbid0IGNhbGwKKwlzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfc3RydWN0LgorCShzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfc3RydWN0KTogRGVsZXRlLgorCShkYnVzX2d2YWx1ZV90b19zaWduYXR1cmUpOiBEZWxldGUuCisJKGRidXNfZ3ZhbHVlX3RvX3NpZ25hdHVyZSk6IE5ldyBmdW5jdGlvbiB3aXRoIHNhbWUgbmFtZSBhcyBvdGhlcgorCW9uZTsgd2UgY2FuIGNvbnZlcnQgc3RydWN0dXJlcyB0byBzaWduYXR1cmVzLgorCShkZW1hcnNoYWxfdmFsdWVhcnJheSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X3R5cGVfZGVtYXJzaGFsbGVyKTogVXNlIGl0LgorCShkZW1hcnNoYWxfcmVjdXJzZSk6IERlbGV0ZS4KKwkobWFyc2hhbF9wcm94eSk6IE5ldyBmdW5jdGlvbi4KKwkobWFyc2hhbF9tYXApOiBXYXJuIGlmIHdlIGNhbid0IGRldGVybWluZSBzaWduYXR1cmUgZnJvbSB0eXBlLgorCShtYXJzaGFsX2NvbGxlY3Rpb25fcHRyYXJyYXkpOiBEaXR0by4KKwkobWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5KTogRGl0dG8uCisJKGdldF90eXBlX21hcnNoYWxsZXIpOiBVc2UgbWFyc2hhbF92YWx1ZWFycmF5LgorCShtYXJzaGFsX3JlY3Vyc2UpOiBEZWxldGUuCisJKF9kYnVzX2d2YWx1ZV90ZXN0KTogQWRkIHNvbWUgdGVzdHMuCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKHN0cnVjdCBfREJ1c0dWYWx1ZUl0ZXJhdG9yKTogCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlLCBEQlVTX1RZUEVfR19WQUxVRSkKKwkoZGJ1c19nX3ZhbHVlX29wZW4sIGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWUpCisJKGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWVzLCBkYnVzX2dfdmFsdWVfaXRlcmF0b3JfcmVjdXJzZSkKKwkoZGJ1c19nX3ZhbHVlX2ZyZWUpOiBSZW1vdmUgcHJvdG90eXBlcy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGRidXNfZ190eXBlX2dldF9sb29rdXBfZnVuY3Rpb24pOiBIYW5kbGUKKwlHX1RZUEVfVkFMVUVfQVJSQVkuCisKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLmM6CisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LmM6IEltcGxlbWVudCBHZXRUdXBsZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IEFkZCBzdHJ1Y3R1cmUgdGVzdHMuCisKKzIwMDUtMDctMTAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRvYy9UT0RPOiBLbm9jayBvZmYgc29tZSBHTGliIGl0ZW1zIHdpdGggdGhpcyBwYXRjaC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jIChfZGJ1c19ndHlwZV9jYW5fc2lnbmFsX2Vycm9yKSAKKwkoX2RidXNfZ3ZhbHVlX3NpZ25hbHNfZXJyb3IpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmg6IFByb3RvdHlwZSB0aGVtLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChhcmdfaXRlcmF0ZSk6IFVwZGF0ZSB0byBoYW5kbGUgcmV0dXJuIHZhbHMKKwlhbmQgY2hhbmdlIHRvIG5vdCBvdXRwdXQgY29uc3QvcmV0dmFsIGZsYWdzIGZvciBpbnB1dCBhcmdzLiAgQWxsCisJY2FsbGVycyB1cGRhdGVkLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IFJlZmFjdG9yIHRvIGhhbmRsZSByZXR1cm4gdmFsdWVzLiAgQWRkCisJc29tZSBtb3JlIGNvbW1lbnRzIGluIHZhcmlvdXMgcGxhY2VzLiAgUmVtb3ZlIGRlYnVnIGdfcHJpbnQuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oIChEQlVTX0dMSUJfQU5OT1RBVElPTl9SRVRVUk5WQUwpOiBOZXcuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChkYnVzX2dfdHlwZV9nZXRfbWFyc2hhbF9uYW1lKToKKwlIYW5kbGUgR19UWVBFX05PTkUuCisJKGNvbXB1dGVfZ3NpZ25hdHVyZSk6IE5ldyBmdW5jdGlvbjsgcmVmYWN0b3JlZCBmcm9tIGNvZGUgZnJvbQorCWNvbXB1dGVfbWFyc2hhbGxlciBhbmQgY29tcHV0ZV9tYXJzaGFsbGVyX25hbWUuICBFbmhhbmNlIHRvCisJaGFuZGxlIHJldHVybiB2YWx1ZXMgYW5kIGFzeW5jIG9wcyBtb3JlIGNsZWFubHkuICBVcGRhdGUgZm9yCisJYXN5bmMgb3BzIHJldHVybmluZyBOT05FIGluc3RlYWQgb2YgQk9PTEVBTi4KKwkoY29tcHV0ZV9tYXJzaGFsbGVyLCBjb21wdXRlX21hcnNoYWxsZXJfbmFtZSk6IENhbGwgY29tcHV0ZV9nc2lnbmF0dXJlCisJYW5kIG91dHB1dCBhcHByb3ByaWF0ZSBzdHJpbmcuCisJKGdlbmVyYXRlX2dsdWUpOiBIYW5kbGUgcmV0dXJuIHZhbHVlIGFubm90YXRpb24uICBBbHNvIGRvbid0IGR1bXAKKwljb25zdG5lc3MgZmxhZyBmb3IgaW5wdXQgYXJndW1lbnRzLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChEQlVTX0dMSUJfSU5URVJOQUxTKTogTmV3IHZhcmlhYmxlOyBjb250YWlucworCWZpbGVzIHNoYXJlZCBiZXR3ZWVuIGluc3RhbGxlZCBsaWJyYXJ5IGFuZCB1dGlsaXRpZXMuCisJKGxpYmRidXNfZ2xpYl8xX2xhX1NPVVJDRVMpOiBNb3ZlIHNvbWUgc3R1ZiBpbnRvIERCVVNfR0xJQl9JTlRFUk5BTFMuCisJKGxpYmRidXNfZ3Rvb2xfbGFfU09VUkNFUyk6IFN1Y2sgaW4gREJVU19HTElCX0lOVEVSTkFMUyBzbyB0aGUKKwliaW5kaW5nIHRvb2wgY2FuIGFjY2VzcyBndHlwZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogQWRkIHNvbWUgdGVzdHMgZm9yIHJldHVybiB2YWx1ZXMuCisKKzIwMDUtMDctMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmMgKHBhcnNlX2Fubm90YXRpb24pOiBBZGQgYW5ub3RhdGlvbnMgdG8KKwlhcmd1bWVudCBpZiBhdmFpbGFibGUsIG5vdCBtZXRob2QuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGFyZ19pdGVyYXRlKTogTW9yZSB2ZXJib3NlIHdhcm5pbmdzLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEZpcnN0LCByZW1vdmUgc29tZSByZWR1bmRhbnQKKwlHVmFsdWVzIChvYmplY3RfdmFsdWUsIGVycm9yX3ZhbHVlKSBpbiBmYXZvciBvZiB3b3JraW5nIG9uCisJYXJyYXkgZGlyZWN0bHkuICBTZWNvbmQsIHJld29yayBjb25zdG5lc3MgdG8gYmUgbGVzcyBidWdneS4KKwlOb3cgd2UgaXRlcmF0ZSBkaXJlY3RseSBvdmVyIHRoZSBhcmd1bWVudCBtZXRhZGF0YSBpbnN0ZWFkCisJb2YgcGFyYWxsZWwgaXRlcmF0aW5nIG92ZXIgb3V0cHV0IHNpZ25hdHVyZSBhbmQgbWV0YWRhdGEuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuaDogQWRkIElOVkFMSURfQU5OT1RBVElPTiBlcnJvci4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdlbmVyYXRlX2dsdWUpOiBCYXJmIG9uIGNvbnN0CisJYW5ub3RhdGlvbiBvbiBpbnB1dCBhcmdzLgorCQorMjAwNS0wNy0wOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmggKERCVVNfR0xJQl9BTk5PVEFUSU9OX0NPTlNUKToKKwlEZWZpbmUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9nbHVlKTogSGFuZGxlIENvbnN0CisJYW5ub3RhdGlvbi4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoYXJnX2l0ZXJhdGUpOiBVcGRhdGUgdG8gcGFyc2UgY29uc3R2YWwgdG9vLgorCShtZXRob2RfZGlyX3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKTogSGFuZGxlIGFyZ19pdGVyYXRlIGNoYW5nZS4KKwkod3JpdGVfaW50ZXJmYWNlKTogRGl0dG8uCisJKGxvb2t1cF9vYmplY3RfaW5mbyk6IERvbid0IGJhcmYgaWYgZm9ybWF0X3ZlcnNpb24gaXMgPiAwLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEhhbmRsZSBhcmcgY29uc3RuZXNzLgorCisJKiBnbGliL2RidXMtZ2lkbC5jIChzdHJ1Y3QgQXJnSW5mbyk6IEFkZCBhbm5vdGF0aW9ucy4KKwkoYXJnX2luZm9fbmV3KTogQ3JlYXRlLgorCShhcmdfaW5mb191bnJlZik6IERlc3Ryb3kuCisJKGFyZ19pbmZvX2dldF9hbm5vdGF0aW9ucywgYXJnX2luZm9fZ2V0X2Fubm90YXRpb24pIAorCShhcmdfaW5mb19hZGRfYW5ub3RhdGlvbik6IE5ldyBmdW5jdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IFByb3RvdHlwZSB0aGVtLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9hbm5vdGF0aW9uKTogQWxsb3cgYW5ub3RhdGlvbnMgaW4KKwlhcmdzLCBkaXNhbGxvdyB0aGVtIGluIHByb3BlcnRpZXMuCisJKHBhcnNlX2Fubm90YXRpb24pOiBIYW5kbGUgYXJnIGFubm90YXRpb25zLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiAKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jOiBVcGRhdGUgdG8gbWFrZSBzb21lIG1ldGhvZHMKKwljb25zdC4KKworMjAwNS0wNy0wOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBUZXN0IGF7c3Z9LgorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1zZXJ2ZXIuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1jbGllbnQuYzogRml4IHNvbWUgYnVncywKKwlhZGQgcHJvZ3Jlc3MgYmFyLCBldGMuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAocmVnaXN0ZXJfYXJyYXksIHJlZ2lzdGVyX2RpY3QpOiBEZWxldGU7IG5vdAorCW5lZWRlZCBhbnltb3JlIGR1ZSB0byBnZW5lcmljIGFycmF5L21hcCBtYXJzaGFsbGluZy4KKwkoZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQpOiBEb24ndCByZWdpc3RlciBiYXNpYyBhcnJheXMgb3IgdGhlCisJc3RyaW5nL3N0cmluZyBoYXNoLgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBEb24ndCB0cnkgdG8gcmVjdXJzZSBpbnRvCisJdmFyaWFudHMuCisJKGRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlKTogQ2hlY2sgY29sbGVjdGlvbi9tYXAgYmVmb3JlIHR5cGUKKwltZXRhZGF0YS4KKwkoZGVtYXJzaGFsX2dhcnJheV9iYXNpYyk6IFJlbmFtZWQgdG8gZGVtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKGRlbWFyc2hhbF9naGFzaHRhYmxlKTogUmVuYW1lZCB0byBkZW1hcnNoYWxfbWFwOyBmaXggdG8gdXNlIG5ldworCWdlbmVyaWMgbWFwIGNyZWF0aW9uL2FwcGVuZCBmdW5jdGlvbnMgaW5zdGVhZCBvZiBoYXNoIHRhYmxlCisJc3BlY2lmaWNhbGx5LgorCShnZXRfdHlwZV9kZW1hcnNoYWxsZXIpOiBIYW5kbGUgbWFwcy4KKwkoZGVtYXJzaGFsX2NvbGxlY3Rpb24pOiBEaXNwYXRjaCBvbiBjb2xsZWN0aW9uIHR5cGUgdG8gZWl0aGVyCisJZGVtYXJzaGFsX2NvbGxlY3Rpb25fcHRyYXJyYXkgb3IgZGVtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKGdldF90eXBlX21hcnNoYWxsZXIpOiBIYW5kbGUgbWFwcy4KKwkobWFyc2hhbF9jb2xsZWN0aW9uKTogRGlzcGF0Y2ggY29sbGVjdGlvbiB0eXBlIHRvIGVpdGhlcgorCW1hcnNoYWxfY29sbGVjdGlvbl9wdHJhcnJheSBvciBtYXJzaGFsX2NvbGxlY3Rpb25fYXJyYXkuCisJKF9kYnVzX2d2YWx1ZV90ZXN0KTogTmV3IHRlc3QuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAodW5zZXRfYW5kX2ZyZWVfZ192YWx1ZSk6IE5ldyBmdW5jdGlvbi4KKwkoaGFzaF9mcmVlX2Zyb21fZ3R5cGUpOiBVc2UgaXQgdG8gZnJlZSBHVmFsdWVzLgorCShoYXNodGFibGVfYXBwZW5kKTogTmV3IGZ1bmN0aW9uLgorCShwdHJhcnJheV9hcHBlbmQpOiBGaXggcHJvdG90eXBlLgorCShzbGlzdF9hcHBlbmQpOiBEaXR0by4KKwkoX2RidXNfZ3ZhbHVlX3V0aWxzX3Rlc3QpOiBFeHRlbmQgdGVzdHMuCisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5jCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2luaXRfYXBwZW5kKTogUmVuYW1lZCBmcm9tCisJZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9pbml0X2FwcGVuZC4gIFJlbW92ZSBjb25zdCBmcm9tCisJdmFsdWUsIHNpbmNlIHdlIHN0ZWFsIGl0LgorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9tYXBfYXBwZW5kKTogTmV3IGZ1bmN0aW9uLgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaDogVXBkYXRlIHByb3RvdHlwZXMuCisJQWRkIERCdXNHVHlwZVNwZWNpYWxpemVkTWFwQXBwZW5kRnVuYy4KKworCSogZ2xpYi9kYnVzLWd0ZXN0LmMgKGRidXNfZ2xpYl9pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IFJ1bgorCV9kYnVzX2d2YWx1ZV90ZXN0LgorCQorCSogZ2xpYi9kYnVzLWd0ZXN0Lmg6IFByb3RvdHlwZSBpdC4KKworMjAwNS0wNy0wOCAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOgorCUFkZCBEQnlzR0FzeW5jRGF0YSBmb3IgdGhlIGFzeW5jIGJpbmRpbmdzLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzoKKwlSZS1lbmFibGUgdGhlIGFzeW5jIGJpbmRpbmdzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzoKKwlBZGQgYSB0ZXN0IGZvciB0aGUgZ2VuZXJhdGVkIGFzeW5jIGJpbmRpbmdzLgorCisyMDA1LTA3LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogVXBkYXRlIEdMaWIgdG9kbyBiaXRzLCBhbHNvIGFkZCBhIHBvc3QtMS4wIFRPRE8gZm9yIGEKKwljb25uZWN0aW9uIGNvbmNlcHQuCisJCisyMDA1LTA3LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCQorCSogdG9vbHMvTWFrZWZpbGUuYW06IEtpbGwgb2YgcHJpbnQtaW50cm9zcGVjdCBpbiBmYXZvciBvZiB1c2luZworCWRidXMtc2VuZCAtLXByaW50LXJlcGx5PWxpdGVyYWwuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF9nZXRfb2Jqcyk6IE5ldyB0ZXN0CisJZm9yICJhbyIuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChlY2hvX3JlY2VpdmVkX2NiKTogRnJlZSBlY2hvIGRhdGEuCisJKG1haW4pOiBUZXN0IEdldE9ianMuCisKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL01ha2VmaWxlLmFtOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc20tbWFyc2hhbC5saXN0OgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLWNsaWVudC5jOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci5jOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLXNlcnZlci54bWw6CisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS5oOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLnhtbDoKKworCU5ldyBleGFtcGxlLgorCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5jIChtYWluKTogTW92ZSBpbnZvY2F0aW9uCisJb2YgZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyBlYXJsaWVyLCB0byBlbXBoYXNpemUgaXQKKwlzaG91bGQgb25seSBiZSBkb25lIG9uY2UuCisKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5jIChtYWluKTogRGl0dG8uCisKKwkqIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBJbmNsdWRlIHN0YXRlbWFjaGluZS4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5oIChkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZSkKKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IFVwZGF0ZSBwcm90b3R5cGVzLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6IFVwZGF0ZSBhbGwgbWFyc2hhbGxpbmcgZnVuY3Rpb25zIHRvIHRha2UKKwljb25zdCBHVmFsdWUgaW5zdGVhZCBvZiBHVmFsdWUuCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9hcnJheSk6IFJldHVybiBhIEdQdHJBcnJheSBmb3Igbm9uZml4ZWQKKwl0eXBlcy4KKwkoZGJ1c19ndmFsdWVfdG9fc2lnbmF0dXJlKTogVXBkYXRlIGZvciBkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZQorCWNoYW5nZS4KKwkoZGJ1c19ndHlwZV90b19zaWduYXR1cmUpOiBIYW5kbGUgZ2VuZXJpYyBjb2xsZWNpdG9ucyBhbmQgbWFwcy4KKwlSZXR1cm4gYSBuZXdseS1hbGxvY2F0ZWQgc3RyaW5nLgorCShkZW1hcnNoYWxfcHJveHksIGRlbWFyc2hhbF9vYmplY3RfcGF0aCwgZGVtYXJzaGFsX29iamVjdCkKKwkoZGVtYXJzaGFsX3N0cnYsIGRlbWFyc2hhbF9naGFzaHRhYmxlKTogU2V0IGVycm9yLCBkb24ndCBhc3NlcnQgaWYKKwl3ZSBnZXQgdGhlIHdyb25nIHR5cGVzIGZyb20gbWVzc2FnZS4KKwkoZ2V0X3R5cGVfZGVtYXJzaGFsbGVyKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ3ZhbHVlX2RlbWFyc2hhbC4KKwkoZGVtYXJzaGFsX2NvbGxlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGRlbWFyc2hhbHMgZ2VuZXJpYworCWNvbGxlY3Rpb24uCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbCk6IEp1c3QgaW52b2tlIHJlc3VsdCBvZgorCWdldF90eXBlX2RlbWFyc2hhbGxlci4gIFRocm93IGVycm9yIGlmIHdlIGRvbid0IGhhdmUgb25lLgorCShtYXJzaGFsX2dhcnJheV9iYXNpYyk6IEFib3J0IG9uIE9PTS4KKwkoZ2V0X3R5cGVfbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlkYnVzX2d2YWx1ZV9tYXJzaGFsLgorCShjb2xsZWN0aW9uX21hcnNoYWxfaXRlcmF0b3IsIG1hcnNoYWxfY29sbGVjdGlvbik6IE5ldyBmdW5jdGlvbnM7CisJaW1wbGVtZW50cyBnZW5lcmljIG1hcnNoYWxsaW5nIGZvciBhbiBpdGVyYXRhYmxlIHNwZWNpYWxpemVkCisJY29sbGVjdGlvbi4KKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IEp1c3QgaW52b2tlIHJlc3VsdCBvZiBnZXRfdHlwZV9tYXJzaGFsbGVyLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmMgKGd2YWx1ZV9mcm9tX3B0cmFycmF5X3ZhbHVlKTogSGFuZGxlCisJR19UWVBFX1NUUklORy4KKwkocHRyYXJyYXlfdmFsdWVfZnJvbV9ndmFsdWUpOiBEaXR0by4KKwkocHRyYXJyYXlfYXBwZW5kLCBwdHJhcnJheV9mcmVlKTogTmV3IGZ1bmN0aW9ucy4KKwkoc2xpc3RfY29uc3RydWN0b3IsIHNsaXN0X2l0ZXJhdG9yLCBzbGlzdF9jb3B5X2VsdCwgc2xpc3RfY29weSkgCisJKHNsaXN0X2FwcGVuZCwgc2xpc3RfZW5kX2FwcGVuZCwgc2xpc3RfZnJlZSk6IE5ldyBmdW5jdGlvbnMuCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQpOiBBZGQgYXBwZW5kIGZ1Y3Rpb25zCisJZm9yIEdQdHJBcnJheSBhbmQgR1NMaXN0LiAgUmVnaXN0ZXIgR1NMaXN0LgorCSh0ZXN0X3NwZWNpYWxpemVkX2hhc2gsIF9kYnVzX2d2YWx1ZV91dGlsc190ZXN0KTogTmV3IGZ1bmN0aW9ucy4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmggKERCdXNHVHlwZVNwZWNpYWxpemVkQXBwZW5kQ29udGV4dCk6CisJTmV3LgorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9jb2xsZWN0aW9uX2luaXRfYXBwZW5kKQorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9jb2xsZWN0aW9uX2FwcGVuZCkKKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9lbmRfYXBwZW5kKTogUHJvdG90eXBlLgorCShEQnVzR1R5cGVTcGVjaWFsaXplZENvbGxlY3Rpb25WdGFibGUpOiBBZGQgYXBwZW5kX2Z1bmMgYW5kCisJZW5kX2FwcGVuZF9mdW5jLgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYyAoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9pbml0X2FwcGVuZCkgCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25fYXBwZW5kKSAKKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9lbmRfYXBwZW5kKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGJ1c19nX3R5cGVfbWFwX3ZhbHVlX2l0ZXJhdGUpOiBUYWtlIGNvbnN0IEdWYWx1ZS4KKwkoZGJ1c19nX3R5cGVfY29sbGVjdGlvbl92YWx1ZV9pdGVyYXRlKTogRGl0dG8uCisKKwkqIGdsaWIvZGJ1cy1ndGVzdC5jIChkYnVzX2dsaWJfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBSdW4KKwlfZGJ1c19ndmFsdWVfdXRpbHNfdGVzdC4KKwkKKwkqIGdsaWIvZGJ1cy1ndGVzdC5oOiBQcm90b3R5cGUgaXQuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X21hbmFnZXJfZmlsdGVyKTogQXZvaWQKKwl1c2luZyB1bmluaXRpYWxpemVkIG93bmVyX2xpc3QuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsX2ludGVybmFsKTogTW92ZSByZXR1cm5faWZfZmFpbCB0bworCXB1YmxpYyBBUEkuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IFVwZGF0ZSB0byB1c2UgZXJyb3Igc2V0CisJZnJvbSBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IGhlcmUuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsKTogTW92ZSByZXR1cm5faWZfZmFpbCBoZXJlLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jICh3cml0ZV9pbnRlcmZhY2UpOiBVcGRhdGUgZm9yCisJZGJ1c19ndHlwZV90b19zaWduYXR1cmUgcmV0dXJuaW5nIG5ldyBzdHJpbmcuCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lLgorCisyMDA1LTA3LTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgYSBjb25maWd1cmUgb3B0aW9uLCAtLXdpdGgtY29uc29sZS1hdXRoLWRpcgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIChfZGJ1c191c2VyX2F0X2NvbnNvbGUpOiBVc2UgdGhlCisJbmV3IHNldHRpbmcuICBQYXRjaCBmcm9tIEtheSBTaWV2ZXJzLgorCisyMDA1LTA3LTA2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oIChEQnVzR1BlbmRpbmdDYWxsLCBEQnVzR1BlbmRpbmdDYWxsTm90aWZ5KQorCShEQlVTX1RZUEVfR19QRU5ESU5HX0NBTEwsIGRidXNfZ19wZW5kaW5nX2NhbGxfZ2V0X2dfdHlwZSkKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9yZWYsIGRidXNfZ19wZW5kaW5nX2NhbGxfdW5yZWYpOiBEZWxldGUuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSwgZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOgorCURlbGV0ZSBpbiBmYXZvciBvZiBkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCBhbmQKKwlkYnVzX2dfcHJveHlfY2FuY2VsX2NhbGwuCisJKERCdXNHUHJveHlDYWxsLCBEQnVzR1Byb3h5Q2FsbE5vdGlmeSk6IE5ldy4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIHRha2UgY2FsbGJhY2ssIHVzZXIKKwlkYXRhLCBhbmQgZGVzdHJveSBmdW5jdGlvbi4gIFRoaXMgcmVwbGFjZXMKKwlkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkuCisJKGRidXNfZ19wcm94eV9jYW5jZWxfY2FsbCk6IFByb3RvdHlwZS4KKwkoREJ1c0dBc3luY0RhdGEpOiBEZWxldGUsIHNob3VsZG4ndCBiZSBuZWVkZWQgYW55bW9yZS4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChzdHJ1Y3QgX0RCdXNHUHJveHkpOiBBZGQgY2FsbF9pZF9jb3VudGVyIGFuZAorCXBlbmRpbmdfY2FsbHMgbWFwLgorCShzdHJ1Y3QgX0RCdXNHUHJveHlNYW5hZ2VyKTogQWRkIGJ1c19wcm94eSBtZW1iZXIsIHdoaWNoIGlzIGFuCisJaW50ZXJuYWwgcHJveHkgZm9yIGNhbGxzIHRvIHRoZSBidXMuIFJlbW92ZQorCXBlbmRpbmdfbmFtZW93bmVyX2NhbGxzLCBub3cgdGhlIGludGVybmFsIHByb3h5IGtlZXBzIHRyYWNrLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZik6IFVucmVmIGJ1cyBwcm94eSwgcmVtb3ZlIHJlZmVyZW5jZSB0bworCXBlbmRpbmdfbmFtZW93bmVyX2NhbGxzLgorCShnb3RfbmFtZV9vd25lcl9jYik6IFVwZGF0ZSBwcm90b3R5cGUsIGFuZCB1c2UKKwlkYnVzX2dfcHJveHlfZW5kX2NhbGwuCisJKGdvdF9uYW1lX293bmVyX2NiKTogUmVtb3ZlIHJlZmVyZW5jZSB0byBwZW5kaW5nX25hbWVvd25lcl9jYWxscy4KKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfcmVnaXN0ZXIpOiBEZWxldGUgZGlyZWN0bHkgbGliZGJ1cyBjb2RlIGluCisJZmF2b3Igb2YgdXNpbmcgaW50ZXJuYWwgcHJveHkuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VucmVnaXN0ZXIpOiBVcGRhdGUgdG8gdXNlCisJZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsIGZvciBhbnkgcGVuZGluZyBHZXROYW1lT3duZXIgY2FsbC4KKwkoZGJ1c19nX3Byb3h5X2luaXQpOiBJbml0aWFsaXplIHBlbmRpbmcgY2FsbHMgbWFwLgorCShkYnVzX2dfcHJveHlfY29uc3RydWN0b3IpOiBOZXcuCisJKGRidXNfZ19wcm94eV9jbGFzc19pbml0KTogQWRkIGdldC9zZXQgcHJvcGVydHkgZnVuY3Rpb25zLAorCWNvbnN0cnVjdG9yLCBhbmQgYWRkIE5BTUUsIFBBVEgsIGFuZCBJTlRFUkZBQ0UgcHJvcGVydGllcy4KKwkoY2FuY2VsX3BlbmRpbmdfY2FsbCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX3Byb3h5X2Rpc3Bvc2UpOiBJdGVyYXRlIG92ZXIgYW55IG91dHN0YW5kaW5nIGNhbGxzIGFuZAorCWNhbmNlbCB0aGVtLgorCShkYnVzX2dfcHJveHlfc2V0X3Byb3BlcnR5LCBkYnVzX2dfcHJveHlfZ2V0X3Byb3BlcnR5KTogTmV3LgorCShHUGVuZGluZ05vdGlmeUNsb3N1cmUpOiBOZXcgc3RydWN0dXJlLgorCShkX3BlbmRpbmdfY2FsbF9ub3RpZnksIGRfcGVuZGluZ19jYWxsX2ZyZWUpOiBNb3ZlZCBoZXJlIGZyb20KKwlkYnVzLWdsaWIuYy4KKwkoREJVU19HX1ZBTFVFX0FSUkFZX0NPTExFQ1RfQUxMKTogTW92ZWQgYXJvdW5kIHRvIHNhdGlzZnkgZnVuY3Rpb24KKwlvcmRlcmluZy4KKwkobWFuYWdlcl9iZWdpbl9idXNfY2FsbCk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgdGFsa2luZyB0bworCWludGVybmFsIGJ1cyBwcm94eS4KKwkoZGJ1c19nX3Byb3h5X25ldyk6IENvbnN0cnVjdCBvYmplY3QgdXNpbmcgR09iamV0IHByb3BlcnRpZXMuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsX2ludGVybmFsKTogVXBkYXRlIHRvIHRha2UgdXNlciBkYXRhLCBldGMuCisJQ3JlYXRlIGNsb3N1cmUgb2Ygc2FtZSwgYW5kIGluc2VydCBjYWxsIGludG8gbWFwIG9mIHBlbmRpbmcgY2FsbHMuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IFRha2UgY2FsbCBpZCBpbnN0ZWFkIG9mIHBlbmRpbmcKKwljYWxsLiAgTG9vayB1cCBwZW5kaW5nIGNhbGwgaW4gY3VycmVudCBzZXQuICBSZW1vdmUgaXQgd2hlbiB3ZSd2ZQorCWNvbXBsZXRlZC4KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmQsIGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IERlbGV0ZS4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwpOiBDaGFuZ2UgQVBJIHRvIHRha2UgY2FsbGJhY2ssIHVzZXIgZGF0YSwKKwlhbmQgZGVzdHJveSBmdW5jdGlvbiBkaXJlY3RseS4KKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsKTogVXBkYXRlIHRvIHRha2UgREJ1c0dQcm94eUNhbGwuCisJKGRidXNfZ19wcm94eV9jYWxsKTogSW52b2tlIHdpdGggTlVMTCBjYWxsYmFjay4KKwkoZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNlcworCWRidXNfZ19wZW5kaW5nX2NhbGxfY2FuY2VsLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBGaXggY2FsbCB0bworCWRidXNfc2V0X2dfZXJyb3IuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGRidXNfZ19vYmplY3RfdHlwZV9kYnVzX21ldGFkYXRhX3F1YXJrKToKKwlOZXcgcXVhcmsgZm9yIGF0dGFjaGluZyBtZXRhZGF0YSB0byBHVHlwZS4KKwkoaW5mb19oYXNoKTogRGVsZXRlLgorCShsb29rdXBfb2JqZWN0X2luZm8pOiBMb29rIHVwIHVzaW5nIHF1YXJrLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogQ2hlY2sgdGhhdCBhIHR5cGUgaXMgY2xhc3NlZCwKKwlub3QgdGhhdCBpdCdzIGFuIG9iamVjdC4gIEFsc28ganVzdCBpbnN0YWxsIHR5cGUgZGF0YSB1c2luZyBxdWFyaworCWluc3RlYWQgb2YgdXNpbmcgZ2xvYmFsIGhhc2guCisKKwkqIGdsaWIvZGJ1cy1nbGliLmMgKGRidXNfZ19wZW5kaW5nX2NhbGxfcmVmKSAKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF91bnJlZiwgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2dfdHlwZSkKKwkoR1BlbmRpbmdOb3RpZnlDbG9zdXJlKTogRGVsZXRlLgorCShkX3BlbmRpbmdfY2FsbF9ub3RpZnksIGRfcGVuZGluZ19jYWxsX2ZyZWUpOiBNb3ZlIHRvIGRidXMtZ3Byb3h5LmMuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSwgZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOiBEZWxldGUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9jbGllbnRfZ2x1ZSk6IERpc2FibGUgYXN5bmMKKwljbGllbnQgbWV0aG9kIGdlbmVyYXRpb24gdW50aWwgd2UgY2FuIGZpeCBpdC4uLgorCQorCSogdG9vbHMvZGJ1cy12aWV3ZXIuYyAobG9hZF9jaGlsZF9ub2Rlcyk6IFVzZSBkYnVzX2dfcHJveHlfY2FsbC4KKwkobG9hZF9mcm9tX3NlcnZpY2VfdGhyZWFkX2Z1bmMpOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jIChzdHJ1Y3QgTmFtZXNNb2RlbCk6IEhvbGQKKwlEQnVzR1Byb3h5Q2FsbC4KKwkoaGF2ZV9uYW1lc19ub3RpZnkpOiBVcGRhdGUgcHJvdG90eXBlLCB1c2UKKwlkYnVzX2dfcHJveHlfY2FuY2VsX2NhbGwuCisJKG5hbWVzX21vZGVsX3JlbG9hZCk6IFVwZGF0ZSBmb3IgbmV3IGRidXNfZ19wcm94eV9iZWdpbl9jYWxsIEFQSS4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKGZpbHRlcl9mdW5jKTogVXBkYXRlIGZvciBwcmludF9tZXNzYWdlCisJQVBJIGNoYW5nZS4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBtb3JlIHRlc3RzIGZvciBhc3luYworCWludm9jYXRpb25zLiAgVXBkYXRlIG1hbnkgYmVnaW5fY2FsbC9lbmRfY2FsbCBwYWlycyB0byBqdXN0IHVzZQorCWRidXNfZ19wcm94eV9jYWxsLgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IEFkZCAtLXByaW50LXJlcGx5PWxpdGVyYWwgbW9kZS4gIFRoaXMKKwlhbGxvd3MgdXMgdG8gZHVtcCBwcmludC1pbnRyb3NwZWN0LmMuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIChwcmludF9tZXNzYWdlKTogQWRkIGxpdGVyYWwgYXJndW1lbnQKKwl0byBwcmludF9tZXNzYWdlIHdoaWNoIGlzIGludGVuZGVkIHRvIGFsbG93IHByaW50aW5nIGFyZ3VtZW50cyB3aXRob3V0CisJbWV0YWRhdGEgbGlrZSAic3RyaW5nPSIuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogQWRkIGxpdGVyYWwgYXJndW1lbnQuCisJKHByaW50X21lc3NhZ2UpOiBBbGxvdyBwcmludGluZyBzdHJpbmcgbWVzc2FnZXMgbGl0ZXJhbGx5LgorCisyMDA1LTA3LTA1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKG1hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2dfbWFyc2hhbGxlcik6CisJUmVtb3ZlIHZhbHVlIHJlZmNvdW50IGxlYWssIG9yaWdpbmFsIHBhdGNoIGZyb20gSm9ybiBCYWF5ZW4KKwk8am9ybkBvcGVuZWRoYW5kLmNvbT4uICBBbHNvIHJlbW92ZSB1c2VsZXNzIGV4dHJhIHZhbHVlIGluIGZhdm9yCisJb2YgcHJlcGVuZGluZyB0byB2YWx1ZSBhcnJheSBkaXJlY3RseS4KKworMjAwNS0wNy0wMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKF9kYnVzX2dtYWluX3Rlc3QpOiBGaXggdGVzdC4KKworMjAwNS0wNy0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5Aa2FvbGluLmhuLm9yZz4KKwkKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoYmFzaWNfdHlwZWNvZGVfdG9fZ3R5cGUpOiBGaXggcmV0dXJuIHR5cGUuCisJKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogTWFyc2hhbCBHX1RZUEVfQ0hBUiBhcyBEQlVTX1RZUEVfQllURSwKKwlHX1RZUEVfTE9ORyBhcyBEQlVTX1RZUEVfSU5UMzIsIEdfVFlQRV9VTE9ORyBhcyBEQlVTX1RZUEVfVUlOVDMyLAorCWFuZCBHX1RZUEVfRkxPQVQgYXMgREJVU19UWVBFX0RPVUJMRS4KKworMjAwNS0wNi0zMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IFVwZGF0ZSB0ZXN0cyBmb3IgbmV3IGVycm9yCisJc2V0dGluZyBiaXRzLCBhbHNvIGFkZCBhc3luYyB0ZXN0cyAocGF0Y2ggZnJvbSBSb3NzIEJ1cnRvbikuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbSAodGVzdF9zZXJ2aWNlX2dsaWJfTERBREQpOiBBZGQKKwlEQlVTX0dMSUJfVEhSRUFEU19MSUJTLgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGdldF9uYW1lX293bmVyKQorCShkYnVzX2dfcGVuZGluZ19jYWxsX2VuZF92YWxpc3QpOiBEaXR0by4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZXJyb3JfbWV0YWRhdGEpOiBOZXcgbWFwcGluZyBmcm9tIEdFcnJvcgorCWRvbWFpbiAoR1F1YXJrKSB0byBEQnVzR0Vycm9ySW5mby4gIAorCShnZXJyb3JfZG9tYWluY29kZV90b19kYnVzX2Vycm9yX25hbWUpOiBBdHRlbXB0IHRvIGxvb2sgdXAgZXJyb3IKKwlxdWFyayBpbiBlcnJvcl9tZXRhZGF0YS4gIFRha2UgbWVzc2FnZSBpbnRlcmZhY2UgYXMgZGVmYXVsdAorCWVycm9yIG1lc3NhZ2UgaW50ZXJmYWNlLgorCShnZXJyb3JfdG9fZGJ1c19lcnJvcl9tZXNzYWdlKTogUGFzcyBtZXNzYWdlIGludGVyZmFjZS4KKwkoZGJ1c19zZXRfZ19lcnJvcik6IFJlc3VycmVjdGVkLgorCShkYnVzX2dfZXJyb3JfaW5mb19mcmVlKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogVXNlIGdfdHlwZV9jbGFzc19yZWYgaW5zdGVhZAorCW9mIF9wZWVrIHRvIGFjdHVhbGx5IGNyZWF0ZSB0aGUgb2JqZWN0IGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuCisJY3JlYXRlZCB5ZXQuCisJKGRidXNfZ19lcnJvcl9kb21haW5fcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2dfYnVzX2dldCk6IFN3aXRjaCB0byBkYnVzX3NldF9nX2Vycm9yLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBEaXR0by4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCAoZGJ1c19nX2Vycm9yX3NldCk6IERlbGV0ZS4KKwkoZGJ1c19nX2Vycm9yX2RvbWFpbl9yZWdpc3Rlcik6IFByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWdsaWIuYyAoZGJ1c19nX2Vycm9yX3NldCk6IERlbGV0ZS4KKwlVcGRhdGUgdGVzdHMuCisKKzIwMDUtMDYtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IERlbGV0ZSBEQlVTX1RZUEVfR19QUk9YWV9BUlJBWS4gIEFkZAorCURCVVNfVFlQRV9HX09CSkVDVF9QQVRILgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogUmVtb3ZlIG1hcnNoYWxsZXJzCisJZm9yIEdfVFlQRV9PQkpFQ1QgYW5kIERCVVNfVFlQRV9HX1BST1hZX0FSUkFZICh0aGUgbGF0dGVyIHNob3VsZAorCWJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseSkuICBBZGQgREJVU19UWVBFX0dfT0JKRUNUX1BBVEguCisJKGRidXNfZ19vYmplY3RfcGF0aF9nZXRfZ190eXBlKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIpOiBNYXAgREJVU19UWVBFX09CSkVDVF9QQVRICisJdG8gREJVU19UWVBFX0dfT0JKRUNUX1BBVEggYnkgZGVmYXVsdC4KKwkoZGVtYXJzaGFsX3Byb3h5KTogUmVtb3ZlIHVudXNlZCBuYW1lIHZhcmlhYmxlLgorCShkZW1hcnNoYWxfb2JqZWN0X3BhdGgsIG1hcnNoYWxfb2JqZWN0X3BhdGgpOiBOZXcgZnVuY3Rpb25zLgorCShkZW1hcnNoYWxfcHJveHlfYXJyYXksIG1hcnNoYWxfcHJveHlfYXJyYXkpOiBEZWxldGUuCisJCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZGJ1c19nX3R5cGVfZ2V0X2NfbmFtZSk6IE1hcAorCURCVVNfVFlQRV9HX09CSkVDVF9QQVRIIHRvIGNoYXIgKi4KKwkoZGJ1c19nX3R5cGVfZ2V0X2xvb2t1cF9mdW5jdGlvbik6IE1hcCBidWlsdGluCisJREJVU19UWVBFX0dfT0JKRUNUX1BBVEguCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAobXlfb2JqZWN0X29ianBhdGgpOiAKKwlBZGFwdCB0ZXN0cyB0byBuZXcgb2JqZWN0IHBhdGggbWFyc2hhbGxpbmcuCisKKzIwMDUtMDYtMjkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZm9yY2UgY2hlY2sgZm9yIFB5dGhvbiA+PSAyLjQKKworMjAwNS0wNi0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIFJvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaW52b2tlX29iamVjdF9tZXRob2QpOiBVbnNldCBvYmplY3QKKwl2YWx1ZSBpbiBhbGwgY2FzZXMsIG5vdCBvbmx5IGluIGFzeW5jIGNhc2UuCisKKzIwMDUtMDYtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoc3RydWN0IF9EQnVzR1Byb3h5KTogQWRkIG5ldyBtZW1iZXIKKwluYW1lX2NhbGwgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYW55IG91dGdvaW5nIEdldE5hbWVPd25lciBjYWxsLgorCUFsc28gYWRkIGZvcl9vd25lciBhbmQgYXNzb2NpYXRlZC4KKwkoc3RydWN0IF9EQnVzR1Byb3h5TWFuYWdlcik6IEFkZCBvd25lcl9uYW1lcywgd2hpY2ggaXMgaGFzaCB0YWJsZQorCXRoYXQgbWFwcyBhIGJhc2UgbmFtZSB0byBhIGxpc3Qgb2YgbmFtZXMgaXQgb3ducyAodGhhdCB3ZSdyZQorCWludGVyZXN0ZWQgaW4pLiAgQWRkIHBlbmRpbmdfbmFtZW93bmVyX2NhbGxzIHdoaWNoIGlzIGEgbGlzdCBvZgorCWFsbCBvdXRzdGFuZGluZyBHZXROYW1lT3duZXI7IGF2b2lkcyB1cyBoYXZpbmcgdG8gaXRlcmF0ZSBvdmVyCisJZXZlcnkgcHJveHkuICBBZGQgdW5hc3NvY2lhdGVkX3Byb3hpZXMgd2hpY2gga2VlcHMgdHJhY2sgb2YgbmFtZQorCXByb3hpZXMgd2l0aCBubyBhc3NvY2lhdGVkIG5hbWUgb3duZXIuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VucmVmKTogRGVzdHJveSBvd25lcl9uYW1lcy4KKwkoc3RydWN0IERCdXNHUHJveHlOYW1lT3duZXJJbmZvKTogTmV3IHN0cnVjdCBmb3Iga2VlcGluZyB0cmFjayBvZgorCW5hbWUgcmVmY291bnRzLgorCShmaW5kX25hbWVfaW5faW5mbywgbmFtZV9vd25lcl9mb3JlYWNoKQorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9sb29rdXBfbmFtZV9vd25lciwgaW5zZXJ0X25hbWVpbmZvKQorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9tb25pdG9yX25hbWVfb3duZXIpCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3VubW9uaXRvcl9uYW1lX293bmVyKQorCSh1bmFzc29jaWF0ZV9wcm94aWVzLCBkYnVzX2dfcHJveHlfbWFuYWdlcl9yZXBsYWNlX25hbWVfb3duZXIpOgorCU5ldyBmdW5jdGlvbnM7IHRoZXkgbWFuaXB1bGF0ZSB0aGUgb3duZXJfbmFtZXMgbWFwcGluZy4KKwkoZ290X25hbWVfb3duZXJfY2IpOiBOZXcgZnVuY3Rpb24uCisJKGdldF9uYW1lX293bmVyKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ19wcm94eV9uZXdfZm9yX25hbWVfb3duZXIuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3JlZ2lzdGVyKTogRm9yIG5vdyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKwlhbGwgTmFtZU93bmVyQ2hhbmdlZC4gIEFsc28gaWYgdGhlIHByb3h5IGlzIGZvciBhIG5hbWUsIGlmIHdlCisJZG9uJ3QgYWxyZWFkeSBrbm93IHRoZSBuYW1lIG93bmVyLCBxdWV1ZSBhIG5ldyBHZXROYW1lT3duZXIKKwlyZXF1ZXN0IGFuZCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgdW5hc3NvY2lhdGVkIHByb3hpZXMuICBPdGhlcndpc2UKKwlpbmMgdGhlIHJlZmNvdW50LgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZ2lzdGVyKTogSWYgdGhpcyBwcm94eSBpcyBmb3IgYSBuYW1lLAorCWNhbmNlbCBhbnkgcGVuZGluZyBHZXROYW1lT3duZXIgY2FsbCwgZXRjLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9maWx0ZXIpOiBIYW5kbGUgTmFtZU93bmVyQ2hhbmdlZC4gIEFsc28gdXNlCisJdGhlIG93bmVyX25hbWVzIG1hcHBpbmcgdG8gbG9vayB1cCB0aGUgY3VycmVudCBuYW1lcyBmb3IgdGhlCisJc2lnbmFsIHNvdXJjZSwgYW5kIGRpc3BhdGNoIHRvIGFueSBwcm94aWVzIGZvciB0aGF0IG5hbWUuCisJKGRidXNfZ19wcm94eV9uZXcpOiBJbml0aWFsaXplIG5ldyBtZW1iZXJzLgorCShkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lKTogRGVsZXRlIHVudXNlZCBwcm94eSB2YXJpYWJsZS4KKwkoZGJ1c19nX3Byb3h5X25ld19mb3JfbmFtZV9vd25lcik6IFVzZSBnZXRfbmFtZV9vd25lci4KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmRfdmFsaXN0KTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbQorCWRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbC4gIFVzZWZ1bCB3aGVuIHdlIGRvbid0IGhhdmUgYSBwcm94eQorCWJ1dCB3YW50IHRvIHVzZSB0aGUgR0xpYiBpbmZyYXN0cnVjdHVyZS4gIEFsc28gbm90ZSBob3cgbWFueQorCWFyZ3VtZW50cyBpbiByZXBseSB3ZXJlIG92ZXIuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfZW5kKTogTmV3IGZ1bmN0aW9uLCBqdXN0IGNhbGwKKwlkYnVzX2dfcGVuZGluZ19jYWxsX2VuZF92YWxpc3QuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IEp1c3QgY2FsbAorCWRidXNfZ19wZW5kaW5nX2NhbGxfZW5kX3ZhbGlzdC4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6IEZpeCBsb29rdXAKKwlvZiBidWlsdGluIG1hcnNoYWxsZXIgZm9yIFNUUklOR19TVFJJTkdfU1RSSU5HLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6CisJRXh0ZW5kIHRlc3RzIHRvIGNvdmVyIG5hbWUgcHJveGllcywgZGVzdHJ1Y3Rpb24gb2Ygb3duZXIgcHJveGllcywKKwlldGMuCisJCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLXJlY2lwaWVudC5jCisJKGRidXNfZ19wcm94eV9uZXdfZm9yX25hbWVfb3duZXIpOiBDcmVhdGUgYSBuYW1lIHByb3h5LgorCQorCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBQcmludCBELUJVUyBlcnJvciBuYW1lIGluIGFkZGl0aW9uCisJdG8gbWVzc2FnZS4KKworMjAwNS0wNi0yOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChjdW5yZWdpc3Rlcl9mdW5jdGlvbl9oYW5kbGVyLAorCWNtZXNzYWdlX2Z1bmN0aW9uX2hhbmRsZXIpOiBQYXRjaCBmcm9tIAorCUFudGhvbnkgQmF4dGVyIDxhbnRob255QGludGVybGluay5jb20uYXU+IGZpeGVzIHRocmVhZGluZyBwcm9ibGVtcworCWJ5IHVzaW5nIHRoZSBQeV9HSUxTdGF0ZV9FbnN1cmUvUmVsZWFzZSB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZQorCXB5dGhvbiBydW50aW1lLgorCQorMjAwNS0wNi0yOCAgUmF5IFN0cm9kZSAgPHJzdHJvZGVAcmVkaGF0LmNvbT4KKworCSogIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19iYWJ5c2l0dGVyX3VucmVmKToga2lsbAorCWJhYnlzaXR0ZXIgaGVscGVyIHByb2Nlc3Mgb24gbGFzdCB1bnJlZiwgYnVnICMyODEzLgorCisyMDA1LTA2LTI3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzoKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6CisJVGVzdCBoYXNoIHRhYmxlIHNpZ25hbCBlbWl0dGluZy4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6IENvbnZlcnQKKwl0eXBlcyB0byB0aGVpciBmdW5kYW1lbnRhbCBiYXNpcyB0eXBlcywgc2luY2UgdGhpcyBpcyB3aGF0CisJbWFyc2hhbGxlcnMgb3BlcmF0ZSBvbi4gIEFsc28gYWRkIGFuIGVudHJ5IGZvciBWT0lEX19CT1hFRC4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyX2FycmF5KTogQ29udmVydCB0byBmdW5kYW1lbnRhbC4KKworMjAwNS0wNi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogZml4IG5hbWVzIG9mIGludGVyZmFjZS9zZXJ2aWNlL3BhdGgsIGZpeAorCWZyb20gRG9uIFBhcmsKKworMjAwNS0wNi0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdsaWIuYyAoZGJ1c19zZXRfZ19lcnJvcik6IERlbGV0ZS4KKwkoZGJ1c19nX2Vycm9yX3NldCk6IE5ldyBwdWJsaWMgZnVuY3Rpb24gZnJvbSBpdHMgYXNoZXM7IHVzZWQgYnkKKwlib3RoIHNlcnZpY2Utc2lkZSBtZXRob2QgaW1wbGVtZW50YXRpb24gYW5kIEdMaWIgYmluZGluZ3MKKwlpbnRlcm5hbHMuCisJKGRidXNfZ19lcnJvcl9oYXNfbmFtZSwgZGJ1c19nX2Vycm9yX2dldF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShfZGJ1c19nbGliX3Rlc3QpOiBBZGQgc29tZSB0ZXN0cy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmMgKG1haW4pOiBUZXN0IGRidXNfZ19lcnJvcl9oYXNfbmFtZS4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF90aHJvd19lcnJvcik6IFVzZQorCWRidXNfZ19lcnJvcl9zZXQuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGdlcnJvcl90b19kYnVzX2Vycm9yX21lc3NhZ2UpOiBIYW5kbGUKKwllcnJvcnMgdGhyb3duIGJ5IGRidXNfZ19lcnJvcl9zZXQuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2dfYnVzX2dldCk6IENoYW5nZSB0byBkYnVzX2dfZXJyb3Jfc2V0LgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jICh2YWxpZGF0ZV9zaWduYXR1cmUpOiBEaXR0by4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lX293bmVyKSAKKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsX2ludGVybmFsKTogRGl0dG8uCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEdlbmVyYXRlIGRidXMtZ2xpYi1lcnJvci1zd2l0Y2guaCwgd2hpY2gKKwljb252ZXJ0cyBEQlVTX0VSUk9SX3ggdG8gREJVU19HRVJST1JfeC4KKwkobGliZGJ1c19nbGliXzFfbGFfU09VUkNFUywgQlVJTFRfU09VUkNFUywgQ0xFQU5GSUxFUyk6IEFkZCBpdC4KKworCSogZG9jL1RPRE86IFJlbW92ZSBlcnJvciBUT0RPLgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IFVwZGF0ZSB3aXRoIGRvY3VtZW50YXRpb24gYWJvdXQgZXJyb3IKKwloYW5kbGluZy4KKworCSogZGJ1cy9tYWtlLWRidXMtZ2xpYi1lcnJvci1lbnVtLnNoOiBUaWdodGVuIHVwIHJlZ2V4cCB0byBtYWtlCisJc3VyZSB3ZSBvbmx5IGNoYW5nZSBEQlVTX0VSUk9SIHRvIERCVVNfR0VSUk9SLCBub3QgYWxsIEVSUk9SIHRvCisJR0VSUk9SLiAgQWxzbyBhZGQgREJVU19HRVJST1JfUkVNT1RFX0VYQ0VQVElPTi4KKworMjAwNS0wNi0yMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwlQYXRjaCBmcm9tIFJvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX2dfbWV0aG9kX3JldHVybik6IEZyZWUgb3V0X3NpZy4KKworMjAwNS0wNi0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogY29uZmlndXJlLmluOiBBZGQgZ2xpYi9leGFtcGxlcy4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogQWRkIGV4YW1wbGVzLworCisJKiBnbGliL2V4YW1wbGVzLy5jdnNpZ25vcmUKKwkqIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW0KKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UueG1sCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIuYworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnhtbAorCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQuYzoKKwlOZXcgZmlsZXM7IEdMaWIgYmluZGluZyBleGFtcGxlcywgcG9ydGVkIGZyb20KKwlweXRob24vZXhhbXBsZXMuCisKKzIwMDUtMDYtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IAorCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBSZW5hbWUgZGJ1c19nX3Byb3h5X2ludm9rZSB0bworCWRidXNfZ19wcm94eV9jYWxsLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzogCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IAorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IFVwZGF0ZSBmb3IgcmVuYW1lLgorCQorMjAwNS0wNi0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIHN1Z2dlc3RlZCBieSBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZXhwb3J0X3NpZ25hbHMpOiBGcmVlIHNpZ25hbCBuYW1lLgorCShnX3ZhbHVlX2luaXQpOiBVc2UgR19WQUxVRV9OT0NPUFlfQ09OVEVOVFMgdG8gcGx1ZworCW1lbW9yeSBsZWFrLiAgQWRkIGEgYml0IG9mIGRvY3VtZW50YXRpb24uCisJKGRidXNfZ19tZXRob2RfcmV0dXJuX2Vycm9yKTogRnJlZSBjb250ZXh0LCBhbmQgbm90ZSB3ZSBkbworCXNvLgorCisyMDA1LTA2LTE4ICBNdXJyYXkgQ3VtbWluZyAgPG11cnJheWNAbXVycmF5Yy5jb20+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBQcmVkZWNsYXJlIHN0cnVjdHMgYXMgCisJdHlwZWRlZiBzdHJ1Y3QgX1NvbWV0aGluZyBTb21ldGhpbmcgaW5zdGVhZCBvZiAKKyAgCXR5cGVkZWYgc3RydWN0IFNvbWV0aGluZyBTb21ldGhpbmcsIHNvIHdlIGNhbiAKKwlyZWRlY2xhcmUgdGhlIHByb3RvdHlwZXMuIE90aGVyIEdOT01FIGxpYnJhcmllcyAKKwlkbyB0aGlzIGFscmVhZHkuCisKKzIwMDUtMDYtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYyAoaGF2ZV9uYW1lc19ub3RpZnkpOiBGaXggY2FsbAorCXRvIGRidXNfZ19wcm94eV9lbmRfY2FsbC4KKwkKKzIwMDUtMDYtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2VtaXRfcmVtb3RlX3NpZ25hbCk6IERvbid0CisJc3BldyB3YXJuaW5ncyBpZiB3ZSBnZXQgbWFsZm9ybWVkIHJlbW90ZSBzaWduYWxzLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChwcm9wc2lnX2l0ZXJhdGUpOiBOZXcgZnVuY3Rpb24uCisJKGxvb2t1cF9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlsb29rdXBfb2JqZWN0X2FuZF9tZXRob2QuCisJKGludHJvc3BlY3RfcHJvcGVydGllcywgaW50cm9zcGVjdF9zaWduYWxzKTogRGVsZXRlOyB0aGVzZQorCWFyZSBtZXJnZWQgaW50byB3cml0ZV9pbnRlcmZhY2UuCisJKHdyaXRlX2ludGVyZmFjZSk6IFdyaXRlIG91dCBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzIGhlcmU7CisJZHVtcCB0aGUgb3JnLmd0ay5vYmplY3Qgc3R1ZmYgYW5kIHVzZSB0aGUgaW50ZXJmYWNlIGdpdmVuCisJaW4gdGhlIGludHJvc3BlY3Rpb24gZGF0YSBibG9iLiAgQWxzbyBmaXggdXAgcHJvcGVydHkgWE1MLgorCShsb29rdXBfdmFsdWVzKTogTmV3IGZ1bmN0aW9uLgorCShpbnRyb3NwZWN0X2ludGVyZmFjZXMpOiBHYXRoZXIgYSBtYXBwaW5nIGZyb20gaW50ZXJmYWNlIHRvIGEKKwlsaXN0IG9mIGl0cyBtZXRob2RzLCBzaWduYWxzLCBhbmQgcHJvcGVydGllcywgdGhlbiB3cml0ZSBvdXQKKwllYWNoIGludGVyZmFjZS4KKwkobG9va3VwX29iamVjdF9hbmRfbWV0aG9kKTogVXNlIGxvb2t1cF9vYmplY3RfaW5mby4KKwkoc3RydWN0IERCdXNHU2lnbmFsQ2xvc3VyZSk6IEFkZCBpbnRlcmZhY2UuCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9uZXcpOiBBZGQgaW50ZXJmYWNlLiBEb24ndCBkdXAgc2lnbmFtZTsKKwl3ZSBjYW4ganVzdCB1c2UgdGhlIGNvbnN0YW50IGRhdGEuCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9maW5hbGl6ZSk6IERvbid0IGZyZWUgc2lnbmFsIG5hbWUuCisJKHNpZ25hbF9lbWl0dGVyX21hcnNoYWxsZXIpOiBVc2UgaW50ZXJmYWNlIGZyb20gc2lnbmFsIGNsb3N1cmUuCisJKGV4cG9ydF9zaWduYWxzKTogT25seSBleHBvcnQgc2lnbmFscyBtZW50aW9uZWQgaW4gaW50cm9zcGVjdGlvbgorCWJsb2IuCisJKGRidXNfZ19jb25uZWN0aW9uX3JlZ2lzdGVyX2dfb2JqZWN0KTogV2FybiBpZiB3ZSBoYXZlIG5vCisJaW50cm9zcGVjdGlvbiBkYXRhIGZvciBhbiBvYmplY3QuCisJKGZ1bmNzaWdfZXF1YWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXIpOiBUYWtlIHZhcmFyZ3MgaW5zdGVhZCBvZgorCWxpc3QuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcl9hcnJheSk6IE5ldyBmdW5jdGlvbiwKKwlleHRyYWN0ZWQgZnJvbSBvbGQgZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoc3RydWN0IERCdXNCaW5kaW5nVG9vbENEYXRhKTogQWRkCisJc2lnbmFscyBhbmQgcHJvcGVydHkgZGF0YS4KKwkod3JpdGVfcXVvdGVkX3N0cmluZyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gZ2VuZXJhdGVfZ2x1ZS4KKwkoZ2VuZXJhdGVfZ2x1ZSk6IFdyaXRlIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMgdG8gaW50cm9zcGVjdGlvbgorCWJsb2IuCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKHN0cnVjdCBEQnVzR09iamVjdEluZm8pOiBJbmNsdWRlCisJZXhwb3J0ZWRfc2lnbmFscyBhbmQgZXhwb3J0ZWRfcHJvcGVydGllcy4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyKTogVXBkYXRlIHByb3RvdHlwZS4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyX2FycmF5KTogUHJvdG90eXBlLgorCQorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEV4dGVuZCB0ZXN0aW5nIHRvIGNvdmVyIG5ldyBzaWduYWxzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogQWRkIG5ldyB0ZXN0IHNpZ25hbHMgYW5kIG1ldGhvZAorCXRvIGVtaXQgdGhlbS4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogQWRkIHNvbWUgdGVzdCBzaWduYWxzLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW0gKEJVSUxUX1NPVVJDRVMpOiBBZGQgbXktb2JqZWN0LW1hcnNoYWwuYworCWFuZCBteS1vYmplY3QtbWFyc2hhbC5oCisJKHRlc3Rfc2VydmljZV9nbGliX1NPVVJDRVMsIHRlc3RfZGJ1c19nbGliX1NPVVJDRVMpOiBBZGQKKwlteS1vYmplY3QtbWFyc2hhbC5jLgorCShteS1vYmplY3QtbWFyc2hhbC5jLCBteS1vYmplY3QtbWFyc2hhbC5oKTogSW1wbGVtZW50LgorCisJKiB0ZXN0L2dsaWIvLmN2c2lnbm9yZTogVXBkYXRlLgorCisJKiBkb2MvVE9ETzogUmVtb3ZlIHR3byBHTGliIFRPRE8gaXRlbXMgZml4ZWQgYnkgdGhpcworCXBhdGNoLgorCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogVXBkYXRlIGZvciBHTGliIGJpbmRpbmdzLgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWdwcm94eS5jOiAgQWRkIE5va2lhIGNvcHlyaWdodDsgUGF0Y2gKKwlmcm9tIFJvc3MgQnVydG9uLCBmb3IgaGlzIEdMaWIgYmluZGluZ3Mgd29yay4KKworMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZnVuY3NpZ19oYXNoLCBmdW5jc2lnX2VxdWFsKTogVXNlIG5fcGFyYW1zCisJdG8gaXRlcmF0ZSBpbnN0ZWFkIG9mIHdhbGtpbmcgdG8gR19UWVBFX0lOVkFMSUQuCisKKwlQYXRjaCBiYXNlZCBvbiBhIHBhdGNoIGZyb20gUnlhbiBHYW1tb24uCisKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogU2V0IHBhcnNlciB0byBOVUxMCisJYWZ0ZXIgd2UgdW5yZWYgaXQgKFBhdGNoIGZyb20gQ2hyaXMgQm9zY29sbywgIzIxNzQpLgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBJbXBvcnQgc2l6ZV90LAorCV9faW50NjRfdCwgX191aW50NjRfdCwgYW5kIF9fc2lnbmVkLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIDxIQVZFX0NNU0dDUkVEPiAod3JpdGVfY3JlZGVudGlhbHNfYnl0ZSk6CisJRGVmaW5lIGNtc2cgc3RydWN0LCBvdXRwdXQgaXQuCisJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOgorCVVzZSBjbXNnIHN0cnVjdC4KKwkKKwlQYXRjaCBmcm9tIEpvZSBNYXJrdXMgQ2xhcmtlIGZvciBGcmVlQlNEIHN1cHBvcnQuCisJCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2FycmF5KTogVXNlIHN0cnRvay4KKwkoYXBwZW5kX2RpY3QpOiBOZXcgZnVuY3Rpb24uCisJKHR5cGVfZnJvbV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbSBtYWluLgorCShtYWluKTogSGFuZGxlIHNlbmRpbmcgZGljdHMuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogUHJpbnQgZGljdAorCWVudHJpZXMuCisJCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKG1hcnNoYWxfYmFzaWMpOiBNYXJzaGFsIE5VTEwgc3RyaW5nCisJdmFsdWVzIGFzIHRoZSBlbXB0eSBzdHJpbmcgKCMyOTQ4KS4KKwkKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbToKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbToKKworCUZpeCBzcmNkaXIgIT0gYnVpbGRkaXIgaXNzdWVzIChQYXRjaCBmcm9tIENocmlzIFdpbHNvbiwgIzM0NzcpCisKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIChfZGJ1c19oZWFkZXJfbG9hZCk6IFNldAorCWhlYWRlciBieXRlIG9yZGVyIGZyb20gZXhwZWN0ZWQgYnl0ZSBvcmRlciAoUGF0Y2ggZnJvbSBDaHJpcyBXaWxzb24sICMzNDc1KS4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyAoYnl0ZXN3YXBfYm9keV9oZWxwZXIpOiAKKwlJbmNyZW1lbnQgcG9pbnRlciBhZnRlciBzd2FwcGluZyBmaXhlZCBhcnJheS4gIEFkZCBhc3NlcnRpb24KKwlmb3IgYXJyYXkgbGVuZ3RoLgorCQkKKzIwMDUtMDYtMTUgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgPEhBVkVfQ01TR0NSRUQ+IChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KToKKwlGaXggY2FsbCB0byBkYnVzX3NldF9lcnJvci4gIChQYXRjaCBmcm9tIE1pY2hhZWwgQmFuY2ssICMzNDYxKQorCQorMjAwNS0wNi0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogVXBkYXRlIHRvIDAuMzQKKworMjAwNS0wNi0xNSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUX0NVUlJFTlQpOiBSZXZlcnQgYmFjayB0byAxIGFzIHRoZSBsaWJyYXJ5CisJaGFzbid0IGNoYW5nZWQgYW5kIHdlJ3ZlIGNlcnRhaW5seSBub3QgY29tbWl0dGVkIHRvIHByb3RvY29sCisJc3RhYmlsaXR5IHlldC4gIEFsbCB0aGlzIGRvZXMgaXMgdG8gYnJlYWsgQUJJLiBTZWUgY29tbWl0IG5vdGUKKwlmcm9tIGhwQHJlZGhhdC5jb20gMjAwNS0wNS0wNSBmb3IgZGV0YWlscy4KKwkKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXIpOiBOZXcgbWV0aG9kIAorCShfZGJ1c19jb25uZWN0aW9uX3J1bl9idWlsdGluX2ZpbHRlcnMpOiBOZXcgbWV0aG9kCisJKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IFJ1biB0aGUgYnVpbHRpbiBmaWx0ZXJzIHdoaWNoIGluIHR1cm4KKwlydW5zIHRoZSBwZWVyIGZpbHRlciB3aGljaCBoYW5kbGVzIFBpbmcgbWVzc2FnZXMuCisKKwkqIGRvYy9UT0RPOiAKKwkgLSBQaW5nIGlzbid0IGhhbmRsZWQ6IFRoaXMgcGF0Y2ggZml4ZXMgaXQKKwkgCisJIC0gQWRkIGEgdGVzdCBjYXNlIGZvciB0aGUgUGluZyBtZXNzYWdlOiBhZGRlZCBUT0RPIGl0ZW0KKworMjAwNS0wNi0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwkoZGJ1c19tZXNzYWdlX2hhc19wYXRoKTogTmV3IG1ldGhvZAorCShkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSk6IE5ldyBtZXRob2QKKwkoZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIpOiBOZXcgbWV0aG9kCisKKwkqIGRidXMvZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlcik6CisJTmV3IG1ldGhvZAorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX3JlbG9hZCk6IENoZWNrIHRvIHNlZSB0aGF0IAorCXRoZSBrZXlyaW5nIGRpcmVjdG9yeSBpcyBwcml2YXRlIHRvIHRoZSB1c2VyCisKKwkqIGRvYy9UT0RPOgorCSAtIFRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgaW4gZGJ1cy1idXMuaCBzaG91bGQgcGVyaGFwcyBoYXZlCisJIHRoZSBzaWduYXR1cmVzIHRoYXQgdGhleSB3b3VsZCBoYXZlIGlmIHRoZXkgd2VyZSBhdXRvZ2VuZXJhdGVkCisJIHN0dWJzLiBlLmcuIHRoZSBhY3F1aXJlIHNlcnZpY2UgZnVuY3Rpb24uIFdlIHNob3VsZCBhbHNvIGV2YWx1YXRlCisJIHdoaWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB0byBpbmNsdWRlLCBpbiBsaWdodCBvZiB0aGUgZmFjdCB0aGF0CisJIEdMaWIvUXQgbmF0aXZlIHN0dWJzIHdpbGwgcHJvYmFibHkgYWxzbyBleGlzdC46IFB1bnRlZAorCisJIC0gYWRkIGRidXNfbWVzc2FnZV9oYXNfcGF0aCgpLCBtYXliZSBoYXNfbWVtYmVyL2ludGVyZmFjZToKKwkgZml4ZWQgaW4gdGhpcyBwYXRjaAorCisJIC0gaW4gZGJ1cy1rZXlyaW5nLmMsIGVuZm9yY2UgdGhhdCB0aGUga2V5cmluZyBkaXIgaXMgbm90CisJIHdvcmxkIHJlYWRhYmxlL3dyaXRhYmxlOiBGaXhlZCBpbiB0aGlzIHBhdGNoCisKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg6IEFkZGVkIGEgbmV3IHZhbGlkYXRpb24KKwllcnJvciBjb2RlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgPSAtNCBmb3IgCisJb3V0IG9mIG1lbW9yeSBlcnJvcnMgd2hlbiB2YWxpZGF0aW5nIHNpZ25pdHVyZXMKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6IHVzZSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SCisJaW4gcGxhY2VzIHdoZXJlIHdlIHByZXZpb3VzbHkgdXNlZCBEQlVTX1ZBTElEIGFuZCBhIEZBTFNFIHJldHVybiAKKwl2YWx1ZSB0byBpbmRpY2F0ZSBPT00KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik6CisJVXNlIGEgc3RhY2sgdG8gdHJhY2sgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgY29udGFpbmVycy4gIFRoZSAKKwlzdGFjayB2YWx1ZXMgYXJlIHRoZW4gdXNlZCB0byB2YWxpZGF0ZSB0aGF0IGRpY3QgZW50cmllcyBoYXZlIG9ubHkgdHdvCisJZWxlbWVudHMgd2l0aGluIHRoZW0uCisJKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogY2hlY2sgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSB3aGVuIHZhbGlkYXRpbmcKKwl2YXJpZW50cworCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAobG9hZF9tZXNzYWdlKTogdXNlIAorCURCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgaW4gcGxhY2VzIHdoZXJlIHdlIHByZXZpb3VzbHkgdXNlZCAKKwlEQlVTX1ZBTElEIGFuZCBhIEZBTFNFIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBPT00KKworCSogZG9jL1RPRE86IHJlbW92ZSAiLSB2YWxpZGF0ZSBkaWN0IGVudHJ5IG51bWJlciBvZiBmaWVsZHMiIGFzIHRoaXMKKwlwYXRjaCBmaXhlcyBpdAorCisyMDA1LTA2LTE0ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IERyb3AgZXhpc3RpbmcgY29uZi1kaXIKKwl3YXRjaGVzIChpZiBhcHBsaWNhYmxlKSBhbmQgYWRkIG5ldyB3YXRjaGVzCisKKwkqIGJ1cy9tYWluLmMgKHNpZ25hbF9oYW5kbGVyKTogSGFuZGxlIFNJR0lPIGlmIHVzaW5nIERfTk9USUZZCisJKG1haW4pOiBTZXR1cCBTSUdJTyBzaWduYWwgaGFuZGxlciBpZiB1c2luZyBEX05PVElGWQorCisJKiBidXMvY29uZmlnLXBhcnNlci5oOiBBZGQgcHJvdG90eXBlIGJ1c19jb25maWdfcGFyc2VyX2dldF9jb25mX2RpcnMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc3RydWN0IEJ1c0NvbmZpZ1BhcnNlcik6IEFkZCBjb25mX2RpcnMgbGlzdAorCShtZXJnZV9pbmNsdWRlZCk6IEFsc28gbWVyZ2UgY29uZl9kaXJzIGxpc3QKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpOiBDbGVhciBjb25mX2RpcnMgbGlzdAorCShpbmNsdWRlX2Rpcik6IEFkZCBkaXJlY3RvcnkgdG8gY29uZl9kaXJzIGxpc3QKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyk6IE5ldyBmdW5jdGlvbgorCisJKiBidXMvZGlyLXdhdGNoLltjaF06IE5ldyBmaWxlcworCisJKiBidXMvTWFrZWZpbGUuYW0gKEJVU19TT1VSQ0VTKTogQWRkIGRpci13YXRjaC5bY2hdCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGNoZWNrcyBmb3IgRF9OT1RJRlkgb24gTGludXgKKworMjAwNS0wNi0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBGaXggaW5kZW50YXRpb24gYW5kIGJyYWNlIHN0eWxlLgorCQorMjAwNS0wNi0xNCAgUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+LgorCisJKiBnbGliL2RidXMtZ2xpYi5oOiBNYWtlIERCdXNHTWV0aG9kSW52b2NhdGlvbgorCWEgcHJpdmF0ZSBzdHJ1Y3R1cmUuICBSZWFycmFuZ2UgcHJvdG90eXBlcyBhIGJpdC4KKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2ludm9rZSk6IEFkZAorCWRvY3VtZW50YXRpb24gZm9yIGZpcnN0X2FyZ190eXBlLgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuYzogTW92ZSBEQnVzR01ldGhvZEludm9jYXRpb24KKwloZXJlLCBhZGQgZG9jdW1lbnRhdGlvbi4gIE1vdmUgZGJ1c19nX21ldGhvZF9yZXR1cm4KKwlhbmQgZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3IgaW50byBwdWJsaWMgQVBJCisJc2VjdGlvbi4KKworMjAwNS0wNi0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6CisJQWRkIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudHMsIG5vdGljZWQgYnkgUm9zcyBCdXJ0b24uCisJCisyMDA1LTA2LTEzICBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4uCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEhhbmRsZSBlcnJvcnMgb24gbWVzc2FnZQorCWRlbWFyc2hhbGxpbmcgYnkgc2VuZGluZyBlcnJvciBtZXNzYWdlIGJhY2suCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6IEluaXRpYWxpemUgcmV0dXJuIHZhcmlhYmxlcy4KKworMjAwNS0wNi0xMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogRml4IHRoaW5rbyBpbiBsYXN0IHBhdGNoLgorCisyMDA1LTA2LTEzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBNb3ZlIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYworCWFuZCBkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmggaW50byBhIF9IRUFERVJTIHZhcmlhYmxlLAorCWluc3RhbGwgdGhlbS4KKworMjAwNS0wNi0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCUFzeW5jIHNpZ25hbHMgYW5kIHZhcmlvdXMgYnVnZml4ZXMgYW5kIHRlc3RpbmcgYnkKKwlSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4uCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuaDogKHN0cnVjdCBEQnVzQmFzaWNHVmFsdWUpOiBEZWxldGUuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2N0eXBlX2Zyb21fdHlwZSk6IE1vdmVkIHRvIGRidXMtYmluZGluZy10b29sLWdsaWIuYy4KKwkoZGJ1c19ndHlwZV90b19kYnVzX3R5cGUpOiBSZW5hbWVkIHRvIGRidXNfZ3R5cGVfZnJvbV9zaWduYXR1cmUuCisJKGRidXNfZ192YWx1ZV90eXBlc19pbml0LCBkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlX2l0ZXIsIGRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlKQorCShkYnVzX2d0eXBlc19mcm9tX2FyZ19zaWduYXR1cmUpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlcy4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogVGFrZSBjb250ZXh0IGFuZCBlcnJvciBhcmd1bWVudHMuCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbF92YXJpYW50KTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19ndmFsdWVfc3RvcmUpOiBEZWxldGUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzoKKworCUZpbGUgaGFzIGJlZW4gYWxtb3N0IGVudGlyZWx5IHJld3JpdHRlbjsgbm93IHdlIHNwZWNpYWwtY2FzZQorCW1vcmUgdHlwZXMgc3VjaCBhcyBEQlVTX1RZUEVfU0lHTkFUVVJFLCBoYW5kbGUgYXJyYXlzIGFuZAorCWhhc2ggdGFibGVzIGNvcnJlY3RseSwgZXRjLiAgRnVsbCBzdXBwb3J0IGZvciByZWN1cnNpdmUgdmFsdWVzCisJaXMgbm90IHlldCBjb21wbGV0ZS4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfY2xhc3NfaW5pdCk6IENoYW5nZSBsYXN0CisJYXJndW1lbnQgb2Ygc2lnbmFsIHRvIEdfVFlQRV9QT0lOVEVSIHNpbmNlIHdlIG5vdyBwYXNzIGEKKwlzdHJ1Y3R1cmUuCisJKGxvb2t1cF9nX21hcnNoYWxsZXIpOiBEZWxldGUgaW4gZmF2b3Igb2YKKwlfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyLgorCShtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOiBVc2UKKwlfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyIGFuZCBkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZQorCXRvIGhhbmRsZSByZW1vdGUgc2lnbmFsIGNhbGxiYWNrcy4KKwkoZGJ1c19nX3Byb3h5X25ld19mcm9tX3Byb3h5KTogTmV3IGZ1bmN0aW9uOyBjcmVhdGVzIGEgbmV3CisJREJ1c0dQcm94eSBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIG9uZS4KKwkoZGJ1c19nX3Byb3h5X2dldF9pbnRlcmZhY2UsIGRidXNfZ19wcm94eV9zZXRfaW50ZXJmYWNlKQorCShkYnVzX2dfcHJveHlfZ2V0X3BhdGgpOiBOZXcgZnVuY3Rpb25zLgorCShkYnVzX2dfcHJveHlfbWFyc2hhbF9hcmdzX3RvX21lc3NhZ2UpOiBOZXcgZnVuY3Rpb247CisJZmFjdG9yZWQgb3V0IG9mIGV4aXN0aW5nIGNvZGUuCisJKERCVVNfR19WQUxVRV9BUlJBWV9DT0xMRUNUX0FMTCk6IENvbGxlY3QgYWxsIGFyZ3VtZW50cworCWZyb20gYSB2YXJhcmdzIGFycmF5LgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsX2ludGVybmFsKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCk6IFRha2UgR1R5cGVzIGluc3RlYWQgb2YgREJ1cyB0eXBlcworCWFzIGFyZ3VtZW50czsgc2ltcGx5IGludm9rZSBkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbAorCWFmdGVyIGNvbGxlY3RpbmcgYXJncyBpbnRvIHZhbHVlIGFycmF5LgorCShkYnVzX2dfcHJveHlfZW5kX2NhbGwpOiBUYWtlIEdUeXBlcyBpbnN0ZWFkIG9mIERCdXMgdHlwZXM7CisJaW52b2tlIGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbC4KKwkoZGJ1c19nX3Byb3h5X2ludm9rZSk6IFNpbXBseSBpbnZva2UgYmVnaW5fY2FsbF9pbnRlcmFubCBhbmQKKwllbmRfY2FsbF9pbnRlcm5hbC4KKwkoZGJ1c19nX3Byb3h5X2NhbGxfbm9fcmVwbHkpOiBUYWtlIEdUeXBlcyBpbnN0ZWFkIG9mIERCdXMKKwl0eXBlcy4KKwkoYXJyYXlfZnJlZV9hbGwpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19wcm94eV9hZGRfc2lnbmFsKTogVGFrZSBHVHlwZXMuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0Lmg6CisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRGVsZXRlLgorCShfZGJ1c19nb2JqZWN0X2dldF9wYXRoLCBfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyKToKKwlQcm90b3R5cGUuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEFkZCBhIGdsb2JhbCBtYXJzaGFsX3RhYmxlIGhhc2ggd2hpY2gKKwlzdG9yZXMgbWFwcGluZ3MgZnJvbSB0eXBlIHNpZ25hdHVyZXMgdG8gbWFyc2hhbGxlcnMuICBDaGFuZ2UgbG90cworCW9mIGludm9jYXRpb25zIG9mIGRidXNfZ3R5cGVfdG9fZGJ1c190eXBlIHRvCisJZGJ1c19ndHlwZV90b19zaWduYXR1cmUuCisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRGVsZXRlLgorCShpbnRyb3NwZWN0X3NpZ25hbHMpOiBGaXggdGVzdCBmb3IgcXVlcnkucmV0dXJuX3R5cGUuCisJKHNldF9vYmplY3RfcHJvcGVydHkpOiBVcGRhdGUgaW52b2NhdGlvbiBvZiBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwuCisJKGludm9rZV9vYmplY3RfbWV0aG9kKTogTWFueSBjaGFuZ2VzLiAgSGFuZGxlIGFzeW5jaHJvbm91cworCWludm9jYXRpb25zLiAgQ29udmVydCBhcmd1bWVudHMgd2l0aAorCWRidXNfZ3ZhbHVlX2RlbWFyc2hhbF9tZXNzYWdlLiAgSGFuZGxlIGVycm9ycy4gIFVzZQorCURCdXNTaWduYXR1cmVJdGVyIGluc3RlYWQgb2Ygc3RybGVuIG9uIGFyZ3MuIEhhbmRsZSBhbGwgYXJndW1lbnRzCisJZ2VuZXJpY2FsbHkuICBTcGVjaWFsLWNhc2UgdmFyaWFudHMuCisJKGRidXNfZ19tZXRob2RfcmV0dXJuLCBkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcik6IE5ldyBmdW5jdGlvbi4KKwkoREJ1c0dTaWduYWxDbG9zdXJlKTogTmV3IHN0cnVjdHVyZSwgY2xvc2VzIG92ZXIgc2lnbmFsCisJaW5mb3JtYXRpb24uCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9uZXcpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19zaWduYWxfY2xvc3VyZV9maW5hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc2lnbmFsX2VtaXR0ZXJfbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbjsgaXMgc3BlY2lhbCBtYXJzaGFsbGVyCisJd2hpY2ggZW1pdHMgc2lnbmFscyBvbiBidXMuCisJKGV4cG9ydF9zaWduYWxzKTogTmV3IGZ1bmN0aW9uOyBpbnRyb3NwZWN0cyBvYmplY3Qgc2lnbmFscyBhbmQKKwljb25uZWN0cyB0byB0aGVtLgorCShkYnVzX2dfb2JqZWN0X3R5cGVfaW5zdGFsbF9pbmZvKTogVGFrZSBHVHlwZSBpbnN0ZWFkIG9mCisJR09iamVjdENsYXNzLgorCShkYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdCk6IEludm9rZSBleHBvcnRfc2lnbmFscy4KKwkoZGJ1c19nX2Nvbm5lY3Rpb25fbG9va3VwX2dfb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgorCShEQnVzR0Z1bmNTaWduYXR1cmUpIE5ldyBzdHJ1Y3R1cmU7IHVzZWQgZm9yIG1hcHBpbmcgdHlwZQorCXNpZ25hdHVyZXMgdG8gbWFyc2hhbGxlcnMuCisJKGZ1bmNzaWdfaGFzaCk6IE5ldyBmdW5jdGlvbjsgaGFzaGVzIERCdXNHRnVuY1NpZ25hdHVyZS4KKwkoZnVuY3NpZ19lcXVhbCk6IE5ldyBmdW5jdGlvbjsgY29tcGFyZXMgREJ1c0dGdW5jU2lnbmF0dXJlLgorCShfZGJ1c19nb2JqZWN0X2xvb2t1cF9tYXJzaGFsbGVyKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXIpOiBOZXcgZnVuY3Rpb247IHVzZWQgdG8KKwlyZWdpc3RlciBhIG1hcnNoYWxsZXIgYXQgcnVudGltZSBmb3IgYSBwYXJ0aWN1bGFyIHNpZ25hdHVyZS4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKF9kYnVzX2dtYWluX3Rlc3QpOiBBZGQgdmFyaW91cyB0ZXN0cy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6IEFkZCBEQlVTX0dMSUJfQU5OT1RBVElPTl9BU1lOQworCXdoaWNoIG5vdGVzIGEgc2VydmVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUKKwlhc3luY2hyb25vdXMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jCisJKGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX3NlcnZlcik6IENhbGwKKwlkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdC4KKwkod3JpdGVfZm9ybWFsX3BhcmFtZXRlcnMpOiBVc2UgZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZS4gIEhhbmRsZQorCXZhcmlhbnRzIHNwZWNpYWxseS4KKwkoZGJ1c19nX3R5cGVfZ2V0X2xvb2t1cF9mdW5jdGlvbik6IFR1cm4gR1R5cGUgaW50byBhbiBpbnZvY2F0aW9uCisJb2YgYSBsb29rdXAgZnVuY3Rpb24uCisJKHdyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbik6IFVzZSBkYnVzX2dfdHlwZV9nZXRfbG9va3VwX2Z1bmN0aW9uLgorCSh3cml0ZV91bnR5cGVkX291dF9hcmdzKTogTmV3IG1ldGhvZDsgd3JpdGUgb3V0cHV0IGFyZ3VtZW50cy4KKwkod3JpdGVfZm9ybWFsX2RlY2xhcmF0aW9uc19mb3JfZGlyZWN0aW9uKTogRnVuY3Rpb24gZm9yCisJd3JpdGluZyBwcm90b3R5cGVzLgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVyc19mb3JfZGlyZWN0aW9uKTogRnVuY3Rpb24gZm9yCisJd3JpdGluZyBpbXBsZW1lbnRhdGlvbnMuCisJKHdyaXRlX3R5cGVkX2FyZ3NfZm9yX2RpcmVjdGlvbik6IEZ1bmN0aW9uIGZvciB3cml0aW5nCisJYXJndW1lbnRzIHByZWZpeGVkIHdpdGggR1R5cGVzLgorCSh3cml0ZV9hc3luY19tZXRob2RfY2xpZW50KTogV3JpdGUgb3V0IGFzeW5jIHZlcnNpb24KKwlvZiBtZXRob2QuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOiBJbmNsdWRlIGRidXMtZ3ZhbHVlLXV0aWxzLmguCisJKGRidXNfZ190eXBlX2dldF9tYXJzaGFsX25hbWUpOiBNb3ZlIG1hcHBpbmcgZnJvbSBHVHlwZQorCXRvIG1hcnNoYWwgbmFtZSBpbnRvIGhlcmUuCisJKGRidXNfZ190eXBlX2dldF9jX25hbWUpOiBNb3ZlIGludG8gaGVyZS4KKwkoY29tcHV0ZV9tYXJzaGFsbGVyKTogQ29udmVydCBzaWduYXR1cmUgdG8gdHlwZSB3aXRoCisJZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZSwgdXNlIGRidXNfZ190eXBlX2dldF9tYXJzaGFsX25hbWUuCisJKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKTogRGl0dG8uCisJKGNvbXB1dGVfbWFyc2hhbGxlcik6IEhhbmRsZSBhc3luYyBzaWduYWwgYW5ub3RhdGlvbnMuCisJKGdhdGhlcl9tYXJzaGFsbGVycyk6IFJldHVybiBpZiB3ZSBkb24ndCBoYXZlIGEga25vd24KKwlwcmVmaXguCisJKGdlbmVyYXRlX2dsdWUpOiBDb2xsZWN0IGludHJvc3BlY3Rpb24gYmxvYiBoZXJlLCBhbmQKKwl3cml0ZSBhbGwgb2YgdGhlIGJsb2IgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzIGFuIG9iamVjdAorCXdpdGggbXVsdGlwbGUgaW50ZXJmYWNlcyB0byB3b3JrLgorCU1hcmsgYXN5bmMgbWV0aG9kcyBpbiBpbnRyb3NwZWN0aW9uIGJsb2IuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGxpYmRidXNfZ2xpYl8xX2xhX1NPVVJDRVMpOiBBZGQKKwlkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmMsIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwKKwlkYnVzLWd2YWx1ZS11dGlscy5oLCBkYnVzLWd2YWx1ZS11dGlscy5jLgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOiBEb24ndCBpbmNsdWRlIGRidXMtcHJvdG9jb2wuaDsgdGhpcworCWF2b2lkcyBwZW9wbGUgYWNjaWRlbnRhbGx5IHVzaW5nIERCVVNfVFlQRV8qIHdoaWNoIHNob3VsZAorCW5vdCBiZSBuZWNlc3NhcnkgYW55bW9yZS4KKwlEbyBpbmNsdWRlIGRidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuaCwgd2hpY2ggYXJlIHV0aWxpdGllcworCWZvciBHTGliIGNvbnRhaW5lciB0eXBlcy4KKwlBZGQgdmFyaW91cyAjZGVmaW5lcyBmb3IgdHlwZXMgc3VjaCBhcworCURCVVNfVFlQRV9HX0JPT0xFQU5fQVJSQVkuCisJKERCdXNHVmFsdWVJdGVyYXRvciwgREJ1c0dWYWx1ZSk6IERlZmluZSwgbm90IGZ1bGx5IHVzZWQKKwl5ZXQuCisJKGRidXNfZ192YWx1ZV9nZXRfZ190eXBlKTogVHlwZSBmb3IgcmVjdXJzaXZlIHZhbHVlLgorCShkYnVzX2dfdmFsdWVfb3BlbiwgZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZSkKKwkoZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX2dldF92YWx1ZXMsIGRidXNfZ192YWx1ZV9pdGVyYXRvcl9yZWN1cnNlKQorCShkYnVzX2dfdmFsdWVfZnJlZSk6IFByb3RvdHlwZXMuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlciwgZGJ1c19nX3Byb3h5X25ld19mcm9tX3Byb3h5KTogUHJvdG90eXBlLgorCShkYnVzX2dfcHJveHlfc2V0X2ludGVyZmFjZSk6IFByb3RvdHlwZS4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwsIGRidXNfZ19wcm94eV9lbmRfY2FsbCkKKwkoZGJ1c19nX3Byb3h5X2NhbGxfbm9fcmVwbHkpOiBUYWtlIEdMaWIgdHlwZXMgaW5zdGVhZCBvZiBEQnVzCisJdHlwZXMuCisJKGRidXNfZ19wcm94eV9nZXRfcGF0aCwgZGJ1c19nX3Byb3h5X2dldF9pbnRlcmZhY2UpOgorCUFjY2Vzc29ycy4KKwkoREJ1c0dBc3luY0RhdGEsIERCdXNHTWV0aG9kSW52b2NhdGlvbik6IFN0cnVjdHVyZXMgZm9yCisJZG9pbmcgYXN5bmMgaW52b2NhdGlvbnMuCisJKGRidXNfZ19tZXRob2RfcmV0dXJuLCBkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcik6CisJUHJvdG90eXBlcy4KKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogVXBkYXRlIEdMaWIgc2VjdGlvbi4KKwkKKwkqIHRvb2xzL2RidXMtdmlld2VyLmMgKGxvYWRfY2hpbGRfbm9kZXMpOiBVcGRhdGUKKwlmb3IgbmV3IGludm9jYXRpb24gdHlwZSBvZiBkYnVzX2dfcHJveHlfZW5kX2NhbGwuCisJKGxvYWRfZnJvbV9zZXJ2aWNlX3RocmVhZF9mdW5jKTogRGl0dG8uCisKKwkqIHRvb2xzL3ByaW50LWludHJvc3BlY3QuYyAobWFpbik6IERpdHRvLgorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmMgKGhhdmVfbmFtZXNfbm90aWZ5KQorCShuYW1lc19tb2RlbF9yZWxvYWQsIG5hbWVzX21vZGVsX3NldF9jb25uZWN0aW9uKQorCVVzZSBHVHlwZXMuCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBEZWZpbmUgREJVU19DT01QSUxBVElPTiwKKwluZWVkZWQgc2luY2UgUHl0aG9uIGJpbmRpbmdzIHVzZSBHTGliIGJpbmRpbmdzLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogRGVmaW5lIERCVVNfQ09NUElMQVRJT04uCisJQWRkIC0tcHJlZml4IGFyZ3VtZW50LgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogRGVmaW5lIERCVVNfQ09NUElMQVRJT04uICBSZW1vdmUKKwl1bm5lZWRlZCAtLWlnbm9yZS11bnN1cHBvcnRlZCBhcmcuCisJCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOgorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBtYW55IG1vcmUgdGVzdHMuCisKKzIwMDUtMDYtMDYgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IEFkZCBpdGVtIGFib3V0IG5lZWQgdG8gcmVtb3ZlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBBZGQgcHJvdG90eXBlIGZvciBkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCk6IE5ldyBmdW5jdGlvbgorCXRvIHJlcGFpciB0aGUgQUJJIHdoaWNoIHdhcyBicm9rZW4gd2l0aCB0aGUgbGFzdCBjb21taXQuCisKKzIwMDUtMDYtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCSogIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIGRidXMvZGJ1cy1jb25uZWN0aW9uLmggCisJKGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0KTogcmVuYW1lZCB0byBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgCisJZm9yIEFQSSBzeW1tZXRyeSB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuCisJKF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCk6IAorCXMvZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QvZGJ1c19jb25uZWN0aW9uX2Nsb3NlCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfZ2V0KToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfdW5yZWYsIAorCWJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uLCBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUpOgorCXMvZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QvZGJ1c19jb25uZWN0aW9uX2Nsb3NlCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2gsIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24sIAorCWtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkLCBjaGVja19oZWxsb19jb25uZWN0aW9uKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBidXMvYnVzLmMgKG5ld19jb25uZWN0aW9uX2NhbGxiYWNrKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jIChub19idXNfdGhyZWFkX2Z1bmMsIHdpdGhfYnVzX3RocmVhZF9mdW5jKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCQorCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAocGF0aF9tZXNzYWdlX2Z1bmMsIGZpbHRlcl9mdW5jKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCQorCSogZG9jL1RPRE86IHJlbW92ZSBjb25uZWN0aW9uX29wZW4vY29ubmVjdGlvbl9kaXNjb25uZWN0IGxhY2tzIHN5bW1ldHJ5IAlpdGVtIHRoYXQgd2FzIGp1c3QgZml4ZWQKKwkKKzIwMDUtMDUtMjUgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBNb3ZlIHZhcmlvdXMgYnVzIHNlcnZpY2UgI2RlZmluZXMgc3VjaAorCSAgYXMgREJVU19TRVJWSUNFX0RCVVMgYW5kIERCVVNfTkFNRV9GTEFHX1BST0hJQklUX1JFUExBQ0VNRU5UIHRvCisJICBkYnVzL2RidXMtc2hhcmVkLmguCisJKiBkYnVzL2RidXMtc2hhcmVkLmg6IFZhcmlvdXMgZGVmaW5lcyBtb3ZlZCBoZXJlLgorCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmM6IEluY2x1ZGUgZGJ1cy1zaGFyZWQuaC4KKworMjAwNS0wNS0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBQeXRob24gYmluZGluZ3MgZGVzZXJ2ZSBhIG1pbm9yIHZlcnNpb24KKwl1cGRhdGUuICBVcHBlZCB0byAoMCwgNDAsIDIpCisKKzIwMDUtMDUtMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5OiBhZGQgZXhwbGljaXRseV9wYXNzX21lc3NhZ2UgZGVjb3JhdG9yCisJZm9yIHBhc3NpbmcgaW4gdGhlIGRidXMgbWVzc2FnZSBhcyBrZXl3b3JkIGZvciBlZGdlIGNhc2Ugc2lnbmFsCisJaGFuZGxpbmcKKworCSogcHl0aG9uL21hdGNocnVsZXMucHkgKFNpZ25hbE1hdGNoUnVsZS5fX3JlcHJfXyk6IGZpeCBvdXRwdXQKKwl0byBjb25mb3JtIHdpdGggd2hhdCBkYnVzIGV4cGVjdHMgZm9yIG1hdGNoIHJ1bGVzCisJKFNpZ25hbE1hdGNoUnVsZS5leGVjdXRlKTogYWRkIHRoZSBkYnVzIG1lc3NhZ2UgYXMgYSBrZXl3b3JkCisJaWYgdGhlIHNpZ25hbCBoYW5kbGVyIGhhcyByZXF1ZXN0ZWQgaXQKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUvc2lnbmFsLXJlY2lwaWVudC5weTogYWRkZWQgc29tZSBtb3JlCisJZXhhbXBsZXMgb24gaG93IHRvIGhvb2sgdXAgdG8gc2lnbmFscworCisyMDA1LTA1LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weTogaW1wb3J0IGRidXNfYmluZGluZ3MKKworCSogcHl0aG9uL21hdGNocnVsZXMucHkgKFNpZ25hbE1hdGNoUnVsZSwgU2lnbmFsTWF0Y2hUcmVlLCAKKwlTaWduYWxNYXRjaE5vZGUpOiBuZXcgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB3aWxkY2FyZCBzaWduYWwKKwljYWxsYmFjayBtYXRjaGluZyB1c2luZyBhIHRyZWUgbG9va3VwLiBIZWF2aWx5IG1vZGlmaWVkIGZyb20gYQorCXBhdGNoIHNlbnQgYnkgQ2Vsc28gUGludG8gKGZkLm8gYnVnICMzMjQxKQorCisJKiBfZGJ1cy5weSAoYWRkX3NpZ25hbF9yZWNlaXZlciwgcmVtb3ZlX3NpZ25hbF9yZWNlaXZlciwgX3NpZ25hbF9mdW5jKToKKwl1c2UgbmV3IG1hdGNoIGNsYXNzZXMgdG8gaGFuZGxlIHNpZ25hbHMuCisKKzIwMDUtMDUtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IHMvVFlQRV9QQVRIL1RZUEVfT0JKRUNUX1BBVEgKKworMjAwNS0wNS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIEdMSUJfR05VX0dFVFRFWFQgdG8gZ2V0IElOVExMSUJTIGFuZCByZXF1aXJlCisJZ2V0dGV4dC4gTm90IHJlYWxseSB3b3J0aCByZXF1aXJpbmcgeWV0IHBlcmhhcHMsIGJ1dCBhbnkKKwlwcm9kdWN0aW9uIHF1YWxpdHkgMS4wIHdvdWxkIHJlcXVpcmUgaXQgc28gd2Ugc2hvdWxkIGdvIGFoZWFkIGFuZAorCWdldCB0aGluZ3Mgc2V0IHVwLiBXZSBkbyBoYXZlIGEgY291cGxlIHRva2VuIGNhbGxzIHRvCisJYmluZHRleHRkb21haW4gaW4gdGhlIGNvZGUgYWxyZWFkeS4KKworMjAwNS0wNS0xNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGlvX2hhbmRsZXJfZGlzcGF0Y2gpOiBmaXggZGVhZGxvY2sKKwl3aGVuIHVzaW5nIHJlY3Vyc2l2ZSBnX21haW5fbG9vcHMKKworCSogcHl0aG9uL19kYnVzLnB5IChjbGFzcyBCdXMpOiBhZGQgdGhlIFByb3h5T2JqZWN0Q2xhc3MKKwlhbGlhcyBmb3IgUHJveHlPYmplY3QgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBUd2lzdGVkIAorCW5ldHdvcmtpbmcgZnJhbWV3b3JrIHRvIGludGVncmF0ZSBkYnVzLgorCisJKiBweXRob24vcHJveGllcy5weSAoY2xhc3MgUHJveHlPYmplY3QpOiBhZGQgdGhlIFByb3h5TWV0aG9kQ2xhc3MKKwlhbGlhcyBmb3IgUHJveHlNZXRob2QgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBUd2lzdGVkIAorCW5ldHdvcmtpbmcgZnJhbWV3b3JrIHRvIGludGVncmF0ZSBkYnVzLiAKKworMjAwNS0wNS0xMSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmM6IEFkZCAtLXByZWZpeCBhcmd1bWVudC4KKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oOiBBZGQgcHJlZml4IGFyZ3VtZW50LgorCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKToKKwlBZGQgcHJlZml4IGFyZ3VtZW50LgorCShnZW5lcmF0ZV9nbHVlKTogUGFzcyBwcmVmaXggYXJndW1lbnQgZG93bi4KKwkoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfc2VydmVyKTogUGFzcyBwcmVmaXggdG8KKwlnbGliLWdlbm1hcnNoYWwuCisJCisyMDA1LTA1LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2FycmF5KTogTmV3IGZ1bmN0aW9uLgorCShhcHBlbmRfYXJnKTogQnJva2VuIG91dCBmcm9tIG1haW4uCisJKG1haW4pOiBBZGQgY2hlZXN5IGhhY2sgdG8gc2VuZCBhcnJheXMgYW5kIHZhcmlhbnRzLgorCSh1c2FnZSk6IFVwZGF0ZS4KKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9pdGVyKTogQnJva2VuIG91dAorCWZyb20gbWFpbi4KKworMjAwNS0wNS0xMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9zaWduYXR1cmUpOgorCU5ldyBmdW5jdGlvbiwgcmV0dXJucyBzaWduYXR1cmUgc3RyaW5nIGZvciBzaWduYXR1cmUgaXRlci4KKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuaDogUHJvdG90eXBlIGl0LgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3NpZ25hdHVyZSk6CisJTmV3IGZ1bmN0aW9uLCByZXR1cm5zIHNpZ25hdHVyZSBzdHJpbmcgZm9yIG1lc3NhZ2UgaXRlci4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbik6IE5ldyBmdW5jdGlvbiwgcmV0dXJucworCWxlbmd0aCBvZiBhcnJheS4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KTogRml4IGFzc2VydGlvbjsgdGhpcworCWZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGl0ZXIgaXMgcG9pbnRpbmcgdG8gdGhlCisJY29udGVudHMgb2YgYW4gYXJyYXkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IFByb3RvdHlwZXMuCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCk6CisJTmV3IGZ1bmN0aW9uOyByZXR1cm5zIGxlbmd0aCBvZiBhbiBhcnJheS4KKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oOiBQcm90b3R5cGUgaXQuCisJCisyMDA1LTA1LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgPCFIQVZFX1BPU0lYX0dFVFBXTkFNX1I+OiBGaXgKKwljb21waWxhdGlvbiBlcnJvci4KKwkKKzIwMDUtMDUtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiB3cml0ZSB0aGUKKwlkYWVtb24ncyBwaWQsIG5vdCB0aGUgcGFyZW50J3MgcGlkLCB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLgorCVJlcG9ydGVkIGJ5IFRhaiBNb3J0b24uCisKKzIwMDUtMDUtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKExUXyopOiBhZGQgbm90ZXMgb24gaG93IHRoZSBsaWJ0b29sIHZlcnNpb25pbmcKKwl3b3JrcyB0byBzYXZlIHRoaW5raW5nLiBJbmNyZW1lbnQgc29uYW1lIHRvIGluZGljYXRlIHByb3RvY29sCisJYnJlYWthZ2UgKHRob3VnaCByZWFsbHkgdGhlIGxpYnJhcnkgaW50ZXJmYWNlIGhhc24ndCBjaGFuZ2VkIEkKKwlndWVzcykKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCXZlcmlmeSB0aGUgR1VJRCByZWNlaXZlZCBmcm9tIHNlcnZlciBtYXRjaGVzIHdoYXQgd2Ugd2VyZQorCWV4cGVjdGluZywgaWYgd2UgaGFkIGFuIGV4cGVjdGF0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHNlbmRfb2spOiBzZW5kIEdVSUQgYWxvbmcgd2l0aCB0aGUgT0sgY29tbWFuZAorCShfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyKTogbmV3IGZ1bmN0aW9uCisJKHNlbmRfYmVnaW4pOiBwYXJzZSB0aGUgT0sgYXJncworCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIEdVSUQgdG8gdGhlIGF1dGggcHJvdG9jb2wKKworMjAwNS0wNS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogRml4IG15IG5hbWUgaW4gcHJldmlvdXMgY2hhbmdlbG9nIDspCisKKwkqIHB5dGhvbi9wcm94aWVzLnB5IChQcm94eU9iamVjdC5fX2dldGF0dHJfXyk6IGFkZCBmdXJ0aGVyIHBhdGNoCisJZnJvbSBBbnRob255IEJheHRlciB0byB0aHJvdyBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIHB5dGhvbiAKKwlfX3NwZWNpYWxfXyBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbnN0ZWFkIG9mIG1hcnNobGluZyB0aGVtIG92ZXIgCisJdGhlIGJ1cyAoQnVnIzE2ODUgY29tbWVudCAzKS4KKworMjAwNS0wNS0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiBjaGFuZ2VkIHRvIHVzZSBweWV4ZWNkaXIgZm9yIHRoZSBiaW5kaW5nCisJc2hhcmVkIGxpYnJhcmllcyAoQnVnIzI0OTQpCisKKwkqIHB5dGhvbi9leGNlcHRpb25zLnB5OiBicmluZyBleGNlcHRpb25zIG92ZXIgZnJvbSB0aGUgYmluZGluZ3MKKwlzbyB0aGV5IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucyAoQnVnIzIwMzYpCisJTWFrZSBhbGwgZXhjZXB0aW9ucyBkZXJpdmUgZnJvbSBEQnVzRXhjZXB0aW9uCisKKwkqIHB5dGhvbi9fZGJ1cy5weSwgcHl0aG9uL3Byb3hpZXMucHk6IGltcGxlbWVudCBfX3JlcHJfXyBpbiBhIGNvdXBsZQorCW9mIGNsYXNzZXMgc28gdGhhdCBwcmludCBvYmogZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gKEJ1ZyAjMTY4NSkKKworMjAwNS0wNS0wMyAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdCk6CisJUmV0dXJuIGlmIHdlIGdldCBhbiBlcnJvciBkdXJpbmcgcmVnaXN0cmF0aW9uLiAgU2V0IHVwIGEKKwl3ZWFrIHJlZmVyZW5jZSBvbiBvYmplY3QgdG8gdW5yZWdpc3RlciBpZiBvYmplY3QgaXMgZGVzdHJveWVkLgorCSh1bnJlZ2lzdGVyX2dvYmplY3QpOiBOZXcgZnVuY3Rpb24uCisJCisyMDA1LTA1LTAxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IAorCS0gYWRkZWQgbmV3IHR5cGUgY2xhc3NlcyBmb3IgaGludGluZyB0byB0aGUgbWFyYXNoYWxlciB3aGF0IHR5cGUgCisJdG8gc2VuZCBvdmVyIHRoZSB3aXJlCisJLSBhZGRlZCBpbnQxNiBhbmQgdWludDE2IG1hcnNoYWxlcnMKKwktIEZpeGVkIGEgYnVnIGluIHRoZSB0eXBlIGNvbnN0YW50cyB0aGF0IGNhdXNlZCBpbnQzMiB0byBnbyBvdXQKKwlhcyB1aW50MTYgb3ZlciB0aGUgd2lyZQorCSogcHl0aG9uL2RidXMucHk6IHNwbGl0IHVwIGludG8gZGlmZmVyZW50IGZpbGVzIGFuZCByZW5hbWVkIF9kYnVzLnB5CisJKiBweXRob24vX19pbml0X18ucHksIHB5dGhvbi9fdXRpbC5weSwgcHl0aG9uL2RlY29yYXRvcnMucHksIAorCXB5dGhvbi9leGNlcHRpb25zLnB5LCBweXRob24vcHJveGllcy5weSwgcHl0aG9uL3NlcnZpY2VzLnB5LAorCXB5dGhvbi90eXBlcy5weTogbmV3IGZpbGVzIHNwbGl0IG9mZiBmcm9tIGRidXMucHkKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogQWRkIG5ldyBmaWxlcywgcmVtb3ZlIGRidXMucHkgYW5kIAorCWluc3RhbGwgYWxsIHB5dGhvbiBmaWxlcyB0byA8cHl0aG9uIG1vZHVsZSBkaXI+L2RidXMKKwkqIHB5dGhvbi9leGFtcGxlcy8qOiBBZGRlZCAjIS91c3IvYmluL2VudiBweXRob24gdG8gdGhlIHRvcCBvZgorCWV2ZXJ5IGV4YW1wbGUuICBQYXRjaCBwcm92aWRlZCBieSBUYXRhdmFydHkgS2FseWFuCisKKzIwMDUtMDQtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjMzCisKKzIwMDUtMDQtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoc2VuZF93aXRoX3JlcGx5X2hhbmRsZXJzKTogTmV3IHNlbmQKKwltZXRob2QgZm9yIGRvaW5nIGFzeW5jIGNhbGxzCisJKF9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uKTogTmV3IEMgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHBlbmRuaW5nIGNhbGwKKwljYWxsYmFja3MKKwkoc2V0X25vdGlmeSk6IE5ldyBtZXRob2QgZm9yIHNldHRpbmcgcGVuZGluZyBjYWxsIG5vdGlmaWNhdGlvbgorCQorCSogcHl0aG9uL2RidXMucHk6IG5ldyB2ZXJzaW9uIHR1cGxlICJ2ZXJzaW9uIiBpcyBzZXQgYXQgKDAsIDQwLCAwKQorCUFzeW5jIGNhcGFiaWxpdGllcyBhZGRlZCB0byByZW1vdGUgbWV0aG9kIGNhbGxzCisJKFNlbmRlcik6IGNsYXNzIHJlbW92ZWQKKwkoUmVtb3RlU2VydmljZSk6IGNsYXNzIHJlbW92ZWQKKwkoT2JqZWN0VHJlZSk6IGNsYXNzIHJlbW92ZWQgZm9yIG5vdworCShSZW1vdGVPYmplY3QpOiBSZW5hbWVkIHRvIFByb3h5T2JqZWN0CisJKFJlbW90ZU1ldGhvZCk6IFJlbmFtZWQgdG8gUHJveHlNZXRob2QKKwkobWV0aG9kKTogRGVjb3JhdG9yIGFkZGVkIGZvciBkZWNvcmF0aW5nIHB5dGhvbiBtZXRob2RzIGFzIGRidXMgbWV0aG9kcworCShzaWduYWwpOiBEZWNvcmF0b3IgYWRkZWQgZm9yIGRlY29yYXRpbmcgcHl0aG9uIG1ldGhvZHMgYXMgc2lnbmFsIGVtaXR0ZXJzCisJKE9iamVjdFR5cGUpOiBNZXRhY2xhc3MgYWRkZWQgZm9yIGdlbmVyYXRpbmcgaW50cm9zcGVjdGlvbiBkYXRhIGFuZCB0aGUKKwltZXRob2QgY2FsbGJhY2sgdnRhYmxlCisJKEludGVyZmFjZSk6IFdyYXBwZXIgY2xhc3MgYWRkZWQgdG8gd3JhcCBvYmplY3RzIGluIGEgZGJ1cyBpbnRlcmZhY2UKKwkoT2JqZWN0KTogVXNlcyBPYmplY3RUeXBlIGFzIGl0cyBtZXRhY2xhc3MgYW5kIGV4cG9ydHMgSW50cm9zcGVjdAorCW9mIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UKKwkoVmFsaWRhdGlvbkV4Y2VwdGlvbiwgVW5rbm93bk1ldGhvZEV4Y2VwdGlvbik6IG5ldyBleGNlcHRpb25zCisKKwkqIHB5dGhvbi9leGFtcGxlcy8qOiBNb2RpZmllZCB0byBmaXQgd2l0aCB0aGUgbmV3IGJpbmRpbmdzCisKKzIwMDUtMDQtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MpOiBmaXggZG9jIGNvbW1lbnQsCisJcmVwb3J0ZWQgYnkgVG9ueSBIb3VnaHRvbgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogdGVzdAorCWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChmaW5kX2hhbmRsZXIpOiBiZSBzdXJlIHdlIGFsd2F5cyBpbml0CisJdGhlIGV4YWN0X21hdGNoCisJKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQpOiBuZXcgZnVuY3Rpb24gdXNlZCBieQorCWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpCisJKGRvX3JlZ2lzdGVyKTogYWRkIGFzc2VydGlvbiB0ZXN0IGZvciBnZXRfdXNlcl9kYXRhX3VubG9ja2VkCisJKG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uKTogbW9yZSB0ZXN0cworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEpOgorCW5ldyBmdW5jdGlvbiBmcm9tIERhbiBSZWVkIHRvIGxldCB5b3UgZ2V0IHRoZSB1c2VyIGRhdGEgZnJvbSAKKwlkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKQorCisyMDA1LTA0LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jOiBGaXhlZCBidWZmZXIgb3ZlcmZsb3cKKwlpbiBudW1lcm91cyBwbGFjZXMgdGhhdCBkaWQgbm90IGFjY291bnQgZm9yIHRoZSBOVUxMIHRlcm1pbmF0b3IKKwkoc2lnbmF0dXJlX2Zyb21fc2VlZCk6IGNoYW5nZWQgdGhlIG1hbnVhbCBzdHJpbmcgY29weSBsb29wIHRvIAorCWp1c3QgdXNlIHN0cmNweSBpbnN0ZWFkCisJbWFrZSBjaGVjayBzaG91bGQgbm93IHBhc3MKKworMjAwNS0wNC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMgKF9kYnVzX2hlYWRlcl9jcmVhdGUpOiBGaXggYXNzZXJ0CisJc28gdGhhdCBpdCBhbGxvd3MgbWVzc2FnZXMgdGhhdCBhcmUgbm90IHNpZ25hbHMgdG8gcGFzcyBpbiAKKwlOVUxMIGFzIHRoZSBpbnRlcmZhY2UuCisKKzIwMDUtMDQtMTggIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGlvX2hhbmRsZXJfZGVzdHJveV9zb3VyY2UpOiAKKwkodGltZW91dF9oYW5kbGVyX2Rlc3Ryb3lfc291cmNlLCBjb25uZWN0aW9uX3NldHVwX2ZyZWUpOiAKKwlBbHNvIHVucmVmIHRoZSBzb3VyY2UgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorCisyMDA1LTA0LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IEJ1bXAgdGhpcyB0byBhCisJbW9yZSByZWFzb25hYmxlLCB5ZXQgc3RpbGwgdG90YWxseSBhcmJpdHJhcnksIHZhbHVlIDotKS4gCisKKzIwMDUtMDQtMTMgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IEFkZGVkIGFuICJpbXBvcnRhbnQgZm9yIDEuMCIgaXRlbSBhYm91dCBzZWxpbnV4CisJYWxsb3cvZGVueSBtZXNzYWdlcworCisyMDA1LTA0LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZWxpbnV4LmM6IEFkZCBjLWZpbGUtc3R5bGUgdG8gdG9wIG9mIGZpbGUKKwkobG9nX2F1ZGl0X2NhbGxiYWNrKTogRG9uJ3QgZnJlZSB0aGUgZGF0YSBoZXJlIGFueW1vcmUKKwkoYnVzX3NlbGludXhfY2hlY2spOiBEb24ndCB0YWtlIHNwaWQgYW5kIHRwaWQgc2luY2UgYXBwZW5kaW5nCisJdGhhdCB0byBhdXhkYXRhIG1heSBPT00uCisJKGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UpOiBIYW5kbGUgT09NIGFuZCBzaWduYWwgYmFjaworCXRvIHRoZSBjYWxsZXIgaWYgd2UgYXJlIE9PTSBieSB0YWtpbmcgYW4gZXJyb3Igb2JqZWN0LgorCShidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IC1kby0KKworCSogYnVzL3NlbGludXguaDogRml4IHByb3RvdHlwZXMgZm9yIGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UKKwlhbmQgYnVzX3NlbGludXhfYWxsb3dzX3NlbmQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBQYXNzIGVycm9yIGFuZAorCXBhc3Mgb24gT09NIHRocm93biBieSBidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCgpCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogUGFzcyBlcnJvciBhbmQKKwlwYXNzIG9uIE9PTSB0aHJvd24gYnkgYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSgpCisKKzIwMDUtMDQtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAobWVzc2FnZV9xdWV1ZV9kaXNwYXRjaCk6IG9ubHkgZGlzcGF0Y2ggb25lCisJbWVzc2FnZSBhdCBhIHRpbWUgdG8gYXZvaWQgbW9ub3BvbGl6aW5nIHRoZSBtYWluIGxvb3AsIGJ1ZyAKKwkjMjk1MyBmcm9tIEJlbmphbWluIE90dGUKKworMjAwNS0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoY29weSk6IGNoYW5nZSBhIG1lbWNweSB0byBtZW1tb3ZlIGR1ZSB0bworCXBvc3NpYmxlIG92ZXJsYXAsIGZpeCBmcm9tIERhbmllbCBSZWVkCisJKGZpeHVwX2FsaWdubWVudCk6IGZpeCBzaWduZWRuZXNzIHdhcm5pbmdzCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhcik6IGRpdHRvCisKKzIwMDUtMDQtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgKF9kYnVzX21lc3NhZ2VfdGVzdCk6IGZpeCBzaWduZWRuZXNzIHdhcm5pbmcKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jIChtYWluKTogZml4IHdhcm5pbmcKKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdlbmVyYXRlX2dsdWUpOiBmaXggd2FybmluZworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCk6CisJYWRkIGEgbmV3IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gc2ltcGxlIGFwcGxpY2F0aW9ucyB0aGF0CisJZG9uJ3QgaGF2ZSBhIG1haW4gbG9vcCBhbmQgYXJlIHdpbGxpbmcgdG8gYmxvY2sKKworMjAwNS0wNC0wNSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJRml4IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTI4ODkKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJKGlvX2hhbmRsZXJfZGVzdHJveV9zb3VyY2UpOiBSZW1vdmUgZnJvbSBsaXN0IG9mIElPIGhhbmRsZXJzCisJb2YgdGhlIENvbm5lY3Rpb25TZXR1cCBvYmplY3QKKwkodGltZW91dF9oYW5kbGVyX2Rlc3Ryb3lfc291cmNlKTogLWRvLSBmb3IgdGltZW91dCBoYW5kbGVycworCShpb19oYW5kbGVyX3NvdXJjZV9maW5hbGl6ZWQpOiBEb24ndCByZW1vdmUgZnJvbSBsaXN0IHNpbmNlCisJd2Ugbm93IGRvIHRoYXQgaW4gaW9faGFuZGxlcl9kZXN0cm95X3NvdXJjZSgpLiBSZW5hbWVkIGZyb20KKwlpb19oYW5kbGVyX3NvdXJjZV9kZXN0cm95ZWQKKwkodGltZW91dF9oYW5kbGVyX3NvdXJjZV9kZXN0cm95ZWQpOiAtZG8tIGZvciB0aW1lb3V0IGhhbmRsZXJzCisJKGNvbm5lY3Rpb25fc2V0dXBfZnJlZSk6IEl0IGlzIG5vdyBzYWZlIHRvIGl0ZXJhdGUgb3ZlciBhbGwKKwlJTyBhbmQgdGltZW91dCBoYW5kbGVycyBhcyB0aGUgX2Rlc3Ryb3lfc291cmNlIHJlbW92ZXMgdGhlbQorCWZyb20gdGhlIGxpc3Qgc3luY2hyb25vdXNseQorCisyMDA1LTAzLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBjaGFuZ2UgY2hlY2sgdG8gZ3RrIDIuNAorCisJKiB0b29scy9kYnVzLXZpZXdlci5jIChuYW1lX2NvbWJvX2NoYW5nZWRfY2FsbGJhY2spOiByZW1vdmUKKwlndGtfY29tYm9fYm94X2dldF9hY3RpdmVfdGV4dCgpIHVzYWdlIHRvIGRlY3JlbWVudCBHVEsgcmVxdWlyZW1lbnQKKwl0byAyLjQKKworMjAwNS0wMy0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogTmV3czogVXBkYXRlIDAuMzIKKworCSogSEFDS0lORzogRml4ZWQgcmVhbGVhc2UgaW5zdHJ1Y3Rpb25zLiAgY29uZmlndXJlLmluIHNob3VsZCBiZSB1cGRhdGVkIHRvCisJICB0aGUgbmV4dCByZWxlYXNlIGJ5IHRoZSBwZXJzb24gd2hvIG1hZGUgdGhlIGxhc3QgcmVsZWFzZS4KKworMjAwNS0wMy0yOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2x2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weSAtIHJlbW92ZWQuICBQYXRjaCBoYXMgYmVlbgorCSAgc3VibWl0dGVkIHRvIFB5cmV4IG1haW50YWluZXJzIHRoYXQgZml4ZXMgZ2NjNC4wIGVycm9ycworCisJKiBweXRob24vTWFrZWZpbGUuYW06IHJlbW92ZWQgcmVmcmVuY2VzIHRvIGx2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weQorCisyMDA1LTAzLTI0ICBEYW5pZWwgUmVlZCAgPG5AbWwub3JnPgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogTWFrZSBwcmludC1pbnRyb3NwZWN0IGFuZAorCWRidXMtYnVzLWludHJvc3BlY3QueG1sIGJ1aWxkaW5nIGNvbmRpdGlvbmFsIG9uIEhBVkVfR0xJQi4KKworMjAwNS0wMy0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IFBhdGNoIGJ5IENvbGluIFdhbHRlcnMgdGhhdCBmaXhlcyBkaXN0Y2hlY2sKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jLCBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYzogQWRkIHBhdGNoIHdlIGhhdmUgCisJICBoYWQgaW4gUmVkIEhhdCBwYWNrYWdlcyBmb3IgYSB3aGlsZSBidXQgZm9yIHNvbWUgcmVhc29uIG5ldmVyIAorCSAgZ290IG1lcmdlZCB1cHN0cmVhbQorCSAgKF9kYnVzX2lzX2FfbnVtYmVyKTogTmV3IGNoZWNrcyBpZiBhIHN0cmluZworCSAgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlciBhbmQgZG9lcyB0aGUgY29udmVyc2lvbiBpZiBpdCBjYW4KKwkgIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCk6IEFkZCBjaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIHVzZXJuYW1lCisJICBpcyBhIHVkaS4gIFRoaXMgYWxsb3dzIHVkaSdzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB1c2VybmFtZXMgaW4gdGhlCisJICBjb25maWcgZmlsZS4KKwkgIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6IEFkZCBjaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIGdyb3VwbmFtZQorCSAgaXMgYSBnZGkuICBUaGlzIGFsbG93cyBnZGkncyB0byBiZSB1c2VkIGluc3RlYWQgb2YgZ3JvdXBuYW1lcyBpbiB0aGUKKwkgIGNvbmZpZyBmaWxlLgorCisyMDA1LTAzLTIxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vbHZhbHVlX2Nhc3RfcG9zdF9wcm9jZXNzLnB5IC0gYWRkZWQgcG9zdCBwcm9jZXNzb3IgdG8gZml4IFB5cmV4CisJICBjb2RlIHNvIHRoYXQgaXQgY29tcGlsZXMgd2l0aCBnY2M0LjAKKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiBBZGRlZCBsdmFsdWVfY2FzdF9wb3N0X3Byb2Nlc3MucHkgdG8gRVhUUkFfRElTVAorCSAgcnVuIGRidXNfYmluZGluZ3MuYyB0aHJvdWdoIGx2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weSBhbmQgY29weSB0aGUKKwkgIHJlc3VsdHMgYmFjayB0byBkYnVzX2JpbmRpbmcuYworCisyMDA1LTAzLTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggc3VnZ2VzdGVkIGJ5IEluZ3V2YSBSYWphc2VraGFyIDxyaW5ndXZhQG5vdmVsbC5jb20+LgorCisJKiBjb25maWd1cmUuaW46IFJlcXVpcmUgR1RLKyAyLjYuCisJCisyMDA1LTAzLTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUywgRElTVF9TVUJESVJTKTogQnVpbGQgdG9vbHMgYmVmb3JlIHRlc3QuCisKKzIwMDUtMDMtMTcgIFRvbSBQYXJrZXIgIDxwYWxmcmV5QHRldnAubmV0PgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwKTogRG9uJ3QKKwlwcmludCBEQlVTX1VJRF9VTlNFVDsgaW5zdGVhZCBwcmludCBwYXNzZWQgdXNlcm5hbWUuICBBbHNvCisJYmUgc3VyZSB0byBhY3R1YWxseSB1c2UgZ2lkIGxvb2tlZCB1cCBpbiBjYWNoZS4KKwkKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6IERpdHRvCisJZm9yIERCVVNfR0lEX1VOU0VUIGFuZCBncm91cG5hbWUuCisKKzIwMDUtMDMtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9wcmludC1pbnRyb3NwZWN0LmM6IE1vdmUgdG8gdG9vbHMvLgorCSogYnVzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogRGl0dG8uCisJCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzLWdsaWItYmluZGluZ3MuaCk6IE1vdmUKKwlnZW5lcmF0aW9uIHRvIHRvb2xzL01ha2VmaWxlLmFtLgorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IFVwZGF0ZSB0byBoYW5kbGUgbW92ZQorCW9mIHJ1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaC4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IFVwZGF0ZSB0byBoYW5kbGUKKwltb3ZlIG9mIGRidXMtZ2xpYi1iaW5kaW5ncy5oLgorCisJKiB0b29scy9wcmludC1pbnRyb3NwZWN0LmM6IE1vdmVkIGhlcmUKKwlmcm9tIGJ1cy8sIGFuZCBwb3J0ZWQgdG8gR0xpYiBiaW5kaW5ncy4KKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBNb3ZlZCBoZXJlCisJZnJvbSBidXMvLgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogR2VuZXJhdGUgZGJ1cy1nbGliLWJpbmRpbmdzLmgKKwlhbmQgZGJ1cy1idXMtaW50cm9zcGVjdC54bWwgaGVyZS4KKworCSogdG9vbHMvLmN2c2lnbm9yZSwgZ2xpYi8uY3ZzaWdub3JlLCBidXMvLmN2c2lnbm9yZToKKwlVcGRhdGUuCisKKzIwMDUtMDMtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAod3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogVXNlCisJX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIHRvIHJldHJpZXZlIHN0cmluZzsKKwlfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIGRvZXNuJ3QgYWN0dWFsbHkgcmV0dXJuCisJYSBOVUxMLXRlcm1pbmF0ZWQgc3Vic3RyaW5nLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogSW5jbHVkZSBkYnVzLWdsaWItYmluZGluZ3MuaC4KKwkobWFpbik6IENoYW5nZSB0byB1c2Ugb3JnX2ZyZWVkZXNrdG9wX0RCdXNfcmVxdWVzdF9uYW1lCisJaW5zdGVhZCBvZiB1c2luZyBnX3Byb3h5X2JlZ2luX2NhbGwvZW5kX2NhbGwuCisKKzIwMDUtMDMtMTUgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jcyAoQnVpbGRGaW5hbGl6ZXIpOiBGaXggc29tZSBpbnZhbGlkIElMIHdoZW4KKwlnZW5lcmF0aW5nIHRoZSBmaW5hbGl6ZXIuICBGaXhlcyBmcm9tIEJlbiBNYXVyZXIuCisKKzIwMDUtMDMtMTIgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0J1c0RyaXZlci5jczogVXBkYXRlIG1ldGhvZCBuYW1lczogTGlzdFNlcnZpY2VzCisJYmVjb21lcyBMaXN0TmFtZXM7IEdldE93bmVyIGJlY29tZXMgR2V0TmFtZU93bmVyLgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jcyAoQnVpbGRGaW5hbGl6ZXIpOiBOZWVkIHRvIGxvYWQgYXJnIDAKKwlvbnRvIHRoZSBldmFsIHN0YWNrIHdoZW4gcmVtb3ZpbmcgdGhlIGRlbGVnYXRlLgorCisyMDA1LTAzLTEyICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9kYnVzLXNoYXJwLmRsbC5jb25maWcuaW46IERvbid0IGhhcmRjb2RlIDAgZm9yCisJTFRfQ1VSUkVOVC4gIFNldCBpdCB0byB0aGUgYXV0b2NvbmYgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSogbW9uby9Qcm94eUJ1aWxkZXIuY3M6IEFkZCBhIGZpbmFsaXplciB0byB0aGUgZ2VuZXJhdGVkIHByb3h5CisJY2xhc3NlcyB0aGF0IGRpc2Nvbm5lY3RzIHRoZSBzaWduYWwgaGFuZGxlciBkZWxlZ2F0ZSBmcm9tIHRoZQorCXNlcnZpY2Ugb2JqZWN0LiAgRml4ZXMgYSBiaWcgbGVhayBvZiBwcm94eSBvYmplY3RzIG9uIHRoZQorCWNsaWVudCBzaWRlIG9mIHRoaW5ncy4gIFBhdGNoIGZyb20gQmVuIE1hdXJlcgorCTxibWF1cmVyQHhpbWlhbi5jb20+CisKKzIwMDUtMDMtMTIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAod3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogTmV3IGZ1bmN0aW9uLAorCXBhcnNlcyBhIHR5cGUgc2lnbmF0dXJlIGludG8gYXJndW1lbnRzIGFuZCBvdXRwdXRzIHRvCisJWE1MLgorCShidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogVXNlIGl0IGluc3RlYWQgb2YKKwloYXJkY29kaW5nIFhNTCBmb3IgY2VydGFpbiBzaWduYXR1cmVzLgorCQorCSogYnVzL01ha2VmaWxlLmFtIChkYnVzLWJ1cy1pbnRyb3NwZWN0LnhtbCk6IEFkZAorCWRlcGVuZGVuY3kgb24gZGJ1cy1kYWVtb24uCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAobWFpbik6IFBhcnNlIGlnbm9yZV91bnN1cHBvcnRlZAorCWFyZ3VtZW50LCBwYXNzIGl0IHRvIGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX2NsaWVudC4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMKKwkoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgorCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQpOiBBZGQKKwlHX0JFR0lOX0RFQ0xTL0dfRU5EX0RFQ0xTLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoY29tcHV0ZV9jbGllbnRfbWV0aG9kX25hbWUpOgorCUNoYW5nZSB0byBqdXN0IHRha2UgaWZhY2UgcHJlZml4IGRpcmVjdGx5LgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVycyk6IENsYXJpZnkgZXJyb3IgbWVzc2FnZS4KKwkoY2hlY2tfc3VwcG9ydGVkX3BhcmFtZXRlcnMpOiBOZXcgZnVuY3Rpb247IGNoZWNrcyB0byBzZWUgdHlwZQorCXNpZ25hdHVyZXMgb2YgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KKwkoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBIYW5kbGUgaWdub3JlX3Vuc3VwcG9ydGVkIGZsYWcuCisJKGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX2NsaWVudCk6IEhhbmRsZSBpZ25vcmVfdW5zdXBwb3J0ZWQKKwlwYXJhbWV0ZXIuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGRidXMtZ2xpYi1iaW5kaW5ncy5oKTogUGFzcworCS0taWdub3JlLXVuc3VwcG9ydGVkIGJ5IGRlZmF1bHQgdW50aWwgZ2xpYiBiaW5kaW5ncworCXN1cHBvcnQgYXJyYXlzLgorCisyMDA1LTAzLTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBHZW5lcmF0ZSBkYnVzLWdsaWItYmluZGluZ3MuaCBhbmQKKwlpbnN0YWxsIGl0LgorCisJKiBidXMvcHJpbnQtaW50cm9zcGVjdC5jOiBOZXcgZmlsZTsgcHJpbnRzIGludHJvc3BlY3Rpb24KKwlkYXRhIGZvciBhIGdpdmVuIG5hbWUgYW5kIG9iamVjdCBwYXRoLgorCisJKiBidXMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBOZXcgZmlsZSwgcmVmYWN0b3JlZAorCWZyb20gdGVzdC9nbGliL3J1bi10ZXN0LnNoLiAgQ3JlYXRlcyBhIHRlbXBvcmFyeSBzZXNzaW9uCisJYnVzIGFuZCBydW5zIGFub3RoZXIgcHJvZ3JhbS4KKworCSogdGVzdC9nbGliL3J1bi10ZXN0LnNoOiBSZWZhY3RvciB0byBpbnZva2UKKwlydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2guCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IEZpeCB0byBwcmludCBuZXcKKwlpbnRyb3NwZWN0aW9uIGZvcm1hdC4gIEFsc28gY2hhbmdlIHRvIHVzZSBEQlVTX1RZUEVfeF9BU19TVFJJTkcKKwltYWNyb3MgaW5zdGVhZCBvZiBoYXJkY29kaW5nLgorCisJKiBnbGliLy5jdnNpZ25vcmUsIGJ1cy8uY3ZzaWdub3JlLCB0ZXN0L2dsaWIvLmN2c2lnbm9yZTogVXBkYXRlLgorCisyMDA1LTAzLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSk6IFJlbW92ZQorCXRoaXMgdW5yZWY7IGl0IGRvZXNuJ3QgbWF0Y2ggdXAgZXZlbmx5IGluIHNvbWUgY29kZXBhdGhzLgorCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCk6IFVucmVmIGF0IGV2ZXJ5IGV4aXRwb2ludDsKKwl0aGlzIGV2ZW5seSBtYXRjaGVzIHdpdGggdGhlIHJlZiBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbi4KKworMjAwNS0wMy0wOSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayk6IElmIGNoZWNrcyBhcmUgZW5hYmxlZAorCWFuZCB3ZSB0cnkgdG8gdW5yZWdpc3RlciBhIHBhdGggdGhhdCdzIG5vdCByZWdpc3RlcmVkLCBzdGlsbCBnbworCXRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgdW5sb2NraW5nIGFuZCBkb24ndCBqdXN0IHJldHVybi4KKworMjAwNS0wMy0wOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfaW52b2tlKTogTmV3IG1ldGhvZDsgY2FsbHMKKwl0byB0aGlzIGFyZSBnZW5lcmF0ZWQgZm9yIGNsaWVudC1zaWRlIHdyYXBwZXJzLiAgSW52b2tlcyBhCisJRC1CVVMgbWV0aG9kIGFuZCByZXR1cm5zIHJlcGx5IHZhbHVlcy4gIAorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAod3JpdGVfYXJnc19zaWdfZm9yX2RpcmVjdGlvbik6IE5ldworCWZ1bmN0aW9uOyB3cml0ZXMgc2lnbmF0dXJlIHN0cmluZyBmb3IgYXJndW1lbnQgZGlyZWN0aW9uLgorCSh3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24pOiBDaGFuZ2UgdG8gcGFzcyBpbnB1dCB2YWx1ZXMgZGlyZWN0bHkKKwlpbnN0ZWFkIG9mIHZpYSBhZGRyZXNzLCBhbmQgZml4IGluZGVudGF0aW9uLgorCShnZW5lcmF0ZV9jbGllbnRfZ2x1ZSk6IENoYW5nZSB0byBpbnZva2UgZGJ1c19nX3Byb3h5X2ludm9rZS4gIEFsc28KKwltYWtlIGdlbmVyYXRlZCB3cmFwcGVycyBpbmxpbmVhYmxlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkpOiBBZGQKKwlub3RlIGFib3V0IHVzaW5nIGRidXNfdHlwZV9pc19maXhlZC4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdHlwZV9pc19maXhlZCk6IE1vdmVkIHRvCisJZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIGFzIGRidXNfdHlwZV9pc19maXhlZC4KKworCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYyAoZGJ1c190eXBlX2lzX2ZpeGVkKTogTW92ZWQgaGVyZQorCWZyb20gZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYzpfZGJ1c190eXBlX2lzX2ZpeGVkLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmg6IFByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lKTogRml4CisJZXJyb3IgcHJpbnRmIGNvZGUuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChtYWluKTogQmUgc3VyZSB0byBjbGVhciBlcnJvciBhcworCWFwcHJvcHJpYXRlIGluc3RlYWQgb2YganVzdCBmcmVlaW5nIGl0LgorCShtYWluKTogRnJlZSByZXR1cm5lZCBzdHJpbmdzIHVzaW5nIGdfZnJlZS4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtICh0ZXN0LXNlcnZpY2UtZ2xpYi1nbHVlLmgpCisJKHRlc3Qtc2VydmljZS1nbGliLWJpbmRpbmdzLmgpOiBBZGQgZGVwZW5kZW5jeSBvbiBkYnVzLWJpbmRpbmctdG9vbC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChNQVBfQkFTSUMpOiBSZWZhY3RvcmVkIGZyb20gTUFQX0JBU0lDX0lOSVQ7CisJc2ltcGx5IG1hcHMgYSBzaW1wbGUgRC1CVVMgdHlwZSB0byBHVHlwZS4KKwkoZGJ1c19kYnVzX3R5cGVfdG9fZ3R5cGUpOiBGdW5jdGlvbiB3aGljaCBtYXBzIEQtQlVTIHR5cGUgdG8KKwlHVHlwZS4KKwkoZGJ1c19ndmFsdWVfaW5pdCk6IEp1c3QgaW52b2tlIGRidXNfZGJ1c190eXBlX3RvX2d0eXBlIGFuZAorCWluaXRpYWxpemUgdGhlIHZhbHVlIHdpdGggaXQuCisJKGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUpOiBVbnVzZWQsIGRlbGV0ZS4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogU3dpdGNoIHRvIGhhcmRjb2RpbmcgZGVtYXJzaGFsbGluZyBmb3IKKwl2YXJpb3VzIHR5cGVzIGluc3RlYWQgb2YgdW5tYXJzaGFsbGluZyB0byB2YWx1ZSBkYXRhIGRpcmVjdGx5LgorCVJlbW92ZSBjYW5fY29udmVydCBib29sZWFuLgorCShkYnVzX2d2YWx1ZV9tYXJzaGFsKTogUmVtb3ZlIGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbjsgc3dpdGNoIHRvCisJcmV0dXJuaW5nIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgY2FuX2NvbnZlcnQgYm9vbGVhbi4KKwkoZGJ1c19ndmFsdWVfc3RvcmUpOiBOZXcgZnVuY3Rpb247IG5vdCByZWxhdGVkIHRvIEQtQlVTIHBlci1zZS4KKwlTdG9yZXMgYSBHVmFsdWUgaW4gYSBwb2ludGVyIHRvIGEgdmFsdWUgb2YgaXRzIGNvcnJlc3BvbmRpbmcgQworCXR5cGUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuaDogUmVtb3ZlIGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUsCisJYWRkIGRidXNfZ3ZhbHVlX3N0b3JlLgorCisyMDA1LTAzLTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCUZpeCBhIGJ1bmNoIG9mIGxpZmVjeWNsZSBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgcHJvYmxlbXMKKwlpbiB0aGUgbW9ubyBiaW5kaW5ncy4KKworCSogbW9uby9Bcmd1bWVudHMuY3MgKEFyZ3VtZW50cyk6IEltcGxlbWVudCBJRGlzcG9zYWJsZQorCisJKiBtb25vL0J1cy5jcyAoQnVzKTogRG9uJ3QgYWxsb3cgcHVibGljIGluc3RhbnRpYXRpb24uICBUaGlzIGlzCisJc3RyaWN0bHkgYSBzdGF0aWMgY2xhc3MuCisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogTW92ZSB0aGUgREJ1c09iamVjdFBhdGhWVGFibGUgYW5kIGFzc29jaWF0ZWQKKwlkZWxlZ2F0ZXMgaW50byB0aGlzIGZpbGUuCisJKENvbm5lY3Rpb24pOiBJbXBsZW1lbnQgSURpc3Bvc2FibGUuCisJKERpc3Bvc2UpOiBEaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGFuZCBzZXQgdGhlIHJhdyBjb25uZWN0aW9uCisJcG9pbnRlciB0byBJbnRQdHIuWmVyby4KKwkofkNvbm5lY3Rpb24pOiBDYWxsIERpc3Bvc2UoKS4KKwkoUmVnaXN0ZXJPYmplY3RQYXRoKTogQWRkZWQuICBNYW5hZ2VzIHRoZSByZWdpc3RyYXRpb24gb2Ygb2JqZWN0CisJcGF0aHMgc28gd2UgY2FuIGNsZWFubHkgZGlzY29ubmVjdCB0aGVtIGF0IGRpc3Bvc2UvZmluYWxpemUgdGltZS4KKwkoVW5yZWdpc3Rlck9iamVjdFBhdGgpOiBEaXR0by4KKwkoc2V0X1Jhd0Nvbm5lY3Rpb24pOiBVbnJlZ2lzdGVyIGFsbCBvZiB0aGUgb2JqZWN0IHBhdGhzIHdoZW4KKwljaGFuZ2luZyB0aGUgdW5kZXJseWluZyBEQnVzQ29ubmVjdGlvbi4gIEFkZCB0aGVtIGJhY2sgb250byB0aGUKKwluZXcgY29ubmVjdGlvbiwgaWYgYW55LgorCisJKiBtb25vL0hhbmRsZXIuY3M6IERvbid0IGltcGxlbWVudCBJRGlzcG9zYWJsZTsgaXQgZG9lc24ndCB1c2UgYW55CisJbW9yZSB1bm1hbmFnZWQgcmVzb3VyY2VzIGFueW1vcmUsIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeS4gIE1vdmUgYWxsCisJdGhlIERCdXNPYmplY3RQYXRoVlRhYmxlIHN0dWZmIG91dCBvZiBoZXJlLgorCShIYW5kbGVyKTogU2F2ZSByZWZlcmVuY2VzIHRvIG91ciBkZWxlZ2F0ZXMgc28gdGhhdCB0aGV5IGRvbid0IGdldAorCWZpbmFsaXplZC4gIENhbGwgQ29ubmVjdGlvbi5SZWdpc3Rlck9iamVjdFBhdGgoKSBpbnN0ZWFkIG9mCisJZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgZGlyZWN0bHkuCisJKE1lc3NhZ2VfQ2FsbGVkKTogRGlzcG9zZSB0aGUgbWVzc2FnZSBhZnRlciB3ZSdyZSBmaW5pc2hlZCB3aXRoCisJaXQuCisKKwkqIG1vbm8vTWVzc2FnZS5jcyAoTWVzc2FnZSk6IEltcGxlbWVudCBJRGlzcG9zYWJsZS4KKwkoRGlzcG9zZSk6IERpc3Bvc2UgdGhlIEFyZ3VtZW50cywgYW5kIHNldCB0aGUgUmF3TWVzc2FnZSB0bworCUludFB0ci5aZXJvLgorCShTZW5kV2l0aFJlcGx5QW5kQmxvY2spOiBXZSBvd24gdGhlIHJlZiB0byB0aGUgcmVwbHkgdGhhdCBjb21lcworCWJhY2sgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpIHNvIGFkZCBhCisJY29tbWVudCBhYm91dCB0aGF0IGFuZCB1bnJlZiBpdCBhZnRlciB3ZSd2ZSBjb25zdHJ1Y3RlZCBhIG1hbmFnZWQKKwlNZXRob2RSZXR1cm4gY2xhc3MgYXJvdW5kIGl0LiAgRml4ZXMgYSBiaWcsIGJpZyBsZWFrLgorCisJKiBtb25vL1Byb3h5QnVpbGRlci5jczogUmVmbGVjdCBpbnRvIE1lc3NhZ2UgdG8gZ2V0IHRoZSBEaXNwb3NlCisJbWV0aG9kLgorCShCdWlsZFNpZ25hbEhhbmRsZXIpOiBBZnRlciB3ZSd2ZSBzZW50IHRoZSBTaWduYWwgbWVzc2FnZSwgZGlzcG9zZQorCW9mIGl0LgorCShCdWlsZE1ldGhvZCk6IERpc3Bvc2Ugb2YgdGhlIG1ldGhvZCBjYWxsIGFuZCByZXBseSBtZXNzYWdlcyBhZnRlcgorCXdlJ3ZlIHNlbnQgdGhlIG1lc3NhZ2UgYW5kIGV4dHJhY3RlZCB0aGUgZGF0YSB3ZSB3YW50IGZyb20gdGhlCisJcmVwbHkuCisKKwkqIG1vbm8vU2VydmljZS5jcyAoVW5yZWdpc3Rlck9iamVjdCk6IERvbid0IGNhbGwgaGFuZGxlci5EaXNwb3NlKCkKKwlhbnltb3JlLgorCShTZXJ2aWNlX0ZpbHRlckNhbGxlZCk6IERpc3Bvc2Ugb2YgdGhlIG1lc3NhZ2UgYWZ0ZXIgd2UncmUKKwlmaW5pc2hlZCB3aXRoIGl0LgorCisyMDA1LTAzLTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworICAgICAgICAqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOgorICAgICAgICBBZnRlciB3ZSBhdHRhY2ggb3VyIHBlbmRpbmcgY2FsbCB0byB0aGUgY29ubmVjdGlvbiwgdW5yZWYKKyAgICAgICAgaXQuICBGaXhlcyBhIGxlYWsuCisgCisgICAgICAgICogbW9uby9Db25uZWN0aW9uLmNzIChzZXRfUmF3Q29ubmVjdGlvbik6IERpc2Nvbm5lY3Qgb3VyCisgICAgICAgIGZpbHRlciBhbmQgbWF0Y2ggY2FsbGJhY2tzIGZyb20gdGhlIG9sZCBjb25uZWN0aW9uIGFuZAorICAgICAgICByZWNvbm5lY3QgdGhlbSB0byB0aGUgbmV3IGNvbm5lY3Rpb24sIGlmIGFueS4KKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jczogIkNvZGUiIGlzIGEgc3RhdGljIG1lbWJlciwgc28KKwlkb24ndCB1c2UgInRoaXMiIHRvIHJlZmVyIHRvIGl0LiAgRml4IGZvciBzdHJpY3RlciBjaGVja2luZworCWluIE1vbm8gMS4xLjQuCisgCisgICAgICAgICogbW9uby9EQnVzVHlwZS9PYmplY3RQYXRoLmNzIChBcHBlbmQpOiBEb24ndCBsZWFrIHRoZQorCW9iamVjdCBwYXRoIHRoYXQgd2UgcGFzcyBpbnRvIHVubWFuYWdlZCBjb2RlLgorIAorICAgICAgICAqIG1vbm8vREJ1c1R5cGUvU3RyaW5nLmNzIChBcHBlbmQpOiBEb24ndCBsZWFrIHRoZSBzdHJpbmcKKwl0aGF0IHdlIHBhc3MgaW50byB1bm1hbmdlZCBjb2RlLgorCisyMDA1LTAzLTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogTkVXUzogVXBkYXRlIGZvciAwLjMxCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVsZWFzZSAwLjMxCisJYWRkIExUX0NVUlJFTlQsIExUX1JFVklTSU9OLCBMVF9BR0UgZm9yIGVhc3kgc29uYW1lIGJ1bXBpbmcKKworCSogcXQvTWFrZWZpbGUuYW06IGZpeGVkIGJ1aWxkCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IHNvbmFtZSBidW1wIGZvciBsaWJkYnVzCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IHNvbmFtZSBidW1wIGZvciBsaWJkYnVzLWdsaWIKKworMjAwNS0wMy0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6CisJKHBzZXVkb3JhbmRvbV9nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyKTogZml4IHRvIGhhdmUgbm8gcmV0dXJuCisJdmFsdWUKKwkoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlcik6IGZpeCByZXR1cm4gdmFsdWUKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jOiBzL0dFVFBXTkFNRS9HRVRQV05BTS8gc28gY29uZmlndXJlCisJY2hlY2tzIGFjdHVhbGx5IHdvcmssIGZyb20gVG9tIFBhcmtlciA8ZmRvQHRldnAubmV0PgorCisyMDA1LTAzLTAxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAobG9zZSwgbG9zZV9nZXJyb3IpOiBVdGlsaXR5CisJZnVuY3Rpb25zIGNvcGllZCBmcm9tIGRidXMtZ2xpYi10b29sLmMuCisJKG1haW4pOiBDb252ZXJ0IGxvdHMgb2YgZXJyb3IgY29kZSB0byB1c2UgdGhlbS4KKwlBbHNvIGFkZCBzb21lIHRlc3RpbmcgZm9yIGludHJvc3BlY3Rpb24gYml0cy4KKworMjAwNS0wMy0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRvYy9UT0RPOiBSZW1vdmUgaW50cm9zcGVjdGlvbiBzaWduYXR1cmUgVE9ETy4KKworMjAwNS0wMi0yNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAocHJvcGVydHlfaW5mb19nZXRfdHlwZSwgYXJnX2luZm9fZ2V0X3R5cGUpOgorCUNoYW5nZSByZXR1cm4gdmFsdWUgdG8gY29uc3QgY2hhciAqIGluc3RlYWQgb2YgaW50IHNvIHdlIGNhbiBkbworCWZ1bGwgc2lnbmF0dXJlcy4KKwkoc3RydWN0IFByb3BlcnR5SW5mbywgc3RydWN0IEFyZ0luZm8pOiBTdG9yZSBjaGFyICouCisJKHByb3BlcnR5X2luZm9fbmV3LCBhcmdfaW5mb19uZXcpOiBVcGRhdGUgcGFyYW1ldGVycywgc3RyZHVwLgorCShwcm9wZXJ0eV9pbmZvX3VucmVmLCBhcmdfaW5mb191bnJlZik6IEZyZWUuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IFVwZGF0ZSBwcm90b3R5cGVzLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChiYXNpY190eXBlX2Zyb21fc3RyaW5nKTogRGVsZXRlLgorCSh2YWxpZGF0ZV9zaWduYXR1cmUpOiBOZXcgZnVuY3Rpb24sIGp1c3QgdmFsaWRhdGVzIHNpZ25hdHVyZSBhbmQKKwlzZXRzIEdFcnJvci4KKwkocGFyc2VfcHJvcGVydHksIHBhcnNlX2FyZyk6IEludm9rZSB2YWxpZGF0ZV9zaWduYXR1cmUuICBTdG9yZQorCXNpZ25hdHVyZSBpbnN0ZWFkIG9mIGp1c3QgdHlwZSBjb2RlLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGJhc2VfdHlwZV9mcm9tX3NpZ25hdHVyZSk6IE5ldyB1dGlsaXR5CisJZnVuY3Rpb24gdG8gcmV0dXJuIGEgcHJpbWFyeSB0eXBlIGZvciBhIHNpZ25hdHVyZSwgZHJvcHBpbmcKKwlpbmZvcm1hdGlvbiBhYm91dCB0eXBlcyBpbiBjb250YWluZXIgdHlwZXMuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2JpbmRpbmdfdHlwZV9mcm9tX3R5cGUpCisJKGRidXNfZ3ZhbHVlX2N0eXBlX2Zyb21fdHlwZSk6IFVwZGF0ZSB0byB0YWtlIGZ1bGwgc2lnbmF0dXJlCisJIGluc3RlYWQgb2YgdHlwZSBjb2RlLgorCShkYnVzX2d0eXBlX3RvX2RidXNfdHlwZSk6IE1vdmVkIGhlcmUgZnJvbSBnbGliL2RidXMtZ29iamVjdC5jLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmg6IFVwZGF0ZSBwcm90b3R5cGVzIGZvciBhYm92ZS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZ3R5cGVfdG9fZGJ1c190eXBlKTogTW92ZWQgdG8KKwlnbGliL2RidXMtZ3ZhbHVlLmMgYXMgZGJ1c19ndHlwZV90b19kYnVzX3R5cGUuCisJKGludHJvc3BlY3RfcHJvcGVydGllcywgaW50cm9zcGVjdF9zaWduYWxzLCB3cml0ZV9pbnRlcmZhY2UpOgorCVVwZGF0ZSB0byBoYW5kbGUgc2lnbmF0dXJlcywgYW5kIHJlbW92ZSB1c2FnZSBvZgorCV9kYnVzX2d1dGlsc190eXBlX3RvX3N0cmluZy4KKwkoaGFuZGxlX2ludHJvc3BlY3QpOiBQcmludCBvdXQgdHlwZSBjb2RlcyBpbnN0ZWFkIG9mIGUuZy4gInN0cmluZyIKKwlpbiBoYXJkY29kZWQgaW50cm9zcGVjdGlvbiBYTUw7IGFsc28gdXNlIHhfQVNfU1RSSU5HIGNvbnN0YW50cworCWluc3RlYWQgb2YgaGFyZGNvZGluZyBpbiBzdHJpbmcuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAocHJldHR5X3ByaW50KTogSGFuZGxlIHNpZ25hdHVyZSBjaGFuZ2UKKwl0byBzdHJpbmcuICBSZW1vdmUgdXNhZ2Ugb2YgX2RidXNfZ3V0aWxzX3R5cGVfdG9fc3RyaW5nLgorCisJKiBnbGliL2RidXMtZ3V0aWxzLmMgKF9kYnVzX2d1dGlsc190eXBlX3RvX3N0cmluZyk6IERlbGV0ZS4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5oIChfZGJ1c19ndXRpbHNfdHlwZV90b19zdHJpbmcpOiBVcGRhdGUgZm9yCisJZGVsZXRpb24uCisJCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoY29tcHV0ZV9tYXJzaGFsbGVyKQorCShjb21wdXRlX21hcnNoYWxsZXJfbmFtZSwgZ2VuZXJhdGVfZ2x1ZSk6IEhhbmRsZSBzaWduYXR1cmUgY2hhbmdlCisJdG8gc3RyaW5nLgorCSh3cml0ZV9mb3JtYWxfcGFyYW1ldGVycywgd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogRGl0dG8sIGFuZAorCXJlbW92ZSBGSVhNRS4KKworCSogdG9vbHMvZGJ1cy10cmVlLXZpZXcuYyAodHlwZV90b19zdHJpbmcpOiBEZWxldGUuCisJKGluZm9fc2V0X2Z1bmNfdGV4dCk6IFVwZGF0ZSB0byBwcmludCBmdWxsIHNpZ25hdHVyZXMuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IENoYW5nZSB0eXBlcyB0byBuZXcKKwlpbnRyb3NwZWN0aW9uIGZvcm1hdC4KKworMjAwNS0wMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlICJndWlkIiBpdGVtCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAobm9fYnVzX3RocmVhZF9mdW5jKTogdXNlIG9wZW5fcHJpdmF0ZQorCSh3aXRoX2J1c190aHJlYWRfZnVuYyk6IHVzZSBvcGVuX3ByaXZhdGUKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSk6IG5ldworCWZ1bmN0aW9uIHRoYXQgd29ya3MgbGlrZSB0aGUgb2xkIGRidXNfY29ubmVjdGlvbl9vcGVuKCkKKwkoZGJ1c19jb25uZWN0aW9uX29wZW4pOiBub3cgcmV0dXJucyBhbiBleGlzdGluZyBjb25uZWN0aW9uIGlmCisJcG9zc2libGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKGhhbmRsZV9uZXdfY2xpZW50X2ZkX2FuZF91bmxvY2spOiBwYXNzCisJdGhyb3VnaCB0aGUgR1VJRCB0byB0aGUgdHJhbnNwb3J0CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX2luaXRfYmFzZSk6IGtlZXAgYXJvdW5kIHRoZQorCUdVSUQgaW4gaGV4LWVuY29kZWQgZm9ybS4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyk6CisJcGFzcyBHVUlEIGFyZ3VtZW50IGluIHRvIHRoZSB0cmFuc3BvcnQKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2ZkKTogYWRkCisJZ3VpZCBhcmd1bWVudAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9pbml0X2Jhc2UpOiBhZGQgZ3VpZCBhcmd1bWVudAorCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3NlcnZlcl9uZXcpOiBhZGQgZ3VpZCBhcmd1bWVudAorCisyMDA1LTAyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IHRoZSBHVUlEIHRoaW5nCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX2luaXRfYmFzZSk6IGluaXRpYWxpemUgYQorCWdsb2JhbGx5IHVuaXF1ZSBJRCBmb3IgdGhlIHNlcnZlciwgYW5kIHB1dCBhICJndWlkPWhleGVuY29kZWQiCisJZmllbGQgaW4gdGhlIGFkZHJlc3MKKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBmaXggbWlzc2luZyAjaW5jbHVkZSBvZiBkYnVzLXRocmVhZHMtaW50ZXJuYWwuaAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBkaXR0bworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzogZGl0dG8KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogZGl0dG8KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiB3YWl0LCBqdXN0IGluY2x1ZGUKKwlkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCBoZXJlCisJCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcik6IG1vdmUgYmFjayBmb3IKKwl1c2UgaW4gbWFpbiBsaWJyYXJ5CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlc19idWZmZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwNS0wMi0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3Qtc2VydmljZS1nbGliLnhtbAorCisyMDA1LTAyLTI0ICBKb2huIChKNSkgUGFsbWllaXIgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBhZGRlZCBkYnVzLWdvYmplY3QuaCB0byBzb3VyY2VzIGxpc3QKKwlzbyBkaXN0Y2hlY2sgZG9lc24ndCBmYWlsCisJCisyMDA1LTAyLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jLCBkYnVzL2RidXMtc2VydmVyLXVuaXguYzogY2hhbmdlIHNlbWFudGljcyBzbworCXlvdSBtdXN0IGRpc2Nvbm5lY3QgYmVmb3JlIHVucmVmLCBzaW5jZSBsb2NraW5nIGFuZCBvdGhlciB0aGluZ3MKKwlhcmUgc2NyZXdlZCB1cCBvdGhlcndpc2UuIEZpeCBhc3NvcnRlZCBvdGhlciBsb2NraW5nIHN0dWZmLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmMgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSk6CisJZml4IGNvbXBpbGF0aW9uCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg6IG1vdmUgdGhlIG11dGV4L2NvbmR2YXIgd3JhcHBlcnMKKwlpbnRvIGEgcHJpdmF0ZSBoZWFkZXIgYW5kIGRvbid0IGV4cG9ydCBmcm9tIHRoZSBsaWJyYXJ5CisKKwkqIHRocm91Z2hvdXQgLSBjYWxsIF9kYnVzX3RocmVhZF9zdHVmZiB2cy4gZGJ1c190aHJlYWRfc3R1ZmYKKworMjAwNS0wMi0yNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYzogTmV3IGZpbGU7IGltcGxlbWVudHMgdmFyaW91cyBmdW5jdGlvbnMKKwlyZWxhdGVkIHRvIHR5cGUgc2lnbmF0dXJlcy4gIEluY2x1ZGVzIGFuIGludGVyYXRvciBmb3IgcGFyc2luZywKKwl2YWxpZGF0aW9uIGZ1bmN0aW9ucy4KKwkoZGJ1c190eXBlX2lzX2Jhc2ljKTogTW92ZWQgaGVyZSBmcm9tCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmM6X2RidXNfdHlwZV9pc19iYXNpYy4KKwkoZGJ1c190eXBlX2lzX2NvbnRhaW5lcik6IE1vdmVkIGhlcmUgZnJvbQorCWRidXMtbWFyc2hhbC1iYXNpYy5jOl9kYnVzX3R5cGVfaXNfY29udGFpbmVyLgorCisJQWxsIGNhbGxlcnMgb2YgX2RidXNfdHlwZV9pc19jb250YWluZXIgYW5kIF9kYnVzX3R5cGVfaXNfYmFzaWMKKwl1cGRhdGVkLCBhbmQgaW5jbHVkZSBkYnVzLXNpZ25hdHVyZS5oLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmg6IE5ldyBmaWxlOyBwcm90b3R5cGVzIGZvciB0aGUgYWJvdmUuCisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKERCVVNfTElCX1NPVVJDRVMpOiBBZGQgZGJ1cy1zaWduYXR1cmUuYywKKwlkYnVzLXNpZ25hdHVyZS5oLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChtYXBfdHlwZV9jaGFyX3RvX3R5cGUpOiBOZXcgdXRpbGl0eQorCWZ1bmN0aW9uIGZhY3RvcmVkIG91dCBvZiBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZS4KKwkoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIpOiBOZXcgZnVuY3Rpb247IHJldHVybnMgZmlyc3QKKwl0eXBlIGNvZGUgZm9yIGEgdHlwZSBzaWduYXR1cmUgY2hhcmFjdGVyLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oOiBQcm90b3R5cGUgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIsCisJaGFuZGxlIGZ1bmN0aW9uIG1vdmVzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaDogRXhwb3J0IF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIChfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0KTogTmV3CisJZnVuY3Rpb247IHNraXBzIHRvIG5leHQgY29tcGxldGUgdHlwZSBpbiB0eXBlIHNpZ25hdHVyZS4KKwlJbXBsZW1lbnRlZCB1c2luZyBwcmV2aW91cyBza2lwX29uZV9jb21wbGV0ZV90eXBlLiAgTm93CisJc2tpcF9vbmVfY29tcGxldGVfdHlwZSBqdXN0IGRlbGVnYXRlcyB0bworCV9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3R5cGVfaXNfYmFzaWMpOiBNb3ZlZAorCXRvIGRidXMtc2lnbmF0dXJlLmMKKwkoX2RidXNfdHlwZV9pc19jb250YWluZXIpOiBEaXR0by4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFVwZGF0ZSBpbnRyb3NwZWN0aW9uIHNhbXBsZSB0bworCXVzZSByZWFsIHR5cGUgc2lnbmF0dXJlcy4KKworCSogZGJ1cy9kYnVzLXRlc3QuaDogUHJvdG90eXBlIHNpZ25hdHVyZSB0ZXN0LgorCisJKiBkYnVzL2RidXMtdGVzdC5jIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzKTogUnVuCisJc2lnbmF0dXJlIHRlc3RzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSk6IE5ldyBlcnJvci4KKworMjAwNS0wMi0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChQZW5kaW5nQ2FsbDo6Z2V0X3JlcGx5KToKKwlzL2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseS9kYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseQorCisyMDA1LTAyLTIxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtdGVzdC1tYWluLmMgKG1haW4pOiBUYWtlIG9wdGlvbmFsIHNwZWNpZmljIHRlc3QKKwlhcmd1bWVudC4KKworCSogZGJ1cy9kYnVzLXRlc3QuYyAocnVuX3Rlc3QpOiBOZXcgZnVuY3Rpb24sIHJ1bnMgYSB0ZXN0IGZ1bmN0aW9uCisJd2l0aCBubyBkYXRhIGRpcmVjdG9yeS4KKwkocnVuX2RhdGFfdGVzdCk6IExpa2UgYWJvdmUsIGJ1dCB0YWtlcyBkYXRhIGRpcmVjdG9yeS4KKwkoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IFRha2UKKwlzcGVjaWZpYyB0ZXN0IGFyZ3VtZW50LiAgUmVwbGFjZSBsb3RzIG9mIGN1dCBuJyBwYXN0ZSBjb2RlCisJd2l0aCBydW5fdGVzdCBhbmQgcnVuX2RhdGFfdGVzdC4KKworCSogZGJ1cy9kYnVzLXRlc3QuaDogVXBkYXRlIHByb3RvdHlwZSBmb3IKKwlkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzLgorCisyMDA1LTAyLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBGaXggYnVncyByZXBvcnRlZCBieSBEYW5pZWwgUC4gQmVycmFuZ2UKKwkKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3VucmVmX3VubG9ja2VkKTogbmV3IGZ1bmN0aW9uCisJKHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2gpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc2VydmVyX3RvZ2dsZV93YXRjaCwgX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCkKKwkoX2RidXNfc2VydmVyX2FkZF93YXRjaCk6IGNoYW5nZSB0byB3b3JrIGxpa2UgdGhlCisJZGJ1cy1jb25uZWN0aW9uLmMgZXF1aXZhbGVudHM7IGxpa2UgdGhvc2UsIHByb2JhYmx5IGtpbmQgb2YKKwlidXN0ZWQsIGJ1dCBzaG91bGQgYXQgbGVhc3QgbW9zdGx5IHdvcmsgZm9yIG5vdworCShkYnVzX3NlcnZlcl9kaXNjb25uZWN0KTogZHJvcCB0aGUgbG9jayBpZiB3ZSB3ZXJlIGFscmVhZHkKKwlkaXNjb25uZWN0ZWQsIHBhdGNoIGZyb20gRGFuaWVsIFAuIEJlcnJhbmdlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0KSAKKwkoX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0LCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQpOiBhbGwgdGhlCisJc2FtZSBzdHVmZgorCisJKiBkb2MvVE9ETzogdG9kbyBhYm91dCB1bnNjcmV3aW5nIHRoaXMgbWVzcworCisyMDA1LTAyLTE5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYworCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9zZXJ2ZXIpOiBGaXggaW9jaGFubmVsIHJlZmNvdW50aW5nLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmM6IEluY2x1ZGUgZGJ1cy1nbGliLXRvb2wuaCwgYXMgd2VsbAorCWFzIGVycm5vLmggYW5kIHN5cy9zdGF0LmguCisJKGxvc2UpOiBOZXcgZnVuY3Rpb24sIHByaW50cyBlcnJvciB3aXRoCisJbmV3bGluZSBhbmQgZXhpdHMuCisJKGxvc2VfZ2Vycm9yKTogU2ltaWxhciwgYnV0IHRha2VzIEdFcnJvciBmb3IgbWVzc2FnZS4KKwkobWFpbik6IEFkZCAtLW91dHB1dCBhcmd1bWVudCB0byBzcGVjaWZ5IG91dHB1dCBmaWxlIHRvIHdyaXRlIHRvLAorCWluc3RlYWQgb2YgYWx3YXlzIHByaW50aW5nIHRvIHN0ZG91dC4gIEluIHRoaXMgbW9kZSwgZGV0ZXJtaW5lCisJdGltZXN0YW1wcyBvbiBzb3VyY2UgZmlsZXMgdG8gc2VlIHdoZXRoZXIgYW55IGFyZSBuZXdlciB0aGFuIHRoZQorCXRhcmdldCBmaWxlLiAgSWYgbm90LCBleGl0LiAgQWxzbyBjb252ZXJ0IGEgbnVtYmVyIG9mIGVycm9yCisJbWVzc2FnZXMgdG8gdXNlIGxvc2UgKHNpbmNlIGl0J3Mgc2hvcnRlciksIGFuZCBzd2l0Y2ggdG8gdXNpbmcKKwlnX2lvX2NoYW5uZWxfc2h1dGRvd24uCisKKzIwMDUtMDItMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jCisJKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogYWRkIGRvY3MKKworCSogZ2xpYi9kYnVzLWdsaWIuYzogZml4IGRveHlnZW4gd2FybmluZ3MKKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfYW5ub3RhdGlvbik6IGVycm9yIGlmIGFuIGFubm90YXRpb24KKwlpcyBmb3VuZCBvbiBhbiA8YXJnPgorCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5oOiBEb24ndCBleHBvcnQKKwlfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheS4KKwkKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKF9kYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5KTogRG8gcmVuYW1lLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IEhhbmRsZSBpdC4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOgorCUhhbmRsZSByZW5hbWUuCisJCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvLmN2c2lnbm9yZSwgZG9jLy5jdnNpZ25vcmUKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLy5jdnNpZ25vcmUsIHRlc3QvZ2xpYi8uY3ZzaWdub3JlOgorCVVwZGF0ZS4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1NFUlZJQ0VfT1JHX0ZSRUVERVNLVE9QX0RCVVMpOgorCVJlbmFtZSB0byBEQlVTX1NFUlZJQ0VfREJVUy4KKwkoREJVU19QQVRIX09SR19GUkVFREVTS1RPUF9EQlVTKTogUmVuYW1lIHRvIERCVVNfUEFUSF9EQlVTLgorCShEQlVTX1BBVEhfT1JHX0ZSRUVERVNLVE9QX0xPQ0FMKTogUmVuYW1lIHRvIERCVVNfUEFUSF9MT0NBTC4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5Mb2NhbCIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWwiLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfREJVUyk6IFJlbmFtZSB0byBEQlVTX0lOVEVSRkFDRV9EQlVTLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfSU5UUk9TUEVDVEFCTEUpOiBSZW5hbWUgdG8KKwlEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRS4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZSIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfUFJPUEVSVElFUyk6IFJlbmFtZSB0bworCURCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuUHJvcGVydGllcyIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIuCisJKERCVVNfSU5URVJGQUNFX09SR19GUkVFREVTS1RPUF9QRUVSKTogUmVuYW1lIHRvCisJREJVU19JTlRFUkZBQ0VfUEVFUi4KKwlDaGFuZ2UgdGhlIHZhbHVlIGZyb20gIm9yZy5mcmVlZGVza3RvcC5QZWVyIgorCXRvICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIi4KKwkoREJVU19JTlRFUkZBQ0VfT1JHX0ZSRUVERVNLVE9QX0xPQ0FMKTogCisJREJVU19JTlRFUkZBQ0VfTE9DQUwuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuTG9jYWwiCisJdG8gIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIi4KKworCUFsbCBvdGhlciB1c2VycyBvZiB0aG9zZSBjb25zdGFudHMgaGF2ZSBiZWVuIGNoYW5nZWQuCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IFVzZSBjb25zdGFudHMuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogVXNlIGNvbnN0YW50cy4KKworCSogZG9jL2RidXMtZmFxLnhtbCwgZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFVwZGF0ZSBmb3IgcmVuYW1lLgorCisyMDA1LTAyLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChzdHJ1Y3QgUGFyc2VyKTogQWRkIGluX2Fubm90YXRpb24gYm9vbGVhbi4KKwkocGFyc2Vfbm9kZSwgcGFyc2VfaW50ZXJmYWNlLCBwYXJzZV9tZXRob2QsIHBhcnNlX3NpZ25hbCkKKwkocGFyc2VfcHJvcGVydHksIHBhcnNlX2Fubm90YXRpb24pOiBMb3NlIGlmIHdlJ3JlIGN1cnJlbnRseSBpbiBhbgorCWFubm90YXRpb24uCisJKHBhcnNlX2Fubm90YXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKHBhcnNlcl9zdGFydF9lbGVtZW50LCBwYXJzZXJfZW5kX2VsZW1lbnQpOiBIYW5kbGUgYW5ub3RhdGlvbi4KKwkocGFyc2VfbWV0aG9kLCBwYXJzZV9pbnRlcmZhY2UpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY19uYW1lIGF0dHJpYnV0ZSwKKwlzd2l0Y2ggdG8gYW5ub3RhdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmggKGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWVzKQorCShtZXRob2RfaW5mb19nZXRfYmluZGluZ19uYW1lcykKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSwgbWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSkKKwkoaW50ZXJmYWNlX2luZm9fc2V0X2JpbmRpbmdfbmFtZSwgbWV0aG9kX2luZm9fc2V0X2JpbmRpbmdfbmFtZSk6CisJUmVtb3ZlLgorCShpbnRlcmZhY2VfaW5mb19nZXRfYW5ub3RhdGlvbnMsIG1ldGhvZF9pbmZvX2dldF9hbm5vdGF0aW9ucykKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2Fubm90YXRpb24sIG1ldGhvZF9pbmZvX2dldF9hbm5vdGF0aW9uKQorCShpbnRlcmZhY2VfaW5mb19hZGRfYW5ub3RhdGlvbiwgbWV0aG9kX2luZm9fYWRkX2Fubm90YXRpb24pOgorCVByb3RvdHlwZS4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAoc3RydWN0IEludGVyZmFjZUluZm8pOiBTdWJzdGl0dXRlICJhbm5vdGF0aW9ucyIKKwlmb3IgImJpbmRpbmdzIi4KKwkoc3RydWN0IE1ldGhvZEluZm8pOiBEaXR0by4KKwlTdHJhaWdodGZvd2FyZCBjb252ZXJzaW9uIG9mIGJpbmRpbmcgbWV0aG9kcyBpbnRvIGFubm90YXRpb24gbWV0aG9kcworCWFzIHByb3RvdHlwZWQuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAocHJldHR5X3ByaW50KTogUHJpbnQgYW5ub3RhdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oIChEQlVTX0dMSUJfQU5OT1RBVElPTl9DX1NZTUJPTCk6IERlZmluZS4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGdhdGhlcl9tYXJzaGFsbGVycywgZ2VuZXJhdGVfZ2x1ZSk6CisJVXNlIG5ldyBhbm5vdGF0aW9uIEFQSS4KKworCSogZG9jL2ludHJvc3BlY3QuZHRkOiBGaXggYSBudW1iZXIgb2YgRFREIHN5bnRheCBlcnJvcnMuICBBZGQKKwlhbm5vdGF0aW9uIGVsZW1lbnQuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogRGlzY3VzcyBpbnRyb3NwZWN0aW9uIGFubm90YXRpb25zLAorCWluY2x1ZGUgbGlzdCBvZiB3ZWxsLWtub3duIGFubm90YXRpb25zLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBNYWtlIHZhbGlkYXRlIGFnYWluc3QgbmV3IERURC4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVRoaXMgcGF0Y2ggaXMgYmFzZWQgb24gaW5pdGlhbCB3b3JrIGZyb20KKwlQYXVsIEt1bGluaWV3aWN6IDxrdWxpbmlld0BwdXJkdWUuZWR1Pi4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkYnVzX2d2YWx1ZV9pbml0KTogTmV3IGZ1bmN0aW9uOyBtb3ZlCisJaW5pdGlhbGl6YXRpb24gb2YgR1ZhbHVlIGZyb20gZGJ1cyB0eXBlIHRvIGhlcmUuCisJKGRidXNfZ3ZhbHVlX2dlbm1hcnNoYWxfbmFtZV9mcm9tX3R5cGUpOiBOZXcgZnVuY3Rpb247IGdlbmVyYXRlcyBhIHN0cmluZworCWZvciB0aGUgImdsaWItZ2VubWFyc2hhbCIgcHJvZ3JhbSBmcm9tIGEgREJ1cyB0eXBlLgorCShkYnVzX2d2YWx1ZV9iaW5kaW5nX3R5cGVfZnJvbV90eXBlKTogTmV3IGZ1bmN0aW9uOyB0dXJucyBhIERCdXMgdHlwZQorCWludG8gdGhlIEMgbmFtZSBmb3IgaXQgd2UgdXNlIGluIHRoZSBnbGliIGJpbmRpbmdzLgorCShkYnVzX2d2YWx1ZV9jdHlwZV9mcm9tX3R5cGUpOiBOZXcgZnVuY3Rpb247IG1hcHMgYSBEQnVzIHR5cGUgaW50byBhCisJZ2xpYiBDIHR5cGUgKG5vdCBHVmFsdWUpLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWwpOiBpbnZva2UgZGJ1c19ndmFsdWVfaW5pdC4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfd2luY2Fwc190b191c2NvcmUpOiBNb3ZlZCBoZXJlCisJZnJvbSBkYnVzLWdvYmplY3QuYy4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5oOiBQcm90b3R5cGUgaXQuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzogSW5jbHVkZSBuZXcgZGJ1cy1nb2JqZWN0LmguCisJKG1hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2dfbWFyc2hhbGxlcik6IFVzZSBuZXcgc2hhcmVkIGZ1bmN0aW9uCisJZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheS4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfaW50ZXJmYWNlLCBwYXJzZV9tZXRob2QpOiBIYW5kbGUgY19uYW1lIGF0dHJpYnV0ZS4KKwlXaWxsIGJlIGNoYW5nZWQgb25jZSB3ZSBoYXZlIGFubm90YXRpb25zLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBDaGFuZ2UgaW5mb19oYXNoX211dGV4IGZyb20gR1N0YXRpY011dGV4IHRvCisJR1N0YXRpY1JXTG9jay4gIENhbGxlcnMgdXBkYXRlZC4KKwkod2luY2Fwc190b191c2NvcmUpOiBNb3ZlIHRvIGRidXMtZ3V0aWxzLmMuICBDYWxsZXJzIHVwZGF0ZWQuCisJKHN0cmluZ190YWJsZV9uZXh0KTogTmV3IGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciB6ZXJvLXRlcm1pbmF0ZWQKKwlzdHJpbmcgdmFsdWUgYXJyYXkuCisJKHN0cmluZ190YWJsZV9sb29rdXApOiBOZXcgZnVuY3Rpb247IHJldHJpZXZlcyBzcGVjaWZpYyBlbnRyeSBpbgorCWFycmF5LgorCShnZXRfbWV0aG9kX2RhdGEpOiBOZXcgZnVuY3Rpb247IGxvb2sgdXAgbWV0aG9kIGRhdGEgaW4gb2JqZWN0IGRhdGEgY2h1bmsuCisJKG9iamVjdF9lcnJvcl9kb21haW5fcHJlZml4X2Zyb21fb2JqZWN0X2luZm8pCisJKG9iamVjdF9lcnJvcl9jb2RlX2Zyb21fb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb25zLCBidXQgbm90IGltcGxlbWVudGVkIHlldC4KKwkobWV0aG9kX2ludGVyZmFjZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9uOyByZXRyaWV2ZSBpbnRlcmZhY2UgbmFtZS4KKwkobWV0aG9kX25hbWVfZnJvbV9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbjsgcmV0cmlldmUgbWV0aG9kIG5hbWUuCisJKG1ldGhvZF9hcmdfaW5mb19mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9uOyByZXRyaWV2ZSBhcmd1bWVudCBkYXRhLgorCShhcmdfaXRlcmF0ZSk6IE5ldyBmdW5jdGlvbjsgaXRlcmF0ZXMgb3ZlciBzZXJpYWxpemVkIGFyZ3VtZW50IGRhdGEuCisJKG1ldGhvZF9kaXJfc2lnbmF0dXJlX2Zyb21fb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb247IHJldHVybnMgYQorCUdTdHJpbmcgaG9sZGluZyB0eXBlIHNpZ25hdHVyZSBmb3IgYXJndW1lbnRzIGZvciBqdXN0IG9uZQorCWRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KS4KKwkobWV0aG9kX2lucHV0X3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKQorCShtZXRob2Rfb3V0cHV0X3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IE5ldyBzaGFyZWQgZnVuY3Rpb247CisJY29udmVydHMgZGJ1cyBtZXNzYWdlIGFyZ3VtZW50cyBpbnRvIGEgR1ZhbHVlIGFycmF5LiAgVXNlZCBmb3IgYm90aAorCXNpZ25hbCBoYW5kbGluZyBhbmQgbWV0aG9kIGludm9jYXRpb24uCisJKHN0cnVjdCBEQnVzR2xpYldyaXRlSXRlcmZhY2VEYXRhKTogTmV3IHV0aWxpdHkgc3RydWN0dXJlLgorCSh3cml0ZV9pbnRlcmZhY2UpOiBOZXcgZnVuY3Rpb247IGdlbmVyYXRlIGludHJvc3BlY3Rpb24gWE1MIGZvcgorCWFuIGludGVyZmFjZS4KKwkoaW50cm9zcGVjdF9pbnRlcmZhY2VzKTogTmV3IGZ1bmN0aW9uOyBnYXRoZXJzIGFsbCBpbnRlcmZhY2UtPm1ldGhvZHMsCisJZ2VuZXJhdGVzIGludHJvc3BlY3Rpb24gWE1MIGZvciB0aGVtLgorCShoYW5kbGVfaW50cm9zcGVjdCk6IEludm9rZSBpbnRyb3NwZWN0X2ludGVyZmFjZXMuCisJKGdldF9vYmplY3RfcHJvcGVydHkpOiBCZSBzdXJlIHRvIHplcm8taW5pdGFsaXplIHN0YWNrLWFsbG9jYXRlZCBHVmFsdWUuCisJKGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZCk6IE5ldyBmdW5jdGlvbjsgZXhhbWluZXMgYW4gaW5jb21pbmcgbWVzc2FnZQorCWFuZCBhdHRlbXB0cyB0byBtYXRjaCBpdCB1cCAodmlhIGludGVyZmFjZSwgbWV0aG9kIG5hbWUsIGFuZCBhcmd1bWVudAorCXNpZ25hdHVyZSkgd2l0aCBhIGtub3duIG9iamVjdCBhbmQgbWV0aG9kLgorCShnZXJyb3JfZG9tYWluY29kZV90b19kYnVzX2Vycm9yX25hbWUpOiBOZXcgZnVuY3Rpb247IGNvbnZlcnRzIGEKKwlHRXJyb3IgZG9tYWluIGFuZCBjb2RlIGludG8gYSBEQnVzIGVycm9yIG5hbWUuICBOZWVkcyBHRXJyb3IgZGF0YQorCWFkZGVkIHRvIG9iamVjdCBpbnRyb3NwZWN0aW9uIHRvIHdvcmsgd2VsbC4KKwkoZ2Vycm9yX3RvX2RidXNfZXJyb3JfbWVzc2FnZSk6IENyZWF0ZXMgYSBEQnVzTWVzc2FnZSBlcnJvciByZXR1cm4gZnJvbQorCUdFcnJvci4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBOZXcgZnVuY3Rpb24gdG8gaW52b2tlIGFuIG9iamVjdCBtZXRob2QKKwlsb29rZWQgdXAgdmlhIGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZC4gIFBhcnNlcyB0aGUgaW5jb21pbmcKKwltZXNzYWdlLCB0dXJucyBpdCBpbnRvIGEgR1ZhbHVlIGFycmF5LCB0aGVuIGludm9rZXMgdGhlIG1hcnNoYWxsZXIKKwlzcGVjaWZpZWQgaW4gdGhlIERCdXNHTWV0aG9kSW5mby4gIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB3aXRoCisJZWl0aGVyIHJldHVybiB2YWx1ZXMgb3IgZXJyb3IgbWVzc2FnZSBhcyBhcHByb3ByaWF0ZS4KKwkoZ29iamVjdF9tZXNzYWdlX2Z1bmN0aW9uKTogSW52b2tlIGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZCBhbmQKKwlpbnZva2Vfb2JqZWN0X21ldGhvZC4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiBJbmNsdWRlIGRidXMtYmluZGluZy10b29sLWdsaWIuaC4KKwkoZW51bSBEQnVzQmluZGluZ091dHB1dE1vZGUpOiBOZXcgZW51bSBmb3IgYmluZGluZyBvdXRwdXQgbW9kZXMuCisJKHByZXR0eV9wcmludCk6IFByaW50IGJpbmRpbmcgbmFtZXMuCisJKGRidXNfYmluZGluZ190b29sX2Vycm9yX3F1YXJrKTogR0Vycm9yIGJpdHMuCisJKHZlcnNpb24pOiBGaXggdHlwby4KKwkobWFpbik6IENyZWF0ZSBHSU9DaGFubmVsIGZvciBvdXRwdXQuICBQYXJzZSBuZXcgLS1tb2RlIGFyZ3VtZW50LAorCXBvc3NpYmxlIHZhbHVlcyBhcmUgInByZXR0eS1wcmludCIsICJnbGliLXNlcnZlciIsICJnbGliLWNsaWVudCIuCisJVXNlIG1vZGUgdG8gaW52b2tlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLgorCQorCSogZ2xpYi9kYnVzLWdvYmplY3QuaDogUHJvdG90eXBlIGRidXNfZ2xpYl9tYXJzaGFsX2RidXNfbWVzc2FnZV90b19ndmFsdWVfYXJyYXkuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuaDogTmV3IGhlYWRlciwganVzdCBpbmNsdWRlcyBHRXJyb3IgYml0cworCWZvciBub3cuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHN0cnVjdCBJbnRlcmZhY2VJbmZvKTogQWRkIGJpbmRpbmdzIGhhc2h0YWJsZTsKKwltYXBzIGJpbmRpbmcgc3R5bGUgdG8gbmFtZS4KKwkoc3RydWN0IE1ldGhvZEluZm8pOiBEaXR0by4KKwkoZ2V0X2hhc2hfa2V5cywgZ2V0X2hhc2hfa2V5KTogVXRpbGl0eSBmdW5jdGlvbiwgcmV0dXJucyBrZXlzIGZvcgorCWEgR0hhc2hUYWJsZS4KKwkoaW50ZXJmYWNlX2luZm9fbmV3LCBtZXRob2RfaW5mb19uZXcpOiBJbml0aWFsaXplIGJpbmRpbmdzLgorCShpbnRlcmZhY2VfaW5mb191bnJlZiwgbWV0aG9kX2luZm9fdW5yZWYpOiBEZXN0cm95IGJpbmRpbmdzLgorCShtZXRob2RfaW5mb19nZXRfYmluZGluZ19uYW1lcywgbWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZSkKKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2JpbmRpbmdfbmFtZXMsIGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWUpOgorCUZ1bmN0aW9ucyBmb3IgcmV0cmlldmluZyBiaW5kaW5nIG5hbWVzLgorCShtZXRob2RfaW5mb19zZXRfYmluZGluZ19uYW1lLCBpbnRlcmZhY2VfaW5mb19zZXRfYmluZGluZ19uYW1lKToKKwlGdW5jdGlvbnMgZm9yIHNldHRpbmcgYmluZGluZyBuYW1lcy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmg6IE5ldyBmaWxlLCBoYXMgcHJvdG90eXBlcworCWZvciBnbGliIGJpbmRpbmcgZ2VuZXJhdGlvbi4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IE5ldyBmaWxlLCBpbXBsZW1lbnRzIHNlcnZlci1zaWRlCisJYW5kIGNsaWVudC1zaWRlIGdsaWIgZ2x1ZSBnZW5lcmF0aW9uLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzX2JpbmRpbmdfdG9vbF9TT1VSQ0VTKTogQWRkCisJZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jLCBkYnVzLWJpbmRpbmctdG9vbC1nbGliLmgsCisJZGJ1cy1nbGliLXRvb2wuaC4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCAoc3RydWN0IERCdXNHTWV0aG9kTWFyc2hhbGxlcik6IFJlbW92ZSBpbiBmYXZvcgorCW9mIHVzaW5nIEdDbG9zdXJlTWFyc2hhbCBkaXJlY3RseS4KKwkoc3RydWN0IERCdXNHT2JqZWN0SW5mbyk6IEFkZCBuX2luZm9zIG1lbWJlci4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogTmV3IGZpbGU7IGNvbnRhaW5zIGludHJvc3BlY3Rpb24gZGF0YQorCWZvciBNeVRlc3RPYmplY3QgdXNlZCBpbiB0ZXN0LXNlcnZpY2UtZ2xpYi5jLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAoZW51bSBNeU9iamVjdEVycm9yKTogTmV3IEdFcnJvciBlbnVtLgorCShteV9vYmplY3RfZG9fbm90aGluZywgbXlfb2JqZWN0X2luY3JlbWVudCwgbXlfb2JqZWN0X3Rocm93X2Vycm9yKQorCShteV9vYmplY3RfdXBwZXJjYXNlLCBteV9vYmplY3RfbWFueV9hcmdzKTogTmV3IHRlc3QgbWV0aG9kcy4KKwkobWFpbik6IFVzZSBkYnVzX2dfb2JqZWN0X2NsYXNzX2luc3RhbGxfaW5mbyB0byBpbmNsdWRlIGdlbmVyYXRlZCBvYmplY3QKKwlpbmZvLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW06IEdlbmVyYXRlIHNlcnZlci1zaWRlIGdsdWUgZm9yIHRlc3Qtc2VydmljZS1nbGliLmMsCisJYXMgd2VsbCBhcyBjbGllbnQtc2lkZSBiaW5kaW5ncy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEluY2x1ZGUgdGVzdC1zZXJ2aWNlLWdsaWItYmluZGluZ3MuaC4KKwkobWFpbik6IEFjdGl2YXRlIFRlc3RTdWl0ZUdMaWJTZXJ2aWNlOyB0ZXN0IGludm9rZSBhIGJ1bmNoIG9mIGl0cyBtZXRob2RzCisJdXNpbmcgYm90aCB0aGUgZGJ1c19ncHJveHkgc3R1ZmYgZGlyZWN0bHkgYXMgd2VsbCBhcyB0aGUgZ2VuZXJhdGVkIGJpbmRpbmdzLgorCisyMDA1LTAyLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogYWx3YXlzCisJY29tcGxldGUgYSBwZW5kaW5nIGNhbGwsIGRvbid0IHJ1biBmaWx0ZXJzIGZpcnN0LgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9lbmRfY2FsbCk6IGNoYW5nZSB0byB1c2UKKwlkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseQorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrKToganVzdCBjYWxsCisJX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwKKwkoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5KTogY2hhbmdlIHRvIHN0ZWFsX3JlcGx5IGFuZCByZXR1cm4gYQorCXJlZgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogcG9ydCB0byB3b3JrIGluIHRlcm1zCisJb2YgREJ1c1BlbmRpbmdDYWxsCisJKF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsKTogcmVwbGFjZSBibG9ja19mb3JfcmVwbHkKKwl3aXRoIHRoaXMKKworMjAwNS0wMi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCk6CisJcHJvcGVybHkgaGFuZGxlIGxvb2tpbmcgdXAgZ3JvdXAgaW5mb3JtYXRpb24gYnkgbmFtZTsgZml4IAorCWZyb20gakBib290bGFiLm9yZworCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlKSAKKwkoZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKTogaG9sZCBkaXNwYXRjaCBsb2NrIHdoaWxlIG1lc3NhZ2UKKwlpcyBvdXRzdGFuZGluZworCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IGhvbGQgZGlzcGF0Y2ggbG9jayB3aGlsZSB3ZQorCWJsb2NrIGZvciB0aGUgcmVwbHksIHNvIG5vYm9keSBzdGVhbHMgb3VyIHJlcGx5CisJKGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSk6IGhvbGQgdGhlIGRpc3BhdGNoIGxvY2sgd2hpbGUgd2UKKwlwbHVjayB0aGUgbWVzc2FnZQorCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoKQorCShfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2gpCisJKF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoKQorCShfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCk6IG1ha2UgdGhlIG11dGV4IGFuZCBjb25kdmFyCisJY29udHJvbCBhY2Nlc3MgdG8gdGhlICJhY3F1aXJlZCIgZmxhZy4gRHJvcCB0aGUgY29ubmVjdGlvbiBsb2NrCisJd2hpbGUgd2FpdGluZyBvbiB0aGUgY29uZHZhci4gSG9wZWZ1bGx5IHRoZXNlIGFyZSBiYWJ5IHN0ZXBzIGluCisJcm91Z2hseSB0aGUgcmlnaHQgZGlyZWN0aW9uLgorCisyMDA1LTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogdXNlIHNlcGFyYXRlIG11dGV4ZXMgZm9yIHRoZSBjb25kaXRpb24KKwl2YXJpYWJsZXM7IHRoaXMgaXMgc29tZSBraW5kIG9mIGJhc2VsaW5lIGZvciBzYW5pdHksIGJ1dCB0aGUKKwljb25kaXRpb24gdmFyaWFibGVzIHN0aWxsIGFyZW4ndCB1c2VkIGNvcnJlY3RseSBhZmFpY3QKKworMjAwNS0wMi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2spOgorCWZpeCBhIGRvdWJsZS11bmxvY2sKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQpOiBhZGQgdGhpcworCisgICAgICAgIEluaXRpYWwgc2VtaS1jb3JyZWN0IHBhc3MgdGhyb3VnaCB0byBmaXggdGhyZWFkIGxvY2tpbmc7IHRoZXJlIGFyZQorCXN0aWxsIHNvbWUgaXNzdWVzIHdpdGggdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBwYXRocyBJJ20gcHJldHR5CisJc3VyZQorCQorCSogZGJ1cy9kYnVzLXNlcnZlci5jOiBhZGQgYSBtdXRleCBvbiBEQnVzU2VydmVyIGFuZCBhcHByb3ByaWF0ZQorCWxvY2svdW5sb2NrIGNhbGxzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkKToKKwlyZW5hbWUgdG8gYWRkIF91bmxvY2tlZAorCShzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24pOiBtb3ZlICJkaXNwYXRjaF9hY3F1aXJlZCIgYW5kCisJImlvX3BhdGhfYWNxdWlyZWQiIHRvIHVzZSBvbmx5IG9uZSBiaXQgZWFjaC4KKwkoQ09OTkVDVElPTl9MT0NLLCBDT05ORUNUSU9OX1VOTE9DSyk6IGFkZCBjaGVja3Mgd2l0aCAhREJVU19ESVNBQkxFX0NIRUNLUworCShkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyk6IGhhY2t5IGZpeCB0byByZWVudHJhbmN5CisJKF9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoLCBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaCkgCisJKF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoLCBfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0KSAKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dCkgCisJKF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3RpbWVvdXQpOiBkcm9wIGxvY2sgd2hlbiBjYWxsaW5nIG91dCB0bworCXVzZXIgZnVuY3Rpb25zOyBkb25lIGluIGEgaGFja3kvYmFkIHdheS4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2spOiBhZGQgYSBtaXNzaW5nIHVubG9jaworCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IGFkZCBhIG1pc3NpbmcgdW5sb2NrCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKToKKwlkcm9wIGxvY2sgaW4gYSBoYWNreSBwcm9iYWJseSB1bnNhZmUgd2F5IHRvIGNhbGwgb3V0IHRvIHVzZXIKKwlmdW5jdGlvbgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy10cmVlLXZpZXcuYyAoaW5mb19zZXRfZnVuY190ZXh0KTogZGlzcGxheSBtb3JlCisJZGV0YWlscyBvbiBhcmdzCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6IGxpc3QgdGhlIGJ1cworCWRyaXZlcgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9hcmcpOiBnZW5lcmF0ZSBhbiBhcmcgbmFtZSBpZiBub25lIGlzIHN1cHBsaWVkCisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHNpZ25hbF9pbmZvX2dldF9uX2FyZ3MpOiBuZXcgZnVuY3Rpb24KKwkobWV0aG9kX2luZm9fZ2V0X25fYXJncyk6IG5ldyBmdW5jdGlvbgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogYWRkIGludHJvc3BlY3Rpb24KKwlmb3IgYnVzIGRyaXZlcgorCisyMDA1LTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jOiBwdXQgdGhlIHNpZ25hdHVyZSBvZiBlYWNoIGJ1cyBkcml2ZXIgbWV0aG9kIGluIHRoZQorCXRhYmxlIG9mIGhhbmRsZXJzIGFuZCBjaGVjayBpdCBvbiBpbmNvbWluZyBjYWxsczsgdGhpcyBpc24ndAorCXJlYWxseSB1c2VmdWwsIGJ1dCBnb2luZyB0byBhZGQgaW50cm9zcGVjdCBzdXBwb3J0IGluIGEgbWludXRlLgorCisyMDA1LTAyLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzOiBUaGUgdW5wcmVkaWN0YWJpbGl0eSBvZiBmaW5hbGl6ZXJzIGluIG1vbm8KKwlwcmV2ZW50cyB1cyBmcm9tIGRldGVybWluaXN0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIGZpbHRlcnMgZnJvbQorCXRoZSBTZXJ2aWNlIGNsYXNzJ3MgZmluYWxpemVyLCBzbyBtb3ZlIHRyYWNraW5nIG9mIGZpbHRlcnMgYW5kCisJbWF0Y2hlcyBoZXJlLiAgQWRkIEFQSSBmb3IgdGhhdC4KKworCSogbW9uby9TZXJ2aWNlLmNzOiBSZW1vdmUgdGhlIGNvZGUsIGFkZCBjb2RlIHdoaWNoIGNhbGxzIHRoZQorCW1ldGhvZHMgbm93IG9uIHRoZSBDb25uZWN0aW9uIGNsYXNzLgorCisyMDA1LTAyLTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1cy5weSAoY2xhc3MgU2VuZGVyKTogYWRkZWQgdG8gc3VwcG9ydCBkYnVzIHNpZ25hbHMgYmV0dGVyCisJKEJ1czo6YWRkX3NpZ25hbF9yZWNlaXZlcik6IGFkZGVkIGV4cGFuZF9hcmdzIHBhcmFtZXRlciB3aGljaCBkZWZhdWx0cworCXRvIFRydWUuICBXaGVuIGV4cGFuZCBhcmdzIGlzIFRydWUgdGhlIHNpZ25hbCBoYW5kbGVyIHdpbGwgcGFzcyB0aGUgCisJbWVzc2FnZSBhcmd1bWVudHMgYXMgcGFyYW1ldGVycyB0byB0aGUgc2lnbmFsIGhhbmRsZXIuICBJZiBGYWxzZQorCXJldmVydCB0byBwcmV2aW91cyBiZWhhdmlvciB3aGVyZSB0aGUgc2lnbmFsIGhhbmRsZXIgbXVzdCBnZXQgdGhlCisJYXJndW1lbnQgbGlzdCBmcm9tIHRoZSBtZXNzYWdlLiAgVGhpcyBpcyB0byBoZWxwIHBvcnQgYXBwbGljYXRpb25zCisJbGlrZSBIQUwgdGhhdCBoYXZlIGEgdGVuZGFuY3kgdG8gc2VuZCB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnQgbGlzdHMuCisJc2VsZi5fbWF0Y2hfcnVsZV90b19yZWNlaXZlcnMgaXMgbm93IGEgZGljdCBvZiBkaWN0cy4KKwkoQnVzOjpyZW1vdmVfc2lnbmFsX3JlY2VpdmVyKTogcG9wIGhhbmRsZXIgb2ZmIHRoZSBkaWN0IGludGVhZCBvZiAKKwlyZW1vdmluZyBpdCBmcm9tIGEgbGlzdAorCShCdXM6Ol9zaWduYWxfZnVuYyk6IGNoYW5nZSBzaWduYWwgaGFuZGxlcnMgc28gdGhhdCBpbnRlcmZhY2UsCisJc2lnbmFsX25hbWUsIHNlcnZpY2UsIHBhdGggYW5kIG1lc3NhZ2UgYXJlIHBhY2tlZCBpbnRvIGEgU2VuZGVyCisJb2JqZWN0IGFuZCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlci4gIElmIGV4cGFuZF9hcmdzIGlzIFRydWUKKwlleHRyYWN0IHRoZSBhcmdzIGxpc3QgZnJvbSB0aGUgbWVzc2FnZSBhbmQgYXBwZW5kIGl0IHRvIHRoZSBwYXJhbWV0ZXIKKwlsaXN0CisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW4gKGNsYXNzIFNpZ25hdHVyZSk6IGFkZGVkIHRvIHN1cHBvcnQgCisJc2lnbmlhdHVyZSB0eXBlcworCShNZXNzYWdlSXRlcjo6X19pbml0X18pOiBjaGFuZ2VkIGl0ZXJhdGlvbiBsaW1pdCB0byBtYXRjaCBELUJVUworCShNZXNzYWdlSXRlcjo6Z2V0Kik6IGFkZGVkIElOVDE2LCBVSU5UMTYsIFNJR05BVFVSRSwgRElDVF9FTlRSWSwgCisJU1RSVUNUIGFuZCBWQVJJRU5UIHR5cGUgc3VwcG9ydAorCShNZXNzYWdlSXRlcjo6cHl0aG9uX3ZhbHVlX3RvX2RidXNfc2lnKTogbWFkZSByZWN1cnNpdmUgdG8gc3VwcG9ydAorCXJlY3Vyc2l2ZSB0eXBlcworCShNZXNzYWdlSXRlcjo6YXBwZW5kKik6IGFkZGVkIFNpZ25hdHVyZSwgZGljdCwgdHVwbGUgCisJc3VwcG9ydAorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6IGFkZGVkIGV4YW1wbGVzIG9mIGdldHRpbmcgdHVwbGVzCisJYW5kIGRpY3RzCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6IGFkZGVkIGV4YW1wbGVzIG9mIHNlbmRpbmcgdHVwbGVzCisJYW5kIGRpY3RzCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQucHk6IEZpeGVkIHRvIGhhbmRsZSBuZXcKKwlzaWduYWwgY2FsbGJhY2sgZm9ybWF0CisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAobWFpbik6IGZpeCBzbyB0aGlzIHRlc3QgZG9lc24ndCBmYWlsCisJKGNhbGwgZGJ1c19nX3Byb3h5X2FkZF9zaWduYWwpCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwllc2NhcGUgdGhlIGhvc3RuYW1lCisJKF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOiBlc2NhcGUgdGhlIHBhdGgKKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSk6IG5ldworCShkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUpOiBuZXcKKwkoZGJ1c19wYXJzZV9hZGRyZXNzKTogdW5lc2NhcGUgdmFsdWVzCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCk6IG5ldyBmdW5jdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZXhwbGFpbiBob3cgdG8gZXNjYXBlIHZhbHVlcyBpbgorCWFkZHJlc3NlcworCisyMDA1LTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogbW9kaWZ5IHRlc3QgdG8KKwlhdm9pZCB1c2luZyBhIG5vbi1iYXNpYyBkaWN0IGtleQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmM6IGFkZCB0ZXN0IGZvciB0aGUgYmVsb3cKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHJlcXVpcmUgdGhhdCBkaWN0IGtleXMgYXJlIGEgYmFzaWMKKwl0eXBlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKKwkoX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uKTogcmVxdWlyZSB0aGF0IGRpY3Qga2V5IGlzIGEKKwliYXNpYyB0eXBlCisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoaGFuZGxlX2RlZmF1bHRfaW50cm9zcGVjdF9hbmRfdW5sb2NrKToKKwljaGFuZ2UgdG8gYmUgX2FuZF91bmxvY2sgaW5zdGVhZCBvZiBfdW5sb2NrZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkX25vX3VwZGF0ZSk6IHJlbmFtZSB0bworCWhhdmUgbm9fdXBkYXRlIHNvIHdlIGNhbiBmaW5kIHRoaXMgYnVnIHF1aWNrbHkgaW4gZnV0dXJlCisKKzIwMDUtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgKHZlcmlmeV90ZXN0X21lc3NhZ2UpOiB0ZXN0cyBmb3Igc3RyaW5nCisJYXJyYXkKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCk6IGFkZAorCXN1cHBvcnQgZm9yIGFycmF5cyBvZiBzdHJpbmcvc2lnbmF0dXJlL3BhdGgKKworMjAwNS0wMi0xMCAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmssCisJX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnQpOiBBZGQgdGhlIHBhdGggdG8KKwl0aGUgdmVyYm9zZSBvdXRwdXQuCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayk6IEFkZGVkLiAgQ2FsbHMKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkKCksIHVwZGF0ZWQgdGhlCisJZGlzcGF0Y2ggc3RhdHVzLCBhbmQgdW5sb2Nrcy4gIEZpeGVzIGEgYnVnIHdoZXJlIGNlcnRhaW4KKwlzaXR1YXRpb25zIChsaWtlIGEgYnJva2VuIHBpcGUpIGNvdWxkIGNhdXNlIGEgRGlzY29ubmVjdCBtZXNzYWdlCisJdG8gbm90IGJlIHNlbnQsIHRyaWNraW5nIHRoZSBidXMgaW50byB0aGlua2luZyBhIHNlcnZpY2Ugd2FzIHN0aWxsCisJdGhlcmUgd2hlbiB0aGUgcHJvY2VzcyBoYWQgcXVpdC4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCk6IENhbGwKKwlfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2soKS4KKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2spOiBBZGRlZC4gIENhbGxzCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF9hbmRfdW5sb2NrKCkuCisJKGRidXNfY29ubmVjdGlvbl9zZW5kKTogQ2FsbCBfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jaygpLgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KTogVXBkYXRlIHRoZSBkaXNwYXRjaCBzdGF0dXMgYW5kCisJdW5sb2NrLgorCisJKiBtb25vL1NlcnZpY2UuY3MgKH5TZXJ2aWNlKTogQWRkZWQuICBSZW1vdmVzIHRoZSBmaWx0ZXIgc28gdGhhdAorCXdlIGRvbid0IGdldCB1bm1hbmFnZWQgY29kZSBjYWxsaW5nIGJhY2sgaW50byBhIEdDZWQgZGVsZWdhdGUuCisJKFJlbW92ZUZpbHRlcik7IEFkZGVkLgorCisyMDA1LTAyLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcik6CisJLSBSZW1vdmVkIGNoZWNrIGZvciBpdGVyYXRvciB0eXBlIGJlaW5nIGFuIGFycmF5IGJlY2F1c2UKKwlnZXRfYXJnX3R5cGUgZG9lcyBub3Qgd29yayB3aXRoIHdyaXRlciBpdGVyYXRvcnMKKwktIFBhc3MgTlVMTCB0byBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlIGlmIHNpZ25pdHVyZSBpcyBOVUxMCisKKzIwMDUtMDItMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc29tZSBtb3JlIGxhbmd1YWdlIGNsZWFudXBzOyBhZGQKKwlzdHVmZiBhYm91dCBob3cgdG8gZGVhbCB3aXRoIGludmFsaWQgcHJvdG9jb2wgYW5kIGV4dGVuc2lvbgorCXBvaW50czsgYWRkIF8gdG8gYWxsb3dlZCBjaGFycyBpbiBhdXRoIGNvbW1hbmRzOyBhZGQgRVhURU5TSU9OXworCWF1dGggY29tbWFuZCBwcmVmaXgKKworMjAwNS0wMi0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHMvZXhwZWN0ZWQvcmVxdWlyZWQvIGluIGEgY291cGxlIHBsYWNlcyBmb3IgY2xhcml0eQorCisyMDA1LTAyLTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IEhhbmRsZSBOVUxMIGZvcgorCXNlbmRlciBvciBwcm9wb3NlZF9yZWNpcGllbnQuCisKKzIwMDUtMDItMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgKGdlbmVyYXRlX3NwZWNpYWwpOiBtb3JlIHRlc3RzCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogZGV0ZWN0CisJYXJyYXkgbGVuZ3RoIHRoYXQgZXhjZWVkcyB0aGUgbWF4aW11bQorCisyMDA1LTAyLTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogbW9yZSB0ZXN0IGNhc2VzLAorCWluY3JlYXNpbmcgY292ZXJhZ2UKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyAodmFsaWRhdGVfYm9keV9oZWxwZXIpOiByZXR1cm4gdGhlCisJcmVhc29uIHdoeSBhIHNpZ25hdHVyZSB3YXMgaW52YWxpZAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAobG9hZF9hbmRfdmFsaWRhdGVfZmllbGQpOiBmaXggdG8KKwlza2lwIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBiZWZvcmUgd2UgbG9vayBhdCBpdCBpbiB2YWxpZGF0aW9uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmctdXRpbC5jIChfZGJ1c19zdHJpbmdfdGVzdCk6IGFkZCB0ZXN0cyBmb3IKKwllcXVhbF9zdWJzdHJpbmcKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3KTogZGVmYXVsdAorCW1heF9tZXNzYWdlX2xlbmd0aCB0byBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgKKworMjAwNS0wMi0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogZml4IGNyYXNoCisJaWYgdGhlIHNpZ25hdHVyZSBvZiBhIHZhcmlhbnQgd2FzIGVtcHR5CisJKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik6IGNhdGNoICIoYSkiIChhcnJheSBpbnNpZGUKKwlzdHJ1Y3Qgd2l0aCBubyBlbGVtZW50IHR5cGUpCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYyAoZ2VuZXJhdGVfdWludDMyX2NoYW5nZWQpOiBhZGQgbW9yZQorCW1hbmdsZWQgbWVzc2FnZXMgdG8gYnJlYWsgdGhpbmdzCisKKzIwMDUtMDItMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9kaXNjb25uZWN0X3NpZ25hbCk6IHVzZQorCWdfcXVhcmtfdHJ5X3N0cmluZygpIHNvIGl0IGFjdHVhbGx5IGNhbiByZXR1cm4gMAorCShkYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWwpOiBkaXR0bworCisyMDA1LTAyLTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZW1pdF9yZW1vdGVfc2lnbmFsKTogZml4IGEKKwlib2d1cyB3YXJuaW5nCisJKHRyaXN0cmluZ19mcm9tX21lc3NhZ2UpOiBhc3NlcnQgY2xlYW5seSBvbiBudWxsIHBhdGgvaW50ZXJmYWNlCisJKHNob3VsZCBub3QgYmUgcG9zc2libGUgdGhvdWdoIEkgZGVjaWRlZCBsYXRlcikKKwkoZGJ1c19nX3Byb3h5X2Rpc3Bvc2UpOiBtb3ZlIHByb3h5IG1hbmFnZXIgdW5yZWdpc3RyYXRpb24gaGVyZQorCShEQlVTX0dfUFJPWFlfREVTVFJPWUVEKTogYWRkIHRoaXMgbWFjcm8sIGFuZCB1c2UgaXQgaW4gYSBidW5jaCBvZgorCWdfcmV0dXJuX2lmX2ZhaWwoKSBjaGVja3MKKworMjAwNS0wMi0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IGFkZCBEVERzIHRvIG1ha2VmaWxlCisKKwkqIGRvYy9pbnRyb3NwZWN0LmR0ZDogYWRkIGludHJvc3BlY3QuZHRkIGZyb20gRGF2aWQgQS4gV2hlZWxlcgorCSh3aXRoIHNvbWUgbWlub3IgY2hhbmdlcykKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCBkZXByZWNhdGVkIGF0dHJpYnV0ZSB0bworCWludHJvc3BlY3Rpb24gZm9ybWF0CisKKzIwMDUtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IHJld3JpdGUgaG93IHNpZ25hbHMgd29yayBhZ2FpbiwgdGhpcyB0aW1lIEkKKwl0aGluayBpdCdzIHNvcnQgb2YgcmlnaHQKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtdmlld2VyLmM6IGtpbmQgb2YgaGFsZi1hc3MgaG9vayB1cCB0aGUgb3B0aW9uIG1lbnUuCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmM6IGR5bmFtaWNhbGx5IHdhdGNoIE5hbWVPd25lckNoYW5nZWQKKworCSogYXV0b2dlbi5zaDogY2hhbmdlIHRvIGF1dG90b29scyAxLjkKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBjb21wbGV0ZWx5IGNoYW5nZSBob3cgc2lnbmFscyB3b3JrCisJKGRidXNfZ19wcm94eV9hZGRfc2lnbmFsKTogbmV3IGZ1bmN0aW9uIHRvIHNwZWNpZnkgc2lnbmF0dXJlIG9mIGEKKwlzaWduYWwKKwkoZGJ1c19nX3Byb3h5X2VtaXRfcmVjZWl2ZWQpOiBtYXJzaGFsIHRoZSBkYnVzIG1lc3NhZ2UgdG8gR1ZhbHVlcywKKwlhbmQgZ193YXJuaW5nIGlmIHRoZSBpbmNvbWluZyBtZXNzYWdlIGhhcyB0aGUgd3Jvbmcgc2lnbmF0dXJlLgorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jIChoYXZlX25hbWVzX25vdGlmeSk6IGZpeCB0aGlzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBjbGVhbgorCXVwIHRoZSBzdHJpbmcgYXJyYXkgaGFuZGxpbmcgYSBiaXQgCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ2xpYi5jIChkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkpOiBuZXcgZnVuY3Rpb24KKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9jYW5jZWwpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWdsaWIuaDogbW92ZSBHVHlwZSBkZWNscyBmb3IgY29ubmVjdGlvbi9tZXNzYWdlIGhlcmU7CisJKiBkYnVzL2RidXMtZ2xpYi5jOiBtb3ZlIGFsbCB0aGUgZ190eXBlIGFuZCByZWYvdW5yZWYgc3R1ZmYgaW4KKwloZXJlLCBqdXN0IGtpbmQgb2YgcmF0aW9uYWxpemluZyBob3cgd2UgaGFuZGxlIGFsbCB0aGF0CisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYzogbmV3IGZpbGUgZm9yIGEgdHJlZSBtb2RlbCBsaXN0aW5nIHRoZQorCXNlcnZpY2VzIG9uIGEgYnVzCisKKwkqIHRvb2xzL2RidXMtdHJlZS12aWV3LmMgKG1vZGVsX25ldyk6IHVzZSBwcm9wZXIgdHlwaW5nIG9uIHRoZQorCW1vZGVsIHJvd3MKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGQgYSBjdXN0b20gR1NvdXJjZSBiYWNrIHRoYXQganVzdCBjaGVja3MKKwl3aGV0aGVyIHRoZSBtZXNzYWdlIHF1ZXVlIGhhcyBhbnl0aGluZyBpbiBpdDsgb3RoZXJ3aXNlLCB0aGVyZSBhcmUgCisJY2FzZXMgd2hlcmUgd2Ugd29uJ3Qgc2VlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSBzaW5jZSB0aGVyZSB3YXMgbm8gCisJSU8gdmlzaWJsZSB0byB0aGUgZ2xpYiBtYWluIGxvb3AKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCAoX0RCVVNfREVGQVVMVF9USU1FT1VUX1ZBTFVFKToKKwlpbmNyZWFzZSBkZWZhdWx0IG1lc3NhZ2UgdGltZW91dCB0byAyNSBzZWNvbmRzCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKG5vX2J1c19zdG9wX3NlcnZlcik6IHJlbW92ZSB0aGUKKwl3YXJuaW5nIGFib3V0IHRoZSBnX3dhcm5pbmcgdGhhdCBJIGp1c3QgZml4ZWQKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IHJld3JpdGUgdGhlIG1haW4gbG9vcCBzdHVmZiB0byBhdm9pZCB0aGUKKwljdXN0b20gc291cmNlLCBzZWVtcyB0byBiZSBhIGxvdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgd29yaworCWJldHRlci4KKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgSSB0aGluayB0aGlzIG1haW4gbG9vcCB0aGluZyBpcyBjb25jZXB0dWFsbHkgYnJva2VuLCBidXQgaGVyZSBhcmUgCisJc29tZSBiYW5kIGFpZHMuIEknbGwgbWF5YmUgcmV3cml0ZSBpdCBpbiBhIG1pbnV0ZS4KKwkKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChhZGRfdGltZW91dCk6IHRpbWVvdXQgc3R1ZmYgZG9lc24ndCB1c2UgdGhlCisJY3VzdG9tIEdTb3VyY2UsIHNvIGRvbid0IHBhc3MgaXQgaW47IGNvbmZ1c2luZworCShnc291cmNlX3NlcnZlcl9maW5hbGl6ZSwgZ3NvdXJjZV9jb25uZWN0aW9uX2ZpbmFsaXplKTogYWRkCisJZmluYWxpemUgaGFuZGxlcnMgdGhhdCByZW1vdmUgYWxsIHRoZSB3YXRjaGVzLgkKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGludHJvc3BlY3RfcHJvcGVydGllcyk6IGZpeCB0aGUgWE1MCisJZ2VuZXJhdGVkCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV91bnJlZik6IGFkZCBhbiBpbl9jYWNoZSBmbGFnCisJd2hpY2ggZWZmZWN0aXZlbHkgZGV0ZWN0cyB0aGUgdXNlIG9mIGZyZWVkIG1lc3NhZ2VzCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogbW9kaWZ5IGFuZCByZXR1cm4gdGhlCisJcmVwbHkgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X3VubG9ja2VkKToKKwlnZWUsIG1heWJlIGl0IHNob3VsZCBTRU5EIFRIRSBYTUwgaW5zdGVhZCBvZiBqdXN0IG1ha2luZyBhIHN0cmluZworCWFuZCBmcmVlaW5nIGl0IGFnYWluIDstKQorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6IGltcHJvdmUgcHJpbnRpbmcgb2YKKwltZXNzYWdlcworCisJKiBjb25maWd1cmUuaW46IGFkZCBkZWJ1Zy1nbGliLnNlcnZpY2UgdG8gdGhlIG91dHB1dAorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBkYnVzLXZpZXdlciBpbnRyb3NwZWN0ZWQgYW5kIGRpc3BsYXllZCB0aGUgYnVzIGRyaXZlcgorCQorCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgCisJKG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uKTogYWRkIHRlc3RzIGZvciBhIGhhbmRsZXIgcmVnaXN0ZXJlZCBvbiAiLyIKKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMKKwkoX2RidXNfZGVjb21wb3NlX3BhdGgpOiBmaXggdG8gaGFuZGxlIHBhdGggIi8iIHByb3Blcmx5CisJKHJ1bl9kZWNvbXBvc2VfdGVzdHMpOiBhZGQgdGVzdHMgZm9yIHBhdGggZGVjb21wb3NpdGlvbgorCQorCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfc3BsaXRfcGF0aCk6IGZpeCB0byBoYW5kbGUgIi8iCisJcHJvcGVybHkKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaGFuZGxlX2ludHJvc3BlY3QpOiBmaXggcXVvdGVzCisKKwkqIHRlc3QvZ2xpYi9ydW4tdGVzdC5zaDogc3VwcG9ydCBsYXVuY2hpbmcgdGhlIGJ1cywgdGhlbiBydW5uaW5nCisJZGJ1cy12aWV3ZXIKKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG1haW4pOiBwdXQgaW4gYSB0cml2aWFsIGdvYmplY3QKKwlzdWJjbGFzcyBhbmQgcmVnaXN0ZXIgaXQgb24gdGhlIGNvbm5lY3Rpb24KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogaW1wbGVtZW50CisJaW50cm9zcGVjdGlvbiBvZiB0aGUgYnVzIGRyaXZlciBzZXJ2aWNlCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgI2RlZmluZXMgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLAorCWlkZW50aWZpZXJzLCBkb2N0eXBlIGRlY2wKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lcik6IGhhbmRsZQorCWF0dGVtcHRzIHRvIGdldCBvd25lciBvZiBEQlVTX1NFUlZJQ0VfT1JHX0ZSRUVERVNLVE9QX0RCVVMgYnkgCisJcmV0dXJuaW5nIHRoZSBzZXJ2aWNlIHVuY2hhbmdlZC4KKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6IHJlbW92ZSBvbGQgY2hlY2sgZm9yIHJlcGx5X3NlcmlhbCBpbgorCW1ldGhvZCBjYWxscywgbm93IHRoZSBtZXNzYWdlIHR5cGUgZGVhbHMgd2l0aCB0aGF0CisJKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOiBoYW5kbGUgTlVMTCBpbnRlcmZhY2UKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZ2V0X2J1c19uYW1lKTogbmV3IGZ1bmN0aW9uCisKKwkqIGdsaWIvZGJ1cy1nbG9hZGVyLWV4cGF0LmMgKGRlc2NyaXB0aW9uX2xvYWRfZnJvbV9zdHJpbmcpOiBhbGxvdworCS0xIGZvciBsZW4KKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYzogYWRkIHN1cHBvcnQgZm9yIGludHJvc3BlY3RpbmcgYSBzZXJ2aWNlIG9uCisJYSBidXMKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcGVuZGluZ19jYWxsX3JlZik6IGFkZAorCShkYnVzX2dfcGVuZGluZ19jYWxsX3VucmVmKTogYWRkCisKKzIwMDUtMDEtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXRyZWUtdmlldy5jOiBhZGQgc3VwcG9ydCBmb3IgZGlzcGxheWluZyBwcm9wZXJ0aWVzLgorCShydW4gZGJ1cy12aWV3ZXIgd2l0aCBhbiBpbnRyb3NwZWN0IHhtbCBmaWxlIGFzIGFyZywgdGhlbiByZXNpemUKKwl0aGUgd2luZG93IHNvIHRoZSB0cmVlIGVsZW1lbnRzIHNob3cgdXAsIG5vdCBzdXJlIHdoYXQgdGhhdCBpcykKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaGFuZGxlX2ludHJvc3BlY3QpOiByZXR1cm4KKwlvcmcuZnJlZWRlc2t0b3AuUHJvcGVydGllcyBhbmQgb3JnLmZyZWVkZXNrdG9wLkludHJvc3BlY3RhYmxlCisJaW50ZXJmYWNlcyB3aGVuIHdlIGFyZSBpbnRyb3NwZWN0ZWQuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhbGxvdyBlbXB0eSBpbnRlcmZhY2UgbmFtZSB3aGVuIAorCUdldC9TZXQgYSBwcm9wZXJ0eQorCisyMDA1LTAxLTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogcmVuYW1lIGRidXMtZ2xpYi10b29sIHRvIGRidXMtYmluZGluZy10b29sOworCXRob3VnaCBpdCB1c2VzIGdsaWIsIGl0IGNvdWxkIGJlIGV4dGVuZGVkIGZvciBhbnkgYmluZGluZyBpbgorCXByaW5jaXBsZQorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChnb2JqZWN0X21lc3NhZ2VfZnVuY3Rpb24pOiBjaGFuZ2UgdG8gdGhlCisJbmV3IHdheSBwcm9wZXJ0aWVzIHdvcmsKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCB0aGUgbmV3IGludGVyZmFjZXMKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IHRoZSBpbnRyb3NwZWN0aW9uIGZvcm1hdCwKKwlJbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UsIGFuZCBhZGQgYW4gb3JnLmZyZWVkZXNrdG9wLlByb3BlcnRpZXMKKwlpbnRlcmZhY2UuCisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmM6IGFkZCBzdXBwb3J0IGZvciBhIDxwcm9wZXJ0eT4gZWxlbWVudAorCisJKiBnbGliL2RidXMtZ2lkbC5jOiBhZGQgUHJvcGVydHlJbmZvCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogcHV0IHRoZSBvdXRlcm1vc3QKKwk8bm9kZT4gb3V0c2lkZSB0aGUgc2lnbmFsIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMuCisJKGludHJvc3BlY3RfcHJvcGVydGllcyk6IGV4cG9ydCBwcm9wZXJ0aWVzIGFzIDxwcm9wZXJ0eT4gcmF0aGVyCisJdGhhbiBhcyBtZXRob2QgY2FsbHMKKworMjAwNS0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPLCBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc3BlYyBhbmQgVE9ETyB0d2Vha3MKKwlyZWxhdGVkIHRvIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sCisKKzIwMDUtMDEtMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogVXBkYXRlZCB0byBoYW5kbGUgbmV3IEQtQlVTIHR5cGUgc3lzdGVtCisJCS0gQlVTX0FDVElWQVRJT04gLT4gQlVTX1NUQVJURVIKKwkJLSBEQlVTX0JVU19BQ1RJVkFUSU9OIC0+IERCVVNfQlVTX1NUQVJURVIKKwkJLSBjbGFzcyBNZXNzYWdlSXRlciAoX19pbml0X18pOiBBZGRlZCByZWN1cnNpb24gY2hlY2tpbmcgCisJCXNvIHdlIHRocm93IGEgbmljZSBlcnJvciBpbnN0ZWFkIG9mIGp1c3QgZGlzY29ubmVjdGluZyBmcm9tIHRoZQorCQlidXMuCisJCShnZXQpOiBBZGRlZCBhcmdfdHlwZSBwYXJhbWV0ZXIgZm9yIHJlY3Vyc2lvbi4KKwkJUmVtb3ZlZCB0aGUgbmlsIHR5cGUKKwkJQWRkZWQgc2lnbml0dXJlIHR5cGUgcGxhY2Vob2xkZXIgKG5vdCBpbXBsZW1lbnRlZCkKKwkJQWRkZWQgc3RydWN0IHR5cGUgcGxhY2Vob2xkZXIgKG5vdCBpbXBsZW1lbnRlZCkKKwkJQWRkZWQgdmFyaWVudCB0eXBlIHBsYWNlaG9sZGVyIChub3QgaW1wbGVtZW50ZWQpCisJCUNvbW1lbnRlZCBvdXQgZGljdCB0eXBlIGZvciBub3cJICAgIAorCQkoZ2V0X2VsZW1lbnRfdHlwZSk6IHJlbmFtZWQgZnJvbSBnZXRfYXJyYXlfdHlwZQorCQkoZ2V0XyopOiBjaGFuZ2VkIHRvIHVzZSB0aGUgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIEFQSQorCQkoZ2V0XypfYXJyYXkpOiByZW1vdmVkIGluIGZhdm9yIG9mIHJlY3Vyc2l2ZSBnZXRfYXJyYXkgbWV0aG9kCisJCShnZXRfYXJyYXkpOiBuZXcgcmVjdXJzaXZlIG1ldGhvZCB3aGljaCBjYWxscyBnZXQgdG8gbWFyc2hhbAorCSAgICAgICAgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorCQkodmFsdWVfdG9fZGJ1c19zaWcpOiBOZXcgbWV0aG9kIHJldHVybnMgdGhlIGNvcnJhc3BvbmRpbmcKKwkJZGJ1cyBzaWduaXR1cmUgdG8gYSBweXRob24gdmFsdWUKKwkJKGFwcGVuZCk6IENvbW1lbnQgb3V0IGRpY3QgaGFuZGxpbmcgZm9yIG5vdworCQlIYW5kbGUgbGlzdHMgd2l0aCB0aGUgbmV3IHJlY3Vyc2l2ZSBBUEkKKwkJQ29tbWVudCBvdXQgTm9uZSBoYW5kbGluZyBmb3Igbm93CisJCShhcHBlbmRfbmlsKTogcmVtb3ZlZAorCQkoYXBwZW5kXyopOiBjaGFuZ2VkIHRvIHVzZSBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgQVBJCisJCShhcHBlbmRfKl9hcnJheSk6IHJlbW92ZWQgaW4gZmF2b3Igb2YgcmVjdXJzaXZlIGFwcGVuZF9hcnJheSAKKwkJbWV0aG9kCisJCShfX3N0cl9fKTogTWFrZSBpdCBlYXNpZXIgdG8gcHJpbnQgb3V0IHJlY3Vyc2l2ZSBpdGVyYXRvcnMKKwkJZm9yIGRlYnVnZ2luZworCQktIGNsYXNzIE1lc3NhZ2UgKF9fc3RyX18pOiBtb3ZlZCB0eXBlIGluc3BlY3Rpb24gdG8gdGhlCisJCU1lc3NhZ2VJdGVyIGNsYXNzJyBfX3N0cl9fIG1ldGhvZAorCQkoZ2V0X2l0ZXIpOiBBZGRlZCBhbiBhcHBlbmQgcGFyYW1ldGVyIHdpY2ggZGVmYXVsdHMgdG8gRmFsc2UKKwkJSWYgVHJ1ZSB1c2UgdGhlIG5ldyBBUEkncyB0byBjcmVhdGUgYW4gYXBwZW5kIGl0ZXJhdG9yCisKKwkqIHB5dGhvbi9kYnVzLnB5OiBVcGRhdGUgdG8gdXNlIG5ldyBiaW5kaW5ncyBBUEkKKwkJLSBUWVBFX0FDVElWQVRJT04gLT4gVFlQRV9TVEFSVEVSCisJCS0gY2xhc3MgQnVzIChfZ2V0X21hdGNoX3J1bGUpOiBHZXRTZXJ2aWNlT3duZXIgLT4gR2V0TmFtZU93bmVyCisJCS0gY2xhc3MgQWN0aXZhdGlvbkJ1cyAtPiBjbGFzcyBTdGFydGVyQnVzCisJCS0gY2xhc3MgUmVtb3RlT2JqZWN0IChfX2NhbGxfXyk6IGdldCBhbiBhcHBlbmQgaXRlcmF0b3IKKwkJLSAoX2Rpc3BhdGNoX2RidXNfbWV0aG9kX2NhbGwpOiBnZXQgYW4gYXBwZW5kIGl0ZXJhdG9yCisJCS0gY2xhc3MgT2JqZWN0IChlbWl0X3NpZ25hbCk6IGdldCBhbiBhcHBlbmQgaXRlcmF0b3IKKworCSogcHl0aG9uL2V4YW1wbGVzLzogRml4ZWQgdXAgdGhlIGV4YW1wbGVzIHRvIHdvcmsgd2l0aCB0aGUgbmV3IEFQSQorCQkKKzIwMDUtMDEtMjggIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiB1cCB0byAwLjMwLgorCisJKiBIQUNLSU5HOiBBZGQgYSByZWxlYXNlIGl0ZW0gdG8gYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgdXAgYWZ0ZXIgCisJYSByZWxlYXNlLgorCisyMDA1LTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHVwZGF0ZSB0byBkZXNjcmliZSAxNi1iaXQgdHlwZXMgYW5kCisJZGljdCBlbnRyaWVzCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3VucGFja191aW50MTYpOiBmaXggYnJva2VuCisJYXNzZXJ0aW9uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1RZUEVfRElDVF9FTlRSWSk6IGFkZCBESUNUX0VOVFJZIGFzIGEKKwl0eXBlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jOiBpbXBsZW1lbnQKKworMjAwNS0wMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogYWRkIDE2LzMyLWJpdCB0eXBlcworCisJKiBjb25maWd1cmUuaW46IGZpbmQgdGhlIHJpZ2h0IHR5cGUgZm9yIDE2IGFuZCAzMiBiaXQgaW50cyBhcyB3ZWxsCisJYXMgNjQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfVFlQRV9JTlQxNiwgREJVU19UWVBFX1VJTlQxNik6IGFkZAorCXRoZSAxNi1iaXQgdHlwZXMgc28gcGVvcGxlIGRvbid0IGhhdmUgdG8gc3R1ZmYgdGhlbSBpbiAzMi1iaXQgb3IKKwlieXRlIGFycmF5cy4KKworMjAwNS0wMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBieXRlc3dhcCB0aGUgbWVzc2FnZSBpZiB5b3UgaW5pdCBhbgorCWl0ZXJhdG9yIHRvIHJlYWQvd3JpdGUgZnJvbSBpdAorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYzogbmV3IGZpbGUgaW1wbGVtZW50aW5nIAorCV9kYnVzX21hcnNoYWxfYnl0ZXN3YXAoKQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jOiBhZGQgX2RidXNfc3dhcF9hcnJheSgpCisKKzIwMDUtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jOiBicmVhayB0aGlzIG91dCAoYW5kIGZpeAorCWJ1aWxkLCBhcHBhcmVudGx5IC0gbm9ib2R5IG5vdGljZWQ/KQorCQorMjAwNS0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oOiByZW1vdmUgdG9kbyBjb21tZW50CisKKzIwMDUtMDEtMjUgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBMYW5kIHRoZSBtb25vIGJpbmRpbmcgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBuZXcgQVBJcy4KKworCSogbW9uby9NYWtlZmlsZS5hbTogUmVtb3ZlIEN1c3RvbS5jcywgREJ1c1R5cGUvQ3VzdG9tLmNzLAorCURCdXNUeXBlL0RpY3QuY3MsIGFuZCBEQnVzVHlwZS9OaWwuY3MgZnJvbSB0aGUgYnVpbGQuCisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChHZXRDb2RlQXNTdHJpbmcpOiBBZGRlZC4gIFJldHVybnMgdGhlIGRidXMKKwl0eXBlIGNvZGUgYXMgYSBzdHJpbmcuCisJKEluaXRBcHBlbmRpbmcpOiBSZW5hbWUgZGJ1c19tZXNzYWdlX2FwcGVuZF9pdGVyX2luaXQoKSB0bworCWRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kKCkuCisKKwkqIG1vbm8vQnVzRHJpdmVyLmNzOiBSZW5hbWUgU2VydmljZUV2ZW50SGFuZGxlciB0bworCU5hbWVPd25lckNoYW5nZWRIYW5kbGVyLiAgUmVuYW1lIEdldFNlcnZpY2VPd25lciB0byBHZXRPd25lci4KKwlSZW5hbWUgU2VydmljZU93bmVyQ2hhbmdlZCB0byBOYW1lT3duZXJDaGFuZ2VkLgorCisJKiBtb25vL0Nvbm5lY3Rpb24uY3M6IFJlbmFtZSBCYXNlU2VydmljZSB0byBVbmlxdWVOYW1lLCBhbmQgdGhlCisJdW5kZXJseWluZyBDIGNhbGwuCisKKwkqIG1vbm8vQ3VzdG9tLmNzOiBSZW1vdmVkLiAgVGhlIENVU1RPTSB0eXBlIGhhcyBiZWVuIHJlbW92ZWQuCisKKwkqIG1vbm8vU2VydmljZS5jczogUmVuYW1lIEV4aXN0cyB0byBIYXNPd25lciwgaW50ZXJuYWxseSByZW5hbWUKKwlkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UoKSB0byBkYnVzX2J1c19yZXF1ZXN0X25hbWUoKS4KKworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jcyAoY3Rvcik6IFVzZSBUeXBlLkdldEVsZW1lbnRUeXBlKCkgaW5zdGVhZAorCW9mIFR5cGUuVW5kZXJseWluZ1N5c3RlbVR5cGUgdG8gZ2V0IHRoZSBjb3JyZWN0IGVsZW1lbnQgdHlwZSBmb3IKKwl0aGUgYXJyYXkuCisJKGN0b3IpOiBVcGRhdGUgY29kZSBmb3IgbmV3IEFQSXM6IHVzZSBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCksCisJZGJ1c19tZXNzYWdlX2dldF97ZWxlbWVudHxhcmd9X3R5cGUoKSBpbnN0ZWFkIG9mCisJZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcnJheV9pdGVyYXRvcigpLgorCShBcHBlbmQpOiBSZXBsYWNlIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9hcnJheSgpIHdpdGgKKwlkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIGFuZAorCWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lcigpLgorCisJKiBtb25vL0RCdXNUeXBlL0N1c3RvbS5jcywgbW9uby9EQnVzVHlwZS9OaWwuY3M6IFJlbW92ZWQuICBUaGVzZQorCXR5cGVzIGhhdmUgYmVlbiByZW1vdmVkLgorCQorCSogbW9uby9EQnVzVHlwZS8qLmNzOiBSZXBsYWNlIGNhbGxzIG9mCisJZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X1t0eXBlXSgpIHRvIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpLAorCWJ1dCBzcGVjaWZ5IHRoZSB0eXBlIGluIHRoZSBEbGxJbXBvcnQgZXh0ZXJuIGRlY2xhcmF0aW9uLiAgRGl0dG8KKwlmb3IgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX1t0eXBlXSgpIC0+CisJZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKCkuCisKKwkqIG1vbm8vZXhhbXBsZS9CdXNMaXN0ZW5lci5jczogVXBkYXRlIGZvciBTZXJ2aWNlRXZlbnRIYW5kbGVyIC0+CisJTmFtZU93bmVyQ2hhbmdlZEhhbmRsZXIuCisKKzIwMDUtMDEtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogUmVuYW1lIG9mIG1ldGhvZHMgYW5kIGJpbmRpbmdzCisJCS0gZ2V0X2Jhc2Vfc2VydmljZSAtPiBnZXRfdW5pcXVlX25hbWUKKwkJLSBidXNfZ2V0X2Jhc2Vfc2VydmljZSAtPiBidXNfZ2V0X3VuaXF1ZV9uYW1lCisJCS0gZGJ1c19idXNfZ2V0X2Jhc2Vfc2VydmljZSAtPiBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUKKwkJLSBBQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRCAtPiBEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1MgCisJCS0gQUNUSVZBVElPTl9SRVBMWV9BTFJFQURZX0FDVElWRSAtPiBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORworCQktIGJ1c19hY3RpdmF0ZV9zZXJ2aWNlIC0+IGJ1c19zdGFydF9zZXJ2aWNlX2J5X25hbWUKKwkJLSBkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlIC0+IGRidXNfYnVzX3N0YXJ0X3NlcnZpY2VfYnlfbmFtZQorCQktIGJ1c19hY3F1aXJlX3NlcnZpY2UgLT4gYnVzX3JlcXVlc3RfbmFtZQorCQktIGRidXNfYnVzX2FjcXVpcmVfc2VydmljZSAtPiBkYnVzX2J1c19yZXF1ZXN0X25hbWUKKwkJLSBidXNfc2VydmljZV9leGlzdHMgLT4gYnVzX25hbWVfaGFzX293bmVyCisJCS0gZGJ1c19idXNfc2VydmljZV9leGlzdHMgLT4gZGJ1c19idXNfbmFtZV9oYXNfb3duZXIKKworCSogcHl0aG9uL2RidXMucHk6IFJlbmFtZSBvZiBtZXRob2RzCisJCS0gYWN0aXZhdGVfc2VydmljZSAtPiBzdGFydF9zZXJ2aWNlX2J5X25hbWUKKwkJLSBidXNfYWNxdWlyZV9zZXJ2aWNlIC0+IGJ1c19yZXF1ZXN0X25hbWUKKwkJLSBBQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRCAtPiBTVEFSVF9SRVBMWV9TVUNDRVNTIAorCQktIEFDVElWQVRJT05fUkVQTFlfQUxSRUFEWV9BQ1RJVkUgLT4gU1RBUlRfUkVQTFlfQUxSRUFEWV9SVU5OSU5HCisKKwkKKzIwMDUtMDEtMjQgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBQcmludCBvdXQgdGhlCisJc2lnbmF0dXJlIGZvciB0aGUgbWV0aG9kIHRoYXQgY2FuJ3QgYmUgZm91bmQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2luaXQpOiBUbyBjaGVjayB0byBzZWUgaWYKKwl0aGUgbWVzc2FnZSBoYXMgYW55IGFyZ3VtZW50cywgd2UgbmVlZCB0byBjYWxsCisJX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSgpLCBub3QKKwlfZGJ1c190eXBlX3JlYWRlcl9oYXNfbmV4dCgpLgorCisyMDA1LTAxLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jOiBtb3JlIHRlc3Rpbmcgb2YgbWVzc2FnZSB2YWxpZGF0aW9uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpOiBtb3ZlIHRvIHRoaXMKKwloZWFkZXIKKworMjAwNS0wMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jOiAKKwlnZXQgdGhpcyBhbGwgd29ya2luZywgbm90IG1hbnkgdGVzdHMgaW4gdGhlIGZyYW1ld29yayB5ZXQgdGhvdWdoCisKKzIwMDUtMDEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1mYXEueG1sLCBkb2MvZGJ1cy10dXRvcmlhbDogYWRkIGEgRkFRIGFuZCB1cGRhdGUKKwl0dXRvcmlhbCwgYmFzZWQgb24gd29yayBmcm9tIERhdmlkIFdoZWVsZXIuCisKKzIwMDUtMDEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IGFkZCBtb3JlIHJldHVybl9pZl9mYWlsIGNoZWNrcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChsb2FkX21lc3NhZ2UpOiBoYXZlIHRoZSAibm8gdmFsaWRhdGlvbiIKKwltb2RlIChoYXZlIHRvIGVkaXQgdGhlIGNvZGUgdG8gdG9nZ2xlIHRoZSBtb2RlIGZvciBub3cgdGhvdWdoKQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAoX2RidXNfaGVhZGVyX2xvYWQpOiBoYXZlIGEgbW9kZSB0aGF0CisJc2tpcHMgYWxsIHZhbGlkYXRpb247IEkgd2FudCB0byB1c2UgdGhpcyBhdCBsZWFzdCBmb3IgYmVuY2htYXJrCisJYmFzZWxpbmUsIEknbSBub3Qgc3VyZSBpZiBpdCBzaG91bGQgYmUgYSBwdWJsaWNseS1hdmFpbGFibGUgc3dpdGNoLgorCisyMDA1LTAxLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGRvbid0IHB1dCB0aGUgR0xpYiBiaW5kaW5ncyBpbiB0aGUgc2FtZQorCXRvcGxldmVsIGRveHlnZW4gZ3JvdXAgYXMgdGhlIGxvdy1sZXZlbCBBUEkgc3R1ZmYKKworCSogZGJ1cy9kYnVzLmg6IG5vdGUgdGhhdCBsaWJkYnVzIGlzIHRoZSBsb3ctbGV2ZWwgQVBJCisKKzIwMDUtMDEtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB1cGRhdGUtZGJ1cy1kb2NzLnNoOiBzY3JpcHQgdG8gdXBkYXRlIGRvY3Mgb24gdGhlIHdlYiBzaXRlLCBvbmx5CisJd29ya3MgZm9yIG1lIHRob3VnaC4gbmVlbmVyLgorCisyMDA1LTAxLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcG9sbCk6IGFtYXppbmdseSwgdHJ5aW5nIHRvIGNvbXBpbGUKKwljb2RlIGNhbiByZXZlYWwgYnVncyBpbiBpdAorCisyMDA1LTAxLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcG9sbCk6IGZpeCBzZXZlcmFsIGJ1Z3MgaW4gdGhlCisJc2VsZWN0KCkgdmVyc2lvbiwgcGF0Y2hlcyBmcm9tIFRvciBMaWxscXZpc3QKKworMjAwNS0wMS0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogcmVwbGFjZSA+IHdpdGggJmd0OworCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IHZhbGlkYXRlIHRoZSBuYW1lCisJYW5kIHJldHVybiBhIGJldHRlciBlcnJvciBpZiBpdCdzIG5vIGdvb2QuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBub3RlIE5PX0FVVE9fU1RBUlQgY2hhbmdlCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQpOiBjaGFuZ2UKKwlmcm9tIEFVVE9fU1RBUlQsIHdlJ3JlIHRvZ2dsaW5nIHRoZSBkZWZhdWx0CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBhZGFwdCB0aGUgdGVzdHMgdG8gY2hhbmdlIG9mIGF1dG8tc3RhcnQgZGVmYXVsdAorCisyMDA1LTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogcmVuYW1lIGRidXMtZGFlbW9uLTEgdG8gZGJ1cy1kYWVtb24gdGhyb3VnaG91dAorCisyMDA1LTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIFRocm91Z2hvdXQsIGdyYW5kIHJlbmFtaW5nIHRvIHN0cmlwIG91dCB0aGUgdXNlIG9mICJzZXJ2aWNlIiwKKwlqdXN0IHNheSAibmFtZSIgaW5zdGVhZCAob3IgImJ1cyBuYW1lIiB3aGVuIGFtYmlndW91cykuICBEaWQgbm90CisJY2hhbmdlIHRoZSBpbnRlcm5hbCBjb2RlIG9mIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYsIG9ubHkgdGhlCisJcHJvZ3JhbW1lci1mYWNpbmcgQVBJIGFuZCBtZXNzYWdlcy4KKwkKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBmdXJ0aGVyIHVwZGF0ZSB0aGUgbWVzc2FnZSBidXMgc2VjdGlvbgorCQorCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYWxsX2FyZV9lcXVpdik6IGZpeCBidWcgdXNpbmcgZnJlZWQgc3RyaW5nCisJaW4gZXJyb3IgY2FzZQorCisyMDA1LTAxLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IHJlbW92ZSAxNi1iaXQgdHlwZXMgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZW0KKwlldmVyCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX3BhdGgpOiBkaXNhbGxvdyBhbnkKKwkiaW52YWxpZCBuYW1lIGNoYXJhY3RlciIgbm90IG9ubHkgbm9uLUFTQ0lJCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBmdXJ0aGVyIHVwZGF0ZSBzcGVjLCBtZXNzYWdlIGJ1cyAKKwlwYXJ0cyBhcmUgc3RpbGwgb3V0LW9mLWRhdGUgYnV0IHRoZSBtYXJzaGFsaW5nIGV0Yy4gc3R1ZmYgaXMgbm93CisJYWNjdXJhdGUtaXNoCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogcGFydGlhbGx5IHVwZGF0ZSBzcGVjCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogVGhyb3VnaG91dCwgYWxpZ24gdmFyaWFudCBib2RpZXMgYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQKKwl0eXBlLCByYXRoZXIgdGhhbiBhbHdheXMgdG8gOC4gU2hvdWxkIHNhdmUgYSBmYWlyIGJpdCBvZiBzcGFjZSBpbgorCW1lc3NhZ2UgaGVhZGVycy4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24pOgorCWZpeCBoYW5kbGluZyBvZiBjYXNlIHdoZXJlIHAgPT0gZW5kCisKKwkqIGRvYy9UT0RPOiByZW1vdmUgdGhlIGRidXNfYm9vbF90IGl0ZW0gYW5kIHZhcmlhbnQgYWxpZ25tZW50IGl0ZW1zCisKKzIwMDUtMDEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogaGFyZGNvZGUgZGJ1c19ib29sX3QgdG8gMzIgYml0cworCisJKiBUaHJvdWdob3V0OiBtb2RpZnkgREJVU19UWVBFX0JPT0xFQU4gdG8gYmUgYSAzMi1iaXQgdHlwZSBpbnN0ZWFkCisJb2YgYW4gOC1iaXQgdHlwZS4gTm93IGRidXNfYm9vbF90IGlzIHRoZSB0eXBlIHRvIHVzZSB3aGVuZXZlciB5b3UgCisJYXJlIG1hcnNoYWxpbmcvdW5tYXJzaGFsaW5nIGEgYm9vbGVhbi4KKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgVGhpcyBpcyBhYm91dCBpdCBvbiB3aGF0IGNhbiBiZSBkaXNhYmxlZC9kZWxldGVkIGZyb20gbGliZGJ1cworCWVhc2lseSwgYmFjayBiZWxvdyAxNTBLIGFueWhvdy4gRGVlcGVyIGN1dHMgYXJlIG1vcmUgd29yayB0aGFuIAorCWp1c3QgdHVybmluZyB0aGUgY29kZSBvZmYgYXMgSSd2ZSBkb25lIGhlcmUuCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c19wYWNrX2ludDMyKTogd2UgZG9uJ3QgbmVlZCB0aGUKKwlzaWduZWQgaW50IGNvbnZlbmllbmNlIGZ1bmNzCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogb21pdCB3aGVuIG5vdCBpbgorCXZlcmJvc2UgbW9kZQorCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYywgZGJ1cy9kYnVzLXN0cmluZy5jOiBtb3JlIGJyZWFraW5nCisJdGhpbmdzIG91dCBvZiBsaWJkYnVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYzogc2FtZQorCQorCSogZGJ1cy9kYnVzLWhhc2guYzogcHVyZ2UgdGhlIFRXT19TVFJJTkdTIGNyYXAgKHdlbGwsIG1ha2UgaXQKKwl0ZXN0cy1lbmFibGVkLW9ubHksIHRob3VnaCBpdCBzaG91bGQgcHJvYmFibHkgYmUgZGVsZXRlZCkKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jOiBzYW1lIHN0dWZmCisKKwkqIGRidXMvZGJ1cy1hdXRoLXV0aWwuYzogc2FtZSBzdHVmZgorCisyMDA1LTAxLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6IHNwbGl0IG91dCBwYXJ0IG9mIGRidXMtdXNlcmRiLmMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfdWlkX2Zyb21fc3RyaW5nKTogbW92ZSBoZXJlIHRvIHBhdmUKKwl3YXkgZm9yIHN0cmlwcGluZyBkb3duIGRidXMtdXNlcmRiLmMgc3R1ZmYgaW5jbHVkZWQgaW4gbGliZGJ1cy4KKwlSZW5hbWUgX2RidXNfcGFyc2VfdWlkIGZvciBjb25zaXN0ZW5jeS4KKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfcmVhbF9hc3NlcnQpOiBwcmludCB0aGUgZnVuY3Rpb24KKwluYW1lIHRoZSBhc3NlcnRpb24gZmFpbGVkIGluCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX2RidXNfcmV0dXJuX2lmX2ZhaWwpIAorCShfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwpOiBhc3NlcnQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKwljb250YWluaW5nIHRoZSBjaGVjayBkb2Vzbid0IHN0YXJ0IHdpdGggJ18nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gCisJdXNlIGNoZWNrcyBvbiBwdWJsaWMgZnVuY3Rpb25zCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCk6IGNoYW5nZQorCWNoZWNrcyB0byBhc3NlcnRpb25zCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIChfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljKToKKwljaGFuZ2UgY2hlY2tzIHRvIGFzc2VydHMgZm9yIHByaXZhdGUgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9zZXRfc2VyaWFsKTogY2hlY2tzCisJdG8gYXNzZXJ0cyBmb3IgcHJpdmF0ZSBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoc2tpcF9vbmVfY29tcGxldGVfdHlwZSk6IHJlbW92ZQorCWJyb2tlbiBhc3NlcnRpb24gdGhhdCB3YXMgYnJlYWtpbmcgbWFrZSBjaGVjaworCShfZGJ1c190eXBlX3JlYWRlcl9hcnJheV9pc19lbXB0eSk6IHJlbW92ZSB0aGlzIHJhdGhlciB0aGFuIGZpeAorCWl0LCB3YXMgb25seSB1c2VkIGluIGFzc2VydGlvbnMKKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdW51c2VkLWNvZGUtZ2MucHk6IGhhY2t5IHNjcmlwdCB0byBmaW5kIGNvZGUgdGhhdCdzIHVzZWQKKwlvbmx5IGJ5IHRoZSBidXMgKG5vdCBsaWJkYnVzKSBvciB1c2VkIG9ubHkgYnkgdGVzdHMgb3Igbm90IHVzZWQgYXQKKwlhbGwuIEl0IGhhcyBzb21lIGZhbHNlIGFsYXJtcywgYnV0IGxvb2tzIGxpa2Ugd2UgY2FuIGNsZWFuIHVwIGEKKwlsb3Qgb2Ygc2l6ZSBmcm9tIGxpYmRidXMuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWxzLmMsCisJZGJ1cy9NYWtlZmlsZS5hbTogaW5pdGlhbGx5IG1vdmUgMTBLIG9mIGJpbmFyeSBzaXplIG91dCBvZiBsaWJkYnVzCisJCisyMDA1LTAxLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIEFkZCBhbmQgZml4IGRvY3MgYWNjb3JkaW5nIHRvIERveHlnZW4gd2FybmluZ3MgdGhyb3VnaG91dAorCXNvdXJjZS4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisJKF9kYnVzX3R5cGVfcmVhZGVyX2FycmF5X2lzX2VtcHR5KTogY2hhbmdlIHRoaXMgdG8ganVzdCBjYWxsCisJYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4oKSBhbmQgbWFrZSBpdCBzdGF0aWMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSk6IHJlbmFtZQorCWZyb20gZ2V0X2FycmF5X3R5cGUKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQpOiByZW5hbWUgZnJvbSBhcHBlbmRfaXRlcl9pbml0CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisJKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUpOiByZW5hbWUgZnJvbQorCV9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV90eXBlCisKKzIwMDUtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKHdpdGhfYnVzX3NlcnZlcl9maWx0ZXIpOiBmaXggY3Jhc2gKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdW5wYWNrX3VpbnQzMik6IGlubGluZSBhcyBtYWNybworCXdoZW4gREJVU19ESVNBQkxFX0FTU0VSVAorCShfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyk6IGJlIHN1cmUgd2UgYWxpZ24gZm9yIHRoZSBzdHJpbmcgbGVuZ3RoCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIChza2lwX29uZV9jb21wbGV0ZV90eXBlKTogbWFrZQorCXRoaXMgbG9vayBmYXN0ZXIKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuKTogYWRkIGFuCisJaW5saW5lIG1hY3JvIHZlcnNpb24KKwkoX2RidXNfc3RyaW5nX3NldF9ieXRlKTogcHJvdmlkZSBpbmxpbmUgbWFjcm8gdmVyc2lvbgorCisyMDA1LTAxLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTGFuZCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkgYW5kIHR5cGUgc3lzdGVtLgorCisJVGhpcyBwYXRjaCBpcyBodWdlLCBidXQgdGhlIHB1YmxpYyBBUEkgY2hhbmdlIGlzIG5vdCAKKwlyZWFsbHkgbGFyZ2UuIFRoZSBzZXQgb2YgRC1CVVMgdHlwZXMgaGFzIGNoYW5nZWQgc29tZXdoYXQsIAorCWFuZCB0aGUgYXJnICJnZXR0ZXJzIiBhcmUgbW9yZSBnZWFyZWQgdG93YXJkIGxhbmd1YWdlIGJpbmRpbmdzOworCXRoZXkgZG9uJ3QgbWFrZSBhIGNvcHksIGV0Yy4KKworCVRoZXJlIGFyZSBhbHNvIHNvbWUga25vd24gaXNzdWVzLiBTZWUgdGhlc2UgZW1haWxzIGZvciBkZXRhaWxzCisJb24gdGhpcyBodWdlIHBhdGNoOgorCWh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA0LURlY2VtYmVyLzAwMTgzNi5odG1sCisgICAgICAgIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA1LUphbnVhcnkvMDAxOTIyLmh0bWwKKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLSo6IGFsbCB0aGUgbmV3IHN0dWZmCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGJhc2ljYWxseSByZXdyaXR0ZW4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChjaGVja19ndWFyZHMpOiB3aXRoICJndWFyZHMiIGVuYWJsZWQsIGluaXQKKwlmcmVlZCBibG9ja3MgdG8gYmUgYWxsIG5vbi1udWwgYnl0ZXMgc28gdXNpbmcgZnJlZWQgbWVtb3J5IGlzIGxlc3MKKwlsaWtlbHkgdG8gd29yayByaWdodAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nKTogYWRkCisJREJVU19GQUlMX01BTExPQz1OIGVudmlyb25tZW50IHZhcmlhYmxlLCBzbyB5b3UgY2FuIGRvCisJREJVU19GQUlMX01BTExPQz0wIHRvIHNraXAgdGhlIG91dC1vZi1tZW1vcnkgY2hlY2tpbmcsIG9yCisJREJVU19GQUlMX01BTExPQz0xMCB0byBtYWtlIGl0IHJlYWxseSwgcmVhbGx5LCByZWFsbHkgc2xvdyBhbmQKKwl0aG9yb3VnaC4KKworCSogcXQvbWVzc2FnZS5jcHA6IHBvcnQgdG8gdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJCisJKG9wZXJhdG9yPDwpOiB1c2Ugc3RyLnV0ZjgoKSByYXRoZXIgdGhhbiBzdHIudW5pY29kZSgpCisJKHByZXR0eSBzdXJlIHRoaXMgaXMgcmlnaHQgZnJvbSB0aGUgUXQgZG9jcz8pCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzogcG9ydCB0byB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkKKworCSogYnVzL2Rpc3BhdGNoLmMsIGJ1cy9kcml2ZXIuYzogcG9ydCB0byB0aGUgbmV3IG1lc3NhZ2UgYXJncyBBUEkKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4pOiBpbml0aWFsaXplIHRoZQorCSJsb2NrZWQiIGZsYWcgdG8gVFJVRSBhbmQgYWxpZ25fb2Zmc2V0IHRvIDA7IEkgZ3Vlc3Mgd2UgbmV2ZXIKKwlsb29rZWQgYXQgdGhlc2UgYW55aG93LCBidXQgc2VlbXMgY2xlYW5lci4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5oIChfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKToKKwltb3ZlIGFsbG9jYXRpb24gcGFkZGluZyBtYWNybyB0byB0aGlzIGhlYWRlcjsgdXNlIGl0IHRvIGltcGxlbWVudAorCShfREJVU19TVFJJTkdfU1RBVElDKTogYWJpbGl0eSB0byBkZWNsYXJlIGEgc3RhdGljIHN0cmluZy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyKToKKwljaGFuZ2UgdG8gcmV0dXJuIFRSVUUgaWYgdGhlIGludGVyZmFjZSBpcyBub3Qgc2V0LgorCisJKiBkYnVzL2RidXMtc3RyaW5nLltoY106IG1vdmUgdGhlIEQtQlVTIHNwZWNpZmljIHZhbGlkYXRpb24gc3R1ZmYKKwl0byBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuW2hjXQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c190eXBlX3RvX3N0cmluZyk6IG1vdmUgaGVyZSBmcm9tCisJZGJ1cy1pbnRlcm5hbHMuYworCisJKiBkYnVzL01ha2VmaWxlLmFtOiBjdXQgb3ZlciBmcm9tIGRidXMtbWFyc2hhbC5baGNdCisJdG8gZGJ1cy1tYXJzaGFsLSouW2hjXQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfZGVjb21wb3NlX3BhdGgpOiBtb3ZlIHRoaXMKKwlmdW5jdGlvbiBoZXJlIGZyb20gZGJ1cy1tYXJzaGFsLmMKKworMjAwNS0wMS0xMiAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSBmb3IgMC4yMy4KKworCSogY29uZmlndXJlLmluOiBSZWxlYXNlIDAuMjMuCisKKzIwMDUtMDEtMTIgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL01ha2VmaWxlLmFtLCBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06IEFsd2F5cyBidWlsZCB0aGUgCisJZGJ1cyBETEwgd2l0aCAtLWRlYnVnLiAgQ2xlYW4gdXAgYWZ0ZXIgdGhlIC5tZGIgZmlsZXMgdGhpcyBsZWF2ZXMKKwliZWhpbmQuCisKKwkqIG1vbm8vZG9jL01ha2VmaWxlLmFtOiBOZWVkIHRvIHVuaW5zdGFsbCB0aGUgZG9jcyBvbiAibWFrZQorCXVuaW5zdGFsbCIKKworCSogbW9uby9Bcmd1bWVudHMuY3MgKEdldERCdXNUeXBlQ29uc3RydWN0b3IpOiBJZiB0aGUgdHlwZQorCWlzIGFuIGVudW0sIGdldCB0aGUgZW51bSdzIHVuZGVybHlpbmcgdHlwZS4gIEFub3RoZXIgbW9ubworCTEuMS4zIGZpeC4KKworMjAwNS0wMS0xMSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwlQYXRjaCBmcm9tIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbSwgbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiBEb24ndCByZWRlZmluZQorCURFU1RESVIuICBJdCBicmVha3Mgc3R1ZmYuCisKKzIwMDUtMDEtMTEgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJUGF0Y2ggZnJvbSBUYW1iZXQgSW5nbyA8dGFtYmV0QHhpbWlhbi5jb20+CisKKwkqIG1vbm8vREJ1c1R5cGUvQXJyYXkuY3MgKEdldCk6IEdldCB0aGUgdW5kZXJseWluZyBlbGVtZW50IHR5cGUgYnkKKwljYWxsaW5nIHR5cGUuR2V0RWxlbWVudFR5cGUoKS4gIFRoZSBjb2RlIHByZXZpb3VzbHkgZGVwZW5kZWQgb24KKwlicm9rZW4gTW9ubyBiZWhhdmlvciwgd2hpY2ggd2FzIGZpeGVkIGluIE1vbm8gMS4xLjMuCisKKwkqIG1vbm8vREJ1c1R5cGUvRGljdC5jcyAoY29uc3RydWN0b3IpOiBGaXggdGhlIHBhcmFtZXRlcnMgZm9yCisJQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKCkgc28gdGhhdCB0aGUgY2xhc3MncyBjb25zdHJ1Y3RvciBpcworCWNhbGxlZCB3aXRoIHRoZSByaWdodCBwYXJhbWV0ZXJzLgorCisyMDA1LTAxLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBUZXLDpHMgPGV4dC10aW1vLnRlcmFzQG5va2lhLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayk6IENhbGwKKwlfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0KCkgaW5zdGVhZCBvZiB0aGUgX2xvY2tlZCgpCisJdmFyaWFudCwgc2luY2UgaXQncyBhbHdheXMgY2FsbGVkIGZyb20KKwlfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCgpLCB3aGljaCBoYW5kbGVzIHRoZSBsb2NraW5nLgorCVJlbW92ZWQgdGhlIF9sb2NrZWQoKSB2YXJpYW50IHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWQuCisKKzIwMDUtMDEtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IEknbSBhbiBpZGlvdCwgX2RidXNfYXNzZXJ0IGNlcnRhaW5seSBjYW4KKwlyZXR1cm4KKwkKKzIwMDQtMTItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBfREJVU19HTlVDX05PUkVUVVJOIHRvIF9kYnVzX2Fzc2VydAorCisyMDA1LTAxLTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogZml4IHVzaW5nID09IG9uCisJZmxvYXRpbmcgcG9pbnQKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCk6IG5ldyBmdW5jdGlvbgorCisyMDA1LTAxLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19BTElHTl9PRkZTRVQpOiBuZXcgbWFjcm8KKworMjAwNS0wMS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC1XZmxvYXQtZXF1YWwKKworMjAwNS0wMS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IGFkZCBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgbWFjcm8sIAorCWZvciBhIHZhcmlldHkgb2YgcmVhc29ucyAnPT0nIGRvZXNuJ3QgZG8gdGhpcy4KKworMjAwNC0xMi0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZ3MpOiBuZXcgZnVuY3Rpb24KKwlJIGtlZXAgd2lzaGluZyBJIGhhZAorCisyMDA0LTEyLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1cy5weTogcy9BQ1RJVkFUSU9OX1JFUExZX0FDVElWRS9BQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRAorCisyMDA0LTEyLTMwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IENoYW5nZSBEQlVTX0FDVElWQVRJT05fUkVQTFlfQUNUSVZBVEVECisJYW5kIERCVVNfQUNUSVZBVElPTl9SRVBMWV9BTFJFQURZX0FDVElWRSB0byBtYXRjaCB0aGUgdmFsdWVzIGluCisJZGJ1cy1wcm90b2NvbC5oLiAgQmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVzIGFuZCBub3QgZW51bXMgdGhleSBhcmUgbm90CisJYXV0b2dlbmVyYXRlZC4KKworMjAwNC0xMi0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChidXNfYWN0aXZhdGVfc2VydmljZSk6IEJpbmQKKwlkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlCisKKwkqIHB5dGhvbi9kYnVzLnB5IChCdXMuYWN0aXZhdGVfc2VydmljZSk6IGFjdGl2YXRlIGEgc2VydmljZSBvbiB0aGUKKwlidXMuCisKKzIwMDQtMTItMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmM6IGNoYW5nZSB0byB1c2UgLmdjbm8gYW5kIC5nY2RhIGZpbGVzLCBidXQgdGhlCisJZmlsZSBmb3JtYXQgaGFzIGFsc28gY2hhbmdlZCBhbmQgSSBoYXZlbid0IGFkYXB0ZWQgdG8gdGhhdCB5ZXQKKwkKKwkqIE1ha2VmaWxlLmFtOiBsb2FkIC5nY25vIGZpbGVzIGZyb20gbGF0ZXN0IGdjYworCisyMDA0LTEyLTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogUGF0Y2ggZnJvbSBSb2IgVGF5bG9yIDxyb2J0YXlsb3JAZmFzdG1haWwuZm0+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoYnVzX2dldF91bml4X3VzZXIpOiBOZXcKKwlsb3dsZXZlbCBiaW5kaW5nCisKKwkqIHB5dGhvbi9kYnVzLnB5IChnZXRfdW5peF91c2VyKTogQWRkZWQgYmluZGluZyB0byAKKwljYWxsIGRidXNfYmluZGluZ3MuYnVzX2dldF91bml4X3VzZXIKKworCSogcHl0aG9uL2V4dHJhY3QucHk6IE1vZGlmaWVkIHRoZSBwcm90b19wYXQgcmVnZXggdG8KKwloYW5kbGUgdW5zaWduZWQgbG9uZworCisyMDA0LTEyLTIxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9tYWtlLWRidXMtZ2xpYi1lcnJvci1lbnVtLnNoOiBvbWl0IHRoZSBmdW5jdGlvbiBrZXl3b3JkIGZvcgorCWJldHRlciBQT1NJWCBjb21wbGlhbmNlLgorCisyMDA0LTEyLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCkgCisJKF9kYnVzX3N0cmluZ19pbnNlcnRfOF9hbGlnbmVkKTogbmV3IGZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSk6IG5ldyBmdW5jdGlvbgorCisyMDA0LTEyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkpOiB1c2UgSVNBU0NJSQorCW1hY3JvCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGZpeCBhIGNvbW1lbnQsIGFuZCBhZGQgYSBzdGlsbC11bnVzZWQKKwlub3QtaW1wbGVtZW50ZWQgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDogZml4IGNvbW1lbnQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19JU0FTQ0lJKTogbmV3IG1hY3JvCisKKzIwMDQtMTItMTcgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0RCdXNUeXBlL0J5dGUuY3MsIG1vbm8vREJ1c1R5cGUvSW50MzIuY3MsCisJbW9uby9EQnVzVHlwZS9JbnQ2NC5jcywgbW9uby9EQnVzVHlwZS9VSW50MzIuY3MsCisJbW9uby9EQnVzVHlwZS9VSW50NjQuY3M6IFVzZSBFbnVtLkdldFVuZGVybHlpbmdUeXBlKCkgaW5zdGVhZCBvZgorCVR5cGUuVW5kZXJseWluZ1N5c3RlbVR5cGUgdG8gZ2V0IHRoZSBhY3R1YWwgc3lzdGVtIHR5cGUKKwl1bmRlcm5lYXRoLiAgVGhpcyBjb2RlIHByZXZpb3VzbHkgZGVwZW5kZWQgb24gdGhlIGJyb2tlbiBNb25vCisJYmVoYXZpb3IsIHdoaWNoIHdhcyBmaXhlZCBpbiAxLjEuMy4KKworMjAwNC0xMS0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaCAoX2RidXNfc3RyaW5nX2dldF9ieXRlKTogaW5saW5lIHdoZW4gYXNzZXJ0cworCWFyZSBkaXNhYmxlZAorCShfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEpOiBpbmxpbmUgd2hlbiBhc3NlcnRzIGFyZSBkaXNhYmxlZAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWNvcmQgdGhlIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiBvZgorCWNyZWF0aW9uIHNvIHdlIGNhbiBjb21wbGFpbiBpZiBkYnVzX3NodXRkb3duKCkgaXMgdXNlZCBpbXByb3Blcmx5LgorCURvIHRoaXMgb25seSBpZiBjaGVja3MgYXJlIGVuYWJsZWQuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGRpdHRvCisJCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBhZGQgd2l0aF9idXMgbW9kZSB0byBwcm9maWxlIGVjaG9lcworCXRoYXQgZ28gdGhyb3VnaCB0aGUgYnVzLgorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IGFkZCBhYmlsaXR5IHRvIHJ1biB0ZXN0LXByb2ZpbGUKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogZml4IHRvIHNheSB0aGF0IFNJR0hVUCBjYXVzZXMgcGFydGlhbAorCWNvbmZpZyBmaWxlIHJlbG9hZC4KKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogY2xlYW4gdXAgaG93IHRoZSBmYWtlX21hbGxvY19vdmVyaGVhZAorCXRoaW5nIHdhcyBpbXBsZW1lbnRlZAorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiB0d2VhayBhIGJpdCwgYWRkIHN1cHBvcnQgZm9yIHNvbWUKKwltYWRlLXVwIG1pbmltYWwgbWFsbG9jIG92ZXJoZWFkIHdpdGggcGxhaW4gc29ja2V0cywgc2luY2UgaW4gCisJcmVhbCBsaWZlIHNvbWUgc29ydCBvZiBidWZmZXJzIGFyZSB1bmF2b2lkYWJsZSB0aHVzIHdlIGNvdWxkIAorCWNvdW50IHRoZW0gaW4gdGhlIHRoZW9yZXRpY2FsIGJlc3QgY2FzZQorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2NhY2hlX29yX2ZpbmFsaXplKTogZml4IGJ1ZworCXdoZXJlIEkgd2FzIHRyeWluZyB0byBjYWNoZSBvbmUgdG9vIG1hbnkgbWVzc2FnZXMKKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IHJlaW1wbGVtZW50IG1lc3NhZ2UgY2FjaGUgYXMgYW4gYXJyYXkgd2hpY2ggCisJbWFrZXMgdGhlIGNhY2hlIGFib3V0IHR3aWNlIGFzIGZhc3QgYW5kIHNhdmVzIG1heWJlIDEuNSUgb3ZlcmFsbAorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoaW5pdF9nbG9iYWxfbG9ja3MpOiBmb3Jnb3QgdG8gcHV0IHRoZQorCW1lc3NhZ2UgY2FjaGUgbG9jayBoZXJlCisKKzIwMDQtMTEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBwdXQgdGhlIGxvY2tlZCBiaXQgYW5kCisJdGhlICJjaGFyIGJ5dGVfb3JkZXIiIG5leHQgdG8gZWFjaCBvdGhlciB0byBzYXZlIDQgYnl0ZXMKKwkoZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIpOiByZWR1Y2UgcHJlYWxsb2NhdGlvbiwgc2luY2UgdGhlCisJbWVzc2FnZSBjYWNoZSBzaG91bGQgYWNoaWV2ZSBhIHNpbWlsYXIgZWZmZWN0CisJKGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSwgZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQpOiBhZGQgYQorCW1lc3NhZ2UgY2FjaGUgdGhhdCBrZWVwcyBhIGZldyBEQnVzTWVzc2FnZSBhcm91bmQgaW4gYSBwb29sLAorCWFub3RoZXIgOCUgc3BlZWR1cCBvciBzby4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyKTogbmV3IGZ1bmN0aW9uCisKKzIwMDQtMTEtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBpZiB3ZSdyZSBnb2luZworCXRvIHdyaXRlLCB3aXRob3V0IHJlYWRpbmcgb3IgYmxvY2tpbmcsIHRyeSBpdCBiZWZvcmUgdGhlIHBvbGwoKQorCWFuZCBza2lwIHRoZSBwb2xsKCkgaWYgbm90aGluZyByZW1haW5zIHRvIHdyaXRlLiBUaGlzIGlzIGFib3V0IGEKKwkzJSBzcGVlZHVwIGluIHRoZSBlY2hvIGNsaWVudC9zZXJ2ZXIKKworMjAwNC0xMS0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgVGhlIHByaW1hcnkgY2hhbmdlIGhlcmUgaXMgdG8gYWx3YXlzIHdyaXRlKCkgb25jZSBiZWZvcmUgYWRkaW5nCisJdGhlIHdyaXRlIHdhdGNoLCB3aGljaCBnaXZlcyB1cyBhYm91dCBhIDEwJSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiBhIG51bWJlciBvZiBtb2RpZmljYXRpb25zIHRvIGNvcGUKKwl3aXRoIHJlbW92aW5nIG1lc3NhZ2VzX3BlbmRpbmcKKwkoY2hlY2tfd3JpdGVfd2F0Y2gpOiBwcm9wZXJseSBoYW5kbGUKKwlEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOyBhZGFwdCB0byByZW1vdmFsIG9mCisJbWVzc2FnZXNfcGVuZGluZyBzdHVmZgorCShjaGVja19yZWFkX3dhdGNoKTogcHJvcGVybHkgaGFuZGxlIFdBSVRJTkdfRk9SX01FTU9SWSBhbmQKKwlBVVRIRU5USUNBVEVEIGNhc2VzCisJKHVuaXhfaGFuZGxlX3dhdGNoKTogYWZ0ZXIgd3JpdGluZywgc2VlIGlmIHRoZSB3cml0ZSB3YXRjaCBjYW4gYmUKKwlyZW1vdmVkCisJKHVuaXhfZG9faXRlcmF0aW9uKTogYXNzZXJ0IHRoYXQgd3JpdGVfd2F0Y2gvcmVhZF93YXRjaCBhcmUKKwlub24tTlVMTCByYXRoZXIgdGhhbiB0ZXN0aW5nIHRoYXQgdGhleSBhcmVuJ3QsIHNpbmNlIHRoZXkgCisJYXJlbid0IGFsbG93ZWQgdG8gYmUgTlVMTC4gY2hlY2tfd3JpdGVfd2F0Y2goKSBhdCB0aGUgZW5kIHNvIAorCXdlIGFkZCB0aGUgd2F0Y2ggaWYgd2UgZGlkIG5vdCBmaW5pc2ggd3JpdGluZyAoZS5nLiBnb3QgRUFHQUlOKQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oOiByZW1vdmUgbWVzc2FnZXNfcGVuZGluZyBjYWxsLAorCXNpbmNlIGl0IHJlc3VsdGVkIGluIHRvbyBtdWNoIGluZWZmaWNpZW50IHdhdGNoIGFkZGluZy9yZW1vdmluZzsgCisJaW5zdGVhZCB3ZSBub3cgcmVxdWlyZSB0aGF0IHRoZSB0cmFuc3BvcnQgdXNlciBkb2VzIGFuIGl0ZXJhdGlvbiAKKwlhZnRlciBxdWV1ZWluZyBvdXRnb2luZyBtZXNzYWdlcywgYW5kIGFmdGVyIHRyeWluZyB0aGUgZmlyc3QKKwl3cml0ZSgpIHdlIGFkZCBhIHdyaXRlIHdhdGNoIGlmIHdlIGdvdCBFQUdBSU4gb3IgZXhjZWVkZWQgb3VyIAorCW1heCBieXRlcyB0byB3cml0ZSBwZXIgaXRlcmF0aW9uIHNldHRpbmcKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfc2lnbmF0dXJlKTogYWRkIHRoaXMKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAodW5peF9maW5hbGl6ZSk6IHRoZSBzb2NrZXQgbmFtZSB3YXMKKwlmcmVlZCBhbmQgdGhlbiBhY2Nlc3NlZCwgdmFsZ3JpbmQgZmxhZ2dlZCB0aGlzIGJ1ZywgZml4IGl0CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGZpeCBzZXZlcmFsIGJ1Z3Mgd2hlcmUgSEVBREVSX0ZJRUxEX0xBU1Qgd2FzIHRha2VuCisJYXMgdGhlIGxhc3QgdmFsaWQgZmllbGQgcGx1cyAxLCB3aGVyZSByZWFsbHkgaXQgaXMgZXF1YWwgdG8gdGhlCisJbGFzdCB2YWxpZCBmaWVsZC4gQ29ycmVjdHMgc29tZSBtZXNzYWdlIGNvcnJ1cHRpb24gaXNzdWVzLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYzogdmVyYm9zaXR5IGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19uZXdfaG9tZWRpcik6IGhhbmRsZSBPT00KKwlpbnN0ZWFkIG9mIGFib3J0aW5nIGluIG9uZSBvZiB0aGUgdGVzdCBjb2RlcGF0aHMKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlX3JlYWwpOiBmaXggYSBidWcgdGhhdAorCWNhdXNlZCBub3QgcHJpbnRpbmcgdGhlIHBpZCBldmVyIGFnYWluIGlmIGEgdmVyYm9zZSB3YXMgbWlzc2luZworCXRoZSBuZXdsaW5lIGF0IHRoZSBlbmQKKwkoX2RidXNfaGVhZGVyX2ZpZWxkX3RvX3N0cmluZyk6IGFkZCBIRUFERVJfRklFTERfU0lHTkFUVVJFCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IHZlcmJvc2l0eSBjaGFuZ2VzOyAKKwkoZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50KTogbm8gbG9uZ2VyIGNhbGwgdHJhbnNwb3J0LT5tZXNzYWdlc19wZW5kaW5nCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWQpOiBkbyBvbmUgaXRlcmF0aW9uIHRvCisJdHJ5IHRvIHdyaXRlKCkgaW1tZWRpYXRlbHksIHNvIHdlIGNhbiBhdm9pZCB0aGUgd3JpdGUgd2F0Y2guIFRoaXMKKwlpcyB0aGUgY29yZSBwdXJwb3NlIG9mIHRoaXMgcGF0Y2hzZXQKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKTogaWYgZGlzY29ubmVjdGVkLAorCWR1bXAgdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUsIHNvIG5vYm9keSB3aWxsIGdldCBjb25mdXNlZAorCXRyeWluZyB0byBzZW5kIHRoZW0gb3IgdGhpbmtpbmcgc3R1ZmYgaXMgcGVuZGluZyB0byBiZSBzZW50CisKKwkqIGJ1cy90ZXN0LmM6IHZlcmJvc2l0eSBjaGFuZ2VzCisKKwkqIGJ1cy9kcml2ZXIuYzogdmVyYm9zaXR5L2Fzc2VydGlvbiBjaGFuZ2VzCisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBhIGJ1bmNoIG9mIGxpdHRsZSB0d2Vha3MgdG8gZ2V0IGl0IHdvcmtpbmcgYWdhaW4KKwliZWNhdXNlIHRoaXMgcGF0Y2hzZXQgY2hhbmdlcyB3aGVuL3doZXJlIHlvdSBuZWVkIHRvIGJsb2NrLgorCisyMDA0LTExLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBtb2RpZnkgdG8gYWNjZXB0IGEgcGxhaW5fc29ja2V0cworCWFyZ3VtZW50IGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZW5jaCBwbGFpbiBzb2NrZXRzIGluc3RlYWQgb2YKKwlsaWJkYnVzLCBmb3IgY29tcGFyaXNvbiBwdXJwb3Nlcy4KKworMjAwNC0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAoTl9DTElFTlRfVEhSRUFEUyk6IHJ1biBtdWx0aXBsZQorCXRocmVhZHMgZm9yIG1vcmUgdGltZSwgc28gc3lzcHJvZiBjYW4gZ2V0IGEgZ3JpcCBvbiBpdC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IHJlbW92ZQorCXBvaW50bGVzcyB2YXJpYWJsZQorCisyMDA0LTExLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jOiBmaXggdGhpcyB0aGluZyB1cCBhIGJpdAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcik6IGluY3JlYXNlCisJcHJlYWxsb2NhdGlvbiBzaXplcyBieSBhIGZhaXIgYml0OyBub3Qgc3VyZSBpZiB0aGlzIHdpbGwgYmUgYW4KKwlvdmVyYWxsIHBlcmZvcm1hbmNlIHdpbiBvciBub3QsIGJ1dCBpdCBkb2VzIHJlZHVjZSByZWFsbG9jcy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChzZXRfbGVuZ3RoLCByZWFsbG9jYXRlX2Zvcl9sZW5ndGgpOiBpZ25vcmUKKwl0aGUgdGVzdCBoYWNrIHRoYXQgZm9yY2VkIGNvbnN0YW50IHJlYWxsb2MgaWYgYXNzZXJ0cyBhcmUKKwlkaXNhYmxlZCwgc28gd2UgY2FuIHByb2ZpbGUgc2FuZWx5LiBTcHJpbmtsZSBpbiBzb21lCisJX0RCVVNfVU5MSUtFTFkoKSB3aGljaCBhcmUgcHJvYmFibHkgcG9pbnRsZXNzLCBidXQgYmVmb3JlIEkKKwlub3RpY2VkIHRoZSByZWFsIHBlcmZvcm1hbmNlIHByb2JsZW0gSSBwdXQgdGhlbSBpbi4KKwkoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBtaWNyby1vcHRpbWl6ZSB0aGlzIHRoaW5nIGEgbGl0dGxlCisJYml0LCB0aG91Z2ggY2FsbGdyaW5kIHNheXMgaXQgZGlkbid0IGhlbHA7IHRoZW4gc3BlY2lhbC1jYXNlCisJYXNjaWksIHdoaWNoIGRpZCBoZWxwIGEgbG90OyB0aGVuIGJlIHN1cmUgd2UgZGV0ZWN0IG51bCBieXRlcyBhcworCWludmFsaWQsIHdoaWNoIGlzIGEgYnVnZml4LgorCShhbGlnbl9sZW5ndGhfdGhlbl9sZW5ndGhlbik6IGFkZCBzb21lIG1vcmUgX0RCVVNfVU5MSUtFTFkKKwlzdXBlcnN0aXRpb247IHVzZSBtZW1zZXQgdG8gbnVsIHRoZSBwYWRkaW5nIGluc3RlYWQgb2YgYSBtYW51YWwKKwlsb29wLgorCShfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCk6IGlubGluZSB0aGlzIGFzIGEKKwltYWNybzsgaXQgc2hvd2VkIHVwIGluIHRoZSBwcm9maWxlIGJlY2F1c2UgaXQncyB1c2VkIGZvciBsb29wCisJdGVzdHMgYW5kIHNvIGZvcnRoCisKKzIwMDQtMTEtMTAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChjaGVja19iYWJ5c2l0X2V2ZW50cyk6IEhhbmRsZSBFSU5UUiwKKwlmb3IgZXh0cmEgcGFyYW5vaWEuCisKKzIwMDQtMTEtMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGgpOiBOZXcKKwlmdW5jdGlvbiwgd3JpdGVzIERCdXNTdHJpbmcgdG8gQyBidWZmZXIuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaDogUHJvdG90eXBlIGl0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcpOiBOZXcKKwlmdW5jdGlvbiwgY29udmVydHMgbWVzc2FnZSB0eXBlIGludG8gQyBzdHJpbmcuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IFByb3RvdHlwZSBpdC4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfY2hlY2spOiBUYWtlIHNvdXJjZSBwaWQsCisJdGFyZ2V0IHBpZCwgYW5kIGF1ZGl0IGRhdGEuICBQYXNzIGF1ZGl0IGRhdGEgdG8KKwlhdmNfaGFzX3Blcm0uCisJKGxvZ19hdWRpdF9jYWxsYmFjayk6IE5ldyBmdW5jdGlvbiwgYXBwZW5kcyBleHRyYQorCWF1ZGl0IGluZm9ybWF0aW9uLgorCShidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKTogQWxzbyB0YWtlCisJc2VydmljZSBuYW1lLCBhZGQgaXQgdG8gYXVkaXQgZGF0YS4KKwkoYnVzX3NlbGludXhfYWxsb3dzX3NlbmQpOiBBbHNvIHRha2UgbWVzc2FnZQorCXR5cGUsIGludGVyZmFjZSwgbWV0aG9kIG1lbWJlciwgZXJyb3IgbmFtZSwKKwlhbmQgZGVzdGluYXRpb24sIGFuZCBhZGQgdGhlbSB0byBhdWRpdCBkYXRhLgorCShsb2dfY2IpOiBJbml0aWFsaXplIGZ1bmNfYXVkaXQuCisJCisJKiBidXMvc2VsaW51eC5oIChidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKQorCShidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IFVwZGF0ZSBwcm90b3R5cGVzIAorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFBhc3MKKwlzZXJ2aWNlIG5hbWUgdG8gYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZS4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBQYXNzCisJYWRkaXRpb25hbCBhdWRpdCBkYXRhLiAgTW92ZSBhc3NpZ25tZW50IG9mIGRlc3QKKwl0byBpdHMgb3duIGxpbmUuCisKKzIwMDQtMTEtMDcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IEFsd2F5cworCWluaXRpYWxpemUgYXV0aF9jb21wbGV0ZWQuCisJCisyMDA0LTExLTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvYnVzLmMgKGxvYWRfY29uZmlnKTogQnJlYWsgaW50byB0aHJlZQorCXNlcGFyYXRlIGZ1bmN0aW9uczogcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5LAorCXByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUsIGFuZCBwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IE1vdmUgY2FsbCBvZgorCWJ1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlIGludG8KKwlwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkocHJvY2Vzc19jb25maWdfcG9zdGluaXQpOiBOZXcgZnVuY3Rpb24sIGRvZXMKKwlhbnkgcHJvY2Vzc2luZyB0aGF0IG5lZWRzIHRvIGhhcHBlbiBsYXRlCisJaW4gaW5pdGlhbGl6YXRpb24gKGFuZCBhbHNvIG9uIHJlbG9hZCkuCisJKGJ1c19jb250ZXh0X25ldyk6IEluc3RlYWQgb2YgY2FsbGluZyBsb2FkX2NvbmZpZywKKwlvcGVuIGNvbmZpZyBwYXJzZXIgaGVyZSBhbmQgY2FsbCBwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkKKwlhbmQgcHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSBkaXJlY3RseS4gIExhdGVyLCBhZnRlcgorCXdlIGhhdmUgZm9ya2VkIGJ1dCBiZWZvcmUgY2hhbmdpbmcgVUlELAorCWludm9rZSBidXNfc2VsaW51eF9mdWxsX2luaXQsIGFuZCB0aGVuIGNhbGwKKwlwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdC4KKwkoYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyk6IEFzIGluIGJ1c19jb250ZXh0X25ldywKKwlsb2FkIHBhcnNlIGZpbGUgaW5zaWRlIGhlcmUsIGFuZCBjYWxsIHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUKKwlhbmQgcHJvY2Vzc19jb25maWdfcG9zdGluaXQuCisKKwkqIGJ1cy9zZXJ2aWNlcy5oLCBidXMvc2VydmljZXMuYworCShidXNfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29udGV4dF90YWJsZSk6IFJlbmFtZQorCWZyb20gYnVzX3JlZ2lzdHJ5X3NldF9zaWRfdGFibGUuICBUYWtlIHN0cmluZyBoYXNoIGZyb20gY29uZmlnCisJcGFyc2VyLCBhbmQgY29udmVydCB0aGVtIGhlcmUgaW50byBTSURzLgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyKTogSGF2ZQorCWNvbmZpZyBwYXJzZXIgb25seSBzdG9yZSBhIG1hcHBpbmcgb2Ygc2VydmljZS0+Y29udGV4dAorCXN0cmluZy4KKwkobWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2gpOiBOZXcgZnVuY3Rpb24uCisJKG1lcmdlX2luY2x1ZGVkKTogTWVyZ2UgY29udGV4dCBzdHJpbmcgaGFzaGVzIGluc3RlYWQKKwlvZiB1c2luZyBidXNfc2VsaW51eF9pZF90YWJsZV91bmlvbi4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogRG9uJ3QgdXNlIGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldzsKKwlzaW1wbHkgY3JlYXRlIGEgbmV3IHN0cmluZyBoYXNoLgorCShidXNfY29uZmlnX3BhcnNlcl91bnJlZik6IFVucmVmIGl0LgorCShzdGFydF9zZWxpbnV4X2NoaWxkKTogU2ltcGx5IGluc2VydCBzdHJpbmdzIGludG8gaGFzaCwKKwlkb24ndCBjYWxsIGJ1c19zZWxpbnV4X2lkX3RhYmxlX2NvcHlfb3Zlci4KKworCSogYnVzL3NlbGludXguaCwgYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfaWRfdGFibGVfdW5pb24pCisJKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2NvcHlfb3Zlcik6IERlbGV0ZS4KKworMjAwNC0xMS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfcHJlX2luaXQpOiBLaWxsIHNvbWUgdW51c2VkCisJdmFyaWFibGVzLgorCQorMjAwNC0xMS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rKTogRml4IHRlc3QgbG9naWMsCisJdGhhbmtzIEpvZXJnIEJhcmZ1cnRoIDxKb2VyZy5CYXJmdXJ0aEBTdW4uQ09NPi4KKworMjAwNC0xMS0wMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfaW5pdCk6IFNwbGl0IGludG8gdHdvIGZ1bmN0aW9ucywKKwlidXNfc2VsaW51eF9wcmVfaW5pdCBhbmQgYnVzX3NlbGludXhfcG9zdF9pbml0LgorCShidXNfc2VsaW51eF9wcmVfaW5pdCk6IEp1c3QgZGV0ZXJtaW5lIHdoZXRoZXIgU0VMaW51eCBpcworCWVuYWJsZWQuCisJKGJ1c19zZWxpbnV4X3Bvc3RfaW5pdCk6IERvIGV2ZXJ5dGhpbmcgZWxzZS4KKworCSogYnVzL21haW4uYyAobWFpbik6IENhbGwgYnVzX3NlbGludXhfcHJlX2luaXQgYmVmb3JlIHBhcnNpbmcKKwljb25maWcgZmlsZSwgYW5kIGJ1c19zZWxpbnV4X3Bvc3RfaW5pdCBhZnRlci4gIFRoaXMgZW5zdXJlcyB0aGF0CisJd2UgZG9uJ3QgbG9zZSB0aGUgcG9saWN5cmVsb2FkIG5vdGlmaWNhdGlvbiB0aHJlYWQgdGhhdAorCWJ1c19zZWxpbnV4X2luaXQgY3JlYXRlZCBiZWZvcmUgZm9ya2luZyBwcmV2aW91c2x5LgorCQorCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rKTogVXBkYXRlIGZvciBzcGxpdC4KKworMjAwNC0xMC0zMSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwlQYXRjaCBmcm9tIEpvaGFuIEZpc2NoZXIgPGxpbnV4QGZpc2NoYXouY29tPgorCQorCSogbW9uby9kb2MvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1sb2NhbCk6IEFkZGVkIGRpcmVjdG9yeQorCWluc3RhbGwgZm9yIERFU1RESVIKKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCAoX2RidXNfYmVjb21lX2RhZW1vbik6IEFsc28gdGFrZQorCXBhcmFtZXRlciBmb3IgZmQgdG8gd3JpdGUgcGlkIHRvLgkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYmVjb21lX2RhZW1vbik6IEltcGxlbWVudCBpdC4KKwkKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogUGFzcyBwcmludF9waWRfZmQKKwl0byBfZGJ1c19iZWNvbWVfZGFlbW9uIChidWcgIzE3MjApCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIEVkIENhdG11ciA8ZWRAY2F0bXVyLmNvLnVrPgorCisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogSGFuZGxlCisJREVTVERJUi4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzLy5jdnNpZ25vcmUsIHF0Ly5jdnNpZ25vcmU6IFVwZGF0ZS4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gS3Jpc3RvZiBWYW5zYW50IDxkZV9sdXB1c0BwYW5kb3JhLmJlPgorCisJKiBjb25maWd1cmUuaW46IERldGVjdCBTbGFja3dhcmUuCisJKiBidXMvTWFrZWZpbGUuYW0gKFNDUklQVF9JTl9GSUxFUyk6IEFkZCByYy5tZXNzYWdlYnVzLmluLgorCSogYnVzL3JjLm1lc3NhZ2VidXMuaW46IE5ldyBmaWxlLgorCisyMDA0LTEwLTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAoZmlsdGVyX2Z1bmMpOiBSZXR1cm4KKwlEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQgaW4gZmlsdGVyIGZ1bmN0aW9uCisJZm9yIG5vdy4gIFNlZToKKwlodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtQXVndXN0LzAwMTQzMy5odG1sCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiAKKwlDb3JyZWN0bHkgcmV0cmlldmUgc2VydmljZSBuYW1lIGZyb20gREJ1c1N0cmluZworCWZvciBwcmludGluZy4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWIuaDogVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gbm90CisJcmVmZXIgdG8gaW50ZXJuYWwgQVBJcy4KKworMjAwNC0xMC0yNyAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChHZXREQnVzVHlwZUNvbnN0cnVjdG9yKToKKwl0eXBlLlVuZGVybHlpbmdTeXN0ZW1UeXBlIHdpbGwgcmV0dXJuICJTeXN0ZW0uQnl0ZSIgaWYgeW91IGRvIGl0CisJb24gImJ5dGVbXSIsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuICBTbyBjaGVjayB0aGUgdHlwZS5Jc0FycmF5CisJcHJvcGVydHkgYW5kIHVzZSBTeXN0ZW0uQXJyYXkgaW5zdGVhZC4KKworMjAwNC0xMC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZmlsbF91c2VyX2luZm8pOiBPbiBlcnJvcnMgZG8gbm90IGZyZWUKKwl0aGUgREJ1c1VzZXJJbmZvIHN0cnVjdHVyZSBzaW5jZSB0aGlzIGlzIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbi4KKwlUaGlzIHdvdWxkIGNhdXNlIGEgZG91YmxlIGZyZWUgd2hlbiB0aGUgZnVuY3Rpb24gdGhhdCBhbGxvY2F0ZWQKKwl0aGUgc3RydWN0dXJlIHdvdWxkIHRyeSB0byBmcmVlIGl0IHdoZW4gYW4gZXJyb3Igb2NjdXJlZC4KKworCSogKGJ1cy9zZXNzaW9uLmNvbmYuaW4sIGJ1cy9NYWtlZmlsZS5hbSwgZGJ1cy9jb25maWd1cmUuaW4pOgorCXVzZSAvdXNyL3NoYXJlL2RidXMtMS9zZXJ2aWNlcyBpbnN0ZWFkIG9mIC91c3IvbGliL2RidXMtMS4wL3NlcnZpY2VzCisJZm9yIHNlcnZpY2UgYWN0aXZhdGlvbiB0byBhdm9pZCAzMmJpdC82NGJpdCBwYXJhbGxlbCBpbnN0YWxsIGlzc3VlcworCisyMDA0LTEwLTIxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBBVVRIT1JTOiBGaXggbXkgZW1haWwgYWRkcmVzcywgdGhlIEBnbnUub3JnIG9uZQorCWhhcyBiZWVuIGJvdW5jaW5nIGZvciBzb21lIHRpbWUuICBBbHNvIGFkZCBKNS4KKwkKKzIwMDQtMTAtMjEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IFJldHVybgorCWF1dGhlbnRpY2F0aW9uIHN0YXR1cyB0byBjYWxsZXJzLgorCSh1bml4X2hhbmRsZV93YXRjaCk6IElmIHdlIGNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiB0aGlzIHJvdW5kLAorCWRvbid0IGRvIGFub3RoZXIgcmVhZC4gIEluc3RlYWQgd2FpdCB1bnRpbCB0aGUgbmV4dCBpdGVyYXRpb24sCisJYWZ0ZXIgd2UndmUgcmVhZCBhbnkgcGVuZGluZyBkYXRhIGluIHRoZSBhdXRoIGJ1ZmZlci4KKwkodW5peF9kb19pdGVyYXRpb24pOiBEaXR0by4KKwkodW5peF9oYW5kbGVfd2F0Y2gpOiBVcGRhdGVkIGZvciBuZXcgZG9fYXV0aGVudGljYXRpb24gcHJvdG90eXBlLgorCisyMDA0LTEwLTE4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9lbmFibGVkKTogSGFuZGxlCisJLS1kaXNhYmxlLXNlbGludXggY2FzZS4KKwkKKzIwMDQtMTAtMTggIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9zZWxpbnV4Lmg6IEFkZCBidXNfc2VsaW51eF9lbmFibGVkLgorCQorCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfZW5hYmxlZCk6IEltcGxlbWVudCBpdC4KKwkKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBpbmNsdWRlKTogQWRkCisJaWZfc2VsaW51eF9lbmFibGVkIG1lbWJlci4KKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKTogUGFyc2UgaWZfc2VsaW51eF9lbmFibGVkCisJYXR0cmlidXRlIGZvciBpbmNsdWRlLgorCShidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogSGFuZGxlIGl0LgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluLCBidXMvc3lzdGVtLmNvbmYuaW46IEFkZAorCWluY2x1c2lvbiBvZiBjb250ZXh0IG1hcHBpbmcgdG8gZGVmYXVsdCBjb25maWcgZmlsZXM7CisJY29uZGl0aW9uYWwgb24gU0VMaW51eCBiZWluZyBlbmFibGVkLgorCQorCSogZG9jL2J1c2NvbmZpZy5kdGQ6IEFkZCB0byBpZl9zZWxpbnV4X2VuYWJsZWQgdG8gZGVmYXVsdCBEVEQuCisJCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYsIAorCXRlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZjoKKwlUZXN0IGZpbGVzIGZvciBiYWQgc3ludGF4LgorCQorMjAwNC0xMC0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZywgY2hlY2tfZ3VhcmRzKQorCShkYnVzX21hbGxvYywgZGJ1c19tYWxsb2MwLCBkYnVzX3JlYWxsb2MpOiBGaXggdXAgcHJpbnRmCisJZm9ybWF0IHNwZWNpZmllciBtaXNtYXRjaGVzLgorCisyMDA0LTEwLTA3ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpOiBmaXggYW4gaW5jb3JyZWN0CisJZm9ybWF0IHN0cmluZy4KKworCSogZ2xpYi9kYnVzLWRidXMtZ21haW4uYyAoZGJ1c19nX2J1c19nZXQpOiBkbyBub3QgbWFuZ2xlIE5VTEwKKwlwb2ludGVyIChidWcgIzE1NDAsIExlb25hcmRvIEJvaWtvKS4KKworMjAwNC0wOS0yOCAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIG1vbm8vQnVzRHJpdmVyLmNzOiBDaGFuZ2VkIEJ1c0RyaXZlciBzdHJ1Y3QgdG8gcmVtb3ZlCisJdGhlIFNlcnZpY2VDcmVhdGVkIGFuZCBTZXJ2aWNlRGVsZXRlZCBldmVudHMgYW5kIHJlcGxhY2UgdGhlbQorCXdpdGggdGhlIG5ldyBTZXJ2aWNlT3duZXJDaGFuZ2VkIGV2ZW50LgorCisJKiBtb25vL2V4YW1wbGUvQnVzTGlzdGVuZXIuY3M6IEFkZGVkIGEgbmV3IGV4YW1wbGUgcHJvZ3JhbSwKKwl3aGljaCBsaXN0ZW5zIGZvciBhbmQgcmVwb3J0cyBhbnkgU2VydmljZU93bmVyQ2hhbmdlZCBldmVudHMKKwlvbiB0aGUgYnVzIGRyaXZlci4KKworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtIChERVNURElSKTogQnVpbGQgY2hhbmdlcyBmb3IgdGhlCisJbmV3IEJ1c0xpc3RlbmVyLmNzIGV4YW1wbGUuCisKKzIwMDQtMDktMjcgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZSk6IHZhbGlkYXRlIHRoZSBjb21wb25lbnRzIG9mCisJbWF0Y2ggcnVsZXMgKGJ1ZyAjMTQzOSkuCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfYWRkX21hdGNoKTogYWRkIGEgbWlzc2luZyBPT00gdGVzdC4KKworMjAwNC0wOS0yNCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkb2N1bWVudCBTZXJ2aWNlT3duZXJDaGFuZ2VkCisJc2lnbmFsLgorCQorCSogYnVzL2RyaXZlci5jLCBidXMvZHJpdmVyLmgsIGJ1cy9zZXJ2aWNlcy5jOiBVc2UKKwlTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbCBpbnN0ZWFkIG9mIFNlcnZpY2VDcmVhdGVkIGFuZAorCVNlcnZpY2VEZWxldGVkLgorCQorCSogYnVzL2Rpc3BhdGNoLmM6IHVwZGF0ZSB0ZXN0Y2FzZSBmb3IgdGhlIG5ldyBzaWduYWwuCisKKzIwMDQtMDktMjAgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJUGF0Y2ggZnJvbSBOYXQgRnJpZWRtYW4gPG5hdEBub3ZlbGwuY29tPgorCisJKiBtb25vL01ha2VmaWxlLmFtOiBBIG51bWJlciBvZiBzbWFsbCBidWlsZCBmaXhlcyB0byBhbGxvdyAibWFrZQorCWRpc3RjaGVjayIgdG8gc3VjY2VlZC4KKworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiAibWFrZSBkaXN0Y2hlY2siIGZpeGVzLgorCisJKiBtb25vL0Fzc2VtYmx5SW5mby5jcy5pbjogV2hlbiBzaWduaW5nIHRoZSBhc3NlbWJseSwgbG9vayBmb3IgdGhlCisJa2V5IGluIEBzcmNkaXJALgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiAibWFrZSBkaXN0Y2hlY2siIGZpeGVzLgorCisyMDA0LTA5LTE3ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfdXNlcl9hdF9jb25zb2xlKTogZml4IG1lbWxlYWsgaW4gT09NLgorCisJKiBkb2MvYnVzY29uZmlnLmR0ZDogdXBkYXRlIHRoZSBEVEQgZm9yIHRoZSBhdF9jb25zb2xlIGF0dHJpYnV0ZS4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6IGNvcnJlY3RseSBoYW5kbGUgSGVsbG8KKwltZXNzYWdlcyBhZnRlciB0aGUgZmlyc3Qgb25lIChidWcgIzEzODkpLgorCQorCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2RvdWJsZV9oZWxsb19tZXNzYWdlKTogYWRkIGEgdGVzdCBjYXNlIGZvcgorCXRoZSBkb3VibGUgaGVsbG8gbWVzc2FnZSBidWcuCisJKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYWN0aXZhdGlvbik6IGZpeCBjaGVjayBvZiBzcGF3bmluZyBlcnJvci4KKwkKKzIwMDQtMDktMTYgIERhdmlkIFpldXRoZW4gIDxkYXZpZEBmdWJhci5kaz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBBZGQgc3VwcG9ydCBmb3IgaW50NjQgYW5kIHVpbnQ2NAorCisyMDA0LTA5LTEyICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwlQYXRjaCBmcm9tIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOgorCSogYnVzL2J1cy5oOgorCSogYnVzL21haW4uYyAodXNhZ2UpCisJKG1haW4pOgorCUFkZCBjb21tYW5kbGluZSBvcHRpb24gLS1ub2ZvcmsgdG8gb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBmaWxlCisJc2V0dGluZy4KKworMjAwNC0wOS0wOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy0qLmg6IHJlbW92ZSB0aGUgOyBhZnRlciBEQlVTXyhCRUdJTnxFTkQpX0RFQ0xTLiBTb21lIEMKKwljb21waWxlcnMgZG9uJ3QgbGlrZSBpdCAoYnVnICM5NzQpLgorCisyMDA0LTA5LTA0ICBIYXJhbGQgRmVybmVuZ2VsICA8aGFycnlAa2RldmVsb3Aub3JnPgorCisJKiBxdC9jb25uZWN0aW9uLio6IEFwcGxpZWQgcGF0Y2ggYnkgSsOpcsO0bWUgTG9kZXd5Y2sKKwk8bG9kZXd5Y2tAY2xpcHBlci5lbnMuZnI+IHRvIGludGVncmF0ZSBhbiBleGlzdGluZworCWNvbm5lY3Rpb24gaW50byB0aGUgUXQgZXZlbnRsb29wCisKKzIwMDQtMDgtMzAgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJKiBtb25vL0J1c0RyaXZlci5jczogQWRkZWQuICBUaGlzIGlzIGEgY2xhc3MgZm9yIGludGVyYWN0aW5nIHdpdGgKKwl0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMgc2VydmljZS4KKworCSogbW9uby9NZXNzYWdlLmNzOiBBZGRlZCBhIG1lY2hhbmlzbSB0byBleHBvc2UgdGhlIG1lc3NhZ2UgdGhhdCBpcworCWN1cnJlbnRseSBiZWluZyBkaXNwYXRjaGVkIHZpYSB0aGUgc3RhdGljIE1lc3NhZ2UuQ3VycmVudAorCXByb3BlcnR5LiAgQWRkZWQgTWVzc2FnZS5TZW5kZXIgYW5kIE1lc3NhZ2UuRGVzdGluYXRpb24KKwlwcm9wZXJ0aWVzLgorCisJKiBtb25vL0hhbmRsZXIuY3M6IEV4cG9zZSB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlIHZpYQorCU1lc3NhZ2UuQ3VycmVudCB3aGVuIGhhbmRsaW5nIG1ldGhvZCBjYWxscy4KKworCSogbW9uby9TZXJ2aWNlLmNzOiBFeHBvc2UgdGhlIGRpc3BhdGNoZWQgbWVzc2FnZSB2aWEKKwlNZXNzYWdlLkN1cnJlbnQgd2hlbiBoYW5kbGluZyBzaWduYWwgZW1pc3Npb25zLgorCQorCSogbW9uby9Db25uZWN0aW9uLmNzOiBCaW5kIGRidXNfYnVzX2dldF9iYXNlX3NlcnZpY2UgdmlhIHRoZQorCUNvbm5lY3Rpb24uQmFzZVNlcnZpY2UgcHJvcGVydHkuCisKKzIwMDQtMDgtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX2lzX2NvbnNvbGVfdXNlcik6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworICAgICAgICBNb3JlIGZpeGVzIGZyb20gU3RldmUgR3J1YmIKKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCk6IGZpeCBmZCBsZWFrCisJKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KTogZml4IGZkIGxlYWsKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKHJlYWRfcGlkLCByZWFkX2ludHMpOiBtb3ZlIHRoZSAiYWdhaW46IiBmb3IKKwlFSU5UUiB0byBhIGJpdCBsb3dlciBpbiB0aGUgY29kZQorCisyMDA0LTA4LTI2ICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6IFJlc3BvbmQgd2l0aAorCVRSVUUgaWYgd2UgYXJlIGlucXVpcmluZyBhYm91dCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBidWlsdC1pbgorCW9yZy5mcmVlZGVza3RvcC5EQnVzIHNlcnZpY2UuCisKKzIwMDQtMDgtMjUgIEpvaG4gUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogYnVzL2NvbmZpZy1wYXJzZXIuYzoKKwkoc3RydWN0IFBvbGljeVR5cGUpOiBBZGQgUE9MSUNZX0NPTlNPTEUKKwkoc3RydWN0IEVsZW1lbnQuZC5wb2xpY3kpOiBzL2dpZF9vcl91aWQvZ2lkX3VpZF9vcl9hdF9jb25zb2xlCisJKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IFNldHMgdXAgY29uc29sZSBlbGVtZW50IHdoZW4KKwk8cG9saWN5IGF0X2NvbnNvbGU9IiI+IGlzIGVuY291bnRlcmVkIGluIGEgcG9saWN5IGZpbGUKKwkoYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50KTogQ29udmVydCBjb25zb2xlIGVsZW1lbnRzIHRvIGNvbnNvbGUKKwlydWxlcy4KKworCSogYnVzL3BvbGljeS5jOiAKKwkoYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSk6IEFkZCBjb25zb2xlIHJ1bGVzIHRvIHRoZSBjbGllbnQKKwlwb2xpY3kgYmFzZWQgb24gaWYgdGhlIGNsaWVudCBpcyBhdCB0aGUgY29uc29sZQorCShidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUpOiBOZXcgZnVuY3Rpb24gZm9yIGFkZGluZyBhCisJY29uc29sZSBydWxlIHRvIGEgcG9saWN5CisJKGJ1c19wb2xpY3lfbWVyZ2UpOiBIYW5kbGUgY29uc29sZSBydWxlIG1lcmdpbmcKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogQWRkZWQgdGhlIERCVVNfQ09OU09MRV9ESVIgY29uc3RhbnQKKwl3aGVyZSB3ZSBjaGVjayBmb3IgY29uc29sZSB1c2VyIGZpbGVzCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCShfZGJ1c19maWxlX2V4aXN0cyk6IE5ldyBmdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgdGhlIGdpdmVuCisJZmlsZSBleGlzdHMKKwkoX2RidXNfdXNlcl9hdF9jb25zb2xlKTogTmV3IGZ1bmN0aW9uIHdoaWNoIGRvZXMgdGhlIHN5c3RlbQorCXNwZWNpZmljIHByb2Nlc3Mgb2YgY2hlY2tpbmcgaWYgdGhlIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jOgorCShfZGJ1c19pc19jb25zb2xlX3VzZXIpOiBOZXcgZnVuY3Rpb24gY29udmVydHMgYSBVSUQgdG8gdXNlciBuYW1lCisJYW5kIHRoZW4gY2FsbHMgdGhlIHN5c3RlbSBzcGVjaWZpYyBfZGJ1c191c2VyX2F0X2NvbnNvbGUgdG8gCisJc2VlIGlmIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlIGFuZCB0aGVyZWZvciBhIGNvbnNvbGUgdXNlcgorCisyMDA0LTA4LTI1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc2V0X2xpbWl0KToKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZjogc2V0IHRoZQorCW1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiBsaW10IGZyb20gdGhlIGNvbmZpZyBmaWxlLiAKKworCSogZG9jL2J1c2NvbmZpZy5kdGQ6IHVwZGF0ZSB0aGUgRFRELgorCisJKiBidXMvZHJpdmVyLmM6IHJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCisKKzIwMDQtMDgtMjQgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaDogUmVtb3ZlZCBkYnVzX2J1c19nZXRfd2l0aF9nX21haW4gc2luY2UgCisJaXQncyBiZWVuIHJlcGxhY2VkIGJ5IGRidXNfZ19idXNfZ2V0CisKKzIwMDQtMDgtMjMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlVcGRhdGVkIFNFTGludXggc3VwcG9ydCBmcm9tIE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKworCSogYnVzL3NlbGludXguaDogUHJvdG90eXBlIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdC4KKworCSogYnVzL3NlbGludXguYzogQ3JlYXRlIGEgdGhyZWFkIGZvciBwb2xpY3kgcmVsb2FkIG5vdGlmaWNhdGlvbi4KKwkoYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290KTogSW1wbGVtZW50LgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdGFydF9idXNjb25maWdfY2hpbGQpCisJKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBTdXBwb3J0IFNFTGludXgtcm9vdCByZWxhdGl2ZQorCWluY2x1c2lvbi4KKworCSogY29uZmlndXJlLmluIDxIQVZFX1NFTElOVVg+OiBBZGQgLWxwdGhyZWFkLgorCQorCSogYnVzL3Rlc3QtbWFpbi5jICh0ZXN0X3ByZV9ob29rLCB0ZXN0X3Bvc3RfaG9vayk6IE5ldy4KKwkodGVzdF9wb3N0X2hvb2spOiBNb3ZlIG1lbW9yeSBjaGVja2luZyBpbnRvIGhlcmUuCisJKHRlc3RfcHJlX2hvb2ssIHRlc3RfcG9zdF9ob29rKTogTW92ZSBTRUxpbnV4IGNoZWNrcyBpbgorCWhlcmUsIGJ1dCBjb25kaXRpb25hbCBvbiBhIERCVVNfVEVTVF9TRUxJTlVYIGVudmlyb25tZW50CisJdmFyaWFibGUuICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHJ1biB0aGUgU0VMaW51eCBjaGVja3MKKwlhcyBhIG5vcm1hbCB1c2VyLCBzaW5jZSB0aGV5IHdvbid0IGhhdmUgYW55IHBlcm1pc3Npb25zCisJZm9yIC9zZWxpbnV4LiAgU28gdGhpcyB3aWxsIGhhdmUgdG8gYmUgdGVzdGVkIG1hbnVhbGx5CisJZm9yIG5vdywgdW50aWwgd2UgaGF2ZSB2aXJ0dWFsaXphdGlvbiBmb3IgbW9zdCBvZgorCWxpYnNlbGludXguCisJCisyMDA0LTA4LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hhbmdlX2lkZW50aXR5KTogYWRkIHNldGdyb3VwcygpIHRvCisJZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3Vwcywgc3VnZ2VzdGVkIGJ5IFN0ZXZlIEdydWJiCisKKzIwMDQtMDgtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IFJlbW92ZSBzb21lIHVudXNlZAorCXZhcmlhYmxlcy4KKwkKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCk6IEF2b2lkIGNvbXBpbGVyCisJd2FybmluZy4KKworMjAwNC0wOC0xNyAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgLS1lbmFibGUtbW9ubyBpcyBwYXNzZWQgaW4sIGlmIHdlIGNhbid0IGZpbmQKKwltb25vIGVycm9yIG91dC4KKworCSogbW9uby9NYWtlZmlsZS5hbTogVXNlIC9nYWN1dGlsIHRvIGluc3RhbGwgYXNzZW1ibGllcyBpbnRvIHRoZQorCUdBQyBhbmQgbm90IC9yb290LgorCisyMDA0LTA4LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlIGZvciAwLjIyCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVsZWFzZSAwLjIyCisKKzIwMDQtMDgtMTEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluLCB1c2FnZSk6IEFkZCAtLXJlcGx5LXRpbWVvdXQKKwlhcmd1bWVudC4KKworMjAwNC0wOC0xMCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5KTogZ2V0IHJpZCBvZiBhbiB1bnVzZWQKKwlEQnVzRXJyb3IgdGhhdCB3YXMgY2F1c2luZyBhIG1lbW95IGxlYWsgKGJ1ZyAjOTg5KS4KKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYywgZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwlmaXggY29tcGlsYXRpb24gb24gU29sYXJpcy9Gb3J0ZSBDIChidWcgIzk3NCkKKworCSogYnVzL21haW4uYyAobWFpbik6IHBsdWcgdHdvIG1pbnVzY3VsZSBtZW1sZWFrcy4KKworMjAwNC0wOC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogYWRkIHNvbWUgbW9yZSBpbmZvIG9uIEdMaWIgYmluZGluZ3MKKworMjAwNC0wOC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIENPUFlJTkc6IHN3aXRjaCB0byBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgaW5zdGVhZCBvZgorCTIuMCwgdG8gcmVzb2x2ZSBjb21wbGFpbnRzIGFib3V0IHBhdGVudCB0ZXJtaW5hdGlvbiBjbGF1c2UuCisKKzIwMDQtMDctMzEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIC0tZW5hYmxlLXB5dGhvbiAKKwljb25maWd1cmUgc3dpdGNoLgorCisyMDA0LTA3LTMxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogZml4IGFuIGludmFsaWQKKwlfdW5yZWYgaW4gdGhlIFNFTGludXggc3VwcG9ydC4KKworCSogZG9jL2J1c2NvbmZpZy5kdGQ6IHVwZGF0ZSBEVEQgZm9yIFNFTGludXggc3VwcG9ydC4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmM6IGZpeCBlcnJvciBoYW5kbGVyIGFuZCBwYXJzZXIKKwlpbml0aWFsaXNhdGlvbi9jbGVhbnVwLiBPT00gdGVzdCBub3cgd29ya3Mgd2l0aCBsaWJ4bWwyIEhFQUQuCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHRoZSB3YXJuaW5nIGFib3V0IGxpYnhtbDIuCisKKwkqIGRidXMvZGJ1cy1idXMuYzogc2lsZW5jZSBkb3h5Z2VuIHdhcm5pbmcuCisKKzIwMDQtMDctMzEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTW92ZSAjZXJyb3IgaW4gU0VMaW51eCBjaGVjayB0byBpdHMgb3duIGxpbmUuCisKKzIwMDQtMDctMzEgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9EQlVTX1NFVF9PT00pOgorCSogYnVzL3V0aWxzLmggKEJVU19TRVRfT09NKTogdXNlIGRidXNfZXJyb3Jfc2V0X2NvbnN0IGluc3RlYWQgb2YKKwlkYnVzX2Vycm9yX3NldC4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlKTogZml4IHRoZSB0ZXN0IGNhc2UsCisJYnJva2VuIGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIF9TRVRfT09NIG1hY3Jvcy4KKworMjAwNC0wNy0zMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlbGludXguYyA8SEFWRV9TRUxJTlVYPjogSW5jbHVkZSB1dGlscy5oIHRvIGdldAorCUJVU19TRVRfT09NLgorCisyMDA0LTA3LTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19UUllfQ09NUElMRSBpbnN0ZWFkIG9mIEFDX0VHUkVQX0hFQURFUgorCXRvIGNvcnJlY3RseSBkZXRlY3QgREJVU19fQUNRVUlSRV9TVkMuICBBbHNvIGFkZCBhbgorCUFDX01TR19DSEVDS0lORy4KKworMjAwNC0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwlTRUxpbnV4IHN1cHBvcnQgZnJvbSBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisKKwkqIGJ1cy9zZWxpbnV4LmMsIGJ1cy9zZWxpbnV4Lmg6IG5ldyBmaWxlIGVuY2Fwc3VsYXRpbmcgc2VsaW51eAorCWZ1bmN0aW9uYWxpdHkKKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtc2VsaW51eAorCQorCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X21lcmdlKTogYWRkIEZJWE1FIHRvIGEgY29tbWVudAorCisJKiBidXMvbWFpbi5jIChtYWluKTogaW5pdGlhbGl6ZSBhbmQgc2h1dCBkb3duIHNlbGludXgKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogc3RvcmUgU0VMaW51eCBJRCBvbiBlYWNoIGNvbm5lY3Rpb24sIHRvIGF2b2lkIAorCXJlcGVhdGVkIGdldHRpbmcgb2YgdGhlIHN0cmluZyBjb250ZXh0IGFuZCBjb252ZXJ0aW5nIGl0IGludG8gCisJYW4gSUQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9nZXRfcG9saWN5KTogbmV3IGFjY2Vzc29yLCB0aG91Z2ggaXQKKwlpc24ndCB1c2VkCisJKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IGNoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5CisJY29udGV4dCBvZiBzZW5kZXIgY29ubmVjdGlvbiBjYW4gc2VuZCB0byB0aGUgc2VjdXJpdHkgY29udGV4dCBvZgorCXJlY2lwaWVudCBjb25uZWN0aW9uCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IGFkZCBwYXJzaW5nIGZvciA8c2VsaW51eD4gYW5kIDxhc3NvY2lhdGU+CisJCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9mZCk6IHRvCisJaW1wbGVtZW50IGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCgpCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCk6IG5ldworCWZ1bmN0aW9uLCB1c2VkIGJ5IHRoZSBzZWxpbnV4IHN0dWZmCisJCisyMDA0LTA3LTI5ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmM6IGNvbXBsZXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorCWxpYnhtbCBiYWNrZW5kIGZvciBjb25maWcgZmlsZSBsb2FkZXIuIERvZXNuJ3Qgd29yayB3aXRoIGZ1bGwgT09NCisJdGVzdCB5ZXQuIAorCQorCSogY29uZmlndXJlLmluOiBjaGFuZ2UgZXJyb3Igd2hlbiBzZWxlY3RpbmcgbGlieG1sIGludG8gYSB3YXJuaW5nLgorCQorCSogdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzOiBhZGQgdHdvIG5vbi13ZWxsLWZvcm1lZCBYTUwKKwlmaWxlcy4gCisJCisJKiBnbGliL01ha2VmaWxlLmFtOiBsaWJkYnVzX2d0b29sIGFsd2F5cyB1c2VzIGV4cGF0LCBub3QgbGlieG1sLgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfaGFuZGxlX3dhdGNoKTogZG8gbm90CisJZGlzY29ubmVjdCBpbiBjYXNlIG9mIERCVVNfV0FUQ0hfSEFOR1VQLCBzZXZlcmFsIGRvX3JlYWRpbmcoKSBtYXkKKwliZSBuZWNlc3NhcnkgdG8gcmVhZCBhbGwgdGhlIGJ1ZmZlci4gKGJ1ZyAjODk0KQorCisJKiBidXMvYWN0aXZhdGlvbi5jIChidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKTogZml4IGEKKwlwb3RlbnRpYWwgYXNzZXJ0aW9uIGZhaWx1cmUgKGJ1ZyAjODk2KS4gU21hbGwgb3B0aW1pemF0aW9uIGluIHRoZQorCWNhc2Ugb2YgYXV0by1hY3RpdmF0aW9uIG1lc3NhZ2VzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jICh2ZXJpZnlfdGVzdF9tZXNzYWdlLCBfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCWFkZCB0ZXN0IGNhc2UgZm9yIGJ5dGUtdGhyb3VnaC12YXJhcmcgYnVnICgjOTAxKS4gcGF0Y2ggYnkgS2ltbW8KKwlIw6Rtw6Rsw6RpbmVuLiAKKworMjAwNC0wNy0yOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwlBZGQgZGJ1cy5pbml0X2d0aHJlYWRzICgpLCBhbGxvdyBlbWl0X3NpZ25hbCB0byBwYXNzCisJYXJndW1lbnRzIHRvIHRoZSBzaWduYWwuCisJCisyMDA0LTA3LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogQVVUSE9SUzogYWRkIHNvbWUgcGVvcGxlLCBub3QgcmVhbGx5IGNvbXByZWhlbnNpdmVseSwgbGV0IG1lCisJa25vdyBpZiBJIG1pc3NlZCB5b3UKKworMjAwNC0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChESVNUX1NVQkRJUlMpOiBhZGQgRElTVF9TVUJESVJTLCBwcm9ibGVtIHNvbHZlZCBieQorCU93ZW4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoRElTVF9TVUJESVJTKTogaGVyZSBhbHNvCisKKzIwMDQtMDctMjIgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChmaWxsX3VzZXJfaW5mbyk6IGZpeCBpbmV4aXN0ZW50IGxhYmVsIG5hbWUsCisJYnJlYWtpbmcgYnVpbGQgb24gU29sYXJpcywgcmVwb3J0ZWQgYnkgRmFyaGFkIFNhYmVyaSBvbiB0aGUgTUwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOiBmaXggdGhlCisJdmFfYXJnIGludm9jYXRpb24gdG8gYWNjb3VudCBmb3IgaW50ZWdlciBwcm9tb3Rpb24gaW4gdGhlIGNhc2Ugb2YKKwlEQlVTX1RZUEVfQllURSAodW5zaWduZWQgY2hhciBpcyBwcm9tb3RlZCB0byBpbnQpLiAoYnVnICM5MDEpCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZV9yZW1vdmVfb3duZXIpOiBmaXggYnVnICM5MDIsIHVzZQorCV9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmssIG5vdCBfZGJ1c19saXN0X2dldF9maXJzdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyk6IHBsdWcgYSBtZW1vcnkgbGVhay4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKGZyZWVfc3VidHJlZV9yZWN1cnNlKTogYWx3YXlzIG51bGwKKwloYW5kbGVyIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBhc3NlcnRzIGluIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmCisJZG8gbm90IGZhaWwuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19yZWFkaW5nKToKKwlfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgcmV0dXJuIHZhbHVlIGlzIG9mIHR5cGUKKwlkYnVzX2Jvb2xfdCwgbm90IERCdXNEaXNwYXRjaFN0YXR1cy4KKwkKKzIwMDQtMDctMTkgIERhdmlkIFpldXRoZW4gIDxkYXZpZEBmdWJhci5kaz4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IEFkZCBEQlVTX0VSUk9SX1VOSVhfUFJPQ0VTU19JRF9VTktOT1dOCisKKwkqIGJ1cy9kaXNwYXRjaC5jOgorCShjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIpOiBEZWJ1ZyBzYXlzIEdldFByb3BlcnR5OyBidXQgdGhlCisJbWV0aG9kIGlzIGNhbGxlZCBHZXRDb25uZWN0aW9uVW5peFVzZXIKKwkoY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uCisJKGJ1c19kaXNwYXRjaF90ZXN0KTogQWN0dWFsbHkgY2FsbCBjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIoKTsKKwlhbHNvIGNhbGwgY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKCkKKwkKKwkqIGJ1cy9kcml2ZXIuYzoKKwkoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uLAorCWhhbmRsZXMgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgb24gdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzCisJaW50ZXJmYWNlCisJCisJKiBkYnVzL2RidXMtYXV0aC5jOgorCShoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCk6IFNldCBwaWQgZnJvbSB0aGUgY3JlZGVudGlhbHMKKwlvYnRhaW5lZCBmcm9tIHRoZSBzb2NrZXQKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKTogTmV3IGZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiAKKwlBZGQgcHJvdG90eXBlIGZvciBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZAorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOgorCShfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCk6IE5ldyBmdW5jdGlvbgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5oOgorCUFkZCBwcm90b3R5cGUgZm9yIF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9wcm9jZXNzX2lkCisJCisyMDA0LTA3LTE5ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogTWVzc2FnZSBjb3VudGVyIGZpeCwgcGF0Y2ggYnkgQ2hyaXN0aWFuCisJSGFtbW9uZCA8Y2hpcHg4NkBnbnVwZGF0ZS5vcmc+CisKKzIwMDQtMDctMTggIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LWNsaWVudC5weToKKworCUFkZCBkYnVzLkJ5dGVBcnJheSBhbmQgZGJ1c19iaW5kaW5ncy5CeXRlQXJyYXkKKwl0eXBlcyBzbyB0aGF0IGJ5dGUgc3RyZWFtcyBjYW4gYmUgcGFzc2VkIGJhY2suCisKKwlHaXZlIGpkYWhsaW4gdGhlIGhlYXBzIG9mIGNyZWRpdCB0aGF0IGFyZSBzbworCXJpZ2h0ZnVsbHkgaGlzLgorCQorMjAwNC0wNy0xMiAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQWRkIG1lc3NhZ2UgYXJndW1lbnQgdG8gdGhlIGRlZmF1bHQgb2JqZWN0X21ldGhvZF9oYW5kbGVyCisJZnVuY3Rpb24uCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlBdXRvbWF0aWNhbGx5IHJldHVybiBOSUwgd2hlbiBwYXNzZWQgYW4gZW1wdHkgbGlzdAorCSh3ZSBjYW4ndCBwYXNzIGJhY2sgYSBsaXN0IHNpbmNlIGxpc3RzIGFyZSB0eXBlZAorCWFuZCB3ZSBkb24ndCBoYXZlIGFueSBpZGVhIHdoYXQgdHlwZSB0aGUgdGhlIGNsaWVudAorCWludGVuZGVkIHRoZSBsaXN0IHRvIGJlLi4uIDotKCApCisJCisyMDA0LTA3LTEwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCisJRml4IGRpc3RjaGVjayBicmVha2FnZSBjYXVzZWQgYnkgbmV3IGV4YW1wbGVzLgorCisyMDA0LTA3LTEwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisKKwlBZGQgIm1lc3NhZ2UiIGFyZ3VtZW50IHRvIHNlcnZpY2Utc2lkZSBkYnVzLk9iamVjdAorCW1ldGhvZHMuIFRoaXMgd2lsbCBicmVhayBleGlzdGluZyBzZXJ2aWNlcyB3cml0dGVuCisJdXNpbmcgdGhlIHB5dGhvbiBiaW5kaW5ncywgYnV0IHdpbGwgYWxsb3cgZXh0cmFjdGlvbgorCW9mIGFsbCB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbiAoZS5nLiB3aG8gaXRzIGZyb20pLgorCisJQWRkIGltcHJvdmVkICJvYmplY3Qgb3JpZW50ZWQiIHNpZ25hbCBoYW5kbGluZy9lbWlzc2lvbi4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6CisKKwlOaXggdGhpcyBleGFtcGxlLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtcmVjaXBpZW50LnB5OgorCisJVHdvIG5ldyBleGFtcGxlcyB0aGF0IHNob3cgaG93IHRvIGVtaXQgYW5kIHJlY2VpdmUKKwlzaWduYWxzIHVzaW5nIHRoZSBuZXcgQVBJcy4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbHMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZS5weToKKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlMi5weToKKworCUFkZCAibWVzc2FnZSIgYXJndW1lbnQgdG8gc2VydmljZSBtZXRob2RzLgorCisyMDA0LTA2LTI4ICBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyKQorCSogZGJ1cy9idXMuYyAoZGJ1c19idXNfZ2V0X3VuaXhfdXNlcikKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBpbXBsZW1lbnQgR2V0Q29ubmVjdGlvblVuaXhVc2VyCisJbWV0aG9kIG9mIG9yZy5mcmVlZGVza3RvcC5EQnVzIGludGVyZmFjZS4KKworCSogYnVzL2Rpc3BhdGNoLmM6IHRlc3QgY2FzZQorCisyMDA0LTA2LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06IHN3aXRjaGVkIGluY2x1ZGUgZGlyZWN0b3J5IGZyb20gZ2xpYi8gdG8gZGJ1cy8KKwlzaW5jZSBkYnVzLWdsaWIuaCBtb3ZlZAorIAorMjAwNC0wNi0yMiAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5pbjogcHJldmVudCBidWlsZGluZyB0aGUgZ2NqIHN0dWZmIGFuZCBsaWJ4bWwgbG9hZGVyCisJc2luY2UgdGhleSBhcmUgYnJva2VuLgorCisyMDA0LTA2LTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIGRidXMvZGJ1cy1nbGliLWVycm9yLWVudW0uaDogYXV0b2dlbmVyYXRlIHRoZSBHRXJyb3IgZW51bSAKKwljb2RlcyBmcm9tIHRoZSBkYnVzIGVycm9yIG5hbWVzCisJCisgICAgICAgICogZ2xpYi9kYnVzLWdsaWIuaDogbW92ZSB0byBzdWJkaXIgZGJ1cy8gc2luY2UgaXQncyBpbmNsdWRlZCAKKwlhcyBkYnVzL2RidXMtZ2xpYi5oIGFuZCB0aGF0IGJyZWFrYWdlIGlzIG5vdyB2aXNpYmxlIGR1ZSB0byAKKwlpbmNsdWRpbmcgZGJ1cy9kYnVzLWdsaWIuaCBpbiBkYnVzLWdsaWItbG93bGV2ZWwuaAorCQorCSogZ2xpYi9kYnVzLWdsaWIuaDogcy9ncHJveHkvZ19wcm94eS8KKworCSogZGJ1cy9kYnVzLXNoYXJlZC5oOiBuZXcgaGVhZGVyIHRvIGhvbGQgc3R1ZmYgc2hhcmVkIHdpdGgKKwliaW5kaW5nIEFQSXMKKwkKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0VSUk9SXyopOiBtb3ZlIGVycm9ycyBoZXJlIHJhdGhlcgorCXRoYW4gZGJ1cy1lcnJvcnMuaAorCisJKiBnbGliL2RidXMtZ2xpYi5oIChkYnVzX3NldF9nX2Vycm9yKTogbW92ZSB0bworCWRidXMtZ2xpYi1sb3dsZXZlbC5oCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6IHJlbW92ZSBkYnVzL2RidXMuaCBmcm9tIGhlcmU7IGNoYW5nZSBhIGJ1bmNoCisJb2Ygc3R1ZmYgdG8gZW5hYmxlIHRoaXMKKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaDogcHV0IGRidXMvZGJ1cy5oIGhlcmUKKworCSogYSBidW5jaCBvZiBvdGhlciBjaGFuZ2VzIHdpdGggdGhlIHNhbWUgYmFzaWMgInNlcGFyYXRlIGdsaWIgCisJYmluZGluZ3MgZnJvbSBkYnVzLmgiIHRoZW1lCisJCisyMDA0LTA2LTEwICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZGJ1cy1zaGFycC5wYy5pbjogUmVtb3ZlZCBnbGliLXNoYXJwIGluY2x1c2lvbiBpbiBMaWJzLgorCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW06IEZpeGVkIHR5cG8gaW4gRVhUUkFfRElTVC4KKworMjAwNC0wNi0wOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9kcml2ZXIuYywgZGJ1cy9kYnVzLWJ1cy5jOiB1c2UgQk9PTEVBTiBpbnN0ZWFkIG9mIFVJTlQzMiBmb3IKKwl0aGUgcmVwbHkgdmFsdWUgb2YgdGhlIFNlcnZpY2VFeGlzdHMgbWVzc2FnZS4KKworMjAwNC0wNi0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBObyBsb25nZXIgbmVlZCB0byBwYXJzZSBwYXRoCisJZWxlbWVudHMgYW5kIHBhc3MgdGhlbSBhcyBhcnJheXMgb2Ygc3RyaW5ncy4gIFRoZSBDIEFQSSBub3cKKwlhY2NlcHRzIHBsYWluIHBhdGggc3RyaW5ncy4KKwkoX2J1aWxkX3BhcnNlZF9wYXRoKTogcmVtb3ZlZCAKKworMjAwNC0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiByZW1vdmUgYXV0by1hY3RpdmF0aW9uIGl0ZW0gc2luY2UgaXQncyBkb25lOyBzb3J0CisJaXRlbXMgYnkgaW1wb3J0YW5jZS9taWxlc3RvbmUKKworMjAwNC0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYyAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOiBhcHBlbmQKKwlyYW5kb20gc2lnbmF0dXJlIHdoZW4gdXNpbmcgUkVRVUlSRURfRklFTERTICh0aGlzIGhhY2sgd29uJ3Qgd29yaworCWluIHRoZSBsb25nIHRlcm0pCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGNoYW5nZSB0aGUgc2lnbmF0dXJlIHRvIGJlIGEgaGVhZGVyIGZpZWxkLAorCWluc3RlYWQgb2YgbWVzc2FnZS0+c2lnbmF0dXJlIHNwZWNpYWwtY2FzZSBzdHJpbmcuIEluY3JlbWVudGFsCisJc3RlcCBmb3J3YXJkLiBUaGVuIHdlIGNhbiBmaXggdXAgY29kZSB0byBzZW5kIHRoZSBzaWduYXR1cmUgaW4gdGhlCisJbWVzc2FnZSwgdGhlbiBmaXggdXAgY29kZSB0byB2YWxpZGF0ZSBzYWlkIHNpZ25hdHVyZSwgdGhlbiBmaXggdXAKKwljb2RlIHRvIG5vdCBwdXQgdGhlIHR5cGVjb2RlcyBpbmxpbmUsIGV0Yy4KKwkobG9hZF9vbmVfbWVzc2FnZSk6IGRvbid0IG1ha2UgdXAgdGhlIHNpZ25hdHVyZSBhZnRlciB0aGUgZmFjdAorCShkZWNvZGVfaGVhZGVyX2RhdGEpOiByZXF1aXJlIHNpZ25hdHVyZSBmaWVsZCBmb3IgdGhlIGtub3duCisJbWVzc2FnZSB0eXBlcworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3N0cmluZ19sZW4pOiBuZXcKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUKKworMjAwNC0wNi0wNyAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vREJ1c1R5cGUvT2JqZWN0UGF0aC5jczogUmVuYW1lZCBQYXRoTmFtZSBhcmd1bWVudCB0byBQYXRoCisKKwkqIG1vbm8vSGFuZGxlci5jczogVXBkYXRlZCB0byBmb2xsb3cgbmV3IHBhdGggYXJndW1lbnQgZm9yCisJKHVuLSlyZWdpc3RlcmluZyBvYmplY3RzLgorCisJKiBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06CisJKiBtb25vL01ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmluOiBCdW1wZWQgcmVxdWlyZWQgdmVyc2lvbiBmb3IgbW9ubyBhbmQgdXNlIG5ldyAtcGtnCisJc3ludGF4IGZvciBkZXBzCisKKzIwMDQtMDYtMDUgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oLCBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBoYXZlIG9iamVjdCBwYXRoCisJcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyB0YWtlIHRoZSBwYXRoIGFyZ3VtZW50IGFzIGNoYXIqIGluc3RlYWQgb2YKKwljaGFyKiouCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmgsIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlY29tcG9zZV9wYXRoKToKKwlzcGxpdCBvZmYgdGhlIHBhdGggZGVjb21wb3N0aW9uIHBhcnQgb2YKKwlfZGJ1c19kZW1hcnNoYWxfb2JqZWN0X3BhdGguIFNvbWUgbWlzYy4gZml4ZXMgdG8gc2lsZW5jZSBjb21waWxlcgorCXdhcm5pbmdzLiAKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYywgdGVzdC90ZXN0LXNlcnZpY2UuYzogdXBkYXRlIGFjY29yZGluZ2x5LgorCQorMjAwNC0wNi0wMiAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisgCisJKiBkYnVzL2RidXMtYXV0aC5jOiBSZXdyaXRlIGF1dGggcHJvdG9jb2wgaGFuZGxpbmcgdG8gdXNlIGEgc3RhdGUKKwltYWNoaW5lIGFwcHJvYWNoLiAgQSBzdGF0ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bmN0aW9uIHRoYXQKKwloYW5kbGVzIGluY29taW5nIGV2ZW50cyBhcyBzcGVjaWZpZWQgZm9yIHRoYXQgc3RhdGUuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogVXBkYXRlIGF1dGggcHJvdG9jb2wgc3RhdGUgbWFjaGluZQorCXNwZWNpZmljYXRpb24gdG8gbWF0Y2ggaW1wbGVtZW50YXRpb24uICBSZW1vdmUgc29tZSBsZWZ0b3ZlcgorCWJhc2U2NCBleGFtcGxlcy4KKworMjAwNC0wNi0wMiAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYywgZ2xpYi9kYnVzLWdtYWluLmMsIGRidXMvZGJ1cy1zdHJpbmcuYywKKwlkYnVzL2RidXMtb2JqZWN0LXRyZWUuYywgZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYWRkIGNvbW1lbnRzIHRvCisJcXVpZXQgZG94eWdlbi4KKworCSogRG94eWZpbGUuaW46IHJlbW92ZSBkZXByZWNhdGVkIG9wdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5oLAorCWdsaWIvdGVzdC10aHJlYWQuaCwgZ2xpYi90ZXN0LXRocmVhZC1jbGllbnQuYywKKwlnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jLCBnbGliL3Rlc3QtcHJvZmlsZS5jLAorCWdsaWIvdGVzdC1kYnVzLWdsaWIuYzogcmVtb3ZlIHRoZXNlIHVudXNlZCBmaWxlcy4KKworMjAwNC0wNi0wMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2Rpc3BhdGNoX2FuZF91bmxvY2spOiBmaXggZGlzcGF0Y2ggZm9yCisJbm9uLWZhbGxiYWNrIGhhbmRsZXJzIChidWcgIzY4NCkuCisJKF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyk6IGluaXRpYWxpemUgaW52b2tlX2FzX2ZhbGxiYWNrIGZpZWxkLgorCShmaW5kX3N1YnRyZWVfcmVjdXJzZSk6IHJlcG9ydCB3ZXRoZXIgdGhlIHJldHVybmVkIHN1YnRyZWUgaXMgYW4KKwlleGFjdCBtYXRjaCBvciBhICJmYWxsYmFjayIgbWF0Y2ggaGlnaGVyIHVwIGluIHRoZSB0cmVlLgorCShvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbik6IHVwZGF0ZSB0ZXN0IGNhc2UuCisKKzIwMDQtMDYtMDEgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisJKiBweXRob24vdGVzdHMvdGVzdC1jbGllbnQucHk6CisKKwlSb3VuZCBvZmYgYmFzaWMgdHlwZSBzdXBwb3J0LiBBZGQgZGljdHMgKHlheSEpLCBhbmQgCisJcmVtYWluaW5nIGFycmF5IHR5cGVzLgorCisJTWFrZSBNZXNzYWdlSXRlciBtb3JlIGdlbmVyYWwgc28gaXQgd29ya3MgZm9yIGRpY3RzIHRvby4KKworCU1hcmsgYWxsIGxvb3AgdmFyaWFibGVzIGFzIEMgaW50ZWdlcnMuCisJCisyMDA0LTA1LTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAobWV0aG9kX2luZm9fYWRkX2FyZyk6IGtlZXAgYXJncyBzb3J0ZWQgd2l0aAorCSJpbiIgYmVmb3JlICJvdXQiCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGRidXNfdHlwZV90b19zdHJpbmcpOiBtb3ZlIHRvIGRidXMtZ3V0aWxzLmMKKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jIChtYWluKTogc2V0IHVwIHRvIGhhdmUgYSAtLXNlbGYtdGVzdAorCW9wdGlvbiB0aGF0IHJ1bnMgdGhlIHRlc3RzLCBhbmQgc3RhcnQgZmlsbGluZyBpbiBzb21lIGNvZGUKKwlpbmNsdWRpbmcgZm9yIHN0YXJ0ZXJzIGp1c3QgZHVtcGluZyB0aGUgaW50ZXJmYWNlcyB0byBzdGRvdXQKKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBkZWZpbmUgREJVU19MT0NBTEVESVIKKworCSogdGVzdC9kYXRhL3ZhbGlkLWludHJvc3BlY3Rpb24tZmlsZXMvbG90cy1vZi10eXBlcy54bWw6IHRlc3Qgb2YKKwlhbiBleGFtcGxlIGludHJvc3BlY3Rpb24gZmlsZQorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZXJfY2hlY2tfZG9jdHlwZSk6IGRvY3R5cGUgc2hvdWxkIGJlCisJIm5vZGUiIChJIHRoaW5rLi4uKQorCisyMDA0LTA1LTMxICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCisJVGVzdCBTdWl0ZTogMQorCVB5dGhvbiBCaW5kaW5nczogMAorCisJRml4IHN0cmluZyBhcnJheSBtZW1vcnkgdHJhc2hpbmcgYnVnLi4uIG9vcHMuLi4KKworMjAwNC0wNS0zMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQWRkIGEgbmljZXItYnV0LWxlc3MtZmxleGlibGUgYWx0ZXJuYXRlIEFQSSBmb3IgaGFuZGxpbmcgCisJY2FsbHMgdG8gdmlydHVhbCBvYmplY3RzIGluIGRidXMuT2JqZWN0VHJlZS4KKworCVNjcmV3IHVwIHRoZSBhcmd1bWVudCBvcmRlciB0byB0aGUgZGJ1cy5PYmplY3QgY29uc3RydWN0b3IKKwlmb3IgY29uc2lzdGVuY3kgd2l0aCBkYnVzLk9iamVjdFRyZWUgKGFuZCB0byBtYWtlIGRidXNfbWV0aG9kcworCW9wdGlvbmFsIGZvciBmdXR1cmUgZXh0ZW5zaW9uKQorCQorCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZTIucHk6CisKKwlBbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgZ2NvbmYtcHJveHktc2VydmljZSB1c2luZyB0aGUKKwluaWNlciBkYnVzLk9iamVjdFRyZWUgQVBJLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LXNlcnZlci5weQorCisJUmV2ZXJzZSB0aGUgYXJndW1lbnQgb3JkZXIgdG8gZGVhbCB3aXRoIGRidXMuT2JqZWN0IGNvbnN0cnVjdG9yCisJY2hhbmdlcy4KKwkKKzIwMDQtMDUtMzAgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJVGFrZSBpdCBiYWNrLiBMaXN0cyBzZWVtIHRvIHdvcmsgYnV0IHRoZXkncmUgYnJva2VuCisJaW4gdGhlIHRlc3Qgc3VpdGUuIE1ha2UgdGhlIGJhc2UgZXhhbXBsZXMgdXNlCisJbGlzdHMgKHdvcmtzIGZpbmUpLgorCisyMDA0LTA1LTMwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCisJQWRkIHNvbWUgbW9yZSB0ZXN0cyBhbmQgZml4IGVycm9ycyB0aGF0IGNyb3AgdXAuCisJVW5mb3J0dW5hdGVseSwgY3VycmVudGx5IGl0IHNlZW1zIGxpa2UgbWFyc2hhbGxpbmcKKwlhbmQgdW5tYXJzaGFsbGluZyBvZiBsaXN0cyBpcyBjb21wbGV0ZWx5IGJyb2tlbiA6LSgKKworMjAwNC0wNS0zMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKworCUFkZCBzdXBwb3J0IGZvciBPYmplY3RQYXRoIHR5cGUuCisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJUmVmYWN0b3IgbWVzc2FnZSBoYW5kbGluZyBjb2RlIHRvIGEgY29tbW9uIGZ1bmN0aW9uLgorCQorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCSogcHl0aG9uL3Rlc3RzL3Rlc3Qtc2VydmVyLnB5OgorCisJQWRkIHRlc3RzIHRoYXQgY2hlY2sgdG8gbWFrZSBzdXJlIHZhbHVlcyBvZiBhbGwgdHlwZXMKKwljYW4gYmUgZWNob2VkIGZyb20gYSBzZXJ2aWNlIHcvbyBtYW5nbGluZy4KKwkKKzIwMDQtMDUtMjkgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKworCUFkZCBPYmplY3RUcmVlIGNsYXNzIHdoaWNoIGFsbG93cyBpbXBsZW1lbnRhdGlvbgorCW9mIHRyZWVzIG9mICJ2aXJ0dWFsIiBvYmplY3RzLiBCYXNpY2FsbHkgdGhlIHB5dGhvbgorCXdyYXBwZXIgZm9yICJyZWdpc3Rlcl9mYWxsYmFjayIuCisJCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW0KKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZS5weToKKworCUltcGxlbWVudCBhIHNpbXBsZSBHQ29uZiBwcm94eSBzZXJ2aWNlIHRoYXQgc3VwcG9ydHMKKwlnZXQvc2V0IG9uIHN0cmluZyBhbmQgaW50IEdDb25mIGtleXMgdXNpbmcgdGhlIE9iamVjdFRyZWUuCisJCisyMDA0LTA1LTI5ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2xpc3Qtc3lzdGVtLXNlcnZpY2VzLnB5OgorCisJQWRkIFNlc3Npb25CdXMsIFN5c3RlbUJ1cyBhbmQgQWN0aXZhdGlvbkJ1cyBjbGFzc2VzCisJc28geW91IGRvbid0IG5lZWQgdG8ga25vdyB0aGUgc3BlY2lhbCBsaXR0bGUgQlVTX1RZUEUKKwlmbGFnLgorCQorMjAwNC0wNS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpOiB0ZW1wb3JhcmlseQorCXN0b3AgdGVzdGluZyBjb25maWcgcGFyc2VyIE9PTSBoYW5kbGluZywgc2luY2UgZXhwYXQgaGFzIGlzc3VlcworCWh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogY2hhbmdlIHJlcXVlc3RlZF9yZXBseSB0bworCXNlbmRfcmVxdWVzdGVkX3JlcGx5L3JlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHNvIHdlIGNhbiBzZW5kIHRoZQorCXJlcGxpZXMsIG5vdCBqdXN0IHJlY2VpdmUgdGhlbS4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogcGFyc2UgdGhlIG5ldworCXNlbmRfcmVxdWVzdGVkX3JlcGx5L3JlY2VpdmVfcmVxdWVzdGVkX3JlcGx5CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQpOiBhZGQKKwlyZXF1ZXN0ZWRfcmVwbHkgYXJndW1lbnQgYW5kIHVzZSBpdAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHBhc3MgdGhyb3VnaAorCXJlcXVlc3RlZF9yZXBseSBzdGF0dXMgdG8gbWVzc2FnZSBzZW5kIGNoZWNrCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWRhcHQgdG8gcmVxdWVzdGVkX3JlcGx5IGNoYW5nZQorCQorMjAwNC0wNS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jIChtYWluKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisJKiBnbGliL2RidXMtZ2lkbC5jIChiYXNlX2luZm9fcmVmKTogZml4IGEgc2lsbHkgY29tcGlsZXIgd2FybmluZworCisJKiBkYnVzL2RidXMtYXV0aC5oIChlbnVtKTogcmVtb3ZlIEFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMKKwlmcm9tIHRoZSBlbnVtLCBubyBsb25nZXIgaW4gdXNlLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBpbmNsdWRlIGNvbmZpZy5oIHNvIERCVVNfVkFfQ09QWSBhY3R1YWxseQorCXdvcmtzIHJpZ2h0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBhZGQgdmFyaW91cyBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgZm9yCisJd2hldGhlciBlcnJvcl9uYW1lIHBhc3NlZCBpbiBpcyBhIHZhbGlkIGVycm9yIG5hbWUuCisKKzIwMDQtMDUtMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfYXJncyk6IEFkZGVkIHN1cHBvcnQgZm9yCisJT0JKRUNUX1BBVEggYW5kIE9CSkVDVF9QQVRIX0FSUkFZCisKKzIwMDQtMDUtMjggIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZXhhbXBsZXMvTWFrZWZpbGUuYW06CisKKwlGb3JnZXQgdG8gYWRkIE1ha2VmaWxlLmFtLiBEbyBub3QgcGFzcyBnby4KKworMjAwNC0wNS0yOCAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkYnVzX2d2YWx1ZV9tYXJzaGFsLCBkYnVzX2d2YWx1ZV9kZW1hcnNoYWwpOiAKKwlmaXggbm8gaW50NjQgY2FzZS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfcGFyc2VfYmFzaWNfdHlwZSk6IGltcGwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWNfdHlwZSksCisJKF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWNfdHlwZV9hcnJheSk6IGltcGwuCisJZHJhc3RpY2FsbHkgc2ltcGxpZnkgfmFsbCByZWxldmFudCBfZ2V0IG1ldGhvZHMgdG8gdXNlIHRoZXNlLgorCShfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKTogaW1wbAorCWRyYXN0aWNhbGx5IHNpbXBsaWZ5IH5hbGwgcmVsZXZhbnQgX2FwcGVuZCBtZXRob2RzIHRvIHVzZSB0aGVzZS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChwYXJzZV9iYXNpY190eXBlKSAKKwkocGFyc2VfYmFzaWNfYXJyYXksIGxvb2t1cF9iYXNpY190eXBlKTogaW1wbC4KKwkoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOiBwcnVuZSBzY2FkcyBvZiBkdXBsaWNhdGUgLworCWN1dCAmIHBhc3RlIGNvZGluZy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfZGVtYXJzaGFsX2Jhc2ljX3R5cGVfYXJyYXkpIAorCShfZGJ1c19kZW1hcnNoYWxfYmFzaWNfdHlwZSk6IGltcGxlbWVudCwKKwkoZGVtYXJzaGFsX2FuZF92YWxpZGF0ZV9sZW4vYXJnKTogYmVlZiB1cCBkZWJ1Zy4KKwkoX2RidXNfbWFyc2hhbF9iYXNpY190eXBlLCBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGVfYXJyYXkpOiBpbXBsLgorCisyMDA0LTA1LTI3ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmluOgorCSogcHl0aG9uL01ha2VmaWxlLmFtOgorCisJSW5jbHVkZSB0aGUgZXhhbXBsZSBweXRob24gYXBwcyBpbiB0aGUgdGFyYmFsbC4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9saXN0LXN5c3RlbS1zZXJ2aWNlcy5weQorCisJQWRkIGEgcHl0aG9uIG5ldyBleGFtcGxlIHRoYXQgZmV0Y2hlcyB0aGUgbGlzdCBvZiBzZXJ2aWNlcworCWZyb20gdGhlIHN5c3RlbSBidXMuCisJCisyMDA0LTA1LTI3ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlGaXggZmFpbHVyZSB0byBub3RpZnkgdGhhdCBhIHNpZ25hbCB3YXMgbm90IGhhbmRsZWQsCisJcmVzdWx0ZWQgaW4gaHVuZyBmdW5jdGlvbnMuCisJCisyMDA0LTA1LTI1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAobWFpbik6IE1vbml0b3IgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLgorCisyMDA0LTA1LTIzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9IYW5kbGVyLmNzLCBtb25vL1NlcnZpY2UuY3M6IEFkZGVkIFVucmVnaXN0ZXJPYmplY3QgbWV0aG9kCisJd2hpY2ggdW5yZWdpc3RlcnMgdGhlIG9iamVjdCBwYXRoIGFuZCBkaXNwb3NlcyB0aGUgaGFuZGxlci4KKworMjAwNC0wNS0yMyAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisgCisgICAgICAgIFBhdGNoIGZyb20gVGltbyBUZXLDpHMgPGV4dC10aW1vLnRlcmFzQG5va2lhLmNvbT4gKCM2MTQpOgorICAgICAgICAgCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBTd2FwCisgICAgICAgIG9wZXJhbmRzIHRvICYmIHNvIHdlIGNhbGwgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoKSBmb3IgdGhlIGxhc3QKKyAgICAgICAgYXJndW1lbnQgYWxzby4KKworMjAwNC0wNS0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2ssIGxvb2t1cF9zdWJ0cmVlKTogcmV0dXJuCisJY2hpbGRyZW4gZXZlbiBpZiB0aGUgcmVxdWVzdGVkIHBhdGggaXNuJ3QgcmVnaXN0ZXJlZC4KKwkob2JqZWN0X3RyZWVfdGVzdF9pdGVyYXRpb24pOiB0ZXN0IG9iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZC4KKworCSogY29uZmlndXJlLmluOiB1bmRlZmluZSBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgaW5zdGVhZCBvZiBkZWZpbmluZworCWl0IHRvIDAuCisJCisyMDA0LTA1LTIwICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IFJlbW92ZSByZXNvbHZlZCBpdGVtcy4KKworCSogYnVzL2V4cGlyZWxpc3QuaCAoc3RydWN0IEJ1c0V4cGlyZUxpc3QpOiByZW1vdmUgdW51c2VkIG5faXRlbXMKKwlmaWVsZC4KKwkKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkpOiBFbmZvcmNlIHRoZQorCXBlci1jb25uZWN0aW9uIGxpbWl0IG9uIHBlbmRpbmcgcmVwbGllcy4KKwkKKwlQYXRjaCBmcm9tIEpvbiBUcm93YnJpZGdlIDx0cm93QHhpbWlhbi5jb20+OgorIAorIAkqIGJ1cy9tYWluLmMgKHNldHVwX3JlbG9hZF9waXBlKTogQWRkZWQuICBDcmVhdGVzIGEgcGlwZSBhbmQgc2V0cworIAl1cCBhIHdhdGNoIHRoYXQgdHJpZ2dlcnMgYSBjb25maWcgcmVsb2FkIHdoZW4gb25lIGVuZCBvZiB0aGUgcGlwZQorIAliZWNvbWVzIHJlYWRhYmxlLgorIAkoc2lnbmFsX2hhbmRsZXIpOiBJbnN0ZWFkIG9mIGRvaW5nIHRoZSBjb25maWcgcmVsb2FkIGluIG91ciBTSUdIVVAKKyAJaGFuZGxlciwganVzdCB3cml0ZSB0byB0aGUgcmVsb2FkIHBpcGUgYW5kIGxldCB0aGUgYXNzb2NpYXRlZAorIAl3YXRjaCBoYW5kbGUgdGhlIHJlbG9hZCB3aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgbWFpbiBsb29wLgorIAorIAkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfcmVsb2FkX2NvbmZpZyk6IEFkZGVkLgorIAlJbXBsZW1lbnRzIGEgUmVsb2FkQ29uZmlnIG1ldGhvZCBmb3IgcmVxdWVzdGluZyBhIGNvbmZpZ3VyYXRpb24KKyAJZmlsZSByZWxvYWQgdmlhIHRoZSBidXMgZHJpdmVyLgorIAorMjAwNC0wNS0xOSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIEhBQ0tJTkc6IFVwZGF0ZWQgcmVsZWFzZSBpbnN0cnVjdGlvbnMgY29uY2VybmluZyB0aGUgd2lraSBwYWdlLgorCisyMDA0LTA1LTE4ICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworIAkqIGRidXMvZGJ1cy1hdXRoLmMgKGNsaWVudF90cnlfbmV4dF9tZWNoYW5pc20pOiBSZW1vdmUgbG9naWMgdG8KKwlmaWx0ZXIgYWdhaW5zdCBhdXRoLT5hbGxvd2VkX21lY2hzOyB3ZSBvbmx5IGFkZCBhbGxvd2VkIG1lY2hzIGluCisJcmVjb3JkX21lY2hhbmlzbXMoKS4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogQWRkIGFuCisJQUxMT1dFRF9NRUNIUyB0byBhdXRoLXNjcmlwdCBmb3JtYXQgc28gd2UgY2FuIHNldCB0aGUgbGlzdCBvZgorCWFsbG93ZWQgbWVjaGFuaXNtcy4KKyAKKyAJKiBkYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0OiBOZXcgdGVzdCB0bworCWNoZWNrIGNsaWVudCBkaXNjb25uZWN0cyB3aGVuIGl0IGlzIG91dCBvZiBtZWNoYW5pc21zIHRvIHRyeS4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC5jIChwcm9jZXNzX2NvbW1hbmQpOiBSZW1vdmUgY2hlY2sgZm9yIGxpbmVzCisJbG9uZ2VyIHRoYXQgMSBNQjsgd2Ugb25seSBidWZmZXIgdXAgbWF4aW11bSAxNiBrQi4KKyAKKyAJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMsIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jLAorCWRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jLCBkYnVzL2RidXMtYXV0aC5jLCBkYnVzL2RidXMtYXV0aC5oOgorCVJlbW92ZSBhdXRoIHN0YXRlIEFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMsIGluc3RlYWQgYWx3YXlzCisJYXNzdW1lIHRoZXJlIG1pZ2h0IGJlIHVudXNlZCBieXRlcy4KKyAKKyAJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2RvX3dvcmspOiBSZW1vdmUgY2hlY2sgZm9yCisJY2xpZW50LW91dC1vZi1tZWNocywgaXQgaXMgaGFuZGxlZCBpbiBwcm9jZXNzX3JlamVjdCgpLiBNb3ZlIGNoZWNrCisJZm9yIG1heCBmYWlsdXJlcyB0byBzZW5kX3JlamVjdGVkKCksIGFzIGl0J3MgYSBzZXJ2ZXItb25seSB0aGluZy4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogRmFjdG9yIG91dCBwcm90b2NvbCByZXBseSBjb2RlIGludG8gZnVuY3Rpb25zCisJc2VuZF9hdXRoKCksIHNlbmRfZGF0YSgpLCBzZW5kX3JlamVjdGVkKCksIHNlbmRfZXJyb3IoKSwKKwlzZW5kX29rKCksIHNlbmRfYmVnaW4oKSBhbmQgc2VuZF9jYW5jZWwoKS4KKworMjAwNC0wNS0xNyAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwlSZW1vdmUgYmFzZTY0IGVuY29kaW5nLCByZXBsYWNlIHdpdGggaGV4IGVuY29kaW5nLiBPcmlnaW5hbCBwYXRjaAorCWZyb20gdHJvd0B4aW1pYW4uY29tLCBhZGRlZCBlcnJvciBoYW5kbGluZy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSkKKwkoX2RidXNfc3RyaW5nX2Jhc2U2NF9kZWNvZGUpOiBSZW1vdmUuCisJKF9kYnVzX3N0cmluZ19oZXhfZGVjb2RlKTogQWRkIGVuZF9yZXR1cm4gYXJndW1lbnQgc28gd2UgY2FuCisJZGlzdGluZ3Vpc2ggYmV0d2VlbiBPT00gYW5kIGludmFsaWQgaGV4IGVuY29kaW5nLgorCShfZGJ1c19zdHJpbmdfdGVzdCk6IFJlbW92ZSBiYXNlNjQgdGVzdHMgYW5kIGFkZCB0ZXN0IGNhc2UgZm9yCisJaW52YWxpZCBoZXguCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMsIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jLCBkYnVzL2RidXMtYXV0aC5jOgorCVJlcGxhY2UgYmFzZTY0IHdpdGggaGV4LgorCisJKiB0ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdDogTmV3IHRlc3QgY2FzZQorCWZvciBpbnZhbGlkIGhleCBlbmNvZGVkIGRhdGEgaW4gYXV0aCBwcm90b2NvbC4KKworMjAwNC0wNS0xNyAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGNoZWNrX2Zvcl9yZXBseV91bmxvY2tlZCk6IHBsdWcgYSBtZW1vcnkKKwlsZWFrLgorCisyMDA0LTA1LTE1ICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9kYnVzLXNoYXJwLmRsbC5jb25maWcuaW46IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vZGJ1cy1zaGFycC5zbms6IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vQXNzZW1ibHkuY3MuaW46IEFkZGVkIGZvciBHQUMKKwkqIG1vbm8vTWFrZWZpbGUuYW06IENoYW5nZXMgZm9yIEdBQyBpbnN0YWxsYXRpb24JCisJKiBjb25maWd1cmUuaW46IEFkZGVkIHJlZnMgZm9yIGRidXMtc2hhcnAuZGxsLmNvbmZpZy5pbiBhbmQKKwlBc3NlbWJseS5jcy5pbi4gTW9yZSBmaXhlcyBmb3IgbW9ubyB0ZXN0aW5nCisJKiBtb25vL2V4YW1wbGUvTWFrZWZpbGUuYW06IENoYW5nZWQgdmFyIHRvIENTQworCSogTWFrZWZpbGUuYW06IENoYW5nZWQgZmxhZyBuYW1lIHRvIERCVVNfVVNFX0NTQworCisyMDA0LTA1LTE1ICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogbW9uby9NYWtlZmlsZS5hbTogQWRkZWQgU1VCRElSUyBmb3IgZG9jcy4gQ2hhbmdlZCBTVUJESVJTIG9yZGVyCisJKiBtb25vL2RvYy8qOiBBZGRlZCBkb2N1bWVudGF0aW9uIGZyYW1ld29yaworCSogY29uZmlndXJlLmluOiBBZGRlZCBtb25vZG9jIGNoZWNrCisJKiBSRUFETUU6IEFkZGVkIGRlc2NyaXB0aW9uIG9mIG1vbm8gY29uZmlndXJlIGZsYWdzCisKKzIwMDQtMDUtMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+OgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkZWQgYSAiUmVxdWlyZWQiIGNvbHVtbiB0byB0aGUgCisJaGVhZGVyIGZpZWxkcyB0YWJsZSBhbmQgY2hhbmdlZCB0aGUgInplcm8gb3IgbW9yZSIgdmVyYmFnZSBpbgorCXRoZSBhYm92ZSBwYXJhZ3JhcGggdG8gcmVhZCAiVGhlIGhlYWRlciBtdXN0IGNvbnRhaW4gdGhlIHJlcXVpcmVkIAorCW5hbWVkIGhlYWRlciBmaWVsZHMgYW5kIHplcm8gb3IgbW9yZSBvZiB0aGUgb3B0aW9uYWwgbmFtZWQgaGVhZGVyIAorCWZpZWxkcyIuCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy8qLm1lc3NhZ2U6IEFkZGVkIHRoZSByZXF1aXJlZCBQQVRIIAorCW5hbWVkIGhlYWRlciBmaWVsZCB0byB0aGUgdGVzdHMgc28gdGhhdCB0aGV5IGRvbid0IGZhaWwgb24gCisJJ01pc3NpbmcgcGF0aCBmaWVsZCcKKworMjAwNC0wNS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXMtYmluZGluZ3MucHl4LmluOiBTdG9wcGVkIHRoZSBiaW5kaW5ncyBmcm9tIHRyYXNoaW5nCisJdGhlIHN0YWNrIGJ5IGltcGxpY2l0bHkgZGVmaW5pbmcgdmFyaWFibGUgYW5kIHBhcmFtZXRlciB0eXBlcyBhbmQKKwlyZW1vdmluZyB0aGUgaGFjayBvZiBkZWZpbmluZyBDIHBvaW50ZXJzIGFzIHB5dGhvbiBvYmplY3RzIGFuZCBsYXRlcgorCWNhc3RpbmcgdGhlbS4KKworMjAwNC0wNS0wMiAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IFJlbW92ZWQgdGVzdC1kYnVzLXNoYXJwLmV4ZSBmcm9tIGFsbCB0YXJnZXQKKworMjAwNC0wNS0wMSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vREJ1c1R5cGUvRGljdC5jczogSGFuZGxlIGVtcHR5IGRpY3RzCisJKiBtb25vL0RCdXNUeXBlL0FycmF5LmNzOiBIYW5kbGUgZW1wdHkgYXJyYXlzCisJKiBtb25vL0FyZ3VtZW50cy5jczogSGFuZGxlIGVtcHR5IGFyZ3VtZW50cworCisyMDA0LTA0LTMwICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZGJ1cy1zaGFycC5wYy5pbjogTW9kaWZpZWQgdG8gaW5jbHVkZSBpbmNsdWRlIExpYnMgYW5kIFJlcXVpcmVzCisJZmllbGQKKworMjAwNC0wNC0yNSAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC0qLm1lc3NhZ2U6IFVwZGF0ZSBtZXNzYWdlCisJdGVzdCBzY3JpcHRzIHRvIG5ldyBoZWFkZXIgZmllbGQgbmFtZXMuCisKKzIwMDQtMDQtMjIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmMgKHJhbmRvbWx5X2RvX25fdGhpbmdzKTogdHJhY2tlZCBkb3duIGJ1ZmZlcgorCW92ZXJmbG93IHRvIHRpbWVzX3dlX2RpZF9lYWNoX3RoaW5nIGFycmF5IHdoaWNoIHdvdWxkIGNob3Agb2ZmIHRoZQorCWZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmFpbHVyZV9kaXIgc3RyaW5nLiBJbmNyZWFzZWQgdGhlIHNpemUgb2YKKwl0aGUgYXJyYXkgdG8gNyB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgcmFuZG9tIG11dGF0aW9uIGZ1bmN0aW9ucworCXdlIGhhdmUuCisKKzIwMDQtMDQtMjEgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAodW5peF9maW5hbGl6ZSk6IERvbid0IHVucmVmCisJdW5peF9zZXJ2ZXItPndhdGNoIGhlcmUsIGl0IGlzIHVucmVmZmVkIGluIGRpc2Nvbm5lY3QuCisJKF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQpOiBjb252ZXJ0IE5VTEwgaG9zdCB0bworCSJsb2NhbGhvc3QiIGhlcmUgc28gd2UgZG9uJ3QgYXBwZW5kIE5VTEwgdG8gYWRkcmVzcy4KKwkKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoX2RidXNfc2VydmVyX3Rlc3QpOiBBZGQgdGVzdCBjYXNlIGZvcgorCXZhcmlvdXMgYWRkcmVzc2VzLCBpbmNsdWRpbmcgdGNwIHdpdGggbm8gZXhwbGljaXQgaG9zdC4KKworMjAwNC0wNC0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSwgZGVjb2RlX3N0cmluZ19maWVsZCk6CisJZml4IGluY29ycmVjdCBzZXR0aW5nIG9mIC5uYW1lX29mZnNldCBpbiB0aGUgSGVhZGVyRmllbGQgKGl0IHdhcworCW9mZiBieSB0d28gYnl0ZXMsIHBvc2l0aW9uZWQgcmlnaHQgYWZ0ZXIgdGhlIG5hbWUgYW5kIHR5cGVjb2RlKQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldywgYnVzX2NvbnRleHRfdW5yZWYpOiB0ZXN0IGJlZm9yZQorCWNhbGxpbmcgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgYW5kIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYKKwlpbiBjYXNlIG9mIGFuIGVycm9yLgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogYWRkICQoREJVU19HTElCX1RPT0xfTElCUyksIHhtbCBsaWJzIG5lZWRlZAorCWJ5IGxpYmRidXMtZ3Rvb2wuCisKKzIwMDQtMDQtMTkgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBSZXdyaXRlIHRvIHVzZQorCV9kYnVzX3BvbGwoKSBpbnN0ZWFkIG9mIHNlbGVjdCgpLgorCisyMDA0LTA0LTE1ICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCSogYnVzL21haW4uYyAoc2lnbmFsX2hhbmRsZXIpOiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKKwlvbiBTSUdIVVAuCisJKG1haW4pOiBTZXQgdXAgb3VyIFNJR0hVUCBoYW5kbGVyLgorCisJKiBidXMvYnVzLmMgKHN0cnVjdCBCdXNDb250ZXh0KTogU3RvcmUgdGhlIGNvbmZpZyBmaWxlLCB1c2VyIGFuZAorCWZvcmsgZmxhZyBpbiB0aGUgQnVzQ29udGV4dC4KKwkocHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5KTogQWRkZWQuICBDb250YWlucyB0aGUgY29kZQorCShwcmV2aW91c2x5IGluIGJ1c19jb250ZXh0X25ldykgZm9yIHNldHRpbmcgdXAgdGhlIEJ1c0NvbnRleHQgZnJvbQorCXRoZSBCdXNDb25maWdQYXJzZXIgdGhhdCBzaG91bGQgb25seSBiZSBydW4gdGhlIGZpcnN0IHRpbWUgdGhlCisJY29uZmlnIGZpbGVzIGFyZSByZWFkLgorCShwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lKTogQWRkZWQuICBDb250YWlucyB0aGUgY29kZSAocHJldmlvdXNseQorCWluIGJ1c19jb250ZXh0X25ldykgZm9yIHNldHRpbmcgdXAgdGhlIEJ1c0NvbnRleHQgZnJvbSB0aGUKKwlCdXNDb25maWdQYXJzZXIgdGhhdCBzaG91bGQgYmUgcnVuIGV2ZXJ5IHRpbWUgdGhlIGNvbmZpZyBmaWxlcyBhcmUKKwlyZWFkLgorCShsb2FkX2NvbmZpZyk6IEFkZGVkLiAgQnVpbGRzIGEgQnVzQ29uZmlnUGFyc2VyIGZyb20gdGhlIGNvbmZpZworCWZpbGVzIGFuZCBwYXNzZXMgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUgb2ZmIHRvCisJcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IChhc3N1bWluZyB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lKQorCWFuZCBwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lLgorCShidXNfY29udGV4dF9uZXcpOiBBbGwgb2YgdGhlIGNvbmZpZy1yZWxhdGVkIGNvZGUgaGFzIGJlZW4gbW92ZWQKKwl0byBwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgYW5kIHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUuCisJTm93IHRoaXMgZnVuY3Rpb24ganVzdCBkb2VzIHRoZSBub24tY29uZmlnLXJlbGF0ZWQgaW5pdGlhbGl6YXRpb25zCisJYW5kIGNhbGxzIGxvYWRfY29uZmlnLgorCShidXNfY29udGV4dF9yZWxvYWRfY29uZmlnKTogQWRkZWQuCisKKzIwMDQtMDQtMTUgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9zZXJ2aWNlX293bmVyKToKKwlpbXBsZW1lbnQgYSBHZXRTZXJ2aWNlT3duZXIgbWV0aG9kLgorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IGl0LgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOiBhZGQgYSAnU2VydmljZUhhc05vT3duZXInIGVycm9yLgorCQorCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9uZXdfZm9yX3NlcnZpY2Vfb3duZXIpOgorCWltcGxlbWVudCwgdXNpbmcgdGhlIGJ1cyBHZXRTZXJ2aWNlT3duZXIgbWV0aG9kLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzoKKwl1c2UgZGJ1c19ncHJveHlfbmV3X2Zvcl9zZXJ2aWNlX293bmVyIHNvIHRoYXQgd2UgY2FuIHJlY2VpdmUgdGhlCisJc2lnbmFsLiAKKworMjAwNC0wNC0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jLCBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuYywgZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkoREJVU19IRUFERVJfRklFTERfU0VSVklDRSk6IHJlbmFtZWQgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jLCBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuYywgZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkoREJVU19IRUFERVJfRklFTERfU0VOREVSX1NFUlZJQ0UpOiByZW5hbWVkIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX2hlYWRlcl9maWVsZF90b19zdHJpbmcpOgorCURCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OIHJlc29sdmVzIHRvICJkZXN0aW5hdGlvbiIKKwlEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgcmVzb2x2ZXMgdG8gInNlbmRlciIKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwgKEhlYWRlciBGaWVsZHMgVGFibGUpOgorCXMvU0VSVklDRS9ERVNUSU5BVElPTgorCXMvU0VOREVSX1NFUlZJQ0UvU0VOREVSCisKKworMjAwNC0wNC0xNCAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jICh0aW1lZF9leGl0KTogZmFpbCB0aGUgdGVzdCBhZnRlcgorCWEgZmV3IHNlY29uZHMuCisKKzIwMDQtMDQtMTMgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogc3BsaXQgb3V0CisJKGludHJvc3BlY3RfcHJvcGVydGllcyk6IHRoaXMuCisJKGhhbmRsZV9pbnRyb3NwZWN0KTogaW1wbGVtZW50IHRoaXMuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogdXNlIHRoZSBhYnNvbHV0ZSBwYXRoIHNvIHRoZSBidXMKKwlkYWVtb24ncyBjaGRpciAoIi8iKSBkb2Vzbid0IGtpbGwgdXMgZGVhZC4KKworCSogY29uZmlndXJlLmluOiBzdWJzdCBBQlNPTFVURV9UT1BfQlVJTERESVIKKworMjAwNC0wNC0xMiAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpOiBBZGRlZAorCWluY2x1ZGVkX2ZpbGVzIGZpZWxkLgorCShzZWVuX2luY2x1ZGUpOiBBZGRlZC4gIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGZpbGUgaGFzIGFscmVhZHkKKwliZWVuIGluY2x1ZGVkIGJ5IGFueSBwYXJlbnQgQnVzQ29uZmlnUGFyc2VyLgorCShidXNfY29uZmlnX3BhcnNlcl9uZXcpOiBDb3B5IHRoZSBwYXJlbnQncyBpbmNsdWRlZF9maWxlcy4KKwkoaW5jbHVkZV9maWxlKTogVHJhY2sgd2hpY2ggZmlsZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLCBhbmQgZmFpbCBvbgorCWNpcmN1bGFyIGluY2x1c2lvbnMuCisJKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpOiBDaGFuZ2VkIHByaW50ZiB0byByZXBvcnQgaWYgd2UgYXJlCisJdGVzdGluZyB2YWxpZCBvciBpbnZhbGlkIGNvbmYgZmlsZXMuCisJKGFsbF9hcmVfZXF1aXYpOiBDaGFuZ2VkIHByaW50ZiB0byBiZSBhIGJpdCBjbGVhcmVyIGFib3V0CisJd2hhdCB3ZSBhcmUgYWN0dWFsbHkgZG9pbmcuCisJKGJ1c19jb25maWdfcGFyc2VyX3Rlc3QpOiBUZXN0IGludmFsaWQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworMjAwNC0wNC0wOSAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IEFkZGVkIGEgJ3BhcmVudCcKKwlhcmd1bWVudC4gIElmIG5vbi1udWxsLCB0aGUgbmV3bHktY29uc3RydWN0ZWQgQnVzQ29uZmlnUGFyc2VyIHdpbGwKKwliZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwYXJlbnQncyBCdXNMaW1pdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdAorCXZhbHVlcy4KKwkoaW5jbHVkZV9maWxlKTogV2hlbiBpbmNsdWRpbmcgYSBjb25maWcgZmlsZSwgcGFzcyBpbgorCXRoZSBjdXJyZW50IHBhcnNlciBhcyB0aGUgcGFyZW50IGFuZCB0aGVuIGNvcHkgdGhlIEJ1c0xpbWl0cworCWZyb20gdGhlIGluY2x1ZGVkIEJ1c0NvbmZpZ1BhcnNlciBwYWNrIHRvIHRoZSBjdXJyZW50IHBhcnNlci4KKwkocHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpcik6IFJlbmFtZWQgZnJvbSBwcm9jZXNzX3Rlc3Rfc3ViZGlyLgorCShwcm9jZXNzX3Rlc3RfZXF1aXZfc3ViZGlyKTogQWRkZWQuICBXYWxrcyB0aHJvdWdoIGEgZGlyZWN0b3J5LAorCWRlc2NlbmRpbmcgaW50byBlYWNoIHN1YmRpcmVjdG9yeSBhbmQgbG9hZGluZyB0aGUgY29uZmlnIGZpbGVzCisJaXQgZmluZHMgdGhlcmUuICBJZiBhbnkgc3ViZGlyZWN0b3J5IGNvbnRhaW5zIHR3byBjb25maWcgZmlsZXMKKwl0aGF0IGRvbid0IHByb2R1Y2UgaWRlbnRpY2FsIEJ1c0NvbmZpZ1BhcnNlciBzdHJ1Y3RzLCBmYWlsLgorCUZvciBub3csIHRoZSBCdXNDb25maWdQYXJzZXIncyBCdXNQb2xpY2llcyBhcmUgbm90IGNvbXBhcmVkLgorCShidXNfY29uZmlnX3BhcnNlcl90ZXN0KTogQ2FsbCBib3RoIHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgYW5kCisJcHJvY2Vzc190ZXN0X2VxdWl2X3N1YmRpci4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMgKGJ1c19jb25maWdfbG9hZCk6IFRha2UgYSBwYXJlbnQKKwlhcmd1bWVudCBhbmQgcGFzcyBpdCBhbG9uZyB0byB0aGUgY2FsbCB0byBidXNfY29uZmlnX3BhcnNlcl9uZXcuCisJQWxzbyBtYWRlIGEgZmV3IHNtYWxsIGNoYW5nZXMgdG8gYWxsb3cgdGhpcyBjb2RlIHRvIGNvbXBpbGUuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWV4cGF0LmMgKGJ1c19jb25maWdfbG9hZCk6IFRha2UgYSBwYXJlbnQKKwlhcmd1bWVudCBhbmQgcGFzcyBpdCBhbG9uZyB0byB0aGUgY2FsbCB0byBidXNfY29uZmlnX3BhcnNlcl9uZXcuCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogTG9hZCB0aGUgY29uZmlnIGZpbGUKKwl3aXRoIGEgTlVMTCBwYXJlbnQgYXJndW1lbnQuCisKKzIwMDQtMDMtMjkgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGludHJvc3BlY3RfcHJvcGVydGllcyk6IHNwbGl0CisJb3V0LCBmaXggbWFuZ2xlZCAnd2hpbGUnIGZsb3cgY29udHJvbC4KKwkoaW50cm9zcGVjdF9zaWduYWxzKTogaW1wbGVtZW50LgorCShoYW5kbGVfaW50cm9zcGVjdCk6IHVwZGF0ZS4KKworMjAwNC0wMy0yOSAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoc2V0X29iamVjdF9wcm9wZXJ0eSk6IHNwbGl0IG91dCAvIAorCXJlLXdvcmssIHVzZSB0aGUgcHJvcGVydHkgdHlwZSwgYW5kIG5vdCB0aGUgbWVzc2FnZSB0eXBlKCEpCisJKGdldF9vYmplY3RfcHJvcGVydHkpOiBkaXR0by4KKworICAgICAgICAqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKSwKKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IG1ha2UgdGhpcyBjb2RlIHJlLXVzYWJsZSwgbmVlZGVkCisJZm9yIHNpZ25hbHMgdG9vLCBhbHNvIG9uIGJvdGggcHJveHkgYW5kIHNlcnZlciBzaWRlLgorCVJlLXdyaXRlIGZvciBtb3JlIGVmZmljaWVuY3kgLyByZWFkYWJpbGl0eS4KKworMjAwNC0wMy0yOSAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYworCShkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3ByaW50Zik6IGltcGwuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3VucmVnaXN0ZXJfb2JqZWN0X3BhdGgpOiBmaXggd2FybmluZy4KKworCSogY29uZmlndXJlLmluOiBmaXggbm8tbW9uby1pbnN0YWxsZWQgc2l0dWF0aW9uLgorCisyMDA0LTAzLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBUZXLDpHM6CisJCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IGlmIC0tcHJpbnQtcmVwbHksIGFzc3VtZSB0eXBlIGlzCisJbWV0aG9kIGNhbGw7IHN1cHBvcnQgYm9vbGVhbiB0eXBlIGFyZ3MKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiBmaXggYQorCWJ1bmNoIG9mIG1lbWxlYWsgYW5kIGxvZ2ljIGJ1Z3MKKwkKKzIwMDQtMDMtMjMgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisgICAgICAgICogbW9uby9Bcmd1bWVudHMuY3M6CisJKiBtb25vL0ludHJvc3BlY3Rvci5jczoKKwkqIG1vbm8vSGFuZGxlci5jczoKKwkqIG1vbm8vSW50ZXJmYWNlUHJveHkuY3M6CisJKiBtb25vL01lc3NhZ2UuY3MKKwkqIG1vbm8vUHJveHlCdWlsZGVyLmNzOgorCSogbW9uby9TZXJ2aWNlLmNzOgorCUFkZGVkIEludGVyZmFjZVByb3h5IGNsYXNzIHRvIGF2b2lkIGJ1aWxkaW5nIHByb3hpZXMgZm9yIGV2ZXJ5CisJb2JqZWN0LgorCisJKiBkYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KQorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfb2JqZWN0X3BhdGgpCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9vYmplY3RfcGF0aF9hcnJheSkKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX29iamVjdF9wYXRoKQorCShkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfb2JqZWN0X3BhdGhfYXJyYXkpOgorCUFkZGVkIG9iamVjdF9wYXRoIGl0ZXIgZnVuY3Rpb25zIHRvIGhhbmRsZSBPQkpFQ1RfUEFUSCBhcmd1bWVudHMKKwkKKzIwMDQtMDMtMjMgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJRmlyc3QgY2hlY2tpbiBvZiBtb25vIGJpbmRpbmdzLgorCSogY29uZmlndXJlLmluOgorCSogTWFrZWZpbGUuYW06CisJQnVpbGQgc3R1ZmYgZm9yIHRoZSBiaW5kaW5ncworCSogZGJ1cy1zaGFycC5wYy5pbjogQWRkZWQgZm9yIHBrZ2NvbmZpZworCQorMjAwNC0wMy0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKG1haW4pOiByZW1vdmUgZGVidWcgc3BldworCisyMDA0LTAzLTIxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBhY2NlcHQgZW1wdHkKKwlhcnJheXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCwgYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9pbml0KQorCShkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FycmF5X2l0ZXJhdG9yKQorCShkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2RpY3RfaXRlcmF0b3IpOiByZXR1cm4gYSBkYnVzX2Jvb2xfdCB0bworCWluZGljYXRlIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGlzIGVtcHR5CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYywgZGJ1cy9kYnVzLXNlcnZlci5jOiBzaWxlbmNlIGNvbXBpbGVyCisJd2FybmluZ3MKKworMjAwNC0wMy0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IDAuMjEgdXBkYXRlcworCisJKiBjb25maWd1cmUuaW46IDAuMjEKKworCSogZG9jL01ha2VmaWxlLmFtOiBhZGQgYWxsIFhNTFRPIHVzYWdlIHRvIERCVVNfWE1MX0RPQ1NfRU5BQkxFRAorCQorCSogcHl0aG9uL01ha2VmaWxlLmFtOiBjaGFuZ2UgdG8gYXZvaWQgZGlzdCBvZiBkYnVzX2JpbmRpbmdzLmMgc28KKwl5b3UgZG9uJ3QgbmVlZCBweXJleCB0byBtYWtlIGRpc3QKKworCSogcXQvTWFrZWZpbGUuYW0gKGxpYmRidXNfcXRfMV9sYV9TT1VSQ0VTKTogYWRkIGludGVncmF0b3IuaCB0bworCXNvdXJjZXM7IHJ1biBtb2MKKwkKKzIwMDQtMDMtMTggIFJpY2hhcmQgSHVsdCAgPHJpY2hhcmRAaW1lbmRpby5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfYXV0b19hY3RpdmF0aW9uKSAKKwkoZGJ1c19tZXNzYWdlX3NldF9hdXRvX2FjdGl2YXRpb24pOiBBZGQgZG94eWdlbiBkb2NzLgorCisyMDA0LTAzLTE2ICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKSwKKwkoYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyksCisJKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCSogYnVzL2FjdGl2YXRpb24uaDoKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoYnVzX2Rpc3BhdGNoKSwKKwkoY2hlY2tfbm9uZXhpc3RlbnRfc2VydmljZV9hdXRvX2FjdGl2YXRpb24pLAorCShjaGVja19zZXJ2aWNlX2F1dG9fYWN0aXZhdGVkKSwKKwkoY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hdXRvX2FjdGl2YXRpb24pLAorCShjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fYWN0aXZhdGlvbiksIChidXNfZGlzcGF0Y2hfdGVzdCk6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3NldF9hdXRvX2FjdGl2YXRpb24pLAorCShkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fYWN0aXZhdGlvbik6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IEltcGxlbWVudCBhdXRvLWFjdGl2YXRpb24uCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQWRkIGF1dG8tYWN0aXZhdGlvbiB0byB0aGUgc3BlYy4KKworMjAwNC0wMy0xMiAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfZ2V0X2FyZ19lbmRfcG9zKToKKwlmaXggYSBidWcgd2l0aCBDVVNUT00gdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKG1lc3NhZ2VfaXRlcl90ZXN0LCBfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQKKwlhIHVuaXQgdGVzdCBmb3IgdGhpcyBidWcgKHVzZWQgdG8gZmFpbCkuCisKKzIwMDQtMDMtMTIgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzoKKwkoYmFieXNpdHRlcl93YXRjaF9jYWxsYmFjayk6IG5vdGlmeSBhbGwgcGVuZGluZyBhY3RpdmF0aW9ucyB3YWl0aW5nIGZvcgorCSAgdGhlIHNhbWUgZXhlYyB0aGF0IHRoZSBhY3RpdmF0aW9uIGZhaWxlZC4KKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IHNob3J0Y3V0IHRoZSBhY3RpdmF0aW9uIGlmIHdlIAorCSAgYWxyZWFkeSB3YWl0aW5nIGZvciB0aGUgc2FtZSBleGVjdXRhYmxlIHRvIHN0YXJ0IHVwLgorCisyMDA0LTAzLTEyICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAaW1lbmRpby5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IAorCS0gQWRkZWQgc2VydmljZSBmaWxlIHJlbG9hZGluZy4gCisJICBFYWNoIHNlcnZpY2UgZmlsZXMgZGlyZWN0b3J5IGlzIGtlcHQgaW4gYW4gaGFzaCB0YWJsZSBpbiAKKwkgIEJ1c0FjdGl2YXRpb24gYW5kIGVhY2ggQnVzQWN0aXZhdGlvbkVudHJ5IGtub3dzIHdoYXQgLnNlcnZpY2UtZmlsZSBpdAorCSAgd2FzIHJlYWQgZnJvbS4gU28gd2hlbiB5b3UgdHJ5IHRvIGFjdGl2YXRlIGEgc2VydmljZSB0aGUgYnVzIHdpbGwgCisJICBjaGVjayBpZiBpdCdzIGJlZW4gdXBkYXRlZCwgcmVtb3ZlZCBvciBpZiBuZXcgLnNlcnZpY2UtZmlsZXMgaGFzIAorCSAgYmVlbiBpbnN0YWxsZWQuCisJLSBUZXN0IGNvZGUgYXQgdGhlIGJvdHRvbSBmb3IgdGhlIHNlcnZpY2UgZmlsZSByZWxvYWRpbmcuCisJKiBidXMvdGVzdC1tYWluLmM6IChtYWluKToKKwkqIGJ1cy90ZXN0Lmg6CisJLSBhZGRlZCBzZXJ2aWNlIHJlbG9hZGluZyB0ZXN0LgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiAoX2RidXNfZGVsZXRlX2RpcmVjdG9yeSk6IEFkZGVkLgorCisyMDA0LTAzLTA4ICBNaWNoYWVsIE1lZWtzICA8bWljaGFlbEB4aW1pYW4uY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX2Zvcl9yZXBseSk6IAorCWJhaWwgaW1tZWRpYXRlbHkgaWYgZGlzY29ubmVjdGVkLCB0byBhdm9pZCBidXN5IGxvb3AuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCk6CisJY2xlYW51cCBjdXQvcGFzdGUvaW5lZmZpY2llbmN5LgorCisyMDA0LTAzLTAxICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0KTogRml4IGEKKwlidWcgd2hlcmUgYXJncyB3ZXJlIHVzZWQgdHdpY2UuIFRoaXMgYnVnIHJlc3VsdGVkIGluIGEgc2VnZmF1bHQKKwlvbiBhIERlYmlhbi9QUEMgc3lzdGVtIHdoZW4gc3RhcnRpbmcgdGhlIG1lc3NhZ2VidXMgZGFlbW9uLiBJbmNsdWRlCisJZGJ1cy1zeXNkZXBzLmggZm9yIERCVVNfVkFfQ09QWQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBEZWZpbmUgREJVU19WQV9DT1BZIGlmIG5lY2Nlc3NhcnkuIEZyb20gR0xpYgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB2YV9jb3B5OyBkZWZpbmUgREJVU19WQV9DT1BZIHRvIHRoZQorCWFwcHJvcHJpYXRlIHZhX2NvcHkgaW1wbGVtZW50YXRpb24uIEZyb20gR0xpYgorIAkKKzIwMDQtMDItMjQgIEpvZSBTaGF3ICA8am9lQHhpbWlhbi5jb20+CisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogV2UgbmVlZCB0byBwYXNzCisJaW4gdGhlIHNlcnZpY2UgbmFtZSB0byBkYnVzX3NldF9lcnJvcigpIHRvIHByZXZlbnQgYSBjcmFzaC4KKworMjAwMy0xMi0yNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAZ25vbWUub3JnPgorCisJKiBBVVRIT1JTOiBSZXZlYWwgbXkgVHJ1ZSBpZGVudGl0eS4KKworMjAwMy0xMi0xNyAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGltZW5kaW8uY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCk6IAorCS0gQWRkZWQgY2FzZSBmb3IgREJVU19UWVBFX0JZVEUsIHBhdGNoIGZyb20gSm9oYW4gSGVkYmVyZy4KKworMjAwMy0xMi0xMyAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGltZW5kaW8uY29tPgorCisJKiBkb2MvVE9ETzogQWRkZWQgbm90IGFib3V0IGJldHRlciBlcnJvciBjaGVjayBvZiBjb25maWd1cmF0aW9uIGZpbGVzLgorCisyMDAzLTEyLTAyICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBVcGRhdGUgQUZMIHZlcnNpb24gdG8gMi4wIHRocm91Z2hvdXQgdGhlIHNvdXJjZSBmaWxlcyB0byByZWZsZWN0CisJdGhlIHVwZGF0ZSB0aGF0IHdhcyBkb25lIGEgd2hpbGUgYWdvLgorCisyMDAzLTEyLTAyICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfZGljdCk6IFNldAorCXdyb3RlX2RpY3Rfa2V5IHRvIEZBTFNFIG9uIHRoZSBpdGVyIHRoYXQgdGhlIGRpY3QgaXMgYXBwZW5kZWQgdG8sCisJanVzdCBsaWtlIHdoZW4gYXBwZW5kaW5nIG90aGVyIHR5cGVzLiBGaXhlcyBhIGJ1ZyB3aGVyZSBhIGRpY3QKKwljb3VsZG4ndCBiZSBwdXQgaW5zaWRlIGEgZGljdC4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2RpY3Rfa2V5KTogRml4IHR5cG8gaW4gd2FybmluZyBtZXNzYWdlLgorCShtZXNzYWdlX2l0ZXJfdGVzdCwgX2RidXNfbWVzc2FnZV90ZXN0KTogQWRkIHRlc3QgY2FzZSBmb3IgZGljdAorCWluc2lkZSBkaWN0LgorCisyMDAzLTEyLTAxICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzLnB5OiBBZGQgdGhlIGFjdHVhbCBtZXNzYWdlIHdoZW4gY2FsbGluZyB0aGUgcmVjaWV2ZXIKKwlvZiBhIHNpZ25hbCBzdWNoIHRoYXQgcGFyYW1ldGVycyBjYW4gYmUgaW5zcGVjdGVkLiBBZGQgdGhlIG1ldGhvZAorCXJlbW92ZV9zaWduYWxfcmVjZWl2ZXIKKwkKKzIwMDMtMTEtMjYgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogYnVzLyouW2NoXToKKwkqIGRidXMvKi5bY2hdOgorCSogZ2xpYi8qLltjaF06IE1hZGUgcmVmIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHBvaW50ZXIKKworMjAwMy0xMS0yNSAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvaW50ZWdyYXRvci5oLCBxdC9pbnRlZ3JhdG9yLmNwcDogQWRkaW5nIGhhbmRsaW5nIG9mIERCdXNTZXJ2ZXIsCisKKwkqIHF0L3NlcnZlci5oLCBxdC9zZXJ2ZXIuY3BwLCBxdC9NYWtlZmlsZS5hbTogQWRkaW5nIERCdXNTZXJ2ZXIgCisJd3JhcHBlcnMsCisKKwkqIHF0L2Nvbm5lY3Rpb24uaCwgcXQvY29ubmVjdGlvbi5jcHA6IEFkanVzdGluZyB0byBjaGFuZ2VzIGluIAorCXRoZSBJbnRlZ3JhdG9yIGFuZCB0byBiZXR0ZXIgZml0IHdpdGggdGhlIHNlcnZlciwKKworMjAwMy0xMS0yNCAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvY29ubmVjdGlvbi5oLCBxdC9jb25uZWN0aW9uLmNwcDogcmVtb3ZpbmcgaW5pdERidXMgbWV0aG9kIHNpbmNlCisJdGhlIGludGVncmF0b3IgaGFuZGxlcyBpdCBub3cKKworCSogcXQvaW50ZWdyYXRvci5oLCBxdC9pbnRlZ3JhdG9yLmNwcDogcmV3b3JraW5nIGhhbmRsaW5nIG9mIHRpbWVvdXRzLAorCXNpbmNlIFFUaW1lciB3YXNuJ3QgcmVhbGx5IG1lYW50IHRvIGJlIHVzZWQgdGhlIHdheSBEQnVzVGltZW91dCBpcworCisyMDAzLTExLTI0ICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBxdC9pbnRlZ3JhdG9yLmgsIHF0L2ludGVncmF0b3IuY3BwLCBNYWtlZmlsZS5hbTogQWRkaW5nIAorCUludGVncmF0b3IgY2xhc3Mgd2hpY2ggaW50ZWdyYXRlcyBELUJVUyB3aXRoIHRoZSBRdCBldmVudCBsb29wLAorCisJKiBxdC9jb25uZWN0aW9uLmgsIHF0L2Nvbm5lY3Rpb24uY3BwOiBNb3ZlIGFsbCB0aGUgY29kZSB3aGljaAorCXdhcyBkZWFsaW5nIHdpdGggRC1CVVMgaW50ZWdyYXRpb24gdG8gdGhlIEludGVncmF0b3IgY2xhc3MsCisJYW5kIHN0YXJ0IHVzaW5nIEludGVncmF0b3IsCisKKzIwMDMtMTEtMjMgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2Nvbm5lY3Rpb24uaCwgcXQvY29ubmVjdGlvbi5jcHA6IEFkZGluZyB0aGUgREJ1c0Nvbm5lY3Rpb24gCisJd3JhcHBlcgorCisJKiBxdC9tZXNzYWdlLmgsIHF0L21lc3NhZ2UuY3BwOiB1cGRhdGluZyB0byB0aGUgY3VycmVudCBELUJVUyBhcGksCisJc3dpdGNoaW5nIG5hbWVzcGFjZXMgdG8gREJ1c1F0LCByZXdvcmtpbmcgdGhlIGNsYXNzLAorCisJKiBNYWtlZmlsZS5jdnM6IHN3aXRjaGluZyBkZXBlbmRlbmNpZXMgc28gdGhhdCBpdCBtYXRjaGVzIEtERSAKKwlzY2hlbWF0aWNzLAorCQorCSogcXQvTWFrZWZpbGUuYW06IGFkZGluZyBjb25uZWN0aW9uLntoLGNwcH0gYW5kIG1lc3NhZ2Uue2gsY3BwfSB0byAKKwl0aGUgbGlicmFyeQorCisyMDAzLTExLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IGJ1bXAgdmVyc2lvbiB0byAwLjIwCisKKwkqIGNvbmZpZ3VyZS5pbiAoaGF2ZV9xdCk6IGFkZCB5ZXQgYW5vdGhlciBwbGFjZSB0byBsb29rIGZvciBxdAorCShzb21lb25lIGhhbmQgdHJvbGx0ZWNoIGEgLnBjIGZpbGUuLi4pCisKKzIwMDMtMTEtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIHN0YXRlIG1hY2hpbmUgZG9jcyBvbiB0aGUgYXV0aAorCXByb3RvY29sOyBqdXN0IGEgZmlyc3QgZHJhZnQsIEknbSBzdXJlIGl0J3Mgd3JvbmcuCQorCisyMDAzLTEwLTI4ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogYWRkIGdldF9kaWN0IHRvIGhhbmRsZSBkaWN0aW9uYXJpZXMKKwlyZXR1cm4gdHlwZXMuIEZpeHVwIFRZUEVfKiB0byByZWZsZWN0IGNoYW5nZXMgaW4gZGJ1cy9kYnVzLXByb3RvY29sLmgKKwkKKzIwMDMtMTAtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChnZXRfbmV4dF9maWVsZCk6IGRlbGV0ZSB1bnVzZWQgZnVuY3Rpb24KKworMjAwMy0xMC0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9leHBpcmVsaXN0LmMgKGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUpOiBkZXRlY3QKKwlmYWlsdXJlIG9mIHRoZSBleHBpcmVfZnVuYyBkdWUgdG8gT09NCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQpOiByZXR1cm4gRkFMU0Ugb24gT09NCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSk6IGZpeCB0byBoYW5kbGUgdGhlCisJTm9SZXBseSBlcnJvciB0aGF0J3Mgbm93IGNyZWF0ZWQgYnkgdGhlIGJ1cyB3aGVuIHRoZSBzZXJ2aWNlIGV4aXRzCisKKzIwMDMtMTAtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBlbmFibGUgYW5kIGZpeCB0aGUKKwl0ZXN0cyBmb3Igc2V0X3BhdGgsIHNldF9pbnRlcmZhY2UsIHNldF9tZW1iZXIsIGV0Yy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzKTogYWxsb3cgMCBieXRlcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzZXRfc3RyaW5nX2ZpZWxkKTogYWx3YXlzIGp1c3QgZGVsZXRlIGFuZAorCXJlLWFwcGVuZCB0aGUgZmllbGQ7IGFjY2VwdCBOVUxMIGZvciBkZWxldGlvbgorCShyZV9hbGlnbl9maWVsZHNfcmVjdXJzZSk6IHJlaW1wbGVtZW50CisJCisyMDAzLTEwLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogZml4IGRvY3MgdG8gcHJvcGVybHkgZGVzY3JpYmUgdGhlCisJZGlzY29ubmVjdGVkIG1lc3NhZ2UKKwkoX2RidXNfY29ubmVjdGlvbl9ub3RpZnlfZGlzY29ubmVjdGVkKTogcmVtb3ZlIHRoaXMgZnVuY3Rpb247IAorCXdlIGNhbid0IHN5bmNocm9ub3VzbHkgYWRkIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZSwgd2UgaGF2ZSB0byAKKwlkbyBpdCBhZnRlciB3ZSd2ZSBxdWV1ZWQgYW55IHJlbWFpbmluZyByZWFsIG1lc3NhZ2VzCisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IHF1ZXVlIHRoZQorCWRpc2Nvbm5lY3QgbWVzc2FnZSBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaGFzIGZpbmlzaGVkIHF1ZXVlaW5nIGFsbAorCWl0cyByZWFsIG1lc3NhZ2VzIGFuZCBpcyBkaXNjb25uZWN0ZWQuCisJKGRidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0KTogdXBkYXRlIHRoZSBkaXNwYXRjaCBzdGF0dXMgaGVyZQorCisyMDAzLTEwLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggdXAgYXNzZXJ0aW9uCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyKTogc2V0IHRoZQorCWRlc3RpbmF0aW9uIHRvIHRoZSBjb25uZWN0aW9uJ3MgYmFzZSBzZXJ2aWNlCisKKzIwMDMtMTAtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIGhtbSwgbWFrZSBjaGVjayBpcyBjdXJyZW50bHkgbm90IHBhc3NpbmcuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIHJlcXVpcmVtZW50IHRoYXQgY3VzdG9tIHR5cGUKKwluYW1lcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMgaW50ZXJmYWNlIG5hbWVzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogY2hhbmdlIHNvbWUgb2YgdGhlIGJ5dGUgY29kZXMsIHRvIGF2b2lkCisJZHVwbGljYXRpb24gYW5kIGFsbG93ICdjJyB0byBiZSAnY3VzdG9tJzsgZGljdCBpcyBub3cgJ20nIGZvcgorCSdtYXAnCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiB1cGRhdGUgdHlwZSBjb2RlcyB0byBtYXRjaAorCWRidXMtcHJvdG9jb2wuaCwgdXNpbmcgdGhlIEFTQ0lJIGJ5dGUgdmFsdWVzLiBSZW5hbWUgdHlwZSBOQU1FRCB0bworCUNVU1RPTS4gQWRkIHR5cGUgT0JKRUNUX1BBVEggdG8gdGhlIHNwZWMuCisKKzIwMDMtMTAtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUpOiB1c2UgIi4iIGFzIHNlcGFyYXRvcgorCWluIGJhc2Ugc2VydmljZSBuYW1lcyBpbnN0ZWFkIG9mICctJworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSk6IGFsbG93IGdldHRpbmcgbnVsCisJYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19MSUtFTFksIF9EQlVTX1VOTElLRUxZKTogYWRkCisJb3B0aW1pemF0aW9uIG1hY3JvcyBzaW5jZSBzdHJpbmcgdmFsaWRhdGlvbiBzZWVtcyB0byBiZSBhIHNsb3cKKwlwb2ludC4KKwkKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiByZXN0cmljdCB2YWxpZAorCXNlcnZpY2UvaW50ZXJmYWNlL21lbWJlci9lcnJvciBuYW1lcy4gQWRkIHRlc3Qgc3VpdGUgY29kZSBmb3IgdGhlCisJbmFtZSB2YWxpZGF0aW9uLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IGxpbWl0IHNlcnZpY2UvaW50ZXJmYWNlL21lbWJlci9lcnJvciBuYW1lcyAKKwl0byBbMC05XVtBLVpdW2Etel1fCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGFkZCBtaXNzaW5nCisJZm9ybWF0IGFyZyB0byB2ZXJib3NlIHNwZXcKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9jYWxsX25vX3JlcGx5KTogaWYgbm90IG91dCBvZgorCW1lbW9yeSwgcmV0dXJuIGluc3RlYWQgb2YgZ19lcnJvcgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChwYXRoX21lc3NhZ2VfZnVuYyk6IHN1cHBvcnQgZW1pdHRpbmcgYQorCXNpZ25hbCBvbiByZXF1ZXN0CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IG9ubHkgZmlsbCBpbgorCWFjdGl2YXRpb24gYnVzIHR5cGUgaWYgREJVU19CVVNfQUNUSVZBVElPTiB3YXMgc2V0OyBkZWZhdWx0IHRvCisJYXNzdW1pbmcgdGhlIGFjdGl2YXRpb24gYnVzIHdhcyB0aGUgc2Vzc2lvbiBidXMgc28gdGhhdCBzZXJ2aWNlcworCXN0YXJ0ZWQgbWFudWFsbHkgd2lsbCBzdGlsbCByZWdpc3Rlci4KKwkoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IGZpeCBzbyB0aGF0IGluIE9PTSBzaXR1YXRpb24gd2UgZ2V0CisJdGhlIHNhbWUgc2VtYW50aWNzIHdoZW4gcmV0cnlpbmcgdGhlIGZ1bmN0aW9uCisJCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogY2hhbmdlIHRvIHVzZSBwYXRoIHJlZ2lzdHJhdGlvbiwgdG8KKwl0ZXN0IHRob3NlIGNvZGVwYXRoczsgcmVnaXN0ZXIgd2l0aCBEQlVTX0JVU19BQ1RJVkFUSU9OIHJhdGhlcgorCXRoYW4gREJVU19CVVNfU0VTU0lPTgorCisyMDAzLTEwLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0ZXN0LW1haW4uYzogYnJhY2tldCB3aXRoICNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKwkqIE1ha2VmaWxlLmFtIChHQ09WX0RJUlMpOiByZW1vdmUgInRlc3QiLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRlc3QKKwljb3ZlcmFnZSBvZiB0aGUgdGVzdHMKKwkoY292ZXJhZ2UtcmVwb3J0LnR4dCk6IGRvbid0IG1vdmUgdGhlIC5kYSBhbmQgLmJiZyBmaWxlcyBhcm91bmQKKworMjAwMy0xMC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoc3RydWN0IEJ1c0NvbnRleHQpOiByZW1vdmUgc3RydWN0IGZpZWxkIEkgZGlkbid0IG1lYW4KKwl0byBwdXQgdGhlcmUKKworMjAwMy0xMC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQpOiBlaXRoZXIgY2FuY2VsIG9yCisJZXhlY3V0ZSwgbm90IGJvdGgKKwkoYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5KTogdXNlIHVubGluaywgbm90IHJlbW92ZV9saW5rLCBhcyB3ZQorCWRvbid0IHdhbnQgdG8gZnJlZSB0aGUgbGluazsgZml4ZXMgZG91YmxlIGZyZWUgbWVzcworCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrKTogZml4IGluIGNhc2UKKwl3aGVyZSBubyByZXBseSB3YXMgcmVjZWl2ZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlX2FuZF91bmxvY2spOgorCWZpeCBhIHJlZmNvdW50IGxlYWsKKworCSogYnVzL3NpZ25hbHMuYyAobWF0Y2hfcnVsZV9tYXRjaGVzKTogYWRkIHNwZWNpYWwgY2FzZXMgZm9yIHRoZQorCWJ1cyBkcml2ZXIsIHNvIHlvdSBjYW4gbWF0Y2ggb24gc2VuZGVyL2Rlc3RpbmF0aW9uIGZvciBpdC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYWJvcnQpOiBwcmludCBiYWNrdHJhY2UgaWYKKwlEQlVTX1BSSU5UX0JBQ0tUUkFDRSBpcyBzZXQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiBhZGQgcGlkIHRvIGFzc2VydGlvbiBmYWlsdXJlIG1lc3NhZ2VzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGFkZCBtZXNzYWdlIHR5cGUgY29kZSB0byB0aGUgZGVidWcgc3BldworCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGdwcm94eV9nZXRfbWF0Y2hfcnVsZSk6IG1hdGNoIHJ1bGVzIHdhbnQKKwlzZW5kZXI9Zm9vIG5vdCBzZXJ2aWNlPWZvbworCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IGlmIHRoZSBhY3RpdmF0aW9uIGJ1cyBpcyB0aGUKKwlzZXNzaW9uIGJ1cyBidXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzbid0IHNldCwgdXNlIAorCURCVVNfQUNUSVZBVElPTl9BRERSRVNTIGluc3RlYWQKKworCSogYnVzL2FjdGl2YXRpb24uYzogc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywKKwlEQlVTX1NZU1RFTV9CVVNfQUREUkVTUyBpZiBhcHByb3ByaWF0ZQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGhhbmRsZSBPT00gY29weWluZyBidXMgdHlwZSBpbnRvCisJY29udGV4dCBzdHJ1Y3QKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X29iamVjdF9wYXRoKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9vYmplY3RfcGF0aF9hcnJheSk6IG5ldyBmdW5jdGlvbiAoaGFsZgorCWZpbmlzaGVkLCBkaXNhYmxlZCBmb3IgdGhlIG1vbWVudCkKKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfZW5kX2NhbGwpOiBwcm9wZXJseSBoYW5kbGUKKwlEQlVTX01FU1NBR0VfVFlQRV9FUlJPUgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChiYWJ5c2l0KTogc3VwcG9ydCBEQlVTX0RFQlVHX09VVFBVVCB0bworCWF2b2lkIHJlZGlyZWN0aW5nIHN0ZGVyciB0byAvZGV2L251bGwKKwkoYmFieXNpdCk6IGNsb3NlIHN0ZGluIGlmIG5vdCBkb2luZyB0aGUgImV4aXRfd2l0aF9zZXNzaW9uIiB0aGluZworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19iZWNvbWVfZGFlbW9uKTogZGVsZXRlIHNvbWUgbGVmdG92ZXIKKwlkZWJ1ZyBjb2RlOyBjaGFuZ2UgREJVU19ERUJVR19PVVRQVVQgdG8gb25seSBlbmFibGUgc3RkZXJyLCBub3QKKwlzdGRvdXQvc3RkaW4sIHNvIHRoaW5ncyBkb24ndCBnZXQgY29uZnVzZWQKKwkKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogZml4IHRvIGFsbG93IHJlcGxpZXMsIEkgbW9kaWZpZWQgLmNvbmYKKwlpbnN0ZWFkIG9mIC5jb25mLmluIGFnYWluLgorCisyMDAzLTEwLTE0ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoTWVzc2FnZUl0ZXIuZ2V0KTogZml4ZWQgdHlwbyBpbgorCWFyZ3R5cGUgdG8gYXJnX3R5cGUgd2hlbiByYWlzaW5nIHVua25vd24gYXJnIHR5cGUgZXhjZXB0aW9uLgorCUNoYW5nZWQgdHlwZSBsaXN0IHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgaW4gZGJ1cy1wcm90b2NvbC5oIHNvIAorCXRoZSBiaW5kaW5ncyBhY3R1YWxseSB3b3JrLgorCisyMDAzLTEwLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jOiBzdXBwb3J0IGdjYyAzLjMgYWxzbywgdGhvdWdoIGdjYyAzLjMgc2VlbXMKKwl0byBoYXZlIGEgYnVnIGtlZXBpbmcgaXQgZnJvbSBvdXRwdXR0aW5nIHRoZSAuZGEgZmlsZXMgc29tZXRpbWVzCisJKHN0cmluZ19nZXRfc3RyaW5nKTogZG9uJ3QgYXBwZW5kIGdhcmJhZ2UgbnVsIGJ5dGVzIHRvIHRoZSBzdHJpbmcuCisKKzIwMDMtMTAtMTUgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06CisKKwlJbmNsdWRlIGRidXNfaF93cmFwcGVyLmggaW4gdGhlIGRpc3QgdGFyYmFsbC4KKworMjAwMy0xMC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogcmV2YW1wIHRoaXMgdG8KKwl3b3JrIG1vcmUgc2FuZWx5IHdpdGggbmV3IHBvbGljeS1iYXNlZCByZXF1ZXN0ZWQgcmVwbHkgc2V0dXAKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIpOiBzZXQgYnVzCisJZHJpdmVyIG1lc3NhZ2VzIGFzIG5vIHJlcGx5CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBoYW5kbGUgYQorCXJlcXVlc3RlZF9yZXBseSBhdHRyaWJ1dGUgb24gYWxsb3cvZGVueSBydWxlcworCisJKiBidXMvc3lzdGVtLmNvbmY6IGFkZCA8YWxsb3cgcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIi8+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6IGZpeCBjaGVjayBmb3IgcmVwbGllcworCXNlbnQgdG8gdGhlIGJ1cyBkcml2ZXIsIHdoaWNoIHdhcyBiYWNrd2FyZC4gSG93IGRpZCB0aGlzIGV2ZXIgd29yaworCWF0IGFsbCB0aG91Z2g/IEkgdGhpbmsgSSdtIG1pc3Npbmcgc29tZXRoaW5nLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkZWNvZGVfaGVhZGVyX2RhdGEpOiByZXF1aXJlIGVycm9yIGFuZAorCW1ldGhvZCByZXR1cm4gbWVzc2FnZXMgdG8gaGF2ZSBhIHJlcGx5IHNlcmlhbCBmaWVsZCB0byBiZSB2YWxpZAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGJyZWFrIHVwIHRoaXMgZnVuY3Rpb247CisJdmFsaWRhdGUgdGhhdCByZXBseSBzZXJpYWwgYW5kIHBsYWluIHNlcmlhbCBhcmUgbm9uemVybzsgCisJY2xlYW4gdXAgdGhlIE9PTS9lcnJvciBoYW5kbGluZy4KKwkoZ2V0X3VpbnRfZmllbGQpOiBkb24ndCByZXR1cm4gLTEgZnJvbSB0aGlzCisJKGRidXNfbWVzc2FnZV9jcmVhdGVfaGVhZGVyKTogZml4IHNpZ25lZC91bnNpZ25lZCBidWcKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSk6IHNhdmUgc2VyaWFsIG9mCisJdGhlIGluY29taW5nIG1lc3NhZ2UsIG5vdCByZXBseSBzZXJpYWwKKworMjAwMy0xMC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGltcGxlbWVudCBwZW5kaW5nIHJlcGx5IHRyYWNraW5nIHVzaW5nCisJQnVzRXhwaXJlTGlzdAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHZlcmlmeSB0aGF0IGEKKwlyZXBseSBpcyBwZW5kaW5nIGluIG9yZGVyIHRvIGFsbG93IGEgcmVwbHkgdG8gYmUgc2VudC4gRGVueSAKKwltZXNzYWdlcyBvZiB1bmtub3duIHR5cGUuCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IHVwZGF0ZSB0byBtZW50aW9uIG5ldyByZXNvdXJjZSBsaW1pdHMKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24pOiBuZXcKKwkoYnVzX2NvbnRleHRfZ2V0X3JlcGx5X3RpbWVvdXQpOiBuZXcKKworMjAwMy0xMC0xMyAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbToKKworCVBhc3MgIm1ha2UgZGlzdGNoZWNrIjogcmVtb3ZlIGEgY291cGxlIGZpbGVzIGZyb20gRElTVF9GSUxFUworCXRoYXQgd2VyZW4ndCBpbmNsdWRlZCBpbiB0aGUgZmluYWwgdmVyc2lvbi4KKworMjAwMy0xMC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworICAgICAgICBBZGRlZCB0ZXN0IGNvZGUgdGhhdCAxKSBzdGFydHMgYW4gYWN0dWFsIGJ1cyBkYWVtb24gYW5kIDIpIHVzZXMKKwlEQnVzR1Byb3h5OyBmaXhlZCBidWdzIHRoYXQgd2VyZSByZXZlYWxlZCBieSB0aGUgdGVzdC4gTG90cyAKKwltb3JlIHRlc3RpbmcgcG9zc2libGUsIGJ1dCB0aGlzIGlzIHRoZSBiYXNpYyBmcmFtZXdvcmsuCisJCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X21hbmFnZXJfdW5yZWdpc3Rlcik6IHJlbW92ZQorCWVtcHR5IHByb3h5IGxpc3RzIGZyb20gdGhlIHByb3h5IGxpc3QgaGFzaAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOiBhZGQgYQorCWNvdXBsZSBvZiByZXR1cm5faWZfZmFpbCBjaGVja3MKKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChfZGJ1c19wZW5kaW5nX2NhbGxfbmV3KTogdXNlIGRidXNfbmV3MAorCXRvIGFsbG9jYXRlLCBzbyBldmVyeXRoaW5nIGlzIGNsZWFyZWQgdG8gTlVMTCBhcyBpdCBzaG91bGQgYmUuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4pOiBwYXNzCisJc291cmNlIGFzIGRhdGEgdG8gZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIGFzIHRoZSAKKwl0aW1lb3V0IGZ1bmN0aW9ucyBleHBlY3RlZAorCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IGFkZCBhIGxpdHRsZSBzY3JpcHQgdG8gc3RhcnQgdXAgYSBtZXNzYWdlCisJYnVzIGFuZCBydW4gdGVzdHMgdXNpbmcgaXQKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMTogdXBkYXRlcworCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogYWRkIC0tY29uZmlnLWZpbGUgb3B0aW9uCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiByZW1vdmUgY29uZnVzaW5nIGVsc2UgaWYgKHJ1bnByb2cpCisJdGhhdCBjb3VsZCBuZXZlciBiZSByZWFjaGVkLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4pIAorCShkYnVzX21lc3NhZ2VfbmV3X2Vycm9yLCBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCk6IHNldCB0aGUKKwluby1yZXBseS1leHBlY3RlZCBmbGFnIG9uIGFsbCB0aGVzZS4gUmVkdW5kYW50LCBidXQgbWF5CisJYXMgd2VsbCBiZSBjb25zaXN0ZW50LgorCisyMDAzLTEwLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmMgKGZ1bmN0aW9uX3NvbHZlX2dyYXBoKTogbWFrZSBicm9rZW4gYmxvY2sKKwlncmFwaCBhIG5vbmZhdGFsIGVycm9yIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGJyb2tlbi4gTmVlZCB0byBkZWJ1ZworCXRoaXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX3R5cGVfaXNfdmFsaWQpOiBuZXcgZnVuY3Rpb24gc2luY2Ugd2UKKwljYW4ndCBqdXN0IGNoZWNrIHR5cGUgPiBJTlZBTElEIDwgTEFTVCBhbnltb3JlCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlKTogbmV3IGZ1bmN0aW9uCisJKHN0cnVjdCBEQnVzTWVzc2FnZSk6IGFkZCBzaWduYXR1cmUgZmllbGQgKHJpZ2h0IG5vdyBpdCBpc24ndCBzZW50CisJb3ZlciB0aGUgd2lyZSwganVzdCBnZW5lcmF0ZWQgb24gdGhlIGZseSkKKwkoZGJ1c19tZXNzYWdlX2NvcHkpOiBjb3B5IHRoZSBzaWduYXR1cmUsIGFuZCBpbml0IHN0cmluZ3MgdG8KKwlwcm9wZXIgbGVuZ3RoIHRvIGF2b2lkIHNvbWUgcmVhbGxvY3MKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcnJheV9pdGVyYXRvcik6IHJldHVybiB2b2lkLCBzaW5jZSBpdAorCWNhbid0IGZhaWwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9kaWN0X2l0ZXJhdG9yKTogcmV0dXJuIHZvaWQgc2luY2UgaXQgY2FuJ3QgZmFpbAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGFkZCBzaWxseSB0ZW1wb3JhcnkgaGFjayB0bworCWZpbGwgaW4gbWVzc2FnZS0+c2lnbmF0dXJlIG9uIGxvYWQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGNoYW5nZSBEQlVTX1RZUEVfKiB2YWx1ZXMgdG8gYmUgQVNDSUkKKwljaGFyYWN0ZXJzLCBzbyB0aGV5IGFyZSByZWxhdGl2ZWx5IGh1bWFuLXJlYWRhYmxlLgorCisyMDAzLTEwLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQgbW9yZSB0ZXN0CisJY292ZXJhZ2UsIGJ1dCAjaWYgMCBmb3Igbm93IHNpbmNlIHRoZXkgdW5jb3ZlciBhIGJ1ZyAKKwlub3QgZml4ZWQgeWV0OyBJIHRoaW5rIGluIHJlX2FsaWduX2ZpZWxkX3JlY3Vyc2UoKQorCShyZV9hbGlnbl9maWVsZF9yZWN1cnNlKTogYWRkIEZJWE1FIGFib3V0IGJyb2tlbiBhc3NlcnRpb24KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogYWRkIG1vcmUgdGVzdCBjb3ZlcmFnZQorCisJKiBidXMvY29ubmVjdGlvbi5jOiBzaGFyZSBhIGNvdXBsZSBjb2RlIGJpdHMgd2l0aCBleHBpcmVsaXN0LmMKKworCSogYnVzL2V4cGlyZWxpc3QuaCwgYnVzL2V4cGlyZWxpc3QuYzogaW1wbGVtZW50IGEgZ2VuZXJpYworCWV4cGlyZS1pdGVtcy1hZnRlci1OLXNlY29uZHMgZmFjaWxpdHksIHdhcyBnb2luZyB0byBzaGFyZSBiZXR3ZWVuCisJZXhwaXJpbmcgY29ubmVjdGlvbnMgYW5kIHJlcGxpZXMsIGRlY2lkZWQgbm90IHRvIHVzZSBmb3IgZXhwaXJpbmcKKwljb25uZWN0aW9ucyBmb3Igbm93LgorCisJKiBDT1BZSU5HOiBpbmNsdWRlIEFGTCAyLjAgKHN0aWxsIG5lZWQgdG8gY2hhbmdlIGFsbCB0aGUgZmlsZSBoZWFkZXJzKQorCisyMDAzLTEwLTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgREJVU19IQVZFX0dDQzMzX0dDT1YgaWYgd2UgaGF2ZQorCWdjYyAzLjMuIE5vdCB0aGF0IHdlIGRvIGFueXRoaW5nIGFib3V0IGl0IHlldC4KKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX21hdGNoX3J1bGVfcGFyc2UpOiBpbXBvc2UgbWF4IGxlbmd0aCBvbiB0aGUKKwltYXRjaCBydWxlIHRleHQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGFkZCBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9MRU5HVEgKKworMjAwMy0xMC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgTWFrZSBtYXRjaGluZyBydWxlcyB0aGVvcmV0aWNhbGx5IHdvcmsgKGFkZCBwYXJzZXIpLgorCQorCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggdXAgdG8gaGFuZGxlCisJdGhlIGNhc2Ugd2hlcmUgZGVzdGluYXRpb24gaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMgYnVzIGRyaXZlcgorCWFuZCBzb21lb25lIGVsc2UgaXMgZWF2ZXNkcm9wcGluZy4KKwkKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBmaXggdXAKKwlkZWZpbml0aW9uIG9mIGVhdmVzZHJvcHBpbmcgYW5kIGFzc2VydGlvbgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IHVzZSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZworCisJKiBidXMvc2lnbmFscy5jIChidXNfbWF0Y2hfcnVsZV9wYXJzZSk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyk6IG5ldworCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElEKTogYWRkCisKKzIwMDMtMTAtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfY2FsbF9ub19yZXBseSk6IHJlbmFtZSBmcm9tCisJZGJ1c19ncHJveHlfb25ld2F5X2NhbGwKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbikgCisJKGRidXNfc2VydmVyX3NldHVwX3dpdGhfZ19tYWluKTogZml4IHRvIGFsbG93IGNhbGxpbmcgdGhlbSBtb3JlCisJdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGFyZ3MKKwkoZGJ1c19idXNfZ2V0X3dpdGhfZ19tYWluKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMTAtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IHdyaXRlIHNvbWUgc3R1ZmYKKworMjAwMy0wOS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBzcGxpdCBjaGVja3MgZm9yIERveHlnZW4gZnJvbSBYTUwgZG9jcywgY2hlY2sgZm9yCisJeG1sdG8KKworCSogZG9jL01ha2VmaWxlLmFtOiBYTUwtaWZ5IGFsbCB0aGUgZG9jcywgYW5kIGFkZCBhIGJsYW5rCisJZGJ1cy10dXRvcmlhbC54bWwKKworMjAwMy0wOS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWVyZ2UgZGJ1cy1vYmplY3QtbmFtZXMgYnJhbmNoLiBUbyBzZWUgdGhlIGVudGlyZSBwYXRjaCAKKwlkbyBjdnMgZGlmZiAtciBEQlVTX09CSkVDVF9OQU1FU19CUkFOQ0hQT0lOVCAtciBkYnVzLW9iamVjdC1uYW1lcywKKwlpdCdzIGh1dXV1Z2UgdGhvdWdoLgorCVRvIHJldmVydCwgSSB0YWdnZWQgREJVU19CRUZPUkVfT0JKRUNUX05BTUVTX01FUkdFLgorCQorMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogSEFDS0lORzogdXBkYXRlIHRvIHJlZmxlY3QgbmV3IHNlcnZlcgorCisyMDAzLTA5LTI2ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWxzLnB5OgorCisJU3RhcnQgaW1wbGVtZW50aW5nIHNvbWUgbm90aW9ucyBvZiBzaWduYWxzLiBUaGUgQVBJCisJaXMgcmVhbGx5IHRlcnJpYmxlLCBidXQgdGhleSBzb3J0IG9mIHdvcmsgKHdpdGggdGhlCisJZXhjZXB0aW9uIG9mIGJlaW5nIGFibGUgdG8gZmlsdGVyIGJ5IHNlcnZpY2UsIGFuZCB0bworCXRyYW5zbWl0IHNpZ25hbHMgKmFzKiBhIHBhcnRpY3VsYXIgc2VydmljZSkuIE5lZWQgdG8KKwlmaWd1cmUgb3V0IGhvdyB0byBtYWtlIG1lc3NhZ2VzIGNvbWUgZnJvbSB0aGUgc2VydmljZQorCXdlIHJlZ2lzdGVyZWQgOi0oCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlSZW1vdmVkIGR1cGxpY2F0ZSBtZXNzYWdlX2hhbmRsZXIgY2FsbGJhY2tzLgorCQorMjAwMy0wOS0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeCBteSBtZXNzCisKKzIwMDMtMDktMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeCBzZWN1cml0eSBwb2xpY3ksIHJlcG9ydGVkIGJ5IFNldGggTmlja2VsbAorCisyMDAzLTA5LTI1ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKworCUpvaGFuIG5vdGljZXMgY29tcGxldGUgd3JvbmcgY29kZSBpbiBleGFtcGxlLXNlcnZpY2UsIGJ1dAorCWNvbXBsZXRlbHkgd3JvbmcgaW4gYSB3YXkgdGhhdCB3b3JrcyBleGFjdGx5IHRoZSBzYW1lICghKS4KKwlKb2hhbiBpcyBjb25mdXNlZCwgaG93IGNvdWxkIHRoaXMgcG9zc2libHkgd29yaz8gRXhhbXBsZQorCWNvZGUgZmFpbHMgdG8gc2VydmUgcHVycG9zZSBvZiBtYWtpbmcgdGhpbmdzIGNsZWFyLgorCVNldGggZml4ZXMuCisKKzIwMDMtMDktMjUgIE1hcmsgTWNMb3VnaGxpbiAgPG1hcmtAc2t5bmV0LmllPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGRvbid0IHJlcXVpcmUgaGVhZGVyIGZpZWxkcworCXRvIGJlIDQtYnl0ZSBhbGlnbmVkIGFuZCBzcGVjaWZ5IHRoYXQgZmllbGRzIHNob3VsZCBiZQorCWRpc3Rpbmd1aXNoZWQgZnJvbSBwYWRkaW5nIGJ5IHRoZSBmYWN0IHRoYXQgemVybyBpcyBub3QKKwlhIHZhbGlkIGZpZWxkIG5hbWUuCisJCisJKiBkb2MvVE9ETzogcmVtb3ZlIHJlLWFsaWdubWVudCBpdGVtIGFuZCBhZGQgaXRlbSB0byBkb2MKKwl0aGUgT0JKRUNUX1BBVEggdHlwZS4KKwkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKEhlYWRlckZpZWxkKTogcmVuYW1lIHRoZSBvcmlnaW5hbCBtZW1iZXIgdG8gdmFsdWVfb2Zmc2V0CisJYW5kIGludHJvZHVjZSBhIG5hbWVfb2Zmc2V0IG1lbWJlciB0byBrZWVwIHRyYWNrIG9mIHdoZXJlCisJdGhlIGZpZWxkIGFjdHVhbGx5IGJlZ2lucy4KKwkoYWRqdXN0X2ZpZWxkX29mZnNldHMpOiByZW1vdmUuCisJKGFwcGVuZF9pbnRfZmllbGQpLCAoYXBwZW5kX3VpbnRfZmllbGQpLAorCShhcHBlbmRfc3RyaW5nX2ZpZWxkKTogZG9uJ3QgYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXIKKwlmaWVsZCB0byBhIDQtYnl0ZSBib3VuZGFyeS4KKwkoZ2V0X25leHRfZmllbGQpOiBpbXBsIGZpbmRpbmcgdGhlIG5leHQgbWFyaHNhbGxlZCBmaWVsZAorCWFmdGVyIGEgZ2l2ZW4gZmllbGQuCisJKHJlX2FsaWduX2ZpZWxkX3JlY3Vyc2UpOiBpbXBsIHJlLWFsaWduaW5nIGEgbnVtYmVyIG9mCisJYWxyZWFkeSBtYXJzaGFsbGVkIGZpZWxkcy4KKwkoZGVsZXRlX2ZpZWxkKTogaW1wbCBkZWxldGluZyBhIGZpZWxkIG9mIGFueSB0eXBlIGFuZAorCXJlLWFsaWduaW5nIGFueSBmb2xsb3dpbmcgZmllbGRzLgorCShkZWxldGVfaW50X29yX3VpbnRfZmllbGQpLCAoZGVsZXRlX3N0cmluZ19maWVsZCk6IHJlbW92ZS4KKwkoc2V0X2ludF9maWVsZCksIChzZXRfdWludF9maWVsZCk6IG5vIG5lZWQgdG8gcmUtY2hlY2sKKwl0aGF0IHdlIGhhdmUgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIGZpZWxkLgorCShzZXRfc3RyaW5nX2ZpZWxkKTogZGl0dG8gYW5kIGltcGwgcmUtYWxpZ25pbmcgYW55CisJZm9sbG93aW5nIGZpZWxkcy4KKwkoZGVjb2RlX2hlYWRlcl9kYXRhKTogdXBkYXRlIHRvIHRha2UgaW50byBhY2NvdW50IHRoYXQKKwl0aGUgZmllbGRzIGFyZW4ndCA0LWJ5dGUgYWxpZ25lZCBhbnkgbW9yZSBhbmQgdGhlIG5ldworCXdheSB0byBkaXN0aW5ndWlzaCBwYWRkaW5nIGZyb20gaGVhZGVyIGZpZWxkcy4gQWxzbywKKwlkb24ndCBleGl0IHdoZW4gdGhlcmUgaXMgdG9vIG11Y2ggaGVhZGVyIHBhZGRpbmcuCisJKHByb2Nlc3NfdGVzdF9zdWJkaXIpOiBwcmludCB0aGUgZGlyZWN0b3J5LgorCShfZGJ1c19tZXNzYWdlX3Rlc3QpOiBhZGQgdGVzdCB0byBtYWtlIHN1cmUgYSBmb2xsb3dpbmcKKwlmaWVsZCBpcyByZS1hbGlnbmVkIGNvcnJlY3RseSBhZnRlciBmaWVsZCBkZWxldGlvbi4KKwkKKwkqIGRidXMvZGJ1cy1zdHJpbmcuW2NoXToKKwkoX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyk6IHJlbmFtZSBmcm9tIGluc2VydF9ieXRlIGFuZAorCWFsbG93IHRoZSBpbnNlcnQgb2YgbXVsdGlwbGUgYnl0ZXMuCisJKF9kYnVzX3N0cmluZ190ZXN0KTogdGVzdCBpbnNlcnRpbmcgbXVsdGlwbGUgYnl0ZXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3NldF9zdHJpbmcpOiBhZGQKKwl3YXJuaW5nIG5vdGUgdG8gZG9jcyBhYm91dCBoYXZpbmcgdG8gcmUtYWxpZ24gYW55CisJbWFyc2hhbGxlZCB2YWx1ZXMgZm9sbG93aW5nIHRoZSBzdHJpbmcuCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6CisJKGFwcGVuZF9zdHJpbmdfZmllbGQpLCAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOgorCWRvbid0IGFsaWduIHRoZSBoZWFkZXIgZmllbGQuCisJCisJKiBkYnVzL2RidXMtYXV0aC5jOiAocHJvY2Vzc190ZXN0X3N1YmRpcik6IHByaW50IHRoZQorCWRpcmVjdG9yeS4KKwkKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmM6IChyYW5kb21seV9hZGRfb25lX2J5dGUpOiB1cGQuIGZvcgorCWluc2VydF9ieXRlIGNoYW5nZS4KKwkKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2U6CisJbmV3IHRlc3QgY2FzZS4KKwkKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlOiBzaG92ZQorCWEgZGljdCBpbiB0aGUgdW5rbm93biBmaWVsZC4KKworMjAwMy0wOS0yNSAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJSGFuZGxlIHJldHVybiB2YWx1ZXMuCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJUGFzcyBiYWNrIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgc2VydmljZSB0byB0aGUgY2xpZW50LgorCQorMjAwMy0wOS0yNCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQ29ubmVjdCBPYmplY3QgbWV0aG9kcyAod2hlbiB5b3UgYXJlIHNoYXJpbmcgYW4gb2JqZWN0KSB1cC4uLiBwYXNzCisJaW4gYSBsaXN0IG9mIG1ldGhvZHMgdG8gYmUgc2hhcmVkLiBTaGFyaW5nIGFsbCB0aGUgbWV0aG9kcyBqdXN0CisJd29ya2VkIG91dCB0b28gd2VpcmQuIFlvdSBjYW4gbm93IGNyZWF0ZSBuaWNlIFNlcnZpY2VzIG92ZXIgdGhlCisJREJ1cyBpbiBQeXRob24uIDotKQorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJS2VlcCByZWZlcmVuY2VzIHRvIHVzZXJfZGF0YSB0dXBsZXMgcGFzc2VkIGludG8gQyBmdW5jdGlvbnMgc28gCisJUHl0aG9uIGRvZXNuJ3QgZ2FyYmFnZSBjb2xsZWN0IG9uIHVzLgorCisJSW1wbGVtZW50IE1ldGhvZFJldHVybiBhbmQgRXJyb3Igc3ViY2xhc3NlcyBvZiBNZXNzYWdlIGZvciBjcmVhdGluZworCURCdXNNZXNzYWdlJ3Mgb2YgdGhvc2UgdHlwZXMuCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1jbGllbnQucHk6CisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJU2ltcGxlIGV4YW1wbGUgY29kZSBzaG93aW5nIGJvdGggaG93IGNyZWF0ZSBEQnVzIHNlcnZpY2VzIGFuZCBvYmplY3RzLAorCWFuZCBob3cgdG8gdXNlIHRoZW0uCisKKzIwMDMtMDktMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfbWFuYWdlcl9maWx0ZXIpOiBpbXBsZW1lbnQKKworMjAwMy0wOS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfY29ubmVjdF9zaWduYWwpOiBpbXBsZW1lbnQKKwkoZGJ1c19ncHJveHlfZGlzY29ubmVjdF9zaWduYWwpOiBpbXBsZW1lbnQKKwkoZGJ1c19ncHJveHlfbWFuYWdlcl9yZW1vdmVfc2lnbmFsX21hdGNoKTogaW1wbGVtZW50CisJKGRidXNfZ3Byb3h5X21hbmFnZXJfYWRkX3NpZ25hbF9tYXRjaCk6IGltcGxlbWVudAorCShkYnVzX2dwcm94eV9vbmV3YXlfY2FsbCk6IGltcGxlbWVudAorCisyMDAzLTA5LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKHN0cnVjdCBEQnVzR1Byb3h5KTogY29udmVydCB0byBhIEdPYmplY3QKKwlzdWJjbGFzcy4gVGhpcyBtZWFucyBkcm9wcGluZyB0aGUgdHJhbnNwYXJlbnQgdGhyZWFkIHNhZmV0eSBvZiB0aGUKKwlwcm94eTsgeW91IG5vdyBuZWVkIGEgc2VwYXJhdGUgcHJveHkgcGVyLXRocmVhZCwgb3IgeW91ciBvd24KKwlsb2NraW5nIG9uIHRoZSBwcm94eS4gUHJvYmFibHkgcmlnaHQgYW55d2F5LgorCShkYnVzX2dwcm94eV9yZWYsIGRidXNfZ3Byb3h5X3VucmVmKTogbnVrZSwganVzdCB1c2UgZ19vYmplY3RfcmVmCisKKzIwMDMtMDktMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X21hbmFnZXJfZ2V0KTogaW1wbGVtZW50CisKKzIwMDMtMDktMjEgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisgICAgICAgIEZpcnN0IGNoZWNraW4gb2YgdGhlIFB5dGhvbiBiaW5kaW5ncy4KKwkKKwkqIHB5dGhvbi8uY3ZzaWdub3JlOgorCSogcHl0aG9uL01ha2VmaWxlLmFtOgorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL2RidXNfaF93cmFwcGVyLmg6CisKKwlQaWVjZXMgZm9yIFB5cmV4IHRvIG9wZXJhdGUgb24sIGJ1aWxkaW5nIGEgZGJ1c19iaW5kaW5ncy5zbworCXB5dGhvbiBtb2R1bGUgZm9yIGxvdy1sZXZlbCBhY2Nlc3MgdG8gdGhlIERCdXMgQVBJcy4KKwkKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJSGlnaC1sZXZlbCBQeXRob24gbW9kdWxlIGZvciBhY2Nlc3NpbmcgREJ1cyBvYmplY3RzLgorCisJKiBjb25maWd1cmUuaW46CisJKiBNYWtlZmlsZS5hbToKKworCUJ1aWxkIHN0dWZmIGZvciB0aGUgcHl0aG9uIGJpbmRpbmdzLgorCisJKiBhY2luY2x1ZGUubTQ6CisKKwlFeHRyYSBtYWNybyBuZWVkZWQgZm9yIGZpbmRpbmcgdGhlIFB5dGhvbiBDIGhlYWRlciBmaWxlcy4KKworMjAwMy0wOS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9tYW5hZ2VyX25ldyk6IHN0YXJ0CisJaW1wbGVtZW50aW5nIHRoZSBwcm94eSBtYW5hZ2VyLCBkaWRuJ3QgZ2V0IHZlcnkgZmFyLgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2FkZF9tYXRjaCk6IG5ldworCShkYnVzX2J1c19yZW1vdmVfbWF0Y2gpOiBuZXcKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9uZXdfZm9yX3NlcnZpY2UpOiBhZGQgYQorCXBhdGhfbmFtZSBhcmd1bWVudDsgYWRqdXN0IHRoZSBvdGhlciBub3QteWV0LWltcGxlbWVudGVkIAorCWdwcm94eSBjb25zdHJ1Y3RvcnMgdG8gYmUgd2hhdCBJIHRoaW5rIHRoZXkgc2hvdWxkIGJlLgorCisyMDAzLTA5LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IHNldCBleGl0X29uX2Rpc2Nvbm5lY3QgdG8gVFJVRQorCWJ5IGRlZmF1bHQgZm9yIG1lc3NhZ2UgYnVzIGNvbm5lY3Rpb25zLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBleGl0IGlmCisJZXhpdF9vbl9kaXNjb25uZWN0IGZsYWcgaXMgc2V0IGFuZCB3ZSBwcm9jZXNzIHRoZSBkaXNjb25uZWN0ZWQKKwlzaWduYWwuCisJKGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDktMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlHZXQgbWF0Y2hpbmcgcnVsZXMgbW9zdGx5IHdvcmtpbmcgaW4gdGhlIGJ1czsgb25seSBhY3R1YWxseQorCXBhcnNpbmcgdGhlIHJ1bGUgdGV4dCByZW1haW5zLiBIb3dldmVyLCB0aGUgY2xpZW50IHNpZGUgb2YKKwkic2lnbmFsIGNvbm5lY3Rpb25zIiBoYXNuJ3QgYmVlbiBzdGFydGVkLCB0aGlzIHBhdGNoIGlzIG9ubHkgdGhlCisJYnVzIHNpZGUuCisJCisJKiBkYnVzL2Rpc3BhdGNoLmM6IGZpeCBmb3IgdGhlIG1hdGNoaW5nIHJ1bGVzIGNoYW5nZXMKKwkKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfcmVtb3ZlX21hdGNoKQorCShidXNfZHJpdmVyX2hhbmRsZV9hZGRfbWF0Y2gpOiBzZW5kIGFuIGFjayByZXBseSBmcm9tIHRoZXNlCisJbWV0aG9kIGNhbGxzCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfYmVnaW5fY2FsbCk6IGZpeCBvcmRlciBvZgorCWFyZ3VtZW50cywgcmVwb3J0ZWQgYnkgU2V0aCBOaWNrZWxsCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCk6IHN1cHBvcnQKKwllYXZlc2Ryb3A9dHJ1ZXxmYWxzZSBhdHRyaWJ1dGUgb24gcG9saWNpZXMgc28gbWF0Y2ggcnVsZXMgCisJY2FuIGJlIHByZXZlbnRlZCBmcm9tIHNub29waW5nIG9uIHRoZSBzeXN0ZW0gYnVzLgorCisJKiBidXMvZGJ1cy1kYWVtb24tMS4xLmluOiBjb25zaXN0ZW50bHkgdXNlIHRlcm1pbm9sb2d5ICJzZW5kZXIiCisJYW5kICJkZXN0aW5hdGlvbiIgaW4gYXR0cmlidXRlIG5hbWVzOyBmaXggc29tZSBkb2NzIGJ1Z3M7IAorCWFkZCBlYXZlc2Ryb3A9dHJ1ZXxmYWxzZSBhdHRyaWJ1dGUKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9hZGRfbWF0Y2gpCisJKGJ1c19kcml2ZXJfaGFuZGxlX3JlbW92ZV9tYXRjaCk6IGhhbmRsZSBBZGRNYXRjaCwgUmVtb3ZlTWF0Y2gKKwltZXNzYWdlcworCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19TRVJWSUNFX09SR19GUkVFREVTS1RPUF9CUk9BRENBU1QpOiBnZXQKKwlyaWQgb2YgYnJvYWRjYXN0IHNlcnZpY2UgY29uY2VwdCwgc2lnbmFscyBhcmUganVzdCBhbHdheXMgYnJvYWRjYXN0CisKKwkqIGJ1cy9zaWduYWxzLmMsIGJ1cy9kaXNwYXRjaC5jLCBidXMvY29ubmVjdGlvbi5jLCBidXMvYnVzLmM6CisJbW9zdGx5IGltcGxlbWVudCBtYXRjaGluZyBydWxlcyBzdHVmZiAoY3VycmVudGx5IG9ubHkgZXhwb3NlZCBhcyBzaWduYWwKKwljb25uZWN0aW9ucykKKworMjAwMy0wOS0yMSAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogQ2hhbmdlIHRoZSBoZWFkZXIgZmllbGQgbmFtZQorCXRvIGJlIGFuIGVudW0gYW5kIHVwZGF0ZSB0aGUgcmVzdCBvZiB0aGUgc3BlYyB0byByZWZlcmVuY2UKKwl0aGUgZmllbGRzIHVzaW5nIHRoZSBjb252ZW50aW5hbCBuYW1lLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogdXBkYXRlIHRvIHJlZmxlY3QgdGhlIHNwZWMuCisKKwkqIGRvYy9UT0RPOiBhZGQgaXRlbSB0byByZW1vdmUgdGhlIDQgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBSZW1vdmUgdGhlIGNvZGUgdG8gZ2VuZXJhbGlzZSB0aGUKKwloZWFkZXIvYm9keSBsZW5ndGggYW5kIHNlcmlhbCBudW1iZXIgaGVhZGVyIGZpZWxkcyBhcyBuYW1lZAorCWhlYWRlciBmaWVsZHMgc28gd2UgY2FuIHJlZmVyZW5jZSBmaWVsZCBuYW1lcyB1c2luZyB0aGUgCisJcHJvdG9jb2wgdmFsdWVzLgorCShhcHBlbmRfaW50X2ZpZWxkKSwgKGFwcGVuZF91aW50X2ZpZWxkKSwgKGFwcGVuZF9zdHJpbmdfZmllbGQpOgorCUFwcGVuZCB0aGUgZmllbGQgbmFtZSBhcyBhIGJ5dGUgcmF0aGVyIHRoYW4gZm91ciBjaGFycy4KKwkoZGVsZXRlX2ludF9vcl91aW50X2ZpZWxkKSwgKGRlbGV0ZV9zdHJpbmdfZmllbGQpOiByZWZsZWN0IHRoZQorCWZhY3QgdGhhdCB0aGUgZmllbGQgbmFtZSBhbmQgdHlwZWNvZGUgbm93IG9jY3VweSA0IGJ5dGVzIGluc3RlYWQKKwlvZiA4LgorCShkZWNvZGVfc3RyaW5nX2ZpZWxkKSwgKGRlY29kZV9oZWFkZXJfZGF0YSk6IHVwZGF0ZSB0byByZWZsZWN0CisJcHJvdG9jb2wgY2hhbmdlcyBhbmQgbW92ZSB0aGUgZmllbGQgc3BlY2lmaWMgZW5jb2RpbmcgZnJvbQorCWRlY29kZV9zdHJpbmdfZmllbGQoKSBiYWNrIGludG8gZGVjb2RlX2hlYWRlcl9kYXRhKCkuCisJCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLltjaF06IChfZGJ1c19oZWFkZXJfZmllbGRfdG9fc3RyaW5nKToKKwlBZGQgdXRpbGl0eSB0byBhaWQgZGVidWdnaW5nLgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOgorCShhcHBlbmRfc3RyaW5nX2ZpZWxkKSwgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogVXBkYXRlIHRvCisJcmVmbGVjdCBwcm90b2NvbCBjaGFuZ2VzOyBDaGFuZ2UgdGhlIEZJRUxEX05BTUUgZGlyZWN0aXZlCisJdG8gSEVBREVSX0ZJRUxEIGFuZCBhbGxvdyBpdCB0byB0YWtlIHRoZSBmaWVsZCdzIGNvbnZlbnRpb25hbAorCW5hbWUgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS4KKwkKKwkqIHRlc3QvZGF0YS8qLyoubWVzc2FnZTogVXBkYXRlIHRvIHVzZSBIRUFERVJfRklFTEQgaW5zdGVhZAorCW9mIEZJRUxEX05BTUU7IEFsd2F5cyBhbGlnbiB0aGUgaGVhZGVyIG9uIGFuIDggYnl0ZSBib3VuZGFyeQorCSpiZWZvcmUqIHVwZGF0aW5nIHRoZSBoZWFkZXIgbGVuZ3RoLgorCisyMDAzLTA5LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IGFkZCB0aGUgZ2V0L3NldCBvYmplY3QgZGF0YQorCWJvaWxlcnBsYXRlIGFzIGZvciBEQnVzQ29ubmVjdGlvbiwgZXRjLiBVc2UgZ2VuZXJpYyBvYmplY3QgZGF0YQorCWZvciB0aGUgbm90aWZ5IGNhbGxiYWNrLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9ub2RlKTogcGFyc2UgY2hpbGQgbm9kZXMKKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYzogbW9yZSBoYWNraW5nIG9uIHRoZSBkYnVzLXZpZXdlcgorCQorCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfc3BsaXRfcGF0aCk6IGFkZCBhIGZpbGUgdG8KKwljb250YWluIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgY29udmVuaWVuY2UgbGliIGFuZCB0aGUKKwlpbnN0YWxsZWQgbGliCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKGxpYmRidXNfZ2xpYl8xX2xhX0xERkxBR1MpOiBhZGQKKwktZXhwb3J0LXN5bWJvbHMtcmVnZXggdG8gdGhlIEdMaWIgbGlicmFyeQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayk6CisJZml4IHRoZSBsb2NraW5nIGluIGhlcmUsIGFuZCBhZGQgYSBkZWZhdWx0IGhhbmRsZXIgZm9yCisJSW50cm9zcGVjdCgpIHRoYXQganVzdCByZXR1cm5zIHN1Yi1ub2Rlcy4KKworMjAwMy0wOS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYyAoZGJ1c19nX3RocmVhZF9pbml0KTogcmVuYW1lIHRvIG1ha2UgZ19mb28KKwlyYXRoZXIgdGhhbiBnZm9vIGNvbnNpc3RlbnQKKworCSogZ2xpYi9kYnVzLWdwcm94eS5oOiBkZWxldGUgZm9yIG5vdywgbW92ZSBjb250ZW50cyB0bworCWRidXMtZ2xpYi5oLCBiZWNhdXNlIHRoZSBpbmNsdWRlIGZpbGVzIGRvbid0IHdvcmsgcmlnaHQgc2luY2Ugd2UKKwlhcmVuJ3QgaW4gdGhlIGRidXMvIHN1YmRpci4KKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfc2VuZCk6IGZpbmlzaCBpbXBsZW1lbnRpbmcKKwkoZGJ1c19ncHJveHlfZW5kX2NhbGwpOiBmaW5pc2gKKwkoZGJ1c19ncHJveHlfYmVnaW5fY2FsbCk6IGZpbmlzaAorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19zZXRfZ19lcnJvcik6IG5ldworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IGluY2x1ZGUgaW5mb3JtYXRpb24KKwlhYm91dCBjaGlsZCBub2RlcyBpbiB0aGUgaW50cm9zcGVjdGlvbgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fbGlzdF9yZWdpc3RlcmVkKTogbmV3CisJZnVuY3Rpb24gdG8gaGVscCBpbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRyb3NwZWN0aW9uCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF9hbmRfdW5sb2NrKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDktMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1naWRsLmg6IGFkZCBjb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBmb29faW5mbworCXR5cGVzCisKKyAgICAgICAgKiB0b29scy9kYnVzLXZpZXdlci5jOiBhZGQgR1RLLWJhc2VkIGludHJvc3BlY3Rpb24gVUkgdGhpbmd5CisJc2ltaWxhciB0byBrZGNvcAorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiB0cnkgdGVzdCBzcmNkaXIgLWVmIC4gaW4gYWRkaXRpb24gdG8gdGVzdAorCXNyY2RpciA9IC4sIG9uZSBvZiB0aGVtIHNob3VsZCB3b3JrICh5ZWFoIGxhbWUpCisJCisgICAgICAgICogZ2xpYi9NYWtlZmlsZS5hbTogYnVpbGQgdGhlICJpZGwiIHBhcnNlciBzdHVmZiBhcyBhIGNvbnZlbmllbmNlCisJbGlicmFyeQorCQorCSogZ2xpYi9kYnVzLWdwYXJzZXIuaDogbWFrZSBkZXNjcmlwdGlvbl9sb2FkIHJvdXRpbmVzIHJldHVybgorCU5vZGVJbmZvKiBub3QgUGFyc2VyKgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IGJ1aWxkIHRlc3QgZGlyIGFmdGVyIGFsbCBsaWJyYXJ5IGRpcnMKKworCSogY29uZmlndXJlLmluOiBhZGQgR1RLKyBkZXRlY3Rpb24KKworMjAwMy0wOS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZSBEb3h5Z2VuIGNvbnRlbnRlZC4KKworMjAwMy0wOS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBtb3JlIHVwZGF0ZXMKKworMjAwMy0wOS0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBwYXJ0aWFsIHVwZGF0ZXMKKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogZml4IHRoZSBjb25maWcgZmlsZSBkb2NzIGZvciB0aGUKKwl6aWxsaW9udGggdGltZTsgaG9wZWZ1bGx5IEkgZWRpdGVkIHRoZSByaWdodCBmaWxlIHRoaXMgdGltZS4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50KTogc3VwcG9ydAorCXNlbmRfdHlwZSwgc2VuZF9wYXRoLCByZWNlaXZlX3R5cGUsIHJlY2VpdmVfcGF0aAorCisJKiBidXMvcG9saWN5LmM6IGFkZCBtZXNzYWdlIHR5cGUgYW5kIHBhdGggdG8gdGhlIGxpc3Qgb2YgdGhpbmdzCisJdGhhdCBjYW4gYmUgImZpcmV3YWxsZWQiCisKKzIwMDMtMDktMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjayk6IGFkZCB0aGlzCisJKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCk6IG1ha2UgdGhpcyBub3QgaGFuZGxlCisJbWVzc2FnZXMgdG8gcGF0aHMgYmVsb3cgdGhlIGdpdmVuIHBhdGgKKworMjAwMy0wOS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtOiBhZGQgdGhpcyB3aXRoIHJhbmRvbSBnbGliLWxpbmtlZCB0ZXN0CisJcHJvZ3JhbXMKKworCSogZ2xpYi9NYWtlZmlsZS5hbTogcmVtb3ZlIHRoZSByYW5kb20gdGVzdCBwcm9ncmFtcyBmcm9tIGhlcmUsCisJbGVhdmUgb25seSB0aGUgdW5pdCB0ZXN0cworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChfZGJ1c19nb2JqZWN0X3Rlc3QpOiBhZGQgdGVzdCBmb3IgCisJdXNjb3JlL2phdmFjYXBzIGNvbnZlcnNpb24sIGFuZCBmaXgJCisJKGdldF9vYmplY3RfcHJvcGVydHksIHNldF9vYmplY3RfcHJvcGVydHkpOiBjaGFuZ2UgdG8gLk5FVAorCWNvbnZlbnRpb24gZm9yIG1hcHBpbmcgcHJvcHMgdG8gbWV0aG9kcywgc2V0X0Zvb0Jhci9nZXRfRm9vQmFyLCAKKwlzaW5jZSBvbmUgbGFuZ3VhZ2UgaGFzIHN1Y2ggYSBjb252ZW50aW9uIHdlIG1heSBhcyB3ZWxsIGNvcHkgaXQuIAorCVBsdXMgcmVhbCBtZXRob2RzIGluIGVpdGhlciBnZXRGb29CYXIgb3IgZ2V0X2Zvb19iYXIgc3R5bGUgd29uJ3QgCisJY29sbGlkZSB3aXRoIHRoaXMgY29udmVudGlvbi4KKworMjAwMy0wOS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYzogaW1wbGVtZW50CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IHN0YXJ0IGltcGxlbWVudGluZyBza2VsZXRvbnMgc3VwcG9ydAorCisJKiBjb25maWd1cmUuaW46IHdoZW4gZGlzYWJsaW5nIGNoZWNrcy9hc3NlcnQsIGFsc28gZGVmaW5lCisJR19ESVNBQkxFX0FTU0VSVCBhbmQgR19ESVNBQkxFX0NIRUNLUworCisyMDAzLTA5LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiByZWFycmFuZ2UgYSBidW5jaCBvZiBmaWxlcyBhbmQgZ2V0ICJtYWtlCisJY2hlY2siIGZyYW1ld29yayBzZXQgdXAKKworMjAwMy0wOC0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZml4IGJ1aWxkIHdpdGggLS1kaXNhYmxlLXRlc3RzCisKKzIwMDMtMDgtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IHB1cmdlIERCdXNNZXNzYWdlSGFuZGxlcgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmM6IHJlbW92ZSBEQnVzTWVzc2FnZUhhbmRsZXIsIGp1c3QgCisJdXNlIGNhbGxiYWNrcyBldmVyeXdoZXJlCisKKzIwMDMtMDgtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mOiBjaGFuZ2UgdG8gCisJcm9vdCBmb3IgdGhlIHVzZXIgc28gd2FybmluZ3MgZG9uJ3QgZ2V0IHByaW50ZWQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYWRkIGRidXNfbWVzc2FnZV9nZXRfcGF0aCwKKwlkYnVzX21lc3NhZ2Vfc2V0X3BhdGgKKwkKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChkb190ZXN0X2Rpc3BhdGNoKTogYWRkIHRlc3Qgb2YKKwlkaXNwYXRjaGluZyB0byBhIHBhdGgKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfcGF0aCk6IGFkZAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19kZW1hcnNoYWxfb2JqZWN0X3BhdGgpOiBpbXBsZW1lbnQKKwkoX2RidXNfbWFyc2hhbF9vYmplY3RfcGF0aCk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19IRUFERVJfRklFTERfUEFUSCk6IG5ldyBoZWFkZXIgZmllbGQgCisJdG8gY29udGFpbiB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IG9iamVjdAorCShEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVJfU0VSVklDRSk6IHJlbmFtZQorCURCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiB0byBleHBsaWNpdGx5IHNheSBpdCdzIHRoZSBzZW5kZXIgc2VydmljZQorCisyMDAzLTA4LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYzogd3JpdGUgdGVzdHMgYW5kIGZpeCB0aGUgZGlzY292ZXJlZCBidWdzCisKKzIwMDMtMDgtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jOiBtb2RpZnkgdG8gYWxsb3cgb3ZlcmxhcHBpbmcgcGF0aHMgdG8gYmUKKwlyZWdpc3RlcmVkCisJKHN0cnVjdCBEQnVzT2JqZWN0U3VidHJlZSk6IHNocmluayB0aGlzCisJYSBsb3QsIHNpbmNlIHdlIG1heSBoYXZlIGEgbG90IG9mIHRoZW0KKwkoX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQpOiBpbXBsZW1lbnQKKwkoX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayk6IGltcGxlbWVudAorCisyMDAzLTA4LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGZpeCBfREJVU19OX0dMT0JBTF9MT0NLUworCisyMDAzLTA4LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJcHVyZ2UgREJ1c09iamVjdElECisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBwb3J0IHRvIG5vIE9iamVjdElELCBjcmVhdGUgYQorCURCdXNPYmplY3RUcmVlLCByZW5hbWUgT2JqZWN0VHJlZSB0byBPYmplY3RQYXRoIGluIHB1YmxpYyBBUEkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCAoc3RydWN0IERCdXNPYmplY3RUcmVlVlRhYmxlKTogZGVsZXRlIAorCWV2ZXJ5dGhpbmcgZXhjZXB0IFVucmVnaXN0ZXJGdW5jdGlvbiBhbmQgTWVzc2FnZUZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiBwb3J0IGF3YXkgZnJvbSBEQnVzT2JqZWN0SUQsIAorCWFkZCBEQlVTX1RZUEVfT0JKRUNUX1BBVEgKKwkKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuW2hjXSwgZGJ1cy9kYnVzLW9iamVjdC5baGNdLCAKKwlkYnVzL2RidXMtb2JqZWN0aWQuW2hjXTogcmVtb3ZlIHRoZXNlLCB3ZSBhcmUgbW92aW5nIHRvIAorCXBhdGgtYmFzZWQgb2JqZWN0IElEcworCisyMDAzLTA4LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgIEp1c3Qgbm90aWNlZCB0aGF0IGRidXNfbWVzc2FnZV90ZXN0IGlzIGhvc2VkLCBJIHdvbmRlciB3aGVuIEkKKwlicm9rZSB0aGF0LiBJIHRob3VnaHQgbWFrZSBjaGVjayB3YXMgcGFzc2luZyBlYXJsaWVyLi4uCisJCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYzogYWRkIG5ldyAib2JqZWN0IHRyZWUiIHRvIG1hdGNoIERDT1AgCisJY29udGFpbmVyIHRyZWUsIHdpbGwgcmVwbGFjZSBtb3N0IG9mIGRidXMtb2JqZWN0LXJlZ2lzdHJ5CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0KTogZml4IEM5OQorCXNjcmV3dXAKKworMjAwMy0wOC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX3N0cmluZ19maWVsZCk6IHN1cHBvcnQgRklFTERfU0VOREVSCisJKGRidXNfbWVzc2FnZV9pc19lcnJvcik6IGZpeCB0aGlzIGZ1bmN0aW9uCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjE6IGNsYXJpZnkgbG9naWMgb24gd2hlbiA8ZGVueT4vPGFsbG93PiBydWxlcworCW1hdGNoCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUpOiBmaXggY29kZSB0bworCXJlZmxlY3QgY2xhcmlmaWVkIG1hbiBwYWdlCisJKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kKTogZGl0dG8KKwkKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IGZpeHVwCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogZml4dXAKKworMjAwMy0wOC0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3R3b19zdHJpbmdzKTogZml4CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKTogZml4CisJZHVtYiBidWcgY3JlYXRlZCBlYXJsaWVyICh3cm9uZyBvcmRlciBvZiBhcmdzIHRvCisJZGVjb2RlX2hlYWRlcl9kYXRhKCkpCisJCisJKiB0b29scy9kYnVzLXNlbmQuYzogcG9ydAorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6IHBvcnQKKworICAgICAgICAqIHRlc3QvZGF0YS8qbWVzc2FnZXM6IHBvcnQgYWxsIG1lc3NhZ2VzIG92ZXIKKwkKKyAgICAgICAgKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IHN1cHBvcnQgaW5jbHVkaW5nIAorCW1lc3NhZ2UgdHlwZQorCQorICAgICAgICAqIGJ1cy9kcml2ZXIuYzogcG9ydCBvdmVyCisJCisJKiBidXMvZGlzcGF0Y2guYzogcG9ydCBvdmVyIHRvIG5ldyBzdHVmZgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwlyZW5hbWUgZGlzY29ubmVjdCBzaWduYWwgdG8gIkRpc2Nvbm5lY3RlZCIKKworMjAwMy0wOC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRoaXMgZG9lc24ndCBjb21waWxlIHlldCwgYnV0IHN5bmNpbmcgdXAgc28gSSBjYW4gaGFjayBvbiBpdCBmcm9tCisJd29yay4gV2hhdCBhcmUgYnJhbmNoZXMgZm9yIGlmIG5vdCBicm9rZW4gY29kZT8gOy0pCisJCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogcmVtb3ZlIERCVVNfSEVBREVSX0ZJRUxEX05BTUUsIGFkZAorCURCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorCURCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUKKwkKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IEludHJvZHVjZSBEQlVTX0hBU0hfVFdPX1NUUklOR1MgYXMgaGFjayB0byB1c2UKKwlmb3IgdGhlIGludGVyZmFjZSttZW1iZXIgcGFpcnMKKwkoc3RyaW5nX2hhc2gpOiBjaGFuZ2UgdG8gdXNlIGdfc3RyX2hhc2ggYWxnb3JpdGhtCisJKGZpbmRfZGlyZWN0X2Z1bmN0aW9uLCBmaW5kX3N0cmluZ19mdW5jdGlvbik6IHJlZmFjdG9yIHRoZXNlIHRvCisJc2hhcmUgbW9zdCBjb2RlLgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogcG9ydCBhbGwgb2YgdGhpcyBvdmVyIHRvIHN1cHBvcnQgCisJaW50ZXJmYWNlL21lbWJlciBmaWVsZHMgaW5zdGVhZCBvZiBuYW1lIGZpZWxkCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYzogcG9ydCBvdmVyCisJCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9pbnRlcmZhY2UpOiByZW5hbWUKKwlmcm9tIF9kYnVzX3N0cmluZ192YWxpZGF0ZV9uYW1lCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjE6IGNoYW5nZSBmaWxlIGZvcm1hdCBmb3IgdGhlIAorCTxkZW55Pi88YWxsb3c+IHN0dWZmIHRvIG1hdGNoIG5ldyBtZXNzYWdlIG5hbWluZyBzY2hlbWUKKworCSogYnVzL3BvbGljeS5jOiBwb3J0IG92ZXIKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogcGFyc2UgbmV3IGZvcm1hdAorCQorMjAwMy0wOC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jIChhZGRfYW5kX3JlbW92ZV9vYmplY3RzKTogcmVtb3ZlCisJYnJva2VuIGFzc2VydGlvbgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IHNvbWUgaGFja2luZworCisyMDAzLTA4LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayk6IGltcGxlbWVudAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZmFjdG9yIG91dCBpbnRlcm5hbHM7CisJY2hhbmdlIHRvIGNvbnZlcnQgYW55IGVycm9yIHJlcGxpZXMgdG8gREJ1c0Vycm9yIGluc3RlYWQgb2YgCisJcmV0dXJuaW5nIHRoZW0gYXMgYSBtZXNzYWdlCisKKzIwMDMtMDgtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIAorCWRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogRmluaXNoIHRoZSBwZW5kaW5nIGNhbGwgc3R1ZmYKKworMjAwMy0wOC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzogc3RhcnQgb24gbmV3IG9iamVjdCB0aGF0IHdpbGwgcmVwbGFjZQorCURCdXNNZXNzYWdlSGFuZGxlciBhbmQgUmVwbHlIYW5kbGVyRGF0YSBmb3IgdHJhY2tpbmcgb3V0c3RhbmRpbmcKKwlyZXBsaWVzCisKKwkqIGRidXMvZGJ1cy1ncHJveHkuYzogc3RhcnQgb24gcHJveHkgb2JqZWN0IHVzZWQgdG8gY29tbXVuaWNhdGUKKwl3aXRoIHJlbW90ZSBpbnRlcmZhY2VzCisKKwkqIGRidXMvZGJ1cy1naWRsLmM6IGRvIHRoZSBib3JpbmcgYm9pbGVycGxhdGUgaW4gaGVyZQorCQorMjAwMy0wOC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaCk6IG1ha2UgdGhpcyByZXR1cm4gcHJvcGVyIAorCURCdXNIYW5kbGVyUmVzdWx0IHRvIGF2b2lkIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcik6IHVzZQorCV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdAorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCkKKwkoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX1VOS05PV05fTUVTU0FHRSk6IGNoYW5nZSB0bworCVVOS05PV05fTUVUSE9ECisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGhhbmRsZQorCURCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7IHNlbmQgZGVmYXVsdCBlcnJvciByZXBseSBpZiBhCisJbWVzc2FnZSBpcyB1bmhhbmRsZWQuCisKKzIwMDMtMDgtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy90ZXN0LmMgKGNsaWVudF9kaXNjb25uZWN0X2hhbmRsZXIpOiBjaGFuZ2UgdG8gcmV0dXJuCisJSEFORExFRCAod291bGQgaGF2ZSBiZWVuIFJFTU9WRV9NRVNTQUdFKQorCisJKiBkYnVzL2RidXMtb2JqZWN0LmggKGVudW0gREJ1c0hhbmRsZXJSZXN1bHQpOiByZW5hbWUgdG8KKwlIQU5ETEVEL05PVF9ZRVRfSEFORExFRCBpbnN0ZWFkIG9mCisJUkVNT1ZFX01FU1NBR0UvQUxMT1dfTU9SRV9IQU5ETEVSUyB0byBtYWtlIGl0IGNsZWFyZXIgaG93IGl0IAorCXNob3VsZCBiZSB1c2VkLgorCisyMDAzLTA4LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IGFkZCAtLXR5cGUgYXJndW1lbnQsIGZvciBub3cKKwlzdXBwb3J0aW5nIG9ubHkgbWV0aG9kX2NhbGwgYW5kIHNpZ25hbCB0eXBlcy4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmM6IHByaW50IG1lc3NhZ2UgdHlwZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwlpbml0IGNvbm5lY3Rpb24tPm9iamVjdHMKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBmaXggc2dtbAorCisJKiBidXMvKi5jOiBwb3J0IG92ZXIgdG8gb2JqZWN0LWluc3RhbmNlIEFQSSBjaGFuZ2VzCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IGRpdHRvCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IGFsbG93ICNOVUxMCisJbmFtZSwgd2Ugd2lsbCBoYXZlIHRvIGZpeCB1cCB0aGUgcmVzdCBvZiB0aGUgY29kZSB0byBhbHNvIGhhbmRsZQorCXRoaXMKKwkoZGJ1c19tZXNzYWdlX25ldyk6IGdlbmVyaWMgbWVzc2FnZS1jcmVhdGlvbiBjYWxsCisJKHNldF9zdHJpbmdfZmllbGQpOiBhbGxvdyBhcHBlbmRpbmcgbmFtZSBmaWVsZAorCisyMDAzLTA4LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmM6IGltcGxlbWVudCBzaWduYWwgY29ubmVjdGlvbiAKKwlhbmQgZGlzcGF0Y2gKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCk6IG5ldworCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX21lbWR1cCk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTA4LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5KQorCShkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5KTogYWRkIHRoZXNlIGFuZCByZW1vdmUKKwlzZXRfaXNfZXJyb3IvZ2V0X2lzX2Vycm9yCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oLCBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IAorCXJlbW92ZSB0aGUgRVJST1IgZmxhZywgc2luY2UgdGhlcmUncyBub3cgYW4gRVJST1IgdHlwZQorCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmMgKF9kYnVzX29iamVjdF9yZWdpc3RyeV9oYW5kbGVfYW5kX3VubG9jayk6CisJaW1wbGVtZW50CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGFkZCAidHlwZSIgYnl0ZSB0byBtZXNzYWdlcworCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19NRVNTQUdFX1RZUEVfKik6IGludHJvZHVjZQorCWEgbWVzc2FnZSB0eXBlIGVudW0gdG8gZGlzdGluZ3Vpc2gga2luZHMgb2YgbWVzc2FnZQorCShEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVEKTogZmxhZyBmb3IgYSBtZXNzYWdlIAorCXRoYXQgbmVlZCBub3QgYmUgcmVwbGllZCB0bworCisyMDAzLTA4LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiBhZGFwdCB0byBEQnVzT2JqZWN0SUQgY2hhbmdlcworCSh1bnBhY2tfOF9vY3RldHMpOiBmaXggbm8tNjQtYml0LWludCBidWcKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jICh2YWxpZGF0ZV9pZCk6IHZhbGlkYXRlIHRoZSAKKwljb25uZWN0aW9uIElEIGJpdHMsIG5vdCBqdXN0IHRoZSBpbnN0YW5jZSBJRC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9pbml0X2lkKTogaW5pdGlhbGl6ZQorCXRoZSBjb25uZWN0aW9uLWdsb2JhbCAzMyBiaXRzIG9mIHRoZSBvYmplY3QgSUQKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jIChpbmZvX2Zyb21fZW50cnkpOiBmaWxsIGluIAorCW9iamVjdCBJRCBpbiB0aGUgbmV3IHdheQorCisJKiBkYnVzL2RidXMtb2JqZWN0aWQuaDogcmF0aGVyIHRoYW4gaGlnaC9sb3cgYml0cywgc3BlY2lmaWNhbGx5IAorCWRlZmluZSBzZXJ2ZXIvY2xpZW50L2luc3RhbmNlIGJpdHMuCisKKzIwMDMtMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3QpOiBmaXgKKwlidWlsZAorCisyMDAzLTA3LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LmggKHN0cnVjdCBEQnVzT2JqZWN0VlRhYmxlKTogYWRkIHBhZGRpbmcKKwlmaWVsZHMgdG8gREJ1c09iamVjdFZUYWJsZSBhbmQgREJ1c09iamVjdEluZm8KKworMjAwMy0wNy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jOiBpbXBsZW1lbnQgdW5pdCB0ZXN0LAorCWZpeCBidWdzIGRpc2NvdmVyZWQgaW4gcHJvY2VzcworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiByZW1vdmUgaGFuZGxlcl90YWJsZSBhbmQKKwlyZWdpc3Rlcl9oYW5kbGVyKCksIGFkZCBEQnVzT2JqZWN0UmVnaXN0cnkgdXNhZ2UKKworCSogZGJ1cy9kYnVzLW9iamVjdGlkLmMgKGRidXNfb2JqZWN0X2lkX2lzX251bGwpCisJKGRidXNfb2JqZWN0X2lkX3NldF9udWxsKTogbmV3IGZ1bmN0aW9ucworCisyMDAzLTA3LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LmM6IGltcGxlbWVudCBzb21lIG9mIHRoaXMKKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jCisJKF9kYnVzX29iamVjdF9yZWdpc3RyeV9hZGRfYW5kX3VubG9jayk6IGZpbGwgaW4gdGhlIG9iamVjdF9pZCBvdXQKKwlwYXJhbQorCShfZGJ1c19vYmplY3RfcmVnaXN0cnlfbmV3KTogaGFuZGxlIE9PTQorCisyMDAzLTA3LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0Lmg6IHNrZXRjaCBvdXQgYW4gQVBJIGZvciByZWdpc3RlcmluZyBvYmplY3RzCisJd2l0aCBhIGNvbm5lY3Rpb24sIHRoYXQgYWxsb3dzIHVzIHRvIHVzZSBhcyBsaXR0bGUgYXMgMjQgYnl0ZXMKKwlwZXIgb2JqZWN0IGFuZCBsZXRzIGFwcGxpY2F0aW9uIGNvZGUgcmVwcmVzZW50IGFuIG9iamVjdCBpbiAKKwlhbnkgY29uY2VpdmFibGUgd2F5LgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmM6IGltcGxlbWVudCB0aGUgaGFyZCBiaXRzIG9mIHRoZQorCURCdXNDb25uZWN0aW9uIGFzcGVjdCBvZiBvYmplY3QgQVBJLiBOb3QgeWV0IHdpcmVkIHVwLgorCQorMjAwMy0wNy0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9zZXRfb2JqZWN0X2lkKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX21hcnNoYWxfb2JqZWN0X2lkKTogbmV3CisJKF9kYnVzX2RlbWFyc2hhbF9vYmplY3RfaWQpOiBuZXcKKwkoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpOiBzdXBwb3J0IG9iamVjdCBJRCB0eXBlLCBhbmQKKwljb25zb2xpZGF0ZSBpZGVudGljYWwgc3dpdGNoIGNhc2VzLiBEb24ndCBjb25kaXRpb25hbGl6ZSBoYW5kbGluZworCW9mIERCVVNfVFlQRV9VSU5UNjQsIG5lZWQgdG8gaGFuZGxlIHRoZSB0eXBlIGFsd2F5cy4KKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBjb25zb2xpZGF0ZSBpZGVudGljYWwgY2FzZXMsIGFuZAorCWhhbmRsZSBEQlVTX1RZUEVfT0JKRUNUX0lECisKKwkqIGRidXMvZGJ1cy1vYmplY3RpZC5jOiBuZXcgZmlsZSB3aXRoIERCdXNPYmplY3RJRCBkYXRhIHR5cGUuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgREJVU19UWVBFX09CSkVDVF9JRAorCisyMDAzLTA5LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiByZWFsIDAuMTMgcmVsZWFzZQorCisyMDAzLTA5LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvTWFrZWZpbGUuYW0gKGRidXMtc3BlY2lmaWNhdGlvbi5odG1sKTogdGVzdGluZyBhIGZ1bmt5IGhhY2sKKwl0byB3b3JrIHdpdGggRGViaWFuIGRiMmh0bWwKKworMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiAwLjEzCisKKwkqIGRvYy9NYWtlZmlsZS5hbSAoZGJ1cy10ZXN0LXBsYW4uaHRtbCk6IGFjY2VwdCBub25leGlzdGVuY2Ugb2YKKwlzdHlsZXNoZWV0LWltYWdlcyBmb3IgYmVuZWZpdCBvZiBEZWJpYW4KKwkKKwlDaGFuZ2UgYmFjayB0byB1c2luZyBmaWxlc3lzdGVtLWxpbmtlZCBzb2NrZXRzIGZvciB0aGUgc3lzdGVtCisJYnVzLCBzbyBvbmx5IHJvb3QgY2FuIGNyZWF0ZSB0aGUgZGVmYXVsdCBzeXN0ZW0gYnVzIGFkZHJlc3MuCisJCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGNoYW5nZSB0byB1c2UKKwlEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTCisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogcmVtb3ZlIERCVVNfU1lTVEVNX0JVU19QQVRIIGRlZmluZQorCWZyb20gaGVyZS4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUworCWhlcmUsIGFuZCBBQ19ERUZJTkUgREJVU19TWVNURU1fUEFUSAorCisyMDAzLTA4LTA5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL1RPRE86CisJKiBkb2MvYnVzY29uZmlnLmR0ZDoKKwlBZGQgYnVzY29uZmlnIERURC4KKwkKKzIwMDMtMDgtMDkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIGFjdGl2YXRpb24gcmVwbHkgdmFsdWVzLgorCQorMjAwMy0wOC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogMC4xMgorCisyMDAzLTA4LTA1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6ICh3YXRjaF9mZF9uZXcpLCAod2F0Y2hfZmRfcmVmKSwKKwkod2F0Y2hfZmRfdW5yZWYpLCAoZGJ1c19nc291cmNlX2NoZWNrKSwgKGRidXNfZ3NvdXJjZV9kaXNwYXRjaCksCisJKGFkZF93YXRjaCksIChyZW1vdmVfd2F0Y2gpLCAoY3JlYXRlX3NvdXJjZSk6CisJUmVmY291bnQgZmRzLCBmaXhlcyBzb21lIHJlZW50cmFuY3kgaXNzdWVzLgorCQorMjAwMy0wNy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCk6IGZpeCBkZWZhdWx0IHN5c3RlbQorCWJ1cyBhZGRyZXNzIHRvIGJlIGFic3RyYWN0IGlmIHdlIGhhdmUgYWJzdHJhY3Qgc29ja2V0cworCisJKiBORVdTOiB1cGRhdGUKKworMjAwMy0wNy0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9tZXNzYWdlYnVzLmluOiBmaXggdG8gYXZvaWQgcHJvY2Vzc25hbWUvc2VydmljZW5hbWUgCisJY29uZnVzaW9uLCBmcm9tIE1pY2hhZWwgS2VhcmV5CisJaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMDA5NjUKKwkKKzIwMDMtMDctMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9uYW1lZCk6IAorCWZpeCBmcm9tIEFuZHkgSGFudG9uIHRvIHJlbW92ZSBicm9rZW4gIisxIgorCisyMDAzLTA3LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChiYWJ5c2l0KTogY2xvc2Ugc3Rkb3V0L3N0ZGVyciBpbiB0aGUKKwliYWJ5c2l0dGVyIHByb2Nlc3MsIGFzIHN1Z2dlc3RlZCBieSBUaG9tYXMgTGVvbmFyZCwgc28gCisJYW4gImV2YWwgYGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb25gIiB3aWxsIGFjdHVhbGx5IAorCXJldHVybgorCisyMDAzLTA3LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IHByaW50IG91dCBFWFBBTkRFRF8qIHZhcmlhYmxlcyBpbiB0aGUgc3VtbWFyeSBhdAorCXRoZSBlbmQ7IGNsZWFuIHVwIHRoZSBjb2RlIHRoYXQgY29tcHV0ZXMgRVhQQU5ERURfIHZhcmlhYmxlcyBhbmQKKwlnZXQgdGhlIG9uZXMgdXNpbmcgZXhlY19wcmVmaXggcmlnaHQuIFNob3VsZCBtYWtlIHRoaW5ncyB3b3JrCisJd2hlbiB5b3UgYnVpbGQgd2l0aG91dCAtLXByZWZpeAorCisyMDAzLTA2LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vL1Rlc3QuY3MgKGNsYXNzIFRlc3QpOiBmaXJlIHVwIGEgbWFpbiBsb29wIGFuZCBydW4gaXQKKworCSogbW9uby9EQnVzLmNzIChEQnVzKTogZG9uJ3QgZ190aHJlYWRfaW5pdCBzaW5jZSBpdCBjYW4gb25seSBiZQorCWRvbmUgb25jZSwgdGhlIGFwcCBoYXMgdG8gZG8gaXQKKworMjAwMy0wNi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzOiBzZXQgdXAgY29ubmVjdGlvbiB3aXRoIHRoZSBnbGliIG1haW4gbG9vcAorCisyMDAzLTA3LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBjbGFyaWZ5IHRoZSBmb3JtYXQgb2YgYSB0eXBlIGNvZGUsCisJY2hhbmdlIHN1Z2dlc3RlZCBieSBKaW0gQmxhbmR5CisKKzIwMDMtMDYtMjkgIE1pbG9zbGF2IFRybWFjICA8bWl0ckB2b2xueS5jej4KKworCSogZG9jL01ha2VmaWxlLmFtOgorCSogdG9vbHMvTWFrZWZpbGUuYW06IERvbid0IGFzc3VtZSBzcmNkaXIgPT0gYnVpbGRkaXIuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoZGJ1c19yZWFsbG9jKTogRG9uJ3QgY2hlY2sgZ3VhcmRzIGFmdGVyIHNocmlua2luZworCXRoZSBhbGxvY2F0ZWQgYmxvY2suCisJKF9kYnVzX21lbW9yeV90ZXN0KTogTmV3IGZ1bmN0aW9uLgorCSogZGJ1cy9kYnVzLXRlc3QuaDogQWRkIF9kYnVzX21lbW9yeV90ZXN0ICgpLgorCSogZGJ1cy9kYnVzLXRlc3QuYyAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IENhbGwgaXQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IFVzZSAlLjRzIGluc3RlYWQKKwlvZiAlYyVjJWMlYy4KKwkoZGJ1c19tZXNzYWdlX25ldyk6IFJlbW92ZSBvYnNvbGV0ZSBAdG9kby4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9zZXRfaW50NjQpCisJKF9kYnVzX21hcnNoYWxfc2V0X3VpbnQ2NCk6IEZpeCBjb21tZW50LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChhcHBlbmRfaW50X2ZpZWxkLCBhcHBlbmRfdWludF9maWVsZCk6IERvbid0CisJaGFyZGNvZGUgRklFTERfUkVQTFlfU0VSSUFMLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2gpCisJKF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQpOiBDYXN0IGZ1bmN0aW9uIHBvaW50ZXJzIHRvICh2b2lkICopIGZvciAlcAorCisJKiBjb25maWd1cmUuaW46IEFkZCAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EQlNEX1NPVVJDRSB0byBDRkxBR1MKKwlhbmQgZGlzYWJsZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiB3aGVuIC0tZW5hYmxlLWFuc2kgaXMgdXNlZAorCisyMDAzLTA2LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vLyouY3M6IFVzZSBJbnRQdHIuWmVybyBpbnN0ZWFkIG9mICgoSW50UHRyKSAwKQorCisyMDAzLTA2LTIzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogY29uZmlndXJlLmluOgorCSogZ2NqLy5jdnNpZ25vcmU6CisJKiBnY2ovSGVsbG8uamF2YToKKwkqIGdjai9NYWtlZmlsZS5hbToKKwkqIGdjai9UZXN0TWVzc2FnZS5qYXZhOiAoVGVzdE1lc3NhZ2UpLCAoVGVzdE1lc3NhZ2UubWFpbik6CisJKiBnY2ovb3JnLy5jdnNpZ25vcmU6CisJKiBnY2ovb3JnL01ha2VmaWxlLmFtOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC8uY3ZzaWdub3JlOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9NYWtlZmlsZS5hbToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy8uY3ZzaWdub3JlOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL01ha2VmaWxlLmFtOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL01lc3NhZ2UuamF2YTogKE1lc3NhZ2UpLAorCShNZXNzYWdlLk1lc3NhZ2UpOgorCSogZ2NqL29yZy9mcmVlZGVza3RvcC9kYnVzL25hdE1lc3NhZ2UuY2M6CisJRml4IHRoZSBidWlsZCBzeXN0ZW0uCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogYWRkIG1vcmUgYmluZGluZ3MKKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoZGJ1c190aHJlYWRzX2luaXQpOiBhbGxvdyBjYWxsaW5nIHRoaXMKKwltb3JlIHRoYW4gb25jZS4KKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9Db25uZWN0aW9uLmNzLCBtb25vL0RCdXMuY3MsIG1vbm8vRXJyb3IuY3M6CisJU3RhcnQgd3JhcHBpbmcgbW9yZSBzdHVmZi4KKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9NZXNzYWdlLmNzOiBpbXBsZW1lbnQgTWVzc2FnZS5XcmFwKCkgdGhhdCBlbnN1cmVzIHdlIG9ubHkKKwloYXZlIGEgc2luZ2xlIEMjIHdyYXBwZXIgcGVyIERCdXNNZXNzYWdlLCBhc3N1bWluZyBpdCB3b3JrcyB3aGljaAorCWl0IHByb2JhYmx5IGRvZXNuJ3QuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBuZXcKKwkoZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90KTogbmV3CisJKGRidXNfbWVzc2FnZV9zZXRfZGF0YSk6IG5ldworCShkYnVzX21lc3NhZ2VfZ2V0X2RhdGEpOiBuZXcKKworMjAwMy0wNi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmMgKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfdW5yZWYpCisJKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOiByZXdvcmsgdGhlc2UgdG8ga2VlcCBhCisJcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggc2xvdCBhbmQgYXV0b21hdGljYWxseSBtYW5hZ2UgYSBnbG9iYWwKKwlzbG90IElEIHZhcmlhYmxlIHBhc3NlZCBpbiBieSBhZGRyZXNzCisKKwkqIGJ1cy9idXMuYzogY29udmVydCB0byBuZXcgZGF0YXNsb3QgQVBJCisKKwkqIGRidXMvZGJ1cy1idXMuYzogY29udmVydCB0byBuZXcgZGF0YXNsb3QgQVBJCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBnbGliL2RidXMtZ21haW4uYzogZGl0dG8KKworCSogYnVzL3Rlc3QuYzogZGl0dG8KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogZGl0dG8KKworMjAwMy0wNi0yMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFNX1BST0dfR0NKIGFuZCBtb3ZlIEFNX1BST0dfTElCVE9PTAorCWFmdGVyIHRoZSBnY2ogY2hlY2tzIHNvIHRoYXQgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiB0YWdzCisJd2lsbCBiZSBhZGRlZCB0byBsaWJ0b29sLgorCisJKiBkYnVzLWdsaWItMS5wYy5pbjogTm8gbmVlZCB0byBzcGVjaWZ5IGFueSBpbmNsdWRlcyBzaW5jZQorCWRidXMtMS5wYy5pbiBoYXMgdGhvc2UuCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vKiwgZ2NqLyosIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuYW06CisJQ2hlY2sgaW4gbWFrZWZpbGVzIGFuZCBzdWJkaXJzIGZvciBtb25vIGFuZCBnY2ogYmluZGluZ3MuCisJTmVpdGhlciBiaW5kaW5nIGFjdHVhbGx5IGV4aXN0cywganVzdCB0cnlpbmcgdG8gZ2V0IHRocm91Z2gKKwlhbGwgdGhlIGJ1aWxkIGFuZCBvdGhlciBib3JpbmcgYml0cy4KKworMjAwMy0wNi0yMSAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IFVwZGF0ZWQuCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBMaWtld2lzZS4KKworMjAwMy0wNi0yMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2hhbmRsZV93YXRjaCk6IENoZWNrCisJZm9yIGhhbmd1cCBhbmQgZXJyb3IgYWZ0ZXIgY2hlY2tpbmcgcmVhZCBzbyB3ZSB3b24ndCBkaXNjYXJkCisJcGVuZGluZyBkYXRhIGlmIGJvdGggaGFuZ3VwIGFuZCByZWFkIGFyZSBzZXQuCisKKzIwMDMtMDYtMTkgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9tZXNzYWdlKTogSGFuZGxlIEJPT0xFQU4uCisKKwkqIHRvb2xzL2RidXMtc2VuZC5jOiBBY2NlcHQgYm90aCAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogU2FtZSBoZXJlLgorCisyMDAzLTA2LTE5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdsaWIuaDogRml4IHNvIHRoYXQgZGJ1cy1nbGliLmggY2FuIGJlIHVzZWQKKwlmcm9tIEMrKyAoUGF0Y2ggYnkgTWlsb3NsYXYgVHJtYWMpLgorCisyMDAzLTA2LTE1ICBKb2UgU2hhdyAgPGpvZUBhc3NiYXJuLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc29ja2xlbl90LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBEZWZpbmUgc29ja2xlbl90IGlmIGl0J3Mgbm90IGRlZmluZWQuCisKKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiBBZGQgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBBZGQgREJVU19YX0NGTEFHUyB0byB0aGUgSU5DTFVERVMgc2luY2UKKwlkYnVzLWxhdW5jaCBuZWVkcyBpdC4KKworMjAwMy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGRvbid0IHVzZQorCVNVTl9MRU4sIGl0IGJyZWFrcyBhYnN0cmFjdCBzb2NrZXQgdXNhZ2UKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlX3JlYWwpOiBvbmx5IHByaW50IFBJRCBhdAorCXN0YXJ0cyBvZiBsaW5lcy4KKworMjAwMy0wNi0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBhbGxvdyBhYnN0cmFjdCBzb2NrZXRzCisJdXNpbmcgdW5peDphYnN0cmFjdD0vZm9vLCBhbmQgd2hlbiBsaXN0ZW5pbmcgaW4gYSB0bXBkaXIKKwlpLmUuIHVuaXg6dG1wZGlyPS90bXAsIGFsd2F5cyB1c2UgYWJzdHJhY3Qgc29ja2V0cyBpZiB3ZSBjYW4uCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBzdXBwb3J0CisJdW5peDphYnN0cmFjdD0vZm9vCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlzdXBwb3J0IGFic3RyYWN0IHNvY2tldHMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCk6IHN1cHBvcnQgYWJzdHJhY3Qgc29ja2V0cworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0KTogYWRkICJhYnN0cmFjdCIKKwl0b2dnbGUgYXMgYW4gYXJndW1lbnQsIGltcGxlbWVudCBhYnN0cmFjdCBuYW1lc3BhY2Ugc3VwcG9ydAorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBkaXR0bworCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1hYnN0cmFjdC1zb2NrZXRzIGFuZCBpbXBsZW1lbnQKKwlhIGNvbmZpZ3VyZSBjaGVjayBmb3IgYXV0b2RldGVjdGlvbiBvZiB0aGUgcmlnaHQgdmFsdWUuCisKKzIwMDMtMDYtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmM6IGFkZCB1dGlsaXR5IHRvIGNsZWFuIHVwIHNvY2tldHMKKwlpbiAvdG1wICh0aG91Z2ggb24gTGludXggdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VsZXNzLAorCXdoZW4gd2UgYWRkIGFic3RyYWN0IG5hbWVzcGFjZSBzdXBwb3J0KQorCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBEQlVTX1NFU1NJT05fU09DS0VUX0RJUiBpbiBhZGRpdGlvbiB0bworCXN1YnN0J2luZyBpdAorCisyMDAzLTA1LTI4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYyAobWFpbik6IEZpeCBzaWxseSB0eXBvIChzLy0tc2Vzc2lvbi8tLXN5c3RlbS8pLgorCisyMDAzLTA1LTE4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ldyk6IFJlbW92ZSBAdG9kby4KKworMjAwMy0wNS0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAZ251Lm9yZz4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmM6IERvbid0IGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlIGlmIC0taGVscCB3YXMKKwlwYXNzZWQuICBEZWZhdWx0IHRvIHVzaW5nIHRoZSBzZXNzaW9uIGJ1cyBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0KKwlvbmUuCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IERpdHRvLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogRGl0dG8uCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBVcGRhdGUgd2l0aCBuZXcgYXJndW1lbnRzLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBFbWl0IGNvZGUgdG8gZXhwb3J0IHZhcmlhYmxlcy4gIE5ldworCWFyZ3VtZW50cyAtcyBhbmQgLWMgdG8gc3BlY2lmeSBzaGVsbCBzeW50YXgsIGFuZCBhIGJpdCBvZiBjb2RlIHRvCisJYXV0b2RldGVjdCBzeW50YXguICBBbHNvLCBhbGxvdyBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSB0byBydW4uCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IFVwZGF0ZSB3aXRoIG5ldyBhcmd1bWVudHMuCisKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IERpdHRvLgorCisyMDAzLTA1LTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChtZXJnZV9pbmNsdWRlZCk6IG1lcmdlIGluIHBvbGljaWVzIGZyb20KKwljaGlsZCBjb25maWd1cmF0aW9uIGZpbGUuCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV9tZXJnZSk6IGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBwb2xpY2llcworCXRvZ2V0aGVyCisKKzIwMDMtMDUtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBkaXNhYmxlIHZlcmJvc2UgbG9jayBzcGV3CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jOiBhZGQgLS1wcmludC1yZXBseSBjb21tYW5kIGxpbmUgb3B0aW9uCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIChwcmludF9tZXNzYWdlKTogbmV3IHV0aWwgZnVuY3Rpb24KKwlzaGFyZWQgYnkgZGJ1cy1zZW5kIGFuZCBkYnVzLW1vbml0b3IKKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKGhhbmRsZXJfZnVuYyk6IGV4aXQgb24gZGlzY29ubmVjdAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoZG9fcmVhZGluZyk6IGlmIHRoZSB0cmFuc3BvcnQgaXMKKwlkaXNjb25uZWN0ZWQsIGRvbid0IHRyeSB0byB1c2UgdGhlIHJlYWRfd2F0Y2gKKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQpOiBhc3NlcnQgd2F0Y2ggIT0gTlVMTAorCXNvIHdlIGNhbiBmaW5kIHRoaXMgYnVnIG1vcmUgZWFzaWx5CisKKzIwMDMtMDUtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmMgKGZyZWVfcnVsZV9saXN0X2Z1bmMpOiBhdm9pZCBhIGNyYXNoIHdoZW4gcGFzc2VkCisJTlVMTCBhcyBEQnVzSGFzaFRhYmxlIGlzIGFubm95aW5nbHkgbGlrZWx5IHRvIGRvLgorCisyMDAzLTA1LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogQWRkIC0tc2Vzc2lvbiBhcmd1bWVudCBhbmQgdXNhZ2UoKQorCWZ1bmN0aW9uLgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuMTogVXBkYXRlIHdpdGggbmV3IC0tc2Vzc2lvbiBhcmcuCisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiBDcmVhdGUKKwkkKGxpYmRpcikvZGJ1cy0xLjAvc2VydmljZXMgc28gdGhhdCB0aGUgc2Vzc2lvbiBidXMgaXMgaGFwcHkuCisKKzIwMDMtMDUtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hdG9taWNfZGVjLCBfZGJ1c19hdG9taWNfaW5jKTogd29yaworCW9uIG5vbi14ODYuIGlmZGVmJ3MgYXJlIGV2aWwuCisKKzIwMDMtMDUtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuMTEKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5pdGRkaXIpOiBhcHBhcmVudGx5IHdlIGFyZSBzdXBwb3NlZCB0byBwdXQKKwlpbml0IHNjcmlwdHMgaW4gL2V0Yy9yYy5kL2luaXQuZCBub3QgL2V0Yy9pbml0LmQKKworCSogYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgdGhlICJ5b3UgbXVzdCAtLWVuYWJsZS10ZXN0cyB0byBtYWtlCisJY2hlY2siIGFzIGl0IGJyb2tlIGRpc3RjaGVjaworCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogY3JlYXRlIC9ldGMvZGJ1cy0xL3N5c3RlbS5kCisKKzIwMDMtMDUtMTMgIEphbWVzIFdpbGxjb3ggIDxqd2lsbGNveEBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQpLAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9jcmVhdGVkKSwgKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCksCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKToKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46CisJKiBkYnVzL2RidXMtYnVzLmM6IChkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UpLAorCShkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyksIChkYnVzX2J1c19hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGRidXMvZGJ1cy1idXMuaDoKKworCUFkZCBzb21lIGNvbnZlbmllbmNlIEFQSSB3aGljaCBsZXRzIHlvdSBhY3RpdmF0ZSBhIHNlcnZpY2UsIGFuZCBkaWQgYQorCWJ1bmNoIG9mIHMvMC9EQlVTX1RZUEVfSU5WQUxJRC8gaW4gY2FsbHMgdG8gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCkKKwlhbmQgZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkKKworMjAwMy0wNS0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBmaXggdG8gYXZvaWQKKwljYWxsaW5nIF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKCkgZm9yIGV2ZXJ5IGJ5dGUgaW4gYSBieXRlCisJYXJyYXksIGV0Yy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOiB1c2UgYXRvbWljIHJlZmVyZW5jZSBjb3VudGluZyB0bworCXJlZHVjZSBudW1iZXIgb2YgbG9ja3Mgc2xpZ2h0bHk7IHRoZSBnbG9iYWwgbG9jayBpbiBoZXJlIHN1Y2tzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2spOiB2YXJpYW50IG9mCisJdXBkYXRlX2Rpc3BhdGNoX3N0YXR1cyB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQ7IHRoZW4gdXNlCisJaW4gYSBjb3VwbGUgcGxhY2VzIHRvIHJlZHVjZSBsb2NraW5nL3VubG9ja2luZworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IGhvbGQgdGhlIGxvY2sgb3ZlciB0aGUgd2hvbGUgZnVuY3Rpb24KKwlpbnN0ZWFkIG9mIGFjcXVpcmluZyBpdCB0d2ljZS4KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuYyAoX2RidXNfdGltZW91dF9uZXcpOiBoYW5kbGUgT09NCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogZml4IGFjY2VzcworCXRvIGFscmVhZHktZnJlZWQgbWVtb3J5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBrZWVwIGEgbGl0dGxlIGNhY2hlIG9mIGxpbmtlZCBsaXN0CisJbm9kZXMsIHRvIGF2b2lkIHVzaW5nIHRoZSBnbG9iYWwgbGlua2VkIGxpc3QgYWxsb2MgbG9jayBpbiB0aGUKKwlub3JtYWwgc2VuZC1tZXNzYWdlIGNhc2UuIEluc3RlYWQgd2UganVzdCB1c2UgdGhlIGNvbm5lY3Rpb24gbG9jaworCXRoYXQgd2UgYWxyZWFkeSBoYXZlIHRvIHRha2UuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfZmluZF9sYXN0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2F0b21pY19pbmMsIF9kYnVzX2F0b21pY19kZWMpOgorCWNoYW5nZSB0byB1c2UgYSBzdHJ1Y3QgZm9yIHRoZSBhdG9taWMgdHlwZTsgZml4IGRvY3MsCisJdGhleSByZXR1cm4gdmFsdWUgYmVmb3JlIGluY3JlbWVudCwgbm90IGFmdGVyIGluY3JlbWVudC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYXBwZW5kXzRfYWxpZ25lZCkKKwkoX2RidXNfc3RyaW5nX2FwcGVuZF84X2FsaWduZWQpOiBuZXcgZnVuY3Rpb25zIHRvIHRyeSB0bworCW1pY3Jvb3B0aW1pemUgdGhpcyBvcGVyYXRpb24uCisJKHJlYWxsb2NhdGVfZm9yX2xlbmd0aCk6IGJyZWFrIHRoaXMgb3V0IG9mIHNldF9sZW5ndGgoKSwgdG8KKwlpbXByb3ZlIHByb2ZpbGUgaW5mbywgYW5kIGFsc28gc28gd2UgY2FuIGNvbnNpZGVyIGlubGluaW5nIHRoZQorCXNldF9sZW5ndGgoKSBwYXJ0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcik6IGluaXQgZGF0YQorCXN0cmluZ3Mgd2l0aCBzb21lIHByZWFsbG9jYXRpb24sIGN1dHMgZG93biBvbiBvdXIgY2FsbHMgdG8gcmVhbGxvYworCWEgZmFpciBiaXQuIFRob3VnaCBpZiB3ZSBjYW4gZ2V0IHRoZSAibW92ZSBlbnRpcmUgc3RyaW5nIHRvIGVtcHR5CisJc3RyaW5nIiBvcHRpbWl6YXRpb24gYmVsb3cgdG8ga2ljayBpbiBoZXJlLCBpdCB3b3VsZCBiZSBiZXR0ZXIuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX21vdmUpOiBqdXN0IGNhbGwKKwlfZGJ1c19zdHJpbmdfbW92ZV9sZW4KKwkoX2RidXNfc3RyaW5nX21vdmVfbGVuKTogYWRkIGEgc3BlY2lhbCBjYXNlIGZvciBtb3ZpbmcKKwlhbiBlbnRpcmUgc3RyaW5nIGludG8gYW4gZW1wdHkgc3RyaW5nOyB3ZSBjYW4ganVzdAorCXN3YXAgdGhlIHN0cmluZyBkYXRhIGluc3RlYWQgb2YgZG9pbmcgYW55IHJlYWxsb2NzLgorCShfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wNS0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVdyaXRlIGEgInRlc3QtcHJvZmlsZSIgdGhhdCBkb2VzIGVjaG8gY2xpZW50LXNlcnZlciB3aXRoIHRocmVhZHM7CisJcHJvZmlsZSByZXZlYWxzIGxvY2sgY29udGVudGlvbiwgbWVtY3B5L3JlYWxsb2Mgb2YgYnVmZmVycywgYW5kCisJVVRGLTggdmFsaWRhdGlvbiBhcyBob3Qgc3BvdHMuIDIwJSBvZiBsb2NrIGNvbnRlbnRpb24gZWxpbWluYXRlZAorCXdpdGggZGJ1c19hdG9taWNfaW5jL2RlYyBpbXBsZW1lbnRhdGlvbiBvbiB4ODYuICBNdWNoIHJlbWFpbmluZworCWNvbnRlbnRpb24gaXMgZ2xvYmFsIG1lbXBvb2wgbG9ja3MgZm9yIEdMaXN0IGFuZCBEQnVzTGlzdC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYXRvbWljX2luYywgX2RidXNfYXRvbWljX2RlYyk6IGFkZAorCXg4NiBpbXBsZW1lbnRhdGlvbgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24pOiB1c2UKKwlkYnVzX2F0b21pY190IGZvciB0aGUgcmVmZXJlbmNlIGNvdW50CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKHN0cnVjdCBEQnVzTWVzc2FnZSk6IGRlY2xhcmUKKwlkYnVzX2F0b21pY190IHZhbHVlcyBhcyB2b2xhdGlsZQorCisJKiBjb25maWd1cmUuaW46IGNvZGUgdG8gZGV0ZWN0IGFiaWxpdHkgdG8gdXNlIGF0b21pYyBpbnRlZ2VyCisJb3BlcmF0aW9ucyBpbiBhc3NlbWJseSwgZnJvbSBHTGliIHBhdGNoCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogY2FsbCBnZXRwaWQgZXZlcnkKKwl0aW1lLCB0aXJlZCBvZiBpdCBiZWluZyB3cm9uZyBpbiB0aHJlYWRzIGFuZCBmb3JrZWQgcHJvY2Vzc2VzCisKKwkqIGdsaWIvdGVzdC1wcm9maWxlLmM6IGEgbGl0dGxlIHByb2dyYW0gdG8gYm91bmNlIG1lc3NhZ2VzIGJhY2sKKwlhbmQgZm9ydGggYmV0d2VlbiB0aHJlYWRzIGFuZCBlYXQgQ1BVCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGFkZCBkZWJ1ZyBzcGV3IG1hY3JvcyBmb3IgZGVidWdnaW5nCisJdGhyZWFkIGxvY2tzOyBpbmNsdWRlIGNvbmZpZy5oIGF0IHRvcDsgZml4IGRlYWRsb2NrIGluCisJZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkKKworMjAwMy0wNS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmM6IHMvX2V4aXQvZXhpdC8gYmVjYXVzZSBpdCB3YXMga2VlcGluZyBnY292CisJZGF0YSBmcm9tIGdldHRpbmcgd3JpdHRlbiwgYW5kIHRoZXJlIHdhc24ndCBhIGdvb2QgcmVhc29uIHRvCisJdXNlIF9leGl0IHJlYWxseS4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jIChtYXJrX2luc2lkZV9kYnVzX2J1aWxkX3Rlc3RzKTogZG9uJ3QgY291bnQKKwlkYnVzX3ZlcmJvc2UgbGluZXMgaW4gdGVzdCBjb3ZlcmFnZQorCShtYWluKTogYWRkIGxpc3Qgb2YgZnVuY3Rpb25zIHNvcnRlZCBieSAjIG9mIHVudGVzdGVkIGJsb2NrcworCXRvIHRoZSBjb3ZlcmFnZSByZXBvcnQKKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYzogcHV0IHNvbWUgdGVzdC1vbmx5IGNvZGUgaW4gREJVU19CVUlMRF9URVNUUworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3Rlc3QpOiBleHRlbmQgdGVzdCBjb3ZlcmFnZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmMgKF9kYnVzX21lc3NhZ2VfaGFuZGxlcl90ZXN0KToKKwlleHRlbmQgdGVzdCBjb3ZlcmFnZQorCisJKiB0ZXN0L2RhdGEvYXV0aC9jYW5jZWwuYXV0aC1zY3JpcHQ6IHRlc3QgY2FuY2VsaW5nIGFuCisJYXV0aGVudGljYXRpb24KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogcmVtb3ZlIGRidXMtc2VydmVyLWRlYnVnLltoY10gZm9yIG5vdywgYXMgdGhleQorCWFyZW4ndCB1c2VkLiBpbiBDVlMgaGlzdG9yeSBpZiB3ZSBlbmQgdXAgbmVlZGluZyB0aGVtLgorCisyMDAzLTA1LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmMgKF9kYnVzX21lc3NhZ2VfaGFuZGxlcl90ZXN0KTogYWRkCisJdW5pdCB0ZXN0CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpOiBmaXggdGhpcworCWZ1bmN0aW9uLCB3aGljaCBhc3N1bWVkIGxlbmd0aCB3YXMgaW4gIyBvZiBzdHJpbmdzLCBub3QgYnl0ZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV90ZXN0KTogYWRkIHRlc3RzIGZvciBzb21lCisJbWlzc2luZyBjb3ZlcmFnZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZSk6IGRpc2FibGUgZnVuY3Rpb24gZm9yCisJbm93LCB3ZSBhcmUgb25seSB1c2luZyBpdCBpbiB0ZXN0IG1vZGUKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMpOgorCXJlbW92ZSBhIG1pc3Rha2VuIEZJWE1FCisKKzIwMDMtMDUtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKToKKwl1bmxvY2sgbXV0ZXggb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHBhdGNoIGZyb20gQW5kZXJzIEd1c3RhZnNzb24KKworMjAwMy0wNS0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy1nbGliLTEucGMuaW4gKFJlcXVpcmVzKTogZml4IGRlcGVuZGVuY2llcywgZnJvbQorCUFuZGVycyBHdXN0YWZzc29uCisKKzIwMDMtMDUtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGltcGxlbWVudAorCisJKiBidXMvbWFpbi5jIChtYWluKSwgYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOgorCWltcGxlbWVudCAtLXByaW50LXBpZCBhbmQgLS1mb3JrCisKKzIwMDMtMDUtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChkYnVzX3BhcnNlX2FkZHJlc3MpOiBmaXggYnVnIHdoZW4gYSBrZXkgaW4KKwl0aGUgYWRkcmVzcyBoYWQgbm8gdmFsdWUsIGFuZCBhZGQgdG8gdGVzdCBzdWl0ZS4gRml4IGFuZAorCXJlZ3Jlc3Npb24gdGVzdCBmcm9tIE1pbG9zbGF2IFRybWFjCisKKzIwMDMtMDUtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2hhbmRsZSk6IHdhcm4gYW5kIHJldHVybiBpZiBhCisJd2F0Y2ggaXMgaW52YWxpZCB3aGVuIGhhbmRsZWQKKworCSogdG9vbHMvTWFrZWZpbGUuYW0sIHRvb2xzL2RidXMtbGF1bmNoLmMsIHRvb2xzL2RidXMtbGF1bmNoLjE6IGFkZAorCWRidXMtbGF1bmNoIHV0aWxpdHkgdG8gbGF1bmNoIHRoZSBidXMgZnJvbSBhIHNoZWxsIHNjcmlwdC4gIERpZG4ndAorCWFjdHVhbGx5IGltcGxlbWVudCBkYnVzLWxhdW5jaCB5ZXQsIGl0J3MganVzdCBhIHBsYWNlaG9sZGVyIHN0aWxsLgorCisyMDAzLTA1LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0sIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IG1hbiBwYWdlIGZvciB0aGUKKwlkYWVtb247IGFsc28gZG9jdW1lbnRzIGRhZW1vbiBjb25maWcgZmlsZSwgc28gcmVwbGFjZXMKKwlkb2MvY29uZmlnLWZpbGUudHh0LiBDb3JyZWN0ZWQgc29tZSBzdHVmZiBmcm9tIGNvbmZpZy1maWxlLnR4dCBpbgorCXRoZSBwcm9jZXNzIG9mIG1vdmluZyBpdC4KKworMjAwMy0wNS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdG9vbHMvTWFrZWZpbGUuYW0sIHRvb2xzL2RidXMtc2VuZC4xLCB0b29scy9kYnVzLW1vbml0b3IuMToKKwlhZGQgc29tZSBtYW4gcGFnZXMKKworMjAwMy0wNS0wMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZmlsbF91c2VyX2luZm8pOiBUZXN0IGFnYWluc3QKKwlEQlVTX1VJRF9VTlNFVCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBkbyBhIHVpZCBsb29rdXAgb3Igbm90LgorCisJKiBNYWtlZmlsZS5hbTogVXBkYXRlIHRvIHVzZSBuZXcgLnBjIHZlcnNpb25pbmcgc2NoZW1lLgorCisyMDAzLTA1LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOiBhbGxvdyBzZW5kL3JlY2VpdmUgdG8vZnJvbSBtZXNzYWdlIGJ1cworCXNlcnZpY2UKKworMjAwMy0wNC0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogcHJpbnQgYSBub3RlIHdoZW4gYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGFuZAorCXdpdGhvdXQgYXNzZXJ0aW9ucworCisyMDAzLTA0LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IGFkZCBhIGNoZWNrLWxvY2FsIHRoYXQgY29tcGxhaW5zIGlmIHlvdSBkaWRuJ3QKKwljb25maWd1cmUgd2l0aCAtLWVuYWJsZS10ZXN0cworCisyMDAzLTA0LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGRvY3MgY2xlYW51cHMKKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGFkZCBkb2NzIG9uIGludDY0IHR5cGVzCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogZml4IGRvY3MgdG8gYXZvaWQgcHV0dGluZyBwcml2YXRlIEFQSSBpbgorCXB1YmxpYyBBUEkgZG9jcyBzZWN0aW9uCisKKzIwMDMtMDQtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzLTEucGMuaW4sIGRidXMtZ2xpYi0xLnBjLmluOiByZW5hbWUgdGhlc2UgZnJvbQorCWRidXMtMS4wLnBjLmluLCBkYnVzLWdsaWItMS4wLnBjLmluLiBBcyB0aGVzZSBjaGFuZ2Ugd2l0aCB0aGUKKwlwYXJhbGxlbCBpbnN0YWxsIEFQSSB2ZXJzaW9uLCBub3Qgd2l0aCB0aGUgRC1CVVMgcGFja2FnZSB2ZXJzaW9uLgorCisJKiBIQUNLSU5HOiBtb3ZlIHNvbWUgb2YgUkVBRE1FIG92ZXIgaGVyZQorCisJKiBSRUFETUU6IHVwZGF0ZXMsIGFuZCBkb2N1bWVudCBBUEkvQUJJIHBvbGljeQorCisJKiBjb25maWd1cmUuaW46IHJlaW5kZW50YXRpb24KKworMjAwMy0wNC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy5oOiBhZGQgInlvdSBoYXZlIHRvIGRlZmluZSBEQlVTX0FQSV9TVUJKRUNUX1RPX0NIQU5HRQorCXRvIHVzZSB0aGlzIGxpYnJhcnkiIHRvIGJlIHN1cmUgcGVvcGxlIGhhdmUgdGhlIHJpZ2h0CisJZXhwZWN0YXRpb25zLgorCisyMDAzLTA0LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtZG9jcyB3aGljaCBieSBkZWZhdWx0IGlzIGF1dG8geWVzIGlmCisJZG94eWdlbiBhbmQgZGIyaHRtbCBmb3VuZCwgbm8gb3RoZXJ3aXNlOyBidXQgY2FuIGJlIGZvcmNlZCBvbi9vZmYKKworCSogZG9jL01ha2VmaWxlLmFtOiBjb25kaXRpb25hbGl6ZSB3aGV0aGVyIHRvIGJ1aWxkIGRvY3Mgb24KKwktLWVuYWJsZS1kb2NzCisKKzIwMDMtMDQtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuMTAKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWRkIDxpbmNsdWRlZGlyPnN5c3RlbS5kPC9pbmNsdWRlZGlyPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMgKF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwKTogZml4IGJ1ZyB3aGVuCisJdXNlcm5hbWUgd2FzIHByb3ZpZGVkIGJ1dCBub3QgdWlkCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpOiBrZWVwIHRyYWNrIG9mCisJd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvcGxldmVsIG9yIHdhcyBpbmNsdWRlZDsgY2hhbmdlIHNvbWUKKwlvZiB0aGUgZXJyb3IgaGFuZGxpbmcgaWYgaXQncyBpbmNsdWRlZC4KKworMjAwMy0wNC0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVVuYnJlYWsgbXkgY29kZS4uLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzKToKKwlyZXBvcnQgY29ycmVjdCBzdGF0dXMgaWYgd2UgZmluaXNoIHByb2Nlc3NpbmcgYXV0aGVudGljYXRpb24KKwlpbnNpZGUgdGhpcyBmdW5jdGlvbi4KKworCSogYnVzL2FjdGl2YXRpb24uYyAodHJ5X3NlbmRfYWN0aXZhdGlvbl9mYWlsdXJlKTogdXNlCisJYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2dyb3Vwcyk6IHJldHVybiBhbiBlcnJvcgorCWV4cGxhaW5pbmcgdGhlIHByb2JsZW0KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBpbXBsZW1lbnQKKwlyZXN0cmljdGlvbiBoZXJlIHRoYXQgaW5hY3RpdmUgY29ubmVjdGlvbnMgY2FuIG9ubHkgc2VuZCB0aGUKKwloZWxsbyBtZXNzYWdlLiBBbHNvLCBhbGxvdyBidXMgZHJpdmVyIHRvIHNlbmQgYW55dGhpbmcgdG8KKwlhbnkgcmVjaXBpZW50LgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9jb21wbGV0ZSk6IGNyZWF0ZSB0aGUKKwlCdXNDbGllbnRQb2xpY3kgaGVyZSBpbnN0ZWFkIG9mIG9uLWRlbWFuZC4KKwkoYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSk6IGRvbid0IHJldHVybiBhbiBlcnJvcgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3JlcGx5KTogYWxsb3cgTlVMTAorCXNlbmRlciBmaWVsZCBpbiBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBmaXggc2lsbHkgdHlwbworCWNhdXNpbmcgaXQgdG8gcmV0dXJuIEZBTFNFIGFsd2F5cworCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kKTogZml4IGJ1ZyB3aGVyZQorCXdlIGNoZWNrZWQgc2VuZGVyIHJhdGhlciB0aGFuIGRlc3RpbmF0aW9uCisKKzIwMDMtMDQtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIHRlc3Qgc3VpdGUgaXMgc2xpZ2h0bHkgaG9zZWQgYXQgdGhlIG1vbWVudCwgd2lsbCBmaXggc29vbgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUpOiBmaXggdG8KKwlwcm9wZXJseSBkaXNhYmxlIHRoZSB0aW1lb3V0IHdoZW4gcmVxdWlyZWQKKwkoYnVzX2Nvbm5lY3Rpb25fc2V0X25hbWUpOiBjaGVjayB3aGV0aGVyIHdlIGNhbiByZW1vdmUgaW5jb21wbGV0ZQorCWNvbm5lY3Rpb25zIHRpbWVvdXQgYWZ0ZXIgd2UgY29tcGxldGUgZWFjaCBjb25uZWN0aW9uLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoY2hlY2tfdGltZW91dCk6IGZpeCB0aGlzIHVwIGEgYml0LAorCXByb2JhYmx5IHN0aWxsIGJyb2tlbi4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBpbXBsZW1lbnQgbWF4CisJbnVtYmVyIG9mIHNlcnZpY2VzIG93bmVkLCBhbmQgaG9ub3IgYWxsb3cvZGVueSBydWxlcyBvbiB3aGljaAorCXNlcnZpY2VzIGEgY29ubmVjdGlvbiBjYW4gb3duLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5KTogcmVwb3J0IGVycm9ycyBoZXJlCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGltcGxlbWVudCBsaW1pdCBvbiBudW1iZXIgb2YgcGVuZGluZworCWFjdGl2YXRpb25zCisKKzIwMDMtMDQtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyKTogZml4IGJ1ZworCXdoZXJlIHdlIHVzZWQgPj0gMCBpbnN0ZWFkIG9mICE9IERCVVNfVUlEX1VOU0VULgorCisyMDAzLTA0LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKHJlbW92ZV93YXRjaCk6IGZpeCBmb3IgYSBjcmFzaCB3aGVuIHdhdGNoZXMKKwl3ZXJlIHRvZ2dsZWQgd2l0aG91dCBhZGQvcmVtb3ZlLCBmaXggZnJvbSBBbmRlcnMgR3VzdGFmc3NvbgorCisyMDAzLTA0LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mOiBhZGQgPGxpbWl0PiB0YWdzIHRvCisJdGhpcyB0ZXN0CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmgsIGJ1cy9jb25maWctcGFyc2VyLmMsIGJ1cy9idXMuYzogSW1wbGVtZW50CisJPGxpbWl0PiB0YWcgaW4gY29uZmlndXJhdGlvbiBmaWxlLgorCisyMDAzLTA0LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IHNvbWVob3cgbWlzc2VkIHNvbWUgbmFtZV9pcworCisJKiBkYnVzL2RidXMtdGltZW91dC5jIChfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkKQorCShfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCk6IG5ldworCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbik6IHJlY29yZCB0aW1lCisJd2hlbiBlYWNoIGNvbm5lY3Rpb24gaXMgZmlyc3Qgc2V0IHVwLCBhbmQgZXhwaXJlIHRoZW0gYWZ0ZXIgdGhlCisJYXV0aCB0aW1lb3V0IHBhc3Nlcy4KKworMjAwMy0wNC0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9uYW1lX2lzKTogcmVuYW1lCisJKGRidXNfbWVzc2FnZV9zZXJ2aWNlX2lzKTogcmVuYW1lCisJKGRidXNfbWVzc2FnZV9zZW5kZXJfaXMpOiByZW5hbWUKKwkoZGJ1c19tZXNzYWdlX2dldF9zZXJ2aWNlKTogcmVuYW1lCisKKzIwMDMtMDQtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1jaGVja3MKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ldyk6IHJldmVyc2UgbmFtZS9zZXJ2aWNlIGFyZ3VtZW50cworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCk6IGZpeAorCXRvIHVzZSB0aHJlYWQgbG9ja3MuCisJKF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlcl9kZXN0cm95ZWRfbG9ja2VkKTogbW92ZSBzb21lIHByaXZhdGUKKwlmdW5jdGlvbnMgaW50byBwcm9wZXIgZG9jcyBncm91cAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBfZGJ1c19yZXR1cm5faWZfZmFpbCwKKwlfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwKKworCVRocm91Z2hvdXQ6IHVzZSBkYnVzX3JldHVybl9pZl9mYWlsCisKKzIwMDMtMDQtMjMgIEphbWVzIFdpbGxjb3ggIDxqd2lsbGNveEBnbm9tZS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKGFkZF90aW1lb3V0KSwgKHdha2V1cF9tYWluKSwgKGNyZWF0ZV9zb3VyY2UpLAorCShkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4pLAorCShkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbik6CisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtYWluKToKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6IChtYWluKToKKwkqIGdsaWIvdGVzdC10aHJlYWQtc2VydmVyLmM6IChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayksIChtYWluKToKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jOiAobWFpbik6CisKKwlBZGRlZCBhIEdNYWluQ29udGV4dCBhcmd1bWVudCB0byBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4oKQorCWFuZCBkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbigpLgorCisyMDAzLTA0LTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGRvY3VtZW50IHRoZSByZXN0cmljdGlvbnMgb24KKwltZXNzYWdlIGFuZCBzZXJ2aWNlIG5hbWVzCisKKzIwMDMtMDQtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jLCBkYnVzL2RidXMtbWFyc2hhbC5jOiBhZGQgNjQtYml0IGludGVnZXIKKwlzdXBwb3J0LCBhbmQgZG8gc29tZSBjb2RlIGNsZWFudXBzIHRvIHNoYXJlIG1vcmUgY29kZSBhbmQKKwlzcGVlZCB1cCBhcnJheSBtYXJzaGFsL2RlbWFyc2hhbC4KKworCSogZGJ1cy0xLjAucGMuaW4gKENmbGFncyk6IHB1dCBsaWJkaXIgaW5jbHVkZSBmaWxlIGluIGNmbGFncworCisJKiBjb25maWd1cmUuaW46IGdlbmVyYXRlIGRidXMtYXJjaC1kZXBzLmgKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfVFlQRV9JTlQ2NCwgREJVU19UWVBFX1VJTlQ2NCk6IGFkZAorCTY0LWJpdCB0eXBlY29kZXMKKworMjAwMy0wNC0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9vcHBvc2l0ZS1lbmRpYW4ubWVzc2FnZTogZml4IHRlc3QKKwl0byB1c2UgcHJvcGVyIHR5cGUgZm9yIHJwbHkgZmllbGQKKworICAgICAgICAqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzOiBhZGQgdGVzdHMgZm9yIGJlbG93IHZhbGlkYXRpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX2hlYWRlcl9kYXRhKTogdmFsaWRhdGUgZmllbGQgdHlwZXMsCisJYW5kIHZhbGlkYXRlIHRoYXQgbmFtZWQgZmllbGRzIGFyZSB2YWxpZCBuYW1lcworCShkZWNvZGVfbmFtZV9maWVsZCk6IGNvbnNpZGVyIG1lc3NhZ2VzIGluIHRoZQorCW9yZy5mcmVlZGVza3RvcC5Mb2NhbC4gbmFtZXNwYWNlIHRvIGJlIGludmFsaWQuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX25hbWUpOiBuZXcKKworMjAwMy0wNC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6IGNoZWNrIGxpbWl0cyBhbmQKKwlyZXR1cm4gYW4gZXJyb3IgaWYgdGhleSBhcmUgZXhjZWVkZWQuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IG1haW50YWluIHNlcGFyYXRlIGxpc3RzIG9mIGFjdGl2ZSBhbmQgaW5hY3RpdmUKKwljb25uZWN0aW9ucywgYW5kIGEgY291bnQgb2YgZWFjaC4gTWFpbnRhaW4gY291bnQgb2YgY29tcGxldGVkCisJY29ubmVjdGlvbnMgcGVyIHVzZXIuIEltcGxlbWVudCBjb2RlIHRvIGNoZWNrIGNvbm5lY3Rpb24gbGltaXRzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X3VubGluayk6IGV4cG9ydAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IGVuZm9yY2UgYSBtYXhpbXVtCisJbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBhIGNvbm5lY3Rpb24KKworMjAwMy0wNC0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAocmVjb3JkX21lY2hhbmlzbXMpOiBtZW1sZWFrIGZpeGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBmaXggc29tZQorCW1lbWxlYWtzCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKGFkZF9uZXdfa2V5KTogZml4IGEgbWVtbGVhaywgYW5kCisJb24gcmVhbGxvYyBiZSBzdXJlIHRvIHVwZGF0ZSB0aGUgcG9pbnRlciBpbiB0aGUga2V5cmluZworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ196ZXJvKTogY29tcGVuc2F0ZSBmb3IgYWxpZ24KKwlvZmZzZXQgdG8gYXZvaWQgd3JpdGluZyB0byB1bmFsbG9jYXRlZCBtZW1vcnkKKworCSogZGJ1cy9kYnVzLWF1dGguYyAocHJvY2Vzc19yZWplY3RlZCk6IHJldHVybiBGQUxTRSBpZiB3ZSBmYWlsIHRvCisJdHJ5IHRoZSBuZXh0IG1lY2hhbmlzbSwgc28gd2UgcHJvcGVybHkgaGFuZGxlIE9PTQorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogZml4IGRvdWJsZS1mcmVlCisJb24gT09NLgorCShfZGJ1c19rZXlyaW5nX25ldyk6IGZpeCBPT00gYnVnCisJKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpOiBhbHdheXMgc2V0IGVycm9yOyBpbXBvc2UgYSBtYXhpbXVtCisJbnVtYmVyIG9mIGtleXMgd2UnbGwgbG9hZCBmcm9tIHRoZSBmaWxlLCBtb3N0bHkgdG8gc3BlZWQgdXAgdGhlCisJdGVzdCBzdWl0ZSBhbmQgbWFrZSBpdHMgT09NIGNoZWNrcyBtb3JlIHVzZWZ1bCwgYnV0IGFsc28gZm9yCisJZ2VuZXJhbCBzYW5pdHkuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfZXJyb3Jfc2VydmVyKTogcmVqZWN0IGF1dGhlbnRpY2F0aW9uCisJaWYgd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlIGNsaWVudAorCShwcm9jZXNzX2NhbmNlbCk6IG9uIGNhbmNlbCwgc2VuZCBSRUpFQ1RFRCwgcGVyIHRoZSBzcGVjCisJKHByb2Nlc3NfZXJyb3JfY2xpZW50KTogc2VuZCBDQU5DRUwgaWYgd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlCisJc2VydmVyLgorCisyMDAzLTA0LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9pdGVyYXRlKTogZml4IFVNUiBpbiB2ZXJib3NlCisJZGVidWcgc3BldworCisJKiBkYnVzL2RidXMtYXV0aC5jIChoYW5kbGVfY2xpZW50X2RhdGFfY29va2llX3NoYTFfbWVjaCk6IGZpeCBPT00KKwloYW5kbGluZyBwcm9ibGVtCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpOiBvbmx5IHdoaW5lCisJYWJvdXQgREJVU19URVNUX0hPTUVESVIgb25jZQorCisJKiBidXMvTWFrZWZpbGUuYW0gKFRFU1RTX0VOVklST05NRU5UKTogcHV0IERCVVNfVEVTVF9IT01FRElSIGluCisJdGhlIGVudmlyb25tZW50CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfc2hhMV90ZXN0KTogYWN0dWFsbHkgbG9hZCBzaGExCisJY29uZmlnIGZpbGUgc28gd2UgdGVzdCB0aGUgcmlnaHQgdGhpbmcKKworCVRocm91Z2hvdXQ6IGFzc29ydGVkIGRvY3MgaW1wcm92ZW1lbnRzCisKKzIwMDMtMDQtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byB3YXRjaCBjaGFuZ2VzCisKKwkqIGJ1cy9idXMuYywgYnVzL2FjdGl2YXRpb24uYywgZXRjLjogYWRqdXN0IHRvIHdhdGNoIGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLXNlcnZlci5oOiByZW1vdmUgZGJ1c19zZXJ2ZXJfaGFuZGxlX3dhdGNoCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IHJlbW92ZSBkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2hhbmRsZSk6IGNoYW5nZSBEQnVzV2F0Y2ggdG8gd29yaworCWxpa2UgREJ1c1RpbWVvdXQsIHNvIHdlIGRvbid0IG5lZWQgZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaAorCWV0Yy4KKworMjAwMy0wNC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGIuYywgZGJ1cy9kYnVzLXN5c2RlcHMuYzogcmVkbyBhbGwgdGhlIHBhc3N3ZAorCWRhdGFiYXNlIHVzYWdlIHNvIGl0IGFsbCBnb2VzIHZpYSB0aGUgREJ1c1VzZXJEYXRhYmFzZSBjYWNoZS4KKworMjAwMy0wNC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYWlubG9vcC5jIChfZGJ1c19sb29wX2l0ZXJhdGUpOiBmaXggbG9naWMgc28gdGhhdCBpZgorCXRoZXJlIHdhcyBhbiBPT00gd2F0Y2ggd2Ugc2tpcHBlZCwgd2UgYWx3YXlzIHJldHVybiBUUlVFIHNvIHdlCisJaXRlcmF0ZSBhZ2FpbiB0byBoYXZlIGEgbG9vayBhdCBpdCBhZ2Fpbi4gRml4ZXMgdGVzdCBzdWl0ZSBoYW5nLgorCUNvZGUgcmVhcnJhbmdlbWVudCBhbHNvIGxldHMgdXMgbG9zZSBzb21lIG1lbXNldCBhbmQgb25seSBpdGVyYXRlCisJb3ZlciBjYWxsYmFja3Mgb25jZS4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlKTogc2Vuc2Ugb2YgdGVzdCBmb3IKKwlyZXBseSB3YXMgYmFja3dhcmQKKworMjAwMy0wNC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBtYWtlIHNwZWMgc2F5IHNlcmlhbHMgYXJlIHVuc2lnbmVkCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IGNoYW5nZSBtZXNzYWdlIHNlcmlhbHMgdG8gdW5zaWduZWQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogYWRhcHQgdG8gbWVzc2FnZSBzZXJpYWxzIGJlaW5nIHVuc2lnbmVkCisKKzIwMDMtMDQtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYzogY3JlYXRlIGFuZCBrZWVwIGFyb3VuZCBhIHNoYXJlZCBEQnVzVXNlckRhdGFiYXNlCisJb2JqZWN0LgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9nZXRfZ3JvdXBzKTogZG9uJ3QgY2FjaGUKKwlncm91cHMgZm9yIHVzZXIgaW4gdGhlIGNvbm5lY3Rpb24gb2JqZWN0LCBzaW5jZSB1c2VyIGRhdGFiYXNlCisJb2JqZWN0IG5vdyBkb2VzIHRoYXQuCisKKzIwMDMtMDQtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2FkZF9zaXplX2NvdW50ZXIpOiBrZWVwIGEKKwlsaXN0IG9mIHNpemUgY291bnRlcnMKKwkoX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmspOiBwdXQgYmFjayBhIHBvcHBlZCBsaW5rCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbGl2ZV9tZXNzYWdlc19zaXplKTogcmVuYW1lCisJbWF4X3JlY2VpdmVkX3NpemUKKwkoZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplKTogZ2V0IHNpemUgb2Ygb3V0Z29pbmcKKwlxdWV1ZQorCShfZGJ1c19jb25uZWN0aW9uX3NldF9jb25uZWN0aW9uX2NvdW50ZXIpOiByZW1vdmUgdGhpcyBjcnVmdAorCisyMDAzLTA0LTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jOiB1c2VyIGRhdGFiYXNlIGFic3RyYWN0aW9uLCBtb3N0bHkgdG8gZ2V0CisJY2FjaGluZywgYnV0IGF0IHNvbWUgcG9pbnQgd2UgbWlnaHQgd2FudCB0byBiZSBhYmxlIHRvIHVzZSBhCisJZGlmZmVyZW50IGRhdGFiYXNlLgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCk6IGFkZCBhIHRlc3QgdGhhdCB1c2VzCisJU0hBMSBjb25mIGZpbGUgdG8gdGVzdCB0aGUgc2hhMSBhdXRoIG1lY2hhbmlzbSwgc2luY2UgdGhlIHJlZ3VsYXIKKwl0ZXN0IGFsd2F5cyB1c2VzIEVYVEVSTkFMIHdoZW4gYXZhaWxhYmxlLgorCisJKiBjb25maWd1cmUuaW4sCisJdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluOgorCWFkZCBjb25mIGZpbGUgdGhhdCByZXF1aXJlcyB1c2Ugb2Ygc2hhMSBhdXRoCisKKzIwMDMtMDQtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiB0b29scy9kYnVzLXNlbmQuYywgdG9vbHMvZGJ1cy1tb25pdG9yLmM6IHR3byB1dGlsaXR5IHByb2dyYW1zCisJZnJvbSBQaGlsaXAgQmx1bmRlbGwgdG8gc2VuZCBtZXNzYWdlcyBhbmQgbW9uaXRvciB0aGVtLgorCisyMDAzLTA0LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYzogZml4IHNvbWUgcmVlbnRyYW5jeSBpc3N1ZXMgYnkgcmVmY291bnRpbmcKKwljYWxsYmFja3MKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjogYWxsb3cgYWxsCisJdXNlcnMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyk6CisJZml4IHRvIG9ubHkgcmVjb3ZlciB1bnVzZWQgYnl0ZXMgaWYgd2UncmUgYWxyZWFkeSBhdXRoZW50aWNhdGVkCisJKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCk6IGZpeCB0byBzdGlsbCBtYXJrIHVzCisJYXV0aGVudGljYXRlZCBpZiB0aGVyZSBhcmUgdW51c2VkIGJ5dGVzLgorCisJKiBidXMvZGlzcGF0Y2guYzogaW1wbGVtZW50IHNlY3VyaXR5IHBvbGljeSBjaGVja2luZworCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlcik6IG5ldworCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IG5ldworCisJKiBidXMvZGlzcGF0Y2guYyAoc2VuZF9zZXJ2aWNlX25vbmV4aXN0ZW50X2Vycm9yKTogZGVsZXRlIHRoaXMsCisJbm93IHdlIGp1c3Qgc2V0IHRoZSBEQnVzRXJyb3IgYW5kIGl0IGdldHMgY29udmVydGVkIHRvIGFuIGVycm9yCisJcmVwbHkuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGFsbG93X3VzZXJfZnVuY3Rpb24pOiBlbmFibGUgY29kZSB1c2luZyBhY3R1YWwKKwlkYXRhIGZyb20gdGhlIGNvbmZpZyBmaWxlCisKKwkqIGJ1cy9wb2xpY3kuYyAobGlzdF9hbGxvd3NfdXNlcik6IGhhbmRsZSB3aWxkY2FyZCBydWxlcyBmb3IKKwl1c2VyL2dyb3VwIGNvbm5lY3Rpb24gcGVybXMKKworMjAwMy0wNC0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogTG9hZCB1cCB0aGUgQnVzUG9saWN5IGFuZCBCdXNQb2xpY3lSdWxlcworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19nZXRfdXNlcl9pZCk6IG5ldyBmdW5jdGlvbgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYXBwZW5kX21hbmRhdG9yeV9ydWxlKQorCShidXNfcG9saWN5X2FwcGVuZF9kZWZhdWx0X3J1bGUsIGJ1c19wb2xpY3lfYXBwZW5kX3VzZXJfcnVsZSkKKwkoYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSk6IG5ldyBmdW5jdGlvbnMKKworMjAwMy0wNC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogZml4IGEgbWVtbGVhaworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBjaGFuZ2UgREJ1c0NyZWRlbnRpYWxzIHRvIHVzZSBsb25ncyBmb3IKKwl0aGUgcGlkL2dpZC91aWQsIGp1c3QgZm9yIHBhcmFub2lhLgorCisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jIChyYW5kb21seV9kb19uX3RoaW5ncyk6IGZpbmQgYSBieXRlCisJY29udGFpbmluZyBhIHR5cGUgY29kZSwgYW5kIHJhbmRvbWx5IGNoYW5nZSBpdCB0byBhIGRpZmZlcmVudAorCXR5cGUgY29kZS4KKworMjAwMy0wNC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL3BvbGljeS5oOiBjaGFuZ2UgQnVzUG9saWN5IHRvIGJlIHRoZSB0aGluZyBmcm9tIHRoZSBjb25maWcKKwlmaWxlLCBhbmQgcmVuYW1lIG9sZCBCdXNQb2xpY3kgdG8gQnVzQ2xpZW50UG9saWN5CisKKwkqIGJ1cy9idXMuYywgYnVzL2Nvbm5lY3Rpb24uYywgYnVzL2NvbmZpZy1wYXJzZXIuYzogY2hhbmdlIHRvCisJbWF0Y2ggY2hhbmdlIGluIGhvdyBwb2xpY3kgd29ya3MKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBtYXJrIGFzc2VydF9ub3RfcmVhY2hlZCBhcworCV9fYXR0cmlidXRlKChub3JldHVybikpX18KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZml4IGEgc3BvdCB3aXRoIHRoZSB3cm9uZyBuYW1lIGZvcgorCXRoZSBicm9hZGNhc3Qgc2VydmljZS4gVXNlIGJvb2xlYW4gcmV0dXJuIGZvciBTZXJ2aWNlRXhpc3RzLgorCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgYW5vdGhlciBkaXJlY3RvcnkgdG8gbG9vayBmb3IgcXQgaW4uCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBBVVRIT1JTOiBhZGQgQ29saW4gV2FsdGVycworCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC45CisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogcmVtb3ZlIHBpZCBmaWxlIHdoZW4gc3RvcHBpbmcgdGhlCisJbWVzc2FnZSBidXMsIHNpbmNlIHRoZSBidXMgd29uJ3QgaGF2ZSBwcml2aWxlZ2VzIHRvIHJlbW92ZSBpdAorCWl0c2VsZi4KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogbW92ZSBjcmVkZW50aWFscyBjaGFuZ2UgYWZ0ZXIKKwljcmVhdGluZyBwaWRmaWxlCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYzogYWRkICJiZWxvdyBhdmVyYWdlIGZ1bmN0aW9ucyIgdG8gdGhlCisJY292ZXJhZ2UgcmVwb3J0LCBhbmQgY2hhbmdlIGhvdyBzb21lIG9mIHRoZSBjb2RlIHdvcmtzLgorCisJKiBidXMvdGVzdC1tYWluLmM6IGJyYWNrZXQgc29tZSBzdHVmZiBpbiBEQlVTX0JVSUxEX1RFU1RTIHNvIGl0J3MKKwlub3QgaW4gdGhlIGNvdmVyYWdlIHN0YXRzLgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogdXNlIF9kYnVzX3ZlcmJvc2Ugbm90IGZwcmludGYgaW4gYQorCWNvdXBsZSBwbGFjZXMgc28gcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBkb2Vzbid0IHJlc3VsdCBpbiBtZWdhc3BhbS4KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYWN0aXZhdGlvbik6IGFjY2VwdCBhIG5vCisJbWVtb3J5IGVycm9yIGluIGEgcGxhY2Ugd2UgZGlkbid0IGJlZm9yZQorCisJKiBidXMvdGVzdC5jIChidXNfdGVzdF9ydW5fZXZlcnl0aGluZyk6IHJlbW92ZSBoYWNreSAiZG8gaXQgdHdpY2UKKwlpbiBjYXNlIHRoZSBmaXJzdCBvbmUgZmFpbGVkLCIgc2luY2UgdGhlIHRlc3Qgc3VpdGUgaXMgbGVzcworCWJyb2tlbiBub3cuCisKKzIwMDMtMDQtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19zZWdmYXVsdF9zZXJ2aWNlX2FjdGl2YXRpb24pOiBhZGQgdGVzdAorCWZvciBsYXVuY2hpbmcgYW4gZXhlY3V0YWJsZSB0aGF0IGp1c3QgY3Jhc2hlcy4KKworCSogdGVzdC90ZXN0LXNlZ2ZhdWx0LmMgKG1haW4pOiB0cnkgc2V0dGluZyBjb3JlZHVtcHNpemUgdG8gMCBzbyB3ZQorCWRvbid0IGxlYXZlIGEgbWlsbGlvbiBjb3Jlcy4gV2UnbGwgc2VlIGhvdyBwb3J0YWJsZSB0aGlzIGlzLgorCisyMDAzLTA0LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKTogbW92ZSBhbGwKKwl0aGUgcG9zc2libGUgcGFyZW50IGZhaWx1cmVzIGJlZm9yZSB3ZSBmb3JrLCBzbyB0aGF0IHdlIGRvbid0CisJZmFpbCB0byBjcmVhdGUgYSBiYWJ5c2l0dGVyIGFmdGVyIGNyZWF0aW5nIHRoZSBjaGlsZC4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IGtpbGwgY2hpbGQKKwlpZiB3ZSBkb24ndCBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhlIGFjdGl2YXRpb24uCisKKzIwMDMtMDQtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZmx1c2gpOiBkb24ndCBzcGluIG9uCisJdGhlIGNvbm5lY3Rpb24gaWYgaXQncyBkaXNjb25uZWN0ZWQKKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKTogdXNlIG5ldworCXRyYW5zYWN0aW9uIGZlYXR1cmVzIHRvIHJvbGwgYmFjayByZW1vdmFsIG9mIHBlbmRpbmcgYWN0aXZhdGlvbiBpZgorCXdlIGRvbid0IHN1Y2Nlc3NmdWxseSBjcmVhdGUgdGhlIHNlcnZpY2UgYWZ0ZXIgYWxsLiBEb24ndCByZW1vdmUKKwlwZW5kaW5nIGFjdGl2YXRpb24gaWYgdGhlIGZ1bmN0aW9uIGZhaWxzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X2luc2VydF9iZWZvcmVfbGluaykKKwkoX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluayk6IG5ldyBjb2RlIHRvIGZhY2lsaXRhdGUKKwlzZXJ2aWNlcy5jIGZpeGVzCisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQpOgorCW5ldyBmdW5jdGlvbmFsaXR5LCBzbyB3ZSBjYW4gcHJlYWxsb2NhdGUgdGhlIGFiaWxpdHkgdG8gaW5zZXJ0CisJaW50byBhIGhhc2ggdGFibGUuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2spOiBuZXcgZnVuY3Rpb24KKwlhbGxvd2luZyB1cyB0byBwdXQgY3VzdG9tIGhvb2tzIGluIGEgdHJhbnNhY3Rpb24gdG8gYmUgdXNlZCBmb3IKKwljYW5jZWxsaW5nIHNhaWQgdHJhbnNhY3Rpb24KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBhZGQgc29tZSBkaXNjdXNzaW9uIG9mIHNlY29uZGFyeQorCXNlcnZpY2Ugb3duZXJzLCBhbmQgZGlzYWxsb3cgemVyby1sZW5ndGggc2VydmljZSBuYW1lcworCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IG5ldyBmdW5jdGlvbiwKKwlzcGxpdHMgb3V0IHBhcnQgb2YgYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKCkgYW5kIGZpeGVzCisJYSBidWcgd2hlcmUgd2UgZGlkbid0IHJlbW92ZSB0aGUgc2VydmljZSBkb2luZyB0aGUgYWNxdWlyaW5nCisJZnJvbSB0aGUgc2Vjb25kYXJ5IHF1ZXVlIGlmIHdlIGZhaWxlZCB0byByZW1vdmUgdGhlIGN1cnJlbnQgb3duZXIKKwlmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCisKKzIwMDMtMDQtMTAgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCXMvb3JnLmZyZWVkZXNrdG9wLkJyb2FkY2FzdC9vcmcuZnJlZWRlc2t0b3AuREJ1cy5Ccm9hZGNhc3QvCisKKzIwMDMtMDQtMTAgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogYnVzLy5jdnNpZ25vcmU6CisJKiBnbGliLy5jdnNpZ25vcmU6CisJKiB0ZXN0Ly5jdnNpZ25vcmU6CisJQWRkZWQgZmlsZXMgdG8gY3ZzaWdub3JlCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X25hbWVkKToKKwlNYWtlIGdldF9uYW1lZCgpIHRha2UgdHdvIG91dCBhcmd1bWVudCBhbmQgcmV0dXJuIGEgYm9vbGVhbi4KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KToKKwlVcGRhdGUgdXNhZ2Ugb2YgZ2V0X25hbWVkKCkuCisJKGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9ieXRlKToKKwlGaXggdHlwbworCShkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfbmFtZWQpCisJRml4IHR5cG8KKwkobWVzc2FnZV9pdGVyX3Rlc3QpLCAoY2hlY2tfbWVzc2FnZV9oYW5kbGluZ190eXBlKSwgKF9kYnVzX21lc3NhZ2VfdGVzdCk6CisJTW9yZSB0ZXN0cy4KKworMjAwMy0wNC0xMCAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5bY2hdOgorCUFkZCBhcnJheV90eXBlX3BvcyBhcmd1bWVudCB0byBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZy4KKwlMZXQgeW91IHBhc3MgYSBOVUxMIGVuZF9wb3MgdG8gX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90eXBlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5bY2hdOgorCU11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBoYXZlIGZ1bGwgdHlwZSBzcGVjaWZpY2F0aW9uIGluIHRoZQorCW91dGVybW9zdCBhcnJheS4gSXRlciBjb2RlIHJlLWFycmFuZ2VkIHRvIGhhbmRsZSB0aGlzLgorCUFkZGVkIHNvbWUgbW9yZSBpdGVyIHRlc3RzLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIG1lIHRvIGF1dGhvcnMuCisJUmVtb3ZlIG9sZCBGSVhNRS4KKwlVcGRhdGUgbmV3IGFycmF5IGVuY29kaW5nIGRlc2NyaXB0aW9uLgorCUNvcnJlY3QgREJVU19TRVJWSUNFX0ZMQUdTX1JFUExBQ0VfRVhJU1RJTkcgZGVzY3JpcHRpb24uCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LXdpdGgtbWl4ZWQtdHlwZXMubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZToKKwlDaGFuZ2UgdG8gdGhlIG5ldyBhcnJheSBmb3JtYXQuCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2U6CisJRml4IGJ1ZyBpbiB0ZXN0LgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2U6CisJRml4IHVwIGFuZCBleHRlbmQgdGVzdC4KKworMjAwMy0wNC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGxvdHMgb2YgZml4ZXMKKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfZGlzcGF0Y2gpOiBleHBvcnQKKwkoX2RidXNfbG9vcF9pdGVyYXRlKTogcmVtb3ZlIG9sZCAicXVpdCBpZiBubyBjYWxsYmFja3MiIGNvZGUsCisJdGhhdCB3YXMgY3JhY2ssIGJyb2tlIHRoZSB0ZXN0IHNlcnZpY2UuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBmaXggZXJyb3IKKwloYW5kbGluZyB0byBhdm9pZCBwaWxpbmcgdXAgZXJyb3JzIGlmIHdlIGdldCBhIGZhaWx1cmUgb24gdGhlCisJZmlyc3QgYWRkcmVzcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19yZWFsX2Fzc2VydF9ub3RfcmVhY2hlZCk6IGluY2x1ZGUKKwlwaWQgaW4gYXNzZXJ0aW9uIGZhaWx1cmVzLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9pdGVyYXRlKTogdXNlIHN0YXRpYyBhcnJheXMgdXAKKwl0byBzb21lIGZpeGVkIHNpemUgb2YgZmlsZSBkZXNjcmlwdG9yIGFycmF5LiBEb24ndCByZXR1cm4gVFJVRQorCWFueXRpbWUgYSB0aW1lb3V0IGV4aXN0cywgdGhhdCBsZWQgdG8gbG90cyBvZiBidXN5IGxvb3Agc2lsbGluZXNzCisJaW4gdGhlIHRlc3RzLgorCisyMDAzLTA0LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKGNoZWNrX3RpbWVvdXQpOiBmaXggdGltZW91dHMsIEkgdGhvdWdodAorCUknZCBjaGVja2VkIHRoaXMgaW4gZWFybGllciBidXQgaGFkbid0LgorCisyMDAzLTA0LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogZ2V0IGEgYml0IGZ1cnRoZXIgdGhyb3VnaAorCXRoZSBhY3RpdmF0aW9uIHRlc3QgKG1hbiB0aGlzIGlzIGdldHRpbmcgb2xkISkKKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvdGVzdC11dGlscy5jOiB1c2UgZGlzcGF0Y2ggc3RhdHVzIGZ1bmN0aW9uIHRvIGZpeCB0aGlzIHVwCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGNvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2spOiBkb24ndCBkaXNwYXRjaAorCWZyb20gaGVyZQorCShjb25uZWN0aW9uX3RpbWVvdXRfY2FsbGJhY2spOiBkb24ndCBkaXNwYXRjaCBmcm9tIGhlcmUKKwkoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdGhlIGRpc3BhdGNoIHN0YXR1cyBmdW5jdGlvbgorCShidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpOiB1bnNldCBpdAorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9xdWV1ZV9kaXNwYXRjaCk6IG5ldyBmdW5jdGlvbgorCXVzZWQgdG8gYWRkIGEgY29ubmVjdGlvbiB0byBiZSBkaXNwYXRjaGVkCisJKF9kYnVzX2xvb3BfaXRlcmF0ZSk6IGRvIHRoZSBkaXNwYXRjaGluZyBhdCB0aGUgZW5kIG9mIGVhY2gKKwlpdGVyYXRpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbik6IG5ldyBmdW5jdGlvbgorCWFsbG93aW5nIHVzIHRvIGZpeCB1cCBtYWluIGxvb3AgdXNhZ2UKKwkoX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmKTogZnJlZSBhbGwgdGhlIHZhcmlvdXMgZnVuY3Rpb24KKwl1c2VyIGRhdGEKKwkoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogY2FsbCB0aGUgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCXdoZW5ldmVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucworCShkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKTogY2FsbCBEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogY2FsbCBEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uCisJKHJlcGx5X2hhbmRsZXJfdGltZW91dCk6IGNhbGwgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCShkYnVzX2Nvbm5lY3Rpb25fZmx1c2gpOiBjYWxsIERpc3BhdGNoU3RhdHVzRnVuY3Rpb24KKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfcmVnaXN0ZXIpOiBmaXggdXAgZXJyb3IgaGFuZGxpbmcgYW5kCisJYSBtZW1vcnkgbGVhaworCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQpOiBmaXggYnVnIGluIHRlc3QKKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKGNoZWNrX3RpbWVvdXQpOiBmaXggdGhpcyB1cAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IGluY2x1ZGUgUElEIGluCisJdmVyYm9zZSBvdXRwdXQgc28gd2UgY2FuIHNvcnQgb3V0IG91dHB1dCBmcm9tIGRpZmZlcmVudCBwcm9jZXNzZXMsCisJZS5nLiBpbiB0aGUgYWN0aXZhdGlvbiBjYXNlLgorCisyMDAzLTA0LTA4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0BnbnUub3JnPgorCisgCSogYnVzL2J1cy5jIChzdHJ1Y3QgQnVzQ29udGV4dCkgW3BpZGZpbGVdOiBOZXcgbWVtYmVyLCB0byBzdG9yZQorIAl0aGUgcGlkIGZpbGUuCisgCShidXNfY29udGV4dF9uZXcpOiBTZXQgaXQuCisgCShidXNfY29udGV4dF91bnJlZik6IFVzZSBpdCB0byBkZWxldGUgdGhlIHBpZCBmaWxlLgorCisyMDAzLTA0LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlOgorCXJlZ3Jlc3Npb24gdGVzdCB0aGF0IGZhaWxzIGZvciB0aGUgbW9tZW50CisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiByZW9yZGVyCisJdGVzdHMgZm9yIGNvbnZlbmllbmNlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogZG9uJ3QgYWxsb3cKKwlhcnJheSBvZiBuaWwsIGl0IGJyb2tlIHRoaW5ncy4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2U6IHJlZ3Jlc3Npb24gdGVzdAorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtYXJyYXktb2YtdWludDMyLm1lc3NhZ2U6CisJaGFwcGVuZWQgdG8gd3JpdGUgdGhpcyBzbyBhZGRlZCBpdCB0byBzdWl0ZQorCisyMDAzLTA0LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UpOiBpbml0CisJcmV0dmFsL3JlcGx5IGJlZm9yZSBjaGVja2luZyBuYW1lCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogYWRkIGEKKwlyZWN1cnNpb24gZGVwdGggYXJndW1lbnQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCAoc3RydWN0IERCdXNNZXNzYWdlSXRlcik6IHB1dCBzb21lIHBhZGRpbmcKKwlpbiB0aGUgcHVibGljIHN0cnVjdCBmb3IgZnV0dXJlIGV4dGVuc2lvbgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogZml4CisJdHlwbworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGZpeCBhIHZlcmJvc2UKKwltZXNzYWdlCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZml4IHR5cG8KKworMjAwMy0wNC0wOCAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJSW1wbGVtZW50ZWQgcmVjdXJzaXZlIHR5cGVzLCBuYW1lZCB0eXBlcyBhbmQgbmV3LXN0eWxlIGl0ZXJzCisKKwkqIGJ1cy9kcml2ZXIuYzoKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6ICh0aHJlYWRfZnVuYyk6CisJKiBnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jOiAoaGFuZGxlX3Rlc3RfbWVzc2FnZSk6CisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jOiAoaGFuZGxlX2VjaG8pOgorCVVwZGF0ZSB0byBuZXcgYXBpCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtZGljdC5jOgorCSogZGJ1cy9kYnVzLWRpY3QuaDoKKwkqIGRidXMvZGJ1cy5oCisJUmVtb3ZlIERCdXNEaWN0CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogKF9kYnVzX3R5cGVfdG9fc3RyaW5nKToKKwlVcGRhdGUgZm9yIG5ldyB0eXBlcy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuW2NoXToKKwlJbXBsZW1lbnQgcmVjdXJzaXZlIHR5cGVzIGFuZCB0aGUgbmV3IG1hcnNoYWxsaW5nIGZvcm1hdC4KKwlSZW1vdmUgaGFyZGNvZGVkIGRpY3QgbWFyc2hhbGxpbmcuCisJTWFyc2hhbCBuYW1lZCB0eXBlcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOgorCUFkZCBCWVRFX0FSUkFZLgorCVJlbW92ZSByZWZlcmVuY2VzIHRvIG9sZCB0eXBlcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5bY2hdOgorCU5ldyBub24tcmVmY291bnRlZCBpdGVyIEFQSSB0aGF0IHN1cHBvcnRzIHJlY3Vyc2l2ZSBpdGVycy4KKwlVc2UgaXRlcnMgZm9yIGFwcGVuZGluZywgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHJlY3Vyc2l2ZQorCWl0ZXJzLgorCUFkZCBieXRlIGFuZCBuYW1lZCB0eXBlIHN1cHBvcnQuCisJVXBkYXRlIGV2ZXJ5dGhpbmcgdG8gbmV3IG1hcnNoYWxsaW5nIGZvcm1hdHMuCisJQWRkIHRlc3RzIGZvciBuZXcgQVBJLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlSZW1vdmUgb2xkIGFycmF5IHR5cGVzLgorCUFkZCB0eXBlczogQllURSwgQVJSQVksIERJQ1QsIE5BTUVECisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6CisJTWFrZSBwYXJzZV9kb3VibGUgbG9jYWxlIHNhZmUuCisKKwkqIGRidXMvZGJ1cy10ZXN0LW1haW4uYzoKKwlDYWxsIHNldGxvY2FsZS4KKworCSogZGJ1cy9kYnVzLXRlc3QuYzoKKwlLaWxsIGRpY3QgdGVzdAorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJVXBkYXRlIHNwZWMKKworCSogdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4tYXJyYXktbGVuZ3RoLXRvby1sb25nLm1lc3NhZ2UtcmF3OgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXc6CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlOgorCUFkZCBtaXNzaW5nIE5BTUUgZmllbGRzCisJRml4IHVwIGRpY3RzICYgYXJyYXlzCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2RpY3Qtd2l0aC1uaWwtdmFsdWUubWVzc2FnZToKKwlSZW1vdmVkLCB0aGlzIGlzIG5vdCBpbnZhbGlkIGFueW1vcmUuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZToKKwlBZGQgbmV3IHRlc3QgZm9yIGRlZXBseSByZWN1cnNpdmUgdHlwZXMuCisKKzIwMDMtMDQtMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogcmV0dXJuIGFuCisJZXJyb3IgaWYgeW91IHRyeSB0byBhY3F1aXJlIGEgc2VydmljZSB0aGF0IHN0YXJ0cyB3aXRoICc6JworCisyMDAzLTA0LTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiByZXF1aXJlIHRoYXQgYmFzZSBzZXJ2aWNlIG5hbWVzCisJc3RhcnQgd2l0aCAnOicgYW5kIHRoYXQgdGhlIGJhc2Ugc2VydmljZSBpcyBjcmVhdGVkL2RlbGV0ZWQKKwlhcyBmaXJzdCBhbmQgbGFzdCB0aGluZ3MgYSBjb25uZWN0aW9uIGRvZXMgb24gdGhlIGJ1cworCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfZXhpc3RlbnRfc2VydmljZV9hY3RpdmF0aW9uKTogbG90cyBtb3JlCisJd29yayBvbiB0aGUgYWN0aXZhdGlvbiB0ZXN0OyBpdCBkb2Vzbid0IGZ1bGx5IHBhc3MgeWV0Li4uCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKG1haW4pOiBmaXggc28gd2UgZG9uJ3QgbWVtbGVhayB0aGUKKwljb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cworCShmaWx0ZXJfZnVuYyk6IGFjY2VwdCBhIG1lc3NhZ2UgYXNraW5nIHVzIHRvIGV4aXQKKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogcXQvTWFrZWZpbGUuYW0gKGRidXNpbmNsdWRlX0hFQURFUlMpOiBpbnN0YWxsIGRidXMtcXQuaCwKKwlmcm9tIENvbGluIFdhbHRlcnMKKworCSogY29uZmlndXJlLmluOiBmaXhlcyB0byBRdCBkZXRlY3Rpb24gZnJvbSBDb2xpbiBXYWx0ZXJzCisKKwkqIGRvYy9NYWtlZmlsZS5hbTogT25seSByZW1vdmUgZ2VuZXJhdGVkIGRvY2Jvb2sgZGlycyBpZiB0aGV5CisJZXhpc3QsIGZyb20gQ29saW4gV2FsdGVycworCisJKiBkYnVzL2RidXMtYnVzLmM6IGNoYW5nZSBob3cgd2Ugc2V0IHdlbGwta25vd24gY29ubmVjdGlvbnMgdG8KKwlOVUxMLCBzbyB0aGF0IGl0IHdvcmtzIGlmIGEgc2luZ2xlIGNvbm5lY3Rpb24gaXMgc3RvcmVkIGluCisJdHdvIHdlbGwta25vd24gYXJyYXkgc2xvdHMuCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IHJlbW92ZSBhIGxvdCBvZiBzdHVmZiB0aGF0IGlzbid0IGltbWVkaWF0ZWx5CisJdXNlZnVsLCBpdCdzIGluIENWUyBoaXN0b3J5IGlmIHdlIHdhbnQgaXQuCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IHVzZSBkYnVzLW1haW5sb29wIGluc3RlYWQgb2YgdGhhdAorCXdhdGNoLltoY10gY3JhY2sKKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogc3BsaXQgbGlzdHMgb2Ygc291cmNlcyBpbnRvIHN0dWZmIHRoYXQgZ29lcyBpbgorCXRoZSBsaWJyYXJ5LCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGdvIGluIHRoZSBsaWIgYW5kIGFyZSBhbHNvIHVzZWQKKwllbHNld2hlcmUsIGFuZCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIHRlc3RzL2RhZW1vbiBidXQKKwlkb24ndCBnbyBpbiB0aGUgbGliLgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuaCwgZGJ1cy9kYnVzLW1haW5sb29wLmM6IG1vdmUgYnVzL2xvb3AuW2hjXQorCWhlcmUgc28gaXQgY2FuIGJlIHVzZWQgaW4gdGVzdCBiaW5hcmllcyBhbHNvCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiB3cml0ZSB0aGUgcGlkZmlsZQorCWhlcmUgaW4gdGhlIHBhcmVudCBwcm9jZXNzLCBzbyB3ZSBjYW4gcmV0dXJuIGFuIGVycm9yIGlmIGl0CisJZmFpbHMuIEFsc28sIG1vdmUgc29tZSBvZiB0aGUgY29kZSBpbnRvIHRoZSBjaGlsZCBzbyB0aGUgcGFyZW50CisJaXMgbGVzcyBob3NlZCBpZiB3ZSBmYWlsIG1pZHdheSB0aHJvdWdoLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IG1vdmUgcGlkZmlsZSBkZXRlY3Rpb24gZnVydGhlciB1cAorCWluIHRoZSBmdW5jdGlvbiwgYmVmb3JlIHdlIHN0YXJ0IG92ZXJ3cml0aW5nIHNvY2tldHMgYW5kIHN1Y2guCisKKwkqIGJ1cy9tZXNzYWdlYnVzLmluOiBhZGp1c3QgdGhpcyBhIGJpdCwgbm90IHN1cmUgaWYgaXQgd2lsbCB3b3JrLgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLXdpdGgtc3lzdGVtLXBpZC1maWxlIGFuZCAtLXdpdGgtc3lzdGVtLXNvY2tldAorCisyMDAzLTA0LTA2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKERCVVNfU1lTVEVNX1BJRF9GSUxFKTogTmV3IHZhcmlhYmxlLgorCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IERlY2xhcmUgYSBwaWRmaWxlLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IFRlc3QgZm9yIGFuIGV4aXN0aW5nIHBpZCBmaWxlLCBhbmQKKwljcmVhdGUgb25lIChpZiBhcHByb3ByaWF0ZSkuCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGVudW0gRWxlbWVudFR5cGUpIFtFTEVNRU5UX1BJREZJTEVdOiBOZXcuCisJKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpIFtwaWRmaWxlXTogTmV3LgorCShlbGVtZW50X3R5cGVfdG9fbmFtZSwgbWVyZ2VfaW5jbHVkZWQsIHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCkKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQsIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBIYW5kbGUgaXQuCisJKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKTogRnJlZSBpdC4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmggKF9kYnVzX3dyaXRlX3BpZF9maWxlKTogUHJvdG90eXBlLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKERCVVNfRVJST1JfUElERklMRV9FWElTVFMpOiBOZXcgZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3dyaXRlX3BpZF9maWxlKTogTmV3IGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBQcm90b3R5cGUgaXQuCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGVyZSwgcmF0aGVyCisJdGhhbiBpbiBtYWluKCksIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyBpdCBiZWZvcmUgZm9ya2luZyB0aGUgZGFlbW9uCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChzZW5kX3NlcnZpY2Vfbm9uZXhpc3RlbnRfZXJyb3IpOiBzZXQgdGhlIHNlbmRlcgorCW9uIHRoZSBzZXJ2aWNlIG5vbmV4aXN0ZW50IGVycm9yCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogc2V0IHRoZQorCXNlbmRlciBvbiB0aGUgQWNxdWlyZVNlcnZpY2UgcmVwbHkKKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjogTWFrZSB0ZXN0CisJc2VydmVyIGFsc28gbGlzdGVuIG9uIGEgVU5JWCBzb2NrZXQgc28gc2VydmljZXMgY2FuIGNvbm5lY3QgdG8gaXQuCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IFJlZG8gaG93IHRoZSBmYWtlIGRlYnVnIG11dGV4ZXMgYXJlIGRvbmUKKwlzbyBpdCBkZXRlY3RzIGRlYWRsb2NrcyBhbmQgYWxzbyB3ZSBhY3R1YWxseSBpbml0IHRocmVhZHMgd2hlbgorCWRlYnVnZ2luZy4KKworMjAwMy0wNC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOgorCXNhdmUgdGhlIGRvbWFpbiBzb2NrZXQgbmFtZSwgYW5kIHVubGluayBpdCB3aGVuIHdlIGRpc2Nvbm5lY3QgdGhlCisJc2VydmVyLiBNZWFucyB0aGF0IGF0IGxlYXN0IHdoZW4gd2UgZXhpdCBub3JtYWxseSwgd2Ugd29uJ3QgbGVhdmUKKwlhIGJ1bmNoIG9mIGp1bmsgaW4gL3RtcAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYworCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0KTogY29kZSBjbGVhbnVwIChuaWNlcgorCW1lbW9yeSBtYW5hZ2VtZW50KS4gKEkgd2FzIG1ha2luZyBhIHJlYWwgY2hhbmdlIGhlcmUgYnV0IHRoZW4KKwlkaWRuJ3QpCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogZml4IHdyb25nIGhhbmRsaW5nIG9mCisJc2VydmVyX2RhdGFfc2xvdF91bnJlZigpIGluIHRoZSBlcnJvciBjYXNlLgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9kYnVzX2Fzc2VydCk6IGNoYW5nZSBzbyBpdCBwYXNzZXMKKwkiKGNvbmRpdGlvbikgIT0gMCIgdG8gX2RidXNfcmVhbF9hc3NlcnQgc28gdGhhdAorCSJfZGJ1c19hc3NlcnQgKHBvaW50ZXIpIiBkb2Vzbid0IGNhdXNlIGEgd2FybmluZworCisJKiBidXMvbWFpbi5jIChtYWluKTogYWNjZXB0IC0tcHJpbnQtYWRkcmVzcyBvcHRpb24gdG8gcHJpbnQgb3V0CisJdGhlIG1lc3NhZ2UgYnVzIGFkZHJlc3MKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpKTogZXhwb3J0IHRoaXMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfb3Blbik6IHNwZWNpYWwgZXJyb3IgZm9yCisJInRtcGRpciIgb3B0aW9uIHRvIHVuaXg6IGFkZHJlc3Mgb24gY2xpZW50IHNpZGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBoYW5kbGUgInRtcGRpciIgb3B0aW9uCisJdG8gdW5peDogYWRkcmVzcworCisJKiBjb25maWd1cmUuaW4gKFRFU1RfU09DS0VUX0RJUik6IGxvY2F0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKKwl3ZSBjYW4gdXNlIHRvIGNyZWF0ZSBzb2NrZXRzIGluIHRoZSB0ZXN0IHN1aXRlLgorCisJKiBidXMvbWFpbi5jIChzaWduYWxfaGFuZGxlcik6IG9uIFNJR1RFUk0sIGV4aXQgdGhlIGRhZW1vbgorCWNsZWFubHkuIFRvIGJlIHVzZWQgZm9yIHRlc3RpbmcuCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChiYWJ5c2l0KTogdXNlIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlcigpCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9zaWduYWxfaGFuZGxlcik6IG5ldworCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwloYW5kbGUgdHJ5aW5nIHRvIGNhbGwgdGhpcyB3aGVuIHRoZXJlJ3Mgbm8gc2VydmVycyBhY3RpdmUKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC44CisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9idXMuYyAoc2V0dXBfc2VydmVyKTogZml4IHRoaXMgc28gZGJ1cy1kYWVtb24tMSBkb2Vzbid0CisJY3Jhc2ggb24gc3RhcnR1cC4gTmVlZCB0byBnZXQgInRyeSBzdGFydGluZyB0aGUgZGFlbW9uIgorCWluIHRoZSB0ZXN0IHN1aXRlIEkgZ3Vlc3MuIDstKQorCisJKiBkYnVzL2RidXMtc2VydmVyLmgsIGRidXMvZGJ1cy1zZXJ2ZXIuYzogcmVtb3ZlIHRoZSBzdHVmZiB0aGF0CisJdHJhY2tlZCB0aGUgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnM7IGl0J3MgYmV0dGVyIGRvbmUgaW4KKwlhcHBsaWNhdGlvbi1zcGVjaWZpYyBjb2RlIGFzIHlvdSB3YW50IGl0IHRvIHNwYW4gYWxsIHNlcnZlcnMgZXRjLgorCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogYWRkIG1pc3NpbmcgREVTVERJUiwKKwlwYXRjaCBmcm9tIENvbGluIFdhbHRlcnMKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2NvbmZpZy1maWxlLnR4dCAoRWxlbWVudHMpOiBmaXggZG9jcyBvZiA8YXV0aD4gdG8gcmVmbGVjdAorCXJlYWxpdHk7IGluIGZhY3QgbXVsdGlwbGUgbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19yZWFsX2Fzc2VydCkKKwkoX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQpOiBtb3ZlIGd1dHMgb2YgX2RidXNfYXNzZXJ0KCkgYW5kCisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCkgaW50byBmdW5jdGlvbnMsIHNvIHRoYXQgdGhleSBkb24ndCBzaG93CisJdXAgaW4gYmFzaWMgYmxvY2sgY291bnRzIGZvciB0ZXN0IGNvdmVyYWdlLCBhbmQgZG9uJ3QgdXNlIHVwIGFzCisJbXVjaCBkaXNrIHNwYWNlLiBEb2VzIG1lYW4gc2xvd2VyIGV4ZWN1dGlvbiBzcGVlZCB0aG91Z2gsIHNvCisJYXNzdW1lcyAtLWRpc2FibGUtYXNzZXJ0cyBpcyB0aGUgbm9ybWFsIHByb2R1Y3Rpb24gY2FzZS4KKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogYWxzbyBkaXN0ICouaW4gZmlsZXMKKworCSogTkVXUzogdXBkYXRlCisKKwkqIGNvbmZpZ3VyZS5pbjogMC43CisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogZG9jcyB3YXJuaW5nCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jOiBtaXNzaW5nIGRvY3MKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlKTogbWlzc2luZyBkb2NzCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9sb29wLmMgKGJ1c19sb29wX2l0ZXJhdGUpOiBmaXggdGhlIHRpbWVvdXQgY29kZSwgdXNpbmcKKwltYWdpYyBmcm9tIEdMaWIKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYpOiBzZXQgc2l0dGVyX3BpZAorCXRvIC0xIG9uY2Ugd2UndmUgcmVhcGVkIHRoZSBiYWJ5c2l0dGVyCisJKF9kYnVzX2JhYnlzaXR0ZXJfaGFuZGxlX3dhdGNoKTogZG8gYXMgbXVjaCB3b3JrIGFzIHdlIGNhbiwgbm90CisJanVzdCBvbmUgZ28gb2YgaXQKKworCSogYnVzL2FjdGl2YXRpb24uYzogYWRkIGNvZGUgdXNpbmcgREJ1c0JhYnlzaXR0ZXIgc28gdGhhdCB3ZQorCWhhbmRsZSBpdCB3aGVuIGEgc2VydmljZSBmYWlscyB0byBzdGFydCB1cCBwcm9wZXJseS4KKwkoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKTogZG9uJ3QgcmVtb3ZlIHRoZSBhY3RpdmF0aW9uCisJZW50cmllcyBhcyB3ZSBnbywganVzdCBsZXQgdGhlbSBnZXQgcmVtb3ZlZCB3aGVuIHdlIGZyZWUgdGhlIHBlbmRpbmcKKwlhY3RpdmF0aW9uLiBVbnJlZiByZXBseSBtZXNzYWdlcyBhZnRlciBzZW5kaW5nIHRoZW0uCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYyAobWFpbik6IHByaW50IHBlci1kaXJlY3Rvcnkgc3RhdHMgaW4gdGhlIHJlcG9ydAorCisJKiBNYWtlZmlsZS5hbSAoY292ZXJhZ2UtcmVwb3J0LnR4dCk6IGRvbid0IGluY2x1ZGUgdGVzdC8qIGluIGdjb3Ygc3RhdHMKKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGNvdmVyYWdlLXJlcG9ydC50eHQpOiBhZGQgdGFyZ2V0ICJjb3ZlcmFnZS1yZXBvcnQudHh0IgorCisJKiB0ZXN0L2RlY29kZS1nY292LmM6IGhhY2sgdXAgYSBsaXR0bGUgcHJvZ3JhbSB0byBzdWNrIGRhdGEKKwlvdXQgb2YgZ2NvdiBmaWxlcy4gWWVzIHRoaXMgaXMgc29ydCBvZiBzaWxseS4KKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgc29tZXRoaW5nIGluIGNvbmZpZy5oIGFuZCBkbyBhbgorCUFNX0NPTkRJVElPTkFMIHdoZW4gZ2NvdiBpcyBlbmFibGVkCisKKzIwMDMtMDQtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYywgZGJ1cy9kYnVzLXNwYXduLmg6IENoYW5nZSBkYnVzX3NwYXduIHRvCisJcmV0dXJuIGEgImJhYnlzaXR0ZXIiIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RhdHVzIG9mCisJdGhlIHNwYXduZWQgcHJvY2VzcyBhbmQgcmVhcCBpdCB3aGVuIHJlcXVpcmVkLgorCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYywgdGVzdC90ZXN0LWV4aXQuYywKKwl0ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jOiBiaW5hcmllcyB0aGF0IGRvIHZhcmlvdXMgbGFtZSB0aGluZ3MsCisJdXNlZCBpbiB0aGUgdGVzdCBzdWl0ZS4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoga2lsbCBfZGJ1c19lcnJub190b19zdHJpbmcoKQorCisyMDAzLTA0LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYzogTW92ZSBkYnVzLXNwYXduIGludG8gYSBzZXBhcmF0ZSBmaWxlCisJaW4gcHJlcGFyYXRpb24gZm9yIG1vZGlmeWluZyBpdCwgZGJ1cy1zeXNkZXBzIGlzIGdldHRpbmcKKwlhIGJpdCB1bm1hbmFnZWFibGUuCisKKzIwMDMtMDQtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvbG9vcC5oLCBidXMvbG9vcC5jOiBtYWtlIHRoZSBtYWlubG9vcCBhbiBvYmplY3Qgc28gd2UgY2FuCisJaGF2ZSBtdWx0aXBsZSBvbmVzCisKKwkqIGJ1cy8qLltoY106IGFkYXB0IHRvIG1haW5sb29wIGNoYW5nZQorCisyMDAzLTA0LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYyAobG9hZF9kaXJlY3RvcnkpOiBmaXggdXAgbWVtbGVha3MKKwkoYnVzX2FjdGl2YXRpb25fZW50cnlfZnJlZSk6IGZyZWUgdGhlIGVudHJ5CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfYWNxdWlyZV9zZXJ2aWNlKTogcmV0dXJuIGFuIGVycm9yIGlmCisJd2UgZ2V0IG9uZSBmcm9tIHRoZSBtZXNzYWdlIGJ1czsgZml4IG1lbWxlYWtzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wNC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpOiBmcmVlCisJbGlzdCBvZiBtZWNoYW5pc21zLCBidWcgZGlzY292ZXJlZCBieSB0ZXN0IHN1aXRlIGVuaGFuY2VtZW50cworCShwdXR0aW5nIHN5c3RlbS5jb25mIGFuZCBzZXNzaW9uLmNvbmYgaW50byBzdWl0ZSkKKworCSogdGVzdC9NYWtlZmlsZS5hbSwgdGVzdC90ZXN0LXNlcnZpY2UuYzogYWRkIHBsYWNlaG9sZGVyIGZvciBhCisJdGVzdCBzZXJ2aWNlIHRoYXQgd2UnbGwgYWN0aXZhdGUgYXMgcGFydCBvZiB0ZXN0IHN1aXRlLiBEb2Vzbid0CisJZG8gYW55dGhpbmcgeWV0LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRlbnYpOiBzdXBwb3J0IHVuc2V0ZW52IGJ5CisJc2V0dGluZyBOVUxMIHZhbHVlLCBhbmQgdXNlIHN5c3RlbSBtYWxsb2Mgbm90IGRidXNfbWFsbG9jKCkKKwl3aGVuIHdlIGhhdmUgdW5hdm9pZGFibGUgbWVtbGVha2FnZS4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXQpOiBmaXggYnVnIHdoZXJlIGJ1cyB0eXBlIG9mIDAKKwlkaWRuJ3Qgd29yaywgYW5kIHN1cHBvcnQgREJVU19CVVNfQUNUSVZBVElPTi4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoY2hpbGRfc2V0dXApOiBwYXNzIG91ciB3ZWxsLWtub3duIGJ1cyB0eXBlIHRvCisJdGhlIGNoaWxkCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHN1cHBvcnQgPHR5cGU+IHRvIHNwZWNpZnkgd2VsbC1rbm93biB0eXBlCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZG9jdW1lbnQgdGhlIGVudiB2YXJpYWJsZXMgdG8KKwlsb2NhdGUgd2VsbC1rbm93biBidXNlcyBhbmQgZmluZCBzZXJ2aWNlIGFjdGl2YXRvcgorCisyMDAzLTA0LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoYWxsLWxvY2FsKTogYWRkIGEgcnVsZSB0byBjb3B5IHRlc3RzIHRvCisJYnVpbGRkaXIsIHNvIHdlIGNhbiBoYXZlIGdlbmVyYXRlZCB0ZXN0cy4gVXNlIHRoaXMgdG8gcmVtb3ZlIHRoZQorCXNpbGx5IGhhY2sgZm9yIHRlc3Rpbmcgc3lzdGVtLmNvbmYgYW5kIHNlc3Npb24uY29uZi4gV2lsbCB1c2UgdGhpcworCXNob3J0bHkgdG8gZ2VuZXJhdGUgLnNlcnZpY2UgZmlsZXMgcG9pbnRpbmcgdG8gdGVzdCBiaW5hcmllcy4KKworMjAwMy0wNC0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoc2V0X2xlbmd0aCk6IGZpeCBhIGJ1ZyAtIHdlIGFsbG9jYXRlZCBtYXggb2YKKwljdXJyZW50IGFsbG9jIGFuZCBuZWVkZWQgbmV3IGxlbmd0aCwgbm90IG1heCBvZiB0aGUgZG91YmxlZAorCWFsbG9jYXRpb24gYW5kIG5lZWRlZCBuZXcgbGVuZ3RoLiBBbHNvLCB3aGVuIGJ1aWxkaW5nIHRlc3RzLAorCWRvbid0IGRvIHRoZSBkb3VibGUtYWxsb2NhdGlvbiBzdHVmZiwganVzdCByZWFsbG9jIGV2ZXJ5IHRpbWUuCisKKzIwMDMtMDQtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19maWxlX2dldF9jb250ZW50cyk6IGluY2x1ZGUgZmlsZW5hbWVzCisJaW4gZXJyb3IgbWVzc2FnZXMKKwkoX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lKTogbmV3CisJKF9kYnVzX3N5c2RlcHNfdGVzdCk6IG5ldworCShfZGJ1c19kaXJlY3Rvcnlfb3Blbik6IGluY2x1ZGUgZGlybmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogaW50ZXJwcmV0IDxpbmNsdWRlPiBhbmQgPGluY2x1ZGVkaXI+IGFuZAorCTxzZXJ2aWNlZGlyPiByZWxhdGl2ZSB0byBjb25maWcgZmlsZSBsb2NhdGlvbiBpZiB0aGUgZ2l2ZW4KKwlmaWxlbmFtZSBpcyBub3QgYWJzb2x1dGUuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCk6IG5ldworCisyMDAzLTA0LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkpOiBzZXQgc2VuZGVyCisJc2VydmljZSBmb3IgdGhlIGVycm9yLCBhbmQgdW5yZWYgdGhlIHJlcGx5IG9uIHN1Y2Nlc3MKKworCSogYnVzL2FjdGl2YXRpb24uYzogY29udmVydCB0byB1c2UgQnVzVHJhbnNhY3Rpb24gc28gT09NIGNhbiBiZQorCWhhbmRsZWQgY29ycmVjdGx5CisJKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCk6IHNldCBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UKKworMjAwMy0wNC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMsIGJ1cy9idXMuYzogaW1wbGVtZW50IDxzZXJ2aWNlZGlyPiBhbmQKKwk8aW5jbHVkZWRpcj4gKGF0IGxlYXN0IG1vc3RseSkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY2hhbmdlX2lkZW50aXR5KTogc2V0IHRoZSBncm91cCBJRAorCWZpcnN0LCB0aGVuIHRoZSB1c2VyIElECisKKzIwMDMtMDQtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyk6IG5ldworCWZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMpOiBuZXcKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19kdXBfc3RyaW5nX2FycmF5KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGNobW9kIHRoZQorCXNvY2tldCAwNzc3LCBhbmQgdW5saW5rIGFueSBleGlzdGluZyBzb2NrZXQuCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogY2hhbmdlIG91ciBVSUQvR0lEIGFuZCBmb3JrIGlmCisJdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzbyBzcGVjaWZpZXM7IHNldCB1cCBhdXRoIG1lY2hhbmlzbQorCXJlc3RyaWN0aW9ucworCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogYWRkIHN1cHBvcnQKKwlmb3IgPGZvcms+IG9wdGlvbiBhbmQgZmlsbCBpbiBjb2RlIGZvciA8YXV0aD4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOiBhZGQgPGZvcmsvPiB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCisJYW5kIGxpbWl0IGF1dGggbWVjaGFuaXNtcyB0byBFWFRFUk5BTAorCisJKiBkb2MvY29uZmlnLWZpbGUudHh0IChFbGVtZW50cyk6IGFkZCA8Zm9yaz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYmVjb21lX2RhZW1vbik6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19jaGFuZ2VfaWRlbnRpdHkpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQpCisJKF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCk6IGZpeCBvZmYtYnktb25lIGVycm9yIGluIG51bGwKKwl0ZXJtaW5hdGlvbiBzcG90dGVkIGJ5IE5hbGluCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogYWxsb3cgc2V0dGluZworCURCVVNfVEVTVF9IT01FRElSIHdoZW4gdGVzdHMgYXJlIGVuYWJsZWQsIHNvIHdlIGNhbiB0ZXN0IHdpdGhvdXQKKwloYXZpbmcgYSByZWFsIGhvbWUgZGlyZWN0b3J5IGF2YWlsYWJsZS4KKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWhvb2spOiBjcmVhdGUgL3Zhci9ydW4vZGJ1cworCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogYWRkIGluaXQgc2NyaXB0IGZvciBSZWQgSGF0IC9ldGMvaW5pdC5kCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYSBzdHlsZSBvZiBpbml0IHNjcmlwdAorCXRvIGluc3RhbGwKKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgRml4IHNvbWUgYW5ub3lpbmcgREJ1c1N0cmluZyBBUEkgYW5kIGZpeCBhbGwgYWZmZWN0ZWQgY29kZS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5pdCk6IGdldCByaWQgb2YgYW5ub3lpbmcKKwltYXhfbGVuZ3RoIGFyZ3VtZW50CisJKF9kYnVzX3N0cmluZ19nZXRfZGF0YSk6IGNoYW5nZSB0byByZXR1cm4gc3RyaW5nIGluc3RlYWQgb2YgdXNpbmcKKwlhbiBvdXQgcGFyYW0KKwkoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKTogZGl0dG8KKwkoX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbik6IGRpdHRvCisJKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4pOiBkaXR0bworCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL21haW4uYyAobWFpbik6IGZpeCB1cCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBuaWNlcgorCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiB1c2UgRVhQQU5ERURfTE9DQUxTVEFURURJUiB0bworCWRlZmluZSBEQlVTX1NZU1RFTV9CVVNfUEFUSCBhcyB3ZSB3YW50IHRvIGNvbXBpbGUgaW4gdGhlIHNhbWUKKwlmaW5hbCBsb2NhdGlvbiB0aGF0IGxhbmRzIGluIHRoZSBjb25maWcgZmlsZQorCisJKiBidXMvY29uZmlnLWxvYWRlci1leHBhdC5jIChidXNfY29uZmlnX2xvYWQpOiBmaXggdHlwZSBvZgorCVhNTF9QYXJzZXIgdmFyaWFibGUKKworCSogZG9jL1RPRE86IHJlbW92ZSBUT0RPIGl0ZW0gZm9yIGRidXNfYnVzX2dldCgpCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoYnVzX2RhdGFfZnJlZSk6IGFkZCBtaXNzaW5nIGxvY2svdW5sb2NrCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0KQorCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0KTogdGhlc2UgZGlkbid0IG5lZWQgdGhlICJzZXJ2ZXIiCisJYXJndW1lbnQgc2luY2UgdGhleSBhcmUgYWx3YXlzIGNsaWVudCBzaWRlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MpOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL21haW4uYyAobWFpbik6IHRha2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyBhbiBhcmd1bWVudC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZjogbmV3IGZpbGUgdG8KKwl1c2Ugd2l0aCBkaXNwYXRjaC5jIHRlc3RzIGZvciBleGFtcGxlCisKKwkqIGJ1cy90ZXN0LW1haW4uYyAobWFpbik6IHJlcXVpcmUgdGVzdCBkYXRhIGRpcgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGNoYW5nZSB0aGlzIHRvIHRha2UgYQorCWNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIGFzIGFyZ3VtZW50CisKKwkqIGRvYy9jb25maWctZmlsZS50eHQgKEVsZW1lbnRzKTogYWRkIDxzZXJ2aWNlZGlyPgorCisJKiBidXMvc3lzdGVtLmNvbmYsIGJ1cy9zZXNzaW9uLmNvbmY6IG5ldyBmaWxlcworCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6IGxvb2sgZm9yIHN5c3RlbSBidXMgb24KKwl3ZWxsLWtub3duIHNvY2tldCBpZiBub25lIHNldAorCisJKiBjb25maWd1cmUuaW46IGNyZWF0ZSBzeXN0ZW0uY29uZiBhbmQgc2Vzc2lvbi5jb25mCisKKzIwMDMtMDMtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IGhhY2tpbmcKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBkb24ndCB1c2UgREJ1c0xpc3QgZm9yIHRoZSBsaXN0IG9mIHN0dWZmCisJdG8gc2h1dCBkb3duLCBzaW5jZSBpdCBjb3VsZCBjYXVzZSB3ZWlyZG5lc3Mgd2l0aCB0aGUgREJ1c0xpc3QKKwlsb2NrCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfdGVzdCk6IGFkZCB0ZXN0cyBmb3IgdGhlCisJbGluay1vcmllbnRlZCBzdGFjayByb3V0aW5lcworCShhbGxvY19saW5rKTogZnJlZSB0aGUgbWVtcG9vbCBpZiB0aGUgZmlyc3QgYWxsb2MgZnJvbSBpdCBmYWlscworCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jIChzdHJ1Y3QgREJ1c01lbUJsb2NrKTogZml4IGFsaWdubWVudCBpc3N1ZQorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKFVOSUNPREVfVkFMSUQpOiBzeW5jIG5ldyB2ZXJzaW9uIG9mIHRoaXMKKwlmcm9tIEdMaWIKKwkoX2RidXNfc3RyaW5nX3NraXBfd2hpdGUpOiBuZXcKKworCSogZG9jL2NvbmZpZy1maWxlLnR4dCAoRWxlbWVudHMpOiBhZGQgPGluY2x1ZGVkaXI+CisKKzIwMDMtMDMtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2NvcHlfZGF0YV9sZW4pCisJKF9kYnVzX3N0cmluZ19jb3B5X2RhdGEpOiBuZXcgZnVuY3Rpb25zCisKKzIwMDMtMDMtMjggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IChidXNfZGF0YV9mcmVlKSwgKGRidXNfYnVzX2dldCk6CisJKiBkYnVzL2RidXMtYnVzLmg6CisJQWRkIGRidXNfYnVzX2dldC4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOgorCUZpeCBhIGRvYyBjb21tZW50LgorCisyMDAzLTAzLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC5jIChidXNfdGVzdF9mbHVzaF9idXMpOiByZW1vdmUgdGhlIHNsZWVwIGZyb20gaGVyZSwKKwlJIHRoaW5rIGl0IG1heSBoYXZlIGp1c3QgYmVlbiBzdXBlcnN0aXRpb24uIE5vdCBzdXJlLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19iYXNlNjRfZGVjb2RlKTogY2F0Y2ggc29tZSBPT00KKwlmYWlsdXJlcyB0aGF0IHdlcmUgbm90IGJlaW5nIGhhbmRsZWQuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfYXV0aCk6IGZpeCBhIG1lbWxlYWsgaW4gT09NIGhhbmRsaW5nCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogYWRkIGFiaWxpdHkgdG8gc2V0IG51bWJlciBvZiBtYWxsb2NzIGluIGEKKwlyb3cgdGhhdCB3aWxsIGZhaWwgb24gb3V0LW9mLW1lbW9yeS4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c190ZXN0X29vbV9oYW5kbGluZyk6IGNvbnZlbmllbmNlCisJZnVuY3Rpb24gZm9yIHRlc3Rpbmcgb3V0LW9mLW1lbW9yeSBoYW5kbGluZy4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyAobWVtc3VpdGUpOiBkb24ndCB3cmFwIHRoZSBkYnVzCisJYWxsb2NhdGlvbiBmdW5jdGlvbnMsIHRoZXkgZG8gbWFwIGV4YWN0bHkgdG8gdGhlIGV4cGF0IG9uZXMuCisKKzIwMDMtMDMtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLWxvYWRlci1saWJ4bWwuYyAoYnVzX2NvbmZpZ19sb2FkKTogYWRkIGFub3RoZXIgZXJyb3IKKwljaGVjaworCisyMDAzLTAzLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL1RPRE86CisJQWRkIG5vdGUgYWJvdXQgYXV0b21hdGljIHNlcnZpY2UgYWN0aXZhdGlvbi4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVJlbmFtZSB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgY2xhcmlmeSBhIGZldyB0aGluZ3MuCisKKzIwMDMtMDMtMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBEb3h5ZmlsZS5pbjoKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6CisJKiBkYnVzL2RidXMtZGljdC5jOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzoKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jOgorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJRml4IGRvY3VtZW50YXRpb24gd2FybmluZ3MuCisKKzIwMDMtMDMtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy90ZXN0LW1haW4uYywgZGJ1cy9kYnVzLXRlc3QuYyAobWFpbik6IGNoZWNrIG1lbWxlYWtzCisJYWZ0ZXIgZXZlcnkgdGVzdCBzbyBpdCdzIHF1aWNrIGFuZCBlYXN5IHRvIHNlZSB3aGljaCBsZWFrZWQsIGFuZAorCXNvIHdlIHRlc3QgbXVsdGlwbGUgZGJ1c19zaHV0ZG93bigpIGNhbGxzCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIGNvbmZpZ3VyZS5pbiBYTUwgc3R1ZmYgdG8gYWxzbyBzdXBwb3J0CisJZXhwYXQKKworCSogY29uZmlnLWxvYWRlci1saWJ4bWwuYzogc29tZSBoYWNraW5nCisKKwkqIGNvbmZpZy1sb2FkZXItZXhwYXQuYzogc29tZSBoYWNraW5nCisKKwkqIGNvbmZpZy1wYXJzZXIuYzogc29tZSBoYWNraW5nLCBwbHVzIHRlc3RzCisKKzIwMDMtMDMtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogdGhyb3VnaG91dCAtIGFkZCBtb3JlIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLXdpdGgteG1sIG9wdGlvbiB0byBzcGVjaWZ5IFhNTCBsaWJyYXJ5LAorCXJpZ2h0IG5vdyBvbmx5IGxpYnhtbCBpcyBzdXBwb3J0ZWQuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWxpYnhtbC5jLCBjb25maWctcGFyc2VyLmM6IHN5bmMgc29tZSBtaW5vcgorCW5vbndvcmtpbmcgY29kZSBiZXR3ZWVuIGhvbWUgYW5kIHdvcmssIHN0aWxsIGp1c3Qgc3R1YnMKKworMjAwMy0wMy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9mZF9ub25ibG9ja2luZyk6IG1vdmUgdG8gdGhpcworCWZpbGUKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvciwgZGJ1c19zZXRfZXJyb3JfY29uc3QpOiBhbGxvdworCU5VTEwgYXJndW1lbnQgZm9yICJtZXNzYWdlIiBpZiB0aGUgZXJyb3IgaXMgYSB3ZWxsLWtub3duIG9uZSwKKwlmaWxsIGluIGEgZ2VuZXJpYyBtZXNzYWdlIGluIHRoaXMgY2FzZS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQnVzUmVzdWx0Q29kZSk6IEtpbGwgREJ1c1Jlc3VsdENvZGUgaW4KKwlmYXZvciBvZiBEQnVzRXJyb3IKKworCSogYnVzL3Rlc3QuYyAoYnVzX3Rlc3RfZmx1c2hfYnVzKTogYWRkCisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV90ZXN0KTogdGVzdCBjb2RlIHN0dWIKKworMjAwMy0wMy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdXAKKwl0aGUgImNhbiB0aGlzIHVzZXIgY29ubmVjdCIgZnVuY3Rpb24sIGJ1dCBpdCBhbHdheXMgcmV0dXJucworCVRSVUUgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZyBmaWxlIHBhcnNlciBzbyB3ZSBjYW4gaGF2ZSBhIGNvbmZpZworCWZpbGUgdGhhdCBhbGxvd3MgY29ubmVjdGlvbnMuCisKKzIwMDMtMDMtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGRidXNfbXV0ZXhfbmV3LCBkYnVzX2NvbmR2YXJfbmV3KTogd2l0aAorCURCVVNfQlVJTERfVEVTVFMsIGFjdHVhbGx5IGFsbG9jL2ZyZWUgYSBibG9jayBvZiBtZW1vcnkgZm9yCisJdGhlIG11dGV4LCBzbyB3ZSBjYW4gY2hlY2sgZm9yIHByb3BlciBtZW1vcnkgbWFuYWdlbWVudAorCWFuZCBPT00gaGFuZGxpbmcuCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOiByZW1vdmUgdGhlIG11dGV4IGZyb20KKwlEQnVzRGF0YVNsb3RBbGxvY2F0b3IgYW5kIGxvY2sgaXQgbWFudWFsbHkgd2hlbiB1c2luZyBpdCwKKwl0byBzaW1wbGlmeSBmaXR0aW5nIGl0IGludG8gdGhlIGdsb2JhbCBzbG90cyBmcmFtZXdvcmsuCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGluaXRfc3RhdGljX2xvY2tzKTogcmV3b3JrIGhvdyB3ZSdyZQorCWhhbmRsaW5nIGdsb2JhbCBsb2NrcyBzbyB0aGV5IGFyZSBlYXNpbHkgc2h1dCBkb3duLgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfYXBwZW5kX3J1bGUpOiBmaXgKKworCSogYnVzL3Rlc3QtbWFpbi5jIChtYWluKTogY2hlY2sgZm9yIG1lbWxlYWtzCisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBtYWtlCisJdGVzdCBzdWl0ZSBjaGVjayBmb3IgbWVtbGVha3MKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBhZGQgc3VwcG9ydCBpbiB0ZXN0IG1vZGUgZm9yIHRyYWNraW5nCisJbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJsb2NrcworCisyMDAzLTAzLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvcG9saWN5LmMsIGJ1cy9idXMuYywgYnVzL2Nvbm5lY3Rpb24uYzogaW1wbGVtZW50IGFsbG93L2RlbnkKKwlwb2xpY2llcyBjb2RlCisKKwkqIGRidXMvZGJ1cy1oYXNoLmg6IGFkZCBVTE9ORyBoYXNoIGtleXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2V0X2dyb3Vwcyk6IG5ldworCShfZGJ1c19nZXRfZ3JvdXBfaWQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uKToKKwluZXcgZnVuY3Rpb24KKwkoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMy0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IpOiBhc3NlcnQgdGhhdAorCW1lc3NhZ2UgaGFzIGEgc2VuZGVyCisJKGNvbm5lY3Rpb25fZXhlY3V0ZV90cmFuc2FjdGlvbik6IGRpdHRvCisJKGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvcik6IGZpeCB0byBzZXQgdGhlIHNlbmRlciwgYW5kCisJc2V0IHJlY2lwaWVudCB0byB0aGUgZGVzdGluYXRpb24gc2VydmljZSwgbm90IHRoZSBidXMgZHJpdmVyCisKKwkqIGJ1cy9wb2xpY3kuYzogaGFja2luZworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2Vfc2VydmljZV9pcyk6IG5ldyBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2Vfc2VuZGVyX2lzKTogbmV3CisKKzIwMDMtMDMtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmM6IHN0YXJ0IHNrZXRjaGluZyBjb2RlIGZvciBwb2xpY3kgcmVzdHJpY3Rpb25zIG9uCisJd2hhdCBjb25uZWN0aW9ucyBjYW4gZG8uCisKKzIwMDMtMDMtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogc29tZSBub3RlcyBvbiBoaWdoLWxldmVsIHRvZG8gaXRlbXMuIExpdHRsZSBuaXRwaWNrCisJc3R1ZmYgaXMgYWxsIGluIEB0b2RvLCBzbyBubyBuZWVkIHRvIGFkZCBpdCBoZXJlLgorCisJKiBkb2MvY29uZmlnLWZpbGUudHh0OiBzb21lIG5vdGVzIG9uIGhvdyBjb25maWcgZmlsZSBtaWdodCBsb29rCisKKzIwMDMtMDMtMTggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46IDAuNgorCisJKiBORVdTOiBVcGRhdGUuCisKKzIwMDMtMDMtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGFkZCBnY2MgYXR0cmlidXRlcyBzbyB0aGF0CisJb3VyIHByaW50Zi1zdHlsZSBmdW5jdGlvbnMgd2FybiBvbiBiYWQgYXJndW1lbnRzIHRvCisJZm9ybWF0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCk6IGZpeCBwcmludGYKKwlmb3JtYXQgYnVnCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKTogZml4CisJcHJpbnRmIGZvcm1hdCBidWcKKworMjAwMy0wMy0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy90ZXN0LW1haW4uYyAobWFpbik6IG1ha2UgaXQgcHJpbnQgc29tZXRoaW5nIGFzIGl0IHJ1bnMKKwlzbyBtYWtlIGNoZWNrIGRvZXNuJ3QgbG9vayBzdHVjaworCisJKiBkb2MvbmVnb3RpYXRpb24udHh0LCBkb2MvZGJ1cy1zYXNsLXByb2ZpbGUudHh0OiByZW1vdmUKKwlmcm9tIENWUywgbm93IG9ic29sZXRlCisKKzIwMDMtMDMtMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaCk6CisJUmVmZXRjaCB0aGUgc2VydmljZSBuYW1lIHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gcmVhbGxvY2F0ZWQKKwl3aGVuIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIHdhcyBjYWxsZWQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IChfZGJ1c19hY2NlcHQpOgorCUFkZCBhZGRyZXNzIGFuZCBhZGRyZXNzIGxlbmd0aCB2YXJpYWJsZXMgYW5kIHVzZSB0aGVtIHRvIHN0b3AKKwl2YWxncmluZCBmcm9tIGNvbXBsYWluaW5nLgorCisyMDAzLTAzLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJQWxsIHRlc3RzIHBhc3MsIG5vIG1lbWxlYWtzLCBubyB2YWxncmluZCBjb21wbGFpbnRzLgorCisJKiBidXMvdGVzdC5jOiByZWZjb3VudCBoYW5kbGVyX3Nsb3QKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX25ldyk6IHJlZmNvdW50CisJY29ubmVjdGlvbl9kYXRhX3Nsb3QKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IGRlbGV0ZSB1bnVzZWQKKwlieXRlcyBzbyB0aGF0IGF1dGggc2NyaXB0cyBwYXNzLgorCisJKiBidXMvZGlzcGF0Y2guYzogaW5pdCBtZXNzYWdlX2hhbmRsZXJfc2xvdCBzbyBpdCBnZXRzIGFsbG9jYXRlZAorCXByb3Blcmx5CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChtZXNzYWdlX2hhbmRsZXJfc2xvdF9yZWYpOiBmaXggbWVtbGVhaworCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3KToKKwlkZWFsbG9jIHNlcnZlcl9waXBlX2hhc2ggd2hlbiBubyBsb25nZXIgdXNlZCBmb3IgYmVuZWZpdCBvZgorCWxlYWsgY2hlY2tpbmcKKworCSogZGJ1cy9kYnVzLWF1dGguYyAocHJvY2Vzc19jb21tYW5kKTogbWVtbGVhayBmaXgKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2hlbGxvX21lc3NhZ2UpOiBtZW1sZWFrIGZpeAorCisyMDAzLTAzLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGVuc3VyZV9idXNfZGF0YSk6IGZpeCBkb3VibGUtdW5yZWYgb2YgdGhlIGRhdGEgc2xvdAorCisyMDAzLTAzLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IEFwcGVuZAorCXRoZSBwZW5kaW5nIGFjdGl2YXRpb24gZW50cnkgdG8gdGhlIGxpc3Qgb2YgcGVuZGluZyBhY3RpdmF0aW9ucy4KKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogcmVtb3ZlIGRvdWJsZS11bnJlZnMgb2YKKwljb25uZWN0aW9ucworCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChjcmVhdGVfZW50cnkpOiBmaXggT09NIGhhbmRsaW5nIHdoZW4KKwlmYWlsaW5nIHRvIGFsbG9jIGVudHJ5LT5tZXRob2QKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKF9kYnVzX3dhdGNoX25ldyk6IGhhbmRsZSBmYWlsdXJlIHRvIG1hbGxvYworCXRoZSB3YXRjaAorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwlhZGQgc29tZSBtaXNzaW5nIGRidXNfc2V0X3Jlc3VsdAorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uKTogaGFuZGxlIGZhaWx1cmUgdG8KKwlhbGxvYyB0aGUgREJ1c01lc3NhZ2VIYW5kbGVyCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QpOiBkb24ndCByZWYKKwl0aGUgdHJhbnNwb3J0IGhlcmUsIHNpbmNlIHdlIGNhbGwgdGhpcyBmcm9tIHRoZSBmaW5hbGl6ZXI7IGl0CisJcmVzdWx0ZWQgaW4gYSBkb3VibGUtZmluYWxpemUuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QpOiBmaXggYSBidWcKKwl3aGVyZSB3ZSB0cmllZCB0byB1c2UgdHJhbnNwb3J0LT5jb25uZWN0aW9uIHRoYXQgd2FzIE5VTEwsCisJaGFwcGVuZWQgd2hlbiB0cmFuc3BvcnQgd2FzIGRpc2Nvbm5lY3RlZCBlYXJseSBvbiBkdWUgdG8gT09NCisKKwkqIGJ1cy8qLmM6IGFkYXB0IHRvIGhhbmRsZSBPT00gZm9yIHdhdGNoZXMvdGltZW91dHMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IHBvcnQgdG8gaGFuZGxlIE9PTSBkdXJpbmcKKwl3YXRjaCBoYW5kbGluZworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMpOiByZXR1cm4gYQorCXJlZmVyZW5jZSB0byB1bnVzZWQgYnl0ZXMgaW5zdGVhZCBvZiBhIGNvcHkKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9oYW5kbGVfd2F0Y2gpOiByZXR1cm4gRkFMU0UgZm9yCisJb3V0IG9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKTogcmV0dXJuCisJRkFMU0Ugb24gT09NCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMgKGRidXNfdGltZW91dF9oYW5kbGUpOiByZXR1cm4gRkFMU0UgZm9yIG91dAorCW9mIG1lbW9yeQorCisyMDAzLTAzLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCURvY3VtZW50IHJlcGx5IG1lc3NhZ2UgZm9yIEFjdGl2YXRlU2VydmljZS4KKworMjAwMy0wMy0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUpLAorCShidXNfcGVuZGluZ19hY3RpdmF0aW9uX2ZyZWUpLCAoYnVzX2FjdGl2YXRpb25fbmV3KSwKKwkoYnVzX2FjdGl2YXRpb25fdW5yZWYpLCAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL2J1cy5jOiAoYnVzX2NvbnRleHRfbmV3KToKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzogKG5ld19zZWN0aW9uKToKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3JlZ2lzdHJ5X25ldyksIChidXNfcmVnaXN0cnlfZW5zdXJlKToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJTWFrZSBhY3RpdmF0aW9uIHdvcmsgYmV0dGVyLiBOb3cgcGVuZGluZyBhY3RpdmF0aW9ucyB3aWxsIGJlIHF1ZXVlZAorCWFuZCB0aGUgZGFlbW9uIHdvbid0IHRyeSB0byBhY3RpdmF0ZSBzZXJ2aWNlcyB0aGF0IGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQuCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZW5zdXJlX2J1c19kYXRhKTogaGFuZGxlIGZhaWx1cmUgdG8gc2V0CisJY29ubmVjdGlvbiBkYXRhCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcpOiBzdXBwb3J0CisJREJVU19NQUxMT0NfQkFDS1RSQUNFUyB0byBwcmludCB0cmFjZSB3aGVuIGZhaWxpbmcgYW4gYWxsb2MKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IG9vcHMsIHVuYnJlYWsKKwl0aGlzLiBhbHdheXMgcnVuIHRoZSB0ZXN0IHN1aXRlIGJlZm9yZSBjb21taXQuLi4KKworCSogYnVzLyo6IGFkYXB0IHRvIERCdXNDb25uZWN0aW9uIEFQSSBjaGFuZ2VzCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byBEQnVzQ29ubmVjdGlvbiBBUEkgY2hhbmdlcywKKwlyZXF1aXJlcyByZW5hbWluZyBzdHVmZiB0byBhdm9pZCBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggbmFtZQorCWNvbmZsaWN0LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyk6IG5ldworCWZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKToKKwlzZXBhcmF0ZSBmcm9tIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWVzc2FnZXMpOiByZW1vdmUKKwl0aGlzLCBiZWNhdXNlIGl0J3Mgbm93IGFsd2F5cyBicm9rZW4gdG8gdXNlOyB0aGUgbnVtYmVyIG9mCisJbWVzc2FnZXMgaW4gcXVldWUgdnMuIHRoZSBudW1iZXIgc3RpbGwgYnVmZmVyZWQgYnkgdGhlIG1lc3NhZ2UKKwlsb2FkZXIgaXMgdW5kZWZpbmVkL21lYW5pbmdsZXNzLiBTaG91bGQgdXNlCisJZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0ZSgpLgorCShkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiByZW5hbWUgZnJvbQorCWRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBjb3B5IGluIGEgcmVhbAorCWltcGxlbWVudGF0aW9uCisKKzIwMDMtMDMtMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6CisJRGVjcmVhc2UgY29ubmVjdGlvbi0+bl9pbmNvbWluZyB3aGVuIHJlbW92aW5nIGFuIGVudHJ5CisJZnJvbSB0aGUgbGlzdC4KKwkqIGRidXMvZGJ1cy1kaWN0LmM6IChkYnVzX2RpY3RfZW50cnlfZnJlZSksCisJKGRidXNfZGljdF9zZXRfYm9vbGVhbl9hcnJheSksIChkYnVzX2RpY3Rfc2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF91aW50MzJfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3Rfc2V0X2J5dGVfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X2J5dGVfYXJyYXkpOgorCUhhbmRsZSBOVUxMIGFycmF5cyBhbmQgc3RyaW5ncy4gQWxzbyBhZGQgc3VwcG9ydCBmb3IgYnl0ZSBhcnJheXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkpLAorCShfZGJ1c19tYXJzaGFsX2RpY3QpLCAoX2RidXNfZGVtYXJzaGFsX2J5dGVfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfaW50MzJfYXJyYXkpLCAoX2RidXNfZGVtYXJzaGFsX3VpbnQzMl9hcnJheSksCisJKF9kYnVzX2RlbWFyc2hhbF9kb3VibGVfYXJyYXkpLCAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSksCisJKF9kYnVzX2RlbWFyc2hhbF9kaWN0KSwgKGRlbWFyc2hhbF9hbmRfdmFsaWRhdGVfbGVuKSwKKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJQWRkIHN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nIGVtcHR5IGFycmF5cyBhbmQgc3RyaW5ncy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZ19hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jvb2xlYW5fYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfaW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfdWludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RvdWJsZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZ19hcnJheSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZGljdCksCisJKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpOgorCUFkZCBzdXBwb3J0IGZvciBnZXR0aW5nIGVtcHR5IGFycmF5cyBhbmQgZGljdHMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogKF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4KToKKwlEb24ndCBkbyBhbnkgdmFsaWRhdGlvbiBhdCBhbGwgZm9yIG5vdywgdGhhdCdzIGJldHRlciB0aGFuIGp1c3QgY2hlY2tpbmcKKwlmb3IgQVNDSUkuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZToKKwlOZXcgdGVzdCBtZXNzYWdlIHdpdGggbG90cyBvZiBlbXB0eSBhcnJheXMuCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmspOiBuZXcgZnVuY3Rpb24gdGhhdAorCWNhbid0IGZhaWwgZHVlIHRvIE9PTQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rKToKKwluZXcgZnVuY3Rpb24gcG9wcyBhIG1lc3NhZ2UgdG9nZXRoZXIgd2l0aCBhIGxpc3QgbGluaworCWNvbnRhaW5pbmcgaXQuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChxdWV1ZV9tZXNzYWdlcyk6IHVzZSBuZXcgbGluay1iYXNlZAorCW1lc3NhZ2UgcXVldWluZyBmdW5jdGlvbnMgdG8gYXZvaWQgbmVlZGluZyB0byBhbGxvYyBtZW1vcnkKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCU9vcHMgLSB0ZXN0IGNvZGUgd2FzIG9ubHkgdGVzdGluZyBmYWlsdXJlIG9mIGFyb3VuZCAzMCBvZiB0aGUKKwltYWxsb2NzIGluIHRoZSB0ZXN0IHBhdGgsIGJ1dCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIDUwMCsKKwltYWxsb2NzLiBJIGJlbGlldmUgdGhpcyB3YXMgZHVlIHRvIG1pc2d1aWRlZCBsaW5raW5nIHNldHVwIHN1Y2gKKwl0aGF0IHRoZXJlIHdhcyBvbmUgY29weSBvZiBkYnVzX21hbGxvYyBldGMuIGluIHRoZSBkYWVtb24gYW5kIG9uZQorCWluIHRoZSBzaGFyZWQgbGliLCBhbmQgb25seSBkYWVtb24gbWFsbG9jcyB3ZXJlIHRlc3RlZC4gSW4gYW55CisJY2FzZSwgdGhlIHRlc3QgY2FzZSBub3cgdGVzdHMgYWxsIDUwMCsgbWFsbG9jcywgYW5kIGRvZXNuJ3QgcGFzcworCXlldCwgdGhvdWdoIHRoZXJlIGFyZSBsb3RzIG9mIGZpeGVzIGluIHRoaXMgcGF0Y2guCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlKTogZml4CisJdGhpcyBzbyB0aGF0IGl0IGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnksIHNpbmNlIGl0CisJaGFzIG5vIHdheSBvZiBpbmRpY2F0aW5nIGZhaWx1cmUgZHVlIHRvIE9PTSAoYW5kIHdvdWxkIGJlCisJYW5ub3lpbmcgaWYgaXQgZGlkKS4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayk6IG5ldyBmdW5jdGlvbgorCisJKiBidXMvTWFrZWZpbGUuYW06IHJlYXJyYW5nZSB0byBjcmVhdGUgdHdvIHNlbGYtY29udGFpbmVkCisJbGlicmFyaWVzLCB0byBhdm9pZCBoYXZpbmcgbGlicmFyaWVzIHdpdGggb3ZlcmxhcHBpbmcgc3ltYm9scy4KKwl0aGF0IHdhcyByZXN1bHRpbmcgaW4gd2VpcmRuZXNzLCBlLmcuIEknbSBwcmV0dHkgc3VyZSB0aGVyZQorCXdlcmUgdHdvIGNvcGllcyBvZiBnbG9iYWwgc3RhdGljIHZhcmlhYmxlcy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiBtb3ZlIHRoZSBtYWxsb2MgZGVidWcgc3R1ZmYgdG8KKwlkYnVzLW1lbW9yeS5jCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKGZyZWVfbGluayk6IGZyZWUgbGlzdCBtZW1wb29sIGlmIGl0IGJlY29tZXMKKwllbXB0eS4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jIChfZGJ1c19kaXNhYmxlX21lbV9wb29scyk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChkYnVzX3BhcnNlX2FkZHJlc3MpOiBmcmVlIGxpc3Qgbm9kZXMKKwlvbiBmYWlsdXJlLgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uKTogZnJlZQorCW1lc3NhZ2VfaGFuZGxlcl9zbG90IHdoZW4gbm8gbG9uZ2VyIHVzaW5nIGl0LCBzbworCW1lbW9yeSBsZWFrIGNoZWNrZXJzIGFyZSBoYXBweSBmb3IgdGhlIHRlc3Qgc3VpdGUuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIChkZWJ1Z19maW5hbGl6ZSk6IGZyZWUgc2VydmVyIG5hbWUKKworCSogYnVzL2J1cy5jIChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayk6IGRpc2Nvbm5lY3QgaW4gaGVyZSBpZgorCWJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIGZhaWxzLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfdW5yZWYpOiBmaXggdG8gZnJlZSB0aGUKKwljb25uZWN0aW9ucworCShidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbik6IGlmIHRoaXMgZmFpbHMsIGRvbid0CisJZGlzY29ubmVjdCB0aGUgY29ubmVjdGlvbiwganVzdCBiZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlCisJZWZmZWN0cy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jICh1bmRvX2FsaWdubWVudCk6IHVuYnJlYWsgdGhpcworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3VucmVmKTogZnJlZSBzb21lIHN0dWZmIHdlIHdlcmUKKwlsZWFraW5nCisJKF9kYnVzX2F1dGhfbmV3KTogZml4IHRoZSBvcmRlciBpbiB3aGljaCB3ZSBmcmVlIHN0cmluZ3MKKwlvbiBPT00gZmFpbHVyZQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpOiBmaXggdG8KKwlub3Qgc2VuZCBTZXJ2aWNlRGVsZXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBjYXNlIG9mIG1lbW9yeQorCWFsbG9jYXRpb24gZmFpbHVyZQorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldF9iYXNlX3NlcnZpY2UpOiBuZXcgZnVuY3Rpb24gdG8KKwlnZXQgdGhlIGJhc2Ugc2VydmljZSBuYW1lCisJKGRidXNfYnVzX3JlZ2lzdGVyX2NsaWVudCk6IGRvbid0IHJldHVybiBiYXNlIHNlcnZpY2UgbmFtZSwKKwlpbnN0ZWFkIHN0b3JlIGl0IG9uIHRoZSBEQnVzQ29ubmVjdGlvbiBhbmQgaGF2ZSBhbiBhY2Nlc3NvcgorCWZ1bmN0aW9uIGZvciBpdC4KKwkoZGJ1c19idXNfcmVnaXN0ZXJfY2xpZW50KTogcmVuYW1lIGRidXNfYnVzX3JlZ2lzdGVyKCkKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2hlbGxvX21lc3NhZ2UpOiB2ZXJpZnkgdGhhdCBvdGhlcgorCWNvbm5lY3Rpb25zIG9uIHRoZSBidXMgYWxzbyBnb3QgdGhlIGNvcnJlY3QgcmVzdWx0cywgbm90CisJanVzdCB0aGUgb25lIHNlbmRpbmcgaGVsbG8KKworMjAwMy0wMy0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCU1ha2UgaXQgcGFzcyB0aGUgSGVsbG8gaGFuZGxpbmcgdGVzdCBpbmNsdWRpbmcgYWxsIE9PTSBjb2RlcGF0aHMuCisJTm93IHRvIGRvIG90aGVyIG1lc3NhZ2VzLi4uCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZV9yZW1vdmVfb3duZXIpOiBmaXggY3Jhc2ggd2hlbgorCXJlbW92aW5nIG93bmVyIGZyb20gYW4gZW1wdHkgbGlzdCBvZiBvd25lcnMKKwkoYnVzX3JlZ2lzdHJ5X2Vuc3VyZSk6IGRvbid0IGxlYXZlIHNlcnZpY2UgaW4gdGhlIGxpc3Qgb2YKKwlhIGNvbm5lY3Rpb24ncyBvd25lZCBzZXJ2aWNlcyBpZiB3ZSBmYWlsIHRvIHB1dCB0aGUgc2VydmljZQorCWluIHRoZSBoYXNoIHRhYmxlLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IpOiBzZXQKKwllcnJvciBmbGFnIG9uIHRoZSBPT00gZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOgorCWhhbmRsZSBfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gZmFpbHVyZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQpOiBtb2RpZnkKKwl0byBjcmVhdGUgd2F0Y2hlcyB1cCBmcm9udCBhbmQgc2ltcGx5IGVuYWJsZS9kaXNhYmxlIHRoZW0gYXMKKwluZWVkZWQuCisJKHVuaXhfY29ubmVjdGlvbl9zZXQpOiB0aGlzIGNhbiBub3cgZmFpbCBvbiBPT00KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuYywgZGJ1cy9kYnVzLXdhdGNoLmM6IGFkZCBjb25jZXB0CisJb2YgZW5hYmxpbmcvZGlzYWJsaW5nIGEgd2F0Y2ggb3IgdGltZW91dC4KKworCSogYnVzL2xvb3AuYyAoYnVzX2xvb3BfaXRlcmF0ZSk6IGRvbid0IHRvdWNoIGRpc2FibGVkCisJd2F0Y2hlcy90aW1lb3V0cworCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRhcHQgdG8gZW5hYmxlL2Rpc2FibGUgd2F0Y2hlcyBhbmQgdGltZW91dHMKKworMjAwMy0wMy0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogT0ssIG5vdyBmaW5hbGx5IGFjdHVhbGx5CisJd3JpdGUgdXNlZnVsIHRlc3QgY29kZSwgYWZ0ZXIgYWxsIHRoYXQgZnV0emluZyBhcm91bmQgOy0pCisKKwlUZXN0IGRvZXMgbm90IHlldCBwYXNzIGJlY2F1c2Ugd2UgY2FuJ3QgaGFuZGxlIE9PTSBpbgorCV9kYnVzX3RyYW5zcG9ydF9tZXNzYWdlc19wZW5kaW5nIChiYXNpY2FsbHksCisJZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQoKSBkb2VzIG5vdCBwcmVhbGxvYyB0aGUgd3JpdGUKKwl3YXRjaCkuIFRvIGZpeCB0aGlzLCBJIHRoaW5rIHdlIG5lZWQgdG8gYWRkIG5ldyBzdHVmZiB0bworCXNldF93YXRjaF9mdW5jdGlvbnMsIG5hbWVseSBhIFNldEVuYWJsZWQgZnVuY3Rpb24gc28gd2UgY2FuIGFsbG9jCisJdGhlIHdhdGNoIGVhcmxpZXIsIHRoZW4gZW5hYmxlIGl0IGxhdGVyLgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChsaWJkYnVzX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMpOiBtb3ZlCisJZGJ1cy1tZW1vcnkuYyB0byB0aGUgY29udmVuaWVuY2UgbGliCisKKwkqIGJ1cy90ZXN0LmM6IHJlbmFtZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMgdG8ga2VlcCB0aGVtIGNsZWFybHkKKwlkaXN0aW5jdCBmcm9tIHN0dWZmIGluIGNvbm5lY3Rpb24uYy4gSGFuZGxlIGNsaWVudCBkaXNjb25uZWN0aW9uLgorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3QpOiBkbyB0ZXN0IHVzaW5nIGRlYnVnLXBpcGUKKwl0cmFuc3BvcnQsIHRlc3RzIG1vcmUgb2YgdGhlIHJlYWwgY29kZXBhdGguIFNldCB1cCBjbGllbnRzCisJd2l0aCBidXNfc2V0dXBfZGVidWdfY2xpZW50LgorCisJKiBidXMvdGVzdC5jIChidXNfc2V0dXBfZGVidWdfY2xpZW50KTogZnVuY3Rpb24gdG8gc2V0IHVwIGRlYnVnCisJImNsaWVudHMiIG9uIHRoZSBtYWluIGxvb3AKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfb3Blbik6IGFkZCBkZWJ1Zy1waXBlCisJc3VwcG9ydAorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IGFkZCBkZWJ1Zy1waXBlCisJc2VydmVyIHR5cGUKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy5jOiBzdXBwb3J0IGEgZGVidWcgc2VydmVyIGJhc2VkIG9uIHBpcGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfY2xvc2UpOiBuZXcgZnVuY3Rpb24KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3Igc29ja2V0cGFpcgorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBhZGQgYSAiZGV0ZWN0IGJ1ZmZlciBvdmVyd3JpdGVzIG9uIGZyZWUiCisJY2hlZXN5IGhhY2sKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOiByZXdvcmsgdGhpcyBhIGdvb2QgYml0IHRvIGJlCisJbGVzcyBjb21wbGljYXRlZC4gaG9wZWZ1bGx5IHN0aWxsIHdvcmtzLgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmMgKGhhbmRsZV9uZXdfY2xpZW50KTogcmVtb3ZlIHRpbWVvdXQKKwltYW51YWxseQorCisJKiBnbGliL2RidXMtZ21haW4uYyAodGltZW91dF9oYW5kbGVyKTogZG9uJ3QgcmVtb3ZlIHRpbWVvdXQKKwlhZnRlciBydW5uaW5nIGl0CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9jb3B5KTogcmVuYW1lIGZyb20KKwlkYnVzX21lc3NhZ2VfbmV3X2Zyb21fbWVzc2FnZSwgZml4IGl0IHVwIHRvIGNvcHkKKwlhbGwgdGhlIG1lc3NhZ2UgZmllbGRzLCBhZGQgdGVzdCBjYXNlCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IGFkZCBzb21lIG1vcmUgdGVzdCBjb2RlLAorCW5vdCBxdWl0ZSBwYXNzaW5nIHlldAorCisyMDAzLTAzLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvbG9vcC5jIChidXNfbG9vcF9pdGVyYXRlKTogYWRkIHRoaXMgc28gd2UgY2FuICJydW4gbG9vcAorCXVudGlsIG5vIHdvcmsgcmVtYWlucyIgaW4gdGVzdCBjb2RlLiAodGhlIGxhcmdlIGRpZmYgaGVyZQorCWlzIGp1c3QgY29kZSBtb3ZlbWVudCwgbm8gYWN0dWFsIGNoYW5nZXMpCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWcuYyAoREVGQVVMVF9JTlRFUlZBTCk6IGNoYW5nZSBpbnRlcnZhbCB0bworCTEsIG5vIHBvaW50IHdhaXRpbmcgYXJvdW5kIGZvciB0ZXN0IGNvZGUuCisJKF9kYnVzX3NlcnZlcl9kZWJ1Z19hY2NlcHRfdHJhbnNwb3J0KTogdW5yZWYgdGhlIHRpbWVvdXQKKwlhZnRlciBhZGRpbmcgaXQgKHJpZ2h0PykKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jIChERUZBVUxUX0lOVEVSVkFMKTogZGl0dG8KKworMjAwMy0wMy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMgKF9kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zKTogaGFuZGxlCisJb3V0IG9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zKTogaGFuZGxlIG91dAorCW9mIG1lbW9yeQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBNYWtlIEFkZFdhdGNoRnVuY3Rpb24gYW5kCisJQWRkVGltZW91dEZ1bmN0aW9uIHJldHVybiBhIGJvb2wgc28gdGhleSBjYW4gZmFpbCBvbiBvdXQtb2YtbWVtb3J5CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogc2V0IHVwIHRpbWVvdXQgaGFuZGxlcnMKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBzZXQgdXAKKwl0aW1lb3V0IGhhbmRsZXJzCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGFwdCB0byB0aGUgZmFjdCB0aGF0IHNldF9mdW5jdGlvbnMgc3R1ZmYKKwljYW4gZmFpbAorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGFkYXB0IHRvIGNoYW5nZXMKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogYWRhcHQgdG8gY2hhbmdlcworCisJKiB0ZXN0L3dhdGNoLmM6IGFkYXB0IHRvIERCdXNXYXRjaCBjaGFuZ2VzCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IHN0YXJ0ZWQgYWRkaW5nIHRoaXMgYnV0CisJZGlkbid0IGZpbmlzaAorCisyMDAzLTAzLTE0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKHNlbmRfc2VydmljZV9ub25leGlzdGVudF9lcnJvcik6IEZpeCB0eXBvLgorCisyMDAzLTAzLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC5jLCBidXMvdGVzdC5oLCBidXMvTWFrZWZpbGUuYW0sIGJ1cy90ZXN0LW1haW4uYzoKKwlzZXQgdXAgYSB0ZXN0IGZyYW1ld29yayBhcyBmb3IgdGhlIGxpYnJhcnkKKworMjAwMy0wMy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRocm91Z2hvdXQ6IHB1cmdlIGdsb2JhbCB2YXJpYWJsZXMsIGludHJvZHVjZSBCdXNBY3RpdmF0aW9uLAorCUJ1c0Nvbm5lY3Rpb25zLCBCdXNSZWdpc3RyeSwgZXRjLiBvYmplY3RzIGluc3RlYWQuCisKKwkqIGJ1cy9idXMuaCwgYnVzL2J1cy5jOiBpbnRyb2R1Y2UgQnVzQ29udGV4dCBhcyBhIGdsb2JhbAorCW1lc3NhZ2UgYnVzIG9iamVjdAorCisJKiB0ZXN0L01ha2VmaWxlLmFtIChURVNUX0JJTkFSSUVTKTogZGlzYWJsZSBidXMtdGVzdCBmb3Igbm93LAorCWdvaW5nIHRvIHJlZG8gdGhpcyBhIGJpdCBkaWZmZXJlbnRseSBJIHRoaW5rCisKKzIwMDMtMDMtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIE1lZ2EtcGF0Y2ggdGhhdCBnZXRzIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gaW5pdGlhbGx5IGhhbmRsaW5nCisJb3V0LW9mLW1lbW9yeS4gV29yayBzdGlsbCBuZWVkZWQuIEFsc28gbG90cyBvZiByYW5kb20KKwltb3Zpbmcgc3R1ZmYgdG8gREJ1c0Vycm9yIGluc3RlYWQgb2YgUmVzdWx0Q29kZS4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOiB1c2UgREJ1c0Vycm9yCisKKwkqIGRidXMvZGJ1cy1idXMuYzogYWRhcHQgdG8gQVBJIGNoYW5nZXMsIG1ha2UgaXQgdXNlIERCdXNFcnJvciBub3QKKwlEQnVzUmVzdWx0Q29kZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IGRyb3AgdGhlIHJlc3VsdAorCWNvZGUgaGVyZSwgYXMgdGhlIG9ubHkgZmFpbHVyZSBwb3NzaWJsZSBpcyBPT00uCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QpOgorCXJlbmFtZSBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgYXMgaXQncyBhIG5vdGlmaWNhdGlvbiBvbmx5CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogZG9uJ3QgZnJlZQorCSJuYW1lIiBvbiBnZXRfYXJncyBmYWlsdXJlLCBzaG91bGQgYmUgZG9uZSBieSBnZXRfYXJnczsKKwlkb24ndCBkaXNjb25uZWN0IGNsaWVudCBmb3IgYmFkIGFyZ3MsIGp1c3QgcmV0dXJuIGFuIGVycm9yLgorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6IGRpdHRvCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfc2VydmljZXNfbGlzdCk6IE5VTEwtdGVybWluYXRlIHJldHVybmVkIGFycmF5CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCkKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpOiBzZW5kIG1lc3NhZ2VzIGZyb20gZHJpdmVyIHRvIGEKKwlzcGVjaWZpYyBjbGllbnQgdG8gdGhlIGNsaWVudCdzIHVuaXF1ZSBuYW1lLCBub3QgdG8gdGhlIGJyb2FkY2FzdAorCXNlcnZpY2UuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IHJlamVjdCBtZXNzYWdlcyB0aGF0CisJY29udGFpbiBubyBuYW1lIGZpZWxkCisJKF9kYnVzX21lc3NhZ2VfZ2V0X2NsaWVudF9zZXJpYWwpOiByZW5hbWUgdG8KKwlkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCBhbmQgbWFrZSBwdWJsaWMKKwkoX2RidXNfbWVzc2FnZV9zZXRfc2VyaWFsKTogcmVuYW1lIGZyb20gc2V0X2NsaWVudF9zZXJpYWwKKwkoX2RidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsKTogbWFrZSBwdWJsaWMKKwkoX2RidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsKTogbWFrZSBwdWJsaWMKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZm9yZWFjaCk6IGFsbG93IHN0b3BwaW5nCisJaXRlcmF0aW9uIGJ5IHJldHVybmluZyBGQUxTRSBmcm9tIGZvcmVhY2ggZnVuY3Rpb24uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCkKKwkoZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQpCisJKGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKTogbmV3IEFQSSBmb3Igc2VuZGluZyBhIG1lc3NhZ2UKKwl3aXRob3V0IHBvc3NpYmlsaXR5IG9mIG1hbGxvYyBmYWlsdXJlLgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKTogcmVuYW1lIHRvIGp1c3QKKwlkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoYW5kIHNhbWUgZm9yIHdob2xlIGZ1bmN0aW9uIGZhbWlseSkKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX2Vycm9yX2ZyZWUpOiBtYWtlIHRoaXMgcmVpbml0IHRoZSBlcnJvcgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19leGl0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGhhbmRsZS9yZXR1cm4gZXJyb3JzCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDogYWRkIG1vcmUgREJVU19FUlJPUiAjZGVmaW5lCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2RpcmVjdG9yeV9vcGVuKSAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpCisJKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlKTogdXNlIERCdXNFcnJvciBpbnN0ZWFkIG9mIERCdXNSZXN1bHRDb2RlCisJKF9kYnVzX3Jlc3VsdF9mcm9tX2Vycm5vKTogbW92ZSB0byB0aGlzIGZpbGUKKworMjAwMy0wMy0xMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6CisJKF9kYnVzX21hcnNoYWxfc2V0X3N0cmluZyk6CisJVGFrZSBhIGxlbmd0aCBhcmd1bWVudCBzbyB3ZSBjYW4gbWFyc2hhbCB0aGUgY29ycmVjdCBzdHJpbmcKKwlsZW5ndGguCisKKwkoX2RidXNfbWFyc2hhbF9kaWN0KSwgKF9kYnVzX2RlbWFyc2hhbF9kaWN0KSwKKwkoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpLCAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwlBZGQgc3VwcG9ydCBmb3IgbWFyc2hhbGxpbmcgYW5kIGRlbWFyc2hhbGxpbmcgZGljdHMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYzogKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKToKKwlBZGQgc3VwcG9ydCBmb3IgVFlQRSBESUNULgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoc2V0X3N0cmluZ19maWVsZCk6CisJQWRqdXN0IGhlYWRlciBwYWRkaW5nLgorCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9kaWN0KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZGljdCksIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKSwKKwkoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyksIChjaGVja19oYXZlX3ZhbGlkX21lc3NhZ2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlBZGQgZnVuY3Rpb25zIGZvciBzZXR0aW5nIGFuZCBnZXR0aW5nIGRpY3RzLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgREJVU19UWVBFX0RJQ1QuCisKKwkqIGRidXMvZGJ1cy5oOgorCUFkZCBkYnVzLWRpY3QuaAorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQWRkIGluZm9ybWF0aW9uIGFib3V0IGhvdyBkaWN0cyBhcmUgbWFyc2hhbGxlZC4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvZGljdC13aXRoLW5pbC12YWx1ZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZToKKwlBZGQgc2FtcGxlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgZGljdHMuCisKKzIwMDMtMDMtMDggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtZGljdC5oOiBBZGQgREJVU19FTkRfREVDTFMuCisKKzIwMDMtMDMtMDcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9kYnVzLWRpY3QuYzogKGRidXNfZGljdF9lbnRyeV9mcmVlKSwgKGRidXNfZGljdF9uZXcpLAorCShkYnVzX2RpY3RfZ2V0X2tleXMpLCAoaW5zZXJ0X2VudHJ5KSwgKGRidXNfZGljdF9zZXRfYm9vbGVhbiksCisJKGRidXNfZGljdF9zZXRfaW50MzIpLCAoZGJ1c19kaWN0X3NldF91aW50MzIpLAorCShkYnVzX2RpY3Rfc2V0X2RvdWJsZSksIChkYnVzX2RpY3Rfc2V0X3N0cmluZyksCisJKGRidXNfZGljdF9zZXRfYm9vbGVhbl9hcnJheSksIChkYnVzX2RpY3Rfc2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF91aW50MzJfYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3Rfc2V0X3N0cmluZ19hcnJheSksIChfZGJ1c19kaWN0X3Rlc3QpOgorCSogZGJ1cy9kYnVzLWRpY3QuaDoKKwlGaXggYWNjb3JkaW5nIHRvIGNvbW1lbnRzIGZyb20gSGF2b2MuCisKKzIwMDMtMDMtMDYgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHNlcnZlci5ob21lPgorCisJKiBjb25maWd1cmUuaW46IGlmIHdlIGRvbid0IGhhdmUga2RlLWNvbmZpZywgZGlzYWJsZSBoYXZlX3F0LgorCisyMDAzLTAzLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwlBZGQgZGJ1cy1kaWN0LltjaF0KKworCSogZGJ1cy9kYnVzLWRpY3QuYzogKGRidXNfZGljdF9lbnRyeV9mcmVlKSwgKGRidXNfZGljdF9uZXcpLAorCShkYnVzX2RpY3RfcmVmKSwgKGRidXNfZGljdF91bnJlZiksIChkYnVzX2RpY3RfY29udGFpbnMpLAorCShkYnVzX2RpY3RfcmVtb3ZlKSwgKGRidXNfZGljdF9nZXRfdmFsdWVfdHlwZSksCisJKGRidXNfZGljdF9nZXRfa2V5cyksIChkYnVzX2RpY3RfcHV0X2Jvb2xlYW4pLAorCShkYnVzX2RpY3RfcHV0X2ludDMyKSwgKGRidXNfZGljdF9wdXRfdWludDMyKSwKKwkoZGJ1c19kaWN0X3B1dF9kb3VibGUpLCAoZGJ1c19kaWN0X3B1dF9zdHJpbmcpLAorCShkYnVzX2RpY3RfcHV0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X3B1dF9pbnQzMl9hcnJheSksCisJKGRidXNfZGljdF9wdXRfdWludDMyX2FycmF5KSwgKGRidXNfZGljdF9wdXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19kaWN0X3B1dF9zdHJpbmdfYXJyYXkpLCAoZGJ1c19kaWN0X2dldF9ib29sZWFuKSwKKwkoZGJ1c19kaWN0X2dldF9pbnQzMiksIChkYnVzX2RpY3RfZ2V0X3VpbnQzMiksCisJKGRidXNfZGljdF9nZXRfZG91YmxlKSwgKGRidXNfZGljdF9nZXRfc3RyaW5nKSwKKwkoZGJ1c19kaWN0X2dldF9ib29sZWFuX2FycmF5KSwgKGRidXNfZGljdF9nZXRfaW50MzJfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X3VpbnQzMl9hcnJheSksIChkYnVzX2RpY3RfZ2V0X2RvdWJsZV9hcnJheSksCisJKGRidXNfZGljdF9nZXRfc3RyaW5nX2FycmF5KSwgKF9kYnVzX2RpY3RfdGVzdCk6CisJKiBkYnVzL2RidXMtZGljdC5oOgorCUFkZCBEQnVzRGljdCBpbXBsZW1lbnRhdGlvbgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6CisJKiBkYnVzL2RidXMtdGVzdC5oOgorCUFkZCBfZGJ1c19kaWN0X3Rlc3QKKworMjAwMy0wMy0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9kYXRhL2F1dGgvKjogYWRhcHQgdG8gY2hhbmdlcworCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogYWRkCisJVVNFUklEX0JBU0U2NCBhbmQgY2hhbmdlIFVTRVJOQU1FX0JBU0U2NCB0byBwdXQgaW4gdXNlcm5hbWUgbm90CisJdXNlcmlkCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCk6IHByZXZlbnQKKwltb3JlIHN0dWZmIGZyb20gYmVpbmcgaW4gYSBjb250ZXh0IG5hbWUsIHRvIG1ha2UgdGhlIHByb3RvY29sCisJc2ltcGxlciB0byBkZWFsIHdpdGgKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX2Vycm9yX2hhc19uYW1lKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfZXJyb3JfaXNfc2V0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IHJlcGxhY2UgREJVU19TVFVQSURfVEVTVF9NRUNIIGF1dGgKKwl3aXRoIERCVVNfQ09PS0lFX1NIQTEsIGltcGxlbWVudCBEQlVTX0NPT0tJRV9TSEExCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9mbHVzaCk6IGFsc28gcmVhZAorCW1lc3NhZ2VzIGR1cmluZyBhIGZsdXNoIG9wZXJhdGlvbgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgZGJ1cy1tZDUgc2luY2UgaXQgaXNuJ3QgY3VycmVudGx5IHVzZWQuCisKKzIwMDMtMDMtMDUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBnZXRob3N0YnluYW1lIG9uIFNvbGFyaXMuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogKF9kYnVzX3RyYW5zcG9ydF9vcGVuKToKKwlSZW1vdmUgZHVwbGljYXRlICJ0Y3AiIGVudHJ5LgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJQ2xhcmlmeSBzb21lIHRoaW5ncy4KKworMjAwMy0wMy0wNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IChzZW5kX3JlamVjdGVkKSwgKHByb2Nlc3NfdGVzdF9zdWJkaXIpOgorCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpLAorCShfZGJ1c19rZXlyaW5nX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1kNS5jOiAoX2RidXNfbWQ1X2NvbXB1dGUpOgorCSogZGJ1cy9kYnVzLXNoYS5jOiAoX2RidXNfc2hhX2NvbXB1dGUpOgorCVBsdWcgbWVtb3J5IGxlYWtzLgorCisyMDAzLTAzLTA1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogUkVBRE1FOiBBZGQgc29tZSB0aGluZ3MuCisKKzIwMDMtMDMtMDQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KTogQWRkIGEgYnJlYWs7CisJYWZ0ZXIgY2FzZSBEQlVTX1RZUEVfQk9PRUxBTi4KKworMjAwMy0wMy0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9icmVhay1sb2FkZXIuYyAocmFuZG9tbHlfc2V0X2V4dHJlbWVfaW50cyk6IGFkZCB0ZXN0IHRoYXQKKwlzZXRzIHJlYWxseSBodWdlIGFuZCBzbWFsbCBpbnRlZ2VycworCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGFkZCBjaGVjaworCXRoYXQgbGVuZ3RoIG9mIGJvb2xlYW4gYXJyYXkgZml0cyBpbiB0aGUgc3RyaW5nLCBhbmQgdGhhdAorCXN0cmluZyBoYXMgcm9vbSBmb3IgYm9vbGVhbiB2YWx1ZSBpbiBzaW5nbGUtYm9vbCBjYXNlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogYWRkCisJb3B0aW9uYWwgdmFsdWUgdG8gIkFMSUdOIiBjb21tYW5kIHdoaWNoIGlzIHdoYXQgdG8gZmlsbCB0aGUKKwlhbGlnbm1lbnQgd2l0aC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZTogYWRkIHJlZ3Jlc3Npb24KKwl0ZXN0IGZvciB0aGUgbWVzc2FnZSBwYWRkaW5nIHByb2JsZW0KKworMjAwMy0wMy0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX2hlYWRlcl9kYXRhKTogZml4IHRvIGFsd2F5cyBpbml0CisJbWVzc2FnZV9wYWRkaW5nLCBmcm9tIEJlbmphbWluIERhdXZlcmduZQorCisyMDAzLTAzLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuNQorCisJKiBORVdTOiBVcGRhdGUuCisKKzIwMDMtMDMtMDEgIEpvZSBTaGF3ICA8am9lQGFzc2Jhcm4uY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAic3RydWN0IGNtc2djcmVkIiBhbmQgdHJ5IHRvIGFjY2VzcyBpdHMKKwltZW1iZXJzIGZvciBCU0QtbGlrZSB1bmljZXMuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKHJlYWRfY3JlZGVudGlhbHNfYnl0ZSk6IEZvbGQgdGhpcyBiYWNrIGludG8KKwlfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KCkuCisJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBVc2UgcmVjdm1zZygpIGluc3RlYWQgb2YKKwlyZWFkKCkgZm9yIHJlYWRpbmcgdGhlIGNyZWRlbnRpYWwgYnl0ZSBvZmYgdGhlIHVuaXggc29ja2V0LiAgVXNlCisJc3RydWN0IGNtc2djcmVkIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0LgorCisyMDAzLTAyLTI3ICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJTWFrZSBndGhyZWFkcy0yLjAgZGVwZW5kZW5jeSBvcHRpb25hbC4gRG9uJ3QgYnVpbGQgdGhyZWFkIHRlc3QgaWYKKwlpdHMgbm90IGZvdW5kLgorCisyMDAzLTAyLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBmaXggZG9oIQorCWRvaCEgZG9oISBidWcgdGhhdCByZXN1bHRlZCBpbiBuZXZlciByZW1vdmluZyBhIHJlcGx5IGZyb20gdGhlCisJcXVldWUsIG5vIHdvbmRlciB3ZSBjYWxsZWQgZ2V0X3JlcGx5X3NlcmlhbCBzbyBtdWNoIDstKQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBjYWNoZSByZXBseSBzZXJpYWwKKwlhbmQgY2xpZW50IHNlcmlhbCBpbnN0ZWFkIG9mIGRlbWFyc2hhbGluZyB0aGVtIGV2ZXJ5IHRpbWUKKworMjAwMy0wMi0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfZGVtYXJzaGFsX2ludDMyKTogcmV3cml0ZSB0byBiZSBtdWNoCisJbW9yZSBpbmxpbmVkLCB1c2luZyBkYnVzLXN0cmluZy1wcml2YXRlLmgsIHNwZWVkcyB0aGluZ3MgdXAKKwlzdWJzdGFudGlhbGx5CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2ZyZWUpOiBhcHBseSBhbGlnbiBvZmZzZXQKKwl3aGVuIGZyZWVpbmcgdGhlIHN0cmluZworCShfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSk6IGZpeCBmb3IgYWxpZ24gb2Zmc2V0CisJKHVuZG9fYWxpZ25tZW50KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIEFsbCBraW5kcyBvZiBhdWRpdCBmaXhlcyBmcm9tIE93ZW4sIHBsdXMgaW5pdGlhbCBhdHRlbXB0IHRvCisJaGFuZGxlIHVuYWxpZ25lZCBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtYWxsb2MuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luaXQpOiBjbGFtcCBtYXggbGVuZ3RoIHRvCisJbGVhdmUgcm9vbSBmb3IgYWxpZ25fb2Zmc2V0IGFuZCBudWwgYnl0ZQorCShmaXh1cF9hbGlnbm1lbnQpOiBmdW5jdGlvbiB0byB0cmFjayBhbiBhbGlnbl9vZmZzZXQgYW5kCisJZW5zdXJlIHJlYWwtPnN0ciBpcyBhbGlnbmVkCisJKERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUpOiBsZW4gbXVzdCBiZSBsZXNzIHRoYW4gYWxsb2NhdGVkLAorCXRvIGFsbG93IGEgbnVsIGJ5dGUgcGx1cyBhbGlnbiBvZmZzZXQKKwkoX2RidXNfc3RyaW5nX2xvY2spOiBmaXggb3ZlcmZsb3cgaXNzdWUKKwkoX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuKTogYWRkIGFzc2VydGlvbnMgb24gc2FuaXR5IG9mIGxlbiwKKwlhc3NpZ24gYWxsb2NhdGVkIHRvIGJlIEFMTE9DQVRJT05fUEFERElORyBsYXJnZXIgdGhhbiBsZW4KKwkoc2V0X2xlbmd0aCk6IGZpeHVwIHRoZSBvdmVyZmxvdyBoYW5kbGluZworCShfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuKTogZml4IG92ZXJmbG93IGluIGFzc2VydGlvbgorCShvcGVuX2dhcCk6IGRldGVjdCBvdmVyZmxvdyBpbiBzaXplIG9mIGdhcCB0byBiZSBvcGVuZWQKKwkoX2RidXNfc3RyaW5nX2xlbmd0aGVuKTogYWRkIG92ZXJmbG93IGNoZWNrCisJKF9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGgpOiBmaXggb3ZlcmZsb3cgd2l0aCBfREJVU19BTElHTl9WQUxVRQorCShfZGJ1c19zdHJpbmdfYXBwZW5kKTogYWRkIG92ZXJmbG93IGNoZWNrCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhcik6IG92ZXJmbG93CisJKF9kYnVzX3N0cmluZ19kZWxldGUpOiBmaXggb3ZlcmZsb3cgaW4gYXNzZXJ0aW9uCisJKF9kYnVzX3N0cmluZ19jb3B5X2xlbik6IG92ZXJmbG93IGluIGFzc2VydGlvbgorCShfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4pOiBvdmVyZmxvd3MgaW4gYXNzZXJ0aW9ucworCShfZGJ1c19zdHJpbmdfZmluZCk6IGNoYW5nZSB0byBpbXBsZW1lbnQgaW4gdGVybXMgb2YKKwlfZGJ1c19zdHJpbmdfZmluZF90bworCShfZGJ1c19zdHJpbmdfZmluZF90byk6IGFzc29ydGVkIGZpeGFnZQorCShfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIpOiBhc3NlcnQgY19zdHIgIT0gTlVMTCwKKwlmaXggbG9naWMgc28gdGhlIGZ1bmN0aW9uIHdvcmtzCisJKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIpOiBmaXggb3ZlcmZsb3cgdGhpbmd5CisJKF9kYnVzX3N0cmluZ19iYXNlNjRfZW5jb2RlKTogb3ZlcmZsb3cgZml4CisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSk6IG92ZXJmbG93CisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwpOiBvdmVyZmxvdworCisyMDAzLTAyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF90ZXN0KTogZml4IHRvIHdvcmsgd2l0aCBESVNBQkxFX0FTU0VSVFMKKworMjAwMy0wMi0yNiAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46CisJU2V0IERCVVNfR0xJQl9USFJFQURTX0xJQlMgZm9yIGFwcHMgdXNpbmcgZ3RocmVhZC0yLjAKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6CisJRml4IF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIGFuZCBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2guCisJQWRkIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24gYW5kIHVzZSBpdCB3aGVuIHF1ZXVlaW5nCisJaW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2VzLgorCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOgorCVRocmVhZHNhZmUgdXNhZ2Ugb2YgREJ1c0RhdGFTbG90QWxsb2NhdG9yCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfaXRlcik6CisJZGJ1c19uZXcgY2FuIGZhaWwuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOgorCUFkZCB0b2RvIGNvbW1lbnQKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJSW1wbGVtZW50IHRoZSBuZXcgd2FrZXVwIGZ1bmN0aW9ucyBmb3IgZ2xpYi4KKworCSogZ2xpYi9NYWtlZmlsZS5hbToKKwkqIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmM6CisJKiBnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jOgorCSogZ2xpYi90ZXN0LXRocmVhZC5oOgorCUluaXRpYWwgY3V0IGF0IHNvbWUgdGhyZWFkIHRlc3QgY29kZS4gTm90IHJlYWxseSBkb25lIHlldC4KKworMjAwMy0wMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZml4IGNyYXNoCisJd2hlcmUgd2UgcmVmJ2QgdGhlIG91dGdvaW5nIG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgcmV0dXJuZWQgcmVwbHkKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGRvX2F1dGhlbnRpY2F0aW9uKTogY2hlY2sgcmVhZCB3YXRjaAorCWF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiwgc28gaWYgd2UgZGlkbid0IG5lZWQgdG8gcmVhZCBmb3IKKwlhdXRoZW50aWNhdGlvbiwgd2UgcmVpbnN0YWxsIGl0IGZvciByZWNlaXZpbmcgbWVzc2FnZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19yZXBseSk6IGFsbG93IHJlcGxpZXMgdG8KKwlhIE5VTEwgc2VuZGVyIGZvciBwZWVyLXRvLXBlZXIgY2FzZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoY2hlY2tfcmVhZF93YXRjaCk6IGhhbmRsZQorCSFhdXRoZW50aWNhdGVkIGNhc2UgY29ycmVjdGx5CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBhZGQgc3VwcG9ydCBmb3IgREJ1c1NlcnZlcgorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IGFkZCBkYXRhIHNsb3Qgc3VwcG9ydAorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKTogY2hlY2sKKwlyZXR1cm4gdmFsdWVzIGFuZCBoYW5kbGUgZXJyb3JzCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jOiBmYWN0b3Igb3V0IHRoZSBkYXRhIHNsb3Qgc3R1ZmYgZnJvbQorCURCdXNDb25uZWN0aW9uCisKKwkqIERveHlmaWxlLmluIChJTlBVVCk6IGFkZCBnbGliIHN1YmRpcgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKTogcmVuYW1lCisJc2V0dXBfd2l0aF9nX21haW4gaW5zdGVhZCBvZiBob29rdXBfd2l0aF9nX21haW47IHdyaXRlIGRvY3MKKworMjAwMy0wMi0yNCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9ib29sZWFuX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlWYXJpb3VzIGZpeGVzIGFzIHBvaW50ZWQgb3V0IGJ5IEhhdm9jLgorCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZToKKwlBZGQgaW52YWxpZCBib29sZWFuIHZhbHVlIHRlc3QgY2FzZXMuCisKKzIwMDMtMDItMjQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmM6IChfZGJ1c190eXBlX3RvX3N0cmluZyk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpLAorCShfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYm9vbGVhbiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2Jvb2xlYW5fYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0KSwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyKSwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF91aW50MzIpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jvb2xlYW5fYXJyYXkpLCAobWVzc2FnZV9pdGVyX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2U6CisJQWRkIHN1cHBvcnQgZm9yIGJvb2xlYW4gYW5kIGJvb2xlYW4gYXJyYXkgdHlwZXMuCisKKzIwMDMtMDItMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmM6IGZpbmlzaCBtb3N0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gYW5kCisJc2ltcGxlIHVuaXQgdGVzdAorCisJKiBkYnVzL2RidXMtZXJyb3JzLmMgKGRidXNfc2V0X2Vycm9yX2NvbnN0LCBkYnVzX3NldF9lcnJvcik6IG1ha2UKKwl0aGVzZSBiYXJmIGlmIHRoZSBlcnJvciBpc24ndCBjbGVhcmVkIHRvIE5VTEwKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZGVsZXRlX2ZpbGUpOiBzZXQgZXJyb3Igb24gZmFpbHVyZQorCShfZGJ1c19jcmVhdGVfZGlyZWN0b3J5KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3IpOiBmaXggd2FybmluZworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3N0cmluZ19oZXhfZGVjb2RlKTogbmV3IGZ1bmN0aW9uCisJKHRlc3RfaGV4X3JvdW5kdHJpcCk6IHRlc3QgY29kZQorCisJKiBkYnVzL2RidXMtc2hhLmMgKF9kYnVzX3NoYV9jb21wdXRlKTogdXNlIGRidXNfc3RyaW5nX2hleF9lbmNvZGUKKworCSogZGJ1cy9kYnVzLW1kNS5jIChfZGJ1c19tZDVfY29tcHV0ZSk6IHVzZSBkYnVzX3N0cmluZ19oZXhfZW5jb2RlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBtYWtlIHRoaXMgdXNlCisJdGhlIHNhdmUtdG8tdGVtcC9yZW5hbWUgdHJpY2sgdG8gYXRvbWljYWxseSB3cml0ZSB0aGUgbmV3IGZpbGUKKwkoX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IGRpc3QgZm9yIHRlc3QvZGF0YS9zaGEtMQorCisyMDAzLTAyLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KToKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpOiBGaXggdXAgZG94eWdlbiB3YXJuaW5ncworCisJKiBkYnVzL2RidXMtc2hhLmM6IGFkZCBpbXBsZW1lbnRhdGlvbiBvZiBTSEEtMSBhbGdvcml0aG0KKworCSogZGJ1cy90ZXN0L2RhdGEvc2hhLTE6IGFkZCBVUyBnb3Zlcm5tZW50IHRlc3Qgc3VpdGUgZm9yIFNIQS0xCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSk6CisJTWFrZSBzdHJpbmcgYXJyYXlzIE5VTEwtdGVybWluYXRlZC4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiAoZGJ1c19mcmVlX3N0cmluZ19hcnJheSk6CisJKiBkYnVzL2RidXMtbWVtb3J5Lmg6CisJTmV3IGZ1bmN0aW9uIGZvciBmcmVlaW5nIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgYXJyYXlzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChhcHBlbmRfcXVvdGVkX3N0cmluZyksCisJKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKToKKwlBZGQgc3VwcG9ydCBmb3IgYXJyYXkgdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChjaGVja19tZXNzYWdlX2hhbmRsaW5nKToKKwlBZGQgbW9yZSB0eXBlcyBhcyB0ZXN0IGNhc2VzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc3RyaW5nX3BhcnNlX2ludCksCisJKF9kYnVzX3N0cmluZ19wYXJzZV9kb3VibGUpOgorCUFkZCB0aGUgc3RhcnQgb2Zmc2V0IHRvIHRoZSBlbmQgb2Zmc2V0LgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZToKKwlOZXcgdGVzdCBtZXNzYWdlIHdpdGggbG90cyBvZiBhcmd1bWVudHMuCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9uaWwpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGUpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmcpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2RvdWJsZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYnl0ZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nX2FycmF5KToKKwlGaXggYWxsIG91dC1vZi1tZW1vcnkgaGFuZGxpbmcgaW4gdGhlc2UgZnVuY3Rpb25zLgorCisyMDAzLTAyLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfbmlsKToKKwlGaXggYSBzaWxseS4KKworMjAwMy0wMi0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9uaWwpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZ19hcnJheSksIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3VpbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYnl0ZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmdfYXJyYXkpOgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBmdW5jdGlvbnMgZm9yIGFwcGVuZGluZyBhbmQgZ2V0dGluZyBhcnJheXMuCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jIChfZGJ1c19tZW1fcG9vbF9uZXcpOiBNYWtlIHRoZQorCWVsZW1lbnQgc2l6ZSBhdCBsZWFzdCA4IGJ5dGVzLCBmaXhlcyBtZW1wb29sIHRlc3RzIG9uCisJNjQtYml0IG1hY2hpbmVzLgorCisyMDAzLTAyLTIwICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6CisJVW5sb2NrIHRoZSBjb25uZWN0aW9uIG11dGV4IGR1cmluZyBhIGJsb2NraW5nIHNlbGVjdCBjYWxsLgorCUFkZCB0b2RvIGFib3V0IGhvdyB3ZSBuZWVkIGEgd2F5IHRvIHdha2UgdXAgdGhlIHNlbGVjdC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJQWRkIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayBhbmQgX2RidXNfY29ubmVjdGlvbl91bmxvY2suCisKKzIwMDMtMDItMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIERveHlmaWxlLmluIChQUkVERUZJTkVEKTogcHV0IERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyBpbgorCURveHlmaWxlLmluLCBub3QgRG94eWZpbGUKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogZG8gc29tZSBoYWNraW5nIG9uIHRoaXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZGVsZXRlX2ZpbGUpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcl9jb25zdCk6IGRvIG5vdCBjYWxsCisJZGJ1c19lcnJvcl9pbml0CisJKGRidXNfc2V0X2Vycm9yKTogcmVtb3ZlIGRidXNfZXJyb3JfaW5pdCwgY2hlY2sgZm9yIG1lc3NhZ2UgPT0KKwlOVUxMICpiZWZvcmUqIHdlIHNwcmludGYgaW50byBpdCwgYW5kIGFkZCBAdG9kbyBhYm91dCBpbmNsdWRpbmcKKwlzeXN0ZW0gaGVhZGVycyBpbiB0aGlzIGZpbGUKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX0ZBSUxFRCk6IGFkZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChnZXRfdXNlcl9pbmZvKTogYnJlYWsgdGhpcyBmdW5jdGlvbiBvdXQgdG8KKwlnZXQgdmFyaW91cyBiaXRzIG9mIHVzZXIgaW5mb3JtYXRpb24gYmFzZWQgb24gZWl0aGVyIHVzZXJuYW1lCisJb3IgdXNlciBJRAorCShfZGJ1c19ob21lZGlyX2Zyb21fdXNlcm5hbWUpOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMi0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlBZGQgY2hlY2sgZm9yIG5vbnBvc2l4IGdldHB3bmFtX3IKKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYzogKF9kYnVzX21lbV9wb29sX25ldyk6CisJQWxpZ24gdGhlIHBvb2wgZWxlbWVudCBzaXplIHRvIGEgc2l6ZW9mICh2b2lkICopIGJvdW5kYXJ5LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc2V0ZW52KSwgKF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQpLAorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpLCAoX2RidXNfY3JlZGVudGlhbHNfZnJvbV91c2VybmFtZSk6CisJR2VuZXJhbCBTb2xhcmlzIGZpeGVzLgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2U6CisJRXhwbGljaXRseSBzdGF0ZSB0aGF0IHdlIHdhbnQgbGl0dGxlLWVuZGlhbiBwYWNraW5nLgorCisyMDAzLTAyLTE5ICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogU3VwcG9ydCB0Y3A6IGFkZHJlc3Nlcy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCUFkZGVkIHRvIGNyZWF0ZSBhIHRyYW5zcG9ydCBjb25uZWN0aW5nIHVzaW5nIGEgdGNwL2lwIHNvY2tldC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0KTogQWRkZWQgdG8gY29ubmVjdAorCXRvIGEgdGNwIHNvY2tldCBhdCBnaXZlbiBob3N0IGFuZCBwb3J0LgorCShfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IGFkZGVkIHRvIGxpc3RlbiBvbiB0Y3Agc29ja2V0IGZvciBnaXZlbgorCWhvc3RuYW1lIGFuZCBwb3J0LgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IFN1cHBvcnQgdGNwOiBhZGRyZXNzZXMuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlBZGRlZCB0byBjcmVhdGUgYSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgVENQL0lQIHNvY2tldC4KKworMjAwMy0wMi0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCVRocm91Z2hvdXQ6IG1vcCB1cCBhbGwgdGhlIERveHlnZW4gd2FybmluZ3MgYW5kIHVuZG9jdW1lbnRlZAorCXN0dWZmLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChkb19leGVjKTogZG8gbm90IHVzZSBleGVjdnAsIHdlIGRvbid0IHdhbnQKKwl0byBzZWFyY2ggYW55IHBhdGhzLgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBtb3ZlIGdsb2JhbCBtdXRleCBpbml0aWFsaXplcnMgdG8KKwlkYnVzLWludGVybmFscy5oLCBtdWx0aXBsZSBwcm90b3R5cGVzIHdhcyBjb25mdXNpbmcgZG94eWdlbgorCWJlc2lkZXMgYmVpbmcga2luZCBvZiB1Z2x5CisKKwkqIERveHlmaWxlIChQUkVERUZJTkVEKTogaGF2ZSBEb3h5Z2VuIGRlZmluZQorCURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyBzbyB3ZSBjYW4gZXhjbHVkZSB0aGluZ3MgZnJvbQorCWRvY3Mgd2l0aCAjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCShkbyBub3QgYWJ1c2UgdGhlIGZlYXR1cmUhIGl0J3MgZm9yIHN0dWZmIGxpa2UgdGhlIGF1dG9nZW5lcmF0ZWQKKwltYWNyb3MgaW4gZGJ1cy1tZDUuYywgbm90IGp1c3QgZm9yIHRoaW5ncyB5b3UgZG9uJ3QgZmVlbCBsaWtlCisJZG9jdW1lbnRpbmcuLi4pCisKKzIwMDMtMDItMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3plcm8pOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1kNS5jOiBpbmNsdWRlIE1ENSBpbXBsZW1lbnRhdGlvbiBieSBMLiBQZXRlciBEZXV0c2NoLAorCXdyYXAgaXQgaW4gc29tZSBkYnVzLWZyaWVuZGx5IEFQSQorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogYWRkIDE2LWJpdCB0eXBlcworCisyMDAzLTAyLTE4ICBKb2UgU2hhdyAgPGpvZUBhc3NiYXJuLmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX3NlcnZlcl9kYXRhX3N0dXBpZF90ZXN0X21lY2gpOiBKdXN0IGdldAorCWNyZWRlbnRpYWxzIGZyb20gb3VyIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3MuCisJKGdldF93b3JkKTogRml4IGEgYnVnbGV0IHdoZXJlIHdlIHdlcmUgY29weWluZyB0aGUgZW50aXJlIGxlbmd0aAorCWluc3RlYWQgb2YgcmVsYXRpdmUgdG8gb3VyIHBvc2l0aW9uLgorCisJKiBkYnVzL2RidXMtaGFzaC5jIChfZGJ1c19oYXNoX3Rlc3QpOiBEb24ndCB0cnkgdG8gYWxsb2NhdGUgdGhlCisJa2V5cyBvbiB0aGUgc3RhY2suLi4gaXQncyA2NDBrIG9mIGRhdGEuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBBbHdheXMKKwlyZWFkIHRoZSBjcmVkZW50aWFscyBieXRlIG9mZiB0aGUgc29ja2V0LCBldmVuIGlmIHdlIGRvbid0IGhhdmUKKwlTT19QRUVSQ1JFRC4KKwkoX2RidXNfcG9sbCk6IEltcGxlbWVudCBwb2xsKCkgdXNpbmcgc2VsZWN0KCkgZm9yIHN5c3RlbXMgd2hpY2gKKwlkb24ndCBoYXZlIGl0LgorCisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmMgKG1haW4pOiBQcmludCBvdXQgYW4gZXJyb3IgaWYgbm8KKwlwYXJhbWV0ZXJzIGFyZSBnaXZlbi4KKworCSogdGVzdC9kYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQ6IEFkZGVkLiAgVGVzdHMgdGhhdCBhIGNsaWVudAorCWNhbiBmYWxsYmFjayB0byBhIHNlY29uZGFyeSBhdXRoIG1lY2hhbmlzbSBpZiB0aGUgZmlyc3QgZmFpbHMuCisKKzIwMDMtMDItMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIEFVVEhPUlM6IGFkZCBBbGV4CisKKzIwMDMtMDItMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbG90cyBvZiBjb3NtZXRpYworCWNsZWFudXBzL3JlYXJyYW5nZW1lbnQsIGFkZCBhc3NvcnRlZCBGSVhNRSwgY2hhbmdlIERCVVNfQUREUkVTUworCWVudiB2YXJpYWJsZSB0byBEQlVTX0JVU19BRERSRVNTLCBzL2NsaWVudC9hcHBsaWNhdGlvbi8sCisJcy9zZXJ2ZXIvYnVzLyAoZXhjZXB0IGluIGF1dGhlbnRpY2F0aW9uIHNlY3Rpb24pLiBBZGQgYSBzZWN0aW9uCisJIk1lc3NhZ2UgQnVzIE1lc3NhZ2UgUm91dGluZyIKKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2UuPgorCisJUmVsZWFzZSAwLjQKKworCSogTkVXUzogVXBkYXRlCisKKzIwMDMtMDItMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJU3BlY2lmaWNhdGlvbiB1cGRhdGVzLgorCisyMDAzLTAyLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2luaXQpLCAoY2hpbGRfc2V0dXApLAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9hY3RpdmF0aW9uLmg6CisJKiBidXMvbWFpbi5jOiAobWFpbik6CisJU2V0IERCVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19zZXRfZXJyb3IpOgorCURvbid0IHVzZSB2YV9jb3B5IHNpbmNlIHRoYXQncyBhIEM5OSBmZWF0dXJlLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfc2V0ZW52KSwgKGRvX2V4ZWMpLAorCShfZGJ1c19zcGF3bl9hc3luYyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCUFkZCBjaGlsZF9zZXR1cF9mdW5jIHRvIF9kYnVzX3NwYXduX2FzeW5jLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJVXBkYXRlIHNwZWNpZmljYXRpb24uCisKKwkqIHRlc3Qvc3Bhd24tdGVzdC5jOiAoc2V0dXBfZnVuYyksIChtYWluKToKKwlGaXggdGVzdC4KKworMjAwMy0wMi0xNyAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX2hhbmRsZXJfZGVzdHJveWVkX2xvY2tlZCk6CisJQWRkZWQgdG9kby4KKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy8uY3ZzaWdub3JlOgorCSogZG9jL01ha2VmaWxlLmFtOgorCSogZG9jL2RidXMtdGVzdC1wbGFuLnNnbWw6CisJQWRkIHRlc3QgcGxhbiBkb2N1bWVudC4KKworCSogdGVzdC9NYWtlZmlsZS5hbToKKwlGaXggZGlzdGNoZWNrLgorCisyMDAzLTAyLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRlY29kZV9oZWFkZXJfZGF0YSksCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOgorCVNldCB0aGUgaGVhZGVyIHBhZGRpbmcgYW1vdW50IHdoZW4gbG9hZGluZyBhIG1lc3NhZ2UuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKHNlbmRfb25lX21lc3NhZ2UpOgorCU9ubHkgc2VuZCBicm9hZGNhc3QgbWVzc2FnZXMgdG8gcmVnaXN0ZXJlZCBjb25uZWN0aW9ucy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9uYW1lX2lzKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LWRlYnVnLmM6IChkb19yZWFkaW5nKToKKwlPbmx5IGRpc3BhdGNoIG9uZSBtZXNzYWdlIHBlciBydW4uCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2J1cy10ZXN0LmM6IChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayksIChkaWUpLAorCSh0ZXN0X2hlbGxvX2NsaWVudDFfaGFuZGxlciksICh0ZXN0X2hlbGxvX2NsaWVudDJfaGFuZGxlciksCisJKHRlc3RfaGVsbG9fcmVwbGllcyksIChtYWluKToKKworCSogdGVzdC9idXMtdGVzdC1sb29wLltjaF06CisJQWRkIHRoZXNlLgorCisyMDAzLTAyLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZSk6IGZpeAorCWJhY2t3YXJkIGNvbmRpdGlvbmFsCisKKzIwMDMtMDItMTYgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwlJbXBsZW1lbnQgc2VudF9tZXNzYWdlX3dpdGhfcmVwbHkuICh3aXRoX3JlcGx5X2FuZCBibG9jayBpcyBzdGlsbAorCWJ1c3RlZCkuCisJTWFkZSBkaXNwYXRjaF9tZXNzYWdlIG5vdCBsb3NlIG1lc3NhZ2UgaWYgT09NLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIE5vUmVwbHkgZXJyb3IgKGZvciByZXBseSB0aW1lb3V0cykuCisKKzIwMDMtMDItMTYgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWhhc2guYyAoX2RidXNfaGFzaF90YWJsZV91bnJlZik6CisJQWN0dWFsbHkgZnJlZSBrZXlzIGFuZCB2YWx1ZXMgd2hlbiBkZXN0cm95aW5nIGhhc2h0YWJsZS4KKworMjAwMy0wMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IChjbGllbnRfdHJ5X25leHRfbWVjaGFuaXNtKToKKwlQbHVnIGEgbGVhay4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogKGRidXNfY29uZHZhcl93YWl0X3RpbWVvdXQpOgorCVJldHVybiBUUlVFIGlmIHRoZXJlJ3Mgbm8gdGhyZWFkIGltcGxlbWVudGF0aW9uIGFyb3VuZC4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IChmcmVlX3NvdXJjZSksCisJKGRidXNfY29ubmVjdGlvbl9ob29rdXBfd2l0aF9nX21haW4pOgorCU1ha2Ugc3VyZSB0byByZW1vdmUgdGhlIEdTb3VyY2Ugd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBmaW5hbGl6ZWQuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCVJldHVybiBhbiBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgc2VydmljZQorCXRoYXQgZG9lc24ndCBleGlzdC4KKworMjAwMy0wMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChsb2FkX2RpcmVjdG9yeSksIChidXNfYWN0aXZhdGlvbl9pbml0KSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL2RyaXZlci5jOgorCShidXNfZHJpdmVyX2hhbmRsZV9hY3RpdmF0ZV9zZXJ2aWNlKSwgKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOgorCU1vcmUgd29yayBvbiB0aGUgYWN0aXZhdGlvbiBoYW5kbGluZy4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBzb21lIGVycm9yIG1lc3NhZ2VzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3JlcGx5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBlcnJvciBtZXNzYWdlLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgQUNUSVZBVEVfU0VSVkVSIG1lc3NhZ2UuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOiAodW5peF9oYW5kbGVfd2F0Y2gpLAorCShfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlDYWxsIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAobWFrZV9waXBlKSwgKGRvX2V4ZWMpLAorCShfZGJ1c19zcGF3bl9hc3luYyksIChfZGJ1c19kaXNhYmxlX3NpZ3BpcGUpLAorCShfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCUFkZCBfZGJ1c19mZF9zZXRfY2xvc2Vfb24gZXhlYyBmdW5jdGlvbi4gQWxzbyBhZGQgZnVuY3Rpb24gdGhhdCBjaGVja3MKKwl0aGF0IGFsbCBvcGVuIGZkcyBhcmUgc2V0IHRvIGNsb3NlLW9uLWV4ZWMgYW5kIHdhcm5zIG90aGVyd2lzZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6CisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOgorCUNhbGwgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMuCisKKzIwMDMtMDItMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUpOgorCWFsbG93IHBlb3BsZSB0byBhdm9pZCBzZXR0aW5nIFNJR1BJUEUgdG8gU0lHX0lHTgorCShfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KTogZGlzYWJsZSBTSUdQSVBFIHVubGVzcworCXdlJ3ZlIGJlZW4gYXNrZWQgbm90IHRvCisKKzIwMDMtMDItMTUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbGlzdC5jOiAoX2RidXNfbGlzdF9hcHBlbmRfbGluayksCisJKF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rKToKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogKGRidXNfbWFsbG9jKSwgKGRidXNfbWFsbG9jMCksCisJKGRidXNfcmVhbGxvYyk6CisJV2FybmluZyBmaXhlcy4KKworMjAwMy0wMi0xNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9lbnRyeV9mcmVlKSwKKwkoYWRkX2Rlc2t0b3BfZmlsZV9lbnRyeSksIChsb2FkX2RpcmVjdG9yeSksIChidXNfYWN0aXZhdGlvbl9pbml0KToKKwkqIGJ1cy9hY3RpdmF0aW9uLmg6CisJKiBidXMvbWFpbi5jOiAobWFpbik6CisJQWRkIHNpbXBsZSBhY3RpdmF0aW9uIHN1cHBvcnQsIGRvZXNuJ3Qgd29yayB5ZXQgdGhvdWdoLgorCisyMDAzLTAyLTE1ICAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvZGJ1cy1xdGhyZWFkLmNwcDogIHNtYWxsIGNhc3RpbmcgZml4CisKKzIwMDMtMDItMTUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3NldF9lcnJvcik6CisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIGEgZmV3IGVycm9ycyBhbmQgbWFrZSBkYnVzX3NldF9lcnJvciB2b2lkLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCShfZGJ1c19lcnJub190b19zdHJpbmcpLCAoY2xvc2VfYW5kX2ludmFsaWRhdGUpLCAobWFrZV9waXBlKSwKKwkod3JpdGVfZXJyX2FuZF9leGl0KSwgKHJlYWRfaW50cyksIChkb19leGVjKSwgKF9kYnVzX3NwYXduX2FzeW5jKToKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJQWRkIF9kYnVzX3NwYXduX2FzeW5jLgorCisJKiB0ZXN0L3NwYXduLXRlc3QuYzogKG1haW4pOgorCVRlc3QgZm9yIF9kYnVzX3NwYXduX2FzeW5jLgorCisyMDAzLTAyLTE1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCUZpeCBidWlsZCB3aXRob3V0IHRlc3RzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jOiAoYWxsb2NfbGluayk6CisJRml4IGEgc2VnZmF1bHQgd2hlbiBhIG1hbGxvYyBmYWlscy4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiAoaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcpLCAoZGJ1c19tYWxsb2MpLAorCShkYnVzX21hbGxvYzApLCAoZGJ1c19yZWFsbG9jKToKKwlBZGQgc3VwcG9ydCBmb3IgbWFsbG9jIGRlYnVnZ2luZy4KKworMjAwMy0wMi0xNSAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOgorCSogZGJ1cy9kYnVzLXRocmVhZHMuaDoKKwlBZGQgY29uZHZhcnMuIFJlbW92ZSBzdGF0aWMgbXV0ZXh0IGZyb20gQVBJLgorCUltcGxlbWVudCBzdGF0aWMgbXV0ZXhlcyBieSBpbml0aWFsaXppbmcgdGhlbSBmcm9tIHRocmVhZHNfaW5pdC4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYzoKKwkqIHF0L2RidXMtcXRocmVhZC5jcHA6CisJVXBkYXRlIHdpdGggdGhlIHRocmVhZCBhcGkgY2hhbmdlcy4KKworCisJKiBkYnVzL2RidXMtbGlzdC5jOgorCSogZGJ1cy9kYnVzLWxpc3QuaDoKKwlUdXJuIFN0YXRpY011dGV4IGludG8gbm9ybWFsIG11dGV4ICsgaW5pdCBmdW5jdGlvbi4KKwlFeHBvcnQgbmV3IGZ1bmN0aW9ucyBfZGJ1c19saXN0X2FsbG9jX2xpbmssIF9kYnVzX2xpc3RfZnJlZV9saW5rLAorCV9kYnVzX2xpc3RfYXBwZW5kX2xpbmssIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rCisKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJTmV3IHR5cGUgZGJ1c19hdG9taWNfdCwgYW5kIG5ldyBmdW5jdGlvbnMgX2RidXNfYXRvbWljX2luYywKKwlfZGJ1c19hdG9taWNfZGVjLiBPbmx5IHNsb3cgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gYXQgdGhlIG1vbWVudC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIERCVVNfTUVTU0FHRV9MT0NBTF9ESVNDT05ORUNUIGRlZmluZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCU1ha2UgcmVmL3VucmVmIGF0b21pYy4KKwlGaXggc29tZSBkb2NzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6CisJTWFrZSB0aHJlYWRzYWZlLgorCUNoYW5nZSBfcGVlayB0byBfYm9ycm93LF9yZXR1cm4gJiBfc3RlYWxfYm9ycm93ZWQuCisJQ2hhbmdlIGRpc2Nvbm5lY3QgY2FsbGJhY2sgdG8gZXZlbnQuCisJTWFrZSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZXMgcmVlbnRyYW50LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6CisJRG9uJ3QgcmVmIHRoZSBjb25uZWN0aW9uIG9uIGNhbGxzIHRvIHRoZSB0cmFuc3BvcnQKKwlpbXBsZW1lbnRhdGlvbi4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOgorCU1ha2UgdGhyZWFkc2FmZS4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJRG9uJ3QgdXNlIHBlZWtfbWVzc2FnZSBhbnltb3JlCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2RlYnVnLXRocmVhZC5jOgorCSogdGVzdC9kZWJ1Zy10aHJlYWQuaDoKKwlTaW1wbGUgdGhyZWFkIGltcGxlbWVudGF0aW9uIHRoYXQgYXNzZXJ0cygpIG9uIGRlYWRsb2NrcyBpbgorCXNpbmdsZS10aHJlYWRlZCBjb2RlLgorCisJKiB0ZXN0L2J1cy10ZXN0LmM6CisJKG1haW4pIENhbGwgZGVidWdfdGhyZWFkc19pbml0LgorCisJKiB0ZXN0L3dhdGNoLmM6CisJVXNlIGRpc2Nvbm5lY3QgbWVzc2FnZSBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3QgY2FsbGJhY2suCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6CisJKiBidXMvY29ubmVjdGlvbi5oOgorCURvbid0IGNhbGwgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNjb25uZWN0X2Z1bmN0aW9uLiBJbnN0ZWFkIGV4cG9ydAorCWJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QuCisKKwkqIGJ1cy9kaXNwYXRjaC5jOgorCUNhbGwgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCB3aGVuIHdlIGdldCBhIGRpc2Nvbm5lY3RlZCBtZXNzYWdlLgorCisyMDAzLTAyLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmV3KTogZm9vbCBhcm91bmQgd2l0aCB0aGUKKwlkb2NzCisKKzIwMDMtMDItMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmM6IGZhaWwgaWYgdGhlIGRlYnVnIGZ1bmN0aW9ucyBzbyBpbmRpY2F0ZQorCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IGZhaWwgaWYgdGhlIGRlYnVnIGZ1bmN0aW9ucyBpbmRpY2F0ZSB3ZQorCXNob3VsZAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIpCisJKF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIpOiBkZWJ1ZyBmdW5jdGlvbnMgdG8KKwlzaW11bGF0ZSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcworCisyMDAzLTAyLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmggKHN0cnVjdCBEQnVzRXJyb3IpOiBhZGQgYSB3b3JkIG9mIHBhZGRpbmcKKwl0byBEQnVzRXJyb3IKKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKToKKwkqIGJ1cy9kcml2ZXIuaDoKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3NlcnZpY2VfbG9va3VwKToKKwlSZW9yZGVyIG1lc3NhZ2Ugc2VuZGluZyBzbyB3ZSBnZXQgYSBtb3JlIHNhbmUgb3JkZXIuCisKKwkqIHRlc3QvYnVzLXRlc3QuYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJRml4IHR5b3AuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0KSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwkqIGRidXMvZGJ1cy1idXMuYzogKGRidXNfYnVzX3JlZ2lzdGVyX2NsaWVudCksCisJKGRidXNfYnVzX2FjcXVpcmVfc2VydmljZSksIChkYnVzX2J1c19zZXJ2aWNlX2V4aXN0cyk6CisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2dldF9hcmdzKSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfaXRlciksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KSwgKG1lc3NhZ2VfaXRlcl90ZXN0KSwKKwkoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIHRlc3QvYnVzLXRlc3QuYzogKG1haW4pOgorCUNoYW5nZSBmaWVsZHMgdG8gYXJndW1lbnRzIGluIG1lc3NhZ2VzLCBzbyB0aGF0IHRoZXkgd29uJ3QgYmUKKwljb25mdXNlZCB3aXRoIGhlYWRlciBmaWVsZHMuCisKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1haW4pOgorCVJlbW92ZSBhcHBlbmRfZmllbGRzIGZyb20gaGVsbG8gbWVzc2FnZS4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKiBkYnVzL2RidXMtc3RyaW5nLmM6CisJRG9jdW1lbnRhdGlvbiBmaXhlcy4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiAodGltZW91dF9oYW5kbGVyKSwgKGFkZF90aW1lb3V0KSwKKwkocmVtb3ZlX3RpbWVvdXQpOgorCUltcGxlbWVudCBzdXBwb3J0IGZvciB0aW1lb3V0cyBpbiBkYnVzLWdsaWIuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAocHJvY2Vzc190ZXN0X3N1YmRpcik6CisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jOiAoZmluZF9icmVha3NfYmFzZWRfb24pOgorCVBsdWcgc29tZSBtZW1vcnkgbGVha3MuCisKKzIwMDMtMDItMTMgIFJpY2hhcmQgSHVsdCAgPHJodWx0QGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvbWFpbi5jOiBGaXggYnVpbGQuCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogRml4IGNvcHlyaWdodCBmb3IgQW5kZXJzLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCB1dGlscy5bY2hdCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChidXNfY29ubmVjdGlvbl9mb3JlYWNoKToKKwlGaXggYSB3YXJuaW5nLgorCisJKiBidXMvZGVza3RvcC1maWxlLmM6IChncm93X2xpbmVzX2luX3NlY3Rpb24pLCAoZ3Jvd19zZWN0aW9ucyksCisJKHVuZXNjYXBlX3N0cmluZyksIChuZXdfc2VjdGlvbiksIChwYXJzZV9zZWN0aW9uX3N0YXJ0KSwKKwkocGFyc2Vfa2V5X3ZhbHVlKSwgKHJlcG9ydF9lcnJvciksIChidXNfZGVza3RvcF9maWxlX2xvYWQpLAorCShidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcpOgorCSogYnVzL2Rlc2t0b3AtZmlsZS5oOgorCVVzZSBEQnVzRXJyb3IgZm9yIGVycm9yIHJlcG9ydGluZy4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChzZW5kX29uZV9tZXNzYWdlKSwKKwkoYnVzX2Rpc3BhdGNoX21lc3NhZ2VfaGFuZGxlcik6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0KSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwkqIGJ1cy9sb29wLmM6IChidXNfbG9vcF9ydW4pOgorCSogYnVzL21haW4uYzoKKwlVc2UgQlVTX0hBTkRMRV9PT00gaW5zdGVhZCBvZiBfREJVU19IQU5ETEVfT09NLgorCisJKiBidXMvdXRpbHMuYzogKGJ1c193YWl0X2Zvcl9tZW1vcnkpOgorCSogYnVzL3V0aWxzLmg6CisJTmV3IGZpbGVzIHdpdGggZ2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCVJlbW92ZSBfREJVU19IQU5ETEVfT09NLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKSwgKGRidXNfZXJyb3JfaW5pdCksCisJKGRidXNfZXJyb3JfZnJlZSksIChkYnVzX3NldF9lcnJvcl9jb25zdCksIChkYnVzX3NldF9lcnJvcik6CisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJQWRkIERCdXNFcnJvciBzdHJ1Y3R1cmUuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtYWNxdWlyZS1zZXJ2aWNlLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZToKKwlBZGQgc29tZSBzdGFuZGFyZCBtZXNzYWdlcy4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMpLCAoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJVXBkYXRlIGZvciBBUEkgY2hhbmdlcyBpbiBsaWJkYnVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX25ld19yZXBseSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCVJlbW92ZSB0aGUgbmFtZSBhcmd1bWVudC4gVGhlIHNwZWMgc3RhdGVzIHRoYXQgcmVwbGllcyBzaG91bGRuJ3QKKwloYXZlIGEgbmFtZS4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzogKHBhcnNlX3NlY3Rpb25fc3RhcnQpLCAocGFyc2Vfa2V5X3ZhbHVlKSwKKwkocmVwb3J0X2Vycm9yKSwgKGJ1c19kZXNrdG9wX2ZpbGVfbG9hZCksIChsb29rdXBfc2VjdGlvbiksCisJKGxvb2t1cF9saW5lKSwgKGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3JhdyksCisJKGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyk6CisJKiBidXMvZGVza3RvcC1maWxlLmg6CisJU29tZSBmaXhlcywgYW5kIG5ldyBmdW5jdGlvbnMgZm9yIGdldHRpbmcgYSBrZXkgdmFsdWUgZnJvbSBhIHNlY3Rpb24uCisKKzIwMDMtMDItMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdDogbmV3IHRlc3QKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoc2VuZF9yZWplY3RlZCk6IHNodXRkb3duX21lY2goKSB3aGVuIHdlCisJcmVqZWN0IHRoZSBjbGllbnQuCisKKzIwMDMtMDItMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGhhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoKTogYXJncyB0bworCWRidXNfY3JlZGVudGlhbHNfbWF0Y2ggd2VyZSBiYWNrd2FyZAorCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogc3VwcG9ydAorCU5PX0NSRURFTlRJQUxTIGFuZCBST09UX0NSRURFTlRJQUxTCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfZG9fd29yayk6IG1vdmUgZ2V0X3N0YXRlKCkgcm91dGluZQorCWludG8gaGVyZS4gTmV2ZXIgcHJvY2VzcyBtb3JlIGNvbW1hbmRzIGFmdGVyIHdlJ3ZlIHJlYWNoZWQgYW4KKwllbmQgc3RhdGU7IHN0b3JlIGZ1cnRoZXIgZGF0YSBhcyB1bnVzZWQgYnl0ZXMuCisKKwkqIHRlc3QvZGF0YS9hdXRoLyo6IGFkZCBtb3JlIGF1dGggdGVzdHMKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IHN1cHBvcnQgRVhQRUNUCisJY29tbWFuZCB0byBtYXRjaCBleGFjdCBzdHJpbmcgYW5kIEVYUEVDVF9VTlVTRUQgdG8gbWF0Y2ggdW51c2VkCisJYnl0ZXMKKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IHRvIGRpc3QgYWxsIHRoZSB0ZXN0IHN0dWZmCisKKzIwMDMtMDItMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKTogZml4IHRvIGFsc28gc3RyaXAKKwlcciBvZmYgb2YgcG9wcGVkIGxpbmVzCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfdGVzdCk6IHdyaXRlIGNvZGUgdG8gcnVuIGF1dGgKKwlzY3JpcHRzCisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiB3aGVuIGRvaW5nIGEKKwlTRU5ELCBhcHBlbmQgXHJcbgorCisyMDAzLTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiByZW1vdmUgYnJlYWstbG9hZGVyIGZyb20gdGhlIGJ1aWxkLCBzaW5jZSBpdAorCW1vdmVkLgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS1nY292IHRvIHR1cm4gb24gY292ZXJhZ2UgcHJvZmlsaW5nCisJZmxhZ3MgYW5kIGRpc2FibGUgb3B0aW1pemF0aW9uCisKKzIwMDMtMDItMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGgtc2NyaXB0Lmg6IHN5bmMKKwlpbml0aWFsIGN1dCBhdCB0ZXN0IGZyYW1ld29yayBmb3IgREJ1c0F1dGggZnJvbSBsYXB0b3AuCisJRG9lc24ndCBxdWl0ZSB3b3JrIHlldCBidXQgaXQgY29tcGlsZXMgYW5kIEkgbmVlZCB0byBnZXQKKwlpdCBvZmYgdGhlIDI2Nm1oeiBsYXB0b3AuIDstKQorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmMgKF9kYnVzX3NlcnZlcl9kZWJ1Z19hY2NlcHRfdHJhbnNwb3J0KToKKwlmaXggYSBtZW1sZWFrIGluIGVycm9yIGNhc2UKKworMjAwMy0wMi0xMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYzoKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuaDoKKwlBZGQgYSBkZXNrdG9wIGZpbGUgcGFyc2VyLgorCisyMDAzLTAyLTExICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBxdC9tZXNzYWdlLltofGNwcF06IHNhbXBsZSBpbXBsZW1lbnRhdGlvbgorCW9mIHRoZSBLREUgd3JhcHBlciBmb3IgREJ1c01lc3NhZ2UKKworMjAwMy0wMi0wOSAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogdGVzdC9idXMtdGVzdC5jOiBtYWtlX2l0X2NvbXBpbGUKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbWluaW1hbCBzZW1hbnRpYyBmaXgKKworMjAwMy0wMi0wNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwlSZWxlYXNlIDAuMworCisJKiBORVdTOiBVcGRhdGUKKworMjAwMy0wMi0wNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtYnJlYWstbG9hZGVyLmM6CisJKiB0ZXN0L01ha2VmaWxlLmFtOgorCSogdGVzdC9icmVhay1sb2FkZXIuYzoKKwlNb3ZlIGRidXMtYnJlYWstbG9hZGVyIHRvIHRlc3QvIGFuZCByZW5hbWUgaXQgdG8gYnJlYWstbG9hZGVyLgorCisyMDAzLTAyLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jLCBkYnVzL2RidXMta2V5cmluZy5oOiB0ZW1wbGF0ZSBmaWxlcworCWZvciBjb2RlIHRvIG1hbmFnZSBjb29raWVzIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGdldF9zdGF0ZSk6IGltcG9zZSBhIG1heGltdW0gbnVtYmVyIG9mIHRyaWVzCisJdG8gYXV0aGVudGljYXRlLCB0aGVuIGRpc2Nvbm5lY3QgdGhlIGNsaWVudC4KKworMjAwMy0wMi0wMyAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkcyk6CisJQ29ycmVjdCBkb2NzLgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVVwZGF0ZSBhZGRyZXNzIGZvcm1hdCBzZWN0aW9uLgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogdGVzdC9NYWtlZmlsZS5hbToKKwkqIHRlc3QvYnVzLXRlc3QuYzogKGdldF90aW1lKSwgKGFkZF90aW1lb3V0KSwgKHJlbW92ZV90aW1lb3V0KSwKKwkobWVzc2FnZV9oYW5kbGVyKSwgKG5ld19jb25uZWN0aW9uX2NhbGxiYWNrKSwgKGxvb3BfcXVpdCksCisJKGxvb3BfcnVuKSwgKG1haW4pOgorCUFkZCBidXMgdGVzdC4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwlTaW1wbGlmeSB0aGUgY29kZSBhIGJpdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOgorCUZpeCBhIHNpbGx5LgorCisyMDAzLTAyLTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCBsaWJkYnVzLWRhZW1vbi5sYSBhbmQgbGluayB0byBpdC4KKworMjAwMy0wMi0wMSAgSmFtZXMgV2lsbGNveCAgPGp3aWxsY294QGdub21lLm9yZz4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9oYW5kbGVfb3duX3NlcnZpY2UpOgorCUFjdHVhbGx5IGluY2x1ZGUgdGhlIHNlcnZpY2UgcmVwbHkgY29kZSBpbiB0aGUgbWVzc2FnZS4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKToKKwlEb24ndCB1bnJlZiB0aGUgaW5jb21pbmcgbWVzc2FnZS4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy5oOiBBZGQgZGJ1cy1hZGRyZXNzLmggYW5kIGRidXMtYnVzLmgKKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYzogKGRidXNfc2VydmVyX2xpc3Rlbik6CisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJaWZkZWYgb3V0IHRoZSBjYWxscyB0byB0aGUgZGVidWcgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIuCisKKzIwMDMtMDItMDIgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKGRidXNfd2F0Y2hfZ2V0X2ZsYWdzKToKKwlBZGQgbm90ZSBpbiB0aGUgZG9jcyB0aGF0IEVSUk9SIG9yIEhBTkdVUCB3b24ndCBiZSByZXR1cm5lZAorCWFuZCBhcmUgYXNzdW1lZCBhbHdheXMgb24uCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChhZGRfd2F0Y2gpOgorCUFsd2F5cyBhZGQgSU9fRVJSIHwgSU9fSFVQCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIHNlbWljb2xvbiBhZnRlciBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KCkuCisJTWFrZXMgcXQgY29kZSBidWlsZCBhZ2FpbgorCisyMDAzLTAyLTAxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2RyaXZlci5jOiAoY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKToKKwlEb24ndCB0YWtlIGEgbmFtZSwganVzdCB1c2UgYSBudW1lcmljIGlkIHRvIGlkZW50aWZ5CisJZWFjaCBjbGllbnQuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtYnVzLmM6IChkYnVzX2J1c19yZWdpc3Rlcl9jbGllbnQpLAorCShkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UpLCAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOgorCSogZGJ1cy9kYnVzLWJ1cy5oOgorCUFkZCBuZXcgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJRml4IGEgdHlwby4KKworMjAwMy0wMi0wMSAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkcyk6CisJQWRkIHNvbWUgbW9yZSBkb2MgY29tbWVudHMuCisKKzIwMDMtMDItMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1icmVhay1sb2FkZXIuYyAocmFuZG9tbHlfbW9kaWZ5X2xlbmd0aCk6IGNoYW5nZQorCWEgNC1ieXRlIHZhbHVlIGluIHRoZSBtZXNzYWdlIGFzIGlmIGl0IHdlcmUgYSBsZW5ndGgKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSk6IGRvbid0IHNldAorCWV4ZWN1dGUgYml0IG9uIHNhdmVkIGZpbGVzCisKKzIwMDMtMDItMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1icmVhay1sb2FkZXIuYyAobWFpbik6IG5ldyBwcm9ncmFtIHRvIGZpbmQgbWVzc2FnZXMKKwl0aGF0IGJyZWFrIHRoZSBsb2FkZXIuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCk6IG5ldyBmdW5jdGlvbgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19zZXRfYnl0ZSk6IG5ldworCisyMDAzLTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWZhY3RvciB0aGUgdGVzdCBjb2RlIHRvIGJlIG1vcmUgZ2VuZXJhbCwKKwlpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZyBhICJyYW5kb21seSBwZXJtdXRlIHRlc3QgY2FzZXMgdG8KKwl0cnkgdG8gYnJlYWsgdGhlIGxvYWRlciIgcHJvZ3JhbS4KKworMjAwMy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiB3b3JrIG9uIHRoZSBzcGVjaWZpY2F0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBjaGVjaworCXRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogZHJvcCBzcGVjaWFsIF9SRVBMWSBuYW1lcywgdGhlIHNwZWMKKwlubyBsb25nZXIgc3BlY2lmaWVzIHRoYXQuCisJKERCVVNfU0VSVklDRV9SRVBMWV9TRVJWSUNFX0VYSVNUUyk6IGZpeCBmbGFncyAoMS8yLzQvOCBub3QKKwkxLzIvMy80KQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX2dldF9hcmdfZW5kX3Bvcyk6IGFkZCBtaXNzaW5nCisJImJyZWFrIiBmb3IgREJVU19UWVBFX05JTCwgcmVtb3ZlIEB0b2RvCisKKzIwMDMtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9zZXRfaXNfZXJyb3JfcmVwbHkpOiByZW5hbWUKKwlqdXN0IHNldF9pc19lcnJvci9nZXRfaXNfZXJyb3IgYXMgdGhpcyBpcyBhIGNvbW1vbmx5LXVzZWQKKwlmdW5jdGlvbiwgYW5kIHdyaXRlIGRvY3MuCisKKzIwMDMtMDEtMzEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jOiAoZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUpOgorCUZyZWUga2V5IGFuZCB2YWx1ZSBsaXN0cy4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiAoX2RidXNfdHlwZV90b19zdHJpbmcpOgorCUFkZCB0aGUgdHlwZXMgd2UgZGlkbid0IGhhdmUuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX2dldF9hcmdfZW5kX3BvcyksCisJKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKToKKwlBZGQgTklMIHR5cGVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOgorCVJlbW92ZSB0b2RvIGFib3V0IGJlaW5nIGFibGUgdG8gc2V0IHNlbmRlciB0byBOVUxMLgorCisJKGRidXNfbWVzc2FnZV9zZXRfaXNfZXJyb3JfcmVwbHkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2lzX2Vycm9yX3JlcGx5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJTmV3IGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIGVycm9yIHJlcGx5IGZsYWcuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9vcHBvc2l0ZS1lbmRpYW4ubWVzc2FnZToKKwlBZGQgTklMIHR5cGUgdG8gdGVzdC4KKworMjAwMy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBmdWxseSBzcGVjaWZ5IHRoZSBoZWFkZXIuICBBZGQKKwlmbGFncyBhbmQgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiwgYW5kIGNoYW5nZSBoZWFkZXIvYm9keSBsZW4gdG8KKwl1bnNpZ25lZC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChhcHBlbmRfc2F2ZWRfbGVuZ3RoKTogYXBwZW5kIGxlbmd0aAorCWFzIHVpbnQzMgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IGNoYW5nZSBoZWFkZXIKKwlsZW5ndGggYW5kIGJvZHkgbGVuZ3RoIHRvIHVuc2lnbmVkLiBBZGQgdGhlIG5ldyBmaWVsZHMgZnJvbSB0aGUKKwlzcGVjCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiB1bnNpZ25lZCBoZWFkZXIvYm9keSBsZW4KKworMjAwMy0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogcmV3b3JrIHRvIHVzZSBvbmx5IFJFSkVDVEVELCBubworCU1FQ0hBTklTTVMKKworCSogZG9jL2RidXMtc2FzbC1wcm9maWxlLnR4dDogZHJvcCBNRUNIQU5JU01TIGFuZCBqdXN0CisJdXNlIFJFSkVDVEVELCBzdWdnZXN0ZWQgYnkgTWFyayBNY0xvdWdobGluCisKKzIwMDMtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogQHRvZG8gYWJvdXQgaG93IHdlIG5lZWQKKwlhIGJldHRlciB3YXkgdG8gcmVwb3J0IGVycm9ycyBoZXJlLiBlLmcuICAidW5peCBhZGRyZXNzIGxhY2tzCisJcGF0aCIgb3Igc29tZXRoaW5nLiBhbHNvICJubyBzdWNoIGZpbGUiIHdoZW4gdGhlIHBhdGggZG9lc24ndAorCWV4aXN0LCBldGMuCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmMgKGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUpOiBhZGQgQHRvZG8gYWJvdXQKKwlsZWFraW5nIGxpc3Qgbm9kZXMKKwkoZGJ1c19wYXJzZV9hZGRyZXNzKTogYWRkIEB0b2RvIGFib3V0IGRvY3VtZW50aW5nIGFkZHJlc3MgZm9ybWF0LAorCWFuZCBhbGxvd2luZyAsIGFuZCA7IHRvIGJlIGVzY2FwZWQKKworMjAwMy0wMS0zMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJQWRkIGRidXMtYWRkcmVzcy5bY2hdCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6IChkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSksCisJKGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUpLCAoY3JlYXRlX2VudHJ5KSwKKwkoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QpLCAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSksCisJKGRidXNfcGFyc2VfYWRkcmVzcyksIChfZGJ1c19hZGRyZXNzX3Rlc3QpOgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuaDoKKwlOZXcgZmlsZXMgZm9yIGRlYWxpbmcgd2l0aCBhZGRyZXNzIHBhcnNpbmcuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJRG9jdW1lbnQgdGltZW91dCBmdW5jdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJRG9jdW1lbnQgZGJ1c19tZXNzYWdlX25ld19mcm9tX21lc3NhZ2UuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWcuYzoKKwlEb2N1bWVudC4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOiAoZGJ1c19zZXJ2ZXJfbGlzdGVuKToKKwlQYXJzZSBhZGRyZXNzIGFuZCB1c2UgY29ycmVjdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogKF9kYnVzX3N0cmluZ19maW5kX3RvKSwgKF9kYnVzX3N0cmluZ190ZXN0KToKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaDoKKwlOZXcgZnVuY3Rpb24gd2l0aCB0ZXN0LgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiAoZGJ1c19pbnRlcm5hbF9zeW1ib2xfZG9fbm90X3VzZV9ydW5fdGVzdHMpOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwlBZGQgYWRkcmVzcyB0ZXN0cy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOgorCURvY3VtZW50LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJUGFyc2UgYWRkcmVzcyBhbmQgdXNlIGNvcnJlY3QgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLgorCisyMDAzLTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiB1c2UgbWVzc2FnZS0+Ynl0ZV9vcmRlciBpbnN0ZWFkIG9mCisJREJVU19DT01QSUxFUl9CWVRFX09SREVSIHRocm91Z2hvdXQuCisJKGRidXNfbWVzc2FnZV9jcmVhdGVfaGVhZGVyKTogcGFkIGhlYWRlciB0byBhbGlnbiB0aGUKKwlzdGFydCBvZiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byA4LWJ5dGUgYm91bmRhcnkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDogbWFrZSBhbGwgdGhlIGRlbWFyc2hhbGVycyB0YWtlIGNvbnN0CisJREJ1c1N0cmluZyBhcmd1bWVudHMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOgorCXZhbGlkYXRlIG1lc3NhZ2UgYXJncyBoZXJlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHNsb3cgdmFsaWRhdGlvbgorCWxhdGVyLCBhbmQgc28gd2UgY2F0Y2ggYmFkIG1lc3NhZ2VzIGFzIHRoZXkgYXJlIGluY29taW5nLiBBbHNvIGFkZAorCWJldHRlciBjaGVja3Mgb24gaGVhZGVyX2xlbiBhbmQgYm9keV9sZW4uIEFsc28gZmlsbCBpbgorCW1lc3NhZ2UtPmJ5dGVfb3JkZXIKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6IG5ldyAobm90CisJaW1wbGVtZW50ZWQgcHJvcGVybHkpCisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwpOiBuZXcgZnVuY3Rpb24gdG8gY2hlY2sgYWxsLW51bAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKTogcmVuYW1lCisJZ2V0X2FyZ19lbmRfcG9zIGFuZCByZW1vdmUgYWxsIHZhbGlkYXRpb24KKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBhY3R1YWxseSBkbyB2YWxpZGF0aW9uIGhlcmUuCisKKzIwMDMtMDEtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpOiBmaXggYXNzZXJ0aW9uCisJZmFpbHVyZSBvbiBzZXRfY2xpZW50X3NlcmlhbAorCisyMDAzLTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmM6IEFkZCBkb2Mgc2VjdGlvbiBjb21tZW50cworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LWRlYnVnLmM6IGFkZCBkb2Mgc2VjdGlvbiBjb21tZW50cworCisyMDAzLTAxLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYmFzZTY0X2RlY29kZSk6IGFwcGVuZCBieXRlcyBpbgorCXRoZSByZXZlcnNlIG9yZGVyIGZyb20gaG93IEkgaGFkIGl0CisJKF9kYnVzX3N0cmluZ19iYXNlNjRfZW5jb2RlKTogcmV2ZXJzZSBlbmNvZGluZyBvcmRlci4gSSB3YXMKKwliYXNpY2FsbHkgYnl0ZXN3YXBwaW5nIGV2ZXJ5dGhpbmcgZHVyaW5nIGVuY29kaW5nLgorCisyMDAzLTAxLTI4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0KSwKKwkoX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dCk6CisJQWRkIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aW1lb3V0cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9uZXdfZnJvbV9tZXNzYWdlKToKKwlBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtZXNzYWdlIGFuZCBjcmVhdGVzIGFuIGV4YWN0CisJY29weSBvZiBpdCwgYnV0IHdpdGggdGhlIHJlZmNvdW50IHNldCB0byAxLgorCShjaGVja19tZXNzYWdlX2hhbmRsaW5nKToKKwlGaXggYnVpbGQgZXJyb3IuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg6CisJKiBkYnVzL2RidXMtc2VydmVyLmM6IChfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlKSwKKwkoX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UpLCAoX2RidXNfc2VydmVyX2FkZF90aW1lb3V0KSwKKwkoZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKToKKwkoX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0KToKKwlOZXcgZnVuY3Rpb25zIHNvIHRoYXQgYSBzZXJ2ZXIgY2FuIGFkZCBhbmQgcmVtb3ZlIHRpbWVvdXRzLgorCisJKGRidXNfc2VydmVyX2xpc3Rlbik6CisJQWRkIGNvbW1lbnRlZCBvdXQgY2FsbCB0byBkYnVzX3NlcnZlcl9kZWJ1Z19uZXcuCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmM6IChfZGJ1c190aW1lb3V0X25ldyk6CisJQWN0dWFsbHkgc2V0IHRoZSBoYW5kbGVyLCBkb2guCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogKF9kYnVzX3RyYW5zcG9ydF9vcGVuKToKKwlBZGQgY29tbWVudGVkIG91dCBjYWxsIHRvIGRidXNfdHJhbnNwb3J0X2RlYnVnX2NsaWVudF9uZXcuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJQWRkIGRidXMtdHJhbnNwb3J0LWRlYnVnLltjaF0gYW5kIGRidXMtc2VydmVyLWRlYnVnLltjaF0KKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyk6IGZ1bmN0aW9uIHRvIGNoZWNrCisJb24gdGhlIGxvYWRlZCBtZXNzYWdlLCBpdGVyYXRlcyBvdmVyIGl0IGV0Yy4KKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogZml4IG1ha2UgZGlzdGRpcgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChURVNUU19FTlZJUk9OTUVOVCk6IGZpeCBtYWtlIGNoZWNrCisKKzIwMDMtMDEtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmMgKHRpbWVfZm9yX3NpemUpOiByZXBsYWNlIHByaW50ZiB3aXRoCisJX2RidXNfdmVyYm9zZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogYWxsb3cKKwllbXB0eSBsaW5lczsgZml4IHRoZSBTQVZFX0xFTkdUSCBzdHVmZiB0byBiZQorCVNUQVJUX0xFTkdUSC9FTkRfTEVOR1RIIHNvIGl0IGFjdHVhbGx5IHdvcmtzOyBjb3VwbGUgb3RoZXIKKwlidWdmaXhlcworCisJKiB0ZXN0L01ha2VmaWxlLmFtIChkaXN0LWhvb2spOiBhZGQgZGlzdC1ob29rIGZvciAubWVzc2FnZSBmaWxlcworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKERCVVNfU1RSSU5HX0NPUFlfUFJFQU1CTEUpOiBzb3VyY2Ugb2YgYSBjb3B5CisJY2FuIGJlIGNvbnN0YW50IG9yIGxvY2tlZC4KKwkoX2RidXNfc3RyaW5nX2ZyZWUpOiBhbGxvdyBmcmVlaW5nIGEgY29uc3Qgc3RyaW5nIGFzCisJZG9jdW1lbnRlZC9pbnRlbmRlZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlKTogdXRpbGl0eQorCisJKiBkYnVzL2RidXMtdGVzdC1tYWluLmMgKG1haW4pOiB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIGlzIHRoZQorCWRpcmVjdG9yeSBjb250YWluaW5nIHRlc3QgZGF0YQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBwYXNzIGEgdGVzdF9kYXRhX2RpcgorCWFyZ3VtZW50IHRvIHRoaXMgYW5kIGxvYWQgYWxsIHRoZSBtZXNzYWdlcyBpbiB0ZXN0L2RhdGEvCisJY2hlY2tpbmcgdGhhdCB0aGV5IGNhbiBiZSBsb2FkZWQgb3Igbm90IGxvYWRlZCBhcyBhcHByb3ByaWF0ZS4KKworMjAwMy0wMS0yNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoYnVzX2Rpc3BhdGNoX21lc3NhZ2VfaGFuZGxlcik6CisJRGlzcGF0Y2ggbWVzc2FnZXMgc2VudCB0byBzZXJ2aWNlcy4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkKToKKwlBZGQgaGVscGVyIGZ1bmN0aW9ucyBmb3Igc2VuZGluZyBzZXJ2aWNlIHJlbGF0ZWQgbWVzc2FnZXMuCisKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSk6CisJU2VuZCBIRUxMT19SRVBMWSBpbnN0ZWFkIG9mIFdFTENPTUUuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6CisJU2VuZCBMSVNUX1NFUlZJQ0VTX1JFUExZIGluc3RlYWQgb2YgU0VSVklDRVMuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfb3duX3NlcnZpY2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJTmV3IG1lc3NhZ2UgaGFuZGxlcnMuCisKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJSW52b2tlIG5ldyBtZXNzYWdlIGhhbmRsZXJzLgorCisJKGJ1c19kcml2ZXJfcmVtb3ZlX2Nvbm5lY3Rpb24pOgorCURvbid0IHJlbW92ZSBhbnkgc2VydmljZXMgaGVyZSBzaW5jZSB0aGF0J3MgZG9uZSBhdXRvbWF0aWNhbGx5CisJYnkgYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIG5vdy4KKworCSogYnVzL2RyaXZlci5oOgorCU5ldyBmdW5jdGlvbiBzaWduYXR1cmVzLgorCisJKiBidXMvc2VydmljZXMuYzogKGJ1c19zZXJ2aWNlX2FkZF9vd25lcik6CisJU2VuZCBTZXJ2aWNlQWNxdWlyZWQgbWVzc2FnZSBpZiB3ZSdyZSB0aGUgb25seSBwcmltYXJ5IG93bmVyLgorCisJKGJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lcik6CisJU2VuZCBTZXJ2aWNlQWNxdWlyZWQvU2VydmljZUxvc3QgbWVzc2FnZXMuCisKKwkoYnVzX3NlcnZpY2Vfc2V0X3Byb2hpYml0X3JlcGxhY2VtZW50KSwKKwkoYnVzX3NlcnZpY2VfZ2V0X3Byb2hpYml0X3JlcGxhY2VtZW50KToKKwlGdW5jdGlvbnMgZm9yIHNldHRpbmcgcHJvaGliaXQgcmVwbGFjZW1lbnQuCisKKwkoYnVzX3NlcnZpY2VfaGFzX293bmVyKToKKwlOZXcgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBjb25uZWN0aW9uIGlzIGluIHRoZSBvd25lciBxdWV1ZSBvZgorCWEgY2VydGFpbiBzZXJ2aWNlLgorCisJKiBidXMvc2VydmljZXMuaDoKKwlBZGQgbmV3IGZ1bmN0aW9uIHNpZ25hdHVyZXMuCisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IChfZGJ1c19saXN0X3Rlc3QpOgorCUFkZCB0ZXN0cyBmb3IgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCBhbmQgdHJhdmVyc2luZyB0aGUgbGlzdCBiYWNrd2FyZHMuCisKKwkqIGRidXMvZGJ1cy1saXN0Lmg6CisJRml4IGEgdHlwbyBpbiBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmssIGlmIHdlJ3JlIGF0IHRoZSBmaXJzdCBlbGVtZW50IHdlIGNhbid0CisJZ28gYW55IGZ1cnRoZXIsIHNvIHJldHVybiBOVUxMIHRoZW4uCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBuZXcgbWVzc2FnZXMsIHNlcnZpY2UgZmxhZ3MgYW5kIHNlcnZpY2UgcmVwbGllcy4KKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiBpbXBsZW1lbnQsIGNvbXBsZXRlbHkgdW50ZXN0ZWQuCisKKwkqIHRlc3QvZGF0YS8qOiBhZGQgZGF0YSB0byBiZSB1c2VkIGluIHRlc3RpbmcuCisJIi5tZXNzYWdlIiBmaWxlcyBhcmUgb3VyIHNpbXBsZSBsb2FkYWJsZSB0ZXh0IGZvcm1hdC4KKwkiLm1lc3NhZ2UtcmF3IiB3aWxsIGJlIGJpbmFyeSBkdW1wcyBvZiBtZXNzYWdlcy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIpOiBuZXcKKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOiBhZGQKKwlmaWxlIGVycm9ycworCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IG5ldyBmaWxlLCB3aWxsIGNvbnRhaW4gY29kZSB0byBsb2FkCisJdXAgbWVzc2FnZXMgZnJvbSBmaWxlcy4gTm90IGltcGxlbWVudGVkIHlldC4KKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOiBzdXBwb3J0IGRlbGV0aW5nCisJdGhlIHNlbmRlciBieSBzZXR0aW5nIHRvIE5VTEwKKworMjAwMy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworICAgICAgICBUaGUgdW5pdCB0ZXN0cyBwYXNzLCBidXQgb3RoZXJ3aXNlIHVudGVzdGVkLiAgSWYgaXQgYnJlYWtzLCB0aGUKKwl0ZXN0cyBzaG91bGQgaGF2ZSBiZWVuIGJldHRlci4gOy0pCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pOiByZXR1cm4gaWYgd2UgZGlzY29ubmVjdAorCXRoZSBjb25uZWN0aW9uLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWRvIGV2ZXJ5dGhpbmcgc28gd2UgbWFpbnRhaW4KKwltZXNzYWdlLT5oZWFkZXIgYXMgdGhlIG9ubHkgY29weSBvZiB0aGUgdmFyaW91cyBmaWVsZHMuCisJVGhpcyBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IG9mIG91dC1vZi1tZW1vcnkgaW4gc29tZSBjYXNlcywKKwlmb3IgZXhhbXBsZSBkYnVzX21lc3NhZ2VfbG9jaygpIGNhbid0IHJ1biBvdXQgb2YgbWVtb3J5IGFueW1vcmUsCisJYW5kIGF2b2lkcyBleHRyYSBjb3B5aW5nLiBGaWd1cmVkIEkgbWF5IGFzIHdlbGwgZ28gYWhlYWQgYW5kIGRvCisJdGhpcyBzaW5jZSBpdCB3YXMgYnVzdGVkIGZvciBkYnVzX21lc3NhZ2VfbG9jayB0byBub3QgcmV0dXJuCisJZmFpbHVyZSBvbiBPT00sIGFuZCBkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyIHdhcyB0b3RhbGx5CisJdW5jaGVja2VkIGZvciBPT00uIEFsc28gZml4ZWQgc29tZSByYW5kb20gb3RoZXIgYnVncy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3Bvcyk6IHZlcmlmeQorCXRoYXQgc3RyaW5ncyBhcmUgbnVsLXRlcm1pbmF0ZWQuIEFsc28sIGVuZF9wb3MgY2FuIGJlIGVxdWFsCisJdG8gc3RyaW5nIGxlbmd0aCBqdXN0IG5vdCBncmVhdGVyIHRoYW4sIEkgdGhpbmsuCisJKF9kYnVzX21hcnNoYWxfc2V0X2ludDMyKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMik6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19tYXJzaGFsX3NldF9zdHJpbmcpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6IGZpeAorCWEgd2FybmluZywgaW5pdCB0aW1lb3V0X2xpc3QgdG8gTlVMTAorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKTogZG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKwkic2VyaWFsIgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbik6IG5ldyBmdW5jdGlvbgorCisyMDAzLTAxLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKToKKwlQbHVnIGxlYWtzCisKKzIwMDMtMDEtMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiAocHJvY2Vzc19hdXRoKSwgKF9kYnVzX2F1dGhfdW5yZWYpOgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpLAorCShkYnVzX2Nvbm5lY3Rpb25fdW5yZWYpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX3VucmVmKSwKKwlQbHVnIG1lbW9yeSBsZWFrcy4KKworCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkcyk6CisJUmVtb3ZlIGRlYnVnZ2luZyBwcmludG91dC4KKworCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKToKKwlEb24ndCBzdG9yZSB0aGUgaGVhZGVyIHN0cmluZy4KKworCShfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCVBsdWcgbGVha3MuCisKKzIwMDMtMDEtMjYgIFJpY2hhcmQgSHVsdCAgPHJodWx0QGNvZGVmYWN0b3J5LnNlPgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogVHJhdmVyc2UgYSBjb3B5IG9mCisJdGhlIGZpbGUgZGVzY3JpcHRvciBsaXN0LCBzaW5jZSBpdCBjYW4gY2hhbmdlIHVuZGVyIHVzLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IChkYnVzX2Nvbm5lY3Rpb25fcHJlcGFyZSksCisJKGRidXNfY29ubmVjdGlvbl9jaGVjayksIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpLCAoYWRkX3dhdGNoKSwKKwkocmVtb3ZlX3dhdGNoKSwgKGRidXNfY29ubmVjdGlvbl9ob29rdXBfd2l0aF9nX21haW4pOgorCVJld3JpdGUgdGhlIGdsaWIgaGFuZGxpbmcgdG8gdXNlIGl0cyBvd24gR1NvdXJjZSBpbnN0ZWFkIG9mIGEKKwlHSU9DaGFubmVsIHNvIHdlIGNhbiBjYXRjaCBtZXNzYWdlcyBwdXQgaW4gdGhlIHF1ZXVlIHdoaWxlIHdhaXRpbmcKKwlmb3IgYSByZXBseS4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChjb25uZWN0aW9uX2Rpc2Nvbm5lY3RfaGFuZGxlciksCisJKGNvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2spLCAoYnVzX2Nvbm5lY3Rpb25fc2V0dXApOgorCSogYnVzL2Rpc3BhdGNoLmM6IChzZW5kX29uZV9tZXNzYWdlKSwKKwkoYnVzX2Rpc3BhdGNoX2Jyb2FkY2FzdF9tZXNzYWdlKSwgKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpLAorCShidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24pLCAoYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uKToKKwkqIGJ1cy9kaXNwYXRjaC5oOgorCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksIChidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6CisJKiBidXMvZHJpdmVyLmg6CisJUmVmYWN0b3IgY29kZSwgcHV0IHRoZSBtZXNzYWdlIGRpc3BhdGNoaW5nIGluIGl0cyBvd24gZmlsZS4gVXNlCisJX0RCVVNfSEFORExFX09PTS4gQWxzbyBzZW5kIFNlcnZpY2VEZWxldGVkIG1lc3NhZ2VzIHdoZW4gYSBjbGllbnQKKwlpcyBkaXNjb25uZWN0ZWQuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6CisJQWRkIF9EQlVTX0hBTkRMRV9PT00gbWFjcm8sIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgY3VycmVudGx5LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlJbXBsZW1lbnQgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBtZXNzYWdlIGFuZCBzZXJ2aWNlIGRlZmluZXMuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2VfZ2V0X2NsaWVudF9zZXJpYWwpLAorCShkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyKToKKwlSZW1vdmUgX2RidXNfbWVzc2FnX3VubG9jayBhbmQgZG9uJ3Qgc2V0IHRoZSBjbGllbnQgc2VyaWFsIG9uIGEKKwltZXNzYWdlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKworMjAwMy0wMS0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoYWxsb2NfbGluayk6IHB1dCBhIHRocmVhZCBsb2NrIG9uIHRoZSBnbG9iYWwKKwlsaXN0X3Bvb2wKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKTogZml4IGEgbGVhaworCW9uIE9PTQorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogKGFsbG9jX2xpbmspLCAoZnJlZV9saW5rKToKKwlVc2UgYSBtZW1vcnkgcG9vbCBmb3IgdGhlIGxpbmtzLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogKGJ1c19jb25uZWN0aW9uX2ZvcmVhY2gpOgorCSogYnVzL2Nvbm5lY3Rpb24uaDoKKwlBZGQgbmV3IGJ1c19jb25uZWN0aW9uX2ZvcmVhY2ggZnVuY3Rpb24uCisKKwkqIGJ1cy9kcml2ZXIuYzogKHNlbmRfb25lX21lc3NhZ2UpLCAoYnVzX2RyaXZlcl9icm9hZGNhc3RfbWVzc2FnZSk6CisJQWRkIGZ1bmN0aW9uIHRoYXQgYnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIGNsaWVudHMuCisKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyksCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzKSwgKGJ1c19kcml2ZXJfbWVzc2FnZV9oYW5kbGVyKToKKwlJbXBsZW1lbnQgZnVuY3Rpb25zIHRoYXQgdGFrZSBjYXJlIG9mIGxpc3Rpbmcgc2VydmljZXMsIGFuZCBub3RpZnlpbmcKKwljbGllbnRzIHdoZW4gbmV3IHNlcnZpY2VzIGFyZSBjcmVhdGVkLgorCisJKiBidXMvc2VydmljZXMuYzogKGJ1c19zZXJ2aWNlc19saXN0KToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCUFkZCBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgY3VycmVudGx5CisJcmVnaXN0ZXJlZCBzZXJ2aWNlcy4KKworCSogZ2xpYi9kYnVzLWdsaWIuaDoKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOgorCVVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKToKKwlVbmxvY2sgdGhlIG1lc3NhZ2UgaW4gY2FzZSBpdCB3YXMgc2VudCBlYXJsaWVyLgorCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCVJlbW92ZSB0aGUgcmVwbHkgbWVzc2FnZSBmcm9tIHRoZSBsaXN0LgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX3N0cmluZ19hcnJheSk6CisJU2V0IGFycmF5X2xlbiBhbmQgbmV3X3BvcyBjb3JyZWN0bHkuCisKKwkoX2RidXNfbWFyc2hhbF90ZXN0KToKKwlSZW1vdmUgZGVidWcgb3V0cHV0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVwbHkgc2VyaWFsLgorCisJKF9kYnVzX21lc3NhZ2VfdW5sb2NrKToKKwlOZXcgZnVuY3Rpb24gdGhhdCB1bmxvY2tzIGEgbWVzc2FnZSBhbmQgcmVzZXRzIGl0cyBoZWFkZXIuCisKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkcyksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZmllbGRzX3ZhbGlzdCk6CisJSGFuZGxlIHN0cmluZyBhcnJheXMuCisKKwkoZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIpOgorCU1ha2UgdGhpcyBmdW5jdGlvbiBwdWJsaWMgc2luY2UgdGhlIGJ1cyBkYWVtb24gbmVlZHMgaXQuCisKKwkoZGVjb2RlX2hlYWRlcl9kYXRhKToKKwlTZXQgdGhlIHJlcGx5IHNlcmlhbCB0byAtMSBpbml0aWFsbHkuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyLgorCisyMDAzLTAxLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGFkZCBzb21lIHN0dWZmCisKKzIwMDMtMDEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogU3RhcnQgdG8gZG9jdW1lbnQgdGhlIHByb3RvY29sLgorCisyMDAzLTAxLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOiBhZGQgc29tZSBAdG9kbworCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfYWRkX2Nvbm5lY3Rpb24pOiBhZGQgYSBGSVhNRSBhYm91dCBtZW1sZWFrCisKKzIwMDMtMDEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKHBhdGNoIHVudGVzdGVkIGJlY2F1c2UgY2FuJ3QgY29tcGlsZSkKKworCSogYnVzL2RyaXZlci5jIChjcmVhdGVfdW5pcXVlX2NsaWVudF9uYW1lKTogbWFrZSB0aGlzIGZ1bmN0aW9uCisJbmV2ZXIgcmVjeWNsZSBjbGllbnQgbmFtZXMuIEFsc28sIGNhbGxlciBzaG91bGQgaW5pdGlhbGl6ZQorCXRoZSBEQnVzU3RyaW5nLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19nZXRfY3VycmVudF90aW1lKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDEtMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9kb3VibGUpLAorCShfZGJ1c19tYXJzaGFsX2ludDMyKSwgKF9kYnVzX21hcnNoYWxfdWludDMyKSwKKwkoX2RidXNfbWFyc2hhbF9pbnQzMl9hcnJheSksIChfZGJ1c19tYXJzaGFsX3VpbnQzMl9hcnJheSksCisJKF9kYnVzX21hcnNoYWxfZG91YmxlX2FycmF5KSwgKF9kYnVzX21hcnNoYWxfc3RyaW5nX2FycmF5KSwKKwkoX2RidXNfZGVtYXJzaGFsX2ludDMyX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF91aW50MzJfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpLAorCShfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKSwgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIHN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nIGludGVnZXIsIGRvdWJsZQorCWFuZCBzdHJpbmcgYXJyYXlzLgorCisyMDAzLTAxLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCUFkZCBkcml2ZXIuW2NoXQorCisJKiBidXMvY29ubmVjdGlvbi5jOiAoY29ubmVjdGlvbl9kaXNjb25uZWN0X2hhbmRsZXIpOgorCVJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBidXMgZHJpdmVyJ3MgbGlzdC4KKworCShjb25uZWN0aW9uX3dhdGNoX2NhbGxiYWNrKTogRGlzcGF0Y2ggbWVzc2FnZXMuCisKKwkoZnJlZV9jb25uZWN0aW9uX2RhdGEpOiBGcmVlIGNvbm5lY3Rpb24gbmFtZS4KKworCShidXNfY29ubmVjdGlvbl9zZXR1cCk6IEFkZCBjb25uZWN0aW9uIHRvIHRoZSBidXMgZHJpdmVyJ3MgbGlzdC4KKwkoYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX293bmVkX3NlcnZpY2UpOgorCShidXNfY29ubmVjdGlvbl9zZXRfbmFtZSksIChidXNfY29ubmVjdGlvbl9nZXRfbmFtZSk6CisJQWRkIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBhbmQgZ2V0dGluZyB0aGUgY29ubmVjdGlvbidzIG5hbWUuCisKKwkqIGJ1cy9jb25uZWN0aW9uLmg6CisJQWRkIGZ1bmN0aW9uIGhlYWRlcnMuCisKKwkqIGJ1cy9kcml2ZXIuYzogKGNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUpLAorCShidXNfZHJpdmVyX2hhbmRsZV9oZWxsb19tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSksIChidXNfZHJpdmVyX21lc3NhZ2VfaGFuZGxlciksCisJKGJ1c19kcml2ZXJfYWRkX2Nvbm5lY3Rpb24pLCAoYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbik6CisJKiBidXMvZHJpdmVyLmg6CisJKiBidXMvbWFpbi5jOgorCSogYnVzL3NlcnZpY2VzLmM6IChidXNfc2VydmljZV9mcmVlKToKKwkqIGJ1cy9zZXJ2aWNlcy5oOgorCU5ldyBmaWxlIHRoYXQgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGFuZCByZWdpc3RyZWF0aW9uIHdpdGggdGhlIGJ1cworCWl0c2VsZi4KKworMjAwMy0wMS0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKToKKwlBZGQgYSBuZXcgY2xpZW50X3NlcmlhbCBwYXJhbWV0ZXIuCisKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5KToKKwlSZW1vdmUgYSBAdG9kbyBzaW5jZSB3ZSd2ZSBpbXBsZW1lbnRlZCB0aGUgYmxvY2tpbmcgZnVuY3Rpb24uCisKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5X2FuZF9ibG9jayk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgc2VuZHMgYSBtZXNzYWdlIGFuZCB3YWl0cyBmb3IgYSByZXBseSBhbmQKKwl0aGVuIHJldHVybnMgdGhlIHJlcGx5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOgorCUFkZCBuZXcgZnVuY3Rpb25zLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBuZXcgREJVU19SRVNVTFQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoX2RidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsKSwKKwkoX2RidXNfbWVzc2FnZV9zZXRfc2VuZGVyKSwgKGRidXNfbWVzc2FnZV93cml0ZV9oZWFkZXIpLAorCShkYnVzX21lc3NhZ2VfbmV3X3JlcGx5KSwgKGRlY29kZV9oZWFkZXJfZGF0YSksCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpLCAoX2RidXNfbWVzc2FnZV90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIG5ldyBmdW5jdGlvbnMgdGhhdCBzZXQgdGhlIHJlcGx5IHNlcmlhbCBhbmQgc2VuZGVyLgorCUFsc28gbWFyc2hhbCBhbmQgZGVtYXJzaGFsIHRoZW0gY29ycmVjdGx5IGFuZCBhZGQgdGVzdC4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIG5ldyBEQlVTX01FU1NBR0VfVFlQRV9TRU5ERVIuCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKHdhdGNoX2NhbGxiYWNrKSwgKGZyZWVfY2FsbGJhY2tfZGF0YSksCisJKGFkZF93YXRjaCksIChyZW1vdmVfd2F0Y2gpLCAoYWRkX3RpbWVvdXQpLCAocmVtb3ZlX3RpbWVvdXQpLAorCShkYnVzX2Nvbm5lY3Rpb25faG9va3VwX3dpdGhfZ19tYWluKToKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1haW4pOgorCVJld3JpdGUgdG8gdXNlIEdJT0NoYW5uZWwgYW5kIHJlbW92ZSB0aGUgR1NvdXJjZSBjcmFjay4KKworCSogdGVzdC9lY2hvLWNsaWVudC5jOiAobWFpbik6CisJKiB0ZXN0L3dhdGNoLmM6IChjaGVja19tZXNzYWdlcyk6CisJVXBkYXRlIGZvciBjaGFuZ2VkIEFQSXMKKworMjAwMy0wMS0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06IEFkZCBkYnVzLXRpbWVvdXQuW2PEp10KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOgorCUNyZWF0ZSBhIERCdXNUaW1lb3V0TGlzdC4KKwkoZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyk6IEFkZCBuZXcgZnVuY3Rpb24gdG8KKwlzZXQgdGltZW91dCBjYWxsYmFja3MKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogQWRkIHB1YmxpYyBEQnVzVGltZW91dCBBUEkuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X3NlcnZpY2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoJTmV3IGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IEZpeCBzbWFsbCBkb2MgdHlwby4KKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuW2NoXTogTmV3IGZpbGVzIGZvciBtYWlubG9vcCB0aW1lb3V0cy4KKworMjAwMy0wMS0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX21vdmVfbGVuKTogRG9uJ3QgZGVsZXRlIGFsbAorCW9mIHRoZSBzdHJpbmcsIGp1c3QgYXMgbG9uZyBhcyBzcGVjaWZpZWQuCisKKzIwMDMtMDEtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfYXV0aGVudGljYXRlZCk6CisJbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfc2V0X21heF9jb25uZWN0aW9ucykKKwkoZGJ1c19zZXJ2ZXJfZ2V0X21heF9jb25uZWN0aW9ucywgZGJ1c19zZXJ2ZXJfZ2V0X25fY29ubmVjdGlvbnMpOgorCWtlZXAgdHJhY2sgb2YgY3VycmVudCBudW1iZXIgb2YgY29ubmVjdGlvbnMsIGFuZCBhZGQgQVBJIGZvcgorCXNldHRpbmcgYSBtYXggKGJ1dCBoYXZlbid0IGltcGxlbWVudGVkIGVuZm9yY2luZyB0aGUgbWF4IHlldCkKKworMjAwMy0wMS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZG9faXRlcmF0aW9uKTogb25seSBkbyB0aGUKKwlyZWFkaW5nL3dyaXRpbmcgaWYgcmVhZF93YXRjaCAhPSBOVUxMIG9yIHdyaXRlX3dhdGNoICE9IE5VTEwuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBmaXgKKwl0aGUgbWVzc2FnZSBsb2FkZXIgY29kZSB0byBhY3R1YWxseSBsb2FkIG1lc3NhZ2UtPmhlYWRlciBhbmQKKwltZXNzYWdlLT5ib2R5IGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgbWVzc2FnZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGNoZWNrX3dyaXRlX3dhdGNoKTogZml4IGEgbWVtIGxlYWsKKwlpbiBPT00gY2FzZQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUpCisJKGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSkKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbGl2ZV9tZXNzYWdlc19zaXplKQorCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9saXZlX21lc3NhZ2VzX3NpemUpOiBpbXBsZW1lbnQgc29tZQorCXJlc291cmNlIGxpbWl0YXRpb24gZnVuY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1yZXNvdXJjZXMuYzogbmV3IGZpbGUgaW1wbGVtZW50aW5nIHNvbWUgb2YgdGhlCisJcmVzb3VyY2UgbGltaXRzIHN0dWZmCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KTogYWRkCisJbWlzc2luZyBkb2NzLCBhZGQgQHRvZG8gdG8gaGFuZGxlIE9PTSBldGMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9ieXRlX2FycmF5KTogYWRkIG1pc3NpbmcKKwlkb2NzCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl91bnJlZik6IGRpc2Nvbm5lY3QgdGhlCisJY29ubmVjdGlvbiBpZiBpdCBoYXNuJ3QgYmVlbiBhbHJlYWR5LgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBraWxsIG9mZiB0aGUgaWRlYSBvZiBhbiBFcnJvckZ1bmN0aW9uLAorCXJlcGxhY2Ugd2l0aCBEaXNjb25uZWN0RnVuY3Rpb24uCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgQnVpbGRpbmcgLS1kaXNhYmxlLXZlcmJvc2UtbW9kZSAtLWRpc2FibGUtYXNzZXJ0cyAtLWRpc2FibGUtdGVzdHMKKwljdXRzIHRoZSBsaWJyYXJ5IGZyb20gMTEySyB0byA0NUsgb3Igc28KKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3IgdmFyYXJncyBtYWNybyBzdXBwb3J0LAorCWFkZCAtLWVuYWJsZS12ZXJib3NlLW1vZGUsIC0tZW5hYmxlLWFzc2VydHMuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX2RidXNfYXNzZXJ0KTogc3VwcG9ydAorCURCVVNfRElTQUJMRV9BU1NFUlQKKwkoX2RidXNfdmVyYm9zZSk6IHN1cHBvcnQgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IGluY2x1ZGUgY29uZmlnLmggc28gdGhhdCB0ZXN0cyBhY3R1YWxseSBydW4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jOiBhZGQgYXNzZXJ0aW9ucyB0aGF0IHN0dWZmIGlzIDgtYnl0ZSBhbGlnbmVkLAorCXNvIHRoZSBmYWlsdXJlIG1vZGUgd2hlbiB0aGF0IGFzc3VtcHRpb24gZmFpbHMgd2lsbCBiZSBwbGVudHkKKwlvYnZpb3VzLgorCisyMDAzLTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IGRlZmF1bHQgLS1lbmFibGUtdGVzdHMgdG8gJFVTRV9NQUlOVEFJTkVSX01PREUKKworCSogZGJ1cy9NYWtlZmlsZS5hbTogZml4IGl0IHVwIHNvIGR1YnMtdGVzdC1tYWluLmMgaXMgaW5jbHVkZWQgaW4KKwl0aGUgZGlzdHJpYnV0aW9uCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IGRvbid0IHVzZSBzcGVjaWFsIHZhcmlhYmxlICJURVNUUyIgZm9yIGVjaG8tKgorCXNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRob3NlIGluIG1ha2UgY2hlY2sKKworMjAwMy0wMS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgUmVsZWFzZSAwLjIKKworCSogTkVXUzogdXBkYXRlCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBmaXggc28gdGhhdCB0ZXN0IHNvdXJjZSBjb2RlIGVuZHMgdXAgaW4gdGhlCisJZGlzdHJpYnV0aW9uIG9uIG1ha2UgZGlzdGNoZWNrCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIFJlbGVhc2UgMC4xLgorCisJKiBORVdTOiB1cGRhdGUKKworMjAwMy0wMS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfc3ltYm9sX2RvX25vdF91c2VfcnVuX3Rlc3RzKToKKwlmaXggYnVpbGQgd2hlbiAtLWRpc2FibGUtdGVzdHMKKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBwdXQgSEFDS0lORyBpbiBoZXJlCisKKwkqIEhBQ0tJTkc6IGRvY3VtZW50IHByb2NlZHVyZSBmb3IgbWFraW5nIGEgdGFyYmFsbCByZWxlYXNlLgorCisyMDAzLTAxLTE0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogKGNvbm5lY3Rpb25fZXJyb3JfaGFuZGxlciksCisJKGJ1c19jb25uZWN0aW9uX3NldHVwKToKKwkqIGJ1cy9tYWluLmM6IChtYWluKToKKwlNYWtlIHN1cmUgdGhhdCB0aGUgREJ1c0Nvbm5lY3Rpb25EYXRhIHN0cnVjdCBpcyBOVUxMZWQKKwlvdXQgdG8gcHJldmVudCBhIHNlZ2ZhdWx0LgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IChkYnVzX3Jlc3VsdF90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9nZXRfZmllbGRzKSwKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHNfdmFsaXN0KSwgKF9kYnVzX21lc3NhZ2VfdGVzdCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCU1ha2UgZGJ1c19tZXNzYWdlX2dldF9maWVsZHMgcmV0dXJuIGEgcmVzdWx0IGNvZGUgc28gd2UgY2FuCisJdHJhY2sgaW52YWxpZCBmaWVsZHMgYXMgd2VsbCBhcyBvb20uCisKKzIwMDMtMDEtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIC0tZW5hYmxlLXRlc3QvLS1lbmFibGUtYW5zaSBhY3Rpb24taWYtZ2l2ZW4KKwl0byBlbmFibGVfZm9vPSRlbmFibGV2YWwgaW5zdGVhZCBvZiBlbmFibGVfZm9vPXllcworCisyMDAzLTAxLTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGgpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXRlc3QtbWFpbi5jOiBtb3ZlIG1haW4oKSBmb3IgdGVzdCBhcHAgaGVyZQorCSogZGJ1cy9kYnVzLXRlc3QuYworCShkYnVzX2ludGVybmFsX3N5bWJvbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IHdlIGhhdmUgdG8gZXhwb3J0IGEKKwlzeW1ib2wgdG8gcnVuIHRlc3RzLCBiZWNhdXNlIGRidXMtdGVzdCBpc24ndCBpbiB0aGUgbWFpbgorCWxpYnJhcnkKKworICAgICAgICBDb2RlIHJldmlldyBuaXRwaWNrcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3dyaXRlX2hlYWRlcik6IGFkZCBuZXdsaW5lcworCWZvciBwZW9wbGUgd2l0aCBuYXJyb3cgZW1hY3MgOy0pLiBBc3NlcnQgY2xpZW50X3NlcmlhbCB3YXMgZmlsbGVkCisJaW4uIEFzc2VydCBtZXNzYWdlLT5uYW1lICE9IE5VTEwuCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZmllbGRzKTogaGF2ZSAiZmlyc3RfZmllbGRfdHlwZSIgYXJnIHNlcGFyYXRlCisJZnJvbSB2YSBsaXN0LCBuZWVkZWQgZm9yIEMrKyBiaW5kaW5nIHRoYXQgYWxzbyB1c2VzIHZhcmFyZ3MgSUlSQworCWFuZCBoZWxwcyB3aXRoIHR5cGUgc2FmZXR5CisJKGRidXNfbWVzc2FnZV9uZXcpOiBhZGQgQHRvZG8gYWJvdXQgdXNpbmcgREJ1c1N0cmluZyB0byBzdG9yZQorCXNlcnZpY2UvbmFtZSBpbnRlcm5hbGx5CisJKGRidXNfbWVzc2FnZV9uZXcpOiBkb24ndCBsZWFrIC0+c2VydmljZSBhbmQgLT5uYW1lIG9uIE9PTSBsYXRlcgorCWluIHRoZSBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2VfdW5yZWYpOiBmcmVlIHRoZSBzZXJ2aWNlIG5hbWUKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHMpOiBzYW1lIGNoYW5nZSB0byB2YXJhcmdzCisJaS5lLiBmaXJzdF9maWVsZF90eXBlCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpOiBhc3NlcnQgdGhhdCB0aGUgbWVzc2FnZSBkYXRhCisJaXMgYWxpZ25lZCAoaWYgbm90IGl0J3MgYSBidWcgaW4gb3VyIGNvZGUpLiBQdXQgaW4gdmVyYm9zZSBncmlwaW5nCisJYWJvdXQgd2h5IHdlIHNldCBjb3JydXB0ZWQgPSBUUlVFLgorCShkZWNvZGVfaGVhZGVyX2RhdGEpOiBhZGQgRklYTUUgdGhhdCBjaGFyKiBpcyBldmlsLiAgV2FzIGdvaW5nIHRvCisJYWRkIEZJWE1FIGFib3V0IGV2aWwgbG9jYWxlLXNwZWNpZmljIHN0cmluZy5oIHN0cm5jbXAsIGJ1dCBqdXN0CisJc3dpdGNoZWQgdG8gd2Fja3kgc3RyaW5nLWFzLXVpbnQzMiBvcHRpbWl6YXRpb24uIE1vdmUgY2hlY2sgZm9yCisJIm5vIHJvb20gZm9yIGZpZWxkIG5hbWUiIGFib3ZlIGdldF9jb25zdF9kYXRhX2xlbigpIHRvIGF2b2lkCisJYXNzZXJ0aW9uIGZhaWx1cmUgaW4gZ2V0X2NvbnN0X2RhdGFfbGVuIGlmIHdlIGhhdmUgdHJhaWxpbmcgMgorCWJ5dGVzIG9yIHRoZSBsaWtlLiBDaGVjayBmb3Igc2VydmljZSBhbmQgbmFtZSBmaWVsZHMgYmVpbmcKKwlwcm92aWRlZCB0d2ljZS4gRG9uJ3QgbGVhayBzZXJ2aWNlL25hbWUgb24gZXJyb3IuIFJlcXVpcmUgZmllbGQKKwluYW1lcyB0byBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IG1vdmUgYnl0ZSBzd2FwIHN0dWZmIHRvIGhlYWRlcgorCShfZGJ1c19wYWNrX2ludDMyKTogdXNjb3JlLXByZWZpeAorCShfZGJ1c191bnBhY2tfaW50MzIpOiB1c2NvcmUtcHJlZml4CisJKF9kYnVzX3VucGFja191aW50MzIpOiBleHBvcnQKKwkoX2RidXNfZGVtYXJzaGFsX3N0cmluZyk6IGFkZCBAdG9kbyBjb21wbGFpbmluZyBhYm91dCB1c2Ugb2YKKwltZW1jcHkoKQorCShfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKTogYWRkIEB0b2RvIGFib3V0IGJhZCBlcnJvcgorCWhhbmRsaW5nIGFsbG93aW5nIGNvcnJ1cHQgZGF0YSB0byBnbyB1bmNoZWNrZWQKKworMjAwMy0wMS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6IGFkZCByZWFkL3dyaXRlCisJdG8gdGhlIHNlbGVjdCgpIGFzIG5lZWRlZCBmb3IgYXV0aGVudGljYXRpb24uIChzaG91bGQgYmUgdXNpbmcKKwlfZGJ1c19wb2xsKCkgbm90IHNlbGVjdCwgYnV0IGZvciBhbm90aGVyIGRheSkKKworCSogZGJ1cy9kYnVzLmg6IGluY2x1ZGUgZGJ1cy9kYnVzLXByb3RvY29sLmgKKworMjAwMy0wMS0wOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKGRidXNpbmNsdWRlX0hFQURFUlMpOiBJbnN0YWxsCisJZGJ1cy1jb25uZWN0aW9uLmgKKworMjAwMy0wMS0wOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogKF9kYnVzX3R5cGVfdG9fc3RyaW5nKToKKwlOZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYSB0eXBlLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfZGVtYXJzaGFsX2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlBZGQgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgYXBwZW5kaW5nIGFuZCBnZXR0aW5nIG1lc3NhZ2UgZmllbGRzLgorCUFsc28gYWRkIGRlbWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIGJ5dGUgYXJyYXlzLgorCisyMDAzLTAxLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KSwKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsKSwKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAodW5wYWNrX3VpbnQzMiksIChkYnVzX3VucGFja19pbnQzMiksCisJKGRidXNfcGFja19pbnQzMiksIChfZGJ1c19tYXJzaGFsX2RvdWJsZSksIChfZGJ1c19tYXJzaGFsX2ludDMyKSwKKwkoX2RidXNfbWFyc2hhbF91aW50MzIpLCAoX2RidXNfZGVtYXJzaGFsX2RvdWJsZSksCisJKF9kYnVzX2RlbWFyc2hhbF9pbnQzMiksIChfZGJ1c19kZW1hcnNoYWxfdWludDMyKSwKKwkoX2RidXNfZGVtYXJzaGFsX3N0cmluZyksIChfZGJ1c19tYXJzaGFsX2dldF9maWVsZF9lbmRfcG9zKSwKKwkoX2RidXNfdmVyYm9zZV9ieXRlcyksIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoX2RidXNfbWVzc2FnZV9zZXRfY2xpZW50X3NlcmlhbCksCisJKGRidXNfbWVzc2FnZV93cml0ZV9oZWFkZXIpLCAoX2RidXNfbWVzc2FnZV9sb2NrKSwKKwkoZGJ1c19tZXNzYWdlX25ldyksIChkYnVzX21lc3NhZ2VfcmVmKSwgKGRidXNfbWVzc2FnZV91bnJlZiksCisJKGRidXNfbWVzc2FnZV9nZXRfbmFtZSksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzIpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGUpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZyksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkc19pdGVyKSwgKGRidXNfbWVzc2FnZV9pdGVyX3JlZiksCisJKGRidXNfbWVzc2FnZV9pdGVyX3VucmVmKSwgKGRidXNfbWVzc2FnZV9pdGVyX2hhc19uZXh0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZmllbGRfdHlwZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmcpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3VpbnQzMiksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlKSwKKwkoZGVjb2RlX2hlYWRlcl9kYXRhKSwgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIpLAorCShtZXNzYWdlX2l0ZXJfdGVzdCksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZGJ1cy9kYnVzLXRlc3QuYzogKG1haW4pOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwkqIHRlc3QvZWNoby1jbGllbnQuYzogKG1haW4pOgorCSogdGVzdC93YXRjaC5jOiAoY2hlY2tfbWVzc2FnZXMpOgorCU1ha2UgbWVzc2FnZXMgc2VuZGFibGUgYW5kIHJlY2VpdmFibGUgZm9yIHJlYWwuCisKKzIwMDMtMDEtMDcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9kb3VibGUpLAorCShfZGJ1c19tYXJzaGFsX3N0cmluZyksIChfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfaW50MzIpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2RvdWJsZSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfYnl0ZV9hcnJheSk6CisJSGFuZGxlIE9PTSByZXN0b3JhdGlvbi4KKworMjAwMy0wMS0wNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3N0cmluZyksCisJKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9uYW1lKSwKKwlEb2N1bWVudCB0aGVzZSBmdW5jdGlvbnMuCisKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMiksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZG91YmxlKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9ieXRlX2FycmF5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIG1lc3NhZ2UgZmllbGRzIG9mIGRpZmZlcmVudCB0eXBlcy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIHRoZSBkaWZmZXJlbnQgdHlwZXMuCisKKzIwMDMtMDEtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGltcGxlbWVudCByb3V0aW5lcyBmb3IgaGFuZGxpbmcgY29ubmVjdGlvbnMsCisJZmlyc3QgdGhpbmcgaXMga2VlcGluZyBhIGxpc3Qgb2Ygb3duZWQgc2VydmljZXMgb24gZWFjaCBjb25uZWN0aW9uCisJYW5kIHNldHRpbmcgdXAgd2F0Y2hlcyBldGMuCisKKwkqIGJ1cy9zZXJ2aWNlcy5jOiBpbXBsZW1lbnQgYSBtYXBwaW5nIGZyb20gc2VydmljZSBuYW1lcyB0byBsaXN0cworCW9mIGNvbm5lY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IGFkZCBEQlVTX0hBU0hfUE9JTlRFUgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChkYnVzX3N0YXRpY19tdXRleF9sb2NrKTogYWRkIGZ1bmN0aW9ucworCXRvIHVzZSBzdGF0aWMgbXV0ZXhlcyBmb3IgZ2xvYmFsIGRhdGEKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKTogYWRkIG5ldworCWNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHRvIHNldC9nZXQgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YQorCW9uIHRoZSBEQnVzQ29ubmVjdGlvbi4KKworMjAwMy0wMS0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3BvbGwpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19TVFJVQ1RfT0ZGU0VUKTogbmV3IG1hY3JvCisJY29waWVkIGZyb20gR0xpYgorCisJKiBidXMvbG9vcC5jOiBpbml0aWFsIGNvZGUgZm9yIHRoZSBkYWVtb24gbWFpbiBsb29wCisKKzIwMDMtMDEtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3Qvd2F0Y2guYyAoZXJyb3JfaGFuZGxlcik6IG1ha2UgaXQgc2FmZSBpZiB0aGUgZXJyb3IgaGFuZGxlcgorCWlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAoaWYgd2Ugcy9lcnJvciBoYW5kbGVyL2Rpc2Nvbm5lY3QKKwloYW5kbGVyLyB3ZSBzaG91bGQganVzdCBndWFyYW50ZWUgaXQncyBjYWxsZWQgb25seSBvbmNlKQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KTogY2FsbCB0aGUKKwllcnJvciBoYW5kbGVyIG9uIGRpc2Nvbm5lY3QgKGl0J3MgcXVpdGUgcG9zc2libGUgd2Ugc2hvdWxkCisJanVzdCBjaGFuZ2UgdGhlIGVycm9yIGhhbmRsZXIgdG8gYSAiZGlzY29ubmVjdCBoYW5kbGVyLCIgSSdtCisJbm90IHN1cmUgd2UgaGF2ZSBhbnkgb3RoZXIgbWVhbmluZ2Z1bCBlcnJvcnMpCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIGdldHB3bmFtX3IKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jLCBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYywKKwlkYnVzL2RidXMtYXV0aC5jOiBhZGQgY3JlZGVudGlhbHMgc3VwcG9ydCwgYWRkIEVYVEVSTkFMIGF1dGgKKwltZWNoYW5pc20gYXMgaW4gU0FTTCBzcGVjLCB1c2luZyBzb2NrZXQgY3JlZGVudGlhbHMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2FjY2VwdF91bml4X3NvY2tldCk6IHJlbmFtZSBqdXN0CisJZGJ1c19hY2NlcHQoKQorCShfZGJ1c193cml0ZSk6IG9ubHkgY2hlY2sgZXJybm8gaWYgPDAgcmV0dXJuZWQKKwkoX2RidXNfd3JpdGVfdHdvKTogZGl0dG8KKworMjAwMy0wMS0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3V0Zjhfc3RyaW5nKSwKKwkoX2RidXNfbWFyc2hhbF9ieXRlX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF91dGY4X3N0cmluZyksCisJKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCUFkZCBfZGJ1c19tYXJzaGFsX2J5dGVfYXJyYXkgYW5kIHJlbmFtZSBfZGJ1c19tYXJzaGFsX3N0cmluZworCXRvIF9kYnVzX21hcnNoYWxfdXRmOF9zdHJpbmcuIEFsc28gZml4IHNvbWUgdGVzdHMuCisKKzIwMDItMTItMjggIEhhcnJpIFBvcnRlbiAgPHBvcnRlbkBrZGUub3JnPgorCisJKiBjb25maWd1cmUuaW46IGFkZGVkIGNoZWNrIGZvciBDKysgY29tcGlsZXIgYW5kIGEgdmVyeSBjaGVlc3kKKwljaGVjayBmb3IgdGhlIFF0IGludGVncmF0aW9uCisKKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogY29tcGlsZSBxdCBzdWJkaXIgaWYgc3VwcG9ydCBpcyBlbmFibGVkCisKKwkqIHF0L01ha2VmaWxlLmFtOiBhZGRlZAorCisJKiBxdC8uY3ZzaWdub3JlOiBhZGRlZAorCisJKiBxdC9kYnVzLXF0aHJlYWQuY2MsIHF0L2RidXMtcXRocmVhZC5jcHA6IHJlbmFtZWQgZm9ybWVyIHRvCisJbGF0dGVyLCBhZGRlZCAjaWZkZWYgUVRfVEhSRUFEX1NVUFBPUlQgZ3VhcmQuCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IGFkZGVkIG1pc3NpbmcgaGVhZGVycyBmb3IgbWFrZSBkaXN0CisKKzIwMDItMTItMjggIEtyaXN0aWFuIFJpZXR2ZWxkICA8a3Jpc0BndGsub3JnPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiBmaXh1cCBleHBvcnQtc3ltYm9scy1yZWdleC4KKworMjAwMi0xMi0yNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGFjaW5jbHVkZS5tNDogQWRkIHRoaXMgZmlsZSBhbmQgcHV0IHRoZQorCVBLR19DSEVDS19NT0RVTEUgbWFjcm8gaW4gaXQuCisKKzIwMDItMTItMjcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlKSwgKF9kYnVzX2RlbWFyc2hhbF9pbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF91aW50MzIpLCAoX2RidXNfZGVtYXJzaGFsX3N0cmluZyksCisJKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJTWFrZSB0aGUgZGVtYXJzaGFsbGluZyByb3V0aW5lcyBhbGlnbiB0aGUgcG9zIGFyZ3VtZW50LgorCUFkZCBzdHJpbmcgbWFyc2hhbGxpbmcgdGVzdHMgYW5kIGZpeCB0aGUgb2J2aW91cyBidWdzCisJZGlzY292ZXJlZC4KKworMjAwMi0xMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogZml4ZXMgZml4ZXMgZml4ZXMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IHdpcmUgdXAgc3VwcG9ydCBmb3IKKwllbmNvZGluZy9kZWNvZGluZyBkYXRhIG9uIHRoZSB3aXJlCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEpCisJKF9kYnVzX2F1dGhfZGVjb2RlX2RhdGEpOiBhcHBlbmQgdG8gdGFyZ2V0IHN0cmluZworCWluc3RlYWQgb2YgbnVraW5nIGl0LgorCisyMDAyLTEyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5oIChEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOiAjaWZkZWYKKwlXT1JEU19CSUdFTkRJQU4gdGhlbiBjb21waWxlciBieXRlIG9yZGVyIGlzIERCVVNfQklHX0VORElBTiwKKwlkb2gKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogQWRkIG1hY3JvcyB0byBkbyBpbnQgc3dhcHBpbmcgaW4tcGxhY2UgYW5kCisJYXZvaWQgc3dhcF9ieXRlcygpIG92ZXJoZWFkIChpZ25vcmluZyBwb3NzaWJsZSBhc3NlbWJseSBzdHVmZiBmb3IKKwlub3cpLiBNYWluIHBvaW50IGlzIGJlY2F1c2UgSSB3YW50ZWQgdW5wYWNrX3VpbnQzMiB0byBpbXBsZW1lbnQKKwlfZGJ1c192ZXJib3NlX2J5dGVzCisJKF9kYnVzX3ZlcmJvc2VfYnl0ZXMpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCk6IGFkZAorCW1lY2hhbmlzbSB0byBoYW5kbGUgYSBjb3JydXB0IG1lc3NhZ2Ugc3RyZWFtCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyk6IGZpeCBwcmVhbGxvY2F0aW9uIHRvIG9ubHkgcHJlYWxsb2MsCisJbm90IHByZWxlbmd0aGVuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3NraXBfYmxhbmspOiBmaXggdGhpcyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfdGVzdCk6IGVuaGFuY2UgdGVzdHMgZm9yIGNvcHkvbW92ZSBhbmQgZml4IHRoZQorCWZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogSG9sZCByZWZlcmVuY2VzIGluIG1vcmUgcGxhY2VzIHRvCisJYXZvaWQgcmVlbnRyYW5jeSBwcm9ibGVtcworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IGRpdHRvCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9tZXNzYWdlKTogZG9uJ3QKKwlsZWFrIHJlZmVyZW5jZSBjb3VudCBpbiBuby1tZXNzYWdlIGNhc2UKKworCSogdGVzdC93YXRjaC5jIChkb19tYWlubG9vcCk6IGhhbmRsZSBhZGRpbmcvcmVtb3Zpbmcgd2F0Y2hlcworCWR1cmluZyBpdGVyYXRpb24gb3ZlciB0aGUgd2F0Y2hlcy4gQWxzbywgcmVmIHRoZSBjb25uZWN0aW9uL3NlcnZlcgorCXN0b3JlZCBvbiBhIHdhdGNoLCBzbyB3ZSBkb24ndCB0cnkgdG8gbWFuZ2xlIGEgZGVzdHJveWVkIG9uZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGRvX2F1dGhlbnRpY2F0aW9uKTogcGVyZm9ybQorCWF1dGhlbnRpY2F0aW9uCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGdldF9zdGF0ZSk6IGFkZCBhIHN0YXRlCisJQVVUSEVOVElDQVRFRF9XSVRIX1VOVVNFRF9CWVRFUyBhbmQgcmV0dXJuIGl0IGlmIHJlcXVpcmVkCisJKF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyk6IGFwcGVuZCB0aGUgdW51c2VkIGJ5dGVzCisJdG8gdGhlIHBhc3NlZCBpbiBzdHJpbmcsIHJhdGhlciB0aGFuIHByZXBlbmQKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlKTogY3JlYXRlCisJdGhlIGF1dGggY29udmVyc2F0aW9uIERCdXNBdXRoCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9mZCkKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCk6IHdoZW4gY3JlYXRpbmcgYQorCXRyYW5zcG9ydCwgcGFzcyBpbiB3aGV0aGVyIGl0J3MgYSBjbGllbnQtc2lkZSBvciBzZXJ2ZXItc2lkZQorCXRyYW5zcG9ydCBzbyB3ZSBrbm93IHdoaWNoIERCdXNBdXRoIHRvIGNyZWF0ZQorCisyMDAyLTEyLTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9maW5hbGl6ZSk6IGZpbmFsaXplIGJhc2UKKwlfYWZ0ZXJfIGZpbmFsaXppbmcgdGhlIGRlcml2ZWQgbWVtYmVycworCSh1bml4X2Nvbm5lY3Rpb25fc2V0KTogdW5yZWYgd2F0Y2ggaWYgd2UgZmFpbCB0byBhZGQgaXQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3VucmVmKTogZGVsZXRlIHRoZQorCXRyYW5zcG9ydCBmaXJzdCwgc28gdGhhdCB0aGUgY29ubmVjdGlvbiBvd25lZCBieSB0aGUKKwl0cmFuc3BvcnQgd2lsbCBiZSB2YWxpZCBhcyB0aGUgdHJhbnNwb3J0IGZpbmFsaXplcy4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZmluYWxpemUpOiBmcmVlIHRoZSB3cml0ZV93YXRjaAorCWlmIG5lY2Vzc2FyeSwgYW5kIHJlbW92ZSB3YXRjaGVzIGZyb20gdGhlIGNvbm5lY3Rpb24uCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChfZGJ1c193YXRjaF9saXN0X2ZyZWUpOiBpbXByb3ZlIGEgY29tbWVudAorCisyMDAyLTEyLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfc3RyaW5nKSwKKwkoX2RidXNfZGVtYXJzaGFsX2RvdWJsZSksIChfZGJ1c19kZW1hcnNoYWxfaW50MzIpLAorCShfZGJ1c19kZW1hcnNoYWxfdWludDMyKSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwlBZGQgc3RyaW5nIG1hcnNoYWwgZnVuY3Rpb25zIGFuZCBoYXZlIHRoZSBkZW1hcnNoYWwgZnVuY3Rpb25zCisJcmV0dXJuIHRoZSBuZXcgcG9zaXRpb24uCisKKzIwMDItMTItMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNhc2wtcHJvZmlsZS50eHQ6IGRvY3Mgb24gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLAorCWl0IGlzIGEgc2ltcGxlIHByb3RvY29sIHRoYXQganVzdCBtYXBzIGRpcmVjdGx5IHRvIFNBU0wuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmgsIGRidXMvZGJ1cy1hdXRoLmM6IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sCisJaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgbm90IGFjdHVhbGx5IHVzZWQgeWV0LgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19maW5kKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3N0cmluZ19lcXVhbCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2RlY29kZSk6IG5ldyBmdW5jdGlvbgorCisyMDAyLTEyLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChzd2FwX2J5dGVzKSwgKF9kYnVzX21hcnNoYWxfZG91YmxlKSwKKwkoX2RidXNfbWFyc2hhbF9pbnQzMiksIChfZGJ1c19tYXJzaGFsX3VpbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF9kb3VibGUpLCAoX2RidXNfZGVtYXJzaGFsX2ludDMyKSwKKwkoX2RidXNfZGVtYXJzaGFsX3VpbnQzMiksIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCSogZGJ1cy9kYnVzLXRlc3QuYzogKG1haW4pOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwlBZGQgdW4tb3B0aW1pemVkIG1hcnNoYWxsaW5nL2RlbWFyc2hhbGxpbmcgcm91dGluZXMuCisKKzIwMDItMTItMjUgIEhhcnJpIFBvcnRlbiAgPHBvcnRlbkBrZGUub3JnPgorCisJKiBxdC9kYnVzLXF0Lmg6IGFkanVzdGVkIGN0b3IgYW5kIGdldHRlciB0byBLREUvUXQgY29udmVudGlvbnMKKworMjAwMi0xMi0yNCAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvZGJ1cy1xdGhyZWFkLmNjOiBhZGRpbmcgLSBpbnRlZ3JhdGVzIFFNdXRleCBpbnRvIERidXMKKwkqIHF0L2RidXMtcXQuaDogc2tlbGV0b24gd2l0aCB0d28gc2FtcGxlIGltcGxlbWVuYXRhdGlvbiBvZiB0aGUKKwltYWluIGxvb3Agc3R1ZmYKKworMjAwMi0xMi0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWd0aHJlYWQuYzogZml4IGluY2x1ZGUKKworCSogZ2xpYi9kYnVzLWdsaWIuaDogcmVuYW1lIERCdXNNZXNzYWdlSGFuZGxlciBmb3Igbm93LgorCUkgdGhpbmsgZ2xpYiBBUEkgbmVlZHMgdG8gY2hhbmdlLCB0aG91Z2gsIGFzIHlvdSBkb24ndAorCXdhbnQgdG8gdXNlIERCdXNNZXNzYWdlRnVuY3Rpb24sIHlvdSB3YW50IHRvIHVzZSB0aGUKKwlEQnVzTWVzc2FnZUhhbmRsZXIgb2JqZWN0LiBQcm9iYWJseQorCWRidXNfY29ubmVjdGlvbl9vcGVuX3dpdGhfZ19tYWluX2xvb3AoKQorCWFuZCBkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfZ19tYWluX2xvb3AoKSBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisJKGJ1dCB0aGluayBvZiBiZXR0ZXIgbmFtZXMuLi4pIHRoYXQganVzdCBjcmVhdGUgYSBjb25uZWN0aW9uCisJdGhhdCBoYXMgd2F0Y2gvdGltZW91dCBmdW5jdGlvbnMgZXRjLiBhbHJlYWR5IHNldCB1cC4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHkpOiBuZXcgZnVuY3Rpb24ganVzdCB0bworCXNob3cgaG93IHRoZSBtZXNzYWdlIGhhbmRsZXIgaGVscHMgdXMgZGVhbCB3aXRoIHJlcGxpZXMuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdGVzdCk6IGZyZWUgYSBzdHJpbmcgdGhhdAorCXdhc24ndAorCisJKiBkYnVzL2RidXMtaGFzaC5jOiB1c2UgbWVtb3J5IHBvb2xzIGZvciB0aGUgaGFzaCBlbnRyaWVzCisJKHJlYnVpbGRfdGFibGUpOiBiZSBtb3JlIHBhcmFub2lkIGFib3V0IG92ZXJmbG93LCBhbmQKKwlzaHJpbmsgdGFibGUgd2hlbiB3ZSBjYW4KKwkoX2RidXNfaGFzaF90ZXN0KTogcmVkdWNlIG51bWJlciBvZiBzcHJpbnRmcyBhbmQgd3JpdGUKKwl2YWxpZCBDODkuIEFkZCB0ZXN0cyBmb3IgY2FzZSB3aGVyZSB3ZSBncm93IGFuZCB0aGVuCisJc2hyaW5rIHRoZSBoYXNoIHRhYmxlLgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5oLCBkYnVzL2RidXMtbWVtcG9vbC5jOiBtZW1vcnkgcG9vbHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2hhbmRsZXIpCisJKGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX2hhbmRsZXIpOiBuZXcgZnVuY3Rpb25zCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfbmFtZSk6IG5ldworCisJKiBkYnVzL2RidXMtbGlzdC5jOiBmaXggZG9jcyB0eXBvCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuaCwgZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOgorCWFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBoYW5kbGVyIGZvciBtZXNzYWdlcy4KKworMjAwMi0xMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ3RocmVhZC5jOiAoZGJ1c19ndGhyZWFkX2luaXQpOgorCURvbid0IHVzZSB0aGUgZ2RidXMgcHJlZml4IGZvciBwdWJsaWMgZnVuY3Rpb25zLgorCisyMDAyLTEyLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuaW46CisJQWRkIEdMaWIgY2hlY2tzIGFuZCBmaXh1cCAucGMgZmlsZXMKKworCSogZ2xpYi9NYWtlZmlsZS5hbToKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzogKGdkYnVzX2Nvbm5lY3Rpb25fcHJlcGFyZSksCisJKGdkYnVzX2Nvbm5lY3Rpb25fY2hlY2spLCAoZ2RidXNfY29ubmVjdGlvbl9kaXNwYXRjaCksCisJKGdkYnVzX2FkZF9jb25uZWN0aW9uX3dhdGNoKSwgKGdkYnVzX3JlbW92ZV9jb25uZWN0aW9uX3dhdGNoKSwKKwkoZGJ1c19jb25uZWN0aW9uX2dzb3VyY2VfbmV3KToKKwkqIGdsaWIvZGJ1cy1ndGhyZWFkLmM6IChkYnVzX2dtdXRleF9uZXcpLCAoZGJ1c19nbXV0ZXhfZnJlZSksCisJKGRidXNfZ211dGV4X2xvY2spLCAoZGJ1c19nbXV0ZXhfdW5sb2NrKSwgKGRidXNfZ3RocmVhZF9pbml0KToKKwkqIGdsaWIvdGVzdC1kYnVzLWdsaWIuYzogKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwlBZGQgR0xpYiBzdXBwb3J0LgorCisyMDAyLTEyLTE1ICBIYXJyaSBQb3J0ZW4gIDxwb3J0ZW5Aa2RlLm9yZz4KKworCSogYXV0b2dlbi5zaDogY2hlY2sgZm9yIGxpYnRvb2xpemUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiBpbmNsdWRlIDxzeXMvdGltZS5oPiBmb3IgdGltZXZhbAorCXN0cnVjdC4KKworCSogLmN2c2lnbm9yZTogaWdub3JlIG1vcmUgc3RhbXAgZmlsZXMKKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKF9kYnVzX3dhdGNoX2xpc3RfbmV3KTogZml4ZWQgZG9jIGVycm9yCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06IGFkZGVkIC1JJCh0b3Bfc3JjZGlyKSB0byBiZSBhYmxlIHRvIGNvbXBpbGUKKwl3aXRob3V0IG1ha2UgaW5zdGFsbC4KKworMjAwMi0xMi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogYWRkIHRocmVhZCBzdHVicyB0aGF0IGEgaGlnaGVyIGxpYnJhcnkKKwlsYXllciBjYW4gZmlsbCBpbi4gZS5nLiB0aGUgR0xpYiB3cmFwcGVyIG1pZ2h0IGZpbGwgdGhlbSBpbiB3aXRoCisJR1RocmVhZCBzdHVmZi4gV2Ugc3RpbGwgbmVlZCB0byB1c2UgdGhpcyB0aHJlYWQgQVBJIHRvCisJdGhyZWFkLXNhZmUtaXplIHRoZSBsaWJyYXJ5LgorCisyMDAyLTEyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYywgZGJ1cy9kYnVzLXNlcnZlci11bml4LmM6IHVzZSB0aGUKKwliZWxvdyBuZXcgaW50ZXJmYWNlcyBhbmQgaW5jbHVkZSBmZXdlciBzeXN0ZW0gaGVhZGVycy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c193cml0ZSk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c193cml0ZV90d28pOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfY29ubmVjdF91bml4X3NvY2tldCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaDogY2hhbmdlIGludGVyZmFjZXMgdG8gdXNlCisJREJ1c1N0cmluZworCisyMDAyLTEyLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogYWRkIGRidXNfdW5pY2hhcgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2UpOiB1c2UgX2RidXNfZ2V0ZW52CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2UpOiByZXR1cm4KKwlUUlVFIG9uIHN1Y2Nlc3MKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiBpbmNsdWRlIGRidXMtd2F0Y2guaAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBpbmNsdWRlIGRidXMtbWVzc2FnZS1pbnRlcm5hbC5oCisKKwkqIEhBQ0tJTkc6IGFkZCBmaWxlIHdpdGggY29kaW5nIGd1aWRlbGluZXMgc3R1ZmYuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaCwgZGJ1cy9kYnVzLXN0cmluZy5jOiBFbmNhcHN1bGF0ZSBhbGwgc3RyaW5nCisJaGFuZGxpbmcgaGVyZSwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIChhcyBpbiB2c2Z0cGQpLiBOb3QgYWN0dWFsbHkKKwl1c2luZyB0aGlzIGNsYXNzIHlldC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy9kYnVzLXN5c2RlcHMuYzogRW5jYXBzdWxhdGUgYWxsCisJc3lzdGVtL2xpYmMgdXNhZ2UgaGVyZSwgYXMgaW4gdnNmdHBkLCBmb3IgZWFzZSBvZiBhdWRpdGluZyAoYW5kCisJc2hvdWxkIGFsc28gc2ltcGxpZnkgcG9ydGFiaWxpdHkpLiBIYXZlbid0IGFjdHVhbGx5IG1vdmVkIGFsbCB0aGUKKwlzeXN0ZW0vbGliYyB1c2FnZSBpbnRvIGhlcmUgeWV0LgorCisyMDAyLTExLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2UpOiBmaXggdG8gbm90CisJYWx3YXlzIHByaW50IHRoZSBmaXJzdCB2ZXJib3NlIG1lc3NhZ2UuCisKKzIwMDItMTEtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgKiB0ZXN0L2VjaG8tY2xpZW50LmMsIHRlc3QvZWNoby1zZXJ2ZXIuYzogY2hlZXN5IHRlc3QKKwljbGllbnRzLgorCisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0ZVTkNTKTogY2hlY2sgZm9yIHdyaXRldgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEpOiBuZXcKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X2ZvcmVhY2gpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYywgZGJ1cy9kYnVzLXNlcnZlci5oOiBwdWJsaWMgb2JqZWN0CisJcmVwcmVzZW50aW5nIGEgc2VydmVyIHRoYXQgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMuCisKKwkqIGRidXMvLmN2c2lnbm9yZTogY3JlYXRlCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCwgZGJ1cy9kYnVzLWVycm9ycy5jOgorCXB1YmxpYyBBUEkgZm9yIHJlcG9ydGluZyBlcnJvcnMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCwgZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwlwdWJsaWMgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbm5lY3Rpb24gdGhhdAorCXNlbmRzL3JlY2VpdmVzIG1lc3NhZ2VzLiAoU2FtZSBvYmplY3QgdXNlZCBmb3IKKwlib3RoIGNsaWVudCBhbmQgc2VydmVyLikKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5oLCBkYnVzL2RidXMtdHJhbnNwb3J0LmM6CisJQmFzaWMgYWJzdHJhY3Rpb24gZm9yIGRpZmZlcmVudCBraW5kcyBvZiBzdHJlYW0KKwl0aGF0IHdlIG1pZ2h0IHJlYWQvd3JpdGUgbWVzc2FnZXMgZnJvbS4KKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19JTlRfTUFYKTogYWRkIF9EQlVTX0lOVF9NSU4KKwlfREJVU19JTlRfTUFYCisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKG1haW4pOiBhZGQgbGlzdCB0ZXN0LCBhbmQgaW5jbHVkZQorCWRidXMtdGVzdC5oIGFzIGludGVuZGVkCisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZykKKwkoX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50KTogcmV0dXJuIHZhbHVlIGluZGljYXRlcworCXdoZXRoZXIgdGhlIGVudHJ5IGV4aXN0ZWQgdG8gcmVtb3ZlCisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IGFkZCBsaW5rZWQgbGlzdCB1dGlsaXR5IGNsYXNzLAorCXdpdGggZG9jcyBhbmQgdGVzdHMKKworCSogZGJ1cy9kYnVzLWhhc2guYzogYWRkIFRPRE8gaXRlbSBhYm91dCBzaHJpbmtpbmcgdGhlIGhhc2ggYnVja2V0CisJYXJyYXkgc29tZXRpbWVzLgorCisyMDAyLTExLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBEb3h5ZmlsZS5pbiAoSU5DTFVERV9GSUxFX1BBVFRFUk5TKTogZXhwYW5kIERCVVNfQkVHSU5fREVDTFMvCisJREJVU19FTkRfREVDTFMgdG8gbm90aGluZywgdGhhdCBzaG91bGQgZml4IHRoaXMgb25jZSBhbmQgZm9yIGFsbAorCisJKiBEb3h5ZmlsZS5pbiAoSkFWQURPQ19BVVRPQlJJRUYpOiBzZXQgdG8gWUVTCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMsIGRidXMvZGJ1cy1oYXNoLmM6CisJYWRkIHNvbWUgbWlzc2luZyBAYnJpZWYKKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogcHV0IHNlbWljb2xvbnMgYWZ0ZXIgREVCVUdfQkVHSU5fREVDTFMKKwl0byBhdm9pZCBjb25mdXNpbmcgRG94eWdlbgorCisJKiBkYnVzL2RidXMtaGFzaC5jOiBAfSBub3QgfUAKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoc3RydWN0IERCdXNNZXNzYWdlKTogc3BsaXQgb3V0CisJaW50ZXJuYWxzIGRvY3MKKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBwaWxlIG9uIG1vcmUgd2FybmluZyBmbGFncyBpZiB1c2luZyBnY2MKKworCSogRG94eWZpbGUuaW4gKEVYVFJBQ1RfU1RBVElDKTogc2V0IHRvIE5PLCBzbyB3ZSBkb24ndCBoYXZlCisJdG8gZG9jdW1lbnQgc3RhdGljIGZ1bmN0aW9ucworCisJKiBjb25maWd1cmUuaW46IGFkZCBzdW1tYXJ5IHRvIGVuZCBvZiBjb25maWd1cmUgc28gaXQKKwlsb29rcyBuaWNlIGFuZCBhdHRyYWN0aXZlCisKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IGZpbmlzaCBpbXBsZW1lbnRhdGlvbiBhbmQgd3JpdGUgdW5pdAorCXRlc3RzIGFuZCBkb2NzCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC0tZW5hYmxlLXRlc3RzIHRvIGVuYWJsZSB1bml0IHRlc3RzCisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IHRlc3QgcHJvZ3JhbSB0byBydW4gdW5pdCB0ZXN0cworCWZvciBhbGwgZmlsZXMgaW4gZGJ1cy8qLCBpbml0aWFsbHkgcnVucyBhIHRlc3QgZm9yCisJZGJ1cy1oYXNoLmMKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBmaWxlIHRvIGhvbGQgc29tZSBpbnRlcm5hbCB1dGlsaXR5IHN0dWZmCisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaGFzaC5jOiBjb3B5IGluIFRjbCBoYXNoIHRhYmxlLCBub3QgeWV0CisJInBvcnRlZCIgYXdheSBmcm9tIFRjbAorCisJKiBkYnVzL2RidXMtdHlwZXMuaDogaGVhZGVyIGZvciB0eXBlcyBzdWNoIGFzIGRidXNfYm9vbF90CisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMuaDogZml4dXBzIGZvciBkb2Mgd2FybmluZ3MKKworCSogRG94eWZpbGUuaW4gKEZJTEVfUEFUVEVSTlMpOiB3ZSBuZWVkIHRvIHNjYW4gLmggdG8gcGljayB1cAorCW1hY3JvcworCShRVUlFVCk6IG1ha2UgaXQgcXVpZXQgc28gd2UgY2FuIHNlZSB3YXJuaW5ncworCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IHRlYWNoIEQtQlVTIHRvIGFsbG9jYXRlIGFuZCBmcmVlIG1lbW9yeQorCisyMDAyLTExLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IGluY2x1ZGUgIkRveHlmaWxlIiB0YXJnZXQgaW4gYWxsLWxvY2FsCisKKwkqIGNvbmZpZ3VyZS5pbjogZ2VuZXJhdGUgdGhlIERveHlmaWxlCisKKwkqIERveHlmaWxlLmluOiBtb3ZlIERveHlmaWxlIGhlcmUsIHNvIHdlIGNhbiB1c2UKKwljb25maWd1cmUgdG8gZ2VuZXJhdGUgYSBEb3h5ZmlsZSB3aXRoIHRoZSByaWdodAorCXZlcnNpb24gbnVtYmVyIGV0Yy4KKworMjAwMi0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IG1vdmUgaW5saW5lIGRvY3MgaW50byAuYyBmaWxlCisKKwkqIERveHlmaWxlIChPVVRQVVRfRElSRUNUT1JZKTogbW92ZSBvdXRwdXQgdG8gZG9jL2FwaQorCXNvIGFsbCBkb2NzIGFyZSB1bmRlciBkb2MvCisJKE1BTl9FWFRFTlNJT04pOiBnZW5lcmF0ZSBtYW4gcGFnZXMuIFVzZSBleHRlbnNpb24KKwkiLjNkYnVzIiB3aGljaCBtYXRjaGVzICIuM3F0IiBvbiBteSBzeXN0ZW0sCisJSSBndWVzcyB0aGlzIGlzIE9LLCBJIGRvbid0IGtub3cgcmVhbGx5LgorCShGSUxFX1BBVFRFUk5TKTogbG9vayBmb3IgLmMgZmlsZXMgbm90IC5oLCBtYWtlcyBzZW5zZQorCWZvciBwbGFpbiBDIEkgdGhpbmsKKworMjAwMi0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiByZW5hbWUgc3ViZGlyICJzZXJ2ZXIiIHRvICJidXMiCisJYmVjYXVzZSBhbnkgYXBwIGNhbiBiZSBhIHNlcnZlciwgYW5kIGFueSBhcHAgY2FuIGJlIGEgY2xpZW50LAorCXRoZSBidXMgaXMgYSBzcGVjaWFsIGtpbmQgb2Ygc2VydmVyLgorCitUaHUgTm92IDIxIDIzOjM1OjMxIDIwMDIgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIERveHlmaWxlIDogYWRkaW5nLiBTdGlsbCBuZWVkcyBNYWtlZmlsZSBydWxlcyB0byBiZSBnZW5lcmF0ZWQKKwlhdXRvbWF0aWNhbGx5IChqdXN0IHJ1biAiZG94eWdlbiIgaW4gdGhlIHRvcGxldmVsIGRpciBmb3Igbm93IHRvCisJZ2VuZXJhdGUgZG9jcykKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaCA6IEFkZGluZyBzYW1wbGUgZG9jcyAoamF2YWRvYyBzaW5jZQorCXJlc2VtYmxlcyBndGstZG9jIGEgbGl0dGxlIG1vcmUpCisKKwkqIGRidXMvZGJ1cy5oIDogQWRkaW5nIHNhbXBsZSBkb2NzCisKKzIwMDItMTEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChJTkNMVURFUyk6IGRlZmluZSBEQlVTX0NPTVBJTEFUSU9OCisJc28gd2UgY2FuIGFsbG93IG91cnNlbHZlcyB0byBpbmNsdWRlIGZpbGVzIGRpcmVjdGx5LAorCWluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSBkYnVzLmgKKworCSogZGJ1cy9kYnVzLmg6IGZpbGwgaW4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogc2tldGNoIG91dCBhIHNhbXBsZSBoZWFkZXIgZmlsZS4KKwlJbmNsdWRlIGdyaXBpbmcgaWYgeW91IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZgorCXZpYSBkYnVzLmgKKworCSogZGJ1cy9kYnVzLW1hY3Jvcy5oOiBuZXcgZmlsZSB3aXRoIG1hY3JvcyBmb3IgZXh0ZXJuICJDIiwKKwlUUlVFL0ZBTFNFLCBOVUxMLCBldGMuCisKKwkqIGRvYy9maWxlLWJvaWxlcnBsYXRlLmM6IHB1dCBpbmNsdWRlIGd1YXJkcyBpbiBoZXJlCisKKzIwMDItMTEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZmlsZS1ib2lsZXJwbGF0ZS5jOiBpbmNsdWRlIGJvdGggQUZMIGFuZCBHUEwgYm9pbGVycGxhdGUuCisKKwkqIENPUFlJTkc6IGluY2x1ZGUgdGhlIEdQTCBhcyB3ZWxsLCBhbmQgbGljZW5zZSBjb2RlCisJdW5kZXIgYm90aCBBRkwgYW5kIEdQTC4KKworMjAwMi0xMS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGFjY29uZmlnLmg6IGdldCByaWQgb2YgdGhpcworCisJKiBhdXRvZ2VuLnNoIChydW5fY29uZmlndXJlKTogYWRkIC0tbm8tY29uZmlndXJlIG9wdGlvbgorCisJKiBjb25maWd1cmUuaW46IHJlbW92ZSBBQ19BUkdfUFJPR1JBTSB0byBtYWtlCisJYXV0b2NvbmYgY29tcGxhaW4gbGVzcy4gYWRkIEFDX1BSRVJFUS4KKwlhZGQgQUNfREVGSU5FIHRoaXJkIGFyZy4KKworMjAwMi0xMS0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9NYWtlZmlsZS5hbToKKwlGaXggcmVmZXJlbmNlcyBzbyB3ZSBjYW4gZGlzdGNoZWNrLgorCisyMDAyLTExLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogSW5pdGlhbCBtb2R1bGUgY3JlYXRpb24KKwpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nLnByZS0xLTIgYi9DaGFuZ2VMb2cucHJlLTEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nLnByZS0xLTIKQEAgLTAsMCArMSwyMDI3IEBACisyMDA4LTA0LTA0ICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMi4xCisKKzIwMDgtMDQtMDMgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gU3VtaXQgPHN1bWl0c2tqXzIwQHlhaG9vLmNvbT4sIGNvbW1lbnRzIGFkZGVkCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyhfZGJ1c190cmFuc3BvcnRfb3Blbik6IGZpeCBtZW0gbGVhaworCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kKTogYWRkIGRvY3VtZW50YXRpb24KKwkgIHRvIGRlc2NyaWJlIHdoZW4gdG8gY2FsbCBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggYW5kCisJICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgYWZ0ZXIgYSBjYWxsIHRvIGRidXNfY29ubmVjdGlvbl9zZW5kIGlzIG1hZGUKKwkgIEluaXRpYWwgd29yZGluZyBieSBTdGFuaXNsYXYgQnJhYmVjIDxzYnJhYmVjIGF0IHN1c2UuY3o+IAorCSAgKGZkLm8gYnVnIzEzNTU4KQorCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vLmhhbWFsYWluZW4gYXQgbm9raWEuY29tPgorCisJKiBidXMvZXhwaXJlbGlzdC5jCisJICAoZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSk6IGNhbGN1bGF0ZSBjb3JyZWN0IG1pbiB3YWl0IHRpbWUKKwkgIGFuZCBuZXh0IGludGVydmFsCisJICAoYnVzX2V4cGlyZV9saXN0X2FkZCwgYnVzX2V4cGlyZV9saXN0X2FkZF9saW5rKTogaWYgdGhlIHRpbWVvdXQgaXMgCisJICBkaXNhYmxlZCB3aGVuIHdlIGFkZCBhbiBpdGVtIHRvIHRoZSBleHBpcmUgbGlzdCwgZW5hYmxlIHRoZSB0aW1lb3V0CisJICAoZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSk6IG9ubHkgc2V0IHRpbWVvdXQgaWYgdGhlcmUgYXJlCisJICBpdGVtcyB0byBleHBpcmUKKworMjAwOC0wNC0wMSAgVGltbyBIb2VuaWcgIDx0aG9lbmlnQHN1c2UuZGU+CisKKwlQYXRjaCBmcm9tIEZyZWRlcmljIENyb3phdCA8ZmNyb3phdEBtYW5kcml2YS5jb20+CisKKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfd2F0Y2hfZGlyZWN0b3J5KTogT25seSBtb25pdG9yCisJICBJTl9DTE9TRV9XUklURSwgSU5fREVMRVRFLCBJTl9NT1ZFX1RPIGFuZCBJTl9NT1ZFX0ZST00gZXZlbnRzLiBUaGlzCisJICB3YXksIG9ubHkgYXRvbWljIGNoYW5nZXMgdG8gY29uZmlndXJhdGlvbiBmaWxlIGFyZSBtb25pdG9yZWQuCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYyAoX2hhbmRsZV9pbm90aWZ5X3dhdGNoKTogRml4IHR5cG8gaW4KKwkgIF9kYnVzX3ZlcmJvc2UgZnVuY3Rpb24gY2FsbAorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKGJ1c19kcm9wX2FsbF9kaXJlY3Rvcnlfd2F0Y2hlcyk6IFVzZQorCSAgX2RidXNfc3RyZXJyb3IgaW5zdGVhZCBvZiBwZXJyb3IKKworMjAwOC0wMy0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMsIGJ1cy9leHBpcmVsaXN0LmM6IE1ha2UgdGhlIEJ1c0V4cGlyZUxpc3QKKwlzdHJ1Y3Qgb3BhcXVlLCBhZGRpbmcgYWNjZXNzb3JzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGxpc3QuIEluIHRoaXMKKwljb21taXQgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSBpbiBmdW5jdGlvbmFsaXR5IG9yIGJlaGF2aW9yLiBUaGUKKwlwdXJwb3NlIG9mIHRoaXMgY2hhbmdlIGlzIHRvIGltcHJvdmUgZW5jYXBzdWxhdGlvbiBwcmlvciB0byBmaXhpbmcKKwlzb21lIGJ1Z3MgS2ltbW8gSMOkbcOkbMOkaW5lbiBmb3VuZCB3aGVyZSB0aGUgdGltZW91dCBpcyBub3QgcHJvcGVybHkKKwl1cGRhdGVkLCBzaW5jZSB3ZSBuZWVkIHRvIGUuZy4gdGFrZSBzb21lIGFjdGlvbiB3aGVuZXZlciBhZGRpbmcKKwlhbmQgcmVtb3Zpbmcgc3R1ZmYgZnJvbSB0aGUgZXhwaXJlIGxpc3QuCisKKzIwMDgtMDMtMzEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIE93ZW4gVGF5bG9yIDxvdGF5bG9yQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXgxMS5jOiBDaGVjayBmb3IgWDExIGV2ZW50cyBiZWZvcmUKKwlzZWxlY3RpbmcgKEZETyBidWcgIzE1MjkzKQorCisyMDA4LTAzLTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggZnJvbSBPd2VuIFRheWxvciA8b3RheWxvckByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYzogTWFrZSBzdXJlIHdlIGNhbGwgWEZsdXNoKCkKKwlvbiBhbGwgY29kZSBwYXRocyAoRkRPIGJ1ZyAjMTUyOTMpCisKKzIwMDgtMDMtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2RpY3QpOiBEbyBub3QgcHJvdmlkZSBhIHNpZ25hdHVyZSB0bworCWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCkgd2hlbiBvcGVuaW5nIGEgZGljdCBlbnRyeS4KKworMjAwOC0wMy0yNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmM6IFNldCBkZWZhdWx0IGV4aXRfb25fZGlzY29ubmVjdCBhZnRlciByZWdpc3RyYXRpb24gd2l0aAorCXRoZSBidXMsIG5vdCBiZWZvcmUuICBUaGlzIGVuc3VyZXMgdGhhdCBwcm9ncmFtcyB3aGljaCB3aXNoIHRvIHNldAorCWV4aXRfb25fZGlzY29ubmVjdCB0byBGQUxTRSB3aWxsIG5vdCBiZSB0ZXJtaW5hdGVkIGlmIHRoZSBidXMgZXhpdHMKKwlkdXJpbmcgcmVnaXN0cmF0aW9uLiAgKEZETyBCdWcgIzE1MTEyKQorCisyMDA4LTAzLTA0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBmaXggYnJva2VuIHBvbGwgb24gTWFjIE9TWCAtIGJ1aWxkIHBhdGNoIGJ5IEJlbmphbWluIFJlZWQKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIE9TWCdzIGRlYWRsb2NraW5nIHBvbGwKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcG9sbCk6IGlmIHdlIGhhdmUgYSBicm9rZW4gcG9sbAorCSAgZG9uJ3QgdXNlIHBvbGwKKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY2hlY2sgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBhIGZsYWcgaW5zdGVhZCBvZiBqdXN0IGNoZWNraW5nIGZvciBHTlUKKwkgIGxkCisJKiBjb25maWd1cmUuaW46IG1vdmUgQU1fUFJPR19MSUJUT09MIHRvIHRoZSB0b3AKKwkgIChsZF9zdXBwb3J0c19mbGFnKTogbmV3IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiB0aGUgbGlua2VyIHN1cHBvcnRzCisJICBhIGdpdmVuIGZsYWcKKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYWRkIGEgY2hhbmdlbG9nIGZvciBCZW5qYW1pbiBSZWVkJ3MgZ2l0IHBhdGNoIFJBTlQ6IENoYW5nZSBMb2dzIGFyZQorCSAgaGFuZGxlZCBieSBnaXQgYW5kIGhhdmluZyBhbiBleHRlcm5hbCBjaGFuZ2Vsb2cganVzdCBzY3Jld3MgdXAKKwkgIG1lcmdpbmcuICBXZSBzaG91bGQgd3JpdGUgZG93biBydWxlcyBmb3IgZG9pbmcgZ2l0IGNvbW1pdCBtZXNzYWdlcworCSAgYW5kIGxlYXZlIGl0IGF0IHRoYXQuCisJKiBjb25maWd1cmUuaW46IFBsYXRmb3JtIGJ1aWxkIGZpeGVzIGZvciBNYWMgT1MgWAorCSAgdGhlIERhcndpbiBsaW5rZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgLXogb3B0aW9uOyB3cmFwIGl0IGluIAorCSAgYSBjaGVjayBmb3IgJHdpdGhfZ251X2xkLgorCSAgZW52aXJvbiBpcyBvbmx5IGF2YWlsYWJsZSBhdCBydW50aW1lLCBzbyB5b3UgbmVlZCB0byBtYWtlIGEKKwkgIHJlZmVyZW5jZSB0byBfTlNHZXRFbnZpcm9uIGluc3RlYWQgZm9yIHN5bWJvbHMgdG8gcmVzb2x2ZSBwcm9wZXJseS4KKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgJFRIUkVBRF9MSUJTIHRvIERCVVNfTEFVTkNIRVJfTElCUyBzbyB3ZSBsaW5rIAorCSAgY29ycmVjdGx5CisKKzIwMDgtMDMtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IHdyYXAgWCdpc20gaW4gI2lmZGVmIHNvIHdlIGNhbiBjb21waWxlIAorCSAgd2l0aG91dCBYCisKKzIwMDgtMDItMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogZGVmaW5lIF9BSV9BRERSQ09ORklHIGFzIDAgaWYgbm90CisJICBkZWZpbmVkIHNvIHRoYXQgd2UgY2FuIGNvbXBpbGUgd2l0aCBhbiBvbGRlciBnbGliYyAKKworMjAwOC0wMi0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMS4xLjIwCisKKzIwMDgtMDItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIENWRS0yMDA4LTA1OTUgLSBzZWN1cml0eSBwb2xpY3kgb2YgdGhlIHR5cGUgPGFsbG93IHNlbmRfaW50ZXJmYWNlPQorCSAgInNvbWUuaW50ZXJmYWNlLldpdGhNZXRob2RzIi8+IHdvcmsgYXMgYW4gaW1wbGljaXQgYWxsb3cgZm9yCisJICBtZXNzYWdlcyBzZW50IHdpdGhvdXQgYW4gaW50ZXJmYWNlIGJ5cGFzc2luZyB0aGUgZGVmYXVsdCBkZW55IHJ1bGVzCisJICBhbmQgcG90ZW50aWFsbHkgYWxsb3dpbmcgcmVzdHJpY3RlZCBtZXRob2RzIGV4cG9ydGVkIG9uIHRoZSBidXMgdG8gYmUKKwkgIGV4ZWN1dGVkIGJ5IHVuYXV0aG9yaXplZCB1c2Vycy4gIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGlzc3VlLgorCSogYnVzL3BvbGljeS5jIChidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCwKKwkgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlKTogc2tpcCBtZXNzYWdlcyB3aXRob3V0IGFuIAorCSAgaW50ZXJmYWNlIHdoZW4gZXZhbHVhdGluZyBhbiBhbGxvdyBydWxlLCBhbmQgdGh1cyBwYXNzIGl0IHRvIHRoZQorCSAgZGVmYXVsdCBkZW55IHJ1bGVzCisKKzIwMDgtMDItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvcnJlY3RseSB1bnJlZiBjb25uZWN0aW9ucyB3aXRob3V0IGd1aWRzIGR1cmluZyBzaHV0ZG93bgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoY2xvc2VfY29ubmVjdGlvbl9vbl9zaHV0ZG93bik6IG5ldyBtZXRob2QKKwkgIHNwbGl0IG91dCBmcm9tIHNoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93bgorCSAgKHNoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93bik6IHNodXRkb3duIGFsbCBzaGFyZWQgY29ubmVjdGlvbnMKKwkgIHdpdGhvdXQgZ3VpZHMKKwkgIChfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCk6IGhhbmRsZSBPT00gd2hlbiBwcmVwZW5kaW5nIG5vIGd1aWQKKwkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCBsaXN0CisJKiBQYXRjaCBieSAgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworMjAwOC0wMi0yMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIGZpeCBidWlsZCBhZ2FpbnN0IHRoZSBsYXRlc3QgZ2NjL2dsaWJjCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IGRlZmluZSBfR05VX1NPVVJDRQorCSogYnVzL3NlbGludXguYzogaW5jbHVkZSBsaW1pdHMuaAorCSogUGF0Y2ggYnkgTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuIGF0IHJlZGhhdC5jb20+CisKKzIwMDgtMDItMjEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGZpeGVzIGRidXMtbGF1bmNoIHNvIHRoZSBidXMgZ29lcyBhd2F5IHdoZW4gWCBkb2VzCisJICAoUmVkIEhhdCBCdWcgIzQzMDQxMikKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiBzZXQgeGRpc3BsYXkgPSBOVUxMCisJKiBQYXRjaCBieSBNYXR0aGlhcyBDbGFzZW4gPG1jbGFzZW4gYXQgcmVkaGF0LmNvbT4KKworMjAwOC0wMS0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIFJlbGVhc2VkIDEuMS40CisKKzIwMDgtMDEtMTcgIFRpbW8gSG9lbmlnICA8dGhvZW5pZ0BzdXNlLmRlPgorCSogZml4IGlub3RpZnkgc3VwcG9ydAorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKF9oYW5kbGVfaW5vdGlmeV93YXRjaCk6IGZpeCByZWFkaW5nIG9mIHRoZQorCWlub3RpZnkgZXZlbnRzLiBBbHNvLCB1c2Ugc3NpemVfdCBub3Qgc2l6ZV90IGZvciAncmV0Jy4KKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfd2F0Y2hfZGlyZWN0b3J5KTogd2F0Y2ggbm90IG9ubHkgZm9yCisJSU5fTU9ESUZZIGJ1dCBhbHNvIGZvciBJTl9DUkVBVEUgYW5kIElOX0RFTEVURQorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKGJ1c19kcm9wX2FsbF9kaXJlY3Rvcnlfd2F0Y2hlcyk6IGRyb3AgdGhlCisJaW5vdGlmeSB3YXRjaGVzIG1vcmUgZWxlZ2FudGx5IGJ5IGNsb3NpbmcgaW5vdGlmeTpfZmQsIHNldCBpbm90aWZ5X2ZkIHRvCisJLTEgYWZ0ZXIgZHJvcHBpbmcgdGhlIHdhdGNoZXMKKworMjAwOC0wMS0xNSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHBvc3QtcmVsZWFzZSB2ZXJzaW9uIGJ1bXAKKworMjAwOC0wMS0xNSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjEuMyAoMS4yLjBSQzEpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGZpeCBoYWNraW5nIHRvIHNheSBnaXQgaW5zdGVhZCBvZiBjdnMKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgU8OpYmFzdGllbiBDb3VyZXQgPDEwZnVuY3Rpb24gYXQgZ21haWwgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKGFsbF9yZWFkZXJfY2xhc3Nlc1tdKTogd3JhcCBpbiAKKwkjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQgc2luY2UgaXQgaXMgb25seSB1c2VkIGluIGFzc2VydHMgd2hpY2gKKwlhcmUgbm9vcAorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBNYWdudXMgSGVub2NoIDxoZW5vY2ggcGx1cyBiZmRvIGF0IGR0ZWsgZG90IGNoYWxtZXJzIGRvdCBzZT4KKworCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX3NlcnZlcl9kYXRhX2V4dGVybmFsX21lY2gpOiBoYW5kbGUgU0FTTAorCUVYVEVSTkFMJ3MgaW5pdGFsIGVtcHR5IHJlc3BvbmNlIChGRE8gQnVnICM5OTQ1KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogYWRkIGxzYiBoZWFkZXJzIChGRE8gQnVnICMxMTQ5MSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgUGV0ZXIgTydHb3JtYW4gPHBvZ21hIGF0IHRoZXdyaXR0ZW53b3JkIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChiYWJ5c2l0X3NpZ25hbF9oYW5kbGVyKTogY2hlY2sgd3JpdGUgcmV0dXJuIHZhbHVlCisJc28gd2UgZG9uJ3QgaGFuZyAoRkRPIEJ1ZyAjMTE2NjUpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IFBldGVyIE8nR29ybWFuIDxwb2dtYSBhdCB0aGV3cml0dGVud29yZCBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBzdXBwb3J0IGZvciBBSVggcG9sbCBpbXBsZW1lbnRhdGlvbiAoRkRPIEJ1ZyAKKwkjMTE2NjYpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL25hbWUtdGVzdC9ydW4tdGVzdC5zaDogbWFrZSBtb3JlIHBvcnRhYmxlIChGRE8gQnVnICMxMTY2NykKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsKToKKwlkb24ndCBjaGVjayBmb3IgPCAwIG9uIGFuIHVuc2lnbmVkIHZhcmlhYmxlIChGRE8gQnVnICMxMjkyNCkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGJ1cy9idXMuYyAoc2V0dXBfc2VydmVyKTogY2hlY2sgZmFpbGVkIGFsbG9jYXRpb24gKEZETyBCdWcgIzEyOTIwKQorCQorMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIpOiB0aGUgQVBJIAorCWNvbnRyYWN0IHNheXMgc2l0dGVyX3AgY2FuIGJlIE5VTEwsIHNvIGxldCdzIGNoZWNrIGl0IChGRE8gQnVnICMxMjkxOSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChyZWFkX2ludHMsIHJlYWRfcGlkKTogdXNlIGNvcnJlY3Qgc3NpemVfdCB0eXBlCisJaW5zdGVhZCBvZiBzaXplX3QgKEZETyBCdWcgIzEyODYyKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCQorCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcik6IG1ha2Ugc3VyZSB0byBjYWxsIHZhX2VuZCBpZiB3ZQorCWhpdCBhbiBPT00gZXJyb3IgaW5zaWRlIHZhX3N0YXJ0IChGRE8gQnVnICMxMjg0NikKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiAKKwlmaXggcG9zc2libGUgY3Jhc2ggaWYgcGVuZGluZ19yZXR1cm4gaXMgTlVMTCAoRkRPIEJ1ZyAjMTI2NzMpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBvcnRpb25zIG9mIHBhdGNoIHN1Ym1pdHRlZCBieSBUaW0gTW9vbmV5IAorCTxlbmNoYW50ZXIgYXQgdXNlcnMgZG90IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisKKwkqIGNvbmZpZ3VyZS5pbjogbmV2ZXIgYXV0by1zZWxlY3QgbGlieG1sIChGRE8gQnVnICMxMjQ3OSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2hlcyBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4IChfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzKTogaGFuZGxlIE9PTQorCShGRE8gQnVnICMxMjk0NSkKKworCSogZGJ1cy9kYnVzLXV1aWRnZW4uYyAocmV0dXJuX3V1aWQpOiBoYW5kbGUgT09NIChGRE8gQnVnICMxMjkyOCkKKworCSogZGJ1cy9kYnVzLW1pc2MuYyAoZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCk6IGhhbmRsZSBPT00sIGZpeCByZXR1cm4KKwl2YWx1ZSB0byByZXR1cm4gTlVMTCBub3QgRkFMU0UgKEZETyBCdWcgIzEyOTQ2KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHJld3JpdGUgc2VsaW51eCBlcnJvcgorCWhhbmRsaW5nIHRvIG5vdCBhYm9ydCBkdWUgdG8gYSBOVUxMIHJlYWQgYW5kIHRvIHNldCB0aGUgZXJyb3Igb25seSBpZgorCWl0IGlzIG5vdCBhbHJlYWR5IHNldCAoQmFzZWQgb2ZmIG9mIEZETyBCdWcgIzEyNDMwKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcsCisJX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSk6IGFkZCBPT00gaGFuZGxpbmcgKEZETyBCdWcgIzEyOTUyKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoYmFieXNpdCwgYmFieXNpdHRlcl9pdGVyYXRpb24pOiBhZGQgZXJyb3IKKwloYW5kbGluZyB3aGVuIHBvbGxpbmcgKEZETyBCdWcgIzEyOTU0KSAKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAobG9jYXRlX2F0dHJpYnV0ZXMpOiByZW1vdmUgZGVhZCBjb2RlIHdoaWNoCisJYWx3YXlzIGV2YWx1YXRlZCB0byBUUlVFCisKKwkqIGRidXMvZGJ1cy1zaGVsbC5jIChfZGJ1c19zaGVsbF9xdW90ZSk6IHJlbW92ZSB1bnVzZWQgY29kZQorCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9jb21wbGV0ZSk6IHBsdWcgYSBwb3NzaWJsZSAKKwlCdXNDbGllbnRQb2xpY3kgbGVhayAoRkRPIEJ1ZyAjMTMyNDIpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEZyZWRlcmljIENyb3phdCA8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPiAoRkRPIEJ6IworCTEzMjY4KQorCisJKiBhZGQgaW5vdGlmeSBzdXBwb3J0CisKKwkqIGJ1cy9NYWtlZmlsZS5hbTogYWRkIGlub3RpZnkgbW9kdWxlIHRvIHRoZSBidWlsZAorCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYzogaW5vdGlmeSBtb2R1bGUgYmFzZWQgb2ZmIHRoZSBkbm90aWZ5IGFuZAorCWtxdWV1ZSBtb2R1bGVzCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGNoZWNrcyBhbmQgc3dpdGNoIGZvciBpbm90aWZ5CisJYWxzbyBhZGQgYSBwcmludG91dCBhdCB0aGUgZW5kIG9mIGNvbmZpZ3VyZSBpZiBpbm90aWZ5IGFuZCBrcXVldWUKKwlzdXBwb3J0IGlzIGJlaW5nIGJ1aWx0IGluIChkbm90aWZ5IGFscmVhZHkgaGFkIHRoaXMpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEZyZWRlcmljIENyb3phdCA8ZmNyb3phdCBhdCBtYW5kcml2YSBkb3QgY29tPgorCisJKiBidXMvZGlyLXdhdGNoLWRub3RpZnkuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IHdhdGNoIGZvciBmaWxlCisJY3JlYXRlcyBhbHNvCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMoZG9fcmVhZGluZyk6IHJldHVybiBtZXNzYWdlIAorCWxvYWRlciBidWZmZXIgaW4gY2FzZSBvZiBPT00gKEZETyBCdWcjMTI2NjYpCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHdhcm5pbmcgdG8gb3V0cHV0IHdoZW4gbGlieG1sIGlzIHNlbGVjdGVkIHNpbmNlCisJd2UgZG9uJ3QgaGF2ZSBhIGxpYnhtbCBtYWludGFpbmVyIGFuZCBleHBhdCB3b3JrcyBwZXJmZWN0bHkgZmluZQorCWZvciB3aGF0IHdlIG5lZWQgYW4geG1sIHBhcnNlciBmb3IKKworMjAwOC0wMS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUGF0Y2ggYnkgQW5kcmVhIEx1enphcmRpICA8c2NveCBhdCBzaWcxMSBkb3Qgb3JnPjogY3JlYXRlcyBhCisJX2RidXNfZ2V0ZXVpZCBmdW5jdGlvbiB0byBmaXggRVhURVJOQUwgYXV0aGVudGljYXRpb24gaW4gc2V0dWlkCisJYXBwbGljYXRpb25zCisKKwkqICBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2dldGV1aWQpOiB1c2VkIHRvIGdldCB0aGUgZWZmZWN0aXZlCisJdWlkIG9mIHRoZSBydW5uaW5nIHByb2dyYW0KKwkoX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzKTogdXNlIGdldGV1aWQgaW5zdGVhZCBvZgorCWdldHVpZAorCShfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IHVzZSBnZXRldWlkIGluc3RlYWQgb2YKKwlnZXR1aWQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlcik6IHVzZQorCWdldGV1aWQgaW5zdGVhZCBvZiBnZXR1aWQKKwkoX2RidXNfdW5peF91c2VyX2lzX2F0X2NvbnNvbGUpOiB1c2UgZ2V0ZXVpZCBpbnN0ZWFkIG9mIGdldHVpZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZ2V0ZXVpZCk6IGFkZCBhIHdpbmRvd3MgZXF1aXZpbGFudAorCXRoYXQgcmV0dXJucyBEQlVTX1VJRF9VTlNFVAorCisyMDA3LTEyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOgorCWZpeCBsb2NhdGlvbiBvZiBjdXJseSBicmFjZXMKKworMjAwNy0xMS0yMyAgU2pvZXJkIFNpbW9ucyAgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogbGV0IGJvdGggYSBub3JtYWwgZGJ1cy1sYXVuY2ggYW5kIGFuCisJYXV0b2xhdW5jaGVkIGJ1cyBzYXZlIHRoZWlyIHBhcmFtZXRlcnMgaW4gWDExIGlmIHBvc3NpYmxlLiBUaGlzIG1ha2VzCisJdGhlIGF1dG9sYXVuY2ggYW5kIG5vbi1hdXRvbGF1bmNoIGJlaGF2aW91ciBtb3JlIHNpbWlsYXIuIFdpdGggdGhlCisJZXhjZXB0aW9uIHRoYXQgb24gYSBub3JtYWwgbGF1bmNoIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgbmV3IHNlc3Npb24KKwlidXMgYW5kIG5vdCBiZWluZyBhYmxlIHRvIHNhdmUgcGFyYW1ldGVycyBpcyBub3QgZmF0YWwuIFRoaXMgYWxzbworCWVuYWJsZXMgdG8gbGF1bmNoIHByb2dyYW1zIGRpcmVjdGx5IHdpdGggYXV0b2xhdW5jaCAobm90IHZlcnkgdXNlZnVsbAorCXRob3VnaCkuCisKKzIwMDctMTAtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvc2VsaW51eC5jIChsb2dfYXVkaXRfY2FsbGJhY2spOiByZXdyaXRlIHRvIHVzZQorCV9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCgpCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyKTogY2hhbmdlIHRvIE5PVAorCW51bC10ZXJtaW5hdGUgdGhlIGJ1ZmZlcjsgZmFpbCBhbiBhc3NlcnRpb24gaWYgdGhlcmUgaXMgbm90IGVub3VnaAorCXNwYWNlIGluIHRoZSB0YXJnZXQgYnVmZmVyLiBUaGlzIGZpeGVzIHR3byBidWdzIHdoZXJlCisJY29weV90b19idWZmZXIgd2FzIHVzZWQgdG8gY29weSB0aGUgYmluYXJ5IGJ5dGVzIGluIGEgVVVJRCwgd2hlcmUKKwludWwgdGVybWluYXRpb24gZGlkIG5vdCBtYWtlIHNlbnNlLiBCdWcgcmVwb3J0ZWQgYnkgRGF2aWQgQ2FzdGVsb3cuCisJKF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCk6IG5ldyBmdW5jdGlvbiB0aGF0IGFsd2F5cworCW51bC10ZXJtaW5hdGVzIHRoZSBidWZmZXIsIGFuZCBmYWlscyBhbiBhc3NlcnRpb24gaWYgdGhlcmUgaXMgbm90IAorCWVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyLgorCisyMDA3LTEwLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiB1c2UgdGhlIG5ldyBuYW1lIGhlcmUKKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYXVkaXRfaW5pdCk6IHJlbmFtZSBmcm9tIGF1ZGl0X2luaXQoKQorCXRvIGF2b2lkIHBvc3NpYmxlIGxpYmMgY29uZmxpY3QsIGFuZCBkZWNsYXJlIGl0IGluIC5oIGZpbGUgdG8KKwlhdm9pZCBhIHdhcm5pbmcKKworMjAwNy0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CQorCQorCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBwdXQgYXVkaXRfaW5pdCgpIGluIEhBVkVfU0VMSU5VWAorCQorMjAwNy0xMC0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IHB1dCB0aGUgYXVkaXRfaW5pdCgpIGluIGhlcmUKKwlpbnN0ZWFkLCB3aGljaCBJIGJlbGlldmUgZW5kcyB1cCBiZWluZyB0aGUgc2FtZSBhcyB3aGVyZSBpdCB3YXMKKwliZWZvcmUsIHRob3VnaCBJJ20gbm90IHN1cmUgSSB1bmRlcnN0YW5kIHdoeSBpdCBnb2VzIGhlcmUuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIChfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIpOgorCXJlbW92ZSBhdWRpdF9pbml0KCkgZnJvbSBoZXJlLCB0aGlzIGZpbGUgY2FuJ3QgZGVwZW5kIG9uIGNvZGUgaW4KKwlidXMvIGRpcmVjdG9yeQorCisyMDA3LTEwLTE2ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmluOiAqQWN0dWFsbHkqIGZpeCBkZXRlY3Rpb24gb2YgaTQ4NiBhdG9taWMgb3BzIC0KKwlteSBwcmV2aW91cyBhdHRlbXB0IGF0IGEgZml4IHdvdWxkIGFsd2F5cyBlbmFibGUgdGhlbSBkdWUgdG8gd3JvbmcKKwlxdW90aW5nLiBQYXRjaCBmcm9tIENvbGluIFdhbHRlcnMgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworMjAwNy0xMC0xMSAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5pbjogZW5hYmxlIEF1dG9jb25mJ3MgQUNfQ19JTkxJTkUgdG8gYXZvaWQgY29tcGlsYXRpb24KKwlmYWlsdXJlIHdpdGggZ2NjIC1hbnNpCisJKiBkYnVzL2RidXMtbWFjcm9zLmgsIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbjogVXNlIG5ldyBtYWNybworCV9EQlVTX0dOVUNfRVhURU5TSU9OICh0aGUgc2FtZSBhcyBHX0dOVUNfRVhURU5TSU9OKSB0byBhdm9pZCAtYW5zaQorCXdhcm5pbmdzIGFib3V0IHVzZSBvZiAibG9uZyBsb25nIi4KKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmM6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgd2hlbiBhc3NlcnRpb25zCisJYXJlIGRpc2FibGVkCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jOiBhdm9pZCBlbXB0eSBzdGF0ZW1lbnRzIGJ5IHJlbW92aW5nCisJc3RyYXkgc2VtaWNvbG9ucworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogY29udmVydCBDKystc3R5bGUgY29tbWVudCB0byBDLXN0eWxlLCBhZGQge30KKwlmb3IgY2xhcml0eQorCSogLmdpdGlnbm9yZTogaWdub3JlIHZpIHN3YXBmaWxlcworCSogZGJ1cy9kYnVzLWVycm9ycy5oLCBkYnVzL2RidXMtZXJyb3JzLmM6IEFkZCBEQlVTX0VSUk9SX0lOSVQgbWFjcm8sCisJZXF1aXZhbGVudCB0byBjYWxsaW5nIGRidXNfZXJyb3JfaW5pdCgpIG9uIGFuIHVuaW5pdGlhbGl6ZWQgREJ1c0Vycm9yCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jLCBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGgtdXRpbC5jLAorCWRidXMvZGJ1cy1jb25uZWN0aW9uLmMsIGRidXMvZGJ1cy1pbnRlcm5hbHMuYywgZGJ1cy9kYnVzLWtleXJpbmcuYywKKwlkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMsIGRidXMvZGJ1cy1zZXJ2ZXIuYywgZGJ1cy9kYnVzLXNoYS5jLAorCWRidXMvZGJ1cy1zcGF3bi13aW4uYywgZGJ1cy9kYnVzLXNwYXduLmMsCisJZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYywgZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYywKKwlkYnVzL2RidXMtdHJhbnNwb3J0LmMsIGRidXMvZGJ1cy11c2VyZGIuYzogdXNlIHRoYXQgbWFjcm8gaW5zdGVhZCBvZgorCWNhbGxpbmcgZGJ1c19lcnJvcl9pbml0KCkgd2hlcmUgaXQncyBjbGVhcmx5IGVxdWl2YWxlbnQKKwkqIGNvbmZpZ3VyZS5pbiwgZGJ1cy9kYnVzLXN5c2RlcHMuaCwgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBGaXgKKwlkZXRlY3Rpb24gb2YgaTQ4NiBhdG9taWMgb3BzLiBQcmV2aW91c2x5LCB0aGUgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lCisJc3VwcG9ydCBhdCBjb21waWxlLXRpbWUgb24gRGFyd2luIHdlcmUgY2F1c2luZyB0aGUgaTQ4NiBhdG9taWMgb3BzIHRvCisJYmUgdXNlZCBvbiAqYWxsKiBpMzg2IG9yIHg4Ni02NCBHQ0MgYnVpbGRzIChBSF9WRVJCQVRJTSBjYW4ndCBiZQorCWNvbmRpdGlvbmFsaXplZCBsaWtlIHdlIHdlcmUgdHJ5aW5nIHRvKS4KKworMjAwNy0xMC0xMCAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYywgZGJ1cy9kYnVzLXByb3RvY29sLmg6IEFkZCBuZXcgZXJyb3IKKwlvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PYmplY3RQYXRoSW5Vc2UKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5oLCBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYywKKwlkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBhZGQgbmV3IGZ1bmN0aW9ucworCWRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfb2JqZWN0X3BhdGggYW5kCisJZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjaywgd2hpY2ggcmFpc2UgT2JqZWN0UGF0aEluVXNlCisJcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLCB0byBtYWtlIG9iamVjdCBwYXRoIHJlZ2lzdHJhdGlvbiBsZXNzIHBhaW5mdWwKKwlmb3IgYmluZGluZ3MKKwkqIC5naXRpZ25vcmU6IGFkZCB2YXJpb3VzIHRoaW5ncyB0aGF0IHdlcmVuJ3QgaW4gLmN2c2lnbm9yZSBiZWNhdXNlCisJQ1ZTIGltcGxpY2l0bHkgaWdub3JlZCB0aGVtOyBnZW5lcmFsbHkgYnJpbmcgdXAgdG8gZGF0ZQorCisyMDA3LTEwLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2g6IEZpeCBlbnYgZXhwb3J0cyBmb3IgYmV0dGVyCisJcG9ydGFiaWxpdHkgKCM5MjgwKQorCSogdG9vbHMvZGJ1cy1zZW5kLjE6IERvY3VtZW50IHN5bnRheCBmb3IgY29udGFpbmVyIHR5cGVzIGluIGRidXMtc2VuZAorCW1hbiBmaWxlICgjOTU1MykgLSBwYXRjaCBmcm9tIEphY2sgU3BhYXIgPGpzcGFhciBhdAorCXVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCVtCb3RoIE9LIGZvciBNSVQvWDExIHJlbGljZW5zaW5nIC1zbWN2XQorCisyMDA3LTEwLTA5ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFNwZWNpZmljYWxseSBmb3JiaWQgZW1wdHkgc3RydWN0cyAoIzc5NjkpCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogUGF0Y2hlcyBmcm9tIEtyaXN0b2ZmZXIgTHVuZMOpbiB0byBjbGFyaWZ5CisJZGVzY3JpcHRpb24gb2YgREJVU19DT09LSUVfU0hBMSAoIzEwMTg0KSBhbmQgYWxsb3dhYmxlIGNvbnRlbnRzIG9mIGEKKwl2YXJpYW50ICgjMTAxODUsIGFtZW5kZWQgYXMgcGVyIEhhdm9jJ3MgY29tbWVudHMpCisKKwlbQWxsIG9mIHRoZSBhYm92ZSBhcmUgT0sgZm9yIE1JVC9YMTEgbGljZW5zaW5nXQorCisyMDA3LTEwLTAzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IGZkLm8gYnVnICMxMTY3OCBEb24ndCBlcnJvciBvdXQgaWYgY29tcGlsZXIKKwlkb2VzIG5vdCBzdXBwb3J0IHZhcmFyZyBtYWNyb3MuIF9kYnVzX3ZlcmJvc2UgaXMgdGhlIG9ubHkgZnVuY3Rpb24KKwl0aGF0IGRvZXMgdGhpcyBzbyBtYWtlIGl0IGEgbm9vcCBpZiB2YXJhcmcgbWFjcm9zIGFyZSBub3Qgc3VwcG9ydGVkCisJKiBidXMvc2VsaW51eC5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYzogZmQubyBidWcgIzEyNDI5CisJUmV2ZXJzZSBjaGVjayB0byBzZXRwY2FwIGFuZCBvbmx5IGluaXQgYXVkaXQgaWYgd2Ugd2VyZSByb290CisJKHBhdGNoIGJ5IERhbiBXYWxzaCA8ZHdhbHNoQHJlZGhhdC5jb20+LAorCWh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNDI5KS4gUmV2ZXJzZQorCXdlX3dlcmVfcm9vdCBjaGVjayB0byBzZXRwY2FwIGlmIHdlIHdlcmUgcm9vdC4gIEFsc28gb25seSBpbml0IGF1ZGl0CisJaWYgd2Ugd2VyZSByb290LiAgU28gZXJyb3IgZGJ1cyBtZXNzYWdlIHdpbGwgbm90IHNob3cgdXAgd2hlbiBwb2xpY3kKKwlyZWxvYWQgaGFwcGVucy4gIGRidXMgLXNlc3Npb24gd2lsbCBubyBsb25nZXIgdHJ5IHRvIHNlbmQgYXVkaXQKKwltZXNzYWdlLCBvbmx5IHN5c3RlbSB3aWxsLgorCSogY29uZmlndXJlLmluOiBmZC5vIGJ1ZyAjMTE4NzIgaW1wcm92ZSBsaW5rZXIgdGVzdCBmb3IgLS1nYy1zZWN0aW9ucy4KKwlQYXRjaCBieSBUaW0gTW9vbmV5IDxlbmNoYW50ZXIgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCSogY29uZmlndXJlLmluLCBkYnVzL2RidXMtc3lzZGVwcy5jOiBmZC5vIGJ1ZyAjMTE4NzIgZml4IGNsZWFyZW52IGZvcgorCXN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBpdC4gUGF0Y2ggZnJvbSBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uCisJYXQgc3VuLmNvbT4KKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGZkLm8gYnVnICMxMjU0NyByZW1vdmUgc3VwZXJmbHVvdXMgaWYuCisJQWxzbyBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCisJKiBjb25maWd1cmUuaW4sIGJ1cy9NYWtlZmlsZS5hbSwgZGJ1cy9NYWtlZmlsZS5hbTogQ29ycmVjdGx5IGltcGxlbWVudAorCS1mUElDIGFuZCAtZlBJRS4gRm9yIHNlY3VyaXR5IHJlYXNvbnMgd2Ugd2FudCBwb3NzaXRpb24gaW5kZXBlbmRlbnQKKwljb2RlIGZvciBsaWJyYXJpZXMgYW5kIHBvc3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlIGZvcgorCWV4ZWN1dGFibGVzLiBCZWZvcmUgd2Ugd2VyZSBqdXN0IGVuYWJsaW5nIC1mUElDLiBOb3cgd2UgY29ycmVjdGx5CisJZW5hYmxlIC1mUElDIGFuZCAtUElFIGZvciBsaWJkYnVzIGFuZCB0aGUgYnVzIHJlc3BlY3RpdmVseS4gUHJvcGVyCisJTERfRkxBR1MgYXJlIHNldCBmb3IgZWFjaCBhbHNvLgorCisyMDA3LTA5LTIwICBSeWFuIExvcnRpZSAgPGRlc3J0QGRlc3J0LmNhPgorCisJQWRkIGFyZ3VtZW50IHBhdGggbWF0Y2hpbmcgc3VwcG9ydC4gIEJ1ZyAjMTEwNjYuCisKKwkqIGRidXMvc2lnbmFscy5jIChzdHJ1Y3QgREJ1c01hdGNoUnVsZSwgYnVzX21hdGNoX3J1bGVfbmV3LAorCWJ1c19tYXRjaF9ydWxlX3NldF9hcmcsIGJ1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCwKKwltYXRjaF9ydWxlX21hdGNoZXMpOiBBZGQgc3VwcG9ydCBmb3IgcGFyc2luZyBhbmQgbWF0Y2hpbmcgb24KKwlhcmcwcGF0aD0nL3NvbWUvcGF0aCcgdHlwZSBydWxlcy4KKworCSogZGJ1cy9zaWduYWxzLmggKGJ1c19tYXRjaF9ydWxlX3NldF9hcmcpOiBjaGFuZ2UgdG8gdGFrZSBjb25zdAorCURCdXNTdHJpbmcgaW5zdGVhZCBvZiBjb25zdCBjaGFyICogZm9yIHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBhZGQgYSBxdWljayBub3RlIHRvIGRidXNfYnVzX2FkZF9tYXRjaAorCWRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBhdGggbWF0Y2hpbmcuCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhZGQgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorCWNoYW5nZXMgaGVyZS4KKworMjAwNy0wOS0xOSAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCUFkZCBzdXBwb3J0IGZvciBjb21wYWN0aW5nIERCdXNTdHJpbmdzIHRvIHJlbGVhc2Ugd2FzdGVkIG1lbW9yeS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5bY2hdIChjb21wYWN0LCBfZGJ1c19zdHJpbmdfY29tcGFjdCwKKwlfZGJ1c19zdHJpbmdfbG9jayk6IG5ldyBjb21wYWN0IGZ1bmN0aW9uIHRvIGZyZWUgdXAgYWxsb2NhdGVkIG1lbW9yeQorCXRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGxvYWRfbWVzc2FnZSk6IGNhbGwgX2RidXNfc3RyaW5nX2NvbXBhY3Qgb24gdGhlCisJbWVzc2FnZSBsb2FkZXIgYnVmZmVyLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jIChkb19yZWFkaW5nLCBkb193cml0aW5nKTogY2FsbAorCV9kYnVzX3N0cmluZ19jb21wYWN0IG9uIHRoZSBpbmNvbWluZy9vdXRnb2luZyAiZW5jb2RlZCIgYnVmZmVycy4KKworCSogZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMgKF9kYnVzX3N0cmluZ190ZXN0KTogYWRkIGEgZmV3IHRlc3RzIGZvcgorCXN0cmluZyBjb21wYWN0aW5nLgorCisyMDA3LTA5LTEzICBSeWFuIExvcnRpZSAgPGRlc3J0QGRlc3J0LmNhPgorCisJKiBIQUNLSU5HOiBhZGQgbW9yZSBleHBsaWNpdCBnaXQgYnJhbmNoL3RhZyBpbnN0cnVjdGlvbnMKKworMjAwNy0wOS0xMyAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCW1pZ3JhdGUgZnJvbSBjdnMgdG8gZ2l0IChjdnMyc3ZuIC0+IGdpdC1zdm5pbXBvcnQpLgorCisJKiBIQUNLSU5HOiB1cGRhdGUgcmVsZWFzZS9icmFuY2gvdGFnIGluc3RydWN0aW9ucworCSogKi8uY3ZzaWdub3JlOiByZW5hbWUgdG8gLmdpdGlnbm9yZQorCisJYWxzbywgY2xlYW4gdXAgdGFncyBhbmQgYnJhbmNoIG5hbWVzIHRvIGNvbmZvcm0gdG8gSEFDS0lORworCisyMDA3LTA4LTE3ICBXaWxsaWFtIEpvbiBNY0Nhbm4gIDxtY2Nhbm5Aamh1LmVkdT4KKworCSogdXBkYXRlLWRidXMtZG9jcy5zaDogdXBsb2FkIERURCB0byBzZXJ2ZXIKKworMjAwNy0wOC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXgxMS5jIChzZXRfYWRkcmVzc19pbl94MTEpOiBmaXggZnJvbSBNaWNoYWVsCisJTG9yZW56IHRvIHVzZSBsb25nIG5vdCBpbnQgd2l0aCBYQ2hhbmdlUHJvcGVydHkgZm9ybWF0IDMyCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCisJKF9kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlKTogZmFjdG9yIHRoaXMgb3V0LCBhbmQgdXNlIHRoZQorCXNhbWUgY29kZSBpbiBfZGJ1c19iZWNvbWVfZGFlbW9uICh3aGVyZSB0aGUgcGFyZW50IHdyaXRlcyB0aGUgcGlkCisJZmlsZSBhbmQgdG8gdGhlIHBpZCBwaXBlKSBhbmQgaW4gYnVzX2NvbnRleHRfbmV3ICh3aGVyZSB0aGUgZGFlbW9uCisJd3JpdGVzIGl0cyBvd24gcGlkIGZpbGUgYW5kIHRvIGl0cyBvd24gcGlkIHBpcGUpCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogY2xvc2UgdGhlIHBpZCBwaXBlIGFmdGVyIHdlIHByaW50CisJdG8gaXQuIEFsc28sIGRvbid0IHdyaXRlIHRoZSBwaWQgdG8gdGhlIHBpcGUgdHdpY2Ugd2hlbiB3ZSBmb3JrLAorCXNvbWVvbmUgcmVwb3J0ZWQgdGhpcyBidWcgYSBsb25nIHRpbWUgYWdvLgorCisyMDA3LTA4LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgbWFqb3IvbWlub3IvbWljcm8gdmVyc2lvbiBudW1iZXIgQUNfU1VCU1QKKworCSogZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmluIChEQlVTX01BSk9SX1ZFUlNJT04sCisJREJVU19NSU5PUl9WRVJTSU9OLCBEQlVTX01JQ1JPX1ZFUlNJT04sIERCVVNfVkVSU0lPTl9TVFJJTkcsCisJREJVU19WRVJTSU9OKTogY29sbGVjdGlvbiBvZiBtYWNyb3MgdG8gZ2V0IHZlcnNpb24gb2YgbGlicmFyeSB3ZQorCWFyZSBjb21waWxlZCBhZ2FpbnN0LgorCisJKiBkYnVzL2RidXMtbWlzYy5jIChkYnVzX2dldF92ZXJzaW9uKTogbmV3IGZ1bmN0aW9uLCB0byBnZXQKKwl2ZXJzaW9uIG9mIGxpYnJhcnkgd2UgYXJlIGxpbmtlZCBhZ2FpbnN0IGF0IHJ1bnRpbWUuCisKKzIwMDctMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXIuYyAoY2hlY2tfYnVzX25hbWUpOiBkb24ndCB1c2UKKwlfZGJ1c19jaGVja192YWxpZF9idXNfbmFtZSgpIHdoaWNoIGlzIG9ubHkgYXJvdW5kIHdpdGgKKwktLWVuYWJsZS1jaGVja3MsIGluc3RlYWQgdXNlIF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lKCkuCisJQnVnICMxMTc2NiBmcm9tIERpZWdvIDxkaWVnb0BwZW1hcy5uZXQ+CisKKzIwMDctMDctMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHBvc3QtcmVsZWFzZSB2ZXJzaW9uIGJ1bXAKKworMjAwNy0wNy0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHJlbGVhc2UgMS4xLjIKKworMjAwNy0wNy0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuYyAoY2hlY2tfcmV0dXJuX3ZhbHVlcyk6IGRpc2FibGUgYQorCXRlc3QgdGhhdCBoYXJkY29kZWQgdGhlIGJ1cyB1c2VyJ3MgbmFtZQorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZik6IHJlbW92ZSB0aGUgImlmCisJKCF1c2VfbGF1bmNoZXIpIiBhcm91bmQgdGhlIHRlc3RzLCB0aGV5IHdlcmUgb25seSBmYWlsaW5nIGJlY2F1c2UKKwl3ZSBkaWRuJ3QgcGFzcyB0aHJvdWdoIGFsbCB0aGUgZXhwZWN0ZWQgZXJyb3JzIGZyb20gdGhlIGhlbHBlci4KKworCSogYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCisJKEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQpOiBhZGQgYSBjb2RlIGZvciBjaGlsZCBzZWdmYXVsdGluZworCShCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRSk6IG1ha2UgIjEiIGJlIGEgZ2VuZXJpYworCWZhaWx1cmUgY29kZSwgc28gaWYgYSB0aGlyZCBwYXJ0eSBsYXVuY2ggaGVscGVyIHdlcmUgd3JpdHRlbiBpdAorCWNvdWxkIGp1c3QgYWx3YXlzIHJldHVybiAxIG9uIGZhaWx1cmUuCisJCisyMDA3LTA3LTI0ICBEYW5pZWwgUC4gQmVycmFuZ2UgPGRhbkBiZXJyYW5nZS5jb20+CisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xOiBBZGQgZG9jcyBvbiBuZXcgc3ludGF4IG9wdGlvbnMgZm9yIHRoZSBidXMKKwlhZGRyZXNzIHN0cmluZ3MKKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYzogQWxsb3cgKiBpbiBhZGRyZXNzZXMgKGZvciBiaW5kaW5nIHRvIGFsbAorCWFkZHJlc3NlcykuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IFJlLXdyaXRlIHRvIHVzZSBnZXRhZGRyaW5mbyBpbnN0ZWFkCisJb2YgZ2V0aG9zdGJ5bmFtZSB0byBlbmFibGUgcHJvdG9jb2wgaW5kZXBlbmRhbnQgbmFtZSBsb29rdXAsCisJbWFraW5nIElQdjYgd29yaworCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5oOgorCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYzogQWRkIHN1cHBvcnQgZm9yICdmYW1pbHknIGluIHRoZQorCWFkZHJlc3Mgc3RyaW5nIHRvIHNwZWNpZnkgaXB2NCB2cyBpcHY2LiBVc2UgYSBwb3J0IHN0cmluZyB0bworCWFsbG93IGZvciBzZXJ2aWNlIHJlc29sdXRpb24uIEFsbG93IGZvciBiaW5kaW5nIHRvIG11bHRpcGxlCisJc29ja2V0cyBhdCBvbmNlIGluIGNhc2Ugb2YgZHVhbCBJUHY0ICYgSVB2NiBzdGFja3MuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOiBQYXNzIGluIGFuIGFycmF5IG9mIGZpbGUgZGVzY3JpcHRvcnMKKwlpbnN0ZWFkIG9mIGEgc2luZ2xlIG9uZS4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaDoKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmM6IEFkZCBzdXBwb3J0IGZvciAnZmFtaWx5JyBpbiB0aGUKKwlhZGRyZXNzIHN0cmluZyB0byBzcGVjaWZ5IGlwdjQgdnMgaXB2Ni4gVXNlIGEgcG9ydCBzdHJpbmcgdG8KKwlhbGxvdyBmb3Igc2VydmljZSByZXNvbHV0aW9uLgorCisyMDA3LTA3LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgQU1fUFJPR19DQ19DX08gdG8gYWxsb3cgcGVyLXRhcmdldCBDUFBGTEFHUworCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZik6IEZpeCB1cCBzZXR0aW5nCisJVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyB0byBpbmNsdWRlIHRoZSBmdWxsIHBhdGgsIGFuZCBlbmFibGUKKwl0ZXN0IHNoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IHdoZW4gdXNlX2xhdW5jaGVyPT1UUlVFCisKKwkqIGJ1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYyAoY29udmVydF9lcnJvcl90b19leGl0X2NvZGUpOiBwYXNzCisJdGhyb3VnaCB0aGUgSU5WQUxJRF9BUkdTIGVycm9yIHNvIHRoZSB0ZXN0IHN1aXRlIHdvcmtzCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGhhbmRsZV9hY3RpdmF0aW9uX2V4aXRfZXJyb3IpOiByZXR1cm4KKwlEQlVTX0VSUk9SX05PX01FTU9SWSBpZiB3ZSBnZXQgQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlkKKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzKToKKwlyZXR1cm4gb25seSB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjaGlsZCwgbm90IHRoZSBlbnRpcmUgdGhpbmd5IGZyb20gCisJd2FpdHBpZCgpLCBhbmQgbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHdoZXRoZXIgdGhlIGNoaWxkIAorCWV4aXRlZCBub3JtYWxseSAod2l0aCBhIHN0YXR1cyBjb2RlKQorCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSk6IF9kYnVzX3N0cmR1cCB3b3JrcworCW9uIE5VTEwgc28gbm8gbmVlZCB0byBjaGVjaworCShwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lKTogbW92ZSBzZXJ2aWNlaGVscGVyIGluaXQgaGVyZSwgc28gd2UKKwlyZWxvYWQgaXQgb24gSFVQIG9yIGNvbmZpZyBmaWxlIGNoYW5nZQorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogcmVtb3ZlIGNvbW1lbnQgYmVjYXVzZQorCUVtYWNzIG1ha2UgbW9kZSBzZWVtcyB0byBiZSBncnVtcHkgYWJvdXQgaXQKKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvdGVzdC1zeXN0ZW0uYzogKGRpZSksIChjaGVja19tZW1sZWFrcyksICh0ZXN0X3ByZV9ob29rKSwKKwkodGVzdF9wb3N0X2hvb2spLCAobWFpbik6CisJQWRkIGJhY2sgdGhlIHRlc3Qtc3lzdGVtLmMgZmlsZSAtIG5vdCBzdXJlIG5vdyB0aGlzIGdvdCBpZ25vcmVkIGluIHRoZQorCWRpZmYuIEkgYmxhbWUgZ2l0LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlVc2UgdXN0YXIgdG8gZ2VuZXJhdGUgdGhlIHRhcmJhbGw7IHRoaXMgZml4ZXMgdGhlIG1ha2UgZGlzdGNoZWNrCisJcHJvYmxlbSB3aGVuIHRoZSBkYXRhIGZpbGVzIGRvIG5vdCBmaXQgaW4gdGhlIGFyY2hpdmU6CisJdGFyOiBkYnVzLTEuMS4yL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLgorCVRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW46IGZpbGUgbmFtZSBpcyB0b28KKwlsb25nIChtYXggOTkpOyBub3QgZHVtcGVkCisKKwlXZSBoYXZlIHRvIGhhdmUgdGhlICdsb25nJyBuYW1lcyBhcyB0aGUgc2VydmljZSBoZWxwZXIgbWF0Y2hlcyBieQorCWZpbGVuYW1lIHJhdGhlciB0aGFuIGJ5IHRoZSBuYW1lIGluIHRoZSBzZXJ2aWNlIGZpbGUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogY29uZmlndXJlLmluOgorCSogdGVzdC9NYWtlZmlsZS5hbToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTCisJdWl0ZU5vRXhlYy5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFMKKwl1aXRlTm9TZXJ2aWNlLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0UworCXVpdGVOb1VzZXIuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpCisJdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWkKKwl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWkKKwl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aQorCXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLWVjaG8uc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLXNlZ2ZhdWx0LnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zaGVsbC1lY2hvLWZhaWwuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLXNoZWxsLWVjaG8tc3VjY2Vzcy5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1MKKwllcnZpY2Uuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhCisJdWx0U2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGwKKwlFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsCisJRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW46CisJQWRkIHRoZSBkYXRhIGZpbGVzIG5lZWRlZCBieSB0aGUgc3lzdGVtIGFjdGl2YXRpb24gdW5pdCBjaGVja3MuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChjaGVja19zZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV91c2VyX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9leGVjX21pc3NpbmcpLAorCShjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcpLCAoYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZiksCisJKGJ1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCksIChidXNfZGlzcGF0Y2hfdGVzdCk6CisJQWRkIHVuaXQgdGVzdHMgZm9yIHN5c3RlbSBhY3RpdmF0aW9uLiBNb3N0IGFyZSBjb3BpZWQgZnJvbSB0aGUKKwlzZXNzaW9uIGFjdGl2YXRpb24gdGVzdHMsIGJ1dCBzb21lIGRpZG4ndCBhcHBseSB3aGVuIHVzaW5nIGEgbGF1Y2hlci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJSWYgdGhlIGJ1cyB1c2VzIGEgc2VydmljZS1sYXVjaGVyLCB0aGVuIHVzZSB0aGUgc2V0dWlkIGxhdWNoZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogY29uZmlndXJlLmluOgorCUFkZCB0aGUgbmVlZGVkIGxpYnJhcnkgZXhwb3J0cyBmb3IgdGhlIG5ldyBsYXVjaGVyLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlDaGVjayBmb3IgLVdsLC0tZ2Mtc2VjdGlvbnMgc28gd2UgY2FuIHJlYWxseSByZWR1Y2UgdGhlIHNpemUgb2YgdGhlCisJc2V0dWlkIGJpbmFyeS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoaGFuZGxlX2FjdGl2YXRpb25fZXhpdF9lcnJvciksCisJKGJhYnlzaXR0ZXJfd2F0Y2hfY2FsbGJhY2spOgorCU1hcCB0aGUgY2hpbGQgZXhpdCBzdGF0dXMgaW50ZWdlciB0byBhIHByb3BlciBkYnVzIGVycm9yLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9idXMuYzogKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSksCisJKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpLCAoYnVzX2NvbnRleHRfdW5yZWYpLAorCShidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlcik6CisJKiBidXMvYnVzLmg6CisJQWRkIHRoZSBjb25jZXB0IG9mIGEgc2VydmljZS1oZWxwZXIgYW5kIGFsbG93IGl0J3MgdmFsdWUgdG8gYmUgcmVhZC4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fZW50cnlfdW5yZWYpLAorCSh1cGRhdGVfZGVza3RvcF9maWxlX2VudHJ5KToKKwlBZGQgdGhlIGNvbmNlcHQgb2YsIGFuZCByZWFkIHRoZSB2YWx1ZSBvZiB1c2VyIGZyb20gdGhlIGRlc2t0b3AgZmlsZS4KKwlUaGUgdXNlciBzdHJpbmcgaXMgbm90IHJlcXVpcmVkIHVubGVzcyB3ZSBhcmUgdXNpbmcgc3lzdGVtIGFjdGl2YXRpb24uCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzoKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuaDoKKwlNb3ZlIHRoZSBkZWZpbmVzIGludG8gdGhlIGhlYWRlciBmaWxlLCBhcyB3ZSB1c2UgdGhlc2UgaW4gdGhlIGxhdWNoCisJaGVscGVyIGFzIHdlbGwgYXMgdGhlIGRlc2t0b3AgZmlsZSBwYXJzaW5nLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy8uY3ZzaWdub3JlOgorCUFkZCB0aGUgYXV0b2dlbmVyYXRlZCBiaW5hcnkgZmlsZXMuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCSogYnVzL3Rlc3QuaDoKKwlBZGQgdGhlIGJ1aWxkIGdsdWUgZm9yIHRoZSBsYXVjaCBoZWxwZXIsIGFuZCBhbHNvIGFkZCB0aGUgbGF1bmNoLWhlbHBlcgorCU9PTSBjaGVja3MgaW50byBtYWtlIGNoZWNrLiBJJ3ZlIHByb2JhYmx5IGJyb2tlbiB0aGUgYnVpbGQsIGdpdmUgbWUgMi4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvdGVzdC1sYXVuY2gtaGVscGVyLmM6IChkaWUpLCAoY2hlY2tfbWVtbGVha3MpLAorCSh0ZXN0X3Bvc3RfaG9vayksIChidXNfYWN0aXZhdGlvbl9oZWxwZXJfb29tX3Rlc3QpLCAobWFpbik6CisJQWRkIGEgdGVzdCB3cmFwcGVyIHRvIGFsbG93IE9PTSBjaGVja3Mgb24gdGhlIGxhdW5jaCBoZWxwZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jOiAoY29udmVydF9lcnJvcl90b19leGl0X2NvZGUpLAorCShtYWluKToKKwkqIGJ1cy9hY3RpdmF0aW9uLWhlbHBlci5jOiAoZGVza3RvcF9maWxlX2Zvcl9uYW1lKSwKKwkoY2xlYXJfZW52aXJvbm1lbnQpLCAoY2hlY2tfcGVybWlzc2lvbnMpLCAoY2hlY2tfc2VydmljZV9uYW1lKSwKKwkoZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UpLCAoc3dpdGNoX3VzZXIpLAorCShleGVjX2Zvcl9jb3JyZWN0X3VzZXIpLCAoY2hlY2tfYnVzX25hbWUpLCAoZ2V0X2NvcnJlY3RfcGFyc2VyKSwKKwkobGF1bmNoX2J1c19uYW1lKSwgKGNoZWNrX2RidXNfdXNlciksIChydW5fbGF1bmNoX2hlbHBlcik6CisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXIuaDoKKwlBZGQgdGhlIGluaXRpYWwgbGF1bmNoLWhlbHBlci4gVGhpcyBpcyBzcGxpdCBpbnRvIGEgbWFpbiBzZWN0aW9uIGFuZCBhCisJYmluYXJ5IGxvYWRlciB0aGF0IGFsbG93cyB1cyB0byBsYXVjaCB0aGUgbWFpbiBzZWN0aW9uIGluIGFub3RoZXIgdGVzdAorCWhhcm5lc3MgdG8gZG8gc3R1ZmYgbGlrZSBPT00gdGVzdGluZy4gTm8gYnVpbGQgZ2x1ZSB5ZXQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKSwKKwkoc3RhcnRfYnVzY29uZmlnX2NoaWxkKSwgKGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50KSwKKwkoc2VydmljZWhlbHBlcl9wYXRoKSwgKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpLAorCShidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCksCisJKGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlaGVscGVyKSwKKwkodGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMpLAorCSh0ZXN0X2RlZmF1bHRfc3lzdGVtX3NlcnZpY2VkaXJzKSwgKGJ1c19jb25maWdfcGFyc2VyX3Rlc3QpOgorCSogYnVzL2NvbmZpZy1wYXJzZXIuaDoKKwlNYWtlIHRoZSBjb25maWctcGFyc2VyIGNvZGUgdXNlIHRoZSBjb21tb24gY29uZmlnIGNvZGUuCisJQWxzbyBhZGQgdGhlIHNlc3Npb24gYW5kIHN5c3RlbWRpcnMgc3R1ZmYsIGFuZCBtYWtlIHRoZSBjb25maWcgcGFyc2VyCisJYXdhcmUgb2YgdGhlIHNlcnZpY2VoZWxwZXIgZmllbGQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOgorCUFkZCBuZXcgc2VydmljZWhlbHBlciBmaWVsZHMgdG8gdGhlIGRlZmF1bHQgc3lzdGVtLmNvbmYgZmlsZS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci10cml2aWFsLmM6IChzZXJ2aWNlX2RpcnNfZmluZF9kaXIpLAorCShzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUpLCAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpLCAoYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCksCisJKGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50KSwgKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpLAorCShidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCksIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciksCisJKGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlKSwgKGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMpLAorCShjaGVja19yZXR1cm5fdmFsdWVzKSwgKGRvX2xvYWQpLCAoY2hlY2tfbG9hZGVyX29vbV9mdW5jKSwKKwkocHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciksIChtYWtlX2Z1bGxfcGF0aCksIChjaGVja19maWxlX3ZhbGlkKSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0KToKKwkqIGJ1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaDoKKwlBZGQgYSBzZWN1cml0eSBzZW5zaXRpdmUgc3RyaXBwZWQgZG93biBjb25maWcgcGFyc2VyIGZvciB0aGUgc2V0dWlkCisJbGF1bmNoZXIuIFRoaXMgZmlsZSBvbmx5IHJlYWRzIHdoYXQgaXQgbmVlZHMsIGFuZCBkb2Vzbid0IHRyeSB0byBkbworCWFueXRoaW5nIHJlbW90ZWx5IGNsZXZlciBsaWtlIGluY2x1ZGluZyBleHRlcm5hbCBmaWxlcy4KKwlJdCBpcyBub3QgaW50ZW5kZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZpZyBmaWxlOyBpdCBpcyBleHBlY3RlZCB0aGF0CisJY29uZmlnLXBhcnNlciB3aWxsIGRvIHRoYXQgYmVmb3JlIHRoZSBzZXR1aWQgcHJvZ3JhbSB0cmllcyB0byByZWFkIGl0LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLWNvbW1vbi5jOgorCShidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X25hbWVfdG9fdHlwZSksCisJKGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfdHlwZV90b19uYW1lKToKKwkqIGJ1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oOgorCVdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSB3aG9sZSBjb25maWcgcGFyc2VyIHdpdGggYWxsIGl0J3MgZGVwcyBpbiB0aGUKKwlzZXR1aWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBpbXBsZW1lbnQgYSBzdHJpcHBlZCBkb3duIGNvbmZpZyBwYXJzZXIganVzdAorCWZvciB0aGUgbGF1bmNoZXIsIGFuZCB0byBkbyBzbyBJIG5lZWQgc29tZSBjb21tb24gZnVuY3Rpb25zIGFuZAorCWRlZmluZXM7IGFkZCB0aGVtIGhlcmUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOgorCShfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzKToKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOgorCVByb3ZpZGUgYSB3YXkgdG8gZ2V0IHRoZSBzdGFuZGFyZCBzeXN0ZW0gc2VydmljZWRpcnMsIGp1c3QgbGlrZSB3ZSBkbworCWZvciB0aGUgc2Vzc2lvbiBzZXJ2aWNlIGRpcnMuIFRoZXNlIHNob3VsZCBiZSBzZXBvcmF0ZSwgYXMgdGhlcmUgbWF5CisJYmUgYSBzZWN1cml0eSBpc3N1ZSBzdGFydGluZyB1cCBzb21lIHNlc3Npb24gc3R1ZmYgYXMgcm9vdC4KKwlUaGUgdXNlLWNhc2UgZm9yIHRoZSBzYW1lIGJpbmFyeSBzdGFydGluZyB1cCBwZXItc3lzdGVtIF9hbmRfCisJcGVyLXNlc3Npb24gaXMgYWxzbyBub3QgdmFsaWQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46CisJQWRkIHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyBhbmQgc2VydmljZWhlbHBlciBpbnRvIHRoZSBtYW4gZmlsZQorCWFuZCBleHBsYWluIHdoYXQgZWFjaCBkb2VzLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGRvYy9idXNjb25maWcuZHRkOgorCUFkZCBzZXJ2aWNlaGVscGVyIGludG8gdGhlIGR0ZCwgaXQgd2lsbCBzb29uIGJlIGEgdmFsaWQgcGFydCBvZiB0aGUKKwljb25maWcgZmlsZS4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYzogKHJlYWRfZGF0YSksCisJKF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzKToKKwkqIGRidXMvZGJ1cy1zcGF3bi5oOgorCUFkZCBhIGZ1bmN0aW9uIHNvIHdlIGNhbiBnZXQgYWNjZXNzIHRvIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGF1bmNoCisJaGVscGVyLgorCUJ5IHByb3ZpZGluZyB0aGUgcmV0dXJuIGNvZGUgYW5kIG5vdCB0aGUgZXJyb3Igd2UgY2FuIGxlYXZlIHRoZQorCSd3aGF0IGRvZXMgdGhpcyBtZWFuPycgdG8gdGhlIGJ1cyBsYXVuY2ggY29kZSBhbmQgbm90IGluY2x1ZGUgaXQgaW4gdGhlCisJZGJ1cyBkaXJlY3RvcnkuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oOgorCUFkZCBkZWZpbmVzIHdoaWNoIHNwZWNpZnkgdGhlIG91dHB1dCBjb2RlcyBvZiB0aGUgbGF1bmNoIGhlbHBlci4KKwlXZSBoYXZlIHRvIHVzZSBleGl0IGNvZGVzIGFzIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHdlIGNhbiByZXR1cm4gZmFpbHVyZQorCXR5cGUgd2l0aG91dCBnb2luZyBncm90dHkgdGhpbmdzIGxpa2UgcmVkaXJlY3RpbmcgcG9zc2libHktbm9uc2VjdXJlCisJc3RkZXJyIGludG8gdGhlIGVycm9yLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBuZXcgZXJyb3IgbmFtZXMgbmVlZGVkIGZvciB0aGUgbGF1bmNoIGhlbHBlci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfY2xlYXJlbnYpOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwlBZGQgYSB3cmFwcGVyIGZvciBjbGVhcmVudi4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0OgorCUFkZCBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBzeXN0ZW0gYWN0aXZhdGlvbiBwYXJ0cy4gSSdsbCBzaG9ydGx5IGJlCisJY29tbWl0dGluZyBtYW55IHBhdGNoZXMgdGhhdCBhZGQgc3lzdGVtIGFjdGl2YXRpb24gdXNpbmcgYSBzZXR1aWQKKwlsYXVuY2hlciBpbnRvIENWUywgc28gZXhwZWN0IHRoaW5ncyB0byBiZSBicm9rZW4gZm9yIGEgZmV3IGhvdXJzLgorCisyMDA3LTA3LTE5ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4uY21ha2U6IGZpeGVkIGNvbW1lbnQKKwkqIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTjMyLmNtYWtlOiByZW1vdmVkIG9ic29sYXRlIGNtYWtlIG1vZHVsZQorCisyMDA3LTA3LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQpCisJKGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSk6IGRvbid0IG1lc3Mgd2l0aCBtZXNzYWdlIGZyb20KKwltZXNzYWdlIGNhY2hlIG91dHNpZGUgb2YgdGhlIGNhY2hlIGxvY2suIEJ1ZyAjOTE2NCBmcm9tIEpvbmF0aGFuCisJTWF0dGhldy4KKworMjAwNy0wNy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEFkZCBpbmRlbnQtdGFicy1tb2RlOiBuaWwgdG8gYWxsIGZpbGUgaGVhZGVycy4KKworMjAwNy0wNy0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfc3lzZGVwc190ZXN0KTogaW52ZXJ0IHRoZSB0ZXN0CisJZm9yIHBhcnNpbmcgaGV4IGFzIGRvdWJsZSB0byBiZSBzdXJlIGl0IGZhaWxzIHRvIHdvcmsKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3RyaW5nX3BhcnNlX2RvdWJsZSk6IGRvbid0IGFsbG93IGhleCBudW1iZXJzLgorCisyMDA3LTA3LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoc3RydWN0IERCdXNDb25uZWN0aW9uKTogRml4IGZyb20gT2xpdmllcgorCUhvY2hyZXV0aW5lciB0byBhdm9pZCB0cnlpbmcgdG8gcHJvdGVjdCBpbmRpdmlkdWFsIGJpdHMgaW4gYSB3b3JkCisJd2l0aCBkaWZmZXJlbnQgbG9ja3MgKG1ha2UgZGlzcGF0Y2hfYWNxdWlyZWQgYW5kIGlvX3BhdGhfYWNxdWlyZWQKKwlkYnVzX2Jvb2xfdCByYXRoZXIgdGhhbiBiaXRmaWVsZHMpCisKKzIwMDctMDctMDkgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLGRidXMtc3lzZGVwcy13aW4uaCxkYnVzLXN5c2RlcHMtd2luLXV0aWwuYywKKwlkYnVzLXN5c2RlcHMtc3Bhd24td2luLmM6IHN5bmNlZCB3aXRoIHdpbmRidXMgc291cmNlcyAKKworMjAwNy0wNy0wNyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgCisJCShfZGJ1c19nZXRzaWQpOiByZW1vdmUgdW51c2VkIGp1bXAgbGFiZWwKKwkJKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KTogX2RidXNfc3RyaW5nX2luaXQgY291bGQgZmFpbCwgCisJICAgICAgICBjaGVjayBpbml0aWFsaXNhdGlvbgorCQkoX2RidXNfZ2V0X3dvcmtpbmdfZGlyLCBfZGJ1c19pbml0X3dvcmtpbmdfZGlyKTogcmVtb3ZlIHVudXNlZCAKKwkJCWZ1bmN0aW9ucworCisyMDA3LTA3LTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4uY21ha2U6IHNlYXJjaCBpbiA8cHJvZ3JhbSBmaWxlcyBkaXI+XHdpbjMybGlicyAKKwlmb3Igd2luZG93cyBzdXBwbGVtZW50YXJ5IHBhY2thZ2VzIHRvbworCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0OiBoYW5kbGUgdXNlcmRiIGFzIHVuaXggZmlsZQorCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyxkYnVzL2RidXMtc3lzZGVwcy13aW4uaDogcmVtb3ZlZCBvYnNvbGF0ZSAKKwlEQnVzVXNlckluZm8gY29kZQorCisyMDA3LTA2LTMwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZGFlbW9uX2luaXQpOiByZWR1Y2VkIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMDctMDYtMjMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiBhZGRlZCBVTklYX09OTFkgYW5kIAorCVdJTl9PTkxZIGNvbW1hbmRzIGZvciBhdXRoIHNjcmlwdHMKKwkqIHRlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQ6IGxpbWl0IGV4ZWN1dGlvbiB0byB1bml4CisKKzIwMDctMDYtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnBvcnQuYyAoYXV0aF92aWFfZGVmYXVsdF9ydWxlcyk6IG1hZGUgdGhlIHZlcmJvc2Ugc3BhbQorCWNyb3NzLXBsYXRmb3JtCisKKzIwMDctMDYtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9nZXRfZmQpOiAxKSBpdHMgYmVoYXZpb3Igc2hvdWxkCisJbm90IGJlIHRoZSBzYW1lIGFzIGJlZm9yZSwgdGhlIEFCSSBoYXMgbmV2ZXIgYmVlbiBkZWNsYXJlZCBzdGFibGUKKwlvbiBXaW5kb3dzIGFuZCAyKSBkbyBub3QgY29tbWl0IHRvIGNyb3NzLXBsYXRmb3JtIGZpbGVzIHdpdGhvdXQKKwlwb3N0aW5nIHRoZSBleGFjdCBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0CisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGFzIEkgaGF2ZSBwb2ludGVkCisJb3V0IGJlZm9yZSwgZWl0aGVyIDB4ZmYgbmVlZHMgdG8gd29yayBvbiBib3RoIHBsYXRmb3Jtcywgb3Igbm9uZQorCW9mIHRoZSBkYnVzIGNvZGUgY2FuIHJlbHkgb24gaXQgd29ya2luZy4gVGhhdCBtZWFucyB0aGUgb3B0aW9ucworCWFyZSAxKSBhdWRpdCB0aGUgY29kZSBmb3IgYW55d2hlcmUgdGhhdCByZWxpZXMgb24gMHhmZiB3b3JraW5nLCBpZgorCW5vbmUgZm91bmQgaWRlYWxseSBhZGQgYSB0ZXN0IHRoYXQgaXQgKmRvZXNuJ3QqIHdvcmsgYW5kIG1ha2UgdW5peAorCXJlamVjdCBpdCBleHBsaWNpdGx5LCBidXQgaW4gYW55IGNhc2UgdGhpcyB0ZXN0IHdvdWxkIGdvIGF3YXkgb3IKKwkyKSBtYWtlIGl0IHdvcmsgb24gV2luZG93cyBhbHNvLCB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZmlndXJlIG91dCAKKwl3aGV0aGVyIHdlIHJlbHkgb24gaXQuCisKKwlBbmQgaW4gZWl0aGVyIGNhc2UsIHBvc3QgdGhlIGV4YWN0IHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgYW5kCisJZG9uJ3QganVzdCBjb21taXQuCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IGFkZGVkIFZFUlNJT05fUEFUQ0ggdG8gYmUgYWJsZSB0byAKKwlkaXN0aW5ndWlzaCB3aW4zMiBiaW5hcnkgcmVsZWFzZSBmcm9tIGRidXMgdmVyc2lvbmluZworCisyMDA3LTA2LTIxIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOiBkZWxldGVkIGxvY2FsIERCdXNDcmVkZW50aWFscyBzdHJ1Y3R1cmUKKwkgICAgKF9kYnVzX2dldHNpZCk6IG5ldyBmdW5jdGlvbgorCSAgICAoX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiB1c2VkIGNvcnJlY3QgZnVuY3Rpb24KKwkgICAgKF9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzLCAKKwkgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IGFkZGVkIHJlYWwgCisJICAgICAgICAgICAgc2lkIHJlYWRpbmcKKwkgICAgKF9kYnVzX2NyZWRlbnRpYWxzX3BhcnNlX2FuZF9hZGRfZGVzaXJlZCxfZGJ1c19wYXJzZV91aWQpOiAKKwkgICAgICAgIGRlbGV0ZWQKKworMjAwNy0wNi0yMSBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGRvbid0IGNoZWNrIAorCTB4ZmYgYXMgZmxvYXRpbmcgcG9pbnQsIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIHdpbjMyIG1hdGggCisJaW1wbGVtZW50YXRpb24KKworMjAwNy0wNi0yMSBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lLCAKKwlfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzLCBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eSk6IAorCXJlbW92ZWQgb2Jzb2xhdGUgZnVuY3Rpb25zCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIAorCWRidXMvZGJ1cy1zeXNkZXBzLXdpbi5oOiBkaXNhYmxlZCB1aWQvc2lkIGNvbnZlcnNhdGlvbiBzdHVmZgorCWltcGxlbWVudGF0aW9uIGJ5IFBldGVyIEt1ZW1tZWwgCisKKzIwMDctMDYtMjEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9mZCk6IHRoaXMgZnVuY3Rpb24gaXMgCisJZGVwcmVjYXRlZCBhbmQgaXRzIGJlaGF2aW9yIHNob3VsZCBiZSBhcyBiZWZvcmUgdW50aWwgYWxsIAorCWNsaWVudCBjb2RlIGlzIG1pZ3JhdGVkLiAKKworMjAwNy0wNi0xOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYywgdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmM6IAorCW1zdmM3LjEgZml4ZXMgYnkgSmFyb3NsYXcgU3RhbmllayB0ZXN0ZWQgd2l0aCBtaW5ndyAKKworMjAwNy0wNi0xOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXNwYXduLXdpbi5jLCAKKwlkYnVzL2RidXMtc3lzZGVwcy13aW4uaDogZGlzYWJsZWQgREJ1c1NvY2tldCBpbXBsZW1lbnRhdGlvbgorCWJ5IFBldGVyIEt1ZW1tZWwgCisKKzIwMDctMDYtMTggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIG9ic29sYXRlIHBhdGNoZXMKKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYnVtcCB2ZXJzaW9uIHRvIDEuMS4yIHNvIENWUyBpcyBoaWdoZXIgdGhhbiBsYXN0CisJcmVsZWFzZSAodGhpcyBpcyBub3QgdGhlIDEuMS4yIHJlbGVhc2UpCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlIDEuMS4xCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZG9jdW1lbnQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQoKQorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9pZCk6IGltcGxlbWVudCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRJZCgpCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogZ2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggYnVzIGNvbnRleHQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXRfaWQpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9nZXRfaWQpOiBuZXcgZnVuY3Rpb24KKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiBjbGVhbgorCXRoaXMgdXAgYSBsaXR0bGUgYml0LCB0byB0cnkgYW5kIHVuZGVyc3RhbmQgd2h5IHRlbG5ldCdpbmcgdG8gYQorCXNlcnZlciBhbmQgc2VuZGluZyBhIG5vbi1udWwgYnl0ZSBkaWRuJ3QgZGlzY29ubmVjdCBpbW1lZGlhdGVseTsKKwlub3cgaXQgc2VlbXMgdGhhdCBpdCBkb2VzIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkgYXMgaXQgc2hvdWxkLAorCXRob3VnaCBJIGRvbid0IHVuZGVyc3RhbmQgd2hhdCBoYXMgY2hhbmdlZC4KKworMjAwNy0wNi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9zb2NrZXQpCisJKGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQpOiBuZXcgQVBJIHRvIG1hdGNoIERCdXNDb25uZWN0aW9uCisJKGRidXNfd2F0Y2hfZ2V0X2ZkKTogZGVwcmVjYXRlIHRoaXMKKworCVRocm91Z2hvdXQ6IGp1c3Qgcy9kYnVzX3dhdGNoX2dldF9mZC9kYnVzX3dhdGNoX2dldF9zb2NrZXQvZyBmb3IKKwlub3cgc2luY2UgYWxsIHRoZSB0cmFuc3BvcnRzIHVzZSBzb2NrZXRzIGFueXdheQorCQorMjAwNy0wNi0xNiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLW1hY3Jvcy5oLCBkYnVzL2RidXMtbWVzc2FnZS5jLCAKKwlkYnVzL2RidXMtbWVzc2FnZS5oOiByZW5hbWVkIERCVVNfR05VQ19ERVBSRUNBVEVEIAorCXRvIERCVVNfREVQUkVDQVRFRCBhbmQgZXh0ZW5kZWQgdG8gbXN2YyBjb21waWxlcgorCisyMDA3LTA2LTE1ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9DTWFrZUxpc3RzLnR4dDogdXNlIGxvY2FsIGluY2x1ZGUgaGVhZGVyIGZpcnN0CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOiBtaW5ndyBmaXggb2YgREJ1c0NyZWRlbnRpYWwgc3RydWN0CisKKzIwMDctMDYtMTUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSxjbWFrZS9jb25maWcuaC5jbWFrZTogCisJYWRkZWQgY2hlY2sgZm9yIEhBVkVfRVJSTk9fSAorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0OiBhZGRlZCBtaXNzaW5nIGZpbGVzIAorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYy8uaDogbmV3IGZpbGVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLC5oOiBhZGRlZCByZXF1aXJlZCBfdW5peCBmdW5jdGlvbnMgCisJdG8gbWFrZSBkYnVzIGNvbXBpbGFibGUgb24gd2luMzIgCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdXRpbHMuYywuaDogbW92ZWQgc29tZSBmdW5jdGlvbnMgdG8gCisJZGJ1cy1zeXNkZXBzLXdpbi5jCisJCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBhcHBsaWVkIG9yIG9ic29sYXRlIHBhdGNoZXMKKwkKKwlOb3RlOiBkYnVzLXdpbjMyIGlzIG5vdyBjb21waWxhYmxlLCBubyBndWFyYW50ZWUgdGhhdCBpdCBydW5zIAorCXdpdGhvdXQgYW55IHByb2JsZW1zIAorCisyMDA3LTA2LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSkKKwkoX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSk6IG5ldyBmdW5jdGlvbnMKKworCSogYnVzL21haW4uYyAobWFpbik6IHVzZSBfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlKCkgYW5kIAorCV9kYnVzX2FwcGVuZF9zZXNzaW9uX2NvbmZpZ19maWxlKCkKKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBtb3ZlIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFIGFuZAorCURCVVNfU0VTU0lPTl9DT05GSUdfRklMRSBpbnRvIHRoaXMgbWFrZWZpbGUKKworMjAwNy0wNi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NldF9lcnJub190b196ZXJvKQorCShfZGJ1c19nZXRfaXNfZXJybm9fbm9uemVybywgX2RidXNfZ2V0X2lzX2Vycm5vX2VpbnRyKQorCShfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vKTogZmFtaWx5IG9mIGZ1bmN0aW9ucyB0byBhYnN0cmFjdAorCWVycm5vLCB0aG91Z2ggdGhlc2UgYXJlIHNvbWV3aGF0IGJvZ3VzIChyZWFsbHkgd2Ugc2hvdWxkIG1ha2Ugb3VyCisJc29ja2V0IHdyYXBwZXJzIG5vdCB1c2UgZXJybm8gcHJvYmFibHkgLSB0aGUgaXNzdWUgaXMgdGhhdCBhbnkKKwl1c2FnZSBvZiBlcnJubyB0aGF0IGlzbid0IHNvY2tldC1yZWxhdGVkIHByb2JhYmx5IGlzIG5vdAorCWNyb3NzLXBsYXRmb3JtLCBzbyBzaG91bGQgZWl0aGVyIGJlIGluIGEgdW5peC1vbmx5IGZpbGUgdGhhdCBjYW4KKwl1c2UgZXJybm8gZGlyZWN0bHksIG9yIGlzIGEgYnVnIC0gdGhlc2UgZ2VuZXJhbCBlcnJubyB3cmFwcGVycworCWhpZGUgaXNzdWVzIG9mIHRoaXMgbmF0dXJlIGluIG5vbi1zb2NrZXQgY29kZSwgd2hpbGUKKwlzb2NrZXQtc3BlY2lmaWMgQVBJIGNoYW5nZXMgd291bGQgbm90IHNpbmNlIHNvY2tldHMgYXJlIGFsbG93ZWQKKwljcm9zcy1wbGF0Zm9ybSkKKworMjAwNy0wNi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQpOiBtb3AgdXAKKwlnZXRwaWQoKSAobm90aWNlZCBieSBQZXRlciBLw7xtbWVsKSBhbmQgYWRhcHQgdGhlIHRlc3QgdG8gCisJZXhwZWN0IGEgInBpZCB1bmtub3duIiBlcnJvciB3aGVuIHJ1bm5pbmcgb24gV2luZG93cy4KKworMjAwNy0wNi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfY3JlZGVudGlhbHNfcGFyc2VfYW5kX2FkZF91c2VyKToKKwlkZWxldGUgdGhpcyBmdW5jdGlvbiBzaW5jZSBpdCB3YXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMKKwlfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VybmFtZSgpCisKKzIwMDctMDYtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiBhZGFwdCB0byBrZXlyaW5nIGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogY2hhbmdlIHRvIGF2b2lkIHVzaW5nIHVzZXIgSUQgYW5kIGhvbWUKKwlkaXJlY3RvcnkgZGlyZWN0bHk7IGluc3RlYWQgdXNlIGEKKwlrZXlyaW5nLWxvY2F0aW9uLWZyb20tY3JlZGVudGlhbHMgZnVuY3Rpb24gaW4gZGJ1cy1zeXNkZXBzCisKKwkqIGZpeCB0byB1c2UgX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MoKSBpbnN0ZWFkIG9mIAorCV9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzKCkgb3IgX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHkoKS4KKwkKKzIwMDctMDYtMTQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHJldmVydGVkIGdsb2JhbCByZW5hbWUgb2YgZnVuY3Rpb24gX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MuIAorCUl0IG5lZWRzIHRvbyBtdWNoIHRlc3RzIHRvIHZlcmlmeSB0aGF0IHRoZSBjaGFuZ2UgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcuIAorCUkgaGFkIG92ZXJzZWVuIHRoYXQgdGhlIHNpZ25hdHVyZXMgYXJlIGRpZmZlcmVudCBhbmQgcmVxdWlyZXMgbm9uCisJdHJpdmlhbCBjaGFuZ2VzLiAKKwlUaGlzIGlzIG9uZSAqbWFqb3IqIGRpc2FkdmFudGFnZSBvZiBlbXVsYXRpbmcgb29wIGZ1bmN0aW9uYWxpdHkgd2l0aCBjLiAKKwlZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyBldmVyeSBvYmplY3Qgb24gZXZlcnkgZnVuY3Rpb24gcmV0dXJuIHBvaW50CisJd2hpY2ggY291bGQgYmUgYSBuaWdodG1hcmUgaWYgeW91IGFyZSBub3Qgd29ya2luZyB3aXRoIGRidXMgYWxsIHRoZSBkYXlzLgorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICAgIAorCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Nvb2tpZV9zaGExX21lY2gpOiAKKwlmaXhlZCB1c2FnZSBvZiBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eSgpCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmggKF9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzKTogcmVtb3ZlZCBwcm90b3R5cGUKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgICAKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IG1vdmVkIGdsb2JhbCBsb2NrIHN5c3RlbV91c2VycyBmcm9tIGRidXMtdXNlcmRiLmMKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgICAKKwkqIGdsb2JhbCByZW5hbWUgb2YgZnVuY3Rpb24gX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MKKwl0byBfZGJ1c19hcHBlbmRfZGVzaXJlZF9pZGVudGl0eS4gCisJQXBwcm92ZWQgYnkgSGF2b2MgUGVubmluZ3RvbgorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYzogZGlzYWJsZWQgREJ1c1VzZXJJbmZvIHJlbGF0ZWQgY29kZQorCQkoX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHksCV9kYnVzX3dpbmRvd3NfdXNlcl9pc19wcm9jZXNzX293bmVyKToKKyAgICAJCW5ldyB3aW4zMiBmdW5jdGlvbnMgYXMgY291bnRlcnBhcnQgb2YgdW5peCByZWxhdGVkIAorCQkoX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQsX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQpOiAKKwkgICAgCXJlbmFtZWQgZnJvbSAuLi5fdW5peF9zb2NrZXQKKwkJKF9kYnVzX3NlbmRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiByZW1vdmVkIG9ic29sYXRlIGZ1bmN0aW9uCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdXRpbC5jOiBkaXNhYmxlZCBEQnVzR3JvdXBJbmZvIHJlbGF0ZWQgY29kZQorCQkoX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyLF9kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlcik6IAorCQkgICAgbmV3IHdpbjMyIGZ1bmN0aW9ucyBhcyBjb3VudGVycGFydCBvZiB1bml4IHJlbGF0ZWQKKwkKKzIwMDctMDYtMTQgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogc2F5IHRoZSBwcm90b2NvbCB2ZXJzaW9uIGlzIDEgaW5zdGVhZCBvZgorCTAgKHBhdGNoIGZyb20gS3Jpc3RvZmZlciBMdW5kw6luLCBmZC5vIzEwMDMzKSBhbmQgcmVtb3ZlIHRoZSBGSVhNRQorCWFib3V0IHJlbW92aW5nIHByb3RvY29sIHZlcnNpb24gZnJvbSBtZXNzYWdlcyAoYXMgcGVyIEhhdm9jJ3MgY29tbWVudAorCW9uIHRoYXQgYnVnKQorCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfcGlkX2Zvcl9sb2csX2RidXNfZmx1c2hfY2FjaGVzKTogCisJbmV3IHdpbjMyIGZ1bmN0aW9ucyBhcyBjb3VudGVycGFydCBvZiB1bml4IHJlbGF0ZWQKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKwkKKwkqIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTi5jbWFrZSwKKwkgIGNtYWtlL21vZHVsZXMvRmluZEtERVdJTl9QYWNrYWdlci5jbWFrZSwgCisJICBjbWFrZS9tb2R1bGVzL1dpbjMyTWFjcm9zLmNtYWtlOiBuZXcgZmlsZXMgZnJvbSB0aGUgCisJICBrZGV3aW4zMiBwcm9qZWN0CisJKiBjbWFrZS9DTWFrZUxpc3RzLnR4dDogY2xlYW5lZCBzdXBwb3J0IGZvciBrZGV3aW4gaW5zdGFsbGVyIGFuZCAKKwkgIHdpbjMyIGV4cGxvcmVyIHdyYXBwZXIKKworMjAwNy0wNi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcik6IEZpeAorCWJyb2tlbiByZXR1cm5faWZfZmFpbCAoa2luZCBvZiBzY2FyeSB0aGF0IHRlc3Qgc3VpdGUgZG9lcyBub3QKKwljb3ZlciB0aGlzKQorCisyMDA3LTA2LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYyAoX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQpOiBzdXBwb3J0CisJYWxsX2ludGVyZmFjZXM9dHJ1ZXxmYWxzZSBmb3IgdGNwIHNlcnZlcnMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IHN1cHBvcnQKKwlpbmFkZHJfYW55IGZsYWcKKworCSogYnVzL3NlbGludXguYzogZml4IHNvbWUgbWlzc2luZyBpbmNsdWRlcworCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCk6IGFsbG93CisJcG9ydCB0byBzaW1wbHkgYmUgb21pdHRlZCBpbiBhZGRpdGlvbiB0byBzcGVjaWZ5aW5nIDAKKworMjAwNy0wNi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYywgYnVzL3NlbGludXguYywgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC11dGlsLmM6IGFkZAorCWxpYmF1ZGl0IHN1cHBvcnQsIG5vIGNsdWUgd2hhdCB0aGlzIG1lYW5zIHJlYWxseSBidXQgbm93IHdlIGhhdmUKKwlpdC4gUGF0Y2hlcyBmcm9tIEZlZG9yYSBwYWNrYWdlLgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IG1vdmUgc2VsaW51eCBpbml0aWFsaXphdGlvbiBhZnRlcgorCWNoYW5naW5nIHRvIGRhZW1vbiB1c2VyLCBwYXRjaCBmcm9tIEZlZG9yYSBwYWNrYWdlCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoYXV0aF92aWFfdW5peF91c2VyX2Z1bmN0aW9uKTogZml4IGEgdHlwbworCisyMDA3LTA2LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIpOiBpbXByb3ZlCisJdGhlIGNoZWNrcy93YXJuaW5ncyBmb3IgY29udGFpbmVkX3NpZ25hdHVyZSBhIGJpdAorCisyMDA3LTA2LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jICh3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUpOgorCWltcHJvdmUgdGhlIHdhcm5pbmcgYSBiaXQgaWYgeW91IHdyaXRlIGV4dHJhIGRhdGEgaW50byBhIG1lc3NhZ2UKKworMjAwNy0wNi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHNoYTFfaGFuZGxlX3NlY29uZF9jbGllbnRfcmVzcG9uc2UpCisJKGhhbmRsZV9zZXJ2ZXJfZGF0YV9hbm9ueW1vdXNfbWVjaCk6IGFkZCB0aGUgcHJvY2VzcyBJRCBmcm9tCisJc29ja2V0IGNyZWRlbnRpYWxzLCBpZiBhdmFpbGFibGUsIGV2ZW4gaWYgbm90IHVzaW5nIEVYVEVSTkFMCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoYXV0aF92aWFfZGVmYXVsdF9ydWxlcyk6IHN1cHBvcnQKKwlhbGxvd19hbm9ueW1vdXMgZmxhZworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cykKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMpOiBuZXcgQVBJIGZvciBjb250cm9sbGluZworCWFub255bW91cyBhY2Nlc3MKKworMjAwNy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKTogZml4IHRoaXMgbm90IHRvCisJdGhpbmsgYW4gZW1wdHkgbGluZSBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCUFsc28sIGZpeCBzb21lIHdoaXRlc3BhY2UuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmctdXRpbC5jOiBhZGQgbW9yZSB0ZXN0cyBmb3IKKwlfZGJ1c19zdHJpbmdfcG9wX2xpbmUoKSByZXZlYWxpbmcgdGhhdCBpdCB0aGlua3MgYW4gZW1wdHkgbGluZSBpcworCXRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoIGJyb2tlIGRidXMtYXV0aC1zY3JpcHQuYyBzbyAKKwlpdCBkaWRuJ3QgcmVhbGx5IHJ1biB0aGUgc2NyaXB0cworCisJKiBkYnVzL2RidXMtYXV0aC5jOiBhZGQgQU5PTllNT1VTIG1lY2hhbmlzbQorCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogZml4IHRvIGRldGVjdAorCWFuIGVtcHR5L25vLW9wIGF1dGggc2NyaXB0OyBhZGQgY29tbWFuZHMgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG9yCisJZG9uJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgY3JlZGVudGlhbHMJCisKKzIwMDctMDYtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kpOiBncmFjZWZ1bGx5CisJY29udGludWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIG5vIHVuaXggdXNlciAtIGp1c3QgZG9uJ3QgYXBwbHkgCisJYW55IHVuaXggdXNlciBkZXBlbmRlbnQgcnVsZXMuCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHJlbW92ZSBkYnVzLXVzZXJkYi5oIHVzYWdlCisKKwkqIGJ1cy9idXMuYzogcmVtb3ZlIGRidXMtdXNlcmRiLmggdXNhZ2UKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCXN1cHBvcnQgV2luZG93cyB1c2VyIGZ1bmN0aW9uOyBhbHNvLCBmaXggdGhlIGxvZ2ljIGZvciBjaGVja2luZworCWF1dGggYXMgcm9vdCBpbiB0aGUgZGVmYXVsdCBhdXRoIGNvZGUgKGJyb2tlbiBpbiB0aGUgcHJldmlvdXMKKwljb21taXQpCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24pOiBuZXcgZnVuY3Rpb24KKwkoZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIpOiBuZXcgZnVuY3Rpb24KKworMjAwNy0wNi0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQpOiBhZGFwdAorCXNpbmNlIHN5c2RlcHMtdW5peC5oIHN0dWZmIGlzbid0IGluY2x1ZGVkIGFueW1vcmUKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiB1c2UgbW9yZSBhYnN0cmFjdCBmdW5jdGlvbnMgdG8KKwljaGFuZ2UgdXNlciwgc28gdGhleSBjYW4gYmUgbm8tb3BzIG9uIFdpbmRvd3MKKworCSogZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMsIGRidXMvZGJ1cy1jcmVkZW50aWFscy5oLAorCWRidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmM6IG5ldyBmaWxlcyBjb250YWluaW5nIGEgZnVsbHkgb3BhcXVlCisJREJ1c0NyZWRlbnRpYWxzIGRhdGEgdHlwZSB0byByZXBsYWNlIHRoZSBvbGQgbm90IG9wYXF1ZSBvbmUuCisKKwkqIGNvbmZpZ3VyZS5pbiAoREJVU19VTklYKTogZGVmaW5lIERCVVNfVU5JWCB0byBtYXRjaCBEQlVTX1dJTiBvbgorCXdpbmRvd3MKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5oOiBwcm9oaWJpdCBvbiBXaW5kb3dzLCBuZXh0IHN0ZXAgaXMgdG8gY2xlYW4KKwl1cCB0aGUgdXNlcyBvZiBpdCBpbiBidXMvKi5jIGFuZCBmYWN0b3Igb3V0IHRoZSBwYXJ0cyBvZiAKKwljb29raWUgYXV0aCB0aGF0IGRlcGVuZCBvbiBpdAorCQorMjAwNy0wNi0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGltcHJvdmUgc29tZSBkb2NzIHJlbGF0ZWQgdG8gcmVhZGluZyB2YWx1ZXMKKwlmcm9tIGEgbWVzc2FnZSBpdGVyCisKKzIwMDctMDYtMDIgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlOiBhZGRlZCBjeWd3aW4gY29tcGlsZSBzdXBwb3J0CisKKzIwMDctMDYtMDEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXdpbi5jOiBuZXcgZmlsZSwgcmVwbGFjZXMgc2NyaXB0IHdyYXBwZXIgb24gd2luMzIuCisKKwkqIGNtYWtlL2RidXMtbGF1bmNoLmJhdC5jbWFrZTogcmVtb3ZlZCBvYnNvbGF0ZSBmaWxlCisKKzIwMDctMDUtMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiB1c2VzIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKCkgdG8gZGV0ZWN0IAorCXNlc3Npb24uY29uZiBsb2NhdGlvbiBvbiB3aW4zMi4gCisKKwkqIGRidXMtc3lzZGVwcy13aW4uaCAoX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUsX2RidXNfZmlsZV9leGlzdHMpOiAKKwluZXcgcHJvdG90eXAsIHVuZGVmaW5lZCBpbnRlcmZhY2UgYWZ0ZXIgaW5jbHVkaW5nIHdpbmRvd3MuaCBiZWNhdXNlIAorCWl0IG1ha2VzIHRyb3VibGUgd2hlbiBhIHBhcmFtYXRlciBpcyBuYW1lZCBpbnRlcmZhY2UuCisKKwkqIGRidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfZ2V0X2luc3RhbGxfcm9vdCwKKwlfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZSxfZGJ1c19maWxlX2V4aXN0cyk6IAluZXcgZnVuY3Rpb25zLgorCisyMDA3LTA1LTI3ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvcG9saWN5LmMsZGJ1cy9kYnVzLWludGVybmFscy5jOiBmaXhlZCBpbmNvbnNpc3RhbnQgbGluZSBlbmRpbmdzIAorCWFzIHJlcG9ydGVkIGJ5IFBldGVyIEvDvG1tZWwuCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMS4wCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFNwbGl0IE5FV1MgYW5kIENoYW5nZUxvZyBpbnRvIGEgLnByZS0xLTAgZmlsZSBhcyBwZXIgSEFDS0lORworCVdlIGZvcmdvdCB0byBkbyB0aGlzIGR1cmluZyB0aGUgMS4wIHJlbGVhc2UgYW5kIGl0IG1ha2VzIHNlbnNlCisJbm93IGFzIHdlIGdldCByZWFkeSB0byByZWxlYXNlIHRoZSBmaXJzdCAxLjEuMCBkZXZlbG9wbWVudCB0YXJiYWxsCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNyZWF0ZSBkaXJlY3RvcnkgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmQgc28gdGhhdAorCW1ha2UgY2hlY2sgcGFzc2VzCisKKzIwMDctMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIElOU1RBTEw6IHJlbW92ZSBkZXBlbmRhbmNpZXMgZm9yIGJpbmRpbmdzIHNpbmNlIHRoZXkgbm8gbG9uZ2VyCisJYXJlIGEgcGFydCBvZiBjb3JlCisKKzIwMDctMDUtMjUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItd2luLmMsZGJ1cy9kYnVzLXNlcnZlci13aW4uaDogbmV3IGZpbGUgCisJd2l0aCBlbXB0eSBmdW5jdGlvbiBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljKCkuIAorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGxpc3Rlbl9mdW5jcyk6IHVzZXMgCisJX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyBvbiBhbnkgcGxhdGZvcm0uCisKKzIwMDctMDUtMjUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChmaWxsX3dpbl91c2VyX2luZm9faG9tZWRpcik6IG5vdCBnZXR0aW5nIAorCXVzZXIgaW5mbyBmcm9tIGEgZG9tYWluIGNvbnRyb2xsZXIgaXNuJ3QgYW4gZXJyb3IsIHRoZSBjb21wdXRlciAKKwltYXkgcnVuIGluIGEgbm9uIGRvbWFpbiBjb250ZXh0LiAKKworMjAwNy0wNS0yNSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUpOiBmaXhlZCBhc3NlcnRhdGlvbi4KKworMjAwNy0wNS0yNCAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHRlc3Rfc2VydmljZV9kaXJfbWF0Y2hlcyk6IGZpeGVkIG9yZGVyaW5nIGZvciB1bml4LgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jICh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6IG1hZGUgYWxsb2NhdGlvbiAKKwlvZiBfcHJvZ3MgcGxhdGZvcm0gaW5kZXBlbmRlbnQuCisKKzIwMDctMDUtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogY3JlYXRlIHNlc3Npb24uZAorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBhZGQgc2Vzc2lvbi5kIGZvciB0aGUgc2Vzc2lvbiBidXMsIHNvCisJc2VjdXJpdHkgcG9saWN5IGNhbiBiZSBleHRlbmRlZAorCisyMDA3LTA1LTIyIFJhbGYuSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IGZpeGVkIGNyZWF0aW5nIG9mIFRFU1RfLi4uX0JJTkFSWSB0byBtYWtlIAorCWJ1cy10ZXN0IGFibGUgdG8gZmluZCB0aGUgYmluYXJpZXMuCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGFjaW5jbHVkZS5tNCwgY29uZmlndXJlLmluOiBJbiByZWNlbnQgYXV0b3Rvb2xzLCAke2RhdGFkaXJ9IGlzCisJZGVmaW5lZCBpbiB0ZXJtcyBvZiAke2RhdGFyb290ZGlyfSwgc28gRVhQQU5ERURfREFUQURJUiBuZWVkcyB0byBiZQorCWV4cGFuZGVkIHJlY3Vyc2l2ZWx5LiBSYXRoZXIgdGhhbiBmaXhpbmcgY29uZmlndXJlLmluIHRvIGRvIHRoaXMsIEkKKwlncmFiYmVkIHRoZSBBU19BQ19FWFBBTkQgbWFjcm8gZnJvbSBhdXRvc3RhcnMuc2YubmV0LCB3aGljaCBzZWVtcyB0byBiZQorCWNvbW1vbmx5IHVzZWQuCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHVwZGF0ZS1kYnVzLWRvY3Muc2g6IEFzc29ydGVkIGltcHJvdmVtZW50czoKKwktIERlZmF1bHQgdXNlciBpZiAkRkRVU0VSIGlzIG5vdCBzZXQgaXMgdGhlIHNzaCBkZWZhdWx0CisJICAoc2V0IGluIH4vLnNzaC9jb25maWcgb3IgYmFzZWQgb24gdGhlIGxvY2FsIHVzZXJuYW1lKSwgbm90IGEKKwkgIGhhcmQtY29kZWQgImpvaG5wIgorCS0gVGVtcG9yYXJ5IGNoZWNrb3V0IGRpcmVjdG9yeSBpcyBjcmVhdGVkIHNlY3VyZWx5IChwcmV2ZW50aW5nIHN5bWxpbmsKKwkgIGF0dGFja3MpLCBpZiBta3RlbXAoMSkgaXMgYXZhaWxhYmxlCisJLSBVc2UgbWFrZSAtQyByYXRoZXIgdGhhbiBjZCAmJiBtYWtlICYmIGNkIC4uCisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIEhBQ0tJTkc6IFBvaW50IHRvIGNvcnJlY3QgbWFpbGluZyBsaXN0CisKKzIwMDctMDUtMjEgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBTVFJJTkcgY2Fubm90CisJY29udGFpbiBlbWJlZGRlZCBOVUxzLgorCisyMDA3LTA1LTIwIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbC5jOiBmaXggaW5saW5lIHByb2JsZW0gb24gd2luMzIuCisKKzIwMDctMDUtMjAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKGZpbGxfd2luX3VzZXJfaW5mb19ob21lZGlyKTogbm90IHJlYWNoaW5nIAorCWRvbWFpbiBjb250cm9sbGVyIGlzbid0IGFuIGVycm9yLCBjb252ZXJ0ZWQgZXJyb3IgbWVzc2FnZSB0byB2ZXJib3NlIAorCW1lc3NhZ2UuCisKKzIwMDctMDUtMTkgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXRlc3QuYyAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IGRpc2FibGVkIAorCXRlc3RzIG5vdCBydW5uaW5nIG9uIHdpbmNlLgorCisyMDA3LTA1LTE5IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9pbml0KTogd2luMzIgcmVxdWlyZXMgJ3Zhcm5hbWU9JyAKKwl0byB1bnNldCBhIGVudmlyb25tZW50IHZhcmlhYmxlLiAKKworMjAwNy0wNS0xOSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRlbnYpOiB3aW4zMiByZXF1aXJlcyAndmFybmFtZT0nIAorCXRvIHVuc2V0IGEgZW52aXJvbm1lbnQgdmFyaWFibGUuIAorCisyMDA3LTA1LTE5IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSk6IAorCXdpbjMyIHRlbXBvcmFyeSBmaXggdW50aWwgdGhlIHVzZXJkYiBzdHVmZiBpcyBwb3J0ZWQgY29tcGxldGx5LgorCisyMDA3LTA1LTE5ICBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGxpc3Rlbl9mdW5jcyk6IAorCV9kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgaXMgZW1wdHkgb24gd2luMzIsIAorCWxpbWl0ZWQgdG8gdW5peCBvbmx5LgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKHZhbGlkX2FkZHJlc3Nlcyk6IGxpbWl0IHVuaXggCisJb25seSBhZGRyZXNzZXMgdG8gdW5peC4gCisKKzIwMDctMDUtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIGEgR2V0QWxsIHRvIHRoZSBQcm9wZXJ0aWVzCisJaW50ZXJmYWNlLgorCisyMDA3LTA1LTE3IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgCisJKiBidXNcY29uZmlnLXBhcnNlci5jICh0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyk6CisJd2luMzIgZml4LgorCisyMDA3LTA1LTE3IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBjb25zdGFudCBEQlVTX1VOSVguCisKKzIwMDctMDUtMTQgIFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQpOgorCWNvbXBpbGUgZml4IGZvciBNUyBQbGF0Zm9ybSBTREsgNiAKKwlwYXRjaCBmcm9tIE1pY2hhZWwgTHVzY2hhcyA8bWx1c2NoYXNAZ21haWwuY29tPgorCisyMDA3LTA1LTEwICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtMS5wYy5pbjogYWRkIGRhZW1vbmRpciB0byBwYyBmaWxlCisJcGF0Y2ggZnJvbSBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1bi5jb20+CisKKzIwMDctMDUtMDQgIFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBtZW50aW9uIHRoZSByZXNlcnZlZCBvLmZkLkRCdXMuTG9jYWwKKwlpbnRlcmZhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIC9vL2ZkL0RCdXMvTG9jYWwgb2JqZWN0IHBhdGg7CisJZGVzY3JpYmUgdGhlbSBhcyByZXNlcnZlZCBhbmQgZm9yYmlkIHVzaW5nIHRoZW0gaW4gYSBzZW50IG1lc3NhZ2UsCisJbWVudGlvbmluZyB0aGF0IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdGhpcyB3aWxsIGNhdXNlIHRoZQorCWNvbm5lY3Rpb24gdG8gYmUgZHJvcHBlZC4gUGF0Y2ggYXBwcm92ZWQgYnkgSGF2b2MuCisKKzIwMDctMDQtMjggIFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvOiBkb24ndCBpbnN0YWxsIHRlc3QgYXBwbGljYXRpb25zIGFuZCBzZXJ2aWNlIGZpbGVzLAorCW1vdmVkIENNQUtFX0RFQlVHX1BPU1RGSVggdG8gdG9wIGxldmVsIENNYWtlTGlzdHMudHh0CisKKzIwMDctMDQtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX29wZW5fc29ja2V0KTogZml4ICMxMDc4MSBmcm9tCisJVG9iaWFzIE55Z3JlbiwgY2hlY2tpbmcgcG9pbnRlciB0byBmZCB2cy4gMCByYXRoZXIgdGhhbiBjaGVja2luZworCXRoZSBmZCBpdHNlbGYKKworMjAwNy0wNC0yNiBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS86IGFkZGVkIGRlYnVnIHBvc3RmaXhlcyB0byBkZWJ1ZyBleGUncyBmb3IgCisJZWFzaWVyIGRlYnVnZ2luZy4KKwkqIGRidXNcZGJ1cy1zeXNkZXBzLXdpbi5jIChfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yKTogCisJcHJpbnQgZXJyb3IgY29kZSBpbiBjYXNlIG5vIHN0cmluZyBtZXNzYWdlIGlzIGF2YWlsYWJsZS4KKworMjAwNy0wNC0wNiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS11dGlsLmMsIGRidXMvZGJ1cy1tZXNzYWdlLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UuaDogQWRkIEFQSSB0byBjb252ZXJ0IGEgREJ1c01lc3NhZ2UgdG8vZnJvbSBhCisJYnl0ZSBhcnJheS4gUGF0Y2ggZnJvbSBEYWZ5ZGQgSGFycmllcyA8ZGFmeWRkLmhhcnJpZXNAY29sbGFib3JhLmNvLnVrPiwKKwlhcHByb3ZlZCBieSBIYXZvYyBQZW5uaW5ndG9uLgorCisyMDA3LTA0LTAzICBUaW1vIEhvZW5pZyAgPHRob2VuaWdAc3VzZS5kZT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19wYXJzZV9hZGRyZXNzKTogRG8gbm90IGFjY2VwdCB6ZXJvLQorCSAgbGVuZ3RoIGFkZHJlc3MuCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChfZGJ1c19hZGRyZXNzX3Rlc3QpOiBBZGQgdGVzdCBmb3IgemVyby0KKwkgIGxlbmd0aCBhZGRyZXNzLgorCisyMDA3LTAzLTI1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQ6IGRlYnVnIHBvc3RmaXggYWxzbyBmb3IgbWluZ3cuCisKKzIwMDctMDMtMTYgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvbW9kdWxlcy9GaW5kRXhwYXQuY21ha2U6IGZpeCBwYWNrYWdlIGRldGVjdGlvbiBvbiB3aW4zMi4KKworCSogUkVBRE1FLndpbjogdXBkYXRlIGluc3RhbGwgaW5zdHJ1Y3Rpb25zLiAKKworMjAwNy0wMy0xNiBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oIChfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kKToKKwluZXcgcHJvdG90eXAKKwkoX0RCVVNfUEFUSF9TRVBBUkFUT1IpOiBuZXcgbWFjcm8uIAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kKTogbWVyZ2VkIAorCWZyb20gZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIGFuZCBkYnVzL2RidXMtc3lzZGVwcy13aW4uYy4gCisKKzIwMDctMDMtMTUgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYywgYnVzL3BvbGljeS5jLCAgCisJYnVzL3BvbGljeS5oLCBidXMvZGJ1cy1kYWVtb24uMS5pbiwKKwlidXMvc2Vzc2lvbi5jb25mLmluOiBhZGRlZCBlYXZlc2Ryb3Agc3VwcG9ydCAKKwlmb3IgcmVwbGllcyAtIHBhdGNoIGJ5IG9sbGkuc2FsbGkgYXQgY29sbGFib3JhLmNvLnVrCisJYXBwcm92ZWQgYnkgSGF2b2MgUGVubmluZ3Rvbi4gCisKKzIwMDctMDMtMTUgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1c1xkYnVzLXN5c2RlcHMtd2luLXRocmVhZC5jOiByZW5hbWVkIHRvIAorCWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmMsIGl0IGlzIGEgcGxhdGZvcm0gZGVwZW5kaW5nIGZpbGUgCisJc2ltaWxhcgl0byBkYnVzLXN5c2RlcHMtcHRocmVhZC5jLgorCisyMDA3LTAzLTE1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlXGRvY1xDTWFrZUxpc3RzLnR4dDogYWRkZWQgcHJlbGltYXJ5IHhtbCBkb2MgCisJc3VwcG9ydCwgbmVlZHMgY21ha2UgRmluZCBzY3JpcHQuCisKKzIwMDctMDMtMTQgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2U6IGFkZCBkb3h5Z2VuIHN1cHBvcnQKKworMjAwNy0wMy0xNCAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvY29uZmlnLmguY21ha2U6IFdJTkNFIGZpeGVzLCBkZWZpbmVkIERCVVNfVU5JWC4KKworMjAwNy0wMy0xMyAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYyAoZGJ1c19iZWNvbWVfZGFlbW9uKTogCisJd2luMzIgY29tcGlsZSBmaXguIAorCisyMDA3LTAzLTEzICBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBvYnNvbGF0ZSBwYXRjaGVzLiAKKworMjAwNy0wMy0xMyAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmM6IGFkZGVkIHplcm8gYnl0ZSBzZW5kaW5nIAorCWFuZCByZWNlaXZpbmcgYWZ0ZXIgY29ubmVjdGlvbiBzdGFydCB1cAorCisyMDA3LTAzLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAoZG9fY2xvc2Vfc3RkZXJyKTogZml4IEM4OSBwcm9ibGVtIGFuZAorCWZvcm1hdHRpbmcgcHJvYmxlbQorCisJKiBNb3N0bHkgZml4IHRoZSBEQnVzUGlwZSBtZXNzLgorCS0gcHV0IGxpbmUgYnJlYWsgYWZ0ZXIgZnVuY3Rpb24gcmV0dXJuIHR5cGVzCisJLSBwdXQgc3BhY2UgYmVmb3JlIHBhcmVucworCS0gZG8gbm90IHBhc3Mgc3RydWN0cyBhcm91bmQgYnkgdmFsdWUKKwktIGRvbid0IHVzZSBkYnVzX3N0cmVycm9yIGFmdGVyIGNhbGxpbmcgc3VwcG9zZWRseSBjcm9zcy1wbGF0Zm9ybQorCWFwaQorCS0gZG9uJ3QgbmFtZSBwaXBlIHZhcmlhYmxlcyAiZmQiCisJLSBhYnN0cmFjdCBzcGVjaWFsIGZkIG51bWJlcnMgbGlrZSAtMSBhbmQgMQorCisyMDA3LTAzLTEyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uaCwgZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsIAorCWRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmM6IHJlbmFtZWQgZnVuY3Rpb25zIAorCV9kYnVzX3h4eF9maWxlKCkgdG8gX2RidXNfZmlsZV94eHgoKSB0byByZWZsZWN0IAorCXN0cnVjdCBuYW1lIERCdXNGaWxlLiAKKworMjAwNy0wMy0xMiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOgorCWZpeCBfZGJ1c19waWRfZmQgY2hlY2suIAorCisyMDA3LTAzLTEwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6CisJYWRkZWQgcHJpbnRpbmcgb2YgdGhlIHJlcGx5IHNlcmlhbCB0byBtZXRob2QgcmV0dXJucyBhbmQgCisJZXJyb3JzLCBzbyB5b3UgY2FuIGFjdHVhbGx5IGZpZ3VyZSBvdXQgdGhlIG1lc3NhZ2UvcmVwbHkgCisJcGFpcnMgLSBwYXRjaCBieSBvbGxpLnNhbGxpIGF0IGNvbGxhYm9yYS5jby51ay4KKworMjAwNy0wMy0xMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgY29tbWl0dGVkIHBhdGNoZXMuIAorCisyMDA3LTAzLTEwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvYnVzLmMsIGJ1cy9idXMuaCwgYnVzL21haW4uYywgYnVzL3Rlc3QuYywKKwlkYnVzL2RidXMtc3lzZGVwcy11bml4LmMsIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jLAorCWRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLAorCWRidXMvZGJ1cy1zeXNkZXBzLmg6IHJlbmFtZWQgX2RidXNfeHh4X3BpcGUgdG8gX2RidXNfcGlwZV94eHgsCisJY29tcGxldGVkIF9kYnVzX3BpcGUgc3VwcG9ydC4gCisKKzIwMDctMDMtMTAgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmggKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KToKKwljaGFuZ2VkIHR5cGUgb3IgcG9ydCB0byBwb2ludGVyLCBiZWNhdXNlIHRoZSBwb3J0IGlzIGdpdmVuIGJhY2suCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMgKF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQpOgorCWltcGxlbWVudGVkIHJldHVybmluZyB0Y3AgcG9ydC4gU2tpcHBpbmcgcG9ydCBwYXJhbWV0ZXIKKwlhbmQgbm9uIGludGVnZXIgcG9ydCB2YWx1ZXMgaW4gY29uZmlnIDxsaXN0ZW4+IHN0YXRlbWVudAorCW5lZWRzIG1vcmUgZWZmb3J0LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMsIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jCisJKF9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0KTogcmV0dXJuIHRoZSByZWFsIHVzZWQgdGNwIHBvcnQuCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOiBhZGRlZCA8bGlzdGVuPiB0Y3AgZXhhbXBsZXMKKworMjAwNy0wMy0wOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvY29uZmlnLmguY21ha2U6IHdpbjMyIG1zdmMgYnVnIGZpeAorCisyMDA3LTAzLTA5ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9jb25maWcuaC5jbWFrZTogZml4ZWQgREJVU19XSU54eCBkZWZpbmVzLAorCXVzaW5nIF9XSU5DRSBkb2VzIG5vdCB3b3JrLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBfZGJ1c193cml0ZV9waXBlKCkgcGF0Y2gsIGl0IGlzIG5vdyAKKwljb21taXR0ZWQuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9idXMuYywgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jLCBkYnVzL2RidXMtc3lzZGVwcy5oOgorCXJlbmFtZSBwaXBlIHJlbGF0ZWQgd3JpdGUoKSBmdW5jdGlvbiBjYWxscyB0byBfZGJ1c193cml0ZV9waXBlKCkuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiBhZGRlZCBidXMvY29uZmlnLWxvYWRlci1saWJleHBhdC5jIHBhdGNoLCAKKwl1c2VzIERCVVNfV0lOIGZvciBhbGxzIHdpbjMyIHJlbGF0ZWQgI2lmZGVmcywgCisJc29tZSBtaW5vciBjbGVhbnVwcworCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogdXBkYXRlZCBwYXRjaCBmb3IgYnVzL2Rpc3BhdGNoLmMuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiBkYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIsCisJZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQpOiBMZXQgcmV0dXJuIHRoZW0gdmFsaWQgdXNlciBpZCdzLCAKKwlvdGhlcndpc2UgYnVzLXRlc3QgZmFpbHMuIEhvdyB0byByZXBsYWNlIG9uIHdpbjMyID8uCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoZmlsbF93aW5fdXNlcl9pbmZvX2hvbWVkaXIpOgorCWZpeCBtZW1vcnkgbGVhay4KKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IpOgorCXVzZSBkYnVzIGZyaWVuZGx5IGVycm9yIG5hbWUuCisJKGZpbGxfd2luX3VzZXJfaW5mb19ob21lZGlyKTogcHJpbnQgdXNlciBuYW1lIGluIGVycm9yIGNhc2UgdG9vLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2U6IGZpeGVkIHNvY2tldHBhaXIgY2hlY2sKKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGRpc2FibGVkIHNlZ2ZhdWx0IHRlc3Qgb24gd2luMzIgZm9yIG5vdworCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjb25maWd1cmUuaW4sIGNtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZTogYWRkZWQgY2hlY2sgCisJZm9yIHNldHJsaW1pdC4gCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYzogb25seSBpbmNsdWRlIHNldHJsaW1pdCBzdHVmZiBvbmx5IAorCXdoZW4gYXZhaWxhYmxlLiAgCisKKzIwMDctMDMtMDcgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiB1bml4IGNvbXBpbGUgZml4LgorCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgb2Jzb2xhdGUgcGF0Y2hlcy4KKworMjAwNy0wMy0wNyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogcmVtb3ZlZCBvYnNvbGF0ZSBpbmNsdWRlIGhlYWRlci4KKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jOiB3aW4zMiBjb21waWxlIGZpeCwgcmxpbWl0IAorCWlzbid0IGF2YWlsYWJsZSBvbiB3aW4zMi4KKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIHNvbWUgbW9yZSBwYXRjaGVzLCB0aGV5CisJYXJlIGFwcGxpZWQgb3Igb2Jzb2xhdGUgCisKKzIwMDctMDMtMDYgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy13aW4ucGF0Y2g6IGZpeGVzIHVuaXggbGlzdGVuIHByb2JsZW1zLCBkYnVzLXRlc3QgCisJbm93IHJ1bnMuCisKKzIwMDctMDMtMDYgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQsY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0LAorCWNtYWtlL0NNYWtlTGlzdHMudHh0OiB3aW4zMiBjb21waWxlIGZpeAorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaCwgUkVBRE1FLndpbjogYWRkZWQgYXZhaWxhYmxlIHdpbjMyIAorCXBhdGNoZXMgZnJvbSB3aW5kYnVzIHByb2plY3QgKGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvd2luZGJ1cykKKworMjAwNy0wMy0wNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCWZpeGVkIGNhbGwgdG8gX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKCkuCisKKzIwMDctMDMtMDQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jLGRidXMvZGJ1cy1zcGF3bi5oIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIpOgorCWFkZGVkIGVudmlyb25tZW50IHBvaW50ZXIgYXMgZnVuY3Rpb24gcGFyYW1ldGVyLCB1c2VkIG9uIHdpbjMyLgorCisJKiB0ZXN0L3NwYXduLXRlc3QuYzogZml4ZWQgY2FsbCB0byBhYm92ZSBtZW50aW9uZWQgZnVuY3Rpb24uCisKKzIwMDctMDMtMDQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbix0ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jLHRlc3QvdGVzdC1uYW1lcy5jOiAKKwlhZGRlZCBjb25maWd1cmUgY2hlY2sgZm9yIHVuaXN0ZC5oLgorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBmaXhlZCB0ZXN0IGRhdGEgY29weSBwcm9ibGVtIGluIAorCW91dCBvZiBzb3VyY2UgYnVpbGQsIHdoZW4gc291cmNlcyBjYW1lIGZyb20gc3ZuIG9yIGN2cy4gCisKKzIwMDctMDMtMDMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvKi13aW4uKixidXMvKi13aW4uKjogYWRkZWQgd2luMzIgcGxhdGZvcm0gcmVsYXRlZAorCWZpbGVzLiBUaGVzZSBmaWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgY21ha2UgYnVpbGQgc3lzdGVtLiAgCisJVGhlIG1pc3NpbmcgZGJ1cy13aW4ucGF0Y2ggZmlsZSB3aWxsIGJlIGFkZGVkIGxhdGVyLiAKKworMjAwNy0wMy0wMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2U6IG5ldyBkaXJlY3RvcnksIGNvbnRhaW5zIGNtYWtlIGJ1aWxkIHN1cHBvcnQuCisJU2VlIGh0dHA6Ly93d3cuY21ha2Uub3JnIGZvciBtb3JlIGluZm9ybWF0aW9ucy4KKwlDdXJyZW50bHkgb25seSB1bml4IHdpbGwgYmUgYnVpbGRhYmxlIGJlY2F1c2Ugc29tZSAKKwl3aW4zMiByZXF1aXJlZCBmaWxlcyBhcmUgc3RpbGwgbWlzc2luZy4gCisKKzIwMDctMDMtMDMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IGNhcHR1cmUgdGhlIGRidXMtbGF1bmNoIHN0ZGVycgorICAgICAgICBvdXRwdXQgYW5kIGFkZCBpdCB0byB0aGUgREJ1c0Vycm9yIG1lc3NhZ2Ugd2UgcmV0dXJuLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC4xOgorCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogQWRkIG9wdGlvbiAtLWNsb3NlLXN0ZGVyciB0bywgd2VsbCwKKwljbG9zZSBzdGRlcnIgYmVmb3JlIHN0YXJ0aW5nIGRidXMtZGFlbW9uLgorCisyMDA3LTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IHdyaXRlIGEgc2VjdGlvbiBpbiB0aGUgbWFuIHBhZ2Ugb24gcnVubmluZworCWEgdGVzdCBkYWVtb24gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworCisyMDA3LTAxLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogb3ZlcnJpZGUgYWxsIHRoZSBkZWZhdWx0IGxpbWl0cyB3aXRoIG11Y2gKKwloaWdoZXIgbGltaXRzIG9uIHRoZSBzZXNzaW9uIGJ1cywgdGhlcmUgaXMgbm8gcmVhc29uIHRoZSBzZXNzaW9uCisJYnVzIHNob3VsZCBoYXZlIGxvdyBsaW1pdHMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogaW5jcmVhc2UgZGVmYXVsdAorCWxpbWl0cyBzbyB0aGV5IGFyZSBsZXNzIGxpa2VseSB0byBiZSBoaXQ7IGluIHBhcnRpY3VsYXIgdGhlIG1heAorCXJlcGxpZXMgcGVyIGNvbm5lY3Rpb24gd2FzIHdheSB0b28gbG93CisKKzIwMDYtMDEtMjUgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IFJlcGxhY2UgUHl0aG9uIHNlY3Rpb24gb2YgdHV0b3JpYWwgd2l0aAorCWEgcG9pbnRlciB0byB0aGUgdHV0b3JpYWwgbWFpbnRhaW5lZCBhcyBwYXJ0IG9mIGRidXMtcHl0aG9uCisKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogdW5peCBjb21waWxlIGZpeCwgbW92ZWQgCisJYXRvbWljX2V4Y2hhbmdlX2FuZF9hZGQoKSBmcm9tIGRidXMvZGJ1cy1zeXNkZXBzLmMgCisJdG8gaGVyZSwgaXQncyB1c2VkIGJ5IF9kYnVzX2F0b21pY19pbmMoKSBhbmQgX2RidXNfYXRvbWljX2RlYygpLgorCisyMDA2LTEyLTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogZ2V0dGltZW9mZGF5KCkgaXMgbm90IGF2YWlsYWJsZSAKKwlvbiB3aW5kb3dzIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIgb3duLiBJdCdzIHRha2VuIGZyb20gCisJbGdwbCdkIGtkZXdpbjMyIHBhY2thZ2UuIC0gUGF0Y2hlcyBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKworMjAwNi0xMi0zMSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBtb3ZlZCBfZGJ1c19hdG9taWNfaW5jL2RlYygpIAorCWZyb20gZGJ1cy9kYnVzLXN5c2RlcHMuYywgd2luZG93cyB2ZXJzaW9uIG9mIF9kYnVzX2F0b21pY19pbmMvZGVjKCkgCisJaXMgaW4gZGJ1cy1zeXNkZXBzLXdpbi5jIChub3QgaW4gdGhpcyBwYXRjaCkuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IERCdXNBdG9taWM6OnZhbHVlIGlzIGxvbmcgb24gd2luZG93cyB0byBmaXQgCisJd2l0aCBJbnRlcmxvY2tlZEluYy9EZWNyZW1lbnQuIAorCS0gUGF0Y2hlcyBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKwkKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jLCB0b29scy9kYnVzLW1vbml0b3IuYzogd2luMzIgY29tcGlsZSBmaXguCisKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jICh0eXBlIERCdXNUeXBlUmVhZGVyQ2xhc3MpOgorCWZpeCBtaXNwYWNlZCBjb25zdCBzdGF0ZW1lbnQuIC0gUGF0Y2ggZnJvbSBQZXRlciBLw7xtbWVsCisKKzIwMDYtMTItMTkgIFJheSBTdHJvZGUgIDxyc3Ryb2RlQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6CisJZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGJ1cyBjb250ZXh0IGFjdGl2YXRpb24gb2JqZWN0CisJdW50aWwgYWZ0ZXIgd2UndmUgY2hlY2tlZCB0aGF0IHRoZSBuZXcgYWN0aXZhdGlvbiBpcworCXZhbGlkLgorCisJKiBidXMvbWFpbi5jIAorCShzaWduYWxfaGFuZGxlciksIChoYW5kbGVfcmVsb2FkX3dhdGNoKToKKwlkb24ndCBjYWxsIGV4aXQoKSBvbiBmYWlsdXJlLCBpbnN0ZWFkIG1ha2UgZG8gYW5kIGtlZXAKKwlnb2luZy4KKwkoY2xvc2VfcmVsb2FkX3BpcGUpOiBuZXcgZnVuY3Rpb24gdG8gdHVybiBvZmYKKwloYW5ndXAtY2F1c2VzLWNvbmZpZy1yZWxvYWQgYmVoYXZpb3IgaWYgYW4gdW5leHBlY3RlZAorCWVycm9yIG9jY3VycworCisyMDA2LTEyLTEzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4tdGhyZWFkLmMgKF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMik6CisJY29ycmVjdG5lc3MgZml4LiAtIFBhdGNoIGZyb20gQ2hyaXN0aWFuIEVocmxpY2hlcgorCisyMDA2LTEyLTEzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmg6IG1zdmMgYWxzbyBrbm93cyBhYm91dCBfX0ZVTkNUSU9OX18sIAorCXdlIHNob3VsZCBhbHNvIHVzZSBpdC4gLSBQYXRjaCBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKworMjAwNi0xMi0xMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgCisJKiBkYnVzLXN5c2RlcHMtdXRpbC5jOiBhZGRlZCB3aW4zMiByZWxhdGVkIHRlc3RzCisKKzIwMDYtMTItMTIgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BvcF9saW5lKSwKKwlidXMvZGVza3RvcC1maWxlLmMgKHBhcnNlX3NlY3Rpb25fc3RhcnQsCisJcGFyc2VfY29tbWVudF9vcl9ibGFuayxwYXJzZV9rZXlfdmFsdWUsKTogdXNlcworCV9kYnVzX3N0cmluZ19maW5kX2VvbCgpIHRvIHN1cHBvcnQgcGxhdGZvcm0gaW5kZXBlbmRlbnQgZW9sIHN0eWxlLgorCisyMDA2LTEyLTEyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLltjaF0gKF9kYnVzX3N0cmluZ19maW5kX2VvbCk6IG5ldyBmdW5jdGlvbi4gCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYyAoX2RidXNfc3RyaW5nX3Rlc3QpOiBhZGRlZCB0ZXN0Y2FzZXMgZm9yIAorCSAgICAgIF9kYnVzX3N0cmluZ19maW5kX2VvbCgpLgorCUFwcHJvdmVkIGJ5OiBIYXZvYyBQZW5uaW5ndG9uLgorCisyMDA2LTEyLTEyICBUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgc3dpdGNoIHRvIGRpc2FibGUgdXNlcl9kYXRhYmFzZSBjYWNoaW5nLgorCisJKiBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYywgZGJ1cy9kYnVzLXVzZXJkYi5jOiBBZGQgaWZkZWZzIHRvCisJYmUgYWJsZSBkaXNhYmxlIHVzZXJfZGFiYXNlIGNhY2hpbmcuCisKKzIwMDYtMTItMTIgIFRpbSBEaWprc3RyYSA8dGltQGZhbWRpamtzdHJhLm9yZz4KKworCSogYnVzL2J1cy5jLCBidXMvYnVzLmg6IFJlbW92ZSBEQnVzVXNlckRhdGFiYXNlIGZyb20gdGhlIEJ1c0NvbnRleHQgCisJc3RydWN0LiBJdCBpcyB1bm5lY2Vzc2FyeSB3ZSBoYXZlIGEgZ2xvYmFsIG9uZSBhbHJlYWR5LiBBbHNvIHJlbW92ZSAKKwlidXNfY29udGV4dF9nZXRfdXNlcl9kYXRhYmFzZSBmdW5jdGlvbiwgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKwlGbHVzaCB0aGUgZ2xvYmFsIGRhdGFiYXNlIG9uIHJlbG9hZC4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6IFJlcGxhY2UgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBzIAorCXdpdGggX2RidXNfZ3JvdXBzX2Zyb21fdWlkLiBJdCBubyBsb25nZXIgbmVlZHMgYSBEQnVzVXNlckRhdGFiYXNlLgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMsIGRidXMvZGJ1cy11c2VyZGIuaDogCisJQWRkIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2hfc3lzdGVtLiAKKwlNYWtlIG1vcmUgZnVuY3Rpb25zIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUuIAorCVNtYWxsIHVucmVsYXRlZCBjaGFuZ2UgaW4gX2RidXNfaXNfYV9udW1iZXI6IGNoYW5nZSAKKwlfZGJ1c19zdHJpbmdfcGFyc2VfaW50IHRvIF9kYnVzX3N0cmluZ19wYXJzZV91aW50LiAKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogQ2hhbmdlIGNhbGwgdG8gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBzIHRvIAorCV9kYnVzX2dyb3Vwc19mcm9tX3VpZC4KKworCSogYnVzL3BvbGljeS5jLCBidXMvcG9saWN5Lmg6IENoYW5nZSBjYWxsIHRvIAorCV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwcyB0byBfZGJ1c19ncm91cHNfZnJvbV91aWQuIFJlbW92ZSAKKwlEQnVzVXNlckRhdGFiYXNlIGZyb20gYnVzX3BvbGljeV9hbGxvd191c2VyIHByb3RvdHlwZSwgaXQgbm8gbG9uZ2VyIAorCW5lZWRzIGl0LgorCisyMDA2LTEyLTEyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvc2lnbmFsLmM6IEZpeCBtYXRjaF9ydWxlX2VxdWFsIGVycmF0YQorCShDVkUtMjAwNi02MTA3IC0gUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIAorCTxraW1tby5oYW1hbGFpbmVuQG5va2lhLmNvbT4pCisKKzIwMDYtMTEtMTkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMgKF9kYnVzX3B0aHJlYWRfbXV0ZXhfbG9jaywKKyAgICAgICAgX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXQsCisgICAgICAgIF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0X3RpbWVvdXQpOiBzZXQgcG11dGV4LT5ob2xkZXIgdG8KKyAgICAgICAgcHRocmVhZF9zZWxmKCkgYWZ0ZXIgY29taW5nIGJhY2sgZnJvbSBhIGNvbmRpdGlvbmFsIHZhcmlhYmxlCisgICAgICAgIHdhaXQgYXMgd2VsbCBhcyBpbiBvbmUgY29kZXBhdGggd2hlcmUgaXQgd2FzIGZvcmdvdHRlbi4KKwlBcHByb3ZlZCBieTogSGF2b2MgUGVubmluZ3Rvbi4KKworMjAwNi0xMS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHVwZGF0ZS1kYnVzLWRvY3Muc2g6IGFsbG93IHNldHRpbmcgZmQub3JnIHVzZXJuYW1lIHZpYSBlbnYKKwl2YXJpYWJsZS4gTWFrZSBpdCBydW4gYXV0b2dlbiB3aXRoIC0tZW5hYmxlLXhtbC1kb2NzPXllcworCS0tZW5hYmxlLWRveHlnZW4tZG9jcz15ZXMgc28gY29uZmlndXJlIHdpbGwgZmFpbCBpZiB0aGUgcmVxdWlyZWQKKwl0b29scyBhcmUgbWlzc2luZy4KKworMjAwNi0xMS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLWZhcS54bWw6IG1pbm9yIEZBUSB0d2Vha3MKKworMjAwNi0xMS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWlzYy5jLCBkYnVzL2RidXMtbWlzYy5oOiBNb3ZlCisJZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpIHRvIGl0cyBvd24gZmlsZSwgbm8gc3Vic3RhbnRpdmUKKwljaGFuZ2VzLiBUaGVyZSBhcmUgYSBjb3VwbGUgb3RoZXIgdGhpbmdzIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRoYXQKKwlhcmUgIm1pc2MiIHNvIG1vdmluZyBvdXQgb2YgZGJ1cy1jb25uZWN0aW9uLltoY10gd2hpY2ggaXMgYmlnCisJZW5vdWdoIGFscmVhZHkuCisJCisyMDA2LTExLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19nZW5lcmF0ZV91dWlkKTogVGhlIHNwZWMgc2FpZCB0aGUKKwlVVUlEIGhhZCB0aGUgdGltZXN0YW1wIGxhc3QsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaGFkIGl0IGZpcnN0OworCW1vdmUgaXQgdG8gbGFzdCBzaW5jZSBJIHRoaW5rIGl0J3MgYSB0aW55IGJpdCBuaWNlciAoZWFzaWVyIHRvCisJY29tcGFyZSBhdCBhIGdsYW5jZSwgZmFzdGVyIHRvIHNvcnQsIGxlc3MgY29kZSksIGFuZCB3aWxsIG5vdAorCWNhdXNlIGFueSBwcmFjdGljYWwgY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4gQWxzbywgYWx3YXlzIGNvbnZlcnQKKwl0aGUgdGltZXN0YW1wIHRvIGJpZyBlbmRpYW4uCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBDbGVhbiB1cCB0aGUgZG9jcyBvbiB0aGUgVVVJRC4KKworCSogdG9vbHMvZGJ1cy11dWlkZ2VuLjE6IG1vcmUgcHJvbWluZW50bHkgc2F5IGl0IGlzIG5vdCBzdWl0YWJsZQorCWFzIGEgcmVwbGFjZW1lbnQgZm9yIHJlZ3VsYXIgdXVpZGdlbi9SRkM0MTIyLgorCisyMDA2LTExLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5oOiBmaXggREJVU19USFJFQURfRlVOQ1RJT05TX0FMTF9NQVNLIHRvIGhhdmUKKwl0aGUgY29ycmVjdCB2YWx1ZSBzbyB3ZSBkb24ndCBhc3NlcnQgd2hlbiBpbml0YWxpemluZyByZWN1cnNpdmUgdGhyZWFkcworCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZC1pbml0LmM6IGNhbGwgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdAorCWluc3RlYWQgb2YgX2RidXNfdGhyZWFkc19pbml0X2RlYnVnIHNpbmNlIGl0IGlzIG1vcmUgb2YgYSByZWFsIHdvcmxkCisJdGVzdAorCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL0NsZWFuU3BlYy5tawpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAorIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKKyMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisjIHJ1biBiZWZvcmUuCisjCisjIEUuZy46CisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCisjCisjIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAorIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KKyMKKyMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgorIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgorIworIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKKyMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKKyMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKKyMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAorIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyMKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBGb3IgZXhhbXBsZToKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL0RveHlmaWxlLmluIGIvRG94eWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMzdlZAotLS0gL2Rldi9udWxsCisrKyBiL0RveHlmaWxlLmluCkBAIC0wLDAgKzEsMTgwIEBACisjIERveHlmaWxlIDAuMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gRC1CdXMKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSBAVkVSU0lPTkAKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvYXBpCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4CitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCitBTElBU0VTICAgICAgICAgICAgICAgID0gCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBZRVMKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTlBVVCAgICAgICAgICAgICAgICAgID0gQHRvcF9zcmNkaXJAL2RidXMKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgKi5oCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisjRVhDTFVERSAgICAgICAgICAgICAgICA9IHRlc3QKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IE1ha2VmaWxlLiogQ2hhbmdlTG9nIENIQU5HRVMgQ0hBTkdFUy4qIFJFQURNRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRE1FLiogKi5wbmcgQVVUSE9SUyBERVNJR04gREVTSUdOLiogKi5kZXNrdG9wIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERVNLVE9QKiBDT01NRU5UUyBIT1dUTyBtYWdpYyBOT1RFUyBUT0RPIFRIQU5LUworCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorRVhBTVBMRV9QQVRURVJOUyAgICAgICA9IAorRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSAKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKK0hUTUxfQUxJR05fTUVNQkVSUyAgICAgPSBZRVMKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworTEFURVhfT1VUUFVUICAgICAgICAgICA9IAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KK1JURl9PVVRQVVQgICAgICAgICAgICAgPSAKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBZRVMKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuM2RidXMKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorUFJFREVGSU5FRCAgICAgICAgICAgICA9ICJEQlVTX0JFR0lOX0RFQ0xTPSIgCQkJXAorCQkJICJEQlVTX0VORF9ERUNMUz0iIAkJCVwKKwkJCSAiRE9YWUdFTl9TSE9VTERfU0tJUF9USElTIiAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19HTlVDX0RFUFJFQ0FURUQ9IiAgICAgICAgICAgICAgICBcCisJCQkgIl9EQlVTX0dOVUNfUFJJTlRGKGZyb20sdG8pPSIKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKK01BWF9ET1RfR1JBUEhfV0lEVEggICAgPSA2NDAKK01BWF9ET1RfR1JBUEhfSEVJR0hUICAgPSAxMDI0CitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTwpkaWZmIC0tZ2l0IGEvSEFDS0lORyBiL0hBQ0tJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlZDllNgotLS0gL2Rldi9udWxsCisrKyBiL0hBQ0tJTkcKQEAgLTAsMCArMSwzNTYgQEAKK1RoZSBndWlkZWxpbmVzIGluIHRoaXMgZmlsZSBhcmUgdGhlIGlkZWFsczsgaXQncyBiZXR0ZXIgdG8gc2VuZCBhCitub3QtZnVsbHktZm9sbG93aW5nLWd1aWRlbGluZXMgcGF0Y2ggdGhhbiBubyBwYXRjaCBhdCBhbGwsIHRob3VnaC4gIFdlCitjYW4gYWx3YXlzIHBvbGlzaCBpdCB1cC4KKworTWFpbGluZyBsaXN0Cis9PT0KKworVGhlIEQtQnVzIG1haWxpbmcgbGlzdCBpcyBkYnVzQGxpc3RzLmZyZWVkZXNrdG9wLm9yZzsgZGlzY3Vzc2lvbgorb2YgcGF0Y2hlcywgZXRjLiBzaG91bGQgZ28gdGhlcmUuCisKK1NlY3VyaXR5Cis9PT0KKworSWYgeW91IGZpbmQgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgbm90IGtub3duIHRvIHRoZSBwdWJsaWMsCitwbGVhc2UgcmVwb3J0IGl0IHByaXZhdGVseSB0byBkYnVzLXNlY3VyaXR5QGxpc3RzLmZyZWVkZXNrdG9wLm9yZworb3IgYnkgcmVwb3J0aW5nIGEgZnJlZWRlc2t0b3Aub3JnIGJ1ZyB0aGF0IGlzIG1hcmtlZCBhcworcmVzdHJpY3RlZCB0byB0aGUgIkQtQlVTIHNlY3VyaXR5IGdyb3VwIi4KKworTW9zdCBvZiBELUJ1cyBpcyBzZWN1cml0eSBzZW5zaXRpdmUuICBHdWlkZWxpbmVzIHJlbGF0ZWQgdG8gdGhhdDoKKworIC0gYXZvaWQgbWVtY3B5KCksIHNwcmludGYoKSwgc3RybGVuKCksIHNucHJpbnRmLCBzdHJsY2F0KCksCisgICBzdHJzdHIoKSwgc3RydG9rKCksIG9yIGFueSBvZiB0aGlzIHN0dWZmLiBVc2UgREJ1c1N0cmluZy4gCisgICBJZiBEQnVzU3RyaW5nIGRvZXNuJ3QgaGF2ZSB0aGUgZmVhdHVyZSB5b3UgbmVlZCwgYWRkIGl0IAorICAgdG8gREJ1c1N0cmluZy4gCisKKyAgIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMsIGZvciBleGFtcGxlCisgICBpZiB5b3VyIHN0cmluZ3MgYXJlIGp1c3QgdXNlZCB0byBpbmRleCBhIGhhc2ggdGFibGUgCisgICBhbmQgeW91IGRvbid0IGRvIGFueSBwYXJzaW5nL21vZGlmaWNhdGlvbiBvZiB0aGVtLCBwZXJoYXBzCisgICBEQnVzU3RyaW5nIGlzIHdhc3RlZnVsIGFuZCB3b3VsZG4ndCBoZWxwIG11Y2guIEJ1dCBkZWZpbml0ZWx5IAorICAgaWYgeW91J3JlIGRvaW5nIGFueSBwYXJzaW5nLCByZWFsbG9jYXRpb24sIGV0Yy4gdXNlIERCdXNTdHJpbmcuCisKKyAtIGRvIG5vdCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzIG91dHNpZGUgb2YgZGJ1cy1tZW1vcnkuYywgCisgICBkYnVzLXN5c2RlcHMuYywgYW5kIG90aGVyIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSBhbHJlYWR5IAorICAgaW5jbHVkZWQuIFRoaXMgZ2l2ZXMgdXMgb25lIHBsYWNlIHRvIGF1ZGl0IGFsbCBleHRlcm5hbCAKKyAgIGRlcGVuZGVuY2llcyBvbiBmZWF0dXJlcyBpbiBsaWJjLCBldGMuCisKKyAtIGRvIG5vdCB1c2UgbGliYyBmZWF0dXJlcyB0aGF0IGFyZSAiY29tcGxpY2F0ZWQiIAorICAgYW5kIG1heSBjb250YWluIHNlY3VyaXR5IGhvbGVzLiBGb3IgZXhhbXBsZSwgeW91IHByb2JhYmx5IHNob3VsZG4ndAorICAgdHJ5IHRvIHVzZSByZWdjb21wKCkgdG8gY29tcGlsZSBhbiB1bnRydXN0ZWQgcmVndWxhciBleHByZXNzaW9uLgorICAgUmVndWxhciBleHByZXNzaW9ucyBhcmUganVzdCB0b28gY29tcGxpY2F0ZWQsIGFuZCB0aGVyZSBhcmUgbWFueSAKKyAgIGRpZmZlcmVudCBsaWJjJ3Mgb3V0IHRoZXJlLgorCisgLSB3ZSBuZWVkIHRvIGRlc2lnbiB0aGUgbWVzc2FnZSBidXMgZGFlbW9uIChhbmQgYW55IHNpbWlsYXIgZmVhdHVyZXMpCisgICB0byB1c2UgbGltaXRlZCBwcml2aWxlZ2VzLCBydW4gaW4gYSBjaHJvb3QgamFpbCwgYW5kIHNvIG9uLgorCitodHRwOi8vdnNmdHBkLmJlYXN0cy5vcmcvIGhhcyBvdGhlciBnb29kIHNlY3VyaXR5IHN1Z2dlc3Rpb25zLgorCitDb2RpbmcgU3R5bGUKKz09PQorCisgLSBUaGUgQyBsaWJyYXJ5IHVzZXMgR05VIGNvZGluZyBjb252ZW50aW9ucywgd2l0aCBHTGliLWxpa2UKKyAgIGV4dGVuc2lvbnMgKGUuZy4gbGluaW5nIHVwIGZ1bmN0aW9uIGFyZ3VtZW50cykuIFRoZQorICAgUXQgd3JhcHBlciB1c2VzIEtERSBjb2RpbmcgY29udmVudGlvbnMuCisKKyAtIFdyaXRlIGRvY3MgZm9yIGFsbCBub24tc3RhdGljIGZ1bmN0aW9ucyBhbmQgc3RydWN0cyBhbmQgc28gb24uIHRyeQorICAgImRveHlnZW4gRG94eWZpbGUiIHByaW9yIHRvIGNvbW1pdCBhbmQgYmUgc3VyZSB0aGVyZSBhcmUgbm8KKyAgIHdhcm5pbmdzIHByaW50ZWQuCisKKyAtIEFsbCBleHRlcm5hbCBpbnRlcmZhY2VzIChuZXR3b3JrIHByb3RvY29scywgZmlsZSBmb3JtYXRzLCBldGMuKQorICAgc2hvdWxkIGhhdmUgZG9jdW1lbnRlZCBzcGVjaWZpY2F0aW9ucyBzdWZmaWNpZW50IHRvIGFsbG93IGFuCisgICBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB0byBiZSB3cml0dGVuLiBPdXIgaW1wbGVtZW50YXRpb24gc2hvdWxkCisgICBiZSBzdHJpY3QgYWJvdXQgc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIChzaG91bGQgbm90IGZvciBleGFtcGxlCisgICBoZXVyaXN0aWNhbGx5IHBhcnNlIGEgZmlsZSBhbmQgYWNjZXB0IG5vdC13ZWxsLWZvcm1lZAorICAgZGF0YSkuIEF2b2lkaW5nIGhldXJpc3RpY3MgaXMgYWxzbyBpbXBvcnRhbnQgZm9yIHNlY3VyaXR5IHJlYXNvbnM7CisgICBpZiBpdCBsb29rcyBmdW5ueSwgaWdub3JlIGl0IChvciBleGl0LCBvciBkaXNjb25uZWN0KS4KKworRGV2ZWxvcG1lbnQKKz09PQorCitELUJ1cyB1c2VzIEdpdCBhcyBpdHMgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4gVGhlIG1haW4gcmVwb3NpdG9yeSBpcworaG9zdGVkIGF0IGdpdC5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzLiBUbyBjbG9uZSBELUJ1cywgZXhlY3V0ZSB0aGUKK2ZvbGxvd2luZyBjb21tYW5kOgorCisgICAgZ2l0IGNsb25lIGdpdDovL2dpdC5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzCitPUgorICAgIGdpdCBjbG9uZSBnaXQuZnJlZWRlc2t0b3Aub3JnOmRidXMvZGJ1cworCitUaGUgbGF0dGVyIGZvcm0gaXMgdGhlIG9uZSB0aGF0IGFsbG93cyBwdXNoaW5nLCBidXQgaXQgYWxzbyByZXF1aXJlcworYW4gU1NIIGFjY291bnQgb24gdGhlIHNlcnZlci4gVGhlIGZvcm1lciBmb3JtIGFsbG93cyBhbm9ueW1vdXMKK2NoZWNrb3V0cy4KKworRC1CdXMgZGV2ZWxvcG1lbnQgaGFwcGVucyBpbiB0d28gYnJhbmNoZXMgaW4gcGFyYWxsZWw6IHRoZSBjdXJyZW50CitzdGFibGUgYnJhbmNoLCB3aXRoIGFuIGV2ZW4gbWlub3IgbnVtYmVyIChsaWtlIDEuMCwgMS4yIGFuZCAxLjQpLCBhbmQKK3RoZSBuZXh0IGRldmVsb3BtZW50IGJyYW5jaCwgd2l0aCB0aGUgbmV4dCBvZGQgbnVtYmVyLgorCitUaGUgc3RhYmxlIGJyYW5jaCBpcyBuYW1lZCBhZnRlciB0aGUgdmVyc2lvbiBudW1iZXIgaXRzZWxmIChkYnVzLTEuMiwKK2RidXMtMS40KSwgd2hlcmVhcyB0aGUgZGV2ZWxvcG1lbnQgYnJhbmNoIGlzIHNpbXBseSBrbm93biBhcyAibWFzdGVyIi4KKworV2hlbiBtYWtpbmcgYSBjaGFuZ2UgdG8gRC1CdXMsIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAtIGNoZWNrIG91dCB0aGUgZWFybGllc3QgYnJhbmNoIG9mIEQtQnVzIHRoYXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZQorICAgeW91ciBjaGFuZ2UgaW4uIElmIGl0J3MgYSBidWdmaXgsIGl0J3Mgbm9ybWFsbHkgdGhlIGN1cnJlbnQgc3RhYmxlCisgICBicmFuY2g7IGlmIGl0J3MgYSBmZWF0dXJlLCBpdCdzIG5vcm1hbGx5IHRoZSAibWFzdGVyIiBicmFuY2guIElmCisgICB5b3UgaGF2ZSBhbiBpbXBvcnRhbnQgc2VjdXJpdHkgZml4LCB5b3UgbWF5IHdhbnQgdG8gYXBwbHkgdG8gb2xkZXIKKyAgIGJyYW5jaGVzIHRvby4KKworIC0gZm9yIGxhcmdlIGNoYW5nZXM6CisgICAgIGlmIHlvdSdyZSBkZXZlbG9waW5nIGEgbmV3LCBsYXJnZSBmZWF0dXJlLCBpdCdzIHJlY29tbWVuZGVkCisgICAgIHRvIGNyZWF0ZSBhIG5ldyBicmFuY2ggYW5kIGRvIHlvdXIgZGV2ZWxvcG1lbnQgdGhlcmUuIFB1Ymxpc2gKKyAgICAgeW91ciBicmFuY2ggYXQgYSBzdWl0YWJsZSBwbGFjZSBhbmQgYXNrIG90aGVycyB0byBoZWxwIHlvdQorICAgICBkZXZlbG9wIGFuZCB0ZXN0IGl0LiBPbmNlIHlvdXIgZmVhdHVyZSBpcyBjb25zaWRlcmVkIGZpbmFsaXNlZCwKKyAgICAgeW91IG1heSBtZXJnZSBpdCBpbnRvIHRoZSAibWFzdGVyIiBicmFuY2guCisKKy0gZm9yIHNtYWxsIGNoYW5nZXM6CisgICAgLiBtYWtlIHlvdXIgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZQorICAgIC4gZXhlY3V0ZSB0ZXN0cyB0byBndWFyYW50ZWUgdGhhdCB5b3UncmUgbm90IGludHJvZHVjaW5nIGEKKyAgICAgIHJlZ3Jlc3Npb24uIEZvciB0aGF0LCBleGVjdXRlOiBtYWtlIGNoZWNrCisgICAgICAoaWYgcG9zc2libGUsIGFkZCBhIG5ldyB0ZXN0IHRvIGNoZWNrIHRoZSBmaXggeW91J3JlCisgICAgICBpbnRyb2R1Y2luZykKKyAgICAuIGNvbW1pdCB5b3VyIGNoYW5nZSB1c2luZyAiZ2l0IGNvbW1pdCIKKyAgICAgIGluIHRoZSBjb21taXQgbWVzc2FnZSwgd3JpdGUgYSBzaG9ydCBzZW50ZW5jZSBkZXNjcmliaW5nIHdoYXQKKyAgICAgIHlvdSBkaWQgaW4gdGhlIGZpcnN0IGxpbmUuIFRoZW4gd3JpdGUgYSBsb25nZXIgZGVzY3JpcHRpb24gaW4KKyAgICAgIHRoZSBuZXh0IHBhcmFncmFwaChzKS4KKyAgICAuIHJlcGVhdCB0aGUgcHJldmlvdXMgc3RlcHMgaWYgbmVjZXNzYXJ5IHRvIGhhdmUgbXVsdGlwbGUgY29tbWl0cworCisgLSBleHRyYWN0IHlvdXIgcGF0Y2hlcyBhbmQgc2VuZCB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IGZvcgorICAgcmV2aWV3IG9yIHBvc3QgdGhlbSB0byB0aGUgRC1CdXMgQnVnemlsbGEsIGF0dGFjaGluZyB0aGVtIHRvIGEgYnVnCisgICByZXBvcnQuIFRvIGV4dHJhY3QgdGhlIHBhdGNoZXMsIGV4ZWN1dGU6CisgICAgIGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luL21hc3RlcgorCisgLSBvbmNlIHlvdXIgY29kZSBoYXMgYmVlbiByZXZpZXdlZCwgeW91IG1heSBwdXNoIGl0IHRvIHRoZSBHaXQKKyAgIHNlcnZlcjoKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIG15LWJyYW5jaDpyZW1vdGUKKyAgIE9SCisgICAgIGdpdCBwdXNoIG9yaWdpbiBkYnVzLVguWQorICAgT1IKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlcgorICAgKGNvbnN1bHQgdGhlIEdpdCBtYW51YWwgdG8ga25vdyB3aGljaCBjb21tYW5kIGFwcGxpZXMpCisKKyAtIChPcHRpb25hbCkgaWYgeW91J3ZlIG5vdCB3b3JrZWQgb24gIm1hc3RlciIsIG1lcmdlIHlvdXIgY2hhbmdlcyB0bworICAgdGhhdCBicmFuY2guIElmIHlvdSd2ZSB3b3JrZWQgb24gYW4gZWFybGllciBicmFuY2ggdGhhbiB0aGUgY3VycmVudAorICAgc3RhYmxlLCBtZXJnZSB5b3VyIGNoYW5nZXMgdXB3YXJkcyB0b3dhcmRzIHRoZSBzdGFibGUgYnJhbmNoLCB0aGVuCisgICBmcm9tIHRoZXJlIGludG8gIm1hc3RlciIuCisKKyAgICAuIGV4ZWN1dGU6IGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICAuIGVuc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgIm1hc3RlciIgZnJvbSB0aGUgc2VydmVyLCB1cGRhdGUKKyAgICAgIGlmIHlvdSBkb24ndAorICAgIC4gZXhlY3V0ZTogZ2l0IG1lcmdlIGRidXMtWC5ZCisgICAgLiBpZiB5b3UgaGF2ZSBhbnkgY29uZmxpY3RzLCByZXNvbHZlIHRoZW0sIGdpdCBhZGQgdGhlIGNvbmZsaWN0ZWQKKyAgICAgIGZpbGVzIGFuZCB0aGVuIGdpdCBjb21taXQKKyAgICAuIHB1c2ggdGhlICJtYXN0ZXIiIGJyYW5jaCB0byB0aGUgc2VydmVyIGFzIHdlbGwKKworICBFeGVjdXRpbmcgdGhpcyBtZXJnZSBpcyByZWNvbW1lbmRlZCwgYnV0IG5vdCBuZWNlc3NhcnkgZm9yIGFsbAorICBjaGFuZ2VzLiBZb3Ugc2hvdWxkIGRvIHRoaXMgc3RlcCBpZiB5b3VyIGJ1Z2ZpeCBpcyBjcml0aWNhbCBmb3IgdGhlCisgIGRldmVsb3BtZW50IGluICJtYXN0ZXIiLCBvciBpZiB5b3Ugc3VzcGVjdCB0aGF0IGNvbmZsaWN0cyB3aWxsIGFyaXNlCisgICh5b3UncmUgdXN1YWxseSB0aGUgYmVzdCBwZXJzb24gdG8gcmVzb2x2ZSBjb25mbGljdHMgaW50cm9kdWNlZCBieQorICB5b3VyIG93biBjb2RlKSwgb3IgaWYgaXQgaGFzIGJlZW4gdG9vIGxvbmcgc2luY2UgdGhlIGxhc3QgbWVyZ2UuCisKKworTWFraW5nIGEgcmVsZWFzZQorPT09CisKK1RvIG1ha2UgYSByZWxlYXNlIG9mIEQtQnVzLCBkbyB0aGUgZm9sbG93aW5nOgorCisgLSBjaGVjayBvdXQgYSBmcmVzaCBjb3B5IGZyb20gR2l0CisKKyAtIHZlcmlmeSB0aGF0IHRoZSBsaWJ0b29sIHZlcnNpb25pbmcvbGlicmFyeSBzb25hbWUgaXMgCisgICBjaGFuZ2VkIGlmIGl0IG5lZWRzIHRvIGJlLCBvciBub3QgY2hhbmdlZCBpZiBub3QKKworIC0gdXBkYXRlIHRoZSBmaWxlIE5FV1MgYmFzZWQgb24gdGhlIGdpdCBoaXN0b3J5CisKKyAtIHZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBkYnVzLXNwZWNpZmljYXRpb24ueG1sIGlzCisgICBjaGFuZ2VkIGlmIGl0IG5lZWRzIHRvIGJlOyBpZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLCB1cGRhdGUgdGhlCisgICByZWxlYXNlIGRhdGUgaW4gdGhhdCBmaWxlCisKKyAtIHVwZGF0ZSB0aGUgQVVUSE9SUyBmaWxlIHdpdGggIm1ha2UgdXBkYXRlLWF1dGhvcnMiIGlmIG5lY2Vzc2FyeQorCisgLSB0aGUgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGhhdmUgbWFqb3IubWlub3IubWljcm8sIGV2ZW4KKyAgIGlmIG1pY3JvIGlzIDAsIGkuZS4gIjEuMC4wIiBhbmQgIjEuMi4wIiBub3QgIjEuMCIvIjEuMiI7IHRoZSBtaWNybworICAgdmVyc2lvbiBzaG91bGQgYmUgZXZlbiBmb3IgcmVsZWFzZXMsIGFuZCBvZGQgZm9yIGludGVybWVkaWF0ZSBzbmFwc2hvdHMKKworIC0gIm1ha2UgZGlzdGNoZWNrIiAoRE8gTk9UIGp1c3QgIm1ha2UgZGlzdCIgLSBwYXNzIHRoZSBjaGVjayEpCisKKyAtIGlmIG1ha2UgZGlzdGNoZWNrIGZhaWxzLCBmaXggaXQuCisKKyAtIG9uY2UgZGlzdGNoZWNrIHN1Y2NlZWRzLCAiZ2l0IGNvbW1pdCAtYSIuICBUaGlzIGlzIHRoZSB2ZXJzaW9uCisgICBvZiB0aGUgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHJlbGVhc2VkIHRhcmJhbGwuCisKKyAtIHRhZyB0aGUgdHJlZSB3aXRoICJnaXQgdGFnIC1zIC1tICdSZWxlYXNlZCBYLlkuWicgZGJ1cy1YLlkuWiIKKyAgIHdoZXJlIFguWS5aIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSByZWxlYXNlLiAgSWYgeW91IGNhbid0IHNpZ24KKyAgIHRoZW4gc2ltcGx5IGNyZWF0ZWQgYW4gdW5zaWduZWQgYW5ub3RhdGVkIHRhZzoKKyAgICJnaXQgdGFnIC1hIC1tICdSZWxlYXNlZCBYLlkuWicgZGJ1cy1YLlkuWiIuCisKKyAtIGJ1bXAgdGhlIHZlcnNpb24gbnVtYmVyIHVwIGluIGNvbmZpZ3VyZS5hYyAoc28gdGhlIG1pY3JvIHZlcnNpb24gaXMgb2RkKSwKKyAgIGFuZCBjb21taXQgaXQuICBNYWtlIHN1cmUgeW91IGRvIHRoaXMgKmFmdGVyKiB0YWdnaW5nIHRoZSBwcmV2aW91cworICAgcmVsZWFzZSEgVGhlIGlkZWEgaXMgdGhhdCBnaXQgaGFzIGEgbmV3ZXIgdmVyc2lvbiBudW1iZXIKKyAgIHRoYW4gYW55dGhpbmcgcmVsZWFzZWQuIFNpbWlsYXJseSwgYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKyAgIGRidXMtc3BlY2lmaWNhdGlvbi54bWwgYW5kIHNldCB0aGUgcmVsZWFzZSBkYXRlIHRvICIobm90IGZpbmFsaXplZCkiLgorCisgLSBtZXJnZSB0aGUgYnJhbmNoIHlvdSd2ZSByZWxlYXNlZCB0byB0aGUgY2hyb25vbG9naWNhbGx5LWxhdGVyCisgICBicmFuY2ggKHVzdWFsbHkgIm1hc3RlciIpLiBZb3UnbGwgcHJvYmFibHkgaGF2ZSB0byBmaXggYSBtZXJnZQorICAgY29uZmxpY3QgaW4gY29uZmlndXJlLmFjICh0aGUgdmVyc2lvbiBudW1iZXIpLgorCisgLSBwdXNoIHlvdXIgY2hhbmdlcyBhbmQgdGhlIHRhZyB0byB0aGUgY2VudHJhbCByZXBvc2l0b3J5IHdpdGgKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBkYnVzLVguWSBkYnVzLVguWS5aCisKKyAtIHNjcCB5b3VyIHRhcmJhbGwgdG8gZnJlZWRlc2t0b3Aub3JnIHNlcnZlciBhbmQgY29weSBpdCB0bworICAgZGJ1cy5mcmVlZGVza3RvcC5vcmc6L3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cvcmVsZWFzZXMvZGJ1cy9kYnVzLVguWS5aLnRhci5nei4KKyAgIFRoaXMgc2hvdWxkIGJlIHBvc3NpYmxlIGlmIHlvdSdyZSBpbiBncm91cCAiZGJ1cyIKKworIC0gVXBkYXRlIHRoZSBvbmxpbmUgZG9jdW1lbnRhdGlvbiB3aXRoIGBtYWtlIC1DIGRvYyBtYWludGFpbmVyLXVwbG9hZC1kb2NzYC4KKworIC0gdXBkYXRlIHRoZSB3aWtpIHBhZ2UgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvU29mdHdhcmUvZGJ1cyBieQorICAgYWRkaW5nIHRoZSBuZXcgcmVsZWFzZSB1bmRlciB0aGUgRG93bmxvYWQgaGVhZGluZy4gVGhlbiwgY3V0IHRoZQorICAgbGluayBhbmQgY2hhbmdlbG9nIGZvciB0aGUgcHJldmlvdXMgdGhhdCB3YXMgdGhlcmUuCisKKyAtIHVwZGF0ZSB0aGUgd2lraSBwYWdlCisgICBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9Tb2Z0d2FyZS9EYnVzUmVsZWFzZUFyY2hpdmUgcGFzdGluZyB0aGUKKyAgIHByZXZpb3VzIHJlbGVhc2UuIE5vdGUgdGhhdCBidWxsZXQgcG9pbnRzIGZvciBlYWNoIG9mIHRoZSBjaGFuZ2Vsb2cKKyAgIGl0ZW1zIG11c3QgYmUgaW5kZW50ZWQgdGhyZWUgbW9yZSBzcGFjZXMgdG8gY29uZm9ybSB0byB0aGUKKyAgIGZvcm1hdHRpbmcgb2YgdGhlIG90aGVyIHJlbGVhc2VzIHRoZXJlLgorICAKKyAtIHBvc3QgdG8gZGJ1c0BsaXN0cy5mcmVlZGVza3RvcC5vcmcgYW5ub3VuY2luZyB0aGUgcmVsZWFzZS4KKyAKKworTWFraW5nIGEgIi4wIiBzdGFibGUgcmVsZWFzZQorPT09CisKK1dlIGNyZWF0ZSBhIGJyYW5jaCBmb3IgZWFjaCBzdGFibGUgcmVsZWFzZS4gVGhlIGJyYW5jaCBuYW1lIHNob3VsZCBiZQorZGJ1cy1YLlkgd2hpY2ggaXMgYSBicmFuY2ggdGhhdCBoYXMgcmVsZWFzZXMgdmVyc2lvbmVkIFguWS5aOworY2hhbmdlcyBvbiBhIHN0YWJsZSBicmFuY2ggc2hvdWxkIGJlIGxpbWl0ZWQgdG8gc2lnbmlmaWNhbnQgYnVnIGZpeGVzLgorCitCZWNhdXNlIHdlIHdvbid0IG1ha2UgbWlub3IgY2hhbmdlcyBsaWtlIGtlZXBpbmcgdXAgd2l0aCB0aGUgbGF0ZXN0CitkZXByZWNhdGlvbnMgb24gYSBzdGFibGUgYnJhbmNoLCBzdGFibGUgYnJhbmNoZXMgc2hvdWxkIHR1cm4gb2ZmIHRoZQorZ2NjIHdhcm5pbmcgZm9yIGRlcHJlY2F0ZWQgZGVjbGFyYXRpb25zIChlLmcuIHNlZSBjb21taXQgNGViYjI3NWFiNykuCisKK0JlIGV4dHJhLWNhcmVmdWwgbm90IHRvIG1lcmdlIG1hc3RlciAob3IgYW55IGJyYW5jaCBiYXNlZCBvbiBtYXN0ZXIpIGludG8gYQorc3RhYmxlIGJyYW5jaC4KKworVG8gYnJhbmNoOgorICBnaXQgYnJhbmNoIGRidXMtWC5ZCithbmQgdXBsb2FkIHRoZSBicmFuY2ggdGFnIHRvIHRoZSBzZXJ2ZXI6CisgIGdpdCBwdXNoIG9yaWdpbiBkYnVzLVguWQorCitUbyBkZXZlbG9wIGluIHRoaXMgYnJhbmNoOgorICBnaXQgY2hlY2tvdXQgZGJ1cy1YLlkKKworRW52aXJvbm1lbnQgdmFyaWFibGVzCis9PT0KKworVGhlc2UgYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkKKworREJVU19WRVJCT1NFPTEKK1R1cm5zIG9uIHByaW50aW5nIHZlcmJvc2UgbWVzc2FnZXMuIFRoaXMgb25seSB3b3JrcyBpZiBELUJ1cyBoYXMgYmVlbgorY29tcGlsZWQgd2l0aCAtLWVuYWJsZS12ZXJib3NlLW1vZGUKKworREJVU19NQUxMT0NfRkFJTF9OVEg9bgorQ2FuIGJlIHNldCB0byBhIG51bWJlciwgY2F1c2luZyBldmVyeSBudGggY2FsbCB0byBkYnVzX2FsbG9jIG9yCitkYnVzX3JlYWxsb2MgdG8gZmFpbC4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKKy0tZW5hYmxlLXRlc3RzLgorCitEQlVTX01BTExPQ19GQUlMX0dSRUFURVJfVEhBTj1uCitDYW4gYmUgc2V0IHRvIGEgbnVtYmVyLCBjYXVzaW5nIGV2ZXJ5IGNhbGwgdG8gZGJ1c19hbGxvYyBvcgorZGJ1c19yZWFsbG9jIHRvIGZhaWwgaWYgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBhbGxvY2F0ZWQgaXMgZ3JlYXRlcgordGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlci4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKKy0tZW5hYmxlLXRlc3RzLgorCitEQlVTX1RFU1RfTUFMTE9DX0ZBSUxVUkVTPW4KK01hbnkgb2YgdGhlIEQtQnVzIHRlc3RzIHdpbGwgcnVuIG92ZXIgYW5kIG92ZXIsIG9uY2UgZm9yIGVhY2ggbWFsbG9jCitpbnZvbHZlZCBpbiB0aGUgdGVzdC4gRWFjaCBydW4gd2lsbCBmYWlsIGEgZGlmZmVyZW50IG1hbGxvYywgcGx1cyBzb21lCitudW1iZXIgb2YgbWFsbG9jcyBmb2xsb3dpbmcgdGhhdCBtYWxsb2MgKGJlY2F1c2UgYSBmYWlyIG51bWJlciBvZiBidWdzCitvbmx5IGhhcHBlbiBpZiB0d28gb3IgbW9yZSBtYWxsb2NzIGZhaWwgaW4gYSByb3csIGUuZy4gZXJyb3IgcmVjb3ZlcnkKK3RoYXQgaXRzZWxmIGludm9sdmVzIG1hbGxvYykuICBUaGlzIGVudiB2YXJpYWJsZSBzZXRzIHRoZSBudW1iZXIgb2YKK21hbGxvY3MgdG8gZmFpbC4KK0hlcmUncyB3aHkgeW91IGNhcmU6IElmIHNldCB0byAwLCB0aGVuIHRoZSBtYWxsb2MgY2hlY2tpbmcgaXMgc2tpcHBlZCwKK3doaWNoIG1ha2VzIHRoZSB0ZXN0IHN1aXRlIGEgaGVjayBvZiBhIGxvdCBmYXN0ZXIuIEp1c3QgcnVuIHdpdGggdGhpcworZW52IHZhcmlhYmxlIHVuc2V0IGJlZm9yZSB5b3UgY29tbWl0LgorCitUZXN0cworPT09CisKK1RoZXNlIGFyZSB0aGUgdGVzdCBwcm9ncmFtcyB0aGF0IGFyZSBidWlsdCBpZiBkYnVzIGlzIGNvbXBpbGVkIHVzaW5nCistLWVuYWJsZS10ZXN0cy4KKworZGJ1cy90ZXN0LWRidXMKK1RoaXMgaXMgdGhlIG1haW4gdW5pdCB0ZXN0IHByb2dyYW0gdGhhdCB0ZXN0cyBhbGwgYXNwZWN0cyBvZiB0aGUgRC1CdXMKK2NsaWVudCBsaWJyYXJ5LgorCitkYnVzL2J1cy10ZXN0CitUaGlzIGl0IHRoZSB1bml0IHRlc3QgcHJvZ3JhbSBmb3IgdGhlIG1lc3NhZ2UgYnVzLgorCit0ZXN0L2JyZWFrLWxvYWRlcgorQSB0ZXN0IHRoYXQgdHJpZXMgdG8gYnJlYWsgdGhlIG1lc3NhZ2UgbG9hZGVyIGJ5IHBhc3NpbmcgaXQgcmFuZG9tbHkKK2NyZWF0ZWQgaW52YWxpZCBtZXNzYWdlcy4KKwordGVzdC9uYW1lLXRlc3QvKgorVGhpcyBpcyBhIHN1aXRlIG9mIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gd2l0aCBhIHRlbXBvcmFyeSBzZXNzaW9uIGJ1cy4KK0lmIHlvdXIgdGVzdCBpbnZvbHZlcyBtdWx0aXBsZSBwcm9jZXNzZXMgY29tbXVuaWNhdGluZywgeW91ciBiZXN0IGJldAoraXMgdG8gYWRkIGEgdGVzdCBpbiBoZXJlLgorCisibWFrZSBjaGVjayIgcnVucyBhbGwgdGhlIGRldGVybWluaXN0aWMgdGVzdCBwcm9ncmFtcyAoaS5lLiBub3QgYnJlYWstbG9hZGVyKS4KKworIm1ha2UgbGNvdi1jaGVjayIgaXMgYXZhaWxhYmxlIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jb21waWxlci1jb3ZlcmFnZQorYW5kIGdpdmVzIGEgY29tcGxldGUgcmVwb3J0IG9uIHRlc3Qgc3VpdGUgY292ZXJhZ2UuCisKK1BhdGNoZXMKKz09PQorCitQbGVhc2UgZmlsZSB0aGVtIGF0IGh0dHA6Ly9idWd6aWxsYS5mcmVlZGVza3RvcC5vcmcgdW5kZXIgY29tcG9uZW50CitkYnVzLCBhbmQgYWxzbyBwb3N0IHRvIHRoZSBtYWlsaW5nIGxpc3QgZm9yIGRpc2N1c3Npb24uICBUaGUgY29tbWl0CitydWxlcyBhcmU6CisKKyAtIGZvciBmaXhlcyB0aGF0IGRvbid0IGFmZmVjdCBBUEkgb3IgcHJvdG9jb2wsIHRoZXkgY2FuIGJlIGNvbW1pdHRlZAorICAgaWYgYW55IG9uZSBxdWFsaWZpZWQgcmV2aWV3ZXIgb3RoZXIgdGhhbiBwYXRjaCBhdXRob3IKKyAgIHJldmlld3MgYW5kIGFwcHJvdmVzCisKKyAtIGZvciBmaXhlcyB0aGF0IGRvIGFmZmVjdCBBUEkgb3IgcHJvdG9jb2wsIHR3byBwZW9wbGUKKyAgIGluIHRoZSByZXZpZXdlciBncm91cCBoYXZlIHRvIHJldmlldyBhbmQgYXBwcm92ZSB0aGUgY29tbWl0LCBhbmQgCisgICBwb3N0aW5nIHRvIHRoZSBsaXN0IGlzIGRlZmluaXRlbHkgbWFuZGF0b3J5CisKKyAtIGlmIHRoZXJlJ3MgYSBsaXZlIHVucmVzb2x2ZWQgY29udHJvdmVyc3kgYWJvdXQgYSBjaGFuZ2UsCisgICBkb24ndCBjb21taXQgaXQgd2hpbGUgdGhlIGFyZ3VtZW50IGlzIHN0aWxsIHJhZ2luZy4KKworIC0gYXQgdGhlaXIgZGlzY3JldGlvbiwgbWVtYmVycyBvZiB0aGUgcmV2aWV3ZXIgZ3JvdXAgbWF5IGFsc28gY29tbWl0CisgICBicmFuY2hlcy9wYXRjaGVzIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgIC0gdGhlIGJyYW5jaCBkb2VzIG5vdCBhZGQgb3IgY2hhbmdlIEFQSSwgQUJJIG9yIHdpcmUtcHJvdG9jb2wKKworICAgLSB0aGUgYnJhbmNoIHNvbHZlcyBhIGtub3duIHByb2JsZW0gYW5kIGlzIGNvdmVyZWQgYnkgdGhlIHJlZ3Jlc3Npb24gdGVzdHMKKworICAgLSB0aGVyZSBhcmUgbm8gb2JqZWN0aW9ucyBmcm9tIHRoZSByZXN0IG9mIHRoZSByZXZpZXcgZ3JvdXAgd2l0aGluCisgICAgIGEgd2VlayBvZiB0aGUgcGF0Y2hlcyBiZWluZyBhdHRhY2hlZCB0byBCdWd6aWxsYQorCisgICAtIHRoZSBjb21taXR0ZXIgZ2V0cyBhIHBvc2l0aXZlIHJldmlldyBvbiBCdWd6aWxsYSBmcm9tIHNvbWVvbmUgdGhleQorICAgICBjb25zaWRlciBxdWFsaWZpZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2UgKGUuZy4gYSBjb2xsZWFndWUgd2l0aCBELUJ1cworICAgICBleHBlcmllbmNlOyBub3QgbmVjZXNzYXJpbHkgYSBtZW1iZXIgb2YgdGhlIHJldmlld2VyIGdyb3VwKQorCisgLSByZWdhcmRsZXNzIG9mIHJldmlld3MsIHRvIGNvbW1pdCBhIHBhdGNoOgorICAgIC0gbWFrZSBjaGVjayBtdXN0IHBhc3MKKyAgICAtIHRoZSB0ZXN0IHN1aXRlIG11c3QgYmUgZXh0ZW5kZWQgdG8gY292ZXIgdGhlIG5ldyBjb2RlCisgICAgICBhcyBtdWNoIGFzIHJlYXNvbmFibHkgZmVhc2libGUgKHNlZSBUZXN0cyBhYm92ZSkKKyAgICAtIHRoZSBwYXRjaCBoYXMgdG8gZm9sbG93IHRoZSBwb3J0YWJpbGl0eSwgc2VjdXJpdHksIGFuZCAKKyAgICAgIHN0eWxlIGd1aWRlbGluZXMKKyAgICAtIHRoZSBwYXRjaCBzaG91bGQgYXMgbXVjaCBhcyByZWFzb25hYmxlIGRvIG9uZSB0aGluZywgCisgICAgICBub3QgbWFueSB1bnJlbGF0ZWQgY2hhbmdlcworICAgTm8gcmV2aWV3ZXIgc2hvdWxkIGFwcHJvdmUgYSBwYXRjaCB3aXRob3V0IHRoZXNlIGF0dHJpYnV0ZXMsIGFuZAorICAgZmFpbHVyZSBvbiB0aGVzZSBwb2ludHMgaXMgZ3JvdW5kcyBmb3IgcmV2ZXJ0aW5nIHRoZSBwYXRjaC4KKworVGhlIHJldmlld2VyIGdyb3VwIHRoYXQgY2FuIGFwcHJvdmUgcGF0Y2hlczoKKworSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3gubmV0PgorTWljaGFlbCBNZWVrcyA8bWljaGFlbC5tZWVrc0Bub3ZlbGwuY29tPgorQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgorSm9lIFNoYXcgPGpvZUBhc3NiYXJuLmNvbT4KK01pa2FlbCBIYWxsZW5kYWwgPG1pY2tlQGltZW5kaW8uY29tPgorUmljaGFyZCBIdWx0IDxyaWNoYXJkQGltZW5kaW8uY29tPgorT3dlbiBGcmFzZXItR3JlZW4gPG93ZW5AZGlzY29iYWJlLm5ldD4KK09saXZpZXIgQW5kcmlldSA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CitUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorSm9obiBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1dpbGwgVGhvbXBzb24gPHdpbGwudGhvbXBzb25AY29sbGFib3JhLmNvLnVrPgorU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KK0RhdmlkIFpldXRoZW4gPGRhdmlkekByZWRoYXQuY29tPgpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmMDEyMgotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwKQEAgLTAsMCArMSwyNDggQEAKKyAgICAgICAgICAgREJ1cyBJbnN0YWxsYXRpb24KKyAgICAgICAgICAgPT09PT09PT09PT09PT09PT0KKworUXVpY2sgc3RhcnQKKz09PT09PT09PT09CisKK0RCdXMgY291bGQgYmUgYnVpbGQgd2l0aCBHTlUgQXV0b1Rvb2xzIG9yIHdpdGggY21ha2UgZm9yIGl0cyBidWlsZCBzeXN0ZW0sCit0aHVzIHRoZSBiYXNpYyBpbnN0YWxsIHByb2NlZHVyZSBjYW4gYmUgc3VtbWFyaXplZCBhczoKKword2l0aCBhdXRvdG9vbHM6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisgICAgbWFrZQorICAgIHN1IG1ha2UgaW5zdGFsbAorCitUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdHJ5IGFuZAorYnVpbGQgYmluZGluZ3MgZm9yIEdMaWIsIFF0LCBRdDMsIFB5dGhvbiBhbmQgTW9ubyBiYXNlZCBvbiB3aGF0IHRvb2xzCithcmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0IHN5c3RlbS4gVGhlIGRlZmF1bHQgYnVpbGQgYmVoYXZpb3VyIGNhbiBiZQorb3ZlcnJpZGRlbiB1c2luZyB0aGUgLS1lbmFibGUtWFhYLy0tZGlzYWJsZS1YWFggYXJndW1lbnRzIHRvIGNvbmZpZ3VyZS4KK0EgdHlwaWNhbCBzY2VuYXJpbyBpbiB3aGljaCBpdCBpcyBkZXNpcmFibGUgdG8gb3ZlcnJpZGUgYXV0b21hdGljCitkZXRlY3Rpb24sIGlzIGR1cmluZyBwYWNrYWdpbmcgb2YgYmluYXJ5IGJ1aWxkcywgd2hlcmUgYSBwcmVkaWN0YWJsZQorZGVwZW5kYW5jeSBjaGFpbiBpcyByZXF1aXJlZC4gRm9yIG1vcmUgZGV0YWlscyBvbiBHTlUgQXV0b1Rvb2xzCitpbnN0YWxsYXRpb24sIGNvbnN1bHQgdGhlIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQKKword2l0aCBjbWFrZToKKyAgICBta2RpciBkYnVzLWJ1aWxkLWRpcgorICAgIGNkIGRidXMtYnVpbGQtZGlyCisgICAgY21ha2UgLUcgPG1ha2VmaWxlLWdlbmVyYXRvci1uYW1lPiBbLUQ8b3B0aW9uPl0gPGRidXMtc3JjLXJvb3Q+L2NtYWtlCisgICAgbWFrZQorICAgIG1ha2UgaW5zdGFsbAorCitjbWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYnVpbGQgc29tZSBmZWF0dXJlcworYmFzZWQgb24gd2hhdCB0b29scyBhbmQvb3IgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiAKK1RoZSBkZWZhdWx0IGJ1aWxkIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgCistREVOQUJMRV88WFhYPiBhcmd1bWVudHMgdG8gY21ha2UuCitBIHR5cGljYWwgc2NlbmFyaW8gaW4gd2hpY2ggaXQgaXMgZGVzaXJhYmxlIHRvIG92ZXJyaWRlIGF1dG9tYXRpYworZGV0ZWN0aW9uLCBpcyBkdXJpbmcgcGFja2FnaW5nIG9mIGJpbmFyeSBidWlsZHMsIHdoZXJlIGEgcHJlZGljdGFibGUKK2RlcGVuZGFuY3kgY2hhaW4gaXMgcmVxdWlyZWQuIEZvciBtb3JlIGRldGFpbHMgb24gY21ha2UgaW5zdGFsbGF0aW9uLCAKK2NvbnN1bHQgaHR0cDovL3d3dy5jbWFrZS5vcmcvY21ha2UvaGVscC9oZWxwLmh0bWwuIAorCitFeHRlcm5hbCBzb2Z0d2FyZSBkZXBlbmRhbmNpZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgb25seSBmdW5kYW1lbnRhbCByZXF1aXJlbWVudCB0byBidWlsZCBEQnVzIGlzIGFuIFhNTCBwYXJzZXIsCitob3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgc29mdHdhcmUgcGFja2FnZXMgd2hpY2ggKGlmCitwcmVzZW50KSB3aWxsIGVuaGFuY2UgZnVuY3Rpb25hbGl0eS4KKworQ29yZSBsaWJyYXJ5CistLS0tLS0tLS0tLS0KKworIFJlcXVpc2l0ZToKKworICAtIEdldHRleHQKKyAgLSBleHBhdAorCisgT3B0aW9uYWw6CisKKyAgLSBsaWJzZWxpbnV4ICAgICAgICAgICAoZm9yIFNFTGludXggaW50ZWdyYXRpb24pCisgIC0gZG94eWdlbiAgICAgICAgICAgICAgKGZvciBBUEkgZG9jdW1lbnRhdGlvbikKKyAgLSB4bWx0byBvciBtZWlucHJvYzQgICAoZm9yIFNwZWMgJiBvdGhlciBYTUwgZG9jdW1lbnRhdGlvbikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBjb250YWlucyB0aGUgZ2VuZXJpYyBHTlUgQXV0b1Rvb2xzIGluc3RhbGwKK2luc3J1Y3Rpb25zLi4uLgorCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTCBiL01PRFVMRV9MSUNFTlNFX0FGTF9BTkRfR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZhYjhiCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorU1VCRElSUz1kYnVzIGJ1cyB0b29scyB0ZXN0IGRvYworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IGRidXMtMS5wYworCitESVNUQ0xFQU5GSUxFUyA9IAkJXAorCWRidXMtMS5wYworCitFWFRSQV9ESVNUID0JCQlcCisJYXV0b2dlbi5zaAkJXAorCUhBQ0tJTkcJCQlcCisJZGJ1cy0xLnBjLmluCQlcCisJY2xlYW51cC1tYW4tcGFnZXMuc2ggICAgXAorICAgICAgICBDaGFuZ2VMb2cucHJlLTEtMCAgICAgICBcCisgICAgICAgIE5FV1MucHJlLTEtMCAgICAgICAgICAgIFwKKwlDaGFuZ2VMb2cucHJlLTEtMiAgICAgICBcCisgICAgICAgIE5FV1MucHJlLTEtMgkJXAorCVJFQURNRS52YWxncmluZAkJXAorCVJFQURNRS53aW4JCVwKKwlSRUFETUUud2luY2UJCVwKKwlSRUFETUUuY3lnd2luCQlcCisJUkVBRE1FLmxhdW5jaGQJCVwKKwljbWFrZQorCithbGwtbG9jYWw6IERveHlmaWxlCisKK3VwZGF0ZS1hdXRob3JzOgorCWdpdCBzaG9ydGxvZyAtcyAtZSB8IGN1dCAtYyA4LSB8IHNvcnQgPiBBVVRIT1JTCisKK0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MgPSBcCisJLS1lbmFibGUteG1sLWRvY3MgXAorCS0td2l0aC1zeXN0ZW1kc3lzdGVtdW5pdGRpcj0kJGRjX2luc3RhbGxfYmFzZS8kKHN5c3RlbWRzeXN0ZW11bml0ZGlyKQorCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNCAke0FDTE9DQUxfRkxBR1N9CisKK2luY2x1ZGUgdG9vbHMvbGNvdi5hbQpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNGNjYwotLS0gL2Rldi9udWxsCisrKyBiL05FV1MKQEAgLTAsMCArMSwyMDg1IEBACitELUJ1cyAxLjEwLjEyICgyMDE2LTEwLTEwKQorPT0KKworVGhlIOKAnG5vdCBleGNlc3NpdmVseSBpbmhvc3BpdGFibGXigJ0gcmVsZWFzZS4KKworU2VjdXJpdHkgZml4ZXM6CisKK+KAoiBEbyBub3QgdHJlYXQgQWN0aXZhdGlvbkZhaWx1cmUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHJvb3Qtb3duZWQgc3lzdGVtZAorICBuYW1lIGFzIGEgZm9ybWF0IHN0cmluZy4gSW4gcHJpbmNpcGxlIHRoaXMgaXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LAorICBidXQgd2UgZG8gbm90IGJlbGlldmUgaXQgaXMgZXhwbG9pdGFibGUgaW4gcHJhY3RpY2UsIGJlY2F1c2Ugb25seQorICBwcml2aWxlZ2VkIHByb2Nlc3NlcyBjYW4gb3duIHRoZSBvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEgYnVzIG5hbWUsIGFuZAorICBzeXN0ZW1kIGRvZXMgbm90IGFwcGVhciB0byBzZW5kIGFjdGl2YXRpb24gZmFpbHVyZXMgdGhhdCBjb250YWluICIlIi4KKworICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgcHJvYmFibHkgKndhcyogZXhwbG9pdGFibGUgaW4gZGJ1cyB2ZXJzaW9ucworICBvbGRlciB0aGFuIDEuNi4zMCwgMS44LjE2IGFuZCAxLjkuMTAgZHVlIHRvIGEgbWlzc2luZyBjaGVjayB3aGljaCBhdAorICB0aGUgdGltZSB3YXMgb25seSB0aG91Z2h0IHRvIGJlIGEgZGVuaWFsIG9mIHNlcnZpY2UgdnVsbmVyYWJpbGl0eQorICAoQ1ZFLTIwMTUtMDI0NSkuIElmIHlvdSBhcmUgc3RpbGwgcnVubmluZyBvbmUgb2YgdGhvc2UgdmVyc2lvbnMsCisgIHBhdGNoIG9yIHVwZ3JhZGUgaW1tZWRpYXRlbHkuCisKKyAgKGZkLm8gIzk4MTU3LCBTaW1vbiBNY1ZpdHRpZSkKKworT3RoZXIgZml4ZXM6CisKK+KAoiBIYXJkZW4gZGJ1cy1kYWVtb24gYWdhaW5zdCBtYWxpY2lvdXMgb3IgaW5jb3JyZWN0IEFjdGl2YXRpb25GYWlsdXJlCisgIG1lc3NhZ2VzIGJ5IHJlamVjdGluZyB0aGVtIGlmIHRoZXkgZG8gbm90IGNvbWUgZnJvbSBhIHByaXZpbGVnZWQKKyAgcHJvY2Vzcywgb3IgaWYgc3lzdGVtZCBhY3RpdmF0aW9uIGlzIG5vdCBlbmFibGVkCisgIChmZC5vICM5ODE1NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyByZXBseSBzZXJpYWwgbnVtYmVyIHdpdGhvdXQgZ29pbmcKKyAgdmlhIHVuaW9uIERCdXNCYXNpY1ZhbHVlIChmZC5vICM5ODAzNSwgTWFyYyBNdXR6KQorCivigKIgYXV0b2dlbi5zaDogZmFpbCBjbGVhbmx5IGlmIGF1dG9jb25mIGZhaWxzIChTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS4xMC4xMCAoMjAxNi0wOC0xNSkKKz09CisKK1RoZSDigJx0dW5nc3RlbiBkb29y4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgT24gTGludXgsIHdoZW4gZGJ1cy1kYWVtb24gaXMgcnVuIHdpdGggcmVkdWNlZCBzdXNjZXB0aWJpbGl0eSB0byB0aGUKKyAgT09NIGtpbGxlciAodHlwaWNhbGx5IHZpYSBzeXN0ZW1kKSwgZG8gbm90IGxldCBjaGlsZCBwcm9jZXNzZXMgaW5oZXJpdAorICB0aGF0IHNldHRpbmcgKGZkLm8gIzMyODUxOyBLaW1tbyBIw6Rtw6Rsw6RpbmVuLCBXYUx5b25nIENobykKKwor4oCiIE91dHB1dCB2YWxpZCBzaGVsbCBzeW50YXggaW4gfi8uZGJ1cy9zZXNzaW9uLWJ1cy8gaWYgdGhlIGJ1cyBhZGRyZXNzCisgIGNvbnRhaW5zIGEgc2VtaWNvbG9uIChmZC5vICM5NDc0NiwgVGhpYWdvIE1hY2llaXJhKQorCivigKIgRml4IG1lbW9yeSBsZWFrcyBhbmQgdGhyZWFkIHNhZmV0eSBpbiBzdWJwcm9jZXNzIHN0YXJ0aW5nIG9uIFdpbmRvd3MKKyAgKGZkLm8gIzk1MTkxLCBSYWxmIEhhYmFja2VyKQorCivigKIgRG8gbm90IHJlcXVpcmUgc3lzdGVtZCB0byBoYXZlIGEgc2VydmljZSBmaWxlIGlmIHVzaW5nIGl0IGZvciBhY3RpdmF0aW9uCisgIChmZC5vICM5MzE5NDsgU2ltb24gTWNWaXR0aWU7IGJhY2twb3J0IGZyb20gMS4xMS4wKQorCivigKIgU3RvcCB0ZXN0LWRidXMtZGFlbW9uIGluY29ycmVjdGx5IGZhaWxpbmcgb24gcGxhdGZvcm1zIHRoYXQgY2Fubm90CisgIGRpc2NvdmVyIHRoZSBwcm9jZXNzIElEIG9mIGNsaWVudHMgKGZkLm8gIzk2NjUzLCDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyKQorCivigKIgSW4gdGVzdHMgdGhhdCBleGVyY2lzZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNyYXNoaW5nIEQtQnVzIHNlcnZpY2VzLAorICBzdXBwcmVzcyBXaW5kb3dzIGNyYXNoIGhhbmRsZXIgKGZkLm8gIzk1MTU1OyBZaXlhbmcgRmVpLCBSYWxmIEhhYmFja2VyKQorCivigKIgRXhwbGljaXRseSBjaGVjayBmb3Igc3RkaW50LmggKElvYW4tQWRyaWFuIFJhdGl1KQorCivigKIgdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ6IHByb2R1Y2UgYmV0dGVyIGRpYWdub3N0aWNzIG9uIGVycm9yCisgIChmZC5vICM5NjY1MywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEb24ndCBmYWlsIHRoZSBidWlsZCB3aXRoIGFuIHVudXNlZCBjb25zdCB2YXJpYWJsZSB3YXJuaW5nIHVuZGVyIGdjYyA2CisgIChmZC5vICM5NzI4MjsgVGhvbWFzIFppbW1lcm1hbm4sIFNpbW9uIE1jVml0dGllKQorCivigKIgTWVyZ2UgZGJ1cy0xLjEwLWNpIGJyYW5jaCwgY29udGFpbmluZyBiYWNrcG9ydHMgZnJvbSAxLjExLjAgaW4gYnVpbGQvdGVzdAorICBjb2RlIHRvIHN1cHBvcnQgY29udGludW91cyBpbnRlZ3JhdGlvbiAoZmQubyAjOTMxOTQsIFNpbW9uIE1jVml0dGllKQorCisgIMK3IEF2b2lkIC1XdW51c2VkLWxhYmVsIHdoZW4gY29tcGlsaW5nIHdpdGggbGlic2VsaW51eCBidXQgbm8gbGliYXVkaXQKKyAgwrcgSW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBhbGxvdyBPT00gdGVzdHMgdG8gYmUgZGlzYWJsZWQgYXMgZG9jdW1lbnRlZAorICDCtyBBY2NlcHQgYW5kIGlnbm9yZSB0aGUgLS10YXAgYXJndW1lbnQgaW4gYWxsICJlbWJlZGRlZCB0ZXN0cyIsIGFuZCBydW4KKyAgICBhbGwgYXV0b21hdGVkIHRlc3RzIHdpdGggdGhhdCBhcmd1bWVudCBmb3IgYmV0dGVyIGRpYWdub3N0aWNzCisgIMK3IEZpeCB0aGUgc3lzdGVtZCBhY3RpdmF0aW9uIHRlc3QgdW5kZXIgQ01ha2UgYnkgaW5zdGFsbGluZyB0aGUgcmVxdWlyZWQKKyAgICBmaWxlcworICDCtyBJbiBBdXRvbWFrZSwgZml4IHNoZWxsIHN5bnRheCBmb3IgaW5zdGFsbGNoZWNrLWxvY2FsIHdpdGggbm8gREVTVERJUgorICDCtyBJbiBBdXRvbWFrZSwgZG9uJ3QgdHJ5IHRvIHJ1biBtYW51YWwgdGVzdHMgaW4gaW5zdGFsbGNoZWNrCisgIMK3IEluIENNYWtlLCBkb24ndCBydW4gbWFudWFsLXRjcCB0ZXN0IGFzIGFuIGF1dG9tYXRlZCB0ZXN0CisgIMK3IEFkZCB0cmF2aXMtY2kub3JnIGJ1aWxkIG1hY2hpbmVyeQorCitELUJ1cyAxLjEwLjggKDIwMTYtMDMtMDcpCis9PQorCitUaGUg4oCcZGlnZXN0aXZlIGJpc2N1aXRz4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgRW5hYmxlICJsYXJnZSBmaWxlIHN1cHBvcnQiIG9uIHN5c3RlbXMgd2hlcmUgaXQgZXhpc3RzOiBkYnVzLWRhZW1vbgorICBpcyBub3QgZXhwZWN0ZWQgdG8gb3BlbiBsYXJnZSBmaWxlcywgYnV0IGl0IG1pZ2h0IG5lZWQgdG8gc3RhdCBmaWxlcworICB0aGF0IGhhcHBlbiB0byBoYXZlIGxhcmdlIGlub2RlIG51bWJlcnMgKGZkLm8gIzkzNTQ1LCBIb25neHUgSmlhKQorCivigKIgRWxpbWluYXRlIHBhZGRpbmcgaW5zaWRlIERCdXNNZXNzYWdlSXRlciBvbiA2NC1iaXQgcGxhdGZvcm1zLAorICB3aGljaCBtaWdodCByZXN1bHQgaW4gYSBwZWRhbnRpYyBDIGNvbXBpbGVyIG5vdCBjb3B5aW5nIHRoZSBlbnRpcmUgY29udGVudHMKKyAgb2YgYSBEQnVzTWVzc2FnZUl0ZXI7IHN0YXRpY2FsbHkgYXNzZXJ0IHRoYXQgdGhpcyBpcyBub3QgYW4gQUJJIGNoYW5nZQorICBpbiBwcmFjdGljZSAoZmQubyAjOTQxMzYsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9jdW1lbnQgZGJ1cy10ZXN0LXRvb2wgZWNobyAtLXNsZWVwLW1zPU4gaW5zdGVhZCBvZiBpbmNvcnJlY3QgLS1zbGVlcD1OCisgIChmZC5vICM5NDI0NCwgRG1pdHJpIElvdWNodGNoZW5rbykKKwor4oCiIENvcnJlY3RseSByZXBvcnQgdGVzdCBmYWlsdXJlcyBpbiBDIHRlc3RzIGZyb20gcnVuLXRlc3Quc2gKKyAgKGZkLm8gIzkzMzc5OyBhbWl0IHRld2FyaSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaGVuIHRlc3RzIGFyZSBlbmFibGVkLCBydW4gYWxsIHRoZSBtYXJzaGFsLXZhbGlkYXRlIHRlc3RzLCBub3QganVzdAorICB0aGUgZXZlbi1udW1iZXJlZCBvbmVzIChmZC5vICM5MzkwOCwgTmljayBMZXd5Y2t5KQorCivigKIgQ29ycmVjdCB0aGUgZXhwZWN0ZWQgZXJyb3IgZnJvbSBvbmUgbWFyc2hhbC12YWxpZGF0ZSB0ZXN0LCB3aGljaCB3YXMKKyAgcHJldmlvdXNseSBub3QgcnVuIGR1ZSB0byB0aGUgYWJvdmUgYnVnIChmZC5vICM5MzkwOCwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTAuNiAoMjAxNS0xMi0wMSkKKz09CisKK1RoZSDigJxtYXJ6aXBhbiBiZWV0bGVz4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgT24gVW5peCB3aGVuIHJ1bm5pbmcgdGVzdHMgYXMgcm9vdCwgZG9uJ3QgYXNzZXJ0IHRoYXQgcm9vdCBhbmQKKyAgdGhlIGRidXMtZGFlbW9uIHVzZXIgY2FuIHN0aWxsIGNhbGwgVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50OworICBhc3NlcnQgdGhhdCB0aG9zZSBwcml2aWxlZ2VkIHVzZXJzIGNhbiBjYWxsIEJlY29tZU1vbml0b3IgaW5zdGVhZAorICAoZmQubyAjOTMwMzYsIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gV2luZG93cywgZml4IGEgbWVtb3J5IGxlYWsgaW4gdGhlIGF1dG9sYXVuY2ggdHJhbnNwb3J0IChmZC5vICM5Mjg5OSwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBXaW5kb3dzIEF1dG90b29scyBidWlsZHMsIGRvbid0IHJ1biB0ZXN0cyB0aGF0IHJlbHkgb24KKyAgZGJ1cy1ydW4tc2Vzc2lvbiBhbmQgb3RoZXIgVW5peC1zcGVjaWZpY3MgKGZkLm8gIzkyODk5LCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS4xMC40ICgyMDE1LTExLTE3KQorPT0KKworVGhlIOKAnEZyb3N0YnVybiBDYW55b27igJ0gcmVsZWFzZS4KKworRW5oYW5jZW1lbnRzOgorCivigKIgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzLCBHZXRDb25uZWN0aW9uVW5peFVzZXIgYW5kCisgIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIHdpdGggYXJndW1lbnQgIm9yZy5mcmVlZGVza3RvcC5EQnVzIgorICB3aWxsIG5vdyByZXR1cm4gZGV0YWlscyBvZiB0aGUgZGJ1cy1kYWVtb24gaXRzZWxmLiBUaGlzIGlzIHJlcXVpcmVkCisgIHRvIGJlIGFibGUgdG8gY2FsbCBTZXRFbnZpcm9ubWVudCBvbiBzeXN0ZW1kLgorICAoZmQubyAjOTI4NTcsIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMpCisKK0ZpeGVzOgorCivigKIgTWFrZSBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgYWx3YXlzIGZhaWwgd2l0aCBBY2Nlc3NEZW5pZWQgb24gdGhlCisgIHN5c3RlbSBidXMuIFByZXZpb3VzbHksIGl0IHdhcyBwb3NzaWJsZSB0byBjb25maWd1cmUgaXQgc28gcm9vdCBjb3VsZAorICBjYWxsIGl0LCBidXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3ZXJlIG5vdCBhY3R1YWxseSB1c2VkLAorICBiZWNhdXNlIHRoZSBsYXVuY2ggaGVscGVyIHdvdWxkIGRpc2NhcmQgdGhlbS4KKyAgKGZkLm8gIzkyODU3LCBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zKQorCivigKIgT24gVW5peCB3aXRoIC0tc3lzdGVtZC1hY3RpdmF0aW9uIG9uIGEgdXNlciBidXMsIG1ha2UKKyAgVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IHBhc3Mgb24gaXRzIGFyZ3VtZW50cyB0byBzeXN0ZW1kJ3MKKyAgU2V0RW52aXJvbm1lbnQgbWV0aG9kLCBzb2x2aW5nIGluY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgZW52aXJvbm1lbnRzCisgIHVzZWQgZm9yIHRyYWRpdGlvbmFsIGFjdGl2YXRpb24gYW5kIHN5c3RlbWQgdXNlci1zZXJ2aWNlIGFjdGl2YXRpb24uCisgIChmZC5vICM5Mjg1NywgSmFuIEFsZXhhbmRlciBTdGVmZmVucykKKwor4oCiIE9uIFdpbmRvd3MsIGRvbid0IGNyYXNoIGlmIDxzeXNsb2cvPiBvciAtLXN5c2xvZyBpcyB1c2VkCisgIChmZC5vICM5MjUzOCwgUmFsZiBIYWJhY2tlcikKKwor4oCiIE9uIFdpbmRvd3MsIGZpeCBhIG1lbW9yeSBsZWFrIHdoZW4gc2V0dGluZyBhIERCdXNFcnJvciBmcm9tIGEgV2luZG93cworICBlcnJvciAoZmQubyAjOTI3MjEsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBPbiBXaW5kb3dzLCBkb24ndCBnbyBpbnRvIGluZmluaXRlIHJlY3Vyc2lvbiBpZiB3ZSBhYm9ydCB0aGUgcHJvY2VzcworICB3aXRoIGJhY2t0cmFjZXMgZW5hYmxlZCAoZmQubyAjOTI3MjEsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBGaXggdmFyaW91cyBmYWlsaW5nIHRlc3RzLCB2YXJpb3VzbHkgb24gV2luZG93cyBhbmQgY3Jvc3MtcGxhdGZvcm06CisgIMK3IGRvbid0IHRlc3Qgc3lzdGVtLmNvbmYgZmVhdHVyZXMgKHVzZXJzLCBncm91cHMpIHRoYXQgb25seSBtYWtlIHNlbnNlCisgICAgb24gdGhlIHN5c3RlbSBidXMsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cworICDCtyBkb24ndCBjYWxsIF9kYnVzX3dhcm4oKSB3aGVuIHdlIHNraXAgYSB0ZXN0LCBzaW5jZSBpdCBpcyBmYXRhbAorICDCtyBmaXggY29tcHV0YXRpb24gb2YgZXhwZWN0ZWQgPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvPgorICDCtyB3aGVuIHJ1bm5pbmcgVEFQIHRlc3RzLCB0cmFuc2xhdGUgbmV3bGluZXMgdG8gVW5peCBmb3JtYXQsIGZpeGluZworICAgIGNyb3NzLWNvbXBpbGVkIHRlc3RzIHVuZGVyIFdpbmUgb24gTGludXgKKyAgwrcgZG9uJ3Qgc3RyZXNzLXRlc3QgcmVmY291bnRpbmcgdW5kZXIgV2luZSwgd2hlcmUgaXQncyByZWFsbHkgc2xvdworICDCtyBzdG9wIGFzc3VtaW5nIHRoYXQgYSBtZXNzYWdlIGxvb3BlZC1iYWNrIHRvIHRoZSB0ZXN0IHdpbGwgYmUgcmVjZWl2ZWQKKyAgICBpbW1lZGlhdGVseQorICDCtyBza2lwIHNvbWUgc3lzdGVtIGJ1cyB0ZXN0cyBvbiBXaW5kb3dzIHNpbmNlIHRoZXkgbWFrZSBubyBzZW5zZSB0aGVyZQorICAoZmQubyAjOTI1MzgsIGZkLm8gIzkyNzIxOyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS4xMC4yICgyMDE1LTEwLTI2KQorPT0KKworVGhlIOKAnHdvcnN0IHBpZXMgaW4gTG9uZG9u4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgQ29ycmVjdCBlcnJvciBoYW5kbGluZyBmb3IgYWN0aXZhdGlvbjogaWYgdGhlcmUgYXJlIG11bHRpcGxlIGF0dGVtcHRzCisgIHRvIGFjdGl2YXRlIHRoZSBzYW1lIHNlcnZpY2UgYW5kIGl0IGZhaWxzIGltbWVkaWF0ZWx5LCB0aGUgZmlyc3QgYXR0ZW1wdAorICB3b3VsZCBnZXQgdGhlIGNvcnJlY3QgcmVwbHksIGJ1dCB0aGUgcmVzdCB3b3VsZCB0aW1lIG91dC4gV2Ugbm93IHNlbmQKKyAgdGhlIHNhbWUgZXJyb3IgcmVwbHkgdG8gZWFjaCBhdHRlbXB0LiAoZmQubyAjOTIyMDAsIFNpbW9uIE1jVml0dGllKQorCivigKIgSWYgQmVjb21lTW9uaXRvciBpcyBjYWxsZWQgd2l0aCBhIHN5bnRhY3RpY2FsbHkgaW52YWxpZCBtYXRjaCBydWxlLAorICBkb24ndCBjcmFzaCB3aXRoIGFuIGFzc2VydGlvbiBmYWlsdXJlLCBmaXhpbmcgYSByZWdyZXNzaW9uIGluIDEuOS4xMC4KKyAgVGhpcyB3YXMgbm90IGV4cGxvaXRhYmxlIGFzIGEgZGVuaWFsIG9mIHNlcnZpY2UsIGJlY2F1c2UgdGhlIGNoZWNrCisgIGZvciBhIHByaXZpbGVnZWQgdXNlciBpcyBkb25lIGZpcnN0LiAoZmQubyAjOTIyOTgsIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gTGludXggd2l0aCAtLWVuYWJsZS11c2VyLXNlc3Npb24sIGFkZCB0aGUgYnVzIGFkZHJlc3MgdG8gdGhlCisgIGVudmlyb25tZW50IG9mIHN5c3RlbWQgc2VydmljZXMgZm9yIGJldHRlciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAoZmQubyAjOTI2MTIsIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMpCisKK+KAoiBPbiBXaW5kb3dzLCBmaXggdGhlIGxvZ2ljIGZvciByZXBsYWNpbmcgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgaW4gc2VydmljZSBmaWxlcycgRXhlYyBsaW5lcyAoZmQubyAjODM1Mzk7IE1pbGFuIENyaGEsIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gV2luZG93cywgaWYgaW5zdGFsbGVkIGluIHRoZSBjb252ZW50aW9uYWwgbGF5b3V0IHdpdGggJHtwcmVmaXh9L2V0YworICBhbmQgJHtwcmVmaXh9L3NoYXJlLCB1c2UgcmVsYXRpdmUgcGF0aHMgYmV0d2VlbiBidXMgY29uZmlndXJhdGlvbiBmaWxlcworICB0byBhbGxvdyB0aGUgdHJlZSB0byBiZSByZWxvY2F0ZWQgKGZkLm8gIzkyMDI4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgbW9yZSBvZiB0aGUgcmVncmVzc2lvbiB0ZXN0cyBwYXNzIGluIFdpbmRvd3MgYnVpbGRzIChmZC5vICM5MjUzOCwKKyAgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTAuMCAoMjAxNS0wOC0yNSkKKz09CisKK1RoZSDigJwweDIw4oCdIHJlbGVhc2UuCisKK1RoaXMgaXMgYSBuZXcgc3RhYmxlIGJyYW5jaCwgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBPUyBkaXN0cmlidXRpb25zLgorCitGaXhlcyBzaW5jZSAxLjkuMjA6CisKK+KAoiBkaXN0cmlidXRlIHRlc3QvdGFwLXRlc3Quc2guaW4sIGV2ZW4gaWYgdGhlIHRhcmJhbGwgd2FzIGJ1aWx0IHdpdGhvdXQKKyAgdGVzdHMgZW5hYmxlZCAoZmQubyAjOTE2ODQsIFNpbW9uIE1jVml0dGllKQor4oCiIHdvcmsgYXJvdW5kIGEgZmQgbGVhayBpbiBsaWJjYXAtbmcgPCAwLjcuNyAoZmQubyAjOTE2ODQsIFNpbW9uIE1jVml0dGllKQorCitTdW1tYXJ5IG9mIG1ham9yIGNoYW5nZXMgc2luY2UgMS44LjA6CisKK+KAoiBUaGUgYmFzaWMgc2V0dXAgZm9yIHRoZSB3ZWxsLWtub3duIHN5c3RlbSBhbmQgc2Vzc2lvbiBidXNlcyBpcworICBub3cgZG9uZSBpbiByZWFkLW9ubHkgZmlsZXMgaW4gJHtkYXRhZGlyfSAobm9ybWFsbHkgL3Vzci9zaGFyZSkuCisgIFNlZSB0aGUgTkVXUyBlbnRyeSBmb3IgMS45LjE4IGZvciBkZXRhaWxzLgorCivigKIgQXBwQXJtb3IgaW50ZWdyYXRpb24gaGFzIGJlZW4gbWVyZ2VkLCB3aXRoIGZlYXR1cmVzIHNpbWlsYXIgdG8gdGhlCisgIHByZS1leGlzdGluZyBTRUxpbnV4IGludGVncmF0aW9uLiBJdCBpcyBtb3N0bHkgY29tcGF0aWJsZSB3aXRoIHRoZQorICBwYXRjaGVzIHByZXZpb3VzbHkgc2hpcHBlZCBieSBVYnVudHUsIHdpdGggb25lIHNpZ25pZmljYW50IGNoYW5nZToKKyAgVWJ1bnR1J3MgR2V0Q29ubmVjdGlvbkFwcEFybW9yU2VjdXJpdHlDb250ZXh0IG1ldGhvZCBoYXMgYmVlbiBzdXBlcnNlZGVkCisgIGJ5IEdldENvbm5lY3Rpb25DcmVkZW50aWFscyBhbmQgd2FzIG5vdCBpbmNsdWRlZC4KKwor4oCiIFRoZSAtLWVuYWJsZS11c2VyLXNlc3Npb24gY29uZmlndXJlIG9wdGlvbiBjYW4gYmUgZW5hYmxlZAorICBieSBPUyBpbnRlZ3JhdG9ycyBpbnRlbmRpbmcgdG8gdXNlIHN5c3RlbWQgdG8gcHJvdmlkZSBhIHNlc3Npb24gYnVzCisgIHBlciB1c2VyIChpbiBlZmZlY3QsIHRyZWF0aW5nIGFsbCBjb25jdXJyZW50IGdyYXBoaWNhbCBhbmQgbm9uLWdyYXBoaWNhbAorICBsb2dpbiBzZXNzaW9ucyBhcyBvbmUgbGFyZ2Ugc2Vzc2lvbikuCisKK+KAoiBUaGUgbmV3IGxpc3RlbmFibGUgYWRkcmVzcyBtb2RlICJ1bml4OnJ1bnRpbWU9eWVzIiBsaXN0ZW5zIG9uCisgICRYREdfUlVOVElNRV9ESVIvYnVzLCB0aGUgc2FtZSBBRl9VTklYIHNvY2tldCB1c2VkIGJ5IHRoZSBzeXN0ZW1kCisgIHVzZXIgc2Vzc2lvbi4gbGliZGJ1cyBhbmQgImRidXMtbGF1bmNoIC0tYXV0b2xhdW5jaCIgd2lsbCBjb25uZWN0IHRvCisgIHRoaXMgYWRkcmVzcyBieSBkZWZhdWx0LiBHTGliIOKJpSAyLjQ1LjMgYW5kIHNkLWJ1cyDiiaUgMjA5IGhhdmUgYQorICBtYXRjaGluZyBkZWZhdWx0LgorCivigKIgQWxsIGV4ZWN1dGFibGVzIGFyZSBub3cgZHluYW1pY2FsbHkgbGlua2VkIHRvIGxpYmRidXMtMS4KKyAgUHJldmlvdXNseSwgc29tZSBleGVjdXRhYmxlcywgbW9zdCBub3RhYmx5IGRidXMtZGFlbW9uLCB3ZXJlIHN0YXRpY2FsbHkKKyAgbGlua2VkIHRvIGEgc3BlY2lhbGx5LWNvbXBpbGVkIHZhcmlhbnQgb2YgbGliZGJ1cy4gVGhpcyByZXN1bHRzIGluCisgIHZhcmlvdXMgcHJpdmF0ZSBmdW5jdGlvbnMgaW4gdGhlIF9kYnVzIG5hbWVzcGFjZSBiZWluZyBleHBvc2VkIGJ5IHRoZQorICBzaGFyZWQgbGlicmFyeS4gVGhlc2UgYXJlIG5vdCBBUEksIGFuZCBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUKKyAgdGhlIGRidXMgc291cmNlIHRyZWUuCisKK+KAoiBPbiBwbGF0Zm9ybXMgd2l0aCBFTEYgc3ltYm9sIHZlcnNpb25pbmcsIGFsbCBwdWJsaWMgc3ltYm9scworICBhcmUgdmVyc2lvbmVkIExJQkRCVVNfMV8zLgorCitOZXcgYnVzIEFQSXM6CisKK+KAoiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMgcmV0dXJucworICBMaW51eFNlY3VyaXR5TGFiZWwgd2hlcmUgc3VwcG9ydGVkCivigKIgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTW9uaXRvcmluZyBpbnRlcmZhY2UgKHByaXZpbGVnZWQpCisgIMK3IEJlY29tZU1vbml0b3IgbWV0aG9kIHN1cGVyc2VkZXMgbWF0Y2ggcnVsZXMgd2l0aCBlYXZlc2Ryb3A9dHJ1ZSwKKyAgICB3aGljaCBhcmUgbm93IGRlcHJlY2F0ZWQKK+KAoiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGF0cyBpbnRlcmZhY2UgKHNlbWktcHJpdmlsZWdlZCkKKyAgwrcgbm93IGVuYWJsZWQgYnkgZGVmYXVsdAorICDCtyBuZXcgR2V0QWxsTWF0Y2hSdWxlcyBtZXRob2QKK+KAoiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5WZXJib3NlIGludGVyZmFjZSAobm90IG5vcm1hbGx5IGNvbXBpbGVkKQorICDCtyB0b2dnbGVzIHRoZSBlZmZlY3Qgb2YgREJVU19WRVJCT1NFCisKK05ldyBleGVjdXRhYmxlczoKKwor4oCiIGRidXMtdGVzdC10b29sCivigKIgZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudAorCitOZXcgb3B0aW9uYWwgZGVwZW5kZW5jaWVzOgorCivigKIgVGhlIHN5c3RlbWQ6IHBzZXVkby10cmFuc3BvcnQgcmVxdWlyZXMgbGlic3lzdGVtZCBvciBsaWJzZC1kYWVtb24KK+KAoiBDb21wbGV0ZSBkb2N1bWVudGF0aW9uIHJlcXVpcmVzIER1Y2t0eXBlIGFuZCB5ZWxwLXRvb2xzCivigKIgRnVsbCB0ZXN0IGNvdmVyYWdlIHJlcXVpcmVzIEdMaWIgMi4zNiBhbmQgUHlHSQor4oCiIEFwcEFybW9yIGludGVncmF0aW9uIHJlcXVpcmVzIGxpYmFwcGFybW9yIGFuZCBvcHRpb25hbGx5IGxpYmF1ZGl0CisKK0RlcGVuZGVuY2llcyByZW1vdmVkOgorCivigKIgZGJ1cy1nbGliCisKK0QtQnVzIDEuOS4yMCAoMjAxNS0wOC0wNikKKz09CisKK1RoZSDigJxSZW1lbWJlciBUb21vcnJvd+KAnSByZWxlYXNlLgorCitUaGlzIGlzIGEgcmVsZWFzZS1jYW5kaWRhdGUgZm9yIEQtQnVzIDEuMTAuMC4gT1MgZGlzdHJpYnV0aW9uIHZlbmRvcnMKK3Nob3VsZCB0ZXN0IGl0LgorCitGaXhlczoKKwor4oCiIERvbid0IHNlY29uZC1ndWVzcyB3aGF0IHRoZSBBQkkgb2YgcG9sbCgpIGlzLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkCisgIG9uIEludGVncml0eSBSVE9TIGFuZCBvdGhlciB1bnVzdWFsIHBsYXRmb3JtcyAoZmQubyAjOTAzMTQ7CisgIFJvbGxhbmQgRHVkZW1haW5lLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvbid0IGR1cGxpY2F0ZSBhdWRpdCBzdWJzeXN0ZW0gaW50ZWdyYXRpb24gaWYgQXBwQXJtb3IgYW5kIFNFTGludXggYXJlCisgIGJvdGggZW5hYmxlZCAoZmQubyAjODkyMjUsIFNpbW9uIE1jVml0dGllKQorCivigKIgTG9nIGF1ZGl0IGV2ZW50cyBmb3IgQXBwQXJtb3IvU0VMaW51eCBwb2xpY3kgdmlvbGF0aW9ucyB3aGVuZXZlcgorICB3ZSBoYXZlIENBUF9BVURJVF9XUklURSwgZXZlbiBpZiBub3QgdGhlIHN5c3RlbSBidXMKKyAgKGZkLm8gIzgzODU2LCBMYXVyZW50IEJpZ29udmlsbGUpCisKK0QtQnVzIDEuOS4xOCAoMjAxNS0wNy0yMSkKKz09CisKK1RoZSDigJxQaXJhdGUgRWxpdGXigJ0gcmVsZWFzZS4KKworQ29uZmlndXJhdGlvbiBjaGFuZ2VzOgorCivigKIgVGhlIGJhc2ljIHNldHVwIGZvciB0aGUgd2VsbC1rbm93biBzeXN0ZW0gYW5kIHNlc3Npb24gYnVzZXMgaXMgbm93IGRvbmUKKyAgaW4gcmVhZC1vbmx5IGZpbGVzIGluICR7ZGF0YWRpcn0sIG1vdmluZyBhIHN0ZXAgY2xvc2VyIHRvIHN5c3RlbXMKKyAgdGhhdCBjYW4gb3BlcmF0ZSB3aXRoIGFuIGVtcHR5IC9ldGMgZGlyZWN0b3J5LiBJbiBpbmNyZWFzaW5nIG9yZGVyCisgIG9mIHByZWNlZGVuY2U6CisKKyAgwrcgJHtkYXRhZGlyfS9kYnVzLTEvcyouY29uZiBub3cgcGVyZm9ybSB0aGUgYmFzaWMgc2V0dXAgc3VjaCBhcyBzZXR0aW5nCisgICAgdGhlIGRlZmF1bHQgbWVzc2FnZSBwb2xpY2llcy4KKyAgwrcgJHtzeXNjb25mZGlyfS9kYnVzLTEvcyouY29uZiBhcmUgbm93IG9wdGlvbmFsLiBCeSBkZWZhdWx0CisgICAgZGJ1cyBzdGlsbCBpbnN0YWxscyBhIHRyaXZpYWwgdmVyc2lvbiBvZiBlYWNoLCBmb3IgZG9jdW1lbnRhdGlvbgorICAgIHB1cnBvc2VzOyBwdXR0aW5nIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBpbiB0aGVzZSBmaWxlcyBpcyBkZXByZWNhdGVkLgorICDCtyAke2RhdGFkaXJ9L2RidXMtMS9zKi5kLyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgdGhpcmQtcGFydHkgc29mdHdhcmUKKyAgICB0byBpbnN0YWxsICJkcm9wLWluIiBjb25maWd1cmF0aW9uIHNuaXBwZXRzIChhbnkgcGFja2FnZXMKKyAgICB1c2luZyB0aG9zZSBkaXJlY3RvcmllcyBzaG91bGQgZXhwbGljaXRseSBkZXBlbmQgb24gYXQgbGVhc3QgdGhpcworICAgIHZlcnNpb24gb2YgZGJ1cykuCisgIMK3ICR7c3lzY29uZmRpcn0vZGJ1cy0xL3MqLmQvIGFyZSBhbHNvIHN0aWxsIGF2YWlsYWJsZSBmb3Igc3lzYWRtaW5zCisgICAgb3IgdGhpcmQtcGFydHkgc29mdHdhcmUgdG8gaW5zdGFsbCAiZHJvcC1pbiIgY29uZmlndXJhdGlvbiBzbmlwcGV0cworICDCtyAke3N5c2NvbmZkaXJ9L2RidXMtMS9zKi1sb2NhbC5jb25mIGFyZSBzdGlsbCBhdmFpbGFibGUgZm9yIHN5c2FkbWlucycKKyAgICBvdmVycmlkZXMKKworICAke2RhdGFkaXJ9IGlzIG5vcm1hbGx5IC91c3Ivc2hhcmUsICR7c3lzY29uZmRpcn0gaXMgbm9ybWFsbHkgL2V0YywKKyAgYW5kICJzKiIgcmVmZXJzIHRvIGVpdGhlciBzeXN0ZW0gb3Igc2Vzc2lvbiBhcyBhcHByb3ByaWF0ZS4KKworICAoZmQubyAjODkyODAsIERpbWl0cmkgSm9obiBMZWRrb3YpCisKK0ZpeGVzOgorCivigKIgRml4IGEgbWVtb3J5IGxlYWsgd2hlbiBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMoKSBzdWNjZWVkcworICAoZmQubyAjOTEwMDgsIEphY2VrIEJ1a2FyZXdpY3opCisKK+KAoiBFbnN1cmUgdGhhdCBkYnVzLW1vbml0b3IgZG9lcyBub3QgcmVwbHkgdG8gbWVzc2FnZXMgaW50ZW5kZWQgZm9yIG90aGVycywKKyAgcmVzdWx0aW5nIGluIGl0cyBvd24gZGlzY29ubmVjdGlvbiAoZmQubyAjOTA5NTIsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjkuMTYgKDIwMTUtMDUtMTQpCis9PQorCitUaGUg4oCcdGl0YW5pdW0gYmFybnPigJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgQXV0b21ha2UgMS4xMyBpcyBub3cgcmVxdWlyZWQgd2hlbiBjb21waWxpbmcgZnJvbSBnaXQgb3IgbW9kaWZ5aW5nCisgIHRoZSBidWlsZCBzeXN0ZW0uCisKK1NlY3VyaXR5IGhhcmRlbmluZzoKKwor4oCiIE9uIFVuaXggcGxhdGZvcm1zLCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlc3Npb24gYnVzCisgIHRvIG9ubHkgYWxsb3cgRVhURVJOQUwgYXV0aGVudGljYXRpb24gKHNlY3VyZSBrZXJuZWwtbWVkaWF0ZWQKKyAgY3JlZGVudGlhbHMtcGFzc2luZyksIGFzIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoZSBzeXN0ZW0gYnVzLgorCisgIFRoaXMgYXZvaWRzIGZhbGxpbmcgYmFjayB0byBEQlVTX0NPT0tJRV9TSEExLCB3aGljaCByZWxpZXMgb24gc3Ryb25nbHkKKyAgdW5wcmVkaWN0YWJsZSBwc2V1ZG8tcmFuZG9tIG51bWJlcnMuCisKKyAgSWYgeW91IGFyZSB1c2luZyBELUJ1cyBvdmVyIHRoZSAodW5lbmNyeXB0ZWQhKSB0Y3A6IG9yIG5vbmNlLXRjcDogdHJhbnNwb3J0LAorICBpbiBjb25qdW5jdGlvbiB3aXRoIERCVVNfQ09PS0lFX1NIQTEgYW5kIGEgc2hhcmVkIGhvbWUgZGlyZWN0b3J5IHVzaW5nCisgIE5GUyBvciBzaW1pbGFyLCB5b3Ugd2lsbCBuZWVkIHRvIHJlY29uZmlndXJlIHRoZSBzZXNzaW9uIGJ1cyB0byBhY2NlcHQKKyAgREJVU19DT09LSUVfU0hBMSBieSBjb21tZW50aW5nIG91dCB0aGUgPGF1dGg+IGVsZW1lbnQuIFRoaXMgY29uZmlndXJhdGlvbgorICBpcyBub3QgcmVjb21tZW5kZWQuCisKKyAgKGZkLm8gIzkwNDE0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdoZW4gYXNrZWQgZm9yIHJhbmRvbSBudW1iZXJzIGZvciBEQlVTX0NPT0tJRV9TSEExLCB0aGUgbm9uY2UtdGNwOgorICB0cmFuc3BvcnQsIFVVSURzIG9yIGFueSBvdGhlciByZWFzb24sIGZhaWwgaWYgd2UgY2Fubm90IG9idGFpbiBlbnRyb3B5CisgIChmcm9tIC9kZXYvdXJhbmRvbSBvciBDcnlwdEdlblJhbmRvbSgpKSBvciBhbiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbgorICBvY2N1cnMsIGluc3RlYWQgb2Ygc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIGxvdy1lbnRyb3B5IHBzZXVkb3JhbmRvbQorICBudW1iZXJzIGZyb20gcmFuZCgpLiAoZmQubyAjOTA0MTQ7IFNpbW9uIE1jVml0dGllLCBSYWxmIEhhYmFja2VyKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBBZGQgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfY291bnQoKQorICAoZmQubyAjMzAzNTA7IENocmlzdGlhbiBEeXdhbiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbnRyb2R1Y2UgbmV3IGludGVybmFsIERCdXNTb2NrZXQgYW5kIERCdXNQb2xsYWJsZSB0eXBlcyBzbyB3ZSBjYW4KKyAgc3RvcCB0cmVhdGluZyB0aGUgV2luZG93cyBTT0NLRVQgdHlwZSBhcyBpZiBpdCB3YXMgaW50LiBEQnVzU29ja2V0CisgIGlzIHNwZWNpZmljYWxseSBhIHNvY2tldCwgY3Jvc3MtcGxhdGZvcm0uIERCdXNQb2xsYWJsZSBpcyB3aGF0ZXZlcgorICBfZGJ1c19wb2xsKCkgY2FuIGFjdCBvbiwgaS5lLiBhIGZkIG9uIFVuaXggb3IgYSBTT0NLRVQgb24gV2luZG93cy4KKyAgKGZkLm8gIzg5NDQ0OyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFsbCByZWdyZXNzaW9uIHRlc3RzIG5vdyBvdXRwdXQgVEFQIDxodHRwczovL3Rlc3Rhbnl0aGluZy5vcmcvPgorICAoZmQubyAjODk4NDYsIFNpbW9uIE1jVml0dGllKQorCivigKIgSW50ZXJuYWwgQVBJcyBjb25zaXN0ZW50bHkgdXNlIHNpZ25lZCB2YWx1ZXMgZm9yIHRpbWVzdGFtcHMKKyAgKGZkLm8gIzE4NDk0LCBQZXRlciBNY0N1cmR5KQorCivigKIgSW1wcm92ZSBkaWFnbm9zdGljcyB3aGVuIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCBjYWxscyBhcmUgcmVqZWN0ZWQKKyAgKGZkLm8gIzg4ODEyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIENsZWFuIHVwIGEgbG90IG9mIGNvbXBpbGVyIHdhcm5pbmdzCisgIChmZC5vICMxNzI4OSwgZmQubyAjODkyODQ7IFJhbGYgSGFiYWNrZXIsIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIEFkZCBsb2NraW5nIHRvIERCdXNDb3VudGVyJ3MgcmVmZXJlbmNlIGNvdW50IGFuZCBub3RpZnkgZnVuY3Rpb24KKyAgKGZkLm8gIzg5Mjk3LCBBZHJpYW4gU3p5bmRlbGEpCisKK+KAoiBFbnN1cmUgdGhhdCBEQnVzVHJhbnNwb3J0J3MgcmVmZXJlbmNlIGNvdW50IGlzIHByb3RlY3RlZCBieSB0aGUKKyAgY29ycmVzcG9uZGluZyBEQnVzQ29ubmVjdGlvbidzIGxvY2sgKGZkLm8gIzkwMzEyLCBBZHJpYW4gU3p5bmRlbGEpCisKK+KAoiBDb3JyZWN0bHkgcmVsZWFzZSBEQnVzU2VydmVyIG11dGV4IGJlZm9yZSBlYXJseS1yZXR1cm4gaWYgd2UgcnVuIG91dAorICBvZiBtZW1vcnkgd2hpbGUgY29weWluZyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIChmZC5vICM5MDAyMSwKKyAgUmFsZiBIYWJhY2tlcikKKwor4oCiIE1ha2UgZGJ1cy10ZXN0LXRvb2wgYW5kIGRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgcG9ydGFibGUKKyAgdG8gV2luZG93cyAoZmQubyAjOTAwODksIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBDb3JyZWN0bHkgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIG9mIERCdXNUeXBlUmVhZGVyIChmZC5vICM5MDAyMTsKKyAgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggc29tZSBtaXNzaW5nIFxuIGluIHZlcmJvc2UgKGRlYnVnIGxvZykgbWVzc2FnZXMgKGZkLm8gIzkwMDA0LAorICBSYWxmIEhhYmFja2VyKQorCivigKIgQ2xlYW4gdXAgc29tZSBtZW1vcnkgYW5kIGZkIGxlYWtzIGluIHRlc3QgY29kZSBhbmQgdG9vbHMKKyAgKGZkLm8gIzkwMDIxLCBSYWxmIEhhYmFja2VyKQorCivigKIgRml4IGEgTlVMTCBkZXJlZmVyZW5jZSBpZiB0aGUgZGJ1cy1kYWVtb24gY2Fubm90IHJlYWQgYSBjb25maWd1cmF0aW9uCisgIGRpcmVjdG9yeSBmb3IgYSByZWFzb24gdGhhdCBpcyBub3QgRU5PRU5UIChmZC5vICM5MDAyMSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIENNYWtlIGdlbmVyYXRlcyBhIHZlcnNpb25lZCBzaGFyZWQgbGlicmFyeSBldmVuIGlmIHRoZSByZXZpc2lvbiBpcyAwLAorICBhcyBpdCB1c3VhbGx5IGlzIG9uIHRoZSBkZXZlbG9wbWVudCBicmFuY2guIChmZC5vICM4OTQ1MCwgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS45LjE0ICgyMDE1LTAzLTAyKQorPT0KKworVGhlIOKAnGRvbid0IHN0YW5kIGluIHRoZSBwb2lzb24gY2xvdWTigJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgZGJ1cy1kYWVtb24gYW5kIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgbm93IHJlcXVpcmUgbGliZGJ1cy4gVGhleQorICB3ZXJlIHByZXZpb3VzbHkgbGlua2VkIHRvIGEgc3RhdGljIHZlcnNpb24gb2YgbGliZGJ1cy4KKwor4oCiIFRoZSB0ZXN0cyBubyBsb25nZXIgcmVxdWlyZSBkYnVzLWdsaWIgaW4gb3JkZXIgdG8gZXhlcmNpc2UgdGhlIGxpYmRidXMKKyAgc2hhcmVkIGxpYnJhcnk7IHRoZXkgYXJlIGFsd2F5cyBsaW5rZWQgdG8gbGliZGJ1cyBub3cuCisKK0J1aWxkLXRpbWUgY29uZmlndXJhdGlvbjoKKwor4oCiIFRoZSBuZXcgLS1lbmFibGUtdXNlci1zZXNzaW9uIG9wdGlvbiwgb2ZmIGJ5IGRlZmF1bHQsIGNhbiBiZSBlbmFibGVkCisgIGJ5IE9TIGludGVncmF0b3JzIGludGVuZGluZyB0byB1c2Ugc3lzdGVtZCB0byBwcm92aWRlIGEgc2Vzc2lvbiBidXMKKyAgcGVyIHVzZXIgKGluIGVmZmVjdCwgdHJlYXRpbmcgYWxsIGNvbmN1cnJlbnQgZ3JhcGhpY2FsIGFuZCBub24tZ3JhcGhpY2FsCisgIGxvZ2luIHNlc3Npb25zIGFzIG9uZSBsYXJnZSBzZXNzaW9uKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBBbGwgZXhlY3V0YWJsZXMgYXJlIG5vdyBsaW5rZWQgZHluYW1pY2FsbHkgdG8gbGliZGJ1cy4KKyAgKGZkLm8gIzgzMTE1OyBCZXJ0cmFuZCBTSU1PTk5FVCwgU2ltb24gTWNWaXR0aWUsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBPbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0gKEdOVSBsaWJjIGFuZCBwb3NzaWJseSBvdGhlcnMpLAorICBsaWJkYnVzIG5vdyBoYXMgdmVyc2lvbmVkIHN5bWJvbHMgZm9yIGl0cyBwdWJsaWMgQVBJLgorICBBbGwgcHVibGljIHN5bWJvbHMgKHZpc2libGUgaW4gdGhlIGhlYWRlciBmaWxlcykgYXJlIGN1cnJlbnRseQorICB2ZXJzaW9uZWQgYXMgTElCREJVU18xXzM7IHByaXZhdGUgc3ltYm9scyBzdGFydGluZyB3aXRoIF9kYnVzIG9yCisgIGRidXNfaW50ZXJuYWwgaGF2ZSBhIHZlcnNpb24gdGhhdCBjaGFuZ2VzIHdpdGggZWFjaCByZWxlYXNlLCBhbmQKKyAgbXVzdCBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIChhbHNvIGZkLm8gIzgzMTE1KQorCivigKIgTmV3IGxpc3RlbmFibGUgYWRkcmVzcyBtb2RlICJ1bml4OnJ1bnRpbWU9eWVzIiB3aGljaCBsaXN0ZW5zIG9uCisgIGEgcmVhbCBmaWxlc3lzdGVtIChub24tYWJzdHJhY3QpIHNvY2tldCAkWERHX1JVTlRJTUVfRElSL2J1cworICAoZmQubyAjNjEzMDM7IENvbGluIFdhbHRlcnMsIEFsZXhhbmRlciBMYXJzc29uLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBvcHRpb25hbCBzeXN0ZW1kIHVuaXRzIGZvciBhIHBlci11c2VyIGJ1cyBsaXN0ZW5pbmcgb24KKyAgJFhER19SVU5USU1FX0RJUi9idXMgKGZkLm8gIzYxMzAxOyBTaW1vbiBNY1ZpdHRpZSwgQ29saW4gV2FsdGVycykKKwor4oCiIE9uIFVuaXggcGxhdGZvcm1zLCBib3RoIGxpYmRidXMgYW5kICJkYnVzLWxhdW5jaCAtLWF1dG9sYXVuY2giCisgIGRlZmF1bHQgdG8gY29ubmVjdGluZyB0byAkWERHX1JVTlRJTUVfRElSL2J1cyBpZiBpdCBpcyBhIHNvY2tldAorICAoYWxzbyBmZC5vICM2MTMwMSkKKwor4oCiIE5ldyBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IHRvb2wgdXBsb2FkcyBlbnZpcm9ubWVudAorICB2YXJpYWJsZXMgdG8gImRidXMtZGFlbW9uIC0tc2Vzc2lvbiIgYW5kIG9wdGlvbmFsbHkgInN5c3RlbWQgLS11c2VyIiwKKyAgcHJpbWFyaWx5IGFzIGEgd2F5IHRvIGtlZXAgdGhlIHBlci11c2VyIGJ1cyBjb21wYXRpYmxlIHdpdGgKKyAgZGlzdHJpYnV0aW9ucycgZXhpc3RpbmcgWDExIGxvZ2luIHNjcmlwdHMgKGFsc28gZmQubyAjNjEzMDEpCisKK+KAoiA8aW5jbHVkZWRpci8+IGVsZW1lbnRzIGluIGRidXMtZGFlbW9uIGNvbmZpZ3VyYXRpb24gYXJlIG5vdyBzaWxlbnRseQorICBpZ25vcmVkIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIChmZC5vICM4OTI4MCwgRGltaXRyaSBKb2huIExlZGtvdikKKwor4oCiIEFkZCBtaWNyb3NlY29uZC1yZXNvbHV0aW9uIHRpbWVzdGFtcHMgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IG9mCisgIGRidXMtbW9uaXRvciBhbmQgZGJ1cy1zZW5kIChmZC5vICM4ODg5NjsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgRml4IGEgcmFjZSBjb25kaXRpb24gaW4gdGhlICdtb25pdG9yJyB0ZXN0IGludHJvZHVjZWQgaW4gMS45LjEwCisgIChmZC5vICM4OTIyMiwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuOS4xMiAoMjAxNS0wMi0xOSkKKz09CisKK1RoZSDigJxtb25zdGVyIGxhc2FnbmHigJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgRHVja3R5cGUgYW5kIHllbHAtdG9vbHMgYXJlIG5vdyByZXF1aXJlZCB0byBidWlsZCBjb21wbGV0ZSBkb2N1bWVudGF0aW9uCisgICh0aGV5IGFyZSBvcHRpb25hbCBmb3Igbm9ybWFsIGJ1aWxkcykuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdmVyc2lvbiAwLjI2CisgIMK3IEdldENvbm5lY3Rpb25DcmVkZW50aWFscyBjYW4gcmV0dXJuIExpbnV4U2VjdXJpdHlMYWJlbCBvciBXaW5kb3dzU0lECisgIMK3IGRvY3VtZW50IHRoZSBCZWNvbWVNb25pdG9yIG1ldGhvZAorCivigKIgT24gTGludXgsIGFkZCBMaW51eFNlY3VyaXR5TGFiZWwgdG8gR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzCisgIChmZC5vICM4OTA0MTsgVHlsZXIgSGlja3MsIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gTGludXgsIGFkZCBzdXBwb3J0IGZvciBBcHBBcm1vciBtZWRpYXRpb24gb2YgbWVzc2FnZSBzZW5kaW5nIGFuZAorICByZWNlaXZpbmcgYW5kIG5hbWUgb3duZXJzaGlwIChwYXJhbGxlbGluZyBleGlzdGluZyBTRUxpbnV4IG1lZGlhdGlvbgorICBzdXBwb3J0KSwgYW5kIGVhdmVzZHJvcHBpbmcgKGEgbmV3IGNoZWNrLCBjdXJyZW50bHkgQXBwQXJtb3Itc3BlY2lmaWMpCisgIChmZC5vICM3NTExMzsgSm9obiBKb2hhbnNlbiwgVHlsZXIgSGlja3MsIFNpbW9uIE1jVml0dGllKQorCivigKIgSW4gZGJ1cy1zZW5kIGFuZCBkYnVzLW1vbml0b3IsIHByZXR0eS1wcmludCBcMC10ZXJtaW5hdGVkIGJ5dGVzdHJpbmdzCisgIHRoYXQgaGF2ZSBwcmludGFibGUgQVNDSUkgY29udGVudHM7IHdlIHByZXZpb3VzbHkgb25seSBkaWQgdGhpcyBmb3IKKyAgdW50ZXJtaW5hdGVkIGJ5dGVzdHJpbmdzIChmZC5vICM4OTEwOSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgYSBndWlkZSB0byBkZXNpZ25pbmcgZ29vZCBELUJ1cyBBUElzIChmZC5vICM4ODk5NCwgUGhpbGlwIFdpdGhuYWxsKQorCivigKIgT24gV2luZG93cywgYWRkIFdpbmRvd3NTSUQgdG8gR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzCisgIChmZC5vICM1NDQ0NSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEltcHJvdmUgY2xhcml0eSBvZiBkYnVzLW1vbml0b3IgLS1wcm9maWxlIG91dHB1dCBhbmQgYWRkIG1vcmUgY29sdW1ucworICAoZmQubyAjODkxNjUsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBBZGQgYSBtYW4gcGFnZSBmb3IgZGJ1cy10ZXN0LXRvb2wsIGFuZCBidWlsZCBpdCB1bmRlciBDTWFrZSBhcyB3ZWxsCisgIGFzIEF1dG90b29scyAoZmQubyM4OTA4NiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJZiBkYnVzLWRhZW1vbiB3YXMgY29tcGlsZWQgd2l0aCAtLWVuYWJsZS12ZXJib3NlLCBhZGQgYSBELUJ1cyBBUEkKKyAgdG8gY29udHJvbCBpdCBhdCBydW50aW1lLCBvdmVycmlkaW5nIHRoZSBEQlVTX1ZFUkJPU0UgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgKGZkLm8gIzg4ODk2LCBSYWxmIEhhYmFja2VyKQorCitGaXhlczoKKwor4oCiIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdXNlZCBpbiB0aGUgZmQtcGFzc2luZyB0ZXN0LAorICBhdm9pZGluZyBmYWlsdXJlIHVuZGVyIHRoZSBkZWZhdWx0IExpbnV4IGZkIGxpbWl0LCBhbmQgYXV0b21hdGljYWxseQorICBza2lwIGl0IGlmIHRoZSBybGltaXQgaXMgdG9vIHNtYWxsIChmZC5vICM4ODk5OCwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuOS4xMCAoMjAxNS0wMi0wOSkKKz09CisKK1RoZSDigJxzYWQgY3lib3Jnc+KAnSByZWxlYXNlLgorCitTZWN1cml0eSBmaXhlcyBtZXJnZWQgZnJvbSAxLjguMTY6CisKK+KAoiBEbyBub3QgYWxsb3cgbm9uLXVpZC0wIHByb2Nlc3NlcyB0byBzZW5kIGZvcmdlZCBBY3RpdmF0aW9uRmFpbHVyZQorICBtZXNzYWdlcy4gT24gTGludXggc3lzdGVtcyB3aXRoIHN5c3RlbWQgYWN0aXZhdGlvbiwgdGhpcyB3b3VsZAorICBhbGxvdyBhIGxvY2FsIGRlbmlhbCBvZiBzZXJ2aWNlOiB1bnByaXZpbGVnZWQgcHJvY2Vzc2VzIGNvdWxkCisgIGZsb29kIHRoZSBidXMgd2l0aCB0aGVzZSBmb3JnZWQgbWVzc2FnZXMsIHdpbm5pbmcgdGhlIHJhY2Ugd2l0aAorICB0aGUgYWN0dWFsIHNlcnZpY2UgYWN0aXZhdGlvbiBhbmQgY2F1c2luZyBhbiBlcnJvciByZXBseQorICB0byBiZSBzZW50IGJhY2sgd2hlbiBzZXJ2aWNlIGF1dG8tYWN0aXZhdGlvbiB3YXMgcmVxdWVzdGVkLgorICBUaGlzIGRvZXMgbm90IHByZXZlbnQgdGhlIHJlYWwgc2VydmljZSBmcm9tIGJlaW5nIHN0YXJ0ZWQsCisgIHNvIHRoZSBhdHRhY2sgb25seSB3b3JrcyB3aGlsZSB0aGUgcmVhbCBzZXJ2aWNlIGlzIG5vdCBydW5uaW5nLgorICAoQ1ZFLTIwMTUtMDI0NSwgZmQubyAjODg4MTE7IFNpbW9uIE1jVml0dGllKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBUaGUgbmV3IE1vbml0b3JpbmcgaW50ZXJmYWNlIGluIHRoZSBkYnVzLWRhZW1vbiBsZXRzIGRidXMtbW9uaXRvciBhbmQKKyAgc2ltaWxhciB0b29scyByZWNlaXZlIG1lc3NhZ2VzIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHNlY3VyaXR5IHByb3BlcnRpZXMKKyAgb2YgdGhlIHN5c3RlbSBidXMsIGJ5IGNhbGxpbmcgdGhlIG5ldyBCZWNvbWVNb25pdG9yIG1ldGhvZCBvbiBhCisgIHByaXZhdGUgY29ubmVjdGlvbi4gVGhpcyBieXBhc3NlcyB0aGUgbm9ybWFsIDxhbGxvdz4gYW5kIDxkZW55PiBydWxlcworICBlbnRpcmVseSwgc28gdG8gcHJlc2VydmUgbm9ybWFsIG1lc3NhZ2UtcHJpdmFjeSBhc3N1bXB0aW9ucywgb25seSByb290CisgIGlzIGFsbG93ZWQgdG8gZG8gdGhpcyBvbiB0aGUgc3lzdGVtIGJ1cy4gUmVzdHJpY3RlZCBlbnZpcm9ubWVudHMsCisgIHN1Y2ggYXMgTGludXggd2l0aCBMU01zLCBzaG91bGQgbG9jayBkb3duIGFjY2VzcyB0byB0aGUgTW9uaXRvcmluZworICBpbnRlcmZhY2UuIChmZC5vICM0Njc4NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBkYnVzLW1vbml0b3IgdXNlcyBCZWNvbWVNb25pdG9yIHRvIGNhcHR1cmUgbW9yZSB0cmFmZmljLCBpZiB0aGUKKyAgZGJ1cy1kYWVtb24gc3VwcG9ydHMgaXQgYW5kIGFjY2VzcyBwZXJtaXNzaW9ucyBhbGxvdyBpdC4KKyAgSXQgc3RpbGwgc3VwcG9ydHMgdGhlIHByZXZpb3VzIGFwcHJvYWNoICgiZWF2ZXNkcm9wcGluZyIgbWF0Y2ggcnVsZXMpCisgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYnVzIGRhZW1vbnMuIChmZC5vICM0Njc4NywgU2ltb24pCisKK+KAoiBkYnVzLW1vbml0b3IgY2FuIG5vdyBsb2cgdGhlIG1lc3NhZ2Ugc3RyZWFtIGFzIGJpbmFyeSBkYXRhIGZvciBsYXRlcgorICBhbmFseXNpcywgd2l0aCBlaXRoZXIgbm8gZXh0cmEgZnJhbWluZyBiZXlvbmQgdGhlIG5vcm1hbCBELUJ1cyBoZWFkZXJzLAorICBvciBsaWJwY2FwLWNvbXBhdGlibGUgZnJhbWluZyB0cmVhdGluZyBlYWNoIEQtQnVzIG1lc3NhZ2UKKyAgYXMgYSBjYXB0dXJlZCBwYWNrZXQuIChmZC5vICM0Njc4NywgU2ltb24pCisKK090aGVyIGZpeGVzOgorCivigKIgRml4IHNvbWUgQ01ha2UgYnVpbGQgcmVncmVzc2lvbnMgKGZkLm8gIzg4OTY0LCBSYWxmIEhhYmFja2VyKQorCivigKIgT24gVW5peCwgZm9yY2libHkgdGVybWluYXRlIHJlZ3Jlc3Npb24gdGVzdHMgYWZ0ZXIgNjAgc2Vjb25kcyB0bworICBwcmV2ZW50IHRoZW0gZnJvbSBibG9ja2luZyBjb250aW51b3VzIGludGVncmF0aW9uIGZyYW1ld29ya3MKKyAgKGZkLm8gIzQ2Nzg3LCBTaW1vbikKKworRC1CdXMgMS45LjggKDIwMTUtMDItMDMpCis9PQorCitUaGUg4oCcYWxsIHRoZSB0eXBlcyBvZiBwcmVjaXBpdGF0aW9u4oCdIHJlbGVhc2UuCisKK0RlcGVuZGVuY2llczoKKwor4oCiIGZ1bGwgdGVzdCBjb3ZlcmFnZSBub3cgcmVxdWlyZXMgR0xpYiAyLjM2CivigKIgZnVsbCB0ZXN0IGNvdmVyYWdlIG5vdyByZXF1aXJlcyBQeUdJIChQeUdPYmplY3QgMywKKyAgImltcG9ydCBnaS5yZXBvc2l0b3J5LkdPYmplY3QiKSBpbnN0ZWFkIG9mIHRoZQorICBvYnNvbGV0ZSBQeUdPYmplY3QgMiAoImltcG9ydCBnb2JqZWN0IikKKworRW5oYW5jZW1lbnRzOgorCivigKIgYWRkIEdMaWItc3R5bGUgImluc3RhbGxlZCB0ZXN0cyIgKGZkLm8gIzg4ODEwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGJldHRlciByZWdyZXNzaW9uIHRlc3QgY292ZXJhZ2UsIGluY2x1ZGluZyBzeXN0ZW1kIGFjdGl2YXRpb24KKyAgKGZkLm8gIzU3OTUyLCAjODg4MTA7IFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIGZhdGFsIGVycm9ycyBjb3JyZWN0bHkgbWFrZSB0aGUgZGJ1cy1kYWVtb24gZXhpdCBldmVuIGlmIDxzeXNsb2cvPiBpcworICB0dXJuZWQgb2ZmIChmZC5vICM4ODgwOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBUQ1Agc29ja2V0cyBvbiBXaW5kb3dzIG5vIGxvbmdlciBmYWlsIHRvIGxpc3RlbiBhcHByb3hpbWF0ZWx5IDEgdGltZQorICBpbiAyNTYsIGNhdXNlZCBieSBhIGxvZ2ljIGVycm9yIHRoYXQgc2hvdWxkIGhhdmUgYWx3YXlzIG1hZGUgaXQgZmFpbCBidXQKKyAgd2FzIG1pdGlnYXRlZCBieSBpbmNvcnJlY3QgZW5kaWFubmVzcyBmb3IgdGhlIHBvcnQgbnVtYmVyCisgIChmZC5vICM4Nzk5OSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIGZpeCBzb21lIFdpbmRvd3MgYnVpbGQgZmFpbHVyZXMgKGZkLm8gIzg4MDA5LCAjODgwMTA7IFJhbGYgSGFiYWNrZXIpCisKK+KAoiBvbiBXaW5kb3dzLCBhbGxvdyB1cCB0byA4SyBjb25uZWN0aW9ucyB0byB0aGUgZGJ1cy1kYWVtb24gaW5zdGVhZCBvZiB0aGUKKyAgcHJldmlvdXMgNjQsIGNvbXBsZXRpbmcgYSBwcmV2aW91cyBmaXggd2hpY2ggb25seSB3b3JrZWQgdW5kZXIKKyAgQXV0b3Rvb2xzIChmZC5vICM3MTI5NywgUmFsZiBIYWJhY2tlcikKKwor4oCiIG9uIFdpbmRvd3MsIGlmIHRoZSBJUCBmYW1pbHkgaXMgdW5zcGVjaWZpZWQgb25seSB1c2UgSVB2NCwKKyAgdG8gbWl0aWdhdGUgSVB2NiBub3Qgd29ya2luZyBjb3JyZWN0bHkgKGZkLm8gIzg3OTk5LCBSYWxmIEhhYmFja2VyKQorCivigKIgZml4IHNvbWUgdW5saWtlbHkgbWVtb3J5IGxlYWtzIG9uIE9PTSAoZmQubyAjODgwODcsIFNpbW9uIE1jVml0dGllKQorCivigKIgbGNvdiBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIHdvcmtzIGFnYWluIChmZC5vICM4ODgwOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBmaXggYW4gdW51c2VkIGZ1bmN0aW9uIGVycm9yIHdpdGggLS1kaXNhYmxlLWVtYmVkZGVkLXRlc3RzIChmZC5vICM4NzgzNywKKyAgVGhpYWdvIE1hY2llaXJhKQorCitELUJ1cyAxLjkuNiAoMjAxNS0wMS0wNSkKKz09CisKK1RoZSDigJxJIGRvIGhhdmUgYSBicmVhZCBrbmlmZeKAnSByZWxlYXNlLgorCitTZWN1cml0eSBoYXJkZW5pbmc6CisKK+KAoiBEbyBub3QgYWxsb3cgY2FsbHMgdG8gVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IGZyb20gdWlkcyBvdGhlciB0aGFuCisgIHRoZSB1aWQgb2YgdGhlIGRidXMtZGFlbW9uLiBJZiBhIHN5c3RlbSBzZXJ2aWNlIGluc3RhbGxzIHVuc2FmZQorICBzZWN1cml0eSBwb2xpY3kgcnVsZXMgdGhhdCBhbGxvdyBhcmJpdHJhcnkgbWV0aG9kIGNhbGxzCisgIChzdWNoIGFzIENWRS0yMDE0LTgxNDgpIHRoZW4gdGhpcyBwcmV2ZW50cyBtZW1vcnkgY29uc3VtcHRpb24gYW5kCisgIHBvc3NpYmxlIHByaXZpbGVnZSBlc2NhbGF0aW9uIHZpYSBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQuCisKKyAgV2UgYmVsaWV2ZSB0aGF0IGluIHByYWN0aWNlLCBwcml2aWxlZ2UgZXNjYWxhdGlvbiBoZXJlIGlzIGF2b2lkZWQKKyAgYnkgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBzYW5pdGl6aW5nIGl0cyBlbnZpcm9ubWVudDsgYnV0CisgIGl0IHNlZW1zIGJldHRlciB0byBiZSBzYWZlLgorCivigKIgRG8gbm90IGFsbG93IGNhbGxzIHRvIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCBvciB0aGUgU3RhdHMgaW50ZXJmYWNlCisgIG9uIG9iamVjdCBwYXRocyBvdGhlciB0aGFuIC9vcmcvZnJlZWRlc2t0b3AvREJ1cy4gU29tZSBzeXN0ZW0gc2VydmljZXMKKyAgaW5zdGFsbCB1bnNhZmUgc2VjdXJpdHkgcG9saWN5IHJ1bGVzIHRoYXQgYWxsb3cgYXJiaXRyYXJ5IG1ldGhvZCBjYWxscworICB0byBhbnkgZGVzdGluYXRpb24sIG1ldGhvZCBhbmQgaW50ZXJmYWNlIHdpdGggYSBzcGVjaWZpZWQgb2JqZWN0IHBhdGg7CisgIHdoaWxlIGxlc3MgYmFkIHRoYW4gYWxsb3dpbmcgYXJiaXRyYXJ5IG1ldGhvZCBjYWxscywgdGhlc2Ugc2VjdXJpdHkKKyAgcG9saWNpZXMgYXJlIHN0aWxsIGhhcm1mdWwsIHNpbmNlIGRidXMtZGFlbW9uIG5vcm1hbGx5IG9mZmVycyB0aGUKKyAgc2FtZSBBUEkgb24gYWxsIG9iamVjdCBwYXRocyBhbmQgb3RoZXIgc3lzdGVtIHNlcnZpY2VzIG1pZ2h0IGJlaGF2ZQorICBzaW1pbGFybHkuCisKK090aGVyIGZpeGVzOgorCivigKIgQWRkIG1pc3NpbmcgaW5pdGlhbGl6YXRpb24gc28gR2V0RXh0ZW5kZWRUY3BUYWJsZSBkb2Vzbid0IGNyYXNoIG9uCisgIFdpbmRvd3MgVmlzdGEgU1AwIChmZC5vICM3NzAwOCwg0JjQu9GM0Y8g0JAuINCi0LrQsNGH0LXQvdC60L4pCisKK0QtQnVzIDEuOS40ICgyMDE0LTExLTI0KQorPT0KKworVGhlIOKAnGV4dHJhLXN0dXJkeSBjYXJhbWVs4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgUGFydGlhbGx5IHJldmVydCB0aGUgQ1ZFLTIwMTQtMzYzOSBwYXRjaCBieSBpbmNyZWFzaW5nIHRoZSBkZWZhdWx0CisgIGF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgb24gdGhlIHN5c3RlbSBidXMgZnJvbSA1IHNlY29uZHMgYmFjayB0byAzMAorICBzZWNvbmRzLCBzaW5jZSB0aGlzIGhhcyBiZWVuIHJlcG9ydGVkIHRvIGNhdXNlIGJvb3QgcmVncmVzc2lvbnMgZm9yCisgIHNvbWUgdXNlcnMsIG1vc3RseSB3aXRoIHBhcmFsbGVsIGJvb3QgKHN5c3RlbWQpIG9uIHNsb3dlciBoYXJkd2FyZS4KKworICBPbiBmYXN0IHN5c3RlbXMgd2hlcmUgbG9jYWwgdXNlcnMgYXJlIGNvbnNpZGVyZWQgcGFydGljdWxhcmx5IGhvc3RpbGUsCisgIGFkbWluaXN0cmF0b3JzIGNhbiByZXR1cm4gdG8gdGhlIDUgc2Vjb25kIHRpbWVvdXQgKG9yIGFueSBvdGhlciB2YWx1ZQorICBpbiBtaWxsaXNlY29uZHMpIGJ5IHNhdmluZyB0aGlzIGFzIC9ldGMvZGJ1cy0xL3N5c3RlbS1sb2NhbC5jb25mOgorCisgIDxidXNjb25maWc+CisgICAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDwvYnVzY29uZmlnPgorCisgIChmZC5vICM4NjQzMSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgYSBtZXNzYWdlIGluIHN5c2xvZy90aGUgSm91cm5hbCB3aGVuIHRoZSBhdXRoX3RpbWVvdXQgaXMgZXhjZWVkZWQKKyAgKGZkLm8gIzg2NDMxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFNlbmQgYmFjayBhbiBBY2Nlc3NEZW5pZWQgZXJyb3IgaWYgdGhlIGFkZHJlc3NlZCByZWNpcGllbnQgaXMgbm90IGFsbG93ZWQKKyAgdG8gcmVjZWl2ZSBhIG1lc3NhZ2UgKGFuZCBpbiBidWlsZHMgd2l0aCBhc3NlcnRpb25zIGVuYWJsZWQsIGRvbid0CisgIGFzc2VydCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zKS4gKGZkLm8gIzg2MTk0LCBKYWNlayBCdWthcmV3aWN6KQorCitELUJ1cyAxLjkuMiAoMjAxNC0xMS0xMCkKKz09CisKK1RoZSDigJxzdHJ1Y3R1cmFsbHkgdW5zb3VuZCBmbGFwamFja+KAnSByZWxlYXNlLgorCitTZWN1cml0eSBmaXhlczoKKwor4oCiIEluY3JlYXNlIGRidXMtZGFlbW9uJ3MgUkxJTUlUX05PRklMRSBybGltaXQgdG8gNjU1MzYKKyAgc28gdGhhdCBDVkUtMjAxNC0zNjM2IHBhcnQgQSBjYW5ub3QgZXhoYXVzdCB0aGUgc3lzdGVtIGJ1cycKKyAgZmlsZSBkZXNjcmlwdG9ycywgY29tcGxldGluZyB0aGUgaW5jb21wbGV0ZSBmaXggaW4gMS44LjguCisgIChDVkUtMjAxNC03ODI0LCBmZC5vICM4NTEwNTsgU2ltb24gTWNWaXR0aWUsIEFsYmFuIENyZXF1eSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMjUKKyAgwrcgbmV3IHZhbHVlICdjb25zdCcgZm9yIEVtaXRzQ2hhbmdlZFNpZ25hbCBhbm5vdGF0aW9uCisgICAgKGZkLm8gIzcyOTU4LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisgIMK3IG5ldyBBTExPV19JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OIGZsYWcsIGZvciBQb2xpY3lLaXQgYW5kIHNpbWlsYXIKKyAgICAoZmQubyAjODM0NDk7IExlbm5hcnQgUG9ldHRlcmluZywgU2ltb24gTWNWaXR0aWUpCisgIMK3IGFubm90YXRlIHRhYmxlIG9mIHR5cGVzIHdpdGggcmVzZXJ2ZWQvYmFzaWMvY29udGFpbmVyLCBhbmQgZm9yCisgICAgYmFzaWMgdHlwZXMsIGZpeGVkL3N0cmluZy1saWtlCisgIMK3IGNsYXJpZnkgYXJiaXRyYXJ5IGxpbWl0cyBieSBxdW90aW5nIHRoZW0gaW4gbWViaWJ5dGVzCisKK+KAoiBOZXcgQVBJOiBhZGQgYWNjZXNzb3JzIGZvciB0aGUgQUxMT1dfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTiBmbGFnCisgIChmZC5vICM4MzQ0OSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgZGJ1cy10ZXN0LXRvb2wsIGEgRC1CdXMgc3dpc3MgYXJteSBrbmlmZSB3aXRoIG11bHRpcGxlIHN1YmNvbW1hbmRzLAorICB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgcGVyZm9ybWFuY2UgdGVzdGluZzoKKyAgwrcgZGJ1cy10ZXN0LXRvb2wgc3BhbTogc2VuZCByZXBlYXRlZCBtZXNzYWdlcworICDCtyBkYnVzLXRlc3QtdG9vbCBlY2hvOiBzZW5kIGFuIGVtcHR5IHJlcGx5IGZvciBhbGwgbWV0aG9kIGNhbGxzCisgIMK3IGRidXMtdGVzdC10b29sIGJsYWNrLWhvbGU6IGRvIG5vdCByZXBseSB0byBtZXRob2QgY2FsbHMKKyAgKGZkLm8gIzM0MTQwOyBBbGJhbiBDcmVxdXksIFNpbW9uIE1jVml0dGllLCBXaWxsIFRob21wc29uKQorCivigKIgQWRkIHN1cHBvcnQgZm9yIHByb2Nlc3MgSUQgaW4gY3JlZGVudGlhbHMtcGFzc2luZyBvbiBOZXRCU0QKKyAgKGZkLm8gIzY5NzAyLCBQYXRyaWNrIFdlbGNoZSkKKwor4oCiIEFkZCBhbiBleGFtcGxlIHNjcmlwdCB0byBmaW5kIHBvdGVudGlhbGx5IHVuZGVzaXJlZCBtYXRjaCBydWxlcworICAoZmQubyAjODQ1OTgsIEFsYmFuIENyZXF1eSkKKwor4oCiIERvY3VtZW50IHRoZSBjZW50cmFsIGFzc3VtcHRpb24gdGhhdCBtYWtlcyBvdXIgdXNlIG9mIGNyZWRlbnRpYWxzLXBhc3NpbmcKKyAgc2VjdXJlIChmZC5vICM4MzQ5OSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBSZXBsYWNlIHRoZSBkYnVzLWdsaWIgc2VjdGlvbiBvZiB0aGUgdHV0b3JpYWwgd2l0aCBhIEdEQnVzIHJlY29tbWVuZGF0aW9uLAorICBhbmQgYWRkIHNvbWUgbGlua3MgdG8gR0RCdXMgYW5kIFF0REJ1cyBkb2N1bWVudGF0aW9uIChmZC5vICMyNTE0MCwKKyAgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgVXNlIGEgbGVzcyBjb25mdXNpbmcgTm9SZXBseSBtZXNzYWdlIHdoZW4gZGlzY29ubmVjdGVkIHdpdGggYSByZXBseSBwZW5kaW5nCisgIChmZC5vICM3NjExMiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBNYWtlIHRoZSAucGMgZmlsZSByZWxvY2F0YWJsZSBieSBsZXR0aW5nIHBrZy1jb25maWcgZG8gYWxsIHZhcmlhYmxlCisgIGV4cGFuc2lvbiBpdHNlbGYgKGZkLm8gIzc1ODU4LCDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyKQorCivigKIgRml4IGEgYnVpbGQgZmFpbHVyZSBvbiBwbGF0Zm9ybXMgd2l0aCBrcXVldWUsIHdoaWNoIHJlZ3Jlc3NlZCBpbiAxLjkuMAorICAoZmQubyAjODU1NjMsIFBhdHJpY2sgV2VsY2hlKQorCivigKIgQ29uc2lzdGVudGx5IHNhdmUgZXJybm8gYWZ0ZXIgc29ja2V0IGNhbGxzIChmZC5vICM4MzYyNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbiBkYnVzLXNwYXduLCB3aGVuIHRoZSBncmFuZGNoaWxkIHByb2Nlc3MgZXhpdHMgZHVlIHRvIGEgZmFpbGVkIGV4ZWMoKSwKKyAgZG8gbm90IGxvc2UgdGhlIGV4ZWMoKSBlcnJubyAoZmQubyAjMjQ4MjEsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG8gbm90IGZhaWwgdGhlIHRlc3RzIGlmIGEgcGFyZW50IHByb2Nlc3MgaGFzIGxlYWtlZCBub24tY2xvc2Utb24tZXhlYworICBmaWxlIGRlc2NyaXB0b3JzIHRvIHVzIChmZC5vICM3MzY4OSwgZmQubyAjODM4OTk7IFNpbW9uIE1jVml0dGllKQorCivigKIgRG8gbm90IGZhaWwgdGhlIHRlc3RzIG9uIFVuaXggcGxhdGZvcm1zIHdpdGggaW5jb21wbGV0ZQorICBjcmVkZW50aWFscy1wYXNzaW5nIHN1cHBvcnQsIGJ1dCBkbyBmYWlsIGlmIHdlIGNhbid0IHBhc3MgY3JlZGVudGlhbHMKKyAgb24gYSBwbGF0Zm9ybSB3aGVyZSBpdCBpcyBrbm93biB0byB3b3JrOiBMaW51eCwgRnJlZUJTRCwgT3BlbkJTRCwgTmV0QlNECisgIChmZC5vICM2OTcwMiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEZXRlY3QgYWNjZXB0NCwgZGlyZmQsIGlub3RpZnlfaW5pdDEsIHBpcGUyLCBhbmQgVW5peCBmZCBwYXNzaW5nCisgIHdoZW4gYnVpbGRpbmcgd2l0aCBjbWFrZSwgYW5kIGV4cGFuZCB0ZXN0IGNvdmVyYWdlIHRoZXJlCisgIChmZC5vICM3MzY4OTsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuOS4wICgyMDE0LTEwLTAxKQorPT0KKworVGhlIOKAnHRpZXJlZCBjaGVlc2Vz4oCdIHJlbGVhc2UuCisKK1JlcXVpcmVtZW50czoKKwor4oCiIFN1cHBvcnQgZm9yIHRoZSBzeXN0ZW1kOiAoTElTVEVOX0ZEUykgcHNldWRvLXRyYW5zcG9ydCBvbiBMaW51eCBub3cKKyAgcmVxdWlyZXMgZWl0aGVyIHRoZSBsaWJzeXN0ZW1kIG9yIGxpYnNkLWRhZW1vbiBzaGFyZWQgbGlicmFyeSwgZHJvcHBpbmcgdGhlCisgIGVtYmVkZGVkIGNvbnZlbmllbmNlIGNvcHkgb2Ygc2QtZGFlbW9uIChmZC5vICM3MTgxOCwgU2ltb24pCisKK0J1aWxkLXRpbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzOgorCivigKIgVGhlIFN0YXRzIGludGVyZmFjZSBpcyBub3cgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgbG9ja2VkLWRvd24gdG8KKyAgcm9vdC1vbmx5IG9uIHRoZSBzeXN0ZW0gYnVzLiBDb25maWd1cmUgd2l0aCAtLWRpc2FibGUtc3RhdHMKKyAgdG8gZGlzYWJsZSBpdCBhbHRvZ2V0aGVyIG9uIG1lbW9yeS0gb3IgZGlzay1jb25zdHJhaW5lZCBzeXN0ZW1zLAorICBvciBzZWUgJHtkb2NkaXJ9L2V4YW1wbGVzLyB0byBvcGVuIGl0IHVwIHRvIG5vbi1yb290IHVzZXJzIG9uIHRoZQorICBzeXN0ZW0gYnVzIG9yIHJlc3RyaWN0IGFjY2VzcyBvbiB0aGUgc2Vzc2lvbiBidXMuCisgIChmZC5vICM4MDc1OTsgU2ltb24gTWNWaXR0aWUsIEFsYmFuIENyZXF1eSkKKwor4oCiIFRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gbm93IGJ1aWxkcyB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeSBuYW1lIGFzIEF1dG90b29scworICBvbiBhdCBsZWFzdCBMaW51eCBhbmQgV2luZG93czoKKyAgLSBvbiBMaW51eCAoYW5kIHBlcmhhcHMgb3RoZXIgVW5peCBwbGF0Zm9ybXMpLCBpdCBwcmV2aW91c2x5IGJ1aWx0CisgICAgbGliZGJ1cy0xLnNvLCBidXQgbm93IGJ1aWxkcyBsaWJkYnVzLTEuc28uMy4qIHdpdGggZGV2ZWxvcG1lbnQKKyAgICBzeW1saW5rIGxpYmRidXMtMS5zbyBhbmQgU09OQU1FL3N5bWxpbmsgbGliZGJ1cy0xLnNvLjMKKyAgLSBvbiBXaW5kb3dzLCBpdCBwcmV2aW91c2x5IGJ1aWx0IGVpdGhlciBsaWJkYnVzLTEuZGxsIChyZWxlYXNlKSBvcgorICAgIGxpYmRidXMtMWQuZGxsIChkZWJ1ZyksIGJ1dCBub3cgYnVpbGRzIGxpYmRidXMtMS0zLmRsbCwgY29waWVkIHRvCisgICAgbGliZGJ1cy0xLmRsbCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGFwcGxpY2F0aW9ucy4KKyAgKGZkLm8gIzc0MTE3LCBSYWxmIEhhYmFja2VyKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMC4yNAorICDCtyBkb2N1bWVudCBob3cgdG8gcXVvdGUgbWF0Y2ggcnVsZXMgKGZkLm8gIzI0MzA3LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgZXhwbGljaXRseSBzYXkgdGhhdCBtb3N0IG1lc3NhZ2UgdHlwZXMgbmV2ZXIgZXhwZWN0IGEgcmVwbHkKKyAgICByZWdhcmRsZXMgb2Ygd2hldGhlciB0aGV5IGhhdmUgTk9fUkVQTFlfRVhQRUNURUQKKyAgICAoZmQubyAjNzU3NDksIFNpbW9uIE1jVml0dGllKQorCivigKIgb24gVW5peCBwbGF0Zm9ybXMsIGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG0gb24gVENQIGNvbm5lY3Rpb25zIHRvIGltcHJvdmUKKyAgaW5pdGlhbCBsYXRlbmN5IChmZC5vICM3NTU0NCwgTWF0dCBIb29zaWVyKQorCivigKIgdXNlIGJhY2t0cmFjZSgpIGlmIGl0IGlzIGluIC1sZXhlY2luZm8gaW5zdGVhZCBvZiBsaWJjLCBhcyBvbiBOZXRCU0QKKyAgKGZkLm8gIzY5NzAyLCBQYXRyaWNrIFdlbGNoZSkKKwor4oCiIGluIGRidXMtbW9uaXRvciwgcHJpbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWxlIGRlc2NyaXB0b3JzCisgIChmZC5vICM4MDYwMywgQWxiYW4gQ3JlcXV5KQorCivigKIgZG8gbm90IGluc3RhbGwgc3lzdGVtIGJ1cyBjb25maWd1cmF0aW9uIGlmIGJ1aWx0IGZvciBXaW5kb3dzCisgIChmZC5vICM4MzU4MzsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgR2V0QWxsTWF0Y2hSdWxlcyB0byB0aGUgU3RhdHMgaW50ZXJmYWNlIChmZC5vICMyNDMwNywgQWxiYW4gQ3JlcXV5KQorCivigKIgQWRkIGEgcmVncmVzc2lvbiB0ZXN0IGZvciBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyAoZmQubyAjODM2MjIsCisgIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIGZpeCBhbiBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBpZiBhIFVuaXggc29ja2V0IHBhdGggaXMgdG9vIGxvbmcKKyAgKGZkLm8gIzczODg3LCBBbnRvaW5lIEphY291dG90KQorCivigKIgaW4gYW4gTVNZUy9DeWd3aW4gZW52aXJvbm1lbnQsIHBhc3MgVW5peC1zdHlsZSBmaWxlbmFtZXMgdG8geG1sdG8sCisgIGZpeGluZyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gKGZkLm8gIzc1ODYwLCDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyKQorCivigKIgaW4gVW5peCB3aXRoIFgxMSwgYXZvaWQgZ2l2aW5nIGRidXMtbGF1bmNoIGEgbWlzbGVhZGluZyBhcmd2WzBdCisgIGluIHBzKDEpIChmZC5vICM2OTcxNiwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIGF2b2lkIGNhbGxpbmcgcG9sbCgpIHdpdGggdGltZW91dCA8IC0xLCB3aGljaCBpcyBjb25zaWRlcmVkIGludmFsaWQKKyAgb24gRnJlZUJTRCBhbmQgTmV0QlNEIChmZC5vICM3ODQ4MCwgSmFhcCBCb2VuZGVyKQorCivigKIgYmUgcG9ydGFibGUgdG8gQlNELWRlcml2ZWQgcGxhdGZvcm1zIHdoZXJlIE9fQ0xPRVhFQyBpcyB1bmF2YWlsYWJsZSBpbiBsaWJjCisgIChsaWtlIE1hYyBPUyBYIDEwLjYpLCBvciBhdmFpbGFibGUgaW4gbGliYyBidXQgdW5zdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAorICAoZmQubyAjNzcwMzI7IHJtdnN4b3AsIE9CQVRBIEFraW8sIFBhdHJpY2sgV2VsY2hlKQorCivigKIgRml4IGluY2x1ZGUgcGF0aCBmb3IgdGVzdC9pbnRlcm5hbC8qLmMgd2l0aCBjbWFrZSAoUmFsZiBIYWJhY2tlcikKKwor4oCiIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCisgIChmZC5vICM4MDc5NSwgIzg0MzEzOyBUaG9tYXMgSGFsbGVyLCBTZWJhc3RpYW4gUmFzbXVzc2VuKQorCivigKIgaW4gZGJ1cy1tb25pdG9yLCBkbyBub3QgbGVhayBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgd2UgaGF2ZSBtb25pdG9yZWQKKyAgKGZkLm8gIzgwNjAzLCBBbGJhbiBDcmVxdXkpCisKK+KAoiBTZXQgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZyBmb3IgdGhlIGlub3RpZnkgZmlsZSBkZXNjcmlwdG9yLCBldmVuCisgIGlmIGJ1aWx0IHdpdGggQ01ha2Ugb3Igb2xkZXIgbGliYyAoZmQubyAjNzM2ODksIFNpbW9uIE1jVml0dGllKQorCivigKIgUmVtb3ZlIHNvbWUgTEdQTCBjb2RlIGZyb20gdGhlIFdpbmRvd3MgZGJ1cy1kYWVtb24KKyAgKGZkLm8gIzU3MjcyLCBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjguOCAoMjAxNC0wOS0xNikKKz09CisKK1RoZSAic21hc2h5IHNtYXNoeSBlZ2cgbWFuIiByZWxlYXNlLgorCitTZWN1cml0eSBmaXhlczoKKwor4oCiIERvIG5vdCBhY2NlcHQgYW4gZXh0cmEgZmQgaW4gdGhlIHBhZGRpbmcgb2YgYSBjbXNnIG1lc3NhZ2UsIHdoaWNoCisgIGNvdWxkIGxlYWQgdG8gYSA0LWJ5dGUgaGVhcCBidWZmZXIgb3ZlcnJ1bi4KKyAgKENWRS0yMDE0LTM2MzUsIGZkLm8gIzgzNjIyOyBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFJlZHVjZSBkZWZhdWx0IGZvciBtYXhpbXVtIFVuaXggZmlsZSBkZXNjcmlwdG9ycyBwYXNzZWQgcGVyIG1lc3NhZ2UKKyAgZnJvbSAxMDI0IHRvIDE2LCBwcmV2ZW50aW5nIGEgdWlkIHdpdGggdGhlIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YKKyAgY29ubmVjdGlvbnMgZnJvbSBleGhhdXN0aW5nIHRoZSBzeXN0ZW0gYnVzJyBmaWxlIGRlc2NyaXB0b3JzIHVuZGVyCisgIExpbnV4J3MgZGVmYXVsdCBybGltaXQuIERpc3RyaWJ1dG9ycyBvciBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgd2l0aCBhCisgIG1vcmUgcmVzdHJpY3RpdmUgZmQgbGltaXQgbWF5IHdpc2ggdG8gcmVkdWNlIHRoZXNlIGxpbWl0cyBmdXJ0aGVyLgorCisgIEFkZGl0aW9uYWxseSwgb24gTGludXggdGhpcyBwcmV2ZW50cyBhIHNlY29uZCBkZW5pYWwgb2Ygc2VydmljZQorICBpbiB3aGljaCB0aGUgZGJ1cy1kYWVtb24gY2FuIGJlIG1hZGUgdG8gZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlcgorICBvZiBmZHMgcGVyIHNlbmRtc2coKSBhbmQgZGlzY29ubmVjdCB0aGUgcHJvY2VzcyB0aGF0IHdvdWxkIGhhdmUKKyAgcmVjZWl2ZWQgdGhlbS4KKyAgKENWRS0yMDE0LTM2MzYsIGZkLm8gIzgyODIwOyBBbGJhbiBDcmVxdXkpCisKK+KAoiBEaXNjb25uZWN0IGNvbm5lY3Rpb25zIHRoYXQgc3RpbGwgaGF2ZSBhIGZkIHBlbmRpbmcgdW5tYXJzaGFsbGluZyBhZnRlcgorICBhIG5ldyBjb25maWd1cmFibGUgbGltaXQsIHBlbmRpbmdfZmRfdGltZW91dCAoZGVmYXVsdGluZyB0byAxNTAgc2Vjb25kcyksCisgIHJlbW92aW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBjcmVhdGluZyBhbiBhYnVzaXZlIGNvbm5lY3Rpb24gdGhhdCBjYW5ub3QgYmUKKyAgZGlzY29ubmVjdGVkIGJ5IHNldHRpbmcgdXAgYSBjaXJjdWxhciByZWZlcmVuY2UgdG8gYSBjb25uZWN0aW9uJ3MKKyAgZmlsZSBkZXNjcmlwdG9yLgorICAoQ1ZFLTIwMTQtMzYzNywgZmQubyAjODA1NTk7IEFsYmFuIENyZXF1eSkKKwor4oCiIFJlZHVjZSBkZWZhdWx0IGZvciBtYXhpbXVtIHBlbmRpbmcgcmVwbGllcyBwZXIgY29ubmVjdGlvbiBmcm9tIDgxOTIgdG8gMTI4LAorICBtaXRpZ2F0aW5nIGFuIGFsZ29yaXRobWljIGNvbXBsZXhpdHkgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrCisgIChDVkUtMjAxNC0zNjM4LCBmZC5vICM4MTA1MzsgQWxiYW4gQ3JlcXV5KQorCivigKIgUmVkdWNlIGRlZmF1bHQgZm9yIGF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgb24gdGhlIHN5c3RlbSBidXMgZnJvbQorICAzMCBzZWNvbmRzIHRvIDUgc2Vjb25kcywgYXZvaWRpbmcgZGVuaWFsIG9mIHNlcnZpY2UgYnkgdXNpbmcgdXAKKyAgYWxsIHVuYXV0aGVudGljYXRlZCBjb25uZWN0aW9uIHNsb3RzOyBhbmQgd2hlbiBhbGwgdW5hdXRoZW50aWNhdGVkCisgIGNvbm5lY3Rpb24gc2xvdHMgYXJlIHVzZWQgdXAsIG1ha2UgbmV3IGNvbm5lY3Rpb24gYXR0ZW1wdHMgYmxvY2sKKyAgaW5zdGVhZCBvZiBkaXNjb25uZWN0aW5nIHRoZW0uCisgIChDVkUtMjAxNC0zNjM5LCBmZC5vICM4MDkxOTsgQWxiYW4gQ3JlcXV5KQorCitPdGhlciBmaXhlczoKKwor4oCiIENoZWNrIGZvciBsaWJzeXN0ZW1kIGZyb20gc3lzdGVtZCA+PSAyMDksIGZhbGxpbmcgYmFjayB0bworICB0aGUgb2xkZXIgc2VwYXJhdGUgbGlicmFyaWVzIGlmIG5vdCBmb3VuZCAoVW11dCBUZXpkdXlhciBMaW5kc2tvZywKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBMaW51eCwgdXNlIHByY3RsKCkgdG8gZGlzYWJsZSBjb3JlIGR1bXBzIGZyb20gYSB0ZXN0IGV4ZWN1dGFibGUKKyAgdGhhdCBkZWxpYmVyYXRlbHkgcmFpc2VzIFNJR1NFR1YgdG8gdGVzdCBkYnVzLWRhZW1vbidzIGhhbmRsaW5nCisgIG9mIHRoYXQgY29uZGl0aW9uIChmZC5vICM4Mzc3MiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggY29tcGlsYXRpb24gd2l0aCAtLWVuYWJsZS1zdGF0cyAoZmQubyAjODEwNDMsIEdlbnRvbyAjNTA3MjMyOworICBBbGJhbiBDcmVxdXkpCisKK+KAoiBJbXByb3ZlIGRvY3VtZW50YXRpb24gZm9yIHJ1bm5pbmcgdGVzdHMgb24gV2luZG93cyAoZmQubyAjNDEyNTIsCisgIFJhbGYgSGFiYWNrZXIpCisKK0QtQnVzIDEuOC42ICgyMDE0LTA2LTAyKQorPT0KKworU2VjdXJpdHkgZml4ZXM6CisKK+KAoiBPbiBMaW51eCDiiaUgMi42LjM3LXJjNCwgaWYgc2VuZG1zZygpIGZhaWxzIHdpdGggRVRPT01BTllSRUZTLCBzaWxlbnRseSBkcm9wCisgIHRoZSBtZXNzYWdlLiBUaGlzIHByZXZlbnRzIGFuIGF0dGFjayBpbiB3aGljaCBhIG1hbGljaW91cyBjbGllbnQgY2FuCisgIG1ha2UgZGJ1cy1kYWVtb24gZGlzY29ubmVjdCBhIHN5c3RlbSBzZXJ2aWNlLCB3aGljaCBpcyBhIGxvY2FsCisgIGRlbmlhbCBvZiBzZXJ2aWNlLgorICAoZmQubyAjODAxNjMsIENWRS0yMDE0LTM1MzI7IEFsYmFuIENyZXF1eSkKKwor4oCiIFRyYWNrIHJlbWFpbmluZyBVbml4IGZpbGUgZGVzY3JpcHRvcnMgY29ycmVjdGx5IHdoZW4gbW9yZSB0aGFuIG9uZQorICBtZXNzYWdlIGluIHF1aWNrIHN1Y2Nlc3Npb24gY29udGFpbnMgZmRzLiBUaGlzIHByZXZlbnRzIGFub3RoZXIgYXR0YWNrCisgIGluIHdoaWNoIGEgbWFsaWNpb3VzIGNsaWVudCBjYW4gbWFrZSBkYnVzLWRhZW1vbiBkaXNjb25uZWN0IGEgc3lzdGVtCisgIHNlcnZpY2UuCisgIChmZC5vICM3OTY5NCwgZmQubyAjODA0NjksIENWRS0yMDE0LTM1MzM7IEFsZWphbmRybyBNYXJ0w61uZXogU3XDoXJleiwKKyAgU2ltb24gTWNWaXR0aWUsIEFsYmFuIENyZXF1eSkKKworT3RoZXIgZml4ZXM6CisKK+KAoiBXaGVuIGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb24gc3RhcnRzIGEgZGJ1cy1kYWVtb24gYnV0IHRoZW4gY2Fubm90CisgIGF0dGFjaCB0byBhIHNlc3Npb24sIGtpbGwgdGhlIGRidXMtZGFlbW9uIGFzIGludGVuZGVkCisgIChmZC5vICM3NDY5OCwg0KDQvtC80LDQvSDQlNC+0L3Rh9C10L3QutC+KQorCitELUJ1cyAxLjguNCAoMjAxNC0wNi0xMCkKKz09CisKK1NlY3VyaXR5IGZpeDoKKwor4oCiIEFsYmFuIENyZXF1eSBhdCBDb2xsYWJvcmEgTHRkLiBkaXNjb3ZlcmVkIGFuZCBmaXhlZCBhIGRlbmlhbC1vZi1zZXJ2aWNlCisgIGZsYXcgaW4gZGJ1cy1kYWVtb24sIHBhcnQgb2YgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBELUJ1cy4KKyAgQWRkaXRpb25hbGx5LCBpbiBoaWdobHkgdW51c3VhbCBlbnZpcm9ubWVudHMgdGhlIHNhbWUgZmxhdyBjb3VsZCBsZWFkIHRvCisgIGEgc2lkZSBjaGFubmVsIGJldHdlZW4gcHJvY2Vzc2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNvbW11bmljYXRlLgorICAoQ1ZFLTIwMTQtMzQ3NywgZmQubyAjNzg5NzkpCisKK0QtQnVzIDEuOC4yICgyMDE0LTA0LTMwKQorPT0KKworVGhlIOKAnG5vYm9keSB3YW50cyByZWTigJ0gcmVsZWFzZS4KKworRW5oYW5jZW1lbnRzOgorCivigKIgaW4gdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSwgYWRkIHNvbWUgaGludHMgZm9yIExpbnV4IHVzZXJzIGNyb3NzLWNvbXBpbGluZworICBXaW5kb3dzIEQtQnVzIGJpbmFyaWVzIHRvIGJlIGFibGUgdG8gcnVuIHRlc3RzIHVuZGVyIFdpbmUKKyAgKGZkLm8gIzQxMjUyLCBSYWxmIEhhYmFja2VyKQorCivigKIgYWRkIERvY3VtZW50YXRpb24ga2V5IHRvIGRidXMuc2VydmljZSAoZmQubyAjNzc0NDcsIENhbWVyb24gTm9ybWFuKQorCitGaXhlczoKKwor4oCiIGluICJkYnVzLXV1aWRnZW4gLS1lbnN1cmUiLCB0cnkgdG8gY29weSBzeXN0ZW1kJ3MgL2V0Yy9tYWNoaW5lLWlkCisgIHRvIC92YXIvbGliL2RidXMvbWFjaGluZS1pZCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgYW4gZW50aXJlbHkgbmV3IElECisgIChmZC5vICM3Nzk0MSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBpZiBkYnVzLWxhdW5jaCByZWNlaXZlcyBhbiBYIGVycm9yIHZlcnkgcXVpY2tseSwgZG8gbm90IGtpbGwKKyAgdW5yZWxhdGVkIHByb2Nlc3NlcyAoZmQubyAjNzQ2OTgsINCg0L7QvNCw0L0g0JTQvtC90YfQtdC90LrQvikKKwor4oCiIG9uIFdpbmRvd3MsIGFsbG93IHVwIHRvIDhLIGNvbm5lY3Rpb25zIHRvIHRoZSBkYnVzLWRhZW1vbiwgaW5zdGVhZCBvZiB0aGUKKyAgcHJldmlvdXMgNjQgKGZkLm8gIzcxMjk3OyBDcmlzdGlhbiBPbmV0LCBSYWxmIEhhYmFja2VyKQorCivigKIgY29wZSB3aXRoIFxyXG4gbmV3bGluZXMgaW4gcmVncmVzc2lvbiB0ZXN0cywgc2luY2Ugb24gV2luZG93cywKKyAgZGJ1cy1kYWVtb24uZXhlIHVzZXMgdGV4dCBtb2RlIChmZC5vICM3NTg2Mywg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsikKKworRC1CdXMgMS44LjAgKDIwMTQtMDEtMjApCis9PQorCitUaGUg4oCcV29sdmVyaW5lIGRpc3RydXN0cyBteSBwcmludGVy4oCdIHJlbGVhc2UuCisKK1RoaXMgc3RhcnRzIGEgbmV3IHN0YWJsZSBicmFuY2guIFRoZSAxLjYueCBicmFuY2ggaXMgbm93IGNvbnNpZGVyZWQgdG8gYmUKK291dGRhdGVkLCBhbmQgd2lsbCBvbmx5IHJlY2VpdmUgZml4ZXMgZm9yIHNlcmlvdXMgYnVncyBzdWNoIGFzIHNlY3VyaXR5CitmbGF3cy4gVGhlIDEuNC54IGFuZCAxLjIueCBicmFuY2hlcyBubyBsb25nZXIgaGF2ZSB1cHN0cmVhbSBzdXBwb3J0IGFuZAorYXJlIHVubGlrZWx5IHRvIGdldCBhbnkgbW9yZSByZWxlYXNlcywgYnV0IGlmIGRpc3RyaWJ1dG9ycyBzdGlsbCBuZWVkIHRvCitzdXBwb3J0IHRoZW0sIHBsZWFzZSBzaGFyZSBzZWN1cml0eSBwYXRjaGVzIHZpYSB1cHN0cmVhbS4KKworU3VtbWFyeSBvZiBjaGFuZ2VzIHNpbmNlIDEuNi54OgorCivigKIgbGliZGJ1cyBhbHdheXMgYmVoYXZlcyBhcyBpZiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkgaGFkIGJlZW4gY2FsbGVkCisgICh0aHJlYWQtc2FmZXR5IGJ5IGRlZmF1bHQpCivigKIgbmV3IGRidXMtcnVuLXNlc3Npb24gdG9vbCwgcmVwbGFjaW5nIGNlcnRhaW4gbWlzdXNlcyBvZiBkYnVzLWxhdW5jaAor4oCiIGRidXMtbW9uaXRvciBjYW4gdGFsayB0byBvdXRkYXRlZCB2ZXJzaW9ucyBvZiBkYnVzLWRhZW1vbiBhZ2Fpbgor4oCiIG5ldyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMgbWV0aG9kCivigKIgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgYWxzbyB3b3JrcyBjb3JyZWN0bHkgb24gV2luZG93cywgcmV0dXJuaW5nCisgIHRoZSBXaW5kb3dzIHByb2Nlc3MgSUQKK+KAoiBHZXRDb25uZWN0aW9uV2luZG93c1NJRCByZXR1cm5zIHRoZSBjb3JyZWN0IFNJRCBvbiBXaW5kb3dzCivigKIgZXhwYXQgaXMgcmVxdWlyZWQsIGxpYnhtbDIgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFzIGEgc3Vic3RpdHV0ZQor4oCiIHRoZSB1c2VyREIgY2FjaGUgaXMgcmVxdWlyZWQsIGFuZCBjYW5ub3QgYmUgZGlzYWJsZWQKK+KAoiBhIDY0LWJpdCBpbnRlZ2VyIHR5cGUgKGVpdGhlciBpbnQsIGxvbmcsIGxvbmcgbG9uZyBvciBfaW50NjQpIGlzIHJlcXVpcmVkCivigKIgYmV0dGVyIHN5c3RlbWQtam91cm5hbGQgaW50ZWdyYXRpb24gb24gTGludXgKK+KAoiBmaXhlZCBsb25nLXN0YW5kaW5nIGZkIGFuZCBhcnJheSBsZWFrcyB3aGVuIGZhaWxpbmcgdG8gcGFyc2UgYSBtZXNzYWdlCivigKIgZml4ZWQgcmVmZXJlbmNlZC1idXQtbmV2ZXItZnJlZWQgcGFyZW50IG5vZGVzIChlZmZlY3RpdmVseSBtZW1vcnkgbGVha3MpCisgIHdoZW4gdXNpbmcgY2VydGFpbiBvYmplY3QtcGF0aCBhbGxvY2F0aW9uIHBhdHRlcm5zLCBub3RhYmx5IGluIEF2YWhpCivigKIgYmV0dGVyIGRlZmF1bHRzIGZvciBXaW5kb3dzIHN1cHBvcnQKK+KAoiBiZXR0ZXIgQ01ha2Ugc3VwcG9ydAor4oCiIGJldHRlciBwb3J0YWJpbGl0eSB0byBtaW5ndzMyLCBGcmVlQlNELCBOZXRCU0QsIFFOWCBhbmQgSHVyZAor4oCiIHRoZSBzb3VyY2UgbGFuZ3VhZ2UgZm9yIHRoZSBtYW4gcGFnZXMgaXMgbm93IERvY2Jvb2sgWE1MCisKK0VuaGFuY2VtZW50cyBzaW5jZSAxLjcuMTA6CisKK+KAoiBFbmhhbmNlIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdG8gY2hlY2sgZm9yIEdMaWIgYW5kIGNvbXBpbGUvcnVuCisgIGEgc3Vic2V0IG9mIHRoZSByZWdyZXNzaW9uIHRlc3RzIChmZC5vICM0MTI1MiwgIzczNDk1OyBSYWxmIEhhYmFja2VyKQorCitGaXhlcyBzaW5jZSAxLjcuMTA6CisKK+KAoiBkb24ndCByZWx5IG9uIHZhX2NvcHkoKSwgdXNlIERCVVNfVkFfQ09QWSgpIHdyYXBwZXIgKGZkLm8gIzcyODQwLAorICBSYWxmIEhhYmFja2VyKQorCivigKIgZml4IGNvbXBpbGF0aW9uIG9mIHN5c3RlbWQgam91cm5hbCBzdXBwb3J0IG9uIG9sZGVyIHN5c3RlbWQgdmVyc2lvbnMgd2hlcmUKKyAgc2Qtam91cm5hbC5oIGRvZXNuJ3QgaW5jbHVkZSBzeXNsb2cuaCAoZmQubyAjNzM0NTUsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBmaXggY29tcGlsYXRpb24gb24gb2xkZXIgTVNWQyB2ZXJzaW9ucyBieSBpbmNsdWRpbmcgc3RkbGliLmgKKyAgKGZkLm8gIzczNDU1LCBSYWxmIEhhYmFja2VyKQorCivigKIgQWxsb3cgPGFsbG93X2Fub255bW91cy8+IHRvIGFwcGVhciBpbiBhbiBpbmNsdWRlZCBjb25maWd1cmF0aW9uIGZpbGUKKyAgKGZkLm8gIzczNDc1LCBNYXR0IEhvb3NpZXIpCisKK1Rlc3QgYmVoYXZpb3VyIGNoYW5nZXMgc2luY2UgMS43LjEwOgorCivigKIgSWYgdGhlIHRlc3RzIGNyYXNoIHdpdGggYW4gYXNzZXJ0aW9uIGZhaWx1cmUsIHRoZXkgbm8gbG9uZ2VyIGRlZmF1bHQgdG8KKyAgYmxvY2tpbmcgZm9yIGEgZGVidWdnZXIgdG8gYmUgYXR0YWNoZWQuIFNldCBEQlVTX0JMT0NLX09OX0FCT1JUIGluIHRoZQorICBlbnZpcm9ubWVudCBpZiB5b3Ugd2FudCB0aGUgb2xkIGJlaGF2aW91ci4KKwor4oCiIFRvIGltcHJvdmUgZGVidWdnYWJpbGl0eSwgdGhlIGRidXMtZGFlbW9uIGFuZCBkYnVzLWRhZW1vbi1lYXZlc2Ryb3AgdGVzdHMKKyAgY2FuIGJlIHJ1biB3aXRoIGFuIGV4dGVybmFsIGRidXMtZGFlbW9uIGJ5IHNldHRpbmcKKyAgREJVU19URVNUX0RBRU1PTl9BRERSRVNTIGluIHRoZSBlbnZpcm9ubWVudC4gVGVzdC1jYXNlcyB0aGF0IHJlcXVpcmUKKyAgYW4gdW51c3VhbGx5LWNvbmZpZ3VyZWQgZGJ1cy1kYWVtb24gYXJlIHNraXBwZWQuCisKK0QtQnVzIDEuNy4xMCAoMjAxNC0wMS0wNikKKz09CisKK1RoZSDigJx3ZWlnaHRlZCBjb21wYW5pb24gY3ViZeKAnSByZWxlYXNlLgorCitUaGlzIGlzIGEgcmVsZWFzZSBjYW5kaWRhdGUgZm9yIEQtQnVzIDEuOC4KKworRC1CdXMgU3BlY2lmaWNhdGlvbiAwLjIzOgorCivigKIgZG9uJ3QgcmVxdWlyZSBtZXNzYWdlcyB3aXRoIG5vIElOVEVSRkFDRSB0byBiZSBkaXNwYXRjaGVkCisgIChmZC5vICM2ODU5NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBkb2N1bWVudCAidGNwOmJpbmQ9Li4uIiBhbmQgIm5vbmNlLXRjcDpiaW5kPS4uLiIgKGZkLm8gIzcyMzAxLAorICBDaGVuZ3dlaSBZYW5nKQorCivigKIgZGVmaW5lICJsaXN0ZW5hYmxlIiBhbmQgImNvbm5lY3RhYmxlIiBhZGRyZXNzZXMsIGFuZCBkaXNjdXNzCisgIHRoZSBkaWZmZXJlbmNlIChmZC5vICM2MTMwMywgU2ltb24gTWNWaXR0aWUpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIHN1cHBvcnQgcHJpbnRpbmcgVW5peCBmaWxlIGRlc2NyaXB0b3JzIGluIGRidXMtc2VuZCwgZGJ1cy1tb25pdG9yCisgIChmZC5vICM3MDU5MiwgUm9iZXJ0IEFuY2VsbCkKKwor4oCiIGRvbid0IGluc3RhbGwgc3lzdGVtZCB1bml0cyBpZiAtLWRpc2FibGUtc3lzdGVtZCBpcyBnaXZlbgorICAoZmQubyAjNzE4MTgsIENoZW5nd2VpIFlhbmcpCisKK0ZpeGVzOgorCivigKIgZG9uJ3QgbGVhayBtZW1vcnkgb24gb3V0LW9mLW1lbW9yeSB3aGlsZSBsaXN0aW5nIGFjdGl2YXRhYmxlIG9yCisgIGFjdGl2ZSBzZXJ2aWNlcyAoZmQubyAjNzE1MjYsIFJhZG9zbGF3IFBhamFrKQorCivigKIgZml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gYSByZWdyZXNzaW9uIHRlc3QgKGZkLm8gIzY5OTI0LCBEcmVhbU5paykKKwor4oCiIGVzY2FwZSBVbml4IHNvY2tldCBhZGRyZXNzZXMgY29ycmVjdGx5IChmZC5vICM0NjAxMywgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIG9uIFNFTGludXggc3lzdGVtcywgZG9uJ3QgYXNzdW1lIHRoYXQgU0VDQ0xBU1NfREJVUywgREJVU19fQUNRVUlSRV9TVkMKKyAgYW5kIERCVVNfX1NFTkRfTVNHIGFyZSBudW1lcmljYWxseSBlcXVhbCB0byB0aGVpciB2YWx1ZXMgaW4gdGhlCisgIHJlZmVyZW5jZSBwb2xpY3kgKGZkLm8gIzg4NzE5LCBvc21vbmQgc3VuKQorCivigKIgZGVmaW5lIFBST0NFU1NfUVVFUllfTElNSVRFRF9JTkZPUk1BVElPTiBpZiBtaXNzaW5nIGZyb20gTWluR1cgPCA0IGhlYWRlcnMKKyAgKGZkLm8gIzcxMzY2LCBNYXR0IEZpc2NoZXIpCisKK+KAoiBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiB0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiB3aW5zb2NrLmggYW5kCisgIHdpbnNvY2syLmggKGZkLm8gIzcxNDA1LCBNYXR0IEZpc2NoZXIpCisKK+KAoiBkbyBub3QgcmV0dXJuIGZhaWx1cmUgZnJvbSBfZGJ1c19yZWFkX25vbmNlKCkgd2l0aCBubyBlcnJvciBzZXQsCisgIHByZXZlbnRpbmcgYSBwb3RlbnRpYWwgY3Jhc2ggKGZkLm8gIzcyMjk4LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgb24gQlNEIHN5c3RlbXMsIGF2b2lkIHNvbWUgTygxKS1wZXItcHJvY2VzcyBtZW1vcnkgYW5kIGZkIGxlYWtzIGluIGtxdWV1ZSwKKyAgcHJldmVudGluZyB0ZXN0IGZhaWx1cmVzIChmZC5vICM2OTMzMiwgZmQubyAjNzIyMTM7IENoZW5nd2VpIFlhbmcpCisKK+KAoiBmaXggd2FybmluZyBzcGFtIG9uIEh1cmQgYnkgbm90IHRyeWluZyB0byBzZXQgU09fUkVVU0VBRERSIG9uIFVuaXggc29ja2V0cywKKyAgd2hpY2ggZG9lc24ndCBkbyBhbnl0aGluZyBhbnl3YXkgb24gYXQgbGVhc3QgTGludXggYW5kIEZyZWVCU0QKKyAgKGZkLm8gIzY5NDkyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGZpeCB1c2Ugb2YgVENQIHNvY2tldHMgb24gRnJlZUJTRCBhbmQgSHVyZCBieSB0b2xlcmF0aW5nIEVJTlZBTCBmcm9tCisgIHNlbmRtc2coKSB3aXRoIFNDTV9DUkVEUyAocmV0cnlpbmcgd2l0aCBwbGFpbiBzZW5kKCkpLCBhbmQgbG9va2luZworICBmb3IgY3JlZGVudGlhbHMgbW9yZSBjb3JyZWN0bHkgKGZkLm8gIzY5NDkyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGVuc3VyZSB0aGF0IHRlc3RzIHJ1biB3aXRoIGEgdGVtcG9yYXJ5IFhER19SVU5USU1FX0RJUiB0byBhdm9pZAorICBnZXR0aW5nIG1peGVkIHVwIGluIFhERy9zeXN0ZW1kICJ1c2VyIHNlc3Npb25zIiAoZmQubyAjNjEzMDEsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgcmVmcmVzaCBjYWNoZWQgcG9saWN5IHJ1bGVzIGZvciBleGlzdGluZyBjb25uZWN0aW9ucyB3aGVuIGJ1cworICBjb25maWd1cmF0aW9uIGNoYW5nZXMgKGZkLm8gIzM5NDYzLCBDaGVuZ3dlaSBZYW5nKQorCitELUJ1cyAxLjcuOCAoMjAxMy0xMS0wMSkKKz09CisKK1RoZSDigJxleHRyZW1lIGhpbGxz4oCdIHJlbGVhc2UuCisKK0RlcGVuZGVuY2llczoKKwor4oCiIElmIHN5c3RlbWQgc3VwcG9ydCBpcyBlbmFibGVkLCBsaWJzeXN0ZW1kLWpvdXJuYWwgaXMgbm93IHJlcXVpcmVkLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBXaGVuIGFjdGl2YXRpbmcgYSBub24tc3lzdGVtZCBzZXJ2aWNlIHVuZGVyIHN5c3RlbWQsIGFubm90YXRlIGl0cworICBzdGRvdXQvc3RkZXJyIHdpdGggaXRzIGJ1cyBuYW1lIGluIHRoZSBKb3VybmFsLiBLbm93biBsaW1pdGF0aW9uOgorICBiZWNhdXNlIHRoZSBzb2NrZXQgaXMgb3BlbmVkIGJlZm9yZSBmb3JraW5nLCB0aGUgcHJvY2VzcyB3aWxsIHN0aWxsIGJlCisgIGxvZ2dlZCBhcyBpZiBpdCBoYWQgZGJ1cy1kYWVtb24ncyBwcm9jZXNzIElEIGFuZCB1c2VyIElELgorICAoZmQubyAjNjg1NTksIENoZW5nd2VpIFlhbmcpCisKK+KAoiBEb2N1bWVudCBtb3JlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgaW4gZGJ1cy1kYWVtb24oMSkKKyAgKGZkLm8gIzY5MTI1LCBDaGVuZ3dlaSBZYW5nKQorCitGaXhlczoKKwor4oCiIERvbid0IGxlYWsgc3RyaW5nIGFycmF5cyBvciBmZHMgaWYgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KCkKKyAgdW5wYWNrcyB0aGVtIGFuZCB0aGVuIGVuY291bnRlcnMgYW4gZXJyb3IgKGZkLm8gIzIxMjU5LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgSWYgY29tcGlsZWQgd2l0aCBsaWJhdWRpdCwgcmV0YWluIENBUF9BVURJVF9XUklURSBzbyB3ZSBjYW4gd3JpdGUKKyAgZGlzYWxsb3dlZCBtZXRob2QgY2FsbHMgdG8gdGhlIGF1ZGl0IGxvZywgZml4aW5nIGEgcmVncmVzc2lvbiBpbiAxLjcuNgorICAoZmQubyAjNDkwNjIsIENvbGluIFdhbHRlcnMpCisKK+KAoiBwYXRoX25hbWVzcGFjZT0nLycgaW4gbWF0Y2ggcnVsZXMgaW5jb3JyZWN0bHkgbWF0Y2hlZCBub3RoaW5nOyBpdAorICBub3cgbWF0Y2hlcyBldmVyeXRoaW5nLiAoZmQubyAjNzA3OTksIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjcuNiAoMjAxMy0xMC0wOSkKKz09CisKK1RoZSDigJxDU0kgU2hyZXdzYnVyeeKAnSByZWxlYXNlLgorCitCdWlsZC10aW1lIGNvbmZpZ3VyYXRpb24gY2hhbmdlczoKKwor4oCiIERpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHZpYSBkbm90aWZ5IG9uIExpbnV4IGlzIG5vIGxvbmdlcgorICBzdXBwb3J0ZWQ7IGl0IGhhZG4ndCBjb21waWxlZCBzdWNjZXNzZnVsbHkgc2luY2UgMjAxMCBpbiBhbnkgY2FzZS4KKyAgSWYgeW91IGRvbid0IGhhdmUgaW5vdGlmeSAoTGludXgpIG9yIGtxdWV1ZSAoKkJTRCksIHlvdSB3aWxsIG5lZWQKKyAgdG8gc2VuZCBTSUdIVVAgdG8gdGhlIGRidXMtZGFlbW9uIHdoZW4gaXRzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgKGZkLm8gIzMzMDAxLCBDaGVuZ3dlaSBZYW5nKQorCivigKIgQ29tcGlsaW5nIHdpdGggLS1kaXNhYmxlLXVzZXJkYi1jYWNoZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkOworICBpdCBkaWRuJ3Qgd29yayBzaW5jZSBhdCBsZWFzdCAyMDA4LCBhbmQgd291bGQgbGVhZCB0byBhbiBleHRyZW1lbHkKKyAgc2xvdyBkYnVzLWRhZW1vbiBldmVuIGl0IHdvcmtlZC4gKGZkLm8gIzE1NTg5LCAjMTcxMzMsICM2Njk0NzsKKyAgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIFRoZSBEQlVTX0RJU0FCTEVfQVNTRVJUUyBDTWFrZSBvcHRpb24gZGlkbid0IGFjdHVhbGx5IGRpc2FibGUgbW9zdAorICBhc3NlcnRpb25zLiBJdCBoYXMgYmVlbiByZW5hbWVkIHRvIERCVVNfRElTQUJMRV9BU1NFUlQgdG8gYmUgY29uc2lzdGVudAorICB3aXRoIHRoZSBBdXRvdG9vbHMgYnVpbGQgc3lzdGVtLiAoZmQubyAjNjYxNDIsIENoZW5nd2VpIFlhbmcpCisKK+KAoiAtLXdpdGgtdmFsZ3JpbmQ9YXV0byBlbmFibGVzIFZhbGdyaW5kIGluc3RydW1lbnRhdGlvbiBpZiBhbmQgb25seSBpZgorICB2YWxncmluZCBoZWFkZXJzIGFyZSBhdmFpbGFibGUuIFRoZSBkZWZhdWx0IGlzIHN0aWxsIC0td2l0aC12YWxncmluZD1uby4KKyAgKGZkLm8gIzU2OTI1LCBTaW1vbiBNY1ZpdHRpZSkKKworRGVwZW5kZW5jaWVzOgorCivigKIgUGxhdGZvcm1zIHdpdGggbm8gNjQtYml0IGludGVnZXIgdHlwZSBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKyAgKGZkLm8gIzY1NDI5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEdOVSBtYWtlIGlzIG5vdyAoZG9jdW1lbnRlZCB0byBiZSkgcmVxdWlyZWQuIChmZC5vICM0ODI3NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGdWxsIHRlc3QgY292ZXJhZ2Ugbm8gbG9uZ2VyIHJlcXVpcmVzIGRidXMtZ2xpYiwgYWx0aG91Z2ggdGhlIHRlc3RzIGRvIG5vdAorICBleGVyY2lzZSB0aGUgc2hhcmVkIGxpYnJhcnkgKG9ubHkgYSBzdGF0aWMgY29weSkgaWYgZGJ1cy1nbGliIGlzIG1pc3NpbmcuCisgIChmZC5vICM2ODg1MiwgU2ltb24gTWNWaXR0aWUpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gMC4yMgorICDCtyBEb2N1bWVudCBHZXRBZHRBdWRpdFNlc3Npb25EYXRhKCkgYW5kCisgICAgR2V0Q29ubmVjdGlvblNFTGludXhTZWN1cml0eUNvbnRleHQoKSAoZmQubyAjNTQ0NDUsIFNpbW9uKQorICDCtyBGaXggZXhhbXBsZSAuc2VydmljZSBmaWxlIChmZC5vICM2NjQ4MSwgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgRG9uJ3QgY2xhaW0gRC1CdXMgaXMgImxvdy1sYXRlbmN5IiAobG93ZXIgdGhhbiB3aGF0PyksIGp1c3QKKyAgICBnaXZlIGZhY3R1YWwgc3RhdGVtZW50cyBhYm91dCBpdCBzdXBwb3J0aW5nIGFzeW5jIHVzZQorICAgIChmZC5vICM2NTE0MSwgSnVzdGluIExlZSkKKyAgwrcgRG9jdW1lbnQgdGhlIGNvbnRlbnRzIG9mIC5zZXJ2aWNlIGZpbGVzLCBhbmQgdGhlIGZhY3QgdGhhdAorICAgIHN5c3RlbSBzZXJ2aWNlcycgZmlsZW5hbWVzIGFyZSBjb25zdHJhaW5lZAorICAgIChmZC5vICM2NjYwODsgU2ltb24gTWNWaXR0aWUsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBCZSB0aHJlYWQtc2FmZSBieSBkZWZhdWx0IG9uIGFsbCBwbGF0Zm9ybXMsIGV2ZW4gaWYKKyAgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpIGhhcyBub3QgYmVlbiBjYWxsZWQuIEZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgb2xkZXIgbGliZGJ1cywgbGlicmFyeSB1c2VycyBzaG91bGQgY29udGludWUgdG8gY2FsbAorICBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCk6IGl0IGlzIGhhcm1sZXNzIHRvIGRvIHNvLgorICAoZmQubyAjNTQ5NzIsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIEdldENvbm5lY3Rpb25DcmVkZW50aWFscygpIG1ldGhvZCAoZmQubyAjNTQ0NDUsIFNpbW9uKQorCivigKIgTmV3IEFQSTogZGJ1c19zZXRlbnYoKSwgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgc2V0ZW52KCkuCisgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aHJlYWQtc2FmZS4gKGZkLm8gIzM5MTk2LCBTaW1vbikKKwor4oCiIEFkZCBkYnVzLXNlbmQgLS1wZWVyPUFERFJFU1MgKGNvbm5lY3QgdG8gYSBnaXZlbiBwZWVyLXRvLXBlZXIgY29ubmVjdGlvbiwKKyAgbGlrZSAtLWFkZHJlc3M9QUREUkVTUyBpbiBwcmV2aW91cyB2ZXJzaW9ucykgYW5kIGRidXMtc2VuZCAtLWJ1cz1BRERSRVNTCisgIChjb25uZWN0IHRvIGEgZ2l2ZW4gYnVzLCBsaWtlIGRidXMtbW9uaXRvciAtLWFkZHJlc3M9QUREUkVTUykuCisgIGRidXMtc2VuZCAtLWFkZHJlc3Mgc3RpbGwgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKKyAgYnV0IGlzIG5vIGxvbmdlciBkb2N1bWVudGVkLiAoZmQubyAjNDg4MTYsIEFuZHJleSBNYXpvKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgImRidXMtZGFlbW9uIC0tbm9mb3JrIiBpcyBhbGxvd2VkIG9uIFdpbmRvd3MgYWdhaW4uIChmZC5vICM2ODg1MiwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBBdm9pZCBhbiBpbmZpbml0ZSBidXN5LWxvb3AgaWYgYSBzaWduYWwgaW50ZXJydXB0cyB3YWl0cGlkKCkKKyAgKGZkLm8gIzY4OTQ1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIENsZWFuIHVwIG1lbW9yeSBmb3IgcGFyZW50IG5vZGVzIHdoZW4gb2JqZWN0cyBhcmUgdW5leHBvcnRlZAorICAoZmQubyAjNjAxNzYsIFRob21hcyBGaXR6c2ltbW9ucykKKwor4oCiIE1ha2UgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzKHgsIEZBTFNFKSBiZWhhdmUgYXMKKyAgZG9jdW1lbnRlZC4gUHJldmlvdXNseSwgaXQgYXNzdW1lZCBpdHMgc2Vjb25kIHBhcmFtZXRlciB3YXMgVFJVRS4KKyAgKGZkLm8gIzY5MTY1LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgRXNjYXBlIGFkZHJlc3NlcyBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGNvcnJlY3RseQorICAoZmQubyAjNTM0OTksIENoZW5nd2VpIFlhbmcpCisKK+KAoiBEb2N1bWVudCA8c2VydmljZWRpcj4gc2VhcmNoIG9yZGVyIGNvcnJlY3RseSAoZmQubyAjNjY5OTQsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBEb24ndCBjcmFzaCBvbiAiZGJ1cy1zZW5kIC0tc2Vzc2lvbiAvIHgueS56IiB3aGljaCByZWdyZXNzZWQgaW4gMS43LjQuCisgIChmZC5vICM2NTkyMywgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIElmIG1hbGxvYygpIHJldHVybnMgTlVMTCBpbiBfZGJ1c19zdHJpbmdfaW5pdCgpIG9yIHNpbWlsYXIsIGRvbid0IGZyZWUKKyAgYW4gaW52YWxpZCBwb2ludGVyIGlmIHRoZSBzdHJpbmcgaXMgbGF0ZXIgZnJlZWQgKGZkLm8gIzY1OTU5LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgSWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIGluIGRidXNfc2V0X2Vycm9yKCksIGRvbid0IHZhX2VuZCgpIGEgdmFfbGlzdAorICB0aGF0IHdhcyBuZXZlciB2YV9zdGFydCgpZWQgKGZkLm8gIzY2MzAwLCBDaGVuZ3dlaSBZYW5nKQorCivigKIgZml4IGJ1aWxkIGZhaWx1cmUgd2l0aCAtLWVuYWJsZS1zdGF0cyAoZmQubyAjNjYwMDQsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBmaXggYSByZWdyZXNzaW9uIHRlc3Qgb24gcGxhdGZvcm1zIHdpdGggc3RyaWN0IGFsaWdubWVudCAoZmQubyAjNjcyNzksCisgIENvbGluIFdhbHRlcnMpCisKK+KAoiBBdm9pZCBjYWxsaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMgImludGVyZmFjZSIgc2luY2UgY2VydGFpbiBXaW5kb3dzIGhlYWRlcnMKKyAgaGF2ZSBhIG5hbWVzcGFjZS1wb2xsdXRpbmcgbWFjcm8gb2YgdGhhdCBuYW1lIChmZC5vICM2NjQ5MywgSXZhbiBSb21hbm92KQorCivigKIgQXNzb3J0ZWQgRG94eWdlbiBmaXhlcyAoZmQubyAjNjU3NTUsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBWYXJpb3VzIHRocmVhZC1zYWZldHkgaW1wcm92ZW1lbnRzIHRvIHN0YXRpYyB2YXJpYWJsZXMgKGZkLm8gIzY4NjEwLAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgIm1ha2UgLWogY2hlY2siIHdvcmsgKGZkLm8gIzY4ODUyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvbiBhbiB1bmxpa2VseSBlcnJvciBwYXRoCisgIChmZC5vICM2OTMyNywgU3ZpYXRvc2xhdiBDaGFnYWV2KQorCivigKIgSW1wcm92ZSB2YWxncmluZCBtZW1vcnkgcG9vbCB0cmFja2luZyAoZmQubyAjNjkzMjYsCisgIFN2aWF0b3NsYXYgQ2hhZ2FldikKKwor4oCiIERvbid0IG92ZXItYWxsb2NhdGUgbWVtb3J5IGluIGRidXMtbW9uaXRvciAoZmQubyAjNjkzMjksCisgIFN2aWF0b3NsYXYgQ2hhZ2FldikKKwor4oCiIGRidXMtbW9uaXRvciBjYW4gbW9uaXRvciBkYnVzLWRhZW1vbiA8IDEuNS42IGFnYWluCisgIChmZC5vICM2NjEwNywgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IElmIGFjY2VwdDQoKSBmYWlscyB3aXRoIEVJTlZBTCwgYXMgaXQgY2FuIG9uIG9sZGVyIExpbnV4IGtlcm5lbHMKKyAgICB3aXRoIG5ld2VyIGdsaWJjLCB0cnkgYWNjZXB0KCkgaW5zdGVhZCBvZiBnb2luZyBpbnRvIGEgYnVzeS1sb29wLgorICAgIChmZC5vICM2OTAyNiwgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgSWYgc29ja2V0KCkgb3Igc29ja2V0cGFpcigpIGZhaWxzIHdpdGggRUlOVkFMIG9yIEVQUk9UT1RZUEUsCisgICAgZm9yIGluc3RhbmNlIG9uIEh1cmQgb3Igb2xkZXIgTGludXggd2l0aCBhIG5ldyBnbGliYywgdHJ5IHdpdGhvdXQKKyAgICBTT0NLX0NMT0VYRUMuIChmZC5vICM2OTA3MzsgUGlubyBUb3NjYW5vLCBDaGVuZ3dlaSBZYW5nKQorICDCtyBGaXggYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBvbiBhbiBlcnJvciBjb2RlIHBhdGguCisgICAgKGZkLm8gIzY5MTgyLCBTdmlhdG9zbGF2IENoYWdhZXYpCisgIMK3IGRidXMtcnVuLXNlc3Npb246IGNsZWFyIHNvbWUgdW53YW50ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgKGZkLm8gIzM5MTk2LCBTaW1vbikKKyAgwrcgZGJ1cy1ydW4tc2Vzc2lvbjogY29tcGlsZSBvbiBGcmVlQlNEIChmZC5vICM2NjE5NywgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgRG9uJ3QgZmFpbCB0aGUgYXV0b2xhdW5jaCB0ZXN0IGlmIHRoZXJlIGlzIG5vIERJU1BMQVkgKGZkLm8gIzQwMzUyLCBTaW1vbikKKyAgwrcgVXNlIGRidXMtbGF1bmNoIGZyb20gdGhlIGJ1aWxkZGlyIGZvciB0ZXN0aW5nLCBub3QgdGhlIGluc3RhbGxlZCBjb3B5CisgICAgKGZkLm8gIzM3ODQ5LCBDaGVuZ3dlaSBZYW5nKQorICDCtyBGaXggY29tcGlsYXRpb24gaWYgd3JpdGV2KCkgaXMgdW5hdmFpbGFibGUgKGZkLm8gIzY5NDA5LAorICAgIFZhc2lsaXkgQmFseWFzbnl5KQorICDCtyBSZW1vdmUgYnJva2VuIHN1cHBvcnQgZm9yIExPQ0FMX0NSRURTIGNyZWRlbnRpYWxzIHBhc3NpbmcsIGFuZAorICAgIGRvY3VtZW50IHdoZXJlIGVhY2ggY3JlZGVudGlhbC1wYXNzaW5nIHNjaGVtZSBpcyB1c2VkIChmZC5vICM2MDM0MCwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgTWFrZSBhdXRvZ2VuLnNoIHdvcmsgb24gKkJTRCBieSBub3QgYXNzdW1pbmcgR05VIGNvcmV1dGlscyBmdW5jdGlvbmFsaXR5CisgICAgKGZkLm8gIzM1ODgxLCAjNjk3ODc7IENoZW5nd2VpIFlhbmcpCisgIMK3IGRidXMtbW9uaXRvcjogYmUgcG9ydGFibGUgdG8gTmV0QlNEIChmZC5vICM2OTg0MiwgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgZGJ1cy1sYXVuY2g6IHN0b3AgdXNpbmcgbm9uLXBvcnRhYmxlIGFzcHJpbnRmIChmZC5vICMzNzg0OSwgU2ltb24pCisgIMK3IEltcHJvdmUgZXJyb3IgcmVwb3J0aW5nIGZyb20gdGhlIHNldHVpZCBhY3RpdmF0aW9uIGhlbHBlciAoZmQubyAjNjY3MjgsCisgICAgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IFJlbW92ZSB1bmF2YWlsYWJsZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmcm9tICdkYnVzLWRhZW1vbiAtLWhlbHAnCisgICAgKGZkLm8gIzQyNDQxLCBSYWxmIEhhYmFja2VyKQorICDCtyBBZGQgc3VwcG9ydCBmb3IgbG9va2luZyB1cCBsb2NhbCBUQ1B2NCBjbGllbnRzJyBjcmVkZW50aWFscyBvbgorICAgIFdpbmRvd3MgWFAgdmlhIHRoZSB1bmRvY3VtZW50ZWQgQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrCisgICAgZnVuY3Rpb24gKGZkLm8gIzY2MDYwLCBSYWxmIEhhYmFja2VyKQorICDCtyBGaXggaW5zdWZmaWNpZW50IGRlcGVuZGVuY3ktdHJhY2tpbmcgKGZkLm8gIzY4NTA1LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRG9uJ3QgaW5jbHVkZSB3c3BpYXBpLmgsIGZpeGluZyBhIGNvbXBpbGVyIHdhcm5pbmcgKGZkLm8gIzY4ODUyLAorICAgIFNpbW9uIE1jVml0dGllKQorCivigKIgSW50ZXJuYWwgY2hhbmdlczoKKyAgwrcgYWRkIERCVVNfRU5BQkxFX0FTU0VSVCwgREJVU19FTkFCTEVfQ0hFQ0tTIGZvciBsZXNzIGNvbmZ1c2luZworICAgIGNvbmRpdGlvbmFscyAoZmQubyAjNjYxNDIsIENoZW5nd2VpIFlhbmcpCisgIMK3IGltcHJvdmUgdmVyYm9zZS1tb2RlIG91dHB1dCAoZmQubyAjNjMwNDcsIENvbGluIFdhbHRlcnMpCisgIMK3IGNvbnNvbGlkYXRlIEF1dG90b29scyBhbmQgQ01ha2UgYnVpbGQgKGZkLm8gIzY0ODc1LCBSYWxmIEhhYmFja2VyKQorICDCtyBmaXggdmFyaW91cyB1bnVzZWQgdmFyaWFibGVzLCB1bnVzdWFsIGJ1aWxkIGNvbmZpZ3VyYXRpb25zCisgICAgZXRjLiAoZmQubyAjNjU3MTIsICM2NTk5MCwgIzY2MDA1LCAjNjYyNTcsICM2OTE2NSwgIzY5NDEwLCAjNzAyMTg7CisgICAgQ2hlbmd3ZWkgWWFuZywgVmFzaWxpeSBCYWx5YXNueXkpCisKK0QtQnVzIDEuNy40ICgyMDEzLTA2LTEzKQorPT0KKworVGhlIOKAnGJ1dCBpcyB5b3VyIHRocmVhZC1zYWZldHkgdGhyZWFkLXNhZmU/4oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzOgorCivigKIgQ1ZFLTIwMTMtMjE2ODogRml4IG1pc3VzZSBvZiB2YV9saXN0IHRoYXQgY291bGQgYmUgdXNlZCBhcyBhIGRlbmlhbAorICBvZiBzZXJ2aWNlIGZvciBzeXN0ZW0gc2VydmljZXMuIFZ1bG5lcmFiaWxpdHkgcmVwb3J0ZWQgYnkgQWxleGFuZHJ1IENvcm5lYS4KKyAgKFNpbW9uKQorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBUaGUgV2luZG93cyB2ZXJzaW9uIG9mIGxpYmRidXMgbm93IGNvbnRhaW5zIGEgQysrIHNvdXJjZSBmaWxlLCB1c2VkCisgIHRvIHByb3ZpZGUgZ2xvYmFsIGluaXRpYWxpemF0aW9uIHdoZW4gdGhlIGxpYnJhcnkgaXMgbG9hZGVkLgorICBnY2MgKG1pbmd3KikgdXNlcnMgc2hvdWxkIGVuc3VyZSB0aGF0IGcrKyBpcyBhbHNvIGluc3RhbGxlZC4KKwor4oCiIFRoZSBsaWJ4bWwyLWJhc2VkIGNvbmZpZ3VyYXRpb24gcmVhZGVyICh3aGljaCBoYXNuJ3Qgd29ya2VkIGZvciAyLjUgeWVhcnMsCisgIGFuZCB3YXMgbmV2ZXIgdGhlIHJlY29tbWVuZGVkIG9wdGlvbikgaGFzIGJlZW4gcmVtb3ZlZC4gRXhwYXQgaXMgbm93IGEKKyAgaGFyZCBkZXBlbmRlbmN5LgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBJdCBzaG91bGQgbm93IGJlIHNhZmUgdG8gY2FsbCBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkgZnJvbSBhbnkgdGhyZWFkLAorICBhdCBhbnkgdGltZS4gQXV0aG9ycyBvZiBsb2FkYWJsZSBtb2R1bGVzIGFuZCBwbHVnaW5zIHRoYXQgdXNlIGxpYmRidXMKKyAgc2hvdWxkIGNvbnNpZGVyIGRvaW5nIHNvIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgKGZkLm8gIzU0OTcyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEltcHJvdmUgZGJ1cy1zZW5kIGRvY3VtZW50YXRpb24gYW5kIGNvbW1hbmQtbGluZSBwYXJzaW5nIChmZC5vICM2NTQyNCwKKyAgQ2hlbmd3ZWkgWWFuZykKKworVW5peC1zcGVjaWZpYzoKKyAgwrcgZGJ1cy1ydW4tc2Vzc2lvbjogZXhwZXJpbWVudGFsIG5ldyB0b29sIHRvIHN0YXJ0IGEgdGVtcG9yYXJ5IEQtQnVzCisgICAgc2Vzc2lvbiwgZS5nLiBmb3IgcmVncmVzc2lvbiB0ZXN0cyBvciBhIHRleHQgY29uc29sZSwgcmVwbGFjaW5nCisgICAgY2VydGFpbiB1c2VzIG9mIGRidXMtbGF1bmNoIHdoaWNoIHdlcmVuJ3QgcmVhbGx5IGNvcnJlY3QKKyAgICAoZmQubyAjMzkxOTYsIFNpbW9uKQorCitPdGhlciBmaXhlczoKKwor4oCiIEluIGRidXMtZGFlbW9uLCBkb24ndCBjcmFzaCBpZiBhIC5zZXJ2aWNlIGZpbGUgc3RhcnRzIHdpdGgga2V5PXZhbHVlCisgIChmZC5vICM2MDg1MywgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IEZpeCBhIGNyYXNoIHNpbWlsYXIgdG8gQ1ZFLTIwMTMtMjE2OCB0aGUgZmlyc3QgdGltZSB3ZSB0cnkgdG8gdXNlIHN5c2xvZworICAgIG9uIGEgcGxhdGZvcm0gbm90IGRlZmluaW5nIExPR19QRVJST1IsIHN1Y2ggYXMgU29sYXJpcyBvciBRTlguCisgICAgVGhpcyByZWdyZXNzZWQgaW4gMS43LjAuIChTaW1vbikKKyAgwrcgRml4IGFuIGFzc2VydGlvbiBmYWlsdXJlIGlmIHdlIHRyeSB0byBhY3RpdmF0ZSBzeXN0ZW1kIHNlcnZpY2VzIGJlZm9yZQorICAgIHN5c3RlbWQgY29ubmVjdHMgdG8gdGhlIGJ1cyAoZmQubyAjNTAxOTksIENoZW5nd2VpIFlhbmcpCisgIMK3IEF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBpZ25vcmluZyB0aGUgcmV0dXJuIGZyb20gd3JpdGUoKQorICAgIChDaGVuZ3dlaSBZYW5nKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgVW5kZXIgY21ha2UsIGluc3RhbGwgcnVudGltZSBsaWJyYXJpZXMgKERMTHMpIGludG8gYmluLyBpbnN0ZWFkIG9mIGxpYi8KKyAgICBzbyB0aGF0IFdpbmRvd3MgZmluZHMgdGhlbSAoZmQubyAjNTk3MzMsIFJhbGYgSGFiYWNrZXIpCisKK0QtQnVzIDEuNy4yICgyMDEzLTA0LTI1KQorPT0KKworVGhlIOKAnG9ubHkgcGFydGlhbGx5IG9wYXF1ZeKAnSByZWxlYXNlLgorCitDb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBPbiBub24tUU5YIFVuaXggcGxhdGZvcm1zLCB0aGUgZGVmYXVsdCBsaW1pdCBvbiBmZHMgcGVyIG1lc3NhZ2UgaW4gdGhlCisgIHNlc3Npb24gYnVzIGNvbmZpZ3VyYXRpb24gaGFzIHJlZHVjZWQgZnJvbSA0MDk2IHRvIDEwMjQuIFRoZSBkZWZhdWx0CisgIGxpbWl0IHVzZWQgb24gdGhlIHN5c3RlbSBidXMgd2FzIGFscmVhZHkgMTAyNC4gT24gUU5YLCBib3RoIGxpbWl0cyBhcmUKKyAgcmVkdWNlZCBmdXJ0aGVyLCB0byAxMjguCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gMC4yMQorICDCtyBGb2xsb3dpbmcgVW5pY29kZSBDb3JyaWdlbmR1bSAjOSwgdGhlIG5vbmNoYXJhY3RlcnMgVStuRkZGRSwgVStuRkZGRiwKKyAgICBVK0ZERDAuLlUrRkRFRiBhcmUgYWxsb3dlZCBpbiBVVEYtOCBzdHJpbmdzIGFnYWluLiAoZmQubyAjNjMwNzIsCisgICAgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgRGlhZ25vc2UgaW5jb3JyZWN0IHVzZSBvZiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKSB3aXRoIG5lZ2F0aXZlIHNsb3QKKyAgKGkuZS4gYmVmb3JlIGFsbG9jYXRpbmcgdGhlIHNsb3QpIHJhdGhlciB0aGFuIHJldHVybmluZyBqdW5rCisgIChmZC5vICM2MzEyNywgRGFuIFdpbGxpYW1zKQorCivigKIgRml4IGEgY21ha2UgYnVpbGQgcmVncmVzc2lvbiBzaW5jZSAxLjcuMCAoZmQubyAjNjM2ODI7IFJhbGYgSGFiYWNrZXIsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgT24gTGludXgsIGxpbmsgc3VjY2Vzc2Z1bGx5IHdpdGggZ2xpYmMgMi4xNyAoZmQubyAjNjMxNjYsIFNpbW9uIE1jVml0dGllKQorwqAgwrcgVW5kZXIgc3lzdGVtZCwgbG9nIHRvIHN5c2xvZyBvbmx5LCBub3Qgc3RkZXJyLCBhdm9pZGluZyBkdXBsaWNhdGlvbgorICAgIChmZC5vICM2MTM5OSwgIzM5OTg3OyBDb2xpbiBXYWx0ZXJzLCBEYWdvYmVydCBNaWNoZWxzZW4pCisgIMK3IFVuZGVyIHN5c3RlbWQsIHJlbW92ZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmN5IG9uIHN5c2xvZy5zb2NrZXQKKyAgICAoZmQubyAjNjM1MzEsIENyaXN0aWFuIFJvZHLDrWd1ZXopCisgIMK3IEluY2x1ZGUgYWxsb2NhLmggZm9yIGFsbG9jYSgpIGlmIGF2YWlsYWJsZSwgZml4aW5nIGNvbXBpbGF0aW9uIG9uCisgICAgU29sYXJpcyAxMCAoZmQubyAjNjMwNzEsIERhZ29iZXJ0IE1pY2hlbHNlbikKKyAgwrcgQWxsb3cgdXNlIG9mIHN5c3RlbWQtbG9naW5kIHdpdGhvdXQgdGhlIHJlc3Qgb2Ygc3lzdGVtZAorICAgIChmZC5vICM2MjU4NSwgTWFydGluIFBpdHQpCisgIMK3IFdoZW4gYnVpbHQgd2l0aCBDTWFrZSwgbGluayB0byBsaWJydCBhbmQgdXNlIHRoZSByaWdodCBwYXRoIGZvcgorICAgIG1laW5wcm9jJ3MgWFNMVCBzdHlsZXNoZWV0cyAoZmQubyAjNjE2MzcsIFJhbGYgSGFiYWNrZXIpCisgIMK3IFJlZHVjZSB0aGUgZGVmYXVsdCBsaW1pdCBvbiBudW1iZXIgb2YgZmRzIHBlciBtZXNzYWdlIHRvIDEyOCB1bmRlcgorICAgIFFOWCwgd29ya2luZyBhcm91bmQgYW4gYXJiaXRyYXJ5IE9TIGxpbWl0IChmZC5vICM2MTE3NiwgTWF0dCBGaXNjaGVyKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgRG8gbm90IGNsYWltIHRoYXQgYWxsIGJ1cyBjbGllbnRzIGhhdmUgdGhlIGRidXMtZGFlbW9uJ3MgY3JlZGVudGlhbHM7CisgICAgcGljayB1cCBsb2NhbCBUQ1B2NCBjbGllbnRzJyBjcmVkZW50aWFscyAocHJvY2VzcyBJRCBhbmQgc2VjdXJpdHkKKyAgICBpZGVudGlmaWVyLCBpLmUuIHVzZXIpIHVzaW5nIEdldEV4dGVuZGVkVGNwVGFibGUoKSAoZmQubyAjNjE3ODcsCisgICAgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS43LjAgKDIwMTMtMDItMjIpCis9PQorCitUaGUgIkRpc2luZ2VudW91cyBBc3NlcnRpb25zIiByZWxlYXNlLgorCitUaGlzIGlzIGEgbmV3IGRldmVsb3BtZW50IHJlbGVhc2UsIHN0YXJ0aW5nIHRoZSAxLjcueCBicmFuY2guIEQtQnVzIDEuNgorcmVtYWlucyB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbiBmb3IgbG9uZy10ZXJtLXN1cHBvcnRlZCBkaXN0cmlidXRpb25zCitvciB0aGUgdXBjb21pbmcgR05PTUUgMy44IHJlbGVhc2UuCisKK0J1aWxkLXRpbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzOgorCivigKIgVGhlIC0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWRlZmF1bHQtYWRkcmVzcyBjb25maWd1cmUgb3B0aW9uIGlzIG5vIGxvbmdlcgorICBzdXBwb3J0ZWQuIFVzZSB0aGUgbmV3IC0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWNvbm5lY3QtYWRkcmVzcyBhbmQKKyAgLS13aXRoLWRidXMtc2Vzc2lvbi1idXMtbGlzdGVuLWFkZHJlc3Mgb3B0aW9ucyBpbnN0ZWFkLiBPbiBXaW5kb3dzLCB5b3UKKyAgdXN1YWxseSB3YW50IHRoZW0gdG8gaGF2ZSB0aGUgc2FtZSBhcmd1bWVudDsgb24gVW5peCwgdGhlIGRlZmF1bHRzIGFyZQorICB1c3VhbGx5IGNvcnJlY3QuCisKK+KAoiBTaW1pbGFybHksIHRoZSBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUyBDTWFrZSB2YXJpYWJsZSBpcyBubyBsb25nZXIKKyAgc3VwcG9ydGVkOyB1c2UgdGhlIG5ldyBEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTIGFuZAorICBEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUyB2YXJpYWJsZXMgaW5zdGVhZC4KKwor4oCiIGNtYWtlL2Nyb3NzLWNvbXBpbGUuc2ggaGFzIGJlZW4gcmVtb3ZlZC4gSW5zdGVhZCwgcGxlYXNlIHVzZSBhCisgIGNyb3NzLXRvb2xjaGFpbiBmaWxlICgtRENNQUtFX1RPT0xDSEFJTl9GSUxFKSBhcyBkb2N1bWVudGVkIGF0CisgIDxodHRwOi8vd3d3LnZ0ay5vcmcvV2lraS9DTWFrZV9Dcm9zc19Db21waWxpbmc+OyBvciB1c2UgQXV0b3Rvb2xzCisgIGFzIGRvY3VtZW50ZWQgaW4gImluZm8gYXV0b21ha2UgQ3Jvc3MtQ29tcGlsYXRpb24iLCBhbmQgc2V0CisgIFBLR19DT05GSUdfUEFUSCBhcHByb3ByaWF0ZWx5LgorCitSZXF1aXJlbWVudHM6CisKK+KAoiBNYW4gcGFnZXMgbm93IHJlcXVpcmUgeG1sdG8gKG9yIGVpdGhlciB4bWx0byBvciBtZWlucHJvYywgaWYgdXNpbmcgQ01ha2UpLgor4oCiIG1hbjJodG1sIGlzIG5vIGxvbmdlciB1c2VkLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIDAuMjAKKyAgwrcgYWN0dWFsbHkgc2F5IHRoYXQgL29yZy9mcmVlZGVza3RvcC9EQnVzIGlzIHRoZSBvYmplY3QgdGhhdAorICAgIGltcGxlbWVudHMgby5mZC5EQnVzIChmZC5vICM1MTg2NSwgQ29saW4gV2FsdGVycykKKyAgwrcgdmFyaW91cyByZW9yZ2FuaXNhdGlvbiBmb3IgYmV0dGVyIGNsYXJpdHkgKGZkLm8gIzM4MjUyLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgc3RvcCBjbGFpbWluZyB0aGF0IGFsbCBiYXNpYyB0eXBlcyB3b3JrIGp1c3QgbGlrZSBJTlQzMiAoc3RyaW5ncyBkb24ndCEpCisKK+KAoiBUaGUgInNvdXJjZSBjb2RlIiBmb3IgdGhlIG1hbiBwYWdlcyBpcyBub3cgRG9jYm9vayBYTUwsIGVsaW1pbmF0aW5nCisgIHRoZSBvdXRkYXRlZCBkdXBsaWNhdGUgY29waWVzIHVzZWQgd2hlbiBidWlsZGluZyB3aXRoIENNYWtlLgorICAoZmQubyAjNTk4MDU7IFJhbGYgSGFiYWNrZXIsIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIEluIHRoZSBhY3RpdmF0aW9uIGhlbHBlciwgd2hlbiBjb21waWxlZCBmb3IgdGVzdHMsIGRvIG5vdCByZXNldCB0aGUgc3lzdGVtCisgIGJ1cyBhZGRyZXNzLCBmaXhpbmcgdGhlIHJlZ3Jlc3Npb24gdGVzdHMuIChmZC5vICM1MjIwMiwgU2ltb24pCisKK+KAoiBGaXggYnVpbGRpbmcgd2l0aCBWYWxncmluZCAzLjgsIGF0IHRoZSBjb3N0IG9mIGNhdXNpbmcgaGFybWxlc3Mgd2FybmluZ3MKKyAgd2l0aCBWYWxncmluZCAzLjYgb24gc29tZSBjb21waWxlcnMgKGZkLm8gIzU1OTMyLCBBcnVuIFJhZ2hhdmFuKQorCivigKIgTWVyZ2UgPHNlcnZpY2VoZWxwZXI+IGZyb20gc3lzdGVtLWxvY2FsLmNvbmYgaWYgbmVjZXNzYXJ5IChmZC5vICM1MTU2MCwKKyAgS3J6eXN6dG9mIEtvbm9wa28pCisKK+KAoiBVbmRlciBDTWFrZSwgcHJlZmVyIHhtbHRvIG92ZXIgbWVpbnByb2MgKGZkLm8gIzU5NzMzLCBSYWxmIEhhYmFja2VyKQorCivigKIgU3RvcCBkdXBsaWNhdGluZyBDTWFrZSdzIG93biBsb2dpYyB0byBmaW5kIGxpYmV4cGF0CisgIChmZC5vICM1OTczMywgUmFsZiBIYWJhY2tlcikKKwor4oCiIERvbid0IGFzc3VtZSBDTWFrZSBob3N0IGFuZCBidWlsZCBzeXN0ZW0gYXJlIHRoZSBzYW1lIChmZC5vICM1OTczMywKKyAgUmFsZiBIYWJhY2tlcikKKwor4oCiIEF2b2lkIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciBHTGliIDIuMzUgKGZkLm8gIzU5OTcxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IENoZWNrIGZvciBmdW5jdGlvbnMgaW4gbGlicHRocmVhZCBjb3JyZWN0bHksIGZpeGluZyBjb21waWxhdGlvbiBvbgorICAgIChhdCBsZWFzdCkgT3BlbkJTRCAoZmQubyAjNDcyMzksIFNpbW9uKQorICDCtyBEb24ndCBsZWFrIHRlbXBvcmFyeSBmZHMgcG9pbnRpbmcgdG8gL2Rldi9udWxsIChmZC5vICM1NjkyNywKKyAgICBNaWNoZWwgSEVSTUlFUikKKyAgwrcgVXBkYXRlIHNkLWRhZW1vbi5bY2hdIGZyb20gc3lzdGVtZCAoZmQubyAjNjA2ODEpCisgIMK3IEFkZCBwYXJ0aWFsIHN1cHBvcnQgZm9yIFFOWCAoZmQubyAjNjAzMzksIGZkLm8gIzYxMTc2OyBNYXR0IEZpc2NoZXIpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBUaGUgZGVmYXVsdCBzZXNzaW9uIGJ1cyBsaXN0ZW5pbmcgYW5kIGNvbm5lY3RpbmcgYWRkcmVzcyBpcyBub3cKKyAgICAiYXV0b2xhdW5jaDoiLCB3aGljaCBtYWtlcyBELUJ1cyBvbiBXaW5kb3dzIGludGVyb3BlcmF0ZSB3aXRoIGl0c2VsZgorICAgIGFuZCBHREJ1cyAib3V0IG9mIHRoZSBib3giLiBVc2UgdGhlIGNvbmZpZ3VyZSBvcHRpb25zIGFuZCBjbWFrZSB2YXJpYWJsZXMKKyAgICBkZXNjcmliZWQgYWJvdmUgaWYgeW91IHJlcXVpcmUgYSBkaWZmZXJlbnQgYXV0b2xhdW5jaCBzY29wZS4KKyAgICAoZmQubyAjMzgyMDEsIFNpbW9uIE1jVml0dGllKQorICDCtyBBdm9pZCBhIENNYWtlIHdhcm5pbmcgdW5kZXIgQ3lnd2luIChmZC5vICM1OTQwMSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIENyZWF0ZSBzZXNzaW9uLmQsIHN5c3RlbS5kIGRpcmVjdG9yaWVzIHVuZGVyIENNYWtlIChmZC5vICM0MTMxOSwKKyAgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS42LjggKDIwMTItMDktMjgpCis9PQorCitUaGUgIkZpeCBvbmUgdGhpbmcsIGJyZWFrIGFub3RoZXIiIHJlbGVhc2UuCisKK+KAoiBGb2xsb3cgdXAgdG8gQ1ZFLTIwMTItMzUyNDogVGhlIGFkZGl0aW9uYWwgaGFyZGVuaW5nCisgIHdvcmsgdG8gdXNlIF9fc2VjdXJlX2dldGVudigpIGFzIGEgZm9sbG93dXAgdG8gYnVnICM1MjIwMgorICBicm9rZSBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9mIGdub21lLWtleXJpbmcuICBHaXZlbgorICB0aGUgZGlmZmljdWx0eSBvZiBtYWtpbmcgdGhpcyB3b3JrIHdpdGhvdXQgZXh0ZW5zaXZlCisgIGNoYW5nZXMgdG8gZ25vbWUta2V5cmluZywgdXNlIG9mIF9fc2VjdXJlX2dldGVudigpIGlzCisgIGRlZmVycmVkLgorCitELUJ1cyAxLjYuNiAoMjAxMi0wOS0yOCkKKz09CisKK1RoZSAiQ2xlYXIgdGhlIGVudmlyb25tZW50IGluIHlvdXIgc2V0dWlkIGJpbmFyaWVzLCBwbGVhc2UiIHJlbGVhc2UuCisKK+KAoiBDVkUtMjAxMi0zNTI0OiBEb24ndCBhY2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIChmZC5vICM1MjIwMikKKyAgVGhhbmtzIHRvIHdvcmsgYW5kIGlucHV0IGZyb20gQ29saW4gV2FsdGVycywgU2ltb24gTWNWaXR0aWUsCisgIEdlb2ZmcmV5IFRob21hcywgYW5kIG90aGVycy4KK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBGaXggY29tcGlsYXRpb24gb24gU29sYXJpcyAoZmQubyAjNTMyODYsIEpvbmF0aGFuIFBlcmtpbikKKyAgwrcgV29yayBhcm91bmQgaW50ZXJkZXBlbmRlbnQgaGVhZGVycyBvbiBPcGVuQlNEIGJ5IGluY2x1ZGluZyBzeXMvdHlwZXMuaAorICAgIGJlZm9yZSBlYWNoIHVzZSBvZiBzeXMvc29ja2V0LmggKGZkLm8gIzU0NDE4LCBCcmFkIFNtaXRoKQorCitELUJ1cyAxLjYuNCAoMjAxMi0wNy0xOCkKKz09CisKK+KAoiBEZXRlY3QgdGhhdCB1c2VycyBhcmUgImF0IHRoZSBjb25zb2xlIiBjb3JyZWN0bHkgd2hlbiBjb25maWd1cmVkIHdpdGgKKyAgYSBub24tZGVmYXVsdCBwYXRoIHN1Y2ggYXMgLS1lbmFibGUtY29uc29sZS1hdXRoLWRpcj0vcnVuL2NvbnNvbGUKKyAgKGZkLm8gIzUxNTIxLCBEYXZlIFJlaXNuZXIpCisKK+KAoiBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBmcm9tIERCdXNUcmFuc3BvcnQgKGZkLm8gIzUxNjU3LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgLS1lbmFibGUtZGV2ZWxvcGVyIGRlZmF1bHQgdG8gIm5vIiAocmVncmVzc2lvbiBpbiAxLjYuMjsKKyAgZmQubyAjNTE2NTcsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgTGF1bmNoIGRidXMtZGFlbW9uIGNvcnJlY3RseSBpZiBpdHMgcGF0aCBjb250YWlucyBhIHNwYWNlCisgICAgKGZkLm8gIzQ5NDUwLCBXb2xmZ2FuZyBCYXJvbikKKworRC1CdXMgMS42LjIgKDIwMTItMDYtMjcpCis9PQorCitUaGUgIkljZSBDYWJiYWdlIiByZWxlYXNlLgorCivigKIgQ2hhbmdlIGhvdyB3ZSBjcmVhdGUgL3Zhci9saWIvZGJ1cyBzbyBpdCB3b3JrcyB1bmRlciBBdXRvbWFrZSA+PSAxLjExLjQKKyAgKGZkLm8gIzUxNDA2LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvbid0IHJldHVybiBmcm9tIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgd2l0aCBhIGxvY2sgaGVsZCBvbiBPT00KKyAgKGZkLm8gIzUxMDMyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERpc2Nvbm5lY3QgImRldmVsb3BlciBtb2RlIiAoYXNzZXJ0aW9ucywgdmVyYm9zZSBtb2RlIGV0Yy4pIGZyb20KKyAgQXV0b21ha2UgbWFpbnRhaW5lciBtb2RlLiBELUJ1cyBkZXZlbG9wZXJzIHNob3VsZCBub3cgY29uZmlndXJlIHdpdGgKKyAgLS1lbmFibGUtZGV2ZWxvcGVyLiBBdXRvbWFrZSBtYWludGFpbmVyIG1vZGUgaXMgbm93IG9uIGJ5IGRlZmF1bHQ7CisgIGRpc3RyaWJ1dGlvbnMgY2FuIGRpc2FibGUgaXQgd2l0aCAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlLgorICAoZmQubyAjMzQ2NzEsIFNpbW9uIE1jVml0dGllKQorCivigKIgQXV0b21hdGljYWxseSBkZWZpbmUgREJVU19TVEFUSUNfQlVJTEQgaW4gc3RhdGljLW9ubHkgQXV0b3Rvb2xzIGJ1aWxkcywKKyAgZml4aW5nIGxpbmtpbmcgd2hlbiB0YXJnZXRpbmcgV2luZG93cyAoZmQubyAjMzM5NzM7IHdpbGxpYW0sIFNpbW9uIE1jVml0dGllKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgQ2hlY2sgZm9yIGxpYnB0aHJlYWQgdW5kZXIgQ01ha2Ugb24gVW5peCAoZmQubyAjNDcyMzcsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjYuMCAoMjAxMi0wNi0wNSkKKz09CisKK1RoZSDigJxzb3VsIG9mIHRoaXMgbWFjaGluZSBoYXMgaW1wcm92ZWTigJ0gcmVsZWFzZS4KKworVGhpcyB2ZXJzaW9uIHN0YXJ0cyBhIG5ldyBzdGFibGUgYnJhbmNoIG9mIEQtQnVzOiBvbmx5IGJ1ZyBmaXhlcyB3aWxsCitiZSBhY2NlcHRlZCBpbnRvIDEuNi54LiBPdGhlciBjaGFuZ2VzIHdpbGwgbm93IGdvIHRvIHRoZSAxLjcueCBicmFuY2guCisKK1N1bW1hcnkgb2YgY2hhbmdlcyBzaW5jZSAxLjQueDoKKwor4oCiIE5ldyByZXF1aXJlbWVudHMKKyAgwrcgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgb24gVW5peAorICDCtyBjb21waWxlciBzdXBwb3J0IGZvciA2NC1iaXQgaW50ZWdlcnMgKGludDY0X3Qgb3IgZXF1aXZhbGVudCkKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdjAuMTkKKwor4oCiIE5ldyBkYnVzLWRhZW1vbiBmZWF0dXJlcworICDCtyA8YWxsb3cgb3duX3ByZWZpeD0iY29tLmV4YW1wbGUuU2VydmljZSIvPiBydWxlcyBhbGxvdyB0aGUgc2VydmljZSB0bworICAgIG93biBuYW1lcyBsaWtlIGNvbS5leGFtcGxlLlNlcnZpY2UuSW5zdGFuY2UzCisgIMK3IG9wdGlvbmFsIHN5c3RlbWQgaW50ZWdyYXRpb24gd2hlbiBjaGVja2luZyBhdF9jb25zb2xlIHBvbGljaWVzCisgIMK3IC0tbm9waWRmaWxlIG9wdGlvbiwgbWFpbmx5IGZvciB1c2UgYnkgc3lzdGVtZAorICDCtyBwYXRoX25hbWVzcGFjZSBhbmQgYXJnMG5hbWVzcGFjZSBtYXkgYXBwZWFyIGluIG1hdGNoIHJ1bGVzCisgIMK3IGVhdmVzZHJvcHBpbmcgaXMgZGlzYWJsZWQgdW5sZXNzIHRoZSBtYXRjaCBydWxlIGNvbnRhaW5zIGVhdmVzZHJvcD10cnVlCisKK+KAoiBOZXcgcHVibGljIEFQSQorICDCtyBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgdmFyaW91cyBzdHJpbmcgdHlwZXMgKGRidXNfdmFsaWRhdGVfcGF0aCgpIGV0Yy4pCisgIMK3IGRidXNfdHlwZV9pc192YWxpZCgpCisgIMK3IERCdXNCYXNpY1ZhbHVlLCBhIHVuaW9uIG9mIGV2ZXJ5IGJhc2ljIHR5cGUKKwor4oCiIEJ1ZyBmaXhlcworICDCtyByZW1vdmVkIGFuIHVuc2FmZSByZWltcGxlbWVudGF0aW9uIG9mIHJlY3Vyc2l2ZSBtdXRleGVzCisgIMK3IGRidXMtZGFlbW9uIG5vIGxvbmdlciBidXN5LWxvb3BzIGlmIGl0IGhhcyBmYXIgdG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycworICDCtyBkYnVzLWRhZW1vbi5leGUgLS1wcmludC1hZGRyZXNzIHdvcmtzIG9uIFdpbmRvd3MKKyAgwrcgYWxsIHRoZSBvdGhlciBidWcgZml4ZXMgZnJvbSAxLjQuMjAKKwor4oCiIE90aGVyIG1ham9yIGltcGxlbWVudGF0aW9uIGNoYW5nZXMKKyAgwrcgb24gTGludXgsIGRidXMtZGFlbW9uIHVzZXMgZXBvbGwgaWYgc3VwcG9ydGVkLCBmb3IgYmV0dGVyIHNjYWxhYmlsaXR5CisgIMK3IGRidXNfdGhyZWFkc19pbml0KCkgaWdub3JlcyBpdHMgYXJndW1lbnQgYW5kIGJlaGF2ZXMgbGlrZQorICAgIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSBpbnN0ZWFkCisgIMK3IHJlbW92ZWQgdGhlIHBlci1jb25uZWN0aW9uIGxpbmsgY2FjaGUsIGltcHJvdmluZyBkYnVzLWRhZW1vbiBwZXJmb3JtYW5jZQorCivigKIgRGV2ZWxvcGVyIGZlYXR1cmVzCisgIMK3IG9wdGlvbmFsIFZhbGdyaW5kIGluc3RydW1lbnRhdGlvbiAoLS13aXRoLXZhbGdyaW5kKQorICDCtyBvcHRpb25hbCBTdGF0cyBpbnRlcmZhY2Ugb24gdGhlIGRidXMtZGFlbW9uICgtLWVuYWJsZS1zdGF0cykKKyAgwrcgb3B0aW9uYWxseSBhYm9ydCB3aGVuZXZlciBtYWxsb2MoKSBmYWlscyAoLS1lbmFibGUtZW1iZWRkZWQtdGVzdHMKKyAgICBhbmQgZXhwb3J0IERCVVNfTUFMTE9DX0NBTk5PVF9GQUlMPTEpCisKK0NoYW5nZXMgc2luY2UgMS41LjEyOgorCivigKIgQmUgbW9yZSBjYXJlZnVsIGFib3V0IG1vbm90b25pYyB0aW1lIHZzLiByZWFsIHRpbWUsIGZpeGluZyBEQlVTX0NPT0tJRV9TSEExCisgIHNwZWMtY29tcGxpYW5jZSAoZmQubyAjNDg1ODAsIERhdmlkIFpldXRoZW4pCisKK+KAoiBEb24ndCB1c2UgaW5zdGFsbCgxKSB3aXRoaW4gdGhlIHNvdXJjZS9idWlsZCB0cmVlcywgZml4aW5nIHRoZSBidWlsZCBhcworICBub24tcm9vdCB3aGVuIHVzaW5nIE9wZW5CU0QgaW5zdGFsbCgxKSAoZmQubyAjNDgyMTcsIEFudG9pbmUgSmFjb3V0b3QpCisKK+KAoiBBZGQgbWlzc2luZyBjb21tYXMgaW4gc29tZSB0Y3AgYW5kIG5vbmNlLXRjcCBhZGRyZXNzZXMsIGFuZCByZW1vdmUKKyAgYW4gdW51c2VkIGR1cGxpY2F0ZSBjb3B5IG9mIHRoZSBub25jZS10Y3AgdHJhbnNwb3J0IGluIFdpbmRvd3MgYnVpbGRzCisgIChmZC5vICM0NTg5NiwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuNS4xMiAoMjAxMi0wMy0yNykKKz09CisKK1RoZSDigJxCaWcgQm9vayBvZiBTY2llbmNl4oCdIHJlbGVhc2UuCisKK+KAoiBBZGQgcHVibGljIEFQSSB0byB2YWxpZGF0ZSB2YXJpb3VzIHN0cmluZyB0eXBlczoKKyAgZGJ1c192YWxpZGF0ZV9wYXRoKCksIGRidXNfdmFsaWRhdGVfaW50ZXJmYWNlKCksIGRidXNfdmFsaWRhdGVfbWVtYmVyKCksCisgIGRidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSgpLCBkYnVzX3ZhbGlkYXRlX2J1c19uYW1lKCksIGRidXNfdmFsaWRhdGVfdXRmOCgpCisgIChmZC5vICMzOTU0OSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBUdXJuIERCdXNCYXNpY1ZhbHVlIGludG8gcHVibGljIEFQSSBzbyBiaW5kaW5ncyBkb24ndCBuZWVkIHRvIGludmVudCB0aGVpcgorICBvd24gInVuaW9uIG9mIGV2ZXJ5dGhpbmciIHR5cGUgKGZkLm8gIzExMTkxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEVudW1lcmF0ZSBkYXRhIGZpbGVzIGluY2x1ZGVkIGluIHRoZSBidWlsZCByYXRoZXIgdGhhbiB1c2luZyBmaW5kKDEpCisgIChmZC5vICMzMzg0MCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgc3VwcG9ydCBmb3IgcG9saWN5IHJ1bGVzIGxpa2UgPGFsbG93IG93bl9wcmVmaXg9ImNvbS5leGFtcGxlLlNlcnZpY2UiLz4KKyAgaW4gZGJ1cy1kYWVtb24gKGZkLm8gIzQ2MjczLCBBbGJhbiBDcmVxdXkpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBtYWtlIGRidXMtZGFlbW9uLmV4ZSAtLXByaW50LWFkZHJlc3MgKGFuZCAtLXByaW50LXBpZCkgd29yayBhZ2FpbgorICAgIG9uIFdpbjMyLCBidXQgbm90IG9uIFdpbkNFIChmZC5vICM0NjA0OSwgU2ltb24gTWNWaXR0aWUpCisgIMK3IGZpeCBkdXBsaWNhdGUgY2FzZSB2YWx1ZSB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IG1pbmd3LXc2NAorICAgIChmZC5vICM0NzMyMSwgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5KQorCitELUJ1cyAxLjUuMTAgKDIwMTItMDItMjEpCis9PQorCitUaGUgImZpcmUgaW4gRGVsZXJpdW0iIHJlbGVhc2UuCisKK09uIFVuaXggcGxhdGZvcm1zLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSAoYXMgc3BlY2lmaWVkIGluIFBPU0lYIDIwMDggQmFzZQorYW5kIFNVU3YyKSBpcyBub3cgcmVxdWlyZWQuCisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIDAuMTk6CisgIMK3IEZvcm1hbGx5IGRlZmluZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lcyBhbmQgd2VsbC1rbm93biBidXMgbmFtZXMsCisgICAgYW5kIGRvY3VtZW50IGJlc3QgcHJhY3RpY2VzIGZvciBpbnRlcmZhY2UsIGJ1cywgbWVtYmVyIGFuZCBlcnJvciBuYW1lcywKKyAgICBhbmQgb2JqZWN0IHBhdGhzIChmZC5vICMzNzA5NSwgU2ltb24gTWNWaXR0aWUpCisgIMK3IERvY3VtZW50IHRoZSBzZWFyY2ggcGF0aCBmb3Igc2Vzc2lvbiBhbmQgc3lzdGVtIHNlcnZpY2VzIG9uIFVuaXgsIGFuZAorICAgIHdoZXJlIHRoZXkgc2hvdWxkIGJlIGluc3RhbGxlZCBieSBidWlsZCBzeXN0ZW1zIChmZC5vICMyMTYyMCwgZmQubyAjMzUzMDY7CisgICAgU2ltb24gTWNWaXR0aWUpCisgIMK3IERvY3VtZW50IHRoZSBzeXN0ZW1kIHRyYW5zcG9ydCAoZmQubyAjMzUyMzIsIExlbm5hcnQgUG9ldHRlcmluZykKKwor4oCiIE1ha2UgZGJ1c190aHJlYWRzX2luaXQoKSB1c2UgdGhlIHNhbWUgYnVpbHQtaW4gdGhyZWFkaW5nIGltcGxlbWVudGF0aW9uCisgIGFzIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKTsgdGhlIHVzZXItc3BlY2lmaWVkIHByaW1pdGl2ZXMgdGhhdCBpdAorICB0YWtlcyBhcyBhIHBhcmFtZXRlciBhcmUgbm93IGlnbm9yZWQgKGZkLm8gIzQzNzQ0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFsbG93IGFsbCBjb25maWd1cmVkIGF1dGggbWVjaGFuaXNtcywgbm90IGp1c3Qgb25lIChmZC5vICM0NTEwNiwKKyAgUGF2ZWwgU3RyYXNoa2luKQorCivigKIgSW1wcm92ZSBjbWFrZSBidWlsZCBzeXN0ZW0gKFJhbGYgSGFiYWNrZXIpOgorICDCtyBzaW1wbGlmeSBYTUwgcGFyc2VyIGRlcGVuZGVuY2llcyAoZmQubyAjNDEwMjcpCisgIMK3IGdlbmVyYXRlIGJ1aWxkIHRpbWVzdGFtcCAoZmQubyAjNDEwMjkpCisgIMK3IG9ubHkgY3JlYXRlIGJhdGNoIGZpbGVzIG9uIFdpbmRvd3MKKyAgwrcgZml4IG9wdGlvbiBhbmQgY2FjaGUgc3ludGF4CisgIMK3IGFkZCBoZWxwLW9wdGlvbnMgdGFyZ2V0CisgIMK3IHNoYXJlIGRidXMtYXJjaC1kZXBzLmguaW4gd2l0aCBhdXRvdG9vbHMgcmF0aGVyIHRoYW4gaGF2aW5nIG91cgorICAgIG93biB2ZXJzaW9uIChmZC5vICM0MTAzMykKKwor4oCiIEJ1aWxkIHRlc3RzIHN1Y2Nlc3NmdWxseSB3aXRoIG9sZGVyIEdMaWIsIGFzIGZvdW5kIGluIGUuZy4gRGViaWFuIDYKKyAgKGZkLm8gIzQxMjE5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEF2b2lkIHVzZSBvZiBkZXByZWNhdGVkIEdUaHJlYWQgQVBJIChmZC5vICM0NDQxMywgTWFydGluIFBpdHQpCisKK+KAoiBCdWlsZCBkb2N1bWVudGF0aW9uIGNvcnJlY3RseSBpZiBtYW4yaHRtbCBkb2Vzbid0IHN1cHBvcnQgZmlsZW5hbWVzIG9uCisgIGl0cyBjb21tYW5kLWxpbmUgKGZkLm8gIzQzODc1LCBKYWNrIE5hZ2VsKQorCivigKIgSW1wcm92ZSB0ZXN0IGNvdmVyYWdlLiBUbyBnZXQgZXZlbiBtb3JlIGNvdmVyYWdlLCBydW4gdGhlIHRlc3RzIHdpdGgKKyAgREJVU19URVNUX1NMT1c9MSAoZmQubyAjMzgyODUsICM0MjgxMTsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGJ5IG1vdmluZyBmdW5jdGlvbmFsaXR5IG9ubHkgdXNlZAorICBieSBkYnVzLWRhZW1vbiwgdGVzdHMgZXRjLiBpbnRvIHRoZWlyIGludGVybmFsIGxpYnJhcnkgYW5kIGRlbGV0aW5nCisgIHVudXNlZCBjb2RlIChmZC5vICMzNDk3NiwgIzM5NzU5OyBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBkYnVzLWRhZW1vbiAtLW5vcGlkZmlsZSBvcHRpb24sIG92ZXJyaWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24sIGZvcgorICBzZXR1cHMgd2hlcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGluY2x1ZGUgPHBpZGZpbGUvPiB0byBhdm9pZAorICBicmVha2luZyB0cmFkaXRpb25hbCBpbml0LCBidXQgdGhlIHBpZCBmaWxlIGlzIGluIGZhY3QgdW5uZWNlc3Nhcnk7IHVzZQorICBpdCB1bmRlciBzeXN0ZW1kIHRvIGltcHJvdmUgc3RhcnR1cCB0aW1lIGEgYml0IChmZC5vICM0NTUyMCwKKyAgTGVubmFydCBQb2V0dGVyaW5nKQorCivigKIgT3B0aW9uYWxseSAoaWYgY29uZmlndXJlZCAtLXdpdGgtdmFsZ3JpbmQpIGFkZCBpbnN0cnVtZW50YXRpb24gdG8gZGVidWcKKyAgbGliZGJ1cyBhbmQgYXNzb2NpYXRlZCB0b29scyBtb3JlIG1lYW5pbmdmdWxseSB1bmRlciBWYWxncmluZAorICAoZmQubyAjMzcyODYsIFNpbW9uIE1jVml0dGllKQorCivigKIgSW1wcm92ZSB0aGUgZGJ1cy1zZW5kKDEpIG1hbiBwYWdlIChmZC5vICMxNDAwNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBNYWtlIGRidXMtcHJvdG9jb2wuaCBjb21wYXRpYmxlIHdpdGggQysrMTEgKGZkLm8gIzQ2MTQ3LCBNYXJjIE11dHopCisKK+KAoiBJZiB0ZXN0cyBhcmUgZW5hYmxlZCBhbmQgREJVU19NQUxMT0NfQ0FOTk9UX0ZBSUwgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwKKyAgYWJvcnQgb24gZmFpbHVyZSB0byBtYWxsb2MoKSAobGlrZSBHTGliIGRvZXMpLCB0byB0dXJuIHJ1bmF3YXkgbWVtb3J5IGxlYWtzCisgIGludG8gYSBkZWJ1Z2dhYmxlIGNvcmUtZHVtcCBpZiBhIHJlc291cmNlIGxpbWl0IGlzIGFwcGxpZWQgKGZkLm8gIzQxMDQ4LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvbid0IGNyYXNoIGlmIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwgaW4gYSBkZWJ1ZyBidWlsZCAoZmQubyAjNDEwNDgsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgUmVwbGFjZSBvdXIgYnJva2VuIHJlaW1wbGVtZW50YXRpb24gb2YgcmVjdXJzaXZlIG11dGV4ZXMsIHdoaWNoIGhhcworICAgIGJlZW4gYnJva2VuIHNpbmNlIDIwMDYsIHdpdGggYW4gb3JkaW5hcnkgcHRocmVhZHMgcmVjdXJzaXZlIG11dGV4CisgICAgKGZkLm8gIzQzNzQ0OyBTaWdtdW5kIEF1Z2RhbCwgU2ltb24gTWNWaXR0aWUpCisgIMK3IFVzZSBlcG9sbCg3KSBmb3IgYSBtb3JlIGVmZmljaWVudCBtYWluIGxvb3AgaW4gTGludXg7IGVxdWl2YWxlbnQgcGF0Y2hlcworICAgIHdlbGNvbWVkIGZvciBvdGhlciBPU3MnIGVxdWl2YWxlbnRzIGxpa2Uga3F1ZXVlLCAvZGV2L3BvbGwsIG9yIFNvbGFyaXMKKyAgICBldmVudCBwb3J0cyAoZmQubyAjMzMzMzc7IFNpbW9uIE1jVml0dGllLCBSYWxmIEhhYmFja2VyKQorICDCtyBXaGVuIHJ1bm5pbmcgdW5kZXIgc3lzdGVtZCwgdXNlIGl0IGluc3RlYWQgb2YgQ29uc29sZUtpdCB0byBjaGVjaworICAgIHdoZXRoZXIgdG8gYXBwbHkgYXRfY29uc29sZSBwb2xpY2llcyAoZmQubyAjMzk2MDksIExlbm5hcnQgUG9ldHRlcmluZykKKyAgwrcgQXZvaWQgYSBoaWdobHkgdW5saWtlbHkgZmQgbGVhayAoZmQubyAjMjk4ODEsIFNpbW9uIE1jVml0dGllKQorICDCtyBEb24ndCBjbG9zZSBpbnZhbGlkIGZkIC0xIGlmIGdldGFkZHJpbmZvIGZhaWxzIChmZC5vICMzNzI1OCwgZVhlQzAwMWVyKQorwqAgwrcgRG9uJ3QgdG91Y2ggfi8uZGJ1cyBhbmQgfi8uZGJ1cy1rZXlyaW5ncyB3aGVuIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbGNoZWNrJworICAgIChmZC5vICM0MTIxOCwgU2ltb24gTWNWaXR0aWUpCisgIMK3IFN0b3AgcHJldGVuZGluZyB3ZSByZXNwZWN0IFhER19EQVRBX0RJUlMgZm9yIHN5c3RlbSBzZXJ2aWNlczogdGhlIGxhdW5jaAorICAgIGhlbHBlciBkb2Vzbid0IG9iZXkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGF2b2lkIHByaXZpbGVnZSBlc2NhbGF0aW9uCisgICAgYXR0YWNrcywgc28gbWFrZSB0aGUgc3lzdGVtIGJ1cyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKKyAgICAoZmQubyAjMjE2MjAsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgRmluZCB0aGUgZGJ1cy1kYWVtb24gZXhlY3V0YWJsZSBuZXh0IHRvIHRoZSBzaGFyZWQgbGlicmFyeSAoZmQubyAjNDE1NTg7CisgICAgSmVzcGVyIERhbSwgUmFsZiBIYWJhY2tlcikKKyAgwrcgUmVtb3ZlIHRoZSBmYXVsdHkgaW1wbGVtZW50YXRpb24gb2YgX2RidXNfY29uZHZhcl93YWtlX2FsbCAoZmQubyAjNDQ2MDksCisgICAgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuNS44ICgyMDExLTA5LTIxKQorPT0KKworVGhlICJjcm9zcy1tZXRlcmluZyIgcmVsZWFzZS4KKworSW4gYWRkaXRpb24gdG8gZGVhZCBjb2RlIHJlbW92YWwgYW5kIHJlZmFjdG9yaW5nLCB0aGlzIHJlbGVhc2UgY29udGFpbnMgYWxsCitvZiB0aGUgYnVnZml4ZXMgZnJvbSAxLjQuMTYuCisKK+KAoiBDbGVhbiB1cCBkZWFkIGNvZGUsIGFuZCBtYWtlIG1vcmUgd2FybmluZ3MgZmF0YWwgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzCisgIChmZC5vICMzOTIzMSwgZmQubyAjNDEwMTI7IFNpbW9uIE1jVml0dGllKQorCivigKIgSWYgZnVsbCB0ZXN0IGNvdmVyYWdlIGlzIHJlcXVlc3RlZCB2aWEgLS1lbmFibGUtdGVzdHMsIHN0cmljdGx5IHJlcXVpcmUKKyAgUHl0aG9uLCBweWdvYmplY3QgYW5kIGRidXMtcHl0aG9uLCB3aGljaCBhcmUgcmVxdWlyZWQgYnkgc29tZSB0ZXN0czsgaWYgbm90LAorICBhbmQgUHl0aG9uIGlzIG1pc3NpbmcsIHNraXAgdGhvc2UgdGVzdHMgcmF0aGVyIHRoYW4gZmFpbGluZworICAoZmQubyAjMzc4NDcsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2hlbiB1c2luZyBjbWFrZSwgcHJvdmlkZSB0aGUgc2FtZSB2ZXJzaW9uLWluZm8gQVBJIGluIHRoZSBpbnN0YWxsZWQgaGVhZGVycworICBhcyBmb3IgYXV0b3Rvb2xzIChEQlVTX1ZFUlNJT04sIGV0Yy4pIChmZC5vICM0MDkwNSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEFkZCBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgZmQubyAjMzgwMDUgKGZkLm8gIzM5ODM2LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgIk5PQ09ORklHVVJFPTEgLi9hdXRvZ2VuLnNoIiBub3QgcnVuIGNvbmZpZ3VyZSAoQ29saW4gV2FsdGVycykKKwor4oCiIEFkZCBfREJVU19TVEFUSUNfQVNTRVJUIGFuZCB1c2UgaXQgdG8gY2hlY2sgaW52YXJpYW50cyAoZmQubyAjMzk2MzYsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IGR1cGxpY2F0ZXMgaW4gYXV0aG9ycyBsaXN0IChSYWxmIEhhYmFja2VyKQorCivigKIgRml4IGJyb2tlbiBsaW5rcyBmcm9tIGRidXMtdHV0b3JpYWwuaHRtbCBpZiAkKGh0bWxkaXIpICE9ICQoZG9jZGlyKQorICAoZmQubyAjMzk4NzksIENocmlzIE1heW8pCisKK+KAoiBGaXggYSBzbWFsbCBtZW1vcnkgbGVhaywgYW5kIGEgZmFpbHVyZSB0byByZXBvcnQgZXJyb3JzLCB3aGVuIHVwZGF0aW5nCisgIGEgc2VydmljZSBmaWxlIGVudHJ5IGZvciBhY3RpdmF0aW9uIChmZC5vICMzOTIzMCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBDbGVhbiB1cCAobm9uLWFic3RyYWN0KSBVbml4IHNvY2tldHMgb24gYnVzIGRhZW1vbiBleGl0IChmZC5vICMzODY1NjsKKyAgICBCcmlhbiBDYW1lcm9uLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgT24gc3lzdGVtcyB0aGF0IHVzZSBsaWJjYXAtbmcgYnV0IG5vdCBzeXN0ZW1kLCBkcm9wIHN1cHBsZW1lbnRhbCBncm91cHMKKyAgICB3aGVuIHN3aXRjaGluZyB0byB0aGUgZGFlbW9uIHVzZXIgKFJlZCBIYXQgIzcyNjk1MywgU3RldmUgR3J1YmIpCisgIMK3IE1ha2UgdGhlIGNtYWtlIGJ1aWxkIHdvcmsgYWdhaW4gb24gR05VIHBsYXRmb3JtcyAoZmQubyAjMjkyMjgsCisgICAgU2ltb24gTWNWaXR0aWUpCisgIMK3IEZpeCBjb21waWxhdGlvbiBvbiBub24tQzk5IHN5c3RlbXMgdGhhdCBoYXZlIGludHR5cGVzLmggYnV0IG5vdCBzdGRpbnQuaCwKKyAgICBsaWtlIFNvbGFyaXMgKGZkLm8gIzQwMzEzLCBEYWdvYmVydCBNaWNoZWxzZW4pCisgIMK3IERlZmluZSBDTVNHX0FMSUdOLCBDTVNHX0xFTiwgQ01TR19TUEFDRSBvbiBTb2xhcmlzIDwgMTAKKyAgICAoZmQubyAjNDAyMzUsIFNpbW9uIE1jVml0dGllKQorICDCtyBDb3BlIHdpdGggVW5peGVzIHRoYXQgZG9uJ3QgaGF2ZSBMT0dfUEVSUk9SLCBsaWtlIFNvbGFyaXMgMTAKKyAgICAoZmQubyAjMzk5ODcsIFNpbW9uIE1jVml0dGllKQorICDCtyBDb3BlIHdpdGggcGxhdGZvcm1zIHdob3NlIHZzbnByaW50ZiB2aW9sYXRlcyBib3RoIFBPU0lYIGFuZCBDOTksIGxpa2UKKyAgICBUcnU2NCwgSVJJWCBhbmQgSFAtVVggKGZkLm8gIzExNjY4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IEZpeCBjb21waWxhdGlvbiBvbiBNU1ZDLCB3aGljaCBkb2Vzbid0IHVuZGVyc3RhbmQgImlubGluZSIgd2l0aCBpdHMKKyAgICBDOTkgbWVhbmluZyAoZmQubyAjNDAwMDA7IFJhbGYgSGFiYWNrZXIsIFNpbW9uIE1jVml0dGllKQorICDCtyBGaXggbWlzdXNlIG9mIEdQaWQgaW4gdGVzdC9kYnVzLWRhZW1vbi5jIChmZC5vICM0MDAwMywgU2ltb24gTWNWaXR0aWUpCisgIMK3IEZpeCBjcm9zcy1jb21waWxhdGlvbiB0byBXaW5kb3dzIHdpdGggQXV0b21ha2UgKGZkLm8gIzQwMDAzLCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS41LjYgKDIwMTEtMDctMjkpCis9PQorCitUaGUgIndlaXJkLCBncmF2eS1saWtlIGFmdGVydGFzdGUiIHJlbGVhc2UuCisKK0luIGFkZGl0aW9uIHRvIG5ldyBmZWF0dXJlcyBhbmQgcmVmYWN0b3JpbmcsIHRoaXMgcmVsZWFzZSBjb250YWlucyBhbGwgb2YgdGhlCitidWdmaXhlcyBmcm9tIDEuNC4xNC4KKworUG90ZW50aWFsbHkgaW5jb21wYXRpYmxlIChCdXN0bGUgYW5kIHNpbWlsYXIgZGVidWdnaW5nIHRvb2xzIHdpbGwgbmVlZAorY2hhbmdlcyB0byB3b3JrIGFzIGludGVuZGVkKToKKwor4oCiIERvIG5vdCBhbGxvdyBtYXRjaCBydWxlcyB0byAiZWF2ZXNkcm9wIiAocmVjZWl2ZSBtZXNzYWdlcyBpbnRlbmRlZCBmb3IgYQorICBkaWZmZXJlbnQgcmVjaXBpZW50KSBieSBtaXN0YWtlOiBlYXZlc2Ryb3BwZXJzIG11c3Qgbm93IG9wdC1pbiB0byB0aGlzCisgIGJlaGF2aW91ciBieSBwdXR0aW5nICJlYXZlc2Ryb3A9J3RydWUnIiBpbiB0aGUgbWF0Y2ggcnVsZSwgd2hpY2ggd2lsbAorICBub3QgaGF2ZSBhbnkgcHJhY3RpY2FsIGVmZmVjdCBvbiBidXNlcyB3aGVyZSBlYXZlc2Ryb3BwaW5nIGlzIG5vdCBhbGxvd2VkCisgIChmZC5vICMzNzg5MCwgQ29zaW1vIEFsZmFyYW5vKQorCitPdGhlciBjaGFuZ2VzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMTggKGZkLm8gIzM3ODkwLCBmZC5vICMzOTQ1MCwgZmQubyAjMzgyNTI7CisgIENvc2ltbyBBbGZhcmFubywgU2ltb24gTWNWaXR0aWUpCisgIMK3IGFkZCB0aGUgImVhdmVzZHJvcCIga2V5d29yZCB0byBtYXRjaCBydWxlcworICDCtyBkZWZpbmUgZWF2ZXNkcm9wcGluZywgdW5pY2FzdCBtZXNzYWdlcyBhbmQgYnJvYWRjYXN0IG1lc3NhZ2VzCisgIMK3IHN0b3AgY2xhaW1pbmcgdGhhdCBtYXRjaCBydWxlcyBhcmUgbmVlZGVkIHRvIG1hdGNoIHVuaWNhc3QgbWVzc2FnZXMgdG8geW91CisgIMK3IHByb21vdGUgdGhlIHR5cGUgc3lzdGVtIHRvIGJlIGEgdG9wLWxldmVsIHNlY3Rpb24KKwor4oCiIFVzZSBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSBpZiBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoCisgIG9yIGRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfZmFsbGJhY2sgZmFpbHMsIG5vdCAuLi5BRERSRVNTX0lOX1VTRSwKKyAgYW5kIHNpbXBsaWZ5IG9iamVjdC1wYXRoIHJlZ2lzdHJhdGlvbiAoZmQubyAjMzg4NzQsIEppxZnDrSBLbGltZcWhKQorCivigKIgQ29uc2lzdGVudGx5IHVzZSBhdG9taWMgb3BlcmF0aW9ucyBvbiBldmVyeXRoaW5nIHRoYXQgaXMgZXZlciBtYW5pcHVsYXRlZAorICB2aWEgYXRvbWljIG9wcywgYXMgd2FzIGRvbmUgZm9yIGNoYW5nZXMgdG8gREJ1c0Nvbm5lY3Rpb24ncyByZWZjb3VudCBpbgorICAxLjQuMTIgKGZkLm8gIzM4MDA1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrIHdoZW4gY29ubmVjdGluZyB0byBhIFRDUCBzb2NrZXQgKGZkLm8gIzM3MjU4LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgIm1ha2UgY2hlY2siIGluIGEgY2xlYW4gdHJlZSB3b3JrLCBieSBub3QgcnVubmluZyB0ZXN0cyB1bnRpbAorICB0ZXN0IGRhdGEgaGFzIGJlZW4gc2V0IHVwIChmZC5vICMzNDQwNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBUaGUgZGJ1cy1kYWVtb24gbm8gbG9uZ2VyIGJ1c3ktbG9vcHMgaWYgaXQgaGFzIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgZmlsZQorICBkZXNjcmlwdG9ycyAoZmQubyAjMjMxOTQsIFNpbW9uIE1jVml0dGllKQorCivigKIgUmVmYWN0b3IgbWVzc2FnZSBmbG93IHRocm91Z2ggZGlzcGF0Y2hpbmcgdG8gYXZvaWQgbG9ja2luZyB2aW9sYXRpb25zIGlmCisgIHRoZSBidXMgZGFlbW9uJ3MgbWVzc2FnZSBsaW1pdCBpcyBoaXQ7IHJlbW92ZSB0aGUgcGVyLWNvbm5lY3Rpb24gbGluayBjYWNoZSwKKyAgd2hpY2ggd2FzIG1lYW50IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIGJ1dCBub3cgcmVkdWNlcyBpdCAoZmQubyAjMzQzOTMsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgU29tZSBjbWFrZSBmaXhlcyAoUmFsZiBIYWJhY2tlcikKKwor4oCiIFJlbW92ZSBkZWFkIGNvZGUsIG1haW5seSBmcm9tIERCdXNTdHJpbmcgKGZkLm8gIzM4NTcwLCBmZC5vICMzOTYxMDsKKyAgU2ltb24gTWNWaXR0aWUsIExlbm5hcnQgUG9ldHRlcmluZykKKwor4oCiIFN0b3Agc3RvcmluZyB0d28gZXh0cmEgYnl0ZSBvcmRlciBpbmRpY2F0b3JzIGluIGVhY2ggRC1CdXMgbWVzc2FnZQorICAoZmQubyAjMzgyODcsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIGFuIG9wdGlvbmFsIFN0YXRzIGludGVyZmFjZSB3aGljaCBjYW4gYmUgdXNlZCB0byBnZXQgc3RhdGlzdGljcyBmcm9tCisgIGEgcnVubmluZyBkYnVzLWRhZW1vbiBpZiBlbmFibGVkIGF0IGNvbmZpZ3VyZSB0aW1lIHdpdGggLS1lbmFibGUtc3RhdHMKKyAgKGZkLm8gIzM0MDQwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCB2YXJpb3VzIHR5cG9zIChmZC5vICMyNzIyNywgZmQubyAjMzgyODQ7IFNhc2NoYSBTaWxiZSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEb2N1bWVudGF0aW9uIChmZC5vICMzNjE1NiwgU2ltb24gTWNWaXR0aWUpOgorICDCtyBsZXQgeHNsdHByb2MgYmUgb3ZlcnJpZGRlbiBhcyB1c3VhbDogLi9jb25maWd1cmUgWFNMVFBST0M9bXl4c2x0cHJvYworICDCtyBpbnN0YWxsIG1vcmUgZG9jdW1lbnRhdGlvbiBhdXRvbWF0aWNhbGx5LCBpbmNsdWRpbmcgbWFuMmh0bWwgb3V0cHV0CisgIMK3IHB1dCBkYnVzLmRldmhlbHAgaW4gdGhlIHJpZ2h0IHBsYWNlIChpdCBtdXN0IGdvIGluICR7aHRtbGRpcn0pCisKK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBsb29rIGZvciBzeXN0ZW0gc2VydmljZXMgaW4gL2xpYi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIGluIGFkZGl0aW9uIHRvIGFsbAorICAgIHRoZSBvdGhlciB3ZWxsLWtub3duIGxvY2F0aW9uczsgbm90ZSB0aGF0IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAvbGliLAorICAgIGV2ZW4gb24gcGxhdGZvcm1zIHdoZXJlIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIHJvb3QgRlMgd291bGQgZ28gaW4gL2xpYjY0LAorICAgIC9saWIveDg2XzY0LWxpbnV4LWdudSBvciBzaW1pbGFyIChmZC5vICMzNTIyOSwgTGVubmFydCBQb2V0dGVyaW5nKQorICDCtyBvcHQtaW4gdG8gZmQgcGFzc2luZyBvbiBTb2xhcmlzIChmZC5vICMzMzQ2NSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljIChSYWxmIEhhYmFja2VyKToKKyAgwrcgZml4IHVzZSBvZiBhIG11dGV4IGZvciBhdXRvbGF1bmNoIHNlcnZlciBkZXRlY3Rpb24KKyAgwrcgZG9uJ3QgY3Jhc2ggb24gbWFsbG9jIGZhaWx1cmUgaW4gX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZAorCitELUJ1cyAxLjUuNCAoMjAxMS0wNi0xMCkKKz09CisKK1NlY3VyaXR5IChsb2NhbCBkZW5pYWwgb2Ygc2VydmljZSk6CisKK+KAoiBCeXRlLXN3YXAgZm9yZWlnbi1lbmRpYW4gbWVzc2FnZXMgY29ycmVjdGx5LCBwcmV2ZW50aW5nIGEgbG9uZy1zdGFuZGluZworICBsb2NhbCBEb1MgaWYgZm9yZWlnbi1lbmRpYW4gbWVzc2FnZXMgYXJlIHJlbGF5ZWQgdGhyb3VnaCB0aGUgZGJ1cy1kYWVtb24KKyAgKGJhY2twb3J0ZXJzOiB0aGlzIGlzIGdpdCBjb21taXQgYzMyMjNiYTZjNDAxYmE4MWRmMTMwNTg1MTMxMmE0N2M0ODVlNmNkNykKKyAgKENWRS0yMDExLTIyMDAsIGZkLm8gIzM4MTIwLCBEZWJpYW4gIzYyOTkzODsgU2ltb24gTWNWaXR0aWUpCisKK05ldyB0aGluZ3M6CisKK+KAoiBUaGUgY29uc3RhbnQgdG8gdXNlIGZvciBhbiBpbmZpbml0ZSB0aW1lb3V0IG5vdyBoYXMgYSBuYW1lLAorICBEQlVTX1RJTUVPVVRfSU5GSU5JVEUuIEl0IGlzIG51bWVyaWNhbGx5IGVxdWl2YWxlbnQgdG8gMHg3ZmZmZmZmZiAoSU5UMzJfTUFYKQorICB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsaWJkYnVzLgorCivigKIgSWYgR0xpYiBhbmQgREJ1cy1HTGliIGFyZSBhbHJlYWR5IGluc3RhbGxlZCwgbW9yZSB0ZXN0cyB3aWxsIGJlIGJ1aWx0LAorICBwcm92aWRpbmcgYmV0dGVyIGNvdmVyYWdlLiBUaGUgbmV3IHRlc3RzIGNhbiBhbHNvIGJlIGluc3RhbGxlZCB2aWEKKyAgICAgIC4vY29uZmlndXJlIC0tZW5hYmxlLWluc3RhbGxlZC10ZXN0cworICBmb3Igc3lzdGVtIGludGVncmF0aW9uIHRlc3RpbmcsIGlmIHJlcXVpcmVkLiAoZmQubyAjMzQ1NzAsIFNpbW9uIE1jVml0dGllKQorCitDaGFuZ2VzOgorCivigKIgQ29uc2lzdGVudGx5IHVzZSBhdG9taWMgb3BlcmF0aW9ucyBmb3IgdGhlIERCdXNDb25uZWN0aW9uJ3MgcmVmY291bnQsCisgIGZpeGluZyBwb3RlbnRpYWwgdGhyZWFkaW5nIHByb2JsZW1zIChmZC5vICMzODAwNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEb24ndCB1c2UgLVdsLC0tZ2Mtc2VjdGlvbnMgYnkgZGVmYXVsdDogaW4gcHJhY3RpY2UgdGhlIHNpemUgZGVjcmVhc2UgaXMKKyAgc21hbGwgKDMwMEtpQiBvbiB4ODYtNjQpIGFuZCBpdCBmcmVxdWVudGx5IGRvZXNuJ3Qgd29yayBpbiB1bnVzdWFsCisgIHRvb2xjaGFpbnMuIFRvIG9wdGltaXplIGZvciBtaW5pbXVtIGluc3RhbGxlZCBzaXplLCB5b3Ugc2hvdWxkIGJlbmNobWFyaworICB2YXJpb3VzIHBvc3NpYmlsaXRpZXMgZm9yIENGTEFHUyBhbmQgTERGTEFHUywgYW5kIHNldCB0aGUgYmVzdCBmbGFncyBmb3IKKyAgeW91ciBwYXJ0aWN1bGFyIHRvb2xjaGFpbiBhdCBjb25maWd1cmUgdGltZS4gKGZkLm8gIzMzNDY2LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVzZSAjIS9iaW4vc2ggZm9yIHJ1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaCwgbWFraW5nIGl0IHdvcmsgb24gKkJTRAorICAoZmQubyAjMzU4ODAsIFRpbW90aHkgUmVkYWVsbGkpCisKK+KAoiBVc2UgbG4gLWZzIHRvIHNldCB1cCBkYnVzIGZvciBzeXN0ZW1kLCB3aGljaCBzaG91bGQgZml4IHJlaW5zdGFsbGF0aW9uCisgIHdoZW4gbm90IHVzaW5nIGEgREVTVERJUiAoZmQubyAjMzc4NzAsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2luZG93cy1zcGVjaWZpYyBjaGFuZ2VzOgorICDCtyBkb24ndCB0cnkgdG8gYnVpbGQgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciAoZmQubyAjMzc4MzgsIE1hcmsgQnJhbmQpCisKK0QtQnVzIDEuNS4yICgyMDExLTA2LTAxKQorPT0KKworVGhlICJCb2FyIEh1bnRlciIgcmVsZWFzZS4KKworTm90ZXMgZm9yIGRpc3RyaWJ1dG9yczoKKworICBUaGlzIHZlcnNpb24gb2YgRC1CdXMgbm8gbG9uZ2VyIHVzZXMgLWZQSUUgYnkgZGVmYXVsdC4gRGlzdHJpYnV0aW9ucyB3aXNoaW5nCisgIHRvIGhhcmRlbiB0aGUgZGJ1cy1kYWVtb24gYW5kIGRidXMtbGF1bmNoLWhlbHBlciBjYW4gcmUtZW5hYmxlIHRoaXMgaWYgdGhlaXIKKyAgdG9vbGNoYWluIHN1cHBvcnRzIGl0IHJlbGlhYmx5LCB2aWEgc29tZXRoaW5nIGxpa2U6CisKKyAgICAuL2NvbmZpZ3VyZSBDRkxBR1M9LWZQSUUgTERGTEFHUz0iLXBpZSAtV2wsLXoscmVscm8iCisKKyAgb3IgYnkgdXNpbmcgZGlzdHJpYnV0aW9uLXNwZWNpZmljIHdyYXBwZXJzIHN1Y2ggYXMgRGViaWFuJ3MgaGFyZGVuaW5nLXdyYXBwZXIuCisKK0NoYW5nZXM6CisKKyAg4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdjAuMTcKKyAgICDCtyBSZXNlcnZlIHRoZSBleHRyYSBjaGFyYWN0ZXJzIHVzZWQgaW4gc2lnbmF0dXJlcyBieSBHVmFyaWFudAorICAgICAgKGZkLm8gIzM0NTI5LCBTaW1vbiBNY1ZpdHRpZSkKKyAgICDCtyBEZWZpbmUgdGhlIE9iamVjdE1hbmFnZXIgaW50ZXJmYWNlIChmZC5vICMzNDg2OSwgRGF2aWQgWmV1dGhlbikKKyAg4oCiIERvbid0IGZvcmNlIC1mUElFOiBkaXN0cmlidXRpb25zIGFuZCBsaWJ0b29sIGtub3cgYmV0dGVyIHRoYW4gd2UgZG8gd2hldGhlcgorICAgIGl0J3MgZGVzaXJhYmxlIChmZC5vICMxNjYyMSwgZmQubyAjMjcyMTU7IFNpbW9uIE1jVml0dGllKQorICDigKIgQWxsb3cgLS1kaXNhYmxlLWdjLXNlY3Rpb25zLCBpbiBjYXNlIHlvdXIgdG9vbGNoYWluIG9mZmVycyB0aGUKKyAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zLCAtZmRhdGEtc2VjdGlvbnMgYW5kIC1XbCwtLWdjLXNlY3Rpb25zIG9wdGlvbnMKKyAgICBidXQgdGhleSdyZSBicm9rZW4sIGFzIHNlZW4gb24gU29sYXJpcyAoZmQubyAjMzM0NjYsIFNpbW9uIE1jVml0dGllKQorICDigKIgSW5zdGFsbCBkYnVzLWRhZW1vbiBhbmQgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBpbiBhIG1vcmUgbm9ybWFsIHdheQorICAgIChmZC5vICMxNDUxMjsgU2ltb24gTWNWaXR0aWUsIGxvb3NlbHkgYmFzZWQgb24gYSBwYXRjaCBmcm9tIEx1Y2EgQmFyYmF0bykKKyAg4oCiIEVuc3VyZSB0aGF0IG1haW50YWluZXJzIHVwbG9hZCBkb2N1bWVudGF0aW9uIHdpdGggdGhlIHJpZ2h0IHBlcm1pc3Npb25zCisgICAgKGZkLm8gIzM2MTMwLCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIERvbid0IGZvcmNlIHVzZXJzIG9mIGxpYmRidXMgdG8gYmUgbGlua2VkIGFnYWluc3QgLWxwdGhyZWFkLCAtbHJ0CisgICAgKGZkLm8gIzMyODI3LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIExvZyBzeXN0ZW0tYnVzIGFjdGl2YXRpb24gaW5mb3JtYXRpb24gdG8gc3lzbG9nIChmZC5vICMzNTcwNSwKKyAgICBDb2xpbiBXYWx0ZXJzKQorICDigKIgTG9nIG1lc3NhZ2VzIGRyb3BwZWQgZHVlIHRvIHF1b3RhcyB0byBzeXNsb2cgKGZkLm8gIzM1MzU4LAorICAgIFNpbW9uIE1jVml0dGllKQorICDigKIgTWFrZSB0aGUgbm9uY2UtdGNwIHRyYW5zcG9ydCB3b3JrIG9uIFVuaXggKGZkLm8gIzM0NTY5LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIE9uIFVuaXgsIGlmIC92YXIvbGliL2RidXMvbWFjaGluZS1pZCBjYW5ub3QgYmUgcmVhZCwgdHJ5IC9ldGMvbWFjaGluZS1pZAorICAgIChmZC5vICMzNTIyOCwgTGVubmFydCBQb2V0dGVyaW5nKQorICDigKIgSW4gdGhlIHJlZ3Jlc3Npb24gdGVzdHMsIGRvbid0IHJlcG9ydCBmZHMgYXMgImxlYWtlZCIgaWYgdGhleSB3ZXJlIG9wZW4KKyAgICBvbiBzdGFydHVwIChmZC5vICMzNTE3MywgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBNYWtlIGRidXMtbW9uaXRvciBiYWlsIG91dCBpZiBhc2tlZCB0byBtb25pdG9yIG1vcmUgdGhhbiBvbmUgYnVzLAorICAgIHJhdGhlciB0aGFuIHNpbGVudGx5IHVzaW5nIHRoZSBsYXN0IG9uZSAoZmQubyAjMjY1NDgsIFdpbGwgVGhvbXBzb24pCisgIOKAoiBDbGFyaWZ5IGRvY3VtZW50YXRpb24gKGZkLm8gIzM1MTgyLCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIENsZWFuIHVwIG1pbm9yIGRlYWQgY29kZSBhbmQgc29tZSBpbmNvcnJlY3QgZXJyb3IgaGFuZGxpbmcKKyAgICAoZmQubyAjMzMxMjgsIGZkLm8gIzI5ODgxOyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIENoZWNrIHRoYXQgY29tcGlsZXIgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGJlZm9yZSB1c2luZyB0aGVtIChmZC5vICMxOTY4MSwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIFdpbmRvd3M6CisgICAg4oCiIFJlbW92ZSBvYnNvbGV0ZSB3b3JrYXJvdW5kIGZvciB3aW5pb2N0bC5oIChmZC5vICMzNTA4MywgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS41LjAgKDIwMTEtMDQtMTEpCis9PQorCitUaGUgInlvdSBuZXZlciBrbm93IHdoZW4geW91IG5lZWQgdG8gdG93IHNvbWV0aGluZyBmcm9tIHlvdXIgZ2lhbnQKK2ZseWluZyBzaGFyayIgcmVsZWFzZS4KKworICDigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2MC4xNgorICAgIMK3IEFkZCBzdXBwb3J0IGZvciBwYXRoX25hbWVzcGFjZSBhbmQgYXJnMG5hbWVzcGFjZSBpbiBtYXRjaCBydWxlcworICAgICAgKGZkLm8gIzI0MzE3LCAjMzQ4NzA7IFdpbGwgVGhvbXBzb24sIERhdmlkIFpldXRoZW4sIFNpbW9uIE1jVml0dGllKQorICAgIMK3IE1ha2UgYXJnTnBhdGggc3VwcG9ydCBvYmplY3QgcGF0aHMsIG5vdCBqdXN0IG9iamVjdC1wYXRoLWxpa2Ugc3RyaW5ncywKKyAgICAgIGFuZCBkb2N1bWVudCBpdCBiZXR0ZXIgKGZkLm8gIzMxODE4LCBXaWxsIFRob21wc29uKQorICDigKIgTGV0IHRoZSBidXMgZGFlbW9uIGltcGxlbWVudCBtb3JlIHRoYW4gb25lIGludGVyZmFjZSAoZmQubyAjMzM3NTcsCisgICAgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBPcHRpbWl6ZSBfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gdG8gcmVkdWNlIHdhc3RlIChmZC5vICMyMTI2MSwKKyAgICBSb2JlcnRvIEd1aWRvKQorICDigKIgUmVxdWlyZSB1c2VyIGludGVydmVudGlvbiB0byBjb21waWxlIHdpdGggbWlzc2luZyA2NC1iaXQgc3VwcG9ydAorICAgIChmZC5vICMzNTExNCwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBBZGQgZGJ1c190eXBlX2lzX3ZhbGlkIGFzIHB1YmxpYyBBUEkgKGZkLm8gIzIwNDk2LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIFJhaXNlIFVua25vd25PYmplY3QgaW5zdGVhZCBvZiBVbmtub3duTWV0aG9kIGZvciBjYWxscyB0byBtZXRob2RzIG9uCisgICAgcGF0aHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9iamVjdCB0cmVlLCBhbmQgVW5rbm93bkludGVyZmFjZSBmb3IgY2FsbHMKKyAgICB0byB1bmtub3duIGludGVyZmFjZXMgaW4gdGhlIGJ1cyBkYWVtb24gKGZkLm8gIzM0NTI3LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisKK0QtQnVzIDEuNC44ICgyMDExLTA0LTA4KQorPT0KKworVGhlICJJdCdzIGxpa2UgdGhlIGJlZ2lubmluZyBvZiBhIGxvYnN0ZXIiIHJlbGVhc2UuCisKKyAg4oCiIFJlbmFtZSBjb25maWd1cmUuaW4gdG8gY29uZmlndXJlLmFjLCBhbmQgdXBkYXRlIGl0IHRvIG1vZGVybiBjb252ZW50aW9ucworICAgIChmZC5vICMzMjI0NTsgSmF2aWVyIEphcmTDs24sIFNpbW9uIE1jVml0dGllKQorICDigKIgQ29ycmVjdGx5IGdpdmUgWERHX0RBVEFfSE9NRSBwcmlvcml0eSBvdmVyIFhER19EQVRBX0RJUlMgKGZkLm8gIzM0NDk2LAorICAgIEFuZGVycyBLYXNlb3JnKQorICDigKIgUHJldmVudCBYMTEgYXV0b2xhdW5jaGluZyBpZiAkRElTUExBWSBpcyB1bnNldCBvciBlbXB0eSwgYW5kIGFkZAorICAgIC0tZGlzYWJsZS14MTEtYXV0b2xhdW5jaCBjb25maWd1cmUgb3B0aW9uIHRvIHByZXZlbnQgaXQgYWx0b2dldGhlcgorICAgIGluIGVtYmVkZGVkIGVudmlyb25tZW50cyAoZmQubyAjMTk5OTcsIE5CIzIxOTk2NDsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBJbnN0YWxsIHRoZSBkb2N1bWVudGF0aW9uLCBhbmQgYW4gaW5kZXggZm9yIERldmhlbHAgKGZkLm8gIzEzNDk1LAorICAgIERlYmlhbiAjNDU0MTQyOyBTaW1vbiBNY1ZpdHRpZSwgTWF0dGhpYXMgQ2xhc2VuKQorICDigKIgSWYgY2hlY2tzIGFyZSBub3QgZGlzYWJsZWQsIGNoZWNrIHZhbGlkaXR5IG9mIHN0cmluZy1saWtlIHR5cGVzIGFuZAorICAgIGJvb2xlYW5zIHdoZW4gc2VuZGluZyB0aGVtIChmZC5vICMxNjMzOCwgTkIjMjIzMTUyOyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEFkZCBVbmtub3duT2JqZWN0LCBVbmtub3duSW50ZXJmYWNlLCBVbmtub3duUHJvcGVydHkgYW5kIFByb3BlcnR5UmVhZE9ubHkKKyAgICBlcnJvcnMgdG8gZGJ1cy1zaGFyZWQuaCAoZmQubyAjMzQ1MjcsIExlbm5hcnQgUG9ldHRlcmluZykKKyAg4oCiIEJyZWFrIHVwIGEgaHVnZSBjb25kaXRpb25hbCBpbiBjb25maWctcGFyc2VyIHNvIGdjb3YgY2FuIHByb2R1Y2UgY292ZXJhZ2UKKyAgICBkYXRhIChmZC5vICMxMDg4NywgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBMaXN0IHdoaWNoIHBhcnRzIG9mIHRoZSBEZXNrdG9wIEVudHJ5IHNwZWNpZmljYXRpb24gYXJlIGFwcGxpY2FibGUgdG8KKyAgICAuc2VydmljZSBmaWxlcyAoZmQubyAjMTkxNTksIFN2ZW4gSGVyemJlcmcpCisgIOKAoiBEb24ndCBzdXBwcmVzcyBzZXJ2aWNlIGFjdGl2YXRpb24gaWYgdHdvIHNlcnZpY2VzIGhhdmUgdGhlIHNhbWUgRXhlYz0KKyAgICAoZmQubyAjMzU3NTAsIENvbGluIFdhbHRlcnMpCisgIOKAoiBXaW5kb3dzOgorICAgIMK3IEF2b2lkIHRoZSBuYW1lIEVMRU1FTlRfVFlQRSBkdWUgdG8gbmFtZXNwYWNlLXBvbGx1dGlvbiBmcm9tIHdpbmlvY3RsLmgKKyAgICAgIChBbmRyZSBIZWluZWNrZSkKKyAgICDCtyBJbmNsdWRlIF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgaW4gbGliZGJ1cyBvbiBXaW5kb3dzLCBmaXhpbmcgY29tcGlsYXRpb24KKyAgICAgIChmZC5vICMzMjgwNSwgTWFyayBCcmFuZCkKKworRC1CdXMgMS40LjYgKDIwMTAtMDItMTcpCis9PQorCitUaGUgIjEsIDIsIG1pc3MgYSBmZXcsIDk5LCAxMDAiIHJlbGVhc2UuCisKKyAg4oCiIFJlbW92ZSB1bmZpbmlzaGVkIGNoYW5nZXMgaW50ZW5kZWQgdG8gc3VwcG9ydCBHVGVzdC1iYXNlZCB0ZXN0cywKKyAgICB3aGljaCB3ZXJlIG1pc3Rha2VubHkgaW5jbHVkZWQgaW4gMS40LjQKKworRC1CdXMgMS40LjQgKDIwMTAtMDItMTcpCis9PQorCisgIOKAoiBTd2l0Y2ggYmFjayB0byB1c2luZyBldmVuIG1pY3JvIHZlcnNpb25zIGZvciBzdGFibGUgcmVsZWFzZXM7IDEuNC4xCisgICAgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgMS40LjIsIHNvIHNraXAgdGhhdCB2ZXJzaW9uIG51bWJlcgorICDigKIgRG9uJ3QgbGVhdmUgYmFkIGZpbGUgZGVzY3JpcHRvcnMgYmVpbmcgd2F0Y2hlZCB3aGVuIHNwYXduaW5nIHByb2Nlc3NlcywKKyAgICB3aGljaCBjb3VsZCByZXN1bHQgaW4gYSBidXN5LWxvb3AgKGZkLm8gIzMyOTkyLCBOQiMyMDAyNDg7IHBvc3NpYmx5CisgICAgYWxzbyBMUCM2NTYxMzQsIExQIzY4MDQ0NCwgTFAjNzEzMTU3KQorICDigKIgQ2hlY2sgZm9yIE1TR19OT1NJR05BTCBjb3JyZWN0bHkKKyAg4oCiIEZpeCBmYWlsdXJlIHRvIGRldGVjdCBhYnN0cmFjdCBzb2NrZXQgc3VwcG9ydCAoZmQubyAjMjk4OTUpCisgIOKAoiBNYWtlIF9kYnVzX3N5c3RlbV9sb2d2IGFjdHVhbGx5IGV4aXQgd2l0aCBEQlVTX1NZU1RFTV9MT0dfRkFUQUwKKyAgICAoZmQubyAjMzIyNjIsIE5CIzE4MDQ4NikKKyAg4oCiIEltcHJvdmUgc29tZSBlcnJvciBjb2RlIHBhdGhzIChmZC5vICMyOTk4MSwgZmQubyAjMzIyNjQsIGZkLm8gIzMyMjYyLAorICAgIGZkLm8gIzMzMTI4LCBmZC5vICMzMzI3NywgZmQubyAjMzMxMjYsIE5CIzE4MDQ4NikKKyAg4oCiIEF2b2lkIHBvc3NpYmxlIHN5bWxpbmsgYXR0YWNrcyBpbiAvdG1wIGR1cmluZyBjb21waWxhdGlvbiAoZmQubyAjMzI4NTQpCisgIOKAoiBUaWR5IHVwIGRlYWQgY29kZSAoZmQubyAjMjUzMDYsIGZkLm8gIzMzMTI4LCBmZC5vICMzNDI5MiwgTkIjMTgwNDg2KQorICDigKIgSW1wcm92ZSBnY2MgbWFsbG9jIGFubm90YXRpb25zIChmZC5vICMzMjcxMCkKKyAg4oCiIElmIHRoZSBzeXN0ZW0gYnVzIGlzIGxhdW5jaGVkIHZpYSBzeXN0ZW1kLCBwcm90ZWN0IGl0IGZyb20gdGhlIE9PTSBraWxsZXIKKyAg4oCiIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChmZC5vICMxMTE5MCkKKyAg4oCiIEF2b2lkIHJlYWRkaXJfciwgd2hpY2ggaXMgZGlmZmljdWx0IHRvIHVzZSBjb3JyZWN0bHkgKGZkLm8gIzgyODQsCisgICAgZmQubyAjMTU5MjIsIExQIzI0MTYxOSkKKyAg4oCiIENvcGUgd2l0aCBpbnZhbGlkIGZpbGVzIGluIHNlc3Npb24uZCwgc3lzdGVtLmQgKGZkLm8gIzE5MTg2LAorICAgIERlYmlhbiAjMjMwMjMxKQorICDigKIgRG9uJ3QgZGlzdHJpYnV0ZSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBlbWJlZCBvdXIgYnVpbGRkaXIgKGZkLm8gIzMwMjg1LAorICAgIGZkLm8gIzM0MjkyKQorICDigKIgUmFpc2UgdGhlIHN5c3RlbSBidXMncyBmZCBsaW1pdCB0byBiZSBzdWZmaWNpZW50IGZvciBpdHMgY29uZmlndXJhdGlvbgorICAgIChmZC5vICMzMzQ3NCwgTFAjMzgxMDYzKQorICDigKIgRml4IHN5c2xvZyBzdHJpbmcgcHJvY2Vzc2luZworICDigKIgSWdub3JlIC1XYWRkcmVzcworICDigKIgUmVtb3ZlIGJyb2tlbiBnY292IHBhcnNpbmcgY29kZSBhbmQgLS1lbmFibGUtZ2NvdiwgYW5kIHJlcGxhY2UgdGhlbQorICAgIHdpdGggbGNvdiBIVE1MIHJlcG9ydHMgYW5kIC0tZW5hYmxlLWNvbXBpbGVyLWNvdmVyYWdlIChmZC5vICMxMDg4NykKKyAg4oCiIFdpbmRvd3M6CisgICAgwrcgYXZvaWQgbGl2ZS1sb2NrIGluIFdpbmRvd3MgQ0UgZHVlIHRvIHVuZmFpciBjb25kaXRpb24gdmFyaWFibGVzCisgIOKAoiBPcGVuQlNEOgorICAgIMK3IHN1cHBvcnQgY3JlZGVudGlhbHMtcGFzc2luZyAoZmQubyAjMzI1NDIpCisgIOKAoiBTb2xhcmlzOgorICAgIMK3IG9wdC1pbiB0byB0aHJlYWQgc2FmZXR5IChmZC5vICMzMzQ2NCkKKworRC1CdXMgMS40LjEgKDIwIERlY2VtYmVyIDIwMTApCis9PQorCisg4oCiIEZpeCBmb3IgQ1ZFLTIwMTAtNDM1Mjogc2VuZGluZyBtZXNzYWdlcyB3aXRoIGV4Y2Vzc2l2ZWx5LW5lc3RlZCB2YXJpYW50cyBjYW4KKyAgIGNyYXNoIHRoZSBidXMuIFRoZSBleGlzdGluZyByZXN0cmljdGlvbiB0byA2NC1sZXZlbHMgb2YgbmVzdGluZyBwcmV2aW91c2x5CisgICBvbmx5IGFwcGxpZWQgdG8gdGhlIHN0YXRpYyB0eXBlIHNpZ25hdHVyZTsgbm93IGl0IGFsc28gYXBwbGllcyB0byBkeW5hbWljCisgICBuZXN0aW5nIHVzaW5nIHZhcmlhbnRzLiBUaGFua3MgdG8gUsOpbWkgRGVuaXMtQ291cm1vbnQgZm9yIGRpc2NvdmluZyB0aGlzCisgICBpc3N1ZS4KKyDigKIgT1MgWCBwb3J0YWJpbGl0eSBmaXhlcywgaW5jbHVkaW5nIGxhdW5jaGQgc3VwcG9ydC4KKyDigKIgV2luZG93cyBhdXRvbGF1bmNoIGltcHJvdmVtZW50cy4KKyDigKIgVmFyaW91cyBidWcgZml4ZXMuCisKK0QtQnVzIDEuNC4wICg2IFNlcCAyMDEwKQorPT0KKyAtIHN5c3RlbWQgaG9va3VwCisKK0QtQnVzIDEuMy4xICgyMyBKdW5lIDIwMTApCis9PQorIC0gTmV3IHN0YW5kYXJkaXplZCBQcm9wZXJ0aWVzQ2hhbmdlZCBzaWduYWwgaW4gdGhlIHByb3BlcnRpZXMgaW50ZXJmYWNlCisgLSBWYXJpb3VzIHBvcnRhYmlsaXR5IGZpeGVzLCBpbiBwYXJ0aWN1bGFyIHRvIFdpbmRvd3MgcGxhdGZvcm1zCisgLSBTdXBwb3J0IGZvcmtpbmcgYnVzIHNlcnZpY2VzLCBmb3IgY29tcGF0aWJpbGl0eQorCitELUJ1cyAxLjMuMCAoMjkgSnVseSAyMDA5KQorPT0KKyAtIGFiaWxpdHkgZm9yIGRidXMtc2VuZCB0byBzZW5kIHRvIGFueSBidXMgKC0tYWRkcmVzcykKKyAtIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIG9uIFVuaXggc29ja2V0IHRyYW5zcG9ydHMKKyAtIHVzZSBvZiBHQ0MgYXRvbWljIGludHJpbnNpY3MgZm9yIGJldHRlciBwcm9jZXNzb3Igc3VwcG9ydAorICAgKHJlcXVpcmVzIC1tYXJjaD1pNDg2IG9yIGFib3ZlIGZvciB4ODYgY29tcGlsYXRpb24pCisgLSB0aHJlYWQtc2FmZSBGRF9DTE9FWEVDIHNldHRpbmcgb24gcmVjZW50IExpbnV4IGtlcm5lbHMgKDIuNi4yNC0yNyBhbmQgdXApCisgICBhbmQgZ2xpYmMgKDIuOSBmb3IgcGlwZTIgYW5kIDIuMTAgZm9yIGFjY2VwdDQpCisgLSBmZWF0dXJlIG5lZ290aWF0aW9uIGluIHRoZSBidXMgZGFlbW9uCmRpZmYgLS1naXQgYS9ORVdTLnByZS0xLTAgYi9ORVdTLnByZS0xLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNWJjNQotLS0gL2Rldi9udWxsCisrKyBiL05FV1MucHJlLTEtMApAQCAtMCwwICsxLDYxNCBAQAorRC1CdXMgMS4wLjAgKDA4IE5vdmVtYmVyIDIwMDYpCis9PQorLSBEb2N1bWVudHMgdXBkYXRlZCB3aXRoIEFQSS9BQkkgZ2FydW50ZWVzIAorLSBBZGRlZCBtaXNzaW5nIHBhdGNoIEZyZWVCU0QgbmVlZCB0byBydW4gb3V0IG9mIHRoZSBib3gKKy0gZGJ1cy1tb25pdG9yIG5vdyBoYXMgYSBwcm9maWxlIG1vZGUKKy0gQVVUSE9SUyBmaWxlIHVwZGF0ZWQgd2l0aCBuYW1lcyBmcm9tIHRoZSBDaGFuZ2VMb2cKKyAgVGhhbmtzIHRvIGV2ZXJ5b25lIHdobyBoZWxwZWQgZ2V0IHVzIGhlcmUKKworRC1CdXMgMS4wIFJDIDMgKDAuOTUpICgwMiBOb3ZlbWJlciAyMDA2KQorPT0KKy0gREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0Ugbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGRlZmluZWQgd2hlbiBidWlsZGluZyBhcHBzCistIC4vY29uZmlndXJlIGNoZWNrcyBub3cgd29yayB3aGVuIGNyb3NzIGNvbXBpbGluZworLSBkYnVzLXV1aWRnZW4gLS1lbnN1cmUgaXMgbm93IHJ1biBpbiB0aGUgaW5pdCBzY3JpcHQgc28gdGhlcmUgaXMgbm8gbmVlZCB0bworICBydW4gaXQgaW4gYSBwb3N0IHNjcmlwdAorLSBkYnVzLXV1aWRnZW4gbm93IHdyaXRlcyBvdXQgdG8gL3Zhci9saWIvZGJ1cyB0byB3b3JrIHdpdGggc3lzdGVtcyB0aGF0IGRvIG5vdAorICBoYXZlIGEgd3JpdGFibGUgL2V0Yy4gUGFja2FnZXMgc2hvdWxkIGluc3RhbGwgYW5kIG93biB0aGUgL3Zhci9saWIvZGJ1cyAKKyAgZGlyZWN0b3J5CistIHJlY3Vyc2l2ZSBsb2NrcyBhcmUgbm93IHVzZWQgd2hlbiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0IGlzIGNhbGxlZAorLSBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIHRhZyBhZGRlZCB0byB0aGUgc2Vzc2lvbi5jb25mCisgIHVuZGVyIGEgbm9ybWFsIGJ1aWxkIHRoaXMgc3BlY2lmaWVzIHRoZXNlIHNlcnZpY2UgZGlyZWN0b3JpZXM6CisgICAgL3Vzci9sb2NhbC9zaGFyZS9kYnVzLTEvc2VydmljZXMKKyAgICAvdXNyL3NoYXJlL2RidXMtMS9zZXJ2aWNlcworICAgICRIT01FLy5sb2NhbC9zaGFyZS9kYnVzLTEvc2VydmljZXMKKy0gZml4ZWQgY3Jhc2ggd2hlbiBhIHNlcnZpY2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZQorLSBmaXhlZCBhIGNyYXNoIGluICpCU0Qgd2hlbiB3YXRjaGluZyBjb25maWcgZGlyZWN0b3JpZXMgZm9yIGNoYW5nZXMKKy0gZml4ZWQgSXJpeCBidWlsZCBieSB1c2luZyBkaXJwLT5fX2RkX2ZkIHRvIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yCistIGNsZWFuZWQgdXAgdGhlIExPQ0FMX0NSRURTIHZzIENNR0NSRUQgY3JlZGVudGlhbCBjb2RlIHNvICpCU0QncyBkb24ndCAKKyAgY3Jhc2ggaGVyZSBhbnltb3JlCistIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4gZGVwcmVjYXRlZAorLSBjbGVhbnVwLW1hbi1wYWdlcy5zaCBhZGRlZCBzbyBwYWNrYWdlcnMgY2FuIGNsZWFuIHVwIERveHlnZW4gbWFuIHBhZ2Ugb3V0cHV0CisgIGZyb20gNyB0byAyIG1lZ3MKKy0gbGFyZ2UgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKKy0gbnVtZXJvdXMgYnVnIGZpeGVzCisKK0QtQnVzIDEuMCBSQyAyICgwLjk0KSAoMTQgT2N0b2JlciAyMDA2KQorPT0KKy0gZGJ1cy11dWlkZ2VuIGJpbmFyeSBhZGRlZCBmb3IgZnV0dXJlIHJlbW90ZSBtYWNoaW5lIGlkZW50aWZpY2F0aW9uCisgIHBhY2thZ2VycyBzaG91bGQgY2FsbCBkYnVzLXV1aWRnZW4gLS1lbnN1cmUgaW4gdGhlaXIgcG9zdAorLSBHZXRNYWNoaW5lSWQgcGVlciBtZXRob2QgYWRkZWQgdG8gdGhlIGJ1cyBBUEkKKy0gZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzIEFQSSBhZGRlZCB0byBsZXQgdGhlIGJ1cyBzZW5kCisgIHBlZXIgbWVzc2FnZXMgZGlyZWN0bHkgdG8gYW4gYXBwCistIEF1dG9sYXVuY2ggYWJpbGl0aWVzIGFkZGVkIHRvIGRidXMtbGF1bmNoIHdpdGggdGhlIC0tYXV0b2xhdW5jaCBmbGFnCisgIFRoaXMgZmVhdHVyZSBhbGxvd3MgbGliZGJ1cyB0byBzdGFydCBhIHNlc3Npb24gYnVzIGlmIG5vbmUgY2FuIGJlIGZvdW5kCisgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZmVhdHVyZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHNjcmlwdHMKKyAgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIHN0aWxsIHRoZSBjb3JyZWN0IHdheSB0byBzcGVjaWZ5IGEgc2Vzc2lvbiBidXMKKy0gZGJ1cy1sYXVuY2ggbm93IHByaW50cyBvdXQgYSBzaW1wbGUga2V5IHZhbHVlIHBhaXJzIGluc3RlYWQgb2Ygc2hlbGwgc2NyaXB0cworICBpZiBvbmUgb2YgdGhlIHNoZWxsIGZsYWdzIGFyZW4ndCB1c2VkCistIHN1cHBvcnQgREJVU19CTE9DS19PTl9BQk9SVCBlbnYgdmFyaWFibGUgdG8gY2F1c2UgYmxvY2tpbmcgd2FpdGluZyBmb3IgZ2RiCistIHdlYWsgcmVmIGFyZSBub3cgaGVsZCBmb3Igc2hhcmVkIGNvbm5lY3Rpb25zIHNvIHRoZSByaWdodCB0aGluZ3MgaGFwcGVuCisgIHRoaXMgZml4ZXMgc29tZSBwcmV0dHkgbWFqb3IgYnVncyB3aXRoIHRoZSB3YXkgY29ubmVjdGlvbnMgd2VyZSBoYW5kbGVkCistIFNvbWUgcmVmYWN0b3JpbmcgZm9yIFdpbmRvd3MgKGRvZXNuJ3QgZWZmZWN0IFVuaXgpCistIFNvbGFyaXMgYnVpbGQgZml4ZXMKKy0gTWFjT1NYIGJ1aWxkIGZpeGVzCistIENyb3NzIGNvbXBpbGUgYnVpbGQgZml4ZXMuICBXZSBub3cgYXNzdW1lIGdldHB3bmFtX3IgaXMgcG9zaXggYW5kIHZhX2xpc3RzCisgIGNhbiBiZSBjb3BpZWQgYnkgdmFsdWUgc2luY2Ugd2UgY2FuJ3QgY2hlY2sgdGhpcyBpbiBhIGNyb3NzIGNvbXBpbGUuICBJZgorICB0aGlzIGlzIG5vdCB0cnVlIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0IGlzIHVwIHRvIHRoZSBkZXZlbG9wZXIgdG8gcGF0Y2guCistIEJ1ZyBmaXhpbmcgYWxsIGFyb3VuZAorCitELUJ1cyAxLjAgUkMgMSAoMC45MykgKDE0IFNlcHRlbWJlciAyMDA2KQorPT0KKy0gZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCBhZGRlZCBmb3IgaW5pdGFsaXppbmcgdGhyZWFkcyB3aXRob3V0IHRoZSBuZWVkIGZvcgorICBiaW5kaW5ncworLSBGaWx0ZXJzIGFyZSBub3cgcHJvcGVybHkgcmVtb3ZlZAorLSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiBub3cgaG9sZHMgYSBoYXJkIHJlZiB0byBzaGFyZWQgY29ubmVjdGlvbnMKKy0gV2Ugbm93IHByaW50IG91dCBhIHdhcm5pbmcgYW5kIGRvIG5vdGhpbmcgd2hlbiBzb21lb25lIHRyaWVzIHRvIGNsb3NlIGEgCisgIHNoYXJlZCBjb25uZWN0aW9uCistIFRoZSAtLWludHJvc3BlY3Qgc3dpdGNoIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBidXMgZm9yIHByaW50aW5nIG91dCAKKyAgaW50cm9zcGVjdGlvbiBkYXRhIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyB0aGUgYnVzCistIExPQ0FMX0NSRURTIHNvY2tldCBjcmVkZW50aWFscyBhcmUgbm93IHN1cHBvcnRlZCBmb3Igc3lzdGVtcyB3aGljaCAKKyAgc3VwcG9ydCBpdCBzdWNoIGFzIE5ldEJTRAorLSBHZW5lcmFsaXplIGtxdWV1ZSBzdXBwb3J0IHNvIGl0IHdvcmtzIHdpdGggTmV0QlNEIGFzIHdlbGwgYXMgRnJlZUJTRAorLSBOdW1lcm91cyBidWcgZml4ZXMgYW5kIG1lbW9yeSBsZWFrcyBwYXRjaGVkCisKK0QtQnVzIDAuOTIgKDE4IEF1Z3VzdCAyMDA2KQorPT0KKy0gUHJvcGVyIHRocmVhZCBsb2NraW5nIGFkZGVkIHRvIHBlbmRpbmcgY2FsbHMKKy0gVGhyZWFkaW5nIHNlbWFudGljcyBjaGFuZ2VkIGZyb20gaW5pdCBlYXJseSB0byBpbml0IGJlZm9yZSB0aGUgc2Vjb25kIHRocmVhZAorICBpcyBzdGFydGVkCistIENvcnJlY3RseSBlcnJvciBvdXQgd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBhY3F1aXJlIG9yIHJlbGVhc2UgdGhlCisgIG9yZy5mcmVlZGVza3RvcC5EQnVzIG5hbWUgaW5zdGVhZCBvZiBzZW5kaW5nIGZhbHNlIHJlc3VsdCBjb2RlcworLSBrcXVldWUgZGlyZWN0b3J5IHdhdGNoaW5nIGNvZGUgY2FuIG5vdyBiZSB1c2VkIHRvIG1vbml0b3IgY29uZmlnIGZpbGUgY2hhbmdlcworICBvbiBGcmVlQlNECistIC0td2l0aC1kYnVzLWRhZW1vbmRpciBjb25maWd1cmUgc3dpdGNoIGFkZGVkIHNvIHRoZSBkYWVtb24gY2FuIGJlIGluc3RhbGxlZAorICBzZXBhcmF0ZSBmcm9tIHRoZSB1c2VyIGJpbmFyaWVzCistIE1ha2VmaWxlcyBmaXhlZCBmb3IgY3lnd2luIAorLSBWYXJpb3VzIGZpeGVzIGZvciB0aGUgb25nb2luZyBXaW5kb3dzIHBvcnQgCistIEZpeGVkIGRvY3MgYW5kIGNvbW1lbnRzIHRvIHVzZSB0aGUgRC1CdXMgc3BlbGxpbmcgaW5zdGVhZCBvZiBELUJVUworLSBNYW55IG1lbWxlYWtzIGFuZCBidWdzIGZpeGVkCisKK0QtQnVzIDAuOTEgKDI0IEp1bHkgMjAwNikKKz09CistIFJlbW92ZSBzb21lIGxpbmdlcmluZyBiaXRzIGxlZnQgb3ZlciBmcm9tIHRoZSBiaW5kaW5ncyBzcGxpdAorLSBGaXggYXNzZXJ0aW9uIGNhdXNpbmcgRC1CdXMgYXBwbGljYXRpb25zIHRvIGNyYXNoIHdoZW4gY2hlY2tzIGFyZSBlbmFibGVkCistIEZpeCBhIHRpbWVvdXQgYnVnIHdoaWNoIHdvdWxkIGJsb2NrIGFwcGxpY2F0aW9ucyBmcm9tIGJlaW5nIGF1dG8gc3RhcnRlZAorCitELUJ1cyAwLjkwICgxNyBKdWx5IDIwMDYpCis9PQorLSBBUEkvQUJJIGZyZWV6ZSBmb3IgMS4wCistIEJpbmRpbmdzIGFyZSBub3cgc3BsaXQgb3V0IGludG8gc2VwZXJhdGUgcGFja2FnZXMKKy0gTGlzdEFjdGl2YXRhYmxlTmFtZXMgYWRkZWQgYXMgYSBtZXRob2Qgb24gdGhlIGJ1cworLSBSZW1vdmVkIGRlcHJlY2F0ZWQgZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QgKHVzZSBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UpCistIFNoYXJlZCBjb25uZWN0aW9ucyBhcmUgbm93IHVucmVmZmVkIG9uIGRpc2Nvbm5lY3QKKy0gRml4ZWQgcGVuZGluZyBjYWxscyBmb3IgdGhyZWFkZWQgZW52aW9ybm1lbnRzCistIFBlbmRpbmcgY2FsbHMgZ2V0IHRpbWVkIG91dCBvbiBjb25uZWN0aW9uIGRpc2Nvbm5lY3QKKy0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSByZXR1cm5zIFRSVUUgYW5kIGEgTlVMTCBwZW5kaW5nIGNhbGwKKyAgaWYgeW91IGNhbGwgaXQgb24gYSBjb25uZWN0aW9uIG9iamVjdCB3aGljaCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgYWxyZWFkeQorICAoaXQgcmV0dXJucyBGQUxTRSBvbiBPdXQgb2YgTWVtb3J5IGVycm9ycyBvbmx5KQorLSBkYnVzLW1vbml0b3Igbm93IGNvcnJlY3RseSBjYXRjaGVzIG1ldGhvZHMsIG5vdCBqdXN0IHNpZ25hbHMKKy0gZGJ1cy1tb25pdG9yIG5vdyBwcmludHMgb2JqZWN0IHBhdGhzIAorCitELUJVUyAwLjYyICgxMiBKdW5lIDIwMDYpCis9PQorLSBEb2MgZml4ZXMKKy0gQWRkZWQgc3VwcG9ydCBmb3IgYWxsIGRhdGEtdHlwZXMgZm9yIHRoZSBkYnVzIHRvb2xzCistIEZpeGVkIGVhdmVzZHJvcHBpbmcgb24gbWV0aG9kIGNhbGxzIChkYnVzLW1vbml0b3IpCistIEZpeGVkIHNpbGVudCBkcm9wcGluZyBvZiBtZXRob2QgY2FsbHMgd2l0aCBpbnRlcmZhY2U9TlVMTAorLSBGaXhlZCBjb25zb2xlIG93bmVyc2hpcCBwcm9ibGVtcyBpbiBTb2xhcmlzCistIEZpeGVkIGluc3RhbGxhdGlvbiBvZiBkYnVzLXNpZ25hdHVyZS5oIGFuZCAjaW5jbHVkZSBpdCBpbiBkYnVzL2RidXMuaAorLSBGbHVzaCB0aGUgdXNlciBkYXRhYmFzZSBjYWNoZSBvbiBjb25maWcgcmVsb2FkCistIEdMaWIgYmluZGluZ3M6CisgIC0gRml4IG1lbW9yeSBsZWFrcworICAtIEZpeCBwcm9wZXJ0aWVzIGluIERCdXNHUHJveHkgc28gdGhhdCB0aGV5IGNhbiBiZSBnaXZlbiBpbiBhbnkKKyAgICBvcmRlcgorICAtIEFkZGVkIGxvdHMgb2YgYXNzZXJ0aW9ucyB0byBlbnN1cmUgY29ycmVjdCB1c2UKKyAgLSBSZW1vdmUgZHVwbGljYXRlZCBjb2RlCisgIC0gRml4IHN0YXRpYyBzdHJpbmcgcG9pbnRlciB1c2VzIGluIEdQdHJBcnJheS1iYXNlZCBjb2xsZWN0aW9ucworLSBQeXRob24gYmluZGluZ3M6CisgIC0gUmVtb3ZlIHJlZmVyZW5jZSB0byBzeXMvY2RlZnMuaAorLSBRdDQgYmluZGluZ3M6CisgIC0gQ29kZSByZW9yZ2FuaXplZAorICAtIEFkZGVkIHRoZSBkYnVzaWRsMmNwcCwgZGJ1c2NwcDJ4bWwgYW5kIGRidXMgdG9vbHMKKyAgLSBBZGRlZCBleGFtcGxlIHByb2dyYW1zIChwaW5nLXBvbmcsIGNvbXBsZXggcGluZy1wb25nLCBsaXN0bmFtZXMsIGNoYXQpCisgIC0gVXBkYXRlZCBzZWxmdGVzdHMKKyAgLSBGaXhlZCBjb21waWxhdGlvbiBhbmQgLm1vYy0gYW5kIC51aS1maWxlIHByb2Nlc3NpbmcgYW5kIGNsZWFuaW5nCisgIC0gTWFkZSBjZW50cmFsIGNsYXNzZXMgZGVyaXZlIGZyb20gUU9iamVjdAorICAtIEVuaGFuY2UgZXJyb3IgcmVwb3J0aW5nCisgIC0gTWFueSBidWdmaXhlcworLSBNb25vIGJpbmRpbmdzOgorICAtIE1pbm9yIGJ1Z2ZpeGVzCisKK0QtQlVTIDAuNjEgKDI0IEZlYnVhcnkgMjAwNikKKz09CistIERvY3VtZW50YXRpb24gYWxsIGFyb3VuZAorLSBkYnVzLWxhdW5jaCBub3cgcHJvZHVjZXMgY29ycmVjdCBzaCBhbmQgY3NoIHN5bnRheAorLSBOZXN0ZWQgYXJyYXlzIG5vdyB3b3JrIGNvcnJlY3RseQorLSBHTGliIGJpbmRpbmdzOgorICAtIEluaGVyaXRpbmcgZnJvbSBEQnVzR1Byb3h5IGlzIG5vdyBwb3NzaWJsZQorICAtIEdQdHJBcnJheXMgY2FuIG5vdyBiZSBtYXJzaGFsbGVkCisgIC0gb3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DbGllbnRDU3ltYm9sIGFubm90YXRpb24gYWRkZWQKKyAgLSBPcGVubmluZyBjb25uZWN0aW9ucyB0byBhcmJpdHJhcnkgYWRkcmVzc2VzIG5vdyBzdXBwb3J0ZWQKKy0gUHl0aG9uIGJpbmRpbmdzOgorICAtIHNlbmRlcl9rZXl3b3JkIGFuZCBwYXRoX2tleXdvcmQga2V5d29yZHMgYWRkZWQgdG8gc2lnbmFsIGxpc3RlbmVyIEFQSQorICAtIEJ5dGUgdHlwZXMgbm93IGRlbWFyc2hhbCB0byB1bnNpZ25lZCBjaGFyCisgIC0gY2FsbGluZyBtZXRob2RzIG5vdyBkbyB0aGUgY29ycmVjdCB0aGluZworLSBRdCBiaW5kaW5nczoKKyAgLSBib3RoIFF0MyBhbmQgUXQ0IGJpbmRpbmdzIGNhbiBiZSBidWlsdCBhdCB0aGUgc2FtZSB0aW1lCisgIC0gVXNlIHRoZSBzdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5NZXRob2QuTm9SZXBseSBhbm5vdGF0aW9uIAorICAgIGZvciB0aGUgImFzeW5jIiBjYWxscyBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZSBmb3IgdXMuCistIE1vbm8gYmluZGluZ3M6CisgIC0gNjRiaXQgYXJjaCBmaXhlcworLSBNYXNzaXZlIGJ1ZyBmaXhpbmcgYWxsIGFyb3VuZAorCitELUJVUyAwLjYwICgzMCBOb3ZlbWJlciAyMDA1KQorPT0KKworLSBtYWpvciBBQkkvQVBJIGNoYW5nZXMgLSBzb25hbWVzIGNoYW5nZWQKKy0gUmVxdWVzdE5hbWUgcXVldWluZyBiZWhhdmlvciBoYXMgY2hhbmdlZCAocmVmZXIgdG8gZGJ1cy1zcGVjaWZpY2F0aW9uKQorICAtIERCVVNfTkFNRV9GTEFHX1BST0hJQklUX1JFUExBQ0VNRU5UIGhhcyBiZWVuIHJlbW92ZWQgYW5kCisgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGZsYWdzCistIHNpZ25hbHMgZW1pdHRlZCBieSB0aGUgYnVzIG5vdyBzaG93IHVwIGluIHRoZSBpbnRyb3NwZWN0IGRhdGEKKy0gYXV0aCBFWFRFUk5BTCBub3cgc3VwcG9ydGVkIG9uIEJTRCB2YXJpZW50cworLSBSZWxlYXNlTmFtZSBtZXRob2QgYWRkZWQgdG8gdGhlIGJ1cyB0byBhbGxvdyBhIHNlcnZpY2UKKyAgdG8gcmVtb3ZlIGl0c2VsZiBhcyBvd25lciBvZiBhIGJ1cyBuYW1lCistIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlIGFkZGVkIGZvciBnZXR0aW5nIG1lc3NhZ2VzIG9mZiB0aGUgYnVzIAorICBpbiB0aGUgYWJzZW5jZSBvZiBhIG1haW5sb29wCistIFF0NCBiaW5kaW5ncyBhZGRlZCBhbmQgdGhlIFF0MyBiaW5kaW5ncyBoYXZlIGJlZW4gZGVwcmljYXRlZAorLSBweXRob24gYmluZGluZ3M6CisgIC0gbWFyc2hhbCB1c2luZyBpbnRyb3NwZWN0IGRhdGEgaWYgYXZhaWxhYmxlCisgIC0gYmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgcHJvcGlnYXRpb24KKyAgLSBwcml2YXRlIGNvbm5lY3Rpb25zIGFyZSBub3cgc3VwcG9ydGVkCisgIC0gVVRGLTggY2xlYW51cHMKKyAgLSBvdXRfc2lnbmF0dXJlIGFkZGVkIHRvIG1ldGhvZCBkZWNvcmF0b3JzIGZvciBzcGVjaWZ5aW5nCisgICAgaG93IHRoZSByZXR1cm4gdmFsdWVzIHNob3VsZCBiZSBtYXJzaGFsZWQKKyAgLSBzZW5kZXJfa2V5d29yZCBhZGRlZCB0byBtZXRob2QgZGVjb3JhdG9ycyBmb3Igc3BlY2lmeWluZworICAgIGFuZCBhcmd1bWVudCB0byBwcm92aWRlIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgbWV0aG9kIGNhbGxlcgorICAtIGFzeW5jX2NhbGxiYWNrcyBhZGRlZCB0byBtZXRob2QgZGVjb3JhdG9ycyAKKyAgLSBtdWx0aXBsZSBpbmhlcml0YW5jZSBvZiBjbGFzc2VzIG5vdyBzdXBwb3J0ZWQgCistIEdMaWIgYmluZGluZ3M6CisgIC0gcmVzcGVjdCBOb1JlcGx5IGFubm90YXRpb25zCisgIC0gZGJ1c19nX21ldGhvZF9yZXR1cm5fZ2V0X3JlcGx5IGFuZCBkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5CisgICAgYWRkZWQgdG8gdGhlIGxvd2xldmVsIGNvZGUgZm9yIHVzZSB3aGVuIHRoZSBkYnVzLWdsaWIgbWFyc2hhbGxpbmcKKyAgICBjb2RlIGlzIG5vdCBhZGlxdWF0ZQorLSBudW1lcm91cyBidWcgZml4ZXMgYWxsIGFyb3VuZAorCitELUJVUyAwLjUwICgwNiBTZXB0ZW1iZXIgMjAwNSkKKz09PQorVGhpcyBpcyBhIG1pbm9yIHJlbGVhc2UgZnJvbSAwLjM2LjIuICBUaGUgc2VyaWVzIG51bWJlciBoYXMgY2hhbmdlZCAKK25vdCBiZWNhdXNlIG9mIGFueSB0ZWNobmljYWwgcmVhc29ucyBidXQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlCithcmUgbW92aW5nIGNsb3NlciB0byAxLjAuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBiZSB0aGUgbGFzdAorc2VyaWVzIHRvIHNlZSBtYWpvciBjaGFuZ2VzLCBtb3N0IG9mIHdoaWNoIHdpbGwgYmUgaXNvbGF0ZWQgdG8gdGhlCitHTGliIGFuZCBQeXRob24gYmluZGluZ3MsIGFzIHdlIHRyYW5zaXRpb24gdG8gY29uY2VudHJhdGUgbW9yZSBvbgorYnVnIGJ1c3RpbmcgYW5kIGNvZGUgYXVkaXRpbmcuCisKKy0gRC1CdXMgYnVpbGRzIG9uIHRoZSBDeWd3aW4gcGxhdGZvcm0KKy0gTWFrZWZpbGUgY2xlYW51cHMKKy0gVmFyaW91cyBidWcgZml4ZXMKKy0gT3B0aW1pemF0aW9uIG9mIHRoZSBkYnVzIG9iamVjdCB0cmVlIAorLSBNZW1sZWFrcyBhbmQgR0lMIGNyYXNoZXIgYnVncyBoYXZlIGJlZW4gZml4ZWQgaW4gdGhlIFB5dGhvbiBiaW5kaW5ncworCitELUJVUyAwLjM2LjIgKDI5IEF1Z3VzdCAyMDA1KQorPT09CistIFNlY3VyaXR5OiBSZXN0cmljdCBvdGhlciB1c2VycyBmcm9tIGNvbm5lY3RpbmcgdG8gYW5vdGhlciB1c2VycyAKKyAgc2Vzc2lvbiBidXMKKworRC1CVVMgMC4zNi4xICgyNCBBdWd1c3QgMjAwNSkKKz09PQorLSBQeXRob24gQmluZGluZ3M6CisgIC0gZml4ZWQgdG8gd29yayB3aXRoIGhhbC1kZXZpY2UtbWFuYWdlcgorICAtIEZvciA2NGJpdCBidWlsZHMgZXZlcnl0aGluZyBpcyBpbnN0YWxsZWQgdG8gbGliNjQvcHl0aG9uMi40LworICAgIHNpbmNlIFB5dGhvbiBjYW4ndCBoYW5kbGUgbXVsdGlsaWIKKworRC1CVVMgMC4zNiAoMjMgQXVndXN0IDIwMDUpCis9PT0KKy0gTWF4aW11bSBzaXplZCBvZiBjYWNoZWQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gMTBLCistIE1hdGNoIHJ1bGVzIG5vdyBhbGxvdyBtYXRjaGluZyBvbiBhcmd1bWVudHMgaW5zaWRlIHRoZSBtZXNzYWdlCistIGludHJvc3BlY3QueHNsIFhTTFQgc3R5bGUgc2hlZXQgYWRkZWQgZm9yIGZvcm1hdHRpbmcgaW50cm9zcGVjdGlvbgorICBkYXRhIGludG8gWEhUTUwgZm9yIGFuYWx5c2lzCistIFB5dGhvbiBiaW5kaW5nczoKKyAgLSBub3cgaGF2ZSB3b3JraW5nIHR5cGUgb2JqZWN0cyBmb3IgZXhwbGljaXQKKyAgICB0eXBlY2FzdGluZworICAtIFZhcmlhbnQgdHlwZSBoYXMgYmVlbiBhZGRlZAorICAtIERpY3Rpb25hcmllcywgVmFyaWFudHMgYW5kIEFycmF5cyBjYW4gYWxsIGJlIHBhc3NlZCB0aGUgc2lnbml0dXJlIG9yCisgICAgdHlwZShzKSBvZiB0aGVpciBjaGlsZHJlbgorICAtIHRoZSBvcHRpb25hbCB0aW1lb3V0PSBrZXl3b3JkIGhhcyBiZWVuIGFkZGVkIHdoZW4gbWFraW5nIG1ldGhvZCBjYWxscworICAtIG1hdGNoIG9uIGFyZ3MgaGFzIGJlZW4gaW1wbGVtZW50ZWQKKyAgLSBhIC5wdGggZmlsZSBoYXMgYmVlbiBhZGRlZCBmb3IgZGVhbGluZyB3aXRoIGxpYnJhcmllcyBhbmQgcHl0aG9uIGZpbGVzCisgICAgYmVpbmcgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzIHN1Y2ggYXMgaW4gNjRiaXQgaW5zdGFsbHMKKyAgLSB2YXJpb3VzIGJ1ZyBmaXhlcworLSBHTGliIGJpbmRpbmdzOgorICAtIGRlZXBseSByZWN1cnNpdmUgdHlwZXMgbm93IHN1cHBvcnRlZAorICAtIG1hbnkgc3ltYm9scyBhcmUgbm8gbG9uZ2VyIGV4cG9ydGVkIGFzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkKKyAgLSB2YXJpb3VzIG1lbWxlYWsgYW5kIG90aGVyIGJ1ZyBmaXhlcworCitELUJVUyAwLjM1LjIgKDE3IEp1bHkgMjAwNSkKKz09PQorLSBSZW5hbWUgVW5peCBTZWN1cml0eSBDb250ZXh0IHRvIFNFTGludXggU2VjdXJpdHkgQ29udGV4dCBpbiBBUEkKKy0gRml4ZWQgbW9yZSBkaXN0IGVycm9ycyB0aGF0IGRpc3RjaGVjayBkaWRuJ3QgcGljayB1cCBvbgorLSBGaXhlZCB2YXJpb3VzIGJ1Z3MgaW4gdGhlIHB5dGhvbiBiaW5kaW5ncyB0aGF0IHByZXZlbnRlZCB0aGVtIGZyb20gd29ya2luZworCitELUJVUyAwLjM1LjEgKDE2IEp1bHkgMjAwNSkKKz09PQorLSBGaXhlZCBkaXN0IGVycm9yIHdoZXJlIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB4ZCB3YXMgYmVpbmcgc2hpcHBlZCAKKyAgaW5zdGVhZCBvZiBkYnVzX2JpbmRpbmdzLnB4ZC5pbgorLSBVc2UgdGhpcyBpbnN0ZWFkIG9mIHRoZSAwLjM1IHRhcmJhbGwgCisKK0QtQlVTIDAuMzUgKDE1IEp1bHkgMjAwNSkKKz09PQorLSAtLXdpdGgtZGJ1cy11c2VyIGFkZGVkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0cyBmb3IgY29uZmlndXJpbmcgdGhlIAorICB1c2VyIHRoZSBzeXN0ZW0gYnVzIHJ1bnMgb24KKy0gLS13aXRoLWNvbnNvbGUtYXV0aC1kaXIgYWRkZWQgdG8gY29uZmlndXJlIHNjcmlwdHMgZm9yIGNvbmZpZ3VyaW5nIHRoZQorICBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgY29uc29sZSB1c2VyIGxvY2tzCistIHNlcnZpY2UgZmlsZXMgZm9yIGF1dG8tc3RhcnRpbmcgRC1CdXMgc2VydmljZXMgbm93IGhhcyB0aGUgYWJpbGl0eSB0byBwYXNzCisgIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIGV4ZWN1dGFibGUKKy0gSHVnZSBhdXRvLXN0YXJ0IGJ1ZyBzcXVhc2hlZCB3aGljaCBjYXVzZWQgc29tZSBzZXJ2aWNlcyBub3QgdG8gc3RhcnQgd2hlbgorICByZXF1ZXN0ZWQgaW4gcmFwaWQgc3VjY2Vzc2lvbgorLSBTRS1MaW51eCBzZWN1cml0eSBjb250ZXh0cyBjYW4gbm93IGJlIGFwcGVuZGVkIHRvIG1lc3NhZ2VzIGZvciBpbnNwZWN0aW9uCisgIGJ5IHNlcnZpY2VzIHRoYXQgZW5mb3JjZSB0aGVpciBvd24gc2VjdXJpdHkgcG9saWNpZXMKKy0gQ29saW4gc2F5cyB0aGUgR0xpYiBiaW5kaW5nIGFyZSByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbgorLSBOZXcgR0xpYiB0dXRvcmlhbAorLSBOZXcgR0xpYiBleGFtcGxlIGNvZGUKKy0gUHl0aG9uIGJpbmRpbmdzIGFyZSBub3cgdmVyc2lvbiAoMCw0MiwwKQorLSBQeXRob24gYmluZGluZ3MgQVBJIGhhcyBjaGFuZ2VkIG9uIHRoZSBzZXJ2aWNlIHNpZGUKKy0gZGJ1cy5zZXJ2aWNlIGhhcyBiZWVuIHNwbGl0IG91dCBhcyBhIHNlcGVyYXRlIG1vZHVsZQorLSBkYnVzLnNlcnZpY2UuU2VydmljZSBpcyByZW5hbWVkIHRvIGRidXMuc2VydmljZS5CdXNOYW1lCistIGRidXMuc2VydmljZS5PYmplY3QgaGFzIHN3YXBwZWQgdGhlIGJ1c19uYW1lIGFuZCBvYmplY3RfcGF0aCBjb25zdHJ1Y3RvcgorICBwYXJhbWV0ZXJzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRvIGluaGVyaXRhbmNlIG92ZXIgdGhlIGJ1cworLSBkYnVzLmdsaWIgaGFzIGJlZW4gc2VwZXJhdGVkIG91dCBpbiBvcmRlciB0byBsZXNzZW4gdGhlIGRlcGVuZGVuY3kgb24gZ2xpYgorICBhbmQgdG8gYWxsb3cgb3RoZXIgbWFpbmxvb3BzIHRvIGJlIGludGVncmF0ZWQgd2l0aCB0aGUgYmluZGluZ3MgaW5jbHVkaW5nCisgIGEgcGxhbm5lZCBnZW5lcmljIG1haW5sb29wIGZvciBub24tZ3VpIGFwcHMuCistIFB5dGhvbiBiaW5kaW5ncyBub3cgYXF1aXJlIHRoZSBHSUwgd2hlbiBjYWxsaW5nIGJhY2sgaW50byB0aGUgcHl0aG9uCisgIGludGVycHJldGVyLiAgRml4ZXMgY3Jhc2hlcyB3aGVuIHVzaW5nIHRocmVhZGluZyBhbmQgb3RoZXIgcmFuZG9tIHNlZ2ZhdWx0cy4KKy0gTmV3IFB5dGhvbiB0dXRvcmlhbAorLSBOdW1lcm91cyBELUJ1cyBidWcgZml4ZXMgYWxsIGFyb3VuZAorCitELUJVUyAwLjM0ICgxNSBKdW5lIDIwMDUpCis9PT0KKy0gZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKy0gVGhlIGJ1cyBjYW4gbm93IHVzZSBEX05PVElGWSAoaWYgYXZhaWxhYmxlKSB0byBjaGVjayB3aGVuIGNvbmZpZ3VyYXRpb24gZmlsZXMgCisgIGhhdmUgY2hhbmdlZCBhbmQgcmVsb2FkIHRoZW0KKy0gTmV3IGRidXNfbWVzc2FnZV9oYXNfcGF0aC9tZW1iZXIvaW50ZXJmYWNlIEFQSSBhZGRlZAorLSBUaGUgUGluZyBtZXNzYWdlIGZyb20gdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlIGlzIG5vdyBoYW5kbGVkCistIENvbXBsZXRlIGdsaWIgYmluZGluZ3Mgb3ZlcmhhdWwgKGFuZCBhcmUgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uKQorLSBUdXRvcmlhbCBub3cgaGFzIGFuIHVwZGF0ZWQgR0xpYiBzZWN0aW9uIAorLSBHTGliIGJpbmRpbmdzIGNhbiBub3cgc2VuZC9yZWNlaXZlIGhhc2ggdGFibGVzLCBhcnJheXMgYW5kIG90aGVyIGNvbXBsZXggdHlwZXMKKy0gUHl0aG9uIGJpbmRpbmdzIG92ZXJoYXVsIChtb3N0IHB1YmxpYyBmYWNpbmcgQVBJJ3MgZG9uZSkKKy0gUHl0aG9uIGJpbmRpbmdzIGhhdmUgYmVlbiBzcGxpdCB1cCBpbnRvIHNlcGFyYXRlIGZpbGVzCistIFB5dGhvbiBhZGRlZCBuZXcgdHlwZSBjbGFzc2VzIGZvciBoaW50aW5nIHRvIHRoZSBtYXJzaGFsZXIgd2hhdCB0eXBlCisgIHRvIHNlbmQgb3ZlciB0aGUgd2lyZQorLSBQeXRob24gYmluZGluZ3Mgbm93IGhhdmUgZGVjb3JhdG9ycyBmb3Igc3BlY2lmeWluZyBleHBvcnRlZCBtZXRob2RzIGFuZCBzaWduYWxzCistIE51bWVyb3VzIGJ1ZyBmaXhlcworCitELUJVUyAwLjMzICgyNSBBcHIgMjAwNSkKKz09PQorCistIGRvd25ncmFkZSByZXF1aXJlbWVudCBmcm9tIEdUSystMi42IHRvIDIuNCBmb3IgYnVpbGRpbmcgZ3RrIGNvbXBvbmVudHMKKy0gcHl0aG9uIGJpbmRpbmcgQVBJJ3MgaGF2ZSBiZWVuIG92ZXJoYWxsZWQgdG8gYmUgbW9yZSAicHl0aG9uaWMiIGFuZCBjbGVhbmVyCistIHB5dGhvbiBiaW5kaW5ncyBub3cgZXhwb3J0IGRidXMudmVyc2lvbiB3aGljaCBpcyBzZXQgdG8gKDAsNDAsMCkKKy0gcHl0aG9uIGJpbmRpbmdzIG5vdyBpbXBsZW1lbnQgdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIGludGVyZmFjZQorLSBweXRob24gYmluZGluZyBtYXRjaCBydWxlcyBhcmUgbm93IG1vcmUgZmxleGFibGUKKy0gbWFrZSBjaGVjayBoYXMgYmVlbiBmaXhlZAorLSBtYW55LCBtYW55IG1ham9yIGJ1ZyBmaXhlcworCitELUJVUyAwLjMyICgyOSBNYXIgMjAwNSkKKz09PQorCistIG1vbm8gYmluZGluZ3Mgbm93IGNvbXBpbGVzIGNvcnJlY3RseQorLSBtb25vIGJpbmRpbmcgY2xlYW51cHMKKy0gZ2xpYiBiaW5kaW5ncyBnZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGJ1cyBtZXRob2RzIGluIGRidXMtZ2xpYi1iaW5kaW5ncy5oCistIGdsaWIgYmluZGluZyBjbGVhbnVzCistIHVzZXJzIGFuZCBncm91cHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgYnkgVUlEIGFuZCBHSUQgaW4gY29uZmlnIGZpbGVzCistIG51bWVyb3VzIG1lbW9yeSBsZWFrIGZpeGVzCistIHZhcmlvdXMgb3RoZXIgZml4ZXMKKworRC1CVVMgMC4zMSAoMDcgTWFyIDIwMDUpCis9PT0KKworLSBsYW5kIHRoZSBuZXcgbWVzc2FnZSBhcmdzIEFQSSBhbmQgcmVjdXJzaXZlIHR5cGUgc3lzdGVtCistIGFkZCBkb2NzIGFuZCBmaXhlZCBEb3h5Z2VuIHdhcm5pbmdzIHRocm91Z2h0IHNvdXJjZQorLSBzcGxpdCBvdXQgc29tZSBmdW5jdGlvbnMgbm90IG5lZWRlZCBpbiBsaWJkYnVzIHRvICotdXRpbC5jIHNvdXJjZSBmaWxlcworLSB0YWtlIG91dCB0eXBlIGNvbnZpZW5pZW5jZSBmdW5jdGlvbnMKKy0gbGliZGJ1cyBub3cgYmFjayBiZWxvdyAxNTBLCistIGJvb2xlYW5zIGFyZSBub3cgMzItYml0IGluc3RlYWQgb2YgOC1iaXQKKy0gc3BlY2lmaWNhdGlvbiB1cGRhdGVkCistIGdyYW5kIHJlbmFtaW5nIHRvIHN0cmlwIG91dCB0aGUgdXNlIG9mICJzZXJ2aWNlIgorICBqdXN0IHNheSAibmFtZSIgaW5zdGVhZCAob3IgImJ1cyBuYW1lIiB3aGVuIGFtYmlndW91cykKKy0gcmVuYW1lIGRidXMtZGFlbW9uLTEgdG8gZGJ1cy1kYWVtb24gdGhyb3VnaG91dAorLSByZW5hbWUgYWN0aXZhdGlvbiB0byBhdXRvLXN0YXJ0CistIGF1dG8tc3RhcnQgb24gYnkgZGVmYXVsdCBub3cKKy0gbm90ZSB0aGF0IGxpYmRidXMgaXMgdGhlIGxvdy1sZXZlbCBBUEkKKy0gcHl0aG9uIGJpbmRpbmdzIHVwZGF0ZWQgdG8gdGhlIG5ldyBBUEkKKy0gbW9ubyBiaW5kaW5ncyB1cGRhdGVkIHRvIHRoZSBuZXcgQVBJCistIGFkZCAxNiBiaXQgdHlwZXMKKy0gZGljdGlvbmFyaWVzIGFyZSBub3cgQVJSQVlTIG9mIERJQ1RfRU5UUlkKKy0gZGJ1cy1nbGliLXRvb2wgcmVuYW1lZCB0byBkYnVzLWJpbmRpbmctdG9vbAorLSBtYXNzaXZlIHJld3JpdGUgb2YgdGhlIGdsaWIgYmluZGluZ3MKKy0gc2FuZXIgbmFtZXMgZm9yIHRoZSBkYnVzIGludGVyZmFjZSwgb2JqZWN0IHBhdGggYW5kIHNlcnZpY2UgZGVmaW5lcworLSBuZXcgZnVuY3Rpb25zIGZvciBoYW5kbGluZyB0eXBlIHNpZ25pdHVyZXMKKy0gYnVtcCBzb25hbWVzIGZvciBsaWJkYnVzIGFuZCBsaWJkYnVzLWdsaWIKKy0gdmFyaW91cyBzbWFsbCBmaXhlcworCitELUJVUyAwLjIzICgxMSBKYW4gMjAwNSkKKz09PQorCistIGFkZCBzZXRncm91cHMoKSB0byBkcm9wIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCistIHVwZGF0ZWQgU0VMaW51eCBzdXBwb3J0CistIGFkZCBhbiAiYXQgY29uc29sZSIgc2VjdXJpdHkgcG9saWN5CistIGZpeCBhIGJ1ZyB3aGVyZSBvcmcuZnJlZWRlc2t0b3AuREJ1cyB3YXNuJ3QgcmVjb2duaXplZCBhcyBhbiBleGlzdGluZworICBzZXJ2aWNlLgorLSBlcnJvciBvdXQgaWYgLS1lbmFibGUtbW9ubyBpcyBleHBsaWNpdGx5IHNldCBhbmQgbW9ubyBsaWJzIGNhbid0IGJlIGZvdW5kCistIHNldCB0aGUgbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIGxpbWl0IGZyb20gdGhlIGNvbmZpZyBmaWxlLgorLSByZW1vdmVkIGRidXNfYnVnX2dldF93aXRoX2dfbWFpbiBzaW5jZSBpdCdzIGJlZW4gcmVwbGFjZWQgYnkKKyAgZGJ1c19nX2J1c19nZXQKKy0gZml4IGZkIGxlYWtzIGluIHNvY2tldCBjb2RlCistIGxvdHMgYW5kIGxvdHMgb2YgbW9ubyBiaW5kaW5nIHVwZGF0ZXMsIGluY2x1ZGluZyBmaXhlcyB0byBtYWtlIGl0CisgIGNvbXBhdGlibGUgd2l0aCBNb25vIDEuMS4zCistIGFkZGVkIC0tbm9mb3JrIG9wdGlvbiB0byBvdmVycmlkZSBjb25maWcgZmlsZSBzZXR0aW5nIGF0IHJ1bnRpbWUKKy0gYWRkZWQgc3VwcG9ydCBmb3IgaW50NjQgYW5kIHVpbnQ2NCB0byB0aGUgcHl0aG9uIGJpbmRpbmdzCistIGxvdHMgb2YgcHl0aG9uIGJpbmRpbmcgdXBkYXRlcworLSBjb25maWcgZmlsZSBEVEQgdXBkYXRlcworLSB1c2UgU2VyaXZjZU93bmVyQ2hhbmdlcyBzaWduYWwgaW5zdGVhZCBvZiBTZXJ2aWNlQ3JlYXRlZCBhbmQKKyAgU2VydmljZURlbGV0ZWQKKy0gZml4ZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKy0gbmV3IGluaXQgc2NyaXB0IGZvciBTbGFja3dhcmUKKy0gcHJpbnQgb3V0IHRoZSBwaWQgZXZlbiB3aGVuIC0tZm9yayBpcyBwYXNzZWQKKy0gaW5jcmVhc2UgcHJlYWxsb2NhdGlvbiBzaXplcyBpbiBEQnVzTWVzc2FnZSB0byBoZWF2aWx5IHJlZHVjZQorICByZWFsbG9jcworLSBsb3RzIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cworLSBsb3RzIG1vcmUgc21hbGwgYnVnIGZpeGVzCisKK0QtQlVTIDAuMjIKKz09PQorCistIGFkZCAtLXJlcGx5LXRpbWVvdXQgdG8gZGJ1cy1zZW5kCistIGZpeCBhIG1lbWxlYWsKKy0gZml4IFNvbGFyaXMvRm9ydGUgYnVpbGQKKy0gc3dpdGNoIHRvIEFGTCAyLjEgcmF0aGVyIHRoYW4gMi4wIHRvIGFkZHJlc3MgcGF0ZW50IHRlcm1pbmF0aW9uIGNsYXVzZSAKKyAgY29uY2VybnMKKy0gYWRkIFNFTGludXggc3VwcG9ydAorLSBtb3N0bHkgcmVwYWlyIGxpYnhtbCBiYWNrZW5kIGZvciBjb25maWcgcGFyc2VyLCBzdGlsbCBkb2Vzbid0IAorICBwYXNzIG91dCBvZiBtZW1vcnkgdGVzdHMKKy0gZml4IGRpc3RjaGVjayB0byBpbmNsdWRlIGxhbmd1YWdlIGJpbmRpbmdzCistIGFkZCBHZXRDb25uZWN0aW9uVW5peFVzZXIgbWV0aG9kIG9uIGJ1cyBkcml2ZXIKKy0gYWxzbyBmb3IgVW5peFByb2Nlc3NJRAorLSBsb3RzIG9mIFB5dGhvbiwgTW9ubywgb3RoZXIgYmluZGluZyBmaXhlcworLSBjaGFuZ2UgR0xpYiBiaW5kaW5ncyB0byBub3QgaW5jbHVkZSBkYnVzL2RidXMuaCAoZnVsbHkgZW5jYXBzdWxhdGUgbGliZGJ1cykKKy0gcGFzcyBwYXRocyBhcyBzdHJpbmdzLCBub3QgYXJyYXlzIG9mIHN0cmluZworLSBhZGQgbWVzc2FnZSBzaWduYXR1cmUgaGVhZGVyIGZpZWxkCistIGNsZWFudXBzIHRvIG1hcnNoYWxpbmcgY29kZQorLSBjbGVhbiB1cCBhdXRoZW50aWNhdGlvbiBjb2RlCistIHJlbG9hZCBjb25mIGZpbGVzIG9uIFNJR0hVUAorLSByZW5hbWUgU0VSVklDRS9TRU5ERVJfU0VSVklDRSB0byBERVNUSU5BVElPTi9TRU5ERVIKKy0gZml4IGNpcmN1bGFyIGNvbmYgZmlsZSBpbmNsdXNpb24KKy0gYWxsb3cgZW1wdHkgYXJyYXlzCistIHRvbnMgb2Ygb3RoZXIgc21hbGwgYnVnZml4ZXMKKworRC1CVVMgMC4yMQorPT09CisKKy0gaW1wbGVtZW50ICJhdXRvIGFjdGl2YXRpb24iIGZsYWcgb24gbWVzc2FnZXMsIHNvIHRoZSBkZXN0aW5hdGlvbiAKKyAgc2VydmljZSBjYW4gYmUgbGF1bmNoZWQgYXV0b21hdGljYWxseQorLSBmaXggYSBidWcgaW4gY3VzdG9tIHR5cGUgbWFyc2hhbGluZworLSBvcHRpbWl6ZSBjYXNlIHdoZXJlIG11bHRpcGxlIGFwcHMgYWN0aXZhdGUgdGhlIHNhbWUgc2VydmljZQorICAoYXZvaWQgInRodW5kZXJpbmcgaGVyZCIpCistIGFkZCBkeW5hbWljIHNlcnZpY2UgZmlsZSBkaXNjb3ZlcnkvcmVsb2FkaW5nCistIGZpeCBhIGJ1c3kgbG9vcCB3aGVuIGJsb2NraW5nIGZvciBhIHJlcGx5CistIGZpeCBhIDY0LWJpdCBjcmFzaCBpbnZvbHZpbmcgdmFyYXJncworLSBmaXggYSBidXMgY3Jhc2ggd2hlbiBwcm9jZXNzaW5nIGFuIEFjcXVpcmVTZXJ2aWNlCistIGFsbG93IGFwcGVuZGluZyBUWVBFX0JZVEUgdmlhIGFwcGVuZF9hcmdzX3ZhbGlzdAorLSBmaXggZGljdHMtaW5zaWRlLWRpY3RzCistIGVuaGFuY2VtZW50cyB0byBQeXRob24gYW5kIFF0IGJpbmRpbmdzCisKK0QtQlVTIDAuMjAKKz09PQorCitUaGlzIHJlbGVhc2UgbGFuZHMgc29tZSB2ZXJ5IGxhcmdlIEFQSSBjaGFuZ2VzIGFuZCBudW1lcm91cyBidWdmaXhlcy4KK1RoZSBsaXN0IG9mIGNoYW5nZXMgaXMgdG9vIGxhcmdlIHRvIGZ1bGx5IGRvY3VtZW50IGhlcmU7IHBsZWFzZSByZWZlcgordG8gdGhlIGRvY3VtZW50YXRpb24sIGFuZCBtZXNzYWdlLWJ1cy1saXN0IGFyY2hpdmVzLgorCitELUJVUyAwLjEzCis9PT0KKworVGhpcyBpcyBwcm9iYWJseSB0aGUgbGFzdCByZWxlYXNlIGJlZm9yZSBsYW5kaW5nIHRoZSBsYXJnZSBBUEkgY2hhbmdlcworb24gdGhlICJkYnVzLW9iamVjdC1uYW1lcyIgYnJhbmNoLgorCistIGZpeCBzeXN0ZW0gYnVzIHRvIGFsd2F5cyB1c2UgZmlsZXN5c3RlbSBzb2NrZXQ7IGFueW9uZSAKKyAgY2FuIGNyZWF0ZSBhbnkgYWJzdHJhY3Qgc29ja2V0LCB3aGljaCBpc24ndCBzZWN1cmUgCisgIHNpbmNlIGlmIHlvdSBjYW4gY3Jhc2ggdGhlIHN5c3RlbSBidXMgeW91J2QgYmUgYWJsZQorICB0byByZXBsYWNlIGl0LgorLSBhZGQgRFREIGZvciBjb25maWd1cmF0aW9uIGZpbGUKKy0gaW1wcm92ZSBzcGVjaWZpY2F0aW9uIGEgYml0CisKK0QtQlVTIDAuMTIKKz09PQorCistIGZpeCAic2VydmljZSBtZXNzYWdlYnVzIHN0YXR1cyIgb24gUmVkIEhhdAorLSBmaXggZGVtYXJzaGFsaW5nIG9mIERCVVNfVFlQRV9OQU1FRAorLSBmaXggImV2YWwgYGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb25gIiB0byBleGl0IHByb3Blcmx5CistIGZpeCBidWlsZCB3aXRob3V0IC0tcHJlZml4CistIHVzZWxlc3MgZm9vbGluZyB3aXRoIE1vbm8gYmluZGluZ3MKKy0gdXNlbGVzcyBmb29saW5nIHdpdGggZ2NqIGJpbmRpbmdzCistIGZpeCBzcmNkaXIgIT0gYnVpbGRkaXIKKy0gZml4IHZhcmlvdXMgY29tcGlsZXIgd2FybmluZ3MgYW5kIG90aGVyIGlzc3VlcworLSBhZGQgZ2V0L3NldCBkYXRhIHRvIERCdXNNZXNzYWdlCistIGZpeCBoZWFkZXJzIGZvciBDKysKKy0gT1MgWCBidWlsZCBmaXhlcworLSBhYnN0cmFjdCBkb21haW4gc29ja2V0cyBzdXBwb3J0IChMaW51eCBvbmx5KQorLSBhZGQgZGJ1cy1jbGVhbnVwLXNvY2tldHMgdXRpbGl0eSBmb3IgcGVvcGxlCisgIG5vdCB1c2luZyBsaW51eAorLSBiZSBjb25zaXN0ZW50IGFib3V0IGRlZmF1bHRpbmcgdG8gLS1zZXNzaW9uLy0tc3lzdGVtIAorICB3aXRoIGNvbW1hbmQgbGluZSB0b29scworLSBtZXJnZSBpbiBwb2xpY2llcyBmcm9tIGluY2x1ZGVkIGNvbmZpZyBmaWxlcworLSBmaXggYnVpbGQgb24gbm9uLXg4NgorLSBkb2NzIHVwZGF0ZXMKKy0gbG90cyBvZiBvdGhlciBidWdmaXhlcworCitELUJVUyAwLjExCis9PT0KKworLSBhZGQgLS1lbmFibGUtZG9jcyB0byB0dXJuIG9mZi9vbiB0aGUgZG9jYm9vayBzdHVmZgorICAoZG9lc24ndCBjb3ZlciBkb3h5Z2VuIHN0dWZmIHlldCkKKy0gbWFrZSBwZW9wbGUgZGVmaW5lIERCVVNfQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFCisgIGFuZCByZWFkIHdhcm5pbmcgaW4gUkVBRE1FIHNvIHRoZXkgZG9uJ3QgCisgIGV4cGVjdCB0aGUgQVBJIHRvIGJlIGZyb3plbiBhbHJlYWR5CistIHJlbmFtZSAucGMgZmlsZXMgdG8gImRidXMtMS5wYyIgaW5zdGVhZCBvZiAKKyAgImRidXMtMS4wLnBjIiBldGMuIC0gdGhpcyB3aWxsIHJlcXVpcmUgY2hhbmdpbmcgCisgIHBrZy1jb25maWcgaW52b2NhdGlvbnMKKy0gc29tZSBkb2NzIGNsZWFudXBzCistIGFkZCBtYW4gcGFnZXMgZm9yIGFsbCBleGVjdXRhYmxlcworLSBhbGxvdyBzZW5kIHRvL2Zyb20gYnVzIGRyaXZlciBpbiB0aGUgZGVmYXVsdCBzeXN0ZW0uY29uZgorLSBmaXggdXNlciBsb29rdXAgYnVnCistIGltcGxlbWVudCBkYnVzLWxhdW5jaCB0byBsYXVuY2ggdGhlIHNlc3Npb24gbWVzc2FnZSBidXMKKy0gZml4IHNvbWUgdGhyZWFkIGRlYWRsb2NrcworLSBzb21lIHBlcmZvcm1hbmNlIHByb2ZpbGluZy9vcHRpbWl6YXRpb24KKy0gYWRkIGRidXNfYnVzX2FjdGl2YXRlX3NlcnZpY2UoKSBmdW5jdGlvbgorLSBmaXggc29tZSBtaW5vciBidWdzIGhlcmUgYW5kIHRoZXJlCistIGluc3RhbGwgUmVkIEhhdCBpbml0c2NyaXB0IGluIHRoZSByaWdodCBwbGFjZQorCitELUJVUyAwLjEwCis9PT0KKworLSByZXZlcnNlZCBvcmRlciBvZiBhcmdzIHRvIGRidXNfbWVzc2FnZV9uZXcoKQorLSByZW5hbWVkIGRidXNfbWVzc2FnZV9uYW1lX2lzKCkgYW5kIHNvbWUgb3RoZXIKKyAgZnVuY3Rpb25zCistIGNoYW5nZSBEQnVzV2F0Y2ggdG8gaGF2ZSBkYnVzX3dhdGNoX2hhbmRsZSgpIAorICBzaW1pbGFyIHRvIGRidXNfdGltZW91dF9oYW5kbGUoKSwgZHJvcCAKKyAgY29ubmVjdGlvbi9zZXJ2ZXItc3BlY2lmaWMgaGFuZGxlIHJvdXRpbmVzCistIGNoYW5nZSBtZXNzYWdlIHNlcmlhbHMgdG8gYmUgdW5zaWduZWQKKy0gaW1wbGVtZW50ZWQgPGFsbG93Pi88ZGVueT4vPGxpbWl0PiBmZWF0dXJlcyBmb3IgCisgIGNvbmZpZyBmaWxlOyBzeXN0ZW0gYnVzIG5vdyBoYXMgYSBkZW55LWFsbCBwb2xpY3kgCisgIGJ5IGRlZmF1bHQuCistIHN5c3RlbS5jb25mIGhhcyA8aW5jbHVkZWRpcj5zeXN0ZW0uZDwvaW5jbHVkZWRpcj4KKyAgc28gcGFja2FnZXMgY2FuIGluc3RhbGwgYWRkaXRpb25zIHRvIHRoZSBkZWZhdWx0IAorICBwb2xpY3kgdG8gPGFsbG93PiB0aGUgbWVzc2FnZXMgdGhleSBuZWVkLiBlLmcuCisgIENVUFMgbWlnaHQgaW5zdGFsbCBhIGN1cHMuY29uZiAtIHNlZSAKKyAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYgCisgIGZvciBhbiBleGFtcGxlLgorLSBhZGQgdGltZW91dHMgZm9yIGF1dGhlbnRpY2F0aW9uLCBhY3RpdmF0aW9uCistIGFkZCBnbGliLXN0eWxlICJjaGVja3MiIG9uIHB1YmxpYyBBUEksIGVuYWJsZSAKKyAgdGhvc2UgYnkgZGVmYXVsdCwgZGlzYWJsZSBhc3NlcnRpb25zIGJ5IGRlZmF1bHQKKy0gYWRkIEdNYWluQ29udGV4dCBhcmd1bWVudCB0byBHTGliIHNldHVwIGZ1bmN0aW9ucywgCisgIGNhbiBiZSBOVUxMIGZvciBkZWZhdWx0IGNvbnRleHQuIE5lZWRlZCBmb3IgdGhyZWFkcy4KKy0gYWRkIDY0LWJpdCBpbnRlZ2VyIHR5cGUKKy0gdmFsaWRhdGUgdHlwZSBvZiBzdGFuZGFyZCBtZXNzYWdlIGhlYWRlciBmaWVsZHMKKy0gY29uc2lkZXIgbWVzc2FnZXMgaW4gdGhlIG9yZy5mcmVlZGVza3RvcC5Mb2NhbAorICBuYW1lc3BhY2UgdG8gYmUgaW52YWxpZCAodG8gYXZvaWQgZmFrZSBkaXNjb25uZWN0IAorICBtZXNzYWdlcyBmb3IgZXhhbXBsZSkKKy0gZml4IGFzc29ydGVkIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgYnVncyBpbiAKKyAgdGhlIFNIQS0xIGF1dGggbWVjaGFuaXNtCistIGNhY2hlIHVzZXIgZGF0YWJhc2UgaW5mb3JtYXRpb24gKGdyb3VwcyB1c2VyIGlzIAorICBpbiwgZXRjLikgaGVscHMgYSBsb3Qgd2l0aCBOSVMKKy0gYWx3YXlzIHN0b3JlIHVpZF90LCBwaWRfdCwgZ2lkX3QgaW4gInVsb25nIiAKKyAgcmF0aGVyIHRoYW4gImludCIKKy0gaW1wbGVtZW50IGNvbmZpZyBmaWxlIHNldHRpbmdzIGZvciB3aGljaCAKKyAgdXNlcnMgY2FuIGNvbm5lY3QKKy0gU0hBLTEgdW5pdCB0ZXN0CistIGRidXMtc2VuZCwgZGJ1cy1tb25pdG9yIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKKy0gZml4ZWQgbG90cyBvZiBtaXNjIGNyYXNoZXMgYW5kIG90aGVyIGJ1Z3MKKworRC1CVVMgMC45Cis9PT0KKworLSBpbXBsZW1lbnRlZCBhIHRlc3QgY2FzZSBmb3Igc2VydmljZSBhY3RpdmF0aW9uLAorICBhbmQgZml4ZWQgbWFueSBidWdzIGV4cG9zZWQgYnkgdGhhdAorLSBpbXBsZW1lbnRlZCByZWN1cnNpdmUgYXJndW1lbnQgbWFyc2hhbGluZy9kZW1hcnNoYWxpbmcgCisgIGZvciBtZXNzYWdlcywgYWxsb3dpbmcgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMKKy0gZml4ZWQgdXAgaW50ZWdyYXRpb24gb2YgbWVzc2FnZSBkaXNwYXRjaCB3aXRoIAorICBtYWluIGxvb3AgYnkgYWRkaW5nIGEgY2FsbGJhY2sgb24gY2hhbmdlIG9mIAorICBkaXNwYXRjaCBzdGF0dXMKKy0gYWRkIGEgcGlkZmlsZSBmZWF0dXJlIHRvIGRhZW1vbgorLSBzb21lIGJ1aWxkIGZpeGVzCistIGNsZWFuIHVwIHVuaXggZG9tYWluIHNvY2tldHMgb24gZXhpdAorLSBhZGQgLS1wcmludC1hZGRyZXNzIGFuZCB0aGUgYWJpbGl0eSAKKyAgdG8gY3JlYXRlIGEgcmFuZG9tIHNlcnZlciBhZGRyZXNzIAorICBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKKworRC1CVVMgMC44Cis9PT0KKworLSBmaXggZHVtYiBidWcgaW4gMC43CisKK0QtQlVTIDAuNworPT09CisKKy0gaW1wbGVtZW50IGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VkIHRvIGNvbnRyb2wgYnVzIGNoYXJhY3RlcmlzdGljcworLSBpbXBsZW1lbnQgZGFlbW9uIG1vZGUsIGNoYW5naW5nIHVzZXIgSUQsIGFuZCBvdGhlciBzeXN0ZW0KKyAgYnVzIGZlYXR1cmVzCistIGFkZCBpbml0IHNjcmlwdHMgZm9yIHN5c3RlbXdpZGUgYnVzCistIGFkZCAibWFrZSBjaGVjay1jb3ZlcmFnZSIgdGFyZ2V0IHRvIGNoZWNrIHRlc3QgY292ZXJhZ2UKKy0gbW9yZSB0ZXN0IHN1aXRlIGFkZGl0aW9ucworLSBtYW55LCBtYW55IGJ1Z2ZpeGVzCistIG1hbnkgQVBJIGNoYW5nZXMvZml4ZXMKKworRC1CVVMgMC42Cis9PT0KKy0gVmFzdGx5IGltcHJvdmVkIGJ1cyBkYWVtb24gdGVzdCBzdWl0ZQorLSBMb3RzIG9mIG1pc2MuIGJ1Z2ZpeGVzIGFuZCBtZW1vcnkgbGVhayBmaXhlcworLSBTdXBwb3J0IGZvciBtYXJzaGFsbGluZyBrZXkvdmFsdWUgZGF0YQorLSBBY3RpdmF0aW9uIGltcHJvdmVtZW50cy4KKworRC1CVVMgMC41Cis9PT0KKworLSBTcGVjaWZpY2F0aW9uIHVwZGF0ZXMKKy0gcG9ydCB0byBPUyBYIGFuZCBvdGhlciBCU0QgdmFyaWFudHMKKy0gcG9ydCB0byBTb2xhcmlzCistIFBhcnRpYWwgd29yayBvbiBjb29raWUtYmFzZWQgYXV0aGVudGljYXRpb24KKy0gVGhyZWFkIHNhZmV0eSBmaXhlcworLSBMb3RzIG9mIG1pc2MuIGJ1Z2ZpeGVzCistIFN1cHBvcnQgZm9yIG1vcmUgYXJyYXkgdHlwZXMKKy0gQWRkIGRhdGEgc2xvdHMgdG8gREJ1c1NlcnZlcgorLSBEQnVzU3RyaW5nIHNlY3VyaXR5IGF1ZGl0IGZpeGVzCistIEZpeCBmb3Igc3lzdGVtcyAob3IgdmFsZ3JpbmQpIHdpdGggdW5hbGlnbmVkIG1hbGxvYyBibG9ja3MKKworRC1CVVMgMC40Cis9PT0KKworLSBQcmVsaW1pbmFyeSBhY3RpdmF0aW9uIHN1cHBvcnQuCistIEJldHRlciBhdXRoZW50aWNhdGlvbiB0ZXN0IHN1aXRlCistIEJ1cyB0ZXN0IHByb2dyYW0KKy0gU3BlY2lmaWNhdGlvbiB1cGRhdGVzCistIFRocmVhZCBzYWZldHkKKy0gQnVnIGZpeGVzCisKK0QtQlVTIDAuMworPT09CisKKyAtIFByZWxpbWluYXJ5IGxpbWl0YXRpb25zIAorIC0gTWVzc2FnZSBzZW5kaW5nIHdvcmtzCisgLSBCdXMgY2xpZW50CisgLSBBcnJheSBtYXJzaGFsbGluZy9kZW1hcnNoYWxsaW5nCisgLSBTZXJ2aWNlcworIC0gQmV0dGVyIE9PTSBoYW5kbGluZyBpbiB0aGUgYnVzCisgLSBJbi1wcm9jIGRlYnVnIHRyYW5zcG9ydAorIC0gVHJhbnNwb3J0L3NlcnZlciBhZGRyZXNzIHN1cHBvcnQKKworRC1CVVMgMC4yCis9PT0KKworIC0gSW5jbHVkZSB0ZXN0IGNvZGUgaW4gdGhlIHRhcmJhbGwuCisKK0QtQlVTIDAuMQorPT09CisKKyAtIEluaXRpYWwgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL05FV1MucHJlLTEtMiBiL05FV1MucHJlLTEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg5OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvTkVXUy5wcmUtMS0yCkBAIC0wLDAgKzEsMTUzIEBACitELUJ1cyAxLjIuMSAoMDQgQXByaWwpCis9PQorLSBEdWUgdG8gaXNzdWVzIHB1dHRpbmcgdGhlIHJlLWxpY2Vuc2luZyBlZmZvcnQgb24gaG9sZCBpbmRlZmluaXRlbHksIGl0IGhhcyAKKyAgYmVlbiBkZWNpZGVkIHRvIG1vdmUgdG8gMS4yLnggdmVyc2lvbmluZyBzY2hlbWUuICBCZWluZyB0aGF0IDEuMS4yMCBpcyAKKyAgY29uc2lkZXJlZCB0byBhbHNvIGJlIDEuMi4wIGFuZCB0aGlzIGJlaW5nIHRoZSBzZWNvbmQgcmVsZWFzZSBpbiB0aGUgMS4yLnggCisgIHN0YWJsZSBzZXJpZXMgd2UgaGF2ZSB2ZXJzaW9uZWQgdGhpcyByZWxlYXNlIDEuMi4xLiBUaGlzIHJlbGVhc2UgY29udGFpbnMgYSAKKyAgbnVtYmVyIG9mIGJ1ZyBmaXhlcyBpZGVudGlmaWVkIGFmdGVyIDEuMS4yMC4KKy0gY29tcGlsZXMgdW5kZXIgc29tZSBvbGRlciB2ZXJzaW9ucyBvZiBnbGliYworLSBjb21waWxlcyB3aXRob3V0IFggc3VwcG9ydCBvbmNlIGFnYWluCistIGZpeCBzdHVjayBzZXJ2ZXIgZ3JhYiBpZiBkYnVzLWxhdW5jaCBpcyBydW4gaW4gYW4gZXhpc3RpbmcgRC1CdXMgWCBzZXNzaW9uCistIHZhcmlvdXMgTWFjIE9TWCBidWlsZCBmaXhlcyBhZGRlZAorLSBkb24ndCB1c2UgdGhlIGJyb2tlbiBwb2xsIGNhbGwgb24gTWFjIE9TWAorLSBiZXR0ZXIgY2hlY2tzIGZvciBsaW5rZXIgZmxhZyBzdXBwb3J0IHNob3VsZCBhbGxvdyBELUJ1cyB0byBsaW5rIHVuZGVyCisgIHZhcmlvdXMgbGlua2VycworLSBleGl0X29uX2Rpc2Nvbm5lY3QgaXMgc2V0IGFmdGVyIHRoZSBjb25uZWN0aW9uIHJlZ2lzdGVycyB3aXRoIGEgYnVzIHNvIHdlIAorICBkb24ndCBleGl0IGlmIHdlIGdldCBhIGRpc2Nvbm5lY3QgZHVyaW5nIHRoZSBoYW5kc2hha2UKKy0gZGljdHMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggZGJ1cy1zZW5kCistIGlub3RpZnkgYmFja2VuZCBpcyBub3cgbGVzcyBhZ2dyZXNzaXZlCistIHBlbmRpbmcgY2FsbHMgZXhwaXJlIGNvcnJlY3RseQorLSBtZW1sZWFrIG9mIHV1aWQgd2hlbiB0aGUgYnVzIGlzIGF1dG9sYXVuY2hlZCBmaXhlZAorCitELUJ1cyAxLjEuMjAgLSAiQ29uaXN0ZW4gV2F0ZXIiICgyNyBGZWJ1YXJ5KQorPT0KKworLSBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gc3VwcG9ydGVkIFNUQUJMRSByZWxlYXNlIG9mIEQtQnVzLiBGb3IgYWxsIAorICBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGlzIGlzIHRoZSAxLjIuMCByZWxlYXNlIFdJVEhPVVQgdGhlIHBsYW5uZWQgWDExL01JVCAKKyAgbGljZW5zZSBjaGFuZ2UgZHVlIHRvIGEgY291cGxlIG9mIGxpY2Vuc2UgaG9sZGVycyB3aG8gaGF2ZSB5ZXQgdG8gcmVzcG9uZC4KKyAgRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBsaWNlbnNlIGNoYW5nZSBpcyBiZWluZyBwZXJzdWVkIHRvIHNpbXBsaWZ5IGxpY2Vuc2luZworICBpc3N1ZXMgYW5kIGZpeCBhIGNvdXBsZSBvZiBsaWNlbnNpbmcgY291cm5lciBjYXNlcy4gIFdoZW4gdGhpcyBoYXBwZW5zIEQtQnVzCisgIHdpbGwgYmUgcmVsZWFzZWQgdW5kZXIgdGhlIDEuMi4wIHZlcnNpb24uCisKKy0gRC1CdXMgMS4wLnggZWZmZWN0aXZlbHkgZ29lcyBpbnRvIHNlY3VyaXR5IGZpeCBtb2RlIGFuZCB3aWxsIG9ubHkgYmUKKyAgdXBkYXRlZCBmb3IgbWFqb3IgaXNzdWVzLgorCistIEZpeGVkIENWRS0yMDA4LTA1OTUgLSBzZWN1cml0eSBwb2xpY3kgb2YgdGhlIHR5cGUgPGFsbG93IHNlbmRfaW50ZXJmYWNlPQorICAic29tZS5pbnRlcmZhY2UuV2l0aE1ldGhvZHMiLz4gd29yayBhcyBhbiBpbXBsaWNpdCBhbGxvdyBmb3IKKyAgbWVzc2FnZXMgc2VudCB3aXRob3V0IGFuIGludGVyZmFjZSBieXBhc3NpbmcgdGhlIGRlZmF1bHQgZGVueSBydWxlcyBhbmQgCisgIHBvdGVudGlhbGx5IGFsbG93aW5nIHJlc3RyaWN0ZWQgbWV0aG9kcyBleHBvcnRlZCBvbiB0aGUgYnVzIHRvIGJlIGV4ZWN1dGVkCisgIGJ5IHVuYXV0aG9yaXplZCB1c2Vycy4gCisKKy0gRml4ZXMgZGJ1cy1sYXVuY2ggc28gdGhlIHNlc3Npb24gYnVzIGdvZXMgYXdheSBzbyBkb2VzIEQtQnVzCisKKy0gQnVpbGRzIGFnYWluc3QgbGF0ZXN0IGdjYy9nbGliYyBjaGFuZ2VzCisKKy0gQ29ycmVjdGx5IHVucmVmIGNvbm5lY3Rpb25zIHdpdGhvdXQgZ3VpZHMgZHVyaW5nIHNodXRkb3duCisKKy0gQWJvdXQgdGhlIG5hbWU6IFN1Ym1pdHRlZCBieSBHcmVnIEsgTmljaG9sc29uLCBDb25pc3RlbiBXYXRlciBpcyBhIGxha2UgaW4gCisgIEN1bWJyaWEsIEVuZ2xhbmQgd2hlcmUgc2V2ZXJhbCB3YXRlciBzcGVlZCByZWNvcmRzIGhhdmUgYmVlbiBicm9rZW4uIEJldHdlZW4gCisgIDE5NTYgYW5kIDE5NTkgU2lyIE1hbGNvbG0ncyBzb24gRG9uYWxkIENhbXBiZWxsIHNldCBmb3VyIHN1Y2Nlc3NpdmUgcmVjb3JkcyBvbiAgdGhlIGxha2UgaW4gQmx1ZWJpcmQgSzcsIGEgaHlkcm9wbGFuZS4KKyAgKFdpa2lwZWRpYSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmlzdG9uX1dhdGVyI1dhdGVyc3BlZWRfcmVjb3JkKQorCitELUJ1cyAxLjEuNCAtIDEuMi4wUkMyICgxNyBKYW51YXJ5IDIwMDcpCis9PQorLSBGaXhlcyBpbm90aWZ5IHN1cHBvcnQKKworRC1CdXMgMS4xLjMgLSAxLjIuMFJDMSAoMTUgSmFudWFyeSAyMDA3KQorPT0KKworLSBUaGlzIHJlbGVhc2UgaXMgaW50ZW5kZWQgdG8gYmUgUmVsZWFzZSBDYW5kaWRhdGUgMSBvZiBtYWpvciByZWxlYXNlCisgIEQtQnVzIDEuMi4wLiAgSWYgbm90aGluZyBpcyBmb3VuZCB0byBiZSB3cm9uZyB3aXRoIHRoaXMgcmVsZWFzZSBpdAorICB3aWxsIGJlY29tZSAxLjIuMCB3aXRoaW4gYSB3ZWVrLiAgSWYgd2UgbmVlZCB0byBtYWtlIG1ham9yIGNoYW5nZXMKKyAgd2Ugd2lsbCByZWxlYXNlIGFuIFJDMiBhbmQgc3RhcnQgdGhlIHByb2Nlc3Mgb3ZlciBhZ2Fpbi4KKworLSBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgc28gQVBJJ3MgbWF5IHN0aWxsIGNoYW5nZSBpZiBwcm9ibGVtcworICBhcmUgZm91bmQgKHRob3VnaCB0aGlzIGlzIGV4dHJlYW1seSB1bmxpa2VseSkuCisKKy0gRFREIGZvciB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgaXMgZml4ZWQgYW5kIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXJzCisKKy0gU291cmNlcyBub3cgcmVzaWRlIGluIGEgZ2l0IHJlcG9zaXRvcnkgYXQgCisgIGh0dHA6Ly9naXR3ZWIuZnJlZWRlc2t0b3Aub3JnLz9wPWRidXMvZGJ1cy5naXQ7YT1zdW1tYXJ5CisKKy0gQXJndW1lbnQgcGF0aCBtYXRjaGluZyBvZiB0aGUgdHlwZSBhcmcwcGF0aD0nL2FhL2JiLycgaXMgbm93IHN1cHBvcnRlZAorICAoc2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uKQorCistIE5ldyBlcnJvciBvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PYmplY3RQYXRoSW5Vc2UgYWRkZWQKKworLSBBdXRvbGF1bmNoZWQgYnVzc2VzIG5vdyBzYXZlIHRoZWlyIHBhcmFtZXRlcnMgaW4gWDExIGlmIHBvc3NpYmxlIG1ha2luZyB0aGVtCisgIGJlaGF2ZSBjbG9zZXIgdG8gYnVzc2VzIGxhdW5jaGVkIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc21zIAorCistIGlub3RpZnkgaXMgbm93IHRoZSBkZWZhdWx0IGJhY2tlbmQgZm9yIHdhdGNoaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBjaGFuZ2VzCisKKy0gTW9yZSBzdXBwb3J0IGZvciB0aGUgQUlYIHBsYXRmb3JtIGhhcyBiZWVuIGFkZGVkCisKKy0gTnVtZXJvdXMgYnVnIGZpeGVzIGFuZCBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMKKworRC1CdXMgMS4xLjIgKDI3IEp1bHkgMjAwNykKKz09CisKKy0gVGhpcyByZWxlYXNlIGlzIGludGVuZGVkIHRvIGJlIGEgZmVhdHVyZSBjb21wbGV0ZSBiZXRhIGZvciBzdGFibGUKKyAgcmVsZWFzZSAxLjIuMCwgcGxlYXNlIHRlc3QgaXQuIDEuMi4wIHdpbGwgZm9sbG93IHByZXR0eSBzb29uIGlmIG5vCisgIG1ham9yIHByb2JsZW1zIGFyZSBmb3VuZC4gIFdlJ2xsIGRvIG1vcmUgYmV0YXMgaWYgc2lnbmlmaWNhbnQKKyAgY2hhbmdlcyBhcmUgbWFkZS4KKworLSBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgc28gQVBJJ3MgbWF5IHN0aWxsIGNoYW5nZSBpZiBwcm9ibGVtcworICBhcmUgZm91bmQgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykuCisKKy0gVGhlIHN5c3RlbSBidXMgbm93IHN1cHBvcnRzIHN0YXJ0aW5nIHNlcnZpY2VzIG9uIGRlbWFuZC4gVGhpcyB1c2VzIGEKKyAgc2V0dWlkIGhlbHBlciBwcm9ncmFtIGJlY2F1c2Ugc3lzdGVtIGJ1cyBkYWVtb24gcnVucyBhcyBhIG5vYm9keQorICB1c2VyLCB3aGlsZSBzZXJ2aWNlcyBpdCBsYXVuY2hlcyBtYXkgbmVlZCB0byBydW4gYXMgYSBkaWZmZXJlbnQKKyAgdXNlci4KKworICAqKipFeHRyYSBleWVzIGF1ZGl0aW5nIHRoZSBzZXR1aWQgaGVscGVyIGFyZSBlbmNvdXJhZ2VkIGFuZCB3b3VsZCBiZQorICB0aW1lbHkgcmlnaHQgbm93LCBiZWZvcmUgMS4yLjAqKioKKworICBBIGRlc2lnbiBkb2MgaXMgYXZhaWxhYmxlIGluIGRvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQKKworLSBUaGUgVENQIGFkZHJlc3MgZm9ybWF0IGhhcyBiZWVuIGVuaGFuY2VkLCBzdWNoIHRoYXQgVENQIG1heSBiZQorICBhY3R1YWxseSB1c2FibGUuICBUaGUgZGJ1cy1kYWVtb24gbWFuIHBhZ2UgZGVzY3JpYmVzIHRoZSBuZXcKKyAgZWxlbWVudHMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiAgMS4xLjEgaGFkIGFkZGVkIGFuIGFsbF9pbnRlcmZhY2VzCisgIGZsYWcgdG8gdGhlIGZvcm1hdCwgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiBhIGNsZWFuZXIKKyAgYXBwcm9hY2guCisKKy0gU29tZSB0aHJlYWQtcmVsYXRlZCBidWdzIGhhdmUgYmVlbiBmaXhlZCwgdGhlc2UgYXJlIGltcG9ydGFudCBmaXhlcworICBpZiB5b3UgYXJlIHVzaW5nIG11bHRpcGxlIHRocmVhZHMgd2l0aCBsaWJkYnVzLCBhbmQgbm90IGltcG9ydGFudAorICBvdGhlcndpc2UuCisKKworRC1CdXMgMS4xLjEgKDE4IEp1bmUgMjAwNykKKz09CistIFRoaXMgaXMgYSBkZXZlbG9wbWVudCByZWxlYXNlLCB1bmxlc3MgeW91IG5lZWQgc3BlY2lmaWMgCisgIGZ1bmN0aW9uYWxpdHkgcGxlYXNlIHVzZSB0aGUgc3RhYmxlIHJlbGVhc2VzIGFzIEFQSSdzIG1heSBjaGFuZ2UKKyAgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykKKy0gVGhlIGJ1cyBkYWVtb24gbm93IGdlbmVyYXRlcyBhIGdsb2JhbGx5LXVuaXF1ZSBJRCBmb3IgaXRzZWxmLCB3aGljaCBpcyBhdmFpbGFibGUgCisgIHVzaW5nIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBkYnVzX2J1c19nZXRfaWQoKS4gVXNlIHRoaXMgYXMgYSB1bmlxdWUgSUQgCisgIGZvciBhIHVzZXIncyBzZXNzaW9uLCBmb3IgZXhhbXBsZS4KKy0gZGJ1c19zZXJ2ZXJfZ2V0X2lkKCksIGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkKCkgbm93IGF2YWlsYWJsZSB0byBhY2Nlc3MKKyAgdGhlIHVuaXF1ZSBJRCBvZiBhIHBhcnRpY3VsYXIgYWRkcmVzcworLSBkYnVzX3dhdGNoX2dldF9mZCgpIGRlcHJlY2F0ZWQgc2luY2UgaXQgaGFkIHVuY2xlYXIgY3Jvc3MtcGxhdGZvcm0gc2VtYW50aWNzLgorICBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgYW5kIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpIHJlcGxhY2UgaXQuCistIHN1cHBvcnQgQU5PTllNT1VTIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24sIHdoaWNoIGFsbG93cyBhIGNsaWVudCB0byAKKyAgYXV0aGVudGljYXRlIGFzIG5vYm9keSBpbiBwYXJ0aWN1bGFyCistIGFkZCBBUEkgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMoKSB3aGljaCB3aWxsIGFsbG93IHRoZSBtZXNzYWdlCisgIHN0cmVhbSB0byBiZWdpbiBpZiB0aGUgY2xpZW50IGF1dGhzIGFzIGFub255bW91cyAob3RoZXJ3aXNlLCB0aGUgY2xpZW50IAorICB3aWxsIGJlIGRyb3BwZWQgdW5sZXNzIHRoZXkgYXV0aCBhcyBhIHVzZXIpLgorLSB0aGUgQU5PTllNT1VTIHN1cHBvcnQgbWVhbnMgeW91IGNhbiBub3cgdXNlIEQtQnVzICh3aXRob3V0IGEgYnVzIGRhZW1vbikgYXMgCisgIGEgcHJvdG9jb2wgZm9yIGEgbmV0d29yayBzZXJ2aWNlIHByb3ZpZGVkIHRvIGFub255bW91cyBJbnRlcm5ldCBvciBMQU4gIAorICBjbGllbnRzCistIG1hbnkgaW50ZXJuYWwgY2hhbmdlcyB0byBiZXR0ZXIgc3VwcG9ydCB0aGUgV2luZG93cyBwb3J0LCB0aG91Z2ggdGhlIAorICBwb3J0IGlzIHN0aWxsIG5vdCBjb21wbGV0ZSBpbiB0aGlzIHJlbGVhc2UKKy0gc29tZSBpbXByb3ZlZCBkb2N1bWVudGF0aW9uIGFuZCByZXR1cm5faWZfZmFpbCBjaGVja3MKKy0gc29tZSBzbWFsbCBidWcgZml4ZXMKKworRC1CdXMgMS4xLjAgKDI1IE1heSAyMDA3KQorPT0KKy0gZmlyc3QgcmVsZWFzZSBpbiB0aGUgZGV2ZWxvcG1lbnQgc2VyaWVzLCB1bmxlc3MgeW91IG5lZWQgc3BlY2lmaWMgCisgIGZ1bmN0aW9uYWxpdHkgcGxlYXNlIHVzZSB0aGUgc3RhYmxlIHJlbGVhc2VzIGFzIEFQSSdzIG1heSBjaGFuZ2UKKyAgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykKKy0gYmV0dGVyIGVhdmVzZHJvcHBpbmcgc3VwcG9ydCBub3cgcGlja3MgdXAgcmVwbHkgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZworLSAucGMgZmlsZSBub3cgbGlzdHMgdGhlIGRpcmVjdG9yeSB0aGUgZGFlbW9uIGlzIGluc3RhbGxlZCBpbnRvIChkYWVtb25kaXIpCistIEdldEFsbCBjYWxsIGFkZGVkIHRvIHRoZSBwcm9wZXJ0aWVzIGludGVyZmFjZQorLSBzdXBwb3J0IGZvciBtZXNzYWdlIHNlcmlhbGl6YXRpb24gYWRkZWQgZm9yIHVzZSB3aXRoIGV4dGVybmFsIHRyYW5zcG9ydHMgbGlrZQorICBUVUJFUyEhIQorLSBtYW55IGJ1Z3MgZml4ZWQKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU3ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMTg0IEBACitTZWN0aW9ucyBpbiB0aGlzIGZpbGUgZGVzY3JpYmU6CisgLSBpbnRyb2R1Y3Rpb24gYW5kIG92ZXJ2aWV3CisgLSBsb3ctbGV2ZWwgdnMuIGhpZ2gtbGV2ZWwgQVBJCisgLSB2ZXJzaW9uIG51bWJlcnMKKyAtIG9wdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQKKyAtIEFCSSBzdGFiaWxpdHkgcG9saWN5CisKK0ludHJvZHVjdGlvbgorPT09CisKK0QtQnVzIGlzIGEgc2ltcGxlIHN5c3RlbSBmb3IgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gYW5kIGNvb3JkaW5hdGlvbi4KKworVGhlICJhbmQgY29vcmRpbmF0aW9uIiBwYXJ0IGlzIGltcG9ydGFudDsgRC1CdXMgcHJvdmlkZXMgYSBidXMgZGFlbW9uIHRoYXQgZG9lcyB0aGluZ3MgbGlrZToKKyAtIG5vdGlmeSBhcHBsaWNhdGlvbnMgd2hlbiBvdGhlciBhcHBzIGV4aXQKKyAtIHN0YXJ0IHNlcnZpY2VzIG9uIGRlbWFuZAorIC0gc3VwcG9ydCBzaW5nbGUtaW5zdGFuY2UgYXBwbGljYXRpb25zCisKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbG90cyBvZiBkb2N1bWVudGF0aW9uLCAKK21haWxpbmcgbGlzdHMsIGV0Yy4KKworU2VlIGFsc28gdGhlIGZpbGUgSEFDS0lORyBmb3Igbm90ZXMgb2YgaW50ZXJlc3QgdG8gZGV2ZWxvcGVycyB3b3JraW5nIG9uIEQtQnVzLgorCitJZiB5b3UncmUgY29uc2lkZXJpbmcgRC1CdXMgZm9yIHVzZSBpbiBhIHByb2plY3QsIHlvdSBzaG91bGQgYmUgYXdhcmUKK3RoYXQgRC1CdXMgd2FzIGRlc2lnbmVkIGZvciBhIGNvdXBsZSBvZiBzcGVjaWZpYyB1c2UgY2FzZXMsIGEgInN5c3RlbQorYnVzIiBhbmQgYSAiZGVza3RvcCBzZXNzaW9uIGJ1cy4iIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIG1vcmUgZGV0YWlsCitpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbiBhbmQgRkFRIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHNpdGUuCisKK0lmIHlvdXIgdXNlLWNhc2UgaXNuJ3Qgb25lIG9mIHRoZXNlLCBELUJ1cyBtYXkgc3RpbGwgYmUgdXNlZnVsLCBidXQKK29ubHkgYnkgYWNjaWRlbnQ7IHNvIHlvdSBzaG91bGQgZXZhbHVhdGUgY2FyZWZ1bGx5IHdoZXRoZXIgRC1CdXMgbWFrZXMKK3NlbnNlIGZvciB5b3VyIHByb2plY3QuCisKK1NlY3VyaXR5Cis9PQorCitJZiB5b3UgZmluZCBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgdGhhdCBpcyBub3Qga25vd24gdG8gdGhlIHB1YmxpYywKK3BsZWFzZSByZXBvcnQgaXQgcHJpdmF0ZWx5IHRvIGRidXMtc2VjdXJpdHlAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCitvciBieSByZXBvcnRpbmcgYSBmcmVlZGVza3RvcC5vcmcgYnVnIHRoYXQgaXMgbWFya2VkIGFzCityZXN0cmljdGVkIHRvIHRoZSAiRC1CVVMgc2VjdXJpdHkgZ3JvdXAiICh5b3UgbWlnaHQgbmVlZCB0byAiU2hvdworQWR2YW5jZWQgRmllbGRzIiB0byBoYXZlIHRoYXQgb3B0aW9uKS4KKworT24gVW5peCBzeXN0ZW1zLCB0aGUgc3lzdGVtIGJ1cyAoZGJ1cy1kYWVtb24gLS1zeXN0ZW0pIGlzIGRlc2lnbmVkCit0byBiZSBhIHNlY3VyaXR5IGJvdW5kYXJ5IGJldHdlZW4gdXNlcnMgd2l0aCBkaWZmZXJlbnQgcHJpdmlsZWdlcy4KKworT24gVW5peCBzeXN0ZW1zLCB0aGUgc2Vzc2lvbiBidXMgKGRidXMtZGFlbW9uIC0tc2Vzc2lvbikgaXMgZGVzaWduZWQKK3RvIGJlIHVzZWQgYnkgYSBzaW5nbGUgdXNlciwgYW5kIG9ubHkgYWNjZXNzaWJsZSBieSB0aGF0IHVzZXIuCisKK1dlIGRvIG5vdCBjdXJyZW50bHkgY29uc2lkZXIgRC1CdXMgb24gV2luZG93cyB0byBiZSBzZWN1cml0eS1zdXBwb3J0ZWQsCithbmQgd2UgZG8gbm90IHJlY29tbWVuZCBhbGxvd2luZyB1bnRydXN0ZWQgdXNlcnMgdG8gYWNjZXNzIFdpbmRvd3MKK0QtQnVzIHZpYSBUQ1AuCisKK05vdGU6IGxvdy1sZXZlbCBBUEkgdnMuIGhpZ2gtbGV2ZWwgYmluZGluZyBBUElzCis9PT0KKworQSBjb3JlIGNvbmNlcHQgb2YgdGhlIEQtQnVzIGltcGxlbWVudGF0aW9uIGlzIHRoYXQgImxpYmRidXMiIGlzCitpbnRlbmRlZCB0byBiZSBhIGxvdy1sZXZlbCBBUEkuIE1vc3QgcHJvZ3JhbW1lcnMgYXJlIGludGVuZGVkIHRvIHVzZQordGhlIGJpbmRpbmdzIHRvIEdMaWIsIFF0LCBQeXRob24sIE1vbm8sIEphdmEsIG9yIHdoYXRldmVyLiBUaGVzZQorYmluZGluZ3MgaGF2ZSB2YXJ5aW5nIGxldmVscyBvZiBjb21wbGV0ZW5lc3MgYW5kIGFyZSBtYWludGFpbmVkIGFzCitzZXBhcmF0ZSBwcm9qZWN0cyBmcm9tIHRoZSBtYWluIEQtQnVzIHBhY2thZ2UuIFRoZSBtYWluIEQtQnVzIHBhY2thZ2UKK2NvbnRhaW5zIHRoZSBsb3ctbGV2ZWwgbGliZGJ1cywgdGhlIGJ1cyBkYWVtb24sIGFuZCBhIGZldyBjb21tYW5kLWxpbmUKK3Rvb2xzIHN1Y2ggYXMgZGJ1cy1sYXVuY2guCisKK0lmIHlvdSB1c2UgdGhlIGxvdy1sZXZlbCBBUEkgZGlyZWN0bHksIHlvdSdyZSBzaWduaW5nIHVwIGZvciBzb21lCitwYWluLiBUaGluayBvZiB0aGUgbG93LWxldmVsIEFQSSBhcyBhbmFsb2dvdXMgdG8gWGxpYiBvciBHREksIGFuZCB0aGUKK2hpZ2gtbGV2ZWwgQVBJIGFzIGFuYWxvZ291cyB0byBRdC9HVEsrL0hUTUwuCisKK1ZlcnNpb24gbnVtYmVycworPT09CisKK0QtQnVzIHVzZXMgdGhlIGNvbW1vbiAiTGludXgga2VybmVsIiB2ZXJzaW9uaW5nIHN5c3RlbSwgd2hlcmUKK2V2ZW4tbnVtYmVyZWQgbWlub3IgdmVyc2lvbnMgYXJlIHN0YWJsZSBhbmQgb2RkLW51bWJlcmVkIG1pbm9yCit2ZXJzaW9ucyBhcmUgZGV2ZWxvcG1lbnQgc25hcHNob3RzLgorCitTbyBmb3IgZXhhbXBsZSwgZGV2ZWxvcG1lbnQgc25hcHNob3RzOiAxLjEuMSwgMS4xLjIsIDEuMS4zLCAxLjMuNAorU3RhYmxlIHZlcnNpb25zOiAxLjAsIDEuMC4xLCAxLjAuMiwgMS4yLjEsIDEuMi4zCisKK0FsbCBwcmUtMS4wIHZlcnNpb25zIHdlcmUgZGV2ZWxvcG1lbnQgc25hcHNob3RzLgorCitEZXZlbG9wbWVudCBzbmFwc2hvdHMgbWFrZSBubyBBQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMgZm9yIG5ldyBBQkkKK2ludHJvZHVjZWQgc2luY2UgdGhlIGxhc3Qgc3RhYmxlIHJlbGVhc2UuIERldmVsb3BtZW50IHNuYXBzaG90cyBhcmUKK2xpa2VseSB0byBoYXZlIG1vcmUgYnVncyB0aGFuIHN0YWJsZSByZWxlYXNlcywgb2J2aW91c2x5LgorCitDb25maWd1cmF0aW9uIAorPT09CisKK2RidXMgY291bGQgYmUgYnVpbGQgYnkgdXNpbmcgYXV0b3Rvb2xzIG9yIGNtYWtlLiAKKworV2hlbiB1c2luZyBhdXRvdG9vbHMgdGhlIGNvbmZpZ3VyZSBzdGVwIGlzIGluaXRpYXRlZCBieSBydW5uaW5nIC4vY29uZmlndXJlIAord2l0aCBvciB3aXRob3V0IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmbGFncy4gZGJ1cyByZXF1aXJlcyBHTlUgTWFrZQorKG9uIEJTRCBzeXN0ZW1zLCB0aGlzIGlzIHR5cGljYWxseSBjYWxsZWQgZ21ha2UpIG9yIGEgIm1ha2UiIGltcGxlbWVudGF0aW9uCit3aXRoIGNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKworV2hlbiB1c2luZyBjbWFrZSB0aGUgY29uZmlndXJlIHN0ZXAgaXMgaW5pdGlhdGVkIGJ5IHJ1bm5pbmcgdGhlIGNtYWtlIAorcHJvZ3JhbSB3aXRoIG9yIHdpdGhvdXQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzLiAKKworQ29uZmlndXJhdGlvbiBmbGFncworPT09CisKK1doZW4gdXNpbmcgYXV0b3Rvb2xzLCBydW4gIi4vY29uZmlndXJlIC0taGVscCIgdG8gc2VlIHRoZSBwb3NzaWJsZQorY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK1doZW4gdXNpbmcgY21ha2UsIGluc3BlY3QgUkVBRE1FLmNtYWtlIHRvIHNlZSB0aGUgcG9zc2libGUKK2NvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgIAorQVBJL0FCSSBQb2xpY3kKKz09PQorCitOb3cgdGhhdCBELUJ1cyBoYXMgcmVhY2hlZCB2ZXJzaW9uIDEuMCwgdGhlIG9iamVjdGl2ZSBpcyB0aGF0IGFsbAorYXBwbGljYXRpb25zIGR5bmFtaWNhbGx5IGxpbmtlZCB0byBsaWJkYnVzIHdpbGwgY29udGludWUgd29ya2luZworaW5kZWZpbml0ZWx5IHdpdGggdGhlIG1vc3QgcmVjZW50IHN5c3RlbSBhbmQgc2Vzc2lvbiBidXMgZGFlbW9ucy4KKworIC0gVGhlIHByb3RvY29sIHdpbGwgbmV2ZXIgYmUgYnJva2VuIGFnYWluOyBhbnkgbWVzc2FnZSBidXMgc2hvdWxkIAorICAgd29yayB3aXRoIGFueSBjbGllbnQgZm9yZXZlci4gSG93ZXZlciwgZXh0ZW5zaW9ucyBhcmUgcG9zc2libGUKKyAgIHdoZXJlIHRoZSBwcm90b2NvbCBpcyBleHRlbnNpYmxlLgorCisgLSBJZiB0aGUgbGlicmFyeSBBUEkgaXMgbW9kaWZpZWQgaW5jb21wYXRpYmx5LCB3ZSB3aWxsIHJlbmFtZSBpdCAKKyAgIGFzIGluIGh0dHA6Ly9vbWV0ZXIuY29tL3BhcmFsbGVsLmh0bWwgLSBpbiBvdGhlciB3b3JkcywgCisgICBpdCB3aWxsIGFsd2F5cyBiZSBwb3NzaWJsZSB0byBjb21waWxlIGFnYWluc3QgYW5kIHVzZSB0aGUgb2xkZXIgCisgICBBUEksIGFuZCBhcHBzIHdpbGwgYWx3YXlzIGdldCB0aGUgQVBJIHRoZXkgZXhwZWN0LgorCitJbnRlcmZhY2VzIGNhbiBhbmQgcHJvYmFibHkgd2lsbCBiZSBfYWRkZWRfLiBUaGlzIG1lYW5zIGJvdGggbmV3CitmdW5jdGlvbnMgYW5kIHR5cGVzIGluIGxpYmRidXMsIGFuZCBuZXcgbWV0aG9kcyBleHBvcnRlZCB0bworYXBwbGljYXRpb25zIGJ5IHRoZSBidXMgZGFlbW9uLgorCitUaGUgYWJvdmUgcG9saWN5IGlzIGludGVuZGVkIHRvIG1ha2UgRC1CdXMgYXMgQVBJLXN0YWJsZSBhcyBvdGhlcgord2lkZWx5LXVzZWQgbGlicmFyaWVzIChzdWNoIGFzIEdUSyssIFF0LCBYbGliLCBvciB5b3VyIGZhdm9yaXRlCitleGFtcGxlKS4gSWYgeW91IGhhdmUgcXVlc3Rpb25zIG9yIGNvbmNlcm5zIHRoZXkgYXJlIHZlcnkgd2VsY29tZSBvbgordGhlIEQtQnVzIG1haWxpbmcgbGlzdC4KKworTk9URSBBQk9VVCBERVZFTE9QTUVOVCBTTkFQU0hPVFMgQU5EIFZFUlNJT05JTkcKKworT2RkLW51bWJlcmVkIG1pbm9yIHJlbGVhc2VzICgxLjEueCwgMS4zLngsIDIuMS54LCBldGMuIC0KK21ham9yLm1pbm9yLm1pY3JvKSBhcmUgZGV2ZWwgc25hcHNob3RzIGZvciB0ZXN0aW5nLCBhbmQgYW55IG5ldyBBQkkKK3RoZXkgaW50cm9kdWNlIHJlbGF0aXZlIHRvIHRoZSBsYXN0IHN0YWJsZSB2ZXJzaW9uIGlzIHN1YmplY3QgdG8KK2NoYW5nZSBkdXJpbmcgdGhlIGRldmVsb3BtZW50IGN5Y2xlLgorCitBbnkgQUJJIGZvdW5kIGluIGEgc3RhYmxlIHJlbGVhc2UsIGhvd2V2ZXIsIGlzIGZyb3plbi4KKworQUJJIHdpbGwgbm90IGJlIGFkZGVkIGluIGEgc3RhYmxlIHNlcmllcyBpZiB3ZSBjYW4gaGVscCBpdC4gaS5lLiB0aGUKK0FCSSBvZiAxLjIuMCBhbmQgMS4yLjUgeW91IGNhbiBleHBlY3QgdG8gYmUgdGhlIHNhbWUsIHdoaWxlIHRoZSBBQkkgb2YKKzEuNC54IG1heSBhZGQgbW9yZSBzdHVmZiBub3QgZm91bmQgaW4gMS4yLnguCisKK05PVEUgQUJPVVQgU1RBVElDIExJTktJTkcKKworV2UgYXJlIG5vdCB5ZXQgZmlybWx5IGZyZWV6aW5nIGFsbCBydW50aW1lIGRlcGVuZGVuY2llcyBvZiB0aGUgbGliZGJ1cworbGlicmFyeS4gRm9yIGV4YW1wbGUsIHRoZSBsaWJyYXJ5IG1heSByZWFkIGNlcnRhaW4gZmlsZXMgYXMgcGFydCBvZgoraXRzIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlc2UgZmlsZXMgbWF5IG1vdmUgYXJvdW5kIGJldHdlZW4gdmVyc2lvbnMuCisKK0FzIGEgcmVzdWx0LCB3ZSBkb24ndCB5ZXQgcmVjb21tZW5kIHN0YXRpY2FsbHkgbGlua2luZyB0bworbGliZGJ1cy4gQWxzbywgcmVpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHByb3RvY29sIGZyb20gc2NyYXRjaCBtaWdodAoraGF2ZSB0byB3b3JrIHRvIHN0YXkgaW4gc3luYyB3aXRoIGhvdyBsaWJkYnVzIGJlaGF2ZXMuCisKK1RvIGxvY2sgdGhpbmdzIGRvd24gYW5kIGRlY2xhcmUgc3RhdGljIGxpbmtpbmcgYW5kIHJlaW1wbGVtZW50YXRpb24gdG8KK2JlIHNhZmUsIHdlJ2QgbGlrZSB0byBzZWUgYWxsIHRoZSBpbnRlcm5hbCBkZXBlbmRlbmNpZXMgb2YgbGliZGJ1cworKGZvciBleGFtcGxlLCBmaWxlcyByZWFkKSB3ZWxsLWRvY3VtZW50ZWQgaW4gdGhlIHNwZWNpZmljYXRpb24sIGFuZAord2UnZCBsaWtlIHRvIGhhdmUgYSBoaWdoIGRlZ3JlZSBvZiBjb25maWRlbmNlIHRoYXQgdGhlc2UgZGVwZW5kZW5jaWVzCithcmUgc3VwcG9ydGFibGUgb3ZlciB0aGUgbG9uZyB0ZXJtIGFuZCBleHRlbnNpYmxlIHdoZXJlIHJlcXVpcmVkLgorCitOT1RFIEFCT1VUIEhJR0gtTEVWRUwgQklORElOR1MKKworTm90ZSB0aGF0IHRoZSBoaWdoLWxldmVsIGJpbmRpbmdzIGFyZSBfc2VwYXJhdGUgcHJvamVjdHNfIGZyb20gdGhlCittYWluIEQtQnVzIHBhY2thZ2UsIGFuZCBoYXZlIHRoZWlyIG93biByZWxlYXNlIGN5Y2xlcywgbGV2ZWxzIG9mCittYXR1cml0eSwgYW5kIEFCSSBzdGFiaWxpdHkgcG9saWNpZXMuIFBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uCitmb3IgeW91ciBiaW5kaW5nLgorCitCb290c3RyYXBwaW5nIEQtQnVzIG9uIG5ldyBwbGF0Zm9ybXMKKz09PQorCitBIGZ1bGwgYnVpbGQgb2YgRC1CdXMsIHdpdGggYWxsIHJlZ3Jlc3Npb24gdGVzdHMgZW5hYmxlZCBhbmQgcnVuLCBoYXMgc29tZQorZGVwZW5kZW5jaWVzIHdoaWNoIHRoZW1zZWx2ZXMgZGVwZW5kIG9uIEQtQnVzLCBlaXRoZXIgZm9yIGNvbXBpbGF0aW9uIG9yCitmb3Igc29tZSBvZiAqdGhlaXIqIHJlZ3Jlc3Npb24gdGVzdHM6IEdMaWIsIGRidXMtZ2xpYiBhbmQgZGJ1cy1weXRob24gYXJlCitjdXJyZW50bHkgYWZmZWN0ZWQuCisKK1RvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcywgd2hlbiBib290c3RyYXBwaW5nIEQtQnVzIGZvciB0aGUgZmlyc3QgdGltZQorb24gYSBuZXcgT1Mgb3IgQ1BVIGFyY2hpdGVjdHVyZSwgeW91IGNhbiBlaXRoZXIgY3Jvc3MtY29tcGlsZSBzb21lIG9mCit0aG9zZSBjb21wb25lbnRzLCBvciBjaG9vc2UgdGhlIGJ1aWxkIG9yZGVyIGFuZCBvcHRpb25zIGNhcmVmdWxseToKKworKiBidWlsZCBhbmQgaW5zdGFsbCBELUJ1cyB3aXRob3V0IHRlc3RzCisgIC0gZG8gbm90IHVzZSB0aGUgLS1lbmFibGUtbW9kdWxhci10ZXN0cz15ZXMgY29uZmlndXJlIG9wdGlvbgorICAtIGRvIG5vdCB1c2UgdGhlIC0tZW5hYmxlLXRlc3RzPXllcyBjb25maWd1cmUgb3B0aW9uCisqIGJ1aWxkIGFuZCBpbnN0YWxsIEdMaWIsIGFnYWluIHdpdGhvdXQgdGVzdHMKKyogdXNlIHRob3NlIHZlcnNpb25zIG9mIGxpYmRidXMgYW5kIEdMaWIgdG8gYnVpbGQgYW5kIGluc3RhbGwgZGJ1cy1nbGliCisqIC4uLiBhbmQgdXNlIHRob3NlIHRvIGluc3RhbGwgZGJ1cy1weXRob24KKyogcmVidWlsZCBsaWJkYnVzOyB0aGlzIHRpbWUgeW91IGNhbiBydW4gYWxsIG9mIHRoZSB0ZXN0cworKiByZWJ1aWxkIEdMaWI7IHRoaXMgdGltZSB5b3UgY2FuIHJ1biBhbGwgb2YgdGhlIHRlc3RzCmRpZmYgLS1naXQgYS9SRUFETUUuY3lnd2luIGIvUkVBRE1FLmN5Z3dpbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MDRjYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLmN5Z3dpbgpAQCAtMCwwICsxLDYgQEAKK1RoZSBjeWd3aW4gZGJ1cyBwb3J0IGlzIGluY2x1ZGVkIGluIG1hc3RlciBicmFuY2ggb2YKK2RidXMgZ2l0IHJlcG9zaXRvcnkgc2luY2UgMS4zLjEuCisKK1RoZSBjeWd3aW4gcG9ydCBvZiBkYnVzIGlzIG1haW50YWluZWQgYnk6CisKK2h0dHA6Ly9zb3VyY2V3YXJlLm9yZy9jeWd3aW5wb3J0cy8KZGlmZiAtLWdpdCBhL1JFQURNRS5sYXVuY2hkIGIvUkVBRE1FLmxhdW5jaGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxZTU3ZAotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5sYXVuY2hkCkBAIC0wLDAgKzEsNjEgQEAKK0xhdW5jaGRbMSwyXSByZXBsYWNlcyBpbml0LCBpbmV0ZCBhbmQgY3JvbiBvbiBNYWMgT1MgWCBzaW5jZSAxMC40ICJUaWdlciIuCitkYnVzIHVzZXMgdGhpcyBzZXJ2aWNlIHRvIHByb3ZpZGUgYSBjb21tb24gc2Vzc2lvbiBidXMgYWRkcmVzcyBmb3IgZWFjaCB1c2VyCithbmQgc28gZGVwcmVjYXRlcyB0aGUgWDExIGVuYWJsZWQgZGJ1cy1sYXVuY2hlci4KKworWzFdIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL01hY09zWC9sYXVuY2hkLmh0bWwKK1syXSBodHRwOi8vbGF1bmNoZC5tYWNvc2ZvcmdlLm9yZy8KKworCitTZXR1cAorPT09CisKK0NvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLWxhdW5jaGQgYW5kIC0td2l0aG91dC14IChYMTEgc2hvdWxkIG5vdCBoYXJtIGJ1dCBpdCdzCitzaW1wbHkgbm90IG5lY2Vzc2FyeSBhbnkgbW9yZSkKK0FmdGVyIGluc3RhbGxhdGlvbiwgdG8gcHJldmVudCBhIHJlYm9vdCwgbG9hZCB0aGUgZGJ1cyBzZXNzaW9uIHN0YXJ0ZXIgaW50bworbGF1bmNoZCBieSBleGVjdXRpbmc6CiskIGxhdW5jaGN0bCBsb2FkIC9MaWJyYXJ5L0xhdW5jaEFnZW50cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CisKK1lvdSBjYW4gY2hhbmdlIHRoZSBsYXVuY2ggYWdlbnQgZGlyIHZpYSBjb25maWd1cmUsIGJ1dCBpdCdzIG5vdCByZWNvbW1lbmRlZC4KK01ha2Ugc3VyZSB0byBleGVjdXRlIHRoZSBhYm92ZSBsaW5lIGFzIHRoZSBhY3R1YWwgdXNlciBmb3Igd2hpY2ggeW91IHdhbnQgdG8KK3VzZSBhIHNlc3Npb24gYnVzIHNpbmNlIGxhdW5jaGQgbWFuYWdlcyBpdHMgYWdlbnRzIG9uIGEgcGVyIHVzZXIgYmFzaXMuCisKKworSG93IGl0IHdvcmtzCis9PT0KKworTGF1bmNoZCBhbGxvY2F0ZXMgYSBzb2NrZXQgYW5kIHByb3ZpZGVzIHRoZSB1bml4IHBhdGggdG8gaXQgdmlhIHRoZSB2YXJpYWJsZQorREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCBpbiBsYXVuY2hkJ3MgZW52aXJvbm1lbnQuIEV2ZXJ5IHByb2Nlc3MKK3NwYXduZWQgYnkgbGF1bmNoZCAob3IgZGJ1cy1kYWVtb24sIGlmIHN0YXJlZCBieSBsYXVuY2hkKSBjYW4gYWNjZXNzIGl0IHRocm91Z2gKK2l0cyBvd24gZW52aXJvbm1lbnQuIE90aGVyIHByb2Nlc3NlcyBjYW4gcXVlcnkgbGF1bmNoZCBmb3IgaXQgYnkgZXhlY3V0aW5nOgorJCBsYXVuY2hjdGwgZ2V0ZW52IERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQKK0hvd2V2ZXIsIHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUgZGJ1cyBjbGllbnQgbGliIGZvciB5b3UuCisKK0lmIGxhdW5jaGQgc3RhcnQgZGJ1cy1kYWVtb24gd2l0aCBhIGNvbmZpZyBmaWxlIGNvbnRhaW5pbmcgYSAibGF1bmNoZDplbnY9Rk9PIgorYWRkcmVzcywgYXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiBjb25maWcgZG9lcyB3aXRoIGVudj1EQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VULAordGhlIGRhZW1vbiB3aWxsIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gbGF1bmNoZCBhbmQgc3RhcnQgbGlzdGVuaW5nIG9uIGl0LgorVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgc29ja2V0IHBhdGggd2hpY2ggaXMgcGFzc2VkCit0byBldmVyeSBzZXJ2aWNlIHNwYXduZWQgYnkgZGJ1cy1kYWVtb24gYXMgYSByZXN1bHQgZnJvbSBhdXRvbGF1bmNoIG1lc3NhZ2VzLgorUGxlYXNlIG5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byBzdGFydCBkYnVzLWRhZW1vbiBtYW51YWxseSB3aGVuIHVzaW5nIGEKKyJsYXVuY2hkOiIgYWRkcmVzcy4gT25seSBjaGlsZCBwcm9jZXNzZXMgb2YgbGF1bmNoZCBjYW4gYWNjZXNzIHRoZSBhYm92ZQorbWVudGlvbmVkIGZpbGUgZGVzY3JpcHRvciEKKworVG8gY3JlYXRlIGN1c3RvbSBidXNlcyBqdXN0IHNldCB1cCBhbiBvdGhlciBsYXVuY2ggYWdlbnQuIEFzIGEgcXVpY2sgc3RhcnQgY29weQorL0xpYnJhcnkvTGF1bmNoQWdlbnRzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QsIGNoYW5nZSB0aGUgbGFiZWwKK3RvIGkuZS4gIm9yZy5mcmVlZGVza3RvcC5kYnVzLWZvbyIgYW5kIGNoYW5nZSB0aGUgU2VjdXJlU29ja2V0V2l0aEtleSB2YWx1ZSwKK2kuZS4gdG8gIkRCVVNfTEFVTkNIRF9GT09fQlVTX1NPQ0tFVCIuIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIHRvIGJlIHNldAoraW4gdGhlIGNvbmZpZyBmaWxlIGZvciB5b3VyIG5ldyBidXMgaW4gdGhlIDxsaXN0ZW4+IGVsZW1lbnQgKHNlZSBzZXNzaW9uLmNvbmZpZykuCitUaGVuIGVkaXQgeW91ciAvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtZm9vLnBsaXN0IHRvIHN0YXJ0CitkYnVzLWRhZW1vbiB3aXRoICItLWNvbmZpZy1maWxlPS9vcHQvbG9jYWwvZXRjL2RidXMtMS9mb28uY29uZiIgaW5zdGVhZCBvZgorIi0tc2Vzc2lvbiIuIE5vdyBsb2FkIHRoZSBuZXcgcGxpc3Qgb250byBsYXVuY2hkIGFzIGRlc2NyaWJlZCBpbiB0aGUgc2V0dXAKK3NlY3Rpb24gb2YgdGhpcyBkb2N1bWVudC4KK0V4ZWN1dGluZyAibGF1bmNoY3RsIGV4cG9ydCIgc2hvdWxkIG5vdyBnaXZlIHlvdSB0d28gc29ja2V0cywgb25lIGluCitEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUIGFuZCB0aGUgbmV3IERCVVNfTEFVTkNIRF9GT09fQlVTX1NPQ0tFVC4KK1RvIGNvbm5lY3QgdG8gdGhpcyBuZXcgYnVzIHVzZSAibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX0ZPT19CVVNfU09DS0VUIi4KKworU2luY2UgTWFjIE9TIFggMTAuNSAiTGVvcGFyZCIgeW91IGNhbiBhbHNvIGNvbmZpZ3VyZSBsYXVuY2hkIHRvIHN0YXJ0CitkYnVzLWRhZW1vbiBvbiBkZW1hbmQgYXMgc29vbiBhcyBzb21lIHByb2Nlc3MgY29ubmVjdHMgdG8gdGhlIHNvY2tldC4gU2luY2UKK2l0J3MgYnJva2VuIG9uIDEwLjQgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIHBlciBkZWZhdWx0LiBMb29rIGF0CisvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdCB0byBjaGFuZ2UgaXQuCisKK09uIHRoZSBjbGllbnQgc2lkZSwgdGhlIGVudnZhciBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgY2FuIGJlIG5vcm1hbGx5IHVzZWQKK2J1dCBpZiBpdCdzIG5vdCBzZXQsIGxhdW5jaGQgaXMgcXVlcmllZCBmb3IgdGhlIHNlc3Npb24gYnVzIHNvY2tldC4KZGlmZiAtLWdpdCBhL1JFQURNRS52YWxncmluZCBiL1JFQURNRS52YWxncmluZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNmNTMwCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLnZhbGdyaW5kCkBAIC0wLDAgKzEsMjQgQEAKK1J1bm5pbmcgRC1CdXMgY2xpZW50cyB3aXRoIFZhbGdyaW5kCis9PT09CisKK1doZW4gcnVubmluZyBwcm9ncmFtcyB1c2luZyBsaWJkYnVzIGluIFZhbGdyaW5kLCBzb21lIHNwZWNpYWwgY2FyZSBuZWVkcyB0byBiZQordGFrZW4gc28gYXMgdG8gYXZvaWQgaW5jb3JyZWN0IGRldGVjdGlvbiBvZiBsZWFrcyBpbiBsaWJkYnVzLiBUbyBhdm9pZCB0aGVzZQorZmFsc2UgcG9zaXRpdmVzLCBkbyB0aGUgZm9sbG93aW5nOgorCisqIEdyYWIgYSBjb3B5IG9mIHRoZSBELUJ1cyBzb3VyY2UgY29kZQorCisqIFJ1biBjb25maWd1cmUgd2l0aCB0aGUgLS1lbmFibGUtZGV2ZWxvcGVyIGFuZCAtLXdpdGgtdmFsZ3JpbmQgb3B0aW9ucworCisqIFJ1biBtYWtlCisKKyogRWl0aGVyIG1ha2Ugc3VyZSB5b3VyIGNvZGUgY2FsbHMgZGJ1c19zaHV0ZG93bigpIChhdCBsZWFzdCB3aGlsZSBydW5uaW5nIGluCisgIFZhbGdyaW5kKSBvciBzZXQgREJVU19NRVNTQUdFX0NBQ0hFPTAgaW4geW91ciBlbnZpcm9ubWVudAorCisqIFJ1biBWYWxncmluZCBvbiB5b3VyIHByb2dyYW0gd2l0aCB0aGUgL3BhdGgvdG8vZGJ1cy9zb3VyY2UvZGJ1cy8ubGlicyBpbiB5b3VyCisgIExEX0xJQlJBUllfUEFUSAorCitZb3VyIFZhbGdyaW5kIGxvZyBzaG91bGQgbm93IGJlIGZyZWUgb2YgYW55IChzcHVyaW91cykgbGliZGJ1cy1yZWxhdGVkIGxlYWtzLgorCitGb3IgdGhlIGN1cmlvdXMsIHRoZSBEQlVTX01FU1NBR0VfQ0FDSEU9MCBpcyByZXF1aXJlZCBiZWNhdXNlIGJ5CitkZWZhdWx0LCBsaWJkYnVzIHVzZXMgYSByZWN5Y2xhYmxlIHBvb2wgb2YgbWVzc2FnZSBzdHJ1Y3RzLiBUaGVzZSBoZWxwCitwZXJmb3JtYW5jZSBhIGJpdC4KZGlmZiAtLWdpdCBhL1JFQURNRS53aW4gYi9SRUFETUUud2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUud2luCkBAIC0wLDAgKzEsMTE0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2luZG93cyBwb3J0IG9mIHRoZSBmcmVlZGVza3RvcC5vcmcgRC1CdXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZlYXR1cmVzIGFuZCBjb21wbGV0ZW5lc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSB3aW5kb3dzIHBvcnQgb2YgZGJ1cyBwcm92aWRlcyB0aGUgZGJ1cy0xIGxpYnJhcnkgYW5kIG1vc3RseQorYXBwbGljYXRpb25zIHdoaWNoIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBvbiB1bml4LiBUaGVzZSBhcHBsaWNhdGlvbnMKK2FyZTogZGJ1cy1kYWVtb24sIGRidXMtbGF1bmNoLCBkYnVzLW1vbml0b3IgYW5kIGRidXMtc2VuZC4KK0RCdXMgY29tZXMgd2l0aCBhIHRlc3Qgc3VpdGUgd2hpY2ggaXMgdXNlZCBvbiB1bml4IHRvIGd1YXJhbnRhdGUKK3Byb2R1Y3Rpb24gcXVhbGl0eSBhbmQgdGhpcyB0ZXN0IHN1aXRlIHJ1bnMgbW9zdGx5LiBUaGVyZSBhcmUgc29tZQordGVzdCBub3QgcnVubmluZyB5ZXQgYW5kIHRoZXJlIGlzIGhlbHAgbmVlZGVkIHRvIGdldCB0aGVtIHJ1bm5pbmcuCisKK1N1cHBvcnRlZCBjb21waWxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK09uIHdpbmRvd3MgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxMCAoRXhwcmVzcyBhbmQgcHJvZmVzc2lvbmFsIHZhcmlhbnRzKQorYW5kIG1pbmd3LXc2NHwzMiBhcmUga25vd24gdG8gd29yay4KKworQnVpbGRpbmcKKy0tLS0tLS0tCitEQnVzIGNhbiBiZSBidWlsdCBvbiB3aW5kb3dzIHVzaW5nIGF1dG9tYWtlIG9yIGNtYWtlLiBTZWUgdGhlCitmaWxlIElOU1RBTEwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK3dpbmRidXMgYW5kIGRidXM0d2luIFBvcnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIFdpbmRvd3MgcG9ydHMgZnJvbSB0aGUgd2luZGJ1cyBhbmQgZGJ1czR3aW4gcHJvamVjdHMgaGFzIGJlZW4gbWVyZ2VkCitpbnRvIHRoZSBmcmVlZGVza3RvcCBnaXQgbWFzdGVyIGJyYW5jaCwgYXMgYXBwbGljYWJsZS4gVGhlIHNwZWMgaGFzIGJlZW4KK3VwZGF0ZWQgd2l0aCB3aW5kb3dzIHNwZWNpZmljIHN0dWZmLgorCisKK1Rlc3RzCistLS0tLQorIC0gcnVuIGNvbXBsZXRlIHRlc3Qgc3VpdGUKKyAgICAgbWFrZSBjaGVjaworICAgb3IKKyAgICAgY3Rlc3QgWy1WXQorCisgLSBkYnVzIGxpYnJhcnkgY2hlY2sKKyAgICBjdGVzdCBbLVZdIC1SIHRlc3QtZGJ1cworCisgLSBidXMgZGFlbW9uIGNoZWNrCisgICAgY3Rlc3QgWy1WXSAtUiB0ZXN0LWJ1cworCisgLSBjaGVjayBhdmFpbGFibGUgbmFtZXMKKyAgICBjdGVzdCBbLVZdIC1SIHRlc3QtbmFtZXMKKworIC0gY2hlY2sgaWYgZGJ1cy1kYWVtb24gaXMgYWNjZXNzYWJsZQorICAgIGJpblxkYnVzLXNlbmQuZXhlIC0tc2Vzc2lvbiAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0TmFtZXMgbWV0aG9kIHJldHVybiBzZW5kZXI9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLT4gZGVzdD06MS40IGFycmF5IFsgc3RyaW5nICJvcmcuZnJlZWRlc2t0b3AuREJ1cyJzdHJpbmcgIjoxLjQiXQorCisgLSBzdGFydCBzZXNzaW9uIGRidXMtZGFlbW9uCisgICAgZWl0aGVyIGJ5IHJ1bm5pbmcKKyAgICAgICAgYmluXGRidXMtbGF1bmNoCisgICAgb3IKKyAgICAgICAgc3RhcnQgYmluXGRidXMtZGFlbW9uIC0tc2Vzc2lvbgorCisgICAgQmVmb3JlIHJ1bm5pbmcgdGhlc2UgY29tbWFuZHMgeW91IG1heSBleGVjdXRlCisgICAgICAgIHNldCBEQlVTX1ZFUkJPU0U9MQorICAgIGZvciBnZXR0aW5nIGRlYnVnIGluZm9zCisKKworIC0gY2FsbCBmdW5jdGlvbiByZWdpc3RlcmQgaW4gZGJ1cworICAgIGJpblxkYnVzLXNlbmQuZXhlICAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLS1wcmludC1yZXBseSAtLXR5cGU9bWV0aG9kX2NhbGwgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUgc3RyaW5nOm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlICB1aW50MzI6NDU1IG1ldGhvZCByZXR1cm4gc2VuZGVyPW9yZy5mcmVlZGVza3RvcC5EQnVzIC0+IGRlc3Q9OjEuOCB1aW50MzIgMgorCisgICAgbm90ZTogV2hlbiBidWlsZGluZyB3aXRoIHRoZSBWaXN1YWwgQysrIElERSB0aGUgKi5leGUgZmlsZXMgYXJlIGluCisgICAgICAgICAgdGhlIGJpbi9EZWJ1ZyBhbmQgYmluL1JlbGVhc2UgZm9sZGVyLCBub3QgaW4gdGhlIGJpbiBmb2xkZXIuCisKKworRkFRCistLS0KKworLSBIb3cgZmFyIGlzIFdpbkRCdXMgZnJvbSBiZWluZyB1c2FibGUgZm9yIHByb2R1Y3Rpb24gPworCisgIGRidXMgY29tZXMgd2l0aCBhIHRlc3Qgc3VpdGUgd2hpY2ggaXMgdXNlZCBvbiB1bml4IHRvIGd1YXJhbnRhdGUKKyAgcHJvZHVjdGlvbiBxdWFsaXR5IGFuZCB0aGlzIHRlc3Qgc3VpdGUgcnVucyBtb3N0bHkuIFRoZXJlIGFyZSBzb21lCisgIHRlc3Qgbm90IHJ1bm5pbmcgYW5kIHdlIG5lZWQgaGVscCB0byBnZXQgdGhlbSBydW5uaW5nLgorICBJbiB0aGUgcHJhdGljZSBJIGFuZCBzb21lIG90aGVyIHBlb3BsZSBhcmUgdXNpbmcgZGJ1cyBmb3IgYXQgbGVhc3QgbW9yZQorICB0aGFuIGZvdXIgeWVhcnMgaW4gY29uanVuY3Rpb24gd2l0aCBrZGUgb24gd2luZG93cyB3aXRob3V0IGFueSBwcm9ibGVtcy4KKworLSBPbiBVTklYIEQtQnVzIHVzZXMgVU5JWCBzb2NrZXRzIHRvIGNvbW11bmljYXRlIChjb3JyZWN0IG1lIGlmIEknbSB3cm9uZykuCisgIFdoYXQgaXMgdXNlZCBvbiBXaW5kb3dzID8KKworICB0Y3Agc29ja2V0cywgdGhlcmUgYXJlIHNvbWUgZWZmb3J0cyB0byBnZXQgbmFtZWQgcGlwZSBydW5uaW5nLCBidXQgc29tZQorICBkZXNpZ24gcHJvYmxlbXMgb2YgdGhlIHdpbjMyIGFwaSwgd2UgYXJlIG5vdCBhYmxlIHRvIHNvbHZlIHdpdGhvdXQKKyAgYmlnZ2VyIGNoYW5nZXMgdG8gdGhlIGRidXMgY29kZSBiYXNlIGxldCB1cyBzdG9wIHRoaXMgZWZmb3J0LgorCistIERvIHlvdSBoYXZlIGFueSBjbHVlIGlmIGRidXMtd2luMzIgY2FuIHJ1biBpbiBhIFdpbmRvd3MgQ0UgZW52aXJvbm1lbnQ/CisKKyAgZGJ1cyBoYXMgYmVlbiBwb3J0ZWQgdG8gd2luY2UsIHNlZSBSRUFETUUud2luY2UgZm9yIG1vcmUgaW5mb3JtYXRpb24KKworLSBEbyB5b3Uga25vdyBpZiB0aGUgQysrIGJpbmRpbmcgbWFkZSBieSBPcGVuV2VuZ28gd2lsbCBiZSBlYXNpbHkgcG9ydGFibGUgdG8gV2luZG93cz8KKworICBUaGUgT3BlbldlbmdvIGRidXMtYysrIGJpbmRpbmcgaGFzIGJlZW4gcG9ydGVkIHRvIHdpbmRvd3Mgc2VlIGluIFdpbkRCdXMgc3ZuCisgIChodHRwOi8vc2YubmV0L3Byb2plY3RzL3dpbmRidXMpCisgIFRoZSByZWxhdGVkIHRlc3QgYXBwbGljYXRpb25zIGFyZSBydW5uaW5nIHdlbGwuCisKKworVE9ETworLS0tLQorCitPY3RvYmVyIDIwMTA6CisKKy0gdGhlIGNvZGUgd3JhcHBlZCB3aXRoIERCVVNfV0lOX0ZJWE1FIHNob3VsZCBiZSBpbnNwZWN0ZWQgaWYgaXQgcmVxdWlyZWQgZm9yIHdpbmRvd3MKKworLSBjcmVhdGUgYSBkYnVzIHNldHVwIGluc3RhbGxlcgorCistIGltcGxlbWVudCBzeXN0ZW0gYnVzIGFuZCBzeXN0ZW0gYnVzIHNlcnZpY2Ugc3RhcnRlcgorICBzZWUgaHR0cDovL3dpbmRidXMuc3ZuLnNvdXJjZWZvcmdlLm5ldC92aWV3dmMvd2luZGJ1cy90cnVuay9idXMvYnVzLXNlcnZpY2Utd2luLmMKKyAgZm9yIGEgc3RhcnRpbmcgcG9pbnQKKworLSBpbXBsZW1lbnQgYSByZWFsIGxvZ2luIHNlc3Npb24gYnVzCisgIFRoZSBzY29wZSBwYXJhbWV0ZXIgb2YgdGhlIGF1dG9sYXVuY2ggbWV0YSBwcm90b2NvbCBjb3VsZCBiZSBleHRlbmRlZCB0byBzdXBwb3J0IHVzZXIKKyAgc3BlY2lmaWMgc2Vzc2lvbiBidXNzZXMgKGxpa2UgYWxyZWFkeSBkb25lIHdpdGggdGhlIGFtYXJvayBidW5kbGVkIGRidXMgd2hpY2ggdXNlIGEKKyAgc2hhcmVkIG1lbW9yeSBhcmVhIG5hbWVkICJEQnVzRGFlbW9uQWRkcmVzc0luZm86PHVzZXJuYW1lPiIuCisgIEFsc28gdGhlIGRidXMgaW5zdGFsbGVyIHNob3VsZCBzdGFydCBhIHNlc3Npb24gYnVzIG9uIHVzZXIgbG9naW4uCmRpZmYgLS1naXQgYS9SRUFETUUud2luY2UgYi9SRUFETUUud2luY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MGRjZgotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS53aW5jZQpAQCAtMCwwICsxLDgxIEBACitEQnVzIERhZW1vbiBmb3IgV2luZG93cyBDRS9XaW5kb3dzIE1vYmlsZSA2LjUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCdWdzIGluIHVwc3RyZWFtIGZvciBhbnkgd2luZG93IHZlcnNpb246CisqIE1vdmVGaWxlRXhBIDwgMCByZXN1bHQgY2hlY2sgYnVnCisqIGRvdWJsZSBkYnVzX2ZyZWUgc29tZXdoZXJlIEkgZm9yZ290IHdoZXJlIChjaGVjayBpbiAtdWdseSkKKyogYWxpZ25tZW50IGlzc3VlCisqIENyZWF0ZVByb2Nlc3MgcHJvY2VzcyBpbmZvcm1hdGlvbiBoYW5kbGUgbGVhaworKiBfZGJ1c19nZXRzaWQgTlVMTCB2cyBJTlZBTElEX0hBTkRMRV9WQUxVRQorKiB3aW5fYWNjb3VudF90b19zaWQKKworQ3VzdG9taXNhdGlvbgorPT09PT09PT09PT09PQorCisxKSBBdCBpbnN0YWxsYXRpb24sIHRoZSBmb2xsb3dpbmcgcmVnaXN0cnkgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUKK2luc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgdGhlIGRidXMgaW5zdGFsbGF0aW9uICh0aGUgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBiaW4sIGV0Yywgc2hhcmUgZm9sZGVycyk6CisKK0hLTE1cU29mdHdhcmVcZnJlZWRlc2t0b3BcREJ1c1xJbnN0YWxsIERpcmVjdG9yeQorCisyKSBJbnN0ZWFkIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIERCVVNfVkVSQk9TRSwgdXNlCitIS0xNXFNvZnR3YXJlXGZyZWVkZXNrdG9wXERCdXNcVmVyYm9zZQorCisyKSBUaGUga2V5cmluZyBkaXJlY3RvcnkgaXMgTVlET0NVTUVOVFNcZGJ1cy1rZXlyaW5ncywgbm90CitIT01FUEFUSFwuZGJ1cy1rZXlyaW5ncy4KKworCitDb21waWxhdGlvbgorPT09PT09PT09PT0KKworLi9jb25maWd1cmUgLS1ob3N0PWFybS1taW5ndzMyY2UgQ1BQRkxBR1M9LUkvcGF0aC90by9leHBhdC9pbmNsdWRlIExERkxBR1M9LUwvcGF0aC90by9leHBhdC9saWIKKworQSByZWNlbnQgdmVyc2lvbiBvZiBsaWJ0b29sIGlzIHJlcXVpcmVkLCB3aXRoIHRoaXMgY2hhbmdlOgorCisyMDEwLTAyLTI4ICBQaWVycmUgT3NzbWFuICA8b3NzbWFuQG9zc21hbi5sa3BnLmNlbmRpby5zZT4gICh0aW55IGNoYW5nZSkKKyAgICAgICAgICAgIFJhbGYgV2lsZGVuaHVlcyA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworICAgICAgIEZpeCBkZXBsaWJzIGNoZWNrIGZhbGxiYWNrIGZvciA2NC1iaXQgV2luZG93cyBhbmQgV2luZG93cyBDRS4KKyAgICAgICAqIGxpYmx0ZGwvbTQvbGlidG9vbC5tNCAoX0xUX0NIRUNLX01BR0lDX01FVEhPRCk6IEFjY2VwdCBmaWxlIGZvcm1hdHMKKyAgICAgICAncGUtYXJtLXdpbmNlJyBhbmQgJ3BlLXg4Ni02NCcuICBBZGQgbm90ZSBhYm91dCBjb25zaXN0ZW5jeSB3aXRoIC4uLgorICAgICAgICogbGlibHRkbC9jb25maWcvbHRtYWluLm00c2ggKGZ1bmNfd2luMzJfbGliaWQpOiAuLi4gdGhlIHJlc3BlY3RpdmUKKyAgICAgICBwYXR0ZXJuIGhlcmU7IHN5bmMgcGF0dGVybiBmcm9tIHRoZSBmb3JtZXIuCisgICAgICAgKiB0ZXN0cy9kZXBsaWJzLW1pbmd3LmF0IChkZXBsaWJzIHdpdGhvdXQgZmlsZSBjb21tYW5kKTogTmV3CisgICAgICAgZmlsZSwgbmV3IHRlc3QuCisgICAgICAgKiBNYWtlZmlsZS5hbSAoVEVTVFNVSVRFX0FUKTogVXBkYXRlLgorICAgICAgICogTkVXUzogVXBkYXRlLgorCisKK01CIHZzIFdDSEFSCis9PT09PT09PT09PQorCitXaW5kb3dzIENFIG9ubHkgc3VwcG9ydHMgdGhlIFVuaWNvZGUgaW50ZXJmYWNlLCB3aGlsZSBEQnVzIERhZW1vbiB1c2VzCit0aGUgTXVsdGktQnl0ZSBpbnRlcmZhY2Ugb24gV2luZG93cyBieSBkZWZhdWx0LiAgVGhlIGdsdWUgY29kZSBkb2VzCitub3Qgc3VwcG9ydCBtdWx0aWJ5dGUgaW4gYWxsIGNhc2VzLiAgSW4gcGFydGljdWxhciwgdGhlIF9tYnNyY2hyCitmdW5jdGlvbiBpcyBub3QgY29ycmVjdGx5IGltcGxlbWVudGVkLiAgSXQgY291bGQgYmUgY29ycmVjdGx5CitpbXBsZW1lbnRlZCwgb3IgZGJ1cyBkYWVtb24gY291bGQgdXNlIHRoZSB3Y2hhciBpbnRlcmZhY2UgbW9yZQorY29uc2lzdGVudGx5IG9uIGFsbCBXaW5kb3dzIHRhcmdldHMuICBGb3Igbm93LCB0aGUgV2luZG93cyBDRSBwb3J0Cit3aWxsIG9ubHkgd29yayBmb3IgZmlsZXN5c3RlbXMgd2l0aG91dCBzb21lIHdlaXJkIGNoYXJhY3RlcnMgaW4gZmlsZQorbmFtZXMuICBJcyB0aGlzIGEgc2VyaW91cyBsaW1pdGF0aW9uPworCisKK0tub3duIElzc3VlcworPT09PT09PT09PT09CisKK0F1dG9sYXVuY2ggaXMgYnJva2VuIHNvIGZhci4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBmYWtlZC4gIFNvbWUgYXJlIHB1bnRlZCB0byB0aGUgcmVnaXN0cnksIGJ1dAoraW4gYW55IGNhc2UgdGhleSBjYW4gbm90IGJlIHVzZWQgcmVsaWFibHkgZm9yIElQQy4KKworVGhlIHRlc3Qgc3VpdGUgaXMgbm90IHBvcnRlZCB5ZXQuCisKK2RidXMtcGlwZS5jOgorICogVXNlcyBsaWJjIGZpbGUgZGVzY3JpcHRvcnMuICBOZWVkZWQgZm9yIC0tcHJpbnQtYWRkcmVzcyBhbmQKKyAgIC0tcHJpbnQtcGlkIHdoaWNoIHByb2JhYmx5IGRvbid0IHdvcmsgeWV0LgorCitkYnVzLXN5c2RlcHMtd2luLmM6CisgKiBCYWNrdHJhY2VzIGhhdmUgYmVlbiBkaXNhYmxlZC4KKyAqIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIE5vdCBzdXBwb3J0ZWQsIG1heWJlIHdlIHNob3VsZCBkaXNhYmxlCisgICB0aGUgd2FybmluZy4KKyAqIFNlYXJjaFBhdGhBOiBVc2VzIEhLTE1cXFNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1c1xcSW5zdGFsbCBEaXJlY3RvcnkKKyAgIHRvIGxvY2F0ZSBiaW5hcmllcy4KZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkZTczNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvZ2VuLnNoCkBAIC0wLDAgKzEsMTA4IEBACisjIS9iaW4vc2gKKyMgUnVuIHRoaXMgdG8gZ2VuZXJhdGUgYWxsIHRoZSBpbml0aWFsIG1ha2VmaWxlcywgZXRjLgorCitzcmNkaXI9YGRpcm5hbWUgJDBgCit0ZXN0IC16ICIkc3JjZGlyIiAmJiBzcmNkaXI9LgorCitPUklHRElSPWBwd2RgCitjZCAkc3JjZGlyCisKK1BST0pFQ1Q9ZGJ1cworVEVTVF9UWVBFPS1mCitGSUxFPWRidXMtMS5wYy5pbgorCitESUU9MAorCitpZiBbIC1mIC5naXQvaG9va3MvcHJlLWNvbW1pdC5zYW1wbGUgLWEgISAtZiAuZ2l0L2hvb2tzL3ByZS1jb21taXQgXSA7IHRoZW4KKyAgICBlY2hvICJBY3RpdmF0aW5nIHByZS1jb21taXQgaG9vay4iCisgICAgY3AgLmdpdC9ob29rcy9wcmUtY29tbWl0LnNhbXBsZSAuZ2l0L2hvb2tzL3ByZS1jb21taXQKKyAgICBjaG1vZCAreCAuZ2l0L2hvb2tzL3ByZS1jb21taXQKK2ZpCisKKyhhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworCWVjaG8KKwllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9jb25mIGluc3RhbGxlZCB0byBjb21waWxlICRQUk9KRUNULiIKKwllY2hvICJEb3dubG9hZCB0aGUgYXBwcm9wcmlhdGUgcGFja2FnZSBmb3IgeW91ciBkaXN0cmlidXRpb24sIgorCWVjaG8gIm9yIGdldCB0aGUgc291cmNlIHRhcmJhbGwgYXQgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS8iCisJRElFPTEKK30KKworIyBJZiB0aGUgdXNlciBoYXNuJ3QgZXhwbGljaXRseSBjaG9zZW4gYW4gQXV0b21ha2UgdmVyc2lvbiwgdXNlIDEuMTEuIFRoaXMgaXMKKyMgdGhlIGVhcmxpZXN0IHZlcnNpb24gdGhhdCBnaXZlcyB1cyBzaWxlbnQgcnVsZXMuCitpZiB0ZXN0IC16ICIkQVVUT01BS0UiOyB0aGVuCisgICAgQVVUT01BS0U9YXV0b21ha2UtMS4xMQorICAgIEFDTE9DQUw9YWNsb2NhbC0xLjExCitmaQorCisoJEFVVE9NQUtFIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSB8fCB7CisgICAgICAgIEFVVE9NQUtFPWF1dG9tYWtlCisgICAgICAgIEFDTE9DQUw9YWNsb2NhbAorfQorCisoJEFVVE9NQUtFIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSB8fCB7CisJZWNobworCWVjaG8gIllvdSBtdXN0IGhhdmUgYXV0b21ha2UgaW5zdGFsbGVkIHRvIGNvbXBpbGUgJFBST0pFQ1QuIgorCWVjaG8gIkdldCBmdHA6Ly9mdHAuY3lnbnVzLmNvbS9wdWIvaG9tZS90cm9tZXkvYXV0b21ha2UtMS4yZC50YXIuZ3oiCisJZWNobyAiKG9yIGEgbmV3ZXIgdmVyc2lvbiBpZiBpdCBpcyBhdmFpbGFibGUpIgorCURJRT0xCit9CisKK0xJQlRPT0xJWkU9YHdoaWNoIGxpYnRvb2xpemVgCitpZiAhIHRlc3QgLWYgIiRMSUJUT09MSVpFIjsgdGhlbgorCUxJQlRPT0xJWkU9YHdoaWNoIGdsaWJ0b29saXplYAorZmkKKworKCRMSUJUT09MSVpFIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMSB8fCB7CisJZWNobworCWVjaG8gIllvdSBtdXN0IGhhdmUgbGlidG9vbGl6ZSBpbnN0YWxsZWQgdG8gY29tcGlsZSAkUFJPSkVDVC4iCisJZWNobyAiSW5zdGFsbCB0aGUgbGlidG9vbCBwYWNrYWdlIGZyb20gZnRwLmdudS5vcmcgb3IgYSBtaXJyb3IuIgorCURJRT0xCit9CisKK2lmIHRlc3QgIiRESUUiIC1lcSAxOyB0aGVuCisJZXhpdCAxCitmaQorCit0ZXN0ICRURVNUX1RZUEUgJEZJTEUgfHwgeworCWVjaG8gIllvdSBtdXN0IHJ1biB0aGlzIHNjcmlwdCBpbiB0aGUgdG9wLWxldmVsICRQUk9KRUNUIGRpcmVjdG9yeSIKKwlleGl0IDEKK30KKworaWYgdGVzdCAteiAiJCoiOyB0aGVuCisJZWNobyAiSSBhbSBnb2luZyB0byBydW4gLi9jb25maWd1cmUgd2l0aCBubyBhcmd1bWVudHMgLSBpZiB5b3Ugd2lzaCAiCisgICAgICAgIGVjaG8gInRvIHBhc3MgYW55IHRvIGl0LCBwbGVhc2Ugc3BlY2lmeSB0aGVtIG9uIHRoZSAkMCBjb21tYW5kIGxpbmUuIgorZmkKKworJExJQlRPT0xJWkUgLS1jb3B5IC0tZm9yY2UKKworJEFDTE9DQUwgLUkgbTQgJEFDTE9DQUxfRkxBR1MKKworIyMgb3B0aW9uYWxseSBmZWF0dXJlIGF1dG9oZWFkZXIKKyhhdXRvaGVhZGVyIC0tdmVyc2lvbikgIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgJiYgYXV0b2hlYWRlcgorCiskQVVUT01BS0UgLWEgJGFtX29wdAoraWYgISBhdXRvY29uZjsgdGhlbgorICBlY2hvICJhdXRvY29uZiBmYWlsZWQgLSB2ZXJzaW9uIDIuNXggaXMgcHJvYmFibHkgcmVxdWlyZWQiID4mMgorICBleGl0IDEKK2ZpCisKK2NkICRPUklHRElSCisKK2lmIHRlc3QgeCIkTk9DT05GSUdVUkUiID0geDsgdGhlbgorICBydW5fY29uZmlndXJlPXRydWUKKyAgZm9yIGFyZyBpbiAkKjsgZG8KKyAgICBjYXNlICRhcmcgaW4gCisgICAgICAgIC0tbm8tY29uZmlndXJlKQorICAgICAgICAgICAgcnVuX2NvbmZpZ3VyZT1mYWxzZQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICBkb25lCitlbHNlCisgIHJ1bl9jb25maWd1cmU9ZmFsc2UKK2ZpCisKK2lmICRydW5fY29uZmlndXJlOyB0aGVuCisgICAgJHNyY2Rpci9jb25maWd1cmUgLS1lbmFibGUtZGV2ZWxvcGVyIC0tY29uZmlnLWNhY2hlICIkQCIKK2ZpCmRpZmYgLS1naXQgYS9idWlsZC1hdXgvdGFwLWRyaXZlci5zaCBiL2J1aWxkLWF1eC90YXAtZHJpdmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyNTRlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC1hdXgvdGFwLWRyaXZlci5zaApAQCAtMCwwICsxLDY1MSBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK3NjcmlwdHZlcnNpb249MjAxMy0xMi0yMy4xNzsgIyBVVEMKKworIyBNYWtlIHVuY29uZGl0aW9uYWwgZXhwYW5zaW9uIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgYW4gZXJyb3IuICBUaGlzCisjIGhlbHBzIGEgbG90IGluIHByZXZlbnRpbmcgdHlwby1yZWxhdGVkIGJ1Z3MuCitzZXQgLXUKKworbWU9dGFwLWRyaXZlci5zaAorCitmYXRhbCAoKQoreworICBlY2hvICIkbWU6IGZhdGFsOiAkKiIgPiYyCisgIGV4aXQgMQorfQorCit1c2FnZV9lcnJvciAoKQoreworICBlY2hvICIkbWU6ICQqIiA+JjIKKyAgcHJpbnRfdXNhZ2UgPiYyCisgIGV4aXQgMgorfQorCitwcmludF91c2FnZSAoKQoreworICBjYXQgPDxFTkQKK1VzYWdlOgorICB0YXAtZHJpdmVyLnNoIC0tdGVzdC1uYW1lPU5BTUUgLS1sb2ctZmlsZT1QQVRIIC0tdHJzLWZpbGU9UEFUSAorICAgICAgICAgICAgICAgIFstLWV4cGVjdC1mYWlsdXJlPXt5ZXN8bm99XSBbLS1jb2xvci10ZXN0cz17eWVzfG5vfV0KKyAgICAgICAgICAgICAgICBbLS1lbmFibGUtaGFyZC1lcnJvcnM9e3llc3xub31dIFstLWlnbm9yZS1leGl0XQorICAgICAgICAgICAgICAgIFstLWRpYWdub3N0aWMtc3RyaW5nPVNUUklOR10gWy0tbWVyZ2V8LS1uby1tZXJnZV0KKyAgICAgICAgICAgICAgICBbLS1jb21tZW50c3wtLW5vLWNvbW1lbnRzXSBbLS1dIFRFU1QtQ09NTUFORAorVGhlICctLXRlc3QtbmFtZScsICctbG9nLWZpbGUnIGFuZCAnLS10cnMtZmlsZScgb3B0aW9ucyBhcmUgbWFuZGF0b3J5LgorRU5ECit9CisKKyMgVE9ETzogYmV0dGVyIGVycm9yIGhhbmRsaW5nIGluIG9wdGlvbiBwYXJzaW5nIChpbiBwYXJ0aWN1bGFyLCBlbnN1cmUKKyMgVE9ETzogJGxvZ19maWxlLCAkdHJzX2ZpbGUgYW5kICR0ZXN0X25hbWUgYXJlIGRlZmluZWQpLgordGVzdF9uYW1lPSAjIFVzZWQgZm9yIHJlcG9ydGluZy4KK2xvZ19maWxlPSAgIyBXaGVyZSB0byBzYXZlIHRoZSByZXN1bHQgYW5kIG91dHB1dCBvZiB0aGUgdGVzdCBzY3JpcHQuCit0cnNfZmlsZT0gICMgV2hlcmUgdG8gc2F2ZSB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgcnVuLgorZXhwZWN0X2ZhaWx1cmU9MAorY29sb3JfdGVzdHM9MAorbWVyZ2U9MAoraWdub3JlX2V4aXQ9MAorY29tbWVudHM9MAorZGlhZ19zdHJpbmc9JyMnCit3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbworICBjYXNlICQxIGluCisgIC0taGVscCkgcHJpbnRfdXNhZ2U7IGV4aXQgJD87OworICAtLXZlcnNpb24pIGVjaG8gIiRtZSAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworICAtLXRlc3QtbmFtZSkgdGVzdF9uYW1lPSQyOyBzaGlmdDs7CisgIC0tbG9nLWZpbGUpIGxvZ19maWxlPSQyOyBzaGlmdDs7CisgIC0tdHJzLWZpbGUpIHRyc19maWxlPSQyOyBzaGlmdDs7CisgIC0tY29sb3ItdGVzdHMpIGNvbG9yX3Rlc3RzPSQyOyBzaGlmdDs7CisgIC0tZXhwZWN0LWZhaWx1cmUpIGV4cGVjdF9mYWlsdXJlPSQyOyBzaGlmdDs7CisgIC0tZW5hYmxlLWhhcmQtZXJyb3JzKSBzaGlmdDs7ICMgTm8tb3AuCisgIC0tbWVyZ2UpIG1lcmdlPTE7OworICAtLW5vLW1lcmdlKSBtZXJnZT0wOzsKKyAgLS1pZ25vcmUtZXhpdCkgaWdub3JlX2V4aXQ9MTs7CisgIC0tY29tbWVudHMpIGNvbW1lbnRzPTE7OworICAtLW5vLWNvbW1lbnRzKSBjb21tZW50cz0wOzsKKyAgLS1kaWFnbm9zdGljLXN0cmluZykgZGlhZ19zdHJpbmc9JDI7IHNoaWZ0OzsKKyAgLS0pIHNoaWZ0OyBicmVhazs7CisgIC0qKSB1c2FnZV9lcnJvciAiaW52YWxpZCBvcHRpb246ICckMSciOzsKKyAgZXNhYworICBzaGlmdAorZG9uZQorCit0ZXN0ICQjIC1ndCAwIHx8IHVzYWdlX2Vycm9yICJtaXNzaW5nIHRlc3QgY29tbWFuZCIKKworY2FzZSAkZXhwZWN0X2ZhaWx1cmUgaW4KKyAgeWVzKSBleHBlY3RfZmFpbHVyZT0xOzsKKyAgICAqKSBleHBlY3RfZmFpbHVyZT0wOzsKK2VzYWMKKworaWYgdGVzdCAkY29sb3JfdGVzdHMgPSB5ZXM7IHRoZW4KKyAgaW5pdF9jb2xvcnM9JworICAgIGNvbG9yX21hcFsicmVkIl09IhtbMDszMW0iICMgUmVkLgorICAgIGNvbG9yX21hcFsiZ3JuIl09IhtbMDszMm0iICMgR3JlZW4uCisgICAgY29sb3JfbWFwWyJsZ24iXT0iG1sxOzMybSIgIyBMaWdodCBncmVlbi4KKyAgICBjb2xvcl9tYXBbImJsdSJdPSIbWzE7MzRtIiAjIEJsdWUuCisgICAgY29sb3JfbWFwWyJtZ24iXT0iG1swOzM1bSIgIyBNYWdlbnRhLgorICAgIGNvbG9yX21hcFsic3RkIl09IhtbbSIgICAgICMgTm8gY29sb3IuCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiRVJST1IiXSA9ICJtZ24iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiUEFTUyJdICA9ICJncm4iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiWFBBU1MiXSA9ICJyZWQiCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiRkFJTCJdICA9ICJyZWQiCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiWEZBSUwiXSA9ICJsZ24iCisgICAgY29sb3JfZm9yX3Jlc3VsdFsiU0tJUCJdICA9ICJibHUiJworZWxzZQorICBpbml0X2NvbG9ycz0nJworZmkKKworIyA6OyBpcyB0aGVyZSB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBiYXNoIDMuMiAoYW5kIGVhcmxpZXIpIHdoaWNoCisjIGRvZXMgbm90IGFsd2F5cyBzZXQgJyQ/JyBwcm9wZXJseSBvbiByZWRpcmVjdGlvbiBmYWlsdXJlLgorIyBTZWUgdGhlIEF1dG9jb25mIG1hbnVhbCBmb3IgbW9yZSBkZXRhaWxzLgorOjt7CisgICgKKyAgICAjIElnbm9yZSBjb21tb24gc2lnbmFscyAoaW4gdGhpcyBzdWJzaGVsbCBvbmx5ISksIHRvIGF2b2lkIHBvdGVudGlhbAorICAgICMgcHJvYmxlbXMgd2l0aCBLb3JuIHNoZWxscy4gIFNvbWUgS29ybiBzaGVsbHMgYXJlIGtub3duIHRvIHByb3BhZ2F0ZQorICAgICMgdG8gdGhlbXNlbHZlcyBzaWduYWxzIHRoYXQgaGF2ZSBraWxsZWQgYSBjaGlsZCBwcm9jZXNzIHRoZXkgd2VyZQorICAgICMgd2FpdGluZyBmb3I7IHRoaXMgaXMgZG9uZSBhdCBsZWFzdCBmb3IgU0lHSU5UIChhbmQgdXN1YWxseSBvbmx5IGZvcgorICAgICMgaXQsIGluIHRydXRoKS4gIFdpdGhvdXQgdGhlIGB0cmFwJyBiZWxvdywgc3VjaCBhIGJlaGF2aW91ciBjb3VsZAorICAgICMgY2F1c2UgYSBwcmVtYXR1cmUgZXhpdCBpbiB0aGUgY3VycmVudCBzdWJzaGVsbCwgZS5nLiwgaW4gY2FzZSB0aGUKKyAgICAjIHRlc3QgY29tbWFuZCBpdCBydW5zIGdldHMgdGVybWluYXRlZCBieSBhIFNJR0lOVC4gIFRodXMsIHRoZSBhd2sKKyAgICAjIHNjcmlwdCB3ZSBhcmUgcGlwaW5nIGludG8gd291bGQgbmV2ZXIgc2VlbiB0aGUgZXhpdCBzdGF0dXMgaXQKKyAgICAjIGV4cGVjdHMgb24gaXRzIGxhc3QgaW5wdXQgbGluZSAod2hpY2ggaXMgZGlzcGxheWVkIGJlbG93IGJ5IHRoZQorICAgICMgbGFzdCBgZWNobyAkPycgc3RhdGVtZW50KSwgYW5kIHdvdWxkIHRodXMgZGllIHJlcG9ydGluZyBhbiBpbnRlcm5hbAorICAgICMgZXJyb3IuCisgICAgIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBBdXRvY29uZiBtYW51YWwgYW5kIHRoZSB0aHJlYWRzOgorICAgICMgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9idWctYXV0b2NvbmYvMjAxMS0wOS9tc2cwMDAwNC5odG1sPgorICAgICMgPGh0dHA6Ly9tYWlsLm9wZW5zb2xhcmlzLm9yZy9waXBlcm1haWwva3NoOTMtaW50ZWdyYXRpb24tZGlzY3Vzcy8yMDA5LUZlYnJ1YXJ5LzAwNDEyMS5odG1sPgorICAgIHRyYXAgOiAxIDMgMiAxMyAxNQorICAgIGlmIHRlc3QgJG1lcmdlIC1ndCAwOyB0aGVuCisgICAgICBleGVjIDI+JjEKKyAgICBlbHNlCisgICAgICBleGVjIDI+JjMKKyAgICBmaQorICAgICIkQCIKKyAgICBlY2hvICQ/CisgICkgfCBMQ19BTEw9QyAke0FNX1RBUF9BV0stYXdrfSBcCisgICAgICAgIC12IG1lPSIkbWUiIFwKKyAgICAgICAgLXYgdGVzdF9zY3JpcHRfbmFtZT0iJHRlc3RfbmFtZSIgXAorICAgICAgICAtdiBsb2dfZmlsZT0iJGxvZ19maWxlIiBcCisgICAgICAgIC12IHRyc19maWxlPSIkdHJzX2ZpbGUiIFwKKyAgICAgICAgLXYgZXhwZWN0X2ZhaWx1cmU9IiRleHBlY3RfZmFpbHVyZSIgXAorICAgICAgICAtdiBtZXJnZT0iJG1lcmdlIiBcCisgICAgICAgIC12IGlnbm9yZV9leGl0PSIkaWdub3JlX2V4aXQiIFwKKyAgICAgICAgLXYgY29tbWVudHM9IiRjb21tZW50cyIgXAorICAgICAgICAtdiBkaWFnX3N0cmluZz0iJGRpYWdfc3RyaW5nIiBcCisnCisjIFRPRE86IHRoZSB1c2FnZXMgb2YgImNhdCA+JjMiIGJlbG93IGNvdWxkIGJlIG9wdGltaXplZCB3aGVuIHVzaW5nCisjICAgICAgIEdOVSBhd2ssIGFuZC9vbiBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydHMgL2Rldi9mZC8uCisKKyMgSW1wbGVtZW50YXRpb24gbm90ZTogaW4gd2hhdCBmb2xsb3dzLCBgcmVzdWx0X29iamAgd2lsbCBiZSBhbgorIyBhc3NvY2lhdGl2ZSBhcnJheSB0aGF0IChwYXJ0bHkpIHNpbXVsYXRlcyBhIFRBUCByZXN1bHQgb2JqZWN0CisjIGZyb20gdGhlIGBUQVA6OlBhcnNlcmAgcGVybCBtb2R1bGUuCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyAgRlVOQ1RJT05TICAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworZnVuY3Rpb24gZmF0YWwobXNnKQoreworICBwcmludCBtZSAiOiAiIG1zZyB8ICJjYXQgPiYyIgorICBleGl0IDEKK30KKworZnVuY3Rpb24gYWJvcnQod2hlcmUpCit7CisgIGZhdGFsKCJpbnRlcm5hbCBlcnJvciAiIHdoZXJlKQorfQorCisjIENvbnZlcnQgYSBib29sZWFuIHRvIGEgInllcyIvIm5vIiBzdHJpbmcuCitmdW5jdGlvbiB5bihib29sKQoreworICByZXR1cm4gYm9vbCA/ICJ5ZXMiIDogIm5vIjsKK30KKworZnVuY3Rpb24gYWRkX3Rlc3RfcmVzdWx0KHJlc3VsdCkKK3sKKyAgaWYgKCF0ZXN0X3Jlc3VsdHNfaW5kZXgpCisgICAgdGVzdF9yZXN1bHRzX2luZGV4ID0gMAorICB0ZXN0X3Jlc3VsdHNfbGlzdFt0ZXN0X3Jlc3VsdHNfaW5kZXhdID0gcmVzdWx0CisgIHRlc3RfcmVzdWx0c19pbmRleCArPSAxCisgIHRlc3RfcmVzdWx0c19zZWVuW3Jlc3VsdF0gPSAxOworfQorCisjIFdoZXRoZXIgdGhlIHRlc3Qgc2NyaXB0IHNob3VsZCBiZSByZS1ydW4gYnkgIm1ha2UgcmVjaGVjayIuCitmdW5jdGlvbiBtdXN0X3JlY2hlY2soKQoreworICBmb3IgKGsgaW4gdGVzdF9yZXN1bHRzX3NlZW4pCisgICAgaWYgKGsgIT0gIlhGQUlMIiAmJiBrICE9ICJQQVNTIiAmJiBrICE9ICJTS0lQIikKKyAgICAgIHJldHVybiAxCisgIHJldHVybiAwCit9CisKKyMgV2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgbG9nIGZpbGUgYXNzb2NpYXRlZCB0byB0aGlzIHRlc3Qgc2hvdWxkCisjIGJlIGNvcGllZCBpbnRvIHRoZSAiZ2xvYmFsIiB0ZXN0LXN1aXRlLmxvZy4KK2Z1bmN0aW9uIGNvcHlfaW5fZ2xvYmFsX2xvZygpCit7CisgIGZvciAoayBpbiB0ZXN0X3Jlc3VsdHNfc2VlbikKKyAgICBpZiAoayAhPSAiUEFTUyIpCisgICAgICByZXR1cm4gMQorICByZXR1cm4gMAorfQorCitmdW5jdGlvbiBnZXRfZ2xvYmFsX3Rlc3RfcmVzdWx0KCkKK3sKKyAgICBpZiAoIkVSUk9SIiBpbiB0ZXN0X3Jlc3VsdHNfc2VlbikKKyAgICAgIHJldHVybiAiRVJST1IiCisgICAgaWYgKCJGQUlMIiBpbiB0ZXN0X3Jlc3VsdHNfc2VlbiB8fCAiWFBBU1MiIGluIHRlc3RfcmVzdWx0c19zZWVuKQorICAgICAgcmV0dXJuICJGQUlMIgorICAgIGFsbF9za2lwcGVkID0gMQorICAgIGZvciAoayBpbiB0ZXN0X3Jlc3VsdHNfc2VlbikKKyAgICAgIGlmIChrICE9ICJTS0lQIikKKyAgICAgICAgYWxsX3NraXBwZWQgPSAwCisgICAgaWYgKGFsbF9za2lwcGVkKQorICAgICAgcmV0dXJuICJTS0lQIgorICAgIHJldHVybiAiUEFTUyI7Cit9CisKK2Z1bmN0aW9uIHN0cmluZ2lmeV9yZXN1bHRfb2JqKHJlc3VsdF9vYmopCit7CisgIGlmIChyZXN1bHRfb2JqWyJpc191bnBsYW5uZWQiXSB8fCByZXN1bHRfb2JqWyJudW1iZXIiXSAhPSB0ZXN0bm8pCisgICAgcmV0dXJuICJFUlJPUiIKKworICBpZiAocGxhbl9zZWVuID09IExBVEVfUExBTikKKyAgICByZXR1cm4gIkVSUk9SIgorCisgIGlmIChyZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSA9PSAiVE9ETyIpCisgICAgcmV0dXJuIHJlc3VsdF9vYmpbImlzX29rIl0gPyAiWFBBU1MiIDogIlhGQUlMIgorCisgIGlmIChyZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSA9PSAiU0tJUCIpCisgICAgcmV0dXJuIHJlc3VsdF9vYmpbImlzX29rIl0gPyAiU0tJUCIgOiBDT09LRURfRkFJTDsKKworICBpZiAobGVuZ3RoKHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdKSkKKyAgICAgIGFib3J0KCJpbiBmdW5jdGlvbiBzdHJpbmdpZnlfcmVzdWx0X29iaigpIikKKworICByZXR1cm4gcmVzdWx0X29ialsiaXNfb2siXSA/IENPT0tFRF9QQVNTIDogQ09PS0VEX0ZBSUwKK30KKworZnVuY3Rpb24gZGVjb3JhdGVfcmVzdWx0KHJlc3VsdCkKK3sKKyAgY29sb3JfbmFtZSA9IGNvbG9yX2Zvcl9yZXN1bHRbcmVzdWx0XQorICBpZiAoY29sb3JfbmFtZSkKKyAgICByZXR1cm4gY29sb3JfbWFwW2NvbG9yX25hbWVdICIiIHJlc3VsdCAiIiBjb2xvcl9tYXBbInN0ZCJdCisgICMgSWYgd2UgYXJlIG5vdCB1c2luZyBjb2xvcml6ZWQgb3V0cHV0LCBvciBpZiB3ZSBkbyBub3Qga25vdyBob3cKKyAgIyB0byBjb2xvcml6ZSB0aGUgZ2l2ZW4gcmVzdWx0LCB3ZSBzaG91bGQgcmV0dXJuIGl0IHVuY2hhbmdlZC4KKyAgcmV0dXJuIHJlc3VsdAorfQorCitmdW5jdGlvbiByZXBvcnQocmVzdWx0LCBkZXRhaWxzKQoreworICBpZiAocmVzdWx0IH4gL14oWD8oUEFTU3xGQUlMKXxTS0lQfEVSUk9SKS8pCisgICAgeworICAgICAgbXNnID0gIjogIiB0ZXN0X3NjcmlwdF9uYW1lCisgICAgICBhZGRfdGVzdF9yZXN1bHQocmVzdWx0KQorICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0ID09ICIjIikKKyAgICB7CisgICAgICBtc2cgPSAiICIgdGVzdF9zY3JpcHRfbmFtZSAiOiIKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhYm9ydCgiaW4gZnVuY3Rpb24gcmVwb3J0KCkiKQorICAgIH0KKyAgaWYgKGxlbmd0aChkZXRhaWxzKSkKKyAgICBtc2cgPSBtc2cgIiAiIGRldGFpbHMKKyAgIyBPdXRwdXQgb24gY29uc29sZSBtaWdodCBiZSBjb2xvcml6ZWQuCisgIHByaW50IGRlY29yYXRlX3Jlc3VsdChyZXN1bHQpIG1zZworICAjIExvZyB0aGUgcmVzdWx0IGluIHRoZSBsb2cgZmlsZSB0b28sIHRvIGhlbHAgZGVidWdnaW5nICh0aGlzIGlzCisgICMgZXNwZWNpYWxseSB0cnVlIHdoZW4gc2FpZCByZXN1bHQgaXMgYSBUQVAgZXJyb3Igb3IgIkJhaWwgb3V0ISIpLgorICBwcmludCByZXN1bHQgbXNnIHwgImNhdCA+JjMiOworfQorCitmdW5jdGlvbiB0ZXN0c3VpdGVfZXJyb3IoZXJyb3JfbWVzc2FnZSkKK3sKKyAgcmVwb3J0KCJFUlJPUiIsICItICIgZXJyb3JfbWVzc2FnZSkKK30KKworZnVuY3Rpb24gaGFuZGxlX3RhcF9yZXN1bHQoKQoreworICBkZXRhaWxzID0gcmVzdWx0X29ialsibnVtYmVyIl07CisgIGlmIChsZW5ndGgocmVzdWx0X29ialsiZGVzY3JpcHRpb24iXSkpCisgICAgZGV0YWlscyA9IGRldGFpbHMgIiAiIHJlc3VsdF9vYmpbImRlc2NyaXB0aW9uIl0KKworICBpZiAocGxhbl9zZWVuID09IExBVEVfUExBTikKKyAgICB7CisgICAgICBkZXRhaWxzID0gZGV0YWlscyAiICMgQUZURVIgTEFURSBQTEFOIjsKKyAgICB9CisgIGVsc2UgaWYgKHJlc3VsdF9vYmpbImlzX3VucGxhbm5lZCJdKQorICAgIHsKKyAgICAgICBkZXRhaWxzID0gZGV0YWlscyAiICMgVU5QTEFOTkVEIjsKKyAgICB9CisgIGVsc2UgaWYgKHJlc3VsdF9vYmpbIm51bWJlciJdICE9IHRlc3RubykKKyAgICB7CisgICAgICAgZGV0YWlscyA9IHNwcmludGYoIiVzICMgT1VULU9GLU9SREVSIChleHBlY3RpbmcgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLCB0ZXN0bm8pOworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0X29ialsiZGlyZWN0aXZlIl0pCisgICAgeworICAgICAgZGV0YWlscyA9IGRldGFpbHMgIiAjICIgcmVzdWx0X29ialsiZGlyZWN0aXZlIl07CisgICAgICBpZiAobGVuZ3RoKHJlc3VsdF9vYmpbImV4cGxhbmF0aW9uIl0pKQorICAgICAgICBkZXRhaWxzID0gZGV0YWlscyAiICIgcmVzdWx0X29ialsiZXhwbGFuYXRpb24iXQorICAgIH0KKworICByZXBvcnQoc3RyaW5naWZ5X3Jlc3VsdF9vYmoocmVzdWx0X29iaiksIGRldGFpbHMpCit9CisKKyMgYHNraXBfcmVhc29uYCBzaG91bGQgYmUgZW1wdHkgd2hlbmV2ZXIgcGxhbm5lZCA+IDAuCitmdW5jdGlvbiBoYW5kbGVfdGFwX3BsYW4ocGxhbm5lZCwgc2tpcF9yZWFzb24pCit7CisgIHBsYW5uZWQgKz0gMCAjIEF2b2lkIGdldHRpbmcgY29uZnVzZWQgaWYsIHNheSwgYHBsYW5uZWRgIGlzICIwMCIKKyAgaWYgKGxlbmd0aChza2lwX3JlYXNvbikgJiYgcGxhbm5lZCA+IDApCisgICAgYWJvcnQoImluIGZ1bmN0aW9uIGhhbmRsZV90YXBfcGxhbigpIikKKyAgaWYgKHBsYW5fc2VlbikKKyAgICB7CisgICAgICAjIEVycm9yLCBvbmx5IG9uZSBwbGFuIHBlciBzdHJlYW0gaXMgYWNjZXB0YWJsZS4KKyAgICAgIHRlc3RzdWl0ZV9lcnJvcigibXVsdGlwbGUgdGVzdCBwbGFucyIpCisgICAgICByZXR1cm47CisgICAgfQorICBwbGFubmVkX3Rlc3RzID0gcGxhbm5lZAorICAjIFRoZSBUQVAgcGxhbiBjYW4gY29tZSBiZWZvcmUgb3IgYWZ0ZXIgKmFsbCogdGhlIFRBUCByZXN1bHRzOyB3ZSBzcGVhaworICAjIHJlc3BlY3RpdmVseSBvZiBhbiAiZWFybHkiIG9yIGEgImxhdGUiIHBsYW4uICBJZiB3ZSBzZWUgdGhlIHBsYW4gbGluZQorICAjIGFmdGVyIGF0IGxlYXN0IG9uZSBUQVAgcmVzdWx0IGhhcyBiZWVuIHNlZW4sIGFzc3VtZSB3ZSBoYXZlIGEgbGF0ZQorICAjIHBsYW47IGluIHRoaXMgY2FzZSwgYW55IGZ1cnRoZXIgdGVzdCByZXN1bHQgc2VlbiBhZnRlciB0aGUgcGxhbiB3aWxsCisgICMgYmUgZmxhZ2dlZCBhcyBhbiBlcnJvci4KKyAgcGxhbl9zZWVuID0gKHRlc3RubyA+PSAxID8gTEFURV9QTEFOIDogRUFSTFlfUExBTikKKyAgIyBJZiB0ZXN0bm8gPiAwLCB3ZSBoYXZlIGFuIGVycm9yICgidG9vIG1hbnkgdGVzdHMgcnVuIikgdGhhdCB3aWxsIGJlCisgICMgYXV0b21hdGljYWxseSBkZWFsdCB3aXRoIGxhdGVyLCBzbyBkbyBub3Qgd29ycnkgYWJvdXQgaXQgaGVyZS4gIElmCisgICMgJHBsYW5fc2VlbiBpcyB0cnVlLCB3ZSBoYXZlIGFuIGVycm9yIGR1ZSB0byBhIHJlcGVhdGVkIHBsYW4sIGFuZCB0aGF0CisgICMgaGFzIGFscmVhZHkgYmVlbiBkZWFsdCB3aXRoIGFib3ZlLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgdmFsaWQgInBsYW4KKyAgIyB3aXRoIFNLSVAiIHNwZWNpZmljYXRpb24sIGFuZCBzaG91bGQgcmVwb3J0IGl0IGFzIGEgcGFydGljdWxhciBraW5kCisgICMgb2YgU0tJUCByZXN1bHQuCisgIGlmIChwbGFubmVkID09IDAgJiYgdGVzdG5vID09IDApCisgICAgeworICAgICAgaWYgKGxlbmd0aChza2lwX3JlYXNvbikpCisgICAgICAgIHNraXBfcmVhc29uID0gIi0gIiAgc2tpcF9yZWFzb247CisgICAgICByZXBvcnQoIlNLSVAiLCBza2lwX3JlYXNvbik7CisgICAgfQorfQorCitmdW5jdGlvbiBleHRyYWN0X3RhcF9jb21tZW50KGxpbmUpCit7CisgIGlmIChpbmRleChsaW5lLCBkaWFnX3N0cmluZykgPT0gMSkKKyAgICB7CisgICAgICAjIFN0cmlwIGxlYWRpbmcgYGRpYWdfc3RyaW5nYCBmcm9tIGBsaW5lYC4KKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgbGVuZ3RoKGRpYWdfc3RyaW5nKSArIDEpCisgICAgICAjIEFuZCBzdHJpcCBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBsZWZ0LgorICAgICAgc3ViKCJeWyBcdF0qIiwgIiIsIGxpbmUpCisgICAgICBzdWIoIlsgXHRdKiQiLCAiIiwgbGluZSkKKyAgICAgICMgUmV0dXJuIHdoYXQgaXMgbGVmdCAoaWYgYW55KS4KKyAgICAgIHJldHVybiBsaW5lOworICAgIH0KKyAgcmV0dXJuICIiOworfQorCisjIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHdlIGtub3cgdGhhdCBsaW5lIGlzIGEgVEFQIHJlc3VsdCBsaW5lLAorIyBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIChwZXJsKSBSRSAiXihub3QgKT9va1xiIi4KK2Z1bmN0aW9uIHNldHVwX3Jlc3VsdF9vYmoobGluZSkKK3sKKyAgIyBHZXQgdGhlIHJlc3VsdCwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaW5lLgorICByZXN1bHRfb2JqWyJpc19vayJdID0gKHN1YnN0cihsaW5lLCAxLCAyKSA9PSAib2siID8gMSA6IDApCisgIHN1YigiXihub3QgKT9va1sgXHRdKiIsICIiLCBsaW5lKQorCisgICMgSWYgdGhlIHJlc3VsdCBoYXMgYW4gZXhwbGljaXQgbnVtYmVyLCBnZXQgaXQgYW5kIHN0cmlwIGl0OyBvdGhlcndpc2UsCisgICMgYXV0b21hdGljYWxseSBhc3NpbmcgdGhlIG5leHQgcHJvZ3Jlc2l2ZSBudW1iZXIgdG8gaXQuCisgIGlmIChsaW5lIH4gL15bMC05XSskLyB8fCBsaW5lIH4gL15bMC05XStbXmEtekEtWjAtOV9dLykKKyAgICB7CisgICAgICBtYXRjaChsaW5lLCAiXlswLTldKyIpCisgICAgICAjIFRoZSBmaW5hbCBgKyAwYCBpcyB0byBub3JtYWxpemUgbnVtYmVycyB3aXRoIGxlYWRpbmcgemVyb3MuCisgICAgICByZXN1bHRfb2JqWyJudW1iZXIiXSA9IHN1YnN0cihsaW5lLCAxLCBSTEVOR1RIKSArIDAKKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgUkxFTkdUSCArIDEpCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0X29ialsibnVtYmVyIl0gPSB0ZXN0bm8KKyAgICB9CisKKyAgaWYgKHBsYW5fc2VlbiA9PSBMQVRFX1BMQU4pCisgICAgIyBObyBmdXJ0aGVyIHRlc3QgcmVzdWx0cyBhcmUgYWNjZXB0YWJsZSBhZnRlciBhICJsYXRlIiBUQVAgcGxhbgorICAgICMgaGFzIGJlZW4gc2Vlbi4KKyAgICByZXN1bHRfb2JqWyJpc191bnBsYW5uZWQiXSA9IDEKKyAgZWxzZSBpZiAocGxhbl9zZWVuICYmIHRlc3RubyA+IHBsYW5uZWRfdGVzdHMpCisgICAgcmVzdWx0X29ialsiaXNfdW5wbGFubmVkIl0gPSAxCisgIGVsc2UKKyAgICByZXN1bHRfb2JqWyJpc191bnBsYW5uZWQiXSA9IDAKKworICAjIFN0cmlwIHRyYWlsaW5nIGFuZCBsZWFkaW5nIHdoaXRlc3BhY2UuCisgIHN1YigiXlsgXHRdKiIsICIiLCBsaW5lKQorICBzdWIoIlsgXHRdKiQiLCAiIiwgbGluZSkKKworICAjIFRoaXMgd2lsbCBoYXZlIHRvIGJlIGNvcnJlY3RlZCBpZiB3ZSBoYXZlIGEgIlRPRE8iLyJTS0lQIiBkaXJlY3RpdmUuCisgIHJlc3VsdF9vYmpbImRlc2NyaXB0aW9uIl0gPSBsaW5lCisgIHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdID0gIiIKKyAgcmVzdWx0X29ialsiZXhwbGFuYXRpb24iXSA9ICIiCisKKyAgaWYgKGluZGV4KGxpbmUsICIjIikgPT0gMCkKKyAgICByZXR1cm4gIyBObyBwb3NzaWJsZSBkaXJlY3RpdmUsIG5vdGhpbmcgbW9yZSB0byBkby4KKworICAjIERpcmVjdGl2ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCisgIHJ4ID0gIlsgXHRdKiNbIFx0XSooW3RUXVtvT11bZERdW29PXXxbc1NdW2tLXVtpSV1bcFBdKVsgXHRdKiIKKworICAjIFNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlIGRpcmVjdGl2ZSwgYW5kIGlmIHllcywgd2hlcmUuCisgIHBvcyA9IG1hdGNoKGxpbmUsIHJ4ICIkIikKKyAgaWYgKCFwb3MpCisgICAgcG9zID0gbWF0Y2gobGluZSwgcnggIlteYS16QS1aMC05X10iKQorCisgICMgSWYgdGhlcmUgd2FzIG5vIFRBUCBkaXJlY3RpdmUsIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIGRvLgorICBpZiAoIXBvcykKKyAgICByZXR1cm4KKworICAjIExldGBzIG5vdyBzZWUgaWYgdGhlIFRBUCBkaXJlY3RpdmUgaGFzIGJlZW4gZXNjYXBlZC4gIEZvciBleGFtcGxlOgorICAjICBlc2NhcGVkOiAgICAgb2sgXCMgU0tJUAorICAjICBub3QgZXNjYXBlZDogb2sgXFwjIFNLSVAKKyAgIyAgZXNjYXBlZDogICAgIG9rIFxcXFxcIyBTS0lQCisgICMgIG5vdCBlc2NhcGVkOiBvayBcICMgU0tJUAorICBpZiAoc3Vic3RyKGxpbmUsIHBvcywgMSkgPT0gIiMiKQorICAgIHsKKyAgICAgIGJzbGFzaF9jb3VudCA9IDAKKyAgICAgIGZvciAoaSA9IHBvczsgaSA+IDEgJiYgc3Vic3RyKGxpbmUsIGkgLSAxLCAxKSA9PSAiXFwiOyBpLS0pCisgICAgICAgIGJzbGFzaF9jb3VudCArPSAxCisgICAgICBpZiAoYnNsYXNoX2NvdW50ICUgMikKKyAgICAgICAgcmV0dXJuICMgRGlyZWN0aXZlIHdhcyBlc2NhcGVkLgorICAgIH0KKworICAjIFN0cmlwIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyBleHBsYW5hdGlvbiAoaWYgYW55KSBmcm9tIHRoZSB0ZXN0CisgICMgZGVzY3JpcHRpb24uCisgIHJlc3VsdF9vYmpbImRlc2NyaXB0aW9uIl0gPSBzdWJzdHIobGluZSwgMSwgcG9zIC0gMSkKKyAgIyBOb3cgcmVtb3ZlIHRoZSB0ZXN0IGRlc2NyaXB0aW9uIGZyb20gdGhlIGxpbmUsIHRoYXQgaGFzIGJlZW4gZGVhbHQKKyAgIyB3aXRoIGFscmVhZHkuCisgIGxpbmUgPSBzdWJzdHIobGluZSwgcG9zKQorICAjIFN0cmlwIHRoZSBkaXJlY3RpdmUsIGFuZCBzYXZlIGl0cyB2YWx1ZSAobm9ybWFsaXplZCB0byB1cHBlciBjYXNlKS4KKyAgc3ViKCJeWyBcdF0qI1sgXHRdKiIsICIiLCBsaW5lKQorICByZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSA9IHRvdXBwZXIoc3Vic3RyKGxpbmUsIDEsIDQpKQorICBsaW5lID0gc3Vic3RyKGxpbmUsIDUpCisgICMgTm93IGdldCB0aGUgZXhwbGFuYXRpb24gZm9yIHRoZSBkaXJlY3RpdmUgKGlmIGFueSksIHdpdGggbGVhZGluZworICAjIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuCisgIHN1YigiXlsgXHRdKiIsICIiLCBsaW5lKQorICBzdWIoIlsgXHRdKiQiLCAiIiwgbGluZSkKKyAgcmVzdWx0X29ialsiZXhwbGFuYXRpb24iXSA9IGxpbmUKK30KKworZnVuY3Rpb24gZ2V0X3Rlc3RfZXhpdF9tZXNzYWdlKHN0YXR1cykKK3sKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIHJldHVybiAiIgorICBpZiAoc3RhdHVzICF+IC9eWzEtOV1bMC05XSokLykKKyAgICBhYm9ydCgiZ2V0dGluZyBleGl0IHN0YXR1cyIpCisgIGlmIChzdGF0dXMgPCAxMjcpCisgICAgZXhpdF9kZXRhaWxzID0gIiIKKyAgZWxzZSBpZiAoc3RhdHVzID09IDEyNykKKyAgICBleGl0X2RldGFpbHMgPSAiIChjb21tYW5kIG5vdCBmb3VuZD8pIgorICBlbHNlIGlmIChzdGF0dXMgPj0gMTI4ICYmIHN0YXR1cyA8PSAyNTUpCisgICAgZXhpdF9kZXRhaWxzID0gc3ByaW50ZigiICh0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAlZD8pIiwgc3RhdHVzIC0gMTI4KQorICBlbHNlIGlmIChzdGF0dXMgPiAyNTYgJiYgc3RhdHVzIDw9IDM4NCkKKyAgICAjIFdlIHVzZWQgdG8gcmVwb3J0IGFuICJhYm5vcm1hbCB0ZXJtaW5hdGlvbiIgaGVyZSwgYnV0IHNvbWUgS29ybgorICAgICMgc2hlbGxzLCB3aGVuIGEgY2hpbGQgcHJvY2VzcyBkaWUgZHVlIHRvIHNpZ25hbCBudW1iZXIgbiwgY2FuIGxlYXZlCisgICAgIyBpbiAkPyBhbiBleGl0IHN0YXR1cyBvZiAyNTYrbiBpbnN0ZWFkIG9mIHRoZSBtb3JlIHN0YW5kYXJkIDEyOCtuLgorICAgICMgQXBwYXJlbnRseSwgYm90aCBiZWhhdmlvdXJzIGFyZSBhbGxvd2VkIGJ5IFBPU0lYICgyMDA4KSwgc28gYmUKKyAgICAjIHByZXBhcmVkIHRvIGhhbmRsZSB0aGVtIGJvdGguICBTZWUgYWxzbyBBdXN0aW5nIEdyb3VwIHJlcG9ydCBJRAorICAgICMgMDAwMDA1MSA8aHR0cDovL3d3dy5hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTUxPgorICAgIGV4aXRfZGV0YWlscyA9IHNwcmludGYoIiAodGVybWluYXRlZCBieSBzaWduYWwgJWQ/KSIsIHN0YXR1cyAtIDI1NikKKyAgZWxzZQorICAgICMgTmV2ZXIgc2VlbiBpbiBwcmFjdGljZS4KKyAgICBleGl0X2RldGFpbHMgPSAiIChhYm5vcm1hbCB0ZXJtaW5hdGlvbikiCisgIHJldHVybiBzcHJpbnRmKCJleGl0ZWQgd2l0aCBzdGF0dXMgJWQlcyIsIHN0YXR1cywgZXhpdF9kZXRhaWxzKQorfQorCitmdW5jdGlvbiB3cml0ZV90ZXN0X3Jlc3VsdHMoKQoreworICBwcmludCAiOmdsb2JhbC10ZXN0LXJlc3VsdDogIiBnZXRfZ2xvYmFsX3Rlc3RfcmVzdWx0KCkgPiB0cnNfZmlsZQorICBwcmludCAiOnJlY2hlY2s6ICIgIHluKG11c3RfcmVjaGVjaygpKSA+IHRyc19maWxlCisgIHByaW50ICI6Y29weS1pbi1nbG9iYWwtbG9nOiAiIHluKGNvcHlfaW5fZ2xvYmFsX2xvZygpKSA+IHRyc19maWxlCisgIGZvciAoaSA9IDA7IGkgPCB0ZXN0X3Jlc3VsdHNfaW5kZXg7IGkgKz0gMSkKKyAgICBwcmludCAiOnRlc3QtcmVzdWx0OiAiIHRlc3RfcmVzdWx0c19saXN0W2ldID4gdHJzX2ZpbGUKKyAgY2xvc2UodHJzX2ZpbGUpOworfQorCitCRUdJTiB7CisKKyMjIC0tLS0tLS0gIyMKKyMjICBTRVRVUCAgIyMKKyMjIC0tLS0tLS0gIyMKKworJyIkaW5pdF9jb2xvcnMiJworCisjIFByb3Blcmx5IGluaXRpYWxpemVkIG9uY2UgdGhlIFRBUCBwbGFuIGlzIHNlZW4uCitwbGFubmVkX3Rlc3RzID0gMAorCitDT09LRURfUEFTUyA9IGV4cGVjdF9mYWlsdXJlID8gIlhQQVNTIjogIlBBU1MiOworQ09PS0VEX0ZBSUwgPSBleHBlY3RfZmFpbHVyZSA/ICJYRkFJTCI6ICJGQUlMIjsKKworIyBFbnVtZXJhdGlvbi1saWtlIGNvbnN0YW50cyB0byByZW1lbWJlciB3aGljaCBraW5kIG9mIHBsYW4gKGlmIGFueSkKKyMgaGFzIGJlZW4gc2Vlbi4gIEl0IGlzIGltcG9ydGFudCB0aGF0IE5PX1BMQU4gZXZhbHVhdGVzICJmYWxzZSIgYXMKKyMgYSBib29sZWFuLgorTk9fUExBTiA9IDAKK0VBUkxZX1BMQU4gPSAxCitMQVRFX1BMQU4gPSAyCisKK3Rlc3RubyA9IDAgICAgICMgTnVtYmVyIG9mIHRlc3QgcmVzdWx0cyBzZWVuIHNvIGZhci4KK2JhaWxlZF9vdXQgPSAwICMgV2hldGhlciBhICJCYWlsIG91dCEiIGRpcmVjdGl2ZSBoYXMgYmVlbiBzZWVuLgorCisjIFdoZXRoZXIgdGhlIFRBUCBwbGFuIGhhcyBiZWVuIHNlZW4gb3Igbm90LCBhbmQgaWYgeWVzLCB3aGljaCBraW5kCisjIGl0IGlzICgiZWFybHkiIGlzIHNlZW4gYmVmb3JlIGFueSB0ZXN0IHJlc3VsdCwgImxhdGUiIG90aGVyd2lzZSkuCitwbGFuX3NlZW4gPSBOT19QTEFOCisKKyMjIC0tLS0tLS0tLSAjIworIyMgIFBBUlNJTkcgICMjCisjIyAtLS0tLS0tLS0gIyMKKworaXNfZmlyc3RfcmVhZCA9IDEKKword2hpbGUgKDEpCisgIHsKKyAgICAjIEludm9sdXRpb25zIHJlcXVpcmVkIHNvIHRoYXQgd2UgYXJlIGFibGUgdG8gcmVhZCB0aGUgZXhpdCBzdGF0dXMKKyAgICAjIGZyb20gdGhlIGxhc3QgaW5wdXQgbGluZS4KKyAgICBzdCA9IGdldGxpbmUKKyAgICBpZiAoc3QgPCAwKSAjIEkvTyBlcnJvci4KKyAgICAgIGZhdGFsKCJJL08gZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGlucHV0IHN0cmVhbSIpCisgICAgZWxzZSBpZiAoc3QgPT0gMCkgIyBFbmQtb2YtaW5wdXQKKyAgICAgIHsKKyAgICAgICAgaWYgKGlzX2ZpcnN0X3JlYWQpCisgICAgICAgICAgYWJvcnQoImluIGlucHV0IGxvb3A6IG9ubHkgb25lIGlucHV0IGxpbmUiKQorICAgICAgICBicmVhaworICAgICAgfQorICAgIGlmIChpc19maXJzdF9yZWFkKQorICAgICAgeworICAgICAgICBpc19maXJzdF9yZWFkID0gMAorICAgICAgICBuZXh0bGluZSA9ICQwCisgICAgICAgIGNvbnRpbnVlCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBjdXJsaW5lID0gbmV4dGxpbmUKKyAgICAgICAgbmV4dGxpbmUgPSAkMAorICAgICAgICAkMCA9IGN1cmxpbmUKKyAgICAgIH0KKyAgICAjIENvcHkgYW55IGlucHV0IGxpbmUgdmVyYmF0aW0gaW50byB0aGUgbG9nIGZpbGUuCisgICAgcHJpbnQgfCAiY2F0ID4mMyIKKyAgICAjIFBhcnNpbmcgb2YgVEFQIGlucHV0IHNob3VsZCBzdG9wIGFmdGVyIGEgIkJhaWwgb3V0ISIgZGlyZWN0aXZlLgorICAgIGlmIChiYWlsZWRfb3V0KQorICAgICAgY29udGludWUKKworICAgICMgVEFQIHRlc3QgcmVzdWx0LgorICAgIGlmICgkMCB+IC9eKG5vdCApP29rJC8gfHwgJDAgfiAvXihub3QgKT9va1teYS16QS1aMC05X10vKQorICAgICAgeworICAgICAgICB0ZXN0bm8gKz0gMQorICAgICAgICBzZXR1cF9yZXN1bHRfb2JqKCQwKQorICAgICAgICBoYW5kbGVfdGFwX3Jlc3VsdCgpCisgICAgICB9CisgICAgIyBUQVAgcGxhbiAobm9ybWFsIG9yICJTS0lQIiB3aXRob3V0IGV4cGxhbmF0aW9uKS4KKyAgICBlbHNlIGlmICgkMCB+IC9eMVwuXC5bMC05XStbIFx0XSokLykKKyAgICAgIHsKKyAgICAgICAgIyBUaGUgbmV4dCB0d28gbGluZXMgd2lsbCBwdXQgdGhlIG51bWJlciBvZiBwbGFubmVkIHRlc3RzIGluICQwLgorICAgICAgICBzdWIoIl4xXFwuXFwuIiwgIiIpCisgICAgICAgIHN1YigiW14wLTldKiQiLCAiIikKKyAgICAgICAgaGFuZGxlX3RhcF9wbGFuKCQwLCAiIikKKyAgICAgICAgY29udGludWUKKyAgICAgIH0KKyAgICAjIFRBUCAiU0tJUCIgcGxhbiwgd2l0aCBhbiBleHBsYW5hdGlvbi4KKyAgICBlbHNlIGlmICgkMCB+IC9eMVwuXC4wK1sgXHRdKiMvKQorICAgICAgeworICAgICAgICAjIFRoZSBuZXh0IGxpbmVzIHdpbGwgcHV0IHRoZSBza2lwIGV4cGxhbmF0aW9uIGluICQwLCBzdHJpcHBpbmcKKyAgICAgICAgIyBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoaXMgaXMgYSBsaXR0bGUgbW9yZQorICAgICAgICAjIHRyaWNreSBpbiB0cnV0aCwgc2luY2Ugd2Ugd2FudCB0byBhbHNvIHN0cmlwIGEgcG90ZW50aWFsIGxlYWRpbmcKKyAgICAgICAgIyAiU0tJUCIgc3RyaW5nIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAgIHN1YigiXlteI10qI1sgXHRdKihTS0lQWzogXHRdWyBcdF0qKT8iLCAiIikKKyAgICAgICAgc3ViKCJbIFx0XSokIiwgIiIpOworICAgICAgICBoYW5kbGVfdGFwX3BsYW4oMCwgJDApCisgICAgICB9CisgICAgIyAiQmFpbCBvdXQhIiBtYWdpYy4KKyAgICAjIE9sZGVyIHZlcnNpb25zIG9mIHByb3ZlIGFuZCBUQVA6Okhhcm5lc3MgKGUuZy4sIDMuMTcpIGRpZCBub3QKKyAgICAjIHJlY29nbml6ZSBhICJCYWlsIG91dCEiIGRpcmVjdGl2ZSB3aGVuIHByZWNlZGVkIGJ5IGxlYWRpbmcKKyAgICAjIHdoaXRlc3BhY2UsIGJ1dCBtb3JlIG1vZGVybiB2ZXJzaW9ucyAoZS5nLiwgMy4yMykgZG8uICBTbyB3ZQorICAgICMgZW11bGF0ZSB0aGUgbGF0dGVyLCAibW9yZSBtb2Rlcm4iIGJlaGF2aW91ci4KKyAgICBlbHNlIGlmICgkMCB+IC9eWyBcdF0qQmFpbCBvdXQhLykKKyAgICAgIHsKKyAgICAgICAgYmFpbGVkX291dCA9IDEKKyAgICAgICAgIyBHZXQgdGhlIGJhaWxvdXQgbWVzc2FnZSAoaWYgYW55KSwgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZworICAgICAgICAjIHdoaXRlc3BhY2Ugc3RyaXBwZWQuICBUaGUgbWVzc2FnZSByZW1haW5zIHN0b3JlZCBpbiBgJDBgLgorICAgICAgICBzdWIoIl5bIFx0XSpCYWlsIG91dCFbIFx0XSoiLCAiIik7CisgICAgICAgIHN1YigiWyBcdF0qJCIsICIiKTsKKyAgICAgICAgIyBGb3JtYXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZQorICAgICAgICBiYWlsb3V0X21lc3NhZ2UgPSAiQmFpbCBvdXQhIgorICAgICAgICBpZiAobGVuZ3RoKCQwKSkKKyAgICAgICAgICBiYWlsb3V0X21lc3NhZ2UgPSBiYWlsb3V0X21lc3NhZ2UgIiAiICQwCisgICAgICAgIHRlc3RzdWl0ZV9lcnJvcihiYWlsb3V0X21lc3NhZ2UpCisgICAgICB9CisgICAgIyBNYXliZSB3ZSBoYXZlIHRvbyBsb29rIGZvciBkaWFub2d0aWMgY29tbWVudHMgdG9vLgorICAgIGVsc2UgaWYgKGNvbW1lbnRzICE9IDApCisgICAgICB7CisgICAgICAgIGNvbW1lbnQgPSBleHRyYWN0X3RhcF9jb21tZW50KCQwKTsKKyAgICAgICAgaWYgKGxlbmd0aChjb21tZW50KSkKKyAgICAgICAgICByZXBvcnQoIiMiLCBjb21tZW50KTsKKyAgICAgIH0KKyAgfQorCisjIyAtLS0tLS0tLSAjIworIyMgIEZJTklTSCAgIyMKKyMjIC0tLS0tLS0tICMjCisKKyMgQSAiQmFpbCBvdXQhIiBkaXJlY3RpdmUgc2hvdWxkIGNhdXNlIHVzIHRvIGlnbm9yZSBhbnkgZm9sbG93aW5nIFRBUAorIyBlcnJvciwgYXMgd2VsbCBhcyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIGZyb20gdGhlIFRBUCBwcm9kdWNlci4KK2lmICghYmFpbGVkX291dCkKKyAgeworICAgIGlmICghcGxhbl9zZWVuKQorICAgICAgeworICAgICAgICB0ZXN0c3VpdGVfZXJyb3IoIm1pc3NpbmcgdGVzdCBwbGFuIikKKyAgICAgIH0KKyAgICBlbHNlIGlmIChwbGFubmVkX3Rlc3RzICE9IHRlc3RubykKKyAgICAgIHsKKyAgICAgICAgYmFkX2Ftb3VudCA9IHRlc3RubyA+IHBsYW5uZWRfdGVzdHMgPyAibWFueSIgOiAiZmV3IgorICAgICAgICB0ZXN0c3VpdGVfZXJyb3Ioc3ByaW50ZigidG9vICVzIHRlc3RzIHJ1biAoZXhwZWN0ZWQgJWQsIGdvdCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRfYW1vdW50LCBwbGFubmVkX3Rlc3RzLCB0ZXN0bm8pKQorICAgICAgfQorICAgIGlmICghaWdub3JlX2V4aXQpCisgICAgICB7CisgICAgICAgICMgRmV0Y2ggZXhpdCBzdGF0dXMgZnJvbSB0aGUgbGFzdCBsaW5lLgorICAgICAgICBleGl0X21lc3NhZ2UgPSBnZXRfdGVzdF9leGl0X21lc3NhZ2UobmV4dGxpbmUpCisgICAgICAgIGlmIChleGl0X21lc3NhZ2UpCisgICAgICAgICAgdGVzdHN1aXRlX2Vycm9yKGV4aXRfbWVzc2FnZSkKKyAgICAgIH0KKyAgfQorCit3cml0ZV90ZXN0X3Jlc3VsdHMoKQorCitleGl0IDAKKworfSAjIEVuZCBvZiAiQkVHSU4iIGJsb2NrLgorJworCisjIFRPRE86IGRvY3VtZW50IHRoYXQgd2UgY29uc3VtZSB0aGUgZmlsZSBkZXNjcmlwdG9yIDMgOi0oCit9IDM+IiRsb2dfZmlsZSIKKwordGVzdCAkPyAtZXEgMCB8fCBmYXRhbCAiSS9PIG9yIGludGVybmFsIGVycm9yIgorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvYnVzLy5naXRpZ25vcmUgYi9idXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFkYzFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyNiBAQAorLmRlcHMKKy5saWJzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubG8KKyoubGEKK2RidXMtZGFlbW9uCitkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcgorZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXItdGVzdAorZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlcgorZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0CisqLmJiCisqLmJiZworKi5kYQorKi5nY292CitidXMtdGVzdAorcmMubWVzc2FnZWJ1cworbWVzc2FnZWJ1cworbWVzc2FnZWJ1cy1jb25maWcKK3Nlc3Npb24uY29uZgorc3lzdGVtLmNvbmYKK2J1cy10ZXN0LWxhdW5jaC1oZWxwZXIKK2J1cy10ZXN0LXN5c3RlbQorZGJ1cy5zZXJ2aWNlCitkYnVzLnNvY2tldAorb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdApkaWZmIC0tZ2l0IGEvYnVzL0FuZHJvaWQubWsgYi9idXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg3NDZhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ19JTkNMVURFUzo9ICQoTE9DQUxfUEFUSCkvLi4KKworTE9DQUxfQ0ZMQUdTOj0gXAorCS1PMyBcCisJLUREQlVTX0FORFJPSURfTE9HIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1EREJVU19EQUVNT05fTkFNRT1cImRidXMtZGFlbW9uXCIgXAorCS1EREJVU19TWVNURU1fQ09ORklHX0ZJTEU9XCIvZXRjL2RidXMtMS9zeXN0ZW0uY29uZlwiIFwKKwktRERCVVNfU0VTU0lPTl9DT05GSUdfRklMRT1cIi9ldGMvZGJ1cy0xL3Nlc3Npb24uY29uZlwiIFwKKwktV25vLWFkZHJlc3MgXAorCS1Xbm8tZW1wdHktYm9keSBcCisJLVduby1wb2ludGVyLXNpZ24gXAorCS1Xbm8tc2lnbi1jb21wYXJlIFwKKwktV25vLXVudXNlZC1wYXJhbWV0ZXIKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWFjdGl2YXRpb24uYyBcCisJYWN0aXZhdGlvbi1oZWxwZXIuYyBcCisJYXBwYXJtb3IuYyBcCisJYXVkaXQuYyBcCisJYnVzLmMgXAorCWNvbmZpZy1sb2FkZXItZXhwYXQuYyBcCisJY29uZmlnLXBhcnNlci5jIFwKKwljb25maWctcGFyc2VyLWNvbW1vbi5jIFwKKwljb25uZWN0aW9uLmMgXAorCWRlc2t0b3AtZmlsZS5jIFwKKwlkaXItd2F0Y2gtaW5vdGlmeS5jIFwKKwlkaXNwYXRjaC5jIFwKKwlkcml2ZXIuYyBcCisJZXhwaXJlbGlzdC5jIFwKKwltYWluLmMgXAorCXBvbGljeS5jIFwKKwlzZWxpbnV4LmMgXAorCXNlcnZpY2VzLmMgXAorCXNpZ25hbHMuYyBcCisJc3RhdHMuYyBcCisJdXRpbHMuYworCitpZmVxICgkKEJVSUxEX0VVUkVLQSksdHJ1ZSkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvZXhwYXQvbGliCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmV4cGF0X3N0YXRpYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliZGJ1cworZWxzZQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliZXhwYXQgXAorCWxpYmRidXMKK2VuZGlmCisKK0xPQ0FMX01PRFVMRTo9ZGJ1cy1kYWVtb24KKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idXMvTWFrZWZpbGUuYW0gYi9idXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZjA5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMzNCBAQAorZGJ1c2RhdGFkaXI9JChkYXRhZGlyKS9kYnVzLTEKK2xlZ2FjeWRidXNkYXRhZGlyPSQoc3lzY29uZmRpcikvZGJ1cy0xCitkYnVzX2RhZW1vbl9leGVjZGlyID0gJChEQlVTX0RBRU1PTkRJUikKKworREJVU19CVVNfTElCUyA9IFwKKwkkKFhNTF9MSUJTKSBcCisJJChTRUxJTlVYX0xJQlMpIFwKKwkkKEFQUEFSTU9SX0xJQlMpIFwKKwkkKFRIUkVBRF9MSUJTKSBcCisJJChBRFRfTElCUykgXAorCSQoTkVUV09SS19saWJzKSBcCisJJChOVUxMKQorCitEQlVTX0xBVU5DSEVSX0xJQlMgPSBcCisJJChYTUxfTElCUykgXAorCSQoVEhSRUFEX0xJQlMpIFwKKwkkKE5FVFdPUktfbGlicykgXAorCSQoTlVMTCkKKworQU1fQ1BQRkxBR1MgPSBcCisJLUkkKHRvcF9zcmNkaXIpIFwKKwkkKERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTKSBcCisJJChYTUxfQ0ZMQUdTKSBcCisJJChBUFBBUk1PUl9DRkxBR1MpIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoZGJ1c2RhdGFkaXIpL3N5c3RlbS5jb25mIlwiIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCSQoTlVMTCkKKworIyBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCBpbXByb3ZlIGJhY2t0cmFjZXMKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworRUZFTkNFPQorCitDT05GSUdfSU5fRklMRVM9CQkJCVwKKwlzZXNzaW9uLmNvbmYuaW4JCQkJXAorCXN5c3RlbS5jb25mLmluCQkJCVwKKwlsZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZi5pbgkJXAorCWxlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYuaW4JCVwKKwlvcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCVwKKwlleGFtcGxlLXN5c3RlbS1lbmFibGUtc3RhdHMuY29uZi5pbglcCisJZXhhbXBsZS1zZXNzaW9uLWRpc2FibGUtc3RhdHMuY29uZi5pbglcCisJJChOVUxMKQorCitkYnVzZGF0YV9EQVRBID0gc2Vzc2lvbi5jb25mCitsZWdhY3lkYnVzZGF0YV9EQVRBID0gbGVnYWN5LWNvbmZpZy9zZXNzaW9uLmNvbmYKKworaWYgREJVU19VTklYCitkYnVzZGF0YV9EQVRBICs9IHN5c3RlbS5jb25mCitsZWdhY3lkYnVzZGF0YV9EQVRBICs9IGxlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYKK2VuZGlmCisKK2V4YW1wbGVzZGlyID0gJHtkb2NkaXJ9L2V4YW1wbGVzCitleGFtcGxlc19EQVRBID0gXAorCWV4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mCVwKKwlleGFtcGxlLXNlc3Npb24tZGlzYWJsZS1zdGF0cy5jb25mCVwKKwkkKE5VTEwpCisKK2lmIERCVVNfRU5BQkxFX0xBVU5DSEQKK2FnZW50ZGlyPSQoTEFVTkNIRF9BR0VOVF9ESVIpCithZ2VudF9EQVRBPW9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QKK2VuZGlmCisKK1hNTF9TT1VSQ0VTPWNvbmZpZy1sb2FkZXItZXhwYXQuYworCitpZiBEQlVTX0JVU19FTkFCTEVfS1FVRVVFCitESVJfV0FUQ0hfU09VUkNFPWRpci13YXRjaC1rcXVldWUuYworZWxzZQoraWYgREJVU19CVVNfRU5BQkxFX0lOT1RJRlkKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWlub3RpZnkuYworZWxzZQorRElSX1dBVENIX1NPVVJDRT1kaXItd2F0Y2gtZGVmYXVsdC5jCitlbmRpZgorZW5kaWYKKworQlVTX1NPVVJDRVM9CQkJCQlcCisJYWN0aXZhdGlvbi5jCQkJCVwKKwlhY3RpdmF0aW9uLmgJCQkJXAorCWFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCQkJXAorCWFwcGFybW9yLmMJCQkJXAorCWFwcGFybW9yLmgJCQkJXAorCWF1ZGl0LmMJCQkJCVwKKwlhdWRpdC5oCQkJCQlcCisJYnVzLmMJCQkJCVwKKwlidXMuaAkJCQkJXAorCWNvbmZpZy1wYXJzZXIuYwkJCQlcCisJY29uZmlnLXBhcnNlci5oCQkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5jCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmgJCQlcCisJY29ubmVjdGlvbi5jCQkJCVwKKwljb25uZWN0aW9uLmgJCQkJXAorCWRlc2t0b3AtZmlsZS5jCQkJCVwKKwlkZXNrdG9wLWZpbGUuaAkJCQlcCisJJChESVJfV0FUQ0hfU09VUkNFKQkJCVwKKwlkaXItd2F0Y2guaAkJCQlcCisJZGlzcGF0Y2guYwkJCQlcCisJZGlzcGF0Y2guaAkJCQlcCisJZHJpdmVyLmMJCQkJXAorCWRyaXZlci5oCQkJCVwKKwlleHBpcmVsaXN0LmMJCQkJXAorCWV4cGlyZWxpc3QuaAkJCQlcCisJcG9saWN5LmMJCQkJXAorCXBvbGljeS5oCQkJCVwKKwlzZWxpbnV4LmgJCQkJXAorCXNlbGludXguYwkJCQlcCisJc2VydmljZXMuYwkJCQlcCisJc2VydmljZXMuaAkJCQlcCisJc2lnbmFscy5jCQkJCVwKKwlzaWduYWxzLmgJCQkJXAorCXN0YXRzLmMJCQkJCVwKKwlzdGF0cy5oCQkJCQlcCisJdGVzdC5jCQkJCQlcCisJdGVzdC5oCQkJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwkkKFhNTF9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9TT1VSQ0VTPQkJCQlcCisJJChCVVNfU09VUkNFUykJCQkJXAorCW1haW4uYworCitkYnVzX2RhZW1vbl9MREFERD0JCQkJCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEJXAorCSQoRUZFTkNFKQkJCQkJXAorCSQoREJVU19CVVNfTElCUykKKworTEFVTkNIX0hFTFBFUl9TT1VSQ0VTPQkJCQlcCisJJChYTUxfU09VUkNFUykJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuYwkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuaAkJCVwKKwlkZXNrdG9wLWZpbGUuYwkJCQlcCisJZGVza3RvcC1maWxlLmgJCQkJXAorCXV0aWxzLmMJCQkJCVwKKwl1dGlscy5oCQkJCQlcCisJYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgJCQlcCisJYWN0aXZhdGlvbi1oZWxwZXIuaAkgIAkJXAorCWFjdGl2YXRpb24taGVscGVyLmMKKworIyMgVGhpcyBpcyB0aGUgaW5zdGFsbGVkIGxhdW5jaCBoZWxwZXIgd2l0aCB0aGUgc2V0dWlkIGNoZWNrcworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9TT1VSQ0VTPQkJXAorCWFjdGl2YXRpb24taGVscGVyLWJpbi5jCQkJXAorCSQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0xEQUREPQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQlcCisJJChEQlVTX0xBVU5DSEVSX0xJQlMpCisKKyMjIHdlIGJ1aWxkIGFub3RoZXIgYmluYXJ5IHNvIHdlIGNhbiBkbyB0aGUgbGF1bmNoIHRlc3Rpbmcgd2l0aG91dCByb290IHByaXZzLgorIyMgRE8gTk9UIElOU1RBTEwgVEhJUyBGSUxFCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfU09VUkNFUz0JCVwKKwlhY3RpdmF0aW9uLWhlbHBlci1iaW4uYwkJCVwKKwkkKExBVU5DSF9IRUxQRVJfU09VUkNFUykKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0xEQUREPQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisJJChEQlVTX0xBVU5DSEVSX0xJQlMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUyA9IFwKKwkkKEFNX0NQUEZMQUdTKSBcCisJLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKworIyMgd2UgYnVpbGQgeWV0IGFub3RoZXIgYmluYXJ5IHNvIHdlIGNhbiBkbyB0aGUgT09NIHRlc3RzCisjIyBETyBOT1QgSU5TVEFMTCBUSElTIEZJTEUKK3Rlc3RfYnVzX2xhdW5jaF9oZWxwZXJfU09VUkNFUz0JCVwKKwl0ZXN0LWxhdW5jaC1oZWxwZXIuYyAgIAkJXAorCSQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTKQorCit0ZXN0X2J1c19sYXVuY2hfaGVscGVyX0xEQUREPQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisJJChEQlVTX0xBVU5DSEVSX0xJQlMpCisJJChOVUxMKQorCit0ZXN0X2J1c19sYXVuY2hfaGVscGVyX0NQUEZMQUdTID0gXAorCSQoQU1fQ1BQRkxBR1MpIFwKKwktREFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAlcCisJLURBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTQorCitub2luc3RfUFJPR1JBTVMgPQorZGJ1c19kYWVtb25fZXhlY19QUk9HUkFNUyA9IGRidXMtZGFlbW9uCitpZiBEQlVTX1VOSVgKK2xpYmV4ZWNfUFJPR1JBTVMgPSBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyCitlbmRpZiBEQlVTX1VOSVgKKworIyMgTm90ZSB0aGF0IFRFU1RTIGhhcyBzcGVjaWFsIG1lYW5pbmcgKHN0dWZmIHRvIHVzZSBpbiBtYWtlIGNoZWNrKS4KKyMjIFdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gcnVuIGFueSBvZiB0aGVzZSB0ZXN0cyB1bnRpbCB0ZXN0LyBoYXMgYmVlbgorIyMgY29tcGlsZWQsIHNvIHdlIGRvbid0IHB1dCB0aGVtIGluIFRFU1RTIGhlcmU7IHdlIHJ1biB0aGVtIGluIHRlc3QvCisjIyBpbnN0ZWFkLgorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworIyMgd2UgdXNlIG5vaW5zdF9QUk9HUkFNUyBub3QgY2hlY2tfUFJPR1JBTVMgc28gdGhhdCB3ZSBidWlsZAorIyMgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKKworIyBydW4gYXMgYSB0ZXN0IGJ5IHRlc3QvTWFrZWZpbGUuYW0KK25vaW5zdF9QUk9HUkFNUyArPSB0ZXN0LWJ1cworCitpZiBEQlVTX1VOSVgKKyMgcnVuIGFzIGEgdGVzdCBieSB0ZXN0L01ha2VmaWxlLmFtCitub2luc3RfUFJPR1JBTVMgKz0gdGVzdC1idXMtbGF1bmNoLWhlbHBlciB0ZXN0LWJ1cy1zeXN0ZW0KKyMgdGhpcyBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyBidXQgaXMgbm90LGl0c2VsZiwgYSB0ZXN0Citub2luc3RfUFJPR1JBTVMgKz0gZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0CitlbmRpZiBEQlVTX1VOSVgKKworZW5kaWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKwordGVzdF9idXNfc3lzdGVtX1NPVVJDRVM9CQkJXAorCSQoWE1MX1NPVVJDRVMpCQkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5jCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmgJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmMJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmgJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwl0ZXN0LXN5c3RlbS5jCisKK3Rlc3RfYnVzX3N5c3RlbV9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19CVVNfTElCUykgXAorCSQoTlVMTCkKKwordGVzdF9idXNfU09VUkNFUz0JCQkJXAorCSQoQlVTX1NPVVJDRVMpCQkJCVwKKwl0ZXN0LW1haW4uYworCit0ZXN0X2J1c19MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19CVVNfTElCUykgXAorCSQoTlVMTCkKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCitjbGVhbi1sb2NhbDoKKwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgfHwgdHJ1ZQorCitpbnN0YWxsLWRhdGEtaG9vazoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRidXNkYXRhZGlyKS9zZXNzaW9uLmQKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRidXNkYXRhZGlyKS9zZXJ2aWNlcworaWYgREJVU19VTklYCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsb2NhbHN0YXRlZGlyKS9ydW4vZGJ1cworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGJ1c2RhdGFkaXIpL3N5c3RlbS5kCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChkYnVzZGF0YWRpcikvc3lzdGVtLXNlcnZpY2VzCitlbmRpZgoraWYgSEFWRV9TWVNURU1ECisjIEluc3RhbGwgZGJ1cy5zb2NrZXQgYXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIEQtQnVzIHN0YWNrLgorIyBEZWxpYmVyYXRlbHkgbm90IHVzaW5nICQoTE5fUykgaGVyZTogbG4gLWZzIGlzIG5vdCB1bml2ZXJzYWxseSBwb3J0YWJsZSwKKyMgYnV0IG5laXRoZXIgaXMgc3lzdGVtZCwgc28gaXQncyBPSyB0byBhc3N1bWUgaGVyZSB0aGF0IGxuIGNvbXBsaWVzIHdpdGggU1VTLgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL2RidXMudGFyZ2V0LndhbnRzCisJbG4gLWZzIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9kYnVzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorIyBVbmNvbmRpdGlvbmFsbHkgZW5hYmxlIEQtQnVzIG9uIHN5c3RlbWQgaW5zdGFsbGF0aW9ucworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL3NvY2tldHMudGFyZ2V0LndhbnRzCisJbG4gLWZzIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9zb2NrZXRzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL211bHRpLXVzZXIudGFyZ2V0LndhbnRzCisJbG4gLWZzIC4uL2RidXMuc2VydmljZSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvbXVsdGktdXNlci50YXJnZXQud2FudHMvZGJ1cy5zZXJ2aWNlCitlbmRpZgoraWYgREJVU19FTkFCTEVfVVNFUl9TRVNTSU9OCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kdXNlcnVuaXRkaXIpL3NvY2tldHMudGFyZ2V0LndhbnRzCisJbG4gLWZzIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWR1c2VydW5pdGRpcikvc29ja2V0cy50YXJnZXQud2FudHMvZGJ1cy5zb2NrZXQKK2VuZGlmCisKK2lmIERCVVNfVU5JWAoraW5zdGFsbC1leGVjLWhvb2s6CisJaWYgdGVzdCBgaWQgLXVgIC1lcSAwOyB0aGVuIFwKKwkJY2hvd24gcm9vdDokKERCVVNfVVNFUikgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciQoRVhFRVhUKTsgXAorCQljaG1vZCA0NzUwICQoREVTVERJUikkKGxpYmV4ZWNkaXIpL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCk7IFwKKwllbHNlIFwKKwkJZWNobyAiTm90IGluc3RhbGxpbmcgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBiaW5hcnkgc2V0dWlkISI7IFwKKwkJZWNobyAiWW91J2xsIG5lZWQgdG8gbWFudWFsbHkgc2V0IHBlcm1pc3Npb25zIHRvIHJvb3Q6JChEQlVTX1VTRVIpIGFuZCBwZXJtaXNzaW9ucyA0NzUwIjsgXAorCWZpCitlbmRpZgorCisjIyMjIEluaXQgc2NyaXB0cyBmdW4KK1NDUklQVF9JTl9GSUxFUz1tZXNzYWdlYnVzLmluIFwKKwkJbWVzc2FnZWJ1cy1jb25maWcuaW4gXAorCQlyYy5tZXNzYWdlYnVzLmluCisKKyMjIFJlZCBIYXQgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQKKworaW5pdGRkaXI9JChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorCitpbml0ZF9TQ1JJUFRTPSAJXAorCW1lc3NhZ2VidXMKKworZW5kaWYKKyAjIyBSZWQgSGF0IGVuZAorCisjIyBTbGFja3dhcmUgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRQorCitpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvCisKK2luaXRkX1NDUklQVFM9IAlcCisJcmMubWVzc2FnZWJ1cworCitlbmRpZgorIyMgU2xhY2t3YXJlIGVuZAorCisjIyBDeWd3aW4gc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTgorCitiaW5fU0NSSVBUUz0gCVwKKwltZXNzYWdlYnVzLWNvbmZpZworCitlbmRpZgorIyMgQ3lnd2luIGVuZAorCitpZiBIQVZFX1NZU1RFTUQKK1NDUklQVF9JTl9GSUxFUyArPSBcCisJZGJ1cy5zZXJ2aWNlLmluIFwKKwlkYnVzLnNvY2tldC5pbiBcCisJc3lzdGVtZC11c2VyL2RidXMuc2VydmljZS5pbiBcCisJc3lzdGVtZC11c2VyL2RidXMuc29ja2V0LmluIFwKKwkkKE5VTEwpCisKK3N5c3RlbWRzeXN0ZW11bml0X0RBVEEgPSBcCisJZGJ1cy5zZXJ2aWNlIFwKKwlkYnVzLnNvY2tldAorZW5kaWYKKworaWYgREJVU19FTkFCTEVfVVNFUl9TRVNTSU9OCitzeXN0ZW1kdXNlcnVuaXRfREFUQSA9IFwKKwlzeXN0ZW1kLXVzZXIvZGJ1cy5zZXJ2aWNlIFwKKwlzeXN0ZW1kLXVzZXIvZGJ1cy5zb2NrZXQgXAorCSQoTlVMTCkKK2VuZGlmCisKKyMjIyMgRXh0cmEgZGlzdAorCitFWFRSQV9ESVNUPSQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykKZGlmZiAtLWdpdCBhL2J1cy9OT1RJQ0UgYi9idXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2J1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaCBiL2J1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI5OGRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggIFJldHVybiB2YWx1ZXMgZm9yIHRoZSBsYXVuY2ggaGVscGVyIHdoaWNoIGlzIHNldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBoZWxwZXIgYW5kIHJlYWQgaW4gZGJ1cy1zcGF3bi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9FWElUX0NPREVTX0gKKworLyoqIFJldHVybiBjb2RlcyBmcm9tIHRoZSBsYXVuY2ggaGVscGVyIC0gbm90IHB1YmxpYyBBUEkuIEhvd2V2ZXIsCisgKiAgcHJlc3VtYWJseSBpZiBzb21lIHRoaXJkIHBhcnR5IGRpZCB3cml0ZSB0aGVpciBvd24gbGF1bmNoIGhlbHBlciwKKyAqICB0aGV5IHdvdWxkIGhhdmUgdG8gcmVseSBvbiB0aGVzZSwgb3IgYXQgbGVhc3QgYWx3YXlzIHJldHVybgorICogIDEgZm9yIEdFTkVSSUNfRkFJTFVSRS4KKyAqLworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRSAgICAgIDEKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlkgICAgICAgICAgICAyCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ09ORklHX0lOVkFMSUQgICAgICAgMworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1NFVFVQX0ZBSUxFRCAgICAgICAgIDQKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OQU1FX0lOVkFMSUQgICAgICAgICA1CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQgICAgNgorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQgIDcKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQgICAgICAgICA4CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQgICAgICAgICAgOQorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUyAgICAgICAgIDEwCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQgICAgICAgMTEKKworI2VuZGlmIC8qIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jIGIvYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjE2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgIFNldHVpZCBoZWxwZXIgZm9yIGxhdW5jaGluZyBwcm9ncmFtcyBhcyBhIGN1c3RvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlIChEQnVzRXJyb3IgKmVycm9yKQoreworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlk7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NPTkZJR19JTlZBTElEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9DT05GSUdfSU5WQUxJRDsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfTkFNRV9JTlZBTElEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRklMRV9JTlZBTElEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfSU5WQUxJRF9BUkdTOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQ7CisgIAorICAvKiBzaG91bGQgd2UgYXNzZXJ0PyAqLworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgZXJyb3ItPm5hbWUsIGVycm9yLT5tZXNzYWdlKTsKKyAgCisgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IHJldHZhbDsKKworICAvKiBkZWZhdWx0IGlzIGFsbCBva2F5ICovCisgIHJldHZhbCA9IDA7CisKKyAgLyogaGF2ZSB3ZSB1c2VkIGEgaGVscCBvcHRpb24gb3Igbm90IHNwZWNpZmllZCB0aGUgY29ycmVjdCBhcmd1bWVudHM/ICovCisgIGlmIChhcmdjICE9IDIgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCB8fAorICAgICAgc3RyY21wIChhcmd2WzFdLCAiLT8iKSA9PSAwKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXIgc2VydmljZS50by5hY3RpdmF0ZVxuIik7CisgICAgICAgIGV4aXQgKDApOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGlmICghcnVuX2xhdW5jaF9oZWxwZXIgKGFyZ3ZbMV0sICZlcnJvcikpCisgICAgeworICAgICAgLyogY29udmVydCBlcnJvciB0byBhbiBleGl0IGNvZGUgKi8KKyAgICAgIHJldHZhbCA9IGNvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYyBiL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYwpAQCAtMCwwICsxLDU0OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBhY3RpdmF0aW9uLWhlbHBlci5jICBTZXR1aWQgaGVscGVyIGZvciBsYXVuY2hpbmcgcHJvZ3JhbXMgYXMgYSBjdXN0b20KKyAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci10cml2aWFsLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWlzYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGVsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZSAqCitkZXNrdG9wX2ZpbGVfZm9yX25hbWUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZTsKKyAgREJ1c0xpc3QgKipzZXJ2aWNlX2RpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgY29uc3QgY2hhciAqZGlyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGRlc2t0b3BfZmlsZSA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfYWxsOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfZmlsZW5hbWU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZpbGVuYW1lLCBuYW1lKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwgIi5zZXJ2aWNlIikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzZXJ2aWNlX2RpcnMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChwYXJzZXIpOworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChzZXJ2aWNlX2RpcnMpOworICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChzZXJ2aWNlX2RpcnMsIGxpbmspKQorICAgIHsKKyAgICAgIGRpciA9IGxpbmstPmRhdGE7CisgICAgICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBhdCAnJXMnXG4iLCBkaXIpOworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgICAgICAvKiBjbGVhciB0aGUgcGF0aCBmcm9tIGxhc3QgdGltZSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZmdWxsX3BhdGgsIDApOworCisgICAgICAvKiBidWlsZCB0aGUgZnVsbCBwYXRoICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX3BhdGgsIGRpcikgfHwKKyAgICAgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIlRyeWluZyB0byBsb2FkIGZpbGUgJyVzJ1xuIiwgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmZnVsbF9wYXRoKSk7CisgICAgICBkZXNrdG9wX2ZpbGUgPSBidXNfZGVza3RvcF9maWxlX2xvYWQgKCZmdWxsX3BhdGgsICZ0bXBfZXJyb3IpOworICAgICAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBsb2FkICVzOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubmFtZSwgdG1wX2Vycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgLyogd2UgbWF5IGhhdmUgZmFpbGVkIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZDsgdGhpcyBpcyBub3QgZmF0YWwgKi8KKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgLyogd2Ugb25seSBiYWlsIG91dCBvbiBPT00gKi8KKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgfQorCisgICAgICAvKiBkaWQgd2UgZmluZCB0aGUgZGVza3RvcCBmaWxlIHdlIHdhbnQ/ICovCisgICAgICBpZiAoZGVza3RvcF9maWxlICE9IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBEaWRuJ3QgZmluZCBkZXNrdG9wIGZpbGU7IHNldCBlcnJvciAqLworICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbmFtZSAlcyB3YXMgbm90IHByb3ZpZGVkIGJ5IGFueSAuc2VydmljZSBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgfQorCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKK291dF9maWxlbmFtZToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CitvdXRfYWxsOgorICByZXR1cm4gZGVza3RvcF9maWxlOworfQorCisvKiBDbGVhcnMgdGhlIGVudmlyb25tZW50LCBleGNlcHQgZm9yIERCVVNfU1RBUlRFUl94LAorICogd2hpY2ggd2UgaGFyZGNvZGUgdG8gdGhlIHN5c3RlbSBidXMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2xlYXJfZW52aXJvbm1lbnQgKERCdXNFcnJvciAqZXJyb3IpCit7CisjaWZuZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICAvKiB0b3RhbGx5IGNsZWFyIHRoZSBlbnZpcm9ubWVudCAqLworICBpZiAoIV9kYnVzX2NsZWFyZW52ICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVRVUF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjbGVhciBlbnZpcm9ubWVudFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEVuc3VyZSB0aGUgYnVzIGlzIHNldCB0byBzeXN0ZW0gKi8KKyAgZGJ1c19zZXRlbnYgKCJEQlVTX1NUQVJURVJfQUREUkVTUyIsIERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MpOworICBkYnVzX3NldGVudiAoIkRCVVNfU1RBUlRFUl9CVVNfVFlQRSIsICJzeXN0ZW0iKTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3Blcm1pc3Npb25zIChjb25zdCBjaGFyICpkYnVzX3VzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisjaWZuZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICB1aWRfdCB1aWQsIGV1aWQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgIHB3ID0gTlVMTDsKKyAgdWlkID0gMDsKKyAgZXVpZCA9IDA7CisKKyAgLyogYmFpbCBvdXQgdW5sZXNzIHRoZSBkYnVzIHVzZXIgaXMgaW52b2tpbmcgdGhlIGhlbHBlciAqLworICBwdyA9IGdldHB3bmFtKGRidXNfdXNlcik7CisgIGlmICghcHcpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kIHVzZXIgJyVzJyIsIGRidXNfdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB1aWQgPSBnZXR1aWQoKTsKKyAgaWYgKHB3LT5wd191aWQgIT0gdWlkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJub3QgaW52b2tlZCBmcm9tIHVzZXIgJyVzJyIsIGRidXNfdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGJhaWwgb3V0IHVubGVzcyB3ZSBhcmUgc2V0dWlkIHRvIHVzZXIgcm9vdCAqLworICBldWlkID0gZ2V0ZXVpZCgpOworICBpZiAoZXVpZCAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJub3Qgc2V0dWlkIHJvb3QiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX25hbWUgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY2hhciAqbmFtZV90bXA7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiB0cnkgdG8gZ2V0IE5hbWUgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZV90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogdmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIGZpbGUgc2VydmljZSBuYW1lICovCisgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgbmFtZV90bXApICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSAnJXMnIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHZhbHVlIiwgbmFtZV90bXApOworICAgICAgZ290byBmYWlsZWRfZnJlZTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworZmFpbGVkX2ZyZWU6CisgIC8qIHdlIGRvbid0IHJldHVybiB0aGUgbmFtZSwgc28gZnJlZSBpdCBoZXJlICovCisgIGRidXNfZnJlZSAobmFtZV90bXApOworZmFpbGVkOgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9wYXJhbWV0ZXJzX2Zvcl9zZXJ2aWNlIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqKmV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjaGFyICpleGVjX3RtcDsKKyAgY2hhciAqdXNlcl90bXA7CisKKyAgZXhlY190bXAgPSBOVUxMOworICB1c2VyX3RtcCA9IE5VTEw7CisKKyAgLyogY2hlY2sgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgKi8KKyAgaWYgKCFjaGVja19zZXJ2aWNlX25hbWUgKGRlc2t0b3BfZmlsZSwgc2VydmljZV9uYW1lLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogZ2V0IHRoZSBjb21wbGV0ZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlICovCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9FWEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4ZWNfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBnZXQgdGhlIHVzZXIgdGhhdCBzaG91bGQgcnVuIHRoaXMgc2VydmljZSAtIHVzZXIgaXMgY29tcHVsc2FyeSBmb3Igc3lzdGVtIGFjdGl2YXRpb24gKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcl90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIG9ubHkgYXNzaWduIGlmIGFsbCB0aGUgY2hlY2tzIHBhc3NlZCAqLworICAqZXhlYyA9IGV4ZWNfdG1wOworICAqdXNlciA9IHVzZXJfdG1wOworICByZXR1cm4gVFJVRTsKKworZmFpbGVkOgorICBkYnVzX2ZyZWUgKGV4ZWNfdG1wKTsKKyAgZGJ1c19mcmVlICh1c2VyX3RtcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzd2l0Y2hfdXNlciAoY2hhciAqdXNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgIC8qIGZpbmQgdXNlciAqLworICBwdyA9IGdldHB3bmFtICh1c2VyKTsKKyAgaWYgKCFwdykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZmluZCB1c2VyICclcydcbiIsIHVzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBncm91cCBhY2Nlc3MgbGlzdCAqLworICBpZiAoaW5pdGdyb3VwcyAodXNlciwgcHctPnB3X2dpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGluaXRpYWxpemUgZ3JvdXBzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGNoYW5nZSB0byB0aGUgcHJpbWFyeSBncm91cCBmb3IgdGhlIHVzZXIgKi8KKyAgaWYgKHNldGdpZCAocHctPnB3X2dpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHNldGdpZCBncm91cCAlaSIsIHB3LT5wd19naWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBjaGFuZ2UgdG8gdGhlIHVzZXIgc3BlY2lmaWVkICovCisgIGlmIChzZXR1aWQgKHB3LT5wd191aWQpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0dWlkIHVzZXIgJWkiLCBwdy0+cHdfdWlkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhlY19mb3JfY29ycmVjdF91c2VyIChjaGFyICpleGVjLCBjaGFyICp1c2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICoqYXJndjsKKyAgaW50IGFyZ2M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBhcmdjID0gMDsKKyAgcmV0dmFsID0gVFJVRTsKKyAgYXJndiA9IE5VTEw7CisKKyAgaWYgKCFzd2l0Y2hfdXNlciAodXNlciwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjb252ZXJ0IGNvbW1hbmQgaW50byBhcmd1bWVudHMgKi8KKyAgaWYgKCFfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChleGVjLCAmYXJnYywgJmFyZ3YsIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKyAgLyogcmVwbGFjZSB3aXRoIG5ldyBiaW5hcnksIHdpdGggbm8gZW52aXJvbm1lbnQgKi8KKyAgaWYgKGV4ZWN2IChhcmd2WzBdLCBhcmd2KSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlYzogJXMiLCBhcmd2WzBdKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2J1c19uYW1lIChjb25zdCBjaGFyICpidXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGJ1c19uYW1lKTsKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VSVklDRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJidXMgbmFtZSAnJXMnIGlzIG5vdCBhIHZhbGlkIGJ1cyBuYW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJ1c19uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZXRfY29ycmVjdF9wYXJzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqKnBhcnNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb25maWdfZmlsZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworI2lmZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICBjb25zdCBjaGFyICp0ZXN0X2NvbmZpZ19maWxlOworI2VuZGlmCisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyNpZmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgdGVzdF9jb25maWdfZmlsZSA9IE5VTEw7CisKKyAgLyogdGhlcmUgaXMgbm8gX3dheV8gd2Ugc2hvdWxkIGJlIHNldHVpZCBpZiB0aGlzIGRlZmluZSBpcyBzZXQuCisgICAqIGJ1dCB3ZSBzaG91bGQgYmUgZG91Ymx5IHBhcmFub2lkIGFuZCBjaGVjay4uLiAqLworICBpZiAoZ2V0dWlkKCkgIT0gZ2V0ZXVpZCgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCBiaW5hcnkgaXMgc2V0dWlkISIpOworCisgIC8qIHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgaG9sZS4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG9ubHkgcGFzc2VkIGluIHRoZQorICAgKiBkYnVzLWRhZW1vbi1sYXVjaC1oZWxwZXItdGVzdCBOT04tU0VUVUlEIGxhdW5jaGVyICovCisgIHRlc3RfY29uZmlnX2ZpbGUgPSBfZGJ1c19nZXRlbnYgKCJURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIik7CisgIGlmICh0ZXN0X2NvbmZpZ19maWxlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIFRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgZW52IHZhcmlhYmxlIGlzIG5vdCBzZXQiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyNlbmRpZgorCisgIC8qIHdlIF9vbmx5XyB1c2UgdGhlIHByZWRlZmluZWQgc3lzdGVtIGNvbmZpZyBmaWxlICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2ZyZWVfY29uZmlnOworICAgIH0KKyNlbHNlCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCB0ZXN0X2NvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfZnJlZV9jb25maWc7CisgICAgfQorI2VuZGlmCisKKyAgLyogd2hlcmUgYXJlIHdlIHBvaW50aW5nLi4uLiAqLworICBfZGJ1c192ZXJib3NlICgiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXI6IHVzaW5nIGNvbmZpZyBmaWxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29uZmlnX2ZpbGUpKTsKKworICAvKiBnZXQgdGhlIGRidXMgdXNlciAqLworICAqcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkICgmY29uZmlnX2ZpbGUsIFRSVUUsIE5VTEwsIGVycm9yKTsKKyAgaWYgKCpwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBnb3RvIG91dF9mcmVlX2NvbmZpZzsKKyAgICB9CisKKyAgLyogd29vdCAqLworICByZXR2YWwgPSBUUlVFOworCitvdXRfZnJlZV9jb25maWc6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xhdW5jaF9idXNfbmFtZSAoY29uc3QgY2hhciAqYnVzX25hbWUsIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICBjaGFyICpleGVjLCAqdXNlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGV4ZWMgPSBOVUxMOworICB1c2VyID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogZ2V0IHRoZSBjb3JyZWN0IHNlcnZpY2UgZmlsZSBmb3IgdGhlIG5hbWUgd2UgYXJlIHRyeWluZyB0byBhY3RpdmF0ZSAqLworICBkZXNrdG9wX2ZpbGUgPSBkZXNrdG9wX2ZpbGVfZm9yX25hbWUgKHBhcnNlciwgYnVzX25hbWUsIGVycm9yKTsKKyAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBnZXQgZXhlYyBhbmQgdXNlciBmb3Igc2VydmljZSBuYW1lICovCisgIGlmICghZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UgKGRlc2t0b3BfZmlsZSwgYnVzX25hbWUsICZleGVjLCAmdXNlciwgZXJyb3IpKQorICAgIGdvdG8gZmluaXNoOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogTmFtZT0nJXMnXG4iLCBidXNfbmFtZSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogRXhlYz0nJXMnXG4iLCBleGVjKTsKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBVc2VyPSclcydcbiIsIHVzZXIpOworCisgIC8qIGFjdHVhbGx5IGV4ZWN1dGUgKi8KKyAgaWYgKCFleGVjX2Zvcl9jb3JyZWN0X3VzZXIgKGV4ZWMsIHVzZXIsIGVycm9yKSkKKyAgICBnb3RvIGZpbmlzaDsKKworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIGRidXNfZnJlZSAoZXhlYyk7CisgIGRidXNfZnJlZSAodXNlcik7CisgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19kYnVzX3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpkYnVzX3VzZXI7CisKKyAgZGJ1c191c2VyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKHBhcnNlcik7CisgIGlmIChkYnVzX3VzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ09ORklHX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBnZXQgdXNlciBmcm9tIGNvbmZpZyBmaWxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHBlcm1pc3Npb25zIGFyZSBjb3JyZWN0ICovCisgIGlmICghY2hlY2tfcGVybWlzc2lvbnMgKGRidXNfdXNlciwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK3J1bl9sYXVuY2hfaGVscGVyIChjb25zdCBjaGFyICpidXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBwYXJzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBjbGVhciB0aGUgZW52aXJvbm1lbnQsIGFwYXJ0IGZyb20gYSBmZXcgc2VsZWN0IHNldHRpbmdzICovCisgIGlmICghY2xlYXJfZW52aXJvbm1lbnQgKGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYnVzIG5hbWUgKi8KKyAgaWYgKCFjaGVja19idXNfbmFtZSAoYnVzX25hbWUsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGdldCB0aGUgY29ycmVjdCBwYXJzZXIsIGVpdGhlciB0aGUgdGVzdCBvciBkZWZhdWx0IHBhcnNlciAqLworICBpZiAoIWdldF9jb3JyZWN0X3BhcnNlciAoJnBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hlY2sgd2UgYXJlIGJlaW5nIGludm9rZWQgYnkgdGhlIGNvcnJlY3QgZGJ1cyB1c2VyICovCisgIGlmICghY2hlY2tfZGJ1c191c2VyIChwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yX2ZyZWVfcGFyc2VyOworCisgIC8qIGxhdW5jaCB0aGUgYnVzIHdpdGggdGhlIHNlcnZpY2UgZGVmaW5lZCB1c2VyICovCisgIGlmICghbGF1bmNoX2J1c19uYW1lIChidXNfbmFtZSwgcGFyc2VyLCBlcnJvcikpCisgICAgZ290byBlcnJvcl9mcmVlX3BhcnNlcjsKKworICAvKiB3b29ob28hICovCisgIHJldHZhbCA9IFRSVUU7CisKK2Vycm9yX2ZyZWVfcGFyc2VyOgorICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKK2Vycm9yOgorICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9idXMvYWN0aXZhdGlvbi1oZWxwZXIuaCBiL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWE0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYWN0aXZhdGlvbi1oZWxwZXIuaApAQCAtMCwwICsxLDMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24taGVscGVyLmggIFRoZSBhY3R1YWwgYWN0aXZhdGlvbiBoZWxwZXIgc3BsaXQgZnJvbSB0aGUgbWFpbgorICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9yIHRlc3RpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSAorCitkYnVzX2Jvb2xfdCBydW5fbGF1bmNoX2hlbHBlciAoY29uc3QgY2hhciAqYnVzX25hbWUsIERCdXNFcnJvciAqZXJyb3IpOworCisKKyNlbmRpZiAvKiBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2FjdGl2YXRpb24uYyBiL2J1cy9hY3RpdmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxMTMyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9hY3RpdmF0aW9uLmMKQEAgLTAsMCArMSwyNjYxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24uYyAgQWN0aXZhdGlvbiBvZiBzZXJ2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBJbWVuZGlvIEhCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oIgorI2luY2x1ZGUgImRlc2t0b3AtZmlsZS5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGVsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zcGF3bi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aW1lb3V0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK3N0cnVjdCBCdXNBY3RpdmF0aW9uCit7CisgIGludCByZWZjb3VudDsKKyAgREJ1c0hhc2hUYWJsZSAqZW50cmllczsKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19hY3RpdmF0aW9uczsKKyAgY2hhciAqc2VydmVyX2FkZHJlc3M7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIGludCBuX3BlbmRpbmdfYWN0aXZhdGlvbnM7IC8qKjwgVGhpcyBpcyBpbiBmYWN0IHRoZSBudW1iZXIgb2YgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaS5lLiBudW1iZXIgb2YgcGVuZGluZyBhY3RpdmF0aW9uIHJlcXVlc3RzLCBub3QgcGVuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhY3RpdmF0aW9ucyBwZXIgc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoVGFibGUgKmRpcmVjdG9yaWVzOworICBEQnVzSGFzaFRhYmxlICplbnZpcm9ubWVudDsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgY2hhciAqZGlyX2M7CisgIERCdXNIYXNoVGFibGUgKmVudHJpZXM7Cit9IEJ1c1NlcnZpY2VEaXJlY3Rvcnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZXhlYzsKKyAgY2hhciAqdXNlcjsKKyAgY2hhciAqc3lzdGVtZF9zZXJ2aWNlOworICB1bnNpZ25lZCBsb25nIG10aW1lOworICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpcjsKKyAgY2hhciAqZmlsZW5hbWU7Cit9IEJ1c0FjdGl2YXRpb25FbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5OworCitzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeQoreworICAvKiBOb3JtYWxseSBhIG1ldGhvZCBjYWxsLCBidXQgaWYgY29ubmVjdGlvbiBpcyBOVUxMLCB0aGlzIGlzIGEgc2lnbmFsCisgICAqIGluc3RlYWQuCisgICAqLworICBEQnVzTWVzc2FnZSAqYWN0aXZhdGlvbl9tZXNzYWdlOworICAvKiBOVUxMIGlmIHRoaXMgYWN0aXZhdGlvbiBlbnRyeSBpcyBmb3IgdGhlIGRidXMtZGFlbW9uIGl0c2VsZiwKKyAgICogd2FpdGluZyBmb3Igc3lzdGVtZCB0byBzdGFydC4gSW4gdGhpcyBjYXNlLCBhdXRvX2FjdGl2YXRpb24gaXMgYWx3YXlzCisgICAqIFRSVUUuCisgICAqLworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBkYnVzX2Jvb2xfdCBhdXRvX2FjdGl2YXRpb247Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgcmVmY291bnQ7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGNoYXIgKnNlcnZpY2VfbmFtZTsKKyAgY2hhciAqZXhlYzsKKyAgY2hhciAqc3lzdGVtZF9zZXJ2aWNlOworICBEQnVzTGlzdCAqZW50cmllczsKKyAgaW50IG5fZW50cmllczsKKyAgREJ1c0JhYnlzaXR0ZXIgKmJhYnlzaXR0ZXI7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7Cit9IEJ1c1BlbmRpbmdBY3RpdmF0aW9uOworCisjaWYgMAorc3RhdGljIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKgorYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3JlZiAoQnVzU2VydmljZURpcmVjdG9yeSAqZGlyKQoreworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQpOworCisgIGRpci0+cmVmY291bnQrKzsKKworICByZXR1cm4gZGlyOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKEJ1c1NlcnZpY2VEaXJlY3RvcnkgKmRpcikKK3sKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQgPiAwKTsKKyAgZGlyLT5yZWZjb3VudC0tOworCisgIGlmIChkaXItPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGRpci0+ZW50cmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkaXItPmVudHJpZXMpOworCisgIGRidXNfZnJlZSAoZGlyLT5kaXJfYyk7CisgIGRidXNfZnJlZSAoZGlyKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAoQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIGlmIChlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisKKyAgaWYgKGVudHJ5LT5jb25uZWN0aW9uKQorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZW50cnktPmNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZSAoZW50cnkpOworfQorCitzdGF0aWMgQnVzUGVuZGluZ0FjdGl2YXRpb24gKgorYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBlbmRpbmdfYWN0aXZhdGlvbjsKK30KKworc3RhdGljIHZvaWQKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSByZXF1aXJlcyB0aGlzICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAocGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkKQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KTsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IEZBTFNFOworICAgIH0KKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCk7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcikKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpOworICAgIH0KKworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMpOworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+c3lzdGVtZF9zZXJ2aWNlKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAoZW50cnkpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKyAgICB9CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zIC09CisgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5uX2VudHJpZXM7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyA+PSAwKTsKKworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBCdXNBY3RpdmF0aW9uRW50cnkgKgorYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5KQoreworICBfZGJ1c19hc3NlcnQgKGVudHJ5LT5yZWZjb3VudCA+IDApOworICBlbnRyeS0+cmVmY291bnQrKzsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZiAoQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeSkKK3sKKyAgaWYgKGVudHJ5ID09IE5VTEwpIC8qIGhhc2ggdGFibGUgcmVxdWlyZXMgdGhpcyAqLworICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGVudHJ5LT5yZWZjb3VudCA+IDApOworICBlbnRyeS0+cmVmY291bnQtLTsKKworICBpZiAoZW50cnktPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19mcmVlIChlbnRyeS0+bmFtZSk7CisgIGRidXNfZnJlZSAoZW50cnktPmV4ZWMpOworICBkYnVzX2ZyZWUgKGVudHJ5LT51c2VyKTsKKyAgZGJ1c19mcmVlIChlbnRyeS0+ZmlsZW5hbWUpOworICBkYnVzX2ZyZWUgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworCisgIGRidXNfZnJlZSAoZW50cnkpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3VwZGF0ZV9kZXNrdG9wX2ZpbGVfZW50cnkgKEJ1c0FjdGl2YXRpb24gICAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRGVza3RvcEZpbGUgICAgICAqZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKm5hbWUsICpleGVjLCAqdXNlciwgKmV4ZWNfdG1wLCAqc3lzdGVtZF9zZXJ2aWNlOworICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5OworICBEQnVzU3RhdCBzdGF0X2J1ZjsKKyAgREJ1c1N0cmluZyBmaWxlX3BhdGg7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgbmFtZSA9IE5VTEw7CisgIGV4ZWMgPSBOVUxMOworICB1c2VyID0gTlVMTDsKKyAgZXhlY190bXAgPSBOVUxMOworICBlbnRyeSA9IE5VTEw7CisgIHN5c3RlbWRfc2VydmljZSA9IE5VTEw7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZV9wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlX3BhdGgsIHNfZGlyLT5kaXJfYykgfHwKKyAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZmlsZV9wYXRoLCBmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0YXQgKCZmaWxlX3BhdGgsICZzdGF0X2J1ZiwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc3RhdCB0aGUgc2VydmljZSBmaWxlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9FWEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4ZWNfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGV4ZWMgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGV4ZWNfdG1wKSk7CisgIGRidXNfZnJlZSAoZXhlY190bXApOworICBleGVjX3RtcCA9IE5VTEw7CisKKyAgLyogdXNlciBpcyBub3QgX3JlcXVpcmVkXyB1bmxlc3Mgd2UgYXJlIHVzaW5nIHN5c3RlbSBhY3RpdmF0aW9uICovCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9VU0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXIsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgLyogaWYgd2UgZ290IE9PTSwgdGhlbiBleGl0ICovCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGlmIHdlIGhhdmUgZXJyb3IgYmVjYXVzZSB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGVuIGNvbnRpbnVlICovCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHVzZXIpOworICAgICAgICAgIHVzZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworCisgIC8qIHN5c3RlbWQgc2VydmljZSBpcyBuZXZlciByZXF1aXJlZCAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU1lTVEVNRF9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5c3RlbWRfc2VydmljZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAvKiBpZiB3ZSBnb3QgT09NLCB0aGVuIGV4aXQgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBlcnJvciBiZWNhdXNlIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoZW4gY29udGludWUgKi8KKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGRidXNfZnJlZSAoc3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICBzeXN0ZW1kX3NlcnZpY2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgZW50cnkgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNfZGlyLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKSAvKiBOZXcgZmlsZSAqLworICAgIHsKKyAgICAgIC8qIEZJWE1FIHdlIG5lZWQgYSBiZXR0ZXItZGVmaW5lZCBhbGdvcml0aG0gZm9yIHdoaWNoIHNlcnZpY2UgZmlsZSB0bworICAgICAgICogcGljayB0aGFuICJ3aGljaGV2ZXIgb25lIGlzIGZpcnN0IGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyIKKyAgICAgICAqLworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSAlcyBhbHJlYWR5IGV4aXN0cyBpbiBhY3RpdmF0aW9uIGVudHJ5IGxpc3RcbiIsIG5hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGVudHJ5ID0gZGJ1c19uZXcwIChCdXNBY3RpdmF0aW9uRW50cnksIDEpOworICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGVudHJ5LT5uYW1lID0gbmFtZTsKKyAgICAgIGVudHJ5LT5leGVjID0gZXhlYzsKKyAgICAgIGVudHJ5LT51c2VyID0gdXNlcjsKKyAgICAgIGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UgPSBzeXN0ZW1kX3NlcnZpY2U7CisgICAgICBlbnRyeS0+cmVmY291bnQgPSAxOworCisgICAgICAvKiBvd25lcnNoaXAgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gZW50cnksIGRvIG5vdCBmcmVlIHNlcGFyYXRlbHkgKi8KKyAgICAgIG5hbWUgPSBOVUxMOworICAgICAgZXhlYyA9IE5VTEw7CisgICAgICB1c2VyID0gTlVMTDsKKyAgICAgIHN5c3RlbWRfc2VydmljZSA9IE5VTEw7CisKKyAgICAgIGVudHJ5LT5zX2RpciA9IHNfZGlyOworICAgICAgZW50cnktPmZpbGVuYW1lID0gX2RidXNfc3RyZHVwIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSk7CisgICAgICBpZiAoIWVudHJ5LT5maWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIGVudHJ5LT5uYW1lLCBidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKGVudHJ5KSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzX2Rpci0+ZW50cmllcywgZW50cnktPmZpbGVuYW1lLCBidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKGVudHJ5KSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZXZlcnQgdGhlIGluc2VydGlvbiBpbiB0aGUgZW50cmllcyB0YWJsZSAqLworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgZW50cnktPm5hbWUpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIFwiJXNcIiB0byBsaXN0IG9mIHNlcnZpY2VzXG4iLCBlbnRyeS0+bmFtZSk7CisgICAgfQorICBlbHNlIC8qIEp1c3QgdXBkYXRlIHRoZSBlbnRyeSAqLworICAgIHsKKyAgICAgIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3JlZiAoZW50cnkpOworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSk7CisKKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlRoZSBuZXcgc2VydmljZSBuYW1lIFwiJXNcIiBvZiBzZXJ2aWNlIGZpbGUgXCIlc1wiIGlzIGFscmVhZHkgaW4gY2FjaGUsIGlnbm9yaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbmV3IHNlcnZpY2UgbmFtZSBcIiVzXCIgb2Ygc2VydmljZSBmaWxlIFwiJXNcIiBpcyBhbHJlYWR5IGluIGNhY2hlLCBpZ25vcmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZV9wYXRoKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgLyogb3duZXJzaGlwIGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIGVudHJ5LCBkbyBub3QgZnJlZSBzZXBhcmF0ZWx5ICovCisgICAgICBkYnVzX2ZyZWUgKGVudHJ5LT5uYW1lKTsKKyAgICAgIGVudHJ5LT5uYW1lID0gbmFtZTsKKyAgICAgIG5hbWUgPSBOVUxMOworCisgICAgICBkYnVzX2ZyZWUgKGVudHJ5LT5leGVjKTsKKyAgICAgIGVudHJ5LT5leGVjID0gZXhlYzsKKyAgICAgIGV4ZWMgPSBOVUxMOworCisgICAgICBkYnVzX2ZyZWUgKGVudHJ5LT51c2VyKTsKKyAgICAgIGVudHJ5LT51c2VyID0gdXNlcjsKKyAgICAgIHVzZXIgPSBOVUxMOworCisgICAgICBkYnVzX2ZyZWUgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSA9IHN5c3RlbWRfc2VydmljZTsKKyAgICAgIHN5c3RlbWRfc2VydmljZSA9IE5VTEw7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5uYW1lLCBidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYoZW50cnkpKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgLyogQWxzbyByZW1vdmUgcGF0aCB0byBlbnRyaWVzIGhhc2ggc2luY2Ugd2Ugd2FudCB0aGlzIGluIHN5bmMgd2l0aAorICAgICAgICAgICAqIHRoZSBlbnRyaWVzIGhhc2ggdGFibGUgKi8KKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGVudHJ5LT5zX2Rpci0+ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5maWxlbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgZW50cnktPm10aW1lID0gc3RhdF9idWYubXRpbWU7CisgIHJldHZhbCA9IFRSVUU7CisKK291dDoKKyAgLyogaWYgdGhlc2UgaGF2ZSBiZWVuIHRyYW5zZmVycmVkIGludG8gZW50cnksIHRoZSB2YXJpYWJsZXMgd2lsbCBiZSBOVUxMICovCisgIGRidXNfZnJlZSAobmFtZSk7CisgIGRidXNfZnJlZSAoZXhlYyk7CisgIGRidXNfZnJlZSAodXNlcik7CisgIGRidXNfZnJlZSAoc3lzdGVtZF9zZXJ2aWNlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlX3BhdGgpOworCisgIGlmIChlbnRyeSkKKyAgICBidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZiAoZW50cnkpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9maWxlIChCdXNBY3RpdmF0aW9uICAgICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICoqdXBkYXRlZF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdGF0IHN0YXRfYnVmOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqdG1wX2VudHJ5OworICBEQnVzU3RyaW5nIGZpbGVfcGF0aDsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKworICByZXR2YWwgPSBUUlVFOworICB0bXBfZW50cnkgPSBlbnRyeTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBlbnRyeS0+ZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlX3BhdGgpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZpbGVfcGF0aCwgZW50cnktPnNfZGlyLT5kaXJfYykgfHwKKyAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZmlsZV9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0YXQgKCZmaWxlX3BhdGgsICZzdGF0X2J1ZiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKioqKiBDYW4ndCBzdGF0IGZpbGUgXCIlc1wiLCByZW1vdmluZyBmcm9tIGNhY2hlXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZV9wYXRoKSk7CisKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgZW50cnktPm5hbWUpOworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChlbnRyeS0+c19kaXItPmVudHJpZXMsIGVudHJ5LT5maWxlbmFtZSk7CisKKyAgICAgIHRtcF9lbnRyeSA9IE5VTEw7CisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHN0YXRfYnVmLm10aW1lID4gZW50cnktPm10aW1lKQorICAgICAgICB7CisgICAgICAgICAgQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZTsKKyAgICAgICAgICBEQnVzRXJyb3IgdG1wX2Vycm9yOworCisgICAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICAgICAgICAgIGRlc2t0b3BfZmlsZSA9IGJ1c19kZXNrdG9wX2ZpbGVfbG9hZCAoJmZpbGVfcGF0aCwgJnRtcF9lcnJvcik7CisgICAgICAgICAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGQgbm90IGxvYWQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBAdG9kbyBXZSBjYW4gcmV0dXJuIE9PTSBvciBhIERCVVNfRVJST1JfRkFJTEVEIGVycm9yCisgICAgICAgICAgICogICAgICAgSGFuZGxlIHRoZXNlIGJvdGggYmV0dGVyCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCF1cGRhdGVfZGVza3RvcF9maWxlX2VudHJ5IChhY3RpdmF0aW9uLCBlbnRyeS0+c19kaXIsICZmaWxlbmFtZSwgZGVza3RvcF9maWxlLCAmdG1wX2Vycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICAgICAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlX3BhdGgpOworCisgIGlmICh1cGRhdGVkX2VudHJ5ICE9IE5VTEwpCisgICAgKnVwZGF0ZWRfZW50cnkgPSB0bXBfZW50cnk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyogd2FybmluZzogdGhpcyBkb2Vzbid0IGZ1bGx5ICJ1bmRvIiBpdHNlbGYgb24gZmFpbHVyZSwgaS5lLiBkb2Vzbid0IHN0cmlwCisgKiBoYXNoIGVudHJpZXMgaXQgYWxyZWFkeSBhZGRlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit1cGRhdGVfZGlyZWN0b3J5IChCdXNBY3RpdmF0aW9uICAgICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgQnVzU2VydmljZURpcmVjdG9yeSAqc19kaXIsCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0Rpckl0ZXIgKml0ZXI7CisgIERCdXNTdHJpbmcgZGlyLCBmaWxlbmFtZTsKKyAgQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZTsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5OworICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpdGVyID0gTlVMTDsKKyAgZGVza3RvcF9maWxlID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRpciwgc19kaXItPmRpcl9jKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogZnJvbSB0aGlzIHBvaW50IGl0J3Mgc2FmZSB0byAiZ290byBvdXQiICovCisKKyAgaXRlciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmZGlyLCBlcnJvcik7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBvcGVuIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBzX2Rpci0+ZGlyX2MsCisgICAgICAgICAgICAgICAgICAgICBlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogInVua25vd24iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBOb3cgcmVhZCB0aGUgZmlsZXMgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChpdGVyLCAmZmlsZW5hbWUsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmZnVsbF9wYXRoLCAwKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZW5hbWUsICIuc2VydmljZSIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0uc2VydmljZSBmaWxlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoc19kaXItPmVudHJpZXMsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICBpZiAoZW50cnkpIC8qIEFscmVhZHkgaGFzIHRoaXMgc2VydmljZSBmaWxlIGluIHRoZSBjYWNoZSAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2ZpbGUgKGFjdGl2YXRpb24sIGVudHJ5LCBOVUxMLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgc19kaXItPmRpcl9jKSB8fAorICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBOZXcgZmlsZSAqLworICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZnVsbF9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIEB0b2RvIFdlIGNhbiByZXR1cm4gT09NIG9yIGEgREJVU19FUlJPUl9GQUlMRUQgZXJyb3IKKyAgICAgICAqICAgICAgIEhhbmRsZSB0aGVzZSBib3RoIGJldHRlcgorICAgICAgICovCisgICAgICBpZiAoIXVwZGF0ZV9kZXNrdG9wX2ZpbGVfZW50cnkgKGFjdGl2YXRpb24sIHNfZGlyLCAmZmlsZW5hbWUsIGRlc2t0b3BfZmlsZSwgJnRtcF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgZGVza3RvcF9maWxlID0gTlVMTDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgYWRkICVzIHRvIGFjdGl2YXRpb24gZW50cnkgbGlzdDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwgdG1wX2Vycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICAgICAgICAgIGRlc2t0b3BfZmlsZSA9IE5VTEw7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoaXRlciAhPSBOVUxMKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwb3B1bGF0ZV9lbnZpcm9ubWVudCAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbikKK3sKKyAgREJ1c1N0cmluZyAgIGtleTsKKyAgREJ1c1N0cmluZyAgIHZhbHVlOworICBpbnQgICAgICAgICAgaTsKKyAgY2hhciAgICAgICAqKmVudmlyb25tZW50OworICBkYnVzX2Jvb2xfdCAgcmV0dmFsID0gRkFMU0U7CisKKyAgZW52aXJvbm1lbnQgPSBfZGJ1c19nZXRfZW52aXJvbm1lbnQgKCk7CisKKyAgaWYgKGVudmlyb25tZW50ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmb3IgKGkgPSAwOyBlbnZpcm9ubWVudFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgma2V5LCBlbnZpcm9ubWVudFtpXSkpCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKCZrZXksICc9JywgJnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmhhc2hfa2V5LCAqaGFzaF92YWx1ZTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZrZXksICZoYXNoX2tleSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ2YWx1ZSwgJmhhc2hfdmFsdWUpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfa2V5LCBoYXNoX3ZhbHVlKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmtleSwgMCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnZhbHVlLCAwKTsKKyAgICB9CisKKyAgaWYgKGVudmlyb25tZW50W2ldICE9IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKK291dDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdmFsdWUpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3JlbG9hZCAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgICAgICAqbGluazsKKyAgY2hhciAgICAgICAgICAqZGlyOworCisgIGlmIChhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcyAhPSBOVUxMKQorICAgIGRidXNfZnJlZSAoYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MpOworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGFkZHJlc3MsICZhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYWN0aXZhdGlvbi0+ZW50cmllcyAhPSBOVUxMKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGFjdGl2YXRpb24tPmVudHJpZXMpOworICBhY3RpdmF0aW9uLT5lbnRyaWVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbilidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZik7CisgIGlmIChhY3RpdmF0aW9uLT5lbnRyaWVzID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMgIT0gTlVMTCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcyk7CisgIGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19zZXJ2aWNlX2RpcmVjdG9yeV91bnJlZik7CisKKyAgaWYgKGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyOworCisgICAgICBkaXIgPSBfZGJ1c19zdHJkdXAgKChjb25zdCBjaGFyICopIGxpbmstPmRhdGEpOworICAgICAgaWYgKCFkaXIpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIHNfZGlyID0gZGJ1c19uZXcwIChCdXNTZXJ2aWNlRGlyZWN0b3J5LCAxKTsKKyAgICAgIGlmICghc19kaXIpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGRpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBzX2Rpci0+cmVmY291bnQgPSAxOworICAgICAgc19kaXItPmRpcl9jID0gZGlyOworCisgICAgICBzX2Rpci0+ZW50cmllcyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pYnVzX2FjdGl2YXRpb25fZW50cnlfdW5yZWYpOworCisgICAgICBpZiAoIXNfZGlyLT5lbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmIChzX2Rpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMsIHNfZGlyLT5kaXJfYywgc19kaXIpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmIChzX2Rpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAvKiBvbmx5IGZhaWwgb24gT09NLCBpdCBpcyBvayBpZiB3ZSBjYW4ndCByZWFkIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgIGlmICghdXBkYXRlX2RpcmVjdG9yeSAoYWN0aXZhdGlvbiwgc19kaXIsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIH0KKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoZGlyZWN0b3JpZXMsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKyBmYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKK30KKworQnVzQWN0aXZhdGlvbioKK2J1c19hY3RpdmF0aW9uX25ldyAoQnVzQ29udGV4dCAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gZGJ1c19uZXcwIChCdXNBY3RpdmF0aW9uLCAxKTsKKyAgaWYgKGFjdGl2YXRpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGFjdGl2YXRpb24tPnJlZmNvdW50ID0gMTsKKyAgYWN0aXZhdGlvbi0+Y29udGV4dCA9IGNvbnRleHQ7CisgIGFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyA9IDA7CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9yZWxvYWQgKGFjdGl2YXRpb24sIGFkZHJlc3MsIGRpcmVjdG9yaWVzLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgIC8qIEluaXRpYWxpemUgdGhpcyBoYXNoIHRhYmxlIG9uY2UsIHdlIGRvbid0IHdhbnQgdG8gbG9zZSBwZW5kaW5nCisgICAqIGFjdGl2YXRpb25zIG9uIHJlbG9hZC4gKi8KKyAgYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYpOworCisgIGlmIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlKTsKKworICBpZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghcG9wdWxhdGVfZW52aXJvbm1lbnQgKGFjdGl2YXRpb24pKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dXJuIGFjdGl2YXRpb247CisKKyBmYWlsZWQ6CisgIGJ1c19hY3RpdmF0aW9uX3VucmVmIChhY3RpdmF0aW9uKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0J1c0FjdGl2YXRpb24gKgorYnVzX2FjdGl2YXRpb25fcmVmIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGFjdGl2YXRpb24tPnJlZmNvdW50ID4gMCk7CisKKyAgYWN0aXZhdGlvbi0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gYWN0aXZhdGlvbjsKK30KKwordm9pZAorYnVzX2FjdGl2YXRpb25fdW5yZWYgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKTsKKworICBhY3RpdmF0aW9uLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChhY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApCisgICAgcmV0dXJuOworCisgIGRidXNfZnJlZSAoYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MpOworICBpZiAoYWN0aXZhdGlvbi0+ZW50cmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgaWYgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyk7CisgIGlmIChhY3RpdmF0aW9uLT5kaXJlY3RvcmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcyk7CisgIGlmIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCk7CisKKyAgZGJ1c19mcmVlIChhY3RpdmF0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfYnVzX2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnR5cGU7CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TVEFSVEVSX0FERFJFU1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHR5cGUgPSBidXNfY29udGV4dF9nZXRfdHlwZSAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmICh0eXBlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1RBUlRFUl9CVVNfVFlQRSIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChzdHJjbXAgKHR5cGUsICJzZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wICh0eXBlLCAic3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TWVNURU1fQlVTX0FERFJFU1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqaGFzaF9lbnRyeTsKK30gUmVzdG9yZVBlbmRpbmdEYXRhOworCitzdGF0aWMgdm9pZAorcmVzdG9yZV9wZW5kaW5nICh2b2lkICpkYXRhKQoreworICBSZXN0b3JlUGVuZGluZ0RhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoZC0+cGVuZGluZ19hY3RpdmF0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlc3RvcmluZyBwZW5kaW5nIGFjdGl2YXRpb24gZm9yIHNlcnZpY2UgJXMsIGhhcyB0aW1lb3V0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXRfYWRkZWQpOworCisgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aGFzaF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+cGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUsIGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgZC0+aGFzaF9lbnRyeSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3Jlc3RvcmVfcGVuZGluZ19kYXRhICh2b2lkICpkYXRhKQoreworICBSZXN0b3JlUGVuZGluZ0RhdGEgKmQgPSBkYXRhOworCisgIGlmIChkLT5oYXNoX2VudHJ5KQorICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5oYXNoX2VudHJ5KTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3Jlc3RvcmVfcGVuZGluZ190b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbikKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkOworCisgIGQgPSBkYnVzX25ldyAoUmVzdG9yZVBlbmRpbmdEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC0+cGVuZGluZ19hY3RpdmF0aW9uID0gcGVuZGluZ19hY3RpdmF0aW9uOworICBkLT5oYXNoX2VudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoZC0+cGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zKTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3JlZiAoZC0+cGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBpZiAoZC0+aGFzaF9lbnRyeSA9PSBOVUxMIHx8CisgICAgICAhYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIHJlc3RvcmVfcGVuZGluZywgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3Jlc3RvcmVfcGVuZGluZ19kYXRhKSkKKyAgICB7CisgICAgICBmcmVlX3Jlc3RvcmVfcGVuZGluZ19kYXRhIChkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlNhdmVkIHBlbmRpbmcgYWN0aXZhdGlvbiB0byBiZSByZXN0b3JlZCBpZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHNcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkIChCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb247CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTGlzdCAqbGluazsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBDaGVjayBpZiBpdCdzIGEgcGVuZGluZyBhY3RpdmF0aW9uICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgc2VydmljZV9uYW1lKTsKKworICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJTdWNjZXNzZnVsbHkgYWN0aXZhdGVkIHNlcnZpY2UgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworCisgICAgICAvKiBlbnRyeS0+Y29ubmVjdGlvbiBpcyBOVUxMIGZvciBhY3RpdmF0aW5nIHN5c3RlbWQgKi8KKyAgICAgIGlmIChlbnRyeS0+Y29ubmVjdGlvbiAmJiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZW50cnktPmNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgLyogT25seSBzZW5kIGFjdGl2YXRpb24gcmVwbGllcyB0byByZWd1bGFyIGFjdGl2YXRpb24gcmVxdWVzdHMuICovCisgICAgICAgICAgaWYgKCFlbnRyeS0+YXV0b19hY3RpdmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICAgICAgICAgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1M7CisKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGVudHJ5LT5jb25uZWN0aW9uLCBtZXNzYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRpb25fbWVzc2FnZXMgKEJ1c0FjdGl2YXRpb24gICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb247CisgIERCdXNMaXN0ICpsaW5rOworCisgIC8qIENoZWNrIGlmIGl0J3MgYSBwZW5kaW5nIGFjdGl2YXRpb24gKi8KKyAgcGVuZGluZ19hY3RpdmF0aW9uID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19zZXJ2aWNlX2dldF9uYW1lIChzZXJ2aWNlKSk7CisKKyAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgaWYgKGVudHJ5LT5hdXRvX2FjdGl2YXRpb24gJiYgKGVudHJ5LT5jb25uZWN0aW9uID09IE5VTEwgfHwgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGVudHJ5LT5jb25uZWN0aW9uKSkpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudDsKKyAgICAgICAgICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworCisgICAgICAgICAgLyogUmVzdW1lIGRpc3BhdGNoaW5nIHdoZXJlIHdlIGxlZnQgb2ZmIGluIGJ1c19kaXNwYXRjaCgpICovCisgICAgICAgICAgaWYgKCFidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlLCAmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBJZiBwZXJtaXNzaW9uIGlzIGRlbmllZCwgd2UganVzdCB3YW50IHRvIHJldHVybiB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICogdG8gdGhlIG9yaWdpbmFsIG1ldGhvZCBpbnZva2VyOyBpbiBwYXJ0aWN1bGFyLCB3ZSBkb24ndAorICAgICAgICAgICAgICAgKiB3YW50IHRvIG1ha2UgdGhlIFJlcXVlc3ROYW1lIGNhbGwgZmFpbCB3aXRoIHRoYXQgZXJyb3IKKyAgICAgICAgICAgICAgICogKHNlZSBmZC5vICM3ODk3OSwgQ1ZFLTIwMTQtMzQ3NykuICovCisgICAgICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLCBlbnRyeS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLCBlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9zZW5kX29vbV9lcnJvciAoZW50cnktPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgaWYgKCFhZGRfcmVzdG9yZV9wZW5kaW5nX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgcGVuZGluZ19hY3RpdmF0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGQgbm90IGFkZCBjYW5jZWwgaG9vayB0byB0cmFuc2FjdGlvbiB0byByZXZlcnQgcmVtb3ZpbmcgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgYnVzX3NlcnZpY2VfZ2V0X25hbWUgKHNlcnZpY2UpKTsKKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRklYTUUgQHRvZG8gdGhlIGVycm9yIG1lc3NhZ2VzIGhlcmUgd291bGQgaWRlYWxseSBiZSBwcmVhbGxvY2F0ZWQKKyAqIHNvIHdlIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHNlbmQgdGhlbS4KKyAqIFVzaW5nIHRoZSB1c3VhbCB0YWN0aWMsIHByZWFsbG9jIGFuIE9PTSBtZXNzYWdlLCB0aGVuCisgKiBpZiB3ZSBjYW4ndCBhbGxvYyB0aGUgcmVhbCBlcnJvciBzZW5kIHRoZSBPT00gZXJyb3IgaW5zdGVhZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAgICAgICpob3cpCit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisKKyAgYWN0aXZhdGlvbiA9IHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbjsKKworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgaWYgKGVudHJ5LT5jb25uZWN0aW9uICYmIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIGlmICh0cmFuc2FjdGlvbikKKyAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGcmVlIHRoZSBwZW5kaW5nIGFjdGl2YXRpb24gYW5kIHNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byBhbGwgdGhlCisgKiBjb25uZWN0aW9ucyB0aGF0IHdlcmUgd2FpdGluZyBmb3IgaXQuCisgKi8KK3N0YXRpYyB2b2lkCitwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkIChCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICAgICAgKmhvdykKK3sKKyAgLyogRklYTUUgdXNlIHByZWFsbG9jYXRlZCBPT00gbWVzc2FnZXMgaW5zdGVhZCBvZiBidXNfd2FpdF9mb3JfbWVtb3J5KCkgKi8KKyAgd2hpbGUgKCF0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKHBlbmRpbmdfYWN0aXZhdGlvbiwgaG93KSkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgLyogRGVzdHJveSB0aGlzIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7Cit9CisKKy8qKgorICogRGVwZW5kaW5nIG9uIHRoZSBleGl0IGNvZGUgb2YgdGhlIGhlbHBlciwgc2V0IHRoZSBlcnJvciBhY2NvcmRpbmdseQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvciAoaW50ICAgICAgICBleGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBzd2l0Y2ggKGV4aXRfY29kZSkKKyAgICB7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NPTkZJR19JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NPTkZJR19JTlZBTElELAorCQkgICAgICAiSW52YWxpZCBjb25maWd1cmF0aW9uIChtaXNzaW5nIG9yIGVtcHR5IDx1c2VyPj8pIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoZXIgY291bGQgbm90IHJ1biAob3V0IG9mIG1lbW9yeSkiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0dXAgZW52aXJvbm1lbnQgY29ycmVjdGx5Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTkFNRV9JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgaXMgbm90IHZhbGlkIG9yIG1pc3NpbmciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVJWSUNFX05PVF9GT1VORDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgbm90IGZvdW5kIGluIHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yeSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHBlcm1pc3Npb24gb2YgdGhlIHNldHVpZCBoZWxwZXIgaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZpY2UgZmlsZSBpcyBpbmNvcnJlY3Qgb3IgZG9lcyBub3QgaGF2ZSBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0VYRUNfRkFJTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbGF1bmNoIGRhZW1vbiwgZmlsZSBub3QgZm91bmQgb3IgcGVybWlzc2lvbnMgaW52YWxpZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUzoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnRzIHRvIGNvbW1hbmQgbGluZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVELAorICAgICAgICAgICAgICAgICAgICAgICJMYXVuY2hlZCBjaGlsZCB3YXMgc2lnbmFsZWQsIGl0IHByb2JhYmx5IGNyYXNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9HRU5FUklDX0ZBSUxVUkU6CisgICAgZGVmYXVsdDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgIkxhdW5jaCBoZWxwZXIgZXhpdGVkIHdpdGggdW5rbm93biByZXR1cm4gY29kZSAlaSIsIGV4aXRfY29kZSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwZW5kaW5nX2FjdGl2YXRpb25fZmluaXNoZWRfY2IgKERCdXNCYWJ5c2l0dGVyICpiYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisgIGRidXNfYm9vbF90IHVzZXNfc2VydmljZWhlbHBlcjsKKworICBfZGJ1c19hc3NlcnQgKGJhYnlzaXR0ZXIgPT0gcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKTsKKyAgX2RidXNfYmFieXNpdHRlcl9yZWYgKGJhYnlzaXR0ZXIpOworCisgIC8qIFRoZXJlIGFyZSB0d28gbWFqb3IgY2FzZXMgaGVyZTsgYXJlIHdlIHRoZSBzeXN0ZW0gYnVzIG9yIHRoZSBzZXNzaW9uPyAgSGVyZSB0aGlzCisgICAqIGlzIGRpc3Rpbmd1aXNoZWQgYnkgd2hldGhlciBvciBub3Qgd2UgdXNlIGEgc2V0dWlkIGhlbHBlciBsYXVuY2hlci4gIFdpdGggdGhlIGxhdW5jaCBoZWxwZXIsCisgICAqIHNvbWUgcHJvY2VzcyBleGl0IGNvZGVzIGFyZSBtZWFuaW5nZnVsLCBwcm9jZXNzZWQgYnkgaGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvci4KKyAgICoKKyAgICogSW4gYm90aCBjYXNlcyB0aG91Z2gsIGp1c3QgaWdub3JlIHdoZW4gYSBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDA7IGl0J3MgcG9zc2libGUgZm9yCisgICAqIGEgcHJvZ3JhbSB0byAobWlzZ3VpZGVkbHkpICJkYWVtb25pemUiLCBhbmQgdGhhdCBhcHBlYXJzIHRvIHVzIGFzIGFuIGV4aXQuICBUaGlzIGNsb3NlcyBhIHJhY2UKKyAgICogY29uZGl0aW9uIGJldHdlZW4gdGhpcyBjb2RlIGFuZCB0aGUgY2hpbGQgcHJvY2VzcyBjbGFpbWluZyB0aGUgYnVzIG5hbWUuCisgICAqLworICB1c2VzX3NlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSAhPSBOVUxMOworCisgIC8qIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggdGhlIGNoZWNrIGluIGRidXMtc3Bhd24gbm93ICovCisgIGlmIChfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKGJhYnlzaXR0ZXIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgZGJ1c19ib29sX3QgYWN0aXZhdGlvbl9mYWlsZWQ7CisgICAgICBpbnQgZXhpdF9jb2RlID0gMDsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChiYWJ5c2l0dGVyLCAmZXJyb3IpOworCisgICAgICAvKiBFeHBsaWNpdGx5IGNoZWNrIGZvciBTUEFXTl9DSElMRF9FWElURUQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYW4KKyAgICAgICAqIGV4ZWMgZXJyb3IgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKQorICAgICAgICAgICYmIF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChiYWJ5c2l0dGVyLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgeworICAgICAgICAgIGFjdGl2YXRpb25fZmFpbGVkID0gZXhpdF9jb2RlICE9IDA7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoJmVycm9yKTsKKworICAgICAgICAgIGlmIChhY3RpdmF0aW9uX2ZhaWxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHVzZXNfc2VydmljZWhlbHBlcikKKyAgICAgICAgICAgICAgICBoYW5kbGVfc2VydmljZWhlbHBlcl9leGl0X2Vycm9yIChleGl0X2NvZGUsICZlcnJvcik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChiYWJ5c2l0dGVyLCAmZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhY3RpdmF0aW9uX2ZhaWxlZCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgaWYgKGFjdGl2YXRpb25fZmFpbGVkKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRlZCBzZXJ2aWNlICclcycgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgLyogRGVzdHJveSBhbGwgcGVuZGluZyBhY3RpdmF0aW9ucyB3aXRoIHRoZSBzYW1lIGV4ZWMgKi8KKyAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcik7CisgICAgICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAgICAgICAgIGlmIChwICE9IHBlbmRpbmdfYWN0aXZhdGlvbiAmJiBwLT5leGVjICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAocC0+ZXhlYywgcGVuZGluZ19hY3RpdmF0aW9uLT5leGVjKSA9PSAwKQorICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKHAsICZlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBEZXN0cm95cyB0aGUgcGVuZGluZyBhY3RpdmF0aW9uICovCisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZCAocGVuZGluZ19hY3RpdmF0aW9uLCAmZXJyb3IpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKGJhYnlzaXR0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoCisgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwZW5kaW5nX2FjdGl2YXRpb25fdGltZWRfb3V0ICh2b2lkICpkYXRhKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uID0gZGF0YTsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIC8qIEtpbGwgdGhlIHNwYXduZWQgcHJvY2Vzcywgc2luY2UgaXQgc3Vja3MKKyAgICogKG5vdCBzdXJlIHRoaXMgaXMgd2hhdCB3ZSB3YW50IHRvIGRvLCBidXQKKyAgICogbWF5IGFzIHdlbGwgdHJ5IGl0IGZvciBub3cpCisgICAqLworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgJmVycm9yLCBEQlVTX0VSUk9SX1RJTUVEX09VVCwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFjdGl2YXRlIHNlcnZpY2UgJyVzJzogdGltZWQgb3V0IiwKKyAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7CisKKyAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZCAocGVuZGluZ19hY3RpdmF0aW9uLCAmZXJyb3IpOworCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NhbmNlbF9wZW5kaW5nICh2b2lkICpkYXRhKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiQ2FuY2VsaW5nIHBlbmRpbmcgYWN0aXZhdGlvbiBvZiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpOworCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpOworCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcGVuZGluZ19jYW5jZWxfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2FuY2VsX3BlbmRpbmdfdG9fdHJhbnNhY3Rpb24gKEJ1c1RyYW5zYWN0aW9uICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbikKK3sKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwgY2FuY2VsX3BlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGVuZGluZ19jYW5jZWxfZGF0YSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fcmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTYXZlZCBwZW5kaW5nIGFjdGl2YXRpb24gdG8gYmUgY2FuY2VsZWQgaWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit1cGRhdGVfc2VydmljZV9jYWNoZSAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgICAgICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpcjsKKworICAgICAgc19kaXIgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgICAgICBpZiAoIXVwZGF0ZV9kaXJlY3RvcnkgKGFjdGl2YXRpb24sIHNfZGlyLCAmdG1wX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgQnVzQWN0aXZhdGlvbkVudHJ5ICoKK2FjdGl2YXRpb25fZmluZF9lbnRyeSAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKworICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgc2VydmljZV9uYW1lKTsKKyAgaWYgKCFlbnRyeSkKKyAgICB7CisgICAgICBpZiAoIXVwZGF0ZV9zZXJ2aWNlX2NhY2hlIChhY3RpdmF0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEJ1c0FjdGl2YXRpb25FbnRyeSAqdXBkYXRlZF9lbnRyeTsKKworICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2ZpbGUgKGFjdGl2YXRpb24sIGVudHJ5LCAmdXBkYXRlZF9lbnRyeSwgZXJyb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgZW50cnkgPSB1cGRhdGVkX2VudHJ5OworICAgIH0KKworICBpZiAoIWVudHJ5KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TRVJWSUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBuYW1lICVzIHdhcyBub3QgcHJvdmlkZWQgYnkgYW55IC5zZXJ2aWNlIGZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGNoYXIgKioKK2J1c19hY3RpdmF0aW9uX2dldF9lbnZpcm9ubWVudCAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbikKK3sKKyAgY2hhciAqKmVudmlyb25tZW50OworICBpbnQgaSwgbGVuZ3RoOworICBEQnVzU3RyaW5nIGVudHJ5OworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICBsZW5ndGggPSBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGFjdGl2YXRpb24tPmVudmlyb25tZW50KTsKKworICBlbnZpcm9ubWVudCA9IGRidXNfbmV3MCAoY2hhciAqLCBsZW5ndGggKyAxKTsKKworICBpZiAoZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpID0gMDsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGFjdGl2YXRpb24tPmVudmlyb25tZW50LCAmaXRlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudHJ5KSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqa2V5LCAqdmFsdWU7CisKKyAgICAgIGtleSA9IChjb25zdCBjaGFyICopIF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgdmFsdWUgPSAoY29uc3QgY2hhciAqKSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZlbnRyeSwgIiVzPSVzIiwga2V5LCB2YWx1ZSkpCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmZW50cnksIGVudmlyb25tZW50ICsgaSkpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudHJ5KTsKKworICBpZiAoaSAhPSBsZW5ndGgpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgZW52aXJvbm1lbnQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gZW52aXJvbm1lbnQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAgICAgICAgKmhhc2hfa2V5OworICBjaGFyICAgICAgICAqaGFzaF92YWx1ZTsKKyAgZGJ1c19ib29sX3QgIHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgaGFzaF9rZXkgPSBOVUxMOworICBoYXNoX3ZhbHVlID0gTlVMTDsKKyAgaGFzaF9rZXkgPSBfZGJ1c19zdHJkdXAgKGtleSk7CisKKyAgaWYgKGhhc2hfa2V5ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaGFzaF92YWx1ZSA9IF9kYnVzX3N0cmR1cCAodmFsdWUpOworCisgIGlmIChoYXNoX3ZhbHVlID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9rZXksIGhhc2hfdmFsdWUpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CitvdXQ6CisgIGlmIChyZXR2YWwgPT0gRkFMU0UpCisgICAgeworICAgICAgZGJ1c19mcmVlIChoYXNoX2tleSk7CisgICAgICBkYnVzX2ZyZWUgKGhhc2hfdmFsdWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2NoaWxkX3NldHVwICh2b2lkICp1c2VyX2RhdGEpCit7CisjaWZkZWYgREJVU19VTklYCisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24gPSB1c2VyX2RhdGE7CisgIERCdXNSTGltaXQgKmluaXRpYWxfZmRfbGltaXQ7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGluaXRpYWxfZmRfbGltaXQgPSBidXNfY29udGV4dF9nZXRfaW5pdGlhbF9mZF9saW1pdCAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisKKyAgaWYgKGluaXRpYWxfZmRfbGltaXQgIT0gTlVMTCAmJgorICAgICAgIV9kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChpbml0aWFsX2ZkX2xpbWl0LCAmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIHVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgc2VydmljZSBuYW1lIGhlcmUgKi8KKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzZXQgZmQgbGltaXQgYmVmb3JlIGFjdGl2YXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgfQorI2VuZGlmCit9CisKKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKEJ1c0FjdGl2YXRpb24gICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXV0b19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmFjdGl2YXRpb25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb247CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKnBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeTsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNTdHJpbmcgc2VydmljZV9zdHI7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKiphcmd2OworICBjaGFyICoqZW52cCA9IE5VTEw7CisgIGludCBhcmdjOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IHdhc19wZW5kaW5nX2FjdGl2YXRpb247CisgIERCdXNTdHJpbmcgY29tbWFuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoYWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zID49CisgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgKGFjdGl2YXRpb24tPmNvbnRleHQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIGFjdGl2YXRpb25zIGhhcyBiZWVuIHJlYWNoZWQsIGFjdGl2YXRpb24gb2YgJXMgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoYWN0aXZhdGlvbi0+Y29udGV4dCkgJiYKKyAgICAgIHN0cmNtcCAoc2VydmljZV9uYW1lLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIikgPT0gMCkKKyAgICB7CisgICAgICAvKiBpZiB3ZSdyZSBkb2luZyBzeXN0ZW1kIGFjdGl2YXRpb24sIHdlIGFzc3VtZSBzeXN0ZW1kIHdpbGwgY29ubmVjdAorICAgICAgICogZXZlbnR1YWxseSwgYW5kIGl0IGRvZXMgbm90IG5lZWQgYSAuc2VydmljZSBmaWxlICovCisgICAgICBlbnRyeSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZW50cnkgPSBhY3RpdmF0aW9uX2ZpbmRfZW50cnkgKGFjdGl2YXRpb24sIHNlcnZpY2VfbmFtZSwgZXJyb3IpOworICAgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBCeXBhc3MgdGhlIHJlZ2lzdHJ5IGxvb2t1cCBpZiB3ZSdyZSBhdXRvLWFjdGl2YXRpbmcsIGJ1c19kaXNwYXRjaCB3b3VsZCBub3QKKyAgICogY2FsbCB1cyBpZiB0aGUgc2VydmljZSBpcyBhbHJlYWR5IGFjdGl2ZS4KKyAgICovCisgIGlmICghYXV0b19hY3RpdmF0aW9uKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBzZXJ2aWNlIGlzIGFjdGl2ZSAqLworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0ciwgc2VydmljZV9uYW1lKTsKKyAgICAgIGlmIChidXNfcmVnaXN0cnlfbG9va3VwIChidXNfY29udGV4dF9nZXRfcmVnaXN0cnkgKGFjdGl2YXRpb24tPmNvbnRleHQpLCAmc2VydmljZV9zdHIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGFjdGl2ZVxuIiwgc2VydmljZV9uYW1lKTsKKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKGFjdGl2YXRpb25fbWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIHJlcGx5IHRvIGFjdGl2YXRlIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORzsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0IGFyZ3Mgb2YgcmVwbHkgdG8gYWN0aXZhdGUgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHZhbCA9IGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBzZW5kIHJlcGx5XG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5ID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5LCAxKTsKKyAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb25fZW50cnkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgcGVuZGluZyBhY3RpdmF0aW9uIGVudHJ5XG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeS0+YXV0b19hY3RpdmF0aW9uID0gYXV0b19hY3RpdmF0aW9uOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlID0gYWN0aXZhdGlvbl9tZXNzYWdlOworICBkYnVzX21lc3NhZ2VfcmVmIChhY3RpdmF0aW9uX21lc3NhZ2UpOworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICBpZiAoY29ubmVjdGlvbikKKyAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKworICAvKiBDaGVjayBpZiB0aGUgc2VydmljZSBpcyBiZWluZyBhY3RpdmF0ZWQgKi8KKyAgcGVuZGluZ19hY3RpdmF0aW9uID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLCBzZXJ2aWNlX25hbWUpOworICB3YXNfcGVuZGluZ19hY3RpdmF0aW9uID0gKHBlbmRpbmdfYWN0aXZhdGlvbiAhPSBOVUxMKTsKKyAgaWYgKHdhc19wZW5kaW5nX2FjdGl2YXRpb24pCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcywgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYXBwZW5kIGEgbmV3IGVudHJ5IHRvIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5uX2VudHJpZXMgKz0gMTsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zICs9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nQWN0aXZhdGlvbiwgMSk7CisgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uID0gYWN0aXZhdGlvbjsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPSAxOworCisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZV9uYW1lKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNvcHkgc2VydmljZSBuYW1lIGZvciBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5leGVjKTsKKyAgICAgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjb3B5IHNlcnZpY2UgZXhlYyBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlIChwZW5kaW5nX2FjdGl2YXRpb25fZW50cnkpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPnN5c3RlbWRfc2VydmljZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICAgICAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBzeXN0ZW1kIHNlcnZpY2UgZm9yIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCA9CisgICAgICAgIF9kYnVzX3RpbWVvdXRfbmV3IChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0IChhY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl90aW1lZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IFRSVUU7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkZCBlbnRyeSB0byBqdXN0LWNyZWF0ZWQgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBwdXQgcGVuZGluZyBhY3RpdmF0aW9uIGluIGhhc2ggdGFibGVcbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9jYW5jZWxfcGVuZGluZ190b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHBlbmRpbmdfYWN0aXZhdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgcGVuZGluZyBhY3RpdmF0aW9uIGNhbmNlbCBob29rIHRvIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIGlmICh3YXNfcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChhY3RpdmF0aW9uLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKSA9PSAwKQorICAgICAgICAgIC8qIHN5c3RlbWQgaXRzZWxmIGlzIG1pc3NpbmcgYXBwYXJlbnRseS4gVGhhdCBjYW4gaGFwcGVuCisgICAgICAgICAgICAgb25seSBkdXJpbmcgZWFybHkgc3RhcnR1cC4gTGV0J3MganVzdCB3YWl0IHVudGlsIHN5c3RlbWQKKyAgICAgICAgICAgICBjb25uZWN0cyB0byB1cyBhbmQgZG8gbm90aGluZy4gKi8KKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgIGlmIChlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKQorICAgICAgICB7CisgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKmFjdGl2YXRpb25fdHJhbnNhY3Rpb247CisgICAgICAgICAgREJ1c1N0cmluZyBzZXJ2aWNlX3N0cmluZzsKKyAgICAgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICAgICAgICAgIC8qIE9LLCB3ZSBoYXZlIGEgc3lzdGVtZCBzZXJ2aWNlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgZW50cnksCisgICAgICAgICAgICAgaGVuY2UgbGV0J3MgZW5xdWV1ZSBhbiBhY3RpdmF0aW9uIHJlcXVlc3QgbWVzc2FnZS4gVGhpcworICAgICAgICAgICAgIGlzIGltcGxlbWVudGVkIGFzIGEgZGlyZWN0ZWQgc2lnbmFsLCBub3QgYSBtZXRob2QgY2FsbCwKKyAgICAgICAgICAgICBmb3IgdGhyZWUgcmVhc29uczogMSkgd2UgZG9uJ3QgZXhwZWN0IGEgcmVzcG9uc2Ugb24KKyAgICAgICAgICAgICBzdWNjZXNzLCB3aGVyZSB3ZSBqdXN0IGV4cGVjdCBhIG5hbWUgYXBwZWFyaW5nIG9uIHRoZQorICAgICAgICAgICAgIGJ1czsgMikgYXQgdGhpcyB0aW1lIHRoZSBzeXN0ZW1kIHNlcnZpY2UgbWlnaHQgbm90IHlldAorICAgICAgICAgICAgIGhhdmUgY29ubmVjdGVkLCBzbyB3ZSB3b3VsZG4ndCBrbm93IHRoZSBtZXNzYWdlIHNlcmlhbCBhdAorICAgICAgICAgICAgIHRoaXMgcG9pbnQgdG8gc2V0IHVwIGEgcGVuZGluZyBjYWxsOyAzKSBpdCBpcyB1Z2x5IGlmIHRoZQorICAgICAgICAgICAgIGJ1cyBzdWRkZW5seSBiZWNvbWVzIHRoZSBjYWxsZXIgb2YgYSByZW1vdGUgbWV0aG9kLiAqLworCisgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmF0aW9uUmVxdWVzdCIpOworICAgICAgICAgIGlmICghbWVzc2FnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBjcmVhdGUgYWN0aXZhdGlvbiBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpIHx8CisgICAgICAgICAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIikgfHwKKyAgICAgICAgICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBzZXQgYXJncyBvZiBhY3RpdmF0aW9uIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBDcmVhdGUgb3VyIHRyYW5zYWN0aW9uICovCisgICAgICAgICAgYWN0aXZhdGlvbl90cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICAgICAgICAgIGlmIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIGFjdGl2YXRpb24gdHJhbnNhY3Rpb25cbiIpOworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHN5c3RlbWQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKyAgICAgICAgICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0cmluZywgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnNlcnZpY2Vfc3RyaW5nKTsKKworICAgICAgICAgIC8qIEZvbGxvd2luZyB0aGUgZ2VuZXJhbCBwcmluY2lwbGUgb2YgImxvZyBlYXJseSBhbmQgb2Z0ZW4iLAorICAgICAgICAgICAqIHdlIGNhcHR1cmUgdGhhdCB3ZSAqd2FudCogdG8gc2VuZCB0aGUgYWN0aXZhdGlvbiBtZXNzYWdlLCBldmVuIGlmCisgICAgICAgICAgICogc3lzdGVtZCBpcyBub3QgYWN0dWFsbHkgdGhlcmUgdG8gcmVjZWl2ZSBpdCB5ZXQgKi8KKyAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgIE5VTEwsIG1lc3NhZ2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VydmljZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW5nIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgLyogV29uZGVyZnVsLCBzeXN0ZW1kIGlzIGNvbm5lY3RlZCwgbGV0J3MganVzdCBzZW5kIHRoZSBtc2cgKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2Rpc3BhdGNoX21hdGNoZXMgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24sIE5VTEwsIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc3lzdGVtZCB0byBoYW5kLW9mZjogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICAgICAgICAgIC8qIHN5c3RlbWQgaXMgbm90IGFyb3VuZCwgbGV0J3MgImFjdGl2YXRlIiBpdC4gKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgTlVMTCwgYWN0aXZhdGlvbl90cmFuc2FjdGlvbiwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiRmFpbGVkIHRvIGFjdGl2YXRlIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIHNlbmQgYWN0aXZhdGlvbiBtZXNzYWdlOiAlc1xuIiwgZXJyb3ItPm5hbWUpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24pOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgIC8qIE9LLCB3ZSBoYXZlIG5vIGNvbmZpZ3VyZWQgc3lzdGVtZCBzZXJ2aWNlLCBoZW5jZSBsZXQncworICAgICAgICAgcHJvY2VlZCB3aXRoIHRyYWRpdGlvbmFsIGFjdGl2YXRpb24uICovCisgICAgfQorCisgIC8qIElmIGVudHJ5IHdhcyBOVUxMLCBpdCB3b3VsZCBiZSBiZWNhdXNlIHdlIHdlcmUgZG9pbmcgc3lzdGVtZCBhY3RpdmF0aW9uCisgICAqIGFuZCBhY3RpdmF0aW5nIHN5c3RlbWQgaXRzZWxmOyBidXQgd2UgYWxyZWFkeSBoYW5kbGVkIHRoYXQgY2FzZSB3aXRoCisgICAqIGFuIGVhcmx5LXJldHVybiAqLworICBfZGJ1c19hc3NlcnQgKGVudHJ5ICE9IE5VTEwpOworCisgIC8qIHVzZSBjb21tYW5kIGFzIHN5c3RlbSBhbmQgc2Vzc2lvbiBkaWZmZXJlbnQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbW1hbmQpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIC8qIGRvZXMgdGhlIGJ1cyB1c2UgYSBoZWxwZXI/ICovCisgIHNlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmIChzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVudHJ5LT51c2VyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9GSUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG8gc3lzdGVtLWJ1cyBhY3RpdmF0aW9uIHdpdGggbm8gdXNlclxuIik7CisgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICB9CisKKyAgICAgIC8qIGpvaW4gdGhlIGhlbHBlciBwYXRoIGFuZCB0aGUgc2VydmljZSBuYW1lICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlaGVscGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsICIgIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHRoZSBidXMgZG9lcyBub3QgdXNlIGEgaGVscGVyLCBzbyB3ZSBjYW4gYXBwZW5kIGFyZ3VtZW50cyB3aXRoIHRoZSBleGVjIGxpbmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsIGVudHJ5LT5leGVjKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogY29udmVydCBjb21tYW5kIGludG8gYXJndW1lbnRzICovCisgIGlmICghX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29tbWFuZCksICZhcmdjLCAmYXJndiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcGFyc2UgY29tbWFuZCBsaW5lOiAlc1xuIiwgZW50cnktPmV4ZWMpOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisKKyAgaWYgKCFhZGRfYnVzX2Vudmlyb25tZW50IChhY3RpdmF0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIGVudnAgPSBidXNfYWN0aXZhdGlvbl9nZXRfZW52aXJvbm1lbnQgKGFjdGl2YXRpb24pOworCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3Bhd25pbmcgJXMgLi4uXG4iLCBhcmd2WzBdKTsKKyAgaWYgKHNlcnZpY2VoZWxwZXIgIT0gTlVMTCkKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcycgKHVzaW5nIHNlcnZpY2VoZWxwZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgIGVsc2UKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcyciLAorICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHNwYXduIGNoaWxkXG4iKTsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJGYWlsZWQgdG8gYWN0aXZhdGUgc2VydmljZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudnApOworICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKyAgZW52cCA9IE5VTEw7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIgIT0gTlVMTCk7CisKKyAgX2RidXNfYmFieXNpdHRlcl9zZXRfcmVzdWx0X2Z1bmN0aW9uIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZpbmlzaGVkX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9iYWJ5c2l0dGVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2JhYnlzaXR0ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVfYmFieXNpdHRlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHNldCBiYWJ5c2l0dGVyIHdhdGNoIGZ1bmN0aW9uc1xuIik7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIHJldHVybiBUUlVFOworCitjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX2xpc3Rfc2VydmljZXMgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sCisJCQkgICAgICBjaGFyICAgICAgICAqKipsaXN0cCwKKwkJCSAgICAgIGludCAgICAgICAgICAgKmFycmF5X2xlbikKK3sKKyAgaW50IGksIGosIGxlbjsKKyAgY2hhciAqKnJldHZhbDsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgbGVuID0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChhY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgcmV0dmFsID0gZGJ1c19uZXcgKGNoYXIgKiwgbGVuICsgMSk7CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+ZW50cmllcywgJml0ZXIpOworICBpID0gMDsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgcmV0dmFsW2ldID0gX2RidXNfc3RyZHVwIChlbnRyeS0+bmFtZSk7CisgICAgICBpZiAocmV0dmFsW2ldID09IE5VTEwpCisJZ290byBlcnJvcjsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR2YWxbaV0gPSBOVUxMOworCisgIGlmIChhcnJheV9sZW4pCisgICAgKmFycmF5X2xlbiA9IGxlbjsKKworICAqbGlzdHAgPSByZXR2YWw7CisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgZGJ1c19mcmVlIChyZXR2YWxbal0pOworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorZGJ1c19hY3RpdmF0aW9uX3N5c3RlbWRfZmFpbHVyZSAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqY29kZSwgKnN0ciwgKnVuaXQgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCgmZXJyb3IpOworCisgIC8qIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzeXN0ZW1kIGFjdGl2YXRvciBzZW50IHVzIGEKKyAgICAgcmVzcG9uc2UuIFdlJ2xsIGludmFsaWRhdGUgYWxsIHBlbmRpbmcgYWN0aXZhdGlvbnMgdGhhdCBtYXRjaCB0aGUKKyAgICAgdW5pdCBuYW1lLiAqLworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGJ1c19zZXRfZXJyb3IgKCZlcnJvciwgY29kZSwgIiVzIiwgc3RyKTsKKworCisgIGlmICh1bml0KQorICAgIHsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworCisgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiQWN0aXZhdGlvbiB2aWEgc3lzdGVtZCBmYWlsZWQgZm9yIHVuaXQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcik7CisKKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnAgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgICAgICBpZiAocC0+c3lzdGVtZF9zZXJ2aWNlICYmIHN0cmNtcCAocC0+c3lzdGVtZF9zZXJ2aWNlLCB1bml0KSA9PSAwKQorICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZChwLCAmZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgU0VSVklDRV9OQU1FXzEgIk15U2VydmljZTEiCisjZGVmaW5lIFNFUlZJQ0VfTkFNRV8yICJNeVNlcnZpY2UyIgorI2RlZmluZSBTRVJWSUNFX05BTUVfMyAiTXlTZXJ2aWNlMyIKKworI2RlZmluZSBTRVJWSUNFX0ZJTEVfMSAic2VydmljZS0xLnNlcnZpY2UiCisjZGVmaW5lIFNFUlZJQ0VfRklMRV8yICJzZXJ2aWNlLTIuc2VydmljZSIKKyNkZWZpbmUgU0VSVklDRV9GSUxFXzMgInNlcnZpY2UtMy5zZXJ2aWNlIgorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfY3JlYXRlX3NlcnZpY2VfZmlsZSAoREJ1c1N0cmluZyAqZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXhlYykKK3sKKyAgREJ1c1N0cmluZyAgZmlsZV9uYW1lLCBmdWxsX3BhdGg7CisgIEZJTEUgICAgICAgICpmaWxlOworICBkYnVzX2Jvb2xfdCAgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlX25hbWUsIGZpbGVuYW1lKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRpcikpIHx8CisgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVfbmFtZSkpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGZpbGUgPSBmb3BlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwgInciKTsKKyAgaWYgKCFmaWxlKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBmcHJpbnRmIChmaWxlLCAiW0QtQlVTIFNlcnZpY2VdXG5OYW1lPSVzXG5FeGVjPSVzXG4iLCBuYW1lLCBleGVjKTsKKyAgZmNsb3NlIChmaWxlKTsKKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgIHJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfcmVtb3ZlX3NlcnZpY2VfZmlsZSAoREJ1c1N0cmluZyAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgREJ1c1N0cmluZyAgZmlsZV9uYW1lLCBmdWxsX3BhdGg7CisgIGRidXNfYm9vbF90IHJldF92YWw7CisKKyAgcmV0X3ZhbCA9IFRSVUU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlX25hbWUsIGZpbGVuYW1lKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRpcikpIHx8CisgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVfbmFtZSkpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfZGVsZXRlX2ZpbGUgKCZmdWxsX3BhdGgsIE5VTEwpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgIHJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfcmVtb3ZlX2RpcmVjdG9yeSAoREJ1c1N0cmluZyAqZGlyKQoreworICBEQnVzRGlySXRlciAqaXRlcjsKKyAgREJ1c1N0cmluZyAgIGZpbGVuYW1lLCBmdWxsX3BhdGg7CisgIGRidXNfYm9vbF90ICByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpdGVyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKGRpciwgTlVMTCk7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoaXRlciwgJmZpbGVuYW1lLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoIXRlc3RfcmVtb3ZlX3NlcnZpY2VfZmlsZSAoZGlyLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoaXRlcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoaXRlcik7CisKKyAgaWYgKCFfZGJ1c19kZWxldGVfZGlyZWN0b3J5IChkaXIsIE5VTEwpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgIHJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc2VydmljZV9yZWxvYWRfdGVzdCAoREJ1c1N0cmluZyAqZGlyKQoreworICBEQnVzU3RhdCBzdGF0X2J1ZjsKKworICBpZiAoIV9kYnVzX3N0YXQgKGRpciwgJnN0YXRfYnVmLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGRpciwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIXRlc3RfcmVtb3ZlX2RpcmVjdG9yeSAoZGlyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGRpciwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIG9uZSBpbml0aWFsIGZpbGUgKi8KKyAgaWYgKCF0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzEsIFNFUlZJQ0VfTkFNRV8xLCAiZXhlYy0xIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NsZWFudXBfc2VydmljZV9yZWxvYWRfdGVzdCAoREJ1c1N0cmluZyAqZGlyKQoreworICBpZiAoIXRlc3RfcmVtb3ZlX2RpcmVjdG9yeSAoZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfbmFtZTsKKyAgZGJ1c19ib29sX3QgICAgZXhwZWN0aW5nX2ZpbmQ7Cit9IENoZWNrRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVja0RhdGEgICAgICAgICAgKmQ7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNFcnJvciAgICAgICAgICAgZXJyb3I7CisgIGRidXNfYm9vbF90ICAgICAgICAgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKyAgZCA9IGRhdGE7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGVudHJ5ID0gYWN0aXZhdGlvbl9maW5kX2VudHJ5IChkLT5hY3RpdmF0aW9uLCBkLT5zZXJ2aWNlX25hbWUsICZlcnJvcik7CisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIHJldF92YWwgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZC0+ZXhwZWN0aW5nX2ZpbmQpCisgICAgICAgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghZC0+ZXhwZWN0aW5nX2ZpbmQpCisgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fdGVzdCAoY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIGRidXNfYm9vbF90IG9vbV90ZXN0LCBDaGVja0RhdGEgKmRhdGEpCit7CisgIGRidXNfYm9vbF90IGVycjsKKworICBpZiAob29tX3Rlc3QpCisgICAgZXJyID0gIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfZnVuYywgZGF0YSk7CisgIGVsc2UKKyAgICBlcnIgPSAhY2hlY2tfZnVuYyAoZGF0YSk7CisKKyAgaWYgKGVycikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJUZXN0IGZhaWxlZCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKERCdXNTdHJpbmcgKmRpciwgZGJ1c19ib29sX3Qgb29tX3Rlc3QpCit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNTdHJpbmcgICAgIGFkZHJlc3M7CisgIERCdXNMaXN0ICAgICAgKmRpcmVjdG9yaWVzOworICBDaGVja0RhdGEgICAgICBkOworCisgIGRpcmVjdG9yaWVzID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZhZGRyZXNzLCAiIik7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmRpcmVjdG9yaWVzLCBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKGRpcikpKQorICAgIHJldHVybiBGQUxTRTsKKworICBhY3RpdmF0aW9uID0gYnVzX2FjdGl2YXRpb25fbmV3IChOVUxMLCAmYWRkcmVzcywgJmRpcmVjdG9yaWVzLCBOVUxMKTsKKyAgaWYgKCFhY3RpdmF0aW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmFjdGl2YXRpb24gPSBhY3RpdmF0aW9uOworCisgIC8qIENoZWNrIGZvciBleGlzdGluZyBzZXJ2aWNlIGZpbGUgKi8KKyAgZC5leHBlY3RpbmdfZmluZCA9IFRSVUU7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzE7CisKKyAgaWYgKCFkb190ZXN0ICgiRXhpc3Rpbmcgc2VydmljZSBmaWxlIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIG5vbi1leGlzdGluZyBzZXJ2aWNlIGZpbGUgKi8KKyAgZC5leHBlY3RpbmdfZmluZCA9IEZBTFNFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8zOworCisgIGlmICghZG9fdGVzdCAoIk5vbmV4aXN0aW5nIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciBhZGRlZCBzZXJ2aWNlIGZpbGUgKi8KKyAgaWYgKCF0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzIsIFNFUlZJQ0VfTkFNRV8yLCAiZXhlYy0yIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBUUlVFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8yOworCisgIGlmICghZG9fdGVzdCAoIkFkZGVkIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciByZW1vdmVkIHNlcnZpY2UgZmlsZSAqLworICBpZiAoIXRlc3RfcmVtb3ZlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBGQUxTRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX0ZJTEVfMjsKKworICBpZiAoIWRvX3Rlc3QgKCJSZW1vdmVkIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciB1cGRhdGVkIHNlcnZpY2UgZmlsZSAqLworCisgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7IC8qIFNsZWVwIGEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgbXRpbWUgaXMgdXBkYXRlZCAqLworCisgIGlmICghdGVzdF9jcmVhdGVfc2VydmljZV9maWxlIChkaXIsIFNFUlZJQ0VfRklMRV8xLCBTRVJWSUNFX05BTUVfMywgImV4ZWMtMyIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmV4cGVjdGluZ19maW5kID0gVFJVRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMzsKKworICBpZiAoIWRvX3Rlc3QgKCJVcGRhdGVkIHNlcnZpY2UgZmlsZSwgcGFydCAxIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5leHBlY3RpbmdfZmluZCA9IEZBTFNFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8xOworCisgIGlmICghZG9fdGVzdCAoIlVwZGF0ZWQgc2VydmljZSBmaWxlLCBwYXJ0IDIiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfYWN0aXZhdGlvbl91bnJlZiAoYWN0aXZhdGlvbik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZkaXJlY3Rvcmllcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIGRpcmVjdG9yeTsKKyAgY29uc3QgY2hhciAqdG1wOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlyZWN0b3J5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdG1wID0gX2RidXNfZ2V0X3RtcGRpciAoKTsKKworICBpZiAodG1wID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGlyZWN0b3J5LCB0bXApKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmRpcmVjdG9yeSwgIi9kYnVzLXJlbG9hZC10ZXN0LSIpIHx8CisgICAgICAhX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmZGlyZWN0b3J5LCA2LCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBEbyBub3JtYWwgdGVzdHMgKi8KKyAgaWYgKCFpbml0X3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0aWF0ZSBzZXJ2aWNlIHJlbG9hZCB0ZXN0Iik7CisKKyAgaWYgKCFkb19zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmZGlyZWN0b3J5LCBGQUxTRSkpCisgICAgeworICAgICAgLyogRG8gbm90aGluZz8gKi8KKyAgICB9CisKKyAgLyogRG8gT09NIHRlc3RzICovCisgIGlmICghaW5pdF9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdGlhdGUgc2VydmljZSByZWxvYWQgdGVzdCIpOworCisgIGlmICghZG9fc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSwgVFJVRSkpCisgICAgeworICAgICAgLyogRG8gbm90aGluZz8gKi8KKyAgICB9CisKKyAgLyogQ2xlYW51cCB0ZXN0IGRpcmVjdG9yeSAqLworICBpZiAoIWNsZWFudXBfc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcmVjdG9yeSk7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvYnVzL2FjdGl2YXRpb24uaCBiL2J1cy9hY3RpdmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ZDQyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9hY3RpdmF0aW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBhY3RpdmF0aW9uLmggIEFjdGl2YXRpb24gb2Ygc2VydmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0gKKyNkZWZpbmUgQlVTX0FDVElWQVRJT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlICJidXMuaCIKKworQnVzQWN0aXZhdGlvbiogYnVzX2FjdGl2YXRpb25fbmV3ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgKmNvbnRleHQsCisJCQkJCQljb25zdCBEQnVzU3RyaW5nICAqYWRkcmVzcywKKwkJCQkJCURCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfYWN0aXZhdGlvbl9yZWxvYWQgICAgICAgICAgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCWNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorCQkJCQkJREJ1c0xpc3QgICAgICAgICAqKmRpcmVjdG9yaWVzLAorCQkJCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0J1c0FjdGl2YXRpb24qIGJ1c19hY3RpdmF0aW9uX3JlZiAgICAgICAgICAgICAgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uKTsKK3ZvaWQgICAgICAgICAgIGJ1c19hY3RpdmF0aW9uX3VucmVmICAgICAgICAgICAgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uKTsKKworZGJ1c19ib29sX3QgICBidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorCQkJCQkJY29uc3QgY2hhciAgICAgICAgKmtleSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICp2YWx1ZSwKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCURCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorCQkJCQkJQnVzVHJhbnNhY3Rpb24gICAgKnRyYW5zYWN0aW9uLAorCQkJCQkJZGJ1c19ib29sX3QgICAgICAgIGF1dG9fYWN0aXZhdGlvbiwKKwkJCQkJCURCdXNNZXNzYWdlICAgICAgICphY3RpdmF0aW9uX21lc3NhZ2UsCisJCQkJCQljb25zdCBjaGFyICAgICAgICAqc2VydmljZV9uYW1lLAorCQkJCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgIGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCAgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorCQkJCQkJY29uc3QgY2hhciAgICAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCUJ1c1RyYW5zYWN0aW9uICAgICp0cmFuc2FjdGlvbiwKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzICAgIChCdXNBY3RpdmF0aW9uICAgICAqcmVnaXN0cnksCisJCQkJCQljaGFyICAgICAgICAgICAgKioqbGlzdHAsCisJCQkJCQlpbnQgICAgICAgICAgICAgICAqYXJyYXlfbGVuKTsKK2RidXNfYm9vbF90ICAgIGRidXNfYWN0aXZhdGlvbl9zeXN0ZW1kX2ZhaWx1cmUgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgKm1lc3NhZ2UpOworCitkYnVzX2Jvb2xfdCAgICBidXNfYWN0aXZhdGlvbl9zZW5kX3BlbmRpbmdfYXV0b19hY3RpdmF0aW9uX21lc3NhZ2VzIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCQkJICAgICBCdXNTZXJ2aWNlICAgICAgICAqc2VydmljZSwKKwkJCQkJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAgICAqdHJhbnNhY3Rpb24pOworCisKKyNlbmRpZiAvKiBCVVNfQUNUSVZBVElPTl9IICovCmRpZmYgLS1naXQgYS9idXMvYXBwYXJtb3IuYyBiL2J1cy9hcHBhcm1vci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTg0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYXBwYXJtb3IuYwpAQCAtMCwwICsxLDExMDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLQorICogYXBwYXJtb3IuYyAgQXBwQXJtb3Igc2VjdXJpdHkgY2hlY2tzIGZvciBELUJ1cworICoKKyAqIEJhc2VkIG9uIHNlbGludXguYworICoKKyAqIENvcHlyaWdodCDCqSAyMDE0LTIwMTUgQ2Fub25pY2FsLCBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJhcHBhcm1vci5oIgorCisjaWZkZWYgSEFWRV9BUFBBUk1PUgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvYXBwYXJtb3IuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgSEFWRV9MSUJBVURJVAorI2luY2x1ZGUgPGxpYmF1ZGl0Lmg+CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworCisjaW5jbHVkZSAiYXVkaXQuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworLyogU3RvcmUgdGhlIHZhbHVlIHRlbGxpbmcgdXMgaWYgQXBwQXJtb3IgRC1CdXMgbWVkaWF0aW9uIGlzIGVuYWJsZWQuICovCitzdGF0aWMgZGJ1c19ib29sX3QgYXBwYXJtb3JfZW5hYmxlZCA9IEZBTFNFOworCit0eXBlZGVmIGVudW0geworICBBUFBBUk1PUl9ESVNBQkxFRCwKKyAgQVBQQVJNT1JfRU5BQkxFRCwKKyAgQVBQQVJNT1JfUkVRVUlSRUQKK30gQXBwQXJtb3JDb25maWdNb2RlOworCisvKiBTdG9yZSB0aGUgdmFsdWUgb2YgdGhlIEFwcEFybW9yIG1lZGlhdGlvbiBtb2RlIGluIHRoZSBidXMgY29uZmlndXJhdGlvbiAqLworc3RhdGljIEFwcEFybW9yQ29uZmlnTW9kZSBhcHBhcm1vcl9jb25maWdfbW9kZSA9IEFQUEFSTU9SX0VOQUJMRUQ7CisKKy8qIFRoZSBBcHBBcm1vciBjb250ZXh0LCBjb25zaXN0aW5nIG9mIGEgbGFiZWwgYW5kIGEgbW9kZS4gKi8KK3N0cnVjdCBCdXNBcHBBcm1vckNvbmZpbmVtZW50Cit7CisgIGludCByZWZjb3VudDsgLyogUmVmZXJlbmNlIGNvdW50ICovCisKKyAgY2hhciAqbGFiZWw7IC8qIEFwcEFybW9yIGNvbmZpbmVtZW50IGxhYmVsICovCisgIGNvbnN0IGNoYXIgKm1vZGU7IC8qIEFwcEFybW9yIGNvbmZpbmVtZW50IG1vZGUgKGZyZWVkIGJ5IGZyZWVpbmcgKmxhYmVsKSAqLworfTsKKworc3RhdGljIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmJ1c19jb24gPSBOVUxMOworCisvKioKKyAqIENhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBnaXZlIHVwIG93bmVyc2hpcCBvZiB0aGUgKmxhYmVsIGFuZCAqbW9kZQorICogcG9pbnRlcnMuCisgKgorICogQWRkaXRpb25hbGx5LCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgZnJlZWluZyAqbGFiZWwgYW5kICptb2RlIGJlY29tZXMgdGhlCisgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmKCkgZnVuY3Rpb24uIEhvd2V2ZXIsIGl0CisgKiBkb2VzIG5vdCBmcmVlICptb2RlIGJlY2F1c2UgbGliYXBwYXJtb3IncyBhYV9nZXRjb24oKSwgYW5kIGxpYmFwcGFybW9yJ3MKKyAqIG90aGVyIHJlbGF0ZWQgZnVuY3Rpb25zLCBhbGxvY2F0ZSBhIHNpbmdsZSBidWZmZXIgZm9yICpsYWJlbCBhbmQgKm1vZGUgYW5kCisgKiB0aGVuIHNlcGFyYXRlIHRoZSB0d28gY2hhciBhcnJheXMgd2l0aCBhIE5VTCBjaGFyLiBTZWUgdGhlIGFhX2dldGNvbigyKSBtYW4KKyAqIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworc3RhdGljIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQqCitidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfbmV3IChjaGFyICAgICAgICpsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmNvbmZpbmVtZW50OworCisgIGNvbmZpbmVtZW50ID0gZGJ1c19uZXcwIChCdXNBcHBBcm1vckNvbmZpbmVtZW50LCAxKTsKKyAgaWYgKGNvbmZpbmVtZW50ICE9IE5VTEwpCisgICAgeworICAgICAgY29uZmluZW1lbnQtPnJlZmNvdW50ID0gMTsKKyAgICAgIGNvbmZpbmVtZW50LT5sYWJlbCA9IGxhYmVsOworICAgICAgY29uZmluZW1lbnQtPm1vZGUgPSBtb2RlOworICAgIH0KKworICByZXR1cm4gY29uZmluZW1lbnQ7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzZnVsIGNoZWNrLCBGQUxTRSBvbiBPT00uCisgKiBTZXQgKmlzX3N1cHBvcnRlZCB0byB3aGV0aGVyIEFBIGhhcyBELUJ1cyBmZWF0dXJlcy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfYnVzX2FwcGFybW9yX2RldGVjdF9hYV9kYnVzX3N1cHBvcnQgKGRidXNfYm9vbF90ICppc19zdXBwb3J0ZWQpCit7CisgIGludCBtYXNrX2ZpbGU7CisgIERCdXNTdHJpbmcgYWFfZGJ1czsKKyAgY2hhciAqYWFfc2VjdXJpdHlmcyA9IE5VTEw7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworCisgICppc19zdXBwb3J0ZWQgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWFfZGJ1cykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChhYV9maW5kX21vdW50cG9pbnQgKCZhYV9zZWN1cml0eWZzKSAhPSAwKQorICAgIGdvdG8gb3V0OworCisgIC8qCisgICAqIEpvaG4gSm9oYW5zZW4gaGFzIGNvbmZpcm1lZCB0aGF0IHRoZSBtYWlubGluZSBrZXJuZWwgd2lsbCBub3QgaGF2ZQorICAgKiB0aGUgYXBwYXJtb3Jmcy9mZWF0dXJlcy9kYnVzL21hc2sgZmlsZSB1bnRpbCB0aGUgbWFpbmxpbmUga2VybmVsCisgICAqIGhhcyBBcHBBcm1vciBnZXRwZWVyc2VjIHN1cHBvcnQuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhYV9kYnVzLCBhYV9zZWN1cml0eWZzKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhYV9kYnVzLCAiL2ZlYXR1cmVzL2RidXMvbWFzayIpKQorICAgIGdvdG8gb3V0OworCisgIC8qIFdlIG5lZWQgdG8gb3BlbigpIHRoZSBmbGFnIGZpbGUsIG5vdCBqdXN0IHN0YXQoKSBpdCwgYmVjYXVzZSBBcHBBcm1vcgorICAgKiBkb2VzIG5vdCBtZWRpYXRlIHN0YXQoKSBpbiB0aGUgYXBwYXJtb3Jmcy4gSWYgeW91IGhhdmUgYQorICAgKiBkYnVzLWRhZW1vbiBpbnNpZGUgYW4gTFhDIGNvbnRhaW5lciwgd2l0aCBpbnN1ZmZpY2llbnRseSBicm9hZAorICAgKiBBcHBBcm1vciBwcml2aWxlZ2VzIHRvIGRvIGl0cyBvd24gQXBwQXJtb3IgbWVkaWF0aW9uLCB0aGUgZGVzaXJlZAorICAgKiByZXN1bHQgaXMgdGhhdCBpdCBiZWhhdmVzIGFzIGlmIEFwcEFybW9yIHdhcyBub3QgcHJlc2VudDsgYnV0IGEgc3RhdCgpCisgICAqIGhlcmUgd291bGQgc3VjY2VlZCwgYW5kIHJlc3VsdCBpbiBpdCB0cnlpbmcgYW5kIGZhaWxpbmcgdG8gZG8gZnVsbAorICAgKiBtZWRpYXRpb24uIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2RidXMvK2J1Zy8xMjM4MjY3ICovCisgIG1hc2tfZmlsZSA9IG9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmFhX2RidXMpLAorICAgICAgICAgICAgICAgICAgICBPX1JET05MWSB8IE9fQ0xPRVhFQyk7CisgIGlmIChtYXNrX2ZpbGUgIT0gLTEpCisgICAgeworICAgICAgKmlzX3N1cHBvcnRlZCA9IFRSVUU7CisgICAgICBjbG9zZSAobWFza19maWxlKTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0OgorICBmcmVlIChhYV9zZWN1cml0eWZzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhYV9kYnVzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21vZGVzdHJfaXNfY29tcGxhaW4gKGNvbnN0IGNoYXIgKm1vZGUpCit7CisgIGlmIChtb2RlICYmIHN0cmNtcCAobW9kZSwgImNvbXBsYWluIikgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorbG9nX21lc3NhZ2UgKGRidXNfYm9vbF90IGFsbG93LCBjb25zdCBjaGFyICpvcCwgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgY29uc3QgY2hhciAqbXN0cjsKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGludCBhdWRpdF9mZDsKKyNlbmRpZgorCisgIGlmIChhbGxvdykKKyAgICBtc3RyID0gIkFMTE9XRUQiOworICBlbHNlCisgICAgbXN0ciA9ICJERU5JRUQiOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBhdWRpdF9mZCA9IGJ1c19hdWRpdF9nZXRfZmQgKCk7CisKKyAgaWYgKGF1ZGl0X2ZkID49IDApCisgIHsKKyAgICBEQnVzU3RyaW5nIGF2YzsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdmMpKQorICAgICAgZ290byBzeXNsb2c7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmYXZjLAorICAgICAgICAgICJhcHBhcm1vcj1cIiVzXCIgb3BlcmF0aW9uPVwiZGJ1c18lc1wiICVzXG4iLAorICAgICAgICAgIG1zdHIsIG9wLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRhdGEpKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdmMpOworICAgICAgICBnb3RvIHN5c2xvZzsKKyAgICAgIH0KKworICAgIC8qIEZJWE1FOiBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIHNob3cgcmVhbCB1c2VyICovCisgICAgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UgKGF1ZGl0X2ZkLCBBVURJVF9VU0VSX0FWQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYXZjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgZ2V0dWlkICgpKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF2Yyk7CisgICAgcmV0dXJuOworICB9CisKK3N5c2xvZzoKKyNlbmRpZiAvKiBIQVZFX0xJQkFVRElUICovCisKKyAgc3lzbG9nIChMT0dfVVNFUiB8IExPR19OT1RJQ0UsICJhcHBhcm1vcj1cIiVzXCIgb3BlcmF0aW9uPVwiZGJ1c18lc1wiICVzXG4iLAorICAgICAgICAgIG1zdHIsIG9wLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRhdGEpKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfcGFpcl91aW50IChEQnVzU3RyaW5nICphdXhkYXRhLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoYXV4ZGF0YSwgIiAiKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoYXV4ZGF0YSwgbmFtZSkgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKGF1eGRhdGEsICI9IikgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoYXV4ZGF0YSwgdmFsdWUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9wYWlyX3N0ciAoREJ1c1N0cmluZyAqYXV4ZGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCAiICIpICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCBuYW1lKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoYXV4ZGF0YSwgIj1cIiIpICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCB2YWx1ZSkgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKGF1eGRhdGEsICJcIiIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9tYXNrIChEQnVzU3RyaW5nICphdXhkYXRhLCB1aW50MzJfdCBtYXNrKQoreworICBjb25zdCBjaGFyICptYXNrX3N0cjsKKworICAvKiBPbmx5IG9uZSBwZXJtaXNzaW9uIGJpdCBjYW4gYmUgc2V0ICovCisgIGlmIChtYXNrID09IEFBX0RCVVNfU0VORCkKKyAgICBtYXNrX3N0ciA9ICJzZW5kIjsKKyAgZWxzZSBpZiAobWFzayA9PSBBQV9EQlVTX1JFQ0VJVkUpCisgICAgbWFza19zdHIgPSAicmVjZWl2ZSI7CisgIGVsc2UgaWYgKG1hc2sgPT0gQUFfREJVU19CSU5EKQorICAgIG1hc2tfc3RyID0gImJpbmQiOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKGF1eGRhdGEsICJtYXNrIiwgbWFza19zdHIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX3VuY29uZmluZWQgKGNvbnN0IGNoYXIgKmNvbiwgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgLyogdHJlYXQgY29uID09IE5VTEwgYXMgY29uZmluZWQgYXMgaXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIGEgZGVuaWFsICovCisgIGlmICgoIW1vZGUgJiYgY29uICYmIHN0cmNtcCAoY29uLCAidW5jb25maW5lZCIpID09IDApIHx8CisgICAgICBzdHJjbXAgKG1vZGUsICJ1bmNvbmZpbmVkIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3F1ZXJ5X2FwcGVuZCAoREJ1c1N0cmluZyAqcXVlcnksIGNvbnN0IGNoYXIgKmJ1ZmZlcikKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHF1ZXJ5LCAnXDAnKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJ1ZmZlciAmJiAhX2RidXNfc3RyaW5nX2FwcGVuZCAocXVlcnksIGJ1ZmZlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1aWxkX2NvbW1vbl9xdWVyeSAoREJ1c1N0cmluZyAqcXVlcnksIGNvbnN0IGNoYXIgKmNvbiwgY29uc3QgY2hhciAqYnVzdHlwZSkKK3sKKyAgLyoqCisgICAqIGxpYmFwcGFybW9yJ3MgYWFfcXVlcnlfbGFiZWwoKSBmdW5jdGlvbiBzY3JpYmJsZXMgb3ZlciB0aGUgZmlyc3QKKyAgICogQUFfUVVFUllfQ01EX0xBQkVMX1NJWkUgYnl0ZXMgb2YgdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIGEgcHJpdmF0ZSB2YWx1ZS4KKyAgICovCisgIHJldHVybiBfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChxdWVyeSwgMCwgQUFfUVVFUllfQ01EX0xBQkVMX1NJWkUsIDApICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChxdWVyeSwgY29uKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChxdWVyeSwgJ1wwJykgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAocXVlcnksIEFBX0NMQVNTX0RCVVMpICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChxdWVyeSwgYnVzdHlwZSA/IGJ1c3R5cGUgOiAiIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVpbGRfc2VydmljZV9xdWVyeSAoREJ1c1N0cmluZyAqcXVlcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb24sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIGJ1aWxkX2NvbW1vbl9xdWVyeSAocXVlcnksIGNvbiwgYnVzdHlwZSkgJiYKKyAgICAgICAgIHF1ZXJ5X2FwcGVuZCAocXVlcnksIG5hbWUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1aWxkX21lc3NhZ2VfcXVlcnkgKERCdXNTdHJpbmcgKnF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1c3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZHN0X2NvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZW1iZXIpCit7CisgIHJldHVybiBidWlsZF9jb21tb25fcXVlcnkgKHF1ZXJ5LCBzcmNfY29uLCBidXN0eXBlKSAmJgorICAgICAgICAgcXVlcnlfYXBwZW5kIChxdWVyeSwgbmFtZSkgJiYKKyAgICAgICAgIHF1ZXJ5X2FwcGVuZCAocXVlcnksIGRzdF9jb24pICYmCisgICAgICAgICBxdWVyeV9hcHBlbmQgKHF1ZXJ5LCBwYXRoKSAmJgorICAgICAgICAgcXVlcnlfYXBwZW5kIChxdWVyeSwgaW50ZXJmYWNlKSAmJgorICAgICAgICAgcXVlcnlfYXBwZW5kIChxdWVyeSwgbWVtYmVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidWlsZF9lYXZlc2Ryb3BfcXVlcnkgKERCdXNTdHJpbmcgKnF1ZXJ5LCBjb25zdCBjaGFyICpjb24sIGNvbnN0IGNoYXIgKmJ1c3R5cGUpCit7CisgIHJldHVybiBidWlsZF9jb21tb25fcXVlcnkgKHF1ZXJ5LCBjb24sIGJ1c3R5cGUpOworfQorCitzdGF0aWMgdm9pZAorc2V0X2Vycm9yX2Zyb21fcXVlcnlfZXJybm8gKERCdXNFcnJvciAqZXJyb3IsIGludCBlcnJvcl9udW1iZXIpCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJyb3JfbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcXVlcnkgQXBwQXJtb3IgcG9saWN5OiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJyb3JfbnVtYmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZXJyb3JfZnJvbV9kZW5pZWRfbWVzc2FnZSAoREJ1c0Vycm9yICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICptc2d0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZGVzdGluYXRpb24pCit7CisgIGNvbnN0IGNoYXIgKnByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvOworICBjb25zdCBjaGFyICp1bnNldCA9ICIodW5zZXQpIjsKKworICBwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbyA9IHByb3Bvc2VkX3JlY2lwaWVudCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKHByb3Bvc2VkX3JlY2lwaWVudCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXMiOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgIkFuIEFwcEFybW9yIHBvbGljeSBwcmV2ZW50cyB0aGlzIHNlbmRlciBmcm9tIHNlbmRpbmcgdGhpcyAiCisgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0byB0aGlzIHJlY2lwaWVudDsgdHlwZT1cIiVzXCIsICIKKyAgICAgICAgICAgICAgICAgICJzZW5kZXI9XCIlc1wiICglcykgaW50ZXJmYWNlPVwiJXNcIiBtZW1iZXI9XCIlc1wiICIKKyAgICAgICAgICAgICAgICAgICJlcnJvciBuYW1lPVwiJXNcIiByZXF1ZXN0ZWRfcmVwbHk9XCIlZFwiICIKKyAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbj1cIiVzXCIgKCVzKSIsCisgICAgICAgICAgICAgICAgICBtc2d0eXBlLAorICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKHNlbmRlciksCisgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgIGludGVyZmFjZSA/IGludGVyZmFjZSA6IHVuc2V0LAorICAgICAgICAgICAgICAgICAgbWVtYmVyID8gbWVtYmVyIDogdW5zZXQsCisgICAgICAgICAgICAgICAgICBlcnJvcl9uYW1lID8gZXJyb3JfbmFtZSA6IHVuc2V0LAorICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICBwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbyk7Cit9CisjZW5kaWYgLyogSEFWRV9BUFBBUk1PUiAqLworCisvKioKKyAqIERvIGVhcmx5IGluaXRpYWxpemF0aW9uOyBkZXRlcm1pbmUgd2hldGhlciBBcHBBcm1vciBpcyBlbmFibGVkLgorICogUmV0dXJuIFRSVUUgb24gc3VjY2Vzc2Z1bCBjaGVjayAod2hldGhlciBBcHBBcm1vciBpcyBhY3R1YWxseQorICogZW5hYmxlZCBvciBub3QpIG9yIEZBTFNFIG9uIE9PTS4KKyAqLworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9wcmVfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIGFwcGFybW9yX2VuYWJsZWQgPSBGQUxTRTsKKworICBpZiAoIWFhX2lzX2VuYWJsZWQgKCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFfYnVzX2FwcGFybW9yX2RldGVjdF9hYV9kYnVzX3N1cHBvcnQgKCZhcHBhcm1vcl9lbmFibGVkKSkKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9zZXRfbW9kZV9mcm9tX2NvbmZpZyAoY29uc3QgY2hhciAqbW9kZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIGlmIChtb2RlICE9IE5VTEwpCisgIHsKKyAgICBpZiAoc3RyY21wIChtb2RlLCAiZGlzYWJsZWQiKSA9PSAwKQorICAgICAgYXBwYXJtb3JfY29uZmlnX21vZGUgPSBBUFBBUk1PUl9ESVNBQkxFRDsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG1vZGUsICJlbmFibGVkIikgPT0gMCkKKyAgICAgIGFwcGFybW9yX2NvbmZpZ19tb2RlID0gQVBQQVJNT1JfRU5BQkxFRDsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG1vZGUsICJyZXF1aXJlZCIpID09IDApCisgICAgICBhcHBhcm1vcl9jb25maWdfbW9kZSA9IEFQUEFSTU9SX1JFUVVJUkVEOworICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNb2RlIGF0dHJpYnV0ZSBvbiA8YXBwYXJtb3I+IG11c3QgaGF2ZSB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJyZXF1aXJlZFwiLCBcImVuYWJsZWRcIiBvciBcImRpc2FibGVkXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgXCIlc1wiIiwgbW9kZSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgaWYgKG1vZGUgPT0gTlVMTCB8fCBzdHJjbXAgKG1vZGUsICJkaXNhYmxlZCIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAgKG1vZGUsICJlbmFibGVkIikgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgIk1vZGUgYXR0cmlidXRlIG9uIDxhcHBhcm1vcj4gbXVzdCBoYXZlIHZhbHVlIFwiZW5hYmxlZFwiIG9yICIKKyAgICAgICAgICAgICAgICAgICJcImRpc2FibGVkXCIgYnV0IGNhbm5vdCBiZSBcIiVzXCIgd2hlbiBELUJ1cyBpcyBidWlsdCAiCisgICAgICAgICAgICAgICAgICAid2l0aG91dCBBcHBBcm1vciBzdXBwb3J0IiwgbW9kZSk7CisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IHRoZSBjb25maWcgbW9kZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGtlcm5lbCdzIEFwcEFybW9yCisgKiBzdXBwb3J0LiBJZiBBcHBBcm1vciBtZWRpYXRpb24gd2lsbCBiZSBlbmFibGVkLCBkZXRlcm1pbmUgdGhlIGJ1cworICogY29uZmluZW1lbnQgbGFiZWwuCisgKi8KK2RidXNfYm9vbF90CitidXNfYXBwYXJtb3JfZnVsbF9pbml0IChEQnVzRXJyb3IgKmVycm9yKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgY2hhciAqbGFiZWwsICptb2RlOworCisgIGlmIChhcHBhcm1vcl9lbmFibGVkKQorICAgIHsKKyAgICAgIGlmIChhcHBhcm1vcl9jb25maWdfbW9kZSA9PSBBUFBBUk1PUl9ESVNBQkxFRCkKKyAgICAgICAgeworICAgICAgICAgIGFwcGFybW9yX2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYnVzX2NvbiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFhX2dldGNvbiAoJmxhYmVsLCAmbW9kZSkgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBBcHBBcm1vciBjb250ZXh0IG9mIGJ1czogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJ1c19jb24gPSBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfbmV3IChsYWJlbCwgbW9kZSk7CisgICAgICAgICAgaWYgKGJ1c19jb24gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZnJlZSAobGFiZWwpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYXBwYXJtb3JfY29uZmlnX21vZGUgPT0gQVBQQVJNT1JfUkVRVUlSRUQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwQXJtb3IgbWVkaWF0aW9uIHJlcXVpcmVkIGJ1dCBub3QgcHJlc2VudCIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYXBwYXJtb3JfY29uZmlnX21vZGUgPT0gQVBQQVJNT1JfRU5BQkxFRCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19hcHBhcm1vcl9zaHV0ZG93biAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIkFwcEFybW9yIHNodXRkb3duXG4iKTsKKworICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYgKGJ1c19jb24pOworICBidXNfY29uID0gTlVMTDsKKyNlbmRpZiAvKiBIQVZFX0FQUEFSTU9SICovCit9CisKK2RidXNfYm9vbF90CitidXNfYXBwYXJtb3JfZW5hYmxlZCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIHJldHVybiBhcHBhcm1vcl9lbmFibGVkOworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKK3ZvaWQKK2J1c19hcHBhcm1vcl9jb25maW5lbWVudF91bnJlZiAoQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uZmluZW1lbnQpCit7CisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoY29uZmluZW1lbnQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29uZmluZW1lbnQtPnJlZmNvdW50ID4gMCk7CisKKyAgY29uZmluZW1lbnQtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGNvbmZpbmVtZW50LT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIC8qKgorICAgICAgICogRG8gbm90IGZyZWUgY29uZmluZW1lbnQtPm1vZGUsIGFzIGxpYmFwcGFybW9yIGRvZXMgYSBzaW5nbGUgbWFsbG9jIGZvcgorICAgICAgICogYm90aCBjb25maW5lbWVudC0+bGFiZWwgYW5kIGNvbmZpbmVtZW50LT5tb2RlLgorICAgICAgICovCisgICAgICBmcmVlIChjb25maW5lbWVudC0+bGFiZWwpOworICAgICAgZGJ1c19mcmVlIChjb25maW5lbWVudCk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQKK2J1c19hcHBhcm1vcl9jb25maW5lbWVudF9yZWYgKEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmNvbmZpbmVtZW50KQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgaWYgKCFhcHBhcm1vcl9lbmFibGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGNvbmZpbmVtZW50ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNvbmZpbmVtZW50LT5yZWZjb3VudCA+IDApOworCisgIGNvbmZpbmVtZW50LT5yZWZjb3VudCArPSAxOworI2VuZGlmIC8qIEhBVkVfQVBQQVJNT1IgKi8KK30KKworQnVzQXBwQXJtb3JDb25maW5lbWVudCoKK2J1c19hcHBhcm1vcl9pbml0X2Nvbm5lY3Rpb25fY29uZmluZW1lbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uZmluZW1lbnQ7CisgIGNoYXIgKmxhYmVsLCAqbW9kZTsKKyAgaW50IGZkOworCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCAoY29ubmVjdGlvbiwgJmZkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHNvY2tldCBmaWxlIGRlc2NyaXB0b3Igb2YgY29ubmVjdGlvbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChhYV9nZXRwZWVyY29uIChmZCwgJmxhYmVsLCAmbW9kZSkgPT0gLTEpCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVOT01FTSkKKyAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBBcHBBcm1vciBjb25maW5lbWVudCBpbmZvcm1hdGlvbiBvZiBzb2NrZXQgcGVlcjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY29uZmluZW1lbnQgPSBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfbmV3IChsYWJlbCwgbW9kZSk7CisgIGlmIChjb25maW5lbWVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBmcmVlIChsYWJlbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGNvbmZpbmVtZW50OworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogSEFWRV9BUFBBUk1PUiAqLworfQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29ubmVjdGlvbiBjYW4gYWNxdWlyZSBhIHNlcnZpY2UsCisgKiB1c2luZyB0aGUgdGFza3Mgc2VjdXJpdHkgY29udGV4dAorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gdGhhdCB3YW50cyB0byBvd24gdGhlIHNlcnZpY2UKKyAqIEBwYXJhbSBidXN0eXBlIG5hbWUgb2YgdGhlIGJ1cworICogQHBhcmFtIHNlcnZpY2VfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBhY3F1aXJlCisgKiBAcGFyYW0gZXJyb3IgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSB3aGVuIEZBTFNFIGlzIHJldHVybmVkCisgKiBAcmV0dXJucyBUUlVFIGlmIGFjcXVpcmUgaXMgcGVybWl0dGVkCisgKi8KK2RidXNfYm9vbF90CitidXNfYXBwYXJtb3JfYWxsb3dzX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworCisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpjb24gPSBOVUxMOworICBEQnVzU3RyaW5nIHFzdHIsIGF1eGRhdGE7CisgIGRidXNfYm9vbF90IGZyZWVfYXV4ZGF0YSA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBhbGxvdyA9IEZBTFNFLCBhdWRpdCA9IFRSVUU7CisgIHVuc2lnbmVkIGxvbmcgcGlkOworICBpbnQgcmVzLCBzZXJybm8gPSAwOworCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgY29uID0gYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChjb25uZWN0aW9uKTsKKworICBpZiAoaXNfdW5jb25maW5lZCAoY29uLT5sYWJlbCwgY29uLT5tb2RlKSkKKyAgICB7CisgICAgICBhbGxvdyA9IFRSVUU7CisgICAgICBhdWRpdCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZxc3RyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1aWxkX3NlcnZpY2VfcXVlcnkgKCZxc3RyLCBjb24tPmxhYmVsLCBidXN0eXBlLCBzZXJ2aWNlX25hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcXN0cik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgcmVzID0gYWFfcXVlcnlfbGFiZWwgKEFBX0RCVVNfQklORCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnFzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvdywgJmF1ZGl0KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgaWYgKHJlcyA9PSAtMSkKKyAgICB7CisgICAgICBzZXJybm8gPSBlcnJubzsKKyAgICAgIHNldF9lcnJvcl9mcm9tX3F1ZXJ5X2Vycm5vIChlcnJvciwgc2Vycm5vKTsKKyAgICAgIGdvdG8gYXVkaXQ7CisgICAgfQorCisgIC8qIERvbid0IGZhaWwgb3BlcmF0aW9ucyBvbiBwcm9maWxlcyBpbiBjb21wbGFpbiBtb2RlICovCisgIGlmIChtb2Rlc3RyX2lzX2NvbXBsYWluIChjb24tPm1vZGUpKQorICAgICAgYWxsb3cgPSBUUlVFOworCisgIGlmICghYWxsb3cpCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gdGhlIHNlcnZpY2UgIgorICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIGR1ZSB0byBBcHBBcm1vciBwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSA6ICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBpZiAoIWF1ZGl0KQorICAgIGdvdG8gb3V0OworCisgYXVkaXQ6CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXhkYXRhKSkKKyAgICBnb3RvIG9vbTsKKyAgZnJlZV9hdXhkYXRhID0gVFJVRTsKKworICBpZiAoIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJidXMiLCBidXN0eXBlID8gYnVzdHlwZSA6ICJ1bmtub3duIikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAibmFtZSIsIHNlcnZpY2VfbmFtZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKHNlcnJubyAmJiAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImluZm8iLCBzdHJlcnJvciAoc2Vycm5vKSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfbWFzayAoJmF1eGRhdGEsIEFBX0RCVVNfQklORCkpCisgICAgZ290byBvb207CisKKyAgaWYgKGNvbm5lY3Rpb24gJiYgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm5lY3Rpb24sICZwaWQpICYmCisgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwaWQiLCBwaWQpKQorICAgIGdvdG8gb29tOworCisgIGlmIChjb24tPmxhYmVsICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAibGFiZWwiLCBjb24tPmxhYmVsKSkKKyAgICBnb3RvIG9vbTsKKworICBsb2dfbWVzc2FnZSAoYWxsb3csICJiaW5kIiwgJmF1eGRhdGEpOworCisgb3V0OgorICBpZiAoY29uICE9IE5VTEwpCisgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChjb24pOworICBpZiAoZnJlZV9hdXhkYXRhKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIHJldHVybiBhbGxvdzsKKworIG9vbToKKyAgaWYgKGVycm9yICE9IE5VTEwgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgYWxsb3cgPSBGQUxTRTsKKyAgZ290byBvdXQ7CisKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfQVBQQVJNT1IgKi8KK30KKworLyoqCisgKiBDaGVjayBpZiBBcHBhcm1vciBzZWN1cml0eSBjb250cm9scyBhbGxvdyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIGEKKyAqIHBhcnRpY3VsYXIgY29ubmVjdGlvbiBiYXNlZCBvbiB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgc2VuZGVyIGFuZAorICogdGhhdCBvZiB0aGUgcmVjZWl2ZXIuIFRoZSBkZXN0aW5hdGlvbiBjb25uZWN0aW9uIG5lZWQgbm90IGJlIHRoZQorICogYWRkcmVzc2VkIHJlY2lwaWVudCwgaXQgY291bGQgYmUgYW4gImVhdmVzZHJvcHBlciIKKyAqCisgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0gcHJvcG9zZWRfcmVjaXBpZW50IHRoZSBjb25uZWN0aW9uIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHNlbnQgdG8uCisgKiBAcGFyYW0gcmVxdWVzdGVkX3JlcGx5IFRSVUUgaWYgdGhlIG1lc3NhZ2UgaXMgYSByZXBseSByZXF1ZXN0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zZWRfcmVjaXBpZW50CisgKiBAcGFyYW0gYnVzdHlwZSBuYW1lIG9mIHRoZSBidXMKKyAqIEBwYXJhbSBtc2d0eXBlIG1lc3NhZ2UgdHlwZSAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsIGV0Yy4pCisgKiBAcGFyYW0gcGF0aCBvYmplY3QgcGF0aCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudCB0bworICogQHBhcmFtIGludGVyZmFjZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGluc3RhbmNlCisgKiBAcGFyYW0gbWVtYmVyIHRoZSBtZW1iZXIgb2YgdGhlIG9iamVjdAorICogQHBhcmFtIGVycm9yX25hbWUgdGhlIG5hbWUgb2YgdGhlIGVycm9yIGlmIHRoZSBtZXNzYWdlIHR5cGUgaXMgZXJyb3IKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiBuYW1lIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQgdG8KKyAqIEBwYXJhbSBzb3VyY2UgbmFtZSB0aGF0IHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IGZyb20KKyAqIEBwYXJhbSBlcnJvciB0aGUgcmVhc29uIGZvciBmYWlsdXJlIHdoZW4gRkFMU0UgaXMgcmV0dXJuZWQKKyAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIG1lc3NhZ2UgaXMgcGVybWl0dGVkCisgKi8KK2RidXNfYm9vbF90CitidXNfYXBwYXJtb3JfYWxsb3dzX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtc2d0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKm1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKnNyY19jb24gPSBOVUxMLCAqZHN0X2NvbiA9IE5VTEw7CisgIERCdXNTdHJpbmcgcXN0ciwgYXV4ZGF0YTsKKyAgZGJ1c19ib29sX3Qgc3JjX2FsbG93ID0gRkFMU0UsIGRzdF9hbGxvdyA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBzcmNfYXVkaXQgPSBUUlVFLCBkc3RfYXVkaXQgPSBUUlVFOworICBkYnVzX2Jvb2xfdCBmcmVlX2F1eGRhdGEgPSBGQUxTRTsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGludCBsZW4sIHJlcywgc3JjX2Vycm5vID0gMCwgZHN0X2Vycm5vID0gMDsKKyAgdWludDMyX3Qgc3JjX3Blcm0gPSBBQV9EQlVTX1NFTkQsIGRzdF9wZXJtID0gQUFfREJVU19SRUNFSVZFOworICBjb25zdCBjaGFyICptc2d0eXBlc3RyID0gZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nKG1zZ3R5cGUpOworCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciAhPSBOVUxMKTsKKworICBzcmNfY29uID0gYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChzZW5kZXIpOworCisgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQpCisgICAgeworICAgICAgZHN0X2NvbiA9IGJ1c19jb25uZWN0aW9uX2R1cF9hcHBhcm1vcl9jb25maW5lbWVudCAocHJvcG9zZWRfcmVjaXBpZW50KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkc3RfY29uID0gYnVzX2NvbjsKKyAgICAgIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9yZWYgKGRzdF9jb24pOworICAgIH0KKworICAvKiBtYXAgcmVwbHkgbWVzc2FnZXMgdG8gaW5pdGlhbCBzZW5kIGFuZCByZWNlaXZlIHBlcm1pc3Npb24uIFRoYXQgaXMKKyAgICogcGVybWlzc2lvbiB0byByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIFggZ3JhbnRzIHBlcm1pc3Npb24gdG8gcmVwbHkgdG8gWC4KKyAgICogQW5kIHBlcm1pc3Npb24gdG8gc2VuZCBhIG1lc3NhZ2UgdG8gWSBncmFudHMgcGVybWlzc2lvbiB0byByZWNlaXZlIGEgcmVwbHkKKyAgICogZnJvbSBZLiBOb3RlIHRoYXQgdGhpcyBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdGVkIHJlcGxpZXMuIFVucmVxdWVzdGVkCisgICAqIHJlcGxpZXMgc3RpbGwgcmVxdWlyZSBhIHBvbGljeSBxdWVyeS4KKyAgICovCisgIGlmIChyZXF1ZXN0ZWRfcmVwbHkpCisgICAgeworICAgICAgLyogaWdub3JlIHJlcXVlc3RlZCByZXBseSBtZXNzYWdlcyBhbmQgbGV0IGRidXMgcmVwbHkgbWFwcGluZyBoYW5kbGUgdGhlbQorICAgICAgICogYXMgdGhlIHNlbmQgd2FzIGFscmVhZHkgYWxsb3dlZAorICAgICAgICovCisgICAgICBzcmNfYWxsb3cgPSBUUlVFOworICAgICAgZHN0X2FsbG93ID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoaXNfdW5jb25maW5lZCAoc3JjX2Nvbi0+bGFiZWwsIHNyY19jb24tPm1vZGUpKQorICAgIHsKKyAgICAgIHNyY19hbGxvdyA9IFRSVUU7CisgICAgICBzcmNfYXVkaXQgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcXN0cikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIWJ1aWxkX21lc3NhZ2VfcXVlcnkgKCZxc3RyLCBzcmNfY29uLT5sYWJlbCwgYnVzdHlwZSwgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9jb24tPmxhYmVsLCBwYXRoLCBpbnRlcmZhY2UsIG1lbWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnFzdHIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIHJlcyA9IGFhX3F1ZXJ5X2xhYmVsIChzcmNfcGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnFzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNfYWxsb3csICZzcmNfYXVkaXQpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBzcmNfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBzZXRfZXJyb3JfZnJvbV9xdWVyeV9lcnJubyAoZXJyb3IsIHNyY19lcnJubyk7CisgICAgICAgICAgZ290byBhdWRpdDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoaXNfdW5jb25maW5lZCAoZHN0X2Nvbi0+bGFiZWwsIGRzdF9jb24tPm1vZGUpKQorICAgIHsKKyAgICAgIGRzdF9hbGxvdyA9IFRSVUU7CisgICAgICBkc3RfYXVkaXQgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcXN0cikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIWJ1aWxkX21lc3NhZ2VfcXVlcnkgKCZxc3RyLCBkc3RfY29uLT5sYWJlbCwgYnVzdHlwZSwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29uLT5sYWJlbCwgcGF0aCwgaW50ZXJmYWNlLCBtZW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICByZXMgPSBhYV9xdWVyeV9sYWJlbCAoZHN0X3Blcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0X2FsbG93LCAmZHN0X2F1ZGl0KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcXN0cik7CisgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgZHN0X2Vycm5vID0gZXJybm87CisgICAgICAgICAgc2V0X2Vycm9yX2Zyb21fcXVlcnlfZXJybm8gKGVycm9yLCBkc3RfZXJybm8pOworICAgICAgICAgIGdvdG8gYXVkaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogRG9uJ3QgZmFpbCBvcGVyYXRpb25zIG9uIHByb2ZpbGVzIGluIGNvbXBsYWluIG1vZGUgKi8KKyAgaWYgKG1vZGVzdHJfaXNfY29tcGxhaW4gKHNyY19jb24tPm1vZGUpKQorICAgIHNyY19hbGxvdyA9IFRSVUU7CisgIGlmIChtb2Rlc3RyX2lzX2NvbXBsYWluIChkc3RfY29uLT5tb2RlKSkKKyAgICBkc3RfYWxsb3cgPSBUUlVFOworCisgIGlmICghc3JjX2FsbG93IHx8ICFkc3RfYWxsb3cpCisgICAgc2V0X2Vycm9yX2Zyb21fZGVuaWVkX21lc3NhZ2UgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2d0eXBlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24pOworCisgIC8qIERvbid0IGF1ZGl0IHRoZSBtZXNzYWdlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKKyAgICogICAxKSBUaGUgQXBwQXJtb3IgcXVlcnkgaW5kaWNhdGVzIHRoYXQgYXVkaXRpbmcgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAqICAgMikgVGhlIG1lc3NhZ2UgaXMgYSByZXBseSB0eXBlLiBSZXBseSBtZXNzYWdlIGFyZSBub3QgYXVkaXRlZCBiZWNhdXNlCisgICAqICAgICAgdGhlIEFwcEFybW9yIHBvbGljeSBsYW5ndWFnZSBkb2VzIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgYSByZXBseQorICAgKiAgICAgIG1lc3NhZ2UuIFVucmVxdWVzdGVkIHJlcGxpZXMgd2lsbCBiZSBzaWxlbnRseSBkaXNjYXJkZWQgaWYgdGhlIHNlbmRlcgorICAgKiAgICAgIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBzZW5kIHRvIHRoZSByZWNlaXZlciBvciBpZiB0aGUgcmVjZWl2ZXIKKyAgICogICAgICBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gcmVjZWl2ZSBmcm9tIHRoZSBzZW5kZXIuCisgICAqLworICBpZiAoKCFzcmNfYXVkaXQgJiYgIWRzdF9hdWRpdCkgfHwKKyAgICAgIChtc2d0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gfHwKKyAgICAgICBtc2d0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKSkKKyAgICBnb3RvIG91dDsKKworIGF1ZGl0OgorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV4ZGF0YSkpCisgICAgZ290byBvb207CisgIGZyZWVfYXV4ZGF0YSA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiYnVzIiwgYnVzdHlwZSA/IGJ1c3R5cGUgOiAidW5rbm93biIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChwYXRoICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAicGF0aCIsIHBhdGgpKQorICAgIGdvdG8gb29tOworCisgIGlmIChpbnRlcmZhY2UgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJpbnRlcmZhY2UiLCBpbnRlcmZhY2UpKQorICAgIGdvdG8gb29tOworCisgIGlmIChtZW1iZXIgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJtZW1iZXIiLCBtZW1iZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChlcnJvcl9uYW1lICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiZXJyb3JfbmFtZSIsIGVycm9yX25hbWUpKQorICAgIGdvdG8gb29tOworCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV4ZGF0YSk7CisKKyAgaWYgKHNyY19hdWRpdCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2FwcGVuZF9tYXNrICgmYXV4ZGF0YSwgc3JjX3Blcm0pKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKGRlc3RpbmF0aW9uICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAibmFtZSIsIGRlc3RpbmF0aW9uKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChzZW5kZXIgJiYgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKHNlbmRlciwgJnBpZCkgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwaWQiLCBwaWQpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKHNyY19jb24tPmxhYmVsICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJsYWJlbCIsIHNyY19jb24tPmxhYmVsKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgJiYKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmcGlkKSAmJgorICAgICAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl91aW50ICgmYXV4ZGF0YSwgInBlZXJfcGlkIiwgcGlkKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChkc3RfY29uLT5sYWJlbCAmJgorICAgICAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAicGVlcl9sYWJlbCIsIGRzdF9jb24tPmxhYmVsKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChzcmNfZXJybm8gJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJpbmZvIiwgc3RyZXJyb3IgKHNyY19lcnJubykpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKGRzdF9lcnJubyAmJgorICAgICAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAicGVlcl9pbmZvIiwgc3RyZXJyb3IgKGRzdF9lcnJubykpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgbG9nX21lc3NhZ2UgKHNyY19hbGxvdywgbXNndHlwZXN0ciwgJmF1eGRhdGEpOworICAgIH0KKyAgaWYgKGRzdF9hdWRpdCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1eGRhdGEsIGxlbik7CisKKyAgICAgIGlmIChzb3VyY2UgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJuYW1lIiwgc291cmNlKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfYXBwZW5kX21hc2sgKCZhdXhkYXRhLCBkc3RfcGVybSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKHByb3Bvc2VkX3JlY2lwaWVudCwgJnBpZCkgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwaWQiLCBwaWQpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKGRzdF9jb24tPmxhYmVsICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJsYWJlbCIsIGRzdF9jb24tPmxhYmVsKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChzZW5kZXIgJiYgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKHNlbmRlciwgJnBpZCkgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwZWVyX3BpZCIsIHBpZCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoc3JjX2Nvbi0+bGFiZWwgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgInBlZXJfbGFiZWwiLCBzcmNfY29uLT5sYWJlbCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoZHN0X2Vycm5vICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiaW5mbyIsIHN0cmVycm9yIChkc3RfZXJybm8pKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChzcmNfZXJybm8gJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgInBlZXJfaW5mbyIsIHN0cmVycm9yIChzcmNfZXJybm8pKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGxvZ19tZXNzYWdlIChkc3RfYWxsb3csIG1zZ3R5cGVzdHIsICZhdXhkYXRhKTsKKyAgICB9CisKKyBvdXQ6CisgIGlmIChzcmNfY29uICE9IE5VTEwpCisgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChzcmNfY29uKTsKKyAgaWYgKGRzdF9jb24gIT0gTlVMTCkKKyAgICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYgKGRzdF9jb24pOworICBpZiAoZnJlZV9hdXhkYXRhKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisKKyAgcmV0dXJuIHNyY19hbGxvdyAmJiBkc3RfYWxsb3c7CisKKyBvb206CisgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHNyY19hbGxvdyA9IEZBTFNFOworICBkc3RfYWxsb3cgPSBGQUxTRTsKKyAgZ290byBvdXQ7CisKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfQVBQQVJNT1IgKi8KK30KKworLyoqCisgKiBDaGVjayBpZiBBcHBhcm1vciBzZWN1cml0eSBjb250cm9scyBhbGxvdyB0aGUgY29ubmVjdGlvbiB0byBlYXZlc2Ryb3Agb24KKyAqIG90aGVyIGNvbm5lY3Rpb25zLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIGF0dGVtcHRpbmcgdG8gZWF2ZXNkcm9wLgorICogQHBhcmFtIGJ1c3R5cGUgbmFtZSBvZiB0aGUgYnVzCisgKiBAcGFyYW0gZXJyb3IgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSB3aGVuIEZBTFNFIGlzIHJldHVybmVkCisgKiBAcmV0dXJucyBUUlVFIGlmIGVhdmVzZHJvcHBpbmcgaXMgcGVybWl0dGVkCisgKi8KK2RidXNfYm9vbF90CitidXNfYXBwYXJtb3JfYWxsb3dzX2VhdmVzZHJvcHBpbmcgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uID0gTlVMTDsKKyAgREJ1c1N0cmluZyBxc3RyLCBhdXhkYXRhOworICBkYnVzX2Jvb2xfdCBhbGxvdyA9IEZBTFNFLCBhdWRpdCA9IFRSVUU7CisgIGRidXNfYm9vbF90IGZyZWVfYXV4ZGF0YSA9IEZBTFNFOworICB1bnNpZ25lZCBsb25nIHBpZDsKKyAgaW50IHJlcywgc2Vycm5vID0gMDsKKworICBpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY29uID0gYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChjb25uZWN0aW9uKTsKKworICBpZiAoaXNfdW5jb25maW5lZCAoY29uLT5sYWJlbCwgY29uLT5tb2RlKSkKKyAgICB7CisgICAgICBhbGxvdyA9IFRSVUU7CisgICAgICBhdWRpdCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZxc3RyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1aWxkX2VhdmVzZHJvcF9xdWVyeSAoJnFzdHIsIGNvbi0+bGFiZWwsIGJ1c3R5cGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcXN0cik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgcmVzID0gYWFfcXVlcnlfbGFiZWwgKEFBX0RCVVNfRUFWRVNEUk9QLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnFzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmFsbG93LCAmYXVkaXQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnFzdHIpOworICBpZiAocmVzID09IC0xKQorICAgIHsKKyAgICAgIHNlcnJubyA9IGVycm5vOworICAgICAgc2V0X2Vycm9yX2Zyb21fcXVlcnlfZXJybm8gKGVycm9yLCBzZXJybm8pOworICAgICAgZ290byBhdWRpdDsKKyAgICB9CisKKyAgLyogRG9uJ3QgZmFpbCBvcGVyYXRpb25zIG9uIHByb2ZpbGVzIGluIGNvbXBsYWluIG1vZGUgKi8KKyAgaWYgKG1vZGVzdHJfaXNfY29tcGxhaW4gKGNvbi0+bW9kZSkpCisgICAgYWxsb3cgPSBUUlVFOworCisgIGlmICghYWxsb3cpCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBlYXZlc2Ryb3AgZHVlIHRvICIKKyAgICAgICAgICAgICAgICAgICAgIkFwcEFybW9yIHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOiAiKGluYWN0aXZlKSIpOworCisgIGlmICghYXVkaXQpCisgICAgZ290byBvdXQ7CisKKyBhdWRpdDoKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworICBmcmVlX2F1eGRhdGEgPSBUUlVFOworCisgIGlmICghX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImJ1cyIsIGJ1c3R5cGUgPyBidXN0eXBlIDogInVua25vd24iKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoc2Vycm5vICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiaW5mbyIsIHN0cmVycm9yIChzZXJybm8pKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJtYXNrIiwgImVhdmVzZHJvcCIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChjb25uZWN0aW9uICYmIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uZWN0aW9uLCAmcGlkKSAmJgorICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3VpbnQgKCZhdXhkYXRhLCAicGlkIiwgcGlkKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoY29uLT5sYWJlbCAmJiAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImxhYmVsIiwgY29uLT5sYWJlbCkpCisgICAgZ290byBvb207CisKKyAgbG9nX21lc3NhZ2UgKGFsbG93LCAiZWF2ZXNkcm9wIiwgJmF1eGRhdGEpOworCisgb3V0OgorICBpZiAoY29uICE9IE5VTEwpCisgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChjb24pOworICBpZiAoZnJlZV9hdXhkYXRhKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisKKyAgcmV0dXJuIGFsbG93OworCisgb29tOgorICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBhbGxvdyA9IEZBTFNFOworICBnb3RvIG91dDsKKworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYgLyogSEFWRV9BUFBBUk1PUiAqLworfQpkaWZmIC0tZ2l0IGEvYnVzL2FwcGFybW9yLmggYi9idXMvYXBwYXJtb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYzZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2FwcGFybW9yLmgKQEAgLTAsMCArMSw2NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotCisgKiBhcHBhcm1vci5jICBBcHBBcm1vciBzZWN1cml0eSBjaGVja3MgZm9yIEQtQnVzCisgKgorICogQXV0aG9yczogSm9obiBKb2hhbnNlbiA8am9obi5qb2hhbnNlbkBjYW5vbmljYWwuY29tPgorICogICAgICAgICAgVHlsZXIgSGlja3MgPHR5aGlja3NAY2Fub25pY2FsLmNvbT4KKyAqIEJhc2VkIG9uOiBzZWxpbnV4LmggYnkgTWF0dGhldyBSaWNrYXJkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0FQUEFSTU9SX0gKKyNkZWZpbmUgQlVTX0FQUEFSTU9SX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImJ1cy5oIgorCitkYnVzX2Jvb2xfdCBidXNfYXBwYXJtb3JfcHJlX2luaXQgKHZvaWQpOworZGJ1c19ib29sX3QgYnVzX2FwcGFybW9yX3NldF9tb2RlX2Zyb21fY29uZmlnIChjb25zdCBjaGFyICptb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19hcHBhcm1vcl9mdWxsX2luaXQgKERCdXNFcnJvciAqZXJyb3IpOwordm9pZCBidXNfYXBwYXJtb3Jfc2h1dGRvd24gKHZvaWQpOworZGJ1c19ib29sX3QgYnVzX2FwcGFybW9yX2VuYWJsZWQgKHZvaWQpOworCit2b2lkIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF91bnJlZiAoQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uZmluZW1lbnQpOwordm9pZCBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfcmVmIChCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpjb25maW5lbWVudCk7CitCdXNBcHBBcm1vckNvbmZpbmVtZW50KiBidXNfYXBwYXJtb3JfaW5pdF9jb25uZWN0aW9uX2NvbmZpbmVtZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19hcHBhcm1vcl9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfYXBwYXJtb3JfYWxsb3dzX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtc2d0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKm1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19hcHBhcm1vcl9hbGxvd3NfZWF2ZXNkcm9wcGluZyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmJ1c3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0FQUEFSTU9SX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9hdWRpdC5jIGIvYnVzL2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNWU0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9hdWRpdC5jCkBAIC0wLDAgKzEsMTg5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIGF1ZGl0LmMgLSBsaWJhdWRpdCBpbnRlZ3JhdGlvbiBmb3IgU0VMaW51eCBhbmQgQXBwQXJtb3IKKyAqCisgKiBCYXNlZCBvbiBhcHBhcm1vci5jLCBzZWxpbnV4LmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE1IENhbm9uaWNhbCwgTHRkLgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJhdWRpdC5oIgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MSUJBVURJVAorI2luY2x1ZGUgPGNhcC1uZy5oPgorI2luY2x1ZGUgPGxpYmF1ZGl0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpZmRlZiBEQlVTX1VOSVgKKyNpbmNsdWRlIDxkYnVzL2RidXMtdXNlcmRiLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCQVVESVQKK3N0YXRpYyBpbnQgYXVkaXRfZmQgPSAtMTsKKyNlbmRpZgorCisvKioKKyAqIE9wZW4gdGhlIGxpYmF1ZGl0IGZkIGlmIGFwcHJvcHJpYXRlLgorICovCit2b2lkCitidXNfYXVkaXRfaW5pdCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGludCBpOworCisgIGNhcG5nX2dldF9jYXBzX3Byb2Nlc3MgKCk7CisKKyAgLyogV29yayBhcm91bmQgYSBidWcgaW4gbGliY2FwLW5nIDwgMC43Ljc6IGl0IGxlYWtzIGEgZmQsIHdoaWNoIGlzbid0CisgICAqIGNsb3NlLW9uLWV4ZWMuIEFzc3VtZSBpdCB3aWxsIGJlIG9uZSBvZiB0aGUgZmlyc3QgZmV3IGZkcy4gKi8KKyAgZm9yIChpID0gMzsgaSA8IDQyOyBpKyspCisgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGkpOworCisgIGlmICghY2FwbmdfaGF2ZV9jYXBhYmlsaXR5IChDQVBOR19FRkZFQ1RJVkUsIENBUF9BVURJVF9XUklURSkpCisgICAgcmV0dXJuOworCisgIGF1ZGl0X2ZkID0gYXVkaXRfb3BlbiAoKTsKKworICBpZiAoYXVkaXRfZmQgPCAwKQorICAgIHsKKyAgICAgIGludCBlID0gZXJybm87CisKKyAgICAgIC8qIElmIGtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgYXVkaXQsIGJhaWwgb3V0ICovCisgICAgICBpZiAoZSA9PSBFSU5WQUwgfHwgZSA9PSBFUFJPVE9OT1NVUFBPUlQgfHwgZSA9PSBFQUZOT1NVUFBPUlQpCisgICAgICAgIHJldHVybjsKKworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIGF1ZGl0IHN1YnN5c3RlbTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZSkpOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0xJQkFVRElUICovCit9CisKKy8qKgorICogSWYgbGliYXVkaXQgaXMgaW4gdXNlIGFuZCBpdCB3b3VsZCBiZSBhcHByb3ByaWF0ZSB0byB3cml0ZSBhdWRpdCByZWNvcmRzLAorICogcmV0dXJuIHRoZSBsaWJhdWRpdCBmZC4gT3RoZXJ3aXNlIHJldHVybiAtMS4KKyAqLworaW50CitidXNfYXVkaXRfZ2V0X2ZkICh2b2lkKQoreworI2lmZGVmIEhBVkVfTElCQVVESVQKKyAgaWYgKGF1ZGl0X2ZkID49IDApCisgIHsKKyAgICByZXR1cm4gYXVkaXRfZmQ7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBDbG9zZSB0aGUgbGliYXVkaXQgZmQuCisgKi8KK3ZvaWQKK2J1c19hdWRpdF9zaHV0ZG93biAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGF1ZGl0X2Nsb3NlIChhdWRpdF9mZCk7CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworfQorCisvKiBUaGUgIUhBVkVfTElCQVVESVQgY2FzZSBsaXZlcyBpbiBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKi8KKyNpZmRlZiBIQVZFX0xJQkFVRElUCisvKioKKyAqIENoYW5nZXMgdGhlIHVzZXIgYW5kIGdyb3VwIHRoZSBidXMgaXMgcnVubmluZyBhcy4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlciB0byBiZWNvbWUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlciAgKGNvbnN0IGNoYXIgICAgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfZ2lkX3QgZ2lkOworICBEQnVzU3RyaW5nIHU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCB1c2VyKTsKKworICBpZiAoIV9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwICgmdSwgJnVpZCwgJmdpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVXNlciAnJXMnIGRvZXMgbm90IGFwcGVhciB0byBleGlzdD8iLAorICAgICAgICAgICAgICAgICAgICAgIHVzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBJZiB3ZSB3ZXJlIHJvb3QgKi8KKyAgaWYgKF9kYnVzX2dldGV1aWQgKCkgPT0gMCkKKyAgICB7CisgICAgICBpbnQgcmM7CisgICAgICBpbnQgaGF2ZV9hdWRpdF93cml0ZTsKKworICAgICAgaGF2ZV9hdWRpdF93cml0ZSA9IGNhcG5nX2hhdmVfY2FwYWJpbGl0eSAoQ0FQTkdfUEVSTUlUVEVELCBDQVBfQVVESVRfV1JJVEUpOworICAgICAgY2FwbmdfY2xlYXIgKENBUE5HX1NFTEVDVF9CT1RIKTsKKyAgICAgIC8qIE9ubHkgYXR0ZW1wdCB0byByZXRhaW4gQ0FQX0FVRElUX1dSSVRFIGlmIHdlIGhhZCBpdCB3aGVuCisgICAgICAgKiBzdGFydGluZy4gIFNlZToKKyAgICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MDYyI2M5CisgICAgICAgKi8KKyAgICAgIGlmIChoYXZlX2F1ZGl0X3dyaXRlKQorICAgICAgICBjYXBuZ191cGRhdGUgKENBUE5HX0FERCwgQ0FQTkdfRUZGRUNUSVZFIHwgQ0FQTkdfUEVSTUlUVEVELAorICAgICAgICAgICAgICAgICAgICAgIENBUF9BVURJVF9XUklURSk7CisgICAgICByYyA9IGNhcG5nX2NoYW5nZV9pZCAodWlkLCBnaWQsIENBUE5HX0RST1BfU1VQUF9HUlApOworICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZHJvcCBjYXBhYmlsaXRpZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtNDoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBHSUQgdG8gJWx1OiAlcyIsIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTU6CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTY6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVUlEIHRvICVsdTogJXMiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIC03OgorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gdW5zZXQga2VlcC1jYXBhYmlsaXRpZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzL2F1ZGl0LmggYi9idXMvYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTcwMTZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2F1ZGl0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotCisgKiBhdWRpdC5oIC0gbGliYXVkaXQgaW50ZWdyYXRpb24gZm9yIFNFTGludXggYW5kIEFwcEFybW9yCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0FVRElUX0gKKyNkZWZpbmUgQlVTX0FVRElUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSAiYnVzLmgiCisKK3ZvaWQgYnVzX2F1ZGl0X2luaXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpOworaW50IGJ1c19hdWRpdF9nZXRfZmQgKHZvaWQpOwordm9pZCBidXNfYXVkaXRfc2h1dGRvd24gKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1cy9idXMuYyBiL2J1cy9idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhhZTNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2J1cy5jCkBAIC0wLDAgKzEsMTgxMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBidXMuYyAgbWVzc2FnZSBidXMgY29udGV4dCBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImJ1cy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSAiYXVkaXQuaCIKKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKKyNpZmRlZiBEQlVTX0NZR1dJTgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3N0cnVjdCBCdXNDb250ZXh0Cit7CisgIGludCByZWZjb3VudDsKKyAgREJ1c0dVSUQgdXVpZDsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIGNoYXIgKnR5cGU7CisgIGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKmFkZHJlc3M7CisgIGNoYXIgKnBpZGZpbGU7CisgIGNoYXIgKnVzZXI7CisgIGNoYXIgKmxvZ19wcmVmaXg7CisgIERCdXNMb29wICpsb29wOworICBEQnVzTGlzdCAqc2VydmVyczsKKyAgQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zOworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIEJ1c1BvbGljeSAqcG9saWN5OworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBCdXNMaW1pdHMgbGltaXRzOworICBEQnVzUkxpbWl0ICppbml0aWFsX2ZkX2xpbWl0OworICB1bnNpZ25lZCBpbnQgZm9yayA6IDE7CisgIHVuc2lnbmVkIGludCBzeXNsb2cgOiAxOworICB1bnNpZ25lZCBpbnQga2VlcF91bWFzayA6IDE7CisgIHVuc2lnbmVkIGludCBhbGxvd19hbm9ueW1vdXMgOiAxOworICB1bnNpZ25lZCBpbnQgc3lzdGVtZF9hY3RpdmF0aW9uIDogMTsKKyAgZGJ1c19ib29sX3Qgd2F0Y2hlc19lbmFibGVkOworfTsKKworc3RhdGljIGRidXNfaW50MzJfdCBzZXJ2ZXJfZGF0YV9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7Cit9IEJ1c1NlcnZlckRhdGE7CisKKyNkZWZpbmUgQlVTX1NFUlZFUl9EQVRBKHNlcnZlcikgKGRidXNfc2VydmVyX2dldF9kYXRhICgoc2VydmVyKSwgc2VydmVyX2RhdGFfc2xvdCkpCisKK3N0YXRpYyBCdXNDb250ZXh0Kgorc2VydmVyX2dldF9jb250ZXh0IChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIEJ1c1NlcnZlckRhdGEgKmJkOworCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYmQgPSBCVVNfU0VSVkVSX0RBVEEgKHNlcnZlcik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY29udGV4dCA9IGJkLT5jb250ZXh0OworCisgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgY29udGV4dCA9IHNlcnZlcl9nZXRfY29udGV4dCAoc2VydmVyKTsKKworICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjb250ZXh0LT5sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoY29udGV4dC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubmVjdGlvbl9jYWxsYmFjayAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQgPSBkYXRhOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24gKGNvbnRleHQtPmNvbm5lY3Rpb25zLCBuZXdfY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBzZXR1cCBuZXcgY29ubmVjdGlvblxuIik7CisKKyAgICAgIC8qIGlmIHdlIGRvbid0IGRvIHRoaXMsIGl0IHdpbGwgZ2V0IHVucmVmJ2Qgd2l0aG91dAorICAgICAgICogYmVpbmcgZGlzY29ubmVjdGVkLi4uIGtpbmQgb2Ygc3RyYW5nZSByZWFsbHkKKyAgICAgICAqIHRoYXQgd2UgaGF2ZSB0byBkbyB0aGlzLCBwZW9wbGUgd29uJ3QgZ2V0IGl0IHJpZ2h0CisgICAgICAgKiBpbiBnZW5lcmFsLgorICAgICAgICovCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKG5ld19jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9tZXNzYWdlX3NpemUpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChuZXdfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9pbmNvbWluZ191bml4X2Zkcyk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGltaXRzLm1heF9tZXNzYWdlX3VuaXhfZmRzKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5hbGxvd19hbm9ueW1vdXMpOworCisgIC8qIG9uIE9PTSwgd2Ugd29uJ3QgaGF2ZSByZWYnZCB0aGUgY29ubmVjdGlvbiBzbyBpdCB3aWxsIGRpZS4gKi8KK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc2VydmVyX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1NlcnZlckRhdGEgKmJkID0gZGF0YTsKKworICBkYnVzX2ZyZWUgKGJkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXR1cF9zZXJ2ZXIgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgY2hhciAgICAgICoqYXV0aF9tZWNoYW5pc21zLAorICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzU2VydmVyRGF0YSAqYmQ7CisKKyAgYmQgPSBkYnVzX25ldzAgKEJ1c1NlcnZlckRhdGEsIDEpOworICBpZiAoYmQgPT0gTlVMTCB8fCAhZGJ1c19zZXJ2ZXJfc2V0X2RhdGEgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkLCBmcmVlX3NlcnZlcl9kYXRhKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGJkKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJkLT5jb250ZXh0ID0gY29udGV4dDsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMgKHNlcnZlciwgKGNvbnN0IGNoYXIqKikgYXV0aF9tZWNoYW5pc21zKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29ubmVjdGlvbl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBOVUxMKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIsIE5VTEwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUaGlzIGNvZGUgb25seSBnZXRzIGV4ZWN1dGVkIHRoZSBmaXJzdCB0aW1lIHRoZQorICogY29uZmlnIGZpbGVzIGFyZSBwYXJzZWQuICBJdCBpcyBub3QgZXhlY3V0ZWQKKyAqIHdoZW4gY29uZmlnIGZpbGVzIGFyZSByZWxvYWRlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisJCQkJQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb250ZXh0RmxhZ3MgICBmbGFncywKKwkJCQlEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBsb2dfcHJlZml4OworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0xpc3QgKiphZGRyZXNzZXM7CisgIGNvbnN0IGNoYXIgKnVzZXIsICpwaWRmaWxlOworICBjaGFyICoqYXV0aF9tZWNoYW5pc21zOworICBEQnVzTGlzdCAqKmF1dGhfbWVjaGFuaXNtc19saXN0OworICBpbnQgbGVuOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGF1dGhfbWVjaGFuaXNtcyA9IE5VTEw7CisgIHBpZGZpbGUgPSBOVUxMOworCisgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoVFJVRSk7CisKKyAgaWYgKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19TWVNURU1EX0FDVElWQVRJT04pCisgICAgY29udGV4dC0+c3lzdGVtZF9hY3RpdmF0aW9uID0gVFJVRTsKKyAgZWxzZQorICAgIGNvbnRleHQtPnN5c3RlbWRfYWN0aXZhdGlvbiA9IEZBTFNFOworCisgIC8qIENoZWNrIGZvciBhbiBleGlzdGluZyBwaWQgZmlsZS4gT2YgY291cnNlIHRoaXMgaXMgYSByYWNlOworICAgKiB3ZSdkIGhhdmUgdG8gdXNlIGZjbnRsKCkgbG9ja3Mgb24gdGhlIHBpZCBmaWxlIHRvCisgICAqIGF2b2lkIHRoYXQuIEJ1dCB3ZSB3YW50IHRvIGNoZWNrIGZvciB0aGUgcGlkIGZpbGUKKyAgICogYmVmb3JlIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBzb2NrZXRzLCBldGMuCisgICAqLworCisgIGlmIChmbGFncyAmIEJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEUpCisgICAgcGlkZmlsZSA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9waWRmaWxlIChwYXJzZXIpOworCisgIGlmIChwaWRmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyB1OworICAgICAgREJ1c1N0YXQgc3RidWY7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgcGlkZmlsZSk7CisKKyAgICAgIGlmIChfZGJ1c19zdGF0ICgmdSwgJnN0YnVmLCBOVUxMKSkKKyAgICAgICAgeworI2lmZGVmIERCVVNfQ1lHV0lOCisgICAgICAgICAgREJ1c1N0cmluZyBwOworICAgICAgICAgIGxvbmcgLyogaW50ICovIHBpZDsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0ICgmcCk7CisgICAgICAgICAgX2RidXNfZmlsZV9nZXRfY29udGVudHMoJnAsICZ1LCBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfcGFyc2VfaW50KCZwLCAwLCAmcGlkLCBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmcCk7CisKKyAgICAgICAgICBpZiAoKGtpbGwoKGludClwaWQsIDApKSkgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IoTlVMTCwgREJVU19FUlJPUl9GSUxFX0VYSVNUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWQgJWxkIG5vdCBydW5uaW5nLCByZW1vdmluZyBzdGFsZSBwaWQgZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgICAgICBfZGJ1c19kZWxldGVfZmlsZSgmdSwgTlVMTCk7CisgICAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisJCSAgICAgICAgICAgICAgICAgICJUaGUgcGlkIGZpbGUgXCIlc1wiIGV4aXN0cywgaWYgdGhlIG1lc3NhZ2UgYnVzIGlzIG5vdCBydW5uaW5nLCByZW1vdmUgdGhpcyBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkZmlsZSk7CisJICAgICAgZ290byBmYWlsZWQ7CisjaWZkZWYgREJVU19DWUdXSU4KKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAvKiBrZWVwIGFyb3VuZCB0aGUgcGlkIGZpbGVuYW1lIHNvIHdlIGNhbiBkZWxldGUgaXQgbGF0ZXIgKi8KKyAgY29udGV4dC0+cGlkZmlsZSA9IF9kYnVzX3N0cmR1cCAocGlkZmlsZSk7CisKKyAgLyogbm90ZSB0aGF0IHR5cGUgbWF5IGJlIE5VTEwgKi8KKyAgY29udGV4dC0+dHlwZSA9IF9kYnVzX3N0cmR1cCAoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKHBhcnNlcikpOworICBpZiAoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKHBhcnNlcikgIT0gTlVMTCAmJiBjb250ZXh0LT50eXBlID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgdXNlciA9IGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChwYXJzZXIpOworICBpZiAodXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnRleHQtPnVzZXIgPSBfZGJ1c19zdHJkdXAgKHVzZXIpOworICAgICAgaWYgKGNvbnRleHQtPnVzZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIC8qIFNldCB1cCB0aGUgcHJlZml4IGZvciBzeXNsb2cgbWVzc2FnZXMgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxvZ19wcmVmaXgpKQorICAgIGdvdG8gb29tOworICBpZiAoY29udGV4dC0+dHlwZSAmJiAhc3RyY21wIChjb250ZXh0LT50eXBlLCAic3lzdGVtIikpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbG9nX3ByZWZpeCwgIltzeXN0ZW1dICIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UgaWYgKGNvbnRleHQtPnR5cGUgJiYgIXN0cmNtcCAoY29udGV4dC0+dHlwZSwgInNlc3Npb24iKSkKKyAgICB7CisgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzOworCisgICAgICBjcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAoKTsKKyAgICAgIGlmICghY3JlZGVudGlhbHMpCisgICAgICAgIGdvdG8gb29tOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbG9nX3ByZWZpeCwgIltzZXNzaW9uICIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc190b19zdHJpbmdfYXBwZW5kIChjcmVkZW50aWFscywgJmxvZ19wcmVmaXgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbG9nX3ByZWZpeCwgIl0gIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmxvZ19wcmVmaXgsICZjb250ZXh0LT5sb2dfcHJlZml4KSkKKyAgICBnb3RvIG9vbTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsb2dfcHJlZml4KTsKKworICAvKiBCdWlsZCBhbiBhcnJheSBvZiBhdXRoIG1lY2hhbmlzbXMgKi8KKworICBhdXRoX21lY2hhbmlzbXNfbGlzdCA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zIChwYXJzZXIpOworICBsZW4gPSBfZGJ1c19saXN0X2dldF9sZW5ndGggKGF1dGhfbWVjaGFuaXNtc19saXN0KTsKKworICBpZiAobGVuID4gMCkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgYXV0aF9tZWNoYW5pc21zID0gZGJ1c19uZXcwIChjaGFyKiwgbGVuICsgMSk7CisgICAgICBpZiAoYXV0aF9tZWNoYW5pc21zID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpID0gMDsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChhdXRoX21lY2hhbmlzbXNfbGlzdCk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgYXV0aF9tZWNoYW5pc21zW2ldID0gX2RidXNfc3RyZHVwIChsaW5rLT5kYXRhKTsKKyAgICAgICAgICBpZiAoYXV0aF9tZWNoYW5pc21zW2ldID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChhdXRoX21lY2hhbmlzbXNfbGlzdCwgbGluayk7CisgICAgICAgICAgaSArPSAxOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXV0aF9tZWNoYW5pc21zID0gTlVMTDsKKyAgICB9CisKKyAgLyogTGlzdGVuIG9uIG91ciBhZGRyZXNzZXMgKi8KKworICBpZiAoYWRkcmVzcykKKyAgICB7CisgICAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisKKyAgICAgIHNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKGFkZHJlc3MpLCBlcnJvcik7CisgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzZXR1cF9zZXJ2ZXIgKGNvbnRleHQsIHNlcnZlciwgYXV0aF9tZWNoYW5pc21zLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNvbnRleHQtPnNlcnZlcnMsIHNlcnZlcikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFkZHJlc3NlcyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9hZGRyZXNzZXMgKHBhcnNlcik7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChhZGRyZXNzZXMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKworICAgICAgICAgIHNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGluay0+ZGF0YSwgZXJyb3IpOworICAgICAgICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICghc2V0dXBfc2VydmVyIChjb250ZXh0LCBzZXJ2ZXIsIGF1dGhfbWVjaGFuaXNtcywgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNvbnRleHQtPnNlcnZlcnMsIHNlcnZlcikpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGFkZHJlc3NlcywgbGluayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgY29udGV4dC0+Zm9yayA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9mb3JrIChwYXJzZXIpOworICBjb250ZXh0LT5zeXNsb2cgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfc3lzbG9nIChwYXJzZXIpOworICBjb250ZXh0LT5rZWVwX3VtYXNrID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2tlZXBfdW1hc2sgKHBhcnNlcik7CisgIGNvbnRleHQtPmFsbG93X2Fub255bW91cyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9hbGxvd19hbm9ueW1vdXMgKHBhcnNlcik7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGF1dGhfbWVjaGFuaXNtcyk7CisgIHJldHVybiByZXR2YWw7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGF1dGhfbWVjaGFuaXNtcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogVGhpcyBjb2RlIGdldHMgZXhlY3V0ZWQgZXZlcnkgdGltZSB0aGUgY29uZmlnIGZpbGVzCisgKiBhcmUgcGFyc2VkOiBib3RoIGR1cmluZyBCdXNDb250ZXh0IGNvbnN0cnVjdGlvbgorICogYW5kIG9uIHJlbG9hZHMuIFRoaXMgZnVuY3Rpb24gaXMgc2xpZ2h0bHkgc2NyZXd5CisgKiBzaW5jZSBpdCBjYW4gZG8gYSAiaGFsZiByZWxvYWQiIGluIG91dC1vZi1tZW1vcnkKKyAqIHNpdHVhdGlvbnMuIFJlYWxpc3RpY2FsbHksIHVubGlrZWx5IHRvIGV2ZXIgbWF0dGVyLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKwkJCSAgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorCQkJICAgZGJ1c19ib29sX3QgICAgICBpc19yZWxvYWQsCisJCQkgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGZ1bGxfYWRkcmVzczsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICoqZGlyczsKKyAgY2hhciAqYWRkcjsKKyAgY29uc3QgY2hhciAqc2VydmljZWhlbHBlcjsKKyAgY2hhciAqczsKKworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgYWRkciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX2FkZHJlc3MpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGdldCBvdXIgbGltaXRzIGFuZCB0aW1lb3V0IGxlbmd0aHMgKi8KKyAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2xpbWl0cyAocGFyc2VyLCAmY29udGV4dC0+bGltaXRzKTsKKworICBpZiAoY29udGV4dC0+cG9saWN5KQorICAgIGJ1c19wb2xpY3lfdW5yZWYgKGNvbnRleHQtPnBvbGljeSk7CisgIGNvbnRleHQtPnBvbGljeSA9IGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3BvbGljeSAocGFyc2VyKTsKKyAgX2RidXNfYXNzZXJ0IChjb250ZXh0LT5wb2xpY3kgIT0gTlVMTCk7CisKKyAgLyogY29udGV4dC0+Y29ubmVjdGlvbnMgaXMgTlVMTCB3aGVuIGNyZWF0aW5nIG5ldyBCdXNDb250ZXh0ICovCisgIGlmIChjb250ZXh0LT5jb25uZWN0aW9ucykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiUmVsb2FkIHBvbGljeSBydWxlcyBmb3IgY29tcGxldGVkIGNvbm5lY3Rpb25zXG4iKTsKKyAgICAgIHJldHZhbCA9IGJ1c19jb25uZWN0aW9uc19yZWxvYWRfcG9saWN5IChjb250ZXh0LT5jb25uZWN0aW9ucywgZXJyb3IpOworICAgICAgaWYgKCFyZXR2YWwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogV2UgaGF2ZSB0byBidWlsZCB0aGUgYWRkcmVzcyBiYWNrd2FyZCwgc28gdGhhdAorICAgKiA8bGlzdGVuPiBsYXRlciBpbiB0aGUgY29uZmlnIGZpbGUgaGF2ZSBwcmlvcml0eQorICAgKi8KKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAobGluay0+ZGF0YSk7CisgICAgICBpZiAoYWRkciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZmdWxsX2FkZHJlc3MpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfYWRkcmVzcywgIjsiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9hZGRyZXNzLCBhZGRyKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChhZGRyKTsKKyAgICAgIGFkZHIgPSBOVUxMOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmY29udGV4dC0+c2VydmVycywgbGluayk7CisgICAgfQorCisgIGlmIChpc19yZWxvYWQpCisgICAgZGJ1c19mcmVlIChjb250ZXh0LT5hZGRyZXNzKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKCZmdWxsX2FkZHJlc3MsICZjb250ZXh0LT5hZGRyZXNzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIGdldCB0aGUgc2VydmljZSBkaXJlY3RvcmllcyAqLworICBkaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKTsKKworICAvKiBhbmQgdGhlIHNlcnZpY2UgaGVscGVyICovCisgIHNlcnZpY2VoZWxwZXIgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZWhlbHBlciAocGFyc2VyKTsKKworICBzID0gX2RidXNfc3RyZHVwKHNlcnZpY2VoZWxwZXIpOworICBpZiAocyA9PSBOVUxMICYmIHNlcnZpY2VoZWxwZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlKGNvbnRleHQtPnNlcnZpY2VoZWxwZXIpOworICAgICAgY29udGV4dC0+c2VydmljZWhlbHBlciA9IHM7CisgICAgfQorCisgIC8qIENyZWF0ZSBhY3RpdmF0aW9uIHN1YnN5c3RlbSAqLworICBpZiAoY29udGV4dC0+YWN0aXZhdGlvbikKKyAgICB7CisgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3JlbG9hZCAoY29udGV4dC0+YWN0aXZhdGlvbiwgJmZ1bGxfYWRkcmVzcywgZGlycywgZXJyb3IpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjb250ZXh0LT5hY3RpdmF0aW9uID0gYnVzX2FjdGl2YXRpb25fbmV3IChjb250ZXh0LCAmZnVsbF9hZGRyZXNzLCBkaXJzLCBlcnJvcik7CisgICAgfQorCisgIGlmIChjb250ZXh0LT5hY3RpdmF0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfYWRkcmVzcyk7CisKKyAgaWYgKGFkZHIpCisgICAgZGJ1c19mcmVlIChhZGRyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RfY29uY2F0X25ldyAoREJ1c0xpc3QgKiphLAorICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKmIsCisgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqcmVzdWx0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICAqcmVzdWx0ID0gTlVMTDsKKworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChhKTsgbGluazsgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoYSwgbGluaykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmVzdWx0LCBsaW5rLT5kYXRhKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChiKTsgbGluazsgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoYiwgbGluaykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmVzdWx0LCBsaW5rLT5kYXRhKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIHJldHVybiBUUlVFOworb29tOgorICBfZGJ1c19saXN0X2NsZWFyIChyZXN1bHQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCityYWlzZV9maWxlX2Rlc2NyaXB0b3JfbGltaXQgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCkKK3sKKyNpZmRlZiBEQlVTX1VOSVgKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIC8qIHdlIG9ubHkgZG8gdGhpcyBvbmNlICovCisgIGlmIChjb250ZXh0LT5pbml0aWFsX2ZkX2xpbWl0ICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIGNvbnRleHQtPmluaXRpYWxfZmRfbGltaXQgPSBfZGJ1c19ybGltaXRfc2F2ZV9mZF9saW1pdCAoJmVycm9yKTsKKworICBpZiAoY29udGV4dC0+aW5pdGlhbF9mZF9saW1pdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMiLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogV2UgdXNlZCB0byBjb21wdXRlIGEgc3VpdGFibGUgcmxpbWl0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIG51bWJlcgorICAgKiBvZiBjb25uZWN0aW9ucywgYnV0IHRoYXQgYnJlYWtzIGRvd24gYXMgc29vbiBhcyB3ZSBhbGxvdyBmZC1wYXNzaW5nLAorICAgKiBiZWNhdXNlIGVhY2ggY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvIHBhc3MgNjQgZmRzIHRvIHVzLCBhbmQgaWYKKyAgICogdGhleSBhbGwgZGlkLCB3ZSdkIGhpdCBrZXJuZWwgbGltaXRzLiBXZSBub3cgaGFyZC1jb2RlIDY0ayBhcyBhCisgICAqIGdvb2QgbGltaXQsIGxpa2Ugc3lzdGVtZCBkb2VzOiB0aGF0J3MgZW5vdWdoIHRvIGF2b2lkIERvUyBmcm9tCisgICAqIGFueXRoaW5nIHNob3J0IG9mIG11bHRpcGxlIHVpZHMgY29uc3BpcmluZyBhZ2FpbnN0IHVzLgorICAgKi8KKyAgaWYgKCFfZGJ1c19ybGltaXRfcmFpc2VfZmRfbGltaXRfaWZfcHJpdmlsZWdlZCAoNjU1MzYsICZlcnJvcikpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfY29uZmlnX3Bvc3Rpbml0IChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisJCQkgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9jb250ZXh0X3RhYmxlOworICBEQnVzTGlzdCAqd2F0Y2hlZF9kaXJzID0gTlVMTDsKKworICByYWlzZV9maWxlX2Rlc2NyaXB0b3JfbGltaXQgKGNvbnRleHQpOworCisgIHNlcnZpY2VfY29udGV4dF90YWJsZSA9IGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAocGFyc2VyKTsKKyAgaWYgKCFidXNfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29udGV4dF90YWJsZSAoY29udGV4dC0+cmVnaXN0cnksCisJCQkJCSAgICAgICBzZXJ2aWNlX2NvbnRleHRfdGFibGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNlcnZpY2VfY29udGV4dF90YWJsZSk7CisKKyAgLyogV2UgbmVlZCB0byBtb25pdG9yIGJvdGggdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgYW5kIGRpcmVjdG9yaWVzCisgICAqIGNvbnRhaW5pbmcgLnNlcnZpY2UgZmlsZXMuCisgICAqLworICBpZiAoIWxpc3RfY29uY2F0X25ldyAoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyAocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlciksCisgICAgICAgICAgICAgICAgICAgICAgICAmd2F0Y2hlZF9kaXJzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfc2V0X3dhdGNoZWRfZGlycyAoY29udGV4dCwgJndhdGNoZWRfZGlycyk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJndhdGNoZWRfZGlycyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c0NvbnRleHQqCitidXNfY29udGV4dF9uZXcgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICBCdXNDb250ZXh0RmxhZ3MgICBmbGFncywKKyAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfYWRkcl9waXBlLAorICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworCisgIF9kYnVzX2Fzc2VydCAoKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19GT1JLX0FMV0FZUykgPT0gMCk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgY29udGV4dCA9IE5VTEw7CisgIHBhcnNlciA9IE5VTEw7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbnRleHQgPSBkYnVzX25ldzAgKEJ1c0NvbnRleHQsIDEpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGNvbnRleHQtPnJlZmNvdW50ID0gMTsKKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3V1aWQgKCZjb250ZXh0LT51dWlkLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb25maWdfZmlsZSwgJmNvbnRleHQtPmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGNvbnRleHQtPmxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGNvbnRleHQtPmxvb3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGNvbnRleHQtPndhdGNoZXNfZW5hYmxlZCA9IFRSVUU7CisKKyAgY29udGV4dC0+cmVnaXN0cnkgPSBidXNfcmVnaXN0cnlfbmV3IChjb250ZXh0KTsKKyAgaWYgKGNvbnRleHQtPnJlZ2lzdHJ5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKGNvbmZpZ19maWxlLCBUUlVFLCBOVUxMLCBlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkgKGNvbnRleHQsIHBhcnNlciwgYWRkcmVzcywgZmxhZ3MsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghcHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSAoY29udGV4dCwgcGFyc2VyLCBGQUxTRSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiB3ZSBuZWVkIGFub3RoZXIgcmVmIG9mIHRoZSBzZXJ2ZXIgZGF0YSBzbG90IGZvciB0aGUgY29udGV4dAorICAgKiB0byBvd24KKyAgICovCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2Vjb25kIHJlZiBvZiBzZXJ2ZXIgZGF0YSBzbG90IGZhaWxlZCIpOworCisgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHByaW50X2FkZHJfcGlwZSBpcworICAgKiBvbmUgb2YgdGhlIHNvY2tldHMgd2UncmUgdXNpbmcgdG8gbGlzdGVuIG9uLCBvciBzb21lCisgICAqIG90aGVyIHJhbmRvbSB0aGluZy4gQnV0IEkgdGhpbmsgdGhlIGFuc3dlciBpcyAiZG9uJ3QgZG8KKyAgICogdGhhdCB0aGVuIgorICAgKi8KKyAgaWYgKHByaW50X2FkZHJfcGlwZSAhPSBOVUxMICYmIF9kYnVzX3BpcGVfaXNfdmFsaWQgKHByaW50X2FkZHJfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBhZGRyOworICAgICAgY29uc3QgY2hhciAqYSA9IGJ1c19jb250ZXh0X2dldF9hZGRyZXNzIChjb250ZXh0KTsKKyAgICAgIGludCBieXRlczsKKworICAgICAgX2RidXNfYXNzZXJ0IChhICE9IE5VTEwpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHIpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyLCBhKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkciwgIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHIpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmFkZHIpOworICAgICAgaWYgKF9kYnVzX3BpcGVfd3JpdGUgKHByaW50X2FkZHJfcGlwZSwgJmFkZHIsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBwaXBlIHdyaXRlIHJldHVybnMgYW4gZXJyb3Igb24gZmFpbHVyZSBidXQgbm90IHNob3J0IHdyaXRlICovCisgICAgICAgICAgaWYgKGVycm9yICE9IE5VTEwgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgbWVzc2FnZSBidXMgYWRkcmVzczogZGlkIG5vdCB3cml0ZSBhbGwgYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKHByaW50X2FkZHJfcGlwZSkpCisgICAgICAgIF9kYnVzX3BpcGVfY2xvc2UgKHByaW50X2FkZHJfcGlwZSwgTlVMTCk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgfQorCisgIGNvbnRleHQtPmNvbm5lY3Rpb25zID0gYnVzX2Nvbm5lY3Rpb25zX25ldyAoY29udGV4dCk7CisgIGlmIChjb250ZXh0LT5jb25uZWN0aW9ucyA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+bWF0Y2htYWtlciA9IGJ1c19tYXRjaG1ha2VyX25ldyAoKTsKKyAgaWYgKGNvbnRleHQtPm1hdGNobWFrZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIGNoZWNrIHVzZXIgYmVmb3JlIHdlIGZvcmsgKi8KKyAgaWYgKGNvbnRleHQtPnVzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlciAoY29udGV4dC0+dXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBVSUQgYW5kIEdJRCBmb3IgdXNlcm5hbWUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+dXNlcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IGJlY29tZSBhIGRhZW1vbiBpZiBhcHByb3ByaWF0ZSBhbmQgd3JpdGUgb3V0IHBpZCBmaWxlIGluIGFueSBjYXNlICovCisgIHsKKyAgICBEQnVzU3RyaW5nIHU7CisKKyAgICBpZiAoY29udGV4dC0+cGlkZmlsZSkKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgY29udGV4dC0+cGlkZmlsZSk7CisKKyAgICBpZiAoKChmbGFncyAmIEJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUikgPT0gMCAmJiBjb250ZXh0LT5mb3JrKSB8fAorICAgICAgICAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvcmtpbmcgYW5kIGJlY29taW5nIGRhZW1vblxuIik7CisKKyAgICAgICAgaWYgKCFfZGJ1c19iZWNvbWVfZGFlbW9uIChjb250ZXh0LT5waWRmaWxlID8gJnUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmtlZXBfdW1hc2spKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGb3JrIG5vdCByZXF1ZXN0ZWRcbiIpOworCisgICAgICAgIC8qIE5lZWQgdG8gd3JpdGUgUElEIGZpbGUgYW5kIHRvIFBJRCBwaXBlIGZvciBvdXJzZWx2ZXMsCisgICAgICAgICAqIG5vdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuIFRoaXMgaXMgYSBuby1vcCBpZiB0aGUgcGlkZmlsZQorICAgICAgICAgKiBpcyBOVUxMIGFuZCBwcmludF9waWRfcGlwZSBpcyBOVUxMLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSAoY29udGV4dC0+cGlkZmlsZSA/ICZ1IDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2dldHBpZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIGlmIChwcmludF9waWRfcGlwZSAmJiBfZGJ1c19waXBlX2lzX3ZhbGlkIChwcmludF9waWRfcGlwZSkgJiYKKyAgICAgICFfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKHByaW50X3BpZF9waXBlKSkKKyAgICBfZGJ1c19waXBlX2Nsb3NlIChwcmludF9waWRfcGlwZSwgTlVMTCk7CisKKyAgaWYgKCFidXNfc2VsaW51eF9mdWxsX2luaXQgKCkpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfRkFUQUwsICJTRUxpbnV4IGVuYWJsZWQgYnV0IEQtQnVzIGluaXRpYWxpemF0aW9uIGZhaWxlZDsgY2hlY2sgc3lzdGVtIGxvZ1xuIik7CisgICAgfQorCisgIGlmICghYnVzX2FwcGFybW9yX2Z1bGxfaW5pdCAoZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYnVzX2FwcGFybW9yX2VuYWJsZWQgKCkpCisgICAgeworICAgICAgLyogT25seSBwcmludCBBcHBBcm1vciBtZWRpYXRpb24gbWVzc2FnZSB3aGVuIHN5c2xvZyBzdXBwb3J0IGlzIGVuYWJsZWQgKi8KKyAgICAgIGlmIChjb250ZXh0LT5zeXNsb2cpCisgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcEFybW9yIEQtQnVzIG1lZGlhdGlvbiBpcyBlbmFibGVkXG4iKTsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdCAoY29udGV4dCwgcGFyc2VyLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgICAgIHBhcnNlciA9IE5VTEw7CisgICAgfQorCisgIC8qIEhlcmUgd2UgY2hhbmdlIG91ciBjcmVkZW50aWFscyBpZiByZXF1aXJlZCwKKyAgICogYXMgc29vbiBhcyB3ZSd2ZSBzZXQgdXAgb3VyIHNvY2tldHMgYW5kIHBpZGZpbGUKKyAgICovCisgIGlmIChjb250ZXh0LT51c2VyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnRleHQtPnVzZXIsIGVycm9yKSkKKwl7CisJICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisJICBnb3RvIGZhaWxlZDsKKwl9CisgICAgfQorCisgIGJ1c19hdWRpdF9pbml0IChjb250ZXh0KTsKKworICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworCisgIHJldHVybiBjb250ZXh0OworCisgZmFpbGVkOgorICBpZiAocGFyc2VyICE9IE5VTEwpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIGlmIChjb250ZXh0ICE9IE5VTEwpCisgICAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIGlmIChzZXJ2ZXJfZGF0YV9zbG90ID49IDApCisgICAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKworICByZXR1cm4gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2dldF9pZCAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdXVpZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3V1aWRfZW5jb2RlICgmY29udGV4dC0+dXVpZCwgdXVpZCk7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChCdXNDb250ZXh0ICpjb250ZXh0LAorCQkJICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgLyogRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgKi8KKyAgX2RidXNfZmx1c2hfY2FjaGVzICgpOworCisgIHJldCA9IEZBTFNFOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbmZpZ19maWxlLCBjb250ZXh0LT5jb25maWdfZmlsZSk7CisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmNvbmZpZ19maWxlLCBUUlVFLCBOVUxMLCBlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChjb250ZXh0LCBwYXJzZXIsIFRSVUUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghcHJvY2Vzc19jb25maWdfcG9zdGluaXQgKGNvbnRleHQsIHBhcnNlciwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgcmV0ID0gVFJVRTsKKworICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiUmVsb2FkZWQgY29uZmlndXJhdGlvbiIpOworIGZhaWxlZDoKKyAgaWYgKCFyZXQpCisgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIlVuYWJsZSB0byByZWxvYWQgY29uZmlndXJhdGlvbjogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX3NlcnZlciAoQnVzQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAqc2VydmVyKQoreworICBpZiAoc2VydmVyID09IE5VTEwgfHwKKyAgICAgICFkYnVzX3NlcnZlcl9nZXRfaXNfY29ubmVjdGVkIChzZXJ2ZXIpKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB3YXRjaCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoc2VydmVyKTsKK30KKwordm9pZAorYnVzX2NvbnRleHRfc2h1dGRvd24gKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNodXRkb3duX3NlcnZlciAoY29udGV4dCwgbGluay0+ZGF0YSk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzLCBsaW5rKTsKKyAgICB9Cit9CisKK0J1c0NvbnRleHQgKgorYnVzX2NvbnRleHRfcmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X3VucmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGNvbnRleHQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGJ1cyBjb250ZXh0ICVwXG4iLCBjb250ZXh0KTsKKworICAgICAgYnVzX2NvbnRleHRfc2h1dGRvd24gKGNvbnRleHQpOworCisgICAgICBpZiAoY29udGV4dC0+Y29ubmVjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbnNfdW5yZWYgKGNvbnRleHQtPmNvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjb250ZXh0LT5jb25uZWN0aW9ucyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPnJlZ2lzdHJ5KQorICAgICAgICB7CisgICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmIChjb250ZXh0LT5yZWdpc3RyeSk7CisgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnkgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0LT5hY3RpdmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2FjdGl2YXRpb25fdW5yZWYgKGNvbnRleHQtPmFjdGl2YXRpb24pOworICAgICAgICAgIGNvbnRleHQtPmFjdGl2YXRpb24gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGV4dC0+c2VydmVycyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGxpbmstPmRhdGEpOworCisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgICAgICB9CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGV4dC0+c2VydmVycyk7CisKKyAgICAgIGlmIChjb250ZXh0LT5wb2xpY3kpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfcG9saWN5X3VucmVmIChjb250ZXh0LT5wb2xpY3kpOworICAgICAgICAgIGNvbnRleHQtPnBvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPmxvb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19sb29wX3VucmVmIChjb250ZXh0LT5sb29wKTsKKyAgICAgICAgICBjb250ZXh0LT5sb29wID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dC0+bWF0Y2htYWtlcikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChjb250ZXh0LT5tYXRjaG1ha2VyKTsKKyAgICAgICAgICBjb250ZXh0LT5tYXRjaG1ha2VyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPmNvbmZpZ19maWxlKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+bG9nX3ByZWZpeCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnR5cGUpOworICAgICAgZGJ1c19mcmVlIChjb250ZXh0LT5hZGRyZXNzKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+dXNlcik7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnNlcnZpY2VoZWxwZXIpOworCisgICAgICBpZiAoY29udGV4dC0+cGlkZmlsZSkKKwl7CisgICAgICAgICAgREJ1c1N0cmluZyB1OworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgY29udGV4dC0+cGlkZmlsZSk7CisKKyAgICAgICAgICAvKiBEZWxpYmVyYXRlbHkgaWdub3JlIGVycm9ycyBoZXJlLCBzaW5jZSB0aGVyZSdzIG5vdCBtdWNoCisJICAgKiB3ZSBjYW4gZG8gYWJvdXQgaXQsIGFuZCB3ZSdyZSBleGl0aW5nIGFueXdheXMuCisJICAgKi8KKwkgIF9kYnVzX2RlbGV0ZV9maWxlICgmdSwgTlVMTCk7CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnBpZGZpbGUpOworCX0KKworICAgICAgaWYgKGNvbnRleHQtPmluaXRpYWxfZmRfbGltaXQpCisgICAgICAgIF9kYnVzX3JsaW1pdF9mcmVlIChjb250ZXh0LT5pbml0aWFsX2ZkX2xpbWl0KTsKKworICAgICAgZGJ1c19mcmVlIChjb250ZXh0KTsKKworICAgICAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKyAgICB9Cit9CisKKy8qIHR5cGUgbWF5IGJlIE5VTEwgKi8KK2NvbnN0IGNoYXIqCitidXNfY29udGV4dF9nZXRfdHlwZSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnR5cGU7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29udGV4dF9nZXRfYWRkcmVzcyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmFkZHJlc3M7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnNlcnZpY2VoZWxwZXI7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+c3lzdGVtZF9hY3RpdmF0aW9uOworfQorCitCdXNSZWdpc3RyeSoKK2J1c19jb250ZXh0X2dldF9yZWdpc3RyeSAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5yZWdpc3RyeTsKK30KKworQnVzQ29ubmVjdGlvbnMqCitidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+Y29ubmVjdGlvbnM7Cit9CisKK0J1c0FjdGl2YXRpb24qCitidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5hY3RpdmF0aW9uOworfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bWF0Y2htYWtlcjsKK30KKworREJ1c0xvb3AqCitidXNfY29udGV4dF9nZXRfbG9vcCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxvb3A7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgKEJ1c0NvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1aWQpCit7CisgIHJldHVybiBidXNfcG9saWN5X2FsbG93X3VuaXhfdXNlciAoY29udGV4dC0+cG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7Cit9CisKKy8qIEZvciBub3cgdGhpcyBpcyBuZXZlciBhY3R1YWxseSBjYWxsZWQgYmVjYXVzZSB0aGUgZGVmYXVsdAorICogREJ1c0Nvbm5lY3Rpb24gYmVoYXZpb3Igb2YgJ3NhbWUgdXNlciB0aGF0IG93bnMgdGhlIGJ1cyBjYW4gY29ubmVjdCcKKyAqIGlzIGFsbCBpdCB3b3VsZCBkby4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2FsbG93X3dpbmRvd3NfdXNlciAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqd2luZG93c19zaWQpCit7CisgIHJldHVybiBidXNfcG9saWN5X2FsbG93X3dpbmRvd3NfdXNlciAoY29udGV4dC0+cG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Nfc2lkKTsKK30KKworQnVzUG9saWN5ICoKK2J1c19jb250ZXh0X2dldF9wb2xpY3kgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5wb2xpY3k7Cit9CisKK0J1c0NsaWVudFBvbGljeSoKK2J1c19jb250ZXh0X2NyZWF0ZV9jbGllbnRfcG9saWN5IChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSAoY29udGV4dC0+cG9saWN5LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uX3RpbWVvdXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5hY3RpdmF0aW9uX3RpbWVvdXQ7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X2F1dGhfdGltZW91dCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5hdXRoX3RpbWVvdXQ7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X3BlbmRpbmdfZmRfdGltZW91dCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5wZW5kaW5nX2ZkX3RpbWVvdXQ7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9uczsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X2luY29tcGxldGVfY29ubmVjdGlvbnM7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9jb25uZWN0aW9uc19wZXJfdXNlciAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXI7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9wZW5kaW5nX2FjdGl2YXRpb25zIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9wZW5kaW5nX2FjdGl2YXRpb25zOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbjsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfcmVwbHlfdGltZW91dCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5yZXBseV90aW1lb3V0OworfQorCitEQnVzUkxpbWl0ICoKK2J1c19jb250ZXh0X2dldF9pbml0aWFsX2ZkX2xpbWl0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+aW5pdGlhbF9mZF9saW1pdDsKK30KKwordm9pZAorYnVzX2NvbnRleHRfbG9nIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgaWYgKCFjb250ZXh0LT5zeXNsb2cpCisgICAgeworICAgICAgLyogd2UncmUgbm90IHN5c2xvZ2dpbmc7IGp1c3Qgb3V0cHV0IHRvIHN0ZGVyciAqLworICAgICAgdmFfc3RhcnQgKGFyZ3MsIG1zZyk7CisgICAgICB2ZnByaW50ZiAoc3RkZXJyLCBtc2csIGFyZ3MpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIHZhX2VuZCAoYXJncyk7CisKKyAgICAgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgICAgIF9kYnVzX2V4aXQgKDEpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIHZhX3N0YXJ0IChhcmdzLCBtc2cpOworCisgIGlmIChjb250ZXh0LT5sb2dfcHJlZml4KQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9tc2c7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX21zZykpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9tc2csIGNvbnRleHQtPmxvZ19wcmVmaXgpKQorICAgICAgICBnb3RvIG9vbV9vdXQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCAoJmZ1bGxfbXNnLCBtc2csIGFyZ3MpKQorICAgICAgICBnb3RvIG9vbV9vdXQ7CisKKyAgICAgIF9kYnVzX3N5c3RlbV9sb2cgKHNldmVyaXR5LCAiJXMiLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX21zZykpOworICAgIG9vbV9vdXQ6CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfbXNnKTsKKyAgICB9CisgIGVsc2UKKyAgICBfZGJ1c19zeXN0ZW1fbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKK291dDoKKyAgdmFfZW5kIChhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKm1heWJlX251bGwsCisgICAgICAgICBjb25zdCBjaGFyICppZl9udWxsKQoreworICByZXR1cm4gKG1heWJlX251bGwgPyBtYXliZV9udWxsIDogaWZfbnVsbCk7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2xvZ19saXRlcmFsIChCdXNDb250ZXh0ICAgICAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKm1zZykKK3sKKyAgaWYgKCFjb250ZXh0LT5zeXNsb2cpCisgICAgeworICAgICAgZnB1dHMgKG1zZywgc3RkZXJyKTsKKyAgICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOworCisgICAgICBpZiAoc2V2ZXJpdHkgPT0gREJVU19TWVNURU1fTE9HX0ZBVEFMKQorICAgICAgICBfZGJ1c19leGl0ICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChzZXZlcml0eSwgIiVzJXMiLCBub25udWxsIChjb250ZXh0LT5sb2dfcHJlZml4LCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cpOworICAgIH0KK30KKwordm9pZAorYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKEJ1c0NvbnRleHQgICAgICAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgIHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgREJ1c0Vycm9yIHN0YWNrX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIG1zZyk7CisgIF9kYnVzX3NldF9lcnJvcl92YWxpc3QgKCZzdGFja19lcnJvciwgbmFtZSwgbXNnLCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICAvKiBJZiB3ZSBoaXQgT09NIHdoaWxlIHNldHRpbmcgdGhlIGVycm9yLCB0aGlzIHdpbGwgc3lzbG9nICJvdXQgb2YgbWVtb3J5IgorICAgKiB3aGljaCBpcyBpdHNlbGYgYW4gaW5kaWNhdGlvbiB0aGF0IHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcgKi8KKyAgYnVzX2NvbnRleHRfbG9nX2xpdGVyYWwgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrX2Vycm9yLm1lc3NhZ2UpOworCisgIGRidXNfbW92ZV9lcnJvciAoJnN0YWNrX2Vycm9yLCBlcnJvcik7Cit9CisKKy8qCisgKiBMb2cgc29tZXRoaW5nIGFib3V0IGEgbWVzc2FnZSwgdXN1YWxseSB0aGF0IGl0IHdhcyByZWplY3RlZC4KKyAqLworc3RhdGljIHZvaWQKK2NvbXBsYWluX2Fib3V0X21lc3NhZ2UgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqY29tcGxhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG1hdGNoZWRfcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBsb2csCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciBzdGFja19lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgY29uc3QgY2hhciAqc2VuZGVyX25hbWU7CisgIGNvbnN0IGNoYXIgKnNlbmRlcl9sb2dpbmZvOworICBjb25zdCBjaGFyICpwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbzsKKworICBpZiAoZXJyb3IgPT0gTlVMTCAmJiAhbG9nKQorICAgIHJldHVybjsKKworICBpZiAoc2VuZGVyICE9IE5VTEwpCisgICAgeworICAgICAgc2VuZGVyX25hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoc2VuZGVyKTsKKyAgICAgIHNlbmRlcl9sb2dpbmZvID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKHNlbmRlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VuZGVyX25hbWUgPSAiKHVuc2V0KSI7CisgICAgICBzZW5kZXJfbG9naW5mbyA9ICIoYnVzKSI7CisgICAgfQorCisgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCkKKyAgICBwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbyA9IGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChwcm9wb3NlZF9yZWNpcGllbnQpOworICBlbHNlCisgICAgcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm8gPSAiYnVzIjsKKworICBkYnVzX3NldF9lcnJvciAoJnN0YWNrX2Vycm9yLCBlcnJvcl9uYW1lLAorICAgICAgIiVzLCAlZCBtYXRjaGVkIHJ1bGVzOyB0eXBlPVwiJXNcIiwgc2VuZGVyPVwiJXNcIiAoJXMpICIKKyAgICAgICJpbnRlcmZhY2U9XCIlc1wiIG1lbWJlcj1cIiVzXCIgZXJyb3IgbmFtZT1cIiVzXCIgIgorICAgICAgInJlcXVlc3RlZF9yZXBseT1cIiVkXCIgZGVzdGluYXRpb249XCIlc1wiICglcykiLAorICAgICAgY29tcGxhaW50LAorICAgICAgbWF0Y2hlZF9ydWxlcywKKyAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICBzZW5kZXJfbmFtZSwKKyAgICAgIHNlbmRlcl9sb2dpbmZvLAorICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLCAiKHVuc2V0KSIpLAorICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCAiKHVuc2V0KSIpLAorICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwgIih1bnNldCkiKSwKKyAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpLCBEQlVTX1NFUlZJQ0VfREJVUyksCisgICAgICBwcm9wb3NlZF9yZWNpcGllbnRfbG9naW5mbyk7CisKKyAgLyogSWYgd2UgaGl0IE9PTSB3aGlsZSBzZXR0aW5nIHRoZSBlcnJvciwgdGhpcyB3aWxsIHN5c2xvZyAib3V0IG9mIG1lbW9yeSIKKyAgICogd2hpY2ggaXMgaXRzZWxmIGFuIGluZGljYXRpb24gdGhhdCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nICovCisgIGlmIChsb2cpCisgICAgYnVzX2NvbnRleHRfbG9nX2xpdGVyYWwgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwKKyAgICAgICAgc3RhY2tfZXJyb3IubWVzc2FnZSk7CisKKyAgZGJ1c19tb3ZlX2Vycm9yICgmc3RhY2tfZXJyb3IsIGVycm9yKTsKK30KKworLyoKKyAqIGFkZHJlc3NlZF9yZWNpcGllbnQgaXMgdGhlIHJlY2lwaWVudCBzcGVjaWZpZWQgaW4gdGhlIG1lc3NhZ2UuCisgKgorICogcHJvcG9zZWRfcmVjaXBpZW50IGlzIHRoZSByZWNpcGllbnQgd2UncmUgY29uc2lkZXJpbmcgc2VuZGluZworICogdG8gcmlnaHQgdGhpcyBzZWNvbmQsIGFuZCBtYXkgYmUgYW4gZWF2ZXNkcm9wcGVyLgorICoKKyAqIHNlbmRlciBpcyB0aGUgc2VuZGVyIG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIE5VTEwgZm9yIHByb3Bvc2VkX3JlY2lwaWVudCBvciBzZW5kZXIgZGVmaW5pdGVseSBtZWFucyB0aGUgYnVzIGRyaXZlci4KKyAqCisgKiBOVUxMIGZvciBhZGRyZXNzZWRfcmVjaXBpZW50IG1heSBtZWFuIHRoZSBidXMgZHJpdmVyLCBvciBtYXkgbWVhbgorICogbm8gZGVzdGluYXRpb24gd2FzIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoZS5nLiBhIHNpZ25hbCkuCisgKi8KK2RidXNfYm9vbF90CitidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpzcmMsICpkZXN0OworICBCdXNDbGllbnRQb2xpY3kgKnNlbmRlcl9wb2xpY3k7CisgIEJ1c0NsaWVudFBvbGljeSAqcmVjaXBpZW50X3BvbGljeTsKKyAgZGJ1c19pbnQzMl90IHRvZ2dsZXM7CisgIGRidXNfYm9vbF90IGxvZzsKKyAgaW50IHR5cGU7CisgIGRidXNfYm9vbF90IHJlcXVlc3RlZF9yZXBseTsKKworICB0eXBlID0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKTsKKyAgc3JjID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpOworICBkZXN0ID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgLyogZGlzcGF0Y2guYyB3YXMgc3VwcG9zZWQgdG8gZW5zdXJlIHRoZXNlIGludmFyaWFudHMgKi8KKyAgX2RidXNfYXNzZXJ0IChkZXN0ICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCB8fAorICAgICAgICAgICAgICAgIChzZW5kZXIgPT0gTlVMTCAmJiAhYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChwcm9wb3NlZF9yZWNpcGllbnQpKSk7CisgIF9kYnVzX2Fzc2VydCAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAgKGRlc3QsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgZGlzYWxsb3dpbmcgbWVzc2FnZSBvZiB1bmtub3duIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgYnVzIHdpbGwgbm90IGFjY2VwdCBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGVcbiIpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlcXVlc3RlZF9yZXBseSA9IEZBTFNFOworCisgIGlmIChzZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChzZW5kZXIpKQorICAgICAgICB7CisgICAgICAgICAgc2VuZGVyX3BvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKHNlbmRlcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXJfcG9saWN5ICE9IE5VTEwpOworCisgICAgICAgICAgLyogRmlsbCBpbiByZXF1ZXN0ZWRfcmVwbHkgdmFyaWFibGUgd2l0aCBUUlVFIGlmIHRoaXMgaXMgYQorICAgICAgICAgICAqIHJlcGx5IGFuZCB0aGUgcmVwbHkgd2FzIHBlbmRpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwgLyogbm90IHRvIHRoZSBidXMgZHJpdmVyICovICYmCisgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCAvKiBub3QgZWF2ZXNkcm9wcGluZyAqLykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgZXJyb3IyOworCisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcjIpOworICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5ID0gYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5IChidXNfY29ubmVjdGlvbl9nZXRfY29ubmVjdGlvbnMgKHNlbmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcjIpOworICAgICAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJmVycm9yMiwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc2VuZGVyX3BvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgLyogRmlyc3QgdmVyaWZ5IHRoZSBTRUxpbnV4IGFjY2VzcyBjb250cm9scy4gIElmIGFsbG93ZWQgdGhlbgorICAgICAgICogZ28gb24gd2l0aCB0aGUgc3RhbmRhcmQgY2hlY2tzLgorICAgICAgICovCisgICAgICBpZiAoIWJ1c19zZWxpbnV4X2FsbG93c19zZW5kIChzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorCQkJCSAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisJCQkJICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisJCQkJICAgIGRlc3QgPyBkZXN0IDogREJVU19TRVJWSUNFX0RCVVMsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBkb24ndCBzeXNsb2cgdGhpcywganVzdCBzZXQgdGhlIGVycm9yOiBhdmNfaGFzX3Blcm0gc2hvdWxkCisgICAgICAgICAgICAgICAqIGhhdmUgYWxyZWFkeSB3cml0dGVuIHRvIGVpdGhlciB0aGUgYXVkaXQgbG9nIG9yIHN5c2xvZyAqLworICAgICAgICAgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAiQW4gU0VMaW51eCBwb2xpY3kgcHJldmVudHMgdGhpcyBzZW5kZXIgZnJvbSBzZW5kaW5nIHRoaXMgIgorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgdG8gdGhpcyByZWNpcGllbnQiLAorICAgICAgICAgICAgICAgICAgMCwgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIEZBTFNFLCBGQUxTRSwgZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBzZWN1cml0eSBjaGVjayBkZW55aW5nIHNlbmQgdG8gc2VydmljZVxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgLyogbmV4dCB2ZXJpZnkgQXBwQXJtb3IgYWNjZXNzIGNvbnRyb2xzLiAgSWYgYWxsb3dlZCB0aGVuCisgICAgICAgKiBnbyBvbiB3aXRoIHRoZSBzdGFuZGFyZCBjaGVja3MuCisgICAgICAgKi8KKyAgICAgIGlmICghYnVzX2FwcGFybW9yX2FsbG93c19zZW5kIChzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X3R5cGUgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA/IGRlc3QgOiBEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPyBzcmMgOiBEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKHNlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBQb2xpY3kgZm9yIGluYWN0aXZlIGNvbm5lY3Rpb25zIGlzIHRoYXQgdGhleSBjYW4gb25seSBzZW5kCisgICAgICAgICAgICogdGhlIGhlbGxvIG1lc3NhZ2UgdG8gdGhlIGJ1cyBkcml2ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBjaGVjayBhbGxvd2luZyAlcyBtZXNzYWdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgZGlzYWxsb3dpbmcgbm9uLSVzIG1lc3NhZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsaWVudCB0cmllZCB0byBzZW5kIGEgbWVzc2FnZSBvdGhlciB0aGFuICVzIHdpdGhvdXQgYmVpbmcgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZW5kZXJfcG9saWN5ID0gTlVMTDsKKworICAgICAgLyogSWYgdGhlIHNlbmRlciBpcyB0aGUgYnVzIGRyaXZlciwgd2UgYXNzdW1lIGFueSByZXBseSB3YXMgYQorICAgICAgICogcmVxdWVzdGVkIHJlcGx5IGFzIGJ1cyBkcml2ZXIgd29uJ3Qgc2VuZCBib2d1cyBvbmVzCisgICAgICAgKi8KKyAgICAgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCAvKiBub3QgZWF2ZXNkcm9wcGluZyAqLyAmJgorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwKQorICAgICAgICByZXF1ZXN0ZWRfcmVwbHkgPSBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKChzZW5kZXIgIT0gTlVMTCAmJiBzZW5kZXJfcG9saWN5ICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHNlbmRlciA9PSBOVUxMICYmIHNlbmRlcl9wb2xpY3kgPT0gTlVMTCkpOworCisgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBvbmx5IHRoZSBidXMgZHJpdmVyIGNhbiBzZW5kIHRvIGFuIGluYWN0aXZlIHJlY2lwaWVudCAoYXMgaXQKKyAgICAgICAqIG93bnMgbm8gc2VydmljZXMsIHNvIG90aGVyIGFwcHMgY2FuJ3QgYWRkcmVzcyBpdCkuIEluYWN0aXZlCisgICAgICAgKiByZWNpcGllbnRzIGNhbiByZWNlaXZlIGFueSBtZXNzYWdlLgorICAgICAgICovCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChwcm9wb3NlZF9yZWNpcGllbnQpKQorICAgICAgICB7CisgICAgICAgICAgcmVjaXBpZW50X3BvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChyZWNpcGllbnRfcG9saWN5ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBjaGVjayB1c2luZyBOVUxMIHJlY2lwaWVudCBwb2xpY3kgZm9yIG1lc3NhZ2UgZnJvbSBidXNcbiIpOworICAgICAgICAgIHJlY2lwaWVudF9wb2xpY3kgPSBOVUxMOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhIG1lc3NhZ2Ugd2FzIHNvbWVob3cgc2VudCB0byBhbiBpbmFjdGl2ZSByZWNpcGllbnQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIHRoZSBtZXNzYWdlIGJ1c1xuIik7CisgICAgICAgICAgcmVjaXBpZW50X3BvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZWNpcGllbnRfcG9saWN5ID0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCAmJiByZWNpcGllbnRfcG9saWN5ICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMICYmIHNlbmRlciA9PSBOVUxMICYmIHJlY2lwaWVudF9wb2xpY3kgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAocHJvcG9zZWRfcmVjaXBpZW50ID09IE5VTEwgJiYgcmVjaXBpZW50X3BvbGljeSA9PSBOVUxMKSk7CisKKyAgbG9nID0gRkFMU0U7CisgIGlmIChzZW5kZXJfcG9saWN5ICYmCisgICAgICAhYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgKHNlbmRlcl9wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJnRvZ2dsZXMsICZsb2cpKQorICAgIHsKKyAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAiUmVqZWN0ZWQgc2VuZCBtZXNzYWdlIiwgdG9nZ2xlcywKKyAgICAgICAgICBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCksIGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBwb2xpY3kgZGlzYWxsb3dpbmcgbWVzc2FnZSBkdWUgdG8gc2VuZGVyIHBvbGljeVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChsb2cpCisgICAgeworICAgICAgLyogV2Ugd2FudCB0byBkcm9wIHRoaXMgbWVzc2FnZSwgYW5kIGFyZSBvbmx5IG5vdCBkb2luZyBzbyBmb3IgYmFja3dhcmRzCisgICAgICAgKiBjb21wYXRpYmlsaXR5LiAqLworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJXb3VsZCByZWplY3QgbWVzc2FnZSIsIHRvZ2dsZXMsCisgICAgICAgICAgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICBUUlVFLCBOVUxMKTsKKyAgICB9CisKKyAgaWYgKHJlY2lwaWVudF9wb2xpY3kgJiYKKyAgICAgICFidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fcmVjZWl2ZSAocmVjaXBpZW50X3BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LCBwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZ0b2dnbGVzKSkKKyAgICB7CisgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgIlJlamVjdGVkIHJlY2VpdmUgbWVzc2FnZSIsIHRvZ2dsZXMsCisgICAgICAgICAgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAoYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQpLCBlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgcG9saWN5IGRpc2FsbG93aW5nIG1lc3NhZ2UgZHVlIHRvIHJlY2lwaWVudCBwb2xpY3lcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTZWUgaWYgbGltaXRzIG9uIHNpemUgaGF2ZSBiZWVuIGV4Y2VlZGVkICovCisgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgJiYKKyAgICAgICgoZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplIChwcm9wb3NlZF9yZWNpcGllbnQpID4gY29udGV4dC0+bGltaXRzLm1heF9vdXRnb2luZ19ieXRlcykgfHwKKyAgICAgICAoZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ191bml4X2ZkcyAocHJvcG9zZWRfcmVjaXBpZW50KSA+IGNvbnRleHQtPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMpKSkKKyAgICB7CisgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKyAgICAgICAgICAiUmVqZWN0ZWQ6IGRlc3RpbmF0aW9uIGhhcyBhIGZ1bGwgbWVzc2FnZSBxdWV1ZSIsCisgICAgICAgICAgMCwgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwgVFJVRSwKKyAgICAgICAgICBlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgcG9saWN5IGRpc2FsbG93aW5nIG1lc3NhZ2UgZHVlIHRvIGZ1bGwgbWVzc2FnZSBxdWV1ZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFJlY29yZCB0aGF0IHdlIHdpbGwgYWxsb3cgYSByZXBseSBoZXJlIGluIHRoZSBmdXR1cmUgKGRvbid0CisgICAqIGJvdGhlciBpZiB0aGUgcmVjaXBpZW50IGlzIHRoZSBidXMgb3IgdGhpcyBpcyBhbiBlYXZlc2Ryb3BwaW5nCisgICAqIGNvbm5lY3Rpb24pLiBPbmx5IHRoZSBhZGRyZXNzZWQgcmVjaXBpZW50IG1heSByZXBseS4KKyAgICovCisgIGlmICh0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICYmCisgICAgICBzZW5kZXIgJiYKKyAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgJiYKKyAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gcHJvcG9zZWRfcmVjaXBpZW50ICYmIC8qIG5vdCBlYXZlc2Ryb3BwaW5nICovCisgICAgICAhYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byByZWNvcmQgcmVwbHkgZXhwZWN0YXRpb24gb3IgcHJvYmxlbSB3aXRoIHRoZSBtZXNzYWdlIGV4cGVjdGluZyBhIHJlcGx5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBhbGxvd2luZyBtZXNzYWdlXG4iKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c19ib29sX3QgZW5hYmxlZCA9IFRSVUU7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uc19nZXRfbl9pbmNvbXBsZXRlIChjb250ZXh0LT5jb25uZWN0aW9ucykgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAoY29udGV4dCkpCisgICAgeworICAgICAgZW5hYmxlZCA9IEZBTFNFOworICAgIH0KKworICBpZiAoY29udGV4dC0+d2F0Y2hlc19lbmFibGVkID09IGVuYWJsZWQpCisgICAgcmV0dXJuOworCisgIGNvbnRleHQtPndhdGNoZXNfZW5hYmxlZCA9IGVuYWJsZWQ7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGV4dC0+c2VydmVycywgbGluaykpCisgICAgeworICAgICAgLyogQSBCdXNDb250ZXh0IG1pZ2h0IGNvbnRhaW5zIHNldmVyYWwgREJ1c1NlcnZlciAoaWYgdGhlcmUgYXJlCisgICAgICAgKiBzZXZlcmFsIDxsaXN0ZW4+IGNvbmZpZ3VyYXRpb24gaXRlbXMpIGFuZCBhIERCdXNTZXJ2ZXIgbWlnaHQKKyAgICAgICAqIGNvbnRhaW4gc2V2ZXJhbCBEQnVzV2F0Y2ggaW4gaXRzIERCdXNXYXRjaExpc3QgKGlmIGdldGFkZHJpbmZvCisgICAgICAgKiByZXR1cm5zIHNldmVyYWwgYWRkcmVzc2VzIG9uIGEgZHVhbCBJUHY0LUlQdjYgc3RhY2sgb3IgaWYKKyAgICAgICAqIHN5c3RlbWQgcGFzc2VzIHNldmVyYWwgZmRzKS4KKyAgICAgICAqIFdlIHdhbnQgdG8gZW5hYmxlL2Rpc2FibGUgdGhlbSBhbGwuCisgICAgICAgKi8KKyAgICAgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGxpbmstPmRhdGE7CisgICAgICBfZGJ1c19zZXJ2ZXJfdG9nZ2xlX2FsbF93YXRjaGVzIChzZXJ2ZXIsIGVuYWJsZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2J1cy9idXMuaCBiL2J1cy9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFiNTlmCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2J1cy5oCkBAIC0wLDAgKzEsMTQzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGJ1cy5oICBtZXNzYWdlIGJ1cyBjb250ZXh0IG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19CVVNfSAorI2RlZmluZSBCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcGlwZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3R5cGVkZWYgc3RydWN0IEJ1c0FjdGl2YXRpb24gICAgQnVzQWN0aXZhdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c0Nvbm5lY3Rpb25zICAgQnVzQ29ubmVjdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBCdXNDb250ZXh0ICAgICAgIEJ1c0NvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBCdXNQb2xpY3kgICAgICAgIEJ1c1BvbGljeTsKK3R5cGVkZWYgc3RydWN0IEJ1c0NsaWVudFBvbGljeSAgQnVzQ2xpZW50UG9saWN5OwordHlwZWRlZiBzdHJ1Y3QgQnVzUG9saWN5UnVsZSAgICBCdXNQb2xpY3lSdWxlOwordHlwZWRlZiBzdHJ1Y3QgQnVzUmVnaXN0cnkgICAgICBCdXNSZWdpc3RyeTsKK3R5cGVkZWYgc3RydWN0IEJ1c1NFTGludXhJRCAgICAgQnVzU0VMaW51eElEOwordHlwZWRlZiBzdHJ1Y3QgQnVzQXBwQXJtb3JDb25maW5lbWVudCBCdXNBcHBBcm1vckNvbmZpbmVtZW50OwordHlwZWRlZiBzdHJ1Y3QgQnVzU2VydmljZSAgICAgICBCdXNTZXJ2aWNlOwordHlwZWRlZiBzdHJ1Y3QgQnVzT3duZXIJCUJ1c093bmVyOwordHlwZWRlZiBzdHJ1Y3QgQnVzVHJhbnNhY3Rpb24gICBCdXNUcmFuc2FjdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNobWFrZXIgICAgQnVzTWF0Y2htYWtlcjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNoUnVsZSAgICAgQnVzTWF0Y2hSdWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICBsb25nIG1heF9pbmNvbWluZ19ieXRlczsgICAgICAgICAgLyoqPCBIb3cgbWFueSBpbmNvbWluZyBtZXNzYWdlIGJ5dGVzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X2luY29taW5nX3VuaXhfZmRzOyAgICAgICAvKio8IEhvdyBtYW55IGluY29taW5nIG1lc3NhZ2UgdW5peCBmZHMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgbG9uZyBtYXhfb3V0Z29pbmdfYnl0ZXM7ICAgICAgICAgIC8qKjwgSG93IG1hbnkgb3V0Z29pbmcgYnl0ZXMgY2FuIGJlIHF1ZXVlZCBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBsb25nIG1heF9vdXRnb2luZ191bml4X2ZkczsgICAgICAgLyoqPCBIb3cgbWFueSBvdXRnb2luZyB1bml4IGZkcyBjYW4gYmUgcXVldWVkIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X21lc3NhZ2Vfc2l6ZTsgICAgICAgICAgICAvKio8IE1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UgaW4gYnl0ZXMgKi8KKyAgbG9uZyBtYXhfbWVzc2FnZV91bml4X2ZkczsgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlKi8KKyAgaW50IGFjdGl2YXRpb25fdGltZW91dDsgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBmb3IgYW4gYWN0aXZhdGlvbiB0byB0aW1lIG91dCAqLworICBpbnQgYXV0aF90aW1lb3V0OyAgICAgICAgICAgICAgICAgLyoqPCBIb3cgbG9uZyB0byB3YWl0IGZvciBhbiBhdXRoZW50aWNhdGlvbiB0byB0aW1lIG91dCAqLworICBpbnQgcGVuZGluZ19mZF90aW1lb3V0OyAgICAgICAgICAgLyoqPCBIb3cgbG9uZyB0byB3YWl0IGZvciBhIEQtQnVzIG1lc3NhZ2Ugd2l0aCBhIGZkIHRvIHRpbWUgb3V0ICovCisgIGludCBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zOyAgICAvKio8IE1heCBudW1iZXIgb2YgYXV0aG9yaXplZCBjb25uZWN0aW9ucyAqLworICBpbnQgbWF4X2luY29tcGxldGVfY29ubmVjdGlvbnM7ICAgLyoqPCBNYXggbnVtYmVyIG9mIGluY29tcGxldGUgY29ubmVjdGlvbnMgKi8KKyAgaW50IG1heF9jb25uZWN0aW9uc19wZXJfdXNlcjsgICAgIC8qKjwgTWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyBhdXRoJ2QgYXMgc2FtZSB1c2VyICovCisgIGludCBtYXhfcGVuZGluZ19hY3RpdmF0aW9uczsgICAgICAvKio8IE1heCBudW1iZXIgb2YgcGVuZGluZyBhY3RpdmF0aW9ucyBmb3IgdGhlIGVudGlyZSBidXMgKi8KKyAgaW50IG1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbjsgIC8qKjwgTWF4IG51bWJlciBvZiBvd25lZCBzZXJ2aWNlcyBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBpbnQgbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uOyAvKio8IE1heCBudW1iZXIgb2YgbWF0Y2ggcnVsZXMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgaW50IG1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHJlcGxpZXMgdGhhdCBjYW4gYmUgcGVuZGluZyBmb3IgZWFjaCBjb25uZWN0aW9uICovCisgIGludCByZXBseV90aW1lb3V0OyAgICAgICAgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgdGltaW5nIG91dCBhIHJlcGx5ICovCit9IEJ1c0xpbWl0czsKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19DT05URVhUX0ZMQUdfTk9ORSA9IDAsCisgIEJVU19DT05URVhUX0ZMQUdfRk9SS19BTFdBWVMgPSAoMSA8PCAxKSwKKyAgQlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSID0gKDEgPDwgMiksCisgIEJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEUgPSAoMSA8PCAzKSwKKyAgQlVTX0NPTlRFWFRfRkxBR19TWVNURU1EX0FDVElWQVRJT04gPSAoMSA8PCA0KQorfSBCdXNDb250ZXh0RmxhZ3M7CisKK0J1c0NvbnRleHQqICAgICAgIGJ1c19jb250ZXh0X25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29udGV4dEZsYWdzICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9hZGRyX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9yZWxvYWRfY29uZmlnICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorCQkJCQkJCQkgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X3NodXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzQ29udGV4dCogICAgICAgYnVzX2NvbnRleHRfcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF91bnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp1dWlkKTsKK2NvbnN0IGNoYXIqICAgICAgIGJ1c19jb250ZXh0X2dldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICAgICAgYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Citjb25zdCBjaGFyKiAgICAgICBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9zeXN0ZW1kX2FjdGl2YXRpb24gICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzUmVnaXN0cnkqICAgICAgYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitCdXNDb25uZWN0aW9ucyogICBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c0FjdGl2YXRpb24qICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzTWF0Y2htYWtlciogICAgYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitEQnVzTG9vcCogICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2FsbG93X3VuaXhfdXNlciAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfYWxsb3dfd2luZG93c191c2VyICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKTsKK0J1c1BvbGljeSogICAgICAgIGJ1c19jb250ZXh0X2dldF9wb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworCitCdXNDbGllbnRQb2xpY3kqICBidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uX3RpbWVvdXQgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X2F1dGhfdGltZW91dCAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfcGVuZGluZ19mZF90aW1lb3V0ICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X3JlcGx5X3RpbWVvdXQgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitEQnVzUkxpbWl0ICogICAgICBidXNfY29udGV4dF9nZXRfaW5pdGlhbF9mZF9saW1pdCAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgzLCA0KTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZ19saXRlcmFsICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICptc2cpOwordm9pZCAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDUsIDYpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF9jaGVja19hbGxfd2F0Y2hlcyAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKKworI2VuZGlmIC8qIEJVU19CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyBiL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3MWZkYQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1leHBhdC5jICBleHBhdCBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKK3N0YXRpYyBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlIG1lbXN1aXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIERCdXNTdHJpbmcgY29udGVudDsKKyAgREJ1c0Vycm9yICplcnJvcjsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBFeHBhdFBhcnNlQ29udGV4dDsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbnRlbnQgKEV4cGF0UGFyc2VDb250ZXh0ICpjb250ZXh0KQoreworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50KSA+IDApCisgICAgeworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LT5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50LCAwKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyICh2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpbnQgaTsKKyAgY2hhciAqKm5hbWVzOworICBjaGFyICoqdmFsdWVzOworCisgIC8qIEV4cGF0IHNlZW1zIHRvIHN1Y2sgYW5kIGNhbid0IGFib3J0IHRoZSBwYXJzZSBpZiB3ZQorICAgKiB0aHJvdyBhbiBlcnJvci4gRXhwYXQgMi4wIGlzIHN1cHBvc2VkIHRvIGZpeCB0aGlzLgorICAgKi8KKyAgaWYgKGNvbnRleHQtPmZhaWxlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwcm9jZXNzX2NvbnRlbnQgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICAvKiAiYXR0cyIgaXMga2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgTlVMTCAqLworICBmb3IgKGkgPSAwOyBhdHRzW2ldICE9IE5VTEw7ICsraSkKKyAgICA7IC8qIG5vdGhpbmcgKi8KKworICBfZGJ1c19hc3NlcnQgKGkgJSAyID09IDApOworICBuYW1lcyA9IGRidXNfbmV3MCAoY2hhciAqLCBpIC8gMiArIDEpOworICB2YWx1ZXMgPSBkYnVzX25ldzAgKGNoYXIgKiwgaSAvIDIgKyAxKTsKKworICBpZiAobmFtZXMgPT0gTlVMTCB8fCB2YWx1ZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpICUgMiA9PSAwKTsKKyAgICAgIG5hbWVzIFtpIC8gMl0gPSAoY2hhciopIGF0dHNbaV07CisgICAgICB2YWx1ZXNbaSAvIDJdID0gKGNoYXIqKSBhdHRzW2krMV07CisKKyAgICAgIGkgKz0gMjsKKyAgICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lcyk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlcyk7CisgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgZGJ1c19mcmVlICh2YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAorZXhwYXRfRW5kRWxlbWVudEhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRXhwYXRQYXJzZUNvbnRleHQgKmNvbnRleHQgPSB1c2VyRGF0YTsKKworICBpZiAoIXByb2Nlc3NfY29udGVudCAoY29udGV4dCkpCisgICAgcmV0dXJuOworCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKGNvbnRleHQtPnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IpKQorICAgIHsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCitzdGF0aWMgdm9pZAorZXhwYXRfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmY29udGV4dC0+Y29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisKK0J1c0NvbmZpZ1BhcnNlcioKK2J1c19jb25maWdfbG9hZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICplcnJvcikKK3sKKyAgWE1MX1BhcnNlciBleHBhdDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBFeHBhdFBhcnNlQ29udGV4dCBjb250ZXh0OworICBEQnVzU3RyaW5nIGRpcm5hbWU7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBwYXJzZXIgPSBOVUxMOworICBleHBhdCA9IE5VTEw7CisgIGNvbnRleHQuZXJyb3IgPSBlcnJvcjsKKyAgY29udGV4dC5mYWlsZWQgPSBGQUxTRTsKKworICBmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQuY29udGVudCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG1lbXN1aXRlLm1hbGxvY19mY24gPSBkYnVzX21hbGxvYzsKKyAgbWVtc3VpdGUucmVhbGxvY19mY24gPSBkYnVzX3JlYWxsb2M7CisgIG1lbXN1aXRlLmZyZWVfZmNuID0gZGJ1c19mcmVlOworCisgIGV4cGF0ID0gWE1MX1BhcnNlckNyZWF0ZV9NTSAoIlVURi04IiwgJm1lbXN1aXRlLCBOVUxMKTsKKyAgaWYgKGV4cGF0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgKGZpbGUsICZkaXJuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIHBhcnNlciA9IGJ1c19jb25maWdfcGFyc2VyX25ldyAoJmRpcm5hbWUsIGlzX3RvcGxldmVsLCBwYXJlbnQpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGNvbnRleHQucGFyc2VyID0gcGFyc2VyOworCisgIFhNTF9TZXRVc2VyRGF0YSAoZXhwYXQsICZjb250ZXh0KTsKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGF0X0VuZEVsZW1lbnRIYW5kbGVyKTsKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9DaGFyYWN0ZXJEYXRhSGFuZGxlcik7CisKKyAgeworICAgIERCdXNTdHJpbmcgZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhX3N0cjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkYXRhKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmRhdGEsIGZpbGUsIGVycm9yKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBkYXRhX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRhdGEpOworCisgICAgaWYgKCFYTUxfUGFyc2UgKGV4cGF0LCBkYXRhX3N0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSwgVFJVRSkpCisgICAgICB7CisgICAgICAgIGlmIChjb250ZXh0LmVycm9yICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFkYnVzX2Vycm9yX2lzX3NldCAoY29udGV4dC5lcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgZW51bSBYTUxfRXJyb3IgZTsKKworICAgICAgICAgICAgZSA9IFhNTF9HZXRFcnJvckNvZGUgKGV4cGF0KTsKKyAgICAgICAgICAgIGlmIChlID09IFhNTF9FUlJPUl9OT19NRU1PUlkpCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIGZpbGUgJXMsIGxpbmUgJWQsIGNvbHVtbiAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAoZXhwYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgKGV4cGF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyAoZSkpOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YSk7CisKKyAgICBpZiAoY29udGV4dC5mYWlsZWQpCisgICAgICBnb3RvIGZhaWxlZDsKKyAgfQorCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgKHBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgWE1MX1BhcnNlckZyZWUgKGV4cGF0KTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIHBhcnNlcjsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgaWYgKGV4cGF0KQorICAgIFhNTF9QYXJzZXJGcmVlIChleHBhdCk7CisgIGlmIChwYXJzZXIpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMgYi9idXMvY29uZmlnLXBhcnNlci1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI2YjI4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uYyAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitFbGVtZW50VHlwZQorYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGlmIChzdHJjbXAgKG5hbWUsICJub25lIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9OT05FOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYnVzY29uZmlnIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9CVVNDT05GSUc7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9VU0VSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInR5cGUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0NPTkZJR1RZUEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJmb3JrIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9GT1JLOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicGlkZmlsZSIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfUElERklMRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxpc3RlbiIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElTVEVOOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImFsbG93IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BTExPVzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImRlbnkiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0RFTlk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZXJ2aWNlaGVscGVyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRVJWSUNFSEVMUEVSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiaW5jbHVkZWRpciIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfSU5DTFVERURJUjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2VkaXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NFUlZJQ0VESVI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJpbmNsdWRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9JTkNMVURFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicG9saWN5IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9QT0xJQ1k7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsaW1pdCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElNSVQ7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZWxpbnV4IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRUxJTlVYOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXNzb2NpYXRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BU1NPQ0lBVEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzeXNsb2ciKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NZU0xPRzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImtlZXBfdW1hc2siKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0tFRVBfVU1BU0s7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhbGxvd19hbm9ueW1vdXMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImFwcGFybW9yIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BUFBBUk1PUjsKKyAgICB9CisgIHJldHVybiBFTEVNRU5UX05PTkU7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAoRWxlbWVudFR5cGUgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgICByZXR1cm4gImJ1c2NvbmZpZyI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICByZXR1cm4gImluY2x1ZGUiOworICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgcmV0dXJuICJ1c2VyIjsKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgICAgcmV0dXJuICJsaXN0ZW4iOworICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgICAgcmV0dXJuICJhdXRoIjsKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgcmV0dXJuICJwb2xpY3kiOworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHJldHVybiAibGltaXQiOworICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICAgIHJldHVybiAiYWxsb3ciOworICAgIGNhc2UgRUxFTUVOVF9ERU5ZOgorICAgICAgcmV0dXJuICJkZW55IjsKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICAgIHJldHVybiAiZm9yayI7CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgICByZXR1cm4gInBpZGZpbGUiOworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIjsKKyAgICBjYXNlIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiOworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFRElSOgorICAgICAgcmV0dXJuICJzZXJ2aWNlZGlyIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICAgIHJldHVybiAic2VydmljZWhlbHBlciI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgICByZXR1cm4gImluY2x1ZGVkaXIiOworICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgcmV0dXJuICJ0eXBlIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICAgIHJldHVybiAic2VsaW51eCI7CisgICAgY2FzZSBFTEVNRU5UX0FTU09DSUFURToKKyAgICAgIHJldHVybiAiYXNzb2NpYXRlIjsKKyAgICBjYXNlIEVMRU1FTlRfU1lTTE9HOgorICAgICAgcmV0dXJuICJzeXNsb2ciOworICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgICAgcmV0dXJuICJrZWVwX3VtYXNrIjsKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgICAgcmV0dXJuICJhbGxvd19hbm9ueW1vdXMiOworICAgIGNhc2UgRUxFTUVOVF9BUFBBUk1PUjoKKyAgICAgIHJldHVybiAiYXBwYXJtb3IiOworICAgIH0KKworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgZWxlbWVudCB0eXBlIik7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oIGIvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uaCAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorCit0eXBlZGVmIGVudW0KK3sKKyAgRUxFTUVOVF9OT05FLAorICBFTEVNRU5UX0JVU0NPTkZJRywKKyAgRUxFTUVOVF9JTkNMVURFLAorICBFTEVNRU5UX1VTRVIsCisgIEVMRU1FTlRfTElTVEVOLAorICBFTEVNRU5UX0FVVEgsCisgIEVMRU1FTlRfUE9MSUNZLAorICBFTEVNRU5UX0xJTUlULAorICBFTEVNRU5UX0FMTE9XLAorICBFTEVNRU5UX0RFTlksCisgIEVMRU1FTlRfRk9SSywKKyAgRUxFTUVOVF9QSURGSUxFLAorICBFTEVNRU5UX1NFUlZJQ0VESVIsCisgIEVMRU1FTlRfU0VSVklDRUhFTFBFUiwKKyAgRUxFTUVOVF9JTkNMVURFRElSLAorICAvKiB0aGlzIGlzIHJlYWxseSA8dHlwZT4sIGJ1dCB3aW5pb2N0bC5oIGRlZmluZXMgRUxFTUVOVF9UWVBFICovCisgIEVMRU1FTlRfQ09ORklHVFlQRSwKKyAgRUxFTUVOVF9TRUxJTlVYLAorICBFTEVNRU5UX0FTU09DSUFURSwKKyAgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTLAorICBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUywKKyAgRUxFTUVOVF9LRUVQX1VNQVNLLAorICBFTEVNRU5UX1NZU0xPRywKKyAgRUxFTUVOVF9BTExPV19BTk9OWU1PVVMsCisgIEVMRU1FTlRfQVBQQVJNT1IKK30gRWxlbWVudFR5cGU7CisKK0VsZW1lbnRUeXBlIGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChjb25zdCBjaGFyICplbGVtZW50X25hbWUpOworY29uc3QgY2hhciogYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKEVsZW1lbnRUeXBlIHR5cGUpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfQ09NTU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jIGIvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYWQ4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmMgIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqICAgICAgICAgICAgICAgICAgRG9lcyBub3QgZG8gaW5jbHVkZXMgb3IgYW55dGhpbmcgcmVtb3RlbHkgY29tcGxpY2F0ZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLXRyaXZpYWwuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIFRSSVZJQUwgcGFyc2VyIGZvciBidXMgY29uZmlndXJhdGlvbiBmaWxlLgorICovCitzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyCit7CisgIEVsZW1lbnRUeXBlIHR5cGU7CisgIERCdXNTdHJpbmcgdXNlcjsgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgdGhlIGRidXMtZGFlbW9uIHJ1bnMgYXMgKi8KKyAgREJ1c1N0cmluZyBidXNfdHlwZTsgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBidXMgdHlwZSAqLworICBEQnVzU3RyaW5nIHNlcnZpY2VfaGVscGVyOyAgICAgICAgLyoqPCBMb2NhdGlvbiBvZiB0aGUgc2V0dWlkIGhlbHBlciAqLworICBEQnVzTGlzdCAqc2VydmljZV9kaXJzOyAgICAgICAgICAgLyoqPCBEaXJlY3RvcmllcyB0byBsb29rIGZvciBzZXJ2aWNlcyBpbiAqLworfTsKKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoZGlyICE9IE5VTEwpOworCisgIGZvciAobGluayA9ICpzZXJ2aWNlX2RpcnM7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpsaW5rX2RpcjsKKworICAgICAgbGlua19kaXIgPSAoY29uc3QgY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBpZiAoc3RyY21wIChkaXIsIGxpbmtfZGlyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmRpcl9saW5rKQoreworICBpZiAoIXNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLCBkaXJfbGluay0+ZGF0YSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoc2VydmljZV9kaXJzLCBkaXJfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlIChkaXJfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZGlyX2xpbmspOworICAgIH0KK30KKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICAgICAgICAqcGFyZW50KQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKworICBwYXJzZXIgPSBkYnVzX25ldzAgKEJ1c0NvbmZpZ1BhcnNlciwgMSk7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBwYXJzZXItPnR5cGUgPSBFTEVNRU5UX05PTkU7CisKKyAgLyogaW5pdCB0aGUgbGlzdHMgKi8KKyAgcGFyc2VyLT5zZXJ2aWNlX2RpcnMgPSBOVUxMOworCisgIC8qIGluaXQgdGhlIHN0cmluZ3MgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+dXNlcikpCisgICAgZ290byBmYWlsZWRfcGFyc2VyOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT5idXNfdHlwZSkpCisgICAgZ290byBmYWlsZWRfdHlwZTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpKQorICAgIGdvdG8gZmFpbGVkX2hlbHBlcjsKKworICAvKiB3b290ISAqLworICByZXR1cm4gcGFyc2VyOworCisvKiBhcmdoLiB3ZSBoYXZlIGRvIGRvIHRoaXMgY2FyZWZ1bGx5IGJlY2F1c2Ugb2YgT09NICovCitmYWlsZWRfaGVscGVyOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworZmFpbGVkX3R5cGU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT51c2VyKTsKK2ZhaWxlZF9wYXJzZXI6CisgIGRidXNfZnJlZSAocGFyc2VyKTsKK2ZhaWxlZDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2J1c19jb25maWdfcGFyc2VyX3VucmVmIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPnVzZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+c2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+c2VydmljZV9kaXJzKTsKKworICBkYnVzX2ZyZWUgKHBhcnNlcik7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChzdHJjbXAgKGRvY3R5cGUsICJidXNjb25maWciKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBmaWxlIGhhcyB0aGUgd3JvbmcgZG9jdW1lbnQgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgLyogd2UgZG9uJ3QgZG8gcHJvY2Vzc2luZyBvZiBhdHRyaWJ1dGUgbmFtZXMsIHdlIGRvbid0IG5lZWQgdG8gKi8KKyAgcGFyc2VyLT50eXBlID0gYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGVsZW1lbnRfbmFtZSk7CisKKyAgc3dpdGNoIChwYXJzZXItPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgLyogY29udGVudCBhYm91dCB0byBiZSBoYW5kbGVkICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgICB7CisgICAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgICAgZGlycyA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIC8qIHdlIHJlYWxseSBkb24ndCBjYXJlIGFib3V0IHRoZSBvdGhlcnMuLi4gKi8KKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBTVEFSVCBXZSBkb24ndCBjYXJlIGFib3V0ICclcycgdHlwZSAnJWknXG4iLCBlbGVtZW50X25hbWUsIHBhcnNlci0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgKmVycm9yKQoreworICAvKiB3ZSBkb24ndCBjYXJlICovCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRfc2FuZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50X3NhbmUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGNvbnRlbnQsIDAsICZjb250ZW50X3NhbmUsIDApKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF9jb250ZW50OworICAgIH0KKworICAvKiByaXAgb3V0IHdoaXRlIHNwYWNlICovCisgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICgmY29udGVudF9zYW5lKTsKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudF9zYW5lKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIG9wdGltaXNlLCB0aGVyZSBpcyBubyBjb250ZW50ICovCisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICB9CisKKyAgc3dpdGNoIChwYXJzZXItPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFRElSOgorICAgICAgeworICAgICAgCWNoYXIgKmNwYXRoOworCisgICAgICAgIC8qIGNvcHkgdGhlIHNhbmUgZGF0YSBpbnRvIGEgY2hhciBhcnJheSAqLworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEoJmNvbnRlbnRfc2FuZSwgJmNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisKKyAgICAgICAgLyogYXBwZW5kIHRoZSBkeW5hbWljIGNoYXIgc3RyaW5nIHRvIHNlcnZpY2UgZGlycyAqLworICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGNwYXRoKTsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjb250ZW50X3NhbmUsIDAsICZwYXJzZXItPnNlcnZpY2VfaGVscGVyLCAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29udGVudF9zYW5lLCAwLCAmcGFyc2VyLT51c2VyLCAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29udGVudF9zYW5lLCAwLCAmcGFyc2VyLT5idXNfdHlwZSwgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgLyogd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3RoZXJzLi4uIHJlYWxseSAqLworICAgICAgICBfZGJ1c192ZXJib3NlICgiIENPTlRFTlRTIFdlIGRvbid0IGNhcmUgYWJvdXQgJyVzJyB0eXBlICclaSdcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmNvbnRlbnRfc2FuZSksIHBhcnNlci0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitvdXRfY29udGVudDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50X3NhbmUpOworb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX2RidXNfdmVyYm9zZSAoImZpbmlzaGVkIHNjYW5uaW5nIVxuIik7CisgIHJldHVybiBUUlVFOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGFyc2VyLT51c2VyKTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb25maWdfcGFyc2VyX2dldF90eXBlIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhcnNlci0+YnVzX3R5cGUpOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPnNlcnZpY2VfZGlyczsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKK3R5cGVkZWYgZW51bQoreworICBWQUxJRCwKKyAgSU5WQUxJRCwKKyAgVU5LTk9XTgorfSBWYWxpZGl0eTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19yZXR1cm5fdmFsdWVzIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqdXNlcjsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgREJ1c0xpc3QgKipkaXJzOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgcHJpbnRmICgiVGVzdGluZyB2YWx1ZXMgZnJvbTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZnVsbF9wYXRoKSk7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgIC8qIGNoZWNrIHVzZXIgcmV0dXJuIHZhbHVlIGlzIG9rYXkgKi8KKyAgdXNlciA9IGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChwYXJzZXIpOworICBpZiAodXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVc2VyIHdhcyBOVUxMIVxuIik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisjaWYgMAorICAvKiB0aGUgdXNlcm5hbWUgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gY29uZmlndXJlLmluIHNvIHRoaXMgdGVzdCBkb2Vzbid0IHdvcmsgKi8KKyAgaWYgKHN0cmNtcCAodXNlciwgImRidXMiKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVc2VyIHdhcyBpbnZhbGlkOyAnJXMnIVxuIiwgdXNlcik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgIHByaW50ZiAoIiAgICA8dXNlcj5kYnVzPC91c2VyPiBPS0FZIVxuIik7ICAKKyNlbmRpZgorICAKKyAgLyogY2hlY2sgdHlwZSByZXR1cm4gdmFsdWUgaXMgb2theSAqLworICB0eXBlID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKHBhcnNlcik7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlR5cGUgd2FzIE5VTEwhXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgaWYgKHN0cmNtcCAodHlwZSwgInN5c3RlbSIpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlR5cGUgd2FzIGludmFsaWQ7ICclcychXG4iLCB1c2VyKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgcHJpbnRmICgiICAgIDx0eXBlPnN5c3RlbTwvdHlwZT4gT0tBWSFcbiIpOworCisgIC8qIGNoZWNrIGRpcnMgcmV0dXJuIHZhbHVlIGlzIG9rYXkgKi8KKyAgZGlycyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlcik7CisgIGlmIChkaXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlNlcnZpY2UgZGlycyBhcmUgTlVMTCFcbiIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBwcmludGYgKCIgICAgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlX2RpcnMvPiBPS0FZIVxuIik7CisgIC8qIE5PVEU6IFdlIHRlc3RlZCB0aGUgc3BlY2lmaWMgcmV0dXJuIHZhbHVlcyBpbiB0aGUgY29uZmlnLXBhcnNlciB0ZXN0cyAqLworCisgIC8qIHdvb2hvbyEgKi8KKyAgcmV0dmFsID0gVFJVRTsKK2ZpbmlzaDoKKyAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fbG9hZCAoY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoLAorICAgICAgICAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHksCisgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBvb21fcG9zc2libGUpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoZnVsbF9wYXRoLCBUUlVFLCBOVUxMLCAmZXJyb3IpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKworICAgICAgaWYgKG9vbV9wb3NzaWJsZSAmJgorICAgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgZHVlIHRvIE9PTVxuIik7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh2YWxpZGl0eSA9PSBWQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gbG9hZCB2YWxpZCBmaWxlIGJ1dCBzdGlsbCBoYWQgbWVtb3J5OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmVycm9yKTsKKworICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisKKyAgICAgIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjY2VwdGVkIGludmFsaWQgZmlsZVxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoOworICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eTsKK30gTG9hZGVyT29tRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sb2FkZXJfb29tX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIExvYWRlck9vbURhdGEgKmQgPSBkYXRhOworCisgIHJldHVybiBkb19sb2FkIChkLT5mdWxsX3BhdGgsIGQtPnZhbGlkaXR5LCBUUlVFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3ViZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHkpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkaXIgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5XG4iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2RpcmVjdG9yeSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSB0ZXN0X2Jhc2VfZGlyIHRvIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdF9kaXJlY3RvcnksICZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIGZpbGVuYW1lIHN0cmluZ1xuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICh2YWxpZGl0eSA9PSBWQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIHZhbGlkIGZpbGVzOlxuIik7CisgIGVsc2UgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyBpbnZhbGlkIGZpbGVzOlxuIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJUZXN0aW5nIHVua25vd24gZmlsZXM6XG4iKTsKKworIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICBMb2FkZXJPb21EYXRhIGQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdGVzdF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLmNvbmYgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5ID09IFZBTElEID8gInZhbGlkIiA6CisgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gSU5WQUxJRCA/ICJpbnZhbGlkIiA6CisgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkaXR5ID09IFVOS05PV04gPyAidW5rbm93biIgOiAiPz8/IikpKTsKKworICAgICAgZC5mdWxsX3BhdGggPSAmZnVsbF9wYXRoOworICAgICAgZC52YWxpZGl0eSA9IHZhbGlkaXR5OworCisgICAgICAvKiBGSVhNRSBoYWNrYXJvdW5kIGZvciBhbiBleHBhdCBwcm9ibGVtLCBzZWUKKyAgICAgICAqIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTI0NzQ3CisgICAgICAgKiBodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtTWF5LzAwMTE1My5odG1sCisgICAgICAgKi8KKyAgICAgIC8qIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJjb25maWctbG9hZGVyIiwgY2hlY2tfbG9hZGVyX29vbV9mdW5jLCAmZCkpICovCisgICAgICBpZiAoIWNoZWNrX2xvYWRlcl9vb21fZnVuYyAoJmQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgfQorCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGdldCBuZXh0IGZpbGUgaW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBkbyBub3QgcmV1c2Ugb3V0c2lkZSBvZiBURVNUICovCitzdGF0aWMgZGJ1c19ib29sX3QKK21ha2VfZnVsbF9wYXRoIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorCQkJICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpciwKKwkJCSAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlLAorCQkJICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZ1bGxfcGF0aCkKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKGZ1bGxfcGF0aCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfZGF0YV9kaXIsIDAsIGZ1bGxfcGF0aCwgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgZmlsZSk7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2ZpbGVfdmFsaWQgKERCdXNTdHJpbmcgKmZ1bGxfcGF0aCwKKwkJCSAgICAgICAgICAgIFZhbGlkaXR5ICAgIHZhbGlkaXR5KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZTpcbiIpOworICBlbHNlIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgaW52YWxpZCBmaWxlOlxuIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJUZXN0aW5nIHVua25vd24gZmlsZTpcbiIpOworCisgIC8qIHByaW50IHRoZSBmaWxlbmFtZSwganVzdCBzbyB3ZSBtYXRjaCB0aGUgb3RoZXIgb3V0cHV0ICovCisgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmdWxsX3BhdGgpKTsKKworICAvKiBvbmx5IHRlc3Qgb25lIGZpbGUgKi8KKyAgcmV0dmFsID0gZG9fbG9hZCAoZnVsbF9wYXRoLCB2YWxpZGl0eSwgVFJVRSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3RyaXZpYWxfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodGVzdF9kYXRhX2RpcikgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJObyB0ZXN0IGRhdGFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgLyogV2UgYWxyZWFkeSB0ZXN0IGRlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyBhbmQgZGVmYXVsdF9zeXN0ZW1fc2VydmljZWRpcnMKKyAgICogaW4gYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCgpICovCisgIGlmICghcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcyIsIFZBTElEKSkKKyAgICBnb3RvIGZpbmlzaDsKKworI2lmbmRlZiBEQlVTX1dJTgorICAvKiBXZSBhbHJlYWR5IHRlc3QgZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzIGFuZCBkZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycworICAgKiBpbiBidXNfY29uZmlnX3BhcnNlcl90ZXN0KCkgKi8KKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbSIsIFZBTElEKSkKKyAgICBnb3RvIGZpbmlzaDsKKyNlbmRpZgorCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgYWxsIHRoZSBpbnZhbGlkIGZpbGVzLCBhcyB0aGUgdHJpdmlhbCBwYXJzZXIgY2FuJ3QgaG9wZQorICAgKiB0byB2YWxpZGF0ZSB0aGVtIGFsbCBmb3IgYWxsIGRpZmZlcmVudCBzeW50YXhlcy4gV2UganVzdCBjaGVjayBvbmUgYnJva2VuCisgICAqIGZpbGUgdG8gc2VlIGlmIGp1bmsgaXMgcmVjZWl2ZWQgKi8KKyAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAodGVzdF9kYXRhX2RpciwgImludmFsaWQtY29uZmlnLWZpbGVzIiwgIm5vdC13ZWxsLWZvcm1lZC5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgSU5WQUxJRCkpCisgICAgZ290byBmaW5pc2g7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworI2lmbmRlZiBEQlVTX1dJTgorICAvKiBqdXN0IHRlc3QgaWYgdGhlIGNoZWNrX2ZpbGVfdmFsaWQgd29ya3Mgb2theSBhbmQgd2UgZ290IHNhbmUgdmFsdWVzICovCisgIGlmICghbWFrZV9mdWxsX3BhdGggKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMtc3lzdGVtIiwgInN5c3RlbS5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgVkFMSUQpKQorICAgIGdvdG8gZmluaXNoOworICAvKiBjaGVjayB0byBzZWUgaWYgd2UgZ290IHRoZSBjb3JyZWN0IHZhbHVlcyBmcm9tIHRoZSBwYXJzZXIgKi8KKyAgaWYgKCFjaGVja19yZXR1cm5fdmFsdWVzICgmZnVsbF9wYXRoKSkKKyAgICBnb3RvIGZpbmlzaDsKKyNlbmRpZgorCisgIC8qIHdvb3QhICovCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgZXF1aXYtY29uZmlnLWZpbGVzIGFzIHdlIGRvbid0IGhhbmRsZSA8aW5jbHVkZT4gKi8KKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaCBiL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRkZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmggIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX1RSSVZJQUxfSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9UUklWSUFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisKKy8qIFdoYXRldmVyIFhNTCBsaWJyYXJ5IHdlJ3JlIHVzaW5nIGp1c3QgcHVzaGVzIGRhdGEgaW50byB0aGlzIEFQSSAqLworCit0eXBlZGVmIHN0cnVjdCBCdXNDb25maWdQYXJzZXIgQnVzQ29uZmlnUGFyc2VyOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX3JlZiAgICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOwordm9pZCAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAgICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50ICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworLyogRnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIHRoZSBwYXJzZSByZXN1bHRzICovCitjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CisKKy8qIExvYWRlciBmdW5jdGlvbnMgKGJhY2tlbmRlZCBvZmYgb25lIG9mIHRoZSBYTUwgcGFyc2VycykuICBSZXR1cm5zIGEKKyAqIGZpbmlzaGVkIENvbmZpZ1BhcnNlci4KKyAqLworQnVzQ29uZmlnUGFyc2VyKiBidXNfY29uZmlnX2xvYWQgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfVFJJVklBTF9IICovCmRpZmYgLS1naXQgYS9idXMvY29uZmlnLXBhcnNlci5jIGIvYnVzL2NvbmZpZy1wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY2MDQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXIuYwpAQCAtMCwwICsxLDM2OTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci5jICBYTUwtbGlicmFyeS1hZ25vc3RpYyBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLWNvbW1vbi5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWlzYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3R5cGVkZWYgZW51bQoreworICAvKiB3ZSBpZ25vcmUgcG9saWNpZXMgZm9yIHVua25vd24gZ3JvdXBzL3VzZXJzICovCisgIFBPTElDWV9JR05PUkVELAorCisgIC8qIG5vbi1pZ25vcmVkICovCisgIFBPTElDWV9ERUZBVUxULAorICBQT0xJQ1lfTUFOREFUT1JZLAorICBQT0xJQ1lfVVNFUiwKKyAgUE9MSUNZX0dST1VQLAorICBQT0xJQ1lfQ09OU09MRQorfSBQb2xpY3lUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGVtZW50VHlwZSB0eXBlOworCisgIHVuc2lnbmVkIGludCBoYWRfY29udGVudCA6IDE7CisKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpZ25vcmVfbWlzc2luZyA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgaWZfc2VsaW51eF9lbmFibGVkIDogMTsKKyAgICAgIHVuc2lnbmVkIGludCBzZWxpbnV4X3Jvb3RfcmVsYXRpdmUgOiAxOworICAgIH0gaW5jbHVkZTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIFBvbGljeVR5cGUgdHlwZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgZ2lkX3VpZF9vcl9hdF9jb25zb2xlOyAgICAgIAorICAgIH0gcG9saWN5OworCisgICAgc3RydWN0CisgICAgeworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGxvbmcgdmFsdWU7CisgICAgfSBsaW1pdDsKKyAgICAKKyAgfSBkOworCit9IEVsZW1lbnQ7CisKKy8qKgorICogUGFyc2VyIGZvciBidXMgY29uZmlndXJhdGlvbiBmaWxlLiAKKyAqLworc3RydWN0IEJ1c0NvbmZpZ1BhcnNlcgoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworCisgIERCdXNTdHJpbmcgYmFzZWRpcjsgIC8qKjwgRGlyZWN0b3J5IHdlIHJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gKi8KKyAgCisgIERCdXNMaXN0ICpzdGFjazsgICAgIC8qKjwgc3RhY2sgb2YgRWxlbWVudCAqLworCisgIGNoYXIgKnVzZXI7ICAgICAgICAgIC8qKjwgdXNlciB0byBydW4gYXMgKi8KKworICBjaGFyICpzZXJ2aWNlaGVscGVyOyAvKio8IGxvY2F0aW9uIG9mIHRoZSBzZXR1aWQgaGVscGVyICovCisKKyAgY2hhciAqYnVzX3R5cGU7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBidXMgdHlwZSAqLworICAKKyAgREJ1c0xpc3QgKmxpc3Rlbl9vbjsgLyoqPCBMaXN0IG9mIGFkZHJlc3NlcyB0byBsaXN0ZW4gdG8gKi8KKworICBEQnVzTGlzdCAqbWVjaGFuaXNtczsgLyoqPCBBdXRoIG1lY2hhbmlzbXMgKi8KKworICBEQnVzTGlzdCAqc2VydmljZV9kaXJzOyAvKio8IERpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIHNlc3Npb24gc2VydmljZXMgaW4gKi8KKworICBEQnVzTGlzdCAqY29uZl9kaXJzOyAgIC8qKjwgRGlyZWN0b3JpZXMgdG8gbG9vayBmb3IgcG9saWN5IGNvbmZpZ3VyYXRpb24gaW4gKi8KKworICBCdXNQb2xpY3kgKnBvbGljeTsgICAgIC8qKjwgU2VjdXJpdHkgcG9saWN5ICovCisKKyAgQnVzTGltaXRzIGxpbWl0czsgICAgICAvKio8IExpbWl0cyAqLworCisgIGNoYXIgKnBpZGZpbGU7ICAgICAgICAgLyoqPCBQSUQgZmlsZSAqLworCisgIERCdXNMaXN0ICppbmNsdWRlZF9maWxlczsgIC8qKjwgSW5jbHVkZWQgZmlsZXMgc3RhY2sgKi8KKworICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX2NvbnRleHRfdGFibGU7IC8qKjwgTWFwIHNlcnZpY2UgbmFtZXMgdG8gU0VMaW51eCBjb250ZXh0cyAqLworCisgIHVuc2lnbmVkIGludCBmb3JrIDogMTsgLyoqPCBUUlVFIHRvIGZvcmsgaW50byBkYWVtb24gbW9kZSAqLworCisgIHVuc2lnbmVkIGludCBzeXNsb2cgOiAxOyAvKio8IFRSVUUgdG8gZW5hYmxlIHN5c2xvZyAqLworICB1bnNpZ25lZCBpbnQga2VlcF91bWFzayA6IDE7IC8qKjwgVFJVRSB0byBrZWVwIG9yaWdpbmFsIHVtYXNrIHdoZW4gZm9ya2luZyAqLworCisgIHVuc2lnbmVkIGludCBpc190b3BsZXZlbCA6IDE7IC8qKjwgRkFMU0UgaWYgd2UgYXJlIGEgc3ViLWNvbmZpZy1maWxlIGluc2lkZSBhbm90aGVyIG9uZSAqLworCisgIHVuc2lnbmVkIGludCBhbGxvd19hbm9ueW1vdXMgOiAxOyAvKio8IFRSVUUgdG8gYWxsb3cgYW5vbnltb3VzIGNvbm5lY3Rpb25zICovCit9OworCitzdGF0aWMgRWxlbWVudCoKK3B1c2hfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgIEVsZW1lbnRUeXBlICAgICAgdHlwZSkKK3sKKyAgRWxlbWVudCAqZTsKKworICBfZGJ1c19hc3NlcnQgKHR5cGUgIT0gRUxFTUVOVF9OT05FKTsKKyAgCisgIGUgPSBkYnVzX25ldzAgKEVsZW1lbnQsIDEpOworICBpZiAoZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPnN0YWNrLCBlKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgZS0+dHlwZSA9IHR5cGU7CisKKyAgcmV0dXJuIGU7Cit9CisKK3N0YXRpYyB2b2lkCitlbGVtZW50X2ZyZWUgKEVsZW1lbnQgKmUpCit7CisgIGlmIChlLT50eXBlID09IEVMRU1FTlRfTElNSVQpCisgICAgZGJ1c19mcmVlIChlLT5kLmxpbWl0Lm5hbWUpOworICAKKyAgZGJ1c19mcmVlIChlKTsKK30KKworc3RhdGljIHZvaWQKK3BvcF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgRWxlbWVudCAqZTsKKworICBlID0gX2RidXNfbGlzdF9wb3BfbGFzdCAoJnBhcnNlci0+c3RhY2spOworICAKKyAgZWxlbWVudF9mcmVlIChlKTsKK30KKworc3RhdGljIEVsZW1lbnQqCitwZWVrX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBFbGVtZW50ICplOworCisgIGUgPSBfZGJ1c19saXN0X2dldF9sYXN0ICgmcGFyc2VyLT5zdGFjayk7CisKKyAgcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBFbGVtZW50VHlwZQordG9wX2VsZW1lbnRfdHlwZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgZSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZwYXJzZXItPnN0YWNrKTsKKworICBpZiAoZSkKKyAgICByZXR1cm4gZS0+dHlwZTsKKyAgZWxzZQorICAgIHJldHVybiBFTEVNRU5UX05PTkU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2ggKERCdXNIYXNoVGFibGUgKmRlc3QsCisJCQkgICAgREJ1c0hhc2hUYWJsZSAqZnJvbSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIGNoYXIgKnNlcnZpY2VfY29weTsKKyAgY2hhciAqY29udGV4dF9jb3B5OworCisgIHNlcnZpY2VfY29weSA9IE5VTEw7CisgIGNvbnRleHRfY29weSA9IE5VTEw7CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGZyb20sICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VydmljZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgY29uc3QgY2hhciAqY29udGV4dCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgc2VydmljZV9jb3B5ID0gX2RidXNfc3RyZHVwIChzZXJ2aWNlKTsKKyAgICAgIGlmIChzZXJ2aWNlX2NvcHkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgICAgY29udGV4dF9jb3B5ID0gX2RidXNfc3RyZHVwIChjb250ZXh0KTsKKyAgICAgIGlmIChjb250ZXh0X2NvcHkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOyAKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRlc3QsIHNlcnZpY2VfY29weSwgY29udGV4dF9jb3B5KSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgICBzZXJ2aWNlX2NvcHkgPSBOVUxMOworICAgICAgY29udGV4dF9jb3B5ID0gTlVMTDsgICAgCisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZmFpbDoKKyAgaWYgKHNlcnZpY2VfY29weSkKKyAgICBkYnVzX2ZyZWUgKHNlcnZpY2VfY29weSk7CisKKyAgaWYgKGNvbnRleHRfY29weSkKKyAgICBkYnVzX2ZyZWUgKGNvbnRleHRfY29weSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlcnZpY2VfZGlyc19maW5kX2RpciAoREJ1c0xpc3QgKipzZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChkaXIgIT0gTlVMTCk7CisKKyAgZm9yIChsaW5rID0gKnNlcnZpY2VfZGlyczsgbGluazsgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayhzZXJ2aWNlX2RpcnMsIGxpbmspKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmxpbmtfZGlyOworICAgICAgCisgICAgICBsaW5rX2RpciA9IChjb25zdCBjaGFyICopbGluay0+ZGF0YTsKKyAgICAgIGlmIChzdHJjbXAgKGRpciwgbGlua19kaXIpID09IDApCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VydmljZV9kaXJzX2FwcGVuZF91bmlxdWVfb3JfZnJlZSAoREJ1c0xpc3QgKipzZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkaXIpCit7CisgIGlmICghc2VydmljZV9kaXJzX2ZpbmRfZGlyIChzZXJ2aWNlX2RpcnMsIGRpcikpCisgICAgcmV0dXJuIF9kYnVzX2xpc3RfYXBwZW5kIChzZXJ2aWNlX2RpcnMsIGRpcik7ICAKKworICBkYnVzX2ZyZWUgKGRpcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCAKK3NlcnZpY2VfZGlyc19hcHBlbmRfbGlua191bmlxdWVfb3JfZnJlZSAoREJ1c0xpc3QgKipzZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICpkaXJfbGluaykKK3sKKyAgaWYgKCFzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKHNlcnZpY2VfZGlycywgZGlyX2xpbmstPmRhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKHNlcnZpY2VfZGlycywgZGlyX2xpbmspOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZGlyX2xpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGRpcl9saW5rKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWVyZ2VfaW5jbHVkZWQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICAgIEJ1c0NvbmZpZ1BhcnNlciAqaW5jbHVkZWQsCisgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgaWYgKCFidXNfcG9saWN5X21lcmdlIChwYXJzZXItPnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZC0+cG9saWN5KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIW1lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSwKKwkJCQkgICBpbmNsdWRlZC0+c2VydmljZV9jb250ZXh0X3RhYmxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChpbmNsdWRlZC0+dXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgIHBhcnNlci0+dXNlciA9IGluY2x1ZGVkLT51c2VyOworICAgICAgaW5jbHVkZWQtPnVzZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoaW5jbHVkZWQtPmJ1c190eXBlICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPmJ1c190eXBlKTsKKyAgICAgIHBhcnNlci0+YnVzX3R5cGUgPSBpbmNsdWRlZC0+YnVzX3R5cGU7CisgICAgICBpbmNsdWRlZC0+YnVzX3R5cGUgPSBOVUxMOworICAgIH0KKyAgCisgIGlmIChpbmNsdWRlZC0+Zm9yaykKKyAgICBwYXJzZXItPmZvcmsgPSBUUlVFOworCisgIGlmIChpbmNsdWRlZC0+a2VlcF91bWFzaykKKyAgICBwYXJzZXItPmtlZXBfdW1hc2sgPSBUUlVFOworCisgIGlmIChpbmNsdWRlZC0+YWxsb3dfYW5vbnltb3VzKQorICAgIHBhcnNlci0+YWxsb3dfYW5vbnltb3VzID0gVFJVRTsKKworICBpZiAoaW5jbHVkZWQtPnBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+cGlkZmlsZSk7CisgICAgICBwYXJzZXItPnBpZGZpbGUgPSBpbmNsdWRlZC0+cGlkZmlsZTsKKyAgICAgIGluY2x1ZGVkLT5waWRmaWxlID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGluY2x1ZGVkLT5zZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICAgICAgcGFyc2VyLT5zZXJ2aWNlaGVscGVyID0gaW5jbHVkZWQtPnNlcnZpY2VoZWxwZXI7CisgICAgICBpbmNsdWRlZC0+c2VydmljZWhlbHBlciA9IE5VTEw7CisgICAgfQorCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZpbmNsdWRlZC0+bGlzdGVuX29uKSkpCisgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJnBhcnNlci0+bGlzdGVuX29uLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPm1lY2hhbmlzbXMpKSkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmcGFyc2VyLT5tZWNoYW5pc21zLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPnNlcnZpY2VfZGlycykpKQorICAgIHNlcnZpY2VfZGlyc19hcHBlbmRfbGlua191bmlxdWVfb3JfZnJlZSAoJnBhcnNlci0+c2VydmljZV9kaXJzLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPmNvbmZfZGlycykpKQorICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZwYXJzZXItPmNvbmZfZGlycywgbGluayk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZWVuX2luY2x1ZGUgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKwkgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlKQoreworICBEQnVzTGlzdCAqaXRlcjsKKworICBpdGVyID0gcGFyc2VyLT5pbmNsdWRlZF9maWxlczsKKyAgd2hpbGUgKGl0ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBzdHJjbXAgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSksIGl0ZXItPmRhdGEpKQorCXJldHVybiBUUlVFOworCisgICAgICBpdGVyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGFyc2VyLT5pbmNsdWRlZF9maWxlcywgaXRlcik7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50KQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKworICBwYXJzZXIgPSBkYnVzX25ldzAgKEJ1c0NvbmZpZ1BhcnNlciwgMSk7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwYXJzZXItPmlzX3RvcGxldmVsID0gISFpc190b3BsZXZlbDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXJzZXItPmJhc2VkaXIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoKChwYXJzZXItPnBvbGljeSA9IGJ1c19wb2xpY3lfbmV3ICgpKSA9PSBOVUxMKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19jb3B5IChiYXNlZGlyLCAwLCAmcGFyc2VyLT5iYXNlZGlyLCAwKSB8fAorICAgICAgKChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorCQkJCQkJCSAgICAgIGRidXNfZnJlZSwKKwkJCQkJCQkgICAgICBkYnVzX2ZyZWUpKSA9PSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAocGFyc2VyLT5wb2xpY3kpCisgICAgICAgIGJ1c19wb2xpY3lfdW5yZWYgKHBhcnNlci0+cG9saWN5KTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPmJhc2VkaXIpOworCisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBhcnNlcidzIGxpbWl0cyBmcm9tIHRoZSBwYXJlbnQuICovCisgICAgICBwYXJzZXItPmxpbWl0cyA9IHBhcmVudC0+bGltaXRzOworCisgICAgICAvKiBVc2UgdGhlIHBhcmVudCdzIGxpc3Qgb2YgaW5jbHVkZWRfZmlsZXMgdG8gYXZvaWQKKwkgY2lyY3VsYXIgaW5jbHVzaW9ucy4gKi8KKyAgICAgIHBhcnNlci0+aW5jbHVkZWRfZmlsZXMgPSBwYXJlbnQtPmluY2x1ZGVkX2ZpbGVzOworICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgLyogTWFrZSB1cCBzb21lIG51bWJlcnMhIHdvb3QhICovCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMgPSBfREJVU19PTkVfTUVHQUJZVEUgKiAxMjc7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMgPSBfREJVU19PTkVfTUVHQUJZVEUgKiAxMjc7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWVzc2FnZV9zaXplID0gX0RCVVNfT05FX01FR0FCWVRFICogMzI7CisKKyAgICAgIC8qIFdlIHNldCByZWxhdGl2ZWx5IGNvbnNlcnZhdGl2ZSB2YWx1ZXMgaGVyZSBzaW5jZSBkdWUgdG8gdGhlCisgICAgICB3YXkgU0NNX1JJR0hUUyB3b3JrcyB3ZSBuZWVkIHRvIHByZWFsbG9jYXRlIGFuIGFycmF5IGZvciB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgd2UgY2FuIHJlY2VpdmUuIFBpY2tpbmcgYQorICAgICAgaGlnaCB2YWx1ZSBoZXJlIHRodXMgdHJhbnNsYXRlcyBkaXJlY3RseSB0byBtb3JlIG1lbW9yeQorICAgICAgYWxsb2NhdGlvbi4gKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbWluZ191bml4X2ZkcyA9IERCVVNfREVGQVVMVF9NRVNTQUdFX1VOSVhfRkRTKjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMgPSBEQlVTX0RFRkFVTFRfTUVTU0FHRV9VTklYX0ZEUyo0OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2VfdW5peF9mZHMgPSBEQlVTX0RFRkFVTFRfTUVTU0FHRV9VTklYX0ZEUzsKKyAgICAgIAorICAgICAgLyogTWFraW5nIHRoaXMgbG9uZyBtZWFucyB0aGUgdXNlciBoYXMgdG8gd2FpdCBsb25nZXIgZm9yIGFuIGVycm9yCisgICAgICAgKiBtZXNzYWdlIGlmIHNvbWV0aGluZyBzY3Jld3MgdXAsIGJ1dCBtYWtpbmcgaXQgdG9vIHNob3J0IG1lYW5zCisgICAgICAgKiB0aGV5IG1pZ2h0IHNlZSBhIGZhbHNlIGZhaWx1cmUuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLmFjdGl2YXRpb25fdGltZW91dCA9IDI1MDAwOyAvKiAyNSBzZWNvbmRzICovCisKKyAgICAgIC8qIE1ha2luZyB0aGlzIGxvbmcgcmlza3MgbWFraW5nIGEgRE9TIGF0dGFjayBlYXNpZXIsIGJ1dCB0b28gc2hvcnQKKyAgICAgICAqIGFuZCBsZWdpdGltYXRlIGF1dGggd2lsbCBmYWlsLiAgSWYgaW50ZXJhY3RpdmUgYXV0aCAoYXNrIHVzZXIgZm9yCisgICAgICAgKiBwYXNzd29yZCkgaXMgYWxsb3dlZCwgdGhlbiBwb3RlbnRpYWxseSBpdCBoYXMgdG8gYmUgcXVpdGUgbG9uZy4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMuYXV0aF90aW1lb3V0ID0gMzAwMDA7IC8qIDMwIHNlY29uZHMgKi8KKworICAgICAgLyogRG8gbm90IGFsbG93IGEgZmQgdG8gc3RheSBmb3JldmVyIGluIGRidXMtZGFlbW9uCisgICAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD04MDU1OQorICAgICAgICovCisgICAgICBwYXJzZXItPmxpbWl0cy5wZW5kaW5nX2ZkX3RpbWVvdXQgPSAxNTAwMDA7IC8qIDIuNSBtaW51dGVzICovCisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zID0gNjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPSAyNTY7CisgICAgICAKKyAgICAgIC8qIE5vdGUgdGhhdCBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIC8gbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgICAgKiBpcyB0aGUgbnVtYmVyIG9mIHVzZXJzIHRoYXQgd291bGQgaGF2ZSB0byB3b3JrIHRvZ2V0aGVyIHRvCisgICAgICAgKiBET1MgYWxsIHRoZSBvdGhlciB1c2Vycy4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyA9IDIwNDg7CisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID0gNTEyOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uID0gNTEyOworCisgICAgICAvKiBGb3IgdGhpcyBvbmUsIGtlZXAgaW4gbWluZCB0aGF0IGl0IGlzbid0IG9ubHkgdGhlIG1lbW9yeSB1c2VkCisgICAgICAgKiBieSB0aGUgbWF0Y2ggcnVsZXMsIGJ1dCBzbG93ZG93biBmcm9tIGxpbmVhcmx5IHdhbGtpbmcgYSBiaWcKKyAgICAgICAqIGxpc3Qgb2YgdGhlbS4gQSBjbGllbnQgYWRkaW5nIG1vcmUgdGhhbiB0aGlzIGlzIGFsbW9zdAorICAgICAgICogY2VydGFpbmx5IGEgYmFkIGlkZWEgZm9yIHRoYXQgcmVhc29uLCBhbmQgc2hvdWxkIGNoYW5nZSB0byBhCisgICAgICAgKiBzbWFsbGVyIG51bWJlciBvZiB3aWRlci1uZXQgbWF0Y2ggcnVsZXMgLSBnZXR0aW5nIGV2ZXJ5IGxhc3QKKyAgICAgICAqIG1lc3NhZ2UgdG8gdGhlIGJ1cyBpcyBwcm9iYWJseSBiZXR0ZXIgdGhhbiBoYXZpbmcgYSB0aG91c2FuZAorICAgICAgICogbWF0Y2ggcnVsZXMuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiA9IDUxMjsKKyAgICAgIAorICAgICAgcGFyc2VyLT5saW1pdHMucmVwbHlfdGltZW91dCA9IC0xOyAvKiBuZXZlciAqLworCisgICAgICAvKiB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgbGltaXQgb24gbWVzc2FnZSBxdWV1ZSBzaXplIGZvciBtZXNzYWdlcworICAgICAgICogdGhhdCByZXF1aXJlIGEgcmVwbHkKKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gPSAxMjg7CisgICAgfQorICAgICAgCisgIHBhcnNlci0+cmVmY291bnQgPSAxOworICAgICAgCisgIHJldHVybiBwYXJzZXI7Cit9CisKK0J1c0NvbmZpZ1BhcnNlciAqCitidXNfY29uZmlnX3BhcnNlcl9yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBhcnNlcjsKK30KKwordm9pZAorYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBhcnNlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICB3aGlsZSAocGFyc2VyLT5zdGFjayAhPSBOVUxMKQorICAgICAgICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnVzZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPmJ1c190eXBlKTsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5saXN0ZW5fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGFyc2VyLT5saXN0ZW5fb24pOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwYXJzZXItPnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwYXJzZXItPnNlcnZpY2VfZGlycyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+Y29uZl9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+Y29uZl9kaXJzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5tZWNoYW5pc21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+bWVjaGFuaXNtcyk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5iYXNlZGlyKTsKKworICAgICAgaWYgKHBhcnNlci0+cG9saWN5KQorICAgICAgICBidXNfcG9saWN5X3VucmVmIChwYXJzZXItPnBvbGljeSk7CisKKyAgICAgIGlmIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpkb2N0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc3RyY21wIChkb2N0eXBlLCAiYnVzY29uZmlnIikgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBoYXMgdGhlIHdyb25nIGRvY3VtZW50IHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRvY3R5cGUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICAqbmFtZTsKKyAgY29uc3QgY2hhciAqKnJldGxvYzsKK30gTG9jYXRlQXR0cjsKKworc3RhdGljIGRidXNfYm9vbF90Citsb2NhdGVfYXR0cmlidXRlcyAoQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaXJzdF9hdHRyaWJ1dGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKipmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jLAorICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICoqcmV0bG9jOworICBpbnQgbl9hdHRyczsKKyNkZWZpbmUgTUFYX0FUVFJTIDI0CisgIExvY2F0ZUF0dHIgYXR0cnNbTUFYX0FUVFJTXTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9uYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MgIT0gTlVMTCk7CisKKyAgcmV0dmFsID0gVFJVRTsKKworICBuX2F0dHJzID0gMTsKKyAgYXR0cnNbMF0ubmFtZSA9IGZpcnN0X2F0dHJpYnV0ZV9uYW1lOworICBhdHRyc1swXS5yZXRsb2MgPSBmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jOworICAqZmlyc3RfYXR0cmlidXRlX3JldGxvYyA9IE5VTEw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MpOworCisgIG5hbWUgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKTsKKyAgcmV0bG9jID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKiopOworCisgIHdoaWxlIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChyZXRsb2MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG5fYXR0cnMgPCBNQVhfQVRUUlMpOworCisgICAgICBhdHRyc1tuX2F0dHJzXS5uYW1lID0gbmFtZTsKKyAgICAgIGF0dHJzW25fYXR0cnNdLnJldGxvYyA9IHJldGxvYzsKKyAgICAgIG5fYXR0cnMgKz0gMTsKKyAgICAgICpyZXRsb2MgPSBOVUxMOworCisgICAgICBuYW1lID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICByZXRsb2MgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKik7CisgICAgfQorCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRyaWJ1dGVfbmFtZXNbaV0pCisgICAgeworICAgICAgaW50IGo7CisgICAgICBkYnVzX2Jvb2xfdCBmb3VuZDsKKyAgICAgIAorICAgICAgZm91bmQgPSBGQUxTRTsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCBuX2F0dHJzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXR0cnNbal0ubmFtZSwgYXR0cmlidXRlX25hbWVzW2ldKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXRsb2MgPSBhdHRyc1tqXS5yZXRsb2M7CisKKyAgICAgICAgICAgICAgaWYgKCpyZXRsb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIHJlcGVhdGVkIHR3aWNlIG9uIHRoZSBzYW1lIDwlcz4gZWxlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbal0ubmFtZSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICpyZXRsb2MgPSBhdHRyaWJ1dGVfdmFsdWVzW2ldOworICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIGlzIGludmFsaWQgb24gPCVzPiBlbGVtZW50IGluIHRoaXMgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lc1tpXSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX2F0dHJpYnV0ZXMgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKGF0dHJpYnV0ZV9uYW1lc1swXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBcIiVzXCIgaXMgaW52YWxpZCBvbiA8JXM+IGVsZW1lbnQgaW4gdGhpcyBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXNbMF0sIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X2J1c2NvbmZpZ19jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgRWxlbWVudFR5cGUgZWxlbWVudF90eXBlOworCisgIGVsZW1lbnRfdHlwZSA9IGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChlbGVtZW50X25hbWUpOworCisgIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9VU0VSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidXNlciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9VU0VSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9DT05GSUdUWVBFKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidHlwZSIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9DT05GSUdUWVBFKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9GT1JLKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiZm9yayIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9GT1JLKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5mb3JrID0gVFJVRTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TWVNMT0cpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzeXNsb2ciLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1lTTE9HKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcGFyc2VyLT5zeXNsb2cgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0tFRVBfVU1BU0spCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJrZWVwX3VtYXNrIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0tFRVBfVU1BU0spID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBwYXJzZXItPmtlZXBfdW1hc2sgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1BJREZJTEUpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJwaWRmaWxlIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1BJREZJTEUpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJU1RFTikKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImxpc3RlbiIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSVNURU4pID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FVVEgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJhdXRoIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0FVVEgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZXJ2aWNlaGVscGVyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0lOQ0xVREVESVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJpbmNsdWRlZGlyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0lOQ0xVREVESVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgIGRpcnMgPSBOVUxMOworCisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSUykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICAgICAgICBzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgbGluayk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgREJ1c0xpc3QgKmRpcnM7CisgICAgICBkaXJzID0gTlVMTDsKKworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUykKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImFsbG93X2Fub255bW91cyIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BTExPV19BTk9OWU1PVVMpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBwYXJzZXItPmFsbG93X2Fub255bW91cyA9IFRSVUU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFUlZJQ0VESVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZXJ2aWNlZGlyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFUlZJQ0VESVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0lOQ0xVREUpCisgICAgeworICAgICAgRWxlbWVudCAqZTsKKyAgICAgIGNvbnN0IGNoYXIgKmlmX3NlbGludXhfZW5hYmxlZDsKKyAgICAgIGNvbnN0IGNoYXIgKmlnbm9yZV9taXNzaW5nOworICAgICAgY29uc3QgY2hhciAqc2VsaW51eF9yb290X3JlbGF0aXZlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9JTkNMVURFKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IEZBTFNFOworICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IEZBTFNFOworICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IEZBTFNFOworCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJpbmNsdWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVfbWlzc2luZyIsICZpZ25vcmVfbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZl9zZWxpbnV4X2VuYWJsZWQiLCAmaWZfc2VsaW51eF9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGludXhfcm9vdF9yZWxhdGl2ZSIsICZzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoaWdub3JlX21pc3NpbmcgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGlnbm9yZV9taXNzaW5nLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChpZ25vcmVfbWlzc2luZywgIm5vIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZyA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVfbWlzc2luZyBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIFwieWVzXCIgb3IgXCJub1wiIik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoaWZfc2VsaW51eF9lbmFibGVkICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChpZl9zZWxpbnV4X2VuYWJsZWQsICJ5ZXMiKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChpZl9zZWxpbnV4X2VuYWJsZWQsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWZfc2VsaW51eF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmX3NlbGludXhfZW5hYmxlZCBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoc2VsaW51eF9yb290X3JlbGF0aXZlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsICJ5ZXMiKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWxpbnV4X3Jvb3RfcmVsYXRpdmUsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuc2VsaW51eF9yb290X3JlbGF0aXZlID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGludXhfcm9vdF9yZWxhdGl2ZSBhdHRyaWJ1dGUgbXVzdCBoYXZlIHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1BPTElDWSkKKyAgICB7CisgICAgICBFbGVtZW50ICplOworICAgICAgY29uc3QgY2hhciAqY29udGV4dDsKKyAgICAgIGNvbnN0IGNoYXIgKnVzZXI7CisgICAgICBjb25zdCBjaGFyICpncm91cDsKKyAgICAgIGNvbnN0IGNoYXIgKmF0X2NvbnNvbGU7CisKKyAgICAgIGlmICgoZSA9IHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1BPTElDWSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX0lHTk9SRUQ7CisgICAgICAKKyAgICAgIGlmICghbG9jYXRlX2F0dHJpYnV0ZXMgKHBhcnNlciwgInBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCIsICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXIiLCAmdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCIsICZncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdF9jb25zb2xlIiwgJmF0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoKChjb250ZXh0ICYmIHVzZXIpIHx8CisgICAgICAgICAgIChjb250ZXh0ICYmIGdyb3VwKSB8fAorICAgICAgICAgICAoY29udGV4dCAmJiBhdF9jb25zb2xlKSkgfHwKKyAgICAgICAgICAgKCh1c2VyICYmIGdyb3VwKSB8fAorICAgICAgICAgICAodXNlciAmJiBhdF9jb25zb2xlKSkgfHwKKyAgICAgICAgICAgKGdyb3VwICYmIGF0X2NvbnNvbGUpIHx8CisgICAgICAgICAgIShjb250ZXh0IHx8IHVzZXIgfHwgZ3JvdXAgfHwgYXRfY29uc29sZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBvbGljeT4gZWxlbWVudCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgb2YgKGNvbnRleHR8dXNlcnxncm91cHxhdF9jb25zb2xlKSBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChjb250ZXh0LCAiZGVmYXVsdCIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGUtPmQucG9saWN5LnR5cGUgPSBQT0xJQ1lfREVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKGNvbnRleHQsICJtYW5kYXRvcnkiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX01BTkRBVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCBhdHRyaWJ1dGUgb24gPHBvbGljeT4gbXVzdCBoYXZlIHRoZSB2YWx1ZSBcImRlZmF1bHRcIiBvciBcIm1hbmRhdG9yeVwiLCBub3QgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHVzZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdXNlcm5hbWU7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1c2VybmFtZSwgdXNlcik7CisKKyAgICAgICAgICBpZiAoX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnICgmdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkpCisgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX1VTRVI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gdXNlcm5hbWUgXCIlc1wiIGluIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChncm91cCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBncm91cF9uYW1lOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZ3JvdXBfbmFtZSwgZ3JvdXApOworCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKCZncm91cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlKSkKKyAgICAgICAgICAgIGUtPmQucG9saWN5LnR5cGUgPSBQT0xJQ1lfR1JPVVA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gZ3JvdXAgXCIlc1wiIGluIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGF0X2NvbnNvbGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBkYnVzX2Jvb2xfdCB0OworICAgICAgICAgICB0ID0gKHN0cmNtcCAoYXRfY29uc29sZSwgInRydWUiKSA9PSAwKTsKKyAgICAgICAgICAgaWYgKHQgfHwgc3RyY21wIChhdF9jb25zb2xlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSA9IHQ7IAorICAgICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9DT05TT0xFOworICAgICAgICAgICAgIH0gIAorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHZhbHVlIFwiJXNcIiBmb3IgYXRfY29uc29sZSBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRfY29uc29sZSk7CisKKyAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImFsbCA8cG9saWN5PiBhdHRyaWJ1dGVzIG51bGwgYW5kIHdlIGRpZG4ndCBzZXQgZXJyb3IiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSU1JVCkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQ+IGVsZW1lbnQgbXVzdCBoYXZlIGEgXCJuYW1lXCIgYXR0cmlidXRlIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGUtPmQubGltaXQubmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgICAgICBpZiAoZS0+ZC5saW1pdC5uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFTElOVVgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZWxpbnV4IiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFTElOVVgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FQUEFSTU9SKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICptb2RlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BUFBBUk1PUikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJhcHBhcm1vciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZSIsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcmV0dXJuIGJ1c19hcHBhcm1vcl9zZXRfbW9kZV9mcm9tX2NvbmZpZyAobW9kZSwgZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBub3QgYWxsb3dlZCBpbnNpZGUgPCVzPiBpbiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSwgImJ1c2NvbmZpZyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CithcHBlbmRfcnVsZV9mcm9tX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgYWxsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbG9nOworICBjb25zdCBjaGFyICpzZW5kX2ludGVyZmFjZTsKKyAgY29uc3QgY2hhciAqc2VuZF9tZW1iZXI7CisgIGNvbnN0IGNoYXIgKnNlbmRfZXJyb3I7CisgIGNvbnN0IGNoYXIgKnNlbmRfZGVzdGluYXRpb247CisgIGNvbnN0IGNoYXIgKnNlbmRfcGF0aDsKKyAgY29uc3QgY2hhciAqc2VuZF90eXBlOworICBjb25zdCBjaGFyICpyZWNlaXZlX2ludGVyZmFjZTsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9tZW1iZXI7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfZXJyb3I7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfc2VuZGVyOworICBjb25zdCBjaGFyICpyZWNlaXZlX3BhdGg7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfdHlwZTsKKyAgY29uc3QgY2hhciAqZWF2ZXNkcm9wOworICBjb25zdCBjaGFyICpzZW5kX3JlcXVlc3RlZF9yZXBseTsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHk7CisgIGNvbnN0IGNoYXIgKm93bjsKKyAgY29uc3QgY2hhciAqb3duX3ByZWZpeDsKKyAgY29uc3QgY2hhciAqdXNlcjsKKyAgY29uc3QgY2hhciAqZ3JvdXA7CisKKyAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKyAgCisgIGlmICghbG9jYXRlX2F0dHJpYnV0ZXMgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9pbnRlcmZhY2UiLCAmc2VuZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX21lbWJlciIsICZzZW5kX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfZXJyb3IiLCAmc2VuZF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfZGVzdGluYXRpb24iLCAmc2VuZF9kZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfcGF0aCIsICZzZW5kX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX3R5cGUiLCAmc2VuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9pbnRlcmZhY2UiLCAmcmVjZWl2ZV9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX21lbWJlciIsICZyZWNlaXZlX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfZXJyb3IiLCAmcmVjZWl2ZV9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfc2VuZGVyIiwgJnJlY2VpdmVfc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9wYXRoIiwgJnJlY2VpdmVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfdHlwZSIsICZyZWNlaXZlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCAmZWF2ZXNkcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9yZXF1ZXN0ZWRfcmVwbHkiLCAmc2VuZF9yZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSIsICZyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm93biIsICZvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvd25fcHJlZml4IiwgJm93bl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyIiwgJnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCIsICZncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZyIsICZsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIShzZW5kX2ludGVyZmFjZSB8fCBzZW5kX21lbWJlciB8fCBzZW5kX2Vycm9yIHx8IHNlbmRfZGVzdGluYXRpb24gfHwKKyAgICAgICAgc2VuZF90eXBlIHx8IHNlbmRfcGF0aCB8fAorICAgICAgICByZWNlaXZlX2ludGVyZmFjZSB8fCByZWNlaXZlX21lbWJlciB8fCByZWNlaXZlX2Vycm9yIHx8IHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgIHJlY2VpdmVfdHlwZSB8fCByZWNlaXZlX3BhdGggfHwgZWF2ZXNkcm9wIHx8CisgICAgICAgIHNlbmRfcmVxdWVzdGVkX3JlcGx5IHx8IHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8IHVzZXIgfHwgZ3JvdXApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBtdXN0IGhhdmUgb25lIG9yIG1vcmUgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKChzZW5kX21lbWJlciAmJiAoc2VuZF9pbnRlcmZhY2UgPT0gTlVMTCAmJiBzZW5kX3BhdGggPT0gTlVMTCkpIHx8CisgICAgICAocmVjZWl2ZV9tZW1iZXIgJiYgKHJlY2VpdmVfaW50ZXJmYWNlID09IE5VTEwgJiYgcmVjZWl2ZV9wYXRoID09IE5VTEwpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJPbiBlbGVtZW50IDwlcz4sIGlmIHlvdSBzcGVjaWZ5IGEgbWVtYmVyIHlvdSBtdXN0IHNwZWNpZnkgYW4gaW50ZXJmYWNlIG9yIGEgcGF0aC4gS2VlcCBpbiBtaW5kIHRoYXQgbm90IGFsbCBtZXNzYWdlcyBoYXZlIGFuIGludGVyZmFjZSBmaWVsZC4iLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogQWxsb3dlZCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgYXJlOgorICAgKgorICAgKiAgIGJhc2UsIG11c3QgYmUgYWxsIHNlbmQgb3IgYWxsIHJlY2VpdmU6CisgICAqICAgICBub3RoaW5nCisgICAqICAgICBpbnRlcmZhY2UKKyAgICogICAgIGludGVyZmFjZSArIG1lbWJlcgorICAgKiAgICAgZXJyb3IKKyAgICogCisgICAqICAgYmFzZSBzZW5kXyBjYW4gY29tYmluZSB3aXRoIHNlbmRfZGVzdGluYXRpb24sIHNlbmRfcGF0aCwgc2VuZF90eXBlLCBzZW5kX3JlcXVlc3RlZF9yZXBseQorICAgKiAgIGJhc2UgcmVjZWl2ZV8gd2l0aCByZWNlaXZlX3NlbmRlciwgcmVjZWl2ZV9wYXRoLCByZWNlaXZlX3R5cGUsIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LCBlYXZlc2Ryb3AKKyAgICoKKyAgICogICB1c2VyLCBncm91cCwgb3duLCBvd25fcHJlZml4IG11c3Qgb2NjdXIgYWxvbmUKKyAgICoKKyAgICogUHJldHR5IHN1cmUgdGhlIGJlbG93IHN0dWZmIGlzIGJyb2tlbiwgRklYTUUgdGhpbmsgYWJvdXQgaXQgbW9yZS4KKyAgICovCisKKyAgaWYgKChzZW5kX2ludGVyZmFjZSAmJiAoc2VuZF9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoc2VuZF9tZW1iZXIgJiYgKHNlbmRfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9pbnRlcmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfZXJyb3IgJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfZGVzdGluYXRpb24gJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfdHlwZSAmJiAocmVjZWl2ZV9pbnRlcmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChzZW5kX3BhdGggJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkgJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChyZWNlaXZlX2ludGVyZmFjZSAmJiAocmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHJlY2VpdmVfbWVtYmVyICYmIChyZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9lcnJvciAmJiAob3duIHx8IG93bl9wcmVmaXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoZWF2ZXNkcm9wICYmIChvd24gfHwgb3duX3ByZWZpeCB8fAorICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgJiYgKG93biB8fCBvd25fcHJlZml4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAob3duICYmIChvd25fcHJlZml4IHx8IHVzZXIgfHwgZ3JvdXApKSB8fAorCisgICAgICAob3duX3ByZWZpeCAmJiAob3duIHx8IHVzZXIgfHwgZ3JvdXApKSB8fAorCisgICAgICAodXNlciAmJiBncm91cCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGVzIG9uIGVsZW1lbnQgPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBydWxlID0gTlVMTDsKKworICAvKiBJbiBCdXNQb2xpY3lSdWxlLCBOVUxMIHJlcHJlc2VudHMgd2lsZGNhcmQuCisgICAqIEluIHRoZSBjb25maWcgZmlsZSwgJyonIHJlcHJlc2VudHMgaXQuCisgICAqLworI2RlZmluZSBJU19XSUxEQ0FSRChzdHIpICgoc3RyKSAmJiAoKHN0cilbMF0pID09ICcqJyAmJiAoKHN0cilbMV0pID09ICdcMCcpCisKKyAgaWYgKHNlbmRfaW50ZXJmYWNlIHx8IHNlbmRfbWVtYmVyIHx8IHNlbmRfZXJyb3IgfHwgc2VuZF9kZXN0aW5hdGlvbiB8fAorICAgICAgc2VuZF9wYXRoIHx8IHNlbmRfdHlwZSB8fCBzZW5kX3JlcXVlc3RlZF9yZXBseSkKKyAgICB7CisgICAgICBpbnQgbWVzc2FnZV90eXBlOworICAgICAgCisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfaW50ZXJmYWNlKSkKKyAgICAgICAgc2VuZF9pbnRlcmZhY2UgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX21lbWJlcikpCisgICAgICAgIHNlbmRfbWVtYmVyID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9lcnJvcikpCisgICAgICAgIHNlbmRfZXJyb3IgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX2Rlc3RpbmF0aW9uKSkKKyAgICAgICAgc2VuZF9kZXN0aW5hdGlvbiA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfcGF0aCkpCisgICAgICAgIHNlbmRfcGF0aCA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfdHlwZSkpCisgICAgICAgIHNlbmRfdHlwZSA9IE5VTEw7CisKKyAgICAgIG1lc3NhZ2VfdHlwZSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7CisgICAgICBpZiAoc2VuZF90eXBlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoc2VuZF90eXBlKTsKKyAgICAgICAgICBpZiAobWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIG1lc3NhZ2UgdHlwZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90eXBlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChlYXZlc2Ryb3AgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZWF2ZXNkcm9wLCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCBlYXZlc2Ryb3ApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChzZW5kX3JlcXVlc3RlZF9yZXBseSwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9yZXF1ZXN0ZWRfcmVwbHkiLCBzZW5kX3JlcXVlc3RlZF9yZXBseSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfU0VORCwgYWxsb3cpOyAKKyAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAKKyAgICAgIGlmIChlYXZlc2Ryb3ApCisgICAgICAgIHJ1bGUtPmQuc2VuZC5lYXZlc2Ryb3AgPSAoc3RyY21wIChlYXZlc2Ryb3AsICJ0cnVlIikgPT0gMCk7CisKKyAgICAgIGlmIChsb2cpCisgICAgICAgIHJ1bGUtPmQuc2VuZC5sb2cgPSAoc3RyY21wIChsb2csICJ0cnVlIikgPT0gMCk7CisKKyAgICAgIGlmIChzZW5kX3JlcXVlc3RlZF9yZXBseSkKKyAgICAgICAgcnVsZS0+ZC5zZW5kLnJlcXVlc3RlZF9yZXBseSA9IChzdHJjbXAgKHNlbmRfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDApOworCisgICAgICBydWxlLT5kLnNlbmQubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlOworICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPSBfZGJ1c19zdHJkdXAgKHNlbmRfcGF0aCk7CisgICAgICBydWxlLT5kLnNlbmQuaW50ZXJmYWNlID0gX2RidXNfc3RyZHVwIChzZW5kX2ludGVyZmFjZSk7CisgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID0gX2RidXNfc3RyZHVwIChzZW5kX21lbWJlcik7CisgICAgICBydWxlLT5kLnNlbmQuZXJyb3IgPSBfZGJ1c19zdHJkdXAgKHNlbmRfZXJyb3IpOworICAgICAgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uID0gX2RidXNfc3RyZHVwIChzZW5kX2Rlc3RpbmF0aW9uKTsKKyAgICAgIGlmIChzZW5kX3BhdGggJiYgcnVsZS0+ZC5zZW5kLnBhdGggPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChzZW5kX2ludGVyZmFjZSAmJiBydWxlLT5kLnNlbmQuaW50ZXJmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAoc2VuZF9tZW1iZXIgJiYgcnVsZS0+ZC5zZW5kLm1lbWJlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfZXJyb3IgJiYgcnVsZS0+ZC5zZW5kLmVycm9yID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAoc2VuZF9kZXN0aW5hdGlvbiAmJiBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIGVsc2UgaWYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8IHJlY2VpdmVfbWVtYmVyIHx8IHJlY2VpdmVfZXJyb3IgfHwgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgcmVjZWl2ZV9wYXRoIHx8IHJlY2VpdmVfdHlwZSB8fCBlYXZlc2Ryb3AgfHwgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgeworICAgICAgaW50IG1lc3NhZ2VfdHlwZTsKKyAgICAgIAorICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX2ludGVyZmFjZSkpCisgICAgICAgIHJlY2VpdmVfaW50ZXJmYWNlID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAocmVjZWl2ZV9tZW1iZXIpKQorICAgICAgICByZWNlaXZlX21lbWJlciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfZXJyb3IpKQorICAgICAgICByZWNlaXZlX2Vycm9yID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAocmVjZWl2ZV9zZW5kZXIpKQorICAgICAgICByZWNlaXZlX3NlbmRlciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfcGF0aCkpCisgICAgICAgIHJlY2VpdmVfcGF0aCA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfdHlwZSkpCisgICAgICAgIHJlY2VpdmVfdHlwZSA9IE5VTEw7CisKKyAgICAgIG1lc3NhZ2VfdHlwZSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7CisgICAgICBpZiAocmVjZWl2ZV90eXBlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAocmVjZWl2ZV90eXBlKTsKKyAgICAgICAgICBpZiAobWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIG1lc3NhZ2UgdHlwZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV90eXBlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgaWYgKGVhdmVzZHJvcCAmJgorICAgICAgICAgICEoc3RyY21wIChlYXZlc2Ryb3AsICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChlYXZlc2Ryb3AsICJmYWxzZSIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCB2YWx1ZSBcIiVzXCIgZm9yICVzIGF0dHJpYnV0ZSwgbXVzdCBiZSB0cnVlIG9yIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVhdmVzZHJvcCIsIGVhdmVzZHJvcCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSAmJgorICAgICAgICAgICEoc3RyY21wIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwgInRydWUiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSIsIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFLCBhbGxvdyk7IAorICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKworICAgICAgaWYgKGVhdmVzZHJvcCkKKyAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmVhdmVzZHJvcCA9IChzdHJjbXAgKGVhdmVzZHJvcCwgInRydWUiKSA9PSAwKTsKKworICAgICAgaWYgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5KQorICAgICAgICBydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5ID0gKHN0cmNtcCAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCk7CisgICAgICAKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGU7CisgICAgICBydWxlLT5kLnJlY2VpdmUucGF0aCA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9wYXRoKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5pbnRlcmZhY2UgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfaW50ZXJmYWNlKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfbWVtYmVyKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9lcnJvcik7CisgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX3NlbmRlcik7CisKKyAgICAgIGlmIChyZWNlaXZlX3BhdGggJiYgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChyZWNlaXZlX2ludGVyZmFjZSAmJiBydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9tZW1iZXIgJiYgcnVsZS0+ZC5yZWNlaXZlLm1lbWJlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfZXJyb3IgJiYgcnVsZS0+ZC5yZWNlaXZlLmVycm9yID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9zZW5kZXIgJiYgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbiA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgZWxzZSBpZiAob3duIHx8IG93bl9wcmVmaXgpCisgICAgeworICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9PV04sIGFsbG93KTsgCisgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICBpZiAob3duKQorICAgICAgICB7CisgICAgICAgICAgaWYgKElTX1dJTERDQVJEIChvd24pKQorICAgICAgICAgICAgb3duID0gTlVMTDsKKyAgICAgIAorICAgICAgICAgIHJ1bGUtPmQub3duLnByZWZpeCA9IDA7CisgICAgICAgICAgcnVsZS0+ZC5vd24uc2VydmljZV9uYW1lID0gX2RidXNfc3RyZHVwIChvd24pOworICAgICAgICAgIGlmIChvd24gJiYgcnVsZS0+ZC5vd24uc2VydmljZV9uYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBydWxlLT5kLm93bi5wcmVmaXggPSAxOworICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9IF9kYnVzX3N0cmR1cCAob3duX3ByZWZpeCk7CisgICAgICAgICAgaWYgKHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAodXNlcikKKyAgICB7ICAgICAgCisgICAgICBpZiAoSVNfV0lMRENBUkQgKHVzZXIpKQorICAgICAgICB7CisgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9VU0VSLCBhbGxvdyk7IAorICAgICAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgIGRidXNfdWlkX3QgdWlkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdXNlcm5hbWUsIHVzZXIpOworICAgICAgCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoJnVzZXJuYW1lLCAmdWlkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9VU0VSLCBhbGxvdyk7IAorICAgICAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IHVpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmtub3duIHVzZXJuYW1lIFwiJXNcIiBvbiBlbGVtZW50IDwlcz5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKGdyb3VwKQorICAgIHsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoZ3JvdXApKQorICAgICAgICB7CisgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9HUk9VUCwgYWxsb3cpOyAKKyAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIHJ1bGUtPmQuZ3JvdXAuZ2lkID0gREJVU19HSURfVU5TRVQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZ3JvdXBuYW1lOworICAgICAgICAgIGRidXNfZ2lkX3QgZ2lkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZ3JvdXBuYW1lLCBncm91cCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKCZncm91cG5hbWUsICZnaWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBydWxlID0gYnVzX3BvbGljeV9ydWxlX25ldyAoQlVTX1BPTElDWV9SVUxFX0dST1VQLCBhbGxvdyk7IAorICAgICAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICAgICAgcnVsZS0+ZC5ncm91cC5naWQgPSBnaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5rbm93biBncm91cCBcIiVzXCIgb24gZWxlbWVudCA8JXM+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBub3QgaGFuZGxlIHNvbWUgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBvbiA8YWxsb3c+IG9yIDxkZW55PiIpOworCisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgRWxlbWVudCAqcGU7CisgICAgICAKKyAgICAgIHBlID0gcGVla19lbGVtZW50IChwYXJzZXIpOyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChwZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocGUtPnR5cGUgPT0gRUxFTUVOVF9QT0xJQ1kpOworCisgICAgICBzd2l0Y2ggKHBlLT5kLnBvbGljeS50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUE9MSUNZX0lHTk9SRUQ6CisgICAgICAgICAgLyogZHJvcCB0aGUgcnVsZSBvbiB0aGUgZmxvb3IgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBQT0xJQ1lfREVGQVVMVDoKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX2RlZmF1bHRfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHJ1bGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT0xJQ1lfTUFOREFUT1JZOgorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKHBhcnNlci0+cG9saWN5LCBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE9MSUNZX1VTRVI6CisgICAgICAgICAgaWYgKCFCVVNfUE9MSUNZX1JVTEVfSVNfUEVSX0NMSUVOVCAocnVsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCVzPiBydWxlIGNhbm5vdCBiZSBwZXItdXNlciBiZWNhdXNlIGl0IGhhcyBidXMtZ2xvYmFsIHNlbWFudGljcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX3VzZXJfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHBlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT0xJQ1lfR1JPVVA6CisgICAgICAgICAgaWYgKCFCVVNfUE9MSUNZX1JVTEVfSVNfUEVSX0NMSUVOVCAocnVsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCVzPiBydWxlIGNhbm5vdCBiZSBwZXItZ3JvdXAgYmVjYXVzZSBpdCBoYXMgYnVzLWdsb2JhbCBzZW1hbnRpY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9ncm91cF9ydWxlIChwYXJzZXItPnBvbGljeSwgcGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgCisKKyAgICAgICAgY2FzZSBQT0xJQ1lfQ09OU09MRToKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX2NvbnNvbGVfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHBlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIAorICAgICAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgIHJ1bGUgPSBOVUxMOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgZmFpbGVkOgorICBpZiAocnVsZSkKKyAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RhcnRfcG9saWN5X2NoaWxkIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBpZiAoc3RyY21wIChlbGVtZW50X25hbWUsICJhbGxvdyIpID09IDApCisgICAgeworICAgICAgaWYgKCFhcHBlbmRfcnVsZV9mcm9tX2VsZW1lbnQgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0FMTE9XKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImRlbnkiKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50IChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfREVOWSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBub3QgYWxsb3dlZCBpbnNpZGUgPCVzPiBpbiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSwgInBvbGljeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdGFydF9zZWxpbnV4X2NoaWxkIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqb3duX2NvcHk7CisgIGNoYXIgKmNvbnRleHRfY29weTsKKworICBvd25fY29weSA9IE5VTEw7CisgIGNvbnRleHRfY29weSA9IE5VTEw7CisKKyAgaWYgKHN0cmNtcCAoZWxlbWVudF9uYW1lLCAiYXNzb2NpYXRlIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpvd247CisgICAgICBjb25zdCBjaGFyICpjb250ZXh0OworICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJhc3NvY2lhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm93biIsICZvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dCIsICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0FTU09DSUFURSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChvd24gPT0gTlVMTCB8fCBjb250ZXh0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8YXNzb2NpYXRlPiBtdXN0IGhhdmUgYXR0cmlidXRlcyBvd249XCI8c2VydmljZW5hbWU+XCIgYW5kIGNvbnRleHQ9XCI8c2VsaW51eCBjb250ZXh0PlwiIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIG93bl9jb3B5ID0gX2RidXNfc3RyZHVwIChvd24pOworICAgICAgaWYgKG93bl9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworICAgICAgY29udGV4dF9jb3B5ID0gX2RidXNfc3RyZHVwIChjb250ZXh0KTsKKyAgICAgIGlmIChjb250ZXh0X2NvcHkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSwKKwkJCQkJICAgb3duX2NvcHksIGNvbnRleHRfY29weSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gbm90IGFsbG93ZWQgaW5zaWRlIDwlcz4gaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsICJzZWxpbnV4Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgb29tOgorICBpZiAob3duX2NvcHkpCisgICAgZGJ1c19mcmVlIChvd25fY29weSk7CisKKyAgaWYgKGNvbnRleHRfY29weSkgIAorICAgIGRidXNfZnJlZSAoY29udGV4dF9jb3B5KTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgRWxlbWVudFR5cGUgdDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBwcmludGYgKCJTVEFSVDogJXNcbiIsIGVsZW1lbnRfbmFtZSk7ICovCisgIAorICB0ID0gdG9wX2VsZW1lbnRfdHlwZSAocGFyc2VyKTsKKworICBpZiAodCA9PSBFTEVNRU5UX05PTkUpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoZWxlbWVudF9uYW1lLCAiYnVzY29uZmlnIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiYnVzY29uZmlnIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0JVU0NPTkZJRykgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGVsZW1lbnQgPCVzPiBhdCByb290IG9mIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmICh0ID09IEVMRU1FTlRfQlVTQ09ORklHKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFydF9idXNjb25maWdfY2hpbGQgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAodCA9PSBFTEVNRU5UX1BPTElDWSkKKyAgICB7CisgICAgICByZXR1cm4gc3RhcnRfcG9saWN5X2NoaWxkIChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgIGVsc2UgaWYgKHQgPT0gRUxFTUVOVF9TRUxJTlVYKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFydF9zZWxpbnV4X2NoaWxkIChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X2xpbWl0IChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lLAorICAgICAgICAgICBsb25nICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCBtdXN0X2JlX3Bvc2l0aXZlOworICBkYnVzX2Jvb2xfdCBtdXN0X2JlX2ludDsKKworICBtdXN0X2JlX2ludCA9IEZBTFNFOworICBtdXN0X2JlX3Bvc2l0aXZlID0gRkFMU0U7CisgIAorICBpZiAoc3RyY21wIChuYW1lLCAibWF4X2luY29taW5nX2J5dGVzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbWluZ19ieXRlcyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2luY29taW5nX3VuaXhfZmRzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbWluZ191bml4X2ZkcyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X291dGdvaW5nX2J5dGVzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9vdXRnb2luZ19ieXRlcyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X291dGdvaW5nX3VuaXhfZmRzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9vdXRnb2luZ191bml4X2ZkcyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X21lc3NhZ2Vfc2l6ZSIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWVzc2FnZV9zaXplID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfbWVzc2FnZV91bml4X2ZkcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWVzc2FnZV91bml4X2ZkcyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2VydmljZV9zdGFydF90aW1lb3V0IikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLmFjdGl2YXRpb25fdGltZW91dCA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aF90aW1lb3V0IikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLmF1dGhfdGltZW91dCA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicGVuZGluZ19mZF90aW1lb3V0IikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLnBlbmRpbmdfZmRfdGltZW91dCA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicmVwbHlfdGltZW91dCIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5yZXBseV90aW1lb3V0ID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24iKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBpcyBubyBsaW1pdCBjYWxsZWQgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChtdXN0X2JlX3Bvc2l0aXZlICYmIHZhbHVlIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQgbmFtZT1cIiVzXCI+IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtdXN0X2JlX2ludCAmJgorICAgICAgKHZhbHVlIDwgX0RCVVNfSU5UX01JTiB8fCB2YWx1ZSA+IF9EQlVTX0lOVF9NQVgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIjxsaW1pdCBuYW1lPVwiJXNcIj4gdmFsdWUgaXMgdG9vIGxhcmdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsgIAorfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnRUeXBlIHQ7CisgIGNvbnN0IGNoYXIgKm47CisgIEVsZW1lbnQgKmU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogcHJpbnRmICgiRU5EOiAlc1xuIiwgZWxlbWVudF9uYW1lKTsgKi8KKyAgCisgIHQgPSB0b3BfZWxlbWVudF90eXBlIChwYXJzZXIpOworCisgIGlmICh0ID09IEVMRU1FTlRfTk9ORSkKKyAgICB7CisgICAgICAvKiBzaG91bGQgcHJvYmFibHkgYmUgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgYnV0CisgICAgICAgKiBiZWluZyBwYXJhbm9pZCBhYm91dCBYTUwgcGFyc2VycworICAgICAgICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJYTUwgcGFyc2VyIGVuZGVkIGVsZW1lbnQgd2l0aCBubyBlbGVtZW50IG9uIHRoZSBzdGFjayIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBuID0gYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHQpOworICBfZGJ1c19hc3NlcnQgKG4gIT0gTlVMTCk7CisgIGlmIChzdHJjbXAgKG4sIGVsZW1lbnRfbmFtZSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBzaG91bGQgcHJvYmFibHkgYmUgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgYnV0CisgICAgICAgKiBiZWluZyBwYXJhbm9pZCBhYm91dCBYTUwgcGFyc2VycworICAgICAgICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJYTUwgZWxlbWVudCA8JXM+IGVuZGVkIGJ1dCB0b3Btb3N0IGVsZW1lbnQgb24gdGhlIHN0YWNrIHdhcyA8JXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsIG4pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBlID0gcGVla19lbGVtZW50IChwYXJzZXIpOworICBfZGJ1c19hc3NlcnQgKGUgIT0gTlVMTCk7CisKKyAgc3dpdGNoIChlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgaW4gc3RhY2sgaGFzIG5vIHR5cGUiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgY2FzZSBFTEVNRU5UX1VTRVI6CisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgY2FzZSBFTEVNRU5UX0xJU1RFTjoKKyAgICBjYXNlIEVMRU1FTlRfUElERklMRToKKyAgICBjYXNlIEVMRU1FTlRfQVVUSDoKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRURJUjoKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICBjYXNlIEVMRU1FTlRfTElNSVQ6CisgICAgICBpZiAoIWUtPmhhZF9jb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCBlbGVtZW50IDwlcz4gd2FzIGV4cGVjdGVkIHRvIGhhdmUgY29udGVudCBpbnNpZGUgaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAoZS0+dHlwZSkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoZS0+dHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFzZXRfbGltaXQgKHBhcnNlciwgZS0+ZC5saW1pdC5uYW1lLCBlLT5kLmxpbWl0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICBjYXNlIEVMRU1FTlRfREVOWToKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICBjYXNlIEVMRU1FTlRfU1lTTE9HOgorICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgIGNhc2UgRUxFTUVOVF9TRUxJTlVYOgorICAgIGNhc2UgRUxFTUVOVF9BU1NPQ0lBVEU6CisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzoKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgIGNhc2UgRUxFTUVOVF9BUFBBUk1PUjoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfd2hpdGVzcGFjZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKworICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZSAoc3RyLCAwLCAmaSk7CisKKyAgcmV0dXJuIGkgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFrZV9mdWxsX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZnVsbF9wYXRoKQoreworICBpZiAoX2RidXNfcGF0aF9pc19hYnNvbHV0ZSAoZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsIGZ1bGxfcGF0aCwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYmFzZWRpciwgMCwgZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKGZ1bGxfcGF0aCwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbmNsdWRlX2ZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGlnbm9yZV9taXNzaW5nLAorICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIC8qIEZJWE1FIGdvb2QgdGVzdCBjYXNlIGZvciB0aGlzIHdvdWxkIGxvYWQgZWFjaCBjb25maWcgZmlsZSBpbiB0aGUKKyAgICogdGVzdCBzdWl0ZSBib3RoIGFsb25lLCBhbmQgYXMgYW4gaW5jbHVkZSwgYW5kIGNoZWNrCisgICAqIHRoYXQgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgKi8KKyAgQnVzQ29uZmlnUGFyc2VyICppbmNsdWRlZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICAgICAgICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICBmaWxlbmFtZV9zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBmaWxlIGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuICovCisgIGlmIChzZWVuX2luY2x1ZGUgKHBhcnNlciwgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisJCSAgICAgICJDaXJjdWxhciBpbmNsdXNpb24gb2YgZmlsZSAnJXMnIiwKKwkJICAgICAgZmlsZW5hbWVfc3RyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoISBfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMsICh2b2lkICopIGZpbGVuYW1lX3N0cikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2luY2UgcGFyc2VyIGlzIHBhc3NlZCBpbiBhcyB0aGUgcGFyZW50LCBpbmNsdWRlZAorICAgICBpbmhlcml0cyBwYXJzZXIncyBsaW1pdHMuICovCisgIGluY2x1ZGVkID0gYnVzX2NvbmZpZ19sb2FkIChmaWxlbmFtZSwgRkFMU0UsIHBhcnNlciwgJnRtcF9lcnJvcik7CisKKyAgX2RidXNfbGlzdF9wb3BfbGFzdCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMpOworCisgIGlmIChpbmNsdWRlZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCkgJiYKKyAgICAgICAgICBpZ25vcmVfbWlzc2luZykKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgIGlmICghbWVyZ2VfaW5jbHVkZWQgKHBhcnNlciwgaW5jbHVkZWQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIENvcHkgaW5jbHVkZWQncyBsaW1pdHMgYmFjayB0byBwYXJzZXIuICovCisgICAgICBwYXJzZXItPmxpbWl0cyA9IGluY2x1ZGVkLT5saW1pdHM7CisKKyAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VydmljZWhlbHBlcl9wYXRoIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBjaGFyICpzZXJ2aWNlaGVscGVyOworCisgIGZpbGVuYW1lX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIC8qIGNvcHkgdG8gYXZvaWQgb3ZlcndyaXRpbmcgd2l0aCBOVUxMIG9uIE9PTSAqLworICBzZXJ2aWNlaGVscGVyID0gX2RidXNfc3RyZHVwIChmaWxlbmFtZV9zdHIpOworCisgIC8qIGNoZWNrIGZvciBPT00gKi8KKyAgaWYgKHNlcnZpY2VoZWxwZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzYXZlIHRoZSBsYXRlc3Qgc2VydmljZWhlbHBlciBvbmx5IGlmIG5vdCBPT00gKi8KKyAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICBwYXJzZXItPnNlcnZpY2VoZWxwZXIgPSBzZXJ2aWNlaGVscGVyOworCisgIC8qIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhlIGhlbHBlciBleGlzdHM7IGluc3RlYWQgd2UKKyAgICogd291bGQganVzdCBmYWlsIHRvIGV2ZXIgYWN0aXZhdGUgYW55dGhpbmcgaWYgaXQgZG9lc24ndC4KKyAgICogVGhpcyBhbGxvd3MgYW4gYWRtaW4gdG8gZml4IHRoZSBwcm9ibGVtIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAqIEl0IGFsc28gYWxsb3dzIHRoZSBwYXJzZXIgdGVzdCBzdWl0ZSB0byBzdWNjZXNzZnVsbHkgcGFyc2UKKyAgICogdGVzdCBjYXNlcyB3aXRob3V0IGluc3RhbGxpbmcgdGhlIGhlbHBlci4gOy0pCisgICAqLworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5jbHVkZV9kaXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmRpcm5hbWUsCisgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGNoYXIgKnM7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKGRpcm5hbWUsIGVycm9yKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5EKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChkaXJuYW1lLCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9ICAgICAgCisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghaW5jbHVkZV9maWxlIChwYXJzZXIsICZmdWxsX3BhdGgsIFRSVUUsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogV2UgbG9nIHRvIHN5c2xvZyB1bmNvbmRpdGlvbmFsbHkgaGVyZSwgYmVjYXVzZSB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBwYXJzZXIsIHNvIHdlIGRvbid0IHlldCBrbm93IHdoZXRoZXIKKyAgICAgICAgICAgICAgICAgICAqIHRoaXMgYnVzIGlzIGdvaW5nIHRvIHdhbnQgdG8gd3JpdGUgdG8gc3lzbG9nISAoVGhlcmUncworICAgICAgICAgICAgICAgICAgICogYWxzbyBzb21lIGxheWVyIGludmVyc2lvbiBnb2luZyBvbiwgaWYgd2Ugd2FudCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAqIHRoZSBidXMgY29udGV4dC4pICovCisgICAgICAgICAgICAgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCBlcnJvciAnJXMnIHdoaWxlIHBhcnNpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSk7CisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChkaXJuYW1lLCAmcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5jb25mX2RpcnMsIHMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgc3VjY2VzczoKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgZmFpbGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyNpZiAwCisgIHsKKyAgICBjb25zdCBjaGFyICpjX3N0cjsKKyAgICAKKyAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGNvbnRlbnQsICZjX3N0cik7CisKKyAgICBwcmludGYgKCJDT05URU5UICVkIGJ5dGVzOiAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRlbnQpLCBjX3N0cik7CisgIH0KKyNlbmRpZgorICAKKyAgZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJUZXh0IGNvbnRlbnQgb3V0c2lkZSBvZiBhbnkgWE1MIGVsZW1lbnQgaW4gY29uZmlndXJhdGlvbiBmaWxlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChlLT5oYWRfY29udGVudCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJFbGVtZW50IGhhZCBtdWx0aXBsZSBjb250ZW50IGJsb2NrcyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzd2l0Y2ggKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9OT05FOgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBhdCB0b3Agb2Ygc3RhY2sgaGFzIG5vIHR5cGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgY2FzZSBFTEVNRU5UX1BPTElDWToKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1c6CisgICAgY2FzZSBFTEVNRU5UX0RFTlk6CisgICAgY2FzZSBFTEVNRU5UX0ZPUks6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfS0VFUF9VTUFTSzoKKyAgICBjYXNlIEVMRU1FTlRfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSUzogICAgCisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzogICAgCisgICAgY2FzZSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9BUFBBUk1PUjoKKyAgICAgIGlmIChhbGxfd2hpdGVzcGFjZSAoY29udGVudCkpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHRleHQgY29udGVudCBleHBlY3RlZCBpbnNpZGUgWE1MIGVsZW1lbnQgJXMgaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgIGNhc2UgRUxFTUVOVF9QSURGSUxFOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgICAgcGFyc2VyLT5waWRmaWxlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoLCBzZWxpbnV4X3BvbGljeV9yb290OworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworCWlmIChlLT5kLmluY2x1ZGUuaWZfc2VsaW51eF9lbmFibGVkCisJICAgICYmICFidXNfc2VsaW51eF9lbmFibGVkICgpKQorCSAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICBpZiAoZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSkKKwkgIHsKKyAgICAgICAgICAgIGlmICghYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICgpKQorCSAgICAgIHsKKwkJZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJCQkiQ291bGQgbm90IGRldGVybWluZSBTRUxpbnV4IHBvbGljeSByb290IGZvciByZWxhdGl2ZSBpbmNsdXNpb24iKTsKKwkJX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCQlyZXR1cm4gRkFMU0U7CisJICAgICAgfQorICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZWxpbnV4X3BvbGljeV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdCAoKSk7CisgICAgICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmc2VsaW51eF9wb2xpY3lfcm9vdCwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoIWluY2x1ZGVfZmlsZSAocGFyc2VyLCAmZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlnbm9yZV9taXNzaW5nLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAKKyAgICAgICAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAoJnBhcnNlci0+YmFzZWRpciwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXJ2aWNlaGVscGVyX3BhdGggKHBhcnNlciwgJmZ1bGxfcGF0aCwgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICAgIHsKKyAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAgIAorICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgCisgICAgICAgIGlmICghbWFrZV9mdWxsX3BhdGggKCZwYXJzZXItPmJhc2VkaXIsIGNvbnRlbnQsICZmdWxsX3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpbmNsdWRlX2RpciAocGFyc2VyLCAmZnVsbF9wYXRoLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgICAgcGFyc2VyLT51c2VyID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+YnVzX3R5cGUpOworICAgICAgICBwYXJzZXItPmJ1c190eXBlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBFTEVNRU5UX0xJU1RFTjoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKworICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisgICAgICAgIAorICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPmxpc3Rlbl9vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcykpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfQVVUSDoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPm1lY2hhbmlzbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJmZ1bGxfcGF0aCwgJnMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIC8qIF9vbmx5XyBleHRyYSBzZXNzaW9uIGRpcmVjdG9yaWVzIGNhbiBiZSBzcGVjaWZpZWQgKi8KKyAgICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWw7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoY29udGVudCwgMCwgJnZhbCwgTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiBlbGVtZW50IGhhcyBpbnZhbGlkIHZhbHVlIChjb3VsZCBub3QgcGFyc2UgYXMgaW50ZWdlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmQubGltaXQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIGUtPmQubGltaXQudmFsdWUgPSB2YWw7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxvYWRlZCB2YWx1ZSAlbGQgZm9yIGxpbWl0ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0Lm5hbWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChwYXJzZXItPnN0YWNrICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IHdhcyBub3QgY2xvc2VkIGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGFyc2VyLT5pc190b3BsZXZlbCAmJiBwYXJzZXItPmxpc3Rlbl9vbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBuZWVkcyBvbmUgb3IgbW9yZSA8bGlzdGVuPiBlbGVtZW50cyBnaXZpbmcgYWRkcmVzc2VzIik7IAorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT51c2VyOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5idXNfdHlwZTsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2FkZHJlc3NlcyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiAmcGFyc2VyLT5saXN0ZW5fb247Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPm1lY2hhbmlzbXM7Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gJnBhcnNlci0+c2VydmljZV9kaXJzOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPmNvbmZfZGlyczsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2dldF9mb3JrIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5mb3JrOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+c3lzbG9nOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2tlZXBfdW1hc2sgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmtlZXBfdW1hc2s7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5hbGxvd19hbm9ueW1vdXM7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnBpZGZpbGU7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VoZWxwZXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnNlcnZpY2VoZWxwZXI7Cit9CisKK0J1c1BvbGljeSoKK2J1c19jb25maWdfcGFyc2VyX3N0ZWFsX3BvbGljeSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEJ1c1BvbGljeSAqcG9saWN5OworCisgIF9kYnVzX2Fzc2VydCAocGFyc2VyLT5wb2xpY3kgIT0gTlVMTCk7IC8qIGNhbiBvbmx5IHN0ZWFsIHRoZSBwb2xpY3kgMSB0aW1lICovCisgIAorICBwb2xpY3kgPSBwYXJzZXItPnBvbGljeTsKKworICBwYXJzZXItPnBvbGljeSA9IE5VTEw7CisKKyAgcmV0dXJuIHBvbGljeTsKK30KKworLyogT3ZlcndyaXRlIGFueSBsaW1pdHMgdGhhdCB3ZXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCit2b2lkCitidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0xpbWl0cyAgICAgICAqbGltaXRzKQoreworICAqbGltaXRzID0gcGFyc2VyLT5saW1pdHM7Cit9CisKK0RCdXNIYXNoVGFibGUqCitidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBEQnVzSGFzaFRhYmxlICp0YWJsZTsKKworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlICE9IE5VTEwpOyAvKiBjYW4gb25seSBzdGVhbCBvbmNlICovCisKKyAgdGFibGUgPSBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZTsKKworICBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSA9IE5VTEw7CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgVkFMSUQsCisgIElOVkFMSUQsCisgIFVOS05PV04KK30gVmFsaWRpdHk7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fY2hlY2tfb3duX3J1bGVzIChCdXNQb2xpY3kgICpwb2xpY3kpCit7CisgIGNvbnN0IHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBkYnVzX2Jvb2xfdCBhbGxvd2VkOworICB9IGNoZWNrc1tdID0geworICAgIHsib3JnLmZyZWVkZXNrdG9wIiwgRkFMU0V9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW0iLCBGQUxTRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMiLCBUUlVFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcy5mb28iLCBUUlVFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcy5mb28uYmFyIiwgVFJVRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMyIiwgRkFMU0V9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zMi5mb28iLCBGQUxTRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMyLmZvby5iYXIiLCBGQUxTRX0sCisgICAge05VTEwsIEZBTFNFfQorICB9OworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKGNoZWNrc1tpXS5uYW1lKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc2VydmljZV9uYW1lOworICAgICAgZGJ1c19ib29sX3QgcmV0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZV9uYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VfbmFtZSwgY2hlY2tzW2ldLm5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhcHBlbmQgc3RyaW5nIik7CisKKyAgICAgIHJldCA9IGJ1c19wb2xpY3lfY2hlY2tfY2FuX293biAocG9saWN5LCAmc2VydmljZV9uYW1lKTsKKyAgICAgIHByaW50ZiAoIiAgICAgICAgQ2hlY2sgbmFtZSAlczogJXNcbiIsIGNoZWNrc1tpXS5uYW1lLAorICAgICAgICAgICAgICByZXQgPyAiYWxsb3dlZCIgOiAibm90IGFsbG93ZWQiKTsKKyAgICAgIGlmIChjaGVja3NbaV0uYWxsb3dlZCAmJiAhcmV0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBvd24gJXNcbiIsIGNoZWNrc1tpXS5uYW1lKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGlmICghY2hlY2tzW2ldLmFsbG93ZWQgJiYgcmV0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkNhbiBvd24gJXNcbiIsIGNoZWNrc1tpXS5uYW1lKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmljZV9uYW1lKTsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb19sb2FkIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgsCisgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIG9vbV9wb3NzaWJsZSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNoZWNrX293bl9ydWxlcykKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBpZiAob29tX3Bvc3NpYmxlICYmCisgICAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgYnV0IHN0aWxsIGhhZCBtZW1vcnk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgICAgICBpZiAoY2hlY2tfb3duX3J1bGVzICYmIGRvX2NoZWNrX293bl9ydWxlcyAocGFyc2VyLT5wb2xpY3kpID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworCisgICAgICBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJBY2NlcHRlZCBpbnZhbGlkIGZpbGVcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IERCdXNTdHJpbmcgKmZ1bGxfcGF0aDsKKyAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHk7CisgIGRidXNfYm9vbF90ICAgICAgIGNoZWNrX293bl9ydWxlczsKK30gTG9hZGVyT29tRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sb2FkZXJfb29tX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIExvYWRlck9vbURhdGEgKmQgPSBkYXRhOworCisgIHJldHVybiBkb19sb2FkIChkLT5mdWxsX3BhdGgsIGQtPnZhbGlkaXR5LCBUUlVFLCBkLT5jaGVja19vd25fcnVsZXMpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZSBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIGludmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIlRlc3RpbmcgdW5rbm93biBmaWxlczpcbiIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgIExvYWRlck9vbURhdGEgZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsICIuY29uZiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0uY29uZiBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPT0gVkFMSUQgPyAidmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBJTlZBTElEID8gImludmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gVU5LTk9XTiA/ICJ1bmtub3duIiA6ICI/Pz8iKSkpOworCisgICAgICBkLmZ1bGxfcGF0aCA9ICZmdWxsX3BhdGg7CisgICAgICBkLnZhbGlkaXR5ID0gdmFsaWRpdHk7CisgICAgICBkLmNoZWNrX293bl9ydWxlcyA9IF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsCisgICAgICAgICAgImNoZWNrLW93bi1ydWxlcy5jb25mIik7CisKKyAgICAgIC8qIEZJWE1FIGhhY2thcm91bmQgZm9yIGFuIGV4cGF0IHByb2JsZW0sIHNlZQorICAgICAgICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMjQ3NDcKKyAgICAgICAqIGh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKyAgICAgICAqLworICAgICAgLyogaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoImNvbmZpZy1sb2FkZXIiLCBjaGVja19sb2FkZXJfb29tX2Z1bmMsICZkKSkgKi8KKyAgICAgIGlmICghY2hlY2tfbG9hZGVyX29vbV9mdW5jICgmZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citib29sc19lcXVhbCAoZGJ1c19ib29sX3QgYSwKKwkgICAgIGRidXNfYm9vbF90IGIpCit7CisgIHJldHVybiBhID8gYiA6ICFiOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChjb25zdCBjaGFyICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmIpCit7CisgIGlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorICAgIHJldHVybiBhID09IGI7CisgIGVsc2UKKyAgICByZXR1cm4gIXN0cmNtcCAoYSwgYik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZWxlbWVudHNfZXF1YWwgKGNvbnN0IEVsZW1lbnQgKmEsCisJCWNvbnN0IEVsZW1lbnQgKmIpCit7CisgIGlmIChhLT50eXBlICE9IGItPnR5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYm9vbHNfZXF1YWwgKGEtPmhhZF9jb250ZW50LCBiLT5oYWRfY29udGVudCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoYS0+dHlwZSkKKyAgICB7CisKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICAgIGlmICghYm9vbHNfZXF1YWwgKGEtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZywKKwkJCWItPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZykpCisJcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgaWYgKGEtPmQucG9saWN5LnR5cGUgIT0gYi0+ZC5wb2xpY3kudHlwZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlICE9IGItPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIGlmIChzdHJjbXAgKGEtPmQubGltaXQubmFtZSwgYi0+ZC5saW1pdC5uYW1lKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5saW1pdC52YWx1ZSAhPSBiLT5kLmxpbWl0LnZhbHVlKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RzX29mX2VsZW1lbnRzX2VxdWFsIChEQnVzTGlzdCAqYSwKKwkJCSBEQnVzTGlzdCAqYikKK3sKKyAgREJ1c0xpc3QgKmlhOworICBEQnVzTGlzdCAqaWI7CisKKyAgaWEgPSBhOworICBpYiA9IGI7CisgIAorICB3aGlsZSAoaWEgIT0gTlVMTCAmJiBpYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlbGVtZW50c19lcXVhbCAoaWEtPmRhdGEsIGliLT5kYXRhKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpYSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmEsIGlhKTsKKyAgICAgIGliID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYiwgaWIpOworICAgIH0KKworICByZXR1cm4gaWEgPT0gTlVMTCAmJiBpYiA9PSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RzX29mX2Nfc3RyaW5nc19lcXVhbCAoREJ1c0xpc3QgKmEsCisJCQkgIERCdXNMaXN0ICpiKQoreworICBEQnVzTGlzdCAqaWE7CisgIERCdXNMaXN0ICppYjsKKworICBpYSA9IGE7CisgIGliID0gYjsKKyAgCisgIHdoaWxlIChpYSAhPSBOVUxMICYmIGliICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoaWEtPmRhdGEsIGliLT5kYXRhKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpYSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmEsIGlhKTsKKyAgICAgIGliID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYiwgaWIpOworICAgIH0KKworICByZXR1cm4gaWEgPT0gTlVMTCAmJiBpYiA9PSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpbWl0c19lcXVhbCAoY29uc3QgQnVzTGltaXRzICphLAorCSAgICAgIGNvbnN0IEJ1c0xpbWl0cyAqYikKK3sKKyAgcmV0dXJuCisgICAgKGEtPm1heF9pbmNvbWluZ19ieXRlcyA9PSBiLT5tYXhfaW5jb21pbmdfYnl0ZXMKKyAgICAgfHwgYS0+bWF4X2luY29taW5nX3VuaXhfZmRzID09IGItPm1heF9pbmNvbWluZ191bml4X2ZkcworICAgICB8fCBhLT5tYXhfb3V0Z29pbmdfYnl0ZXMgPT0gYi0+bWF4X291dGdvaW5nX2J5dGVzCisgICAgIHx8IGEtPm1heF9vdXRnb2luZ191bml4X2ZkcyA9PSBiLT5tYXhfb3V0Z29pbmdfdW5peF9mZHMKKyAgICAgfHwgYS0+bWF4X21lc3NhZ2Vfc2l6ZSA9PSBiLT5tYXhfbWVzc2FnZV9zaXplCisgICAgIHx8IGEtPm1heF9tZXNzYWdlX3VuaXhfZmRzID09IGItPm1heF9tZXNzYWdlX3VuaXhfZmRzCisgICAgIHx8IGEtPmFjdGl2YXRpb25fdGltZW91dCA9PSBiLT5hY3RpdmF0aW9uX3RpbWVvdXQKKyAgICAgfHwgYS0+YXV0aF90aW1lb3V0ID09IGItPmF1dGhfdGltZW91dAorICAgICB8fCBhLT5wZW5kaW5nX2ZkX3RpbWVvdXQgPT0gYi0+cGVuZGluZ19mZF90aW1lb3V0CisgICAgIHx8IGEtPm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgPT0gYi0+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9PSBiLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPT0gYi0+bWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgIHx8IGEtPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID09IGItPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zCisgICAgIHx8IGEtPm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24KKyAgICAgfHwgYS0+bWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uID09IGItPm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5yZXBseV90aW1lb3V0ID09IGItPnJlcGx5X3RpbWVvdXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvbmZpZ19wYXJzZXJzX2VxdWFsIChjb25zdCBCdXNDb25maWdQYXJzZXIgKmEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpiKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmEtPmJhc2VkaXIsICZiLT5iYXNlZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9lbGVtZW50c19lcXVhbCAoYS0+c3RhY2ssIGItPnN0YWNrKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFzdHJpbmdzX2VxdWFsX29yX2JvdGhfbnVsbCAoYS0+dXNlciwgYi0+dXNlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5saXN0ZW5fb24sIGItPmxpc3Rlbl9vbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5tZWNoYW5pc21zLCBiLT5tZWNoYW5pc21zKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9jX3N0cmluZ3NfZXF1YWwgKGEtPnNlcnZpY2VfZGlycywgYi0+c2VydmljZV9kaXJzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAvKiBGSVhNRTogY29tcGFyZSBwb2xpY3kgKi8KKworICAvKiBGSVhNRTogY29tcGFyZSBzZXJ2aWNlIHNlbGludXggSUQgdGFibGUgKi8KKworICBpZiAoISBsaW1pdHNfZXF1YWwgKCZhLT5saW1pdHMsICZiLT5saW1pdHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXN0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChhLT5waWRmaWxlLCBiLT5waWRmaWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEgYm9vbHNfZXF1YWwgKGEtPmZvcmssIGItPmZvcmspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoISBib29sc19lcXVhbCAoYS0+a2VlcF91bWFzaywgYi0+a2VlcF91bWFzaykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghIGJvb2xzX2VxdWFsIChhLT5pc190b3BsZXZlbCwgYi0+aXNfdG9wbGV2ZWwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfYXJlX2VxdWl2IChjb25zdCBEQnVzU3RyaW5nICp0YXJnZXRfZGlyZWN0b3J5KQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBCdXNDb25maWdQYXJzZXIgKmZpcnN0X3BhcnNlcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgZXF1YWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBkaXIgPSBOVUxMOworICBmaXJzdF9wYXJzZXIgPSBOVUxMOworICBwYXJzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmciKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICh0YXJnZXRfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHRhcmdldF9kaXJlY3RvcnkpLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CisKKyAgcHJpbnRmICgiQ29tcGFyaW5nIGVxdWl2YWxlbnQgZmlsZXM6XG4iKTsKKworIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRhcmdldF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLmNvbmYgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmZ1bGxfcGF0aCwgVFJVRSwgTlVMTCwgJmVycm9yKTsKKworICAgICAgaWYgKHBhcnNlciA9PSBOVUxMKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgbG9hZCBmaWxlICVzOiAlc1xuIiwKKwkJICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKwkJICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCSAgZ290byBmaW5pc2hlZDsKKwl9CisgICAgICBlbHNlIGlmIChmaXJzdF9wYXJzZXIgPT0gTlVMTCkKKwl7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZmlyc3RfcGFyc2VyID0gcGFyc2VyOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCSAgZXF1YWwgPSBjb25maWdfcGFyc2Vyc19lcXVhbCAoZmlyc3RfcGFyc2VyLCBwYXJzZXIpOworCSAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisJICBpZiAoISBlcXVhbCkKKwkgICAgZ290byBmaW5pc2hlZDsKKwl9CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmaW5pc2hlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmIChmaXJzdF9wYXJzZXIpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKGZpcnN0X3BhcnNlcik7CisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworCisgIHJldHVybiByZXR2YWw7CisgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisJCQkgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgZXF1YWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBkaXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdF9kaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSB0ZXN0X2RpcmVjdG9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKwkJCSAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICAvKiBTa2lwIENWUydzIG1hZ2ljIGRpcmVjdG9yaWVzISAqLworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmZpbGVuYW1lLCAiQ1ZTIikpCisJY29udGludWU7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworICAgICAgCisgICAgICBlcXVhbCA9IGFsbF9hcmVfZXF1aXYgKCZmdWxsX3BhdGgpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgICAgICBpZiAoIWVxdWFsKQorCWdvdG8gZmluaXNoZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmaW5pc2hlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworICAKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW10gPSAKKyAgICAgICAgeworI2lmZGVmIERCVVNfVU5JWAorICAgICAgICAgIi90ZXN0aG9tZS9mb28vLnRlc3Rsb2NhbC90ZXN0c2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiwKKyAgICAgICAgICIvdGVzdHVzci90ZXN0bG9jYWwvdGVzdHNoYXJlL2RidXMtMS9zZXJ2aWNlcyIsCisgICAgICAgICAiL3Rlc3R1c3IvdGVzdHNoYXJlL2RidXMtMS9zZXJ2aWNlcyIsCisgICAgICAgICBEQlVTX0RBVEFESVIiL2RidXMtMS9zZXJ2aWNlcyIsCisjZW5kaWYKKy8qIHdpbGwgYmUgZmlsbGVkIGluIHRlc3RfZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzKCkgKi8KKyNpZmRlZiBEQlVTX1dJTgorICAgICAgICAgTlVMTCwKKyAgICAgICAgIE5VTEwsCisjZW5kaWYKKyAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmRpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHByb2dzOworICBEQnVzU3RyaW5nIGluc3RhbGxfcm9vdF9iYXNlZDsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworI2lmZGVmIERCVVNfV0lOCisgIGNvbnN0IGNoYXIgKnRtcDsKKyAgY29uc3QgY2hhciAqY29tbW9uX3Byb2dzOworI2VuZGlmCisKKyAgLyogT24gVW5peCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlc2UsIGJ1dCBpdCdzIGVhc2llciB0byBoYW5kbGUgdGhlCisgICAqIGRlYWxsb2NhdGlvbiBpZiB3ZSBhbHdheXMgYWxsb2NhdGUgdGhlbSwgd2hldGhlciBuZWVkZWQgb3Igbm90ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9ncykgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJmluc3RhbGxfcm9vdF9iYXNlZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIGFsbG9jYXRpbmcgc3RyaW5ncyIpOworCisjaWZkZWYgREJVU19XSU4KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmaW5zdGFsbF9yb290X2Jhc2VkLCBEQlVTX0RBVEFESVIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmluc3RhbGxfcm9vdF9iYXNlZCwgIi9kYnVzLTEvc2VydmljZXMiKSkKKyAgICBnb3RvIG91dDsKKworICB0bXAgPSBfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4ICgKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmluc3RhbGxfcm9vdF9iYXNlZCkpOworCisgIGlmICh0bXAgPT0gTlVMTCB8fAorICAgICAgIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaW5zdGFsbF9yb290X2Jhc2VkLCAwKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZpbnN0YWxsX3Jvb3RfYmFzZWQsIHRtcCkpCisgICAgZ290byBvdXQ7CisKKyAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMF0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKAorICAgICAgJmluc3RhbGxfcm9vdF9iYXNlZCk7CisKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisKKyAgaWYgKGNvbW1vbl9wcm9ncykgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsIGNvbW1vbl9wcm9ncykpIAorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsICIvZGJ1cy0xL3NlcnZpY2VzIikpIAorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMV0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnByb2dzKTsKKyAgICB9CisjZW5kaWYKKyAgZGlycyA9IE5VTEw7CisKKyAgcHJpbnRmICgiVGVzdGluZyByZXRyaWV2aW5nIHRoZSBkZWZhdWx0IHNlc3Npb24gc2VydmljZSBkaXJlY3Rvcmllc1xuIik7CisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSBvdXIgZGVmYXVsdHMgZW5kIHdpdGggc2hhcmUvZGJ1cy0xL3NlcnZpY2UgKi8KKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBhdGg7CisgICAgICAKKyAgICAgIHByaW50ZiAoIiAgICBkZWZhdWx0IHNlcnZpY2UgZGlyOiAlc1xuIiwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aCwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJnBhdGgsICJkYnVzLTEvc2VydmljZXMiKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoImVycm9yIHdpdGggZGVmYXVsdCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXNcbiIpOworCSAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgCSAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKworI2lmZGVmIERCVVNfVU5JWAorICBpZiAoIWRidXNfc2V0ZW52ICgiWERHX0RBVEFfSE9NRSIsICIvdGVzdGhvbWUvZm9vLy50ZXN0bG9jYWwvdGVzdHNoYXJlIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0hPTUUiKTsKKworICBpZiAoIWRidXNfc2V0ZW52ICgiWERHX0RBVEFfRElSUyIsICI6L3Rlc3R1c3IvdGVzdGxvY2FsL3Rlc3RzaGFyZTogOi90ZXN0dXNyL3Rlc3RzaGFyZToiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfRElSUyIpOworI2VuZGlmCisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1vcmUgZGlyZWN0b3JpZXMgcGFyc2VkIHRoYW4gaW4gbWF0Y2ggc2V0XG4iKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorIAorICAgICAgaWYgKHN0cmNtcCAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0sIAorICAgICAgICAgICAgICAgICAgKGNoYXIgKilsaW5rLT5kYXRhKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiJXMgZGlyZWN0b3J5IGRvZXMgbm90IG1hdGNoICVzIGluIHRoZSBtYXRjaCBzZXRcbiIsIAorICAgICAgICAgICAgICAgICAgKGNoYXIgKilsaW5rLT5kYXRhLAorICAgICAgICAgICAgICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0pOworICAgICAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICsraTsKKworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICB9CisgIAorICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJleHRyYSBkYXRhICVzIGluIHRoZSBtYXRjaCBzZXQgd2FzIG5vdCBtYXRjaGVkXG4iLAorICAgICAgICAgICAgICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmluc3RhbGxfcm9vdF9iYXNlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tdID0gCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgICAgICIvdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorICAgICAgICAgIi91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisjZW5kaWYKKyAgICAgICAgIERCVVNfREFUQURJUiIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisjaWZkZWYgREJVU19VTklYCisgICAgICAgICAiL2xpYi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIiwKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyAgICAgICAgIE5VTEwsCisjZW5kaWYKKyAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2RlZmF1bHRfc3lzdGVtX3NlcnZpY2VkaXJzICh2b2lkKQoreworICBEQnVzTGlzdCAqZGlyczsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNTdHJpbmcgcHJvZ3M7CisjaWZuZGVmIERCVVNfVU5JWAorICBjb25zdCBjaGFyICpjb21tb25fcHJvZ3M7CisjZW5kaWYKKyAgaW50IGk7CisKKyAgLyogT24gVW5peCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgdGhpcyB2YXJpYWJsZSwgYnV0IGl0J3MgZWFzaWVyIHRvIGhhbmRsZSB0aGUKKyAgICogZGVhbGxvY2F0aW9uIGlmIHdlIGFsd2F5cyBhbGxvY2F0ZSBpdCwgd2hldGhlciBuZWVkZWQgb3Igbm90ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9ncykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIGFsbG9jYXRpbmcgcHJvZ3MiKTsKKworI2lmbmRlZiBEQlVTX1VOSVgKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisKKyAgaWYgKGNvbW1vbl9wcm9ncykgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsIGNvbW1vbl9wcm9ncykpIAorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2dzLCAiL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiKSkgCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIHRlc3Rfc3lzdGVtX3NlcnZpY2VfZGlyX21hdGNoZXNbMV0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnByb2dzKTsKKyAgICB9CisjZW5kaWYKKyAgZGlycyA9IE5VTEw7CisKKyAgcHJpbnRmICgiVGVzdGluZyByZXRyaWV2aW5nIHRoZSBkZWZhdWx0IHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yaWVzXG4iKTsKKyAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgZ2V0IHN0YXJkYXJkIGRpcnMiKTsKKworICAvKiBtYWtlIHN1cmUgb3VyIGRlZmF1bHRzIGVuZCB3aXRoIHNoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZSAqLworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgcGF0aDsKKyAgICAgIAorICAgICAgcHJpbnRmICgiICAgIGRlZmF1bHQgc2VydmljZSBkaXI6ICVzXG4iLCAoY2hhciAqKWxpbmstPmRhdGEpOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZwYXRoLCAoY2hhciAqKWxpbmstPmRhdGEpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmcGF0aCwgImRidXMtMS9zeXN0ZW0tc2VydmljZXMiKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoImVycm9yIHdpdGggZGVmYXVsdCBzeXN0ZW0gc2VydmljZSBkaXJlY3Rvcmllc1xuIik7CisJICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAJICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKworI2lmZGVmIERCVVNfVU5JWAorICBpZiAoIWRidXNfc2V0ZW52ICgiWERHX0RBVEFfSE9NRSIsICIvdGVzdGhvbWUvZm9vLy50ZXN0bG9jYWwvdGVzdHNoYXJlIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0hPTUUiKTsKKworICBpZiAoIWRidXNfc2V0ZW52ICgiWERHX0RBVEFfRElSUyIsICI6L3Rlc3R1c3IvdGVzdGxvY2FsL3Rlc3RzaGFyZTogOi90ZXN0dXNyL3Rlc3RzaGFyZToiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfRElSUyIpOworI2VuZGlmCisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoJmRpcnMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGdldCBzdGFyZGFyZCBkaXJzIik7CisKKyAgLyogbWFrZSBzdXJlIHdlIHJlYWQgYW5kIHBhcnNlIHRoZSBlbnYgdmFyaWFibGUgY29ycmVjdGx5ICovCisgIGkgPSAwOworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgICB0ZXN0IHNlcnZpY2UgZGlyOiAlc1xuIiwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIGlmICh0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtb3JlIGRpcmVjdG9yaWVzIHBhcnNlZCB0aGFuIGluIG1hdGNoIHNldFxuIik7CisgICAgICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgCisgICAgICBpZiAoc3RyY21wICh0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzIGRpcmVjdG9yeSBkb2VzIG5vdCBtYXRjaCAlcyBpbiB0aGUgbWF0Y2ggc2V0XG4iLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIHRlc3Rfc3lzdGVtX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0pOworICAgICAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgfQorICAKKyAgaWYgKHRlc3Rfc3lzdGVtX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJleHRyYSBkYXRhICVzIGluIHRoZSBtYXRjaCBzZXQgd2FzIG5vdCBtYXRjaGVkXG4iLAorICAgICAgICAgICAgICB0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisJCSAgIAorZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0ZXN0X2RhdGFfZGlyKSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YVxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCF0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycygpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERCVVNfV0lOCisgIHByaW50ZigiZGVmYXVsdCBzeXN0ZW0gc2VydmljZSBkaXIgc2tpcHBlZFxuIik7CisjZWxzZQorICBpZiAoIXRlc3RfZGVmYXVsdF9zeXN0ZW1fc2VydmljZWRpcnMoKSkKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKworICBpZiAoIXByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMiLCBWQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZuZGVmIERCVVNfV0lOCisgIGlmICghcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0iLCBWQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAiaW52YWxpZC1jb25maWctZmlsZXMiLCBJTlZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFwcm9jZXNzX3Rlc3RfZXF1aXZfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAiZXF1aXYtY29uZmlnLWZpbGVzIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1wYXJzZXIuaCBiL2J1cy9jb25maWctcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1YmY3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctcGFyc2VyLmgKQEAgLTAsMCArMSw4NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLmggIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX0gKKyNkZWZpbmUgQlVTX0NPTkZJR19QQVJTRVJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlICJidXMuaCIKKworLyogV2hhdGV2ZXIgWE1MIGxpYnJhcnkgd2UncmUgdXNpbmcganVzdCBwdXNoZXMgZGF0YSBpbnRvIHRoaXMgQVBJICovCisKK3R5cGVkZWYgc3RydWN0IEJ1c0NvbmZpZ1BhcnNlciBCdXNDb25maWdQYXJzZXI7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCk7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfcmVmICAgICAgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcik7Cit2b2lkICAgICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50ICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisvKiBGdW5jdGlvbnMgZm9yIGV4dHJhY3RpbmcgdGhlIHBhcnNlIHJlc3VsdHMgKi8KK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK0RCdXNMaXN0KiogIGJ1c19jb25maWdfcGFyc2VyX2dldF9hZGRyZXNzZXMgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK0RCdXNMaXN0KiogIGJ1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9mb3JrICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9hbGxvd19hbm9ueW1vdXMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9zeXNsb2cgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9rZWVwX3VtYXNrICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF9waWRmaWxlICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlaGVscGVyIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitCdXNQb2xpY3kqICBidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9wb2xpY3kgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Cit2b2lkICAgICAgICBidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0xpbWl0cyAgICAgICAqbGltaXRzKTsKKworREJ1c0hhc2hUYWJsZSogYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfc2VydmljZV9jb250ZXh0X3RhYmxlIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CisKKy8qIExvYWRlciBmdW5jdGlvbnMgKGJhY2tlbmRlZCBvZmYgb25lIG9mIHRoZSBYTUwgcGFyc2VycykuICBSZXR1cm5zIGEKKyAqIGZpbmlzaGVkIENvbmZpZ1BhcnNlci4KKyAqLworQnVzQ29uZmlnUGFyc2VyKiBidXNfY29uZmlnX2xvYWQgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Nvbm5lY3Rpb24uYyBiL2J1cy9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMjBhNgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSwyODExIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGNvbm5lY3Rpb24uYyAgQ2xpZW50IGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgImV4cGlyZWxpc3QuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyogVHJpbSBleGVjdXRlZCBjb21tYW5kcyB0byB0aGlzIGxlbmd0aDsgd2Ugd2FudCB0byBrZWVwIGxvZ3MgcmVhZGFibGUgKi8KKyNkZWZpbmUgTUFYX0xPR19DT01NQU5EX0xFTiA1MAorCitzdGF0aWMgdm9pZCBidXNfY29ubmVjdGlvbl9yZW1vdmVfdHJhbnNhY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0V4cGlyZUl0ZW0gZXhwaXJlX2l0ZW07CisKKyAgREJ1c0Nvbm5lY3Rpb24gKndpbGxfZ2V0X3JlcGx5OworICBEQnVzQ29ubmVjdGlvbiAqd2lsbF9zZW5kX3JlcGx5OworCisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICAKK30gQnVzUGVuZGluZ1JlcGx5OworCitzdHJ1Y3QgQnVzQ29ubmVjdGlvbnMKK3sKKyAgaW50IHJlZmNvdW50OworICBEQnVzTGlzdCAqY29tcGxldGVkOyAgLyoqPCBMaXN0IG9mIGFsbCBjb21wbGV0ZWQgY29ubmVjdGlvbnMgKi8KKyAgaW50IG5fY29tcGxldGVkOyAgICAgIC8qKjwgTGVuZ3RoIG9mIGNvbXBsZXRlZCBsaXN0ICovCisgIERCdXNMaXN0ICppbmNvbXBsZXRlOyAvKio8IExpc3Qgb2YgYWxsIG5vdC15ZXQtYWN0aXZlIGNvbm5lY3Rpb25zICovCisgIGludCBuX2luY29tcGxldGU7ICAgICAvKio8IExlbmd0aCBvZiBpbmNvbXBsZXRlIGxpc3QgKi8KKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0hhc2hUYWJsZSAqY29tcGxldGVkX2J5X3VzZXI7IC8qKjwgTnVtYmVyIG9mIGNvbXBsZXRlZCBjb25uZWN0aW9ucyBmb3IgZWFjaCBVSUQgKi8KKyAgREJ1c1RpbWVvdXQgKmV4cGlyZV90aW1lb3V0OyAvKio8IFRpbWVvdXQgZm9yIGV4cGlyaW5nIGluY29tcGxldGUgY29ubmVjdGlvbnMuICovCisgIGludCBzdGFtcDsgICAgICAgICAgICAgICAgICAgLyoqPCBJbmNyZW1lbnRpbmcgbnVtYmVyICovCisgIEJ1c0V4cGlyZUxpc3QgKnBlbmRpbmdfcmVwbGllczsgLyoqPCBMaXN0IG9mIHBlbmRpbmcgcmVwbGllcyAqLworCisgIC8qKiBMaXN0IG9mIGFsbCBtb25pdG9yaW5nIGNvbm5lY3Rpb25zLCBhIHN1YnNldCBvZiBjb21wbGV0ZWQuCisgICAqIEVhY2ggbWVtYmVyIGlzIGEgI0RCdXNDb25uZWN0aW9uLiAqLworICBEQnVzTGlzdCAqbW9uaXRvcnM7CisgIEJ1c01hdGNobWFrZXIgKm1vbml0b3JfbWF0Y2htYWtlcjsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGludCB0b3RhbF9tYXRjaF9ydWxlczsKKyAgaW50IHBlYWtfbWF0Y2hfcnVsZXM7CisgIGludCBwZWFrX21hdGNoX3J1bGVzX3Blcl9jb25uOworCisgIGludCB0b3RhbF9idXNfbmFtZXM7CisgIGludCBwZWFrX2J1c19uYW1lczsKKyAgaW50IHBlYWtfYnVzX25hbWVzX3Blcl9jb25uOworI2VuZGlmCit9OworCitzdGF0aWMgZGJ1c19pbnQzMl90IGNvbm5lY3Rpb25fZGF0YV9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c0xpc3QgKmxpbmtfaW5fY29ubmVjdGlvbl9saXN0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0xpc3QgKnNlcnZpY2VzX293bmVkOworICBpbnQgbl9zZXJ2aWNlc19vd25lZDsKKyAgREJ1c0xpc3QgKm1hdGNoX3J1bGVzOworICBpbnQgbl9tYXRjaF9ydWxlczsKKyAgY2hhciAqbmFtZTsKKyAgREJ1c0xpc3QgKnRyYW5zYWN0aW9uX21lc3NhZ2VzOyAvKio8IFN0dWZmIHdlIG5lZWQgdG8gc2VuZCBhcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gKi8KKyAgREJ1c01lc3NhZ2UgKm9vbV9tZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqb29tX3ByZWFsbG9jYXRlZDsKKyAgQnVzQ2xpZW50UG9saWN5ICpwb2xpY3k7CisKKyAgY2hhciAqY2FjaGVkX2xvZ2luZm9fc3RyaW5nOworICBCdXNTRUxpbnV4SUQgKnNlbGludXhfaWQ7CisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmFwcGFybW9yX2NvbmZpbmVtZW50OworCisgIGxvbmcgY29ubmVjdGlvbl90dl9zZWM7ICAvKio8IFRpbWUgd2hlbiB3ZSBjb25uZWN0ZWQgKHNlY29uZHMgY29tcG9uZW50KSAqLworICBsb25nIGNvbm5lY3Rpb25fdHZfdXNlYzsgLyoqPCBUaW1lIHdoZW4gd2UgY29ubmVjdGVkIChtaWNyb3NlYyBjb21wb25lbnQpICovCisgIGludCBzdGFtcDsgICAgICAgICAgICAgICAvKio8IGNvbm5lY3Rpb25zLT5zdGFtcCBsYXN0IHRpbWUgd2Ugd2VyZSB0cmF2ZXJzZWQgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGludCBwZWFrX21hdGNoX3J1bGVzOworICBpbnQgcGVha19idXNfbmFtZXM7CisjZW5kaWYKKyAgaW50IG5fcGVuZGluZ191bml4X2ZkczsKKyAgREJ1c1RpbWVvdXQgKnBlbmRpbmdfdW5peF9mZHNfdGltZW91dDsKKworICAvKiogbm9uLU5VTEwgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIG1vbml0b3IgKi8KKyAgREJ1c0xpc3QgKmxpbmtfaW5fbW9uaXRvcnM7Cit9IEJ1c0Nvbm5lY3Rpb25EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX3BlbmRpbmdfcmVwbHlfZXhwaXJlZCAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZCBidXNfY29ubmVjdGlvbl9kcm9wX3BlbmRpbmdfcmVwbGllcyAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgZXhwaXJlX2luY29tcGxldGVfdGltZW91dCAodm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgQlVTX0NPTk5FQ1RJT05fREFUQShjb25uZWN0aW9uKSAoZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhICgoY29ubmVjdGlvbiksIGNvbm5lY3Rpb25fZGF0YV9zbG90KSkKKworc3RhdGljIERCdXNMb29wKgorY29ubmVjdGlvbl9nZXRfbG9vcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9sb29wIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7Cit9CisKKworc3RhdGljIGludAorZ2V0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkKQoreworICB2b2lkICp2YWw7CisgIGludCBjdXJyZW50X2NvdW50OworCisgIC8qIHZhbCBpcyBOVUxMIGlzIDAgd2hlbiBpdCBpc24ndCBpbiB0aGUgaGFzaCB5ZXQgKi8KKyAgCisgIHZhbCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisKKyAgY3VycmVudF9jb3VudCA9IF9EQlVTX1BPSU5URVJfVE9fSU5UICh2YWwpOworCisgIHJldHVybiBjdXJyZW50X2NvdW50OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkanVzdF9jb25uZWN0aW9uc19mb3JfdWlkIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYWRqdXN0bWVudCkKK3sKKyAgaW50IGN1cnJlbnRfY291bnQ7CisKKyAgY3VycmVudF9jb3VudCA9IGdldF9jb25uZWN0aW9uc19mb3JfdWlkIChjb25uZWN0aW9ucywgdWlkKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvbm5lY3Rpb24gY291bnQgZm9yIFVJRCAiIERCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAiOiB3YXMgJWQgYWRqdXN0bWVudCAlZCBtYWtpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgIHVpZCwgY3VycmVudF9jb3VudCwgYWRqdXN0bWVudCwgY3VycmVudF9jb3VudCArIGFkanVzdG1lbnQpOworICAKKyAgX2RidXNfYXNzZXJ0IChjdXJyZW50X2NvdW50ID49IDApOworICAKKyAgY3VycmVudF9jb3VudCArPSBhZGp1c3RtZW50OworCisgIF9kYnVzX2Fzc2VydCAoY3VycmVudF9jb3VudCA+PSAwKTsKKworICBpZiAoY3VycmVudF9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwgdWlkKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgICAgIAorICAgICAgcmV0dmFsID0gX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGN1cnJlbnRfY291bnQpKTsKKworICAgICAgLyogb25seSBwb3NpdGl2ZSBhZGp1c3RtZW50IGNhbiBmYWlsIGFzIG90aGVyd2lzZQorICAgICAgICogYSBoYXNoIGVudHJ5IHNob3VsZCBhbHJlYWR5IGV4aXN0CisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRqdXN0bWVudCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGFkanVzdG1lbnQgPD0gMCAmJiByZXR2YWwpKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzIGRpc2Nvbm5lY3RlZCwgZHJvcHBpbmcgYWxsIHNlcnZpY2Ugb3duZXJzaGlwIGFuZCByZWxlYXNpbmdcbiIsCisgICAgICAgICAgICAgICAgIGQtPm5hbWUgPyBkLT5uYW1lIDogIihpbmFjdGl2ZSkiKTsKKworICAvKiBEZWxldGUgb3VyIG1hdGNoIHJ1bGVzICovCisgIGlmIChkLT5uX21hdGNoX3J1bGVzID4gMCkKKyAgICB7CisgICAgICBtYXRjaG1ha2VyID0gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgICAgIGJ1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAobWF0Y2htYWtlciwgY29ubmVjdGlvbik7CisgICAgfQorICAKKyAgLyogRHJvcCBhbnkgc2VydmljZSBvd25lcnNoaXAuIFVuZm9ydHVuYXRlbHksIHRoaXMgcmVxdWlyZXMKKyAgICogbWVtb3J5IGFsbG9jYXRpb24gYW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2Qgd2F5IHRvCisgICAqIGhhbmRsZSBpdCBvdGhlciB0aGFuIHNsZWVwaW5nOyB3ZSBjYW4ndCAiZmFpbCIgdGhlIG9wZXJhdGlvbiBvZgorICAgKiBkaXNjb25uZWN0aW5nIGEgY2xpZW50LCBhbmQgcHJlYWxsb2NhdGluZyBhIGJyb2FkY2FzdCAic2VydmljZSBpcworICAgKiBub3cgZ29uZSIgbWVzc2FnZSBmb3IgZXZlcnkgY2xpZW50LXNlcnZpY2UgcGFpciBzZWVtcyBraW5kIG9mCisgICAqIGludm9sdmVkLgorICAgKi8KKyAgd2hpbGUgKChzZXJ2aWNlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJmQtPnNlcnZpY2VzX293bmVkKSkpCisgICAgeworICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworICAgICAgREJ1c0Vycm9yIGVycm9yOworCisgICAgcmV0cnk6CisgICAgICAKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgICAgICAgCisgICAgICB3aGlsZSAoKHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpKSA9PSBOVUxMKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgIAorICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcmVtb3ZlIHNlcnZpY2Ugb3duZXI6ICVzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVtb3Zpbmcgc2VydmljZSBvd25lciBmYWlsZWQgZm9yIG5vbi1tZW1vcnktcmVsYXRlZCByZWFzb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgfQorCisgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisgIAorICAvKiBubyBtb3JlIHdhdGNoaW5nICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0KQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpOworICAgICAgX2RidXNfdGltZW91dF91bnJlZiAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0KTsKKyAgICB9CisgIGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCA9IE5VTEw7CisgIF9kYnVzX2Nvbm5lY3Rpb25fc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMKTsKKyAgCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKGNvbm5lY3Rpb24pOworCisgIGlmIChkLT5saW5rX2luX21vbml0b3JzICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2htYWtlciAqbW0gPSBkLT5jb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyOworCisgICAgICBpZiAobW0gIT0gTlVMTCkKKyAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChtbSwgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT5jb25uZWN0aW9ucy0+bW9uaXRvcnMsIGQtPmxpbmtfaW5fbW9uaXRvcnMpOworICAgICAgZC0+bGlua19pbl9tb25pdG9ycyA9IE5VTEw7CisgICAgfQorCisgIGlmIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkLT5uYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmZC0+Y29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID0gTlVMTDsKKyAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgLT0gMTsKKworICAgICAgICAgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRqdXN0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKGQtPmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIC0xKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGp1c3RpbmcgZG93bndhcmQgc2hvdWxkIG5ldmVyIGZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLCBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBOVUxMOworICAgICAgICAgIGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgLT0gMTsKKworICAgICAgICAgIC8qIElmIHdlIGhhdmUgZHJvcHBlZCBiZWxvdyB0aGUgbWF4LiBudW1iZXIgb2YgaW5jb21wbGV0ZQorICAgICAgICAgICAqIGNvbm5lY3Rpb25zLCBzdGFydCBhY2NlcHQoKWluZyBhZ2FpbiAqLworICAgICAgICAgIGJ1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlID49IDApOworICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgPj0gMCk7CisgICAgfQorCisgIGJ1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChkLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbik7CisgIAorICAvKiBmcmVlcyAiZCIgYXMgc2lkZSBlZmZlY3QgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2Nvbm5lY3Rpb25fd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2Nvbm5lY3Rpb25fdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBkYXRhOworICAKKyAgaWYgKG5ld19zdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICB3aGlsZSAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbG93X3VuaXhfdXNlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCB1aWQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25uZWN0aW9uX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkID0gZGF0YTsKKworICAvKiBzZXJ2aWNlc19vd25lZCBzaG91bGQgYmUgTlVMTCBzaW5jZSB3ZSBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCisgIF9kYnVzX2Fzc2VydCAoZC0+c2VydmljZXNfb3duZWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9zZXJ2aWNlc19vd25lZCA9PSAwKTsKKyAgLyogc2ltaWxhcmx5ICovCisgIF9kYnVzX2Fzc2VydCAoZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMgPT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQpCisgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGQtPmNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQpOworCisgIGlmIChkLT5vb21fbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGQtPm9vbV9tZXNzYWdlKTsKKworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworCisgIGlmIChkLT5zZWxpbnV4X2lkKQorICAgIGJ1c19zZWxpbnV4X2lkX3VucmVmIChkLT5zZWxpbnV4X2lkKTsKKworICBpZiAoZC0+YXBwYXJtb3JfY29uZmluZW1lbnQpCisgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCk7CisgIAorICBkYnVzX2ZyZWUgKGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZyk7CisgIAorICBkYnVzX2ZyZWUgKGQtPm5hbWUpOworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworQnVzQ29ubmVjdGlvbnMqCitidXNfY29ubmVjdGlvbnNfbmV3IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9kYXRhX3Nsb3QpKQorICAgIGdvdG8gZmFpbGVkXzA7CisKKyAgY29ubmVjdGlvbnMgPSBkYnVzX25ldzAgKEJ1c0Nvbm5lY3Rpb25zLCAxKTsKKyAgaWYgKGNvbm5lY3Rpb25zID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMTsKKworICBjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzI7CisKKyAgY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlX2luY29tcGxldGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCBOVUxMKTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzM7CisKKyAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0LCBGQUxTRSk7CisKKyAgY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyA9IGJ1c19leHBpcmVfbGlzdF9uZXcgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0IChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyk7CisgIGlmIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfNDsKKyAgCisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCkpCisgICAgZ290byBmYWlsZWRfNTsKKyAgCisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCA9IDE7CisgIGNvbm5lY3Rpb25zLT5jb250ZXh0ID0gY29udGV4dDsKKyAgCisgIHJldHVybiBjb25uZWN0aW9uczsKKworIGZhaWxlZF81OgorICBidXNfZXhwaXJlX2xpc3RfZnJlZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgZmFpbGVkXzQ6CisgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCk7CisgZmFpbGVkXzM6CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlcik7CisgZmFpbGVkXzI6CisgIGRidXNfZnJlZSAoY29ubmVjdGlvbnMpOworIGZhaWxlZF8xOgorICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCk7CisgZmFpbGVkXzA6CisgIHJldHVybiBOVUxMOworfQorCitCdXNDb25uZWN0aW9ucyAqCitidXNfY29ubmVjdGlvbnNfcmVmIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID4gMCk7CisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBjb25uZWN0aW9uczsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25zX3VucmVmIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID4gMCk7CisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCAtPSAxOworICBpZiAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgLyogZHJvcCBhbGwgaW5jb21wbGV0ZSAqLworICAgICAgd2hpbGUgKGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9ucy0+aW5jb21wbGV0ZS0+ZGF0YTsKKworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSA9PSAwKTsKKworICAgICAgLyogZHJvcCBhbGwgbW9uaXRvcnMgKi8KKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9ucy0+bW9uaXRvcnMpOworCisgICAgICAvKiBkcm9wIGFsbCByZWFsIGNvbm5lY3Rpb25zICovCisgICAgICB3aGlsZSAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbnMtPmNvbXBsZXRlZC0+ZGF0YTsKKworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPm5fY29tcGxldGVkID09IDApOworCisgICAgICBidXNfZXhwaXJlX2xpc3RfZnJlZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgICAgICAKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQpOworICAgICAgCisgICAgICBfZGJ1c190aW1lb3V0X3VucmVmIChjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQpOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIpOworCisgICAgICBpZiAoY29ubmVjdGlvbnMtPm1vbml0b3JfbWF0Y2htYWtlciAhPSBOVUxMKQorICAgICAgICBidXNfbWF0Y2htYWtlcl91bnJlZiAoY29ubmVjdGlvbnMtPm1vbml0b3JfbWF0Y2htYWtlcik7CisKKyAgICAgIGRidXNfZnJlZSAoY29ubmVjdGlvbnMpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCk7CisgICAgfQorfQorCisvKiBVc2VkIGZvciBsb2dnaW5nICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NhY2hlX3BlZXJfbG9naW5mb19zdHJpbmcgKEJ1c0Nvbm5lY3Rpb25EYXRhICpkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uKQoreworICBEQnVzU3RyaW5nIGxvZ2luZm9fYnVmOworICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGNoYXIgKndpbmRvd3Nfc2lkOworICBkYnVzX2Jvb2xfdCBwcmV2X2FkZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsb2dpbmZvX2J1ZikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcHJldl9hZGRlZCA9IEZBTFNFOworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZsb2dpbmZvX2J1ZiwgInVpZD0lbGQiLCB1aWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJldl9hZGRlZCA9IFRSVUU7CisgICAgfQorCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbiwgJnBpZCkpCisgICAgeworICAgICAgaWYgKHByZXZfYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxvZ2luZm9fYnVmLCAnICcpKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZsb2dpbmZvX2J1ZiwgInBpZD0lbGQgY29tbT1cIiIsIHBpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgLyogSWdub3JlIGVycm9ycyBoZXJlOyB3ZSBtYXkgbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCB0aGUKKyAgICAgICAqIHByb2MgZmlsZS4gKi8KKyAgICAgIF9kYnVzX2NvbW1hbmRfZm9yX3BpZCAocGlkLCAmbG9naW5mb19idWYsIE1BWF9MT0dfQ09NTUFORF9MRU4sIE5VTEwpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZsb2dpbmZvX2J1ZiwgJyInKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoY29ubmVjdGlvbiwgJndpbmRvd3Nfc2lkKSkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBkaWRfYXBwZW5kOworICAgICAgZGlkX2FwcGVuZCA9IF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmbG9naW5mb19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWQ9XCIlc1wiICIsIHdpbmRvd3Nfc2lkKTsKKyAgICAgIGRidXNfZnJlZSAod2luZG93c19zaWQpOworICAgICAgaWYgKCFkaWRfYXBwZW5kKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmxvZ2luZm9fYnVmLCAmKGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZykpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9naW5mb19idWYpOyAKKworICByZXR1cm4gVFJVRTsKK29vbToKKyAgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9naW5mb19idWYpOworICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGVuZGluZ19mZHNfY2IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBpbnQgbl9wZW5kaW5nX3VuaXhfZmRzX29sZDsKKyAgaW50IG5fcGVuZGluZ191bml4X2Zkc19uZXc7CisKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisKKyAgbl9wZW5kaW5nX3VuaXhfZmRzX29sZCA9IGQtPm5fcGVuZGluZ191bml4X2ZkczsKKyAgbl9wZW5kaW5nX3VuaXhfZmRzX25ldyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X3BlbmRpbmdfZmRzX2NvdW50IChjb25uZWN0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiUGVuZGluZyBmZHMgY291bnQgY2hhbmdlZCBvbiBjb25uZWN0aW9uICVwOiAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgbl9wZW5kaW5nX3VuaXhfZmRzX29sZCwgbl9wZW5kaW5nX3VuaXhfZmRzX25ldyk7CisKKyAgaWYgKG5fcGVuZGluZ191bml4X2Zkc19vbGQgPT0gMCAmJiBuX3BlbmRpbmdfdW5peF9mZHNfbmV3ID4gMCkKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0LAorICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfcGVuZGluZ19mZF90aW1lb3V0IChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCkpOworICAgICAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0LCBUUlVFKTsKKyAgICB9CisKKyAgaWYgKG5fcGVuZGluZ191bml4X2Zkc19vbGQgPiAwICYmIG5fcGVuZGluZ191bml4X2Zkc19uZXcgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkIChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQsIEZBTFNFKTsKKyAgICB9CisKKworICBkLT5uX3BlbmRpbmdfdW5peF9mZHMgPSBuX3BlbmRpbmdfdW5peF9mZHNfbmV3OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BlbmRpbmdfdW5peF9mZHNfdGltZW91dF9jYiAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIAorICBkID0gZGJ1c19uZXcwIChCdXNDb25uZWN0aW9uRGF0YSwgMSk7CisgIAorICBpZiAoZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICBkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmQtPmNvbm5lY3Rpb25fdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5jb25uZWN0aW9uX3R2X3VzZWMpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uX2RhdGFfc2xvdCA+PSAwKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLCBmcmVlX2Nvbm5lY3Rpb25fZGF0YSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzIChjb25uZWN0aW9uLCBUUlVFKTsKKyAgCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+c2VsaW51eF9pZCA9IGJ1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBiaXQgYm9ndXMgYmVjYXVzZSB3ZSBwcmV0ZW5kIGFsbCBlcnJvcnMKKyAgICAgICAqIGFyZSBPT007IHRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBpbiBidXMuYworICAgICAgICogYW4gT09NIGVycm9yIGRpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uLCB3aGljaCBpcworICAgICAgICogdGhlIHNhbWUgdGhpbmcgd2Ugd2FudCBvbiBhbnkgb3RoZXIgZXJyb3IuCisgICAgICAgKi8KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBkLT5hcHBhcm1vcl9jb25maW5lbWVudCA9IGJ1c19hcHBhcm1vcl9pbml0X2Nvbm5lY3Rpb25fY29uZmluZW1lbnQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBiaXQgYm9ndXMgYmVjYXVzZSB3ZSBwcmV0ZW5kIGFsbCBlcnJvcnMKKyAgICAgICAqIGFyZSBPT007IHRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBpbiBidXMuYworICAgICAgICogYW4gT09NIGVycm9yIGRpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uLCB3aGljaCBpcworICAgICAgICogdGhlIHNhbWUgdGhpbmcgd2Ugd2FudCBvbiBhbnkgb3RoZXIgZXJyb3IuCisgICAgICAgKi8KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY29ubmVjdGlvbl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Nvbm5lY3Rpb25fd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9jb25uZWN0aW9uX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY29ubmVjdGlvbl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBGb3Igbm93IHdlIGRvbid0IG5lZWQgdG8gc2V0IGEgV2luZG93cyB1c2VyIGZ1bmN0aW9uIGJlY2F1c2UKKyAgICogdGhlcmUgYXJlIG5vIHBvbGljaWVzIGluIHRoZSBjb25maWcgZmlsZSBjb250cm9sbGluZyB3aGF0CisgICAqIFdpbmRvd3MgdXNlcnMgY2FuIGNvbm5lY3QuIFRoZSBkZWZhdWx0ICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZQorICAgKiBidXMgY2FuIGNvbm5lY3QnIGJlaGF2aW9yIG9mIERCdXNDb25uZWN0aW9uIGlzIGZpbmUgb24gV2luZG93cy4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5peF91c2VyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAoY29ubmVjdGlvbnMtPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvbm5lY3Rpb24pOworICBpZiAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIC8qIFNldHVwIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIGRpc3BhdGNoZXIgKi8KKyAgaWYgKCFidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gKGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBTZXR1cCBwZW5kaW5nIGZkcyB0aW1lb3V0IChzZWUgIzgwNTU5KSAqLworICBkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQgPSBfZGJ1c190aW1lb3V0X25ldyAoMTAwLCAvKiBpcnJlbGV2YW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKTsKKyAgaWYgKGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX3RpbWVvdXRfc2V0X2VuYWJsZWQgKGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCwgRkFMU0UpOworICBpZiAoIV9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0KSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19jb25uZWN0aW9uX3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAoREJ1c1BlbmRpbmdGZHNDaGFuZ2VGdW5jdGlvbikgY2hlY2tfcGVuZGluZ19mZHNfY2IsCisgICAgICAgICAgY29ubmVjdGlvbik7CisKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLCBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgIGNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgKz0gMTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworCisgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoY29ubmVjdGlvbnMpOworICAKKyAgLyogVGhlIGxpc3RlbmluZyBzb2NrZXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYWluIGxvb3AsCisgICAqIGkuZS4gZG9lcyBub3QgYWNjZXB0KCksIHdoaWxlIG5faW5jb21wbGV0ZSBpcyBhdCBpdHMKKyAgICogbWF4aW11bSB2YWx1ZTsgc28gd2Ugc2hvdWxkbid0IGdldCBoZXJlIGluIHRoYXQgY2FzZSAqLworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPD0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAoY29ubmVjdGlvbnMtPmNvbnRleHQpKTsKKworICAvKiBJZiB3ZSBoYXZlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zLAorICAgKiBzdG9wIGFjY2VwdCgpaW5nIGFueSBtb3JlLCB0byBhdmVydCBhIERvUy4gU2VlIGZkLm8gIzgwOTE5ICovCisgIGJ1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7CisgIAorICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICB7CisgICAgICBpZiAoZC0+c2VsaW51eF9pZCkKKyAgICAgICAgYnVzX3NlbGludXhfaWRfdW5yZWYgKGQtPnNlbGludXhfaWQpOworICAgICAgZC0+c2VsaW51eF9pZCA9IE5VTEw7CisKKyAgICAgIGlmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCkKKyAgICAgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCk7CisgICAgICBkLT5hcHBhcm1vcl9jb25maW5lbWVudCA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAgICAgCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpCisgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCk7CisKKyAgICAgIGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCA9IE5VTEw7CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0LT5uZXh0ID09IE5VTEwpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QtPnByZXYgPT0gTlVMTCk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgICAgICAgICBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzZXQgY29ubmVjdGlvbiBkYXRhIHRvIG51bGwiKTsKKworICAgICAgLyogImQiIGhhcyBub3cgYmVlbiBmcmVlZCAqLworICAgIH0KKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreyAgICAKKyAgaW50IG5leHRfaW50ZXJ2YWw7CisKKyAgbmV4dF9pbnRlcnZhbCA9IC0xOworICAKKyAgaWYgKGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlICE9IE5VTEwpCisgICAgeworICAgICAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIGludCBhdXRoX3RpbWVvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworICAgICAgYXV0aF90aW1lb3V0ID0gYnVzX2NvbnRleHRfZ2V0X2F1dGhfdGltZW91dCAoY29ubmVjdGlvbnMtPmNvbnRleHQpOworICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUsIGxpbmspOworICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAgICAgICAgIGRvdWJsZSBlbGFwc2VkOworICAgICAgCisgICAgICAgICAgY29ubmVjdGlvbiA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgICAgICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICAgICBlbGFwc2VkID0gRUxBUFNFRF9NSUxMSVNFQ09ORFNfU0lOQ0UgKGQtPmNvbm5lY3Rpb25fdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+Y29ubmVjdGlvbl90dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfc2VjLCB0dl91c2VjKTsKKworICAgICAgICAgIGlmIChlbGFwc2VkID49IChkb3VibGUpIGF1dGhfdGltZW91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgaWRlbnRpZnkgdGhlIGNvbm5lY3Rpb246IGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICogaGF2ZSBhIHVuaXF1ZSBuYW1lIHlldCwgd2UgZG9uJ3Qga25vdyBpdHMgdWlkL3BpZCB5ZXQsCisgICAgICAgICAgICAgICAqIGFuZCBzbyBvbi4gKi8KKyAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChjb25uZWN0aW9ucy0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBoYXMgbm90IGF1dGhlbnRpY2F0ZWQgc29vbiBlbm91Z2gsIGNsb3NpbmcgaXQgIgorICAgICAgICAgICAgICAgICAgIihhdXRoX3RpbWVvdXQ9JWRtcywgZWxhcHNlZDogJS4wZm1zKSIsCisgICAgICAgICAgICAgICAgICBhdXRoX3RpbWVvdXQsIGVsYXBzZWQpOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaW1pbmcgb3V0IGF1dGhlbnRpY2F0aW9uIGZvciBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIGNhbiBlbmQgdGhlIGxvb3AsIHNpbmNlIHRoZSBjb25uZWN0aW9ucyBhcmUgaW4gb2xkZXN0LWZpcnN0IG9yZGVyICovCisgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwgPSAoKGRvdWJsZSlhdXRoX3RpbWVvdXQpIC0gZWxhcHNlZDsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvbm5lY3Rpb24gJXAgYXV0aGVudGljYXRpb24gZXhwaXJlcyBpbiAlZCBtaWxsaXNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIG5leHRfaW50ZXJ2YWwpOworICAgICAgICAgIAorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhwaXJlX2luY29tcGxldGVfdGltZW91dCAodm9pZCAqZGF0YSkKK3sKKyAgQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiUnVubmluZ1xuIik7CisgIAorICAvKiBub3RlIHRoYXQgdGhpcyBtYXkgcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoY29ubmVjdGlvbnMpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZ3JvdXBzICAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAqKmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworCisgICpncm91cHMgPSBOVUxMOworICAqbl9ncm91cHMgPSAwOworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAodWlkLCBncm91cHMsIG5fZ3JvdXBzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaWQgbm90IGdldCBhbnkgZ3JvdXBzIGZvciBVSUQgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiR290ICVkIGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqbl9ncm91cHMsIHVpZCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsgLyogc3VjY2Vzc2Z1bGx5IGdvdCAwIGdyb3VwcyAqLworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25faXNfaW5fdW5peF9ncm91cCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgZ2lkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgbG9uZyAqZ3JvdXBfaWRzOworICBpbnQgbl9ncm91cF9pZHM7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgKGNvbm5lY3Rpb24sICZncm91cF9pZHMsICZuX2dyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICB7CisgICAgICBpZiAoZ3JvdXBfaWRzW2ldID09IGdpZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWUgKGdyb3VwX2lkcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQoZCAhPSBOVUxMKTsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgcmV0dXJuICJpbmFjdGl2ZSI7CisgIHJldHVybiBkLT5jYWNoZWRfbG9naW5mb19zdHJpbmc7ICAKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPnBvbGljeSAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBkLT5wb2xpY3k7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZm9yZWFjaF9hY3RpdmUgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+Y29tcGxldGVkKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQsIGxpbmspOworCisgICAgICBpZiAoISgqIGZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgZGF0YSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZvcmVhY2hfaW5hY3RpdmUgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUsIGxpbmspOworCisgICAgICBpZiAoISgqIGZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgZGF0YSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENhbGxzIGZ1bmN0aW9uIG9uIGVhY2ggYWN0aXZlIGNvbm5lY3Rpb247IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAjRkFMU0UsIHN0b3BzIGl0ZXJhdGluZy4gQWN0aXZlIGNvbm5lY3Rpb25zIGFyZSBhdXRoZW50aWNhdGVkCisgKiBhbmQgaGF2ZSBzZW50IGEgSGVsbG8gbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbnMgdGhlIGNvbm5lY3Rpb25zIG9iamVjdAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGl0IGFzIGEgc2Vjb25kIGFyZworICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfZm9yZWFjaF9hY3RpdmUgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgZm9yZWFjaF9hY3RpdmUgKGNvbm5lY3Rpb25zLCBmdW5jdGlvbiwgZGF0YSk7Cit9CisKKy8qKgorICogQ2FsbHMgZnVuY3Rpb24gb24gZWFjaCBjb25uZWN0aW9uOyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICogI0ZBTFNFLCBzdG9wcyBpdGVyYXRpbmcuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb25zIHRoZSBjb25uZWN0aW9ucyBvYmplY3QKKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBpdCBhcyBhIHNlY29uZCBhcmcKKyAqLwordm9pZAorYnVzX2Nvbm5lY3Rpb25zX2ZvcmVhY2ggKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIGlmICghZm9yZWFjaF9hY3RpdmUgKGNvbm5lY3Rpb25zLCBmdW5jdGlvbiwgZGF0YSkpCisgICAgcmV0dXJuOworCisgIGZvcmVhY2hfaW5hY3RpdmUgKGNvbm5lY3Rpb25zLCBmdW5jdGlvbiwgZGF0YSk7Cit9CisKK0J1c0NvbnRleHQqCitidXNfY29ubmVjdGlvbnNfZ2V0X2NvbnRleHQgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5jb250ZXh0OworfQorCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGNvdmVyaW5nIHRoZSBzYW1lIGNvbm5lY3Rpb24gdHdpY2Ugd2hlbgorICogdHJhdmVyc2luZyBjb25uZWN0aW9ucy4gTm90ZSB0aGF0IGl0IGFzc3VtZXMgd2Ugd2lsbAorICogYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCgpIGVhY2ggY29ubmVjdGlvbiBhdCBsZWFzdCBvbmNlIHBlcgorICogSU5UX01BWCBpbmNyZW1lbnRzIG9mIHRoZSBnbG9iYWwgc3RhbXAsIG9yIHdyYXBhcm91bmQgd291bGQgYnJlYWsKKyAqIHRoaW5ncy4KKyAqLwordm9pZAorYnVzX2Nvbm5lY3Rpb25zX2luY3JlbWVudF9zdGFtcCAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICBjb25uZWN0aW9ucy0+c3RhbXAgKz0gMTsKK30KKworLyogTWFyayBjb25uZWN0aW9uIHdpdGggY3VycmVudCBzdGFtcCwgcmV0dXJuIFRSVUUgaWYgaXQKKyAqIGRpZG4ndCBhbHJlYWR5IGhhdmUgdGhhdCBzdGFtcAorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIGlmIChkLT5zdGFtcCA9PSBkLT5jb25uZWN0aW9ucy0+c3RhbXApCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgeworICAgICAgZC0+c3RhbXAgPSBkLT5jb25uZWN0aW9ucy0+c3RhbXA7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK0J1c0NvbnRleHQqCitidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0OworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBkLT5jb25uZWN0aW9uczsKK30KKworQnVzUmVnaXN0cnkqCitidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfcmVnaXN0cnkgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKK30KKworQnVzQWN0aXZhdGlvbioKK2J1c19jb25uZWN0aW9uX2dldF9hY3RpdmF0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICByZXR1cm4gYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24gKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKK30KKworQnVzTWF0Y2htYWtlcioKK2J1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICByZXR1cm4gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKK30KKworQnVzU0VMaW51eElEKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBkLT5zZWxpbnV4X2lkOworfQorCitCdXNBcHBBcm1vckNvbmZpbmVtZW50KgorYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfcmVmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCk7CisgIHJldHVybiBkLT5hcHBhcm1vcl9jb25maW5lbWVudDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIG1lc3NhZ2UgYnVzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSdyZSBhbiBhY3RpdmUgbWVzc2FnZSBidXMgcGFydGljaXBhbnQKKyAqLworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bmFtZSAhPSBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfb29tX2Vycm9yIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsgIAorCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBpZiAoZC0+b29tX3ByZWFsbG9jYXRlZCAhPSBOVUxMKQorICAgIHJldHVybiBUUlVFOworICAKKyAgcHJlYWxsb2NhdGVkID0gZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgKGNvbm5lY3Rpb24pOworICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoY29ubmVjdGlvbiwgcHJlYWxsb2NhdGVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogZC0+bmFtZSBtYXkgYmUgTlVMTCwgYnV0IHRoYXQgaXMgT0sgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UsIGQtPm5hbWUpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoY29ubmVjdGlvbiwgcHJlYWxsb2NhdGVkKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogc2V0IHJlcGx5IHNlcmlhbCB0byBwbGFjZWhvbGRlciB2YWx1ZSBqdXN0IHNvIHNwYWNlIGlzIGFscmVhZHkgYWxsb2NhdGVkCisgICAqIGZvciBpdC4KKyAgICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsIDE0KSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoY29ubmVjdGlvbiwgcHJlYWxsb2NhdGVkKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGQtPm9vbV9tZXNzYWdlID0gbWVzc2FnZTsKKyAgZC0+b29tX3ByZWFsbG9jYXRlZCA9IHByZWFsbG9jYXRlZDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9zZW5kX29vbV9lcnJvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluX3JlcGx5X3RvKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7ICAKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7ICAKKyAgX2RidXNfYXNzZXJ0IChkLT5vb21fbWVzc2FnZSAhPSBOVUxMKTsKKworICBidXNfY29udGV4dF9sb2cgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiZGJ1cy1kYWVtb24gdHJhbnNhY3Rpb24gZmFpbGVkIChPT00pLCBzZW5kaW5nIGVycm9yIHRvICIKKyAgICAgICAgICAgICAgICAgICAic2VuZGVyICVzIiwgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKGNvbm5lY3Rpb24pKTsKKworICAvKiBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgc2luY2Ugd2Ugc2V0IGl0IHRvIGEgcGxhY2Vob2xkZXIgZWFybGllciAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChkLT5vb21fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKGluX3JlcGx5X3RvKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRmFpbGVkIHRvIHNldCByZXBseSBzZXJpYWwgZm9yIHByZWFsbG9jYXRlZCBvb20gbWVzc2FnZSIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGQtPm9vbV9tZXNzYWdlKSAhPSBOVUxMKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAoY29ubmVjdGlvbiwgZC0+b29tX3ByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5vb21fbWVzc2FnZSwgTlVMTCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChkLT5vb21fbWVzc2FnZSk7CisgIGQtPm9vbV9tZXNzYWdlID0gTlVMTDsKKyAgZC0+b29tX3ByZWFsbG9jYXRlZCA9IE5VTEw7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworc3RhdGljIHZvaWQKK3VwZGF0ZV9wZWFrIChpbnQgKnBlYWssCisgICAgICAgICAgICAgaW50IG4pCit7CisgIGlmICgqcGVhayA8IG4pCisgICAgKnBlYWsgPSBuOworfQorI2VuZGlmCisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKmxpbmspCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZkLT5tYXRjaF9ydWxlcywgbGluayk7CisKKyAgZC0+bl9tYXRjaF9ydWxlcyArPSAxOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgdXBkYXRlX3BlYWsgKCZkLT5wZWFrX21hdGNoX3J1bGVzLCBkLT5uX21hdGNoX3J1bGVzKTsKKyAgdXBkYXRlX3BlYWsgKCZkLT5jb25uZWN0aW9ucy0+cGVha19tYXRjaF9ydWxlc19wZXJfY29ubiwgZC0+bl9tYXRjaF9ydWxlcyk7CisKKyAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX21hdGNoX3J1bGVzICs9IDE7CisgIHVwZGF0ZV9wZWFrICgmZC0+Y29ubmVjdGlvbnMtPnBlYWtfbWF0Y2hfcnVsZXMsCisgICAgICAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+dG90YWxfbWF0Y2hfcnVsZXMpOworI2VuZGlmCit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpCit7CisgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAocnVsZSk7CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGVfbGluayAoY29ubmVjdGlvbiwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAqcnVsZSkKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmQtPm1hdGNoX3J1bGVzLCBydWxlKTsKKworICBkLT5uX21hdGNoX3J1bGVzIC09IDE7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9tYXRjaF9ydWxlcyA+PSAwKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9tYXRjaF9ydWxlcyAtPSAxOworI2VuZGlmCit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWF0Y2hfcnVsZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBkLT5uX21hdGNoX3J1bGVzOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICpsaW5rKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+c2VydmljZXNfb3duZWQsIGxpbmspOworCisgIGQtPm5fc2VydmljZXNfb3duZWQgKz0gMTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIHVwZGF0ZV9wZWFrICgmZC0+cGVha19idXNfbmFtZXMsIGQtPm5fc2VydmljZXNfb3duZWQpOworICB1cGRhdGVfcGVhayAoJmQtPmNvbm5lY3Rpb25zLT5wZWFrX2J1c19uYW1lc19wZXJfY29ubiwKKyAgICAgICAgICAgICAgIGQtPm5fc2VydmljZXNfb3duZWQpOworCisgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9idXNfbmFtZXMgKz0gMTsKKyAgdXBkYXRlX3BlYWsgKCZkLT5jb25uZWN0aW9ucy0+cGVha19idXNfbmFtZXMsCisgICAgICAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+dG90YWxfYnVzX25hbWVzKTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChzZXJ2aWNlKTsKKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZV9saW5rIChjb25uZWN0aW9uLCBsaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX293bmVkX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmZC0+c2VydmljZXNfb3duZWQsIHNlcnZpY2UpOworCisgIGQtPm5fc2VydmljZXNfb3duZWQgLT0gMTsKKyAgX2RidXNfYXNzZXJ0IChkLT5uX3NlcnZpY2VzX293bmVkID49IDApOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX2J1c19uYW1lcyAtPSAxOworI2VuZGlmCit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBkLT5uX3NlcnZpY2VzX293bmVkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisJCQkgY29uc3QgREJ1c1N0cmluZyAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bmFtZSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5wb2xpY3kgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKG5hbWUsICZkLT5uYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGQtPm5hbWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c192ZXJib3NlICgiTmFtZSAlcyBhc3NpZ25lZCB0byAlcFxuIiwgZC0+bmFtZSwgY29ubmVjdGlvbik7CisKKyAgZC0+cG9saWN5ID0gYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICAvKiB3ZSBtYXkgaGF2ZSBhIE5VTEwgcG9saWN5IG9uIE9PTSBvciBlcnJvciBnZXR0aW5nIGxpc3Qgb2YKKyAgICogZ3JvdXBzIGZvciBhIHVzZXIuIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBkb24ndCBoYW5kbGUgaXQgc28KKyAgICogd2VsbCBjdXJyZW50bHksIGFzIGl0IHdpbGwganVzdCBrZWVwIGZhaWxpbmcgb3ZlciBhbmQgb3Zlci4KKyAgICovCisKKyAgaWYgKGQtPnBvbGljeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHNlY3VyaXR5IHBvbGljeSBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChkLT5uYW1lKTsKKyAgICAgIGQtPm5hbWUgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFhZGp1c3RfY29ubmVjdGlvbnNfZm9yX3VpZCAoZC0+Y29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIDEpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIC8qIENyZWF0ZSBhbmQgY2FjaGUgYSBzdHJpbmcgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICAgKiBwZWVyIHByb2Nlc3M7IHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgICAqLworICBpZiAoIWNhY2hlX3BlZXJfbG9naW5mb19zdHJpbmcgKGQsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gZmFpbDsKKworICAvKiBOb3cgdGhlIGNvbm5lY3Rpb24gaXMgYWN0aXZlLCBtb3ZlIGl0IGJldHdlZW4gbGlzdHMgKi8KKyAgX2RidXNfbGlzdF91bmxpbmsgKCZkLT5jb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgZC0+Y29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSAtPSAxOworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+Y29ubmVjdGlvbnMtPmNvbXBsZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICBkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgKz0gMTsKKworICBfZGJ1c19hc3NlcnQgKGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+Y29ubmVjdGlvbnMtPm5fY29tcGxldGVkID4gMCk7CisKKyAgLyogSWYgd2UgaGF2ZSBkcm9wcGVkIGJlbG93IHRoZSBtYXguIG51bWJlciBvZiBpbmNvbXBsZXRlCisgICAqIGNvbm5lY3Rpb25zLCBzdGFydCBhY2NlcHQoKWluZyBhZ2FpbiAqLworICBidXNfY29udGV4dF9jaGVja19hbGxfd2F0Y2hlcyAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworCisgIC8qIFNlZSBpZiB3ZSBjYW4gcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoZC0+Y29ubmVjdGlvbnMpOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSk7CisgIAorICByZXR1cm4gVFJVRTsKK2ZhaWw6CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgIGQtPm5hbWUgPSBOVUxMOworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworICBkLT5wb2xpY3kgPSBOVUxMOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbnNfcmVsb2FkX3BvbGljeSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zICE9IE5VTEwpOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWQpKTsKKyAgICAgICBsaW5rOworICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCYoY29ubmVjdGlvbnMtPmNvbXBsZXRlZCksIGxpbmspKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChkLT5wb2xpY3kgIT0gTlVMTCk7CisKKyAgICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworICAgICAgZC0+cG9saWN5ID0gYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgKGNvbm5lY3Rpb25zLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgaWYgKGQtPnBvbGljeSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgc2VjdXJpdHkgcG9saWN5IGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPm5hbWU7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBjb21wbGV0aW5nIHRoZSBwYXNzZWQtaW4gY29ubmVjdGlvbiB3b3VsZAorICogZXhjZWVkIGxpbWl0cywgYW5kIGlmIHNvIHNldCBlcnJvciBhbmQgcmV0dXJuICNGQUxTRQorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcmVxdWVzdGluZ19jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisKKyAgaWYgKGNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGhhcyBiZWVuIHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKHJlcXVlc3RpbmdfY29tcGxldGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKGdldF9jb25uZWN0aW9uc19mb3JfdWlkIChjb25uZWN0aW9ucywgdWlkKSA+PQorICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGZvciBVSUQgJWx1IGhhcyBiZWVuIHJlYWNoZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAoQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nKQoreworICBfZGJ1c192ZXJib3NlICgiRnJlZWluZyBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKworICBkYnVzX2ZyZWUgKHBlbmRpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19wZW5kaW5nX3JlcGx5X3NlbmRfbm9fcmVwbHkgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqZXJybXNnOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX1JFUExZKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBJZiB5b3UgY2hhbmdlIHRoZXNlIG1lc3NhZ2VzLCBhZGp1c3QgdGVzdC9kYnVzLWRhZW1vbi5jIHRvIG1hdGNoICovCisgIGlmIChwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPT0gTlVMTCkKKyAgICBlcnJtc2cgPSAiTWVzc2FnZSByZWNpcGllbnQgZGlzY29ubmVjdGVkIGZyb20gbWVzc2FnZSBidXMgd2l0aG91dCByZXBseWluZyI7CisgIGVsc2UKKyAgICBlcnJtc2cgPSAiTWVzc2FnZSBkaWQgbm90IHJlY2VpdmUgYSByZXBseSAodGltZW91dCBieSBtZXNzYWdlIGJ1cykiOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJmVycm1zZykpCisgICAgZ290byBvdXQ7CisgICAgCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfcGVuZGluZ19yZXBseV9leHBpcmVkIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZyA9IGxpbmstPmRhdGE7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyA9IGRhdGE7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgCisgIC8qIE5vIHJlcGx5IGlzIGZvcnRoY29taW5nLiBTbyBudWtlIGl0IGlmIHdlIGNhbi4gSWYgbm90LAorICAgKiBsZWF2ZSBpdCBpbiB0aGUgbGlzdCB0byB0cnkgZXhwaXJpbmcgYWdhaW4gbGF0ZXIgd2hlbiB3ZQorICAgKiBnZXQgbW9yZSBtZW1vcnkuCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCJFeHBpcmluZyBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgCisgIHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoY29ubmVjdGlvbnMtPmNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWJ1c19wZW5kaW5nX3JlcGx5X3NlbmRfbm9fcmVwbHkgKGNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcpKQorICAgIHsKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZV9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLCBsaW5rKTsKKworICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgLyogVGhlIERCdXNDb25uZWN0aW9uIGlzIGFsbW9zdCAxMDAlIGZpbmFsaXplZCBoZXJlLCBzbyB5b3UgY2FuJ3QKKyAgICogZG8gYW55dGhpbmcgd2l0aCBpdCBleGNlcHQgY2hlY2sgZm9yIHBvaW50ZXIgZXF1YWxpdHkKKyAgICovCisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCJEcm9wcGluZyBwZW5kaW5nIHJlcGxpZXMgdGhhdCBpbnZvbHZlIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmc7CisKKyAgICAgIG5leHQgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X25leHRfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICBwZW5kaW5nID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHRyYWNrIHRoaXMgcGVuZGluZyByZXBseSBhbnltb3JlICovCisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRHJvcHBpbmcgcGVuZGluZyByZXBseSAlcCwgcmVwbGllciAlcCByZWNlaXZlciAlcCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgICAgICAgICAKKyAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcmVwbHkgaXNuJ3QgZ29pbmcgdG8gYmUgc2VudCwgc28gc2V0IHRoaW5ncworICAgICAgICAgICAqIHVwIHNvIGl0IHdpbGwgYmUgZXhwaXJlZCByaWdodCBhd2F5CisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZXhwaXJlIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgICAgICAgICAgCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID0gTlVMTDsKKyAgICAgICAgICBwZW5kaW5nLT5leHBpcmVfaXRlbS5hZGRlZF90dl9zZWMgPSAwOworICAgICAgICAgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3VzZWMgPSAwOworCisgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3JlY2hlY2tfaW1tZWRpYXRlbHkgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmc7CisgIEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnM7Cit9IENhbmNlbFBlbmRpbmdSZXBseURhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfcGVuZGluZ19yZXBseSAodm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIiwgZCk7CisgIAorICBpZiAoIWJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQtPnBlbmRpbmctPmV4cGlyZV9pdGVtKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJwZW5kaW5nIHJlcGx5IGRpZCBub3QgZXhpc3QgdG8gYmUgY2FuY2VsbGVkIik7CisKKyAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAoZC0+cGVuZGluZyk7IC8qIHNpbmNlIGl0J3MgYmVlbiBjYW5jZWxsZWQgKi8KK30KKworc3RhdGljIHZvaWQKK2NhbmNlbF9wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIiwgZCk7CisgIAorICAvKiBkLT5wZW5kaW5nIHNob3VsZCBiZSBlaXRoZXIgZnJlZWQgb3Igc3RpbGwKKyAgICogaW4gdGhlIGxpc3Qgb2YgcGVuZGluZyByZXBsaWVzIChvd25lZCBieSBzb21lb25lCisgICAqIGVsc2UpCisgICAqLworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworLyoKKyAqIFJlY29yZCB0aGF0IGEgcmVwbHkgaXMgYWxsb3dlZDsgcmV0dXJuIFRSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICp3aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqd2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICpyZXBseV90b190aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nOworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIENhbmNlbFBlbmRpbmdSZXBseURhdGEgKmNwcmQ7CisgIGludCBjb3VudDsKKworICBfZGJ1c19hc3NlcnQgKHdpbGxfZ2V0X3JlcGx5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHdpbGxfc2VuZF9yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBseV90b190aGlzICE9IE5VTEwpOworICAKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKHJlcGx5X3RvX3RoaXMpKQorICAgIHJldHVybiBUUlVFOyAvKiB3ZSB3b24ndCBhbGxvdyBhIHJlcGx5LCBzaW5jZSBjbGllbnQgZG9lc24ndCBjYXJlIGZvciBvbmUuICovCisgIAorICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAocmVwbHlfdG9fdGhpcyk7CisKKyAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBwZW5kaW5nID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSByZXBseV9zZXJpYWwgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSB3aWxsX2dldF9yZXBseSAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSB3aWxsX3NlbmRfcmVwbHkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgaGFzIHRoZSBzYW1lIHJlcGx5IHNlcmlhbCBhcyBhIGN1cnJlbnRseS1vdXRzdGFuZGluZyBleGlzdGluZyBtZXRob2QgY2FsbCIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgaWYgKHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IHdpbGxfZ2V0X3JlcGx5KQorICAgICAgICArK2NvdW50OworICAgIH0KKyAgCisgIGlmIChjb3VudCA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIChjb25uZWN0aW9ucy0+Y29udGV4dCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKwkJICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIHJlcGxpZXMgcGVyIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVhY2hlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nUmVwbHksIDEpOworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIC8qIHNvIHdlIGNhbiBzZWUgYSBub3QteWV0LWFkZGVkIHBlbmRpbmcgcmVwbHkgKi8KKyAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfc2VjID0gMTsKKyAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfdXNlYyA9IDE7CisjZW5kaWYKKworICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9IHdpbGxfZ2V0X3JlcGx5OworICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPSB3aWxsX3NlbmRfcmVwbHk7CisgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9IHJlcGx5X3NlcmlhbDsKKyAgCisgIGNwcmQgPSBkYnVzX25ldzAgKENhbmNlbFBlbmRpbmdSZXBseURhdGEsIDEpOworICBpZiAoY3ByZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIWJ1c19leHBpcmVfbGlzdF9hZGQgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPmV4cGlyZV9pdGVtKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChjcHJkKTsKKyAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX3BlbmRpbmdfcmVwbHlfZGF0YV9mcmVlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywgJnBlbmRpbmctPmV4cGlyZV9pdGVtKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGNwcmQtPnBlbmRpbmcgPSBwZW5kaW5nOworICBjcHJkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICAKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5leHBpcmVfaXRlbS5hZGRlZF90dl91c2VjKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRkZWQgcGVuZGluZyByZXBseSAlcCwgcmVwbGllciAlcCByZWNlaXZlciAlcCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xpc3QgICAgICAgICpsaW5rOworICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zOworfSBDaGVja1BlbmRpbmdSZXBseURhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfY2hlY2tfcGVuZGluZ19yZXBseSAodm9pZCAqZGF0YSkKK3sKKyAgQ2hlY2tQZW5kaW5nUmVwbHlEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiZCA9ICVwXG4iLGQpOworCisgIGJ1c19leHBpcmVfbGlzdF9hZGRfbGluayAoZC0+Y29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5saW5rKTsKKyAgZC0+bGluayA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgQ2hlY2tQZW5kaW5nUmVwbHlEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiZCA9ICVwXG4iLGQpOworICAKKyAgaWYgKGQtPmxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcgPSBkLT5saW5rLT5kYXRhOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKCFidXNfZXhwaXJlX2xpc3RfY29udGFpbnNfaXRlbSAoZC0+Y29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+ZXhwaXJlX2l0ZW0pKTsKKyAgICAgIAorICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZC0+bGluayk7CisgICAgfQorICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgYSByZXBseSBpcyBhbGxvd2VkLCByZW1vdmUgQnVzUGVuZGluZ1JlcGx5CisgKiBpZiBzbywgcmV0dXJuIFRSVUUgaWYgc28uCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbnNfY2hlY2tfcmVwbHkgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGluZ19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnJlY2VpdmluZ19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIENoZWNrUGVuZGluZ1JlcGx5RGF0YSAqY3ByZDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICAKKyAgX2RidXNfYXNzZXJ0IChzZW5kaW5nX3JlcGx5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlY2VpdmluZ19yZXBseSAhPSBOVUxMKTsKKworICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAocmVwbHkpOworCisgIGxpbmsgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZyA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gcmVwbHlfc2VyaWFsICYmCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPT0gcmVjZWl2aW5nX3JlcGx5ICYmCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID09IHNlbmRpbmdfcmVwbHkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRm91bmQgcGVuZGluZyByZXBseSB3aXRoIHNlcmlhbCAldVxuIiwgcmVwbHlfc2VyaWFsKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgIH0KKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwZW5kaW5nIHJlcGx5IGV4cGVjdGVkXG4iKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjcHJkID0gZGJ1c19uZXcwIChDaGVja1BlbmRpbmdSZXBseURhdGEsIDEpOworICBpZiAoY3ByZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfY2hlY2tfcGVuZGluZ19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3BlbmRpbmdfcmVwbHlfZGF0YV9mcmVlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChjcHJkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgY3ByZC0+bGluayA9IGxpbms7CisgIGNwcmQtPmNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnM7CisgIAorICBidXNfZXhwaXJlX2xpc3RfdW5saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoIWJ1c19leHBpcmVfbGlzdF9jb250YWluc19pdGVtIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLCBsaW5rLT5kYXRhKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBUcmFuc2FjdGlvbnMKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBmYWlybHkgZnJhZ2lsZTsgaW4gcGFydGljdWxhciwgZG9uJ3QgdHJ5IHRvIHVzZQorICogb25lIHRyYW5zYWN0aW9uIGFjcm9zcyBhbnkgbWFpbiBsb29wIGl0ZXJhdGlvbnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZTsKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKK30gTWVzc2FnZVRvU2VuZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzVHJhbnNhY3Rpb25DYW5jZWxGdW5jdGlvbiBjYW5jZWxfZnVuY3Rpb247CisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmN0aW9uOworICB2b2lkICpkYXRhOworfSBDYW5jZWxIb29rOworCitzdHJ1Y3QgQnVzVHJhbnNhY3Rpb24KK3sKKyAgREJ1c0xpc3QgKmNvbm5lY3Rpb25zOworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzTGlzdCAqY2FuY2VsX2hvb2tzOworfTsKKworc3RhdGljIHZvaWQKK21lc3NhZ2VfdG9fc2VuZF9mcmVlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVG9TZW5kICAqdG9fc2VuZCkKK3sKKyAgaWYgKHRvX3NlbmQtPm1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmICh0b19zZW5kLT5tZXNzYWdlKTsKKworICBpZiAodG9fc2VuZC0+cHJlYWxsb2NhdGVkKQorICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChjb25uZWN0aW9uLCB0b19zZW5kLT5wcmVhbGxvY2F0ZWQpOworCisgIGRidXNfZnJlZSAodG9fc2VuZCk7Cit9CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfaG9va19jYW5jZWwgKHZvaWQgKmVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIENhbmNlbEhvb2sgKmNoID0gZWxlbWVudDsKKworICBfZGJ1c192ZXJib3NlICgiUnVubmluZyB0cmFuc2FjdGlvbiBjYW5jZWwgaG9va1xuIik7CisgIAorICBpZiAoY2gtPmNhbmNlbF9mdW5jdGlvbikKKyAgICAoKiBjaC0+Y2FuY2VsX2Z1bmN0aW9uKSAoY2gtPmRhdGEpOyAgCit9CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfaG9va19mcmVlICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsSG9vayAqY2ggPSBlbGVtZW50OworCisgIGlmIChjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKQorICAgICgqIGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24pIChjaC0+ZGF0YSk7CisKKyAgZGJ1c19mcmVlIChjaCk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2NhbmNlbF9ob29rcyAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0cmFuc2FjdGlvbi0+Y2FuY2VsX2hvb2tzLAorICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9ob29rX2ZyZWUsIE5VTEwpOworICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MpOworfQorCitCdXNUcmFuc2FjdGlvbioKK2J1c190cmFuc2FjdGlvbl9uZXcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKworICB0cmFuc2FjdGlvbiA9IGRidXNfbmV3MCAoQnVzVHJhbnNhY3Rpb24sIDEpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0cmFuc2FjdGlvbi0+Y29udGV4dCA9IGNvbnRleHQ7CisgIAorICByZXR1cm4gdHJhbnNhY3Rpb247Cit9CisKK0J1c0NvbnRleHQqCitidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24pCit7CisgIHJldHVybiB0cmFuc2FjdGlvbi0+Y29udGV4dDsKK30KKworLyoqCisgKiBSZXNlcnZlIGVub3VnaCBtZW1vcnkgdG8gY2FwdHVyZSB0aGUgZ2l2ZW4gbWVzc2FnZSBpZiB0aGUKKyAqIHRyYW5zYWN0aW9uIGdvZXMgdGhyb3VnaC4KKyAqLworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9jYXB0dXJlIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zOworICBCdXNNYXRjaG1ha2VyICptbTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICpyZWNpcGllbnRzID0gTlVMTDsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAgY29ubmVjdGlvbnMgPSBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgKHRyYW5zYWN0aW9uLT5jb250ZXh0KTsKKworICAvKiBzaG9ydGN1dDogZG9uJ3QgY29tcG9zZSB0aGUgbWVzc2FnZSB1bmxlc3Mgc29tZW9uZSB3YW50cyBpdCAqLworICBpZiAoY29ubmVjdGlvbnMtPm1vbml0b3JzID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbW0gPSBjb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyOworICAvKiBUaGlzIGlzIG5vbi1udWxsIGlmIHRoZXJlIGhhcyBldmVyIGJlZW4gYSBtb25pdG9yIC0gd2UgZG9uJ3QgR0MgaXQuCisgICAqIFRoZXJlJ3MgbGl0dGxlIHBvaW50LCBzaW5jZSB0aGVyZSBpcyB1cCB0byAxIHBlciBwcm9jZXNzLiAqLworICBfZGJ1c19hc3NlcnQgKG1tICE9IE5VTEwpOworCisgIGlmICghYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgKG1tLCBjb25uZWN0aW9ucywgc2VuZGVyLCBOVUxMLCBtZXNzYWdlLAorICAgICAgICAmcmVjaXBpZW50cykpCisgICAgZ290byBvdXQ7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJlY2lwaWVudHMpOworICAgICAgbGluayAhPSBOVUxMOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJlY2lwaWVudHMsIGxpbmspKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpyZWNpcGllbnQgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwgcmVjaXBpZW50LCBtZXNzYWdlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldCA9IFRSVUU7CisKK291dDoKKyAgX2RidXNfbGlzdF9jbGVhciAoJnJlY2lwaWVudHMpOworICByZXR1cm4gcmV0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmVfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKmluX3JlcGx5X3RvKQoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIGNvbm5lY3Rpb25zID0gYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zICh0cmFuc2FjdGlvbi0+Y29udGV4dCk7CisKKyAgLyogc2hvcnRjdXQ6IGRvbid0IGNvbXBvc2UgdGhlIG1lc3NhZ2UgdW5sZXNzIHNvbWVvbmUgd2FudHMgaXQgKi8KKyAgaWYgKGNvbm5lY3Rpb25zLT5tb25pdG9ycyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAoaW5fcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChyZXBseSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIGdvdG8gb3V0OworCisgIHJldCA9IGJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICh0cmFuc2FjdGlvbiwgTlVMTCwgcmVwbHkpOworCitvdXQ6CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gcmV0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIC8qIFdlIGhhdmUgdG8gc2V0IHRoZSBzZW5kZXIgdG8gdGhlIGRyaXZlciwgYW5kIGhhdmUKKyAgICogdG8gY2hlY2sgc2VjdXJpdHkgcG9saWN5IHNpbmNlIGl0IHdhcyBub3QgZG9uZSBpbgorICAgKiBkaXNwYXRjaC5jCisgICAqLworICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyAlcyAlcyAlcyBmcm9tIGRyaXZlclxuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIihubyBpbnRlcmZhY2UpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDogIihubyBtZW1iZXIpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgOiAiKG5vIGVycm9yIG5hbWUpIik7CisgICAgICAgICAgICAgICAgIAorICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIGJ1cyBkcml2ZXIgbmV2ZXIgd2FudHMgYSByZXBseSAqLworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKworICAvKiBDYXB0dXJlIGl0IGZvciBtb25pdG9ycywgZXZlbiBpZiB0aGUgcmVhbCByZWNpcGllbnQncyByZWNlaXZlIHBvbGljeQorICAgKiBkb2VzIG5vdCBhbGxvdyBpdCB0byByZWNlaXZlIHRoaXMgbWVzc2FnZSBmcm9tIHVzICh3aGljaCB3b3VsZCBiZSBvZGQpLgorICAgKi8KKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIE5VTEwsIG1lc3NhZ2UpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBJZiBzZWN1cml0eSBwb2xpY3kgZG9lc24ndCBhbGxvdyB0aGUgbWVzc2FnZSwgd2Ugd291bGQgc2lsZW50bHkKKyAgICogZWF0IGl0OyB0aGUgZHJpdmVyIGRvZXNuJ3QgY2FyZSBhYm91dCBnZXR0aW5nIGEgcmVwbHkuIEhvd2V2ZXIsCisgICAqIGlmIHdlJ3JlIGFjdGl2ZWx5IGNhcHR1cmluZyBtZXNzYWdlcywgaXQncyBuaWNlIHRvIGxvZyB0aGF0IHdlCisgICAqIHRyaWVkIHRvIHNlbmQgaXQgYW5kIGRpZCBub3QgYWxsb3cgb3Vyc2VsdmVzIHRvIGRvIHNvLgorICAgKi8KKyAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmVfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLCAmZXJyb3IsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2NvbnRleHRfbG9nICh0cmFuc2FjdGlvbi0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBmcm9tIGRidXMtZGFlbW9uIHJlamVjdGVkIGJ1dCBub3QgZW5vdWdoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgdG8gY2FwdHVyZSBpdCIpOworICAgICAgICB9CisKKyAgICAgIC8qIFRoaXMgaXMgbm90IGZhdGFsIHRvIHRoZSB0cmFuc2FjdGlvbiBzbyBzaWxlbnRseSBlYXQgdGhlIGRpc2FsbG93ZWQKKyAgICAgICAqIG1lc3NhZ2UgKHNlZSByZWFzb25pbmcgYWJvdmUpICovCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIGJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fc2VuZCAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBNZXNzYWdlVG9TZW5kICp0b19zZW5kOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHJ5aW5nIHRvIGFkZCAlcyBpbnRlcmZhY2U9JXMgbWVtYmVyPSVzIGVycm9yPSVzIHRvIHRyYW5zYWN0aW9uJXNcbiIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IgPyAiZXJyb3IiIDoKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDAgPyAicmVwbHkiIDoKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICIiIDogIiAoZGlzY29ubmVjdGVkKSIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgcmV0dXJuIFRSVUU7IC8qIHNpbGVudGx5IGlnbm9yZSBkaXNjb25uZWN0ZWQgY29ubmVjdGlvbnMgKi8KKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgdG9fc2VuZCA9IGRidXNfbmV3IChNZXNzYWdlVG9TZW5kLCAxKTsKKyAgaWYgKHRvX3NlbmQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRvX3NlbmQtPnByZWFsbG9jYXRlZCA9IGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kIChjb25uZWN0aW9uKTsKKyAgaWYgKHRvX3NlbmQtPnByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodG9fc2VuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgCisgIAorICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKyAgdG9fc2VuZC0+bWVzc2FnZSA9IG1lc3NhZ2U7CisgIHRvX3NlbmQtPnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoImFib3V0IHRvIHByZXBlbmQgbWVzc2FnZVxuIik7CisgIAorICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCB0b19zZW5kKSkKKyAgICB7CisgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgdG9fc2VuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJwcmVwZW5kZWQgbWVzc2FnZVxuIik7CisgIAorICAvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYWQgdGhpcyBjb25uZWN0aW9uIGluIHRoZSBsaXN0CisgICAqIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBtZXNzYWdlLAorICAgKiB0aGVuIHdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucworICAgKi8KKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcyk7CisgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSA9PSB0b19zZW5kKTsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCBsaW5rKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBNZXNzYWdlVG9TZW5kICptID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIGxpbmspOworICAgICAgCisgICAgICBpZiAobS0+dHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24pCisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIHRvX3NlbmQpOworICAgICAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCB0b19zZW5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFuc2FjdGlvbl9mcmVlIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zID09IE5VTEwpOworCisgIGZyZWVfY2FuY2VsX2hvb2tzICh0cmFuc2FjdGlvbik7CisKKyAgZGJ1c19mcmVlICh0cmFuc2FjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2NhbmNlbF90cmFuc2FjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIE1lc3NhZ2VUb1NlbmQgKm0gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgICAgICAKKyAgICAgIGlmIChtLT50cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICAKKyAgICAgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoIlRSQU5TQUNUSU9OOiBjYW5jZWxsZWRcbiIpOworICAKKyAgd2hpbGUgKChjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZ0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMpKSkKKyAgICBjb25uZWN0aW9uX2NhbmNlbF90cmFuc2FjdGlvbiAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24pOworCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MsCisgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2hvb2tfY2FuY2VsLCBOVUxMKTsKKworICB0cmFuc2FjdGlvbl9mcmVlICh0cmFuc2FjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2V4ZWN1dGVfdHJhbnNhY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIC8qIFNlbmQgdGhlIHF1ZXVlIGluIG9yZGVyIChGSUZPKSAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIE1lc3NhZ2VUb1NlbmQgKm0gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKnByZXYgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgICAgICAKKyAgICAgIGlmIChtLT50cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0tPm1lc3NhZ2UpICE9IE5VTEwpOworICAgICAgICAgIAorICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgIG0tPnByZWFsbG9jYXRlZCA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IGRvdWJsZS1mcmVlIGl0ICovCisgICAgICAgICAgCisgICAgICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgbGluayA9IHByZXY7CisgICAgfQorfQorCit2b2lkCitidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICAvKiBGb3IgZWFjaCBjb25uZWN0aW9uIGluIHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucworICAgKiBzZW5kIHRoZSBtZXNzYWdlcworICAgKi8KKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoIlRSQU5TQUNUSU9OOiBleGVjdXRpbmdcbiIpOworICAKKyAgd2hpbGUgKChjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZ0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMpKSkKKyAgICBjb25uZWN0aW9uX2V4ZWN1dGVfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uKTsKKworICB0cmFuc2FjdGlvbl9mcmVlICh0cmFuc2FjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY29ubmVjdGlvbl9yZW1vdmVfdHJhbnNhY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgTWVzc2FnZVRvU2VuZCAqdG9fc2VuZDsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHdoaWxlICgodG9fc2VuZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpKSkKKyAgICB7CisgICAgICAvKiBvbmx5IGhhcyBhbiBlZmZlY3QgZm9yIHRoZSBmaXJzdCBNZXNzYWdlVG9TZW5kIGxpc3RpbmcgdGhpcyB0cmFuc2FjdGlvbiAqLworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZ0b19zZW5kLT50cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIHRvX3NlbmQpOworICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIHRvX3NlbmQpOworICAgIH0KK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgREJ1c0Vycm9yIHRvIGEgbWVzc2FnZSByZXBseQorICovCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICppbl9yZXBseV90bykKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAKKyAgX2RidXNfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXJyb3IgcmVwbHkgJXMgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBlcnJvci0+bmFtZSwgZXJyb3ItPm1lc3NhZ2UpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAoaW5fcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb25DYW5jZWxGdW5jdGlvbiAgY2FuY2VsX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgQ2FuY2VsSG9vayAqY2g7CisKKyAgY2ggPSBkYnVzX25ldyAoQ2FuY2VsSG9vaywgMSk7CisgIGlmIChjaCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c192ZXJib3NlICgiICAgICBhZGRpbmcgY2FuY2VsIGhvb2sgZnVuY3Rpb24gPSAlcCBkYXRhID0gJXBcbiIsCisgICAgICAgICAgICAgICAgIGNhbmNlbF9mdW5jdGlvbiwgZGF0YSk7CisgIAorICBjaC0+Y2FuY2VsX2Z1bmN0aW9uID0gY2FuY2VsX2Z1bmN0aW9uOworICBjaC0+ZGF0YSA9IGRhdGE7CisgIGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisKKyAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgaG9va3MgZ2V0IHJ1biBpbiByZXZlcnNlIG9yZGVyIHRoYXQgdGhleQorICAgKiB3ZXJlIGFkZGVkCisgICAqLworICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MsIGNoKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGNoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF9uX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPm5fY29tcGxldGVkOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfbl9pbmNvbXBsZXRlIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF90b3RhbF9tYXRjaF9ydWxlcyAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnRvdGFsX21hdGNoX3J1bGVzOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlcyAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnBlYWtfbWF0Y2hfcnVsZXM7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzX3Blcl9jb25uIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+cGVha19tYXRjaF9ydWxlc19wZXJfY29ubjsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX2J1c19uYW1lcyAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnRvdGFsX2J1c19uYW1lczsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfYnVzX25hbWVzIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIHJldHVybiBjb25uZWN0aW9ucy0+cGVha19idXNfbmFtZXM7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX2J1c19uYW1lc19wZXJfY29ubiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnBlYWtfYnVzX25hbWVzX3Blcl9jb25uOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uX2dldF9wZWFrX21hdGNoX3J1bGVzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQoZCAhPSBOVUxMKTsKKworICByZXR1cm4gZC0+cGVha19tYXRjaF9ydWxlczsKK30KKworaW50CitidXNfY29ubmVjdGlvbl9nZXRfcGVha19idXNfbmFtZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydChkICE9IE5VTEwpOworCisgIHJldHVybiBkLT5wZWFrX2J1c19uYW1lczsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9TVEFUUyAqLworCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25faXNfbW9uaXRvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPmxpbmtfaW5fbW9uaXRvcnMgIT0gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitiY2RfYWRkX21vbml0b3JfcnVsZXMgKEJ1c0Nvbm5lY3Rpb25EYXRhICAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAqKnJ1bGVzKQoreworICBCdXNNYXRjaG1ha2VyICptbSA9IGQtPmNvbm5lY3Rpb25zLT5tb25pdG9yX21hdGNobWFrZXI7CisgIERCdXNMaXN0ICppdGVyOworCisgIGlmIChtbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1tID0gYnVzX21hdGNobWFrZXJfbmV3ICgpOworCisgICAgICBpZiAobW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBkLT5jb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyID0gbW07CisgICAgfQorCisgIGZvciAoaXRlciA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHJ1bGVzKTsKKyAgICAgIGl0ZXIgIT0gTlVMTDsKKyAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHJ1bGVzLCBpdGVyKSkKKyAgICB7CisgICAgICBpZiAoIWJ1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChtbSwgaXRlci0+ZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfbWF0Y2htYWtlcl9kaXNjb25uZWN0ZWQgKG1tLCBjb25uZWN0aW9uKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitiY2RfZHJvcF9tb25pdG9yX3J1bGVzIChCdXNDb25uZWN0aW9uRGF0YSAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNNYXRjaG1ha2VyICptbSA9IGQtPmNvbm5lY3Rpb25zLT5tb25pdG9yX21hdGNobWFrZXI7CisKKyAgaWYgKG1tICE9IE5VTEwpCisgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChtbSwgY29ubmVjdGlvbik7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9iZV9tb25pdG9yIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0xpc3QgKnRtcDsKKyAgREJ1c0xpc3QgKml0ZXI7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY29ubmVjdGlvbik7CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJjZF9hZGRfbW9uaXRvcl9ydWxlcyAoZCwgY29ubmVjdGlvbiwgcnVsZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHJlbGVhc2UgYWxsIGl0cyBuYW1lcyAqLworICBpZiAoIV9kYnVzX2xpc3RfY29weSAoJmQtPnNlcnZpY2VzX293bmVkLCAmdG1wKSkKKyAgICB7CisgICAgICBiY2RfZHJvcF9tb25pdG9yX3J1bGVzIChkLCBjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZvciAoaXRlciA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ0bXApOworICAgICAgaXRlciAhPSBOVUxMOworICAgICAgaXRlciA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRtcCwgaXRlcikpCisgICAgeworICAgICAgQnVzU2VydmljZSAqc2VydmljZSA9IGl0ZXItPmRhdGE7CisKKyAgICAgIC8qIFRoaXMgY2FsbCBpcyB0cmFuc2FjdGlvbmFsOiBpZiB0aGVyZSBpc24ndCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICAgKiBkbyBldmVyeXRoaW5nLCB0aGVuIHRoZSBzZXJ2aWNlIGdldHMgYWxsIGl0cyBuYW1lcyBiYWNrIHdoZW4KKyAgICAgICAqIHRoZSB0cmFuc2FjdGlvbiBpcyBjYW5jZWxsZWQgZHVlIHRvIE9PTS4gKi8KKyAgICAgIGlmICghYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgYmNkX2Ryb3BfbW9uaXRvcl9ydWxlcyAoZCwgY29ubmVjdGlvbik7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0bXApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBXZSBoYXZlIG5vdyBkb25lIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gZmFpbCwgc28gdGhlcmUgaXMgbm8gcHJvYmxlbQorICAgKiB3aXRoIGRvaW5nIHRoZSBpcnJldm9jYWJsZSBzdHVmZi4gKi8KKworICBfZGJ1c19saXN0X2NsZWFyICgmdG1wKTsKKworICBidXNfY29udGV4dF9sb2cgKHRyYW5zYWN0aW9uLT5jb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiAlcyAoJXMpIGJlY2FtZSBhIG1vbml0b3IuIiwgZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICBkLT5jYWNoZWRfbG9naW5mb19zdHJpbmcpOworCisgIGlmIChkLT5uX21hdGNoX3J1bGVzID4gMCkKKyAgICB7CisgICAgICBCdXNNYXRjaG1ha2VyICptbTsKKworICAgICAgbW0gPSBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChtbSwgY29ubmVjdGlvbik7CisgICAgfQorCisgIC8qIGZsYWcgaXQgYXMgYSBtb25pdG9yICovCisgIGQtPmxpbmtfaW5fbW9uaXRvcnMgPSBsaW5rOworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+Y29ubmVjdGlvbnMtPm1vbml0b3JzLCBsaW5rKTsKKworICAvKiBpdCBpc24ndCBhbGxvd2VkIHRvIHJlcGx5LCBhbmQgaXQgaXMgbm8gbG9uZ2VyIHJlbGV2YW50IHdoZXRoZXIgaXQKKyAgICogcmVjZWl2ZXMgcmVwbGllcyAqLworICBidXNfY29ubmVjdGlvbl9kcm9wX3BlbmRpbmdfcmVwbGllcyAoZC0+Y29ubmVjdGlvbnMsIGNvbm5lY3Rpb24pOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvYnVzL2Nvbm5lY3Rpb24uaCBiL2J1cy9jb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2OGQwYQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29ubmVjdGlvbi5oICBDbGllbnQgY29ubmVjdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09OTkVDVElPTl9ICisjZGVmaW5lIEJVU19DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSAiYnVzLmgiCisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbikgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKworCitCdXNDb25uZWN0aW9ucyogYnVzX2Nvbm5lY3Rpb25zX25ldyAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK0J1c0Nvbm5lY3Rpb25zKiBidXNfY29ubmVjdGlvbnNfcmVmICAgICAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfdW5yZWYgICAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbiAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2ZvcmVhY2ggICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2ZvcmVhY2hfYWN0aXZlICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CitCdXNDb250ZXh0KiAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF9jb250ZXh0ICAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucyk7Cit2b2lkICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2luY3JlbWVudF9zdGFtcCAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucyk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX3JlbG9hZF9wb2xpY3kgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0J1c0NvbnRleHQqICAgICBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitCdXNSZWdpc3RyeSogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5ICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0J1c0FjdGl2YXRpb24qICBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzTWF0Y2htYWtlciogIGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Citjb25zdCBjaGFyICogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzU0VMaW51eElEKiAgIGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitCdXNBcHBBcm1vckNvbmZpbmVtZW50KiBidXNfY29ubmVjdGlvbl9kdXBfYXBwYXJtb3JfY29uZmluZW1lbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbnNfY2hlY2tfbGltaXRzICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqcmVxdWVzdGluZ19jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOworCitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqd2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICp3aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICpyZXBseV90b190aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19jaGVja19yZXBseSAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKnNlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpyZWNlaXZpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uX21hcmtfc3RhbXAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworY29uc3QgY2hhciAqYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluX3JlcGx5X3RvKTsKKworLyogY2FsbGVkIGJ5IHNpZ25hbHMuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGUgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAqcnVsZSk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICpsaW5rKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOworaW50ICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWF0Y2hfcnVsZXMgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisKKy8qIGNhbGxlZCBieSBzZXJ2aWNlcy5jICovCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9vd25lZF9zZXJ2aWNlICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluayk7CitpbnQgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbl9zZXJ2aWNlc19vd25lZCAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisJCQkJICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKKworLyogY2FsbGVkIGJ5IGRpc3BhdGNoLmMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkICovCit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworZGJ1c19ib29sX3QgICAgICBidXNfY29ubmVjdGlvbl9pc19pbl91bml4X2dyb3VwIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIGdpZCk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICoqZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2lzX21vbml0b3IgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9iZV9tb25pdG9yIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOworCisvKiB0cmFuc2FjdGlvbiBBUEkgc28gd2UgY2FuIHNlbmQgb3Igbm90IHNlbmQgYSBibG9jayBvZiBtZXNzYWdlcyBhcyBhIHdob2xlICovCisKK3R5cGVkZWYgdm9pZCAoKiBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0J1c1RyYW5zYWN0aW9uKiBidXNfdHJhbnNhY3Rpb25fbmV3ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb250ZXh0KiAgICAgYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICAgICAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fc2VuZCAgICAgICAgICAgICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmVfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgICAgICAgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqaW5fcmVwbHlfdG8pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgICAgICAgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqaW5fcmVwbHlfdG8pOwordm9pZCAgICAgICAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbik7Cit2b2lkICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uQ2FuY2VsRnVuY3Rpb24gIGNhbmNlbF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfbl9hY3RpdmUgICAgICAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAgICAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CisKKy8qIGNhbGxlZCBieSBzdGF0cy5jLCBvbmx5IHByZXNlbnQgaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX21hdGNoX3J1bGVzICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlc19wZXJfY29ubiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX2J1c19uYW1lcyAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXNfcGVyX2Nvbm4gICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKKworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2RidXMuc2VydmljZS5pbiBiL2J1cy9kYnVzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjNDcyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kYnVzLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw5IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUQtQnVzIFN5c3RlbSBNZXNzYWdlIEJ1cworRG9jdW1lbnRhdGlvbj1tYW46ZGJ1cy1kYWVtb24oMSkKK1JlcXVpcmVzPWRidXMuc29ja2V0CisKK1tTZXJ2aWNlXQorRXhlY1N0YXJ0PUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC0tc3lzdGVtIC0tYWRkcmVzcz1zeXN0ZW1kOiAtLW5vZm9yayAtLW5vcGlkZmlsZSAtLXN5c3RlbWQtYWN0aXZhdGlvbgorRXhlY1JlbG9hZD1ARVhQQU5ERURfQklORElSQC9kYnVzLXNlbmQgLS1wcmludC1yZXBseSAtLXN5c3RlbSAtLXR5cGU9bWV0aG9kX2NhbGwgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsb2FkQ29uZmlnCitPT01TY29yZUFkanVzdD0tOTAwCmRpZmYgLS1naXQgYS9idXMvZGJ1cy5zb2NrZXQuaW4gYi9idXMvZGJ1cy5zb2NrZXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kYnVzLnNvY2tldC5pbgpAQCAtMCwwICsxLDUgQEAKK1tVbml0XQorRGVzY3JpcHRpb249RC1CdXMgU3lzdGVtIE1lc3NhZ2UgQnVzIFNvY2tldAorCitbU29ja2V0XQorTGlzdGVuU3RyZWFtPUBEQlVTX1NZU1RFTV9TT0NLRVRACmRpZmYgLS1naXQgYS9idXMvZGVza3RvcC1maWxlLmMgYi9idXMvZGVza3RvcC1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYjcyZQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kZXNrdG9wLWZpbGUuYwpAQCAtMCwwICsxLDgwOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkZXNrdG9wLWZpbGUuYyAgLmRlc2t0b3AgZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqa2V5OworICBjaGFyICp2YWx1ZTsKK30gQnVzRGVza3RvcEZpbGVMaW5lOworCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyICpzZWN0aW9uX25hbWU7CisgIAorICBpbnQgbl9saW5lczsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lczsKKyAgaW50IG5fYWxsb2NhdGVkX2xpbmVzOyAgCit9IEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbjsKKworc3RydWN0IEJ1c0Rlc2t0b3BGaWxlCit7CisgIGludCBuX3NlY3Rpb25zOworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb25zOworICBpbnQgbl9hbGxvY2F0ZWRfc2VjdGlvbnM7Cit9OworCisvKioKKyAqIFBhcnNlciBmb3Igc2VydmljZSBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c1N0cmluZyBkYXRhOyAvKio8IFRoZSBkYXRhIGZyb20gdGhlIGZpbGUgKi8KKworICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOyAvKio8IFRoZSByZXN1bHRpbmcgb2JqZWN0ICovCisgIGludCBjdXJyZW50X3NlY3Rpb247ICAgIC8qKjwgVGhlIGN1cnJlbnQgc2VjdGlvbiBiZWluZyBwYXJzZWQgKi8KKyAgCisgIGludCBwb3M7ICAgICAgICAgIC8qKjwgQ3VycmVudCBwb3NpdGlvbiAqLworICBpbnQgbGVuOyAgICAgICAgICAvKio8IExlbmd0aCAqLworICBpbnQgbGluZV9udW07ICAgICAvKio8IEN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyAgCit9IEJ1c0Rlc2t0b3BGaWxlUGFyc2VyOworCisjZGVmaW5lIFZBTElEX0tFWV9DSEFSIDEKKyNkZWZpbmUgVkFMSURfTE9DQUxFX0NIQVIgMgorc3RhdGljIHVuc2lnbmVkIGNoYXIgdmFsaWRbMjU2XSA9IHsgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgzICwgMHgyICwgMHgwICwgCisgICAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIAorICAgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgyICwgCisgICAweDAgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAKKyAgIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKK307CisKK3N0YXRpYyB2b2lkIHJlcG9ydF9lcnJvciAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwKKwkJCSAgY2hhciAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisJCQkgIGNvbnN0IGNoYXIgICAgICAgICAgICplcnJvcl9uYW1lLAorCQkJICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworCitzdGF0aWMgdm9pZAorcGFyc2VyX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAocGFyc2VyLT5kZXNrdG9wX2ZpbGUpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPmRhdGEpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc2t0b3BfZmlsZV9saW5lX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZSkKK3sKKyAgZGJ1c19mcmVlIChsaW5lLT5rZXkpOworICBkYnVzX2ZyZWUgKGxpbmUtPnZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19kZXNrdG9wX2ZpbGVfc2VjdGlvbl9mcmVlIChCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb24pCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5uX2xpbmVzOyBpKyspCisgICAgYnVzX2Rlc2t0b3BfZmlsZV9saW5lX2ZyZWUgKCZzZWN0aW9uLT5saW5lc1tpXSk7CisKKyAgZGJ1c19mcmVlIChzZWN0aW9uLT5saW5lcyk7CisgIGRidXNfZnJlZSAoc2VjdGlvbi0+c2VjdGlvbl9uYW1lKTsKK30KKwordm9pZAorYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zOyBpKyspCisgICAgYnVzX2Rlc2t0b3BfZmlsZV9zZWN0aW9uX2ZyZWUgKCZkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW2ldKTsKKyAgZGJ1c19mcmVlIChkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zKTsKKworICBkYnVzX2ZyZWUgKGRlc2t0b3BfZmlsZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ3Jvd19saW5lc19pbl9zZWN0aW9uIChCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb24pCit7CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZXM7CisgIAorICBpbnQgbmV3X25fbGluZXM7CisKKyAgaWYgKHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzID09IDApCisgICAgbmV3X25fbGluZXMgPSAxOworICBlbHNlCisgICAgbmV3X25fbGluZXMgPSBzZWN0aW9uLT5uX2FsbG9jYXRlZF9saW5lcyoyOworCisgIGxpbmVzID0gZGJ1c19yZWFsbG9jIChzZWN0aW9uLT5saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoQnVzRGVza3RvcEZpbGVMaW5lKSAqIG5ld19uX2xpbmVzKTsKKworICBpZiAobGluZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBzZWN0aW9uLT5saW5lcyA9IGxpbmVzOworICBzZWN0aW9uLT5uX2FsbG9jYXRlZF9saW5lcyA9IG5ld19uX2xpbmVzOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dyb3dfc2VjdGlvbnMgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUpCit7CisgIGludCBuZXdfbl9zZWN0aW9uczsKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uczsKKyAgCisgIGlmIChkZXNrdG9wX2ZpbGUtPm5fYWxsb2NhdGVkX3NlY3Rpb25zID09IDApCisgICAgbmV3X25fc2VjdGlvbnMgPSAxOworICBlbHNlCisgICAgbmV3X25fc2VjdGlvbnMgPSBkZXNrdG9wX2ZpbGUtPm5fYWxsb2NhdGVkX3NlY3Rpb25zKjI7CisKKyAgc2VjdGlvbnMgPSBkYnVzX3JlYWxsb2MgKGRlc2t0b3BfZmlsZS0+c2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbikgKiBuZXdfbl9zZWN0aW9ucyk7CisgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnMgPSBzZWN0aW9uczsKKyAgCisgIGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMgPSBuZXdfbl9zZWN0aW9uczsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNoYXIgKgordW5lc2NhcGVfc3RyaW5nIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqc3RyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgZW5kX3BvcywKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICBjaGFyICpyZXR2YWwsICpxOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgLyogbGVuICsgMSBpcyBlbm91Z2gsIGJlY2F1c2UgdW5lc2NhcGluZyBuZXZlciBtYWtlcyB0aGUKKyAgICogc3RyaW5nIGxvbmdlcgorICAgKi8KKyAgcmV0dmFsID0gZGJ1c19tYWxsb2MgKGVuZF9wb3MgLSBwb3MgKyAxKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcSA9IHJldHZhbDsKKyAgCisgIHdoaWxlIChwb3MgPCBlbmRfcG9zKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSA9PSAwKQorCXsKKwkgIC8qIEZvdW5kIGFuIGVtYmVkZGVkIG51bGwgKi8KKwkgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIlRleHQgdG8gYmUgdW5lc2NhcGVkIGNvbnRhaW5zIGVtYmVkZGVkIG51bCIsCisgICAgICAgICAgICAgICAgICAgICAgICBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0VTQ0FQRVMsIGVycm9yKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpID09ICdcXCcpCisJeworCSAgcG9zICsrOworCisJICBpZiAocG9zID49IGVuZF9wb3MpCisJICAgIHsKKwkgICAgICAvKiBFc2NhcGUgYXQgZW5kIG9mIHN0cmluZyAqLworCSAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgICAgICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJUZXh0IHRvIGJlIHVuZXNjYXBlZCBlbmRlZCBpbiBcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9FU0NBUEVTLCBlcnJvcik7CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKworCSAgc3dpdGNoIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSkKKwkgICAgeworCSAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgKnErKyA9ICcgJzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAqcSsrID0gJ1x0JzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAqcSsrID0gJ1xuJzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAqcSsrID0gJ1xyJzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgKnErKyA9ICdcXCc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBkZWZhdWx0OgorCSAgICAgLyogSW52YWxpZCBlc2NhcGUgY29kZSAqLworCSAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgICAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiVGV4dCB0byBiZSB1bmVzY2FwZWQgaGFkIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUywgZXJyb3IpOworICAgICAgICAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisJICBwb3MrKzsKKwl9CisgICAgICBlbHNlCisJeworCSAgKnErKyA9X2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcyk7CisKKwkgIHBvcysrOworCX0KKyAgICB9CisKKyAgKnEgPSAwOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZVNlY3Rpb24qIAorbmV3X3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUpCit7CisgIGludCBuOworICBjaGFyICpuYW1lX2NvcHk7CisgIAorICBpZiAoZGVza3RvcF9maWxlLT5uX2FsbG9jYXRlZF9zZWN0aW9ucyA9PSBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnMpCisgICAgeworICAgICAgaWYgKCFncm93X3NlY3Rpb25zIChkZXNrdG9wX2ZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbmFtZV9jb3B5ID0gX2RidXNfc3RyZHVwIChuYW1lKTsKKyAgaWYgKG5hbWVfY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG4gPSBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnM7CisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0uc2VjdGlvbl9uYW1lID0gbmFtZV9jb3B5OworCisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0ubl9saW5lcyA9IDA7CisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0ubGluZXMgPSBOVUxMOworICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLm5fYWxsb2NhdGVkX2xpbmVzID0gMDsKKworICBpZiAoIWdyb3dfbGluZXNfaW5fc2VjdGlvbiAoJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0pKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5zZWN0aW9uX25hbWUpOworICAgICAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5zZWN0aW9uX25hbWUgPSBOVUxMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9ucyArPSAxOworICAKKyAgcmV0dXJuICZkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dOyAgCit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZVNlY3Rpb24qIAorb3Blbl9zZWN0aW9uIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAqbmFtZSkKK3sgIAorICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb247CisKKyAgc2VjdGlvbiA9IG5ld19zZWN0aW9uIChwYXJzZXItPmRlc2t0b3BfZmlsZSwgbmFtZSk7CisgIGlmIChzZWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBwYXJzZXItPmN1cnJlbnRfc2VjdGlvbiA9IHBhcnNlci0+ZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zIC0gMTsKKyAgX2RidXNfYXNzZXJ0ICgmcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW3BhcnNlci0+Y3VycmVudF9zZWN0aW9uXSA9PSBzZWN0aW9uKTsKKyAgCisgIHJldHVybiBzZWN0aW9uOworfQorCitzdGF0aWMgQnVzRGVza3RvcEZpbGVMaW5lICoKK25ld19saW5lIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyKQoreworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb247CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZTsKKyAgCisgIHNlY3Rpb24gPSAmcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW3BhcnNlci0+Y3VycmVudF9zZWN0aW9uXTsKKworICBpZiAoc2VjdGlvbi0+bl9hbGxvY2F0ZWRfbGluZXMgPT0gc2VjdGlvbi0+bl9saW5lcykKKyAgICB7CisgICAgICBpZiAoIWdyb3dfbGluZXNfaW5fc2VjdGlvbiAoc2VjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsaW5lID0gJnNlY3Rpb24tPmxpbmVzW3NlY3Rpb24tPm5fbGluZXMrK107CisKKyAgX0RCVVNfWkVSTygqbGluZSk7CisgICAgCisgIHJldHVybiBsaW5lOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX2JsYW5rX2xpbmUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIGludCBwOworICBjaGFyIGM7CisgIAorICBwID0gcGFyc2VyLT5wb3M7CisKKyAgYyA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCk7CisKKyAgd2hpbGUgKGMgJiYgYyAhPSAnXG4nKQorICAgIHsKKyAgICAgIGlmICghKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xmJykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBwKys7CisgICAgICBjID0gX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9jb21tZW50X29yX2JsYW5rIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyKQoreworICBpbnQgbGluZV9lbmQsIGVvbF9sZW47CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MsICZsaW5lX2VuZCwgJmVvbF9sZW4pKQorICAgIGxpbmVfZW5kID0gcGFyc2VyLT5sZW47CisKKyAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorICAgIHBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgIGVsc2UKKyAgICBwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKyAgCisgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpc192YWxpZF9zZWN0aW9uX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIC8qIDUuIEdyb3VwIG5hbWVzIG1heSBjb250YWluIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCAnWycgYW5kICddJy4gKi8KKworICB3aGlsZSAoKm5hbWUpCisgICAgeworICAgICAgaWYgKCEoKCpuYW1lID49ICdBJyAmJiAqbmFtZSA8PSAnWicpIHx8ICgqbmFtZSA+PSAnYScgfHwgKm5hbWUgPD0gJ3onKSB8fAorCSAgICAqbmFtZSA9PSAnXG4nIHx8ICpuYW1lID09ICdcdCcpKQorCXJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbmFtZSsrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwYXJzZV9zZWN0aW9uX3N0YXJ0IChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbGluZV9lbmQsIGVvbF9sZW47CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZwYXJzZXItPmRhdGEsIHBhcnNlci0+cG9zLCAmbGluZV9lbmQsICZlb2xfbGVuKSkKKyAgICBsaW5lX2VuZCA9IHBhcnNlci0+bGVuOworICAKKyAgaWYgKGxpbmVfZW5kIC0gcGFyc2VyLT5wb3MgPD0gMiB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBsaW5lX2VuZCAtIDEpICE9ICddJykKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIkludmFsaWQgc3ludGF4IGZvciBzZWN0aW9uIGhlYWRlciIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2VjdGlvbl9uYW1lID0gdW5lc2NhcGVfc3RyaW5nIChwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MgKyAxLCBsaW5lX2VuZCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIGlmIChzZWN0aW9uX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFpc192YWxpZF9zZWN0aW9uX25hbWUgKHNlY3Rpb25fbmFtZSkpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJJbnZhbGlkIGNoYXJhY3RlcnMgaW4gc2VjdGlvbiBuYW1lIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9DSEFSUywgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBkYnVzX2ZyZWUgKHNlY3Rpb25fbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChvcGVuX3NlY3Rpb24gKHBhcnNlciwgc2VjdGlvbl9uYW1lKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc2VjdGlvbl9uYW1lKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorICAgIHBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgIGVsc2UKKyAgICBwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKyAgCisgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKKworICBkYnVzX2ZyZWUgKHNlY3Rpb25fbmFtZSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwYXJzZV9rZXlfdmFsdWUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGludCBsaW5lX2VuZCwgZW9sX2xlbjsKKyAgaW50IGtleV9zdGFydCwga2V5X2VuZDsKKyAgaW50IHZhbHVlX3N0YXJ0OworICBpbnQgcDsKKyAgY2hhciAqdmFsdWUsICp0bXA7CisgIERCdXNTdHJpbmcga2V5OworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MsICZsaW5lX2VuZCwgJmVvbF9sZW4pKQorICAgIGxpbmVfZW5kID0gcGFyc2VyLT5sZW47CisgIAorICBwID0gcGFyc2VyLT5wb3M7CisgIGtleV9zdGFydCA9IHA7CisgIHdoaWxlIChwIDwgbGluZV9lbmQgJiYKKwkgKHZhbGlkW19kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCldICYgVkFMSURfS0VZX0NIQVIpKQorICAgIHArKzsKKyAga2V5X2VuZCA9IHA7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJFbXB0eSBrZXkgbmFtZSIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogV2UgaWdub3JlIGxvY2FsZXMgZm9yIG5vdyAqLworICBpZiAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgPT0gJ1snKQorICAgIHsKKyAgICAgIGlmIChsaW5lX2VuZCA9PSBwYXJzZXItPmxlbikKKwlwYXJzZXItPnBvcyA9IHBhcnNlci0+bGVuOworICAgICAgZWxzZQorCXBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworCSAgCisgICAgICBwYXJzZXItPmxpbmVfbnVtICs9IDE7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIC8qIFNraXAgc3BhY2UgYmVmb3JlICc9JyAqLworICB3aGlsZSAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgPT0gJyAnKQorICAgIHArKzsKKworICBpZiAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgIT0gJz0nKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIGtleSBuYW1lIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9DSEFSUywgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChwID09IGxpbmVfZW5kKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiTm8gJz0nIGluIGtleS92YWx1ZSBwYWlyIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9TWU5UQVgsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTa2lwIHRoZSAnPScgKi8KKyAgcCsrOworCisgIC8qIFNraXAgc3BhY2UgYWZ0ZXIgJz0nICovCisgIHdoaWxlIChwIDwgbGluZV9lbmQgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKSA9PSAnICcpCisgICAgcCsrOworCisgIHZhbHVlX3N0YXJ0ID0gcDsKKyAgCisgIHZhbHVlID0gdW5lc2NhcGVfc3RyaW5nIChwYXJzZXIsICZwYXJzZXItPmRhdGEsIHZhbHVlX3N0YXJ0LCBsaW5lX2VuZCwgZXJyb3IpOworICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbGluZSA9IG5ld19saW5lIChwYXJzZXIpOworICBpZiAobGluZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmcGFyc2VyLT5kYXRhLCBrZXlfc3RhcnQsIGtleV9lbmQgLSBrZXlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG1wKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgIAorICBsaW5lLT5rZXkgPSB0bXA7CisgIGxpbmUtPnZhbHVlID0gdmFsdWU7CisKKyAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorICAgIHBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgIGVsc2UKKyAgICBwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKyAgCisgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydF9lcnJvciAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwKKwkgICAgICBjaGFyICAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKwkgICAgICBjb25zdCBjaGFyICAgICAgICAgICAqZXJyb3JfbmFtZSwKKwkgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9IE5VTEw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAocGFyc2VyLT5jdXJyZW50X3NlY3Rpb24gIT0gLTEpCisgICAgc2VjdGlvbl9uYW1lID0gcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW3BhcnNlci0+Y3VycmVudF9zZWN0aW9uXS5zZWN0aW9uX25hbWU7CisKKyAgaWYgKHNlY3Rpb25fbmFtZSkKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIGVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzZWN0aW9uICVzIGF0IGxpbmUgJWQ6ICVzXG4iLCBzZWN0aW9uX25hbWUsIHBhcnNlci0+bGluZV9udW0sIG1lc3NhZ2UpOworICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBlcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgYXQgbGluZSAlZDogJXNcbiIsIHBhcnNlci0+bGluZV9udW0sIG1lc3NhZ2UpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK2R1bXBfZGVza3RvcF9maWxlIChCdXNEZXNrdG9wRmlsZSAqZmlsZSkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGZpbGUtPm5fc2VjdGlvbnM7IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgcHJpbnRmICgiWyVzXVxuIiwgZmlsZS0+c2VjdGlvbnNbaV0uc2VjdGlvbl9uYW1lKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGZpbGUtPnNlY3Rpb25zW2ldLm5fbGluZXM7IGorKykKKwl7CisJICBwcmludGYgKCIlcz0lc1xuIiwgZmlsZS0+c2VjdGlvbnNbaV0ubGluZXNbal0ua2V5LAorCQkgIGZpbGUtPnNlY3Rpb25zW2ldLmxpbmVzW2pdLnZhbHVlKTsKKwl9CisgICAgfQorfQorI2VuZGlmCisKK0J1c0Rlc2t0b3BGaWxlKgorYnVzX2Rlc2t0b3BfZmlsZV9sb2FkIChEQnVzU3RyaW5nICpmaWxlbmFtZSwKKwkJICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzRGVza3RvcEZpbGVQYXJzZXIgcGFyc2VyOworICBEQnVzU3RhdCBzYjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIENsZWFybHkgdGhlcmUncyBhIHJhY2UgaGVyZSwgYnV0IGl0J3MganVzdCB0byBtYWtlIGl0IHVubGlrZWx5CisgICAqIHRoYXQgd2UgZG8gc29tZXRoaW5nIHNpbGx5LCB3ZSBzdGlsbCBoYW5kbGUgZG9pbmcgaXQgYmVsb3cuCisgICAqLworICBpZiAoIV9kYnVzX3N0YXQgKGZpbGVuYW1lLCAmc2IsIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2Iuc2l6ZSA+IF9EQlVTX09ORV9LSUxPQllURSAqIDEyOCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJEZXNrdG9wIGZpbGUgc2l6ZSAoJWxkIGJ5dGVzKSBpcyB0b28gbGFyZ2UiLCAobG9uZykgc2Iuc2l6ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJnN0ciwgZmlsZW5hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFVURi04Iik7ICAgCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBwYXJzZXIuZGVza3RvcF9maWxlID0gZGJ1c19uZXcwIChCdXNEZXNrdG9wRmlsZSwgMSk7CisgIGlmIChwYXJzZXIuZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHBhcnNlci5kYXRhID0gc3RyOworICBwYXJzZXIubGluZV9udW0gPSAxOworICBwYXJzZXIucG9zID0gMDsKKyAgcGFyc2VyLmxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGFyc2VyLmRhdGEpOworICBwYXJzZXIuY3VycmVudF9zZWN0aW9uID0gLTE7CisKKyAgd2hpbGUgKHBhcnNlci5wb3MgPCBwYXJzZXIubGVuKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXIuZGF0YSwgcGFyc2VyLnBvcykgPT0gJ1snKQorCXsKKwkgIGlmICghcGFyc2Vfc2VjdGlvbl9zdGFydCAoJnBhcnNlciwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChpc19ibGFua19saW5lICgmcGFyc2VyKSB8fAorCSAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXIuZGF0YSwgcGFyc2VyLnBvcykgPT0gJyMnKQorCXBhcnNlX2NvbW1lbnRfb3JfYmxhbmsgKCZwYXJzZXIpOworICAgICAgZWxzZSBpZiAocGFyc2VyLmN1cnJlbnRfc2VjdGlvbiA8IDApCisJeworICAgICAgICAgICBkYnVzX3NldF9lcnJvcihlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNlcnZpY2UgZmlsZToga2V5PXZhbHVlIGJlZm9yZSBbU2VjdGlvbl0iKTsKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghcGFyc2Vfa2V5X3ZhbHVlICgmcGFyc2VyLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCX0KKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXIuZGF0YSk7CisKKyAgcmV0dXJuIHBhcnNlci5kZXNrdG9wX2ZpbGU7Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKgorbG9va3VwX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisJCWNvbnN0IGNoYXIgICAgICpzZWN0aW9uX25hbWUpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgaW50IGk7CisgIAorICBpZiAoc2VjdGlvbl9uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zOyBpICsrKQorICAgIHsKKyAgICAgIHNlY3Rpb24gPSAmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tpXTsKKworICAgICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+c2VjdGlvbl9uYW1lLCBzZWN0aW9uX25hbWUpID09IDApCisJcmV0dXJuIHNlY3Rpb247CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZUxpbmUgKgorbG9va3VwX2xpbmUgKEJ1c0Rlc2t0b3BGaWxlICAgICAgICAqZGVza3RvcF9maWxlLAorCSAgICAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uLAorCSAgICAgY29uc3QgY2hhciAgICAgICAgICAgICprZXluYW1lKQoreworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5uX2xpbmVzOyBpKyspCisgICAgeworICAgICAgbGluZSA9ICZzZWN0aW9uLT5saW5lc1tpXTsKKyAgICAgIAorICAgICAgaWYgKHN0cmNtcCAobGluZS0+a2V5LCBrZXluYW1lKSA9PSAwKQorCXJldHVybiBsaW5lOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rlc2t0b3BfZmlsZV9nZXRfcmF3IChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCSAgY29uc3QgY2hhciAgICAgICpzZWN0aW9uX25hbWUsCisJCQkgIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCSAgY29uc3QgY2hhciAgICAgKip2YWwpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworCisgICp2YWwgPSBOVUxMOworCisgIHNlY3Rpb24gPSBsb29rdXBfc2VjdGlvbiAoZGVza3RvcF9maWxlLCBzZWN0aW9uX25hbWUpOworICAKKyAgaWYgKCFzZWN0aW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICBsaW5lID0gbG9va3VwX2xpbmUgKGRlc2t0b3BfZmlsZSwKKwkJICAgICAgc2VjdGlvbiwKKwkJICAgICAga2V5bmFtZSk7CisKKyAgaWYgKCFsaW5lKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgICp2YWwgPSBsaW5lLT52YWx1ZTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciAgICAgICpzZWN0aW9uLAorCQkJICAgICBjb25zdCBjaGFyICAgICAgKmtleW5hbWUsCisJCQkgICAgIGNoYXIgICAgICAgICAgICoqdmFsLAorCQkJICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpyYXc7CisgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICp2YWwgPSBOVUxMOworICAKKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9yYXcgKGRlc2t0b3BfZmlsZSwgc2VjdGlvbiwga2V5bmFtZSwgJnJhdykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gXCIlc1wiIGtleSBpbiAuc2VydmljZSBmaWxlXG4iLCBrZXluYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbCA9IF9kYnVzX3N0cmR1cCAocmF3KTsKKworICBpZiAoKnZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9idXMvZGVza3RvcC1maWxlLmggYi9idXMvZGVza3RvcC1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNTYyNQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kZXNrdG9wLWZpbGUuaApAQCAtMCwwICsxLDU2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRlc2t0b3AtZmlsZS5oICAuZGVza3RvcCBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIEJVU19ERVNLVE9QX0ZJTEVfSAorI2RlZmluZSBCVVNfREVTS1RPUF9GSUxFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKworI2RlZmluZSBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX1NZTlRBWCAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlc2t0b3BQYXJzZUVycm9yLkludmFsaWRTeW50YXgiCisjZGVmaW5lIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUyAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVza3RvcFBhcnNlRXJyb3IuSW52YWxpZEVzY2FwZXMiCisjZGVmaW5lIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfQ0hBUlMgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVza3RvcFBhcnNlRXJyb3IuSW52YWxpZENoYXJzIgorCisjZGVmaW5lIERCVVNfU0VSVklDRV9TRUNUSU9OICAiRC1CVVMgU2VydmljZSIKKyNkZWZpbmUgREJVU19TRVJWSUNFX05BTUUgICAgICJOYW1lIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfRVhFQyAgICAgIkV4ZWMiCisjZGVmaW5lIERCVVNfU0VSVklDRV9VU0VSICAgICAiVXNlciIKKyNkZWZpbmUgREJVU19TRVJWSUNFX1NZU1RFTURfU0VSVklDRSAiU3lzdGVtZFNlcnZpY2UiCisKK3R5cGVkZWYgc3RydWN0IEJ1c0Rlc2t0b3BGaWxlIEJ1c0Rlc2t0b3BGaWxlOworCitCdXNEZXNrdG9wRmlsZSAqYnVzX2Rlc2t0b3BfZmlsZV9sb2FkIChEQnVzU3RyaW5nICAgICAqZmlsZW5hbWUsCisJCQkJICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChCdXNEZXNrdG9wRmlsZSAqZmlsZSk7CisKK2RidXNfYm9vbF90IGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3JhdyAgICAoQnVzRGVza3RvcEZpbGUgICpkZXNrdG9wX2ZpbGUsCisJCQkJCSBjb25zdCBjaGFyICAgICAgKnNlY3Rpb25fbmFtZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICoqdmFsKTsKK2RidXNfYm9vbF90IGJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoQnVzRGVza3RvcEZpbGUgICpkZXNrdG9wX2ZpbGUsCisJCQkJCSBjb25zdCBjaGFyICAgICAgKnNlY3Rpb24sCisJCQkJCSBjb25zdCBjaGFyICAgICAgKmtleW5hbWUsCisJCQkJCSBjaGFyICAgICAgICAgICAqKnZhbCwKKwkJCQkJIERCdXNFcnJvciAgICAgICAqZXJyb3IpOworCisKKyNlbmRpZiAvKiBCVVNfREVTS1RPUF9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9kaXItd2F0Y2gtZGVmYXVsdC5jIGIvYnVzL2Rpci13YXRjaC1kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNjFiMQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kaXItd2F0Y2gtZGVmYXVsdC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLWRlZmF1bHQuYyAgT1Mgc3BlY2lmaWMgZGlyZWN0b3J5IGNoYW5nZSBub3RpZmljYXRpb24gZm9yIG1lc3NhZ2UgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgImRpci13YXRjaC5oIgorCisKKy8qIE5vT3AgKi8KKwordm9pZAorYnVzX3NldF93YXRjaGVkX2RpcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNMaXN0ICoqZGlyZWN0b3JpZXMpCit7Cit9CmRpZmYgLS1naXQgYS9idXMvZGlyLXdhdGNoLWlub3RpZnkuYyBiL2J1cy9kaXItd2F0Y2gtaW5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZGlyLXdhdGNoLWlub3RpZnkuYwpAQCAtMCwwICsxLDI4NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSIgLSotICovCisvKiBkaXItd2F0Y2gtaW5vdGlmeS5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICogICAgICAgICAgIChjKSAyMDA2IE1hbmRyaXZhCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKy8qIEJlIGNhcmVmdWwsIHRoaXMgZmlsZSBpcyBub3QgTGludXgtb25seTogUU5YIGFsc28gdXNlcyBpdCAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorLyogUU5YJ3MgaW5vdGlmeSBpcyBicm9rZW4sIGFuZCByZXF1aXJlcyBzdGRpbnQuaCB0byBiZSBtYW51YWxseSBpbmNsdWRlZCBmaXJzdCAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKyNkZWZpbmUgSU5PVElGWV9FVkVOVF9TSVpFIChzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpKQorI2RlZmluZSBJTk9USUZZX0JVRl9MRU4gKDEwMjQgKiAoSU5PVElGWV9FVkVOVF9TSVpFICsgMTYpKQorCisvKiB1c2UgYSBzdGF0aWMgYXJyYXkgdG8gYXZvaWQgaGFuZGxpbmcgT09NICovCitzdGF0aWMgaW50IHdkc1tNQVhfRElSU19UT19XQVRDSF07CitzdGF0aWMgY2hhciAqZGlyc1tNQVhfRElSU19UT19XQVRDSF07CitzdGF0aWMgaW50IG51bV93ZHMgPSAwOworc3RhdGljIGludCBpbm90aWZ5X2ZkID0gLTE7CitzdGF0aWMgREJ1c1dhdGNoICp3YXRjaCA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmxvb3AgPSBOVUxMOworCitzdGF0aWMgZGJ1c19ib29sX3QKK19oYW5kbGVfaW5vdGlmeV93YXRjaCAoREJ1c1dhdGNoICpwYXNzZWRfd2F0Y2gsIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqZGF0YSkKK3sKKyAgY2hhciBidWZmZXJbSU5PVElGWV9CVUZfTEVOXTsKKyAgc3NpemVfdCByZXQgPSAwOworICBpbnQgaSA9IDA7CisKKyAgcmV0ID0gcmVhZCAoaW5vdGlmeV9mZCwgYnVmZmVyLCBJTk9USUZZX0JVRl9MRU4pOworICBpZiAocmV0IDwgMCkKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgcmVhZGluZyBpbm90aWZ5IGV2ZW50OiAnJXMnXG4iLCBfZGJ1c19zdHJlcnJvcihlcnJubykpOworICBlbHNlIGlmICghcmV0KQorICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGlub3RpZnkgZXZlbnQ6IGJ1ZmZlciB0b28gc21hbGxcbiIpOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgU0lHSFVQIHNpZ25hbCBvbiByZWNlcHRpb24gb2YgJWxkIGlub3RpZnkgZXZlbnQocylcbiIsIChsb25nKSByZXQpOworICAgICAgKHZvaWQpIGtpbGwgKF9kYnVzX2dldHBpZCAoKSwgU0lHSFVQKTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgd2hpbGUgKGkgPCByZXQpCisgICAgeworICAgICAgc3RydWN0IGlub3RpZnlfZXZlbnQgKmV2OworCisgICAgICBldiA9IChzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqKSAmYnVmZmVyW2ldOworICAgICAgaSArPSBJTk9USUZZX0VWRU5UX1NJWkUgKyBldi0+bGVuOworICAgICAgaWYgKGV2LT5sZW4pCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJldmVudCBuYW1lOiAnJXMnXG4iLCBldi0+bmFtZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiaW5vdGlmeSBldmVudDogd2Q9JWQgbWFzaz0ldSBjb29raWU9JXUgbGVuPSV1XG4iLCBldi0+d2QsIGV2LT5tYXNrLCBldi0+Y29va2llLCBldi0+bGVuKTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoREJ1c0xpc3QgKipkaXJlY3RvcmllcykKK3sKKyAgaW50IG5ld193ZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworICBjaGFyICpuZXdfZGlyc1tNQVhfRElSU19UT19XQVRDSF07CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgaSwgaiwgd2Q7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ESVJTX1RPX1dBVENIOyBpKyspCisgICAgeworICAgICAgbmV3X3dkc1tpXSA9IC0xOworICAgICAgbmV3X2RpcnNbaV0gPSBOVUxMOworICAgIH0KKworICBpID0gMDsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGRpcmVjdG9yaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXdfZGlyc1tpKytdID0gKGNoYXIgKilsaW5rLT5kYXRhOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoZGlyZWN0b3JpZXMsIGxpbmspOworICAgIH0KKworICAvKiBMb29rIGZvciBkaXJlY3RvcmllcyBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyBzZXRzLCBpZgorICAgKiB3ZSBmaW5kIG9uZSwgbW92ZSBpdHMgZGF0YSBpbnRvIHRoZSBuZXcgc2V0LgorICAgKi8KKyAgZm9yIChpID0gMDsgbmV3X2RpcnNbaV07IGkrKykKKyAgICB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3dkczsgaisrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpcnNbal0gJiYgc3RyY21wIChuZXdfZGlyc1tpXSwgZGlyc1tqXSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbmV3X3dkc1tpXSA9IHdkc1tqXTsKKyAgICAgICAgICAgICAgbmV3X2RpcnNbaV0gPSBkaXJzW2pdOworICAgICAgICAgICAgICB3ZHNbal0gPSAtMTsKKyAgICAgICAgICAgICAgZGlyc1tqXSA9IE5VTEw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8qIEFueSBkaXJlY3RvcmllcyB3ZSBmaW5kIGluICJ3ZHMiIHdpdGggYSBub256ZXJvIGZkIG11c3QKKyAgICogbm90IGJlIGluIHRoZSBuZXcgc2V0LCBzbyBwZXJmb3JtIGNsZWFudXAgbm93LgorICAgKi8KKyAgZm9yIChqID0gMDsgaiA8IG51bV93ZHM7IGorKykKKyAgICB7CisgICAgICBpZiAod2RzW2pdICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgaW5vdGlmeV9ybV93YXRjaCAoaW5vdGlmeV9mZCwgd2RzW2pdKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGRpcnNbal0pOworICAgICAgICAgIHdkc1tqXSA9IC0xOworICAgICAgICAgIGRpcnNbal0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGZvciAoaSA9IDA7IG5ld19kaXJzW2ldOyBpKyspCisgICAgeworICAgICAgaWYgKG5ld193ZHNbaV0gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGxlc3MgbGFtZSBlcnJvciBoYW5kbGluZyBmb3IgZmFpbGluZyB0byBhZGQgYSB3YXRjaDsgd2UgbWF5IG5lZWQgdG8gc2xlZXAuICovCisgICAgICAgICAgd2QgPSBpbm90aWZ5X2FkZF93YXRjaCAoaW5vdGlmeV9mZCwgbmV3X2RpcnNbaV0sIElOX0NMT1NFX1dSSVRFIHwgSU5fREVMRVRFIHwgSU5fTU9WRURfVE8gfCBJTl9NT1ZFRF9GUk9NKTsKKyAgICAgICAgICBpZiAod2QgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBOb3QgYWxsIHNlcnZpY2UgZGlyZWN0b3JpZXMgbmVlZCB0byBleGlzdC4gKi8KKyAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IHNldHVwIGlub3RpZnkgZm9yICclcyc7IGVycm9yICclcydcbiIsIG5ld19kaXJzW2ldLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG5ld193ZHNbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBuZXdfd2RzW2ldID0gd2Q7CisgICAgICAgICAgbmV3X2RpcnNbaV0gPSBfZGJ1c19zdHJkdXAgKG5ld19kaXJzW2ldKTsKKyAgICAgICAgICBpZiAoIW5ld19kaXJzW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBGSVhNRSBoYXZlIGxlc3MgbGFtZSBoYW5kbGluZyBmb3IgT09NLCB3ZSBqdXN0IHNpbGVudGx5IGZhaWwgdG8KKyAgICAgICAgICAgICAgICogd2F0Y2guICAoSW4gcmVhbGl0eSB0aG91Z2gsIHRoZSB3aG9sZSBPT00gaGFuZGxpbmcgaW4gZGJ1cyBpcyBzdHVwaWQKKyAgICAgICAgICAgICAgICogYnV0IHdlIHdvbid0IGdvIGludG8gdGhhdCBpbiB0aGlzIGNvbW1lbnQgPSkgKQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaW5vdGlmeV9ybV93YXRjaCAoaW5vdGlmeV9mZCwgd2QpOworICAgICAgICAgICAgICBuZXdfd2RzW2ldID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbnVtX3dkcyA9IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ESVJTX1RPX1dBVENIOyBpKyspCisgICAgeworICAgICAgd2RzW2ldID0gbmV3X3dkc1tpXTsKKyAgICAgIGRpcnNbaV0gPSBuZXdfZGlyc1tpXTsKKyAgICB9CisKKyBvdXQ6OworfQorCisjaW5jbHVkZSA8c3RkaW8uaD4KK3N0YXRpYyB2b2lkCitfc2h1dGRvd25faW5vdGlmeSAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmVtcHR5ID0gTlVMTDsKKworICBpZiAoaW5vdGlmeV9mZCA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgX3NldF93YXRjaGVkX2RpcnNfaW50ZXJuYWwgKCZlbXB0eSk7CisKKyAgaWYgKHdhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGxvb3AsIHdhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHdhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKyAgICB9CisgIHdhdGNoID0gTlVMTDsKKyAgbG9vcCA9IE5VTEw7CisKKyAgY2xvc2UgKGlub3RpZnlfZmQpOworICBpbm90aWZ5X2ZkID0gLTE7Cit9CisKK3N0YXRpYyBpbnQKK19pbml0X2lub3RpZnkgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIGludCByZXQgPSAwOworCisgIGlmIChpbm90aWZ5X2ZkID09IC0xKQorICAgIHsKKyNpZmRlZiBIQVZFX0lOT1RJRllfSU5JVDEKKyAgICAgIGlub3RpZnlfZmQgPSBpbm90aWZ5X2luaXQxIChJTl9DTE9FWEVDKTsKKyAgICAgIC8qIFRoaXMgZW5zdXJlcyB3ZSBzdGlsbCBydW4gb24gb2xkZXIgTGludXgga2VybmVscy4KKyAgICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIzOTU3CisgICAgICAgKi8KKyAgICAgIGlmIChpbm90aWZ5X2ZkIDwgMCkKKyAgICAgICAgaW5vdGlmeV9mZCA9IGlub3RpZnlfaW5pdCAoKTsKKyNlbHNlCisgICAgICBpbm90aWZ5X2ZkID0gaW5vdGlmeV9pbml0ICgpOworI2VuZGlmCisgICAgICBpZiAoaW5vdGlmeV9mZCA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBpbml0aWFsaXplIGlub3RpZnlcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIEluIHRoZSBpbm90aWZ5X2luaXQxIGNhc2UgdGhpcyBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MsCisgICAgICAgKiBpbiB0aGUgb3RoZXIgY2FzZXMgaXQncyBuZWNlc3NhcnkgKi8KKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChpbm90aWZ5X2ZkKTsKKworICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKyAgICAgIF9kYnVzX2xvb3BfcmVmIChsb29wKTsKKworICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGlub3RpZnlfZmQsIERCVVNfV0FUQ0hfUkVBREFCTEUsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2hhbmRsZV9pbm90aWZ5X3dhdGNoLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGNyZWF0ZSBpbm90aWZ5IHdhdGNoXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xvb3BfYWRkX3dhdGNoIChsb29wLCB3YXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGFkZCByZWxvYWQgd2F0Y2ggdG8gbWFpbiBsb29wIik7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgICAgICB3YXRjaCA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChfc2h1dGRvd25faW5vdGlmeSwgTlVMTCkpCisgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZWdpc3RlciBzaHV0ZG93biBmdW5jIik7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgICAgICB3YXRjaCA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICB9CisgICAgfQorCisgIHJldCA9IDE7CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorYnVzX3NldF93YXRjaGVkX2RpcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNMaXN0ICoqZGlyZWN0b3JpZXMpCit7CisgIGlmICghX2luaXRfaW5vdGlmeSAoY29udGV4dCkpCisgICAgcmV0dXJuOworCisgIF9zZXRfd2F0Y2hlZF9kaXJzX2ludGVybmFsIChkaXJlY3Rvcmllcyk7Cit9CmRpZmYgLS1naXQgYS9idXMvZGlyLXdhdGNoLWtxdWV1ZS5jIGIvYnVzL2Rpci13YXRjaC1rcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU4MzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpci13YXRjaC1rcXVldWUuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2gta3F1ZXVlLmMgIE9TIHNwZWNpZmljIGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciBtZXNzYWdlIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9ldmVudC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKworc3RhdGljIGludCBrcSA9IC0xOworc3RhdGljIGludCBmZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGNoYXIgKmRpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGludCBudW1fZmRzID0gMDsKK3N0YXRpYyBEQnVzV2F0Y2ggKndhdGNoID0gTlVMTDsKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2hhbmRsZV9rcXVldWVfd2F0Y2ggKERCdXNXYXRjaCAqd2F0Y2gsIHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGtldmVudCBldjsKKyAgc3RydWN0IHRpbWVzcGVjIG51bGx0cyA9IHsgMCwgMCB9OworICBpbnQgcmVzOworICBwaWRfdCBwaWQ7CisKKyAgcmVzID0ga2V2ZW50IChrcSwgTlVMTCwgMCwgJmV2LCAxLCAmbnVsbHRzKTsKKworICAvKiBTbGVlcCBmb3IgaGFsZiBhIHNlY29uZCB0byBhdm9pZCBhIHJhY2Ugd2hlbiBmaWxlcyBhcmUgaW5zdGFsbCgxKSdkCisgICAqIHRvIHN5c3RlbS5kLiAqLworICB1c2xlZXAoNTAwMDAwKTsKKworICBpZiAocmVzID4gMCkKKyAgICB7CisgICAgICBwaWQgPSBnZXRwaWQgKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBTSUdIVVAgc2lnbmFsIG9uIHJlY2VwdGlvbiBvZiBhIGtldmVudFxuIik7CisgICAgICAodm9pZCkga2lsbCAocGlkLCBTSUdIVVApOworICAgIH0KKyAgZWxzZSBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFQkFERikKKyAgICB7CisgICAgICBrcSA9IC0xOworICAgICAgaWYgKHdhdGNoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHdhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgICAgICAgIHdhdGNoID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgcGlkID0gZ2V0cGlkICgpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgU0lHSFVQIHNpZ25hbCBzaW5jZSBrcXVldWUgaGFzIGJlZW4gY2xvc2VkXG4iKTsKKyAgICAgICh2b2lkKSBraWxsIChwaWQsIFNJR0hVUCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBfc2h1dGRvd25fa3F1ZXVlICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBpZiAoa3EgPCAwKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBpZiAoZmRzW2ldID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZSAoZmRzW2ldKTsKKyAgICAgICAgICBmZHNbaV0gPSAtMTsKKyAgICAgICAgfQorICAgICAgaWYgKGRpcnNbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGRidXNfZnJlZSgpIGlzIG5lY2Vzc2FyeSB0byBwYXNzIG1lbWxlYWsgY2hlY2sgKi8KKyAgICAgICAgICBkYnVzX2ZyZWUgKGRpcnNbaV0pOworICAgICAgICAgIGRpcnNbaV0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGlmIChsb29wKQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChsb29wLCB3YXRjaCk7CisgICAgICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKyAgICAgIGxvb3AgPSBOVUxMOworICAgIH0KKworICBpZiAod2F0Y2gpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgIHdhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgICBjbG9zZSAoa3EpOworICAgIGtxID0gLTE7Cit9CisKK3N0YXRpYyBpbnQKK19pbml0X2txdWV1ZSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgaWYgKGtxIDwgMCkKKyAgICB7CisKKyAgICAgIGtxID0ga3F1ZXVlICgpOworICAgICAgaWYgKGtxIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3QgY3JlYXRlIGtxdWV1ZTsgZXJyb3IgJyVzJ1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKyAgICAgIF9kYnVzX2xvb3BfcmVmIChsb29wKTsKKworICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGtxLCBEQlVTX1dBVENIX1JFQURBQkxFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oYW5kbGVfa3F1ZXVlX3dhdGNoLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGNyZWF0ZSBrcXVldWUgd2F0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0MTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xvb3BfYWRkX3dhdGNoIChsb29wLCB3YXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGFkZCByZWxvYWQgd2F0Y2ggdG8gbWFpbiBsb29wIik7CisgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoX3NodXRkb3duX2txdWV1ZSwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIHJlZ2lzdGVyIHNodXRkb3duIGZ1bmN0aW9uIik7CisgICAgICAgICAgZ290byBvdXQzOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAxOworCitvdXQzOgorICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworCitvdXQyOgorICBpZiAod2F0Y2gpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgIHdhdGNoID0gTlVMTDsKKyAgICB9CisKK291dDE6CisgIGlmIChrcSA+PSAwKQorICAgIHsKKyAgICAgIGNsb3NlIChrcSk7CisgICAgICBrcSA9IC0xOworICAgIH0KKyAgaWYgKGxvb3ApCisgICAgeworICAgICAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgICAgICBsb29wID0gTlVMTDsKKyAgICB9CisKK291dDoKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpbnQgbmV3X2Zkc1tNQVhfRElSU19UT19XQVRDSF07CisgIGNoYXIgKm5ld19kaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBpLCBqLCBmZDsKKyAgc3RydWN0IGtldmVudCBldjsKKyNpZmRlZiBPX0NMT0VYRUMKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lID0gMDsKKyNlbmRpZgorCisgIGlmICghX2luaXRfa3F1ZXVlIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBuZXdfZmRzW2ldID0gLTE7CisgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGkgPSAwOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld19kaXJzW2krK10gPSAoY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIGRpcmVjdG9yaWVzIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHNldHMsIGlmCisgICAqIHdlIGZpbmQgb25lLCBtb3ZlIGl0cyBkYXRhIGludG8gdGhlIG5ldyBzZXQuCisgICAqLworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fZmRzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGlyc1tqXSAmJiBzdHJjbXAgKG5ld19kaXJzW2ldLCBkaXJzW2pdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXdfZmRzW2ldID0gZmRzW2pdOworICAgICAgICAgICAgICBuZXdfZGlyc1tpXSA9IGRpcnNbal07CisgICAgICAgICAgICAgIGZkc1tqXSA9IC0xOworICAgICAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQW55IGRpcmVjdG9yeSB3ZSBmaW5kIGluICJmZHMiIHdpdGggYSBub256ZXJvIGZkIG11c3QKKyAgICogbm90IGJlIGluIHRoZSBuZXcgc2V0LCBzbyBwZXJmb3JtIGNsZWFudXAgbm93LgorICAgKi8KKyAgZm9yIChqID0gMDsgaiA8IG51bV9mZHM7IGorKykKKyAgICB7CisgICAgICBpZiAoZmRzW2pdICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2UgKGZkc1tqXSk7CisgICAgICAgICAgZGJ1c19mcmVlIChkaXJzW2pdKTsKKyAgICAgICAgICBmZHNbal0gPSAtMTsKKyAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChuZXdfZmRzW2ldID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgLSBsZXNzIGxhbWUgZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWxpbmcgdG8gYWRkIGEgd2F0Y2g7CisgICAgICAgICAgICogd2UgbWF5IG5lZWQgdG8gc2xlZXAuCisgICAgICAgICAgICovCisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgZmQgPSBvcGVuIChuZXdfZGlyc1tpXSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOworICAgICAgICAgIGNsb2V4ZWNfZG9uZSA9IChmZCA+PSAwKTsKKworICAgICAgICAgIGlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZkID0gb3BlbiAobmV3X2RpcnNbaV0sIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJyVzJzsgZXJyb3IgJyVzJ1xuIiwgbmV3X2RpcnNbaV0sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbmV3X2Zkc1tpXSA9IC0xOworICAgICAgICAgICAgICAgICAgbmV3X2RpcnNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIE9fQ0xPRVhFQworICAgICAgICAgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChmZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBFVl9TRVQgKCZldiwgZmQsIEVWRklMVF9WTk9ERSwgRVZfQUREIHwgRVZfRU5BQkxFIHwgRVZfQ0xFQVIsCisgICAgICAgICAgICAgICAgICBOT1RFX0RFTEVURSB8IE5PVEVfRVhURU5EIHwgTk9URV9XUklURSB8IE5PVEVfUkVOQU1FLCAwLCAwKTsKKyAgICAgICAgICBpZiAoa2V2ZW50IChrcSwgJmV2LCAxLCBOVUxMLCAwLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBzZXR1cCBhIGtldmVudCBmb3IgJyVzJzsgZXJyb3IgJyVzJ1xuIiwgbmV3X2RpcnNbaV0sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIG5ld19mZHNbaV0gPSBmZDsKKyAgICAgICAgICBuZXdfZGlyc1tpXSA9IF9kYnVzX3N0cmR1cCAobmV3X2RpcnNbaV0pOworICAgICAgICAgIGlmICghbmV3X2RpcnNbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZJWE1FIGhhdmUgbGVzcyBsYW1lIGhhbmRsaW5nIGZvciBPT00sIHdlIGp1c3Qgc2lsZW50bHkgZmFpbCB0bworICAgICAgICAgICAgICAgKiB3YXRjaC4gIChJbiByZWFsaXR5IHRob3VnaCwgdGhlIHdob2xlIE9PTSBoYW5kbGluZyBpbiBkYnVzIGlzCisgICAgICAgICAgICAgICAqIHN0dXBpZCBidXQgd2Ugd29uJ3QgZ28gaW50byB0aGF0IGluIHRoaXMgY29tbWVudCA9KSApCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICAgICAgICBuZXdfZmRzW2ldID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbnVtX2ZkcyA9IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ESVJTX1RPX1dBVENIOyBpKyspCisgICAgeworICAgICAgZmRzW2ldID0gbmV3X2Zkc1tpXTsKKyAgICAgIGRpcnNbaV0gPSBuZXdfZGlyc1tpXTsKKyAgICB9CisKKyBvdXQ6CisgIDsKK30KZGlmZiAtLWdpdCBhL2J1cy9kaXItd2F0Y2guaCBiL2J1cy9kaXItd2F0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ1MjllCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpci13YXRjaC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLmggIFdhdGNoIGRpcmVjdG9yaWVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImJ1cy5oIgorCisjaWZuZGVmIERJUl9XQVRDSF9ICisjZGVmaW5lIERJUl9XQVRDSF9ICisKKy8qKgorICogVXBkYXRlIHRoZSBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gbW9uaXRvciBmb3IgY2hhbmdlcy4gIFRoZQorICogb3BlcmF0aW5nLXN5c3RlbS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICogYXZvaWQgY3JlYXRpbmcgYSB3aW5kb3cgd2hlcmUgYSBkaXJlY3RvcnkgaW4gYm90aCB0aGUKKyAqIG9sZCBhbmQgbmV3IHNldCBpc24ndCBtb25pdG9yZWQuCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIGJ1cyBjb250ZXh0CisgKiBAcGFyYW0gZGlycyBMaXN0IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIGRpcmVjdG9yeSBwYXRocworICovCit2b2lkIGJ1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcnMpOworCisjZW5kaWYgLyogRElSX1dBVENIX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9kaXNwYXRjaC5jIGIvYnVzL2Rpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmYTFiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kaXNwYXRjaC5jCkBAIC0wLDAgKzEsNTIwMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXNwYXRjaC5jICBNZXNzYWdlIGRpc3BhdGNoZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAgSW1lbmRpbyBIQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYnVzLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1pc2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qIFRoaXMgaXMgaGFyZC1jb2RlZCBpbiB0aGUgZmlsZXMgaW4gdmFsaWQtY29uZmlnLWZpbGVzLSouIFdlIGhhdmUgdG8gdXNlCisgKiB0aGUgZGVidWctcGlwZSB0cmFuc3BvcnQgYmVjYXVzZSB0aGUgdGVzdHMgaW4gdGhpcyBmaWxlIHJlcXVpcmUgdGhhdAorICogZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIGRvZXMgbm90IGJsb2NrLiAqLworI2RlZmluZSBURVNUX0RFQlVHX1BJUEUgImRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlciIKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKm1heWJlX251bGwsCisgICAgICAgICBjb25zdCBjaGFyICppZl9udWxsKQoreworICByZXR1cm4gKG1heWJlX251bGwgPyBtYXliZV9udWxsIDogaWZfbnVsbCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9vbmVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICBCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3Igc3RhY2tfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGNvbnRleHQsIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWNrX2Vycm9yKSkKKyAgICB7CisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwgJnN0YWNrX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJyb2FkY2FzdCByZWplY3RlZCwgYnV0IG5vdCBlbm91Z2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSB0byB0ZWxsIG1vbml0b3JzIik7CisgICAgICAgIH0KKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmc3RhY2tfZXJyb3IpOworICAgICAgcmV0dXJuIFRSVUU7IC8qIGRvbid0IHNlbmQgaXQgYnV0IGRvbid0IHJldHVybiBhbiBlcnJvciBlaXRoZXIgKi8KKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyhtZXNzYWdlKSAmJgorICAgICAgIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlKGNvbm5lY3Rpb24sIERCVVNfVFlQRV9VTklYX0ZEKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoJnN0YWNrX2Vycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgImJyb2FkY2FzdCBjYW5ub3QgYmUgZGVsaXZlcmVkIHRvICVzICglcykgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgIml0IGRvZXMgbm90IHN1cHBvcnQgcmVjZWl2aW5nIFVuaXggZmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKGNvbm5lY3Rpb24pKTsKKworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZV9lcnJvcl9yZXBseSAodHJhbnNhY3Rpb24sICZzdGFja19lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJicm9hZGNhc3Qgd2l0aCBVbml4IGZkIG5vdCBkZWxpdmVyZWQsIGJ1dCBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVub3VnaCBtZW1vcnkgdG8gdGVsbCBtb25pdG9ycyIpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnN0YWNrX2Vycm9yKTsKKyAgICAgIHJldHVybiBUUlVFOyAvKiBkb24ndCBzZW5kIGl0IGJ1dCBkb24ndCByZXR1cm4gYW4gZXJyb3IgZWl0aGVyICovCisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmQgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF9tYXRjaGVzIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c0xpc3QgKnJlY2lwaWVudHM7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIC8qIHNlbmRlciBhbmQgcmVjaXBpZW50IGNhbiBib3RoIGJlIE5VTEwgZm9yIHRoZSBidXMgZHJpdmVyLAorICAgKiBvciBmb3Igc2lnbmFscyB3aXRoIG5vIHBhcnRpY3VsYXIgcmVjaXBpZW50CisgICAqLworCisgIF9kYnVzX2Fzc2VydCAoc2VuZGVyID09IE5VTEwgfHwgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChzZW5kZXIpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworCisgIC8qIEZpcnN0LCBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBhZGRyZXNzZWRfcmVjaXBpZW50LCBpZiB0aGVyZSBpcyBvbmUuICovCisgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGNvbnRleHQsIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzIChtZXNzYWdlKSAmJgorICAgICAgICAgICFkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZSAoYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZEKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJpZWQgdG8gc2VuZCBtZXNzYWdlIHdpdGggVW5peCBmaWxlIGRlc2NyaXB0b3JzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYSBjbGllbnQgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhhdC4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIERpc3BhdGNoIHRoZSBtZXNzYWdlICovCisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgZGlzcGF0Y2ggdG8gb3RoZXJzIHdobyBsb29rIGludGVyZXN0ZWQgaW4gdGhpcyBtZXNzYWdlICovCisgIGNvbm5lY3Rpb25zID0gYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zIChjb250ZXh0KTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgbWF0Y2htYWtlciA9IGJ1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyIChjb250ZXh0KTsKKworICByZWNpcGllbnRzID0gTlVMTDsKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9nZXRfcmVjaXBpZW50cyAobWF0Y2htYWtlciwgY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2lwaWVudHMpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcmVjaXBpZW50cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmRlc3Q7CisKKyAgICAgIGRlc3QgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoIXNlbmRfb25lX21lc3NhZ2UgKGRlc3QsIGNvbnRleHQsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdHJhbnNhY3Rpb24sICZ0bXBfZXJyb3IpKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJlY2lwaWVudHMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmcmVjaXBpZW50cyk7CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitidXNfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqc2VuZGVyLCAqc2VydmljZV9uYW1lOworICBEQnVzRXJyb3IgZXJyb3I7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudDsKKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisKKyAgdHJhbnNhY3Rpb24gPSBOVUxMOworICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gTlVMTDsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBJZiB3ZSBjYW4ndCBldmVuIGFsbG9jYXRlIGFuIE9PTSBlcnJvciwgd2UganVzdCBnbyB0byBzbGVlcAorICAgKiB1bnRpbCB3ZSBjYW4uCisgICAqLworICB3aGlsZSAoIWJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoY29ubmVjdGlvbikpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIC8qIFJlZiBjb25uZWN0aW9uIGluIGNhc2Ugd2UgZGlzY29ubmVjdCBpdCBhdCBzb21lIHBvaW50IGluIGhlcmUgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogTW9uaXRvcnMgYXJlbid0IG1lYW50IHRvIHNlbmQgbWVzc2FnZXMgdG8gdXMuICovCisgIGlmIChidXNfY29ubmVjdGlvbl9pc19tb25pdG9yIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBzZW5kZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbik7CisKKyAgICAgIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgc2VuZGVyID0gIih1bmtub3duKSI7CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9uaXRvcmluZyBjb25uZWN0aW9uICVzIGNsb3NlZC4iLCBzZW5kZXIpOworICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoY29ubmVjdGlvbik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE1vbml0b3JzIGFyZSBub3QgYWxsb3dlZCB0byBzZW5kIG1lc3NhZ2VzLCBiZWNhdXNlIHRoYXQKKyAgICAgICAgICAgKiBwcm9iYWJseSBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9uaXRvciBpcyBpbmNvcnJlY3RseSByZXBseWluZworICAgICAgICAgICAqIHRvIGl0cyBlYXZlc2Ryb3BwZWQgbWVzc2FnZXMsIGFuZCB3ZSB3YW50IHRoZSBhdXRob3JzIG9mCisgICAgICAgICAgICogc3VjaCBtb25pdG9ycyB0byBmaXggdGhlbS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbml0b3JpbmcgY29ubmVjdGlvbiAlcyAoJXMpIGlzIG5vdCBhbGxvd2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBzZW5kIG1lc3NhZ2VzOyBjbG9zaW5nIGl0LiBQbGVhc2UgZml4IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciB0byBub3QgZG8gdGhhdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihtZXNzYWdlIHR5cGU9XCIlc1wiIGludGVyZmFjZT1cIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbWJlcj1cIiVzXCIgZXJyb3IgbmFtZT1cIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uPVwiJXNcIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodW5zZXQpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHVuc2V0KSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodW5zZXQpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKSk7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBzZXJ2aWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICB7CisgICAgY29uc3QgY2hhciAqaW50ZXJmYWNlX25hbWUsICptZW1iZXJfbmFtZSwgKmVycm9yX25hbWU7CisKKyAgICBpbnRlcmZhY2VfbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKyAgICBtZW1iZXJfbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAgICBlcnJvcl9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKTsKKworICAgIF9kYnVzX3ZlcmJvc2UgKCJESVNQQVRDSDogJXMgJXMgJXMgdG8gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX25hbWUgPyBpbnRlcmZhY2VfbmFtZSA6ICIobm8gaW50ZXJmYWNlKSIsCisgICAgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPyBtZW1iZXJfbmFtZSA6ICIobm8gbWVtYmVyKSIsCisgICAgICAgICAgICAgICAgICAgZXJyb3JfbmFtZSA/IGVycm9yX25hbWUgOiAiKG5vIGVycm9yIG5hbWUpIiwKKyAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPyBzZXJ2aWNlX25hbWUgOiAicGVlciIpOworICB9CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKyAgLyogSWYgc2VydmljZV9uYW1lIGlzIE5VTEwsIGlmIGl0J3MgYSBzaWduYWwgd2Ugc2VuZCBpdCB0byBhbGwKKyAgICogY29ubmVjdGlvbnMgd2l0aCBhIG1hdGNoIHJ1bGUuIElmIGl0J3Mgbm90IGEgc2lnbmFsLCB0aGVyZQorICAgKiBhcmUgc29tZSBzcGVjaWFsIGNhc2VzIGhlcmUgYnV0IG1vc3RseSB3ZSBqdXN0IGJhaWwgb3V0LgorICAgKi8KKyAgaWYgKHNlcnZpY2VfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoY29ubmVjdGlvbik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgICAgICB7CisgICAgICAgICAgLyogREJ1c0Nvbm5lY3Rpb24gYWxzbyBoYW5kbGVzIHNvbWUgb2YgdGhlc2UgYXV0b21hdGljYWxseSwgd2UgbGVhdmUKKyAgICAgICAgICAgKiBpdCB0byBkbyBzby4KKyAgICAgICAgICAgKgorICAgICAgICAgICAqIEZJWE1FOiB0aGlzIG1lYW5zIG1vbml0b3JzIHdvbid0IGdldCB0aGUgb3Bwb3J0dW5pdHkgdG8gc2VlCisgICAgICAgICAgICogbm9uLXNpZ25hbHMgd2l0aCBOVUxMIGRlc3RpbmF0aW9uLCBvciB0aGVpciByZXBsaWVzICh3aGljaCBpbgorICAgICAgICAgICAqIHByYWN0aWNlIGFyZSBVbmtub3duTWV0aG9kIGVycm9ycykKKyAgICAgICAgICAgKi8KKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBDcmVhdGUgb3VyIHRyYW5zYWN0aW9uICovCisgIHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoY29udGV4dCk7CisgIGlmICh0cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIEFzc2lnbiBhIHNlbmRlciB0byB0aGUgbWVzc2FnZSAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBzZW5kZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlbmRlciAhPSBOVUxMKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgc2VuZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRm9yIG1vbml0b3JzJyBiZW5lZml0OiB3ZSBkb24ndCB3YW50IHRoZSBzZW5kZXIgdG8gYmUgYWJsZSB0bworICAgICAgICogdHJpY2sgdGhlIG1vbml0b3IgYnkgc3VwcGx5aW5nIGEgZm9yZ2VkIHNlbmRlciwgYW5kIHdlIGFsc28KKyAgICAgICAqIGRvbid0IHdhbnQgdGhlIG1lc3NhZ2UgdG8gaGF2ZSBubyBzZW5kZXIgYXQgYWxsLiAqLworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgIjpub3QuYWN0aXZlLnlldCIpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKCZlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogV2UgbmVlZCB0byByZWZldGNoIHRoZSBzZXJ2aWNlIG5hbWUgaGVyZSwgYmVjYXVzZQorICAgKiBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciBjYW4gY2F1c2UgdGhlIGhlYWRlciB0byBiZQorICAgKiByZWFsbG9jYXRlZCwgYW5kIHRodXMgdGhlIHNlcnZpY2VfbmFtZSBwb2ludGVyIHdpbGwgYmVjb21lCisgICAqIGludmFsaWQuCisgICAqLworICBzZXJ2aWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKCZlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHNlcnZpY2VfbmFtZSAmJgorICAgICAgc3RyY21wIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKSAvKiB0byBidXMgZHJpdmVyICovCisgICAgeworICAgICAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGNvbnRleHQsIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIG1lc3NhZ2UsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2VjdXJpdHkgcG9saWN5IHJlamVjdGVkIG1lc3NhZ2VcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHaXZpbmcgbWVzc2FnZSB0byAlc1xuIiwgREJVU19TRVJWSUNFX0RCVVMpOworICAgICAgaWYgKCFidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgJmVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkgLyogY2xpZW50cyBtdXN0IHRhbGsgdG8gYnVzIGRyaXZlciBmaXJzdCAqLworICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWNlaXZlZCBtZXNzYWdlIGZyb20gbm9uLXJlZ2lzdGVyZWQgY2xpZW50LiBEaXNjb25uZWN0aW5nLlxuIik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmIChzZXJ2aWNlX25hbWUgIT0gTlVMTCkgLyogcm91dGUgdG8gbmFtZWQgc2VydmljZSAqLworICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc2VydmljZV9zdHJpbmc7CisgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICAgICAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZpY2VfbmFtZSAhPSBOVUxMKTsKKworICAgICAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2Vfc3RyaW5nLCBzZXJ2aWNlX25hbWUpOworICAgICAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc2VydmljZV9zdHJpbmcpOworCisgICAgICBpZiAoc2VydmljZSA9PSBOVUxMICYmIGRidXNfbWVzc2FnZV9nZXRfYXV0b19zdGFydCAobWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworICAgICAgICAgIC8qIFdlIGNhbid0IGRvIHRoZSBzZWN1cml0eSBwb2xpY3kgY2hlY2sgaGVyZSwgc2luY2UgdGhlIGFkZHJlc3NlZAorICAgICAgICAgICAqIHJlY2lwaWVudCBzZXJ2aWNlIGRvZXNuJ3QgZXhpc3QgeWV0LiBXZSBkbyBpdCBiZWZvcmUgc2VuZGluZyB0aGUKKyAgICAgICAgICAgKiBtZXNzYWdlIGFmdGVyIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgYWN0aXZhdGlvbiA9IGJ1c19jb25uZWN0aW9uX2dldF9hY3RpdmF0aW9uIChjb25uZWN0aW9uKTsKKworICAgICAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBzZXJ2aWNlX25hbWUsICZlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKCkgZmFpbGVkOiAlc1xuIiwgZXJyb3IubmFtZSk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yICgmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgIC8qIE5vdyBzZW5kIHRoZSBtZXNzYWdlIHRvIGl0cyBkZXN0aW5hdGlvbiAob3Igbm90LCBpZgorICAgKiBhZGRyZXNzZWRfcmVjaXBpZW50ID09IE5VTEwpLCBhbmQgbWF0Y2ggaXQgYWdhaW5zdCBvdGhlciBjb25uZWN0aW9ucycKKyAgICogbWF0Y2ggcnVsZXMuCisgICAqLworICBpZiAoIWJ1c19kaXNwYXRjaF9tYXRjaGVzICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwgJmVycm9yKSkKKyAgICBnb3RvIG91dDsKKworIG91dDoKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIEV2ZW4gaWYgd2UgZGlzY29ubmVjdGVkIGl0LCBwcmV0ZW5kIHRvIHNlbmQgaXQgYW55IHBlbmRpbmcgZXJyb3IKKyAgICAgICAqIG1lc3NhZ2VzIHNvIHRoYXQgbW9uaXRvcnMgY2FuIG9ic2VydmUgdGhlbS4KKyAgICAgICAqLworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgICAgICAgICAgLyogY2FuY2VsIHRyYW5zYWN0aW9uIGR1ZSB0byBPT00gKi8KKyAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyeSB0byBzZW5kIHRoZSByZWFsIGVycm9yLCBpZiBubyBtZW0gdG8gZG8gdGhhdCwgc2VuZAorICAgICAgICAgICAqIHRoZSBPT00gZXJyb3IKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uICE9IE5VTEwpOworICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwgbWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICAgICAgICAgICAgICAvKiBjYW5jZWwgdHJhbnNhY3Rpb24gZHVlIHRvIE9PTSAqLworICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKworICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYnVzX2Rpc3BhdGNoX21lc3NhZ2VfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIHJldHVybiBidXNfZGlzcGF0Y2ggKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Rpc3BhdGNoX21lc3NhZ2VfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIEhlcmUgd2UgdGVsbCB0aGUgYnVzIGRyaXZlciB0aGF0IHdlIHdhbnQgdG8gZ2V0IG9mZi4gKi8KKyAgYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic3RhdHMuaCIKKworLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgd2hldGhlciB3ZSBuZWVkIHRvIGJsb2NrIGluIG9yZGVyIHRvIGZpbmlzaAorICogc2VuZGluZyBhIG1lc3NhZ2UsIG9yIHdoZXRoZXIgdGhlIGluaXRpYWwgZGJ1c19jb25uZWN0aW9uX3NlbmQoKQorICogYWxyZWFkeSBmbHVzaGVkIHRoZSBxdWV1ZS4KKyAqLworI2RlZmluZSBTRU5EX1BFTkRJTkcoY29ubmVjdGlvbikgKGRidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoY29ubmVjdGlvbikpCisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2sxRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0KTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2syRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgY2hlY2tfbm9fbGVmdG92ZXJzIChCdXNDb250ZXh0ICpjb250ZXh0KTsKKworc3RhdGljIHZvaWQKK2Jsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqd2hhdF9pc19leHBlY3RlZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImV4cGVjdGluZzogJXNcbiIsIHdoYXRfaXNfZXhwZWN0ZWQpOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUgJiYKKyAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBidXNfdGVzdF9ydW5fYnVzX2xvb3AgKGNvbnRleHQsIFRSVUUpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIlNwaW5uaW5nIHRvIGF1dGggY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisgIHdoaWxlICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uKSAmJgorICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBzcGlubmluZyB0byBhdXRoIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworfQorCisvKiBjb21wZW5zYXRlIGZvciBmYWN0IHRoYXQgcG9wX21lc3NhZ2UoKSBjYW4gcmV0dXJuICNOVUxMIGR1ZSB0byBPT00gKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3BvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIHJldHVybiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitib3Jyb3dfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pID09CisgICAgICAgICBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3dhcm5fdW5leHBlY3RlZF9yZWFsIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsaW5lKQoreworICBpZiAobWVzc2FnZSkKKyAgICBfZGJ1c193YXJuICgiJXM6JWQgcmVjZWl2ZWQgbWVzc2FnZSBpbnRlcmZhY2UgXCIlc1wiIG1lbWJlciBcIiVzXCIgZXJyb3IgbmFtZSBcIiVzXCIgb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQpOworICBlbHNlCisgICAgX2RidXNfd2FybiAoIiVzOiVkIHJlY2VpdmVkIG5vIG1lc3NhZ2Ugb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwgY29ubmVjdGlvbiwgZXhwZWN0ZWQpOworfQorCisjZGVmaW5lIHdhcm5fdW5leHBlY3RlZChjb25uZWN0aW9uLCBtZXNzYWdlLCBleHBlY3RlZCkgXAorICB3YXJuX3VuZXhwZWN0ZWRfcmVhbCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZXhwZWN0ZWQsIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAordmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJSZWNlaXZlZCBtZXNzYWdlIGludGVyZmFjZSBcIiVzXCIgbWVtYmVyIFwiJXNcIiBlcnJvciBuYW1lIFwiJXNcIiBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKK30KKwordHlwZWRlZiBlbnVtCit7CisgIFNFUlZJQ0VfQ1JFQVRFRCwKKyAgT1dORVJfQ0hBTkdFRCwKKyAgU0VSVklDRV9ERUxFVEVECit9IFNlcnZpY2VJbmZvS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgU2VydmljZUluZm9LaW5kIGV4cGVjdGVkX2tpbmQ7CisgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3NlcnZpY2VfbmFtZTsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworICBEQnVzQ29ubmVjdGlvbiAqc2tpcF9jb25uZWN0aW9uOworICBCdXNDb250ZXh0ICpjb250ZXh0OworfSBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSAqZCA9IGRhdGE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKworICBpZiAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBTRVJWSUNFX0NSRUFURUQKKyAgICAgICYmIGNvbm5lY3Rpb24gPT0gZC0+c2tpcF9jb25uZWN0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+ZmFpbGVkID0gVFJVRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGQtPmNvbnRleHQsIGNvbm5lY3Rpb24sICJOYW1lT3duZXJDaGFuZ2VkIik7CisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgbWVzc2FnZSBvbiAlcCwgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sICJOYW1lT3duZXJDaGFuZ2VkIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgcmVnZXRfc2VydmljZV9pbmZvX2RhdGE6CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIG5ld19vd25lciA9IE5VTEw7CisKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmb2xkX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmV3X293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmICgoZC0+ZXhwZWN0ZWRfa2luZCA9PSBTRVJWSUNFX0NSRUFURUQgICAgJiYgKCBvbGRfb3duZXJbMF0gfHwgIW5ld19vd25lclswXSkpCisgICAgICAgICAgfHwgKGQtPmV4cGVjdGVkX2tpbmQgPT0gT1dORVJfQ0hBTkdFRCAgICYmICghb2xkX293bmVyWzBdIHx8ICFuZXdfb3duZXJbMF0pKQorICAgICAgICAgIHx8IChkLT5leHBlY3RlZF9raW5kID09IFNFUlZJQ0VfREVMRVRFRCAmJiAoIW9sZF9vd25lclswXSB8fCAgbmV3X293bmVyWzBdKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiaW5jb25zaXN0ZW50IE5hbWVPd25lckNoYW5nZWQgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsIGQtPmV4cGVjdGVkX3NlcnZpY2VfbmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJleHBlY3RlZCBpbmZvIG9uIHNlcnZpY2UgJXMsIGdvdCBpbmZvIG9uICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGQtPmV4cGVjdGVkX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICgqc2VydmljZV9uYW1lID09ICc6JyAmJiBuZXdfb3duZXJbMF0KKyAgICAgICAgICAmJiBzdHJjbXAgKHNlcnZpY2VfbmFtZSwgbmV3X293bmVyKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImluY29uc2lzdGVudCBTZXJ2aWNlT3duZWRDaGFuZ2VkIG1lc3NhZ2UgKFwiJXNcIiBbICVzIC0+ICVzIF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgb2xkX293bmVyLCBuZXdfb3duZXIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGQtPmZhaWxlZCA9IEZBTFNFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gIWQtPmZhaWxlZDsKK30KKworCitzdGF0aWMgdm9pZAora2lsbF9jbGllbnRfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICpzOworICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgX2RidXNfdmVyYm9zZSAoImtpbGxpbmcgY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgcyA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAocyAhPSBOVUxMKTsKKworICB3aGlsZSAoKGJhc2Vfc2VydmljZSA9IF9kYnVzX3N0cmR1cCAocykpID09IE5VTEwpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworCisgIC8qIGtpY2sgaW4gdGhlIGRpc2Nvbm5lY3QgaGFuZGxlciB0aGF0IHVucmVmcyB0aGUgY29ubmVjdGlvbiAqLworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBfZGJ1c19hc3NlcnQgKGJ1c190ZXN0X2NsaWVudF9saXN0ZWQgKGNvbm5lY3Rpb24pKTsKKworICAvKiBSdW4gZGlzY29ubmVjdCBoYW5kbGVyIGluIHRlc3QuYyAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgKGNvbm5lY3Rpb24pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNvbWV0aGluZyByZWNlaXZlZCBvbiBjb25uZWN0aW9uIGJlaW5nIGtpbGxlZCBvdGhlciB0aGFuIHRoZSBkaXNjb25uZWN0Iik7CisKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisgIF9kYnVzX2Fzc2VydCAoIWJ1c190ZXN0X2NsaWVudF9saXN0ZWQgKGNvbm5lY3Rpb24pKTsKKworICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlOworICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgZGJ1c19mcmVlIChiYXNlX3NlcnZpY2UpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZ2V0IHRoZSBleHBlY3RlZCBOYW1lT3duZXJDaGFuZ2VkIChkZWxldGlvbikgbWVzc2FnZXMiKTsKKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic3R1ZmYgbGVmdCBpbiBtZXNzYWdlIHF1ZXVlcyBhZnRlciBkaXNjb25uZWN0aW5nIGEgY2xpZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIFRoaXMga2lsbHMgdGhlIGNvbm5lY3Rpb24gd2l0aG91dCBleHBlY3RpbmcgaXQgdG8gYWZmZWN0CisgICAqIHRoZSByZXN0IG9mIHRoZSBidXMuCisgICAqLworICBfZGJ1c192ZXJib3NlICgiVW5jaGVja2VkIGtpbGwgb2YgY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgIC8qIGRpc3BhdGNoaW5nIGRpc2Nvbm5lY3QgaGFuZGxlciB3aWxsIHVucmVmIG9uY2UgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlIChjb25uZWN0aW9uKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJtZXNzYWdlIG90aGVyIHRoYW4gZGlzY29ubmVjdCBkaXNwYXRjaGVkIGFmdGVyIGZhaWx1cmUgdG8gcmVnaXN0ZXIiKTsKKworICBfZGJ1c19hc3NlcnQgKCFidXNfdGVzdF9jbGllbnRfbGlzdGVkIChjb25uZWN0aW9uKSk7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGRidXNfYm9vbF90IGZhaWxlZDsKK30gQ2hlY2tOb01lc3NhZ2VzRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19ub19tZXNzYWdlc19mb3JlYWNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBDaGVja05vTWVzc2FnZXNEYXRhICpkID0gZGF0YTsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlICE9IE5VTEwpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm8gbWVzc2FnZXMiKTsKKworICAgICAgZC0+ZmFpbGVkID0gVFJVRTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuICFkLT5mYWlsZWQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbm9fbGVmdG92ZXJzIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBDaGVja05vTWVzc2FnZXNEYXRhIG5tZDsKKworICBubWQuZmFpbGVkID0gRkFMU0U7CisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfbm9fbWVzc2FnZXNfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm1kKTsKKworICBpZiAobm1kLmZhaWxlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgibGVmdG92ZXIgbWVzc2FnZSBmb3VuZFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaGVsbG9fbWVzc2FnZSAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpuYW1lX21lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqYWNxdWlyZWQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbmFtZSA9IE5VTEw7CisgIGFjcXVpcmVkID0gTlVMTDsKKyAgbWVzc2FnZSA9IE5VTEw7CisgIG5hbWVfbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2hlbGxvX21lc3NhZ2UgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAobWVzc2FnZSwgIiIpKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIChwcmVzdW1hYmx5IGF1dGggZmFpbGVkKVxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWQgKHByZXN1bWFibHkgYXV0aCBmYWlsZWQpXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEhlbGxvIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCAocHJlc3VtYWJseSBhdXRoIGZhaWxlZClcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkhlbGxvIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBIZWxsbyIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9oZWxsb19uYW1lOgorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHNlcnZpY2UgbmFtZSBhcmcgZnJvbSBoZWxsb1xuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9oZWxsb19uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgc2luZ2xlIHN0cmluZyBhcmd1bWVudCB0byBoZWxsb1xuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHb3QgaGVsbG8gbmFtZTogJXNcbiIsIG5hbWUpOworCisgICAgICB3aGlsZSAoIWRidXNfYnVzX3NldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSkpCisgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9DUkVBVEVEOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBuYW1lOworICAgICAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgICAgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsgLyogd2UgaGF2ZW4ndCBkb25lIEFkZE1hdGNoIHNvIHdvbid0IGdldCBpdCBvdXJzZWx2ZXMgKi8KKyAgICAgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgbmFtZV9tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgIC8qIENsaWVudCBzaG91bGQgYWxzbyBoYXZlIGdvdHRlbiBTZXJ2aWNlQWNxdWlyZWQgKi8KKworICAgICAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAic2lnbmFsIE5hbWVBY3F1aXJlZCIpOworICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBub3RoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGlmICghIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0aW5nICVzLCBnb3Qgc210aGcgZWxzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9hY3F1aXJlZF9uYW1lOgorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYWNxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCBzZXJ2aWNlIG5hbWUgYXJnIGZyb20gYWNxdWlyZWRcbiIpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeV9nZXRfYWNxdWlyZWRfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgdG8gU2VydmljZUFjcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdvdCBhY3F1aXJlZCBuYW1lOiAlc1xuIiwgYWNxdWlyZWQpOworCisgICAgICBpZiAoc3RyY21wIChhY3F1aXJlZCwgbmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJBY3F1aXJlZCBuYW1lIGlzICVzIGJ1dCBleHBlY3RlZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCwgbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGFjcXVpcmVkID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRpbmcgLSByZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpZiAobmFtZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobmFtZV9tZXNzYWdlKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZG91YmxlX2hlbGxvX21lc3NhZ2UgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEhlbGxvIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgSGVsbG8iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisgIGRidXNfdWludDMyX3QgdWlkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBiYXNlX3NlcnZpY2VfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsIERCVVNfRVJST1JfRkFJTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHRoaXMgaXMgT0ssIFVuaXggdWlkcyBhcmVuJ3QgbWVhbmluZ2Z1bCBvbiBXaW5kb3dzICovCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZF9yZXR1cm4gZm9yIEdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9wcm9wZXJ0eToKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byBnZXQgdWlkIGJ5IEdldENvbm5lY3Rpb25Vbml4VXNlclxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFVzZXJcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisjaWZkZWYgREJVU19VTklYCisgIGRidXNfdWludDMyX3QgcGlkOworI2VuZGlmCisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYmFzZV9zZXJ2aWNlX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisjaWZkZWYgREJVU19XSU4KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBhcmUgZXhwZWN0aW5nIHRoaXMgZXJyb3IsIHNpbmNlIHdlIGtub3cgaW4gdGhlIHRlc3Qgc3VpdGUgd2UgYXJlbid0CisgICAgICAgICAgICogdGFsa2luZyB0byBhIGNsaWVudCBydW5uaW5nIG9uIFVOSVgKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2luZG93cyBjb3JyZWN0bHkgZG9lcyBub3Qgc3VwcG9ydCBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICB7CisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pIHx8IFwKKyAgICAgICAgICBkZWZpbmVkKF9fbGludXhfXykgfHwgXAorICAgICAgICAgIGRlZmluZWQoX19PcGVuQlNEX18pCisgICAgICAgICAgLyogSW4gcHJpbmNpcGxlIE5ldEJTRCBzaG91bGQgYWxzbyBiZSBpbiB0aGF0IGxpc3QsIGJ1dAorICAgICAgICAgICAqIGl0cyBpbXBsZW1lbnRhdGlvbiBvZiBQSUQtcGFzc2luZyBkb2Vzbid0IHdvcmsKKyAgICAgICAgICAgKiBvdmVyIGEgc29ja2V0cGFpcigpIGFzIHVzZWQgaW4gdGhlIGRlYnVnLXBpcGUgdHJhbnNwb3J0LgorICAgICAgICAgICAqIFdlIHRlc3QgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGEgbW9yZSByZWFsaXN0aWMgc2l0dWF0aW9uCisgICAgICAgICAgICogaW4gdGVzdC9kYnVzLWRhZW1vbi5jLiAqLworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyNlbHNlCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRvZXMgbm90IHN1cHBvcnQgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgYnV0IHBlcmhhcHMgdGhhdCdzIE9LP1xuIik7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX1dJTgorICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgdG8gZmFpbCBvbiBXaW5kb3dzIik7CisgICAgICBnb3RvIG91dDsKKyNlbHNlCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kX3JldHVybiBmb3IgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHBpZCBieSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0ZXN0IGlmIHJldHVybmVkIHBpZCBpcyB0aGUgc2FtZSBhcyBvdXIgb3duIHBpZAorICAgICAgICAgICAqCisgICAgICAgICAgICogQHRvZG8gSXQgd291bGQgcHJvYmFibHkgYmUgZ29vZCB0byByZXN0cnVjdHVyZSB0aGUgdGVzdHMKKyAgICAgICAgICAgKiAgICAgICBpbiBhIHdheSBzbyBvdXIgcGFyZW50IGlzIHRoZSBidXMgdGhhdCB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICAgICogICAgICAgY2F1c2UgdGhlbiB3ZSBjYW4gdGVzdCB0aGF0IHRoZSBwaWQgcmV0dXJuZWQgbWF0Y2hlcworICAgICAgICAgICAqICAgICAgIGdldHBwaWQoKQorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwaWQgIT0gKGRidXNfdWludDMyX3QpIF9kYnVzX2dldHBpZCAoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZXN1bHQgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBpcyBub3Qgb3VyIG93biBwaWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qICFEQlVTX1dJTiAqLworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19hZGRfbWF0Y2ggKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnJ1bGUpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2FkZF9tYXRjaCBmb3IgY29ubmVjdGlvbiAlcCwgcnVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgcnVsZSk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwgREJVU19UWVBFX1NUUklORywgJnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisKKyAgLyogc2VuZCBvdXIgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEFkZE1hdGNoIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJBZGRNYXRjaCIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIGV4cGVjdGVkICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgPT0gc2VyaWFsKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgQWRkTWF0Y2giKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ2V0X2FsbF9tYXRjaF9ydWxlcyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBtZXNzYWdlID0gTlVMTDsKKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfZ2V0X2FsbF9tYXRjaF9ydWxlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfSU5URVJGQUNFX1NUQVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldEFsbE1hdGNoUnVsZXMiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gQWRkTWF0Y2giKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PSBzZXJpYWwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBBZGRNYXRjaCIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19oZWxsb19jb25uZWN0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBzcGluX2Nvbm5lY3Rpb25fdW50aWxfYXV0aGVudGljYXRlZCAoY29udGV4dCwgY29ubmVjdGlvbik7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBjb25uZWN0aW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbikgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyLCBzbyB3ZSBjYW4ndAorICAgICAgICogZG8gdGhlIHVzdWFsIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24oKSBjaGVja3MKKyAgICAgICAqLworICAgICAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfYWRkX21hdGNoIChjb250ZXh0LCBjb25uZWN0aW9uLCAiIikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAga2lsbF9jbGllbnRfY29ubmVjdGlvbiAoY29udGV4dCwgY29ubmVjdGlvbik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRSAidGVzdC50aGlzLnNlcnZpY2UuZG9lcy5ub3QuZXhpc3QuZXd1b2l1cmpkZnhjdm4iCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbm9uZXhpc3RlbnRfc2VydmljZV9ub19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpub25leGlzdGVudCA9IE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRTsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBmbGFncyA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEFjdGl2YXRlU2VydmljZSBvbiBub25leGlzdGVudCIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgTk9ORVhJU1RFTlRfU0VSVklDRV9OQU1FKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbm9uZXhpc3RlbnRfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChOT05FWElTVEVOVF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBFY2hvIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5pdGlhbF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKmJhc2Vfc2VydmljZV9wKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKmJhc2Vfc2VydmljZSwgKmJhc2Vfc2VydmljZV9mcm9tX2J1cywgKm9sZF9vd25lcjsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGJhc2Vfc2VydmljZSA9IE5VTEw7CisgIG9sZF9vd25lciA9IE5VTEw7CisgIGJhc2Vfc2VydmljZV9mcm9tX2J1cyA9IE5VTEw7CisKKyAgbWVzc2FnZSA9IGluaXRpYWxfbWVzc2FnZTsKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSkKKyAgICB7CisgICAgICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgICByZWdldF9zZXJ2aWNlX25hbWVfYXJnOgorICAgICAgYmFzZV9zZXJ2aWNlID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBiYXNlX3NlcnZpY2VfZnJvbV9idXMgPSBOVUxMOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZiYXNlX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX2Zyb21fYnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9uYW1lX2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlICVzIGRvZXNuJ3QgaGF2ZSBhIHNlcnZpY2UgbmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCpiYXNlX3NlcnZpY2UgIT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGJhc2Ugc2VydmljZSBhY3RpdmF0aW9uLCBnb3QgXCIlc1wiIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChiYXNlX3NlcnZpY2UsIGJhc2Vfc2VydmljZV9mcm9tX2J1cykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBiYXNlIHNlcnZpY2UgYWN0aXZhdGlvbiwgZ290IFwiJXNcIiBpbnN0ZWFkIHdpdGggb3duZXIgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZSwgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAob2xkX293bmVyWzBdKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlJlY2VpdmVkIGFuIG9sZF9vd25lciBhcmd1bWVudCBkdXJpbmcgYmFzZSBzZXJ2aWNlIGFjdGl2YXRpb24sIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvbGRfb3duZXIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlOworICAgICAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgICAgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbikgZm9yIGJhc2Ugc2VydmljZSIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGJhc2Vfc2VydmljZV9wKQorICAgICpiYXNlX3NlcnZpY2VfcCA9IGJhc2Vfc2VydmljZTsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX2FjdGl2YXRlZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmFjdGl2YXRlZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5pdGlhbF9tZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfdWludDMyX3QgYWN0aXZhdGlvbl9yZXN1bHQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworICAgICAgY29uc3QgY2hhciAqc2VydmljZV9uYW1lLCAqYmFzZV9zZXJ2aWNlX2Zyb21fYnVzLCAqb2xkX293bmVyOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmb2xkX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZiYXNlX3NlcnZpY2VfZnJvbV9idXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZWdldF9zZXJ2aWNlX25hbWVfYXJnOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgJXMgZG9lc24ndCBoYXZlIGEgc2VydmljZSBuYW1lOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsIGFjdGl2YXRlZF9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHRvIHNlZSBzZXJ2aWNlICVzIGNyZWF0ZWQsIHNhdyAlcyBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlZF9uYW1lLCBzZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKGJhc2Vfc2VydmljZV9uYW1lLCBiYXNlX3NlcnZpY2VfZnJvbV9idXMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTmFtZU93bmVyQ2hhbmdlZCByZXBvcnRzIHdyb25nIGJhc2Ugc2VydmljZTogJXMgb3duZXIsIGV4cGVjdGVkICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzLCBiYXNlX3NlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKG9sZF9vd25lclswXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJleHBlY3RlZCBhICVzLCBnb3QgYSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY2hhbmdlKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZTsKKyAgICAgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGEgcmVwbHkgdG8gJXMsIGdvdCBub3RoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIk5hbWVPd25lckNoYW5nZWQgZm9yIHRoZSBhY3RpdmF0ZWQgbmFtZSIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJyZXBseSB0byBTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGFjdGl2YXRpb25fcmVzdWx0ID0gMDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZhY3RpdmF0aW9uX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBpZiAoIWRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgaGF2ZSBhY3RpdmF0aW9uIHJlc3VsdCBmaXJzdCBhcmd1bWVudCB0byAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYWN0aXZhdGlvbl9yZXN1bHQgPT0gREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTKQorICAgICAgICA7IC8qIEdvb2QgKi8KKyAgICAgIGVsc2UgaWYgKGFjdGl2YXRpb25fcmVzdWx0ID09IERCVVNfU1RBUlRfUkVQTFlfQUxSRUFEWV9SVU5OSU5HKQorICAgICAgICA7IC8qIEdvb2QgYWxzbyAqLworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjdGl2YXRpb24gcmVzdWx0IHdhcyAldSwgbm8gZ29vZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9yZXN1bHQpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgdmVyaWZ5aW5nIGV4aXN0ZW50IGFjdGl2YXRpb24gcmVzdWx0c1xuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9hdXRvX2FjdGl2YXRlZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICphY3RpdmF0ZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbml0aWFsX21lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgbWVzc2FnZSA9IGluaXRpYWxfbWVzc2FnZTsKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlX25hbWU7CisgICAgICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgICByZWdldF9zZXJ2aWNlX25hbWVfYXJnOgorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9uYW1lX2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlICVzIGRvZXNuJ3QgaGF2ZSBhIHNlcnZpY2UgbmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCBhY3RpdmF0ZWRfbmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB0byBzZWUgc2VydmljZSAlcyBjcmVhdGVkLCBzYXcgJXMgaW5zdGVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRfbmFtZSwgc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSByZWd1bGFyIGFjdGl2YXRpb24gaW4gdGhhdCB3ZSBkb24ndCBnZXQgYQorICAgICAgICogcmVwbHkgdG8gQWN0aXZhdGVTZXJ2aWNlIGhlcmUuCisgICAgICAgKi8KKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIGZvciB0aGUgYWN0aXZhdGVkIG5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmFjdGl2YXRlZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmJhc2Vfc2VydmljZSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogTm93IHdlIGFyZSBleHBlY3RpbmcgU2VydmljZU93bmVyQ2hhbmdlZCAoZGVsZXRpb24pIG1lc3NhZ2VzIGZvciB0aGUgYmFzZQorICAgKiBzZXJ2aWNlIGFuZCB0aGUgYWN0aXZhdGVkX25hbWUuICBUaGUgYmFzZSBzZXJ2aWNlCisgICAqIG5vdGlmaWNhdGlvbiBpcyByZXF1aXJlZCB0byBjb21lIGxhc3QuCisgICAqLworICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYWN0aXZhdGVkX25hbWU7CisgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gTlVMTDsKKyAgc29jZC5jb250ZXh0ID0gY29udGV4dDsKKworICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICBpZiAoc29jZC5mYWlsZWQpCisgICAgZ290byBvdXQ7CisKKyAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IGdvdF9lcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXhpdCBtZXNzYWdlIHRvIHRoZSB0ZXN0IHNlcnZpY2VcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEtpbGwgb2ZmIHRoZSB0ZXN0IHNlcnZpY2UgYnkgc2VuZGluZyBpdCBhIHF1aXQgbWVzc2FnZSAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEbyB0aGlzIGFnYWluOyB3ZSBzdGlsbCBuZWVkIHRoZSBzZXJ2aWNlIHRvIGV4aXQuLi4gKi8KKyAgICAgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAgICAgLyogRG8gdGhpcyBhZ2Fpbjsgd2Ugc3RpbGwgbmVlZCB0aGUgc2VydmljZSB0byBleGl0Li4uICovCisgICAgICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIC8qIHNlbmQgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICAvKiByZWFkIGl0IGluIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGVzdCBzZXJ2aWNlICovCisgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworCisgIC8qIHNlZSBpZiB3ZSBnb3QgYW4gZXJyb3IgZHVyaW5nIG1lc3NhZ2UgYnVzIGRpc3BhdGNoaW5nICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKEZBTFNFKTsKKyAgbWVzc2FnZSA9IGJvcnJvd19tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGdvdF9lcnJvciA9IG1lc3NhZ2UgIT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOworICBpZiAobWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorCisgIGlmICghZ290X2Vycm9yKQorICAgIHsKKyAgICAgIC8qIElmIG5vIGVycm9yLCB3YWl0IGZvciB0aGUgdGVzdCBzZXJ2aWNlIHRvIGV4aXQgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgICB9CisKKyAgaWYgKGdvdF9lcnJvcikKKyAgICB7CisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2l0aCB0aGUgY29ycmVjdCByZXBseSBzZXJpYWwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBubyBtZW1vcnkgZXJyb3IgZnJvbSBhc2tpbmcgdGVzdCBzZXJ2aWNlIHRvIGV4aXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGVycm9yICVzIHdoZW4gYXNraW5nIHRlc3Qgc2VydmljZSB0byBleGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIC8qIERvIHRoaXMgYWdhaW47IHdlIHN0aWxsIG5lZWQgdGhlIHNlcnZpY2UgdG8gZXhpdC4uLiAqLworICAgICAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBTaG91bGQgbm93IGhhdmUgYSBOb1JlcGx5IGVycm9yIGZyb20gdGhlIEV4aXQoKSBtZXRob2QKKyAgICAgICAqIGNhbGw7IGl0IHNob3VsZCBoYXZlIGNvbWUgYWZ0ZXIgYWxsIHRoZSBkZWFjdGl2YXRpb24KKyAgICAgICAqIHN0dWZmLgorICAgICAgICovCisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBseSB0byBFeGl0KCkgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19SRVBMWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9SZXBseSBlcnJvciBmcm9tIEV4aXQoKSBtZXRob2QgY2FsbCIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdpdGggdGhlIGNvcnJlY3QgcmVwbHkgc2VyaWFsIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdvdCBlcnJvciAlcyBhZnRlciB0ZXN0IHNlcnZpY2UgZXhpdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ290X2Vycm9yIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAuLi4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgYXA7CisgIGRidXNfYm9vbF90IGVycm9yX2ZvdW5kOworICBjb25zdCBjaGFyICplcnJvcl9uYW1lOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBleHBlY3RlZCBlcnJvclxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiYW4gZXJyb3IiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVycm9yX2ZvdW5kID0gRkFMU0U7CisKKyAgdmFfc3RhcnQgKGFwLCBmaXJzdF9lcnJvcl9uYW1lKTsKKyAgZXJyb3JfbmFtZSA9IGZpcnN0X2Vycm9yX25hbWU7CisgIHdoaWxlIChlcnJvcl9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgZXJyb3JfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcl9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVycm9yX25hbWUgPSB2YV9hcmcgKGFwLCBjaGFyKik7CisgICAgfQorICB2YV9lbmQgKGFwKTsKKworICBpZiAoIWVycm9yX2ZvdW5kKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBlcnJvciAlcyBvciBvdGhlciwgZ290ICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICBmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgR09UX1NFUlZJQ0VfQ1JFQVRFRCwKKyAgR09UX1NFUlZJQ0VfREVMRVRFRCwKKyAgR09UX0VSUk9SLAorICBHT1RfU09NRVRISU5HX0VMU0UKK30gR290U2VydmljZUluZm87CisKK3N0YXRpYyBHb3RTZXJ2aWNlSW5mbworY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIEdvdFNlcnZpY2VJbmZvIG1lc3NhZ2Vfa2luZDsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAgIHJlZ2V0X3NlcnZpY2VfaW5mb19kYXRhOgorICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBuZXdfb3duZXIgPSBOVUxMOworCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5ld19vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgidW5leHBlY3RlZCBhcmd1bWVudHMgZm9yIE5hbWVPd25lckNoYW5nZWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIW9sZF9vd25lclswXSkKKyAgICAgICAgbWVzc2FnZV9raW5kID0gR09UX1NFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIGVsc2UgaWYgKCFuZXdfb3duZXJbMF0pCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TRVJWSUNFX0RFTEVURUQ7CisgICAgICBlbHNlCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfRVJST1I7CisgIGVsc2UKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU09NRVRISU5HX0VMU0U7CisKKyAgcmV0dXJuIG1lc3NhZ2Vfa2luZDsKK30KKworI2RlZmluZSBFWElTVEVOVF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKmJhc2Vfc2VydmljZV9tZXNzYWdlOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKmV4aXN0ZW50ID0gRVhJU1RFTlRfU0VSVklDRV9OQU1FOworICBkYnVzX3VpbnQzMl90IGZsYWdzOworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBmbGFncyA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogbm93IHdhaXQgZm9yIHRoZSBtZXNzYWdlIGJ1cyB0byBoZWFyIGJhY2sgZnJvbSB0aGUgYWN0aXZhdGVkCisgICAqIHNlcnZpY2UuCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJhY3RpdmF0ZWQgc2VydmljZSB0byBjb25uZWN0Iik7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAidGVzdCBzZXJ2aWNlIHRvIGV4aXQgb3IgZmluaXNoIHVwIik7CisKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGJhc2Ugc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgQWN0aXZhdGVTZXJ2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiKHNob3VsZCBiZSBhbiBlcnJvciBvciBhIHNlcnZpY2UgYW5ub3VuY2VtZW50Iik7CisgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAvKiBBIHNlcnZpY2UgZGVsZXRlZCBzaG91bGQgYmUgY29taW5nIGFsb25nIG5vdyBhZnRlciB0aGlzIGVycm9yLgorICAgICAgICAgICAqIFdlIGNhbiBhbHNvIGdldCB0aGUgZXJyb3IgKmFmdGVyKiB0aGUgc2VydmljZSBkZWxldGVkLgorICAgICAgICAgICAqLworCisgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9ERUxFVEVEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIHN0YXJ0ZWQgdXAgYW5kIGdvdCBhIGJhc2UgYWRkcmVzcywgYnV0IHRoZW4KKyAgICAgICAgICAgICAqIGZhaWxlZCB0byByZWdpc3RlciB1bmRlciBFWElTVEVOVF9TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBzaG91bGQgZ2V0IGFuIGVycm9yIGFib3V0IHRoZSBzZXJ2aWNlIGV4aXRpbmcKKyAgICAgICAgICAgICAqIGlmIHdlIGRpZG4ndCBnZXQgaXQgYmVmb3JlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobWVzc2FnZV9raW5kICE9IEdPVF9FUlJPUikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgImVycm9yIGFib3V0IHNlcnZpY2UgZXhpdGluZyIpOworCisgICAgICAgICAgICAgICAgLyogYW5kIHByb2Nlc3MgZXZlcnl0aGluZyBhZ2FpbiAqLworICAgICAgICAgICAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAgICAgICAgICAgICAgIGlmICghY2hlY2tfZ290X2Vycm9yIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCwKKwkJCQkgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfQ1JFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlIHdlIGp1c3QgcHV0IGJhY2shICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBoYXZlIGJlZW4gYSBOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbilcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIG1lc3NhZ2UpKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworCisgICAgICAgICAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKwkgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLCBiYXNlX3NlcnZpY2UpKQorCSAgICBnb3RvIG91dDsKKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VnZmF1bHRfc2VydmljZV9ub19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpzZWd2X3NlcnZpY2U7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgc2Vndl9zZXJ2aWNlID0gIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZSI7CisgIGZsYWdzID0gMDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2Vndl9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIGFjdGl2YXRpbmcgc2VnZmF1bHQgc2VydmljZSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgICAgICAgICAgc2VydmljZWhlbHBlciA9IGJ1c19jb250ZXh0X2dldF9zZXJ2aWNlaGVscGVyIChjb250ZXh0KTsKKyAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhpcyBvbmx5IGhhcHBlbnMgd2l0aCB0aGUgbGF1bmNoIGhlbHBlciAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmljZWhlbHBlciAhPSBOVUxMKTsKKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHVuaGFuZGxlZCBleGNlcHRpb25zIGFyZSBub3JtYWwgZXhpdCBjb2RlcyAqLworICAgICAgICB9CisjZWxzZQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSBzZWdmYXVsdCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZWdmYXVsdF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzZWdmYXVsdCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyNpZmRlZiBEQlVTX1dJTgorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBhcmUgbm9ybWFsIGV4aXQgY29kZXMgKi8KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYWN0aXZhdGUgc2VnZmF1bHQgc2VydmljZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFRFU1RfRUNIT19NRVNTQUdFICJUZXN0IGVjaG8gbWVzc2FnZSIKKyNkZWZpbmUgVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0UgIlRlc3Qgc2VuZGluZyBtZXNzYWdlIHRvIHNlbGYiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZXhpc3RlbnRfaGVsbG9fZnJvbV9zZWxmIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqdGV4dDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW5IZWxsb0Zyb21TZWxmIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBydW5uaW5nIGhlbGxvIGZyb20gc2VsZiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBSdW5IZWxsb0Zyb21TZWxmIG1lc3NhZ2VcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3BpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGluZyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gcnVubmluZyBQaW5nIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIFBpbmcgbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIHJldHVybiBkdXJpbmcgUGluZ1xuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqbWFjaGluZV9pZDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNYWNoaW5lSWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIE5vdGU6IGlmIHRoaXMgdGVzdCBpcyBydW4gaW4gT09NIG1vZGUsIGl0IHdpbGwgYmxvY2sgd2hlbiB0aGUgYnVzCisgICAqIGRvZXNuJ3Qgc2VuZCBhIHJlcGx5IGR1ZSB0byBPT00uCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSBmcm9tIHJ1bm5pbmcgR2V0TWFjaGluZUlkIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIEdldE1hY2hpbmVJZCBtZXNzYWdlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmV0dXJuIGR1cmluZyBHZXRNYWNoaW5lSWRcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWFjaGluZV9pZCA9IE5VTEw7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbWFjaGluZV9pZCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhIG1hY2hpbmUgSUQgaW4gcmVwbHkgdG8gR2V0TWFjaGluZUlkXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtYWNoaW5lX2lkID09IE5VTEwgfHwgc3RybGVuIChtYWNoaW5lX2lkKSAhPSAzMikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWFjaGluZSBpZCBsb29rcyBib2d1czogJyVzJ1xuIiwgbWFjaGluZV9pZCA/IG1hY2hpbmVfaWQgOiAibnVsbCIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogV2UgY2FuJ3QgY2hlY2sgdGhhdCB0aGUgbWFjaGluZSBpZCBpcyBjb3JyZWN0IGJlY2F1c2UgZHVyaW5nIG1ha2UgY2hlY2sgaXQgaXMKKyAgICoganVzdCBtYWRlIHVwIGZvciBlYWNoIHByb2Nlc3Mgc2VwYXJhdGVseQorICAgKi8KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICp0ZXh0OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9FQ0hPX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEVjaG8gb24gZXhpc3RlbnQgc2VydmljZSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYXV0byBzdGFydCAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiYXV0byBzdGFydCIpOworCisgIC8qIHdlIHNob3VsZCBnZXQgemVybyBvciB0d28gU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzICovCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAic2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIC8qIFNob3VsZCBnZXQgYSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGFjdGl2YXRlZAorICAgICAgICogc2VydmljZSBuYW1lLCBvciBhIHNlcnZpY2UgZGVsZXRpb24gb24gdGhlIGJhc2Ugc2VydmljZSBuYW1lCisgICAgICAgKi8KKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJObyBtZXNzYWdlIGFmdGVyIGF1dG8gYWN0aXZhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIihzaG91bGQgYmUgYSBzZXJ2aWNlIGFubm91bmNlbWVudClcbiIpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9raW5kID0gY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAobWVzc2FnZSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgc3dpdGNoIChtZXNzYWdlX2tpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgdGhhdCBTZXJ2aWNlT3duZXJDaGFuZ2VkIChjcmVhdGlvbikgd2FzIGNvcnJlY3RseSByZWNlaXZlZCAqLworICAgICAgICAgIGlmICghY2hlY2tfc2VydmljZV9hdXRvX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgRVhJU1RFTlRfU0VSVklDRV9OQU1FCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgICAgICAgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICAgICAgICAgICAgc29jZC5jb250ZXh0ID0gY29udGV4dDsKKworICAgICAgICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICAgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgYXV0byBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgbm93IHdlJ3ZlIGRlYWx0IHdpdGggU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzLCBub3cgc2hvdWxkCisgICAqIGNvbWUgdGhlIG1ldGhvZCByZXBseSAob3IgZXJyb3IpIGZyb20gdGhlIGluaXRpYWwgbWV0aG9kIGNhbGwKKyAgICovCisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gZWNobyBtZXNzYWdlIGFmdGVyIGF1dG8tYWN0aXZhdGlvbiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfZXhpc3RlbnRfcGluZyAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9oZWxsb19mcm9tX3NlbGYgKGNvbnRleHQsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfRklMRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlRG90U2VydmljZUZpbGVEb2VzTm90RXhpc3QiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZmlsZV9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0ZJTEVfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2VydmljZSBmaWxlIG1pc3Npbmcgc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIHVua25vd25cbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgVXNlcikiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgRXhlYykiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJjb3VsZCBub3QgYWN0aXZhdGUgYXMgaW52YWxpZCBzZXJ2aWNlIGZpbGUgd2FzIG5vdCBhZGRlZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFzIHdlIHNob3VsZG4ndCBoYXZlIGJlZW4gYWRkZWQgdG8KKyAgICAgICAgICAgICAqIHRoZSBhY3RpdmF0aW9uIGxpc3Qgd2l0aCBhIG1pc3NpbmcgRXhlYyBrZXkgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhbGxvd2VkLCBhbmQgaXMgdGhlIG1lc3NhZ2UgcGFzc2VkIGJhY2sgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIGxhdW5jaCBoZWxwZXIgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhdXRvLXN0YXJ0IG1pc3Npbmcgc2VydmljZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZSIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgIAkJCQkJICAgInJlcGx5IHRvIHNlcnZpY2Ugd2hpY2ggc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCAobWlzc2luZyBTZXJ2aWNlKSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImNvdWxkIG5vdCBhY3RpdmF0ZSBhcyBpbnZhbGlkIHNlcnZpY2UgZmlsZSB3YXMgbm90IGFkZGVkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYXMgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICAgICAgICogdGhlIGFjdGl2YXRpb24gbGlzdCB3aXRoIGEgbWlzc2luZyBFeGVjIGtleSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIGZpbGUgaW52YWxpZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGFsbG93ZWQsIGFuZCBpcyB0aGUgbWVzc2FnZSBwYXNzZWQgYmFjayBmcm9tIHRoZQorICAgICAgICAgICAgICogbGF1bmNoIGhlbHBlciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfRkFJTF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNIRUxMX0ZBSUxfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2hlbGwgRWNobyBvbiBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3QgaW52YWxpZCBhcmdzXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgc2hlbGwgZmFpbCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX3NlcnZpY2Vfc3VjY2Vzc19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICphcmd2WzddID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzaGVsbCBzdWNjZXNzIHNlcnZpY2UiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGF1dG8gc3RhcnQgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIChhZnRlciBzZW5kaW5nICVzKVxuIiwgImF1dG8gc3RhcnQiKTsKKworICAvKiB3ZSBzaG91bGQgZ2V0IHplcm8gb3IgdHdvIFNlcnZpY2VPd25lckNoYW5nZWQgc2lnbmFscyAqLworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInNlcnZpY2UgdG8gZXhpdCIpOworCisgICAgICAvKiBTaG91bGQgZ2V0IGEgc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb24gZm9yIHRoZSBhY3RpdmF0ZWQKKyAgICAgICAqIHNlcnZpY2UgbmFtZSwgb3IgYSBzZXJ2aWNlIGRlbGV0aW9uIG9uIHRoZSBiYXNlIHNlcnZpY2UgbmFtZQorICAgICAgICovCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTm8gbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICIoc2hvdWxkIGJlIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfQ1JFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlIHdlIGp1c3QgcHV0IGJhY2shICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBoYXZlIGJlZW4gYSBOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbilcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIENoZWNrIHRoYXQgU2VydmljZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIHdhcyBjb3JyZWN0bHkgcmVjZWl2ZWQgKi8KKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE9LLCBub3cgd2UndmUgZGVhbHQgd2l0aCBTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbHMsIG5vdyBzaG91bGQKKyAgICogY29tZSB0aGUgbWV0aG9kIHJlcGx5IChvciBlcnJvcikgZnJvbSB0aGUgaW5pdGlhbCBtZXRob2QgY2FsbAorICAgKi8KKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2UgYWZ0ZXIgYXV0by1hY3RpdmF0aW9uIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIGVjaG8gbWVzc2FnZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndls2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBhcmd1bWVudHMgZnJvbSByZXR1cm5cbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAvKiBkb24ndCB3b3JyeSBhYm91dCBhcmdbMF0gYXMgaXQgbWF5IGJlIGRpZmZlcmVudAorICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXRoIHRvIHRoZSB0ZXN0cworICAgKi8KKyAgaWYgKHN0cmNtcCgiLXRlc3QiLCBhcmd2WzFdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbMV0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAiLXRlc3QiLCBhcmd2WzFdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ0aGF0IiwgYXJndlsyXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzJdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ0aGF0IiwgYXJndlsyXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgid2UgZ2V0IiwgYXJndlszXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzNdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ3ZSBnZXQiLCBhcmd2WzNdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJiYWNrIiwgYXJndls0XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzRdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJiYWNrIiwgYXJndls0XSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgiLS13aGF0IiwgYXJndls1XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzVdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICItLXdoYXQiLCBhcmd2WzVdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ3ZSBwdXQgaW4iLCBhcmd2WzZdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbNl0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgIndlIHB1dCBpbiIsIGFyZ3ZbNl0pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMUZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKK30gQ2hlY2sxRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19vb21fY2hlY2sxX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrMURhdGEgKmQgPSBkYXRhOworCisgIGlmICghICgqIGQtPmZ1bmMpIChkLT5jb250ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGQtPmNvbnRleHQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3Zlciwgc2hvdWxkIGJlIGNvdmVyZWQgYnkgdGVzdCBzdWl0ZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2hlY2sxX3RyeV9pdGVyYXRpb25zIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sxRnVuYyAgZnVuYykKK3sKKyAgQ2hlY2sxRGF0YSBkOworCisgIGQuZnVuYyA9IGZ1bmM7CisgIGQuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoZGVzY3JpcHRpb24sIGNoZWNrX29vbV9jaGVjazFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ2V0X3NlcnZpY2VzIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKwkJICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkgICAgY29uc3QgY2hhciAgICAgKm1ldGhvZCwKKwkJICAgIGNoYXIgICAgICAgICAqKipzZXJ2aWNlcywKKwkJICAgIGludCAgICAgICAgICAgICpsZW4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNoYXIgKipzcnZzOworICBpbnQgbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBtZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisJCQkJCSAgREJVU19QQVRIX0RCVVMsCisJCQkJCSAgREJVU19JTlRFUkZBQ0VfREJVUywKKwkJCQkJICBtZXRob2QpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisJCSAgbWV0aG9kLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorCXsKKwkgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorCQkJICAgIm1ldGhvZF9yZXR1cm4gZm9yIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisJICBnb3RvIG91dDsKKwl9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisJCQkJICBEQlVTX1RZUEVfQVJSQVksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLAorCQkJCSAgJnNydnMsICZsLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorCXsKKwkgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwkgICAgeworCSAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gbGlzdCBzZXJ2aWNlcyBieSAlc1xuIiwgbWV0aG9kKTsKKwkgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisJICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCSAgICAgIGdvdG8gcmV0cnlfZ2V0X3Byb3BlcnR5OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKwkgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9BUlJBWSBmcm9tICVzXG4iLCBtZXRob2QpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisJfSBlbHNlIHsKKwkgICpzZXJ2aWNlcyA9IHNydnM7CisJICAqbGVuID0gbDsKKwl9CisgICAgfQorCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xpc3Rfc2VydmljZXMgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorCQkgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICAqYmFzZV9zZXJ2aWNlX21lc3NhZ2U7CisgIGNvbnN0IGNoYXIgICAqYmFzZV9zZXJ2aWNlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgICByZXR2YWw7CisgIGNvbnN0IGNoYXIgICAqZXhpc3RlbnQgPSBFWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisgIGNoYXIgICAgICAgICoqc2VydmljZXM7CisgIGludCAgICAgICAgICAgbGVuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19saXN0X3NlcnZpY2VzIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0QWN0aXZhdGFibGVOYW1lcyIsICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhciAqKilzZXJ2aWNlcywgZXhpc3RlbnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgJXMgZnJvbSBMaXN0QWN0aXZhdGFibGVOYW1lc1xuIiwgZXhpc3RlbnQpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKwkJCQkJICBEQlVTX1BBVEhfREJVUywKKwkJCQkJICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorCQkJCQkgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgRkFMU0UpOworCisgIGZsYWdzID0gMDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZleGlzdGVudCwKKwkJCQkgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgImFjdGl2YXRlZCBzZXJ2aWNlIHRvIGNvbm5lY3QiKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgJXMgJWQgb24gJXBcbiIsCisJCSAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKwkJCQkgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSB8fAorCSAgICAgICBkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisJCQkJICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKwkgICAgICAgZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCBlcnJvciAlc1xuIiwKKwkJICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJCSBtZXNzYWdlLCAmYmFzZV9zZXJ2aWNlKSkKKwlnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCIpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisJeworCSAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYmFzZSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvblxuIik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorCXsKKwljYXNlIEdPVF9TT01FVEhJTkdfRUxTRToKKwljYXNlIEdPVF9FUlJPUjoKKwljYXNlIEdPVF9TRVJWSUNFX0RFTEVURUQ6CisJICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIGFmdGVyIEFjdGl2YXRlU2VydmljZSAiCisJCSAgICAgICIoc2hvdWxkIGJlIGFuIGVycm9yIG9yIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKwkgIGdvdG8gb3V0OworCisJY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorCSAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisJICBpZiAobWVzc2FnZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSB3ZSBqdXN0IHB1dCBiYWNrISAiCisJCQkgICJzaG91bGQgaGF2ZSBiZWVuIGEgTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pXG4iKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCisJICBpZiAoIWNoZWNrX3NlcnZpY2VfYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLCBFWElTVEVOVF9TRVJWSUNFX05BTUUsCisJCQkJCWJhc2Vfc2VydmljZSwgbWVzc2FnZSkpCisJICAgIGdvdG8gb3V0OworCisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCSAgbWVzc2FnZSA9IE5VTEw7CisKKwkgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKwkgICAgeworCSAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzdWNjZXNzZnVsIGFjdGl2YXRpb25cbiIpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0TmFtZXMiLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoKGNvbnN0IGNoYXIgKiopc2VydmljZXMsIGV4aXN0ZW50KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkICVzIGZyb20gTGlzdE5hbWVzXG4iLCBleGlzdGVudCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLCBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMkZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247Cit9IENoZWNrMkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfb29tX2NoZWNrMl9mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVjazJEYXRhICpkID0gZGF0YTsKKworICBpZiAoISAoKiBkLT5mdW5jKSAoZC0+Y29udGV4dCwgZC0+Y29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChkLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIsIHNob3VsZCBiZSBjb3ZlcmVkIGJ5IHRlc3Qgc3VpdGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrMl90cnlfaXRlcmF0aW9ucyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIENoZWNrMkZ1bmMgICAgICBmdW5jKQoreworICBDaGVjazJEYXRhIGQ7CisKKyAgZC5mdW5jID0gZnVuYzsKKyAgZC5jb250ZXh0ID0gY29udGV4dDsKKyAgZC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfb29tX2NoZWNrMl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVzIGZhaWxlZCBkdXJpbmcgb29tXG4iLCBkZXNjcmlwdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRlbnZfVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyhjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgZnVsbDsKKyAgREJ1c1N0cmluZyBmaWxlOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwgJmZ1bGwsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGwsICZmaWxlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU2V0dGluZyBURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGwpKTsKKworICBkYnVzX3NldGVudiAoIlRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfdGVzdF9jb25mIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorCQkgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lLAorCQkgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHVzZV9sYXVuY2hlcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmZvbzsKKyAgREJ1c0Nvbm5lY3Rpb24gKmJhcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmJhejsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIC8qIHNhdmUgdGhlIGNvbmZpZyBuYW1lIGZvciB0aGUgYWN0aXZhdGlvbiBoZWxwZXIgKi8KKyAgaWYgKCFzZXRlbnZfVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyAodGVzdF9kYXRhX2RpciwgZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBzZXR0aW5nIFRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29udGV4dCA9IGJ1c19jb250ZXh0X25ld190ZXN0ICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSk7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfZG91YmxlX2hlbGxvX21lc3NhZ2UgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGZvbywgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgYmFyID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoYmFyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGJhcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGJhcik7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGJhciwgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgYmF6ID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoYmF6ID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGJheikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGJheik7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGJheiwgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGJheiwgImludGVyZmFjZT0nY29tLmV4YW1wbGUnIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGlmICghY2hlY2tfZ2V0X2FsbF9tYXRjaF9ydWxlcyAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJHZXRBbGxNYXRjaFJ1bGVzIG1lc3NhZ2UgZmFpbGVkIik7CisjZW5kaWYKKworICBpZiAoIWNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJHZXRDb25uZWN0aW9uVW5peFVzZXIgbWVzc2FnZSBmYWlsZWQiKTsKKworI2lmZGVmIERCVVNfV0lOX0ZJWE1FCisgIF9kYnVzX3ZlcmJvc2UoIlRPRE86IHRlc3Rpbmcgb2YgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgbWVzc2FnZSBza2lwcGVkIGZvciBub3dcbiIpOworI2Vsc2UKKyAgaWYgKCFjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKGNvbnRleHQsIGJheikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgbWVzc2FnZSBmYWlsZWQiKTsKKyNlbmRpZgorCisgIGlmICghY2hlY2tfbGlzdF9zZXJ2aWNlcyAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJMaXN0QWN0aXZhdGFibGVOYW1lcyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc2V0dGluZyB1cCBpbml0aWFsIGNvbm5lY3Rpb25zXG4iKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImluaXRpYWwgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQiKTsKKyAgICB9CisKKyAgY2hlY2sxX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCAiY3JlYXRlX2FuZF9oZWxsbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfaGVsbG9fY29ubmVjdGlvbik7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJub25leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NlZ2ZhdWx0X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJleGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJub25leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCk7CisKKyAgLyogb25seSBkbyB0aGUgc2VnZmF1bHQgdGVzdCBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBsYXVuY2hlciAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgInNlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hdXRvX3N0YXJ0KTsKKworICAvKiBvbmx5IGRvIHRoZSBzaGVsbCBmYWlsIHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2hlbGxfZmFpbF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisgIC8qIHNwZWNpZmljIHRvIGxhdW5jaGVyICovCisgIGlmICh1c2VfbGF1bmNoZXIpCisgICAgaWYgKCFjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcgKGNvbnRleHQsIGZvbykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGdldCBzZXJ2aWNlIGZpbGUgbm90IGZvdW5kIGVycm9yIik7CisKKyNpZiAwCisgIC8qIE5vdGU6IG5lZWQgdG8gcmVzb2x2ZSBzb21lIGlzc3VlcyB3aXRoIHRoZSB0ZXN0aW5nIGNvZGUgaW4gb3JkZXIgdG8gcnVuCisgICAqIHRoaXMgaW4gb29tIChoYW5kbGUgdGhhdCB3ZSBzb21ldGltZXMgZG9uJ3QgZ2V0IHJlcGxpZXMgYmFjayBmcm9tIHRoZSBidXMKKyAgICogd2hlbiBvb20gaGFwcGVucywgd2l0aG91dCBibG9ja2luZyB0aGUgdGVzdCkuCisgICAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgImV4aXN0ZW50X3NlcnZpY2VfYXV0b19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworI2VuZGlmCisKKyAgaWYgKCFjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZXhpc3RlbnQgc2VydmljZSBhdXRvIHN0YXJ0IGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hlbGwgc3VjY2VzcyBzZXJ2aWNlIGF1dG8gc3RhcnQgZmFpbGVkIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vLCBiYXIsIGFuZCBiYXpcbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworICBraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCAoYmFyKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJheik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogc2F2ZSB0aGUgY29uZmlnIG5hbWUgZm9yIHRoZSBhY3RpdmF0aW9uIGhlbHBlciAqLworICBpZiAoIXNldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHNldHRpbmcgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgZm9vLCAiIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGFjdGl2YXRpb24uYyB1c2VyIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVzZXIgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBleGVjIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImV4ZWMgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBzZXJ2aWNlIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2Vfc2VydmljZV9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNlcnZpY2UgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyBmb29cbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICAvKiBydW4gbm9ybWFsIGFjdGl2YXRpb24gdGVzdHMgKi8KKyAgX2RidXNfdmVyYm9zZSAoIk5vcm1hbCBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIsIEZBTFNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZm5kZWYgREJVU19XSU4KKyAgLyogcnVuIGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyAqLworICBfZGJ1c192ZXJib3NlICgiTGF1bmNoIGhlbHBlciBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZiIsIFRSVUUpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBydW4gc2VsZWN0IGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyBvbiBicm9rZW4gc2VydmljZSBmaWxlcyAqLworICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAodGVzdF9kYXRhX2RpciwKKyAgCQkJICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZiIpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmZvbzsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKiBUZXN0IFNIQTEgYXV0aGVudGljYXRpb24gKi8KKyAgX2RidXNfdmVyYm9zZSAoIlRlc3RpbmcgU0hBMSBjb250ZXh0XG4iKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mIik7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoIChjb250ZXh0LCBmb28sICIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGRtYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc2V0dGluZyB1cCBpbml0aWFsIFNIQS0xIGNvbm5lY3Rpb25cbiIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5pdGlhbCBjb25uZWN0aW9uIHNldHVwIGZhaWxlZCIpOworICAgIH0KKworICBjaGVjazFfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsICJjcmVhdGVfYW5kX2hlbGxvX3NoYTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKK2RidXNfYm9vbF90CitidXNfdW5peF9mZHNfcGFzc2luZ190ZXN0KGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb28sICpiYXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNTb2NrZXQgb25lWzJdLCB0d29bMl07CisgIGludCB4LCB5LCB6OworICBjaGFyIHI7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXdfdGVzdCAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb250ZXh0Iik7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGZvbywgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgYmFyID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoYmFyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGJhcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGJhcik7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGJhciwgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCEobSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsKCIvIiwgImEuYi5jIiwgImQiKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIG1lc3NhZ2UiKTsKKworICBpZiAoIShfZGJ1c19zb2NrZXRwYWlyIChvbmUsIG9uZSsxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMxIik7CisKKyAgaWYgKCEoX2RidXNfc29ja2V0cGFpciAodHdvLCB0d28rMSwgVFJVRSwgJmVycm9yKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gYWxsb2NhdGUgcGlwZSAjMiIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCBvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCB0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCB0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhdHRhY2ggZmRzLiIpOworCisgIGlmICghX2RidXNfY2xvc2Vfc29ja2V0IChvbmVbMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMSAiKTsKKyAgaWYgKCFfZGJ1c19jbG9zZV9zb2NrZXQgKHR3b1swXSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyICIpOworCisgIGlmICghKGRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlKGZvbywgREJVU19UWVBFX1VOSVhfRkQpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkNvbm5lY3Rpb24gY2Fubm90IGRvIGZkIHBhc3NpbmciKTsKKworICBpZiAoIShkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShiYXIsIERCVVNfVFlQRV9VTklYX0ZEKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJDb25uZWN0aW9uIGNhbm5vdCBkbyBmZCBwYXNzaW5nIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZm9vLCBtLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBzZW5kIGZkcyIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGZvbykpOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGZvbywgInVuaXggZmQgcmVjZXB0aW9uIG9uIGZvbyIpOworCisgIGlmICghKG0gPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGZvbykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlY2VpdmUgbXNnIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG0sICJhLmIuYyIsICJkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJib2d1cyBtZXNzYWdlIHJlY2VpdmVkIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmKG0pOworCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgYmFyLCAidW5peCBmZCByZWNlcHRpb24gb24gYmFyIik7CisKKyAgaWYgKCEobSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoYmFyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVjZWl2ZSBtc2ciKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pc19zaWduYWwobSwgImEuYi5jIiwgImQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoImJvZ3VzIG1lc3NhZ2UgcmVjZWl2ZWQiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBwYXJzZSBmZHMuIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmKG0pOworCisgIGlmICh3cml0ZSh4LCAiWCIsIDEpICE9IDEpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gd3JpdGUgdG8gcGlwZSAjMSIpOworICBpZiAod3JpdGUoeSwgIlkiLCAxKSAhPSAxKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHdyaXRlIHRvIHBpcGUgIzIiKTsKKyAgaWYgKHdyaXRlKHosICJaIiwgMSkgIT0gMSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byB3cml0ZSB0byBwaXBlICMyLzJuZCBmZCIpOworCisgIGlmICghX2RidXNfY2xvc2UoeCwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMxL290aGVyIHNpZGUgIik7CisgIGlmICghX2RidXNfY2xvc2UoeSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyL290aGVyIHNpZGUgIik7CisgIGlmICghX2RidXNfY2xvc2UoeiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyL290aGVyIHNpemUgMm5kIGZkICIpOworCisgIGlmIChyZWFkKG9uZVsxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWCcpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisgIGlmIChyZWFkKHR3b1sxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWScpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisgIGlmIChyZWFkKHR3b1sxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWicpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisKKyAgaWYgKCFfZGJ1c19jbG9zZV9zb2NrZXQgKG9uZVsxXSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMxICIpOworICBpZiAoIV9kYnVzX2Nsb3NlX3NvY2tldCAodHdvWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzIgIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGZvbyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgYmFyXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJhcik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Rpc3BhdGNoLmggYi9idXMvZGlzcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjViYTdhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpc3BhdGNoLmgKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXNwYXRjaC5oICBNZXNzYWdlIGRpc3BhdGNoZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0RJU1BBVENIX0gKKyNkZWZpbmUgQlVTX0RJU1BBVENIX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICBidXNfZGlzcGF0Y2hfcmVtb3ZlX2Nvbm5lY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19kaXNwYXRjaF9tYXRjaGVzICAgICAgICAgICAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19ESVNQQVRDSF9IICovCmRpZmYgLS1naXQgYS9idXMvZHJpdmVyLmMgYi9idXMvZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kcml2ZXIuYwpAQCAtMCwwICsxLDI3MzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZHJpdmVyLmMgIEJ1cyBjbGllbnQgKGRyaXZlcikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInN0YXRzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1hc3YtdXRpbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3R5cGVkZWYgZW51bQoreworICBCVVNfRFJJVkVSX0ZPVU5EX1NFTEYsCisgIEJVU19EUklWRVJfRk9VTkRfUEVFUiwKKyAgQlVTX0RSSVZFUl9GT1VORF9FUlJPUiwKK30gQnVzRHJpdmVyRm91bmQ7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICptYXliZV9udWxsLAorICAgICAgICAgY29uc3QgY2hhciAqaWZfbnVsbCkKK3sKKyAgcmV0dXJuIChtYXliZV9udWxsID8gbWF5YmVfbnVsbCA6IGlmX251bGwpOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgorYnVzX2RyaXZlcl9nZXRfb3duZXJfb2ZfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSkKK3sKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2OworICBEQnVzU3RyaW5nIHN0cjsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKworICBpZiAoc2VydiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2Vydik7Cit9CisKK3N0YXRpYyBCdXNEcml2ZXJGb3VuZAorYnVzX2RyaXZlcl9nZXRfY29ubl9oZWxwZXIgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICp3aGF0X3dlX3dhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKipuYW1lX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKipwZWVyX2Nvbm5fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICByZXR1cm4gQlVTX0RSSVZFUl9GT1VORF9FUlJPUjsKKworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisgIF9kYnVzX3ZlcmJvc2UgKCJhc2tlZCBmb3IgJXMgb2YgY29ubmVjdGlvbiAlc1xuIiwgd2hhdF93ZV93YW50LCBuYW1lKTsKKworICBpZiAobmFtZV9wICE9IE5VTEwpCisgICAgKm5hbWVfcCA9IG5hbWU7CisKKyAgaWYgKHN0cmNtcCAobmFtZSwgREJVU19TRVJWSUNFX0RCVVMpID09IDApCisgICAgcmV0dXJuIEJVU19EUklWRVJfRk9VTkRfU0VMRjsKKworICBjb25uID0gYnVzX2RyaXZlcl9nZXRfb3duZXJfb2ZfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSk7CisKKyAgaWYgKGNvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgJXMgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIHdoYXRfd2Vfd2FudCwgbmFtZSk7CisgICAgICByZXR1cm4gQlVTX0RSSVZFUl9GT1VORF9FUlJPUjsKKyAgICB9CisKKyAgaWYgKHBlZXJfY29ubl9wICE9IE5VTEwpCisgICAgKnBlZXJfY29ubl9wID0gY29ubjsKKworICByZXR1cm4gQlVTX0RSSVZFUl9GT1VORF9QRUVSOworfQorCisvKgorICogTG9nIGEgc2VjdXJpdHkgd2FybmluZyBhbmQgc2V0IGVycm9yIHVubGVzcyB0aGUgdWlkIG9mIHRoZSBjb25uZWN0aW9uCisgKiBpcyBlaXRoZXIgdGhlIHVpZCBvZiB0aGlzIHByb2Nlc3MsIG9yIG9uIFVuaXgsIHVpZCAwIChyb290KS4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGEgc2Vjb25kIGxpbmUgb2YgZGVmZW5jZSBhZnRlciA8ZGVueT4gcnVsZXMsCisgKiB0byBtaXRpZ2F0ZSBpbmNvcnJlY3Qgc3lzdGVtIGJ1cyBzZWN1cml0eSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlcworICogbGlrZSB0aGUgb25lcyBpbiBDVkUtMjAxNC04MTQ4IGFuZCBDVkUtMjAxNC04MTU2LCBhbmQgKGlmIHByZXNlbnQpCisgKiBMU00gcnVsZXM7IHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBwZXJmZWN0LCBidXQgYXMgbG9uZyBhcyB3ZSBoYXZlCisgKiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgZnVuY3Rpb25hbGl0eSBpbiB0aGUgc3lzdGVtIGJ1cywgaXQgZG9lcyBuZWVkCisgKiB0byBleGlzdC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2NoZWNrX2NhbGxlcl9pc19wcml2aWxlZ2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworI2lmZGVmIERCVVNfVU5JWAorICB1bnNpZ25lZCBsb25nIHVpZDsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uZWN0aW9uLCAmdWlkKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICptZXRob2QgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisKKyAgICAgIGJ1c19jb250ZXh0X2xvZ19hbmRfc2V0X2Vycm9yIChidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKSwKKyAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksIGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgInJlamVjdGVkIGF0dGVtcHQgdG8gY2FsbCAlcyBieSBjb25uZWN0aW9uICVzICglcykgd2l0aCAiCisgICAgICAgICAgInVua25vd24gdWlkIiwgbWV0aG9kLAorICAgICAgICAgIG5vbm51bGwgKGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwgIihpbmFjdGl2ZSkiKSwKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBJJ20gd3JpdGluZyBpdCBpbiB0aGlzIHNsaWdodGx5IHN0cmFuZ2UgZm9ybSBzbyB0aGF0IGl0J3MgbW9yZQorICAgKiBvYnZpb3VzIHRoYXQgdGhpcyBzZWN1cml0eS1zZW5zaXRpdmUgY29kZSBpcyBjb3JyZWN0LgorICAgKi8KKyAgaWYgKF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICh1aWQpKQorICAgIHsKKyAgICAgIC8qIE9LICovCisgICAgfQorICBlbHNlIGlmICh1aWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBPSyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAicmVqZWN0ZWQgYXR0ZW1wdCB0byBjYWxsICVzIGJ5IGNvbm5lY3Rpb24gJXMgKCVzKSB3aXRoICIKKyAgICAgICAgICAidWlkICVsdSIsIG1ldGhvZCwKKyAgICAgICAgICBub25udWxsIChidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksICIoaW5hY3RpdmUpIiksCisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKGNvbm5lY3Rpb24pLCB1aWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKyNlbGlmIGRlZmluZWQoREJVU19XSU4pCisgIGNoYXIgKndpbmRvd3Nfc2lkID0gTlVMTDsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoY29ubmVjdGlvbiwgJndpbmRvd3Nfc2lkKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICptZXRob2QgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisKKyAgICAgIGJ1c19jb250ZXh0X2xvZ19hbmRfc2V0X2Vycm9yIChidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKSwKKyAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksIGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgInJlamVjdGVkIGF0dGVtcHQgdG8gY2FsbCAlcyBieSB1bmtub3duIHVpZCIsIG1ldGhvZCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAod2luZG93c19zaWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAicmVqZWN0ZWQgYXR0ZW1wdCB0byBjYWxsICVzIGJ5IHVpZCAlcyIsIG1ldGhvZCwgd2luZG93c19zaWQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldCA9IFRSVUU7CitvdXQ6CisgIGRidXNfZnJlZSAod2luZG93c19zaWQpOworICByZXR1cm4gcmV0OworI2Vsc2UKKyAgLyogbWFrZSBzdXJlIHdlIGZhaWwgY2xvc2VkIGluIHRoZSBoeXBvdGhldGljYWwgY2FzZSB0aGF0IHdlIGFyZSBuZWl0aGVyCisgICAqIFVuaXggbm9yIFdpbmRvd3MgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAicGxlYXNlIHRlYWNoIGJ1cy9kcml2ZXIuYyBob3cgdWlkcyB3b3JrIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaGVsbG9fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgICAgICpvbGRfb3duZXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgICAgICpuZXdfb3duZXIsCisJCQkJICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpudWxsX3NlcnZpY2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbnVsbF9zZXJ2aWNlID0gIiI7CisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kaW5nIG5hbWUgb3duZXIgY2hhbmdlZDogJXMgWyVzIC0+ICVzXVxuIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICBvbGRfb3duZXIgPyBvbGRfb3duZXIgOiBudWxsX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgIG5ld19vd25lciA/IG5ld19vd25lciA6IG51bGxfc2VydmljZSk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgb2xkX293bmVyID8gJm9sZF9vd25lciA6ICZudWxsX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCBuZXdfb3duZXIgPyAmbmV3X293bmVyIDogJm51bGxfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCAic3NzIikpOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmUgKHRyYW5zYWN0aW9uLCBOVUxMLCBtZXNzYWdlKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR2YWwgPSBidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sIE5VTEwsIE5VTEwsIG1lc3NhZ2UsIGVycm9yKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworCisgb29tOgorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZUxvc3QiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUgKEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICpzdHIpCit7CisgIC8qIFdlIG5ldmVyIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHVuaXF1ZSBjbGllbnQgbmFtZSB0d2ljZSwgYmVjYXVzZQorICAgKiB3ZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0IGlmIHlvdSBzZW5kIGEgbWVzc2FnZSB0byBhIGdpdmVuIHVuaXF1ZQorICAgKiBuYW1lLCB5b3UgYWx3YXlzIGdldCB0aGUgc2FtZSBhcHBsaWNhdGlvbi4gU28gd2UgdXNlIHR3byBudW1iZXJzCisgICAqIGZvciBJTlRfTUFYICogSU5UX01BWCBjb21iaW5hdGlvbnMsIHNob3VsZCBiZSBwcmV0dHkgc2FmZSBhZ2FpbnN0CisgICAqIHdyYXBhcm91bmQuCisgICAqLworICAvKiBGSVhNRSB0aGVzZSBzaG91bGQgYmUgaW4gQnVzUmVnaXN0cnkgcmF0aGVyIHRoYW4gc3RhdGljIHZhcnMgKi8KKyAgc3RhdGljIGludCBuZXh0X21ham9yX251bWJlciA9IDA7CisgIHN0YXRpYyBpbnQgbmV4dF9taW5vcl9udW1iZXIgPSAwOworICBpbnQgbGVuOworCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIC8qIHN0YXJ0IG91dCB3aXRoIDEtMCwgZ28gdG8gMS0xLCAxLTIsIDEtMywKKyAgICAgICAqIHVwIHRvIDEtTUFYSU5ULCB0aGVuIDItMCwgMi0xLCBldGMuCisgICAgICAgKi8KKyAgICAgIGlmIChuZXh0X21pbm9yX251bWJlciA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgbmV4dF9tYWpvcl9udW1iZXIgKz0gMTsKKyAgICAgICAgICBuZXh0X21pbm9yX251bWJlciA9IDA7CisgICAgICAgICAgaWYgKG5leHRfbWFqb3JfbnVtYmVyIDw9IDApCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJJTlRfTUFYICogSU5UX01BWCBjbGllbnRzIHdlcmUgYWRkZWQiKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKG5leHRfbWFqb3JfbnVtYmVyID4gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG5leHRfbWlub3JfbnVtYmVyID49IDApOworCisgICAgICAvKiBhcHBuYW1lOk1BSk9SLU1JTk9SICovCisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCAiOiIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKHN0ciwgbmV4dF9tYWpvcl9udW1iZXIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCAiLiIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKHN0ciwgbmV4dF9taW5vcl9udW1iZXIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIG5leHRfbWlub3JfbnVtYmVyICs9IDE7CisKKyAgICAgIC8qIENoZWNrIGlmIGEgY2xpZW50IHdpdGggdGhlIG5hbWUgZXhpc3RzICovCisgICAgICBpZiAoYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksIHN0cikgPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgLyogZHJvcCB0aGUgbnVtYmVyIGFnYWluLCB0cnkgdGhlIG5leHQgb25lLiAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgbGVuKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgdW5pcXVlX25hbWU7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgLyogV2UgYWxyZWFkeSBoYW5kbGVkIGFuIEhlbGxvIG1lc3NhZ2UgZm9yIHRoaXMgY29ubmVjdGlvbi4gKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkFscmVhZHkgaGFuZGxlZCBhbiBIZWxsbyBtZXNzYWdlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB3aGVuIHRoZXNlIGxpbWl0cyBhcmUgZXhjZWVkZWQgd2UgZG9uJ3QgZGlzY29ubmVjdCB0aGUKKyAgICogY29ubmVjdGlvbjsgd2UganVzdCBzb3J0IG9mIGxlYXZlIGl0IGhhbmdpbmcgdGhlcmUgdW50aWwgaXQgdGltZXMKKyAgICogb3V0IG9yIGRpc2Nvbm5lY3RzIGl0c2VsZiBvciBpcyBkcm9wcGVkIGR1ZSB0byB0aGUgbWF4IG51bWJlciBvZgorICAgKiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zLiBJdCdzIGV2ZW4gT0sgaWYgdGhlIGNvbm5lY3Rpb24gd2FudHMgdG8KKyAgICogcmV0cnkgdGhlIGhlbGxvIG1lc3NhZ2UsIHdlIHN1cHBvcnQgdGhhdC4KKyAgICovCisgIGNvbm5lY3Rpb25zID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29ubmVjdGlvbnNfY2hlY2tfbGltaXRzIChjb25uZWN0aW9ucywgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUgKHJlZ2lzdHJ5LCAmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2NvbXBsZXRlIChjb25uZWN0aW9uLCAmdW5pcXVlX25hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXRfMDsKKworICAvKiBDcmVhdGUgdGhlIHNlcnZpY2UgKi8KKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9lbnN1cmUgKHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZV9uYW1lLCBjb25uZWN0aW9uLCAwLCB0cmFuc2FjdGlvbiwgZXJyb3IpOworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0XzA7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVuaXF1ZV9uYW1lKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpoZWxsb19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqd2VsY29tZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBuYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgd2VsY29tZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoaGVsbG9fbWVzc2FnZSk7CisgIGlmICh3ZWxjb21lID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHdlbGNvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHdlbGNvbWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAod2VsY29tZSwgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcpKTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgd2VsY29tZSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGludCBsZW47CisgIGNoYXIgKipzZXJ2aWNlczsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzdWI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAocmVnaXN0cnksICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICB7CisgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKyAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZXNbaV0pKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZzdWIpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBpbnQgbGVuOworICBjaGFyICoqc2VydmljZXM7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGludCBpOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHN1YjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzIChhY3RpdmF0aW9uLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKwkJCQkJIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorCQkJCQkgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisJCQkJCSAmdl9TVFJJTkcpKQorICAgICAgeworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKwlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwlCVVNfU0VUX09PTSAoZXJyb3IpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKwkJCQkJICAgJnNlcnZpY2VzW2ldKSkKKwl7CisJICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwkgIEJVU19TRVRfT09NIChlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmc3ViKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX3VpbnQzMl90IGZsYWdzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gb3duIG5hbWUgJXMgd2l0aCBmbGFncyAweCV4XG4iLCBuYW1lLCBmbGFncyk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIHJlcGx5ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlIChyZWdpc3RyeSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9uYW1lLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9yZXBseSwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9VSU5UMzIsICZzZXJ2aWNlX3JlcGx5LCBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3JlbGVhc2Vfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gcmVsZWFzZSBuYW1lICVzXG4iLCBuYW1lKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgcmVwbHkgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9uYW1lLCBuYW1lKTsKKworICBpZiAoIWJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKHJlZ2lzdHJ5LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX25hbWUsICZzZXJ2aWNlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwgREJVU19UWVBFX1VJTlQzMiwgJnNlcnZpY2VfcmVwbHksIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlX25hbWU7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGRidXNfYm9vbF90IHNlcnZpY2VfZXhpc3RzOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChzdHJjbXAgKG5hbWUsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKQorICAgIHsKKyAgICAgIHNlcnZpY2VfZXhpc3RzID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX25hbWUpOworICAgICAgc2VydmljZV9leGlzdHMgPSBzZXJ2aWNlICE9IE5VTEw7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQk9PTEVBTiwgJnNlcnZpY2VfZXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIFN0YXJ0U2VydmljZUJ5TmFtZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG5hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2Fja19yZXBseSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFNlbmQgYSBtZXNzYWdlIGZyb20gdGhlIGRyaXZlciwgYWN0aXZhdGluZyB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5LgorICogVGhlIG1lc3NhZ2UgbXVzdCBhbHJlYWR5IGhhdmUgYSBkZXN0aW5hdGlvbiBzZXQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9zZW5kX29yX2FjdGl2YXRlIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZTsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlX3N0cmluZzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBzZXJ2aWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKTsKKworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2VfbmFtZSAhPSBOVUxMKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2Vfc3RyaW5nLCBzZXJ2aWNlX25hbWUpOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKworICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAoYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5IChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX3N0cmluZyk7CisKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBkZXN0aW5hdGlvbiBpc24ndCBjb25uZWN0ZWQgeWV0OyBwYXNzIHRoZSBtZXNzYWdlIHRvIGFjdGl2YXRpb24gKi8KKyAgICAgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisKKyAgICAgIGFjdGl2YXRpb24gPSBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAoY29udGV4dCk7CisKKyAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmUgKHRyYW5zYWN0aW9uLCBOVUxMLCBtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSBmb3IgYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmUoKSIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKGFjdGl2YXRpb24sIE5VTEwsIHRyYW5zYWN0aW9uLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBzZXJ2aWNlX25hbWUsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZCIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpzZXJ2aWNlX2Nvbm47CisKKyAgICAgIHNlcnZpY2VfY29ubiA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKTsKKworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIHNlcnZpY2VfY29ubiwgbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgZm9yIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyKCkiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfdXBkYXRlX2FjdGl2YXRpb25fZW52aXJvbm1lbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBkaWN0X2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBkaWN0X2VudHJ5X2l0ZXI7CisgIGludCBhcnJheV90eXBlOworICBpbnQga2V5X3R5cGU7CisgIERCdXNMaXN0ICprZXlzLCAqa2V5X2xpbms7CisgIERCdXNMaXN0ICp2YWx1ZXMsICp2YWx1ZV9saW5rOworICBEQnVzTWVzc2FnZSAqc3lzdGVtZF9tZXNzYWdlOworICBEQnVzTWVzc2FnZUl0ZXIgc3lzdGVtZF9pdGVyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghYnVzX2RyaXZlcl9jaGVja19tZXNzYWdlX2lzX2Zvcl91cyAobWVzc2FnZSwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERCVVNfVU5JWAorICAgIHsKKyAgICAgIC8qIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCBpcyBiYXNpY2FsbHkgYSByZWNpcGUgZm9yIHByaXZpbGVnZQorICAgICAgICogZXNjYWxhdGlvbiBzbyBsZXQncyBiZSBleHRyYS1jYXJlZnVsOiBkbyBub3QgYWxsb3cgdGhlIHN5c2FkbWluCisgICAgICAgKiB0byBzaG9vdCB0aGVtc2VsdmVzIGluIHRoZSBmb290LgorICAgICAgICovCisgICAgICBpZiAoIWJ1c19kcml2ZXJfY2hlY2tfY2FsbGVyX2lzX3ByaXZpbGVnZWQgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoY29udGV4dCkgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSBhY3RpdmF0aW9uIGVudmlyb25tZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAib24gYSBzeXN0ZW0gYnVzLiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICAvKiBUaGUgbWVzc2FnZSBzaWduYXR1cmUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciB1cywKKyAgICogc28gbGV0J3MganVzdCBhc3NlcnQgaXQncyByaWdodC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmRpY3RfaXRlcik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIHN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisKKyAgLyogVGhlbiBsb29wIHRocm91Z2ggdGhlIHNlbnQgZGljdGlvbmFyeSwgYWRkIHRoZSBsb2NhdGlvbiBvZgorICAgKiB0aGUgZW52aXJvbm1lbnQga2V5cyBhbmQgdmFsdWVzIHRvIGxpc3RzLiBUaGUgcmVzdWx0IHdpbGwKKyAgICogYmUgaW4gcmV2ZXJzZSBvcmRlciwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zdGFudGx5IHNlYXJjaAorICAgKiBmb3IgdGhlIGVuZCBvZiB0aGUgbGlzdCBpbiBhIGxvb3AuCisgICAqLworICBrZXlzID0gTlVMTDsKKyAgdmFsdWVzID0gTlVMTDsKKyAgd2hpbGUgKChhcnJheV90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmZGljdF9pdGVyKSkgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmRpY3RfaXRlciwgJmRpY3RfZW50cnlfaXRlcik7CisKKyAgICAgIHdoaWxlICgoa2V5X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2VudHJ5X2l0ZXIpKSA9PSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqa2V5OworICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgIGludCB2YWx1ZV90eXBlOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmZGljdF9lbnRyeV9pdGVyLCAma2V5KTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmZGljdF9lbnRyeV9pdGVyKTsKKworICAgICAgICAgIHZhbHVlX3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2VudHJ5X2l0ZXIpOworCisgICAgICAgICAgaWYgKHZhbHVlX3R5cGUgIT0gREJVU19UWVBFX1NUUklORykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmZGljdF9lbnRyeV9pdGVyLCAmdmFsdWUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmtleXMsIGtleSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnZhbHVlcywgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2VudHJ5X2l0ZXIpOworICAgICAgICB9CisKKyAgICAgIGlmIChrZXlfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2l0ZXIpOworICAgIH0KKworICBpZiAoYXJyYXlfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmtleXMpID09IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnZhbHVlcykpOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIC8qIFByZXBhcmUgYSBjYWxsIHRvIGZvcndhcmQgZW52aXJvbm1lbnQgdXBkYXRlcyB0byBzeXN0ZW1kICovCisgICAgICBzeXN0ZW1kX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuTWFuYWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0RW52aXJvbm1lbnQiKTsKKyAgICAgIGlmIChzeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCB8fAorICAgICAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAoc3lzdGVtZF9tZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIHN5c3RlbWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAoc3lzdGVtZF9tZXNzYWdlLCBUUlVFKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChzeXN0ZW1kX21lc3NhZ2UsICZpdGVyKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5c3RlbWRfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gb3BlbiBzeXN0ZW1kIG1lc3NhZ2UgY29udGFpbmVyXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBrZXlfbGluayA9IGtleXM7CisgIHZhbHVlX2xpbmsgPSB2YWx1ZXM7CisgIHdoaWxlIChrZXlfbGluayAhPSBOVUxMKQorICB7CisgICAgICBjb25zdCBjaGFyICprZXk7CisgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKworICAgICAga2V5ID0ga2V5X2xpbmstPmRhdGE7CisgICAgICB2YWx1ZSA9IHZhbHVlX2xpbmstPmRhdGE7CisKKyAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3lzdGVtZF9tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGVudmxpbmU7CisgICAgICAgICAgY29uc3QgY2hhciAqczsKKworICAgICAgICAgIC8qIFNldEVudmlyb25tZW50IHdhbnRzIGFuIGFycmF5IG9mIEtFWT1WQUxVRSBzdHJpbmdzICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudmxpbmUpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmVudmxpbmUsICIlcz0lcyIsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGZvcm1hdCBzeXN0ZW1kIGVudmlyb25tZW50IGxpbmVcbiIpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudmxpbmUpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZlbnZsaW5lKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3lzdGVtZF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gYXBwZW5kIHN5c3RlbWQgZW52aXJvbm1lbnQgbGluZVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW52bGluZSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnZsaW5lKTsKKyAgICAgICAgfQorCisgICAgICBrZXlfbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmtleXMsIGtleV9saW5rKTsKKyAgICAgIHZhbHVlX2xpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ2YWx1ZXMsIHZhbHVlX2xpbmspOworICB9CisKKyAgLyogRklYTUU6IFdlIGNhbiBmYWlsIGVhcmx5IGhhdmluZyBzZXQgb25seSBzb21lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCisgICAqIChiZWNhdXNlIG9mIE9PTSBmYWlsdXJlKS4gIEl0J3Mgc29ydCBvZiBoYXJkIHRvIGZpeCBhbmQgaXQgZG9lc24ndCByZWFsbHkKKyAgICogbWF0dGVyLCBzbyB3ZSdyZSBwdW50aW5nIGZvciBub3cuCisgICAqLworICBpZiAoa2V5X2xpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3lzdGVtZF9tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnN5c3RlbWRfaXRlcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN5c3RlbWRfbWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJnN5c3RlbWRfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY2xvc2Ugc3lzdGVtZCBtZXNzYWdlIGNvbnRhaW5lclxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfb3JfYWN0aXZhdGUgKHRyYW5zYWN0aW9uLCBzeXN0ZW1kX21lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2RyaXZlcl9zZW5kX29yX2FjdGl2YXRlKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIXNlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChzeXN0ZW1kX21lc3NhZ2UgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHN5c3RlbWRfbWVzc2FnZSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZrZXlzKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJnZhbHVlcyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIGNvbnN0IGNoYXIgKnRleHQsICpidXN0eXBlOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICB0ZXh0ID0gTlVMTDsKKyAgcnVsZSA9IE5VTEw7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChjb25uZWN0aW9uKSA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBtb3JlIG1hdGNoIHJ1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIEFkZE1hdGNoXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX3BhcnNlIChjb25uZWN0aW9uLCAmc3RyLCBlcnJvcik7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworICBidXN0eXBlID0gY29udGV4dCA/IGJ1c19jb250ZXh0X2dldF90eXBlIChjb250ZXh0KSA6IE5VTEw7CisgIGlmIChidXNfbWF0Y2hfcnVsZV9nZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKHJ1bGUpICYmCisgICAgICAhYnVzX2FwcGFybW9yX2FsbG93c19lYXZlc2Ryb3BwaW5nIChjb25uZWN0aW9uLCBidXN0eXBlLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgbWF0Y2htYWtlciA9IGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyIChjb25uZWN0aW9uKTsKKworICBpZiAoIWJ1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChtYXRjaG1ha2VyLCBydWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghc2VuZF9hY2tfcmVwbHkgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgKG1hdGNobWFrZXIsIHJ1bGUpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgdGV4dCA9IE5VTEw7CisgIHJ1bGUgPSBOVUxMOworCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gZ2V0IGFyZ3VtZW50cyB0byBSZW1vdmVNYXRjaFxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHRleHQpOworCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoY29ubmVjdGlvbiwgJnN0ciwgZXJyb3IpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIFNlbmQgdGhlIGFjayBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBydWxlLCBzaW5jZSB0aGUgYWNrIGlzIHVuZG9uZQorICAgKiBvbiB0cmFuc2FjdGlvbiBjYW5jZWwsIGJ1dCBydWxlIHJlbW92YWwgaXNuJ3QuCisgICAqLworICBpZiAoIXNlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIG1hdGNobWFrZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbWF0Y2htYWtlciAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAobWF0Y2htYWtlciwgcnVsZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgY29uc3QgY2hhciAqYmFzZV9uYW1lOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHRleHQgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIC8qIE9SR19GUkVFREVTS1RPUF9EQlVTIG93bnMgaXRzZWxmICovCisgICAgICBiYXNlX25hbWUgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lciBvZiBuYW1lICclcyc6IG5vIHN1Y2ggbmFtZSIsIHRleHQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZV9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSk7CisgICAgICBpZiAoYmFzZV9uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGhvdyBpcyB0aGlzIGVycm9yIHBvc3NpYmxlPyAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHVuaXF1ZSBuYW1lIGZvciAnJXMnIiwgdGV4dCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2Fzc2VydCAoKmJhc2VfbmFtZSA9PSAnOicpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJhc2VfbmFtZSAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9uYW1lLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c0xpc3QgKmJhc2VfbmFtZXM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheV9pdGVyOworICBjaGFyICpkYnVzX3NlcnZpY2VfbmFtZSA9IERCVVNfU0VSVklDRV9EQlVTOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBiYXNlX25hbWVzID0gTlVMTDsKKyAgdGV4dCA9IE5VTEw7CisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCAmJgorICAgICAgX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgLyogT1JHX0ZSRUVERVNLVE9QX0RCVVMgb3ducyBpdHNlbGYgKi8KKyAgICAgIGlmICghIF9kYnVzX2xpc3RfYXBwZW5kICgmYmFzZV9uYW1lcywgZGJ1c19zZXJ2aWNlX25hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lcnMgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCB0ZXh0KTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzIChzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYmFzZV9uYW1lcyAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmYmFzZV9uYW1lcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciAqdW5hbWU7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSAhPSBOVUxMKTsKKyAgICAgIHVuYW1lID0gKGNoYXIgKilsaW5rLT5kYXRhOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmJhc2VfbmFtZXMsIGxpbmspOworICAgIH0KKworICBpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmYXJyYXlfaXRlcikpCisgICAgZ290byBvb207CisKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgaWYgKGJhc2VfbmFtZXMpCisgICAgX2RidXNfbGlzdF9jbGVhciAoJmJhc2VfbmFtZXMpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGRidXNfdWlkX3QgdWlkOworICBkYnVzX3VpbnQzMl90IHVpZDMyOworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBCdXNEcml2ZXJGb3VuZCBmb3VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgZm91bmQgPSBidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIlVJRCIsICZzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubiwgZXJyb3IpOworICBzd2l0Y2ggKGZvdW5kKQorICAgIHsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9TRUxGOgorICAgICAgICB1aWQgPSBfZGJ1c19nZXR1aWQgKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVI6CisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm4sICZ1aWQpKQorICAgICAgICAgIHVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9FUlJPUjoKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICh1aWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIFVJRCBmb3IgJyVzJyIsIHNlcnZpY2UpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgdWlkMzIgPSB1aWQ7CisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnVpZDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCQkgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkJICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGRidXNfcGlkX3QgcGlkOworICBkYnVzX3VpbnQzMl90IHBpZDMyOworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBCdXNEcml2ZXJGb3VuZCBmb3VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgZm91bmQgPSBidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIlBJRCIsICZzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubiwgZXJyb3IpOworICBzd2l0Y2ggKGZvdW5kKQorICAgIHsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9TRUxGOgorICAgICAgICBwaWQgPSBfZGJ1c19nZXRwaWQgKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVI6CisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm4sICZwaWQpKQorICAgICAgICAgIHBpZCA9IERCVVNfUElEX1VOU0VUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9FUlJPUjoKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChwaWQgPT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgUElEIGZvciAnJXMnIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBwaWQzMiA9IHBpZDsKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcGlkMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICB2b2lkICpkYXRhID0gTlVMTDsKKyAgZGJ1c191aW50MzJfdCBkYXRhX3NpemU7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIEJ1c0RyaXZlckZvdW5kIGZvdW5kOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBmb3VuZCA9IGJ1c19kcml2ZXJfZ2V0X2Nvbm5faGVscGVyIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiYXVkaXQgc2Vzc2lvbiBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2UsICZjb25uLCBlcnJvcik7CisKKyAgaWYgKGZvdW5kID09IEJVU19EUklWRVJfRk9VTkRfRVJST1IpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICAvKiBXZSBkb24ndCBrbm93IGhvdyB0byBmaW5kICJBRFQgYXVkaXQgc2Vzc2lvbiBkYXRhIiBmb3IgdGhlIGJ1cyBkYWVtb24KKyAgICogaXRzZWxmLiBJcyB0aGF0IGV2ZW4gbWVhbmluZ2Z1bD8KKyAgICogRklYTUU6IEltcGxlbWVudCB0aGlzIG9yIGJyaWVmbHkgbm90ZSBpdCBtYWtlcyBubyBzZW5zZS4KKyAgICovCisgIGlmIChmb3VuZCAhPSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVIgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKGNvbm4sICZkYXRhLCAmZGF0YV9zaXplKSB8fAorICAgICAgZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0FEVF9BVURJVF9EQVRBX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYXVkaXQgc2Vzc2lvbiBkYXRhIGZvciAnJXMnIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9CWVRFLCAmZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJCSAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkJCQkgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIEJ1c1NFTGludXhJRCAqY29udGV4dDsKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgQnVzRHJpdmVyRm91bmQgZm91bmQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGZvdW5kID0gYnVzX2RyaXZlcl9nZXRfY29ubl9oZWxwZXIgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJzZWN1cml0eSBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2UsICZjb25uLCBlcnJvcik7CisKKyAgaWYgKGZvdW5kID09IEJVU19EUklWRVJfRk9VTkRfRVJST1IpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICAvKiBGSVhNRTogT2J0YWluIHRoZSBTRUxpbnV4IHNlY3VyaXR5IGNvbnRleHQgZm9yIHRoZSBidXMgZGFlbW9uIGl0c2VsZiAqLworICBpZiAoZm91bmQgPT0gQlVTX0RSSVZFUl9GT1VORF9QRUVSKQorICAgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoY29ubik7CisgIGVsc2UKKyAgICBjb250ZXh0ID0gTlVMTDsKKworICBpZiAoIWNvbnRleHQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VMSU5VWF9TRUNVUklUWV9DT05URVhUX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgc2VjdXJpdHkgY29udGV4dCBmb3IgJyVzJyIsIHNlcnZpY2UpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghIGJ1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0IChyZXBseSwgY29udGV4dCwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX2NyZWRlbnRpYWxzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgcmVwbHlfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFycmF5X2l0ZXI7CisgIHVuc2lnbmVkIGxvbmcgdWxvbmdfdWlkLCB1bG9uZ19waWQ7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIEJ1c0RyaXZlckZvdW5kIGZvdW5kOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBmb3VuZCA9IGJ1c19kcml2ZXJfZ2V0X2Nvbm5faGVscGVyIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiY3JlZGVudGlhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZSwgJmNvbm4sIGVycm9yKTsKKworICBzd2l0Y2ggKGZvdW5kKQorICAgIHsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9TRUxGOgorICAgICAgICB1bG9uZ19waWQgPSBfZGJ1c19nZXRwaWQgKCk7CisgICAgICAgIHVsb25nX3VpZCA9IF9kYnVzX2dldHVpZCAoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9QRUVSOgorICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uLCAmdWxvbmdfcGlkKSkKKyAgICAgICAgICB1bG9uZ19waWQgPSBEQlVTX1BJRF9VTlNFVDsKKyAgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubiwgJnVsb25nX3VpZCkpCisgICAgICAgICAgdWxvbmdfdWlkID0gREJVU19VSURfVU5TRVQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SOgorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVwbHkgPSBfZGJ1c19hc3ZfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UsICZyZXBseV9pdGVyLCAmYXJyYXlfaXRlcik7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIC8qIHdlIGNhbid0IHJlcHJlc2VudCA+IDMyLWJpdCBwaWRzOyBpZiB5b3VyIHN5c3RlbSBuZWVkcyB0aGVtLCBwbGVhc2UKKyAgICogYWRkIFByb2Nlc3NJRDY0IHRvIHRoZSBzcGVjIG9yIHNvbWV0aGluZyAqLworICBpZiAodWxvbmdfcGlkIDw9IF9EQlVTX1VJTlQzMl9NQVggJiYgdWxvbmdfcGlkICE9IERCVVNfUElEX1VOU0VUICYmCisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJheV9pdGVyLCAiUHJvY2Vzc0lEIiwgdWxvbmdfcGlkKSkKKyAgICBnb3RvIG9vbTsKKworICAvKiB3ZSBjYW4ndCByZXByZXNlbnQgPiAzMi1iaXQgdWlkczsgaWYgeW91ciBzeXN0ZW0gbmVlZHMgdGhlbSwgcGxlYXNlCisgICAqIGFkZCBVbml4VXNlcklENjQgdG8gdGhlIHNwZWMgb3Igc29tZXRoaW5nICovCisgIGlmICh1bG9uZ191aWQgPD0gX0RCVVNfVUlOVDMyX01BWCAmJiB1bG9uZ191aWQgIT0gREJVU19VSURfVU5TRVQgJiYKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycmF5X2l0ZXIsICJVbml4VXNlcklEIiwgdWxvbmdfdWlkKSkKKyAgICBnb3RvIG9vbTsKKworICAvKiBGSVhNRTogT2J0YWluIHRoZSBXaW5kb3dzIHVzZXIgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmICovCisgIGlmIChmb3VuZCA9PSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVIgJiYKKyAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChjb25uLCAmcykpCisgICAgeworICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcyk7CisgICAgICByZXN1bHQgPSBfZGJ1c192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfYXN2X2FkZF9zdHJpbmcgKCZhcnJheV9pdGVyLCAiV2luZG93c1NJRCIsIHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICB9CisKKyAgLyogRklYTUU6IE9idGFpbiB0aGUgc2VjdXJpdHkgbGFiZWwgZm9yIHRoZSBidXMgZGFlbW9uIGl0c2VsZiAqLworICBpZiAoZm91bmQgPT0gQlVTX0RSSVZFUl9GT1VORF9QRUVSICYmCisgICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoY29ubiwgJnMpKQorICAgIHsKKyAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICAvKiB1c2UgdGhlIEdWYXJpYW50IGJ5dGVzdHJpbmcgY29udmVudGlvbiBmb3Igc3RyaW5ncyBvZiB1bmtub3duCisgICAgICAgKiBlbmNvZGluZzogaW5jbHVkZSB0aGUgXDAgaW4gdGhlIHBheWxvYWQsIGZvciB6ZXJvLWNvcHkgcmVhZGluZyAqLworICAgICAgaWYgKCFfZGJ1c19hc3ZfYWRkX2J5dGVfYXJyYXkgKCZhcnJheV9pdGVyLCAiTGludXhTZWN1cml0eUxhYmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzdHJsZW4gKHMpICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgfQorCisgIGlmICghX2RidXNfYXN2X2Nsb3NlICgmcmVwbHlfaXRlciwgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIC8qIHRoaXMgdGltZSB3ZSBkb24ndCB3YW50IHRvIGNsb3NlIHRoZSBpdGVyYXRvciBhZ2Fpbiwgc28ganVzdAorICAgICAgICogZ2V0IHJpZCBvZiB0aGUgbWVzc2FnZSAqLworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXBseSA9IE5VTEw7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBpZiAocmVwbHkpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb24gKCZyZXBseV9pdGVyLCAmYXJyYXlfaXRlcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3JlbG9hZF9jb25maWcgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChjb250ZXh0LCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZW5hYmxlX3ZlcmJvc2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgZ290byBvb207CisKKyAgICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICAgIGdvdG8gb29tOworCisgICAgX2RidXNfc2V0X3ZlcmJvc2UoVFJVRSk7CisKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICByZXR1cm4gVFJVRTsKKworICAgb29tOgorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworICAgIGlmIChyZXBseSkKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9kaXNhYmxlX3ZlcmJvc2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgZ290byBvb207CisKKyAgICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICAgIGdvdG8gb29tOworCisgICAgX2RidXNfc2V0X3ZlcmJvc2UoRkFMU0UpOworCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgcmV0dXJuIFRSVUU7CisKKyAgIG9vbToKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyAgICBpZiAocmVwbHkpCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1N0cmluZyB1dWlkOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIGlmICghYnVzX2NvbnRleHRfZ2V0X2lkIChjb250ZXh0LCAmdXVpZCkpCisgICAgZ290byBvb207CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnV1aWQpOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAocmVwbHksICJzIikpOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9iZWNvbWVfbW9uaXRvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY2hhciAqKm1hdGNoX3J1bGVzID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYnVzdHlwZTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBEQnVzTGlzdCAqcnVsZXMgPSBOVUxMOworICBEQnVzTGlzdCAqaXRlcjsKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBpOworICBpbnQgbl9tYXRjaF9ydWxlczsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFidXNfZHJpdmVyX2NoZWNrX21lc3NhZ2VfaXNfZm9yX3VzIChtZXNzYWdlLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworICBidXN0eXBlID0gY29udGV4dCA/IGJ1c19jb250ZXh0X2dldF90eXBlIChjb250ZXh0KSA6IE5VTEw7CisgIGlmICghYnVzX2FwcGFybW9yX2FsbG93c19lYXZlc2Ryb3BwaW5nIChjb25uZWN0aW9uLCBidXN0eXBlLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFidXNfZHJpdmVyX2NoZWNrX2NhbGxlcl9pc19wcml2aWxlZ2VkIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsICZtYXRjaF9ydWxlcywgJm5fbWF0Y2hfcnVsZXMsCisgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChmbGFncyAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgIkJlY29tZU1vbml0b3IgZG9lcyBub3Qgc3VwcG9ydCBhbnkgZmxhZ3MgeWV0Iik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogU3BlY2lhbCBjYXNlOiBhIHplcm8tbGVuZ3RoIGFycmF5IGJlY29tZXMgWyIiXSAqLworICBpZiAobl9tYXRjaF9ydWxlcyA9PSAwKQorICAgIHsKKyAgICAgIG1hdGNoX3J1bGVzID0gZGJ1c19tYWxsb2MgKDIgKiBzaXplb2YgKGNoYXIgKikpOworCisgICAgICBpZiAobWF0Y2hfcnVsZXMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWF0Y2hfcnVsZXNbMF0gPSBfZGJ1c19zdHJkdXAgKCIiKTsKKworICAgICAgaWYgKG1hdGNoX3J1bGVzWzBdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1hdGNoX3J1bGVzWzFdID0gTlVMTDsKKyAgICAgIG5fbWF0Y2hfcnVsZXMgPSAxOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbl9tYXRjaF9ydWxlczsgaSsrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBtYXRjaF9ydWxlc1tpXSk7CisgICAgICBydWxlID0gYnVzX21hdGNoX3J1bGVfcGFyc2UgKGNvbm5lY3Rpb24sICZzdHIsIGVycm9yKTsKKworICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIG1vbml0b3JzIGFsd2F5cyBlYXZlc2Ryb3AgKi8KKyAgICAgIGJ1c19tYXRjaF9ydWxlX3NldF9jbGllbnRfaXNfZWF2ZXNkcm9wcGluZyAocnVsZSwgVFJVRSk7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZydWxlcywgcnVsZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBTZW5kIHRoZSBhY2sgYmVmb3JlIHdlIHJlbW92ZSB0aGUgcnVsZSwgc2luY2UgdGhlIGFjayBpcyB1bmRvbmUKKyAgICogb24gdHJhbnNhY3Rpb24gY2FuY2VsLCBidXQgYmVjb21pbmcgYSBtb25pdG9yIGlzbid0LgorICAgKi8KKyAgaWYgKCFzZW5kX2Fja19yZXBseSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2JlX21vbml0b3IgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCAmcnVsZXMsIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICByZXQgPSBUUlVFOworCitvdXQ6CisgIGlmIChyZXQpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgZm9yIChpdGVyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJ1bGVzKTsKKyAgICAgIGl0ZXIgIT0gTlVMTDsKKyAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZydWxlcywgaXRlcikpCisgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKGl0ZXItPmRhdGEpOworCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZydWxlcyk7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAobWF0Y2hfcnVsZXMpOworICByZXR1cm4gcmV0OworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICppbl9hcmdzOworICBjb25zdCBjaGFyICpvdXRfYXJnczsKKyAgZGJ1c19ib29sX3QgKCogaGFuZGxlcikgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworfSBNZXNzYWdlSGFuZGxlcjsKKworLyogRm9yIHNwZWVkIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzb3J0IHRoaXMgaW4gb3JkZXIgb2YKKyAqIGZyZXF1ZW5jeSBvZiB1c2UgKGJ1dCBkb2Vzbid0IG1hdHRlciB3aXRoIG9ubHkgYSBmZXcgaXRlbXMKKyAqIGFueWhvdykKKyAqLworc3RhdGljIGNvbnN0IE1lc3NhZ2VIYW5kbGVyIGRidXNfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJIZWxsbyIsCisgICAgIiIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8gfSwKKyAgeyAiUmVxdWVzdE5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSB9LAorICB7ICJSZWxlYXNlTmFtZSIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfcmVsZWFzZV9zZXJ2aWNlIH0sCisgIHsgIlN0YXJ0U2VydmljZUJ5TmFtZSIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSB9LAorICB7ICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfdXBkYXRlX2FjdGl2YXRpb25fZW52aXJvbm1lbnQgfSwKKyAgeyAiTmFtZUhhc093bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMgfSwKKyAgeyAiTGlzdE5hbWVzIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMgfSwKKyAgeyAiTGlzdEFjdGl2YXRhYmxlTmFtZXMiLAorICAgICIiLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcyB9LAorICB7ICJBZGRNYXRjaCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoIH0sCisgIHsgIlJlbW92ZU1hdGNoIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2ggfSwKKyAgeyAiR2V0TmFtZU93bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciB9LAorICB7ICJMaXN0UXVldWVkT3duZXJzIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkIH0sCisgIHsgIkdldEFkdEF1ZGl0U2Vzc2lvbkRhdGEiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIH0sCisgIHsgIkdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0IiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQgfSwKKyAgeyAiUmVsb2FkQ29uZmlnIiwKKyAgICAiIiwKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnIH0sCisgIHsgIkdldElkIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQgfSwKKyAgeyAiR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIiwgInMiLCAiYXtzdn0iLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX2NyZWRlbnRpYWxzIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCAoREJ1c0Nvbm5lY3Rpb24gKiwKKyAgICBCdXNUcmFuc2FjdGlvbiAqLCBEQnVzTWVzc2FnZSAqLCBEQnVzRXJyb3IgKik7CisKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciBpbnRyb3NwZWN0YWJsZV9tZXNzYWdlX2hhbmRsZXJzW10gPSB7CisgIHsgIkludHJvc3BlY3QiLCAiIiwgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsIGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciBtb25pdG9yaW5nX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiQmVjb21lTW9uaXRvciIsICJhc3UiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfYmVjb21lX21vbml0b3IgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciB2ZXJib3NlX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiRW5hYmxlVmVyYm9zZSIsICIiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfZW5hYmxlX3ZlcmJvc2V9LAorICB7ICJEaXNhYmxlVmVyYm9zZSIsICIiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfZGlzYWJsZV92ZXJib3NlfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitzdGF0aWMgY29uc3QgTWVzc2FnZUhhbmRsZXIgc3RhdHNfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJHZXRTdGF0cyIsICIiLCAiYXtzdn0iLCBidXNfc3RhdHNfaGFuZGxlX2dldF9zdGF0cyB9LAorICB7ICJHZXRDb25uZWN0aW9uU3RhdHMiLCAicyIsICJhe3N2fSIsIGJ1c19zdGF0c19oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fc3RhdHMgfSwKKyAgeyAiR2V0QWxsTWF0Y2hSdWxlcyIsICIiLCAiYXtzYXN9IiwgYnVzX3N0YXRzX2hhbmRsZV9nZXRfYWxsX21hdGNoX3J1bGVzIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgTWVzc2FnZUhhbmRsZXIgKm1lc3NhZ2VfaGFuZGxlcnM7CisgIGNvbnN0IGNoYXIgKmV4dHJhX2ludHJvc3BlY3Rpb247Cit9IEludGVyZmFjZUhhbmRsZXI7CisKKy8qIFRoZXNlIHNob3VsZCBpZGVhbGx5IGJlIHNvcnRlZCBieSBmcmVxdWVuY3kgb2YgdXNlLCBhbHRob3VnaCBpdAorICogcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgd2l0aCB0aGlzIGZldyBpdGVtcyAqLworc3RhdGljIEludGVyZmFjZUhhbmRsZXIgaW50ZXJmYWNlX2hhbmRsZXJzW10gPSB7CisgIHsgREJVU19JTlRFUkZBQ0VfREJVUywgZGJ1c19tZXNzYWdlX2hhbmRsZXJzLAorICAgICIgICAgPHNpZ25hbCBuYW1lPVwiTmFtZU93bmVyQ2hhbmdlZFwiPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgPC9zaWduYWw+XG4iCisgICAgIiAgICA8c2lnbmFsIG5hbWU9XCJOYW1lTG9zdFwiPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgPC9zaWduYWw+XG4iCisgICAgIiAgICA8c2lnbmFsIG5hbWU9XCJOYW1lQWNxdWlyZWRcIj5cbiIKKyAgICAiICAgICAgPGFyZyB0eXBlPVwic1wiLz5cbiIKKyAgICAiICAgIDwvc2lnbmFsPlxuIiB9LAorICB7IERCVVNfSU5URVJGQUNFX0lOVFJPU1BFQ1RBQkxFLCBpbnRyb3NwZWN0YWJsZV9tZXNzYWdlX2hhbmRsZXJzLCBOVUxMIH0sCisgIHsgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORywgbW9uaXRvcmluZ19tZXNzYWdlX2hhbmRsZXJzLCBOVUxMIH0sCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsgREJVU19JTlRFUkZBQ0VfVkVSQk9TRSwgdmVyYm9zZV9tZXNzYWdlX2hhbmRsZXJzLCBOVUxMIH0sCisjZW5kaWYKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICB7IEJVU19JTlRFUkZBQ0VfU1RBVFMsIHN0YXRzX21lc3NhZ2VfaGFuZGxlcnMsIE5VTEwgfSwKKyNlbmRpZgorICB7IE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24gKERCdXNTdHJpbmcgKnhtbCwKKwkJCSAgY29uc3QgY2hhciAqc2lnbmF0dXJlLAorCQkJICBkYnVzX2Jvb2xfdCBpbikKK3sKKyAgREJ1c1R5cGVSZWFkZXIgdHlwZXJlYWRlcjsKKyAgREJ1c1N0cmluZyBzaWdzdHI7CisgIGludCBjdXJyZW50X3R5cGU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzaWdzdHIsIHNpZ25hdHVyZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnR5cGVyZWFkZXIsICZzaWdzdHIsIDApOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnR5cGVyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpzdWJzaWc7CisgICAgICBpbnQgc3RhcnQsIGxlbjsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAoJnR5cGVyZWFkZXIsICZzdWJzaWcsICZzdGFydCwgJmxlbik7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgICA8YXJnIGRpcmVjdGlvbj1cIiVzXCIgdHlwZT1cIiIsCisJCQkJICAgICAgIGluID8gImluIiA6ICJvdXQiKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKHhtbCwKKwkJCQkgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdWJzaWcpICsgc3RhcnQsCisJCQkJICAgIGxlbikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIlwiLz5cbiIpKQorCWdvdG8gb29tOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmdHlwZXJlYWRlcik7CisgICAgfQorICByZXR1cm4gVFJVRTsKKyBvb206CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfZ2VuZXJhdGVfaW50cm9zcGVjdF9zdHJpbmcgKERCdXNTdHJpbmcgKnhtbCkKK3sKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptaDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfRE9DVFlQRV9ERUNMX05PREUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICI8bm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGloID0gaW50ZXJmYWNlX2hhbmRsZXJzOyBpaC0+bmFtZSAhPSBOVUxMOyBpaCsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgPGludGVyZmFjZSBuYW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaC0+bmFtZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgZm9yIChtaCA9IGloLT5tZXNzYWdlX2hhbmRsZXJzOyBtaC0+bmFtZSAhPSBOVUxMOyBtaCsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgIDxtZXRob2QgbmFtZT1cIiVzXCI+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uICh4bWwsIG1oLT5pbl9hcmdzLCBUUlVFKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uICh4bWwsIG1oLT5vdXRfYXJncywgRkFMU0UpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICIgICAgPC9tZXRob2Q+XG4iKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoaWgtPmV4dHJhX2ludHJvc3BlY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsIGloLT5leHRyYV9pbnRyb3NwZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgPC9pbnRlcmZhY2U+XG4iKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIjwvbm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfZGJ1c192ZXJib3NlICgiSW50cm9zcGVjdCgpIG9uIGJ1cyBkcml2ZXJcbiIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCkpCisgICAgZ290byBvb207CisKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmeG1sKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBTZXQgQGVycm9yIGFuZCByZXR1cm4gRkFMU0UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGRpcmVjdGVkIHRvIHRoZQorICogZGJ1cy1kYWVtb24gYnkgaXRzIGNhbm9uaWNhbCBvYmplY3QgcGF0aC4gVGhpcyBpcyBoYXJkZW5pbmcgYWdhaW5zdAorICogc3lzdGVtIHNlcnZpY2VzIHdpdGggcG9vcmx5LXdyaXR0ZW4gc2VjdXJpdHkgcG9saWN5IGZpbGVzLCB3aGljaAorICogbWlnaHQgYWxsb3cgc2VuZGluZyBkYW5nZXJvdXNseSBicm9hZCBlcXVpdmFsZW5jZSBjbGFzc2VzIG9mIG1lc3NhZ2VzCisgKiBzdWNoIGFzICJhbnl0aGluZyB3aXRoIHRoaXMgYXNzdW1lZC10by1iZS1zYWZlIG9iamVjdCBwYXRoIi4KKyAqCisgKiBkYnVzLWRhZW1vbiBpcyB1bnVzdWFsIGluIHRoYXQgaXQgbm9ybWFsbHkgaWdub3JlcyB0aGUgb2JqZWN0IHBhdGgKKyAqIG9mIGluY29taW5nIG1lc3NhZ2VzOyB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBiZWhhdmlvdXIgZm9yIHRoZSAicmVhZCIKKyAqIHJlYWQtb25seSBtZXRob2QgY2FsbHMgbGlrZSBHZXRDb25uZWN0aW9uVW5peFVzZXIgZm9yIGJhY2t3YXJkcworICogY29tcGF0aWJpbGl0eSwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGJlIG1vcmUgcmVzdHJpY3RpdmUgZm9yIHRoaW5ncworICogaW50ZW5kZWQgdG8gYmUgcm9vdC1vbmx5IG9yIHByaXZpbGVnZWQtZGV2ZWxvcGVycy1vbmx5LgorICoKKyAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlIG90aGVyIHN5c3RlbSBzZXJ2aWNlcyB3aXRoIHRoZSBzYW1lCisgKiBxdWlyayBhcyBkYnVzLWRhZW1vbi4KKyAqLworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfY2hlY2tfbWVzc2FnZV9pc19mb3JfdXMgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfcGF0aCAobWVzc2FnZSwgREJVU19QQVRIX0RCVVMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJNZXRob2QgJyVzJyBpcyBvbmx5IGF2YWlsYWJsZSBhdCB0aGUgY2Fub25pY2FsIG9iamVjdCBwYXRoICclcyciLAorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgREJVU19QQVRIX0RCVVMpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbmFtZSwgKmludGVyZmFjZTsKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptaDsKKyAgZGJ1c19ib29sX3QgZm91bmRfaW50ZXJmYWNlID0gRkFMU0U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25GYWlsdXJlIikpCisgICAgeworICAgICAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgICAgIERCdXNDb25uZWN0aW9uICpzeXN0ZW1kOworCisgICAgICAvKiBUaGlzIGlzIGEgZGlyZWN0ZWQgc2lnbmFsLCBub3QgYSBtZXRob2QgY2FsbCwgc28gdGhlIGxvZyBtZXNzYWdlCisgICAgICAgKiBpcyBhIGxpdHRsZSB3ZWlyZCAoaXQgdGFsa3MgYWJvdXQgImNhbGxpbmciIEFjdGl2YXRpb25GYWlsdXJlKSwKKyAgICAgICAqIGJ1dCBpdCdzIGNsb3NlIGVub3VnaCAqLworICAgICAgaWYgKCFidXNfZHJpdmVyX2NoZWNrX2NhbGxlcl9pc19wcml2aWxlZ2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgICAgICBzeXN0ZW1kID0gYnVzX2RyaXZlcl9nZXRfb3duZXJfb2ZfbmFtZSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisKKyAgICAgIGlmIChzeXN0ZW1kICE9IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICphdHRhY2tlcjsKKworICAgICAgICAgIGF0dGFja2VyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIGZvcmdlZCBBY3RpdmF0aW9uRmFpbHVyZSBtZXNzYWdlIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlciA/IGF0dGFja2VyIDogIih1bmF1dGhlbnRpY2F0ZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChjb25uZWN0aW9uKSk7CisgICAgICAgICAgLyogaWdub3JlIGl0ICovCisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKworICAgICAgaWYgKCFidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgdW5leHBlY3RlZCBBY3RpdmF0aW9uRmFpbHVyZSBtZXNzYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGlsZSBub3QgdXNpbmcgc3lzdGVtZCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBkYnVzX2FjdGl2YXRpb25fc3lzdGVtZF9mYWlsdXJlKGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uKGNvbnRleHQpLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBnb3QgYSBub24tbWV0aG9kLWNhbGwgbWVzc2FnZSwgaWdub3JpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7IC8qIHdlIGp1c3QgaWdub3JlIHRoaXMgKi8KKyAgICB9CisKKyAgLyogbWF5IGJlIE5VTEwsIHdoaWNoIG1lYW5zICJhbnkgaW50ZXJmYWNlIHdpbGwgZG8iICovCisgIGludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMKTsKKworICBuYW1lID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJEcml2ZXIgZ290IGEgbWV0aG9kIGNhbGw6ICVzXG4iLCBuYW1lKTsKKworICAvKiBzZWN1cml0eSBjaGVja3Mgc2hvdWxkIGhhdmUga2VwdCB0aGlzIGZyb20gZ2V0dGluZyBoZXJlICovCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAgKG5hbWUsICJIZWxsbyIpID09IDApOworCisgIGZvciAoaWggPSBpbnRlcmZhY2VfaGFuZGxlcnM7IGloLT5uYW1lICE9IE5VTEw7IGloKyspCisgICAgeworICAgICAgaWYgKGludGVyZmFjZSAhPSBOVUxMICYmIHN0cmNtcCAoaW50ZXJmYWNlLCBpaC0+bmFtZSkgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGZvdW5kX2ludGVyZmFjZSA9IFRSVUU7CisKKyAgICAgIGZvciAobWggPSBpaC0+bWVzc2FnZV9oYW5kbGVyczsgbWgtPm5hbWUgIT0gTlVMTDsgbWgrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKG1oLT5uYW1lLCBuYW1lKSAhPSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRm91bmQgZHJpdmVyIGhhbmRsZXIgZm9yICVzXG4iLCBuYW1lKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsIG1oLT5pbl9hcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDYWxsIHRvICVzIGhhcyB3cm9uZyBhcmdzICglcywgZXhwZWN0ZWQgJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5pbl9hcmdzKTsKKworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGwgdG8gJXMgaGFzIHdyb25nIGFyZ3MgKCVzLCBleHBlY3RlZCAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaC0+aW5fYXJncyk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCgqIG1oLT5oYW5kbGVyKSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEcml2ZXIgaGFuZGxlciBzdWNjZWVkZWRcbiIpOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBoYW5kbGVyIHJldHVybmVkIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIk5vIGRyaXZlciBoYW5kbGVyIGZvciBtZXNzYWdlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgbmFtZSk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBmb3VuZF9pbnRlcmZhY2UgPyBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EIDogREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCB1bmRlcnN0YW5kIG1lc3NhZ2UgJXMiLAorICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMsIG5hbWUpOworCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIEZJWE1FIDEuMCBEb2VzIG5vdGhpbmcgZm9yIG5vdywgc2hvdWxkIHVucmVnaXN0ZXIgdGhlIGNvbm5lY3Rpb24KKyAgICogd2l0aCB0aGUgYnVzIGRyaXZlci4KKyAgICovCit9CmRpZmYgLS1naXQgYS9idXMvZHJpdmVyLmggYi9idXMvZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNzA5YwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kcml2ZXIuaApAQCAtMCwwICsxLDUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRyaXZlci5oICBCdXMgY2xpZW50IChkcml2ZXIpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19EUklWRVJfSAorI2RlZmluZSBCVVNfRFJJVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKwordm9pZCAgICAgICAgYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkICAoY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCSAgICBjb25zdCBjaGFyICAgICAqb2xkX293bmVyLAorCQkJCQkJICAgIGNvbnN0IGNoYXIgICAgICpuZXdfb3duZXIsCisJCQkJCQkgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nICAoREJ1c1N0cmluZyAqeG1sKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfY2hlY2tfbWVzc2FnZV9pc19mb3JfdXMgICAgIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0RSSVZFUl9IICovCmRpZmYgLS1naXQgYS9idXMvZXhhbXBsZS1zZXNzaW9uLWRpc2FibGUtc3RhdHMuY29uZi5pbiBiL2J1cy9leGFtcGxlLXNlc3Npb24tZGlzYWJsZS1zdGF0cy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjNlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZXhhbXBsZS1zZXNzaW9uLWRpc2FibGUtc3RhdHMuY29uZi5pbgpAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorCisgIDwhLS0gSWYgdGhlIFN0YXRzIGludGVyZmFjZSB3YXMgZW5hYmxlZCBhdCBjb21waWxlLXRpbWUsIHVzZXJzIGNhbiB1c2UgaXQgb24KKyAgICAgICB0aGUgc2Vzc2lvbiBidXMgYnkgZGVmYXVsdC4gU3lzdGVtcyBwcm92aWRpbmcgaXNvbGF0aW9uIG9mIHByb2Nlc3NlcworICAgICAgIHdpdGggTFNNcyBtaWdodCB3YW50IHRvIHJlc3RyaWN0IHRoaXMuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IGNvcHlpbmcKKyAgICAgICB0aGlzIGZpbGUgaW4gQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmQvIC0tPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkRlYnVnLlN0YXRzIi8+CisgIDwvcG9saWN5PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1cy9leGFtcGxlLXN5c3RlbS1lbmFibGUtc3RhdHMuY29uZi5pbiBiL2J1cy9leGFtcGxlLXN5c3RlbS1lbmFibGUtc3RhdHMuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVhYTgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2V4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mLmluCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisKKyAgPCEtLSBJZiB0aGUgU3RhdHMgaW50ZXJmYWNlIHdhcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSwgb25seSByb290IG1heSB1c2UgaXQuCisgICAgICAgUmVwbGFjZSBVU0VSTkFNRSBhbmQgY29weSB0aGlzIGZpbGUgaW4gQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zeXN0ZW0uZC8KKyAgICAgICBpZiB5b3Ugd2FudCB0byBlbmFibGUgb3RoZXIgcHJpdmlsZWdlZCB1c2VycyB0byB2aWV3IHN0YXRpc3RpY3MgYW5kCisgICAgICAgZGVidWcgaW5mbyAtLT4KKworICA8cG9saWN5IHVzZXI9IlVTRVJOQU1FIj4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZWJ1Zy5TdGF0cyIvPgorICA8L3BvbGljeT4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9idXMvZXhwaXJlbGlzdC5jIGIvYnVzL2V4cGlyZWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM4ODZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2V4cGlyZWxpc3QuYwpAQCAtMCwwICsxLDQwMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBleHBpcmVsaXN0LmMgIExpc3Qgb2YgaXRlbXMgdGhhdCBleHBpcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJleHBpcmVsaXN0LmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGltZW91dC5oPgorCitzdHJ1Y3QgQnVzRXhwaXJlTGlzdAoreworICBEQnVzTGlzdCAgICAgICppdGVtczsgLyoqPCBMaXN0IG9mIEJ1c0V4cGlyZUl0ZW0gKi8KKyAgREJ1c1RpbWVvdXQgICAqdGltZW91dDsKKyAgREJ1c0xvb3AgICAgICAqbG9vcDsKKyAgQnVzRXhwaXJlRnVuYyAgZXhwaXJlX2Z1bmM7CisgIHZvaWQgICAgICAgICAgKmRhdGE7CisgIGludCAgICAgICAgICAgIGV4cGlyZV9hZnRlcjsgLyoqPCBFeHBpcmUgYWZ0ZXIgbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykgKi8KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBleHBpcmVfdGltZW91dF9oYW5kbGVyICh2b2lkICpkYXRhKTsKKworQnVzRXhwaXJlTGlzdCoKK2J1c19leHBpcmVfbGlzdF9uZXcgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBleHBpcmVfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVGdW5jICBleHBpcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c0V4cGlyZUxpc3QgKmxpc3Q7CisKKyAgbGlzdCA9IGRidXNfbmV3MCAoQnVzRXhwaXJlTGlzdCwgMSk7CisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbGlzdC0+ZXhwaXJlX2Z1bmMgPSBleHBpcmVfZnVuYzsKKyAgbGlzdC0+ZGF0YSA9IGRhdGE7CisgIGxpc3QtPmxvb3AgPSBsb29wOworICBsaXN0LT5leHBpcmVfYWZ0ZXIgPSBleHBpcmVfYWZ0ZXI7CisKKyAgbGlzdC0+dGltZW91dCA9IF9kYnVzX3RpbWVvdXRfbmV3ICgxMDAsIC8qIGlycmVsZXZhbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVfdGltZW91dF9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QsIE5VTEwpOworICBpZiAobGlzdC0+dGltZW91dCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3RpbWVvdXRfc2V0X2VuYWJsZWQgKGxpc3QtPnRpbWVvdXQsIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGxpc3QtPmxvb3AsIGxpc3QtPnRpbWVvdXQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHVybiBsaXN0OworCisgZmFpbGVkOgorICBpZiAobGlzdC0+dGltZW91dCkKKyAgICBfZGJ1c190aW1lb3V0X3VucmVmIChsaXN0LT50aW1lb3V0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworCisgIHJldHVybiBOVUxMOworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfZnJlZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsaXN0LT5pdGVtcyA9PSBOVUxMKTsKKworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChsaXN0LT5sb29wLCBsaXN0LT50aW1lb3V0KTsKKworICBfZGJ1c190aW1lb3V0X3VucmVmIChsaXN0LT50aW1lb3V0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworfQorCit2b2lkCitidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCkKK3sKKyAgaWYgKG5leHRfaW50ZXJ2YWwgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ludGVydmFsKTsKKyAgICAgIF9kYnVzX3RpbWVvdXRfc2V0X2VuYWJsZWQgKHRpbWVvdXQsIFRSVUUpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiRW5hYmxlZCBhbiBleHBpcmUgdGltZW91dCB3aXRoIGludGVydmFsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKHRpbWVvdXQpKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfc2V0X2VuYWJsZWQgKHRpbWVvdXQsIEZBTFNFKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc2FibGVkIGFuIGV4cGlyZSB0aW1lb3V0XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICBfZGJ1c192ZXJib3NlICgiTm8gbmVlZCB0byBkaXNhYmxlIHRoaXMgZXhwaXJlIHRpbWVvdXRcbiIpOworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfcmVjaGVja19pbW1lZGlhdGVseSAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoInNldHRpbmcgaW50ZXJ2YWwgb24gZXhwaXJlIGxpc3QgdG8gMCBmb3IgaW1tZWRpYXRlIHJlY2hlY2tcbiIpOworCisgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIDApOworfQorCitzdGF0aWMgaW50Citkb19leHBpcmF0aW9uX3dpdGhfbW9ub3RvbmljX3RpbWUgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgdHZfdXNlYykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBuZXh0X2ludGVydmFsLCBtaW5fd2FpdF90aW1lLCBpdGVtc190b19leHBpcmU7CisKKyAgbmV4dF9pbnRlcnZhbCA9IC0xOworICBtaW5fd2FpdF90aW1lID0gMzYwMCAqIDEwMDA7IC8qIHRoaXMgaXMgcmVzZXQgYW55d2F5IGlmIHVzZWQgKi8KKyAgaXRlbXNfdG9fZXhwaXJlID0gMDsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdC0+aXRlbXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdC0+aXRlbXMsIGxpbmspOworICAgICAgZG91YmxlIGVsYXBzZWQ7CisgICAgICBCdXNFeHBpcmVJdGVtICppdGVtOworCisgICAgICBpdGVtID0gbGluay0+ZGF0YTsKKworICAgICAgZWxhcHNlZCA9IEVMQVBTRURfTUlMTElTRUNPTkRTX1NJTkNFIChpdGVtLT5hZGRlZF90dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmFkZGVkX3R2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2X3NlYywgdHZfdXNlYyk7CisKKyAgICAgIGlmICgoKGl0ZW0tPmFkZGVkX3R2X3NlYyA9PSAwKSAmJiAoaXRlbS0+YWRkZWRfdHZfdXNlYyA9PSAwKSkgfHwKKyAgICAgICAgICAoKGxpc3QtPmV4cGlyZV9hZnRlciA+IDApICYmIChlbGFwc2VkID49IChkb3VibGUpIGxpc3QtPmV4cGlyZV9hZnRlcikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkV4cGlyaW5nIGFuIGl0ZW0gJXBcbiIsIGl0ZW0pOworCisgICAgICAgICAgLyogSWYgdGhlIGV4cGlyZSBmdW5jdGlvbiBmYWlscywgd2UganVzdCBlbmQgdXAgZXhwaXJpbmcKKyAgICAgICAgICAgKiB0aGlzIGl0ZW0gbmV4dCB0aW1lIHdlIHdhbGsgdGhyb3VnaCB0aGUgbGlzdC4gVGhpcyB3b3VsZAorICAgICAgICAgICAqIGJlIGFuIGluZGV0ZXJtaW5hdGUgdGltZSBub3JtYWxseSwgc28gd2Ugc2V0IHVwIHRoZQorICAgICAgICAgICAqIG5leHRfaW50ZXJ2YWwgdG8gYmUgInNob3J0bHkiIChqdXN0IGVub3VnaCB0byBhdm9pZAorICAgICAgICAgICAqIGEgYnVzeSBsb29wKQorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghKCogbGlzdC0+ZXhwaXJlX2Z1bmMpIChsaXN0LCBsaW5rLCBsaXN0LT5kYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCA9IF9kYnVzX2dldF9vb21fd2FpdCAoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGxpc3QtPmV4cGlyZV9hZnRlciA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBkb3VibGUgdG9fd2FpdDsKKworICAgICAgICAgIGl0ZW1zX3RvX2V4cGlyZSA9IDE7CisgICAgICAgICAgdG9fd2FpdCA9IChkb3VibGUpIGxpc3QtPmV4cGlyZV9hZnRlciAtIGVsYXBzZWQ7CisgICAgICAgICAgaWYgKG1pbl93YWl0X3RpbWUgPiB0b193YWl0KQorICAgICAgICAgICAgbWluX3dhaXRfdGltZSA9IHRvX3dhaXQ7CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIGlmIChuZXh0X2ludGVydmFsIDwgMCAmJiBpdGVtc190b19leHBpcmUpCisgICAgbmV4dF9pbnRlcnZhbCA9IG1pbl93YWl0X3RpbWU7CisKKyAgcmV0dXJuIG5leHRfaW50ZXJ2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZXhwaXJlbGlzdF9leHBpcmUgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpCit7CisgIGludCBuZXh0X2ludGVydmFsOworCisgIG5leHRfaW50ZXJ2YWwgPSAtMTsKKworICBpZiAobGlzdC0+aXRlbXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKworICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgICAgIG5leHRfaW50ZXJ2YWwgPSBkb19leHBpcmF0aW9uX3dpdGhfbW9ub3RvbmljX3RpbWUgKGxpc3QsIHR2X3NlYywgdHZfdXNlYyk7CisgICAgfQorCisgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIG5leHRfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2V4cGlyZV90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0V4cGlyZUxpc3QgKmxpc3QgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nXG4iKTsKKworICAvKiBub3RlIHRoYXQgdGhpcyBtYXkgcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19leHBpcmVsaXN0X2V4cGlyZSAobGlzdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9yZW1vdmVfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9yZW1vdmUgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKQoreworICByZXR1cm4gX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0LT5pdGVtcywgaXRlbSk7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF91bmxpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKQoreworICBfZGJ1c19saXN0X3VubGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9hZGQgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKQoreworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdC0+aXRlbXMsIGl0ZW0pOworICBpZiAocmV0ICYmICFkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKGxpc3QtPnRpbWVvdXQpKQorICAgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIDApOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9hZGRfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgX2RidXNfYXNzZXJ0IChsaW5rLT5kYXRhICE9IE5VTEwpOworICAKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7CisKKyAgaWYgKCFkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKGxpc3QtPnRpbWVvdXQpKQorICAgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIDApOworfQorCitEQnVzTGlzdCoKK2J1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0LT5pdGVtcyk7Cit9CisKK0RCdXNMaXN0KgorYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9jb250YWluc19pdGVtIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pCit7CisgIHJldHVybiBfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJmxpc3QtPml0ZW1zLCBpdGVtKSAhPSBOVUxMOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzRXhwaXJlSXRlbSBpdGVtOworICBpbnQgZXhwaXJlX2NvdW50OworfSBUZXN0RXhwaXJlSXRlbTsKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2V4cGlyZV9mdW5jIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIFRlc3RFeHBpcmVJdGVtICp0OworCisgIHQgPSAoVGVzdEV4cGlyZUl0ZW0qKSBsaW5rLT5kYXRhOworCisgIHQtPmV4cGlyZV9jb3VudCArPSAxOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGltZV9hZGRfbWlsbGlzZWNvbmRzIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG1pbGxpc2Vjb25kcykKK3sKKyAgKnR2X3NlYyA9ICp0dl9zZWMgKyBtaWxsaXNlY29uZHMgLyAxMDAwOworICAqdHZfdXNlYyA9ICp0dl91c2VjICsgbWlsbGlzZWNvbmRzICogMTAwMDsKKyAgaWYgKCp0dl91c2VjID49IDEwMDAwMDApCisgICAgeworICAgICAgKnR2X3VzZWMgLT0gMTAwMDAwMDsKKyAgICAgICp0dl9zZWMgKz0gMTsKKyAgICB9Cit9CisKK2RidXNfYm9vbF90CitidXNfZXhwaXJlX2xpc3RfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIEJ1c0V4cGlyZUxpc3QgKmxpc3Q7CisgIGxvbmcgdHZfc2VjLCB0dl91c2VjOworICBsb25nIHR2X3NlY19ub3RfZXhwaXJlZCwgdHZfdXNlY19ub3RfZXhwaXJlZDsKKyAgbG9uZyB0dl9zZWNfZXhwaXJlZCwgdHZfdXNlY19leHBpcmVkOworICBsb25nIHR2X3NlY19wYXN0LCB0dl91c2VjX3Bhc3Q7CisgIFRlc3RFeHBpcmVJdGVtICppdGVtOworICBpbnQgbmV4dF9pbnRlcnZhbDsKKyAgZGJ1c19ib29sX3QgcmVzdWx0ID0gRkFMU0U7CisKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIF9kYnVzX2Fzc2VydCAobG9vcCAhPSBOVUxMKTsKKworI2RlZmluZSBFWFBJUkVfQUZURVIgMTAwCisgIAorICBsaXN0ID0gYnVzX2V4cGlyZV9saXN0X25ldyAobG9vcCwgRVhQSVJFX0FGVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9leHBpcmVfZnVuYywgTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGlzdCAhPSBOVUxMKTsKKworICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKworICB0dl9zZWNfbm90X2V4cGlyZWQgPSB0dl9zZWM7CisgIHR2X3VzZWNfbm90X2V4cGlyZWQgPSB0dl91c2VjOworICB0aW1lX2FkZF9taWxsaXNlY29uZHMgKCZ0dl9zZWNfbm90X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR2X3VzZWNfbm90X2V4cGlyZWQsIEVYUElSRV9BRlRFUiAtIDEpOworCisgIHR2X3NlY19leHBpcmVkID0gdHZfc2VjOworICB0dl91c2VjX2V4cGlyZWQgPSB0dl91c2VjOworICB0aW1lX2FkZF9taWxsaXNlY29uZHMgKCZ0dl9zZWNfZXhwaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHZfdXNlY19leHBpcmVkLCBFWFBJUkVfQUZURVIpOworICAKKworICB0dl9zZWNfcGFzdCA9IHR2X3NlYyAtIDE7CisgIHR2X3VzZWNfcGFzdCA9IHR2X3VzZWM7CisKKyAgaXRlbSA9IGRidXNfbmV3MCAoVGVzdEV4cGlyZUl0ZW0sIDEpOworCisgIGlmIChpdGVtID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaXRlbS0+aXRlbS5hZGRlZF90dl9zZWMgPSB0dl9zZWM7CisgIGl0ZW0tPml0ZW0uYWRkZWRfdHZfdXNlYyA9IHR2X3VzZWM7CisgIGlmICghYnVzX2V4cGlyZV9saXN0X2FkZCAobGlzdCwgJml0ZW0tPml0ZW0pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworICBuZXh0X2ludGVydmFsID0KKyAgICBkb19leHBpcmF0aW9uX3dpdGhfbW9ub3RvbmljX3RpbWUgKGxpc3QsIHR2X3NlY19ub3RfZXhwaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2X3VzZWNfbm90X2V4cGlyZWQpOworICBfZGJ1c19hc3NlcnQgKGl0ZW0tPmV4cGlyZV9jb3VudCA9PSAwKTsKKyAgX2RidXNfdmVyYm9zZSAoIm5leHRfaW50ZXJ2YWwgPSAlZFxuIiwgbmV4dF9pbnRlcnZhbCk7CisgIF9kYnVzX2Fzc2VydCAobmV4dF9pbnRlcnZhbCA9PSAxKTsKKyAgCisgIG5leHRfaW50ZXJ2YWwgPQorICAgIGRvX2V4cGlyYXRpb25fd2l0aF9tb25vdG9uaWNfdGltZSAobGlzdCwgdHZfc2VjX2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl91c2VjX2V4cGlyZWQpOworICBfZGJ1c19hc3NlcnQgKGl0ZW0tPmV4cGlyZV9jb3VudCA9PSAxKTsKKyAgX2RidXNfdmVyYm9zZSAoIm5leHRfaW50ZXJ2YWwgPSAlZFxuIiwgbmV4dF9pbnRlcnZhbCk7CisgIF9kYnVzX2Fzc2VydCAobmV4dF9pbnRlcnZhbCA9PSAtMSk7CisKKyAgbmV4dF9pbnRlcnZhbCA9CisgICAgZG9fZXhwaXJhdGlvbl93aXRoX21vbm90b25pY190aW1lIChsaXN0LCB0dl9zZWNfcGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2X3VzZWNfcGFzdCk7CisgIF9kYnVzX2Fzc2VydCAoaXRlbS0+ZXhwaXJlX2NvdW50ID09IDEpOworICBfZGJ1c192ZXJib3NlICgibmV4dF9pbnRlcnZhbCA9ICVkXG4iLCBuZXh0X2ludGVydmFsKTsKKyAgX2RidXNfYXNzZXJ0IChuZXh0X2ludGVydmFsID09IDEwMDAgKyBFWFBJUkVfQUZURVIpOworCisgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGxpc3QsICZpdGVtLT5pdGVtKTsKKyAgZGJ1c19mcmVlIChpdGVtKTsKKyAgCisgIGJ1c19leHBpcmVfbGlzdF9mcmVlIChsaXN0KTsKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgIAorICByZXN1bHQgPSBUUlVFOworCisgb29tOgorICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2J1cy9leHBpcmVsaXN0LmggYi9idXMvZXhwaXJlbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4N2NiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZXhwaXJlbGlzdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZXhwaXJlbGlzdC5oICBMaXN0IG9mIHN0dWZmIHRoYXQgZXhwaXJlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfRVhQSVJFX0xJU1RfSAorI2RlZmluZSBCVVNfRVhQSVJFX0xJU1RfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQnVzRXhwaXJlTGlzdCBCdXNFeHBpcmVMaXN0OwordHlwZWRlZiBzdHJ1Y3QgQnVzRXhwaXJlSXRlbSBCdXNFeHBpcmVJdGVtOworCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIEJ1c0V4cGlyZUZ1bmMpIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCisKKy8qIGVtYmVkIHRoaXMgaW4gYSBjaGlsZCBleHBpcmUgaXRlbSBzdHJ1Y3QgKi8KK3N0cnVjdCBCdXNFeHBpcmVJdGVtCit7CisgIGxvbmcgYWRkZWRfdHZfc2VjOyAgLyoqPCBUaW1lIHdlIHdlcmUgYWRkZWQgKHNlY29uZHMgY29tcG9uZW50KSAqLworICBsb25nIGFkZGVkX3R2X3VzZWM7IC8qKjwgVGltZSB3ZSB3ZXJlIGFkZGVkIChtaWNyb3NlYyBjb21wb25lbnQpICovCit9OworCitCdXNFeHBpcmVMaXN0KiBidXNfZXhwaXJlX2xpc3RfbmV3ICAgICAgICAgICAgICAgICAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBleHBpcmVfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlRnVuYyAgZXhwaXJlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfZnJlZSAgICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVjaGVja19pbW1lZGlhdGVseSAoQnVzRXhwaXJlTGlzdCAqbGlzdCk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKK2RidXNfYm9vbF90ICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgICAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pOworREJ1c0xpc3QqICAgICAgYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpOworREJ1c0xpc3QqICAgICAgYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluayk7CitkYnVzX2Jvb2xfdCAgICBidXNfZXhwaXJlX2xpc3RfYWRkICAgICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9hZGRfbGluayAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfdW5saW5rICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKKworLyogdGhpcyBtYWNybyBhbmQgZnVuY3Rpb24gYXJlIHNlbWktcmVsYXRlZCB1dGlsaXR5IGZ1bmN0aW9ucywgbm90IHJlYWxseSBwYXJ0IG9mIHRoZQorICogQnVzRXhwaXJlTGlzdCBBUEkKKyAqLworCisjZGVmaW5lIEVMQVBTRURfTUlMTElTRUNPTkRTX1NJTkNFKG9yaWdfdHZfc2VjLCBvcmlnX3R2X3VzZWMsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dfdHZfc2VjLCBub3dfdHZfdXNlYykgICAgIFwKKyAoKChkb3VibGUpIChub3dfdHZfc2VjKSAtIChkb3VibGUpIChvcmlnX3R2X3NlYykpICogMTAwMC4wICsgICBcCisgKChkb3VibGUpIChub3dfdHZfdXNlYykgLSAoZG91YmxlKSAob3JpZ190dl91c2VjKSkgLyAxMDAwLjApCisKK3ZvaWQgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7CisKKyNlbmRpZiAvKiBCVVNfRVhQSVJFX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mLmluIGIvYnVzL2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTAyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvbGVnYWN5LWNvbmZpZy9zZXNzaW9uLmNvbmYuaW4KQEAgLTAsMCArMSwxOSBAQAorPCEtLQorVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZCBtYXkgYmUgcmVtb3ZlZC4KKworSW4gb2xkZXIgdmVyc2lvbnMgb2YgZGJ1cywgdGhpcyBmaWxlIGRlZmluZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgd2VsbC1rbm93bgorc2Vzc2lvbiBidXMuIFRoYXQgYmVoYXZpb3VyIGlzIG5vdyBkZXRlcm1pbmVkIGJ5CitAREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYsIHdoaWNoIHNob3VsZCBub3QgYmUgZWRpdGVkLgorCitGb3IgbG9jYWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBjcmVhdGUgYSBmaWxlCitzZXNzaW9uLWxvY2FsLmNvbmYgb3IgZmlsZXMgbWF0Y2hpbmcgc2Vzc2lvbi5kLyouY29uZiBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKK2FzIHRoaXMgb25lLCB3aXRoIGEgPGJ1c2NvbmZpZz4gZWxlbWVudCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4KK1RoZXNlIGRpcmVjdGl2ZXMgY2FuIG92ZXJyaWRlIEQtQnVzIG9yIE9TIGRlZmF1bHRzLgorCitGb3IgdXBzdHJlYW0gb3IgZGlzdHJpYnV0aW9uLXdpZGUgZGVmYXVsdHMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbgorYnkgYSBsb2NhbCBzeXNhZG1pbiwgY3JlYXRlIGZpbGVzIG1hdGNoaW5nCitAREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmQvKi5jb25mIGluc3RlYWQuCistLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+PC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9idXMvbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZi5pbiBiL2J1cy9sZWdhY3ktY29uZmlnL3N5c3RlbS5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWJhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZi5pbgpAQCAtMCwwICsxLDE5IEBACis8IS0tCitUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYW5kIG1heSBiZSByZW1vdmVkLgorCitJbiBvbGRlciB2ZXJzaW9ucyBvZiBkYnVzLCB0aGlzIGZpbGUgZGVmaW5lZCB0aGUgYmVoYXZpb3VyIG9mIHRoZSB3ZWxsLWtub3duCitzeXN0ZW0gYnVzLiBUaGF0IGJlaGF2aW91ciBpcyBub3cgZGV0ZXJtaW5lZCBieQorQERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSQC9kYnVzLTEvc3lzdGVtLmNvbmYsIHdoaWNoIHNob3VsZCBub3QgYmUgZWRpdGVkLgorCitGb3IgbG9jYWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBjcmVhdGUgYSBmaWxlCitzeXN0ZW0tbG9jYWwuY29uZiBvciBmaWxlcyBtYXRjaGluZyBzeXN0ZW0uZC8qLmNvbmYgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CithcyB0aGlzIG9uZSwgd2l0aCBhIDxidXNjb25maWc+IGVsZW1lbnQgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuCitUaGVzZSBkaXJlY3RpdmVzIGNhbiBvdmVycmlkZSBELUJ1cyBvciBPUyBkZWZhdWx0cy4KKworRm9yIHVwc3RyZWFtIG9yIGRpc3RyaWJ1dGlvbi13aWRlIGRlZmF1bHRzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KK2J5IGEgbG9jYWwgc3lzYWRtaW4sIGNyZWF0ZSBmaWxlcyBtYXRjaGluZworQERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSQC9kYnVzLTEvc3lzdGVtLmQvKi5jb25mIGluc3RlYWQuCistLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+PC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9idXMvbWFpbi5jIGIvYnVzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhmMjUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL21haW4uYwpAQCAtMCwwICsxLDY5MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBtYWluLmMgIG1haW4oKSBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBmb3Igd3JpdGUoKSBhbmQgU1RERVJSX0ZJTEVOTyAqLworI2VuZGlmCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSAiYXVkaXQuaCIKKworI2lmZGVmIERCVVNfVU5JWAorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKyNlbmRpZgorCitzdGF0aWMgQnVzQ29udGV4dCAqY29udGV4dDsKKworI2lmZGVmIERCVVNfVU5JWAorCisvKiBEZXNwaXRlIGl0cyBuYW1lIGFuZCBpdHMgdW5pZGlyZWN0aW9uYWwgbmF0dXJlLCB0aGlzIGlzIGFjdHVhbGx5CisgKiBhIHNvY2tldCBwYWlyLiAqLworc3RhdGljIERCdXNTb2NrZXQgcmVsb2FkX3BpcGVbMl07CisjZGVmaW5lIFJFTE9BRF9SRUFEX0VORCAwCisjZGVmaW5lIFJFTE9BRF9XUklURV9FTkQgMQorCitzdGF0aWMgdm9pZCBjbG9zZV9yZWxvYWRfcGlwZSAoREJ1c1dhdGNoICoqKTsKKwordHlwZWRlZiBlbnVtCisgeworICAgQUNUSU9OX1JFTE9BRCA9ICdyJywKKyAgIEFDVElPTl9RVUlUID0gJ3EnCisgfSBTaWduYWxBY3Rpb247CisKK3N0YXRpYyB2b2lkCitzaWduYWxfaGFuZGxlciAoaW50IHNpZykKK3sKKyAgc3dpdGNoIChzaWcpCisgICAgeworICAgIGNhc2UgU0lHSFVQOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgY2hhciBhY3Rpb25bMl0gPSB7IEFDVElPTl9SRUxPQUQsICdcMCcgfTsKKworICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgYWN0aW9uKTsKKyAgICAgICAgaWYgKChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXS5mZCA+IDApICYmCisgICAgICAgICAgICAhX2RidXNfd3JpdGVfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSwgJnN0ciwgMCwgMSkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgd2UgcmVjZWl2ZSBTSUdIVVAgb2Z0ZW4gZW5vdWdoIHRvIGZpbGwgdGhlIHBpcGUgYnVmZmVyICg0MDk2CisgICAgICAgICAgICAgKiB0aW1lcyBvbiBvbGQgTGludXgsIDY1NTM2IG9uIG1vZGVybiBMaW51eCkgYmVmb3JlIGl0IGNhbiBiZQorICAgICAgICAgICAgICogZHJhaW5lZCwgbGV0J3MganVzdCB3YXJuIGFuZCBpZ25vcmUuIFRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUKKyAgICAgICAgICAgICAqIHJlbG9hZGVkIHdoaWxlIGRyYWluaW5nIHRoZSBwaXBlIGJ1ZmZlciwgd2hpY2ggaXMgd2hhdCB3ZQorICAgICAgICAgICAgICogd2FudGVkLiBJdCdzIGhhcm1sZXNzIHRoYXQgaXQgd2lsbCBiZSByZWxvYWRlZCBmZXdlciB0aW1lcyB0aGFuCisgICAgICAgICAgICAgKiB3ZSBhc2tlZCBmb3IsIHNpbmNlIHRoZSByZWxvYWQgaXMgZGVsYXllZCBhbnl3YXksIHNvIG5ldyBjaGFuZ2VzCisgICAgICAgICAgICAgKiB3aWxsIGJlIHBpY2tlZCB1cC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBXZSB1c2Ugd3JpdGUoKSBiZWNhdXNlIF9kYnVzX3dhcm4gdXNlcyB2ZnByaW50Ziwgd2hpY2ggaXNuJ3QKKyAgICAgICAgICAgICAqIGFzeW5jLXNpZ25hbC1zYWZlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJpbHkgVW5peC1zcGVjaWZpYywgYnV0IHNvIGFyZSBQT1NJWCBzaWduYWxzLAorICAgICAgICAgICAgICogc28uLi4gKi8KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1lc3NhZ2VbXSA9CisgICAgICAgICAgICAgICJVbmFibGUgdG8gd3JpdGUgdG8gcmVsb2FkIHBpcGUgLSBidWZmZXIgZnVsbD9cbiI7CisKKyAgICAgICAgICAgIGlmICh3cml0ZSAoU1RERVJSX0ZJTEVOTywgbWVzc2FnZSwgc3RybGVuIChtZXNzYWdlKSkgIT0KKyAgICAgICAgICAgICAgICAoc3NpemVfdCkgc3RybGVuIChtZXNzYWdlKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSBmYWlsdXJlIHRvIHdyaXRlIG91dCBhIHdhcm5pbmcgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSUdURVJNOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgY2hhciBhY3Rpb25bMl0gPSB7IEFDVElPTl9RVUlULCAnXDAnIH07CisgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBhY3Rpb24pOworICAgICAgICBpZiAoKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdLmZkIDwgMCkgfHwKKyAgICAgICAgICAgICFfZGJ1c193cml0ZV9zb2NrZXQgKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdLCAmc3RyLCAwLCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB3ZSBjYW4ndCB3cml0ZSB0byB0aGUgc29ja2V0LCBkeWluZyBzZWVtcyBhIG1vcmUKKyAgICAgICAgICAgICAqIGltcG9ydGFudCByZXNwb25zZSB0byBTSUdURVJNIHRoYW4gY2xlYW5pbmcgdXAgc29ja2V0cywKKyAgICAgICAgICAgICAqIHNvIHdlIGV4aXQuIFdlJ2QgdXNlIGV4aXQoKSwgYnV0IHRoYXQncyBub3QgYXN5bmMtc2lnbmFsLXNhZmUsCisgICAgICAgICAgICAgKiBzbyB3ZSdsbCBoYXZlIHRvIHJlc29ydCB0byBfZXhpdCgpLiAqLworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVzc2FnZVtdID0KKyAgICAgICAgICAgICAgIlVuYWJsZSB0byB3cml0ZSB0ZXJtaW5hdGlvbiBzaWduYWwgdG8gcGlwZSAtIGJ1ZmZlciBmdWxsP1xuIgorICAgICAgICAgICAgICAiV2lsbCBleGl0IGluc3RlYWQuXG4iOworCisgICAgICAgICAgICBpZiAod3JpdGUgKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbiAobWVzc2FnZSkpICE9CisgICAgICAgICAgICAgICAgKHNzaXplX3QpIHN0cmxlbiAobWVzc2FnZSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgZmFpbHVyZSB0byB3cml0ZSBvdXQgYSB3YXJuaW5nICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9leGl0ICgxKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19VTklYICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgREJVU19EQUVNT05fTkFNRQorICAgICAgIiBbLS12ZXJzaW9uXSIKKyAgICAgICIgWy0tc2Vzc2lvbl0iCisgICAgICAiIFstLXN5c3RlbV0iCisgICAgICAiIFstLWNvbmZpZy1maWxlPUZJTEVdIgorICAgICAgIiBbLS1wcmludC1hZGRyZXNzWz1ERVNDUklQVE9SXV0iCisgICAgICAiIFstLXByaW50LXBpZFs9REVTQ1JJUFRPUl1dIgorICAgICAgIiBbLS1pbnRyb3NwZWN0XSIKKyAgICAgICIgWy0tYWRkcmVzcz1BRERSRVNTXSIKKyAgICAgICIgWy0tbm9waWRmaWxlXSIKKyAgICAgICIgWy0tbm9mb3JrXSIKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgICIgWy0tZm9ya10iCisgICAgICAiIFstLXN5c3RlbWQtYWN0aXZhdGlvbl0iCisjZW5kaWYKKyAgICAgICJcbiIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIE1lc3NhZ2UgQnVzIERhZW1vbiAlc1xuIgorICAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCwgSW5jLiwgQ29kZUZhY3RvcnkgQUIsIGFuZCBvdGhlcnNcbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgREJVU19WRVJTSU9OX1NUUklORyk7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAoraW50cm9zcGVjdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyB4bWw7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ4bWwpOworICAgICAgZ290byBvb207CisgICAgfQorCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmeG1sKTsKKyAgcHJpbnRmICgiJXNcbiIsIHZfU1RSSU5HKTsKKworICBleGl0ICgwKTsKKworIG9vbToKKyAgX2RidXNfd2FybiAoIkNhbiBub3QgaW50cm9zcGVjdCAtIE91dCBvZiBtZW1vcnlcbiIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3R3b19jb25maWdfZmlsZXMgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbmZpZ19maWxlKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb25maWdfZmlsZSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJlc3NlcyAoY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV4dHJhX2FyZykKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhZGRyZXNzKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGFkZHJlc3MgJXMgYWxyZWFkeSByZXF1ZXN0ZWRcbiIsCisgICAgICAgICAgICAgICBleHRyYV9hcmcsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoYWRkcmVzcykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJfZGVzY3JpcHRvcnMgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFkZHJfZmQpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgcHJpbnRpbmcgYWRkcmVzcyB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChhZGRyX2ZkKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja190d29fcGlkX2Rlc2NyaXB0b3JzIChjb25zdCBEQnVzU3RyaW5nICpwaWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpleHRyYV9hcmcpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGlkX2ZkKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IHByaW50aW5nIHBpZCB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChwaWRfZmQpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfcmVsb2FkX3dhdGNoIChEQnVzV2F0Y2ggICAgKndhdGNoLAorCQkgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisJCSAgICAgdm9pZCAgICAgICAgICpkYXRhKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICphY3Rpb25fc3RyOworICBjaGFyIGFjdGlvbiA9ICdcMCc7CisKKyAgd2hpbGUgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIGlmICgocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXS5mZCA+IDApICYmCisgICAgICBfZGJ1c19yZWFkX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSwgJnN0ciwgMSkgIT0gMSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGRuJ3QgcmVhZCBmcm9tIHJlbG9hZCBwaXBlLlxuIik7CisgICAgICBjbG9zZV9yZWxvYWRfcGlwZSAoJndhdGNoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBhY3Rpb25fc3RyID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKTsKKyAgaWYgKGFjdGlvbl9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBhY3Rpb24gPSBhY3Rpb25fc3RyWzBdOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIHRoaXMgY2FuIG9ubHkgZmFpbCBpZiB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoZSBjb25maWcgZmlsZQorICAgKiBvciBPT00uICBFaXRoZXIgd2F5IHdlIHNob3VsZCBqdXN0IHN0aWNrIHdpdGggdGhlIGN1cnJlbnRseQorICAgKiBsb2FkZWQgY29uZmlnLgorICAgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICBjYXNlIEFDVElPTl9SRUxPQUQ6CisgICAgICBpZiAoISBidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChjb250ZXh0LCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9GQUlMRUQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSk7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZWxvYWQgY29uZmlndXJhdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUNUSU9OX1FVSVQ6CisgICAgICB7CisgICAgICAgIERCdXNMb29wICpsb29wOworICAgICAgICAvKgorICAgICAgICAgKiBPbiBPU3Mgd2l0aG91dCBhYnN0cmFjdCBzb2NrZXRzLCB3ZSB3YW50IHRvIHF1aXQKKyAgICAgICAgICogZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBiZWluZyBraWxsZWQgYnkgU0lHVEVSTSwKKyAgICAgICAgICogc28gdGhhdCBEQnVzU2VydmVyIGdldHMgYSBjaGFuY2UgdG8gY2xlYW4gdXAgdGhlCisgICAgICAgICAqIHNvY2tldHMgZnJvbSB0aGUgZmlsZXN5c3RlbS4gZmQubyAjMzg2NTYKKyAgICAgICAgICovCisgICAgICAgIGxvb3AgPSBidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCk7CisgICAgICAgIGlmIChsb29wICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfbG9vcF9xdWl0IChsb29wKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9yZWxvYWRfcGlwZSAoREJ1c0xvb3AgKmxvb3ApCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1dhdGNoICp3YXRjaDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zb2NrZXRwYWlyICgmcmVsb2FkX3BpcGVbMF0sICZyZWxvYWRfcGlwZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gY3JlYXRlIHJlbG9hZCBwaXBlOiAlc1xuIiwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3JlbG9hZF93YXRjaCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgcmVsb2FkIHdhdGNoOiAlc1xuIiwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoIV9kYnVzX2xvb3BfYWRkX3dhdGNoIChsb29wLCB3YXRjaCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcDogJXNcbiIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX3JlbG9hZF9waXBlIChEQnVzV2F0Y2ggKip3YXRjaCkKK3sKKyAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLCAqd2F0Y2gpOworICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKCp3YXRjaCk7CisgICAgX2RidXNfd2F0Y2hfdW5yZWYgKCp3YXRjaCk7CisgICAgKndhdGNoID0gTlVMTDsKKworICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSwgTlVMTCk7CisgICAgX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKCZyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdKTsKKworICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0sIE5VTEwpOworICAgIF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlICgmcmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0pOworfQorI2VuZGlmIC8qIERCVVNfVU5JWCAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNTdHJpbmcgYWRkcl9mZDsKKyAgREJ1c1N0cmluZyBwaWRfZmQ7CisgIGNvbnN0IGNoYXIgKnByZXZfYXJnOworICBEQnVzUGlwZSBwcmludF9hZGRyX3BpcGU7CisgIERCdXNQaXBlIHByaW50X3BpZF9waXBlOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgcHJpbnRfYWRkcmVzczsKKyAgZGJ1c19ib29sX3QgcHJpbnRfcGlkOworICBCdXNDb250ZXh0RmxhZ3MgZmxhZ3M7CisjaWZkZWYgREJVU19VTklYCisgIGNvbnN0IGNoYXIgKmVycm9yX3N0cjsKKworICAvKiBSZWRpcmVjdCBzdGRpbiBmcm9tIC9kZXYvbnVsbCBzaW5jZSB3ZSB3aWxsIG5ldmVyIG5lZWQgaXQsIGFuZAorICAgKiByZWRpcmVjdCBzdGRvdXQgYW5kIHN0ZGVyciB0byAvZGV2L251bGwgaWYgbm90IGFscmVhZHkgb3Blbi4KKyAgICoKKyAgICogV2Ugc2hvdWxkIGRvIHRoaXMgYXMgdGhlIHZlcnkgZmlyc3QgdGhpbmcsIHRvIGVuc3VyZSB0aGF0IHdoZW4gd2UKKyAgICogY3JlYXRlIG90aGVyIGZpbGUgZGVzY3JpcHRvcnMgKGZvciBleGFtcGxlIGZvciBlcG9sbCwgaW5vdGlmeSBvcgorICAgKiBhIHNvY2tldCksIHRoZXkgbmV2ZXIgZ2V0IGFzc2lnbmVkIGFzIGZkIDAsIDEgb3IgMi4gSWYgdGhleSB3ZXJlLAorICAgKiB3aGljaCBjb3VsZCBoYXBwZW4gaWYgb3VyIGNhbGxlciBoYWQgKGluY29ycmVjdGx5KSBjbG9zZWQgdGhvc2UKKyAgICogc3RhbmRhcmQgZmRzLCB0aGV5J2QgZ2V0IGNsb3NlZCB3aGVuIHdlIGRhZW1vbml6ZSAtIGZvciBleGFtcGxlLAorICAgKiBjbG9zaW5nIG91ciBsaXN0ZW5pbmcgc29ja2V0IHdvdWxkIHN0b3AgdXMgbGlzdGVuaW5nLCBhbmQgY2xvc2luZworICAgKiBhIExpbnV4IGVwb2xsIHNvY2tldCB3b3VsZCBjYXVzZSB0aGUgbWFpbiBsb29wIHRvIGZhaWwuICovCisgIGlmICghX2RidXNfZW5zdXJlX3N0YW5kYXJkX2ZkcyAoREJVU19GT1JDRV9TVERJTl9OVUxMLCAmZXJyb3Jfc3RyKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiZGJ1cy1kYWVtb246IGZhdGFsIGVycm9yIHNldHRpbmcgdXAgc3RhbmRhcmQgZmRzOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvcl9zdHIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJfZmQpKQorICAgIHJldHVybiAxOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWRfZmQpKQorICAgIHJldHVybiAxOworCisgIHByaW50X2FkZHJlc3MgPSBGQUxTRTsKKyAgcHJpbnRfcGlkID0gRkFMU0U7CisKKyAgZmxhZ3MgPSBCVVNfQ09OVEVYVF9GTEFHX1dSSVRFX1BJRF9GSUxFOworCisgIHByZXZfYXJnID0gTlVMTDsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlICgpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tdmVyc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB2ZXJzaW9uICgpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0taW50cm9zcGVjdCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpbnRyb3NwZWN0ICgpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tbm9mb3JrIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzICY9IH5CVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTOworICAgICAgICAgIGZsYWdzIHw9IEJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUjsKKyAgICAgICAgfQorI2lmZGVmIERCVVNfVU5JWAorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWZvcmsiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgJj0gfkJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUjsKKyAgICAgICAgICBmbGFncyB8PSBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtZC1hY3RpdmF0aW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzIHw9IEJVU19DT05URVhUX0ZMQUdfU1lTVEVNRF9BQ1RJVkFUSU9OOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1ub3BpZGZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgJj0gfkJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAic3lzdGVtIik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2FwcGVuZF9zeXN0ZW1fY29uZmlnX2ZpbGUgKCZjb25maWdfZmlsZSkpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXNlc3Npb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAic2Vzc2lvbiIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoJmNvbmZpZ19maWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tY29uZmlnLWZpbGU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZmlsZTsKKworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgImNvbmZpZy1maWxlIik7CisKKyAgICAgICAgICBmaWxlID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytmaWxlOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIGZpbGUpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1jb25maWctZmlsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fY29uZmlnX2ZpbGVzICgmY29uZmlnX2ZpbGUsICJjb25maWctZmlsZSIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWNvbmZpZy1maWxlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdhaXQgZm9yIG5leHQgYXJnICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1hZGRyZXNzPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmaWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWFkZHJlc3MiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogd2FpdCBmb3IgbmV4dCBhcmcgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXByaW50LWFkZHJlc3M9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGVzYzsKKworICAgICAgICAgIGNoZWNrX3R3b19hZGRyX2Rlc2NyaXB0b3JzICgmYWRkcl9mZCwgInByaW50LWFkZHJlc3MiKTsKKworICAgICAgICAgIGRlc2MgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2Rlc2M7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyX2ZkLCBkZXNjKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworCisgICAgICAgICAgcHJpbnRfYWRkcmVzcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1wcmludC1hZGRyZXNzIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19hZGRyX2Rlc2NyaXB0b3JzICgmYWRkcl9mZCwgInByaW50LWFkZHJlc3MiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJfZmQsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X2FkZHJlc3MgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tcHJpbnQtYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9hZGRyZXNzID0gVFJVRTsgLyogYW5kIHdlJ2xsIGdldCB0aGUgbmV4dCBhcmcgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXByaW50LXBpZD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpkZXNjOworCisgICAgICAgICAgY2hlY2tfdHdvX3BpZF9kZXNjcmlwdG9ycyAoJnBpZF9mZCwgInByaW50LXBpZCIpOworCisgICAgICAgICAgZGVzYyA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZGVzYzsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZF9mZCwgZGVzYykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X3BpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1wcmludC1waWQiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX3BpZF9kZXNjcmlwdG9ycyAoJnBpZF9mZCwgInByaW50LXBpZCIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcGlkX2ZkLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisKKyAgICAgICAgICBwcmludF9waWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tcHJpbnQtcGlkIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50X3BpZCA9IFRSVUU7IC8qIGFuZCB3ZSdsbCBnZXQgdGhlIG5leHQgYXJnIGlmIGFwcHJvcHJpYXRlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlICgpOworICAgICAgICB9CisKKyAgICAgIHByZXZfYXJnID0gYXJnOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvbmZpZ19maWxlKSA9PSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk5vIGNvbmZpZ3VyYXRpb24gZmlsZSBzcGVjaWZpZWQuXG4iKTsKKyAgICAgIHVzYWdlICgpOworICAgIH0KKworICBfZGJ1c19waXBlX2ludmFsaWRhdGUgKCZwcmludF9hZGRyX3BpcGUpOworICBpZiAocHJpbnRfYWRkcmVzcykKKyAgICB7CisgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICgmcHJpbnRfYWRkcl9waXBlKTsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmFkZHJfZmQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgdmFsOworICAgICAgICAgIGludCBlbmQ7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmYWRkcl9mZCwgMCwgJnZhbCwgJmVuZCkgfHwKKyAgICAgICAgICAgICAgZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYWRkcl9mZCkgfHwKKyAgICAgICAgICAgICAgdmFsIDwgMCB8fCB2YWwgPiBfREJVU19JTlRfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhZGRyX2ZkKSk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfcGlwZV9pbml0ICgmcHJpbnRfYWRkcl9waXBlLCB2YWwpOworICAgICAgICB9CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJfZmQpOworCisgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAoJnByaW50X3BpZF9waXBlKTsKKyAgaWYgKHByaW50X3BpZCkKKyAgICB7CisgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICgmcHJpbnRfcGlkX3BpcGUpOworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkX2ZkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIHZhbDsKKyAgICAgICAgICBpbnQgZW5kOworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJnBpZF9mZCwgMCwgJnZhbCwgJmVuZCkgfHwKKyAgICAgICAgICAgICAgZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkX2ZkKSB8fAorICAgICAgICAgICAgICB2YWwgPCAwIHx8IHZhbCA+IF9EQlVTX0lOVF9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBpZF9mZCkpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3BpcGVfaW5pdCAoJnByaW50X3BpZF9waXBlLCB2YWwpOworICAgICAgICB9CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZF9mZCk7CisKKyAgaWYgKCFidXNfc2VsaW51eF9wcmVfaW5pdCAoKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiU0VMaW51eCBwcmUtaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoIWJ1c19hcHBhcm1vcl9wcmVfaW5pdCAoKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQXBwQXJtb3IgcHJlLWluaXRpYWxpemF0aW9uIGZhaWxlZDogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3ICgmY29uZmlnX2ZpbGUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbnRfYWRkcl9waXBlLCAmcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZhZGRyZXNzKSA+IDAgPyAmYWRkcmVzcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogYnVzX2NvbnRleHRfbmV3KCkgY2xvc2VzIHRoZSBwcmludF9hZGRyX3BpcGUgYW5kCisgICAqIHByaW50X3BpZF9waXBlCisgICAqLworCisjaWZkZWYgREJVU19VTklYCisgIHNldHVwX3JlbG9hZF9waXBlIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCkpOworCisgIC8qIFBPU0lYIHNpZ25hbHMgYXJlIFVuaXgtc3BlY2lmaWMsIGFuZCBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgaXMKKyAgICogdW5pbXBsZW1lbnRlZCAoYW5kIHByb2JhYmx5IHVuaW1wbGVtZW50YWJsZSkgb24gV2luZG93cywgc28gdGhlcmUncworICAgKiBubyBwb2ludCBpbiB0cnlpbmcgdG8gbWFrZSB0aGUgaGFuZGxlciBwb3J0YWJsZSB0byBub24tVW5peC4gKi8KKworICBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKFNJR1RFUk0sIHNpZ25hbF9oYW5kbGVyKTsKKyAgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChTSUdIVVAsIHNpZ25hbF9oYW5kbGVyKTsKKyNlbmRpZiAvKiBEQlVTX1VOSVggKi8KKworICBfZGJ1c192ZXJib3NlICgiV2UgYXJlIG9uIEQtQnVzLi4uXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSk7CisKKyAgYnVzX2NvbnRleHRfc2h1dGRvd24gKGNvbnRleHQpOworICBidXNfY29udGV4dF91bnJlZiAoY29udGV4dCk7CisgIGJ1c19zZWxpbnV4X3NodXRkb3duICgpOworICBidXNfYXBwYXJtb3Jfc2h1dGRvd24gKCk7CisgIGJ1c19hdWRpdF9zaHV0ZG93biAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1cy9tZXNzYWdlYnVzLWNvbmZpZy5pbiBiL2J1cy9tZXNzYWdlYnVzLWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ1OWRjCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL21lc3NhZ2VidXMtY29uZmlnLmluCkBAIC0wLDAgKzEsMTc4IEBACisjIS9iaW4vc2gKKyMKKyMgbWVzc2FnZWJ1cy1jb25maWcsIENvcHlyaWdodCAyMDA5IFlhYWtvdiBTZWxrb3dpdHoKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEN5Z3dpbiBwb3J0IG9mIGRidXMuCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBJbml0aWFsaXphdGlvbgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQUk9HTkFNRT0kKGJhc2VuYW1lICQwKQorX3RkaXI9JChkaXJuYW1lICQwKQorUFJPR0RJUj0kKGNkICRfdGRpciAmJiBwd2QpCisKK0NTSUhfU0NSSVBUPS91c3Ivc2hhcmUvY3NpaC9jeWd3aW4tc2VydmljZS1pbnN0YWxsYXRpb24taGVscGVyLnNoCisKKyMgU3ViZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQKK1BSRUZJWD1AcHJlZml4QAorCisjIERpcmVjdG9yeSB3aGVyZSB0aGUgY29uZmlnIGZpbGVzIGFyZSBzdG9yZWQKK1NZU0NPTkZESVI9QHN5c2NvbmZkaXJAL2RidXMtMQorREVWRElSPS9kZXYKK0xPR0RJUj0vdmFyL2xvZworUlVORElSPSQoZGlybmFtZSBAREJVU19TWVNURU1fUElEX0ZJTEVAKQorU09DS0RJUj0kKGRpcm5hbWUgQERCVVNfU1lTVEVNX1NPQ0tFVEApCisKK3NvdXJjZSAke0NTSUhfU0NSSVBUfQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUm91dGluZTogaW5zdGFsbF9zZXJ2aWNlCisjICAgSW5zdGFsbCBtZXNzYWdlYnVzIGFzIGEgc2VydmljZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnN0YWxsX3NlcnZpY2UoKSB7CisKKyAgaWYgY3NpaF9pc19udAorICB0aGVuCisKKyAgICAjIENoZWNrIGlmIG1lc3NhZ2VidXMgaXMgaW5zdGFsbGVkIGFuZCByZW1vdmUgb24gdXNlciByZXF1ZXN0LgorICAgIGlmIGN5Z3J1bnNydiAtUSBtZXNzYWdlYnVzID4gL2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisgICAgICBjc2loX3dhcm5pbmcgIlRoZSBtZXNzYWdlYnVzIHNlcnZpY2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIgorICAgICAgZWNobworICAgICAgaWYgY3NpaF9yZXF1ZXN0ICJEbyB5b3Ugd2FudCB0byByZWluc3RhbGwgaXQgd2l0aCBkaWZmZXJlbnQgYXJncz8iCisgICAgICB0aGVuCisgICAgICAgIGN5Z3J1bnNydiAtRSBtZXNzYWdlYnVzCisgICAgICAgIGN5Z3J1bnNydiAtUiBtZXNzYWdlYnVzCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIEluc3RhbGwgbWVzc2FnZWJ1cyBzZXJ2aWNlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZAorICAgIGlmICEgY3lncnVuc3J2IC1RIG1lc3NhZ2VidXMgPiAvZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIGVjaG8KKyAgICAgIGNzaWhfd2FybmluZyAiVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXF1aXJlcyBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMhIgorICAgICAgaWYgY3NpaF9yZXF1ZXN0ICJEbyB5b3Ugd2FudCB0byBpbnN0YWxsIG1lc3NhZ2VidXMgYXMgc2VydmljZT8iCisgICAgICB0aGVuCisgICAgICAgIGlmIGN5Z3J1bnNydiAtSSBtZXNzYWdlYnVzIC1kICJDWUdXSU4gRC1CdXMgc3lzdGVtIHNlcnZpY2UiIC1wIEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC1hICItLW5vZm9yayAtLXN5c3RlbSIKKyAgICAgICAgdGhlbgorCSAgZWNobworCSAgY3NpaF9pbmZvcm0gIlRoZSBtZXNzYWdlYnVzIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIHVuZGVyIHRoZSBMb2NhbFN5c3RlbSIKKwkgIGNzaWhfaW5mb3JtICJhY2NvdW50IChhbHNvIGtub3duIGFzIFNZU1RFTSkuIFRvIHN0YXJ0IHRoZSBzZXJ2aWNlIG5vdywgY2FsbCIKKyAgICAgICAgICBjc2loX2luZm9ybSAiXGBuZXQgc3RhcnQgbWVzc2FnZWJ1cycgb3IgXGBjeWdydW5zcnYgLVMgbWVzc2FnZWJ1cycuIE90aGVyd2lzZSwgaXQiCisgICAgICAgICAgY3NpaF9pbmZvcm0gIndpbGwgc3RhcnQgYXV0b21hdGljYWxseSBhZnRlciB0aGUgbmV4dCByZWJvb3QuIgorCSAgZWNobworCSAgY3NpaF9pbmZvcm0gIkNoZWNrICR7U1lTQ09ORkRJUn0vc3lzdGVtLmNvbmYgZmlyc3QsIGlmIGl0IHN1aXRzIHlvdXIgbmVlZHMuIgorICAgICAgICBmaQorICAgICAgZmkgIyB1c2VyIGFsbG93ZWQgdXMgdG8gaW5zdGFsbCBtZXNzYWdlYnVzCisgICAgZmkgIyBtZXNzYWdlYnVzIGFscmVhZHkgaW5zdGFsbGVkCisgIGZpICMgY3NpaF9pc19udAorfSAjIC0tLSBFbmQgb2YgaW5zdGFsbF9zZXJ2aWNlIC0tLSAjCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE1haW4gRW50cnkgUG9pbnQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyMgQ2hlY2sgaG93IHRoZSBzY3JpcHQgaGFzIGJlZW4gc3RhcnRlZC4gIElmCisjICAgKDEpIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgZ2l2aW5nIHRoZSBmdWxsIHBhdGggYW5kCisjICAgICAgIHRoYXQgcGF0aCBpcyAvZXRjL3Bvc3RpbnN0YWxsLCBPUgorIyAgICgyKSBPdGhlcndpc2UsIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorIyAgICAgICBDT05GSUdfQVVUT19BTlNXRVJfTk8gaXMgc2V0CisjIHRoZW4gc2V0IGF1dG9fYW5zd2VyIHRvICJubyIuICBUaGlzIGFsbG93cyBhdXRvbWF0aWMKKyMgY3JlYXRpb24gb2YgdGhlIGNvbmZpZyBmaWxlcyBpbiAvZXRjIHcvbyBvdmVyd3JpdGluZworIyB0aGVtIGlmIHRoZXkgYWxyZWFkeSBleGlzdC4gIEluIGJvdGggY2FzZXMsIGNvbG9yCisjIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHByZXNzZWQsIHNvIGFzIHRvIHByZXZlbnQKKyMgY2x1dHRlcmluZyBzZXR1cCdzIGxvZ2ZpbGVzLgoraWYgWyAiJFBST0dESVIiID0gIi9ldGMvcG9zdGluc3RhbGwiIF0KK3RoZW4KKyAgY3NpaF9hdXRvX2Fuc3dlcj0ibm8iCisgIGNzaWhfZGlzYWJsZV9jb2xvcgorZmkKK2lmIFsgLW4gIiR7Q09ORklHX0FVVE9fQU5TV0VSX05PfSIgXQordGhlbgorICBjc2loX2F1dG9fYW5zd2VyPSJubyIKKyAgY3NpaF9kaXNhYmxlX2NvbG9yCitmaQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQYXJzZSBvcHRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3doaWxlIDoKK2RvCisgIGNhc2UgJCMgaW4KKyAgMCkKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKKworICBvcHRpb249JDEKKyAgc2hpZnQKKworICBjYXNlICIkb3B0aW9uIiBpbgorICAtZCB8IC0tZGVidWcgKQorICAgIHNldCAteAorICAgIGNzaWhfdHJhY2Vfb24KKyAgICA7OworCisgIC15IHwgLS15ZXMgKQorICAgIGNzaWhfYXV0b19hbnN3ZXI9eWVzCisgICAgOzsKKworICAtbiB8IC0tbm8gKQorICAgIGNzaWhfYXV0b19hbnN3ZXI9bm8KKyAgICA7OworCisgICopCisgICAgZWNobyAidXNhZ2U6ICR7UFJPR05BTUV9IFtPUFRJT05dLi4uIgorICAgIGVjaG8KKyAgICBlY2hvICJUaGlzIHNjcmlwdCBjcmVhdGVzIGEgYmFzaWMgbWVzc2FnZWJ1cyBjb25maWd1cmF0aW9uLiIKKyAgICBlY2hvCisgICAgZWNobyAiT3B0aW9uczoiCisgICAgZWNobyAiICAgIC0tZGVidWcgIC1kICAgICBFbmFibGUgc2hlbGwncyBkZWJ1ZyBvdXRwdXQuIgorICAgIGVjaG8gIiAgICAtLXllcyAgICAteSAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcInllc1wiIGF1dG9tYXRpY2FsbHkuIgorICAgIGVjaG8gIiAgICAtLW5vICAgICAtbiAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcIm5vXCIgYXV0b21hdGljYWxseS4iCisgICAgZWNobworICAgIGV4aXQgMQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQWN0aW9uIQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQ2hlY2sgZm9yICR7U1lTQ09ORkRJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke1NZU0NPTkZESVJ9IiAiQ2Fubm90IGNyZWF0ZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcy4iCitjaG1vZCA3NzUgIiR7U1lTQ09ORkRJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtTWVNDT05GRElSfSIKKworIyBDaGVjayBmb3IgJHtERVZESVJ9IGRpcmVjdG9yeQorY3NpaF9tYWtlX2RpciAiJHtERVZESVJ9IiAiU3lzbG9nZ2luZyB1c2luZyBtZXNzYWdlYnVzIHdpbGwgbm90IHdvcmsuIgorY2htb2QgNzc1ICIke0RFVkRJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtERVZESVJ9IgorCisjIENoZWNrIGZvciAke0xPR0RJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke0xPR0RJUn0iICJTeXNsb2dnaW5nIHVzaW5nIG1lc3NhZ2VidXMgd2lsbCBub3Qgd29yay4iCitjaG1vZCA3NzUgIiR7TE9HRElSfSIKK3NldGZhY2wgLW0gdTpzeXN0ZW06cnd4ICIke0xPR0RJUn0iCisKKyMgQ2hlY2sgZm9yICR7UlVORElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7UlVORElSfSIgIlBJRCBmaWxlcyBvZiBydW5uaW5nIHByb2Nlc3NlcyB3aWxsIG5vdCBiZSBjcmVhdGVkLiIKK2NobW9kIDc3NSAiJHtSVU5ESVJ9Igorc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7UlVORElSfSIKKworIyBDaGVjayBmb3IgJHtTT0NLRElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7U09DS0RJUn0iICJTT0NLRVQgZmlsZXMgb2YgcnVubmluZyBwcm9jZXNzZXMgd2lsbCBub3QgYmUgY3JlYXRlZC4iCitjaG1vZCA3NzUgIiR7U09DS0RJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtTT0NLRElSfSIKKworIyBtYXliZTogY3NpaF9hdXRvX2Fuc3dlcj1ubyB3aWxsIHNraXAsCisjIGludGVyYWN0aXZlIHVzZXIgd2lsbCBnZXQgYSBjaGFuY2UgdG8gb3ZlcnJpZGUKK2luc3RhbGxfc2VydmljZQorCisKK2VjaG8KK2VjaG8gIkNvbmZpZ3VyYXRpb24gZmluaXNoZWQuIEhhdmUgZnVuISIKZGlmZiAtLWdpdCBhL2J1cy9tZXNzYWdlYnVzLmluIGIvYnVzL21lc3NhZ2VidXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyZWUwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9tZXNzYWdlYnVzLmluCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaAorIworIyBtZXNzYWdlYnVzOiAgIFRoZSBELUJVUyBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisjCisjIGNoa2NvbmZpZzogMzQ1IDIyIDg1CisjIGRlc2NyaXB0aW9uOiAgVGhpcyBpcyBhIGRhZW1vbiB3aGljaCBicm9hZGNhc3RzIG5vdGlmaWNhdGlvbnMgb2Ygc3lzdGVtIGV2ZW50cyBcCisjICAgICAgICAgICAgICAgYW5kIG90aGVyIG1lc3NhZ2VzLiBTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KKyMKKyMgcHJvY2Vzc25hbWU6IGRidXMtZGFlbW9uCisjIHBpZGZpbGU6IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyMKKyMjIyBCRUdJTiBJTklUIElORk8KKyMgUHJvdmlkZXM6IG1lc3NhZ2VidXMKKyMgUmVxdWlyZWQtU3RhcnQ6ICRzeXNsb2cgJGxvY2FsX2ZzCisjIFJlcXVpcmVkLVN0b3A6ICRzeXNsb2cgJGxvY2FsX2ZzCisjIERlZmF1bHQtU3RhcnQ6IDIgMyA0IDUKKyMgRGVmYXVsdC1TdG9wOiAwIDEgNgorIyBTaG9ydC1EZXNjcmlwdGlvbjogVGhlIEQtQnVzIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMKKyMgRGVzY3JpcHRpb246IFRoaXMgaXMgYSBkYWVtb24gd2hpY2ggYnJvYWRjYXN0cyBub3RpZmljYXRpb25zIG9mIHN5c3RlbSAKKyMgIGV2ZW50cyBhbmQgb3RoZXIgbWVzc2FnZXMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzCisjIyMgRU5EIElOSVQgSU5GTworCisjIFNhbml0eSBjaGVja3MuCitbIC14IEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIF0gfHwgZXhpdCAwCisKKyMgU291cmNlIGZ1bmN0aW9uIGxpYnJhcnkuCisuIEBFWFBBTkRFRF9TWVNDT05GRElSQC9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBzbyB3ZSBjYW4gcmVhcnJhbmdlIHRoaXMgZWFzaWx5Citwcm9jZXNzbmFtZT1kYnVzLWRhZW1vbgorc2VydmljZW5hbWU9bWVzc2FnZWJ1cworCitSRVRWQUw9MAorCitzdGFydCgpIHsKKyAgICBlY2hvIC1uICQiU3RhcnRpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzOiAiCisgICAgaWYgWyAteCBARVhQQU5ERURfQklORElSQC9kYnVzLXV1aWRnZW4gXSA7IHRoZW4KKyAgICAgICAgQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCisgICAgZmkKKworICAgIGRhZW1vbiAtLWNoZWNrICRzZXJ2aWNlbmFtZSAkcHJvY2Vzc25hbWUgLS1zeXN0ZW0KKyAgICBSRVRWQUw9JD8KKyAgICBlY2hvCisgICAgWyAkUkVUVkFMIC1lcSAwIF0gJiYgdG91Y2ggQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZQorfQorCitzdG9wKCkgeworICAgIGVjaG8gLW4gJCJTdG9wcGluZyBzeXN0ZW0gbWVzc2FnZSBidXM6ICIKKworICAgICMjIHdlIGRvbid0IHdhbnQgdG8ga2lsbCBhbGwgdGhlIHBlci11c2VyICRwcm9jZXNzbmFtZSwgd2Ugd2FudAorICAgICMjIHRvIHVzZSB0aGUgcGlkIGZpbGUgKm9ubHkqOyBiZWNhdXNlIHdlIHVzZSB0aGUgZmFrZSBub25leGlzdGVudCAKKyAgICAjIyBwcm9ncmFtIG5hbWUgIiRzZXJ2aWNlbmFtZSIgdGhhdCBzaG91bGQgYmUgc2FmZS1pc2gKKyAgICBraWxscHJvYyAkc2VydmljZW5hbWUgLVRFUk0KKyAgICBSRVRWQUw9JD8KKyAgICBlY2hvCisgICAgaWYgWyAkUkVUVkFMIC1lcSAwIF07IHRoZW4KKyAgICAgICAgcm0gLWYgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZQorICAgICAgICBybSAtZiBAREJVU19TWVNURU1fUElEX0ZJTEVACisgICAgZmkKK30KKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgICAgc3RhcnQpCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgc3RvcCkKKyAgICAgICAgc3RvcAorICAgICAgICA7OworICAgIHN0YXR1cykKKyAgICAgICAgc3RhdHVzICRzZXJ2aWNlbmFtZQorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICByZXN0YXJ0KQorICAgICAgICBzdG9wCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgY29uZHJlc3RhcnQpCisgICAgICAgIGlmIFsgLWYgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZSBdOyB0aGVuCisgICAgICAgICAgICBzdG9wCisgICAgICAgICAgICBzdGFydAorICAgICAgICBmaQorICAgICAgICA7OworICAgIHJlbG9hZCkKKyAgICAgICAgZWNobyAiTWVzc2FnZSBidXMgY2FuJ3QgcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uLCB5b3UgaGF2ZSB0byByZXN0YXJ0IGl0IgorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBlY2hvICQiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXR1c3xyZXN0YXJ0fGNvbmRyZXN0YXJ0fHJlbG9hZH0iCisgICAgICAgIDs7Citlc2FjCitleGl0ICRSRVRWQUwKZGlmZiAtLWdpdCBhL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluIGIvYnVzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZjM3MAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5MYWJlbDwva2V5PgorCTxzdHJpbmc+b3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbjwvc3RyaW5nPgorCisJPGtleT5TZXJ2aWNlSVBDPC9rZXk+CisJPHRydWUvPgorCisJPCEtLSBQbGVhc2UgdW5jb21tZW50IG9uIDEwLjQ7IE9uRGVtYW5kIGRvZXNuJ3Qgd29yayBwcm9wZXJseSB0aGVyZS4gLS0+CisJPCEtLQorCTxrZXk+T25EZW1hbmQ8L2tleT4KKwk8ZmFsc2UgLz4KKwktLT4KKworCTxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5AREJVU19EQUVNT05ESVJAL2RidXMtZGFlbW9uPC9zdHJpbmc+CisJCTxzdHJpbmc+LS1ub2Zvcms8L3N0cmluZz4KKwkJPHN0cmluZz4tLXNlc3Npb248L3N0cmluZz4KKwk8L2FycmF5PgorCisJPGtleT5Tb2NrZXRzPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+dW5peF9kb21haW5fbGlzdGVuZXI8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PlNlY3VyZVNvY2tldFdpdGhLZXk8L2tleT4KKwkJCTxzdHJpbmc+REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJPC9kaWN0PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2J1cy9wb2xpY3kuYyBiL2J1cy9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJmMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3BvbGljeS5jCkBAIC0wLDAgKzEsMTMxMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBwb2xpY3kuYyAgQnVzIHNlY3VyaXR5IHBvbGljeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCitCdXNQb2xpY3lSdWxlKgorYnVzX3BvbGljeV9ydWxlX25ldyAoQnVzUG9saWN5UnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGFsbG93KQoreworICBCdXNQb2xpY3lSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c1BvbGljeVJ1bGUsIDEpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJ1bGUtPnR5cGUgPSB0eXBlOworICBydWxlLT5yZWZjb3VudCA9IDE7CisgIHJ1bGUtPmFsbG93ID0gYWxsb3c7CisKKyAgc3dpdGNoIChydWxlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworCisgICAgICAvKiBhbGxvdyBydWxlcyBkZWZhdWx0IHRvIFRSVUUgKG9ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYWxsb3dlZCkKKyAgICAgICAqIGRlbnkgcnVsZXMgZGVmYXVsdCB0byBGQUxTRSAob25seSB1bnJlcXVlc3RlZCByZXBsaWVzIGRlbmllZCkKKyAgICAgICAqLworICAgICAgcnVsZS0+ZC5zZW5kLnJlcXVlc3RlZF9yZXBseSA9IHJ1bGUtPmFsbG93OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgLyogYWxsb3cgcnVsZXMgZGVmYXVsdCB0byBUUlVFIChvbmx5IHJlcXVlc3RlZCByZXBsaWVzIGFsbG93ZWQpCisgICAgICAgKiBkZW55IHJ1bGVzIGRlZmF1bHQgdG8gRkFMU0UgKG9ubHkgdW5yZXF1ZXN0ZWQgcmVwbGllcyBkZW5pZWQpCisgICAgICAgKi8KKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgPSBydWxlLT5hbGxvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIHJldHVybiBydWxlOworfQorCitCdXNQb2xpY3lSdWxlICoKK2J1c19wb2xpY3lfcnVsZV9yZWYgKEJ1c1BvbGljeVJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBydWxlOworfQorCit2b2lkCitidXNfcG9saWN5X3J1bGVfdW5yZWYgKEJ1c1BvbGljeVJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCAtPSAxOworICAKKyAgaWYgKHJ1bGUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgc3dpdGNoIChydWxlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1NFTkQ6CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQucGF0aCk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQuaW50ZXJmYWNlKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5tZW1iZXIpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLmVycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1JFQ0VJVkU6CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUucGF0aCk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLmVycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9PV046CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9HUk9VUDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHJ1bGUpOworICAgIH0KK30KKworc3RydWN0IEJ1c1BvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKmRlZmF1bHRfcnVsZXM7ICAgICAgICAgLyoqPCBEZWZhdWx0IHBvbGljeSBydWxlcyAqLworICBEQnVzTGlzdCAqbWFuZGF0b3J5X3J1bGVzOyAgICAgICAvKio8IE1hbmRhdG9yeSBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0hhc2hUYWJsZSAqcnVsZXNfYnlfdWlkOyAgICAgLyoqPCBwZXItVUlEIHBvbGljeSBydWxlcyAqLworICBEQnVzSGFzaFRhYmxlICpydWxlc19ieV9naWQ7ICAgICAvKio8IHBlci1HSUQgcG9saWN5IHJ1bGVzICovCisgIERCdXNMaXN0ICphdF9jb25zb2xlX3RydWVfcnVsZXM7IC8qKjwgY29uc29sZSB1c2VyIHBvbGljeSBydWxlcyB3aGVyZSBhdF9jb25zb2xlPSJ0cnVlIiovCisgIERCdXNMaXN0ICphdF9jb25zb2xlX2ZhbHNlX3J1bGVzOyAvKio8IGNvbnNvbGUgdXNlciBwb2xpY3kgcnVsZXMgd2hlcmUgYXRfY29uc29sZT0iZmFsc2UiKi8KK307CisKK3N0YXRpYyB2b2lkCitmcmVlX3J1bGVfZnVuYyAodm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBkYXRhOworCisgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3J1bGVfbGlzdF9mdW5jICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqKmxpc3QgPSBkYXRhOworCisgIGlmIChsaXN0ID09IE5VTEwpIC8qIERCdXNIYXNoVGFibGUgaXMgb24gY3JhY2sgKi8KKyAgICByZXR1cm47CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKGxpc3QsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKGxpc3QpOworCisgIGRidXNfZnJlZSAobGlzdCk7Cit9CisKK0J1c1BvbGljeSoKK2J1c19wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c1BvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKyAgCisgIHBvbGljeS0+cnVsZXNfYnlfdWlkID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3J1bGVfbGlzdF9mdW5jKTsKKyAgaWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcG9saWN5LT5ydWxlc19ieV9naWQgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcnVsZV9saXN0X2Z1bmMpOworICBpZiAocG9saWN5LT5ydWxlc19ieV9naWQgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR1cm4gcG9saWN5OworICAKKyBmYWlsZWQ6CisgIGJ1c19wb2xpY3lfdW5yZWYgKHBvbGljeSk7CisgIHJldHVybiBOVUxMOworfQorCitCdXNQb2xpY3kgKgorYnVzX3BvbGljeV9yZWYgKEJ1c1BvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBvbGljeTsKK30KKwordm9pZAorYnVzX3BvbGljeV91bnJlZiAoQnVzUG9saWN5ICpwb2xpY3kpCit7CisgIF9kYnVzX2Fzc2VydCAocG9saWN5LT5yZWZjb3VudCA+IDApOworCisgIHBvbGljeS0+cmVmY291bnQgLT0gMTsKKworICBpZiAocG9saWN5LT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMpOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+YXRfY29uc29sZV90cnVlX3J1bGVzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzLCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzKTsKKworICAgICAgaWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocG9saWN5LT5ydWxlc19ieV91aWQpOworICAgICAgICAgIHBvbGljeS0+cnVsZXNfYnlfdWlkID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAocG9saWN5LT5ydWxlc19ieV9naWQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCk7CisgICAgICAgICAgcG9saWN5LT5ydWxlc19ieV9naWQgPSBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2xpc3RfdG9fY2xpZW50IChEQnVzTGlzdCAgICAgICAgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICBCdXNDbGllbnRQb2xpY3kgICpjbGllbnQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICAgICAgLyogVGhlc2UgYXJlbid0IHBlci1jb25uZWN0aW9uIHBvbGljaWVzICovCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfT1dOOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9TRU5EOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFOgorICAgICAgICAgIC8qIFRoZXNlIGFyZSBwZXItY29ubmVjdGlvbiAqLworICAgICAgICAgIGlmICghYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgKGNsaWVudCwgcnVsZSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDbGllbnRQb2xpY3kgKmNsaWVudDsKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfYm9vbF90IGF0X2NvbnNvbGU7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBjbGllbnQgPSBidXNfY2xpZW50X3BvbGljeV9uZXcgKCk7CisgIGlmIChjbGllbnQgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIC8qIHdlIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBsb29raW5nIHVwIHVzZXIncyBncm91cHMKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZ3JvdXAgcnVsZXMgYW55d2F5CisgICAqLworICBpZiAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCkgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgKmdyb3VwczsKKyAgICAgIGludCBuX2dyb3VwczsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpZiAoIWJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAoY29ubmVjdGlvbiwgJmdyb3VwcywgJm5fZ3JvdXBzLCBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9ncm91cHMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKmxpc3Q7CisgICAgICAgICAgCisgICAgICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKHBvbGljeS0+cnVsZXNfYnlfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ldKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAobGlzdCwgY2xpZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGdyb3Vwcyk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChncm91cHMpOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocG9saWN5LT5ydWxlc19ieV91aWQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICoqbGlzdDsKKyAgICAgICAgICAKKyAgICAgICAgICBsaXN0ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChsaXN0ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50IChsaXN0LCBjbGllbnQpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogQWRkIGNvbnNvbGUgcnVsZXMgKi8KKyAgICAgIGF0X2NvbnNvbGUgPSBfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAodWlkLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmIChhdF9jb25zb2xlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFhZGRfbGlzdF90b19jbGllbnQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgY2xpZW50KSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzLCBjbGllbnQpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIGJ1c19jbGllbnRfcG9saWN5X29wdGltaXplIChjbGllbnQpOworICAKKyAgcmV0dXJuIGNsaWVudDsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAoY2xpZW50KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChjbGllbnQpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0X2FsbG93c191c2VyIChkYnVzX2Jvb2xfdCAgICAgICAgICAgZGVmLAorICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAgKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2dyb3VwX2lkcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICBhbGxvd2VkID0gZGVmOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworCisgICAgICBpZiAocnVsZS0+dHlwZSA9PSBCVVNfUE9MSUNZX1JVTEVfVVNFUikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMaXN0ICVwIHVzZXIgcnVsZSB1aWQ9IkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC51c2VyLnVpZCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHJ1bGUtPmQudXNlci51aWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgICA7IC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UgaWYgKHJ1bGUtPmQudXNlci51aWQgIT0gdWlkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJ1bGUtPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX0dST1VQKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxpc3QgJXAgZ3JvdXAgcnVsZSBnaWQ9IkRCVVNfR0lEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC5ncm91cC5naWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChydWxlLT5kLmdyb3VwLmdpZCA9PSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgICAgIDsgIC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocnVsZS0+ZC5ncm91cC5naWQgPT0gZ3JvdXBfaWRzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoaSA9PSBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgIH0KKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpCit7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIHVuc2lnbmVkIGxvbmcgKmdyb3VwX2lkczsKKyAgaW50IG5fZ3JvdXBfaWRzOworCisgIC8qIE9uIE9PTSBvciBlcnJvciB3ZSBhbHdheXMgcmVqZWN0IHRoZSB1c2VyICovCisgIGlmICghX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlkIG5vdCBnZXQgYW55IGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gInVzZXIgb3duaW5nIGJ1cyIgY2FuIGNvbm5lY3QgKi8KKyAgYWxsb3dlZCA9IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICh1aWQpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkcywgbl9ncm91cF9pZHMpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7CisKKyAgZGJ1c19mcmVlIChncm91cF9pZHMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgJWx1IGFsbG93ZWQgPSAlZFxuIiwgdWlkLCBhbGxvd2VkKTsKKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCisvKiBGb3Igbm93IHRoaXMgaXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAqIERCdXNDb25uZWN0aW9uIGJlaGF2aW9yIG9mICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZSBidXMgY2FuCisgKiBjb25uZWN0JyBpcyBhbGwgaXQgd291bGQgZG8uIFNldCB0aGUgd2luZG93cyB1c2VyIGZ1bmN0aW9uIGluCisgKiBjb25uZWN0aW9uLmMgaWYgdGhlIGNvbmZpZyBmaWxlIGV2ZXIgc3VwcG9ydHMgZG9pbmcgc29tZXRoaW5nCisgKiBpbnRlcmVzdGluZyBoZXJlLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgLyogV2luZG93cyBoYXMgbm8gcG9saWNpZXMgaGVyZSBzaW5jZSBvbmx5IHRoZSBzZXNzaW9uIGJ1cworICAgKiBpcyByZWFsbHkgdXNlZCBmb3Igbm93LCBzbyBqdXN0IGNoZWNraW5nIHRoYXQgdGhlCisgICAqIGNvbm5lY3RpbmcgcGVyc29uIGlzIHRoZSBzYW1lIGFzIHRoZSBidXMgb3duZXIgaXMgZmluZS4KKyAgICovCisgIHJldHVybiBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAod2luZG93c19zaWQpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKEJ1c1BvbGljeSAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljIERCdXNMaXN0KioKK2dldF9saXN0IChEQnVzSGFzaFRhYmxlICpoYXNoLAorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtleSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChoYXNoLCBrZXkpOworCisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QqLCAxKTsKKyAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGhhc2gsIGtleSwgbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBsaXN0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV91aWQsIHVpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV9naWQsIGdpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmIChhdF9jb25zb2xlKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgcnVsZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfZmFsc2VfcnVsZXMsIHJ1bGUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKnRvX2FwcGVuZCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICp0bXBfbGlzdDsKKworICB0bXBfbGlzdCA9IE5VTEw7CisKKyAgLyogUHJlYWxsb2NhdGUgYWxsIG91ciBsaW5rcyAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAodG9fYXBwZW5kKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdG1wX2xpc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnRtcF9saXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAodG9fYXBwZW5kLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTm93IGFwcGVuZCB0aGVtICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZ0bXBfbGlzdCkpKQorICAgIHsKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX2lkX2hhc2ggKERCdXNIYXNoVGFibGUgKmRlc3QsCisgICAgICAgICAgICAgICBEQnVzSGFzaFRhYmxlICp0b19hYnNvcmIpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRvX2Fic29yYiwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGlkID0gX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKipsaXN0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKip0YXJnZXQgPSBnZXRfbGlzdCAoZGVzdCwgaWQpOworCisgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAodGFyZ2V0LCBsaXN0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19wb2xpY3lfbWVyZ2UgKEJ1c1BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICp0b19hYnNvcmIpCit7CisgIC8qIEZJWE1FIE5vdCBwcm9wZXJseSBhdG9taWMsIGJ1dCBhcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIHdlCisgICAqIGRvbid0IHJlbHkgb24gaXQgcXVpdGUgc28gbXVjaC4KKyAgICovCisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fYWJzb3JiLT5kZWZhdWx0X3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19hYnNvcmItPm1hbmRhdG9yeV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV90cnVlX3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV9mYWxzZV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV91aWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV9naWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IEJ1c0NsaWVudFBvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKnJ1bGVzOworfTsKKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NsaWVudF9wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNDbGllbnRQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c0NsaWVudFBvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKworICByZXR1cm4gcG9saWN5OworfQorCitCdXNDbGllbnRQb2xpY3kgKgorYnVzX2NsaWVudF9wb2xpY3lfcmVmIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX3VucmVmX2ZvcmVhY2ggKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGRhdGE7CisKKyAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlX3VucmVmX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5ydWxlcyk7CisKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnVsZXNfYnlfdHlwZV91cF90byAoQnVzQ2xpZW50UG9saWN5ICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAqdXBfdG8pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IHVwX3RvKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfb3B0aW1pemUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBEQnVzTGlzdCAqbGluazsKKworICAvKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgaWYgd2UgaGF2ZToKKyAgICogCisgICAqIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIvPgorICAgKiA8ZGVueSBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgKgorICAgKiAoZm9yIGV4YW1wbGUpIHRoZSBkZW55IHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBhbGxvdy4gIFNvIHdlCisgICAqIGRlbGV0ZSB0aGUgYWxsb3cuIERpdHRvIGZvciBkZW55IGZvbGxvd2VkIGJ5IGFsbG93LCBldGMuIFRoaXMgaXMKKyAgICogYSBkdW1iIHRoaW5nIHRvIHB1dCBpbiBhIGNvbmZpZyBmaWxlLCBidXQgdGhlIDxpbmNsdWRlPiBmZWF0dXJlCisgICAqIG9mIGZpbGVzIGFsbG93cyBmb3IgYW4gImluaGVyaXRhbmNlIGFuZCBvdmVycmlkZSIgcGF0dGVybiB3aGVyZQorICAgKiBpdCBjb3VsZCBtYWtlIHNlbnNlLiBJZiBhbiBpbmNsdWRlZCBmaWxlIHdhbnRzIHRvICJzdGFydCBvdmVyIgorICAgKiB3aXRoIGEgYmxhbmtldCBkZW55LCBubyBwb2ludCBrZWVwaW5nIHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQKKyAgICogZmlsZS4KKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIk9wdGltaXppbmcgcG9saWN5IHdpdGggJWQgcnVsZXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnBvbGljeS0+cnVsZXMpKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgZGJ1c19ib29sX3QgcmVtb3ZlX3ByZWNlZGluZzsKKworICAgICAgbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIHJlbW92ZV9wcmVjZWRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworICAgICAgCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gPT0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID09IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9HUk9VUDoKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJ1bGUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVtb3ZlX3ByZWNlZGluZykKKyAgICAgICAgcmVtb3ZlX3J1bGVzX2J5X3R5cGVfdXBfdG8gKHBvbGljeSwgcnVsZS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIG9wdGltaXphdGlvbiwgcG9saWN5IGhhcyAlZCBydWxlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmcG9saWN5LT5ydWxlcykpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAqcnVsZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkFwcGVuZGluZyBydWxlICVwIHdpdGggdHlwZSAlZCB0byBwb2xpY3kgJXBcbiIsCisgICAgICAgICAgICAgICAgIHJ1bGUsIHJ1bGUtPnR5cGUsIHBvbGljeSk7CisgIAorICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcG9saWN5LT5ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICp0b2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAqbG9nKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c19ib29sX3QgYWxsb3dlZDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHNlbmQgcnVsZXNcbiIpOworICAqdG9nZ2xlcyA9IDA7CisgIAorICBhbGxvd2VkID0gRkFMU0U7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudAorICAgICAgICogbWVzc2FnZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UsIG9yIGEgZGlmZmVyZW50CisgICAgICAgKiBkZXN0aW5hdGlvbiBmcm9tIHRoZSBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPnR5cGUgIT0gQlVTX1BPTElDWV9SVUxFX1NFTkQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBub24tc2VuZCBydWxlXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gcnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQuc2VuZC5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnNlbmQucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmIAorICAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5pbnRlcmZhY2UpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5tZW1iZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVtYmVyXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5lcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmVycm9yKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgZXJyb3IgbmFtZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlY2VpdmVyIGNhbiBiZSBOVUxMIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBzZW50IHRvIHRoZQorICAgICAgICAgICAqIG1lc3NhZ2UgYnVzIGl0c2VsZiwgd2UgY2hlY2sgdGhlIHN0cmluZ3MgaW4gdGhhdCBjYXNlIGFzCisgICAgICAgICAgICogYnVpbHQtaW4gc2VydmljZXMgZG9uJ3QgaGF2ZSBhIERCdXNDb25uZWN0aW9uIGJ1dCBtZXNzYWdlcworICAgICAgICAgICAqIHRvIHRoZW0gaGF2ZSBhIGRlc3RpbmF0aW9uIHNlcnZpY2UgbmFtZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgZGVzdCBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIGRlc3QgJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIHJlY2VpdmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGJlY2F1c2UgZGVzdCAlcyBpc24ndCBvd25lZCBieSByZWNlaXZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKmxvZyA9IHJ1bGUtPmQuc2VuZC5sb2c7CisgICAgICAoKnRvZ2dsZXMpKys7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHVzZWQgcnVsZSwgYWxsb3cgbm93ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkKTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qIFNlZSBkb2NzIG9uIHdoYXQgdGhlIGFyZ3MgbWVhbiBvbiBidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3koKQorICogY29tbWVudAorICovCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgKnRvZ2dsZXMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX2Jvb2xfdCBhbGxvd2VkOworICBkYnVzX2Jvb2xfdCBlYXZlc2Ryb3BwaW5nOworCisgIGVhdmVzZHJvcHBpbmcgPQorICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgIT0gcHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHJlY2VpdmUgcnVsZXMsIGVhdmVzZHJvcHBpbmcgPSAlZFxuIiwgZWF2ZXNkcm9wcGluZyk7CisgICp0b2dnbGVzID0gMDsKKyAgCisgIGFsbG93ZWQgPSBGQUxTRTsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOyAgICAgIAorICAgICAgCisgICAgICBpZiAocnVsZS0+dHlwZSAhPSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIG5vbi1yZWNlaXZlIHJ1bGVcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogZm9yIGFsbG93LCBlYXZlc2Ryb3A9ZmFsc2UgbWVhbnMgdGhlIHJ1bGUgZG9lc24ndCBhcHBseSB3aGVuCisgICAgICAgKiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyBhbHdheXMgYWxsb3cuCisgICAgICAgKi8KKyAgICAgIGlmIChlYXZlc2Ryb3BwaW5nICYmIHJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUuZWF2ZXNkcm9wKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgYWxsb3cgcnVsZSBzaW5jZSBpdCBkb2Vzbid0IGFwcGx5IHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIGZvciBkZW55LCBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyB0aGUgcnVsZSBhcHBsaWVzIG9ubHkgd2hlbgorICAgICAgICogZWF2ZXNkcm9wcGluZzsgZWF2ZXNkcm9wPWZhbHNlIG1lYW5zIGFsd2F5cyBkZW55LgorICAgICAgICovCisgICAgICBpZiAoIWVhdmVzZHJvcHBpbmcgJiYgIXJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLm1lbWJlciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBtZW1iZXJcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLmVycm9yICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUuZXJyb3IpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBlcnJvciBuYW1lXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4gIT0gTlVMTCkKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBzZW5kZXIgY2FuIGJlIE5VTEwgZm9yIG1lc3NhZ2VzIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlCisgICAgICAgICAgICogbWVzc2FnZSBidXMgaXRzZWxmLCB3ZSBjaGVjayB0aGUgc3RyaW5ncyBpbiB0aGF0IGNhc2UgYXMKKyAgICAgICAgICAgKiBidWlsdC1pbiBzZXJ2aWNlcyBkb24ndCBoYXZlIGEgREJ1c0Nvbm5lY3Rpb24gYnV0IHdpbGwKKyAgICAgICAgICAgKiBzdGlsbCBzZXQgdGhlIHNlbmRlciBvbiB0aGVpciBtZXNzYWdlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBtZXNzYWdlIHNlbmRlciBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfaGFzX293bmVyIChzZXJ2aWNlLCBzZW5kZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKCp0b2dnbGVzKSsrOworCisgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSB1c2VkIHJ1bGUsIGFsbG93IG5vdyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCk7CisgICAgfQorCisgIHJldHVybiBhbGxvd2VkOworfQorCisKKworc3RhdGljIGRidXNfYm9vbF90CitidXNfcnVsZXNfY2hlY2tfY2FuX293biAoREJ1c0xpc3QgKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICAvKiBydWxlcyBpcyBpbiB0aGUgb3JkZXIgdGhlIHJ1bGVzIGFwcGVhcmVkCisgICAqIGluIHRoZSBjb25maWcgZmlsZSwgaS5lLiBsYXN0IHJ1bGUgdGhhdCBhcHBsaWVzIHdpbnMKKyAgICovCisKKyAgYWxsb3dlZCA9IEZBTFNFOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXJ2aWNlIG5hbWUgZnJvbQorICAgICAgICogdGhlIGRlc2lyZWQgb25lLgorICAgICAgICovCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9PV04pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIXJ1bGUtPmQub3duLnByZWZpeCAmJiBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocnVsZS0+ZC5vd24ucHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICAgICAgICBjaGFyIG5leHRfY2hhcjsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpOworICAgICAgICAgIG5leHRfY2hhciA9IGRhdGFbc3RybGVuIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpXTsKKyAgICAgICAgICBpZiAobmV4dF9jaGFyICE9ICdcMCcgJiYgbmV4dF9jaGFyICE9ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIFVzZSB0aGlzIHJ1bGUgKi8KKyAgICAgIGFsbG93ZWQgPSBydWxlLT5hbGxvdzsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisgIHJldHVybiBidXNfcnVsZXNfY2hlY2tfY2FuX293biAocG9saWN5LT5ydWxlcywgc2VydmljZV9uYW1lKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9jaGVja19jYW5fb3duIChCdXNQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgcmV0dXJuIGJ1c19ydWxlc19jaGVja19jYW5fb3duIChwb2xpY3ktPmRlZmF1bHRfcnVsZXMsIHNlcnZpY2VfbmFtZSk7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL3BvbGljeS5oIGIvYnVzL3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDNlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvcG9saWN5LmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogcG9saWN5LmggIEJ1cyBzZWN1cml0eSBwb2xpY3kKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfUE9MSUNZX0gKKyNkZWZpbmUgQlVTX1BPTElDWV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgImJ1cy5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgQlVTX1BPTElDWV9SVUxFX1NFTkQsCisgIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFLAorICBCVVNfUE9MSUNZX1JVTEVfT1dOLAorICBCVVNfUE9MSUNZX1JVTEVfVVNFUiwKKyAgQlVTX1BPTElDWV9SVUxFX0dST1VQCit9IEJ1c1BvbGljeVJ1bGVUeXBlOworCisvKiogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBydWxlIGFmZmVjdHMgYSBjb25uZWN0aW9uLCBvciBzb21lIGdsb2JhbCBpdGVtICovCisjZGVmaW5lIEJVU19QT0xJQ1lfUlVMRV9JU19QRVJfQ0xJRU5UKHJ1bGUpICghKChydWxlKS0+dHlwZSA9PSBCVVNfUE9MSUNZX1JVTEVfVVNFUiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChydWxlKS0+dHlwZSA9PSBCVVNfUE9MSUNZX1JVTEVfR1JPVVApKQorCitzdHJ1Y3QgQnVzUG9saWN5UnVsZQoreworICBpbnQgcmVmY291bnQ7CisgIAorICBCdXNQb2xpY3lSdWxlVHlwZSB0eXBlOworCisgIHVuc2lnbmVkIGludCBhbGxvdyA6IDE7IC8qKjwgI1RSVUUgaWYgdGhpcyBhbGxvd3MsICNGQUxTRSBpZiBpdCBkZW5pZXMgKi8KKyAgCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBtZXNzYWdlIHR5cGUgY2FuIGJlIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgbWVhbmluZyAiYW55IiAqLworICAgICAgaW50ICAgbWVzc2FnZV90eXBlOworICAgICAgLyogYW55IG9mIHRoZXNlIGNhbiBiZSBOVUxMIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGNoYXIgKnBhdGg7CisgICAgICBjaGFyICppbnRlcmZhY2U7CisgICAgICBjaGFyICptZW1iZXI7CisgICAgICBjaGFyICplcnJvcjsKKyAgICAgIGNoYXIgKmRlc3RpbmF0aW9uOworICAgICAgdW5zaWduZWQgaW50IGVhdmVzZHJvcCA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX3JlcGx5IDogMTsKKyAgICAgIHVuc2lnbmVkIGludCBsb2cgOiAxOworICAgIH0gc2VuZDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIG1lc3NhZ2UgdHlwZSBjYW4gYmUgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCBtZWFuaW5nICJhbnkiICovCisgICAgICBpbnQgICBtZXNzYWdlX3R5cGU7CisgICAgICAvKiBhbnkgb2YgdGhlc2UgY2FuIGJlIE5VTEwgbWVhbmluZyAiYW55IiAqLworICAgICAgY2hhciAqcGF0aDsKKyAgICAgIGNoYXIgKmludGVyZmFjZTsKKyAgICAgIGNoYXIgKm1lbWJlcjsKKyAgICAgIGNoYXIgKmVycm9yOworICAgICAgY2hhciAqb3JpZ2luOworICAgICAgdW5zaWduZWQgaW50IGVhdmVzZHJvcCA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX3JlcGx5IDogMTsKKyAgICB9IHJlY2VpdmU7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBjYW4gYmUgTlVMTCBtZWFuaW5nICJhbnkiICovCisgICAgICBjaGFyICpzZXJ2aWNlX25hbWU7CisgICAgICAvKiBpZiBwcmVmaXggaXMgc2V0LCBhbnkgbmFtZSBzdGFydGluZyB3aXRoIHNlcnZpY2VfbmFtZSBjYW4gYmUgb3duZWQgKi8KKyAgICAgIHVuc2lnbmVkIGludCBwcmVmaXggOiAxOworICAgIH0gb3duOworCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogY2FuIGJlIERCVVNfVUlEX1VOU0VUIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGRidXNfdWlkX3QgdWlkOworICAgIH0gdXNlcjsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIGNhbiBiZSBEQlVTX0dJRF9VTlNFVCBtZWFuaW5nICJhbnkiICovCisgICAgICBkYnVzX2dpZF90IGdpZDsKKyAgICB9IGdyb3VwOworCisgIH0gZDsKK307CisKK0J1c1BvbGljeVJ1bGUqIGJ1c19wb2xpY3lfcnVsZV9uZXcgICAoQnVzUG9saWN5UnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWxsb3cpOworQnVzUG9saWN5UnVsZSogYnVzX3BvbGljeV9ydWxlX3JlZiAgIChCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK3ZvaWQgICAgICAgICAgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAoQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CisKK0J1c1BvbGljeSogICAgICAgYnVzX3BvbGljeV9uZXcgICAgICAgICAgICAgICAgICAgKHZvaWQpOworQnVzUG9saWN5KiAgICAgICBidXNfcG9saWN5X3JlZiAgICAgICAgICAgICAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5KTsKK3ZvaWQgICAgICAgICAgICAgYnVzX3BvbGljeV91bnJlZiAgICAgICAgICAgICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSk7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FsbG93X3VuaXhfdXNlciAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdWlkKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9tYW5kYXRvcnlfcnVsZSAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX3VzZXJfcnVsZSAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGF0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKKworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X21lcmdlICAgICAgICAgICAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICAgICAgICAqdG9fYWJzb3JiKTsKKworQnVzQ2xpZW50UG9saWN5KiBidXNfY2xpZW50X3BvbGljeV9uZXcgICAgICAgICAgICAgICAodm9pZCk7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19jbGllbnRfcG9saWN5X3JlZiAgICAgICAgICAgICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3kpOwordm9pZCAgICAgICAgICAgICBidXNfY2xpZW50X3BvbGljeV91bnJlZiAgICAgICAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5KTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAqdG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgKmxvZyk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAqdG9nZ2xlcyk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9vd24gICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpOworZGJ1c19ib29sX3QgICAgICBidXNfY2xpZW50X3BvbGljeV9hcHBlbmRfcnVsZSAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7Cit2b2lkICAgICAgICAgICAgIGJ1c19jbGllbnRfcG9saWN5X29wdGltaXplICAgICAgICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3kpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9jaGVja19jYW5fb3duICAgICAoQnVzUG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBCVVNfUE9MSUNZX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9yYy5tZXNzYWdlYnVzLmluIGIvYnVzL3JjLm1lc3NhZ2VidXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyY2E3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9yYy5tZXNzYWdlYnVzLmluCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorIworIyBtZXNzYWdlYnVzOiAgIFRoZSBELUJVUyBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisjCisjIGNoa2NvbmZpZzogMzQ1IDk3IDAzCisjIGRlc2NyaXB0aW9uOiAgVGhpcyBpcyBhIGRhZW1vbiB3aGljaCBicm9hZGNhc3RzIG5vdGlmaWNhdGlvbnMgb2Ygc3lzdGVtIGV2ZW50cyBcCisjICAgICAgICAgICAgICAgYW5kIG90aGVyIG1lc3NhZ2VzLiBTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KKyMKKyMgcHJvY2Vzc25hbWU6IGRidXMtZGFlbW9uCisjIHBpZGZpbGU6IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyMKKworIyBTYW5pdHkgY2hlY2tzLgorI1sgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gXSB8fCBleGl0IDAKKworIyBTb3VyY2UgZnVuY3Rpb24gbGlicmFyeS4KKyMuIEBFWFBBTkRFRF9TWVNDT05GRElSQC9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworIyBzbyB3ZSBjYW4gcmVhcnJhbmdlIHRoaXMgZWFzaWx5CisjcHJvY2Vzc25hbWU9ZGJ1cy1kYWVtb24KKyNzZXJ2aWNlbmFtZT1tZXNzYWdlYnVzCisKKyNSRVRWQUw9MAorCitzdGFydCgpIHsKKyAgICBlY2hvICJTdGFydGluZyBzeXN0ZW0gbWVzc2FnZSBidXMiCisgICAgaWYgWyAteCBARVhQQU5ERURfQklORElSQC9kYnVzLXV1aWRnZW4gXSA7IHRoZW4KKyAgICAgICAgQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCisgICAgZmkKKworICAgIGlmIFsgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gXTt0aGVuCisgICAgCUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC0tc3lzdGVtCisgICAgZmkKKyAgICAjZGFlbW9uIC0tY2hlY2sgJHNlcnZpY2VuYW1lICRwcm9jZXNzbmFtZSAtLXN5c3RlbQorICAgICNSRVRWQUw9JD8KKyAgICAjZWNobworICAgICNbICRSRVRWQUwgLWVxIDAgXSAmJiB0b3VjaCBARVhQQU5ERURfTE9DQUxTVEFURURJUkAvbG9jay9zdWJzeXMvJHNlcnZpY2VuYW1lCit9CisKK3N0b3AoKSB7CisgICAgZWNobyAiU3RvcHBpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzIgorCisgICAgIyMgd2UgZG9uJ3Qgd2FudCB0byBraWxsIGFsbCB0aGUgcGVyLXVzZXIgJHByb2Nlc3NuYW1lLCB3ZSB3YW50CisgICAgIyMgdG8gdXNlIHRoZSBwaWQgZmlsZSAqb25seSo7IGJlY2F1c2Ugd2UgdXNlIHRoZSBmYWtlIG5vbmV4aXN0ZW50IAorICAgICMjIHByb2dyYW0gbmFtZSAiJHNlcnZpY2VuYW1lIiB0aGF0IHNob3VsZCBiZSBzYWZlLWlzaAorICAgIGtpbGxhbGwgZGJ1cy1kYWVtb24KKyAgICAjUkVUVkFMPSQ/CisgICAgI2VjaG8KKyAgICAjaWYgWyAkUkVUVkFMIC1lcSAwIF07IHRoZW4KKyAgICAjICAgIHJtIC1mIEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQC9sb2NrL3N1YnN5cy8kc2VydmljZW5hbWUKKyAgICAjICAgIHJtIC1mIEBEQlVTX1NZU1RFTV9QSURfRklMRUAKKyAgICAjZmkKK30KKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgICAgc3RhcnQpCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgc3RvcCkKKyAgICAgICAgc3RvcAorICAgICAgICA7OworICAgIHN0YXR1cykKKyAgICAgICAgc3RhdHVzICRzZXJ2aWNlbmFtZQorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICByZXN0YXJ0KQorICAgICAgICBzdG9wCisgICAgICAgIHN0YXJ0CisgICAgICAgIDs7CisgICAgcmVsb2FkKQorICAgICAgICBlY2hvICJNZXNzYWdlIGJ1cyBjYW4ndCByZWxvYWQgaXRzIGNvbmZpZ3VyYXRpb24sIHlvdSBoYXZlIHRvIHJlc3RhcnQgaXQiCisgICAgICAgIFJFVFZBTD0kPworICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gJCJVc2FnZTogJDAge3N0YXJ0fHN0b3B8c3RhdHVzfHJlc3RhcnR8cmVsb2FkfSIKKyAgICAgICAgOzsKK2VzYWMKK2V4aXQgJFJFVFZBTApkaWZmIC0tZ2l0IGEvYnVzL3NlbGludXguYyBiL2J1cy9zZWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4ODRlZgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZWxpbnV4LmMKQEAgLTAsMCArMSwxMDIwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIHNlbGludXguYyAgU0VMaW51eCBzZWN1cml0eSBjaGVja3MgZm9yIEQtQnVzCisgKgorICogQXV0aG9yOiBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2lmbmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPGRidXMvZGJ1cy11c2VyZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlICJhdWRpdC5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TRUxJTlVYCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHNlbGludXgvYXZjLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyNpZmRlZiBIQVZFX0xJQkFVRElUCisjaW5jbHVkZSA8bGliYXVkaXQuaD4KKyNlbmRpZiAvKiBIQVZFX0xJQkFVRElUICovCisKKyNkZWZpbmUgQlVTX1NJRF9GUk9NX1NFTElOVVgoc2lkKSAgKChCdXNTRUxpbnV4SUQqKSAoc2lkKSkKKyNkZWZpbmUgU0VMSU5VWF9TSURfRlJPTV9CVVMoc2lkKSAgKChzZWN1cml0eV9pZF90KSAoc2lkKSkKKworI2lmZGVmIEhBVkVfU0VMSU5VWAorLyogU3RvcmUgdGhlIHZhbHVlIHRlbGxpbmcgdXMgaWYgU0VMaW51eCBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwuICovCitzdGF0aWMgZGJ1c19ib29sX3Qgc2VsaW51eF9lbmFibGVkID0gRkFMU0U7CisKKy8qIFN0b3JlIGFuIGF2Y19lbnRyeV9yZWYgdG8gc3BlZWQgQVZDIGRlY2lzaW9ucy4gKi8KK3N0YXRpYyBzdHJ1Y3QgYXZjX2VudHJ5X3JlZiBhZXJlZjsKKworLyogU3RvcmUgdGhlIFNJRCBvZiB0aGUgYnVzIGl0c2VsZiB0byB1c2UgYXMgdGhlIGRlZmF1bHQuICovCitzdGF0aWMgc2VjdXJpdHlfaWRfdCBidXNfc2lkID0gU0VDU0lEX1dJTEQ7CisKKy8qIFRocmVhZCB0byBsaXN0ZW4gZm9yIFNFTGludXggc3RhdHVzIGNoYW5nZXMgdmlhIG5ldGxpbmsuICovCitzdGF0aWMgcHRocmVhZF90IGF2Y19ub3RpZnlfdGhyZWFkOworCisvKiBQcm90b3R5cGVzIGZvciBBVkMgY2FsbGJhY2sgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyB2b2lkIGxvZ19jYWxsYmFjayAoY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgbG9nX2F1ZGl0X2NhbGxiYWNrICh2b2lkICpkYXRhLCBzZWN1cml0eV9jbGFzc190IGNsYXNzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZWZ0KTsKK3N0YXRpYyB2b2lkICphdmNfY3JlYXRlX3RocmVhZCAodm9pZCAoKnJ1bikgKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGF2Y19zdG9wX3RocmVhZCAodm9pZCAqdGhyZWFkKTsKK3N0YXRpYyB2b2lkICphdmNfYWxsb2NfbG9jayAodm9pZCk7CitzdGF0aWMgdm9pZCBhdmNfZ2V0X2xvY2sgKHZvaWQgKmxvY2spOworc3RhdGljIHZvaWQgYXZjX3JlbGVhc2VfbG9jayAodm9pZCAqbG9jayk7CitzdGF0aWMgdm9pZCBhdmNfZnJlZV9sb2NrICh2b2lkICpsb2NrKTsKKworLyogQVZDIGNhbGxiYWNrIHN0cnVjdHVyZXMgZm9yIHVzZSBpbiBhdmNfaW5pdC4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19tZW1vcnlfY2FsbGJhY2sgbWVtX2NiID0KK3sKKyAgLmZ1bmNfbWFsbG9jID0gZGJ1c19tYWxsb2MsCisgIC5mdW5jX2ZyZWUgPSBkYnVzX2ZyZWUKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19sb2dfY2FsbGJhY2sgbG9nX2NiID0KK3sKKyAgLmZ1bmNfbG9nID0gbG9nX2NhbGxiYWNrLAorICAuZnVuY19hdWRpdCA9IGxvZ19hdWRpdF9jYWxsYmFjaworfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZjX3RocmVhZF9jYWxsYmFjayB0aHJlYWRfY2IgPQoreworICAuZnVuY19jcmVhdGVfdGhyZWFkID0gYXZjX2NyZWF0ZV90aHJlYWQsCisgIC5mdW5jX3N0b3BfdGhyZWFkID0gYXZjX3N0b3BfdGhyZWFkCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhdmNfbG9ja19jYWxsYmFjayBsb2NrX2NiID0KK3sKKyAgLmZ1bmNfYWxsb2NfbG9jayA9IGF2Y19hbGxvY19sb2NrLAorICAuZnVuY19nZXRfbG9jayA9IGF2Y19nZXRfbG9jaywKKyAgLmZ1bmNfcmVsZWFzZV9sb2NrID0gYXZjX3JlbGVhc2VfbG9jaywKKyAgLmZ1bmNfZnJlZV9sb2NrID0gYXZjX2ZyZWVfbG9jaworfTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBMb2cgY2FsbGJhY2sgdG8gbG9nIGRlbmlhbCBtZXNzYWdlcyBmcm9tIHRoZSBBVkMuCisgKiBUaGlzIGlzIHVzZWQgaW4gYXZjX2luaXQuICBMb2dzIHRvIGJvdGggc3RhbmRhcmQKKyAqIGVycm9yIGFuZCBzeXNsb2dkLgorICoKKyAqIEBwYXJhbSBmbXQgdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CisgKi8KKyNpZmRlZiBIQVZFX1NFTElOVVgKKworc3RhdGljIHZvaWQgCitsb2dfY2FsbGJhY2sgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSAKK3sKKyAgdmFfbGlzdCBhcDsKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGludCBhdWRpdF9mZDsKKyNlbmRpZgorCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBhdWRpdF9mZCA9IGJ1c19hdWRpdF9nZXRfZmQgKCk7CisKKyAgaWYgKGF1ZGl0X2ZkID49IDApCisgIHsKKyAgICAvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBEQnVzU3RyaW5nLCBidXQgREJ1c1N0cmluZyBhbGxvY2F0ZXMKKyAgICAgKiBtZW1vcnkgZHluYW1pY2FsbHk7IGJlZm9yZSBzd2l0Y2hpbmcgaXQsIHdlIG5lZWQgdG8gY2hlY2sgd2l0aAorICAgICAqIFNFTGludXggcGVvcGxlIHRoYXQgaXQgd291bGQgYmUgT0sgZm9yIHRoaXMgdG8gZmFsbCBiYWNrIHRvCisgICAgICogc3lzbG9nIGlmIE9PTSwgbGlrZSB0aGUgZXF1aXZhbGVudCBBcHBBcm1vciBjb2RlIGRvZXMuICovCisgICAgY2hhciBidWZbUEFUSF9NQVgqMl07CisKKyAgICAvKiBGSVhNRTogbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBzaG93IHJlYWwgdXNlciAqLworICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKyAgICBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZShhdWRpdF9mZCwgQVVESVRfVVNFUl9BVkMsIGJ1ZiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZ2V0dWlkKCkpOworICAgIGdvdG8gb3V0OworICB9CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworCisgIHZzeXNsb2cgKExPR19VU0VSIHwgTE9HX0lORk8sIGZtdCwgYXApOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorb3V0OgorI2VuZGlmCisgIHZhX2VuZChhcCk7Cit9CisKKy8qKgorICogT24gYSBwb2xpY3kgcmVsb2FkIHdlIG5lZWQgdG8gcmVwYXJzZSB0aGUgU0VMaW51eCBjb25maWd1cmF0aW9uIGZpbGUsIHNpbmNlCisgKiB0aGlzIGNvdWxkIGhhdmUgY2hhbmdlZC4gIFNlbmQgYSBTSUdIVVAgdG8gcmVsb2FkIGFsbCBjb25maWdzLgorICovCitzdGF0aWMgaW50Citwb2xpY3lfcmVsb2FkX2NhbGxiYWNrICh1X2ludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywgYWNjZXNzX3ZlY3Rvcl90ICpvdXRfcmV0YWluZWQpCit7CisgIGlmIChldmVudCA9PSBBVkNfQ0FMTEJBQ0tfUkVTRVQpCisgICAgcmV0dXJuIHJhaXNlIChTSUdIVVApOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9nIGFueSBhdXhpbGlhcnkgZGF0YSAKKyAqLworc3RhdGljIHZvaWQKK2xvZ19hdWRpdF9jYWxsYmFjayAodm9pZCAqZGF0YSwgc2VjdXJpdHlfY2xhc3NfdCBjbGFzcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVmdCkKK3sKKyAgREJ1c1N0cmluZyAqYXVkbXNnID0gZGF0YTsKKworICBpZiAoYnVmbGVmdCA+IChzaXplX3QpIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKGF1ZG1zZykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyX3dpdGhfbnVsIChhdWRtc2csIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1N0cmluZyBzOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCgmcywgIkJ1ZmZlciB0b28gc21hbGwgZm9yIGF1ZGl0IG1lc3NhZ2UiKTsKKworICAgICAgaWYgKGJ1ZmxlZnQgPiAoc2l6ZV90KSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmcykpCisgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoJnMsIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZSB0aHJlYWQgdG8gbm90aWZ5IHRoZSBBVkMgb2YgZW5mb3JjaW5nIGFuZCBwb2xpY3kgcmVsb2FkCisgKiBjaGFuZ2VzIHZpYSBuZXRsaW5rLgorICoKKyAqIEBwYXJhbSBydW4gdGhlIHRocmVhZCBydW4gZnVuY3Rpb24KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgdGhyZWFkCisgKi8KK3N0YXRpYyB2b2lkICoKK2F2Y19jcmVhdGVfdGhyZWFkICh2b2lkICgqcnVuKSAodm9pZCkpCit7CisgIGludCByYzsKKworICByYyA9IHB0aHJlYWRfY3JlYXRlICgmYXZjX25vdGlmeV90aHJlYWQsIE5VTEwsICh2b2lkICooKikgKHZvaWQgKikpIHJ1biwgTlVMTCk7CisgIGlmIChyYyAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgQVZDIHRocmVhZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChyYykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gJmF2Y19ub3RpZnlfdGhyZWFkOworfQorCisvKiBTdG9wIEFWQyBuZXRsaW5rIHRocmVhZC4gICovCitzdGF0aWMgdm9pZAorYXZjX3N0b3BfdGhyZWFkICh2b2lkICp0aHJlYWQpCit7CisgIHB0aHJlYWRfY2FuY2VsICgqKHB0aHJlYWRfdCAqKSB0aHJlYWQpOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZCAqCithdmNfYWxsb2NfbG9jayAodm9pZCkKK3sKKyAgcHRocmVhZF9tdXRleF90ICphdmNfbXV0ZXg7CisKKyAgYXZjX211dGV4ID0gZGJ1c19uZXcgKHB0aHJlYWRfbXV0ZXhfdCwgMSk7CisgIGlmIChhdmNfbXV0ZXggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGNyZWF0ZSBtdXRleDogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBwdGhyZWFkX211dGV4X2luaXQgKGF2Y19tdXRleCwgTlVMTCk7CisKKyAgcmV0dXJuIGF2Y19tdXRleDsKK30KKworLyogQWNxdWlyZSBhbiBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZAorYXZjX2dldF9sb2NrICh2b2lkICpsb2NrKQoreworICBwdGhyZWFkX211dGV4X2xvY2sgKGxvY2spOworfQorCisvKiBSZWxlYXNlIGFuIEFWQyBsb2NrLiAgKi8KK3N0YXRpYyB2b2lkCithdmNfcmVsZWFzZV9sb2NrICh2b2lkICpsb2NrKQoreworICBwdGhyZWFkX211dGV4X3VubG9jayAobG9jayk7Cit9CisKKy8qIEZyZWUgYW4gQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQKK2F2Y19mcmVlX2xvY2sgKHZvaWQgKmxvY2spCit7CisgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAobG9jayk7CisgIGRidXNfZnJlZSAobG9jayk7Cit9CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IFNFTGludXggaXMgZW5hYmxlZDsgbXVzdCBiZQorICogY2FsbGVkIGFmdGVyIGJ1c19zZWxpbnV4X2luaXQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9lbmFibGVkICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICByZXR1cm4gc2VsaW51eF9lbmFibGVkOworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIERvIGVhcmx5IGluaXRpYWxpemF0aW9uOyBkZXRlcm1pbmUgd2hldGhlciBTRUxpbnV4IGlzIGVuYWJsZWQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9wcmVfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaW50IHI7CisgIF9kYnVzX2Fzc2VydCAoYnVzX3NpZCA9PSBTRUNTSURfV0lMRCk7CisgIAorICAvKiBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgYW4gU0VMaW51eCBrZXJuZWwuICovCisgIHIgPSBpc19zZWxpbnV4X2VuYWJsZWQgKCk7CisgIGlmIChyIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IHRlbGwgaWYgU0VMaW51eCBpcyBlbmFibGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZWxpbnV4X2VuYWJsZWQgPSByICE9IDA7CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoKKyAqIFByaXZhdGUgRmxhc2sgZGVmaW5pdGlvbnM7IHRoZSBvcmRlciBvZiB0aGVzZSBjb25zdGFudHMgbXVzdAorICogZXhhY3RseSBtYXRjaCB0aGF0IG9mIHRoZSBzdHJ1Y3R1cmUgYXJyYXkgYmVsb3chCisgKi8KKy8qIHNlY3VyaXR5IGRidXMgY2xhc3MgY29uc3RhbnRzICovCisjZGVmaW5lIFNFQ0NMQVNTX0RCVVMgICAgICAgMQorCisvKiBkYnVzJ3MgcGVyIGFjY2VzcyB2ZWN0b3IgY29uc3RhbnRzICovCisjZGVmaW5lIERCVVNfX0FDUVVJUkVfU1ZDICAgMQorI2RlZmluZSBEQlVTX19TRU5EX01TRyAgICAgIDIKKworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIHN0cnVjdCBzZWN1cml0eV9jbGFzc19tYXBwaW5nIGRidXNfbWFwW10gPSB7CisgIHsgImRidXMiLCB7ICJhY3F1aXJlX3N2YyIsICJzZW5kX21zZyIsIE5VTEwgfSB9LAorICB7IE5VTEwgfQorfTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBFc3RhYmxpc2ggZHluYW1pYyBvYmplY3QgY2xhc3MgYW5kIHBlcm1pc3Npb24gbWFwcGluZyBhbmQKKyAqIGluaXRpYWxpemUgdGhlIHVzZXIgc3BhY2UgYWNjZXNzIHZlY3RvciBjYWNoZSAoQVZDKSBmb3IgRC1CdXMgYW5kIHNldCB1cAorICogbG9nZ2luZyBjYWxsYmFja3MuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9mdWxsX2luaXQgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIGNoYXIgKmJ1c19jb250ZXh0OworCisgIF9kYnVzX2Fzc2VydCAoYnVzX3NpZCA9PSBTRUNTSURfV0lMRCk7CisgIAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBub3QgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbC5cbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGlzIGVuYWJsZWQgaW4gdGhpcyBrZXJuZWwuXG4iKTsKKworICBpZiAoc2VsaW51eF9zZXRfbWFwcGluZyAoZGJ1c19tYXApIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHNldCB1cCBzZWN1cml0eSBjbGFzcyBtYXBwaW5nIChzZWxpbnV4X3NldF9tYXBwaW5nKCk6JXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsgCisgICAgfQorCisgIGF2Y19lbnRyeV9yZWZfaW5pdCAoJmFlcmVmKTsKKyAgaWYgKGF2Y19pbml0ICgiYXZjIiwgJm1lbV9jYiwgJmxvZ19jYiwgJnRocmVhZF9jYiwgJmxvY2tfY2IpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHN0YXJ0IEFjY2VzcyBWZWN0b3IgQ2FjaGUgKEFWQykuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQWNjZXNzIFZlY3RvciBDYWNoZSAoQVZDKSBzdGFydGVkLlxuIik7CisgICAgfQorCisgIGlmIChhdmNfYWRkX2NhbGxiYWNrIChwb2xpY3lfcmVsb2FkX2NhbGxiYWNrLCBBVkNfQ0FMTEJBQ0tfUkVTRVQsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIDApIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGFkZCBwb2xpY3kgcmVsb2FkIGNhbGxiYWNrOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgYXZjX2Rlc3Ryb3kgKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19jb250ZXh0ID0gTlVMTDsKKyAgYnVzX3NpZCA9IFNFQ1NJRF9XSUxEOworCisgIGlmIChnZXRjb24gKCZidXNfY29udGV4dCkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIGNvbnRleHQgb2YgYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgIAorICBpZiAoYXZjX2NvbnRleHRfdG9fc2lkIChidXNfY29udGV4dCwgJmJ1c19zaWQpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBidXMgY29udGV4dDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGZyZWVjb24gKGJ1c19jb250ZXh0KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZnJlZWNvbiAoYnVzX2NvbnRleHQpOworICAKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRGVjcmVtZW50IFNJRCByZWZlcmVuY2UgY291bnQuCisgKiAKKyAqIEBwYXJhbSBzaWQgdGhlIFNJRCB0byBkZWNyZW1lbnQKKyAqLwordm9pZAorYnVzX3NlbGludXhfaWRfdW5yZWYgKEJ1c1NFTGludXhJRCAqc2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChzaWQgIT0gTlVMTCk7CisgIAorICBzaWRwdXQgKFNFTElOVVhfU0lEX0ZST01fQlVTIChzaWQpKTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKwordm9pZAorYnVzX3NlbGludXhfaWRfcmVmIChCdXNTRUxpbnV4SUQgKnNpZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoc2lkICE9IE5VTEwpOworICAKKyAgc2lkZ2V0IChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2lkKSk7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBTRUxpbnV4IHNlY3VyaXR5IHBvbGljeSBhbGxvd3MgdGhlIGdpdmVuIHNlbmRlcgorICogc2VjdXJpdHkgY29udGV4dCB0byBnbyB0byB0aGUgZ2l2ZW4gcmVjaXBpZW50IHNlY3VyaXR5IGNvbnRleHQuCisgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBhcmUgdG8gYmUKKyAqIGdyYW50ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMgb3IgdG8gYW5vdGhlcgorICogb3B0aW9uYWxseSBzdXBwbGllZCBzZWN1cml0eSBpZGVudGlmaWVyIChlLmcuIGZvciBhIHNlcnZpY2UKKyAqIGNvbnRleHQpLiAgQ3VycmVudGx5IHRoZXNlIHBlcm1pc3Npb25zIGFyZSBlaXRoZXIgc2VuZF9tc2cgb3IKKyAqIGFjcXVpcmVfc3ZjIGluIHRoZSBkYnVzIGNsYXNzLgorICoKKyAqIEBwYXJhbSBzZW5kZXJfc2lkIHNvdXJjZSBzZWN1cml0eSBjb250ZXh0CisgKiBAcGFyYW0gb3ZlcnJpZGVfc2lkIGlzIHRoZSB0YXJnZXQgc2VjdXJpdHkgY29udGV4dC4gIElmIFNFQ1NJRF9XSUxEIHRoaXMgd2lsbAorICogICAgICAgIHVzZSB0aGUgY29udGV4dCBvZiB0aGUgYnVzIGl0c2VsZiAoZS5nLiB0aGUgZGVmYXVsdCkuCisgKiBAcGFyYW0gdGFyZ2V0X2NsYXNzIGlzIHRoZSB0YXJnZXQgc2VjdXJpdHkgY2xhc3MuCisgKiBAcGFyYW0gcmVxdWVzdGVkIGlzIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbnMuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzZWN1cml0eSBwb2xpY3kgYWxsb3dzIHRoZSBzZW5kLgorICovCisjaWZkZWYgSEFWRV9TRUxJTlVYCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2NoZWNrIChCdXNTRUxpbnV4SUQgICAgICAgICpzZW5kZXJfc2lkLAorICAgICAgICAgICAgICAgICAgIEJ1c1NFTGludXhJRCAgICAgICAgKm92ZXJyaWRlX3NpZCwKKyAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9jbGFzc190ICAgICB0YXJnZXRfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgYWNjZXNzX3ZlY3Rvcl90ICAgICAgcmVxdWVzdGVkLAorCQkgICBEQnVzU3RyaW5nICAgICAgICAgICphdXhkYXRhKQoreworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBNYWtlIHRoZSBzZWN1cml0eSBjaGVjay4gIEFWQyBjaGVja3MgZW5mb3JjaW5nIG1vZGUgaGVyZSBhcyB3ZWxsLiAqLworICBpZiAoYXZjX2hhc19wZXJtIChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2VuZGVyX3NpZCksCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX3NpZCA/CisgICAgICAgICAgICAgICAgICAgIFNFTElOVVhfU0lEX0ZST01fQlVTIChvdmVycmlkZV9zaWQpIDoKKyAgICAgICAgICAgICAgICAgICAgU0VMSU5VWF9TSURfRlJPTV9CVVMgKGJ1c19zaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2NsYXNzLCByZXF1ZXN0ZWQsICZhZXJlZiwgYXV4ZGF0YSkgPCAwKQorICAgIHsKKyAgICBzd2l0Y2ggKGVycm5vKQorICAgICAgeworICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGRlbnlpbmcgZHVlIHRvIHNlY3VyaXR5IHBvbGljeS5cbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIEVJTlZBTDoKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggZGVueWluZyBkdWUgdG8gaW52YWxpZCBzZWN1cml0eSBjb250ZXh0LlxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGRlbnlpbmcgZHVlIHRvOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNvbm5lY3Rpb24gY2FuIGFjcXVpcmUgYSBzZXJ2aWNlLAorICogYXNzdW1pbmcgdGhlIGdpdmVuIHNlY3VyaXR5IElEIGlzIG5lZWRlZCBmb3IgdGhhdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gdGhhdCB3YW50cyB0byBvd24gdGhlIHNlcnZpY2UKKyAqIEBwYXJhbSBzZXJ2aWNlX3NpZCB0aGUgU0lEIG9mIHRoZSBzZXJ2aWNlIGZyb20gdGhlIHRhYmxlCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhY3F1aXJlIGlzIHBlcm1pdHRlZC4KKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NFTGludXhJRCAgICAgICAqc2VydmljZV9zaWQsCisJCQkJICAgIGNvbnN0IGNoYXIgICAgICAgICAqc2VydmljZV9uYW1lLAorCQkJCSAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBCdXNTRUxpbnV4SUQgKmNvbm5lY3Rpb25fc2lkOworICB1bnNpZ25lZCBsb25nIHNwaWQ7CisgIERCdXNTdHJpbmcgYXV4ZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0OworICAKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBjb25uZWN0aW9uX3NpZCA9IGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkIChjb25uZWN0aW9uKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbiwgJnNwaWQpKQorICAgIHNwaWQgPSAwOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXhkYXRhKSkKKyAgICBnb3RvIG9vbTsKKyAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgInNlcnZpY2U9IikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgc2VydmljZV9uYW1lKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoc3BpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHNwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgc3BpZCkpCisJZ290byBvb207CisgICAgfQorICAKKyAgcmV0ID0gYnVzX3NlbGludXhfY2hlY2sgKGNvbm5lY3Rpb25fc2lkLAorCQkJICAgc2VydmljZV9zaWQsCisJCQkgICBTRUNDTEFTU19EQlVTLAorCQkJICAgREJVU19fQUNRVUlSRV9TVkMsCisJCQkgICAmYXV4ZGF0YSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgcmV0dXJuIHJldDsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyoqCisgKiBDaGVjayBpZiBTRUxpbnV4IHNlY3VyaXR5IGNvbnRyb2xzIGFsbG93IHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gYQorICogcGFydGljdWxhciBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBzZW5kZXIgYW5kCisgKiB0aGF0IG9mIHRoZSByZWNlaXZlci4gVGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gbmVlZCBub3QgYmUgdGhlCisgKiBhZGRyZXNzZWQgcmVjaXBpZW50LCBpdCBjb3VsZCBiZSBhbiAiZWF2ZXNkcm9wcGVyIgorICoKKyAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSBwcm9wb3NlZF9yZWNpcGllbnQgdGhlIGNvbm5lY3Rpb24gdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCB0by4KKyAqIEByZXR1cm5zIHdoZXRoZXIgdG8gYWxsb3cgdGhlIHNlbmQKKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FsbG93c19zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKm1zZ3R5cGUsCisJCQkgY29uc3QgY2hhciAgICAgICAgICppbnRlcmZhY2UsCisJCQkgY29uc3QgY2hhciAgICAgICAgICptZW1iZXIsCisJCQkgY29uc3QgY2hhciAgICAgICAgICplcnJvcl9uYW1lLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqZGVzdGluYXRpb24sCisJCQkgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgQnVzU0VMaW51eElEICpyZWNpcGllbnRfc2lkOworICBCdXNTRUxpbnV4SUQgKnNlbmRlcl9zaWQ7CisgIHVuc2lnbmVkIGxvbmcgc3BpZCwgdHBpZDsKKyAgREJ1c1N0cmluZyBhdXhkYXRhOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIGRidXNfYm9vbF90IHN0cmluZ19hbGxvY2VkOworCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghc2VuZGVyIHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoc2VuZGVyLCAmc3BpZCkpCisgICAgc3BpZCA9IDA7CisgIGlmICghcHJvcG9zZWRfcmVjaXBpZW50IHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmdHBpZCkpCisgICAgdHBpZCA9IDA7CisKKyAgc3RyaW5nX2FsbG9jZWQgPSBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworICBzdHJpbmdfYWxsb2NlZCA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIm1zZ3R5cGU9IikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgbXNndHlwZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKGludGVyZmFjZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGludGVyZmFjZT0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGludGVyZmFjZSkpCisJZ290byBvb207CisgICAgfQorCisgIGlmIChtZW1iZXIpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBtZW1iZXI9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBtZW1iZXIpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAoZXJyb3JfbmFtZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGVycm9yX25hbWU9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBlcnJvcl9uYW1lKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGRlc3RpbmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgZGVzdD0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGRlc3RpbmF0aW9uKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKHNwaWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBzcGlkPSIpKQorCWdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoJmF1eGRhdGEsIHNwaWQpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAodHBpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHRwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgdHBpZCkpCisJZ290byBvb207CisgICAgfQorCisgIHNlbmRlcl9zaWQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoc2VuZGVyKTsKKyAgLyogQSBOVUxMIHByb3Bvc2VkX3JlY2lwaWVudCBtZWFucyB0aGUgYnVzIGl0c2VsZi4gKi8KKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCkKKyAgICByZWNpcGllbnRfc2lkID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgIGVsc2UKKyAgICByZWNpcGllbnRfc2lkID0gQlVTX1NJRF9GUk9NX1NFTElOVVggKGJ1c19zaWQpOworCisgIHJldCA9IGJ1c19zZWxpbnV4X2NoZWNrIChzZW5kZXJfc2lkLCAKKwkJCSAgIHJlY2lwaWVudF9zaWQsCisJCQkgICBTRUNDTEFTU19EQlVTLCAKKwkJCSAgIERCVVNfX1NFTkRfTVNHLAorCQkJICAgJmF1eGRhdGEpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisKKyAgcmV0dXJuIHJldDsKKworIG9vbToKKyAgaWYgKHN0cmluZ19hbGxvY2VkKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKKyAgCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0IChEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCSAgICBCdXNTRUxpbnV4SUQgICAqc2lkLAorCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29udGV4dDsKKworICBpZiAoYXZjX3NpZF90b19jb250ZXh0IChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2lkKSwgJmNvbnRleHQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdldHRpbmcgY29udGV4dCBmcm9tIFNJRDogJXNcbiIsCisJCQlfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorCQkJCSBEQlVTX1RZUEVfQVJSQVksCisJCQkJIERCVVNfVFlQRV9CWVRFLAorCQkJCSAmY29udGV4dCwKKwkJCQkgc3RybGVuIChjb250ZXh0KSwKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGZyZWVjb24gKGNvbnRleHQpOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cy4gSXQgaXMgdXAgdG8KKyAqIHRoZSBjYWxsZXIgdG8gZnJlZWNvbigpIHdoZW4gdGhleSBhcmUgZG9uZS4gCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gZ2V0IHRoZSBjb250ZXh0IG9mLgorICogQHBhcmFtIGNvbiB0aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHNlY3VyaXR5IGNvbnRleHQuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZC4KKyAqLworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIGRidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9yZWFkX3NlbGludXhfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICoqY29uKQoreworICBpbnQgZmQ7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkIChjb25uZWN0aW9uLCAmZmQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0IGZpbGUgZGVzY3JpcHRvciBvZiBzb2NrZXQuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZ2V0cGVlcmNvbiAoZmQsIGNvbikgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIGNvbnRleHQgb2Ygc29ja2V0IHBlZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSByZWFkIGNvbm5lY3Rpb24gY29udGV4dC5cbiIpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZWFkIHRoZSBTRUxpbnV4IElEIGZyb20gdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gcmVhZCBmcm9tCisgKiBAcmV0dXJucyB0aGUgU0lEIGlmIHN1Y2Nlc3NmdWxseSBkZXRlcm1pbmVkLCAjTlVMTCBvdGhlcndpc2UuCisgKi8KK0J1c1NFTGludXhJRCoKK2J1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29uOworICBzZWN1cml0eV9pZF90IHNpZDsKKyAgCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25fcmVhZF9zZWxpbnV4X2NvbnRleHQgKGNvbm5lY3Rpb24sICZjb24pKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGFuIFNFTGludXggY29udGV4dCBmcm9tIGNvbm5lY3Rpb24iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIHBlZXIgY29udGV4dC5cbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDb252ZXJ0aW5nIGNvbnRleHQgdG8gU0lEIHRvIHN0b3JlIG9uIGNvbm5lY3Rpb25cbiIpOworCisgIGlmIChhdmNfY29udGV4dF90b19zaWQgKGNvbiwgJnNpZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9NRU0pCisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCQljb24sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCSAgY29uLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgZnJlZWNvbiAoY29uKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAKKyAgZnJlZWNvbiAoY29uKTsgCisgIHJldHVybiBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKTsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisKKy8qKgorICogRnVuY3Rpb24gZm9yIGZyZWVpbmcgaGFzaCB0YWJsZSBkYXRhLiAgVGhlc2UgU0lEcworICogc2hvdWxkIG5vIGxvbmdlciBiZSByZWZlcmVuY2VkLgorICovCitzdGF0aWMgdm9pZAorYnVzX3NlbGludXhfaWRfdGFibGVfZnJlZV92YWx1ZSAoQnVzU0VMaW51eElEICpzaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIC8qIE5VTEwgc29tZXRpbWVzIGR1ZSB0byBob3cgREJ1c0hhc2hUYWJsZSB3b3JrcyAqLworICBpZiAoc2lkKQorICAgIGJ1c19zZWxpbnV4X2lkX3VucmVmIChzaWQpOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdGFibGUgbWFwcGluZyBzZXJ2aWNlIG5hbWVzIHRvIHNlY3VyaXR5IElELgorICogQSBzZWN1cml0eSBJRCBpcyBhICJjb21waWxlZCIgc2VjdXJpdHkgY29udGV4dCwgYSBzZWN1cml0eQorICogY29udGV4dCBpcyBqdXN0IGEgc3RyaW5nLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgdGFibGUgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNIYXNoVGFibGUqCitidXNfc2VsaW51eF9pZF90YWJsZV9uZXcgKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKSBidXNfc2VsaW51eF9pZF90YWJsZV9mcmVlX3ZhbHVlKTsKK30KKworLyoqIAorICogSGFzaGVzIGEgc2VydmljZSBuYW1lIGFuZCBzZXJ2aWNlIGNvbnRleHQgaW50byB0aGUgc2VydmljZSBTSUQKKyAqIHRhYmxlIGFzIGEgc3RyaW5nIGFuZCBhIFNJRC4KKyAqCisgKiBAcGFyYW0gc2VydmljZV9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLgorICogQHBhcmFtIHNlcnZpY2VfY29udGV4dCBpcyB0aGUgY29udGV4dCBvZiB0aGUgc2VydmljZS4KKyAqIEBwYXJhbSBzZXJ2aWNlX3RhYmxlIGlzIHRoZSB0YWJsZSB0byBoYXNoIHRoZW0gaW50by4KKyAqIEByZXR1cm4gI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQgKERCdXNIYXNoVGFibGUgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VydmljZV9jb250ZXh0KQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHNlY3VyaXR5X2lkX3Qgc2lkOworICBjaGFyICprZXk7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgc2lkID0gU0VDU0lEX1dJTEQ7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGtleSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZV9uYW1lKTsKKyAgaWYgKGtleSA9PSBOVUxMKQorICAgIHJldHVybiByZXR2YWw7CisgIAorICBpZiAoYXZjX2NvbnRleHRfdG9fc2lkICgoY2hhciAqKSBzZXJ2aWNlX2NvbnRleHQsICZzaWQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICB7CisJICBkYnVzX2ZyZWUgKGtleSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgX2RidXNfd2FybiAoIkVycm9yIGdldHRpbmcgU0lEIGZyb20gY29udGV4dCBcIiVzXCI6ICVzXG4iLAorCQkgIChjaGFyICopIHNlcnZpY2VfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX1NJRF9GUk9NX1NFTElOVVggKHNpZCkpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJQYXJzZWQgXHRzZXJ2aWNlOiAlcyBcblx0XHRjb250ZXh0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGtleSwgCisgICAgICAgICAgICAgICAgICBzaWQtPmN0eCk7CisKKyAgLyogVGhlc2UgYXJlIG93bmVkIGJ5IHRoZSBoYXNoLCBzbyBjbGVhciB0aGVtIHRvIGF2b2lkIHVucmVmICovCisgIGtleSA9IE5VTEw7CisgIHNpZCA9IFNFQ1NJRF9XSUxEOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKHNpZCAhPSBTRUNTSURfV0lMRCkKKyAgICBzaWRwdXQgKHNpZCk7CisKKyAgaWYgKGtleSkKKyAgICBkYnVzX2ZyZWUgKGtleSk7CisKKyAgcmV0dXJuIHJldHZhbDsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisKKy8qKgorICogRmluZCB0aGUgc2VjdXJpdHkgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHNlcnZpY2UKKyAqIG5hbWUuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoaXMgU0lELCBvciAjTlVMTC9TRUNTSURfV0lMRCBpZiB0aGUKKyAqIHNlcnZpY2UgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyBzaG91bGQgYmUgbmVhcmx5IGEKKyAqIGNvbnN0YW50IHRpbWUgb3BlcmF0aW9uLiAgSWYgU0VMaW51eCBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsCisgKiBhbHdheXMgcmV0dXJuIE5VTEwuCisgKgorICogQHBhcmFtIHNlcnZpY2VfdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gY2hlY2sgZm9yIHNlcnZpY2UgbmFtZS4KKyAqIEBwYXJhbSBzZXJ2aWNlX25hbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gbG9vayBmb3IuCisgKiBAcmV0dXJucyB0aGUgU0VMaW51eCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UKKyAqLworQnVzU0VMaW51eElEKgorYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIHNlY3VyaXR5X2lkX3Qgc2lkOworCisgIHNpZCA9IFNFQ1NJRF9XSUxEOyAgICAgLyogZGVmYXVsdCBjb250ZXh0ICovCisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyB1cCBzZXJ2aWNlIFNJRCBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgc2lkID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgaWYgKHNpZCA9PSBTRUNTSURfV0lMRCkKKyAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSAlcyBub3QgZm91bmRcbiIsIAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgIGVsc2UKKyAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSAlcyBmb3VuZFxuIiwgCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICByZXR1cm4gQlVTX1NJRF9GUk9NX1NFTElOVVggKHNpZCk7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldCB0aGUgU0VMaW51eCBwb2xpY3kgcm9vdC4gIFRoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSBELUJ1cworICogc3BlY2lmaWMgY29uZmlnIGZpbGUgd2l0aGluIHRoZSBwb2xpY3kuCisgKi8KK2NvbnN0IGNoYXIgKgorYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICByZXR1cm4gc2VsaW51eF9wb2xpY3lfcm9vdCAoKTsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfSAKKworLyoqCisgKiBGb3IgZGVidWdnaW5nOiAgUHJpbnQgb3V0IHRoZSBjdXJyZW50IGhhc2ggdGFibGUgb2Ygc2VydmljZSBTSURzLgorICovCit2b2lkCitidXNfc2VsaW51eF9pZF90YWJsZV9wcmludCAoREJ1c0hhc2hUYWJsZSAqc2VydmljZV90YWJsZSkKK3sKKyNpZiBkZWZpbmVkIChEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpICYmIGRlZmluZWQgKEhBVkVfU0VMSU5VWCkKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfdmVyYm9zZSAoIlNlcnZpY2UgU0lEIFRhYmxlOlxuIik7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChzZXJ2aWNlX3RhYmxlLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmtleSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgc2VjdXJpdHlfaWRfdCBzaWQgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiVGhlIGtleSBpcyAlc1xuIiwga2V5KTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUgY29udGV4dCBpcyAlc1xuIiwgc2lkLT5jdHgpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlRoZSByZWZjb3VudCBpcyAlZFxuIiwgc2lkLT5yZWZjbnQpOworICAgIH0KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgJiYgSEFWRV9TRUxJTlVYICovCit9CisKKworLyoqCisgKiBQcmludCBvdXQgc29tZSBBVkMgc3RhdGlzdGljcy4KKyAqLworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIHZvaWQKK2J1c19hdmNfcHJpbnRfc3RhdHMgKHZvaWQpCit7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHN0cnVjdCBhdmNfY2FjaGVfc3RhdHMgY3N0YXRzOworCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybjsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJBVkMgU3RhdGlzdGljczpcbiIpOworICBhdmNfY2FjaGVfc3RhdHMgKCZjc3RhdHMpOworICBhdmNfYXZfc3RhdHMgKCk7CisgIF9kYnVzX3ZlcmJvc2UgKCJBVkMgQ2FjaGUgU3RhdGlzdGljczpcbiIpOworICBfZGJ1c192ZXJib3NlICgiRW50cnkgbG9va3VwczogJWRcbiIsIGNzdGF0cy5lbnRyeV9sb29rdXBzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkVudHJ5IGhpdHM6ICVkXG4iLCBjc3RhdHMuZW50cnlfaGl0cyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBtaXNzZXMgJWRcbiIsIGNzdGF0cy5lbnRyeV9taXNzZXMpOworICBfZGJ1c192ZXJib3NlICgiRW50cnkgZGlzY2FyZHM6ICVkXG4iLCBjc3RhdHMuZW50cnlfZGlzY2FyZHMpOworICBfZGJ1c192ZXJib3NlICgiQ0FWIGxvb2t1cHM6ICVkXG4iLCBjc3RhdHMuY2F2X2xvb2t1cHMpOworICBfZGJ1c192ZXJib3NlICgiQ0FWIGhpdHM6ICVkXG4iLCBjc3RhdHMuY2F2X2hpdHMpOworICBfZGJ1c192ZXJib3NlICgiQ0FWIHByb2JlczogJWRcbiIsIGNzdGF0cy5jYXZfcHJvYmVzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkNBViBtaXNzZXM6ICVkXG4iLCBjc3RhdHMuY2F2X21pc3Nlcyk7CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCit9CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogRGVzdHJveSB0aGUgQVZDIGJlZm9yZSB3ZSB0ZXJtaW5hdGUuCisgKi8KK3ZvaWQKK2J1c19zZWxpbnV4X3NodXRkb3duICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBzaHV0ZG93blxuIik7CisKKyAgaWYgKGJ1c19zaWQgIT0gU0VDU0lEX1dJTEQpCisgICAgeworICAgICAgc2lkcHV0IChidXNfc2lkKTsKKyAgICAgIGJ1c19zaWQgPSBTRUNTSURfV0lMRDsKKworICAgICAgYnVzX2F2Y19wcmludF9zdGF0cyAoKTsKKworICAgICAgYXZjX2Rlc3Ryb3kgKCk7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQpkaWZmIC0tZ2l0IGEvYnVzL3NlbGludXguaCBiL2J1cy9zZWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0Yzk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZWxpbnV4LmgKQEAgLTAsMCArMSw2OSBAQAorLyogc2VsaW51eC5oICBTRUxpbnV4IHNlY3VyaXR5IGNoZWNrIGhlYWRlcnMgZm9yIEQtQlVTCisgKgorICogQXV0aG9yOiBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NFTElOVVhfSAorI2RlZmluZSBCVVNfU0VMSU5VWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAic2VydmljZXMuaCIKKworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfcHJlX2luaXQgKHZvaWQpOworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfZnVsbF9pbml0KHZvaWQpOwordm9pZCAgICAgICAgYnVzX3NlbGludXhfc2h1dGRvd24gKHZvaWQpOworCitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9lbmFibGVkICAodm9pZCk7CisKK3ZvaWQgYnVzX3NlbGludXhfaWRfcmVmICAgIChCdXNTRUxpbnV4SUQgKnNpZCk7Cit2b2lkIGJ1c19zZWxpbnV4X2lkX3VucmVmICAoQnVzU0VMaW51eElEICpzaWQpOworCitEQnVzSGFzaFRhYmxlKiBidXNfc2VsaW51eF9pZF90YWJsZV9uZXcgICAgKHZvaWQpOworQnVzU0VMaW51eElEKiAgYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpOworZGJ1c19ib29sX3QgICAgYnVzX3NlbGludXhfaWRfdGFibGVfaW5zZXJ0IChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnNlcnZpY2VfY29udGV4dCk7Cit2b2lkICAgICAgICAgICBidXNfc2VsaW51eF9pZF90YWJsZV9wcmludCAgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUpOworY29uc3QgY2hhciogICAgYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICh2b2lkKTsKKworZGJ1c19ib29sX3QgICAgYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQgICAgICAoREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCQlCdXNTRUxpbnV4SUQgICAqY29udGV4dCwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU0VMaW51eElEICAgKnNlcnZpY2Vfc2lkLAorCQkJCQkJY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2FsbG93c19zZW5kICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorCQkJCQkJY29uc3QgY2hhciAgICAgKm1zZ3R5cGUsIC8qIFN1cHBsZW1lbnRhcnkgYXVkaXQgZGF0YSAqLworCQkJCQkJY29uc3QgY2hhciAgICAgKmludGVyZmFjZSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICptZW1iZXIsCisJCQkJCQljb25zdCBjaGFyICAgICAqZXJyb3JfbmFtZSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICpkZXN0aW5hdGlvbiwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK0J1c1NFTGludXhJRCogYnVzX3NlbGludXhfaW5pdF9jb25uZWN0aW9uX2lkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX1NFTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3NlcnZpY2VzLmMgYi9idXMvc2VydmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRjODg0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3NlcnZpY2VzLmMKQEAgLTAsMCArMSwxMzEyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHNlcnZpY2VzLmMgIFNlcnZpY2UgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1wb29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKworI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlICJhcHBhcm1vci5oIgorCitzdHJ1Y3QgQnVzU2VydmljZQoreworICBpbnQgcmVmY291bnQ7CisKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBjaGFyICpuYW1lOworICBEQnVzTGlzdCAqb3duZXJzOworfTsKKworc3RydWN0IEJ1c093bmVyCit7CisgIGludCByZWZjb3VudDsKKworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKworICB1bnNpZ25lZCBpbnQgYWxsb3dfcmVwbGFjZW1lbnQgOiAxOworICB1bnNpZ25lZCBpbnQgZG9fbm90X3F1ZXVlIDogMTsKK307CisKK3N0cnVjdCBCdXNSZWdpc3RyeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgCisgIERCdXNIYXNoVGFibGUgKnNlcnZpY2VfaGFzaDsKKyAgREJ1c01lbVBvb2wgICAqc2VydmljZV9wb29sOworICBEQnVzTWVtUG9vbCAgICpvd25lcl9wb29sOworCisgIERCdXNIYXNoVGFibGUgKnNlcnZpY2Vfc2lkX3RhYmxlOworfTsKKworQnVzUmVnaXN0cnkqCitidXNfcmVnaXN0cnlfbmV3IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisKKyAgX2RidXNfYXNzZXJ0IChjb250ZXh0KTsKKyAgcmVnaXN0cnkgPSBkYnVzX25ldzAgKEJ1c1JlZ2lzdHJ5LCAxKTsKKyAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVnaXN0cnktPnJlZmNvdW50ID0gMTsKKyAgcmVnaXN0cnktPmNvbnRleHQgPSBjb250ZXh0OworICAKKyAgcmVnaXN0cnktPnNlcnZpY2VfaGFzaCA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICBpZiAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgcmVnaXN0cnktPnNlcnZpY2VfcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZW9mIChCdXNTZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZWdpc3RyeS0+b3duZXJfcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZW9mIChCdXNPd25lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKworICBpZiAocmVnaXN0cnktPm93bmVyX3Bvb2wgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUgPSBOVUxMOworICAKKyAgcmV0dXJuIHJlZ2lzdHJ5OworCisgZmFpbGVkOgorICBidXNfcmVnaXN0cnlfdW5yZWYgKHJlZ2lzdHJ5KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0J1c1JlZ2lzdHJ5ICoKK2J1c19yZWdpc3RyeV9yZWYgKEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChyZWdpc3RyeS0+cmVmY291bnQgPiAwKTsKKyAgcmVnaXN0cnktPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHJlZ2lzdHJ5OworfQorCit2b2lkCitidXNfcmVnaXN0cnlfdW5yZWYgIChCdXNSZWdpc3RyeSAqcmVnaXN0cnkpCit7CisgIF9kYnVzX2Fzc2VydCAocmVnaXN0cnktPnJlZmNvdW50ID4gMCk7CisgIHJlZ2lzdHJ5LT5yZWZjb3VudCAtPSAxOworCisgIGlmIChyZWdpc3RyeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgICAgICBpZiAocmVnaXN0cnktPnNlcnZpY2VfcG9vbCkKKyAgICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAocmVnaXN0cnktPnNlcnZpY2VfcG9vbCk7CisgICAgICBpZiAocmVnaXN0cnktPm93bmVyX3Bvb2wpCisgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHJlZ2lzdHJ5LT5vd25lcl9wb29sKTsKKyAgICAgIGlmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAocmVnaXN0cnkpOworICAgIH0KK30KKworQnVzU2VydmljZSoKK2J1c19yZWdpc3RyeV9sb29rdXAgKEJ1c1JlZ2lzdHJ5ICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lKQoreworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworCisgIHNlcnZpY2UgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgcmV0dXJuIHNlcnZpY2U7Cit9CisKK3N0YXRpYyBEQnVzTGlzdCAqCitfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChCdXNTZXJ2aWNlICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworCisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzT3duZXIgKmJ1c19vd25lcjsKKworICAgICAgYnVzX293bmVyID0gKEJ1c093bmVyICopIGxpbmstPmRhdGE7CisgICAgICBpZiAoYnVzX293bmVyLT5jb25uID09IGNvbm5lY3Rpb24pIAorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgfQorCisgIHJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZAorYnVzX293bmVyX3NldF9mbGFncyAoQnVzT3duZXIgKm93bmVyLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBmbGFncykKK3sKKyAgIG93bmVyLT5hbGxvd19yZXBsYWNlbWVudCA9IAorICAgICAgICAoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCkgIT0gRkFMU0U7CisKKyAgIG93bmVyLT5kb19ub3RfcXVldWUgPQorICAgICAgICAoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpICE9IEZBTFNFOworfQorCitzdGF0aWMgQnVzT3duZXIgKgorYnVzX293bmVyX25ldyAoQnVzU2VydmljZSAqc2VydmljZSwgCisgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubiwgCisJICAgICAgIGRidXNfdWludDMyX3QgZmxhZ3MpCit7CisgIEJ1c093bmVyICpyZXN1bHQ7CisKKyAgcmVzdWx0ID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5vd25lcl9wb29sKTsKKyAgaWYgKHJlc3VsdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlc3VsdC0+cmVmY291bnQgPSAxOworICAgICAgLyogZG9uJ3QgcmVmIHRoZSBjb25uZWN0aW9uIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAorICAgICAgICAgdG8gYmxvY2sgdGhlIGNvbm5lY3Rpb24gZnJvbSBnb2luZyBhd2F5LgorICAgICAgICAgdHJhbnNhY3Rpb25zIHRha2UgY2FyZSBvZiByZWZmaW5nIHRoZSBjb25uZWN0aW9uCisgICAgICAgICBidXQgd2UgbmVlZCB0byB1c2UgcmVmY291bnRpbmcgb24gdGhlIG93bmVyCisgICAgICAgICBzbyB0aGF0IHRoZSBvd25lciBkb2VzIG5vdCBnZXQgZnJlZWQgYmVmb3JlCisgICAgICAgICB3ZSBjYW4gZGVyZWYgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIHRyYW5zYWN0aW9uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdC0+Y29ubiA9IGNvbm47CisgICAgICByZXN1bHQtPnNlcnZpY2UgPSBzZXJ2aWNlOworCisgICAgICBpZiAoIWJ1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlIChjb25uLCBzZXJ2aWNlKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5vd25lcl9wb29sLCByZXN1bHQpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIAorICAgICAgYnVzX293bmVyX3NldF9mbGFncyAocmVzdWx0LCBmbGFncyk7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgQnVzT3duZXIgKgorYnVzX293bmVyX3JlZiAoQnVzT3duZXIgKm93bmVyKQoreworICBfZGJ1c19hc3NlcnQgKG93bmVyLT5yZWZjb3VudCA+IDApOworICBvd25lci0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gb3duZXI7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfb3duZXJfdW5yZWYgIChCdXNPd25lciAqb3duZXIpCit7CisgIF9kYnVzX2Fzc2VydCAob3duZXItPnJlZmNvdW50ID4gMCk7CisgIG93bmVyLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChvd25lci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBidXNfY29ubmVjdGlvbl9yZW1vdmVfb3duZWRfc2VydmljZSAob3duZXItPmNvbm4sIG93bmVyLT5zZXJ2aWNlKTsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKG93bmVyLT5zZXJ2aWNlLT5yZWdpc3RyeS0+b3duZXJfcG9vbCwgb3duZXIpOworICAgIH0KK30KKworQnVzU2VydmljZSoKK2J1c19yZWdpc3RyeV9lbnN1cmUgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqb3duZXJfY29ubmVjdGlvbl9pZl9jcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgX2RidXNfYXNzZXJ0IChvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24gIT0gTlVMTCk7CisKKyAgc2VydmljZSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgaWYgKHNlcnZpY2UgIT0gTlVMTCkKKyAgICByZXR1cm4gc2VydmljZTsKKyAgCisgIHNlcnZpY2UgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAocmVnaXN0cnktPnNlcnZpY2VfcG9vbCk7CisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzZXJ2aWNlLT5yZWdpc3RyeSA9IHJlZ2lzdHJ5OyAgCisgIHNlcnZpY2UtPnJlZmNvdW50ID0gMTsKKworICBfZGJ1c192ZXJib3NlICgiY29weWluZyBzdHJpbmcgJXAgJyVzJyB0byBzZXJ2aWNlLT5uYW1lXG4iLAorICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoc2VydmljZV9uYW1lLCAmc2VydmljZS0+bmFtZSkpCisgICAgeworICAgICAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAocmVnaXN0cnktPnNlcnZpY2VfcG9vbCwgc2VydmljZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBfZGJ1c192ZXJib3NlICgiY29waWVkIHN0cmluZyAlcCAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpLAorICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKworICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKHNlcnZpY2UtPm5hbWUsIAorCQkJCQkgICAgICBOVUxMLAorCQkJCQkgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAob3duZXJfY29ubmVjdGlvbl9pZl9jcmVhdGVkKSwKKwkJCQkJICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICB7CisgICAgICBidXNfc2VydmljZV91bnJlZiAoc2VydmljZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQgKGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uIChyZWdpc3RyeS0+Y29udGV4dCksCisJCQkJICAgICAgIHNlcnZpY2UtPm5hbWUsIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5yZWYgKHNlcnZpY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFidXNfc2VydmljZV9hZGRfb3duZXIgKHNlcnZpY2UsIG93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICB7CisgICAgICBidXNfc2VydmljZV91bnJlZiAoc2VydmljZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKSkKKyAgICB7CisgICAgICAvKiBUaGUgYWRkX293bmVyIGdldHMgcmV2ZXJ0ZWQgb24gdHJhbnNhY3Rpb24gY2FuY2VsICovCisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIHNlcnZpY2U7Cit9CisKK3ZvaWQKK2J1c19yZWdpc3RyeV9mb3JlYWNoIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChyZWdpc3RyeS0+c2VydmljZV9oYXNoLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2UgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgICgqIGZ1bmN0aW9uKSAoc2VydmljZSwgZGF0YSk7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X2xpc3Rfc2VydmljZXMgKEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKioqbGlzdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgKmFycmF5X2xlbikKK3sKKyAgaW50IGksIGosIGxlbjsKKyAgY2hhciAqKnJldHZhbDsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgICAKKyAgbGVuID0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChyZWdpc3RyeS0+c2VydmljZV9oYXNoKTsKKyAgcmV0dmFsID0gZGJ1c19uZXcgKGNoYXIgKiwgbGVuICsgMSk7CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwgJml0ZXIpOworICBpID0gMDsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgQnVzU2VydmljZSAqc2VydmljZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgcmV0dmFsW2ldID0gX2RidXNfc3RyZHVwIChzZXJ2aWNlLT5uYW1lKTsKKyAgICAgIGlmIChyZXR2YWxbaV0gPT0gTlVMTCkKKwlnb3RvIGVycm9yOworCisgICAgICBpKys7CisgICAgfQorCisgIHJldHZhbFtpXSA9IE5VTEw7CisgIAorICBpZiAoYXJyYXlfbGVuKQorICAgICphcnJheV9sZW4gPSBsZW47CisgIAorICAqbGlzdHAgPSByZXR2YWw7CisgIHJldHVybiBUUlVFOworICAKKyBlcnJvcjoKKyAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICBkYnVzX2ZyZWUgKHJldHZhbFtqXSk7CisgIGRidXNfZnJlZSAocmV0dmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Nvbm5lY3Rpb24gKm9sZF9vd25lcl9jb25uOworICBCdXNDbGllbnRQb2xpY3kgKnBvbGljeTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgQnVzQWN0aXZhdGlvbiAgKmFjdGl2YXRpb247CisgIEJ1c1NFTGludXhJRCAqc2lkOworICBCdXNPd25lciAqcHJpbWFyeV9vd25lcjsKKyAKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoc2VydmljZV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc2VydmljZV9uYW1lKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdGVkIGJ1cyBuYW1lIFwiJXNcIiBpcyBub3QgdmFsaWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIGFjcXVpcmUgaW52YWxpZCBzZXJ2aWNlIG5hbWVcbiIpOworICAgICAgCisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzZXJ2aWNlX25hbWUsIDApID09ICc6JykKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgb25seSBiYXNlIHNlcnZpY2VzIGNhbiBzdGFydCB3aXRoICc6JyAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGFjcXVpcmUgYSBzZXJ2aWNlIHN0YXJ0aW5nIHdpdGggJzonIHN1Y2ggYXMgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byBhY3F1aXJlIGludmFsaWQgYmFzZSBzZXJ2aWNlIG5hbWUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICAKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gdGhlIHNlcnZpY2UgXCIlc1wiYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgIml0IGlzIHJlc2VydmVkIGZvciBELUJ1cycgdXNlIG9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgIihpbmFjdGl2ZSkiLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwb2xpY3kgPSBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3kgIT0gTlVMTCk7CisKKyAgLyogTm90ZSB0aGF0IGlmIHNpZCBpcyAjTlVMTCB0aGVuIHRoZSBidXMncyBvd24gY29udGV4dCBnZXRzIHVzZWQKKyAgICogaW4gYnVzX2Nvbm5lY3Rpb25fc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKCkKKyAgICovCisgIHNpZCA9IGJ1c19zZWxpbnV4X2lkX3RhYmxlX2xvb2t1cCAocmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKCFidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChjb25uZWN0aW9uLCBzaWQsCisJCQkJCSAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSwgZXJyb3IpKQorICAgIHsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikgJiYKKwkgIGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisJeworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBcIiVzXCIgaXMgbm90IGFsbG93ZWQgdG8gb3duIHRoZSBzZXJ2aWNlIFwiJXNcIiBkdWUgIgorICAgICAgICAgICAgICAgICAgICAgICJ0byBTRUxpbnV4IHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c19hcHBhcm1vcl9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfdHlwZSAocmVnaXN0cnktPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSksIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX293biAocG9saWN5LCBzZXJ2aWNlX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gdGhlIHNlcnZpY2UgXCIlc1wiIGR1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgInRvIHNlY3VyaXR5IHBvbGljaWVzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgIihpbmFjdGl2ZSkiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2dldF9uX3NlcnZpY2VzX293bmVkIChjb25uZWN0aW9uKSA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiAocmVnaXN0cnktPmNvbnRleHQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biBtb3JlIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksIHNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKHNlcnZpY2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICAgICAgaWYgKHByaW1hcnlfb3duZXIgIT0gTlVMTCkKKyAgICAgICAgb2xkX293bmVyX2Nvbm4gPSBwcmltYXJ5X293bmVyLT5jb25uOworICAgICAgZWxzZQorICAgICAgICBvbGRfb3duZXJfY29ubiA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgb2xkX293bmVyX2Nvbm4gPSBOVUxMOworICAgICAgCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9lbnN1cmUgKHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgY29ubmVjdGlvbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKTsKKyAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmIChvbGRfb3duZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocHJpbWFyeV9vd25lci0+Y29ubiA9PSBjb25uZWN0aW9uKTsKKworICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI7ICAgICAgCisgICAgfQorICBlbHNlIGlmIChvbGRfb3duZXJfY29ubiA9PSBjb25uZWN0aW9uKQorICAgIHsKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKHByaW1hcnlfb3duZXIsIGZsYWdzKTsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9BTFJFQURZX09XTkVSOworICAgIH0KKyAgZWxzZSBpZiAoKChmbGFncyAmIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSkgJiYKKyAgICAgICAgICAgIShidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgKHNlcnZpY2UpKSkgfHwKKwkgICAoKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAmJgorICAgICAgICAgICAhKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORykpKSAKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICp0ZW1wX293bmVyOworICAgIC8qIFNpbmNlIHdlIGNhbid0IGJlIHF1ZXVlZCBpZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcXVldWUKKyAgICAgICByZW1vdmUgdXMgKi8KKworICAgICAgbGluayA9IF9idXNfc2VydmljZV9maW5kX293bmVyX2xpbmsgKHNlcnZpY2UsIGNvbm5lY3Rpb24pOworICAgICAgaWYgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgICAgICB0ZW1wX293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgICAgICBidXNfb3duZXJfdW5yZWYgKHRlbXBfb3duZXIpOyAKKyAgICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0VYSVNUUzsKKyAgICB9CisgIGVsc2UgaWYgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpICYmCisgICAgICAgICAgICghKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORykgfHwKKwkgICAgIShidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgKHNlcnZpY2UpKSkpCisgICAgeworICAgICAgLyogUXVldWUgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgIGlmICghYnVzX3NlcnZpY2VfYWRkX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgb3duZXIgKi8KKworICAgICAgLyogV2UgZW5xdWV1ZSB0aGUgbmV3IG93bmVyIGFuZCByZW1vdmUgdGhlIGZpcnN0IG9uZSBiZWNhdXNlCisgICAgICAgKiB0aGF0IHdpbGwgY2F1c2UgTmFtZUFjcXVpcmVkIGFuZCBOYW1lTG9zdCBtZXNzYWdlcyB0bworICAgICAgICogYmUgc2VudC4KKyAgICAgICAqLworICAgICAgCisgICAgICBpZiAoIWJ1c19zZXJ2aWNlX2FkZF9vd25lciAoc2VydmljZSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKHByaW1hcnlfb3duZXItPmRvX25vdF9xdWV1ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIChzZXJ2aWNlLCBvbGRfb3duZXJfY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19zZXJ2aWNlX3N3YXBfb3duZXIgKHNlcnZpY2UsIG9sZF9vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIAorICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uID09IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKS0+Y29ubik7CisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUjsKKyAgICB9CisKKyAgYWN0aXZhdGlvbiA9IGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uIChyZWdpc3RyeS0+Y29udGV4dCk7CisgIHJldHZhbCA9IGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRpb25fbWVzc2FnZXMgKGFjdGl2YXRpb24sCisJCQkJCQkJCSBzZXJ2aWNlLAorCQkJCQkJCQkgdHJhbnNhY3Rpb24pOworICBpZiAoIXJldHZhbCkKKyAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAKKyBvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoc2VydmljZV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc2VydmljZV9uYW1lKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiR2l2ZW4gYnVzIG5hbWUgXCIlc1wiIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gcmVsZWFzZSBpbnZhbGlkIHNlcnZpY2UgbmFtZVxuIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzZXJ2aWNlX25hbWUsIDApID09ICc6JykKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSBhIHNlcnZpY2Ugc3RhcnRpbmcgd2l0aCAnOicgc3VjaCBhcyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIHJlbGVhc2UgaW52YWxpZCBiYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSB0aGUgJXMgc2VydmljZSBiZWNhdXNlIGl0IGlzIG93bmVkIGJ5IHRoZSBidXMiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byByZWxlYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCBzZXJ2aWNlX25hbWUpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDsKKyAgICB9CisgIGVsc2UgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWJ1c19zZXJ2aWNlX2hhc19vd25lciAoc2VydmljZSwgY29ubmVjdGlvbikpOworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgKnJlZ2lzdHJ5LAorCQkJCQlEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hUYWJsZSAqbmV3X3RhYmxlOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgCisgIG5ld190YWJsZSA9IGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldyAoKTsKKyAgaWYgKCFuZXdfdGFibGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBjb25zdCBjaGFyICpjb250ZXh0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBpZiAoIWJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCAobmV3X3RhYmxlLAorCQkJCQlzZXJ2aWNlLAorCQkJCQljb250ZXh0KSkKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpOworICByZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUgPSBuZXdfdGFibGU7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChCdXNTZXJ2aWNlICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICAqb3duZXIpCit7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZzZXJ2aWNlLT5vd25lcnMsIG93bmVyKTsKKyAgYnVzX293bmVyX3VucmVmIChvd25lcik7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV91bmxpbmsgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworCisgIC8qIHRoZSBzZXJ2aWNlIG1heSBub3QgYmUgaW4gdGhlIGhhc2gsIGlmCisgICAqIHRoZSBmYWlsdXJlIGNhdXNpbmcgdHJhbnNhY3Rpb24gY2FuY2VsCisgICAqIHdhcyBpbiB0aGUgcmlnaHQgcGxhY2UsIGJ1dCB0aGF0J3MgT0sKKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKyAgCisgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19zZXJ2aWNlX3JlbGluayAoQnVzU2VydmljZSAgICAgICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkIChzZXJ2aWNlLT5yZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOworICAKKyAgYnVzX3NlcnZpY2VfcmVmIChzZXJ2aWNlKTsKK30KKworLyoqCisgKiBEYXRhIHVzZWQgdG8gcmVwcmVzZW50IGFuIG93bmVyc2hpcCBjYW5jZWxsYXRpb24gaW4KKyAqIGEgYnVzIHRyYW5zYWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNPd25lciAqb3duZXI7ICAgICAgICAgICAgLyoqPCB0aGUgb3duZXIgKi8KKyAgQnVzU2VydmljZSAqc2VydmljZTsgICAgICAgIC8qKjwgc2VydmljZSB0byBjYW5jZWwgb3duZXJzaGlwIG9mICovCit9IE93bmVyc2hpcENhbmNlbERhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfb3duZXJzaGlwICh2b2lkICpkYXRhKQoreworICBPd25lcnNoaXBDYW5jZWxEYXRhICpkID0gZGF0YTsKKworICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBidXNfc2VydmljZV91bmxpbmtfb3duZXIgKGQtPnNlcnZpY2UsIGQtPm93bmVyKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICBidXNfc2VydmljZV91bmxpbmsgKGQtPnNlcnZpY2UpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcENhbmNlbERhdGEgKmQgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZC0+b3duZXItPmNvbm4pOworICBidXNfb3duZXJfdW5yZWYgKGQtPm93bmVyKTsKKyAgYnVzX3NlcnZpY2VfdW5yZWYgKGQtPnNlcnZpY2UpOworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICpvd25lcikKK3sKKyAgT3duZXJzaGlwQ2FuY2VsRGF0YSAqZDsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcENhbmNlbERhdGEsIDEpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGQtPnNlcnZpY2UgPSBzZXJ2aWNlOworICBkLT5vd25lciA9IG93bmVyOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIGNhbmNlbF9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19zZXJ2aWNlX3JlZiAoZC0+c2VydmljZSk7CisgIGJ1c19vd25lcl9yZWYgKG93bmVyKTsKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoZC0+b3duZXItPmNvbm4pOworIAorICByZXR1cm4gVFJVRTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBzZWxmLWNhbmNlbGxpbmcgaWYgeW91IGNhbmNlbCB0aGUgdHJhbnNhY3Rpb24gKi8KK2RidXNfYm9vbF90CitidXNfc2VydmljZV9hZGRfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNPd25lciAqYnVzX293bmVyOworICBEQnVzTGlzdCAqYnVzX293bmVyX2xpbms7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgLyogU2VuZCBzZXJ2aWNlIGFjcXVpcmVkIG1lc3NhZ2UgZmlyc3QsIE9PTSB3aWxsIHJlc3VsdAorICAqIGluIGNhbmNlbGxpbmcgdGhlIHRyYW5zYWN0aW9uCisgICovCisgIGlmIChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkIChjb25uZWN0aW9uLCBzZXJ2aWNlLT5uYW1lLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgYnVzX293bmVyX2xpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgCisgIGlmIChidXNfb3duZXJfbGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c19vd25lciA9IGJ1c19vd25lcl9uZXcgKHNlcnZpY2UsIGNvbm5lY3Rpb24sIGZsYWdzKTsKKyAgICAgIGlmIChidXNfb3duZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKGJ1c19vd25lciwgZmxhZ3MpOworICAgICAgaWYgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKSB8fCBzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX293bmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX293bmVyX3VucmVmIChidXNfb3duZXIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfb3duZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfb3duZXJfdW5yZWYgKGJ1c19vd25lcik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgIH0gCisgIGVsc2UgCisgICAgeworICAgICAgLyogVXBkYXRlIHRoZSBsaW5rIHNpbmNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBxdWV1ZQorICAgICAgICogTm8gbmVlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiBwcm9kdWNlIE9PTQorICAgICAgICovCisKKyAgICAgIGJ1c19vd25lciA9IChCdXNPd25lciAqKSBidXNfb3duZXJfbGluay0+ZGF0YTsKKyAgICAgIGlmIChmbGFncyAmIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcpCisgICAgICAgIHsKKwkgIERCdXNMaXN0ICpsaW5rOworICAgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBidXNfb3duZXJfbGluayk7CisJICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisJICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisJICAKKyAgICAgICAgICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rLCBidXNfb3duZXJfbGluayk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgYnVzX293bmVyX3NldF9mbGFncyAoYnVzX293bmVyLCBmbGFncyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19vd25lcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChzZXJ2aWNlLCBidXNfb3duZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c093bmVyICAgICAgICpvd25lcjsKKyAgQnVzU2VydmljZSAgICAgKnNlcnZpY2U7CisgIEJ1c093bmVyICAgICAgICpiZWZvcmVfb3duZXI7IC8qIHJlc3RvcmUgdG8gcG9zaXRpb24gYmVmb3JlIHRoaXMgY29ubmVjdGlvbiBpbiBvd25lcnMgbGlzdCAqLworICBEQnVzTGlzdCAgICAgICAqb3duZXJfbGluazsKKyAgREJ1c0xpc3QgICAgICAgKnNlcnZpY2VfbGluazsKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKmhhc2hfZW50cnk7Cit9IE93bmVyc2hpcFJlc3RvcmVEYXRhOworCitzdGF0aWMgdm9pZAorcmVzdG9yZV9vd25lcnNoaXAgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkID0gZGF0YTsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChkLT5zZXJ2aWNlX2xpbmsgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+b3duZXJfbGluayAhPSBOVUxMKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgIT0gTlVMTCk7CisgICAgICBidXNfc2VydmljZV9yZWxpbmsgKGQtPnNlcnZpY2UsIGQtPmhhc2hfZW50cnkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZC0+aGFzaF9lbnRyeSA9PSBOVUxMKTsKKyAgICB9CisgIAorICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gZC0+YmVmb3JlX293bmVyKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKCZkLT5zZXJ2aWNlLT5vd25lcnMsIGxpbmssIGQtPm93bmVyX2xpbmspOworCisgIC8qIE5vdGUgdGhhdCByZW1vdmluZyB0aGVuIHJlc3RvcmluZyB0aGlzIGNoYW5nZXMgdGhlIG9yZGVyIGluIHdoaWNoCisgICAqIFNlcnZpY2VEZWxldGVkIG1lc3NhZ2VzIGFyZSBzZW50IG9uIGRlc3RydWN0aW9uIG9mIHRoZQorICAgKiBjb25uZWN0aW9uLiAgVGhpcyBzaG91bGQgYmUgT0sgYXMgdGhlIG9ubHkgZ3VhcmFudGVlIHRoZXJlIGlzCisgICAqIHRoYXQgdGhlIGJhc2Ugc2VydmljZSBpcyBkZXN0cm95ZWQgbGFzdCwgYW5kIHdlIG5ldmVyIGV2ZW4KKyAgICogdGVudGF0aXZlbHkgcmVtb3ZlIHRoZSBiYXNlIHNlcnZpY2UuCisgICAqLworICBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZV9saW5rIChkLT5vd25lci0+Y29ubiwgZC0+c2VydmljZV9saW5rKTsKKyAgCisgIGQtPmhhc2hfZW50cnkgPSBOVUxMOworICBkLT5zZXJ2aWNlX2xpbmsgPSBOVUxMOworICBkLT5vd25lcl9saW5rID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgT3duZXJzaGlwUmVzdG9yZURhdGEgKmQgPSBkYXRhOworCisgIGlmIChkLT5zZXJ2aWNlX2xpbmspCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPnNlcnZpY2VfbGluayk7CisgIGlmIChkLT5vd25lcl9saW5rKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5vd25lcl9saW5rKTsKKyAgaWYgKGQtPmhhc2hfZW50cnkpCisgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAoZC0+c2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5oYXNoX2VudHJ5KTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGQtPm93bmVyLT5jb25uKTsKKyAgYnVzX293bmVyX3VucmVmIChkLT5vd25lcik7CisgIGJ1c19zZXJ2aWNlX3VucmVmIChkLT5zZXJ2aWNlKTsKKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNPd25lciAgICAgICAqb3duZXIpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkOworICBEQnVzTGlzdCAqbGluazsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcFJlc3RvcmVEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkLT5zZXJ2aWNlID0gc2VydmljZTsKKyAgZC0+b3duZXIgPSBvd25lcjsKKyAgZC0+c2VydmljZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChzZXJ2aWNlKTsKKyAgZC0+b3duZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAob3duZXIpOworICBkLT5oYXNoX2VudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgIAorICBidXNfc2VydmljZV9yZWYgKGQtPnNlcnZpY2UpOworICBidXNfb3duZXJfcmVmIChkLT5vd25lcik7CisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGQtPm93bmVyLT5jb25uKTsKKworICBkLT5iZWZvcmVfb3duZXIgPSBOVUxMOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKworICAgICAgICAgIGlmIChsaW5rKQorICAgICAgICAgICAgZC0+YmVmb3JlX293bmVyID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKyAgCisgIGlmIChkLT5zZXJ2aWNlX2xpbmsgPT0gTlVMTCB8fAorICAgICAgZC0+b3duZXJfbGluayA9PSBOVUxMIHx8CisgICAgICBkLT5oYXNoX2VudHJ5ID09IE5VTEwgfHwKKyAgICAgICFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwgcmVzdG9yZV9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfcmVzdG9yZV9kYXRhKSkKKyAgICB7CisgICAgICBmcmVlX293bmVyc2hpcF9yZXN0b3JlX2RhdGEgKGQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKnN3YXBfbGluazsKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogV2Ugc2VuZCBvdXQgbm90aWZpY2F0aW9ucyBiZWZvcmUgd2UgZG8gYW55IHdvcmsgd2UKKyAgICogbWlnaHQgaGF2ZSB0byB1bmRvIGlmIHRoZSBub3RpZmljYXRpb24tc2VuZGluZyBmYWlsZWQKKyAgICovCisgIAorICAvKiBTZW5kIHNlcnZpY2UgbG9zdCBtZXNzYWdlICovCisgIHByaW1hcnlfb3duZXIgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoc2VydmljZSk7CisgIGlmIChwcmltYXJ5X293bmVyID09IE5VTEwgfHwgcHJpbWFyeV9vd25lci0+Y29ubiAhPSBjb25uZWN0aW9uKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgYSBub24gcHJpbWFyeSBvd25lciIpOworCisgICAgCisgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCAoY29ubmVjdGlvbiwgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoc2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVHJpZWQgdG8gc3dhcCBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgb3duZXIgb2YgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIG90aGVyIG93bmVycyBpbiB0aGUgcXVldWUiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICpuZXdfb3duZXI7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X293bmVyX2Nvbm47CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKworICAgICAgbmV3X293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgIG5ld19vd25lcl9jb25uID0gbmV3X293bmVyLT5jb25uOworCisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKHNlcnZpY2UtPm5hbWUsCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAobmV3X293bmVyX2Nvbm4pLAorIAkJCQkJCSAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBUaGlzIHdpbGwgYmUgb3VyIG5ldyBvd25lciAqLworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAobmV3X293bmVyX2Nvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfcmVzdG9yZV9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24gKHRyYW5zYWN0aW9uLCBzZXJ2aWNlLCBwcmltYXJ5X293bmVyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiB1bmxpbmsgdGhlIHByaW1hcnkgYW5kIG1ha2UgaXQgdGhlIHNlY29uZCBsaW5rICovCisgIHN3YXBfbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgc3dhcF9saW5rKTsKKworICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKSwKKwkJCQlzd2FwX2xpbmspOworCisgIHJldHVybiBUUlVFOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHNlbGYtY2FuY2VsbGluZyBpZiB5b3UgY2FuY2VsIHRoZSB0cmFuc2FjdGlvbiAqLworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIFdlIHNlbmQgb3V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIHdlIGRvIGFueSB3b3JrIHdlCisgICAqIG1pZ2h0IGhhdmUgdG8gdW5kbyBpZiB0aGUgbm90aWZpY2F0aW9uLXNlbmRpbmcgZmFpbGVkCisgICAqLworICAKKyAgLyogU2VuZCBzZXJ2aWNlIGxvc3QgbWVzc2FnZSAqLworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciAhPSBOVUxMICYmIHByaW1hcnlfb3duZXItPmNvbm4gPT0gY29ubmVjdGlvbikKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKGNvbm5lY3Rpb24sIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiB3ZSBhcmUgbm90IHRoZSBwcmltYXJ5IG93bmVyIHRoZW4ganVzdCByZW1vdmUgdXMgZnJvbSB0aGUgcXVldWUgKi8KKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgQnVzT3duZXIgKnRlbXBfb3duZXI7CisKKyAgICAgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIHRlbXBfb3duZXIgPSAoQnVzT3duZXIgKilsaW5rLT5kYXRhOworICAgICAgYnVzX293bmVyX3VucmVmICh0ZW1wX293bmVyKTsgCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisKKyAgICAgIHJldHVybiBUUlVFOyAKKyAgICB9CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHJlbW92ZSBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoc2VydmljZS0+bmFtZSwKKyAJCQkJCQkgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAJCQkJCQkgIE5VTEwsCisgCQkJCQkJICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBCdXNPd25lciAqbmV3X293bmVyOworICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19vd25lcl9jb25uOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgICAgIG5ld19vd25lciA9IChCdXNPd25lciAqKWxpbmstPmRhdGE7CisgICAgICBuZXdfb3duZXJfY29ubiA9IG5ld19vd25lci0+Y29ubjsKKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG5ld19vd25lcl9jb25uKSwKKyAJCQkJCQkgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogVGhpcyB3aWxsIGJlIG91ciBuZXcgb3duZXIgKi8KKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKG5ld19vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgc2VydmljZSwgcHJpbWFyeV9vd25lcikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgCisgIGJ1c19zZXJ2aWNlX3VubGlua19vd25lciAoc2VydmljZSwgcHJpbWFyeV9vd25lcik7CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIGJ1c19zZXJ2aWNlX3VubGluayAoc2VydmljZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c1NlcnZpY2UgKgorYnVzX3NlcnZpY2VfcmVmIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPnJlZmNvdW50ID4gMCk7CisgIAorICBzZXJ2aWNlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitidXNfc2VydmljZV91bnJlZiAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5yZWZjb3VudCA+IDApOworICAKKyAgc2VydmljZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAoc2VydmljZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzZXJ2aWNlLT5uYW1lKTsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wsIHNlcnZpY2UpOworICAgIH0KK30KKworREJ1c0Nvbm5lY3Rpb24gKgorYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIEJ1c093bmVyICpvd25lcjsKKworICBvd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKworICBpZiAob3duZXIgIT0gTlVMTCkKKyAgICByZXR1cm4gb3duZXItPmNvbm47CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworQnVzT3duZXIqCitidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmc2VydmljZS0+b3duZXJzKTsKK30KKworY29uc3QgY2hhcioKK2J1c19zZXJ2aWNlX2dldF9uYW1lIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICByZXR1cm4gc2VydmljZS0+bmFtZTsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgQnVzT3duZXIgKm93bmVyOworICBEQnVzTGlzdCAqbGluazsKKyAKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5vd25lcnMgIT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworCisgIHJldHVybiBvd25lci0+YWxsb3dfcmVwbGFjZW1lbnQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2VydmljZV9oYXNfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorCQkgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QgCitidXNfc2VydmljZV9saXN0X3F1ZXVlZF9vd25lcnMgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqKnJldHVybl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0ICgqcmV0dXJuX2xpc3QgPT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgIAorICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c093bmVyICpvd25lcjsKKyAgICAgIGNvbnN0IGNoYXIgKnVuYW1lOworCisgICAgICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworICAgICAgdW5hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAob3duZXItPmNvbm4pOworCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZXR1cm5fbGlzdCwgKGNoYXIgKil1bmFtZSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgb29tOgorICBfZGJ1c19saXN0X2NsZWFyIChyZXR1cm5fbGlzdCk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2J1cy9zZXJ2aWNlcy5oIGIvYnVzL3NlcnZpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2ZGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2VydmljZXMuaCAgU2VydmljZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NFUlZJQ0VTX0gKKyNkZWZpbmUgQlVTX1NFUlZJQ0VTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiB2b2lkICgqIEJ1c1NlcnZpY2VGb3JlYWNoRnVuY3Rpb24pIChCdXNTZXJ2aWNlICAgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhKTsKKworQnVzUmVnaXN0cnkqIGJ1c19yZWdpc3RyeV9uZXcgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNSZWdpc3RyeSogYnVzX3JlZ2lzdHJ5X3JlZiAgICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7Cit2b2lkICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2xvb2t1cCAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2Vuc3VyZSAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKm93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwKKwkJCQkJICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgIGJ1c19yZWdpc3RyeV9mb3JlYWNoICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZUZvcmVhY2hGdW5jdGlvbiAgICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKipsaXN0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmFycmF5X2xlbik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAqcmVnaXN0cnksCisJCQkJCQkgICAgIERCdXNIYXNoVGFibGUgICAgICAgICAqdGFibGUpOworCitCdXNTZXJ2aWNlKiAgICAgYnVzX3NlcnZpY2VfcmVmICAgICAgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOwordm9pZCAgICAgICAgICAgIGJ1c19zZXJ2aWNlX3VucmVmICAgICAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9hZGRfb3duZXIgICAgICAgICAgICAgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBkYnVzX3VpbnQzMl90ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfaGFzX293bmVyICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworQnVzT3duZXIqICAgICAgIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7Citjb25zdCBjaGFyKiAgICAgYnVzX3NlcnZpY2VfZ2V0X25hbWUgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX2xpc3RfcXVldWVkX293bmVycyAgICAgICAgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICoqcmV0dXJuX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQnVzQ29ubmVjdGlvbiogYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKKyNlbmRpZiAvKiBCVVNfU0VSVklDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3Nlc3Npb24uY29uZi5pbiBiL2J1cy9zZXNzaW9uLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmYTdmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZXNzaW9uLmNvbmYuaW4KQEAgLTAsMCArMSw4MCBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc2Vzc2lvbi1sb2NhbC5jb25mIGFuZCBlZGl0IHRoYXQgcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhpcyAKKyAgICAgZmlsZSBkaXJlY3RseS4gLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorCisgIDwhLS0gSWYgd2UgZm9yaywga2VlcCB0aGUgdXNlcidzIG9yaWdpbmFsIHVtYXNrIHRvIGF2b2lkIGFmZmVjdGluZworICAgICAgIHRoZSBiZWhhdmlvciBvZiBjaGlsZCBwcm9jZXNzZXMuIC0tPgorICA8a2VlcF91bWFzay8+CisKKyAgPGxpc3Rlbj5AREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTU0A8L2xpc3Rlbj4KKworICA8IS0tIE9uIFVuaXggc3lzdGVtcywgdGhlIG1vc3Qgc2VjdXJlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBpcworICBFWFRFUk5BTCwgd2hpY2ggdXNlcyBjcmVkZW50aWFsLXBhc3Npbmcgb3ZlciBVbml4IHNvY2tldHMuCisKKyAgVGhpcyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLAorICBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSB0Y3A6IG9yIG5vbmNlLXRjcDogdHJhbnNwb3J0cywKKyAgYW5kIHdpbGwgbm90IHdvcmsgb24gb2JzY3VyZSBmbGF2b3VycyBvZiBVbml4IHRoYXQgZG8gbm90IGhhdmUKKyAgYSBzdXBwb3J0ZWQgY3JlZGVudGlhbHMtcGFzc2luZyBtZWNoYW5pc20uIE9uIHRob3NlIHBsYXRmb3Jtcy90cmFuc3BvcnRzLAorICBjb21tZW50IG91dCB0aGUgPGF1dGg+IGVsZW1lbnQgdG8gYWxsb3cgZmFsbGJhY2sgdG8gREJVU19DT09LSUVfU0hBMS4gLS0+CisgIEBEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMQAorCisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8IS0tIEluY2x1ZGUgbGVnYWN5IGNvbmZpZ3VyYXRpb24gbG9jYXRpb24gLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPkBTWVNDT05GRElSX0ZST01fUEtHREFUQURJUkAvZGJ1cy0xL3Nlc3Npb24uY29uZjwvaW5jbHVkZT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIAorICAgICAgIGZ1cnRoZXIgcmVzdHJpY3QgdGhlIGFib3ZlIHBvbGljeSBmb3Igc3BlY2lmaWMgc2VydmljZXMuIC0tPgorICA8aW5jbHVkZWRpcj5zZXNzaW9uLmQ8L2luY2x1ZGVkaXI+CisKKyAgPGluY2x1ZGVkaXI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc2Vzc2lvbi5kPC9pbmNsdWRlZGlyPgorCisgIDwhLS0gVGhpcyBpcyBpbmNsdWRlZCBsYXN0IHNvIGxvY2FsIGNvbmZpZ3VyYXRpb24gY2FuIG92ZXJyaWRlIHdoYXQncyAKKyAgICAgICBpbiB0aGlzIHN0YW5kYXJkIGZpbGUgLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPkBTWVNDT05GRElSX0ZST01fUEtHREFUQURJUkAvZGJ1cy0xL3Nlc3Npb24tbG9jYWwuY29uZjwvaW5jbHVkZT4KKworICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9InllcyIgc2VsaW51eF9yb290X3JlbGF0aXZlPSJ5ZXMiPmNvbnRleHRzL2RidXNfY29udGV4dHM8L2luY2x1ZGU+CisKKyAgPCEtLSBGb3IgdGhlIHNlc3Npb24gYnVzLCBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWxhdGl2ZWx5LWxvdyBsaW1pdHMgCisgICAgICAgd2l0aCBlc3NlbnRpYWxseSBpbmZpbml0ZSBsaW1pdHMsIHNpbmNlIHRoZSBidXMgaXMganVzdCBydW5uaW5nIAorICAgICAgIGFzIHRoZSB1c2VyIGFueXdheSwgdXNpbmcgdXAgYnVzIHJlc291cmNlcyBpcyBub3Qgc29tZXRoaW5nIHdlIG5lZWQgCisgICAgICAgdG8gd29ycnkgYWJvdXQuIEluIHNvbWUgY2FzZXMsIHdlIGRvIHNldCB0aGUgbGltaXRzIGxvd2VyIHRoYW4gCisgICAgICAgImFsbCBhdmFpbGFibGUgbWVtb3J5IiBpZiBleGNlZWRpbmcgdGhlIGxpbWl0IGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBidWcsIAorICAgICAgIGhhdmluZyB0aGUgYnVzIGVuZm9yY2UgYSBsaW1pdCBpcyBuaWNlciB0aGFuIGEgaHVnZSBtZW1vcnkgbGVhay4gQnV0IHRoZSAKKyAgICAgICBpbnRlbnQgaXMgdGhhdCB0aGVzZSBsaW1pdHMgc2hvdWxkIG5ldmVyIGJlIGhpdC4gLS0+CisKKyAgPCEtLSB0aGUgbWVtb3J5IGxpbWl0cyBhcmUgMUcgaW5zdGVhZCBvZiBzYXkgNEcgYmVjYXVzZSB0aGV5IGNhbid0IGV4Y2VlZCAzMi1iaXQgc2lnbmVkIGludCBtYXggLS0+CisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX3VuaXhfZmRzIj4yNTAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX2J5dGVzIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ191bml4X2ZkcyI+MjUwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8IS0tIFdlIGRvIG5vdCBvdmVycmlkZSBtYXhfbWVzc2FnZV91bml4X2ZkcyBoZXJlIHNpbmNlIHRoZSBpbi1rZXJuZWwKKyAgICAgICBsaW1pdCBpcyBhbHNvIHJlbGF0aXZlbHkgbG93IC0tPgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij4xMjAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjI0MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJwZW5kaW5nX2ZkX3RpbWVvdXQiPjE1MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj4xMDAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj4xMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiPjEwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1cy9zaWduYWxzLmMgYi9idXMvc2lnbmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGVmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvc2lnbmFscy5jCkBAIC0wLDAgKzEsMjk3MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBzaWduYWxzLmMgIEJ1cyBzaWduYWwgY29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3N0cnVjdCBCdXNNYXRjaFJ1bGUKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAvKio8IHJlZmVyZW5jZSBjb3VudCAqLworCisgIERCdXNDb25uZWN0aW9uICptYXRjaGVzX2dvX3RvOyAvKio8IE93bmVyIG9mIHRoZSBydWxlICovCisKKyAgdW5zaWduZWQgaW50IGZsYWdzOyAvKio8IEJ1c01hdGNoRmxhZ3MgKi8KKworICBpbnQgICBtZXNzYWdlX3R5cGU7CisgIGNoYXIgKmludGVyZmFjZTsKKyAgY2hhciAqbWVtYmVyOworICBjaGFyICpzZW5kZXI7CisgIGNoYXIgKmRlc3RpbmF0aW9uOworICBjaGFyICpwYXRoOworCisgIHVuc2lnbmVkIGludCAqYXJnX2xlbnM7CisgIGNoYXIgKiphcmdzOworICBpbnQgYXJnc19sZW47Cit9OworCisjZGVmaW5lIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFICAgMHg0MDAwMDAwdQorI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0lTX1BBVEggIDB4ODAwMDAwMHUKKworI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0ZMQUdTIChCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSB8IEJVU19NQVRDSF9BUkdfSVNfUEFUSCkKKworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfbmV3IChEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190bykKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c01hdGNoUnVsZSwgMSk7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcnVsZS0+cmVmY291bnQgPSAxOworICBydWxlLT5tYXRjaGVzX2dvX3RvID0gbWF0Y2hlc19nb190bzsKKworI2lmbmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1hdGNoZXNfZ29fdG8gIT0gTlVMTCk7CisjZW5kaWYKKyAgCisgIHJldHVybiBydWxlOworfQorCitCdXNNYXRjaFJ1bGUgKgorYnVzX21hdGNoX3J1bGVfcmVmIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBydWxlOworfQorCit2b2lkCitidXNfbWF0Y2hfcnVsZV91bnJlZiAoQnVzTWF0Y2hSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHJ1bGUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgZGJ1c19mcmVlIChydWxlLT5pbnRlcmZhY2UpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5tZW1iZXIpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5zZW5kZXIpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5kZXN0aW5hdGlvbik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPnBhdGgpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5hcmdfbGVucyk7CisKKyAgICAgIC8qIGNhbid0IHVzZSBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkgc2luY2UgdGhlcmUKKyAgICAgICAqIGFyZSBlbWJlZGRlZCBOVUxMCisgICAgICAgKi8KKyAgICAgIGlmIChydWxlLT5hcmdzKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IHJ1bGUtPmFyZ3NfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocnVsZS0+YXJnc1tpXSkKKyAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ3NbaV0pOworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ3MpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAocnVsZSk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfU1RBVFMpCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKERCdXNTdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjb25zdCBjaGFyICpwID0gdmFsdWU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJXM9JyIsIHRva2VuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgd2hpbGUgKCpwICE9ICdcMCcpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmV4dCA9IHN0cmNociAocCwgJ1wnJyk7CisKKyAgICAgIGlmIChuZXh0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJS4qcyIsIChpbnQpIChuZXh0IC0gcCksIHApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIC8qIEhvcnJpYmxlIGVzY2FwZSBzZXF1ZW5jZTogc2luZ2xlIHF1b3RlIGNhbm5vdCBiZSBlc2NhcGVkIGluc2lkZQorICAgICAgICAgICAqIGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcuIFNvIHdlIGNsb3NlIHRoZSBzaW5nbGUgcXVvdGUsIGVzY2FwZSB0aGUKKyAgICAgICAgICAgKiBzaW5nbGUgcXVvdGUsIGFuZCByZW9wZW4gYSBzaW5nbGUgcXVvdGUuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJ1xcJyciKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBwID0gbmV4dCArIDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0ciwgIiVzIiwgcCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgJ1wnJykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIE5VTEwgaWYgbm8gbWVtb3J5ICovCitzdGF0aWMgY2hhcioKK21hdGNoX3J1bGVfdG9fc3RyaW5nIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpyZXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgIHsKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgInR5cGUiLAorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChydWxlLT5tZXNzYWdlX3R5cGUpKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFhcHBlbmRfa2V5X2FuZF9lc2NhcGVkX3ZhbHVlICgmc3RyLCAiaW50ZXJmYWNlIiwgcnVsZS0+aW50ZXJmYWNlKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FTUJFUikKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFhcHBlbmRfa2V5X2FuZF9lc2NhcGVkX3ZhbHVlICgmc3RyLCAibWVtYmVyIiwgcnVsZS0+bWVtYmVyKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgInBhdGgiLCBydWxlLT5wYXRoKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWFwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKCZzdHIsICJwYXRoX25hbWVzcGFjZSIsIHJ1bGUtPnBhdGgpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIWFwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKCZzdHIsICJzZW5kZXIiLCBydWxlLT5zZW5kZXIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgImRlc3RpbmF0aW9uIiwgcnVsZS0+ZGVzdGluYXRpb24pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgImVhdmVzZHJvcCIsCisgICAgICAgICAgICAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpID8KKyAgICAgICAgICAgICJ0cnVlIiA6ICJmYWxzZSIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQVJHUykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+YXJnc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19wYXRoLCBpc19uYW1lc3BhY2U7CisKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpc19wYXRoID0gKHJ1bGUtPmFyZ19sZW5zW2ldICYgQlVTX01BVENIX0FSR19JU19QQVRIKSAhPSAwOworICAgICAgICAgICAgICBpc19uYW1lc3BhY2UgPSAocnVsZS0+YXJnX2xlbnNbaV0gJiBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSkgIT0gMDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmclZCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGF0aCA/ICJwYXRoIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25hbWVzcGFjZSA/ICJuYW1lc3BhY2UiIDogIiIpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgIiIsIHJ1bGUtPmFyZ3NbaV0pKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJldCkpCisgICAgZ290byBub21lbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiByZXQ7CisgIAorIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIGRlZmluZWQoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFKSB8fCBkZWZpbmVkKERCVVNfRU5BQkxFX1NUQVRTKSAqLworCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X21lc3NhZ2VfdHlwZSAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB0eXBlKQoreworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFOworCisgIHJ1bGUtPm1lc3NhZ2VfdHlwZSA9IHR5cGU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmludGVyZmFjZSkKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAoaW50ZXJmYWNlICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAoaW50ZXJmYWNlKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfSU5URVJGQUNFOworICBkYnVzX2ZyZWUgKHJ1bGUtPmludGVyZmFjZSk7CisgIHJ1bGUtPmludGVyZmFjZSA9IG5ldzsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9tZW1iZXIgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbWVtYmVyKQoreworICBjaGFyICpuZXc7CisKKyAgX2RidXNfYXNzZXJ0IChtZW1iZXIgIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChtZW1iZXIpOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9NRU1CRVI7CisgIGRidXNfZnJlZSAocnVsZS0+bWVtYmVyKTsKKyAgcnVsZS0+bWVtYmVyID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3NlbmRlciAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpzZW5kZXIpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciAhPSBOVUxMKTsKKworICBuZXcgPSBfZGJ1c19zdHJkdXAgKHNlbmRlcik7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX1NFTkRFUjsKKyAgZGJ1c19mcmVlIChydWxlLT5zZW5kZXIpOworICBydWxlLT5zZW5kZXIgPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfZGVzdGluYXRpb24gKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpkZXN0aW5hdGlvbikKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAoZGVzdGluYXRpb24gIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChkZXN0aW5hdGlvbik7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX0RFU1RJTkFUSU9OOworICBkYnVzX2ZyZWUgKHJ1bGUtPmRlc3RpbmF0aW9uKTsKKyAgcnVsZS0+ZGVzdGluYXRpb24gPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19tYXRjaF9ydWxlX3NldF9jbGllbnRfaXNfZWF2ZXNkcm9wcGluZyAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19lYXZlc2Ryb3BwaW5nKQoreworICBpZiAoaXNfZWF2ZXNkcm9wcGluZykKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkc7CisgIGVsc2UKKyAgICBydWxlLT5mbGFncyAmPSB+KEJVU19NQVRDSF9DTElFTlRfSVNfRUFWRVNEUk9QUElORyk7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9nZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3BhdGggKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBpc19uYW1lc3BhY2UpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChwYXRoKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyAmPSB+KEJVU19NQVRDSF9QQVRIfEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSk7CisKKyAgaWYgKGlzX25hbWVzcGFjZSkKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0U7CisgIGVsc2UKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSDsKKworICBkYnVzX2ZyZWUgKHJ1bGUtPnBhdGgpOworICBydWxlLT5wYXRoID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpCit7CisgIGludCBsZW5ndGg7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworCisgIC8qIGFyZ3NfbGVuIGlzIHRoZSBudW1iZXIgb2YgYXJncyBub3QgaW5jbHVkaW5nIG51bGwgdGVybWluYXRpb24KKyAgICogaW4gdGhlIGNoYXIqKgorICAgKi8KKyAgaWYgKGFyZyA+PSBydWxlLT5hcmdzX2xlbikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgKm5ld19hcmdfbGVuczsKKyAgICAgIGNoYXIgKipuZXdfYXJnczsKKyAgICAgIGludCBuZXdfYXJnc19sZW47CisgICAgICBpbnQgaTsKKworICAgICAgbmV3X2FyZ3NfbGVuID0gYXJnICsgMTsKKworICAgICAgLyogYWRkIGFub3RoZXIgKyAxIGhlcmUgZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgIG5ld19hcmdzID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoY2hhciAqKSAqIChuZXdfYXJnc19sZW4gKyAxKSk7CisgICAgICBpZiAobmV3X2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBOVUxMIHRoZSBuZXcgc2xvdHMgKi8KKyAgICAgIGkgPSBydWxlLT5hcmdzX2xlbjsKKyAgICAgIHdoaWxlIChpIDw9IG5ld19hcmdzX2xlbikgLyogPD0gZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgICAgeworICAgICAgICAgIG5ld19hcmdzW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcnVsZS0+YXJncyA9IG5ld19hcmdzOworCisgICAgICAvKiBhbmQgbm93IGFkZCB0byB0aGUgbGVuZ3RocyAqLworICAgICAgbmV3X2FyZ19sZW5zID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdfbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChpbnQpICogKG5ld19hcmdzX2xlbiArIDEpKTsKKworICAgICAgaWYgKG5ld19hcmdfbGVucyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHplcm8gdGhlIG5ldyBzbG90cyAqLworICAgICAgaSA9IHJ1bGUtPmFyZ3NfbGVuOworICAgICAgd2hpbGUgKGkgPD0gbmV3X2FyZ3NfbGVuKSAvKiA8PSBmb3IgbnVsbCB0ZXJtaW5hdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgbmV3X2FyZ19sZW5zW2ldID0gMDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgcnVsZS0+YXJnX2xlbnMgPSBuZXdfYXJnX2xlbnM7CisgICAgICBydWxlLT5hcmdzX2xlbiA9IG5ld19hcmdzX2xlbjsKKyAgICB9CisKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhICh2YWx1ZSwgJm5ldykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9BUkdTOworCisgIGRidXNfZnJlZSAocnVsZS0+YXJnc1thcmddKTsKKyAgcnVsZS0+YXJnX2xlbnNbYXJnXSA9IGxlbmd0aDsKKyAgcnVsZS0+YXJnc1thcmddID0gbmV3OworCisgIGlmIChpc19wYXRoKQorICAgIHJ1bGUtPmFyZ19sZW5zW2FyZ10gfD0gQlVTX01BVENIX0FSR19JU19QQVRIOworCisgIGlmIChpc19uYW1lc3BhY2UpCisgICAgcnVsZS0+YXJnX2xlbnNbYXJnXSB8PSBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRTsKKworICAvKiBOVUxMIHRlcm1pbmF0aW9uIGRpZG4ndCBnZXQgYnVzdGVkICovCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1tydWxlLT5hcmdzX2xlbl0gPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnX2xlbnNbcnVsZS0+YXJnc19sZW5dID09IDApOworCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIElTV0hJVEUoYykgKCgoYykgPT0gJyAnKSB8fCAoKGMpID09ICdcdCcpIHx8ICgoYykgPT0gJ1xuJykgfHwgKChjKSA9PSAnXHInKSkKKworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX2tleSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmtleSwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICp2YWx1ZV9wb3MsCisgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmtleV9zdGFydDsKKyAgY29uc3QgY2hhciAqa2V5X2VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICB3aGlsZSAoKnAgJiYgSVNXSElURSAoKnApKQorICAgICsrcDsKKworICBrZXlfc3RhcnQgPSBwOworCisgIHdoaWxlICgqcCAmJiAqcCAhPSAnPScgJiYgIUlTV0hJVEUgKCpwKSkKKyAgICArK3A7CisKKyAga2V5X2VuZCA9IHA7CisKKyAgd2hpbGUgKCpwICYmIElTV0hJVEUgKCpwKSkKKyAgICArK3A7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgLyogRW1wdHkgbWF0Y2ggcnVsZXMgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgT0sgKi8KKyAgICAgICp2YWx1ZV9wb3MgPSBwIC0gczsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoKnAgIT0gJz0nKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHJ1bGUgaGFzIGEga2V5IHdpdGggbm8gc3Vic2VxdWVudCAnPScgY2hhcmFjdGVyIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICArK3A7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChrZXksIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbHVlX3BvcyA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF92YWx1ZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICprZXksCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnZhbHVlX2VuZCwKKyAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICBxdW90ZV9jaGFyID0gJ1wwJzsKKworICB3aGlsZSAoKnApCisgICAgeworICAgICAgaWYgKHF1b3RlX2NoYXIgPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wnJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1xcJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHF1b3RlX2NoYXIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIC8qIFwgb25seSBjb3VudHMgYXMgYW4gZXNjYXBlIGlmIGVzY2FwaW5nIGEgcXVvdGUgbWFyayAqLworICAgICAgICAgIGlmICgqcCAhPSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICdcXCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICpwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcXVvdGVfY2hhciA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocXVvdGVfY2hhciA9PSAnXCcnKTsKKworICAgICAgICAgIGlmICgqcCA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK3A7CisgICAgfQorCisgZG9uZToKKworICBpZiAocXVvdGVfY2hhciA9PSAnXFwnKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgJ1xcJykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChxdW90ZV9jaGFyID09ICdcJycpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90YXRpb24gbWFya3MgaW4gbWF0Y2ggcnVsZSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfYXNzZXJ0IChxdW90ZV9jaGFyID09ICdcMCcpOworCisgIC8qIFplcm8tbGVuZ3RoIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAKKyAgKnZhbHVlX2VuZCA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHZhbHVlLCBvcmlnX2xlbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogZHVwbGljYXRlcyBhcmVuJ3QgYWxsb3dlZCBzbyB0aGUgcmVhbCBsZWdpdGltYXRlIG1heCBpcyBvbmx5IDYgb3IKKyAqIHNvLiBMZWF2aW5nIGV4dHJhIHNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIHRvIHVwZGF0ZSBpdC4KKyAqIEZJWE1FIHRoaXMgaXMgc29ydCBvZiBidXN0ZWQgbm93IHdpdGggYXJnIG1hdGNoaW5nLCBidXQgd2UgbGV0CisgKiB5b3UgbWF0Y2ggb24gdXAgdG8gMTAgYXJncyBmb3Igbm93CisgKi8KKyNkZWZpbmUgTUFYX1JVTEVfVE9LRU5TIDE2CisKKy8qIHRoaXMgaXMgc2xpZ2h0bHkgdG9vIGhpZ2ggbGV2ZWwgdG8gYmUgdGVybWVkIGEgInRva2VuIgorICogYnV0IGxldCdzIG5vdCBiZSBwZWRhbnRpYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqa2V5OworICBjaGFyICp2YWx1ZTsKK30gUnVsZVRva2VuOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rva2VuaXplX3J1bGUgKGNvbnN0IERCdXNTdHJpbmcgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgIFJ1bGVUb2tlbiAgICAgICAgIHRva2Vuc1tNQVhfUlVMRV9UT0tFTlNdLAorICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpIAoreworICBpbnQgaTsKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyBrZXk7CisgIERCdXNTdHJpbmcgdmFsdWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHBvcyA9IDA7CisgIHdoaWxlIChpIDwgTUFYX1JVTEVfVE9LRU5TICYmCisgICAgICAgICBwb3MgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS5rZXkgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS52YWx1ZSA9PSBOVUxMKTsKKworICAgICAgaWYgKCFmaW5kX2tleSAocnVsZV90ZXh0LCBwb3MsICZrZXksICZwb3MsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmtleSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG9rZW5zW2ldLmtleSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghZmluZF92YWx1ZSAocnVsZV90ZXh0LCBwb3MsIHRva2Vuc1tpXS5rZXksICZ2YWx1ZSwgJnBvcywgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmdG9rZW5zW2ldLnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLnZhbHVlKTsKKyAgICAgICAgICB0b2tlbnNbaV0ua2V5ID0gTlVMTDsKKyAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IGlzX3BhdGggPSBGQUxTRTsKKyAgZGJ1c19ib29sX3QgaXNfbmFtZXNwYWNlID0gRkFMU0U7CisgIERCdXNTdHJpbmcga2V5X3N0cjsKKyAgdW5zaWduZWQgbG9uZyBhcmc7CisgIGludCBsZW5ndGg7CisgIGludCBlbmQ7CisKKyAgLyogRm9yIG5vdywgYXJnMD0nZm9vJyBhbHdheXMgaW1wbGllcyB0aGF0ICdmb28nIGlzIGEKKyAgICogREJVU19UWVBFX1NUUklORy4gU29tZWRheSB3ZSBjb3VsZCBhZGQgYW4gYXJnMHR5cGU9J2ludDMyJyB0aGluZworICAgKiBpZiB3ZSB3YW50ZWQsIHdoaWNoIHdvdWxkIHNwZWNpZnkgYW5vdGhlciB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAqIGFyZzA9JzUnIHdvdWxkIGhhdmUgdGhlIDUgcGFyc2VkIGFzIGFuIGludCByYXRoZXIgdGhhbiBzdHJpbmcuCisgICAqLworICAKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBwYXJzZSBhcmcwID0gMCwgYXJnMjcgPSAyNyAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgma2V5X3N0ciwga2V5KTsKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKSA8IDQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2V5ICclcycgaW4gbWF0Y2ggcnVsZSBzdGFydHMgd2l0aCAnYXJnJyBidXQgbGFja3MgYW4gYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKCZrZXlfc3RyLCAzLCAmYXJnLCAmZW5kKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIHN0YXJ0cyB3aXRoICdhcmcnIGJ1dCBjb3VsZCBub3QgcGFyc2UgYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChlbmQgIT0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGludCBsZW4xID0gc3RybGVuICgicGF0aCIpOworICAgICAgaWYgKChlbmQgKyBsZW4xKSA9PSBsZW5ndGggJiYKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgma2V5X3N0ciwgInBhdGgiKSkKKyAgICAgICAgeworICAgICAgICAgIGlzX3BhdGggPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZrZXlfc3RyLCAiYXJnMG5hbWVzcGFjZSIpKQorICAgICAgICB7CisgICAgICAgICAgaW50IHZhbHVlX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZSk7CisKKyAgICAgICAgICBpc19uYW1lc3BhY2UgPSBUUlVFOworCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlICh2YWx1ZSwgMCwgdmFsdWVfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICJhcmcwbmFtZXNwYWNlPSclcycgaXMgbm90IGEgdmFsaWQgcHJlZml4IG9mIGEgYnVzIG5hbWUiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh2YWx1ZSkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgIktleSAnJXMnIGluIG1hdGNoIHJ1bGUgY29udGFpbnMganVuayBhZnRlciBhcmd1bWVudCBudW1iZXIgKCV1KS4gT25seSAnYXJnJXVwYXRoJyAoZm9yIGV4YW1wbGUpIG9yICdhcmcwbmFtZXNwYWNlJyBhcmUgdmFsaWQiLCBrZXksIGFyZywgYXJnKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBJZiB3ZSBkaWRuJ3QgY2hlY2sgdGhpcyB3ZSBjb3VsZCBhbGxvY2F0ZSBhIGh1Z2UgYW1vdW50IG9mIFJBTSAqLworICBpZiAoYXJnID4gREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIGhhcyBhcmcgbnVtYmVyICVsdSBidXQgdGhlIG1heGltdW0gaXMgJWQuXG4iLCBrZXksICh1bnNpZ25lZCBsb25nKSBhcmcsIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0FSR19OVU1CRVIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9BUkdTKSAmJgorICAgICAgcnVsZS0+YXJnc19sZW4gPiAoaW50KSBhcmcgJiYKKyAgICAgIHJ1bGUtPmFyZ3NbYXJnXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50ICVkIG1hdGNoZWQgbW9yZSB0aGFuIG9uY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIGlmICghYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAocnVsZSwgYXJnLCB2YWx1ZSwgaXNfcGF0aCwgaXNfbmFtZXNwYWNlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFRoZSBmb3JtYXQgaXMgY29tbWEtc2VwYXJhdGVkIHdpdGggc3RyaW5ncyBxdW90ZWQgd2l0aCBzaW5nbGUgcXVvdGVzCisgKiBhcyBmb3IgdGhlIHNoZWxsICh0byBlc2NhcGUgYSBsaXRlcmFsIHNpbmdsZSBxdW90ZSwgdXNlICdcJycpLgorICoKKyAqIHR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JworICoKKyAqLworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcnVsZV90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIFJ1bGVUb2tlbiB0b2tlbnNbTUFYX1JVTEVfVE9LRU5TKzFdOyAvKiBOVUxMIHRlcm1pbmF0aW9uICsgMSAqLworICBpbnQgaTsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSA+IERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJNYXRjaCBydWxlIHRleHQgaXMgJWQgYnl0ZXMsIG1heGltdW0gaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChydWxlX3RleHQpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBtZW1zZXQgKHRva2VucywgJ1wwJywgc2l6ZW9mICh0b2tlbnMpKTsKKyAgCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9uZXcgKG1hdGNoZXNfZ29fdG8pOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIXRva2VuaXplX3J1bGUgKHJ1bGVfdGV4dCwgdG9rZW5zLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKHRva2Vuc1tpXS5rZXkgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRtcF9zdHI7CisgICAgICBpbnQgbGVuOworICAgICAgY29uc3QgY2hhciAqa2V5ID0gdG9rZW5zW2ldLmtleTsKKyAgICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gdG9rZW5zW2ldLnZhbHVlOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcF9zdHIsIHZhbHVlKTsKKyAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wX3N0cik7CisKKyAgICAgIGlmIChzdHJjbXAgKGtleSwgInR5cGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IHQ7CisKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgdCA9IGRidXNfbWVzc2FnZV90eXBlX2Zyb21fc3RyaW5nICh2YWx1ZSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHQgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSAoJXMpIGluIG1hdGNoIHJ1bGVcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKHJ1bGUsIHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChrZXksICJzZW5kZXIiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfc2VuZGVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImludGVyZmFjZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgIm1lbWJlciIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgInBhdGgiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChrZXksICJwYXRoX25hbWVzcGFjZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19uYW1lc3BhY2UgPSAoc3RyY21wIChrZXksICJwYXRoX25hbWVzcGFjZSIpID09IDApOworCisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgKEJVU19NQVRDSF9QQVRIIHwgQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHBhdGhfbmFtZXNwYWNlIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZ0bXBfc3RyLCAwLCBsZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGggJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfcGF0aCAocnVsZSwgdmFsdWUsIGlzX25hbWVzcGFjZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImRlc3RpbmF0aW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9kZXN0aW5hdGlvbiAocnVsZSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChrZXksICJlYXZlc2Ryb3AiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogZG8gbm90IGRldGVjdCAiZWF2ZXNkcm9wIiBiZWluZyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHJ1bGU6CisgICAgICAgICAgICogMSkgaXQncyBub3QgcG9zc2libGUsIGl0J3Mgb25seSBpbiB0aGUgZmxhZ3MKKyAgICAgICAgICAgKiAyKSBpdCBtaWdodCBiZSB1c2VkIHR3aWNlIHRvIGRpc2FibGUgZWF2ZXNkcm9wcGluZyB3aGVuIGl0J3MKKyAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIChlZyBkYnVzLW1vbml0b3IvYnVzdGxlKSAqLworCisgICAgICAgICAgLyogd2UgYWNjZXB0IG9ubHkgInRydWV8ZmFsc2UiIGFzIHBvc3NpYmxlIHZhbHVlcyAqLworICAgICAgICAgIGlmICgoc3RyY21wICh2YWx1ZSwgInRydWUiKSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX21hdGNoX3J1bGVfc2V0X2NsaWVudF9pc19lYXZlc2Ryb3BwaW5nIChydWxlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHZhbHVlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfbWF0Y2hfcnVsZV9zZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKHJ1bGUsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wPSclcycgaXMgaW52YWxpZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IHNob3VsZCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGtleSwgImFyZyIsIDMpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAocnVsZSwga2V5LCAmdG1wX3N0ciwgZXJyb3IpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGtleSBcIiVzXCIgaW4gbWF0Y2ggcnVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKyAgCisKKyAgZ290byBvdXQ7CisgIAorIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICB7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBydWxlID0gTlVMTDsKKyAgICB9CisKKyBvdXQ6CisgIAorICBpID0gMDsKKyAgd2hpbGUgKHRva2Vuc1tpXS5rZXkgfHwgdG9rZW5zW2ldLnZhbHVlKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA8IE1BWF9SVUxFX1RPS0VOUyk7CisgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgZGJ1c19mcmVlICh0b2tlbnNbaV0udmFsdWUpOworICAgICAgKytpOworICAgIH0KKyAgCisgIHJldHVybiBydWxlOworfQorCit0eXBlZGVmIHN0cnVjdCBSdWxlUG9vbCBSdWxlUG9vbDsKK3N0cnVjdCBSdWxlUG9vbAoreworICAvKiBNYXBzIG5vbi1OVUxMIGludGVyZmFjZSBuYW1lcyB0byBub24tTlVMTCAoREJ1c0xpc3QgKiopcyAqLworICBEQnVzSGFzaFRhYmxlICpydWxlc19ieV9pZmFjZTsKKworICAvKiBMaXN0IG9mIEJ1c01hdGNoUnVsZXMgd2hpY2ggZG9uJ3Qgc3BlY2lmeSBhbiBpbnRlcmZhY2UgKi8KKyAgREJ1c0xpc3QgKnJ1bGVzX3dpdGhvdXRfaWZhY2U7Cit9OworCitzdHJ1Y3QgQnVzTWF0Y2htYWtlcgoreworICBpbnQgcmVmY291bnQ7CisKKyAgLyogUG9vbHMgb2YgcnVsZXMsIGdyb3VwZWQgYnkgdGhlIHR5cGUgb2YgbWVzc2FnZSB0aGV5IG1hdGNoLiAwCisgICAqIChEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKSByZXByZXNlbnRzIHJ1bGVzIHRoYXQgZG8gbm90IHNwZWNpZnkgYSBtZXNzYWdlCisgICAqIHR5cGUuCisgICAqLworICBSdWxlUG9vbCBydWxlc19ieV90eXBlW0RCVVNfTlVNX01FU1NBR0VfVFlQRVNdOworfTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfZHVtcCAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDAgOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUyA7IGkrKykKKyAgICB7CisgICAgICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgICAgIERCdXNMaXN0ICoqbGlzdDsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAobWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZVtpXS5ydWxlc19ieV9pZmFjZSwgJml0ZXIpOworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBsaXN0ID0gIF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgICAgICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgICAgICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgICAgIGlmIChydWxlLT5tYXRjaGVzX2dvX3RvID09IGNvbm5fZmlsdGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGFycl9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGxpc3QgPSAmbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZVtpXS5ydWxlc193aXRob3V0X2lmYWNlOworICAgICAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluaykpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgaWYgKHJ1bGUtPm1hdGNoZXNfZ29fdG8gPT0gY29ubl9maWx0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGFycl9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3J1bGVfbGlzdF9mcmVlIChEQnVzTGlzdCAqKnJ1bGVzKQoreworICB3aGlsZSAoKnJ1bGVzICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgICAgICBydWxlID0gKCpydWxlcyktPmRhdGE7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChydWxlcywgKnJ1bGVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX2xpc3RfcHRyX2ZyZWUgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgLyogV2UgaGF2ZSB0byBjb3BlIHdpdGggTlVMTCBiZWNhdXNlIHRoZSBoYXNoIHRhYmxlIGZyZWVzIHRoZSAiZXhpc3RpbmciCisgICAqIHZhbHVlICh3aGljaCBpcyBOVUxMKSB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhYmxlIGVudHJ5Li4uCisgICAqLworICBpZiAobGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJ1bGVfbGlzdF9mcmVlIChsaXN0KTsKKyAgICAgIGRidXNfZnJlZSAobGlzdCk7CisgICAgfQorfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX21hdGNobWFrZXJfbmV3ICh2b2lkKQoreworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBpbnQgaTsKKworICBtYXRjaG1ha2VyID0gZGJ1c19uZXcwIChCdXNNYXRjaG1ha2VyLCAxKTsKKyAgaWYgKG1hdGNobWFrZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtYXRjaG1ha2VyLT5yZWZjb3VudCA9IDE7CisKKyAgZm9yIChpID0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsgaSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVM7IGkrKykKKyAgICB7CisgICAgICBSdWxlUG9vbCAqcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBpOworCisgICAgICBwLT5ydWxlc19ieV9pZmFjZSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgIGRidXNfZnJlZSwgKERCdXNGcmVlRnVuY3Rpb24pIHJ1bGVfbGlzdF9wdHJfZnJlZSk7CisKKyAgICAgIGlmIChwLT5ydWxlc19ieV9pZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICByZXR1cm4gbWF0Y2htYWtlcjsKKworIG5vbWVtOgorICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisKKyAgICAgIGlmIChwLT5ydWxlc19ieV9pZmFjZSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocC0+cnVsZXNfYnlfaWZhY2UpOworICAgIH0KKyAgZGJ1c19mcmVlIChtYXRjaG1ha2VyKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIERCdXNMaXN0ICoqCitidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGUpCit7CisgIFJ1bGVQb29sICpwOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV90eXBlID49IDApOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfdHlwZSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIHVwIHJ1bGVzIGZvciBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgIT0gTlVMTCA/IGludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIG1lc3NhZ2VfdHlwZTsKKworICBpZiAoaW50ZXJmYWNlID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuICZwLT5ydWxlc193aXRob3V0X2lmYWNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNMaXN0ICoqbGlzdDsKKworICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocC0+cnVsZXNfYnlfaWZhY2UsIGludGVyZmFjZSk7CisKKyAgICAgIGlmIChsaXN0ID09IE5VTEwgJiYgY3JlYXRlKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZHVwcGVkX2ludGVyZmFjZTsKKworICAgICAgICAgIGxpc3QgPSBkYnVzX25ldzAgKERCdXNMaXN0ICosIDEpOworICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgIGR1cHBlZF9pbnRlcmZhY2UgPSBfZGJ1c19zdHJkdXAgKGludGVyZmFjZSk7CisgICAgICAgICAgaWYgKGR1cHBlZF9pbnRlcmZhY2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQWRkaW5nIGxpc3QgZm9yIHR5cGUgJWQsIGlmYWNlICVzXG4iLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlKTsKKworICAgICAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwcGVkX2ludGVyZmFjZSwgbGlzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAobGlzdCk7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAoZHVwcGVkX2ludGVyZmFjZSk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2J1c19tYXRjaG1ha2VyX2djX3J1bGVzIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICoqcnVsZXMpCit7CisgIFJ1bGVQb29sICpwOworCisgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpydWxlcyAhPSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiR0NpbmcgSFQgZW50cnkgZm9yIG1lc3NhZ2VfdHlwZSAldSwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIGludGVyZmFjZSk7CisKKyAgcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBtZXNzYWdlX3R5cGU7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLCBpbnRlcmZhY2UpCisgICAgICA9PSBydWxlcyk7CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwgaW50ZXJmYWNlKTsKK30KKworQnVzTWF0Y2htYWtlciAqCitidXNfbWF0Y2htYWtlcl9yZWYgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIpCit7CisgIF9kYnVzX2Fzc2VydCAobWF0Y2htYWtlci0+cmVmY291bnQgPiAwKTsKKworICBtYXRjaG1ha2VyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBtYXRjaG1ha2VyOworfQorCit2b2lkCitidXNfbWF0Y2htYWtlcl91bnJlZiAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChtYXRjaG1ha2VyLT5yZWZjb3VudCA+IDApOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChtYXRjaG1ha2VyLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgUnVsZVBvb2wgKnAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgaTsKKworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHAtPnJ1bGVzX2J5X2lmYWNlKTsKKyAgICAgICAgICBydWxlX2xpc3RfZnJlZSAoJnAtPnJ1bGVzX3dpdGhvdXRfaWZhY2UpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAobWF0Y2htYWtlcik7CisgICAgfQorfQorCisvKiBUaGUgcnVsZSBjYW4ndCBiZSBtb2RpZmllZCBhZnRlciBpdCdzIGFkZGVkLiAqLworZGJ1c19ib29sX3QKK2J1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgICpydWxlKQoreworICBEQnVzTGlzdCAqKnJ1bGVzOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChydWxlLT5tYXRjaGVzX2dvX3RvKSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkFkZGluZyBydWxlIHdpdGggbWVzc2FnZV90eXBlICVkLCBpbnRlcmZhY2UgJXNcbiIsCisgICAgICAgICAgICAgICAgIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlICE9IE5VTEwgPyBydWxlLT5pbnRlcmZhY2UgOiAiPG51bGw+Iik7CisKKyAgcnVsZXMgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgVFJVRSk7CisKKyAgaWYgKHJ1bGVzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJ1bGVzLCBydWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAocnVsZXMsIHJ1bGUpOworICAgICAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UsIHJ1bGVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX21hdGNoX3J1bGVfcmVmIChydWxlKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICB7CisgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCBtYXRjaCBydWxlICVzIHRvIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgcyA/IHMgOiAibm9tZW0iLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICBkYnVzX2ZyZWUgKHMpOworICB9CisjZW5kaWYKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hdGNoX3J1bGVfZXF1YWwgKEJ1c01hdGNoUnVsZSAqYSwKKyAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAqYikKK3sKKyAgaWYgKGEtPmZsYWdzICE9IGItPmZsYWdzKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoYS0+bWF0Y2hlc19nb190byAhPSBiLT5tYXRjaGVzX2dvX3RvKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSkgJiYKKyAgICAgIGEtPm1lc3NhZ2VfdHlwZSAhPSBiLT5tZXNzYWdlX3R5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKSAmJgorICAgICAgc3RyY21wIChhLT5tZW1iZXIsIGItPm1lbWJlcikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKSAmJgorICAgICAgc3RyY21wIChhLT5wYXRoLCBiLT5wYXRoKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSkgJiYKKyAgICAgIHN0cmNtcCAoYS0+aW50ZXJmYWNlLCBiLT5pbnRlcmZhY2UpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKSAmJgorICAgICAgc3RyY21wIChhLT5zZW5kZXIsIGItPnNlbmRlcikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikgJiYKKyAgICAgIHN0cmNtcCAoYS0+ZGVzdGluYXRpb24sIGItPmRlc3RpbmF0aW9uKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiB3ZSBhbHJlYWR5IGNvbXBhcmVkIHRoZSB2YWx1ZSBvZiBmbGFncywgYW5kCisgICAqIEJVU19NQVRDSF9DTElFTlRfSVNfRUFWRVNEUk9QUElORyBkb2VzIG5vdCBoYXZlIGFub3RoZXIgc3RydWN0IG1lbWJlciAqLworCisgIGlmIChhLT5mbGFncyAmIEJVU19NQVRDSF9BUkdTKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpZiAoYS0+YXJnc19sZW4gIT0gYi0+YXJnc19sZW4pCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGEtPmFyZ3NfbGVuKQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbmd0aDsKKworICAgICAgICAgIGlmICgoYS0+YXJnc1tpXSAhPSBOVUxMKSAhPSAoYi0+YXJnc1tpXSAhPSBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmIChhLT5hcmdfbGVuc1tpXSAhPSBiLT5hcmdfbGVuc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGxlbmd0aCA9IGEtPmFyZ19sZW5zW2ldICYgfkJVU19NQVRDSF9BUkdfRkxBR1M7CisKKyAgICAgICAgICBpZiAoYS0+YXJnc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGItPmFyZ3NbaV0gIT0gTlVMTCk7CisgICAgICAgICAgICAgIGlmIChtZW1jbXAgKGEtPmFyZ3NbaV0sIGItPmFyZ3NbaV0sIGxlbmd0aCkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9saW5rIChEQnVzTGlzdCAgICAgICAqKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICpsaW5rKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworICAKKyAgYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX21hdGNoX3J1bGUgKHJ1bGUtPm1hdGNoZXNfZ29fdG8sIHJ1bGUpOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChydWxlcywgbGluayk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiUmVtb3ZlZCBtYXRjaCBydWxlICVzIGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIHMgPyBzIDogIm5vbWVtIiwgcnVsZS0+bWF0Y2hlc19nb190byk7CisgICAgZGJ1c19mcmVlIChzKTsKKyAgfQorI2VuZGlmCisgIAorICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7ICAKK30KKwordm9pZAorYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpCit7CisgIERCdXNMaXN0ICoqcnVsZXM7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHJ1bGUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCA/IHJ1bGUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSk7CisKKyAgcnVsZXMgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgRkFMU0UpOworCisgIC8qIFdlIHNob3VsZCBvbmx5IGJlIGFza2VkIHRvIHJlbW92ZSBhIHJ1bGUgYnkgaWRlbnRpdHkgcmlnaHQgYWZ0ZXIgaXQgd2FzCisgICAqIGFkZGVkLCBzbyB0aGVyZSBzaG91bGQgYmUgYSBsaXN0IGZvciBpdC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAocnVsZXMgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmUgKHJ1bGVzLCBydWxlKTsKKyAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwgcnVsZS0+aW50ZXJmYWNlLAorICAgICAgcnVsZXMpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsKKyAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92ZWQgbWF0Y2ggcnVsZSAlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBzID8gcyA6ICJub21lbSIsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pOworICAgIGRidXNfZnJlZSAocyk7CisgIH0KKyNlbmRpZgorICAKKyAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworfQorCisvKiBSZW1vdmUgYSBzaW5nbGUgcnVsZSB3aGljaCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gcnVsZSBieSB2YWx1ZSAqLworZGJ1c19ib29sX3QKK2J1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2J5X3ZhbHVlIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzTGlzdCAqKnJ1bGVzOworICBEQnVzTGlzdCAqbGluayA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHJ1bGUgYnkgdmFsdWUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgdmFsdWUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgdmFsdWUtPmludGVyZmFjZSAhPSBOVUxMID8gdmFsdWUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgdmFsdWUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgIHZhbHVlLT5pbnRlcmZhY2UsIEZBTFNFKTsKKworICBpZiAocnVsZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB3ZSB0cmF2ZXJzZSBiYWNrd2FyZCBiZWNhdXNlIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlKCkKKyAgICAgICAqIHJlbW92ZXMgdGhlIG1vc3QtcmVjZW50bHktYWRkZWQgcnVsZQorICAgICAgICovCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChydWxlcyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworICAgICAgICAgIERCdXNMaXN0ICpwcmV2OworCisgICAgICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAgICAgcHJldiA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAocnVsZXMsIGxpbmspOworCisgICAgICAgICAgaWYgKG1hdGNoX3J1bGVfZXF1YWwgKHJ1bGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfbGluayAocnVsZXMsIGxpbmspOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmsgPSBwcmV2OworICAgICAgICB9CisgICAgfQorCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgZ2l2ZW4gbWF0Y2ggcnVsZSB3YXNuJ3QgZm91bmQgYW5kIGNhbid0IGJlIHJlbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHZhbHVlLT5tZXNzYWdlX3R5cGUsIHZhbHVlLT5pbnRlcmZhY2UsCisgICAgICBydWxlcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX2xpc3RfcmVtb3ZlX2J5X2Nvbm5lY3Rpb24gKERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgICAgICBEQnVzTGlzdCAqbmV4dDsKKworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChydWxlcywgbGluayk7CisKKyAgICAgIGlmIChydWxlLT5tYXRjaGVzX2dvX3RvID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9saW5rIChydWxlcywgbGluayk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKSAmJiAqcnVsZS0+c2VuZGVyID09ICc6JykgfHwKKyAgICAgICAgICAgICAgICgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pICYmICpydWxlLT5kZXN0aW5hdGlvbiA9PSAnOicpKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIHJ1bGUgbWF0Y2hlcyB0by9mcm9tIGEgYmFzZSBzZXJ2aWNlLCBzZWUgaWYgaXQncyB0aGUKKyAgICAgICAgICAgKiBvbmUgYmVpbmcgZGlzY29ubmVjdGVkLCBzaW5jZSB3ZSBrbm93IHRoaXMgc2VydmljZSBuYW1lCisgICAgICAgICAgICogd2lsbCBuZXZlciBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICAgICAgbmFtZSA9IGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7IC8qIGJlY2F1c2Ugd2UncmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gKi8KKworICAgICAgICAgIGlmICgoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocnVsZS0+c2VuZGVyLCBuYW1lKSA9PSAwKSB8fAorICAgICAgICAgICAgICAoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKSAmJgorICAgICAgICAgICAgICAgc3RyY21wIChydWxlLT5kZXN0aW5hdGlvbiwgbmFtZSkgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pCit7CisgIGludCBpOworCisgIC8qIEZJWE1FCisgICAqCisgICAqIFRoaXMgc2NhbnMgYWxsIG1hdGNoIHJ1bGVzIG9uIHRoZSBidXMuIFdlIGNvdWxkIGF2b2lkIHRoYXQKKyAgICogZm9yIHRoZSBydWxlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbm5lY3Rpb24sIHNpbmNlIHdlIGtlZXAKKyAgICogYSBsaXN0IG9mIHRob3NlOyBidXQgZm9yIHRoZSBydWxlcyB0aGF0IGp1c3QgcmVmZXIgdG8KKyAgICogdGhlIGNvbm5lY3Rpb24gd2UnZCBuZWVkIHRvIGRvIHNvbWV0aGluZyBtb3JlIGVsYWJvcmF0ZS4KKyAgICovCisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgYWxsIHJ1bGVzIGZvciBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisgICAgICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICAgICAgcnVsZV9saXN0X3JlbW92ZV9ieV9jb25uZWN0aW9uICgmcC0+cnVsZXNfd2l0aG91dF9pZmFjZSwgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChwLT5ydWxlc19ieV9pZmFjZSwgJml0ZXIpOworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKml0ZW1zID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAgICAgcnVsZV9saXN0X3JlbW92ZV9ieV9jb25uZWN0aW9uIChpdGVtcywgY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoKml0ZW1zID09IE5VTEwpCisgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSkKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNlcnZpY2VfbmFtZSk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIFNlcnZpY2UgZG9lc24ndCBleGlzdCBzbyBjb25uZWN0aW9uIGNhbid0IG93biBpdC4gKi8KKworICByZXR1cm4gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpID09IGNvbm5lY3Rpb247Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyX2hhc19wcmVmaXggKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcHJlZml4KQoreworICBzaXplX3QgcHJlZml4X2xlbjsKKyAgcHJlZml4X2xlbiA9IHN0cmxlbiAocHJlZml4KTsKKyAgaWYgKHN0cm5jbXAgKHN0ciwgcHJlZml4LCBwcmVmaXhfbGVuKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hdGNoX3J1bGVfbWF0Y2hlcyAoQnVzTWF0Y2hSdWxlICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoRmxhZ3MgICAgYWxyZWFkeV9tYXRjaGVkKQoreworICBkYnVzX2Jvb2xfdCB3YW50c190b19lYXZlc2Ryb3AgPSBGQUxTRTsKKyAgaW50IGZsYWdzOworCisgIC8qIEFsbCBmZWF0dXJlcyBvZiB0aGUgbWF0Y2ggcnVsZSBhcmUgQU5EJ2QgdG9nZXRoZXIsCisgICAqIHNvIEZBTFNFIGlmIGFueSBvZiB0aGVtIGRvbid0IG1hdGNoLgorICAgKi8KKworICAvKiBzZW5kZXIvYWRkcmVzc2VkX3JlY2lwaWVudCBvZiAjTlVMTCBtYXkgbWVhbiBidXMgZHJpdmVyLAorICAgKiBvciBmb3IgYWRkcmVzc2VkX3JlY2lwaWVudCBtYXkgbWVhbiBhIG1lc3NhZ2Ugd2l0aCBubworICAgKiBzcGVjaWZpYyByZWNpcGllbnQgKGkuZS4gYSBzaWduYWwpCisgICAqLworCisgIC8qIERvbid0IGJvdGhlciByZS1tYXRjaGluZyBmZWF0dXJlcyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgaW1wbGljaXRseS4gKi8KKyAgZmxhZ3MgPSBydWxlLT5mbGFncyAmICh+YWxyZWFkeV9tYXRjaGVkKTsKKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpCisgICAgd2FudHNfdG9fZWF2ZXNkcm9wID0gVFJVRTsKKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworCisgICAgICBpZiAocnVsZS0+bWVzc2FnZV90eXBlICE9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICppZmFjZTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisKKyAgICAgIGlmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworICAgICAgaWYgKGlmYWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHN0cmNtcCAoaWZhY2UsIHJ1bGUtPmludGVyZmFjZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1lbWJlcjsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZW1iZXIgIT0gTlVMTCk7CisKKyAgICAgIG1lbWJlciA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAgICAgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wIChtZW1iZXIsIHJ1bGUtPm1lbWJlcikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+c2VuZGVyICE9IE5VTEwpOworCisgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChydWxlLT5zZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpICE9IDApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChzZW5kZXIsIHJ1bGUtPnNlbmRlcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm90ZTogdGhpcyBwYXJ0IGlzIHJlbGV2YW50IGZvciBlYXZlc2Ryb3BwZXIgcnVsZXM6CisgICAqIFR3byBjYXNlczoKKyAgICogMSkgcnVsZSBoYXMgYSBkZXN0aW5hdGlvbiB0byBiZSBtYXRjaGVkCisgICAqICAgKGZsYWcgQlVTX01BVENIX0RFU1RJTkFUSU9OIHByZXNlbnQpLiBSdWxlIHdpbGwgbWF0Y2ggaWY6CisgICAqICAgLSBydWxlLT5kZXN0aW5hdGlvbiBtYXRjaGVzIHRoZSBhZGRyZXNzZWRfcmVjaXBpZW50CisgICAqICAgQU5ECisgICAqICAgLSB3YW50c190b19lYXZlc2Ryb3A9VFJVRQorICAgKgorICAgKiAgIE5vdGU6ICh0aGUgY2FzZSBpbiB3aGljaCBhZGRyZXNzZWRfcmVjaXBpZW50IGlzIHRoZSBhY3R1YWwgcnVsZSBvd25lcgorICAgKiAgIGlzIGhhbmRsZWQgZWxzZXdlcmUgaW4gZGlzcGF0Y2guYzpidXNfZGlzcGF0Y2hfbWF0Y2hlcygpLgorICAgKgorICAgKiAyKSBydWxlIGhhcyBubyBkZXN0aW5hdGlvbi4gUnVsZSB3aWxsIG1hdGNoIGlmOgorICAgKiAgICAtIG1lc3NhZ2UgaGFzIG5vIHNwZWNpZmllZCBkZXN0aW5hdGlvbiAoaWUgYnJvYWRjYXN0cykKKyAgICogICAgICAoTm90ZTogdGhpcyB3aWxsIHJ1bGUgb3V0IHVuaWNhc3QgbWV0aG9kIGNhbGxzIGFuZCB1bmljYXN0IHNpZ25hbHMsCisgICAqICAgICAgZml4aW5nIEZETyMyNjk3NDgpCisgICAqICAgIE9SCisgICAqICAgIC0gd2FudHNfdG9fZWF2ZXNkcm9wPVRSVUUgKGRlc3RpbmF0aW9uLWNhdGNoLWFsbCBzaXR1YXRpb24pCisgICAqLworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZGVzdGluYXRpb24gIT0gTlVMTCk7CisKKyAgICAgIGRlc3RpbmF0aW9uID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgICAgICBpZiAoZGVzdGluYXRpb24gPT0gTlVMTCkKKyAgICAgICAgLyogYnJvYWRjYXN0LCBidXQgdGhpcyBydWxlIHNwZWNpZmllZCBhIGRlc3RpbmF0aW9uOiBubyBtYXRjaCAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHJ1bGUgb3duZXIgZG9lcyBub3QgaW50ZW5kIHRvIGVhdmVzZHJvcDogd2UnbGwgZGVsaXZlciBvbmx5IG1zZ3MKKyAgICAgICAqIGRpcmVjdGVkIHRvIGl0LCBOT1QgTUFUQ0hJTkcgKi8KKyAgICAgIGlmICghd2FudHNfdG9fZWF2ZXNkcm9wKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IE5VTEwpCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgaWYgKHN0cmNtcCAocnVsZS0+ZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpICE9IDApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghY29ubmVjdGlvbl9pc19wcmltYXJ5X293bmVyIChhZGRyZXNzZWRfcmVjaXBpZW50LCBydWxlLT5kZXN0aW5hdGlvbikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBubyBkZXN0aW5hdGlvbiBpbiBydWxlICovCisgICAgICAgIGRidXNfYm9vbF90IG1zZ19pc19icm9hZGNhc3Q7CisKKyAgICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5kZXN0aW5hdGlvbiA9PSBOVUxMKTsKKworICAgICAgICBtc2dfaXNfYnJvYWRjYXN0ID0gKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID09IE5VTEwpOworCisgICAgICAgIGlmICghd2FudHNfdG9fZWF2ZXNkcm9wICYmICFtc2dfaXNfYnJvYWRjYXN0KQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAvKiBpZiB3ZSBhcmUgaGVyZSBydWxlIG93bmVyIGludGVuZHMgdG8gZWF2ZXNkcm9wCisgICAgICAgICAqIE9SCisgICAgICAgICAqIG1lc3NhZ2UgaXMgYmVpbmcgYnJvYWRjYXN0ZWQgKi8KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX1BBVEgpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgICAgICBwYXRoID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKTsKKyAgICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHN0cmNtcCAocGF0aCwgcnVsZS0+cGF0aCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0UpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgIGludCBsZW47CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+cGF0aCAhPSBOVUxMKTsKKworICAgICAgcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghc3RyX2hhc19wcmVmaXggKHBhdGgsIHJ1bGUtPnBhdGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGxlbiA9IHN0cmxlbiAocnVsZS0+cGF0aCk7CisKKyAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGFjdHVhbCBhcmd1bWVudCBpcyB3aXRoaW4gdGhlIGV4cGVjdGVkCisgICAgICAgKiBuYW1lc3BhY2UsIHJhdGhlciB0aGFuIGp1c3Qgc3RhcnRpbmcgd2l0aCB0aGF0IHN0cmluZywKKyAgICAgICAqIGJ5IGNoZWNraW5nIHRoYXQgdGhlIG1hdGNoZWQgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgJy8nCisgICAgICAgKiBvciB0aGUgZW5kIG9mIHRoZSBwYXRoLgorICAgICAgICoKKyAgICAgICAqIFNwZWNpYWwgY2FzZTogdGhlIG9ubHkgdmFsaWQgcGF0aCBvZiBsZW5ndGggMSwgIi8iLAorICAgICAgICogbWF0Y2hlcyBldmVyeXRoaW5nLgorICAgICAgICovCisgICAgICBpZiAobGVuID4gMSAmJiBwYXRoW2xlbl0gIT0gJ1wwJyAmJiBwYXRoW2xlbl0gIT0gJy8nKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9BUkdTKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgY3VycmVudF90eXBlOworICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2FyZzsKKyAgICAgICAgICBpbnQgZXhwZWN0ZWRfbGVuZ3RoOworICAgICAgICAgIGRidXNfYm9vbF90IGlzX3BhdGgsIGlzX25hbWVzcGFjZTsKKworICAgICAgICAgIGV4cGVjdGVkX2FyZyA9IHJ1bGUtPmFyZ3NbaV07CisgICAgICAgICAgZXhwZWN0ZWRfbGVuZ3RoID0gcnVsZS0+YXJnX2xlbnNbaV0gJiB+QlVTX01BVENIX0FSR19GTEFHUzsKKyAgICAgICAgICBpc19wYXRoID0gKHJ1bGUtPmFyZ19sZW5zW2ldICYgQlVTX01BVENIX0FSR19JU19QQVRIKSAhPSAwOworICAgICAgICAgIGlzX25hbWVzcGFjZSA9IChydWxlLT5hcmdfbGVuc1tpXSAmIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKSAhPSAwOworICAgICAgICAgIAorICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpOworCisgICAgICAgICAgaWYgKGV4cGVjdGVkX2FyZyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICphY3R1YWxfYXJnOworICAgICAgICAgICAgICBpbnQgYWN0dWFsX2xlbmd0aDsKKworICAgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9TVFJJTkcgJiYKKyAgICAgICAgICAgICAgICAgICghaXNfcGF0aCB8fCBjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX09CSkVDVF9QQVRIKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgYWN0dWFsX2FyZyA9IE5VTEw7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZhY3R1YWxfYXJnKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChhY3R1YWxfYXJnICE9IE5VTEwpOworCisgICAgICAgICAgICAgIGFjdHVhbF9sZW5ndGggPSBzdHJsZW4gKGFjdHVhbF9hcmcpOworCisgICAgICAgICAgICAgIGlmIChpc19wYXRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxfbGVuZ3RoIDwgZXhwZWN0ZWRfbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2FyZ1thY3R1YWxfbGVuZ3RoIC0gMV0gIT0gJy8nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZF9sZW5ndGggPCBhY3R1YWxfbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJnW2V4cGVjdGVkX2xlbmd0aCAtIDFdICE9ICcvJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgICAgICBpZiAobWVtY21wIChhY3R1YWxfYXJnLCBleHBlY3RlZF9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gKGFjdHVhbF9sZW5ndGgsIGV4cGVjdGVkX2xlbmd0aCkpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGlzX25hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVuZ3RoID4gYWN0dWFsX2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgYWN0dWFsIGFyZ3VtZW50IGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAqIG5hbWVzcGFjZSwgdGhlbiB3ZSBkb24ndCBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcCAoZXhwZWN0ZWRfYXJnLCBhY3R1YWxfYXJnLCBleHBlY3RlZF9sZW5ndGgpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCA8IGFjdHVhbF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBhY3R1YWwgYXJndW1lbnQgaXMgd2l0aGluIHRoZSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAqIG5hbWVzcGFjZSwgcmF0aGVyIHRoYW4ganVzdCBzdGFydGluZyB3aXRoIHRoYXQgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAqIGJ5IGNoZWNraW5nIHRoYXQgdGhlIG1hdGNoZWQgcHJlZml4IGVuZHMgaW4gYSAnLicuCisgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGRvZXNuJ3Qgc3RvcCAiZm9vLmJhci4iIG1hdGNoaW5nICJmb28uYmFyLi5iYXoiCisgICAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggaXMgYW4gaW52YWxpZCBuYW1lc3BhY2UsIGJ1dCBhdCBzb21lIHBvaW50IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAqIGRhZW1vbiBjYW4ndCBjb3ZlciB1cCBmb3IgYnJva2VuIHNlcnZpY2VzLgorICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxfYXJnW2V4cGVjdGVkX2xlbmd0aF0gIT0gJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2Ugd2UgaGFkIGFuIGV4YWN0IG1hdGNoLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZF9sZW5ndGggIT0gYWN0dWFsX2xlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcCAoZXhwZWN0ZWRfYXJnLCBhY3R1YWxfYXJnLCBleHBlY3RlZF9sZW5ndGgpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpOworCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChEQnVzTGlzdCAgICAgICAqKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICoqcmVjaXBpZW50c19wKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBpZiAocnVsZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAocnVsZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgICAgIHsKKyAgICAgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2hlY2tpbmcgd2hldGhlciBtZXNzYWdlIG1hdGNoZXMgcnVsZSAlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcyA/IHMgOiAibm9tZW0iLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpZiAobWF0Y2hfcnVsZV9tYXRjaGVzIChydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX01BVENIX01FU1NBR0VfVFlQRSB8IEJVU19NQVRDSF9JTlRFUkZBQ0UpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJ1bGUgbWF0Y2hlZFxuIik7CisKKyAgICAgICAgICAvKiBBcHBlbmQgdG8gdGhlIGxpc3QgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5ICovCisgICAgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX21hcmtfc3RhbXAgKHJ1bGUtPm1hdGNoZXNfZ29fdG8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZWNpcGllbnRzX3AsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb25uZWN0aW9uIGFscmVhZHkgcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSwgc28gbm90IGFkZGluZyBhZ2FpblxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAocnVsZXMsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaG1ha2VyX2dldF9yZWNpcGllbnRzIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICoqcmVjaXBpZW50c19wKQoreworICBpbnQgdHlwZTsKKyAgY29uc3QgY2hhciAqaW50ZXJmYWNlOworICBEQnVzTGlzdCAqKm5laXRoZXIsICoqanVzdF90eXBlLCAqKmp1c3RfaWZhY2UsICoqYm90aDsKKworICBfZGJ1c19hc3NlcnQgKCpyZWNpcGllbnRzX3AgPT0gTlVMTCk7CisKKyAgLyogVGhpcyBhdm9pZHMgc2VuZGluZyBzYW1lIG1lc3NhZ2UgdG8gdGhlIHNhbWUgY29ubmVjdGlvbiB0d2ljZS4KKyAgICogUHVycG9zZSBvZiB0aGUgc3RhbXAgaW5zdGVhZCBvZiBhIGJvb2wgaXMgdG8gYXZvaWQgaXRlcmF0aW5nIG92ZXIKKyAgICogYWxsIGNvbm5lY3Rpb25zIHJlc2V0dGluZyB0aGUgYm9vbCBlYWNoIHRpbWUuCisgICAqLworICBidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wIChjb25uZWN0aW9ucyk7CisKKyAgLyogYWRkcmVzc2VkX3JlY2lwaWVudCBpcyBhbHJlYWR5IHJlY2VpdmluZyB0aGUgbWVzc2FnZSwgZG9uJ3QgYWRkIHRvIGxpc3QuCisgICAqIE5VTEwgYWRkcmVzc2VkX3JlY2lwaWVudCBtZWFucyBlaXRoZXIgYnVzIGRyaXZlciwgb3IgdGhpcyBpcyBhIHNpZ25hbAorICAgKiBhbmQgdGh1cyBsYWNrcyBhIHNwZWNpZmljIGFkZHJlc3NlZF9yZWNpcGllbnQuCisgICAqLworICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIGJ1c19jb25uZWN0aW9uX21hcmtfc3RhbXAgKGFkZHJlc3NlZF9yZWNpcGllbnQpOworCisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpOworICBpbnRlcmZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisKKyAgbmVpdGhlciA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCwKKyAgICAgIE5VTEwsIEZBTFNFKTsKKyAganVzdF90eXBlID0ganVzdF9pZmFjZSA9IGJvdGggPSBOVUxMOworCisgIGlmIChpbnRlcmZhY2UgIT0gTlVMTCkKKyAgICBqdXN0X2lmYWNlID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLAorICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElELCBpbnRlcmZhY2UsIEZBTFNFKTsKKworICBpZiAodHlwZSA+IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgJiYgdHlwZSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVMpCisgICAgeworICAgICAganVzdF90eXBlID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCB0eXBlLCBOVUxMLCBGQUxTRSk7CisKKyAgICAgIGlmIChpbnRlcmZhY2UgIT0gTlVMTCkKKyAgICAgICAgYm90aCA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgdHlwZSwgaW50ZXJmYWNlLCBGQUxTRSk7CisgICAgfQorCisgIGlmICghKGdldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAobmVpdGhlciwgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlY2lwaWVudHNfcCkgJiYKKyAgICAgICAgZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChqdXN0X2lmYWNlLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSAmJgorICAgICAgICBnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKGp1c3RfdHlwZSwgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlY2lwaWVudHNfcCkgJiYKKyAgICAgICAgZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChib3RoLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9jbGVhciAocmVjaXBpZW50c19wKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIEJ1c01hdGNoUnVsZSoKK2NoZWNrX3BhcnNlIChkYnVzX2Jvb2xfdCBzaG91bGRfc3VjY2VlZCwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0KQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKyAgCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoTlVMTCwgJnN0ciwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgIHsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoc2hvdWxkX3N1Y2NlZWQgJiYgcnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcGFyc2U6ICVzOiAlczogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghc2hvdWxkX3N1Y2NlZWQgJiYgcnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZmFpbCB0byBwYXJzZTogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiBydWxlOworfQorCitzdGF0aWMgdm9pZAorYXNzZXJ0X2xhcmdlX3J1bGUgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUik7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKTsKKworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5tZW1iZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+c2VuZGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmRlc3RpbmF0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnBhdGggIT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmludGVyZmFjZSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzSW50ZXJmYWNlIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5zZW5kZXIsICJvcmcuZnJlZWRlc2t0b3AuREJ1c1NlbmRlciIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+bWVtYmVyLCAiRm9vIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5wYXRoLCAiL2Jhci9mb28iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmRlc3RpbmF0aW9uLCAiOjQ1MjM0NS4zNCIpID09IDApOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfcGFyc2luZyAodm9pZCAqZGF0YSkKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1c1NlbmRlcicsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZScsbWVtYmVyPSdGb28nLHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnRfbGFyZ2VfcnVsZSAocnVsZSk7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIFdpdGggZXh0cmEgd2hpdGVzcGFjZSBhbmQgdXNlbGVzcyBxdW90ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiICAgIHR5cGU9J3NpZ25hbCcsICBcdHNlbmRlcj0nb3JnLmZyZWVkZXMnJ2t0b3AuREJ1c1NlbmRlcicsICAgaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZScnJycnLCBcdG1lbWJlcj0nRm9vJyxwYXRoPScvYmFyL2ZvbycsZGVzdGluYXRpb249Jzo0NTIzNDUuMzQnJycnJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzc2VydF9sYXJnZV9ydWxlIChydWxlKTsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKworICAvKiBBIHNpbXBsZSBzaWduYWwgY29ubmVjdGlvbiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJ0eXBlPSdzaWduYWwnLHBhdGg9Jy9mb28nLGludGVyZmFjZT0nb3JnLkJhciciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnBhdGggIT0gTlVMTCk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5pbnRlcmZhY2UsICJvcmcuQmFyIikgPT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+cGF0aCwgIi9mb28iKSA9PSAwKTsKKyAgCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIGFyZ04gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMD0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzBdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcxPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDIpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzJdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMV0sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcyPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDMpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzJdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzNdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMl0sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKyAgCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzQwPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDQxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s0MF0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNDFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbNDBdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc2Mz0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA2NCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNjNdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzY0XSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzYzXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzdwYXRoPScvZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA4KTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s3XSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s4XSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzddLCAiL2ZvbyIpID09IDApOworICAgICAgX2RidXNfYXNzZXJ0ICgocnVsZS0+YXJnX2xlbnNbN10gJiBCVVNfTUFUQ0hfQVJHX0lTX1BBVEgpCisgICAgICAgICAgPT0gQlVTX01BVENIX0FSR19JU19QQVRIKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBBcmcgMCBuYW1lc3BhY2UgbWF0Y2hlcyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcwbmFtZXNwYWNlPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDEpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMF0sICJmb28iKSA9PSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJ1bGUtPmFyZ19sZW5zWzBdICYgQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpCisgICAgICAgICAgPT0gQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDEpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMF0sICJmb28uYmFyIikgPT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKChydWxlLT5hcmdfbGVuc1swXSAmIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKQorICAgICAgICAgID09IEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBPbmx5IGFyZzBuYW1lc3BhY2UgaXMgc3VwcG9ydGVkLiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMW5hbWVzcGFjZT0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogQW4gZW1wdHkgc3RyaW5nIGlzbid0IGEgdmFsaWQgbmFtZXNwYWNlIHByZWZpeCAoeW91IHNob3VsZCBqdXN0IG5vdAorICAgKiBzcGVjaWZ5IHRoaXMga2V5IGF0IGFsbCkuCisgICAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMG5hbWVzcGFjZT0nJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogVHJhaWxpbmcgcGVyaW9kcyBhcmVuJ3QgYWxsb3dlZCAoZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgYXJnMG5hbWVzcGFjZQorICAgKiBzcGVjIGFsbG93ZWQgYSBzaW5nbGUgdHJhaWxpbmcgcGVyaW9kLCB3aGljaCBhbHRlcmVkIHRoZSBzZW1hbnRpY3MpICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwbmFtZXNwYWNlPSdmb28uJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXIuJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby4uJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9J2Zvby5iYXIuLiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIFRvby1sYXJnZSBhcmdOICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmczMDA9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnNjQ9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIE5vIE4gaW4gYXJnTiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnPSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZ3Y9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnM2p1bms9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJndW1lbnQ9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICAKKyAgLyogUmVqZWN0IGR1cGxpY2F0ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGU9J3NpZ25hbCcsdHlwZT0nbWV0aG9kX2NhbGwnIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJwYXRoX25hbWVzcGFjZT0nL2Zvby9iYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0UpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPnBhdGgsICIvZm9vL2JhciIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIEFsbW9zdCBhIGR1cGxpY2F0ZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAicGF0aD0nL2ZvbycscGF0aF9uYW1lc3BhY2U9Jy9mb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICAvKiBUcmFpbGluZyAvIHdhcyBzdXBwb3J0ZWQgaW4gdGhlIGluaXRpYWwgcHJvcG9zYWwsIGJ1dCBub3cgaXNuJ3QgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInBhdGhfbmFtZXNwYWNlPScvZm9vLyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIER1cGxpY2F0ZXMgd2l0aCB0aGUgYXJnTiBjb2RlICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwPSdmb28nLGFyZzA9J2JhciciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMz0nZm9vJyxhcmczPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzMwPSdmb28nLGFyZzMwPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgCisgIC8qIFJlamVjdCBicm9rZW4ga2V5cyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYmxhaD0nc2lnbmFsJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogUmVqZWN0IGJyb2tlbiB2YWx1ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGU9J2Nob3VpbiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiaW50ZXJmYWNlPSdhYmNAZGVmKysnIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInNlcnZpY2U9J3lvdXBpJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogQWxsb3cgZW1wdHkgcnVsZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICIiKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IDApOworICAgICAgCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIEFsbC13aGl0ZXNwYWNlIHJ1bGUgaXMgdGhlIHNhbWUgYXMgZW1wdHkgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiICAgIFx0Iik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSAwKTsKKyAgICAgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBCdXQgd2l0aCBub24td2hpdGVzcGFjZSBjaGFycyBhbmQgbm8gPXZhbHVlLCBpdCdzIG5vdCBPSyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAidHlwZSIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKmZpcnN0OworICBjb25zdCBjaGFyICpzZWNvbmQ7Cit9IGVxdWFsaXR5X3Rlc3RzW10gPSB7CisgIHsgInR5cGU9J3NpZ25hbCciLCAidHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J2Zvby5iYXInIiwgImludGVyZmFjZT0nZm9vLmJhcicsdHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J2JhciciLCAibWVtYmVyPSdiYXInLHR5cGU9J3NpZ25hbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxzZW5kZXI9JzoxLjAnIiwgInNlbmRlcj0nOjEuMCcsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsZGVzdGluYXRpb249JzoxLjAnIiwgImRlc3RpbmF0aW9uPSc6MS4wJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxwYXRoPScvZm9vL2JhciciLCAicGF0aD0nL2Zvby9iYXInLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JsYWgnIiwgImFyZzA9J2JsYWgnLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JvbyciLCAiYXJnMD0nYm9vJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxhcmcwPSdibGFoJyxhcmcxPSdiYXonIiwgImFyZzA9J2JsYWgnLGFyZzE9J2JheicsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsYXJnMz0nZm9vc2gnIiwgImFyZzM9J2Zvb3NoJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgImFyZzM9J2Zvb2wnIiwgImFyZzM9J2Zvb2wnIiB9LAorICB7ICJhcmcwbmFtZXNwYWNlPSdmb29sJyIsICJhcmcwbmFtZXNwYWNlPSdmb29sJyIgfSwKKyAgeyAibWVtYmVyPSdmb29kJyIsICJtZW1iZXI9J2Zvb2QnIiB9LAorICB7ICJtZW1iZXI9ZXNjYXBlIiwgIm1lbWJlcj0nZXNjYXBlJyIgfSwKKyAgeyAibWVtYmVyPWljZWNyZWFtIiwgIm1lbWJlcj1pY2UnY3JlYW0nIiB9LAorICB7ICJhcmcwPSdjb21tYSx0eXBlPWNvbW1hJyx0eXBlPXNpZ25hbCIsICJ0eXBlPXNpZ25hbCxhcmcwPSdjb21tYSx0eXBlPWNvbW1hJyIgfSwKKyAgeyAiYXJnMD1lc2NhcFxcZSIsICJhcmcwPSdlc2NhcFxcZSciIH0sCisgIHsgImFyZzA9VGltZTogOCBvXFwnY2xvY2siLCAiYXJnMD0nVGltZTogOCBvJ1xcJydjbG9jayciIH0sCit9OworCitzdGF0aWMgdm9pZAordGVzdF9lcXVhbGl0eSAodm9pZCkKK3sKKyAgaW50IGk7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChlcXVhbGl0eV90ZXN0cykpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpmaXJzdDsKKyAgICAgIEJ1c01hdGNoUnVsZSAqc2Vjb25kOworICAgICAgY2hhciAqZmlyc3Rfc3RyLCAqc2Vjb25kX3N0cjsKKyAgICAgIEJ1c01hdGNoUnVsZSAqZmlyc3RfcmVwYXJzZWQsICpzZWNvbmRfcmVwYXJzZWQ7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgZmlyc3QgPSBjaGVja19wYXJzZSAoVFJVRSwgZXF1YWxpdHlfdGVzdHNbaV0uZmlyc3QpOworICAgICAgX2RidXNfYXNzZXJ0IChmaXJzdCAhPSBOVUxMKTsKKyAgICAgIHNlY29uZCA9IGNoZWNrX3BhcnNlIChUUlVFLCBlcXVhbGl0eV90ZXN0c1tpXS5zZWNvbmQpOworICAgICAgX2RidXNfYXNzZXJ0IChzZWNvbmQgIT0gTlVMTCk7CisKKyAgICAgIGlmICghbWF0Y2hfcnVsZV9lcXVhbCAoZmlyc3QsIHNlY29uZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgicnVsZSAlcyBhbmQgJXMgc2hvdWxkIGhhdmUgYmVlbiBlcXVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tpXS5zZWNvbmQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIC8qIENoZWNrIG1hdGNoX3J1bGVfdG9fc3RyaW5nICovCisgICAgICBmaXJzdF9zdHIgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAoZmlyc3QpOworICAgICAgX2RidXNfYXNzZXJ0IChmaXJzdF9zdHIgIT0gTlVMTCk7CisgICAgICBzZWNvbmRfc3RyID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHNlY29uZCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlY29uZF9zdHIgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZmlyc3Rfc3RyLCBzZWNvbmRfc3RyKSA9PSAwKTsKKyAgICAgIGZpcnN0X3JlcGFyc2VkID0gY2hlY2tfcGFyc2UgKFRSVUUsIGZpcnN0X3N0cik7CisgICAgICBzZWNvbmRfcmVwYXJzZWQgPSBjaGVja19wYXJzZSAoVFJVRSwgc2Vjb25kX3N0cik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1hdGNoX3J1bGVfZXF1YWwgKGZpcnN0LCBmaXJzdF9yZXBhcnNlZCkpOworICAgICAgX2RidXNfYXNzZXJ0IChtYXRjaF9ydWxlX2VxdWFsIChzZWNvbmQsIHNlY29uZF9yZXBhcnNlZCkpOworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKGZpcnN0X3JlcGFyc2VkKTsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChzZWNvbmRfcmVwYXJzZWQpOworICAgICAgZGJ1c19mcmVlIChmaXJzdF9zdHIpOworICAgICAgZGJ1c19mcmVlIChzZWNvbmRfc3RyKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHNlY29uZCk7CisKKyAgICAgIC8qIENoZWNrIHRoYXQgdGhlIHJ1bGUgaXMgbm90IGVxdWFsIHRvIGFueSBvZiB0aGUKKyAgICAgICAqIG90aGVycyBiZXNpZGVzIGl0cyBwYWlyIG1hdGNoCisgICAgICAgKi8KKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCBfREJVU19OX0VMRU1FTlRTIChlcXVhbGl0eV90ZXN0cykpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSAhPSBqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZWNvbmQgPSBjaGVja19wYXJzZSAoVFJVRSwgZXF1YWxpdHlfdGVzdHNbal0uc2Vjb25kKTsKKworICAgICAgICAgICAgICBpZiAobWF0Y2hfcnVsZV9lcXVhbCAoZmlyc3QsIHNlY29uZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoInJ1bGUgJXMgYW5kICVzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGVxdWFsXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfdGVzdHNbaV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tqXS5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytqOworICAgICAgICB9CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChmaXJzdCk7CisKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorc2hvdWxkX21hdGNoX21lc3NhZ2VfMVtdID0geworICAidHlwZT0nc2lnbmFsJyIsCisgICJtZW1iZXI9J0Zyb2JhdGVkJyIsCisgICJhcmcwPSdmb29iYXInIiwKKyAgInR5cGU9J3NpZ25hbCcsbWVtYmVyPSdGcm9iYXRlZCciLAorICAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J0Zyb2JhdGVkJyxhcmcwPSdmb29iYXInIiwKKyAgIm1lbWJlcj0nRnJvYmF0ZWQnLGFyZzA9J2Zvb2JhciciLAorICAidHlwZT0nc2lnbmFsJyxhcmcwPSdmb29iYXInIiwKKyAgLyogVGhlIGRlZmluaXRpb24gb2YgYXJnWHBhdGggbWF0Y2hlcyBzYXlzOiAiQXMgd2l0aCBub3JtYWwgYXJndW1lbnQgbWF0Y2hlcywKKyAgICogaWYgdGhlIGFyZ3VtZW50IGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0cmluZyBnaXZlbiBpbiB0aGUgbWF0Y2ggcnVsZQorICAgKiB0aGVuIHRoZSBydWxlIGlzIHNhdGlzZmllZC4iIFNvIHRoaXMgc2hvdWxkIG1hdGNoIChldmVuIHRob3VnaCB0aGUKKyAgICogYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgcGF0aCkhCisgICAqLworICAiYXJnMHBhdGg9J2Zvb2JhciciLAorICAiYXJnMG5hbWVzcGFjZT0nZm9vYmFyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J21ldGhvZF9jYWxsJyIsCisgICJ0eXBlPSdlcnJvciciLAorICAidHlwZT0nbWV0aG9kX3JldHVybiciLAorICAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J09vcHNlZCciLAorICAiYXJnMD0nYmxhaCciLAorICAiYXJnMT0nZm9vYmFyJyIsCisgICJhcmcyPSdmb29iYXInIiwKKyAgImFyZzM9J2Zvb2JhciciLAorICAiYXJnMD0nMyciLAorICAiYXJnMT0nMyciLAorICAiYXJnMD0nZm9vYmFyJyxhcmcxPSdhYmNkZWYnIiwKKyAgImFyZzA9J2Zvb2JhcicsYXJnMT0nYWJjZGVmJyxhcmcyPSdhYmNkZWZnaGknLGFyZzM9J2FiY2RlZmdoaScsYXJnND0nYWJjZGVmZ2hpJyIsCisgICJhcmcwPSdmb29iYXInLGFyZzE9J2FiY2RlZicsYXJnND0nYWJjZGVmZ2hpJyxhcmczPSdhYmNkZWZnaGknLGFyZzI9J2FiY2RlZmdoaSciLAorICAiYXJnMHBhdGg9J2ZvbyciLAorICAiYXJnMHBhdGg9J2Zvb2Jhci8nIiwKKyAgImFyZzFwYXRoPSczJyIsCisgICJhcmcwbmFtZXNwYWNlPSdmb28nIiwKKyAgImFyZzBuYW1lc3BhY2U9J2ZvbycsYXJnMT0nYWJjZGVmJyIsCisgICJhcmcwbmFtZXNwYWNlPSdtb28nIiwKKyAgTlVMTAorfTsKKworI2RlZmluZSBFWEFNUExFX05BTUUgImNvbS5leGFtcGxlLmJhY2tlbmQuZm9vIgorCitzdGF0aWMgY29uc3QgY2hhciAqCitzaG91bGRfbWF0Y2hfbWVzc2FnZV8yW10gPSB7CisgIC8qIEVYQU1QTEVfTkFNRSBpcyBpbiBhbGwgb2YgdGhlc2UgbmFtZXNwYWNlcyAqLworICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZCciLAorICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUnIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvbSciLAorCisgIC8qIElmIHRoZSBjbGllbnQgc3BlY2lmaWVzIHRoZSBuYW1lIGV4YWN0bHksIHdpdGggbm8gdHJhaWxpbmcgcGVyaW9kLCB0aGVuCisgICAqIGl0IHNob3VsZCBtYXRjaC4KKyAgICovCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kLmZvbyciLAorCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8yW10gPSB7CisgIC8qIFRoZXNlIGFyZSBub3QgZXZlbiBwcmVmaXhlcyAqLworICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZC5mb28uYmFyJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kLmZvb2JhciciLAorCisgIC8qIFRoZXNlIGFyZSBwcmVmaXhlcywgYnV0IHRoZXkncmUgbm90IHBhcmVudCBuYW1lc3BhY2VzLiAqLworICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZC5mbyciLAorICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjbyciLAorCisgIE5VTEwKK307CisKK3N0YXRpYyB2b2lkCitjaGVja19tYXRjaGVzIChkYnVzX2Jvb2xfdCAgZXhwZWN0ZWRfdG9fbWF0Y2gsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtYmVyLAorICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcnVsZV90ZXh0KQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIGRidXNfYm9vbF90IG1hdGNoZWQ7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCBydWxlX3RleHQpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgIT0gTlVMTCk7CisKKyAgLyogV2UgY2FuJ3QgdGVzdCBzZW5kZXIvZGVzdGluYXRpb24gcnVsZXMgc2luY2Ugd2UgcGFzcyBOVUxMIGhlcmUgKi8KKyAgbWF0Y2hlZCA9IG1hdGNoX3J1bGVfbWF0Y2hlcyAocnVsZSwgTlVMTCwgTlVMTCwgbWVzc2FnZSwgMCk7CisKKyAgaWYgKG1hdGNoZWQgIT0gZXhwZWN0ZWRfdG9fbWF0Y2gpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHJ1bGUgJXMgdG8gJXMgbWVzc2FnZSAlZCwgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgcnVsZV90ZXh0LCBleHBlY3RlZF90b19tYXRjaCA/CisgICAgICAgICAgICAgICAgICAibWF0Y2giIDogIm5vdCBtYXRjaCIsIG51bWJlcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbWF0Y2hpbmcgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICBudW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnNob3VsZF9tYXRjaCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc2hvdWxkX25vdF9tYXRjaCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChzaG91bGRfbWF0Y2hbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGVja19tYXRjaGVzIChUUlVFLCBudW1iZXIsIG1lc3NhZ2UsIHNob3VsZF9tYXRjaFtpXSk7CisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoc2hvdWxkX25vdF9tYXRjaFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoZWNrX21hdGNoZXMgKEZBTFNFLCBudW1iZXIsIG1lc3NhZ2UsIHNob3VsZF9ub3RfbWF0Y2hbaV0pOworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWF0Y2hpbmcgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlMSwgKm1lc3NhZ2UyOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisKKyAgbWVzc2FnZTEgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UxICE9IE5VTEwpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlMSwgIkZyb2JhdGVkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgdl9TVFJJTkcgPSAiZm9vYmFyIjsKKyAgdl9JTlQzMiA9IDM7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgCisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMSwgMSwKKyAgICAgICAgICAgICAgICAgIHNob3VsZF9tYXRjaF9tZXNzYWdlXzEsCisgICAgICAgICAgICAgICAgICBzaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMSk7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UxKTsKKworICBtZXNzYWdlMiA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UyLCAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIC8qIE9idmlvdXNseSB0aGlzIGlzbid0IHJlYWxseSBhIE5hbWVPd25lckNoYW5nZWQgc2lnbmFsLiAqLworICB2X1NUUklORyA9IEVYQU1QTEVfTkFNRTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgY2hlY2tfbWF0Y2hpbmcgKG1lc3NhZ2UyLCAyLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoX21lc3NhZ2VfMiwKKyAgICAgICAgICAgICAgICAgIHNob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8yKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UyKTsKK30KKworI2RlZmluZSBQQVRIX01BVENIX1JVTEUgImFyZzBwYXRoPScvYWEvYmIvJyIKKworLyogVGhpcyBpcyBhIGxpc3Qgb2YgcGF0aHMgdGhhdCBzaG91bGQgYmUgbWF0Y2hlZCBieSBQQVRIX01BVENIX1JVTEUsIHRha2VuCisgKiBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLiBOb3RpY2UgdGhhdCBub3QgYWxsIG9mIHRoZW0gYXJlIGFjdHVhbGx5IGxlZ2FsIEQtQnVzCisgKiBwYXRocy4KKyAqCisgKiBUaGUgYXV0aG9yIG9mIHRoaXMgdGVzdCB0YWtlcyBubyByZXNwb25zaWJpbGl0eSBmb3IgdGhlIHNlbWFudGljcyBvZgorICogdGhpcyBtYXRjaCBydWxlIGtleS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhdGhzX3RoYXRfc2hvdWxkX2JlX21hdGNoZWRbXSA9IHsKKyAgICAiL2FhLyIsCisgICAgIi9hYS9iYi8iLAorICAgICIvYWEvYmIvY2MvIiwKKyNkZWZpbmUgRklSU1RfVkFMSURfUEFUSF9XSElDSF9TSE9VTERfTUFUQ0ggMworICAgICIvIiwKKyAgICAiL2FhL2JiL2NjIiwKKyAgICBOVUxMCit9OworCisvKiBUaGVzZSBwYXRocyBzaG91bGQgbm90IGJlIG1hdGNoZWQgYnkgUEFUSF9NQVRDSF9SVUxFLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBhdGhzX3RoYXRfc2hvdWxkX25vdF9iZV9tYXRjaGVkW10gPSB7CisgICAgIi9hYS9iIiwKKyAgICAiL2FhIiwKKyAgICAvKiBvciBldmVuLi4uICovCisgICAgIi9hYS9iYiIsCisgICAgTlVMTAorfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfcGF0aF9tYXRjaCAoaW50IHR5cGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpydWxlX3RleHQsCisgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBzaG91bGRfbWF0Y2gpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgZGJ1c19ib29sX3QgbWF0Y2hlZDsKKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UsICJGb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgbWF0Y2hlZCA9IG1hdGNoX3J1bGVfbWF0Y2hlcyAocnVsZSwgTlVMTCwgTlVMTCwgbWVzc2FnZSwgMCk7CisKKyAgaWYgKG1hdGNoZWQgIT0gc2hvdWxkX21hdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBydWxlICVzIHRvICVzIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgIndpdGggZmlyc3QgYXJnICVzIG9mIHR5cGUgJyVjJywgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgcnVsZV90ZXh0LAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoID8gIm1hdGNoIiA6ICJub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgIChjaGFyKSB0eXBlKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wYXRoX21hdGNoaW5nICh2b2lkKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIGNvbnN0IGNoYXIgKipzOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgUEFUSF9NQVRDSF9SVUxFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX2JlX21hdGNoZWQ7ICpzICE9IE5VTEw7IHMrKykKKyAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9TVFJJTkcsICpzLCBQQVRIX01BVENIX1JVTEUsIHJ1bGUsIFRSVUUpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX2JlX21hdGNoZWQgKyBGSVJTVF9WQUxJRF9QQVRIX1dISUNIX1NIT1VMRF9NQVRDSDsKKyAgICAgICAqcyAhPSBOVUxMOyBzKyspCisgICAgdGVzdF9wYXRoX21hdGNoIChEQlVTX1RZUEVfT0JKRUNUX1BBVEgsICpzLCBQQVRIX01BVENIX1JVTEUsIHJ1bGUsIFRSVUUpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX25vdF9iZV9tYXRjaGVkOyAqcyAhPSBOVUxMOyBzKyspCisgICAgeworICAgICAgdGVzdF9wYXRoX21hdGNoIChEQlVTX1RZUEVfU1RSSU5HLCAqcywgUEFUSF9NQVRDSF9SVUxFLCBydWxlLCBGQUxTRSk7CisgICAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgKnMsIFBBVEhfTUFUQ0hfUlVMRSwgcnVsZSwgRkFMU0UpOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX21hdGNoX21lc3NhZ2VfMVtdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nLyciLAorICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2ZvbyciLAorICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2Zvby9UaGVPYmplY3RNYW5hZ2VyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9iYXInIiwKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9iYXIvVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzJbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy8nIiwKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9mb28vVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8yW10gPSB7CisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX21hdGNoX21lc3NhZ2VfM1tdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nLyciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8zW10gPSB7CisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvZm9vL1RoZU9iamVjdE1hbmFnZXInIiwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV80W10gPSB7CisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzRbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9mb28vVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgdm9pZAordGVzdF9tYXRjaGluZ19wYXRoX25hbWVzcGFjZSAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UxOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTI7CisgIERCdXNNZXNzYWdlICptZXNzYWdlMzsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U0OworCisgIG1lc3NhZ2UxID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMSAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UxLCAiL2Zvby9UaGVPYmplY3RNYW5hZ2VyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyICE9IE5VTEwpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZTIsICIvZm9vL1RoZU9iamVjdE1hbmFnZXIvY2hpbGRfb2JqZWN0IikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgbWVzc2FnZTMgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UzICE9IE5VTEwpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZTMsICIvZm9vL1RoZU9iamVjdE1hbmFnZXJPdGhlciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIG1lc3NhZ2U0ID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlNCAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2U0LCAiLyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMSwgMSwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzEsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMSk7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMiwgMiwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzIsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMik7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMywgMywKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzMsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMyk7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlNCwgNCwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzQsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfNCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlNCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlMSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2lnbmFsc190ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworCisgIG1hdGNobWFrZXIgPSBidXNfbWF0Y2htYWtlcl9uZXcgKCk7CisgIGJ1c19tYXRjaG1ha2VyX3JlZiAobWF0Y2htYWtlcik7CisgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChtYXRjaG1ha2VyKTsKKyAgYnVzX21hdGNobWFrZXJfdW5yZWYgKG1hdGNobWFrZXIpOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJwYXJzaW5nIG1hdGNoIHJ1bGVzIiwgdGVzdF9wYXJzaW5nLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzaW5nIG1hdGNoIHJ1bGVzIHRlc3QgZmFpbGVkIik7CisKKyAgdGVzdF9lcXVhbGl0eSAoKTsKKyAgdGVzdF9tYXRjaGluZyAoKTsKKyAgdGVzdF9wYXRoX21hdGNoaW5nICgpOworICB0ZXN0X21hdGNoaW5nX3BhdGhfbmFtZXNwYWNlICgpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL3NpZ25hbHMuaCBiL2J1cy9zaWduYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZmIwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zaWduYWxzLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2lnbmFscy5oICBCdXMgc2lnbmFsIGNvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NJR05BTFNfSAorI2RlZmluZSBCVVNfU0lHTkFMU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK3R5cGVkZWYgZW51bQoreworICBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFICAgICAgICAgICAgPSAxIDw8IDAsCisgIEJVU19NQVRDSF9JTlRFUkZBQ0UgICAgICAgICAgICAgICA9IDEgPDwgMSwKKyAgQlVTX01BVENIX01FTUJFUiAgICAgICAgICAgICAgICAgID0gMSA8PCAyLAorICBCVVNfTUFUQ0hfU0VOREVSICAgICAgICAgICAgICAgICAgPSAxIDw8IDMsCisgIEJVU19NQVRDSF9ERVNUSU5BVElPTiAgICAgICAgICAgICA9IDEgPDwgNCwKKyAgQlVTX01BVENIX1BBVEggICAgICAgICAgICAgICAgICAgID0gMSA8PCA1LAorICBCVVNfTUFUQ0hfQVJHUyAgICAgICAgICAgICAgICAgICAgPSAxIDw8IDYsCisgIEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSAgICAgICAgICA9IDEgPDwgNywKKyAgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HID0gMSA8PCA4Cit9IEJ1c01hdGNoRmxhZ3M7CisKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfbmV3ICAgKERCdXNDb25uZWN0aW9uICptYXRjaGVzX2dvX3RvKTsKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfcmVmICAgKEJ1c01hdGNoUnVsZSAgICpydWxlKTsKK3ZvaWQgICAgICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKEJ1c01hdGNoUnVsZSAgICpydWxlKTsKKworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X21lc3NhZ2VfdHlwZSAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X2ludGVyZmFjZSAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmludGVyZmFjZSk7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyICAgICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbWVtYmVyKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9zZW5kZXIgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzZW5kZXIpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X2Rlc3RpbmF0aW9uICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmRlc3RpbmF0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9wYXRoICAgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgaXNfbmFtZXNwYWNlKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9hcmcgICAgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpOworCisvKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyBhIGNsaWVudCBkZWNsYXJlcyB0aGF0IGl0IGlzIGNyZWF0aW5nIGEgcnVsZSB3aGljaAorICogbmVlZHMgdG8gZWF2ZXNkcm9wIChlLmcuLCBkYnVzLW1vbml0b3IpLCBhbnkgb3RoZXIgY3JlYXRlZCBydWxlcyBub3QKKyAqIHNldHRpbmcgdGhlbXNlbHZlcyBhcyBlYXZlc2Ryb3BwaW5nIHdvbid0IHJlY2VpdmUgYW55IG1lc3NhZ2Ugbm90IGFkZHJlc3NlZAorICogdG8gdGhlbSwgd2hlbiBlYXZlZHJvcCBpcyBlbmFibGVkIGluIHRoZSBwb2xpY3kuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbgorICogZWF2ZWRyb3AgaXMgbm90IGVuYWJsZWQgaW4gcG9saWN5LCB0aGlzIG1ldGhvZCB3b24ndCBoYXZlIGFueSBlZmZlY3QgKi8KK3ZvaWQgYnVzX21hdGNoX3J1bGVfc2V0X2NsaWVudF9pc19lYXZlc2Ryb3BwaW5nIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX2VhdmVzZHJvcHBpbmcpOworCitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9nZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAqcnVsZSk7CisKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpydWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfZHVtcCAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIpOworI2VuZGlmCisKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX25ldyAgICh2b2lkKTsKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX3JlZiAgIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKK3ZvaWQgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKKworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgICAgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfYnlfdmFsdWUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApOworCisjZW5kaWYgLyogQlVTX1NJR05BTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3N0YXRzLmMgYi9idXMvc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNlMGUyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL3N0YXRzLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qIHN0YXRzLmMgLSBzdGF0aXN0aWNzIGZyb20gdGhlIGJ1cyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxMi0yMDEzIENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInN0YXRzLmgiCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtYXN2LXV0aWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaD4KKworI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKworZGJ1c19ib29sX3QKK2J1c19zdGF0c19oYW5kbGVfZ2V0X3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJfaXRlcjsKKyAgc3RhdGljIGRidXNfdWludDMyX3Qgc3RhdHNfc2VyaWFsID0gMDsKKyAgZGJ1c191aW50MzJfdCBpbl91c2UsIGluX2ZyZWVfbGlzdCwgYWxsb2NhdGVkOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghYnVzX2RyaXZlcl9jaGVja19tZXNzYWdlX2lzX2Zvcl91cyAobWVzc2FnZSwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb250ZXh0ID0gYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbik7CisgIGNvbm5lY3Rpb25zID0gYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zIChjb250ZXh0KTsKKworICByZXBseSA9IF9kYnVzX2Fzdl9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSwgJml0ZXIsICZhcnJfaXRlcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgLyogR2xvYmFscyAqLworCisgIF9kYnVzX2xpc3RfZ2V0X3N0YXRzICgmaW5fdXNlLCAmaW5fZnJlZV9saXN0LCAmYWxsb2NhdGVkKTsKKworICBpZiAoIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJTZXJpYWwiLCBzdGF0c19zZXJpYWwrKykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiTGlzdE1lbVBvb2xVc2VkQnl0ZXMiLCBpbl91c2UpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkxpc3RNZW1Qb29sQ2FjaGVkQnl0ZXMiLCBpbl9mcmVlX2xpc3QpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkxpc3RNZW1Qb29sQWxsb2NhdGVkQnl0ZXMiLCBhbGxvY2F0ZWQpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uICgmaXRlciwgJmFycl9pdGVyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICAvKiBDb25uZWN0aW9ucyAqLworCisgIGlmICghX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkFjdGl2ZUNvbm5lY3Rpb25zIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF9uX2FjdGl2ZSAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJJbmNvbXBsZXRlQ29ubmVjdGlvbnMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJNYXRjaFJ1bGVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF90b3RhbF9tYXRjaF9ydWxlcyAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJQZWFrTWF0Y2hSdWxlcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlcyAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJQZWFrTWF0Y2hSdWxlc1BlckNvbm5lY3Rpb24iLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfbWF0Y2hfcnVsZXNfcGVyX2Nvbm4gKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiQnVzTmFtZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX2J1c19uYW1lcyAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJQZWFrQnVzTmFtZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfYnVzX25hbWVzIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtCdXNOYW1lc1BlckNvbm5lY3Rpb24iLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfYnVzX25hbWVzX3Blcl9jb25uIChjb25uZWN0aW9ucykpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uICgmaXRlciwgJmFycl9pdGVyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICAvKiBlbmQgKi8KKworICBpZiAoIV9kYnVzX2Fzdl9jbG9zZSAoJml0ZXIsICZhcnJfaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKK29vbToKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3N0YXRzX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zdGF0cyAoREJ1c0Nvbm5lY3Rpb24gKmNhbGxlcl9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmJ1c19uYW1lID0gTlVMTDsKKyAgREJ1c1N0cmluZyBidXNfbmFtZV9zdHI7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJfaXRlcjsKKyAgc3RhdGljIGRidXNfdWludDMyX3Qgc3RhdHNfc2VyaWFsID0gMDsKKyAgZGJ1c191aW50MzJfdCBpbl9tZXNzYWdlcywgaW5fYnl0ZXMsIGluX2ZkcywgaW5fcGVha19ieXRlcywgaW5fcGVha19mZHM7CisgIGRidXNfdWludDMyX3Qgb3V0X21lc3NhZ2VzLCBvdXRfYnl0ZXMsIG91dF9mZHMsIG91dF9wZWFrX2J5dGVzLCBvdXRfcGVha19mZHM7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c0Nvbm5lY3Rpb24gKnN0YXRzX2Nvbm5lY3Rpb247CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFidXNfZHJpdmVyX2NoZWNrX21lc3NhZ2VfaXNfZm9yX3VzIChtZXNzYWdlLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjYWxsZXJfY29ubmVjdGlvbik7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYnVzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmYnVzX25hbWVfc3RyLCBidXNfbmFtZSk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJmJ1c19uYW1lX3N0cik7CisKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgIkJ1cyBuYW1lICclcycgaGFzIG5vIG93bmVyIiwgYnVzX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdGF0c19jb25uZWN0aW9uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworICBfZGJ1c19hc3NlcnQgKHN0YXRzX2Nvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgcmVwbHkgPSBfZGJ1c19hc3ZfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UsICZpdGVyLCAmYXJyX2l0ZXIpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIC8qIEJ1cyBkYWVtb24gcGVyLWNvbm5lY3Rpb24gc3RhdHMgKi8KKworICBpZiAoIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJTZXJpYWwiLCBzdGF0c19zZXJpYWwrKykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiTWF0Y2hSdWxlcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChzdGF0c19jb25uZWN0aW9uKSkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha01hdGNoUnVsZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfcGVha19tYXRjaF9ydWxlcyAoc3RhdHNfY29ubmVjdGlvbikpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkJ1c05hbWVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKHN0YXRzX2Nvbm5lY3Rpb24pKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJQZWFrQnVzTmFtZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfcGVha19idXNfbmFtZXMgKHN0YXRzX2Nvbm5lY3Rpb24pKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfc3RyaW5nICgmYXJyX2l0ZXIsICJVbmlxdWVOYW1lIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKHN0YXRzX2Nvbm5lY3Rpb24pKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbiAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogREJ1c0Nvbm5lY3Rpb24gcGVyLWNvbm5lY3Rpb24gc3RhdHMgKi8KKworICBfZGJ1c19jb25uZWN0aW9uX2dldF9zdGF0cyAoc3RhdHNfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9tZXNzYWdlcywgJmluX2J5dGVzLCAmaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluX3BlYWtfYnl0ZXMsICZpbl9wZWFrX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfbWVzc2FnZXMsICZvdXRfYnl0ZXMsICZvdXRfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9wZWFrX2J5dGVzLCAmb3V0X3BlYWtfZmRzKTsKKworICBpZiAoIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJJbmNvbWluZ01lc3NhZ2VzIiwgaW5fbWVzc2FnZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkluY29taW5nQnl0ZXMiLCBpbl9ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiSW5jb21pbmdGRHMiLCBpbl9mZHMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtJbmNvbWluZ0J5dGVzIiwgaW5fcGVha19ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha0luY29taW5nRkRzIiwgaW5fcGVha19mZHMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nTWVzc2FnZXMiLCBvdXRfbWVzc2FnZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nQnl0ZXMiLCBvdXRfYnl0ZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nRkRzIiwgb3V0X2ZkcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha091dGdvaW5nQnl0ZXMiLCBvdXRfcGVha19ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha091dGdvaW5nRkRzIiwgb3V0X3BlYWtfZmRzKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbiAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogZW5kICovCisKKyAgaWYgKCFfZGJ1c19hc3ZfY2xvc2UgKCZpdGVyLCAmYXJyX2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjYWxsZXJfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBpZiAocmVwbHkgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworZGJ1c19ib29sX3QKK2J1c19zdGF0c19oYW5kbGVfZ2V0X2FsbF9tYXRjaF9ydWxlcyAoREJ1c0Nvbm5lY3Rpb24gKmNhbGxlcl9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNTdHJpbmcgYnVzX25hbWVfc3RyOworICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBOVUxMOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlciwgaGFzaF9pdGVyLCBlbnRyeV9pdGVyLCBhcnJfaXRlcjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBjaGFyICoqc2VydmljZXMgPSBOVUxMOworICBpbnQgc2VydmljZXNfbGVuOworICBEQnVzQ29ubmVjdGlvbiAqY29ubl9maWx0ZXIgPSBOVUxMOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBpbnQgaTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY2FsbGVyX2Nvbm5lY3Rpb24pOworICBjb250ZXh0ID0gYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbik7CisgIG1hdGNobWFrZXIgPSBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoY29udGV4dCk7CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAocmVnaXN0cnksICZzZXJ2aWNlcywgJnNlcnZpY2VzX2xlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwgIntzYXN9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc2hfaXRlcikpCisgICAgZ290byBvb207CisKKyAgZm9yIChpID0gMCA7IGkgPCBzZXJ2aWNlc19sZW4gOyBpKyspCisgICAgeworICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKworICAgICAgLyogVG8gYXZvaWQgZHVwbGljYXRlIGVudHJpZXMsIG9ubHkgbG9vayBmb3IgdW5pcXVlIG5hbWVzICovCisgICAgICBpZiAoc2VydmljZXNbaV1bMF0gIT0gJzonKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZidXNfbmFtZV9zdHIsIHNlcnZpY2VzW2ldKTsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJmJ1c19uYW1lX3N0cik7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UgIT0gTlVMTCk7CisKKyAgICAgIGNvbm5fZmlsdGVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworICAgICAgX2RidXNfYXNzZXJ0IChjb25uX2ZpbHRlciAhPSBOVUxMKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmhhc2hfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnlfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZoYXNoX2l0ZXIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VzW2ldKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaGFzaF9pdGVyLCAmZW50cnlfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmZW50cnlfaXRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyX2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZoYXNoX2l0ZXIsICZlbnRyeV9pdGVyKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZoYXNoX2l0ZXIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGlmICghYnVzX21hdGNoX3J1bGVfZHVtcCAobWF0Y2htYWtlciwgY29ubl9maWx0ZXIsICZhcnJfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJmVudHJ5X2l0ZXIsICZhcnJfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZoYXNoX2l0ZXIsICZlbnRyeV9pdGVyKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZoYXNoX2l0ZXIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmZW50cnlfaXRlciwgJmFycl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaGFzaF9pdGVyLCAmZW50cnlfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZoYXNoX2l0ZXIsICZlbnRyeV9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmhhc2hfaXRlcik7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY2FsbGVyX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBpZiAocmVwbHkgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1cy9zdGF0cy5oIGIvYnVzL3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiMDIyYwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zdGF0cy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHN0YXRzLmggLSBzdGF0aXN0aWNzIGZyb20gdGhlIGJ1cyBkcml2ZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEJVU19TVEFUU19ICisjZGVmaW5lIEJVU19TVEFUU19ICisKKyNpbmNsdWRlICJidXMuaCIKKworI2RlZmluZSBCVVNfSU5URVJGQUNFX1NUQVRTICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZWJ1Zy5TdGF0cyIKKworZGJ1c19ib29sX3QgYnVzX3N0YXRzX2hhbmRsZV9nZXRfc3RhdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBidXNfc3RhdHNfaGFuZGxlX2dldF9jb25uZWN0aW9uX3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgYnVzX3N0YXRzX2hhbmRsZV9nZXRfYWxsX21hdGNoX3J1bGVzIChEQnVzQ29ubmVjdGlvbiAqY2FsbGVyX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKKyNlbmRpZiAvKiBtdWx0aXBsZS1pbmNsdXNpb24gZ3VhcmQgKi8KZGlmZiAtLWdpdCBhL2J1cy9zeXN0ZW0uY29uZi5pbiBiL2J1cy9zeXN0ZW0uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjliZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3N5c3RlbS5jb25mLmluCkBAIC0wLDAgKzEsMTE4IEBACis8IS0tIFRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRyb2xzIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLgorICAgICBBZGQgYSBzeXN0ZW0tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IS0tIE5vdGUgdGhhdCB0aGVyZSBhcmUgYW55IG51bWJlciBvZiB3YXlzIHlvdSBjYW4gaG9zZSB5b3Vyc2VsZgorICAgICBzZWN1cml0eS13aXNlIGJ5IHNjcmV3aW5nIHVwIHRoaXMgZmlsZTsgaW4gcGFydGljdWxhciwgeW91CisgICAgIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gbGlzdGVuIG9uIGFueSBtb3JlIGFkZHJlc3NlcywgYWRkIGFueSBtb3JlCisgICAgIGF1dGggbWVjaGFuaXNtcywgcnVuIGFzIGEgZGlmZmVyZW50IHVzZXIsIGV0Yy4gLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisKKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG8gbm90IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisKKyAgPCEtLSBSdW4gYXMgc3BlY2lhbCB1c2VyIC0tPgorICA8dXNlcj5AREJVU19VU0VSQDwvdXNlcj4KKworICA8IS0tIEZvcmsgaW50byBkYWVtb24gbW9kZSAtLT4KKyAgPGZvcmsvPgorCisgIDwhLS0gV2UgdXNlIHN5c3RlbSBzZXJ2aWNlIGxhdW5jaGluZyB1c2luZyBhIGhlbHBlciAtLT4KKyAgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8+CisKKyAgPCEtLSBUaGlzIGlzIGEgc2V0dWlkIGhlbHBlciB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoIHN5c3RlbSBzZXJ2aWNlcyAtLT4KKyAgPHNlcnZpY2VoZWxwZXI+QERCVVNfTElCRVhFQ0RJUkAvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlcjwvc2VydmljZWhlbHBlcj4KKworICA8IS0tIFdyaXRlIGEgcGlkIGZpbGUgLS0+CisgIDxwaWRmaWxlPkBEQlVTX1NZU1RFTV9QSURfRklMRUA8L3BpZGZpbGU+CisKKyAgPCEtLSBFbmFibGUgbG9nZ2luZyB0byBzeXNsb2cgLS0+CisgIDxzeXNsb2cvPgorCisgIDwhLS0gT25seSBhbGxvdyBzb2NrZXQtY3JlZGVudGlhbHMtYmFzZWQgYXV0aGVudGljYXRpb24gLS0+CisgIDxhdXRoPkVYVEVSTkFMPC9hdXRoPgorCisgIDwhLS0gT25seSBsaXN0ZW4gb24gYSBsb2NhbCBzb2NrZXQuIChhYnN0cmFjdD0vcGF0aC90by9zb2NrZXQgCisgICAgICAgbWVhbnMgdXNlIGFic3RyYWN0IG5hbWVzcGFjZSwgZG9uJ3QgcmVhbGx5IGNyZWF0ZSBmaWxlc3lzdGVtIAorICAgICAgIGZpbGU7IG9ubHkgTGludXggc3VwcG9ydHMgdGhpcy4gVXNlIHBhdGg9L3doYXRldmVyIG9uIG90aGVyIAorICAgICAgIHN5c3RlbXMuKSAtLT4KKyAgPGxpc3Rlbj5AREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0A8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsIHVzZXJzIGNhbiBjb25uZWN0IHRvIHN5c3RlbSBidXMgLS0+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKworICAgIDwhLS0gSG9sZXMgbXVzdCBiZSBwdW5jaGVkIGluIHNlcnZpY2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IKKyAgICAgICAgIG5hbWUgb3duZXJzaGlwIGFuZCBzZW5kaW5nIG1ldGhvZCBjYWxscyAtLT4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8ZGVueSBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisKKyAgICA8IS0tIFNpZ25hbHMgYW5kIHJlcGx5IG1lc3NhZ2VzIChtZXRob2QgcmV0dXJucywgZXJyb3JzKSBhcmUgYWxsb3dlZAorICAgICAgICAgYnkgZGVmYXVsdCAtLT4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJzaWduYWwiLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgc2VuZF90eXBlPSJlcnJvciIvPgorCisgICAgPCEtLSBBbGwgbWVzc2FnZXMgbWF5IGJlIHJlY2VpdmVkIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0iZXJyb3IiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJzaWduYWwiLz4KKworICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIHRhbGsgdG8gdGhlIG1lc3NhZ2UgYnVzIC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzIiAvPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi8+CisgICAgPCEtLSBCdXQgZGlzYWxsb3cgc29tZSBzcGVjaWZpYyBidXMgc2VydmljZXMgLS0+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfbWVtYmVyPSJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVidWcuU3RhdHMiLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIvPgorICA8L3BvbGljeT4KKworICA8IS0tIE9ubHkgc3lzdGVtZCwgd2hpY2ggcnVucyBhcyByb290LCBtYXkgcmVwb3J0IGFjdGl2YXRpb24gZmFpbHVyZXMuIC0tPgorICA8cG9saWN5IHVzZXI9InJvb3QiPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSByb290IG1heSBtb25pdG9yIHRoZSBzeXN0ZW0gYnVzLiAtLT4KKyAgPHBvbGljeSB1c2VyPSJyb290Ij4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Nb25pdG9yaW5nIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gSWYgdGhlIFN0YXRzIGludGVyZmFjZSB3YXMgZW5hYmxlZCBhdCBjb21waWxlLXRpbWUsIHJvb3QgbWF5IHVzZSBpdC4KKyAgICAgICBDb3B5IHRoaXMgaW50byBzeXN0ZW0ubG9jYWwuY29uZiBvciBzeXN0ZW0uZC8qLmNvbmYgaWYgeW91IHdhbnQgdG8KKyAgICAgICBlbmFibGUgb3RoZXIgcHJpdmlsZWdlZCB1c2VycyB0byB2aWV3IHN0YXRpc3RpY3MgYW5kIGRlYnVnIGluZm8gLS0+CisgIDxwb2xpY3kgdXNlcj0icm9vdCI+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVidWcuU3RhdHMiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBJbmNsdWRlIGxlZ2FjeSBjb25maWd1cmF0aW9uIGxvY2F0aW9uIC0tPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5AU1lTQ09ORkRJUl9GUk9NX1BLR0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZjwvaW5jbHVkZT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIHB1bmNoIAorICAgICAgIGhvbGVzIGluIHRoZSBhYm92ZSBwb2xpY3kgZm9yIHNwZWNpZmljIHNlcnZpY2VzLiAtLT4KKyAgPGluY2x1ZGVkaXI+c3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPGluY2x1ZGVkaXI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPCEtLSBUaGlzIGlzIGluY2x1ZGVkIGxhc3Qgc28gbG9jYWwgY29uZmlndXJhdGlvbiBjYW4gb3ZlcnJpZGUgd2hhdCdzIAorICAgICAgIGluIHRoaXMgc3RhbmRhcmQgZmlsZSAtLT4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc3lzdGVtLWxvY2FsLmNvbmY8L2luY2x1ZGU+CisKKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJ5ZXMiIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0ieWVzIj5jb250ZXh0cy9kYnVzX2NvbnRleHRzPC9pbmNsdWRlPgorCisgIDwhLS0gQ2hyb21pdW0gdGFsa3MgdG8gbW9zdCBzZXJ2aWNlcyBvbiB0aGUgYnVzIHNvIG5lZWRzIGEgcmVsYXRpdmVseQorICAgICAgIGxhcmdlIG51bWJlciBvZiBtYXRjaCBydWxlcy4gLS0+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjQwOTY8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9idXMvc3lzdGVtZC11c2VyL2RidXMuc2VydmljZS5pbiBiL2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWY1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvc3lzdGVtZC11c2VyL2RidXMuc2VydmljZS5pbgpAQCAtMCwwICsxLDExIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUQtQnVzIFVzZXIgTWVzc2FnZSBCdXMKK0RvY3VtZW50YXRpb249bWFuOmRidXMtZGFlbW9uKDEpCitSZXF1aXJlcz1kYnVzLnNvY2tldAorCitbU2VydmljZV0KK0V4ZWNTdGFydD1ARVhQQU5ERURfQklORElSQC9kYnVzLWRhZW1vbiAtLXNlc3Npb24gLS1hZGRyZXNzPXN5c3RlbWQ6IC0tbm9mb3JrIC0tbm9waWRmaWxlIC0tc3lzdGVtZC1hY3RpdmF0aW9uCitFeGVjUmVsb2FkPUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtc2VuZCAtLXByaW50LXJlcGx5IC0tc2Vzc2lvbiAtLXR5cGU9bWV0aG9kX2NhbGwgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsb2FkQ29uZmlnCisKK1tJbnN0YWxsXQorQWxzbz1kYnVzLnNvY2tldApkaWZmIC0tZ2l0IGEvYnVzL3N5c3RlbWQtdXNlci9kYnVzLnNvY2tldC5pbiBiL2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zb2NrZXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5M2QxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zb2NrZXQuaW4KQEAgLTAsMCArMSwxMCBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1ELUJ1cyBVc2VyIE1lc3NhZ2UgQnVzIFNvY2tldAorCitbU29ja2V0XQorTGlzdGVuU3RyZWFtPSV0L2J1cworRXhlY1N0YXJ0UG9zdD0tQFNZU1RFTUNUTEAgLS11c2VyIHNldC1lbnZpcm9ubWVudCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9dW5peDpwYXRoPSV0L2J1cworCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXNvY2tldHMudGFyZ2V0CitBbHNvPWRidXMuc2VydmljZQpkaWZmIC0tZ2l0IGEvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jIGIvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvdGVzdC1sYXVuY2gtaGVscGVyLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdGVzdC1tYWluLmMgIG1haW4oKSBmb3IgdGhlIE9PTSBjaGVjayBvZiB0aGUgbGF1bmNoIGhlbHBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1taXNjLmg+CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworICAKKyAgcHJpbnRmICgiJXM6IGNoZWNraW5nIGZvciBtZW1sZWFrc1xuIiwgbmFtZSk7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcG9zdF9ob29rIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGVja19tZW1sZWFrcyAobmFtZSk7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworCisjaWZkZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKworLyogcmV0dXJucyB0cnVlIGlmIGdvb2QgdGhpbmdzIGhhcHBlbiwgb3IgaWYgd2UgZ2V0IE9PTSAqLworc3RhdGljIGRidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9oZWxwZXJfb29tX3Rlc3QgKHZvaWQgKmRhdGEpCit7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHNlcnZpY2UgPSAoY29uc3QgY2hhciAqKSBkYXRhOworICByZXR2YWwgPSBUUlVFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgaWYgKCFydW5fbGF1bmNoX2hlbHBlciAoc2VydmljZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgLyogd2UgZmFpbGVkLCBidXQgYSBPT00gaXMgZ29vZCAqLworICAgICAgaWYgKCFkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGQUlMRUQgU0VMRiBURVNUOiBFcnJvcjogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICB9CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogd2Ugc3VjY2VlZGVkLCB5YXkhICovCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZlcnJvcik7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgY29uc3QgY2hhciAqZGlyOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworCisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItLXRhcCIpICE9IDApCisgICAgZGlyID0gYXJndlsxXTsKKyAgZWxzZQorICAgIGRpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIik7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3Qgc3BlY2lmeSB0ZXN0IGRhdGEgZGlyZWN0b3J5IGFzIGFyZ3ZbMV0gb3IgaW4gREJVU19URVNUX0RBVEEgZW52IHZhcmlhYmxlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwcmludGYgKCIlczogUnVubmluZyBsYXVuY2ggaGVscGVyIE9PTSBjaGVja3NcbiIsIGFyZ3ZbMF0pOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgcmV0dXJuIDE7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBkaXIpKQorICAgIHJldHVybiAxOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb25maWdfZmlsZSwgIi92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYiKSkKKyAgICByZXR1cm4gMTsKKworICAvKiB1c2UgYSBjb25maWcgZmlsZSB0aGF0IHdpbGwgYWN0dWFsbHkgd29yay4uLiAqLworICBkYnVzX3NldGVudiAoIlRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29uZmlnX2ZpbGUpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgiZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19hY3RpdmF0aW9uX2hlbHBlcl9vb21fdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIikpCisgICAgZGllICgiT09NIGZhaWxlZCIpOworCisgIHRlc3RfcG9zdF9ob29rIChhcmd2WzBdKTsKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgcmV0dXJuIDA7CisjZWxzZSAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisgIHByaW50ZiAoIk5vdCBjb21waWxlZCB3aXRoIHRlc3Qgc3VwcG9ydFxuIik7CisgIAorICByZXR1cm4gMDsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9idXMvdGVzdC1tYWluLmMgYi9idXMvdGVzdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhNjM5NQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90ZXN0LW1haW4uYwpAQCAtMCwwICsxLDE5OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LW1haW4uYyAgbWFpbigpIGZvciBtYWtlIGNoZWNrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgInNlbGludXguaCIKKworI2lmZGVmIERCVVNfVU5JWAorIyBpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmYWlsdXJlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVbml0IHRlc3QgZmFpbGVkOiAlc1xuIiwgZmFpbHVyZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbWVtbGVha3MgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGRidXNfc2h1dGRvd24gKCk7CisgIAorICBwcmludGYgKCIlczogY2hlY2tpbmcgZm9yIG1lbWxlYWtzXG4iLCBuYW1lKTsKKyAgaWYgKF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVkIGRidXNfbWFsbG9jIGJsb2NrcyB3ZXJlIG5vdCBmcmVlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpKTsKKyAgICAgIGRpZSAoIm1lbWxlYWtzIik7CisgICAgfQorfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKK3N0YXRpYyBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHMgPSBOVUxMOworCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKKyAgCisgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0VMSU5VWCIpCisgICAgICAmJiAoIWJ1c19zZWxpbnV4X3ByZV9pbml0ICgpCisJICB8fCAhYnVzX3NlbGludXhfZnVsbF9pbml0ICgpKSkKKyAgICBkaWUgKCJjb3VsZCBub3QgaW5pdCBzZWxpbnV4IHN1cHBvcnQiKTsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7Cit9CisKK3N0YXRpYyBjaGFyICpwcm9nbmFtZSA9ICIiOworCitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0VMSU5VWCIpKQorICAgIGJ1c19zZWxpbnV4X3NodXRkb3duICgpOworICBjaGVja19tZW1sZWFrcyAocHJvZ25hbWUpOworCisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKyAgaW5pdGlhbF9mZHMgPSBOVUxMOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBjb25zdCBjaGFyICpkaXI7CisgIGNvbnN0IGNoYXIgKm9ubHk7CisgIERCdXNTdHJpbmcgdGVzdF9kYXRhX2RpcjsKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcCAoYXJndlsxXSwgIi0tdGFwIikgIT0gMCkKKyAgICBkaXIgPSBhcmd2WzFdOworICBlbHNlCisgICAgZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKTsKKworICBpZiAoYXJnYyA+IDIpCisgICAgb25seSA9IGFyZ3ZbMl07CisgIGVsc2UKKyAgICBvbmx5ID0gTlVMTDsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IHRlc3QgZGF0YSBkaXJlY3RvcnkgYXMgYXJndlsxXSBvciBpbiBEQlVTX1RFU1RfREFUQSBlbnYgdmFyaWFibGVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kYXRhX2RpciwgZGlyKTsKKworI2lmZGVmIERCVVNfVU5JWAorICAvKiBjbG9zZSBhbnkgaW5oZXJpdGVkIGZkcyBzbyBkYnVzLXNwYXduJ3MgY2hlY2sgZm9yIGNsb3NlLW9uLWV4ZWMgd29ya3MgKi8KKyAgX2RidXNfY2xvc2VfYWxsICgpOworI2VuZGlmCisKKyAgaWYgKCFfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKCkpCisgICAgZGllICgiaW5pdGlhbGl6aW5nIGRlYnVnIHRocmVhZHMiKTsKKworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgImV4cGlyZS1saXN0IikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgZXhwaXJlIGxpc3QgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19leHBpcmVfbGlzdF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoImV4cGlyZSBsaXN0Iik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJjb25maWctcGFyc2VyIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgY29uZmlnIGZpbGUgcGFyc2VyIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInBhcnNlciIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAic2lnbmFscyIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNpZ25hbHMgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19zaWduYWxzX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgic2lnbmFscyIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiZGlzcGF0Y2gtc2hhMSIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIFNIQTEgY29ubmVjdGlvbiB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJzaGExIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJkaXNwYXRjaCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIG1lc3NhZ2UgZGlzcGF0Y2ggdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpIAorICAgICAgICBkaWUgKCJkaXNwYXRjaCIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiYWN0aXZhdGlvbi1zZXJ2aWNlLXJlbG9hZCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNlcnZpY2UgZmlsZXMgcmVsb2FkaW5nIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInNlcnZpY2UgcmVsb2FkIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgInVuaXgtZmRzLXBhc3NpbmciKSA9PSAwKQorICAgIHsKKyAgICAgIHRlc3RfcHJlX2hvb2sgKCk7CisgICAgICBwcmludGYgKCIlczogUnVubmluZyB1bml4IGZkIHBhc3NpbmcgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c191bml4X2Zkc19wYXNzaW5nX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgidW5peCBmZCBwYXNzaW5nIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisjZW5kaWYKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgCisgIHJldHVybiAwOworI2Vsc2UgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworICBwcmludGYgKCJOb3QgY29tcGlsZWQgd2l0aCB0ZXN0IHN1cHBvcnRcbiIpOworICAKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2J1cy90ZXN0LXN5c3RlbS5jIGIvYnVzL3Rlc3Qtc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ODQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90ZXN0LXN5c3RlbS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIHRlc3QtbWFpbi5jICBtYWluKCkgZm9yIG1ha2UgY2hlY2sKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmYWlsdXJlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVbml0IHRlc3QgZmFpbGVkOiAlc1xuIiwgZmFpbHVyZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbWVtbGVha3MgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgcHJpbnRmICgiJXM6IGNoZWNraW5nIGZvciBtZW1sZWFrc1xuIiwgbmFtZSk7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKK30KKworc3RhdGljIGNoYXIgKnByb2duYW1lID0gIiI7CitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGNoZWNrX21lbWxlYWtzIChwcm9nbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGNvbnN0IGNoYXIgKmRpcjsKKyAgREJ1c1N0cmluZyB0ZXN0X2RhdGFfZGlyOworCisgIHByb2duYW1lID0gYXJndlswXTsKKworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wIChhcmd2WzFdLCAiLS10YXAiKSAhPSAwKQorICAgIGRpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICBkaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdXN0IHNwZWNpZnkgdGVzdCBkYXRhIGRpcmVjdG9yeSBhcyBhcmd2WzFdIG9yIGluIERCVVNfVEVTVF9EQVRBIGVudiB2YXJpYWJsZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0ZXN0X2RhdGFfZGlyLCBkaXIpOworCisgIGlmICghX2RidXNfdGhyZWFkc19pbml0X2RlYnVnICgpKQorICAgIGRpZSAoImluaXRpYWxpemluZyBkZWJ1ZyB0aHJlYWRzIik7CisKKyAgdGVzdF9wcmVfaG9vayAoKTsKKyAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgY29uZmlnIGZpbGUgcGFyc2VyICh0cml2aWFsKSB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl90cml2aWFsX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICBkaWUgKCJwYXJzZXIiKTsKKyAgdGVzdF9wb3N0X2hvb2sgKCk7CisKKyAgcHJpbnRmICgiJXM6IFN1Y2Nlc3NcbiIsIGFyZ3ZbMF0pOworCisgIHJldHVybiAwOworI2Vsc2UgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworICBwcmludGYgKCJOb3QgY29tcGlsZWQgd2l0aCB0ZXN0IHN1cHBvcnRcbiIpOworCisgIHJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9idXMvdGVzdC5jIGIvYnVzL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWVmNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3Rlc3QuYwpAQCAtMCwwICsxLDMxNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LmMgIHVuaXQgdGVzdCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisvKiBUaGUgImRlYnVnIGNsaWVudCIgd2F0Y2gvdGltZW91dCBoYW5kbGVycyBkb24ndCBkaXNwYXRjaCBtZXNzYWdlcywKKyAqIGFzIHdlIG1hbnVhbGx5IHB1bGwgdGhlbSBpbiBvcmRlciB0byB2ZXJpZnkgdGhlbS4gVGhpcyBpcyB3aHkgdGhleQorICogYXJlIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIGhhbmRsZXJzIGluIGNvbm5lY3Rpb24uYworICovCitzdGF0aWMgREJ1c0xpc3QgKmNsaWVudHMgPSBOVUxMOworc3RhdGljIERCdXNMb29wICpjbGllbnRfbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2NsaWVudF93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY2xpZW50X2xvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jbGllbnRfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoY2xpZW50X2xvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9jbGllbnRfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBfZGJ1c19sb29wX3RvZ2dsZV93YXRjaCAoY2xpZW50X2xvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2xpZW50X3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNsaWVudF9sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jbGllbnRfdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjbGllbnRfbG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorY2xpZW50X2Rpc2Nvbm5lY3RfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmICghZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyBjbGllbnQgJXAgaW4gZGlzY29ubmVjdCBoYW5kbGVyXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKworICBfZGJ1c19saXN0X3JlbW92ZSAoJmNsaWVudHMsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgaWYgKGNsaWVudHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3VucmVmIChjbGllbnRfbG9vcCk7CisgICAgICBjbGllbnRfbG9vcCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2V0dXBfZGVidWdfY2xpZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9kaXNjb25uZWN0X2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChjbGllbnRfbG9vcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNsaWVudF9sb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgICAgICBpZiAoY2xpZW50X2xvb3AgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9jbGllbnRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jbGllbnRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9jbGllbnRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY2xpZW50X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2NsaWVudF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNsaWVudHMsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9kaXNjb25uZWN0X2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZjbGllbnRzLCBjb25uZWN0aW9uKTsKKworICAgICAgaWYgKGNsaWVudHMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGNsaWVudF9sb29wKTsKKyAgICAgICAgICBjbGllbnRfbG9vcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjbGllbnRzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNsaWVudHMsIGxpbmspOworCisgICAgICBpZiAoISgqIGZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgZGF0YSkpCisgICAgICAgIGJyZWFrOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKK2RidXNfYm9vbF90CitidXNfdGVzdF9jbGllbnRfbGlzdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjbGllbnRzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqYyA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNsaWVudHMsIGxpbmspOworCisgICAgICBpZiAoYyA9PSBjb25uZWN0aW9uKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoZGJ1c19ib29sX3QgYmxvY2tfb25jZSkKK3sKKyAgaWYgKGNsaWVudF9sb29wID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERpc3BhdGNoaW5nIG9uIFwiY2xpZW50IHNpZGVcIlxuIik7CisKKyAgLyogZGlzcGF0Y2ggYmVmb3JlIHdlIGJsb2NrIHNvIHBlbmRpbmcgZGlzcGF0Y2hlcworICAgKiB3b24ndCBtYWtlIG91ciBibG9jayByZXR1cm4gZWFybHkKKyAgICovCisgIF9kYnVzX2xvb3BfZGlzcGF0Y2ggKGNsaWVudF9sb29wKTsKKworICAvKiBEbyBvbmUgYmxvY2tpbmcgd2FpdCwgc2luY2Ugd2UncmUgZXhwZWN0aW5nIGRhdGEgKi8KKyAgaWYgKGJsb2NrX29uY2UpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIi0tLT4gYmxvY2tpbmcgb24gXCJjbGllbnQgc2lkZVwiXG4iKTsKKyAgICAgIF9kYnVzX2xvb3BfaXRlcmF0ZSAoY2xpZW50X2xvb3AsIFRSVUUpOworICAgIH0KKworICAvKiBUaGVuIG1vcCBldmVyeXRoaW5nIHVwICovCisgIHdoaWxlIChfZGJ1c19sb29wX2l0ZXJhdGUgKGNsaWVudF9sb29wLCBGQUxTRSkpCisgICAgOworCisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERvbmUgZGlzcGF0Y2hpbmcgb24gXCJjbGllbnQgc2lkZVwiXG4iKTsKK30KKwordm9pZAorYnVzX3Rlc3RfcnVuX2J1c19sb29wIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBibG9ja19vbmNlKQoreworICBfZGJ1c192ZXJib3NlICgiLS0tPiBEaXNwYXRjaGluZyBvbiBcInNlcnZlciBzaWRlXCJcbiIpOworCisgIC8qIGRpc3BhdGNoIGJlZm9yZSB3ZSBibG9jayBzbyBwZW5kaW5nIGRpc3BhdGNoZXMKKyAgICogd29uJ3QgbWFrZSBvdXIgYmxvY2sgcmV0dXJuIGVhcmx5CisgICAqLworICBfZGJ1c19sb29wX2Rpc3BhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCkpOworCisgIC8qIERvIG9uZSBibG9ja2luZyB3YWl0LCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZGF0YSAqLworICBpZiAoYmxvY2tfb25jZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiLS0tPiBibG9ja2luZyBvbiBcInNlcnZlciBzaWRlXCJcbiIpOworICAgICAgX2RidXNfbG9vcF9pdGVyYXRlIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCksIFRSVUUpOworICAgIH0KKworICAvKiBUaGVuIG1vcCBldmVyeXRoaW5nIHVwICovCisgIHdoaWxlIChfZGJ1c19sb29wX2l0ZXJhdGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgRkFMU0UpKQorICAgIDsKKworICBfZGJ1c192ZXJib3NlICgiLS0tPiBEb25lIGRpc3BhdGNoaW5nIG9uIFwic2VydmVyIHNpZGVcIlxuIik7Cit9CisKK3ZvaWQKK2J1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICB3aGlsZSAoX2RidXNfbG9vcF9pdGVyYXRlIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCksIEZBTFNFKSB8fAorICAgICAgICAgKGNsaWVudF9sb29wID09IE5VTEwgfHwgX2RidXNfbG9vcF9pdGVyYXRlIChjbGllbnRfbG9vcCwgRkFMU0UpKSkKKyAgICA7Cit9CisKK0J1c0NvbnRleHQqCitidXNfY29udGV4dF9uZXdfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlbmFtZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBEQnVzU3RyaW5nIHJlbGF0aXZlOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vIG1lbW9yeVxuIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZ19maWxlLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcmVsYXRpdmUsIGZpbGVuYW1lKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZjb25maWdfZmlsZSwgJnJlbGF0aXZlKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29udGV4dCA9IGJ1c19jb250ZXh0X25ldyAoJmNvbmZpZ19maWxlLCBCVVNfQ09OVEVYVF9GTEFHX05PTkUsIE5VTEwsIE5VTEwsIE5VTEwsICZlcnJvcik7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBjcmVhdGUgZGVidWcgYnVzIGNvbnRleHQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzL3Rlc3QuaCBiL2J1cy90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiNzRlOAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90ZXN0LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LmggIHVuaXQgdGVzdCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1RFU1RfSAorI2RlZmluZSBCVVNfVEVTVF9ICisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX3Rlc3QgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfZGlzcGF0Y2hfc2hhMV90ZXN0ICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX3Rlc3QgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfc2lnbmFsc190ZXN0ICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19leHBpcmVfbGlzdF90ZXN0ICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2FjdGl2YXRpb25fc2VydmljZV9yZWxvYWRfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfc2V0dXBfZGVidWdfY2xpZW50ICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAgKEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBidXNfdGVzdF9jbGllbnRfbGlzdGVkICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBibG9jayk7Cit2b2lkICAgICAgICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBibG9jayk7Cit2b2lkICAgICAgICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAgIChCdXNDb250ZXh0ICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK0J1c0NvbnRleHQqIGJ1c19jb250ZXh0X25ld190ZXN0ICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworZGJ1c19ib29sX3QgYnVzX3VuaXhfZmRzX3Bhc3NpbmdfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAvKiBCVVNfVEVTVF9IICovCmRpZmYgLS1naXQgYS9idXMvdXRpbHMuYyBiL2J1cy91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjQ4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvdXRpbHMuYwpAQCAtMCwwICsxLDQ4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHV0aWxzLmMgIEdlbmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKworY29uc3QgY2hhciBidXNfbm9fbWVtb3J5X21lc3NhZ2VbXSA9ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG1lc3NhZ2UgYnVzIjsKKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfYWxsX21lc3NhZ2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgd2hpbGUgKGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlIChjb25uZWN0aW9uKSkKKyAgICA7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIHdoaWxlICgoc3RhdHVzID0gZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIChjb25uZWN0aW9uKSkgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgIAorICByZXR1cm4gc3RhdHVzID09IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TOworfQpkaWZmIC0tZ2l0IGEvYnVzL3V0aWxzLmggYi9idXMvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMzODk1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3V0aWxzLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB1dGlscy5oICBHZW5lcmFsIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1VUSUxTX0gKKyNkZWZpbmUgQlVTX1VUSUxTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCitleHRlcm4gY29uc3QgY2hhciBidXNfbm9fbWVtb3J5X21lc3NhZ2VbXTsKKyNkZWZpbmUgQlVTX1NFVF9PT00oZXJyb3IpIGRidXNfc2V0X2Vycm9yX2NvbnN0ICgoZXJyb3IpLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgYnVzX25vX21lbW9yeV9tZXNzYWdlKQorCit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9hbGxfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogQlVTX1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2NsZWFudXAtbWFuLXBhZ2VzLnNoIGIvY2xlYW51cC1tYW4tcGFnZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlOThhNgotLS0gL2Rldi9udWxsCisrKyBiL2NsZWFudXAtbWFuLXBhZ2VzLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhIC9iaW4vc2gKKworIyMgVGhpcyBzY3JpcHQgY2xlYW5zIHVwIHByaXZhdGUvaW50ZXJuYWwgQVBJIGZyb20gdGhlIG1hbiBwYWdlcworIyMgZ2VuZXJhdGVkIGJ5IERveHlnZW4uICBUaGlzIGJyaW5ncyB0aGUgbWFuIHBhZ2VzIGRvd24gZnJvbSA3IG1lZ3MKKyMjIHRvIDIgbWVncyBhbmQgYXZvaWRzIG5hbWVzcGFjZS1wb2xsdXRpbmcgbWFuIHBhZ2VzLiAgSXQncyBwcm9iYWJseQorIyMgcHJldHR5IHNwZWNpZmljIHRvIEdOVSB1dGlsaXRpZXMuIFBhdGNoZXMgZ2xhZGx5IGFjY2VwdGVkIHRvIG1ha2UKKyMjIGl0IHdvcmsgd2l0aG91dCB0aGVtLgorCisjIyBZb3Ugd291bGQgcnVuIHRoaXMgYWZ0ZXIgYnVpbGRpbmcgZGJ1cyBhbmQgYWZ0ZXIgcnVubmluZyAiZG94eWdlbgorIyMgRG94eWZpbGUiCisKK2RpZSgpIHsKKyAgICBlY2hvICIkKiIgMT4mMgorICAgIGV4aXQgMQorfQorCitNQU5ESVI9JDEKK2lmIHRlc3QgeCIkTUFORElSIiA9IHggOyB0aGVuCisgICAgTUFORElSPWRvYy9hcGkvbWFuL21hbjNkYnVzCitmaQorCitjZCAiJE1BTkRJUiIgfHwgZGllICJDb3VsZCBub3QgY2QgdG8gJE1BTkRJUiIKKwordGVzdCAtZCBrZWVwIHx8IG1rZGlyIGtlZXAgfHwgZGllICJDb3VsZCBub3QgY3JlYXRlICRNQU5ESVIva2VlcCBkaXJlY3RvcnkiCit0ZXN0IC1kIG51a2UgfHwgbWtkaXIgbnVrZSB8fCBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJE1BTkRJUi9udWtlIGRpcmVjdG9yeSIKKworIyMgYmxhY2tsaXN0CisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJfKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIG51a2UpIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIHVuZGVyc2NvcmUtcHJlZml4ZWQgaXRlbXMiCisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJEQnVzKkludGVybmFsKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIG51a2UpIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIGludGVybmFsLWNvbnRhaW5pbmcgaXRlbXMiCisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJkYnVzXypfaW50ZXJuYWxfKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIG51a2UpIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIGludGVybmFsLWNvbnRhaW5pbmcgaXRlbXMiCisKKyMjIHRoaXMgaXMga2luZCBvZiB1bm1haW50YWluYWJsZSwgYnV0IEkgZ3Vlc3MgaXQncyBubyBodWdlIGRpc2FzdGVyIGlmIHdlIG1pc3Mgc29tZXRoaW5nLgorIyMgdGhpcyBsaXN0IHNob3VsZCBvbmx5IGNvbnRhaW4gbWFuIHBhZ2VzIHdpdGggPjEgbGluZSwgaS5lLiB3aXRoIHJlYWwgY29udGVudDsgdGhlIAorIyMgb25lLWxpbmUgY3Jvc3MtcmVmZXJlbmNlcyBnZXQgY2xlYW5lZCB1cCBuZXh0LgorZm9yIEkgaW4gREJ1c0NvdW50ZXIuKiBEQnVzQ3JlZGVudGlhbHMuKiBEQnVzRGF0YVNsb3QuKiBEQnVzRGF0YVNsb3RBbGxvY2F0b3IuKiBEQnVzRGF0YVNsb3RMaXN0LiogXAorICAgIERCdXNEaXJJdGVyLiogREJ1c0Zha2VNdXRleC4qIERCdXNGcmVlZEVsZW1lbnQuKiBEQnVzR3JvdXBJbmZvLiogREJ1c0dVSUQuKiBEQnVzSGFzaEVudHJ5LiogXAorICAgIERCdXNIYXNoSXRlci4qIERCdXNIYXNoVGFibGUuKiBEQnVzSGVhZGVyLiogREJ1c0hlYWRlckZpZWxkLiogREJ1c0tleS4qIERCdXNLZXlyaW5nLiogREJ1c0xpc3QuKiBcCisgICAgREJ1c01hcnNoYWwuKiBEQnVzTUQ1KiBEQnVzTWVtQmxvY2suKiBEQnVzTWVtUG9vbC4qIERCdXNNZXNzYWdlR2VuZXJhdG9yLiogREJ1c01lc3NhZ2VMb2FkZXIuKiBcCisgICAgREJ1c01lc3NhZ2VSZWFsSXRlci4qIERCdXNPYmplY3RTdWJ0cmVlLiogREJ1c09iamVjdFRyZWUuKiBEQnVzUG9sbEZELiogREJ1c1JlYWwqIFwKKyAgICBEQnVzUmVzb3VyY2VzLiogREJ1c1NlcnZlckRlYnVnUGlwZS4qIERCdXNTZXJ2ZXJTb2NrZXQuKiBEQnVzU2VydmVyVW5peC4qIFwKKyAgICBEQnVzU2VydmVyVlRhYmxlLiogREJ1c1NIQS4qIERCdXNTSEFDb250ZXh0LiogREJ1c1NpZ25hdHVyZVJlYWxJdGVyLiogREJ1c1N0YXQuKiBEQnVzU3RyaW5nLiogXAorICAgIERCdXNTeXNkZXBzLiogREJ1c1N5c2RlcHNVbml4LiogREJ1c1RpbWVvdXRMaXN0LiogREJ1c1RyYW5zcG9ydCogREJ1c1R5cGVSZWFkZXIqIERCdXNUeXBlV3JpdGVyKiBcCisgICAgREJ1c1VzZXJJbmZvLiogREJ1c1dhdGNoTGlzdC4qIDsgZG8gCisgICAgaWYgdGVzdCAtZiAiJEkiIDsgdGhlbgorICAgICAgICAvYmluL212ICIkSSIgbnVrZSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlICRJIHRvICRNQU5ESVIvbnVrZSIKKyAgICBmaQorZG9uZQorCisjIyBtYW55IGZpbGVzIGp1c3QgY29udGFpbiAiLnNvIG1hbjNkYnVzL0RCdXNTdHJpbmdJbnRlcm5hbHMuM2RidXMiIG9yIHRoZSBsaWtlLCAKKyMjIGlmIHRoZXNlIHBvaW50IHRvIHNvbWV0aGluZyB3ZSBudWtlZCwgd2Ugd2FudCB0byBhbHNvIG51a2UgdGhlIHBvaW50ZXIuCitmb3IgSSBpbiAqIDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkSSIgOyB0aGVuCisgICAgICAgIExJTkVTPWB3YyAtbCAiJEkiIHwgY3V0IC1kICcgJyAtZiAxYAorICAgICAgICBpZiB0ZXN0IHgiJExJTkVTIiA9IHgxIDsgdGhlbgorICAgICAgICAgICAgUkVGX1RPPWBjYXQgIiRJIiB8IHNlZCAtZSAncy9cLnNvIG1hbjNkYnVzXC8vL2cnYAorICAgICAgICAgICAgIyMgZWNobyAiJEkgcG9pbnRzIHRvICRSRUZfVE8iCisgICAgICAgICAgICBpZiAhIHRlc3QgLWYgIiRSRUZfVE8iIDsgdGhlbgorICAgICAgICAgICAgICAgIC9iaW4vbXYgIiRJIiBudWtlIHx8IGRpZSAiY291bGQgbm90IG1vdmUgJEkgdG8gJE1BTkRJUi9udWtlIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorZG9uZQorCisjIyB3aGl0ZWxpc3QKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgImRidXNfKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIGtlZXApIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIGRidXMtcHJlZml4ZWQgaXRlbXMiCisoZmluZCAuIC1tYXhkZXB0aCAxIC1uYW1lICJEQlVTXyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBrZWVwKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBEQlVTXy1wcmVmaXhlZCBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIkRCdXMqIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMga2VlcCkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgREJ1cy1wcmVmaXhlZCBpdGVtcyIKKworIyMgZXZlcnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgaXJyZWxldmFudCwgdGhpcyBpcyBtb3N0bHkgc3RydWN0IGZpZWxkcworIyMgZnJvbSB0aGUgcHVibGljIGhlYWRlcnMKKyhmaW5kIC4gLW1heGRlcHRoIDEgLXR5cGUgZiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSByZW1haW5pbmcgaXRlbXMiCisKK05VS0VfQ09VTlQ9YGZpbmQgbnVrZSAtdHlwZSBmIC1uYW1lICIqIiB8IHdjIC1sYAorS0VFUF9DT1VOVD1gZmluZCBrZWVwIC10eXBlIGYgLW5hbWUgIioiIHwgd2MgLWxgCitNSVNTSU5HX0NPVU5UPWBmaW5kIC4gLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAiKiIgfCB3YyAtbGAKKworZWNobyAiJEtFRVBfQ09VTlQgbWFuIHBhZ2VzIGtlcHQgYW5kICROVUtFX0NPVU5UIG1hbiBwYWdlcyB0byByZW1vdmUiCitlY2hvICIkTUlTU0lOR19DT1VOVCBub3QgaGFuZGxlZCIKKworKGZpbmQga2VlcCAtdHlwZSBmIC1uYW1lICIqIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgLikgfHwgZGllICJjb3VsZCBub3QgbW92ZSBrZXB0IGl0ZW1zIGJhY2siCisKK3JtZGlyIGtlZXAgfHwgZGllICJjb3VsZCBub3QgcmVtb3ZlICRNQU5ESVIva2VlcCIKKworZWNobyAiTWFuIHBhZ2VzIHRvIGJlIGluc3RhbGxlZCBhcmUgaW4gJE1BTkRJUiBhbmQgbWFuIHBhZ2VzIHRvIGlnbm9yZSBhcmUgaW4gJE1BTkRJUi9udWtlIgorCitleGl0IDAKZGlmZiAtLWdpdCBhL2NtYWtlL0NNYWtlTGlzdHMudHh0IGIvY21ha2UvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiOWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjQ5IEBACisjIHdoZXJlIHRvIGxvb2sgZmlyc3QgZm9yIGNtYWtlIG1vZHVsZXMsIGJlZm9yZSAke0NNQUtFX1JPT1R9L01vZHVsZXMvIGlzIGNoZWNrZWQKK2xpc3QoQVBQRU5EIENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX1NPVVJDRV9ESVJ9L21vZHVsZXMiKQorCisjIHdlIGRvIG5vdCBuZWVkIHRvIGhhdmUgV0lOMzIgZGVmaW5lZAorc2V0KENNQUtFX0xFR0FDWV9DWUdXSU5fV0lOMzIgMCkKKworcHJvamVjdChkYnVzKQorCisjIHdlIG5lZWQgdG8gYmUgdXAgdG8gZGF0ZQorQ01BS0VfTUlOSU1VTV9SRVFVSVJFRChWRVJTSU9OIDIuNC40IEZBVEFMX0VSUk9SKQoraWYoQ09NTUFORCBjbWFrZV9wb2xpY3kpCisgICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDAzIE5FVykKK2VuZGlmKENPTU1BTkQgY21ha2VfcG9saWN5KQorCitpZihDTUFLRV9NQUpPUl9WRVJTSU9OIEdSRUFURVIgMikKKyAgICBjbWFrZV9wb2xpY3koU0VUIENNUDAwMjYgTkVXKQorICAgIGlmIChDTUFLRV9NQUpPUl9WRVJTSU9OIEdSRUFURVIgNCBPUiBDTUFLRV9NSU5PUl9WRVJTSU9OIEdSRUFURVIgMSkKKyAgICAgICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDUzIE5FVykKKyAgICAgICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDU0IE5FVykKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMgZGV0ZWN0IHZlcnNpb24KK2luY2x1ZGUoTWFjcm9zQXV0b3Rvb2xzKQorYXV0b2luaXQoLi4vY29uZmlndXJlLmFjKQorYXV0b3ZlcnNpb24oZGJ1cykKKworaWYoRVhJU1RTIC4uL2NvbmZpZy5oLmluKQorICAgIGF1dG9oZWFkZXJjaGVja3MoLi4vY29uZmlnLmguaW4gQ29uZmlndXJlQ2hlY2tzLmNtYWtlIGNvbmZpZy5oLmNtYWtlKQorZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkdlbmVyYXRlIGNvbmZpZy5oLmluIHdpdGggYXV0b2dlbi5zaCB0byBlbmFibGUgY21ha2UgaGVhZGVyIGRpZmZlcmVuY2UgY2hlY2suIikKK2VuZGlmKCkKKworIyB1c2VkIGJ5IGZpbGUgdmVyc2lvbiBpbmZvCitzZXQgKERCVVNfUEFUQ0hfVkVSU0lPTiAiMCIpCisKKyMgc2V0IFBBQ0tBR0VfLi4uIHZhcmlhYmxlcworYXV0b3BhY2thZ2UoCisgICAgZGJ1cworICAgICR7REJVU19WRVJTSU9OX1NUUklOR30KKyAgICAiaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnIgorICAgICJodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzIgorKQorCitpbmNsdWRlKE1hY3JvcykKK1RJTUVTVEFNUChEQlVTX0JVSUxEX1RJTUVTVEFNUCkKKworIyMjIyMjIyMjIyMgYmFzaWMgdmFycyAjIyMjIyMjIyMjIyMjIyMKKworCitpZiAoREJVU0RJUikKKwlzZXQoREJVU19JTlNUQUxMX0RJUiAiJHtEQlVTRElSfSIpCitlbmRpZiAoREJVU0RJUikKK2lmICgkRU5We0RCVVNESVJ9KQorCXNldChEQlVTX0lOU1RBTExfRElSICIkRU5We0RCVVNESVJ9IikKK2VuZGlmICgkRU5We0RCVVNESVJ9KQorCitpZiAoREJVU19JTlNUQUxMX0RJUikKKwlzZXQoQ01BS0VfSU5TVEFMTF9QUkVGSVggIiR7REJVU19JTlNUQUxMX0RJUn0iIENBQ0hFIFBBVEggImluc3RhbGwgcHJlZml4IiBGT1JDRSkKK2Vsc2UgKERCVVNfSU5TVEFMTF9ESVIpCisJc2V0KERCVVNfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKK2VuZGlmIChEQlVTX0lOU1RBTExfRElSKQorCisjIGF1dG90b29scyBzdHlsZQoraWYgKE5PVCBEQVRBUk9PVERJUikKKyAgICBzZXQgKERBVEFST09URElSIHNoYXJlKQorZW5kaWYoKQorCitpZiAoTk9UIERBVEFESVIpCisgICAgc2V0IChEQVRBRElSICR7REFUQVJPT1RESVJ9KQorZW5kaWYoKQorCitpZiAoTk9UIERPQ0RJUikKKyAgICBTRVQoRE9DRElSICR7REFUQVJPT1RESVJ9L2RvYy9kYnVzKQorZW5kaWYoKQorCitpZiAoTk9UIERCVVNfREFUQURJUikKKyAgICBTRVQoREJVU19EQVRBRElSICR7REFUQURJUn0pCitlbmRpZigpCisKK3NldChEQlVTX1BSRUZJWCAke0RCVVNfSU5TVEFMTF9ESVJ9KQorCitzZXQocHJlZml4ICAgICAgICAgICAgICAgICAgICR7REJVU19JTlNUQUxMX0RJUn0pCitzZXQoZXhlY19wcmVmaXggICAgICAgICAgICAgICR7cHJlZml4fSkKK3NldChFWFBBTkRFRF9MSUJESVIgICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9saWIpCitzZXQoRVhQQU5ERURfSU5DTFVERURJUiAgICAgICR7REJVU19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK3NldChFWFBBTkRFRF9CSU5ESVIgICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9iaW4pCitzZXQoRVhQQU5ERURfU1lTQ09ORkRJUiAgICAgICR7REJVU19JTlNUQUxMX0RJUn0vZXRjKQorc2V0KEVYUEFOREVEX0xPQ0FMU1RBVEVESVIgICAke0RCVVNfSU5TVEFMTF9ESVJ9L3ZhcikKK3NldChFWFBBTkRFRF9EQVRBRElSICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS8ke0RCVVNfREFUQURJUn0pCitzZXQoREJVU19NQUNISU5FX1VVSURfRklMRSAgICR7REJVU19JTlNUQUxMX0RJUn0vbGliL2RidXMvbWFjaGluZS1pZCkKK3NldChEQlVTX0JJTkRJUiAgICAgICAgICAgICAgJHtFWFBBTkRFRF9CSU5ESVJ9KQorc2V0KERCVVNfREFFTU9ORElSICAgICAgICAgICAke0VYUEFOREVEX0JJTkRJUn0pCitzZXQoREJVU19MT0NBTFNUQVRFRElSICAgICAgICR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0pCisKKyMgT24gV2luZG93cyB0aGlzIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHdlIHB1dCB0aGUgYnVzIHNldHVwLCBpbgorIyAke2RhdGFkaXJ9L2RidXMtMS4gRm9yIHNpbXBsaWNpdHksIHdlIG9ubHkgZG8gdGhpcyBpZgorIyAke3N5c2NvbmZkaXJ9ID0gJHtwcmVmaXh9L2V0YyBhbmQgJHtkYXRhZGlyfSA9ICR7cHJlZml4fS9zaGFyZS4KKyMKKyMgT24gVW5peCwgb3Igb24gV2luZG93cyB3aXRoIHdlaXJkIGluc3RhbGwgbGF5b3V0cywgaXQncyB0aGUgYWJzb2x1dGUgcGF0aC4KK2lmKFdJTjMyIEFORCAke0VYUEFOREVEX1NZU0NPTkZESVJ9IFNUUkVRVUFMICR7cHJlZml4fS9ldGMgQU5EICR7RVhQQU5ERURfREFUQURJUn0gU1RSRVFVQUwgJHtwcmVmaXh9L3NoYXJlKQorc2V0KFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSIC4uLy4uL2V0YykKK3NldChEQVRBRElSX0ZST01fUEtHU1lTQ09ORkRJUiAuLi8uLi9zaGFyZSkKK2Vsc2UoKQorc2V0KFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSICR7RVhQQU5ERURfU1lTQ09ORkRJUn0pCitzZXQoREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVIgJHtFWFBBTkRFRF9EQVRBRElSfSkKK2VuZGlmKCkKKworc2V0KERCVVNfTElCRVhFQ0RJUiAgICAgICAgICAke0VYUEFOREVEX0xJQkRJUn0pCitzZXQoREJVU19EQVRBRElSICAgICAgICAgICAgICR7RVhQQU5ERURfREFUQURJUn0pCisKKyNlbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcnkKK1NFVChCVUlMRF9TSEFSRURfTElCUyBPTikKKworaWYoV0lOMzIpCisgICAgc2V0KElOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1MgIFJVTlRJTUUgREVTVElOQVRJT04gImJpbiIgTElCUkFSWSBERVNUSU5BVElPTiAibGliIiBBUkNISVZFIERFU1RJTkFUSU9OICJsaWIiKQorZWxzZSgpCisgICAgc2V0KElOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1MgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7RVhQQU5ERURfTElCRElSfSIgTElCUkFSWSBERVNUSU5BVElPTiAiJHtFWFBBTkRFRF9MSUJESVJ9IiBBUkNISVZFIERFU1RJTkFUSU9OICIke0VYUEFOREVEX0xJQkRJUn0iKQorZW5kaWYoKQorCitpZiAoQ1lHV0lOKQorICAgc2V0IChXSU4zMikKK2VuZGlmIChDWUdXSU4pCisKKyMgc2VhcmNoIGZvciByZXF1aXJlZCBwYWNrYWdlcworaWYgKFdJTjMyKQorICAgICMgaW5jbHVkZSBsb2NhbCBoZWFkZXIgZmlyc3QgdG8gYXZvaWQgdXNpbmcgb2xkIGluc3RhbGxlZCBoZWFkZXIKKyAgICBzZXQgKENNQUtFX0lOQ0xVREVfUEFUSCAke0NNQUtFX0lOQ0xVREVfUEFUSH0gJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKwlmaW5kX3BhY2thZ2UoTGliSWNvbnYpCisgICAgaW5jbHVkZShXaW4zMk1hY3JvcykKKyAgICBhZGRFeHBsb3JlcldyYXBwZXIoJHtDTUFLRV9QUk9KRUNUX05BTUV9KQorZW5kaWYgKFdJTjMyKQorCitpZihOT1QgV0lOMzIpCisJb3B0aW9uIChEQlVTX0VOQUJMRV9BQlNUUkFDVF9TT0NLRVRTICJlbmFibGUgc3VwcG9ydCBmb3IgYWJzdHJhY3Qgc29ja2V0cyIgT04pCisJc2V0IChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgT04pCisJaW5jbHVkZSAoRmluZFRocmVhZHMpCitlbmRpZihOT1QgV0lOMzIpCisKK29wdGlvbiAoREJVU19ESVNBQkxFX0FTU0VSVCAiRGlzYWJsZSBhc3NlcnRpb24gY2hlY2tpbmciIE9GRikKKworb3B0aW9uIChEQlVTX0VOQUJMRV9TVEFUUyAiZW5hYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljcyIgT0ZGKQorCitpZihXSU4zMikKKyAgICBzZXQoRkRfU0VUU0laRSAiODE5MiIgQ0FDSEUgU1RSSU5HICJUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgaGFuZGxlZCBhdCBvbmNlIikKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEVYUEFUKQorZmluZF9wYWNrYWdlKFgxMSkKK2ZpbmRfcGFja2FnZShHTGliMikKK2ZpbmRfcGFja2FnZShHT2JqZWN0KQoraWYoR0xJQjJfRk9VTkQgQU5EIEdPQkpFQ1RfRk9VTkQpCisgICAgb3B0aW9uIChEQlVTX1dJVEhfR0xJQiAiYnVpbGQgd2l0aCBnbGliIiBPTikKK2VuZGlmKCkKKworIyBhbmFsb2dvdXMgdG8gQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TIGluIGNvbmZpZ3VyZS5hYworYWRkX2RlZmluaXRpb25zKC1EX0dOVV9TT1VSQ0UpCisKKyMgZG8gY29uZmlnIGNoZWNrcworSU5DTFVERShDb25maWd1cmVDaGVja3MuY21ha2UpCisKKyMgQFRPRE86IGhvdyB0byByZW1vdmUgbGFzdCBkaXIgZnJvbSAke0NNQUtFX1NPVVJDRV9ESVJ9ID8KK1NFVChEQlVTX1NPVVJDRV9ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKworIyBtYWtlIHNvbWUgbW9yZSBtYWNyb3MgYXZhaWxhYmxlCitpbmNsdWRlIChNYWNyb0xpYnJhcnkpCisKK2lmKFZDUykKKwlzZXQoREJVU19WRVJCT1NFX0NfUyAxIENBQ0hFIFNUUklORyAidmVyYm9zZSBtb2RlIiBGT1JDRSkKK2VuZGlmKFZDUykKKworaWYoV0lOMzIpCisJaWYoTVNWQykKKwkJIyBjb250cm9sbCBmb2xkZXJzIGluIG1zdmMgcHJvamVjdHMKKwkJaW5jbHVkZShQcm9qZWN0U291cmNlR3JvdXApCisJCWlmKE5PVCBHUk9VUF9DT0RFKQorCQkJI3NldChHUk9VUF9DT0RFIHNwbGl0KSAjY21ha2UgZGVmYXVsdAorCQkJc2V0KEdST1VQX0NPREUgZmxhdCkKKwkJZW5kaWYoTk9UIEdST1VQX0NPREUpCisJCUFERF9ERUZJTklUSU9OUygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCisKKworCQkjIFVzZSB0aGUgaGlnaGVzdCB3YXJuaW5nIGxldmVsCisJCWlmIChXQUxMKQorCQkJc2V0KFdBTEwgMSBDQUNIRSBTVFJJTkcgImFsbCB3YXJuaW5ncyIgIEZPUkNFKQorCQkJc2V0KENNQUtFX0NYWF9XQVJOSU5HX0xFVkVMIDQgQ0FDSEUgU1RSSU5HICJ3YXJuaW5nIGxldmVsIiBGT1JDRSkKKworCQkJaWYoQ01BS0VfQ1hYX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCQkJCVNUUklORyhSRUdFWCBSRVBMQUNFICIvV1swLTRdIiAiL1c0IiBDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisJCQllbHNlKENNQUtFX0NYWF9GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKwkJCQlTRVQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL1c0IikKKwkJCWVuZGlmKENNQUtFX0NYWF9GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKworCQkJaWYoQ01BS0VfQ19GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKwkJCQlTVFJJTkcoUkVHRVggUkVQTEFDRSAiL1dbMC00XSIgIi9XNCIgQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSIpCisJCQllbHNlKENNQUtFX0NfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisJCQkJU0VUKENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gL1c0IikKKwkJCWVuZGlmKENNQUtFX0NfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisJCWVsc2UgKFdBTEwpCisJCQlzZXQoQ01BS0VfQ1hYX1dBUk5JTkdfTEVWRUwgMyBDQUNIRSBTVFJJTkcgIndhcm5pbmcgbGV2ZWwiIEZPUkNFKQorCQllbmRpZiAoV0FMTCkKKworCQlTRVQoTVNWQ19XX0VSUk9SICAgIiAvd2U0MDI4IC93ZTQwMTMgL3dlNDEzMyAvd2U0MDQ3IC93ZTQwMzEgL3dlNDAwMiAvd2U0MDAzIC93ZTQxMTQiKQorCQlTRVQoTVNWQ19XX0RJU0FCTEUgIiAvd2Q0MTI3IC93ZDQwOTAgL3dkNDEwMSAvd2Q0MjQ0IikKKworCQlTRVQoQ01BS0VfQ19GTEFHU19ERUJVRyAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9ICAgL0ZJY29uZmlnLmggJHtNU1ZDX1dfRVJST1J9ICR7TVNWQ19XX0RJU0FCTEV9IikKKwkJU0VUKENNQUtFX0NfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC9GSWNvbmZpZy5oICR7TVNWQ19XX0VSUk9SfSAke01TVkNfV19ESVNBQkxFfSIpCisJZW5kaWYoTVNWQykKK2VuZGlmKFdJTjMyKQorCitpZiAoVU5JWCBBTkQgTk9UIERCVVNfRElTQUJMRV9BU1NFUlQpCisJIyByZXF1aXJlZCBmb3IgYmFja3RyYWNlCisJU0VUKENNQUtFX0NfRkxBR1NfREVCVUcgICAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgIC1XbCwtLWV4cG9ydC1keW5hbWljIikKKwlTRVQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLVdsLC0tZXhwb3J0LWR5bmFtaWMiKQorCWFkZF9kZWZpbml0aW9ucygtRERCVVNfQlVJTFRfUl9EWU5BTUlDKQorZW5kaWYgKFVOSVggQU5EIE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorCitpZihEQlVTX1dJVEhfR0xJQikKKyAgICBhdXRvZGVmaW5lKEdMSUJfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisgICAgYXV0b2RlZmluZShHTElCX1ZFUlNJT05fTUFYX0FMTE9XRUQpCitlbmRpZigpCisKK1NFVChDTUFLRV9DX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NfRkxBR1NfREVCVUd9ICAtRF9ERUJVRyIpCitpZihNU1ZDKQorICAgIFNFVChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICAvdzE0MDE4IikKKyAgICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL3cxNDAxOCIpCitlbHNlKCkKKyAgICBTRVQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAgLVdzaWduLWNvbXBhcmUiKQorICAgIFNFVChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAgLVdzaWduLWNvbXBhcmUiKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdpbmRvd3MgQ0UgKD49IDUuMC4wKQorIworIyBXaW5DRSBzdXBwb3J0IG5vdyByZWxpZXMgb24gdGhlIHByZXNlbmNlIG9mIHBsYXRmb3JtIGZpbGVzLCBmb3VuZCBpbiBjbWFrZS9tb2R1bGVzL3BsYXRmb3JtCisjIENtYWtlIDIuOC4wIGRvZXNuJ3QgaW5jbHVkZSBXaW5DRSBwbGF0Zm9ybSBmaWxlcyBieSBkZWZhdWx0LCBidXQgd29ya2luZyBvbmVzIGNhbiBiZSBmb3VuZAorIyBvbiBDTWFrZSdzIGJ1Z3RyYWNrZXIgOgorIyBodHRwOi8vcHVibGljLmtpdHdhcmUuY29tL0J1Zy92aWV3LnBocD9pZD03OTE5CisjCisjIGZvciBjbWFrZSAyLjguMCBnZXQgdGhlIGZvbGxvd2luZyBwYXRjaCBvbmx5IDoKKyMgaHR0cDovL3B1YmxpYy5raXR3YXJlLmNvbS9CdWcvZmlsZV9kb3dubG9hZC5waHA/ZmlsZV9pZD0yOTQ0JnR5cGU9YnVnCisjCisjIGFmdGVyIGFwcGx5aW5nIHRoZSBwYXRjaCwgeW91IGNhbiBlbmFibGUgdGhlIFdpbkNFIGJ1aWxkIGJ5IHNwZWNpZnlpbmcgOgorIyBjbWFrZSBbLi4uXSAtRENNQUtFX1NZU1RFTV9OQU1FPVdpbkNFIC1EQ01BS0VfU1lTVEVNX1ZFUlNJT049WC5YWAorIyAod2hlcmUgWC5YWCBpcyB5b3VyIGFjdHVhbCBXaW5DRSB2ZXJzaW9uLCBlLmcuIDUuMDIgZm9yIFdpbmRvd3MgTW9iaWxlIDYpCisjCisjIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGhhdmUgYSBwcm9wZXIgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIHByaW9yIHRvIHJ1bm5pbmcKKyMgY21ha2UsIGllLiB0aGUgUEFUSCwgSU5DTFVERSBhbmQgTElCIGVudiB2YXJzIHBvaW50aW5nIHRvIHlvdXIgQ0UgU0RLL3Rvb2xjaGFpbi4KKyMKK2lmKFdJTkNFKQorCitNRVNTQUdFKCJCdWlsZGluZyBmb3IgV2luQ0UgKCR7Q01BS0VfU1lTVEVNX1ZFUlNJT059KSIpCisKK2VuZGlmKFdJTkNFKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK0VOQUJMRV9URVNUSU5HKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEaXNhbGxvdyBpbi1zb3VyY2UgYnVpbGQKKyNtYWNyb19lbnN1cmVfb3V0X29mX3NvdXJjZV9idWlsZCgiZGJ1cyByZXF1aXJlcyBhbiBvdXQgb2Ygc291cmNlIGJ1aWxkLiBQbGVhc2UgY3JlYXRlIGEgc2VwYXJhdGUgYnVpbGQgZGlyZWN0b3J5IGFuZCBydW4gJ2NtYWtlIHBhdGhfdG9fZGJ1cyBbb3B0aW9uc10nIHRoZXJlLiIpCisKKyMgLi4uIGFuZCB3YXJuIGluIGNhc2Ugb2YgYW4gZWFybGllciBpbi1zb3VyY2UgYnVpbGQKKyNzZXQoZ2VuZXJhdGVkRmlsZUluU291cmNlRGlyIEVYSVNUUyAke2RidXNfU09VUkNFX0RJUn0vY29uZmlnLmgpCisjaWYoJHtnZW5lcmF0ZWRGaWxlSW5Tb3VyY2VEaXJ9KQorIyAgIG1lc3NhZ2UoU1RBVFVTICJjb25maWcuaCBleGlzdHMgaW4geW91ciBzb3VyY2UgZGlyZWN0b3J5LiIpCisjZW5kaWYoJHtnZW5lcmF0ZWRGaWxlSW5Tb3VyY2VEaXJ9KQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiAoV0lOMzIgT1IgQ1lHV0lOKQorCXNldCAoTElCUkFSWV9PVVRQVVRfUEFUSCAgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4pCitlbHNlIChXSU4zMiBPUiBDWUdXSU4pCisJc2V0IChMSUJSQVJZX09VVFBVVF9QQVRIICAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK2VuZGlmIChXSU4zMiBPUiBDWUdXSU4pCisKK3NldCAoRVhFQ1VUQUJMRV9PVVRQVVRfUEFUSCAke0NNQUtFX0JJTkFSWV9ESVJ9L2JpbikKKworIyBmb3IgaW5jbHVkaW5nIGNvbmZpZy5oIGFuZCBmb3IgaW5jbHVkZXMgbGlrZSA8ZGlyL2Zvby5oPgoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9TT1VSQ0VfRElSfS8uLiAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7Q01BS0VfSU5DTFVERV9QQVRIfSApCisKKyMgbGlua2VyIHNlYXJjaCBkaXJlY3RvcmllcworbGlua19kaXJlY3Rvcmllcygke0RCVVNfTElCX0RJUn0gJHtMSUJSQVJZX09VVFBVVF9QQVRIfSApCitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0xJQlJBUllfUEFUSH0gICkKKworc2V0KERCVVNfSU5DTFVERVMpCisKK0VOQUJMRV9URVNUSU5HKCkKKworIyMjIyMjIyMjIyMgY29tbWFuZCBsaW5lIG9wdGlvbnMgIyMjIyMjIyMjIyMjIyMjCisjIFRPRE86IHRha2UgY2hlY2sgZnJvbSBjb25maWd1cmUuaW4KKworb3B0aW9uIChEQlVTX0JVSUxEX1RFU1RTICJlbmFibGUgdW5pdCB0ZXN0IGNvZGUiIE9OKQorIAoraWYoREJVU19CVUlMRF9URVNUUykKKyAgICBzZXQgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTIE9OKQorICAgIHNldCAoREJVU19FTkFCTEVfTU9EVUxBUl9URVNUUyBPTikKKyAgICBhZGRfZGVmaW5pdGlvbnMoLUREQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAtRERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMpCitlbmRpZihEQlVTX0JVSUxEX1RFU1RTKQorCitvcHRpb24gKERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcgImVuYWJsZSB3aW4zMiBkZWJ1ZyBwb3J0IGZvciBtZXNzYWdlIG91dHB1dCIgT0ZGKQoraWYoREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLUREQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HKQorZW5kaWYoREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORykKKworaWYoV0lOMzIpCisJIyB3aW4zMiBkYnVzIHNlcnZpY2Ugc3VwcG9ydCAtIHRoaXMgc3VwcG9ydCBpcyBub3QgY29tcGxldGUKKwlvcHRpb24gKERCVVNfU0VSVklDRSAiZW5hYmxlIGRidXMgc2VydmljZSBpbnN0YWxsZXIiIE9GRikKK2VuZGlmKFdJTjMyKQorCitvcHRpb24gKERCVVNfRU5BQkxFX0FOU0kgImVuYWJsZSAtYW5zaSAtcGVkYW50aWMgZ2NjIGZsYWdzIiBPRkYpCitpZihEQlVTX0VOQUJMRV9BTlNJKQorICAgaWYoTk9UIE1TVkMpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtYW5zaSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLXBlZGFudGljKQorICAgZWxzZShOT1QgTVNWQykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1aYSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLVc0KQorICAgZW5kaWYoTk9UIE1TVkMpCitlbmRpZihEQlVTX0VOQUJMRV9BTlNJKQorCitvcHRpb24gKERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAic3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGUiIE9OKQorCitvcHRpb24gKERCVVNfRElTQUJMRV9DSEVDS1MgIkRpc2FibGUgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmciIE9GRikKKworaWYoTk9UIE1TVkMpCisgICAgb3B0aW9uIChEQlVTX0dDT1ZfRU5BQkxFRCAiY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KSIgT0ZGKQorICAgIGlmKERCVVNfR0NPVl9FTkFCTEVEKQorICAgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSkKKyAgICAgICAgICAgICMgRklYTUUhISEhCisgICAgICAgICAgICAjIyByZW1vdmUgb3B0aW1pemF0aW9uCisgICAgIyAgICAgICAgQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAncy8tT1swLTldKi8vZydgCisgICAgZW5kaWYoREJVU19HQ09WX0VOQUJMRUQpCitlbmRpZihOT1QgTVNWQykKKworaWYoIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBTVFJFUVVBTCAiTGludXgiKQorICAgIG9wdGlvbiAoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkgImJ1aWxkIHdpdGggaW5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KSIgT04pCisgICAgaWYoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkpCisgICAgICAgIGlmKE5PVCBIQVZFX1NZU19JTk9USUZZX0gpCisgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJzeXMvaW5vdGlmeS5oIG5vdCBmb3VuZCEiKQorICAgICAgICBlbmRpZihOT1QgSEFWRV9TWVNfSU5PVElGWV9IKQorICAgIGVuZGlmKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZKQorZWxzZWlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgTUFUQ0hFUyAiLipCU0QiKQorICAgIG9wdGlvbiAoREJVU19CVVNfRU5BQkxFX0tRVUVVRSAiYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydCAoRnJlZUJTRCBvbmx5KSIgT04pCisgICAgaWYoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKKyAgICAgICAgaWYoTk9UIEhBVkVfU1lTX0VWRU5UX0gpCisgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJzeXMvZXZlbnQuaCBub3QgZm91bmQhIikKKyAgICAgICAgZW5kaWYoTk9UIEhBVkVfU1lTX0VWRU5UX0gpCisgICAgZW5kaWYoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKK2VuZGlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgU1RSRVFVQUwgIkxpbnV4IikKKworU1RSSU5HKFRPVVBQRVIgJHtDTUFLRV9TWVNURU1fTkFNRX0gc3lzbmFtZSkKK2lmKCIke3N5c25hbWV9IiBNQVRDSEVTICIuKlNPTEFSSVMuKiIpCisgICAgb3B0aW9uIChIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAiZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZSAoc29sYXJpcyBvbmx5KSIgT04pCisgICAgaWYoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUpCisgICAgICAgIHNldCAoREJVU19DT05TT0xFX09XTkVSX0ZJTEUgIi9kZXYvY29uc29sZSIgQ0FDSEUgU1RSSU5HICJEaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGNvbnNvbGUgb3duZXJoaXAiKQorICAgIGVuZGlmKEhBVkVfQ09OU09MRV9PV05FUl9GSUxFKQorZW5kaWYoIiR7c3lzbmFtZX0iIE1BVENIRVMgIi4qU09MQVJJUy4qIikKKworaWYoTk9UIEVYUEFUX0ZPVU5EKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImV4cGF0IG5vdCBmb3VuZCEiKQorZW5kaWYoTk9UIEVYUEFUX0ZPVU5EKQorCitTRVQoWE1MX0xJQiAiRXhwYXQiKQorU0VUKFhNTF9MSUJSQVJZICAgICAke0VYUEFUX0xJQlJBUklFU30pCitTRVQoWE1MX0lOQ0xVREVfRElSICR7RVhQQVRfSU5DTFVERV9ESVJ9KQorCisjIGFsbCBtaXNzaW5nIG9yIGhhcmRjb2RlZCBmb3Igbm93CisKKyMgJ2hpZGRlbicgb25lcworc2V0KGF0b21pY19pbnQgT0ZGKQorc2V0KGF0b21pY19pbnQ0ODYgT0ZGKQoraWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIE5PVCBEQlVTX0VOQUJMRV9BTlNJKQorICAgIEZJTkRfUFJPR1JBTShVTkFNRV9FWEVDVVRBQkxFCisgICAgICAgICAgICAgICAgICAgIE5BTUVTIHVuYW1lCisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC9iaW4gL3Vzci9iaW4gL3Vzci9sb2NhbC9iaW4gYzovUHJvZ3JhbW1lL01TeXMvYmluIGQ6L1Byb2dyYW1tZS9NU3lzL2JpbikKKworICAgIGlmKFVOQU1FX0VYRUNVVEFCTEUpCisgICAgICAgIEVYRUNVVEVfUFJPQ0VTUyhDT01NQU5EICR7VU5BTUVfRVhFQ1VUQUJMRX0gIi1tIgorICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIFVOQU1FX09VVFBVVCkKKworICAgICAgICBpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippWzAxMjNdODYuKiQiKQorICAgICAgICAgICAgc2V0KGF0b21pY19pbnQgT04pCisgICAgICAgIGVsc2UoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaVswMTIzXTg2LiokIikKKyAgICAgICAgICAgIGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmk/ODYuKiQiKQorICAgICAgICAgICAgICAgIHNldChhdG9taWNfaW50IE9OKQorICAgICAgICAgICAgICAgIHNldChhdG9taWNfaW50XzQ4NiBPTikKKyAgICAgICAgICAgIGVuZGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmk/ODYuKiQiKQorICAgICAgICBlbmRpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippWzAxMjNdODYuKiQiKQorICAgIGVuZGlmKFVOQU1FX0VYRUNVVEFCTEUpCitlbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgTk9UIERCVVNfRU5BQkxFX0FOU0kpCisKK3NldCAoREJVU19IQVZFX0FUT01JQ19JTlQgJHthdG9taWNfaW50fSBDQUNIRSBTVFJJTkcgIlNvbWUgYXRvbWljIGludGVnZXIgaW1wbGVtZW50YXRpb24gcHJlc2VudCIpCitzZXQgKERCVVNfVVNFX0FUT01JQ19JTlRfNDg2ICR7YXRvbWljX2ludF80ODZ9IENBQ0hFIFNUUklORyAiVXNlIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIGZvciA0ODYiKQorCitpZihYMTFfRk9VTkQpCisgIG9wdGlvbiAoREJVU19CVUlMRF9YMTEgIkJ1aWxkIHdpdGggWDExIGF1dG9sYXVuY2ggc3VwcG9ydCAiIE9OKQorZW5kaWYoWDExX0ZPVU5EKQorCisjIHRlc3QgYmluYXJ5IG5hbWVzCitpZiAoV0lOMzIpCisgICAgIyBmb2xsb3cgQXV0b21ha2UncyBuYW1pbmcgY29udmVudGlvbiBzbyB3ZSBjYW4gc2hhcmUgLmluIGZpbGVzCisgICAgc2V0IChFWEVFWFQgJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0pCitlbmRpZihXSU4zMikKKworaWYgKE1TVkNfSURFKQorICAgIGlmKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBEZWJ1ZykKKwkJc2V0KElERV9CSU4gL0RlYnVnICkKKwkJbWVzc2FnZShTVEFUVVMpCisJCW1lc3NhZ2UoU1RBVFVTICJWaXN1YWwgU3R1ZGlvOiB0ZXN0IHByb2dyYW1zIHdpbGwgb25seSB3b3JrIHdpdGggJ0RlYnVnJyBjb25maWd1cmF0aW9uISIpCisJCW1lc3NhZ2UoU1RBVFVTICJUbyBydW4gdGVzdHMgd2l0aCAnUmVsZWFzZScgY29uZmlndXJhdGlvbiB1c2UgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UiKQorCQltZXNzYWdlKFNUQVRVUyAiQWRkICcuLlxcLi5cXHRlc3RcXGRhdGEnIHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW1zIikKKwkJbWVzc2FnZShTVEFUVVMpCisgICAgZWxzZShDTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgRGVidWcpCisJCXNldChJREVfQklOIC9SZWxlYXNlKQorCQltZXNzYWdlKFNUQVRVUykKKwkJbWVzc2FnZShTVEFUVVMgIlZpc3VhbCBTdHVkaW86IHRlc3QgcHJvZ3JhbXMgd2lsbCBvbmx5IHdvcmsgd2l0aCAnUmVsZWFzZScgY29uZmlndXJhdGlvbiEiKQorCQltZXNzYWdlKFNUQVRVUyAiVG8gcnVuIHRlc3RzIHdpdGggJ0RlYnVnJyBjb25maWd1cmF0aW9uIHVzZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWciKQorCQltZXNzYWdlKFNUQVRVUyAiQWRkICcuLlxcLi5cXHRlc3RcXGRhdGEnIHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW1zIikKKwkJbWVzc2FnZShTVEFUVVMpCisgICAgZW5kaWYoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTIERlYnVnKQorCXNldCAoVEVTVF9QQVRIX0ZPUkNFIEZPUkNFKQorCUZJTEUoUkVNT1ZFICR7Q01BS0VfQklOQVJZX0RJUn0vZGF0YS9kYnVzLTEvc2VydmljZXMpCitlbmRpZiAoTVNWQ19JREUpCisKKyMjIyMgRmluZCBzb2NrZXQgZGlyZWN0b3JpZXMKKyBpZiAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKyAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RNUERJUn0pCisgZWxzZSAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKyAgICAgaWYgKE5PVCAkRU5We1RFTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RFTVB9KQorICAgICBlbHNlIChOT1QgJEVOVntURU1QfSBTVFJFUVVBTCAiIikKKyAgICAgICAgIGlmIChOT1QgJEVOVntUTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgICAgIHNldCAoREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgJEVOVntUTVB9KQorICAgICAgICAgZWxzZSAoTk9UICRFTlZ7VE1QfSBTVFJFUVVBTCAiIikKKyAgICAgICAgIGlmIChXSU4zMikKKyAgICAgICAgICAgICAjU2hvdWxkIG5ldmVyIGhhcHBlbiwgYm90aCBUTVAgYW5kIFRFTVAgc2VlbSBhbHdheXMgc2V0IG9uIFdpbmRvd3MKKyAgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBub3QgZGV0ZXJtaW5lIGEgdXNhYmxlIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQorICAgICAgICAgZWxzZShXSU4zMikKKyAgICAgICAgICAgIHNldCAoREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgL3RtcCkKKyAgICAgICAgIGVuZGlmKFdJTjMyKQorICAgICAgICAgZW5kaWYgKE5PVCAkRU5We1RNUH0gU1RSRVFVQUwgIiIpCisgICAgIGVuZGlmIChOT1QgJEVOVntURU1QfSBTVFJFUVVBTCAiIikKKyBlbmRpZiAoTk9UICRFTlZ7VE1QRElSfSBTVFJFUVVBTCAiIikKKworICMgTm90IHVzZWQgb24gV2luZG93cywgd2hlcmUgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cworc2V0IChEQlVTX1NZU1RFTV9QSURfRklMRSAke0RCVVNfTE9DQUxTVEFURURJUn0vcnVuL2RidXMvcGlkKQorCitpZiAoV0lOMzIpCisJc2V0IChEQlVTX0NPTlNPTEVfQVVUSF9ESVIgIiIpCitlbHNlIChXSU4zMikKKwlzZXQgKERCVVNfQ09OU09MRV9BVVRIX0RJUiAiL3Zhci9ydW4vY29uc29sZS8iKQorZW5kaWYgKFdJTjMyKQorCisjIFRoaXMgd29uJ3Qgd29yayBvbiBXaW5kb3dzLiBJdCdzIG5vdCBtZWFudCB0byAtIHRoZSBzeXN0ZW0gYnVzIGlzCisjIG1lYW5pbmdsZXNzIG9uIFdpbmRvd3MgYW55d2F5LgorIworIyBUaGlzIGhhcyB0byBiZSBzdWl0YWJsZSBmb3IgaGFyZC1jb2RpbmcgaW4gY2xpZW50IGxpYnJhcmllcyBhcyB3ZWxsIGFzCisjIGluIHRoZSBkYnVzLWRhZW1vbidzIGNvbmZpZ3VyYXRpb24sIHNvIGl0IGhhcyB0byBiZSB2YWxpZCB0byBsaXN0ZW4gb24KKyMgYW5kIGFsc28gdG8gY29ubmVjdCB0by4gSWYgdGhpcyBldmVyIGNoYW5nZXMsIGl0J2xsIG5lZWQgdG8gYmUgc3BsaXQgaW50bworIyB0d28gdmFyaWFibGVzLCBvbmUgZm9yIHRoZSBsaXN0ZW5pbmcgYWRkcmVzcyBhbmQgb25lIGZvciB0aGUgY29ubmVjdGluZworIyBhZGRyZXNzLgorc2V0IChEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTICJ1bml4OnBhdGg9JHtEQlVTX0xPQ0FMU1RBVEVESVJ9L3J1bi9kYnVzL3N5c3RlbV9idXNfc29ja2V0IiBDQUNIRSBTVFJJTkcgInN5c3RlbSBidXMgZGVmYXVsdCBhZGRyZXNzIikKKworaWYgKFdJTjMyKQorICBzZXQgKERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1MgImF1dG9sYXVuY2g6IiBDQUNIRSBTVFJJTkcgInNlc3Npb24gYnVzIGRlZmF1bHQgbGlzdGVuaW5nIGFkZHJlc3MiKQorICBzZXQgKERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTICJhdXRvbGF1bmNoOiIgQ0FDSEUgU1RSSU5HICJzZXNzaW9uIGJ1cyBmYWxsYmFjayBhZGRyZXNzIGZvciBjbGllbnRzIikKKworICBzZXQgKERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICJzaGFyZS9kYnVzLTEvc3lzdGVtLmNvbmYiKQorICBzZXQgKERCVVNfU0VTU0lPTl9DT05GSUdfRklMRSAic2hhcmUvZGJ1cy0xL3Nlc3Npb24uY29uZiIpCisgICMgYnVzLXRlc3QgZXhwZWN0cyBhIG5vbiBlbXB0eSBzdHJpbmcKKyAgc2V0IChEQlVTX1VTRVIgIkFkbWluaXN0cmF0b3IiKQorICBzZXQgKERCVVNfVEVTVF9VU0VSICJndWVzdCIpCisgIHNldCAoREJVU19TRVNTSU9OX0NPTkZfTUFZQkVfQVVUSF9FWFRFUk5BTCAiPCEtLTxhdXRoPkVYVEVSTkFMPC9hdXRoPi0tPiIpCitlbHNlIChXSU4zMikKKyAgc2V0IChEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTICJ1bml4OnRtcGRpcj0ke0RCVVNfU0VTU0lPTl9TT0NLRVRfRElSfSIgQ0FDSEUgU1RSSU5HICJzZXNzaW9uIGJ1cyBkZWZhdWx0IGxpc3RlbmluZyBhZGRyZXNzIikKKyAgc2V0IChEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUyAiYXV0b2xhdW5jaDoiIENBQ0hFIFNUUklORyAic2Vzc2lvbiBidXMgZmFsbGJhY2sgYWRkcmVzcyBmb3IgY2xpZW50cyIpCisgIHNldCAoc3lzY29uZmRpciAiIikKKyAgc2V0IChjb25maWdkaXIgJHtzeXNjb25mZGlyfS9kYnVzLTEgKQorICBzZXQgKERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICAke2NvbmZpZ2Rpcn0vc3lzdGVtLmNvbmYpCisgIHNldCAoREJVU19TRVNTSU9OX0NPTkZJR19GSUxFICR7Y29uZmlnZGlyfS9zZXNzaW9uLmNvbmYpCisgIHNldCAoREJVU19VU0VSICJtZXNzYWdlYnVzIikKKyAgc2V0IChEQlVTX1RFU1RfVVNFUiAibm9ib2R5IikKKyAgIyBGb3IgYmVzdCBzZWN1cml0eSwgYXNzdW1lIHRoYXQgYWxsIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBjYW4gZG8KKyAgIyBjcmVkZW50aWFscy1wYXNzaW5nLgorICBzZXQgKERCVVNfU0VTU0lPTl9DT05GX01BWUJFX0FVVEhfRVhURVJOQUwgIjxhdXRoPkVYVEVSTkFMPC9hdXRoPiIpCitlbmRpZiAoV0lOMzIpCisKK3NldCAoREJVU19EQUVNT05fTkFNRSAiZGJ1cy1kYWVtb24iIENBQ0hFIFNUUklORyAiVGhlIG5hbWUgb2YgdGhlIGRidXMgZGFlbW9uIGV4ZWN1dGFibGUiKQorCisjIyMjIyMjIyMjIyBjcmVhdGUgY29uZmlnLmggIyMjIyMjIyMjIyMjIyMjCisKKyNpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcy5jbWFrZSkKKworIyBiZXR0ZXIgdXNlIGZsYWdzIGZvciBnY2MKK2lmIChNSU5HVykKKwlzZXQgKEhBVkVfR05VQ19WQVJBUkdTIDEpCitlbmRpZihNSU5HVykKKworIyBjb21waWxlciBkZWZpbml0aW9ucworYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSD0xKQorYWRkX2RlZmluaXRpb25zKCR7REJVU19CVVNfQ0ZMQUdTfSkKKworCitpZiAoREJVU19CVUlMRF9URVNUUykKKyAgICAjIHNldCB2YXJpYWJsZXMgdXNlZCBmb3IgdGhlIC5pbiBmaWxlcyAoc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlX2ZpbGUpIGluIHRlc3QvZGF0YToKKyAgICBzZXQoREJVU19URVNUX0VYRUMgJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfSR7SURFX0JJTn0pCisgICAgc2V0KERCVVNfVEVTVF9EQVRBICR7Q01BS0VfQklOQVJZX0RJUn0vdGVzdC9kYXRhKQorICAgIHNldChURVNUX1NPQ0tFVF9ESVIgJHtEQlVTX1NFU1NJT05fU09DS0VUX0RJUn0gKQorICAgIHNldChURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0KQorICAgIHNldChURVNUX0JVU19MQVVOQ0hfQklOQVJZICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vZGJ1cy1sYXVuY2gke0VYRUVYVH0pCisgICAgaWYgKFVOSVgpCisgICAgICAgIHNldCAoVEVTVF9MSVNURU4gInVuaXg6dG1wZGlyPSR7VEVTVF9TT0NLRVRfRElSfSIpCisgICAgZW5kaWYgKFVOSVgpCisgICAgaWYgKFdJTjMyKQorICAgICAgICBzZXQgKFRFU1RfTElTVEVOICJ0Y3A6aG9zdD1sb2NhbGhvc3QiKQorICAgIGVuZGlmIChXSU4zMikKK2VuZGlmICAoREJVU19CVUlMRF9URVNUUykKKworc2V0KERCVVNfTElCUkFSSUVTIGRidXMtMSkKK3NldChEQlVTX0lOVEVSTkFMX0xJQlJBUklFUyBkYnVzLWludGVybmFsKQorCitzZXQgKERCVVNfSU5URVJOQUxfQUREX0xJQlJBUllfT1BUSU9OUyBTVEFUSUMpCitzZXQgKERCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TICItRERCVVNfQ09NUElMQVRJT04iKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlnLmguY21ha2UgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NvbmZpZy5oICkKKworaWYgKFdJTjMyKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RidXMtZW52LmJhdC5jbWFrZSAke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWVudi5iYXQgKQoraW5zdGFsbF9maWxlcygvYmluIEZJTEVTICR7Q01BS0VfQklOQVJZX0RJUn0vYmluL2RidXMtZW52LmJhdCkKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSD0xKQorCisjIyMjIyMjIyMjIyBzdWJkaXJzICMjIyMjIyMjIyMjIyMjIworCithZGRfc3ViZGlyZWN0b3J5KCBkYnVzICkKK2FkZF9zdWJkaXJlY3RvcnkoIGJ1cyApCitpZiAoREJVU19CVUlMRF9URVNUUykKKwlhZGRfc3ViZGlyZWN0b3J5KCB0ZXN0ICkKKwlhZGRfY3VzdG9tX3RhcmdldChjaGVjaworCQlDT01NQU5EIGN0ZXN0IC1SIF50ZXN0LS4qCisJKQorZW5kaWYgKERCVVNfQlVJTERfVEVTVFMpCithZGRfc3ViZGlyZWN0b3J5KCB0b29scyApCithZGRfc3ViZGlyZWN0b3J5KCBkb2MgKQorCisKK09QVElPTihEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlMgImluc3RhbGwgcmVxdWlyZWQgc3lzdGVtIGxpYnJhcmllcyIgT0ZGKQorTUVTU0FHRSgiICIpCitNRVNTQUdFKCJzZXQgLUREQlVTX0lOU1RBTExfU1lTVEVNX0xJQlM9MSB0byBpbnN0YWxsIHJ1bnRpbWUgbGlicmFyaWVzIHRvbyIpCitNRVNTQUdFKCJzZXQgREJVU0RJUiAoZW52aXJvbm1lbnQgb3IgY21ha2Ugb3B0aW9uKSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgaW5zdGFsbCBkaXJlY3RvcnkgIikKK01FU1NBR0UoIiAiKQorTUVTU0FHRSgiICIpCitHRVRfRklMRU5BTUVfQ09NUE9ORU5UKENfQ09NUElMRVIgJHtDTUFLRV9DX0NPTVBJTEVSfSBOQU1FKQorR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChDWFhfQ09NUElMRVIgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IE5BTUUpCisKK21lc3NhZ2UoIiAgICAgICAgICAgICAgICAgIEQtQlVTICR7REJVU19WRVJTSU9OfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBwcmVmaXg6ICAgICAgICAgICAke3ByZWZpeH0gICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIGV4ZWNfcHJlZml4OiAgICAgICR7ZXhlY19wcmVmaXh9ICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgbGliZGlyOiAgICAgICAgICAgJHtFWFBBTkRFRF9MSUJESVJ9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBiaW5kaXI6ICAgICAgICAgICAke0VYUEFOREVEX0JJTkRJUn0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIHN5c2NvbmZkaXI6ICAgICAgICR7RVhQQU5ERURfU1lTQ09ORkRJUn0gICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgZGF0YWRpcjogICAgICAgICAgJHtFWFBBTkRFRF9EQVRBRElSfSAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgc291cmNlIGNvZGUgbG9jYXRpb246ICAgICAke0RCVVNfU09VUkNFX0RJUn0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBidWlsZCBkaXI6ICAgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0gICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGMgY29tcGlsZXI6ICAgICAgICAgICAgICAgJHtDX0NPTVBJTEVSfSAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY2ZsYWdzOiAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NfRkxBR1N9ICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjZmxhZ3MgZGVidWc6ICAgICAgICAgICAgICR7Q01BS0VfQ19GTEFHU19ERUJVR30gICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGNmbGFncyByZWxlYXNlOiAgICAgICAgICAgJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9ICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY3h4IGNvbXBpbGVyOiAgICAgICAgICAgICAke0NYWF9DT01QSUxFUn0gICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHhmbGFnczogICAgICAgICAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGN4eGZsYWdzIGRlYnVnOiAgICAgICAgICAgJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9ICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY3h4ZmxhZ3MgcmVsZWFzZTogICAgICAgICAke0NNQUtFX0NYWF9GTEFHU19SRUxFQVNFfSAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICA2NC1iaXQgaW50OiAgICAgICAgICAgICAgICR7REJVU19JTlQ2NF9UWVBFfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIDMyLWJpdCBpbnQ6ICAgICAgICAgICAgICAgJHtEQlVTX0lOVDMyX1RZUEV9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgMTYtYml0IGludDogICAgICAgICAgICAgICAke0RCVVNfSU5UMTZfVFlQRX0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBEb3h5Z2VuOiAgICAgICAgICAgICAgICAgICR7RE9YWUdFTn0gICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIERvY2Jvb2sgR2VuZXJhdG9yOiAgICAgICAgJHtET0NCT09LX0dFTkVSQVRPUl9OQU1FfSAgICAgICAgICAgIikKKworCittZXNzYWdlKCIgICAgICAgIGdjYyBjb3ZlcmFnZSBwcm9maWxpbmc6ICAgJHtEQlVTX0dDT1ZfRU5BQkxFRH0gICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgdW5pdCB0ZXN0czogICAgICAke0RCVVNfQlVJTERfVEVTVFN9ICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB3aXRoIEdMaWI6ICAgICAgICR7REJVU19XSVRIX0dMSUJ9ICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtEQlVTX0VOQUJMRV9WRVJCT1NFX01PREV9ICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgdy9vIGFzc2VydGlvbnM6ICAke0RCVVNfRElTQUJMRV9BU1NFUlR9ICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB3L28gY2hlY2tzOiAgICAgICR7REJVU19ESVNBQkxFX0NIRUNLU30gICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIGJ1cyBzdGF0cyBBUEk6ICAgJHtEQlVTX0VOQUJMRV9TVEFUU30gICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbGluZyBzeXN0ZW0gbGliczogICAke0RCVVNfSU5TVEFMTF9TWVNURU1fTElCU30gICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBpbm90aWZ5IHN1cHBvcnQ6ICR7REJVU19CVVNfRU5BQkxFX0lOT1RJRll9ICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIGtxdWV1ZSBzdXBwb3J0OiAgJHtEQlVTX0JVU19FTkFCTEVfS1FVRVVFfSAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgRG94eWdlbiBkb2NzOiAgICAke0RCVVNfRU5BQkxFX0RPWFlHRU5fRE9DU30gICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBYTUwgZG9jczogICAgICAgICR7REJVU19FTkFCTEVfWE1MX0RPQ1N9ICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIERhZW1vbiBleGVjdXRhYmxlIG5hbWU6ICAgJHtEQlVTX0RBRU1PTl9OQU1FfSIpCitpZiAoV0lOMzIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgYWRkcmVzczogICAgICAgJHtEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTfSAgIikKK21lc3NhZ2UoIiAgICAgICAgU2Vzc2lvbiBidXMgbGlzdGVucyBvbjogICAke0RCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1N9ICAiKQorbWVzc2FnZSgiICAgICAgICBTZXNzaW9uIGNsaWVudHMgY29ubmVjdCB0bzogJHtEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTU30gIikKK2Vsc2UgKFdJTjMyKQorbWVzc2FnZSgiICAgICAgICBTeXN0ZW0gYnVzIHNvY2tldDogICAgICAgICR7REJVU19TWVNURU1fU09DS0VUfSAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgYWRkcmVzczogICAgICAgJHtEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTfSAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyBQSUQgZmlsZTogICAgICAke0RCVVNfU1lTVEVNX1BJRF9GSUxFfSAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBTZXNzaW9uIGJ1cyBzb2NrZXQgZGlyOiAgICR7REJVU19TRVNTSU9OX1NPQ0tFVF9ESVJ9ICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIENvbnNvbGUgYXV0aCBkaXI6ICAgICAgICAgJHtEQlVTX0NPTlNPTEVfQVVUSF9ESVJ9ICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyB1c2VyOiAgICAgICAgICAke0RCVVNfVVNFUn0gICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAnbWFrZSBjaGVjaycgc29ja2V0IGRpcjogICR7VEVTVF9TT0NLRVRfRElSfSAgICAgICAgICAgICAgICAgICIpCitlbmRpZiAoV0lOMzIpCittZXNzYWdlKCIgICAgICAgIFRlc3QgbGlzdGVuIGFkZHJlc3M6ICAgICAgJHtURVNUX0xJU1RFTn0gICAgICAgICAgICAgICAgICAgICAgIikKK2lmIChNU1ZDKQorbWVzc2FnZSgiICAgICAgICBidWlsZCB0aW1lc3RhbXA6ICAgICAgICAgICR7REJVU19CVUlMRF9USU1FU1RBTVB9ICAgICAgICAgICAgICIpCitlbmRpZiAoTVNWQykKKworTUVTU0FHRSgiICIpCitpZiAoREJVU19CVUlMRF9URVNUUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBhbmQgcmVuZGVycyBpdCBpbnNlY3VyZS4iKQorZW5kaWYoREJVU19CVUlMRF9URVNUUykKKworaWYgKERCVVNfQlVJTERfVEVTVFMgQU5EIERCVVNfRElTQUJMRV9BU1NFUlQpCisgICAgbWVzc2FnZSgiTk9URTogYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGJ1dCB3aXRob3V0IGFzc2VydGlvbnMgbWVhbnMgdGVzdHMgbWF5IG5vdCBwcm9wZXJseSByZXBvcnQgZmFpbHVyZXMgKHRoaXMgY29uZmlndXJhdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIGRvaW5nIHNvbWV0aGluZyBsaWtlIHByb2ZpbGluZyB0aGUgdGVzdHMpIikKK2VuZGlmKERCVVNfQlVJTERfVEVTVFMgQU5EIERCVVNfRElTQUJMRV9BU1NFUlQpCisKK2lmIChEQlVTX0dDT1ZfRU5BQkxFRCkKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpcyBkZWZpbml0ZWx5IGZvciBkZXZlbG9wZXJzIG9ubHkuIikKK2VuZGlmKERCVVNfR0NPVl9FTkFCTEVEKQorCitpZiAoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIpCitlbmRpZihEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpCisKK2lmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIikKK2VuZGlmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorCitpZiAoREJVU19ESVNBQkxFX0NIRUNLUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRob3V0IGNoZWNrcyBmb3IgYXJndW1lbnRzIHBhc3NlZCB0byBwdWJsaWMgQVBJIG1ha2VzIGl0IGhhcmRlciB0byBkZWJ1ZyBhcHBzIHVzaW5nIEQtQlVTLCBidXQgd2lsbCBzbGlnaHRseSBkZWNyZWFzZSBELUJVUyBsaWJyYXJ5IHNpemUgYW5kIF92ZXJ5XyBzbGlnaHRseSBpbXByb3ZlIHBlcmZvcm1hbmNlLiIpCitlbmRpZihEQlVTX0RJU0FCTEVfQ0hFQ0tTKQorCitmb3JlYWNoKF9ub3RlICR7Rk9PVE5PVEVTfSkKKyAgICBtZXNzYWdlKCR7X25vdGV9KQorZW5kZm9yZWFjaCgpCisKK01FU1NBR0UoIiAiKQorCitJTkNMVURFKG1vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlKQorCithZGRfY3VzdG9tX3RhcmdldChoZWxwLW9wdGlvbnMKKyAgICBjbWFrZSAtTEggCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfQorKQpkaWZmIC0tZ2l0IGEvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlIGIvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWI4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKQEAgLTAsMCArMSwxODYgQEAKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQoraW5jbHVkZShDaGVja1N0cnVjdE1lbWJlcikKK2luY2x1ZGUoQ2hlY2tUeXBlU2l6ZSkKKworY2hlY2tfaW5jbHVkZV9maWxlKGFsbG9jYS5oICAgICBIQVZFX0FMTE9DQV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGJ5dGVzd2FwLmggICAgIEhBVkVfQllURVNXQVBfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShjcnQvZXh0ZXJucy5oICAgICBIQVZFX0NSVF9FWFRFUk5TX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZGlyZW50LmggICAgIEhBVkVfRElSRU5UX0gpICAjIGRidXMtc3lzZGVwcy11dGlsLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShkbGZjbi5oICAgICBIQVZFX0RMRkNOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZXhlY2luZm8uaCAgICAgSEFWRV9FWEVDSU5GT19IKQorY2hlY2tfaW5jbHVkZV9maWxlKGVycm5vLmggICAgIEhBVkVfRVJSTk9fSCkgICAgIyBkYnVzLXN5c2RlcHMuYworY2hlY2tfaW5jbHVkZV9maWxlKGV4cGF0LmggICAgIEhBVkVfRVhQQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShncnAuaCAgICAgICAgSEFWRV9HUlBfSCkgICAgICMgZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oICAgICBIQVZFX0lOVFRZUEVTX0gpICAgIyBkYnVzLXBpcGUuaAorY2hlY2tfaW5jbHVkZV9maWxlKGlvLmggICAgICAgICBIQVZFX0lPX0gpICAgICAgIyBpbnRlcm5hbAorY2hlY2tfaW5jbHVkZV9maWxlKGxvY2FsZS5oICAgICBIQVZFX0xPQ0FMRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKG1lbW9yeS5oICAgICBIQVZFX01FTU9SWV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oICAgICBIQVZFX1NJR05BTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oICAgICBIQVZFX1NURElOVF9IKSAgICMgZGJ1cy1waXBlLmgKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRsaWIuaCAgICAgSEFWRV9TVERMSUJfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRpby5oICAgICAgSEFWRV9TVERJT19IKSAgICMgZGJ1cy1zeXNkZXBzLmgKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmcuaCAgICAgSEFWRV9TVFJJTkdfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmdzLmggICAgIEhBVkVfU1RSSU5HU19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5c2xvZy5oICAgICBIQVZFX1NZU0xPR19IKQorY2hlY2tfaW5jbHVkZV9maWxlcygic3RkaW50Lmg7c3lzL3R5cGVzLmg7c3lzL2V2ZW50LmgiIEhBVkVfU1lTX0VWRU5UX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL2lub3RpZnkuaCAgICAgSEFWRV9TWVNfSU5PVElGWV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9yZXNvdXJjZS5oICAgICBIQVZFX1NZU19SRVNPVVJDRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zdGF0LmggICAgIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdHlwZXMuaCAgICAgSEFWRV9TWVNfVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdWlvLmggICAgIEhBVkVfU1lTX1VJT19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wb2xsLmggICBIQVZFX1BPTEwpICAgICAgIyBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3ByY3RsLmggIEhBVkVfU1lTX1BSQ1RMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N5c2xpbWl0cy5oICAgIEhBVkVfU1lTX1NZU0xJTUlUU19IKSAgICMgZGJ1cy1zeXNkZXBzLXVuaXguYworY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggICBIQVZFX1NZU19USU1FX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvd2FpdC5oICAgSEFWRV9TWVNfV0FJVF9IKSMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUodGltZS5oICAgICAgIEhBVkVfVElNRV9IKSAgICAjIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHdzMnRjcGlwLmggICBIQVZFX1dTMlRDUElQX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCAgICAgSEFWRV9VTklTVERfSCkgICMgZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKKworY2hlY2tfc3ltYm9sX2V4aXN0cyhiYWNrdHJhY2UgICAgImV4ZWNpbmZvLmgiICAgICAgIEhBVkVfQkFDS1RSQUNFKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldGdyb3VwbGlzdCAiZ3JwLmgiICAgICAgICAgICAgSEFWRV9HRVRHUk9VUExJU1QpICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldHBlZXJ1Y3JlZCAidWNyZWQuaCIgICAgICAgICAgSEFWRV9HRVRQRUVSVUNSRUQpICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMobmFub3NsZWVwICAgICJ0aW1lLmgiICAgICAgICAgICBIQVZFX05BTk9TTEVFUCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHduYW1fciAgICJlcnJuby5oIHB3ZC5oIiAgICBIQVZFX1BPU0lYX0dFVFBXTkFNX1IpICAgIyAgZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCitjaGVja19zeW1ib2xfZXhpc3RzKHNldGVudiAgICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9TRVRFTlYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHVuc2V0ZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9VTlNFVEVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGNsZWFyZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9DTEVBUkVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHdyaXRldiAgICAgICAic3lzL3Vpby5oIiAgICAgICAgSEFWRV9XUklURVYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICJzeXMvcmVzb3VyY2UuaCIgICBIQVZFX1NFVFJMSU1JVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYywgdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0cGFpciAgICJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NPQ0tFVFBBSVIpICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0bG9jYWxlICAgICJsb2NhbGUuaCIgICAgICAgICBIQVZFX1NFVExPQ0FMRSkgICAgICAgICAgIyAgZGJ1cy10ZXN0LW1haW4uYworY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbGVjb252ICAgImxvY2FsZS5oIiAgICAgICAgIEhBVkVfTE9DQUxFQ09OVikgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2xsICAgICAgInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RSVE9MTCkgICAgICAgICAgICAjICBkYnVzLXNlbmQuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b3VsbCAgICAgInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RSVE9VTEwpICAgICAgICAgICAjICBkYnVzLXNlbmQuYworc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1EX0dOVV9TT1VSQ0UpCitjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUyICAgICAgICAiZmNudGwuaDt1bmlzdGQuaCIgICAgICAgICBIQVZFX1BJUEUyKQorY2hlY2tfc3ltYm9sX2V4aXN0cyhhY2NlcHQ0ICAgICAgInN5cy9zb2NrZXQuaCIgICAgICAgICAgICAgSEFWRV9BQ0NFUFQ0KQorY2hlY2tfc3ltYm9sX2V4aXN0cyhkaXJmZCAgICAgICAgImRpcmVudC5oIiAgICAgICAgICAgICAgICAgSEFWRV9ESVJGRCkKK2NoZWNrX3N5bWJvbF9leGlzdHMoaW5vdGlmeV9pbml0MSAic3lzL2lub3RpZnkuaCIgICAgICAgICAgIEhBVkVfSU5PVElGWV9JTklUMSkKK2NoZWNrX3N5bWJvbF9leGlzdHMoU0NNX1JJR0hUUyAgICAic3lzL3R5cGVzLmg7c3lzL3NvY2tldC5oO3N5cy91bi5oIiBIQVZFX1VOSVhfRkRfUEFTU0lORykKK2NoZWNrX3N5bWJvbF9leGlzdHMocHJjdGwgICAgICAgICJzeXMvcHJjdGwuaCIgICAgICAgICAgICAgIEhBVkVfUFJDVEwpCitjaGVja19zeW1ib2xfZXhpc3RzKHJhaXNlICAgICAgICAic2lnbmFsLmgiICAgICAgICAgICAgICAgICBIQVZFX1JBSVNFKQorCitjaGVja19zdHJ1Y3RfbWVtYmVyKGNtc2djcmVkIGNtY3JlZF9waWQgInN5cy90eXBlcy5oIHN5cy9zb2NrZXQuaCIgSEFWRV9DTVNHQ1JFRCkgICAjICBkYnVzLXN5c2RlcHMuYworCisjIG1pc3Npbmc6CisjIEhBVkVfQUJTVFJBQ1RfU09DS0VUUworIyBEQlVTX0hBVkVfR0NDMzNfR0NPVgorCitjaGVja190eXBlX3NpemUoInNob3J0IiAgICAgU0laRU9GX1NIT1JUKQorY2hlY2tfdHlwZV9zaXplKCJpbnQiICAgICAgIFNJWkVPRl9JTlQpCitjaGVja190eXBlX3NpemUoImxvbmciICAgICAgU0laRU9GX0xPTkcpCitjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgU0laRU9GX0xPTkdfTE9ORykKK2NoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgICBTSVpFT0ZfX19JTlQ2NCkKK3NldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQorY2hlY2tfdHlwZV9zaXplKCJzb2NrbGVuX3QiIFNPQ0tMRU5fVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLXVuaXguYworc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCisKKyMgREJVU19JTlQ2NF9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImludCIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCkiKQorICAgIHNldCAoREJVU19VSU5UNjRfQ09OU1RBTlQgIih2YWwjI1UpIikKK2Vsc2VpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQorICAgIHNldCAoREJVU19JTlQ2NF9UWVBFICJsb25nIikKKyAgICBzZXQgKERCVVNfSU5UNjRfQ09OU1RBTlQgICIodmFsIyNMKSIpCisgICAgc2V0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAiKHZhbCMjVUwpIikKK2Vsc2VpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImxvbmcgbG9uZyIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCMjTEwpIikKKyAgICBzZXQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICIodmFsIyNVTEwpIikKK2Vsc2VpZihTSVpFT0ZfX19JTlQ2NCBFUVVBTCA4KQorICAgIHNldCAoREJVU19JTlQ2NF9UWVBFICJfX2ludDY0IikKKyAgICBzZXQgKERCVVNfSU5UNjRfQ09OU1RBTlQgICIodmFsIyNpNjQpIikKKyAgICBzZXQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICIodmFsIyN1aTY0KSIpCitlbHNlKFNJWkVPRl9JTlQgRVFVQUwgOCkKKyAgICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiQ291bGQgbm90IGZpbmQgYSA2NC1iaXQgaW50ZWdlciB0eXBlIikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgOCkKKworIyBEQlVTX0lOVDMyX1RZUEUKK2lmKFNJWkVPRl9JTlQgRVFVQUwgNCkKKyAgICBzZXQgKERCVVNfSU5UMzJfVFlQRSAiaW50IikKK2Vsc2VpZihTSVpFT0ZfTE9ORyBFUVVBTCA0KQorICAgIHNldCAoREJVU19JTlQzMl9UWVBFICJsb25nIikKK2Vsc2VpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDQpCisgICAgc2V0IChEQlVTX0lOVDMyX1RZUEUgImxvbmcgbG9uZyIpCitlbmRpZihTSVpFT0ZfSU5UIEVRVUFMIDQpCisKKyMgREJVU19JTlQxNl9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgImludCIpCitlbHNlaWYoU0laRU9GX1NIT1JUIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgInNob3J0IikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgMikKKworZmluZF9wcm9ncmFtKERPWFlHRU4gZG94eWdlbikKK2ZpbmRfcHJvZ3JhbShYTUxUTyB4bWx0bykKKworaWYoTVNWQykKKyAgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyAiX0RCVVNfVkFfQ09QWV9BU1NJR04iKQorZWxzZShNU1ZDKQord3JpdGVfZmlsZSgiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jIiAiI2luY2x1ZGUgPHN0ZGFyZy5oPgorCSNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJdmFfY29weSAoYXJnczIsIGFyZ3MxKTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KKyIpCit0cnlfY29tcGlsZShEQlVTX0hBVkVfVkFfQ09QWQorICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jKQorCitpZihEQlVTX0hBVkVfVkFfQ09QWSkKKyAgU0VUKERCVVNfVkFfQ09QWV9GVU5DIHZhX2NvcHkgQ0FDSEUgU1RSSU5HICJ2YV9jb3B5IGZ1bmN0aW9uIikKK2Vsc2UoREJVU19IQVZFX1ZBX0NPUFkpCisgIHdyaXRlX2ZpbGUoIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvY21ha2VfdHJ5X2NvbXBpbGUuYyIgIiNpbmNsdWRlIDxzdGRhcmcuaD4KKyAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisJICBzdGF0aWMgdm9pZCBmIChpbnQgaSwgLi4uKSB7CisJICB2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwkgIHZhX3N0YXJ0IChhcmdzMSwgaSk7CisJICBfX3ZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJICBpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgICBleGl0ICgxKTsKKwkgIHZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwkgIH0KKwkgIGludCBtYWluKCkgeworCSAgICBmICgwLCA0Mik7CisJICAgIHJldHVybiAwOworCSAgfQorICAiKQorICB0cnlfY29tcGlsZShEQlVTX0hBVkVfX19WQV9DT1BZCisgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jKQorICBpZihEQlVTX0hBVkVfX19WQV9DT1BZKQorICAgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyBfX3ZhX2NvcHkgQ0FDSEUgU1RSSU5HICJ2YV9jb3B5IGZ1bmN0aW9uIikKKyAgZWxzZShEQlVTX0hBVkVfX19WQV9DT1BZKQorICAgIFNFVChEQlVTX1ZBX0NPUFlfQVNfQVJSQVkgIjEiIENBQ0hFIFNUUklORyAiJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlcyIpCisgIGVuZGlmKERCVVNfSEFWRV9fX1ZBX0NPUFkpCitlbmRpZihEQlVTX0hBVkVfVkFfQ09QWSkKK2VuZGlmKE1TVkMpICMgX25vdF8gTVNWQworIyMjIyBBYnN0cmFjdCBzb2NrZXRzCisKK2lmIChEQlVTX0VOQUJMRV9BQlNUUkFDVF9TT0NLRVRTKQorCisgIHRyeV9jb21waWxlKEhBVkVfQUJTVFJBQ1RfU09DS0VUUworICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vbW9kdWxlcy9DaGVja0ZvckFic3RyYWN0U29ja2V0cy5jKQorCitlbmRpZihEQlVTX0VOQUJMRV9BQlNUUkFDVF9TT0NLRVRTKQorCitpZihIQVZFX0FCU1RSQUNUX1NPQ0tFVFMpCisgIHNldChEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUgYWJzdHJhY3QpCitlbHNlKEhBVkVfQUJTVFJBQ1RfU09DS0VUUykKKyAgc2V0KERCVVNfUEFUSF9PUl9BQlNUUkFDVF9WQUxVRSBwYXRoKQorZW5kaWYoSEFWRV9BQlNUUkFDVF9TT0NLRVRTKQorCmRpZmYgLS1naXQgYS9jbWFrZS9idXMtdGVzdC5iYXQuY21ha2UgYi9jbWFrZS9idXMtdGVzdC5iYXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2ODg3MQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2J1cy10ZXN0LmJhdC5jbWFrZQpAQCAtMCwwICsxLDE0IEBACis6OiBidXMtdGVzdCB3cmFwcGVyCitAZWNobyBvZmYKKworOjogc2Vzc2lvbiBidXMgYWRkcmVzcworc2V0IERCVVNfU1RBUlRFUl9CVVM9dGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNAorCitpZiBOT1QgIiUxIiA9PSAiIiAoCisJU0VUIERBVEFESVI9JTEKKykgZWxzZSAoCisJU0VUIERBVEFESVI9dGVzdFxkYXRhCispCisKK2JpblxidXMtdGVzdC5leGUgdGVzdFxkYXRhCisKZGlmZiAtLWdpdCBhL2NtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNhZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEyIEBACithZGRfZGVmaW5pdGlvbnMoLUREQlVTX0NPTVBJTEFUSU9OKQorCitTRVQoRUZFTkNFICIiKQorU0VUKEJVU19ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9idXMpCisKKyMgY29uZmlnIGZpbGVzIGZvciBpbnN0YWxsYXRpb24gCitDT05GSUdVUkVfRklMRSggIiR7QlVTX0RJUn0vc2Vzc2lvbi5jb25mLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Nlc3Npb24uY29uZiIgSU1NRURJQVRFIEBPTkxZKQorQ09ORklHVVJFX0ZJTEUoICIke0JVU19ESVJ9L2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mIiBJTU1FRElBVEUgQE9OTFkpCitGSUxFKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zZXNzaW9uLmQpCisKK2lmKE5PVCBXSU4zMikKKyAgICBDT05GSUdVUkVfRklMRSggIiR7QlVTX0RJUn0vc3lzdGVtLmNvbmYuaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3lzdGVtLmNvbmYiIElNTUVESUFURSBAT05MWSkKKyAgICBDT05GSUdVUkVfRklMRSggIiR7QlVTX0RJUn0vbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZi5pbiIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9sZWdhY3ktY29uZmlnL3N5c3RlbS5jb25mIiBJTU1FRElBVEUgQE9OTFkpCisgICAgRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3lzdGVtLmQpCitlbmRpZigpCisKKyMgY29weSBzZXJ2aWNlcyBmb3IgbG9jYWwgZGFlbW9uIHN0YXJ0IHRvIGxvY2FsIHNlcnZpY2UgZGlyIGRhdGEvZGJ1cy0xL3NlcnZpY2VzCitTRVQgKFNFUlZJQ0VfRklMRVMgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMpCitGSUxFKEdMT0IgRklMRVMgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vJHtTRVJWSUNFX0ZJTEVTfS8qLnNlcnZpY2UuaW4iICkKK0ZPUkVBQ0goRklMRSAke0ZJTEVTfSkJCisJR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUVfV0UpCisJU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS9kYXRhL2RidXMtMS9zZXJ2aWNlcy8ke0ZJTEVOQU1FfS5zZXJ2aWNlKQorCUlGIChDT05GSUdfVkVSQk9TRSkKKwkJTUVTU0FHRSgiRlJPTTogJHtGSUxFfVxuVE86ICR7VEFSR0VUfVxuIikKKwlFTkRJRiAoQ09ORklHX1ZFUkJPU0UpCisJY29uZmlndXJlX2ZpbGUoJHtGSUxFfSAke1RBUkdFVH0gKQorRU5ERk9SRUFDSChGSUxFKQorCitTRVQgKFhNTF9TT1VSQ0VTICR7QlVTX0RJUn0vY29uZmlnLWxvYWRlci1leHBhdC5jKQorCitpZiAoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkpCisgICAgc2V0IChESVJfV0FUQ0hfU09VUkNFICR7QlVTX0RJUn0vZGlyLXdhdGNoLWlub3RpZnkuYykKK2Vsc2VpZiAoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKKyAgICBzZXQgKERJUl9XQVRDSF9TT1VSQ0UgJHtCVVNfRElSfS9kaXItd2F0Y2gta3F1ZXVlLmMpCitlbHNlIChEQlVTX0JVU19FTkFCTEVfSU5PVElGWSkKKyAgICBzZXQgKERJUl9XQVRDSF9TT1VSQ0UgJHtCVVNfRElSfS9kaXItd2F0Y2gtZGVmYXVsdC5jKQorZW5kaWYgKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZKQorCitzZXQgKEJVU19TT1VSQ0VTIAorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5jCQkJCQorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vYXBwYXJtb3IuYworCSR7QlVTX0RJUn0vYXBwYXJtb3IuaAorCSR7QlVTX0RJUn0vYXVkaXQuYworCSR7QlVTX0RJUn0vYXVkaXQuaAorCSR7QlVTX0RJUn0vYnVzLmMJCQkJCQorCSR7QlVTX0RJUn0vYnVzLmgJCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5jCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5oCisJJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisJJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5oCisjICAgICR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci10cml2aWFsLmMKKwkke0JVU19ESVJ9L2Nvbm5lY3Rpb24uYworCSR7QlVTX0RJUn0vY29ubmVjdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMJCQkJCisJJHtCVVNfRElSfS9kZXNrdG9wLWZpbGUuaAkJCQkKKwkke0JVU19ESVJ9L2Rpci13YXRjaC5oCQkJCQorCSR7QlVTX0RJUn0vZGlzcGF0Y2guYwkJCQkKKwkke0JVU19ESVJ9L2Rpc3BhdGNoLmgJCQkJCisJJHtCVVNfRElSfS9kcml2ZXIuYwkJCQkKKwkke0JVU19ESVJ9L2RyaXZlci5oCQkJCQorCSR7QlVTX0RJUn0vZXhwaXJlbGlzdC5jCQkJCQorCSR7QlVTX0RJUn0vZXhwaXJlbGlzdC5oCQkJCQorCSR7QlVTX0RJUn0vcG9saWN5LmMJCQkJCisJJHtCVVNfRElSfS9wb2xpY3kuaAkJCQkKKwkke0JVU19ESVJ9L3NlbGludXguaAkJCQkKKwkke0JVU19ESVJ9L3NlbGludXguYwkJCQkKKwkke0JVU19ESVJ9L3NlcnZpY2VzLmMJCQkJCisJJHtCVVNfRElSfS9zZXJ2aWNlcy5oCQkJCQorCSR7QlVTX0RJUn0vc2lnbmFscy5jCQkJCQorCSR7QlVTX0RJUn0vc2lnbmFscy5oCQkJCQorCSR7QlVTX0RJUn0vdGVzdC5jCQkJCQkKKwkke0JVU19ESVJ9L3Rlc3QuaAkJCQkJCisJJHtCVVNfRElSfS91dGlscy5jCQkJCQkKKwkke0JVU19ESVJ9L3V0aWxzLmgJCQkJCQorCSR7WE1MX1NPVVJDRVN9CisJJHtESVJfV0FUQ0hfU09VUkNFfQorKQoraWYoREJVU19FTkFCTEVfU1RBVFMpCisJbGlzdChBUFBFTkQgQlVTX1NPVVJDRVMKKwkJJHtCVVNfRElSfS9zdGF0cy5jCisJCSR7QlVTX0RJUn0vc3RhdHMuaAorCSkKK2VuZGlmKERCVVNfRU5BQkxFX1NUQVRTKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorCSR7Q01BS0VfQklOQVJZX0RJUn0KKwkke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uCisJJHtYTUxfSU5DTFVERV9ESVJ9CispCisKK2FkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uICR7QlVTX1NPVVJDRVN9ICR7QlVTX0RJUn0vbWFpbi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtZGFlbW9uICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7WE1MX0xJQlJBUll9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgJHtEQlVTX0RBRU1PTl9OQU1FfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLWRhZW1vbiBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OU30pCisKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtZGFlbW9uKQoraW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2Vzc2lvbi5jb25mIERFU1RJTkFUSU9OIHNoYXJlL2RidXMtMSkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mIERFU1RJTkFUSU9OIGV0Yy9kYnVzLTEpCitpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiBzaGFyZS9kYnVzLTEvc2Vzc2lvbi5kKQoraW5zdGFsbChESVJFQ1RPUlkgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xL3NlcnZpY2VzKQorCitpZihOT1QgV0lOMzIpCisgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3lzdGVtLmNvbmYgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xKQorICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYgREVTVElOQVRJT04gZXRjL2RidXMtMSkKKyAgICBpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiBzaGFyZS9kYnVzLTEvc3lzdGVtLmQpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcykKKyAgICBpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiB2YXIvcnVuL2RidXMpCitlbmRpZigpCisKK2lmIChEQlVTX1NFUlZJQ0UpCisJc2V0IChkYnVzX3NlcnZpY2VfU09VUkNFUyAKKwkJJHtCVVNfRElSfS9idXMtc2VydmljZS13aW4uYworCSMgVE9ETzogYWRkIGFkZGl0aW9uYWwgZmlsZXMKKwkjCSR7QlVTX0RJUn0vc2VydmljZS1tYWluLmMKKwkjCSR7QlVTX1NPVVJDRVN9IAorCSkKKworCWFkZF9leGVjdXRhYmxlKGRidXMtc2VydmljZSAke2RidXNfc2VydmljZV9TT1VSQ0VTfSApCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtc2VydmljZSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke1hNTF9MSUJSQVJZfSkKKwlzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy1zZXJ2aWNlIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKKwlpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLXNlcnZpY2UgKQorZW5kaWYgKERCVVNfU0VSVklDRSkKKworaWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCXNldChTT1VSQ0VTICR7QlVTX1NPVVJDRVN9ICR7QlVTX0RJUn0vdGVzdC1tYWluLmMpCisJYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWJ1cyAiJHtTT1VSQ0VTfSIgICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7WE1MX0xJQlJBUll9KQorCXNldF90YXJnZXRfcHJvcGVydGllcyh0ZXN0LWJ1cyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OU30pCisJaWYgKE5PVCBXSU4zMikKKwkJc2V0KHRlc3RfYnVzX3N5c3RlbV9TT1VSQ0VTCisJCQkke1hNTF9TT1VSQ0VTfQorCQkJJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisJCQkke0JVU19ESVJ9L2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jCisJCQkke0JVU19ESVJ9L3V0aWxzLmMKKwkJCSR7QlVTX0RJUn0vdGVzdC1zeXN0ZW0uYworCQkpCisJCWFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1idXMtc3lzdGVtICIke3Rlc3RfYnVzX3N5c3RlbV9TT1VSQ0VTfSIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gJHtEQlVTX0JVU19MSUJTfSkKKwllbmRpZigpCitlbmRpZiAoREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMpCisKK2lmKE1TVkMpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBidXNfdGVzdF9TT1VSQ0VTIGR1bW15KQorZW5kaWYoTVNWQykKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCisjY2xlYW4tbG9jYWw6CisjCS9iaW4vcm0gKi5iYiAqLmJiZyAqLmRhICouZ2NvdiB8fCB0cnVlCisKKyNpbnN0YWxsLWRhdGEtaG9vazoKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQobG9jYWxzdGF0ZWRpcikvcnVuL2RidXMKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQoY29uZmlnZGlyKS9zeXN0ZW0uZAorIwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikvJChkYXRhZGlyKS9kYnVzLTEvc2VydmljZXMKKworIyNpbnN0YWxsX2ZpbGUoJHtjb25maWdkaXJ9L3N5c3RlbS5kIEZJTEUKKworCitzZXQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTICR7WE1MX1NPVVJDRVN9CisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLXRyaXZpYWwuYworICAgICR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMKKyAgICAke0JVU19ESVJ9L3V0aWxzLmMKKyAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLmMKKworKQorCitpZihOT1QgV0lOMzIpCisjIFRPRE8gUEVORElORyhrZGFiKSBmaXggYnVpbGQgb24gd2luZG93cyAoYWN0aXZhdGlvbi1oZWxwZXIuYykKKyAgIGFkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICR7QlVTX0RJUn0vYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgKQorICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBhZGRfZXhlY3V0YWJsZShkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLWJpbi5jKQorICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUIikKKyAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBzZXQgKFNPVVJDRVMgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICR7QlVTX0RJUn0vdGVzdC1sYXVuY2gtaGVscGVyLmMpCisgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtYnVzLWxhdW5jaC1oZWxwZXIgIiR7U09VUkNFU30iICAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke1hNTF9MSUJSQVJZfSkKKyAgIHNldF90YXJnZXRfcHJvcGVydGllcyh0ZXN0LWJ1cy1sYXVuY2gtaGVscGVyIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QgLURBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTSIpCisgICBpbnN0YWxsX3RhcmdldHMoL2xpYiBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyKQorZW5kaWYoTk9UIFdJTjMyKQorCisjIyMjIEluaXQgc2NyaXB0cyBmdW4KKyNTQ1JJUFRfSU5fRklMRVM9bWVzc2FnZWJ1cy5pbgorIwkJcmMubWVzc2FnZWJ1cy5pbgorCisjIyBSZWQgSGF0IHN0YXJ0CisjaWYgREJVU19JTklUX1NDUklQVFNfUkVEX0hBVAorCisjaW5pdGRkaXI9JChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorCisjaW5pdGRfU0NSSVBUUz0gCQorIwltZXNzYWdlYnVzCisKKyNlbmRpZgorIyAjIyBSZWQgSGF0IGVuZAorCisjIyBTbGFja3dhcmUgc3RhcnQKKyNpZiBEQlVTX0lOSVRfU0NSSVBUU19TTEFDS1dBUkUKKworI2luaXRkZGlyPSQoc3lzY29uZmRpcikvcmMuZC8KKworI2luaXRkX1NDUklQVFM9IAkKKyMJcmMubWVzc2FnZWJ1cworCisjZW5kaWYKKyMjIFNsYWNrd2FyZSBlbmQKKworI01BTl9JTl9GSUxFUz1kYnVzLWRhZW1vbi4xLmluCisjbWFuX01BTlMgPSBkYnVzLWRhZW1vbi4xCisKKyMjIyMgRXh0cmEgZGlzdCAKKworI0VYVFJBX0RJU1Q9JChDT05GSUdfSU5fRklMRVMpICQoU0NSSVBUX0lOX0ZJTEVTKSAkKG1hbl9NQU5TKSAkKE1BTl9JTl9GSUxFUykKZGlmZiAtLWdpdCBhL2NtYWtlL2J1cy9zZXJ2aWNlLmNtYWtlIGIvY21ha2UvYnVzL3NlcnZpY2UuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkMTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2J1cy9zZXJ2aWNlLmNtYWtlCkBAIC0wLDAgKzEsMyBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVrdG9wLkRCdXMuU2VydmljZU5hbWUKK0V4ZWM9bm90ZXBhZApkaWZmIC0tZ2l0IGEvY21ha2UvY29uZmlnLmguY21ha2UgYi9jbWFrZS9jb25maWcuaC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmFmM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvY29uZmlnLmguY21ha2UKQEAgLTAsMCArMSwyOTcgQEAKKy8qIGNvbmZpZy5oLiBHZW5lcmF0ZWQgYnkgY21ha2UgZnJvbSBjb25maWcuaC5jbWFrZSAqLworCisjaWZuZGVmIF9EQlVTX0NPTkZJR19ICisjZGVmaW5lIF9EQlVTX0NPTkZJR19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGluZGljYXRlIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIHdpdGggY21ha2UgKi8KKyNkZWZpbmUgREJVU19DTUFLRSAxCisKK0BBVVRPUEFDS0FHRV9DT05GSUdfSF9URU1QTEFURUAKKworLyoKKyAqIFZhcmlhYmxlcyBkZWZpbmVkIGJ5IEFDX0RFRklORSBpbiAuLi9jb25maWd1cmUuYWMKKyAqIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBmaWxlCisqLworI2NtYWtlZGVmaW5lIEhBVkVfR05VQ19WQVJBUkdTIDEKKworI2NtYWtlZGVmaW5lIERCVVNfQ09OU09MRV9BVVRIX0RJUiAiQERCVVNfQ09OU09MRV9BVVRIX0RJUkAiCisjY21ha2VkZWZpbmUgREJVU19EQVRBRElSICAiQERCVVNfREFUQURJUkAiCisjY21ha2VkZWZpbmUgREJVU19CSU5ESVIgICAiQERCVVNfQklORElSQCIKKyNjbWFrZWRlZmluZSBEQlVTX1BSRUZJWCAiQERCVVNfUFJFRklYQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSAgIkBEQlVTX1NZU1RFTV9DT05GSUdfRklMRUAiCisjY21ha2VkZWZpbmUgREJVU19TRVNTSU9OX0NPTkZJR19GSUxFICJAREJVU19TRVNTSU9OX0NPTkZJR19GSUxFQCIKKyNjbWFrZWRlZmluZSBEQlVTX0RBRU1PTl9OQU1FICJAREJVU19EQUVNT05fTkFNRUAiCisjY21ha2VkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAgIkBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUyAgIkBEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTU0AiCisjY21ha2VkZWZpbmUgREJVU19NQUNISU5FX1VVSURfRklMRSAiQERCVVNfTUFDSElORV9VVUlEX0ZJTEVAIgorI2NtYWtlZGVmaW5lIERCVVNfREFFTU9ORElSICJAREJVU19EQUVNT05ESVJAIgorCisjY21ha2VkZWZpbmUgREJVU19FTkFCTEVfU1RBVFMKKworI2RlZmluZSBURVNUX0xJU1RFTiAgICAgICAiQFRFU1RfTElTVEVOQCIKKworLy8gdGVzdCBiaW5hcmllcworI2RlZmluZSBEQlVTX1RFU1RfRVhFQyAiQERCVVNfVEVTVF9FWEVDQCIKKyNkZWZpbmUgREJVU19FWEVFWFQgIkBFWEVFWFRAIgorI2NtYWtlZGVmaW5lIFRFU1RfQlVTX0xBVU5DSF9CSU5BUlkgIkBURVNUX0JVU19MQVVOQ0hfQklOQVJZQCIKKworLyogU29tZSBkYnVzIGZlYXR1cmVzICovCisjY21ha2VkZWZpbmUgREJVU19FTkFCTEVfQU5TSSAxCisjY21ha2VkZWZpbmUgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFIDEKKyNjbWFrZWRlZmluZSBEQlVTX0RJU0FCTEVfQVNTRVJUIDEKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorIyAgZGVmaW5lIERCVVNfRU5BQkxFX0FTU0VSVCAxCisjZW5kaWYKKyNjbWFrZWRlZmluZSBEQlVTX0RJU0FCTEVfQ0hFQ0tTIDEKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworIyAgZGVmaW5lIERCVVNfRU5BQkxFX0NIRUNLUyAxCisjZW5kaWYKKy8qIHhtbGRvY3MgKi8KKy8qIGRveHlnZW4gKi8KKyNjbWFrZWRlZmluZSBEQlVTX0dDT1ZfRU5BQkxFRCAxCisKKy8qIGFic3RyYWN0LXNvY2tldHMgKi8KKworI2NtYWtlZGVmaW5lIEhBVkVfQUJTVFJBQ1RfU09DS0VUUyAxCisKKyNjbWFrZWRlZmluZSBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUgMQorCisjaWYgKGRlZmluZWQgREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFKQorI2RlZmluZSBEQlVTX1BBVEhfT1JfQUJTVFJBQ1QgQERCVVNfUEFUSF9PUl9BQlNUUkFDVF9WQUxVRUAKKyNlbmRpZgorCisjaWZkZWYgREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFCisjdW5kZWYgREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFCisjZW5kaWYKKworLyogc2VsaW51eCAqLworLyoga3F1ZXVlICovCisjY21ha2VkZWZpbmUgSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUgMQorI2RlZmluZSBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAiQERCVVNfQ09OU09MRV9PV05FUl9GSUxFQCIKKworI2NtYWtlZGVmaW5lIERCVVNfSEFWRV9BVE9NSUNfSU5UIDEKKyNjbWFrZWRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisjIGRlZmluZSBEQlVTX0hBVkVfQVRPTUlDX0lOVCAxCisjIGRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfQlVJTERfWDExIDEKKy8qIEZvciB0aGUgbW9tZW50LCB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBhbiBlcXVpdmFsZW50IG9mCisgKiB0aGUgYXV0b2NvbmYgYnVpbGQgc3lzdGVtJ3MgLS1kaXNhYmxlLXgxMS1hdXRvbGF1bmNoICovCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyMgZGVmaW5lIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIIDEKKyNlbmRpZgorCisjZGVmaW5lIF9EQlVTX1ZBX0NPUFlfQVNTSUdOKGExLGEyKSB7IGExID0gYTI7IH0KKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9GVU5DCisjaWYgKGRlZmluZWQgREJVU19WQV9DT1BZX0ZVTkMpCisjIGRlZmluZSBEQlVTX1ZBX0NPUFkgQERCVVNfVkFfQ09QWV9GVU5DQAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1ZBX0NPUFlfRlVOQworI3VuZGVmIERCVVNfVkFfQ09QWV9GVU5DCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9BU19BUlJBWSBAREJVU19WQV9DT1BZX0FTX0FSUkFZQAorCisjY21ha2VkZWZpbmUgREJVU19XSVRIX0dMSUIgMQorI2NtYWtlZGVmaW5lIEdMSUJfVkVSU0lPTl9NSU5fUkVRVUlSRUQgQEdMSUJfVkVSU0lPTl9NSU5fUkVRVUlSRURACisjY21ha2VkZWZpbmUgR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEICBAR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEQAorCisvLyBoZWFkZXJzCisjY21ha2VkZWZpbmUgSEFWRV9BTExPQ0FfSAorI2NtYWtlZGVmaW5lIEhBVkVfQllURVNXQVBfSAorI2NtYWtlZGVmaW5lIEhBVkVfQ1JUX0VYVEVSTlNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBkaXJlbnQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9ESVJFTlRfSCAxCisKKyNjbWFrZWRlZmluZSBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZXJybm8uaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9FUlJOT19IIDEKKworI2NtYWtlZGVmaW5lIEhBVkVfRVhFQ0lORk9fSAorI2NtYWtlZGVmaW5lIEhBVkVfRVhQQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBncnAuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9HUlBfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGludHR5cGVzLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfSU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGxvY2FsZS5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRV9IIDEKKworI2NtYWtlZGVmaW5lIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3BvbGwuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHNpZ25hbC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NJR05BTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3RkaW50LmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU5UX0ggMQorCisjY21ha2VkZWZpbmUgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdGRpby5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NURElPX0ggMQorCisjY21ha2VkZWZpbmUgSEFWRV9TVFJJTkdTX0gKKyNjbWFrZWRlZmluZSBIQVZFX1NUUklOR19ICisjY21ha2VkZWZpbmUgSEFWRV9TWVNMT0dfSAorI2NtYWtlZGVmaW5lIEhBVkVfU1lTX0VWRU5UU19ICisjY21ha2VkZWZpbmUgSEFWRV9TWVNfSU5PVElGWV9ICisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUFJDVExfSAorI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3N5c2xpbWl0cy5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NZU19TWVNMSU1JVFNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN5cy90aW1lLmggKi8KKyNjbWFrZWRlZmluZSAgICBIQVZFX1NZU19USU1FX0ggMQorCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAorCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVUlPX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3dhaXQuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfU1lTX1dBSVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRpbWUuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB1bmlzdGQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHdzMnRjcGlwLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfV1MyVENQSVBfSAorCisvLyBzeW1ib2xzCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBiYWNrdHJhY2UgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQkFDS1RSQUNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0Z3JvdXBsaXN0ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dFVEdST1VQTElTVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdldHBlZXJ1Y3JlZCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9HRVRQRUVSVUNSRUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBuYW5vc2xlZXAgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfTkFOT1NMRUVQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0cHduYW1fciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9QT1NJWF9HRVRQV05BTV9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2V0cGFpciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TT0NLRVRQQUlSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NFVEVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHVuc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgY2xlYXJlbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQ0xFQVJFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB3cml0ZXYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2xlbl90ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NPQ0tMRU5fVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHNldGxvY2FsZSAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TRVRMT0NBTEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBsb2NhbGVjb252ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b2xsICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NUUlRPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b3VsbCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TVFJUT1VMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHBpcDIgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfUElQRTIKKworI2NtYWtlZGVmaW5lIEhBVkVfQUNDRVBUNCAxCisjY21ha2VkZWZpbmUgSEFWRV9ESVJGRCAxCisjY21ha2VkZWZpbmUgSEFWRV9JTk9USUZZX0lOSVQxIDEKKyNjbWFrZWRlZmluZSBIQVZFX1VOSVhfRkRfUEFTU0lORyAxCisKKy8vIHN0cnVjdHMKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnVjdCBjbXNncmVkICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9DTVNHQ1JFRCAxCisKKyNjbWFrZWRlZmluZSBGRF9TRVRTSVpFIEBGRF9TRVRTSVpFQAorCisjY21ha2VkZWZpbmUgREJVU19VU0VSICJAREJVU19VU0VSQCIKKyNjbWFrZWRlZmluZSBEQlVTX1RFU1RfVVNFUiAiQERCVVNfVEVTVF9VU0VSQCIKKworLy8gc3lzdGVtIHR5cGUgZGVmaW5lcworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZCAoX1dJTjMyX1dDRSkKKyMgZGVmaW5lIERCVVNfV0lOCisjIGRlZmluZSBEQlVTX1dJTl9GSVhNRSAxCisjIGlmZGVmIF9XSU4zMl9XQ0UKKyMgIGRlZmluZSBEQlVTX1dJTkNFCisjIGVsc2UKKyMgIGRlZmluZSBEQlVTX1dJTjMyCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJVU19VTklYCisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisvLyBtaW5ndyBtb2RlX3QKKyMgaWZkZWYgSEFWRV9TVERJT19ICisjICBpbmNsdWRlIDxzdGRpby5oPgorIyBlbmRpZgorIyBpZm5kZWYgX01TQ19WRVIKKyMgIGRlZmluZSB1aWRfdCBpbnQKKyMgIGRlZmluZSBnaWRfdCBpbnQKKyMgZWxzZQorIyAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorICAgdHlwZWRlZiBpbnQgbW9kZV90OworIyAgaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyMgICAgZGVmaW5lIHN0cnRvbGwgX3N0cnRvaTY0CisjICAgIGRlZmluZSBzdHJ0b3VsbCBfc3RydG91aTY0CisjICAgIGRlZmluZSBIQVZFX1NUUlRPTEwgMQorIyAgICBkZWZpbmUgSEFWRV9TVFJUT1VMTCAxCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCS8vIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKworI2lmZGVmIGludGVyZmFjZQorI3VuZGVmIGludGVyZmFjZQorI2VuZGlmCisKKyNpZm5kZWYgU0lHSFVQCisjZGVmaW5lIFNJR0hVUAkxCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfVkVSQk9TRV9DX1MgMQorI2lmZGVmIERCVVNfVkVSQk9TRV9DX1MKKyNkZWZpbmUgX2RidXNfdmVyYm9zZV9DX1MgcHJpbnRmCisjZWxzZQorI2RlZmluZSBfZGJ1c192ZXJib3NlX0NfUyBfZGJ1c192ZXJib3NlCisjZW5kaWYgCisKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoaW5saW5lKQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyNkZWZpbmUgRkRfU0VUU0laRSBARkRfU0VUU0laRUAKKyNlbmRpZgorCisjZW5kaWYgIC8vIF9EQlVTX0NPTkZJR19ICmRpZmYgLS1naXQgYS9jbWFrZS9kYnVzLWVudi5iYXQuY21ha2UgYi9jbWFrZS9kYnVzLWVudi5iYXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1OWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZQpAQCAtMCwwICsxLDggQEAKKzo6IGVudmlyb25tZW50IHNldHRpbmcgZm9yIGRidXMgY2xpZW50cworQGVjaG8gb2ZmCisKKzo6IHNlc3Npb24gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9QERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTQAorCis6OiBzeXN0ZW0gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTPUBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQApkaWZmIC0tZ2l0IGEvY21ha2UvZGJ1cy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMTQwOAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMjYgQEAKK1NFVChEQlVTX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RidXMpCisKK2NvbmZpZ3VyZV9maWxlKCR7REJVU19ESVJ9L2RidXMtYXJjaC1kZXBzLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2RidXMtYXJjaC1kZXBzLmggKQorCithZGRfZGVmaW5pdGlvbnMoLUREQlVTX0NPTVBJTEFUSU9OKQorCitzZXQgKGRidXNpbmNsdWRlX0hFQURFUlMKKwkke0RCVVNfRElSfS9kYnVzLmgKKwkke0RCVVNfRElSfS9kYnVzLWFkZHJlc3MuaAorCSR7REJVU19ESVJ9L2RidXMtYnVzLmgKKwkke0RCVVNfRElSfS9kYnVzLWNvbm5lY3Rpb24uaAorCSR7REJVU19ESVJ9L2RidXMtZXJyb3JzLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hY3Jvcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZW1vcnkuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1taXNjLmgKKwkke0RCVVNfRElSfS9kYnVzLXBlbmRpbmctY2FsbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1wcm90b2NvbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXIuaAorCSR7REJVU19ESVJ9L2RidXMtc2hhcmVkLmgKKwkke0RCVVNfRElSfS9kYnVzLXNpZ25hdHVyZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zeW50YXguaAorCSR7REJVU19ESVJ9L2RidXMtdGhyZWFkcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy10eXBlcy5oCisJZGJ1cy1hcmNoLWRlcHMuaAorKQorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBhbmQgaXMgc3BlY2lmaWMgdG8gbGlicmFyeSBmdW5jdGlvbmFsaXR5CitzZXQgKERCVVNfTElCX1NPVVJDRVMKKwkke0RCVVNfRElSfS9kYnVzLWFkZHJlc3MuYworCSR7REJVU19ESVJ9L2RidXMtYXV0aC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1idXMuYworCSR7REJVU19ESVJ9L2RidXMtY29ubmVjdGlvbi5jCisJJHtEQlVTX0RJUn0vZGJ1cy1jcmVkZW50aWFscy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1lcnJvcnMuYworCSR7REJVU19ESVJ9L2RidXMta2V5cmluZy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWhlYWRlci5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1taXNjLmMKKwkke0RCVVNfRElSfS9kYnVzLW5vbmNlLmMKKwkke0RCVVNfRElSfS9kYnVzLW9iamVjdC10cmVlLmMKKwkke0RCVVNfRElSfS9kYnVzLXBlbmRpbmctY2FsbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1yZXNvdXJjZXMuYworCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLmMKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1zb2NrZXQuYworCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYworCSR7REJVU19ESVJ9L2RidXMtc2hhLmMKKwkke0RCVVNfRElSfS9kYnVzLXNpZ25hdHVyZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zeW50YXguYworCSR7REJVU19ESVJ9L2RidXMtdGltZW91dC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLmMKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMKKwkke0RCVVNfRElSfS9kYnVzLXdhdGNoLmMKKykKKworCitpZihVTklYKQorCXNldCAoREJVU19MSUJfU09VUkNFUyAke0RCVVNfTElCX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItdW5peC5jCisJKQorZWxzZShVTklYKQorCXNldCAoREJVU19MSUJfU09VUkNFUyAke0RCVVNfTElCX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci13aW4uYworCSkKK2VuZGlmKFVOSVgpCisKK3NldCAoREJVU19MSUJfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtYXV0aC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLmgKKwkke0RCVVNfRElSfS9kYnVzLWtleXJpbmcuaAorCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1oZWFkZXIuaAorCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1wcml2YXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuaAorCSR7REJVU19ESVJ9L2RidXMtb2JqZWN0LXRyZWUuaAorCSR7REJVU19ESVJ9L2RidXMtcHJvdG9jb2wuaAorCSR7REJVU19ESVJ9L2RidXMtcmVzb3VyY2VzLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXVuaXguaAorCSR7REJVU19ESVJ9L2RidXMtc2hhLmgKKwkke0RCVVNfRElSfS9kYnVzLXRpbWVvdXQuaAorCSR7REJVU19ESVJ9L2RidXMtdGhyZWFkcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLWludGVybmFsLmgKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC5oCisJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgKKwkke0RCVVNfRElSfS9kYnVzLXdhdGNoLmgKKwkke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbmZpZy5oCispCitpZihVTklYKQorCXNldCAoREJVU19MSUJfSEVBREVSUyAke0RCVVNfTElCX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmgKKwkpCitlbHNlKFVOSVgpCisJc2V0IChEQlVTX0xJQl9IRUFERVJTICR7REJVU19MSUJfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXdpbi5oCisJKQorZW5kaWYoVU5JWCkKKworCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBBTkQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUgCisjIyMgZGFlbW9uIG9yIHRlc3QgcHJvZ3JhbXMgKGFsbCBzeW1ib2xzIGluIGhlcmUgc2hvdWxkIAorIyMjIGJlIHVuZGVyc2NvcmUtcHJlZml4ZWQpCitzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMKKwkke0RCVVNfRElSfS9kYnVzLWRhdGFzbG90LmMKKwkke0RCVVNfRElSfS9kYnVzLWZpbGUuYworCSR7REJVU19ESVJ9L2RidXMtaGFzaC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1pbnRlcm5hbHMuYworCSR7REJVU19ESVJ9L2RidXMtbGlzdC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJhc2ljLmMKKwkke0RCVVNfRElSfS9kYnVzLW1lbW9yeS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZW1wb29sLmMKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLmMKKwkke0RCVVNfRElSfS9kYnVzLXBpcGUuYworKQorCitzZXQgKERCVVNfU0hBUkVEX0hFQURFUlMKKwkke0RCVVNfRElSfS9kYnVzLWRhdGFzbG90LmgKKwkke0RCVVNfRElSfS9kYnVzLWZpbGUuaAorCSR7REJVU19ESVJ9L2RidXMtaGFzaC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1pbnRlcm5hbHMuaAorCSR7REJVU19ESVJ9L2RidXMtbGlzdC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJhc2ljLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lbXBvb2wuaAorCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLmgKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy1wcml2YXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLXBpcGUuaAorCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy5oCispCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQKKyMjIyBieSB0aGUgYnVzIGRhZW1vbiBvciB0ZXN0IGFwcHMsIGJ1dCBpcyBOT1QgaW5jbHVkZWQKKyMjIyBpbiB0aGUgRC1CVVMgY2xpZW50IGxpYnJhcnkgKGFsbCBzeW1ib2xzIGluIGhlcmUgCisjIyMgc2hvdWxkIGJlIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnV0IGRvbid0IHJlYWxseSBuZWVkIAorIyMjIHRvIGJlIHVubGVzcyB0aGV5IG1vdmUgdG8gREJVU19TSEFSRURfU09VUkNFUyBsYXRlcikKK3NldCAoREJVU19VVElMX1NPVVJDRVMKKwkke0RCVVNfRElSfS9kYnVzLWFzdi11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLWF1dGgtc2NyaXB0LmMKKwkke0RCVVNfRElSfS9kYnVzLWF1dGgtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1haW5sb29wLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYworCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLXNoZWxsLmMKKwkke0RCVVNfRElSfS9kYnVzLXNvY2tldC1zZXQuYworCSR7REJVU19ESVJ9L2RidXMtc29ja2V0LXNldC1wb2xsLmMKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC5jCispCisKK2lmIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKwlzZXQgKERCVVNfVVRJTF9TT1VSQ0VTIAorCQkke0RCVVNfVVRJTF9TT1VSQ0VTfQorCQkke0RCVVNfRElSfS9kYnVzLXRlc3QuYworCSkKK2VuZGlmIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKworc2V0IChEQlVTX1VUSUxfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtYXN2LXV0aWwuaAorCSR7REJVU19ESVJ9L2RidXMtYXV0aC1zY3JpcHQuaAorCSR7REJVU19ESVJ9L2RidXMtbWFpbmxvb3AuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1mYWN0b3J5LmgKKwkke0RCVVNfRElSfS9kYnVzLXNoZWxsLmgKKwkke0RCVVNfRElSfS9kYnVzLXNvY2tldC1zZXQuaAorCSR7REJVU19ESVJ9L2RidXMtc3Bhd24uaAorCSR7REJVU19ESVJ9L2RidXMtdGVzdC5oCispCisKKyMjIyBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncworaWYgKFdJTjMyKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLWZpbGUtd2luLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1pbml0LXdpbi5jcHAKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtcGlwZS13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXNvY2tldHMtd2luLmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbi5oCisJKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYworCSkKKwlpZihXSU5DRSkKKwlzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMgJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfQorCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9CisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmgKKwkpCisJZW5kaWYoV0lOQ0UpCitlbHNlIChXSU4zMikKKwlzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMgJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfSAKKwkJJHtEQlVTX0RJUn0vZGJ1cy1maWxlLXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXBpcGUtdW5peC5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi5jCisJKQorCXNldCAoREJVU19TSEFSRURfSEVBREVSUyAke0RCVVNfU0hBUkVEX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtdW5peC5oCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy11c2VyZGIuaAorCSkKKwlzZXQgKERCVVNfVVRJTF9TT1VSQ0VTICR7REJVU19VVElMX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtc3Bhd24uYworCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi11dGlsLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCisJKQorZW5kaWYgKFdJTjMyKQorCitzZXQobGliZGJ1c19TT1VSQ0VTCisJJHtEQlVTX0xJQl9TT1VSQ0VTfQorCSR7REJVU19TSEFSRURfU09VUkNFU30KKykKKworc2V0KGxpYmRidXNfSEVBREVSUyAKKwkke0RCVVNfTElCX0hFQURFUlN9CisJJHtEQlVTX1NIQVJFRF9IRUFERVJTfQorKQoraWYgKE1TVkMpCisgICAgc2V0IChCVUlMRF9GSUxFVkVSU0lPTiAke0RCVVNfTUFKT1JfVkVSU0lPTn0sJHtEQlVTX01JTk9SX1ZFUlNJT059LCR7REJVU19NSUNST19WRVJTSU9OfSwke0RCVVNfUEFUQ0hfVkVSU0lPTn0pCisgICAgc2V0IChCVUlMRF9USU1FU1RBTVAgJHtEQlVTX0JVSUxEX1RJTUVTVEFNUH0pCisgICAgCisgICAgY29uZmlndXJlX2ZpbGUoJHtEQlVTX0RJUn0vdmVyc2lvbmluZm8ucmMuaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb25pbmZvLnJjKQorICAgIGZpbGUoV1JJVEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FmeHJlcy5oICIiKQorICAgIGxpc3QoQVBQRU5EIGxpYmRidXNfU09VUkNFUyB2ZXJzaW9uaW5mby5yYykKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXModmVyc2lvbmluZm8ucmMgQ09NUElMRV9GTEFHUyAiLURfX0xJTkVfXz0xIikKK2VuZGlmIChNU1ZDKQorCitpZihNU1ZDX0lERSkKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfTElCX1NPVVJDRVMgREJVU19MSUJfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfU0hBUkVEX1NPVVJDRVMgREJVU19TSEFSRURfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfVVRJTF9TT1VSQ0VTIERCVVNfVVRJTF9TT1VSQ0VTKQorZW5kaWYoTVNWQ19JREUpCisKKyMjIyBDbGllbnQgbGlicmFyeQorCithZGRfbGlicmFyeShkYnVzLTEgU0hBUkVECisJCQkke2xpYmRidXNfU09VUkNFU30KKwkJCSR7bGliZGJ1c19IRUFERVJTfQorKQoraWYoREVGSU5FRCBEQlVTX0xJQlJBUllfUkVWSVNJT04pCisgICAgbWF0aChFWFBSIERCVVNfTElCUkFSWV9NQUpPUiAiJHtEQlVTX0xJQlJBUllfQ1VSUkVOVH0gLSAke0RCVVNfTElCUkFSWV9BR0V9IikKK2VuZGlmKCkKKworaWYoV0lOMzIpCisgICAgaWYoREVGSU5FRCBEQlVTX0xJQlJBUllfUkVWSVNJT04pCisgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLTEgUFJPUEVSVElFUyBTVUZGSVggIi0ke0RCVVNfTElCUkFSWV9NQUpPUn0ke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0iKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIGRidXMtMSBQT1NUX0JVSUxECisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAiJDxUQVJHRVRfRklMRTpkYnVzLTE+IiAiJDxUQVJHRVRfRklMRV9ESVI6ZGJ1cy0xPi8ke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1BSRUZJWH1kYnVzLTEke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0iCisgICAgICAgICAgICBDT01NRU5UICJDcmVhdGUgbm9uIHZlcnNpb25lZCBkYnVzLTEgbGlicmFyeSBmb3IgbGVnYWN5IGFwcGxpY2F0aW9ucyIKKyAgICAgICAgKQorICAgICAgICBpbnN0YWxsKEZJTEVTICR7TEVHQUNZX0ZJTEVfTkFNRX0gREVTVElOQVRJT04gYmluKQorICAgIGVuZGlmKCkKKyAgICBpZihXSU5DRSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtMSB3czIpCisgICAgZWxzZShXSU5DRSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtMSB3czJfMzIgYWR2YXBpMzIgbmV0YXBpMzIgaXBobHBhcGkpCisgICAgZW5kaWYoV0lOQ0UpCitlbHNlKFdJTjMyKQorICAgIGlmKERFRklORUQgREJVU19MSUJSQVJZX1JFVklTSU9OKQorICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy0xIFBST1BFUlRJRVMgVkVSU0lPTiAke0RCVVNfTElCUkFSWV9NQUpPUn0uJHtEQlVTX0xJQlJBUllfQUdFfS4ke0RCVVNfTElCUkFSWV9SRVZJU0lPTn0gU09WRVJTSU9OICR7REJVU19MSUJSQVJZX01BSk9SfSkKKyAgICBlbmRpZigpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtMSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IHJ0KQorZW5kaWYoV0lOMzIpCisKKyMgQXNzdW1lIHRoYXQgTGludXggaGFzIC1XbCwtLXZlcnNpb24tc2NyaXB0IGFuZCBvdGhlciBwbGF0Zm9ybXMgZG8gbm90CitpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIFNUUkVRVUFMICJMaW51eCIpCisgICAgc2V0KFNPVkVSU0lPTiAke0RCVVNfTElCUkFSWV9NQUpPUn0pCisgICAgY29uZmlndXJlX2ZpbGUoJHtEQlVTX0RJUn0vVmVyc2lvbi5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVmVyc2lvbikKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy0xIFBST1BFUlRJRVMgTElOS19GTEFHUyAtV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVmVyc2lvbikKK2VuZGlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgU1RSRVFVQUwgIkxpbnV4IikKKworaW5zdGFsbChUQVJHRVRTIGRidXMtMSAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQoraW5zdGFsbF9maWxlcygvaW5jbHVkZS9kYnVzIEZJTEVTICR7ZGJ1c2luY2x1ZGVfSEVBREVSU30pCisKKyMjIyBJbnRlcm5hbCBsaWJyYXJ5LCB1c2VkIGZvciB0aGUgZGFlbW9uLCB0b29scyBhbmQgdGVzdHMsIGNvbXBpbGVkIHN0YXRpY2FsbHkuCisKK2FkZF9saWJyYXJ5KGRidXMtaW50ZXJuYWwgJHtEQlVTX0lOVEVSTkFMX0FERF9MSUJSQVJZX09QVElPTlN9CisJCQkke0RCVVNfVVRJTF9TT1VSQ0VTfQorCQkJJHtEQlVTX1VUSUxfSEVBREVSU30KKykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWludGVybmFsIGRidXMtMSkKK2lmKFdJTjMyKQorICAgIGlmKFdJTkNFKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCB3czIpCisgICAgZWxzZShXSU5DRSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtaW50ZXJuYWwgd3MyXzMyIGFkdmFwaTMyIG5ldGFwaTMyIGlwaGxwYXBpKQorICAgIGVuZGlmKFdJTkNFKQorZWxzZShXSU4zMikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IHJ0KQorZW5kaWYoV0lOMzIpCisKK2lmIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKwlhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtZGJ1cyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RidXMvZGJ1cy10ZXN0LW1haW4uYyAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKKwlzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGVzdC1kYnVzIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKK0VORElGIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKworaWYgKFVOSVgpCisjIHNldCB2ZXJzaW9uIGluZm8KK0VORElGIChVTklYKQorCisKKyMjIG1vcCB1cCB0aGUgZ2NvdiBmaWxlcworI2NsZWFuLWxvY2FsOgorIy9iaW4vcm0gKi5iYiAqLmJiZyAqLmRhICouZ2NvdiAubGlicy8qLmRhIC5saWJzLyouYmJnIHx8IHRydWUKZGlmZiAtLWdpdCBhL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFlODRlCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvZG9jL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTc1IEBACitmaW5kX3BhY2thZ2UoRG94eWdlbikKKworaWYoRE9YWUdFTl9FWEVDVVRBQkxFKQorICBPUFRJT04oREJVU19FTkFCTEVfRE9YWUdFTl9ET0NTICJidWlsZCBET1hZR0VOIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIERveHlnZW4pIiBPTikKK2VuZGlmKERPWFlHRU5fRVhFQ1VUQUJMRSkKKworaWYgKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUykKKyAgICBzZXQgKHRvcF9zcmNkaXIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKyAgICBjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL0RveHlmaWxlLmluICR7Q01BS0VfQklOQVJZX0RJUn0vRG94eWZpbGUgKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGRvYyAKKyAgICAgICAgQ09NTUFORCAke0RPWFlHRU5fRVhFQ1VUQUJMRX0gJHtDTUFLRV9CSU5BUllfRElSfS9Eb3h5ZmlsZQorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgKQorZW5kaWYgKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUykKKworIworIyBmaW5kIGRvY2Jvb2sgZ2VuZXJhdG9yCisjIAorZmluZF9wcm9ncmFtKE1FSU5QUk9DNF9FWEVDVVRBQkxFIG1laW5wcm9jNCkKKworZmluZF9wcm9ncmFtKFhNTFRPX0VYRUNVVEFCTEUgeG1sdG8pCisKK2ZpbmRfcHJvZ3JhbShDWUdQQVRIX0VYRUNVVEFCTEUgY3lncGF0aCkKKworaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFIE9SIFhNTFRPX0VYRUNVVEFCTEUpCisgIE9QVElPTihEQlVTX0VOQUJMRV9YTUxfRE9DUyAiYnVpbGQgWE1MICBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyB4bWx0byBvciBtZWlucHJvYzQpIiBPTikKKyAgQUREX0NVU1RPTV9UQVJHRVQoeG1sZG9jIEFMTCkKK2VuZGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSBPUiBYTUxUT19FWEVDVVRBQkxFKQorCitpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKwlzZXQgKERPQ0JPT0tfR0VORVJBVE9SX05BTUUgInhtbHRvIiBQQVJFTlRfU0NPUEUpCisJc2V0KERCVVNfWE1MX0RPQ1NfRU5BQkxFRCAxKQorCXNldChNRUlOUFJPQzRfRVhFQ1VUQUJMRSAwKQorCU1FU1NBR0UoU1RBVFVTICJ4bWx0byBkb2Nib29rIGdlbmVyYXRvciBmb3VuZCIpCisJc2V0KFNUWUxFU0hFRVRfTUFOICIke0RPQ0JPT0tYU0xfRElSfS9tYW5wYWdlcy9kb2Nib29rLnhzbCIpCisJc2V0KFNUWUxFU0hFRVRfSFRNTCAiJHtET0NCT09LWFNMX0RJUn0vaHRtbC9kb2Nib29rLnhzbCIpCisKK2Vsc2VpZiAoTUVJTlBST0M0X0VYRUNVVEFCTEUpCisJc2V0KERPQ0JPT0tfR0VORVJBVE9SX05BTUUgIm1laW5wcm9jNCIgUEFSRU5UX1NDT1BFKQorCXNldChEQlVTX1hNTF9ET0NTX0VOQUJMRUQgMSkKKwlpZihXSU4zMikKKwkJZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfYSAke01FSU5QUk9DNF9FWEVDVVRBQkxFfSBQQVRIKQorCQlnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9tZWlucHJvY19pbnN0YWxsX3BhdGggJHtfYX0gUEFUSCkKKwkJc2V0KFNUWUxFU0hFRVRfSFRNTCAiJHtfbWVpbnByb2NfaW5zdGFsbF9wYXRofS9zaGFyZS9hcHBzL2tzZ21sdG9vbHMyL2RvY2Jvb2sveHNsL2h0bWwvZG9jYm9vay54c2wiKQorCWVsc2UoV0lOMzIpCisJCXNldChTVFlMRVNIRUVUX0hUTUwgZmlsZTovLy91c3Ivc2hhcmUva2RlNC9hcHBzL2tzZ21sdG9vbHMyL2N1c3RvbWl6YXRpb24va2RlLW5vY2h1bmsueHNsKQorCWVuZGlmKFdJTjMyKQorZW5kaWYgKCkKKworaWYgKERCVVNfRU5BQkxFX1hNTF9ET0NTKQorCittYWNybyAoRE9DQk9PSyBfc291cmNlcyBfZm9ybWF0KQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9pbmZpbGUgJHtfc291cmNlc30gQUJTT0xVVEUpCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoX25hbWUgJHtfaW5maWxlfSBOQU1FKQorICBzZXQoX2RlcHMgJHtDTUFLRV9TT1VSQ0VfRElSfS9DTWFrZUxpc3RzLnR4dCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2VMaXN0cy50eHQpCisKKyAgaWYgKCR7X2Zvcm1hdH0gU1RSRVFVQUwgIm1hbiIpCisgICAgc3RyaW5nKFJFUExBQ0UgIi54bWwiICIiIF9vdXRuYW1lICR7X25hbWV9KQorICAgIHNldChTVFlMRVNIRUVUICR7U1RZTEVTSEVFVF9NQU59KQorICBlbHNlKCkKKyAgICBzdHJpbmcoUkVQTEFDRSAiLnhtbCIgIi5odG1sIiBfb3V0bmFtZSAke19uYW1lfSkKKyAgICBzZXQoU1RZTEVTSEVFVCAke1NUWUxFU0hFRVRfSFRNTH0pCisgIGVuZGlmICgpCisKKyAgc2V0KF9vdXRmaWxlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke19vdXRuYW1lfSkKKyAgaWYgKEVYSVNUUyAke19zb3VyY2VzfSkKKwkgIGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSkKKwkJICAgIEFERF9DVVNUT01fQ09NTUFORCgKKwkJCU9VVFBVVCAke19vdXRmaWxlfQorCQkJQ09NTUFORCAke01FSU5QUk9DNF9FWEVDVVRBQkxFfSAtLXN0eWxlc2hlZXQgJHtTVFlMRVNIRUVUfSAtbyAke19vdXRmaWxlfSAke19pbmZpbGV9CisJCQlERVBFTkRTICR7X2luZmlsZX0gJHtTVFlMRVNIRUVUfSAke19kZXBzfQorCQkJV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisJCSkKKwkgIGVuZGlmICgpCisJICBpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKwkJICAgIGlmIChNU1lTKQorCQkJaWYgKENZR1BBVEhfRVhFQ1VUQUJMRSkKKwkJCSAgICBleGVjdXRlX3Byb2Nlc3MoCisJCQkJQ09NTUFORCBjeWdwYXRoICR7X2luZmlsZX0KKwkJCQlPVVRQVVRfVkFSSUFCTEUgX2luZmlsZSkKKwkJCWVsc2UgKCkKKwkJCSAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBkaXJuYW1lICR7X2luZmlsZX0gIE9VVFBVVF9WQVJJQUJMRSBfcGF0aCkKKwkJCSAgICBzdHJpbmcoU1RSSVAgJHtfcGF0aH0gX3BhdGgpCisJCQkgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgc2ggLWMgImNkICR7X3BhdGh9OyBwd2QgLVciIE9VVFBVVF9WQVJJQUJMRSBfcGF0aCkKKwkJCSAgICBzdHJpbmcoU1RSSVAgJHtfcGF0aH0gX3BhdGgpCisJCQkgICAgc2V0KF9pbmZpbGUgIiR7X3BhdGh9LyR7X25hbWV9IikKKwkJCWVuZGlmKENZR1BBVEhfRVhFQ1VUQUJMRSkKKwkJICAgIGVuZGlmIChNU1lTKQorCQkgICAgQUREX0NVU1RPTV9DT01NQU5EKAorCQkJT1VUUFVUICR7X291dGZpbGV9CisJCQlDT01NQU5EICR7WE1MVE9fRVhFQ1VUQUJMRX0gLXZ2ICR7X2Zvcm1hdH0gJHtfaW5maWxlfQorCQkJREVQRU5EUyAke19pbmZpbGV9ICR7X2RlcHN9CisJCQlXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKwkJKQorCSAgZW5kaWYgKCkKKwkgIGlmICgke19mb3JtYXR9IFNUUkVRVUFMICJtYW4iKQorCQkgIGluc3RhbGwoRklMRVMgJHtfb3V0ZmlsZX0gREVTVElOQVRJT04gc2hhcmUvbWFuL21hbjEpCisJICBlbHNlICgpCisJCSAgaW5zdGFsbChGSUxFUyAke19vdXRmaWxlfSBERVNUSU5BVElPTiBzaGFyZS9kb2MvZGJ1cykKKwkgIGVuZGlmICgpCisgIGVsc2UgKCkKKwkgIE1FU1NBR0UoU1RBVFVTICJza2lwcGluZyB4bWwgZG9jIGdlbmVyYXRpbmcgZm9yICR7X2luZmlsZX0sIGZpbGUgbm90IGZvdW5kIikKKyAgZW5kaWYgKCkKKyAgQUREX0NVU1RPTV9UQVJHRVQoJHtfb3V0bmFtZX0gREVQRU5EUyAke19vdXRmaWxlfSkKKyAgQUREX0RFUEVOREVOQ0lFUyh4bWxkb2MgJHtfb3V0bmFtZX0pCitlbmRtYWNybyAoRE9DQk9PSykKKworIyMjIGNvcHkgdGVzdHMgdG8gYnVpbGRkaXIgc28gdGhhdCBnZW5lcmF0ZWQgdGVzdHMgYW5kIHN0YXRpYyB0ZXN0cyAKKyMjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KKyMjIyB0b2RvIGhvdyB0byBhZGQgbW9yZSBmaWxldHlwZXMgCitNQUNSTyAoQ09QWURJUiBfc3JjIF90eXBlKQorICAgIEZPUkVBQ0goRklMRV9UWVBFICR7X3R5cGV9KQorICAgIAlGT1JFQUNIKERJUiAke19zcmN9KQorICAgIAkJRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7RElSfS8ke0ZJTEVfVFlQRX0iICkKKyAgICAJCUZJTEUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0pCisgICAgCQlGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgCQkJR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgCQkJU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgCQkJY29uZmlndXJlX2ZpbGUoJHtGSUxFfSAke1RBUkdFVH0gQ09QWU9OTFkpCisgICAgCQkJSUYgKENPTkZJR19WRVJCT1NFKQorICAgIAkJCQlNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorICAgIAkJCUVORElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAJCUVOREZPUkVBQ0goRklMRSkKKyAgICAJRU5ERk9SRUFDSChESVIpCisgICAgRU5ERk9SRUFDSChGSUxFX1RZUEUpCitFTkRNQUNSTyAoQ09QWURJUikKKworQ09QWURJUihkb2MgKi5wbmcpCitDT1BZRElSKGRvYyAqLnN2ZykKKworRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy10dXRvcmlhbC54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLWZhcS54bWwgaHRtbC1ub2NodW5rcykKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1kYWVtb24uMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCkKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtbW9uaXRvci4xLnhtbC5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLW1vbml0b3IuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXNlbmQuMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1zZW5kLjEueG1sKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXV1aWRnZW4uMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWRhZW1vbi4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLW1vbml0b3IuMS54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1zZW5kLjEueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdGVzdC10b29sLjEueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdXVpZGdlbi4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sIGh0bWwtbm9jaHVua3MpCitpZiAoVU5JWCkKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWRhZW1vbi4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1tb25pdG9yLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLXNlbmQuMS54bWwgbWFuKQorICBET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdGVzdC10b29sLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC4xLnhtbCBtYW4pCitlbmRpZigpCisjCisjIGhhbmRsZSBodG1sIGluZGV4IGZpbGUKKyMKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmRleC5odG1sLmNtYWtlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmRleC5odG1sICkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luZGV4Lmh0bWwgREVTVElOQVRJT04gc2hhcmUvZG9jL2RidXMpCisKK3NldCAoRVhUUkFfRElTVCAJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvYnVzY29uZmlnLmR0ZAkJCQorCSR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2ludHJvc3BlY3QuZHRkCQkJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvaW50cm9zcGVjdC54c2wKKykKKworaW5zdGFsbChGSUxFUyAke0VYVFJBX0RJU1R9IERFU1RJTkFUSU9OIHNoYXJlL2RvYy9kYnVzKQorCitlbmRpZihEQlVTX0VOQUJMRV9YTUxfRE9DUykKZGlmZiAtLWdpdCBhL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlIGIvY21ha2UvZG9jL2luZGV4Lmh0bWwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZDY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlCkBAIC0wLDAgKzEsNTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RC1CdXMgRG9jdW1lbnRhdGlvbiBJbmRleDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5ELUJ1cyBEb2N1bWVudGF0aW9uIEluZGV4PC9oMT4KKzxwPlZlcnNpb24gQERCVVNfVkVSU0lPTl9TVFJJTkdAPC9wPgorCis8dGFibGU+CisgPHRyPgorICA8dGggd2lkdGg9MTAlPgorICA8L3RoPgorICA8dGggd2lkdGg9MzAlIGFsaWduPWxlZnQ+CisgICBnZW5lcmljIGRvY3VtZW50YXRpb24KKyAgPC90aD4KKyAgPHRoIHdpZHRoPTMwJSBhbGlnbj1sZWZ0PgorYXBwbGljYXRpb24gbWFudWFscworICA8L3RoPgorIDwvdHI+CisgPHRyPgorICA8dGQgdmFsaWduPXRvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3A+Cis8YSBocmVmPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciPkQtQnVzIFdlYnNpdGU8L2E+CisgIDxicj4KKyAgPGJyPgorPGEgaHJlZj0iZGJ1cy10dXRvcmlhbC5odG1sIj5ELUJ1cyBUdXRvcmlhbDwvYT4KKyAgPGJyPgorICA8YnI+Cis8YSBocmVmPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCI+RC1CdXMgU3BlY2lmaWNhdGlvbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtZmFxLmh0bWwiPkQtQnVzIEZBUTwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtdGVzdC1wbGFuLmh0bWwiPkQtQnVzIFRlc3QgUGxhbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKyAgPC90ZD4KKyAgPHRkICB2YWxpZ249dG9wPgorPGEgaHJlZj0iZGJ1cy1kYWVtb24uaHRtbCI+RC1CdXMgRGFlbW9uIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbGF1bmNoLmh0bWwiPkQtQnVzIGxhdW5jaCBtYW51YWw8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLXNlbmQuaHRtbCI+RC1CdXMgc2VuZCB0b29sIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbW9uaXRvci5odG1sIj5ELUJ1cyBtb25pdG9yIG1hbnVhbDwvYT4KKyAgPC90ZD4KKyA8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NtYWtlL2k2ODYtdzY0LW1pbmd3MzIuY21ha2UgYi9jbWFrZS9pNjg2LXc2NC1taW5ndzMyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTRlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9pNjg2LXc2NC1taW5ndzMyLmNtYWtlCkBAIC0wLDAgKzEsMjAgQEAKKyMgVG9vbGNoYWluIGZvciBtaW5ndy13NjQgMzItYml0IGNvbXBpbGVycywgYXMgc2hpcHBlZCBpbiBEZWJpYW4vVWJ1bnR1LgorCitzZXQoR05VX0hPU1QgaTY4Ni13NjQtbWluZ3czMikKK3NldChDTUFLRV9TWVNURU1fUFJPQ0VTU09SICJpNjg2IikKKworc2V0KENPTVBJTEVSX1BSRUZJWCAiJHtHTlVfSE9TVH0tIikKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FICJXaW5kb3dzIikKK3NldChDTUFLRV9DUk9TU0NPTVBJTElORyBUUlVFKQorc2V0KFdJTjMyIFRSVUUpCitzZXQoTUlOR1cgVFJVRSkKKworaW5jbHVkZShDTWFrZUZvcmNlQ29tcGlsZXIpCitjbWFrZV9mb3JjZV9jX2NvbXBpbGVyKCR7Q09NUElMRVJfUFJFRklYfWdjYyBHTlUpCitjbWFrZV9mb3JjZV9jeHhfY29tcGlsZXIoJHtDT01QSUxFUl9QUkVGSVh9ZysrIEdOVSkKK3NldChDTUFLRV9SQ19DT01QSUxFUiAke0NPTVBJTEVSX1BSRUZJWH13aW5kcmVzKQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DT1BZSU5HLUNNQUtFLVNDUklQVFMgYi9jbWFrZS9tb2R1bGVzL0NPUFlJTkctQ01BS0UtU0NSSVBUUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I2YjcxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9DT1BZSU5HLUNNQUtFLVNDUklQVFMKQEAgLTAsMCArMSwyMiBAQAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9DUGFja0luc3RhbGxDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiNjY4OQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsMzcgQEAKKworaWYgKERCVVNfSU5TVEFMTF9TWVNURU1fTElCUykKKwlpZiAoTUlOR1cpCisJCWluc3RhbGxfZmlsZXMoL2JpbiBGSUxFUyAke0xJQkVYUEFUX0xJQlJBUklFU30pCisJZWxzZSAoTUlOR1cpCisJCUlOQ0xVREUoSW5zdGFsbFJlcXVpcmVkU3lzdGVtTGlicmFyaWVzKQorCWVuZGlmIChNSU5HVykKK2VuZGlmIChEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlMpCisKK1NFVChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkQtQlVTIEZvciBXaW5kb3dzIikKK1NFVChDUEFDS19QQUNLQUdFX1ZFTkRPUiAiRC1CVVMgV2luZG93cyBUZWFtIikKK1NFVChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX0ZJTEUgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vUkVBRE1FIikKK1NFVChDUEFDS19SRVNPVVJDRV9GSUxFX0xJQ0VOU0UgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vQ09QWUlORyIpCisjIGR1cGxpY2F0ZWQgZnJvbSBWRVJTSU9OCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01BSk9SICR7VkVSU0lPTl9NQUpPUn0pCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7VkVSU0lPTl9NSU5PUn0pCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX1BBVENIICR7VkVSU0lPTl9QQVRDSH0pCisjU0VUKENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgImRidXMgJHtDTWFrZV9WRVJTSU9OX01BSk9SfS4ke0NNYWtlX1ZFUlNJT05fTUlOT1J9IikKK1NFVChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJkYnVzIikKK0lGKFdJTjMyIEFORCBOT1QgVU5JWCkKKyAgU0VUKENQQUNLX0dFTkVSQVRPUiBOU0lTIFpJUCkgICAgICMgY2FuIGJlIE5TSVMsIFNUR1osIFRCWjIsIFRHWiwgVFogYW5kIFpJUAorICBTRVQoQ1BBQ0tfTlNJU19DT01QUkVTU09SICIvU09MSUQgbHptYSIpCisgICMgVGhlcmUgaXMgYSBidWcgaW4gTlNJIHRoYXQgZG9lcyBub3QgaGFuZGxlIGZ1bGwgdW5peCBwYXRocyBwcm9wZXJseS4gTWFrZQorICAjIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHNldCBvZiBmb3VyICg0KSBiYWNrbGFzc2hlcy4KKyMgU0VUKENQQUNLX1BBQ0tBR0VfSUNPTiAiJHtDTWFrZV9TT1VSQ0VfRElSfS9VdGlsaXRpZXMvUmVsZWFzZVxcXFxJbnN0YWxsSWNvbi5ibXAiKQorICBTRVQoQ1BBQ0tfTlNJU19JTlNUQUxMRURfSUNPTl9OQU1FICJiaW5cXFxcZGJ1cy1sYXVuY2guYmF0IikKKyAgU0VUKENQQUNLX05TSVNfRElTUExBWV9OQU1FICJELUJ1cyBmb3IgV2luZG93cyIpCisgIFNFVChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDpcXFxcXFxcXHNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5kYnVzIikKKyAgU0VUKENQQUNLX05TSVNfVVJMX0lORk9fQUJPVVQgImh0dHA6XFxcXFxcXFxzb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZGJ1cyIpCisgIFNFVChDUEFDS19OU0lTX0NPTlRBQ1QgIm1lQG15LXBlcnNvbmFsLWhvbWUtcGFnZS5jb20iKQorICBTRVQoQ1BBQ0tfTlNJU19NT0RJRllfUEFUSCBPTikKK0VMU0UoV0lOMzIgQU5EIE5PVCBVTklYKQorICBTRVQoQ1BBQ0tfU1RSSVBfRklMRVMgImJpbi9NeUV4ZWN1dGFibGUiKQorICBTRVQoQ1BBQ0tfU09VUkNFX1NUUklQX0ZJTEVTICIiKQorRU5ESUYoV0lOMzIgQU5EIE5PVCBVTklYKQorU0VUKENQQUNLX1BBQ0tBR0VfRVhFQ1VUQUJMRVMgImRidXMtbGF1bmNoIiAiRC1CdXMgRGFlbW9uIikKK0lOQ0xVREUoQ1BhY2spCmRpZmYgLS1naXQgYS9jbWFrZS9tb2R1bGVzL0NoZWNrRm9yQWJzdHJhY3RTb2NrZXRzLmMgYi9jbWFrZS9tb2R1bGVzL0NoZWNrRm9yQWJzdHJhY3RTb2NrZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyYjg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ2hlY2tGb3JBYnN0cmFjdFNvY2tldHMuYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IG1haW4oKSB7CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworCisgIGxpc3Rlbl9mZCA9IHNvY2tldCAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCisgIGlmIChsaXN0ZW5fZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNvY2tldCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1lbXNldCAoJmFkZHIsICdcMCcsIHNpemVvZiAoYWRkcikpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkgKGFkZHIuc3VuX3BhdGgsICJYL3RtcC9kYnVzLWZha2Utc29ja2V0LXBhdGgtdXNlZC1pbi1jb25maWd1cmUtdGVzdCIpOworICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IG1ha2VzIGl0IGFic3RyYWN0ICovCisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBTVU5fTEVOICgmYWRkcikpIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlIGJpbmQoKSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgZXhpdCAoMCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DaGVja1Byb3RvdHlwZUV4aXN0cy5jbWFrZSBiL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UKQEAgLTAsMCArMSwzNSBAQAorIyAtIENoZWNrIGlmIHRoZSBwcm90b3R5cGUgZm9yIGEgZnVuY3Rpb24gZXhpc3RzLgorIyBDSEVDS19QUk9UT1RZUEVfRVhJU1RTIChGVU5DVElPTiBIRUFERVIgVkFSSUFCTEUpCisjCisjICBGVU5DVElPTiAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgZm9yCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1BST1RPVFlQRV9FWElTVFMgX1NZTUJPTCBfSEVBREVSIF9SRVNVTFQpCisgICBTRVQoX0lOQ0xVREVfRklMRVMpCisgICBGT1JFQUNIIChpdCAke19IRUFERVJ9KQorICAgICAgU0VUKF9JTkNMVURFX0ZJTEVTICIke19JTkNMVURFX0ZJTEVTfSNpbmNsdWRlIDwke2l0fT5cbiIpCisgICBFTkRGT1JFQUNIIChpdCkKKworICAgU0VUKF9DSEVDS19QUk9UT19FWElTVFNfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyNpZm5kZWYgJHtfU1lNQk9MfQorICAgaW50IGkgPSBzaXplb2YoJiR7X1NZTUJPTH0pOworI2VuZGlmCisgIHJldHVybiAwOworfQorIikKKyAgIENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMoIiR7X0NIRUNLX1BST1RPX0VYSVNUU19TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCitFTkRNQUNSTyAoQ0hFQ0tfUFJPVE9UWVBFX0VYSVNUUyBfU1lNQk9MIF9IRUFERVIgX1JFU1VMVCkKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DaGVja1N0cnVjdE1lbWJlci5jbWFrZSBiL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZDM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIyAtIENoZWNrIGlmIHRoZSBnaXZlbiBzdHJ1Y3Qgb3IgY2xhc3MgaGFzIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhcmlhYmxlCisjIENIRUNLX1NUUlVDVF9NRU1CRVIgKFNUUlVDVCBNRU1CRVIgSEVBREVSIFZBUklBQkxFKQorIworIyAgU1RSVUNUIC0gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBvciBjbGFzcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyMgIE1FTUJFUiAtIHRoZSBtZW1iZXIgd2hpY2ggZXhpc3RlbmNlIHlvdSB3YW50IHRvIGNoZWNrCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1NUUlVDVF9NRU1CRVIgX1NUUlVDVCBfTUVNQkVSIF9IRUFERVIgX1JFU1VMVCkKKyAgIFNFVChfSU5DTFVERV9GSUxFUykKKyAgIEZPUkVBQ0ggKGl0ICR7X0hFQURFUn0pCisgICAgICBTRVQoX0lOQ0xVREVfRklMRVMgIiR7X0lOQ0xVREVfRklMRVN9I2luY2x1ZGUgPCR7aXR9PlxuIikKKyAgIEVOREZPUkVBQ0ggKGl0KQorCisgICBTRVQoX0NIRUNLX1NUUlVDVF9NRU1CRVJfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyAgICR7X1NUUlVDVH0qIHRtcDsKKyAgIHRtcC0+JHtfTUVNQkVSfTsKKyAgcmV0dXJuIDA7Cit9CisiKQorICAgQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUygiJHtfQ0hFQ0tfU1RSVUNUX01FTUJFUl9TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCisKK0VORE1BQ1JPIChDSEVDS19TVFJVQ1RfTUVNQkVSKQorCmRpZmYgLS1naXQgYS9jbWFrZS9tb2R1bGVzL0ZpbmREb3h5Z2VuLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY3OTAxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZQpAQCAtMCwwICsxLDMgQEAKKworZmluZF9wcm9ncmFtKERPWFlHRU5fRVhFQ1VUQUJMRSBOQU1FUyBkb3h5Z2VuIERPQyAiZG94eWdlbiBleGVjdXRhYmxlIikKK21hcmtfYXNfYWR2YW5jZWQoRE9YWUdFTl9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9GaW5kR0xpYjIuY21ha2UgYi9jbWFrZS9tb2R1bGVzL0ZpbmRHTGliMi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJiMmEwCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9GaW5kR0xpYjIuY21ha2UKQEAgLTAsMCArMSw2MCBAQAorIyAtIFRyeSB0byBmaW5kIHRoZSBHTElCMiBsaWJyYXJpZXMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdMSUIyX0ZPVU5EIC0gc3lzdGVtIGhhcyBnbGliMgorIyAgR0xJQjJfSU5DTFVERV9ESVIgLSB0aGUgZ2xpYjIgaW5jbHVkZSBkaXJlY3RvcnkKKyMgIEdMSUIyX0xJQlJBUklFUyAtIGdsaWIyIGxpYnJhcnkKKworIyBDb3B5cmlnaHQgKGMpIDIwMDggTGF1cmVudCBNb250ZWwsIDxtb250ZWxAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDEzIFJhbGYgSGFiYWNrZXIsIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKKworaWYoR0xJQjJfSU5DTFVERV9ESVIgQU5EIEdMSUIyX0xJQlJBUklFUykKKyAgICAjIEFscmVhZHkgaW4gY2FjaGUsIGJlIHNpbGVudAorICAgIHNldChHTElCMl9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmKEdMSUIyX0lOQ0xVREVfRElSIEFORCBHTElCMl9MSUJSQVJJRVMpCisKK2lmIChOT1QgV0lOMzIpCisgICAgZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKyAgICBwa2dfY2hlY2tfbW9kdWxlcyhQQ19MaWJHTElCMiBRVUlFVCBnbGliLTIuMCkKK2VuZGlmKCkKKworZmluZF9wYXRoKEdMSUIyX01BSU5fSU5DTFVERV9ESVIKKyAgICAgICAgICBOQU1FUyBnbGliLmgKKyAgICAgICAgICBISU5UUyAke1BDX0xpYkdMSUIyX0lOQ0xVREVESVJ9CisgICAgICAgICAgUEFUSF9TVUZGSVhFUyBnbGliLTIuMCkKKworZmluZF9saWJyYXJ5KEdMSUIyX0xJQlJBUlkKKyAgICAgICAgICAgICBOQU1FUyBnbGliLTIuMAorICAgICAgICAgICAgIEhJTlRTICR7UENfTGliR0xJQjJfTElCRElSfQorKQorCitmaW5kX2xpYnJhcnkoR0lPMl9MSUJSQVJZCisgICAgICAgICAgICAgTkFNRVMgZ2lvLTIuMAorICAgICAgICAgICAgIEhJTlRTICR7UENfTGliR0xJQjJfTElCRElSfQorKQorCitzZXQoR0xJQjJfTElCUkFSSUVTICR7R0xJQjJfTElCUkFSWX0gJHtHSU8yX0xJQlJBUll9KQorCisjIHNlYXJjaCB0aGUgZ2xpYmNvbmZpZy5oIGluY2x1ZGUgZGlyIHVuZGVyIHRoZSBzYW1lIHJvb3Qgd2hlcmUgdGhlIGxpYnJhcnkgaXMgZm91bmQKK2dldF9maWxlbmFtZV9jb21wb25lbnQoZ2xpYjJMaWJEaXIgIiR7R0xJQjJfTElCUkFSWX0iIFBBVEgpCisKK2ZpbmRfcGF0aChHTElCMl9JTlRFUk5BTF9JTkNMVURFX0RJUiBnbGliY29uZmlnLmgKKyAgICAgICAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2luY2x1ZGUKKyAgICAgICAgICBISU5UUyAke1BDX0xpYkdMSUIyX0lOQ0xVREVESVJ9ICIke2dsaWIyTGliRGlyfSIgJHtDTUFLRV9TWVNURU1fTElCUkFSWV9QQVRIfSkKKworc2V0KEdMSUIyX0lOQ0xVREVfRElSICIke0dMSUIyX01BSU5fSU5DTFVERV9ESVJ9IikKKworIyBub3Qgc3VyZSBpZiB0aGlzIGluY2x1ZGUgZGlyIGlzIG9wdGlvbmFsIG9yIHJlcXVpcmVkCisjIGZvciBub3cgaXQgaXMgb3B0aW9uYWwKK2lmKEdMSUIyX0lOVEVSTkFMX0lOQ0xVREVfRElSKQorICBzZXQoR0xJQjJfSU5DTFVERV9ESVIgJHtHTElCMl9JTkNMVURFX0RJUn0gIiR7R0xJQjJfSU5URVJOQUxfSU5DTFVERV9ESVJ9IikKK2VuZGlmKEdMSUIyX0lOVEVSTkFMX0lOQ0xVREVfRElSKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdMSUIyICBERUZBVUxUX01TRyAgR0xJQjJfTElCUkFSSUVTIEdMSUIyX01BSU5fSU5DTFVERV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoR0xJQjJfSU5DTFVERV9ESVIgR0xJQjJfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9GaW5kR09iamVjdC5jbWFrZSBiL2NtYWtlL21vZHVsZXMvRmluZEdPYmplY3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwYzlmNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvRmluZEdPYmplY3QuY21ha2UKQEAgLTAsMCArMSw1MiBAQAorIyAtIFRyeSB0byBmaW5kIEdPYmplY3QKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdPQkpFQ1RfRk9VTkQgLSBzeXN0ZW0gaGFzIEdPYmplY3QKKyMgIEdPQkpFQ1RfSU5DTFVERV9ESVIgLSB0aGUgR09iamVjdCBpbmNsdWRlIGRpcmVjdG9yeQorIyAgR09CSkVDVF9MSUJSQVJJRVMgLSB0aGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgR09iamVjdAorIyAgR09CSkVDVF9ERUZJTklUSU9OUyAtIENvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBHT2JqZWN0CisKKyMgQ29weXJpZ2h0IChjKSAyMDExLCBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPGt1Yml0b0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAwNiwgVGltIEJlYXVsZW4gPHRic2NvcGVAZ21haWwuY29tPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCitGSU5EX1BBQ0tBR0UoUGtnQ29uZmlnKQorUEtHX0NIRUNLX01PRFVMRVMoUENfR09CSkVDVCBnb2JqZWN0LTIuMCkKK1NFVChHT0JKRUNUX0RFRklOSVRJT05TICR7UENfR09CSkVDVF9DRkxBR1NfT1RIRVJ9KQorCitGSU5EX1BBVEgoR09CSkVDVF9JTkNMVURFX0RJUiBnb2JqZWN0LmgKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfSU5DTFVERURJUn0KKyAgICR7UENfR09CSkVDVF9JTkNMVURFX0RJUlN9CisgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2dvYmplY3QvCisgICApCisKK0ZJTkRfTElCUkFSWShfR09iamVjdExpYnMgTkFNRVMgZ29iamVjdC0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR01vZHVsZUxpYnMgTkFNRVMgZ21vZHVsZS0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR1RocmVhZExpYnMgTkFNRVMgZ3RocmVhZC0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR0xpYnMgTkFNRVMgZ2xpYi0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKKworU0VUKCBHT0JKRUNUX0xJQlJBUklFUyAke19HT2JqZWN0TGlic30gJHtfR01vZHVsZUxpYnN9ICR7X0dUaHJlYWRMaWJzfSAke19HTGlic30gKQorCitJTkNMVURFKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKEdPQkpFQ1QgREVGQVVMVF9NU0cgR09CSkVDVF9MSUJSQVJJRVMgR09CSkVDVF9JTkNMVURFX0RJUikKKworTUFSS19BU19BRFZBTkNFRChHT0JKRUNUX0lOQ0xVREVfRElSIF9HT2JqZWN0TGlicyBfR01vZHVsZUxpYnMgX0dUaHJlYWRMaWJzIF9HTGlicykKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvRmluZExpYkljb252LmNtYWtlIGIvY21ha2UvbW9kdWxlcy9GaW5kTGliSWNvbnYuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvRmluZExpYkljb252LmNtYWtlCkBAIC0wLDAgKzEsNTIgQEAKKyMgLSBUcnkgdG8gZmluZCBMaWJJY29udgorIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgTElCSUNPTlZfRk9VTkQgLSBzeXN0ZW0gaGFzIExpYkljb252CisjICBMSUJJQ09OVl9JTkNMVURFX0RJUiAtIHRoZSBMaWJJY29udiBpbmNsdWRlIGRpcmVjdG9yeQorIyAgTElCSUNPTlZfTElCUkFSSUVTIC0gdGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gdXNlIExpYkljb252CisjICBMSUJJQ09OVl9ERUZJTklUSU9OUyAtIENvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBMaWJJY29udgorCitpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKworICAgICMgaW4gY2FjaGUgYWxyZWFkeQorICAgIFNFVChMSUJJQ09OVl9GT1VORCBUUlVFKQorCitlbHNlIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQorCisgICAgSUYgKE5PVCBXSU4zMikKKyAgICAgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiUGxlYXNlIHNldCB0aGlzIHRvIHRoZSBjb3JyZWN0IHZhbHVlcyEiKQorICAgICAgICAjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAgICAgICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgICAgICAgSU5DTFVERShVc2VQa2dDb25maWcpCisgICAgICAgIFBLR0NPTkZJRyhsaWJpY29udi0xLjkgX0xpYkljb252SW5jRGlyIF9MaWJJY29udkxpbmtEaXIgX0xpYkljb252TGlua0ZsYWdzIF9MaUljb252Q2ZsYWdzKQorICAgICAgICBTRVQoTElCSUNPTlZfREVGSU5JVElPTlMgJHtfTGliSWNvbnZDZmxhZ3N9KQorICAgIEVORElGIChOT1QgV0lOMzIpCisKKyAgICBGSU5EX1BBVEgoTElCSUNPTlZfSU5DTFVERV9ESVIgaWNvbnYuaAorICAgICAgUEFUSFMKKyAgICAgJHtfTGliSWNvbnZJbmNEaXJ9CisgICAgICBQQVRIX1NVRkZJWEVTIGxpYmljb252CisgICAgKQorCisgICAgRklORF9MSUJSQVJZKExJQklDT05WX0xJQlJBUklFUyBOQU1FUyBpY29udiBsaWJpY29udgorICAgICAgUEFUSFMKKyAgICAgICR7X0xpYkljb252TGlua0Rpcn0KKyAgICApCisKKyAgICBpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKyAgICAgICBzZXQoTElCSUNPTlZfRk9VTkQgVFJVRSkKKyAgICBlbmRpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKworICAgIGlmIChMSUJJQ09OVl9GT1VORCkKKyAgICAgIGlmIChOT1QgTGliSWNvbnZfRklORF9RVUlFVExZKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgTGliSWNvbnY6ICR7TElCSUNPTlZfTElCUkFSSUVTfSIpCisgICAgICBlbmRpZiAoTk9UIExpYkljb252X0ZJTkRfUVVJRVRMWSkKKyAgICBlbHNlIChMSUJJQ09OVl9GT1VORCkKKyAgICAgIGlmIChMaWJJY29udl9GSU5EX1JFUVVJUkVEKQorICAgICAgICBtZXNzYWdlKFNFTkRfRVJST1IgIkNvdWxkIE5PVCBmaW5kIExpYkljb252IikKKyAgICAgIGVuZGlmIChMaWJJY29udl9GSU5EX1JFUVVJUkVEKQorICAgIGVuZGlmIChMSUJJQ09OVl9GT1VORCkKKworICAgIE1BUktfQVNfQURWQU5DRUQoTElCSUNPTlZfSU5DTFVERV9ESVIgTElCSUNPTlZfTElCUkFSSUVTKQorCitlbmRpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvTWFjcm9HZXRlbnZXaW5QYXRoLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9NYWNyb0dldGVudldpblBhdGguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4ZjdmNgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvTWFjcm9HZXRlbnZXaW5QYXRoLmNtYWtlCkBAIC0wLDAgKzEsNSBAQAorCitNQUNSTyAoTUFDUk9fR0VURU5WX1dJTl9QQVRIIHZhciBuYW1lKQorICAgc2V0KCR7dmFyfSAkRU5WeyR7bmFtZX19KQorICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcXFwiICIvIiAke3Zhcn0gIiR7JHt2YXJ9fSIpCitFTkRNQUNSTyAoTUFDUk9fR0VURU5WX1dJTl9QQVRIIHZhciBuYW1lKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9NYWNyb0xpYnJhcnkuY21ha2UgYi9jbWFrZS9tb2R1bGVzL01hY3JvTGlicmFyeS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9NYWNyb0xpYnJhcnkuY21ha2UKQEAgLTAsMCArMSw5IEBACisjIC0gaW5jbHVkZSBNYWNyb0xpYnJhcnkgb2ZmZXJzIGEgY29sbGVjdGlvbiBvZiBtYWNyb3Mgd2hpY2ggZXh0ZW5kIHRoZSBidWlsdC1pbiBjbWFrZSBjb21tYW5kcworIyBPUFRJT05BTF9GSU5EX1BBQ0tBR0UoIDxuYW1lPiBbUVVJVF0gKQorCitJTkNMVURFKE1hY3JvT3B0aW9uYWxGaW5kUGFja2FnZSkKKyNJTkNMVURFKE1hY3JvQWRkaXRpb25hbENsZWFuRmlsZXMpCisjSU5DTFVERShNYWNyb0FkZEZpbGVEZXBlbmRlbmNpZXMpCisjSU5DTFVERShNYWNyb0dldGVudldpblBhdGgpCisjSU5DTFVERShNYWNyb0Vuc3VyZU91dE9mU291cmNlQnVpbGQpCisKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9NYWNyb09wdGlvbmFsRmluZFBhY2thZ2UuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ODEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlLmNtYWtlCkBAIC0wLDAgKzEsMjIgQEAKKyMgLSBNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UoKSBjb21iaW5lcyBGSU5EX1BBQ0tBR0UoKSB3aXRoIGFuIE9QVElPTigpCisjIE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSggPG5hbWU+IFtRVUlUXSApCisjIFRoaXMgbWFjcm8gaXMgYSBjb21iaW5hdGlvbiBvZiBPUFRJT04oKSBhbmQgRklORF9QQUNLQUdFKCksIGl0CisjIHdvcmtzIGxpa2UgRklORF9QQUNLQUdFKCksIGJ1dCBhZGRpdGlvbmFsbHkgaXQgYXV0b21hdGljYWxseSBjcmVhdGVzCisjIGFuIG9wdGlvbiBuYW1lIFdJVEhfPG5hbWU+LCB3aGljaCBjYW4gYmUgZGlzYWJsZWQgdmlhIHRoZSBjbWFrZSBHVUkuCisjIG9yIHZpYSAtRFdJVEhfPG5hbWU+PU9GRgorIyBUaGUgc3RhbmRhcmQgPG5hbWU+X0ZPVU5EIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkKKyMgYXMgd2hlbiB1c2luZyB0aGUgbm9ybWFsIEZJTkRfUEFDS0FHRSgpCisKK01BQ1JPIChNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UgX25hbWUgKQorICAgT1BUSU9OKFdJVEhfJHtfbmFtZX0gIlNlYXJjaCBmb3IgJHtfbmFtZX0gcGFja2FnZSIgT04pCisgICBpZiAoV0lUSF8ke19uYW1lfSkKKyAgICAgIEZJTkRfUEFDS0FHRSgke19uYW1lfSAke0FSR059KQorICAgZWxzZSAoV0lUSF8ke19uYW1lfSkKKyAgICAgIHNldCgke19uYW1lfV9GT1VORCkKKyAgICAgIHNldCgke19uYW1lfV9JTkNMVURFX0RJUikKKyAgICAgIHNldCgke19uYW1lfV9JTkNMVURFUykKKyAgICAgIHNldCgke19uYW1lfV9MSUJSQVJZKQorICAgICAgc2V0KCR7X25hbWV9X0xJQlJBUklFUykKKyAgIGVuZGlmIChXSVRIXyR7X25hbWV9KQorRU5ETUFDUk8gKE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSkKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9NYWNyb3MuY21ha2UgYi9jbWFrZS9tb2R1bGVzL01hY3Jvcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZjZjExCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9NYWNyb3MuY21ha2UKQEAgLTAsMCArMSw2MiBAQAoraWYoREJVU19CVUlMRF9URVNUUyBBTkQgQ01BS0VfQ1JPU1NDT01QSUxJTkcgQU5EIENNQUtFX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJXaW5kb3dzIikKKyAgICBpZihDTUFLRV9IT1NUX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJMaW51eCIpCisgICAgICAgIGZpbmRfZmlsZShXSU5FX0VYRUNVVEFCTEUKKyAgICAgICAgICAgIE5BTUVTIHdpbmUKKyAgICAgICAgICAgIFBBVEhTIC91c3IvYmluIC91c3IvbG9jYWwvYmluCisgICAgICAgICAgICBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSAorICAgICAgICApCisgICAgICAgIGZpbmRfZmlsZShIQVZFX0JJTkZNVF9XSU5FX1NVUFBPUlQKKyAgICAgICAgICAgIE5BTUVTIERPU1dpbiB3aW5lIFdpbmUgd2luZG93cyBXaW5kb3dzCisgICAgICAgICAgICBQQVRIUyAvcHJvYy9zeXMvZnMvYmluZm10X21pc2MKKyAgICAgICAgICAgIE5PX1NZU1RFTV9QQVRIIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRICisgICAgICAgICkKKyAgICAgICAgaWYoV0lORV9FWEVDVVRBQkxFIEFORCBIQVZFX0JJTkZNVF9XSU5FX1NVUFBPUlQpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBGT09UTk9URVMgIk5PVEU6IFRoZSByZXF1aXJlbWVudHMgdG8gcnVuIGNyb3NzIGNvbXBpbGVkIGFwcGxpY2F0aW9ucyBvbiB5b3VyIGhvc3Qgc3lzdGVtIGFyZSBhY2hpZXZlZC4gWW91IG1heSBydW4gJ21ha2UgY2hlY2snLiIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoTk9UIFdJTkVfRVhFQ1VUQUJMRSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIEZPT1ROT1RFUyAiTk9URTogWW91IG1heSBpbnN0YWxsIHRoZSBXaW5kb3dzIGVtdWxhdG9yICd3aW5lJyB0byBiZSBhYmxlIHRvIHJ1biBjcm9zcyBjb21waWxlZCB0ZXN0IGFwcGxpY2F0aW9ucy4iKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKE5PVCBIQVZFX0JJTkZNVF9XSU5FX1NVUFBPUlQpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBGT09UTk9URVMgIk5PVEU6IFlvdSBtYXkgYWN0aXZhdGUgYmluZm10X21pc2Mgc3VwcG9ydCBmb3Igd2luZSB0byBiZSBhYmxlIHRvIHJ1biBjcm9zcyBjb21waWxlZCB0ZXN0IGFwcGxpY2F0aW9ucy4iKQorICAgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICAgIGxpc3QoQVBQRU5EIEZPT1ROT1RFUyAiTk9URTogWW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGNyb3NzIGNvbXBpbGVkIGFwcGxpY2F0aW9ucyBvbiB5b3VyIGhvc3Qgc3lzdGVtLiIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitNQUNSTyhUSU1FU1RBTVAgUkVTVUxUKQorICAgIGlmIChDTUFLRV9IT1NUX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJXaW5kb3dzIikKKyAgICAgICAgRVhFQ1VURV9QUk9DRVNTKENPTU1BTkQgImNtZCIgIiAvQyBkYXRlIC9UIiBPVVRQVVRfVkFSSUFCTEUgREFURSkKKyAgICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIiguLilbLy5dKC4uKVsvLl0oLi4uLikuKiIgIlxcM1xcMlxcMSIgREFURSAke0RBVEV9KQorICAgICAgICBFWEVDVVRFX1BST0NFU1MoQ09NTUFORCAiY21kIiAiIC9DIHRpbWUgL1QiIE9VVFBVVF9WQVJJQUJMRSBUSU1FKQorICAgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4uKTooLi4pIiAiXFwxXFwyIiBUSU1FICR7VElNRX0pCisgICAgICAgIHNldCAoJHtSRVNVTFR9ICIke0RBVEV9JHtUSU1FfSIpCisgICAgZWxzZSAoKQorICAgICAgICBFWEVDVVRFX1BST0NFU1MoQ09NTUFORCAiZGF0ZSIgIislWSVtJWQlSCVNIiBPVVRQVVRfVkFSSUFCTEUgJHtSRVNVTFR9KQorICAgIGVuZGlmICgpCitFTkRNQUNSTygpCisKK21hY3JvKGFkZF90ZXN0X2V4ZWN1dGFibGUgX3RhcmdldCBfc291cmNlKQorICAgIGFkZF9leGVjdXRhYmxlKCR7X3RhcmdldH0gJHtfc291cmNlfSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtfdGFyZ2V0fSAke0FSR059KQorICAgIGlmIChDTUFLRV9DUk9TU0NPTVBJTElORyBBTkQgQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQorICAgICAgICAjIHJ1biB0ZXN0cyB3aXRoIGJpbmZtdF9taXNjCisgICAgICAgIHNldChQUkVGSVggIno6IikKKyAgICAgICAgc2V0KF9lbnYgIkRCVVNfVEVTVF9EQUVNT049JHtQUkVGSVh9JHtDTUFLRV9CSU5BUllfRElSfS9iaW4vZGJ1cy1kYWVtb24ke0VYRUVYVH0iKQorICAgICAgICBhZGRfdGVzdChOQU1FICR7X3RhcmdldH0gQ09NTUFORCAkPFRBUkdFVF9GSUxFOiR7X3RhcmdldH0+IC0tdGFwKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoUFJFRklYKQorICAgICAgICBzZXQoX2VudiAiREJVU19URVNUX0RBRU1PTj0ke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWRhZW1vbiR7RVhFRVhUfSIpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgJHtfdGFyZ2V0fSBDT01NQU5EICQ8VEFSR0VUX0ZJTEU6JHtfdGFyZ2V0fT4gLS10YXApCisgICAgZW5kaWYoKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfRkFUQUxfV0FSTklOR1M9MSIpCisgICAgbGlzdChBUFBFTkQgX2VudiAiREJVU19URVNUX0RBVEE9JHtQUkVGSVh9JHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEiKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfVEVTVF9IT01FRElSPSR7UFJFRklYfSR7Q01BS0VfQklOQVJZX0RJUn0vZGJ1cyIpCisgICAgc2V0X3Rlc3RzX3Byb3BlcnRpZXMoJHtfdGFyZ2V0fSBQUk9QRVJUSUVTIEVOVklST05NRU5UICIke19lbnZ9IikKK2VuZG1hY3JvKGFkZF90ZXN0X2V4ZWN1dGFibGUpCisKK21hY3JvKGFkZF9oZWxwZXJfZXhlY3V0YWJsZSBfdGFyZ2V0IF9zb3VyY2UpCisgICAgYWRkX2V4ZWN1dGFibGUoJHtfdGFyZ2V0fSAke19zb3VyY2V9KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke190YXJnZXR9ICR7QVJHTn0pCitlbmRtYWNybyhhZGRfaGVscGVyX2V4ZWN1dGFibGUpCmRpZmYgLS1naXQgYS9jbWFrZS9tb2R1bGVzL01hY3Jvc0F1dG90b29scy5jbWFrZSBiL2NtYWtlL21vZHVsZXMvTWFjcm9zQXV0b3Rvb2xzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjgzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9tb2R1bGVzL01hY3Jvc0F1dG90b29scy5jbWFrZQpAQCAtMCwwICsxLDE2OCBAQAorIworIyBjbWFrZSBwYWNrYWdlIGZvciBhdXRvdG9vbHMgc3VwcG9ydAorIworIyBAQXV0aG9yIFJhbGYgSGFiYWNrZXIKKyMgCisKKyMKKyMgbG9hZCBhdXRvdG9vbHMgY29uZmlndXJlIGZpbGUgaW50byBhbiBpbnRlcm5hbCBsaXN0IG5hbWVkIF9jb25maWd1cmVfYWMKKyMKK21hY3JvKGF1dG9pbml0IGNvbmZpZykKKyAgICBzZXQoX2NvbmZpZ3VyZV9hY19uYW1lICR7Y29uZmlnfSkKKyAgICBmaWxlKFJFQUQgJHtjb25maWd9IF9jb25maWd1cmVfYWNfcmF3KQorICAgICMgQ29udmVydCBmaWxlIGNvbnRlbnRzIGludG8gYSBDTWFrZSBsaXN0ICh3aGVyZSBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QKKyAgICAjIGlzIG9uZSBsaW5lIG9mIHRoZSBmaWxlKQorICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICI7IiAiXFxcXDsiIF9jb25maWd1cmVfYWMgIiR7X2NvbmZpZ3VyZV9hY19yYXd9IikKKyAgICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXG4iICI7IiBfY29uZmlndXJlX2FjICIke19jb25maWd1cmVfYWN9IikKK2VuZG1hY3JvKCkKKworIyBleHRyYWN0cyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gYXV0b2NvbmYgY29uZmlnIGZpbGUKKyMgYW5kIHNldCByZWxhdGVkIGNtYWtlIHZhcmlhYmxlcworIyAKKyMgcmV0dXJucyAgCisjICAgJHtwcmVmaXh9X1ZFUlNJT04KKyMgICAke3ByZWZpeH1fVkVSU0lPTl9TVFJJTkcKKyMgICAke3ByZWZpeH1fTUFKT1JfVkVSU0lPTgorIyAgICR7cHJlZml4fV9NSU5PUl9WRVJTSU9OCisjICAgJHtwcmVmaXh9X01JQ1JPX1ZFUlNJT04KKyMgICAke3ByZWZpeH1fTElCUkFSWV9BR0UKKyMgICAke3ByZWZpeH1fTElCUkFSWV9SRVZJU0lPTgorIyAgICR7cHJlZml4fV9MSUJSQVJZX0NVUlJFTlQKKyMgCittYWNybyhhdXRvdmVyc2lvbiBwcmVmaXgpCisgICAgc3RyaW5nKFRPVVBQRVIgJHtwcmVmaXh9IHByZWZpeF91cHBlcikKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qJHtwcmVmaXh9X21ham9yX3ZlcnNpb25dLCAuKFswLTldKykuKiIgIlxcMSIgJHtwcmVmaXhfdXBwZXJ9X01BSk9SX1ZFUlNJT04gJHtfY29uZmlndXJlX2FjX3Jhd30pCisgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKiR7cHJlZml4fV9taW5vcl92ZXJzaW9uXSwgLihbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9NSU5PUl9WRVJTSU9OICR7X2NvbmZpZ3VyZV9hY19yYXd9KQorICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLioke3ByZWZpeH1fbWljcm9fdmVyc2lvbl0sIC4oWzAtOV0rKS4qIiAiXFwxIiAke3ByZWZpeF91cHBlcn1fTUlDUk9fVkVSU0lPTiAke19jb25maWd1cmVfYWNfcmF3fSkKKyAgICBzZXQgKCR7cHJlZml4X3VwcGVyfV9WRVJTSU9OICR7JHtwcmVmaXhfdXBwZXJ9X01BSk9SX1ZFUlNJT059LiR7JHtwcmVmaXhfdXBwZXJ9X01JTk9SX1ZFUlNJT059LiR7JHtwcmVmaXhfdXBwZXJ9X01JQ1JPX1ZFUlNJT059KQorICAgIHNldCAoJHtwcmVmaXhfdXBwZXJ9X1ZFUlNJT05fU1RSSU5HICIkeyR7cHJlZml4X3VwcGVyfV9WRVJTSU9OfSIpCisgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKkxUX0FHRT0oWzAtOV0rKS4qIiAiXFwxIiAke3ByZWZpeF91cHBlcn1fTElCUkFSWV9BR0UgJHtfY29uZmlndXJlX2FjX3Jhd30pCisgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKkxUX0NVUlJFTlQ9KFswLTldKykuKiIgIlxcMSIgJHtwcmVmaXhfdXBwZXJ9X0xJQlJBUllfQ1VSUkVOVCAke19jb25maWd1cmVfYWNfcmF3fSkKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qTFRfUkVWSVNJT049KFswLTldKykuKiIgIlxcMSIgJHtwcmVmaXhfdXBwZXJ9X0xJQlJBUllfUkVWSVNJT04gJHtfY29uZmlndXJlX2FjX3Jhd30pCitlbmRtYWNybygpCisKKyMKKyMgRGVmaW5lcyBwYWNrYWdlIHJlbGF0ZWQgdmFyaWFibGVzIChQQUNLQUdFXy4uLiwgUEFDS0FHRSBhbmQgVkVSU0lPTikKKyMgYXMgZG9uZSBieSBhdXRvdG9vbHMuCisjCisjIEFkZGl0aW9uYWwgaXQgZGVmaW5lcyBhIGNtYWtlIHZhcmlhYmxlIG5hbWVkIFBBQ0tBR0VfQ09ORklHX0hfVEVNUExBVEUKKyMgd2hpY2ggY291bGQgYmUgcGxhY2VkIGluIGNvbmZpZy5oIHRlbXBsYXRlcyB0byBoYXZlIHRob3NlIHZhcmlhYmxlcworIyBkZWZpbmVkIGF0IGNvZGUgbGV2ZWwgbGlrZSBzaG93biBiZWxvdzoKKyMKKyMgY29uZmlnLmgudGVtcGxhdGUKKyMgICAuLi4KKyMgICBAQVVUT1BBQ0tBR0VfQ09ORklHX0hfVEVNUExBVEVACisjICAgLi4uCisjCittYWNybyhhdXRvcGFja2FnZSBuYW1lIHZlcnNpb24gdXJsIHN1cHBvcnRfdXJsKQorICAgICMgRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLgorICAgIHNldChQQUNLQUdFX05BTUUgJHtuYW1lfSkKKworICAgICMgRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4KKyAgICBzZXQoUEFDS0FHRV9WRVJTSU9OICR7dmVyc2lvbn0pCisKKyAgICAjIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuCisgICAgc2V0KFBBQ0tBR0VfVVJMICR7dXJsfSkKKworICAgICMgRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuCisgICAgc2V0KFBBQ0tBR0VfQlVHUkVQT1JUICR7c3VwcG9ydF91cmx9KQorCisgICAgIyBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuCisgICAgc2V0KFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfTkFNRX0gJHtQQUNLQUdFX1ZFUlNJT059IikKKworICAgICMgRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLgorICAgIHNldChQQUNLQUdFX1RBUk5BTUUgJHtQQUNLQUdFX05BTUV9KQorCisgICAgc2V0KFBBQ0tBR0UgJHtuYW1lfSkKKyAgICBzZXQoVkVSU0lPTiAke0RCVVNfVkVSU0lPTl9TVFJJTkd9KQorCisgICAgc3RyaW5nKENPTkZJR1VSRSAiLyogZ2VuZXJhdGVkIGJ5IGNtYWtlIG1hY3JvIGF1dG9wYWNrYWdlICovXG4KKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCBcIkBQQUNLQUdFX0JVR1JFUE9SVEBcIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSBcIkBQQUNLQUdFX05BTUVAXCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyBcIkBQQUNLQUdFX1NUUklOR0BcIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSBcIkBQQUNLQUdFX1RBUk5BTUVAXCIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9VUkwgXCJAUEFDS0FHRV9VUkxAXCIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OIFwiQFBBQ0tBR0VfVkVSU0lPTkBcIgorCisvKiBkZWZpbmVkIGJ5IGF1dG90b29scyBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgXCJAUEFDS0FHRUBcIgorI2RlZmluZSBWRVJTSU9OIFwiQFZFUlNJT05AXCIKKyIgQVVUT1BBQ0tBR0VfQ09ORklHX0hfVEVNUExBVEUpCitlbmRtYWNybyhhdXRvcGFja2FnZSkKKworIworIyBkZWZpbmUgYSBjbWFrZSB2YXJpYWJsZSBmcm9tIGF1dG90b29scyBBQ19ERUZJTkUgc3RhdGVtZW50CisjCittYWNybyhhdXRvZGVmaW5lIG5hbWUpCisgICAgZm9yZWFjaChsaW5lICR7X2NvbmZpZ3VyZV9hY30pCisgICAgICAgIGlmKGxpbmUgTUFUQ0hFUyAiLipBQ19ERUZJTkUoLioke25hbWV9LiopLioiKQorICAgICAgICAgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKkFDX0RFRklORSguKikuKiIgIlxcMSIgdmFsdWUgJHtsaW5lfSkKKyAgICAgICAgICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLiosKC4qKSwuKiIgIlxcMSIgdmFsdWUyICR7dmFsdWV9KQorICAgICAgICAgICAgc3RyaW5nIChSRVBMQUNFICJbIiAiIiB2YWx1ZTMgJHt2YWx1ZTJ9KQorICAgICAgICAgICAgc3RyaW5nIChSRVBMQUNFICJdIiAiIiB2YWx1ZTQgJHt2YWx1ZTN9KQorICAgICAgICAgICAgc2V0KCR7bmFtZX0gJHt2YWx1ZTR9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCitlbmRtYWNybygpCisKK21hY3JvKGF1dG9oZWFkZXJjaGVja3MgY29uZmlnX2hfaW4gY29uZmlndXJlX2NoZWNrc19maWxlIGNvbmZpZ19oX2NtYWtlKQorICAgIGZpbGUoUkVBRCAke2NvbmZpZ3VyZV9jaGVja3NfZmlsZX0gY29uZmlndXJlX2NoZWNrc19maWxlX3JhdykKKyAgICBmaWxlKFJFQUQgJHtjb25maWdfaF9pbn0gX2NvbmZpZ19oX2luX3JhdykKKyAgICBmaWxlKFJFQUQgJHtjb25maWdfaF9jbWFrZX0gX2NvbmZpZ19oX2NtYWtlX3JhdykKKyAgICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiOyIgIlxcXFw7IiBfY29uZmlnX2hfaW4gIiR7X2NvbmZpZ19oX2luX3Jhd30iKQorICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIF9jb25maWdfaF9pbiAiJHtfY29uZmlnX2hfaW59IikKKyAgICBmb3JlYWNoKGxpbmUgJHtfY29uZmlnX2hfaW59KQorICAgICAgICAjbWVzc2FnZShTVEFUVVMgJHtsaW5lfSkKKyAgICAgICAgaWYobGluZSBNQVRDSEVTICIuKkhBVkVfLipfSC4qIikKKyAgICAgICAgICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLipIQVZFXyguKilfSC4qIiAiXFwxIiBrZXkgJHtsaW5lfSkKKyAgICAgICAgICAgIHNldChmdWxsX2tleSAiSEFWRV8ke2tleX1fSCIpCisgICAgICAgICAgICBpZihrZXkgTUFUQ0hFUyAiLipfLioiKQorICAgICAgICAgICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXltBLVowLTldKyIgZGlyICR7a2V5fSkKKyAgICAgICAgICAgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIltBLVowLTldKyQiIGZpbGUgJHtrZXl9KQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZGlyfSBkaXJuYW1lKQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZmlsZX0gZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2V0KGNoZWNrICJjaGVja19pbmNsdWRlX2ZpbGUoJHtkaXJuYW1lfS8ke2ZpbGVuYW1lfS5oICAgICAke2Z1bGxfa2V5fSkiKQorICAgICAgICAgICAgICAgIHNldChjb25maWdfZGVmaW5lICIjY21ha2VkZWZpbmUgJHtmdWxsX2tleX0iKQorICAgICAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAgICAgc2V0KGZpbGUgJHtrZXl9KQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZmlsZX0gZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2V0KGNoZWNrICJjaGVja19pbmNsdWRlX2ZpbGUoJHtmaWxlbmFtZX0uaCAgICAgJHtmdWxsX2tleX0pIikKKyAgICAgICAgICAgICAgICBzZXQoY29uZmlnX2RlZmluZSAiI2NtYWtlZGVmaW5lICR7ZnVsbF9rZXl9IikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgICAgIGlmKE5PVCBjb25maWd1cmVfY2hlY2tzX2ZpbGVfcmF3IE1BVENIRVMgIi4qJHtmdWxsX2tleX0uKiIpCisgICAgICAgICAgICAgICAgbWVzc2FnZSgiJHtjaGVja30iKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgaWYoTk9UIF9jb25maWdfaF9jbWFrZV9yYXcgTUFUQ0hFUyAiJHtmdWxsX2tleX0iKQorICAgICAgICAgICAgICAgIG1lc3NhZ2UoIiR7Y29uZmlnX2RlZmluZX0iKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCitlbmRtYWNybyhhdXRvaGVhZGVyY2hlY2tzKQorCisjCisjIHBhcnNlcyBjb25maWcuaCB0ZW1wbGF0ZSBhbmQgY3JlYXRlIGNtYWtlIGVxdWl2YWxlbnQgCisjIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyMgCittYWNybyhhdXRvY29uZmlnIHRlbXBsYXRlIG91dHB1dCkKKwlmaWxlKFJFQUQgJHt0ZW1wbGF0ZX0gY29udGVudHMpCisJIyBDb252ZXJ0IGZpbGUgY29udGVudHMgaW50byBhIENNYWtlIGxpc3QgKHdoZXJlIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdAorCSMgaXMgb25lIGxpbmUgb2YgdGhlIGZpbGUpCisJU1RSSU5HKFJFR0VYIFJFUExBQ0UgIjsiICJcXFxcOyIgY29udGVudHMgIiR7Y29udGVudHN9IikKKwlTVFJJTkcoUkVHRVggUkVQTEFDRSAiXG4iICI7IiBjb250ZW50cyAiJHtjb250ZW50c30iKQorCWZvcmVhY2gobGluZSBjb250ZW50cykKKwkJbWVzc2FnZShTVEFUVVMgJHtsaW5lfSkKKwkJIyBmaW5kICN1bmRlZiBsaW5lcworCQkjIGFwcGVuZCB0byBjb25maWcuaCAjZGVmaW5lIDx2YXJpYWJsZS1uYW1lPiA8dmFyaWFibGUtY29udGVudD4KKwllbmRmb3JlYWNoKCkKK2VuZG1hY3JvKCkKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvUHJvamVjdFNvdXJjZUdyb3VwLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9Qcm9qZWN0U291cmNlR3JvdXAuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvUHJvamVjdFNvdXJjZUdyb3VwLmNtYWtlCkBAIC0wLDAgKzEsMTggQEAKKyMgZm9sZGVycyBpbiB0aGUgbXN2YyBwcm9qZWN0cworIyBtb2RlPT1mbGF0ICA6IGhlYWRlcnMgYW5kIG91cnNlcyBpbiBubyBmb2xkZXJzCisjIG1vZGU9PXNwbGl0IDogc3RhbmRhcmQgYmVoYXZpb3Igb2YgY21ha2UsIHNwbGl0IGhlYWRlcnMgYW5kIHNvdXJjZXMKKyMgbW9kZT09IDxvdGhlciB2YWx1ZXMiIDogY29kZSBpcyBpbiB0aGlzIGZvbGRlcgorbWFjcm8ocHJvamVjdF9zb3VyY2VfZ3JvdXAgbW9kZSBzb3VyY2VzIGhlYWRlcnMpCisJI21lc3NhZ2UoU1RBVFVTICR7bW9kZX0pCisJI21lc3NhZ2UoU1RBVFVTICR7c291cmNlc30gJHtoZWFkZXJzfSkKKwlpZigke21vZGV9IE1BVENIRVMgImZsYXQiKQorCQlzb3VyY2VfZ3JvdXAoIlNvdXJjZSBGaWxlcyIgRmlsZXMpCisJCXNvdXJjZV9ncm91cCgiSGVhZGVyIEZpbGVzIiBGaWxlcykKKwkJc291cmNlX2dyb3VwKCJjbWFrZSIgRklMRVMgQ01ha2VMaXN0cy50eHQpCisJZWxzZSgke21vZGV9IE1BVENIRVMgImZsYXQiKQorCQlpZihOT1QgJHttb2RlfSBNQVRDSEVTICJzcGxpdCIpCisJCQlzb3VyY2VfZ3JvdXAoIiR7bW9kZX0iIEZJTEVTICR7JHtzb3VyY2VzfX0gJHske2hlYWRlcnN9fSkKKwkJZW5kaWYoTk9UICR7bW9kZX0gTUFUQ0hFUyAic3BsaXQiKQorCWVuZGlmKCR7bW9kZX0gTUFUQ0hFUyAiZmxhdCIpCitlbmRtYWNybyhwcm9qZWN0X3NvdXJjZV9ncm91cCBtb2RlIHNvdXJjZXMgaGVhZGVycykKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9XaW4zMk1hY3Jvcy5jbWFrZSBiL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NWNjOQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UKQEAgLTAsMCArMSw0NCBAQAorIworIyB3aW4zMiBtYWNyb3MgCisjIAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUmFsZiBIYWJhY2tlcgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjCisKK2lmIChXSU4zMikKKyAgICAjCisgICAgIyBhZGRFeHBsb3JlcldyYXBwZXIgY3JlYXRlcyBiYXRjaCBmaWxlcyBmb3IgZmFzdCBhY2Nlc3MgCisgICAgIyB0byB0aGUgYnVpbGQgZW52aXJvbm1lbnQgZnJvbSB0aGUgd2luMzIgZXhwbG9yZXIuIAorICAgICMgCisgICAgIyBGb3IgbWluZ3cgYW5kIG5tYWtlIHByb2plY3RzIGl0J3Mgb3BlbnMgYSBjb21tYW5kIHNoZWxsLAorICAgICMgZm9yIFZpc3VhbCBTdHVkaW8gSURFJ3MgKGF0IGxlYXN0IHRlc3RlZCB3aXRoIFZTIDggMjAwNSkgaXQKKyAgICAjIG9wZW5zIHRoZSByZWxhdGVkIC5zbG4gZmlsZSB3aXRoIHBhdGhzIHNldHRpbmcgc3BlY2lmaWVkIGF0IAorICAgICMgY29uZmlndXJlIHRpbWUuIAorICAgICMKKyAgICBNQUNSTyAoYWRkRXhwbG9yZXJXcmFwcGVyIF9wcm9qZWN0bmFtZSkKKyAgICAgICAgIyB3cml0ZSBleHBsb3JlciB3cmFwcGVycworICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KENNQUtFX0JJTl9QQVRIICR7Q01BS0VfQ09NTUFORH0gUEFUSCkKKyAgICAgICAgc2V0IChBRERfUEFUSCAiJHtDTUFLRV9CSU5fUEFUSH0iKQorCisgICAgICAgIGlmIChRVF9RTUFLRV9FWEVDVVRBQkxFKQorICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChRVF9CSU5fUEFUSCAke1FUX1FNQUtFX0VYRUNVVEFCTEV9IFBBVEgpCisgICAgICAgICAgICBzZXQgKEFERF9QQVRIICIke0FERF9QQVRIfTske1FUX0JJTl9QQVRIfSIpCisgICAgICAgIGVuZGlmIChRVF9RTUFLRV9FWEVDVVRBQkxFKQorICAgICAgICAKKyAgICAgICAgIyBhZGQgaGVyZSBtb3JlIHBhdGhlcyAKKyAgICAgICAgCisgICAgICAgIGlmIChNSU5HVykKKyAgICAgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoTUlOR1dfQklOX1BBVEggJHtDTUFLRV9DWFhfQ09NUElMRVJ9IFBBVEgpCisgICAgICAgICAgICBzZXQgKEFERF9QQVRIICIke0FERF9QQVRIfTske01JTkdXX0JJTl9QQVRIfSIpCisgICAgICAgICAgICB3cml0ZV9maWxlICgke0NNQUtFX0JJTkFSWV9ESVJ9LyR7X3Byb2plY3RuYW1lfS1zaGVsbC5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuY21kLmV4ZSIpCisgICAgICAgIGVsc2UgKE1JTkdXKQorICAgICAgICAgICAgaWYgKENNQUtFX0JVSUxEX1RPT0wgU1RSRVFVQUwgICJubWFrZSIpCisgICAgICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChWQ19CSU5fUEFUSCAke0NNQUtFX0NYWF9DT01QSUxFUn0gUEFUSCkKKyAgICAgICAgICAgICAgICB3cml0ZV9maWxlICgke0NNQUtFX0JJTkFSWV9ESVJ9LyR7X3Byb2plY3RuYW1lfS1zaGVsbC5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuY2FsbCBcIiR7VkNfQklOX1BBVEh9XFx2Y3ZhcnMzMi5iYXRcIlxuY21kLmV4ZSIpCisgICAgICAgICAgICBlbHNlIChDTUFLRV9CVUlMRF9UT09MIFNUUkVRVUFMICAibm1ha2UiKQorICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUgKCR7Q01BS0VfQklOQVJZX0RJUn0vJHtfcHJvamVjdG5hbWV9LXNsbi5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuc3RhcnQgJHtfcHJvamVjdG5hbWV9LnNsbiIpCisgICAgICAgICAgICBlbmRpZiAoQ01BS0VfQlVJTERfVE9PTCBTVFJFUVVBTCAgIm5tYWtlIikKKyAgICAgICAgZW5kaWYgKE1JTkdXKQorICAgIEVORE1BQ1JPIChhZGRFeHBsb3JlcldyYXBwZXIpCitlbmRpZihXSU4zMikKZGlmZiAtLWdpdCBhL2NtYWtlL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OGFmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTg1IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdCkKKworc2V0KERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1MgJHtURVNUX0xJU1RFTn0pCisKK2FkZF9saWJyYXJ5KGRidXMtdGVzdHV0aWxzIFNUQVRJQworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLmgKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC11dGlscy5jCispCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy10ZXN0dXRpbHMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9zdWJkaXJlY3RvcnkoIG5hbWUtdGVzdCApCisKK3NldCAobWFudWFsLWRpci1pdGVyX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLWRpci1pdGVyLmMKKykKKworc2V0ICh0ZXN0LXNlcnZpY2VfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNlcnZpY2UuYworKQorCitzZXQgKHRlc3QtbmFtZXNfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LW5hbWVzLmMKKykKKworc2V0IChicmVha19sb2FkZXJfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9icmVhay1sb2FkZXIuYworKQorCitzZXQgKHRlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCispCisKK3NldCAodGVzdC1zaGVsbF9TT1VSQ0VTCisgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9zaGVsbC10ZXN0LmMKKykKKworc2V0ICh0ZXN0LXNwYXduX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3Qvc3Bhd24tdGVzdC5jCispCisKK3NldCAodGVzdC1leGl0X1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1leGl0LmMKKykKKworc2V0ICh0ZXN0LXNlZ2ZhdWx0X1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1zZWdmYXVsdC5jCispCisKK3NldCAodGVzdC1zbGVlcC1mb3JldmVyX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKKykKKworc2V0IChtYW51YWwtdGNwX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLXRjcC5jCispCisKK3NldCAobWFudWFsLXBhdGhzX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLXBhdGhzLmMKKykKKworYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC1kaXItaXRlciAke21hbnVhbC1kaXItaXRlcl9TT1VSQ0VTfSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LXNlcnZpY2UgJHt0ZXN0LXNlcnZpY2VfU09VUkNFU30gZGJ1cy10ZXN0dXRpbHMpCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1uYW1lcyAke3Rlc3QtbmFtZXNfU09VUkNFU30gZGJ1cy10ZXN0dXRpbHMpCithZGRfdGVzdF9leGVjdXRhYmxlKHRlc3Qtc2hlbGwgJHt0ZXN0LXNoZWxsX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LXByaW50ZiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvaW50ZXJuYWxzL3ByaW50Zi5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3Qtc2hlbGwtc2VydmljZSAke3Rlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTfSBkYnVzLXRlc3R1dGlscykKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LXNwYXduICR7dGVzdC1zcGF3bl9TT1VSQ0VTfSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LWV4aXQgJHt0ZXN0LWV4aXRfU09VUkNFU30gJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zZWdmYXVsdCAke3Rlc3Qtc2VnZmF1bHRfU09VUkNFU30gJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zbGVlcC1mb3JldmVyICR7dGVzdC1zbGVlcC1mb3JldmVyX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC10Y3AgJHttYW51YWwtdGNwX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQoraWYoV0lOMzIpCisgICAgYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC1wYXRocyAke21hbnVhbC1wYXRoc19TT1VSQ0VTfSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK2VuZGlmKCkKKworaWYoREJVU19XSVRIX0dMSUIpCisgICAgbWVzc2FnZShTVEFUVVMgIndpdGggZ2xpYiB0ZXN0IGFwcHMiKQorCisgICAgYWRkX2xpYnJhcnkoZGJ1cy10ZXN0dXRpbHMtZ2xpYiBTVEFUSUMKKyAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5oCisgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLWdsaWIuYworICAgICkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy10ZXN0dXRpbHMtZ2xpYiBkYnVzLXRlc3R1dGlscyAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKKworICAgIGFkZF9kZWZpbml0aW9ucygKKyAgICAgICAgJHtHTElCMl9ERUZJTklUSU9OU30KKyAgICAgICAgJHtHT0JKRUNUX0RFRklOSVRJT05TfQorICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAgICAgICAke0dMSUIyX0lOQ0xVREVfRElSfQorICAgICAgICAke0dPQkpFQ1RfSU5DTFVERV9ESVJ9CisgICAgKQorCisgICAgc2V0KFRFU1RfTElCUkFSSUVTICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9IGRidXMtdGVzdHV0aWxzIGRidXMtdGVzdHV0aWxzLWdsaWIgJHtHTElCMl9MSUJSQVJJRVN9ICR7R09CSkVDVF9MSUJSQVJJRVN9KQorCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWNvcnJ1cHQgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2NvcnJ1cHQuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtZGJ1cy1kYWVtb24gJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2RidXMtZGFlbW9uLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWRidXMtZGFlbW9uLWVhdmVzZHJvcCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvZGJ1cy1kYWVtb24tZWF2ZXNkcm9wLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWZkcGFzcyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvZmRwYXNzLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWxvb3BiYWNrICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9sb29wYmFjay5jICR7VEVTVF9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1tYXJzaGFsICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9tYXJzaGFsLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LW1vbml0b3IgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L21vbml0b3IuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtcmVmcyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvaW50ZXJuYWxzL3JlZnMuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtcmVsYXkgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3JlbGF5LmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LXN5bnRheCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3Qvc3ludGF4LmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LXN5c2xvZyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvaW50ZXJuYWxzL3N5c2xvZy5jICR7VEVTVF9MSUJSQVJJRVN9KQorICAgIGFkZF9oZWxwZXJfZXhlY3V0YWJsZShtYW51YWwtYXV0aHogJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L21hbnVhbC1hdXRoei5jICR7VEVTVF9MSUJSQVJJRVN9KQorZW5kaWYoKQorCisjIyMga2VlcCB0aGVzZSBpbiBjcmVhdGlvbiBvcmRlciwgaS5lLiB1cHBlcm1vc3QgZGlycyBmaXJzdCAKK3NldCAoVEVTVERJUlMKKyAgICB0ZXN0L2RhdGEKKyAgICB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2F1dGgKKyAgICB0ZXN0L2RhdGEvc2hhLTEKKyAgICB0ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcworICAgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuZAorICAgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5kCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9zeXN0ZW0uZAorICAgIHRlc3QvZGF0YS92YWxpZC1pbnRyb3NwZWN0aW9uLWZpbGVzCisgICAgdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMKKyAgICB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMtc3lzdGVtCisgICAgdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbQorICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcworICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZAorKQorc2V0IChDT05GSUdfVkVSQk9TRSAwKQorCitGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICBGSUxFKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vJHtESVJ9KQorRU5ERk9SRUFDSChESVIpCisKKyMjIyBjb3B5IHRlc3RzIHRvIGJ1aWxkZGlyIHNvIHRoYXQgZ2VuZXJhdGVkIHRlc3RzIGFuZCBzdGF0aWMgdGVzdHMgCisjIyMgYXJlIGFsbCBpbiBvbmUgcGxhY2UuCitNRVNTQUdFKFNUQVRVUyAiQ29weWluZyB0ZXN0IGZpbGVzIHRvIHRlc3QgZGlyZWN0b3J5IikKK0ZPUkVBQ0goRklMRV9UWVBFICoubWVzc2FnZSAqLm1lc3NhZ2UtcmF3ICouYXV0aC1zY3JpcHQgKi5zaGExICoudHh0ICouY29uZiAqLnNlcnZpY2UpCisgICAgRk9SRUFDSChESVIgJHtURVNURElSU30pCisgICAgICAgIEZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke0RJUn0vJHtGSUxFX1RZUEV9IiApCisgICAgICAgIEZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICAgICAgICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoRklMRU5BTUUgJHtGSUxFfSBOQU1FKQorICAgICAgICAgICAgU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgICAgICAgICBjb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSBDT1BZT05MWSkKKyAgICAgICAgICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBNRVNTQUdFKCIke0ZJTEV9IikKKyAgICAgICAgICAgIEVORElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgRU5ERk9SRUFDSChGSUxFKQorICAgIEVOREZPUkVBQ0goRElSKQorRU5ERk9SRUFDSChGSUxFX1RZUEUpCisKKyMjIyBnZW5lcmF0ZSB0ZXN0IGZpbGVzCitNRVNTQUdFKFNUQVRVUyAiR2VuZXJhdGluZyB0ZXN0IGZpbGVzIGZyb20gdGVtcGxhdGVzIGludG8gdGVzdCBkaXJlY3RvcnkiKQorCitGT1JFQUNIKEZJTEVfVFlQRSAqLmNvbmYuaW4gKi5zZXJ2aWNlLmluKQorICBGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICBGSUxFKEdMT0IgRklMRVMgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vJHtESVJ9LyR7RklMRV9UWVBFfSIgKQorICAgIEZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoRklMRU5BTUUgJHtGSUxFfSBOQU1FKQorICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcLmluJCIgIiIgRklMRU5BTUUgJHtGSUxFTkFNRX0pCisgICAgICBTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfS8ke0ZJTEVOQU1FfSkKKyAgICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IEBPTkxZIElNTUVESUFURSkKKyAgICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgTUVTU0FHRSgiJHtGSUxFfSIpCisgICAgICBFTkRJRiAoQ09ORklHX1ZFUkJPU0UpCisgICAgRU5ERk9SRUFDSChGSUxFKQorICBFTkRGT1JFQUNIKERJUikKK0VOREZPUkVBQ0goRklMRV9UWVBFKQorCitNRVNTQUdFKFNUQVRVUyAiQ29weWluZyBnZW5lcmF0ZWQgYnVzIGNvbmZpZyBmaWxlcyB0byB0ZXN0IGRpcmVjdG9yeSIpCitjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9idXMvc2Vzc2lvbi5jb25mLmluIiAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIEBPTkxZKQorY29uZmlndXJlX2ZpbGUoIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vYnVzL3N5c3RlbS5jb25mLmluIiAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL3N5c3RlbS5jb25mIEBPTkxZKQpkaWZmIC0tZ2l0IGEvY21ha2UvdGVzdC9uYW1lLXRlc3QvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS90ZXN0L25hbWUtdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvdGVzdC9uYW1lLXRlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNSBAQAoraWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCitzZXQgKE5BTUV0ZXN0LURJUiAuLi8uLi8uLi90ZXN0L25hbWUtdGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCAke05BTUV0ZXN0LURJUn0vdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtdGhyZWFkLWluaXQgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtdGhyZWFkcy1pbml0LmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1pZHMgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtaWRzLmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zaHV0ZG93biAke05BTUV0ZXN0LURJUn0vdGVzdC1zaHV0ZG93bi5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtcHJpdnNlcnZlciAke05BTUV0ZXN0LURJUn0vdGVzdC1wcml2c2VydmVyLmMgZGJ1cy10ZXN0dXRpbHMpCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wcml2c2VydmVyLWNsaWVudCAke05BTUV0ZXN0LURJUn0vdGVzdC1wcml2c2VydmVyLWNsaWVudC5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtYXV0b2xhdW5jaCAke05BTUV0ZXN0LURJUn0vdGVzdC1hdXRvbGF1bmNoLmMgZGJ1cy10ZXN0dXRpbHMpCitlbmRpZiAoREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMpCmRpZmYgLS1naXQgYS9jbWFrZS90b29scy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL3Rvb2xzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmU5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS90b29scy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDgxIEBACithZGRfZGVmaW5pdGlvbnMoIi1EREJVU19DT01QSUxBVElPTiIpCisKK3NldCAoZGJ1c19zZW5kX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwkJCQorCS4uLy4uL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1zZW5kLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorKQorCitzZXQgKGRidXNfbW9uaXRvcl9TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1tb25pdG9yLmMJCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMJCQkKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaAorCS4uLy4uL3Rvb2xzL3Rvb2wtY29tbW9uLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5oCispCisKK3NldCAoZGJ1c190ZXN0X3Rvb2xfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtZWNoby5jCisJLi4vLi4vdG9vbHMvZGJ1cy1zcGFtLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorCS4uLy4uL3Rvb2xzL3Rlc3QtdG9vbC5jCisJLi4vLi4vdG9vbHMvdGVzdC10b29sLmgKKykKKworc2V0IChkYnVzX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50X1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorKQorCitpZiAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC13aW4uYworKQorZWxzZSAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uYworCS4uLy4uL3Rvb2xzL3Rvb2wtY29tbW9uLmgKKykKK2VuZGlmIChXSU4zMikKKworaWYgKERCVVNfQlVJTERfWDExKQorc2V0IChkYnVzX2xhdW5jaF9TT1VSQ0VTCisgICAgICR7ZGJ1c19sYXVuY2hfU09VUkNFU30KKyAgICAgLi4vLi4vdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMKKykKK2VuZGlmKERCVVNfQlVJTERfWDExKQorCitzZXQgKGRidXNfY2xlYW51cF9zb2NrZXRzX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCispCisKK2FkZF9leGVjdXRhYmxlKGRidXMtc2VuZCAke2RidXNfc2VuZF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLXNlbmQgJHtEQlVTX0xJQlJBUklFU30pCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLXNlbmQgKQorCithZGRfZXhlY3V0YWJsZShkYnVzLXRlc3QtdG9vbCAke2RidXNfdGVzdF90b29sX1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtdGVzdC10b29sICR7REJVU19MSUJSQVJJRVN9KQoraW5zdGFsbF90YXJnZXRzKC9iaW4gZGJ1cy10ZXN0LXRvb2wgKQorCithZGRfZXhlY3V0YWJsZShkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50ICR7ZGJ1c191cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50ICR7REJVU19MSUJSQVJJRVN9KQoraW5zdGFsbF90YXJnZXRzKC9iaW4gZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCApCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbGF1bmNoICR7ZGJ1c19sYXVuY2hfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggJHtEQlVTX0xJQlJBUklFU30pCitpZiAoREJVU19CVUlMRF9YMTEpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWxhdW5jaCAke1gxMV9MSUJSQVJJRVN9ICkKK2VuZGlmIChEQlVTX0JVSUxEX1gxMSkKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtbGF1bmNoICkKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy1tb25pdG9yICR7ZGJ1c19tb25pdG9yX1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtbW9uaXRvciAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtbW9uaXRvciApCisKKyMgY3JlYXRlIHRoZSAvdmFyL2xpYi9kYnVzIGRpcmVjdG9yeSBmb3IgZGJ1cy11dWlkZ2VuCitpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiB2YXIvbGliL2RidXMpCmRpZmYgLS1naXQgYS9jb25maWcuaCBiL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWUxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuaApAQCAtMCwwICsxLDUzNCBAQAorLyogY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLworLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KKy8qICN1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgKi8KKworLyogcG9sbCBkb2Vzbid0IHdvcmsgb24gZGV2aWNlcyAqLworLyogI3VuZGVmIEJST0tFTl9QT0xMICovCisKKy8qIERpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgYmluYXJpZXMgKi8KKyNkZWZpbmUgREJVU19CSU5ESVIgIi9zeXN0ZW0vYmluIgorCisvKiBEZWZpbmUgdG8gYnVpbGQgWDExIGZ1bmN0aW9uYWxpdHkgKi8KKy8qICN1bmRlZiBEQlVTX0JVSUxEX1gxMSAqLworCisvKiB3aGV0aGVyIC1leHBvcnQtZHluYW1pYyB3YXMgcGFzc2VkIHRvIGxpYnRvb2wgKi8KKy8qICN1bmRlZiBEQlVTX0JVSUxUX1JfRFlOQU1JQyAqLworCisvKiBVc2UgaW5vdGlmeSAqLworI2RlZmluZSBEQlVTX0JVU19FTkFCTEVfSU5PVElGWSAxCisKKy8qIFVzZSBrcXVldWUgKi8KKy8qICN1bmRlZiBEQlVTX0JVU19FTkFCTEVfS1FVRVVFICovCisKKy8qIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCAqLworI2RlZmluZSBEQlVTX0NPTlNPTEVfQVVUSF9ESVIgIi9ldGMiCisKKy8qIEZpbGUgdG8gY2hlY2sgZm9yIGNvbnNvbGUgb3duZXJoaXAgKi8KKy8qICN1bmRlZiBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAqLworCisvKiBEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIGN5Z3dpbiBBUEkgYmFzZWQgc3lzdGVtICovCisvKiAjdW5kZWYgREJVU19DWUdXSU4gKi8KKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbiAqLworI2RlZmluZSBEQlVTX0RBRU1PTkRJUiAiL3N5c3RlbS9iaW4iCisKKy8qIE5hbWUgb2YgZXhlY3V0YWJsZSAqLworI2RlZmluZSBEQlVTX0RBRU1PTl9OQU1FICJkYnVzLWRhZW1vbiIKKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIERCVVMgZGF0YSBmaWxlcyAqLworI2RlZmluZSBEQlVTX0RBVEFESVIgIi9kYXRhIgorCisvKiBEaXNhYmxlIGFzc2VydGlvbiBjaGVja2luZyAqLworLyogI3VuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworLyogRGlzYWJsZSBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZyAqLworLyogI3VuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworLyogRGVmaW5lIHRvIGJ1aWxkIHRlc3QgY29kZSBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBiaW5hcmllcyAqLworLyogI3VuZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qIFVzZSBsYXVuY2hkIGF1dG9sYXVuY2ggKi8KKy8qICN1bmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hEICovCisKKy8qIERlZmluZSB0byBidWlsZCBpbmRlcGVuZGVudCB0ZXN0IGJpbmFyaWVzICovCisvKiAjdW5kZWYgREJVU19FTkFCTEVfTU9EVUxBUl9URVNUUyAqLworCisvKiBEZWZpbmUgdG8gZW5hYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljcyAqLworLyogI3VuZGVmIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qIFN1cHBvcnQgYSB2ZXJib3NlIG1vZGUgKi8KKy8qICN1bmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworLyogRGVmaW5lIHRvIGVuYWJsZSBYMTEgYXV0by1sYXVuY2ggKi8KKy8qICN1bmRlZiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSCAqLworCisvKiBFeHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCB0eXBpY2FsbHkgZW1wdHkgb3IgLmV4ZSAqLworI2RlZmluZSBEQlVTX0VYRUVYVCAiIgorCisvKiBEZWZpbmVkIGlmIGdjb3YgaXMgZW5hYmxlZCB0byBmb3JjZSBhIHJlYnVpbGQgZHVlIHRvIGNvbmZpZy5oIGNoYW5naW5nICovCisvKiAjdW5kZWYgREJVU19HQ09WX0VOQUJMRUQgKi8KKworLyogRGVmaW5lIHRvIHVzZSBlcG9sbCg0KSBvbiBMaW51eCAqLworI2RlZmluZSBEQlVTX0hBVkVfTElOVVhfRVBPTEwgMQorCisvKiBEZWZpbmUgdG8gcHJpbnRmIG1vZGlmaWVyIGZvciA2NCBiaXQgaW50ZWdlciB0eXBlICovCisjZGVmaW5lIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJsbCIKKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBsaWJleGVjIGJpbmFyaWVzICovCisjZGVmaW5lIERCVVNfTElCRVhFQ0RJUiAiL3N5c3RlbS9iaW4iCisKKy8qIFByZWZpeCBmb3IgaW5zdGFsbGluZyBEQlVTICovCisjZGVmaW5lIERCVVNfUFJFRklYICIvc3lzdGVtIgorCisvKiBGYWxsYmFjayBhZGRyZXNzIGZvciBzZXNzaW9uIGJ1cyBjbGllbnRzICovCisjZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTICJhdXRvbGF1bmNoOiIKKworLyogV2hlcmUgcGVyLXNlc3Npb24gYnVzIHB1dHMgaXRzIHNvY2tldHMgKi8KKyNkZWZpbmUgREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgIi9kYXRhIgorCisvKiBUaGUgZGVmYXVsdCBELUJ1cyBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gYnVzICovCisjZGVmaW5lIERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgInVuaXg6cGF0aD0iREJVU19TWVNURU1fU09DS0VUCisKKy8qIFRoZSBuYW1lIG9mIHRoZSBzb2NrZXQgdGhlIHN5c3RlbSBidXMgbGlzdGVucyBvbiBieSBkZWZhdWx0ICovCisjZGVmaW5lIERCVVNfU1lTVEVNX1NPQ0tFVCAiL2Rldi9zb2NrZXQvZGJ1cyIKKworLyogRnVsbCBwYXRoIHRvIHRoZSBkYWVtb24gaW4gdGhlIGJ1aWxkZGlyICovCisjZGVmaW5lIERCVVNfVEVTVF9FWEVDICIvc3lzdGVtL2Jpbi9kYnVzLXRlc3QiCisKKy8qIEZ1bGwgcGF0aCB0byB0aGUgbGF1bmNoIGhlbHBlciB0ZXN0IHByb2dyYW0gaW4gdGhlIGJ1aWxkZGlyICovCisjZGVmaW5lIERCVVNfVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWSAiL3N5c3RlbS9iaW4vZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0IgorCisvKiBXaGVyZSB0byBwdXQgdGVzdCBzb2NrZXRzICovCisjZGVmaW5lIERCVVNfVEVTVF9TT0NLRVRfRElSICIvZGF0YSIKKworLyogVW5wcml2aWxlZ2VkIHVzZXIgdXNlZCBpbiBzb21lIHJlZ3Jlc3Npb24gdGVzdHMgKi8KKyNkZWZpbmUgREJVU19URVNUX1VTRVIgIm5vYm9keSIKKworLyogRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBVbml4LWJhc2VkIHN5c3RlbSAqLworI2RlZmluZSBEQlVTX1VOSVggMQorCisvKiBVc2VyIGZvciBydW5uaW5nIHRoZSBzeXN0ZW0gQlVTIGRhZW1vbiAqLworLyogI3VuZGVmIERCVVNfVVNFUiAibWVzc2FnZWJ1cyIgKi8KKworLyogVXNlIHRoZSBnY2MgX19zeW5jIGV4dGVuc2lvbiAqLworI2RlZmluZSBEQlVTX1VTRV9TWU5DIDEKKworLyogQSAndmFfY29weScgc3R5bGUgZnVuY3Rpb24gKi8KKyNkZWZpbmUgREJVU19WQV9DT1BZIHZhX2NvcHkKKworLyogJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlcyAqLworLyogI3VuZGVmIERCVVNfVkFfQ09QWV9BU19BUlJBWSAqLworCisvKiBEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBBUEkgYmFzZWQgc3lzdGVtICovCisvKiAjdW5kZWYgREJVU19XSU4gKi8KKworLyogRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBXMzIgQ0UgQVBJIGJhc2VkIHN5c3RlbSAqLworLyogI3VuZGVmIERCVVNfV0lOQ0UgKi8KKworLyogRGVmaW5lIGlmIEdMaWIsIEdPYmplY3QsIEdJTyBhcmUgYXZhaWxhYmxlICovCisvKiAjdW5kZWYgREJVU19XSVRIX0dMSUIgKi8KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlIGhhbmRsZWQgYXQgb25jZSAqLworLyogI3VuZGVmIEZEX1NFVFNJWkUgKi8KKworLyogVGhlIG5hbWUgb2YgdGhlIGdldHRleHQgZG9tYWluICovCisvKiAjdW5kZWYgR0VUVEVYVF9QQUNLQUdFICJkYnVzLTEiICovCisKKy8qIFByZXZlbnQgcG9zdC0yLjM4IEFQSXMgKi8KKyNkZWZpbmUgR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEIEdMSUJfVkVSU0lPTl8yXzM4CisKKy8qIElnbm9yZSBwb3N0LTIuMzYgZGVwcmVjYXRpb25zICovCisjZGVmaW5lIEdMSUJfVkVSU0lPTl9NSU5fUkVRVUlSRUQgR0xJQl9WRVJTSU9OXzJfMzYKKworLyogRGlzYWJsZSBHTGliIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nICovCisvKiAjdW5kZWYgR19ESVNBQkxFX0NIRUNLUyAqLworCisvKiBIYXZlIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgSEFWRV9BQlNUUkFDVF9TT0NLRVRTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY2NlcHQ0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BQ0NFUFQ0IDEKKworLyogQWR0IGF1ZGl0IEFQSSAqLworLyogI3VuZGVmIEhBVkVfQURUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YWxsb2NhLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKKworLyogQXBwQXJtb3IgU3VwcG9ydCAqLworLyogI3VuZGVmIEhBVkVfQVBQQVJNT1IgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYmFja3RyYWNlKCkuICovCisvKiAjdW5kZWYgSEFWRV9CQUNLVFJBQ0UgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxieXRlc3dhcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9CWVRFU1dBUF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbGVhcmVudicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ0xFQVJFTlYgMQorCisvKiBIYXZlIGNtc2djcmVkIHN0cnVjdHVyZSAqLworLyogI3VuZGVmIEhBVkVfQ01TR0NSRUQgKi8KKworLyogSGF2ZSBjb25zb2xlIG93bmVyIGZpbGUgKi8KKy8qICN1bmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNydF9leHRlcm5zLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfQ1JUX0VYVEVSTlNfSCAqLworCisvKiBIYXZlIHRoZSBkZGZkIG1lbWJlciBvZiBESVIgKi8KKy8qICN1bmRlZiBIQVZFX0RERkQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBMT0dfUEVSUk9SJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyNkZWZpbmUgSEFWRV9ERUNMX0xPR19QRVJST1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYE1TR19OT1NJR05BTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjZGVmaW5lIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ESVJFTlRfSCAxCisKKy8qIEhhdmUgZGlyZmQgZnVuY3Rpb24gKi8KKy8qICN1bmRlZiBIQVZFX0RJUkZEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRExGQ05fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXhlY2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVhFQ0lORk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXhwYXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVhQQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnBhdGhjb25mJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0ZQQVRIQ09ORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGdyb3VwbGlzdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUR1JPVVBMSVNUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVyZWlkJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVFBFRVJFSUQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVydWNyZWQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUUEVFUlVDUkVEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmVzdWlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRSRVNVSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJsaW1pdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUkxJTUlUIDEKKworLyogSGF2ZSBHTlUtc3R5bGUgdmFyYXJncyBtYWNyb3MgKi8KKy8qICN1bmRlZiBIQVZFX0dOVUNfVkFSQVJHUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlub3RpZnlfaW5pdDEnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0lOT1RJRllfSU5JVDEgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBIYXZlIElTTyBDOTkgdmFyYXJncyBtYWNyb3MgKi8KKyNkZWZpbmUgSEFWRV9JU09fVkFSQVJHUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNzZXR1Z2lkJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0lTU0VUVUdJRCAqLworCisvKiBhdWRpdCBkYWVtb24gU0VMaW51eCBzdXBwb3J0ICovCisvKiAjdW5kZWYgSEFWRV9MSUJBVURJVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbCcgbGlicmFyeSAoLWxuc2wpLiAqLworLyogI3VuZGVmIEhBVkVfTElCTlNMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9jYWxlY29udicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTE9DQUxFQ09OViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xPQ0FMRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSBDTE9DS19NT05PVE9OSUMgKi8KKyNkZWZpbmUgSEFWRV9NT05PVE9OSUNfQ0xPQ0sgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5hbm9zbGVlcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTkFOT1NMRUVQIDEKKworLyogSGF2ZSBub24tUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fciAqLworLyogI3VuZGVmIEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUiAqLworCisvKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gbmVlZHMgX05TR2V0RW52aXJvbiB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50ICovCisvKiAjdW5kZWYgSEFWRV9OU0dFVEVOVklST04gKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwaXBlMicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUElQRTIgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvbGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BPTEwgMQorCisvKiBIYXZlIFBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3IgKi8KKy8qICN1bmRlZiBIQVZFX1BPU0lYX0dFVFBXTkFNX1IgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwcmN0bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUFJDVEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJhaXNlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9SQUlTRSAxCisKKy8qIFNFTGludXggc3VwcG9ydCAqLworLyogI3VuZGVmIEhBVkVfU0VMSU5VWCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVExPQ0FMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVzdWlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRSRVNVSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJsaW1pdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUUkxJTUlUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldHBhaXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NPQ0tFVFBBSVIgMQorCisvKiBIYXZlIHNvY2tsZW5fdCB0eXBlICovCisjZGVmaW5lIEhBVkVfU09DS0xFTl9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSVE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlRPVUxMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNsb2cuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQorCisvKiBIYXZlIHN5c3RlbWQgKi8KKy8qICN1bmRlZiBIQVZFX1NZU1RFTUQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW5vdGlmeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfSU5PVElGWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJjdGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1BSQ1RMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c2xpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19TWVNMSU1JVFNfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVUlPX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIFN1cHBvcnRzIHNlbmRpbmcgVU5JWCBmaWxlIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIEhBVkVfVU5JWF9GRF9QQVNTSU5HIDEKKworLyogSGF2ZSB1bnBjYmlkIHN0cnVjdHVyZSAqLworLyogI3VuZGVmIEhBVkVfVU5QQ0JJRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuc2V0ZW52JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9VTlNFVEVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXNsZWVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9VU0xFRVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZhc3ByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVkFTUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgb3IgMCwgZGVwZW5kaW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHNpbXBsZSB2aXNpYmlsaXR5CisgICBkZWNsYXJhdGlvbnMuICovCisjZGVmaW5lIEhBVkVfVklTSUJJTElUWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdyaXRldicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3czJ0Y3BpcC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1dTMlRDUElQX0ggKi8KKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IHdoZXJlIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4gKi8KKyNkZWZpbmUgTFRfT0JKRElSICIubGlicy8iCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJkYnVzIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVCAqLworCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiZGJ1cyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiZGJ1cy0xLjEwLjEyIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisvKiAjdW5kZWYgUEFDS0FHRV9UQVJOQU1FICovCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMS4xMC4xMiIKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9DSEFSIDEKKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0lOVCA0CisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9ORyA0CisKKy8qIFRoZSBzaXplIG9mIGBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgOAorCisvKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9TSE9SVCAyCisKKy8qIFRoZSBzaXplIG9mIGB2b2lkIConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9WT0lEX1AgNAorCisvKiBUaGUgc2l6ZSBvZiBgX19pbnQ2NCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX19fSU5UNjQgOAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogRnVsbCBwYXRoIHRvIHRoZSBkYnVzLWxhdW5jaCBpbiB0aGUgYnVpbGRkaXIgKi8KKyNkZWZpbmUgVEVTVF9CVVNfTEFVTkNIX0JJTkFSWSAiL3N5c3RlbS9iaW4vZGJ1cy1sYXVuY2giCisKKy8qIExpc3RlbmluZyBhZGRyZXNzIGZvciByZWdyZXNzaW9uIHRlc3RzICovCisjZGVmaW5lIFRFU1RfTElTVEVOICJ1bml4OnRtcGRpcj0vZGF0YSIKKworLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gQUlYIDMsIEludGVyaXguICAqLworI2lmbmRlZiBfQUxMX1NPVVJDRQorIyBkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2VuZGlmCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKy8qIEVuYWJsZSB0aHJlYWRpbmcgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQorI2VuZGlmCisvKiBFbmFibGUgZXh0ZW5zaW9ucyBvbiBIUCBOb25TdG9wLiAgKi8KKyNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKKyMgZGVmaW5lIF9UQU5ERU1fU09VUkNFIDEKKyNlbmRpZgorLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX19FWFRFTlNJT05TX18KKyMgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKyNlbmRpZgorCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgVkVSU0lPTiAiMS4xMC4xMiIKKworLyogRGVmaW5lIHRvIGFkZCBWYWxncmluZCBpbnN0cnVtZW50YXRpb24gKi8KKy8qICN1bmRlZiBXSVRIX1ZBTEdSSU5EICovCisKKy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisvKiAjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4gKi8KKyMgZW5kaWYKKyNlbmRpZgorCisKKwkJCS8qIFVzZSB0aGUgY29tcGlsZXItcHJvdmlkZWQgZW5kaWFubmVzcyBkZWZpbmVzIHRvIGFsbG93IHVuaXZlcnNhbCBjb21waWxpbmcuICovCisJCQkjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKwkJCSNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKwkJCSNlbmRpZgorCQkKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIFggV2luZG93IFN5c3RlbSBpcyBtaXNzaW5nIG9yIG5vdCBiZWluZyB1c2VkLiAqLworI2RlZmluZSBYX0RJU1BMQVlfTUlTU0lORyAxCisKKworI2lmIGRlZmluZWQoSEFWRV9OU0dFVEVOVklST04pICYmIGRlZmluZWQoSEFWRV9DUlRfRVhURVJOU19IKQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorIyBkZWZpbmUgZW52aXJvbiAoKl9OU0dldEVudmlyb24oKSkKKyNlbmRpZgorCisKKy8qIEVuYWJsZSBsYXJnZSBpbm9kZSBudW1iZXJzIG9uIE1hYyBPUyBYIDEwLjUuICAqLworI2lmbmRlZiBfREFSV0lOX1VTRV82NF9CSVRfSU5PREUKKyMgZGVmaW5lIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAxCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS4gKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKworLyogRGVmaW5lIGZvciBsYXJnZSBmaWxlcywgb24gQUlYLXN0eWxlIGhvc3RzLiAqLworLyogI3VuZGVmIF9MQVJHRV9GSUxFUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBvbiBNSU5JWC4gKi8KKy8qICN1bmRlZiBfTUlOSVggKi8KKworLyogRGVmaW5lIHRvIDIgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIFBPU0lYLjEgZmVhdHVyZXMgZXhjZXB0IHdpdGgKKyAgIHRoaXMgZGVmaW5lZC4gKi8KKy8qICN1bmRlZiBfUE9TSVhfMV9TT1VSQ0UgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIGBzdGF0JyBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICovCisvKiAjdW5kZWYgX1BPU0lYX1NPVVJDRSAqLworCisvKiBEZWZpbmVkIHRvIGdldCBuZXdlciBXMzIgQ0UgQVBJcyAqLworLyogI3VuZGVmIF9XSU4zMl9XQ0UgKi8KKworLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCisgICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qICN1bmRlZiBpbmxpbmUgKi8KKyNlbmRpZgorCisKKy8qIGV4cGxpY2l0bHkgZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBnZXQgbGVzcyBjb25mdXNpbmcgY29uZGl0aW9ucyAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjICBkZWZpbmUgREJVU19FTkFCTEVfQVNTRVJUIDEKKyNlbmRpZgorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjICBkZWZpbmUgREJVU19FTkFCTEVfQ0hFQ0tTIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWExMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwxOTk0IEBACitkbmwgLSotIG1vZGU6IG00IC0qLQorQUNfUFJFUkVRKFsyLjYzXSkKKworbTRfZGVmaW5lKFtkYnVzX21ham9yX3ZlcnNpb25dLCBbMV0pCittNF9kZWZpbmUoW2RidXNfbWlub3JfdmVyc2lvbl0sIFsxMF0pCittNF9kZWZpbmUoW2RidXNfbWljcm9fdmVyc2lvbl0sIFsxMl0pCittNF9kZWZpbmUoW2RidXNfdmVyc2lvbl0sCisgICAgICAgICAgW2RidXNfbWFqb3JfdmVyc2lvbi5kYnVzX21pbm9yX3ZlcnNpb24uZGJ1c19taWNyb192ZXJzaW9uXSkKK0FDX0lOSVQoW2RidXNdLFtkYnVzX3ZlcnNpb25dLFtodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzXSxbZGJ1c10pCitBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKKworQUNfQ0FOT05JQ0FMX0hPU1QKKworQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKKworQU1fSU5JVF9BVVRPTUFLRShbMS4xMyB0YXItdXN0YXIgLVduby1wb3J0YWJpbGl0eSBzdWJkaXItb2JqZWN0c10pCisKK0dFVFRFWFRfUEFDS0FHRT1kYnVzLTEKK0FDX1NVQlNUKEdFVFRFWFRfUEFDS0FHRSkKK0FDX0RFRklORV9VTlFVT1RFRChHRVRURVhUX1BBQ0tBR0UsIiRHRVRURVhUX1BBQ0tBR0UiLFtUaGUgbmFtZSBvZiB0aGUgZ2V0dGV4dCBkb21haW5dKQorCisjIEJ5IGRlZmF1bHQsIHJlYnVpbGQgYXV0b3Rvb2xzIGZpbGVzIG9uIGRlbWFuZDsgb25seSB1c2UgLi9taXNzaW5nIGlmIHRoZQorIyB1c2VyIHNheXMgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSAoc29tZSBkaXN0cmlidXRpb25zIGxpa2UgdG8gZG8gdGhpcykKK0FNX01BSU5UQUlORVJfTU9ERShbZW5hYmxlXSkKKworbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQUVNT05fTkFNRSwiZGJ1cy1kYWVtb24iLFtOYW1lIG9mIGV4ZWN1dGFibGVdKQorCisjIGxpYnRvb2wgdmVyc2lvbmluZyAtIHRoaXMgYXBwbGllcyB0byBsaWJkYnVzCisjCisjIFNlZSBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2F1dG9ib29rL2F1dG9ib29rL2F1dG9ib29rXzkxLmh0bWwjU0VDOTEgZm9yIGRldGFpbHMKKyMKKworIyMgaW5jcmVtZW50IGlmIHRoZSBpbnRlcmZhY2UgaGFzIGFkZGl0aW9ucywgY2hhbmdlcywgcmVtb3ZhbHMuCitMVF9DVVJSRU5UPTE3CisKKyMjIGluY3JlbWVudCBhbnkgdGltZSB0aGUgc291cmNlIGNoYW5nZXM7IHNldCB0bworIyMgIDAgaWYgeW91IGluY3JlbWVudCBDVVJSRU5UCitMVF9SRVZJU0lPTj04CisKKyMjIGluY3JlbWVudCBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQ7IHNldCB0byAwCisjIyBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gY2hhbmdlZCBvciByZW1vdmVkLiByZW1vdmFsIGhhcworIyMgcHJlY2VkZW5jZSBvdmVyIGFkZGluZywgc28gc2V0IHRvIDAgaWYgYm90aCBoYXBwZW5lZC4KK0xUX0FHRT0xNAorCitBQ19TVUJTVChMVF9DVVJSRU5UKQorQUNfU1VCU1QoTFRfUkVWSVNJT04pCitBQ19TVUJTVChMVF9BR0UpCitTT1ZFUlNJT049YGV4cHIgJHtMVF9DVVJSRU5UfSAtICR7TFRfQUdFfWAKK0FDX1NVQlNUKFtTT1ZFUlNJT05dKQorCitEQlVTX01BSk9SX1ZFUlNJT049ZGJ1c19tYWpvcl92ZXJzaW9uCitEQlVTX01JTk9SX1ZFUlNJT049ZGJ1c19taW5vcl92ZXJzaW9uCitEQlVTX01JQ1JPX1ZFUlNJT049ZGJ1c19taWNyb192ZXJzaW9uCitEQlVTX1ZFUlNJT049ZGJ1c19tYWpvcl92ZXJzaW9uLmRidXNfbWlub3JfdmVyc2lvbi5kYnVzX21pY3JvX3ZlcnNpb24KKworQUNfU1VCU1QoREJVU19NQUpPUl9WRVJTSU9OKQorQUNfU1VCU1QoREJVU19NSU5PUl9WRVJTSU9OKQorQUNfU1VCU1QoREJVU19NSUNST19WRVJTSU9OKQorQUNfU1VCU1QoREJVU19WRVJTSU9OKQorCitBQ19QUk9HX0NDCitBTV9QUk9HX0NDX0NfTworQUNfUFJPR19DWFgKK0FDX1VTRV9TWVNURU1fRVhURU5TSU9OUworQUNfU1lTX0xBUkdFRklMRQorQUNfSVNDX1BPU0lYCitBQ19IRUFERVJfU1REQworQUNfQ19JTkxJTkUKK0FNX1BST0dfTElCVE9PTAorQUNfUFJPR19NS0RJUl9QCitDT01QSUxFUl9DT1ZFUkFHRQorQ09NUElMRVJfT1BUSU1JU0FUSU9OUworUEtHX1BST0dfUEtHX0NPTkZJRworCisjIFRBUCB0ZXN0IGRyaXZlciBzdXBwb3J0CitBQ19QUk9HX0FXSworQUNfUkVRVUlSRV9BVVhfRklMRShbdGFwLWRyaXZlci5zaF0pCisKKyMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHdlIHNldCB1cCBjb21waWxlciB3YXJuaW5ncyBiZWNhdXNlIGl0IGFzc3VtZXMKKyMgbm9uLXVzZSBvZiAtV2Vycm9yPW1pc3NpbmctcHJvdG90eXBlcworZ2xfVklTSUJJTElUWQorQU1fQ09ORElUSU9OQUwoW0hBVkVfVklTSUJJTElUWV0sIFt0ZXN0ICJ4JEhBVkVfVklTSUJJTElUWSIgPSB4MV0pCisKKyMgSW5pdGlhbGl6ZSBsaWJ0b29sCitMVF9JTklUKFt3aW4zMi1kbGxdKQorTFRfTEFORyhbV2luZG93cyBSZXNvdXJjZV0pCisKKyMgU2V0IHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gZm9yIGxhdGVyIHVzZS4KK2RidXNfd2luPW5vCitkYnVzX2N5Z3dpbj1ubworZGJ1c191bml4PW5vCitjYXNlICIke2hvc3R9IiBpbgorICAgICotbWluZ3czMmNlKikKKyAgICAgICAgZGJ1c193aW49eWVzCisgICAgICAgIGRidXNfd2luY2U9eWVzCisgICAgICAgIDs7CisgICAgKi1taW5ndzMyKikKKyAgICAgICAgZGJ1c193aW49eWVzCisgICAgICAgIDs7CisgICAgKi1jeWd3aW4qKQorICAgICAgICBkYnVzX2N5Z3dpbj15ZXMKKyAgICAgICAgZGJ1c191bml4PXllcworICAgICAgICA7OworICAgICopCisgICAgICAgIGRidXNfdW5peD15ZXMKKyAgICAgICA7OworZXNhYworCisjIFNwZWNpYWwgZGVmaW5lcyBmb3IgY2VydGFpbiBwbGF0Zm9ybXMKK2lmIHRlc3QgIiRkYnVzX3dpbiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19XSU4sMSxbRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBXMzIgQVBJIGJhc2VkIHN5c3RlbV0pCisgICAgIyBZZXMsIG9uIFdpbmRvd3MgaXQgcmVhbGx5IGRvZXMgd29yayBsaWtlIHRoaXMuCisgICAgIyBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExMTg1NQorICAgIEFDX0RFRklORShGRF9TRVRTSVpFLDgxOTIsW1RoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IGNhbiBiZSBoYW5kbGVkIGF0IG9uY2VdKQorICAgIEJVSUxEX1RJTUVTVEFNUD1gZGF0ZSAtLWlzby04NjAxPW1pbnV0ZXNgCisgICAgQUNfU1VCU1QoQlVJTERfVElNRVNUQU1QKQorICAgICMgQXNzdW1lIERCVVNfVkVSU0lPTiBpcyBhbHdheXMgdGhyZWUgbnVtYmVycworICAgIEJVSUxEX0ZJTEVWRVJTSU9OPWBlY2hvICIkREJVU19WRVJTSU9OIiB8IHNlZCAtZSAncy9cLi8sL2cnYCwwCisgICAgQUNfU1VCU1QoQlVJTERfRklMRVZFUlNJT04pCisgICAgQUNfQ0hFQ0tfVE9PTChXSU5EUkVTLCB3aW5kcmVzLCBubykKKyAgICBpZiB0ZXN0ICIkV0lORFJFUyIgPSBubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQ291bGQgbm90IGZpbmQgYW4gaW1wbGVtZW50YXRpb24gb2Ygd2luZHJlcyBpbiB5b3VyIFBBVEguXSkKKyAgICBmaQorICAgIGlmIHRlc3QgIiRkYnVzX3dpbmNlIiA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKERCVVNfV0lOQ0UsMSxbRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBXMzIgQ0UgQVBJIGJhc2VkIHN5c3RlbV0pCisgICAgICBBQ19ERUZJTkUoX1dJTjMyX1dDRSwgMHgwNTAyLCBbRGVmaW5lZCB0byBnZXQgbmV3ZXIgVzMyIENFIEFQSXNdKQorICAgIGZpCitlbHNlCisgICAgQUNfREVGSU5FKERCVVNfVU5JWCwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFVuaXgtYmFzZWQgc3lzdGVtXSkKK2ZpCitpZiB0ZXN0ICIkZGJ1c19jeWd3aW4iID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfQ1lHV0lOLDEsW0RlZmluZWQgaWYgd2UgcnVuIG9uIGEgY3lnd2luIEFQSSBiYXNlZCBzeXN0ZW1dKQorZmkKKworIyBGb3IgYmVzdCBzZWN1cml0eSwgYXNzdW1lIHRoYXQgYWxsIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBjYW4gZG8KKyMgY3JlZGVudGlhbHMtcGFzc2luZy4KK0FTX0lGKFt0ZXN0ICIkZGJ1c193aW4iID0geWVzXSwKKyAgICBbREJVU19TRVNTSU9OX0NPTkZfTUFZQkVfQVVUSF9FWFRFUk5BTD0iPCEtLTxhdXRoPkVYVEVSTkFMPC9hdXRoPi0tPiJdLAorICAgIFtEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMPSI8YXV0aD5FWFRFUk5BTDwvYXV0aD4iXSkKK0FDX1NVQlNUKFtEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMXSkKKworQU1fQ09ORElUSU9OQUwoREJVU19XSU4sIHRlc3QgIiRkYnVzX3dpbiIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChEQlVTX1dJTkNFLCB0ZXN0ICIkZGJ1c193aW5jZSIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChEQlVTX1VOSVgsIHRlc3QgIiRkYnVzX3VuaXgiID0geWVzKQorQU1fQ09ORElUSU9OQUwoREJVU19DWUdXSU4sIHRlc3QgIiRkYnVzX2N5Z3dpbiIgPSB5ZXMpCisKKyMgdGhpcyBtdXN0IGNvbWUgZmlyc3Q6IG90aGVyIG9wdGlvbnMgdXNlIHRoaXMgdG8gc2V0IHRoZWlyIGRlZmF1bHRzCitBQ19BUkdfRU5BQkxFKFtkZXZlbG9wZXJdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRldmVsb3Blcl0sCisgICAgW3NldCBkZWZhdWx0cyB0byBiZSBhcHByb3ByaWF0ZSBmb3IgYSBELUJ1cyBkZXZlbG9wZXIgaW5zdGVhZCBvZiBhIGRpc3RyaWJ1dGlvbi9lbmQtdXNlcl0pXSwKKyAgW10sCisgIFtlbmFibGVfZGV2ZWxvcGVyPW5vXSkKKworREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1M9CitpZiB0ZXN0ICJ4JGVuYWJsZV9zaGFyZWQiID0geG5vOyB0aGVuCisgICAgIyBPbiBXaW5kb3dzLCBsaW5raW5nIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5IHJlcXVpcmVzIHNwZWNpYWwgZWZmb3J0CisgICAgIyB0byB0dXJuIG9mZiBETEwgaW1wb3J0L2V4cG9ydCBwcm9jZXNzaW5nLiBXZSBub3JtYWxseSBsaW5rIHNvbWUgdGhpbmdzCisgICAgIyBhZ2FpbnN0IHRoZSBkeW5hbWljIGxpYnJhcnksIGJ1dCBpZiB3ZSdyZSBub3QgYnVpbGRpbmcgdGhhdCwgd2UnbGwKKyAgICAjIGhhdmUgdG8gbGluayBldmVyeXRoaW5nIHN0YXRpY2FsbHkuCisgICAgREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1M9LUREQlVTX1NUQVRJQ19CVUlMRAorZmkKK0FDX1NVQlNUKFtEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHU10pCisKK0FDX0FSR19FTkFCTEUoYW5zaSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFuc2ldLFtlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFnc10pLGVuYWJsZV9hbnNpPSRlbmFibGV2YWwsZW5hYmxlX2Fuc2k9bm8pCitBQ19BUkdfRU5BQkxFKHZlcmJvc2UtbW9kZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZlcmJvc2UtbW9kZV0sW3N1cHBvcnQgdmVyYm9zZSBkZWJ1ZyBtb2RlXSksZW5hYmxlX3ZlcmJvc2VfbW9kZT0kZW5hYmxldmFsLGVuYWJsZV92ZXJib3NlX21vZGU9JGVuYWJsZV9kZXZlbG9wZXIpCitBQ19BUkdfRU5BQkxFKGFzc2VydHMsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hc3NlcnRzXSxbaW5jbHVkZSBhc3NlcnRpb24gY2hlY2tzXSksZW5hYmxlX2Fzc2VydHM9JGVuYWJsZXZhbCxlbmFibGVfYXNzZXJ0cz0kZW5hYmxlX2RldmVsb3BlcikKK0FDX0FSR19FTkFCTEUoY2hlY2tzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY2hlY2tzXSxbaW5jbHVkZSBzYW5pdHkgY2hlY2tzIG9uIHB1YmxpYyBBUEldKSxlbmFibGVfY2hlY2tzPSRlbmFibGV2YWwsZW5hYmxlX2NoZWNrcz15ZXMpCitBQ19BUkdfRU5BQkxFKHhtbC1kb2NzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUteG1sLWRvY3NdLFtidWlsZCBYTUwgZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgeG1sdG8pXSksZW5hYmxlX3htbF9kb2NzPSRlbmFibGV2YWwsZW5hYmxlX3htbF9kb2NzPWF1dG8pCitBQ19BUkdfRU5BQkxFKGRveHlnZW4tZG9jcywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRveHlnZW4tZG9jc10sW2J1aWxkIERPWFlHRU4gZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgRG94eWdlbildKSxlbmFibGVfZG94eWdlbl9kb2NzPSRlbmFibGV2YWwsZW5hYmxlX2RveHlnZW5fZG9jcz1hdXRvKQorQUNfQVJHX0VOQUJMRShbZHVja3R5cGUtZG9jc10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kdWNrdHlwZS1kb2NzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1aWxkIER1Y2t0eXBlIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIER1Y2t0eXBlKV0pLAorICAgICAgICAgICAgICBbZW5hYmxlX2R1Y2t0eXBlX2RvY3M9JGVuYWJsZXZhbF0sIFtlbmFibGVfZHVja3R5cGVfZG9jcz1hdXRvXSkKK0FDX0FSR19FTkFCTEUoYWJzdHJhY3Qtc29ja2V0cywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHNdLFt1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSAobGludXggb25seSldKSxlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz0kZW5hYmxldmFsLGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzPWF1dG8pCitBQ19BUkdfRU5BQkxFKHNlbGludXgsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zZWxpbnV4XSxbYnVpbGQgd2l0aCBTRUxpbnV4IHN1cHBvcnRdKSxlbmFibGVfc2VsaW51eD0kZW5hYmxldmFsLGVuYWJsZV9zZWxpbnV4PWF1dG8pCitBQ19BUkdfRU5BQkxFKFthcHBhcm1vcl0sCisgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYXBwYXJtb3JdLCBbYnVpbGQgd2l0aCBBcHBBcm1vciBzdXBwb3J0XSldLAorICBbZW5hYmxlX2FwcGFybW9yPSRlbmFibGV2YWxdLAorICBbZW5hYmxlX2FwcGFybW9yPWF1dG9dKQorQUNfQVJHX0VOQUJMRShsaWJhdWRpdCxBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGliYXVkaXRdLFtidWlsZCBhdWRpdCBkYWVtb24gc3VwcG9ydCBmb3IgU0VMaW51eF0pLGVuYWJsZV9saWJhdWRpdD0kZW5hYmxldmFsLGVuYWJsZV9saWJhdWRpdD1hdXRvKQorQUNfQVJHX0VOQUJMRShpbm90aWZ5LCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtaW5vdGlmeV0sW2J1aWxkIHdpdGggaW5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KV0pLGVuYWJsZV9pbm90aWZ5PSRlbmFibGV2YWwsZW5hYmxlX2lub3RpZnk9YXV0bykKK0FDX0FSR19FTkFCTEUoa3F1ZXVlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUta3F1ZXVlXSxbYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydF0pLGVuYWJsZV9rcXVldWU9JGVuYWJsZXZhbCxlbmFibGVfa3F1ZXVlPWF1dG8pCitBQ19BUkdfRU5BQkxFKGNvbnNvbGUtb3duZXItZmlsZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNvbnNvbGUtb3duZXItZmlsZV0sW2VuYWJsZSBjb25zb2xlIG93bmVyIGZpbGVdKSxlbmFibGVfY29uc29sZV9vd25lcl9maWxlPSRlbmFibGV2YWwsZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZT1hdXRvKQorQUNfQVJHX0VOQUJMRShsYXVuY2hkLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGF1bmNoZF0sW2J1aWxkIHdpdGggbGF1bmNoZCBhdXRvLWxhdW5jaCBzdXBwb3J0XSksZW5hYmxlX2xhdW5jaGQ9JGVuYWJsZXZhbCxlbmFibGVfbGF1bmNoZD1hdXRvKQorQUNfQVJHX0VOQUJMRShzeXN0ZW1kLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3lzdGVtZF0sW2J1aWxkIHdpdGggc3lzdGVtZCBhdF9jb25zb2xlIHN1cHBvcnRdKSxlbmFibGVfc3lzdGVtZD0kZW5hYmxldmFsLGVuYWJsZV9zeXN0ZW1kPWF1dG8pCisKK0FDX0FSR19XSVRIKGluaXQtc2NyaXB0cywgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1pbml0LXNjcmlwdHM9W3JlZGhhdF1dLFtTdHlsZSBvZiBpbml0IHNjcmlwdHMgdG8gaW5zdGFsbF0pKQorQUNfQVJHX1dJVEgoc2Vzc2lvbi1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXNlc3Npb24tc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzXSkpCitBQ19BUkdfV0lUSCh0ZXN0LXNvY2tldC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtdGVzdC1zb2NrZXQtZGlyPVtkaXJuYW1lXV0sW1doZXJlIHRvIHB1dCBzb2NrZXRzIGZvciBtYWtlIGNoZWNrXSkpCitBQ19BUkdfV0lUSChzeXN0ZW0tcGlkLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtLXBpZC1maWxlPVtwaWRmaWxlXV0sW1BJRCBmaWxlIGZvciBzeXN0ZW13aWRlIGRhZW1vbl0pKQorQUNfQVJHX1dJVEgoc3lzdGVtLXNvY2tldCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tc29ja2V0PVtmaWxlbmFtZV1dLFtVTklYIGRvbWFpbiBzb2NrZXQgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLWF1dGgtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLW93bmVyLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uc29sZS1vd25lci1maWxlPVtmaWxlbmFtZV1dLFtmaWxlIHdob3NlIG93bmVyIGRldGVybWluZXMgY3VycmVudCBjb25zb2xlIG93bmVyXSkpCitBQ19BUkdfV0lUSChsYXVuY2hkLWFnZW50LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1sYXVuY2hkLWFnZW50LWRpcj1bZGlybmFtZV1dLFtkaXJlY3RvcnkgdG8gcHV0IHRoZSBsYXVuY2hkIGFnZW50IChkZWZhdWx0OiAvTGlicmFyeS9MYXVuY2hBZ2VudHMpXSkpCitBQ19BUkdfV0lUSChkYnVzX3VzZXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy11c2VyPTx1c2VyPl0sW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIERCVVMgZGFlbW9uIChtZXNzYWdlYnVzKV0pKQorQUNfQVJHX1dJVEgoW3Rlc3RfdXNlcl0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXRlc3QtdXNlcj08dXNlcj5dLAorICAgIFtVbnByaXZpbGVnZWQgdXNlciBmb3IgcmVncmVzc2lvbiB0ZXN0cywgb3RoZXIgdGhhbiByb290IGFuZCB0aGUgZGJ1c191c2VyIChkZWZhdWx0OiBub2JvZHkpXSldKQorQUNfQVJHX1dJVEgoZGJ1c19kYWVtb25kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy1kYWVtb25kaXI9W2Rpcm5hbWVdXSxbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbl0pKQorCitBQ19BUkdfRU5BQkxFKFtlbWJlZGRlZC10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1lbWJlZGRlZC10ZXN0c10sCisgICAgW2VuYWJsZSB1bml0IHRlc3QgY29kZSBpbiB0aGUgbGlicmFyeSBhbmQgYmluYXJpZXNdKSwKKyAgW10sIFtlbmFibGVfZW1iZWRkZWRfdGVzdHM9JGVuYWJsZV9kZXZlbG9wZXJdKQorQUNfQVJHX0VOQUJMRShbbW9kdWxhci10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tb2R1bGFyLXRlc3RzXSwKKyAgICBbZW5hYmxlIG1vZHVsYXIgcmVncmVzc2lvbiB0ZXN0cyAocmVxdWlyZXMgR0xpYildKSwKKyAgW10sIFtlbmFibGVfbW9kdWxhcl90ZXN0cz1hdXRvXSkKKyMgLS1lbmFibGUtdGVzdHMgb3ZlcnJpZGVzIGJvdGggLS1lbmFibGUtZW1iZWRkZWQtdGVzdHMgYW5kCisjIC0tZW5hYmxlLW1vZHVsYXItdGVzdHMKK0FDX0FSR19FTkFCTEUoW3Rlc3RzXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlc3RzXSwKKyAgICBbZW5hYmxlL2Rpc2FibGUgYWxsIHRlc3RzLCBvdmVycmlkaW5nIGVtYmVkZGVkLXRlc3RzL21vZHVsYXItdGVzdHNdKSwKKyAgWworICBpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4eWVzOyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRnVsbCB0ZXN0IGNvdmVyYWdlIHdhcyByZXF1ZXN0ZWQgd2l0aCAtLWVuYWJsZS10ZXN0cz15ZXNdKQorICAgIEFDX01TR19OT1RJQ0UoW1RoaXMgaGFzIG1hbnkgZGVwZW5kZW5jaWVzIChHTGliLCBQeXRob24gZXRjLildKQorICBmaQorICBlbmFibGVfZW1iZWRkZWRfdGVzdHM9JGVuYWJsZXZhbAorICBlbmFibGVfbW9kdWxhcl90ZXN0cz0kZW5hYmxldmFsCisgIF0sCisgIFtdKQorCisjIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTIGNvbnRyb2xzIHVuaXQgdGVzdHMgYnVpbHQgaW4gdG8gLmMgZmlsZXMKKyMgYW5kIGFsc28gc29tZSBzdHVmZiBpbiB0aGUgdGVzdC8gc3ViZGlyLgorQU1fQ09ORElUSU9OQUwoW0RCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRlbmFibGVfZW1iZWRkZWRfdGVzdHMiID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShbREJVU19FTkFCTEVfRU1CRURERURfVEVTVFNdLCBbMV0sCisgICAgICBbRGVmaW5lIHRvIGJ1aWxkIHRlc3QgY29kZSBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBiaW5hcmllc10pCitmaQorCisjIERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMgY29udHJvbHMgdGVzdHMgdGhhdCB3b3JrIGJhc2VkIG9uIHB1YmxpYyBBUEkuCisjIFRoZXNlIHVzZSBHVGVzdCwgZnJvbSBHTGliLCBiZWNhdXNlIGxpZmUncyB0b28gc2hvcnQuIFRoZXkncmUgZW5hYmxlZCBieQorIyBkZWZhdWx0ICh1bmxlc3MgeW91IGRvbid0IGhhdmUgR0xpYiksIGJlY2F1c2UgdGhleSBkb24ndCBibG9hdCB0aGUgbGlicmFyeQorIyBvciBiaW5hcmllcy4KKworQUNfREVGSU5FKFtHTElCX1ZFUlNJT05fTUlOX1JFUVVJUkVEXSwgW0dMSUJfVkVSU0lPTl8yXzM2XSwgW0lnbm9yZSBwb3N0LTIuMzYgZGVwcmVjYXRpb25zXSkKK0FDX0RFRklORShbR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEXSwgW0dMSUJfVkVSU0lPTl8yXzM4XSwgW1ByZXZlbnQgcG9zdC0yLjM4IEFQSXNdKQorCit3aXRoX2dsaWI9eWVzCisKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9tb2R1bGFyX3Rlc3RzIiAhPSB4bm9dLAorICBbCisgIFBLR19DSEVDS19NT0RVTEVTKFtHTElCXSwgW2dsaWItMi4wID49IDIuMzYsIGdpby0yLjAgPj0gMi4zNl0sCisgICAgW10sCisgICAgW2lmIHRlc3QgIngkZW5hYmxlX21vZHVsYXJfdGVzdHMiID0geHllczsgdGhlbgorICAgICAgQUNfTVNHX05PVElDRShbRnVsbCB0ZXN0IGNvdmVyYWdlICgtLWVuYWJsZS1tb2R1bGFyLXRlc3RzPXllcyBvciAtLWVuYWJsZS10ZXN0cz15ZXMpIHJlcXVpcmVzIEdMaWJdKQorICAgICAgQUNfTVNHX0VSUk9SKFskR0xJQl9FUlJPUlNdKQorICAgIGVsc2UgIyBhc3N1bWVkIHRvIGJlICJhdXRvIgorICAgICAgd2l0aF9nbGliPW5vCisgICAgZmldKQorICBdLAorICBbd2l0aF9nbGliPW5vXSkKKworaWYgdGVzdCAieCRlbmFibGVfbW9kdWxhcl90ZXN0cyIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbREJVU19FTkFCTEVfTU9EVUxBUl9URVNUU10sIFsxXSwKKyAgICBbRGVmaW5lIHRvIGJ1aWxkIGluZGVwZW5kZW50IHRlc3QgYmluYXJpZXNdKQorZmkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX21vZHVsYXJfdGVzdHMiICE9IHhub10pCisKK2lmIHRlc3QgIngkd2l0aF9nbGliIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX1dJVEhfR0xJQl0sIFsxXSwKKyAgICBbRGVmaW5lIGlmIEdMaWIsIEdPYmplY3QsIEdJTyBhcmUgYXZhaWxhYmxlXSkKK2ZpCitBTV9DT05ESVRJT05BTChbREJVU19XSVRIX0dMSUJdLCBbdGVzdCAieCR3aXRoX2dsaWIiICE9IHhub10pCisKK0FDX0FSR19FTkFCTEUoW2luc3RhbGxlZC10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1pbnN0YWxsZWQtdGVzdHNdLAorICAgIFtlbmFibGUgdW5pdCB0ZXN0IGNvZGUgaW4gdGhlIGxpYnJhcnkgYW5kIGJpbmFyaWVzXSksCisgIFtdLCBbZW5hYmxlX2luc3RhbGxlZF90ZXN0cz1ub10pCitBTV9DT05ESVRJT05BTChbREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX2luc3RhbGxlZF90ZXN0cyIgPSB4eWVzXSkKKworaWYgdGVzdCAieCRlbmFibGVfdGVzdHMiID0geHllczsgdGhlbgorICAjIGZ1bGwgdGVzdCBjb3ZlcmFnZSBpcyByZXF1aXJlZCwgUHl0aG9uIGlzIGEgaGFyZCBkZXBlbmRlbmN5CisgIEFDX01TR19OT1RJQ0UoW0Z1bGwgdGVzdCBjb3ZlcmFnZSAoLS1lbmFibGUtdGVzdHM9eWVzKSByZXF1aXJlcyBQeXRob24sIGRidXMtcHl0aG9uLCBweWdpXSkKKyAgQU1fUEFUSF9QWVRIT04oWzIuNl0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIFB5dGhvbiBtb2R1bGVzIGZvciBmdWxsIHRlc3QgY292ZXJhZ2VdKQorICBpZiAiJFBZVEhPTiIgLWMgImltcG9ydCBkYnVzLCBnaS5yZXBvc2l0b3J5LkdPYmplY3QsIGRidXMubWFpbmxvb3AuZ2xpYiI7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIEFDX01TR19FUlJPUihbY2Fubm90IGltcG9ydCBkYnVzLCBnaS5yZXBvc2l0b3J5LkdPYmplY3QsIGRidXMubWFpbmxvb3AuZ2xpYiBQeXRob24gbW9kdWxlc10pCisgIGZpCitlbHNlCisgICMgLS1lbmFibGUtdGVzdHMgbm90IGdpdmVuOiBkbyBub3QgYWJvcnQgaWYgUHl0aG9uIGlzIG1pc3NpbmcKKyAgQU1fUEFUSF9QWVRIT04oWzIuNl0sIFtdLCBbOl0pCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3ZlcmJvc2VfbW9kZSA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFLDEsW1N1cHBvcnQgYSB2ZXJib3NlIG1vZGVdKQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9hc3NlcnRzID0geG5vOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRElTQUJMRV9BU1NFUlQsMSxbRGlzYWJsZSBhc3NlcnRpb24gY2hlY2tpbmddKQorICAgIERJU0FCTEVfVU5VU0VEX1dBUk5JTkdTPSJ1bnVzZWQtbGFiZWwiCisgICAgUl9EWU5BTUlDX0xERkxBRz0iIgorICAgIGlmIHRlc3QgeCRlbmFibGVfZW1iZWRkZWRfdGVzdHMgPSB4eWVzOyB0aGVuCisgICAgICAgIERJU0FCTEVfVU5VU0VEX1dBUk5JTkdTPSIkRElTQUJMRV9VTlVTRURfV0FSTklOR1MgXAorICAgICAgICAgICAgICAgIHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHVudXNlZC12YXJpYWJsZSBcCisgICAgICAgICAgICAgICAgdW51c2VkLWZ1bmN0aW9uIgorICAgIGZpCitlbHNlCisgICAgIyAtcmR5bmFtaWMgaXMgbmVlZGVkIGZvciBnbGliYydzIGJhY2t0cmFjZV9zeW1ib2xzIHRvIHdvcmsuCisgICAgIyBObyBjbHVlIGhvdyBtdWNoIG92ZXJoZWFkIHRoaXMgYWRkcywgYnV0IGl0J3MgdXNlZnVsCisgICAgIyB0byBkbyB0aGlzIG9uIGFueSBhc3NlcnRpb24gZmFpbHVyZSwKKyAgICAjIHNvIGZvciBub3cgaXQncyBlbmFibGVkIGFueXRpbWUgYXNzZXJ0cyBhcmUgKGN1cnJlbnRseSBub3QKKyAgICAjIGluIHByb2R1Y3Rpb24gYnVpbGRzKS4KKworICAgICMgVG8gZ2V0IC1yZHluYW1pYyB5b3UgcGFzcyAtZXhwb3J0LWR5bmFtaWMgdG8gbGlidG9vbC4KKyAgICBBQ19ERUZJTkUoREJVU19CVUlMVF9SX0RZTkFNSUMsMSxbd2hldGhlciAtZXhwb3J0LWR5bmFtaWMgd2FzIHBhc3NlZCB0byBsaWJ0b29sXSkKKyAgICBSX0RZTkFNSUNfTERGTEFHPS1leHBvcnQtZHluYW1pYworZmkKK0FDX1NVQlNUKFJfRFlOQU1JQ19MREZMQUcpCisKK2lmIHRlc3QgeCRlbmFibGVfY2hlY2tzID0geG5vOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRElTQUJMRV9DSEVDS1MsMSxbRGlzYWJsZSBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZ10pCisgICAgQUNfREVGSU5FKEdfRElTQUJMRV9DSEVDS1MsMSxbRGlzYWJsZSBHTGliIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nXSkKKyAgICBESVNBQkxFX1VOVVNFRF9XQVJOSU5HUz0idW51c2VkLWxhYmVsIgorZmkKKworQUhfQk9UVE9NKFsKKy8qIGV4cGxpY2l0bHkgZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBnZXQgbGVzcyBjb25mdXNpbmcgY29uZGl0aW9ucyAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjICBkZWZpbmUgREJVU19FTkFCTEVfQVNTRVJUIDEKKyNlbmRpZgorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjICBkZWZpbmUgREJVU19FTkFCTEVfQ0hFQ0tTIDEKKyNlbmRpZl0pCisKK2lmIHRlc3QgeCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UgPSB4eWVzOyB0aGVuCisgICAgICMjIHNvIHRoYXQgY29uZmlnLmggY2hhbmdlcyB3aGVuIHlvdSB0b2dnbGUgZ2NvdiBzdXBwb3J0CisgICAgIEFDX0RFRklORV9VTlFVT1RFRChEQlVTX0dDT1ZfRU5BQkxFRCwgMSwgW0RlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmddKQorZmkKKworIyBnbGliYzIxLm00IHNlcmlhbCAzCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUZXN0IGZvciB0aGUgR05VIEMgTGlicmFyeSwgdmVyc2lvbiAyLjEgb3IgbmV3ZXIuCisjIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSAyLjEgb3IgbmV3ZXIsCisgIGFjX2N2X2dudV9saWJyYXJ5XzJfMSwKKyAgW0FDX0VHUkVQX0NQUChbTHVja3kgR05VIHVzZXJdLAorICAgIFsKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworICNpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDX18gPiAyKQorICBMdWNreSBHTlUgdXNlcgorICNlbmRpZgorI2VuZGlmCisgICAgXSwKKyAgICBhY19jdl9nbnVfbGlicmFyeV8yXzE9eWVzLAorICAgIGFjX2N2X2dudV9saWJyYXJ5XzJfMT1ubykKKyAgXQorKQorCisjIyMjIEludGVnZXIgc2l6ZXMKKworQUNfQ0hFQ0tfU0laRU9GKGNoYXIpCitBQ19DSEVDS19TSVpFT0Yoc2hvcnQpCitBQ19DSEVDS19TSVpFT0YobG9uZykKK0FDX0NIRUNLX1NJWkVPRihpbnQpCitBQ19DSEVDS19TSVpFT0Yodm9pZCAqKQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZykKK0FDX0NIRUNLX1NJWkVPRihfX2ludDY0KQorCisjIyMgU2VlIHdoYXQgb3VyIDY0IGJpdCB0eXBlIGlzIGNhbGxlZAorQUNfTVNHX0NIRUNLSU5HKFs2NC1iaXQgaW50ZWdlciB0eXBlXSkKKworY2FzZSA4IGluCiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDY0PWludAorICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsKScKKyAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nIiInCisgIDs7CiskYWNfY3Zfc2l6ZW9mX2xvbmcpCisgIGRidXNpbnQ2ND1sb25nCisgIGRidXNpbnQ2NF9jb25zdGFudD0nKHZhbCMjTCknCisgIGRidXN1aW50NjRfY29uc3RhbnQ9Jyh2YWwjI1VMKScKKyAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImwiJworICA7OworJGFjX2N2X3NpemVvZl9sb25nX2xvbmcpCisgIGRidXNpbnQ2ND0nbG9uZyBsb25nJworICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwjI0xMKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjVUxMKScKKyAgIyBJZGVhbGx5IHdlIGRpc2NvdmVyIHdoYXQgdGhlIGZvcm1hdCBpcywgYnV0IHRoaXMgaXMKKyAgIyBvbmx5IHVzZWQgaW4gdmVyYm9zZSBtb2RlLCBzbyBlaC4uLgorICBpZiB0ZXN0IHgiJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPSB4eWVzOyB0aGVuCisgICAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImxsIicKKyAgZmkKKyAgOzsKKyRhY19jdl9zaXplb2ZfX19pbnQ2NCkKKyAgZGJ1c2ludDY0PV9faW50NjQKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNpNjQpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsIyN1aTY0KScKKyAgIyBTZWUgYWJvdmUgY2FzZQorICBpZiB0ZXN0IHgiJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPSB4eWVzOyB0aGVuCisgICAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImxsIicKKyAgZmkKKyAgOzsKK2VzYWMKKworQVNfSUYoCisgIFt0ZXN0IC16ICIkZGJ1c2ludDY0Il0sCisgIFtBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGEgNjQtYml0IGludGVnZXIgdHlwZS4KKworUGxlYXNlIHJlcG9ydCBhIGJ1ZyBoZXJlIHdpdGggZGV0YWlscyBvZiB5b3VyIHBsYXRmb3JtIGFuZCBjb21waWxlcjoKKworICAgIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9REJ1cyZjb21wb25lbnQ9Y29yZV0pCisgIF0sCisgIGRubCBlbHNlCisgIFsKKyAgICAgICAgREJVU19JTlQ2NF9UWVBFPSIkZGJ1c2ludDY0IgorICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UPSIkZGJ1c2ludDY0X2NvbnN0YW50IgorICAgICAgICBEQlVTX1VJTlQ2NF9DT05TVEFOVD0iJGRidXN1aW50NjRfY29uc3RhbnQiCisJaWYgdGVzdCB4IiRkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyIiAhPSB4OyB0aGVuCisJCUFDX0RFRklORV9VTlFVT1RFRChEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiwgWyRkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyXSwgW0RlZmluZSB0byBwcmludGYgbW9kaWZpZXIgZm9yIDY0IGJpdCBpbnRlZ2VyIHR5cGVdKQorCWZpCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UNjRfVFlQRSkKKyAgXSkKKworQUNfU1VCU1QoREJVU19JTlQ2NF9UWVBFKQorQUNfU1VCU1QoREJVU19JTlQ2NF9DT05TVEFOVCkKK0FDX1NVQlNUKERCVVNfVUlOVDY0X0NPTlNUQU5UKQorCisjIyMgc2VlIHdoYXQgMzItYml0IGludCBpcyBjYWxsZWQKK0FDX01TR19DSEVDS0lORyhbMzItYml0IGludGVnZXIgdHlwZV0pCisKK2Nhc2UgNCBpbgorJGFjX2N2X3NpemVvZl9zaG9ydCkKKyAgZGJ1c2ludDMyPXNob3J0CisgIDs7CiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDMyPWludAorICA7OworJGFjX2N2X3NpemVvZl9sb25nKQorICBkYnVzaW50MzI9bG9uZworICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGJ1c2ludDMyIiA7IHRoZW4KKyAgICAgICAgREJVU19JTlQzMl9UWVBFPSJub19pbnQzMl90eXBlX2RldGVjdGVkIgorICAgICAgICBBQ19NU0dfRVJST1IoW05vIDMyLWJpdCBpbnRlZ2VyIHR5cGUgZm91bmRdKQorZWxzZQorICAgICAgICBEQlVTX0lOVDMyX1RZUEU9IiRkYnVzaW50MzIiCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UMzJfVFlQRSkKK2ZpCisKK0FDX1NVQlNUKERCVVNfSU5UMzJfVFlQRSkKKworIyMjIHNlZSB3aGF0IDE2LWJpdCBpbnQgaXMgY2FsbGVkCitBQ19NU0dfQ0hFQ0tJTkcoWzE2LWJpdCBpbnRlZ2VyIHR5cGVdKQorCitjYXNlIDIgaW4KKyRhY19jdl9zaXplb2Zfc2hvcnQpCisgIGRidXNpbnQxNj1zaG9ydAorICA7OworJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQxNj1pbnQKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQxNiIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UMTZfVFlQRT0ibm9faW50MTZfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtObyAxNi1iaXQgaW50ZWdlciB0eXBlIGZvdW5kXSkKK2Vsc2UKKyAgICAgICAgREJVU19JTlQxNl9UWVBFPSIkZGJ1c2ludDE2IgorICAgICAgICBBQ19NU0dfUkVTVUxUKCREQlVTX0lOVDE2X1RZUEUpCitmaQorCitBQ19TVUJTVChEQlVTX0lOVDE2X1RZUEUpCisKKyMjIGJ5dGUgb3JkZXIKK2Nhc2UgJGhvc3Rfb3MgaW4KKwlkYXJ3aW4qKQorCQkjIGNoZWNrIGF0IGNvbXBpbGUtdGltZSwgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwKKwkJIyAod2l0aCBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGF0IG9uY2Ugb24gdGhlIGNvbXBpbGUgbGluZSkKKwkJQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl9EQVJXSU5dLCBbCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJXSkKKwkJOzsKKwkqKQorCQlBQ19DX0JJR0VORElBTgorCQk7OworZXNhYworCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sICoqKiB2YV9jb3B5IGNoZWNrcyAoZnJvbSBHTGliKSAqKioKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgd2UgY3VycmVudGx5IGNoZWNrIGZvciBhbGwgdGhyZWUgdmFfY29weSBwb3NzaWJpbGl0aWVzLCBzbyB3ZSBnZXQKK2RubCBhbGwgcmVzdWx0cyBpbiBjb25maWcubG9nIGZvciBidWcgcmVwb3J0cy4KK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYW4gaW1wbGVtZW50YXRpb24gb2YgdmFfY29weSgpXSxkYnVzX2N2X3ZhX2NvcHksWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCXN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwl2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwl2YV9zdGFydCAoYXJnczEsIGkpOworCXZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgIGV4aXQgKDEpOworCXZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwl9CisJaW50IG1haW4oKSB7CisJICBmICgwLCA0Mik7CisJICByZXR1cm4gMDsKKwl9XSldLAorCVtkYnVzX2N2X3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV9jb3B5PW5vXSkKK10pCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIF9fdmFfY29weSgpXSxkYnVzX2N2X19fdmFfY29weSxbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFsjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfV0pXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9bm9dKQorXSkKKworaWYgdGVzdCAieCRkYnVzX2N2X3ZhX2NvcHkiID0gInh5ZXMiOyB0aGVuCisgIGRidXNfdmFfY29weV9mdW5jPXZhX2NvcHkKK2Vsc2UgaWYgdGVzdCAieCRkYnVzX2N2X19fdmFfY29weSIgPSAieHllcyI7IHRoZW4KKyAgZGJ1c192YV9jb3B5X2Z1bmM9X192YV9jb3B5CitmaQorZmkKKworaWYgdGVzdCAtbiAiJGRidXNfdmFfY29weV9mdW5jIjsgdGhlbgorICBBQ19ERUZJTkVfVU5RVU9URUQoREJVU19WQV9DT1BZLCRkYnVzX3ZhX2NvcHlfZnVuYyxbQSAndmFfY29weScgc3R5bGUgZnVuY3Rpb25dKQorZmkKKworQUNfTEFOR19QVVNIKEMpCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB2YV9saXN0cyBjYW4gYmUgY29waWVkIGJ5IHZhbHVlXSwKKwlkYnVzX2N2X3ZhX3ZhbF9jb3B5LAorCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworCSNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CitdXSwKK1tbCisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJYXJnczIgPSBhcmdzMTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KK11dKV0sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV92YWxfY29weT1ub10sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSkKK10pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICJ4JGRidXNfY3ZfdmFfdmFsX2NvcHkiID0gInhubyI7IHRoZW4KKyAgQUNfREVGSU5FKERCVVNfVkFfQ09QWV9BU19BUlJBWSwxLCBbJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlc10pCitmaQorCisKKyMjIyMgQXRvbWljIGludGVnZXJzCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBrbm93cyBfX3N5bmNfc3ViX2FuZF9mZXRjaCgpXSwKKyAgZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2gsCisgIFtBQ19MSU5LX0lGRUxTRShbCisgICAgIEFDX0xBTkdfUFJPR1JBTShbW11dLCBbW2ludCBhID0gNDsgaW50IGIgPSBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmYSwgNCk7IGV4aXQoYik7IF1dKV0sCisgICAgIFtkYnVzX2N2X3N5bmNfc3ViX2FuZF9mZXRjaD15ZXNdLAorICAgICBbZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2g9bm9dKQorICBdKQorCitpZiB0ZXN0ICJ4JGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGhhdmVfc3luYz0xCitlbHNlCisgICBoYXZlX3N5bmM9MAorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1VTRV9TWU5DXSwgWyRoYXZlX3N5bmNdLCBbVXNlIHRoZSBnY2MgX19zeW5jIGV4dGVuc2lvbl0pCisKKyMjIyMgVmFyaW91cyBmdW5jdGlvbnMKK0FDX1NFQVJDSF9MSUJTKHNvY2tldCxbc29ja2V0IG5ldHdvcmtdKQorQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCxbQUNfQ0hFQ0tfTElCKG5zbCxnZXRob3N0YnluYW1lKV0pCisKK0FDX0NIRUNLX0ZVTkNTKFt2c25wcmludGYgdmFzcHJpbnRmIG5hbm9zbGVlcCB1c2xlZXAgc2V0ZW52IGNsZWFyZW52IHVuc2V0ZW52IHNvY2tldHBhaXIgZ2V0Z3JvdXBsaXN0IGZwYXRoY29uZiBzZXRybGltaXQgcG9sbCBzZXRsb2NhbGUgbG9jYWxlY29udiBzdHJ0b2xsIHN0cnRvdWxsIGlzc2V0dWdpZCBnZXRyZXN1aWQgc2V0cmVzdWlkIGdldHJsaW1pdF0pCisKK0FDX0NIRUNLX0hFQURFUlMoW3N5c2xvZy5oXSkKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c2xvZ19oIiA9ICJ4eWVzIjsgdGhlbgorICBBQ19DSEVDS19ERUNMUyhbTE9HX1BFUlJPUl0sIFtdLCBbXSwgW1sjaW5jbHVkZSA8c3lzbG9nLmg+XV0pCitmaQorCisjIEZvciB0ZXN0LXNlZ2ZhdWx0LmMKK0FDX0NIRUNLX0hFQURFUlNfT05DRShbc3lzL3ByY3RsLmhdKQorQUNfQ0hFQ0tfRlVOQ1NfT05DRShbcHJjdGwgcmFpc2VdKQorCisjIyMjIENoZWNrIGZvciBicm9rZW4gcG9sbDsgdGFrZW4gZnJvbSBHbGliJ3MgY29uZmlndXJlCisKK0FDX01TR19DSEVDS0lORyhbZm9yIGJyb2tlbiBwb2xsXSkKK0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICNpbmNsdWRlIDxmY250bC5oPgorICAgICNpbmNsdWRlIDxwb2xsLmg+CisgICAgI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorICAgICNpbmNsdWRlIDxzeXMvcG9sbC5oPgorICAgICNlbmRpZgorICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgIHN0cnVjdCBwb2xsZmQgZmRzWzFdOworICAgICAgaW50IGZkOworICAgICAgZmQgPSBvcGVuKCIvZGV2L251bGwiLCAxKTsKKyAgICAgIGZkc1swXS5mZCA9IGZkOworICAgICAgZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgICAgIGZkc1swXS5yZXZlbnRzID0gMDsKKyAgICAgIGlmIChwb2xsKGZkcywgMSwgMCkgPCAwIHx8IChmZHNbMF0ucmV2ZW50cyAmIFBPTExOVkFMKSAhPSAwKSB7CisgICAgICAgICAgICBleGl0KDEpOyAgLyogRG9lcyBub3Qgd29yayBmb3IgZGV2aWNlcyAtLSBmYWlsICovCisgICAgICB9CisgICAgICBleGl0KDApOworICAgIH1dXSldLAorICBbYnJva2VuX3BvbGw9bm9dLAorICBbYnJva2VuX3BvbGw9eWVzCisgICBBQ19ERUZJTkUoQlJPS0VOX1BPTEwsMSxbcG9sbCBkb2Vzbid0IHdvcmsgb24gZGV2aWNlc10pXSwKKyAgW2Jyb2tlbl9wb2xsPSJubyAoY3Jvc3MgY29tcGlsaW5nKSJdKQorQUNfTVNHX1JFU1VMVCgkYnJva2VuX3BvbGwpCisKK0FDX01TR19DSEVDS0lORyhmb3IgZGlyZmQpCitBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CitdXSwgW1sKK0RJUiAqZGlycDsKK2RpcnAgPSBvcGVuZGlyKCIuIik7CitkaXJmZChkaXJwKTsKK2Nsb3NlZGlyKGRpcnApOworXV0pXSwKK1tkYnVzX2hhdmVfZGlyZmQ9eWVzXSwKK1tkYnVzX2hhdmVfZGlyZmQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2RpcmZkKQoraWYgdGVzdCAiJGRidXNfaGF2ZV9kaXJmZCIgPSB5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9ESVJGRCwxLFtIYXZlIGRpcmZkIGZ1bmN0aW9uXSkKK2Vsc2UKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIERJUiAqZGlycC0+ZGRfZmQpCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCV1dLCBbWworRElSICpkaXJwOworaW50IGZkOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2ZkID0gZGlycC0+ZGRfZmQ7CitjbG9zZWRpcihkaXJwKTsKKyAgICAgICAgXV0pXSwKKyAgICAgICAgW2RidXNfaGF2ZV9kZGZkPXllc10sCisgICAgICAgIFtkYnVzX2hhdmVfZGRmZD1ub10pCisJQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2RkZmQpCisJaWYgdGVzdCAiJGRidXNfaGF2ZV9kZGZkIiA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9EREZELDEsW0hhdmUgdGhlIGRkZmQgbWVtYmVyIG9mIERJUl0pCisJZmkKK2ZpCisKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3Jlc291cmNlLmgpCisKK0FDX0NIRUNLX0hFQURFUlMoZGlyZW50LmgpCisKK0FDX0NIRUNLX0hFQURFUlMoW2V4ZWNpbmZvLmhdLAorCVtBQ19TRUFSQ0hfTElCUyhbYmFja3RyYWNlXSwgW2V4ZWNpbmZvXSwKKwkJW0FDX0RFRklORShbSEFWRV9CQUNLVFJBQ0VdLCBbMV0sCisJCQlbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYmFja3RyYWNlKCkuXSldKV0pCisKK0FDX0NIRUNLX0hFQURFUlMoZXJybm8uaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhzaWduYWwuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhsb2NhbGUuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhieXRlc3dhcC5oKQorCitBQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQorCitBQ19DSEVDS19IRUFERVJTKFtzdGRpbnQuaF0pCisKK0FDX0NIRUNLX0hFQURFUlMod3MydGNwaXAuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhhbGxvY2EuaCkKKworIyBBZGQgLURfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgaWYgb24gU29sYXJpcworIworY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyIgOzsKK2VzYWMKKworIyBjaGVja2luZyBmb3IgYSBwb3NpeCB2ZXJzaW9uIG9mIGdldHB3bmFtX3IKKyMgaWYgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbmQgY2FuIG5vdCBydW4gdGhlIHRlc3QKKyMgYXNzdW1lIGdldHB3bmFtX3IgaXMgdGhlIHBvc2l4IHZlcnNpb24KKyMgaXQgaXMgdXAgdG8gdGhlIHBlcnNvbiBjcm9zcyBjb21waWxpbmcgdG8gY2hhbmdlCisjIHRoaXMgYmVoYXZpb3IgaWYgZGVzaXJlZAorQUNfTEFOR19QVVNIKEMpCitBQ19DQUNIRV9DSEVDSyhbZm9yIHBvc2l4IGdldHB3bmFtX3JdLAorCQlhY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3IsCisJCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHdkLmg+CitdXSwKK1tbCisgICAgY2hhciBidWZmZXJbMTAwMDBdOworICAgIHN0cnVjdCBwYXNzd2QgcHdkLCAqcHdwdHIgPSAmcHdkOworICAgIGludCBlcnJvcjsKKyAgICBlcnJubyA9IDA7CisgICAgZXJyb3IgPSBnZXRwd25hbV9yICgiIiwgJnB3ZCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChidWZmZXIpLCAmcHdwdHIpOworICAgcmV0dXJuIChlcnJvciA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorCSAgIHx8IGVycm9yID09IEVOT1NZUzsKK11dKV0sCisJW2FjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fcj15ZXNdLAorCVthY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3I9bm9dLAorICAgICAgICBbYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllc10KKyldKQorQUNfTEFOR19QT1AoQykKKworaWYgdGVzdCAiJGFjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fciIgPSB5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKEhBVkVfUE9TSVhfR0VUUFdOQU1fUiwxLAorICAgICAgICAgICAgICAgIFtIYXZlIFBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3JdKQorZWxzZQorICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIG5vbnBvc2l4IGdldHB3bmFtX3JdLAorICAgICAgICAgICAgICAgIGFjX2N2X2Z1bmNfbm9ucG9zaXhfZ2V0cHduYW1fciwKKyAgICAgICAgICAgICAgICBbQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxwd2QuaD5dXSwgW1tjaGFyIGJ1ZmZlclsxMDAwMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFzc3dkIHB3ZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHB3bmFtX3IgKCIiLCAmcHdkLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChidWZmZXIpKTtdXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2FjX2N2X2Z1bmNfbm9ucG9zaXhfZ2V0cHduYW1fcj15ZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2FjX2N2X2Z1bmNfbm9ucG9zaXhfZ2V0cHduYW1fcj1ub10pXSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX05PTlBPU0lYX0dFVFBXTkFNX1IsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtIYXZlIG5vbi1QT1NJWCBmdW5jdGlvbiBnZXRwd25hbV9yXSkKKyAgICAgICAgZmkKK2ZpCisKK2RubCBjaGVjayBmb3Igc29ja2xlbl90CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBzb2NrbGVuX3QgaXMgZGVmaW5lZCkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KK11dLCBbWworc29ja2xlbl90IGZvbzsKK2ZvbyA9IDE7CitdXSldLAorW2RidXNfaGF2ZV9zb2NrbGVuX3Q9eWVzXSwKK1tkYnVzX2hhdmVfc29ja2xlbl90PW5vXSkKK0FDX01TR19SRVNVTFQoJGRidXNfaGF2ZV9zb2NrbGVuX3QpCisKK2lmIHRlc3QgIngkZGJ1c19oYXZlX3NvY2tsZW5fdCIgPSAieHllcyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9TT0NLTEVOX1QsMSxbSGF2ZSBzb2NrbGVuX3QgdHlwZV0pCitmaQorCitkbmwgY2hlY2sgZm9yIHdyaXRldiBoZWFkZXIgYW5kIHdyaXRldiBmdW5jdGlvbiBzbyB3ZSdyZQorZG5sIGdvb2QgdG8gZ28gaWYgSEFWRV9XUklURVYgZ2V0cyBkZWZpbmVkLgorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdWlvLmgsIFtBQ19DSEVDS19GVU5DUyh3cml0ZXYpXSkKKworZG5sIG5lZWRlZCBvbiBkYXJ3aW4gZm9yIE5BTUVfTUFYCitBQ19DSEVDS19IRUFERVJTKHN5cy9zeXNsaW1pdHMuaCkKKworZG5sIE1ha2UgaXQgZWFzeSB0byBjaGVjayBpZiB3ZSBoYXZlIE1TR19OT1NJR05BTCB3aXRob3V0IGFjdHVhbGx5IGhhdmluZyB0byBpbmNsdWRlIHN5cy9zb2NrZXQuaAorQUNfQ0hFQ0tfREVDTFMoW01TR19OT1NJR05BTF0sIFtdLCBbXSwgW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gXV0pCisKK2RubCBjaGVjayBmb3IgZmxhdm91cnMgb2YgdmFyYXJncyBtYWNyb3MgKHRlc3QgZnJvbSBHTGliKQorQUNfTVNHX0NIRUNLSU5HKGZvciBJU08gQzk5IHZhcmFyZ3MgbWFjcm9zIGluIEMpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbXV0sIFtbCitpbnQgYShpbnQgcDEsIGludCBwMiwgaW50IHAzKTsKKyNkZWZpbmUgY2FsbF9hKC4uLikgYSgxLF9fVkFfQVJHU19fKQorY2FsbF9hKDIsMyk7CitdXSldLAorW2RidXNfaGF2ZV9pc29fY192YXJhcmdzPXllc10sCitbZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3M9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3MpCisKK0FDX01TR19DSEVDS0lORyhmb3IgR05VQyB2YXJhcmdzIG1hY3JvcykKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1sKK2ludCBhKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworI2RlZmluZSBjYWxsX2EocGFyYW1zLi4uKSBhKDEscGFyYW1zKQorY2FsbF9hKDIsMyk7CitdXSldLAorW2RidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9eWVzXSwKK1tkYnVzX2hhdmVfZ251Y192YXJhcmdzPW5vXSkKK0FDX01TR19SRVNVTFQoJGRidXNfaGF2ZV9nbnVjX3ZhcmFyZ3MpCisKK2RubCBPdXRwdXQgdmFyYXJncyB0ZXN0cworaWYgdGVzdCB4JGRidXNfaGF2ZV9pc29fY192YXJhcmdzID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0lTT19WQVJBUkdTLDEsW0hhdmUgSVNPIEM5OSB2YXJhcmdzIG1hY3Jvc10pCitmaQoraWYgdGVzdCB4JGRidXNfaGF2ZV9nbnVjX3ZhcmFyZ3MgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfR05VQ19WQVJBUkdTLDEsW0hhdmUgR05VLXN0eWxlIHZhcmFyZ3MgbWFjcm9zXSkKK2ZpCisKK2RubCBDaGVjayBmb3IgdmFyaW91cyBjcmVkZW50aWFscy4KK0FDX01TR19DSEVDS0lORyhmb3Igc3RydWN0IGNtc2djcmVkKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK11dLCBbWworc3RydWN0IGNtc2djcmVkIGNyZWQ7CisKK2NyZWQuY21jcmVkX3BpZCA9IDA7CitdXSldLAorW2RidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9eWVzXSwKK1tkYnVzX2hhdmVfc3RydWN0X2Ntc2djcmVkPW5vXSkKK0FDX01TR19SRVNVTFQoJGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQpCisKK2lmIHRlc3QgeCRkYnVzX2hhdmVfc3RydWN0X2Ntc2djcmVkID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0NNU0dDUkVELDEsW0hhdmUgY21zZ2NyZWQgc3RydWN0dXJlXSkKK2ZpCisKK0FDX0NIRUNLX01FTUJFUihbc3RydWN0IHVucGNiaWQudW5wX3BpZF0sCisgICAgICAgICAgICAgICAgW0FDX0RFRklORShbSEFWRV9VTlBDQklEXSwgMSwgW0hhdmUgdW5wY2JpZCBzdHJ1Y3R1cmVdKV0sCisgICAgICAgICAgICAgICAgW10sCisgICAgICAgICAgICAgICAgW1sjaW5jbHVkZSA8c3lzL3VuLmg+XV0pCisKK0FDX0NIRUNLX0ZVTkNTKGdldHBlZXJ1Y3JlZCBnZXRwZWVyZWlkKQorCitBQ19DSEVDS19GVU5DUyhwaXBlMiBhY2NlcHQ0KQorCisjIyMjIEFic3RyYWN0IHNvY2tldHMKKworaWYgdGVzdCB4JGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzID0geGF1dG87IHRoZW4KK0FDX0xBTkdfUFVTSChDKQord2Fybl9vbl94Y29tcGlsZT1ubworQUNfQ0FDSEVfQ0hFQ0soW2Fic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VdLAorCQlhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHMsCisJCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CitdXSwKK1tbCisgIHNpemVfdCBzbGVuOworICBpbnQgbGlzdGVuX2ZkOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKworICBsaXN0ZW5fZmQgPSBzb2NrZXQgKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKworICBpZiAobGlzdGVuX2ZkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzb2NrZXQoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBtZW1zZXQgKCZhZGRyLCAnXDAnLCBzaXplb2YgKGFkZHIpKTsKKyAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5IChhZGRyLnN1bl9wYXRoLCAiWC90bXAvZGJ1cy1mYWtlLXNvY2tldC1wYXRoLXVzZWQtaW4tY29uZmlndXJlLXRlc3QiKTsKKyAgLyogU1VOX0xFTiB1c2VzIHN0cmxlbigpIHNvIG5lZWQgdG8gY2FsY3VsYXRlIGl0IGJlZm9yZSBhZGRpbmcgXDAgYXQgdGhlCisgICAqIGJlZ2lubmluZy4KKyAgICovCisgIHNsZW4gPSBTVU5fTEVOKCZhZGRyKTsKKyAgYWRkci5zdW5fcGF0aFswXSA9ICdcMCc7IC8qIHRoaXMgaXMgd2hhdCBtYWtlcyBpdCBhYnN0cmFjdCAqLworCisgIGlmIChiaW5kIChsaXN0ZW5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgc2xlbikgPCAwKQorICAgIHsKKyAgICAgICBmcHJpbnRmIChzdGRlcnIsICJBYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlIGJpbmQoKSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIGV4aXQgKDApOworXV0pXSwKKyAgICAgICAgICAgICAgW2FjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cz15ZXNdLAorICAgICAgICAgICAgICBbYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPW5vXSwKKyAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIGFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cz1ubworICAgICAgICAgICAgICAgIHdhcm5fb25feGNvbXBpbGU9eWVzCisgICAgICAgICAgICAgIF0KKyldKQoraWYgdGVzdCB4JHdhcm5fb25feGNvbXBpbGUgPSB4eWVzIDsgdGhlbgorICBBQ19NU0dfV0FSTihbQ2Fubm90IGNoZWNrIGZvciBhYnN0cmFjdCBzb2NrZXRzIHdoZW4gY3Jvc3MtY29tcGlsaW5nLCBwbGVhc2UgdXNlIC0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHNdKQorZmkKK0FDX0xBTkdfUE9QKEMpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cyA9IHhubzsgdGhlbgorCUFDX01TR19FUlJPUihbQWJzdHJhY3Qgc29ja2V0cyBleHBsaWNpdGx5IHJlcXVpcmVkLCBhbmQgc3VwcG9ydCBub3QgZGV0ZWN0ZWQuXSkKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzID0geG5vOyB0aGVuCisgICBhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHM9bm87CitmaQorCitpZiB0ZXN0IHgkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzID0geHllcyA7IHRoZW4KKyAgIERCVVNfUEFUSF9PUl9BQlNUUkFDVD1hYnN0cmFjdAorICAgQUNfREVGSU5FKEhBVkVfQUJTVFJBQ1RfU09DS0VUUywxLFtIYXZlIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VdKQorZWxzZQorICAgREJVU19QQVRIX09SX0FCU1RSQUNUPXBhdGgKK2ZpCisKKyMgdGhpcyBpcyB1c2VkIGluIGFkZHJlc3NlcyB0byBwcmVmZXIgYWJzdHJhY3QsIGUuZy4KKyMgdW5peDpwYXRoPS9mb28gb3IgdW5peDphYnN0cmFjdD0vZm9vCitBQ19TVUJTVChEQlVTX1BBVEhfT1JfQUJTVFJBQ1QpCisKKyMjIyMgU29ydCBvdXQgWE1MIGxpYnJhcnkKKworQUNfQ0hFQ0tfTElCKGV4cGF0LCBYTUxfUGFyc2VyQ3JlYXRlX01NLAorICAgICAgICAgICAgIFsgQUNfQ0hFQ0tfSEVBREVSUyhleHBhdC5oLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgZXhwYXQuaCwgY2hlY2sgY29uZmlnLmxvZyBmb3IgZmFpbGVkIGF0dGVtcHRzXSldKSBdLAorICAgICAgICAgICAgIFsgQUNfTVNHX0VSUk9SKFtFeHBsaWNpdGx5IHJlcXVlc3RlZCBleHBhdCBidXQgZXhwYXQgbm90IGZvdW5kXSkgXSkKKworWE1MX0xJQlM9LWxleHBhdAorWE1MX0NGTEFHUz0KK0FDX1NVQlNUKFtYTUxfQ0ZMQUdTXSkKK0FDX1NVQlNUKFtYTUxfTElCU10pCisKKyMgVGhyZWFkIGxpYiBkZXRlY3Rpb24KK0FDX0FSR19WQVIoW1RIUkVBRF9MSUJTXSkKK3NhdmVfbGlicz0iJExJQlMiCitMSUJTPSIkTElCUyAkVEhSRUFEX0xJQlMiCisKK2lzX21pc3NpbmdfcHRocmVhZF9mdW5jdGlvbj0iaXMgcmVxdWlyZWQgd2hlbiBjb21waWxpbmcgRC1CdXMgb24gVW5peCBwbGF0Zm9ybXMsIGJ1dCBpcyBub3QgaW4geW91ciBsaWJjIG9yIGxpYnB0aHJlYWQuIFBsZWFzZSBvcGVuIGEgYnVnIG9uIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PWRidXMgd2l0aCBkZXRhaWxzIG9mIHlvdXIgcGxhdGZvcm0uIgorCisjIERvbid0IGRvIHRoZXNlIGF1dG9tYXRpYyBjaGVja3MgaWYgdGhlIHVzZXIgc2V0IFRIUkVBRF9MSUJTIG9uIHRoZQorIyBjb25maWd1cmUgY29tbWFuZC1saW5lLiBJZiB0aGV5IGRpZCwgd2UgYXNzdW1lIHRoZXkncmUgcmlnaHQuCisjCisjIFdlIGFsc28gZG9uJ3QgZG8gdGhlc2UgY2hlY2tzIG9uIFdpbmRvd3MsIGJlY2F1c2UgeW91IGRvbid0IG5lZWQgbWFnaWNhbAorIyBsaW5rZXIgZmxhZ3MgdG8gaGF2ZSB0aHJlYWRpbmcgc3VwcG9ydCB0aGVyZS4KK0FTX0lGKFt0ZXN0ICJ4JGRidXNfdW5peCIgPSB4eWVzICYmIHRlc3QgIngkVEhSRUFEX0xJQlMiID0geF0sCisgIFsKKyAgICAjIE1hbmRhdG9yeSBwdGhyZWFkIGZ1bmN0aW9ucy4gSW4gcHJpbmNpcGxlLCBzb21lIG9mIHRoZXNlIGNvdWxkIGJlIG1hZGUKKyAgICAjIG9wdGlvbmFsIGlmIHRoZXJlIGFyZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIHRoZW0uCisgICAgIworICAgICMgQ3VycmVudGx5LCB3ZSBvbmx5IGxvb2sgaW4gLWxwdGhyZWFkLgorICAgICMgSW4gcHJpbmNpcGxlIHdlIG1pZ2h0IG5lZWQgdG8gbG9vayBpbiAtbHB0aHJlYWRzLCAtbHRocmVhZHMsIC4uLgorICAgICMgYXMgd2VsbCAtIHBsZWFzZSBmaWxlIGEgYnVnIGlmIHlvdXIgcGxhdGZvcm0gbmVlZHMgdGhpcy4KKyAgICBBQ19TRUFSQ0hfTElCUyhbcHRocmVhZF9jb25kX3RpbWVkd2FpdF0sCisgICAgICAgIFtwdGhyZWFkXSwKKyAgICAgICAgW1RIUkVBRF9MSUJTPSIkTElCUyJdLAorICAgICAgICBbQUNfTVNHX0VSUk9SKFtwdGhyZWFkX2NvbmRfdGltZWR3YWl0ICRpc19taXNzaW5nX3B0aHJlYWRfZnVuY3Rpb25dKV0sCisgICAgICAgIFtdKQorICAgIEFDX1NFQVJDSF9MSUJTKFtwdGhyZWFkX211dGV4YXR0cl9pbml0XSwKKyAgICAgICAgW3B0aHJlYWRdLAorICAgICAgICBbVEhSRUFEX0xJQlM9IiRMSUJTIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgJGlzX21pc3NpbmdfcHRocmVhZF9mdW5jdGlvbl0pXSwKKyAgICAgICAgW10pCisgICAgQUNfU0VBUkNIX0xJQlMoW3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGVdLAorICAgICAgICBbcHRocmVhZF0sCisgICAgICAgIFtUSFJFQURfTElCUz0iJExJQlMiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAkaXNfbWlzc2luZ19wdGhyZWFkX2Z1bmN0aW9uXSldLAorICAgICAgICBbXSkKKworICAgICMgT3B0aW9uYWwsIGZvciBtb25vdG9uaWMgY2xvY2tzLiBCZWNhdXNlIGl0J3Mgb3B0aW9uYWwsIHRoaXMgY2hlY2sKKyAgICAjIGlzIG5vbi1mYXRhbCBpZiB3ZSBkb24ndCBmaW5kIGl0LgorICAgIEFDX1NFQVJDSF9MSUJTKFtwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrXSwKKyAgICAgICAgW3B0aHJlYWRdLAorICAgICAgICBbVEhSRUFEX0xJQlM9IiRMSUJTIl0pCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayIgIT0geG5vXSwKKyAgICAgIFsKKyAgICAgICAgQUNfU0VBUkNIX0xJQlMoW2Nsb2NrX2dldHJlc10sIFtydF0sIFtUSFJFQURfTElCUz0iJExJQlMiXSkKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgQ0xPQ0tfTU9OT1RPTklDXSkKKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitdXSwgW1sKK3N0cnVjdCB0aW1lc3BlYyBtb25vdG9uaWNfdGltZXI7CitwdGhyZWFkX2NvbmRhdHRyX3QgYXR0cjsKK3B0aHJlYWRfY29uZGF0dHJfaW5pdCAoJmF0dHIpOworcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayAoJmF0dHIsIENMT0NLX01PTk9UT05JQyk7CitjbG9ja19nZXRyZXMgKENMT0NLX01PTk9UT05JQywmbW9ub3RvbmljX3RpbWVyKTsKK11dKV0sCisgICAgICAgICAgICBbaGF2ZV9jbG9ja19tb25vdG9uaWM9dHJ1ZV0sCisgICAgICAgICAgICBbaGF2ZV9jbG9ja19tb25vdG9uaWM9ZmFsc2VdKQorICAgICAgICBBU19JRihbdGVzdCB4JGhhdmVfY2xvY2tfbW9ub3RvbmljID0geHRydWVdLAorCSAgWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbZm91bmRdKQorICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTU9OT1RPTklDX0NMT0NLLCAxLCBbRGVmaW5lIGlmIHdlIGhhdmUgQ0xPQ0tfTU9OT1RPTklDXSkKKwkgIF0sCisgICAgICAgICAgW0FDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pXSkKKyAgICAgIF0pIGRubCBoYXZlIHB0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sKKyAgXSkgZG5sIG9uIFVuaXgKKworTElCUz0iJHNhdmVfbGlicyIKKworQUNfU1VCU1QoW1RIUkVBRF9MSUJTXSkKKworIyBTRUxpbnV4IGRldGVjdGlvbgoraWYgdGVzdCB4JGVuYWJsZV9zZWxpbnV4ID0geG5vIDsgdGhlbgorICAgIGhhdmVfc2VsaW51eD1ubzsKK2Vsc2UKKyAgICAjIFNlZSBpZiB3ZSBoYXZlIFNFTGludXggbGlicmFyeQorICAgIEFDX0NIRUNLX0xJQihzZWxpbnV4LCBpc19zZWxpbnV4X2VuYWJsZWQsCisgICAgICAgICAgICAgICAgIGhhdmVfc2VsaW51eD15ZXMsIGhhdmVfc2VsaW51eD1ubykKKworICAgICMgc2VlIGlmIHdlIGhhdmUgdGhlIFNFTGludXggaGVhZGVyIHdpdGggdGhlIG5ldyBELUJ1cyBzdHVmZiBpbiBpdAorICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4eWVzIDsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBEQlVTIEZsYXNrIHBlcm1pc3Npb25zIGluIHNlbGludXgvYXZfcGVybWlzc2lvbnMuaF0pCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8c2VsaW51eC9hdl9wZXJtaXNzaW9ucy5oPl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbWyNpZmRlZiBEQlVTX19BQ1FVSVJFX1NWQyByZXR1cm4gMDsKKwkJCSAgICAjZWxzZQorCQkJICAgICNlcnJvciBEQlVTX19BQ1FVSVJFX1NWQyBub3QgZGVmaW5lZAorCQkJICAgICNlbmRpZl1dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3NlbGludXg9eWVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhdmVfc2VsaW51eD1ub10pCisJQUNfTVNHX1JFU1VMVCgkaGF2ZV9zZWxpbnV4KQorICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3NlbGludXggPSB4YXV0byA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHhubyA7IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihbU3VmZmljaWVudGx5IG5ldyBTRUxpbnV4IGxpYnJhcnkgbm90IGZvdW5kXSkKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtTRWxpbnV4IGV4cGxpY2l0bHkgcmVxdWlyZWQsIGFuZCBTRUxpbnV4IGxpYnJhcnkgbm90IGZvdW5kXSkKKyAgICAgICAgZmkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9TRUxJTlVYLCB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geHllcykKKworaWYgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHh5ZXMgOyB0aGVuCisgICAgIyB0aGUgc2VsaW51eCBjb2RlIGNyZWF0ZXMgdGhyZWFkcworICAgICMgd2hpY2ggcmVxdWlyZXMgbGlicHRocmVhZCBldmVuIG9uIGxpbnV4CisgICAgQUNfQ0hFQ0tfRlVOQyhwdGhyZWFkX2NyZWF0ZSwsW0FDX0NIRUNLX0xJQihwdGhyZWFkLHB0aHJlYWRfY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NFTElOVVhfVEhSRUFEX0xJQlM9Ii1scHRocmVhZCJdKV0pCisKKyAgICBTRUxJTlVYX0xJQlM9Ii1sc2VsaW51eCAkU0VMSU5VWF9USFJFQURfTElCUyIKKyAgICBBQ19ERUZJTkUoSEFWRV9TRUxJTlVYLDEsW1NFTGludXggc3VwcG9ydF0pCitlbHNlCisgICAgU0VMSU5VWF9MSUJTPQorZmkKKworIyBBcHBBcm1vciBkZXRlY3Rpb24KK0FTX0lGKFt0ZXN0IHgkZW5hYmxlX2FwcGFybW9yID0geG5vXSwKKyAgW2hhdmVfYXBwYXJtb3I9bm9dLAorICBbCisgIFBLR19DSEVDS19NT0RVTEVTKFtBUFBBUk1PUl0sIFtsaWJhcHBhcm1vciA+PSAyLjguOTVdLAorICAgICAgICAgICAgICAgICAgICBbaGF2ZV9hcHBhcm1vcj15ZXNdLCBbaGF2ZV9hcHBhcm1vcj1ub10pCisKKyAgQVNfSUYoW3Rlc3QgeCRlbmFibGVfYXBwYXJtb3IgPSB4YXV0byAmJiB0ZXN0IHgkaGF2ZV9hcHBhcm1vciA9IHhub10sCisgICAgICAgIFtBQ19NU0dfV0FSTihbU3VmZmljaWVudGx5IG5ldyBBcHBBcm1vciBsaWJyYXJ5IG5vdCBmb3VuZF0pXSkKKyAgQVNfSUYoW3Rlc3QgeCRlbmFibGVfYXBwYXJtb3IgIT0geGF1dG8gJiYgdGVzdCB4JGhhdmVfYXBwYXJtb3IgPSB4bm9dLAorICAgICAgICBbQUNfTVNHX0VSUk9SKFtBcHBBcm1vciBleHBsaWNpdGx5IHJlcXVpcmVkLCBhbmQgQXBwQXJtb3IgbGlicmFyeSBub3QgZm91bmRdKV0pCisgIF0pCisKK0FTX0lGKFt0ZXN0IHgkaGF2ZV9hcHBhcm1vciA9IHh5ZXNdLAorICAgICAgW0FDX0RFRklORShbSEFWRV9BUFBBUk1PUl0sIFsxXSwgW0FwcEFybW9yIFN1cHBvcnRdKV0pCisKKyMgaW5vdGlmeSBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfaW5vdGlmeSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2lub3RpZnk9bm87CitlbHNlCisgICAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvaW5vdGlmeS5oLCBoYXZlX2lub3RpZnk9eWVzLCBoYXZlX2lub3RpZnk9bm8pCitmaQorCitkbmwgY2hlY2sgaWYgaW5vdGlmeSBiYWNrZW5kIGlzIGVuYWJsZWQKK2lmIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4eWVzOyB0aGVuCisgICBBQ19ERUZJTkUoREJVU19CVVNfRU5BQkxFX0lOT1RJRlksMSxbVXNlIGlub3RpZnldKQorICAgQUNfQ0hFQ0tfRlVOQ1MoaW5vdGlmeV9pbml0MSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZLCB0ZXN0IHgkaGF2ZV9pbm90aWZ5ID0geHllcykKKworIyBGb3Igc2ltcGxpY2l0eSwgd2UgcmVxdWlyZSB0aGUgdXNlcmxhbmQgQVBJIGZvciBlcG9sbF9jcmVhdGUxIGF0CisjIGNvbXBpbGUtdGltZSAoZ2xpYmMgMi45KSwgYnV0IHdlJ2xsIHJ1biBvbiBrZXJuZWxzIHRoYXQgdHVybiBvdXQKKyMgbm90IHRvIGhhdmUgaXQgYXQgcnVudGltZS4KK0FDX0FSR19FTkFCTEUoW2Vwb2xsXSwKKyAgICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1lcG9sbF0sW3VzZSBlcG9sbCg0KSBvbiBMaW51eF0pXSwKKyAgICAgICAgICAgICAgW2VuYWJsZV9lcG9sbD0kZW5hYmxldmFsXSwgW2VuYWJsZV9lcG9sbD1hdXRvXSkKK2lmIHRlc3QgeCRlbmFibGVfZXBvbGwgPSB4bm87IHRoZW4KKyAgICBoYXZlX2xpbnV4X2Vwb2xsPW5vCitlbHNlCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgTGludXggZXBvbGwoNCldKQorICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCisgICAgICAgIFsKKyAgICAgICAgI2lmbmRlZiBfX2xpbnV4X18KKyAgICAgICAgI2Vycm9yIFRoaXMgaXMgbm90IExpbnV4CisgICAgICAgICNlbmRpZgorICAgICAgICAjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CisgICAgICAgIF0sCisgICAgICAgIFtlcG9sbF9jcmVhdGUxIChFUE9MTF9DTE9FWEVDKTtdKV0sCisgICAgICAgIFtoYXZlX2xpbnV4X2Vwb2xsPXllc10sCisgICAgICAgIFtoYXZlX2xpbnV4X2Vwb2xsPW5vXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskaGF2ZV9saW51eF9lcG9sbF0pCitmaQoraWYgdGVzdCB4JGVuYWJsZV9lcG9sbCwkaGF2ZV9saW51eF9lcG9sbCA9IHh5ZXMsbm87IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW2Vwb2xsIHN1cHBvcnQgZXhwbGljaXRseSBlbmFibGVkIGJ1dCBub3QgYXZhaWxhYmxlXSkKK2ZpCitpZiB0ZXN0IHgkaGF2ZV9saW51eF9lcG9sbCA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX0hBVkVfTElOVVhfRVBPTExdLCAxLCBbRGVmaW5lIHRvIHVzZSBlcG9sbCg0KSBvbiBMaW51eF0pCitmaQorQU1fQ09ORElUSU9OQUwoW0hBVkVfTElOVVhfRVBPTExdLCBbdGVzdCB4JGhhdmVfbGludXhfZXBvbGwgPSB4eWVzXSkKKworIyBrcXVldWUgY2hlY2tzCitpZiB0ZXN0IHgkZW5hYmxlX2txdWV1ZSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2txdWV1ZT1ubworZWxzZQorICAgIGhhdmVfa3F1ZXVlPXllcworICAgIEFDX0NIRUNLX0hFQURFUihzeXMvZXZlbnQuaCwgLCBoYXZlX2txdWV1ZT1ubykKKyAgICBBQ19DSEVDS19GVU5DKGtxdWV1ZSwgLCBoYXZlX2txdWV1ZT1ubykKKworICAgIGlmIHRlc3QgeCRlbmFibGVfa3F1ZXVlID0geHllcyAtYSB4JGhhdmVfa3F1ZXVlID0geG5vOyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihrcXVldWUgc3VwcG9ydCBleHBsaWNpdGx5IGVuYWJsZWQgYnV0IG5vdCBhdmFpbGFibGUpCisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBpZiBrcXVldWUgYmFja2VuZCBpcyBlbmFibGVkCitpZiB0ZXN0IHgkaGF2ZV9rcXVldWUgPSB4eWVzOyB0aGVuCisgICBBQ19ERUZJTkUoREJVU19CVVNfRU5BQkxFX0tRVUVVRSwxLFtVc2Uga3F1ZXVlXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQlVTX0VOQUJMRV9LUVVFVUUsIHRlc3QgeCRoYXZlX2txdWV1ZSA9IHh5ZXMpCisKKyMgbGF1bmNoZCBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfbGF1bmNoZCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2xhdW5jaGQ9bm8KK2Vsc2UKKyAgICBoYXZlX2xhdW5jaGQ9eWVzCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtsYXVuY2guaF0sICwgaGF2ZV9sYXVuY2hkPW5vKQorICAgIEFDX1BBVEhfUFJPRyhbTEFVTkNIQ1RMXSwgW2xhdW5jaGN0bF0pCisgICAgaWYgdGVzdCAieCRMQVVOQ0hDVEwiID0gIngiOyB0aGVuCisgICAgICAgIGhhdmVfbGF1bmNoZD1ubworICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2xhdW5jaGQgPSB4eWVzICYmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4bm8gOyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihbbGF1bmNoZCBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZV0pCisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBpZiBsYXVuY2hkIGlzIGVuYWJsZWQKK2lmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRU5BQkxFX0xBVU5DSEQsMSxbVXNlIGxhdW5jaGQgYXV0b2xhdW5jaF0pCitmaQorCitBTV9DT05ESVRJT05BTChEQlVTX0VOQUJMRV9MQVVOQ0hELCB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllcykKKworIyMjIyBEaXJlY3RvcnkgdG8gcGxhY2UgbGF1bmNoZCBhZ2VudCBmaWxlCitpZiB0ZXN0ICJ4JHdpdGhfbGF1bmNoZF9hZ2VudF9kaXIiID0gIngiOyB0aGVuCisgICBMQVVOQ0hEX0FHRU5UX0RJUj0iL0xpYnJhcnkvTGF1bmNoQWdlbnRzIgorZWxzZQorICAgTEFVTkNIRF9BR0VOVF9ESVI9IiR3aXRoX2xhdW5jaGRfYWdlbnRfZGlyIgorZmkKKworQUNfU1VCU1QoTEFVTkNIRF9BR0VOVF9ESVIpCisKK2RubCBjb25zb2xlIG93bmVyIGZpbGUKK2lmIHRlc3QgeCRlbmFibGVfY29uc29sZV9vd25lcl9maWxlID0geG5vIDsgdGhlbgorICAgIGhhdmVfY29uc29sZV9vd25lcl9maWxlPW5vOworZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBzb2xhcmlzKikKKyAgICAgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9eWVzOworICAgICAgICBBQ19ERUZJTkUoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUsMSxbSGF2ZSBjb25zb2xlIG93bmVyIGZpbGVdKQorICAgICAgICA7OworICAgICopCisgICAgICAgIGhhdmVfY29uc29sZV9vd25lcl9maWxlPW5vOzsKKyAgICBlc2FjCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0NPTlNPTEVfT1dORVJfRklMRSwgdGVzdCB4JGhhdmVfY29uc29sZV9vd25lcl9maWxlID0geHllcykKKworZG5sIHN5c3RlbWQgZGV0ZWN0aW9uCitpZiB0ZXN0IHgkZW5hYmxlX3N5c3RlbWQgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9zeXN0ZW1kPW5vOworZWxzZQorICAgIFBLR19DSEVDS19NT0RVTEVTKFtTWVNURU1EXSwKKyAgICAgICAgW2xpYnN5c3RlbWQgPj0gMjA5XSwKKyAgICAgICAgW2hhdmVfc3lzdGVtZD15ZXNdLAorICAgICAgICBbUEtHX0NIRUNLX01PRFVMRVMoW1NZU1RFTURdLAorICAgICAgICAgICAgW2xpYnN5c3RlbWQtbG9naW4gPj0gMzIsIGxpYnN5c3RlbWQtZGFlbW9uID49IDMyLCBsaWJzeXN0ZW1kLWpvdXJuYWwgPj0gMzJdLAorICAgICAgICAgICAgW2hhdmVfc3lzdGVtZD15ZXNdLAorICAgICAgICAgICAgW2hhdmVfc3lzdGVtZD1ub10pXSkKK2ZpCisKK2lmIHRlc3QgeCRoYXZlX3N5c3RlbWQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfU1lTVEVNRCwxLFtIYXZlIHN5c3RlbWRdKQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9zeXN0ZW1kID0geHllcyAtYSB4JGhhdmVfc3lzdGVtZCAhPSB4eWVzIDsgdGhlbgorICAgIEFDX01TR19FUlJPUihbRXhwbGljaXRseSByZXF1ZXN0ZWQgc3lzdGVtZCBzdXBwb3J0LCBidXQgc3lzdGVtZCBub3QgZm91bmRdKQorZmkKKworIyBJZiBub3QgZm91bmQgaW4gJFBBVEgsIHdlIG1pZ2h0IHN0aWxsIGhhdmUgc3lzdGVtZCBhbmQgc3lzdGVtY3RsIGF0IHJ1bnRpbWUKKyMgKHBlcmhhcHMgZGJ1cyBpcyBiZWluZyBjb21waWxlZCBpbiBhIG1pbmltYWwgY2hyb290IHdpdGggbm8gc3lzdGVtZCkuCisjIEFzc3VtZSB0aGUgdXBzdHJlYW0tcmVjb21tZW5kZWQgbG9jYXRpb24uIERpc3RyaWJ1dG9ycyB3aXRoIHNwbGl0IC91c3IKKyMgY2FuIG92ZXJyaWRlIHRoaXMgd2l0aCAuL2NvbmZpZ3VyZSBTWVNURU1DVEw9L2Jpbi9zeXN0ZW1jdGwKK0FDX1BBVEhfUFJPRyhbU1lTVEVNQ1RMXSwgW3N5c3RlbWN0bF0sIFsvdXNyL2Jpbi9zeXN0ZW1jdGxdKQorCisjIGxpYmF1ZGl0IGRldGVjdGlvbgoraWYgdGVzdCB4JGVuYWJsZV9saWJhdWRpdCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2xpYmF1ZGl0PW5vOworZWxzZQorICAgICMgU2VlIGlmIHdlIGhhdmUgYXVkaXQgZGFlbW9uICYgY2FwYWJpbGl0aWVzIGxpYnJhcnkKKyAgICBBQ19DSEVDS19MSUIoYXVkaXQsIGF1ZGl0X2xvZ191c2VyX2F2Y19tZXNzYWdlLAorICAgICAgICAgICAgICAgICBoYXZlX2xpYmF1ZGl0PXllcywgaGF2ZV9saWJhdWRpdD1ubykKKyAgICBpZiB0ZXN0IHgkaGF2ZV9saWJhdWRpdCA9IHh5ZXMgOyB0aGVuCisgICAgICAgIEFDX0NIRUNLX0xJQihjYXAtbmcsIGNhcG5nX2NsZWFyLAorICAgICAgICAgICAgICAgICBoYXZlX2xpYmF1ZGl0PXllcywgaGF2ZV9saWJhdWRpdD1ubykKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9MSUJBVURJVCwgdGVzdCB4JGhhdmVfbGliYXVkaXQgPSB4eWVzKQorCitpZiB0ZXN0IHgkaGF2ZV9saWJhdWRpdCA9IHh5ZXMgOyB0aGVuCisgICAgU0VMSU5VWF9MSUJTPSIkU0VMSU5VWF9MSUJTIC1sYXVkaXQgLWxjYXAtbmciCisgICAgQUNfREVGSU5FKEhBVkVfTElCQVVESVQsMSxbYXVkaXQgZGFlbW9uIFNFTGludXggc3VwcG9ydF0pCitmaQorCitBQ19TVUJTVChbU0VMSU5VWF9MSUJTXSkKKworIyBDaGVjayBmb3IgQURUIEFQSSAoU29sYXJpcyBCYXNpYyBTZWN1cml0eSBNb2RlIGF1ZGl0aW5nKQorQUNfTVNHX0NIRUNLSU5HKGZvciBBRFQgQVBJKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJzbS9hZHQuaD4KK2FkdF91c2VyX2NvbnRleHQgPSBBRFRfVVNFUjsKK11dLCBbW11dKV0sIFsgY2hlY2tfYWR0X2F1ZGl0PXllcyBdLCBbIGNoZWNrX2FkdF9hdWRpdD1ubyBdKQorCitpZiB0ZXN0ICR7Y2hlY2tfYWR0X2F1ZGl0fSA9IHllcwordGhlbgorICAgQUNfREVGSU5FKFtIQVZFX0FEVF0sIFtdLCBbQWR0IGF1ZGl0IEFQSV0pCisgICBBRFRfTElCUz0iLWxic20iCisgICBMSUJTPSItbGJzbSAkTElCUyIKKyAgIEFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorICAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitBQ19TVUJTVChbQURUX0xJQlNdKQorCisjIENoZWNrIGZvciBTQ01fUklHSFRTCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBTQ01fUklHSFRTXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CitzdGF0aWMgaW50IHggPSBTQ01fUklHSFRTOworXV0sIFtbXV0pXSwKK1sgQUNfTVNHX1JFU1VMVChbc3VwcG9ydGVkXSkKKyAgQUNfREVGSU5FKFtIQVZFX1VOSVhfRkRfUEFTU0lOR10sIFsxXSwgW1N1cHBvcnRzIHNlbmRpbmcgVU5JWCBmaWxlIGRlc2NyaXB0b3JzXSkgXSwKK1sgQUNfTVNHX1JFU1VMVChbbm90IHN1cHBvcnRlZF0pIF0pCisKK05FVFdPUktfbGlicz0KK2lmIHRlc3QgeCRkYnVzX3dpbiA9IHh5ZXMgOyB0aGVuCisgIGlmIHRlc3QgeCRkYnVzX3dpbmNlID0geHllcyA7IHRoZW4KKyAgICBORVRXT1JLX2xpYnM9Ii1sd3MyIgorICBlbHNlCisgICAgTkVUV09SS19saWJzPSItbHdzMl8zMiAtbGlwaGxwYXBpIgorICBmaQorZmkKKworQUNfU1VCU1QoW05FVFdPUktfbGlic10pCisKK0FDX0FSR19XSVRIKFt2YWxncmluZF0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXZhbGdyaW5kXSwKKyAgICAgW0FkZCBpbnN0cnVtZW50YXRpb24gdG8gaGVscCB2YWxncmluZCB0byB1bmRlcnN0YW5kIG91ciBhbGxvY2F0b3JdKV0sCisgIFtdLAorICBbd2l0aF92YWxncmluZD1ub10pCisKK0FTX0lGKFt0ZXN0ICJ4JHdpdGhfdmFsZ3JpbmQiID0geGF1dG9dLAorICBbUEtHX0NIRUNLX0VYSVNUUyhbdmFsZ3JpbmQgPj0gMy42XSwKKyAgICBbd2l0aF92YWxncmluZD15ZXNdLCBbd2l0aF92YWxncmluZD1ub10pXSkKKworaWYgdGVzdCB4JHdpdGhfdmFsZ3JpbmQgIT0geG5vOyB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKFtWQUxHUklORF0sIFt2YWxncmluZCA+PSAzLjZdKQorICBBQ19ERUZJTkUoW1dJVEhfVkFMR1JJTkRdLCBbMV0sIFtEZWZpbmUgdG8gYWRkIFZhbGdyaW5kIGluc3RydW1lbnRhdGlvbl0pCitmaQorCisjIyMjIFNldCB1cCBmaW5hbCBmbGFncworTElCREJVU19MSUJTPSIkVEhSRUFEX0xJQlMgJE5FVFdPUktfbGlicyAkU1lTVEVNRF9MSUJTIgorQUNfU1VCU1QoW0xJQkRCVVNfTElCU10pCisKKyMjIyBYMTEgZGV0ZWN0aW9uCitEQlVTX1hfTElCUz0KK0RCVVNfWF9DRkxBR1M9CisKK0FDX0FSR19FTkFCTEUoW3gxMS1hdXRvbGF1bmNoXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXgxMS1hdXRvbGF1bmNoXSwgW2J1aWxkIHdpdGggWDExIGF1dG8tbGF1bmNoIHN1cHBvcnRdKSwKKyAgW10sIFtlbmFibGVfeDExX2F1dG9sYXVuY2g9YXV0b10pCisKK2lmIHRlc3QgIngkZGJ1c193aW4iID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtYMTEgYXV0by1sYXVuY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzXSkKKyAgICBmaQorCisgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPW5vCisgICAgaGF2ZV94MTE9bm8KK2Vsc2UKKyAgICBBQ19QQVRIX1hUUkEKKworICAgIGlmIHRlc3QgIngkbm9feCIgPSB4eWVzOyB0aGVuCisgICAgICAgIGhhdmVfeDExPW5vCisgICAgZWxzZQorICAgICAgICBoYXZlX3gxMT15ZXMKKyAgICAgICAgREJVU19YX0xJQlM9IiRYX0xJQlMgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyIKKyAgICAgICAgREJVU19YX0NGTEFHUz0iJFhfQ0ZMQUdTIgorICAgIGZpCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV94MTFfYXV0b2xhdW5jaCwkaGF2ZV94MTEiID0geHllcyxubzsgdGhlbgorICAgIEFDX01TR19FUlJPUihbWDExIGF1dG8tbGF1bmNoIHJlcXVpcmVzIFggaGVhZGVycy9saWJyYXJpZXNdKQorZWxzZQorICAgICMgbW92ZSBmcm9tICJhdXRvIiB0byAieWVzIiBvciAibm8iIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiAhPSB4bm87IHRoZW4KKyAgICAgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPSIkaGF2ZV94MTEiCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIngkaGF2ZV94MTEiID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19CVUlMRF9YMTFdLCBbMV0sIFtEZWZpbmUgdG8gYnVpbGQgWDExIGZ1bmN0aW9uYWxpdHldKQorZmkKKworaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0hdLCBbMV0sIFtEZWZpbmUgdG8gZW5hYmxlIFgxMSBhdXRvLWxhdW5jaF0pCitmaQorCitBQ19TVUJTVChbREJVU19YX0NGTEFHU10pCitBQ19TVUJTVChbREJVU19YX0xJQlNdKQorCisjIyMjIGdjYyB3YXJuaW5nIGZsYWdzCisKK2NjX3N1cHBvcnRzX2ZsYWcoKSB7CisgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyICRDQyBzdXBwb3J0cyAiJCoiKQorICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkKiIKKyAgQUNfVFJZX0NPTVBJTEUoW10sIFtdLCBbcmM9eWVzXSwgW3JjPW5vXSkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIEFDX01TR19SRVNVTFQoWyRyY10pCisgIHRlc3QgIngkcmMiID0geHllcworfQorCitUUF9DT01QSUxFUl9XQVJOSU5HUyhbV0FSTklOR19DRkxBR1NdLAorICBkbmwgVXNlIC1XZXJyb3IgYnkgZGVmYXVsdCBpZjoKKyAgZG5sIC0gd2UncmUgbm90IG9uIFdpbmRvd3MgKHRvbyBtYW55IHdhcm5pbmdzKSwgYW5kCisgIGRubCAtIHdlJ3JlIGluIGRldmVsb3BlciBtb2RlIChhIEQtQnVzIGRldmVsb3Blciwgbm90IGEgZGlzdHJvIG9yIGVuZC11c2VyKQorICBkbmwgT3ZlcnJpZGUgd2l0aCAtLWVuYWJsZS1XZXJyb3Igb3IgLS1kaXNhYmxlLVdlcnJvcgorICBbdGVzdCB4JGRidXNfd2luICE9IHh5ZXMgLWEgeCRkYnVzX2N5Z3dpbiAhPSB4eWVzIC1hIHgkZW5hYmxlX2RldmVsb3BlciA9IHh5ZXNdLAorCisgIGRubCBFbmFibGUgdGhlc2Ugd2FybmluZ3MgaWYgcG9zc2libGU6CisgIFthbGwgXAorICAgZXh0cmEgXAorICAgY2hhci1zdWJzY3JpcHRzIFwKKyAgIG1pc3NpbmctZGVjbGFyYXRpb25zIFwKKyAgIG1pc3NpbmctcHJvdG90eXBlcyBcCisgICBuZXN0ZWQtZXh0ZXJucyBcCisgICBwb2ludGVyLWFyaXRoIFwKKyAgIGNhc3QtYWxpZ24gXAorICAgbm8tYWRkcmVzcyBcCisgICBmbG9hdC1lcXVhbCBcCisgICBkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgXAorICBdLAorCisgIGRubCBEaXNhYmxlIHRoZXNlIHdhcm5pbmdzIGlmIHBvc3NpYmxlLCBtYWtlIHRoZW0gbm9uLWZhdGFsIGlmIHBvc3NpYmxlLAorICBkbmwgYW5kIGRvbid0IGVuYWJsZSAtV2Vycm9yIHVubGVzcyB3ZSBzdWNjZWVkZWQuCisgIGRubAorICBkbmwgSW50ZW50aW9uYWw6CisgIGRubCAtICRESVNBQkxFX1VOVVNFRF9XQVJOSU5HUyBkaXNhYmxlcyB1bnVzZWQtbGFiZWwgd2FybmluZ3MgaWYgbm90CisgIGRubCAgIGNoZWNraW5nIG9yIG5vdCBhc3NlcnRpbmcKKyAgZG5sIC0gbWlzc2luZyBmaWVsZCBpbml0aWFsaXplcnMgYmVpbmcgMCBpcyBhIEMgZmVhdHVyZSwgbm90IGEgYnVnCisgIGRubCAtIHVudXNlZC1wYXJhbWV0ZXIgaXMgdG8gbWFrZSB3cml0aW5nIGNhbGxiYWNrcyBsZXNzIGFubm95aW5nCisgIGRubAorICBkbmwgVG8gYmUgZml4ZWQgb25lIGRheToKKyAgZG5sIC0gcG9pbnRlci1zaWduIGlzIGEgd29ya2Fyb3VuZCBmb3IgZmQubyAjMTU1MjIKKyAgZG5sIC0gdHlwZS1saW1pdHMgaXMgcHJvYmFibHkgYSBidWcgdG9vLCBidXQgaGF2aW5nIHRoZSByZXN0IG9mIC1XZXh0cmEKKyAgZG5sICAgaXMgYmV0dGVyIHRoYW4gbm90aGluZworICBbJERJU0FCTEVfVU5VU0VEX1dBUk5JTkdTIFwKKyAgIGRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIFwKKyAgIG1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIFwKKyAgIHVudXNlZC1wYXJhbWV0ZXIgXAorICAgcG9pbnRlci1zaWduIFwKKyAgIHR5cGUtbGltaXRzIFwKKyAgXSkKKworaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICMgV2UncmUgdHJlYXRpbmcgLWZuby1jb21tb24gbGlrZSBhIHdhcm5pbmc6IGl0IG1ha2VzIHRoZSBsaW5rZXIgbW9yZQorICAjIHN0cmljdCwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgdGhlIGxpbmtlciBpcyAqYWx3YXlzKiB0aGlzIHN0cmljdAorICBUUF9BRERfQ09NUElMRVJfRkxBRyhbV0FSTklOR19DRkxBR1NdLCBbLWZuby1jb21tb25dKQorCisgICMgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDU5OQorICBUUF9BRERfQ09NUElMRVJfRkxBRyhbV0FSTklOR19DRkxBR1NdLCBbLWZuby1zdHJpY3QtYWxpYXNpbmddKQorCisgIGlmIHRlc3QgIngkZW5hYmxlX2Fuc2kiID0gInh5ZXMiOyB0aGVuCisgICAgVFBfQUREX0NPTVBJTEVSX0ZMQUcoW1dBUk5JTkdfQ0ZMQUdTXSwKKyAgICAgIFstYW5zaSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLXBlZGFudGljXSkKKyAgZmkKK2ZpCisKK2RubCBJbiBwcmluY2lwbGUgd2Ugc2hvdWxkIHB1dCBXQVJOSU5HX0NGTEFHUyBpbiBlYWNoIE1ha2VmaWxlLmFtIGxpa2UKK2RubCB0ZWxlcGF0aHktZ2xpYiBkb2VzLCBzaW5jZSBDRkxBR1MgaXMgbWVhbnQgdG8gYmUgcmVzZXJ2ZWQgZm9yIHRoZSB1c2VyLi4uCitkbmwgYnV0IHByZXBlbmRpbmcgdG8gQ0ZMQUdTIChzbyB0aGUgdXNlciBjYW4gb3ZlcnJpZGUgaXQgd2l0aCBsYXRlciBDRkxBR1MpCitkbmwgaXMgdGhlIG5leHQgYmVzdCB0aGluZworQ0ZMQUdTPSIkV0FSTklOR19DRkxBR1MgJENGTEFHUyIKKworY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgICAjIFNvbGFyaXMnIEMgbGlicmFyeSBhcHBhcmVudGx5IG5lZWRzIHRoZXNlIHJ1bmVzIHRvIGJlIHRocmVhZHNhZmUuLi4KKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIC1EX1JFRU5UUkFOVCIKKyAgICAgICAgIyAuLi4gdGhpcyBvcHQtaW4gdG8gZ2V0IHNvY2thZGRyX2luNiBhbmQgc29ja2FkZHJfc3RvcmFnZS4uLgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURfX0VYVEVOU0lPTlNfXyIKKyAgICAgICAgIyAuLi4gYW5kIHRoaXMgb3B0LWluIHRvIGdldCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBzdXBwb3J0CisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9YT1BFTl9TT1VSQ0U9NTAwIgorICAgICAgICA7OworZXNhYworCisjIyMgRGV0ZWN0IGlmIGxkIHN1cHBvcnRzIC0tdmVyc2lvbi1zY3JpcHQKKworZ2xfTERfVkVSU0lPTl9TQ1JJUFQKK0FNX0NPTkRJVElPTkFMKFtIQVZFX0xEX1ZFUlNJT05fU0NSSVBUXSwKKyAgICAgICAgICAgICAgIFt0ZXN0ICJ4JGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0geHllc10pCisjIyMgRG94eWdlbiBEb2N1bWVudGF0aW9uCisKK0FDX1BBVEhfUFJPRyhET1hZR0VOLCBkb3h5Z2VuLCBubykKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIERveHlnZW4gZG9jdW1lbnRhdGlvbl0pCisKK2lmIHRlc3QgeCRET1hZR0VOID0geG5vIDsgdGhlbgorICAgIGhhdmVfZG94eWdlbj1ubworZWxzZQorICAgIGhhdmVfZG94eWdlbj15ZXMKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geGF1dG8gOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfZG94eWdlbiA9IHhubyA7IHRoZW4KKyAgICAgICAgZW5hYmxlX2RveHlnZW5fZG9jcz1ubworICAgIGVsc2UKKyAgICAgICAgZW5hYmxlX2RveHlnZW5fZG9jcz15ZXMKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfZG94eWdlbiA9IHhubzsgdGhlbgorCUFDX01TR19FUlJPUihbQnVpbGRpbmcgRG94eWdlbiBkb2NzIGV4cGxpY2l0bHkgcmVxdWlyZWQsIGJ1dCBEb3h5Z2VuIG5vdCBmb3VuZF0pCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRUQsIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcykKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9kb3h5Z2VuX2RvY3MpCisKK0FDX0NIRUNLX1BST0dTKFtYU0xUUFJPQ10sIFt4c2x0cHJvY10pCitBTV9DT05ESVRJT05BTChbREJVU19IQVZFX1hTTFRQUk9DXSwgW3Rlc3QgIngkWFNMVFBST0MiICE9ICJ4Il0pCisKKyMjIyBEdWNrdHlwZS9ZZWxwIGRvY3VtZW50YXRpb24KKworQUNfUEFUSF9QUk9HKFtEVUNLVFlQRV0sW2R1Y2t0eXBlXSxbbm9dKQorQUNfUEFUSF9QUk9HKFtZRUxQX0JVSUxEXSxbeWVscC1idWlsZF0sW25vXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIER1Y2t0eXBlIGRvY3VtZW50YXRpb25dKQorCitBU19JRihbdGVzdCAiJERVQ0tUWVBFIiA9ICJubyJdLFtoYXZlX2R1Y2t0eXBlPW5vXSxbaGF2ZV9kdWNrdHlwZT15ZXNdKQorQVNfSUYoW3Rlc3QgIiRZRUxQX0JVSUxEIiA9ICJubyJdLFtoYXZlX3llbHBfYnVpbGQ9bm9dLFtoYXZlX3llbHBfYnVpbGQ9eWVzXSkKKworQVNfSUYoW3Rlc3QgIiRlbmFibGVfZHVja3R5cGVfZG9jcyIgPSAiYXV0byJdLFsKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfZHVja3R5cGUiID0gIm5vIiB8fCB0ZXN0ICIkaGF2ZV95ZWxwX2J1aWxkIiA9ICJubyJdLFsKKyAgICAgICAgZW5hYmxlX2R1Y2t0eXBlX2RvY3M9bm8KKyAgICBdLFsKKyAgICAgICAgZW5hYmxlX2R1Y2t0eXBlX2RvY3M9eWVzCisgICAgXSkKK10pCisKK0FTX0lGKFt0ZXN0ICIkZW5hYmxlX2R1Y2t0eXBlX2RvY3MiID0gInllcyJdLFsKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfZHVja3R5cGUiID0gIm5vIl0sWworICAgICAgICBBQ19NU0dfRVJST1IoW0J1aWxkaW5nIER1Y2t0eXBlIGRvY3MgZXhwbGljaXRseSByZXF1aXJlZCwgYnV0IGR1Y2t0eXBlIG5vdCBmb3VuZF0pCisgICAgXSkKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfeWVscF9idWlsZCIgPSAibm8iXSxbCisgICAgICAgIEFDX01TR19FUlJPUihbQnVpbGRpbmcgRHVja3R5cGUgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeWVscC1idWlsZCBub3QgZm91bmRdKQorICAgIF0pCitdKQorCitBTV9DT05ESVRJT05BTChbREJVU19EVUNLVFlQRV9ET0NTX0VOQUJMRURdLFt0ZXN0ICIkZW5hYmxlX2R1Y2t0eXBlX2RvY3MiID0gInllcyJdKQorQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9kdWNrdHlwZV9kb2NzXSkKKworIyMjIFhNTCBEb2N1bWVudGF0aW9uCisKK0FDX1BBVEhfUFJPRyhYTUxUTywgeG1sdG8sIG5vKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgWE1MIGRvY3VtZW50YXRpb25dKQorCitpZiB0ZXN0IHgkWE1MVE8gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV94bWx0bz1ubworZWxzZQorICAgIGhhdmVfeG1sdG89eWVzCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geGF1dG8gOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfeG1sdG8gPSB4bm8gOyB0aGVuCisgICAgICAgIGVuYWJsZV94bWxfZG9jcz1ubworICAgIGVsc2UKKyAgICAgICAgZW5hYmxlX3htbF9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCRoYXZlX3htbHRvID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtCdWlsZGluZyBYTUwgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeG1sdG8gbm90IGZvdW5kXSkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19YTUxfRE9DU19FTkFCTEVELCB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllcykKK0FDX01TR19SRVNVTFQoJGVuYWJsZV94bWxfZG9jcykKKworQU1fQ09ORElUSU9OQUwoREJVU19DQU5fVVBMT0FEX0RPQ1MsCisgICAgW3Rlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcyAmJiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllcyAmJgorICAgICB0ZXN0IHgkZW5hYmxlX2R1Y2t0eXBlX2RvY3MgPSB4eWVzXSkKKworIyMjIyBIYXZlIHRvIGdvICRsb2NhbHN0YXRlZGlyLT4kcHJlZml4L3Zhci0+L3Vzci9sb2NhbC92YXIKKworIyMjIyBmaW5kIHRoZSBhY3R1YWwgdmFsdWUgZm9yICRwcmVmaXggdGhhdCB3ZSdsbCBlbmQgdXAgd2l0aAorIyMgICAoSSBrbm93IHRoaXMgaXMgYnJva2VuIGFuZCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgTWFrZWZpbGUsIGJ1dAorIyMgICAgdGhhdCdzIGEgbWFqb3IgcGFpbiBhbmQgYWxtb3N0IG5vYm9keSBhY3R1YWxseSBzZWVtcyB0byBjYXJlKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX1BSRUZJWCwgIiRwcmVmaXgiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0xPQ0FMU1RBVEVESVIsICIkbG9jYWxzdGF0ZWRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfU1lTQ09ORkRJUiwgIiRzeXNjb25mZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9CSU5ESVIsICIkYmluZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9MSUJESVIsICIkbGliZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9MSUJFWEVDRElSLCAiJGxpYmV4ZWNkaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0RBVEFESVIsICIkZGF0YWRpciIpCisKKyMjIyMgQ2hlY2sgb3VyIG9wZXJhdGluZyBzeXN0ZW0KK29wZXJhdGluZ19zeXN0ZW09dW5rbm93bgoraWYgdGVzdCAtZiAvZXRjL3JlZGhhdC1yZWxlYXNlIHx8IHRlc3QgLWYgJEVYUEFOREVEX1NZU0NPTkZESVIvcmVkaGF0LXJlbGVhc2UgOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPXJlZGhhdAorZmkKKworaWYgdGVzdCAtZiAvZXRjL3NsYWNrd2FyZS12ZXJzaW9uIHx8IHRlc3QgLWYgJEVYUEFOREVEX1NZU0NPTkZESVIvc2xhY2t3YXJlLXZlcnNpb24gOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPXNsYWNrd2FyZQorZmkKKworaWYgdGVzdCAtZiAvdXNyL2Jpbi9jeWd3aW4xLmRsbCB8fCB0ZXN0IC1mICRFWFBBTkRFRF9CSU5ESVIvY3lnd2luMS5kbGwgOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPWN5Z3dpbgorZmkKKworIyMjIyBTb3J0IG91dCBpbml0IHNjcmlwdHMKKworaWYgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geDsgdGhlbgorICAgIGNhc2UgeCRvcGVyYXRpbmdfc3lzdGVtIGluCisgICAgICAgIHhyZWRoYXQpCXdpdGhfaW5pdF9zY3JpcHRzPXJlZGhhdCA7OworICAgICAgICB4c2xhY2t3YXJlKQl3aXRoX2luaXRfc2NyaXB0cz1zbGFja3dhcmUgOzsKKyAgICAgICAgeGN5Z3dpbikJd2l0aF9pbml0X3NjcmlwdHM9Y3lnd2luIDs7CisgICAgICAgICopCQkJd2l0aF9pbml0X3NjcmlwdHM9bm9uZSA7OworICAgIGVzYWMKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQsIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhyZWRoYXQpCitBTV9DT05ESVRJT05BTChEQlVTX0lOSVRfU0NSSVBUU19TTEFDS1dBUkUsIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhzbGFja3dhcmUpCitBTV9DT05ESVRJT05BTChEQlVTX0lOSVRfU0NSSVBUU19DWUdXSU4sIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhjeWd3aW4pCisKKyMjIyMjIHN5c3RlbWQgdW5pdCBmaWxlcworQUNfQVJHX1dJVEgoW3N5c3RlbWRzeXN0ZW11bml0ZGlyXSwKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXI9RElSXSwgW0RpcmVjdG9yeSBmb3Igc3lzdGVtZCBzZXJ2aWNlIGZpbGVzXSksCisgICAgW10sCisgICAgWworICAgIFBLR19DSEVDS19FWElTVFMoW3N5c3RlbWRdLAorICAgICAgW3dpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCgkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXN5c3RlbWRzeXN0ZW11bml0ZGlyIHN5c3RlbWQpXSwKKyAgICAgIFt3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyPW5vXSkKKyAgICBdKQoraWYgdGVzdCAieCR3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyIiAhPSB4bm87IHRoZW4KKyAgIEFDX1NVQlNUKFtzeXN0ZW1kc3lzdGVtdW5pdGRpcl0sIFskd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcl0pCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9TWVNURU1ELCBbdGVzdCAieCRoYXZlX3N5c3RlbWQiICE9ICJ4bm8iIC1hIC1uICIkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgLWEgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vIF0pCisKK0FDX0FSR19XSVRIKFtzeXN0ZW1kdXNlcnVuaXRkaXJdLAorQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW1kdXNlcnVuaXRkaXI9RElSXSwgW0RpcmVjdG9yeSBmb3Igc3lzdGVtZCB1c2VyIHNlcnZpY2UgZmlsZXNdKSwKKyAgICBbXSwKKyAgICBbCisgICAgUEtHX0NIRUNLX0VYSVNUUyhbc3lzdGVtZF0sCisgICAgICBbd2l0aF9zeXN0ZW1kdXNlcnVuaXRkaXI9JCgkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXN5c3RlbWR1c2VydW5pdGRpciBzeXN0ZW1kKV0sCisgICAgICBbd2l0aF9zeXN0ZW1kdXNlcnVuaXRkaXI9JyR7bGliZGlyfS9zeXN0ZW1kL3VzZXInXSkKKyAgICBdKQorQUNfU1VCU1QoW3N5c3RlbWR1c2VydW5pdGRpcl0sIFskd2l0aF9zeXN0ZW1kdXNlcnVuaXRkaXJdKQorCisjIyMjIyBTZXQgdXAgbG9jYXRpb24gZm9yIHN5c3RlbSBidXMgc29ja2V0CitpZiAhIHRlc3QgLXogIiR3aXRoX3N5c3RlbV9zb2NrZXQiOyB0aGVuCisgICBEQlVTX1NZU1RFTV9TT0NLRVQ9JHdpdGhfc3lzdGVtX3NvY2tldAorZWxzZQorICAgREJVU19TWVNURU1fU09DS0VUPSR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL2RidXMvc3lzdGVtX2J1c19zb2NrZXQKK2ZpCisKK0FDX1NVQlNUKERCVVNfU1lTVEVNX1NPQ0tFVCkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1NZU1RFTV9TT0NLRVQsIiREQlVTX1NZU1RFTV9TT0NLRVQiLFtUaGUgbmFtZSBvZiB0aGUgc29ja2V0IHRoZSBzeXN0ZW0gYnVzIGxpc3RlbnMgb24gYnkgZGVmYXVsdF0pCisKKyMjIFN5c3RlbSBidXMgb25seSBsaXN0ZW5zIG9uIGxvY2FsIGRvbWFpbiBzb2NrZXRzLCBhbmQgbmV2ZXIKKyMjIG9uIGFuIGFic3RyYWN0IHNvY2tldCAoc28gb25seSByb290IGNhbiBjcmVhdGUgdGhlIHNvY2tldCkuCisjIworIyMgVGhpcyB3b24ndCB3b3JrIG9uIFdpbmRvd3MuIEl0J3Mgbm90IG1lYW50IHRvIC0gdGhlIHN5c3RlbSBidXMgaXMKKyMjIG1lYW5pbmdsZXNzIG9uIFdpbmRvd3MgYW55d2F5LgorIyMKKyMjIFRoaXMgaGFzIHRvIGJlIHN1aXRhYmxlIGZvciBoYXJkLWNvZGluZyBpbiBjbGllbnQgbGlicmFyaWVzIGFzIHdlbGwgYXMKKyMjIGluIHRoZSBkYnVzLWRhZW1vbidzIGNvbmZpZ3VyYXRpb24sIHNvIGl0IGhhcyB0byBiZSB2YWxpZCB0byBsaXN0ZW4gb24KKyMjIGFuZCBhbHNvIHRvIGNvbm5lY3QgdG8uIElmIHRoaXMgZXZlciBjaGFuZ2VzLCBpdCdsbCBuZWVkIHRvIGJlIHNwbGl0IGludG8KKyMjIHR3byB2YXJpYWJsZXMsIG9uZSBmb3IgdGhlIGxpc3RlbmluZyBhZGRyZXNzIGFuZCBvbmUgZm9yIHRoZSBjb25uZWN0aW5nCisjIyBhZGRyZXNzLgorREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUz0idW5peDpwYXRoPSREQlVTX1NZU1RFTV9TT0NLRVQiCitBQ19TVUJTVChEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MsICIkREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyIsW1RoZSBkZWZhdWx0IEQtQnVzIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXNdKQorCisjIyMjIFNldCB1cCB0aGUgcGlkIGZpbGUKK2lmICEgdGVzdCAteiAiJHdpdGhfc3lzdGVtX3BpZF9maWxlIjsgdGhlbgorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHdpdGhfc3lzdGVtX3BpZF9maWxlCitlbGlmIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhyZWRoYXQgOyB0aGVuCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9tZXNzYWdlYnVzLnBpZAorZWxzZQorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9waWQKK2ZpCisKK0FDX1NVQlNUKERCVVNfU1lTVEVNX1BJRF9GSUxFKQorCisjIyMjIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9hdXRoX2RpciI7IHRoZW4KKyAgIERCVVNfQ09OU09MRV9BVVRIX0RJUj0kd2l0aF9jb25zb2xlX2F1dGhfZGlyCitlbHNlCisgICBEQlVTX0NPTlNPTEVfQVVUSF9ESVI9L3Zhci9ydW4vY29uc29sZS8KK2ZpCisKK0FDX1NVQlNUKERCVVNfQ09OU09MRV9BVVRIX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0NPTlNPTEVfQVVUSF9ESVIsICIkREJVU19DT05TT0xFX0FVVEhfRElSIiwgW0RpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pCisKKyMjIyMgRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmIHRlc3QgeCRoYXZlX2NvbnNvbGVfb3duZXJfZmlsZSA9IHh5ZXM7IHRoZW4KKyAgIGlmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9vd25lcl9maWxlIjsgdGhlbgorICAgICAgREJVU19DT05TT0xFX09XTkVSX0ZJTEU9JHdpdGhfY29uc29sZV9vd25lcl9maWxlCisgICBlbHNlCisgICAgICBEQlVTX0NPTlNPTEVfT1dORVJfRklMRT0vZGV2L2NvbnNvbGUKKyAgIGZpCitlbHNlCisgIERCVVNfQ09OU09MRV9PV05FUl9GSUxFPQorZmkKKworQUNfU1VCU1QoREJVU19DT05TT0xFX09XTkVSX0ZJTEUpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19DT05TT0xFX09XTkVSX0ZJTEUsICIkREJVU19DT05TT0xFX09XTkVSX0ZJTEUiLCBbRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pCisKKyMjIyMgVXNlciB0byBzdGFydCB0aGUgc3lzdGVtIGJ1cyBhcworaWYgdGVzdCAteiAiJHdpdGhfZGJ1c191c2VyIiA7IHRoZW4KKyAgICBEQlVTX1VTRVI9bWVzc2FnZWJ1cworZWxzZQorICAgIERCVVNfVVNFUj0kd2l0aF9kYnVzX3VzZXIKK2ZpCitBQ19TVUJTVChEQlVTX1VTRVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19VU0VSLCIkREJVU19VU0VSIiwgW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIHN5c3RlbSBCVVMgZGFlbW9uXSkKKworIyMjIyBVc2VyIGZvciByZWdyZXNzaW9uIHRlc3RzCitBU19JRihbdGVzdCAteiAiJHdpdGhfdGVzdF91c2VyIl0sIFt3aXRoX3Rlc3RfdXNlcj1ub2JvZHldKQorREJVU19URVNUX1VTRVI9IiR3aXRoX3Rlc3RfdXNlciIKK0FDX1NVQlNUKFtEQlVTX1RFU1RfVVNFUl0pCitBQ19ERUZJTkVfVU5RVU9URUQoW0RCVVNfVEVTVF9VU0VSXSwgWyIkREJVU19URVNUX1VTRVIiXSwKKyAgW1VucHJpdmlsZWdlZCB1c2VyIHVzZWQgaW4gc29tZSByZWdyZXNzaW9uIHRlc3RzXSkKKworIyMjIyBQcmVmaXggdG8gaW5zdGFsbCBpbnRvCitEQlVTX1BSRUZJWD0kRVhQQU5ERURfUFJFRklYCitBQ19TVUJTVChEQlVTX1BSRUZJWCkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1BSRUZJWCwiJERCVVNfUFJFRklYIiwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBEQlVTXSkKKworIyMjIyBEaXJlY290cnkgdG8gaW5zdGFsbCBkYXRhIGZpbGVzIGludG8KK0RCVVNfREFUQURJUj0kRVhQQU5ERURfREFUQURJUgorQUNfU1VCU1QoREJVU19EQVRBRElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfREFUQURJUiwiJERCVVNfREFUQURJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgREJVUyBkYXRhIGZpbGVzXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCBkYnVzLWRhZW1vbgoraWYgdGVzdCAteiAiJHdpdGhfZGJ1c19kYWVtb25kaXIiIDsgdGhlbgorICAgIERCVVNfREFFTU9ORElSPSRFWFBBTkRFRF9CSU5ESVIKKyAgICBkYnVzX2RhZW1vbmRpcj0nJGJpbmRpcicKK2Vsc2UKKyAgICBEQlVTX0RBRU1PTkRJUj0kd2l0aF9kYnVzX2RhZW1vbmRpcgorICAgIGRidXNfZGFlbW9uZGlyPSR3aXRoX2RidXNfZGFlbW9uZGlyCitmaQorQUNfU1VCU1QoREJVU19EQUVNT05ESVIpCitBQ19TVUJTVChkYnVzX2RhZW1vbmRpcikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0RBRU1PTkRJUiwiJERCVVNfREFFTU9ORElSIiwgW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgREJVUyBkYWVtb25dKQorCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBvdGhlciBiaW5hcmllcworREJVU19CSU5ESVI9IiRFWFBBTkRFRF9CSU5ESVIiCitBQ19TVUJTVChEQlVTX0JJTkRJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0JJTkRJUiwiJERCVVNfQklORElSIiwgW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgYmluYXJpZXNdKQorCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBsaWJleGVjIGJpbmFyaWVzCitEQlVTX0xJQkVYRUNESVI9IiRFWFBBTkRFRF9MSUJFWEVDRElSIgorQUNfU1VCU1QoREJVU19MSUJFWEVDRElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfTElCRVhFQ0RJUiwiJERCVVNfTElCRVhFQ0RJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIGxpYmV4ZWMgYmluYXJpZXNdKQorCisjIyMjIERpcmVjdG9yeSB0byBzb3VyY2Ugc3lzY29uZmRpciBjb25maWd1cmF0aW9uIGZyb20KKworIyBPbiBXaW5kb3dzIHRoaXMgaXMgcmVsYXRpdmUgdG8gd2hlcmUgd2UgcHV0IHRoZSBidXMgc2V0dXAsIGluCisjICR7ZGF0YWRpcn0vZGJ1cy0xLiBGb3Igc2ltcGxpY2l0eSwgd2Ugb25seSBkbyB0aGlzIGlmCisjICR7c3lzY29uZmRpcn0gPSAke3ByZWZpeH0vZXRjIGFuZCAke2RhdGFkaXJ9ID0gJHtwcmVmaXh9L3NoYXJlLgorIworIyBPbiBVbml4LCBvciBvbiBXaW5kb3dzIHdpdGggd2VpcmQgaW5zdGFsbCBsYXlvdXRzLCBpdCdzIHRoZSBhYnNvbHV0ZSBwYXRoLgorQVNfSUYoW3Rlc3QgIiR7ZGJ1c193aW59IiA9IHllcyAmJiBcCisgICAgICAgdGVzdCAiJEVYUEFOREVEX1NZU0NPTkZESVIiID0gIiRFWFBBTkRFRF9QUkVGSVgvZXRjIiAmJiBcCisgICAgICAgdGVzdCAiJEVYUEFOREVEX0RBVEFESVIiID0gIiRFWFBBTkRFRF9QUkVGSVgvc2hhcmUiXSwKKyAgICAgIFtTWVNDT05GRElSX0ZST01fUEtHREFUQURJUj0iLi4vLi4vZXRjIgorICAgICAgIERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSPSIuLi8uLi9zaGFyZSJdLAorICAgICAgW1NZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSPSIkRVhQQU5ERURfU1lTQ09ORkRJUiIKKyAgICAgICBEQVRBRElSX0ZST01fUEtHU1lTQ09ORkRJUj0iJEVYUEFOREVEX0RBVEFESVIiXSkKK0FDX1NVQlNUKFtTWVNDT05GRElSX0ZST01fUEtHREFUQURJUl0pCitBQ19TVUJTVChbREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVJdKQorCisjIyMjIFRlbGwgdGVzdHMgd2hlcmUgdG8gZmluZCBjZXJ0YWluIHN0dWZmIGluIGJ1aWxkZGlyCisKK0RCVVNfUFdEPWBwd2RgCisjIFVzZWZ1bCBpbiBhIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50LCB3aGVyZSB0aGUgdGVzdHMgYXJlIHJ1biBvbiB0aGUgaG9zdCBzeXN0ZW0uCitBQ19BUkdfV0lUSChkYnVzLXRlc3QtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtdGVzdC1kaXI9W2Rpcm5hbWVdXSxbcGF0aCB3aGVyZSB0aGUgdGVzdHMgdG9vbHMgYXJlIGF2YWlsYWJsZV0pLAorCQkJICAgREJVU19QV0Q9JHdpdGh2YWwpCisKK0RCVVNfVEVTVF9FWEVDPSIkREJVU19QV0QvdGVzdCIKK0RCVVNfVEVTVF9EQVRBPSIkREJVU19QV0QvdGVzdC9kYXRhIgorCitBQ19TVUJTVChbREJVU19URVNUX0RBVEFdKQorQUNfU1VCU1QoW0RCVVNfVEVTVF9FWEVDXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1RFU1RfRVhFQ10sIFsiJERCVVNfVEVTVF9FWEVDIl0sCisgICAgICAgICAgICAgICAgICAgW0Z1bGwgcGF0aCB0byB0aGUgZGFlbW9uIGluIHRoZSBidWlsZGRpcl0pCitBQ19ERUZJTkVfVU5RVU9URUQoW0RCVVNfRVhFRVhUXSwgWyIkRVhFRVhUIl0sCisgICAgICAgICAgICAgICAgICAgW0V4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZXMsIHR5cGljYWxseSBlbXB0eSBvciAuZXhlXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFRFU1RfQlVTX0xBVU5DSF9CSU5BUlksIFsiJERCVVNfUFdEL3Rvb2xzL2RidXMtbGF1bmNoJEVYRUVYVCJdLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGhlIGRidXMtbGF1bmNoIGluIHRoZSBidWlsZGRpcl0pCisKKyMjIEV4cG9ydCB0aGUgbm9uLXNldHVpZCBleHRlcm5hbCBoZWxwZXIKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlk9IiREQlVTX1BXRC9idXMvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0JEVYRUVYVCIKK0FDX1NVQlNUKFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZLCAiJFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkiLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGhlIGxhdW5jaCBoZWxwZXIgdGVzdCBwcm9ncmFtIGluIHRoZSBidWlsZGRpcl0pCisKKyMjIyMgRmluZCBzb2NrZXQgZGlyZWN0b3JpZXMKK2lmICEgdGVzdCAteiAiJFRNUERJUiIgOyB0aGVuCisgICBERUZBVUxUX1NPQ0tFVF9ESVI9JFRNUERJUgorZWxpZiAhIHRlc3QgLXogIiRURU1QIiA7IHRoZW4KKyAgIERFRkFVTFRfU09DS0VUX0RJUj0kVEVNUAorZWxpZiAhIHRlc3QgLXogIiRUTVAiIDsgdGhlbgorICAgREVGQVVMVF9TT0NLRVRfRElSPSRUTVAKK2Vsc2UKKyAgIERFRkFVTFRfU09DS0VUX0RJUj0vdG1wCitmaQorCitERUZBVUxUX1NPQ0tFVF9ESVI9YGVjaG8gJERFRkFVTFRfU09DS0VUX0RJUiB8IHNlZCAncy8rLyUyQi9nJ2AKKworaWYgISB0ZXN0IC16ICIkd2l0aF90ZXN0X3NvY2tldF9kaXIiIDsgdGhlbgorICAgVEVTVF9TT0NLRVRfRElSPSIkd2l0aF90ZXN0X3NvY2tldF9kaXIiCitlbHNlCisgICBURVNUX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKK0FDX1NVQlNUKFRFU1RfU09DS0VUX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1RFU1RfU09DS0VUX0RJUiwgIiRURVNUX1NPQ0tFVF9ESVIiLCBbV2hlcmUgdG8gcHV0IHRlc3Qgc29ja2V0c10pCisKK2lmIHRlc3QgIngkZGJ1c191bml4IiA9IHh5ZXM7IHRoZW4KKyAgVEVTVF9MSVNURU49InVuaXg6dG1wZGlyPSRURVNUX1NPQ0tFVF9ESVIiCitlbHNlCisgIFRFU1RfTElTVEVOPSJ0Y3A6aG9zdD1sb2NhbGhvc3QiCitmaQorQUNfU1VCU1QoW1RFU1RfTElTVEVOXSkKK0FDX0RFRklORV9VTlFVT1RFRChbVEVTVF9MSVNURU5dLCBbIiRURVNUX0xJU1RFTiJdLAorICBbTGlzdGVuaW5nIGFkZHJlc3MgZm9yIHJlZ3Jlc3Npb24gdGVzdHNdKQorCitpZiAhIHRlc3QgLXogIiR3aXRoX3Nlc3Npb25fc29ja2V0X2RpciIgOyB0aGVuCisgICBEQlVTX1NFU1NJT05fU09DS0VUX0RJUj0iJHdpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyIgorZWxzZQorICAgREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiwgIiREQlVTX1NFU1NJT05fU09DS0VUX0RJUiIsIFtXaGVyZSBwZXItc2Vzc2lvbiBidXMgcHV0cyBpdHMgc29ja2V0c10pCitBQ19TVUJTVChEQlVTX1NFU1NJT05fU09DS0VUX0RJUikKKworIyBUaGlzIG11c3QgYmUgYSBsaXN0ZW5pbmcgYWRkcmVzcy4gSXQgZG9lc24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIGJlIGFuCisjIGFkZHJlc3MgeW91IGNhbiBjb25uZWN0IHRvIC0gaXQgY2FuIGJlIHNvbWV0aGluZyB2YWd1ZSBsaWtlCisjICJub25jZS10Y3A6Ii4KKyMKKyMgVGhlIGRlZmF1bHQgdmFyaWVzIGJ5IHBsYXRmb3JtLgorQUNfQVJHX1dJVEgoW2RidXNfc2Vzc2lvbl9idXNfbGlzdGVuX2FkZHJlc3NdLAorICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWxpc3Rlbi1hZGRyZXNzPVtBRERSRVNTXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdCBhZGRyZXNzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxpc3RlbiBvbiAoc2VlIGNvbmZpZ3VyZS5hYyldKSwKKyAgICAgICAgICAgIFt3aXRoX2RidXNfc2Vzc2lvbl9idXNfbGlzdGVuX2FkZHJlc3M9JHdpdGh2YWxdLAorICAgICAgICAgICAgW3dpdGhfZGJ1c19zZXNzaW9uX2J1c19saXN0ZW5fYWRkcmVzcz1dKQorCitpZiB0ZXN0ICJ4JHdpdGhfZGJ1c19zZXNzaW9uX2J1c19saXN0ZW5fYWRkcmVzcyIgIT0gIngiOyB0aGVuCisgICAgICAgICMgdGhlIHVzZXIgc3BlY2lmaWVkIHNvbWV0aGluZywgdHJ1c3QgdGhlbQorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTPSIkd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2xpc3Rlbl9hZGRyZXNzIgorZWxpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgICMgT24gV2luZG93cywgeW91IGNhbiAoYW5kIHNob3VsZCkgbGlzdGVuIG9uIGF1dG9sYXVuY2ggYWRkcmVzc2VzLAorICAgICAgICAjIGJlY2F1c2UgYXV0b2xhdW5jaGluZyBpcyBkaWZmZXJlbnQuCisgICAgICAgICMgU2VlIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTM4MjAxCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1M9ImF1dG9sYXVuY2g6IgorZWxpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICAjIE1hYyBPUyBYIGRlZmF1bHQgaXMgdG8gdXNlIGxhdW5jaGQKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTUz0ibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCIKK2Vsc2UKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBvbiBhbGwgb3RoZXIgVW5peCBwbGF0Zm9ybXMgKG5vdGFibHkgTGludXgpCisgICAgICAgICMgaXMgdG8gY3JlYXRlIGEgcmFuZG9tbHkgbmFtZWQgc29ja2V0IGluIC90bXAgb3Igc2ltaWxhcgorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTPSJ1bml4OnRtcGRpcj0kREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIiCitmaQorQUNfU1VCU1QoW0RCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1NdKQorCisjIFRoaXMgbXVzdCBiZSBhbiBhZGRyZXNzIHlvdSBjYW4gY29ubmVjdCB0by4gSXQgZG9lc24ndCBuZWNlc3NhcmlseQorIyBuZWVkIHRvIGJlIGFuIGFkZHJlc3MgeW91IGNhbiBsaXN0ZW4gb24gLSBpdCBjYW4gYmUgImF1dG9sYXVuY2g6IiwKKyMgZXZlbiBvbiBVbml4LgorIworIyBUaGUgZGVmYXVsdCB2YXJpZXMgYnkgcGxhdGZvcm0uCitBQ19BUkdfV0lUSChbZGJ1c19zZXNzaW9uX2J1c19jb25uZWN0X2FkZHJlc3NdLAorICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWNvbm5lY3QtYWRkcmVzcz1bQUREUkVTU11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZhbGxiYWNrIGFkZHJlc3MgZm9yIGEgc2Vzc2lvbiBidXMgY2xpZW50IHRvIGNvbm5lY3QgdG8gKHNlZSBjb25maWd1cmUuYWMpXSksCisgICAgICAgICAgICBbd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2Nvbm5lY3RfYWRkcmVzcz0kd2l0aHZhbF0sCisgICAgICAgICAgICBbd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2Nvbm5lY3RfYWRkcmVzcz1dKQorCitpZiB0ZXN0ICJ4JHdpdGhfZGJ1c19zZXNzaW9uX2J1c19jb25uZWN0X2FkZHJlc3MiICE9ICJ4IjsgdGhlbgorICAgICAgICAjIHRoZSB1c2VyIHNwZWNpZmllZCBzb21ldGhpbmcsIHRydXN0IHRoZW0KKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1M9IiR3aXRoX2RidXNfc2Vzc2lvbl9idXNfY29ubmVjdF9hZGRyZXNzIgorZWxpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgICMgV2luZG93cyBhdXRvbGF1bmNoaW5nIGlzIGEgYml0IGRpZmZlcmVudDsgbGVhdmluZyBpdCBpbiBpdHMgb3duCisgICAgICAgICMgYnJhbmNoIG9mIHRoZSBjb25kaXRpb25hbCBiZWNhdXNlIHRoZSBkZWZhdWx0IG1pZ2h0IGNvbmNlaXZhYmx5CisgICAgICAgICMgY2hhbmdlIChzZWUgIzM4MjAxKQorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUz0iYXV0b2xhdW5jaDoiCitlbHNlCisgICAgICAgICMgVGhlIGRlZmF1bHQgb24gYWxsIG90aGVyIFVuaXggcGxhdGZvcm1zIChub3RhYmx5IExpbnV4KQorICAgICAgICAjIGlzIHRvIHVzZSBhdXRvLWxhdW5jaGluZyAtIHRoaXMgd29ya3MgYSBiaXQgZGlmZmVyZW50bHkgb24gTWFjIE9TIFgKKyAgICAgICAgIyBidXQgY29tZXMgb3V0IGJhc2ljYWxseSB0aGUgc2FtZSBpbiB0aGUgZW5kCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTPSJhdXRvbGF1bmNoOiIKK2ZpCitBQ19TVUJTVChbREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1NdKQorQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTU10sCisgIFsiJERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTIl0sCisgIFtGYWxsYmFjayBhZGRyZXNzIGZvciBzZXNzaW9uIGJ1cyBjbGllbnRzXSkKKworIyBkYXJ3aW4gbmVlZHMgdGhpcyB0byBpbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudAorQUNfQ0hFQ0tfSEVBREVSUyhjcnRfZXh0ZXJucy5oKQorQUNfQ0hFQ0tfRlVOQyhfTlNHZXRFbnZpcm9uLCBbQUNfREVGSU5FKEhBVkVfTlNHRVRFTlZJUk9OLCAxLCBbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIG5lZWRzIF9OU0dldEVudmlyb24gdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudF0pXSkKK0FIX1ZFUkJBVElNKF9EQVJXSU5fRU5WSVJPTiwKK1sKKyNpZiBkZWZpbmVkKEhBVkVfTlNHRVRFTlZJUk9OKSAmJiBkZWZpbmVkKEhBVkVfQ1JUX0VYVEVSTlNfSCkKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZW5kaWYKK10pCisKK0FDX0FSR19FTkFCTEUoW3N0YXRzXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc3RhdHNdLAorICAgIFtkaXNhYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljc10pXSwKKyAgW10sIFtlbmFibGVfc3RhdHM9eWVzXSkKK2lmIHRlc3QgIngkZW5hYmxlX3N0YXRzIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX0VOQUJMRV9TVEFUU10sIFsxXSwKKyAgICBbRGVmaW5lIHRvIGVuYWJsZSBidXMgZGFlbW9uIHVzYWdlIHN0YXRpc3RpY3NdKQorZmkKKworQUNfQVJHX0VOQUJMRShbdXNlci1zZXNzaW9uXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS11c2VyLXNlc3Npb25dLAorICAgIFtlbmFibGUgdXNlci1zZXNzaW9uIHNlbWFudGljcyBmb3Igc2Vzc2lvbiBidXMgdW5kZXIgc3lzdGVtZF0pXSwKKyAgW10sIFtlbmFibGVfdXNlcl9zZXNzaW9uPW5vXSkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0VOQUJMRV9VU0VSX1NFU1NJT05dLAorICBbdGVzdCAieCRlbmFibGVfdXNlcl9zZXNzaW9uIiA9IHh5ZXNdKQorCitBQ19DT05GSUdfRklMRVMoWworRG94eWZpbGUKK2RidXMvVmVyc2lvbgorZGJ1cy92ZXJzaW9uaW5mby5yYworZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCitidXMvc3lzdGVtLmNvbmYKK2J1cy9zZXNzaW9uLmNvbmYKK2J1cy9sZWdhY3ktY29uZmlnL3N5c3RlbS5jb25mCitidXMvbGVnYWN5LWNvbmZpZy9zZXNzaW9uLmNvbmYKK2J1cy9leGFtcGxlLXN5c3RlbS1lbmFibGUtc3RhdHMuY29uZgorYnVzL2V4YW1wbGUtc2Vzc2lvbi1kaXNhYmxlLXN0YXRzLmNvbmYKK2J1cy9tZXNzYWdlYnVzCitidXMvbWVzc2FnZWJ1cy1jb25maWcKK2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitidXMvcmMubWVzc2FnZWJ1cworYnVzL2RidXMuc2VydmljZQorYnVzL2RidXMuc29ja2V0CitidXMvc3lzdGVtZC11c2VyL2RidXMuc2VydmljZQorYnVzL3N5c3RlbWQtdXNlci9kYnVzLnNvY2tldAorTWFrZWZpbGUKK2RidXMvTWFrZWZpbGUKK2J1cy9NYWtlZmlsZQordG9vbHMvTWFrZWZpbGUKK3Rlc3QvTWFrZWZpbGUKK3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlCitkb2MvTWFrZWZpbGUKK2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbAorZG9jL2RidXMtZGFlbW9uLjEueG1sCitkb2MvZGJ1cy1sYXVuY2guMS54bWwKK2RvYy9kYnVzLW1vbml0b3IuMS54bWwKK2RvYy9kYnVzLXJ1bi1zZXNzaW9uLjEueG1sCitkb2MvZGJ1cy1zZW5kLjEueG1sCitkb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwKK2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sCitkb2MvZGJ1cy11dWlkZ2VuLjEueG1sCitkYnVzLTEucGMKK2RidXMtMS11bmluc3RhbGxlZC5wYworXSkKK0FDX09VVFBVVAorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2VjaG8gIgorICAgICAgICAgICAgICAgICAgICBELUJ1cyAkVkVSU0lPTgorICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT0KKworCXByZWZpeDogICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9QUkVGSVh9CisJZXhlY19wcmVmaXg6ICAgICAgICAgICAgICAke2V4ZWNfcHJlZml4fQorICAgICAgICBsaWJkaXI6ICAgICAgICAgICAgICAgICAgICR7RVhQQU5ERURfTElCRElSfQorICAgICAgICBsaWJleGVjZGlyOiAgICAgICAgICAgICAgICR7RVhQQU5ERURfTElCRVhFQ0RJUn0KKyAgICAgICAgYmluZGlyOiAgICAgICAgICAgICAgICAgICAke0VYUEFOREVEX0JJTkRJUn0KKyAgICAgICAgc3lzY29uZmRpcjogICAgICAgICAgICAgICAke0VYUEFOREVEX1NZU0NPTkZESVJ9CisgICAgICAgIGxvY2Fsc3RhdGVkaXI6ICAgICAgICAgICAgJHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfQorCWRhdGFkaXI6ICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9EQVRBRElSfQorCXNvdXJjZSBjb2RlIGxvY2F0aW9uOgkgICR7c3JjZGlyfQorCWNvbXBpbGVyOgkJICAke0NDfQorCWNmbGFnczoJCSAgICAgICAgICAke0NGTEFHU30KKwljcHBmbGFnczoJCSAgJHtDUFBGTEFHU30KKwljeHhmbGFnczoJCSAgJHtDWFhGTEFHU30KKwk2NC1iaXQgaW50OgkJICAke0RCVVNfSU5UNjRfVFlQRX0KKwkzMi1iaXQgaW50OgkJICAke0RCVVNfSU5UMzJfVFlQRX0KKwkxNi1iaXQgaW50OgkJICAke0RCVVNfSU5UMTZfVFlQRX0KKyAgICAgICAgRG94eWdlbjogICAgICAgICAgICAgICAgICAke0RPWFlHRU46LW5vdCBmb3VuZH0KKyAgICAgICAgeG1sdG86ICAgICAgICAgICAgICAgICAgICAke1hNTFRPOi1ub3QgZm91bmR9CisgICAgICAgIGR1Y2t0eXBlOiAgICAgICAgICAgICAgICAgJHtEVUNLVFlQRTotbm90IGZvdW5kfQorICAgICAgICB5ZWxwLWJ1aWxkOiAgICAgICAgICAgICAgICR7WUVMUF9CVUlMRDotbm90IGZvdW5kfSIKKworZWNobyAiCisgICAgICAgIFJlYnVpbGRpbmcgZ2VuZXJhdGVkIGZpbGVzOiAke1VTRV9NQUlOVEFJTkVSX01PREV9CisgICAgICAgIGdjYyBjb3ZlcmFnZSBwcm9maWxpbmc6ICAgJHtlbmFibGVfY29tcGlsZXJfY292ZXJhZ2V9CisgICAgICAgIEJ1aWxkaW5nIGVtYmVkZGVkIHRlc3RzOiAgJHtlbmFibGVfZW1iZWRkZWRfdGVzdHN9CisgICAgICAgIEJ1aWxkaW5nIG1vZHVsYXIgdGVzdHM6ICAgJHtlbmFibGVfbW9kdWxhcl90ZXN0c30KKyAgICAgICAgICAgIC0gd2l0aCBHTGliOiAgICAgICAgICAke3dpdGhfZ2xpYn0KKyAgICAgICAgSW5zdGFsbGluZyB0ZXN0czogICAgICAgICAke2VuYWJsZV9pbnN0YWxsZWRfdGVzdHN9CisgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtlbmFibGVfdmVyYm9zZV9tb2RlfQorICAgICAgICBCdWlsZGluZyBhc3NlcnRpb25zOiAgICAgICR7ZW5hYmxlX2Fzc2VydHN9CisgICAgICAgIEJ1aWxkaW5nIGNoZWNrczogICAgICAgICAgJHtlbmFibGVfY2hlY2tzfQorICAgICAgICBCdWlsZGluZyBidXMgc3RhdHMgQVBJOiAgICR7ZW5hYmxlX3N0YXRzfQorICAgICAgICBCdWlsZGluZyBTRUxpbnV4IHN1cHBvcnQ6ICR7aGF2ZV9zZWxpbnV4fQorICAgICAgICBCdWlsZGluZyBBcHBBcm1vciBzdXBwb3J0OiAke2hhdmVfYXBwYXJtb3J9CisgICAgICAgIEJ1aWxkaW5nIGlub3RpZnkgc3VwcG9ydDogJHtoYXZlX2lub3RpZnl9CisgICAgICAgIEJ1aWxkaW5nIGtxdWV1ZSBzdXBwb3J0OiAgJHtoYXZlX2txdWV1ZX0KKyAgICAgICAgQnVpbGRpbmcgc3lzdGVtZCBzdXBwb3J0OiAke2hhdmVfc3lzdGVtZH0KKyAgICAgICAgQnVpbGRpbmcgWDExIGNvZGU6ICAgICAgICAke2hhdmVfeDExfQorICAgICAgICBCdWlsZGluZyBEb3h5Z2VuIGRvY3M6ICAgICR7ZW5hYmxlX2RveHlnZW5fZG9jc30KKyAgICAgICAgQnVpbGRpbmcgRHVja3R5cGUgZG9jczogICAke2VuYWJsZV9kdWNrdHlwZV9kb2NzfQorICAgICAgICBCdWlsZGluZyBYTUwgZG9jczogICAgICAgICR7ZW5hYmxlX3htbF9kb2NzfQorICAgICAgICBCdWlsZGluZyBsYXVuY2hkIHN1cHBvcnQ6ICR7aGF2ZV9sYXVuY2hkfQorICAgICAgICBJbml0IHNjcmlwdHMgc3R5bGU6ICAgICAgICR7d2l0aF9pbml0X3NjcmlwdHN9CisgICAgICAgIEFic3RyYWN0IHNvY2tldCBuYW1lczogICAgJHthY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHN9CisgICAgICAgIFN5c3RlbSBidXMgc29ja2V0OiAgICAgICAgJHtEQlVTX1NZU1RFTV9TT0NLRVR9CisgICAgICAgIFN5c3RlbSBidXMgYWRkcmVzczogICAgICAgJHtEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTfQorICAgICAgICBTeXN0ZW0gYnVzIFBJRCBmaWxlOiAgICAgICR7REJVU19TWVNURU1fUElEX0ZJTEV9CisgICAgICAgIFNlc3Npb24gYnVzIGxpc3RlbnMgb246ICAgJHtEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTfQorICAgICAgICBTZXNzaW9uIGNsaWVudHMgY29ubmVjdCB0bzogJHtEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTU30KKyAgICAgICAgQ29uc29sZSBhdXRoIGRpcjogICAgICAgICAke0RCVVNfQ09OU09MRV9BVVRIX0RJUn0KKyAgICAgICAgQ29uc29sZSBvd25lciBmaWxlOiAgICAgICAke2hhdmVfY29uc29sZV9vd25lcl9maWxlfQorICAgICAgICBDb25zb2xlIG93bmVyIGZpbGUgcGF0aDogICR7REJVU19DT05TT0xFX09XTkVSX0ZJTEV9CisJU3lzdGVtIGJ1cyB1c2VyOiAgICAgICAgICAke0RCVVNfVVNFUn0KKwlTZXNzaW9uIGJ1cyBzZXJ2aWNlcyBkaXI6ICR7RVhQQU5ERURfREFUQURJUn0vZGJ1cy0xL3NlcnZpY2VzCisgICAgICAgICdtYWtlIGNoZWNrJyBzb2NrZXQgZGlyOiAgJHtURVNUX1NPQ0tFVF9ESVJ9CisiCitpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICBlY2hvICIgICAgICAgIGxhdW5jaGQgYWdlbnQgZGlyOiAgICAgICAgJHtMQVVOQ0hEX0FHRU5UX0RJUn0iCitmaQorZWNobworCitpZiB0ZXN0IHgkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzID0geHllczsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBhbmQgcmVuZGVycyBpdCBpbnNlY3VyZS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV9lbWJlZGRlZF90ZXN0cyA9IHh5ZXMgLWEgeCRlbmFibGVfYXNzZXJ0cyA9IHhubzsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIGVtYmVkZGVkIHRlc3RzIGJ1dCB3aXRob3V0IGFzc2VydGlvbnMgbWVhbnMgdGVzdHMgbWF5IG5vdCBwcm9wZXJseSByZXBvcnQgZmFpbHVyZXMgKHRoaXMgY29uZmlndXJhdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIGRvaW5nIHNvbWV0aGluZyBsaWtlIHByb2ZpbGluZyB0aGUgdGVzdHMpIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggY292ZXJhZ2UgcHJvZmlsaW5nIGlzIGRlZmluaXRlbHkgZm9yIGRldmVsb3BlcnMgb25seS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV92ZXJib3NlX21vZGUgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2Fzc2VydHMgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfY2hlY2tzID0geG5vOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGhvdXQgY2hlY2tzIGZvciBhcmd1bWVudHMgcGFzc2VkIHRvIHB1YmxpYyBBUEkgbWFrZXMgaXQgaGFyZGVyIHRvIGRlYnVnIGFwcHMgdXNpbmcgRC1CdXMsIGJ1dCB3aWxsIHNsaWdodGx5IGRlY3JlYXNlIEQtQnVzIGxpYnJhcnkgc2l6ZSBhbmQgX3ZlcnlfIHNsaWdodGx5IGltcHJvdmUgcGVyZm9ybWFuY2UuIgorZmkKZGlmZiAtLWdpdCBhL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbiBiL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZhZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLXVuaW5zdGFsbGVkLnBjLmluCkBAIC0wLDAgKzEsMjAgQEAKK2Fic190b3BfYnVpbGRkaXI9QGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2Rpcj1AYWJzX3RvcF9zcmNkaXJACitwcmVmaXg9CitleGVjX3ByZWZpeD0KK2JpbmRpcj1AYmluZGlyQAorc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitkYXRhcm9vdGRpcj1AZGF0YXJvb3RkaXJACitkYXRhZGlyPUBkYXRhZGlyQAorc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKK3Nlc3Npb25fYnVzX3NlcnZpY2VzX2Rpcj0ke2RhdGFkaXJ9L2RidXMtMS9zZXJ2aWNlcworc3lzdGVtX2J1c19zZXJ2aWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpbnRlcmZhY2VzX2Rpcj0ke2RhdGFkaXJ9L2RidXMtMS9pbnRlcmZhY2VzCitkYWVtb25kaXI9QGRidXNfZGFlbW9uZGlyQAorCitOYW1lOiBkYnVzCitEZXNjcmlwdGlvbjogRnJlZSBkZXNrdG9wIG1lc3NhZ2UgYnVzICh1bmluc3RhbGxlZCBjb3B5KQorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAke2Fic190b3BfYnVpbGRkaXJ9L2RidXMvbGliZGJ1cy0xLmxhCitMaWJzLnByaXZhdGU6IEBMSUJEQlVTX0xJQlNACitDZmxhZ3M6IC1JJHthYnNfdG9wX3NyY2Rpcn0gQERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTQApkaWZmIC0tZ2l0IGEvZGJ1cy0xLnBjLmluIGIvZGJ1cy0xLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2QxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEucGMuaW4KQEAgLTAsMCArMSwyMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitiaW5kaXI9QGJpbmRpckAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKK3N5c3RlbV9idXNfZGVmYXVsdF9hZGRyZXNzPUBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQAorZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAorZGF0YWRpcj1AZGF0YWRpckAKK3N5c2NvbmZkaXI9QHN5c2NvbmZkaXJACitzZXNzaW9uX2J1c19zZXJ2aWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvc2VydmljZXMKK3N5c3RlbV9idXNfc2VydmljZXNfZGlyPSR7ZGF0YWRpcn0vZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcworaW50ZXJmYWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvaW50ZXJmYWNlcworZGFlbW9uZGlyPUBkYnVzX2RhZW1vbmRpckAKKworTmFtZTogZGJ1cworRGVzY3JpcHRpb246IEZyZWUgZGVza3RvcCBtZXNzYWdlIGJ1cworVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbGRidXMtMQorTGlicy5wcml2YXRlOiBATElCREJVU19MSUJTQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vZGJ1cy0xLjAgLUkke2xpYmRpcn0vZGJ1cy0xLjAvaW5jbHVkZSBAREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1NACmRpZmYgLS1naXQgYS9kYnVzLy5naXRpZ25vcmUgYi9kYnVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5NWNiMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE2IEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5sbworKi5sYQorZGJ1cy10ZXN0CisqLmJiCisqLmJiZworKi5nY292CisqLmRhCisuZGJ1cy1rZXlyaW5ncworZGJ1cy1nbGliLWVycm9yLWVudW0uaAorKi5nY25vCisqLmdjZGEKK3ZlcnNpb25pbmZvLnJjCmRpZmYgLS1naXQgYS9kYnVzL0FuZHJvaWQubWsgYi9kYnVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDExMyBAQAorIyBTZXQgdG8gdHJ1ZSB0byB3cml0ZSBsaWJkYnVzIGxvZ3MgdG8gbG9nY2F0IGluc3RlYWQgb2Ygc3RkZXJyCisjIFNlZSBhbHNvIGNvbmZpZy5oIHRvIHR1cm4gb24gdmVyYm9zZSBsb2dzCitMT0dfVE9fQU5EUk9JRF9MT0dDQVQgOj0gdHJ1ZQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgICAgIGRidXMtYWRkcmVzcy5jIFwKKyAgICAgICAgZGJ1cy1hc3YtdXRpbC5jIFwKKyAgICAgICAgZGJ1cy1hdXRoLmMgXAorICAgICAgICBkYnVzLWJ1cy5jIFwKKyAgICAgICAgZGJ1cy1jb25uZWN0aW9uLmMgXAorICAgICAgICBkYnVzLWNyZWRlbnRpYWxzLmMgXAorICAgICAgICBkYnVzLWRhdGFzbG90LmMgXAorICAgICAgICBkYnVzLWVycm9ycy5jIFwKKyAgICAgICAgZGJ1cy1maWxlLmMgXAorICAgICAgICBkYnVzLWZpbGUtdW5peC5jIFwKKyAgICAgICAgZGJ1cy1oYXNoLmMgXAorICAgICAgICBkYnVzLWludGVybmFscy5jIFwKKyAgICAgICAgZGJ1cy1rZXlyaW5nLmMgXAorICAgICAgICBkYnVzLWxpc3QuYyBcCisgICAgICAgIGRidXMtbWFpbmxvb3AuYyBcCisgICAgICAgIGRidXMtbWFyc2hhbC1iYXNpYy5jIFwKKyAgICAgICAgZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtaGVhZGVyLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBcCisgICAgICAgIGRidXMtbWVtb3J5LmMgXAorICAgICAgICBkYnVzLW1lbXBvb2wuYyBcCisgICAgICAgIGRidXMtbWVzc2FnZS5jIFwKKyAgICAgICAgZGJ1cy1taXNjLmMgXAorICAgICAgICBkYnVzLW5vbmNlLmMgXAorICAgICAgICBkYnVzLW9iamVjdC10cmVlLmMgXAorICAgICAgICBkYnVzLXBlbmRpbmctY2FsbC5jIFwKKyAgICAgICAgZGJ1cy1waXBlLmMgXAorICAgICAgICBkYnVzLXBpcGUtdW5peC5jIFwKKyAgICAgICAgZGJ1cy1yZXNvdXJjZXMuYyBcCisgICAgICAgIGRidXMtc2VydmVyLmMgXAorICAgICAgICBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgXAorICAgICAgICBkYnVzLXNlcnZlci1sYXVuY2hkLmMgXAorICAgICAgICBkYnVzLXNlcnZlci1zb2NrZXQuYyBcCisgICAgICAgIGRidXMtc2VydmVyLXVuaXguYyBcCisgICAgICAgIGRidXMtc2hhLmMgXAorICAgICAgICBkYnVzLXNoZWxsLmMgXAorICAgICAgICBkYnVzLXNpZ25hdHVyZS5jIFwKKyAgICAgICAgZGJ1cy1zb2NrZXQtc2V0LmMgXAorICAgICAgICBkYnVzLXNvY2tldC1zZXQtZXBvbGwuYyBcCisgICAgICAgIGRidXMtc29ja2V0LXNldC1wb2xsLmMgXAorICAgICAgICBkYnVzLXNwYXduLmMgXAorICAgICAgICBkYnVzLXN0cmluZy5jIFwKKyAgICAgICAgZGJ1cy1zdHJpbmctdXRpbC5jIFwKKyAgICAgICAgZGJ1cy1zeW50YXguYyBcCisgICAgICAgIGRidXMtc3lzZGVwcy5jIFwKKyAgICAgICAgZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBcCisgICAgICAgIGRidXMtc3lzZGVwcy11bml4LmMgXAorICAgICAgICBkYnVzLXN5c2RlcHMtdXRpbC5jIFwKKyAgICAgICAgZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIFwKKyAgICAgICAgZGJ1cy10aHJlYWRzLmMgXAorICAgICAgICBkYnVzLXRpbWVvdXQuYyBcCisgICAgICAgIGRidXMtdHJhbnNwb3J0LmMgXAorICAgICAgICBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyBcCisgICAgICAgIGRidXMtdHJhbnNwb3J0LXVuaXguYyBcCisgICAgICAgIGRidXMtdXNlcmRiLmMgXAorICAgICAgICBkYnVzLXVzZXJkYi11dGlsLmMgXAorICAgICAgICBkYnVzLXV1aWRnZW4uYyBcCisgICAgICAgIGRidXMtd2F0Y2guYworCitMT0NBTF9DX0lOQ0xVREVTKz0gJChMT0NBTF9QQVRIKS8uLgorCitMT0NBTF9NT0RVTEU6PWxpYmRidXMKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvLi4KKworTE9DQUxfQ0ZMQUdTKz0gXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJLURIQVZFX01PTk9UT05JQ19DTE9DSyBcCisJLUREQlVTX01BQ0hJTkVfVVVJRF9GSUxFPVwiL2V0Yy9tYWNoaW5lLWlkXCIgXAorCS1EREJVU19TWVNURU1fQ09ORklHX0ZJTEU9XCIvZXRjL2RidXMtMS9zeXN0ZW0uY29uZlwiIFwKKwktRERCVVNfU0VTU0lPTl9DT05GSUdfRklMRT1cIi9ldGMvZGJ1cy0xL3Nlc3Npb24uY29uZlwiIFwKKwktV25vLWVtcHR5LWJvZHkgXAorCS1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgXAorCS1Xbm8tcG9pbnRlci1zaWduIFwKKwktV25vLXNpZ24tY29tcGFyZSBcCisJLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSBcCisJLVduby10eXBlLWxpbWl0cyBcCisJLVduby11bnVzZWQtcGFyYW1ldGVyCisKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworaWZlcSAoJChMT0dfVE9fQU5EUk9JRF9MT0dDQVQpLHRydWUpCitpZm5lcSAoJChUQVJHRVRfQVJDSCksIHg4Ni02NCkKK0xPQ0FMX0NGTEFHUys9IFwKKwktRERCVVNfQU5EUk9JRF9MT0cgXAorCS1EQU5EUk9JRF9NQU5BR0VEX1NPQ0tFVAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTKz0gbGliY3V0aWxzIGxpYmxvZworZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCB4ODYtNjQpCitMT0NBTF9DRkxBR1MrPSAtRF9HTlVfU09VUkNFCitlbmRpZgorCitpZmVxICgkKEJVSUxEX0VVUkVLQSksdHJ1ZSkKKyMgQ29weSB0aGUgaGVhZGVycyB0byB0aGUgYnVpbGQgc3lzcm9vdCBkaXJlY3RvcnkuCitpbmNsdWRlX2RpciA6PSAkKExPQ0FMX1BBVEgpLy4uCitpbmNsdWRlX2ZpbGVzIDo9ICQoc2hlbGwgZmluZCAkKGluY2x1ZGVfZGlyKSAtdHlwZSBmIC1uYW1lICcqLmgnKQorTE9DQUxfVE9PTENIQUlOX1BSRUJVSUxUUyA6PSBcCisJJChqb2luICQoaW5jbHVkZV9maWxlcyksXAorCSQocGF0c3Vic3QgJChpbmNsdWRlX2RpcikvJSw6dXNyL2luY2x1ZGUvJSwkKGluY2x1ZGVfZmlsZXMpKSkKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kYnVzL01ha2VmaWxlLmFtIGIvZGJ1cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2IzNDkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMyOCBAQAorCitkYnVzZGF0YWRpcj0kKGRhdGFkaXIpL2RidXMtMQorCitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX2J1aWxkZGlyKSBcCisJLUkkKHRvcF9zcmNkaXIpIFwKKwkkKERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTKSBcCisJJChTWVNURU1EX0NGTEFHUykgXAorCSQoVkFMR1JJTkRfQ0ZMQUdTKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoZGJ1c2RhdGFkaXIpL3N5c3RlbS5jb25mIlwiIFwKKwktRERCVVNfU0VTU0lPTl9DT05GSUdfRklMRT1cIiIkKGRidXNkYXRhZGlyKS9zZXNzaW9uLmNvbmYiXCIgXAorCSQoTlVMTCkKKworQU1fQ0ZMQUdTID0KKworaWYgSEFWRV9WSVNJQklMSVRZCitpZiAhREJVU19XSU4KK0FNX0NGTEFHUyArPSAkKENGTEFHX1ZJU0lCSUxJVFkpCitBTV9DUFBGTEFHUyArPSBcCisJLUREQlVTX0VYUE9SVD0nX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpJyBcCisJLUREQlVTX1BSSVZBVEVfRVhQT1JUPSdfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSknIFwKKwkkKE5VTEwpCitlbmRpZgorZW5kaWYKKworIyBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCBpbXByb3ZlIGJhY2t0cmFjZXMKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworZGJ1c2luY2x1ZGVkaXI9JChpbmNsdWRlZGlyKS9kYnVzLTEuMC9kYnVzCitkYnVzYXJjaGluY2x1ZGVkaXI9JChsaWJkaXIpL2RidXMtMS4wL2luY2x1ZGUvZGJ1cworCitsaWJfTFRMSUJSQVJJRVM9bGliZGJ1cy0xLmxhCisKKyMKKyMgRGVhbCB3aXRoIFczMiAuZGVmIGFuZCB2ZXJzaW9uLWluZm8ucmMgc3R1ZmYKKyMKK2lmIERCVVNfV0lOCisKK1NVRkZJWEVTID0gcmMKKworLnJjLm86CisJJChXSU5EUkVTKSAkPCAtbyAkQAorCitkYnVzX3JlcyA9IHZlcnNpb25pbmZvLm8KK2RidXNfcmVzX2xkZmxhZyA9IC1XbCwkKGRidXNfcmVzKQorbm9fdW5kZWZpbmVkID0gLW5vLXVuZGVmaW5lZAorZXhwb3J0X3N5bWJvbHMgPQorCitFWFRSQV9saWJkYnVzXzFfbGFfREVQRU5ERU5DSUVTID0gJChkYnVzX3JlcykKK2ludGxsaWJzID0KKworZWxzZQorZGJ1c19yZXMgPQorZGJ1c19yZXNfbGRmbGFnID0KK25vX3VuZGVmaW5lZCA9CisKK2ludGxsaWJzID0gQExUTElCSU5UTEAKKworZW5kaWYKKworCisjCisjIFBsYXRmb3JtLWRlcGVuZGVudCBzb3VyY2VzOgorIworaWYgREJVU19XSU4KK0RCVVNfTElCX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXNlcnZlci13aW4uYyAJCQlcCisJZGJ1cy1zZXJ2ZXItd2luLmgKKworaWYgREJVU19XSU5DRQord2luY2Vfc291cmNlID0gZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCitlbHNlCit3aW5jZV9zb3VyY2UgPQorZW5kaWYKKworREJVU19TSEFSRURfYXJjaF9zb3VyY2VzID0gCQkJXAorCSQod2luY2Vfc291cmNlKQkJCQlcCisJZGJ1cy1maWxlLXdpbi5jIAkJCVwKKwlkYnVzLXBpcGUtd2luLmMgCQkJXAorCWRidXMtc29ja2V0cy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtd2luLmMgCQkJXAorCWRidXMtc3lzZGVwcy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmgKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9CQkJXAorCWRidXMtc3lzZGVwcy11dGlsLXdpbi5jCQkJXAorCWRidXMtc3Bhd24td2luLmMKK2Vsc2UKKworaWYgREJVU19FTkFCTEVfTEFVTkNIRAorbGF1bmNoZF9zb3VyY2UgPSBkYnVzLXNlcnZlci1sYXVuY2hkLmggZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCitlbHNlCitsYXVuY2hkX3NvdXJjZSA9CitlbmRpZgorCitEQlVTX0xJQl9hcmNoX3NvdXJjZXMgPSAJCQlcCisJZGJ1cy11dWlkZ2VuLmMJCQkJXAorCWRidXMtdXVpZGdlbi5oCQkJCVwKKwlkYnVzLXNlcnZlci11bml4LmMgCQkJXAorCWRidXMtc2VydmVyLXVuaXguaAorCitEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMgPSAJCQlcCisJJChsYXVuY2hkX3NvdXJjZSkJCQlcCisJZGJ1cy1maWxlLXVuaXguYyAJCQlcCisJZGJ1cy1waXBlLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguaAkJCVwKKwlkYnVzLXN5c2RlcHMtcHRocmVhZC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LXVuaXguYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC11bml4LmgJCQlcCisJZGJ1cy11c2VyZGIuYwkJCQlcCisJZGJ1cy11c2VyZGIuaCAJCQkJXAorCSQoTlVMTCkKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMJCVwKKwlkYnVzLXVzZXJkYi11dGlsLmMJCQlcCisJZGJ1cy1zcGF3bi5jCitlbmRpZgorCitpZiBIQVZFX0xJTlVYX0VQT0xMCitEQlVTX1VUSUxfYXJjaF9zb3VyY2VzICs9IGRidXMtc29ja2V0LXNldC1lcG9sbC5jCitlbmRpZgorCitkYnVzaW5jbHVkZV9IRUFERVJTPQkJCQlcCisJZGJ1cy5oCQkJCQlcCisJZGJ1cy1hZGRyZXNzLmgJCQkJXAorCWRidXMtYnVzLmgJCQkJXAorCWRidXMtY29ubmVjdGlvbi5oCQkJXAorCWRidXMtZXJyb3JzLmgJCQkJXAorCWRidXMtbWFjcm9zLmgJCQkJXAorCWRidXMtbWVtb3J5LmgJCQkJXAorCWRidXMtbWVzc2FnZS5oCQkJCVwKKwlkYnVzLW1pc2MuaAkJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuaAkJCVwKKwlkYnVzLXByb3RvY29sLmgJCQkJXAorCWRidXMtc2VydmVyLmgJCQkJXAorCWRidXMtc2hhcmVkLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmgJCQlcCisJZGJ1cy1zeW50YXguaAkJCQlcCisJZGJ1cy10aHJlYWRzLmgJCQkJXAorCWRidXMtdHlwZXMuaAorCisKK25vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUz0JCQlcCisJZGJ1cy1hcmNoLWRlcHMuaAorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBhbmQgaXMgc3BlY2lmaWMgdG8gbGlicmFyeSBmdW5jdGlvbmFsaXR5CitEQlVTX0xJQl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1hZGRyZXNzLmMJCQkJXAorCWRidXMtYXV0aC5jCQkJCVwKKwlkYnVzLWF1dGguaAkJCQlcCisJZGJ1cy1idXMuYwkJCQlcCisJZGJ1cy1jb25uZWN0aW9uLmMJCQlcCisJZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLmMJCQlcCisJZGJ1cy1jcmVkZW50aWFscy5oCQkJXAorCWRidXMtZXJyb3JzLmMJCQkJXAorCWRidXMta2V5cmluZy5jCQkJCVwKKwlkYnVzLWtleXJpbmcuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5jCQkJXAorCWRidXMtbWFyc2hhbC1oZWFkZXIuaAkJCVwKKwlkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwkJCVwKKwlkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaAkJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgJCVwKKwlkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYwkJCVwKKwlkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaAkJCVwKKwlkYnVzLW1lc3NhZ2UuYwkJCQlcCisJZGJ1cy1tZXNzYWdlLWludGVybmFsLmgJCQlcCisJZGJ1cy1tZXNzYWdlLXByaXZhdGUuaAkJCVwKKwlkYnVzLW1pc2MuYwkJCQlcCisJZGJ1cy1ub25jZS5oCQkJCVwKKwlkYnVzLW5vbmNlLmMJCQkJXAorCWRidXMtb2JqZWN0LXRyZWUuYwkJCVwKKwlkYnVzLW9iamVjdC10cmVlLmgJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuYwkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCQlcCisJZGJ1cy1yZXNvdXJjZXMuYwkJCVwKKwlkYnVzLXJlc291cmNlcy5oCQkJXAorCWRidXMtc2VydmVyLmMJCQkJXAorCWRidXMtc2VydmVyLWRlYnVnLXBpcGUuYwkJXAorCWRidXMtc2VydmVyLWRlYnVnLXBpcGUuaAkJXAorCWRidXMtc2VydmVyLXByb3RlY3RlZC5oCQkJXAorCWRidXMtc2VydmVyLXNvY2tldC5jCQkJXAorCWRidXMtc2VydmVyLXNvY2tldC5oCQkJXAorCSQoREJVU19MSUJfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc2hhLmMJCQkJXAorCWRidXMtc2hhLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmMJCQlcCisJZGJ1cy1zeW50YXguYwkJCQlcCisJZGJ1cy10aW1lb3V0LmMJCQkJXAorCWRidXMtdGltZW91dC5oCQkJCVwKKwlkYnVzLXRocmVhZHMtaW50ZXJuYWwuaAkJCVwKKwlkYnVzLXRocmVhZHMuYwkJCQlcCisJZGJ1cy10cmFuc3BvcnQuYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC5oCQkJXAorCWRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oCQlcCisJZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgJCQlcCisJZGJ1cy13YXRjaC5jCQkJCVwKKwlkYnVzLXdhdGNoLmgKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgZ29lcyBpbiB0aGUgaW5zdGFsbGVkIGNsaWVudCBsaWJyYXJ5CisjIyMgQU5EIGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQgYnkgdGhlCisjIyMgZGFlbW9uIG9yIHRlc3QgcHJvZ3JhbXMgKGFsbCBzeW1ib2xzIGluIGhlcmUgc2hvdWxkCisjIyMgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCkKK0RCVVNfU0hBUkVEX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWRhdGFzbG90LmMJCQkJXAorCWRidXMtZGF0YXNsb3QuaAkJCQlcCisJZGJ1cy1maWxlLmMgICAgICAgICAgICAgICAgIFwKKwlkYnVzLWZpbGUuaCAgICAgICAgICAgICAgICAgXAorCWRidXMtaGFzaC5jCQkJCVwKKwlkYnVzLWhhc2guaAkJCQlcCisJZGJ1cy1pbnRlcm5hbHMuYwkJCVwKKwlkYnVzLWludGVybmFscy5oCQkJXAorCWRidXMtbGlzdC5jCQkJCVwKKwlkYnVzLWxpc3QuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmMJCQlcCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmgJCQlcCisJZGJ1cy1tZW1vcnkuYwkJCQlcCisJZGJ1cy1tZW1wb29sLmMJCQkJXAorCWRidXMtbWVtcG9vbC5oCQkJCVwKKwlkYnVzLXBpcGUuYyAgICAgICAgICAgICAgICAgXAorCWRidXMtcGlwZS5oICAgICAgICAgICAgICAgICBcCisJZGJ1cy1zdHJpbmcuYwkJCQlcCisJZGJ1cy1zdHJpbmcuaAkJCQlcCisJZGJ1cy1zdHJpbmctcHJpdmF0ZS5oCQkJXAorCSQoREJVU19TSEFSRURfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc3lzZGVwcy5jCQkJCVwKKwlkYnVzLXN5c2RlcHMuaAkJCQlcCisJZGJ1cy12YWxncmluZC1pbnRlcm5hbC5oCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQKKyMjIyBieSB0aGUgYnVzIGRhZW1vbiBvciB0ZXN0IGFwcHMsIGJ1dCBpcyBOT1QgaW5jbHVkZWQKKyMjIyBpbiB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgKGFsbCBzeW1ib2xzIGluIGhlcmUKKyMjIyBzaG91bGQgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCBidXQgZG9uJ3QgcmVhbGx5IG5lZWQKKyMjIyB0byBiZSB1bmxlc3MgdGhleSBtb3ZlIHRvIERCVVNfU0hBUkVEX1NPVVJDRVMgbGF0ZXIpCitEQlVTX1VUSUxfU09VUkNFUz0JCQkJXAorCWRidXMtYXN2LXV0aWwuYwkJCQlcCisJZGJ1cy1hc3YtdXRpbC5oCQkJCVwKKwlkYnVzLWF1dGgtc2NyaXB0LmMJCQlcCisJZGJ1cy1hdXRoLXNjcmlwdC5oCQkJXAorCWRidXMtYXV0aC11dGlsLmMJCQlcCisJZGJ1cy1jcmVkZW50aWFscy11dGlsLmMJCQlcCisJZGJ1cy1tYWlubG9vcC5jCQkJCVwKKwlkYnVzLW1haW5sb29wLmgJCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYwkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMJCVwKKwlkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCQkJXAorCWRidXMtbWVzc2FnZS1mYWN0b3J5LmgJCQlcCisJZGJ1cy1tZXNzYWdlLXV0aWwuYwkJCVwKKwlkYnVzLXNoZWxsLmMJCQkJXAorCWRidXMtc2hlbGwuaAkJCQlcCisJJChEQlVTX1VUSUxfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc29ja2V0LXNldC5oCQkJXAorCWRidXMtc29ja2V0LXNldC5jCQkJXAorCWRidXMtc29ja2V0LXNldC1wb2xsLmMJCQlcCisJZGJ1cy1zcGF3bi5oCQkJCVwKKwlkYnVzLXN0cmluZy11dGlsLmMJCQlcCisJZGJ1cy1zeXNkZXBzLXV0aWwuYwkJCVwKKwlkYnVzLXRlc3QuYwkJCQlcCisJZGJ1cy10ZXN0LmgKKworbGliZGJ1c18xX2xhX1NPVVJDRVM9CQkJCVwKKwkkKERCVVNfTElCX1NPVVJDRVMpCQkJXAorCSQoREJVU19TSEFSRURfU09VUkNFUykKKworbGliZGJ1c19pbnRlcm5hbF9sYV9TT1VSQ0VTPQkJCVwKKwkkKERCVVNfVVRJTF9TT1VSQ0VTKQorCitCVUlMVF9TT1VSQ0VTPSQobm9kaXN0X2RidXNhcmNoaW5jbHVkZV9IRUFERVJTKQorRVhUUkFfRElTVD1kYnVzLWFyY2gtZGVwcy5oLmluCisKK25vaW5zdF9MVExJQlJBUklFUz1saWJkYnVzLWludGVybmFsLmxhCisKK2xpYmRidXNfMV9sYV9DUFBGTEFHUyA9IFwKKwkkKEFNX0NQUEZMQUdTKSBcCisJLURkYnVzXzFfRVhQT1JUUyBcCisJJChOVUxMKQorCitpZiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUCitTWU1CT0xfRVhQT1JUX0xERkxBR1M9LVdsLC0tdmVyc2lvbi1zY3JpcHQ9VmVyc2lvbgorZWxzZQorU1lNQk9MX0VYUE9SVF9MREZMQUdTPQorZW5kaWYKKworbGliZGJ1c18xX2xhX0xJQkFERD0gJChMSUJEQlVTX0xJQlMpCitsaWJkYnVzXzFfbGFfTERGTEFHUyA9IFwKKwkkKEFNX0xERkxBR1MpIFwKKwktdmVyc2lvbi1pbmZvICQoTFRfQ1VSUkVOVCk6JChMVF9SRVZJU0lPTik6JChMVF9BR0UpIFwKKwkkKFNZTUJPTF9FWFBPUlRfTERGTEFHUykgXAorCS1uby11bmRlZmluZWQgXAorCSQoTlVMTCkKKworbGliZGJ1c19pbnRlcm5hbF9sYV9MSUJBREQ9JChMSUJEQlVTX0xJQlMpIGxpYmRidXMtMS5sYQorCitpZiBEQlVTX1dJTgorIyBUaGlzIG11c3QgYmUgYSBzZXBhcmF0ZSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvdGhlcndpc2UgbGlidG9vbCBub3RpY2VzCisjIHRoYXQgbGliZGJ1cy0xIG1pZ2h0IGNvbnRhaW4gQysrLCBsaW5rcyBpdCB3aXRoIGcrKyBhbmQgbGlua3MgaW4gbGlic3RkYysrLAorIyBldmVuIG9uIFVuaXggd2hlcmUgaW4gZmFjdCBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IEMrKy4gRm9yIFdpbmRvd3MsIHdoZXJlCisjIHRoaXMgY29kZSBpcyB1c2VkLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGxpYnN0ZGMrKy4KK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJkYnVzLWluaXQtd2luLmxhCitsaWJkYnVzX2luaXRfd2luX2xhX1NPVVJDRVMgPSBkYnVzLWluaXQtd2luLmNwcAorbGliZGJ1c18xX2xhX0xJQkFERCArPSBsaWJkYnVzLWluaXQtd2luLmxhCitlbmRpZgorCitub2luc3RfUFJPR1JBTVMgPQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworIyBXZSBjYW4ndCBhY3R1YWxseSBydW4gdGhpcyB0aWwgd2UndmUgcmVhY2hlZCB0ZXN0Lworbm9pbnN0X1BST0dSQU1TICs9IHRlc3QtZGJ1cworZW5kaWYKKwordGVzdF9kYnVzX1NPVVJDRVM9CQkJCVwKKwlkYnVzLXRlc3QtbWFpbi5jCisKK3Rlc3RfZGJ1c19MREFERCA9IGxpYmRidXMtaW50ZXJuYWwubGEKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCitjbGVhbi1sb2NhbDoKKwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgLmxpYnMvKi5kYSAubGlicy8qLmJiZyB8fCB0cnVlCmRpZmYgLS1naXQgYS9kYnVzL05PVElDRSBiL2RidXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL05PVElDRQpAQCAtMCwwICsxLDU1MSBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlCit2LiAyLjEKKworVGhpcyBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpIGFwcGxpZXMgdG8gYW55IG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcCAodGhlICJPcmlnaW5hbCBXb3JrIikgd2hvc2Ugb3duZXIgKHRoZSAiTGljZW5zb3IiKSBoYXMgcGxhY2VkIHRoZSBmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIE9yaWdpbmFsIFdvcms6CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKworMSkgR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEKK3dvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZQorbGljZW5zZSB0byBkbyB0aGUgZm9sbG93aW5nOgorCithKSB0byByZXByb2R1Y2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gY29waWVzOworCitiKSB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MgKCJEZXJpdmF0aXZlIFdvcmtzIikgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yazsKKworYykgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdG8gdGhlIHB1YmxpYzsKKworZCkgdG8gcGVyZm9ybSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseTsgYW5kCisKK2UpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisKKzIpIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSwgdW5kZXIKK3BhdGVudCBjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUgZW1ib2RpZWQgaW4KK3RoZSBPcmlnaW5hbCBXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IsIHRvIG1ha2UsIHVzZSwgc2VsbCBhbmQKK29mZmVyIGZvciBzYWxlIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzLgorCiszKSBHcmFudCBvZiBTb3VyY2UgQ29kZSBMaWNlbnNlLiBUaGUgdGVybSAiU291cmNlIENvZGUiIG1lYW5zIHRoZQorcHJlZmVycmVkIGZvcm0gb2YgdGhlIE9yaWdpbmFsIFdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0IGFuZAorYWxsIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgaG93IHRvIG1vZGlmeSB0aGUgT3JpZ2luYWwKK1dvcmsuIExpY2Vuc29yIGhlcmVieSBhZ3JlZXMgdG8gcHJvdmlkZSBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKK1NvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFsb25nIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBPcmlnaW5hbAorV29yayB0aGF0IExpY2Vuc29yIGRpc3RyaWJ1dGVzLiBMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gc2F0aXNmeQordGhpcyBvYmxpZ2F0aW9uIGJ5IHBsYWNpbmcgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlCitpbiBhbiBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBwZXJtaXQKK2luZXhwZW5zaXZlIGFuZCBjb252ZW5pZW50IGFjY2VzcyBieSBZb3UgZm9yIGFzIGxvbmcgYXMgTGljZW5zb3IKK2NvbnRpbnVlcyB0byBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBXb3JrLCBhbmQgYnkgcHVibGlzaGluZyB0aGUKK2FkZHJlc3Mgb2YgdGhhdCBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IGluIGEgbm90aWNlIGltbWVkaWF0ZWx5Citmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgdGhhdCBhcHBsaWVzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLgorCis0KSBFeGNsdXNpb25zIEZyb20gTGljZW5zZSBHcmFudC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgTGljZW5zb3IsIG5vcgordGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgdG8gdGhlIE9yaWdpbmFsIFdvcmssIG5vciBhbnkgb2YgdGhlaXIKK3RyYWRlbWFya3Mgb3Igc2VydmljZSBtYXJrcywgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCitwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBPcmlnaW5hbCBXb3JrIHdpdGhvdXQgZXhwcmVzcyBwcmlvciB3cml0dGVuCitwZXJtaXNzaW9uIG9mIHRoZSBMaWNlbnNvci4gTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIHRvCitncmFudCBhbnkgcmlnaHRzIHRvIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIHBhdGVudHMsIHRyYWRlIHNlY3JldHMgb3IKK2FueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgTGljZW5zb3IgZXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2hlcmVpbi4gTm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCB0byBtYWtlLCB1c2UsIHNlbGwgb3Igb2ZmZXIgdG8KK3NlbGwgZW1ib2RpbWVudHMgb2YgYW55IHBhdGVudCBjbGFpbXMgb3RoZXIgdGhhbiB0aGUgbGljZW5zZWQgY2xhaW1zCitkZWZpbmVkIGluIFNlY3Rpb24gMi4gTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB0aGUgdHJhZGVtYXJrcyBvZgorTGljZW5zb3IgZXZlbiBpZiBzdWNoIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiB0aGUgT3JpZ2luYWwgV29yay4gTm90aGluZworaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGludGVycHJldGVkIHRvIHByb2hpYml0IExpY2Vuc29yIGZyb20KK2xpY2Vuc2luZyB1bmRlciBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aGlzIExpY2Vuc2UgYW55IE9yaWdpbmFsIFdvcmsKK3RoYXQgTGljZW5zb3Igb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYSByaWdodCB0byBsaWNlbnNlLgorCis1KSBUaGlzIHNlY3Rpb24gaW50ZW50aW9uYWxseSBvbWl0dGVkLgorCis2KSBBdHRyaWJ1dGlvbiBSaWdodHMuIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBDb2RlIG9mIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsKK25vdGljZXMgZnJvbSB0aGUgU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmssIGFzIHdlbGwgYXMgYW55Citub3RpY2VzIG9mIGxpY2Vuc2luZyBhbmQgYW55IGRlc2NyaXB0aXZlIHRleHQgaWRlbnRpZmllZCB0aGVyZWluIGFzIGFuCisiQXR0cmlidXRpb24gTm90aWNlLiIgWW91IG11c3QgY2F1c2UgdGhlIFNvdXJjZSBDb2RlIGZvciBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlIHRvIGNhcnJ5IGEgcHJvbWluZW50IEF0dHJpYnV0aW9uCitOb3RpY2UgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSByZWNpcGllbnRzIHRoYXQgWW91IGhhdmUKK21vZGlmaWVkIHRoZSBPcmlnaW5hbCBXb3JrLgorCis3KSBXYXJyYW50eSBvZiBQcm92ZW5hbmNlIGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMaWNlbnNvcgord2FycmFudHMgdGhhdCB0aGUgY29weXJpZ2h0IGluIGFuZCB0byB0aGUgT3JpZ2luYWwgV29yayBhbmQgdGhlIHBhdGVudAorcmlnaHRzIGdyYW50ZWQgaGVyZWluIGJ5IExpY2Vuc29yIGFyZSBvd25lZCBieSB0aGUgTGljZW5zb3Igb3IgYXJlCitzdWJsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRoZSBwZXJtaXNzaW9uCitvZiB0aGUgY29udHJpYnV0b3Iocykgb2YgdGhvc2UgY29weXJpZ2h0cyBhbmQgcGF0ZW50IHJpZ2h0cy4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIHRoZSBpbW1lZGlhdGVseSBwcm9jZWVkaW5nIHNlbnRlbmNlLCB0aGUgT3JpZ2luYWwKK1dvcmsgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJBUyBJUyIgQkFTSVMgYW5kIFdJVEhPVVQKK1dBUlJBTlRZLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwKK3RoZSB3YXJyYW50aWVzIG9mIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBPRiBUSEUgT1JJR0lOQUwKK1dPUksgSVMgV0lUSCBZT1UuIFRoaXMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBjb25zdGl0dXRlcyBhbiBlc3NlbnRpYWwKK3BhcnQgb2YgdGhpcyBMaWNlbnNlLiBObyBsaWNlbnNlIHRvIE9yaWdpbmFsIFdvcmsgaXMgZ3JhbnRlZCBoZXJldW5kZXIKK2V4Y2VwdCB1bmRlciB0aGlzIGRpc2NsYWltZXIuCisKKzgpIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFuZCB1bmRlciBubyBsZWdhbAordGhlb3J5LCB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yCitvdGhlcndpc2UsIHNoYWxsIHRoZSBMaWNlbnNvciBiZSBsaWFibGUgdG8gYW55IHBlcnNvbiBmb3IgYW55IGRpcmVjdCwKK2luZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55CitjaGFyYWN0ZXIgYXJpc2luZyBhcyBhIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHVzZSBvZiB0aGUKK09yaWdpbmFsIFdvcmsgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGRhbWFnZXMgZm9yIGxvc3Mgb2YKK2dvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kCithbGwgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3Nlcy4gVGhpcyBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eQorc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZworZnJvbSBMaWNlbnNvcidzIG5lZ2xpZ2VuY2UgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaAorbGltaXRhdGlvbi4gU29tZSBqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yCitsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzbyB0aGlzIGV4Y2x1c2lvbgorYW5kIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuCisKKzkpIEFjY2VwdGFuY2UgYW5kIFRlcm1pbmF0aW9uLiBJZiBZb3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitPcmlnaW5hbCBXb3JrIG9yIGEgRGVyaXZhdGl2ZSBXb3JrLCBZb3UgbXVzdCBtYWtlIGEgcmVhc29uYWJsZSBlZmZvcnQKK3VuZGVyIHRoZSBjaXJjdW1zdGFuY2VzIHRvIG9idGFpbiB0aGUgZXhwcmVzcyBhc3NlbnQgb2YgcmVjaXBpZW50cyB0bwordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gTm90aGluZyBlbHNlIGJ1dCB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIKK3dyaXR0ZW4gYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgZ3JhbnRzIFlvdSBwZXJtaXNzaW9uIHRvCitjcmVhdGUgRGVyaXZhdGl2ZSBXb3JrcyBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrIG9yIHRvIGV4ZXJjaXNlCithbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkIGluIFNlY3Rpb24gMSBoZXJlaW4sIGFuZCBhbnkgYXR0ZW1wdCB0byBkbworc28gZXhjZXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIgd3JpdHRlbgorYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnkKK1UuUy4gY29weXJpZ2h0IGxhdywgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBieQoraW50ZXJuYXRpb25hbCB0cmVhdHkuIFRoZXJlZm9yZSwgYnkgZXhlcmNpc2luZyBhbnkgb2YgdGhlIHJpZ2h0cworZ3JhbnRlZCB0byBZb3UgaW4gU2VjdGlvbiAxIGhlcmVpbiwgWW91IGluZGljYXRlIFlvdXIgYWNjZXB0YW5jZSBvZgordGhpcyBMaWNlbnNlIGFuZCBhbGwgb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisxMCkgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUKK2F1dG9tYXRpY2FsbHkgYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQKK3RvIFlvdSBieSB0aGlzIExpY2Vuc2UgYXMgb2YgdGhlIGRhdGUgWW91IGNvbW1lbmNlIGFuIGFjdGlvbiwKK2luY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSwgYWdhaW5zdCBMaWNlbnNvciBvciBhbnkKK2xpY2Vuc2VlIGFsbGVnaW5nIHRoYXQgdGhlIE9yaWdpbmFsIFdvcmsgaW5mcmluZ2VzIGEgcGF0ZW50LiBUaGlzCit0ZXJtaW5hdGlvbiBwcm92aXNpb24gc2hhbGwgbm90IGFwcGx5IGZvciBhbiBhY3Rpb24gYWxsZWdpbmcgcGF0ZW50CitpbmZyaW5nZW1lbnQgYnkgY29tYmluYXRpb25zIG9mIHRoZSBPcmlnaW5hbCBXb3JrIHdpdGggb3RoZXIgc29mdHdhcmUKK29yIGhhcmR3YXJlLgorCisxMSkgSnVyaXNkaWN0aW9uLCBWZW51ZSBhbmQgR292ZXJuaW5nIExhdy4gQW55IGFjdGlvbiBvciBzdWl0IHJlbGF0aW5nCit0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUgY291cnRzIG9mIGEganVyaXNkaWN0aW9uCit3aGVyZWluIHRoZSBMaWNlbnNvciByZXNpZGVzIG9yIGluIHdoaWNoIExpY2Vuc29yIGNvbmR1Y3RzIGl0cyBwcmltYXJ5CitidXNpbmVzcywgYW5kIHVuZGVyIHRoZSBsYXdzIG9mIHRoYXQganVyaXNkaWN0aW9uIGV4Y2x1ZGluZyBpdHMKK2NvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zCitDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcworZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgdXNlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIG91dHNpZGUgdGhlIHNjb3BlIG9mCit0aGlzIExpY2Vuc2Ugb3IgYWZ0ZXIgaXRzIHRlcm1pbmF0aW9uIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlCityZXF1aXJlbWVudHMgYW5kIHBlbmFsdGllcyBvZiB0aGUgVS5TLiBDb3B5cmlnaHQgQWN0LCAxNyBVLlMuQy4gw4LCpyAxMDEKK2V0IHNlcS4sIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgaW50ZXJuYXRpb25hbAordHJlYXR5LiBUaGlzIHNlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMikgQXR0b3JuZXlzIEZlZXMuIEluIGFueSBhY3Rpb24gdG8gZW5mb3JjZSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCitvciBzZWVraW5nIGRhbWFnZXMgcmVsYXRpbmcgdGhlcmV0bywgdGhlIHByZXZhaWxpbmcgcGFydHkgc2hhbGwgYmUKK2VudGl0bGVkIHRvIHJlY292ZXIgaXRzIGNvc3RzIGFuZCBleHBlbnNlcywgaW5jbHVkaW5nLCB3aXRob3V0CitsaW1pdGF0aW9uLCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgY29zdHMgaW5jdXJyZWQgaW4KK2Nvbm5lY3Rpb24gd2l0aCBzdWNoIGFjdGlvbiwgaW5jbHVkaW5nIGFueSBhcHBlYWwgb2Ygc3VjaCBhY3Rpb24uIFRoaXMKK3NlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMykgTWlzY2VsbGFuZW91cy4gVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudAorY29uY2VybmluZyB0aGUgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZQoraXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvCit0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLgorCisxNCkgRGVmaW5pdGlvbiBvZiAiWW91IiBpbiBUaGlzIExpY2Vuc2UuICJZb3UiIHRocm91Z2hvdXQgdGhpcworTGljZW5zZSwgd2hldGhlciBpbiB1cHBlciBvciBsb3dlciBjYXNlLCBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEKK2xlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUKK3Rlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eQordGhhdCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aAoreW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwKK2RpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKK2VudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5CitwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbAorb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisxNSkgUmlnaHQgdG8gVXNlLiBZb3UgbWF5IHVzZSB0aGUgT3JpZ2luYWwgV29yayBpbiBhbGwgd2F5cyBub3QKK290aGVyd2lzZSByZXN0cmljdGVkIG9yIGNvbmRpdGlvbmVkIGJ5IHRoaXMgTGljZW5zZSBvciBieSBsYXcsIGFuZAorTGljZW5zb3IgcHJvbWlzZXMgbm90IHRvIGludGVyZmVyZSB3aXRoIG9yIGJlIHJlc3BvbnNpYmxlIGZvciBzdWNoCit1c2VzIGJ5IFlvdS4KKworVGhpcyBsaWNlbnNlIGlzIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IExhd3JlbmNlIEUuIFJvc2VuLiBBbGwgcmlnaHRzCityZXNlcnZlZC4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoaXMKK2xpY2Vuc2Ugd2l0aG91dCBtb2RpZmljYXRpb24uIFRoaXMgbGljZW5zZSBtYXkgbm90IGJlIG1vZGlmaWVkIHdpdGhvdXQKK3RoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBpdHMgY29weXJpZ2h0IG93bmVyLgorCisKKy0tIAorRU5EIE9GIEFDQURFTUlDIEZSRUUgTElDRU5TRS4gVGhlIGZvbGxvd2luZyBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgZXNzZW50aWFsIAorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIChBRkwpIHZlcnNpb24gMS4wIGFuZCBvdGhlciAKK29wZW4gc291cmNlIGxpY2Vuc2VzOgorCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIGlzIHNpbWlsYXIgdG8gdGhlIEJTRCwgTUlULCBVb0kvTkNTQSBhbmQgQXBhY2hlIAorbGljZW5zZXMgaW4gbWFueSByZXNwZWN0cyBidXQgaXQgaXMgaW50ZW5kZWQgdG8gc29sdmUgYSBmZXcgcHJvYmxlbXMgd2l0aCAKK3Rob3NlIGxpY2Vuc2VzLgorICAgIAorKiBUaGUgQUZMIGlzIHdyaXR0ZW4gc28gYXMgdG8gbWFrZSBpdCBjbGVhciB3aGF0IHNvZnR3YXJlIGlzIGJlaW5nIAorbGljZW5zZWQgKGJ5IHRoZSBpbmNsdXNpb24gb2YgYSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIAoraW4gdGhlIHNvZnR3YXJlKS4gVGhpcyB3YXksIHRoZSBsaWNlbnNlIGZ1bmN0aW9ucyBiZXR0ZXIgdGhhbiBhIHRlbXBsYXRlIAorbGljZW5zZS4gVGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBhcHBseSB0byB1bmlkZW50aWZpZWQgc29mdHdhcmUuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBjb3B5cmlnaHQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNEIAorYW5kIEFwYWNoZSBsaWNlbnNlcyBhcmUgdmFndWUgYW5kIGluY29tcGxldGUgaW4gdGhhdCByZXNwZWN0LgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgcGF0ZW50IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCwgTUlULCAKK1VvSS9OQ1NBIGFuZCBBcGFjaGUgbGljZW5zZXMgcmVseSBvbiBhbiBpbXBsaWVkIHBhdGVudCBsaWNlbnNlIGFuZCBjb250YWluIAorbm8gZXhwbGljaXQgcGF0ZW50IGdyYW50LgorICAgIAorKiBUaGUgQUZMIG1ha2VzIGl0IGNsZWFyIHRoYXQgbm8gdHJhZGVtYXJrIHJpZ2h0cyBhcmUgZ3JhbnRlZCB0byB0aGUgCitsaWNlbnNvcidzIHRyYWRlbWFya3MuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBzdWNoIGEgcHJvdmlzaW9uLCBidXQgdGhlIAorQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4KKyAgICAKKyogVGhlIEFGTCBpbmNsdWRlcyB0aGUgd2FycmFudHkgYnkgdGhlIGxpY2Vuc29yIHRoYXQgaXQgZWl0aGVyIG93bnMgdGhlIAorY29weXJpZ2h0IG9yIHRoYXQgaXQgaXMgZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSB1bmRlciBhIGxpY2Vuc2UuIE5vbmUgb2YgCit0aGUgb3RoZXIgbGljZW5zZXMgY29udGFpbiB0aGF0IHdhcnJhbnR5LiBBbGwgb3RoZXIgd2FycmFudGllcyBhcmUgZGlzY2xhaW1lZCwgCithcyBpcyB0aGUgY2FzZSBmb3IgdGhlIG90aGVyIGxpY2Vuc2VzLgorCisqIFRoZSBBRkwgaXMgaXRzZWxmIGNvcHlyaWdodGVkICh3aXRoIHRoZSByaWdodCBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgCit3aXRob3V0IG1vZGlmaWNhdGlvbikuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvd25lciBvZiB0aGUgY29weXJpZ2h0IHRvIHRoZSAKK2xpY2Vuc2Ugd2lsbCBjb250cm9sIGNoYW5nZXMuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBhIGNvcHlyaWdodCBub3RpY2UsIAorYnV0IHRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LiAKKy0tCitTVEFSVCBPRiBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorLS0KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kYnVzL1ZlcnNpb24uaW4gYi9kYnVzL1ZlcnNpb24uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjYzM2NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvVmVyc2lvbi5pbgpAQCAtMCwwICsxLDEwIEBACitMSUJEQlVTXzFfQFNPVkVSU0lPTkAgeworICBnbG9iYWw6CisgICAgZGJ1c18qOworICBsb2NhbDoKKyAgICAqOworfTsKK0xJQkRCVVNfUFJJVkFURV9AREJVU19WRVJTSU9OQCB7CisgIGdsb2JhbDoKKyAgICBfZGJ1c18qOworfTsKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hZGRyZXNzLmMgYi9kYnVzL2RidXMtYWRkcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2ZiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYWRkcmVzcy5jCkBAIC0wLDAgKzEsODI4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYWRkcmVzcy5jICBTZXJ2ZXIgYWRkcmVzcyBwYXJzZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtYWRkcmVzcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNBZGRyZXNzSW50ZXJuYWxzIEFkZHJlc3MgcGFyc2luZworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBwYXJzaW5nIGFkZHJlc3NlcyBvZiBELUJ1cyBzZXJ2ZXJzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c0FkZHJlc3NFbnRyeSAKKyAqLworc3RydWN0IERCdXNBZGRyZXNzRW50cnkKK3sKKyAgREJ1c1N0cmluZyBtZXRob2Q7IC8qKjwgVGhlIGFkZHJlc3MgdHlwZSAodW5peCwgdGNwLCBldGMuKSAqLworCisgIERCdXNMaXN0ICprZXlzOyAgICAvKio8IExpc3Qgb2Yga2V5cyAqLworICBEQnVzTGlzdCAqdmFsdWVzOyAgLyoqPCBMaXN0IG9mIHZhbHVlcyAqLworfTsKKworCisvKioKKyAqCisgKiBTZXRzICNEQlVTX0VSUk9SX0JBRF9BRERSRVNTLgorICogSWYgYWRkcmVzc19wcm9ibGVtX3R5cGUgYW5kIGFkZHJlc3NfcHJvYmxlbV9maWVsZCBhcmUgbm90ICNOVUxMLAorICogc2V0cyBhbiBlcnJvciBtZXNzYWdlIGFib3V0IGhvdyB0aGUgZmllbGQgaXMgbm8gZ29vZC4gT3RoZXJ3aXNlLCBzZXRzCisgKiBhZGRyZXNzX3Byb2JsZW1fb3RoZXIgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgKiAKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgdG8gc2V0CisgKiBAcGFyYW0gYWRkcmVzc19wcm9ibGVtX3R5cGUgdGhlIGFkZHJlc3MgdHlwZSBvZiB0aGUgYmFkIGFkZHJlc3Mgb3IgI05VTEwKKyAqIEBwYXJhbSBhZGRyZXNzX3Byb2JsZW1fZmllbGQgdGhlIG1pc3NpbmcgZmllbGQgb2YgdGhlIGJhZCBhZGRyZXNzIG9yICNOVUxMCisgKiBAcGFyYW0gYWRkcmVzc19wcm9ibGVtX290aGVyIGFueSBvdGhlciBlcnJvciBtZXNzYWdlIG9yICNOVUxMCisgKi8KK3ZvaWQKK19kYnVzX3NldF9iYWRfYWRkcmVzcyAoREJ1c0Vycm9yICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3NfcHJvYmxlbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3Byb2JsZW1fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3NfcHJvYmxlbV9vdGhlcikKK3sKKyAgaWYgKGFkZHJlc3NfcHJvYmxlbV90eXBlICE9IE5VTEwpCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGFkZHJlc3Mgb2YgdHlwZSAlcyB3YXMgbWlzc2luZyBhcmd1bWVudCAlcyIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfcHJvYmxlbV90eXBlLCBhZGRyZXNzX3Byb2JsZW1fZmllbGQpOworICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIHNlcnZlciBhZGRyZXNzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfcHJvYmxlbV9vdGhlcik7Cit9CisKKy8qKgorICogI1RSVUUgaWYgdGhlIGJ5dGUgbmVlZCBub3QgYmUgZXNjYXBlZCB3aGVuIGZvdW5kIGluIGEgZGJ1cyBhZGRyZXNzLgorICogQWxsIG90aGVyIGJ5dGVzIGFyZSByZXF1aXJlZCB0byBiZSBlc2NhcGVkIGluIGEgdmFsaWQgYWRkcmVzcy4KKyAqLworI2RlZmluZSBfREJVU19BRERSRVNTX09QVElPTkFMTFlfRVNDQVBFRF9CWVRFKGIpICAgICAgICBcCisgICAgICAgICAoKChiKSA+PSAnYScgJiYgKGIpIDw9ICd6JykgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKGIpID49ICdBJyAmJiAoYikgPD0gJ1onKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoYikgPj0gJzAnICYmIChiKSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICctJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJ18nIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnLycgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICdcXCcgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJyonIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICcuJykKKworLyoqCisgKiBBcHBlbmRzIGFuIGVzY2FwZWQgdmVyc2lvbiBvZiBvbmUgc3RyaW5nIHRvIGFub3RoZXIgc3RyaW5nLAorICogdXNpbmcgdGhlIEQtQnVzIGFkZHJlc3MgZXNjYXBpbmcgbWVjaGFuaXNtCisgKgorICogQHBhcmFtIGVzY2FwZWQgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSB1bmVzY2FwZWQgdGhlIHN0cmluZyB0byBlc2NhcGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKERCdXNTdHJpbmcgICAgICAgKmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1bmVzY2FwZWQpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgZGJ1c19ib29sX3QgcmV0OworICBpbnQgb3JpZ19sZW47CisKKyAgcmV0ID0gRkFMU0U7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZXNjYXBlZCk7CisgIHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVuZXNjYXBlZCk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW5lc2NhcGVkKTsKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmIChfREJVU19BRERSRVNTX09QVElPTkFMTFlfRVNDQVBFRF9CWVRFICgqcCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZXNjYXBlZCwgKnApKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChlc2NhcGVkLCAnJScpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGVfYXNfaGV4IChlc2NhcGVkLCAqcCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK3A7CisgICAgfQorCisgIHJldCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXQpCisgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGVzY2FwZWQsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgKi8KKworc3RhdGljIHZvaWQKK2RidXNfYWRkcmVzc19lbnRyeV9mcmVlIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudHJ5LT5tZXRob2QpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPmtleXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+a2V5cywgbGluayk7CisgICAgfQorICBfZGJ1c19saXN0X2NsZWFyICgmZW50cnktPmtleXMpOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZlbnRyeS0+dmFsdWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZW50cnktPnZhbHVlcywgbGluayk7CisgICAgfQorICBfZGJ1c19saXN0X2NsZWFyICgmZW50cnktPnZhbHVlcyk7CisgIAorICBkYnVzX2ZyZWUgKGVudHJ5KTsKK30KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0FkZHJlc3MgQWRkcmVzcyBwYXJzaW5nCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgYWRkcmVzc2VzIG9mIEQtQnVzIHNlcnZlcnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIGEgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBhZGRyZXNzIGVudHJpZXMuCisgKgorICogQHBhcmFtIGVudHJpZXMgdGhlIGFycmF5LgorICovCit2b2lkCitkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChEQnVzQWRkcmVzc0VudHJ5ICoqZW50cmllcykKK3sKKyAgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBlbnRyaWVzW2ldICE9IE5VTEw7IGkrKykKKyAgICBkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSAoZW50cmllc1tpXSk7CisgIGRidXNfZnJlZSAoZW50cmllcyk7Cit9CisKK3N0YXRpYyBEQnVzQWRkcmVzc0VudHJ5ICoKK2NyZWF0ZV9lbnRyeSAodm9pZCkKK3sKKyAgREJ1c0FkZHJlc3NFbnRyeSAqZW50cnk7CisKKyAgZW50cnkgPSBkYnVzX25ldzAgKERCdXNBZGRyZXNzRW50cnksIDEpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbnRyeS0+bWV0aG9kKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGVudHJ5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gZW50cnk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbWV0aG9kIHN0cmluZyBvZiBhbiBhZGRyZXNzIGVudHJ5LiAgRm9yIGV4YW1wbGUsIGdpdmVuCisgKiB0aGUgYWRkcmVzcyBlbnRyeSAidGNwOmhvc3Q9ZXhhbXBsZS5jb20iIGl0IHdvdWxkIHJldHVybiB0aGUgc3RyaW5nCisgKiAidGNwIgorICoKKyAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkuCisgKiBAcmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtZXRob2QuIFRoaXMgc3RyaW5nCisgKiBtdXN0IG5vdCBiZSBmcmVlZC4KKyAqLworY29uc3QgY2hhciAqCitkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnkpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZlbnRyeS0+bWV0aG9kKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgdmFsdWUgZnJvbSBhIGtleSBvZiBhbiBlbnRyeS4gRm9yIGV4YW1wbGUsCisgKiBnaXZlbiB0aGUgYWRkcmVzcyAidGNwOmhvc3Q9ZXhhbXBsZS5jb20scG9ydD04MDczIiBpZiB5b3UgYXNrZWQKKyAqIGZvciB0aGUga2V5ICJob3N0IiB5b3Ugd291bGQgZ2V0IHRoZSB2YWx1ZSAiZXhhbXBsZS5jb20iCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFscmVhZHkgdW5lc2NhcGVkLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5LgorICogQHBhcmFtIGtleSB0aGUga2V5LgorICogQHJldHVybnMgdGhlIGtleSB2YWx1ZS4gVGhpcyBzdHJpbmcgbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IGNoYXIgKgorZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisJCQkgICAgICBjb25zdCBjaGFyICAgICAgICprZXkpCit7CisgIERCdXNMaXN0ICp2YWx1ZXMsICprZXlzOworCisgIGtleXMgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPmtleXMpOworICB2YWx1ZXMgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPnZhbHVlcyk7CisKKyAgd2hpbGUgKGtleXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlcyAhPSBOVUxMKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoa2V5cy0+ZGF0YSwga2V5KSkKKyAgICAgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodmFsdWVzLT5kYXRhKTsKKworICAgICAga2V5cyA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT5rZXlzLCBrZXlzKTsKKyAgICAgIHZhbHVlcyA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT52YWx1ZXMsIHZhbHVlcyk7CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX3VuZXNjYXBlZF92YWx1ZSAoREJ1c1N0cmluZyAgICAgICAqdW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVzY2FwZWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlc2NhcGVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldDsKKyAgCisgIHJldCA9IEZBTFNFOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGVzY2FwZWQpICsgZXNjYXBlZF9zdGFydDsKKyAgZW5kID0gcCArIGVzY2FwZWRfbGVuOworICB3aGlsZSAocCAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX0FERFJFU1NfT1BUSU9OQUxMWV9FU0NBUEVEX0JZVEUgKCpwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh1bmVzY2FwZWQsICpwKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlIGlmICgqcCA9PSAnJScpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFZmZpY2llbmN5IGlzIGtpbmcgKi8KKyAgICAgICAgICBjaGFyIGJ1ZlszXTsKKyAgICAgICAgICBEQnVzU3RyaW5nIGhleDsKKyAgICAgICAgICBpbnQgaGV4X2VuZDsKKyAgICAgICAgICAKKyAgICAgICAgICArK3A7CisKKyAgICAgICAgICBpZiAoKHAgKyAyKSA+IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIHBlcmNlbnQgY2hhcmFjdGVyIHdhcyBub3QgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICBidWZbMF0gPSAqcDsKKyAgICAgICAgICArK3A7CisgICAgICAgICAgYnVmWzFdID0gKnA7CisgICAgICAgICAgYnVmWzJdID0gJ1wwJzsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmaGV4LCBidWYpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmhleCwgMCwgJmhleF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1bmVzY2FwZWQpKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgaWYgKGhleF9lbmQgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIHBlcmNlbnQgY2hhcmFjdGVyIHdhcyBmb2xsb3dlZCBieSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gaGV4IGRpZ2l0cyIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3IsIHNob3VsZCBoYXZlIGJlZW4gZXNjYXBlZCAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIGNoYXJhY3RlciAnJWMnIHNob3VsZCBoYXZlIGJlZW4gZXNjYXBlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnApOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgICsrcDsKKyAgICB9CisKKyAgcmV0ID0gVFJVRTsKKyAgCisgb3V0OgorICBpZiAoIXJldCAmJiBlcnJvciAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisKKyAgX2RidXNfYXNzZXJ0IChyZXQgfHwgZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGFyc2VzIGFuIGFkZHJlc3Mgc3RyaW5nIG9mIHRoZSBmb3JtOgorICoKKyAqIG1ldGhvZDprZXk9dmFsdWUsa2V5PXZhbHVlO21ldGhvZDprZXk9dmFsdWUKKyAqCisgKiBTZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRvY3Mgb24gdGhlIGZvcm1hdC4KKyAqCisgKiBXaGVuIGNvbm5lY3RpbmcgdG8gYW4gYWRkcmVzcywgdGhlIGZpcnN0IGFkZHJlc3MgZW50cmllcworICogaW4gdGhlIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBzaG91bGQgYmUgdHJpZWQgZmlyc3QuCisgKiAKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzLgorICogQHBhcmFtIGVudHJ5IHJldHVybiBsb2NhdGlvbiB0byBhbiBhcnJheSBvZiBlbnRyaWVzLgorICogQHBhcmFtIGFycmF5X2xlbiByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IGxlbmd0aC4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBvdGhlcndpc2UuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BhcnNlX2FkZHJlc3MgKGNvbnN0IGNoYXIgICAgICAgICAqYWRkcmVzcywKKwkJICAgIERCdXNBZGRyZXNzRW50cnkgKioqZW50cnksCisJCSAgICBpbnQgICAgICAgICAgICAgICAgKmFycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBwb3MsIGVuZF9wb3MsIGxlbiwgaTsKKyAgREJ1c0xpc3QgKmVudHJpZXMsICpsaW5rOworICBEQnVzQWRkcmVzc0VudHJ5ICoqZW50cnlfYXJyYXk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgYWRkcmVzcyk7CisKKyAgZW50cmllcyA9IE5VTEw7CisgIHBvcyA9IDA7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICBpZiAobGVuID09IDApCisgIHsKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICJFbXB0eSBhZGRyZXNzICclcyciLCBhZGRyZXNzKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIAorICB3aGlsZSAocG9zIDwgbGVuKQorICAgIHsKKyAgICAgIERCdXNBZGRyZXNzRW50cnkgKmVudHJ5OworCisgICAgICBpbnQgZm91bmRfcG9zOworCisgICAgICBlbnRyeSA9IGNyZWF0ZV9lbnRyeSAoKTsKKyAgICAgIGlmICghZW50cnkpCisJeworCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisKKwkgIGdvdG8gZXJyb3I7CisJfQorICAgICAgCisgICAgICAvKiBBcHBlbmQgdGhlIGVudHJ5ICovCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZW50cmllcywgZW50cnkpKQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCSAgZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUgKGVudHJ5KTsKKwkgIGdvdG8gZXJyb3I7CisJfQorICAgICAgCisgICAgICAvKiBMb29rIGZvciBhIHNlbWktY29sb24gKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIHBvcywgIjsiLCAmZW5kX3BvcykpCisJZW5kX3BvcyA9IGxlbjsKKyAgICAgIAorICAgICAgLyogTG9vayBmb3IgdGhlIGNvbG9uIDogKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIHBvcywgZW5kX3BvcywgIjoiLCAmZm91bmRfcG9zKSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsICJBZGRyZXNzIGRvZXMgbm90IGNvbnRhaW4gYSBjb2xvbiIpOworCSAgZ290byBlcnJvcjsKKwl9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmc3RyLCBwb3MsIGZvdW5kX3BvcyAtIHBvcywgJmVudHJ5LT5tZXRob2QsIDApKQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCSAgZ290byBlcnJvcjsKKwl9CisJICAKKyAgICAgIHBvcyA9IGZvdW5kX3BvcyArIDE7CisKKyAgICAgIHdoaWxlIChwb3MgPCBlbmRfcG9zKQorCXsKKwkgIGludCBjb21tYV9wb3MsIGVxdWFsc19wb3M7CisKKwkgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIHBvcywgZW5kX3BvcywgIiwiLCAmY29tbWFfcG9zKSkKKwkgICAgY29tbWFfcG9zID0gZW5kX3BvczsKKwkgIAorCSAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgcG9zLCBjb21tYV9wb3MsICI9IiwgJmVxdWFsc19wb3MpIHx8CisJICAgICAgZXF1YWxzX3BvcyA9PSBwb3MgfHwgZXF1YWxzX3BvcyArIDEgPT0gY29tbWFfcG9zKQorCSAgICB7CisJICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIic9JyBjaGFyYWN0ZXIgbm90IGZvdW5kIG9yIGhhcyBubyB2YWx1ZSBmb2xsb3dpbmcgaXQiKTsKKyAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgREJ1c1N0cmluZyAqa2V5OworCSAgICAgIERCdXNTdHJpbmcgKnZhbHVlOworCisJICAgICAga2V5ID0gZGJ1c19uZXcwIChEQnVzU3RyaW5nLCAxKTsKKworCSAgICAgIGlmICgha2V5KQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIHZhbHVlID0gZGJ1c19uZXcwIChEQnVzU3RyaW5nLCAxKTsKKwkgICAgICBpZiAoIXZhbHVlKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChrZXkpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOworCQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICh2YWx1ZSkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoa2V5KTsKKworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZzdHIsIHBvcywgZXF1YWxzX3BvcyAtIHBvcywga2V5LCAwKSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlIChrZXkpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlICh2YWx1ZSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghYXBwZW5kX3VuZXNjYXBlZF92YWx1ZSAodmFsdWUsICZzdHIsIGVxdWFsc19wb3MgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hX3BvcyAtIGVxdWFsc19wb3MgLSAxLCBlcnJvcikpCisJCXsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoa2V5KTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAodmFsdWUpOworCisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZW50cnktPmtleXMsIGtleSkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsJCSAgCisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVudHJ5LT52YWx1ZXMsIHZhbHVlKSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOwkJICAKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAodmFsdWUpOworCisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CisJCSAgZ290byBlcnJvcjsJCSAgCisJCX0KKwkgICAgfQorCisJICBwb3MgPSBjb21tYV9wb3MgKyAxOworCX0KKworICAgICAgcG9zID0gZW5kX3BvcyArIDE7CisgICAgfQorCisgICphcnJheV9sZW4gPSBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZlbnRyaWVzKTsKKyAgCisgIGVudHJ5X2FycmF5ID0gZGJ1c19uZXcgKERCdXNBZGRyZXNzRW50cnkgKiwgKmFycmF5X2xlbiArIDEpOworCisgIGlmICghZW50cnlfYXJyYXkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAKKyAgZW50cnlfYXJyYXkgWyphcnJheV9sZW5dID0gTlVMTDsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJpZXMpOworICBpID0gMDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBlbnRyeV9hcnJheVtpXSA9IGxpbmstPmRhdGE7CisgICAgICBpKys7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZW50cmllcywgbGluayk7CisgICAgfQorCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZlbnRyaWVzKTsKKyAgKmVudHJ5ID0gZW50cnlfYXJyYXk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJpZXMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmZW50cmllcyk7CisgIAorICByZXR1cm4gRkFMU0U7CisgIAorfQorCisvKioKKyAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyBhcyBhIHZhbHVlIGluIGEga2V5PXZhbHVlIHBhaXIKKyAqIGZvciBhIEQtQnVzIGFkZHJlc3MuCisgKgorICogQHBhcmFtIHZhbHVlIHRoZSB1bmVzY2FwZWQgdmFsdWUKKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCBlc2NhcGVkIHZhbHVlIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitjaGFyKgorZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUpCit7CisgIERCdXNTdHJpbmcgZXNjYXBlZDsKKyAgREJ1c1N0cmluZyB1bmVzY2FwZWQ7CisgIGNoYXIgKnJldDsKKworICByZXQgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdW5lc2NhcGVkLCB2YWx1ZSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXNjYXBlZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmZXNjYXBlZCwgJnVuZXNjYXBlZCkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmZXNjYXBlZCwgJnJldCkpCisgICAgZ290byBvdXQ7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZXNjYXBlZCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogVW5lc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSB2YWx1ZSBpbiBhIGtleT12YWx1ZSBwYWlyCisgKiBmb3IgYSBELUJ1cyBhZGRyZXNzLiBOb3RlIHRoYXQgZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSgpCisgKiByZXR1cm5zIGFuIGFscmVhZHktdW5lc2NhcGVkIHZhbHVlLgorICoKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgZXNjYXBlZCB2YWx1ZQorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIHNldCBpZiB0aGUgdW5lc2NhcGluZyBmYWlscworICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIHVuZXNjYXBlZCB2YWx1ZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHVuZXNjYXBlZDsKKyAgREJ1c1N0cmluZyBlc2NhcGVkOworICBjaGFyICpyZXQ7CisgIAorICByZXQgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZXNjYXBlZCwgdmFsdWUpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVuZXNjYXBlZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFhcHBlbmRfdW5lc2NhcGVkX3ZhbHVlICgmdW5lc2NhcGVkLCAmZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVzY2FwZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ1bmVzY2FwZWQsICZyZXQpKQorICAgIGdvdG8gb3V0OworCisgb3V0OgorICBpZiAocmV0ID09IE5VTEwgJiYgZXJyb3IgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIF9kYnVzX2Fzc2VydCAocmV0ICE9IE5VTEwgfHwgZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdW5lc2NhcGVkKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBwdWJsaWMgQVBJICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKmVzY2FwZWQ7CisgIGNvbnN0IGNoYXIgKnVuZXNjYXBlZDsKK30gRXNjYXBlVGVzdDsKKworc3RhdGljIGNvbnN0IEVzY2FwZVRlc3QgZXNjYXBlX3Rlc3RzW10gPSB7CisgIHsgImFiY2RlIiwgImFiY2RlIiB9LAorICB7ICIiLCAiIiB9LAorICB7ICIlMjAlMjAiLCAiICAiIH0sCisgIHsgIiUyNCIsICIkIiB9LAorICB7ICIlMjUiLCAiJSIgfSwKKyAgeyAiYWJjJTI0IiwgImFiYyQiIH0sCisgIHsgIiUyNGFiYyIsICIkYWJjIiB9LAorICB7ICJhYmMlMjRhYmMiLCAiYWJjJGFiYyIgfSwKKyAgeyAiLyIsICIvIiB9LAorICB7ICItIiwgIi0iIH0sCisgIHsgIl8iLCAiXyIgfSwKKyAgeyAiQSIsICJBIiB9LAorICB7ICJJIiwgIkkiIH0sCisgIHsgIloiLCAiWiIgfSwKKyAgeyAiYSIsICJhIiB9LAorICB7ICJpIiwgImkiIH0sCisgIHsgInoiLCAieiIgfSwKKyAgLyogQnVnOiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD01MzQ5OSAqLworICB7ICIlYzMlYjYiLCAiXHhjM1x4YjYiIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW10gPSB7CisgICIlYSIsCisgICIlcSIsCisgICIlYXoiLAorICAiJSUiLAorICAiJSQkIiwKKyAgImFiYyVhIiwKKyAgIiVheHl6IiwKKyAgIiUiLAorICAiJCIsCisgICIgIiwKK307CisKK2RidXNfYm9vbF90CitfZGJ1c19hZGRyZXNzX3Rlc3QgKHZvaWQpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBpbnQgbGVuOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGVzY2FwZV90ZXN0cykpCisgICAgeworICAgICAgY29uc3QgRXNjYXBlVGVzdCAqdGVzdCA9ICZlc2NhcGVfdGVzdHNbaV07CisgICAgICBjaGFyICplc2NhcGVkOworICAgICAgY2hhciAqdW5lc2NhcGVkOworCisgICAgICBlc2NhcGVkID0gZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSAodGVzdC0+dW5lc2NhcGVkKTsKKyAgICAgIGlmIChlc2NhcGVkID09IE5VTEwpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpZiAoc3RyY21wIChlc2NhcGVkLCB0ZXN0LT5lc2NhcGVkKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkVzY2FwZWQgJyVzJyBhcyAnJXMnIHNob3VsZCBoYXZlIGJlZW4gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0LT51bmVzY2FwZWQsIGVzY2FwZWQsIHRlc3QtPmVzY2FwZWQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBkYnVzX2ZyZWUgKGVzY2FwZWQpOworCisgICAgICB1bmVzY2FwZWQgPSBkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUgKHRlc3QtPmVzY2FwZWQsICZlcnJvcik7CisgICAgICBpZiAodW5lc2NhcGVkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHVuZXNjYXBlICclcyc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3QtPmVzY2FwZWQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wICh1bmVzY2FwZWQsIHRlc3QtPnVuZXNjYXBlZCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmVzY2FwZWQgJyVzJyBhcyAnJXMnIHNob3VsZCBoYXZlIGJlZW4gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0LT5lc2NhcGVkLCB1bmVzY2FwZWQsIHRlc3QtPnVuZXNjYXBlZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZnJlZSAodW5lc2NhcGVkKTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2VzY2FwZWRfdmFsdWVzKSkKKyAgICB7CisgICAgICBjaGFyICp1bmVzY2FwZWQ7CisKKyAgICAgIHVuZXNjYXBlZCA9IGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoaW52YWxpZF9lc2NhcGVkX3ZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmICh1bmVzY2FwZWQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJTaG91bGQgbm90IGhhdmUgc3VjY2Vzc2Z1bGx5IHVuZXNjYXBlZCAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9lc2NhcGVkX3ZhbHVlc1tpXSwgdW5lc2NhcGVkKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHVuZXNjYXBlZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgICsraTsKKyAgICB9CisgIAorICBpZiAoIWRidXNfcGFyc2VfYWRkcmVzcyAoInVuaXg6cGF0aD0vdG1wL2ZvbztkZWJ1ZzpuYW1lPXRlc3Qsc2xpZmY9c2xvZmY7IiwKKwkJCSAgICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBwYXJzZSBhZGRyZXNzIik7CisgIF9kYnVzX2Fzc2VydCAobGVuID09IDIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwgInBhdGgiKSwgIi90bXAvZm9vIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzFdLCAibmFtZSIpLCAidGVzdCIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1sxXSwgInNsaWZmIiksICJzbG9mZiIpID09IDApOworICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisKKyAgLyogRGlmZmVyZW50IHBvc3NpYmxlIGVycm9ycyAqLworICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiIiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb28iLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmJhciIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyLGJheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyPWZvbyxiYXoiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmJhcj1mb287YmF6IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzo9Zm9vIiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpmb289IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286Zm9vLGJhcj1iYXoiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWFkZHJlc3MuaCBiL2RidXMvZGJ1cy1hZGRyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxZWYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hZGRyZXNzLmgKQEAgLTAsMCArMSw2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWFkZHJlc3MuaCAgU2VydmVyIGFkZHJlc3MgcGFyc2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfQUREUkVTU19ICisjZGVmaW5lIERCVVNfQUREUkVTU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQWRkcmVzcworICogQHsKKyAqLworCisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgc2VtaWNvbG9uLXNlcGFyYXRlZCBpdGVtcyBpbiBhbiBhZGRyZXNzICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQWRkcmVzc0VudHJ5IERCdXNBZGRyZXNzRW50cnk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3BhcnNlX2FkZHJlc3MgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICphZGRyZXNzLAorCQkJCQkgICBEQnVzQWRkcmVzc0VudHJ5ICoqKmVudHJ5LAorCQkJCQkgICBpbnQgICAgICAgICAgICAgICAgKmFycmF5X2xlbiwKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciAqZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAgKERCdXNBZGRyZXNzRW50cnkgICAqZW50cnksCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICAgICAqa2V5KTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyICpkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoREJ1c0FkZHJlc3NFbnRyeSAgICplbnRyeSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAgICAgKERCdXNBZGRyZXNzRW50cnkgICoqZW50cmllcyk7CisKK0RCVVNfRVhQT1JUCitjaGFyKiBkYnVzX2FkZHJlc3NfZXNjYXBlX3ZhbHVlICAgKGNvbnN0IGNoYXIgKnZhbHVlKTsKK0RCVVNfRVhQT1JUCitjaGFyKiBkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUgKGNvbnN0IGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BRERSRVNTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oIGIvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWIwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYXJjaC1kZXBzLmgKQEAgLTAsMCArMSw2MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSIgLSotICovCisvKiBkYnVzLWFyY2gtZGVwcy5oIEhlYWRlciB3aXRoIGFyY2hpdGVjdHVyZS9jb21waWxlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaW5zdGFsbGVkIHRvIGxpYmRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMAorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0FSQ0hfREVQU19ICisjZGVmaW5lIERCVVNfQVJDSF9ERVBTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKiBELUJ1cyBubyBsb25nZXIgc3VwcG9ydHMgcGxhdGZvcm1zIHdpdGggbm8gNjQtYml0IGludGVnZXIgdHlwZS4gKi8KKyNkZWZpbmUgREJVU19IQVZFX0lOVDY0IDEKK19EQlVTX0dOVUNfRVhURU5TSU9OIHR5cGVkZWYgbG9uZyBsb25nIGRidXNfaW50NjRfdDsKK19EQlVTX0dOVUNfRVhURU5TSU9OIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGRidXNfdWludDY0X3Q7CisKKyNkZWZpbmUgREJVU19JTlQ2NF9DT05TVEFOVCh2YWwpICAoX0RCVVNfR05VQ19FWFRFTlNJT04gKHZhbCMjTEwpKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9DT05TVEFOVCh2YWwpIChfREJVU19HTlVDX0VYVEVOU0lPTiAodmFsIyNVTEwpKQorCit0eXBlZGVmIGludCBkYnVzX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkYnVzX3VpbnQzMl90OworCit0eXBlZGVmIHNob3J0IGRidXNfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZGJ1c191aW50MTZfdDsKKworLyogVGhpcyBpcyBub3QgcmVhbGx5IGFyY2gtZGVwZW5kZW50LCBidXQgaXQncyBub3Qgd29ydGgKKyAqIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIGhlYWRlciBqdXN0IGZvciB0aGlzCisgKi8KKyNkZWZpbmUgREJVU19NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgREJVU19NSU5PUl9WRVJTSU9OIDEwCisjZGVmaW5lIERCVVNfTUlDUk9fVkVSU0lPTiAxMgorCisjZGVmaW5lIERCVVNfVkVSU0lPTl9TVFJJTkcgIjEuMTAuMTIiCisKKyNkZWZpbmUgREJVU19WRVJTSU9OICgoMSA8PCAxNikgfCAoMTAgPDwgOCkgfCAoMTIpKSAKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVJDSF9ERVBTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbiBiL2RidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmMzNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmluCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogZGJ1cy1hcmNoLWRlcHMuaCBIZWFkZXIgd2l0aCBhcmNoaXRlY3R1cmUvY29tcGlsZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGluc3RhbGxlZCB0byBsaWJkaXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjAKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19BUkNIX0RFUFNfSAorI2RlZmluZSBEQlVTX0FSQ0hfREVQU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyogRC1CdXMgbm8gbG9uZ2VyIHN1cHBvcnRzIHBsYXRmb3JtcyB3aXRoIG5vIDY0LWJpdCBpbnRlZ2VyIHR5cGUuICovCisjZGVmaW5lIERCVVNfSEFWRV9JTlQ2NCAxCitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIEBEQlVTX0lOVDY0X1RZUEVAIGRidXNfaW50NjRfdDsKK19EQlVTX0dOVUNfRVhURU5TSU9OIHR5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UNjRfVFlQRUAgZGJ1c191aW50NjRfdDsKKworI2RlZmluZSBEQlVTX0lOVDY0X0NPTlNUQU5UKHZhbCkgIChfREJVU19HTlVDX0VYVEVOU0lPTiBAREJVU19JTlQ2NF9DT05TVEFOVEApCisjZGVmaW5lIERCVVNfVUlOVDY0X0NPTlNUQU5UKHZhbCkgKF9EQlVTX0dOVUNfRVhURU5TSU9OIEBEQlVTX1VJTlQ2NF9DT05TVEFOVEApCisKK3R5cGVkZWYgQERCVVNfSU5UMzJfVFlQRUAgZGJ1c19pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBAREJVU19JTlQzMl9UWVBFQCBkYnVzX3VpbnQzMl90OworCit0eXBlZGVmIEBEQlVTX0lOVDE2X1RZUEVAIGRidXNfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UMTZfVFlQRUAgZGJ1c191aW50MTZfdDsKKworLyogVGhpcyBpcyBub3QgcmVhbGx5IGFyY2gtZGVwZW5kZW50LCBidXQgaXQncyBub3Qgd29ydGgKKyAqIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIGhlYWRlciBqdXN0IGZvciB0aGlzCisgKi8KKyNkZWZpbmUgREJVU19NQUpPUl9WRVJTSU9OIEBEQlVTX01BSk9SX1ZFUlNJT05ACisjZGVmaW5lIERCVVNfTUlOT1JfVkVSU0lPTiBAREJVU19NSU5PUl9WRVJTSU9OQAorI2RlZmluZSBEQlVTX01JQ1JPX1ZFUlNJT04gQERCVVNfTUlDUk9fVkVSU0lPTkAKKworI2RlZmluZSBEQlVTX1ZFUlNJT05fU1RSSU5HICJAREJVU19WRVJTSU9OQCIKKworI2RlZmluZSBEQlVTX1ZFUlNJT04gKChAREJVU19NQUpPUl9WRVJTSU9OQCA8PCAxNikgfCAoQERCVVNfTUlOT1JfVkVSU0lPTkAgPDwgOCkgfCAoQERCVVNfTUlDUk9fVkVSU0lPTkApKSAKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVJDSF9ERVBTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hc3YtdXRpbC5jIGIvZGJ1cy9kYnVzLWFzdi11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhYzVlOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hc3YtdXRpbC5jCkBAIC0wLDAgKzEsMzE0IEBACisvKiBkYnVzLWFzdi11dGlsLmMgLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYXtzdn0KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxMi0yMDEzIENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJkYnVzL2RidXMtYXN2LXV0aWwuaCIKKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBtZXRob2QtY2FsbCByZXBseSB3aG9zZSB0eXBlIGlzIGF7c3Z9CisgKiAobWFwIGZyb20gc3RyaW5nIHRvIHZhcmlhbnQpLgorICoKKyAqIEFwcGVuZCB2YWx1ZXMgd2l0aCAwIG9yIG1vcmUgc2VxdWVuY2VzIG9mIF9kYnVzX2Fzdl9vcGVuX2VudHJ5KCksCisgKiBhcHBlbmRpbmcgYSB2YWx1ZSB0byB2YXJfaXRlciwgYW5kIF9kYnVzX2Fzdl9jbG9zZV9lbnRyeSgpLAorICogdGhlbiBjbG9zZSB0aGUgYXtzdn0gd2l0aCBfZGJ1c19hc3ZfY2xvc2UoKSBvciBfZGJ1c19hc3ZfYWJhbmRvbigpLgorICoKKyAqIFRoaXMgbXVzdCBiZSBwYWlyZWQgd2l0aCBhIGNhbGwgdG8gX2RidXNfYXN2X2Nsb3NlKCkgb3IgX2RidXNfYXN2X2FiYW5kb24oKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UKKyAqIEBwYXJhbSBpdGVyIGFuIGl0ZXJhdG9yIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gYXBwZW5kIHRvIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gYXJyX2l0ZXIgYW4gaXRlcmF0b3Igd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZCB0byBhcHBlbmQgdG8gdGhlIGFycmF5CisgKiBAcmV0dXJucyBhIG5ldyBtZXNzYWdlLCBvciAjTlVMTCBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitEQnVzTWVzc2FnZSAqCitfZGJ1c19hc3ZfbmV3X21ldGhvZF9yZXR1cm4gKERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKmFycl9pdGVyKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoaXRlciwgREJVU19UWVBFX0FSUkFZLCAie3N2fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmVwbHk7Cit9CisKKy8qCisgKiBPcGVuIGEgbmV3IGVudHJ5IGluIGFuIGF7c3Z9IChtYXAgZnJvbSBzdHJpbmcgdG8gdmFyaWFudCkuCisgKgorICogVGhpcyBtdXN0IGJlIHBhaXJlZCB3aXRoIGEgY2FsbCB0byBlaXRoZXIgX2RidXNfYXN2X2Nsb3NlX2VudHJ5KCkKKyAqIG9yIF9kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5KCkuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgdGhlIGF7c3Z9IG11c3QgYmUgYWJhbmRvbmVkLCBmb3IgaW5zdGFuY2UKKyAqIHdpdGggX2RidXNfYXN2X2FiYW5kb24oKS4KKyAqCisgKiBAcGFyYW0gYXJyX2l0ZXIgdGhlIGl0ZXJhdG9yIHdoaWNoIGlzIGFwcGVuZGluZyB0byB0aGUgYXJyYXkKKyAqIEBwYXJhbSBlbnRyeV9pdGVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gYXBwZW5kIHRvIHRoZSBkaWN0LWVudHJ5CisgKiBAcGFyYW0ga2V5IGEgVVRGLTgga2V5IGZvciB0aGUgbWFwCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFyaWFudCB2YWx1ZSwgZS5nLiBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORworICogQHBhcmFtIHZhcl9pdGVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gYXBwZW5kIChpLmUuIHdyaXRlKSB0byB0aGUgdmFyaWFudAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfYXN2X29wZW5fZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKQoreworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChhcnJfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVudHJ5X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywgJmtleSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKGFycl9pdGVyLCBlbnRyeV9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoZW50cnlfaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhcl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIENsb3NlcyBhbiBhe3N2fSBlbnRyeSBhZnRlciBzdWNjZXNzZnVsbHkgYXBwZW5kaW5nIHRoZSB2YWx1ZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGUgYXtzdn0gbXVzdCBiZSBhYmFuZG9uZWQsIGZvciBpbnN0YW5jZQorICogd2l0aCBfZGJ1c19hc3ZfYWJhbmRvbigpLgorICoKKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBhcnJheQorICogQHBhcmFtIGVudHJ5X2l0ZXIgdGhlIGl0ZXJhdG9yIGFwcGVuZGluZyB0byB0aGUgZGljdC1lbnRyeSwgd2lsbCBiZSBjbG9zZWQKKyAqIEBwYXJhbSB2YXJfaXRlciB0aGUgaXRlcmF0b3IgYXBwZW5kaW5nIHRvIHRoZSB2YXJpYW50LCB3aWxsIGJlIGNsb3NlZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfYXN2X2Nsb3NlX2VudHJ5IChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmVudHJ5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqdmFyX2l0ZXIpCit7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChlbnRyeV9pdGVyLCB2YXJfaXRlcikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKGFycl9pdGVyLCBlbnRyeV9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKGFycl9pdGVyLCBlbnRyeV9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2xvc2VzIGFuIGF7c3Z9IGFmdGVyIHN1Y2Nlc3NmdWxseSBhcHBlbmRpbmcgYWxsIHZhbHVlcy4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB5b3UgbXVzdCBhYmFuZG9uIGl0ZXIgYW5kIHdoYXRldmVyCisgKiBsYXJnZXIgZGF0YSBzdHJ1Y3R1cmUgKG1lc3NhZ2UsIGV0Yy4pIHRoZSBhe3N2fSB3YXMgZW1iZWRkZWQgaW4uCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHdoaWNoIGlzIGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZSBvciBvdGhlciBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBhe3N2fQorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciBhcHBlbmRpbmcgdG8gdGhlIGFycmF5LCB3aWxsIGJlIGNsb3NlZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hc3ZfY2xvc2UgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlcikKK3sKKyAgcmV0dXJuIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoaXRlciwgYXJyX2l0ZXIpOworfQorCisvKgorICogQ2xvc2VzIGFuIGF7c3Z9IGVudHJ5IGFmdGVyIHVuc3VjY2Vzc2Z1bGx5IGFwcGVuZGluZyBhIHZhbHVlLgorICogWW91IG11c3QgYWxzbyBhYmFuZG9uIHRoZSBhe3N2fSBpdHNlbGYgKGZvciBpbnN0YW5jZSB3aXRoCisgKiBfZGJ1c19hc3ZfYWJhbmRvbigpKSwgYW5kIGFiYW5kb24gd2hhdGV2ZXIgbGFyZ2VyIGRhdGEgc3RydWN0dXJlCisgKiB0aGUgYXtzdn0gd2FzIGVtYmVkZGVkIGluLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIG1lc3NhZ2Ugb3Igb3RoZXIgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgYXtzdn0KKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3IgYXBwZW5kaW5nIHRvIHRoZSBhcnJheSwgd2lsbCBiZSBjbG9zZWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsIG9yICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitzdGF0aWMgdm9pZAorX2RidXNfYXN2X2FiYW5kb25fZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqdmFyX2l0ZXIpCit7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChlbnRyeV9pdGVyLCB2YXJfaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChhcnJfaXRlciwgZW50cnlfaXRlcik7Cit9CisKKy8qKgorICogQ2xvc2VzIGFuIGF7c3Z9IGFmdGVyIHVuc3VjY2Vzc2Z1bGx5IGFwcGVuZGluZyBhIHZhbHVlLgorICoKKyAqIFlvdSBtdXN0IGFsc28gYWJhbmRvbiB3aGF0ZXZlciBsYXJnZXIgZGF0YSBzdHJ1Y3R1cmUgKG1lc3NhZ2UsIGV0Yy4pCisgKiB0aGUgYXtzdn0gd2FzIGVtYmVkZGVkIGluLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIG1lc3NhZ2Ugb3Igb3RoZXIgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgYXtzdn0KKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3IgYXBwZW5kaW5nIHRvIHRoZSBhcnJheSwgd2lsbCBiZSBjbG9zZWQKKyAqLwordm9pZAorX2RidXNfYXN2X2FiYW5kb24gKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyKQoreworICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoaXRlciwgYXJyX2l0ZXIpOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBlbnRyeSBpbiBhbiBhe3N2fSAobWFwIGZyb20gc3RyaW5nIHRvIHZhcmlhbnQpCisgKiB3aXRoIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWUuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgdGhlIGF7c3Z9IG11c3QgYmUgYWJhbmRvbmVkLCBmb3IgaW5zdGFuY2UKKyAqIHdpdGggX2RidXNfYXN2X2FiYW5kb24oKS4KKyAqCisgKiBAcGFyYW0gYXJyX2l0ZXIgdGhlIGl0ZXJhdG9yIHdoaWNoIGlzIGFwcGVuZGluZyB0byB0aGUgYXJyYXkKKyAqIEBwYXJhbSBrZXkgYSBVVEYtOCBrZXkgZm9yIHRoZSBtYXAKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsIG9yICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXN2X2FkZF91aW50MzIgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgdmFsdWUpCit7CisgIERCdXNNZXNzYWdlSXRlciBlbnRyeV9pdGVyLCB2YXJfaXRlcjsKKworICBpZiAoIV9kYnVzX2Fzdl9vcGVuX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsICZ2YXJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFyX2l0ZXIsIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfYXN2X2Nsb3NlX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBlbnRyeSBpbiBhbiBhe3N2fSAobWFwIGZyb20gc3RyaW5nIHRvIHZhcmlhbnQpCisgKiB3aXRoIGEgVVRGLTggc3RyaW5nIHZhbHVlLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHRoZSBhe3N2fSBtdXN0IGJlIGFiYW5kb25lZCwgZm9yIGluc3RhbmNlCisgKiB3aXRoIF9kYnVzX2Fzdl9hYmFuZG9uKCkuCisgKgorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIGFycmF5CisgKiBAcGFyYW0ga2V5IGEgVVRGLTgga2V5IGZvciB0aGUgbWFwCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCBvciAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Fzdl9hZGRfc3RyaW5nIChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGVudHJ5X2l0ZXIsIHZhcl9pdGVyOworCisgIGlmICghX2RidXNfYXN2X29wZW5fZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywgJnZhcl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ2YXJfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb25fZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19hc3ZfY2xvc2VfZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGVudHJ5IGluIGFuIGF7c3Z9IChtYXAgZnJvbSBzdHJpbmcgdG8gdmFyaWFudCkKKyAqIHdpdGggYSBieXRlIGFycmF5IHZhbHVlLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHRoZSBhe3N2fSBtdXN0IGJlIGFiYW5kb25lZCwgZm9yIGluc3RhbmNlCisgKiB3aXRoIF9kYnVzX2Fzdl9hYmFuZG9uKCkuCisgKgorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIGFycmF5CisgKiBAcGFyYW0ga2V5IGEgVVRGLTgga2V5IGZvciB0aGUgbWFwCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcGFyYW0gbl9lbGVtZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGFwcGVuZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hc3ZfYWRkX2J5dGVfYXJyYXkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlSXRlciBlbnRyeV9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgdmFyX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBieXRlX2FycmF5X2l0ZXI7CisKKyAgaWYgKCFfZGJ1c19hc3Zfb3Blbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCBrZXksICJheSIsICZ2YXJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZ2YXJfaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlX2FycmF5X2l0ZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmYnl0ZV9hcnJheV9pdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwgbl9lbGVtZW50cykpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZ2YXJfaXRlciwgJmJ5dGVfYXJyYXlfaXRlcik7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnZhcl9pdGVyLCAmYnl0ZV9hcnJheV9pdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2Fzdl9jbG9zZV9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hc3YtdXRpbC5oIGIvZGJ1cy9kYnVzLWFzdi11dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3YWI4MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hc3YtdXRpbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIGRidXMtYXN2LXV0aWwuaCAtIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBhe3N2fQorICoKKyAqIENvcHlyaWdodCDCqSAyMDExLTIwMTIgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDEyLTIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIERCVVNfQVNWX1VUSUxfSAorI2RlZmluZSBEQlVTX0FTVl9VVElMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzTWVzc2FnZSAqX2RidXNfYXN2X25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKmFycl9pdGVyKTsKK2RidXNfYm9vbF90ICBfZGJ1c19hc3ZfY2xvc2UgICAgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIpOwordm9pZCAgICAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uICAgICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlcik7CisKK2RidXNfYm9vbF90ICBfZGJ1c19hc3ZfYWRkX3VpbnQzMiAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgdmFsdWUpOworZGJ1c19ib29sX3QgIF9kYnVzX2Fzdl9hZGRfc3RyaW5nICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgX2RidXNfYXN2X2FkZF9ieXRlX2FycmF5ICAgIChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuX2VsZW1lbnRzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC1zY3JpcHQuYyBiL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWVkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYXV0aC1zY3JpcHQuYwpAQCAtMCwwICsxLDgxMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGgtc2NyaXB0LmMgVGVzdCBEQnVzQXV0aCB1c2luZyBhIHNwZWNpYWwgc2NyaXB0IGZpbGUgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2luY2x1ZGUgImRidXMtYXV0aC1zY3JpcHQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJkYnVzLWF1dGguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQXV0aFNjcmlwdCBjb2RlIGZvciBydW5uaW5nIHVuaXQgdGVzdCBzY3JpcHRzIGZvciBEQnVzQXV0aAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQXV0aCB1bml0IHRlc3Qgc2NyaXB0aW5nCisgKgorICogVGhlIGNvZGUgaW4gaGVyZSBpcyB1c2VkIGZvciB1bml0IHRlc3RpbmcsIGl0IGxvYWRzCisgKiB1cCBhIHNjcmlwdCB0aGF0IHRlc3RzIERCdXNBdXRoLgorICoKKyAqIEB7CisgKi8KKworLyogdGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgYXBwZW5kX3F1b3RlZF9zdHJpbmcKKyAqIGluIGRidXMtbWVzc2FnZS1idWlsZGVyLmMKKyAqLworc3RhdGljIGRidXNfYm9vbF90CithcHBlbmRfcXVvdGVkX3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpxdW90ZWQpCit7CisgIGRidXNfYm9vbF90IGluX3F1b3RlcyA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBpbl9iYWNrc2xhc2ggPSBGQUxTRTsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHF1b3RlZCkpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgICBiID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChxdW90ZWQsIGkpOworCisgICAgICBpZiAoaW5fYmFja3NsYXNoKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBhOworICAgICAgICAgIAorICAgICAgICAgIGlmIChiID09ICdyJykKKyAgICAgICAgICAgIGEgPSAnXHInOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJ24nKQorICAgICAgICAgICAgYSA9ICdcbic7CisgICAgICAgICAgZWxzZSBpZiAoYiA9PSAnXFwnKQorICAgICAgICAgICAgYSA9ICdcXCc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYmFkIGJhY2tzbGFzaGVkIGJ5dGUgJWNcbiIsIGIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGVzdCwgYSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaW5fYmFja3NsYXNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIGluX2JhY2tzbGFzaCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGluX3F1b3RlcykKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChkZXN0LCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJyAnIHx8IGIgPT0gJ1xuJyB8fCBiID09ICdcdCcpCisgICAgICAgICAgICBicmVhazsgLyogZW5kIG9uIHdoaXRlc3BhY2UgaWYgbm90IHF1b3RlZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRlc3QsIGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NhbWVfZmlyc3Rfd29yZCAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYikKK3sKKyAgaW50IGZpcnN0X2FfYmxhbmssIGZpcnN0X2JfYmxhbms7CisKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGEsIDAsICZmaXJzdF9hX2JsYW5rKTsKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGIsIDAsICZmaXJzdF9iX2JsYW5rKTsKKworICBpZiAoZmlyc3RfYV9ibGFuayAhPSBmaXJzdF9iX2JsYW5rKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoYSwgYiwgZmlyc3RfYV9ibGFuayk7Cit9CisKK3N0YXRpYyBEQnVzQXV0aFN0YXRlCithdXRoX3N0YXRlX2Zyb21fc3RyaW5nIChjb25zdCBEQnVzU3RyaW5nICpzdHIpCit7IAorICBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyIChzdHIsICJXQUlUSU5HX0ZPUl9JTlBVVCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiV0FJVElOR19GT1JfTUVNT1JZIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiSEFWRV9CWVRFU19UT19TRU5EIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiTkVFRF9ESVNDT05ORUNUIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiQVVUSEVOVElDQVRFRCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCithdXRoX3N0YXRlX3RvX3N0cmluZyAoREJ1c0F1dGhTdGF0ZSBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX0lOUFVUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX01FTU9SWSI7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOgorICAgICAgcmV0dXJuICJIQVZFX0JZVEVTX1RPX1NFTkQiOworICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDoKKyAgICAgIHJldHVybiAiTkVFRF9ESVNDT05ORUNUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOgorICAgICAgcmV0dXJuICJBVVRIRU5USUNBVEVEIjsKKyAgICB9CisKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIGNoYXIgKioKK3NwbGl0X3N0cmluZyAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaSwgaiwgaywgY291bnQsIGVuZDsKKyAgY2hhciAqKmFycmF5OworCisgIGVuZCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGkgPSAwOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgIGZvciAoY291bnQgPSAwOyBpIDwgZW5kOyBjb3VudCsrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsIGksICZpKTsKKyAgICAgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIGksICZpKTsKKyAgICB9CisKKyAgYXJyYXkgPSBkYnVzX25ldzAgKGNoYXIgKiwgY291bnQgKyAxKTsKKyAgaWYgKGFycmF5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaSA9IDA7CisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIGksICZpKTsKKyAgZm9yIChrID0gMDsgayA8IGNvdW50OyBrKyspCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKHN0ciwgaSwgJmopOworCisgICAgICBhcnJheVtrXSA9IGRidXNfbWFsbG9jIChqIC0gaSArIDEpOworICAgICAgaWYgKGFycmF5W2tdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcnJheSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIG1lbWNweSAoYXJyYXlba10sCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgaSwgaiAtIGkpLCBqIC0gaSk7CisgICAgICBhcnJheVtrXVtqIC0gaV0gPSAnXDAnOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBqLCAmaSk7CisgICAgfQorICBhcnJheVtrXSA9IE5VTEw7CisKKyAgcmV0dXJuIGFycmF5OworfQorCitzdGF0aWMgdm9pZAorYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyhEQnVzQXV0aCAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90IHBpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsKKworICBjcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRlbnRpYWxzID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZCAoY3JlZGVudGlhbHMsIHVpZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKyAgaWYgKHBpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQgKGNyZWRlbnRpYWxzLCBwaWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIF9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkZW50aWFscyk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBSdW5zIGFuICJhdXRoIHNjcmlwdCIgd2hpY2ggaXMgYSBzY3JpcHQgZm9yIHRlc3RpbmcgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbC4gU2NyaXB0cyBzZW5kIGFuZCByZWNlaXZlIGRhdGEsIGFuZCB0aGVuCisgKiBpbmNsdWRlIGFzc2VydGlvbnMgYWJvdXQgdGhlIHN0YXRlIG9mIGJvdGggZW5kcyBvZiB0aGUgY29ubmVjdGlvbgorICogYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZGF0YS4gQSBzY3JpcHQgc3VjY2VlZHMgaWYgdGhlc2UgYXNzZXJ0aW9ucworICogaG9sZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHRvIHJ1bgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHNjcmlwdCBzdWNjZWVkcywgI0ZBTFNFIG90aGVyd2lzZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zY3JpcHRfcnVuIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmaWxlOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgbGluZV9ubzsKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNTdHJpbmcgZnJvbV9hdXRoOworICBEQnVzQXV0aFN0YXRlIHN0YXRlOworICBEQnVzU3RyaW5nIGNvbnRleHQ7CisgIERCdXNTdHJpbmcgZ3VpZDsKKyAgCisgIHJldHZhbCA9IEZBTFNFOworICBhdXRoID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmd1aWQsICI1ZmEwMWY0MjAyY2Q4Mzc3MDlhMzI3NGNhMGRmOWQwMCIpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJvcmdfZnJlZWRlc2t0b3BfdGVzdCIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZyb21fYXV0aCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZmaWxlLCBmaWxlbmFtZSwgJmVycm9yKSkgICAgeworICAgICAgX2RidXNfd2FybiAoIkdldHRpbmcgY29udGVudHMgb2YgJXMgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzdGF0ZSA9IERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q7CisgIGxpbmVfbm8gPSAwOworCisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZmaWxlLCAmbGluZSkpCisgICAgeyAgICAgIAorICAgICAgbGluZV9ubyArPSAxOworCisgICAgICAvKiBfZGJ1c193YXJuICgiJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsgKi8KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoJmxpbmUpOworCisgICAgICBpZiAoYXV0aCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKChzdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAoYXV0aCkpID09CisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnRtcDsKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX2F1dGhfZ2V0X2J5dGVzX3RvX3NlbmQgKGF1dGgsICZ0bXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0bXApOworCisgICAgICAgICAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2NvcHkgKHRtcCwgMCwgJmZyb21fYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZmcm9tX2F1dGgpKSkKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50IChhdXRoLCBjb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBlbXB0eSBsaW5lICovCisgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGNvbW1lbnQgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisjaWZkZWYgREJVU19XSU4KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSU5fT05MWSIpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWdub3JlIHRoaXMgbGluZSAqLworICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgdW5peCBvbmx5IGF1dGggc2NyaXB0XG4iKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGxpbmUgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0lOX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgd2luZG93cyBvbmx5IGF1dGggc2NyaXB0XG4iKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTElFTlQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGF1dGggIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImFscmVhZHkgY3JlYXRlZCBhIERCdXNBdXRoIChDTElFTlQgb3IgU0VSVkVSIGdpdmVuIHR3aWNlKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYXV0aCA9IF9kYnVzX2F1dGhfY2xpZW50X25ldyAoKTsKKyAgICAgICAgICBpZiAoYXV0aCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIGNyZWF0ZSBEQnVzQXV0aFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogdGVzdCByZWYvdW5yZWYgKi8KKyAgICAgICAgICBfZGJ1c19hdXRoX3JlZiAoYXV0aCk7CisgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisKKyAgICAgICAgICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAoKTsKKyAgICAgICAgICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgY3JlZGVudGlhbHNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHNldHRpbmcgY3JlZGVudGlhbHNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRVJWRVIiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGF1dGggIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImFscmVhZHkgY3JlYXRlZCBhIERCdXNBdXRoIChDTElFTlQgb3IgU0VSVkVSIGdpdmVuIHR3aWNlKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYXV0aCA9IF9kYnVzX2F1dGhfc2VydmVyX25ldyAoJmd1aWQpOworICAgICAgICAgIGlmIChhdXRoID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gY3JlYXRlIERCdXNBdXRoXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB0ZXN0IHJlZi91bnJlZiAqLworICAgICAgICAgIF9kYnVzX2F1dGhfcmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKworICAgICAgICAgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgICAgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBjcmVkZW50aWFsc1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgICAgICAgICBhdXRoID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKGF1dGgsIGNyZWRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3Igc2V0dGluZyBjcmVkZW50aWFsc1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgICAgICAgICBhdXRoID0gTlVMTDsKKyAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKworICAgICAgICAgIF9kYnVzX2F1dGhfc2V0X2NvbnRleHQgKGF1dGgsICZjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYXV0aCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIm11c3Qgc3BlY2lmeSBDTElFTlQgb3IgU0VSVkVSXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9fQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIGF1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMgKGF1dGgsIERCVVNfVUlEX1VOU0VULCBEQlVTX1BJRF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJST09UX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRoX3NldF91bml4X2NyZWRlbnRpYWxzIChhdXRoLCAwLCBEQlVTX1BJRF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSUxMWV9DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyAoYXV0aCwgNDMxMiwgREJVU19QSURfVU5TRVQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxMT1dFRF9NRUNIUyIpKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqKm1lY2hzOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisgICAgICAgICAgbWVjaHMgPSBzcGxpdF9zdHJpbmcgKCZsaW5lKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zIChhdXRoLCAoY29uc3QgY2hhciAqKikgbWVjaHMpOworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKG1lY2hzKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTkQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdG9fc2VuZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0b19zZW5kKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBzdHJpbmdcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghYXBwZW5kX3F1b3RlZF9zdHJpbmcgKCZ0b19zZW5kLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIHF1b3RlZCBzdHJpbmcgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgJyVzJ1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdG9fc2VuZCkpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRvX3NlbmQsICJcclxuIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIFxyXG4gZnJvbSBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBSZXBsYWNlIFVTRVJJRF9IRVggd2l0aCBvdXIgdXNlcm5hbWUgaW4gaGV4ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IHdoZXJlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZ0b19zZW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVNFUklEX0hFWCIsICZ3aGVyZSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcmlkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzICgmdXNlcm5hbWUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1c2VyaWRcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmdG9fc2VuZCwgd2hlcmUsIChpbnQpIHN0cmxlbiAoIlVTRVJJRF9IRVgiKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnVzZXJuYW1lLCAwLAorCQkJCQkgICAgICAmdG9fc2VuZCwgd2hlcmUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIHN1YnN0IFVTRVJJRF9IRVhcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZ0b19zZW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0VSTkFNRV9IRVgiLCAmd2hlcmUpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXNlcm5hbWUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1c2VybmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcm5hbWVcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmdG9fc2VuZCwgd2hlcmUsIChpbnQpIHN0cmxlbiAoIlVTRVJOQU1FX0hFWCIpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdXNlcm5hbWUsIDAsCisJCQkJCSAgICAgICZ0b19zZW5kLCB3aGVyZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gc3Vic3QgVVNFUk5BTUVfSEVYXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgICAgICAgIF9kYnVzX2F1dGhfZ2V0X2J1ZmZlciAoYXV0aCwgJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdG9fc2VuZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNhbGwgYnl0ZXNfcmVjZWl2ZWQsIG9yIGNhbid0IGFkZCBieXRlcyB0byBhdXRoIG9iamVjdCBhbHJlYWR5IGluIGVuZCBzdGF0ZVxuIik7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICBfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKGF1dGgsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2RidXNfYXV0aF9yZXR1cm5fYnVmZmVyIChhdXRoLCBidWZmZXIpOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX1NUQVRFIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGV4cGVjdGVkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgZXhwZWN0ZWQgPSBhdXRoX3N0YXRlX2Zyb21fc3RyaW5nICgmbGluZSk7CisgICAgICAgICAgaWYgKGV4cGVjdGVkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImJhZCBhdXRoIHN0YXRlIGdpdmVuIHRvIEVYUEVDVF9TVEFURVxuIik7CisgICAgICAgICAgICAgIGdvdG8gcGFyc2VfZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZXhwZWN0ZWQgYXV0aCBzdGF0ZSAlcyBidXQgZ290ICVzIG9uIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfc3RhdGVfdG9fc3RyaW5nIChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfc3RhdGVfdG9fc3RyaW5nIChzdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVF9DT01NQU5EIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHJlY2VpdmVkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlY2VpdmVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbSB0byBhbGxvY2F0ZSBzdHJpbmcgcmVjZWl2ZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmZnJvbV9hdXRoLCAmcmVjZWl2ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbGluZSBwb3BwZWQgZnJvbSB0aGUgREJ1c0F1dGggYmVpbmcgdGVzdGVkLCBleHBlY3RlZCBjb21tYW5kICVzIG9uIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpLCBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZWNlaXZlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFzYW1lX2ZpcnN0X3dvcmQgKCZyZWNlaXZlZCwgJmxpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibGluZSAlZCBleHBlY3RlZCBjb21tYW5kICclcycgYW5kIGdvdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmVjZWl2ZWQpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZWNlaXZlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVjZWl2ZWQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX1VOVVNFRCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBleHBlY3RlZDsKKyAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1bnVzZWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXhwZWN0ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtIHRvIGFsbG9jYXRlIHN0cmluZyBleHBlY3RlZFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFhcHBlbmRfcXVvdGVkX3N0cmluZyAoJmV4cGVjdGVkLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIHF1b3RlZCBzdHJpbmcgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoYXV0aCwgJnVudXNlZCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbCAoJmV4cGVjdGVkLCB1bnVzZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKGF1dGgpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB1bnVzZWQgYnl0ZXMgJyVzJyBhbmQgaGF2ZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodW51c2VkKSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhvcml6ZWRfaWRlbnRpdHk7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aG9yaXplZF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5IChhdXRoKTsKKyAgICAgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGF1dGhvcml6ZWRfaWRlbnRpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgYW5vbnltb3VzIGxvZ2luIG9yIGZhaWxlZCBsb2dpbiwgYnV0IHNvbWUgY3JlZGVudGlhbHMgd2VyZSBhdXRob3JpemVkXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfSEFWRV9TT01FX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhvcml6ZWRfaWRlbnRpdHk7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aG9yaXplZF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5IChhdXRoKTsKKyAgICAgICAgICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aG9yaXplZF9pZGVudGl0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB0byBoYXZlIHNvbWUgY3JlZGVudGlhbHMsIGJ1dCB3ZSBkb24ndFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGV4cGVjdGVkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmV4cGVjdGVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbSB0byBhbGxvY2F0ZSBzdHJpbmcgZXhwZWN0ZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghYXBwZW5kX3F1b3RlZF9zdHJpbmcgKCZleHBlY3RlZCwgJmxpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZmFpbGVkIHRvIGFwcGVuZCBxdW90ZWQgc3RyaW5nIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoJmV4cGVjdGVkLCAmZnJvbV9hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmV4cGVjdGVkKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZmcm9tX2F1dGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZXhwZWN0ZWQpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZXhhY3Qgc3RyaW5nICclcycgYW5kIGhhdmUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmcm9tX2F1dGgpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gcGFyc2VfZmFpbGVkOworCisgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOyAvKiBza2lwIHBhcnNlX2ZhaWxlZCAqLworICAgICAgCisgICAgcGFyc2VfZmFpbGVkOgorICAgICAgeworICAgICAgICBfZGJ1c193YXJuICgiY291bGRuJ3QgcHJvY2VzcyBsaW5lICVkIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGluZV9ubywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbGluZSkpOworICAgICAgICBnb3RvIG91dDsKKyAgICAgIH0KKyAgICB9CisKKyAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQXV0aCBzY3JpcHQgaXMgYm9ndXMsIGRpZCBub3QgZXZlbiBoYXZlIENMSUVOVCBvciBTRVJWRVJcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmIChzdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCkKKyAgICB7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICp1bnVzZWQ7CisKKyAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoYXV0aCwgJnVudXNlZCk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW51c2VkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiZGlkIG5vdCBleHBlY3QgdW51c2VkIGJ5dGVzIChzY3JpcHRzIG11c3Qgc3BlY2lmeSBleHBsaWNpdGx5IGlmIHRoZXkgYXJlIGV4cGVjdGVkKVxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZnJvbV9hdXRoKSA+IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoInNjcmlwdCBkaWQgbm90IGhhdmUgRVhQRUNUXyBzdGF0ZW1lbnRzIGZvciBhbGwgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgREJ1c0F1dGhcbiIpOworICAgICAgX2RidXNfd2FybiAoIkxlZnRvdmVyIGRhdGE6ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmcm9tX2F1dGgpKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKGF1dGgpCisgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmcm9tX2F1dGgpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9ICovCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oIGIvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLXNjcmlwdC5oIFRlc3QgREJ1c0F1dGggdXNpbmcgYSBzcGVjaWFsIHNjcmlwdCBmaWxlIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0FVVEhfU0NSSVBUX0gKKyNkZWZpbmUgREJVU19BVVRIX1NDUklQVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2RidXNfYm9vbF90IF9kYnVzX2F1dGhfc2NyaXB0X3J1biAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BVVRIX1NDUklQVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC11dGlsLmMgYi9kYnVzL2RidXMtYXV0aC11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYmM0OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLXV0aWwuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGgtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtYXV0aC5jLCBidXQgb25seSB1c2VkIGZvciB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtYXV0aC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBdXRoCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLWF1dGgtc2NyaXB0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3Rfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqc3ViZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5XG4iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKyAgCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKSAgICAKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHByaW50ZiAoIlRlc3RpbmcgJXM6XG4iLCBzdWJkaXIpOworICAKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLmF1dGgtc2NyaXB0IikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5hdXRoLXNjcmlwdCBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19hdXRoX3NjcmlwdF9ydW4gKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdF9kaXJlY3RvcnkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9kaXJzIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRlc3RfZGlyZWN0b3J5LCB0ZXN0X2RhdGFfZGlyKTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF9zdWJkaXIgKCZ0ZXN0X2RpcmVjdG9yeSwgImF1dGgiKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF90ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICAKKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X2RpcnMgKHRlc3RfZGF0YV9kaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC5jIGIvZGJ1cy9kYnVzLWF1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQzY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWF1dGguYwpAQCAtMCwwICsxLDI4NDIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLmMgQXV0aGVudGljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWF1dGguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1rZXlyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGEuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQXV0aCBBdXRoZW50aWNhdGlvbgorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQXV0aCBvYmplY3QKKyAqCisgKiBEQnVzQXV0aCBtYW5hZ2VzIHRoZSBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbiB3aGVuIGEgY29ubmVjdGlvbgorICogaXMgZmlyc3QgZXN0YWJsaXNoZWQsIGFuZCBhbHNvIG1hbmFnZXMgYW55IGVuY3J5cHRpb24gdXNlZCBvdmVyIGEKKyAqIGNvbm5lY3Rpb24uCisgKgorICogQHRvZG8gc29tZSBTQVNMIHByb2ZpbGVzIHJlcXVpcmUgc2VuZGluZyB0aGUgZW1wdHkgc3RyaW5nIGFzIGEKKyAqIGNoYWxsZW5nZS9yZXNwb25zZSwgYnV0IHdlIGRvbid0IGN1cnJlbnRseSBhbGxvdyB0aGF0IGluIG91cgorICogcHJvdG9jb2wuCisgKgorICogQHRvZG8gcmlnaHQgbm93IHNvbWV0aW1lcyBib3RoIGVuZHMgd2lsbCBibG9jayB3YWl0aW5nIGZvciBpbnB1dAorICogZnJvbSB0aGUgb3RoZXIgZW5kLCBlLmcuIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nCisgKiBEQlVTX0NPT0tJRV9TSEExLgorICoKKyAqIEB0b2RvIHRoZSBjb29raWUga2V5cmluZyBuZWVkcyB0byBiZSBjYWNoZWQgZ2xvYmFsbHkgbm90IGp1c3QKKyAqIHBlci1hdXRoICh3aGljaCByYWlzZXMgdGhyZWFkc2FmZXR5IGlzc3VlcyB0b28pCisgKiAKKyAqIEB0b2RvIGdyZXAgRklYTUUgaW4gZGJ1cy1hdXRoLmMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQXV0aEludGVybmFscyBBdXRoZW50aWNhdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNBdXRoIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBQcml2YXRlIGRldGFpbHMgb2YgYXV0aGVudGljYXRpb24gY29kZS4KKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhcHBlbmRzIGFuIGluaXRpYWwgY2xpZW50IHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzdHJpbmcKKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzSW5pdGlhbFJlc3BvbnNlRnVuY3Rpb24pICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3BvbnNlKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KKyAqIGkuZS4gaGFuZGxlcyBhIERBVEEgY29tbWFuZC4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQXV0aERhdGFGdW5jdGlvbikgICAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIHBlZXIuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhFbmNvZGVGdW5jdGlvbikgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBwZWVyLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoRGVjb2RlRnVuY3Rpb24pICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlY29kZWQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1lY2hhbmlzbSBpcyBhYmFuZG9uZWQuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uKSAoREJ1c0F1dGggICAgICAgKmF1dGgpOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBhdXRoIG1lY2hhbmlzbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbWVjaGFuaXNtOyAvKio8IE5hbWUgb2YgdGhlIG1lY2hhbmlzbSAqLworICBEQnVzQXV0aERhdGFGdW5jdGlvbiBzZXJ2ZXJfZGF0YV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIGZvciBEQVRBICovCisgIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24gc2VydmVyX2VuY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIHRvIGVuY29kZSAqLworICBEQnVzQXV0aERlY29kZUZ1bmN0aW9uIHNlcnZlcl9kZWNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBkZWNvZGUgKi8KKyAgREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uIHNlcnZlcl9zaHV0ZG93bl9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIHNlcnZlciBzaWRlIHRvIHNodXQgZG93biAqLworICBEQnVzSW5pdGlhbFJlc3BvbnNlRnVuY3Rpb24gY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSB0byBoYW5kbGUgaW5pdGlhbCByZXNwb25zZSAqLworICBEQnVzQXV0aERhdGFGdW5jdGlvbiBjbGllbnRfZGF0YV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBEQVRBICovCisgIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24gY2xpZW50X2VuY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBlbmNvZGUgKi8KKyAgREJ1c0F1dGhEZWNvZGVGdW5jdGlvbiBjbGllbnRfZGVjb2RlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgZm9yIGRlY29kZSAqLworICBEQnVzQXV0aFNodXRkb3duRnVuY3Rpb24gY2xpZW50X3NodXRkb3duX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgZm9yIHNodXRkb3duICovCit9IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlcjsKKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGtub3duIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzLgorICovCit0eXBlZGVmIGVudW0geworICBEQlVTX0FVVEhfQ09NTUFORF9BVVRILAorICBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUwsCisgIERCVVNfQVVUSF9DT01NQU5EX0RBVEEsCisgIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOLAorICBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRCwKKyAgREJVU19BVVRIX0NPTU1BTkRfT0ssCisgIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SLAorICBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOLAorICBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRCwKKyAgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRAorfSBEQnVzQXV0aENvbW1hbmQ7CisKKy8qKgorICogQXV0aCBzdGF0ZSBmdW5jdGlvbiwgZGV0ZXJtaW5lcyB0aGUgcmVhY3Rpb24gdG8gaW5jb21pbmcgZXZlbnRzIGZvcgorICogYSBwYXJ0aWN1bGFyIHN0YXRlLiBSZXR1cm5zIHdoZXRoZXIgd2UgaGFkIGVub3VnaCBtZW1vcnkgdG8KKyAqIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhTdGF0ZUZ1bmN0aW9uKSAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBhdXRoIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc3RhdGUgKi8KKyAgREJ1c0F1dGhTdGF0ZUZ1bmN0aW9uIGhhbmRsZXI7ICAvKio8IFN0YXRlIGZ1bmN0aW9uIGZvciB0aGlzIHN0YXRlICovCit9IERCdXNBdXRoU3RhdGVEYXRhOworCisvKioKKyAqIEludGVybmFsIG1lbWJlcnMgb2YgREJ1c0F1dGguCisgKi8KK3N0cnVjdCBEQnVzQXV0aAoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAvKio8IHJlZmVyZW5jZSBjb3VudCAqLworICBjb25zdCBjaGFyICpzaWRlOyAgICAgICAvKio8IENsaWVudCBvciBzZXJ2ZXIgKi8KKworICBEQnVzU3RyaW5nIGluY29taW5nOyAgICAvKio8IEluY29taW5nIGRhdGEgYnVmZmVyICovCisgIERCdXNTdHJpbmcgb3V0Z29pbmc7ICAgIC8qKjwgT3V0Z29pbmcgZGF0YSBidWZmZXIgKi8KKyAgCisgIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhICpzdGF0ZTsgICAgICAgICAvKio8IEN1cnJlbnQgcHJvdG9jb2wgc3RhdGUgKi8KKworICBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2g7ICAgLyoqPCBDdXJyZW50IGF1dGggbWVjaGFuaXNtICovCisKKyAgREJ1c1N0cmluZyBpZGVudGl0eTsgICAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IGlkZW50aXR5IHdlJ3JlIGF1dGhvcml6aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsgICAgICAgICAgLyoqPCBDcmVkZW50aWFscyByZWFkIGZyb20gc29ja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIERCdXNDcmVkZW50aWFscyAqYXV0aG9yaXplZF9pZGVudGl0eTsgLyoqPCBDcmVkZW50aWFscyB0aGF0IGFyZSBhdXRob3JpemVkICovCisKKyAgREJ1c0NyZWRlbnRpYWxzICpkZXNpcmVkX2lkZW50aXR5OyAgICAvKio8IElkZW50aXR5IGNsaWVudCBoYXMgcmVxdWVzdGVkICovCisgIAorICBEQnVzU3RyaW5nIGNvbnRleHQ7ICAgICAgICAgICAgICAgLyoqPCBDb29raWUgc2NvcGUgKi8KKyAgREJ1c0tleXJpbmcgKmtleXJpbmc7ICAgICAgICAgICAgIC8qKjwgS2V5cmluZyBmb3IgY29va2llIG1lY2hhbmlzbS4gKi8KKyAgaW50IGNvb2tpZV9pZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgY29va2llIHRvIHVzZSAqLworICBEQnVzU3RyaW5nIGNoYWxsZW5nZTsgICAgICAgICAgICAgLyoqPCBDaGFsbGVuZ2Ugc2VudCB0byBjbGllbnQgKi8KKworICBjaGFyICoqYWxsb3dlZF9tZWNoczsgICAgICAgICAgICAgLyoqPCBNZWNoYW5pc21zIHdlJ3JlIGFsbG93ZWQgdG8gdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgI05VTEwgaWYgd2UgY2FuIHVzZSBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgdW5zaWduZWQgaW50IG5lZWRlZF9tZW1vcnkgOiAxOyAgIC8qKjwgV2UgbmVlZGVkIG1lbW9yeSB0byBjb250aW51ZSBzaW5jZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzZnVsIGdldHRpbmcgc29tZXRoaW5nIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgYWxyZWFkeV9nb3RfbWVjaGFuaXNtcyA6IDE7ICAgICAgIC8qKjwgQ2xpZW50IGFscmVhZHkgZ290IG1lY2ggbGlzdCAqLworICB1bnNpZ25lZCBpbnQgYWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSA6IDE7IC8qKjwgQWxyZWFkeSBzZW50IGEgYmxhbmsgY2hhbGxlbmdlIHRvIGdldCBhbiBpbml0aWFsIHJlc3BvbnNlICovCisgIHVuc2lnbmVkIGludCBidWZmZXJfb3V0c3RhbmRpbmcgOiAxOyAvKio8IEJ1ZmZlciBpcyAiY2hlY2tlZCBvdXQiIGZvciByZWFkaW5nIGRhdGEgaW50byAqLworCisgIHVuc2lnbmVkIGludCB1bml4X2ZkX3Bvc3NpYmxlIDogMTsgIC8qKjwgVGhpcyBzaWRlIGNvdWxkIGRvIHVuaXggZmQgcGFzc2luZyAqLworICB1bnNpZ25lZCBpbnQgdW5peF9mZF9uZWdvdGlhdGVkIDogMTsgLyoqPCBVbml4IGZkIHdhcyBzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZCAqLworfTsKKworLyoqCisgKiAiU3ViY2xhc3MiIG9mIERCdXNBdXRoIGZvciBjbGllbnQgc2lkZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzQXV0aCBiYXNlOyAgICAvKio8IFBhcmVudCBjbGFzcyAqLworCisgIERCdXNMaXN0ICptZWNoc190b190cnk7IC8qKjwgTWVjaGFuaXNtcyB3ZSBnb3QgZnJvbSB0aGUgc2VydmVyIHRoYXQgd2UncmUgZ29pbmcgdG8gdHJ5IHVzaW5nICovCisKKyAgREJ1c1N0cmluZyBndWlkX2Zyb21fc2VydmVyOyAvKio8IEdVSUQgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIgKi8KKyAgCit9IERCdXNBdXRoQ2xpZW50OworCisvKioKKyAqICJTdWJjbGFzcyIgb2YgREJ1c0F1dGggZm9yIHNlcnZlciBzaWRlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzQXV0aCBiYXNlOyAgICAvKio8IFBhcmVudCBjbGFzcyAqLworCisgIGludCBmYWlsdXJlczsgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIGNsaWVudCBoYXMgYmVlbiByZWplY3RlZCAqLworICBpbnQgbWF4X2ZhaWx1cmVzOyAvKio8IE51bWJlciBvZiB0aW1lcyB3ZSByZWplY3QgYmVmb3JlIGRpc2Nvbm5lY3QgKi8KKworICBEQnVzU3RyaW5nIGd1aWQ7ICAvKio8IE91ciBnbG9iYWxseSB1bmlxdWUgSUQgaW4gaGV4IGVuY29kaW5nICovCisgIAorfSBEQnVzQXV0aFNlcnZlcjsKKworc3RhdGljIHZvaWQgICAgICAgIGdvdG9fc3RhdGUgICAgICAgICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAgICAgICAgKm5ld19zdGF0ZSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9hdXRoICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2RhdGEgICAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpkYXRhKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX3JlamVjdGVkICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9lcnJvciAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9vayAgICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYmVnaW4gICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2NhbmNlbCAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9uZWdvdGlhdGVfdW5peF9mZCAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYWdyZWVfdW5peF9mZCAgICAgICAgKERCdXNBdXRoICphdXRoKTsKKworLyoqCisgKiBDbGllbnQgc3RhdGVzCisgKi8KKyAKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4gKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKKyAgCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggPSB7CisgICJXYWl0aW5nRm9yQXV0aCIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSA9IHsKKyAgIldhaXRpbmdGb3JEYXRhIiwgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhCit9Oworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIHNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9iZWdpbiA9IHsKKyAgIldhaXRpbmdGb3JCZWdpbiIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4KK307CisgIAorLyoqCisgKiBDbGllbnQgc3RhdGVzCisgKi8KKyAKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9vayAgICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfcmVqZWN0IChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX25lZWRfc2VuZF9hdXRoID0geworICAiTmVlZFNlbmRBdXRoIiwgTlVMTAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSA9IHsKKyAgIldhaXRpbmdGb3JEYXRhIiwgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhCit9OworLyogVGhlIFdhaXRpbmdGb3JPSyBzdGF0ZSBkb2Vzbid0IGFwcGVhciB0byBiZSB1c2VkLgorICogU2VlIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTk3Mjk4ICovCitfREJVU19HTlVDX1VOVVNFRAorc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9vayA9IHsKKyAgIldhaXRpbmdGb3JPSyIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCA9IHsKKyAgIldhaXRpbmdGb3JSZWplY3QiLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdAorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZCA9IHsKKyAgIldhaXRpbmdGb3JBZ3JlZVVuaXhGRCIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZAorfTsKKworLyoqCisgKiBDb21tb24gdGVybWluYWwgc3RhdGVzLiAgVGVybWluYWwgc3RhdGVzIGhhdmUgaGFuZGxlciA9PSBOVUxMLgorICovCisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCA9IHsKKyAgIkF1dGhlbnRpY2F0ZWQiLCAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QgPSB7CisgICJOZWVkRGlzY29ubmVjdCIsICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciBhdXRoX3NpZGVfY2xpZW50W10gPSAiY2xpZW50IjsKK3N0YXRpYyBjb25zdCBjaGFyIGF1dGhfc2lkZV9zZXJ2ZXJbXSA9ICJzZXJ2ZXIiOworLyoqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb252ZXJzYXRpb24gaXMgdGhlIHNlcnZlciBzaWRlCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0lTX1NFUlZFUihhdXRoKSAoKGF1dGgpLT5zaWRlID09IGF1dGhfc2lkZV9zZXJ2ZXIpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNvbnZlcnNhdGlvbiBpcyB0aGUgY2xpZW50IHNpZGUKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfSVNfQ0xJRU5UKGF1dGgpICgoYXV0aCktPnNpZGUgPT0gYXV0aF9zaWRlX2NsaWVudCkKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhdXRoIGNhc3QgdG8gREJ1c0F1dGhDbGllbnQKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfQ0xJRU5UKGF1dGgpICAgICgoREJ1c0F1dGhDbGllbnQqKShhdXRoKSkKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhdXRoIGNhc3QgdG8gREJ1c0F1dGhTZXJ2ZXIKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfU0VSVkVSKGF1dGgpICAgICgoREJ1c0F1dGhTZXJ2ZXIqKShhdXRoKSkKKworLyoqCisgKiBUaGUgbmFtZSBvZiB0aGUgYXV0aCAoImNsaWVudCIgb3IgInNlcnZlciIpCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zIGEgc3RyaW5nCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX05BTUUoYXV0aCkgICAgICAoKGF1dGgpLT5zaWRlKQorCitzdGF0aWMgREJ1c0F1dGgqCitfZGJ1c19hdXRoX25ldyAoaW50IHNpemUpCit7CisgIERCdXNBdXRoICphdXRoOworICAKKyAgYXV0aCA9IGRidXNfbWFsbG9jMCAoc2l6ZSk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBhdXRoLT5yZWZjb3VudCA9IDE7CisgIAorICBhdXRoLT5rZXlyaW5nID0gTlVMTDsKKyAgYXV0aC0+Y29va2llX2lkID0gLTE7CisgIAorICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBtYXggc3RyaW5nIGxlbmd0aCBmZWF0dXJlLAorICAgKiBiZWNhdXNlIHlvdSBjYW4ndCB1c2UgdGhhdCBmZWF0dXJlIGlmIHlvdSdyZSBnb2luZyB0bworICAgKiB0cnkgdG8gcmVjb3ZlciBmcm9tIG91dC1vZi1tZW1vcnkgKGl0IGNyZWF0ZXMKKyAgICogd2hhdCBsb29rcyBsaWtlIHVucmVjb3ZlcmFibGUgaW5hYmlsaXR5IHRvIGFsbG9jCisgICAqIG1vcmUgc3BhY2UgaW4gdGhlIHN0cmluZykuIEJ1dCB3ZSBkbyBoYW5kbGUKKyAgICogb3ZlcmxvbmcgYnVmZmVycyBpbiBfZGJ1c19hdXRoX2RvX3dvcmsoKS4KKyAgICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV0aC0+aW5jb21pbmcpKQorICAgIGdvdG8gZW5vbWVtXzA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPm91dGdvaW5nKSkKKyAgICBnb3RvIGVub21lbV8xOworICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV0aC0+aWRlbnRpdHkpKQorICAgIGdvdG8gZW5vbWVtXzI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmNvbnRleHQpKQorICAgIGdvdG8gZW5vbWVtXzM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmNoYWxsZW5nZSkpCisgICAgZ290byBlbm9tZW1fNDsKKworICAvKiBkZWZhdWx0IGNvbnRleHQgaWYgbm9uZSBpcyBzcGVjaWZpZWQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+Y29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9nZW5lcmFsIikpCisgICAgZ290byBlbm9tZW1fNTsKKworICBhdXRoLT5jcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGF1dGgtPmNyZWRlbnRpYWxzID09IE5VTEwpCisgICAgZ290byBlbm9tZW1fNjsKKyAgCisgIGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5ID09IE5VTEwpCisgICAgZ290byBlbm9tZW1fNzsKKworICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzg7CisgIAorICByZXR1cm4gYXV0aDsKKworI2lmIDAKKyBlbm9tZW1fOToKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpOworI2VuZGlmCisgZW5vbWVtXzg6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5KTsKKyBlbm9tZW1fNzoKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGF1dGgtPmNyZWRlbnRpYWxzKTsKKyBlbm9tZW1fNjoKKyAvKiBsYXN0IGFsbG9jIHdhcyBhbiBhcHBlbmQgdG8gY29udGV4dCwgd2hpY2ggaXMgZnJlZWQgYWxyZWFkeSBiZWxvdyAqLyA7CisgZW5vbWVtXzU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y2hhbGxlbmdlKTsKKyBlbm9tZW1fNDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jb250ZXh0KTsKKyBlbm9tZW1fMzoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pZGVudGl0eSk7CisgZW5vbWVtXzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+b3V0Z29pbmcpOworIGVub21lbV8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmluY29taW5nKTsKKyBlbm9tZW1fMDoKKyAgZGJ1c19mcmVlIChhdXRoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzaHV0ZG93bl9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgLyogQ2FuY2VsIGFueSBhdXRoICovCisgIGF1dGgtPmFscmVhZHlfYXNrZWRfZm9yX2luaXRpYWxfcmVzcG9uc2UgPSBGQUxTRTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5pZGVudGl0eSwgMCk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkpOworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgIAorICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogU2h1dHRpbmcgZG93biBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGF1dGgtPm1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgKCogYXV0aC0+bWVjaC0+Y2xpZW50X3NodXRkb3duX2Z1bmMpIChhdXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKCogYXV0aC0+bWVjaC0+c2VydmVyX3NodXRkb3duX2Z1bmMpIChhdXRoKTsKKyAgICAgIAorICAgICAgYXV0aC0+bWVjaCA9IE5VTEw7CisgICAgfQorfQorCisvKgorICogREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20KKyAqLworCisvKiBSZXR1cm5zIFRSVUUgYnV0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGhhc2ggaWYgdGhlCisgKiBjb29raWVfaWQgaXNuJ3Qga25vd24uIEFzIHdpdGggYWxsIHRoaXMgY29kZQorICogVFJVRSBqdXN0IG1lYW5zIHdlIGhhZCBlbm91Z2ggbWVtb3J5LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NoYTFfY29tcHV0ZV9oYXNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2ZXJfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNsaWVudF9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaGFzaCkKK3sKKyAgREJ1c1N0cmluZyBjb29raWU7CisgIERCdXNTdHJpbmcgdG9faGFzaDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5rZXlyaW5nICE9IE5VTEwpOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvb2tpZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAoYXV0aC0+a2V5cmluZywgY29va2llX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb29raWUpKQorICAgIGdvdG8gb3V0XzA7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29va2llKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG9faGFzaCkpCisgICAgZ290byBvdXRfMDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHNlcnZlcl9jaGFsbGVuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19oYXNoLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRvX2hhc2gpKSkKKyAgICBnb3RvIG91dF8xOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRvX2hhc2gsICI6IikpCisgICAgZ290byBvdXRfMTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGNsaWVudF9jaGFsbGVuZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19oYXNoLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRvX2hhc2gpKSkKKyAgICBnb3RvIG91dF8xOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRvX2hhc2gsICI6IikpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29va2llLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmdG9faGFzaCwgaGFzaCkpCisgICAgZ290byBvdXRfMTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXRfMToKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0b19oYXNoKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19oYXNoKTsKKyBvdXRfMDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb29raWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvb2tpZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyODMxLnR4dCBzdWdnZXN0cyBhdCBsZWFzdCA2NCBiaXRzIG9mCisgKiBlbnRyb3B5LCB3ZSB1c2UgMTI4LiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJhbmRvbQorICogY2hhbGxlbmdlLgorICovCisjZGVmaW5lIE5fQ0hBTExFTkdFX0JZVEVTICgxMjgvOCkKKworc3RhdGljIGRidXNfYm9vbF90CitzaGExX2hhbmRsZV9maXJzdF9jbGllbnRfcmVzcG9uc2UgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIC8qIFdlIGhhdmVuJ3Qgc2VudCBhIGNoYWxsZW5nZSB5ZXQsIHdlJ3JlIGV4cGVjdGluZyBhIGRlc2lyZWQKKyAgICogdXNlcm5hbWUgZnJvbSB0aGUgY2xpZW50LgorICAgKi8KKyAgREJ1c1N0cmluZyB0bXA7CisgIERCdXNTdHJpbmcgdG1wMjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID4gMCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5pZGVudGl0eSkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJpZWQgdG8gc2VuZCB0d28gYXV0aCBpZGVudGl0aWVzLCB3dGYgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGNsaWVudCB0cmllZCB0byBzZW5kIGF1dGggaWRlbnRpdHksIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgb25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0aGlzIGlzIG91ciBhdXRoIGlkZW50aXR5ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgJmF1dGgtPmlkZW50aXR5LCAwKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksIGRhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRGlkIG5vdCBnZXQgYSB2YWxpZCB1c2VybmFtZSBmcm9tIGNsaWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wMikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiB3ZSBjYWNoZSB0aGUga2V5cmluZyBmb3Igc3BlZWQsIHNvIGhlcmUgd2UgZHJvcCBpdCBpZiBpdCdzIHRoZQorICAgKiB3cm9uZyBvbmUuIEZJWE1FIGNhY2hpbmcgdGhlIGtleXJpbmcgaGVyZSBpcyB1c2VsZXNzIHNpbmNlIHdlIHVzZQorICAgKiBhIGRpZmZlcmVudCBEQnVzQXV0aCBmb3IgZXZlcnkgY29ubmVjdGlvbi4KKyAgICovCisgIGlmIChhdXRoLT5rZXlyaW5nICYmCisgICAgICAhX2RidXNfa2V5cmluZ19pc19mb3JfY3JlZGVudGlhbHMgKGF1dGgtPmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgKGF1dGgtPmtleXJpbmcpOworICAgICAgYXV0aC0+a2V5cmluZyA9IE5VTEw7CisgICAgfQorICAKKyAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBhdXRoLT5rZXlyaW5nID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworCisgICAgICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBFcnJvciBsb2FkaW5nIGtleXJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsgLyogcmV0dmFsIGlzIG9ubHkgYWJvdXQgbWVtICovCisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGF1dGgtPmtleXJpbmcgIT0gTlVMTCk7CisKKyAgYXV0aC0+Y29va2llX2lkID0gX2RidXNfa2V5cmluZ19nZXRfYmVzdF9rZXkgKGF1dGgtPmtleXJpbmcsICZlcnJvcik7CisgIGlmIChhdXRoLT5jb29raWVfaWQgPCAwKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IENvdWxkIG5vdCBnZXQgYSBjb29raWUgSUQgdG8gc2VuZCB0byBjbGllbnQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGlmIChzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmF1dGgtPmNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcDIpKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXAyLCAiICIpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZ0bXAyLCBhdXRoLT5jb29raWVfaWQpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcDIsICIgIikpCisgICAgZ290byBvdXQ7ICAKKyAgCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmdG1wLCBOX0NIQUxMRU5HRV9CWVRFUywgJmVycm9yKSkKKyAgICB7CisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBFcnJvciBnZW5lcmF0aW5nIGNoYWxsZW5nZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgICAgICByZXR2YWwgPSBUUlVFOyAvKiByZXR2YWwgaXMgb25seSBhYm91dCBtZW0gKi8KKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7CisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ0bXAsIDAsICZhdXRoLT5jaGFsbGVuZ2UsIDApKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJnRtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wMikpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghc2VuZF9kYXRhIChhdXRoLCAmdG1wMikpCisgICAgZ290byBvdXQ7CisgICAgICAKKyAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfemVybyAoJnRtcCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wKTsKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXAyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXAyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NoYTFfaGFuZGxlX3NlY29uZF9jbGllbnRfcmVzcG9uc2UgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAvKiBXZSBhcmUgZXhwZWN0aW5nIGEgcmVzcG9uc2Ugd2hpY2ggaXMgdGhlIGhleC1lbmNvZGVkIGNsaWVudAorICAgKiBjaGFsbGVuZ2UsIHNwYWNlLCB0aGVuIFNIQS0xIGhhc2ggb2YgdGhlIGNvbmNhdGVuYXRpb24gb2Ygb3VyCisgICAqIGNoYWxsZW5nZSwgIjoiLCBjbGllbnQgY2hhbGxlbmdlLCAiOiIsIHNlY3JldCBrZXksIGFsbAorICAgKiBoZXgtZW5jb2RlZC4KKyAgICovCisgIGludCBpOworICBEQnVzU3RyaW5nIGNsaWVudF9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY2xpZW50X2hhc2g7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1N0cmluZyBjb3JyZWN0X2hhc2g7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGRhdGEsIDAsICZpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IG5vIHNwYWNlIHNlcGFyYXRvciBpbiBjbGllbnQgcmVzcG9uc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfY2hhbGxlbmdlKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfaGFzaCkpCisgICAgZ290byBvdXRfMTsgIAorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLCAmY2xpZW50X2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY2xpZW50X2NoYWxsZW5nZSkgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjbGllbnRfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IHplcm8tbGVuZ3RoIGNsaWVudCBjaGFsbGVuZ2Ugb3IgaGFzaFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8yOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIGF1dGgtPmNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNoYWxsZW5nZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8zOworCisgIC8qIGlmIGNvb2tpZV9pZCB3YXMgaW52YWxpZCwgdGhlbiB3ZSBnZXQgYW4gZW1wdHkgaGFzaCAqLworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3JyZWN0X2hhc2gpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmNsaWVudF9oYXNoLCAmY29ycmVjdF9oYXNoKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8zOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIGdvdG8gb3V0XzM7CisKKyAgLyogQ29weSBwcm9jZXNzIElEIGZyb20gdGhlIHNvY2tldCBjcmVkZW50aWFscyBpZiBpdCdzIHRoZXJlCisgICAqLworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgZ290byBvdXRfMzsKKyAgCisgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgZ290byBvdXRfMzsKKworICBfZGJ1c192ZXJib3NlICgiJXM6IGF1dGhlbnRpY2F0ZWQgY2xpZW50IHVzaW5nIERCVVNfQ09PS0lFX1NIQTFcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXRfMzoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb3JyZWN0X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcnJlY3RfaGFzaCk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY2xpZW50X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNsaWVudF9oYXNoKTsKKyBvdXRfMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfMDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICBpZiAoYXV0aC0+Y29va2llX2lkIDwgMCkKKyAgICByZXR1cm4gc2hhMV9oYW5kbGVfZmlyc3RfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBzaGExX2hhbmRsZV9zZWNvbmRfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGF1dGgtPmNvb2tpZV9pZCA9IC0xOyAgCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+Y2hhbGxlbmdlLCAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXNwb25zZSkKK3sKKyAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ1c2VybmFtZSwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIG91dF8wOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgLyogVGhlIGRhdGEgd2UgZ2V0IGZyb20gdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGNvb2tpZSBjb250ZXh0CisgICAqIG5hbWUsIHRoZSBjb29raWUgSUQsIGFuZCB0aGUgc2VydmVyIGNoYWxsZW5nZSwgc2VwYXJhdGVkIGJ5CisgICAqIHNwYWNlcy4gV2Ugc2VuZCBiYWNrIG91ciBjaGFsbGVuZ2Ugc3RyaW5nIGFuZCB0aGUgY29ycmVjdCBoYXNoLgorICAgKi8KKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIERCdXNTdHJpbmcgY29udGV4dDsKKyAgREJ1c1N0cmluZyBjb29raWVfaWRfc3RyOworICBEQnVzU3RyaW5nIHNlcnZlcl9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY2xpZW50X2NoYWxsZW5nZTsKKyAgREJ1c1N0cmluZyBjb3JyZWN0X2hhc2g7CisgIERCdXNTdHJpbmcgdG1wOworICBpbnQgaSwgajsKKyAgbG9uZyB2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCAwLCAmaSkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsIDApKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoZGF0YSwgaSwgJmkpOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCBpLCAmaikpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzE7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb29raWVfaWRfc3RyKSkKKyAgICBnb3RvIG91dF8xOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGRhdGEsIGksIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvb2tpZV9pZF9zdHIsIDApKQorICAgIGdvdG8gb3V0XzI7ICAKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmVyX2NoYWxsZW5nZSkpCisgICAgZ290byBvdXRfMjsKKworICBpID0gajsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgaiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgaSwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyX2NoYWxsZW5nZSwgMCkpCisgICAgZ290byBvdXRfMzsKKworICBpZiAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2Vycm9yIChhdXRoLCAiU2VydmVyIHNlbnQgaW52YWxpZCBjb29raWUgY29udGV4dCIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmY29va2llX2lkX3N0ciwgMCwgJnZhbCwgTlVMTCkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJDb3VsZCBub3QgcGFyc2UgY29va2llIElEIGFzIGFuIGludGVnZXIiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzM7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNlcnZlcl9jaGFsbGVuZ2UpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJFbXB0eSBzZXJ2ZXIgY2hhbGxlbmdlIHN0cmluZyIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBhdXRoLT5rZXlyaW5nID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworCisgICAgICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0XzM7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRXJyb3IgbG9hZGluZyBrZXlyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChzZW5kX2Vycm9yIChhdXRoLCAiQ291bGQgbm90IGxvYWQgY29va2llIGZpbGUiKSkKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOyAvKiByZXR2YWwgaXMgb25seSBhYm91dCBtZW0gKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXRfMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICB9CisgICAgfQorICAKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5rZXlyaW5nICE9IE5VTEwpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRtcCkpCisgICAgZ290byBvdXRfMzsKKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJnRtcCwgTl9DSEFMTEVOR0VfQllURVMsICZlcnJvcikpCisgICAgeworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0XzQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEZhaWxlZCB0byBnZW5lcmF0ZSBjaGFsbGVuZ2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkZhaWxlZCB0byBnZW5lcmF0ZSBjaGFsbGVuZ2UiKSkKKyAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHZhbCBpcyBvbmx5IGFib3V0IG1lbSAqLworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0XzQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNsaWVudF9jaGFsbGVuZ2UpKQorICAgIGdvdG8gb3V0XzQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJmNsaWVudF9jaGFsbGVuZ2UsIDApKQorICAgIGdvdG8gb3V0XzU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfNTsKKyAgCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF82OworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcnJlY3RfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICAvKiBjb3VsZG4ndCBmaW5kIHRoZSBjb29raWUgSUQgb3Igc29tZXRoaW5nICovCisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkRvbid0IGhhdmUgdGhlIHJlcXVlc3RlZCBjb29raWUgSUQiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzY7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZ0bXAsIDApOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNsaWVudF9jaGFsbGVuZ2UsIDAsICZ0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wKSkpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXAsICIgIikpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29ycmVjdF9oYXNoLCAwLCAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCkpKQorICAgIGdvdG8gb3V0XzY7CisKKyAgaWYgKCFzZW5kX2RhdGEgKGF1dGgsICZ0bXApKQorICAgIGdvdG8gb3V0XzY7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF82OgorICBfZGJ1c19zdHJpbmdfemVybyAoJmNvcnJlY3RfaGFzaCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29ycmVjdF9oYXNoKTsKKyBvdXRfNToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfNDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7Cisgb3V0XzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmVyX2NoYWxsZW5nZSk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29va2llX2lkX3N0cik7Cisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dCk7Cisgb3V0XzA6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5jb29raWVfaWQgPSAtMTsgIAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7Cit9CisKKy8qCisgKiBFWFRFUk5BTCBtZWNoYW5pc20KKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRoLT5jcmVkZW50aWFscykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBubyBjcmVkZW50aWFscywgbWVjaGFuaXNtIEVYVEVSTkFMIGNhbid0IGF1dGhlbnRpY2F0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyaWVkIHRvIHNlbmQgdHdvIGF1dGggaWRlbnRpdGllcywgd3RmICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBjbGllbnQgdHJpZWQgdG8gc2VuZCBhdXRoIGlkZW50aXR5LCBidXQgd2UgYWxyZWFkeSBoYXZlIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogdGhpcyBpcyBvdXIgYXV0aCBpZGVudGl0eSAqLworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGRhdGEsIDAsICZhdXRoLT5pZGVudGl0eSwgMCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogUG9rZSBjbGllbnQgZm9yIGFuIGF1dGggaWRlbnRpdHksIGlmIG5vbmUgZ2l2ZW4gKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDAgJiYKKyAgICAgICFhdXRoLT5hbHJlYWR5X2Fza2VkX2Zvcl9pbml0aWFsX3Jlc3BvbnNlKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2RhdGEgKGF1dGgsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBzZW5kaW5nIGVtcHR5IGNoYWxsZW5nZSBhc2tpbmcgY2xpZW50IGZvciBhdXRoIGlkZW50aXR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYXV0aC0+YWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSA9IFRSVUU7CisgICAgICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyAgCisgIC8qIElmIGF1dGgtPmlkZW50aXR5IGlzIHN0aWxsIGVtcHR5IGhlcmUsIHRoZW4gY2xpZW50CisgICAqIHJlc3BvbmRlZCB3aXRoIGFuIGVtcHR5IHN0cmluZyBhZnRlciB3ZSBwb2tlZCBpdCBmb3IKKyAgICogYW4gaW5pdGlhbCByZXNwb25zZS4gVGhpcyBtZWFucyB0byB0cnkgdG8gYXV0aCB0aGUKKyAgICogaWRlbnRpdHkgcHJvdmlkZWQgaW4gdGhlIGNyZWRlbnRpYWxzLgorICAgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvKiBPT00gKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmlkZW50aXR5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogY291bGQgbm90IGdldCBjcmVkZW50aWFscyBmcm9tIHVpZCBzdHJpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGVzaXJlZCB1c2VyICVzIGlzIG5vIGdvb2RcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5pZGVudGl0eSkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICB7CisgICAgICAvKiBjbGllbnQgaGFzIGF1dGhlbnRpY2F0ZWQgKi8KKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIGFsc28gY29weSBtaXNjIHByb2Nlc3MgaW5mbyBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0xJTlVYX1NFQ1VSSVRZX0xBQkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBhdXRoZW50aWNhdGVkIGNsaWVudCBiYXNlZCBvbiBzb2NrZXQgY3JlZGVudGlhbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGRlc2lyZWQgaWRlbnRpdHkgbm90IGZvdW5kIGluIHNvY2tldCBjcmVkZW50aWFsc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3BvbnNlKQoreworICAvKiBXZSBhbHdheXMgYXBwZW5kIG91ciBVSUQgYXMgYW4gaW5pdGlhbCByZXNwb25zZSwgc28gdGhlIHNlcnZlcgorICAgKiBkb2Vzbid0IGhhdmUgdG8gc2VuZCBiYWNrIGFuIGVtcHR5IGNoYWxsZW5nZSB0byBjaGVjayB3aGV0aGVyIHdlCisgICAqIHdhbnQgdG8gc3BlY2lmeSBhbiBpZGVudGl0eS4gaS5lLiB0aGlzIGF2b2lkcyBhIHJvdW5kIHRyaXAgdGhhdAorICAgKiB0aGUgc3BlYyBmb3IgdGhlIEVYVEVSTkFMIG1lY2hhbmlzbSBvdGhlcndpc2UgcmVxdWlyZXMuCisgICAqLworICBEQnVzU3RyaW5nIHBsYWludGV4dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGxhaW50ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnBsYWludGV4dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnBsYWludGV4dCwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICByZXR1cm4gRkFMU0U7ICAKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2RhdGFfZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2V4dGVybmFsX21lY2ggKERCdXNBdXRoICphdXRoKQoreworCit9CisKKy8qCisgKiBBTk9OWU1PVVMgbWVjaGFuaXNtCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7ICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgLyogQ2xpZW50IGlzIGFsbG93ZWQgdG8gc2VuZCAidHJhY2UiIGRhdGEsIHRoZSBvbmx5IGRlZmluZWQKKyAgICAgICAqIG1lYW5pbmcgaXMgdGhhdCBpZiBpdCBjb250YWlucyAnQCcgaXQgaXMgYW4gZW1haWwgYWRkcmVzcywKKyAgICAgICAqIGFuZCBvdGhlcndpc2UgaXQgaXMgYW55dGhpbmcgZWxzZSwgYW5kIGl0J3Mgc3VwcG9zZWQgdG8gYmUKKyAgICAgICAqIFVURi04CisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKGRhdGEsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFJlY2VpdmVkIGludmFsaWQgVVRGLTggdHJhY2UgZGF0YSBmcm9tIEFOT05ZTU9VUyBjbGllbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBBTk9OWU1PVVMgY2xpZW50IHNlbnQgdHJhY2Ugc3RyaW5nOiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkYXRhKSk7CisgICAgfQorCisgIC8qIFdlIHdhbnQgdG8gYmUgYW5vbnltb3VzIChjbGVhciBpbiBjYXNlIHNvbWUgb3RoZXIgcHJvdG9jb2wgZ290IG1pZHdheSB0aHJvdWdoIEkgZ3Vlc3MpICovCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKworICAvKiBDb3B5IHByb2Nlc3MgSUQgZnJvbSB0aGUgc29ja2V0IGNyZWRlbnRpYWxzCisgICAqLworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgLyogQW5vbnltb3VzIGlzIGFsd2F5cyBhbGxvd2VkICovCisgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCIlczogYXV0aGVudGljYXRlZCBjbGllbnQgYXMgYW5vbnltb3VzXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzcG9uc2UpCit7CisgIC8qIE91ciBpbml0aWFsIHJlc3BvbnNlIGlzIGEgInRyYWNlIiBzdHJpbmcgd2hpY2ggbXVzdCBiZSB2YWxpZCBVVEYtOAorICAgKiBhbmQgbXVzdCBiZSBhbiBlbWFpbCBhZGRyZXNzIGlmIGl0IGNvbnRhaW5zICdAJy4KKyAgICogV2UganVzdCBzZW5kIHRoZSBkYnVzIGltcGxlbWVudGF0aW9uIGluZm8sIGxpa2UgYSB1c2VyLWFnZW50IG9yCisgICAqIHNvbWV0aGluZywgYmVjYXVzZS4uLiB3aHkgbm90LiBUaGVyZSdzIG5vdGhpbmcgZ3VhcmFudGVlZCBoZXJlCisgICAqIHRob3VnaCwgd2UgY291bGQgY2hhbmdlIGl0IGxhdGVyLgorICAgKi8KKyAgREJ1c1N0cmluZyBwbGFpbnRleHQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBsYWludGV4dCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGliZGJ1cyAiIERCVVNfVkVSU0lPTl9TVFJJTkcpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZwbGFpbnRleHQsIDAsCisJCQkJcmVzcG9uc2UsCisJCQkJX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJlc3BvbnNlKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgcmV0dXJuIEZBTFNFOyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9jbGllbnRfc2h1dGRvd25fYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICAKK30KKworLyogUHV0IG1lY2hhbmlzbXMgaGVyZSBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICogUmlnaHQgbm93IHdlIGhhdmU6CisgKgorICogLSBFWFRFUk5BTCBjaGVja3Mgc29ja2V0IGNyZWRlbnRpYWxzIChvciBpbiB0aGUgZnV0dXJlLCBvdGhlciBpbmZvIGZyb20gdGhlIE9TKQorICogLSBEQlVTX0NPT0tJRV9TSEExIHVzZXMgYSBjb29raWUgaW4gdGhlIGhvbWUgZGlyZWN0b3J5LCBsaWtlIHhhdXRoIG9yIElDRQorICogLSBBTk9OWU1PVVMgY2hlY2tzIG5vdGhpbmcgYnV0IGRvZXNuJ3QgYXV0aCB0aGUgcGVyc29uIGFzIGEgdXNlcgorICoKKyAqIFdlIG1pZ2h0IGlkZWFsbHkgYWRkIGEgbWVjaGFuaXNtIHRvIGNoYWluIHRvIEN5cnVzIFNBU0wgc28gd2UgY2FuCisgKiB1c2UgaXRzIG1lY2hhbmlzbXMgYXMgd2VsbC4KKyAqIAorICovCitzdGF0aWMgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyCithbGxfbWVjaGFuaXNtc1tdID0geworICB7ICJFWFRFUk5BTCIsCisgICAgaGFuZGxlX3NlcnZlcl9kYXRhX2V4dGVybmFsX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2V4dGVybmFsX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2V4dGVybmFsX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9kYXRhX2V4dGVybmFsX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2V4dGVybmFsX21lY2ggfSwKKyAgeyAiREJVU19DT09LSUVfU0hBMSIsCisgICAgaGFuZGxlX3NlcnZlcl9kYXRhX2Nvb2tpZV9zaGExX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Nvb2tpZV9zaGExX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggfSwKKyAgeyAiQU5PTllNT1VTIiwKKyAgICBoYW5kbGVfc2VydmVyX2RhdGFfYW5vbnltb3VzX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2Fub255bW91c19tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9hbm9ueW1vdXNfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2RhdGFfYW5vbnltb3VzX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2Fub255bW91c19tZWNoIH0sICAKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIqCitmaW5kX21lY2ggKGNvbnN0IERCdXNTdHJpbmcgICpuYW1lLAorICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqYWxsb3dlZF9tZWNocykKK3sKKyAgaW50IGk7CisgIAorICBpZiAoYWxsb3dlZF9tZWNocyAhPSBOVUxMICYmCisgICAgICAhX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhcioqKSBhbGxvd2VkX21lY2hzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChuYW1lKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSAhPSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20pKQorCisgICAgICAgIHJldHVybiAmYWxsX21lY2hhbmlzbXNbaV07CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2F1dGggKERCdXNBdXRoICphdXRoLCBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2gpCit7CisgIERCdXNTdHJpbmcgYXV0aF9jb21tYW5kOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoX2NvbW1hbmQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoX2NvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFVVEggIikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2gtPm1lY2hhbmlzbSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobWVjaC0+Y2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZnVuYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGhfY29tbWFuZCwgIiAiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCEoKiBtZWNoLT5jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9mdW5jKSAoYXV0aCwgJmF1dGhfY29tbWFuZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYXV0aF9jb21tYW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgc2h1dGRvd25fbWVjaCAoYXV0aCk7CisgIGF1dGgtPm1lY2ggPSBtZWNoOyAgICAgIAorICBnb3RvX3N0YXRlIChhdXRoLCAmY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfZGF0YSAoREJ1c0F1dGggKmF1dGgsIERCdXNTdHJpbmcgKmRhdGEpCit7CisgIGludCBvbGRfbGVuOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID09IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkRBVEFcclxuIik7CisgIGVsc2UKKyAgICB7CisgICAgICBvbGRfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZyk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkRBVEEgIikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlIChkYXRhLCAwLCAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIlxyXG4iKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgb3V0OgorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZywgb2xkX2xlbik7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9yZWplY3RlZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIERCdXNTdHJpbmcgY29tbWFuZDsKKyAgREJ1c0F1dGhTZXJ2ZXIgKnNlcnZlcl9hdXRoOworICBpbnQgaTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb21tYW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUpFQ1RFRCIpKQorICAgIGdvdG8gbm9tZW07CisKKyAgaSA9IDA7CisgIHdoaWxlIChhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpKQorICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICArK2k7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwgIlxyXG4iKSkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjb21tYW5kLCAwLCAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSkKKyAgICBnb3RvIG5vbWVtOworCisgIHNodXRkb3duX21lY2ggKGF1dGgpOworICAKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0FVVEhfSVNfU0VSVkVSIChhdXRoKSk7CisgIHNlcnZlcl9hdXRoID0gREJVU19BVVRIX1NFUlZFUiAoYXV0aCk7CisgIHNlcnZlcl9hdXRoLT5mYWlsdXJlcyArPSAxOworCisgIGlmIChzZXJ2ZXJfYXV0aC0+ZmFpbHVyZXMgPj0gc2VydmVyX2F1dGgtPm1heF9mYWlsdXJlcykKKyAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgIGVsc2UKKyAgICBnb3RvX3N0YXRlIChhdXRoLCAmc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGgpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9lcnJvciAoREJ1c0F1dGggKmF1dGgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUiBcIiVzXCJcclxuIiwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9vayAoREJ1c0F1dGggKmF1dGgpCit7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIk9LICIpICYmCisgICAgICBfZGJ1c19zdHJpbmdfY29weSAoJiBEQlVTX0FVVEhfU0VSVkVSIChhdXRoKS0+Z3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSkgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIlxyXG4iKSkKKyAgICB7CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcsIG9yaWdfbGVuKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9iZWdpbiAoREJ1c0F1dGggICAgICAgICAqYXV0aCkKK3sKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkVHSU5cclxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3Nfb2soREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJnc19mcm9tX29rKSB7CisKKyAgaW50IGVuZF9vZl9oZXg7CisgIAorICAvKiAiYXJnc19mcm9tX29rIiBzaG91bGQgYmUgdGhlIEdVSUQsIHdoaXRlc3BhY2UgYWxyZWFkeSBwdWxsZWQgb2ZmIHRoZSBmcm9udCAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyKSA9PSAwKTsKKworICAvKiBXZSBkZWNvZGUgdGhlIGhleCBzdHJpbmcgdG8gYmluYXJ5LCB1c2luZyBndWlkX2Zyb21fc2VydmVyIGFzIHNjcmF0Y2guLi4gKi8KKyAgCisgIGVuZF9vZl9oZXggPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlIChhcmdzX2Zyb21fb2ssIDAsICZlbmRfb2ZfaGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogbm93IGNsZWFyIG91dCB0aGUgc2NyYXRjaCAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciwgMCk7CisgIAorICBpZiAoZW5kX29mX2hleCAhPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXJnc19mcm9tX29rKSB8fAorICAgICAgZW5kX29mX2hleCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWQgR1VJRCBmcm9tIHNlcnZlciwgcGFyc2VkICVkIGJ5dGVzIGFuZCBoYWQgJWQgYnl0ZXMgZnJvbSBzZXJ2ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICBlbmRfb2ZfaGV4LCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXJnc19mcm9tX29rKSk7CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYXJnc19mcm9tX29rLCAwLCAmREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIsIDApKSB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciwgMCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBfZGJ1c192ZXJib3NlICgiR290IEdVSUQgJyVzJyBmcm9tIHRoZSBzZXJ2ZXJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcikpOworCisgIGlmIChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKQorICAgIHJldHVybiBzZW5kX25lZ290aWF0ZV91bml4X2ZkKGF1dGgpOworCisgIF9kYnVzX3ZlcmJvc2UoIk5vdCBuZWdvdGlhdGluZyB1bml4IGZkIHBhc3NpbmcsIHNpbmNlIG5vdCBwb3NzaWJsZVxuIik7CisgIHJldHVybiBzZW5kX2JlZ2luIChhdXRoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2NhbmNlbCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aC0+b3V0Z29pbmcsICJDQU5DRUxcclxuIikpCisgICAgeworICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfZGF0YSAoREJ1c0F1dGggICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICphcmdzLAorICAgICAgICAgICAgICBEQnVzQXV0aERhdGFGdW5jdGlvbiAgZGF0YV9mdW5jKQoreworICBpbnQgZW5kOworICBEQnVzU3RyaW5nIGRlY29kZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRlY29kZWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlIChhcmdzLCAwLCAmZW5kLCAmZGVjb2RlZCwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzKSAhPSBlbmQpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgICAgIGlmICghc2VuZF9lcnJvciAoYXV0aCwgIkludmFsaWQgaGV4IGVuY29kaW5nIikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGlmIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKCZkZWNvZGVkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlY29kZWQpKSkKKyAgICBfZGJ1c192ZXJib3NlICgiJXM6IGRhdGE6ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRlY29kZWQpKTsKKyNlbmRpZgorICAgICAgCisgIGlmICghKCogZGF0YV9mdW5jKSAoYXV0aCwgJmRlY29kZWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfbmVnb3RpYXRlX3VuaXhfZmQgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkVHT1RJQVRFX1VOSVhfRkRcclxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdvdG9fc3RhdGUgKGF1dGgsICZjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfYWdyZWVfdW5peF9mZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIF9kYnVzX2Fzc2VydChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKTsKKworICBhdXRoLT51bml4X2ZkX25lZ290aWF0ZWQgPSBUUlVFOworICBfZGJ1c192ZXJib3NlKCJBZ3JlZWQgdG8gVU5JWCBGRCBwYXNzaW5nXG4iKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUdSRUVfVU5JWF9GRFxyXG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9iZWdpbik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9hdXRoIChEQnVzQXV0aCAqYXV0aCwgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIE5vIGFyZ3MgdG8gdGhlIGF1dGgsIHNlbmQgbWVjaGFuaXNtcyAqLworICAgICAgaWYgKCFzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIERCdXNTdHJpbmcgbWVjaDsKKyAgICAgIERCdXNTdHJpbmcgaGV4X3Jlc3BvbnNlOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoYXJncywgMCwgJmkpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbWVjaCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmhleF9yZXNwb25zZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm1lY2gpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoYXJncywgMCwgaSwgJm1lY2gsIDApKQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGFyZ3MsIGksICZpKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGFyZ3MsIGksICZoZXhfcmVzcG9uc2UsIDApKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgCisgICAgICBhdXRoLT5tZWNoID0gZmluZF9tZWNoICgmbWVjaCwgYXV0aC0+YWxsb3dlZF9tZWNocyk7CisgICAgICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBUcnlpbmcgbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5tZWNoLT5tZWNoYW5pc20pOworICAgICAgICAgIAorICAgICAgICAgIGlmICghcHJvY2Vzc19kYXRhIChhdXRoLCAmaGV4X3Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGF0YV9mdW5jKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVbnN1cHBvcnRlZCBtZWNoYW5pc20gKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFVuc3VwcG9ydGVkIG1lY2hhbmlzbSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbWVjaCkpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm1lY2gpOyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZoZXhfcmVzcG9uc2UpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIAorICAgIGZhaWxlZDoKKyAgICAgIGF1dGgtPm1lY2ggPSBOVUxMOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZWNoKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmaGV4X3Jlc3BvbnNlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICAgIHJldHVybiBoYW5kbGVfYXV0aCAoYXV0aCwgYXJncyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIk5vdCBjdXJyZW50bHkgaW4gYW4gYXV0aCBjb252ZXJzYXRpb24iKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJOZWVkIHRvIGF1dGhlbnRpY2F0ZSBmaXJzdCIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlNlbnQgQVVUSCB3aGlsZSBhbm90aGVyIEFVVEggaW4gcHJvZ3Jlc3MiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgICByZXR1cm4gcHJvY2Vzc19kYXRhIChhdXRoLCBhcmdzLCBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGF0YV9mdW5jKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIk5lZWQgdG8gYXV0aGVudGljYXRlIGZpcnN0Iik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9iZWdpbiAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiU2VudCBBVVRIIHdoaWxlIGV4cGVjdGluZyBCRUdJTiIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJTZW50IERBVEEgd2hpbGUgZXhwZWN0aW5nIEJFR0lOIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKTsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICAgIGlmIChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKQorICAgICAgICByZXR1cm4gc2VuZF9hZ3JlZV91bml4X2ZkKGF1dGgpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2VuZF9lcnJvcihhdXRoLCAiVW5peCBGRCBwYXNzaW5nIG5vdCBzdXBwb3J0ZWQsIG5vdCBhdXRoZW50aWNhdGVkIG9yIG90aGVyd2lzZSBub3QgcG9zc2libGUiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICB9Cit9CisKKy8qIHJldHVybiBGQUxTRSBpZiBubyBtZW1vcnksIFRSVUUgaWYgYWxsIE9LICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF93b3JkIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc3RhcnQsCisgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqd29yZCkKK3sKKyAgaW50IGk7CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgKnN0YXJ0LCBzdGFydCk7CisgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsICpzdGFydCwgJmkpOworICAKKyAgaWYgKGkgPiAqc3RhcnQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKHN0ciwgKnN0YXJ0LCBpIC0gKnN0YXJ0LCB3b3JkLCAwKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICAqc3RhcnQgPSBpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZWNvcmRfbWVjaGFuaXNtcyAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBpbnQgbmV4dDsKKyAgaW50IGxlbjsKKworICBpZiAoYXV0aC0+YWxyZWFkeV9nb3RfbWVjaGFuaXNtcykKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzKTsKKyAgCisgIG5leHQgPSAwOworICB3aGlsZSAobmV4dCA8IGxlbikKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIG07CisgICAgICBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2g7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZtKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIAorICAgICAgaWYgKCFnZXRfd29yZCAoYXJncywgJm5leHQsICZtKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbSk7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorCisgICAgICBtZWNoID0gZmluZF9tZWNoICgmbSwgYXV0aC0+YWxsb3dlZF9tZWNocyk7CisKKyAgICAgIGlmIChtZWNoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSByaWdodCBub3cgd2UgdHJ5IG1lY2hhbmlzbXMgaW4gdGhlIG9yZGVyCisgICAgICAgICAgICogdGhlIHNlcnZlciBsaXN0cyB0aGVtOyBzaG91bGQgd2UgZG8gdGhlbSBpbgorICAgICAgICAgICAqIHNvbWUgbW9yZSBkZXRlcm1pbmlzdGljIG9yZGVyPworICAgICAgICAgICAqCisgICAgICAgICAgICogUHJvYmFibHkgaW4gYWxsX21lY2hhbmlzbXMgb3JkZXIsIG91ciBvcmRlciBvZgorICAgICAgICAgICAqIHByZWZlcmVuY2UuIE9mIGNvdXJzZSB3aGVuIHRoZSBzZXJ2ZXIgaXMgdXMsCisgICAgICAgICAgICogaXQgbGlzdHMgdGhpbmdzIGluIHRoYXQgb3JkZXIgYW55aG93LgorICAgICAgICAgICAqLworCisgICAgICAgICAgaWYgKG1lY2ggIT0gJmFsbF9tZWNoYW5pc21zWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEFkZGluZyBtZWNoYW5pc20gJXMgdG8gbGlzdCB3ZSB3aWxsIHRyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBtZWNoLT5tZWNoYW5pc20pOworICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5tZWNoc190b190cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgbWVjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBBbHJlYWR5IHRyaWVkIG1lY2hhbmlzbSAlczsgbm90IGFkZGluZyB0byBsaXN0IHdlIHdpbGwgdHJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIG1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogU2VydmVyIG9mZmVyZWQgbWVjaGFuaXNtIFwiJXNcIiB0aGF0IHdlIGRvbid0IGtub3cgaG93IHRvIHVzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbSkpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbSk7CisgICAgfQorICAKKyAgYXV0aC0+YWxyZWFkeV9nb3RfbWVjaGFuaXNtcyA9IFRSVUU7CisgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBfZGJ1c19saXN0X2NsZWFyICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5tZWNoc190b190cnkpOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfcmVqZWN0ZWQgKERCdXNBdXRoICphdXRoLCBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2g7CisgIERCdXNBdXRoQ2xpZW50ICpjbGllbnQ7CisKKyAgY2xpZW50ID0gREJVU19BVVRIX0NMSUVOVCAoYXV0aCk7CisKKyAgaWYgKCFhdXRoLT5hbHJlYWR5X2dvdF9tZWNoYW5pc21zKQorICAgIHsKKyAgICAgIGlmICghcmVjb3JkX21lY2hhbmlzbXMgKGF1dGgsIGFyZ3MpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5tZWNoc190b190cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZWNoID0gY2xpZW50LT5tZWNoc190b190cnktPmRhdGE7CisKKyAgICAgIGlmICghc2VuZF9hdXRoIChhdXRoLCBtZWNoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNsaWVudC0+bWVjaHNfdG9fdHJ5KTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBUcnlpbmcgbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgbWVjaC0+bWVjaGFuaXNtKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBHaXZlIHVwICovCisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IERpc2Nvbm5lY3RpbmcgYmVjYXVzZSB3ZSBhcmUgb3V0IG9mIG1lY2hhbmlzbXMgdG8gdHJ5IHVzaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5tZWNoICE9IE5VTEwpOworIAorICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBwcm9jZXNzX2RhdGEgKGF1dGgsIGFyZ3MsIGF1dGgtPm1lY2gtPmNsaWVudF9kYXRhX2Z1bmMpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICAgIHJldHVybiBwcm9jZXNzX3JlamVjdGVkIChhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgICByZXR1cm4gcHJvY2Vzc19vayhhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9jYW5jZWwgKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX29rIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICAgIHJldHVybiBwcm9jZXNzX3JlamVjdGVkIChhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgICByZXR1cm4gcHJvY2Vzc19vayhhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfY2FuY2VsIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgICByZXR1cm4gcHJvY2Vzc19yZWplY3RlZCAoYXV0aCwgYXJncyk7CisgICAgICAKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfYWdyZWVfdW5peF9mZChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgICBfZGJ1c19hc3NlcnQoYXV0aC0+dW5peF9mZF9wb3NzaWJsZSk7CisgICAgICBhdXRoLT51bml4X2ZkX25lZ290aWF0ZWQgPSBUUlVFOworICAgICAgX2RidXNfdmVyYm9zZSgiU3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgVU5JWCBGRCBwYXNzaW5nXG4iKTsKKyAgICAgIHJldHVybiBzZW5kX2JlZ2luIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICBfZGJ1c19hc3NlcnQoYXV0aC0+dW5peF9mZF9wb3NzaWJsZSk7CisgICAgICBhdXRoLT51bml4X2ZkX25lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UoIkZhaWxlZCB0byBuZWdvdGlhdGUgVU5JWCBGRCBwYXNzaW5nXG4iKTsKKyAgICAgIHJldHVybiBzZW5kX2JlZ2luIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCisvKioKKyAqIE1hcHBpbmcgZnJvbSBjb21tYW5kIG5hbWUgdG8gZW51bQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAvKio8IE5hbWUgb2YgdGhlIGNvbW1hbmQgKi8KKyAgREJ1c0F1dGhDb21tYW5kIGNvbW1hbmQ7IC8qKjwgQ29ycmVzcG9uZGluZyBlbnVtICovCit9IERCdXNBdXRoQ29tbWFuZE5hbWU7CisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aENvbW1hbmROYW1lIGF1dGhfY29tbWFuZF9uYW1lc1tdID0geworICB7ICJBVVRIIiwgICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0FVVEggfSwKKyAgeyAiQ0FOQ0VMIiwgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUwgfSwKKyAgeyAiREFUQSIsICAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9EQVRBIH0sCisgIHsgIkJFR0lOIiwgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfQkVHSU4gfSwKKyAgeyAiUkVKRUNURUQiLCAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRCB9LAorICB7ICJPSyIsICAgICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX09LIH0sCisgIHsgIkVSUk9SIiwgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfRVJST1IgfSwKKyAgeyAiTkVHT1RJQVRFX1VOSVhfRkQiLCBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRCB9LAorICB7ICJBR1JFRV9VTklYX0ZEIiwgICAgIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQgfQorfTsKKworc3RhdGljIERCdXNBdXRoQ29tbWFuZAorbG9va3VwX2NvbW1hbmRfZnJvbV9uYW1lIChEQnVzU3RyaW5nICpjb21tYW5kKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgX0RCVVNfTl9FTEVNRU5UUyAoYXV0aF9jb21tYW5kX25hbWVzKTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbW1hbmRfbmFtZXNbaV0ubmFtZSkpCisgICAgICAgIHJldHVybiBhdXRoX2NvbW1hbmRfbmFtZXNbaV0uY29tbWFuZDsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV047Cit9CisKK3N0YXRpYyB2b2lkCitnb3RvX3N0YXRlIChEQnVzQXV0aCAqYXV0aCwKKyAgICAgICAgICAgIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhICpzdGF0ZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBnb2luZyBmcm9tIHN0YXRlICVzIHRvIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgIGF1dGgtPnN0YXRlLT5uYW1lLAorICAgICAgICAgICAgICAgICBzdGF0ZS0+bmFtZSk7CisKKyAgYXV0aC0+c3RhdGUgPSBzdGF0ZTsKK30KKworLyogcmV0dXJucyB3aGV0aGVyIHRvIGNhbGwgaXQgYWdhaW4gcmlnaHQgYXdheSAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbW1hbmQgKERCdXNBdXRoICphdXRoKQoreworICBEQnVzQXV0aENvbW1hbmQgY29tbWFuZDsKKyAgREJ1c1N0cmluZyBsaW5lOworICBEQnVzU3RyaW5nIGFyZ3M7CisgIGludCBlb2w7CisgIGludCBpLCBqOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgLyogX2RidXNfdmVyYm9zZSAoIiVzOiAgIHRyeWluZyBwcm9jZXNzX2NvbW1hbmQoKVxuIik7ICovCisgIAorICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGVvbCA9IDA7CisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZhdXRoLT5pbmNvbWluZywgMCwgIlxyXG4iLCAmZW9sKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgeworICAgICAgYXV0aC0+bmVlZGVkX21lbW9yeSA9IFRSVUU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhcmdzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworICAgICAgYXV0aC0+bmVlZGVkX21lbW9yeSA9IFRSVUU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZhdXRoLT5pbmNvbWluZywgMCwgZW9sLCAmbGluZSwgMCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKCZsaW5lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBDb21tYW5kIGNvbnRhaW5lZCBub24tQVNDSUkgY2hhcnMgb3IgZW1iZWRkZWQgbnVsXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgIGlmICghc2VuZF9lcnJvciAoYXV0aCwgIkNvbW1hbmQgY29udGFpbmVkIG5vbi1BU0NJSSIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBuZXh0X2NvbW1hbmQ7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBnb3QgY29tbWFuZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbGluZSkpOworICAKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKCZsaW5lLCAwLCAmaSk7CisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rICgmbGluZSwgaSwgJmopOworCisgIGlmIChqID4gaSkKKyAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmbGluZSwgaSwgaiAtIGkpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJmxpbmUsIGksICZhcmdzLCAwKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBGSVhNRSAxLjAgd2Ugc2hvdWxkIHByb2JhYmx5IHZhbGlkYXRlIHRoYXQgb25seSB0aGUgYWxsb3dlZAorICAgKiBjaGFycyBhcmUgaW4gdGhlIGNvbW1hbmQgbmFtZQorICAgKi8KKyAgCisgIGNvbW1hbmQgPSBsb29rdXBfY29tbWFuZF9mcm9tX25hbWUgKCZsaW5lKTsKKyAgaWYgKCEoKiBhdXRoLT5zdGF0ZS0+aGFuZGxlcikgKGF1dGgsIGNvbW1hbmQsICZhcmdzKSkKKyAgICBnb3RvIG91dDsKKworIG5leHRfY29tbWFuZDoKKyAgCisgIC8qIFdlJ3ZlIHN1Y2NlZWRlZCBpbiBwcm9jZXNzaW5nIHRoZSB3aG9sZSBjb21tYW5kIHNvIGRyb3AgaXQgb3V0CisgICAqIG9mIHRoZSBpbmNvbWluZyBidWZmZXIgYW5kIHJldHVybiBUUlVFIHRvIHRyeSBhbm90aGVyIGNvbW1hbmQuCisgICAqLworCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZhdXRoLT5pbmNvbWluZywgMCwgZW9sKTsKKyAgCisgIC8qIGtpbGwgdGhlIFxyXG4gKi8KKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmF1dGgtPmluY29taW5nLCAwLCAyKTsKKworICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJncyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgYXV0aC0+bmVlZGVkX21lbW9yeSA9IFRSVUU7CisgIGVsc2UKKyAgICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gRkFMU0U7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBdXRoCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBhdXRoIGNvbnZlcnNhdGlvbiBvYmplY3QgZm9yIHRoZSBzZXJ2ZXIgc2lkZS4KKyAqIFNlZSBodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI2F1dGgtcHJvdG9jb2wKKyAqIGZvciBmdWxsIGRldGFpbHMgb24gd2hhdCB0aGlzIG9iamVjdCBkb2VzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQXV0aCoKK19kYnVzX2F1dGhfc2VydmVyX25ldyAoY29uc3QgREJ1c1N0cmluZyAqZ3VpZCkKK3sKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNBdXRoU2VydmVyICpzZXJ2ZXJfYXV0aDsKKyAgREJ1c1N0cmluZyBndWlkX2NvcHk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmd1aWRfY29weSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZ3VpZCwgMCwgJmd1aWRfY29weSwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZndWlkX2NvcHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGF1dGggPSBfZGJ1c19hdXRoX25ldyAoc2l6ZW9mIChEQnVzQXV0aFNlcnZlcikpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZ3VpZF9jb3B5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGF1dGgtPnNpZGUgPSBhdXRoX3NpZGVfc2VydmVyOworICBhdXRoLT5zdGF0ZSA9ICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aDsKKworICBzZXJ2ZXJfYXV0aCA9IERCVVNfQVVUSF9TRVJWRVIgKGF1dGgpOworCisgIHNlcnZlcl9hdXRoLT5ndWlkID0gZ3VpZF9jb3B5OworICAKKyAgLyogcGVyaGFwcyB0aGlzIHNob3VsZCBiZSBwZXItbWVjaGFuaXNtIHdpdGggYSBsb3dlcgorICAgKiBtYXgKKyAgICovCisgIHNlcnZlcl9hdXRoLT5mYWlsdXJlcyA9IDA7CisgIHNlcnZlcl9hdXRoLT5tYXhfZmFpbHVyZXMgPSA2OworICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBhdXRoIGNvbnZlcnNhdGlvbiBvYmplY3QgZm9yIHRoZSBjbGllbnQgc2lkZS4KKyAqIFNlZSBodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI2F1dGgtcHJvdG9jb2wKKyAqIGZvciBmdWxsIGRldGFpbHMgb24gd2hhdCB0aGlzIG9iamVjdCBkb2VzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQXV0aCoKK19kYnVzX2F1dGhfY2xpZW50X25ldyAodm9pZCkKK3sKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNTdHJpbmcgZ3VpZF9zdHI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmd1aWRfc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBhdXRoID0gX2RidXNfYXV0aF9uZXcgKHNpemVvZiAoREJ1c0F1dGhDbGllbnQpKTsKKyAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfc3RyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciA9IGd1aWRfc3RyOworCisgIGF1dGgtPnNpZGUgPSBhdXRoX3NpZGVfY2xpZW50OworICBhdXRoLT5zdGF0ZSA9ICZjbGllbnRfc3RhdGVfbmVlZF9zZW5kX2F1dGg7CisKKyAgLyogU3RhcnQgdGhlIGF1dGggY29udmVyc2F0aW9uIGJ5IHNlbmRpbmcgQVVUSCBmb3Igb3VyIGRlZmF1bHQKKyAgICogbWVjaGFuaXNtICovCisgIGlmICghc2VuZF9hdXRoIChhdXRoLCAmYWxsX21lY2hhbmlzbXNbMF0pKQorICAgIHsKKyAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqLworREJ1c0F1dGggKgorX2RidXNfYXV0aF9yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIAorICBhdXRoLT5yZWZjb3VudCArPSAxOworICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfdW5yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+cmVmY291bnQgPiAwKTsKKworICBhdXRoLT5yZWZjb3VudCAtPSAxOworICBpZiAoYXV0aC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBzaHV0ZG93bl9tZWNoIChhdXRoKTsKKworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoREJVU19BVVRIX0lTX1NFUlZFUiAoYXV0aCkpOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX1NFUlZFUiAoYXV0aCktPmd1aWQpOworICAgICAgICB9CisKKyAgICAgIGlmIChhdXRoLT5rZXlyaW5nKQorICAgICAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChhdXRoLT5rZXlyaW5nKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jb250ZXh0KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y2hhbGxlbmdlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+aWRlbnRpdHkpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pbmNvbWluZyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPm91dGdvaW5nKTsKKworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXV0aC0+YWxsb3dlZF9tZWNocyk7CisKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5jcmVkZW50aWFscyk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYXV0aCk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgYW4gYXJyYXkgb2YgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIG5hbWVzCisgKiB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIHVzZS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBtZWNoYW5pc21zICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtIG5hbWVzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zIChEQnVzQXV0aCAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiptZWNoYW5pc21zKQoreworICBjaGFyICoqY29weTsKKworICBpZiAobWVjaGFuaXNtcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvcHkgPSBfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChtZWNoYW5pc21zKTsKKyAgICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBjb3B5ID0gTlVMTDsKKyAgCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGF1dGgtPmFsbG93ZWRfbWVjaHMpOworCisgIGF1dGgtPmFsbG93ZWRfbWVjaHMgPSBjb3B5OworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlJ3JlIGluIGEgZmluYWwgc3RhdGUKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfSU5fRU5EX1NUQVRFKGF1dGgpICgoYXV0aCktPnN0YXRlLT5oYW5kbGVyID09IE5VTEwpCisKKy8qKgorICogQW5hbHl6ZXMgYnVmZmVyZWQgaW5wdXQgYW5kIG1vdmVzIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBmb3J3YXJkLAorICogcmV0dXJuaW5nIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGF1dGggY29udmVyc2F0aW9uLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgdGhlIG5ldyBzdGF0ZQorICovCitEQnVzQXV0aFN0YXRlCitfZGJ1c19hdXRoX2RvX3dvcmsgKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gRkFMU0U7CisKKyAgLyogTWF4IGFtb3VudCB3ZSdsbCBidWZmZXIgdXAgYmVmb3JlIGRlY2lkaW5nIHNvbWVvbmUncyBvbiBjcmFjayAqLworI2RlZmluZSBNQVhfQlVGRkVSICgxNiAqIF9EQlVTX09ORV9LSUxPQllURSkKKworICBkbworICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSU5fRU5EX1NUQVRFIChhdXRoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nKSA+IE1BWF9CVUZGRVIgfHwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSA+IE1BWF9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBEaXNjb25uZWN0aW5nIGR1ZSB0byBleGNlc3NpdmUgZGF0YSBidWZmZXJlZCBpbiBhdXRoIHBoYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxlIChwcm9jZXNzX2NvbW1hbmQgKGF1dGgpKTsKKworICBpZiAoYXV0aC0+bmVlZGVkX21lbW9yeSkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWTsKKyAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykgPiAwKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOworICBlbHNlIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDsKKyAgZWxzZSBpZiAoYXV0aC0+c3RhdGUgPT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZSByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOworfQorCisvKioKKyAqIEdldHMgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIHBlZXIgd2UncmUgY29udmVyc2luZyB3aXRoLgorICogQWZ0ZXIgd3JpdGluZyBzb21lIGJ5dGVzLCBfZGJ1c19hdXRoX2J5dGVzX3NlbnQoKSBtdXN0IGJlIGNhbGxlZAorICogdG8gbm90aWZ5IHRoZSBhdXRoIG9iamVjdCB0aGF0IHRoZXkgd2VyZSB3cml0dGVuLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIHN0ciByZXR1cm4gbG9jYXRpb24gZm9yIGEgcmVmIHRvIHRoZSBidWZmZXIgdG8gc2VuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdGhpbmcgdG8gc2VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAoREJ1c0F1dGggICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworCisgICpzdHIgPSBOVUxMOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdHIgPSAmYXV0aC0+b3V0Z29pbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTm90aWZpZXMgdGhlIGF1dGggY29udmVyc2F0aW9uIG9iamVjdCB0aGF0CisgKiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBvdXRnb2luZyBidWZmZXIKKyAqIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBieXRlc19zZW50IG51bWJlciBvZiBieXRlcyB3cml0dGVuIG91dAorICovCit2b2lkCitfZGJ1c19hdXRoX2J5dGVzX3NlbnQgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgYnl0ZXNfc2VudCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBTZW50ICVkIGJ5dGVzIG9mOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBieXRlc19zZW50LAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5vdXRnb2luZykpOworICAKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBieXRlc19zZW50KTsKK30KKworLyoqCisgKiBHZXQgYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgcmVhZGluZyBieXRlcyBmcm9tIHRoZSBwZWVyIHdlJ3JlIGNvbnZlcnNpbmcKKyAqIHdpdGguIEJ5dGVzIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgcmV0dXJuIGxvY2F0aW9uIGZvciBidWZmZXIgdG8gYXBwZW5kIGJ5dGVzIHRvCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X2J1ZmZlciAoREJ1c0F1dGggICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICoqYnVmZmVyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIWF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIAorICAqYnVmZmVyID0gJmF1dGgtPmluY29taW5nOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IFRSVUU7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGJ1ZmZlciB3aXRoIG5ldyBkYXRhIHJlYWQgaW50byBpdC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBiZWluZyByZXR1cm5lZAorICovCit2b2lkCitfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKmJ1ZmZlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgPT0gJmF1dGgtPmluY29taW5nKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5idWZmZXJfb3V0c3RhbmRpbmcpOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IEZBTFNFOworfQorCisvKioKKyAqIFJldHVybnMgbGVmdG92ZXIgYnl0ZXMgdGhhdCB3ZXJlIG5vdCB1c2VkIGFzIHBhcnQgb2YgdGhlIGF1dGgKKyAqIGNvbnZlcnNhdGlvbi4gIFRoZXNlIGJ5dGVzIHdpbGwgYmUgcGFydCBvZiB0aGUgbWVzc2FnZSBzdHJlYW0KKyAqIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgdW50aWwgYXV0aGVudGljYXRpb24gaGFzCisgKiBzdWNjZWVkZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gc3RyIHJldHVybiBsb2NhdGlvbiBmb3IgcG9pbnRlciB0byBzdHJpbmcgb2YgdW51c2VkIGJ5dGVzCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoREJ1c0F1dGggICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICAqc3RyID0gJmF1dGgtPmluY29taW5nOworfQorCisKKy8qKgorICogR2V0cyByaWQgb2YgdW51c2VkIGJ5dGVzIHJldHVybmVkIGJ5IF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcygpCisgKiBhZnRlciB3ZSd2ZSBnb3R0ZW4gdGhlbSBhbmQgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRoZW0gZWxzZXdoZXJlLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICovCit2b2lkCitfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nLCAwKTsKK30KKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCB0byBlbmNvZGUKKyAqIHRoZSBtZXNzYWdlIHN0cmVhbSB3aXRoIF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEoKSBwcmlvciB0bworICogc2VuZGluZyBpdCB0byB0aGUgcGVlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBzdHJlYW0KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+Y2xpZW50X2VuY29kZV9mdW5jICE9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZW5jb2RlX2Z1bmMgIT0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGVuY29kZXMgYSBibG9jayBvZiBieXRlcyBmb3Igc2VuZGluZyB0bworICogdGhlIHBlZXIuIElmIG5vIGVuY29kaW5nIHdhcyBuZWdvdGlhdGVkLCBqdXN0IGNvcGllcyB0aGUgYnl0ZXMKKyAqICh5b3UgY2FuIGF2b2lkIHRoaXMgYnkgY2hlY2tpbmcgX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZygpKS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBwbGFpbnRleHQgdGhlIHBsYWluIHRleHQgZGF0YQorICogQHBhcmFtIGVuY29kZWQgaW5pdGlhbGl6ZWQgc3RyaW5nIHRvIHdoZXJlIGVuY29kZWQgZGF0YSBpcyBhcHBlbmRlZAorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgYW5kIHN1Y2Nlc3NmdWxseSBlbmNvZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2VuY29kZV9kYXRhIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwbGFpbnRleHQgIT0gZW5jb2RlZCk7CisgIAorICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nIChhdXRoKSkKKyAgICB7CisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5jbGllbnRfZW5jb2RlX2Z1bmMpIChhdXRoLCBwbGFpbnRleHQsIGVuY29kZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKCogYXV0aC0+bWVjaC0+c2VydmVyX2VuY29kZV9mdW5jKSAoYXV0aCwgcGxhaW50ZXh0LCBlbmNvZGVkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKHBsYWludGV4dCwgMCwgZW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gZGVjb2RlCisgKiB0aGUgbWVzc2FnZSBzdHJlYW0gd2l0aCBfZGJ1c19hdXRoX2RlY29kZV9kYXRhKCkgYWZ0ZXIKKyAqIHJlY2VpdmluZyBpdCBmcm9tIHRoZSBwZWVyLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgbmVlZCB0byBlbmNvZGUgdGhlIHN0cmVhbQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAgIAorICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYyAhPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+c2VydmVyX2RlY29kZV9mdW5jICE9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGRlY29kZXMgYSBibG9jayBvZiBieXRlcyByZWNlaXZlZCBmcm9tCisgKiB0aGUgcGVlci4gSWYgbm8gZW5jb2Rpbmcgd2FzIG5lZ290aWF0ZWQsIGp1c3QgY29waWVzIHRoZSBieXRlcyAoeW91CisgKiBjYW4gYXZvaWQgdGhpcyBieSBjaGVja2luZyBfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nKCkpLgorICoKKyAqIEB0b2RvIDEuMD8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoICJvdXQgb2YgbWVtb3J5IiBlcnJvcgorICogZnJvbSAidGhlIGRhdGEgaXMgaG9zZWQiIGVycm9yLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGVuY29kZWQgdGhlIGVuY29kZWQgZGF0YQorICogQHBhcmFtIHBsYWludGV4dCBpbml0aWFsaXplZCBzdHJpbmcgd2hlcmUgZGVjb2RlZCBkYXRhIGlzIGFwcGVuZGVkCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSBhbmQgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICplbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcGxhaW50ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKHBsYWludGV4dCAhPSBlbmNvZGVkKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgKGF1dGgpKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuICgqIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYykgKGF1dGgsIGVuY29kZWQsIHBsYWludGV4dCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGVjb2RlX2Z1bmMpIChhdXRoLCBlbmNvZGVkLCBwbGFpbnRleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZW5jb2RlZCwgMCwgcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGxhaW50ZXh0KSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgY3JlZGVudGlhbHMgcmVjZWl2ZWQgdmlhIHJlbGlhYmxlIG1lYW5zIGZyb20gdGhlIG9wZXJhdGluZworICogc3lzdGVtLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBjcmVkZW50aWFscyByZWNlaXZlZAorICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICAgICAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5jcmVkZW50aWFscyk7CisgIHJldHVybiBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaWRlbnRpdHkgd2UgYXV0aG9yaXplZCB0aGUgY2xpZW50IGFzLiAgQXBwcyBtYXkgaGF2ZQorICogZGlmZmVyZW50IHBvbGljaWVzIGFzIHRvIHdoYXQgaWRlbnRpdGllcyB0aGV5IGFsbG93LgorICoKKyAqIFJldHVybmVkIGNyZWRlbnRpYWxzIGFyZSBub3QgYSBjb3B5IGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgY3JlZGVudGlhbHMgd2UndmUgYXV0aG9yaXplZCBCWSBSRUZFUkVOQ0UgZG8gbm90IG1vZGlmeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCkKK3sKKyAgaWYgKGF1dGgtPnN0YXRlID09ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICB7CisgICAgICByZXR1cm4gYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGSVhNRSBpbnN0ZWFkIG9mIHRoaXMsIGtlZXAgYW4gZW1wdHkgY3JlZGVudGlhbCBhcm91bmQgdGhhdAorICAgICAgICogZG9lc24ndCByZXF1aXJlIGFsbG9jYXRpb24gb3Igc29tZXRoaW5nCisgICAgICAgKi8KKyAgICAgIC8qIHJldHVybiBlbXB0eSBjcmVkZW50aWFscyAqLworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkpKTsKKyAgICAgIHJldHVybiBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5OworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSBHVUlEIGZyb20gdGhlIHNlcnZlciBpZiB3ZSd2ZSBhdXRoZW50aWNhdGVkOyBnZXRzCisgKiAjTlVMTCBvdGhlcndpc2UuCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBvYmplY3QKKyAqIEByZXR1cm5zIHRoZSBHVUlEIGluIEFTQ0lJIGhleCBmb3JtYXQKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcik7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTZXRzIHRoZSAiYXV0aGVudGljYXRpb24gY29udGV4dCIgd2hpY2ggc2NvcGVzIGNvb2tpZXMKKyAqIHdpdGggdGhlIERCVVNfQ09PS0lFX1NIQTEgYXV0aCBtZWNoYW5pc20gZm9yIGV4YW1wbGUuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY29udGV4dCAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmNvbnRleHQpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKGNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSk7Cit9CisKKy8qKgorICogU2V0cyB3aGV0aGVyIHVuaXggZmQgcGFzc2luZyBpcyBwb3RlbnRpYWxseSBvbiB0aGUgdHJhbnNwb3J0IGFuZAorICogaGVuY2Ugc2hhbGwgYmUgbmVnb3RpYXRlZC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBiIFRSVUUgd2hlbiB1bml4IGZkIHBhc3Npbmcgc2hhbGwgYmUgbmVnb3RpYXRlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoREJ1c0F1dGggKmF1dGgsIGRidXNfYm9vbF90IGIpCit7CisgIGF1dGgtPnVuaXhfZmRfcG9zc2libGUgPSBiOworfQorCisvKioKKyAqIFF1ZXJpZXMgd2hldGhlciB1bml4IGZkIHBhc3Npbmcgd2FzIHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNpb24KKyAqIEByZXR1cm5zICNUUlVFIHdoZW4gdW5peCBmZCBwYXNzaW5nIHdhcyBuZWdvdGlhdGVkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9nZXRfdW5peF9mZF9uZWdvdGlhdGVkKERCdXNBdXRoICphdXRoKQoreworICByZXR1cm4gYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkOworfQorCisvKiogQH0gKi8KKworLyogdGVzdHMgaW4gZGJ1cy1hdXRoLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWF1dGguaCBiL2RidXMvZGJ1cy1hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMjMwMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLmgKQEAgLTAsMCArMSw5NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGguaCBBdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfQVVUSF9ICisjZGVmaW5lIERCVVNfQVVUSF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNBdXRoIERCdXNBdXRoOworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVULAorICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZLAorICBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5ELAorICBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNULAorICBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRAorfSBEQnVzQXV0aFN0YXRlOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfc2VydmVyX25ldyAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAqZ3VpZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfY2xpZW50X25ldyAgICAgICAgICAodm9pZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfcmVmICAgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKiptZWNoYW5pc21zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNBdXRoU3RhdGUgX2RidXNfYXV0aF9kb193b3JrICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfYnl0ZXNfc2VudCAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBieXRlc19zZW50KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqKmJ1ZmZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICpidWZmZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICoqc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZyAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9lbmNvZGVfZGF0YSAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICplbmNvZGVkKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9kZWNvZGVfZGF0YSAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICAqcGxhaW50ZXh0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNDcmVkZW50aWFscyogX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9zZXRfY29udGV4dCAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICBfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwgZGJ1c19ib29sX3QgYik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfZ2V0X3VuaXhfZmRfbmVnb3RpYXRlZChEQnVzQXV0aCAgICAgICAgICAgICAqYXV0aCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0FVVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWJ1cy5jIGIvZGJ1cy9kYnVzLWJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYnVzLmMKQEAgLTAsMCArMSwxNjAyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYnVzLmMgIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBidXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWJ1cy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWlzYy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNCdXMgTWVzc2FnZSBidXMgQVBJcworICogQGluZ3JvdXAgREJ1cworICogQGJyaWVmIEZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBtZXNzYWdlIGJ1cworICoKKyAqIGRidXNfYnVzX2dldCgpIGFsbG93cyBhbGwgbW9kdWxlcyBhbmQgbGlicmFyaWVzIGluIGEgZ2l2ZW4KKyAqIHByb2Nlc3MgdG8gc2hhcmUgdGhlIHNhbWUgY29ubmVjdGlvbiB0byB0aGUgYnVzIGRhZW1vbiBieSBzdG9yaW5nCisgKiB0aGUgY29ubmVjdGlvbiBnbG9iYWxseS4KKyAqCisgKiBBbGwgb3RoZXIgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFyZSBqdXN0IGNvbnZlbmllbmNlIGZ1bmN0aW9uczsKKyAqIG1vc3Qgb2YgdGhlbSBpbnZva2UgbWV0aG9kcyBvbiB0aGUgYnVzIGRhZW1vbiwgYnkgc2VuZGluZyBtZXRob2QKKyAqIGNhbGwgbWVzc2FnZXMgdG8gI0RCVVNfU0VSVklDRV9EQlVTLiBUaGVzZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAqIG9mdGVuIG1ha2UgYmxvY2tpbmcgbWV0aG9kIGNhbGxzLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBibG9jaywKKyAqIHlvdSBjYW4gc2VuZCB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZXMgbWFudWFsbHkgaW4gdGhlIHNhbWUgd2F5CisgKiB5b3Ugd291bGQgYW55IG90aGVyIG1ldGhvZCBjYWxsIG1lc3NhZ2UuCisgKgorICogVGhpcyBtb2R1bGUgaXMgdGhlIG9ubHkgb25lIGluIGxpYmRidXMgdGhhdCdzIHNwZWNpZmljIHRvCisgKiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbi4gVGhlIHJlc3Qgb2YgdGhlIEFQSSBjYW4KKyAqIGFsc28gYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGRpcmVjdGx5LgorICogCisgKiBAdG9kbyByaWdodCBub3cgdGhlIGRlZmF1bHQgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGJ1cyBpcyBoYXJkY29kZWQsCisgKiBzbyBpZiB5b3UgY2hhbmdlIGl0IGluIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgc3VkZGVubHkgeW91IGhhdmUgdG8KKyAqIHNldCBEQlVTX1NZU1RFTV9CVVNfQUREUkVTUyBlbnYgdmFyaWFibGUuICBNaWdodCBiZSBuaWNlIGlmIHRoZQorICogY2xpZW50IGxpYiBzb21laG93IHJlYWQgdGhlIGNvbmZpZyBmaWxlLCBvciBpZiB0aGUgYnVzIG9uIHN0YXJ0dXAKKyAqIHNvbWVob3cgd3JvdGUgb3V0IGl0cyBhZGRyZXNzIHRvIGEgd2VsbC1rbm93biBzcG90LCBidXQgbWlnaHQgYWxzbworICogbm90IGJlIHdvcnRoIGl0LgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNCdXNJbnRlcm5hbHMgTWVzc2FnZSBidXMgQVBJcyBpbnRlcm5hbHMKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG1lc3NhZ2UgYnVzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEJsb2NrIG9mIG1lc3NhZ2UtYnVzLXJlbGF0ZWQgZGF0YSB3ZSBhdHRhY2ggdG8gZWFjaAorICogI0RCdXNDb25uZWN0aW9uIHVzZWQgd2l0aCB0aGVzZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCisgKgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsgLyoqPCBDb25uZWN0aW9uIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworICBjaGFyICp1bmlxdWVfbmFtZTsgLyoqPCBVbmlxdWUgbmFtZSBvZiB0aGlzIGNvbm5lY3Rpb24gKi8KKworICB1bnNpZ25lZCBpbnQgaXNfd2VsbF9rbm93biA6IDE7IC8qKjwgSXMgb25lIG9mIHRoZSB3ZWxsLWtub3duIGNvbm5lY3Rpb25zIGluIG91ciBnbG9iYWwgYXJyYXkgKi8KK30gQnVzRGF0YTsKKworLyoqIFRoZSBzbG90IHdlIGhhdmUgcmVzZXJ2ZWQgdG8gc3RvcmUgQnVzRGF0YS4KKyAqLworc3RhdGljIGRidXNfaW50MzJfdCBidXNfZGF0YV9zbG90ID0gLTE7CisKKy8qKiBOdW1iZXIgb2YgYnVzIHR5cGVzICovCisjZGVmaW5lIE5fQlVTX1RZUEVTIDMKKworc3RhdGljIERCdXNDb25uZWN0aW9uICpidXNfY29ubmVjdGlvbnNbTl9CVVNfVFlQRVNdOworc3RhdGljIGNoYXIgKmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tOX0JVU19UWVBFU10gPSB7IE5VTEwsIE5VTEwsIE5VTEwgfTsKKworc3RhdGljIERCdXNCdXNUeXBlIGFjdGl2YXRpb25fYnVzX3R5cGUgPSBEQlVTX0JVU19TVEFSVEVSOworCitzdGF0aWMgZGJ1c19ib29sX3QgaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK2FkZHJlc3Nlc19zaHV0ZG93bl9mdW5jICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICB7CisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25zW2ldICE9IE5VTEwpCisgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1c19zaHV0ZG93bigpIGNhbGxlZCBidXQgY29ubmVjdGlvbnMgd2VyZSBzdGlsbCBsaXZlLiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoZSBhcHBsaWNhdGlvbiBkaWQgbm90IGRyb3AgYWxsIGl0cyByZWZlcmVuY2VzIHRvIGJ1cyBjb25uZWN0aW9ucy5cbiIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tpXSk7CisgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbaV0gPSBOVUxMOworICAgICAgKytpOworICAgIH0KKworICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1RBUlRFUjsKKworICBpbml0aWFsaXplZCA9IEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9mcm9tX2VudiAoY2hhciAgICAgICAgICAgKipjb25uZWN0aW9uX3AsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqZW52X3ZhcikKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgCisgIF9kYnVzX2Fzc2VydCAoKmNvbm5lY3Rpb25fcCA9PSBOVUxMKTsKKyAgCisgIHMgPSBfZGJ1c19nZXRlbnYgKGVudl92YXIpOworICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCisgICAgcmV0dXJuIFRSVUU7IC8qIHN1Y2Nlc3NmdWxseSBkaWRuJ3QgdXNlIHRoZSBlbnYgdmFyICovCisgIGVsc2UKKyAgICB7CisgICAgICAqY29ubmVjdGlvbl9wID0gX2RidXNfc3RyZHVwIChzKTsKKyAgICAgIHJldHVybiAqY29ubmVjdGlvbl9wICE9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc2Vzc2lvbl9hZGRyZXNzICh2b2lkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEZpcnN0LCBsb29rIGluIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlIG9uIAorICAgKiBmcmVlZGVza3RvcC5vcmcvVW5peCBzeXN0ZW1zLiAqLworICBnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0sCisgICAgICAgICAgICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTIik7CisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBzdXBwb3J0ZWQ7CisgICAgICBEQnVzU3RyaW5nIGFkZHI7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIC8qIFNvIGl0J3Mgbm90IGluIHRoZSBlbnZpcm9ubWVudCAtIGxldCdzIHRyeSBhIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZC4KKyAgICAgICAqIE9uIE1hY09TLCB0aGlzIGludm9sdmVzIGFza2luZyBsYXVuY2hkLiAgT24gV2luZG93cyAobm90IHNwZWNpZmllZCB5ZXQpCisgICAgICAgKiB3ZSBtaWdodCBkbyBhIENPTSBsb29rdXAuCisgICAgICAgKiBJZ25vcmUgZXJyb3JzIC0gaWYgd2UgZmFpbGVkLCBmYWxsIGJhY2sgdG8gYXV0b2xhdW5jaC4gKi8KKyAgICAgIHJldHZhbCA9IF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKCZzdXBwb3J0ZWQsICZhZGRyLCAmZXJyb3IpOworICAgICAgaWYgKHN1cHBvcnRlZCAmJiByZXR2YWwpCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmYWRkciwgJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN1cHBvcnRlZCAmJiAhcmV0dmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnJvcikpCisgICAgICAgICAgICBfZGJ1c193YXJuICgiRHluYW1pYyBzZXNzaW9uIGxvb2t1cCBzdXBwb3J0ZWQgYnV0IGZhaWxlZDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEeW5hbWljIHNlc3Npb24gbG9va3VwIHN1cHBvcnRlZCBidXQgZmFpbGVkIHNpbGVudGx5XG4iKTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR2YWwgPSBUUlVFOworCisgIGlmICghcmV0dmFsKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBXZSBoYXZlIGEgaGFyZC1jb2RlZCAoYnV0IGNvbXBpbGUtdGltZS1jb25maWd1cmFibGUpIGZhbGxiYWNrIGFkZHJlc3MgZm9yCisgICAqIHRoZSBzZXNzaW9uIGJ1cy4gKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9PSBOVUxMKQorICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9CisgICAgICBfZGJ1c19zdHJkdXAgKERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTKTsKKworICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQgKHZvaWQpCit7CisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqczsKKyAgICAgIGludCBpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgTl9CVVNfVFlQRVMpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbnNbaV0gPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAvKiBEb24ndCBpbml0IHRoZXNlIHR3aWNlLCB3ZSBtYXkgcnVuIHRoaXMgY29kZSB0d2ljZSBpZgorICAgICAgICogaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCgpIGZhaWxzIG1pZHdheSB0aHJvdWdoLgorICAgICAgICogSW4gcHJhY3RpY2UsIGVhY2ggYmxvY2sgYmVsb3cgc2hvdWxkIGNvbnRhaW4gb25seSBvbmUKKyAgICAgICAqICJyZXR1cm4gRkFMU0UiIG9yIHJ1bm5pbmcgdGhyb3VnaCB0d2ljZSBtYXkgbm90CisgICAgICAgKiB3b3JrIHJpZ2h0LgorICAgICAgICovCisgICAgICAKKyAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0gPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZpbGxpbmcgaW4gc3lzdGVtIGJ1cyBhZGRyZXNzLi4uXG4iKTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGlmICghZ2V0X2Zyb21fZW52ICgmYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TWVNURU1fQlVTX0FERFJFU1MiKSkKKyAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIAorICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAvKiBVc2UgZGVmYXVsdCBzeXN0ZW0gYnVzIGFkZHJlc3MgaWYgbm9uZSBzZXQgaW4gZW52aXJvbm1lbnQgKi8KKyAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0gPQorICAgICAgICAgICAgIF9kYnVzX3N0cmR1cCAoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyk7CisKKyAgICAgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dID09IE5VTEwpCisgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAKKyAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdXNlZCBkZWZhdWx0IHN5c3RlbSBidXMgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSk7CisgICAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdXNlZCBlbnYgdmFyIHN5c3RlbSBidXMgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0pOworICAgICAgICAgIAorICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZpbGxpbmcgaW4gc2Vzc2lvbiBidXMgYWRkcmVzcy4uLlxuIik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFpbml0X3Nlc3Npb25fYWRkcmVzcyAoKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIFwiJXNcIlxuIiwgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gOiAibm9uZSBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmlsbGluZyBpbiBhY3RpdmF0aW9uIGJ1cyBhZGRyZXNzLi4uXG4iKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIWdldF9mcm9tX2VudiAoJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1RBUlRFUl9BRERSRVNTIikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgXCIlc1wiXG4iLCBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gPworICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA6ICJub25lIHNldCIpOworICAgICAgICB9CisKKworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfU1RBUlRFUl9CVVNfVFlQRSIpOworICAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAocyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQnVzIGFjdGl2YXRpb24gdHlwZSB3YXMgc2V0IHRvIFwiJXNcIlxuIiwgcyk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHN0cmNtcCAocywgInN5c3RlbSIpID09IDApCisgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9idXNfdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAic2Vzc2lvbiIpID09IDApCisgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9idXNfdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIERlZmF1bHQgdG8gdGhlIHNlc3Npb24gYnVzIGluc3RlYWQgaWYgYXZhaWxhYmxlICovCisgICAgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gPQorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmR1cCAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dKTsKKyAgICAgICAgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBJZiB3ZSByZXR1cm4gRkFMU0Ugd2UgaGF2ZSB0byBiZSBzdXJlIHRoYXQgcmVzdGFydGluZworICAgICAgICogdGhlIGFib3ZlIGNvZGUgd2lsbCB3b3JrIHJpZ2h0CisgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChhZGRyZXNzZXNfc2h1dGRvd25fZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaW5pdGlhbGl6ZWQgPSBUUlVFOworICAgIH0KKworICByZXR1cm4gaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBCdXNEYXRhICpiZCA9IGRhdGE7CisgIAorICBpZiAoYmQtPmlzX3dlbGxfa25vd24pCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGlmICghX0RCVVNfTE9DSyAoYnVzKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ2xvYmFsIGxvY2tzIHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgIgorICAgICAgICAgICAgIndoZW4gd2UgYXR0YWNoZWQgYnVzIGRhdGEiKTsKKworICAgICAgLyogV2UgbWF5IGJlIHN0b3JlZCBpbiBtb3JlIHRoYW4gb25lIHNsb3QgKi8KKyAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdyBiZSBpbXBvc3NpYmxlIC0gdGhlc2Ugc2xvdHMgYXJlIHN1cHBvc2VkIHRvCisgICAgICAgKiBiZSBjbGVhcmVkIG9uIGRpc2Nvbm5lY3QsIHNvIHNob3VsZCBub3QgbmVlZCB0byBiZSBjbGVhcmVkIG9uCisgICAgICAgKiBmaW5hbGl6ZQorICAgICAgICovCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgTl9CVVNfVFlQRVMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25zW2ldID09IGJkLT5jb25uZWN0aW9uKQorICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zW2ldID0gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX1VOTE9DSyAoYnVzKTsKKyAgICB9CisgIAorICBkYnVzX2ZyZWUgKGJkLT51bmlxdWVfbmFtZSk7CisgIGRidXNfZnJlZSAoYmQpOworCisgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpOworfQorCitzdGF0aWMgQnVzRGF0YSoKK2Vuc3VyZV9idXNfZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0RhdGEgKmJkOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpKQorICAgIHJldHVybiBOVUxMOworCisgIGJkID0gZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhIChjb25uZWN0aW9uLCBidXNfZGF0YV9zbG90KTsKKyAgaWYgKGJkID09IE5VTEwpCisgICAgeyAgICAgIAorICAgICAgYmQgPSBkYnVzX25ldzAgKEJ1c0RhdGEsIDEpOworICAgICAgaWYgKGJkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZidXNfZGF0YV9zbG90KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBiZC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLCBidXNfZGF0YV9zbG90LCBiZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfZGF0YV9mcmVlKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoYmQpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIC8qIERhdGEgc2xvdCByZWZjb3VudCBub3cgaGVsZCBieSB0aGUgQnVzRGF0YSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpOworICAgIH0KKworICByZXR1cm4gYmQ7Cit9CisKKy8qKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBjaGVja3MgdG8gc2VlIGlmIHRoaXMKKyAqIGlzIGEgc2hhcmVkIGNvbm5lY3Rpb24gb3duZWQgYnkgdGhlIGJ1cyBhbmQgaWYgaXQgaXMgdW5yZWYgaXQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gYSBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICovCit2b2lkCitfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGludCBpOworCisgIGlmICghX0RCVVNfTE9DSyAoYnVzKSkKKyAgICB7CisgICAgICAvKiBJZiBpdCB3YXMgaW4gYnVzX2Nvbm5lY3Rpb25zLCB3ZSB3b3VsZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcworICAgICAgICogd2hlbiB3ZSBhZGRlZCBpdC4gU28sIGl0IGNhbid0IGJlLiAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXZSBhcmUgZXhwZWN0aW5nIHRvIGhhdmUgdGhlIGNvbm5lY3Rpb24gc2F2ZWQgaW4gb25seSBvbmUgb2YgdGhlc2UKKyAgICogc2xvdHMsIGJ1dCBzb21lb25lIGNvdWxkIGluIGEgcGF0aG9sb2dpY2FsIGNhc2Ugc2V0IHN5c3RlbSBhbmQgc2Vzc2lvbgorICAgKiBidXMgdG8gdGhlIHNhbWUgYnVzIG9yIHNvbWV0aGluZy4gT3Igc2V0IG9uZSBvZiB0aGVtIHRvIHRoZSBzdGFydGVyCisgICAqIGJ1cyB3aXRob3V0IHNldHRpbmcgdGhlIHN0YXJ0ZXIgYnVzIHR5cGUgaW4gdGhlIGVudiB2YXJpYWJsZS4KKyAgICogU28gd2UgZG9uJ3QgYnJlYWsgdGhlIGxvb3AgYXMgc29vbiBhcyB3ZSBmaW5kIGEgbWF0Y2guCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgTl9CVVNfVFlQRVM7ICsraSkKKyAgICB7CisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25zW2ldID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbnNbaV0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIF9EQlVTX1VOTE9DSyAoYnVzKTsKK30KKworc3RhdGljIERCdXNDb25uZWN0aW9uICoKK2ludGVybmFsX2J1c19nZXQgKERCdXNCdXNUeXBlICB0eXBlLAorICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIHByaXZhdGUsCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmFkZHJlc3M7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBCdXNEYXRhICpiZDsKKyAgREJ1c0J1c1R5cGUgYWRkcmVzc190eXBlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodHlwZSA+PSAwICYmIHR5cGUgPCBOX0JVU19UWVBFUywgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIC8qIGRvIG5vdCAiZ290byBvdXQiLCB0aGF0IHdvdWxkIHRyeSB0byB1bmxvY2sgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIWluaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQgKCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBhY3RpdmF0aW9uIGFkZHJlc3MgZXZlbiBpZiB0aGUKKyAgICogYWN0aXZhdGluZyBidXMgaXMgdGhlIHNlc3Npb24gb3Igc3lzdGVtIGJ1cywKKyAgICogcGVyIHRoZSBzcGVjLgorICAgKi8KKyAgYWRkcmVzc190eXBlID0gdHlwZTsKKyAgCisgIC8qIFVzZSB0aGUgcmVhbCB0eXBlIG9mIHRoZSBhY3RpdmF0aW9uIGJ1cyBmb3IgZ2V0dGluZyBpdHMKKyAgICogY29ubmVjdGlvbiwgYnV0IG9ubHkgaWYgdGhlIHJlYWwgdHlwZSdzIGFkZHJlc3MgaXMgYXZhaWxhYmxlLiAoSWYKKyAgICogdGhlIGFjdGl2YXRpbmcgYnVzIGlzbid0IGEgd2VsbC1rbm93biBidXMgdGhlbgorICAgKiBhY3RpdmF0aW9uX2J1c190eXBlID09IERCVVNfQlVTX1NUQVJURVIpCisgICAqLworICBpZiAodHlwZSA9PSBEQlVTX0JVU19TVEFSVEVSICYmCisgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbYWN0aXZhdGlvbl9idXNfdHlwZV0gIT0gTlVMTCkKKyAgICB0eXBlID0gYWN0aXZhdGlvbl9idXNfdHlwZTsKKyAgCisgIGlmICghcHJpdmF0ZSAmJiBidXNfY29ubmVjdGlvbnNbdHlwZV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25uZWN0aW9uID0gYnVzX2Nvbm5lY3Rpb25zW3R5cGVdOworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgYWRkcmVzcyA9IGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1thZGRyZXNzX3R5cGVdOworICBpZiAoYWRkcmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2UgYnVzICh0cnkgJ21hbiBkYnVzLWxhdW5jaCcgYW5kICdtYW4gZGJ1cy1kYWVtb24nIGZvciBoZWxwKSIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChwcml2YXRlKQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChhZGRyZXNzLCBlcnJvcik7CisgIGVsc2UKKyAgICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHJlc3MsIGVycm9yKTsKKyAgCisgIGlmICghY29ubmVjdGlvbikKKyAgICB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2J1c19yZWdpc3RlciAoY29ubmVjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICBjb25uZWN0aW9uID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIXByaXZhdGUpCisgICAgeworICAgICAgLyogc3RvcmUgYSB3ZWFrIHJlZiB0byB0aGUgY29ubmVjdGlvbiAoZGJ1cy1jb25uZWN0aW9uLmMgaXMKKyAgICAgICAqIHN1cHBvc2VkIHRvIGhhdmUgYSBzdHJvbmcgcmVmIHRoYXQgaXQgZHJvcHMgb24gZGlzY29ubmVjdCwKKyAgICAgICAqIHNpbmNlIHRoaXMgaXMgYSBzaGFyZWQgY29ubmVjdGlvbikKKyAgICAgICAqLworICAgICAgYnVzX2Nvbm5lY3Rpb25zW3R5cGVdID0gY29ubmVjdGlvbjsKKyAgICB9CisKKyAgLyogQnkgZGVmYXVsdCB3ZSdyZSBib3VuZCB0byB0aGUgbGlmZWN5Y2xlIG9mCisgICAqIHRoZSBtZXNzYWdlIGJ1cy4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXNfZGF0YXMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdsb2JhbCBsb2NrcyB3ZXJlIGluaXRpYWxpemVkIGFscmVhZHkiKTsKKworICBiZCA9IGVuc3VyZV9idXNfZGF0YSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoYmQgIT0gTlVMTCk7IC8qIGl0IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlciwgc28gT09NIG5vdCBwb3NzaWJsZSAqLworICBiZC0+aXNfd2VsbF9rbm93biA9IFRSVUU7CisgIF9EQlVTX1VOTE9DSyAoYnVzX2RhdGFzKTsKKworb3V0OgorICAvKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGNhbGxlciwgb3IgTlVMTCB3aXRoIGVycm9yIHNldC4gKi8KKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgX0RCVVNfVU5MT0NLIChidXMpOworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworCisvKiogQH0gKi8gLyogZW5kIG9mIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZG9jcyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNCdXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDb25uZWN0cyB0byBhIGJ1cyBkYWVtb24gYW5kIHJlZ2lzdGVycyB0aGUgY2xpZW50IHdpdGggaXQuICBJZiBhCisgKiBjb25uZWN0aW9uIHRvIHRoZSBidXMgYWxyZWFkeSBleGlzdHMsIHRoZW4gdGhhdCBjb25uZWN0aW9uIGlzCisgKiByZXR1cm5lZC4gIFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBvd25zIGEgcmVmZXJlbmNlIHRvIHRoZSBidXMuCisgKgorICogVGhlIGNhbGxlciBtYXkgTk9UIGNhbGwgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgb24gdGhpcyBjb25uZWN0aW9uOworICogc2VlIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgYW5kIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGZvciBkZXRhaWxzCisgKiBvbiB0aGF0LgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gb2J0YWlucyBhIG5ldyBjb25uZWN0aW9uIG9iamVjdCBuZXZlciBiZWZvcmUKKyAqIHJldHVybmVkIGZyb20gZGJ1c19idXNfZ2V0KCksIGl0IHdpbGwgY2FsbAorICogZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QoKSwgc28gdGhlIGFwcGxpY2F0aW9uCisgKiB3aWxsIGV4aXQgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VzLiBZb3UgY2FuIHVuZG8gdGhpcworICogYnkgY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCgpIHlvdXJzZWxmCisgKiBhZnRlciB5b3UgZ2V0IHRoZSBjb25uZWN0aW9uLgorICoKKyAqIGRidXNfYnVzX2dldCgpIGNhbGxzIGRidXNfYnVzX3JlZ2lzdGVyKCkgZm9yIHlvdS4KKyAqIAorICogSWYgcmV0dXJuaW5nIGEgbmV3bHktY3JlYXRlZCBjb25uZWN0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sKKyAqIHVudGlsIGF1dGhlbnRpY2F0aW9uIGFuZCBidXMgcmVnaXN0cmF0aW9uIGFyZSBjb21wbGV0ZS4KKyAqIAorICogQHBhcmFtIHR5cGUgYnVzIHR5cGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgI0RCdXNDb25uZWN0aW9uIHdpdGggbmV3IHJlZiBvciAjTlVMTCBvbiBlcnJvcgorICovCitEQnVzQ29ubmVjdGlvbiAqCitkYnVzX2J1c19nZXQgKERCdXNCdXNUeXBlICB0eXBlLAorCSAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgcmV0dXJuIGludGVybmFsX2J1c19nZXQgKHR5cGUsIEZBTFNFLCBlcnJvcik7Cit9CisKKy8qKgorICogQ29ubmVjdHMgdG8gYSBidXMgZGFlbW9uIGFuZCByZWdpc3RlcnMgdGhlIGNsaWVudCB3aXRoIGl0IGFzIHdpdGgKKyAqIGRidXNfYnVzX3JlZ2lzdGVyKCkuICBVbmxpa2UgZGJ1c19idXNfZ2V0KCksIGFsd2F5cyBjcmVhdGVzIGEgbmV3CisgKiBjb25uZWN0aW9uLiBUaGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgc2F2ZWQgb3IgcmVjeWNsZWQgYnkKKyAqIGxpYmRidXMuIENhbGxlciBvd25zIGEgcmVmZXJlbmNlIHRvIHRoZSBidXMgYW5kIG11c3QgZWl0aGVyIGNsb3NlCisgKiBpdCBvciBrbm93IGl0IHRvIGJlIGNsb3NlZCBwcmlvciB0byByZWxlYXNpbmcgdGhpcyByZWZlcmVuY2UuCisgKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHdoZW4gdG8KKyAqIGNsb3NlIGFuZCB1bnJlZiB0aGlzIGNvbm5lY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscworICogZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QoKSBvbiB0aGUgbmV3IGNvbm5lY3Rpb24sIHNvIHRoZSBhcHBsaWNhdGlvbgorICogd2lsbCBleGl0IGlmIHRoZSBjb25uZWN0aW9uIGNsb3Nlcy4gWW91IGNhbiB1bmRvIHRoaXMKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QoKSB5b3Vyc2VsZgorICogYWZ0ZXIgeW91IGdldCB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpIGNhbGxzIGRidXNfYnVzX3JlZ2lzdGVyKCkgZm9yIHlvdS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgYXV0aGVudGljYXRpb24gYW5kIGJ1cyByZWdpc3RyYXRpb24KKyAqIGFyZSBjb21wbGV0ZS4KKyAqCisgKiBAcGFyYW0gdHlwZSBidXMgdHlwZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBEQnVzQ29ubmVjdGlvbiB3aXRoIG5ldyByZWYKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorZGJ1c19idXNfZ2V0X3ByaXZhdGUgKERCdXNCdXNUeXBlICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgcmV0dXJuIGludGVybmFsX2J1c19nZXQgKHR5cGUsIFRSVUUsIGVycm9yKTsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGJ1cy4gVGhpcyBtdXN0IGJlIHRoZSBmaXJzdAorICogdGhpbmcgYW4gYXBwbGljYXRpb24gZG9lcyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIG1lc3NhZ2UgYnVzLgorICogSWYgcmVnaXN0cmF0aW9uIHN1Y2NlZWRzLCB0aGUgdW5pcXVlIG5hbWUgd2lsbCBiZSBzZXQsCisgKiBhbmQgY2FuIGJlIG9idGFpbmVkIHVzaW5nIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCByZWdpc3RyYXRpb24gaXMgY29tcGxldGUuCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMKKyAqIChkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHdoZXRoZXIgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lKCkKKyAqIHJldHVybnMgYSBub24tI05VTEwgdmFsdWUpLCB0aGVuIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorICoKKyAqIElmIHlvdSB1c2UgZGJ1c19idXNfZ2V0KCkgb3IgZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgeW91LgorICogCisgKiBAbm90ZSBKdXN0IHVzZSBkYnVzX2J1c19nZXQoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpIGluc3RlYWQgb2YKKyAqIGRidXNfYnVzX3JlZ2lzdGVyKCkgYW5kIHNhdmUgeW91cnNlbGYgc29tZSBwYWluLiBVc2luZworICogZGJ1c19idXNfcmVnaXN0ZXIoKSBtYW51YWxseSBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSB5b3VyCisgKiBvd24gY3VzdG9tIG1lc3NhZ2UgYnVzIG5vdCBmb3VuZCBpbiAjREJ1c0J1c1R5cGUuCisgKgorICogSWYgeW91IG9wZW4gYSBidXMgY29ubmVjdGlvbiB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgb3IKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSB5b3Ugd2lsbCBoYXZlIHRvIGRidXNfYnVzX3JlZ2lzdGVyKCkKKyAqIHlvdXJzZWxmLCBvciBtYWtlIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RyYXRpb24gbWV0aG9kIGNhbGxzCisgKiB5b3Vyc2VsZi4gSWYgeW91IHNlbmQgdGhlIG1ldGhvZCBjYWxscyB5b3Vyc2VsZiwgY2FsbAorICogZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKCkgd2l0aCB0aGUgdW5pcXVlIGJ1cyBuYW1lIHlvdSBnZXQgZnJvbQorICogdGhlIGJ1cy4KKyAqCisgKiBGb3Igc2hhcmVkIGNvbm5lY3Rpb25zIChjcmVhdGVkIHdpdGggZGJ1c19jb25uZWN0aW9uX29wZW4oKSkgaW4gYQorICogbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiwgeW91IGNhbid0IHJlYWxseSBtYWtlIHRoZSByZWdpc3RyYXRpb24KKyAqIGNhbGxzIHlvdXJzZWxmLCBiZWNhdXNlIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgc29tZSBvdGhlciB0aHJlYWQgaXMKKyAqIGFsc28gcmVnaXN0ZXJpbmcsIGFuZCB0aGUgYnVzIHdpbGwga2ljayB5b3Ugb2ZmIGlmIHlvdSBzZW5kIHR3bworICogcmVnaXN0cmF0aW9uIG1lc3NhZ2VzLgorICoKKyAqIElmIHlvdSB1c2UgZGJ1c19idXNfcmVnaXN0ZXIoKSBob3dldmVyLCB0aGVyZSBpcyBhIGxvY2sgdGhhdAorICoga2VlcHMgYm90aCBhcHBzIGZyb20gcmVnaXN0ZXJpbmcgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBUaGUgcnVsZSBpbiBhIG11bHRpdGhyZWFkZWQgYXBwLCB0aGVuLCBpcyB0aGF0IGRidXNfYnVzX3JlZ2lzdGVyKCkKKyAqIG11c3QgYmUgdXNlZCB0byByZWdpc3Rlciwgb3IgeW91IG5lZWQgdG8gaGF2ZSB5b3VyIG93biBsb2NrcyB0aGF0CisgKiBhbGwgdGhyZWFkcyBpbiB0aGUgYXBwIHdpbGwgcmVzcGVjdC4KKyAqCisgKiBJbiBhIHNpbmdsZS10aHJlYWRlZCBhcHBsaWNhdGlvbiB5b3UgY2FuIHJlZ2lzdGVyIGJ5IGhhbmQgaW5zdGVhZAorICogb2YgdXNpbmcgZGJ1c19idXNfcmVnaXN0ZXIoKSwgYXMgbG9uZyBhcyB5b3UgY2hlY2sKKyAqIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpIHRvIHNlZSBpZiBhIHVuaXF1ZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4KKyAqIHN0b3JlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgeW91IHNlbmQgdGhlIHJlZ2lzdHJhdGlvbiBtZXNzYWdlcy4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBlcnJvciBwbGFjZSB0byBzdG9yZSBlcnJvcnMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK2RidXNfYnVzX3JlZ2lzdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGNoYXIgKm5hbWU7CisgIEJ1c0RhdGEgKmJkOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIG1lc3NhZ2UgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXNfZGF0YXMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIC8qIGRvIG5vdCAiZ290byBvdXQiLCB0aGF0IHdvdWxkIHRyeSB0byB1bmxvY2sgKi8KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGJkLT51bmlxdWVfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZ2lzdGVyIHRoZSBzYW1lIERCdXNDb25uZWN0aW9uICVzIHdpdGggdGhlIG1lc3NhZ2UgYnVzIGEgc2Vjb25kIHRpbWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgYmQtPnVuaXF1ZV9uYW1lKTsKKyAgICAgIC8qIFN1Y2Nlc3MhICovCisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7IAorCisgIGlmICghbWVzc2FnZSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwgZXJyb3IpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICBlbHNlIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgZ290byBvdXQ7CisgIGVsc2UgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGJkLT51bmlxdWVfbmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgIGlmIChiZC0+dW5pcXVlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIF9EQlVTX1VOTE9DSyAoYnVzX2RhdGFzKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioKKyAqIFNldHMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uLCBhcyBhc3NpZ25lZCBieSB0aGUgbWVzc2FnZQorICogYnVzLiAgQ2FuIG9ubHkgYmUgdXNlZCBpZiB5b3UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgbWFudWFsbHkKKyAqIChpLmUuIGlmIHlvdSBkaWQgbm90IGNhbGwgZGJ1c19idXNfcmVnaXN0ZXIoKSkuIENhbiBvbmx5IGJlIGNhbGxlZAorICogb25jZSBwZXIgY29ubmVjdGlvbi4gIEFmdGVyIHRoZSB1bmlxdWUgbmFtZSBpcyBzZXQsIHlvdSBjYW4gZ2V0IGl0CisgKiB3aXRoIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpLgorICoKKyAqIFRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1pbXBsZW1lbnQgdGhlCisgKiBlcXVpdmFsZW50IG9mIGRidXNfYnVzX3JlZ2lzdGVyKCkgeW91cnNlbGYuIE9uZSAocHJvYmFibHkgdW51c3VhbCkKKyAqIHJlYXNvbiB0byBkbyB0aGF0IG1pZ2h0IGJlIHRvIGRvIHRoZSBidXMgcmVnaXN0cmF0aW9uIGNhbGwKKyAqIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2Ygc3luY2hyb25vdXNseS4KKyAqCisgKiBAbm90ZSBKdXN0IHVzZSBkYnVzX2J1c19nZXQoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpLCBvciB3b3JzdAorICogY2FzZSBkYnVzX2J1c19yZWdpc3RlcigpLCBpbnN0ZWFkIG9mIG1lc3Npbmcgd2l0aCB0aGlzCisgKiBmdW5jdGlvbi4gVGhlcmUncyByZWFsbHkgbm8gcG9pbnQgY3JlYXRpbmcgcGFpbiBmb3IgeW91cnNlbGYgYnkKKyAqIGRvaW5nIHRoaW5ncyBtYW51YWxseS4KKyAqCisgKiBJdCdzIGhhcmQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gc2FmZWx5IG9uIHNoYXJlZCBjb25uZWN0aW9ucworICogKGNyZWF0ZWQgYnkgZGJ1c19jb25uZWN0aW9uX29wZW4oKSkgaW4gYSBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9uLAorICogYmVjYXVzZSBvbmx5IG9uZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBjYW4gYmUgc2VudCB0byB0aGUgYnVzLiBJZgorICogdHdvIHRocmVhZHMgYXJlIGJvdGggc2VuZGluZyB0aGUgcmVnaXN0cmF0aW9uIG1lc3NhZ2UsIHRoZXJlIGlzIG5vCisgKiBtZWNoYW5pc20gaW4gbGliZGJ1cyBpdHNlbGYgdG8gYXZvaWQgc2VuZGluZyBpdCB0d2ljZS4KKyAqCisgKiBUaHVzLCB5b3UgbmVlZCBhIHdheSB0byBjb29yZGluYXRlIHdoaWNoIHRocmVhZCBzZW5kcyB0aGUKKyAqIHJlZ2lzdHJhdGlvbiBhdHRlbXB0OyB3aGljaCBhbHNvIG1lYW5zIHlvdSBrbm93IHdoaWNoIHRocmVhZAorICogd2lsbCBjYWxsIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpLiBJZiB5b3UgZG9uJ3Qga25vdworICogYWJvdXQgYWxsIHRocmVhZHMgaW4gdGhlIGFwcCAoZm9yIGV4YW1wbGUsIGlmIHNvbWUgbGlicmFyaWVzCisgKiB5b3UncmUgdXNpbmcgbWlnaHQgc3RhcnQgbGliZGJ1cy11c2luZyB0aHJlYWRzKSwgdGhlbiB5b3UKKyAqIG5lZWQgdG8gYXZvaWQgdXNpbmcgdGhpcyBmdW5jdGlvbiBvbiBzaGFyZWQgY29ubmVjdGlvbnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB1bmlxdWVfbmFtZSB0aGUgdW5pcXVlIG5hbWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKQoreworICBCdXNEYXRhICpiZDsKKyAgZGJ1c19ib29sX3Qgc3VjY2VzcyA9IEZBTFNFOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodW5pcXVlX25hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghX0RCVVNfTE9DSyAoYnVzX2RhdGFzKSkKKyAgICB7CisgICAgICAvKiBkbyBub3QgImdvdG8gb3V0IiwgdGhhdCB3b3VsZCB0cnkgdG8gdW5sb2NrICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJkID0gZW5zdXJlX2J1c19kYXRhIChjb25uZWN0aW9uKTsKKyAgaWYgKGJkID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChiZC0+dW5pcXVlX25hbWUgPT0gTlVMTCk7CisgIAorICBiZC0+dW5pcXVlX25hbWUgPSBfZGJ1c19zdHJkdXAgKHVuaXF1ZV9uYW1lKTsKKyAgc3VjY2VzcyA9IGJkLT51bmlxdWVfbmFtZSAhPSBOVUxMOworCitvdXQ6CisgIF9EQlVTX1VOTE9DSyAoYnVzX2RhdGFzKTsKKyAgCisgIHJldHVybiBzdWNjZXNzOworfQorCisvKioKKyAqIEdldHMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGFzIGFzc2lnbmVkIGJ5IHRoZSBtZXNzYWdlCisgKiBidXMuIE9ubHkgcG9zc2libGUgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoCisgKiB0aGUgbWVzc2FnZSBidXMuIEFsbCBjb25uZWN0aW9ucyByZXR1cm5lZCBieSBkYnVzX2J1c19nZXQoKSBvcgorICogZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQuCisgKgorICogVGhlIG5hbWUgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBmcmVlZCwgYW5kCisgKiBzaG91bGQgbm90IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogT3RoZXIgdGhhbiBkYnVzX2J1c19nZXQoKSwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHNldCB0aGUgdW5pcXVlCisgKiBuYW1lOyBvbmUgaXMgZGJ1c19idXNfcmVnaXN0ZXIoKSwgdGhlIG90aGVyIGlzCisgKiBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUoKS4gIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAqIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpIGlmIHlvdSByZWdpc3RlciBieSBoYW5kIGluc3RlYWQgb2YgdXNpbmcKKyAqIGRidXNfYnVzX3JlZ2lzdGVyKCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb3IgI05VTEwgb24gZXJyb3IKKyAqLworY29uc3QgY2hhcioKK2RidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0RhdGEgKmJkOworICBjb25zdCBjaGFyICp1bmlxdWVfbmFtZSA9IE5VTEw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworCisgIGlmICghX0RCVVNfTE9DSyAoYnVzX2RhdGFzKSkKKyAgICB7CisgICAgICAvKiBXZSdkIGhhdmUgaW5pdGlhbGl6ZWQgbG9ja3Mgd2hlbiB3ZSBnYXZlIGl0IGl0cyB1bmlxdWUgbmFtZSwgaWYgaXQKKyAgICAgICAqIGhhZCBvbmUuIERvbid0ICJnb3RvIG91dCIsIHRoYXQgd291bGQgdHJ5IHRvIHVubG9jay4gKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBiZCA9IGVuc3VyZV9idXNfZGF0YSAoY29ubmVjdGlvbik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHVuaXF1ZV9uYW1lID0gYmQtPnVuaXF1ZV9uYW1lOworCitvdXQ6CisgIF9EQlVTX1VOTE9DSyAoYnVzX2RhdGFzKTsKKworICByZXR1cm4gdW5pcXVlX25hbWU7Cit9CisKKy8qKgorICogQXNrcyB0aGUgYnVzIHRvIHJldHVybiB0aGUgVUlEIHRoZSBuYW1lZCBjb25uZWN0aW9uIGF1dGhlbnRpY2F0ZWQKKyAqIGFzLCBpZiBhbnkuICBPbmx5IHdvcmtzIG9uIFVOSVg7IG9ubHkgd29ya3MgZm9yIGNvbm5lY3Rpb25zIG9uIHRoZQorICogc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMuIElmIHlvdSBhcmUgbm90IG9uIHRoZSBzYW1lIG1hY2hpbmUgYXMgdGhlCisgKiBidXMsIHRoZW4gY2FsbGluZyB0aGlzIGlzIHByb2JhYmx5IGEgYmFkIGlkZWEsIHNpbmNlIHRoZSBVSUQgd2lsbAorICogbWVhbiBsaXR0bGUgdG8geW91ciBhcHBsaWNhdGlvbi4KKyAqCisgKiBGb3IgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cyB5b3UncmUgZ3VhcmFudGVlZCB0byBiZSBvbiB0aGUgc2FtZQorICogbWFjaGluZSBzaW5jZSBpdCBvbmx5IGxpc3RlbnMgb24gYSBVTklYIGRvbWFpbiBzb2NrZXQgKGF0IGxlYXN0LAorICogYXMgc2hpcHBlZCBieSBkZWZhdWx0KS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGNvbm5lY3Rpb25zIHRoYXQgYXV0aGVudGljYXRlZCBhcworICogYSBVTklYIHVzZXIsIHJpZ2h0IG5vdyB0aGF0IGluY2x1ZGVzIGFsbCBidXMgY29ubmVjdGlvbnMsIGJ1dAorICogaXQncyB2ZXJ5IHBvc3NpYmxlIHRvIGhhdmUgY29ubmVjdGlvbnMgd2l0aCBubyBhc3NvY2lhdGVkIFVJRC4KKyAqIFNvIGNoZWNrIGZvciBlcnJvcnMgYW5kIGRvIHNvbWV0aGluZyBzZW5zaWJsZSBpZiB0aGV5IGhhcHBlbi4KKyAqIAorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYW4gZXJyb3Igb24gV2luZG93cy4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIGEgbmFtZSBvd25lZCBieSB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgdGhlIHVuaXggdXNlciBpZCwgb3IgKCh1bnNpZ25lZCktMSkgaWYgZXJyb3IgaXMgc2V0CisgKi8gCit1bnNpZ25lZCBsb25nCitkYnVzX2J1c19nZXRfdW5peF91c2VyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBkYnVzX3VpbnQzMl90IHVpZDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgREJVU19VSURfVU5TRVQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgREJVU19VSURfVU5TRVQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChuYW1lKSwgREJVU19VSURfVU5TRVQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIERCVVNfVUlEX1VOU0VUKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFVzZXIiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKKyAgICB9CisgCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorCQkJCSBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorICAKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIAorICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfSAgCisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKKyAgICB9CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIHVpZDsKK30KKworLyoqCisgKiBBc2tzIHRoZSBidXMgdG8gcmV0dXJuIGl0cyBnbG9iYWxseSB1bmlxdWUgSUQsIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAqIEQtQnVzIHNwZWNpZmljYXRpb24uIEZvciB0aGUgc2Vzc2lvbiBidXMsIHRoaXMgaXMgdXNlZnVsIGFzIGEgd2F5CisgKiB0byB1bmlxdWVseSBpZGVudGlmeSBlYWNoIHVzZXIgc2Vzc2lvbi4gRm9yIHRoZSBzeXN0ZW0gYnVzLAorICogcHJvYmFibHkgdGhlIGJ1cyBJRCBpcyBub3QgdXNlZnVsOyBpbnN0ZWFkLCB1c2UgdGhlIG1hY2hpbmUgSUQKKyAqIHNpbmNlIGl0J3MgYWNjZXNzaWJsZSB3aXRob3V0IG5lY2Vzc2FyaWx5IGNvbm5lY3RpbmcgdG8gdGhlIGJ1cyBhbmQKKyAqIG1heSBiZSBwZXJzaXN0ZW50IGJleW9uZCBhIHNpbmdsZSBidXMgaW5zdGFuY2UgKGFjcm9zcyByZWJvb3RzIGZvcgorICogZXhhbXBsZSkuIFNlZSBkYnVzX2dldF9sb2NhbF9tYWNoaW5lX2lkKCkuCisgKgorICogSW4gYWRkaXRpb24gdG8gYW4gSUQgZm9yIGVhY2ggYnVzIGFuZCBhbiBJRCBmb3IgZWFjaCBtYWNoaW5lLCB0aGVyZSBpcworICogYW4gSUQgZm9yIGVhY2ggYWRkcmVzcyB0aGF0IHRoZSBidXMgaXMgbGlzdGVuaW5nIG9uOyB0aGF0IGNhbgorICogYmUgcmV0cmlldmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQoKSwgdGhvdWdoIGl0IGlzCisgKiBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGVycm9yCisgKiBAcmV0dXJucyB0aGUgYnVzIElEIG9yICNOVUxMIGlmIGVycm9yIGlzIHNldAorICovIAorY2hhcioKK2RidXNfYnVzX2dldF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRJZCIpOworICAKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgdl9TVFJJTkcgPSBOVUxMOworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlkID0gX2RidXNfc3RyZHVwICh2X1NUUklORyk7IC8qIG1heSBiZSBOVUxMICovCisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBpZiAoaWQgPT0gTlVMTCkKKyAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisKKyAgLyogRklYTUUgaXQgbWlnaHQgYmUgbmljZSB0byBjYWNoZSB0aGUgSUQgbG9jYWxseSAqLworICAKKyAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byBhc3NpZ24gdGhlIGdpdmVuIG5hbWUgdG8gdGhpcyBjb25uZWN0aW9uIGJ5IGludm9raW5nCisgKiB0aGUgUmVxdWVzdE5hbWUgbWV0aG9kIG9uIHRoZSBidXMuIFRoaXMgbWV0aG9kIGlzIGZ1bGx5IGRvY3VtZW50ZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLiBGb3IgcXVpY2sgcmVmZXJlbmNlLCB0aGUgZmxhZ3MgYW5kCisgKiByZXN1bHQgY29kZXMgYXJlIGRpc2N1c3NlZCBoZXJlLCBidXQgdGhlIHNwZWNpZmljYXRpb24gaXMgdGhlCisgKiBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGlzIGluZm9ybWF0aW9uLgorICoKKyAqIEZpcnN0IHlvdSBzaG91bGQga25vdyB0aGF0IGZvciBlYWNoIGJ1cyBuYW1lLCB0aGUgYnVzIHN0b3JlcworICogYSBxdWV1ZSBvZiBjb25uZWN0aW9ucyB0aGF0IHdvdWxkIGxpa2UgdG8gb3duIGl0LiBPbmx5CisgKiBvbmUgb3ducyBpdCBhdCBhIHRpbWUgLSBjYWxsZWQgdGhlIHByaW1hcnkgb3duZXIuIElmIHRoZSBwcmltYXJ5CisgKiBvd25lciByZWxlYXNlcyB0aGUgbmFtZSBvciBkaXNjb25uZWN0cywgdGhlbiB0aGUgbmV4dCBvd25lciBpbiB0aGUKKyAqIHF1ZXVlIGF0b21pY2FsbHkgdGFrZXMgb3Zlci4KKyAqCisgKiBTbyBmb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiBvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvcgorICogYW5kIG11bHRpcGxlIGluc3RhbmNlcyBvZiBpdCBjYW4gYmUgcnVuLCB5b3UgY2FuIGhhdmUgYWxsIG9mIHRoZW0KKyAqIHNpdHRpbmcgaW4gdGhlIHF1ZXVlLiBUaGUgZmlyc3Qgb25lIHRvIHN0YXJ0IHVwIHdpbGwgcmVjZWl2ZSBtZXNzYWdlcworICogc2VudCB0byBvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciwgYnV0IGlmIHRoYXQgb25lIGV4aXRzIGFub3RoZXIKKyAqIHdpbGwgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGFuZCByZWNlaXZlIG1lc3NhZ2VzLgorICoKKyAqIFRoZSBxdWV1ZSBtZWFucyB5b3UgZG9uJ3QgbmVlZCB0byBtYW51YWxseSB3YXRjaCBmb3IgdGhlIGN1cnJlbnQgb3duZXIgdG8KKyAqIGRpc2FwcGVhciBhbmQgdGhlbiByZXF1ZXN0IHRoZSBuYW1lIGFnYWluLgorICoKKyAqIFdoZW4gcmVxdWVzdGluZyBhIG5hbWUsIHlvdSBjYW4gc3BlY2lmeSBzZXZlcmFsIGZsYWdzLgorICogCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgYW5kICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAqIGFyZSBwcm9wZXJ0aWVzIHN0b3JlZCBieSB0aGUgYnVzIGZvciB0aGlzIGNvbm5lY3Rpb24gd2l0aCByZXNwZWN0IHRvCisgKiBlYWNoIHJlcXVlc3RlZCBidXMgbmFtZS4gVGhlc2UgcHJvcGVydGllcyBhcmUgc3RvcmVkIGV2ZW4gaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIHF1ZXVlZCBhbmQgZG9lcyBub3QgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyLgorICogWW91IGNhbiB1cGRhdGUgdGhlc2UgZmxhZ3MgYnkgY2FsbGluZyBSZXF1ZXN0TmFtZSBhZ2FpbiAoZXZlbiBpZgorICogeW91IGFscmVhZHkgb3duIHRoZSBuYW1lKS4KKyAqCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgbWVhbnMgdGhhdCBhbm90aGVyIHJlcXVlc3RvciBvZiB0aGUKKyAqIG5hbWUgY2FuIHRha2UgaXQgYXdheSBmcm9tIHlvdSBieSBzcGVjaWZ5aW5nICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLgorICoKKyAqICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgbWVhbnMgdGhhdCBpZiB5b3UgYXJlbid0IHRoZSBwcmltYXJ5IG93bmVyLAorICogeW91IGRvbid0IHdhbnQgdG8gYmUgcXVldWVkIHVwIC0geW91IG9ubHkgY2FyZSBhYm91dCBiZWluZyB0aGUKKyAqIHByaW1hcnkgb3duZXIuCisgKgorICogVW5saWtlIHRoZSBvdGhlciB0d28gZmxhZ3MsICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGlzIGEgcHJvcGVydHkKKyAqIG9mIHRoZSBpbmRpdmlkdWFsIFJlcXVlc3ROYW1lIGNhbGwsIGkuZS4gdGhlIGJ1cyBkb2VzIG5vdCBwZXJzaXN0ZW50bHkKKyAqIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBjb25uZWN0aW9uLW5hbWUgcGFpci4gSWYgYSBSZXF1ZXN0TmFtZSBjYWxsIGluY2x1ZGVzCisgKiB0aGUgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgYW5kIHRoZSBjdXJyZW50IHByaW1hcnkKKyAqIG93bmVyIGhhcyAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgc2V0LCB0aGVuIHRoZSBjdXJyZW50IHByaW1hcnkKKyAqIG93bmVyIHdpbGwgYmUga2lja2VkIG9mZi4KKyAqCisgKiBJZiBubyBmbGFncyBhcmUgZ2l2ZW4sIGFuIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSB0aGUgcmVxdWVzdGVkCisgKiBuYW1lIG9ubHkgaWYgdGhlIG5hbWUgaXMgY3VycmVudGx5IHVub3duZWQ7IGFuZCBpdCB3aWxsIE5PVCBnaXZlCisgKiB1cCB0aGUgbmFtZSBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIGFza3MgdG8gdGFrZSBpdCBvdmVyIHVzaW5nCisgKiAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZXN1bHQgY29kZS4gVGhlIHBvc3NpYmxlIHJlc3VsdCBjb2RlcworICogYXJlIGFzIGZvbGxvd3MuCisgKiAKKyAqICNEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSIG1lYW5zIHRoYXQgdGhlIG5hbWUgaGFkIG5vCisgKiBleGlzdGluZyBvd25lciwgYW5kIHRoZSBjYWxsZXIgaXMgbm93IHRoZSBwcmltYXJ5IG93bmVyOyBvciB0aGF0CisgKiB0aGUgbmFtZSBoYWQgYW4gb3duZXIsIGFuZCB0aGUgY2FsbGVyIHNwZWNpZmllZAorICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcsIGFuZCB0aGUgY3VycmVudCBvd25lcgorICogc3BlY2lmaWVkICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfSU5fUVVFVUUgaGFwcGVucyBvbmx5IGlmIHRoZSBjYWxsZXIgZG9lcyBOT1QKKyAqIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBhbmQgZWl0aGVyIHRoZSBjdXJyZW50IG93bmVyCisgKiBkaWQgTk9UIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSBjYWxsZXIgZGlkIE5PVAorICogc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4gSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgZW5kcyB1cCAKKyAqIGluIGEgcXVldWUgdG8gb3duIHRoZSBuYW1lIGFmdGVyIHRoZSBjdXJyZW50IG93bmVyIGdpdmVzIGl0IHVwLgorICoKKyAqICNEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFMgaGFwcGVucyBpZiB0aGUgbmFtZSBoYXMgYW4gb3duZXIKKyAqIGFscmVhZHkgYW5kIHRoZSBjYWxsZXIgc3BlY2lmaWVzICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAqIGFuZCBlaXRoZXIgdGhlIGN1cnJlbnQgb3duZXIgaGFzIE5PVCBzcGVjaWZpZWQgCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgb3IgdGhlIGNhbGxlciBkaWQgTk9UIHNwZWNpZnkgCisgKiAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUiBoYXBwZW5zIGlmIGFuIGFwcGxpY2F0aW9uCisgKiByZXF1ZXN0cyBhIG5hbWUgaXQgYWxyZWFkeSBvd25zLiAoUmUtcmVxdWVzdGluZyBhIG5hbWUgaXMgdXNlZnVsIGlmCisgKiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvcgorICogI0RCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBzZXR0aW5ncy4pCisgKgorICogV2hlbiBhIHNlcnZpY2UgcmVwcmVzZW50cyBhbiBhcHBsaWNhdGlvbiwgc2F5ICJ0ZXh0IGVkaXRvciwiIHRoZW4KKyAqIGl0IHNob3VsZCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBpZiBpdCB3YW50cworICogdGhlIGxhc3QgZWRpdG9yIHN0YXJ0ZWQgdG8gYmUgdGhlIHVzZXIncyBlZGl0b3IgdnMuIHRoZSBmaXJzdCBvbmUKKyAqIHN0YXJ0ZWQuICBUaGVuIGFueSBlZGl0b3IgdGhhdCBjYW4gYmUgdGhlIHVzZXIncyBlZGl0b3Igc2hvdWxkCisgKiBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHRvIGVpdGhlciB0YWtlIG92ZXIKKyAqIChsYXN0LXN0YXJ0ZWQtd2lucykgb3IgYmUgcXVldWVkIHVwIChmaXJzdC1zdGFydGVkLXdpbnMpIGFjY29yZGluZworICogdG8gd2hldGhlciAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2FzIGdpdmVuLgorICoKKyAqIENvbnZlbnRpb25hbGx5LCBzaW5nbGUtaW5zdGFuY2UgYXBwbGljYXRpb25zIG9mdGVuIG9mZmVyIGEgY29tbWFuZAorICogbGluZSBvcHRpb24gY2FsbGVkIC0tcmVwbGFjZSB3aGljaCBtZWFucyB0byByZXBsYWNlIHRoZSBjdXJyZW50CisgKiBpbnN0YW5jZS4gIFRvIGltcGxlbWVudCB0aGlzLCBhbHdheXMgc2V0CisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2hlbiB5b3UgcmVxdWVzdCB5b3VyCisgKiBhcHBsaWNhdGlvbidzIGJ1cyBuYW1lLiAgV2hlbiB5b3UgbG9zZSBvd25lcnNoaXAgb2YgeW91ciBidXMgbmFtZSwKKyAqIHlvdSBuZWVkIHRvIGV4aXQuICBMb29rIGZvciB0aGUgc2lnbmFsICJOYW1lTG9zdCIgZnJvbQorICogI0RCVVNfU0VSVklDRV9EQlVTIGFuZCAjREJVU19JTlRFUkZBQ0VfREJVUyAodGhlIHNpZ25hbCdzIGZpcnN0CisgKiBhcmd1bWVudCBpcyB0aGUgYnVzIG5hbWUgdGhhdCB3YXMgbG9zdCkuICBJZiBzdGFydGluZyB1cCB3aXRob3V0CisgKiAtLXJlcGxhY2UsIGRvIG5vdCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLCBhbmQKKyAqIGV4aXQgaWYgeW91IGZhaWwgdG8gYmVjb21lIHRoZSBidXMgbmFtZSBvd25lci4gSWYgLS1yZXBsYWNlIGlzCisgKiBnaXZlbiwgYXNrIHRvIHJlcGxhY2UgdGhlIG9sZCBvd25lci4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gcmVxdWVzdAorICogQHBhcmFtIGZsYWdzIGZsYWdzCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGVycm9yCisgKiBAcmV0dXJucyBhIHJlc3VsdCBjb2RlLCAtMSBpZiBlcnJvciBpcyBzZXQKKyAqLyAKK2ludAorZGJ1c19idXNfcmVxdWVzdF9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIDApOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3ROYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIAorICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfSAgCisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogQXNrcyB0aGUgYnVzIHRvIHVuYXNzaWduIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhpcyBjb25uZWN0aW9uIGJ5CisgKiBpbnZva2luZyB0aGUgUmVsZWFzZU5hbWUgbWV0aG9kIG9uIHRoZSBidXMuIFRoZSAiUmVsZWFzZU5hbWUiCisgKiBtZXRob2QgaXMgY2Fub25pY2FsbHkgZG9jdW1lbnRlZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBQb3NzaWJsZSByZXN1bHRzIGFyZTogI0RCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VECisgKiB3aGljaCBtZWFucyB5b3Ugb3duZWQgdGhlIG5hbWUgb3Igd2VyZSBpbiB0aGUgcXVldWUgdG8gb3duIGl0LAorICogYW5kIGFuZCBub3cgeW91IGRvbid0IG93biBpdCBhbmQgYXJlbid0IGluIHRoZSBxdWV1ZS4KKyAqICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVIgd2hpY2ggbWVhbnMgc29tZW9uZSBlbHNlCisgKiBvd25zIHRoZSBuYW1lIHNvIHlvdSBjYW4ndCByZWxlYXNlIGl0LgorICogI0RCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVAorICogd2hpY2ggbWVhbnMgbm9ib2R5IG93bmVkIHRoZSBuYW1lLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gcmVtb3ZlIAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgYSByZXN1bHQgY29kZSwgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8gCitpbnQKK2RidXNfYnVzX3JlbGVhc2VfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGRidXNfdWludDMyX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChuYW1lKSwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgMCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbGVhc2VOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXNrcyB0aGUgYnVzIHdoZXRoZXIgYSBjZXJ0YWluIG5hbWUgaGFzIGFuIG93bmVyLgorICoKKyAqIFVzaW5nIHRoaXMgY2FuIGVhc2lseSByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbiwKKyAqIHNpbmNlIGFuIG93bmVyIGNhbiBhcHBlYXIgb3IgZGlzYXBwZWFyIGFmdGVyIHlvdQorICogY2FsbCB0aGlzLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHJlcXVlc3QgYSBuYW1lLCBqdXN0IHJlcXVlc3QgaXQ7CisgKiBpZiB5b3Ugd2FudCB0byBhdm9pZCByZXBsYWNpbmcgYSBjdXJyZW50IG93bmVyLAorICogZG9uJ3Qgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBhbmQKKyAqIHlvdSB3aWxsIGdldCBhbiBlcnJvciBpZiB0aGVyZSdzIGFscmVhZHkgYW4gb3duZXIuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGFueSBlcnJvcnMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBuYW1lIGV4aXN0cywgI0ZBTFNFIGlmIG5vdCBvciBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfbmFtZV9oYXNfb3duZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c19ib29sX3QgZXhpc3RzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVIYXNPd25lciIpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLCBlcnJvcik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0JPT0xFQU4sICZleGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBleGlzdHM7Cit9CisKKy8qKgorICogU3RhcnRzIGEgc2VydmljZSB0aGF0IHdpbGwgcmVxdWVzdCBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIG5hbWUuCisgKiBUaGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgYmUgb25lIG9mIGJlIG9uZSBvZgorICogI0RCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUyBvciAjREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcgaWYKKyAqIHN1Y2Nlc3NmdWwuICBQYXNzICNOVUxMIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuCisgKiAKKyAqIFRoZSBmbGFncyBwYXJhbWV0ZXIgaXMgZm9yIGZ1dHVyZSBleHBhbnNpb24sIGN1cnJlbnRseSB5b3Ugc2hvdWxkCisgKiBzcGVjaWZ5IDAuCisgKgorICogSXQncyBvZnRlbiBlYXNpZXIgdG8gYXZvaWQgZXhwbGljaXRseSBzdGFydGluZyBzZXJ2aWNlcywgYW5kCisgKiBqdXN0IHNlbmQgYSBtZXRob2QgY2FsbCB0byB0aGUgc2VydmljZSdzIGJ1cyBuYW1lIGluc3RlYWQuCisgKiBNZXRob2QgY2FsbHMgc3RhcnQgYSBzZXJ2aWNlIHRvIGhhbmRsZSB0aGVtIGJ5IGRlZmF1bHQKKyAqIHVubGVzcyB5b3UgY2FsbCBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQoKSB0byBkaXNhYmxlIHRoaXMKKyAqIGJlaGF2aW9yLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgd2Ugd2FudCB0aGUgbmV3IHNlcnZpY2UgdG8gcmVxdWVzdAorICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyAoc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBub3cpCisgKiBAcGFyYW0gcmVzdWx0IGEgcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdCBvciAjTlVMTAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGFueSBlcnJvcnMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBhY3RpdmF0aW9uIHN1Y2NlZWRlZCwgI0ZBTFNFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfc3RhcnRfc2VydmljZV9ieV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIEZBTFNFKTsKKyAgCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtc2csIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJICAJIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocmVzdWx0ICE9IE5VTEwgJiYKKyAgICAgICFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwgREJVU19UWVBFX1VJTlQzMiwKKwkgICAgICAJCSAgICAgIHJlc3VsdCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIC8qIEJsb2NrIHRvIGNoZWNrIHN1Y2Nlc3MgY29kZXBhdGggKi8KKyAgICAgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgICAgIAorICAgICAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGVycm9yKTsKKyAgICAgIAorICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2lsZW50bHktZmFpbCBub25ibG9ja2luZyBjb2RlcGF0aCAqLworICAgICAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobXNnLCBUUlVFKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtc2csIE5VTEwpOworICAgIH0KK30KKworLyoqCisgKiBBZGRzIGEgbWF0Y2ggcnVsZSB0byBtYXRjaCBtZXNzYWdlcyBnb2luZyB0aHJvdWdoIHRoZSBtZXNzYWdlIGJ1cy4KKyAqIFRoZSAicnVsZSIgYXJndW1lbnQgaXMgdGhlIHN0cmluZyBmb3JtIG9mIGEgbWF0Y2ggcnVsZS4KKyAqCisgKiBJZiB5b3UgcGFzcyAjTlVMTCBmb3IgdGhlIGVycm9yLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiBibG9jazsgdGhlIG1hdGNoIHRodXMgd29uJ3QgYmUgYWRkZWQgdW50aWwgeW91IGZsdXNoIHRoZQorICogY29ubmVjdGlvbiwgYW5kIGlmIHRoZXJlJ3MgYW4gZXJyb3IgYWRkaW5nIHRoZSBtYXRjaAorICogeW91IHdvbid0IGZpbmQgb3V0IGFib3V0IGl0LiBUaGlzIGlzIGdlbmVyYWxseSBhY2NlcHRhYmxlLCBzaW5jZSB0aGUKKyAqIHBvc3NpYmxlIGVycm9ycyAoaW5jbHVkaW5nIGEgbGFjayBvZiByZXNvdXJjZXMgaW4gdGhlIGJ1cywgdGhlIGNvbm5lY3Rpb24KKyAqIGhhdmluZyBleGNlZWRlZCBpdHMgcXVvdGEgb2YgYWN0aXZlIG1hdGNoIHJ1bGVzLCBvciB0aGUgbWF0Y2ggcnVsZSBiZWluZworICogdW5wYXJzZWFibGUpIGFyZSBnZW5lcmFsbHkgdW5yZWNvdmVyYWJsZS4KKyAqCisgKiBJZiB5b3UgcGFzcyBub24tI05VTEwgZm9yIHRoZSBlcnJvciB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGJsb2NrIHVudGlsIGl0IGdldHMgYSByZXBseS4gVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gdXNpbmcgbWF0Y2ggcnVsZSBrZXlzCisgKiBpbnRyb2R1Y2VkIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBELUJ1cywgbGlrZSAnYXJnMG5hbWVzcGFjZScsIHRvIGFsbG93IHRoZQorICogYXBwbGljYXRpb24gdG8gZmFsbCBiYWNrIHRvIGxlc3MgZWZmaWNpZW50IG1hdGNoIHJ1bGVzIHN1cHBvcnRlZCBieSBvbGRlcgorICogdmVyc2lvbnMgb2YgdGhlIGRhZW1vbiBpZiB0aGUgcnVubmluZyB2ZXJzaW9uIGlzIG5vdCBuZXcgZW5vdWdoOyBvciB3aGVuCisgKiB1c2luZyB1c2VyLXN1cHBsaWVkIHJ1bGVzIHJhdGhlciB0aGFuIHJ1bGVzIGhhcmQtY29kZWQgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIE5vcm1hbCBBUEkgY29udmVudGlvbnMgd291bGQgaGF2ZSB0aGUgZnVuY3Rpb24gcmV0dXJuCisgKiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlcnJvciB3YXMgc2V0LAorICogYnV0IHRoYXQgd291bGQgcmVxdWlyZSBibG9ja2luZyBhbHdheXMgdG8gZGV0ZXJtaW5lCisgKiB0aGUgcmV0dXJuIHZhbHVlLgorICoKKyAqIFRoZSBBZGRNYXRjaCBtZXRob2QgaXMgZnVsbHkgZG9jdW1lbnRlZCBpbiB0aGUgRC1CdXMgCisgKiBzcGVjaWZpY2F0aW9uLiBGb3IgcXVpY2sgcmVmZXJlbmNlLCB0aGUgZm9ybWF0IG9mIHRoZSAKKyAqIG1hdGNoIHJ1bGVzIGlzIGRpc2N1c3NlZCBoZXJlLCBidXQgdGhlIHNwZWNpZmljYXRpb24gCisgKiBpcyB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSdWxlcyBhcmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCAKKyAqIGtleS92YWx1ZSBwYWlycy4gQW4gZXhhbXBsZSBpcyAKKyAqICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkRCdXMnLAorICogaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JyIKKyAqCisgKiBQb3NzaWJsZSBrZXlzIHlvdSBjYW4gbWF0Y2ggb24gYXJlIHR5cGUsIHNlbmRlciwgCisgKiBpbnRlcmZhY2UsIG1lbWJlciwgcGF0aCwgZGVzdGluYXRpb24gYW5kIG51bWJlcmVkCisgKiBrZXlzIHRvIG1hdGNoIG1lc3NhZ2UgYXJncyAoa2V5cyBhcmUgJ2FyZzAnLCAnYXJnMScsIGV0Yy4pLgorICogT21pdHRpbmcgYSBrZXkgZnJvbSB0aGUgcnVsZSBpbmRpY2F0ZXMgCisgKiBhIHdpbGRjYXJkIG1hdGNoLiAgRm9yIGluc3RhbmNlIG9taXR0aW5nCisgKiB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCBhZGRpbmcgYSBzZW5kZXIgd291bGQKKyAqIGxldCBhbGwgbWVzc2FnZXMgZnJvbSB0aGF0IHNlbmRlciB0aHJvdWdoIHJlZ2FyZGxlc3Mgb2YKKyAqIHRoZSBtZW1iZXIuCisgKgorICogTWF0Y2hlcyBhcmUgaW5jbHVzaXZlIG5vdCBleGNsdXNpdmUgc28gYXMgbG9uZyBhcyBvbmUgCisgKiBydWxlIG1hdGNoZXMgdGhlIG1lc3NhZ2Ugd2lsbCBnZXQgdGhyb3VnaC4gIEl0IGlzIGltcG9ydGFudAorICogdG8gbm90ZSB0aGlzIGJlY2F1c2UgZXZlcnkgdGltZSBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgdGhlIAorICogYXBwbGljYXRpb24gd2lsbCBiZSBwYWdlZCBpbnRvIG1lbW9yeSB0byBwcm9jZXNzIGl0LiAgVGhpcworICogY2FuIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIHN1Y2ggYXMgZHJhaW5pbmcgYmF0dGVyaWVzCisgKiBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMuCisgKgorICogSWYgeW91IG1hdGNoIG1lc3NhZ2UgYXJncyAoJ2FyZzAnLCAnYXJnMScsIGFuZCBzbyBmb3J0aCkKKyAqIG9ubHkgc3RyaW5nIGFyZ3VtZW50cyB3aWxsIG1hdGNoLiBUaGF0IGlzLCBhcmcwPSc1JyBtZWFucworICogbWF0Y2ggdGhlIHN0cmluZyAiNSIgbm90IHRoZSBpbnRlZ2VyIDUuCisgKgorICogQ3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSB0byBtYXRjaCBhZ2FpbnN0IG5vbi1zdHJpbmcgYXJndW1lbnRzLgorICoKKyAqIEEgc3BlY2lhbGlzZWQgZm9ybSBvZiB3aWxkY2FyZCBtYXRjaGluZyBvbiBhcmd1bWVudHMgaXMKKyAqIHN1cHBvcnRlZCBmb3IgcGF0aC1saWtlIG5hbWVzcGFjZXMuICBJZiB5b3VyIGFyZ3VtZW50IG1hdGNoIGhhcworICogYSAncGF0aCcgc3VmZml4IChlZzogImFyZzBwYXRoPScvc29tZS9wYXRoLyciKSB0aGVuIGl0IGlzCisgKiBjb25zaWRlcmVkIGEgbWF0Y2ggaWYgdGhlIGFyZ3VtZW50IGV4YWN0bHkgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAqIHN0cmluZyBvciBpZiBvbmUgb2YgdGhlbSBlbmRzIGluIGEgJy8nIGFuZCBpcyBhIHByZWZpeCBvZiB0aGUKKyAqIG90aGVyLgorICoKKyAqIE1hdGNoaW5nIG9uIGludGVyZmFjZSBpcyB0cmlja3kgYmVjYXVzZSBtZXRob2QgY2FsbAorICogbWVzc2FnZXMgb25seSBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGludGVyZmFjZS4KKyAqIElmIGEgbWVzc2FnZSBvbWl0cyB0aGUgaW50ZXJmYWNlLCB0aGVuIGl0IHdpbGwgTk9UIG1hdGNoCisgKiBpZiB0aGUgcnVsZSBzcGVjaWZpZXMgYW4gaW50ZXJmYWNlIG5hbWUuIFRoaXMgbWVhbnMgbWF0Y2gKKyAqIHJ1bGVzIG9uIG1ldGhvZCBjYWxscyBzaG91bGQgbm90IHVzdWFsbHkgZ2l2ZSBhbiBpbnRlcmZhY2UuCisgKgorICogSG93ZXZlciwgc2lnbmFsIG1lc3NhZ2VzIGFyZSByZXF1aXJlZCB0byBpbmNsdWRlIHRoZSBpbnRlcmZhY2UKKyAqIHNvIHdoZW4gbWF0Y2hpbmcgc2lnbmFscyB1c3VhbGx5IHlvdSBzaG91bGQgc3BlY2lmeSB0aGUgaW50ZXJmYWNlCisgKiBpbiB0aGUgbWF0Y2ggcnVsZS4KKyAqIAorICogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBjYW4gbWF0Y2ggYXJndW1lbnRzIG9ubHkgdXAgdG8KKyAqICNEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSLgorICoKKyAqIE1hdGNoIHJ1bGVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAjREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RICisgKiBieXRlcy4KKyAqCisgKiBCb3RoIG9mIHRoZXNlIG1heGltdW1zIGFyZSBtdWNoIGhpZ2hlciB0aGFuIHlvdSdyZSBsaWtlbHkgdG8gbmVlZCwKKyAqIHRoZXkgb25seSBleGlzdCBiZWNhdXNlIHRoZSBELUJ1cyBidXMgZGFlbW9uIGhhcyBmaXhlZCBsaW1pdHMgb24KKyAqIGFsbCByZXNvdXJjZSB1c2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cworICogQHBhcmFtIHJ1bGUgdGV4dHVhbCBmb3JtIG9mIG1hdGNoIHJ1bGUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKi8KK3ZvaWQKK2RidXNfYnVzX2FkZF9tYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptc2c7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHJ1bGUgIT0gTlVMTCk7CisKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkTWF0Y2giKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBwcmV2aW91c2x5LWFkZGVkIG1hdGNoIHJ1bGUgImJ5IHZhbHVlIiAodGhlIG1vc3QKKyAqIHJlY2VudGx5LWFkZGVkIGlkZW50aWNhbCBydWxlIGdldHMgcmVtb3ZlZCkuICBUaGUgInJ1bGUiIGFyZ3VtZW50CisgKiBpcyB0aGUgc3RyaW5nIGZvcm0gb2YgYSBtYXRjaCBydWxlLgorICoKKyAqIFRoZSBidXMgY29tcGFyZXMgbWF0Y2ggcnVsZXMgc2VtYW50aWNhbGx5LCBub3QgdGV4dHVhbGx5LCBzbworICogd2hpdGVzcGFjZSBhbmQgb3JkZXJpbmcgZG9uJ3QgaGF2ZSB0byBiZSBpZGVudGljYWwgdG8KKyAqIHRoZSBydWxlIHlvdSBwYXNzZWQgdG8gZGJ1c19idXNfYWRkX21hdGNoKCkuCisgKiAKKyAqIElmIHlvdSBwYXNzICNOVUxMIGZvciB0aGUgZXJyb3IsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKKyAqIGJsb2NrOyBvdGhlcndpc2UgaXQgd2lsbC4gU2VlIGRldGFpbGVkIGV4cGxhbmF0aW9uIGluCisgKiBkb2NzIGZvciBkYnVzX2J1c19hZGRfbWF0Y2goKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMKKyAqIEBwYXJhbSBydWxlIHRleHR1YWwgZm9ybSBvZiBtYXRjaCBydWxlCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgYW55IGVycm9ycworICovCit2b2lkCitkYnVzX2J1c19yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChydWxlICE9IE5VTEwpOworICAKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3ZlTWF0Y2giKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1idXMuaCBiL2RidXMvZGJ1cy1idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWJ1cy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1idXMuaCAgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0JVU19ICisjZGVmaW5lIERCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQnVzCisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiAqZGJ1c19idXNfZ2V0ICAgICAgICAgICAgICAoREJ1c0J1c1R5cGUgICAgIHR5cGUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24gKmRidXNfYnVzX2dldF9wcml2YXRlICAgICAgKERCdXNCdXNUeXBlICAgICB0eXBlLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfYnVzX3JlZ2lzdGVyICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3Vuc2lnbmVkIGxvbmcgICBkYnVzX2J1c19nZXRfdW5peF91c2VyICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgICAgICBkYnVzX2J1c19nZXRfaWQgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19idXNfcmVsZWFzZV9uYW1lICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19uYW1lX2hhc19vd25lciAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19idXNfc3RhcnRfc2VydmljZV9ieV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2ggICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggYi9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzU3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIERCdXNDb25uZWN0aW9uIGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZGF0YXNsb3QuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORyA9IDEgPDwgMCwgLyoqPCBXcml0ZSBtZXNzYWdlcyBvdXQuICovCisgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgPSAxIDw8IDEsIC8qKjwgUmVhZCBtZXNzYWdlcyBpbi4gKi8KKyAgREJVU19JVEVSQVRJT05fQkxPQ0sgICAgICA9IDEgPDwgMiAgLyoqPCBCbG9jayBpZiBub3RoaW5nIHRvIGRvLiAqLworfSBEQnVzSXRlcmF0aW9uRmxhZ3M7CisKKy8qKiBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgd2hlbiB3YWl0aW5nIGZvciBhIG1lc3NhZ2UgcmVwbHksIDI1IHNlY29uZHMgKi8KKyNkZWZpbmUgX0RCVVNfREVGQVVMVF9USU1FT1VUX1ZBTFVFICgyNSAqIDEwMDApCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzUGVuZGluZ0Zkc0NoYW5nZUZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiAqICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmsgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK0RCdXNNZXNzYWdlKiAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X21lc3NhZ2VfdG9fc2VuZCAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV93YXRjaF91bmxvY2tlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBlbmFibGVkKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoICAgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworREJ1c0Nvbm5lY3Rpb24qICAgX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworCitEQnVzUGVuZGluZ0NhbGwqICBfZGJ1c19wZW5kaW5nX2NhbGxfbmV3ICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICB0aW1lb3V0X2hhbmRsZXIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX25vdGlmeSAgICAgICAgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9wZW5kaW5nX2NhbGwgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAqY2xpZW50X3NlcmlhbCk7CisKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqKmRpc3BhdGNoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggKippb19wYXRoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqKmRpc3BhdGNoX2NvbmRfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICoqaW9fcGF0aF9jb25kX2xvYyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9wZW5kaW5nX2Zkc19jb3VudCAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9zZXRfcGVuZGluZ19mZHNfZnVuY3Rpb24gICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nRmRzQ2hhbmdlRnVuY3Rpb24gY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsICAgICAgIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKipsYWJlbF9wKTsKKworLyogaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfY29ubmVjdGlvbl9nZXRfc3RhdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX3BlYWtfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19mZHMpOworCisKKy8qIGlmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCitjb25zdCBjaGFyKiBfZGJ1c19jb25uZWN0aW9uX2dldF9hZGRyZXNzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIFRoaXMgX2RidXNfYnVzXyogc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBkYnVzLWJ1cy1pbnRlcm5hbC5oIHNlZW1zCisgKiBzaWxseSBmb3Igb25lIGZ1bmN0aW9uCisgKi8KKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0J1c0ludGVybmFscworICogQHsKKyAqLworCit2b2lkICAgICAgICAgICBfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiogQH0gKi8KKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DT05ORUNUSU9OX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jb25uZWN0aW9uLmMgYi9kYnVzL2RidXMtY29ubmVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTg5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsNjM4NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24uYyBEQnVzQ29ubmVjdGlvbiBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJkYnVzLXNoYXJlZC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtdGltZW91dC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1kYXRhc2xvdC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLXBlbmRpbmctY2FsbC5oIgorI2luY2x1ZGUgImRidXMtb2JqZWN0LXRyZWUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWJ1cy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZWxzZQorI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0ICghKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayk7IFwKKyAgICAoY29ubmVjdGlvbiktPmhhdmVfY29ubmVjdGlvbl9sb2NrID0gVFJVRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhjb25uZWN0aW9uKSBkbyB7ICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayk7ICAgXAorICAgIChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2sgPSBGQUxTRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBIQVZFX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgICAgICAgIF9kYnVzX2Fzc2VydCAoKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jaykKKy8qIEEgIkRPX05PVF9IQVZFX0xPQ0tfQ0hFQ0siIGlzIGltcG9zc2libGUgc2luY2Ugd2UgbmVlZCB0aGUgbG9jayB0byBjaGVjayB0aGUgZmxhZyAqLworI2VuZGlmCisKKyNkZWZpbmUgVFJBQ0VfTE9DS1MgMQorCisjZGVmaW5lIENPTk5FQ1RJT05fTE9DSyhjb25uZWN0aW9uKSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoVFJBQ0VfTE9DS1MpIHsgX2RidXNfdmVyYm9zZSAoIkxPQ0tcbiIpOyB9ICAgXAorICAgIF9kYnVzX3JtdXRleF9sb2NrICgoY29ubmVjdGlvbiktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVE9PS19MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05ORUNUSU9OX1VOTE9DSyhjb25uZWN0aW9uKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbikKKworI2RlZmluZSBTTE9UU19MT0NLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X2xvY2sgKChjb25uZWN0aW9uKS0+c2xvdF9tdXRleCk7ICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTE9UU19VTkxPQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X3VubG9jayAoKGNvbm5lY3Rpb24pLT5zbG90X211dGV4KTsgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBESVNQQVRDSF9TVEFUVVNfTkFNRShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChzKSA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFID8gImNvbXBsZXRlIiA6ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyA/ICJkYXRhIHJlbWFpbnMiIDogXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZID8gIm5lZWQgbWVtb3J5IiA6ICAgXAorICAgICAgICAgICAgICAgICAgICAgICI/Pz8iKQorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbiBEQnVzQ29ubmVjdGlvbgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBDb25uZWN0aW9uIHRvIGFub3RoZXIgYXBwbGljYXRpb24KKyAqCisgKiBBIERCdXNDb25uZWN0aW9uIHJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRvIGFub3RoZXIKKyAqIGFwcGxpY2F0aW9uLiBNZXNzYWdlcyBjYW4gYmUgc2VudCBhbmQgcmVjZWl2ZWQgdmlhIHRoaXMgY29ubmVjdGlvbi4KKyAqIFRoZSBvdGhlciBhcHBsaWNhdGlvbiBtYXkgYmUgYSBtZXNzYWdlIGJ1czsgZm9yIGNvbnZlbmllbmNlLCB0aGUKKyAqIGZ1bmN0aW9uIGRidXNfYnVzX2dldCgpIGlzIHByb3ZpZGVkIHRvIGF1dG9tYXRpY2FsbHkgb3BlbiBhCisgKiBjb25uZWN0aW9uIHRvIHRoZSB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXMuCisgKiAKKyAqIEluIGJyaWVmIGEgREJ1c0Nvbm5lY3Rpb24gaXMgYSBtZXNzYWdlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCBzb21lCisgKiBtZXNzYWdlIHRyYW5zcG9ydCBtZWNoYW5pc20gc3VjaCBhcyBhIHNvY2tldC4gIFRoZSBjb25uZWN0aW9uCisgKiBtYWludGFpbnMgYSBxdWV1ZSBvZiBpbmNvbWluZyBtZXNzYWdlcyBhbmQgYSBxdWV1ZSBvZiBvdXRnb2luZworICogbWVzc2FnZXMuCisgKgorICogU2V2ZXJhbCBmdW5jdGlvbnMgdXNlIHRoZSBmb2xsb3dpbmcgdGVybXM6CisgKiA8dWw+CisgKiA8bGk+PGI+cmVhZDwvYj4gbWVhbnMgdG8gZmlsbCB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSBieSByZWFkaW5nIGZyb20gdGhlIHNvY2tldDwvbGk+CisgKiA8bGk+PGI+d3JpdGU8L2I+IG1lYW5zIHRvIGRyYWluIHRoZSBvdXRnb2luZyBxdWV1ZSBieSB3cml0aW5nIHRvIHRoZSBzb2NrZXQ8L2xpPgorICogPGxpPjxiPmRpc3BhdGNoPC9iPiBtZWFucyB0byBkcmFpbiB0aGUgaW5jb21pbmcgcXVldWUgYnkgaW52b2tpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgbWVzc2FnZSBoYW5kbGVyczwvbGk+CisgKiA8L3VsPgorICoKKyAqIFRoZSBmdW5jdGlvbiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGZvciBleGFtcGxlIGRvZXMgYWxsCisgKiB0aHJlZSBvZiB0aGVzZSB0aGluZ3MsIG9mZmVyaW5nIGEgc2ltcGxlIGFsdGVybmF0aXZlIHRvIGEgbWFpbiBsb29wLgorICoKKyAqIEluIGFuIGFwcGxpY2F0aW9uIHdpdGggYSBtYWluIGxvb3AsIHRoZSByZWFkL3dyaXRlL2Rpc3BhdGNoCisgKiBvcGVyYXRpb25zIGFyZSB1c3VhbGx5IHNlcGFyYXRlLgorICoKKyAqIFRoZSBjb25uZWN0aW9uIHByb3ZpZGVzICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dCBvYmplY3RzIHRvCisgKiB0aGUgbWFpbiBsb29wLiBUaGVzZSBhcmUgdXNlZCB0byBrbm93IHdoZW4gcmVhZGluZywgd3JpdGluZywgb3IKKyAqIGRpc3BhdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKiAKKyAqIEluY29taW5nIG1lc3NhZ2VzIGFyZSBwcm9jZXNzZWQKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpCisgKiBydW5zIGFueSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGUgdG9wbW9zdCBtZXNzYWdlIGluIHRoZSBtZXNzYWdlCisgKiBxdWV1ZSwgdGhlbiBkaXNjYXJkcyB0aGUgbWVzc2FnZSwgdGhlbiByZXR1cm5zLgorICogCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpIGluZGljYXRlcyB3aGV0aGVyCisgKiBtZXNzYWdlcyBhcmUgY3VycmVudGx5IGluIHRoZSBxdWV1ZSB0aGF0IG5lZWQgZGlzcGF0Y2hpbmcuCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpIGFsbG93cworICogeW91IHRvIHNldCBhIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgZGlzcGF0Y2ggc3RhdHVzLgorICogCisgKiBJZiB5b3UncmUgdXNpbmcgR0xpYiBvciBRdCBhZGQtb24gbGlicmFyaWVzIGZvciBELUJ1cywgdGhlcmUgYXJlCisgKiBzcGVjaWFsIGNvbnZlbmllbmNlIEFQSXMgaW4gdGhvc2UgbGlicmFyaWVzIHRoYXQgaGlkZQorICogYWxsIHRoZSBkZXRhaWxzIG9mIGRpc3BhdGNoIGFuZCB3YXRjaC90aW1lb3V0IG1vbml0b3JpbmcuCisgKiBGb3IgZXhhbXBsZSwgZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKCkuCisgKgorICogSWYgeW91IGFyZW4ndCB1c2luZyB0aGVzZSBhZGQtb24gbGlicmFyaWVzLCBidXQgd2FudCB0byBwcm9jZXNzCisgKiBtZXNzYWdlcyBhc3luY2hyb25vdXNseSwgeW91IG11c3QgbWFudWFsbHkgY2FsbAorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgcHJvdmlkaW5nIGFwcHJvcHJpYXRlCisgKiBmdW5jdGlvbnMgdG8gaW50ZWdyYXRlIHRoZSBjb25uZWN0aW9uIHdpdGggeW91ciBhcHBsaWNhdGlvbidzIG1haW4KKyAqIGxvb3AuIFRoaXMgY2FuIGJlIHRyaWNreSB0byBnZXQgcmlnaHQ7IG1haW4gbG9vcHMgYXJlIG5vdCBzaW1wbGUuCisgKgorICogSWYgeW91IGRvbid0IG5lZWQgdG8gYmUgYXN5bmNocm9ub3VzLCB5b3UgY2FuIGlnbm9yZSAjREJ1c1dhdGNoLAorICogI0RCdXNUaW1lb3V0LCBhbmQgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuICBJbnN0ZWFkLAorICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBjYW4gYmUgdXNlZC4KKyAqCisgKiBPciwgaW4gPGVtPnZlcnk8L2VtPiBzaW1wbGUgYXBwbGljYXRpb25zLAorICogZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCkgbWF5IGJlIGFsbCB5b3UgbmVlZCwgYWxsb3dpbmcgeW91IHRvCisgKiBhdm9pZCBzZXR0aW5nIHVwIGFueSBoYW5kbGVyIGZ1bmN0aW9ucyAoc2VlCisgKiBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlcigpLAorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgZm9yIG1vcmUgb24gaGFuZGxlcnMpLgorICogCisgKiBXaGVuIHlvdSB1c2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSBvciBvbmUgb2YgaXRzIHZhcmlhbnRzIHRvIHNlbmQKKyAqIGEgbWVzc2FnZSwgdGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIG91dGdvaW5nIHF1ZXVlLiAgSXQncworICogYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgbmV0d29yayBsYXRlcjsgZWl0aGVyIGluCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIGludm9rZWQgYnkgeW91ciBtYWluIGxvb3AsIG9yIGluCisgKiBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSB3aGljaCBibG9ja3MgdW50aWwgaXQgY2FuIHdyaXRlIG91dCB0aGUKKyAqIGVudGlyZSBvdXRnb2luZyBxdWV1ZS4gVGhlIEdMaWIvUXQgYWRkLW9uIGxpYnJhcmllcyBhZ2FpbgorICogaGFuZGxlIHRoZSBkZXRhaWxzIGhlcmUgZm9yIHlvdSBieSBzZXR0aW5nIHVwIHdhdGNoIGZ1bmN0aW9ucy4KKyAqCisgKiBXaGVuIGEgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHlvdSBhcmUgZ3VhcmFudGVlZCB0byBnZXQgYQorICogc2lnbmFsICJEaXNjb25uZWN0ZWQiIGZyb20gdGhlIGludGVyZmFjZQorICogI0RCVVNfSU5URVJGQUNFX0xPQ0FMLCBwYXRoCisgKiAjREJVU19QQVRIX0xPQ0FMLgorICoKKyAqIFlvdSBtYXkgbm90IGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgI0RCdXNDb25uZWN0aW9uCisgKiB1bnRpbCB0aGF0IGNvbm5lY3Rpb24gaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICoKKyAqIFlvdSBtYXkgZGlzcGF0Y2ggdGhlIHVucHJvY2Vzc2VkIGluY29taW5nIG1lc3NhZ2UgcXVldWUgZXZlbiBpZiB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLiBIb3dldmVyLCAiRGlzY29ubmVjdGVkIiB3aWxsIGFsd2F5cyBiZQorICogdGhlIGxhc3QgbWVzc2FnZSBpbiB0aGUgcXVldWUgKG9idmlvdXNseSBubyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQKKyAqIGFmdGVyIGRpc2Nvbm5lY3Rpb24pLgorICoKKyAqIEFmdGVyIGNhbGxpbmcgZGJ1c190aHJlYWRzX2luaXQoKSwgI0RCdXNDb25uZWN0aW9uIGhhcyB0aHJlYWQKKyAqIGxvY2tzIGFuZCBkcm9wcyB0aGVtIHdoZW4gaW52b2tpbmcgdXNlciBjYWxsYmFja3MsIHNvIGluIGdlbmVyYWwgaXMKKyAqIHRyYW5zcGFyZW50bHkgdGhyZWFkc2FmZS4gSG93ZXZlciwgI0RCdXNNZXNzYWdlIGRvZXMgTk9UIGhhdmUKKyAqIHRocmVhZCBsb2NrczsgeW91IG11c3Qgbm90IHNlbmQgdGhlIHNhbWUgbWVzc2FnZSB0byBtdWx0aXBsZQorICogI0RCdXNDb25uZWN0aW9uIGlmIHRob3NlIGNvbm5lY3Rpb25zIHdpbGwgYmUgdXNlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzLAorICogZm9yIGV4YW1wbGUuCisgKgorICogQWxzbywgaWYgeW91IGRpc3BhdGNoIG9yIHBvcCBtZXNzYWdlcyBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGl0CisgKiBtYXkgd29yayBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3b24ndCBjcmFzaCwgYnV0IGl0J3MgdG91Z2ggdG8gaW1hZ2luZQorICogc2FuZSByZXN1bHRzOyBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgdW5wcmVkaWN0YWJsZSB3aGljaCBtZXNzYWdlcworICogZ28gdG8gd2hpY2ggdGhyZWFkcy4KKyAqCisgKiBJdCdzIHJlY29tbWVuZGVkIHRvIGRpc3BhdGNoIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICoKKyAqIFRoZSBtb3N0IHVzZWZ1bCBmdW5jdGlvbiB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhdCBvbmNlCisgKiBpcyBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpLiBUaGF0IGlzLAorICogbXVsdGlwbGUgdGhyZWFkcyBjYW4gbWFrZSBtZXRob2QgY2FsbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBJZiB5b3UgYXJlbid0IHVzaW5nIHRocmVhZHMsIHlvdSBjYW4gdXNlIGEgbWFpbiBsb29wIGFuZAorICogZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSgpIHRvIGFjaGlldmUgYSBzaW1pbGFyIHJlc3VsdC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbkludGVybmFscyBEQnVzQ29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgaW50IG9sZF9yZWZjb3VudCwKKyAgICBpbnQgbmV3X3JlZmNvdW50LAorICAgIGNvbnN0IGNoYXIgKndoeSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgc3RhdGljIGludCBlbmFibGVkID0gLTE7CisKKyAgX2RidXNfdHJhY2VfcmVmICgiREJ1c0Nvbm5lY3Rpb24iLCBjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwKKyAgICAgIHdoeSwgIkRCVVNfQ09OTkVDVElPTl9UUkFDRSIsICZlbmFibGVkKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEludGVybmFsIHN0cnVjdCByZXByZXNlbnRpbmcgYSBtZXNzYWdlIGZpbHRlciBmdW5jdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VGaWx0ZXIgREJ1c01lc3NhZ2VGaWx0ZXI7CisKKy8qKgorICogSW50ZXJuYWwgc3RydWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZmlsdGVyIGZ1bmN0aW9uIAorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2VGaWx0ZXIKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiBmdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBjYWxsIHRvIGZpbHRlciAqLworICB2b2lkICp1c2VyX2RhdGE7IC8qKjwgVXNlciBkYXRhIGZvciB0aGUgZnVuY3Rpb24gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3VzZXJfZGF0YV9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHRoZSB1c2VyIGRhdGEgKi8KK307CisKKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1ByZWFsbG9jYXRlZFNlbmQKKyAqLworc3RydWN0IERCdXNQcmVhbGxvY2F0ZWRTZW5kCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAvKio8IENvbm5lY3Rpb24gd2UnZCBzZW5kIHRoZSBtZXNzYWdlIHRvICovCisgIERCdXNMaXN0ICpxdWV1ZV9saW5rOyAgICAgICAvKio8IFByZWFsbG9jYXRlZCBsaW5rIGluIHRoZSBxdWV1ZSAqLworICBEQnVzTGlzdCAqY291bnRlcl9saW5rOyAgICAgLyoqPCBQcmVhbGxvY2F0ZWQgbGluayBpbiB0aGUgcmVzb3VyY2UgY291bnRlciAqLworfTsKKworI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c19tb2RpZnlfc2lncGlwZSA9IEZBTFNFOworI2Vsc2UKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c19tb2RpZnlfc2lncGlwZSA9IFRSVUU7CisjZW5kaWYKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNDb25uZWN0aW9uLiBBbGwgZmllbGRzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24KK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQuICovCisKKyAgREJ1c1JNdXRleCAqbXV0ZXg7IC8qKjwgTG9jayBvbiB0aGUgZW50aXJlIERCdXNDb25uZWN0aW9uICovCisKKyAgREJ1c0NNdXRleCAqZGlzcGF0Y2hfbXV0ZXg7ICAgICAvKio8IFByb3RlY3RzIGRpc3BhdGNoX2FjcXVpcmVkICovCisgIERCdXNDb25kVmFyICpkaXNwYXRjaF9jb25kOyAgICAvKio8IE5vdGlmeSB3aGVuIGRpc3BhdGNoX2FjcXVpcmVkIGlzIGF2YWlsYWJsZSAqLworICBEQnVzQ011dGV4ICppb19wYXRoX211dGV4OyAgICAgIC8qKjwgUHJvdGVjdHMgaW9fcGF0aF9hY3F1aXJlZCAqLworICBEQnVzQ29uZFZhciAqaW9fcGF0aF9jb25kOyAgICAgLyoqPCBOb3RpZnkgd2hlbiBpb19wYXRoX2FjcXVpcmVkIGlzIGF2YWlsYWJsZSAqLworICAKKyAgREJ1c0xpc3QgKm91dGdvaW5nX21lc3NhZ2VzOyAvKio8IFF1ZXVlIG9mIG1lc3NhZ2VzIHdlIG5lZWQgdG8gc2VuZCwgc2VuZCB0aGUgZW5kIG9mIHRoZSBsaXN0IGZpcnN0LiAqLworICBEQnVzTGlzdCAqaW5jb21pbmdfbWVzc2FnZXM7IC8qKjwgUXVldWUgb2YgbWVzc2FnZXMgd2UgaGF2ZSByZWNlaXZlZCwgZW5kIG9mIHRoZSBsaXN0IHJlY2VpdmVkIG1vc3QgcmVjZW50bHkuICovCisgIERCdXNMaXN0ICpleHBpcmVkX21lc3NhZ2VzOyAgLyoqPCBNZXNzYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB3ZSBuZXh0IHVubG9jay4gKi8KKworICBEQnVzTWVzc2FnZSAqbWVzc2FnZV9ib3Jyb3dlZDsgLyoqPCBGaWxsZWQgaW4gaWYgdGhlIGZpcnN0IGluY29taW5nIG1lc3NhZ2UgaGFzIGJlZW4gYm9ycm93ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRpc3BhdGNoX2FjcXVpcmVkIHdpbGwgYmUgc2V0IGJ5IHRoZSBib3Jyb3dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBpbnQgbl9vdXRnb2luZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIG91dGdvaW5nIHF1ZXVlLiAqLworICBpbnQgbl9pbmNvbWluZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIGluY29taW5nIHF1ZXVlLiAqLworCisgIERCdXNDb3VudGVyICpvdXRnb2luZ19jb3VudGVyOyAvKio8IENvdW50cyBzaXplIG9mIG91dGdvaW5nIG1lc3NhZ2VzLiAqLworICAKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OyAgICAvKio8IE9iamVjdCB0aGF0IHNlbmRzL3JlY2VpdmVzIG1lc3NhZ2VzIG92ZXIgbmV0d29yay4gKi8KKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsgICAgICAvKio8IFN0b3JlcyBhY3RpdmUgd2F0Y2hlcy4gKi8KKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsgICAvKio8IFN0b3JlcyBhY3RpdmUgdGltZW91dHMuICovCisgIAorICBEQnVzTGlzdCAqZmlsdGVyX2xpc3Q7ICAgICAgICAvKio8IExpc3Qgb2YgZmlsdGVycy4gKi8KKworICBEQnVzUk11dGV4ICpzbG90X211dGV4OyAgICAgICAgLyoqPCBMb2NrIG9uIHNsb3RfbGlzdCBzbyBvdmVyYWxsIGNvbm5lY3Rpb24gbG9jayBuZWVkIG5vdCBiZSB0YWtlbiAqLworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19yZXBsaWVzOyAgLyoqPCBIYXNoIG9mIG1lc3NhZ2Ugc2VyaWFscyB0byAjREJ1c1BlbmRpbmdDYWxsLiAqLyAgCisgIAorICBkYnVzX3VpbnQzMl90IGNsaWVudF9zZXJpYWw7ICAgICAgIC8qKjwgQ2xpZW50IHNlcmlhbC4gSW5jcmVtZW50cyBlYWNoIHRpbWUgYSBtZXNzYWdlIGlzIHNlbnQgICovCisgIERCdXNMaXN0ICpkaXNjb25uZWN0X21lc3NhZ2VfbGluazsgLyoqPCBQcmVhbGxvY2F0ZWQgbGlzdCBub2RlIGZvciBxdWV1ZWluZyB0aGUgZGlzY29ubmVjdGlvbiBtZXNzYWdlICovCisKKyAgREJ1c1dha2V1cE1haW5GdW5jdGlvbiB3YWtldXBfbWFpbl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byB3YWtlIHVwIHRoZSBtYWlubG9vcCAgKi8KKyAgdm9pZCAqd2FrZXVwX21haW5fZGF0YTsgLyoqPCBBcHBsaWNhdGlvbiBkYXRhIGZvciB3YWtldXBfbWFpbl9mdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfd2FrZXVwX21haW5fZGF0YTsgLyoqPCBmcmVlIHdha2V1cF9tYWluX2RhdGEgKi8KKworICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gb24gZGlzcGF0Y2ggc3RhdHVzIGNoYW5nZXMgICovCisgIHZvaWQgKmRpc3BhdGNoX3N0YXR1c19kYXRhOyAvKio8IEFwcGxpY2F0aW9uIGRhdGEgZm9yIGRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGlzcGF0Y2hfc3RhdHVzX2RhdGE7IC8qKjwgZnJlZSBkaXNwYXRjaF9zdGF0dXNfZGF0YSAqLworCisgIERCdXNEaXNwYXRjaFN0YXR1cyBsYXN0X2Rpc3BhdGNoX3N0YXR1czsgLyoqPCBUaGUgbGFzdCBkaXNwYXRjaCBzdGF0dXMgd2UgcmVwb3J0ZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiAqLworCisgIERCdXNPYmplY3RUcmVlICpvYmplY3RzOyAvKio8IE9iamVjdCBwYXRoIGhhbmRsZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24gKi8KKworICBjaGFyICpzZXJ2ZXJfZ3VpZDsgLyoqPCBHVUlEIG9mIHNlcnZlciBpZiB3ZSBhcmUgaW4gc2hhcmVkX2Nvbm5lY3Rpb25zLCAjTlVMTCBpZiBzZXJ2ZXIgR1VJRCBpcyB1bmtub3duIG9yIGNvbm5lY3Rpb24gaXMgcHJpdmF0ZSAqLworCisgIC8qIFRoZXNlIHR3byBNVVNUIGJlIGJvb2xzIGFuZCBub3QgYml0ZmllbGRzLCBiZWNhdXNlIHRoZXkgYXJlIHByb3RlY3RlZCBieSBhIHNlcGFyYXRlIGxvY2sKKyAgICogZnJvbSBjb25uZWN0aW9uLT5tdXRleCBhbmQgYWxsIGJpdGZpZWxkcyBpbiBhIHdvcmQgaGF2ZSB0byBiZSByZWFkL3dyaXR0ZW4gdG9nZXRoZXIuCisgICAqIFNvIHlvdSBjYW4ndCBoYXZlIGEgZGlmZmVyZW50IGxvY2sgZm9yIGRpZmZlcmVudCBiaXRmaWVsZHMgaW4gdGhlIHNhbWUgd29yZC4KKyAgICovCisgIGRidXNfYm9vbF90IGRpc3BhdGNoX2FjcXVpcmVkOyAvKio8IFNvbWVvbmUgaGFzIGRpc3BhdGNoIHBhdGggKGNhbiBkcmFpbiBpbmNvbWluZyBxdWV1ZSkgKi8KKyAgZGJ1c19ib29sX3QgaW9fcGF0aF9hY3F1aXJlZDsgIC8qKjwgU29tZW9uZSBoYXMgdHJhbnNwb3J0IGlvIHBhdGggKGNhbiB1c2UgdGhlIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIG1lc3NhZ2VzKSAqLworICAKKyAgdW5zaWduZWQgaW50IHNoYXJlYWJsZSA6IDE7IC8qKjwgI1RSVUUgaWYgbGliZGJ1cyBvd25zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uIGFuZCBjYW4gcmV0dXJuIGl0IGZyb20gZGJ1c19jb25uZWN0aW9uX29wZW4oKSBtb3JlIHRoYW4gb25jZSAqLworICAKKyAgdW5zaWduZWQgaW50IGV4aXRfb25fZGlzY29ubmVjdCA6IDE7IC8qKjwgSWYgI1RSVUUsIGV4aXQgYWZ0ZXIgaGFuZGxpbmcgZGlzY29ubmVjdCBzaWduYWwgKi8KKworICB1bnNpZ25lZCBpbnQgcm91dGVfcGVlcl9tZXNzYWdlcyA6IDE7IC8qKjwgSWYgI1RSVUUsIGlmIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgbWVzc2FnZXMgaGF2ZSBhIGJ1cyBuYW1lLCBkb24ndCBoYW5kbGUgdGhlbSBhdXRvbWF0aWNhbGx5ICovCisKKyAgdW5zaWduZWQgaW50IGRpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWQgOiAxOyAgIC8qKjwgV2UgcG9wcGVkIG9yIGFyZSBkaXNwYXRjaGluZyB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGUgZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgaXMgTlVMTCB0aGVuIHdlIHF1ZXVlZCBpdCwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGZsYWcgaXMgd2hldGhlciBpdCBnb3QgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQgOiAxOyAvKio8IFdlIGRpZCBvdXIgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNoIGFzIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgdW5zaWduZWQgaW50IGhhdmVfY29ubmVjdGlvbl9sb2NrIDogMTsgLyoqPCBVc2VkIHRvIGNoZWNrIGxvY2tpbmcgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChEQlVTX0VOQUJMRV9DSEVDS1MpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfQVNTRVJUKQorICBpbnQgZ2VuZXJhdGlvbjsgLyoqPCBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gdGhhdCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGlzIGNvbm5lY3Rpb24gKi8KKyNlbmRpZiAKK307CisKK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMgX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgIG5ld19zdGF0dXMpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2xhc3RfdW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cyBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIGRidXNfYm9vbF90ICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3BlZWtfZm9yX3JlcGx5X3VubG9ja2VkICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICBjbGllbnRfc2VyaWFsKTsKKworc3RhdGljIERCdXNNZXNzYWdlRmlsdGVyICoKK19kYnVzX21lc3NhZ2VfZmlsdGVyX3JlZiAoREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcikKK3sKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIF9kYnVzX2F0b21pY19pbmMgKCZmaWx0ZXItPnJlZmNvdW50KTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2luYyAoJmZpbHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF92YWx1ZSA+IDApOworI2VuZGlmCisKKyAgcmV0dXJuIGZpbHRlcjsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZmaWx0ZXItPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPiAwKTsKKworICBpZiAob2xkX3ZhbHVlID09IDEpCisgICAgeworICAgICAgaWYgKGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pCisgICAgICAgICgqIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pIChmaWx0ZXItPnVzZXJfZGF0YSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoZmlsdGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQWNxdWlyZXMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9sb2NrIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBSZWxlYXNlcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpleHBpcmVkX21lc3NhZ2VzOworICBEQnVzTGlzdCAqaXRlcjsKKworICBpZiAoVFJBQ0VfTE9DS1MpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlVOTE9DS1xuIik7CisgICAgfQorCisgIC8qIElmIHdlIGhhZCBtZXNzYWdlcyB0aGF0IGV4cGlyZWQgKGZlbGwgb2ZmIHRoZSBpbmNvbWluZyBvciBvdXRnb2luZworICAgKiBxdWV1ZXMpIHdoaWxlIHdlIHdlcmUgbG9ja2VkLCBhY3R1YWxseSByZWxlYXNlIHRoZW0gbm93ICovCisgIGV4cGlyZWRfbWVzc2FnZXMgPSBjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzOworICBjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzID0gTlVMTDsKKworICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPm11dGV4KTsKKworICBmb3IgKGl0ZXIgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZXhwaXJlZF9tZXNzYWdlcyk7CisgICAgICBpdGVyICE9IE5VTEw7CisgICAgICBpdGVyID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmV4cGlyZWRfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlID0gaXRlci0+ZGF0YTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChpdGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogV2FrZXMgdXAgdGhlIG1haW4gbG9vcCBpZiBpdCBpcyBzbGVlcGluZworICogTmVlZGVkIGlmIHdlJ3JlIGUuZy4gcXVldWVpbmcgb3V0Z29pbmcgbWVzc2FnZXMKKyAqIG9uIGEgdGhyZWFkIHdoaWxlIHRoZSBtYWlubG9vcCBzbGVlcHMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmIChjb25uZWN0aW9uLT53YWtldXBfbWFpbl9mdW5jdGlvbikKKyAgICAoKmNvbm5lY3Rpb24tPndha2V1cF9tYWluX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YSk7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworLyoqCisgKiBHZXRzIHRoZSBsb2NrcyBzbyB3ZSBjYW4gZXhhbWluZSB0aGVtCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbXV0ZXhfbG9jIHJldHVybiBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYWluIG11dGV4IHBvaW50ZXIKKyAqIEBwYXJhbSBkaXNwYXRjaF9tdXRleF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBkaXNwYXRjaCBtdXRleCBwb2ludGVyCisgKiBAcGFyYW0gaW9fcGF0aF9tdXRleF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBpb19wYXRoIG11dGV4IHBvaW50ZXIKKyAqIEBwYXJhbSBkaXNwYXRjaF9jb25kX2xvYyByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGRpc3BhdGNoIGNvbmRpdGlvbmFsIAorICogICAgICAgIHZhcmlhYmxlIHBvaW50ZXIKKyAqIEBwYXJhbSBpb19wYXRoX2NvbmRfbG9jIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW9fcGF0aCBjb25kaXRpb25hbCAKKyAqICAgICAgICB2YXJpYWJsZSBwb2ludGVyCisgKi8gCit2b2lkIAorX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAqKmRpc3BhdGNoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICAgKippb19wYXRoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICAgKipkaXNwYXRjaF9jb25kX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICAgKippb19wYXRoX2NvbmRfbG9jKQoreworICAqbXV0ZXhfbG9jID0gKERCdXNNdXRleCAqKSBjb25uZWN0aW9uLT5tdXRleDsKKyAgKmRpc3BhdGNoX211dGV4X2xvYyA9IChEQnVzTXV0ZXggKikgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXg7CisgICppb19wYXRoX211dGV4X2xvYyA9IChEQnVzTXV0ZXggKikgY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleDsKKyAgKmRpc3BhdGNoX2NvbmRfbG9jID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZDsKKyAgKmlvX3BhdGhfY29uZF9sb2MgPSBjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZS1jb250YWluaW5nIGxpc3QgbGluayB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIGxpbmsgYW5kIHRoZSBtZXNzYWdlJ3MgY3VycmVudCByZWZjb3VudC4KKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBsaW5rIHRoZSBtZXNzYWdlIGxpbmsgdG8gcXVldWUuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICpsaW5rKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3RyYW5zcG9ydF9wZWVrX2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpOworCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworCisgIC8qIElmIHRoaXMgaXMgYSByZXBseSB3ZSdyZSB3YWl0aW5nIG9uLCByZW1vdmUgdGltZW91dCBmb3IgaXQgKi8KKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICBpZiAocmVwbHlfc2VyaWFsICE9IDApCisgICAgeworICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgICAgIGlmIChwZW5kaW5nICE9IE5VTEwpCisJeworCSAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKworCSAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisJfQorICAgIH0KKyAgCisgIAorCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgJyVzJyByZXBseSB0byAldSkgYWRkZWQgdG8gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwKKyAgICAgICJfZGJ1c19jb25lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIik7Cit9CisKKy8qKgorICogQWRkcyBhIGxpbmsgKyBtZXNzYWdlIHRvIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICogQ2FuJ3QgZmFpbC4gVGFrZXMgb3duZXJzaGlwIG9mIGJvdGggbGluayBhbmQgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IG5vZGUgYW5kIG1lc3NhZ2UgdG8gcXVldWUuCisgKgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgREJ1c0xpc3QgKmxpbmspCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsIGxpbmspOworCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKGxpbmstPmRhdGEsIC0xLCAtMSwKKyAgICAgICJfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayIpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTeW50aGVzaXplZCBtZXNzYWdlICVwIGFkZGVkIHRvIGluY29taW5nIHF1ZXVlICVwLCAlZCBpbmNvbWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgbGluay0+ZGF0YSwgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7Cit9CisKKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgbWVzc2FnZXMgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUuCisgKiBDYWxsZWQgd2l0aCBjb25uZWN0aW9uIGxvY2sgaGVsZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBvdXRnb2luZyBxdWV1ZSBpcyBub24tZW1wdHkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIGNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzICE9IE5VTEw7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIG1lc3NhZ2VzIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLgorICogVXNlIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIHRvIGJsb2NrIHVudGlsIGFsbCBvdXRnb2luZworICogbWVzc2FnZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgKiAoc3VjaCBhcyBhIHNvY2tldCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG91dGdvaW5nIHF1ZXVlIGlzIG5vbi1lbXB0eS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHY7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHYgPSBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiB2OworfQorCisvKioKKyAqIEdldHMgdGhlIG5leHQgb3V0Z29pbmcgbWVzc2FnZS4gVGhlIG1lc3NhZ2UgcmVtYWlucyBpbiB0aGUKKyAqIHF1ZXVlLCBhbmQgdGhlIGNhbGxlciBkb2VzIG5vdCBvd24gYSByZWZlcmVuY2UgdG8gaXQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSB0byBiZSBzZW50LgorICovIAorREJ1c01lc3NhZ2UqCitfZGJ1c19jb25uZWN0aW9uX2dldF9tZXNzYWdlX3RvX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcyk7Cit9CisKKy8qKgorICogTm90aWZpZXMgdGhlIGNvbm5lY3Rpb24gdGhhdCBhIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCwgc28gdGhlCisgKiBtZXNzYWdlIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIG91dGdvaW5nIHF1ZXVlLgorICogQ2FsbGVkIHdpdGggdGhlIGNvbm5lY3Rpb24gbG9jayBoZWxkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgc2VudC4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgLyogVGhpcyBjYW4gYmUgY2FsbGVkIGJlZm9yZSB3ZSBldmVuIGNvbXBsZXRlIGF1dGhlbnRpY2F0aW9uLCBzaW5jZQorICAgKiBpdCdzIGNhbGxlZCBvbiBkaXNjb25uZWN0IHRvIGNsZWFuIHVwIHRoZSBvdXRnb2luZyBxdWV1ZS4KKyAgICogSXQncyBhbHNvIGNhbGxlZCBhcyB3ZSBzdWNjZXNzZnVsbHkgc2VuZCBlYWNoIG1lc3NhZ2UuCisgICAqLworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpbmstPmRhdGEgPT0gbWVzc2FnZSk7CisKKyAgX2RidXNfbGlzdF91bmxpbmsgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmV4cGlyZWRfbWVzc2FnZXMsIGxpbmspOworCisgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgLT0gMTsKKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgJyVzJykgcmVtb3ZlZCBmcm9tIG91dGdvaW5nIHF1ZXVlICVwLCAlZCBsZWZ0IHRvIHNlbmRcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIHBhdGgiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9vdXRnb2luZyk7CisKKyAgLyogSXQncyBPSyB0aGF0IGluIHByaW5jaXBsZSB3ZSBjYWxsIHRoZSBub3RpZnkgZnVuY3Rpb24sIGJlY2F1c2UgZm9yIHRoZQorICAgKiBvdXRnb2luZyBsaW1pdCwgdGhlcmUgaXNuJ3Qgb25lICovCisgIF9kYnVzX21lc3NhZ2VfcmVtb3ZlX2NvdW50ZXIgKG1lc3NhZ2UsIGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIC8qIFRoZSBtZXNzYWdlIHdpbGwgYWN0dWFsbHkgYmUgdW5yZWZmZWQgd2hlbiB3ZSB1bmxvY2sgKi8KK30KKworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEFkZEZ1bmN0aW9uKSAgICAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbikgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGVuYWJsZWQpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKERCdXNDb25uZWN0aW9uICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEFkZEZ1bmN0aW9uICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIFRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gV2F0Y2hMaXN0CisgICAqIGZpZWxkKSB3aGlsZSBjYWxsaW5nIG91dC4KKyAgICoKKyAgICogU28gZm9yIG5vdyB3ZSdsbCBqdXN0IGtlZXAgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBvdXQuIFRoaXMgbWVhbnMKKyAgICogYXBwcyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBEQnVzQ29ubmVjdGlvbiBtZXRob2RzIGluc2lkZSBhCisgICAqIHdhdGNoIGZ1bmN0aW9uIG9yIHRoZXkgd2lsbCBkZWFkbG9jay4KKyAgICoKKyAgICogVGhlICJyZWFsIGZpeCIgaXMgdG8gdXNlIHRoZSBfYW5kX3VubG9jaygpIHBhdHRlcm4gZm91bmQKKyAgICogZWxzZXdoZXJlIGluIHRoZSBjb2RlLCB0byBkZWZlciBjYWxsaW5nIG91dCB0byB0aGUgYXBwIHVudGlsCisgICAqIHdlJ3JlIGFib3V0IHRvIGRyb3AgbG9ja3MgYW5kIHJldHVybiBmbG93IG9mIGNvbnRyb2wgdG8gdGhlIGFwcAorICAgKiBhbnl3YXkuCisgICAqCisgICAqIFNlZSBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RocmVhZC5odG1sIzgxNDQKKyAgICovCisKKyAgaWYgKGNvbm5lY3Rpb24tPndhdGNoZXMpCisgICAgeworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT53YXRjaGVzLCB3YXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKyAgICAgCisKKy8qKgorICogQWRkcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFdhdGNoRnVuY3Rpb24gaWYKKyAqIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHJlY29yZHMgdGhlIHdhdGNoIHRvIGJlIGFkZGVkIHdoZW4gc2FpZAorICogZnVuY3Rpb24gaXMgYXZhaWxhYmxlLiBBbHNvIHJlLWFkZHMgdGhlIHdhdGNoIGlmIHRoZQorICogREJ1c0FkZFdhdGNoRnVuY3Rpb24gY2hhbmdlcy4gTWF5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcmV0dXJuIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKGNvbm5lY3Rpb24sIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24KKyAqIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSB3YXRjaAorICogdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoY29ubmVjdGlvbiwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIHdhdGNoIGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgd2F0Y2ggdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZW5hYmxlZCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKworICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChjb25uZWN0aW9uLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEFkZEZ1bmN0aW9uKSAgICAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICBlbmFibGVkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBUaGUgb3JpZ2luYWwgcHVycG9zZSBvZiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gVGltZW91dExpc3QKKyAgICogZmllbGQpIHdoaWxlIGNhbGxpbmcgb3V0LgorICAgKgorICAgKiBTbyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIG91dC4gVGhpcyBtZWFucworICAgKiBhcHBzIGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIERCdXNDb25uZWN0aW9uIG1ldGhvZHMgaW5zaWRlIGEKKyAgICogdGltZW91dCBmdW5jdGlvbiBvciB0aGV5IHdpbGwgZGVhZGxvY2suCisgICAqCisgICAqIFRoZSAicmVhbCBmaXgiIGlzIHRvIHVzZSB0aGUgX2FuZF91bmxvY2soKSBwYXR0ZXJuIGZvdW5kCisgICAqIGVsc2V3aGVyZSBpbiB0aGUgY29kZSwgdG8gZGVmZXIgY2FsbGluZyBvdXQgdG8gdGhlIGFwcCB1bnRpbAorICAgKiB3ZSdyZSBhYm91dCB0byBkcm9wIGxvY2tzIGFuZCByZXR1cm4gZmxvdyBvZiBjb250cm9sIHRvIHRoZSBhcHAKKyAgICogYW55d2F5LgorICAgKgorICAgKiBTZWUgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgICAqLworCisgIGlmIChjb25uZWN0aW9uLT50aW1lb3V0cykKKyAgICB7CisgICAgICBpZiAoYWRkX2Z1bmN0aW9uKQorICAgICAgICByZXR2YWwgPSAoKiBhZGRfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCk7CisgICAgICBlbHNlIGlmIChyZW1vdmVfZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKGNvbm5lY3Rpb24tPnRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiB0b2dnbGVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCwgZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFkZHMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpZgorICogYXZhaWxhYmxlLiBPdGhlcndpc2UgcmVjb3JkcyB0aGUgdGltZW91dCB0byBiZSBhZGRlZCB3aGVuIHNhaWQKKyAqIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4gQWxzbyByZS1hZGRzIHRoZSB0aW1lb3V0IGlmIHRoZQorICogREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBjaGFuZ2VzLiBNYXkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKiBUaGUgdGltZW91dCB3aWxsIGZpcmUgcmVwZWF0ZWRseSB1bnRpbCByZW1vdmVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gYWRkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fYWRkX3RpbWVvdXRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9hZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbgorICogaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIHRpbWVvdXQKKyAqIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICp0aW1lb3V0KQoreworICBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB0aW1lb3V0IGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB0aW1lb3V0IHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoY29ubmVjdGlvbiwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF90b2dnbGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICByZXBseV9zZXJpYWwgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgX2RidXNfYXNzZXJ0IChyZXBseV9zZXJpYWwgIT0gMCk7CisKKyAgdGltZW91dCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLCB0aW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHRpbWVvdXQpOworCisgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisgICAgICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBUUlVFKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcGVuZGluZ19jYWxsX29uX2hhc2hfcmVtb3ZhbCAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb247CisgIAorICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBwZW5kaW5nID0gZGF0YTsKKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX3VubG9ja2VkIChwZW5kaW5nKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworICAgIH0KKworICAvKiBGSVhNRSAxLjA/IHRoaXMgaXMgc29ydCBvZiBkYW5nZXJvdXMgYW5kIHVuZGVzaXJhYmxlIHRvIGRyb3AgdGhlIGxvY2sgCisgICAqIGhlcmUsIGJ1dCB0aGUgcGVuZGluZyBjYWxsIGZpbmFsaXplciBjb3VsZCBpbiBwcmluY2lwbGUgY2FsbCBvdXQgdG8gCisgICAqIGFwcGxpY2F0aW9uIGNvZGUgc28gd2UgcHJldHR5IG11Y2ggaGF2ZSB0by4uLiBzb21lIGxhcmdlciBjb2RlIHJlb3JnIAorICAgKiBtaWdodCBiZSBuZWVkZWQuCisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICAvKiBUaGlzIGVuZHMgdXAgdW5sb2NraW5nIHRvIGNhbGwgdGhlIHBlbmRpbmcgY2FsbCBmaW5hbGl6ZXIsIHdoaWNoIGlzIHVuZXhwZWN0ZWQgdG8KKyAgICogc2F5IHRoZSBsZWFzdC4KKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhdm9pZCBmaW5hbGl6aW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAgICogd2l0aCB0aGUgbG9jayBoZWxkLCBzaW5jZSB0aGVyZSdzIGEgZGVzdHJveSBub3RpZmllcgorICAgKiBpbiBwZW5kaW5nIGNhbGwgdGhhdCBnb2VzIG91dCB0byBhcHBsaWNhdGlvbiBjb2RlLgorICAgKgorICAgKiBUaGVyZSdzIGFuIGV4dHJhIHVubG9jayBpbnNpZGUgdGhlIGhhc2ggdGFibGUKKyAgICogImZyZWUgcGVuZGluZyBjYWxsIiBmdW5jdGlvbiBGSVhNRS4uLgorICAgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7CisKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcGVuZGluZyBjYWxsIGZyb20gdGhlIGNvbm5lY3Rpb24sIHN1Y2ggdGhhdAorICogdGhlIHBlbmRpbmcgcmVwbHkgd2lsbCBiZSBpZ25vcmVkLiBNYXkgZHJvcCB0aGUgbGFzdAorICogcmVmZXJlbmNlIHRvIHRoZSBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfcGVuZGluZ19jYWxsIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcpOworfQorCisvKioKKyAqIEFjcXVpcmUgdGhlIHRyYW5zcG9ydGVyIEkvTyBwYXRoLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAqIGRvaW5nIGFueSBJL08gaW4gdGhlIHRyYW5zcG9ydGVyLiBNYXkgc2xlZXAgYW5kIGRyb3AgdGhlCisgKiBJTyBwYXRoIG11dGV4IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBJL08gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXhpbXVtIGJsb2NraW5nIHRpbWUsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIEkvTyBwYXRoIHdhcyBhY3F1aXJlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIGRidXNfYm9vbF90IHdlX2FjcXVpcmVkOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBXZSBkb24ndCB3YW50IHRoZSBjb25uZWN0aW9uIHRvIHZhbmlzaCAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogV2Ugd2lsbCBvbmx5IHRvdWNoIGlvX3BhdGhfYWNxdWlyZWQgd2hpY2ggaXMgcHJvdGVjdGVkIGJ5IG91ciBtdXRleCAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgibG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X2xvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWQgdGltZW91dCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisKKyAgd2VfYWNxdWlyZWQgPSBGQUxTRTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKQorICAgIHsKKyAgICAgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3YWl0aW5nICVkIGZvciBJTyBwYXRoIHRvIGJlIGFjcXVpcmFibGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19jb25kdmFyX3dhaXRfdGltZW91dCAoY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSB0aW1lZCBvdXQgYmVmb3JlIGFueW9uZSBzaWduYWxlZC4gKi8KKyAgICAgICAgICAgICAgLyogKHdyaXRpbmcgdGhlIGxvb3AgdG8gaGFuZGxlIHRoZSAhdGltZWRvdXQgY2FzZSBieQorICAgICAgICAgICAgICAgKiB3YWl0aW5nIGxvbmdlciBpZiBuZWVkZWQgaXMgYSBwYWluIHNpbmNlIGRidXMKKyAgICAgICAgICAgICAgICogd3JhcHMgcHRocmVhZF9jb25kX3RpbWVkd2FpdCB0byB0YWtlIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICogdGltZSBpbnN0ZWFkIG9mIGFic29sdXRlLCBzb21ldGhpbmcga2luZCBvZiBzdHVwaWQKKyAgICAgICAgICAgICAgICogb24gb3VyIHBhcnQuIGZvciBub3cgaXQgZG9lc24ndCBtYXR0ZXIsIHdlIHdpbGwganVzdAorICAgICAgICAgICAgICAgKiBlbmQgdXAgYmFjayBoZXJlIGV2ZW50dWFsbHkuKQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3YWl0aW5nIGZvciBJTyBwYXRoIHRvIGJlIGFjcXVpcmFibGVcbiIpOworICAgICAgICAgICAgICBfZGJ1c19jb25kdmFyX3dhaXQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAoIWNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpCisgICAgeworICAgICAgd2VfYWNxdWlyZWQgPSBUUlVFOworICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9IFRSVUU7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoImVuZCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWQgd2VfYWNxdWlyZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCwgd2VfYWNxdWlyZWQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHdlX2FjcXVpcmVkOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIEkvTyBwYXRoIHdoZW4geW91J3JlIGRvbmUgd2l0aCBpdC4gT25seSBjYWxsCisgKiBhZnRlciB5b3UndmUgYWNxdWlyZWQgdGhlIEkvTy4gV2FrZXMgdXAgYXQgbW9zdCBvbmUgdGhyZWFkCisgKiBjdXJyZW50bHkgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBJL08gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9pb19wYXRoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NraW5nIGlvX3BhdGhfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIAorICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworICAKKyAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9IEZBTFNFOworICBfZGJ1c19jb25kdmFyX3dha2Vfb25lIChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworfQorCisvKioKKyAqIFF1ZXVlcyBpbmNvbWluZyBtZXNzYWdlcyBhbmQgc2VuZHMgb3V0Z29pbmcgbWVzc2FnZXMgZm9yIHRoaXMKKyAqIGNvbm5lY3Rpb24sIG9wdGlvbmFsbHkgYmxvY2tpbmcgaW4gdGhlIHByb2Nlc3MuIEVhY2ggY2FsbCB0bworICogX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQoKSB3aWxsIGNhbGwgc2VsZWN0KCkgb3IgcG9sbCgpIG9uZQorICogdGltZSBhbmQgdGhlbiByZWFkIG9yIHdyaXRlIGRhdGEgaWYgcG9zc2libGUuCisgKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBhYmxlIHRvIGZsdXNoIG91dGdvaW5nCisgKiBtZXNzYWdlcyBvciBxdWV1ZSB1cCBpbmNvbWluZyBtZXNzYWdlcyB3aXRob3V0IHJldHVybmluZworICogY29udHJvbCB0byB0aGUgYXBwbGljYXRpb24gYW5kIGNhdXNpbmcgcmVlbnRyYW5jeSB3ZWlyZG5lc3MuCisgKgorICogVGhlIGZsYWdzIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hldGhlciB0bworICogcmVhZCBpbmNvbWluZyBtZXNzYWdlcywgd3JpdGUgb3V0Z29pbmcgbWVzc2FnZXMsIG9yIGJvdGgsCisgKiBhbmQgd2hldGhlciB0byBibG9jayBpZiBubyBpbW1lZGlhdGUgYWN0aW9uIGlzIHBvc3NpYmxlLgorICoKKyAqIFRoZSB0aW1lb3V0X21pbGxpc2Vjb25kcyBwYXJhbWV0ZXIgZG9lcyBub3RoaW5nIHVubGVzcyB0aGUKKyAqIGl0ZXJhdGlvbiBpcyBibG9ja2luZy4KKyAqCisgKiBJZiB0aGVyZSBhcmUgbm8gb3V0Z29pbmcgbWVzc2FnZXMgYW5kIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcKKyAqIHdhc24ndCBzcGVjaWZpZWQsIHRoZW4gaXQncyBpbXBvc3NpYmxlIHRvIGJsb2NrLCBldmVuIGlmCisgKiB5b3Ugc3BlY2lmeSBEQlVTX0lURVJBVElPTl9CTE9DSzsgaW4gdGhhdCBjYXNlIHRoZSBmdW5jdGlvbgorICogcmV0dXJucyBpbW1lZGlhdGVseS4KKyAqCisgKiBJZiBwZW5kaW5nIGlzIG5vdCBOVUxMIHRoZW4gYSBjaGVjayBpcyBtYWRlIGlmIHRoZSBwZW5kaW5nIGNhbGwKKyAqIGlzIGNvbXBsZXRlZCBhZnRlciB0aGUgaW8gcGF0aCBoYXMgYmVlbiByZXF1aXJlZC4gSWYgdGhlIGNhbGwKKyAqIGhhcyBiZWVuIGNvbXBsZXRlZCBub3RoaW5nIGlzIGRvbmUuIFRoaXMgbXVzdCBiZSBkb25lIHNpbmNlCisgKiB0aGUgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2lvX3BhdGggcmVsZWFzZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGxvY2sgZm9yIGEgd2hpbGUuCisgKgorICogQ2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIGhlbGQuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIG9yIE5VTEwKKyAqIEBwYXJhbSBmbGFncyBpdGVyYXRpb24gZmxhZ3MuCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4aW11bSBibG9ja2luZyB0aW1lLCBvciAtMSBmb3Igbm8gbGltaXQuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY29ubmVjdGlvbi0+bl9vdXRnb2luZyA9PSAwKQorICAgIGZsYWdzICY9IH5EQlVTX0lURVJBVElPTl9ET19XUklUSU5HOworCisgIGlmIChfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCAoY29ubmVjdGlvbiwKKwkJCQkJKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spID8gdGltZW91dF9taWxsaXNlY29uZHMgOiAwKSkKKyAgICB7CisgICAgICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBpZiAoIChwZW5kaW5nICE9IE5VTEwpICYmIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkX3VubG9ja2VkKHBlbmRpbmcpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInBlbmRpbmcgY2FsbCBjb21wbGV0ZWQgd2hpbGUgYWNxdWlyaW5nIEkvTyBwYXRoIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCAocGVuZGluZyAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcGVla19mb3JfcmVwbHlfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwZW5kaW5nIGNhbGwgY29tcGxldGVkIHdoaWxlIGFjcXVpcmluZyBJL08gcGF0aCAocmVwbHkgZm91bmQgaW4gcXVldWUpIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGltZW91dF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9pb19wYXRoIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoZSBnaXZlbiB0cmFuc3BvcnQuICBBIHRyYW5zcG9ydAorICogcmVwcmVzZW50cyBhIG1lc3NhZ2Ugc3RyZWFtIHRoYXQgdXNlcyBzb21lIGNvbmNyZXRlIG1lY2hhbmlzbSwgc3VjaAorICogYXMgVU5JWCBkb21haW4gc29ja2V0cy4gTWF5IHJldHVybiAjTlVMTCBpZiBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEByZXR1cm5zIHRoZSBuZXcgY29ubmVjdGlvbiwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c0Nvbm5lY3Rpb24qCitfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0IChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0OworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdDsKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19yZXBsaWVzOworICBEQnVzTGlzdCAqZGlzY29ubmVjdF9saW5rOworICBEQnVzTWVzc2FnZSAqZGlzY29ubmVjdF9tZXNzYWdlOworICBEQnVzQ291bnRlciAqb3V0Z29pbmdfY291bnRlcjsKKyAgREJ1c09iamVjdFRyZWUgKm9iamVjdHM7CisgIAorICB3YXRjaF9saXN0ID0gTlVMTDsKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisgIHBlbmRpbmdfcmVwbGllcyA9IE5VTEw7CisgIHRpbWVvdXRfbGlzdCA9IE5VTEw7CisgIGRpc2Nvbm5lY3RfbGluayA9IE5VTEw7CisgIGRpc2Nvbm5lY3RfbWVzc2FnZSA9IE5VTEw7CisgIG91dGdvaW5nX2NvdW50ZXIgPSBOVUxMOworICBvYmplY3RzID0gTlVMTDsKKyAgCisgIHdhdGNoX2xpc3QgPSBfZGJ1c193YXRjaF9saXN0X25ldyAoKTsKKyAgaWYgKHdhdGNoX2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIHRpbWVvdXRfbGlzdCA9IF9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKCk7CisgIGlmICh0aW1lb3V0X2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOyAgCisKKyAgcGVuZGluZ19yZXBsaWVzID0KKyAgICBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKwkJCSAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pZnJlZV9wZW5kaW5nX2NhbGxfb25faGFzaF9yZW1vdmFsKTsKKyAgaWYgKHBlbmRpbmdfcmVwbGllcyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBjb25uZWN0aW9uID0gZGJ1c19uZXcwIChEQnVzQ29ubmVjdGlvbiwgMSk7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19ybXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+bXV0ZXgpOworICBpZiAoY29ubmVjdGlvbi0+bXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisgIGlmIChjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQpOworICBpZiAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCk7CisgIGlmIChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5zbG90X211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPnNsb3RfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIGRpc2Nvbm5lY3RfbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKTsKKyAgCisgIGlmIChkaXNjb25uZWN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIGRpc2Nvbm5lY3RfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoZGlzY29ubmVjdF9tZXNzYWdlKTsKKyAgaWYgKGRpc2Nvbm5lY3RfbGluayA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgb3V0Z29pbmdfY291bnRlciA9IF9kYnVzX2NvdW50ZXJfbmV3ICgpOworICBpZiAob3V0Z29pbmdfY291bnRlciA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgb2JqZWN0cyA9IF9kYnVzX29iamVjdF90cmVlX25ldyAoY29ubmVjdGlvbik7CisgIGlmIChvYmplY3RzID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKyAgCisgIGlmIChfZGJ1c19tb2RpZnlfc2lncGlwZSkKKyAgICBfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKCk7CisKKyAgLyogaW5pdGlhbGl6ZWQgdG8gMDogdXNlIGF0b21pYyBvcCB0byBhdm9pZCBtaXhpbmcgYXRvbWljIGFuZCBub24tYXRvbWljICovCisgIF9kYnVzX2F0b21pY19pbmMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIGNvbm5lY3Rpb24tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgY29ubmVjdGlvbi0+d2F0Y2hlcyA9IHdhdGNoX2xpc3Q7CisgIGNvbm5lY3Rpb24tPnRpbWVvdXRzID0gdGltZW91dF9saXN0OworICBjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMgPSBwZW5kaW5nX3JlcGxpZXM7CisgIGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIgPSBvdXRnb2luZ19jb3VudGVyOworICBjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCA9IE5VTEw7CisgIGNvbm5lY3Rpb24tPmxhc3RfZGlzcGF0Y2hfc3RhdHVzID0gREJVU19ESVNQQVRDSF9DT01QTEVURTsgLyogc28gd2UncmUgbm90aWZpZWQgZmlyc3QgdGltZSB0aGVyZSdzIGRhdGEgKi8KKyAgY29ubmVjdGlvbi0+b2JqZWN0cyA9IG9iamVjdHM7CisgIGNvbm5lY3Rpb24tPmV4aXRfb25fZGlzY29ubmVjdCA9IEZBTFNFOworICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+cm91dGVfcGVlcl9tZXNzYWdlcyA9IEZBTFNFOworICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkID0gRkFMU0U7CisgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCA9IEZBTFNFOworICAKKyNpZiBkZWZpbmVkKERCVVNfRU5BQkxFX0NIRUNLUykgfHwgZGVmaW5lZChEQlVTX0VOQUJMRV9BU1NFUlQpCisgIGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb247CisjZW5kaWYKKyAgCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZjb25uZWN0aW9uLT5zbG90X2xpc3QpOworCisgIGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwgPSAxOworCisgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID0gZGlzY29ubmVjdF9saW5rOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfY29ubmVjdGlvbiAodHJhbnNwb3J0LCBjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCAwLCAxLCAibmV3X2Zvcl90cmFuc3BvcnQiKTsKKyAgcmV0dXJuIGNvbm5lY3Rpb247CisgIAorIGVycm9yOgorICBpZiAoZGlzY29ubmVjdF9tZXNzYWdlICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChkaXNjb25uZWN0X21lc3NhZ2UpOworICAKKyAgaWYgKGRpc2Nvbm5lY3RfbGluayAhPSBOVUxMKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkaXNjb25uZWN0X2xpbmspOworICAKKyAgaWYgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworICAgICAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisgICAgICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPm11dGV4KTsKKyAgICAgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgICAgICBfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+c2xvdF9tdXRleCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgaWYgKHBlbmRpbmdfcmVwbGllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwZW5kaW5nX3JlcGxpZXMpOworICAKKyAgaWYgKHdhdGNoX2xpc3QpCisgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlICh3YXRjaF9saXN0KTsKKworICBpZiAodGltZW91dF9saXN0KQorICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlICh0aW1lb3V0X2xpc3QpOworCisgIGlmIChvdXRnb2luZ19jb3VudGVyKQorICAgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKG91dGdvaW5nX2NvdW50ZXIpOworCisgIGlmIChvYmplY3RzKQorICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVmIChvYmplY3RzKTsKKyAgCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLgorICogUmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIGFscmVhZHkgaG9sZHMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uLgorICovCitEQnVzQ29ubmVjdGlvbiAqCitfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCArIDEsCisgICAgICAicmVmX3VubG9ja2VkIik7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c0Nvbm5lY3Rpb24uCisgKiBSZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgYWxyZWFkeSBob2xkcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsCisgICAgICAidW5yZWZfdW5sb2NrZWQiKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfdWludDMyX3QKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHNlcmlhbCA9IGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwrKzsKKworICBpZiAoY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9PSAwKQorICAgIGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwgPSAxOworCisgIHJldHVybiBzZXJpYWw7Cit9CisKKy8qKgorICogQSBjYWxsYmFjayBmb3IgdXNlIHdpdGggZGJ1c193YXRjaF9uZXcoKSB0byBjcmVhdGUgYSBEQnVzV2F0Y2guCisgKiAKKyAqIEB0b2RvIFRoaXMgaXMgYmFzaWNhbGx5IGEgaGFjayAtIHdlIGNvdWxkIGRlbGV0ZSBfZGJ1c190cmFuc3BvcnRfaGFuZGxlX3dhdGNoKCkKKyAqIGFuZCB0aGUgdmlydHVhbCBoYW5kbGVfd2F0Y2ggaW4gREJ1c1RyYW5zcG9ydCBpZiB3ZSBnb3QgcmlkIG9mIGl0LgorICogVGhlIHJlYXNvbiB0aGlzIGlzIHNvbWUgd29yayBpcyB0aHJlYWRpbmcsIHNlZSB0aGUgX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2goKQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgY29uZGl0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIHdhdGNoZWQuCisgKiBAcGFyYW0gZGF0YSBtdXN0IGJlIGEgcG9pbnRlciB0byBhICNEQnVzQ29ubmVjdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBJTyBjb25kaXRpb24gbWF5IG5vdCBoYXZlIGJlZW4gZnVsbHkgaGFuZGxlZCBkdWUgdG8gbGFjayBvZiBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIChjb25uZWN0aW9uLCAxKSkKKyAgICB7CisgICAgICAvKiBhbm90aGVyIHRocmVhZCBpcyBoYW5kbGluZyB0aGUgbWVzc2FnZSAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHZhbCA9IF9kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNvbmRpdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2lvX3BhdGggKGNvbm5lY3Rpb24pOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIAorICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoaXMgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpICovCitzdGF0aWMgREJ1c0hhc2hUYWJsZSAqc2hhcmVkX2Nvbm5lY3Rpb25zID0gTlVMTDsKK3N0YXRpYyBEQnVzTGlzdCAqc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQgPSBOVUxMOworCitzdGF0aWMgdm9pZAorY2xvc2VfY29ubmVjdGlvbl9vbl9zaHV0ZG93biAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAoY29ubmVjdGlvbik7CisKKyAgLyogQ2h1cm4gdGhyb3VnaCB0byB0aGUgRGlzY29ubmVjdGVkIG1lc3NhZ2UgKi8KKyAgd2hpbGUgKChtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlIChjb25uZWN0aW9uKSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICB9CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24gKHZvaWQgKmRhdGEpCit7CisgIGludCBuX2VudHJpZXM7CisKKyAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgIHsKKyAgICAgIC8qIFdlJ2QgaGF2ZSBpbml0aWFsaXplZCBsb2NrcyBiZWZvcmUgYWRkaW5nIGFueXRoaW5nLCBzbyB0aGVyZQorICAgICAgICogY2FuJ3QgYmUgYW55dGhpbmcgdGhlcmUuICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoaXMgaXMgYSBsaXR0bGUgYml0IHVucGxlYXNhbnQuLi4gYmV0dGVyIGlkZWFzPyAqLworICB3aGlsZSAoKG5fZW50cmllcyA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkgPiAwKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgICAgICAKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChzaGFyZWRfY29ubmVjdGlvbnMsICZpdGVyKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcik7CisgICAgICAgCisgICAgICBjb25uZWN0aW9uID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgIGlmICghX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ2xvYmFsIGxvY2tzIHdlcmUgYWxyZWFkeSBpbml0aWFsaXplZCIpOworCisgICAgICAvKiBUaGUgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGRlYWQgYW5kIG5vdCBpbiBvdXIgaGFzaCAuLi4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChzaGFyZWRfY29ubmVjdGlvbnMpIDwgbl9lbnRyaWVzKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHNoYXJlZF9jb25uZWN0aW9ucykgPT0gMCk7CisgIAorICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChzaGFyZWRfY29ubmVjdGlvbnMpOworICBzaGFyZWRfY29ubmVjdGlvbnMgPSBOVUxMOworCisgIGlmIChzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgd2hpbGUgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAoIV9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucykpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnbG9iYWwgbG9ja3Mgd2VyZSBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgICB9CisgICAgfQorCisgIHNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkID0gTlVMTDsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqKnJlc3VsdCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNraW5nIGZvciBleGlzdGluZyBjb25uZWN0aW9uXG4iKTsKKyAgCisgICpyZXN1bHQgPSBOVUxMOworCisgIGlmICghX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkKKyAgICB7CisgICAgICAvKiBJZiBpdCB3YXMgc2hhcmVkLCB3ZSdkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzIHdoZW4gd2UgcHV0CisgICAgICAgKiBpdCBpbiBzaGFyZWRfY29ubmVjdGlvbnMuICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzaGFyZWRfY29ubmVjdGlvbnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY3JlYXRpbmcgc2hhcmVkX2Nvbm5lY3Rpb25zIGhhc2ggdGFibGVcbiIpOworICAgICAgCisgICAgICBzaGFyZWRfY29ubmVjdGlvbnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAoc2hhcmVkX2Nvbm5lY3Rpb25zID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoc2hhcmVkX2Nvbm5lY3Rpb25zX3NodXRkb3duLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgc2hhcmVkX2Nvbm5lY3Rpb25zID0gTlVMTDsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNoYXJlZF9jb25uZWN0aW9uc1xuIik7CisgICAgICAKKyAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgIHJldHVybiBUUlVFOyAvKiBubyBwb2ludCBsb29raW5nIHVwIGluIHRoZSBoYXNoIHdlIGp1c3QgbWFkZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmd1aWQ7CisKKyAgICAgIGd1aWQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImd1aWQiKTsKKyAgICAgIAorICAgICAgaWYgKGd1aWQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgICAgIAorICAgICAgICAgIGNvbm5lY3Rpb24gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNoYXJlZF9jb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkKTsKKworICAgICAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGUgREJ1c0Nvbm5lY3Rpb24gY2FuJ3QgYmUgZmluYWxpemVkIHdpdGhvdXQgdGFraW5nCisgICAgICAgICAgICAgICAqIHRoZSBzaGFyZWRfY29ubmVjdGlvbnMgbG9jayB0byByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICogaGFzaC4gIFNvIGl0J3Mgc2FmZSB0byByZWYgdGhlIGNvbm5lY3Rpb24gaGVyZS4KKyAgICAgICAgICAgICAgICogSG93ZXZlciwgaXQgbWF5IGJlIGRpc2Nvbm5lY3RlZCBpZiB0aGUgRGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgICAgKiB3YW50IHRvIHByZXRlbmQgaXQgaXNuJ3QgaW4gdGhlIGhhc2ggYW5kIGF2b2lkCisgICAgICAgICAgICAgICAqIHJldHVybmluZyBpdC4KKyAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICogVGhlIGlkZWEgaXMgdG8gYXZvaWQgZXZlciByZXR1cm5pbmcgYSBkaXNjb25uZWN0ZWQgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgKiBmcm9tIGRidXNfY29ubmVjdGlvbl9vcGVuKCkuIFdlIGNvdWxkIGp1c3Qgc3luY2hyb25vdXNseQorICAgICAgICAgICAgICAgKiBkcm9wIG91ciBzaGFyZWQgcmVmIHRvIHRoZSBjb25uZWN0aW9uIG9uIGNvbm5lY3Rpb24gZGlzY29ubmVjdCwKKyAgICAgICAgICAgICAgICogYW5kIHRoZW4gYXNzZXJ0IGhlcmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQsIGJ1dAorICAgICAgICAgICAgICAgKiB0aGF0IGNhdXNlcyByZWVudHJhbmN5IGhlYWRhY2hlcy4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGlmIChfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImxvb2tlZCB1cCBleGlzdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciBndWlkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImxvb2tlZCB1cCBleGlzdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciBndWlkICVzIGJ1dCBpdCB3YXMgZGlzY29ubmVjdGVkIHNvIGlnbm9yaW5nIGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Nvbm5lY3Rpb25fcmVjb3JkX3NoYXJlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpndWlkKQoreworICBjaGFyICpndWlkX2tleTsKKyAgY2hhciAqZ3VpZF9pbl9jb25uZWN0aW9uOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+c2VydmVyX2d1aWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+c2hhcmVhYmxlKTsKKworICAvKiBnZXQgYSBoYXJkIHJlZiBvbiB0aGlzIGNvbm5lY3Rpb24sIGV2ZW4gaWYKKyAgICogd2Ugd29uJ3QgaW4gZmFjdCBzdG9yZSBpdCBpbiB0aGUgaGFzaCwgd2Ugc3RpbGwKKyAgICogbmVlZCB0byBob2xkIGEgcmVmIG9uIGl0IHVudGlsIGl0J3MgZGlzY29ubmVjdGVkLgorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIGlmIChndWlkID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQsIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gVFJVRTsgLyogZG9uJ3Qgc3RvcmUgaW4gdGhlIGhhc2ggKi8KKyAgICB9CisgIAorICAvKiBBIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgaGFzaCB0YWJsZSwgYmVjYXVzZQorICAgKiB3ZSBkb24ndCBoYXZlIGEgbG9jayBvbiB0aGUgY29ubmVjdGlvbiB3aGVuIHdlIGFyZSBkb2luZyBhIGhhc2gKKyAgICogbG9va3VwLgorICAgKi8KKyAgCisgIGd1aWRfa2V5ID0gX2RidXNfc3RyZHVwIChndWlkKTsKKyAgaWYgKGd1aWRfa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGd1aWRfaW5fY29ubmVjdGlvbiA9IF9kYnVzX3N0cmR1cCAoZ3VpZCk7CisgIGlmIChndWlkX2luX2Nvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfa2V5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZ3VpZF9pbl9jb25uZWN0aW9uKTsKKyAgICAgIGRidXNfZnJlZSAoZ3VpZF9rZXkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNoYXJlZF9jb25uZWN0aW9ucyAhPSBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkX2tleSwgY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChndWlkX2tleSk7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfaW5fY29ubmVjdGlvbik7CisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gZ3VpZF9pbl9jb25uZWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdG9yZWQgY29ubmVjdGlvbiB0byAlcyB0byBiZSBzaGFyZWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghY29ubmVjdGlvbi0+c2hhcmVhYmxlKQorICAgIHJldHVybjsKKworICBpZiAoIV9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucykpCisgICAgeworICAgICAgLyogSWYgaXQgd2FzIHNoYXJlZCwgd2UnZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyB3aGVuIHdlIHB1dAorICAgICAgICogaXQgaW4gdGhlIHRhYmxlOyBzbyBpdCBjYW4ndCBiZSB0aGVyZS4gKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRyb3BwaW5nIGNvbm5lY3Rpb24gdG8gJXMgb3V0IG9mIHRoZSBzaGFyZWQgdGFibGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2VydmVyX2d1aWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb25uZWN0aW9uIHdhcyBub3QgaW4gdGhlIHNoYXJlZCB0YWJsZSIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkLCBjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAKKyAgLyogcmVtb3ZlIG91ciByZWZlcmVuY2UgaGVsZCBvbiBhbGwgc2hhcmVhYmxlIGNvbm5lY3Rpb25zICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24qCitjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfb3BlbiAoZW50cnksIGVycm9yKTsKKworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0ICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgX2RidXNfYXNzZXJ0ICghY29ubmVjdGlvbi0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOworI2VuZGlmCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKgorICogSWYgdGhlIHNoYXJlZCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBhbnkgZXhpc3RpbmcgY29ubmVjdGlvbiB3aWxsCisgKiBiZSB1c2VkIChhbmQgaWYgYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCBpdCB3aWxsIGJlIGF2YWlsYWJsZQorICogZm9yIHVzZSBieSBvdGhlcnMpLiBJZiB0aGUgc2hhcmVkIHBhcmFtZXRlciBpcyBmYWxzZSwgYSBuZXcKKyAqIGNvbm5lY3Rpb24gd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgYW5kIHRoZSBuZXcgY29ubmVjdGlvbiB3aWxsCisgKiBuZXZlciBiZSByZXR1cm5lZCB0byBvdGhlciBjYWxsZXJzLgorICoKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzCisgKiBAcGFyYW0gc2hhcmVkIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgc2hhcmVkIG9yIHByaXZhdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBEQnVzQ29ubmVjdGlvbioKK19kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBzaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzRXJyb3IgZmlyc3RfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGludCBsZW4sIGk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm9wZW5pbmcgJXMgY29ubmVjdGlvbiB0bzogJXNcbiIsCisgICAgICAgICAgICAgICAgIHNoYXJlZCA/ICJzaGFyZWQiIDogInByaXZhdGUiLCBhZGRyZXNzKTsKKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzaGFyZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNvbm5lY3Rpb25fbG9va3VwX3NoYXJlZCAoZW50cmllc1tpXSwgJmNvbm5lY3Rpb24pKQorICAgICAgICAgICAgX0RCVVNfU0VUX09PTSAoJnRtcF9lcnJvcik7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKGVudHJpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9lcnJvcik7CisKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMICYmIHNoYXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3VpZDsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGd1aWQgbWF5IGJlIE5VTEwgKi8KKyAgICAgICAgICAgICAgZ3VpZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbaV0sICJndWlkIik7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX3JlY29yZF9zaGFyZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGd1aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICBicmVhazsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAKKyAgICAgIGlmIChpID09IDApCisgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgJmZpcnN0X2Vycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmZpcnN0X2Vycm9yKTsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJmZpcnN0X2Vycm9yLCBlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZmlyc3RfZXJyb3IpOworICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIENsb3NlcyBhIHNoYXJlZCBPUiBwcml2YXRlIGNvbm5lY3Rpb24sIHdoaWxlIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGNhbgorICogb25seSBiZSB1c2VkIG9uIHByaXZhdGUgY29ubmVjdGlvbnMuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUKKyAqIGRidXMgY29kZSB0aGF0IG93bnMgdGhlIGNvbm5lY3Rpb24gLSBhbiBvd25lciBtdXN0IGJlIGtub3duLAorICogdGhlIG9wZW4vY2xvc2Ugc3RhdGUgaXMgbGlrZSBtYWxsb2MvZnJlZSwgbm90IGxpa2UgcmVmL3VucmVmLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzUHJlYWxsb2NhdGVkU2VuZCoKK19kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IGRidXNfbmV3IChEQnVzUHJlYWxsb2NhdGVkU2VuZCwgMSk7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKE5VTEwpOworICBpZiAocHJlYWxsb2NhdGVkLT5xdWV1ZV9saW5rID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMDsKKworICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIGlmIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzE7CisKKyAgX2RidXNfY291bnRlcl9yZWYgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhKTsKKworICBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAKKyAgcmV0dXJuIHByZWFsbG9jYXRlZDsKKyAgCisgZmFpbGVkXzE6CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHByZWFsbG9jYXRlZCk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLCBkb2VzIG5vdCB1cGRhdGUgZGlzcGF0Y2ggc3RhdHVzICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHByZWFsbG9jYXRlZC0+cXVldWVfbGluay0+ZGF0YSA9IG1lc3NhZ2U7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworCisgIC8qIEl0J3MgT0sgdGhhdCB3ZSdsbCBuZXZlciBjYWxsIHRoZSBub3RpZnkgZnVuY3Rpb24sIGJlY2F1c2UgZm9yIHRoZQorICAgKiBvdXRnb2luZyBsaW1pdCwgdGhlcmUgaXNuJ3Qgb25lICovCisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisKKyAgZGJ1c19mcmVlIChwcmVhbGxvY2F0ZWQpOworICBwcmVhbGxvY2F0ZWQgPSBOVUxMOworICAKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisgIAorICBjb25uZWN0aW9uLT5uX291dGdvaW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIGZvciAlcyBhZGRlZCB0byBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgcGVuZGluZyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibnVsbCIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkgPT0gMCkKKyAgICB7CisgICAgICBzZXJpYWwgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9uZXh0X2NsaWVudF9zZXJpYWwgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIHNlcmlhbCk7CisgICAgICBpZiAoY2xpZW50X3NlcmlhbCkKKyAgICAgICAgKmNsaWVudF9zZXJpYWwgPSBzZXJpYWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGNsaWVudF9zZXJpYWwpCisgICAgICAgICpjbGllbnRfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCBzZXJpYWwgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSk7CisgIAorICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgLyogTm93IHdlIG5lZWQgdG8gcnVuIGFuIGl0ZXJhdGlvbiB0byBob3BlZnVsbHkganVzdCB3cml0ZSB0aGUgbWVzc2FnZXMKKyAgICogb3V0IGltbWVkaWF0ZWx5LCBhbmQgb3RoZXJ3aXNlIGdldCB0aGVtIHF1ZXVlZCB1cAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKworICAvKiBJZiBzdHVmZiBpcyBzdGlsbCBxdWV1ZWQgdXAsIGJlIHN1cmUgd2Ugd2FrZSB1cCB0aGUgbWFpbiBsb29wICovCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCkKKyAgICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKwkJCQkJICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgY2xpZW50X3NlcmlhbCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSwgYnV0IGFzc3VtZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGlzIGFscmVhZHkgbG9ja2VkIG9uIGZ1bmN0aW9uIGVudHJ5LCBhbmQgdW5sb2NrcyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gY2xpZW50X3NlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIGNsaWVudCBzZXJpYWwgb2Ygc2VudCBtZXNzYWdlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gb3V0LW9mLW1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSBwcmVhbGxvY2F0ZWQsCisJCQkJCQkgbWVzc2FnZSwKKwkJCQkJCSBjbGllbnRfc2VyaWFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSB0aGUgc2VtYW50aWNzIG9mIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogSWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXMgbm90IHJlZiB0aGUgY29ubmVjdGlvbiwgd2Ugd2FudCB0byBjbG9zZSBpdC4KKyAqCisgKiBBIGJpdCBvZiBhIGhhY2ssIHByb2JhYmx5IHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHZhbHVlCisgKiBmb3Igd2hldGhlciB0byBjbG9zZSwgb3Igc2hvdWxkIGhhdmUgaGFkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiBpZiBpdAorICogZGlkbid0IHdhbnQgaXQuCisgKgorICogQnV0LCB0aGlzIHdvcmtzIE9LIGFzIGxvbmcgYXMgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAqIGNyYXp5IGxpa2Uga2VlcCB0aGUgY29ubmVjdGlvbiBhcm91bmQgd2l0aG91dCByZWYnaW5nIGl0LgorICoKKyAqIFdlIGhhdmUgdG8gbG9jayB0aGUgY29ubmVjdGlvbiBhY3Jvc3MgcmVmY291bnQgY2hlY2sgYW5kIGNsb3NlIGluIGNhc2UKKyAqIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzcGF3bnMgYSB0aHJlYWQgdGhhdCBjbG9zZXMgYW5kIHVucmVmcy4KKyAqIEluIHRoYXQgY2FzZSwgaWYgdGhlIGFwcCB0aHJlYWQKKyAqIGNsb3NlcyBhbmQgdW5yZWZzIGZpcnN0LCB3ZSdsbCBoYXJtbGVzc2x5IGNsb3NlIGFnYWluOyBpZiB0aGUgYXBwIHRocmVhZAorICogc3RpbGwgaGFzIHRoZSByZWYsIHdlJ2xsIGNsb3NlIGFuZCB0aGVuIHRoZSBhcHAgd2lsbCBjbG9zZSBoYXJtbGVzc2x5LgorICogSWYgdGhlIGFwcCB1bnJlZnMgd2l0aG91dCBjbG9zaW5nLCB0aGUgYXBwIGlzIGJyb2tlbiBzaW5jZSBpZiB0aGUKKyAqIGFwcCByZWZzIGZyb20gdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGl0IGlzIHN1cHBvc2VkIHRvIGFsc28gY2xvc2UuCisgKgorICogSWYgd2UgZGlkbid0IGF0b21pY2FsbHkgY2hlY2sgdGhlIHJlZmNvdW50IGFuZCBjbG9zZSB3aXRoIHRoZSBsb2NrIGhlbGQKKyAqIHRob3VnaCwgd2UgY291bGQgc2NyZXcgdGhpcyB1cC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2ludDMyX3QgcmVmY291bnQ7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZWZjb3VudCA9IF9kYnVzX2F0b21pY19nZXQgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIC8qIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHJlZiAqLworICBfZGJ1c19hc3NlcnQgKHJlZmNvdW50ID49IDEpOworCisgIGlmIChyZWZjb3VudCA9PSAxKQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworICBlbHNlCisgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisKKy8qKgorICogV2hlbiBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGEgdGltZW91dCwgYW5kIHdlCisgKiBydW4gb3V0IG9mIG1lbW9yeSwgdGhlIHRpbWUgdG8gd2FpdCBmb3IgbWVtb3J5IGlzIGJhc2VkIG9uIHRoZQorICogdGltZW91dC4gSWYgdGhlIGNhbGxlciB3YXMgd2lsbGluZyB0byBibG9jayBhIGxvbmcgdGltZSB3ZSB3YWl0IGEKKyAqIHJlbGF0aXZlbHkgbG9uZyB0aW1lIGZvciBtZW1vcnksIGlmIHRoZXkgd2VyZSBvbmx5IHdpbGxpbmcgdG8gYmxvY2sKKyAqIGJyaWVmbHkgdGhlbiB3ZSByZXRyeSBmb3IgbWVtb3J5IGF0IGEgcmFwaWQgcmF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGhlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBibG9ja2luZworICovCitzdGF0aWMgdm9pZAorX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKGludCB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xKQorICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7CisgIGVsc2UgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMTAwKQorICAgIDsgLyoganVzdCBidXN5IGxvb3AgKi8KKyAgZWxzZSBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPD0gMTAwMCkKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMyk7CisgIGVsc2UKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDEwMDApOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKgorZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSAoZGJ1c191aW50MzJfdCBzZXJpYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXJyb3JfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplcnJvcl9tc2cpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAoIW1lc3NhZ2UpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsIGVycm9yX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OyAKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7IAorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tc2cpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKwkgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoKKyAqIFBlZWsgdGhlIGluY29taW5nIHF1ZXVlIHRvIHNlZSBpZiB3ZSBnb3QgcmVwbHkgZm9yIGEgc3BlY2lmaWMgc2VyaWFsCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9wZWVrX2Zvcl9yZXBseV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KSA9PSBjbGllbnRfc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIHJlcGx5IHRvICVkIGZvdW5kIGluIHF1ZXVlXG4iLCBfREJVU19GVU5DVElPTl9OQU1FLCBjbGllbnRfc2VyaWFsKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBUaGlzIGlzIHNsaWdodGx5IHN0cmFuZ2Ugc2luY2Ugd2UgY2FuIHBvcCBhIG1lc3NhZ2UgaGVyZSB3aXRob3V0CisgKiB0aGUgZGlzcGF0Y2ggbG9jay4KKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorY2hlY2tfZm9yX3JlcGx5X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGNsaWVudF9zZXJpYWwpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICpyZXBseSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAocmVwbHkpID09IGNsaWVudF9zZXJpYWwpCisJeworCSAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKwkgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgIC09IDE7CisJICByZXR1cm4gcmVwbHk7CisJfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgIC8qIFdlIGNhbid0IGl0ZXJhdGUgb3ZlciB0aGUgaGFzaCBpbiB0aGUgbm9ybWFsIHdheSBzaW5jZSB3ZSdsbCBiZQorICAgICogZHJvcHBpbmcgdGhlIGxvY2sgZm9yIGVhY2ggaXRlbS4gU28gd2UgcmVzdGFydCB0aGUKKyAgICAqIGl0ZXIgZWFjaCB0aW1lIGFzIHdlIGRyYWluIHRoZSBoYXNoIHRhYmxlLgorICAgICovCisgICAKKyAgIHdoaWxlIChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcykgPiAwKQorICAgIHsKKyAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLCAmaXRlcik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpOworICAgICAgIAorICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworICAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoX2RidXNfcGVuZGluZ19jYWxsX2lzX3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcpKQorICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsgICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorY29tcGxldGVfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlKQoreworICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkIChwZW5kaW5nLCBtZXNzYWdlKTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7IC8qIGluIGNhc2UgdGhlcmUncyBubyBhcHAgd2l0aCBhIHJlZiBoZWxkICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nKTsKKyAKKyAgLyogTXVzdCBiZSBjYWxsZWQgdW5sb2NrZWQgc2luY2UgaXQgaW52b2tlcyBhcHAgY2FsbGJhY2sgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlIChwZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgcmVwbHkgPSBjaGVja19mb3JfcmVwbHlfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNoZWNrZWQgZm9yIHJlcGx5XG4iKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IGdvdCByZXBseVxuIik7CisKKyAgICAgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCByZXBseSk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgYSBwZW5kaW5nIGNhbGwgdGltZXMgb3V0IG9yIGdldHMgYSByZXBseS4KKyAqCisgKiBEb2VzIG5vdCByZS1lbnRlciB0aGUgbWFpbiBsb29wIG9yIHJ1biBmaWx0ZXIvcGF0aC1yZWdpc3RlcmVkCisgKiBjYWxsYmFja3MuIFRoZSByZXBseSB0byB0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBzZWVuIGJ5CisgKiBmaWx0ZXIgY2FsbGJhY2tzLgorICoKKyAqIFJldHVybnMgaW1tZWRpYXRlbHkgaWYgcGVuZGluZyBjYWxsIGFscmVhZHkgZ290IGEgcmVwbHkuCisgKiAKKyAqIEB0b2RvIGNvdWxkIHVzZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKGl0IGtlZXBzIHNjYW5uaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZSBxdWV1ZSBmb3IgZXhhbXBsZSkKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIHdlIGJsb2NrIGZvciBhIHJlcGx5IG9uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGxvbmcgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjOworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfdWludDMyX3QgY2xpZW50X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisgIGludCB0aW1lb3V0X21pbGxpc2Vjb25kcywgZWxhcHNlZF9taWxsaXNlY29uZHM7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwZW5kaW5nKSkKKyAgICByZXR1cm47CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfcmVmIChwZW5kaW5nKTsgLyogbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGNhbGwgY291bGQgYmUgY2FuY2VsZWQgKi8KKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChwZW5kaW5nKTsKKyAgCisgIC8qIEZsdXNoIG1lc3NhZ2UgcXVldWUgLSBub3RlLCBjYW4gYWZmZWN0IGRpc3BhdGNoIHN0YXR1cyAqLworICBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBjbGllbnRfc2VyaWFsID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIC8qIG5vdGUgdGhhdCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpcyBsaW1pdGVkIHRvIGEgc21hbGxpc2ggdmFsdWUKKyAgICogaW4gX2RidXNfcGVuZGluZ19jYWxsX25ldygpIHNvIG92ZXJmbG93cyBhcmVuJ3QgcG9zc2libGUKKyAgICogYmVsb3cKKyAgICovCisgIHRpbWVvdXQgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpOworICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsICh0aW1lb3V0KTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IHdpbGwgYmxvY2sgJWQgbWlsbGlzZWNvbmRzIGZvciByZXBseSBzZXJpYWwgJXUgZnJvbSAlbGQgc2VjICVsZCB1c2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICBjbGllbnRfc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyA9IC0xOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKTogd2lsbCBibG9jayBmb3IgcmVwbHkgc2VyaWFsICV1XG4iLCBjbGllbnRfc2VyaWFsKTsKKyAgICB9CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgZ290IHRoZSBkYXRhIG9mZiB0aGUgc29ja2V0ICovCisgIC8qIGZyb20gYW5vdGhlciBibG9ja2VkIHBlbmRpbmcgY2FsbCAqLworICBpZiAoY2hlY2tfZm9yX3JlcGx5X2FuZF91cGRhdGVfZGlzcGF0Y2hfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHBlbmRpbmcpKQorICAgIHJldHVybjsKKworICAvKiBOb3cgd2Ugd2FpdC4uLiAqLworICAvKiBhbHdheXMgYmxvY2sgYXQgbGVhc3Qgb25jZSBhcyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgdGhlIHJlcGx5IHlldCAqLworICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCisgcmVjaGVja19zdGF0dXM6CisKKyAgX2RidXNfdmVyYm9zZSAoInRvcCBvZiByZWNoZWNrXG4iKTsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICAvKiBxdWV1ZSBtZXNzYWdlcyBhbmQgZ2V0IHN0YXR1cyAqLworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhlIGdldF9jb21wbGV0ZWQoKSBpcyBpbiBjYXNlIGEgZGlzcGF0Y2goKSB3aGlsZSB3ZSB3ZXJlIGJsb2NraW5nCisgICAqIGdvdCB0aGUgcmVwbHkgaW5zdGVhZCBvZiB1cy4KKyAgICovCisgIGlmIChfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAocGVuZGluZykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlBlbmRpbmcgY2FsbCBjb21wbGV0ZWQgYnkgZGlzcGF0Y2hcbiIpOworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICBpZiAoY2hlY2tfZm9yX3JlcGx5X2FuZF91cGRhdGVfZGlzcGF0Y2hfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHBlbmRpbmcpKQorICAgICAgICByZXR1cm47CisgICAgfQorICAKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgIGVsYXBzZWRfbWlsbGlzZWNvbmRzID0gKHR2X3NlYyAtIHN0YXJ0X3R2X3NlYykgKiAxMDAwICsKKwkgICh0dl91c2VjIC0gc3RhcnRfdHZfdXNlYykgLyAxMDAwOworICAKKyAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICplcnJvcl9tc2c7CisKKyAgICAgIGVycm9yX21zZyA9IGdlbmVyYXRlX2xvY2FsX2Vycm9yX21lc3NhZ2UgKGNsaWVudF9zZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIGJlZm9yZSBhIHJlcGx5IHdhcyByZWNlaXZlZCIpOyAKKworICAgICAgLyogb24gT09NIGVycm9yX21zZyBpcyBzZXQgdG8gTlVMTCAqLworICAgICAgY29tcGxldGVfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcsIGVycm9yX21zZyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBkaXNjb25uZWN0ZWRcbiIpOworICBlbHNlIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgeworICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyeSBzbGVlcGluZyBhIGJpdCwgYXMgd2UgYXJlbid0IHN1cmUgd2UgbmVlZCB0byBibG9jayBmb3IgcmVhZGluZywKKyAgICAgICAgICAgKiB3ZSBtYXkgYWxyZWFkeSBoYXZlIGEgcmVwbHkgaW4gdGhlIGJ1ZmZlciBhbmQganVzdCBjYW4ndCBwcm9jZXNzCisgICAgICAgICAgICogaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgd2FpdGluZyBmb3IgbW9yZSBtZW1vcnlcbiIpOworCisgICAgICAgICAgX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgLyogYmxvY2sgYWdhaW4sIHdlIGRvbid0IGhhdmUgdGhlIHJlcGx5IGJ1ZmZlcmVkIHlldC4gKi8KKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorCisgICAgICBnb3RvIHJlY2hlY2tfc3RhdHVzOworICAgIH0KKyAgZWxzZSBpZiAodHZfc2VjIDwgc3RhcnRfdHZfc2VjKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBjbG9jayBzZXQgYmFja3dhcmRcbiIpOworICBlbHNlIGlmIChlbGFwc2VkX21pbGxpc2Vjb25kcyA8IHRpbWVvdXRfbWlsbGlzZWNvbmRzKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiAlZCBtaWxsaXNlY29uZHMgcmVtYWluXG4iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgIAorICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHNsZWVwaW5nIGEgYml0LCBhcyB3ZSBhcmVuJ3Qgc3VyZSB3ZSBuZWVkIHRvIGJsb2NrIGZvciByZWFkaW5nLAorICAgICAgICAgICAqIHdlIG1heSBhbHJlYWR5IGhhdmUgYSByZXBseSBpbiB0aGUgYnVmZmVyIGFuZCBqdXN0IGNhbid0IHByb2Nlc3MKKyAgICAgICAgICAgKiBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSB3YWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisKKyAgICAgICAgICBfZGJ1c19tZW1vcnlfcGF1c2VfYmFzZWRfb25fdGltZW91dCAodGltZW91dF9taWxsaXNlY29uZHMgLSBlbGFwc2VkX21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBibG9jayBhZ2Fpbiwgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVwbHkgYnVmZmVyZWQgeWV0LiAqLworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIGdvdG8gcmVjaGVja19zdGF0dXM7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBXYWl0ZWQgJWQgbWlsbGlzZWNvbmRzIGFuZCBnb3Qgbm8gcmVwbHlcbiIsCisgICAgICAgICAgICAgICAgIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAocGVuZGluZykpOworICAKKyAgLyogdW5sb2NrIGFuZCBjYWxsIHVzZXIgY29kZSAqLworICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgTlVMTCk7CisKKyAgLyogdXBkYXRlIHVzZXIgY29kZSBvbiBkaXNwYXRjaCBzdGF0dXMgKi8KKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBSZXR1cm4gaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBhcmUgcGVuZGluZyBpbiB0aGUgbG9hZGVyCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLworaW50CitfZGJ1c19jb25uZWN0aW9uX2dldF9wZW5kaW5nX2Zkc19jb3VudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHJldHVybiBfZGJ1c190cmFuc3BvcnRfZ2V0X3BlbmRpbmdfZmRzX2NvdW50IChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworfQorCisvKioKKyAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcGVuZGluZyBmaWxlCisgKiBkZXNjcmlwdG9ycyBpbiB0aGUgbG9hZGVyIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjaworICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdGZHNDaGFuZ2VGdW5jdGlvbiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBfZGJ1c190cmFuc3BvcnRfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBkYXRhKTsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKKy8qKgorICogR2V0cyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgYWRkcmVzcy4gSWYgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbgorICogYWRkcmVzcyBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiB3aXRoIGl0cworICogcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmV3IGNvbm5lY3Rpb24KKyAqIGFuZCBzYXZlcyB0aGUgbmV3IGNvbm5lY3Rpb24gZm9yIHBvc3NpYmxlIHJlLXVzZSBpZiBhIGZ1dHVyZSBjYWxsCisgKiB0byBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFza3MgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBzZXJ2ZXIuCisgKgorICogVXNlIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSB0byBnZXQgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbgorICogbm90IHNoYXJlZCB3aXRoIG90aGVyIGNhbGxlcnMgb2YgZGJ1c19jb25uZWN0aW9uX29wZW4oKS4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBCZWNhdXNlIHRoaXMgY29ubmVjdGlvbiBpcyBzaGFyZWQsIG5vIHVzZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIG1heSBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpLiBIb3dldmVyLCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZQorICogY29ubmVjdGlvbiB5b3Ugc2hvdWxkIGNhbGwgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkuCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqIAorICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MuCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBuZXcgY29ubmVjdGlvbiwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c0Nvbm5lY3Rpb24qCitkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIE9wZW5zIGEgbmV3LCBkZWRpY2F0ZWQgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhZGRyZXNzLiBVbmxpa2UKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuKCksIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24uCisgKiBUaGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgc2F2ZWQgb3IgcmVjeWNsZWQgYnkgbGliZGJ1cy4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY29ubmVjdGlvbiwgeW91IG11c3QKKyAqIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHRvIGRpc2Nvbm5lY3QgaXQsCisgKiBhbmQgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgdG8gZnJlZSB0aGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiAKKyAqIChUaGUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgY2FuIGJlIHNraXBwZWQgaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIGFscmVhZHkga25vd24gdG8gYmUgZGlzY29ubmVjdGVkLCBmb3IgZXhhbXBsZQorICogaWYgeW91IGFyZSBpbnNpZGUgYSBoYW5kbGVyIGZvciB0aGUgRGlzY29ubmVjdGVkIHNpZ25hbC4pCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIG5ldyBjb25uZWN0aW9uLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzQ29ubmVjdGlvbioKK2RidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGNvbnN0IGNoYXIgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uLgorICovCitEQnVzQ29ubmVjdGlvbiAqCitkYnVzX2Nvbm5lY3Rpb25fcmVmIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24sIE5VTEwpOworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworICBfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoY29ubmVjdGlvbiwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZiIpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vdXRnb2luZ19tZXNzYWdlICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSA9IGVsZW1lbnQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChtZXNzYWdlLCBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKK30KKworLyogVGhpcyBpcyBydW4gd2l0aG91dCB0aGUgbXV0ZXggaGVsZCwgYnV0IGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZQorICogdG8gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZHJvcHBlZCB3ZSBzaG91bGQgaGF2ZSBubyB0aHJlYWQtcmVsYXRlZAorICogcHJvYmxlbXMKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfYXRvbWljX2dldCAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KSA9PSAwKTsKKworICAvKiBZb3UgaGF2ZSB0byBkaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGJlZm9yZSB1bnJlZjppbmcgaXQuIE90aGVyd2lzZQorICAgKiB5b3Ugd29uJ3QgZ2V0IHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9PSBOVUxMKTsKKyAgCisgIC8qIC0tLS0gV2UncmUgZ29pbmcgdG8gY2FsbCB2YXJpb3VzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyBoZXJlLCBob3BlIGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuLi4gKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24tPm9iamVjdHMpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKGNvbm5lY3Rpb24tPndhdGNoZXMpOworICBjb25uZWN0aW9uLT53YXRjaGVzID0gTlVMTDsKKyAgCisgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChjb25uZWN0aW9uLT50aW1lb3V0cyk7CisgIGNvbm5lY3Rpb24tPnRpbWVvdXRzID0gTlVMTDsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmY29ubmVjdGlvbi0+c2xvdF9saXN0KTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXIgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgbGluayk7CisKKyAgICAgIGZpbHRlci0+ZnVuY3Rpb24gPSBOVUxMOworICAgICAgX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKGZpbHRlcik7IC8qIGNhbGxzIGFwcCBjYWxsYmFjayAqLworICAgICAgbGluay0+ZGF0YSA9IE5VTEw7CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgCisgIC8qIC0tLS0gRG9uZSB3aXRoIHN0dWZmIHRoYXQgaW52b2tlcyBhcHBsaWNhdGlvbiBjYWxsYmFja3MgKi8KKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAoY29ubmVjdGlvbi0+b2JqZWN0cyk7ICAKKworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMpOworICBjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMgPSBOVUxMOworICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgIGZyZWVfb3V0Z29pbmdfbWVzc2FnZSwKKwkJICAgICAgY29ubmVjdGlvbik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcyk7CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfbWVzc2FnZV91bnJlZiwKKwkJICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKyAgX2RidXNfY291bnRlcl91bnJlZiAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworCisgIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluaykKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSA9IGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rLT5kYXRhOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayk7CisgICAgfQorCisgIF9kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQpOworICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworCisgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworCisgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+c2xvdF9tdXRleCk7CisKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5tdXRleCk7CisgIAorICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLCBhbmQgZmluYWxpemVzCisgKiBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIE5vdGU6IGl0IGlzIGEgYnVnIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgY29ubmVjdGlvbiB0aGF0CisgKiBpcyBzdGlsbCBjb25uZWN0ZWQuCisgKgorICogRm9yIHNoYXJlZCBjb25uZWN0aW9ucywgbGliZGJ1cyB3aWxsIG93biBhIHJlZmVyZW5jZQorICogYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQsIHNvIHlvdSBjYW4ga25vdyB0aGF0IGVpdGhlcgorICogeW91IGRvbid0IGhhdmUgdGhlIGxhc3QgcmVmZXJlbmNlLCBvciBpdCdzIE9LIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlLgorICogTW9zdCBjb25uZWN0aW9ucyBhcmUgc2hhcmVkLiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFuZCBkYnVzX2J1c19nZXQoKQorICogcmV0dXJuIHNoYXJlZCBjb25uZWN0aW9ucy4KKyAqCisgKiBGb3IgcHJpdmF0ZSBjb25uZWN0aW9ucywgdGhlIGNyZWF0b3Igb2YgdGhlIGNvbm5lY3Rpb24gbXVzdCBhcnJhbmdlIGZvcgorICogZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgdG8gYmUgY2FsbGVkIHByaW9yIHRvIGRyb3BwaW5nIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAqIFByaXZhdGUgY29ubmVjdGlvbnMgY29tZSBmcm9tIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisKKyAgX2RidXNfY29ubmVjdGlvbl90cmFjZV9yZWYgKGNvbm5lY3Rpb24sIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwKKyAgICAgICJ1bnJlZiIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgICAgIGlmIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiVGhlIGxhc3QgcmVmZXJlbmNlIG9uIGEgY29ubmVjdGlvbiB3YXMgZHJvcHBlZCB3aXRob3V0IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYSBidWcgaW4gYW4gYXBwbGljYXRpb24uIFNlZSBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYoKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlxuJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9zdCBsaWtlbHksIHRoZSBhcHBsaWNhdGlvbiBjYWxsZWQgdW5yZWYoKSB0b28gbWFueSB0aW1lcyBhbmQgcmVtb3ZlZCBhIHJlZmVyZW5jZSBiZWxvbmdpbmcgdG8gbGliZGJ1cywgc2luY2UgdGhpcyBpcyBhIHNoYXJlZCBjb25uZWN0aW9uLlxuIiA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc3QgbGlrZWx5LCB0aGUgYXBwbGljYXRpb24gd2FzIHN1cHBvc2VkIHRvIGNhbGwgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCksIHNpbmNlIHRoaXMgaXMgYSBwcml2YXRlIGNvbm5lY3Rpb24uXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmIChjb25uZWN0aW9uKTsKKyAgICB9Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgdGhlIHRyYW5zcG9ydCBjYW4gZGlzY29ubmVjdCBpdHNlbGYgKG90aGVyIGVuZCBkcm9wcyB1cykKKyAqIGFuZCBpbiB0aGF0IGNhc2UgdGhpcyBmdW5jdGlvbiBuZXZlciBydW5zLiBTbyB0aGlzIGZ1bmN0aW9uIG11c3QKKyAqIG5vdCBkbyBhbnl0aGluZyBtb3JlIHRoYW4gZGlzY29ubmVjdCB0aGUgdHJhbnNwb3J0IGFuZCB1cGRhdGUgdGhlCisgKiBkaXNwYXRjaCBzdGF0dXMuCisgKiAKKyAqIElmIHRoZSB0cmFuc3BvcnQgc2VsZi1kaXNjb25uZWN0cywgdGhlbiB3ZSBhc3N1bWUgc29tZW9uZSB3aWxsCisgKiBkaXNwYXRjaCB0aGUgY29ubmVjdGlvbiB0byBjYXVzZSB0aGUgZGlzcGF0Y2ggc3RhdHVzIHVwZGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgLyogV2UgbmVlZCB0byByZWYgYmVjYXVzZSB1cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgd2lsbCB1bnJlZgorICAgKiB0aGUgY29ubmVjdGlvbiBpZiBpdCB3YXMgc2hhcmVkIGFuZCBsaWJkYnVzIHdhcyB0aGUgb25seSByZW1haW5pbmcKKyAgICogcmVmY291bnQgaG9sZGVyLgorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisKKyAgLyogVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIHF1ZXVpbmcgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBsaW5rCisgICAqICh1bmxlc3Mgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5LCBwb3NzaWJseSwgc28gZG9uJ3QgYXNzZXJ0IGl0KS4KKyAgICogQWZ0ZXIgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBsaW5rIGlzIHF1ZXVlZCwgZGJ1c19idXNfZ2V0L2RidXNfY29ubmVjdGlvbl9vcGVuCisgICAqIHNob3VsZCBuZXZlciBhZ2FpbiByZXR1cm4gdGhlIG5ld2x5LWRpc2Nvbm5lY3RlZCBjb25uZWN0aW9uLgorICAgKgorICAgKiBIb3dldmVyLCB3ZSBvbmx5IHVucmVmIHRoZSBzaGFyZWQgY29ubmVjdGlvbiBhbmQgZXhpdF9vbl9kaXNjb25uZWN0IHdoZW4KKyAgICogdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSByZWFjaGVzIHRoZSBoZWFkIG9mIHRoZSBtZXNzYWdlIHF1ZXVlLAorICAgKiBOT1Qgd2hlbiBpdCdzIGZpcnN0IHF1ZXVlZC4KKyAgICovCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogVGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIC8qIENvdWxkIGFsc28gY2FsbCBvdXQgdG8gdXNlciBjb2RlICovCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgcHJpdmF0ZSBjb25uZWN0aW9uLCBzbyBubyBmdXJ0aGVyIGRhdGEgY2FuIGJlIHNlbnQgb3IgcmVjZWl2ZWQuCisgKiBUaGlzIGRpc2Nvbm5lY3RzIHRoZSB0cmFuc3BvcnQgKHN1Y2ggYXMgYSBzb2NrZXQpIHVuZGVybHlpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEF0dGVtcHRzIHRvIHNlbmQgbWVzc2FnZXMgYWZ0ZXIgY2xvc2luZyBhIGNvbm5lY3Rpb24gYXJlIHNhZmUsIGJ1dCB3aWxsIHJlc3VsdCBpbgorICogZXJyb3IgcmVwbGllcyBnZW5lcmF0ZWQgbG9jYWxseSBpbiBsaWJkYnVzLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgY29ubmVjdGlvbidzIHJlZmVyZW5jZSBjb3VudC4gIEl0J3MKKyAqIHNhZmUgdG8gY2xvc2UgYSBjb25uZWN0aW9uIG1vcmUgdGhhbiBvbmNlOyBhbGwgY2FsbHMgYWZ0ZXIgdGhlCisgKiBmaXJzdCBkbyBub3RoaW5nLiBJdCdzIGltcG9zc2libGUgdG8gInJlb3BlbiIgYSBjb25uZWN0aW9uLCBhCisgKiBuZXcgY29ubmVjdGlvbiBtdXN0IGJlIGNyZWF0ZWQuIFRoaXMgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiBhIGNhbGwKKyAqIHRvIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBzZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSwgYXMgdGhlIGRpc2Nvbm5lY3QKKyAqIG1lc3NhZ2UgaXQgZ2VuZXJhdGVzIG5lZWRzIHRvIGJlIGRpc3BhdGNoZWQuCisgKgorICogSWYgYSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYnkgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiwgaXQgd2lsbAorICogY2xvc2UgaXRzZWxmLiAKKyAqIAorICogWW91IG11c3QgY2xvc2UgYSBjb25uZWN0aW9uIHByaW9yIHRvIHJlbGVhc2luZyB0aGUgbGFzdCByZWZlcmVuY2UgdG8KKyAqIHRoZSBjb25uZWN0aW9uLiBJZiB5b3UgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgZm9yIHRoZSBsYXN0IHRpbWUKKyAqIHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbiwgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZDsgaXQKKyAqIGlzIGEgYnVnIGluIHlvdXIgcHJvZ3JhbSBhbmQgbGliZGJ1cyB3aWxsIHRyeSB0byBwcmludCBhIHdhcm5pbmcuCisgKgorICogWW91IG1heSBub3QgY2xvc2UgYSBzaGFyZWQgY29ubmVjdGlvbi4gQ29ubmVjdGlvbnMgY3JlYXRlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG9yIGRidXNfYnVzX2dldCgpIGFyZSBzaGFyZWQuCisgKiBUaGVzZSBjb25uZWN0aW9ucyBhcmUgb3duZWQgYnkgbGliZGJ1cywgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQKKyAqIG9ubHkgdW5yZWYgdGhlbSwgbmV2ZXIgY2xvc2UgdGhlbS4gQXBwbGljYXRpb25zIGNhbiBrbm93IGl0IGlzCisgKiBzYWZlIHRvIHVucmVmIHRoZXNlIGNvbm5lY3Rpb25zIGJlY2F1c2UgbGliZGJ1cyB3aWxsIGJlIGhvbGRpbmcgYQorICogcmVmZXJlbmNlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gaXMgb3Blbi4gVGh1cywgZWl0aGVyIHRoZQorICogY29ubmVjdGlvbiBpcyBjbG9zZWQgYW5kIGl0IGlzIE9LIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlLAorICogb3IgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbiBhbmQgdGhlIGFwcCBrbm93cyBpdCBkb2VzIG5vdCBoYXZlIHRoZQorICogbGFzdCByZWZlcmVuY2UuCisgKgorICogQ29ubmVjdGlvbnMgY3JlYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBvcgorICogZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBhcmUgbm90IGtlcHQgdHJhY2sgb2Ygb3IgcmVmZXJlbmNlZCBieQorICogbGliZGJ1cy4gVGhlIGNyZWF0b3Igb2YgdGhlc2UgY29ubmVjdGlvbnMgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHByaW9yIHRvIHJlbGVhc2luZyB0aGUgbGFzdAorICogcmVmZXJlbmNlLCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYWxyZWFkeSBkaXNjb25uZWN0ZWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIHByaXZhdGUgKHVuc2hhcmVkKSBjb25uZWN0aW9uIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9jbG9zZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoY29ubmVjdGlvbi0+c2hhcmVhYmxlKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcHBsaWNhdGlvbnMgbXVzdCBub3QgY2xvc2Ugc2hhcmVkIGNvbm5lY3Rpb25zIC0gc2VlIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGRvY3MuIFRoaXMgaXMgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgIAorICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZF9hbmRfdW5sb2NrIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7Cit9CisKKy8qKgorICogR2V0cyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBvcGVuLiAgQSBjb25uZWN0aW9uIG1heQorICogYmVjb21lIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZW1vdGUgYXBwbGljYXRpb24gY2xvc2VzIGl0cyBlbmQsIG9yCisgKiBleGl0czsgYSBjb25uZWN0aW9uIG1heSBhbHNvIGJlIGRpc2Nvbm5lY3RlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKS4KKyAqIAorICogVGhlcmUgYXJlIG5vdCBzZXBhcmF0ZSBzdGF0ZXMgZm9yICJjbG9zZWQiIGFuZCAiZGlzY29ubmVjdGVkLCIgdGhlIHR3bworICogdGVybXMgYXJlIHN5bm9ueW1vdXMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlYWxseSBiZSBjYWxsZWQKKyAqIGdldF9pc19vcGVuKCkgYnV0IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgaXMgbm90LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gd2FzIGF1dGhlbnRpY2F0ZWQuIChOb3RlIHRoYXQKKyAqIGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkIHRoZW4gZGlzY29ubmVjdGVkLAorICogdGhpcyBmdW5jdGlvbiBzdGlsbCByZXR1cm5zICNUUlVFKQorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgY29ubmVjdGlvbiB3YXMgZXZlciBhdXRoZW50aWNhdGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGF1dGhlbnRpY2F0ZWQgYXMgYSBzcGVjaWZpYworICogdXNlci4gIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkLCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zICNUUlVFLCBhbmQgaWYgaXQgaXMgYXV0aGVudGljYXRlZCBidXQgYXMgYW4gYW5vbnltb3VzIHVzZXIsCisgKiBpdCByZXR1cm5zICNUUlVFLiAgSWYgaXQgaXMgYXV0aGVudGljYXRlZCBhcyBhIHNwZWNpZmljIHVzZXIsIHRoZW4KKyAqIHRoaXMgcmV0dXJucyAjRkFMU0UuIChOb3RlIHRoYXQgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGF1dGhlbnRpY2F0ZWQKKyAqIGFzIGFub255bW91cyB0aGVuIGRpc2Nvbm5lY3RlZCwgdGhpcyBmdW5jdGlvbiBzdGlsbCByZXR1cm5zICNUUlVFLikKKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYW5vbnltb3VzLCB5b3UgY2FuIHVzZQorICogZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIoKSBhbmQKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyKCkgdG8gc2VlIHdobyBpdCdzIGF1dGhvcml6ZWQgYXMuCisgKgorICogSWYgeW91IHdhbnQgdG8gcHJldmVudCBub24tYW5vbnltb3VzIGF1dGhvcml6YXRpb24sIHVzZQorICogZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcygpIHRvIHJlbW92ZSB0aGUgbWVjaGFuaXNtcyB0aGF0CisgKiBhbGxvdyBwcm92aW5nIHVzZXIgaWRlbnRpdHkgKGkuZS4gb25seSBhbGxvdyB0aGUgQU5PTllNT1VTCisgKiBtZWNoYW5pc20pLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgbm90IGF1dGhlbnRpY2F0ZWQgb3IgYXV0aGVudGljYXRlZCBhcyBhbm9ueW1vdXMgCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9pc19hbm9ueW1vdXMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB0aGUgSUQgb2YgdGhlIHNlcnZlciBhZGRyZXNzIHdlIGFyZSBhdXRoZW50aWNhdGVkIHRvLCBpZiB0aGlzCisgKiBjb25uZWN0aW9uIGlzIG9uIHRoZSBjbGllbnQgc2lkZS4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgb24gdGhlCisgKiBzZXJ2ZXIgc2lkZSwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gI05VTEwgLSB1c2UgZGJ1c19zZXJ2ZXJfZ2V0X2lkKCkKKyAqIHRvIGdldCB0aGUgSUQgb2YgeW91ciBvd24gc2VydmVyLCBpZiB5b3UgYXJlIHRoZSBzZXJ2ZXIgc2lkZS4KKyAqIAorICogSWYgYSBjbGllbnQtc2lkZSBjb25uZWN0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIHlldCwgdGhlIElEIG1heSBiZQorICogYXZhaWxhYmxlIGlmIGl0IHdhcyBpbmNsdWRlZCBpbiB0aGUgc2VydmVyIGFkZHJlc3MsIGJ1dCBtYXkgbm90IGJlCisgKiBhdmFpbGFibGUuIFRoZSBvbmx5IHdheSB0byBiZSBzdXJlIHRoZSBzZXJ2ZXIgSUQgaXMgYXZhaWxhYmxlCisgKiBpcyB0byB3YWl0IGZvciBhdXRoZW50aWNhdGlvbiB0byBjb21wbGV0ZS4KKyAqCisgKiBJbiBnZW5lcmFsLCBlYWNoIG1vZGUgb2YgY29ubmVjdGluZyB0byBhIGdpdmVuIHNlcnZlciB3aWxsIGhhdmUKKyAqIGl0cyBvd24gSUQuIFNvIGZvciBleGFtcGxlLCBpZiB0aGUgc2Vzc2lvbiBidXMgZGFlbW9uIGlzIGxpc3RlbmluZworICogb24gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgb24gVENQLCB0aGVuIGVhY2ggb2YgdGhvc2UgbW9kYWxpdGllcworICogd2lsbCBoYXZlIGl0cyBvd24gc2VydmVyIElELgorICoKKyAqIElmIHlvdSB3YW50IGFuIElEIHRoYXQgaWRlbnRpZmllcyBhbiBlbnRpcmUgc2Vzc2lvbiBidXMsIGxvb2sgYXQKKyAqIGRidXNfYnVzX2dldF9pZCgpIGluc3RlYWQgKHdoaWNoIGlzIGp1c3QgYSBjb252ZW5pZW5jZSB3cmFwcGVyCisgKiBhcm91bmQgdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLkdldElkIG1ldGhvZCBpbnZva2VkIG9uIHRoZSBidXMpLgorICoKKyAqIFlvdSBjYW4gYWxzbyBnZXQgYSBtYWNoaW5lIElEOyBzZWUgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpIHRvCisgKiBnZXQgdGhlIG1hY2hpbmUgeW91IGFyZSBvbi4gIFRoZXJlIGlzbid0IGEgY29udmVuaWVuY2Ugd3JhcHBlciwgYnV0CisgKiB5b3UgY2FuIGludm9rZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCBvbiBhbnkgcGVlcgorICogdG8gZ2V0IHRoZSBtYWNoaW5lIElEIG9uIHRoZSBvdGhlciBlbmQuCisgKiAKKyAqIFRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGRlc2NyaWJlcyB0aGUgc2VydmVyIElEIGFuZCBvdGhlciBJRHMgaW4gYQorICogYml0IG1vcmUgZGV0YWlsLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgc2VydmVyIElEIG9yICNOVUxMIGlmIG5vIG1lbW9yeSBvciB0aGUgY29ubmVjdGlvbiBpcyBzZXJ2ZXItc2lkZQorICovCitjaGFyKgorZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBjaGFyICppZDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgaWQgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX3RyYW5zcG9ydF9nZXRfc2VydmVyX2lkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBpZDsKK30KKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIGEgY2VydGFpbiB0eXBlIGNhbiBiZSBzZW5kIHZpYSB0aGUgY29ubmVjdGlvbi4gVGhpcworICogd2lsbCBhbHdheXMgcmV0dXJuIFRSVUUgZm9yIGFsbCB0eXBlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCisgKiBEQlVTX1RZUEVfVU5JWF9GRC4gVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFRSVUUgZm9yCisgKiBEQlVTX1RZUEVfVU5JWF9GRCBvbmx5IG9uIHN5c3RlbXMgdGhhdCBrbm93IFVuaXggZmlsZSBkZXNjcmlwdG9ycworICogYW5kIGNhbiBzZW5kIHRoZW0gdmlhIHRoZSBjaG9zZW4gdHJhbnNwb3J0IGFuZCB3aGVuIHRoZSByZW1vdGUgc2lkZQorICogc3VwcG9ydHMgdGhpcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRvIHJ1bnRpbWUgY2hlY2tpbmcgZm9yIHR5cGVzIHRoYXQKKyAqIG1pZ2h0IGJlIHVua25vd24gdG8gdGhlIHNwZWNpZmljIEQtQnVzIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICogdmVyc2lvbiwgaS5lLiBpdCB3aWxsIHJldHVybiBGQUxTRSBmb3IgYWxsIHR5cGVzIHRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGtub3csIGluY2x1ZGluZyBpbnZhbGlkIG9yIHJlc2VydmVkIHR5cGVzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSB0byBjaGVjaworICogQHJldHVybnMgVFJVRSBpZiB0aGUgdHlwZSBtYXkgYmUgc2VuZCB2aWEgdGhlIGNvbm5lY3Rpb24KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghZGJ1c190eXBlX2lzX3ZhbGlkICh0eXBlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHR5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgcmV0dXJuIFRSVUU7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB7CisgICAgZGJ1c19ib29sX3QgYjsKKworICAgIENPTk5FQ1RJT05fTE9DSyhjb25uZWN0aW9uKTsKKyAgICBiID0gX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgICBDT05ORUNUSU9OX1VOTE9DSyhjb25uZWN0aW9uKTsKKworICAgIHJldHVybiBiOworICB9CisjZW5kaWYKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2V0IHdoZXRoZXIgX2V4aXQoKSBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcmVjZWl2ZXMgYQorICogZGlzY29ubmVjdCBzaWduYWwuIFRoZSBjYWxsIHRvIF9leGl0KCkgY29tZXMgYWZ0ZXIgYW55IGhhbmRsZXJzIGZvcgorICogdGhlIGRpc2Nvbm5lY3Qgc2lnbmFsIHJ1bjsgaGFuZGxlcnMgY2FuIGNhbmNlbCB0aGUgZXhpdCBieSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEJ5IGRlZmF1bHQsIGV4aXRfb25fZGlzY29ubmVjdCBpcyAjRkFMU0U7IGJ1dCBmb3IgbWVzc2FnZSBidXMKKyAqIGNvbm5lY3Rpb25zIHJldHVybmVkIGZyb20gZGJ1c19idXNfZ2V0KCkgaXQgd2lsbCBiZSB0b2dnbGVkIG9uCisgKiBieSBkZWZhdWx0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXhpdF9vbl9kaXNjb25uZWN0ICNUUlVFIGlmIF9leGl0KCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhIGRpc2Nvbm5lY3Qgc2lnbmFsCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZXhpdF9vbl9kaXNjb25uZWN0KQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBjb25uZWN0aW9uLT5leGl0X29uX2Rpc2Nvbm5lY3QgPSBleGl0X29uX2Rpc2Nvbm5lY3QgIT0gRkFMU0U7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBQcmVhbGxvY2F0ZXMgcmVzb3VyY2VzIG5lZWRlZCB0byBzZW5kIGEgbWVzc2FnZSwgYWxsb3dpbmcgdGhlIG1lc3NhZ2UgCisgKiB0byBiZSBzZW50IHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuCisgKiBBbGxvd3MgYXBwcyB0byBjcmVhdGUgYSBmdXR1cmUgZ3VhcmFudGVlIHRoYXQgdGhleSBjYW4gc2VuZAorICogYSBtZXNzYWdlIHJlZ2FyZGxlc3Mgb2YgbWVtb3J5IHNob3J0YWdlcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB3ZSdyZSBwcmVhbGxvY2F0aW5nIGZvci4KKyAqIEByZXR1cm5zIHRoZSBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzLCBvciAjTlVMTAorICovCitEQnVzUHJlYWxsb2NhdGVkU2VuZCoKK2RidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9CisgICAgX2RidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHByZWFsbG9jYXRlZDsKK30KKworLyoqCisgKiBGcmVlcyBwcmVhbGxvY2F0ZWQgbWVzc2FnZS1zZW5kaW5nIHJlc291cmNlcyBmcm9tCisgKiBkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCgpLiBTaG91bGQgb25seQorICogYmUgY2FsbGVkIGlmIHRoZSBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzIGFyZSBub3QgdXNlZAorICogdG8gc2VuZCBhIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwcmVhbGxvY2F0ZWQgdGhlIHJlc291cmNlcworICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7ICAKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gPT0gcHJlYWxsb2NhdGVkLT5jb25uZWN0aW9uKTsKKworICBfZGJ1c19saXN0X2ZyZWVfbGluayAocHJlYWxsb2NhdGVkLT5xdWV1ZV9saW5rKTsKKyAgX2RidXNfY291bnRlcl91bnJlZiAocHJlYWxsb2NhdGVkLT5jb3VudGVyX2xpbmstPmRhdGEpOworICBfZGJ1c19saXN0X2ZyZWVfbGluayAocHJlYWxsb2NhdGVkLT5jb3VudGVyX2xpbmspOworICBkYnVzX2ZyZWUgKHByZWFsbG9jYXRlZCk7Cit9CisKKy8qKgorICogU2VuZHMgYSBtZXNzYWdlIHVzaW5nIHByZWFsbG9jYXRlZCByZXNvdXJjZXMuIFRoaXMgZnVuY3Rpb24gY2Fubm90IGZhaWwuCisgKiBJdCB3b3JrcyBpZGVudGljYWxseSB0byBkYnVzX2Nvbm5lY3Rpb25fc2VuZCgpIGluIG90aGVyIHJlc3BlY3RzLgorICogUHJlYWxsb2NhdGVkIHJlc291cmNlcyBjb21lcyBmcm9tIGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKCkuCisgKiBUaGlzIGZ1bmN0aW9uICJjb25zdW1lcyIgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMsIHRoZXkgbmVlZCBub3QKKyAqIGJlIGZyZWVkIHNlcGFyYXRlbHkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwcmVhbGxvY2F0ZWQgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNlbmQKKyAqIEBwYXJhbSBjbGllbnRfc2VyaWFsIHJldHVybiBsb2NhdGlvbiBmb3IgY2xpZW50IHNlcmlhbCBhc3NpZ25lZCB0byB0aGUgbWVzc2FnZQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocHJlYWxsb2NhdGVkICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHByZWFsbG9jYXRlZC0+Y29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCkpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSAmJgorICAgICAgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgLyogUmVmdXNlIHRvIHNlbmQgZmRzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGNhbm5vdCBoYW5kbGUKKyAgICAgICAgIHRoZW0uIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJldHVybiBhIHByb3BlciBlcnJvciBoZXJlLCBzbworICAgICAgICAgdGhlIGJlc3Qgd2UgY2FuIGlzIGp1c3QgcmV0dXJuLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuOworICAgIH0KKworI2VuZGlmCisKKyAgX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorCQkJCQkJIHByZWFsbG9jYXRlZCwKKwkJCQkJCSBtZXNzYWdlLCBjbGllbnRfc2VyaWFsKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmNsaWVudF9zZXJpYWwpCit7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIAorICBwcmVhbGxvY2F0ZWQgPSBfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9zZXJpYWwpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZSB0byB0aGUgb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4gRG9lcyBub3QgYmxvY2sgdG8KKyAqIHdyaXRlIHRoZSBtZXNzYWdlIHRvIHRoZSBuZXR3b3JrOyB0aGF0IGhhcHBlbnMgYXN5bmNocm9ub3VzbHkuIFRvCisgKiBmb3JjZSB0aGUgbWVzc2FnZSB0byBiZSB3cml0dGVuLCBjYWxsIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIGhvd2V2ZXIKKyAqIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSBieSBoYW5kOyB0aGUgCisgKiBtZXNzYWdlIHdpbGwgYmUgc2VudCB0aGUgbmV4dCB0aW1lIHRoZSBtYWluIGxvb3AgaXMgcnVuLiAKKyAqIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIHNob3VsZCBvbmx5IGJlIHVzZWQsIGZvciBleGFtcGxlLCBpZgorICogdGhlIGFwcGxpY2F0aW9uIHdhcyBleHBlY3RlZCB0byBleGl0IGJlZm9yZSBydW5uaW5nIHRoZSBtYWluIGxvb3AuCisgKgorICogQmVjYXVzZSB0aGlzIG9ubHkgcXVldWVzIHRoZSBtZXNzYWdlLCB0aGUgb25seSByZWFzb24gaXQgY2FuCisgKiBmYWlsIGlzIGxhY2sgb2YgbWVtb3J5LiBFdmVuIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCwKKyAqIG5vIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZSBmdW5jdGlvbiBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIAorICogaXQgcmV0dXJucyAjRkFMU0UuIFRoZSBmdW5jdGlvbiB3aWxsIG5ldmVyIGZhaWwgZm9yIG90aGVyIHJlYXNvbnM7IGV2ZW4gCisgKiBpZiB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHlvdSBjYW4gcXVldWUgYW4gb3V0Z29pbmcgbWVzc2FnZSwKKyAqIHRob3VnaCBvYnZpb3VzbHkgaXQgd29uJ3QgYmUgc2VudC4KKyAqCisgKiBUaGUgbWVzc2FnZSBzZXJpYWwgaXMgdXNlZCBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uIHRvIHNlbmQgYQorICogcmVwbHk7IHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCgpIG9yIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIGRidXNfbWVzc2FnZV91bnJlZigpIGNhbiBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGlzIG1ldGhvZCByZXR1cm5zCisgKiBhcyB0aGUgbWVzc2FnZSBxdWV1ZSB3aWxsIGhvbGQgaXRzIG93biByZWYgdW50aWwgdGhlIG1lc3NhZ2UgaXMgc2VudC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byB3cml0ZS4KKyAqIEBwYXJhbSBzZXJpYWwgcmV0dXJuIGxvY2F0aW9uIGZvciBtZXNzYWdlIHNlcmlhbCwgb3IgI05VTEwgaWYgeW91IGRvbid0IGNhcmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnNlcmlhbCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkgJiYKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIC8qIFJlZnVzZSB0byBzZW5kIGZkcyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlCisgICAgICAgICB0aGVtLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgaGVyZSwgc28KKyAgICAgICAgIHRoZSBiZXN0IHdlIGNhbiBpcyBqdXN0IHJldHVybi4gKi8KKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNlbmRpZgorCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJICAgbWVzc2FnZSwKKwkJCQkJICAgc2VyaWFsKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZXBseV9oYW5kbGVyX3RpbWVvdXQgKHZvaWQgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcgPSBkYXRhOworCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2Nvbm5lY3Rpb25fYW5kX2xvY2sgKHBlbmRpbmcpOworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisJCQkJICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJtaWRkbGVcbiIpOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIFVubG9ja3MsIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUXVldWVzIGEgbWVzc2FnZSB0byBzZW5kLCBhcyB3aXRoIGRidXNfY29ubmVjdGlvbl9zZW5kKCksCisgKiBidXQgYWxzbyByZXR1cm5zIGEgI0RCdXNQZW5kaW5nQ2FsbCB1c2VkIHRvIHJlY2VpdmUgYSByZXBseSB0byB0aGUKKyAqIG1lc3NhZ2UuIElmIG5vIHJlcGx5IGlzIHJlY2VpdmVkIGluIHRoZSBnaXZlbiB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAqIHRoaXMgZnVuY3Rpb24gZXhwaXJlcyB0aGUgcGVuZGluZyByZXBseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGhldGljCisgKiBlcnJvciByZXBseSAoZ2VuZXJhdGVkIGluLXByb2Nlc3MsIG5vdCBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uKQorICogaW5kaWNhdGluZyB0aGF0IGEgdGltZW91dCBvY2N1cnJlZC4KKyAqCisgKiBBICNEQnVzUGVuZGluZ0NhbGwgd2lsbCBzZWUgYSByZXBseSBtZXNzYWdlIGJlZm9yZSBhbnkgZmlsdGVycyBvcgorICogcmVnaXN0ZXJlZCBvYmplY3QgcGF0aCBoYW5kbGVycy4gU2VlIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIGZvcgorICogZGV0YWlscyBvbiB3aGVuIGhhbmRsZXJzIGFyZSBydW4uCisgKgorICogQSAjREJ1c1BlbmRpbmdDYWxsIHdpbGwgYWx3YXlzIHNlZSBleGFjdGx5IG9uZSByZXBseSBtZXNzYWdlLAorICogdW5sZXNzIGl0J3MgY2FuY2VsbGVkIHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsKCkuCisgKiAKKyAqIElmICNOVUxMIGlzIHBhc3NlZCBmb3IgdGhlIHBlbmRpbmdfcmV0dXJuLCB0aGUgI0RCdXNQZW5kaW5nQ2FsbAorICogd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgYW5kIHVzZWQgdG8gdHJhY2sKKyAqIHRoZSBtZXNzYWdlIHJlcGx5IHRpbWVvdXQuIFRoaXMgbWVhbnMgYSB0aW1lb3V0IGVycm9yIHdpbGwKKyAqIG9jY3VyIGlmIG5vIHJlcGx5IGFycml2ZXMsIHVubGlrZSB3aXRoIGRidXNfY29ubmVjdGlvbl9zZW5kKCkuCisgKgorICogSWYgLTEgaXMgcGFzc2VkIGZvciB0aGUgdGltZW91dCwgYSBzYW5lIGRlZmF1bHQgdGltZW91dCBpcyB1c2VkLiAtMQorICogaXMgdHlwaWNhbGx5IHRoZSBiZXN0IHZhbHVlIGZvciB0aGUgdGltZW91dCBmb3IgdGhpcyByZWFzb24sIHVubGVzcworICogeW91IHdhbnQgYSB2ZXJ5IHNob3J0IG9yIHZlcnkgbG9uZyB0aW1lb3V0LiAgSWYgI0RCVVNfVElNRU9VVF9JTkZJTklURSBpcworICogcGFzc2VkIGZvciB0aGUgdGltZW91dCwgbm8gdGltZW91dCB3aWxsIGJlIHNldCBhbmQgdGhlIGNhbGwgd2lsbCBibG9jaworICogZm9yZXZlci4KKyAqCisgKiBAd2FybmluZyBpZiB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgb3IgeW91IHRyeSB0byBzZW5kIFVuaXgKKyAqIGZpbGUgZGVzY3JpcHRvcnMgb24gYSBjb25uZWN0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGVtLCB0aGUKKyAqICNEQnVzUGVuZGluZ0NhbGwgd2lsbCBiZSBzZXQgdG8gI05VTEwsIHNvIGJlIGNhcmVmdWwgd2l0aCB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gcGVuZGluZ19yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIGZvciBhICNEQnVzUGVuZGluZ0NhbGwKKyAqIG9iamVjdCwgb3IgI05VTEwgaWYgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgb3Igd2hlbiB5b3UgdHJ5IHRvCisgKiBzZW5kIFVuaXggZmlsZSBkZXNjcmlwdG9ycyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0CisgKiB0aGVtLgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCAtMSAob3IKKyAqICAjREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSBmb3IgZGVmYXVsdCBvciAjREJVU19USU1FT1VUX0lORklOSVRFIGZvciBubworICogIHRpbWVvdXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnksICNUUlVFIG90aGVyd2lzZS4KKyAqCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgICAqKnBlbmRpbmdfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBkYnVzX2ludDMyX3Qgc2VyaWFsID0gLTE7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lb3V0X21pbGxpc2Vjb25kcyA+PSAwIHx8IHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xLCBGQUxTRSk7CisKKyAgaWYgKHBlbmRpbmdfcmV0dXJuKQorICAgICpwZW5kaW5nX3JldHVybiA9IE5VTEw7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWZ1c2UgdG8gc2VuZCBmZHMgb24gYSBjb25uZWN0aW9uIHRoYXQgY2Fubm90IGhhbmRsZQorICAgICAgICAgdGhlbS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGhlcmUsIHNvCisgICAgICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgcmV0dXJuIFRSVUUgYnV0IGxlYXZlICpwZW5kaW5nX3JldHVybgorICAgICAgICAgYXMgTlVMTC4gKi8KKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworI2VuZGlmCisKKyAgIGlmICghX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBwZW5kaW5nID0gX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfaGFuZGxlcl90aW1lb3V0KTsKKworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogQXNzaWduIGEgc2VyaWFsIHRvIHRoZSBtZXNzYWdlICovCisgIHNlcmlhbCA9IGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKTsKKyAgaWYgKHNlcmlhbCA9PSAwKQorICAgIHsKKyAgICAgIHNlcmlhbCA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCAoY29ubmVjdGlvbik7CisgICAgICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgc2VyaWFsKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIG1lc3NhZ2UsIHNlcmlhbCkpCisgICAgZ290byBlcnJvcjsKKyAgICAKKyAgLyogSW5zZXJ0IHRoZSBzZXJpYWwgaW4gdGhlIHBlbmRpbmcgcmVwbGllcyBoYXNoOworICAgKiBoYXNoIHRha2VzIGEgcmVmY291bnQgb24gREJ1c1BlbmRpbmdDYWxsLgorICAgKiBBbHNvLCBhZGQgdGhlIHRpbWVvdXQuCisgICAqLworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYXR0YWNoX3BlbmRpbmdfY2FsbF91bmxvY2tlZCAoY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgIHBlbmRpbmcpKQorICAgIGdvdG8gZXJyb3I7CisgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisJCQkJCQkgICAgICAgcGVuZGluZyk7CisgICAgICBnb3RvIGVycm9yX3VubG9ja2VkOworICAgIH0KKworICBpZiAocGVuZGluZ19yZXR1cm4pCisgICAgKnBlbmRpbmdfcmV0dXJuID0gcGVuZGluZzsgLyogaGFuZCBvZmYgcmVmY291bnQgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF91bmxvY2tlZCAoY29ubmVjdGlvbiwgcGVuZGluZyk7CisgICAgICAvKiB3ZSBzdGlsbCBoYXZlIGEgcmVmIHRvIHRoZSBwZW5kaW5nIGNhbGwgaW4gdGhpcyBjYXNlLCB3ZSB1bnJlZgorICAgICAgICogYWZ0ZXIgdW5sb2NraW5nLCBiZWxvdworICAgICAgICovCisgICAgfQorCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIGlmIChwZW5kaW5nX3JldHVybiA9PSBOVUxMKQorICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKyAgCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyBlcnJvcl91bmxvY2tlZDoKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VuZHMgYSBtZXNzYWdlIGFuZCBibG9ja3MgYSBjZXJ0YWluIHRpbWUgcGVyaW9kIHdoaWxlIHdhaXRpbmcgZm9yCisgKiBhIHJlcGx5LiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWVudGVyIHRoZSBtYWluIGxvb3AsCisgKiBpLmUuIG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhlIHJlcGx5IGFyZSBxdWV1ZWQgdXAgYnV0IG5vdAorICogcHJvY2Vzc2VkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW52b2tlIG1ldGhvZCBjYWxscyBvbiBhCisgKiByZW1vdGUgb2JqZWN0LgorICogCisgKiBJZiBhIG5vcm1hbCByZXBseSBpcyByZWNlaXZlZCwgaXQgaXMgcmV0dXJuZWQsIGFuZCByZW1vdmVkIGZyb20gdGhlCisgKiBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLiBJZiBpdCBpcyBub3QgcmVjZWl2ZWQsICNOVUxMIGlzIHJldHVybmVkCisgKiBhbmQgdGhlIGVycm9yIGlzIHNldCB0byAjREJVU19FUlJPUl9OT19SRVBMWS4gIElmIGFuIGVycm9yIHJlcGx5IGlzCisgKiByZWNlaXZlZCwgaXQgaXMgY29udmVydGVkIHRvIGEgI0RCdXNFcnJvciBhbmQgcmV0dXJuZWQgYXMgYW4gZXJyb3IsCisgKiB0aGVuIHRoZSByZXBseSBtZXNzYWdlIGlzIGRlbGV0ZWQgYW5kICNOVUxMIGlzIHJldHVybmVkLiBJZgorICogc29tZXRoaW5nIGVsc2UgZ29lcyB3cm9uZywgcmVzdWx0IGlzIHNldCB0byB3aGF0ZXZlciBpcworICogYXBwcm9wcmlhdGUsIHN1Y2ggYXMgI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAjREJVU19FUlJPUl9ESVNDT05ORUNURUQuCisgKgorICogQHdhcm5pbmcgV2hpbGUgdGhpcyBmdW5jdGlvbiBibG9ja3MgdGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgbm90IGJlCisgKiBwcm9jZXNzaW5nIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLiBUaGlzIG1lYW5zIHlvdSBjYW4gZW5kIHVwCisgKiBkZWFkbG9ja2VkIGlmIHRoZSBhcHBsaWNhdGlvbiB5b3UncmUgdGFsa2luZyB0byBuZWVkcyB5b3UgdG8gcmVwbHkKKyAqIHRvIGEgbWV0aG9kLiBUbyBzb2x2ZSB0aGlzLCBlaXRoZXIgYXZvaWQgdGhlIHNpdHVhdGlvbiwgYmxvY2sgaW4gYQorICogc2VwYXJhdGUgdGhyZWFkIGZyb20gdGhlIG1haW4gY29ubmVjdGlvbi1kaXNwYXRjaGluZyB0aHJlYWQsIG9yIHVzZQorICogZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSgpIHRvIGF2b2lkIGJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIC0xIChvcgorICogICNEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIGZvciBkZWZhdWx0IG9yICNEQlVTX1RJTUVPVVRfSU5GSU5JVEUgZm9yIG5vCisgKiAgdGltZW91dAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBpcyB0aGUgcmVwbHkgb3IgI05VTEwgd2l0aCBhbiBlcnJvciBjb2RlIGlmIHRoZQorICogZnVuY3Rpb24gZmFpbHMuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lb3V0X21pbGxpc2Vjb25kcyA+PSAwIHx8IHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBkYnVzX3NldF9lcnJvcihlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDYW5ub3Qgc2VuZCBmaWxlIGRlc2NyaXB0b3JzIG9uIHRoaXMgY29ubmVjdGlvbi4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisjZW5kaWYKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmcsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRElTQ09OTkVDVEVELCAiQ29ubmVjdGlvbiBpcyBjbG9zZWQiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChwZW5kaW5nKTsKKworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChwZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworCisgIC8qIGNhbGxfY29tcGxldGVfYW5kX3VubG9jaygpIGNhbGxlZCBmcm9tIHBlbmRpbmdfY2FsbF9ibG9jaygpIHNob3VsZAorICAgKiBhbHdheXMgZmlsbCB0aGlzIGluLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChyZXBseSAhPSBOVUxMKTsKKyAgCisgICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIHJlcGx5OworfQorCisvKioKKyAqIEJsb2NrcyB1bnRpbCB0aGUgb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZSBpcyBlbXB0eS4KKyAqIEFzc3VtZXMgY29ubmVjdGlvbiBsb2NrIGFscmVhZHkgaGVsZC4KKyAqCisgKiBJZiB5b3UgY2FsbCB0aGlzLCB5b3UgTVVTVCBjYWxsIHVwZGF0ZV9kaXNwYXRjaF9zdGF0dXMgYWZ0ZXJ3b3JkLi4uCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzCitfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogV2UgaGF2ZSB0byBzcGVjaWZ5IERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgaGVyZSBiZWNhdXNlCisgICAqIG90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIHR3byBhcHBzIGRlYWRsb2NrIGlmIHRoZXkgYXJlIGJvdGggZG9pbmcKKyAgICogYSBmbHVzaCgpLCBhbmQgdGhlIGtlcm5lbCBidWZmZXJzIGZpbGwgdXAuIFRoaXMgY291bGQgY2hhbmdlIHRoZQorICAgKiBkaXNwYXRjaCBzdGF0dXMuCisgICAqLworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICB3aGlsZSAoY29ubmVjdGlvbi0+bl9vdXRnb2luZyA+IDAgJiYKKyAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRvaW5nIGl0ZXJhdGlvbiBpblxuIik7CisgICAgICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7CisgICAgfQorCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3ZlcmJvc2UgKCJtaWRkbGVcbiIpOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQmxvY2tzIHVudGlsIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICAvKiBXZSBoYXZlIHRvIHNwZWNpZnkgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyBoZXJlIGJlY2F1c2UKKyAgICogb3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgdHdvIGFwcHMgZGVhZGxvY2sgaWYgdGhleSBhcmUgYm90aCBkb2luZworICAgKiBhIGZsdXNoKCksIGFuZCB0aGUga2VybmVsIGJ1ZmZlcnMgZmlsbCB1cC4gVGhpcyBjb3VsZCBjaGFuZ2UgdGhlCisgICAqIGRpc3BhdGNoIHN0YXR1cy4KKyAgICovCisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZmx1c2hfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgLyogVW5sb2NrcyBhbmQgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBhbmQKKyAqIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlKCkgKHRoZXkgcGFzcyBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlCisgKiBkaXNwYXRjaCBwYXJhbWV0ZXIpLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heCB0aW1lIHRvIGJsb2NrIG9yIC0xIGZvciBpbmZpbml0ZQorICogQHBhcmFtIGRpc3BhdGNoIGRpc3BhdGNoIG5ldyBtZXNzYWdlcyBvciBsZWF2ZSB0aGVtIG9uIHRoZSBpbmNvbWluZyBxdWV1ZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBkaXNwYXRjaCkKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIGRzdGF0dXM7CisgIGRidXNfYm9vbF90IHByb2dyZXNzX3Bvc3NpYmxlOworCisgIC8qIE5lZWQgdG8gZ3JhYiBhIHJlZiBoZXJlIGluIGNhc2Ugd2UncmUgYSBwcml2YXRlIGNvbm5lY3Rpb24gYW5kCisgICAqIHRoZSB1c2VyIGRyb3BzIHRoZSBsYXN0IHJlZiBpbiBhIGhhbmRsZXIgd2UgY2FsbDsgc2VlIGJ1ZyAKKyAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MzUKKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICBkc3RhdHVzID0gZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pOworCisgIGlmIChkaXNwYXRjaCAmJiBkc3RhdHVzID09IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkb2luZyBkaXNwYXRjaFxuIik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGVsc2UgaWYgKGRzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgicGF1c2luZyBmb3IgbWVtb3J5XG4iKTsKKyAgICAgIF9kYnVzX21lbW9yeV9wYXVzZV9iYXNlZF9vbl90aW1lb3V0ICh0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBpZiAoX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkb2luZyBpdGVyYXRpb25cbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAvKiBJZiB3ZSBjYW4gZGlzcGF0Y2gsIHdlIGNhbiBtYWtlIHByb2dyZXNzIHVudGlsIHRoZSBEaXNjb25uZWN0ZWQgbWVzc2FnZQorICAgKiBoYXMgYmVlbiBwcm9jZXNzZWQ7IGlmIHdlIGNhbiBvbmx5IHJlYWQvd3JpdGUsIHdlIGNhbiBtYWtlIHByb2dyZXNzCisgICAqIGFzIGxvbmcgYXMgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKi8KKyAgaWYgKGRpc3BhdGNoKQorICAgIHByb2dyZXNzX3Bvc3NpYmxlID0gY29ubmVjdGlvbi0+bl9pbmNvbWluZyAhPSAwIHx8CisgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayAhPSBOVUxMOworICBlbHNlCisgICAgcHJvZ3Jlc3NfcG9zc2libGUgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBwcm9ncmVzc19wb3NzaWJsZTsgLyogVFJVRSBpZiB3ZSBjYW4gbWFrZSBtb3JlIHByb2dyZXNzICovCit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50CisgKiB0byB3cml0ZSBhIG1haW4gbG9vcCBhbmQgZGVhbCB3aXRoICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dC4gQW4KKyAqIGV4YW1wbGUgdXNhZ2Ugd291bGQgYmU6CisgKiAKKyAqIEBjb2RlCisgKiAgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoY29ubmVjdGlvbiwgLTEpKQorICogICAgIDsgLy8gZW1wdHkgbG9vcCBib2R5CisgKiBAZW5kY29kZQorICogCisgKiBJbiB0aGlzIHVzYWdlIHlvdSB3b3VsZCBub3JtYWxseSBoYXZlIHNldCB1cCBhIGZpbHRlciBmdW5jdGlvbiB0byBsb29rCisgKiBhdCBlYWNoIG1lc3NhZ2UgYXMgaXQgaXMgZGlzcGF0Y2hlZC4gVGhlIGxvb3AgdGVybWluYXRlcyB3aGVuIHRoZSBsYXN0CisgKiBtZXNzYWdlIGZyb20gdGhlIGNvbm5lY3Rpb24gKHRoZSBkaXNjb25uZWN0ZWQgc2lnbmFsKSBpcyBwcm9jZXNzZWQuCisgKiAKKyAqIElmIHRoZXJlIGFyZSBtZXNzYWdlcyB0byBkaXNwYXRjaCwgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBvbmNlLCBhbmQgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbm8KKyAqIG1lc3NhZ2VzIHRvIGRpc3BhdGNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgaXQgY2FuIHJlYWQgb3IKKyAqIHdyaXRlLCB0aGVuIHJlYWQgb3Igd3JpdGUsIHRoZW4gcmV0dXJuLgorICoKKyAqIFRoZSB3YXkgdG8gdGhpbmsgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGl0IGVpdGhlciBtYWtlcyBzb21lIHNvcnQKKyAqIG9mIHByb2dyZXNzLCBvciBpdCBibG9ja3MuIE5vdGUgdGhhdCwgd2hpbGUgaXQgaXMgYmxvY2tlZCBvbiBJL08sIGl0CisgKiBjYW5ub3QgYmUgaW50ZXJydXB0ZWQgKGV2ZW4gYnkgb3RoZXIgdGhyZWFkcyksIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24KKyAqIHVuc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG1vcmUgdGhhbiBqdXN0IHJlYWN0IHRvIHJlY2VpdmVkCisgKiBtZXNzYWdlcy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgaGFzIGJlZW4KKyAqIHByb2Nlc3NlZCwgTk9UIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGVkLiBUaGlzIGlzCisgKiBpbXBvcnRhbnQgYmVjYXVzZSBldmVuIGFmdGVyIGRpc2Nvbm5lY3RpbmcsIHlvdSB3YW50IHRvIHByb2Nlc3MgYW55CisgKiBtZXNzYWdlcyB5b3UgcmVjZWl2ZWQgcHJpb3IgdG8gdGhlIGRpc2Nvbm5lY3QuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXggdGltZSB0byBibG9jayBvciAtMSBmb3IgaW5maW5pdGUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lb3V0X21pbGxpc2Vjb25kcyA+PSAwIHx8IHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xLCBGQUxTRSk7CisgICByZXR1cm4gX2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKGNvbm5lY3Rpb24sIHRpbWVvdXRfbWlsbGlzZWNvbmRzLCBUUlVFKTsKK30KKworLyoqIAorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCB0bworICogd3JpdGUgYSBtYWluIGxvb3AgYW5kIGRlYWwgd2l0aCAjREJ1c1dhdGNoIGFuZCAjREJ1c1RpbWVvdXQuIFNlZSBhbHNvCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpLgorICogCisgKiBBcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBpdCBjYW4KKyAqIHJlYWQgb3Igd3JpdGUsIHRoZW4gcmVhZCBvciB3cml0ZSwgdGhlbiByZXR1cm4gI1RSVUUuCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciByZWFkaW5nIG9yIHdyaXRpbmcgaXMgc3RpbGwKKyAqIHBvc3NpYmxlLCBpLmUuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGVkLgorICoKKyAqIE5vdGUgdGhhdCBldmVuIGFmdGVyIGRpc2Nvbm5lY3Rpb24sIG1lc3NhZ2VzIG1heSByZW1haW4gaW4gdGhlCisgKiBpbmNvbWluZyBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUKKyAqIHByb2Nlc3NlZC4gZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBkaXNwYXRjaGVzCisgKiBpbmNvbWluZyBtZXNzYWdlcyBmb3IgeW91OyB3aXRoIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlKCkgeW91CisgKiBoYXZlIHRvIGFycmFuZ2UgdG8gZHJhaW4gdGhlIGluY29taW5nIHF1ZXVlIHlvdXJzZWxmLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiAKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXggdGltZSB0byBibG9jayBvciAtMSBmb3IgaW5maW5pdGUgCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzdGlsbCBjb25uZWN0ZWQKKyAqLworZGJ1c19ib29sX3QgCitkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykgCit7IAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIEZBTFNFKTsKKyAgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goY29ubmVjdGlvbiwgdGltZW91dF9taWxsaXNlY29uZHMsIEZBTFNFKTsKK30KKworLyogV2UgbmVlZCB0byBjYWxsIHRoaXMgYW55dGltZSB3ZSBwb3AgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLCBhbmQgdGhlbgorICogdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlcndhcmQKKyAqIHdoaWNoIHdpbGwgInByb2Nlc3MiIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZSBhbmQgc2V0CisgKiBkaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpoZWFkX29mX3F1ZXVlKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIGNoZWNraW5nIHRoYXQgdGhlIGxpbmsgaXMgTlVMTCBpcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGlzX3NpZ25hbCBjYWxsICovCisgIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayA9PSBOVUxMICYmCisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChoZWFkX29mX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCA9IFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0LXJlY2VpdmVkIG1lc3NhZ2UgZnJvbSB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIGxlYXZpbmcgaXQgaW4gdGhlIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJldHVybnMgI05VTEwuCisgKiAKKyAqIFRoZSBjYWxsZXIgZG9lcyBub3Qgb3duIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZCBtZXNzYWdlLCBhbmQKKyAqIG11c3QgZWl0aGVyIHJldHVybiBpdCB1c2luZyBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UoKSBvcgorICoga2VlcCBpdCBhZnRlciBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9zdGVhbF9ib3Jyb3dlZF9tZXNzYWdlKCkuIE5vCisgKiBvbmUgY2FuIGdldCBhdCB0aGUgbWVzc2FnZSB3aGlsZSBpdHMgYm9ycm93ZWQsIHNvIHJldHVybiBpdCBhcworICogcXVpY2tseSBhcyBwb3NzaWJsZSBhbmQgZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byBpdCBhZnRlcgorICogcmV0dXJuaW5nIGl0LiBJZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBtZXNzYWdlLCBtYWtlIGEgY29weSBvZiBpdC4KKyAqCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSB3aWxsIGJsb2NrIGlmIGNhbGxlZCB3aGlsZSBhIGJvcnJvd2VkCisgKiBtZXNzYWdlIGlzIG91dHN0YW5kaW5nOyBvbmx5IG9uZSBwaWVjZSBvZiBjb2RlIGNhbiBiZSBwbGF5aW5nIHdpdGgKKyAqIHRoZSBpbmNvbWluZyBxdWV1ZSBhdCBhIHRpbWUuIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayBpZiBjYWxsZWQKKyAqIGR1cmluZyBhIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgbmV4dCBtZXNzYWdlIGluIHRoZSBpbmNvbWluZyBxdWV1ZS4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIC8qIHRoaXMgaXMgY2FsbGVkIGZvciB0aGUgc2lkZSBlZmZlY3QgdGhhdCBpdCBxdWV1ZXMKKyAgICogdXAgYW55IG1lc3NhZ2VzIGZyb20gdGhlIHRyYW5zcG9ydAorICAgKi8KKyAgc3RhdHVzID0gZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pOworICBpZiAoc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHJldHVybiBOVUxMOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIC8qIFdoaWxlIGEgbWVzc2FnZSBpcyBvdXRzdGFuZGluZywgdGhlIGRpc3BhdGNoIGxvY2sgaXMgaGVsZCAqLworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPT0gTlVMTCk7CisKKyAgY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworICAKKyAgbWVzc2FnZSA9IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQ7CisKKyAgY2hlY2tfZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZF91bmxvY2tlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIAorICAvKiBOb3RlIHRoYXQgd2UgS0VFUCB0aGUgZGlzcGF0Y2ggbG9jayB1bnRpbCB0aGUgbWVzc2FnZSBpcyByZXR1cm5lZCAqLworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsICJkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UiKTsKKworICAvKiBXZSBkb24ndCB1cGRhdGUgZGlzcGF0Y2ggc3RhdHVzIHVudGlsIGl0J3MgcmV0dXJuZWQgb3Igc3RvbGVuICovCisgIAorICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBVc2VkIHRvIHJldHVybiBhIG1lc3NhZ2UgYWZ0ZXIgcGVla2luZyBhdCBpdCB1c2luZworICogZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkuIE9ubHkgY2FsbGVkIGlmCisgKiBtZXNzYWdlIGZyb20gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkgd2FzIG5vbi0jTlVMTC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCURCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICAKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgPT0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCk7CisgIAorICBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID0gTlVMTDsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOyAKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZSwgLTEsIC0xLCAiZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlIik7Cit9CisKKy8qKgorICogVXNlZCB0byBrZWVwIGEgbWVzc2FnZSBhZnRlciBwZWVraW5nIGF0IGl0IHVzaW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKS4gQmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHNlZQorICogdGhlIGNhdmVhdHMvd2FybmluZ3MgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCURCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqcG9wX21lc3NhZ2U7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKworICBwb3BfbWVzc2FnZSA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgPT0gcG9wX21lc3NhZ2UpOworICAodm9pZCkgcG9wX21lc3NhZ2U7IC8qIHVudXNlZCB1bmxlc3MgYXNzZXJ0aW5nICovCisKKyAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyAtPSAxOworIAorICBfZGJ1c192ZXJib3NlICgiSW5jb21pbmcgbWVzc2FnZSAlcCBzdG9sZW4gZnJvbSBxdWV1ZSwgJWQgaW5jb21pbmdcbiIsCisJCSBtZXNzYWdlLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKyAKKyAgY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9IE5VTEw7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwKKyAgICAgICJkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSIpOworfQorCisvKiBTZWUgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlLCBidXQgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBvd24KKyAqIHRoZSBsb2NrIGJlZm9yZSBjYWxsaW5nLiBNYXkgZHJvcCB0aGUgbG9jayB3aGlsZSBydW5uaW5nLgorICovCitzdGF0aWMgREJ1c0xpc3QqCitfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID09IE5VTEwpOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPm5faW5jb21pbmcgPiAwKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKyAgICAgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgLT0gMTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzIHNpZzonJXMnIHNlcmlhbDoldSkgcmVtb3ZlZCBmcm9tIGluY29taW5nIHF1ZXVlICVwLCAlZCBpbmNvbWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGxpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobGluay0+ZGF0YSkpLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChsaW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGxpbmstPmRhdGEpIDoKKyAgICAgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChsaW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobGluay0+ZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGxpbmstPmRhdGEpIDoKKyAgICAgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGxpbmstPmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKGxpbmstPmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChsaW5rLT5kYXRhLCAtMSwgLTEsCisgICAgICAgICAgIl9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCIpOworCisgICAgICBjaGVja19kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkX3VubG9ja2VkIChjb25uZWN0aW9uLCBsaW5rLT5kYXRhKTsKKyAgICAgIAorICAgICAgcmV0dXJuIGxpbms7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNlZSBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UsIGJ1dCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG93bgorICogdGhlIGxvY2sgYmVmb3JlIGNhbGxpbmcuIE1heSBkcm9wIHRoZSBsb2NrIHdoaWxlIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK19kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IF9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgaWYgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgIAorICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3B1dGJhY2tfbWVzc2FnZV9saW5rX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICptZXNzYWdlX2xpbmspCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfbGluayAhPSBOVUxMKTsKKyAgLyogWW91IGNhbid0IGJvcnJvdyBhIG1lc3NhZ2Ugd2hpbGUgYSBsaW5rIGlzIG91dHN0YW5kaW5nICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9PSBOVUxMKTsKKyAgLyogV2UgaGFkIHRvIGhhdmUgdGhlIGRpc3BhdGNoIGxvY2sgYWNyb3NzIHRoZSBwb3AvcHV0YmFjayAqLworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKTsKKworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9saW5rKTsKKyAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyArPSAxOworCisgIF9kYnVzX3ZlcmJvc2UgKCJNZXNzYWdlICVwICglcyAlcyAlcyAnJXMnKSBwdXQgYmFjayBpbnRvIHF1ZXVlICVwLCAlZCBpbmNvbWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZV9saW5rLT5kYXRhLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZV9saW5rLT5kYXRhKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlX2xpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2VfbGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2VfbGluay0+ZGF0YSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZV9saW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZV9saW5rLT5kYXRhKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2VfbGluay0+ZGF0YSwgLTEsIC0xLAorICAgICAgIl9kYnVzX2Nvbm5lY3Rpb25fcHV0YmFja19tZXNzYWdlX2xpbmtfdW5sb2NrZWQiKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBmaXJzdC1yZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUsCisgKiByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZS4gVGhlIGNhbGxlciBvd25zIGEgcmVmZXJlbmNlIHRvIHRoZQorICogcmV0dXJuZWQgbWVzc2FnZS4gSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm5zICNOVUxMLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgYW55IG1lc3NhZ2UgaGFuZGxlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCwKKyAqIGFuZCBzbyB1c2luZyBpdCBpcyB1c3VhbGx5IHdyb25nLiBJbnN0ZWFkLCBsZXQgdGhlIG1haW4gbG9vcCBpbnZva2UKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpLiBQb3BwaW5nIG1lc3NhZ2VzIG1hbnVhbGx5IGlzIG9ubHkKKyAqIHVzZWZ1bCBpbiB2ZXJ5IHNpbXBsZSBwcm9ncmFtcyB0aGF0IGRvbid0IHNoYXJlIGEgI0RCdXNDb25uZWN0aW9uCisgKiB3aXRoIGFueSBsaWJyYXJpZXMgb3Igb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBUaGVyZSBpcyBhIGxvY2sgdGhhdCBjb3ZlcnMgYWxsIHdheXMgb2YgYWNjZXNzaW5nIHRoZSBpbmNvbWluZyBtZXNzYWdlCisgKiBxdWV1ZSwgc28gZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCksIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSgpLAorICogZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCksIGV0Yy4gd2lsbCBhbGwgYmxvY2sgd2hpbGUgb25lIG9mIHRoZSBvdGhlcnMKKyAqIGluIHRoZSBncm91cCBpcyBydW5uaW5nLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIG5leHQgbWVzc2FnZSBpbiB0aGUgaW5jb21pbmcgcXVldWUuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIC8qIHRoaXMgaXMgY2FsbGVkIGZvciB0aGUgc2lkZSBlZmZlY3QgdGhhdCBpdCBxdWV1ZXMKKyAgICogdXAgYW55IG1lc3NhZ2VzIGZyb20gdGhlIHRyYW5zcG9ydAorICAgKi8KKyAgc3RhdHVzID0gZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pOworICBpZiAoc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHJldHVybiBOVUxMOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIG1lc3NhZ2UgPSBfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiUmV0dXJuaW5nIHBvcHBlZCBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsgICAgCisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIEFjcXVpcmUgdGhlIGRpc3BhdGNoZXIuIFRoaXMgaXMgYSBzZXBhcmF0ZSBsb2NrIHNvIHRoZSBtYWluCisgKiBjb25uZWN0aW9uIGxvY2sgY2FuIGJlIGRyb3BwZWQgdG8gY2FsbCBvdXQgdG8gYXBwbGljYXRpb24gZGlzcGF0Y2gKKyAqIGhhbmRsZXJzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NraW5nIGRpc3BhdGNoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X2xvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKworICB3aGlsZSAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIndhaXRpbmcgZm9yIGRpc3BhdGNoIHRvIGJlIGFjcXVpcmFibGVcbiIpOworICAgICAgX2RidXNfY29uZHZhcl93YWl0IChjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAgIH0KKyAgCisgIF9kYnVzX2Fzc2VydCAoIWNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKTsKKworICBjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCA9IFRSVUU7CisKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja2luZyBkaXNwYXRjaF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIGRpc3BhdGNoZXIgd2hlbiB5b3UncmUgZG9uZSB3aXRoIGl0LiBPbmx5IGNhbGwKKyAqIGFmdGVyIHlvdSd2ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlci4gV2FrZXMgdXAgYXQgbW9zdCBvbmUKKyAqIHRocmVhZCBjdXJyZW50bHkgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBkaXNwYXRjaGVyLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NraW5nIGRpc3BhdGNoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X2xvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworCisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkID0gRkFMU0U7CisgIF9kYnVzX2NvbmR2YXJfd2FrZV9vbmUgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfdW5sb2NrIChjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2ZhaWxlZF9wb3AgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICBEQnVzTGlzdCAgICAgICAqbWVzc2FnZV9saW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLAorCQkJICAgbWVzc2FnZV9saW5rKTsKKyAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyArPSAxOworfQorCisvKiBOb3RlIHRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBzaW5jZSB3ZSBkb24ndCB0cmFjayB3aGV0aGVyIHdlIGFscmVhZHkgZGlkIGl0ICovCitzdGF0aWMgdm9pZAorbm90aWZ5X2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgLyogU2V0IHRoZSB3ZWFrcmVmIGluIGRidXMtYnVzLmMgdG8gTlVMTCwgc28gbm9ib2R5IHdpbGwgZ2V0IGEgZGlzY29ubmVjdGVkCisgICAqIGNvbm5lY3Rpb24gZnJvbSBkYnVzX2J1c19nZXQoKS4gV2UgbWFrZSB0aGUgc2FtZSBndWFyYW50ZWUgZm9yCisgICAqIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgYnV0IGluIGEgZGlmZmVyZW50IHdheSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCisgICAqIHVucmVmIHJpZ2h0IGhlcmU7IHdlIGluc3RlYWQgY2hlY2sgZm9yIGNvbm5lY3RlZG5lc3MgYmVmb3JlIHJldHVybmluZworICAgKiB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBoYXNoLgorICAgKi8KKyAgX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIER1bXAgdGhlIG91dGdvaW5nIHF1ZXVlLCB3ZSBhcmVuJ3QgZ29pbmcgdG8gYmUgYWJsZSB0bworICAgKiBzZW5kIGl0IG5vdywgYW5kIHdlJ2QgbGlrZSBhY2Nlc3NvcnMgbGlrZQorICAgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUoKSB0byBiZSBhY2N1cmF0ZS4KKyAgICovCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkRyb3BwaW5nICVkIG91dGdvaW5nIG1lc3NhZ2VzIHNpbmNlIHdlJ3JlIGRpc2Nvbm5lY3RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworICAgICAgCisgICAgICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcykpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGxpbmstPmRhdGEpOworICAgICAgICB9CisgICAgfSAKK30KKworLyogTm90ZSB0aGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgc2luY2Ugd2UgZG9uJ3QgdHJhY2sgd2hldGhlciB3ZSBhbHJlYWR5IGRpZCBpdCAqLworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cworbm90aWZ5X2Rpc2Nvbm5lY3RlZF9hbmRfZGlzcGF0Y2hfY29tcGxldGVfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZGlzY29ubmVjdCBtZXNzYWdlXG4iKTsKKyAgICAgIAorICAgICAgLyogSWYgd2UgaGF2ZSBwZW5kaW5nIGNhbGxzLCBxdWV1ZSB0aGVpciB0aW1lb3V0cyAtIHdlIHdhbnQgdGhlIERpc2Nvbm5lY3RlZAorICAgICAgICogdG8gYmUgdGhlIGxhc3QgbWVzc2FnZSwgYWZ0ZXIgdGhlc2UgdGltZW91dHMuCisgICAgICAgKi8KKyAgICAgIGNvbm5lY3Rpb25fdGltZW91dF9hbmRfY29tcGxldGVfYWxsX3BlbmRpbmdfY2FsbHNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICAvKiBXZSBoYXZlbid0IHNlbnQgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBhbHJlYWR5LAorICAgICAgICogYW5kIGFsbCByZWFsIG1lc3NhZ2VzIGhhdmUgYmVlbiBxdWV1ZWQgdXAuCisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rKTsKKyAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID0gTlVMTDsKKworICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TOworICAgIH0KKworICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsKK30KKworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cworX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5uX2luY29taW5nID4gMCkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgIGVsc2UgaWYgKCFfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICAgICAgZGJ1c19ib29sX3QgaXNfY29ubmVjdGVkOworICAgICAgCisgICAgICBzdGF0dXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgICAgIGlzX2Nvbm5lY3RlZCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZGlzcGF0Y2ggc3RhdHVzID0gJXMgaXNfY29ubmVjdGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBESVNQQVRDSF9TVEFUVVNfTkFNRSAoc3RhdHVzKSwgaXNfY29ubmVjdGVkKTsKKyAgICAgIAorICAgICAgaWYgKCFpc19jb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJdCdzIHBvc3NpYmxlIHRoaXMgd291bGQgYmUgYmV0dGVyIGRvbmUgYnkgaGF2aW5nIGFuIGV4cGxpY2l0CisgICAgICAgICAgICogbm90aWZpY2F0aW9uIGZyb20gX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QoKSB0aGF0IHdvdWxkCisgICAgICAgICAgICogc3luY2hyb25vdXNseSBkbyB0aGlzLCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGRpc3BhdGNoCisgICAgICAgICAgICogc3RhdHVzIGNoZWNrLiBIb3dldmVyLCBwcm9iYWJseSBub3QgZ29vZCB0byBjaGFuZ2UgdW50aWwgaXQgY2F1c2VzCisgICAgICAgICAgICogYSBwcm9ibGVtLgorICAgICAgICAgICAqLworICAgICAgICAgIG5vdGlmeV9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgICAgICAgICAgLyogSSdtIG5vdCBzdXJlIHRoaXMgaXMgbmVlZGVkOyB0aGUgaWRlYSBpcyB0aGF0IHdlIHdhbnQgdG8KKyAgICAgICAgICAgKiBxdWV1ZSB0aGUgRGlzY29ubmVjdGVkIG9ubHkgYWZ0ZXIgd2UndmUgcmVhZCBhbGwgdGhlCisgICAgICAgICAgICogbWVzc2FnZXMsIGJ1dCBpZiB3ZSdyZSBkaXNjb25uZWN0ZWQgbWF5YmUgd2UgYXJlIGd1YXJhbnRlZWQKKyAgICAgICAgICAgKiB0byBoYXZlIHJlYWQgdGhlbSBhbGwgPworICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICAgICAgICAgIHN0YXR1cyA9IG5vdGlmeV9kaXNjb25uZWN0ZWRfYW5kX2Rpc3BhdGNoX2NvbXBsZXRlX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICBlbHNlIGlmIChjb25uZWN0aW9uLT5uX2luY29taW5nID4gMCkKKyAgICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIG5ld19zdGF0dXMpCit7CisgIGRidXNfYm9vbF90IGNoYW5nZWQ7CisgIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uIGZ1bmN0aW9uOworICB2b2lkICpkYXRhOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIGNoYW5nZWQgPSBuZXdfc3RhdHVzICE9IGNvbm5lY3Rpb24tPmxhc3RfZGlzcGF0Y2hfc3RhdHVzOworCisgIGNvbm5lY3Rpb24tPmxhc3RfZGlzcGF0Y2hfc3RhdHVzID0gbmV3X3N0YXR1czsKKworICBmdW5jdGlvbiA9IGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbjsKKyAgZGF0YSA9IGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19kYXRhOworCisgIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkICYmCisgICAgICAhY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfcHJvY2Vzc2VkKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCA9IFRSVUU7CisgICAgICAKKyAgICAgIC8qIHRoaXMgZG9lcyBhbiB1bnJlZiwgYnV0IHdlIGhhdmUgYSByZWYKKyAgICAgICAqIHNvIHdlIHNob3VsZCBub3QgcnVuIHRoZSBmaW5hbGl6ZXIgaGVyZQorICAgICAgICogaW5zaWRlIHRoZSBsb2NrLgorICAgICAgICovCisgICAgICBjb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoY29ubmVjdGlvbi0+ZXhpdF9vbl9kaXNjb25uZWN0KQorICAgICAgICB7CisgICAgICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOyAgICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFeGl0aW5nIG9uIERpc2Nvbm5lY3RlZCBzaWduYWxcbiIpOworICAgICAgICAgIGlmIChyYWlzZSAoU0lHVEVSTSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byByYWlzZSBhIFNJR1RFUk0gc2lnbmFsLiBFeGl0aW5nXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfZXhpdCAoMSk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNhbGwgdG8gZXhpdCgpIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAKKyAgLyogV2UgZHJvcCB0aGUgbG9jayAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY2hhbmdlZCAmJiBmdW5jdGlvbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90aWZ5aW5nIG9mIGNoYW5nZSB0byBkaXNwYXRjaCBzdGF0dXMgb2YgJXAgbm93ICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgRElTUEFUQ0hfU1RBVFVTX05BTUUgKG5ld19zdGF0dXMpKTsKKyAgICAgICgqIGZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgbmV3X3N0YXR1cywgZGF0YSk7ICAgICAgCisgICAgfQorICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICogI0RCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TIGluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIHF1ZXVlCisgKiBtYXkgY29udGFpbiBtZXNzYWdlcy4gI0RCVVNfRElTUEFUQ0hfQ09NUExFVEUgaW5kaWNhdGVzIHRoYXQgdGhlCisgKiBpbmNvbWluZyBxdWV1ZSBpcyBlbXB0eS4gI0RCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkgaW5kaWNhdGVzIHRoYXQKKyAqIHRoZXJlIGNvdWxkIGJlIGRhdGEsIGJ1dCB3ZSBjYW4ndCBrbm93IGZvciBzdXJlIHdpdGhvdXQgbW9yZQorICogbWVtb3J5LgorICoKKyAqIFRvIHByb2Nlc3MgdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUsIHVzZSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKQorICogb3IgKGluIHJhcmUgY2FzZXMpIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSgpLgorICoKKyAqIE5vdGUsICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyByZWFsbHkgbWVhbnMgdGhhdCBlaXRoZXIgd2UKKyAqIGhhdmUgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLCBvciB3ZSBoYXZlIHJhdyBieXRlcyBidWZmZXJlZCB1cAorICogdGhhdCBuZWVkIHRvIGJlIHBhcnNlZC4gV2hlbiB0aGVzZSBieXRlcyBhcmUgcGFyc2VkLCB0aGV5CisgKiBtYXkgbm90IGFkZCB1cCB0byBhbiBlbnRpcmUgbWVzc2FnZS4gVGh1cywgaXQncyBwb3NzaWJsZQorICogdG8gc2VlIGEgc3RhdHVzIG9mICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyBidXQgbm90CisgKiBoYXZlIGEgbWVzc2FnZSB5ZXQuCisgKgorICogSW4gcGFydGljdWxhciB0aGlzIGhhcHBlbnMgb24gaW5pdGlhbCBjb25uZWN0aW9uLCBiZWNhdXNlIGFsbCBzb3J0cworICogb2YgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgc3R1ZmYgaGFzIHRvIGJlIHBhcnNlZCBiZWZvcmUgdGhlCisgKiBmaXJzdCBtZXNzYWdlIGFycml2ZXMuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgY3VycmVudCBkaXNwYXRjaCBzdGF0dXMKKyAqLworREJ1c0Rpc3BhdGNoU3RhdHVzCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfRElTUEFUQ0hfQ09NUExFVEUpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBGaWx0ZXIgZnVudGlvbiBmb3IgaGFuZGxpbmcgdGhlIFBlZXIgc3RhbmRhcmQgaW50ZXJmYWNlLgorICovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK19kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXJfdW5sb2NrZWRfbm9fdXBkYXRlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgZGJ1c19ib29sX3Qgc2VudCA9IEZBTFNFOworICBEQnVzTWVzc2FnZSAqcmV0ID0gTlVMTDsKKyAgREJ1c0xpc3QgKmV4cGlyZV9saW5rOworCisgIGlmIChjb25uZWN0aW9uLT5yb3V0ZV9wZWVyX21lc3NhZ2VzICYmIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBtZWFucyB3ZSdyZSBsZXR0aW5nIHRoZSBidXMgcm91dGUgdGhpcyBtZXNzYWdlICovCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19pbnRlcmZhY2UgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX1BFRVIpKQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgLyogUHJlYWxsb2NhdGUgYSBsaW5rZWQtbGlzdCBsaW5rLCBzbyB0aGF0IGlmIHdlIG5lZWQgdG8gZGlzcG9zZSBvZiBhCisgICAqIG1lc3NhZ2UsIHdlIGNhbiBhdHRhY2ggaXQgdG8gdGhlIGV4cGlyZWQgbGlzdCAqLworICBleHBpcmVfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoTlVMTCk7CisKKyAgaWYgKCFleHBpcmVfbGluaykKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGluZyIpKQorICAgIHsKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBzZW50ID0gX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcmV0LCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNYWNoaW5lSWQiKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHV1aWQ7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKCZ1dWlkLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisKKyAgICAgICAgICByZXQgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworCisgICAgICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdXVpZCk7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlbnQgPSBfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCByZXQsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICBzZW50ID0gX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gYm91bmNlIGFueXRoaW5nIGVsc2Ugd2l0aCB0aGlzIGludGVyZmFjZSwgb3RoZXJ3aXNlIGFwcHMKKyAgICAgICAqIGNvdWxkIHN0YXJ0IGV4dGVuZGluZyB0aGUgaW50ZXJmYWNlIGFuZCB3aGVuIHdlIGFkZGVkIGV4dGVuc2lvbnMKKyAgICAgICAqIGhlcmUgdG8gREJ1c0Nvbm5lY3Rpb24gd2UnZCBicmVhayB0aG9zZSBhcHBzLgorICAgICAgICovCisgICAgICByZXQgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIG1ldGhvZCBpbnZva2VkIG9uIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlIik7CisgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBzZW50ID0gX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcmV0LCBOVUxMKTsKKyAgICB9CisKK291dDoKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChleHBpcmVfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSXQnbGwgYmUgc2FmZSB0byB1bnJlZiB0aGUgcmVwbHkgd2hlbiB3ZSB1bmxvY2sgKi8KKyAgICAgIGV4cGlyZV9saW5rLT5kYXRhID0gcmV0OworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzLCBleHBpcmVfbGluayk7CisgICAgfQorCisgIGlmICghc2VudCkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKioKKyogUHJvY2Vzc2VzIGFsbCBidWlsdGluIGZpbHRlciBmdW5jdGlvbnMKKyoKKyogSWYgdGhlIHNwZWMgc3BlY2lmaWVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlCisqIHRoZXkgc2hvdWxkIGJlIHByb2Nlc3NlZCBmcm9tIHRoaXMgbWV0aG9kCisqKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzX3VubG9ja2VkX25vX3VwZGF0ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICAvKiBXZSBqdXN0IHJ1biBvbmUgZmlsdGVyIGZvciBub3cgYnV0IGhhdmUgdGhlIG9wdGlvbiB0byBydW4gbW9yZQorICAgICBpZiB0aGUgc3BlYyBjYWxscyBmb3IgaXQgaW4gdGhlIGZ1dHVyZSAqLworCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIGFueSBpbmNvbWluZyBkYXRhLgorICoKKyAqIElmIHRoZXJlJ3MgaW5jb21pbmcgcmF3IGRhdGEgdGhhdCBoYXMgbm90IHlldCBiZWVuIHBhcnNlZCwgaXQgaXMKKyAqIHBhcnNlZCwgd2hpY2ggbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGFkZGluZyBtZXNzYWdlcyB0byB0aGUKKyAqIGluY29taW5nIHF1ZXVlLgorICoKKyAqIFRoZSBpbmNvbWluZyBkYXRhIGJ1ZmZlciBpcyBmaWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiByZWFkcyBmcm9tCisgKiBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgKHN1Y2ggYXMgYSBzb2NrZXQpLiAgUmVhZGluZyB1c3VhbGx5CisgKiBoYXBwZW5zIGluIGRidXNfd2F0Y2hfaGFuZGxlKCkgb3IgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKS4KKyAqIAorICogSWYgdGhlcmUgYXJlIGNvbXBsZXRlIG1lc3NhZ2VzIGluIHRoZSBpbmNvbWluZyBxdWV1ZSwKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHJlbW92ZXMgb25lIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgYW5kCisgKiBwcm9jZXNzZXMgaXQuIFByb2Nlc3NpbmcgaGFzIHRocmVlIHN0ZXBzLgorICoKKyAqIEZpcnN0LCBhbnkgbWV0aG9kIHJlcGxpZXMgYXJlIHBhc3NlZCB0byAjREJ1c1BlbmRpbmdDYWxsIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpIGluIG9yZGVyIHRvCisgKiBjb21wbGV0ZSB0aGUgcGVuZGluZyBtZXRob2QgY2FsbC4KKyAqIAorICogU2Vjb25kLCBhbnkgZmlsdGVycyByZWdpc3RlcmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIoKQorICogYXJlIHJ1bi4gSWYgYW55IGZpbHRlciByZXR1cm5zICNEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQKKyAqIHRoZW4gcHJvY2Vzc2luZyBzdG9wcyBhZnRlciB0aGF0IGZpbHRlci4KKyAqCisgKiBUaGlyZCwgaWYgdGhlIG1lc3NhZ2UgaXMgYSBtZXRob2QgY2FsbCBpdCBpcyBmb3J3YXJkZWQgdG8KKyAqIGFueSByZWdpc3RlcmVkIG9iamVjdCBwYXRoIGhhbmRsZXJzIGFkZGVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqCisgKiBBIHNpbmdsZSBjYWxsIHRvIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHdpbGwgcHJvY2VzcyBhdCBtb3N0CisgKiBvbmUgbWVzc2FnZTsgaXQgd2lsbCBub3QgY2xlYXIgdGhlIGVudGlyZSBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEJlIGNhcmVmdWwgYWJvdXQgY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBmcm9tIGluc2lkZSBhCisgKiBtZXNzYWdlIGhhbmRsZXIsIGkuZS4gY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKQorICogcmVjdXJzaXZlbHkuICBJZiB0aHJlYWRzIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgcmVjdXJzaXZlCisgKiBtdXRleCBmdW5jdGlvbiwgdGhlbiB0aGlzIHdpbGwgbm90IGRlYWRsb2NrOyBob3dldmVyLCBpdCBjYW4KKyAqIGNlcnRhaW5seSBjb25mdXNlIHlvdXIgYXBwbGljYXRpb24uCisgKiAKKyAqIEB0b2RvIHNvbWUgRklYTUUgaW4gaGVyZSBhYm91dCBoYW5kbGluZyBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyBkaXNwYXRjaCBzdGF0dXMsIHNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpCisgKi8KK0RCdXNEaXNwYXRjaFN0YXR1cworZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNMaXN0ICpsaW5rLCAqZmlsdGVyX2xpc3RfY29weSwgKm1lc3NhZ2VfbGluazsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfaW50MzJfdCByZXBseV9zZXJpYWw7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIGRidXNfYm9vbF90IGZvdW5kX29iamVjdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgREJVU19ESVNQQVRDSF9DT01QTEVURSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBpZiAoc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHsKKyAgICAgIC8qIHVubG9ja3MgYW5kIGNhbGxzIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgIAorICAvKiBXZSBuZWVkIHRvIHJlZiB0aGUgY29ubmVjdGlvbiBzaW5jZSB0aGUgY2FsbGJhY2sgY291bGQgcG90ZW50aWFsbHkKKyAgICogZHJvcCB0aGUgbGFzdCByZWYgdG8gaXQKKyAgICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2VfbGluayA9IF9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlX2xpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBhbm90aGVyIHRocmVhZCBkaXNwYXRjaGVkIG91ciBzdHVmZiAqLworCisgICAgICBfZGJ1c192ZXJib3NlICgiYW5vdGhlciB0aHJlYWQgZGlzcGF0Y2hlZCBtZXNzYWdlIChkdXJpbmcgYWNxdWlyZV9kaXNwYXRjaCBhYm92ZSlcbiIpOworICAgICAgCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgICAgICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIAorICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgbWVzc2FnZSA9IG1lc3NhZ2VfbGluay0+ZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiIGRpc3BhdGNoaW5nIG1lc3NhZ2UgJXAgKCVzICVzICVzICclcycpXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSk7CisKKyAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgIAorICAvKiBQZW5kaW5nIGNhbGwgaGFuZGxpbmcgbXVzdCBiZSBmaXJzdCwgYmVjYXVzZSBpZiB5b3UgZG8KKyAgICogZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSBvcgorICAgKiBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jaygpIHRoZW4gbm8gaGFuZGxlcnMvZmlsdGVycyB3aWxsIGJlIHJ1biBvbgorICAgKiB0aGUgcmVwbHkuIFdlIHdhbnQgY29uc2lzdGVudCBzZW1hbnRpY3MgaW4gdGhlIGNhc2Ugd2hlcmUgd2UKKyAgICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgdGhlIHJlcGx5LgorICAgKi8KKyAgCisgIHJlcGx5X3NlcmlhbCA9IGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgcGVuZGluZyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseV9zZXJpYWwpOworICBpZiAocGVuZGluZykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlzcGF0Y2hpbmcgYSBwZW5kaW5nIHJlcGx5XG4iKTsKKyAgICAgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCBtZXNzYWdlKTsKKyAgICAgIHBlbmRpbmcgPSBOVUxMOyAvKiBpdCdzIHByb2JhYmx5IHVucmVmJ2QgKi8KKyAgICAgIAorICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwZW5kaW5nIGNhbGwgY29tcGxldGVkIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXN1bHQgPSBfZGJ1c19jb25uZWN0aW9uX3J1bl9idWlsdGluX2ZpbHRlcnNfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgaWYgKHJlc3VsdCAhPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRCkKKyAgICBnb3RvIG91dDsKKyAKKyAgaWYgKCFfZGJ1c19saXN0X2NvcHkgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgJmZpbHRlcl9saXN0X2NvcHkpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgICAgICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBfZGJ1c19jb25uZWN0aW9uX2ZhaWxlZF9wb3AgKGNvbm5lY3Rpb24sIG1lc3NhZ2VfbGluayk7CisKKyAgICAgIC8qIHVubG9ja3MgYW5kIGNhbGxzIHVzZXIgY29kZSAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgICB9CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZmaWx0ZXJfbGlzdF9jb3B5LAorCQkgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbilfZGJ1c19tZXNzYWdlX2ZpbHRlcl9yZWYsCisJCSAgICAgIE5VTEwpOworCisgIC8qIFdlJ3JlIHN0aWxsIHByb3RlY3RlZCBmcm9tIGRpc3BhdGNoKCkgcmVlbnRyYW5jeSBoZXJlCisgICAqIHNpbmNlIHdlIGFjcXVpcmVkIHRoZSBkaXNwYXRjaGVyCisgICAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmZpbHRlcl9saXN0X2NvcHkpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXIgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZmaWx0ZXJfbGlzdF9jb3B5LCBsaW5rKTsKKworICAgICAgaWYgKGZpbHRlci0+ZnVuY3Rpb24gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIGZpbHRlciB3YXMgcmVtb3ZlZCBpbiBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4iKTsKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiICBydW5uaW5nIGZpbHRlciBvbiBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKyAgICAgIHJlc3VsdCA9ICgqIGZpbHRlci0+ZnVuY3Rpb24pIChjb25uZWN0aW9uLCBtZXNzYWdlLCBmaWx0ZXItPnVzZXJfZGF0YSk7CisKKyAgICAgIGlmIChyZXN1bHQgIT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisJYnJlYWs7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZmaWx0ZXJfbGlzdF9jb3B5LAorCQkgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbilfZGJ1c19tZXNzYWdlX2ZpbHRlcl91bnJlZiwKKwkJICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZmaWx0ZXJfbGlzdF9jb3B5KTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnlcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmaWx0ZXIgaGFuZGxlZCBtZXNzYWdlIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBXZSdyZSBzdGlsbCBwcm90ZWN0ZWQgZnJvbSBkaXNwYXRjaCgpIHJlZW50cmFuY3kgaGVyZQorICAgKiBzaW5jZSB3ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlcgorICAgKi8KKyAgX2RidXNfdmVyYm9zZSAoIiAgcnVubmluZyBvYmplY3QgcGF0aCBkaXNwYXRjaCBvbiBtZXNzYWdlICVwICglcyAlcyAlcyAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkpOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJlc3VsdCA9IF9kYnVzX29iamVjdF90cmVlX2Rpc3BhdGNoX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24tPm9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZF9vYmplY3QpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJvYmplY3QgdHJlZSBoYW5kbGVkIG1lc3NhZ2UgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKyAgICAgIERCdXNMaXN0ICpleHBpcmVfbGluazsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc2VuZGluZyBlcnJvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSBmb3IgZXJyb3Igc3RyaW5nIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIFwiJXNcIiB3aXRoIHNpZ25hdHVyZSBcIiVzXCIgb24gaW50ZXJmYWNlIFwiJXNcIiBkb2Vzbid0IGV4aXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHN0cmluZyBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9vYmplY3QgPyBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EIDogREJVU19FUlJPUl9VTktOT1dOX09CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciByZXBseSBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZXhwaXJlX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHJlcGx5KTsKKworICAgICAgaWYgKGV4cGlyZV9saW5rID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHNlbmQgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgICAgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChleHBpcmVfbGluayk7CisgICAgICAgICAgLyogSXQncyBPSyB0aGF0IHRoaXMgaXMgZmluYWxpemVkLCBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNlZW4gYnkKKyAgICAgICAgICAgKiBhbnl0aGluZyB0aGF0IGNvdWxkIGF0dGFjaCB1c2VyIGNhbGxiYWNrcyAqLworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSBmb3IgZXJyb3Igc2VuZCBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSwgTlVMTCk7CisgICAgICAvKiByZXBseSB3aWxsIGJlIGZyZWVkIHdoZW4gd2UgcmVsZWFzZSB0aGUgbG9jayAqLworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzLCBleHBpcmVfbGluayk7CisKKyAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiICBkb25lIGRpc3BhdGNoaW5nICVwICglcyAlcyAlcyAnJXMnKSBvbiBjb25uZWN0aW9uICVwXG4iLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgIAorIG91dDoKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgIAorICAgICAgLyogUHV0IG1lc3NhZ2UgYmFjaywgYW5kIHdlJ2xsIHN0YXJ0IG92ZXIuCisgICAgICAgKiBZZXMgdGhpcyBtZWFucyBoYW5kbGVycyBtdXN0IGJlIGlkZW1wb3RlbnQgaWYgdGhleQorICAgICAgICogZG9uJ3QgcmV0dXJuIEhBTkRMRUQ7IGMnZXN0IGxhIHZpZS4KKyAgICAgICAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9wdXRiYWNrX21lc3NhZ2VfbGlua191bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbGluayk7CisgICAgICAvKiBub3cgd2UgZG9uJ3Qgd2FudCB0byBmcmVlIHRoZW0gKi8KKyAgICAgIG1lc3NhZ2VfbGluayA9IE5VTEw7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIC4uLiBkb25lIGRpc3BhdGNoaW5nXG4iKTsKKyAgICB9CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGRvbid0IHdhbnQgdGhpcyBtZXNzYWdlIHRvIGNvdW50IGluIG1heGltdW0gbWVzc2FnZSBsaW1pdHMgd2hlbgorICAgICAgICogY29tcHV0aW5nIHRoZSBkaXNwYXRjaCBzdGF0dXMsIGJlbG93LiBXZSBoYXZlIHRvIGRyb3AgdGhlIGxvY2sKKyAgICAgICAqIHRlbXBvcmFyaWx5LCBiZWNhdXNlIGZpbmFsaXppbmcgYSBtZXNzYWdlIGNhbiB0cmlnZ2VyIGNhbGxiYWNrcy4KKyAgICAgICAqCisgICAgICAgKiBXZSBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uLCBhbmQgd2UgZG9uJ3QgdXNlIGFueSBjYWNoZWQKKyAgICAgICAqIHBvaW50ZXJzIHRvIHRoZSBjb25uZWN0aW9uJ3MgaW50ZXJuYWxzIGJlbG93IHRoaXMgcG9pbnQsIHNvIGl0IHNob3VsZAorICAgICAgICogYmUgc2FmZSB0byBkcm9wIHRoZSBsb2NrIGFuZCB0YWtlIGl0IGJhY2suICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2VfbGluayAhPSBOVUxMKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChtZXNzYWdlX2xpbmspOworCisgIF9kYnVzX3ZlcmJvc2UgKCJiZWZvcmUgZmluYWwgc3RhdHVzIHVwZGF0ZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdW5sb2NrcyBhbmQgY2FsbHMgdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgd2F0Y2ggZnVuY3Rpb25zIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgZmlsZQorICogZGVzY3JpcHRvcnMgdGhhdCBuZWVkIHRvIGJlIG1vbml0b3JlZCBmb3IgZXZlbnRzLCB1c2luZyBzZWxlY3QoKSBvcgorICogcG9sbCgpLiBXaGVuIHVzaW5nIFF0LCB0eXBpY2FsbHkgdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uIHdvdWxkCisgKiBjcmVhdGUgYSBRU29ja2V0Tm90aWZpZXIuIFdoZW4gdXNpbmcgR0xpYiwgdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uCisgKiBjb3VsZCBjYWxsIGdfaW9fYWRkX3dhdGNoKCksIG9yIGNvdWxkIGJlIHVzZWQgYXMgcGFydCBvZiBhIG1vcmUKKyAqIGVsYWJvcmF0ZSBHU291cmNlLiBOb3RlIHRoYXQgd2hlbiBhIHdhdGNoIGlzIGFkZGVkLCBpdCBtYXkKKyAqIG5vdCBiZSBlbmFibGVkLgorICoKKyAqIFRoZSBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gbm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlCisgKiB3YXRjaCBoYXMgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLiBDYWxsIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQoKQorICogdG8gY2hlY2sgdGhpcy4gQSBkaXNhYmxlZCB3YXRjaCBzaG91bGQgaGF2ZSBubyBlZmZlY3QsIGFuZCBlbmFibGVkCisgKiB3YXRjaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gbG9vcC4gVGhpcyBmZWF0dXJlIGlzIHVzZWQKKyAqIGluc3RlYWQgb2Ygc2ltcGx5IGFkZGluZy9yZW1vdmluZyB0aGUgd2F0Y2ggYmVjYXVzZQorICogZW5hYmxpbmcvZGlzYWJsaW5nIGNhbiBiZSBkb25lIHdpdGhvdXQgbWVtb3J5IGFsbG9jYXRpb24uICBUaGUKKyAqIHRvZ2dsZWQgZnVuY3Rpb24gbWF5IGJlIE5VTEwgaWYgYSBtYWluIGxvb3AgcmUtcXVlcmllcworICogZGJ1c193YXRjaF9nZXRfZW5hYmxlZCgpIGV2ZXJ5IHRpbWUgYW55d2F5LgorICogCisgKiBUaGUgREJ1c1dhdGNoIGNhbiBiZSBxdWVyaWVkIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdhdGNoIHVzaW5nCisgKiBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgb3IgZGJ1c193YXRjaF9nZXRfc29ja2V0KCksIGFuZCBmb3IgdGhlCisgKiBldmVudHMgdG8gd2F0Y2ggZm9yIHVzaW5nIGRidXNfd2F0Y2hfZ2V0X2ZsYWdzKCkuIFRoZSBmbGFncworICogcmV0dXJuZWQgYnkgZGJ1c193YXRjaF9nZXRfZmxhZ3MoKSB3aWxsIG9ubHkgY29udGFpbgorICogREJVU19XQVRDSF9SRUFEQUJMRSBhbmQgREJVU19XQVRDSF9XUklUQUJMRSwgbmV2ZXIKKyAqIERCVVNfV0FUQ0hfSEFOR1VQIG9yIERCVVNfV0FUQ0hfRVJST1I7IGFsbCB3YXRjaGVzIGltcGxpY2l0bHkKKyAqIGluY2x1ZGUgYSB3YXRjaCBmb3IgaGFuZ3VwcywgZXJyb3JzLCBhbmQgb3RoZXIgZXhjZXB0aW9uYWwKKyAqIGNvbmRpdGlvbnMuCisgKgorICogT25jZSBhIGZpbGUgZGVzY3JpcHRvciBiZWNvbWVzIHJlYWRhYmxlIG9yIHdyaXRhYmxlLCBvciBhbiBleGNlcHRpb24KKyAqIG9jY3VycywgZGJ1c193YXRjaF9oYW5kbGUoKSBzaG91bGQgYmUgY2FsbGVkIHRvCisgKiBub3RpZnkgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGZpbGUgZGVzY3JpcHRvcidzIGNvbmRpdGlvbi4KKyAqCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIGNhbm5vdCBiZSBjYWxsZWQgZHVyaW5nIHRoZQorICogREJ1c0FkZFdhdGNoRnVuY3Rpb24sIGFzIHRoZSBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHJlYWR5IHRvIGhhbmRsZQorICogdGhhdCB3YXRjaCB5ZXQuCisgKiAKKyAqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHJlZmVyZW5jZSBhIERCdXNXYXRjaCBhZnRlciBpdCBoYXMgYmVlbiBwYXNzZWQKKyAqIHRvIHJlbW92ZV9mdW5jdGlvbi4KKyAqCisgKiBJZiAjRkFMU0UgaXMgcmV0dXJuZWQgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgZmFpbHVyZSBtYXkgYmUgZHVlCisgKiB0byBhICNGQUxTRSByZXR1cm4gZnJvbSB0aGUgbmV3IGFkZF9mdW5jdGlvbi4gSWYgc28sIHRoZQorICogYWRkX2Z1bmN0aW9uIG1heSBoYXZlIGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseSBvbmUgb3IgbW9yZSB0aW1lcywKKyAqIGJ1dCB0aGUgcmVtb3ZlX2Z1bmN0aW9uIHdpbGwgYWxzbyBoYXZlIGJlZW4gY2FsbGVkIHRvIHJlbW92ZSBhbnkKKyAqIHN1Y2Nlc3NmdWwgYWRkcy4gaS5lLiBpZiAjRkFMU0UgaXMgcmV0dXJuZWQgdGhlIG5ldCByZXN1bHQKKyAqIHNob3VsZCBiZSB0aGF0IGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgaGFzIG5vIGVmZmVjdCwKKyAqIGJ1dCB0aGUgYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24gbWF5IGhhdmUgYmVlbiBjYWxsZWQuCisgKgorICogQG5vdGUgVGhlIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uIGlzIGhlbGQgd2hpbGUKKyAqIHdhdGNoIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCwgc28gaW5zaWRlIHRoZXNlIGZ1bmN0aW9ucyB5b3UKKyAqIG1heSBub3QgaW52b2tlIGFueSBtZXRob2RzIG9uIERCdXNDb25uZWN0aW9uIG9yIGl0IHdpbGwgZGVhZGxvY2suCisgKiBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBjb2RlIG9yIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA3LUp1bHkvdHJlYWQuaHRtbCM4MTQ0CisgKiBpZiB5b3UgZW5jb3VudGVyIHRoaXMgaXNzdWUgYW5kIHdhbnQgdG8gYXR0ZW1wdCB3cml0aW5nIGEgcGF0Y2guCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIGFkZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZWdpbiBtb25pdG9yaW5nIGEgbmV3IGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHN0b3AgbW9uaXRvcmluZyBhIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgb2YgZW5hYmxlL2Rpc2FibGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSB0aW1lb3V0IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiBsb29wIGF3YXJlIG9mIHRpbWVvdXRzLgorICogV2hlbiB1c2luZyBRdCwgdHlwaWNhbGx5IHRoZSBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIHdvdWxkIGNyZWF0ZSBhCisgKiBRVGltZXIuIFdoZW4gdXNpbmcgR0xpYiwgdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gd291bGQgY2FsbAorICogZ190aW1lb3V0X2FkZC4KKyAqIAorICogVGhlIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQorICogdGltZW91dCBoYXMgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLiBDYWxsCisgKiBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQoKSB0byBjaGVjayB0aGlzLiBBIGRpc2FibGVkIHRpbWVvdXQgc2hvdWxkCisgKiBoYXZlIG5vIGVmZmVjdCwgYW5kIGVuYWJsZWQgdGltZW91dCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4KKyAqIGxvb3AuIFRoaXMgZmVhdHVyZSBpcyB1c2VkIGluc3RlYWQgb2Ygc2ltcGx5IGFkZGluZy9yZW1vdmluZyB0aGUKKyAqIHRpbWVvdXQgYmVjYXVzZSBlbmFibGluZy9kaXNhYmxpbmcgY2FuIGJlIGRvbmUgd2l0aG91dCBtZW1vcnkKKyAqIGFsbG9jYXRpb24uIFdpdGggUXQsIFFUaW1lcjo6c3RhcnQoKSBhbmQgUVRpbWVyOjpzdG9wKCkgY2FuIGJlIHVzZWQKKyAqIHRvIGVuYWJsZSBhbmQgZGlzYWJsZS4gVGhlIHRvZ2dsZWQgZnVuY3Rpb24gbWF5IGJlIE5VTEwgaWYgYSBtYWluCisgKiBsb29wIHJlLXF1ZXJpZXMgZGJ1c190aW1lb3V0X2dldF9lbmFibGVkKCkgZXZlcnkgdGltZSBhbnl3YXkuCisgKiBXaGVuZXZlciBhIHRpbWVvdXQgaXMgdG9nZ2xlZCwgaXRzIGludGVydmFsIG1heSBjaGFuZ2UuCisgKgorICogVGhlIERCdXNUaW1lb3V0IGNhbiBiZSBxdWVyaWVkIGZvciB0aGUgdGltZXIgaW50ZXJ2YWwgdXNpbmcKKyAqIGRidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwoKS4gZGJ1c190aW1lb3V0X2hhbmRsZSgpIHNob3VsZCBiZSBjYWxsZWQKKyAqIHJlcGVhdGVkbHksIGVhY2ggdGltZSB0aGUgaW50ZXJ2YWwgZWxhcHNlcywgc3RhcnRpbmcgYWZ0ZXIgaXQgaGFzCisgKiBlbGFwc2VkIG9uY2UuIFRoZSB0aW1lb3V0IHN0b3BzIGZpcmluZyB3aGVuIGl0IGlzIHJlbW92ZWQgd2l0aCB0aGUKKyAqIGdpdmVuIHJlbW92ZV9mdW5jdGlvbi4gIFRoZSB0aW1lciBpbnRlcnZhbCBtYXkgY2hhbmdlIHdoZW5ldmVyIHRoZQorICogdGltZW91dCBpcyBhZGRlZCwgcmVtb3ZlZCwgb3IgdG9nZ2xlZC4KKyAqCisgKiBAbm90ZSBUaGUgdGhyZWFkIGxvY2sgb24gREJ1c0Nvbm5lY3Rpb24gaXMgaGVsZCB3aGlsZQorICogdGltZW91dCBmdW5jdGlvbnMgYXJlIGludm9rZWQsIHNvIGluc2lkZSB0aGVzZSBmdW5jdGlvbnMgeW91CisgKiBtYXkgbm90IGludm9rZSBhbnkgbWV0aG9kcyBvbiBEQnVzQ29ubmVjdGlvbiBvciBpdCB3aWxsIGRlYWRsb2NrLgorICogU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgY29kZSBvciBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RocmVhZC5odG1sIzgxNDQKKyAqIGlmIHlvdSBlbmNvdW50ZXIgdGhpcyBpc3N1ZSBhbmQgd2FudCB0byBhdHRlbXB0IHdyaXRpbmcgYSBwYXRjaC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYWRkIGEgdGltZW91dC4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gcmVtb3ZlIGEgdGltZW91dC4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBlbmFibGUvZGlzYWJsZQorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisJCQkJCSBEQnVzQWRkVGltZW91dEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisJCQkJCSBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisJCQkJCSB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorCQkJCQkgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24tPnRpbWVvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLCByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYWlubG9vcCB3YWtldXAgZnVuY3Rpb24gZm9yIHRoZSBjb25uZWN0aW9uLiBUaGlzIGZ1bmN0aW9uCisgKiBpcyByZXNwb25zaWJsZSBmb3Igd2FraW5nIHVwIHRoZSBtYWluIGxvb3AgKGlmIGl0cyBzbGVlcGluZyBpbgorICogYW5vdGhlciB0aHJlYWQpIHdoZW4gc29tZSBzb21lIGNoYW5nZSBoYXMgaGFwcGVuZWQgdG8gdGhlCisgKiBjb25uZWN0aW9uIHRoYXQgdGhlIG1haW5sb29wIG5lZWRzIHRvIHJlY29uc2lkZXIgKGUuZy4gYSBtZXNzYWdlCisgKiBoYXMgYmVlbiBxdWV1ZWQgZm9yIHdyaXRpbmcpLiAgV2hlbiB1c2luZyBRdCwgdGhpcyB0eXBpY2FsbHkKKyAqIHJlc3VsdHMgaW4gYSBjYWxsIHRvIFFFdmVudExvb3A6Ondha2VVcCgpLiAgV2hlbiB1c2luZyBHTGliLCBpdAorICogd291bGQgY2FsbCBnX21haW5fY29udGV4dF93YWtldXAoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB3YWtldXBfbWFpbl9mdW5jdGlvbiBmdW5jdGlvbiB0byB3YWtlIHVwIHRoZSBtYWlubG9vcAorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHdha2V1cF9tYWluX2Z1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgIERCdXNXYWtldXBNYWluRnVuY3Rpb24gICAgIHdha2V1cF9tYWluX2Z1bmN0aW9uLAorCQkJCQkgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJCSAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICB2b2lkICpvbGRfZGF0YTsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9kYXRhOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgb2xkX2RhdGEgPSBjb25uZWN0aW9uLT53YWtldXBfbWFpbl9kYXRhOworICBvbGRfZnJlZV9kYXRhID0gY29ubmVjdGlvbi0+ZnJlZV93YWtldXBfbWFpbl9kYXRhOworCisgIGNvbm5lY3Rpb24tPndha2V1cF9tYWluX2Z1bmN0aW9uID0gd2FrZXVwX21haW5fZnVuY3Rpb247CisgIGNvbm5lY3Rpb24tPndha2V1cF9tYWluX2RhdGEgPSBkYXRhOworICBjb25uZWN0aW9uLT5mcmVlX3dha2V1cF9tYWluX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgLyogQ2FsbGJhY2sgb3V0c2lkZSB0aGUgbG9jayAqLworICBpZiAob2xkX2ZyZWVfZGF0YSkKKyAgICAoKm9sZF9mcmVlX2RhdGEpIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogU2V0IGEgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBkaXNwYXRjaCBzdGF0dXMgY2hhbmdlcy4KKyAqIElmIHRoZSBkaXNwYXRjaCBzdGF0dXMgaXMgI0RCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TLCB0aGVuCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBpbmNvbWluZworICogbWVzc2FnZXMuIEhvd2V2ZXIsIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIE1VU1QgTk9UIEJFIENBTExFRAorICogZnJvbSBpbnNpZGUgdGhlIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uLiBJbmRlZWQsIGFsbW9zdAorICogYW55IHJlZW50cmFuY3kgaW4gdGhpcyBmdW5jdGlvbiBpcyBhIGJhZCBpZGVhLiBJbnN0ZWFkLAorICogdGhlIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uIHNob3VsZCBzaW1wbHkgc2F2ZSBhbiBpbmRpY2F0aW9uCisgKiB0aGF0IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwYXRjaGVkIGxhdGVyLCB3aGVuIHRoZSBtYWluIGxvb3AKKyAqIGlzIHJlLWVudGVyZWQuCisgKgorICogSWYgeW91IGRvbid0IHNldCBhIGRpc3BhdGNoIHN0YXR1cyBmdW5jdGlvbiwgeW91IGhhdmUgdG8gYmUgc3VyZSB0bworICogZGlzcGF0Y2ggb24gZXZlcnkgaXRlcmF0aW9uIG9mIHlvdXIgbWFpbiBsb29wLCBlc3BlY2lhbGx5IGlmCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIG9yIGRidXNfdGltZW91dF9oYW5kbGUoKSB3ZXJlIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGNhbGwgb24gZGlzcGF0Y2ggc3RhdHVzIGNoYW5nZXMKKyAqIEBwYXJhbSBkYXRhIGRhdGEgZm9yIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZyZWUgdGhlIGZ1bmN0aW9uIGRhdGEKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICB2b2lkICpvbGRfZGF0YTsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9kYXRhOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgb2xkX2RhdGEgPSBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZGF0YTsKKyAgb2xkX2ZyZWVfZGF0YSA9IGNvbm5lY3Rpb24tPmZyZWVfZGlzcGF0Y2hfc3RhdHVzX2RhdGE7CisKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19kYXRhID0gZGF0YTsKKyAgY29ubmVjdGlvbi0+ZnJlZV9kaXNwYXRjaF9zdGF0dXNfZGF0YSA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAvKiBDYWxsYmFjayBvdXRzaWRlIHRoZSBsb2NrICovCisgIGlmIChvbGRfZnJlZV9kYXRhKQorICAgICgqb2xkX2ZyZWVfZGF0YSkgKG9sZF9kYXRhKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFVOSVggZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBjb25uZWN0aW9uLCBpZiBhbnkuICBUaGlzIGNhbgorICogYmUgdXNlZCBmb3IgU0VMaW51eCBhY2Nlc3MgY29udHJvbCBjaGVja3Mgd2l0aCBnZXRwZWVyY29uKCkgZm9yCisgKiBleGFtcGxlLiBETyBOT1QgcmVhZCBvciB3cml0ZSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLCBvciB0cnkgdG8KKyAqIHNlbGVjdCgpIG9uIGl0OyB1c2UgREJ1c1dhdGNoIGZvciBtYWluIGxvb3AgaW50ZWdyYXRpb24uIE5vdCBhbGwKKyAqIGNvbm5lY3Rpb25zIHdpbGwgaGF2ZSBhIGZpbGUgZGVzY3JpcHRvci4gU28gZm9yIGFkZGluZyBkZXNjcmlwdG9ycworICogdG8gdGhlIG1haW4gbG9vcCwgdXNlIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSBhbmQgc28gZm9ydGguCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgc29ja2V0LWJhc2VkLCB5b3UgY2FuIGFsc28gdXNlCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCgpLCB3aGljaCB3aWxsIHdvcmsgb24gV2luZG93cyB0b28uCisgKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBmYWlscyBvbiBXaW5kb3dzLgorICoKKyAqIFJpZ2h0IG5vdyB0aGUgcmV0dXJuZWQgZGVzY3JpcHRvciBpcyBhbHdheXMgYSBzb2NrZXQsIGJ1dAorICogdGhhdCBpcyBub3QgZ3VhcmFudGVlZC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmZCBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqZmQpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0ICE9IE5VTEwsIEZBTFNFKTsKKworI2lmZGVmIERCVVNfV0lOCisgIC8qIEZJWE1FIGRvIHRoaXMgb24gYSBsb3dlciBsZXZlbCAqLworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyAgCisgIHJldHVybiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldChjb25uZWN0aW9uLCBmZCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5kZXJseWluZyBXaW5kb3dzIG9yIFVOSVggc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorICogb2YgdGhlIGNvbm5lY3Rpb24sIGlmIGFueS4gRE8gTk9UIHJlYWQgb3Igd3JpdGUgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciwgb3IgdHJ5IHRvCisgKiBzZWxlY3QoKSBvbiBpdDsgdXNlIERCdXNXYXRjaCBmb3IgbWFpbiBsb29wIGludGVncmF0aW9uLiBOb3QgYWxsCisgKiBjb25uZWN0aW9ucyB3aWxsIGhhdmUgYSBzb2NrZXQuIFNvIGZvciBhZGRpbmcgZGVzY3JpcHRvcnMKKyAqIHRvIHRoZSBtYWluIGxvb3AsIHVzZSBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSBhbmQgc28gZm9ydGguCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IHNvY2tldC1iYXNlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBGQUxTRSwKKyAqIGV2ZW4gaWYgdGhlIGNvbm5lY3Rpb24gZG9lcyBoYXZlIGEgZmlsZSBkZXNjcmlwdG9yIG9mIHNvbWUga2luZC4KKyAqIGkuZS4gdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBzcGVjaWZpY2FsbHkgYSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGZkIGlzIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZC4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0KERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAqZmQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1NvY2tldCBzID0gREJVU19TT0NLRVRfSU5JVDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dmFsID0gX2RidXNfdHJhbnNwb3J0X2dldF9zb2NrZXRfZmQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwgJnMpOworCisgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgKmZkID0gX2RidXNfc29ja2V0X2dldF9pbnQgKHMpOworICAgIH0KKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioKKyAqIEdldHMgdGhlIFVOSVggdXNlciBJRCBvZiB0aGUgY29ubmVjdGlvbiBpZiBrbm93bi4gIFJldHVybnMgI1RSVUUgaWYKKyAqIHRoZSB1aWQgaXMgZmlsbGVkIGluLiAgQWx3YXlzIHJldHVybnMgI0ZBTFNFIG9uIG5vbi1VTklYIHBsYXRmb3JtcworICogZm9yIG5vdywgdGhvdWdoIGluIHRoZW9yeSBzb21lb25lIGNvdWxkIGhvb2sgV2luZG93cyB0byBOSVMgb3IKKyAqIHNvbWV0aGluZy4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBwcmlvciB0byBhdXRoZW50aWNhdGluZyB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKgorICogVGhlIFVJRCBpcyBvbmx5IHJlYWQgYnkgc2VydmVycyBmcm9tIGNsaWVudHM7IGNsaWVudHMgY2FuJ3QgdXN1YWxseQorICogZ2V0IHRoZSBVSUQgb2Ygc2VydmVycywgYmVjYXVzZSBzZXJ2ZXJzIGRvIG5vdCBhdXRoZW50aWNhdGUgdG8KKyAqIGNsaWVudHMuICBUaGUgcmV0dXJuZWQgVUlEIGlzIHRoZSBVSUQgdGhlIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZAorICogYXMuCisgKgorICogVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc2VydmVyIGFuZCB0aGUgYXBwcyBjb25uZWN0aW5nIHRvIHRoZSBidXMKKyAqIGFyZSBjbGllbnRzLgorICoKKyAqIFlvdSBjYW4gYXNrIHRoZSBidXMgdG8gdGVsbCB5b3UgdGhlIFVJRCBvZiBhbm90aGVyIGNvbm5lY3Rpb24gdGhvdWdoCisgKiBpZiB5b3UgbGlrZTsgdGhpcyBpcyBkb25lIHdpdGggZGJ1c19idXNfZ2V0X3VuaXhfdXNlcigpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdWlkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIHVzZXIgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVpZCBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVzZXIgSUQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAqdWlkKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh1aWQgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisKKyNpZmRlZiBEQlVTX1dJTgorICBfZGJ1c19hc3NlcnQgKCFyZXN1bHQpOworI2VuZGlmCisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBjb25uZWN0aW9uIGlmIGFueS4KKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIHBpZCBpcyBmaWxsZWQgaW4uCisgKiBBbHdheXMgcmV0dXJucyAjRkFMU0UgcHJpb3IgdG8gYXV0aGVudGljYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGlkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIHByb2Nlc3MgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVpZCBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHByb2Nlc3MgSUQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgICpwaWQpCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBpZCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKwkJCQkJCSAgcGlkKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBBRFQgYXVkaXQgZGF0YSBvZiB0aGUgY29ubmVjdGlvbiBpZiBhbnkuCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlciBpcyByZXR1cm5lZC4KKyAqIEFsd2F5cyByZXR1cm5zICNGQUxTRSBwcmlvciB0byBhdXRoZW50aWNhdGluZyB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBkYXRhIHJldHVybiBsb2NhdGlvbiBmb3IgYXVkaXQgZGF0YQorICogQHBhcmFtIGRhdGFfc2l6ZSByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiBhdWRpdCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhdWRpdCBkYXRhIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdWNyZWQgcG9pbnRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgIHZvaWQgICAgICAgICAgKipkYXRhLAorCQkJCQkgICAgZGJ1c19pbnQzMl90ICAgKmRhdGFfc2l6ZSkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGF0YSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGF0YV9zaXplICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKwkJCQkJICAgIAkgICAgICAgICBkYXRhLAorCQkJICAJCQkgICAgICAgICBkYXRhX3NpemUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXRzIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiB1c2VyIElECisgKiBpcyBhbGxvd2VkIHRvIGNvbm5lY3QuIFdoZW4gYW4gaW5jb21pbmcgY29ubmVjdGlvbiBoYXMKKyAqIGF1dGhlbnRpY2F0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgdXNlciBJRCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQ7CisgKiBpZiBpdCByZXR1cm5zICNUUlVFLCB0aGUgY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvIHByb2NlZWQsCisgKiBvdGhlcndpc2UgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLgorICoKKyAqIElmIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gI05VTEwgKGFzIGl0IGlzIGJ5IGRlZmF1bHQpLCB0aGVuCisgKiBvbmx5IHRoZSBzYW1lIFVJRCBhcyB0aGUgc2VydmVyIHByb2Nlc3Mgd2lsbCBiZSBhbGxvd2VkIHRvCisgKiBjb25uZWN0LiBBbHNvLCByb290IGlzIGFsd2F5cyBhbGxvd2VkIHRvIGNvbm5lY3QuCisgKgorICogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgc2V0IGFuZCBpdHMgZnJlZV9kYXRhX2Z1bmN0aW9uIHdpbGwKKyAqIGJlIGludm9rZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBmcmVlZCBvciBhIG5ldyBmdW5jdGlvbiBpcyBzZXQuCisgKiBIb3dldmVyLCB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2UgdGhlcmUgYXJlCisgKiBubyBVTklYIHVzZXIgaWRzIHRvIHBhc3MgdG8gaXQsIG9yIGF0IGxlYXN0IG5vbmUgb2YgdGhlIGV4aXN0aW5nCisgKiBhdXRoIHByb3RvY29scyB3b3VsZCBhbGxvdyBhdXRoZW50aWNhdGluZyBhcyBhIFVOSVggdXNlciBvbiBXaW5kb3dzLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICB2b2lkICpvbGRfZGF0YSA9IE5VTEw7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuY3Rpb24gPSBOVUxMOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBkYXRhLCBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2RhdGEsICZvbGRfZnJlZV9mdW5jdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAob2xkX2ZyZWVfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiBvbGRfZnJlZV9mdW5jdGlvbikgKG9sZF9kYXRhKTsKK30KKworLyogU2FtZSBjYWxsaW5nIGNvbnZlbnRpb24gYXMgZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICoqbGFiZWxfcCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsYWJlbF9wICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfbGludXhfc2VjdXJpdHlfbGFiZWwgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9wKTsKKyNpZm5kZWYgX19saW51eF9fCisgIF9kYnVzX2Fzc2VydCAoIXJlc3VsdCk7CisjZW5kaWYKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBXaW5kb3dzIHVzZXIgU0lEIG9mIHRoZSBjb25uZWN0aW9uIGlmIGtub3duLiAgUmV0dXJucworICogI1RSVUUgaWYgdGhlIElEIGlzIGZpbGxlZCBpbi4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBvbiBub24tV2luZG93cworICogcGxhdGZvcm1zIGZvciBub3csIHRob3VnaCBpbiB0aGVvcnkgc29tZW9uZSBjb3VsZCBob29rIFVOSVggdG8KKyAqIEFjdGl2ZSBEaXJlY3Rvcnkgb3Igc29tZXRoaW5nLiAgQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvCisgKiBhdXRoZW50aWNhdGluZyB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBUaGUgdXNlciBpcyBvbmx5IHJlYWQgYnkgc2VydmVycyBmcm9tIGNsaWVudHM7IGNsaWVudHMgY2FuJ3QgdXN1YWxseQorICogZ2V0IHRoZSB1c2VyIG9mIHNlcnZlcnMsIGJlY2F1c2Ugc2VydmVycyBkbyBub3QgYXV0aGVudGljYXRlIHRvCisgKiBjbGllbnRzLiBUaGUgcmV0dXJuZWQgdXNlciBpcyB0aGUgdXNlciB0aGUgY29ubmVjdGlvbiBhdXRoZW50aWNhdGVkCisgKiBhcy4KKyAqCisgKiBUaGUgbWVzc2FnZSBidXMgaXMgYSBzZXJ2ZXIgYW5kIHRoZSBhcHBzIGNvbm5lY3RpbmcgdG8gdGhlIGJ1cworICogYXJlIGNsaWVudHMuCisgKgorICogVGhlIHJldHVybmVkIHVzZXIgc3RyaW5nIGhhcyB0byBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgU0lEIGlzIGF2YWlsYWJsZTsKKyAqIGlmIGl0J3MgYXZhaWxhYmxlIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBtZW1vcnkgdG8gY29weSBpdCwKKyAqIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyAjVFJVRSBhbmQgI05VTEwgaXMgZ2l2ZW4gYXMgdGhlIFNJRC4KKyAqIAorICogQHRvZG8gV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHNheSAiWW91IGNhbiBhc2sgdGhlIGJ1cyB0byB0ZWxsCisgKiB5b3UgdGhlIHVzZXIgb2YgYW5vdGhlciBjb25uZWN0aW9uIHRob3VnaCBpZiB5b3UgbGlrZTsgdGhpcyBpcyBkb25lCisgKiB3aXRoIGRidXNfYnVzX2dldF93aW5kb3dzX3VzZXIoKS4iIEJ1dCB0aGlzIGhhcyB0byBiZSBpbXBsZW1lbnRlZAorICogaW4gYnVzL2RyaXZlci5jIGFuZCBkYnVzL2RidXMtYnVzLmMsIGFuZCBpcyBwb2ludGxlc3MgYW55d2F5CisgKiBzaW5jZSBvbiBXaW5kb3dzIHdlIG9ubHkgdXNlIHRoZSBzZXNzaW9uIGJ1cyBmb3Igbm93LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gd2luZG93c19zaWRfcCByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGFsbG9jYXRlZCBjb3B5IG9mIHRoZSB1c2VyIElELCBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXIgaXMgYXZhaWxhYmxlIChyZXR1cm5lZCB2YWx1ZSBtYXkgYmUgI05VTEwgYW55d2F5IGlmIG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqd2luZG93c19zaWRfcCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2luZG93c19zaWRfcCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF93aW5kb3dzX3VzZXIgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c19zaWRfcCk7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgX2RidXNfYXNzZXJ0ICghcmVzdWx0KTsKKyNlbmRpZgorICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBJRAorICogaXMgYWxsb3dlZCB0byBjb25uZWN0LiBXaGVuIGFuIGluY29taW5nIGNvbm5lY3Rpb24gaGFzCisgKiBhdXRoZW50aWNhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVzZXIgSUQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOworICogaWYgaXQgcmV0dXJucyAjVFJVRSwgdGhlIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBwcm9jZWVkLAorICogb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBJZiB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICNOVUxMIChhcyBpdCBpcyBieSBkZWZhdWx0KSwgdGhlbgorICogb25seSB0aGUgc2FtZSB1c2VyIG93bmluZyB0aGUgc2VydmVyIHByb2Nlc3Mgd2lsbCBiZSBhbGxvd2VkIHRvCisgKiBjb25uZWN0LgorICoKKyAqIE9uIFVOSVgsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHNldCBhbmQgaXRzIGZyZWVfZGF0YV9mdW5jdGlvbiB3aWxsCisgKiBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQgb3IgYSBuZXcgZnVuY3Rpb24gaXMgc2V0LgorICogSG93ZXZlciwgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZXJlIGlzIG5vCisgKiB3YXkgcmlnaHQgbm93IHRvIGF1dGhlbnRpY2F0ZSBhcyBhIFdpbmRvd3MgdXNlciBvbiBVTklYLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGEgPSBOVUxMOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmN0aW9uID0gTlVMTDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9kYXRhLCAmb2xkX2ZyZWVfZnVuY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG9sZF9mcmVlX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogb2xkX2ZyZWVfZnVuY3Rpb24pIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHNpZGUgb2YgYSBjb25uZWN0aW9uIHdoZW4gdGhlCisgKiBjb25uZWN0aW9uIGlzIGZpcnN0IHNlZW4gaW4gdGhlICNEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uLiBJZiBzZXQgdG8KKyAqICNUUlVFICh0aGUgZGVmYXVsdCBpcyAjRkFMU0UpLCB0aGVuIHRoZSBjb25uZWN0aW9uIGNhbiBwcm9jZWVkIGV2ZW4gaWYKKyAqIHRoZSBjbGllbnQgZG9lcyBub3QgYXV0aGVudGljYXRlIGFzIHNvbWUgdXNlciBpZGVudGl0eSwgaS5lLiBjbGllbnRzCisgKiBjYW4gY29ubmVjdCBhbm9ueW1vdXNseS4KKyAqIAorICogVGhpcyBzZXR0aW5nIGludGVyYWN0cyB3aXRoIHRoZSBhdmFpbGFibGUgYXV0aG9yaXphdGlvbiBtZWNoYW5pc21zCisgKiAoc2VlIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMoKSkuIE5hbWVseSwgYW4gYXV0aCBtZWNoYW5pc20KKyAqIHN1Y2ggYXMgQU5PTllNT1VTIHRoYXQgc3VwcG9ydHMgYW5vbnltb3VzIGF1dGggbXVzdCBiZSBpbmNsdWRlZCBpbgorICogdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIGFub255bW91cyBsb2dpbiB0byB3b3JrLgorICoKKyAqIFRoaXMgc2V0dGluZyBhbHNvIGNoYW5nZXMgdGhlIGRlZmF1bHQgcnVsZSBmb3IgY29ubmVjdGlvbnMKKyAqIGF1dGhvcml6ZWQgYXMgYSB1c2VyOyBub3JtYWxseSwgaWYgYSBjb25uZWN0aW9uIGF1dGhvcml6ZXMgYXMKKyAqIGEgdXNlciBpZGVudGl0eSwgaXQgaXMgcGVybWl0dGVkIGlmIHRoZSB1c2VyIGlkZW50aXR5IGlzCisgKiByb290IG9yIHRoZSB1c2VyIGlkZW50aXR5IG1hdGNoZXMgdGhlIHVzZXIgaWRlbnRpdHkgb2YgdGhlIHNlcnZlcgorICogcHJvY2Vzcy4gSWYgYW5vbnltb3VzIGNvbm5lY3Rpb25zIGFyZSBhbGxvd2VkLCBob3dldmVyLAorICogdGhlbiBhbnkgdXNlciBpZGVudGl0eSBpcyBhbGxvd2VkLgorICoKKyAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHJ1bGVzIGZvciBjb25uZWN0aW9ucyBhdXRob3JpemVkIGFzIGEKKyAqIHVzZXIgaWRlbnRpdHkgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbigpCisgKiBhbmQgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24oKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB2YWx1ZSB3aGV0aGVyIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIGFzIGFuIGFub255bW91cyB1c2VyCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwgdmFsdWUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICoKKyAqIE5vcm1hbGx5ICNEQnVzQ29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgYWxsIG1lc3NhZ2VzIHRvIHRoZQorICogb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBpbnRlcmZhY2UuIEhvd2V2ZXIsIHRoZSBtZXNzYWdlIGJ1cyB3YW50cworICogdG8gYmUgYWJsZSB0byByb3V0ZSBtZXRob2RzIG9uIHRoYXQgaW50ZXJmYWNlIHRocm91Z2ggdGhlIGJ1cyBhbmQKKyAqIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gSWYgcm91dGluZyBwZWVyIG1lc3NhZ2VzIGlzIGVuYWJsZWQsIHRoZW4KKyAqIG1lc3NhZ2VzIHdpdGggdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlIHRoYXQgYWxzbworICogaGF2ZSBhIGJ1cyBkZXN0aW5hdGlvbiBuYW1lIHNldCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5CisgKiBoYW5kbGVkIGJ5IHRoZSAjREJ1c0Nvbm5lY3Rpb24gYW5kIGluc3RlYWQgd2lsbCBiZSBkaXNwYXRjaGVkCisgKiBub3JtYWxseSB0byB0aGUgYXBwbGljYXRpb24uCisgKgorICogSWYgYSBub3JtYWwgYXBwbGljYXRpb24gc2V0cyB0aGlzIGZsYWcsIGl0IGNhbiBicmVhayB0aGluZ3MgYmFkbHkuCisgKiBTbyBkb24ndCBzZXQgdGhpcyB1bmxlc3MgeW91IGFyZSB0aGUgbWVzc2FnZSBidXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB2YWx1ZSAjVFJVRSB0byBwYXNzIHRocm91Z2ggb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBtZXNzYWdlcyB3aXRoIGEgYnVzIG5hbWUgc2V0CisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBjb25uZWN0aW9uLT5yb3V0ZV9wZWVyX21lc3NhZ2VzID0gdmFsdWU7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZSBmaWx0ZXIuIEZpbHRlcnMgYXJlIGhhbmRsZXJzIHRoYXQgYXJlIHJ1biBvbiBhbGwKKyAqIGluY29taW5nIG1lc3NhZ2VzLCBwcmlvciB0byB0aGUgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpLiAgRmlsdGVycyBhcmUgcnVuIGluIHRoZQorICogb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuICBUaGUgc2FtZSBoYW5kbGVyIGNhbiBiZSBhZGRlZCBhcyBhCisgKiBmaWx0ZXIgbW9yZSB0aGFuIG9uY2UsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBydW4gbW9yZSB0aGFuIG9uY2UuCisgKiBGaWx0ZXJzIGFkZGVkIGR1cmluZyBhIGZpbHRlciBjYWxsYmFjayB3b24ndCBiZSBydW4gb24gdGhlIG1lc3NhZ2UKKyAqIGJlaW5nIHByb2Nlc3NlZC4KKyAqCisgKiBAdG9kbyB3ZSBkb24ndCBydW4gZmlsdGVycyBvbiBtZXNzYWdlcyB3aGlsZSBibG9ja2luZyB3aXRob3V0CisgKiBlbnRlcmluZyB0aGUgbWFpbiBsb29wLCBzaW5jZSBmaWx0ZXJzIGFyZSBydW4gYXMgcGFydCBvZgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIFRoaXMgaXMgcHJvYmFibHkgYSBmZWF0dXJlLCBhcyBmaWx0ZXJzCisgKiBjb3VsZCBjcmVhdGUgYXJiaXRyYXJ5IHJlZW50cmFuY3kuIEJ1dCBraW5kIG9mIHN1Y2tzIGlmIHlvdSdyZQorICogdHJ5aW5nIHRvIGZpbHRlciBNRVRIT0RfUkVUVVJOIGZvciBzb21lIHJlYXNvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcworICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gdXNlIGZvciBmcmVlaW5nIHVzZXIgZGF0YQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcjsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZnVuY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworCisgIGZpbHRlciA9IGRidXNfbmV3MCAoREJ1c01lc3NhZ2VGaWx0ZXIsIDEpOworICBpZiAoZmlsdGVyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2F0b21pY19pbmMgKCZmaWx0ZXItPnJlZmNvdW50KTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19tZXNzYWdlX2ZpbHRlcl91bnJlZiAoZmlsdGVyKTsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRmlsbCBpbiBmaWx0ZXIgYWZ0ZXIgYWxsIG1lbW9yeSBhbGxvY2F0ZWQsCisgICAqIHNvIHdlIGRvbid0IHJ1biB0aGUgZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24KKyAgICogaWYgdGhlIGFkZF9maWx0ZXIoKSBmYWlscworICAgKi8KKyAgCisgIGZpbHRlci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgZmlsdGVyLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgICAgICAgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBwcmV2aW91c2x5LWFkZGVkIG1lc3NhZ2UgZmlsdGVyLiBJdCBpcyBhIHByb2dyYW1taW5nCisgKiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGEgaGFuZGxlciB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZAorICogYXMgYSBmaWx0ZXIuIElmIHRoZSBnaXZlbiBoYW5kbGVyIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgb25seQorICogb25lIGluc3RhbmNlIG9mIGl0IHdpbGwgYmUgcmVtb3ZlZCAodGhlIG1vc3QgcmVjZW50bHktYWRkZWQKKyAqIGluc3RhbmNlKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBoYW5kbGVyIHRvIHJlbW92ZQorICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgZm9yIHRoZSBoYW5kbGVyIHRvIHJlbW92ZQorICoKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcjsKKyAgCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZnVuY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGZpbHRlciA9IE5VTEw7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZpbHRlciA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChmaWx0ZXItPmZ1bmN0aW9uID09IGZ1bmN0aW9uICYmCisgICAgICAgICAgZmlsdGVyLT51c2VyX2RhdGEgPT0gdXNlcl9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0LCBsaW5rKTsKKyAgICAgICAgICBmaWx0ZXItPmZ1bmN0aW9uID0gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgbGluayk7CisgICAgICBmaWx0ZXIgPSBOVUxMOworICAgIH0KKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChmaWx0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBmdW5jdGlvbiAlcCB1c2VyIGRhdGEgJXAsIGJ1dCBubyBzdWNoIGZpbHRlciBoYXMgYmVlbiBhZGRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgdXNlcl9kYXRhKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgCisgIC8qIENhbGwgYXBwbGljYXRpb24gY29kZSAqLworICBpZiAoZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbikKKyAgICAoKiBmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uKSAoZmlsdGVyLT51c2VyX2RhdGEpOworCisgIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24gPSBOVUxMOworICBmaWx0ZXItPnVzZXJfZGF0YSA9IE5VTEw7CisgIAorICBfZGJ1c19tZXNzYWdlX2ZpbHRlcl91bnJlZiAoZmlsdGVyKTsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIHBhdGggb3Igc3Vic2VjdGlvbiBpbiB0aGUgb2JqZWN0CisgKiBoaWVyYXJjaHkuIFRoZSBnaXZlbiB2dGFibGUgaGFuZGxlcyBtZXNzYWdlcyBzZW50IHRvIGV4YWN0bHkgdGhlCisgKiBnaXZlbiBwYXRoIG9yIGFsc28gZm9yIHBhdGhzIGJlbGxvdyB0aGF0LCBkZXBlbmRpbmcgb24gZmFsbGJhY2sKKyAqIHBhcmFtZXRlci4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZhbGxiYWNrIHdoZXRoZXIgdG8gaGFuZGxlIG1lc3NhZ2VzIGFsc28gZm9yICJzdWJkaXJlY3RvcnkiCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKGNvbm5lY3Rpb24tPm9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsIHZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgZXJyb3IpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBwYXRoIGluIHRoZSBvYmplY3QgaGllcmFyY2h5LgorICogVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIHNlbnQgdG8gZXhhY3RseSB0aGUgZ2l2ZW4gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBpcyByZXBvcnRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChjb25uZWN0aW9uLCBGQUxTRSwgcGF0aCwgdnRhYmxlLCB1c2VyX2RhdGEsIGVycm9yKTsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIHBhdGggaW4gdGhlIG9iamVjdCBoaWVyYXJjaHkuCisgKiBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgc2VudCB0byBleGFjdGx5IHRoZSBnaXZlbiBwYXRoLgorICoKKyAqIEl0IGlzIGEgYnVnIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3Igb2JqZWN0IHBhdGhzIHdoaWNoIGFscmVhZHkKKyAqIGhhdmUgYSBoYW5kbGVyLiBVc2UgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIGlmIHRoaXMKKyAqIG1pZ2h0IGJlIHRoZSBjYXNlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBvY3VycmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHZhbCA9IF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIEZBTFNFLCBwYXRoLCB2dGFibGUsIHVzZXJfZGF0YSwgJmVycm9yKTsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBmYWxsYmFjayBoYW5kbGVyIGZvciBhIGdpdmVuIHN1YnNlY3Rpb24gb2YgdGhlIG9iamVjdAorICogaGllcmFyY2h5LiAgVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIGF0IG9yIGJlbG93IHRoZSBnaXZlbgorICogcGF0aC4gWW91IGNhbiB1c2UgdGhpcyB0byBlc3RhYmxpc2ggYSBkZWZhdWx0IG1lc3NhZ2UgaGFuZGxpbmcKKyAqIHBvbGljeSBmb3IgYSB3aG9sZSAic3ViZGlyZWN0b3J5LiIKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBpcyByZXBvcnRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjayAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChjb25uZWN0aW9uLCBUUlVFLCBwYXRoLCB2dGFibGUsIHVzZXJfZGF0YSwgZXJyb3IpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGZhbGxiYWNrIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc3Vic2VjdGlvbiBvZiB0aGUgb2JqZWN0CisgKiBoaWVyYXJjaHkuICBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgYXQgb3IgYmVsb3cgdGhlIGdpdmVuCisgKiBwYXRoLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGVzdGFibGlzaCBhIGRlZmF1bHQgbWVzc2FnZSBoYW5kbGluZworICogcG9saWN5IGZvciBhIHdob2xlICJzdWJkaXJlY3RvcnkuIgorICoKKyAqIEl0IGlzIGEgYnVnIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3Igb2JqZWN0IHBhdGhzIHdoaWNoIGFscmVhZHkKKyAqIGhhdmUgYSBoYW5kbGVyLiBVc2UgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjaygpIGlmIHRoaXMKKyAqIG1pZ2h0IGJlIHRoZSBjYXNlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBvY2N1cmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2sgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHZhbCA9IF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIFRSVUUsIHBhdGgsIHZ0YWJsZSwgdXNlcl9kYXRhLCAmZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFVucmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHJlZ2lzdGVyZWQgd2l0aCBleGFjdGx5IHRoZSBnaXZlbiBwYXRoLgorICogSXQncyBhIGJ1ZyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGEgcGF0aCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuCisgKiBDYW4gdW5yZWdpc3RlciBib3RoIGZhbGxiYWNrIHBhdGhzIGFuZCBvYmplY3QgcGF0aHMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdW5yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCkKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGhbMF0gPT0gJy8nLCBGQUxTRSk7CisKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24tPm9iamVjdHMsIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgpOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdXNlciBkYXRhIHBhc3NlZCB0byBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKQorICogb3IgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuIElmIG5vdGhpbmcgd2FzIHJlZ2lzdGVyZWQKKyAqIGF0IHRoaXMgcGF0aCwgdGhlIGRhdGEgaXMgZmlsbGVkIGluIHdpdGggI05VTEwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHlvdSByZWdpc3RlcmVkIHdpdGgKKyAqIEBwYXJhbSBkYXRhX3AgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHVzZXIgZGF0YSwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKipkYXRhX3ApCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYXRhX3AgIT0gTlVMTCwgRkFMU0UpOworCisgICpkYXRhX3AgPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICAqZGF0YV9wID0gX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAoY29ubmVjdGlvbi0+b2JqZWN0cywgKGNvbnN0IGNoYXIqKikgZGVjb21wb3NlZF9wYXRoKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZF9wYXRoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMaXN0cyB0aGUgcmVnaXN0ZXJlZCBmYWxsYmFjayBoYW5kbGVycyBhbmQgb2JqZWN0IHBhdGggaGFuZGxlcnMgYXQKKyAqIHRoZSBnaXZlbiBwYXJlbnRfcGF0aC4gVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXJlbnRfcGF0aCB0aGUgcGF0aCB0byBsaXN0IHRoZSBjaGlsZCBoYW5kbGVycyBvZgorICogQHBhcmFtIGNoaWxkX2VudHJpZXMgcmV0dXJucyAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIGNoaWxkcmVuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBjaGlsZCBlbnRyaWVzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fbGlzdF9yZWdpc3RlcmVkIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGFyZW50X3BhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhcmVudF9wYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhcmVudF9wYXRoLCBzdHJsZW4gKHBhcmVudF9wYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24tPm9iamVjdHMsCisJCQkJCQkJIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsCisJCQkJCQkJIGNoaWxkX2VudHJpZXMpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3IgPQorICBfREJVU19EQVRBX1NMT1RfQUxMT0NBVE9SX0lOSVQgKF9EQlVTX0xPQ0tfTkFNRSAoY29ubmVjdGlvbl9zbG90cykpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNDb25uZWN0aW9uLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkgYW5kIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKiAKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNDb25uZWN0aW9uIG9iamVjdHMgd2lsbAorICogaGF2ZSBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdAorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9wKTsKK30KKworLyoqCisgKiBEZWFsbG9jYXRlcyBhIGdsb2JhbCBJRCBmb3IgY29ubmVjdGlvbiBkYXRhIHNsb3RzLgorICogZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhKCkgYW5kIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpIG1heSBubworICogbG9uZ2VyIGJlIHVzZWQgd2l0aCB0aGlzIHNsb3QuICBFeGlzdGluZyBkYXRhIHN0b3JlZCBvbiBleGlzdGluZworICogREJ1c0Nvbm5lY3Rpb24gb2JqZWN0cyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMKKyAqIGZpbmFsaXplZCwgYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUgcmVwbGFjZWQgaWYKKyAqIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuICBXaGVuIHRoZSByZWZjb3VudCBvbiB0aGUKKyAqIHBhc3NlZC1pbiBzbG90IHJlYWNoZXMgMCwgaXQgaXMgc2V0IHRvIC0xLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBzdG9yaW5nIHRoZSBzbG90IHRvIGRlYWxsb2NhdGUKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCpzbG90X3AgPj0gMCk7CisgIAorICBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2ZyZWUgKCZzbG90X2FsbG9jYXRvciwgc2xvdF9wKTsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgREJ1c0Nvbm5lY3Rpb24sIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgY29ubmVjdGlvbiBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUKKyAqIG1haW4gdGhyZWFkIGxvY2sgb24gREJ1c0Nvbm5lY3Rpb24sIHdoaWNoIGFsbG93cyBpdCB0byBiZQorICogdXNlZCBmcm9tIGluc2lkZSB3YXRjaCBhbmQgdGltZW91dCBmdW5jdGlvbnMuIChTZWUgdGhlCisgKiBub3RlIGluIGRvY3MgZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuKQorICogQSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgeW91IG5lZWQgdG8ga25vdyB0aGVyZSdzCisgKiBhIHJlZmVyZW5jZSBoZWxkIG9uIHRoZSBjb25uZWN0aW9uIHdoaWxlIGludm9raW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKSwgb3IgdGhlIGNvbm5lY3Rpb24gY291bGQgYmUKKyAqIGZpbmFsaXplZCBkdXJpbmcgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYykKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBGQUxTRSk7CisgIAorICBTTE9UU19MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubmVjdGlvbi0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworICAKKyAgU0xPVFNfVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIC8qIERvIHRoZSBhY3R1YWwgZnJlZSBvdXRzaWRlIHRoZSBjb25uZWN0aW9uIGxvY2sgKi8KKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlCisgKiBtYWluIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uLCB3aGljaCBhbGxvd3MgaXQgdG8gYmUKKyAqIHVzZWQgZnJvbSBpbnNpZGUgd2F0Y2ggYW5kIHRpbWVvdXQgZnVuY3Rpb25zLiAoU2VlIHRoZQorICogbm90ZSBpbiBkb2NzIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpLikKKyAqIEEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSBuZWVkIHRvIGtub3cgdGhlcmUncworICogYSByZWZlcmVuY2UgaGVsZCBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBpbnZva2luZworICogZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhKCksIG9yIHRoZSBjb25uZWN0aW9uIGNvdWxkIGJlCisgKiBmaW5hbGl6ZWQgZHVyaW5nIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCB0byBnZXQgZGF0YSBmcm9tCisgKiBAcmV0dXJucyB0aGUgZGF0YSwgb3IgI05VTEwgaWYgbm90IGZvdW5kCisgKi8KK3ZvaWQqCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QpCit7CisgIHZvaWQgKnJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBOVUxMKTsKKworICBTTE9UU19MT0NLIChjb25uZWN0aW9uKTsKKworICByZXMgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubmVjdGlvbi0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOworICAKKyAgU0xPVFNfVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBhIGdsb2JhbCBmbGFnIGZvciB3aGV0aGVyIGRidXNfY29ubmVjdGlvbl9uZXcoKQorICogd2lsbCBzZXQgU0lHUElQRSBiZWhhdmlvciB0byBTSUdfSUdOLgorICoKKyAqIEBwYXJhbSB3aWxsX21vZGlmeV9zaWdwaXBlICNUUlVFIHRvIGFsbG93IHNpZ3BpcGUgdG8gYmUgc2V0IHRvIFNJR19JR04KKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9jaGFuZ2Vfc2lncGlwZSAoZGJ1c19ib29sX3Qgd2lsbF9tb2RpZnlfc2lncGlwZSkKK3sgIAorICBfZGJ1c19tb2RpZnlfc2lncGlwZSA9IHdpbGxfbW9kaWZ5X3NpZ3BpcGUgIT0gRkFMU0U7Cit9CisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgbWVzc2FnZSB0aGlzIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0bworICogcmVjZWl2ZS4gTGFyZ2VyIG1lc3NhZ2VzIHdpbGwgcmVzdWx0IGluIGRpc2Nvbm5lY3RpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiBhICNEQnVzQ29ubmVjdGlvbgorICogQHBhcmFtIHNpemUgbWF4aW11bSBtZXNzYWdlIHNpemUgdGhlIGNvbm5lY3Rpb24gY2FuIHJlY2VpdmUsIGluIGJ5dGVzCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgc2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZQorICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3NpemUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXggZmRzIGEgbWVzc2FnZSBvbiB0aGlzCisgKiBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8gcmVjZWl2ZS4gTWVzc2FnZXMgd2l0aCBtb3JlIHVuaXggZmRzIHdpbGwKKyAqIHJlc3VsdCBpbiBkaXNjb25uZWN0aW5nIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGEgI0RCdXNDb25uZWN0aW9uCisgKiBAcGFyYW0gbiBtYXhpbXVtIG1lc3NhZ2UgdW5peCBmZHMgdGhlIGNvbm5lY3Rpb24gY2FuIHJlY2VpdmUKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbikKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIHNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBtYXggbnVtZXIgb2YgdW5peCBmZHMgb2YgYSBzaW5nbGUgbWVzc2FnZQorICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBhbGwgbWVzc2FnZXMKKyAqIHJlY2VpdmVkIG9uIHRoaXMgY29ubmVjdGlvbi4gTWVzc2FnZXMgY291bnQgdG93YXJkIHRoZSBtYXhpbXVtIHVudGlsCisgKiB0aGV5IGFyZSBmaW5hbGl6ZWQuIFdoZW4gdGhlIG1heGltdW0gaXMgcmVhY2hlZCwgdGhlIGNvbm5lY3Rpb24gd2lsbAorICogbm90IHJlYWQgbW9yZSBkYXRhIHVudGlsIHNvbWUgbWVzc2FnZXMgYXJlIGZpbmFsaXplZC4KKyAqCisgKiBUaGUgc2VtYW50aWNzIG9mIHRoZSBtYXhpbXVtIGFyZTogaWYgb3V0c3RhbmRpbmcgbWVzc2FnZXMgYXJlCisgKiBhbHJlYWR5IGFib3ZlIHRoZSBtYXhpbXVtLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHJlYWQuCisgKiBUaGUgc2VtYW50aWNzIGFyZSBub3Q6IGlmIHRoZSBuZXh0IG1lc3NhZ2Ugd291bGQgY2F1c2UgdXMgdG8gZXhjZWVkCisgKiB0aGUgbWF4aW11bSwgd2UgZG9uJ3QgcmVhZCBpdC4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIGRvbid0IGtub3cgdGhlCisgKiBzaXplIG9mIGEgbWVzc2FnZSB1bnRpbCBhZnRlciB3ZSByZWFkIGl0LgorICoKKyAqIFRodXMsIHRoZSBtYXggbGl2ZSBtZXNzYWdlcyBzaXplIGNhbiBhY3R1YWxseSBiZSBleGNlZWRlZAorICogYnkgdXAgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlLgorICogCisgKiBBbHNvLCBpZiB3ZSByZWFkIHNheSAxMDI0IGJ5dGVzIG9mZiB0aGUgd2lyZSBpbiBhIHNpbmdsZSByZWFkKCksCisgKiBhbmQgdGhhdCBjb250YWlucyBhIGhhbGYtZG96ZW4gc21hbGwgbWVzc2FnZXMsIHdlIG1heSBleGNlZWQgdGhlCisgKiBzaXplIG1heCBieSB0aGF0IGFtb3VudC4gQnV0IHRoaXMgc2hvdWxkIGJlIGluY29uc2VxdWVudGlhbC4KKyAqCisgKiBUaGlzIGRvZXMgaW1wbHkgdGhhdCB3ZSBjYW4ndCBjYWxsIHJlYWQoKSB3aXRoIGEgYnVmZmVyIGxhcmdlcgorICogdGhhbiB3ZSdyZSB3aWxsaW5nIHRvIGV4Y2VlZCB0aGlzIGxpbWl0IGJ5LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGFsbCBvdXRzdGFuZGluZyBtZXNzYWdlcworICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbWF4IHNpemUgb2YgYWxsIGxpdmUgbWVzc2FnZXMKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3NpemUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiB1bml4IGZkcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBhbGwgbWVzc2FnZXMKKyAqIHJlY2VpdmVkIG9uIHRoaXMgY29ubmVjdGlvbi4gTWVzc2FnZXMgY291bnQgdG93YXJkIHRoZSBtYXhpbXVtIHVudGlsCisgKiB0aGV5IGFyZSBmaW5hbGl6ZWQuIFdoZW4gdGhlIG1heGltdW0gaXMgcmVhY2hlZCwgdGhlIGNvbm5lY3Rpb24gd2lsbAorICogbm90IHJlYWQgbW9yZSBkYXRhIHVudGlsIHNvbWUgbWVzc2FnZXMgYXJlIGZpbmFsaXplZC4KKyAqCisgKiBUaGUgc2VtYW50aWNzIGFyZSBhbmFsb2dvdXMgdG8gdGhvc2Ugb2YgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbiB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGFsbCBvdXRzdGFuZGluZyBtZXNzYWdlcworICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIHNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbWF4IHVuaXggZmRzIG9mIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB0aGUgYXBwcm94aW1hdGUgc2l6ZSBpbiBieXRlcyBvZiBhbGwgbWVzc2FnZXMgaW4gdGhlIG91dGdvaW5nCisgKiBtZXNzYWdlIHF1ZXVlLiBUaGUgc2l6ZSBpcyBhcHByb3hpbWF0ZSBpbiB0aGF0IHlvdSBzaG91bGRuJ3QgdXNlCisgKiBpdCB0byBkZWNpZGUgaG93IG1hbnkgYnl0ZXMgdG8gcmVhZCBvZmYgdGhlIG5ldHdvcmsgb3IgYW55dGhpbmcKKyAqIG9mIHRoYXQgbmF0dXJlLCBhcyBvcHRpbWl6YXRpb25zIG1heSBjaG9vc2UgdG8gdGVsbCBzbWFsbCB3aGl0ZSBsaWVzCisgKiB0byBhdm9pZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXAgYnV0IG5vdCBzZW50CisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX3BlYWtfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX3BlYWtfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X3BlYWtfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9wZWFrX2ZkcykKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoaW5fbWVzc2FnZXMgIT0gTlVMTCkKKyAgICAqaW5fbWVzc2FnZXMgPSBjb25uZWN0aW9uLT5uX2luY29taW5nOworCisgIF9kYnVzX3RyYW5zcG9ydF9nZXRfc3RhdHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYnl0ZXMsIGluX2ZkcywgaW5fcGVha19ieXRlcywgaW5fcGVha19mZHMpOworCisgIGlmIChvdXRfbWVzc2FnZXMgIT0gTlVMTCkKKyAgICAqb3V0X21lc3NhZ2VzID0gY29ubmVjdGlvbi0+bl9vdXRnb2luZzsKKworICBpZiAob3V0X2J5dGVzICE9IE5VTEwpCisgICAgKm91dF9ieXRlcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIGlmIChvdXRfZmRzICE9IE5VTEwpCisgICAgKm91dF9mZHMgPSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob3V0X3BlYWtfYnl0ZXMgIT0gTlVMTCkKKyAgICAqb3V0X3BlYWtfYnl0ZXMgPSBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3NpemVfdmFsdWUgKGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIGlmIChvdXRfcGVha19mZHMgIT0gTlVMTCkKKyAgICAqb3V0X3BlYWtfZmRzID0gX2RidXNfY291bnRlcl9nZXRfcGVha191bml4X2ZkX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfU1RBVFMgKi8KKworLyoqCisgKiBHZXRzIHRoZSBhcHByb3hpbWF0ZSBudW1iZXIgb2YgdW5pIGZkcyBvZiBhbGwgbWVzc2FnZXMgaW4gdGhlCisgKiBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuaXggZmRzIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCB1cCBidXQgbm90IHNlbnQKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ191bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKy8qKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNwb3J0IG9iamVjdCBvZiB0aGlzIGNvbm5lY3Rpb24KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIGFkZHJlc3Mgc3RyaW5nCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19jb25uZWN0aW9uX2dldF9hZGRyZXNzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgcmV0dXJuIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWRkcmVzcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKK30KKyNlbmRpZgorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jb25uZWN0aW9uLmggYi9kYnVzL2RidXMtY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGQwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNDk2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY29ubmVjdGlvbi5oIERCdXNDb25uZWN0aW9uIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0NPTk5FQ1RJT05fSAorI2RlZmluZSBEQlVTX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGFyZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNDb25uZWN0aW9uCisgKiBAeworICovCisKKy8qIGRvY3VtZW50ZWQgaW4gZGJ1cy13YXRjaC5jICovCit0eXBlZGVmIHN0cnVjdCBEQnVzV2F0Y2ggREJ1c1dhdGNoOworLyogZG9jdW1lbnRlZCBpbiBkYnVzLXRpbWVvdXQuYyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RpbWVvdXQgREJ1c1RpbWVvdXQ7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIHByZWFsbG9jYXRlZCByZXNvdXJjZXMgc28gYSBtZXNzYWdlIGNhbiBiZSBzZW50IHdpdGhvdXQgZnVydGhlciBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQcmVhbGxvY2F0ZWRTZW5kIERCdXNQcmVhbGxvY2F0ZWRTZW5kOworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhIG1ldGhvZCBjYWxsIHRoYXQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSByZXBseS4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQZW5kaW5nQ2FsbCBEQnVzUGVuZGluZ0NhbGw7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhcHBsaWNhdGlvbiBhbmQgYXNzb2NpYXRlZCBpbmNvbWluZy9vdXRnb2luZyBtZXNzYWdlIHF1ZXVlcy4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNDb25uZWN0aW9uIERCdXNDb25uZWN0aW9uOworLyoqIFNldCBvZiBmdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSBtZXNzYWdlcyBzZW50IHRvIGEgcGFydGljdWxhciBvYmplY3QgcGF0aC4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNPYmplY3RQYXRoVlRhYmxlIERCdXNPYmplY3RQYXRoVlRhYmxlOworCisvKioKKyAqIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIGEgI0RCdXNXYXRjaC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfV0FUQ0hfUkVBREFCTEUgPSAxIDw8IDAsIC8qKjwgQXMgaW4gUE9MTElOICovCisgIERCVVNfV0FUQ0hfV1JJVEFCTEUgPSAxIDw8IDEsIC8qKjwgQXMgaW4gUE9MTE9VVCAqLworICBEQlVTX1dBVENIX0VSUk9SICAgID0gMSA8PCAyLCAvKio8IEFzIGluIFBPTExFUlIgKGNhbid0IHdhdGNoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMsIGJ1dCBjYW4gYmUgcHJlc2VudCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGN1cnJlbnQgc3RhdGUgcGFzc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGJ1c193YXRjaF9oYW5kbGUoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQlVTX1dBVENIX0hBTkdVUCAgID0gMSA8PCAzICAvKio8IEFzIGluIFBPTExIVVAgKGNhbid0IHdhdGNoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGl0LCBidXQgY2FuIGJlIHByZXNlbnQgaW4gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHN0YXRlIHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRidXNfd2F0Y2hfaGFuZGxlKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW50ZXJuYWwgdG8gbGliZGJ1cywgdGhlcmUgaXMgYWxzbyBfREJVU19XQVRDSF9OVkFMIGluIGRidXMtd2F0Y2guaCAqLworfSBEQnVzV2F0Y2hGbGFnczsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBpbmNvbWluZyBkYXRhIG9uIGEgI0RCdXNDb25uZWN0aW9uLiBUaGlzIGRldGVybWluZXMgd2hldGhlcgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgbmVlZHMgdG8gYmUgY2FsbGVkLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMsICAvKio8IFRoZXJlIGlzIG1vcmUgZGF0YSB0byBwb3RlbnRpYWxseSBjb252ZXJ0IHRvIG1lc3NhZ2VzLiAqLworICBEQlVTX0RJU1BBVENIX0NPTVBMRVRFLCAgICAgIC8qKjwgQWxsIGN1cnJlbnRseSBhdmFpbGFibGUgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQuICovCisgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkgICAgLyoqPCBNb3JlIG1lbW9yeSBpcyBuZWVkZWQgdG8gY29udGludWUuICovCit9IERCdXNEaXNwYXRjaFN0YXR1czsKKworLyoqIENhbGxlZCB3aGVuIGxpYmRidXMgbmVlZHMgYSBuZXcgd2F0Y2ggdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZSBtYWluCisgKiBsb29wLiBSZXR1cm5zICNGQUxTRSBpZiBpdCBsYWNrcyBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0aGUKKyAqIHdhdGNoLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBZGRXYXRjaEZ1bmN0aW9uKSAgICAgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkgbWF5IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZQorICogIHRoYW4gaXQgZGlkIGJlZm9yZS4gIFNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpCisgKiAgb3IgZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbikgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5vIGxvbmdlciBuZWVkcyBhIHdhdGNoIHRvIGJlIG1vbml0b3JlZCBieSB0aGUKKyAqIG1haW4gbG9vcC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgb3IKKyAqIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbikgICAgKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBuZWVkcyBhIG5ldyB0aW1lb3V0IHRvIGJlIG1vbml0b3JlZCBieSB0aGUgbWFpbgorICogbG9vcC4gUmV0dXJucyAjRkFMU0UgaWYgaXQgbGFja3MgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGhlCisgKiB3YXRjaC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FkZFRpbWVvdXRGdW5jdGlvbikgICAgIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gZGJ1c190aW1lb3V0X2dldF9lbmFibGVkKCkgbWF5IHJldHVybiBhIGRpZmZlcmVudAorICogdmFsdWUgdGhhbiBpdCBkaWQgYmVmb3JlLgorICogU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24pIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBubyBsb25nZXIgbmVlZHMgYSB0aW1lb3V0IHRvIGJlIG1vbml0b3JlZCBieSB0aGUKKyAqIG1haW4gbG9vcC4gU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbikgIChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKiogQ2FsbGVkIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBvZiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpCisgKiBtYXkgaGF2ZSBjaGFuZ2VkLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIG5ld19zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgbWFpbiBsb29wJ3MgdGhyZWFkIHNob3VsZCBiZSBub3RpZmllZCB0aGF0IHRoZXJlJ3Mgbm93IHdvcmsKKyAqIHRvIGRvLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dha2V1cE1haW5GdW5jdGlvbikgICAgICh2b2lkICAgICAgICAgICAqZGF0YSk7CisKKy8qKgorICogQ2FsbGVkIGR1cmluZyBhdXRoZW50aWNhdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBVTklYIHVzZXIKKyAqIElEIGlzIGFsbG93ZWQgdG8gY29ubmVjdCwgaWYgdGhlIGNsaWVudCB0cmllZCB0byBhdXRoIGFzIGEgVU5JWAorICogdXNlciBJRC4gTm9ybWFsbHkgb24gV2luZG93cyB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbi4gU2V0IHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uKCkuCisgKi8gCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24pICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKKy8qKgorICogQ2FsbGVkIGR1cmluZyBhdXRoZW50aWNhdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBXaW5kb3dzIHVzZXIKKyAqIElEIGlzIGFsbG93ZWQgdG8gY29ubmVjdCwgaWYgdGhlIGNsaWVudCB0cmllZCB0byBhdXRoIGFzIGEgV2luZG93cworICogdXNlciBJRC4gTm9ybWFsbHkgb24gVU5JWCB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbi4gU2V0IHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKi8gCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24pICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnVzZXJfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKworCisvKioKKyAqIENhbGxlZCB3aGVuIGEgcGVuZGluZyBjYWxsIG5vdyBoYXMgYSByZXBseSBhdmFpbGFibGUuIFNldCB3aXRoCisgKiBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5KCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbikgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgbmVlZHMgdG8gYmUgaGFuZGxlZC4gVGhlIHJlc3VsdCBpbmRpY2F0ZXMgd2hldGhlciBvcgorICogbm90IG1vcmUgaGFuZGxlcnMgc2hvdWxkIGJlIHJ1bi4gU2V0IHdpdGggZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIoKS4KKyAqLwordHlwZWRlZiBEQnVzSGFuZGxlclJlc3VsdCAoKiBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworREJVU19FWFBPUlQKK0RCdXNDb25uZWN0aW9uKiAgICBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAgICAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24qICAgIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiogICAgZGJ1c19jb25uZWN0aW9uX3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitjaGFyKiAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgZXhpdF9vbl9kaXNjb25uZWN0KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZSAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqICAgICAgIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogICAgICAgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitEQnVzRGlzcGF0Y2hTdGF0dXMgZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitEQnVzRGlzcGF0Y2hTdGF0dXMgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmQgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgKmNsaWVudF9zZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5ICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICoqcGVuZGluZ19yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UgKiAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24gICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dha2V1cE1haW5GdW5jdGlvbiAgICAgIHdha2V1cF9tYWluX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnVpZCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnBpZCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgICAgICAgICpkYXRhX3NpemUpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKip3aW5kb3dzX3NpZF9wKTsgCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworCisvKiBGaWx0ZXJzICovCisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisKKy8qIE90aGVyICovCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2NoYW5nZV9zaWdwaXBlIChkYnVzX2Jvb2xfdCAgICAgICB3aWxsX21vZGlmeV9zaWdwaXBlKTsgCisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSk7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKTsKK0RCVVNfRVhQT1JUCitsb25nIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ191bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAorREJ1c1ByZWFsbG9jYXRlZFNlbmQqIGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICpjbGllbnRfc2VyaWFsKTsKKworCisvKiBPYmplY3QgdHJlZSBmdW5jdGlvbmFsaXR5ICovCisKKy8qKgorICogQ2FsbGVkIHdoZW4gYSAjREJ1c09iamVjdFBhdGhWVGFibGUgaXMgdW5yZWdpc3RlcmVkIChvciBpdHMgY29ubmVjdGlvbiBpcyBmcmVlZCkuCisgKiBGb3VuZCBpbiAjREJ1c09iamVjdFBhdGhWVGFibGUuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICAgKCogREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworLyoqCisgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCB0byBhIHJlZ2lzdGVyZWQgb2JqZWN0IHBhdGguIEZvdW5kIGluCisgKiAjREJ1c09iamVjdFBhdGhWVGFibGUgd2hpY2ggaXMgcmVnaXN0ZXJlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpCisgKiBvciBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqLwordHlwZWRlZiBEQnVzSGFuZGxlclJlc3VsdCAoKiBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbikgICAgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSBhIHBvcnRpb24gb2YgdGhlCisgKiBvYmplY3QgcGF0aCBoaWVyYXJjaHkuIEF0dGFjaCB0aGUgdnRhYmxlIHRvIGEgcGFydGljdWxhciBwYXRoIHVzaW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKSBvcgorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuCisgKi8KK3N0cnVjdCBEQnVzT2JqZWN0UGF0aFZUYWJsZQoreworICBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbiAgIHVucmVnaXN0ZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGhhbmRsZXIgKi8KKyAgREJ1c09iamVjdFBhdGhNZXNzYWdlRnVuY3Rpb24gICAgICBtZXNzYWdlX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcyAqLworICAKKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDEpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogZGJ1c19pbnRlcm5hbF9wYWQyKSAodm9pZCAqKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkMykgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDQpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCit9OworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjayAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICoqZGF0YV9wKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9saXN0X3JlZ2lzdGVyZWQgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmZkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAqZmQpOworCisvKiogQH0gKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNXYXRjaAorICogQHsKKyAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9ERVBSRUNBVEVECitEQlVTX0VYUE9SVAorREJVU19ERVBSRUNBVEVEIGludCBkYnVzX3dhdGNoX2dldF9mZCAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CisjZW5kaWYKKworREJVU19FWFBPUlQKK2ludCAgICAgICAgICBkYnVzX3dhdGNoX2dldF91bml4X2ZkIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCit1bnNpZ25lZCBpbnQgZGJ1c193YXRjaF9nZXRfZmxhZ3MgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgICBkYnVzX3dhdGNoX2dldF9kYXRhICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfd2F0Y2hfc2V0X2RhdGEgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c193YXRjaF9oYW5kbGUgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZmxhZ3MpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaW1lb3V0CisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX3RpbWVvdXRfZ2V0X2RhdGEgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3RpbWVvdXRfc2V0X2RhdGEgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c190aW1lb3V0X2hhbmRsZSAgICAgICAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DT05ORUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmMgYi9kYnVzL2RidXMtY3JlZGVudGlhbHMtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDcyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY3JlZGVudGlhbHMtdXRpbC5jCkBAIC0wLDAgKzEsMjA1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY3JlZGVudGlhbHMtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtY3JlZGVudGlhbHMuYywgYnV0IG9ubHkgdXNlZCBmb3IgdGVzdHMvYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0NyZWRlbnRpYWxzCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgREJ1c0NyZWRlbnRpYWxzKgorbWFrZV9jcmVkZW50aWFscyhkYnVzX3VpZF90ICB1bml4X3VpZCwKKyAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgcGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aW5kb3dzX3NpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsKKworICBjcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKworICBpZiAodW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1bml4X3VpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGlmIChwaWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgcGlkKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHdpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLCB3aW5kb3dzX3NpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBjcmVkZW50aWFsczsKK30KKworI2RlZmluZSBTQU1QTEVfU0lEICJ3aGF0ZXZlciBhIHdpbmRvd3Mgc2lkIGxvb2tzIGxpa2UiCisjZGVmaW5lIE9USEVSX1NBTVBMRV9TSUQgIndoYXRldmVyIGVsc2UiCisKK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc190ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzMjsKKyAgCisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY3JlZHMgPSBtYWtlX2NyZWRlbnRpYWxzICgxMiwgNTExLCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgLyogdGVzdCByZWZjb3VudGluZyAqLworICBfZGJ1c19jcmVkZW50aWFsc19yZWYgKGNyZWRzKTsKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZHMpID09IDEyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfcGlkIChjcmVkcykgPT0gNTExKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoY3JlZHMpLCBTQU1QTEVfU0lEKSA9PSAwKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGNyZWRzKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRzKSk7CisKKyAgLyogVGVzdCBjb3B5ICovCisgIGNyZWRzMiA9IF9kYnVzX2NyZWRlbnRpYWxzX2NvcHkgKGNyZWRzKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMyLCBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZHMyKSA9PSAxMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3BpZCAoY3JlZHMyKSA9PSA1MTEpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChjcmVkczIpLCBTQU1QTEVfU0lEKSA9PSAwKTsgIAorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKyAgCisgIC8qIFNhbWUgdXNlciBpZiBib3RoIHVuaXggYW5kIHdpbmRvd3MgYXJlIHRoZSBzYW1lICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCBEQlVTX1BJRF9VTlNFVCwgU0FNUExFX1NJRCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIFdpbmRvd3MgaXMgbWlzc2luZyAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzICgxMiwgREJVU19QSURfVU5TRVQsIE5VTEwpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBXaW5kb3dzIGlzIGRpZmZlcmVudCAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzICgxMiwgREJVU19QSURfVU5TRVQsIE9USEVSX1NBTVBMRV9TSUQpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgVW5peCBpcyBtaXNzaW5nICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKERCVVNfVUlEX1VOU0VULCBEQlVTX1BJRF9VTlNFVCwgU0FNUExFX1NJRCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIFVuaXggaXMgZGlmZmVyZW50ICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDE1LCBEQlVTX1BJRF9VTlNFVCwgU0FNUExFX1NJRCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBib3RoIGFyZSBtaXNzaW5nICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKERCVVNfVUlEX1VOU0VULCBEQlVTX1BJRF9VTlNFVCwgTlVMTCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIENsZWFyaW5nIGNyZWRlbnRpYWxzIHdvcmtzICovCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChjcmVkcyk7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChjcmVkcykgPT0gREJVU19VSURfVU5TRVQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF9waWQgKGNyZWRzKSA9PSBEQlVTX1BJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChjcmVkcykgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGNyZWRzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoY3JlZHMpKTsKKworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMgYi9kYnVzL2RidXMtY3JlZGVudGlhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFiYjAwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy5jIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNDcmVkZW50aWFscyBDcmVkZW50aWFscyBwcm92YWJsZSB0aHJvdWdoIGF1dGhlbnRpY2F0aW9uCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDcmVkZW50aWFscyBvYmplY3QKKyAqCisgKiBDcmVkZW50aWFscyBhcmUgd2hhdCB5b3UgaGF2ZSB0byBwcm92ZSB5b3UgaGF2ZSBpbiBvcmRlciB0bworICogYXV0aGVudGljYXRlLiAgVGhlIG1haW4gY3JlZGVudGlhbHMgcmlnaHQgbm93IGFyZSBhIHVuaXggdXNlcgorICogYWNjb3VudCwgYSBXaW5kb3dzIHVzZXIgYWNjb3VudCwgb3IgYSBVTklYIHByb2Nlc3MgSUQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0NyZWRlbnRpYWxzSW50ZXJuYWxzIENyZWRlbnRpYWxzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0NyZWRlbnRpYWxzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBQcml2YXRlIGRldGFpbHMgb2YgY3JlZGVudGlhbHMgY29kZS4KKyAqCisgKiBAeworICovCisKK3N0cnVjdCBEQnVzQ3JlZGVudGlhbHMgeworICBpbnQgcmVmY291bnQ7CisgIGRidXNfdWlkX3QgdW5peF91aWQ7CisgIGRidXNfcGlkX3QgcGlkOworICBjaGFyICp3aW5kb3dzX3NpZDsKKyAgY2hhciAqbGludXhfc2VjdXJpdHlfbGFiZWw7CisgIHZvaWQgKmFkdF9hdWRpdF9kYXRhOworICBkYnVzX2ludDMyX3QgYWR0X2F1ZGl0X2RhdGFfc2l6ZTsKK307CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNDcmVkZW50aWFscworICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19uZXcgKHZvaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisKKyAgY3JlZHMgPSBkYnVzX25ldyAoREJ1c0NyZWRlbnRpYWxzLCAxKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBjcmVkcy0+cmVmY291bnQgPSAxOworICBjcmVkcy0+dW5peF91aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgY3JlZHMtPnBpZCA9IERCVVNfUElEX1VOU0VUOworICBjcmVkcy0+d2luZG93c19zaWQgPSBOVUxMOworICBjcmVkcy0+bGludXhfc2VjdXJpdHlfbGFiZWwgPSBOVUxMOworICBjcmVkcy0+YWR0X2F1ZGl0X2RhdGEgPSBOVUxMOworICBjcmVkcy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZSA9IDA7CisKKyAgcmV0dXJuIGNyZWRzOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggY3JlZGVudGlhbHMgKHVzZXIgSUQgYW5kIHByb2Nlc3MgSUQpIGZyb20gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKHZvaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisKKyAgY3JlZHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChjcmVkcykpCisgICAgeworICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHJldHVybiBjcmVkczsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgcmVmY291bnQgb24gY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfcmVmIChEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBfZGJ1c19hc3NlcnQgKGNyZWRlbnRpYWxzLT5yZWZjb3VudCA+IDApOworICBjcmVkZW50aWFscy0+cmVmY291bnQgKz0gMTsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgcmVmY291bnQgb24gY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMtPnJlZmNvdW50ID4gMCk7CisKKyAgY3JlZGVudGlhbHMtPnJlZmNvdW50IC09IDE7CisgIGlmIChjcmVkZW50aWFscy0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCk7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCk7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRkIGEgVU5JWCBwcm9jZXNzIElEIHRvIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHBpZCB0aGUgcHJvY2VzcyBJRAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX3BpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgICAgcGlkKQoreworICBjcmVkZW50aWFscy0+cGlkID0gcGlkOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGQgYSBVTklYIHVzZXIgSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgIHVpZCkKK3sKKyAgY3JlZGVudGlhbHMtPnVuaXhfdWlkID0gdWlkOworICByZXR1cm4gVFJVRTsKKworfQorCisvKioKKyAqIEFkZCBhIFdpbmRvd3MgdXNlciBTSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gd2luZG93c19zaWQgdGhlIHVzZXIgU0lECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqd2luZG93c19zaWQpCit7CisgIGNoYXIgKmNvcHk7CisKKyAgY29weSA9IF9kYnVzX3N0cmR1cCAod2luZG93c19zaWQpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCk7CisgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9IGNvcHk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkIGEgTGludXggc2VjdXJpdHkgbGFiZWwsIGFzIHVzZWQgYnkgTFNNcyBzdWNoIGFzIFNFTGludXgsIFNtYWNrIGFuZAorICogQXBwQXJtb3IsIHRvIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2xpbnV4X3NlY3VyaXR5X2xhYmVsIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmxhYmVsKQoreworICBjaGFyICpjb3B5OworCisgIGNvcHkgPSBfZGJ1c19zdHJkdXAgKGxhYmVsKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGJ1c19mcmVlIChjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwpOworICBjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwgPSBjb3B5OworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZCBBRFQgYXVkaXQgZGF0YSB0byB0aGUgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSBhdWRpdF9kYXRhIHRoZSBhdWRpdCBkYXRhCisgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIG9mIGF1ZGl0IGRhdGEKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9hZHRfYXVkaXRfZGF0YSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICphdWRpdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgIHNpemUpCit7CisgIHZvaWQgKmNvcHk7CisgIGNvcHkgPSBfZGJ1c19tZW1kdXAgKGF1ZGl0X2RhdGEsIHNpemUpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSk7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSA9IGNvcHk7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplID0gc2l6ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gY3JlZGVudGlhbCBpcyBwcmVzZW50LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gdHlwZSB0aGUgY3JlZGVudGlhbCB0byBjaGVjayBmb3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjcmVkZW50aWFsIGlzIHByZXNlbnQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbFR5cGUgIHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT5waWQgIT0gREJVU19QSURfVU5TRVQ7CisgICAgY2FzZSBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+d2luZG93c19zaWQgIT0gTlVMTDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9MSU5VWF9TRUNVUklUWV9MQUJFTDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwgIT0gTlVMTDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgIT0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5rbm93biBjcmVkZW50aWFsIGVudW0gdmFsdWUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgdGhlIFVOSVggcHJvY2VzcyBJRCBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNEQlVTX1BJRF9VTlNFVCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBVTklYIHByb2Nlc3MgSUQKKyAqLworZGJ1c19waWRfdAorX2RidXNfY3JlZGVudGlhbHNfZ2V0X3BpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT5waWQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgVU5JWCB1c2VyIElEIGluIHRoZSBjcmVkZW50aWFscywgb3IgI0RCVVNfVUlEX1VOU0VUIGlmCisgKiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBhIHVzZXIgSUQuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIFVOSVggdXNlciBJRAorICovCitkYnVzX3VpZF90CitfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+dW5peF91aWQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgV2luZG93cyB1c2VyIFNJRCBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNOVUxMIGlmCisgKiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBhIFdpbmRvd3MgdXNlciBTSUQuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIFdpbmRvd3MgdXNlciBTSUQKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBMaW51eCBzZWN1cml0eSBsYWJlbCAoYXMgdXNlZCBieSBMU01zKSBmcm9tIHRoZSBjcmVkZW50aWFscywKKyAqIG9yICNOVUxMIGlmIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIGEgc2VjdXJpdHkgbGFiZWwuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIHRoZSBzZWN1cml0eSBsYWJlbAorICovCitjb25zdCBjaGFyICoKK19kYnVzX2NyZWRlbnRpYWxzX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBBRFQgYXVkaXQgZGF0YSBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNOVUxMIGlmCisgKiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBBRFQgYXVkaXQgZGF0YS4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgU29sYXJpcyBBRFQgYXVkaXQgZGF0YSAKKyAqLwordm9pZCAqCitfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGEgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGE7Cit9CisKKy8qKgorICogR2V0cyB0aGUgQURUIGF1ZGl0IGRhdGEgc2l6ZSBpbiB0aGUgY3JlZGVudGlhbHMsIG9yIDAgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIEFEVCBhdWRpdCBkYXRhLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBTb2xhcmlzIEFEVCBhdWRpdCBkYXRhIHNpemUKKyAqLworZGJ1c19pbnQzMl90IAorX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhX3NpemUgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgZmlyc3QgY3JlZGVudGlhbHMgb2JqZWN0IGNvbnRhaW5zCisgKiBhbGwgdGhlIGNyZWRlbnRpYWxzIGZvdW5kIGluIHRoZSBzZWNvbmQgY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gcG9zc2libGVfc3Vic2V0IHNlZSBpZiBjcmVkZW50aWFscyBpbiBoZXJlIGFyZSBhbHNvIGluIHRoZSBmaXJzdCBhcmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHNlY29uZCBhcmcgaXMgY29udGFpbmVkIGluIGZpcnN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqcG9zc2libGVfc3Vic2V0KQoreworICByZXR1cm4KKyAgICAocG9zc2libGVfc3Vic2V0LT5waWQgPT0gREJVU19QSURfVU5TRVQgfHwKKyAgICAgcG9zc2libGVfc3Vic2V0LT5waWQgPT0gY3JlZGVudGlhbHMtPnBpZCkgJiYKKyAgICAocG9zc2libGVfc3Vic2V0LT51bml4X3VpZCA9PSBEQlVTX1VJRF9VTlNFVCB8fAorICAgICBwb3NzaWJsZV9zdWJzZXQtPnVuaXhfdWlkID09IGNyZWRlbnRpYWxzLT51bml4X3VpZCkgJiYKKyAgICAocG9zc2libGVfc3Vic2V0LT53aW5kb3dzX3NpZCA9PSBOVUxMIHx8CisgICAgIChjcmVkZW50aWFscy0+d2luZG93c19zaWQgJiYgc3RyY21wIChwb3NzaWJsZV9zdWJzZXQtPndpbmRvd3Nfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKSA9PSAwKSkgJiYKKyAgICAocG9zc2libGVfc3Vic2V0LT5saW51eF9zZWN1cml0eV9sYWJlbCA9PSBOVUxMIHx8CisgICAgIChjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwgIT0gTlVMTCAmJgorICAgICAgc3RyY21wIChwb3NzaWJsZV9zdWJzZXQtPmxpbnV4X3NlY3VyaXR5X2xhYmVsLAorICAgICAgICAgICAgICBjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwpID09IDApKSAmJgorICAgIChwb3NzaWJsZV9zdWJzZXQtPmFkdF9hdWRpdF9kYXRhID09IE5VTEwgfHwKKyAgICAgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSAmJiBtZW1jbXAgKHBvc3NpYmxlX3N1YnNldC0+YWR0X2F1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZSkgPT0gMCkpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgY3JlZGVudGlhbHMgb2JqZWN0IGNvbnRhaW5zIGFueXRoaW5nLgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgYXJlIG5vIGNyZWRlbnRpYWxzIGluIHRoZSBvYmplY3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuCisgICAgY3JlZGVudGlhbHMtPnBpZCA9PSBEQlVTX1BJRF9VTlNFVCAmJgorICAgIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9PSBEQlVTX1VJRF9VTlNFVCAmJgorICAgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9PSBOVUxMICYmCisgICAgY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsID09IE5VTEwgJiYKKyAgICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgPT0gTlVMTDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGNyZWRlbnRpYWxzIG9iamVjdCBjb250YWlucyBhIHVzZXIgaWRlbnRpdHkuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBhcmUgbm8gdXNlciBpZGVudGl0aWVzIGluIHRoZSBvYmplY3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybgorICAgIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9PSBEQlVTX1VJRF9VTlNFVCAmJgorICAgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9PSBOVUxMOworfQorCisvKioKKyAqIE1lcmdlIGFsbCBjcmVkZW50aWFscyBmb3VuZCBpbiB0aGUgc2Vjb25kIG9iamVjdCBpbnRvIHRoZSBmaXJzdCBvYmplY3QsCisgKiBvdmVyd3JpdGluZyB0aGUgZmlyc3Qgb2JqZWN0IGlmIHRoZXJlIGFyZSBhbnkgb3ZlcmxhcHMuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gb3RoZXJfY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gbWVyZ2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscykKK3sKKyAgcmV0dXJuCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscykgJiYKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKSAmJgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscykgJiYKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9MSU5VWF9TRUNVUklUWV9MQUJFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMpICYmCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBNZXJnZSB0aGUgZ2l2ZW4gY3JlZGVudGlhbCBmb3VuZCBpbiB0aGUgc2Vjb25kIG9iamVjdCBpbnRvIHRoZSBmaXJzdCBvYmplY3QsCisgKiBvdmVyd3JpdGluZyB0aGUgZmlyc3Qgb2JqZWN0J3MgdmFsdWUgZm9yIHRoYXQgY3JlZGVudGlhbC4KKyAqCisgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIHNlY29uZCBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIGNyZWRlbnRpYWwuCisgKiBpLmUuLCB3aWxsIG5ldmVyIGRlbGV0ZSBhIGNyZWRlbnRpYWwgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHdoaWNoIHRoZSBjcmVkZW50aWFsIHRvIG92ZXJ3cml0ZQorICogQHBhcmFtIG90aGVyX2NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIG1lcmdlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbFR5cGUgIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpCit7CisgIGlmICh3aGljaCA9PSBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEICYmCisgICAgICBvdGhlcl9jcmVkZW50aWFscy0+cGlkICE9IERCVVNfUElEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3BpZCAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT5waWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmICh3aGljaCA9PSBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEICYmCisgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT51bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZCAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT51bml4X3VpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHdoaWNoID09IERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCAmJgorICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscy0+d2luZG93c19zaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IAorICBlbHNlIGlmICh3aGljaCA9PSBEQlVTX0NSRURFTlRJQUxfTElOVVhfU0VDVVJJVFlfTEFCRUwgJiYKKyAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfbGludXhfc2VjdXJpdHlfbGFiZWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lEICYmCisgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSAhPSBOVUxMKSAKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9hZHRfYXVkaXRfZGF0YSAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSwgb3RoZXJfY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsZWFyIGFsbCBjcmVkZW50aWFscyBpbiB0aGUgb2JqZWN0LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgY3JlZGVudGlhbHMtPnBpZCA9IERCVVNfUElEX1VOU0VUOworICBjcmVkZW50aWFscy0+dW5peF91aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgZGJ1c19mcmVlIChjcmVkZW50aWFscy0+d2luZG93c19zaWQpOworICBjcmVkZW50aWFscy0+d2luZG93c19zaWQgPSBOVUxMOworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCk7CisgIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCA9IE5VTEw7CisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhID0gTlVMTDsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUgPSAwOworfQorCisvKioKKyAqIENvcHkgYSBjcmVkZW50aWFscyBvYmplY3QuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgY29weSBvciAjTlVMTAorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19jb3B5IChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNvcHk7CisKKyAgY29weSA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoY29weSwgY3JlZGVudGlhbHMpKQorICAgIHsKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjb3B5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZSB1c2VyLWlkZW50aWZ5aW5nIGNyZWRlbnRpYWxzIGluIHR3byBjcmVkZW50aWFscworICogb2JqZWN0cyBhcmUgaWRlbnRpY2FsLiBDcmVkZW50aWFscyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGUKKyAqIHVzZXIgYXJlIGlnbm9yZWQsIGJ1dCBhbnkga2luZCBvZiB1c2VyIElEIGNyZWRlbnRpYWxzIG11c3QgYmUgdGhlCisgKiBzYW1lIChVTklYIHVzZXIgSUQsIFdpbmRvd3MgdXNlciBTSUQsIGV0Yy4pIGFuZCBwcmVzZW50IGluIGJvdGgKKyAqIG9iamVjdHMgZm9yIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gI1RSVUUuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gb3RoZXJfY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gY29tcGFyZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHR3byBjcmVkZW50aWFscyByZWZlciB0byB0aGUgc2FtZSB1c2VyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpCit7CisgIC8qIGJvdGggd2luZG93cyBhbmQgdW5peCB1c2VyIG11c3QgYmUgdGhlIHNhbWUgKHRob3VnaCBwcmV0dHkgbXVjaAorICAgKiBpbiBhbGwgY29uY2VpdmFibGUgY2FzZXMsIG9uZSB3aWxsIGJlIHVuc2V0KQorICAgKi8KKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9PSBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQgJiYKKyAgICAoKCEoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkIHx8IG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkpIHx8CisgICAgIChjcmVkZW50aWFscy0+d2luZG93c19zaWQgJiYgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmCisgICAgICBzdHJjbXAgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCwgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKSA9PSAwKSk7Cit9CisKKy8qKgorICogQ29udmVydCB0aGUgY3JlZGVudGlhbHMgaW4gdGhpcyBvYmplY3QgdG8gYSBodW1hbi1yZWFkYWJsZQorICogc3RyaW5nIGZvcm1hdCwgYW5kIGFwcGVuZCB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gc3RyaW5nIGFwcGVuZCB0byB0aGlzIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfdG9fc3RyaW5nX2FwcGVuZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAqc3RyaW5nKQoreworICBkYnVzX2Jvb2xfdCBqb2luOworCisgIGpvaW4gPSBGQUxTRTsKKyAgaWYgKGNyZWRlbnRpYWxzLT51bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICJ1aWQ9IiBEQlVTX1VJRF9GT1JNQVQsIGNyZWRlbnRpYWxzLT51bml4X3VpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBpZiAoY3JlZGVudGlhbHMtPnBpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICIlc3BpZD0iIERCVVNfUElEX0ZPUk1BVCwgam9pbiA/ICIgIiA6ICIiLCBjcmVkZW50aWFscy0+cGlkKSkKKyAgICAgICAgZ290byBvb207CisgICAgICBqb2luID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICBqb2luID0gRkFMU0U7CisgIGlmIChjcmVkZW50aWFscy0+d2luZG93c19zaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICIlc3NpZD0lcyIsIGpvaW4gPyAiICIgOiAiIiwgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKSkKKyAgICAgICAgZ290byBvb207CisgICAgICBqb2luID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICBqb2luID0gRkFMU0U7CisKKyAgaWYgKGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0cmluZywgIiVzbHNtPSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbiA/ICIgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsKSkKKyAgICAgICAgZ290byBvb207CisgICAgICBqb2luID0gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Citvb206CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovCisKKy8qIHRlc3RzIGluIGRidXMtY3JlZGVudGlhbHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtY3JlZGVudGlhbHMuaCBiL2RidXMvZGJ1cy1jcmVkZW50aWFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjZjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY3JlZGVudGlhbHMuaApAQCAtMCwwICsxLDEwMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNyZWRlbnRpYWxzLmggQ3JlZGVudGlhbHMgcHJvdmFibGUgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19DUkVERU5USUFMU19ICisjZGVmaW5lIERCVVNfQ1JFREVOVElBTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0geworICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lELAorICBEQlVTX0NSRURFTlRJQUxfQURUX0FVRElUX0RBVEFfSUQsCisgIERCVVNfQ1JFREVOVElBTF9MSU5VWF9TRUNVUklUWV9MQUJFTCwKKyAgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lECit9IERCdXNDcmVkZW50aWFsVHlwZTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0NyZWRlbnRpYWxzKiBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0NyZWRlbnRpYWxzKiBfZGJ1c19jcmVkZW50aWFsc19uZXcgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19yZWYgICAgICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAgICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgICBwaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICB1aWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICp3aW5kb3dzX3NpZCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmxhYmVsKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqYXVkaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgIHNpemUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB0eXBlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfcGlkX3QgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3BpZCAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfdWlkX3QgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2NvbnN0IGNoYXIgKiAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK3ZvaWQgKiAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfaW50MzJfdCAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhX3NpemUgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0ICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqcG9zc2libGVfc3Vic2V0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX2VtcHR5ICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpOworLyogbXVzdCBzaWxlbnRseSBhbGxvdyAnd2hpY2gnIHRvIG5vdCBleGlzdCAqLworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfY29weSAgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc190b19zdHJpbmdfYXBwZW5kICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICpzdHJpbmcpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DUkVERU5USUFMU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZGF0YXNsb3QuYyBiL2RidXMvZGJ1cy1kYXRhc2xvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2M5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtZGF0YXNsb3QuYwpAQCAtMCwwICsxLDQ2MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWRhdGFzbG90LmMgIHN0b3JpbmcgZGF0YSBvbiBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtZGF0YXNsb3QuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0RhdGFTbG90IERhdGEgc2xvdHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgU3RvcmluZyBkYXRhIGJ5IElECisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHN0b3JpbmcgZGF0YSBieSBhbgorICogYWxsb2NhdGVkIElELiBUaGlzIGlzIHVzZWQgZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLAorICogZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKSwgZXRjLiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIGRhdGEgc2xvdCBhbGxvY2F0b3Igb2JqZWN0LCB1c2VkIHRvIGFzc2lnbgorICogaW50ZWdlciBJRHMgZm9yIGRhdGEgc2xvdHMuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yIHRvIGluaXRpYWxpemUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHbG9iYWxMb2NrICAgICAgICAgbG9jaykKK3sKKyAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMgPSBOVUxMOworICBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzID0gMDsKKyAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgPSAwOworICBhbGxvY2F0b3ItPmxvY2sgPSBsb2NrOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgZGF0YQorICogaW4gYSAjREJ1c0RhdGFTbG90TGlzdC4gSWYgdGhlIHZhbHVlIGF0ICpzbG90X2lkX3AgaXMKKyAqIG5vdCAtMSwgdGhpcyBmdW5jdGlvbiBqdXN0IGluY3JlbWVudHMgdGhlIHJlZmNvdW50IGZvcgorICogdGhlIGV4aXN0aW5nIHNsb3QgSUQuIElmIHRoZSB2YWx1ZSBpcyAtMSwgYSBuZXcgc2xvdCBJRAorICogaXMgYWxsb2NhdGVkIGFuZCBzdG9yZWQgYXQgKnNsb3RfaWRfcC4KKyAqIAorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yCisgKiBAcGFyYW0gc2xvdF9pZF9wIGFkZHJlc3MgdG8gZmlsbCB3aXRoIHRoZSBzbG90IElECisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgICAqc2xvdF9pZF9wKQoreworICBkYnVzX2ludDMyX3Qgc2xvdDsKKworICBpZiAoIV9kYnVzX2xvY2sgKGFsbG9jYXRvci0+bG9jaykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgqc2xvdF9pZF9wID49IDApCisgICAgeworICAgICAgc2xvdCA9ICpzbG90X2lkX3A7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICAgICAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID09IHNsb3QpOworICAgICAgCisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5yZWZjb3VudCArPSAxOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICgqc2xvdF9pZF9wIDwgMCk7CisgIAorICBpZiAoYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKQorICAgIHsKKyAgICAgIHNsb3QgPSAwOworICAgICAgd2hpbGUgKHNsb3QgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID0gc2xvdDsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPSAxOworICAgICAgICAgICAgICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyArPSAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICArK3Nsb3Q7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0FsbG9jYXRlZFNsb3QgKnRtcDsKKyAgICAgIAorICAgICAgc2xvdCA9IC0xOworICAgICAgdG1wID0gZGJ1c19yZWFsbG9jIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChEQnVzQWxsb2NhdGVkU2xvdCkgKiAoYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyArIDEpKTsKKyAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzID0gdG1wOworICAgICAgc2xvdCA9IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHM7CisgICAgICBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzICs9IDE7CisgICAgICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyArPSAxOworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9IHNsb3Q7CisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5yZWZjb3VudCA9IDE7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IDApOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPT0gMSk7CisgIAorICAqc2xvdF9pZF9wID0gc2xvdDsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJBbGxvY2F0ZWQgc2xvdCAlZCBvbiBhbGxvY2F0b3IgJXAgdG90YWwgJWQgc2xvdHMgYWxsb2NhdGVkICVkIHVzZWRcbiIsCisgICAgICAgICAgICAgICAgIHNsb3QsIGFsbG9jYXRvciwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cywgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMpOworICAKKyBvdXQ6CisgIF9kYnVzX3VubG9jayAoYWxsb2NhdG9yLT5sb2NrKTsKKyAgcmV0dXJuIHNsb3QgPj0gMDsKK30KKworLyoqCisgKiBEZWFsbG9jYXRlcyBhbiBJRCBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoCisgKiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jKCkuICBFeGlzdGluZyBkYXRhIHN0b3JlZCBvbgorICogZXhpc3RpbmcgI0RCdXNEYXRhU2xvdExpc3Qgb2JqZWN0cyB3aXRoIHRoaXMgSUQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZQorICogZGF0YSBsaXN0IGlzIGZpbmFsaXplZCwgYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUKKyAqIHJlcGxhY2VkIGlmIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuCisgKiBUaGUgc2xvdCB2YWx1ZSBpcyByZXNldCB0byAtMSBpZiB0aGlzIGlzIHRoZSBsYXN0IHVucmVmLgorICoKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvcgorICogQHBhcmFtIHNsb3RfaWRfcCBhZGRyZXNzIHdoZXJlIHdlIHN0b3JlIHRoZSBzbG90CisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgICAqc2xvdF9pZF9wKQoreworICBpZiAoIV9kYnVzX2xvY2sgKGFsbG9jYXRvci0+bG9jaykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid2Ugc2hvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgImJlZm9yZSB3ZSBhbGxvY2F0ZWQgdGhpcyBzbG90Iik7CisKKyAgX2RidXNfYXNzZXJ0ICgqc2xvdF9pZF9wIDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0uc2xvdF9pZCA9PSAqc2xvdF9pZF9wKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCA+IDApOworCisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnJlZmNvdW50ID4gMCkKKyAgICB7CisgICAgICBfZGJ1c191bmxvY2sgKGFsbG9jYXRvci0+bG9jayk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJlZmNvdW50IGlzIDAsIGZyZWUgdGhlIHNsb3QgKi8KKyAgX2RidXNfdmVyYm9zZSAoIkZyZWVpbmcgc2xvdCAlZCBvbiBhbGxvY2F0b3IgJXAgdG90YWwgJWQgYWxsb2NhdGVkICVkIHVzZWRcbiIsCisgICAgICAgICAgICAgICAgICpzbG90X2lkX3AsIGFsbG9jYXRvciwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cywgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMpOworICAKKyAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0uc2xvdF9pZCA9IC0xOworICAqc2xvdF9pZF9wID0gLTE7CisgIAorICBhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyAtPSAxOworICAKKyAgaWYgKGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzID09IDApCisgICAgeworICAgICAgZGJ1c19mcmVlIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cyk7CisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cyA9IE5VTEw7CisgICAgICBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzID0gMDsKKyAgICB9CisKKyAgX2RidXNfdW5sb2NrIChhbGxvY2F0b3ItPmxvY2spOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc2xvdCBsaXN0LgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gaW5pdGlhbGl6ZS4KKyAqLwordm9pZAorX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoREJ1c0RhdGFTbG90TGlzdCAqbGlzdCkKK3sKKyAgbGlzdC0+c2xvdHMgPSBOVUxMOworICBsaXN0LT5uX3Nsb3RzID0gMDsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIGluIHRoZSBkYXRhIHNsb3QgbGlzdCwgYWxvbmcgd2l0aCBhbiBvcHRpb25hbAorICogZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZyB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldAorICogYWdhaW4sIG9yIHdoZW4gdGhlIHNsb3QgbGlzdCBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlciBtdXN0CisgKiBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYygpIGZvciB0aGUKKyAqIHNhbWUgYWxsb2NhdG9yIHBhc3NlZCBpbiBoZXJlLiBUaGUgc2FtZSBhbGxvY2F0b3IgaGFzIHRvIGJlIHVzZWQKKyAqIHdpdGggdGhlIHNsb3QgbGlzdCBldmVyeSB0aW1lLgorICoKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvciB0byB1c2UKKyAqIEBwYXJhbSBsaXN0IHRoZSBkYXRhIHNsb3QgbGlzdAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZnJlZV9mdW5jIGZyZWUgZnVuY3Rpb24gZm9yIGFueSBwcmV2aW91c2x5LWV4aXN0aW5nIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSBwcmV2aW91c2x5LWV4aXN0aW5nIGRhdGEsIHNob3VsZCBiZSBmcmVlZCB3aXRoIG9sZF9mcmVlX2Z1bmMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgKm9sZF9mcmVlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhKQoreworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIC8qIFdlIG5lZWQgdG8gdGFrZSB0aGUgYWxsb2NhdG9yIGxvY2sgaGVyZSwgYmVjYXVzZSB0aGUgYWxsb2NhdG9yIGNvdWxkCisgICAqIGJlIGUuZy4gcmVhbGxvYygpaW5nIGFsbG9jYXRlZF9zbG90cy4gV2UgYXZvaWQgZG9pbmcgdGhpcyBpZiBhc3NlcnRzCisgICAqIGFyZSBkaXNhYmxlZCwgc2luY2UgdGhlbiB0aGUgYXNzZXJ0cyBhcmUgZW1wdHkuCisgICAqLworICBpZiAoIV9kYnVzX2xvY2sgKGFsbG9jYXRvci0+bG9jaykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid2Ugc2hvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgImJlZm9yZSB3ZSBhbGxvY2F0ZWQgdGhpcyBzbG90Iik7CisKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9PSBzbG90KTsKKyAgX2RidXNfdW5sb2NrIChhbGxvY2F0b3ItPmxvY2spOworI2VuZGlmCisgIAorICBpZiAoc2xvdCA+PSBsaXN0LT5uX3Nsb3RzKQorICAgIHsKKyAgICAgIERCdXNEYXRhU2xvdCAqdG1wOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIHRtcCA9IGRidXNfcmVhbGxvYyAobGlzdC0+c2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoREJ1c0RhdGFTbG90KSAqIChzbG90ICsgMSkpOworICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpc3QtPnNsb3RzID0gdG1wOworICAgICAgaSA9IGxpc3QtPm5fc2xvdHM7CisgICAgICBsaXN0LT5uX3Nsb3RzID0gc2xvdCArIDE7CisgICAgICB3aGlsZSAoaSA8IGxpc3QtPm5fc2xvdHMpCisgICAgICAgIHsKKyAgICAgICAgICBsaXN0LT5zbG90c1tpXS5kYXRhID0gTlVMTDsKKyAgICAgICAgICBsaXN0LT5zbG90c1tpXS5mcmVlX2RhdGFfZnVuYyA9IE5VTEw7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGxpc3QtPm5fc2xvdHMpOworCisgICpvbGRfZGF0YSA9IGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGE7CisgICpvbGRfZnJlZV9mdW5jID0gbGlzdC0+c2xvdHNbc2xvdF0uZnJlZV9kYXRhX2Z1bmM7CisKKyAgbGlzdC0+c2xvdHNbc2xvdF0uZGF0YSA9IGRhdGE7CisgIGxpc3QtPnNsb3RzW3Nsb3RdLmZyZWVfZGF0YV9mdW5jID0gZnJlZV9kYXRhX2Z1bmM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yIHNsb3Qgd2FzIGFsbG9jYXRlZCBmcm9tCisgKiBAcGFyYW0gbGlzdCB0aGUgZGF0YSBzbG90IGxpc3QKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK19kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0RhdGFTbG90TGlzdCAgICAgICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBzbG90KQoreworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIC8qIFdlIG5lZWQgdG8gdGFrZSB0aGUgYWxsb2NhdG9yIGxvY2sgaGVyZSwgYmVjYXVzZSB0aGUgYWxsb2NhdG9yIGNvdWxkCisgICAqIGJlIGUuZy4gcmVhbGxvYygpaW5nIGFsbG9jYXRlZF9zbG90cy4gV2UgYXZvaWQgZG9pbmcgdGhpcyBpZiBhc3NlcnRzCisgICAqIGFyZSBkaXNhYmxlZCwgc2luY2UgdGhlbiB0aGUgYXNzZXJ0cyBhcmUgZW1wdHkuCisgICAqLworICBpZiAoIV9kYnVzX2xvY2sgKGFsbG9jYXRvci0+bG9jaykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid2Ugc2hvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgImJlZm9yZSB3ZSBhbGxvY2F0ZWQgdGhpcyBzbG90Iik7CisKKyAgX2RidXNfYXNzZXJ0IChzbG90ID49IDApOworICBfZGJ1c19hc3NlcnQgKHNsb3QgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID09IHNsb3QpOworICBfZGJ1c191bmxvY2sgKGFsbG9jYXRvci0+bG9jayk7CisjZW5kaWYKKworICBpZiAoc2xvdCA+PSBsaXN0LT5uX3Nsb3RzKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGE7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGRhdGEgc2xvdHMgY29udGFpbmVkIGluIHRoZSBsaXN0LCBjYWxsaW5nCisgKiBhcHBsaWNhdGlvbi1wcm92aWRlZCBmcmVlIGZ1bmN0aW9ucyBpZiB0aGV5IGV4aXN0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGNsZWFyCisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsaXN0LT5uX3Nsb3RzKQorICAgIHsKKyAgICAgIGlmIChsaXN0LT5zbG90c1tpXS5mcmVlX2RhdGFfZnVuYykKKyAgICAgICAgKCogbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMpIChsaXN0LT5zbG90c1tpXS5kYXRhKTsKKyAgICAgIGxpc3QtPnNsb3RzW2ldLmRhdGEgPSBOVUxMOworICAgICAgbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMgPSBOVUxMOworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyB0aGUgZGF0YSBzbG90IGxpc3QgYW5kIGFsbCBkYXRhIHNsb3RzIGNvbnRhaW5lZAorICogaW4gaXQsIGNhbGxpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgZnJlZSBmdW5jdGlvbnMKKyAqIGlmIHRoZXkgZXhpc3QuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gZnJlZQorICovCit2b2lkCitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAobGlzdCk7CisgIAorICBkYnVzX2ZyZWUgKGxpc3QtPnNsb3RzKTsKKyAgbGlzdC0+c2xvdHMgPSBOVUxMOworICBsaXN0LT5uX3Nsb3RzID0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgZnJlZV9jb3VudGVyOworCitzdGF0aWMgdm9pZAordGVzdF9mcmVlX3Nsb3RfZGF0YV9mdW5jICh2b2lkICpkYXRhKQoreworICBpbnQgaSA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChkYXRhKTsKKworICBfZGJ1c19hc3NlcnQgKGZyZWVfY291bnRlciA9PSBpKTsKKyAgKytmcmVlX2NvdW50ZXI7Cit9CisKKy8qKgorICogVGVzdCBmdW5jdGlvbiBmb3IgZGF0YSBzbG90cworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X3Rlc3QgKHZvaWQpCit7CisgIERCdXNEYXRhU2xvdEFsbG9jYXRvciBhbGxvY2F0b3I7CisgIERCdXNEYXRhU2xvdExpc3QgbGlzdDsKKyAgaW50IGk7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisKKyAgaWYgKCFfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2luaXQgKCZhbGxvY2F0b3IsIF9EQlVTX0xPQ0tfc2VydmVyX3Nsb3RzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIGFsbG9jYXRvciIpOworCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZsaXN0KTsKKworI2RlZmluZSBOX1NMT1RTIDEwMAorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgLyogd2UgZG9uJ3QgcmVhbGx5IHdhbnQgYXBwcyB0byByZWx5IG9uIHRoaXMgb3JkZXJlZAorICAgICAgICogYWxsb2NhdGlvbiwgYnV0IGl0IHNpbXBsaWZpZXMgdGhpbmdzIHRvIHJlbHkgb24gaXQKKyAgICAgICAqIGhlcmUuCisgICAgICAgKi8KKyAgICAgIGRidXNfaW50MzJfdCB0bXAgPSAtMTsKKworICAgICAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJmFsbG9jYXRvciwgJnRtcCk7CisKKyAgICAgIGlmICh0bXAgIT0gaSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkIG5vdCBhbGxvY2F0ZSBzbG90cyBpbiBudW1lcmljIG9yZGVyXG4iKTsKKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX1NMT1RTKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmYWxsb2NhdG9yLCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9mcmVlX3Nsb3RfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgdG8gc2V0IGRhdGEiKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfZnJlZV9mdW5jID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfZGF0YSA9PSBOVUxMKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZhbGxvY2F0b3IsICZsaXN0LCBpKSA9PQorICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGZyZWVfY291bnRlciA9IDA7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZhbGxvY2F0b3IsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBzZXQgZGF0YSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9mcmVlX2Z1bmMgPT0gdGVzdF9mcmVlX3Nsb3RfZGF0YV9mdW5jKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKG9sZF9kYXRhKSA9PSBpKTsKKworICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA9PSAoZnJlZV9jb3VudGVyIC0gMSkpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJmFsbG9jYXRvciwgJmxpc3QsIGkpID09CisgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgZnJlZV9jb3VudGVyID0gMDsKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJmxpc3QpOworCisgIF9kYnVzX2Fzc2VydCAoTl9TTE9UUyA9PSBmcmVlX2NvdW50ZXIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgZGJ1c19pbnQzMl90IHRtcCA9IGk7CisgICAgICAKKyAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJmFsbG9jYXRvciwgJnRtcCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRtcCA9PSAtMSk7CisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1kYXRhc2xvdC5oIGIvZGJ1cy9kYnVzLWRhdGFzbG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwNGZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1kYXRhc2xvdC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1kYXRhc2xvdC5oICBzdG9yaW5nIGRhdGEgb24gb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfREFUQVNMT1RfSAorI2RlZmluZSBEQlVTX0RBVEFTTE9UX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzRGF0YVNsb3RBbGxvY2F0b3IgREJ1c0RhdGFTbG90QWxsb2NhdG9yOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90TGlzdCBEQnVzRGF0YVNsb3RMaXN0OworCisvKiogT3BhcXVlIHR5cGVkZWYgZm9yIERCdXNEYXRhU2xvdCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90IERCdXNEYXRhU2xvdDsKKy8qKiBEQnVzRGF0YVNsb3QgaXMgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbiBkYXRhIG9uIHRoZSBjb25uZWN0aW9uICovCitzdHJ1Y3QgREJ1c0RhdGFTbG90Cit7CisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGFwcGxpY2F0aW9uIGRhdGEgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuYzsgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzQWxsb2NhdGVkU2xvdCBEQnVzQWxsb2NhdGVkU2xvdDsKKworLyoqIEFuIGFsbG9jYXRlZCBzbG90IGZvciBzdG9yaW5nIGRhdGEKKyAqLworc3RydWN0IERCdXNBbGxvY2F0ZWRTbG90Cit7CisgIGRidXNfaW50MzJfdCBzbG90X2lkOyAgLyoqPCBJRCBvZiB0aGlzIHNsb3QgKi8KKyAgaW50ICAgICAgICAgIHJlZmNvdW50OyAvKio8IE51bWJlciBvZiB1c2VzIG9mIHRoZSBzbG90ICovCit9OworCisvKioKKyAqIEFuIGFsbG9jYXRvciB0aGF0IHRyYWNrcyBhIHNldCBvZiBzbG90IElEcy4KKyAqLworc3RydWN0IERCdXNEYXRhU2xvdEFsbG9jYXRvcgoreworICBEQnVzQWxsb2NhdGVkU2xvdCAqYWxsb2NhdGVkX3Nsb3RzOyAvKio8IEFsbG9jYXRlZCBzbG90cyAqLworICBpbnQgIG5fYWxsb2NhdGVkX3Nsb3RzOyAvKio8IG51bWJlciBvZiBzbG90cyBtYWxsb2MnZCAqLworICBpbnQgIG5fdXNlZF9zbG90czsgICAgICAvKio8IG51bWJlciBvZiBzbG90cyB1c2VkICovCisgIERCdXNHbG9iYWxMb2NrIGxvY2s7ICAgIC8qKjwgaW5kZXggb2YgdGhyZWFkIGxvY2sgKi8KK307CisKKyNkZWZpbmUgX0RCVVNfREFUQV9TTE9UX0FMTE9DQVRPUl9JTklUKHgpIHsgTlVMTCwgMCwgMCwgeCB9CisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgdGhlIGFjdHVhbCB1c2VyIGRhdGEgc2V0IGF0IGEgZ2l2ZW4KKyAqIHNsb3QuCisgKi8KK3N0cnVjdCBEQnVzRGF0YVNsb3RMaXN0Cit7CisgIERCdXNEYXRhU2xvdCAqc2xvdHM7ICAgLyoqPCBEYXRhIHNsb3RzICovCisgIGludCAgICAgICAgICAgbl9zbG90czsgLyoqPCBTbG90cyB3ZSBoYXZlIHN0b3JhZ2UgZm9yIGluIGRhdGFfc2xvdHMgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHbG9iYWxMb2NrICAgICAgICAgIGxvY2spOworZGJ1c19ib29sX3QgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgKnNsb3RfaWRfcCk7Cit2b2lkICAgICAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICAgICAgIChEQnVzRGF0YVNsb3RMaXN0ICAgICAgICpsaXN0KTsKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAqb2xkX2ZyZWVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhKTsKK3ZvaWQqICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90KTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyICAgICAgKERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QpOwordm9pZCAgICAgICAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAgICAgICAoREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfREFUQVNMT1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWVycm9ycy5jIGIvZGJ1cy9kYnVzLWVycm9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzA1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtZXJyb3JzLmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1lcnJvcnMuYyBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1lcnJvcnMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzRXJyb3JJbnRlcm5hbHMgRXJyb3IgcmVwb3J0aW5nIGludGVybmFscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBFcnJvciByZXBvcnRpbmcgaW50ZXJuYWxzCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBEQlVTX0VSUk9SX0lOSVQKKyAqCisgKiBFeHBhbmRzIHRvIGEgc3VpdGFibGUgaW5pdGlhbGl6ZXIgZm9yIGEgREJ1c0Vycm9yIG9uIHRoZSBzdGFjay4KKyAqIERlY2xhcmluZyBhIERCdXNFcnJvciB3aXRoOgorICoKKyAqIEBjb2RlCisgKiBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgKgorICogZG9fdGhpbmdzX3dpdGggKCZlcnJvcik7CisgKiBAZW5kY29kZQorICoKKyAqIGlzIGEgbW9yZSBjb25jaXNlIGZvcm0gb2Y6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvcjsKKyAqCisgKiBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgKiBkb190aGluZ3Nfd2l0aCAoJmVycm9yKTsKKyAqIEBlbmRjb2RlCisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c0Vycm9yCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7IC8qKjwgZXJyb3IgbmFtZSAqLworICBjaGFyICptZXNzYWdlOyAvKio8IGVycm9yIG1lc3NhZ2UgKi8KKworICB1bnNpZ25lZCBpbnQgY29uc3RfbWVzc2FnZSA6IDE7IC8qKjwgTWVzc2FnZSBpcyBub3Qgb3duZWQgYnkgREJ1c0Vycm9yICovCisKKyAgdW5zaWduZWQgaW50IGR1bW15MiA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15MyA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NCA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKworICB2b2lkICpwYWRkaW5nMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICAKK30gREJ1c1JlYWxFcnJvcjsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzUmVhbEVycm9yKSA9PSBzaXplb2YgKERCdXNFcnJvcikpOworCisvKioKKyAqIFJldHVybnMgYSBsb25nZXIgbWVzc2FnZSBkZXNjcmliaW5nIGFuIGVycm9yIG5hbWUuCisgKiBJZiB0aGUgZXJyb3IgbmFtZSBpcyB1bmtub3duLCByZXR1cm5zIHRoZSBuYW1lCisgKiBpdHNlbGYuCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciB0byBkZXNjcmliZQorICogQHJldHVybnMgYSBjb25zdGFudCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKgorbWVzc2FnZV9mcm9tX2Vycm9yIChjb25zdCBjaGFyICplcnJvcikKK3sKKyAgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVEKSA9PSAwKQorICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSA9PSAwKQorICAgIHJldHVybiAiTm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUikgPT0gMCkKKyAgICByZXR1cm4gIkVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUykgPT0gMCkKKyAgICByZXR1cm4gIkNvdWxkIG5vdCBwYXJzZSBhZGRyZXNzIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEKSA9PSAwKQorICAgIHJldHVybiAiRmVhdHVyZSBub3Qgc3VwcG9ydGVkIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQpID09IDApCisgICAgcmV0dXJuICJSZXNvdXJjZSBsaW1pdHMgZXhjZWVkZWQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpID09IDApCisgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfQVVUSF9GQUlMRUQpID09IDApCisgICAgcmV0dXJuICJDb3VsZCBub3QgYXV0aGVudGljYXRlIHRvIHNlcnZlciI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fU0VSVkVSKSA9PSAwKQorICAgIHJldHVybiAiTm8gc2VydmVyIGF2YWlsYWJsZSBhdCBhZGRyZXNzIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9USU1FT1VUKSA9PSAwKQorICAgIHJldHVybiAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PX05FVFdPUkspID09IDApCisgICAgcmV0dXJuICJOZXR3b3JrIHVuYXZhaWxhYmxlIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSkgPT0gMCkKKyAgICByZXR1cm4gIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCkgPT0gMCkKKyAgICByZXR1cm4gIkRpc2Nvbm5lY3RlZC4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykgPT0gMCkKKyAgICByZXR1cm4gIkludmFsaWQgYXJndW1lbnRzLiI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fUkVQTFkpID09IDApCisgICAgcmV0dXJuICJEaWQgbm90IGdldCBhIHJlcGx5IG1lc3NhZ2UuIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCkgPT0gMCkKKyAgICByZXR1cm4gIkZpbGUgZG9lc24ndCBleGlzdC4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgPT0gMCkKKyAgICByZXR1cm4gIk9iamVjdCBwYXRoIGFscmVhZHkgaW4gdXNlIjsKKyAgZWxzZQorICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0Vycm9ycyBFcnJvciByZXBvcnRpbmcKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgRXJyb3IgcmVwb3J0aW5nCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHJlcG9ydGluZyBlcnJvcnMuCisgKgorICoKKyAqIEluIGVzc2VuY2UgRC1CdXMgZXJyb3IgcmVwb3J0aW5nIHdvcmtzIGFzIGZvbGxvd3M6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvcjsKKyAqIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAqIGRidXNfc29tZV9mdW5jdGlvbiAoYXJnMSwgYXJnMiwgJmVycm9yKTsKKyAqIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAqICAgeworICogICAgIGZwcmludGYgKHN0ZGVyciwgImFuIGVycm9yIG9jY3VycmVkOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgKiAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEJ5IGNvbnZlbnRpb24sIGFsbCBmdW5jdGlvbnMgYWxsb3cgI05VTEwgaW5zdGVhZCBvZiBhIERCdXNFcnJvciosCisgKiBzbyBjYWxsZXJzIHdobyBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBjYW4gaWdub3JlIGl0LgorICogCisgKiBUaGVyZSBhcmUgc29tZSBydWxlcy4gQW4gZXJyb3IgcGFzc2VkIHRvIGEgRC1CdXMgZnVuY3Rpb24gbXVzdAorICogYWx3YXlzIGJlIHVuc2V0OyB5b3UgY2FuJ3QgcGFzcyBpbiBhbiBlcnJvciB0aGF0J3MgYWxyZWFkeSBzZXQuICBJZgorICogYSBmdW5jdGlvbiBoYXMgYSByZXR1cm4gY29kZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQsCisgKiBhbmQgYWxzbyBhICNEQnVzRXJyb3IgcGFyYW1ldGVyLCB0aGVuIHRoZSBlcnJvciB3aWxsIGFsd2F5cyBiZSBzZXQKKyAqIGlmIGFuZCBvbmx5IGlmIHRoZSByZXR1cm4gY29kZSBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQuIGkuZS4KKyAqIHRoZSByZXR1cm4gY29kZSBhbmQgdGhlIGVycm9yIGFyZSBuZXZlciBnb2luZyB0byBkaXNhZ3JlZS4KKyAqCisgKiBBbiBlcnJvciBvbmx5IG5lZWRzIHRvIGJlIGZyZWVkIGlmIGl0J3MgYmVlbiBzZXQsIG5vdCBpZgorICogaXQncyBtZXJlbHkgYmVlbiBpbml0aWFsaXplZC4KKyAqCisgKiBZb3UgY2FuIGNoZWNrIHRoZSBzcGVjaWZpYyBlcnJvciB0aGF0IG9jY3VycmVkIHVzaW5nCisgKiBkYnVzX2Vycm9yX2hhc19uYW1lKCkuCisgKiAKKyAqIEVycm9ycyB3aWxsIG5vdCBiZSBzZXQgZm9yIHByb2dyYW1taW5nIGVycm9ycywgc3VjaCBhcyBwYXNzaW5nCisgKiBpbnZhbGlkIGFyZ3VtZW50cyB0byB0aGUgbGliZGJ1cyBBUEkuIEluc3RlYWQsIGxpYmRidXMgd2lsbCBwcmludAorICogd2FybmluZ3MsIGV4aXQgb24gYSBmYWlsZWQgYXNzZXJ0aW9uLCBvciBldmVuIGNyYXNoIGluIHRob3NlIGNhc2VzCisgKiAoaW4gb3RoZXIgd29yZHMsIGluY29ycmVjdCB1c2Ugb2YgdGhlIEFQSSByZXN1bHRzIGluIHVuZGVmaW5lZAorICogYmVoYXZpb3IsIHBvc3NpYmx5IGFjY29tcGFuaWVkIGJ5IGhlbHBmdWwgZGVidWdnaW5nIG91dHB1dCBpZgorICogeW91J3JlIGx1Y2t5KS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgREJ1c0Vycm9yIHN0cnVjdHVyZS4gRG9lcyBub3QgYWxsb2NhdGUgYW55IG1lbW9yeTsKKyAqIHRoZSBlcnJvciBvbmx5IG5lZWRzIHRvIGJlIGZyZWVkIGlmIGl0IGlzIHNldCBhdCBzb21lIHBvaW50LgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgREJ1c0Vycm9yLgorICovCit2b2lkCitkYnVzX2Vycm9yX2luaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzRXJyb3IpID09IHNpemVvZiAoREJ1c1JlYWxFcnJvcikpOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChlcnJvciAhPSBOVUxMKTsKKworICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKyAgCisgIHJlYWwtPm5hbWUgPSBOVUxMOyAgCisgIHJlYWwtPm1lc3NhZ2UgPSBOVUxMOworCisgIHJlYWwtPmNvbnN0X21lc3NhZ2UgPSBUUlVFOworfQorCisvKioKKyAqIEZyZWVzIGFuIGVycm9yIHRoYXQncyBiZWVuIHNldCAob3IganVzdCBpbml0aWFsaXplZCksCisgKiB0aGVuIHJlaW5pdGlhbGl6ZXMgdGhlIGVycm9yIGFzIGluIGRidXNfZXJyb3JfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBlcnJvciBtZW1vcnkgd2hlcmUgdGhlIGVycm9yIGlzIHN0b3JlZC4KKyAqLwordm9pZAorZGJ1c19lcnJvcl9mcmVlIChEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChlcnJvciAhPSBOVUxMKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxFcnJvciAqKWVycm9yOworCisgIGlmICghcmVhbC0+Y29uc3RfbWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm5hbWUpOworICAgICAgZGJ1c19mcmVlIChyZWFsLT5tZXNzYWdlKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0IChlcnJvcik7Cit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIHRvIGEgREJ1c0Vycm9yLiAgRG9lcyBub3RoaW5nIGlmCisgKiBlcnJvciBpcyAjTlVMTC4gVGhlIG1lc3NhZ2UgbWF5IGJlICNOVUxMLCB3aGljaCBtZWFucyBhIGRlZmF1bHQKKyAqIG1lc3NhZ2Ugd2lsbCBiZSBkZWR1Y2VkIGZyb20gdGhlIG5hbWUuIFRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2lsbCBiZQorICogdG90YWxseSB1c2VsZXNzLCB0aG91Z2gsIHNvIHVzaW5nIGEgI05VTEwgbWVzc2FnZSBpcyBub3QgcmVjb21tZW5kZWQuCisgKgorICogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvcHkgdGhlIGVycm9yIG5hbWUgb3IgbWVzc2FnZSwgeW91CisgKiBtdXN0IGVuc3VyZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSBhcmUgZ2xvYmFsIGRhdGEgdGhhdCB3b24ndCBiZQorICogZnJlZWQuIFlvdSBwcm9iYWJseSB3YW50IGRidXNfc2V0X2Vycm9yKCkgaW5zdGVhZCwgaW4gbW9zdCBjYXNlcy4KKyAqIAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciBvciAjTlVMTAorICogQHBhcmFtIG5hbWUgdGhlIGVycm9yIG5hbWUgKG5vdCBjb3BpZWQhISEpCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZSAobm90IGNvcGllZCEhISkKKyAqLwordm9pZAorZGJ1c19zZXRfZXJyb3JfY29uc3QgKERCdXNFcnJvciAgKmVycm9yLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBjb25zdCBjaGFyICptZXNzYWdlKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworCisgIF9kYnVzX3JldHVybl9pZl9lcnJvcl9pc19zZXQgKGVycm9yKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCk7CisgIAorICBpZiAoZXJyb3IgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bmFtZSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bWVzc2FnZSA9PSBOVUxMKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZXJyb3IgKG5hbWUpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisgIAorICByZWFsLT5uYW1lID0gKGNoYXIqKSBuYW1lOworICByZWFsLT5tZXNzYWdlID0gKGNoYXIgKiltZXNzYWdlOworICByZWFsLT5jb25zdF9tZXNzYWdlID0gVFJVRTsKK30KKworLyoqCisgKiBNb3ZlcyBhbiBlcnJvciBzcmMgaW50byBkZXN0LCBmcmVlaW5nIHNyYyBhbmQKKyAqIG92ZXJ3cml0aW5nIGRlc3QuIEJvdGggc3JjIGFuZCBkZXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQuCisgKiBzcmMgaXMgcmVpbml0aWFsaXplZCB0byBhbiBlbXB0eSBlcnJvci4gZGVzdCBtYXkgbm90CisgKiBjb250YWluIGFuIGV4aXN0aW5nIGVycm9yLiBJZiB0aGUgZGVzdGluYXRpb24gaXMKKyAqICNOVUxMLCBqdXN0IGZyZWVzIGFuZCByZWluaXRzIHRoZSBzb3VyY2UgZXJyb3IuCisgKiAKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBlcnJvcgorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGVycm9yIG9yICNOVUxMCisgKi8KK3ZvaWQKK2RidXNfbW92ZV9lcnJvciAoREJ1c0Vycm9yICpzcmMsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZGVzdCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZGVzdCk7CisKKyAgaWYgKGRlc3QpCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlIChkZXN0KTsKKyAgICAgICpkZXN0ID0gKnNyYzsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoc3JjKTsKKyAgICB9CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKHNyYyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVycm9yIGlzIHNldCBhbmQgaGFzIHRoZSBnaXZlbgorICogbmFtZS4KKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZ2l2ZW4gbmFtZWQgZXJyb3Igb2NjdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfZXJyb3JfaGFzX25hbWUgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZXJyb3IgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX2Fzc2VydCAoKGVycm9yLT5uYW1lICE9IE5VTEwgJiYgZXJyb3ItPm1lc3NhZ2UgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAoZXJyb3ItPm5hbWUgPT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSA9PSBOVUxMKSk7CisgIAorICBpZiAoZXJyb3ItPm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHN0cjEsIHN0cjI7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0cjEsIGVycm9yLT5uYW1lKTsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyMiwgbmFtZSk7CisgICAgICByZXR1cm4gX2RidXNfc3RyaW5nX2VxdWFsICgmc3RyMSwgJnN0cjIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCAodGhlIGVycm9yIGlzIHNldCkuCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Vycm9yX2lzX3NldCAoY29uc3QgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvciAhPSBOVUxMLCBGQUxTRSk7ICAKKyAgX2RidXNfYXNzZXJ0ICgoZXJyb3ItPm5hbWUgIT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChlcnJvci0+bmFtZSA9PSBOVUxMICYmIGVycm9yLT5tZXNzYWdlID09IE5VTEwpKTsKKyAgcmV0dXJuIGVycm9yLT5uYW1lICE9IE5VTEw7Cit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIHRvIGEgREJ1c0Vycm9yLgorICogRG9lcyBub3RoaW5nIGlmIGVycm9yIGlzICNOVUxMLgorICoKKyAqIFRoZSBmb3JtYXQgbWF5IGJlICNOVUxMLCB3aGljaCBtZWFucyBhIChwcmV0dHkgbXVjaCB1c2VsZXNzKQorICogZGVmYXVsdCBtZXNzYWdlIHdpbGwgYmUgZGVkdWNlZCBmcm9tIHRoZSBuYW1lLiBUaGlzIGlzIG5vdCBhIGdvb2QKKyAqIGlkZWEsIGp1c3QgZ28gYWhlYWQgYW5kIHByb3ZpZGUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4gSXQgd29uJ3QKKyAqIGh1cnQgeW91LgorICoKKyAqIElmIG5vIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIGZvciB0aGUgZXJyb3IgbWVzc2FnZSwgCisgKiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBzZXQgaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yLm9yICNOVUxMCisgKiBAcGFyYW0gbmFtZSB0aGUgZXJyb3IgbmFtZQorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorZGJ1c19zZXRfZXJyb3IgKERCdXNFcnJvciAgKmVycm9yLAorCQljb25zdCBjaGFyICpuYW1lLAorCQljb25zdCBjaGFyICpmb3JtYXQsCisJCS4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICAKKyAgaWYgKGVycm9yID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIGl0J3MgYSBidWcgdG8gcGlsZSB1cCBlcnJvcnMgKi8KKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobmFtZSAhPSBOVUxMKTsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgX2RidXNfc2V0X2Vycm9yX3ZhbGlzdCAoZXJyb3IsIG5hbWUsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7Cit9CisKK3ZvaWQKK19kYnVzX3NldF9lcnJvcl92YWxpc3QgKERCdXNFcnJvciAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgIGFyZ3MpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisgIERCdXNTdHJpbmcgc3RyOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICBpZiAoZXJyb3IgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bmFtZSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bWVzc2FnZSA9PSBOVUxMKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBnb3RvIG5vbWVtOworICAKKyAgaWYgKGZvcm1hdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9mcm9tX2Vycm9yIChuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmc3RyLCBmb3JtYXQsIGFyZ3MpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJlYWwtPm1lc3NhZ2UpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICByZWFsLT5uYW1lID0gX2RidXNfc3RyZHVwIChuYW1lKTsKKyAgaWYgKHJlYWwtPm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm1lc3NhZ2UpOworICAgICAgcmVhbC0+bWVzc2FnZSA9IE5VTEw7CisgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgcmVhbC0+Y29uc3RfbWVzc2FnZSA9IEZBTFNFOworCisgIHJldHVybjsKKyAgCisgbm9tZW06CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBwdWJsaWMgQVBJICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZXJyb3JzLmggYi9kYnVzL2RidXMtZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1lcnJvcnMuaApAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZXJyb3JzLmggRXJyb3IgcmVwb3J0aW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfRVJST1JfSAorI2RlZmluZSBEQlVTX0VSUk9SX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNFcnJvcnMKKyAqIEB7CisgKi8KKworLyoqIE1vc3RseS1vcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Vycm9yIERCdXNFcnJvcjsKKworLyoqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGFuIGV4Y2VwdGlvbi4KKyAqLworc3RydWN0IERCdXNFcnJvcgoreworICBjb25zdCBjaGFyICpuYW1lOyAgICAvKio8IHB1YmxpYyBlcnJvciBuYW1lIGZpZWxkICovCisgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7IC8qKjwgcHVibGljIGVycm9yIG1lc3NhZ2UgZmllbGQgKi8KKworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXkyIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXkzIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk0IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk1IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworCisgIHZvaWQgKnBhZGRpbmcxOyAvKio8IHBsYWNlaG9sZGVyICovCit9OworCisjZGVmaW5lIERCVVNfRVJST1JfSU5JVCB7IE5VTEwsIE5VTEwsIFRSVUUsIDAsIDAsIDAsIDAsIE5VTEwgfQorCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19lcnJvcl9pbml0ICAgICAgKERCdXNFcnJvciAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfZXJyb3JfZnJlZSAgICAgIChEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3NldF9lcnJvciAgICAgICAoREJ1c0Vycm9yICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKERCdXNFcnJvciAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICAgICAgKERCdXNFcnJvciAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZGVzdCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19lcnJvcl9oYXNfbmFtZSAgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Vycm9yX2lzX3NldCAgICAoY29uc3QgREJ1c0Vycm9yICplcnJvcik7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19FUlJPUl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZmlsZS11bml4LmMgYi9kYnVzL2RidXMtZmlsZS11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDNmZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLXVuaXguYwpAQCAtMCwwICsxLDQxNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWZpbGUtdW5peC5jIHVuaXggcmVsYXRlZCBmaWxlIGltcGxlbWVudGF0aW9uIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtZXJyb3JzLmgiCisjaW5jbHVkZSAiZGJ1cy1maWxlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZSB0byB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nIGVycm9yIGNvZGUuIEF0IHRoZSBtb21lbnQsIHdvbid0IG9wZW4gYSBmaWxlCisgKiBtb3JlIHRoYW4gYSBtZWdhYnl0ZSBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc2V0IGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZmlsZV9nZXRfY29udGVudHMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgaW50IG9yaWdfbGVuOworICBpbnQgdG90YWw7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICAvKiBPX0JJTkFSWSB1c2VmdWwgb24gQ3lnd2luICovCisgIGZkID0gb3BlbiAoZmlsZW5hbWVfYywgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmaWxlIGZkICVkIG9wZW5lZFxuIiwgZmQpOworICAKKyAgaWYgKGZzdGF0IChmZCwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdGF0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmc3RhdCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNiLnN0X3NpemUgPiBfREJVU19PTkVfTUVHQUJZVEUpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBzaXplICVsdSBvZiBcIiVzXCIgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNiLnN0X3NpemUsIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICB0b3RhbCA9IDA7CisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGlmIChzYi5zdF9zaXplID4gMCAmJiBTX0lTUkVHIChzYi5zdF9tb2RlKSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgICAgd2hpbGUgKHRvdGFsIDwgKGludCkgc2Iuc3Rfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkIChmZCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zdF9zaXplIC0gdG90YWwpOworICAgICAgICAgIGlmIChieXRlc19yZWFkIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlYWQoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvcmlnX2xlbik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b3RhbCArPSBieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHNiLnN0X3NpemUgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2FuIG9ubHkgb3BlbiByZWd1bGFyIGZpbGVzIGF0IHRoZSBtb21lbnQuXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyBvdXQgdG8gYSBmaWxlLiBJZiB0aGUgZmlsZSBleGlzdHMsCisgKiBpdCB3aWxsIGJlIGF0b21pY2FsbHkgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBkYXRhLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSB0byBzYXZlIHN0cmluZyB0bworICogQHBhcmFtIHdvcmxkX3JlYWRhYmxlIElmIHNldCwgZW5zdXJlIHRoZSBmaWxlIGlzIHdvcmxkIHJlYWRhYmxlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIERCdXNTdHJpbmcgdG1wX2ZpbGVuYW1lOworICBjb25zdCBjaGFyICp0bXBfZmlsZW5hbWVfYzsKKyAgaW50IHRvdGFsOworICBkYnVzX2Jvb2xfdCBuZWVkX3VubGluazsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmQgPSAtMTsKKyAgcmV0dmFsID0gRkFMU0U7CisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wX2ZpbGVuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsICZ0bXBfZmlsZW5hbWUsIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcF9maWxlbmFtZSwgIi4iKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNkZWZpbmUgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTIDgKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZ0bXBfZmlsZW5hbWUsIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIHRtcF9maWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdG1wX2ZpbGVuYW1lKTsKKworICBmZCA9IG9wZW4gKHRtcF9maWxlbmFtZV9jLCBPX1dST05MWSB8IE9fQklOQVJZIHwgT19FWENMIHwgT19DUkVBVCwKKyAgICAgICAgICAgICB3b3JsZF9yZWFkYWJsZSA/IDA2NDQgOiAwNjAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKHdvcmxkX3JlYWRhYmxlKQorICAgIHsKKyAgICAgIC8qIEVuc3VyZSB0aGUgZmlsZSBpcyB3b3JsZCByZWFkYWJsZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAgICogcG9zc2libHkgcmVzdHJpY3RpdmUgdW1hc2tzOworICAgICAgICogc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDEwLVNlcHRlbWJlci8wMTMzNjcuaHRtbAorICAgICAgICovCisgICAgICBpZiAoZmNobW9kIChmZCwgMDY0NCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2htb2QgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0bXAgZmlsZSBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKyAgCisgIG5lZWRfdW5saW5rID0gVFJVRTsKKyAgCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICB3aGlsZSAodG90YWwgPCBieXRlc190b193cml0ZSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgICAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlIChmZCwgc3RyLCB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fd3JpdGUgLSB0b3RhbCk7CisKKyAgICAgIGlmIChieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKGZzeW5jKGZkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHN5bmNocm9uaXplIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB0bXBfZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKCFfZGJ1c19jbG9zZSAoZmQsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGZkID0gLTE7CisgIAorICBpZiAocmVuYW1lICh0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuYW1lICVzIHRvICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBuZWVkX3VubGluayA9IEZBTFNFOworICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICAvKiBjbG9zZSBmaXJzdCwgdGhlbiB1bmxpbmssIHRvIHByZXZlbnQgIi5uZnMzNDIzNDIzNSIgZ2FyYmFnZQorICAgKiBmaWxlcworICAgKi8KKworICBpZiAoZmQgPj0gMCkKKyAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAKKyAgaWYgKG5lZWRfdW5saW5rICYmIHVubGluayAodG1wX2ZpbGVuYW1lX2MpIDwgMCkKKyAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHVubGluayB0ZW1wIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIE1ha2VzIHRoZSBmaWxlIHJlYWRhYmxlIGJ5IGV2ZXJ5IHVzZXIgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgY291bGQgYmUgY2hhbmdlZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgaWYgKGNobW9kIChmaWxlbmFtZV9jLCAwNjQ0KSA9PSAtMSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiogQ3JlYXRlcyB0aGUgZ2l2ZW4gZmlsZSwgZmFpbGluZyBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGNyZWF0ZWQgdGhlIGZpbGUgYW5kIGl0IGRpZG4ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICBmZCA9IG9wZW4gKGZpbGVuYW1lX2MsIE9fV1JPTkxZIHwgT19CSU5BUlkgfCBPX0VYQ0wgfCBPX0NSRUFULAorICAgICAgICAgICAgIDA2MDApOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZXhjbHVzaXZlIGZpbGUgZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisgIAorICBpZiAoIV9kYnVzX2Nsb3NlIChmZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1bmxpbmsoKSBzdWNjZWVkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAodW5saW5rIChmaWxlbmFtZV9jKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1maWxlLXdpbi5jIGIvZGJ1cy9kYnVzLWZpbGUtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiZTExZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLXdpbi5jCkBAIC0wLDAgKzEsNDA3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZmlsZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgZmlsZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LgorICogCisgKiBAcGFyYW0gaG5kIHRoZSBIQU5ETEUgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHBhcmFtIGVycm9yIHBsYWNlIHRvIHNldCBhbiBlcnJvcgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQKK19kYnVzX2ZpbGVfcmVhZCAoSEFORExFICAgICAgICAgICAgaG5kLAorICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQk9PTCByZXN1bHQ7CisgIERXT1JEIGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgIHJlc3VsdCA9IFJlYWRGaWxlIChobmQsIGRhdGEsIGNvdW50LCAmYnl0ZXNfcmVhZCwgTlVMTCk7CisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSAweCV4OiAlcyIsIGhuZCwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoYnl0ZXNfcmVhZCkKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworCisvKioKKyAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSBzdHJpbmcsCisgKiByZXR1cm5pbmcgZXJyb3IgY29kZS4gQXQgdGhlIG1vbWVudCwgd29uJ3Qgb3BlbiBhIGZpbGUKKyAqIG1vcmUgdGhhbiBhIG1lZ2FieXRlIGluIHNpemUuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBlcnJvciBwbGFjZSB0byBzZXQgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19maWxlX2dldF9jb250ZW50cyAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBIQU5ETEUgaG5kOworICBEV09SRCBmc2l6ZTsKKyAgRFdPUkQgZnNpemVfaGk7CisgIGludCBvcmlnX2xlbjsKKyAgdW5zaWduZWQgaW50IHRvdGFsOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBobmQgPSBDcmVhdGVGaWxlQSAoZmlsZW5hbWVfYywgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImZpbGUgJXMgaG5kICVwIG9wZW5lZFxuIiwgZmlsZW5hbWVfYywgaG5kKTsKKyAgCisgIGZzaXplID0gR2V0RmlsZVNpemUgKGhuZCwgJmZzaXplX2hpKTsKKyAgaWYgKGZzaXplID09IDB4RkZGRkZGRkYgJiYgR2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpCisgICAgeyAKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGZpbGUgc2l6ZSBmb3IgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiR2V0RmlsZVNpemUoKSBmYWlsZWQ6ICVzIiwgZW1zZyk7CisKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmc2l6ZV9oaSAhPSAwIHx8IGZzaXplID4gX0RCVVNfT05FX01FR0FCWVRFKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgc2l6ZSAlbHUvJWx1IG9mIFwiJXNcIiBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZnNpemVfaGksCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZzaXplLCBmaWxlbmFtZV9jKTsKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0b3RhbCA9IDA7CisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGlmIChmc2l6ZSA+IDApCisgICAgeworICAgICAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgICAgIHdoaWxlICh0b3RhbCA8IGZzaXplKQorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX2ZpbGVfcmVhZCAoaG5kLCBzdHIsIGZzaXplIC0gdG90YWwsIGVycm9yKTsKKyAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBFT0YgcmVhZGluZyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICAgICAgICAgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG90YWwgKz0gYnl0ZXNfcmVhZDsKKyAgICAgICAgfQorCisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIG91dCB0byBhIGZpbGUuIElmIHRoZSBmaWxlIGV4aXN0cywKKyAqIGl0IHdpbGwgYmUgYXRvbWljYWxseSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGRhdGEuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIG91dAorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIHRvIHNhdmUgc3RyaW5nIHRvCisgKiBAcGFyYW0gd29ybGRfcmVhZGFibGUgaWYgdHJ1ZSwgZW5zdXJlIGZpbGUgaXMgd29ybGQgcmVhZGFibGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4gb24gZmFpbHVyZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgSEFORExFIGhuZDsKKyAgaW50IGJ5dGVzX3RvX3dyaXRlOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworICBEQnVzU3RyaW5nIHRtcF9maWxlbmFtZTsKKyAgY29uc3QgY2hhciAqdG1wX2ZpbGVuYW1lX2M7CisgIGludCB0b3RhbDsKKyAgY29uc3QgY2hhciAqc3RyX2M7CisgIGRidXNfYm9vbF90IG5lZWRfdW5saW5rOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaG5kID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIHJldHZhbCA9IEZBTFNFOworICBuZWVkX3VubGluayA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXBfZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChmaWxlbmFtZSwgMCwgJnRtcF9maWxlbmFtZSwgMCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcF9maWxlbmFtZSwgIi4iKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNkZWZpbmUgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTIDgKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZ0bXBfZmlsZW5hbWUsIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgdG1wX2ZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0bXBfZmlsZW5hbWUpOworCisgIC8qIFRPRE8gLSBzdXBwb3J0IHdvcmxkLXJlYWRhYmxlIGluIGFuIGF0b21pYyBmYXNoaW9uICovCisgIGhuZCA9IENyZWF0ZUZpbGVBICh0bXBfZmlsZW5hbWVfYywgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIFwiJXNcIjogJXMiLCBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmICh3b3JsZF9yZWFkYWJsZSkKKyAgICB7CisgICAgICBpZiAoISBfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgKCZ0bXBfZmlsZW5hbWUsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0bXAgZmlsZSAlcyBobmQgJXAgb3BlbmVkXG4iLCB0bXBfZmlsZW5hbWVfYywgaG5kKTsKKworICBuZWVkX3VubGluayA9IFRSVUU7CisKKyAgdG90YWwgPSAwOworICBieXRlc190b193cml0ZSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBzdHJfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKTsKKworICB3aGlsZSAodG90YWwgPCBieXRlc190b193cml0ZSkKKyAgICB7CisgICAgICBEV09SRCBieXRlc193cml0dGVuOworICAgICAgQk9PTCByZXM7CisKKyAgICAgIHJlcyA9IFdyaXRlRmlsZSAoaG5kLCBzdHJfYyArIHRvdGFsLCBieXRlc190b193cml0ZSAtIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCk7CisKKyAgICAgIGlmIChyZXMgPT0gMCB8fCBieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHRvdGFsICs9IGJ5dGVzX3dyaXR0ZW47CisgICAgfQorCisgIGlmIChDbG9zZUhhbmRsZSAoaG5kKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIGZpbGUgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBobmQgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKworICAvKiBVbmxpa2UgcmVuYW1lKCksIE1vdmVGaWxlRXgoKSBjYW4gcmVwbGFjZSBleGlzdGluZyBmaWxlcyAqLworICBpZiAoIU1vdmVGaWxlRXhBICh0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYywgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORykpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuYW1lICVzIHRvICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBuZWVkX3VubGluayA9IEZBTFNFOworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIC8qIGNsb3NlIGZpcnN0LCB0aGVuIHVubGluayAqLworCisgIGlmIChobmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisKKyAgaWYgKG5lZWRfdW5saW5rICYmIERlbGV0ZUZpbGVBICh0bXBfZmlsZW5hbWVfYykgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gdW5saW5rIHRlbXAgZmlsZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworCisgIGlmICghcmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKiBDcmVhdGVzIHRoZSBnaXZlbiBmaWxlLCBmYWlsaW5nIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgY3JlYXRlZCB0aGUgZmlsZSBhbmQgaXQgZGlkbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEhBTkRMRSBobmQ7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGhuZCA9IENyZWF0ZUZpbGVBIChmaWxlbmFtZV9jLCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyAgaWYgKGhuZCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJleGNsdXNpdmUgZmlsZSAlcyBobmQgJXAgb3BlbmVkXG4iLCBmaWxlbmFtZV9jLCBobmQpOworCisgIGlmIChDbG9zZUhhbmRsZSAoaG5kKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZmlsZS5jIGIvZGJ1cy9kYnVzLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWZpbGUuYwpAQCAtMCwwICsxLDI4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11bml4LmMgV3JhcHBlcnMgYXJvdW5kIFVOSVggc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLWZpbGUuaCIKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWZpbGUuaCBiL2RidXMvZGJ1cy1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMzBjZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLmgKQEAgLTAsMCArMSw2NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWZpbGUuaCBkYnVzIGZpbGUgcmVsYXRlZCBzdHVmZiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19GSUxFX0gKKyNkZWZpbmUgREJVU19GSUxFX0gKKworLy8jaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNGaWxlCisgKiBAeworICovCisKKy8qKgorICogRmlsZSBpbnRlcmZhY2UKKyAqLworZGJ1c19ib29sX3QgX2RidXNfZmlsZV9leGlzdHMgICAgICAgICAoY29uc3QgY2hhciAgICAgICAqZmlsZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19maWxlX2dldF9jb250ZW50cyAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZSAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgICAgX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2RlbGV0ZV9maWxlICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtaGFzaC5jIGIvZGJ1cy9kYnVzLWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdkMDRiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWhhc2guYwpAQCAtMCwwICsxLDE4MzEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1oYXNoLmMgR2VuZXJpYyBoYXNoIHRhYmxlIHV0aWxpdHkgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogCisgKiBIYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGdlbmVyaWMvdGNsSGFzaC5jIGZyb20gdGhlIFRjbAorICogc291cmNlIGNvZGUuIFRoZSBvcmlnaW5hbCBUY2wgbGljZW5zZSBhcHBsaWVzIHRvIHBvcnRpb25zIG9mIHRoZQorICogY29kZSBmcm9tIHRjbEhhc2guYzsgdGhlIFRjbCBsaWNlbnNlIGZvbGxvd3MgdGhpcyBzdGFuZGFkIEQtQnVzIAorICogbGljZW5zZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKy8qIAorICogVGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYXBwbGllcyB0byBjb2RlIGZyb20gdGhlIFRjbCBkaXN0cmlidXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIENvcHlyaWdodCAoYykgMTk5NCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHRlZCBieSB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZgorICogQ2FsaWZvcm5pYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgU2NyaXB0aWNzIENvcnBvcmF0aW9uLCBhbmQKKyAqIG90aGVyIHBhcnRpZXMuICBUaGUgZm9sbG93aW5nIHRlcm1zIGFwcGx5IHRvIGFsbCBmaWxlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBzb2Z0d2FyZSB1bmxlc3MgZXhwbGljaXRseSBkaXNjbGFpbWVkIGluIGluZGl2aWR1YWwgZmlsZXMuCisgKiAKKyAqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogZGlzdHJpYnV0ZSwgYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQgdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4KKyAqIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55CisgKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMKKyAqIHJlcXVpcmVkIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4gIE1vZGlmaWNhdGlvbnMgdG8gdGhpcworICogc29mdHdhcmUgbWF5IGJlIGNvcHlyaWdodGVkIGJ5IHRoZWlyIGF1dGhvcnMgYW5kIG5lZWQgbm90IGZvbGxvdworICogdGhlIGxpY2Vuc2luZyB0ZXJtcyBkZXNjcmliZWQgaGVyZSwgcHJvdmlkZWQgdGhhdCB0aGUgbmV3IHRlcm1zIGFyZQorICogY2xlYXJseSBpbmRpY2F0ZWQgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgZWFjaCBmaWxlIHdoZXJlIHRoZXkgYXBwbHkuCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIERJU1RSSUJVVE9SUyBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIElUUyBET0NVTUVOVEFUSU9OLAorICogT1IgQU5ZIERFUklWQVRJVkVTIFRIRVJFT0YsIEVWRU4gSUYgVEhFIEFVVEhPUlMgSEFWRSBCRUVOIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIAorICogVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBTUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICogQU5EIFRIRSBBVVRIT1JTIEFORCBESVNUUklCVVRPUlMgSEFWRSBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUKKyAqIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKiAKKyAqIEdPVkVSTk1FTlQgVVNFOiBJZiB5b3UgYXJlIGFjcXVpcmluZyB0aGlzIHNvZnR3YXJlIG9uIGJlaGFsZiBvZiB0aGUKKyAqIFUuUy4gZ292ZXJubWVudCwgdGhlIEdvdmVybm1lbnQgc2hhbGwgaGF2ZSBvbmx5ICJSZXN0cmljdGVkIFJpZ2h0cyIKKyAqIGluIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGFzIGRlZmluZWQgaW4gdGhlIEZlZGVyYWwKKyAqIEFjcXVpc2l0aW9uIFJlZ3VsYXRpb25zIChGQVJzKSBpbiBDbGF1c2UgNTIuMjI3LjE5IChjKSAoMikuICBJZiB5b3UKKyAqIGFyZSBhY3F1aXJpbmcgdGhlIHNvZnR3YXJlIG9uIGJlaGFsZiBvZiB0aGUgRGVwYXJ0bWVudCBvZiBEZWZlbnNlLAorICogdGhlIHNvZnR3YXJlIHNoYWxsIGJlIGNsYXNzaWZpZWQgYXMgIkNvbW1lcmNpYWwgQ29tcHV0ZXIgU29mdHdhcmUiCisgKiBhbmQgdGhlIEdvdmVybm1lbnQgc2hhbGwgaGF2ZSBvbmx5ICJSZXN0cmljdGVkIFJpZ2h0cyIgYXMgZGVmaW5lZAorICogaW4gQ2xhdXNlIDI1Mi4yMjctNzAxMyAoYykgKDEpIG9mIERGQVJzLiAgTm90d2l0aHN0YW5kaW5nIHRoZQorICogZm9yZWdvaW5nLCB0aGUgYXV0aG9ycyBncmFudCB0aGUgVS5TLiBHb3Zlcm5tZW50IGFuZCBvdGhlcnMgYWN0aW5nCisgKiBpbiBpdHMgYmVoYWxmIHBlcm1pc3Npb24gdG8gdXNlIGFuZCBkaXN0cmlidXRlIHRoZSBzb2Z0d2FyZSBpbgorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWVtcG9vbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzSGFzaFRhYmxlIEhhc2ggdGFibGUKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0hhc2hUYWJsZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzSGFzaFRhYmxlLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNIYXNoVGFibGVJbnRlcm5hbHMgSGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNIYXNoVGFibGUgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNIYXNoVGFibGUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFdoZW4gdGhlcmUgYXJlIHRoaXMgbWFueSBlbnRyaWVzIHBlciBidWNrZXQsIG9uIGF2ZXJhZ2UsIHJlYnVpbGQKKyAqIHRoZSBoYXNoIHRhYmxlIHRvIG1ha2UgaXQgbGFyZ2VyLgorICovCisjZGVmaW5lIFJFQlVJTERfTVVMVElQTElFUiAgMworCisvKioKKyAqIFRha2VzIGEgcHJlbGltaW5hcnkgaW50ZWdlciBoYXNoIHZhbHVlIGFuZCBwcm9kdWNlcyBhbiBpbmRleCBpbnRvIGEKKyAqIGhhc2ggdGFibGVzIGJ1Y2tldCBsaXN0LiAgVGhlIGlkZWEgaXMgdG8gbWFrZSBpdCBzbyB0aGF0CisgKiBwcmVsaW1pbmFyeSB2YWx1ZXMgdGhhdCBhcmUgYXJiaXRyYXJpbHkgc2ltaWxhciB3aWxsIGVuZCB1cCBpbgorICogZGlmZmVyZW50IGJ1Y2tldHMuICBUaGUgaGFzaCBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBhCisgKiByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gKFRoaXMgaXMgdXNlZCB0byBoYXNoIGludGVnZXJzLikKKyAqCisgKiBUaGUgZG93bl9zaGlmdCBkcm9wcyBvZmYgdGhlIGhpZ2ggYml0cyBvZiB0aGUgaGFzaCBpbmRleCwgYW5kCisgKiBkZWNyZWFzZXMgYXMgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgKHRvIGtlZXAgbW9yZQorICogcmFuZ2UgaW4gdGhlIGhhc2ggaW5kZXgpLiBUaGUgbWFzayBhbHNvIHN0cmlwcyBoaWdoIGJpdHMgYW5kIHN0cmlwcworICogZmV3ZXIgaGlnaCBiaXRzIGFzIHRoZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzIGluY3JlYXNlcy4KKyAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB0d28gdGhpbmdzOiB3aHkgaXMgdGhlIGluaXRpYWwgZG93bnNoaWZ0IDI4CisgKiB0byBrZWVwIDQgYml0cyB3aGVuIHRoZSBpbml0aWFsIG1hc2sgaXMgMDExIHRvIGtlZXAgMiBiaXRzLAorICogYW5kIHdoeSBkbyB3ZSBoYXZlIGJvdGggYSBtYXNrIGFuZCBhIGRvd25zaGlmdD8KKyAqIAorICovCisjZGVmaW5lIFJBTkRPTV9JTkRFWCh0YWJsZSwgaSkgXAorICAgICgoKCgoaW50cHRyX3QpIChpKSkqMTEwMzUxNTI0NSkgPj4gKHRhYmxlKS0+ZG93bl9zaGlmdCkgJiAodGFibGUpLT5tYXNrKQorCisvKioKKyAqIEluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gaGFzaCB0YWJsZSAoaGFzaCB0YWJsZSBzdGF0aWNhbGx5CisgKiBhbGxvY2F0ZXMgaXRzIGJ1Y2tldHMgZm9yIHRoaXMgc2l6ZSBhbmQgYmVsb3cpLgorICogVGhlIGluaXRpYWwgbWFzayBoYXMgdG8gYmUgc3luY2VkIHRvIHRoaXMuCisgKi8KKyNkZWZpbmUgREJVU19TTUFMTF9IQVNIX1RBQkxFIDQKKworLyoqCisgKiBUeXBlZGVmIGZvciBEQnVzSGFzaEVudHJ5CisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNIYXNoRW50cnkgREJ1c0hhc2hFbnRyeTsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBoYXNoIGVudHJ5LgorICogCisgKiBBIHNpbmdsZSBlbnRyeSAoa2V5LXZhbHVlIHBhaXIpIGluIHRoZSBoYXNoIHRhYmxlLgorICogSW50ZXJuYWwgdG8gaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IERCdXNIYXNoRW50cnkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqbmV4dDsgICAgLyoqPCBQb2ludGVyIHRvIG5leHQgZW50cnkgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXNoIGJ1Y2tldCwgb3IgI05VTEwgZm9yIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKmtleTsgICAgICAgICAgICAgIC8qKjwgSGFzaCBrZXkgKi8KKyAgdm9pZCAqdmFsdWU7ICAgICAgICAgICAgLyoqPCBIYXNoIHZhbHVlICovCit9OworCisvKioKKyAqIEZ1bmN0aW9uIHVzZWQgdG8gZmluZCBhbmQgb3B0aW9uYWxseSBjcmVhdGUgYSBoYXNoIGVudHJ5LgorICovCit0eXBlZGVmIERCdXNIYXNoRW50cnkqICgqIERCdXNGaW5kRW50cnlGdW5jdGlvbikgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpOworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c0hhc2hUYWJsZS4KKyAqIAorICogSGFzaCB0YWJsZSBpbnRlcm5hbHMuIEhhc2ggdGFibGVzIGFyZSBvcGFxdWUgb2JqZWN0cywgdGhleSBtdXN0IGJlCisgKiB1c2VkIHZpYSBhY2Nlc3NvciBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBEQnVzSGFzaFRhYmxlIHsKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgCisgIERCdXNIYXNoRW50cnkgKipidWNrZXRzOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBidWNrZXQgYXJyYXkuICBFYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVsZW1lbnQgcG9pbnRzIHRvIGZpcnN0IGVudHJ5IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1Y2tldCdzIGhhc2ggY2hhaW4sIG9yICNOVUxMLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hFbnRyeSAqc3RhdGljX2J1Y2tldHNbREJVU19TTUFMTF9IQVNIX1RBQkxFXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQnVja2V0IGFycmF5IHVzZWQgZm9yIHNtYWxsIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHRvIGF2b2lkIG1hbGxvY3MgYW5kIGZyZWVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbl9idWNrZXRzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgYnVja2V0cyBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF0ICoqYnVja2V0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbl9lbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgZW50cmllcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgaGlfcmVidWlsZF9zaXplOyAgICAgICAgICAgICAgICAgLyoqPCBFbmxhcmdlIHRhYmxlIHdoZW4gbl9lbnRyaWVzIGdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGJlIHRoaXMgbGFyZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGxvX3JlYnVpbGRfc2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2hyaW5rIHRhYmxlIHdoZW4gbl9lbnRyaWVzIGdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlbG93IHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGRvd25fc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2hpZnQgY291bnQgdXNlZCBpbiBoYXNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbi4gIERlc2lnbmVkIHRvIHVzZSBoaWdoLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3JkZXIgYml0cyBvZiByYW5kb21pemVkIGtleXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFzayB2YWx1ZSB1c2VkIGluIGhhc2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoVHlwZSBrZXlfdHlwZTsgICAgICAgICAgICAgICAvKio8IFR5cGUgb2Yga2V5cyB1c2VkIGluIHRoaXMgdGFibGUgKi8KKworCisgIERCdXNGaW5kRW50cnlGdW5jdGlvbiBmaW5kX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIGZvciBmaW5kaW5nIGVudHJpZXMgKi8KKworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfa2V5X2Z1bmN0aW9uOyAgIC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBrZXlzICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV92YWx1ZV9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHZhbHVlcyAqLworCisgIERCdXNNZW1Qb29sICplbnRyeV9wb29sOyAgICAgICAgICAgICAgLyoqPCBNZW1vcnkgcG9vbCBmb3IgaGFzaCBlbnRyaWVzICovCit9OworCisvKiogCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNIYXNoSXRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGU7ICAgICAvKio8IFBvaW50ZXIgdG8gdGFibGUgY29udGFpbmluZyBlbnRyeS4gKi8KKyAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldDsgICAvKio8IFBvaW50ZXIgdG8gYnVja2V0IHRoYXQgcG9pbnRzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgZW50cnkgaW4gdGhpcyBlbnRyeSdzIGNoYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZWQgZm9yIGRlbGV0aW5nIHRoZSBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7ICAgICAgLyoqPCBDdXJyZW50IGhhc2ggZW50cnkgKi8KKyAgREJ1c0hhc2hFbnRyeSAqbmV4dF9lbnRyeTsgLyoqPCBOZXh0IGVudHJ5IHRvIGJlIGl0ZXJhdGVkIG9udG8gaW4gY3VycmVudCBidWNrZXQgKi8KKyAgaW50IG5leHRfYnVja2V0OyAgICAgICAgICAgLyoqPCBpbmRleCBvZiBuZXh0IGJ1Y2tldCAqLworICBpbnQgbl9lbnRyaWVzX29uX2luaXQ7ICAgICAvKio8IHVzZWQgdG8gZGV0ZWN0IHRhYmxlIHJlc2l6ZSBzaW5jZSBpbml0aWFsaXphdGlvbiAqLworfSBEQnVzUmVhbEhhc2hJdGVyOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpID09IHNpemVvZiAoREJ1c0hhc2hJdGVyKSk7CisKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KiBmaW5kX2RpcmVjdF9mdW5jdGlvbiAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggICAqcHJlYWxsb2NhdGVkKTsKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KiBmaW5kX3N0cmluZ19mdW5jdGlvbiAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggICAqcHJlYWxsb2NhdGVkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgICBzdHJpbmdfaGFzaCAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgICpzdHIpOworc3RhdGljIHZvaWQgICAgICAgICAgIHJlYnVpbGRfdGFibGUgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlKTsKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KiBhbGxvY19lbnRyeSAgICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgcmVtb3ZlX2VudHJ5ICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICoqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICAgKmVudHJ5KTsKK3N0YXRpYyB2b2lkICAgICAgICAgICBmcmVlX2VudHJ5ICAgICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAgICplbnRyeSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgZnJlZV9lbnRyeV9kYXRhICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICAqZW50cnkpOworCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNIYXNoVGFibGUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzSGFzaEl0ZXIKKyAqCisgKiBQdWJsaWMgb3BhcXVlIGhhc2ggdGFibGUgaXRlcmF0b3Igb2JqZWN0LgorICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c0hhc2hUYWJsZQorICoKKyAqIFB1YmxpYyBvcGFxdWUgaGFzaCB0YWJsZSBvYmplY3QuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzSGFzaFR5cGUKKyAqCisgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgYSBrZXkgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGhhc2ggdGFibGUuIFNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBfZGJ1c19oYXNoX3RhYmxlX3VucmVmKCkuIElmIG1lbW9yeSBjYW5ub3QgYmUKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUsIHJldHVybnMgI05VTEwuCisgKgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgaGFzaCBrZXkgdG8gdXNlLgorICogQHBhcmFtIGtleV9mcmVlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgaGFzaCBrZXlzLgorICogQHBhcmFtIHZhbHVlX2ZyZWVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSBoYXNoIHZhbHVlcy4KKyAqIEByZXR1cm5zIGEgbmV3IERCdXNIYXNoVGFibGUgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCitEQnVzSGFzaFRhYmxlKgorX2RidXNfaGFzaF90YWJsZV9uZXcgKERCdXNIYXNoVHlwZSAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uIGtleV9mcmVlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gdmFsdWVfZnJlZV9mdW5jdGlvbikKK3sKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGU7CisgIERCdXNNZW1Qb29sICplbnRyeV9wb29sOworICAKKyAgdGFibGUgPSBkYnVzX25ldzAgKERCdXNIYXNoVGFibGUsIDEpOworICBpZiAodGFibGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBlbnRyeV9wb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplb2YgKERCdXNIYXNoRW50cnkpLCBUUlVFKTsKKyAgaWYgKGVudHJ5X3Bvb2wgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHRhYmxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHRhYmxlLT5yZWZjb3VudCA9IDE7CisgIHRhYmxlLT5lbnRyeV9wb29sID0gZW50cnlfcG9vbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoREJVU19TTUFMTF9IQVNIX1RBQkxFID09IF9EQlVTX05fRUxFTUVOVFMgKHRhYmxlLT5zdGF0aWNfYnVja2V0cykpOworICAKKyAgdGFibGUtPmJ1Y2tldHMgPSB0YWJsZS0+c3RhdGljX2J1Y2tldHM7ICAKKyAgdGFibGUtPm5fYnVja2V0cyA9IERCVVNfU01BTExfSEFTSF9UQUJMRTsKKyAgdGFibGUtPm5fZW50cmllcyA9IDA7CisgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgPSBEQlVTX1NNQUxMX0hBU0hfVEFCTEUgKiBSRUJVSUxEX01VTFRJUExJRVI7CisgIHRhYmxlLT5sb19yZWJ1aWxkX3NpemUgPSAwOworICB0YWJsZS0+ZG93bl9zaGlmdCA9IDI4OworICB0YWJsZS0+bWFzayA9IDM7CisgIHRhYmxlLT5rZXlfdHlwZSA9IHR5cGU7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+bWFzayA8IHRhYmxlLT5uX2J1Y2tldHMpOworICAKKyAgc3dpdGNoICh0YWJsZS0+a2V5X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19IQVNIX0lOVDoKKyAgICBjYXNlIERCVVNfSEFTSF9VSU5UUFRSOgorICAgICAgdGFibGUtPmZpbmRfZnVuY3Rpb24gPSBmaW5kX2RpcmVjdF9mdW5jdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19IQVNIX1NUUklORzoKKyAgICAgIHRhYmxlLT5maW5kX2Z1bmN0aW9uID0gZmluZF9zdHJpbmdfZnVuY3Rpb247CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5rbm93biBoYXNoIHRhYmxlIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gPSBrZXlfZnJlZV9mdW5jdGlvbjsKKyAgdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gPSB2YWx1ZV9mcmVlX2Z1bmN0aW9uOworCisgIHJldHVybiB0YWJsZTsKK30KKworCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgYSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZSB0byBhZGQgYSByZWZlcmVuY2UgdG8uCisgKiBAcmV0dXJucyB0aGUgaGFzaCB0YWJsZS4KKyAqLworREJ1c0hhc2hUYWJsZSAqCitfZGJ1c19oYXNoX3RhYmxlX3JlZiAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIHRhYmxlLT5yZWZjb3VudCArPSAxOworICAKKyAgcmV0dXJuIHRhYmxlOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgYSBoYXNoIHRhYmxlLAorICogZnJlZWluZyB0aGUgaGFzaCB0YWJsZSBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZSB0byByZW1vdmUgYSByZWZlcmVuY2UgZnJvbS4KKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV91bnJlZiAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIHRhYmxlLT5yZWZjb3VudCAtPSAxOworCisgIGlmICh0YWJsZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisjaWYgMAorICAgICAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgICAgICBEQnVzSGFzaEVudHJ5ICpuZXh0OworICAgICAgaW50IGk7CisKKyAgICAgIC8qIEZyZWUgdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX2J1Y2tldHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5ID0gdGFibGUtPmJ1Y2tldHNbaV07CisgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dDsKKworICAgICAgICAgICAgICBmcmVlX2VudHJ5ICh0YWJsZSwgZW50cnkpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZW50cnkgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisjZWxzZQorICAgICAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgICAgICBpbnQgaTsKKworICAgICAgLyogRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUuICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm5fYnVja2V0czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZW50cnkgPSB0YWJsZS0+YnVja2V0c1tpXTsKKyAgICAgICAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnJlZV9lbnRyeV9kYXRhICh0YWJsZSwgZW50cnkpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgLyogV2UgY2FuIGRvIHRoaXMgdmVyeSBxdWlja2x5IHdpdGggbWVtb3J5IHBvb2xzIDstKSAqLworICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAodGFibGUtPmVudHJ5X3Bvb2wpOworI2VuZGlmCisgICAgICAKKyAgICAgIC8qIEZyZWUgdGhlIGJ1Y2tldCBhcnJheSwgaWYgaXQgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gKi8KKyAgICAgIGlmICh0YWJsZS0+YnVja2V0cyAhPSB0YWJsZS0+c3RhdGljX2J1Y2tldHMpCisgICAgICAgIGRidXNfZnJlZSAodGFibGUtPmJ1Y2tldHMpOworCisgICAgICBkYnVzX2ZyZWUgKHRhYmxlKTsKKyAgICB9Cit9CisKKy8qKgorICogUmVtb3ZlZCBhbGwgZW50cmllcyBmcm9tIGEgaGFzaCB0YWJsZS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20uCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSgmaXRlcik7CisgICAgfQorfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2FsbG9jX2VudHJ5IChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgZW50cnkgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAodGFibGUtPmVudHJ5X3Bvb2wpOworICAKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZAorZnJlZV9lbnRyeV9kYXRhIChEQnVzSGFzaFRhYmxlICAqdGFibGUsCisJCSBEQnVzSGFzaEVudHJ5ICAqZW50cnkpCit7CisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pCisgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikKKyAgICAoKiB0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKGVudHJ5LT52YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2VudHJ5IChEQnVzSGFzaFRhYmxlICAqdGFibGUsCisgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAqZW50cnkpCit7CisgIGZyZWVfZW50cnlfZGF0YSAodGFibGUsIGVudHJ5KTsKKyAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAodGFibGUtPmVudHJ5X3Bvb2wsIGVudHJ5KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgKnRhYmxlLAorICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0LAorICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAqZW50cnkpCit7CisgIF9kYnVzX2Fzc2VydCAodGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoYnVja2V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCpidWNrZXQgIT0gTlVMTCk7ICAKKyAgX2RidXNfYXNzZXJ0IChlbnRyeSAhPSBOVUxMKTsKKyAgCisgIGlmICgqYnVja2V0ID09IGVudHJ5KQorICAgICpidWNrZXQgPSBlbnRyeS0+bmV4dDsKKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNIYXNoRW50cnkgKnByZXY7CisgICAgICBwcmV2ID0gKmJ1Y2tldDsKKworICAgICAgd2hpbGUgKHByZXYtPm5leHQgIT0gZW50cnkpCisgICAgICAgIHByZXYgPSBwcmV2LT5uZXh0OyAgICAgIAorICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHByZXYgIT0gTlVMTCk7CisKKyAgICAgIHByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgIAorICB0YWJsZS0+bl9lbnRyaWVzIC09IDE7CisgIGZyZWVfZW50cnkgKHRhYmxlLCBlbnRyeSk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBoYXNoIHRhYmxlIGl0ZXJhdG9yLiBUbyBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMgaW4gYQorICogaGFzaCB0YWJsZSwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSAodGhlIHByaW50ZiBhc3N1bWVzIGEgaGFzaAorICogZnJvbSBzdHJpbmdzIHRvIHN0cmluZ3Mgb2J2aW91c2x5KToKKyAqCisgKiBAY29kZQorICogREJ1c0hhc2hJdGVyIGl0ZXI7CisgKgorICogX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlLCAmaXRlcik7CisgKiB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAqICAgeworICogICAgICBwcmludGYgKCJUaGUgZmlyc3Qga2V5IGlzICVzIGFuZCB2YWx1ZSBpcyAlc1xuIiwKKyAqICAgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKCZpdGVyKSwKKyAqICAgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcikpOworICogICB9CisgKiAKKyAqIAorICogQGVuZGNvZGUKKyAqCisgKiBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQgcG9pbnRpbmcgIm9uZSBiZWZvcmUiIHRoZSBmaXJzdCBoYXNoCisgKiBlbnRyeS4gVGhlIGZpcnN0IGNhbGwgdG8gX2RidXNfaGFzaF9pdGVyX25leHQoKSBtb3ZlcyBpdCBvbnRvCisgKiB0aGUgZmlyc3QgdmFsaWQgZW50cnkgb3IgcmV0dXJucyAjRkFMU0UgaWYgdGhlIGhhc2ggdGFibGUgaXMKKyAqIGVtcHR5LiBTdWJzZXF1ZW50IGNhbGxzIG1vdmUgdG8gdGhlIG5leHQgdmFsaWQgZW50cnkgb3IgcmV0dXJuCisgKiAjRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcy4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBzYWZlIHRvIHJlbW92ZSBhIGhhc2ggZW50cnkgZHVyaW5nCisgKiBpdGVyYXRpb24sIGJ1dCBpdCBpcyBub3Qgc2FmZSB0byBhZGQgYSBoYXNoIGVudHJ5LgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gaXRlcmF0ZSBvdmVyLgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUuCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfaXRlcl9pbml0IChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEl0ZXIgICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworICAKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzSGFzaEl0ZXIpID09IHNpemVvZiAoREJ1c1JlYWxIYXNoSXRlcikpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICByZWFsLT50YWJsZSA9IHRhYmxlOworICByZWFsLT5idWNrZXQgPSBOVUxMOworICByZWFsLT5lbnRyeSA9IE5VTEw7CisgIHJlYWwtPm5leHRfZW50cnkgPSBOVUxMOworICByZWFsLT5uZXh0X2J1Y2tldCA9IDA7CisgIHJlYWwtPm5fZW50cmllc19vbl9pbml0ID0gdGFibGUtPm5fZW50cmllczsKK30KKworLyoqCisgKiBNb3ZlIHRoZSBoYXNoIGl0ZXJhdG9yIGZvcndhcmQgb25lIHN0ZXAsIHRvIHRoZSBuZXh0IGhhc2ggZW50cnkuCisgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgX2RidXNfaGFzaF9pdGVyX2luaXQoKSBleHBsYWlucyBpbiBtb3JlCisgKiBkZXRhaWwuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIG1vdmUgZm9yd2FyZC4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIHRvIG1vdmUgdG8uCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgLyogaWYgdGhpcyBhc3NlcnRpb24gZmFpbGVkIHNvbWVvbmUgcHJvYmFibHkgYWRkZWQgaGFzaCBlbnRyaWVzCisgICAqIGR1cmluZyBpdGVyYXRpb24sIHdoaWNoIGlzIGJhZC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+bl9lbnRyaWVzX29uX2luaXQgPj0gcmVhbC0+dGFibGUtPm5fZW50cmllcyk7CisgIAorICAvKiBSZW1lbWJlciB0aGF0IHJlYWwtPmVudHJ5IG1heSBoYXZlIGJlZW4gZGVsZXRlZCAqLworICAKKyAgd2hpbGUgKHJlYWwtPm5leHRfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocmVhbC0+bmV4dF9idWNrZXQgPj0gcmVhbC0+dGFibGUtPm5fYnVja2V0cykKKyAgICAgICAgeworICAgICAgICAgIC8qIGludmFsaWRhdGUgaXRlciBhbmQgcmV0dXJuIGZhbHNlICovCisgICAgICAgICAgcmVhbC0+ZW50cnkgPSBOVUxMOworICAgICAgICAgIHJlYWwtPnRhYmxlID0gTlVMTDsKKyAgICAgICAgICByZWFsLT5idWNrZXQgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZWFsLT5idWNrZXQgPSAmKHJlYWwtPnRhYmxlLT5idWNrZXRzW3JlYWwtPm5leHRfYnVja2V0XSk7CisgICAgICByZWFsLT5uZXh0X2VudHJ5ID0gKihyZWFsLT5idWNrZXQpOworICAgICAgcmVhbC0+bmV4dF9idWNrZXQgKz0gMTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5uZXh0X2VudHJ5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmJ1Y2tldCAhPSBOVUxMKTsKKyAgCisgIHJlYWwtPmVudHJ5ID0gcmVhbC0+bmV4dF9lbnRyeTsKKyAgcmVhbC0+bmV4dF9lbnRyeSA9IHJlYWwtPmVudHJ5LT5uZXh0OworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgY3VycmVudCBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlLgorICogSWYgYSBrZXlfZnJlZV9mdW5jdGlvbiBvciB2YWx1ZV9mcmVlX2Z1bmN0aW9uCisgKiB3YXMgcHJvdmlkZWQgdG8gX2RidXNfaGFzaF90YWJsZV9uZXcoKSwKKyAqIGZyZWVzIHRoZSBrZXkgYW5kL29yIHZhbHVlIGZvciB0aGlzIGVudHJ5LgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmJ1Y2tldCAhPSBOVUxMKTsKKyAgCisgIHJlbW92ZV9lbnRyeSAocmVhbC0+dGFibGUsIHJlYWwtPmJ1Y2tldCwgcmVhbC0+ZW50cnkpOworCisgIHJlYWwtPmVudHJ5ID0gTlVMTDsgLyogbWFrZSBpdCBjcmFzaCBpZiB5b3UgdHJ5IHRvIHVzZSB0aGlzIGVudHJ5ICovCit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZW50cnkuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK3ZvaWQqCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlIChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIHJldHVybiByZWFsLT5lbnRyeS0+dmFsdWU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZW50cnkuCisgKiBJZiB0aGUgaGFzaCB0YWJsZSBoYXMgYSB2YWx1ZV9mcmVlX2Z1bmN0aW9uCisgKiBpdCB3aWxsIGJlIHVzZWQgdG8gZnJlZSB0aGUgcHJldmlvdXMgdmFsdWUuCisgKiBUaGUgaGFzaCB0YWJsZSB3aWxsIG93biB0aGUgcGFzc2VkLWluIHZhbHVlCisgKiAoaXQgd2lsbCBub3QgYmUgY29waWVkKS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlIChEQnVzSGFzaEl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKnZhbHVlKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICBpZiAocmVhbC0+dGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgdmFsdWUgIT0gcmVhbC0+ZW50cnktPnZhbHVlKSAgICAKKyAgICAoKiByZWFsLT50YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKHJlYWwtPmVudHJ5LT52YWx1ZSk7CisgIAorICByZWFsLT5lbnRyeS0+dmFsdWUgPSB2YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX0lOVC4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLworaW50CitfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIF9EQlVTX1BPSU5URVJfVE9fSU5UIChyZWFsLT5lbnRyeS0+a2V5KTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX1VJTlRQVFIuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK3VpbnRwdHJfdAorX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gKHVpbnRwdHJfdCkgcmVhbC0+ZW50cnktPmtleTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorICogT25seSB3b3JrcyBmb3IgaGFzaCB0YWJsZXMgb2YgdHlwZSAjREJVU19IQVNIX1NUUklORworICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHJlYWwtPmVudHJ5LT5rZXk7Cit9CisKKy8qKgorICogQSBsb3ctbGV2ZWwgYnV0IGVmZmljaWVudCBpbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyB0aGUgaGFzaAorICogdGFibGUuICBJdCdzIGVmZmljaWVudCBiZWNhdXNlIHlvdSBjYW4gZ2V0LCBzZXQsIGFuZCBvcHRpb25hbGx5CisgKiBjcmVhdGUgdGhlIGhhc2ggZW50cnkgd2hpbGUgb25seSBydW5uaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIG9uZQorICogdGltZS4KKyAqCisgKiBOb3RlIHRoYXQgd2hpbGUgY2FsbGluZyBfZGJ1c19oYXNoX2l0ZXJfbmV4dCgpIG9uIHRoZSBpdGVyYXRvcgorICogZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24gbWF5IHdvcmssIGl0J3MgY29tcGxldGVseQorICogdW5kZWZpbmVkIHdoaWNoIGVudHJpZXMgYXJlIGFmdGVyIHRoaXMgaXRlciBhbmQgd2hpY2gKKyAqIGFyZSBiZWZvcmUgaXQuIFNvIGl0IHdvdWxkIGJlIHNpbGx5IHRvIGl0ZXJhdGUgdXNpbmcgdGhpcworICogaXRlcmF0b3IuCisgKgorICogSWYgdGhlIGhhc2ggZW50cnkgaXMgY3JlYXRlZCwgaXRzIHZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIGFsbCBiaXRzIHplcm8uCisgKgorICogI0ZBTFNFIG1heSBiZSByZXR1cm5lZCBkdWUgdG8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IKKyAqIGJlY2F1c2UgY3JlYXRlX2lmX25vdF9mb3VuZCB3YXMgI0ZBTFNFIGFuZCB0aGUgZW50cnkKKyAqIGRpZCBub3QgZXhpc3QuCisgKgorICogSWYgY3JlYXRlX2lmX25vdF9mb3VuZCBpcyAjVFJVRSBhbmQgdGhlIGVudHJ5IGlzIGNyZWF0ZWQsIHRoZSBoYXNoCisgKiB0YWJsZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGtleSB0aGF0J3MgcGFzc2VkIGluLgorICoKKyAqIEZvciBhIGhhc2ggdGFibGUgb2YgdHlwZSAjREJVU19IQVNIX0lOVCwgY2FzdCB0aGUgaW50CisgKiBrZXkgdG8gdGhlIGtleSBwYXJhbWV0ZXIgdXNpbmcgI19EQlVTX0lOVF9UT19QT0lOVEVSKCkuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgaWYgI1RSVUUsIGNyZWF0ZSB0aGUgZW50cnkgaWYgaXQgZGlkbid0IGV4aXN0LgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaGFzaCBlbnRyeSBub3cgZXhpc3RzIChhbmQgdGhlIGl0ZXJhdG9yIGlzIHRodXMgdmFsaWQpLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNIYXNoSXRlcikgPT0gc2l6ZW9mIChEQnVzUmVhbEhhc2hJdGVyKSk7CisgIAorICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAmYnVja2V0LCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICByZWFsLT50YWJsZSA9IHRhYmxlOworICByZWFsLT5idWNrZXQgPSBidWNrZXQ7CisgIHJlYWwtPmVudHJ5ID0gZW50cnk7CisgIHJlYWwtPm5leHRfZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgcmVhbC0+bmV4dF9idWNrZXQgPSAoYnVja2V0IC0gdGFibGUtPmJ1Y2tldHMpICsgMTsKKyAgcmVhbC0+bl9lbnRyaWVzX29uX2luaXQgPSB0YWJsZS0+bl9lbnRyaWVzOyAKKworICBfZGJ1c19hc3NlcnQgKCYodGFibGUtPmJ1Y2tldHNbcmVhbC0+bmV4dF9idWNrZXQtMV0pID09IHJlYWwtPmJ1Y2tldCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9hbGxvY2F0ZWRfZW50cnkgKERCdXNIYXNoVGFibGUgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgKioqYnVja2V0KQoreworICBEQnVzSGFzaEVudHJ5ICoqYjsgIAorICAKKyAgZW50cnktPmtleSA9IGtleTsKKyAgCisgIGIgPSAmKHRhYmxlLT5idWNrZXRzW2lkeF0pOworICBlbnRyeS0+bmV4dCA9ICpiOworICAqYiA9IGVudHJ5OworCisgIGlmIChidWNrZXQpCisgICAgKmJ1Y2tldCA9IGI7CisgIAorICB0YWJsZS0+bl9lbnRyaWVzICs9IDE7CisKKyAgLyogbm90ZSB3ZSBPTkxZIHJlYnVpbGQgd2hlbiBBRERJTkcgLSBiZWNhdXNlIHlvdSBjYW4gaXRlcmF0ZSBvdmVyIGEKKyAgICogdGFibGUgYW5kIHJlbW92ZSBlbnRyaWVzIHNhZmVseS4KKyAgICovCisgIGlmICh0YWJsZS0+bl9lbnRyaWVzID49IHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgfHwKKyAgICAgIHRhYmxlLT5uX2VudHJpZXMgPCB0YWJsZS0+bG9fcmVidWlsZF9zaXplKQorICAgIHJlYnVpbGRfdGFibGUgKHRhYmxlKTsKK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCithZGRfZW50cnkgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwgCisgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpZHgsCisgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIERCdXNIYXNoRW50cnkgICplbnRyeTsKKworICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgeworICAgICAgZW50cnkgPSBhbGxvY19lbnRyeSAodGFibGUpOworICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYnVja2V0KQorICAgICAgICAgICAgKmJ1Y2tldCA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlbnRyeSA9IChEQnVzSGFzaEVudHJ5KikgcHJlYWxsb2NhdGVkOworICAgIH0KKworICBhZGRfYWxsb2NhdGVkX2VudHJ5ICh0YWJsZSwgZW50cnksIGlkeCwga2V5LCBidWNrZXQpOworCisgIHJldHVybiBlbnRyeTsKK30KKworLyogVGhpcyBpcyBnX3N0cl9oYXNoIGZyb20gR0xpYiB3aGljaCB3YXMKKyAqIGV4dGVuc2l2ZWx5IGRpc2N1c3NlZC90ZXN0ZWQvcHJvZmlsZWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorc3RyaW5nX2hhc2ggKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgY29uc3QgY2hhciAqcCA9IHN0cjsKKyAgdW5zaWduZWQgaW50IGggPSAqcDsKKworICBpZiAoaCkKKyAgICBmb3IgKHAgKz0gMTsgKnAgIT0gJ1wwJzsgcCsrKQorICAgICAgaCA9IChoIDw8IDUpIC0gaCArICpwOworCisgIHJldHVybiBoOworfQorCisvKiogS2V5IGNvbXBhcmlzb24gZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqIEtleUNvbXBhcmVGdW5jKSAoY29uc3Qgdm9pZCAqa2V5X2EsIGNvbnN0IHZvaWQgKmtleV9iKTsKKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX2dlbmVyaWNfZnVuY3Rpb24gKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5Q29tcGFyZUZ1bmMgICAgICAgIGNvbXBhcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIGlmIChidWNrZXQpCisgICAgKmJ1Y2tldCA9IE5VTEw7CisKKyAgLyogU2VhcmNoIGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGlzIGJ1Y2tldC4gKi8KKyAgZW50cnkgPSB0YWJsZS0+YnVja2V0c1tpZHhdOworICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKGNvbXBhcmVfZnVuYyA9PSBOVUxMICYmIGtleSA9PSBlbnRyeS0+a2V5KSB8fAorICAgICAgICAgIChjb21wYXJlX2Z1bmMgIT0gTlVMTCAmJiAoKiBjb21wYXJlX2Z1bmMpIChrZXksIGVudHJ5LT5rZXkpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJ1Y2tldCkKKyAgICAgICAgICAgICpidWNrZXQgPSAmKHRhYmxlLT5idWNrZXRzW2lkeF0pOworCisgICAgICAgICAgaWYgKHByZWFsbG9jYXRlZCkKKyAgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBwcmVhbGxvY2F0ZWQpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKworICBpZiAoY3JlYXRlX2lmX25vdF9mb3VuZCkKKyAgICBlbnRyeSA9IGFkZF9lbnRyeSAodGFibGUsIGlkeCwga2V5LCBidWNrZXQsIHByZWFsbG9jYXRlZCk7CisgIGVsc2UgaWYgKHByZWFsbG9jYXRlZCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5ICh0YWJsZSwgcHJlYWxsb2NhdGVkKTsKKyAgCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX3N0cmluZ19mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICB1bnNpZ25lZCBpbnQgaWR4OworICAKKyAgaWR4ID0gc3RyaW5nX2hhc2ggKGtleSkgJiB0YWJsZS0+bWFzazsKKworICByZXR1cm4gZmluZF9nZW5lcmljX2Z1bmN0aW9uICh0YWJsZSwga2V5LCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLZXlDb21wYXJlRnVuYykgc3RyY21wLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCk7Cit9CisKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KgorZmluZF9kaXJlY3RfZnVuY3Rpb24gKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgdW5zaWduZWQgaW50IGlkeDsKKyAgCisgIGlkeCA9IFJBTkRPTV9JTkRFWCAodGFibGUsIGtleSkgJiB0YWJsZS0+bWFzazsKKworCisgIHJldHVybiBmaW5kX2dlbmVyaWNfZnVuY3Rpb24gKHRhYmxlLCBrZXksIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQpOworfQorCitzdGF0aWMgdm9pZAorcmVidWlsZF90YWJsZSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIGludCBvbGRfc2l6ZTsKKyAgaW50IG5ld19idWNrZXRzOworICBEQnVzSGFzaEVudHJ5ICoqb2xkX2J1Y2tldHM7CisgIERCdXNIYXNoRW50cnkgKipvbGRfY2hhaW47CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBkYnVzX2Jvb2xfdCBncm93aW5nOworICAKKyAgLyoKKyAgICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIG5ldyBidWNrZXQgYXJyYXksIGFuZCBzZXQgdXAKKyAgICogaGFzaGluZyBjb25zdGFudHMgZm9yIG5ldyBhcnJheSBzaXplLgorICAgKi8KKworICBncm93aW5nID0gdGFibGUtPm5fZW50cmllcyA+PSB0YWJsZS0+aGlfcmVidWlsZF9zaXplOworICAKKyAgb2xkX3NpemUgPSB0YWJsZS0+bl9idWNrZXRzOworICBvbGRfYnVja2V0cyA9IHRhYmxlLT5idWNrZXRzOworCisgIGlmIChncm93aW5nKQorICAgIHsKKyAgICAgIC8qIG92ZXJmbG93IHBhcmFub2lhICovCisgICAgICBpZiAodGFibGUtPm5fYnVja2V0cyA8IF9EQlVTX0lOVF9NQVggLyA0ICYmCisgICAgICAgICAgdGFibGUtPmRvd25fc2hpZnQgPj0gMCkKKyAgICAgICAgbmV3X2J1Y2tldHMgPSB0YWJsZS0+bl9idWNrZXRzICogNDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOyAvKiBjYW4ndCBncm93IGFueW1vcmUgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXdfYnVja2V0cyA9IHRhYmxlLT5uX2J1Y2tldHMgLyA0OworICAgICAgaWYgKG5ld19idWNrZXRzIDwgREJVU19TTUFMTF9IQVNIX1RBQkxFKQorICAgICAgICByZXR1cm47IC8qIGRvbid0IGJvdGhlciBzaHJpbmtpbmcgdGhpcyBmYXIgKi8KKyAgICB9CisKKyAgdGFibGUtPmJ1Y2tldHMgPSBkYnVzX25ldzAgKERCdXNIYXNoRW50cnkqLCBuZXdfYnVja2V0cyk7CisgIGlmICh0YWJsZS0+YnVja2V0cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG91dCBvZiBtZW1vcnksIHlheSAtIGp1c3QgZG9uJ3QgcmVhbGxvY2F0ZSwgdGhlIHRhYmxlIHdpbGwKKyAgICAgICAqIHN0aWxsIHdvcmssIGFsYmVpdCBtb3JlIHNsb3dseS4KKyAgICAgICAqLworICAgICAgdGFibGUtPmJ1Y2tldHMgPSBvbGRfYnVja2V0czsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdGFibGUtPm5fYnVja2V0cyA9IG5ld19idWNrZXRzOworICAKKyAgaWYgKGdyb3dpbmcpCisgICAgeworICAgICAgdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSA9IHRhYmxlLT5oaV9yZWJ1aWxkX3NpemU7CisgICAgICB0YWJsZS0+aGlfcmVidWlsZF9zaXplICo9IDQ7CisgICAgICAKKyAgICAgIHRhYmxlLT5kb3duX3NoaWZ0IC09IDI7ICAgICAgICAgICAgICAgLyoga2VlcCAyIG1vcmUgaGlnaCBiaXRzICovCisgICAgICB0YWJsZS0+bWFzayA9ICh0YWJsZS0+bWFzayA8PCAyKSArIDM7IC8qIGtlZXAgMiBtb3JlIGhpZ2ggYml0cyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgPSB0YWJsZS0+bG9fcmVidWlsZF9zaXplOworICAgICAgdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSAvPSA0OworCisgICAgICB0YWJsZS0+ZG93bl9zaGlmdCArPSAyOyAgICAgICAgIC8qIGtlZXAgMiBmZXdlciBoaWdoIGJpdHMgKi8KKyAgICAgIHRhYmxlLT5tYXNrID0gdGFibGUtPm1hc2sgPj4gMjsgLyoga2VlcCAyIGZld2VyIGhpZ2ggYml0cyAqLworICAgIH0KKworI2lmIDAKKyAgcHJpbnRmICgiJXMgdGFibGUgdG8gbG8gPSAlZCBoaSA9ICVkIGRvd25zaGlmdCA9ICVkIG1hc2sgPSAweCV4XG4iLAorICAgICAgICAgIGdyb3dpbmcgPyAiR1JPVyIgOiAiU0hSSU5LIiwKKyAgICAgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplLAorICAgICAgICAgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUsCisgICAgICAgICAgdGFibGUtPmRvd25fc2hpZnQsCisgICAgICAgICAgdGFibGUtPm1hc2spOworI2VuZGlmCisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5sb19yZWJ1aWxkX3NpemUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmhpX3JlYnVpbGRfc2l6ZSA+IHRhYmxlLT5sb19yZWJ1aWxkX3NpemUpOworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5tYXNrICE9IDApOworICAvKiB0aGUgbWFzayBpcyBlc3NlbnRpYWxseSB0aGUgbWF4IGluZGV4ICovCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPm1hc2sgPCB0YWJsZS0+bl9idWNrZXRzKTsKKyAgCisgIC8qCisgICAqIFJlaGFzaCBhbGwgb2YgdGhlIGV4aXN0aW5nIGVudHJpZXMgaW50byB0aGUgbmV3IGJ1Y2tldCBhcnJheS4KKyAgICovCisKKyAgZm9yIChvbGRfY2hhaW4gPSBvbGRfYnVja2V0czsgb2xkX3NpemUgPiAwOyBvbGRfc2l6ZS0tLCBvbGRfY2hhaW4rKykKKyAgICB7CisgICAgICBmb3IgKGVudHJ5ID0gKm9sZF9jaGFpbjsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSAqb2xkX2NoYWluKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IGlkeDsKKyAgICAgICAgICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAgICAgICAgIAorICAgICAgICAgICpvbGRfY2hhaW4gPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICBzd2l0Y2ggKHRhYmxlLT5rZXlfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgREJVU19IQVNIX1NUUklORzoKKyAgICAgICAgICAgICAgaWR4ID0gc3RyaW5nX2hhc2ggKGVudHJ5LT5rZXkpICYgdGFibGUtPm1hc2s7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfSU5UOgorICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfVUlOVFBUUjoKKyAgICAgICAgICAgICAgaWR4ID0gUkFORE9NX0lOREVYICh0YWJsZSwgZW50cnktPmtleSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWR4ID0gMDsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5rbm93biBoYXNoIHRhYmxlIHR5cGUiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgYnVja2V0ID0gJih0YWJsZS0+YnVja2V0c1tpZHhdKTsKKyAgICAgICAgICBlbnRyeS0+bmV4dCA9ICpidWNrZXQ7CisgICAgICAgICAgKmJ1Y2tldCA9IGVudHJ5OworICAgICAgICB9CisgICAgfQorICAKKyAgLyogRnJlZSB0aGUgb2xkIGJ1Y2tldCBhcnJheSwgaWYgaXQgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gKi8KKworICBpZiAob2xkX2J1Y2tldHMgIT0gdGFibGUtPnN0YXRpY19idWNrZXRzKQorICAgIGRidXNfZnJlZSAob2xkX2J1Y2tldHMpOworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlCisgKiBvZiB0eXBlICNEQlVTX0hBU0hfU1RSSU5HLiBSZXR1cm5zICVOVUxMIGlmIHRoZSB2YWx1ZQorICogaXMgbm90IHByZXNlbnQuIChBIG5vdC1wcmVzZW50IGVudHJ5IGlzIGluZGlzdGluZ3Vpc2hhYmxlCisgKiBmcm9tIGFuIGVudHJ5IHdpdGggYSB2YWx1ZSBvZiAlTlVMTC4pCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBzdHJpbmcgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1NUUklORyk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIChjaGFyKikga2V5LCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBMb29rcyB1cCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gaW50ZWdlciBpbiBhIGhhc2ggdGFibGUKKyAqIG9mIHR5cGUgI0RCVVNfSEFTSF9JTlQuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBMb29rcyB1cCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gaW50ZWdlciBpbiBhIGhhc2ggdGFibGUKKyAqIG9mIHR5cGUgI0RCVVNfSEFTSF9VSU5UUFRSLiBSZXR1cm5zICVOVUxMIGlmIHRoZSB2YWx1ZQorICogaXMgbm90IHByZXNlbnQuIChBIG5vdC1wcmVzZW50IGVudHJ5IGlzIGluZGlzdGluZ3Vpc2hhYmxlCisgKiBmcm9tIGFuIGVudHJ5IHdpdGggYSB2YWx1ZSBvZiAlTlVMTC4pCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBpbnRlZ2VyIHRvIGxvb2sgdXAuCisgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhhc2ggZW50cnkuCisgKi8KK3ZvaWQqCitfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1VJTlRQVFIpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCAodm9pZCopIGtleSwgRkFMU0UsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSkKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgaGFzaCBlbnRyeSBmb3IgdGhlIGdpdmVuIGtleS4gSWYgbm8gaGFzaCBlbnRyeQorICogZm9yIHRoZSBrZXkgZXhpc3RzLCBkb2VzIG5vdGhpbmcuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBrZXkuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZW50cnkgZXhpc3RlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqa2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKyAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldDsKKyAgCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCAoY2hhciopIGtleSwgRkFMU0UsICZidWNrZXQsIE5VTEwpOworCisgIGlmIChlbnRyeSkKKyAgICB7CisgICAgICByZW1vdmVfZW50cnkgKHRhYmxlLCBidWNrZXQsIGVudHJ5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBrZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisgIAorICBpZiAoZW50cnkpCisgICAgeworICAgICAgcmVtb3ZlX2VudHJ5ICh0YWJsZSwgYnVja2V0LCBlbnRyeSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgaGFzaCBlbnRyeSBmb3IgdGhlIGdpdmVuIGtleS4gSWYgbm8gaGFzaCBlbnRyeQorICogZm9yIHRoZSBrZXkgZXhpc3RzLCBkb2VzIG5vdGhpbmcuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBrZXkuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZW50cnkgZXhpc3RlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgICAgICBrZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1VJTlRQVFIpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCAodm9pZCopIGtleSwgRkFMU0UsICZidWNrZXQsIE5VTEwpOworICAKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBoYXNoIGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUuCisgKiBUaGUga2V5IGFuZCB2YWx1ZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgaGFzaCB0YWJsZSBieSByZWZlcmVuY2UuIElmIGFuIGVudHJ5IHdpdGggdGhlCisgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBwcmV2aW91cyBrZXkgYW5kIHZhbHVlCisgKiBhcmUgb3ZlcndyaXR0ZW4gKGFuZCBmcmVlZCBpZiB0aGUgaGFzaCB0YWJsZSBoYXMKKyAqIGEga2V5X2ZyZWVfZnVuY3Rpb24gYW5kL29yIHZhbHVlX2ZyZWVfZnVuY3Rpb24pLgorICoKKyAqIFJldHVybnMgI0ZBTFNFIGlmIG1lbW9yeSBmb3IgdGhlIG5ldyBoYXNoIGVudHJ5CisgKiBjYW4ndCBiZSBhbGxvY2F0ZWQuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2ggZW50cnkga2V5LgorICogQHBhcmFtIHZhbHVlIHRoZSBoYXNoIGVudHJ5IHZhbHVlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfU1RSSU5HKTsKKworICBwcmVhbGxvY2F0ZWQgPSBfZGJ1c19oYXNoX3RhYmxlX3ByZWFsbG9jYXRlX2VudHJ5ICh0YWJsZSk7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAodGFibGUsIHByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9JTlQpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KSwgVFJVRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBubyBtZW1vcnkgKi8KKworICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uICYmIGVudHJ5LT5rZXkgIT0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSkpCisgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisgIAorICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgZW50cnktPnZhbHVlICE9IHZhbHVlKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKKyAgCisgIGVudHJ5LT5rZXkgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KTsKKyAgZW50cnktPnZhbHVlID0gdmFsdWU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGhhc2ggZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4KKyAqIFRoZSBrZXkgYW5kIHZhbHVlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSBzdG9yZWQKKyAqIGluIHRoZSBoYXNoIHRhYmxlIGJ5IHJlZmVyZW5jZS4gSWYgYW4gZW50cnkgd2l0aCB0aGUKKyAqIGdpdmVuIGtleSBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGtleSBhbmQgdmFsdWUKKyAqIGFyZSBvdmVyd3JpdHRlbiAoYW5kIGZyZWVkIGlmIHRoZSBoYXNoIHRhYmxlIGhhcworICogYSBrZXlfZnJlZV9mdW5jdGlvbiBhbmQvb3IgdmFsdWVfZnJlZV9mdW5jdGlvbikuCisgKgorICogUmV0dXJucyAjRkFMU0UgaWYgbWVtb3J5IGZvciB0aGUgbmV3IGhhc2ggZW50cnkKKyAqIGNhbid0IGJlIGFsbG9jYXRlZC4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBlbnRyeSBrZXkuCisgKiBAcGFyYW0gdmFsdWUgdGhlIGhhc2ggZW50cnkgdmFsdWUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBUUlVFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIG5vIG1lbW9yeSAqLworCisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gJiYgZW50cnktPmtleSAhPSAodm9pZCopIGtleSkKKyAgICAoKiB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pIChlbnRyeS0+a2V5KTsKKyAgCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAKKyAgZW50cnktPmtleSA9ICh2b2lkKikga2V5OworICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQcmVhbGxvY2F0ZSBhbiBvcGFxdWUgZGF0YSBibG9iIHRoYXQgYWxsb3dzIHVzIHRvIGluc2VydCBpbnRvIHRoZQorICogaGFzaCB0YWJsZSBhdCBhIGxhdGVyIHRpbWUgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcmV0dXJucyB0aGUgcHJlYWxsb2NhdGVkIGRhdGEsIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzUHJlYWxsb2NhdGVkSGFzaCoKK19kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKyAgCisgIGVudHJ5ID0gYWxsb2NfZW50cnkgKHRhYmxlKTsKKworICByZXR1cm4gKERCdXNQcmVhbGxvY2F0ZWRIYXNoKikgZW50cnk7Cit9CisKKy8qKgorICogRnJlZXMgYW4gb3BhcXVlIERCdXNQcmVhbGxvY2F0ZWRIYXNoIHRoYXQgd2FzICpub3QqIHVzZWQKKyAqIGluIG9yZGVyIHRvIGluc2VydCBpbnRvIHRoZSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZQorICogQHBhcmFtIHByZWFsbG9jYXRlZCB0aGUgcHJlYWxsb2NhdGVkIGRhdGEKKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0IChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7CisgIAorICBlbnRyeSA9IChEQnVzSGFzaEVudHJ5KikgcHJlYWxsb2NhdGVkOworICAKKyAgLyogRG9uJ3QgdXNlIGZyZWVfZW50cnkoKSwgc2luY2UgdGhpcyBlbnRyeSBoYXMgbm8ga2V5L2RhdGEgKi8KKyAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAodGFibGUtPmVudHJ5X3Bvb2wsIGVudHJ5KTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgc3RyaW5nLWtleWVkIGVudHJ5IGludG8gdGhlIGhhc2ggdGFibGUsIHVzaW5nIGEKKyAqIHByZWFsbG9jYXRlZCBkYXRhIGJsb2NrIGZyb20KKyAqIF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkoKS4gVGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbCBkdWUKKyAqIHRvIGxhY2sgb2YgbWVtb3J5LiBUaGUgREJ1c1ByZWFsbG9jYXRlZEhhc2ggb2JqZWN0IGlzIGNvbnN1bWVkIGFuZAorICogc2hvdWxkIG5vdCBiZSByZXVzZWQgb3IgZnJlZWQuIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIHdvcmtzCisgKiBqdXN0IGxpa2UgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nKCkuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YQorICogQHBhcmFtIGtleSB0aGUgaGFzaCBrZXkKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfU1RSSU5HKTsKKyAgX2RidXNfYXNzZXJ0IChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIGtleSwgVFJVRSwgTlVMTCwgcHJlYWxsb2NhdGVkKTsKKworICBfZGJ1c19hc3NlcnQgKGVudHJ5ICE9IE5VTEwpOworICAKKyAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiAmJiBlbnRyeS0+a2V5ICE9IGtleSkKKyAgICAoKiB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pIChlbnRyeS0+a2V5KTsKKworICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgZW50cnktPnZhbHVlICE9IHZhbHVlKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKKyAgICAgIAorICBlbnRyeS0+a2V5ID0ga2V5OworICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBudW1iZXIgb2YgaGFzaCBlbnRyaWVzIGluIGEgaGFzaCB0YWJsZS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlLgorICovCitpbnQKK19kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIHJldHVybiB0YWJsZS0+bl9lbnRyaWVzOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogSWYgeW91J3JlIHdvbmRlcmluZyB3aHkgdGhlIGhhc2ggdGFibGUgdGVzdCB0YWtlcworICogZm9yZXZlciB0byBydW4sIGl0J3MgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqIGluIGlubmVyIGxvb3BzIHRodXMgbWFraW5nIHRoaW5ncyBxdWFkcmF0aWMuCisgKi8KK3N0YXRpYyBpbnQKK2NvdW50X2VudHJpZXMgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgaW50IGNvdW50OworCisgIGNvdW50ID0gMDsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICsrY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudCA9PSBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHRhYmxlKSk7CisgIAorICByZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c0hhc2hUYWJsZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzSGFzaFRhYmxlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90ZXN0ICh2b2lkKQoreworICBpbnQgaTsKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGUxOworICBEQnVzSGFzaFRhYmxlICp0YWJsZTI7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlMzsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisjZGVmaW5lIE5fSEFTSF9LRVlTIDUwMDAKKyAgY2hhciAqKmtleXM7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworCisgIGtleXMgPSBkYnVzX25ldyAoY2hhciAqLCBOX0hBU0hfS0VZUyk7CisgIGlmIChrZXlzID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fSEFTSF9LRVlTOyBpKyspCisgICAgeworICAgICAga2V5c1tpXSA9IGRidXNfbWFsbG9jICgxMjgpOworCisgICAgICBpZiAoa2V5c1tpXSA9PSBOVUxMKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKworICBwcmludGYgKCJDb21wdXRpbmcgdGVzdCBoYXNoIGtleXMuLi5cbiIpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX0hBU0hfS0VZUykKKyAgICB7CisgICAgICBpbnQgbGVuOworCisgICAgICBsZW4gPSBzcHJpbnRmIChrZXlzW2ldLCAiSGFzaCBrZXkgJWQiLCBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKihrZXlzW2ldICsgbGVuKSA9PSAnXDAnKTsKKyAgICAgICsraTsKKyAgICB9CisgIHByaW50ZiAoIi4uLiBkb25lLlxuIik7CisgIAorICB0YWJsZTEgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHRhYmxlMiA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMiA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHRhYmxlMyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTMgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICAvKiBJbnNlcnQgYW5kIHJlbW92ZSBhIGJ1bmNoIG9mIHN0dWZmLCBjb3VudGluZyB0aGUgdGFibGUgaW4gYmV0d2VlbgorICAgKiB0byBiZSBzdXJlIGl0J3Mgbm90IGJyb2tlbiBhbmQgdGhhdCBpdGVyYXRpb24gd29ya3MKKyAgICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDMwMDApCisgICAgeworICAgICAgdm9pZCAqdmFsdWU7CisgICAgICBjaGFyICprZXk7CisKKyAgICAgIGtleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKHRhYmxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAodGFibGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMykgPT0gaSArIDEpOworCisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodmFsdWUsICJWYWx1ZSEiKSA9PSAwKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlMiwgaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZhbHVlLCBrZXlzW2ldKSA9PSAwKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyICh0YWJsZTMsIGkpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwga2V5c1tpXSkgPT0gMCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2ldKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50ICh0YWJsZTIsIGkpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyICh0YWJsZTMsIGkpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMykgPT0gaSk7CisKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVmICh0YWJsZTIpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlZiAodGFibGUzKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUzKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUzKTsKKyAgdGFibGUzID0gTlVMTDsKKworICAvKiBJbnNlcnQgYSBidW5jaCBvZiBzdHVmZiB0aGVuIGNoZWNrCisgICAqIHRoYXQgaXRlcmF0aW9uIHdvcmtzIGNvcnJlY3RseSAoZmluZHMgdGhlIHJpZ2h0CisgICAqIHZhbHVlcywgaXRlcl9zZXRfdmFsdWUgd29ya3MsIGV0Yy4pCisgICAqLworICB0YWJsZTEgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICAKKyAgdGFibGUyID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUyID09IE5VTEwpCisgICAgZ290byBvdXQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCA1MDAwKQorICAgIHsKKyAgICAgIGNoYXIgKmtleTsKKyAgICAgIHZvaWQgKnZhbHVlOyAgICAgIAorICAgICAgCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfaW50ICh0YWJsZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpICsgMSk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsKKworICAgICAga2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5KSA9PSB2YWx1ZSk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiRGlmZmVyZW50IHZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICgmaXRlciwgdmFsdWUpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAodGFibGUxLCBrZXkpID09IHZhbHVlKTsKKyAgICB9CisgIAorICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUxLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKCZpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpIC0gMSk7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTIsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgaW50IGtleTsKKyAgICAgIHZvaWQgKnZhbHVlOworCisgICAgICBrZXkgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgKCZpdGVyKTsKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAodGFibGUyLCBrZXkpID09IHZhbHVlKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJEaWZmZXJlbnQgdmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9zZXRfdmFsdWUgKCZpdGVyLCB2YWx1ZSk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50ICh0YWJsZTIsIGtleSkgPT0gdmFsdWUpOworICAgIH0KKworICBpID0gY291bnRfZW50cmllcyAodGFibGUyKTsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMiwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgKyAxID09IGkpOworICAgICAgLS1pOworICAgIH0KKworICAvKiBhZGQvcmVtb3ZlIGludGVybGVhdmVkLCB0byBjaGVjayB0aGF0IHdlIGdyb3cvc2hyaW5rIHRoZSB0YWJsZQorICAgKiBhcHByb3ByaWF0ZWx5CisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMDAwKQorICAgIHsKKyAgICAgIGNoYXIgKmtleTsKKyAgICAgIHZvaWQgKnZhbHVlOworICAgICAgICAgICAgCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmtleTsKKyAgICAgIHZvaWQgKnZhbHVlOyAgICAgIAorICAgICAgCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nICh0YWJsZTEsIGtleXNbaV0pKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nICh0YWJsZTEsIGtleXNbaV0pKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgLyogbnVrZSB0aGVzZSB0YWJsZXMgKi8KKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKworCisgIC8qIE5vdyBkbyBhIGJ1bmNoIG9mIHRoaW5ncyBhZ2FpbiB1c2luZyBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwKCkgdG8KKyAgICogYmUgc3VyZSB0aGF0IGludGVyZmFjZSB3b3Jrcy4KKyAgICovCisgIHRhYmxlMSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUxID09IE5VTEwpCisgICAgZ290byBvdXQ7CisgIAorICB0YWJsZTIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDMwMDApCisgICAgeworICAgICAgdm9pZCAqdmFsdWU7CisgICAgICBjaGFyICprZXk7CisKKyAgICAgIGtleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgVFJVRSwgJml0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpID09IE5VTEwpOworICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHZhbHVlKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCBUUlVFLCAmaXRlcikpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcikgPT0gTlVMTCk7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICgmaXRlciwgdmFsdWUpOyAKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpICsgMSk7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLCBrZXlzW2ldLCBGQUxTRSwgJml0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZhbHVlLCAiVmFsdWUhIikgPT0gMCk7CisKKyAgICAgIC8qIEl0ZXJhdGUganVzdCB0byBiZSBzdXJlIGl0IHdvcmtzLCB0aG91Z2gKKyAgICAgICAqIGl0J3MgYSBzdHVwaWQgdGhpbmcgdG8gZG8KKyAgICAgICAqLworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwga2V5c1tpXSkgPT0gMCk7CisKKyAgICAgIC8qIEl0ZXJhdGUganVzdCB0byBiZSBzdXJlIGl0IHdvcmtzLCB0aG91Z2gKKyAgICAgICAqIGl0J3MgYSBzdHVwaWQgdGhpbmcgdG8gZG8KKyAgICAgICAqLworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIDsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTEsIGtleXNbaV0sIEZBTFNFLCAmaXRlcikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhhc2ggZW50cnkgc2hvdWxkIGhhdmUgZXhpc3RlZCIpOworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCBGQUxTRSwgJml0ZXIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoYXNoIGVudHJ5IHNob3VsZCBoYXZlIGV4aXN0ZWQiKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpID09IGkpOworCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisKKyAgcmV0ID0gVFJVRTsKKworIG91dDoKKyAgZm9yIChpID0gMDsgaSA8IE5fSEFTSF9LRVlTOyBpKyspCisgICAgZGJ1c19mcmVlIChrZXlzW2ldKTsKKworICBkYnVzX2ZyZWUgKGtleXMpOworICAKKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtaGFzaC5oIGIvZGJ1cy9kYnVzLWhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk4ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWhhc2guaApAQCAtMCwwICsxLDIwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWhhc2guaCBHZW5lcmljIGhhc2ggdGFibGUgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSEFTSF9ICisjZGVmaW5lIERCVVNfSEFTSF9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0hhc2hUYWJsZQorICogQHsKKyAqLworCisvKiogSGFzaCBpdGVyYXRvciBvYmplY3QuIFRoZSBpdGVyYXRvciBpcyBvbiB0aGUgc3RhY2ssIGJ1dCBpdHMgcmVhbAorICogZmllbGRzIGFyZSBoaWRkZW4gcHJpdmF0ZWx5LgorICovCitzdHJ1Y3QgREJ1c0hhc2hJdGVyCit7CisgIHZvaWQgKmR1bW15MTsgLyoqPCBEbyBub3QgdXNlLiAqLworICB2b2lkICpkdW1teTI7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgdm9pZCAqZHVtbXkzOyAvKio8IERvIG5vdCB1c2UuICovCisgIHZvaWQgKmR1bW15NDsgLyoqPCBEbyBub3QgdXNlLiAqLworICBpbnQgICBkdW1teTU7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgaW50ICAgZHVtbXk2OyAvKio8IERvIG5vdCB1c2UuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaFRhYmxlIERCdXNIYXNoVGFibGU7Cit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaEl0ZXIgIERCdXNIYXNoSXRlcjsKKworLyogQWxsb3dpbmcgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIGFzIHdpdGggR0xpYgorICogd291bGQgYmUgbmljZXIgZm9yIGEgcHVibGljIEFQSSwgYnV0IGZvcgorICogYW4gaW50ZXJuYWwgQVBJIHRoaXMgc2F2ZXMgdHlwaW5nLCB3ZSBjYW4gYWRkCisgKiBtb3JlIHdoZW5ldmVyIHdlIGZlZWwgbGlrZSBpdC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFTSF9TVFJJTkcsICAgICAgICAvKio8IEhhc2gga2V5cyBhcmUgc3RyaW5ncy4gKi8KKyAgREJVU19IQVNIX0lOVCwgICAgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2Vycy4gKi8KKyAgREJVU19IQVNIX1VJTlRQVFIgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2VyIGNhcGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuICovCit9IERCdXNIYXNoVHlwZTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0hhc2hUYWJsZSogX2RidXNfaGFzaF90YWJsZV9uZXcgICAgICAgICAgICAgICAgKERCdXNIYXNoVHlwZSAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAga2V5X2ZyZWVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgdmFsdWVfZnJlZV9mdW5jdGlvbik7CitEQnVzSGFzaFRhYmxlKiBfZGJ1c19oYXNoX3RhYmxlX3JlZiAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAgICAgICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit1aW50cHRyX3QgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5ICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCogICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworCisvKiBQcmVhbGxvY2F0aW9uICovCisKKy8qKiBBIHByZWFsbG9jYXRlZCBoYXNoIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUHJlYWxsb2NhdGVkSGFzaCBEQnVzUHJlYWxsb2NhdGVkSGFzaDsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1ByZWFsbG9jYXRlZEhhc2ggKl9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnZhbHVlKTsKKworI2lmZGVmIERCVVNfV0lOCisjIGRlZmluZSBEQlVTX0hBU0hfUE9MTEFCTEUgREJVU19IQVNIX1VJTlRQVFIKKyNlbHNlCisjIGRlZmluZSBEQlVTX0hBU0hfUE9MTEFCTEUgREJVU19IQVNIX0lOVAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgREJ1c1BvbGxhYmxlCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3BvbGxhYmxlX2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworI2lmZGVmIERCVVNfV0lOCisgIERCdXNTb2NrZXQgczsKKworICBzLnNvY2sgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5IChpdGVyKTsKKyAgcmV0dXJuIHM7CisjZWxzZQorICByZXR1cm4gX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5IChpdGVyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGtleSkKK3sKKyNpZmRlZiBEQlVTX1dJTgorICByZXR1cm4gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAodGFibGUsIGtleS5zb2NrKTsKKyNlbHNlCisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlLCBrZXkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3BvbGxhYmxlIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBrZXkpCit7CisjaWZkZWYgREJVU19XSU4KKyAgcmV0dXJuIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKHRhYmxlLCBrZXkuc29jayk7CisjZWxzZQorICByZXR1cm4gX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50ICh0YWJsZSwga2V5KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9wb2xsYWJsZSAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworI2lmZGVmIERCVVNfV0lOCisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyICh0YWJsZSwga2V5LnNvY2ssIHZhbHVlKTsKKyNlbHNlCisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKHRhYmxlLCBrZXksIHZhbHVlKTsKKyNlbmRpZgorfQorCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfSEFTSF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtaW5pdC13aW4uY3BwIGIvZGJ1cy9kYnVzLWluaXQtd2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdmMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWluaXQtd2luLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogZGJ1cy1pbml0LXdpbi5jcHAgLSBvbmNlLXBlci1wcm9jZXNzIGluaXRpYWxpemF0aW9uCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworZXh0ZXJuICJDIgoreworI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKK30KKworY2xhc3MgREJ1c0ludGVybmFsSW5pdAorICB7CisgICAgcHVibGljOgorICAgICAgREJ1c0ludGVybmFsSW5pdCAoKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdGhyZWFkc193aW5kb3dzX2luaXRfZ2xvYmFsICgpOworICAgICAgICB9CisKKyAgICAgIHZvaWQgbXVzdF9ub3RfYmVfb21pdHRlZCAoKQorICAgICAgICB7CisgICAgICAgIH0KKyAgfTsKKworc3RhdGljIERCdXNJbnRlcm5hbEluaXQgaW5pdDsKKworZXh0ZXJuICJDIiB2b2lkCitfZGJ1c190aHJlYWRzX3dpbmRvd3NfZW5zdXJlX2N0b3JfbGlua2VkICgpCit7CisgIC8qIERvIG5vdGhpbmcgc2lnbmlmaWNhbnQsIGp1c3QgZW5zdXJlIHRoYXQgdGhlIGdsb2JhbCBpbml0aWFsaXplciBnZXRzCisgICAqIGxpbmtlZCBpbi4gKi8KKyAgaW5pdC5tdXN0X25vdF9iZV9vbWl0dGVkICgpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWludGVybmFscy5jIGIvZGJ1cy9kYnVzLWludGVybmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWYwODkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtaW50ZXJuYWxzLmMKQEAgLTAsMCArMSwxMDkxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtaW50ZXJuYWxzLmMgIHJhbmRvbSB1dGlsaXR5IHN0dWZmIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bWJzdHJpbmcuaD4KKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzSW50ZXJuYWxzIEQtQnVzIHNlY3JldCBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAYnJpZWYgRG9jdW1lbnRhdGlvbiB1c2VmdWwgd2hlbiBkZXZlbG9waW5nIG9yIGRlYnVnZ2luZyBELUJ1cyBpdHNlbGYuCisgKiAKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMgVXRpbGl0aWVzIGFuZCBwb3J0YWJpbGl0eQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIFV0aWxpdHkgZnVuY3Rpb25zIChfZGJ1c19hc3NlcnQoKSwgX2RidXNfd2FybigpLCBldGMuKQorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgX2RidXNfYXNzZXJ0CisgKgorICogQWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorICogCisgKiBAcGFyYW0gY29uZGl0aW9uIGNvbmRpdGlvbiB3aGljaCBtdXN0IGJlIHRydWUuCisgKi8KKworLyoqCisgKiBAZGVmIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZAorICoKKyAqIEFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgY2FsbGVkLgorICogVGhlIGdpdmVuIGV4cGxhbmF0aW9uIHdpbGwgYmUgcHJpbnRlZC4KKyAqIAorICogQHBhcmFtIGV4cGxhbmF0aW9uIGV4cGxhbmF0aW9uIG9mIHdoYXQgaGFwcGVuZWQgaWYgdGhlIGNvZGUgd2FzIHJlYWNoZWQuCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX05fRUxFTUVOVFMKKyAqCisgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZml4ZWQtc2l6ZSBhcnJheSB1c2luZworICogc2l6ZW9mKCkuCisgKgorICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0byBjb3VudCBlbGVtZW50cyBpbi4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfUE9JTlRFUl9UT19JTlQKKyAqCisgKiBTYWZlbHkgY2FzdHMgYSB2b2lkKiB0byBhbiBpbnRlZ2VyOyBzaG91bGQgb25seSBiZSB1c2VkIG9uIHZvaWQqCisgKiB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gaW50ZWdlcnMsIGZvciBleGFtcGxlIG9uZSBjcmVhdGVkIHdpdGgKKyAqIF9EQlVTX0lOVF9UT19QT0lOVEVSLiAgT25seSBndWFyYW50ZWVkIHRvIHByZXNlcnZlIDMyIGJpdHMuCisgKiAoaS5lLiBpdCdzIHVzZWQgdG8gc3RvcmUgMzItYml0IGludHMgaW4gcG9pbnRlcnMsIGJ1dAorICogY2FuJ3QgYmUgdXNlZCB0byBzdG9yZSA2NC1iaXQgcG9pbnRlcnMgaW4gaW50cy4pCisgKgorICogQHBhcmFtIHBvaW50ZXIgcG9pbnRlciB0byBleHRyYWN0IGFuIGludGVnZXIgZnJvbS4KKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX0lOVF9UT19QT0lOVEVSCisgKgorICogU2FmZWx5IHN0dWZmcyBhbiBpbnRlZ2VyIGludG8gYSBwb2ludGVyLCB0byBiZSBleHRyYWN0ZWQgbGF0ZXIgd2l0aAorICogX0RCVVNfUE9JTlRFUl9UT19JTlQuIE9ubHkgZ3VhcmFudGVlZCB0byBwcmVzZXJ2ZSAzMiBiaXRzLgorICoKKyAqIEBwYXJhbSBpbnRlZ2VyIHRoZSBpbnRlZ2VyIHRvIHN0dWZmIGludG8gYSBwb2ludGVyLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfWkVSTworICoKKyAqIFNldHMgYWxsIGJpdHMgaW4gYW4gb2JqZWN0IHRvIHplcm8uCisgKgorICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIHplcm9lZC4KKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDE2X01JTgorICoKKyAqIE1pbmltdW0gdmFsdWUgb2YgdHlwZSAiaW50MTYiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlQxNl9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgImludDE2IgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfVUlOVDE2X01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludDE2IgorICovCisKKy8qKgorICogQGRlZiBfREJVU19JTlQzMl9NSU4KKyAqCisgKiBNaW5pbXVtIHZhbHVlIG9mIHR5cGUgImludDMyIgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UMzJfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJpbnQzMiIKKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX1VJTlQzMl9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgInVpbnQzMiIKKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UX01JTgorICoKKyAqIE1pbmltdW0gdmFsdWUgb2YgdHlwZSAiaW50IgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAiaW50IgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfVUlOVF9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgInVpbnQiCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzRm9yZWFjaEZ1bmN0aW9uCisgKiAKKyAqIFVzZWQgdG8gaXRlcmF0ZSBvdmVyIGVhY2ggaXRlbSBpbiBhIGNvbGxlY3Rpb24sIHN1Y2ggYXMKKyAqIGEgREJ1c0xpc3QuCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0xPQ0tfTkFNRQorICoKKyAqIEV4cGFuZHMgdG8gbmFtZSBvZiBhIGdsb2JhbCBsb2NrIHZhcmlhYmxlLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19MT0NLCisgKgorICogTG9ja3MgYSBnbG9iYWwgbG9jaywgaW5pdGlhbGl6aW5nIGl0IGZpcnN0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfVU5MT0NLCisgKgorICogVW5sb2NrcyBhIGdsb2JhbCBsb2NrCisgKi8KKworLyoqCisgKiBGaXhlZCAib3V0IG9mIG1lbW9yeSIgZXJyb3IgbWVzc2FnZSwganVzdCB0byBhdm9pZAorICogbWFraW5nIHVwIGEgZGlmZmVyZW50IHN0cmluZyBldmVyeSB0aW1lIGFuZCB3YXN0aW5nCisgKiBzcGFjZS4KKyAqLworY29uc3QgY2hhciAqX2RidXNfbm9fbWVtb3J5X21lc3NhZ2UgPSAiTm90IGVub3VnaCBtZW1vcnkiOworCitzdGF0aWMgZGJ1c19ib29sX3Qgd2Fybl9pbml0dGVkID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgZmF0YWxfd2FybmluZ3MgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBmYXRhbF93YXJuaW5nc19vbl9jaGVja19mYWlsZWQgPSBUUlVFOworCitzdGF0aWMgdm9pZAoraW5pdF93YXJuaW5ncyh2b2lkKQoreworICBpZiAoIXdhcm5faW5pdHRlZCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfRkFUQUxfV0FSTklOR1MiKTsKKyAgICAgIGlmIChzICYmICpzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzID09ICcwJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmF0YWxfd2FybmluZ3MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKnMgPT0gJzEnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5ncyA9IFRSVUU7CisgICAgICAgICAgICAgIGZhdGFsX3dhcm5pbmdzX29uX2NoZWNrX2ZhaWxlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRCVVNfRkFUQUxfV0FSTklOR1Mgc2hvdWxkIGJlIHNldCB0byAwIG9yIDEgaWYgc2V0LCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgd2Fybl9pbml0dGVkID0gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIHRvIHN0ZGVyci4gQ2FuIG9wdGlvbmFsbHkgYmUgbWFkZSB0byBleGl0CisgKiBmYXRhbGx5IGJ5IHNldHRpbmcgREJVU19GQVRBTF9XQVJOSU5HUywgYnV0IHRoaXMgaXMgcmFyZWx5CisgKiB1c2VkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIHByZXR0eSBtdWNoIGVxdWl2YWxlbnQgdG8KKyAqIGZwcmludGYoc3RkZXJyKS4gX2RidXNfd2Fybl9jaGVja19mYWlsZWQoKSBvbiB0aGUgb3RoZXIgaGFuZCBpcworICogc3VpdGFibGUgZm9yIHVzZSB3aGVuIGEgcHJvZ3JhbW1pbmcgbWlzdGFrZSBoYXMgYmVlbiBtYWRlLgorICoKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQKK19kYnVzX3dhcm4gKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIGluaXRfd2FybmluZ3MgKCk7CisgIAorICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBpZiAoZmF0YWxfd2FybmluZ3MpCisgICAgeworICAgICAgZmZsdXNoIChzdGRlcnIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorfQorCisvKioKKyAqIFByaW50cyBhICJjcml0aWNhbCIgd2FybmluZyB0byBzdGRlcnIgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHM7CisgKiBkaWZmZXJzIGZyb20gX2RidXNfd2FybiBwcmltYXJpbHkgaW4gdGhhdCBpdCBwcmVmaXhlcyB0aGUgcGlkIGFuZAorICogZGVmYXVsdHMgdG8gZmF0YWwuIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIGEgcHJvZ3JhbW1pbmcKKyAqIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLiAoTk9UIGZvciB1bmF2b2lkYWJsZSBlcnJvcnMgdGhhdCBhbiBhcHAKKyAqIG1pZ2h0IGhhbmRsZSAtIHRob3NlIHNob3VsZCBiZSByZXR1cm5lZCBhcyBEQnVzRXJyb3IuKSBDYWxsaW5nIHRoaXMKKyAqIG1lYW5zICJ0aGVyZSBpcyBhIGJ1ZyIKKyAqLwordm9pZAorX2RidXNfd2Fybl9jaGVja19mYWlsZWQoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIAorICBpZiAoIXdhcm5faW5pdHRlZCkKKyAgICBpbml0X3dhcm5pbmdzICgpOworCisgIGZwcmludGYgKHN0ZGVyciwgInByb2Nlc3MgJWx1OiAiLCBfZGJ1c19waWRfZm9yX2xvZyAoKSk7CisgIAorICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBpZiAoZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkKQorICAgIHsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCitzdGF0aWMgZGJ1c19ib29sX3QgdmVyYm9zZV9pbml0dGVkID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgdmVyYm9zZSA9IFRSVUU7CisKKy8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGN1cnJlbnQgdGhyZWFkIGluIHZlcmJvc2UgbWVzc2FnZXMgKi8KKyNkZWZpbmUgUFRIUkVBRF9JTl9WRVJCT1NFIDAKKyNpZiBQVEhSRUFEX0lOX1ZFUkJPU0UKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKK3N0YXRpYyBjaGFyIG1vZHVsZV9uYW1lWzEwMjRdOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfdmVyYm9zZV9pbml0ICh2b2lkKQoreworICBpZiAoIXZlcmJvc2VfaW5pdHRlZCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwID0gX2RidXNfZ2V0ZW52ICgiREJVU19WRVJCT1NFIik7CisgICAgICB2ZXJib3NlID0gcCAhPSBOVUxMICYmICpwID09ICcxJzsKKyAgICAgIHZlcmJvc2VfaW5pdHRlZCA9IFRSVUU7CisjaWZkZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworICAgICAgeworICAgICAgICBjaGFyICpsYXN0X3BlcmlvZCwgKmxhc3Rfc2xhc2g7CisgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lKDAsbW9kdWxlX25hbWUsc2l6ZW9mKG1vZHVsZV9uYW1lKS0xKTsKKyAgICAgICAgbGFzdF9wZXJpb2QgPSBfbWJzcmNocihtb2R1bGVfbmFtZSwnLicpOworICAgICAgICBpZiAobGFzdF9wZXJpb2QpCisgICAgICAgICAgKmxhc3RfcGVyaW9kID0nXDAnOworICAgICAgICBsYXN0X3NsYXNoID0gX21ic3JjaHIobW9kdWxlX25hbWUsJ1xcJyk7CisgICAgICAgIGlmIChsYXN0X3NsYXNoKQorICAgICAgICAgIHN0cmNweShtb2R1bGVfbmFtZSxsYXN0X3NsYXNoKzEpOworICAgICAgICBzdHJjYXQobW9kdWxlX25hbWUsIjogIik7CisgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qKiBAZGVmIERCVVNfSVNfRElSX1NFUEFSQVRPUihjKQorICogbWFjcm8gZm9yIGNoZWNraW5nIGlmIGNoYXJhY3RlciBjIGlzIGEgcGF0Y2ggc2VwYXJhdG9yCisgKiAKKyAqIEB0b2RvIG1vdmUgdG8gYSBoZWFkZXIgZmlsZSBzbyB0aGF0IG90aGVycyBjYW4gdXNlIHRoaXMgdG9vCisgKi8KKyNpZmRlZiBEQlVTX1dJTiAKKyNkZWZpbmUgREJVU19JU19ESVJfU0VQQVJBVE9SKGMpIChjID09ICdcXCcgfHwgYyA9PSAnLycpCisjZWxzZQorI2RlZmluZSBEQlVTX0lTX0RJUl9TRVBBUkFUT1IoYykgKGMgPT0gJy8nKQorI2VuZGlmCisKKy8qKiAKKyByZW1vdmUgc291cmNlIHJvb3QgZnJvbSBmaWxlIHBhdGggCisgdGhlIHNvdXJjZSByb290IGlzIGRldGVybWluZWQgYnkgCisqLyAKK3N0YXRpYyBjaGFyICpfZGJ1c19maWxlX3BhdGhfZXh0cmFjdF9lbGVtZW50c19mcm9tX3RhaWwoY29uc3QgY2hhciAqZmlsZSxpbnQgbGV2ZWwpCit7CisgIGludCBwcmVmaXggPSAwOworICBjaGFyICpwID0gKGNoYXIgKilmaWxlICsgc3RybGVuKGZpbGUpOworICBpbnQgaSA9IDA7CisKKyAgZm9yICg7cCA+PSBmaWxlO3AtLSkKKyAgICB7CisgICAgICBpZiAoREJVU19JU19ESVJfU0VQQVJBVE9SKCpwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgrK2kgPj0gbGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByZWZpeCA9IHAtZmlsZSsxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgIHJldHVybiAoY2hhciAqKWZpbGUrcHJlZml4OworfQorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGRidXNfaXNfdmVyYm9zZSgpIG1hY3JvIGlmIGJ1aWx0IHdpdGggdmVyYm9zZSBsb2dnaW5nCisgKiBlbmFibGVkLgorICogQHJldHVybnMgd2hldGhlciB2ZXJib3NlIGxvZ2dpbmcgaXMgYWN0aXZlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaXNfdmVyYm9zZV9yZWFsICh2b2lkKQoreworICBfZGJ1c192ZXJib3NlX2luaXQgKCk7CisgIHJldHVybiB2ZXJib3NlOworfQorCit2b2lkIF9kYnVzX3NldF92ZXJib3NlIChkYnVzX2Jvb2xfdCBzdGF0ZSkKK3sKKyAgICB2ZXJib3NlID0gc3RhdGU7Cit9CisKK2RidXNfYm9vbF90IF9kYnVzX2dldF92ZXJib3NlICh2b2lkKQoreworICAgIHJldHVybiB2ZXJib3NlOworfQorCisvKioKKyAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSB0byBzdGRlcnIKKyAqIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIHZlcmJvc2UgbW9kZS4KKyAqIFRoaXMgaXMgdGhlIHJlYWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24sCisgKiB1c2UgX2RidXNfdmVyYm9zZSgpIG1hY3JvIGluIGNvZGUuCisgKgorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorX2RidXNfdmVyYm9zZV9yZWFsICgKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmUsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbiwgCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgc3RhdGljIGRidXNfYm9vbF90IG5lZWRfcGlkID0gVFJVRTsKKyAgaW50IGxlbjsKKyAgCisgIC8qIHRoaW5ncyBhcmUgd3JpdHRlbiBhIGJpdCBvZGRseSBoZXJlIHNvIHRoYXQKKyAgICogaW4gdGhlIG5vbi12ZXJib3NlIGNhc2Ugd2UganVzdCBoYXZlIHRoZSBvbmUKKyAgICogY29uZGl0aW9uYWwgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICovCisgIGlmICghX2RidXNfaXNfdmVyYm9zZV9yZWFsKCkpCisgICAgcmV0dXJuOworCisjaWZuZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyAgLyogUHJpbnQgb3V0IHBpZCBiZWZvcmUgdGhlIGxpbmUgKi8KKyAgaWYgKG5lZWRfcGlkKQorICAgIHsKKyNpZiBQVEhSRUFEX0lOX1ZFUkJPU0UKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVsdTogMHglbHg6ICIsIF9kYnVzX3BpZF9mb3JfbG9nICgpLCBwdGhyZWFkX3NlbGYgKCkpOworI2Vsc2UKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVsdTogIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCkpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisKKyAgLyogT25seSBwcmludCBwaWQgYWdhaW4gaWYgdGhlIG5leHQgbGluZSBpcyBhIG5ldyBsaW5lICovCisgIGxlbiA9IHN0cmxlbiAoZm9ybWF0KTsKKyAgaWYgKGZvcm1hdFtsZW4tMV0gPT0gJ1xuJykKKyAgICBuZWVkX3BpZCA9IFRSVUU7CisgIGVsc2UKKyAgICBuZWVkX3BpZCA9IEZBTFNFOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyAgeworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgc3RyY3B5KGJ1Zixtb2R1bGVfbmFtZSk7CisjaWZkZWYgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCisgIHNwcmludGYgKGJ1ZitzdHJsZW4oYnVmKSwgIlslcyglZCk6JXNdICIsX2RidXNfZmlsZV9wYXRoX2V4dHJhY3RfZWxlbWVudHNfZnJvbV90YWlsKGZpbGUsMiksbGluZSxmdW5jdGlvbik7CisjZW5kaWYKKyAgdnNwcmludGYgKGJ1ZitzdHJsZW4oYnVmKSxmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICBPdXRwdXREZWJ1Z1N0cmluZ0EoYnVmKTsKKyAgfQorI2Vsc2UKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKKyAgZnByaW50ZiAoc3RkZXJyLCAiWyVzKCVkKTolc10gIixfZGJ1c19maWxlX3BhdGhfZXh0cmFjdF9lbGVtZW50c19mcm9tX3RhaWwoZmlsZSwyKSxsaW5lLGZ1bmN0aW9uKTsKKyNlbmRpZgorCisgIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisKKyAgZmZsdXNoIChzdGRlcnIpOworI2VuZGlmCit9CisKKy8qKgorICogUmVpbml0aWFsaXplcyB0aGUgdmVyYm9zZSBsb2dnaW5nIGNvZGUsIHVzZWQKKyAqIGFzIGEgaGFjayBpbiBkYnVzLXNwYXduLmMgc28gdGhhdCBhIGNoaWxkCisgKiBwcm9jZXNzIHJlLXJlYWRzIGl0cyBwaWQKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3ZlcmJvc2VfcmVzZXRfcmVhbCAodm9pZCkKK3sKKyAgdmVyYm9zZV9pbml0dGVkID0gRkFMU0U7Cit9CisKK3ZvaWQKK19kYnVzX3RyYWNlX3JlZiAoY29uc3QgY2hhciAqb2JqX25hbWUsCisgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKm9iaiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgb2xkX3JlZmNvdW50LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuZXdfcmVmY291bnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndoeSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZW5hYmxlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChvYmpfbmFtZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChvYmogIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IC0xKTsKKyAgX2RidXNfYXNzZXJ0IChuZXdfcmVmY291bnQgPj0gLTEpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gLTEpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChuZXdfcmVmY291bnQgPT0gLTEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV3X3JlZmNvdW50ID49IDApOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPj0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDAgfHwgbmV3X3JlZmNvdW50ID4gMCk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAod2h5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVudl92YXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZW5hYmxlZCAhPSBOVUxMKTsKKworICBpZiAoKmVuYWJsZWQgPCAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBfZGJ1c19nZXRlbnYgKGVudl92YXIpOworCisgICAgICAqZW5hYmxlZCA9IEZBTFNFOworCisgICAgICBpZiAocyAmJiAqcykKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcyA9PSAnMCcpCisgICAgICAgICAgICAqZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgIGVsc2UgaWYgKCpzID09ICcxJykKKyAgICAgICAgICAgICplbmFibGVkID0gVFJVRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c193YXJuICgiJXMgc2hvdWxkIGJlIDAgb3IgMSBpZiBzZXQsIG5vdCAnJXMnIiwgZW52X3Zhciwgcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCplbmFibGVkKQorICAgIHsKKyAgICAgIGlmIChvbGRfcmVmY291bnQgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBWQUxHUklORF9QUklOVEZfQkFDS1RSQUNFICgiJXMgJXAgcmVmIHN0b2xlbiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfbmFtZSwgb2JqLCB3aHkpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlcyAlcCByZWYgc3RvbGVuICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX25hbWUsIG9iaiwgd2h5KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVkFMR1JJTkRfUFJJTlRGX0JBQ0tUUkFDRSAoIiVzICVwICVkIC0+ICVkIHJlZnMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX25hbWUsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5KTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXMgJXAgJWQgLT4gJWQgcmVmcyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9uYW1lLCBvYmosIG9sZF9yZWZjb3VudCwgbmV3X3JlZmNvdW50LCB3aHkpOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKy8qKgorICogRHVwbGljYXRlcyBhIHN0cmluZy4gUmVzdWx0IG11c3QgYmUgZnJlZWQgd2l0aAorICogZGJ1c19mcmVlKCkuIFJldHVybnMgI05VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgKiBJZiB0aGUgc3RyaW5nIHRvIGJlIGR1cGxpY2F0ZWQgaXMgI05VTEwsIHJldHVybnMgI05VTEwuCisgKiAKKyAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIGR1cGxpY2F0ZS4KKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCBjb3B5LgorICovCitjaGFyKgorX2RidXNfc3RyZHVwIChjb25zdCBjaGFyICpzdHIpCit7CisgIHNpemVfdCBsZW47CisgIGNoYXIgKmNvcHk7CisgIAorICBpZiAoc3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsZW4gPSBzdHJsZW4gKHN0cik7CisKKyAgY29weSA9IGRidXNfbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIHN0ciwgbGVuICsgMSk7CisgIAorICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBEdXBsaWNhdGVzIGEgYmxvY2sgb2YgbWVtb3J5LiBSZXR1cm5zCisgKiAjTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqIEBwYXJhbSBtZW0gbWVtb3J5IHRvIGNvcHkKKyAqIEBwYXJhbSBuX2J5dGVzIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAcmV0dXJucyB0aGUgY29weQorICovCit2b2lkKgorX2RidXNfbWVtZHVwIChjb25zdCB2b2lkICAqbWVtLAorICAgICAgICAgICAgICBzaXplX3QgICAgICAgbl9ieXRlcykKK3sKKyAgdm9pZCAqY29weTsKKworICBjb3B5ID0gZGJ1c19tYWxsb2MgKG5fYnl0ZXMpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAoY29weSwgbWVtLCBuX2J5dGVzKTsKKyAgCisgIHJldHVybiBjb3B5OworfQorCisvKioKKyAqIER1cGxpY2F0ZXMgYSBzdHJpbmcgYXJyYXkuIFJlc3VsdCBtYXkgYmUgZnJlZWQgd2l0aAorICogZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICogSWYgdGhlIGFycmF5IHRvIGJlIGR1cGxpY2F0ZWQgaXMgI05VTEwsIHJldHVybnMgI05VTEwuCisgKiAKKyAqIEBwYXJhbSBhcnJheSBhcnJheSB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgY29weS4KKyAqLworY2hhcioqCitfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChjb25zdCBjaGFyICoqYXJyYXkpCit7CisgIGludCBsZW47CisgIGludCBpOworICBjaGFyICoqY29weTsKKyAgCisgIGlmIChhcnJheSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAobGVuID0gMDsgYXJyYXlbbGVuXSAhPSBOVUxMOyArK2xlbikKKyAgICA7CisKKyAgY29weSA9IGRidXNfbmV3MCAoY2hhciosIGxlbiArIDEpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBjb3B5W2ldID0gX2RidXNfc3RyZHVwIChhcnJheVtpXSk7CisgICAgICBpZiAoY29weVtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY29weSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHN0cmluZyBhcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLgorICogCisgKiBAcGFyYW0gYXJyYXkgYXJyYXkgdG8gc2VhcmNoLgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbG9vayBmb3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFycmF5IGNvbnRhaW5zIHN0cmluZworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zIChjb25zdCBjaGFyICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzdHIpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoYXJyYXlbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcnJheVtpXSwgc3RyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG5ldyBVVUlELiBJZiB5b3UgY2hhbmdlIGhvdyB0aGlzIGlzIGRvbmUsCisgKiB0aGVyZSdzIHNvbWUgdGV4dCBhYm91dCBpdCBpbiB0aGUgc3BlYyB0aGF0IHNob3VsZCBhbHNvIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZCB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV91dWlkIChEQnVzR1VJRCAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzRXJyb3IgcmFuZF9lcnJvcjsKKyAgbG9uZyBub3c7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmcmFuZF9lcnJvcik7CisKKyAgLyogZG9uJ3QgdXNlIG1vbm90b25pYyB0aW1lIGJlY2F1c2UgdGhlIFVVSUQgbWF5IGJlIHNhdmVkIHRvIGRpc2ssIGUuZy4KKyAgICogaXQgbWF5IHBlcnNpc3QgYWNyb3NzIHJlYm9vdHMKKyAgICovCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZub3csIE5VTEwpOworCisgIHV1aWQtPmFzX3VpbnQzMnNbREJVU19VVUlEX0xFTkdUSF9XT1JEUyAtIDFdID0gREJVU19VSU5UMzJfVE9fQkUgKG5vdyk7CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlc19idWZmZXIgKHV1aWQtPmFzX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVVVJRF9MRU5HVEhfQllURVMgLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5kX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIHJhbmRfZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdlbmVyYXRlIFVVSUQ6ICVzIiwgcmFuZF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnJhbmRfZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBIZXgtZW5jb2RlIGEgVVVJRC4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZAorICogQHBhcmFtIGVuY29kZWQgc3RyaW5nIHRvIGFwcGVuZCBoZXggdXVpZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXVpZF9lbmNvZGUgKGNvbnN0IERCdXNHVUlEICp1dWlkLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICplbmNvZGVkKQoreworICBEQnVzU3RyaW5nIGJpbmFyeTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmYmluYXJ5LCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmJpbmFyeSwgMCwgZW5jb2RlZCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb250ZW50czsKKyAgREJ1c1N0cmluZyBkZWNvZGVkOworICBpbnQgZW5kOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRlbnRzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIGZpbGVuYW1lLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJmNvbnRlbnRzKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykgIT0gREJVU19VVUlEX0xFTkdUSF9IRVgpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBzaG91bGQgY29udGFpbiBhIGhleCBzdHJpbmcgb2YgbGVuZ3RoICVkLCBub3QgbGVuZ3RoICVkLCB3aXRoIG5vIG90aGVyIHRleHQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfVVVJRF9MRU5HVEhfSEVYLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZjb250ZW50cywgMCwgJmVuZCwgJmRlY29kZWQsIDApKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChlbmQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIlVVSUQgZmlsZSAnJXMnIGNvbnRhaW5zIGludmFsaWQgaGV4IGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlY29kZWQpICE9IERCVVNfVVVJRF9MRU5HVEhfQllURVMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBjb250YWlucyAlZCBieXRlcyBvZiBoZXgtZW5jb2RlZCBkYXRhIGluc3RlYWQgb2YgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCksCisgICAgICAgICAgICAgICAgICAgICAgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKCZkZWNvZGVkLCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50cyk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7CisgIAorIGVycm9yOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIGdpdmUgVVVJRCB0byBhIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIHRvIHdyaXRlCisgKiBAcGFyYW0gdXVpZCB0aGUgVVVJRCB0byBzYXZlCisgKiBAcGFyYW0gZXJyb3IgdXNlZCB0byByYWlzZSBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIG9uIGVycm9yCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193cml0ZV91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR1VJRCAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBlbmNvZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbmNvZGVkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c191dWlkX2VuY29kZSAodXVpZCwgJmVuY29kZWQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZlbmNvZGVkLCAnXG4nKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJmVuY29kZWQsIGZpbGVuYW1lLCBUUlVFLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKyAgcmV0dXJuIEZBTFNFOyAgICAgICAgCit9CisKKy8qKgorICogUmVhZHMgKGFuZCBvcHRpb25hbGx5IHdyaXRlcykgYSB1dWlkIHRvIGEgZmlsZS4gSW5pdGlhbGl6ZXMgdGhlIHV1aWQKKyAqIHVubGVzcyBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAqIEBwYXJhbSB1dWlkIHV1aWQgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbG9hZGVkIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kICNUUlVFIHRvIGNyZWF0ZSBhIG5ldyB1dWlkIGFuZCBzYXZlIGl0IGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIHJlYWRfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcgKGZpbGVuYW1lLCB1dWlkLCAmcmVhZF9lcnJvcikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnJlYWRfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBqdW5rLCB3ZSB3YW50IHRvIGtlZXAgdGhhdCBlcnJvcgorICAgKiBtZXNzYWdlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQgd2l0aCBhICJmaWxlIGV4aXN0cyIgZXJyb3IKKyAgICogbWVzc2FnZSB3aGVuIHdlIHRyeSB0byB3cml0ZQorICAgKi8KKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZyZWFkX2Vycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5UKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZyZWFkX2Vycm9yLCBlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmcmVhZF9lcnJvcik7CisKKyAgICAgIGlmICghX2RidXNfZ2VuZXJhdGVfdXVpZCAodXVpZCwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKGZpbGVuYW1lLCB1dWlkLCBlcnJvcik7CisgICAgfQorfQorCisvKiBQcm90ZWN0ZWQgYnkgX0RCVVNfTE9DSyAobWFjaGluZV91dWlkKSAqLworc3RhdGljIGludCBtYWNoaW5lX3V1aWRfaW5pdGlhbGl6ZWRfZ2VuZXJhdGlvbiA9IDA7CitzdGF0aWMgREJ1c0dVSUQgbWFjaGluZV91dWlkOworCisvKioKKyAqIEdldHMgdGhlIGhleC1lbmNvZGVkIFVVSUQgb2YgdGhlIG1hY2hpbmUgdGhpcyBmdW5jdGlvbiBpcworICogZXhlY3V0ZWQgb24uIFRoaXMgVVVJRCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGZvciBhIGdpdmVuCisgKiBtYWNoaW5lIGF0IGxlYXN0IHVudGlsIGl0IG5leHQgcmVib290cywgdGhvdWdoIGl0IGFsc28KKyAqIG1ha2VzIHNvbWUgZWZmb3J0IHRvIGJlIHRoZSBzYW1lIGZvcmV2ZXIsIGl0IG1heSBjaGFuZ2UgaWYgdGhlCisgKiBtYWNoaW5lIGlzIHJlY29uZmlndXJlZCBvciBpdHMgaGFyZHdhcmUgaXMgbW9kaWZpZWQuCisgKiAKKyAqIEBwYXJhbSB1dWlkX3N0ciBzdHJpbmcgdG8gYXBwZW5kIGhleC1lbmNvZGVkIG1hY2hpbmUgdXVpZCB0bworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgaWYgc3VjY2Vzc2Z1bAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkIChEQnVzU3RyaW5nICp1dWlkX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IG9rID0gVFJVRTsKKyAgCisgIGlmICghX0RCVVNfTE9DSyAobWFjaGluZV91dWlkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtYWNoaW5lX3V1aWRfaW5pdGlhbGl6ZWRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgREJ1c0Vycm9yIGxvY2FsX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBpZiAoIV9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICgmbWFjaGluZV91dWlkLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbF9lcnJvcikpCisgICAgICAgIHsgICAgICAgICAgCisjaWZuZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgLyogRm9yIHRoZSB0ZXN0IHN1aXRlLCB3ZSBtYXkgbm90IGJlIGluc3RhbGxlZCBzbyBqdXN0IGNvbnRpbnVlIHNpbGVudGx5CisgICAgICAgICAgICogaGVyZS4gQnV0IGluIGEgcHJvZHVjdGlvbiBidWlsZCwgd2Ugd2FudCB0byBiZSBuaWNlIGFuZCBsb3VkIGFib3V0CisgICAgICAgICAgICogdGhpcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkQtQnVzIGxpYnJhcnkgYXBwZWFycyB0byBiZSBpbmNvcnJlY3RseSBzZXQgdXA7IGZhaWxlZCB0byByZWFkIG1hY2hpbmUgdXVpZDogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlZSB0aGUgbWFudWFsIHBhZ2UgZm9yIGRidXMtdXVpZGdlbiB0byBjb3JyZWN0IHRoaXMgaXNzdWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9lcnJvci5tZXNzYWdlKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmxvY2FsX2Vycm9yKTsKKyAgICAgICAgICAKKyAgICAgICAgICBvayA9IF9kYnVzX2dlbmVyYXRlX3V1aWQgKCZtYWNoaW5lX3V1aWQsIGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAob2spCisgICAgeworICAgICAgaWYgKCFfZGJ1c191dWlkX2VuY29kZSAoJm1hY2hpbmVfdXVpZCwgdXVpZF9zdHIpKQorICAgICAgICB7CisgICAgICAgICAgb2sgPSBGQUxTRTsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChtYWNoaW5lX3V1aWQpOworCisgIHJldHVybiBvazsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisvKiogU3RyaW5nIHVzZWQgaW4gX2RidXNfcmV0dXJuX2lmX2ZhaWwgbWFjcm8gKi8KK2NvbnN0IGNoYXIgKl9kYnVzX3JldHVybl9pZl9mYWlsX3dhcm5pbmdfZm9ybWF0ID0KKyJhcmd1bWVudHMgdG8gJXMoKSB3ZXJlIGluY29ycmVjdCwgYXNzZXJ0aW9uIFwiJXNcIiBmYWlsZWQgaW4gZmlsZSAlcyBsaW5lICVkLlxuIgorIlRoaXMgaXMgbm9ybWFsbHkgYSBidWcgaW4gc29tZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgRC1CdXMgbGlicmFyeS5cbiI7CisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisvKioKKyAqIEludGVybmFscyBvZiBfZGJ1c19hc3NlcnQoKTsgaXQncyBhIGZ1bmN0aW9uCisgKiByYXRoZXIgdGhhbiBhIG1hY3JvIHdpdGggdGhlIGlubGluZSBjb2RlIHNvCisgKiB0aGF0IHRoZSBhc3NlcnRpb24gZmFpbHVyZSBibG9ja3MgZG9uJ3Qgc2hvdyB1cAorICogaW4gdGVzdCBzdWl0ZSBjb3ZlcmFnZSwgYW5kIHRvIHNocmluayBjb2RlIHNpemUuCisgKgorICogQHBhcmFtIGNvbmRpdGlvbiBUUlVFIGlmIGFzc2VydGlvbiBzdWNjZWVkZWQKKyAqIEBwYXJhbSBjb25kaXRpb25fdGV4dCBjb25kaXRpb24gYXMgYSBzdHJpbmcKKyAqIEBwYXJhbSBmaWxlIGZpbGUgdGhlIGFzc2VydGlvbiBpcyBpbgorICogQHBhcmFtIGxpbmUgbGluZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKiBAcGFyYW0gZnVuYyBmdW5jdGlvbiB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKi8KK3ZvaWQKK19kYnVzX3JlYWxfYXNzZXJ0IChkYnVzX2Jvb2xfdCAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpjb25kaXRpb25fdGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZnVuYykKK3sKKyAgaWYgKF9EQlVTX1VOTElLRUxZICghY29uZGl0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWx1OiBhc3NlcnRpb24gZmFpbGVkIFwiJXNcIiBmaWxlIFwiJXNcIiBsaW5lICVkIGZ1bmN0aW9uICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfcGlkX2Zvcl9sb2cgKCksIGNvbmRpdGlvbl90ZXh0LCBmaWxlLCBsaW5lLCBmdW5jKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KK30KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCk7IGl0J3MgYSBmdW5jdGlvbgorICogcmF0aGVyIHRoYW4gYSBtYWNybyB3aXRoIHRoZSBpbmxpbmUgY29kZSBzbworICogdGhhdCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgYmxvY2tzIGRvbid0IHNob3cgdXAKKyAqIGluIHRlc3Qgc3VpdGUgY292ZXJhZ2UsIGFuZCB0byBzaHJpbmsgY29kZSBzaXplLgorICoKKyAqIEBwYXJhbSBleHBsYW5hdGlvbiB3aGF0IHdhcyByZWFjaGVkIHRoYXQgc2hvdWxkbid0IGhhdmUgYmVlbgorICogQHBhcmFtIGZpbGUgZmlsZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKiBAcGFyYW0gbGluZSBsaW5lIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqLwordm9pZAorX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGNvbnN0IGNoYXIgKmV4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGluZSkKK3sKKyAgX2RidXNfd2FybiAoIkZpbGUgXCIlc1wiIGxpbmUgJWQgcHJvY2VzcyAlbHUgc2hvdWxkIG5vdCBoYXZlIGJlZW4gcmVhY2hlZDogJXNcbiIsCisgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIF9kYnVzX3BpZF9mb3JfbG9nICgpLCBleHBsYW5hdGlvbik7CisgIF9kYnVzX2Fib3J0ICgpOworfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9BU1NFUlQgKi8KKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX2ZhaWxpbmdfZWFjaF9tYWxsb2MgKGludCAgICAgICAgICAgICAgICAgICAgbl9tYWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgbl9tYWxsb2NzICs9IDEwOyAvKiBmdWRnZSBmYWN0b3IgdG8gZW5zdXJlIHJlYWxsb2NzIGV0Yy4gYXJlIGNvdmVyZWQgKi8KKyAgCisgIHdoaWxlIChuX21hbGxvY3MgPj0gMCkKKyAgICB7ICAgICAgCisgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChuX21hbGxvY3MpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiXG49PT1cbiVzOiAod2lsbCBmYWlsIG1hbGxvYyAlZCB3aXRoICVkIGZhaWx1cmVzKVxuPT09XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG5fbWFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICgpKTsKKworICAgICAgaWYgKCEoKiBmdW5jKSAoZGF0YSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbl9tYWxsb2NzIC09IDE7CisgICAgfQorCisgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKF9EQlVTX0lOVF9NQVgpOworCisgIHJldHVybiBUUlVFOworfSAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioKKyAqIFRlc3RzIGhvdyB3ZWxsIHRoZSBnaXZlbiBmdW5jdGlvbiByZXNwb25kcyB0byBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBDYWxscyB0aGUgZnVuY3Rpb24gcmVwZWF0ZWRseSwgZmFpbGluZyBhIGRpZmZlcmVudAorICogY2FsbCB0byBtYWxsb2MoKSBlYWNoIHRpbWUuIElmIHRoZSBmdW5jdGlvbiBldmVyIHJldHVybnMgI0ZBTFNFLAorICogdGhlIHRlc3QgZmFpbHMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICNUUlVFIHdoZW5ldmVyIHNvbWV0aGluZworICogdmFsaWQgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGVycm9yLCBvciBzdWNjZWVkaW5nKSBvY2N1cnMsIGFuZCAjRkFMU0UKKyAqIGlmIGl0IGdldHMgY29uZnVzZWQgaW4gc29tZSB3YXkuCisgKgorICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IHVzZWQgaW4gdmVyYm9zZSBvdXRwdXQKKyAqIEBwYXJhbSBmdW5jIGZ1bmN0aW9uIHRvIGNhbGwKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMgRkFMU0UKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChjb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIGludCBhcHByb3hfbWFsbG9jczsKKyAgY29uc3QgY2hhciAqc2V0dGluZzsKKyAgaW50IG1heF9mYWlsdXJlc190b190cnk7CisgIGludCBpOworCisgIC8qIFJ1biBvbmNlIHRvIHNlZSBhYm91dCBob3cgbWFueSBtYWxsb2NzIGFyZSBpbnZvbHZlZCAqLworICAKKyAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoX0RCVVNfSU5UX01BWCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgb25jZSB0byBjb3VudCBtYWxsb2NzXG4iKTsKKyAgCisgIGlmICghKCogZnVuYykgKGRhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwcHJveF9tYWxsb2NzID0gX0RCVVNfSU5UX01BWCAtIF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuPT09PT09PT09PT09PT09PT1cbiVzOiBhYm91dCAlZCBtYWxsb2NzIHRvdGFsXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGFwcHJveF9tYWxsb2NzKTsKKworICBzZXR0aW5nID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX01BTExPQ19GQUlMVVJFUyIpOworICBpZiAoc2V0dGluZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgbG9uZyB2OworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNldHRpbmcpOworICAgICAgdiA9IDQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZzdHIsIDAsICZ2LCBOVUxMKSkKKyAgICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IHBhcnNlICclcycgYXMgaW50ZWdlclxuIiwgc2V0dGluZyk7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gdjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gNDsKKyAgICB9CisKKyAgaWYgKG1heF9mYWlsdXJlc190b190cnkgPCAxKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJub3QgdGVzdGluZyBPT00gaGFuZGxpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGkgPSBzZXR0aW5nID8gbWF4X2ZhaWx1cmVzX3RvX3RyeSAtIDEgOiAxOworICB3aGlsZSAoaSA8IG1heF9mYWlsdXJlc190b190cnkpCisgICAgeworICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKGkpOworICAgICAgaWYgKCFydW5fZmFpbGluZ19lYWNoX21hbGxvYyAoYXBwcm94X21hbGxvY3MsIGRlc2NyaXB0aW9uLCBmdW5jLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJcbj09PT09PT09PT09PT09PT09XG4lczogYWxsIGl0ZXJhdGlvbnMgcGFzc2VkXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWludGVybmFscy5oIGIvZGJ1cy9kYnVzLWludGVybmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmVmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtaW50ZXJuYWxzLmgKQEAgLTAsMCArMSw0MjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1pbnRlcm5hbHMuaCAgcmFuZG9tIHV0aWxpdHkgc3R1ZmYgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmZGVmIERCVVNfSU5TSURFX0RCVVNfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBkYnVzLWludGVybmFscy5oIGluIHRoZSBwdWJsaWMgaGVhZGVyIGRidXMuaCIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfSU5URVJOQUxTX0gKKyNkZWZpbmUgREJVU19JTlRFUk5BTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c193YXJuICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKKworCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyNkZWZpbmUgX0RCVVNfRlVOQ1RJT05fTkFNRSBfX2Z1bmNfXworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgX0RCVVNfRlVOQ1RJT05fTkFNRSBfX0ZVTkNUSU9OX18KKyNlbHNlCisjZGVmaW5lIF9EQlVTX0ZVTkNUSU9OX05BTUUgInVua25vd24gZnVuY3Rpb24iCisjZW5kaWYKKworLyoKKyAqIChjb2RlIGZyb20gR0xpYikKKyAqIAorICogVGhlIF9EQlVTX0xJS0VMWSBhbmQgX0RCVVNfVU5MSUtFTFkgbWFjcm9zIGxldCB0aGUgcHJvZ3JhbW1lciBnaXZlIGhpbnRzIHRvIAorICogdGhlIGNvbXBpbGVyIGFib3V0IHRoZSBleHBlY3RlZCByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbi4gU29tZSBjb21waWxlcnMKKyAqIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9ucy4KKyAqCisgKiBUaGUgX0RCVVNfQk9PTEVBTl9FWFBSIG1hY3JvIGlzIGludGVuZGVkIHRvIHRyaWdnZXIgYSBnY2Mgd2FybmluZyB3aGVuCisgKiBwdXR0aW5nIGFzc2lnbm1lbnRzIGluIHRoZSBtYWNybyBhcmcKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDIpICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQorI2RlZmluZSBfREJVU19CT09MRUFOX0VYUFIoZXhwcikgICAgICAgICAgICAgICAgXAorIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgaW50IF9kYnVzX2Jvb2xlYW5fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgaWYgKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYm9vbGVhbl92YXJfID0gMTsgICAgICAgICAgICAgICAgICAgXAorICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYm9vbGVhbl92YXJfID0gMDsgICAgICAgICAgICAgICAgICAgXAorICAgX2RidXNfYm9vbGVhbl92YXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgX0RCVVNfTElLRUxZKGV4cHIpIChfX2J1aWx0aW5fZXhwZWN0IChfREJVU19CT09MRUFOX0VYUFIoZXhwciksIDEpKQorI2RlZmluZSBfREJVU19VTkxJS0VMWShleHByKSAoX19idWlsdGluX2V4cGVjdCAoX0RCVVNfQk9PTEVBTl9FWFBSKGV4cHIpLCAwKSkKKyNlbHNlCisjZGVmaW5lIF9EQlVTX0xJS0VMWShleHByKSAoZXhwcikKKyNkZWZpbmUgX0RCVVNfVU5MSUtFTFkoZXhwcikgKGV4cHIpCisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCisvKgorIGF0IGxlYXN0IGdudSBjYyBhbmQgbXN2YyBjb21waWxlciBhcmUga25vd24gdG8gCisgaGF2ZSBzdXBwb3J0IGZvciB2YXJpYWJsZSBtYWNybyBhcmd1bWVudCBsaXN0cworIGFkZCBvdGhlciBjb21waWxlcnMgaXMgcmVxdWlyZWQKKyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgCisjZGVmaW5lIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworI2VuZGlmCisKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfdmVyYm9zZV9yZWFsICAgICAgIChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICg0LCA1KTsKKyMgIGRlZmluZSBfZGJ1c192ZXJib3NlKGZtdCwuLi4pIF9kYnVzX3ZlcmJvc2VfcmVhbCggX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLGZtdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c192ZXJib3NlX3JlYWwgICAgICAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKKyMgIGRlZmluZSBfZGJ1c192ZXJib3NlIF9kYnVzX3ZlcmJvc2VfcmVhbAorI2VuZGlmCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3ZlcmJvc2VfcmVzZXRfcmVhbCAodm9pZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19pc192ZXJib3NlX3JlYWwgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZ2V0X3ZlcmJvc2UgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19zZXRfdmVyYm9zZSAoZGJ1c19ib29sX3Qgc3RhdGUpOworCisjICBkZWZpbmUgX2RidXNfdmVyYm9zZV9yZXNldCBfZGJ1c192ZXJib3NlX3Jlc2V0X3JlYWwKKyMgIGRlZmluZSBfZGJ1c19pc192ZXJib3NlIF9kYnVzX2lzX3ZlcmJvc2VfcmVhbAorI2Vsc2UKKyMgIGlmZGVmIEhBVkVfSVNPX1ZBUkFSR1MKKyMgICAgZGVmaW5lIF9kYnVzX3ZlcmJvc2UoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjICBlbGlmIGRlZmluZWQgKEhBVkVfR05VQ19WQVJBUkdTKQorIyAgICBkZWZpbmUgX2RidXNfdmVyYm9zZShmb3JtYXQuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyMgIGVsc2UKK3N0YXRpYyB2b2lkIF9kYnVzX3ZlcmJvc2UoY29uc3QgY2hhciAqIHgsLi4uKSB7O30KKyMgIGVuZGlmCisjICBkZWZpbmUgX2RidXNfdmVyYm9zZV9yZXNldCgpIGRvIHsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBfZGJ1c19pc192ZXJib3NlKCkgRkFMU0UgCisjZW5kaWYgLyogIURCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3RyYWNlX3JlZiAoY29uc3QgY2hhciAqb2JqX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG9sZF9yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuZXdfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2h5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZW5hYmxlZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKTsKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNkZWZpbmUgX2RidXNfYXNzZXJ0KGNvbmRpdGlvbikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfcmVhbF9hc3NlcnQgKGRidXNfYm9vbF90ICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqY29uZGl0aW9uX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZ1bmMpOworI2RlZmluZSBfZGJ1c19hc3NlcnQoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19yZWFsX2Fzc2VydCAoKGNvbmRpdGlvbikgIT0gMCwgI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fLCBfREJVU19GVU5DVElPTl9OQU1FKQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjZGVmaW5lIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZChleHBsYW5hdGlvbikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGNvbnN0IGNoYXIgKmV4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxpbmUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisjZGVmaW5lIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZChleHBsYW5hdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGV4cGxhbmF0aW9uLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworI2lmZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyNkZWZpbmUgX2RidXNfcmV0dXJuX2lmX2ZhaWwoY29uZGl0aW9uKQorI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwoY29uZGl0aW9uLCB2YWwpCisjZWxzZQorCitEQlVTX1BSSVZBVEVfRVhQT1JUCitleHRlcm4gY29uc3QgY2hhciAqX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQ7CisKKyNkZWZpbmUgX2RidXNfcmV0dXJuX2lmX2ZhaWwoY29uZGl0aW9uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgX2RidXNfYXNzZXJ0ICgoKihjb25zdCBjaGFyKilfREJVU19GVU5DVElPTl9OQU1FKSAhPSAnXycpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCAjY29uZGl0aW9uLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbChjb25kaXRpb24sIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgX2RidXNfYXNzZXJ0ICgoKihjb25zdCBjaGFyKilfREJVU19GVU5DVElPTl9OQU1FKSAhPSAnXycpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoY29uZGl0aW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKF9kYnVzX3JldHVybl9pZl9mYWlsX3dhcm5pbmdfZm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCAjY29uZGl0aW9uLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgIFwKKyAgICByZXR1cm4gKHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyNkZWZpbmUgX0RCVVNfTl9FTEVNRU5UUyhhcnJheSkgKChpbnQpIChzaXplb2YgKChhcnJheSkpIC8gc2l6ZW9mICgoYXJyYXkpWzBdKSkpCisKKyNkZWZpbmUgX0RCVVNfUE9JTlRFUl9UT19JTlQocG9pbnRlcikgKChpbnRwdHJfdCkocG9pbnRlcikpCisjZGVmaW5lIF9EQlVTX0lOVF9UT19QT0lOVEVSKGludGVnZXIpICgodm9pZCopKChpbnRwdHJfdCkoaW50ZWdlcikpKQorCisjZGVmaW5lIF9EQlVTX1pFUk8ob2JqZWN0KSAobWVtc2V0ICgmKG9iamVjdCksICdcMCcsIHNpemVvZiAoKG9iamVjdCkpKSkKKworI2RlZmluZSBfREJVU19TVFJVQ1RfT0ZGU0VUKHN0cnVjdF90eXBlLCBtZW1iZXIpCVwKKyAgICAoKGludHB0cl90KSAoKHVuc2lnbmVkIGNoYXIqKSAmKChzdHJ1Y3RfdHlwZSopIDApLT5tZW1iZXIpKQorCisjZGVmaW5lIF9EQlVTX0FMSUdOT0YodHlwZSkgXAorICAgIChfREJVU19TVFJVQ1RfT0ZGU0VUIChzdHJ1Y3QgeyBjaGFyIF8xOyB0eXBlIF8yOyB9LCBfMikpCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisvKiB0aGlzIGlzIGFuIGFzc2VydCBhbmQgbm90IGFuIGVycm9yLCBidXQgaW4gdGhlIHR5cGljYWwgLS1kaXNhYmxlLWNoZWNrcyBjYXNlICh5b3UncmUgdHJ5aW5nCisgKiB0byByZWFsbHkgbWluaW1pemUgY29kZSBzaXplKSwgZGlzYWJsaW5nIHRoZXNlIGFzc2VydGlvbnMgbWFrZXMgc2Vuc2UuCisgKi8KKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX2Fzc2VydF9lcnJvcl9pc19zZXQgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX2Fzc2VydF9lcnJvcl9pc19jbGVhciAoY29uc3QgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworfQorCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpIF9kYnVzX2Fzc2VydF9lcnJvcl9pc19zZXQoZXJyb3IpCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcikgX2RidXNfYXNzZXJ0X2Vycm9yX2lzX2NsZWFyKGVycm9yKQorI2VuZGlmCisKKyNkZWZpbmUgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldChlcnJvcikgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKChlcnJvcikgPT0gTlVMTCB8fCAhZGJ1c19lcnJvcl9pc19zZXQgKChlcnJvcikpKQorI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldChlcnJvciwgdmFsKSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKChlcnJvcikgPT0gTlVMTCB8fCAhZGJ1c19lcnJvcl9pc19zZXQgKChlcnJvcikpLCAodmFsKSkKKworLyogVGhpcyBhbGlnbm1lbnQgdGhpbmcgaXMgZnJvbSBPUkJpdDIgKi8KKy8qIEFsaWduIGEgdmFsdWUgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KKyAqIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4KKyAqLworCisvKgorICogICAodGhpcyArIGJvdW5kYXJ5IC0gMSkKKyAqICAgICAgICAgICYKKyAqICAgIH4oYm91bmRhcnkgLSAxKQorICovCisKKyNkZWZpbmUgX0RCVVNfQUxJR05fVkFMVUUodGhpcywgYm91bmRhcnkpIFwKKyAgKCggKCh1aW50cHRyX3QpKHRoaXMpKSArICgoKHVpbnRwdHJfdCkoYm91bmRhcnkpKSAtMSkpICYgKH4oKCh1aW50cHRyX3QpKGJvdW5kYXJ5KSktMSkpKQorCisjZGVmaW5lIF9EQlVTX0FMSUdOX0FERFJFU1ModGhpcywgYm91bmRhcnkpIFwKKyAgKCh2b2lkKilfREJVU19BTElHTl9WQUxVRSh0aGlzLCBib3VuZGFyeSkpCisKKworREJVU19QUklWQVRFX0VYUE9SVAorY2hhciogICAgICAgX2RidXNfc3RyZHVwICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAqc3RyKTsKK3ZvaWQqICAgICAgIF9kYnVzX21lbWR1cCAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIG5fYnl0ZXMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zIChjb25zdCBjaGFyICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzdHIpOworY2hhcioqICAgICAgX2RidXNfZHVwX3N0cmluZ19hcnJheSAgICAgIChjb25zdCBjaGFyICoqYXJyYXkpOworCisjZGVmaW5lIF9EQlVTX0lOVDE2X01JTgkgKChkYnVzX2ludDE2X3QpIDB4ODAwMCkKKyNkZWZpbmUgX0RCVVNfSU5UMTZfTUFYCSAoKGRidXNfaW50MTZfdCkgMHg3ZmZmKQorI2RlZmluZSBfREJVU19VSU5UMTZfTUFYICgoZGJ1c191aW50MTZfdCkweGZmZmYpCisjZGVmaW5lIF9EQlVTX0lOVDMyX01JTgkgKChkYnVzX2ludDMyX3QpIDB4ODAwMDAwMDApCisjZGVmaW5lIF9EQlVTX0lOVDMyX01BWAkgKChkYnVzX2ludDMyX3QpIDB4N2ZmZmZmZmYpCisjZGVmaW5lIF9EQlVTX1VJTlQzMl9NQVggKChkYnVzX3VpbnQzMl90KTB4ZmZmZmZmZmYpCisvKiB1c2luZyAzMi1iaXQgaGVyZSBpcyBzb3J0IG9mIGJvZ3VzICovCisjZGVmaW5lIF9EQlVTX0lOVF9NSU4JIF9EQlVTX0lOVDMyX01JTgorI2RlZmluZSBfREJVU19JTlRfTUFYCSBfREJVU19JTlQzMl9NQVgKKyNkZWZpbmUgX0RCVVNfVUlOVF9NQVgJIF9EQlVTX1VJTlQzMl9NQVgKKyNkZWZpbmUgX0RCVVNfSU5UNjRfTUFYCSBEQlVTX0lOVDY0X0NPTlNUQU5UICAoMHg3ZmZmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBfREJVU19VSU5UNjRfTUFYIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweGZmZmZmZmZmZmZmZmZmZmYpCisjZGVmaW5lIF9EQlVTX09ORV9LSUxPQllURSAxMDI0CisjZGVmaW5lIF9EQlVTX09ORV9NRUdBQllURSAxMDI0ICogX0RCVVNfT05FX0tJTE9CWVRFCisjZGVmaW5lIF9EQlVTX09ORV9IT1VSX0lOX01JTExJU0VDT05EUyAoMTAwMCAqIDYwICogNjApCisjZGVmaW5lIF9EQlVTX1VTRUNfUEVSX1NFQ09ORCAgICAgICAgICAoMTAwMDAwMCkKKworI3VuZGVmCU1BWAorI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCU1JTgorI2RlZmluZSBNSU4oYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCUFCUworI2RlZmluZSBBQlMoYSkJICAgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKyNkZWZpbmUgX0RCVVNfSVNBU0NJSShjKSAoKGMpICE9ICdcMCcgJiYgKCgoYykgJiB+MHg3ZikgPT0gMCkpCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzRm9yZWFjaEZ1bmN0aW9uKSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK3ZvaWQgX2RidXNfdmVyYm9zZV9ieXRlcyAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4pOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitleHRlcm4gY29uc3QgY2hhciAqX2RidXNfbm9fbWVtb3J5X21lc3NhZ2U7CisjZGVmaW5lIF9EQlVTX1NFVF9PT00oZXJyb3IpIGRidXNfc2V0X2Vycm9yX2NvbnN0ICgoZXJyb3IpLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgX2RidXNfbm9fbWVtb3J5X21lc3NhZ2UpCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3NldF9lcnJvcl92YWxpc3QgKERCdXNFcnJvciAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgIGFyZ3MpIF9EQlVTX0dOVUNfUFJJTlRGICgzLCAwKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKiBNZW1vcnkgZGVidWdnaW5nICovCit2b2lkICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyICAgICAgICAoaW50ICB1bnRpbF9uZXh0X2ZhaWwpOworaW50ICAgICAgICAgX2RidXNfZ2V0X2ZhaWxfYWxsb2NfY291bnRlciAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgICAgICAgKGludCAgZmFpbHVyZXNfcGVyX2ZhaWx1cmUpOworaW50ICAgICAgICAgX2RidXNfZ2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMgICAgICAgICAgICAgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKHZvaWQpOworCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNUZXN0TWVtb3J5RnVuY3Rpb24pICAodm9pZCAqZGF0YSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoY29uc3QgY2hhciAgICAgICAgICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICpkYXRhKTsKKyNlbHNlCisjZGVmaW5lIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIobikKKyNkZWZpbmUgX2RidXNfZ2V0X2ZhaWxfYWxsb2NfY291bnRlciBfREJVU19JTlRfTUFYCisKKy8qIFRoZXNlIGFyZSBjb25zdGFudCBleHByZXNzaW9ucyBzbyB0aGF0IGJsb2NrcworICogdGhleSBwcm90ZWN0IHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheQorICovCisjZGVmaW5lIF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIoKSAoRkFMU0UpCisjZGVmaW5lIF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzKCkgICAgICAgICAgICAoRkFMU0UpCisjZGVmaW5lIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICAoMCkKKyNlbmRpZiAvKiAhREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwordHlwZWRlZiB2b2lkICgqIERCdXNTaHV0ZG93bkZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jICAgICAgICAgIChEQnVzU2h1dGRvd25GdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jX3VubG9ja2VkIChEQnVzU2h1dGRvd25GdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YSk7CisKK2V4dGVybiBpbnQgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworCisvKiBUaGUgd2VpcmQgY2FzZSBjb252ZW50aW9uIGlzIHRvIGF2b2lkIGhhdmluZyB0byBjaGFuZ2UgYWxsIHRoZSBjYWxsZXJzLAorICogd2hpY2ggd291bGQgYmUgcXVpdGUgYSBtZWdhLXBhdGNoLiAqLwordHlwZWRlZiBlbnVtCit7CisgIC8qIGluZGV4IDAtNCAqLworICBfREJVU19MT0NLX2xpc3QsCisgIF9EQlVTX0xPQ0tfY29ubmVjdGlvbl9zbG90cywKKyAgX0RCVVNfTE9DS19wZW5kaW5nX2NhbGxfc2xvdHMsCisgIF9EQlVTX0xPQ0tfc2VydmVyX3Nsb3RzLAorICBfREJVU19MT0NLX21lc3NhZ2Vfc2xvdHMsCisgIC8qIGluZGV4IDUtOSAqLworICBfREJVU19MT0NLX2J1cywKKyAgX0RCVVNfTE9DS19idXNfZGF0YXMsCisgIF9EQlVTX0xPQ0tfc2h1dGRvd25fZnVuY3MsCisgIF9EQlVTX0xPQ0tfc3lzdGVtX3VzZXJzLAorICBfREJVU19MT0NLX21lc3NhZ2VfY2FjaGUsCisgIC8qIGluZGV4IDEwLTEyICovCisgIF9EQlVTX0xPQ0tfc2hhcmVkX2Nvbm5lY3Rpb25zLAorICBfREJVU19MT0NLX21hY2hpbmVfdXVpZCwKKyAgX0RCVVNfTE9DS19zeXNkZXBzLAorCisgIF9EQlVTX05fR0xPQkFMX0xPQ0tTCit9IERCdXNHbG9iYWxMb2NrOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb2NrICAgKERCdXNHbG9iYWxMb2NrIGxvY2spIF9EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUOwordm9pZCAgICAgICAgX2RidXNfdW5sb2NrIChEQnVzR2xvYmFsTG9jayBsb2NrKTsKKworI2RlZmluZSBfREJVU19MT0NLX05BTUUobmFtZSkgICAgICAgICAgIF9EQlVTX0xPQ0tfIyNuYW1lCisjZGVmaW5lIF9EQlVTX0xPQ0sobmFtZSkgICAgICAgICAgICAgICAgX2RidXNfbG9jayAgIChfREJVU19MT0NLXyMjbmFtZSkKKyNkZWZpbmUgX0RCVVNfVU5MT0NLKG5hbWUpICAgICAgICAgICAgICBfZGJ1c191bmxvY2sgKF9EQlVTX0xPQ0tfIyNuYW1lKQorCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKHZvaWQpOworCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKERCdXNTdHJpbmcgICAgICAgKmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVuZXNjYXBlZCk7CisKK3ZvaWQgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzICAgICAgICAoREJ1c0Vycm9yICAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqYWRkcmVzc19wcm9ibGVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fb3RoZXIpOworCisjZGVmaW5lIERCVVNfVVVJRF9MRU5HVEhfQllURVMgMTYKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9XT1JEUyAoREJVU19VVUlEX0xFTkdUSF9CWVRFUyAvIDQpCisjZGVmaW5lIERCVVNfVVVJRF9MRU5HVEhfSEVYICAgKERCVVNfVVVJRF9MRU5HVEhfQllURVMgKiAyKQorCisvKioKKyAqIEEgZ2xvYmFsbHkgdW5pcXVlIElEIDsgd2UgaGF2ZSBvbmUgZm9yIGVhY2ggREJ1c1NlcnZlciwgYW5kIGFsc28gb25lIGZvciBlYWNoCisgKiBtYWNoaW5lIHdpdGggbGliZGJ1cyBpbnN0YWxsZWQgb24gaXQuCisgKi8KK3VuaW9uIERCdXNHVUlECit7CisgIGRidXNfdWludDMyX3QgYXNfdWludDMyc1tEQlVTX1VVSURfTEVOR1RIX1dPUkRTXTsgICAgIC8qKjwgZ3VpZCBhcyBmb3VyIHVpbnQzMiB2YWx1ZXMgKi8KKyAgY2hhciBhc19ieXRlc1tEQlVTX1VVSURfTEVOR1RIX0JZVEVTXTsgICAgICAgICAgICAgICAgLyoqPCBndWlkIGFzIDE2IHNpbmdsZS1ieXRlIHZhbHVlcyAqLworfTsKKworREJVU19QUklWQVRFX0VYUE9SVCBfREJVU19HTlVDX1dBUk5fVU5VU0VEX1JFU1VMVAorZGJ1c19ib29sX3QgX2RidXNfZ2VuZXJhdGVfdXVpZCAgKERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdXVpZF9lbmNvZGUgICAgKGNvbnN0IERCdXNHVUlEICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX3V1aWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0dVSUQgICAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfd3JpdGVfdXVpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0dVSUQgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKERCdXNTdHJpbmcgKnV1aWRfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKKyNkZWZpbmUgX0RCVVNfUEFTVEUyKGEsIGIpIGEgIyMgYgorI2RlZmluZSBfREJVU19QQVNURShhLCBiKSBfREJVU19QQVNURTIgKGEsIGIpCisjZGVmaW5lIF9EQlVTX1NUQVRJQ19BU1NFUlQoZXhwcikgXAorICB0eXBlZGVmIHN0cnVjdCB7IGNoYXIgX2Fzc2VydGlvblsoZXhwcikgPyAxIDogLTFdOyB9IFwKKyAgX0RCVVNfUEFTVEUgKF9EQlVTX1NUQVRJQ19BU1NFUlRfLCBfX0xJTkVfXykgX0RCVVNfR05VQ19VTlVTRUQKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfSU5URVJOQUxTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1rZXlyaW5nLmMgYi9kYnVzL2RidXMta2V5cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2U0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMta2V5cmluZy5jCkBAIC0wLDAgKzEsMTE1NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWtleXJpbmcuYyBTdG9yZSBzZWNyZXQgY29va2llcyBpbiB5b3VyIGhvbWVkaXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1rZXlyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNLZXlyaW5nIGtleXJpbmcgY2xhc3MKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0tleXJpbmcgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c0tleXJpbmcuIERCdXNLZXlyaW5nIGlzIGludGVuZGVkCisgKiB0byBtYW5hZ2UgY29va2llcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBjbGllbnRzIHRvIHNlcnZlcnMuICBUaGlzIGlzCisgKiBlc3NlbnRpYWxseSB0aGUgInZlcmlmeSB0aGF0IGNsaWVudCBjYW4gcmVhZCB0aGUgdXNlcidzIGhvbWVkaXIiCisgKiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uICBCb3RoIGNsaWVudCBhbmQgc2VydmVyIG11c3QgaGF2ZSBhY2Nlc3MKKyAqIHRvIHRoZSBob21lZGlyLgorICoKKyAqIFRoZSBzZWNyZXQga2V5cyBhcmUgbm90IGtlcHQgaW4gbG9ja2VkIG1lbW9yeSwgYW5kIGFyZSB3cml0dGVuIHRvIGEKKyAqIGZpbGUgaW4gdGhlIHVzZXIncyBob21lZGlyLiBIb3dldmVyIHRoZXkgYXJlIHRyYW5zaWVudCAob25seSB1c2VkCisgKiBieSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgZml4ZWQgcGVyaW9kIG9mIHRpbWUsIHRoZW4KKyAqIGRpc2NhcmRlZCkuIEFsc28sIHRoZSBrZXlzIGFyZSBub3Qgc2VudCBvdmVyIHRoZSB3aXJlLgorICoKKyAqIEB0b2RvIHRoZXJlJ3MgYSBtZW1vcnkgbGVhayBvbiBzb21lIGNvZGVwYXRoIGluIGhlcmUsIEkgc2F3IGl0IG9uY2UKKyAqIHdoZW4gcnVubmluZyBtYWtlIGNoZWNrIC0gcHJvYmFibHkgc29tZSBzcGVjaWZpYyBpbml0aWFsIGNvb2tpZXMKKyAqIHByZXNlbnQgaW4gdGhlIGNvb2tpZSBmaWxlLCB0aGVuIGRlcGVuZGluZyBvbiB3aGF0IHdlIGRvIHdpdGggdGhlbS4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzS2V5cmluZ0ludGVybmFscyBEQnVzS2V5cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNLZXlyaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzS2V5cmluZy4KKyAqCisgKiBAeworICovCisKKy8qKiBUaGUgbWF4aW11bSBhZ2Ugb2YgYSBrZXkgYmVmb3JlIHdlIGNyZWF0ZSBhIG5ldyBrZXkgdG8gdXNlIGluCisgKiBjaGFsbGVuZ2VzLiAgVGhpcyBpc24ndCBzdXBlci1yZWxpYWJseSBlbmZvcmNlZCwgc2luY2Ugc3lzdGVtCisgKiBjbG9ja3MgY2FuIGNoYW5nZSBvciBiZSB3cm9uZywgYnV0IHdlIG1ha2UgYSBiZXN0IGVmZm9ydCB0byBvbmx5CisgKiB1c2Uga2V5cyBmb3IgYSBzaG9ydCB0aW1lLgorICovCisjZGVmaW5lIE5FV19LRVlfVElNRU9VVF9TRUNPTkRTICAgICAoNjAqNSkKKy8qKgorICogVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd2UgZHJvcCBhIGtleSBmcm9tIHRoZSBzZWNyZXRzIGZpbGUuCisgKiBUaGUgRVhQSVJFX0tFWVNfVElNRU9VVF9TRUNPTkRTIC0gTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMgaXMgdGhlIG1pbmltdW0KKyAqIHRpbWUgd2luZG93IGEgY2xpZW50IGhhcyB0byBjb21wbGV0ZSBhdXRoZW50aWNhdGlvbi4KKyAqLworI2RlZmluZSBFWFBJUkVfS0VZU19USU1FT1VUX1NFQ09ORFMgKE5FV19LRVlfVElNRU9VVF9TRUNPTkRTICsgKDYwKjIpKQorLyoqCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBhIGtleSBjYW4gYmUgaW4gdGhlIGZ1dHVyZS4KKyAqLworI2RlZmluZSBNQVhfVElNRV9UUkFWRUxfU0VDT05EUyAoNjAqNSkKKworLyoqCisgKiBNYXhpbXVtIG51bWJlciBvZiBrZXlzIGluIHRoZSBrZXlyaW5nIGJlZm9yZQorICogd2UganVzdCBpZ25vcmUgdGhlIHJlc3QKKyAqLworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjZGVmaW5lIE1BWF9LRVlTX0lOX0ZJTEUgMTAKKyNlbHNlCisjZGVmaW5lIE1BWF9LRVlTX0lOX0ZJTEUgMjU2CisjZW5kaWYKKworLyoqCisgKiBBIHNpbmdsZSBrZXkgZnJvbSB0aGUgY29va2llIGZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZGJ1c19pbnQzMl90IGlkOyAvKio8IGlkZW50aWZpZXIgdXNlZCB0byByZWZlciB0byB0aGUga2V5ICovCisKKyAgbG9uZyBjcmVhdGlvbl90aW1lOyAvKio8IHdoZW4gdGhlIGtleSB3YXMgZ2VuZXJhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAqICAgYXMgdW5peCB0aW1lc3RhbXAuIHNpZ25lZCBsb25nCisgICAgICAgICAgICAgICAgICAgICAgICogICBtYXRjaGVzIHN0cnVjdCB0aW1ldmFsLgorICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgREJ1c1N0cmluZyBzZWNyZXQ7IC8qKjwgdGhlIGFjdHVhbCBrZXkgKi8KKworfSBEQnVzS2V5OworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c0tleXJpbmcuCisgKiAKKyAqIERCdXNLZXlyaW5nIGludGVybmFscy4gREJ1c0tleXJpbmcgaXMgYW4gb3BhcXVlIG9iamVjdCwgaXQgbXVzdCBiZQorICogdXNlZCB2aWEgYWNjZXNzb3IgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgREJ1c0tleXJpbmcKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzU3RyaW5nIGRpcmVjdG9yeTsgICAgIC8qKjwgRGlyZWN0b3J5IHRoZSBiZWxvdyB0d28gaXRlbXMgYXJlIGluc2lkZSAqLworICBEQnVzU3RyaW5nIGZpbGVuYW1lOyAgICAgIC8qKjwgS2V5cmluZyBmaWxlbmFtZSAqLworICBEQnVzU3RyaW5nIGZpbGVuYW1lX2xvY2s7IC8qKjwgTmFtZSBvZiBsb2NrZmlsZSAqLworICBEQnVzS2V5ICprZXlzOyAvKio8IEtleXMgbG9hZGVkIGZyb20gdGhlIGZpbGUgKi8KKyAgaW50IG5fa2V5czsgICAgLyoqPCBOdW1iZXIgb2Yga2V5cyAqLworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzOyAvKio8IENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlciB0aGUga2V5cmluZyBpcyBmb3IgKi8KK307CisKK3N0YXRpYyBEQnVzS2V5cmluZyoKK19kYnVzX2tleXJpbmdfbmV3ICh2b2lkKQoreworICBEQnVzS2V5cmluZyAqa2V5cmluZzsKKworICBrZXlyaW5nID0gZGJ1c19uZXcwIChEQnVzS2V5cmluZywgMSk7CisgIGlmIChrZXlyaW5nID09IE5VTEwpCisgICAgZ290byBvdXRfMDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlyaW5nLT5kaXJlY3RvcnkpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXJpbmctPmZpbGVuYW1lKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrKSkKKyAgICBnb3RvIG91dF8zOworICAKKyAga2V5cmluZy0+cmVmY291bnQgPSAxOworICBrZXlyaW5nLT5rZXlzID0gTlVMTDsKKyAga2V5cmluZy0+bl9rZXlzID0gMDsKKworICByZXR1cm4ga2V5cmluZzsKKworIG91dF8zOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmZpbGVuYW1lKTsKKyBvdXRfMjoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5kaXJlY3RvcnkpOworIG91dF8xOgorICBkYnVzX2ZyZWUgKGtleXJpbmcpOworIG91dF8wOgorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfa2V5cyAoREJ1c0tleSAqa2V5cywKKyAgICAgICAgICAgaW50ICAgICAgbl9rZXlzKQoreworICBpbnQgaTsKKworICAvKiBzaG91bGQgYmUgc2FmZSBmb3IgYXJncyBOVUxMLCAwICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW2ldLnNlY3JldCk7CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZSAoa2V5cyk7Cit9CisKKy8qIE91ciBsb2NraW5nIHNjaGVtZSBpcyBoaWdobHkgdW5yZWxpYWJsZS4gIEhvd2V2ZXIsIHRoZXJlIGlzCisgKiB1bmZvcnR1bmF0ZWx5IG5vIHJlbGlhYmxlIGxvY2tpbmcgc2NoZW1lIGluIHVzZXIgaG9tZSBkaXJlY3RvcmllczsKKyAqIGJldHdlZW4gYnVncyBpbiBMaW51eCBORlMsIHBlb3BsZSB1c2luZyBUcnU2NCBvciBvdGhlciB0b3RhbCBjcmFwCisgKiBORlMsIEFGUywgcmFuZG9tLWZpbGUtc3lzdGVtLW9mLXRoZS13ZWVrLCBhbmQgc28gZm9ydGgsIGZjbnRsKCkgaW4KKyAqIGhvbWVkaXJzIHNpbXBseSBnZW5lcmF0ZXMgdG9ucyBvZiBidWcgcmVwb3J0cy4gVGhpcyBoYXMgYmVlbgorICogbGVhcm5lZCB0aHJvdWdoIGhhcmQgZXhwZXJpZW5jZSB3aXRoIEdDb25mLCB1bmZvcnR1bmF0ZWx5LgorICoKKyAqIFRoaXMgYmFkIGhhY2sgbWlnaHQgd29yayBiZXR0ZXIgZm9yIHRoZSBraW5kIG9mIGxvY2sgd2UgaGF2ZSBoZXJlLAorICogd2hpY2ggd2UgZG9uJ3QgZXhwZWN0IHRvIGhvbGQgZm9yIGFueSBsZW5ndGggb2YgdGltZS4gIENyYXNoaW5nCisgKiB3aGlsZSB3ZSBob2xkIGl0IHNob3VsZCBiZSB1bmxpa2VseSwgYW5kIHRpbWluZyBvdXQgc3VjaCB0aGF0IHdlCisgKiBkZWxldGUgYSBzdGFsZSBsb2NrIHNob3VsZCBhbHNvIGJlIHVubGlrZWx5IGV4Y2VwdCB3aGVuIHRoZQorICogZmlsZXN5c3RlbSBpcyBydW5uaW5nIHJlYWxseSBzbG93bHkuICBTdHVmZiBtaWdodCBicmVhayBpbiBjb3JuZXIKKyAqIGNhc2VzIGJ1dCBhcyBsb25nIGFzIGl0J3Mgbm90IGEgc2VjdXJpdHktbGV2ZWwgYnJlYWthZ2UgaXQgc2hvdWxkCisgKiBiZSBPSy4KKyAqLworCisvKiogTWF4aW11bSBudW1iZXIgb2YgdGltZW91dHMgd2FpdGluZyBmb3IgbG9jayBiZWZvcmUgd2UgZGVjaWRlIGl0J3Mgc3RhbGUgKi8KKyNkZWZpbmUgTUFYX0xPQ0tfVElNRU9VVFMgMzIKKy8qKiBMZW5ndGggb2YgZWFjaCB0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGEgbG9jayAqLworI2RlZmluZSBMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTIDI1MAorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfbG9jayAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIGludCBuX3RpbWVvdXRzOworICAKKyAgbl90aW1lb3V0cyA9IDA7CisgIHdoaWxlIChuX3RpbWVvdXRzIDwgTUFYX0xPQ0tfVElNRU9VVFMpCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBpZiAoX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICBicmVhazsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpZCBub3QgZ2V0IGxvY2sgZmlsZSwgc2xlZXBpbmcgJWQgbWlsbGlzZWNvbmRzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICBMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTKTsKKyAgICAgIAorICAgICAgKytuX3RpbWVvdXRzOworICAgIH0KKworICBpZiAobl90aW1lb3V0cyA9PSBNQVhfTE9DS19USU1FT1VUUykKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMb2NrIGZpbGUgdGltZWQgb3V0ICVkIHRpbWVzLCBhc3N1bWluZyBzdGFsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5fdGltZW91dHMpOworCisgICAgICBpZiAoIV9kYnVzX2RlbGV0ZV9maWxlICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZG4ndCBkZWxldGUgb2xkIGxvY2sgZmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5ICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGRuJ3QgY3JlYXRlIGxvY2sgZmlsZSBhZnRlciBkZWxldGluZyBzdGFsZSBvbmU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2tleXJpbmdfdW5sb2NrIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGlmICghX2RidXNfZGVsZXRlX2ZpbGUgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZGVsZXRlIGxvY2sgZmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzS2V5KgorZmluZF9rZXlfYnlfaWQgKERCdXNLZXkgKmtleXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgbl9rZXlzLAorICAgICAgICAgICAgICAgIGludCAgICAgIGlkKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgeworICAgICAgaWYgKGtleXNbaV0uaWQgPT0gaWQpCisgICAgICAgIHJldHVybiAma2V5c1tpXTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfbmV3X2tleSAoREJ1c0tleSAgKiprZXlzX3AsCisgICAgICAgICAgICAgaW50ICAgICAgICpuX2tleXNfcCwKKyAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzS2V5ICpuZXc7CisgIERCdXNTdHJpbmcgYnl0ZXM7CisgIGludCBpZDsKKyAgbG9uZyB0aW1lc3RhbXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0tleSAqa2V5czsKKyAgaW50IG5fa2V5czsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZieXRlcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGtleXMgPSAqa2V5c19wOworICBuX2tleXMgPSAqbl9rZXlzX3A7CisgIHJldHZhbCA9IEZBTFNFOworICAgICAgCisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgSUQgYW5kIHRoZW4gdGhlIGFjdHVhbCBrZXkuICovCisgcmV0cnk6CisgICAgICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZieXRlcywgNCwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmJ5dGVzKTsKKyAgICAgIAorICBpZCA9IHNbMF0gfCAoc1sxXSA8PCA4KSB8IChzWzJdIDw8IDE2KSB8IChzWzNdIDw8IDI0KTsKKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IC0gaWQ7CisgIF9kYnVzX2Fzc2VydCAoaWQgPj0gMCk7CisKKyAgaWYgKGZpbmRfa2V5X2J5X2lkIChrZXlzLCBuX2tleXMsIGlkKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYnl0ZXMsIDApOworICAgICAgX2RidXNfdmVyYm9zZSAoIktleSBJRCAlZCBhbHJlYWR5IGV4aXN0ZWQsIHRyeWluZyBhbm90aGVyIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVhdGluZyBrZXkgd2l0aCBJRCAlZFxuIiwgaWQpOworICAgICAgCisjZGVmaW5lIEtFWV9MRU5HVEhfQllURVMgMjQKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZieXRlcywgMCk7CisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmYnl0ZXMsIEtFWV9MRU5HVEhfQllURVMsIGVycm9yKSkKKyAgICB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgbmV3ID0gZGJ1c19yZWFsbG9jIChrZXlzLCBzaXplb2YgKERCdXNLZXkpICogKG5fa2V5cyArIDEpKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGtleXMgPSBuZXc7CisgICprZXlzX3AgPSBrZXlzOyAvKiBvdGhlcndpc2UgKmtleXNfcCBlbmRzIHVwIGludmFsaWQgKi8KKyAgbl9rZXlzICs9IDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXNbbl9rZXlzLTFdLnNlY3JldCkpCisgICAgeworICAgICAgbl9rZXlzIC09IDE7IC8qIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgb25lIHdlIGRpZG4ndCBpbml0ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmdGltZXN0YW1wLCBOVUxMKTsKKyAgICAgIAorICBrZXlzW25fa2V5cy0xXS5pZCA9IGlkOworICBrZXlzW25fa2V5cy0xXS5jcmVhdGlvbl90aW1lID0gdGltZXN0YW1wOworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmYnl0ZXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzW25fa2V5cy0xXS5zZWNyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpOworICAgICAgbl9rZXlzIC09IDE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgICpuX2tleXNfcCA9IG5fa2V5czsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYnl0ZXMpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJlbG9hZHMgdGhlIGtleXJpbmcgZmlsZSwgb3B0aW9uYWxseSBhZGRzIG9uZSBuZXcga2V5IHRvIHRoZSBmaWxlLAorICogcmVtb3ZlcyBhbGwgZXhwaXJlZCBrZXlzIGZyb20gdGhlIGZpbGUgaWZmIGEga2V5IHdhcyBhZGRlZCwgdGhlbgorICogcmVzYXZlcyB0aGUgZmlsZS4gIFN0b3JlcyB0aGUga2V5cyBmcm9tIHRoZSBmaWxlIGluIGtleXJpbmctPmtleXMuCisgKiBOb3RlIHRoYXQgdGhlIGZpbGUgaXMgb25seSByZXNhdmVkICh3cml0dGVuIHRvKSBpZiBhIGtleSBpcyBhZGRlZCwKKyAqIHRoaXMgbWVhbnMgdGhhdCBvbmx5IHNlcnZlcnMgZXZlciB3cml0ZSB0byB0aGUgZmlsZSBhbmQgbmVlZCB0bworICogbG9jayBpdCwgd2hpY2ggYXZvaWRzIGEgbG90IG9mIGxvY2sgY29udGVudGlvbiBhdCBsb2dpbiB0aW1lIGFuZAorICogc3VjaC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGFkZF9uZXcgI1RSVUUgdG8gYWRkIGEgbmV3IGtleSB0byB0aGUgZmlsZSwgZXhwaXJlIGtleXMsIGFuZCByZXNhdmUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX3JlbG9hZCAoREJ1c0tleXJpbmcgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGFkZF9uZXcsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRzOworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c19ib29sX3QgaGF2ZV9sb2NrOworICBEQnVzS2V5ICprZXlzOworICBpbnQgbl9rZXlzOworICBpbnQgaTsKKyAgbG9uZyBub3c7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKCZrZXlyaW5nLT5kaXJlY3RvcnksIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50cykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgIAorICBrZXlzID0gTlVMTDsKKyAgbl9rZXlzID0gMDsKKyAgcmV0dmFsID0gRkFMU0U7CisgIGhhdmVfbG9jayA9IEZBTFNFOworCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZub3csIE5VTEwpOworICAKKyAgaWYgKGFkZF9uZXcpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19rZXlyaW5nX2xvY2sgKGtleXJpbmcpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NrIGtleXJpbmcgZmlsZSB0byBhZGQgdG8gaXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBoYXZlX2xvY2sgPSBUUlVFOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCBrZXlyaW5nIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgLyogY29udGludWUgd2l0aCBlbXB0eSBrZXlyaW5nIGZpbGUsIHNvIHdlIHJlY3JlYXRlIGl0ICovCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmNvbnRlbnRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJTZWNyZXQga2V5cmluZyBmaWxlIGNvbnRhaW5zIG5vbi1BU0NJSSEgSWdub3JpbmcgZXhpc3RpbmcgY29udGVudHNcbiIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZW50cywgMCk7CisgICAgfQorCisgIC8qIEZJWE1FIHRoaXMgaXMgYmFkbHkgaW5lZmZpY2llbnQgZm9yIGxhcmdlIGtleXJpbmcgZmlsZXMKKyAgICogKG5vdCB0aGF0IGxhcmdlIGtleXJpbmcgZmlsZXMgZXhpc3Qgb3V0c2lkZSBvZiB0ZXN0IHN1aXRlcykKKyAgICovCisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZjb250ZW50cywgJmxpbmUpKQorICAgIHsKKyAgICAgIGludCBuZXh0OworICAgICAgbG9uZyB2YWw7CisgICAgICBpbnQgaWQ7CisgICAgICBsb25nIHRpbWVzdGFtcDsKKyAgICAgIGludCBsZW47CisgICAgICBpbnQgZW5kOworICAgICAgREJ1c0tleSAqbmV3OworCisgICAgICAvKiBEb24ndCBsb2FkIG1vcmUgdGhhbiB0aGUgbWF4LiAqLworICAgICAgaWYgKG5fa2V5cyA+PSAoYWRkX25ldyA/IE1BWF9LRVlTX0lOX0ZJTEUgLSAxIDogTUFYX0tFWVNfSU5fRklMRSkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBuZXh0ID0gMDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJmxpbmUsIDAsICZ2YWwsICZuZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgcGFyc2Ugc2VjcmV0IGtleSBJRCBhdCBzdGFydCBvZiBsaW5lXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAodmFsID4gX0RCVVNfSU5UMzJfTUFYIHx8IHZhbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiaW52YWxpZCBzZWNyZXQga2V5IElEIGF0IHN0YXJ0IG9mIGxpbmVcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlkID0gdmFsOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIG5leHQsICZuZXh0KTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmbGluZSwgbmV4dCwgJnRpbWVzdGFtcCwgJm5leHQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBwYXJzZSBzZWNyZXQga2V5IHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHRpbWVzdGFtcCA8IDAgfHwKKyAgICAgICAgICAobm93ICsgTUFYX1RJTUVfVFJBVkVMX1NFQ09ORFMpIDwgdGltZXN0YW1wIHx8CisgICAgICAgICAgKG5vdyAtIEVYUElSRV9LRVlTX1RJTUVPVVRfU0VDT05EUykgPiB0aW1lc3RhbXApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZHJvcHBpbmcvaWdub3JpbmcgJWxkLXNlY29uZHMgb2xkIGtleSB3aXRoIHRpbWVzdGFtcCAlbGQgYXMgY3VycmVudCB0aW1lIGlzICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3cgLSB0aW1lc3RhbXAsIHRpbWVzdGFtcCwgbm93KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIG5leHQsICZuZXh0KTsKKworICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKTsKKworICAgICAgaWYgKChsZW4gLSBuZXh0KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIHNlY3JldCBrZXkgYWZ0ZXIgSUQgYW5kIHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogV2UgaGF2ZSBhbGwgdGhyZWUgcGFydHMgKi8KKyAgICAgIG5ldyA9IGRidXNfcmVhbGxvYyAoa2V5cywgc2l6ZW9mIChEQnVzS2V5KSAqIChuX2tleXMgKyAxKSk7CisgICAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBrZXlzID0gbmV3OworICAgICAgbl9rZXlzICs9IDE7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpKQorICAgICAgICB7CisgICAgICAgICAgbl9rZXlzIC09IDE7IC8qIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgb25lIHdlIGRpZG4ndCBpbml0ICovCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAga2V5c1tuX2tleXMtMV0uaWQgPSBpZDsKKyAgICAgIGtleXNbbl9rZXlzLTFdLmNyZWF0aW9uX3RpbWUgPSB0aW1lc3RhbXA7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlICgmbGluZSwgbmV4dCwgJmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzW25fa2V5cy0xXS5zZWNyZXQsIDApKQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSAhPSBlbmQpCisJeworCSAgX2RidXNfdmVyYm9zZSAoImludmFsaWQgaGV4IGVuY29kaW5nIGluIGtleXJpbmcgZmlsZVxuIik7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXNbbl9rZXlzIC0gMV0uc2VjcmV0KTsKKwkgIG5fa2V5cyAtPSAxOworCSAgY29udGludWU7CisJfQorICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IGxvYWRlZCAlZCBleGlzdGluZyBrZXlzXG4iLAorICAgICAgICAgICAgICAgICBuX2tleXMpOworCisgIGlmIChhZGRfbmV3KQorICAgIHsKKyAgICAgIGlmICghYWRkX25ld19rZXkgKCZrZXlzLCAmbl9rZXlzLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyBrZXk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAiKHVua25vd24pIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZW50cywgMCk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tpXS5pZCkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZW50cywgJyAnKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tpXS5jcmVhdGlvbl90aW1lKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmNvbnRlbnRzLCAnICcpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZrZXlzW2ldLnNlY3JldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY29udGVudHMsICdcbicpKQorICAgICAgICAgICAgZ290byBub21lbTsgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5vbWVtOgorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJmNvbnRlbnRzLCAma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoa2V5cmluZy0+a2V5cykKKyAgICBmcmVlX2tleXMgKGtleXJpbmctPmtleXMsIGtleXJpbmctPm5fa2V5cyk7CisgIGtleXJpbmctPmtleXMgPSBrZXlzOworICBrZXlyaW5nLT5uX2tleXMgPSBuX2tleXM7CisgIGtleXMgPSBOVUxMOworICBuX2tleXMgPSAwOworICAKKyAgcmV0dmFsID0gVFJVRTsgIAorICAKKyBvdXQ6CisgIGlmIChoYXZlX2xvY2spCisgICAgX2RidXNfa2V5cmluZ191bmxvY2sgKGtleXJpbmcpOworICAKKyAgaWYgKCEgKChyZXR2YWwgPT0gVFJVRSAmJiAoZXJyb3IgPT0gTlVMTCB8fCBlcnJvci0+bmFtZSA9PSBOVUxMKSkgfHwKKyAgICAgICAgIChyZXR2YWwgPT0gRkFMU0UgJiYgKGVycm9yID09IE5VTEwgfHwgZXJyb3ItPm5hbWUgIT0gTlVMTCkpKSkKKyAgICB7CisgICAgICBpZiAoZXJyb3IgJiYgZXJyb3ItPm5hbWUpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJlcnJvciBpcyAlczogJXNcbiIsIGVycm9yLT5uYW1lLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICBfZGJ1c193YXJuICgicmV0dXJuaW5nICVkIGJ1dCBlcnJvciBwb2ludGVyICVwIG5hbWUgJXNcbiIsCisgICAgICAgICAgICAgICAgICByZXR2YWwsIGVycm9yLCBlcnJvci0+bmFtZSA/IGVycm9yLT5uYW1lIDogIihub25lKSIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGhhbmRsZSBlcnJvcnMgcHJvcGVybHkiKTsKKyAgICB9CisgIAorICBpZiAoa2V5cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfemVybyAoJmtleXNbaV0uc2VjcmV0KTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXNbaV0uc2VjcmV0KTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChrZXlzKTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGludGVybmFscyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNLZXlyaW5nCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEluY3JlbWVudHMgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBrZXlyaW5nCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEByZXR1cm5zIHRoZSBrZXlyaW5nCisgKi8KK0RCdXNLZXlyaW5nICoKK19kYnVzX2tleXJpbmdfcmVmIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAga2V5cmluZy0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4ga2V5cmluZzsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHJlZmNvdW50IGFuZCBmaW5hbGl6ZXMgaWYgaXQgcmVhY2hlcworICogemVyby4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICovCit2b2lkCitfZGJ1c19rZXlyaW5nX3VucmVmIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAga2V5cmluZy0+cmVmY291bnQgLT0gMTsKKworICBpZiAoa2V5cmluZy0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoa2V5cmluZy0+Y3JlZGVudGlhbHMpCisgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChrZXlyaW5nLT5jcmVkZW50aWFscyk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZmlsZW5hbWUpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZGlyZWN0b3J5KTsKKyAgICAgIGZyZWVfa2V5cyAoa2V5cmluZy0+a2V5cywga2V5cmluZy0+bl9rZXlzKTsKKyAgICAgIGRidXNfZnJlZSAoa2V5cmluZyk7ICAgICAgCisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcga2V5cmluZyB0aGF0IGxpdmVzIGluIHRoZSB+Ly5kYnVzLWtleXJpbmdzIGRpcmVjdG9yeQorICogb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgQHAgY3JlZGVudGlhbHMuIElmIHRoZSBAcCBjcmVkZW50aWFscyBhcmUKKyAqICNOVUxMIG9yIGVtcHR5LCB1c2VzIHRob3NlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIGEgc2V0IG9mIGNyZWRlbnRpYWxzIHJlcHJlc2VudGluZyBhIHVzZXIgb3IgI05VTEwKKyAqIEBwYXJhbSBjb250ZXh0IHdoaWNoIGtleXJpbmcgdG8gZ2V0CisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBrZXlyaW5nIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNLZXlyaW5nKgorX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgcmluZ2RpcjsKKyAgREJ1c0tleXJpbmcgKmtleXJpbmc7CisgIGRidXNfYm9vbF90IGVycm9yX3NldDsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c0NyZWRlbnRpYWxzICpvdXJfY3JlZGVudGlhbHM7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIERCdXMga2V5cmluZyB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAga2V5cmluZyA9IE5VTEw7CisgIGVycm9yX3NldCA9IEZBTFNFOworICBvdXJfY3JlZGVudGlhbHMgPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJpbmdkaXIpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChjcmVkZW50aWFscyAhPSBOVUxMKQorICAgIHsKKyAgICAgIG91cl9jcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX2NvcHkgKGNyZWRlbnRpYWxzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvdXJfY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisgICAgfQorICAKKyAgaWYgKG91cl9jcmVkZW50aWFscyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChvdXJfY3JlZGVudGlhbHMpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChvdXJfY3JlZGVudGlhbHMpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2FwcGVuZF9rZXlyaW5nX2RpcmVjdG9yeV9mb3JfY3JlZGVudGlhbHMgKCZyaW5nZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91cl9jcmVkZW50aWFscykpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBrZXlyaW5nID0gX2RidXNfa2V5cmluZ19uZXcgKCk7CisgIGlmIChrZXlyaW5nID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfYXNzZXJ0IChrZXlyaW5nLT5jcmVkZW50aWFscyA9PSBOVUxMKTsKKyAga2V5cmluZy0+Y3JlZGVudGlhbHMgPSBvdXJfY3JlZGVudGlhbHM7CisgIG91cl9jcmVkZW50aWFscyA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IHVucmVmIGl0IGFnYWluIGxhdGVyICovCisgIAorICAvKiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhbHJlYWR5LCBidXQgcGFyYW5vaWEgY2hlY2sgaGVyZSAqLworICBpZiAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoY29udGV4dCkpCisgICAgeworICAgICAgZXJyb3Jfc2V0ID0gVFJVRTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb250ZXh0IGluIGtleXJpbmcgY3JlYXRpb24iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBTYXZlIGtleXJpbmcgZGlyIGluIHRoZSBrZXlyaW5nIG9iamVjdCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmcmluZ2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXJpbmctPmRpcmVjdG9yeSwgMCkpCisgICAgZ290byBmYWlsZWQ7ICAKKworICAvKiBDcmVhdGUga2V5cmluZy0+ZmlsZW5hbWUgYmFzZWQgb24ga2V5cmluZyBkaXIgYW5kIGNvbnRleHQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmtleXJpbmctPmRpcmVjdG9yeSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXJpbmctPmZpbGVuYW1lLCAwKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZrZXlyaW5nLT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiBDcmVhdGUgbG9ja2ZpbGUgbmFtZSAqLworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgma2V5cmluZy0+ZmlsZW5hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLCAwKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLCAiLmxvY2siKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiBSZWxvYWQga2V5cmluZyAqLworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBpZiAoIV9kYnVzX2tleXJpbmdfcmVsb2FkIChrZXlyaW5nLCBGQUxTRSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRpZG4ndCBsb2FkIGFuIGV4aXN0aW5nIGtleXJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisgIAorICAvKiBXZSBkb24ndCBmYWlsIGZhdGFsbHkgaWYgd2UgY2FuJ3QgY3JlYXRlIHRoZSBkaXJlY3RvcnksCisgICAqIGJ1dCB0aGUga2V5cmluZyB3aWxsIHByb2JhYmx5IGFsd2F5cyBiZSBlbXB0eQorICAgKiB1bmxlc3Mgc29tZW9uZSBlbHNlIG1hbmFnZXMgdG8gY3JlYXRlIGl0CisgICAqLworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBpZiAoIV9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKCZrZXlyaW5nLT5kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNyZWF0aW5nIGtleXJpbmcgZGlyZWN0b3J5OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmluZ2Rpcik7CisgIAorICByZXR1cm4ga2V5cmluZzsKKyAgCisgZmFpbGVkOgorICBpZiAoIWVycm9yX3NldCkKKyAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKG91cl9jcmVkZW50aWFscykKKyAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAob3VyX2NyZWRlbnRpYWxzKTsKKyAgaWYgKGtleXJpbmcpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAoa2V5cmluZyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmluZ2Rpcik7CisgIHJldHVybiBOVUxMOworCit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYSB2YWxpZCBjb250ZXh0LgorICogQ29udGV4dHMgdGhhdCBtaWdodCBjYXVzZSBjb25mdXNpb24gd2hlbiB1c2VkCisgKiBpbiBmaWxlbmFtZXMgYXJlIG5vdCBhbGxvd2VkIChjb250ZXh0cyBjYW4ndAorICogc3RhcnQgd2l0aCBhIGRvdCBvciBjb250YWluIGRpciBzZXBhcmF0b3JzKS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIHRoZSBtb3N0IGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCisgKiBpbWFnaW5hYmxlLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0IChjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0KQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRleHQpID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgaXMgemVyby1sZW5ndGhcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoY29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgbm90IHZhbGlkIGFzY2lpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICAvKiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyAqLyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIi8iLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIHNsYXNoXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiXFwiLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGJhY2tzbGFzaFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHByZXZlbnQgYXR0ZW1wdHMgdG8gdXNlIGRvdGZpbGVzIG9yICIuLiIgb3IgIi5sb2NrIgorICAgKiBhbGwgb2Ygd2hpY2ggbWlnaHQgYWxsb3cgc29tZSBraW5kIG9mIGF0dGFjaworICAgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiLiIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgZG90XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogbm8gc3BhY2VzL3RhYnMsIHRob3NlIGFyZSB1c2VkIGZvciBzZXBhcmF0b3JzIGluIHRoZSBwcm90b2NvbCAqLworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGNvbnRleHQsIDAsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgYmxhbmtcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICJcbiIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgbmV3bGluZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIlxyIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBjYXJyaWFnZSByZXR1cm5cbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgREJ1c0tleSoKK2ZpbmRfcmVjZW50X2tleSAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIGludCBpOworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBrZXlyaW5nLT5uX2tleXMpCisgICAgeworICAgICAgREJ1c0tleSAqa2V5ID0gJmtleXJpbmctPmtleXNbaV07CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJLZXkgJWQgaXMgJWxkIHNlY29uZHMgb2xkXG4iLAorICAgICAgICAgICAgICAgICAgICAgaSwgdHZfc2VjIC0ga2V5LT5jcmVhdGlvbl90aW1lKTsKKyAgICAgIAorICAgICAgaWYgKCh0dl9zZWMgLSBORVdfS0VZX1RJTUVPVVRfU0VDT05EUykgPCBrZXktPmNyZWF0aW9uX3RpbWUpCisgICAgICAgIHJldHVybiBrZXk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogR2V0cyBhIHJlY2VudCBrZXkgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbi4KKyAqIElmIG5vIHJlY2VudCBrZXkgZXhpc3RzLCBjcmVhdGVzIG9uZS4gUmV0dXJucworICogdGhlIGtleSBJRC4gSWYgYSBrZXkgY2FuJ3QgYmUgd3JpdHRlbiB0byB0aGUga2V5cmluZworICogZmlsZSBzbyBubyByZWNlbnQga2V5IGNhbiBiZSBjcmVhdGVkLCByZXR1cm5zIC0xLgorICogQWxsIHZhbGlkIGtleXMgYXJlID4gMC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGVycm9yIGVycm9yIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zIGtleSBJRCB0byB1c2UgZm9yIGF1dGgsIG9yIC0xIG9uIGZhaWx1cmUKKyAqLworaW50CitfZGJ1c19rZXlyaW5nX2dldF9iZXN0X2tleSAoREJ1c0tleXJpbmcgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAqZXJyb3IpCit7CisgIERCdXNLZXkgKmtleTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGtleSA9IGZpbmRfcmVjZW50X2tleSAoa2V5cmluZyk7CisgIGlmIChrZXkpCisgICAgcmV0dXJuIGtleS0+aWQ7CisKKyAgLyogQWxsIG91ciBrZXlzIGFyZSB0b28gb2xkLCBvciB3ZSd2ZSBuZXZlciBsb2FkZWQgdGhlCisgICAqIGtleXJpbmcuIENyZWF0ZSBhIG5ldyBvbmUuCisgICAqLworICBpZiAoIV9kYnVzX2tleXJpbmdfcmVsb2FkIChrZXlyaW5nLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgcmV0dXJuIC0xOworCisgIGtleSA9IGZpbmRfcmVjZW50X2tleSAoa2V5cmluZyk7CisgIGlmIChrZXkpCisgICAgcmV0dXJuIGtleS0+aWQ7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlY2VudC1lbm91Z2gga2V5IGZvdW5kIGluIGtleXJpbmcsIGFuZCB1bmFibGUgdG8gY3JlYXRlIGEgbmV3IGtleSIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUga2V5cmluZyBpcyBmb3IgdGhlIHNhbWUgdXNlciBhcyB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgY3JlZGVudGlhbHMgdG8gY2hlY2sKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUga2V5cmluZyBiZWxvbmdzIHRvIHRoZSBnaXZlbiB1c2VyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX2lzX2Zvcl9jcmVkZW50aWFscyAoREJ1c0tleXJpbmcgICAgICAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGtleXJpbmctPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaGV4LWVuY29kZWQgc2VjcmV0IGtleSBmb3IgdGhlIGdpdmVuIElELgorICogUmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuIFJldHVybnMgI1RSVUUKKyAqIGJ1dCBlbXB0eSBrZXkgb24gYW55IG90aGVyIGVycm9yIHN1Y2ggYXMgdW5rbm93bgorICoga2V5IElELgorICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKiBAcGFyYW0ga2V5X2lkIHRoZSBrZXkgSUQKKyAqIEBwYXJhbSBoZXhfa2V5IHN0cmluZyB0byBhcHBlbmQgaGV4LWVuY29kZWQga2V5IHRvCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAoREJ1c0tleXJpbmcgICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAga2V5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmhleF9rZXkpCit7CisgIERCdXNLZXkgKmtleTsKKworICBrZXkgPSBmaW5kX2tleV9ieV9pZCAoa2V5cmluZy0+a2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXJpbmctPm5fa2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleV9pZCk7CisgIGlmIChrZXkgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsgLyogaGFkIGVub3VnaCBtZW1vcnksIHNvIFRSVUUgKi8KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZrZXktPnNlY3JldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChoZXhfa2V5KSk7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgZXhwb3NlZCBBUEkgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBjb250ZXh0OworICBEQnVzS2V5cmluZyAqcmluZzE7CisgIERCdXNLZXlyaW5nICpyaW5nMjsKKyAgaW50IGlkOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCBpOworCisgIHJpbmcxID0gTlVMTDsKKyAgcmluZzIgPSBOVUxMOworICAKKyAgLyogQ29udGV4dCB2YWxpZGF0aW9uICovCisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28iKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9ibGFoIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiLmZvbyIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImJhci5mb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJiYXIvZm9vIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiYmFyXFxmb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceGZhXHhmMCIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvb1x4ODAiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceDdmIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28gYmFyIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZXh0LCAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRleHQpOworCisgIC8qIE5vdyB2ZXJpZnkgdGhhdCBpZiB3ZSBjcmVhdGUgYSBrZXkgaW4ga2V5cmluZyAxLAorICAgKiBpdCBpcyBwcm9wZXJseSBsb2FkZWQgaW4ga2V5cmluZyAyCisgICAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9kYnVzX3Rlc3RzdWl0ZSIpOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHJpbmcxID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAocmluZzEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZXJyb3IubmFtZSA9PSBOVUxMKTsKKworICBpZCA9IF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5IChyaW5nMSwgJmVycm9yKTsKKyAgaWYgKGlkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbG9hZCBrZXlyaW5nOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgIHJpbmcyID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChyaW5nMiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci5uYW1lID09IE5VTEwpOworICAKKyAgaWYgKHJpbmcxLT5uX2tleXMgIT0gcmluZzItPm5fa2V5cykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJEaWZmZXJlbnQgbnVtYmVyIG9mIGtleXMgaW4ga2V5cmluZ3NcbiIpOworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKworICAvKiBXZSBndWFyYW50ZWUgd2UgbG9hZCBhbmQgc2F2ZSBrZWVwaW5nIGtleXMgaW4gYSBmaXhlZAorICAgKiBvcmRlcgorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgcmluZzEtPm5fa2V5cykKKyAgICB7CisgICAgICBpZiAocmluZzEtPmtleXNbaV0uaWQgIT0gcmluZzItPmtleXNbaV0uaWQpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJLZXlyaW5nIDEgaGFzIGZpcnN0IGtleSBJRCAlZCBhbmQga2V5cmluZyAyIGhhcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByaW5nMS0+a2V5c1tpXS5pZCwgcmluZzItPmtleXNbaV0uaWQpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocmluZzEtPmtleXNbaV0uY3JlYXRpb25fdGltZSAhPSByaW5nMi0+a2V5c1tpXS5jcmVhdGlvbl90aW1lKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiS2V5cmluZyAxIGhhcyBmaXJzdCBrZXkgdGltZSAlbGQgYW5kIGtleXJpbmcgMiBoYXMgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgIHJpbmcxLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUsIHJpbmcyLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnJpbmcxLT5rZXlzW2ldLnNlY3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmluZzItPmtleXNbaV0uc2VjcmV0KSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIktleXJpbmdzIDEgYW5kIDIgaGF2ZSBkaWZmZXJlbnQgc2VjcmV0cyBmb3Igc2FtZSBJRC90aW1lc3RhbXBcbiIpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAlZCBrZXlzIGluIHRlc3RcbiIsIHJpbmcxLT5uX2tleXMpOworCisgIC8qIFRlc3QgcmVmL3VucmVmICovCisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMSk7CisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMik7CisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisKKyAgLyogcmVhbGx5IHVucmVmICovCisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsdXJlOgorICBpZiAocmluZzEpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzEpOworICBpZiAocmluZzIpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisgICAgIApkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWtleXJpbmcuaCBiL2RidXMvZGJ1cy1rZXlyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZTMxYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1rZXlyaW5nLmgKQEAgLTAsMCArMSw1MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWtleXJpbmcuaCBTdG9yZSBzZWNyZXQgY29va2llcyBpbiB5b3VyIGhvbWVkaXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX0tFWVJJTkdfSAorI2RlZmluZSBEQlVTX0tFWVJJTkdfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0tleXJpbmcgREJ1c0tleXJpbmc7CisKK0RCdXNLZXlyaW5nKiBfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKERCdXNDcmVkZW50aWFscyAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCdXNLZXlyaW5nKiBfZGJ1c19rZXlyaW5nX3JlZiAgICAgICAgICAgICAgICAgKERCdXNLZXlyaW5nICAgICAgKmtleXJpbmcpOwordm9pZCAgICAgICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgICAgICAgICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZyk7CitkYnVzX2Jvb2xfdCAgX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICAgIChjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0KTsKK2ludCAgICAgICAgICBfZGJ1c19rZXlyaW5nX2dldF9iZXN0X2tleSAgICAgICAgKERCdXNLZXlyaW5nICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgX2RidXNfa2V5cmluZ19pc19mb3JfY3JlZGVudGlhbHMgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgIF9kYnVzX2tleXJpbmdfZ2V0X2hleF9rZXkgICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGtleV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmhleF9rZXkpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0tFWVJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWxpc3QuYyBiL2RidXMvZGJ1cy1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjMTg1NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1saXN0LmMKQEAgLTAsMCArMSwxMzUwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGlzdC5jIEdlbmVyaWMgbGlua2VkIGxpc3QgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lbXBvb2wuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0xpc3QgTGlua2VkIGxpc3QKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0xpc3QgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c0xpc3QuCisgKi8KKworLyogUHJvdGVjdGVkIGJ5IF9EQlVTX0xPQ0sgKGxpc3QpICovCitzdGF0aWMgREJ1c01lbVBvb2wgKmxpc3RfcG9vbDsKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0xpc3RJbnRlcm5hbHMgTGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTGlzdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c0xpc3QuCisgKgorICogQHsKKyAqLworCisvKiB0aGUgbWVtIHBvb2wgaXMgcHJvYmFibHkgYSBzcGVlZCBoaXQsIHdpdGggdGhlIHRocmVhZAorICogbG9jaywgdGhvdWdoIGl0IGRvZXMgc3RpbGwgc2F2ZSBtZW1vcnkgLSB1bmtub3duLgorICovCitzdGF0aWMgREJ1c0xpc3QqCithbGxvY19saW5rICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBpZiAoIV9EQlVTX0xPQ0sgKGxpc3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGlzdF9wb29sID09IE5VTEwpCisgICAgeyAgICAgIAorICAgICAgbGlzdF9wb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplb2YgKERCdXNMaXN0KSwgVFJVRSk7CisKKyAgICAgIGlmIChsaXN0X3Bvb2wgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAobGlzdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgbGluayA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChsaXN0X3Bvb2wpOworICAgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKGxpc3RfcG9vbCk7CisgICAgICAgICAgbGlzdF9wb29sID0gTlVMTDsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGluayA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChsaXN0X3Bvb2wpOworICAgIH0KKworICBpZiAobGluaykKKyAgICBsaW5rLT5kYXRhID0gZGF0YTsKKyAgCisgIF9EQlVTX1VOTE9DSyAobGlzdCk7CisKKyAgcmV0dXJuIGxpbms7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2xpbmsgKERCdXNMaXN0ICpsaW5rKQoreyAgCisgIGlmICghX0RCVVNfTE9DSyAobGlzdCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid2Ugc2hvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgImJlZm9yZSB3ZSBhbGxvY2F0ZWQgYSBsaW5rZWQtbGlzdCBsaW5rIik7CisKKyAgaWYgKF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKGxpc3RfcG9vbCwgbGluaykpCisgICAgeworICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAobGlzdF9wb29sKTsKKyAgICAgIGxpc3RfcG9vbCA9IE5VTEw7CisgICAgfQorICAKKyAgX0RCVVNfVU5MT0NLIChsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2xpbmtfYmVmb3JlIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBsaW5rLT5uZXh0ID0gYmVmb3JlX3RoaXNfbGluazsKKyAgICAgIGxpbmstPnByZXYgPSBiZWZvcmVfdGhpc19saW5rLT5wcmV2OworICAgICAgYmVmb3JlX3RoaXNfbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5wcmV2LT5uZXh0ID0gbGluazsKKyAgICAgIAorICAgICAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gKmxpc3QpCisgICAgICAgICpsaXN0ID0gbGluazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsaW5rX2FmdGVyIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rLT5wcmV2ID0gYWZ0ZXJfdGhpc19saW5rOworICAgICAgbGluay0+bmV4dCA9IGFmdGVyX3RoaXNfbGluay0+bmV4dDsKKyAgICAgIGFmdGVyX3RoaXNfbGluay0+bmV4dCA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluazsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUwordm9pZAorX2RidXNfbGlzdF9nZXRfc3RhdHMgICAgIChkYnVzX3VpbnQzMl90ICppbl91c2VfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmFsbG9jYXRlZF9wKQoreworICBpZiAoIV9EQlVTX0xPQ0sgKGxpc3QpKQorICAgIHsKKyAgICAgICppbl91c2VfcCA9IDA7CisgICAgICAqaW5fZnJlZV9saXN0X3AgPSAwOworICAgICAgKmFsbG9jYXRlZF9wID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX2RidXNfbWVtX3Bvb2xfZ2V0X3N0YXRzIChsaXN0X3Bvb2wsIGluX3VzZV9wLCBpbl9mcmVlX2xpc3RfcCwgYWxsb2NhdGVkX3ApOworICBfREJVU19VTkxPQ0sgKGxpc3QpOworfQorI2VuZGlmCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNMaXN0CisgKiBAeworICovCisKKy8qKgorICogQHN0cnVjdCBEQnVzTGlzdAorICoKKyAqIEEgbm9kZSBpbiBhIGxpbmtlZCBsaXN0LgorICoKKyAqIERCdXNMaXN0IGlzIGEgY2lyY3VsYXIgbGlzdDsgdGhhdCBpcywgdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAqIHBvaW50cyBiYWNrIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBUaGUgZW1wdHkgbGlzdCBpcworICogcmVwcmVzZW50ZWQgYnkgYSAjTlVMTCBwb2ludGVyLgorICovCisKKy8qKgorICogQGRlZiBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsKKyAqCisgKiBHZXRzIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7CisgKiB3aGlsZSAobGluayAhPSBOVUxMKQorICogICB7CisgKiAgICAgcHJpbnRmICgidmFsdWUgaXMgJXBcbiIsIGxpbmstPmRhdGEpOworICogICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaW5rKTsKKyAqICAgfQorICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayBjdXJyZW50IGxpbmsuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBAZGVmIF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluaworICoKKyAqIEdldHMgdGhlIHByZXZpb3VzIGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZsaXN0KTsKKyAqIHdoaWxlIChsaW5rICE9IE5VTEwpCisgKiAgIHsKKyAqICAgICBwcmludGYgKCJ2YWx1ZSBpcyAlcFxuIiwgbGluay0+ZGF0YSk7CisgKiAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmxpbmspOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIGN1cnJlbnQgbGluay4KKyAqIEByZXR1cm5zIHRoZSBwcmV2aW91cyBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBBbGxvY2F0ZXMgYSBsaW5rZWQgbGlzdCBub2RlLiBVc2VmdWwgZm9yIHByZWFsbG9jYXRpbmcKKyAqIG5vZGVzIGFuZCB1c2luZyBfZGJ1c19saXN0X2FwcGVuZF9saW5rKCkgdG8gYXZvaWQKKyAqIGFsbG9jYXRpb25zLgorICogCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGxpbmsuCisgKiBAcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBsaW5rLgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfYWxsb2NfbGluayAodm9pZCAqZGF0YSkKK3sKKyAgcmV0dXJuIGFsbG9jX2xpbmsgKGRhdGEpOworfQorCisvKioKKyAqIEZyZWVzIGEgbGlua2VkIGxpc3Qgbm9kZSBhbGxvY2F0ZWQgd2l0aCBfZGJ1c19saXN0X2FsbG9jX2xpbmsuCisgKiBEb2VzIG5vdCBmcmVlIHRoZSBkYXRhIGluIHRoZSBub2RlLgorICoKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IG5vZGUKKyAqLwordm9pZAorX2RidXNfbGlzdF9mcmVlX2xpbmsgKERCdXNMaXN0ICpsaW5rKQoreworICBmcmVlX2xpbmsgKGxpbmspOworfQorCisKKy8qKgorICogQXBwZW5kcyBhIHZhbHVlIHRvIHRoZSBsaXN0LiBNYXkgcmV0dXJuICNGQUxTRQorICogaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gYWRkIGEgbGlzdCBsaW5rLgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBhcHBlbmQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9hcHBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kIChsaXN0LCBkYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSB2YWx1ZSB0byB0aGUgbGlzdC4gTWF5IHJldHVybiAjRkFMU0UKKyAqIGlmIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGFkZCBhIGxpc3QgbGluay4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcHJlcGVuZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3ByZXBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGxpbmsgdG8gdGhlIGxpc3QuCisgKiBDYW5ub3QgZmFpbCBkdWUgdG8gb3V0IG9mIG1lbW9yeS4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB0byBhcHBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKwkJCURCdXNMaXN0ICpsaW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAobGlzdCwgbGluayk7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSBsaW5rIHRvIHRoZSBsaXN0LiAKKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIHByZXBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisJCQkgREJ1c0xpc3QgKmxpbmspCit7CisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7Cit9CisKKy8qKgorICogSW5zZXJ0cyBkYXRhIGludG8gdGhlIGxpc3QgYWZ0ZXIgdGhlIGdpdmVuIGV4aXN0aW5nIGxpbmsuCisgKiAKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIG1vZGlmeQorICogQHBhcmFtIGFmdGVyX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBhZnRlciwgb3IgI05VTEwgdG8gcHJlcGVuZAorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2luc2VydF9hZnRlciAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7ICAKKworICBpZiAoYWZ0ZXJfdGhpc19saW5rID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2xpc3RfcHJlcGVuZCAobGlzdCwgZGF0YSk7CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgICAgICBpZiAobGluayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgIAorICAgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGJlZm9yZSB0aGUgZ2l2ZW4gZXhpc3RpbmcgbGluay4KKyAqIAorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gbW9kaWZ5CisgKiBAcGFyYW0gYmVmb3JlX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBiZWZvcmUsIG9yICNOVUxMIHRvIGFwcGVuZAorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgdG8gaW5zZXJ0CisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZV9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gTlVMTCkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZQorICAgIGxpbmtfYmVmb3JlIChsaXN0LCBiZWZvcmVfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGFmdGVyIHRoZSBnaXZlbiBleGlzdGluZyBsaW5rLgorICogCisgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBtb2RpZnkKKyAqIEBwYXJhbSBhZnRlcl90aGlzX2xpbmsgZXhpc3RpbmcgbGluayB0byBpbnNlcnQgYWZ0ZXIsIG9yICNOVUxMIHRvIHByZXBlbmQKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIGluc2VydAorICovCit2b2lkCitfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGFmdGVyX3RoaXNfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZSAgCisgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogZmlyc3QgdmFsdWUgZXF1YWwgdG8gdGhlIGdpdmVuIGRhdGEgcG9pbnRlciwKKyAqIGV2ZW4gaWYgbXVsdGlwbGUgdmFsdWVzIGV4aXN0IHdoaWNoIG1hdGNoLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcmVtb3ZlLgorICogQHJldHVybnMgI1RSVUUgaWYgYSB2YWx1ZSB3YXMgZm91bmQgdG8gcmVtb3ZlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9yZW1vdmUgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAobGlzdCwgbGluayk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogbGFzdCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLAorICogZXZlbiBpZiBtdWx0aXBsZSB2YWx1ZXMgZXhpc3Qgd2hpY2ggbWF0Y2guCisgKiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byByZW1vdmUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHZhbHVlIHdhcyBmb3VuZCB0byByZW1vdmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3JlbW92ZV9sYXN0IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2ZpbmRfbGFzdCAobGlzdCwgZGF0YSk7CisgIGlmIChsaW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKGxpc3QsIGxpbmspOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbmRzIGEgdmFsdWUgaW4gdGhlIGxpc3QuIFJldHVybnMgdGhlIGxhc3QgbGluaworICogd2l0aCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqIFJldHVybnMgI05VTEwgaWYgbm8gdmFsdWUgZm91bmQgdGhhdCBtYXRjaGVzLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBmaW5kLgorICogQHJldHVybnMgdGhlIGxpbmsgaWYgZm91bmQKKyAqLworREJ1c0xpc3QqCitfZGJ1c19saXN0X2ZpbmRfbGFzdCAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAobGlzdCk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICByZXR1cm4gbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpbmsgZnJvbSB0aGUgbGlzdCwgYnV0IGRvZXNuJ3QKKyAqIGZyZWUgaXQuIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsoKSBib3RoIHJlbW92ZXMgdGhlCisgKiBsaW5rIGFuZCBhbHNvIGZyZWVzIGl0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgKiBAcGFyYW0gbGluayB0aGUgbGluayBpbiB0aGUgbGlzdAorICovCit2b2lkCitfZGJ1c19saXN0X3VubGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGxpbmstPm5leHQgPT0gbGluaykKKyAgICB7CisgICAgICAvKiBvbmUtZWxlbWVudCBsaXN0ICovCisgICAgICAqbGlzdCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeyAgICAgIAorICAgICAgbGluay0+cHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluay0+cHJldjsKKyAgICAgIAorICAgICAgaWYgKCpsaXN0ID09IGxpbmspCisgICAgICAgICpsaXN0ID0gbGluay0+bmV4dDsKKyAgICB9CisKKyAgbGluay0+bmV4dCA9IE5VTEw7CisgIGxpbmstPnByZXYgPSBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBsaW5rIGZyb20gdGhlIGxpc3QuIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGlzdCBsaW5rIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfbGlzdF9yZW1vdmVfbGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBfZGJ1c19saXN0X3VubGluayAobGlzdCwgbGluayk7CisgIGZyZWVfbGluayAobGluayk7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGxpbmtzIGluIHRoZSBsaXN0IGFuZCBzZXRzIHRoZSBsaXN0IGhlYWQgdG8gI05VTEwuIERvZXMKKyAqIG5vdCBmcmVlIHRoZSBkYXRhIGluIGVhY2ggbGluaywgZm9yIG9idmlvdXMgcmVhc29ucy4gVGhpcyBpcyBhCisgKiBsaW5lYXItdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICovCit2b2lkCitfZGJ1c19saXN0X2NsZWFyIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgICAKKyAgICAgIGZyZWVfbGluayAobGluayk7CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICAqbGlzdCA9IE5VTEw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgbGluaywgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICByZXR1cm4gKmxpc3Q7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGFzdCBsaW5rIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBsYXN0IGxpbmssIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiAoKmxpc3QpLT5wcmV2OworfQorCisvKioKKyAqIEdldHMgdGhlIGxhc3QgZGF0YSBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gKCpsaXN0KS0+cHJldi0+ZGF0YTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2ZpcnN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIGlmICgqbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuICgqbGlzdCktPmRhdGE7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMgYQorICogY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHJldHVybnMgdGhlIGZpcnN0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfbGlzdF91bmxpbmsgKGxpc3QsIGxpbmspOworCisgIHJldHVybiBsaW5rOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgZGF0YSBpbiB0aGUgbGlzdCwgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK3ZvaWQqCitfZGJ1c19saXN0X3BvcF9maXJzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgdm9pZCAqZGF0YTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfcG9wX2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIHZvaWQgKmRhdGE7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBDb3BpZXMgYSBsaXN0LiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLiAgSWYgdGhlcmUgaXNuJ3QKKyAqIGVub3VnaCBtZW1vcnkgdG8gY29weSB0aGUgZW50aXJlIGxpc3QsIHRoZSBkZXN0aW5hdGlvbiBsaXN0IHdpbGwgYmUKKyAqIHNldCB0byAjTlVMTC4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHRvIGNvcHkuCisgKiBAcGFyYW0gZGVzdCBhZGRyZXNzIHdoZXJlIHRoZSBjb3BpZWQgbGlzdCBzaG91bGQgYmUgcGxhY2VkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9jb3B5IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGVzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChsaXN0ICE9IGRlc3QpOworCisgICpkZXN0ID0gTlVMTDsKKyAgCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChkZXN0LCBsaW5rLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIGZyZWUgd2hhdCB3ZSBoYXZlIHNvIGZhciAqLworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKGRlc3QpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgbGlzdC4gVGhpcyBpcyBhIGxpbmVhci10aW1lCisgKiBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgaGVhZCBvZiB0aGUgbGlzdAorICogQHJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitpbnQKK19kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGxlbmd0aDsKKworICBsZW5ndGggPSAwOworICAKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgICsrbGVuZ3RoOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyoqCisgKiBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdC4gIFRoZQorICogZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBsaXN0IGVsZW1lbnQgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlCisgKiBnaXZlbiBkYXRhIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQuCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVsZW1lbnQuCisgKiBAcGFyYW0gZGF0YSBleHRyYSBkYXRhIGZvciB0aGUgZnVuY3Rpb24uCisgKiAKKyAqLwordm9pZAorX2RidXNfbGlzdF9mb3JlYWNoIChEQnVzTGlzdCAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoRnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICAgIAorICAgICAgKCogZnVuY3Rpb24pIChsaW5rLT5kYXRhLCBkYXRhKTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgbGVuZ3RoIGlzIGV4YWN0bHkgb25lLgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiBsZW5ndGggaXMgZXhhY3RseSBvbmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoREJ1c0xpc3QgKipsaXN0KQoreworICByZXR1cm4gKCpsaXN0ICE9IE5VTEwgJiYKKyAgICAgICAgICAoKmxpc3QpLT5uZXh0ID09ICpsaXN0KTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfbGlzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGxlbmd0aDsKKyAgCisgIGxpbmsgPSAqbGlzdDsKKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAobGluay0+bmV4dCA9PSBsaW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+cHJldiA9PSBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKmxpc3QgPT0gbGluayk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxlbmd0aCA9IDA7CisgIGRvCisgICAgeworICAgICAgbGVuZ3RoICs9IDE7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmstPnByZXYtPm5leHQgPT0gbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmstPm5leHQtPnByZXYgPT0gbGluayk7CisgICAgICBsaW5rID0gbGluay0+bmV4dDsKKyAgICB9CisgIHdoaWxlIChsaW5rICE9ICpsaXN0KTsKKworICBfZGJ1c19hc3NlcnQgKGxlbmd0aCA9PSBfZGJ1c19saXN0X2dldF9sZW5ndGggKGxpc3QpKTsKKworICBpZiAobGVuZ3RoID09IDEpCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKGxpc3QpKTsKKyAgZWxzZQorICAgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAobGlzdCkpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX2FzY2VuZGluZ19zZXF1ZW5jZSAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IHByZXY7CisKKyAgcHJldiA9IF9EQlVTX0lOVF9NSU47CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHYgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAobGluay0+ZGF0YSk7CisgICAgICAKKyAgICAgIGlmICh2IDw9IHByZXYpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcHJldiA9IHY7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpc19kZXNjZW5kaW5nX3NlcXVlbmNlIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgcHJldjsKKworICBwcmV2ID0gX0RCVVNfSU5UX01BWDsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKworICAgICAgaWYgKHYgPj0gcHJldikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBwcmV2ID0gdjsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbF9ldmVuX3ZhbHVlcyAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKworICAgICAgaWYgKCh2ICUgMikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxsX29kZF92YWx1ZXMgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHYgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAobGluay0+ZGF0YSk7CisKKyAgICAgIGlmICgodiAlIDIpID09IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RzX2VxdWFsIChEQnVzTGlzdCAqKmxpc3QxLAorICAgICAgICAgICAgIERCdXNMaXN0ICoqbGlzdDIpCit7CisgIERCdXNMaXN0ICpsaW5rMTsKKyAgREJ1c0xpc3QgKmxpbmsyOworICAKKyAgbGluazEgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0MSk7CisgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdDIpOworICB3aGlsZSAobGluazEgJiYgbGluazIpCisgICAgeworICAgICAgaWYgKGxpbmsxLT5kYXRhICE9IGxpbmsyLT5kYXRhKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0MSwgbGluazEpOworICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QyLCBsaW5rMik7CisgICAgfQorCisgIGlmIChsaW5rMSB8fCBsaW5rMikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c0xpc3RJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c0xpc3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3Rlc3QgKHZvaWQpCit7CisgIERCdXNMaXN0ICpsaXN0MTsKKyAgREJ1c0xpc3QgKmxpc3QyOworICBEQnVzTGlzdCAqbGluazE7CisgIERCdXNMaXN0ICpsaW5rMjsKKyAgREJ1c0xpc3QgKmNvcHkxOworICBEQnVzTGlzdCAqY29weTI7CisgIGludCBpOworICAKKyAgbGlzdDEgPSBOVUxMOworICBsaXN0MiA9IE5VTEw7CisKKyAgLyogVGVzdCBhcHBlbmQgYW5kIHByZXBlbmQgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBhcHBlbmQiKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bnQgbm90IGFsbG9jYXRlIGZvciBwcmVwZW5kIik7CisgICAgICArK2k7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbGlzdDEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0MikgPT0gaSk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDIpKTsKKworICAvKiBUZXN0IGxpc3QgY2xlYXIgKi8KKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisKKyAgLyogVGVzdCBnZXRfZmlyc3QsIGdldF9sYXN0LCBwb3BfZmlyc3QsIHBvcF9sYXN0ICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICB2b2lkICpnb3RfZGF0YTE7CisgICAgICB2b2lkICpnb3RfZGF0YTI7CisgICAgICAKKyAgICAgIHZvaWQgKmRhdGExOworICAgICAgdm9pZCAqZGF0YTI7CisKKyAgICAgIGdvdF9kYXRhMSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZsaXN0MSk7CisgICAgICBnb3RfZGF0YTIgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgZGF0YTEgPSBfZGJ1c19saXN0X3BvcF9sYXN0ICgmbGlzdDEpOworICAgICAgZGF0YTIgPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxpc3QyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChnb3RfZGF0YTEgPT0gZGF0YTEpOworICAgICAgX2RidXNfYXNzZXJ0IChnb3RfZGF0YTIgPT0gZGF0YTIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChkYXRhMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChkYXRhMikgPT0gaSk7CisKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QyKSk7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChsaXN0MSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0MiA9PSBOVUxMKTsKKworICAvKiBUZXN0IGdldF9maXJzdF9saW5rLCBnZXRfbGFzdF9saW5rLCBwb3BfZmlyc3RfbGluaywgcG9wX2xhc3RfbGluayAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmdvdF9saW5rMTsKKyAgICAgIERCdXNMaXN0ICpnb3RfbGluazI7CisKKyAgICAgIERCdXNMaXN0ICpsaW5rMjsKKyAgICAgIAorICAgICAgdm9pZCAqZGF0YTFfaW5kaXJlY3Q7CisgICAgICB2b2lkICpkYXRhMTsKKyAgICAgIHZvaWQgKmRhdGEyOworICAgICAgCisgICAgICBnb3RfbGluazEgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZsaXN0MSk7CisgICAgICBnb3RfbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdDIpOworCisgICAgICBsaW5rMiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZ290X2xpbmsyID09IGxpbmsyKTsKKworICAgICAgZGF0YTFfaW5kaXJlY3QgPSBnb3RfbGluazEtPmRhdGE7CisgICAgICAvKiB0aGlzIGNhbGwgbWFrZXMgZ290X2xpbmsxIGludmFsaWQgKi8KKyAgICAgIGRhdGExID0gX2RidXNfbGlzdF9wb3BfbGFzdCAoJmxpc3QxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YTEgPT0gZGF0YTFfaW5kaXJlY3QpOworICAgICAgZGF0YTIgPSBsaW5rMi0+ZGF0YTsKKworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmsyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTIpID09IGkpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobGlzdDEgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGlzdDIgPT0gTlVMTCk7CisgIAorICAvKiBUZXN0IGl0ZXJhdGlvbiAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QxKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbGlzdDIpID09IGkpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QyKSk7CisKKyAgLS1pOworICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisgIHdoaWxlIChsaW5rMiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGluazIpOyAvKiBwcmV0ZW5kIHRoaXMgbGluayBpcyB0aGUgaGVhZCAqLworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMi0+ZGF0YSkgPT0gaSk7CisgICAgICAKKyAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdDIsIGxpbmsyKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgaSA9IDA7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QxKTsKKyAgd2hpbGUgKGxpbmsxICE9IE5VTEwpCisgICAgeworICAgICAgdmVyaWZ5X2xpc3QgKCZsaW5rMSk7IC8qIHByZXRlbmQgdGhpcyBsaW5rIGlzIHRoZSBoZWFkICovCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsxLT5kYXRhKSA9PSBpKTsKKyAgICAgIAorICAgICAgbGluazEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MSwgbGluazEpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmbGlzdDEpOworICB3aGlsZSAobGluazEgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpbmsxKTsgLyogcHJldGVuZCB0aGlzIGxpbmsgaXMgdGhlIGhlYWQgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazEtPmRhdGEpID09IGkpOworICAgICAgCisgICAgICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmxpc3QxLCBsaW5rMSk7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisKKyAgLyogVGVzdCByZW1vdmUgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IHNob3VsZCBoYXZlIGJlZW4gaW4gbGlzdCIpOworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgICAgfQorICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxfb2RkX3ZhbHVlcyAoJmxpc3QyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiB0ZXN0IHJlbW92aW5nIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBlbGVtZW50cyAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgaWYgKChpICUgMikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBzaG91bGQgaGF2ZSBiZWVuIGluIGxpc3QiKTsKKworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgICB9CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYWxsX2V2ZW5fdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxfZXZlbl92YWx1ZXMgKCZsaXN0MikpOworCisgIC8qIGNsZWFyIGxpc3QgdXNpbmcgcmVtb3ZlX2xpbmsgKi8KKyAgd2hpbGUgKGxpc3QxICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QxLCBsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICB9CisgIHdoaWxlIChsaXN0MiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MiwgbGlzdDIpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgfQorCisgIC8qIFRlc3QgcmVtb3ZlIGxpbmsgbW9yZSBnZW5lcmFsbHkgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QyKTsKKyAgd2hpbGUgKGxpbmsyICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MiwgbGluazIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMi0+ZGF0YSkgPT0gaSk7CisKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MiwgbGluazIpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgbGluazIgPSBuZXh0OworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDIpKTsgIAorICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworICAKKyAgaSA9IDA7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QxKTsKKyAgd2hpbGUgKGxpbmsxICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MSwgbGluazEpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMS0+ZGF0YSkgPT0gaSk7CisKKyAgICAgIGlmICgoaSAlIDIpICE9IDApCisgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MSwgbGluazEpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIAorICAgICAgbGluazEgPSBuZXh0OworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9ldmVuX3ZhbHVlcyAoJmxpc3QxKSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisKKyAgLyogVGVzdCBjb3B5aW5nIGEgbGlzdCAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC8qIGJhZCBwb2ludGVycywgYmVjYXVzZSB0aGV5IGFyZSBhbGxvd2VkIGluIHRoZSBjb3B5IGRlc3QgKi8KKyAgY29weTEgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMHgzNDIyMzQpOworICBjb3B5MiA9IF9EQlVTX0lOVF9UT19QT0lOVEVSICgyMyk7CisgIAorICBfZGJ1c19saXN0X2NvcHkgKCZsaXN0MSwgJmNvcHkxKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIHZlcmlmeV9saXN0ICgmY29weTEpOworICBfZGJ1c19hc3NlcnQgKGxpc3RzX2VxdWFsICgmbGlzdDEsICZjb3B5MSkpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDIsICZjb3B5Mik7CisgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkyKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QyLCAmY29weTIpKTsKKworICAvKiBOb3cgdGVzdCBjb3B5aW5nIGVtcHR5IGxpc3RzICovCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5Mik7CisgIAorICAvKiBiYWQgcG9pbnRlcnMsIGJlY2F1c2UgdGhleSBhcmUgYWxsb3dlZCBpbiB0aGUgY29weSBkZXN0ICovCisgIGNvcHkxID0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKDB4MzQyMjM0KTsKKyAgY29weTIgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMjMpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDEsICZjb3B5MSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkxKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QxLCAmY29weTEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY29weSAoJmxpc3QyLCAmY29weTIpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgdmVyaWZ5X2xpc3QgKCZjb3B5Mik7CisgIF9kYnVzX2Fzc2VydCAobGlzdHNfZXF1YWwgKCZsaXN0MiwgJmNvcHkyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiBpbnNlcnRfYWZ0ZXIgb24gZW1wdHkgbGlzdCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisKKyAgLyogaW5zZXJ0aW5nIGFmdGVyIGZpcnN0IGVsZW1lbnQgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZsaXN0MSwgbGlzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMSkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworCisgIC8qIGluc2VydGluZyBhdCB0aGUgZW5kICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmbGlzdDEsIGxpc3QxLT5uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKworICAvKiB1c2luZyBpbnNlcnRfYWZ0ZXIgdG8gcHJlcGVuZCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKC0xKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworCisgIC8qIHVzaW5nIHJlbW92ZV9sYXN0ICovCisgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSICgyKSk7CisgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSICgxKSk7CisgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSICgzKSk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMikpOworICAKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbGlzdC5oIGIvZGJ1cy9kYnVzLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzUwYTBkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWxpc3QuaApAQCAtMCwwICsxLDEyNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxpc3QuaCBHZW5lcmljIGxpbmtlZCBsaXN0IHV0aWxpdHkgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTElTVF9ICisjZGVmaW5lIERCVVNfTElTVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworc3RydWN0IERCdXNMaXN0Cit7CisgIERCdXNMaXN0ICpwcmV2OyAvKio8IFByZXZpb3VzIGxpc3Qgbm9kZS4gKi8KKyAgREJ1c0xpc3QgKm5leHQ7IC8qKjwgTmV4dCBsaXN0IG5vZGUuICovCisgIHZvaWQgICAgICpkYXRhOyAvKio8IERhdGEgc3RvcmVkIGF0IHRoaXMgZWxlbWVudC4gKi8KK307CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2FwcGVuZCAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X3ByZXBlbmQgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2luc2VydF9iZWZvcmUgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYmVmb3JlX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmJlZm9yZV90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmsgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICphZnRlcl90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfZmluZF9sYXN0ICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0xpc3QqICAgX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzTGlzdCogICBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCogICAgICAgX2RidXNfbGlzdF9nZXRfZmlyc3QgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICBfZGJ1c19saXN0X3BvcF9maXJzdCAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfcG9wX2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0xpc3QqICAgX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2NvcHkgICAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGVzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfYWxsb2NfbGluayAgICAgICAgICh2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgICAgICAgICAgKERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X3VubGluayAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKKworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2xpc3RfZm9yZWFjaCAoREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKTsKKworI2RlZmluZSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsobGlzdCwgbGluaykgKChsaW5rKS0+bmV4dCA9PSAqKGxpc3QpID8gTlVMTCA6IChsaW5rKS0+bmV4dCkKKyNkZWZpbmUgX2RidXNfbGlzdF9nZXRfcHJldl9saW5rKGxpc3QsIGxpbmspICgobGluaykgPT0gKihsaXN0KSA/IE5VTEwgOiAobGluayktPnByZXYpCisKKy8qIGlmIERCVVNfRU5BQkxFX1NUQVRTICovCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X2dldF9zdGF0cyAgICAgICAgICAoZGJ1c191aW50MzJfdCAqaW5fdXNlX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYWNyb3MuaCBiL2RidXMvZGJ1cy1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJkOTExCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hY3Jvcy5oCkBAIC0wLDAgKzEsMjE5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFjcm9zLmggIGdlbmVyaWMgbWFjcm9zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfTUFDUk9TX0gKKyNkZWZpbmUgREJVU19NQUNST1NfSAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgREJVU19CRUdJTl9ERUNMUyAgZXh0ZXJuICJDIiB7CisjICBkZWZpbmUgREJVU19FTkRfREVDTFMgICAgfQorI2Vsc2UKKyMgIGRlZmluZSBEQlVTX0JFR0lOX0RFQ0xTCisjICBkZWZpbmUgREJVU19FTkRfREVDTFMKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyMgIGRlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorIyAgZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgIGRlZmluZSBOVUxMICAgICAgICAoMEwpCisjICBlbHNlIC8qICFfX2NwbHVzcGx1cyAqLworIyAgICBkZWZpbmUgTlVMTCAgICAgICAgKCh2b2lkKikgMCkKKyMgIGVuZGlmIC8qICFfX2NwbHVzcGx1cyAqLworI2VuZGlmCisKKyNpZiAgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpCisjICBkZWZpbmUgREJVU19ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTMwMCkKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorI2Vsc2UKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDgpCisjICBkZWZpbmUgX0RCVVNfR05VQ19FWFRFTlNJT04gX19leHRlbnNpb25fXworI2Vsc2UKKyMgIGRlZmluZSBfREJVU19HTlVDX0VYVEVOU0lPTgorI2VuZGlmCisKKyNpZiAgICAgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gNCkKKyNkZWZpbmUgX0RCVVNfR05VQ19QUklOVEYoIGZvcm1hdF9pZHgsIGFyZ19pZHggKSAgICBcCisgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIGZvcm1hdF9pZHgsIGFyZ19pZHgpKSkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZGVmaW5lIF9EQlVTX0dOVUNfVU5VU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlICAgLyogIV9fR05VQ19fICovCisjZGVmaW5lIF9EQlVTX0dOVUNfUFJJTlRGKCBmb3JtYXRfaWR4LCBhcmdfaWR4ICkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTgorI2RlZmluZSBfREJVU19HTlVDX1VOVVNFRAorI2VuZGlmICAvKiAhX19HTlVDX18gKi8KKworI2lmICAgIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NikKKyNkZWZpbmUgREJVU19NQUxMT0MgICAgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2Vsc2UKKyNkZWZpbmUgREJVU19NQUxMT0MKKyNlbmRpZgorCisjaWYgICAgIChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4KSkpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRTIoeCx5KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4LHkpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KQorI2RlZmluZSBEQlVTX0FMTE9DX1NJWkUyKHgseSkKKyNlbmRpZgorCisjaWYgICAgKF9fR05VQ19fID4gMykgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKKyNkZWZpbmUgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKKyNlbHNlCisjZGVmaW5lIF9EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUCisjZW5kaWYKKworLyoqIEBkZWYgX0RCVVNfR05VQ19QUklOVEYKKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgcHJpbnRmIGZvcm1hdCBzdHJpbmdzCisgKi8KKy8qKiBAZGVmIF9EQlVTX0dOVUNfTk9SRVRVUk4KKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgZnVuY3Rpb25zIHRoYXQgbmV2ZXIgcmV0dXJuLCBzdWNoIGFzIF9kYnVzX2Fib3J0KCkKKyAqLworLyoqIEBkZWYgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQKKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgZnVuY3Rpb25zIHdob3NlIHJlc3VsdCBtdXN0IGJlIHVzZWQKKyAqLworCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNNYWNyb3MgVXRpbGl0eSBtYWNyb3MKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgI1RSVUUsICNGQUxTRSwgI05VTEwsIGFuZCBzbyBvbgorICoKKyAqIFV0aWxpdHkgbWFjcm9zLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfQkVHSU5fREVDTFMKKyAqCisgKiBNYWNybyB1c2VkIHByaW9yIHRvIGRlY2xhcmluZyBmdW5jdGlvbnMgaW4gdGhlIEQtQnVzIGhlYWRlcgorICogZmlsZXMuIEV4cGFuZHMgdG8gImV4dGVybiAiQyIiIHdoZW4gdXNpbmcgYSBDKysgY29tcGlsZXIsCisgKiBhbmQgZXhwYW5kcyB0byBub3RoaW5nIHdoZW4gdXNpbmcgYSBDIGNvbXBpbGVyLgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBEQlVTX0VORF9ERUNMUworICoKKyAqIE1hY3JvIHVzZWQgYWZ0ZXIgZGVjbGFyaW5nIGZ1bmN0aW9ucyBpbiB0aGUgRC1CdXMgaGVhZGVyCisgKiBmaWxlcy4gRXhwYW5kcyB0byAifSIgd2hlbiB1c2luZyBhIEMrKyBjb21waWxlciwKKyAqIGFuZCBleHBhbmRzIHRvIG5vdGhpbmcgd2hlbiB1c2luZyBhIEMgY29tcGlsZXIuCisgKgorICogUGxlYXNlIGRvbid0IHVzZSB0aGlzIGluIHlvdXIgb3duIGNvZGUsIGNvbnNpZGVyIGl0CisgKiBELUJ1cyBpbnRlcm5hbC4KKyAqLworLyoqCisgKiBAZGVmIFRSVUUKKyAqCisgKiBFeHBhbmRzIHRvICIxIgorICovCisvKioKKyAqIEBkZWYgRkFMU0UKKyAqCisgKiBFeHBhbmRzIHRvICIwIgorICovCisvKioKKyAqIEBkZWYgTlVMTAorICoKKyAqIEEgbnVsbCBwb2ludGVyLCBkZWZpbmVkIGFwcHJvcHJpYXRlbHkgZm9yIEMgb3IgQysrLgorICovCisvKioKKyAqIEBkZWYgREJVU19ERVBSRUNBVEVECisgKgorICogVGVsbHMgdGhlIGNvbXBpbGVyIHRvIHdhcm4gYWJvdXQgYSBmdW5jdGlvbiBvciB0eXBlIGlmIGl0J3MgdXNlZC4KKyAqIENvZGUgbWFya2VkIGluIHRoaXMgd2F5IHNob3VsZCBhbHNvIGJlIGVuY2xvc2VkIGluCisgKiBAY29kZQorICogI2lmbmRlZiBEQlVTX0RJU0FCTEVfREVQUkVDQVRFRAorICogIGRlcHJlY2F0ZWQgc3R1ZmYgaGVyZQorICogI2VuZGlmCisgKiBAZW5kY29kZQorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBfREJVU19HTlVDX0VYVEVOU0lPTgorICoKKyAqIFRlbGxzIGdjYyBub3QgdG8gd2FybiBhYm91dCBleHRlbnNpb25zIHRvIHRoZSBDIHN0YW5kYXJkIGluIHRoZQorICogZm9sbG93aW5nIGV4cHJlc3Npb24sIGV2ZW4gaWYgY29tcGlsaW5nIHdpdGggLXBlZGFudGljLiBEbyBub3QgdXNlCisgKiB0aGlzIG1hY3JvIGluIHlvdXIgb3duIGNvZGU7IHBsZWFzZSBjb25zaWRlciBpdCB0byBiZSBpbnRlcm5hbCB0byBsaWJkYnVzLgorICovCisKKy8qCisgKiBAZGVmIERCVVNfRVhQT1JUCisgKgorICogRGVjbGFyZSB0aGUgZm9sbG93aW5nIHN5bWJvbCBhcyBwdWJsaWMuICBUaGlzIGlzIGN1cnJlbnRseSBhIG5vb3Agb24KKyAqIHBsYXRmb3JtcyBvdGhlciB0aGFuIFdpbmRvd3MuCisgKi8KKworI2lmIGRlZmluZWQoREJVU19FWFBPUlQpCisgIC8qIHZhbHVlIGZvcmNlZCBieSBjb21waWxlciBjb21tYW5kIGxpbmUsIGRvbid0IHJlZGVmaW5lICovCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyMgIGlmIGRlZmluZWQoREJVU19TVEFUSUNfQlVJTEQpCisjICBkZWZpbmUgREJVU19FWFBPUlQKKyMgIGVsaWYgZGVmaW5lZChkYnVzXzFfRVhQT1JUUykKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjICBkZWZpbmUgREJVU19FWFBPUlQgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiZGVmYXVsdCIpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfRVhQT1JUCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJVU19QUklWQVRFX0VYUE9SVCkKKyAgLyogdmFsdWUgZm9yY2VkIGJ5IGNvbXBpbGVyIGNvbW1hbmQgbGluZSwgZG9uJ3QgcmVkZWZpbmUgKi8KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorIyAgaWYgZGVmaW5lZChEQlVTX1NUQVRJQ19CVUlMRCkKKyMgICAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgLyogbm8gZGVjb3JhdGlvbiAqLworIyAgZWxpZiBkZWZpbmVkKGRidXNfMV9FWFBPUlRTKQorIyAgICBkZWZpbmUgREJVU19QUklWQVRFX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorIyAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiZGVmYXVsdCIpKSkKKyNlbHNlCisjICBkZWZpbmUgREJVU19QUklWQVRFX0VYUE9SVCAvKiBubyBkZWNvcmF0aW9uICovCisjZW5kaWYKKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBEQlVTX01BQ1JPU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFpbmxvb3AuYyBiL2RidXMvZGJ1cy1tYWlubG9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzM2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFpbmxvb3AuYwpAQCAtMCwwICsxLDkxNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1haW5sb29wLmMgIE1haW4gbG9vcCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IMKpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1haW5sb29wLmgiCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNvY2tldC1zZXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworI2RlZmluZSBNQUlOTE9PUF9TUEVXIDAKKworc3RydWN0IERCdXNMb29wCit7CisgIGludCByZWZjb3VudDsKKyAgLyoqIERCdXNQb2xsYWJsZSA9PiBkYnVzX21hbGxvYydkIERCdXNMaXN0ICoqIG9mIHJlZmVyZW5jZXMgdG8gREJ1c1dhdGNoICovCisgIERCdXNIYXNoVGFibGUgKndhdGNoZXM7CisgIERCdXNTb2NrZXRTZXQgKnNvY2tldF9zZXQ7CisgIERCdXNMaXN0ICp0aW1lb3V0czsKKyAgaW50IGNhbGxiYWNrX2xpc3Rfc2VyaWFsOworICBpbnQgd2F0Y2hfY291bnQ7CisgIGludCB0aW1lb3V0X2NvdW50OworICBpbnQgZGVwdGg7IC8qKjwgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBydW5zICovCisgIERCdXNMaXN0ICpuZWVkX2Rpc3BhdGNoOworICAvKiogVFJVRSBpZiB3ZSB3aWxsIHNraXAgYSB3YXRjaCBuZXh0IHRpbWUgYmVjYXVzZSBpdCB3YXMgT09NOyBiZWNvbWVzCisgICAqIEZBTFNFIGJldHdlZW4gcG9sbGluZywgYW5kIGRlYWxpbmcgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcG9sbCAqLworICB1bnNpZ25lZCBvb21fd2F0Y2hfcGVuZGluZyA6IDE7Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzVGltZW91dCAqdGltZW91dDsKKyAgbG9uZyBsYXN0X3R2X3NlYzsKKyAgbG9uZyBsYXN0X3R2X3VzZWM7Cit9IFRpbWVvdXRDYWxsYmFjazsKKworI2RlZmluZSBUSU1FT1VUX0NBTExCQUNLKGNhbGxiYWNrKSAoKFRpbWVvdXRDYWxsYmFjayopY2FsbGJhY2spCisKK3N0YXRpYyBUaW1lb3V0Q2FsbGJhY2sqCit0aW1lb3V0X2NhbGxiYWNrX25ldyAoREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCkKK3sKKyAgVGltZW91dENhbGxiYWNrICpjYjsKKworICBjYiA9IGRidXNfbmV3IChUaW1lb3V0Q2FsbGJhY2ssIDEpOworICBpZiAoY2IgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjYi0+dGltZW91dCA9IHRpbWVvdXQ7CisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmNiLT5sYXN0X3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2ItPmxhc3RfdHZfdXNlYyk7CisgIHJldHVybiBjYjsKK30KKworc3RhdGljIHZvaWQKK3RpbWVvdXRfY2FsbGJhY2tfZnJlZSAoVGltZW91dENhbGxiYWNrICpjYikKK3sKKyAgZGJ1c19mcmVlIChjYik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3dhdGNoX3RhYmxlX2VudHJ5ICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqKndhdGNoZXMgPSBkYXRhOworICBEQnVzV2F0Y2ggKndhdGNoOworCisgIC8qIERCdXNIYXNoVGFibGUgc29tZXRpbWVzIGNhbGxzIGZyZWVfZnVuY3Rpb24oTlVMTCkgZXZlbiBpZiB5b3UgbmV2ZXIKKyAgICogaGF2ZSBOVUxMIGFzIGEgdmFsdWUgKi8KKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yICh3YXRjaCA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICh3YXRjaGVzKTsKKyAgICAgIHdhdGNoICE9IE5VTEw7CisgICAgICB3YXRjaCA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICh3YXRjaGVzKSkKKyAgICB7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKCp3YXRjaGVzID09IE5VTEwpOworICBkYnVzX2ZyZWUgKHdhdGNoZXMpOworfQorCitEQnVzTG9vcCoKK19kYnVzX2xvb3BfbmV3ICh2b2lkKQoreworICBEQnVzTG9vcCAqbG9vcDsKKworICBsb29wID0gZGJ1c19uZXcwIChEQnVzTG9vcCwgMSk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbG9vcC0+d2F0Y2hlcyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfUE9MTEFCTEUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV93YXRjaF90YWJsZV9lbnRyeSk7CisKKyAgbG9vcC0+c29ja2V0X3NldCA9IF9kYnVzX3NvY2tldF9zZXRfbmV3ICgwKTsKKworICBpZiAobG9vcC0+d2F0Y2hlcyA9PSBOVUxMIHx8IGxvb3AtPnNvY2tldF9zZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobG9vcC0+d2F0Y2hlcyAhPSBOVUxMKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKworICAgICAgaWYgKGxvb3AtPnNvY2tldF9zZXQgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfc29ja2V0X3NldF9mcmVlIChsb29wLT5zb2NrZXRfc2V0KTsKKworICAgICAgZGJ1c19mcmVlIChsb29wKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsb29wLT5yZWZjb3VudCA9IDE7CisKKyAgcmV0dXJuIGxvb3A7Cit9CisKK0RCdXNMb29wICoKK19kYnVzX2xvb3BfcmVmIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb29wICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxvb3AtPnJlZmNvdW50ID4gMCk7CisKKyAgbG9vcC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gbG9vcDsKK30KKwordm9pZAorX2RidXNfbG9vcF91bnJlZiAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5yZWZjb3VudCA+IDApOworCisgIGxvb3AtPnJlZmNvdW50IC09IDE7CisgIGlmIChsb29wLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHdoaWxlIChsb29wLT5uZWVkX2Rpc3BhdGNoKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKyAgICAgIF9kYnVzX3NvY2tldF9zZXRfZnJlZSAobG9vcC0+c29ja2V0X3NldCk7CisgICAgICBkYnVzX2ZyZWUgKGxvb3ApOworICAgIH0KK30KKworc3RhdGljIERCdXNMaXN0ICoqCitlbnN1cmVfd2F0Y2hfdGFibGVfZW50cnkgKERCdXNMb29wICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgZmQpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKworICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhdGNoZXMgPSBkYnVzX25ldzAgKERCdXNMaXN0ICosIDEpOworCisgICAgICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gd2F0Y2hlczsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQsIHdhdGNoZXMpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlICh3YXRjaGVzKTsKKyAgICAgICAgICB3YXRjaGVzID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gd2F0Y2hlczsKK30KKworc3RhdGljIHZvaWQKK2N1bGxfd2F0Y2hlc19mb3JfaW52YWxpZF9mZCAoREJ1c0xvb3AgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgIGZkKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0xpc3QgKip3YXRjaGVzOworCisgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIHJlcXVlc3QsIHNvY2tldCBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIG5vdCBvcGVuXG4iLAorICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKGZkKSk7CisgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQpOworCisgIGlmICh3YXRjaGVzICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAod2F0Y2hlcyk7CisgICAgICAgICAgbGluayAhPSBOVUxMOworICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHdhdGNoZXMsIGxpbmspKQorICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChsaW5rLT5kYXRhKTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnY193YXRjaF90YWJsZV9lbnRyeSAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKip3YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkKQoreworICAvKiBJZiB3YXRjaGVzIGlzIGFscmVhZHkgTlVMTCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gKi8KKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogV2UgY2FuJ3QgR0MgaGFzaCB0YWJsZSBlbnRyaWVzIGlmIHRoZXkncmUgbm9uLWVtcHR5IGxpc3RzICovCisgIGlmICgqd2F0Y2hlcyAhPSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3JlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKip3YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgZmQpCit7CisgIERCdXNMaXN0ICpsaW5rOworICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworICBkYnVzX2Jvb2xfdCBpbnRlcmVzdGVkID0gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19wb2xsYWJsZV9pc192YWxpZCAoZmQpKTsKKworICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQpOworCisgIC8qIHdlIGFsbG9jYXRlZCB0aGlzIGluIHRoZSBmaXJzdCBfZGJ1c19sb29wX2FkZF93YXRjaCBmb3IgdGhlIGZkLCBhbmQga2VlcAorICAgKiBpdCB1bnRpbCB0aGVyZSBhcmUgbm9uZSBsZWZ0ICovCisgIF9kYnVzX2Fzc2VydCAod2F0Y2hlcyAhPSBOVUxMKTsKKworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICh3YXRjaGVzKTsKKyAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHdhdGNoZXMsIGxpbmspKQorICAgIHsKKyAgICAgIGlmIChkYnVzX3dhdGNoX2dldF9lbmFibGVkIChsaW5rLT5kYXRhKSAmJgorICAgICAgICAgICFfZGJ1c193YXRjaF9nZXRfb29tX2xhc3RfdGltZSAobGluay0+ZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyB8PSBkYnVzX3dhdGNoX2dldF9mbGFncyAobGluay0+ZGF0YSk7CisgICAgICAgICAgaW50ZXJlc3RlZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGludGVyZXN0ZWQpCisgICAgX2RidXNfc29ja2V0X3NldF9lbmFibGUgKGxvb3AtPnNvY2tldF9zZXQsIGZkLCBmbGFncyk7CisgIGVsc2UKKyAgICBfZGJ1c19zb2NrZXRfc2V0X2Rpc2FibGUgKGxvb3AtPnNvY2tldF9zZXQsIGZkKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfYWRkX3dhdGNoIChEQnVzTG9vcCAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgREJ1c1BvbGxhYmxlIGZkOworICBEQnVzTGlzdCAqKndhdGNoZXM7CisKKyAgZmQgPSBfZGJ1c193YXRjaF9nZXRfcG9sbGFibGUgKHdhdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19wb2xsYWJsZV9pc192YWxpZCAoZmQpKTsKKworICB3YXRjaGVzID0gZW5zdXJlX3dhdGNoX3RhYmxlX2VudHJ5IChsb29wLCBmZCk7CisKKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAod2F0Y2hlcywgX2RidXNfd2F0Y2hfcmVmICh3YXRjaCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICBnY193YXRjaF90YWJsZV9lbnRyeSAobG9vcCwgd2F0Y2hlcywgZmQpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKHdhdGNoZXMpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc29ja2V0X3NldF9hZGQgKGxvb3AtPnNvY2tldF9zZXQsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c193YXRjaF9nZXRfZmxhZ3MgKHdhdGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKHdhdGNoKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHdlJ3JlIG1vZGlmeWluZywgbm90IGFkZGluZywgd2hpY2ggY2FuJ3QgZmFpbCB3aXRoIE9PTSAqLworICAgICAgcmVmcmVzaF93YXRjaGVzX2Zvcl9mZCAobG9vcCwgd2F0Y2hlcywgZmQpOworICAgIH0KKworICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICBsb29wLT53YXRjaF9jb3VudCArPSAxOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKERCdXNMb29wICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICp3YXRjaCkKK3sKKyAgcmVmcmVzaF93YXRjaGVzX2Zvcl9mZCAobG9vcCwgTlVMTCwgX2RidXNfd2F0Y2hfZ2V0X3BvbGxhYmxlICh3YXRjaCkpOworfQorCit2b2lkCitfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoREJ1c0xvb3AgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICp3YXRjaCkKK3sKKyAgREJ1c0xpc3QgKip3YXRjaGVzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c1BvbGxhYmxlIGZkOworCisgIC8qIFRoaXMgcmVsaWVzIG9uIHBlb3BsZSByZW1vdmluZyB3YXRjaGVzIGJlZm9yZSB0aGV5IGludmFsaWRhdGUgdGhlbSwKKyAgICogd2hpY2ggaGFzIGJlZW4gc2FmZSBzaW5jZSBmZC5vICMzMzMzNiB3YXMgZml4ZWQuIEFzc2VydCBhYm91dCBpdAorICAgKiBzbyB3ZSBkb24ndCByZWdyZXNzLiAqLworICBmZCA9IF9kYnVzX3dhdGNoX2dldF9wb2xsYWJsZSAod2F0Y2gpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkIChmZCkpOworCisgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQpOworCisgIGlmICh3YXRjaGVzICE9IE5VTEwpCisgICAgeworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKTsKKyAgICAgICAgICBEQnVzV2F0Y2ggKnRoaXMgPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgaWYgKHRoaXMgPT0gd2F0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHdhdGNoZXMsIGxpbmspOworICAgICAgICAgICAgICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICAgICAgICAgICAgICBsb29wLT53YXRjaF9jb3VudCAtPSAxOworICAgICAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAodGhpcyk7CisKKyAgICAgICAgICAgICAgLyogaWYgdGhhdCB3YXMgdGhlIGxhc3Qgd2F0Y2ggZm9yIHRoYXQgZmQsIGRyb3AgdGhlIGhhc2ggdGFibGUKKyAgICAgICAgICAgICAgICogZW50cnksIGFuZCBzdG9wIHJlc2VydmluZyBzcGFjZSBmb3IgaXQgaW4gdGhlIHNvY2tldCBzZXQgKi8KKyAgICAgICAgICAgICAgaWYgKGdjX3dhdGNoX3RhYmxlX2VudHJ5IChsb29wLCB3YXRjaGVzLCBmZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfc29ja2V0X3NldF9yZW1vdmUgKGxvb3AtPnNvY2tldF9zZXQsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICB9CisgICAgIH0KKworICBfZGJ1c193YXJuICgiY291bGQgbm90IGZpbmQgd2F0Y2ggJXAgdG8gcmVtb3ZlXG4iLCB3YXRjaCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2FkZF90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpCit7CisgIFRpbWVvdXRDYWxsYmFjayAqdGNiOworCisgIHRjYiA9IHRpbWVvdXRfY2FsbGJhY2tfbmV3ICh0aW1lb3V0KTsKKyAgaWYgKHRjYiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfbGlzdF9hcHBlbmQgKCZsb29wLT50aW1lb3V0cywgdGNiKSkKKyAgICB7CisgICAgICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICAgICAgbG9vcC0+dGltZW91dF9jb3VudCArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRpbWVvdXRfY2FsbGJhY2tfZnJlZSAodGNiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoREJ1c0xvb3AgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+dGltZW91dHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbG9vcC0+dGltZW91dHMsIGxpbmspOworICAgICAgVGltZW91dENhbGxiYWNrICp0aGlzID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHRoaXMtPnRpbWVvdXQgPT0gdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsb29wLT50aW1lb3V0cywgbGluayk7CisgICAgICAgICAgbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgKz0gMTsKKyAgICAgICAgICBsb29wLT50aW1lb3V0X2NvdW50IC09IDE7CisgICAgICAgICAgdGltZW91dF9jYWxsYmFja19mcmVlICh0aGlzKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfd2FybiAoImNvdWxkIG5vdCBmaW5kIHRpbWVvdXQgJXAgdG8gcmVtb3ZlXG4iLCB0aW1lb3V0KTsKK30KKworLyogQ29udm9sdXRpb25zIGZyb20gR0xpYiwgdGhlcmUgcmVhbGx5IG11c3QgYmUgYSBiZXR0ZXIgd2F5CisgKiB0byBkbyB0aGlzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3RpbWVvdXQgKGxvbmcgICAgICAgICAgICB0dl9zZWMsCisgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgdHZfdXNlYywKKyAgICAgICAgICAgICAgIFRpbWVvdXRDYWxsYmFjayAqdGNiLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICp0aW1lb3V0KQoreworICBsb25nIHNlY19yZW1haW5pbmc7CisgIGxvbmcgbXNlY19yZW1haW5pbmc7CisgIGxvbmcgZXhwaXJhdGlvbl90dl9zZWM7CisgIGxvbmcgZXhwaXJhdGlvbl90dl91c2VjOworICBsb25nIGludGVydmFsX3NlY29uZHM7CisgIGxvbmcgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzOworICBpbnQgaW50ZXJ2YWw7CisKKyAgLyogSSdtIHByZXR0eSBzdXJlIHRoaXMgZnVuY3Rpb24gY291bGQgc3VjayAoYSBsb3QpIGxlc3MgKi8KKyAgCisgIGludGVydmFsID0gZGJ1c190aW1lb3V0X2dldF9pbnRlcnZhbCAodGNiLT50aW1lb3V0KTsKKyAgCisgIGludGVydmFsX3NlY29uZHMgPSBpbnRlcnZhbCAvIDEwMDBMOworICBpbnRlcnZhbF9taWxsaXNlY29uZHMgPSBpbnRlcnZhbCAlIDEwMDBMOworICAKKyAgZXhwaXJhdGlvbl90dl9zZWMgPSB0Y2ItPmxhc3RfdHZfc2VjICsgaW50ZXJ2YWxfc2Vjb25kczsKKyAgZXhwaXJhdGlvbl90dl91c2VjID0gdGNiLT5sYXN0X3R2X3VzZWMgKyBpbnRlcnZhbF9taWxsaXNlY29uZHMgKiAxMDAwOworICBpZiAoZXhwaXJhdGlvbl90dl91c2VjID49IDEwMDAwMDApCisgICAgeworICAgICAgZXhwaXJhdGlvbl90dl91c2VjIC09IDEwMDAwMDA7CisgICAgICBleHBpcmF0aW9uX3R2X3NlYyArPSAxOworICAgIH0KKyAgCisgIHNlY19yZW1haW5pbmcgPSBleHBpcmF0aW9uX3R2X3NlYyAtIHR2X3NlYzsKKyAgbXNlY19yZW1haW5pbmcgPSAoZXhwaXJhdGlvbl90dl91c2VjIC0gdHZfdXNlYykgLyAxMDAwTDsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIkludGVydmFsIGlzICVsZCBzZWNvbmRzICVsZCBtc2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIk5vdyBpcyAgJWx1IHNlY29uZHMgJWx1IHVzZWNzXG4iLAorICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworICBfZGJ1c192ZXJib3NlICgiTGFzdCBpcyAlbHUgc2Vjb25kcyAlbHUgdXNlY3NcbiIsCisgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl9zZWMsIHRjYi0+bGFzdF90dl91c2VjKTsKKyAgX2RidXNfdmVyYm9zZSAoIkV4cCBpcyAgJWx1IHNlY29uZHMgJWx1IHVzZWNzXG4iLAorICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R2X3NlYywgZXhwaXJhdGlvbl90dl91c2VjKTsKKyAgX2RidXNfdmVyYm9zZSAoIlByZS1jb3JyZWN0aW9uLCBzZWNfcmVtYWluaW5nICVsZCBtc2VjX3JlbWFpbmluZyAlbGRcbiIsCisgICAgICAgICAgICAgICAgIHNlY19yZW1haW5pbmcsIG1zZWNfcmVtYWluaW5nKTsKKyNlbmRpZgorICAKKyAgLyogV2UgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHJhdGhlciBjb252b2x1dGVkIGZhc2hpb24gdG8gZGVhbCB3aXRoCisgICAqIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBpbnRlZ3JhbCB0eXBlIGJpZyBlbm91Z2ggdG8gaG9sZAorICAgKiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdGltZXZhbHMgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgaWYgKHNlY19yZW1haW5pbmcgPCAwIHx8IChzZWNfcmVtYWluaW5nID09IDAgJiYgbXNlY19yZW1haW5pbmcgPCAwKSkKKyAgICB7CisgICAgICAqdGltZW91dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG1zZWNfcmVtYWluaW5nIDwgMCkKKwl7CisJICBtc2VjX3JlbWFpbmluZyArPSAxMDAwOworCSAgc2VjX3JlbWFpbmluZyAtPSAxOworCX0KKworICAgICAgaWYgKHNlY19yZW1haW5pbmcgPiAoX0RCVVNfSU5UX01BWCAvIDEwMDApIHx8CisgICAgICAgICAgbXNlY19yZW1haW5pbmcgPiBfREJVU19JTlRfTUFYKQorICAgICAgICAqdGltZW91dCA9IF9EQlVTX0lOVF9NQVg7CisgICAgICBlbHNlCisgICAgICAgICp0aW1lb3V0ID0gc2VjX3JlbWFpbmluZyAqIDEwMDAgKyBtc2VjX3JlbWFpbmluZzsgICAgICAgIAorICAgIH0KKworICBpZiAoKnRpbWVvdXQgPiBpbnRlcnZhbCkKKyAgICB7CisgICAgICAvKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgcHJvYmFibHkgbW92ZWQgYmFja3dhcmQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTeXN0ZW0gY2xvY2sgc2V0IGJhY2t3YXJkISBSZXNldHRpbmcgdGltZW91dC5cbiIpOworICAgICAgCisgICAgICB0Y2ItPmxhc3RfdHZfc2VjID0gdHZfc2VjOworICAgICAgdGNiLT5sYXN0X3R2X3VzZWMgPSB0dl91c2VjOworCisgICAgICAqdGltZW91dCA9IGludGVydmFsOworICAgIH0KKyAgCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGV4cGlyZXMgaW4gJWQgbWlsbGlzZWNvbmRzXG4iLCAqdGltZW91dCk7CisjZW5kaWYKKyAgCisgIHJldHVybiAqdGltZW91dCA9PSAwOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9vcF9kaXNwYXRjaCAoREJ1c0xvb3AgKmxvb3ApCit7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCIgICVkIGNvbm5lY3Rpb25zIHRvIGRpc3BhdGNoXG4iLCBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsb29wLT5uZWVkX2Rpc3BhdGNoKSk7CisjZW5kaWYKKyAgCisgIGlmIChsb29wLT5uZWVkX2Rpc3BhdGNoID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyBuZXh0OgorICB3aGlsZSAobG9vcC0+bmVlZF9kaXNwYXRjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZsb29wLT5uZWVkX2Rpc3BhdGNoKTsKKyAgICAgIAorICAgICAgd2hpbGUgKFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICAgICAgICAgIAorICAgICAgICAgIHN0YXR1cyA9IGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoc3RhdHVzID09IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpZiAoX2RidXNfbGlzdF9hcHBlbmQgKCZsb29wLT5uZWVkX2Rpc3BhdGNoLCBjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyogUmV0dXJucyBUUlVFIGlmIHdlIGludm9rZWQgYW55IHRpbWVvdXRzIG9yIGhhdmUgcmVhZHkgZmlsZQorICogZGVzY3JpcHRvcnMsIHdoaWNoIGlzIGp1c3QgdXNlZCBpbiB0ZXN0IGNvZGUgYXMgYSBkZWJ1ZyBoYWNrCisgKi8KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfaXRlcmF0ZSAoREJ1c0xvb3AgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIGJsb2NrKQoreyAgCisjZGVmaW5lIE5fU1RBQ0tfREVTQ1JJUFRPUlMgNjQKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzU29ja2V0RXZlbnQgcmVhZHlfZmRzW05fU1RBQ0tfREVTQ1JJUFRPUlNdOworICBpbnQgaTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBuX3JlYWR5OworICBpbnQgaW5pdGlhbF9zZXJpYWw7CisgIGxvbmcgdGltZW91dDsKKyAgaW50IG9yaWdfZGVwdGg7CisKKyAgcmV0dmFsID0gRkFMU0U7ICAgICAgCisKKyAgb3JpZ19kZXB0aCA9IGxvb3AtPmRlcHRoOworICAKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCJJdGVyYXRpb24gYmxvY2s9JWQgZGVwdGg9JWQgdGltZW91dF9jb3VudD0lZCB3YXRjaF9jb3VudD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgYmxvY2ssIGxvb3AtPmRlcHRoLCBsb29wLT50aW1lb3V0X2NvdW50LCBsb29wLT53YXRjaF9jb3VudCk7CisjZW5kaWYKKworICBpZiAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChsb29wLT53YXRjaGVzKSA9PSAwICYmCisgICAgICBsb29wLT50aW1lb3V0cyA9PSBOVUxMKQorICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgdGltZW91dCA9IC0xOworICBpZiAobG9vcC0+dGltZW91dF9jb3VudCA+IDApCisgICAgeworICAgICAgbG9uZyB0dl9zZWM7CisgICAgICBsb25nIHR2X3VzZWM7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxvb3AtPnRpbWVvdXRzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPnRpbWVvdXRzLCBsaW5rKTsKKyAgICAgICAgICBUaW1lb3V0Q2FsbGJhY2sgKnRjYiA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICBpZiAoZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICh0Y2ItPnRpbWVvdXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgbXNlY3NfcmVtYWluaW5nOworCisgICAgICAgICAgICAgIGNoZWNrX3RpbWVvdXQgKHR2X3NlYywgdHZfdXNlYywgdGNiLCAmbXNlY3NfcmVtYWluaW5nKTsKKworICAgICAgICAgICAgICBpZiAodGltZW91dCA8IDApCisgICAgICAgICAgICAgICAgdGltZW91dCA9IG1zZWNzX3JlbWFpbmluZzsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBNSU4gKG1zZWNzX3JlbWFpbmluZywgdGltZW91dCk7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHRpbWVvdXQgYWRkZWQsICVkIHJlbWFpbmluZywgYWdncmVnYXRlIHRpbWVvdXQgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc19yZW1haW5pbmcsIHRpbWVvdXQpOworI2VuZGlmCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHRpbWVvdXQgPj0gMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsgLyogaXQncyBub3QgZ29pbmcgdG8gZ2V0IHNob3J0ZXIuLi4gKi8KKyAgICAgICAgICAgIH0KKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBza2lwcGluZyBkaXNhYmxlZCB0aW1lb3V0XG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE5ldmVyIGJsb2NrIGlmIHdlIGhhdmUgc3R1ZmYgdG8gZGlzcGF0Y2ggKi8KKyAgaWYgKCFibG9jayB8fCBsb29wLT5uZWVkX2Rpc3BhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgdGltZW91dCA9IDA7CisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBpcyAwIGFzIHdlIGFyZW4ndCBibG9ja2luZ1xuIik7CisjZW5kaWYKKyAgICB9CisKKyAgLyogaWYgYSB3YXRjaCB3YXMgT09NIGxhc3QgdGltZSwgZG9uJ3Qgd2FpdCBsb25nZXIgdGhhbiB0aGUgT09NCisgICAqIHdhaXQgdG8gcmUtZW5hYmxlIGl0CisgICAqLworICBpZiAobG9vcC0+b29tX3dhdGNoX3BlbmRpbmcpCisgICAgdGltZW91dCA9IE1JTiAodGltZW91dCwgX2RidXNfZ2V0X29vbV93YWl0ICgpKTsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIiAgcG9sbGluZyBvbiAlZCBkZXNjcmlwdG9ycyB0aW1lb3V0ICVsZFxuIiwgX0RCVVNfTl9FTEVNRU5UUyAocmVhZHlfZmRzKSwgdGltZW91dCk7CisjZW5kaWYKKworICBuX3JlYWR5ID0gX2RidXNfc29ja2V0X3NldF9wb2xsIChsb29wLT5zb2NrZXRfc2V0LCByZWFkeV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKHJlYWR5X2ZkcyksIHRpbWVvdXQpOworCisgIC8qIHJlLWVuYWJsZSBhbnkgd2F0Y2hlcyB3ZSBza2lwcGVkIHRoaXMgdGltZSAqLworICBpZiAobG9vcC0+b29tX3dhdGNoX3BlbmRpbmcpCisgICAgeworICAgICAgREJ1c0hhc2hJdGVyIGhhc2hfaXRlcjsKKworICAgICAgbG9vcC0+b29tX3dhdGNoX3BlbmRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGxvb3AtPndhdGNoZXMsICZoYXNoX2l0ZXIpOworCisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZoYXNoX2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKip3YXRjaGVzOworICAgICAgICAgIERCdXNQb2xsYWJsZSBmZDsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBjaGFuZ2VkOworCisgICAgICAgICAgY2hhbmdlZCA9IEZBTFNFOworICAgICAgICAgIGZkID0gX2RidXNfaGFzaF9pdGVyX2dldF9wb2xsYWJsZV9rZXkgKCZoYXNoX2l0ZXIpOworICAgICAgICAgIHdhdGNoZXMgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaGFzaF9pdGVyKTsKKworICAgICAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgICAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHdhdGNoZXMsIGxpbmspKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoID0gbGluay0+ZGF0YTsKKworICAgICAgICAgICAgICBpZiAoX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgKHdhdGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c193YXRjaF9zZXRfb29tX2xhc3RfdGltZSAod2F0Y2gsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjaGFuZ2VkKQorICAgICAgICAgICAgcmVmcmVzaF93YXRjaGVzX2Zvcl9mZCAobG9vcCwgd2F0Y2hlcywgZmQpOworICAgICAgICB9CisKKyAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHVybiBUUlVFIGhlcmUgdG8ga2VlcCB0aGUgbG9vcCBnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHdhdGNoIHdhcyBpbmFjdGl2ZSAqLworICAgIH0KKworICBpbml0aWFsX3NlcmlhbCA9IGxvb3AtPmNhbGxiYWNrX2xpc3Rfc2VyaWFsOworCisgIGlmIChsb29wLT50aW1lb3V0X2NvdW50ID4gMCkKKyAgICB7CisgICAgICBsb25nIHR2X3NlYzsKKyAgICAgIGxvbmcgdHZfdXNlYzsKKworICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgICAgIC8qIEl0J2QgYmUgbmljZSB0byBhdm9pZCB0aGlzIE8obikgdGhpbmd5IGhlcmUgKi8KKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+dGltZW91dHMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbG9vcC0+dGltZW91dHMsIGxpbmspOworICAgICAgICAgIFRpbWVvdXRDYWxsYmFjayAqdGNiID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGlmIChpbml0aWFsX3NlcmlhbCAhPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAobG9vcC0+ZGVwdGggIT0gb3JpZ19kZXB0aCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAoZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICh0Y2ItPnRpbWVvdXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgbXNlY3NfcmVtYWluaW5nOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKGNoZWNrX3RpbWVvdXQgKHR2X3NlYywgdHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjYiwgJm1zZWNzX3JlbWFpbmluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogU2F2ZSBsYXN0IGNhbGxiYWNrIHRpbWUgYW5kIGZpcmUgdGhpcyB0aW1lb3V0ICovCisgICAgICAgICAgICAgICAgICB0Y2ItPmxhc3RfdHZfc2VjID0gdHZfc2VjOworICAgICAgICAgICAgICAgICAgdGNiLT5sYXN0X3R2X3VzZWMgPSB0dl91c2VjOworCisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgaW52b2tpbmcgdGltZW91dFxuIik7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgLyogY2FuIHRoZW9yZXRpY2FsbHkgcmV0dXJuIEZBTFNFIG9uIE9PTSwgYnV0IHdlIGp1c3QKKyAgICAgICAgICAgICAgICAgICAqIGxldCBpdCBmaXJlIGFnYWluIGxhdGVyIC0gaW4gcHJhY3RpY2UgdGhhdCdzIHdoYXQKKyAgICAgICAgICAgICAgICAgICAqIGV2ZXJ5IHdyYXBwZXIgY2FsbGJhY2sgaW4gZGJ1cy1kYWVtb24gdXNlZCB0byBkbyAqLworICAgICAgICAgICAgICAgICAgZGJ1c190aW1lb3V0X2hhbmRsZSAodGNiLT50aW1lb3V0KTsKKworICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBoYXMgbm90IGV4cGlyZWRcbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNraXBwaW5nIGludm9jYXRpb24gb2YgZGlzYWJsZWQgdGltZW91dFxuIik7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgIGlmIChuX3JlYWR5ID4gMCkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9yZWFkeTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKip3YXRjaGVzOworICAgICAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgICAgIHVuc2lnbmVkIGludCBjb25kaXRpb247CisgICAgICAgICAgZGJ1c19ib29sX3QgYW55X29vbTsKKworICAgICAgICAgIC8qIEZJWE1FIEkgdGhpbmsgdGhpcyAicmVzdGFydCBpZiB3ZSBjaGFuZ2UgdGhlIHdhdGNoZXMiCisgICAgICAgICAgICogYXBwcm9hY2ggY291bGQgcmVzdWx0IGluIHN0YXJ2aW5nIHdhdGNoZXMKKyAgICAgICAgICAgKiB0b3dhcmQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoaW5pdGlhbF9zZXJpYWwgIT0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwpCisgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworCisgICAgICAgICAgaWYgKGxvb3AtPmRlcHRoICE9IG9yaWdfZGVwdGgpCisgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChyZWFkeV9mZHNbaV0uZmxhZ3MgIT0gMCk7CisKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKHJlYWR5X2Zkc1tpXS5mbGFncyAmIF9EQlVTX1dBVENIX05WQUwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdWxsX3dhdGNoZXNfZm9yX2ludmFsaWRfZmQgKGxvb3AsIHJlYWR5X2Zkc1tpXS5mZCk7CisgICAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25kaXRpb24gPSByZWFkeV9mZHNbaV0uZmxhZ3M7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgoY29uZGl0aW9uICYgX0RCVVNfV0FUQ0hfTlZBTCkgPT0gMCk7CisKKyAgICAgICAgICAvKiBjb25kaXRpb24gbWF5IHN0aWxsIGJlIDAgaWYgd2UgZ290IHNvbWUKKyAgICAgICAgICAgKiB3ZWlyZCBQT0xMRk9PIHRoaW5nIGxpa2UgUE9MTFdSQkFORAorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChjb25kaXRpb24gPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgd2F0Y2hlcyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3BvbGxhYmxlIChsb29wLT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZmRzW2ldLmZkKTsKKworICAgICAgICAgIGlmICh3YXRjaGVzID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGFueV9vb20gPSBGQUxTRTsKKworICAgICAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgICAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgICAgICAgIGxpbmsgPSBuZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoID0gbGluay0+ZGF0YTsKKworICAgICAgICAgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKTsKKworICAgICAgICAgICAgICBpZiAoZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAod2F0Y2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IG9vbTsKKworICAgICAgICAgICAgICAgICAgb29tID0gIWRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKKworICAgICAgICAgICAgICAgICAgaWYgKG9vbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX3NldF9vb21fbGFzdF90aW1lICh3YXRjaCwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICAgbG9vcC0+b29tX3dhdGNoX3BlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgIGFueV9vb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBJbnZva2VkIHdhdGNoLCBvb20gPSAlZFxuIiwgb29tKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKworICAgICAgICAgICAgICAgICAgLyogV2UgcmUtY2hlY2sgdGhpcyBldmVyeSB0aW1lLCBpbiBjYXNlIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICogYWRkZWQvcmVtb3ZlZCB3YXRjaGVzLCB3aGljaCBtaWdodCBtYWtlIG91ciBwb3NpdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICogdGhlIGxpbmtlZCBsaXN0IGludmFsaWQuIFNlZSB0aGUgRklYTUUgYWJvdmUuICovCisgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbF9zZXJpYWwgIT0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgICBsb29wLT5kZXB0aCAhPSBvcmlnX2RlcHRoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueV9vb20pCisgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3dhdGNoZXNfZm9yX2ZkIChsb29wLCBOVUxMLCByZWFkeV9mZHNbaV0uZmQpOworCisgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChhbnlfb29tKQorICAgICAgICAgICAgcmVmcmVzaF93YXRjaGVzX2Zvcl9mZCAobG9vcCwgd2F0Y2hlcywgcmVhZHlfZmRzW2ldLmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorIG5leHRfaXRlcmF0aW9uOgorI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIiAgbW92aW5nIHRvIG5leHQgaXRlcmF0aW9uXG4iKTsKKyNlbmRpZgorCisgIGlmIChfZGJ1c19sb29wX2Rpc3BhdGNoIChsb29wKSkKKyAgICByZXR2YWwgPSBUUlVFOworICAKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXR1cm5pbmcgJWRcbiIsIHJldHZhbCk7CisjZW5kaWYKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfcnVuIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgaW50IG91cl9leGl0X2RlcHRoOworCisgIF9kYnVzX2Fzc2VydCAobG9vcC0+ZGVwdGggPj0gMCk7CisgIAorICBfZGJ1c19sb29wX3JlZiAobG9vcCk7CisgIAorICBvdXJfZXhpdF9kZXB0aCA9IGxvb3AtPmRlcHRoOworICBsb29wLT5kZXB0aCArPSAxOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nIG1haW4gbG9vcCwgZGVwdGggJWQgLT4gJWRcbiIsCisgICAgICAgICAgICAgICAgIGxvb3AtPmRlcHRoIC0gMSwgbG9vcC0+ZGVwdGgpOworICAKKyAgd2hpbGUgKGxvb3AtPmRlcHRoICE9IG91cl9leGl0X2RlcHRoKQorICAgIF9kYnVzX2xvb3BfaXRlcmF0ZSAobG9vcCwgVFJVRSk7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfcXVpdCAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcC0+ZGVwdGggPiAwKTsgIAorICAKKyAgbG9vcC0+ZGVwdGggLT0gMTsKKworICBfZGJ1c192ZXJib3NlICgiUXVpdCBtYWluIGxvb3AsIGRlcHRoICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICBsb29wLT5kZXB0aCArIDEsIGxvb3AtPmRlcHRoKTsKK30KKworaW50CitfZGJ1c19nZXRfb29tX3dhaXQgKHZvaWQpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgLyogbWFrZSB0ZXN0cyBnbyBmYXN0ICovCisgIHJldHVybiAwOworI2Vsc2UKKyAgcmV0dXJuIDUwMDsKKyNlbmRpZgorfQorCit2b2lkCitfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJXYWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoX2RidXNfZ2V0X29vbV93YWl0ICgpKTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYWlubG9vcC5oIGIvZGJ1cy9kYnVzLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2Y2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYWlubG9vcC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWlubG9vcC5oICBNYWluIGxvb3AgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUFJTkxPT1BfSAorI2RlZmluZSBEQlVTX01BSU5MT09QX0gKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCit0eXBlZGVmIHN0cnVjdCBEQnVzTG9vcCBEQnVzTG9vcDsKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzV2F0Y2hGdW5jdGlvbikgICAoREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKKworREJ1c0xvb3AqICAgX2RidXNfbG9vcF9uZXcgICAgICAgICAgICAodm9pZCk7CitEQnVzTG9vcCogICBfZGJ1c19sb29wX3JlZiAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfdW5yZWYgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOworZGJ1c19ib29sX3QgX2RidXNfbG9vcF9hZGRfd2F0Y2ggICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICBfZGJ1c19sb29wX3RvZ2dsZV93YXRjaCAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAqd2F0Y2gpOworZGJ1c19ib29sX3QgX2RidXNfbG9vcF9hZGRfdGltZW91dCAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgKnRpbWVvdXQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAqY29ubmVjdGlvbik7CisKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfcnVuICAgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9xdWl0ICAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2l0ZXJhdGUgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgYmxvY2spOworZGJ1c19ib29sX3QgX2RidXNfbG9vcF9kaXNwYXRjaCAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CisKK2ludCAgX2RidXNfZ2V0X29vbV93YWl0ICAgICh2b2lkKTsKK3ZvaWQgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICh2b2lkKTsKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmIC8qIERCVVNfTUFJTkxPT1BfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZlM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYwpAQCAtMCwwICsxLDE5MjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJhc2ljLmMgIE1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciBiYXNpYyAocHJpbWl0aXZlKSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSA0KQorIyBkZWZpbmUgX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCh0eXBlLCBvcCwgdmFsKSBcCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKF9fZXh0ZW5zaW9uX18gX19hbGlnbm9mX18gKHR5cGUpIG9wIHZhbCkKKyNlbHNlCisgIC8qIG5vdCBnY2MsIHNvIHByb2JhYmx5IG5vIGFsaWdub2Ygb3BlcmF0b3I6IGp1c3QgdXNlIGEgbm8tb3Agc3RhdGVtZW50CisgICAqIHRoYXQncyB2YWxpZCBpbiB0aGUgc2FtZSBjb250ZXh0cyAqLworIyBkZWZpbmUgX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCh0eXBlLCBvcCwgdmFsKSBcCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKFRSVUUpCisjZW5kaWYKKworLyogVHJ1ZSBieSBkZWZpbml0aW9uLCBidXQganVzdCBmb3IgY29tcGxldGVuZXNzLi4uICovCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGNoYXIpID09IDEpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoY2hhciwgPT0sIDEpOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGRidXNfaW50MTZfdCkgPT0gMik7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkYnVzX2ludDE2X3QsIDw9LCAyKTsKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c191aW50MTZfdCkgPT0gMik7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkYnVzX3VpbnQxNl90LCA8PSwgMik7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19pbnQzMl90KSA9PSA0KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfaW50MzJfdCwgPD0sIDQpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX3VpbnQzMl90KSA9PSA0KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfdWludDMyX3QsIDw9LCA0KTsKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19ib29sX3QpID09IDQpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c19ib29sX3QsIDw9LCA0KTsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkb3VibGUpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZG91YmxlLCA8PSwgOCk7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19pbnQ2NF90KSA9PSA4KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfaW50NjRfdCwgPD0sIDgpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX3VpbnQ2NF90KSA9PSA4KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfdWludDY0X3QsIDw9LCA4KTsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzQmFzaWNWYWx1ZSkgPj0gOCk7CisvKiBUaGUgYWxpZ25tZW50IG9mIGEgREJ1c0Jhc2ljVmFsdWUgbWlnaHQgY29uY2VpdmFibHkgYmUgPiA4IGJlY2F1c2Ugb2YgdGhlCisgKiBwb2ludGVyLCBzbyB3ZSBkb24ndCBhc3NlcnQgYWJvdXQgaXQgKi8KKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzOEJ5dGVTdHJ1Y3QpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoREJ1czhCeXRlU3RydWN0LCA8PSwgOCk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNYXJzaGFsIG1hcnNoYWxpbmcgYW5kIHVubWFyc2hhbGluZworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBmdW5jdGlvbnMgdG8gbWFyc2hhbC91bm1hcnNoYWwgZGF0YSBmcm9tIHRoZSB3aXJlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGNvbnZlcnRpbmcgcHJpbWl0aXZlIGRhdGEgdHlwZXMgZnJvbQorICogd2lyZSBmb3JtYXQgdG8gbmF0aXZlIG1hY2hpbmUgZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiBBIHNpZ25hdHVyZSBpcyBqdXN0IGEgc3RyaW5nIHdpdGggbXVsdGlwbGUgdHlwZXMgb25lIGFmdGVyIHRoZSBvdGhlci4KKyAqIGZvciBleGFtcGxlIGEgdHlwZSBpcyAiaSIgb3IgIihpaSkiLCBhIHNpZ25hdHVyZSBpcyAiaShpaSkiCisgKiB3aGVyZSBpIGlzIGludCBhbmQgKGlpKSBpcyBzdHJ1Y3QgeyBpbnQ7IGludDsgfQorICoKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQKK3BhY2tfMl9vY3RldHMgKGRidXNfdWludDE2X3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgMikgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50MTZfdCopKGRhdGEpKSA9IERCVVNfVUlOVDE2X1RPX0xFICh2YWx1ZSk7CisgIGVsc2UKKyAgICAqKChkYnVzX3VpbnQxNl90KikoZGF0YSkpID0gREJVU19VSU5UMTZfVE9fQkUgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3BhY2tfNF9vY3RldHMgKGRidXNfdWludDMyX3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgNCkgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50MzJfdCopKGRhdGEpKSA9IERCVVNfVUlOVDMyX1RPX0xFICh2YWx1ZSk7CisgIGVsc2UKKyAgICAqKChkYnVzX3VpbnQzMl90KikoZGF0YSkpID0gREJVU19VSU5UMzJfVE9fQkUgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3BhY2tfOF9vY3RldHMgKERCdXNCYXNpY1ZhbHVlICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgOCkgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50NjRfdCopKGRhdGEpKSA9IERCVVNfVUlOVDY0X1RPX0xFICh2YWx1ZS51NjQpOworICBlbHNlCisgICAgKigoZGJ1c191aW50NjRfdCopKGRhdGEpKSA9IERCVVNfVUlOVDY0X1RPX0JFICh2YWx1ZS51NjQpOworfQorCisvKioKKyAqIFBhY2tzIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIgaW50byBhIGRhdGEgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqLwordm9pZAorX2RidXNfcGFja191aW50MzIgKGRidXNfdWludDMyX3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqZGF0YSkKK3sKKyAgcGFja180X29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc3dhcF84X29jdGV0cyAoREJ1c0Jhc2ljVmFsdWUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB7CisgICAgICB2YWx1ZS0+dTY0ID0gREJVU19VSU5UNjRfU1dBUF9MRV9CRSAodmFsdWUtPnU2NCk7CisgICAgfQorfQorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKKy8qKgorICogVW5wYWNrcyBhIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBkYXRhIHBvaW50ZXIKKyAqCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBUaGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqIEByZXR1cm5zIHRoZSBpbnRlZ2VyCisgKi8KK2RidXNfdWludDE2X3QKK19kYnVzX3VucGFja191aW50MTYgKGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDIpID09IGRhdGEpOworCisgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICByZXR1cm4gREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KilkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKWRhdGEpOworfQorI2VuZGlmIC8qIF9kYnVzX3VucGFja191aW50MTYgKi8KKworI2lmbmRlZiBfZGJ1c191bnBhY2tfdWludDMyCisvKioKKyAqIFVucGFja3MgYSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZGF0YSBwb2ludGVyCisgKgorICogQHBhcmFtIGJ5dGVfb3JkZXIgVGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBwb2ludGVyCisgKiBAcmV0dXJucyB0aGUgaW50ZWdlcgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA0KSA9PSBkYXRhKTsKKworICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgcmV0dXJuIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopZGF0YSk7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KilkYXRhKTsKK30KKyNlbmRpZiAvKiBfZGJ1c191bnBhY2tfdWludDMyICovCisKK3N0YXRpYyB2b2lkCitzZXRfMl9vY3RldHMgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9mZnNldCwgMik7CisKKyAgcGFja18yX29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc2V0XzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvZmZzZXQsIDQpOworCisgIHBhY2tfNF9vY3RldHMgKHZhbHVlLCBieXRlX29yZGVyLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NldF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKQoreworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb2Zmc2V0LCA4KTsKKworICBwYWNrXzhfb2N0ZXRzICh2YWx1ZSwgYnl0ZV9vcmRlciwgZGF0YSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgNCBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbWFyc2hhbGVkIHVuc2lnbmVkCisgKiBpbnRlZ2VyLCByZXBsYWNpbmcgYW55dGhpbmcgZm91bmQgdGhlcmUgcHJldmlvdXNseS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgaW50IHRvCisgKiBAcGFyYW0gcG9zIHRoZSBieXRlIG9mZnNldCB3aGVyZSBpbnQgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICoKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIHNldF80X29jdGV0cyAoc3RyLCBwb3MsIHZhbHVlLCBieXRlX29yZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBleGlzdGluZyBtYXJzaGFsZWQgc3RyaW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQgd2l0aAorICogYSBuZXcgbWFyc2hhbGVkIHN0cmluZy4gVGhlIGdpdmVuIG9mZnNldCBtdXN0IHBvaW50IHRvCisgKiBhbiBleGlzdGluZyBzdHJpbmcgb3IgdGhlIHdyb25nIGxlbmd0aCB3aWxsIGJlIGRlbGV0ZWQKKyAqIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgc3RyaW5nLgorICoKKyAqIE5vdGU6IG5vIGF0dGVtcHQgaXMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHRvIHJlLWFsaWduCisgKiBhbnkgZGF0YSB3aGljaCBoYXMgYmVlbiBhbHJlYWR5IG1hcnNoYWxsZWQgYWZ0ZXIgdGhpcworICogc3RyaW5nLiBVc2Ugd2l0aCBjYXV0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0aGUgbWFyc2hhbGxlZCBzdHJpbmcgdG8KKyAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXJzaGFsZWQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gb2xkX2VuZF9wb3MgcGxhY2UgdG8gc3RvcmUgYnl0ZSBhZnRlciB0aGUgbnVsIGJ5dGUgb2YgdGhlIG9sZCB2YWx1ZQorICogQHBhcmFtIG5ld19lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBuZXcgdmFsdWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpuZXdfZW5kX3BvcykKK3sKKyAgaW50IG9sZF9sZW4sIG5ld19sZW47CisgIERCdXNTdHJpbmcgZHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRzdHIsIHZhbHVlKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpID09ICh1bnNpZ25lZCkgcG9zKTsKKyAgb2xkX2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHBvcywgNCkpOworCisgIG5ld19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmZHN0ciwgMCwgbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgcG9zICsgNCwgb2xkX2xlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoc3RyLCBwb3MsIG5ld19sZW4sIGJ5dGVfb3JkZXIpOworCisgIGlmIChvbGRfZW5kX3BvcykKKyAgICAqb2xkX2VuZF9wb3MgPSBwb3MgKyA0ICsgb2xkX2xlbiArIDE7CisgIGlmIChuZXdfZW5kX3BvcykKKyAgICAqbmV3X2VuZF9wb3MgPSBwb3MgKyA0ICsgbmV3X2xlbiArIDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZXhpc3RpbmcgbWFyc2hhbGVkIHNpZ25hdHVyZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbmV3CisgKiBtYXJzaGFsZWQgc2lnbmF0dXJlLiBTYW1lIGJhc2ljIGlkZWFzIGFzIHNldF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgc2lnbmF0dXJlIHRvCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFyc2hhbGVkIHNpZ25hdHVyZSBsZW5ndGgKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICogQHBhcmFtIG9sZF9lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBvbGQgdmFsdWUKKyAqIEBwYXJhbSBuZXdfZW5kX3BvcyBwbGFjZSB0byBzdG9yZSBieXRlIGFmdGVyIHRoZSBudWwgYnl0ZSBvZiB0aGUgbmV3IHZhbHVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9zaWduYXR1cmUgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqbmV3X2VuZF9wb3MpCit7CisgIGludCBvbGRfbGVuLCBuZXdfbGVuOworICBEQnVzU3RyaW5nIGRzdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkc3RyLCB2YWx1ZSk7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpOworICBuZXdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJmRzdHIsIDAsIG5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcyArIDEsIG9sZF9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCBuZXdfbGVuKTsKKworICBpZiAob2xkX2VuZF9wb3MpCisgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMSArIG9sZF9sZW4gKyAxOworICBpZiAobmV3X2VuZF9wb3MpCisgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMSArIG5ld19sZW4gKyAxOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgYW4gZXhpc3RpbmcgYmFzaWMgdHlwZSB2YWx1ZSB0byBhIG5ldyB2YWx1ZS4KKyAqIEFyZ3VtZW50cyB3b3JrIHRoZSBzYW1lIHdheSBhcyBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGUoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBwb3MgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGFuZCBuZXcgdmFsdWVzCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBmb3IgbWFyc2hhbGluZworICogQHBhcmFtIG9sZF9lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgb2xkIHZhbHVlLCBvciAjTlVMTAorICogQHBhcmFtIG5ld19lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV3IHZhbHVlLCBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKQoreworICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqdnA7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCB2cC0+Ynl0KTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgMik7CisgICAgICBzZXRfMl9vY3RldHMgKHN0ciwgcG9zLCB2cC0+dTE2LCBieXRlX29yZGVyKTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgc2V0XzRfb2N0ZXRzIChzdHIsIHBvcywgdnAtPnUzMiwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA4KTsKKyAgICAgIHNldF84X29jdGV0cyAoc3RyLCBwb3MsICp2cCwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIHNldF9zdHJpbmcgKHN0ciwgcG9zLCB2cC0+c3RyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9lbmRfcG9zLCBuZXdfZW5kX3Bvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gc2V0X3NpZ25hdHVyZSAoc3RyLCBwb3MsIHZwLT5zdHIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2VuZF9wb3MsIG5ld19lbmRfcG9zKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZGVtYXJzaGFsIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbmV3X3BvcyB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zIHRoZSBkZW1hcnNoYWxlZCBpbnRlZ2VyLgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworCisgIGlmIChuZXdfcG9zKQorICAgICpuZXdfcG9zID0gcG9zICsgNDsKKworICBfZGJ1c19hc3NlcnQgKHBvcyArIDQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAKKyAgcmV0dXJuIF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBwb3MpOworfQorCisvKioKKyAqIERlbWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMKKyAqIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgb2YgdGhlIGJhc2ljIHR5cGUuIFNvIGUuZy4KKyAqIGlmIHRoZSBiYXNpYyB0eXBlIGlzICJkb3VibGUiIHRoZW4gdGhlIHBvaW50ZXIgaXMKKyAqIGEgZG91YmxlKiwgYW5kIGlmIGl0J3MgImNoYXIqIiB0aGVuIHRoZSBwb2ludGVyIGlzCisgKiBhICJjaGFyKioiLgorICoKKyAqIEEgdmFsdWUgb2YgdHlwZSAjREJ1c0Jhc2ljVmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsYXJnZSBlbm91Z2ggdG8KKyAqIGhvbGQgYW55IG9mIHRoZSB0eXBlcyB0aGF0IG1heSBiZSByZXR1cm5lZCwgd2hpY2ggaXMgaGFuZHkgaWYgeW91CisgKiBhcmUgdHJ5aW5nIHRvIGRvIHRoaW5ncyBnZW5lcmljYWxseS4gRm9yIGV4YW1wbGUgeW91IGNhbiBwYXNzCisgKiBhIERCdXNCYXNpY1ZhbHVlKiBpbiB0byB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlbiBwYXNzIHRoZSBzYW1lCisgKiBEQnVzQmFzaWNWYWx1ZSogaW4gdG8gX2RidXNfbWFyc2hhbF9iYXNpY190eXBlKCkgaW4gb3JkZXIgdG8KKyAqIG1vdmUgYSB2YWx1ZSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUgdG8gZGVtYXJzaGFsCisgKiBAcGFyYW0gdmFsdWUgcG9pbnRlciB0byByZXR1cm4gdmFsdWUgZGF0YQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBuZXdfcG9zIHBvaW50ZXIgdG8gdXBkYXRlIHdpdGggbmV3IHBvc2l0aW9uLCBvciAjTlVMTAorICoqLwordm9pZAorX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljIChjb25zdCBEQnVzU3RyaW5nICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIGNvbnN0IGNoYXIgKnN0cl9kYXRhOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgc3RyX2RhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgLyogQmVsb3cgd2Ugdm9sYXRpbGUgdHlwZXMgdG8gYXZvaWQgYWxpYXNpbmcgaXNzdWVzOworICAgKiBzZWUgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEzNworICAgKi8KKyAgCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIHsKKyAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnZwID0gdmFsdWU7CisgICAgICAqdnAgPSAodW5zaWduZWQgY2hhcikgX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcyk7CisgICAgICAocG9zKSsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MTZfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDIpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQxNl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MzJfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQzMl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50NjRfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDgpOworICAgICAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgICAgICAqdnAgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcykpOworICAgICAgZWxzZQorICAgICAgICAqdnAgPSAqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcyk7CisgICAgICBwb3MgKz0gODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgdm9sYXRpbGUgY2hhciAqKnZwID0gdmFsdWU7CisKKyAgICAgICAgbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBwb3MsIGJ5dGVfb3JkZXIsICZwb3MpOworCisgICAgICAgICp2cCA9IChjaGFyKikgc3RyX2RhdGEgKyBwb3M7CisKKyAgICAgICAgcG9zICs9IGxlbiArIDE7IC8qIGxlbmd0aCBwbHVzIG51bCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICB2b2xhdGlsZSBjaGFyICoqdnAgPSB2YWx1ZTsKKworICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKyAgICAgICAgcG9zICs9IDE7CisKKyAgICAgICAgKnZwID0gKGNoYXIqKSBzdHJfZGF0YSArIHBvczsKKworICAgICAgICBwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJ0eXBlICVzICVkIG5vdCBhIGJhc2ljIHR5cGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCB0eXBlKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvczsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzJfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MTZfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKHZhbHVlKSA9PSAyKTsKKworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgdmFsdWUgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWx1ZSk7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzJfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICB7CisgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gb3JpZ19sZW4pOworICAgICAgX2RidXNfYXNzZXJ0ICgqcG9zX2FmdGVyIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKHZhbHVlKSA9PSA0KTsKKworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgdmFsdWUgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWx1ZSk7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICB7CisgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gb3JpZ19sZW4pOworICAgICAgX2RidXNfYXNzZXJ0ICgqcG9zX2FmdGVyIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzhfb2N0ZXRzIChEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IG9yaWdfbGVuOworCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAodmFsdWUpID09IDgpOworCisgIHN3YXBfOF9vY3RldHMgKCZ2YWx1ZSwgYnl0ZV9vcmRlcik7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbjsKKworICByZXR1cm4gcmV0dmFsOworfQorCitlbnVtCisgIHsKKyAgICBNQVJTSEFMX0FTX1NUUklORywKKyAgICBNQVJTSEFMX0FTX1NJR05BVFVSRSwKKyAgICBNQVJTSEFMX0FTX0JZVEVfQVJSQVkKKyAgfTsKKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoaW50ICAgICAgICAgICAgICAgICAgbWFyc2hhbF9hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGRhdGFfbGVuLCAvKiBkb2Vzbid0IGluY2x1ZGUgbnVsIGlmIGFueSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBpbnQgcG9zOworICBEQnVzU3RyaW5nIHZhbHVlX3N0cjsKKyAgaW50IHZhbHVlX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8IGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKyAgaWYgKGluc2VydF9hdCA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIF9kYnVzX3dhcm4gKCJpbnNlcnRfYXQgPSAlZCBzdHJpbmcgbGVuID0gJWQgZGF0YV9sZW4gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBpbnNlcnRfYXQsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpLCBkYXRhX2xlbik7CisgIAorICBpZiAobWFyc2hhbF9hcyA9PSBNQVJTSEFMX0FTX0JZVEVfQVJSQVkpCisgICAgdmFsdWVfbGVuID0gZGF0YV9sZW47CisgIGVsc2UKKyAgICB2YWx1ZV9sZW4gPSBkYXRhX2xlbiArIDE7IC8qIHZhbHVlIGhhcyBhIG51bCAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnZhbHVlX3N0ciwgdmFsdWUsIHZhbHVlX2xlbik7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmIChtYXJzaGFsX2FzID09IE1BUlNIQUxfQVNfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9sZW4gPD0gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEgpOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhX2xlbiA8PSAyNTUpOyAvKiBzYW1lIGFzIG1heCBzaWcgbGVuIHJpZ2h0IG5vdyAqLworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBwb3MsIGRhdGFfbGVuKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIHBvcyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghbWFyc2hhbF80X29jdGV0cyAoc3RyLCBwb3MsIGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCAmcG9zKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcykpCisgICAgZ290byBvb207CisKKyNpZiAwCisgIC8qIHRvbyBleHBlbnNpdmUgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHN0ciwgcG9zLCB2YWx1ZV9sZW4pOworI2VuZGlmCisKKyAgcG9zICs9IHZhbHVlX2xlbjsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIC8qIERlbGV0ZSB3aGF0IHdlJ3ZlIGluc2VydGVkICovCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHN0ciwgaW5zZXJ0X2F0LCBwb3MgLSBpbnNlcnRfYXQpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3N0cmluZyAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgcmV0dXJuIG1hcnNoYWxfbGVuX2ZvbGxvd2VkX2J5X2J5dGVzIChNQVJTSEFMX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGluc2VydF9hdCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3NpZ25hdHVyZSAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIHJldHVybiBtYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoTUFSU0hBTF9BU19TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBpbnNlcnRfYXQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUiwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19hZnRlcik7Cit9CisKKy8qKgorICogTWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMgdGhlCisgKiBhZGRyZXNzIG9mIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgYmFzaWMgdHlwZSB2YWx1ZS4KKyAqIFNvIGZvciBleGFtcGxlIGZvciBpbnQzMiBpdCB3aWxsIGJlIGRidXNfaW50MzJfdCosIGFuZAorICogZm9yIHN0cmluZyBpdCB3aWxsIGJlIGNvbnN0IGNoYXIqKi4gVGhpcyBpcyBmb3Igc3ltbWV0cnkKKyAqIHdpdGggX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljKCkgYW5kIHRvIGhhdmUgYSBzaW1wbGUKKyAqIGNvbnNpc3RlbnQgcnVsZS4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBtYXJzaGFsIHRvCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydCB0aGUgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludGVyIHRvIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZwOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBpbnNlcnRfYXQsIHZwLT5ieXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAocG9zX2FmdGVyKQorICAgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfMl9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgcmV0dXJuIG1hcnNoYWxfNF9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTMyICE9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBtYXJzaGFsXzRfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgdnAtPnUzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXJzaGFsXzhfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgKnZwLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gbWFyc2hhbF9zdHJpbmcgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+c3RyLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIG1hcnNoYWxfc2lnbmF0dXJlIChzdHIsIGluc2VydF9hdCwgdnAtPnN0ciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF8xX29jdGV0c19hcnJheSAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyB2YWx1ZV9zdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmdmFsdWVfc3RyLCB2YWx1ZSwgbl9lbGVtZW50cyk7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBwb3MgKz0gbl9lbGVtZW50czsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU3dhcHMgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIHRoZSBvcHBvc2l0ZSBieXRlIG9yZGVyCisgKgorICogQHBhcmFtIGRhdGEgc3RhcnQgb2YgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIGFsaWdubWVudCBzaXplIG9mIGVhY2ggZWxlbWVudAorICovCit2b2lkCitfZGJ1c19zd2FwX2FycmF5ICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgdW5zaWduZWQgY2hhciAqZDsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgYWxpZ25tZW50KSA9PSBkYXRhKTsKKworICAvKiB3ZSB1c2UgY29uc3RfZGF0YSBhbmQgY2FzdCBpdCBvZmYgc28gREJ1c1N0cmluZyBjYW4gYmUgYSBjb25zdCBzdHJpbmcKKyAgICogZm9yIHRoZSB1bml0IHRlc3RzLiBkb24ndCBhc2suCisgICAqLworICBkID0gZGF0YTsKKyAgZW5kID0gZCArIChuX2VsZW1lbnRzICogYWxpZ25tZW50KTsKKyAgCisgIGlmIChhbGlnbm1lbnQgPT0gOCkKKyAgICB7CisgICAgICB3aGlsZSAoZCAhPSBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAqKChkYnVzX3VpbnQ2NF90KilkKSA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDY0X3QqKWQpKTsKKyAgICAgICAgICBkICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKGFsaWdubWVudCA9PSA0KQorICAgIHsKKyAgICAgIHdoaWxlIChkICE9IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICooKGRidXNfdWludDMyX3QqKWQpID0gREJVU19VSU5UMzJfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MzJfdCopZCkpOworICAgICAgICAgIGQgKz0gNDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWxpZ25tZW50ID09IDIpOworICAgICAgCisgICAgICB3aGlsZSAoZCAhPSBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAqKChkYnVzX3VpbnQxNl90KilkKSA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDE2X3QqKWQpKTsKKyAgICAgICAgICBkICs9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzd2FwX2FycmF5IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICBpbnQgICAgICAgICBhcnJheV9zdGFydCwKKyAgICAgICAgICAgIGludCAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICBpbnQgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgYWxpZ25tZW50KQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChhcnJheV9zdGFydCwgYWxpZ25tZW50KSA9PSAodW5zaWduZWQpIGFycmF5X3N0YXJ0KTsKKworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgeworICAgICAgLyogd2UgdXNlIGNvbnN0X2RhdGEgYW5kIGNhc3QgaXQgb2ZmIHNvIERCdXNTdHJpbmcgY2FuIGJlIGEgY29uc3Qgc3RyaW5nCisgICAgICAgKiBmb3IgdGhlIHVuaXQgdGVzdHMuIGRvbid0IGFzay4KKyAgICAgICAqLworICAgICAgX2RidXNfc3dhcF9hcnJheSAoKHVuc2lnbmVkIGNoYXIqKSAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpICsgYXJyYXlfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywgYWxpZ25tZW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGludCBvbGRfc3RyaW5nX2xlbjsKKyAgaW50IGFycmF5X3N0YXJ0OworICBEQnVzU3RyaW5nIHQ7CisgIGludCBsZW5faW5fYnl0ZXM7CisKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzIDw9IERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEggLyBhbGlnbm1lbnQpOworICAKKyAgb2xkX3N0cmluZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBsZW5faW5fYnl0ZXMgPSBuX2VsZW1lbnRzICogYWxpZ25tZW50OworICBhcnJheV9zdGFydCA9IGluc2VydF9hdDsKKyAgCisgIC8qIE5vdGUgdGhhdCB3ZSBkbyBhbGlnbm1lbnQgcGFkZGluZyB1bmNvbmRpdGlvbmFsbHkKKyAgICogZXZlbiBpZiB0aGUgYXJyYXkgaXMgZW1wdHk7IHRoaXMgbWVhbnMgdGhhdAorICAgKiBwYWRkaW5nICsgbGVuIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAqIGluIHRoZSBhcnJheS4KKyAgICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAoc3RyLCAmYXJyYXlfc3RhcnQsIGFsaWdubWVudCkpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuX2luX2J5dGVzKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBhcnJheV9zdGFydCkpCisgICAgZ290byBlcnJvcjsKKworICBzd2FwX2FycmF5IChzdHIsIGFycmF5X3N0YXJ0LCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCBhbGlnbm1lbnQpOworCisgIGlmIChwb3NfYWZ0ZXIpCisgICAgKnBvc19hZnRlciA9IGFycmF5X3N0YXJ0ICsgbGVuX2luX2J5dGVzOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gb2xkX3N0cmluZ19sZW4pOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBNYXJzaGFscyBhIGJsb2NrIG9mIHZhbHVlcyBvZiBmaXhlZC1sZW5ndGggdHlwZSBhbGwgYXQgb25jZSwgYXMgYW4KKyAqIG9wdGltaXphdGlvbi4gIGRidXNfdHlwZV9pc19maXhlZCgpIHJldHVybnMgI1RSVUUgZm9yIGZpeGVkLWxlbmd0aAorICogdHlwZXMsIHdoaWNoIGFyZSB0aGUgYmFzaWMgdHlwZXMgbWludXMgdGhlIHN0cmluZy1saWtlIHR5cGVzLgorICoKKyAqIFRoZSB2YWx1ZSBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGFkZGRyZXNzIG9mIGFuCisgKiBhcnJheSwgc28gZS5nLiAiY29uc3QgZGJ1c191aW50MzJfdCoqIgorICoKKyAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIG1hcnNoYWwgdG8KKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0IHRoZSB2YWx1ZQorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0eXBlIG9mIGFycmF5IGVsZW1lbnRzCisgKiBAcGFyYW0gdmFsdWUgYWRkcmVzcyBvZiBhbiBhcnJheSB0byBtYXJzaGFsCisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gYnl0ZV9vcmRlciBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zX2FmdGVyICNOVUxMIG9yIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgdHlwZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICoqLworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfd3JpdGVfZml4ZWRfbXVsdGkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGNvbnN0IHZvaWQqIHZwID0gKihjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKXZhbHVlOworICAKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpOworICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPj0gMCk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nICVkIGVsZW1lbnRzIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLCBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbWVudF90eXBlKSk7CisjZW5kaWYKKyAgCisgIHN3aXRjaCAoZWxlbWVudF90eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgcmV0dXJuIG1hcnNoYWxfMV9vY3RldHNfYXJyYXkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHJldHVybiBtYXJzaGFsX2ZpeGVkX211bHRpIChzdHIsIGluc2VydF9hdCwgdnAsIG5fZWxlbWVudHMsIGJ5dGVfb3JkZXIsIDIsIHBvc19hZnRlcik7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBtYXJzaGFsX2ZpeGVkX211bHRpIChzdHIsIGluc2VydF9hdCwgdnAsIG5fZWxlbWVudHMsIGJ5dGVfb3JkZXIsIDQsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgOCwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vbiBmaXhlZCB0eXBlIGluIGFycmF5IHdyaXRlIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogU2tpcHMgb3ZlciBhIGJhc2ljLXR5cGVkIHZhbHVlLCByZXBvcnRpbmcgdGhlIGZvbGxvd2luZyBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGF0YQorICogQHBhcmFtIHR5cGUgdHlwZSBvZiB2YWx1ZSB0byByZWFkCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIHBvcyBwb2ludGVyIHRvIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcsCisgKiAgICAgICAgICAgIHVwZGF0ZWQgb24gcmV0dXJuIHRvIG5ldyBwb3NpdGlvbgorICoqLwordm9pZAorX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljIChjb25zdCBEQnVzU3RyaW5nICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqcG9zKQoreworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworICAKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgKCpwb3MpKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICAqcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKCpwb3MsIDIpOworICAgICAgKnBvcyArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgICpwb3MgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgNCk7CisgICAgICAqcG9zICs9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgKnBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA4KTsKKyAgICAgICpwb3MgKz0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBsZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsICpwb3MsIGJ5dGVfb3JkZXIsIHBvcyk7CisgICAgICAgIAorICAgICAgICAqcG9zICs9IGxlbiArIDE7IC8qIGxlbmd0aCBwbHVzIG51bCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCAqcG9zKTsKKworICAgICAgICAqcG9zICs9IGxlbiArIDI7IC8qIGxlbmd0aCBieXRlIHBsdXMgbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfd2FybiAoInR5cGUgJXMgbm90IGEgYmFzaWMgdHlwZVxuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlKSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogU2tpcHMgYW4gYXJyYXksIHJldHVybmluZyB0aGUgbmV4dCBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGF0YQorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0aGUgdHlwZSBvZiBhcnJheSBlbGVtZW50cworICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3MgcG9pbnRlciB0byBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLAorICogICAgICAgICAgICB1cGRhdGVkIG9uIHJldHVybiB0byBuZXcgcG9zaXRpb24KKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9za2lwX2FycmF5IChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnBvcykKK3sKKyAgZGJ1c191aW50MzJfdCBhcnJheV9sZW47CisgIGludCBpOworICBpbnQgYWxpZ25tZW50OworCisgIGkgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgNCk7CisKKyAgYXJyYXlfbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBpLCBieXRlX29yZGVyLCAmaSk7CisKKyAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChlbGVtZW50X3R5cGUpOworCisgIGkgPSBfREJVU19BTElHTl9WQUxVRSAoaSwgYWxpZ25tZW50KTsKKworICAqcG9zID0gaSArIGFycmF5X2xlbjsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgZm9yIHRoZSBnaXZlbiB0eXBlOworICogd2lsbCBiZSAxLCA0LCBvciA4LgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSB0aGUgdHlwZQorICogQHJldHVybnMgYWxpZ25tZW50IG9mIDEsIDQsIG9yIDgKKyAqLworaW50CitfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGludCB0eXBlY29kZSkKK3sKKyAgc3dpdGNoICh0eXBlY29kZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICAvKiB0aGlzIHN0dWZmIGlzIDQgc2luY2UgaXQgc3RhcnRzIHdpdGggYSBsZW5ndGggKi8KKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgLyogc3RydWN0IGlzIDggc2luY2UgaXQgY291bGQgY29udGFpbiBhbiA4LWFsaWduZWQgaXRlbQorICAgICAgICogYW5kIGl0J3Mgc2ltcGxlciB0byBqdXN0IGFsd2F5cyBhbGlnbiBzdHJ1Y3RzIHRvIDg7CisgICAgICAgKiB3ZSB3YW50IHRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBhIHN0cnVjdCBvZiBhIGdpdmVuCisgICAgICAgKiB0eXBlIHRvIGJlIHByZWRpY3RhYmxlLCBub3QgbG9jYXRpb24tZGVwZW5kZW50LgorICAgICAgICogRElDVF9FTlRSWSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgc3RydWN0LgorICAgICAgICovCisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICByZXR1cm4gODsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmtub3duIHR5cGVjb2RlIGluIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCgpIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiB0eXBlLgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSB0aGUgdHlwZSB0byBkZXNjcmliZQorICogQHJldHVybnMgYSBjb25zdGFudCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZQorICovCitjb25zdCBjaGFyICoKK19kYnVzX3R5cGVfdG9fc3RyaW5nIChpbnQgdHlwZWNvZGUpCit7CisgIHN3aXRjaCAodHlwZWNvZGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0lOVkFMSUQ6CisgICAgICByZXR1cm4gImludmFsaWQiOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICByZXR1cm4gImJvb2xlYW4iOworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICByZXR1cm4gImJ5dGUiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgcmV0dXJuICJpbnQxNiI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuICJ1aW50MTYiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgcmV0dXJuICJpbnQzMiI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJ1aW50MzIiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJpbnQ2NCI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuICJ1aW50NjQiOyAgICAgIAorICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICByZXR1cm4gIm9iamVjdF9wYXRoIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICByZXR1cm4gInNpZ25hdHVyZSI7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgcmV0dXJuICJzdHJ1Y3QiOworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICByZXR1cm4gImRpY3RfZW50cnkiOworICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgcmV0dXJuICJhcnJheSI7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHJldHVybiAidmFyaWFudCI7CisgICAgY2FzZSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSOgorICAgICAgcmV0dXJuICJiZWdpbl9zdHJ1Y3QiOworICAgIGNhc2UgREJVU19TVFJVQ1RfRU5EX0NIQVI6CisgICAgICByZXR1cm4gImVuZF9zdHJ1Y3QiOworICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVI6CisgICAgICByZXR1cm4gImJlZ2luX2RpY3RfZW50cnkiOworICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOgorICAgICAgcmV0dXJuICJlbmRfZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiAidW5peF9mZCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCisvKioKKyAqIElmIGluIHZlcmJvc2UgbW9kZSwgcHJpbnQgYSBibG9jayBvZiBiaW5hcnkgZGF0YS4KKyAqCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisgKiBAcGFyYW0gb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IGNvdW50aW5nIGZvciBieXRlIGluZGV4ZXMKKyAqLwordm9pZAorX2RidXNfdmVyYm9zZV9ieXRlcyAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCkKK3sKKyAgaW50IGk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFsaWduZWQ7CisKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisKKyAgaWYgKCFfZGJ1c19pc192ZXJib3NlKCkpCisgICAgcmV0dXJuOworCisgIC8qIFByaW50IGJsYW5rcyBvbiBmaXJzdCByb3cgaWYgYXBwcm9wcmlhdGUgKi8KKyAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDQpOworICBpZiAoYWxpZ25lZCA+IGRhdGEpCisgICAgYWxpZ25lZCAtPSA0OworICBfZGJ1c19hc3NlcnQgKGFsaWduZWQgPD0gZGF0YSk7CisKKyAgaWYgKGFsaWduZWQgIT0gZGF0YSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJTRsZFx0JXA6ICIsIC0gKGxvbmcpKGRhdGEgLSBhbGlnbmVkKSwgYWxpZ25lZCk7CisgICAgICB3aGlsZSAoYWxpZ25lZCAhPSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgICAiKTsKKyAgICAgICAgICArK2FsaWduZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogbm93IHByaW50IHRoZSBieXRlcyAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgaWYgKF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA0KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlNGRcdCVwOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIGksICZkYXRhW2ldKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGF0YVtpXSA+PSAzMiAmJgorICAgICAgICAgIGRhdGFbaV0gPD0gMTI2KQorICAgICAgICBfZGJ1c192ZXJib3NlICgiICclYycgIiwgZGF0YVtpXSk7CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIweCVzJXggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA8PSAweGYgPyAiMCIgOiAiIiwgZGF0YVtpXSk7CisKKyAgICAgICsraTsKKworICAgICAgaWYgKF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA0KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpID4gMykKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCRTogJWQgTEU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfQklHX0VORElBTiwgJmRhdGFbaS00XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sICZkYXRhW2ktNF0pKTsKKworICAgICAgICAgIGlmIChpID4gNyAmJgorICAgICAgICAgICAgICBfREJVU19BTElHTl9BRERSRVNTICgmZGF0YVtpXSwgOCkgPT0gJmRhdGFbaV0pCisgICAgICAgICAgICB7CisjaWZkZWYgREJVU19JTlQ2NF9QUklOVEZfTU9ESUZJRVIKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiB1NjQ6IDB4JSIgREJVU19JTlQ2NF9QUklOVEZfTU9ESUZJRVIgIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRidXNfdWludDY0X3QqKSZkYXRhW2ktOF0pOworI2VuZGlmCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZGJsOiAlZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZG91YmxlKikmZGF0YVtpLThdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworfQorCisvKioKKyAqIER1bXAgdGhlIGdpdmVuIHBhcnQgb2YgdGhlIHN0cmluZyB0byB2ZXJib3NlIGxvZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgcmFuZ2UgdG8gZHVtcAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgcmFuZ2UKKyAqLwordm9pZAorX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGNvbnN0IERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IGNoYXIgKmQ7CisgIGludCByZWFsX2xlbjsKKworICByZWFsX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisKKyAgaWYgKHN0YXJ0ID4gcmVhbF9sZW4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgWyVkLCVkKSBpcyBub3QgaW5zaWRlIHN0cmluZyBvZiBsZW5ndGggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdGFydCwgbGVuLCByZWFsX2xlbik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgoc3RhcnQgKyBsZW4pID4gcmVhbF9sZW4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgWyVkLCVkKSBleHRlbmRzIG91dHNpZGUgc3RyaW5nIG9mIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBsZW4sIHJlYWxfbGVuKTsKKyAgICAgIGxlbiA9IHJlYWxfbGVuIC0gc3RhcnQ7CisgICAgfQorCisgIGQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHN0YXJ0LCBsZW4pOworCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKGQsIGxlbiwgc3RhcnQpOworfQorCitzdGF0aWMgaW50CittYXBfdHlwZV9jaGFyX3RvX3R5cGUgKGludCB0KQoreworICBpZiAodCA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKQorICAgIHJldHVybiBEQlVTX1RZUEVfU1RSVUNUOworICBlbHNlIGlmICh0ID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKQorICAgIHJldHVybiBEQlVTX1RZUEVfRElDVF9FTlRSWTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgICAgICBfZGJ1c19hc3NlcnQgKHQgIT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgICAgIHJldHVybiB0OworICAgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCisgKiBhbmQganVzdCBnZXR0aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzaWduYXR1cmUgaXMgdGhhdCB5b3Ugd29uJ3QKKyAqIGdldCBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSLCB5b3UnbGwgZ2V0IERCVVNfVFlQRV9TVFJVQ1QKKyAqIGluc3RlYWQuCisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgY29udGFpbmluZyBzaWduYXR1cmUKKyAqIEBwYXJhbSBwb3Mgd2hlcmUgdGhlIHNpZ25hdHVyZSBzdGFydHMKKyAqIEByZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBzaWduYXR1cmUKKyAqLworaW50CitfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcykKK3sKKyAgcmV0dXJuIG1hcF90eXBlX2NoYXJfdG9fdHlwZSAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcykpOworfQorCisvKioKKyAqIFNpbWlsYXIgdG8gI19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlLCBidXQgb3BlcmF0ZXMKKyAqIG9uIGEgQyBzdHJpbmcgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBzdHIgYSBDIHN0cmluZyBidWZmZXIKKyAqIEBwYXJhbSBwb3Mgd2hlcmUgdGhlIHNpZ25hdHVyZSBzdGFydHMKKyAqIEByZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBzaWduYXR1cmUKKyAqLworaW50CitfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZV9jX3N0ciAoY29uc3QgY2hhciAgICAgICAqc3RyLAorCQkJCSAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gbWFwX3R5cGVfY2hhcl90b190eXBlIChzdHJbcG9zXSk7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKioKKyAqIFJlYWRzIGEgYmxvY2sgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHZhbHVlcywgYXMgYW4gb3B0aW1pemF0aW9uCisgKiB2cy4gcmVhZGluZyBlYWNoIG9uZSBpbmRpdmlkdWFsbHkgaW50byBhIG5ldyBidWZmZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkYXRhIGluLXBsYWNlOyBpdCBkb2VzIG5vdCBtYWtlIGEgY29weSwKKyAqIGFuZCBpdCBkb2VzIG5vdCBzd2FwIHRoZSBieXRlcy4KKyAqCisgKiBJZiB5b3UgYXNrIGZvciAjREJVU19UWVBFX0RPVUJMRSB5b3Ugd2lsbCBnZXQgYSAiY29uc3QgZG91YmxlKiIgYmFjaworICogYW5kIHRoZSAidmFsdWUiIGFyZ3VtZW50IHNob3VsZCBiZSBhICJjb25zdCBkb3VibGUqKiIgYW5kIHNvIG9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBwb3MgcG9zaXRpb24gdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2YgYXJyYXkgZWxlbWVudHMKKyAqIEBwYXJhbSB2YWx1ZSBwbGFjZSB0byByZXR1cm4gdGhlIGFycmF5CisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIsIHVzZWQgdG8gcmVhZCB0aGUgYXJyYXkgbGVuZ3RoCisgKiBAcGFyYW0gbmV3X3BvcyAjTlVMTCBvciBsb2NhdGlvbiB0byBzdG9yZSBhIHBvc2l0aW9uIGFmdGVyIHRoZSBlbGVtZW50cworICovCit2b2lkCitfZGJ1c19tYXJzaGFsX3JlYWRfZml4ZWRfbXVsdGkgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbmV3X3BvcykKK3sKKyAgaW50IGFycmF5X2xlbjsKKyAgaW50IGFsaWdubWVudDsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljIChlbGVtZW50X3R5cGUpKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoInJlYWRpbmcgJWQgZWxlbWVudHMgb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKyNlbmRpZgorICAKKyAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChlbGVtZW50X3R5cGUpOworCisgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIGFsaWdubWVudCk7CisgIAorICBhcnJheV9sZW4gPSBuX2VsZW1lbnRzICogYWxpZ25tZW50OworCisgICooY29uc3QgREJ1c0Jhc2ljVmFsdWUqKikgdmFsdWUgPSAodm9pZCopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgcG9zLCBhcnJheV9sZW4pOworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvcyArIGFycmF5X2xlbjsKK30KKworc3RhdGljIHZvaWQKK3N3YXBfdGVzdF9hcnJheSAodm9pZCAqYXJyYXksCisgICAgICAgICAgICAgICAgIGludCAgIGxlbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgaW50ICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgYWxpZ25tZW50KQoreworICBEQnVzU3RyaW5nIHQ7CisKKyAgaWYgKGFsaWdubWVudCA9PSAxKQorICAgIHJldHVybjsKKyAgCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnQsIGFycmF5LCBsZW5fYnl0ZXMpOworICBzd2FwX2FycmF5ICgmdCwgMCwgbGVuX2J5dGVzIC8gYWxpZ25tZW50LCBieXRlX29yZGVyLCBhbGlnbm1lbnQpOworfQorCisjZGVmaW5lIE1BUlNIQUxfQkFTSUModHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZfIyN0eXBlbmFtZSA9IGxpdGVyYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICghX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoJnN0ciwgcG9zLCBEQlVTX1RZUEVfIyN0eXBlbmFtZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl8jI3R5cGVuYW1lLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBOVUxMKSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9CQVNJQyh0eXBlbmFtZSwgYnl0ZV9vcmRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJnN0ciwgcG9zLCBEQlVTX1RZUEVfIyN0eXBlbmFtZSwgJnZfIyN0eXBlbmFtZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCAmcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBERU1BUlNIQUxfQkFTSUNfQU5EX0NIRUNLKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVNQVJTSEFMX0JBU0lDICh0eXBlbmFtZSwgYnl0ZV9vcmRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsaXRlcmFsICE9IHZfIyN0eXBlbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3RyLCBkdW1wX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIGR1bXBfcG9zKTsgICAgICAgIFwKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGVtYXJzaGFsZWQgd3JvbmcgdmFsdWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BUlNIQUxfVEVTVCh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNQVJTSEFMX0JBU0lDICh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCk7ICAgICAgICAgICAgICBcCisgICAgZHVtcF9wb3MgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9CQVNJQ19BTkRfQ0hFQ0sgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1RfU1RSQ01QKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfQkFTSUMgKHR5cGVuYW1lLCBieXRlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcCAobGl0ZXJhbCwgdl8jI3R5cGVuYW1lKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzdHIsIGR1bXBfcG9zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSBkdW1wX3Bvcyk7ICAgICAgXAorICAgICAgICBfZGJ1c193YXJuICgibGl0ZXJhbCAnJXMnXG52YWx1ZSAgJyVzJ1xuIiwgbGl0ZXJhbCwgdl8jI3R5cGVuYW1lKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGVtYXJzaGFsZWQgd3JvbmcgdmFsdWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BUlNIQUxfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGludCBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZfVUlOVDMyID0gc2l6ZW9mKGxpdGVyYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICghX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoJnN0ciwgcG9zLCBEQlVTX1RZUEVfVUlOVDMyLCAmdl9VSU5UMzIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgJm5leHQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZfQVJSQVlfIyN0eXBlbmFtZSA9IGxpdGVyYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICghX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoJnN0ciwgbmV4dCwgREJVU19UWVBFXyMjdHlwZW5hbWUsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQVJSQVlfIyN0eXBlbmFtZSwgX0RCVVNfTl9FTEVNRU5UUyhsaXRlcmFsKSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9GSVhFRF9BUlJBWSh0eXBlbmFtZSwgYnl0ZV9vcmRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChEQlVTX1RZUEVfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdl9VSU5UMzIgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICgmc3RyLCBkdW1wX3BvcywgYnl0ZV9vcmRlciwgJm5leHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICgmc3RyLCBuZXh0LCBEQlVTX1RZUEVfIyN0eXBlbmFtZSwgJnZfQVJSQVlfIyN0eXBlbmFtZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1VJTlQzMi9hbGlnbm1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dhcF90ZXN0X2FycmF5ICh2X0FSUkFZXyMjdHlwZW5hbWUsIHZfVUlOVDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBhbGlnbm1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVNQVJTSEFMX0ZJWEVEX0FSUkFZX0FORF9DSEVDSyh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9GSVhFRF9BUlJBWSAodHlwZW5hbWUsIGJ5dGVfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWVtY21wIChsaXRlcmFsLCB2X0FSUkFZXyMjdHlwZW5hbWUsIHNpemVvZiAobGl0ZXJhbCkpICE9IDApICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiTUFSU0hBTEVEIERBVEFcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzdHIsIGR1bXBfcG9zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIGR1bXBfcG9zKTsgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiTElURVJBTCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlcyAoKGNoYXIqKWxpdGVyYWwsIHNpemVvZiAobGl0ZXJhbCksIDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSRUFEIERBVEFcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzICgoY2hhciopdl9BUlJBWV8jI3R5cGVuYW1lLCBzaXplb2YgKGxpdGVyYWwpLCAwKTsgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGVtYXJzaGFsZWQgd3JvbmcgZml4ZWQgYXJyYXkgdmFsdWUiKTsgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFSU0hBTF9GSVhFRF9BUlJBWSAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgICAgICAgICAgICAgICBcCisgICAgZHVtcF9wb3MgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVNQVJTSEFMX0ZJWEVEX0FSUkFZX0FORF9DSEVDSyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgICBcCisgIH0gd2hpbGUgKDApCisKK2RidXNfYm9vbF90CitfZGJ1c19tYXJzaGFsX3Rlc3QgKHZvaWQpCit7CisgIGludCBhbGlnbm1lbnQ7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgcG9zLCBkdW1wX3BvczsKKyAgdW5zaWduZWQgY2hhciBhcnJheTFbNV0gPSB7IDMsIDQsIDAsIDEsIDkgfTsKKyAgZGJ1c19pbnQxNl90IGFycmF5MlszXSA9IHsgMTI0LCA0NTcsIDc4MCB9OworICBkYnVzX2ludDMyX3QgYXJyYXk0WzNdID0geyAxMjMsIDQ1NiwgNzg5IH07CisgIGRidXNfaW50NjRfdCBhcnJheThbM10gPSB7IERCVVNfSU5UNjRfQ09OU1RBTlQgKDB4MTIzZmZmZmZmZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UICgweDQ1NmZmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVCAoMHg3ODlmZmZmZmZmZikgfTsKKyAgZGJ1c19pbnQ2NF90ICp2X0FSUkFZX0lOVDY0OworICB1bnNpZ25lZCBjaGFyICp2X0FSUkFZX0JZVEU7CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCAqdl9BUlJBWV9VSU5UMTY7CisgIGRidXNfaW50MzJfdCAqdl9BUlJBWV9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCAqdl9BUlJBWV9VSU5UMzI7CisgIERCdXNTdHJpbmcgdDsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkb3VibGUgdF9ET1VCTEU7CisgIGRidXNfaW50MTZfdCB2X0lOVDE2OworICBkYnVzX3VpbnQxNl90IHZfVUlOVDE2OworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBjb25zdCBjaGFyICp2X1NJR05BVFVSRTsKKyAgY29uc3QgY2hhciAqdl9PQkpFQ1RfUEFUSDsKKyAgaW50IGJ5dGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgcG9zID0gMDsKKworICAvKiBNYXJzaGFsIGRvdWJsZXMgKi8KKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0JJR19FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19CSUdfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgMTYgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDUpOworICBNQVJTSEFMX1RFU1QgKElOVDE2LCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NSk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCAxNiBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQpOworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19MSVRUTEVfRU5ESUFOLCAweDEyMzQpOworICAKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDU2NzgpOworICBNQVJTSEFMX1RFU1QgKElOVDMyLCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQ1Njc4KTsKKyAgTUFSU0hBTF9URVNUIChVSU5UMzIsIERCVVNfTElUVExFX0VORElBTiwgMHgxMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQ2NCwgREJVU19CSUdfRU5ESUFOLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisgIE1BUlNIQUxfVEVTVCAoSU5UNjQsIERCVVNfTElUVExFX0VORElBTiwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIC8qIE1hcnNoYWwgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChVSU5UNjQsIERCVVNfQklHX0VORElBTiwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworICBNQVJTSEFMX1RFU1QgKFVJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgLyogTWFyc2hhbCBieXRlICovCisgIE1BUlNIQUxfVEVTVCAoQllURSwgREJVU19CSUdfRU5ESUFOLCA1KTsKKyAgTUFSU0hBTF9URVNUIChCWVRFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDUpOworCisgIC8qIE1hcnNoYWwgYWxsIHBvc3NpYmxlIGJvb2xzISAqLworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfTElUVExFX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgVFJVRSk7CisgIE1BUlNIQUxfVEVTVCAoQk9PTEVBTiwgREJVU19MSVRUTEVfRU5ESUFOLCBUUlVFKTsKKworICAvKiBNYXJzaGFsIHN0cmluZ3MgKi8KKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0xJVFRMRV9FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICJUaGlzIGlzIHRoZSBkYnVzIHRlc3Qgc3RyaW5nIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgREJVU19MSVRUTEVfRU5ESUFOLCAiVGhpcyBpcyB0aGUgZGJ1cyB0ZXN0IHN0cmluZyIpOworCisgIC8qIG9iamVjdCBwYXRocyAqLworICBNQVJTSEFMX1RFU1RfU1RSQ01QIChPQkpFQ1RfUEFUSCwgREJVU19CSUdfRU5ESUFOLCAiL2EvYi9jIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKE9CSkVDVF9QQVRILCBEQlVTX0xJVFRMRV9FTkRJQU4sICIvYS9iL2MiKTsKKworICAvKiBzaWduYXR1cmVzICovCisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19MSVRUTEVfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiYShpaSkiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU0lHTkFUVVJFLCBEQlVTX0xJVFRMRV9FTkRJQU4sICJhKGlpKSIpOworCisgIC8qIEFycmF5cyAqLworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDE2LCBEQlVTX0JJR19FTkRJQU4sIGFycmF5Mik7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfQklHX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMzIsIERCVVNfQklHX0VORElBTiwgYXJyYXk0KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoQllURSwgREJVU19CSUdfRU5ESUFOLCBhcnJheTEpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKEJZVEUsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkxKTsKKyAgCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UNjQsIERCVVNfQklHX0VORElBTiwgYXJyYXk4KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTgpOworCisjaWYgMAorCisgIC8qCisgICAqIEZJWE1FIHJlc3RvcmUgdGhlIHNldC9wYWNrIHRlc3RzCisgICAqLworCisgIC8qIHNldC9wYWNrIDY0LWJpdCBpbnRlZ2VycyAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgOCk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSAqLworICBfZGJ1c19tYXJzaGFsX3NldF9pbnQ2NCAoJnN0ciwgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDY0ICgmc3RyLCBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBsaXR0bGUgcGFjayAqLworICBfZGJ1c19wYWNrX2ludDY0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSwKKyAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDY0IChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGJpZyBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50NjQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpLAorICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50NjQgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDY0ICgmc3RyLCBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDY0IChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGJpZyAqLworICBfZGJ1c19tYXJzaGFsX3NldF91aW50NjQgKCZzdHIsIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50NjQgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgbGl0dGxlIHBhY2sgKi8KKyAgX2RidXNfcGFja191aW50NjQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpLAorICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnIHBhY2sgKi8KKyAgX2RidXNfcGFja191aW50NjQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpLAorICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50NjQgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2V0L3BhY2sgMzItYml0IGludGVnZXJzICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCA0KTsKKworICAvKiBzaWduZWQgbGl0dGxlICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDMyICgmc3RyLCBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMHgxMjM0NTYpOworCisgIF9kYnVzX2Fzc2VydCAoLTB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGJpZyAqLworICBfZGJ1c19tYXJzaGFsX3NldF9pbnQzMiAoJnN0ciwgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLTB4MTIzNDU2KTsKKworICBfZGJ1c19hc3NlcnQgKC0weDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQzMiAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBsaXR0bGUgcGFjayAqLworICBfZGJ1c19wYWNrX2ludDMyICgtMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnIHBhY2sgKi8KKyAgX2RidXNfcGFja19pbnQzMiAoLTB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoLTB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgbGl0dGxlICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4pOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGJpZyAqLworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOKTsKKworICBfZGJ1c19hc3NlcnQgKDB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQzMiAoMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKDB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQzMiAoMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKDB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworI2VuZGlmIC8qIHNldC9wYWNrIHRlc3RzIGZvciBpbnRlZ2VycyAqLworCisgIC8qIFN0cmluZ3MgaW4tcGxhY2Ugc2V0ICovCisgIGJ5dGVfb3JkZXIgPSBEQlVTX0xJVFRMRV9FTkRJQU47CisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIC8qIEluaXQgYSBzdHJpbmcgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAwKTsKKworICAgICAgLyogcmVzZXQgcG9zIGZvciB0aGUgbWFjcm9zICovCisgICAgICBwb3MgPSAwOworCisgICAgICBNQVJTSEFMX1RFU1RfU1RSQ01QIChTVFJJTkcsIGJ5dGVfb3JkZXIsICJIZWxsbyB3b3JsZCIpOworCisgICAgICAvKiBTZXQgaXQgdG8gc29tZXRoaW5nIGxvbmdlciAqLworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0LCAiSGVsbG8gd29ybGQgZm9vIik7CisKKyAgICAgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdCk7CisgICAgICBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsIE5VTEwsIE5VTEwpOworCisgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKCZzdHIsIDAsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORywgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodl9TVFJJTkcsICJIZWxsbyB3b3JsZCBmb28iKSA9PSAwKTsKKworICAgICAgLyogU2V0IGl0IHRvIHNvbWV0aGluZyBzaG9ydGVyICovCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnQsICJIZWxsbyIpOworCisgICAgICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnQpOworICAgICAgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKCZzdHIsIDAsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HLCBieXRlX29yZGVyLCBOVUxMLCBOVUxMKTsKKyAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2X1NUUklORywgIkhlbGxvIikgPT0gMCk7CisKKyAgICAgIC8qIERvIHRoZSBvdGhlciBieXRlIG9yZGVyICovCisgICAgICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGJ5dGVfb3JkZXIgPSBEQlVTX0JJR19FTkRJQU47CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBDbGVhbiB1cCAqLworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaCBiL2RidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmZjM0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJhc2ljLmggIE1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciBiYXNpYyAocHJpbWl0aXZlKSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfQkFTSUNfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfQkFTSUNfSAorCisjaWZkZWYgSEFWRV9CWVRFU1dBUF9ICisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFyY2gtZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIgREJVU19CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIgREJVU19MSVRUTEVfRU5ESUFOCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQllURVNXQVBfSAorI2RlZmluZSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkgYnN3YXBfMTYodmFsKQorI2RlZmluZSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkgYnN3YXBfMzIodmFsKQorI2Vsc2UgLyogSEFWRV9CWVRFU1dBUF9IICovCisKKyNkZWZpbmUgREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpCSgoZGJ1c191aW50MTZfdCkgKCAgICAgIFwKKyAgICAoZGJ1c191aW50MTZfdCkgKChkYnVzX3VpbnQxNl90KSAodmFsKSA+PiA4KSB8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZGJ1c191aW50MTZfdCkgKChkYnVzX3VpbnQxNl90KSAodmFsKSA8PCA4KSkpCisKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpCSgoZGJ1c191aW50MzJfdCkgKCAgICAgIFwKKyAgICAoKChkYnVzX3VpbnQzMl90KSAodmFsKSAmIChkYnVzX3VpbnQzMl90KSAweDAwMDAwMGZmVSkgPDwgMjQpIHwgICAgIFwKKyAgICAoKChkYnVzX3VpbnQzMl90KSAodmFsKSAmIChkYnVzX3VpbnQzMl90KSAweDAwMDBmZjAwVSkgPDwgIDgpIHwgICAgIFwKKyAgICAoKChkYnVzX3VpbnQzMl90KSAodmFsKSAmIChkYnVzX3VpbnQzMl90KSAweDAwZmYwMDAwVSkgPj4gIDgpIHwgICAgIFwKKyAgICAoKChkYnVzX3VpbnQzMl90KSAodmFsKSAmIChkYnVzX3VpbnQzMl90KSAweGZmMDAwMDAwVSkgPj4gMjQpKSkKKworI2VuZGlmIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjaWZkZWYgSEFWRV9CWVRFU1dBUF9ICisjZGVmaW5lIERCVVNfVUlOVDY0X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKSBic3dhcF82NCh2YWwpCisjZWxzZSAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2RlZmluZSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkJKChkYnVzX3VpbnQ2NF90KSAoICAgICAgICAgICAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDAwMDAwMDBmZikpIDw8IDU2KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDAwMDAwMDBmZjAwKSkgPDwgNDApIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwMDBmZjAwMDApKSA8PCAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDBmZjAwMDAwMCkpIDw8ICA4KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDBmZjAwMDAwMDAwKSkgPj4gIDgpIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDBmZjAwMDAwMDAwMDApKSA+PiAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDBmZjAwMDAwMDAwMDAwMCkpID4+IDQwKSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHhmZjAwMDAwMDAwMDAwMDAwKSkgPj4gNTYpKSkKKworI2VuZGlmIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQxNl9TV0FQX0xFX0JFKHZhbCkgICgoZGJ1c19pbnQxNl90KURCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRSh2YWwpIChEQlVTX1VJTlQzMl9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDMyX1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDMyX3QpREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKworI2RlZmluZSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFKHZhbCkgKERCVVNfVUlOVDY0X1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UNjRfU1dBUF9MRV9CRSh2YWwpICAoKGRidXNfaW50NjRfdClEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisKKyMgIGRlZmluZSBEQlVTX0lOVDE2X1RPX0JFKHZhbCkJKChkYnVzX2ludDE2X3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDE2X1RPX0JFKHZhbCkJKChkYnVzX3VpbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDE2X1RPX0xFKHZhbCkJKERCVVNfSU5UMTZfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19MRSh2YWwpCShEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UMzJfVE9fQkUodmFsKQkoKGRidXNfaW50MzJfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMzJfVE9fQkUodmFsKQkoKGRidXNfdWludDMyX3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UMzJfVE9fTEUodmFsKQkoREJVU19JTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0xFKHZhbCkJKERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQ2NF9UT19CRSh2YWwpCSgoZGJ1c19pbnQ2NF90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19CRSh2YWwpCSgoZGJ1c191aW50NjRfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQ2NF9UT19MRSh2YWwpCShEQlVTX0lOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UNjRfVE9fTEUodmFsKQkoREJVU19VSU5UNjRfU1dBUF9MRV9CRSAodmFsKSkKKworI2Vsc2UgLyogV09SRFNfQklHRU5ESUFOICovCisKKyMgIGRlZmluZSBEQlVTX0lOVDE2X1RPX0xFKHZhbCkJKChkYnVzX2ludDE2X3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDE2X1RPX0xFKHZhbCkJKChkYnVzX3VpbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDE2X1RPX0JFKHZhbCkJKChkYnVzX2ludDE2X3QpIERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMTZfVE9fQkUodmFsKQkoREJVU19VSU5UMTZfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0xFKHZhbCkJKChkYnVzX2ludDMyX3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0xFKHZhbCkJKChkYnVzX3VpbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0JFKHZhbCkJKChkYnVzX2ludDMyX3QpIERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMzJfVE9fQkUodmFsKQkoREJVU19VSU5UMzJfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0xFKHZhbCkJKChkYnVzX2ludDY0X3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDY0X1RPX0xFKHZhbCkJKChkYnVzX3VpbnQ2NF90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0JFKHZhbCkJKChkYnVzX2ludDY0X3QpIERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UNjRfVE9fQkUodmFsKQkoREJVU19VSU5UNjRfU1dBUF9MRV9CRSAodmFsKSkKKyNlbmRpZgorCisvKiBUaGUgdHJhbnNmb3JtYXRpb24gaXMgc3ltbWV0cmljLCBzbyB0aGUgRlJPTSBqdXN0IG1hcHMgdG8gdGhlIFRPLiAqLworI2RlZmluZSBEQlVTX0lOVDE2X0ZST01fTEUodmFsKQkgKERCVVNfSU5UMTZfVE9fTEUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDE2X0ZST01fTEUodmFsKSAoREJVU19VSU5UMTZfVE9fTEUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UMTZfRlJPTV9CRSh2YWwpCSAoREJVU19JTlQxNl9UT19CRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UMTZfRlJPTV9CRSh2YWwpIChEQlVTX1VJTlQxNl9UT19CRSAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQzMl9GUk9NX0xFKHZhbCkJIChEQlVTX0lOVDMyX1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQzMl9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDMyX1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDMyX0ZST01fQkUodmFsKQkgKERCVVNfSU5UMzJfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDMyX0ZST01fQkUodmFsKSAoREJVU19VSU5UMzJfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQ2NF9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UNjRfRlJPTV9MRSh2YWwpIChEQlVTX1VJTlQ2NF9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQ2NF9GUk9NX0JFKHZhbCkJIChEQlVTX0lOVDY0X1RPX0JFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDY0X1RPX0JFICh2YWwpKQorCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorI2RlZmluZSBfZGJ1c191bnBhY2tfdWludDE2KGJ5dGVfb3JkZXIsIGRhdGEpICAgICAgICAgICBcCisgICAoKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pID8gICAgICAgICAgICAgIFwKKyAgICAgREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KikoZGF0YSkpIDogICAgXAorICAgICBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKShkYXRhKSkpCisKKyNkZWZpbmUgX2RidXNfdW5wYWNrX3VpbnQzMihieXRlX29yZGVyLCBkYXRhKSAgICAgICAgICAgXAorICAgKCgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKSA/ICAgICAgICAgICAgICBcCisgICAgIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopKGRhdGEpKSA6ICAgIFwKKyAgICAgREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KikoZGF0YSkpKQorI2VuZGlmCisKKyNpZm5kZWYgX2RidXNfdW5wYWNrX3VpbnQxNgorREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aW50MTZfdCBfZGJ1c191bnBhY2tfdWludDE2IChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCit2b2lkICAgICAgICAgIF9kYnVzX3BhY2tfdWludDMyICAgKGRidXNfdWludDMyX3QgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICpkYXRhKTsKKyNpZm5kZWYgX2RidXNfdW5wYWNrX3VpbnQzMgorREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aW50MzJfdCBfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCitkYnVzX2Jvb2xfdCAgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAgICAgICAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3NfYWZ0ZXIpOworZGJ1c19ib29sX3QgICBfZGJ1c19tYXJzaGFsX3dyaXRlX2ZpeGVkX211bHRpIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zX2FmdGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpOwordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnBvcyk7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3MpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgICAgICAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aW50MzJfdCBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbmV3X3Bvcyk7CitpbnQgICAgICAgICAgIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAgICAgICAgKGludCAgICAgICAgICAgICAgIHR5cGVjb2RlKTsKK2ludCAgICAgICAgICAgX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50ICAgICAgICAoaW50ICAgICAgICAgICAgICAgdHlwZWNvZGUpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogICBfZGJ1c190eXBlX3RvX3N0cmluZyAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICB0eXBlY29kZSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MpOworCitpbnQgICAgICAgICAgIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyICAgKGNvbnN0IGNoYXIgICAgICAgKnN0ciwKKwkJCQkJCSAgICAgaW50ICAgICAgICAgICAgICAgcG9zKTsKKwordm9pZCBfZGJ1c19zd2FwX2FycmF5ICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBhbGlnbm1lbnQpOworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX0JBU0lDX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYyBiL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg3NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMgIFdvdWxkIGJlIGluIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jIGJ1dCB0ZXN0cy9idXMgb25seQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitkb19ieXRlc3dhcF90ZXN0IChpbnQgYnl0ZV9vcmRlcikKK3sKKyAgaW50IHNlcXVlbmNlOworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworICBpbnQgb3Bwb3NpdGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkgfHwgIV9kYnVzX3N0cmluZ19pbml0ICgmYm9keSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgb3Bwb3NpdGVfb3JkZXIgPSBieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiA/IERCVVNfQklHX0VORElBTiA6IERCVVNfTElUVExFX0VORElBTjsKKyAgCisgIHNlcXVlbmNlID0gMDsKKyAgd2hpbGUgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGNvcHk7CisgICAgICBEQnVzVHlwZVJlYWRlciBib2R5X3JlYWRlcjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIGNvcHlfcmVhZGVyOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29weSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYm9keSwgMCwgJmNvcHksIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAoJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAwKTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJmJvZHlfcmVhZGVyLCBieXRlX29yZGVyLCAmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHksIDApOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJmNvcHlfcmVhZGVyLCBvcHBvc2l0ZV9vcmRlciwgJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAwKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9lcXVhbF92YWx1ZXMgKCZib2R5X3JlYWRlciwgJmNvcHlfcmVhZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZ25hdHVyZSkpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZjb3B5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcHkpKTsKKworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCeXRlLXN3YXBwZWQgZGF0YSBkaWQgbm90IGhhdmUgc2FtZSB2YWx1ZXMgYXMgb3JpZ2luYWwgZGF0YVxuIik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcHkpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNpZ25hdHVyZSwgMCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgKytzZXF1ZW5jZTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJvZHkpOworCisgIHByaW50ZiAoIiAgJWQgYmxvY2tzIHN3YXBwZWQgZnJvbSBvcmRlciAnJWMnIHRvICclYydcbiIsCisgICAgICAgICAgc2VxdWVuY2UsIGJ5dGVfb3JkZXIsIG9wcG9zaXRlX29yZGVyKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXBfdGVzdCAodm9pZCkKK3sKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19CSUdfRU5ESUFOKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjcxMWJlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyAgU3dhcCBhIGJsb2NrIG9mIG1hcnNoYWxlZCBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitieXRlc3dhcF9ib2R5X2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgd2Fsa19yZWFkZXJfdG9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBvbGRfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgKnAsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAqKm5ld19wKQoreworICBpbnQgY3VycmVudF90eXBlOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgc3dpdGNoIChjdXJyZW50X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgICAgICArK3A7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgMik7CisgICAgICAgICAgICAqKChkYnVzX3VpbnQxNl90KilwKSA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDE2X3QqKXApKTsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDQpOworICAgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopcCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilwKSk7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDgpOworICAgICAgICAgICAgKigoZGJ1c191aW50NjRfdCopcCkgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQ2NF90KilwKSk7CisgICAgICAgICAgICBwICs9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgNCk7CisKKyAgICAgICAgICAgIGFycmF5X2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKG9sZF9ieXRlX29yZGVyLCBwKTsKKworICAgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopcCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilwKSk7CisgICAgICAgICAgICBwICs9IDQ7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVsZW1fdHlwZTsKKyAgICAgICAgICAgICAgICBpbnQgYWxpZ25tZW50OworCisgICAgICAgICAgICAgICAgZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1fdHlwZSk7CisKKwkJX2RidXNfYXNzZXJ0ICgoYXJyYXlfbGVuIC8gYWxpZ25tZW50KSA8IERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEgpOworCisgICAgICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbV90eXBlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWdubWVudCA+IDEpCisJCSAgICAgIF9kYnVzX3N3YXBfYXJyYXkgKHAsIGFycmF5X2xlbiAvIGFsaWdubWVudCwgYWxpZ25tZW50KTsKKwkJICAgIHAgKz0gYXJyYXlfbGVuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphcnJheV9lbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kID0gcCArIGFycmF5X2xlbjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgJnApOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcCArPSAoYXJyYXlfbGVuICsgMSk7IC8qICsgMSBmb3IgbnVsICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3Qgc2lnX2xlbjsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMik7IC8qICsyIGZvciBsZW4gYW5kIG51bCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEgYnl0ZSBzaWcgbGVuLCBzaWcgdHlwZWNvZGVzLCBhbGlnbiB0bworICAgICAgICAgICAgICogY29udGFpbmVkLXR5cGUtYm91bmRhcnksIHZhbHVlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBzaWdfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzaWc7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzaWcsIHAsIHNpZ19sZW4pOworCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMSk7IC8qIDEgZm9yIG51bCAqLworCisgICAgICAgICAgICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoJnNpZywgMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgY29udGFpbmVkX2FsaWdubWVudCk7CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnN1YiwgJnNpZywgMCk7CisKKyAgICAgICAgICAgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmc3ViLCBGQUxTRSwgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLCBwLCAmcCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsIFRSVUUsIG9sZF9ieXRlX29yZGVyLCBuZXdfYnl0ZV9vcmRlciwgcCwgJnApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICAgIC8qIGZkcyBjYW4gb25seSBiZSBwYXNzZWQgb24gYSBsb2NhbCBtYWNoaW5lLCBzbyBieXRlIG9yZGVyIG11c3QgYWx3YXlzIG1hdGNoICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJhdHRlbXB0ZWQgdG8gYnl0ZXN3YXAgdW5peCBmZHMgd2hpY2ggbWFrZXMgbm8gc2Vuc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgdHlwZWNvZGUgaW4gc3VwcG9zZWRseS12YWxpZGF0ZWQgc2lnbmF0dXJlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHdhbGtfcmVhZGVyX3RvX2VuZCkKKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChuZXdfcCkKKyAgICAqbmV3X3AgPSBwOworfQorCisvKioKKyAqIEJ5dGVzd2FwcyB0aGUgbWFyc2hhbGVkIGRhdGEgaW4gdGhlIGdpdmVuIHZhbHVlX3N0ci4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlcyBpbiB0aGUgdmFsdWVfc3RyCisgKiBAcGFyYW0gc2lnbmF0dXJlX3N0YXJ0IHdoZXJlIGluIHNpZ25hdHVyZSBpcyB0aGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gb2xkX2J5dGVfb3JkZXIgdGhlIG9sZCBieXRlIG9yZGVyCisgKiBAcGFyYW0gbmV3X2J5dGVfb3JkZXIgdGhlIG5ldyBieXRlIG9yZGVyCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYm9keQorICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0aGUgdmFsdWVzIHN0YXJ0CisgKi8KK3ZvaWQKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHNpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlX3BvcyA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlX3N0cikpOworCisgIGlmIChvbGRfYnl0ZV9vcmRlciA9PSBuZXdfYnl0ZV9vcmRlcikKKyAgICByZXR1cm47CisgIAorICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfc3RhcnQpOworCisgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmcmVhZGVyLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAodmFsdWVfc3RyLCB2YWx1ZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qKiBAfSAqLworCisvKiBUZXN0cyBpbiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZmMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaApAQCAtMCwwICsxLDM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5oICBTd2FwIGEgYmxvY2sgb2YgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfQllURVNXQVBfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfQllURVNXQVBfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmg+CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAoY29uc3QgREJ1c1N0cmluZyAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaWduYXR1cmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuZXdfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNTFjNgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jCkBAIC0wLDAgKzEsMTUxNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtaGVhZGVyLmMgIE1hbmFnaW5nIG1hcnNoYWxpbmcvZGVtYXJzaGFsaW5nIG9mIG1lc3NhZ2UgaGVhZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMvZGJ1cy1zaGFyZWQuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtaGVhZGVyLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKgorICogQHsKKyAqLworCisKKy8qIE5vdCB0aHJlYWQgbG9ja2VkLCBidXQgc3RyaWN0bHkgY29uc3QvcmVhZC1vbmx5IHNvIHNob3VsZCBiZSBPSworICovCisvKiogU3RhdGljICNEQnVzU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIG1lc3NhZ2UgaGVhZGVyICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgREJVU19IRUFERVJfU0lHTkFUVVJFKTsKKy8qKiBTdGF0aWMgI0RCdXNTdHJpbmcgY29udGFpbmluZyB0aGUgbG9jYWwgaW50ZXJmYWNlICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyLCAgREJVU19JTlRFUkZBQ0VfTE9DQUwpOworLyoqIFN0YXRpYyAjREJ1c1N0cmluZyBjb250YWluaW5nIHRoZSBsb2NhbCBwYXRoICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19sb2NhbF9wYXRoX3N0ciwgICAgICAgREJVU19QQVRIX0xPQ0FMKTsKKworLyoqIE9mZnNldCBmcm9tIHN0YXJ0IG9mIF9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyIHRvIHRoZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkcyBhcnJheSAqLworI2RlZmluZSBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCA2CisvKiogT2Zmc2V0IGZyb20gc3RhcnQgb2YgX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIgdG8gdGhlIHNpZ25hdHVyZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBmaWVsZHMgYXJyYXkgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX0VMRU1FTlRfU0lHTkFUVVJFX09GRlNFVCA3CisKKworLyoqIE9mZnNldCB0byBieXRlIG9yZGVyIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEJZVEVfT1JERVJfT0ZGU0VUICAgIDAKKy8qKiBPZmZzZXQgdG8gdHlwZSBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBUWVBFX09GRlNFVCAgICAgICAgICAxCisvKiogT2Zmc2V0IHRvIGZsYWdzIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEZMQUdTX09GRlNFVCAgICAgICAgIDIKKy8qKiBPZmZzZXQgdG8gdmVyc2lvbiBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBWRVJTSU9OX09GRlNFVCAgICAgICAzCisvKiogT2Zmc2V0IHRvIGJvZHkgbGVuZ3RoIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEJPRFlfTEVOR1RIX09GRlNFVCA0CisvKiogT2Zmc2V0IHRvIGNsaWVudCBzZXJpYWwgZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgU0VSSUFMX09GRlNFVCA4CisvKiogT2Zmc2V0IHRvIGZpZWxkcyBhcnJheSBsZW5ndGggZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQgMTIKKy8qKiBPZmZzZXQgdG8gZmlyc3QgZmllbGQgaW4gaGVhZGVyICovCisjZGVmaW5lIEZJUlNUX0ZJRUxEX09GRlNFVCAxNgorCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIGNvZGU7IC8qKjwgdGhlIGZpZWxkIGNvZGUgKi8KKyAgdW5zaWduZWQgY2hhciB0eXBlOyAvKio8IHRoZSB2YWx1ZSB0eXBlICovCit9IEhlYWRlckZpZWxkVHlwZTsKKworc3RhdGljIGNvbnN0IEhlYWRlckZpZWxkVHlwZQorX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW0RCVVNfSEVBREVSX0ZJRUxEX0xBU1QrMV0gPSB7CisgIHsgREJVU19IRUFERVJfRklFTERfSU5WQUxJRCwgREJVU19UWVBFX0lOVkFMSUQgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9QQVRILCBEQlVTX1RZUEVfT0JKRUNUX1BBVEggfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9NRU1CRVIsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMLCBEQlVTX1RZUEVfVUlOVDMyIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsIERCVVNfVFlQRV9TSUdOQVRVUkUgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUywgREJVU19UWVBFX1VJTlQzMiB9Cit9OworCisvKiogTWFjcm8gdG8gbG9vayB1cCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIGZpZWxkICovCisjZGVmaW5lIEVYUEVDVEVEX1RZUEVfT0ZfRklFTEQoZmllbGQpIChfZGJ1c19oZWFkZXJfZmllbGRfdHlwZXNbZmllbGRdLnR5cGUpCisKKy8qKiBUaGUgbW9zdCBwYWRkaW5nIHdlIGNvdWxkIGV2ZXIgbmVlZCBmb3IgYSBoZWFkZXIgKi8KKyNkZWZpbmUgTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HIDcKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBfZGJ1c19hc3NlcnQgKGhlYWRlci0+cGFkZGluZyA8PSBNQVhfUE9TU0lCTEVfSEVBREVSX1BBRERJTkcpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HIC0gaGVhZGVyLT5wYWRkaW5nKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGhlYWRlci0+cGFkZGluZyA9IE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORzsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCB1bnBhZGRlZF9sZW47CisKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPnBhZGRpbmcgPT0gNyk7CisKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKCZoZWFkZXItPmRhdGEsIGhlYWRlci0+cGFkZGluZyk7CisgIHVucGFkZGVkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGggKCZoZWFkZXItPmRhdGEsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IHBhZCBoZWFkZXIgdGhvdWdoIGVub3VnaCBwYWRkaW5nIHdhcyBwcmVhbGxvY2F0ZWQiKTsKKworICBoZWFkZXItPnBhZGRpbmcgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgLSB1bnBhZGRlZF9sZW47Cit9CisKKy8qKiBDb21wdXRlIHRoZSBlbmQgb2YgdGhlIGhlYWRlciwgaWdub3JpbmcgcGFkZGluZyAqLworI2RlZmluZSBIRUFERVJfRU5EX0JFRk9SRV9QQURESU5HKGhlYWRlcikgXAorICAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCYoaGVhZGVyKS0+ZGF0YSkgLSAoaGVhZGVyKS0+cGFkZGluZykKKworLyoqCisgKiBJbnZhbGlkYXRlcyBhbGwgZmllbGRzIGluIHRoZSBjYWNoZS4gVGhpcyBtYXkgYmUgdXNlZCB3aGVuIHRoZQorICogY2FjaGUgaXMgdG90YWxseSB1bmluaXRpYWxpemVkIChjb250YWlucyBqdW5rKSBzbyBzaG91bGQgbm90CisgKiBsb29rIGF0IHdoYXQncyBpbiB0aGVyZSBub3cuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgeworICAgICAgaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX1VOS05PV047CisgICAgICArK2k7CisgICAgfQorfQorCisvKioKKyAqIENhY2hlcyBvbmUgZmllbGQKKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZF9jb2RlIHRoZSBmaWVsZAorICogQHBhcmFtIHZhcmlhbnRfcmVhZGVyIHRoZSByZWFkZXIgZm9yIHRoZSB2YXJpYW50IGluIHRoZSBmaWVsZAorICovCitzdGF0aWMgdm9pZAorX2RidXNfaGVhZGVyX2NhY2hlX29uZSAoREJ1c0hlYWRlciAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnZhcmlhbnRfcmVhZGVyKQoreworICBoZWFkZXItPmZpZWxkc1tmaWVsZF9jb2RlXS52YWx1ZV9wb3MgPQorICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKHZhcmlhbnRfcmVhZGVyKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoImNhY2hlZCB2YWx1ZV9wb3MgJWQgZm9yIGZpZWxkICVkXG4iLAorICAgICAgICAgICAgICAgICBoZWFkZXItPmZpZWxkc1tmaWVsZF9jb2RlXS52YWx1ZV9wb3MsIGZpZWxkX2NvZGUpCisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBoZWFkZXIncyBieXRlIG9yZGVyLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHJldHVybnMgdGhlIGJ5dGUgb3JkZXIKKyAqLworY2hhcgorX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChjb25zdCBEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpID4gQllURV9PUkRFUl9PRkZTRVQpOworCisgIHJldHVybiAoY2hhcikgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmaGVhZGVyLT5kYXRhLCBCWVRFX09SREVSX09GRlNFVCk7Cit9CisKKy8qKgorICogUmV2YWxpZGF0ZXMgdGhlIGZpZWxkcyBjYWNoZQorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICovCitzdGF0aWMgdm9pZAorX2RidXNfaGVhZGVyX2NhY2hlX3JldmFsaWRhdGUgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgREJ1c1R5cGVSZWFkZXIgYXJyYXk7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgeworICAgICAgaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX05PTkVYSVNURU5UOworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXkpOworCisgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHZhcmlhbnQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZWxkX2NvZGU7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZhcnJheSwgJnN1Yik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0JZVEUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN1YiwgJmZpZWxkX2NvZGUpOworCisgICAgICAvKiBVbmtub3duIGZpZWxkcyBzaG91bGQgYmUgaWdub3JlZCAqLworICAgICAgaWYgKGZpZWxkX2NvZGUgPiBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgICAgICBnb3RvIG5leHRfZmllbGQ7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZzdWIsICZ2YXJpYW50KTsKKworICAgICAgX2RidXNfaGVhZGVyX2NhY2hlX29uZSAoaGVhZGVyLCBmaWVsZF9jb2RlLCAmdmFyaWFudCk7CisKKyAgICBuZXh0X2ZpZWxkOgorICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5KTsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIGZvciBhIGZpZWxkLCB1cGRhdGluZyB0aGUgY2FjaGUgaWYgcmVxdWlyZWQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmllbGQpCit7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCk7CisKKyAgaWYgKGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MgPT0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX1VOS05PV04pCisgICAgX2RidXNfaGVhZGVyX2NhY2hlX3JldmFsaWRhdGUgKGhlYWRlcik7CisKKyAgaWYgKGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MgPT0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX05PTkVYSVNURU5UKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGZpZWxkIGlzIGtub3duIG5vdCB0byBleGlzdC4gSXQgbWF5IGV4aXN0CisgKiBldmVuIGlmIGl0J3Mgbm90IGtub3duIHRvIGV4aXN0LgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBjaGVjaworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkZWZpbml0ZWx5IGRvZXNuJ3QgZXhpc3QKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfY2FjaGVfa25vd25fbm9uZXhpc3RlbnQgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmllbGQpCit7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCk7CisKKyAgcmV0dXJuIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVCk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RydWN0IG9mIHsgYnl0ZSwgdmFyaWFudCB9IHdpdGggdGhlIGdpdmVuIGJhc2ljIHR5cGUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIChzaG91bGQgYmUgcmVhZHkgdG8gd3JpdGUgYSBzdHJ1Y3QpCisgKiBAcGFyYW0gZmllbGQgdGhlIGhlYWRlciBmaWVsZAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfYmFzaWNfZmllbGQgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzVHlwZVdyaXRlciB2YXJpYW50OworICBpbnQgc3RhcnQ7CisgIGludCBwYWRkaW5nOworICB1bnNpZ25lZCBjaGFyIGZpZWxkX2J5dGU7CisgIERCdXNTdHJpbmcgY29udGFpbmVkX3R5cGU7CisgIGNoYXIgYnVmWzJdOworCisgIHN0YXJ0ID0gd3JpdGVyLT52YWx1ZV9wb3M7CisgIHBhZGRpbmcgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpIC0gc3RhcnQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgJnN1YikpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGZpZWxkX2J5dGUgPSBmaWVsZDsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJnN1YiwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9ieXRlKSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgYnVmWzBdID0gdHlwZTsKKyAgYnVmWzFdID0gJ1wwJzsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmY29udGFpbmVkX3R5cGUsIGJ1ZiwgMSk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmc3ViLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVkX3R5cGUsIDAsICZ2YXJpYW50KSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJnZhcmlhbnQsIHR5cGUsIHZhbHVlKSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZzdWIsICZ2YXJpYW50KSkKKyAgICBnb3RvIGFwcGVuZF9mYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgYXBwZW5kX2ZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAod3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpIC0gc3RhcnQgLSBwYWRkaW5nKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNldHMgYSBzdHJ1Y3Qgb2YgeyBieXRlLCB2YXJpYW50IH0gd2l0aCB0aGUgZ2l2ZW4gYmFzaWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgKHNob3VsZCBiZSBpdGVyYXRpbmcgb3ZlciB0aGUgYXJyYXkgcG9pbnRpbmcgYXQgdGhlIGZpZWxkIHRvIHNldCkKKyAqIEBwYXJhbSBmaWVsZCB0aGUgaGVhZGVyIGZpZWxkCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYXMgZm9yIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljKCkKKyAqIEBwYXJhbSByZWFsaWduX3Jvb3Qgd2hlcmUgdG8gcmVhbGlnbiBmcm9tCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X2Jhc2ljX2ZpZWxkIChEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudDsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0JZVEUpOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgeworICAgdW5zaWduZWQgY2hhciB2X0JZVEU7CisgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmc3ViLCAmdl9CWVRFKTsKKyAgIF9kYnVzX2Fzc2VydCAoKChpbnQpIHZfQllURSkgPT0gZmllbGQpOworIH0KKyNlbmRpZgorCisgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1YikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gdmFyaWFudCBmaWVsZD8iKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmdmFyaWFudCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnZhcmlhbnQpID09IHR5cGUpOworCisgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljICgmdmFyaWFudCwgdmFsdWUsIHJlYWxpZ25fcm9vdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcmV0dXJucyB0aGUgdHlwZQorICovCitpbnQKK19kYnVzX2hlYWRlcl9nZXRfbWVzc2FnZV90eXBlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCB0eXBlOworCisgIHR5cGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZoZWFkZXItPmRhdGEsIFRZUEVfT0ZGU0VUKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworCisgIHJldHVybiB0eXBlOworfQorCisvKioKKyAqIFNldHMgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb25jZSBvbgorICogYSBoZWFkZXIuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gc2VyaWFsIHRoZSBzZXJpYWwKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpCit7CisgIC8qIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgc2VyaWFsIG9uIG91dGdvaW5nCisgICAqIG1lc3NhZ2VzLCBhbmQgdG8gcmVzZXQgdGhlIHNlcmlhbCBpbiBkYnVzX21lc3NhZ2VfY29weTsKKyAgICogdGhpcyBhc3NlcnRpb24gc2hvdWxkIGNhdGNoIGEgZG91YmxlLXNldCBvbiBvdXRnb2luZy4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2dldF9zZXJpYWwgKGhlYWRlcikgPT0gMCB8fAorICAgICAgICAgICAgICAgIHNlcmlhbCA9PSAwKTsKKworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSSUFMX09GRlNFVCwKKwkJCSAgICBzZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwoKQorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHJldHVybnMgdGhlIGNsaWVudCBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorX2RidXNfaGVhZGVyX2dldF9zZXJpYWwgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJJQUxfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qKgorICogUmUtaW5pdGlhbGl6ZXMgYSBoZWFkZXIgdGhhdCB3YXMgcHJldmlvdXNseSBpbml0aWFsaXplZCBhbmQgbmV2ZXIKKyAqIGZyZWVkLiAgQWZ0ZXIgdGhpcywgdG8gbWFrZSB0aGUgaGVhZGVyIHZhbGlkIHlvdSBoYXZlIHRvIGNhbGwKKyAqIF9kYnVzX2hlYWRlcl9jcmVhdGUoKS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIGhlYWRlciB0byByZS1pbml0aWFsaXplCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9yZWluaXQgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZoZWFkZXItPmRhdGEsIDApOworCisgIGhlYWRlci0+cGFkZGluZyA9IDA7CisKKyAgX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChoZWFkZXIpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgaGVhZGVyLCBidXQgZG9lc24ndCBwcmVwYXJlIGl0IGZvciB1c2U7CisgKiB0byBtYWtlIHRoZSBoZWFkZXIgdmFsaWQsIHlvdSBoYXZlIHRvIGNhbGwgX2RidXNfaGVhZGVyX2NyZWF0ZSgpLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIGluaXRpYWxpemUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2luaXQgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZoZWFkZXItPmRhdGEsIDMyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGVhZGVyX3JlaW5pdCAoaGVhZGVyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBGcmVlcyBhIGhlYWRlci4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX2ZyZWUgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZoZWFkZXItPmRhdGEpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGRlc3Qgd2l0aCBhIGNvcHkgb2YgdGhlIGdpdmVuIGhlYWRlci4KKyAqIFJlc2V0cyB0aGUgbWVzc2FnZSBzZXJpYWwgdG8gMCBvbiB0aGUgY29weS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIGhlYWRlciB0byBjb3B5CisgKiBAcGFyYW0gZGVzdCBkZXN0aW5hdGlvbiBmb3IgY29weQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfY29weSAoY29uc3QgREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgIERCdXNIZWFkZXIgICAgICAgKmRlc3QpCit7CisgICpkZXN0ID0gKmhlYWRlcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoJmRlc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmaGVhZGVyLT5kYXRhLCAwLCAmZGVzdC0+ZGF0YSwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZXN0LT5kYXRhKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogUmVzZXQgdGhlIHNlcmlhbCAqLworICBfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAoZGVzdCwgMCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRmlsbHMgaW4gdGhlIHByaW1hcnkgZmllbGRzIG9mIHRoZSBoZWFkZXIsIHNvIHRoZSBoZWFkZXIgaXMgcmVhZHkKKyAqIGZvciB1c2UuICNOVUxMIG1heSBiZSBzcGVjaWZpZWQgZm9yIHNvbWUgb3IgYWxsIG9mIHRoZSBmaWVsZHMgdG8KKyAqIGF2b2lkIGFkZGluZyB0aG9zZSBmaWVsZHMuIFNvbWUgY29tYmluYXRpb25zIG9mIGZpZWxkcyBkb24ndCBtYWtlCisgKiBzZW5zZSwgYW5kIHBhc3NpbmcgdGhlbSBpbiB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBieXRlIG9yZGVyIG9mIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBtZXNzYWdlX3R5cGUgdGhlIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtIGRlc3RpbmF0aW9uIGRlc3RpbmF0aW9uIGZpZWxkIG9yICNOVUxMCisgKiBAcGFyYW0gcGF0aCBwYXRoIGZpZWxkIG9yICNOVUxMCisgKiBAcGFyYW0gaW50ZXJmYWNlIGludGVyZmFjZSBmaWVsZCBvciAjTlVMTAorICogQHBhcmFtIG1lbWJlciBtZW1iZXIgZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBlcnJvcl9uYW1lIGVycm9yIG5hbWUgb3IgI05VTEwKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NyZWF0ZSAoREJ1c0hlYWRlciAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSkKK3sKKyAgdW5zaWduZWQgY2hhciB2X0JZVEU7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgYXJyYXk7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKyAgX2RidXNfYXNzZXJ0ICgoKGludGVyZmFjZSB8fCBtZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSAmJiBtZW1iZXIpIHx8CisgICAgICAgICAgICAgICAgKGVycm9yX25hbWUpIHx8CisgICAgICAgICAgICAgICAgIShpbnRlcmZhY2UgfHwgbWVtYmVyIHx8IGVycm9yX25hbWUpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgPT0gMCk7CisKKyAgaWYgKCFyZXNlcnZlX2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUl9FTkRfQkVGT1JFX1BBRERJTkcgKGhlYWRlcikpOworCisgIHZfQllURSA9IGJ5dGVfb3JkZXI7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9CWVRFKSkKKyAgICBnb3RvIG9vbTsKKworICB2X0JZVEUgPSBtZXNzYWdlX3R5cGU7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9CWVRFKSkKKyAgICBnb3RvIG9vbTsKKworICB2X0JZVEUgPSAwOyAvKiBmbGFncyAqLworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9CWVRFID0gREJVU19NQUpPUl9QUk9UT0NPTF9WRVJTSU9OOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9VSU5UMzIgPSAwOyAvKiBib2R5IGxlbmd0aCAqLworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIGdvdG8gb29tOworCisgIHZfVUlOVDMyID0gMDsgLyogc2VyaWFsICovCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1VJTlQzMikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmd3JpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheSkpCisgICAgZ290byBvb207CisKKyAgLyogTWFyc2hhbCBhbGwgdGhlIGZpZWxkcyAoTWFyc2hhbGwgRmllbGRzPykgKi8KKworICBpZiAocGF0aCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoZGVzdGluYXRpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdGluYXRpb24pKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGludGVyZmFjZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJmYWNlKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChtZW1iZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9NRU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbWJlcikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoZXJyb3JfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfYmFzaWNfZmllbGQgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX25hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZ3cml0ZXIsICZhcnJheSkpCisgICAgZ290byBvb207CisKKyAgY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmhlYWRlci0+ZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpIC0gaGVhZGVyLT5wYWRkaW5nKTsKKyAgY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2l2ZW4gZGF0YSBsb25nIGVub3VnaCB0byBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgYm9keQorICogYW5kIHRoZSBmaWVsZHMgYXJyYXksIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgaXMgbG9uZyBlbm91Z2ggdG8KKyAqIGNvbnRhaW4gdGhlIGVudGlyZSBtZXNzYWdlIChhc3N1bWluZyB0aGUgY2xhaW1lZCBsZW5ndGhzIGFyZQorICogYWNjdXJhdGUpLiBBbHNvIGNoZWNrcyB0aGF0IHRoZSBsZW5ndGhzIGFyZSBpbiBzYW5pdHkgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gbWF4X21lc3NhZ2VfbGVuZ3RoIG1heGltdW0gbGVuZ3RoIG9mIGEgdmFsaWQgbWVzc2FnZQorICogQHBhcmFtIHZhbGlkaXR5IHJldHVybiBsb2NhdGlvbiBmb3Igd2h5IHRoZSBkYXRhIGlzIGludmFsaWQgaWYgaXQgaXMKKyAqIEBwYXJhbSBieXRlX29yZGVyIHJldHVybiBsb2NhdGlvbiBmb3IgYnl0ZSBvcmRlcgorICogQHBhcmFtIGZpZWxkc19hcnJheV9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBjbGFpbWVkIGZpZWxkcyBhcnJheSBsZW5ndGgKKyAqIEBwYXJhbSBoZWFkZXJfbGVuIHJldHVybiBsb2NhdGlvbiBmb3IgY2xhaW1lZCBoZWFkZXIgbGVuZ3RoCisgKiBAcGFyYW0gYm9keV9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBjbGFpbWVkIGJvZHkgbGVuZ3RoCisgKiBAcGFyYW0gc3RyIHRoZSBkYXRhCisgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgZGF0YSwgOC1hbGlnbmVkCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZGF0YSBpcyBsb25nIGVub3VnaCBmb3IgdGhlIGNsYWltZWQgbGVuZ3RoLCBhbmQgdGhlIGxlbmd0aHMgd2VyZSB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQgKGludCAgICAgICAgICAgICAgICBtYXhfbWVzc2FnZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgKnZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQorCit7CisgIGRidXNfdWludDMyX3QgaGVhZGVyX2xlbl91bnNpZ25lZDsKKyAgZGJ1c191aW50MzJfdCBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkOworICBkYnVzX3VpbnQzMl90IGJvZHlfbGVuX3Vuc2lnbmVkOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPCBfREJVU19JTlQzMl9NQVggLyAyKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA9PSAoaW50KSBfREJVU19BTElHTl9WQUxVRSAoc3RhcnQsIDgpKTsKKworICAqYnl0ZV9vcmRlciA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBzdGFydCArIEJZVEVfT1JERVJfT0ZGU0VUKTsKKworICBpZiAoKmJ5dGVfb3JkZXIgIT0gREJVU19MSVRUTEVfRU5ESUFOICYmICpieXRlX29yZGVyICE9IERCVVNfQklHX0VORElBTikKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX0JZVEVfT1JERVI7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQgKyA0IDw9IGxlbik7CisgIGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsIHN0YXJ0ICsgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwgTlVMTCk7CisKKyAgaWYgKGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQgPiAodW5zaWduZWQpIG1heF9tZXNzYWdlX2xlbmd0aCkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfSU5TQU5FX0ZJRUxEU19BUlJBWV9MRU5HVEg7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoQk9EWV9MRU5HVEhfT0ZGU0VUICsgNCA8IGxlbik7CisgIGJvZHlfbGVuX3Vuc2lnbmVkID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBzdGFydCArIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwgTlVMTCk7CisKKyAgaWYgKGJvZHlfbGVuX3Vuc2lnbmVkID4gKHVuc2lnbmVkKSBtYXhfbWVzc2FnZV9sZW5ndGgpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0lOU0FORV9CT0RZX0xFTkdUSDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaGVhZGVyX2xlbl91bnNpZ25lZCA9IEZJUlNUX0ZJRUxEX09GRlNFVCArIGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQ7CisgIGhlYWRlcl9sZW5fdW5zaWduZWQgPSBfREJVU19BTElHTl9WQUxVRSAoaGVhZGVyX2xlbl91bnNpZ25lZCwgOCk7CisKKyAgLyogb3ZlcmZsb3cgc2hvdWxkIGJlIGltcG9zc2libGUgc2luY2UgdGhlIGxlbmd0aHMgYXJlbid0IGFsbG93ZWQgdG8KKyAgICogYmUgaHVnZS4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAobWF4X21lc3NhZ2VfbGVuZ3RoIDwgX0RCVVNfSU5UMzJfTUFYIC8gMik7CisgIGlmIChib2R5X2xlbl91bnNpZ25lZCArIGhlYWRlcl9sZW5fdW5zaWduZWQgPiAodW5zaWduZWQpIG1heF9tZXNzYWdlX2xlbmd0aCkKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUVTU0FHRV9UT09fTE9ORzsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChib2R5X2xlbl91bnNpZ25lZCA8ICh1bnNpZ25lZCkgX0RCVVNfSU5UMzJfTUFYKTsKKyAgX2RidXNfYXNzZXJ0IChmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkIDwgKHVuc2lnbmVkKSBfREJVU19JTlQzMl9NQVgpOworICBfZGJ1c19hc3NlcnQgKGhlYWRlcl9sZW5fdW5zaWduZWQgPCAodW5zaWduZWQpIF9EQlVTX0lOVDMyX01BWCk7CisKKyAgKmJvZHlfbGVuID0gYm9keV9sZW5fdW5zaWduZWQ7CisgICpmaWVsZHNfYXJyYXlfbGVuID0gZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZDsKKyAgKmhlYWRlcl9sZW4gPSBoZWFkZXJfbGVuX3Vuc2lnbmVkOworCisgICp2YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImhhdmUgJWQgYnl0ZXMsIG5lZWQgYm9keSAldSArIGhlYWRlciAldSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBsZW4sIGJvZHlfbGVuX3Vuc2lnbmVkLCBoZWFkZXJfbGVuX3Vuc2lnbmVkLAorICAgICAgICAgICAgICAgICBib2R5X2xlbl91bnNpZ25lZCArIGhlYWRlcl9sZW5fdW5zaWduZWQpOworCisgIHJldHVybiAoYm9keV9sZW5fdW5zaWduZWQgKyBoZWFkZXJfbGVuX3Vuc2lnbmVkKSA8PSAodW5zaWduZWQpIGxlbjsKK30KKworc3RhdGljIERCdXNWYWxpZGl0eQorY2hlY2tfbWFuZGF0b3J5X2ZpZWxkcyAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworI2RlZmluZSBSRVFVSVJFX0ZJRUxEKG5hbWUpIGRvIHsgaWYgKGhlYWRlci0+ZmllbGRzW0RCVVNfSEVBREVSX0ZJRUxEXyMjbmFtZV0udmFsdWVfcG9zIDwgMCkgcmV0dXJuIERCVVNfSU5WQUxJRF9NSVNTSU5HXyMjbmFtZTsgfSB3aGlsZSAoMCkKKworICBzd2l0Y2ggKF9kYnVzX2hlYWRlcl9nZXRfbWVzc2FnZV90eXBlIChoZWFkZXIpKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKyAgICAgIFJFUVVJUkVfRklFTEQgKElOVEVSRkFDRSk7CisgICAgICAvKiBGQUxMIFRIUlUgLSBzaWduYWxzIGFsc28gcmVxdWlyZSB0aGUgcGF0aCBhbmQgbWVtYmVyICovCisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDoKKyAgICAgIFJFUVVJUkVfRklFTEQgKFBBVEgpOworICAgICAgUkVRVUlSRV9GSUVMRCAoTUVNQkVSKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICBSRVFVSVJFX0ZJRUxEIChFUlJPUl9OQU1FKTsKKyAgICAgIFJFUVVJUkVfRklFTEQgKFJFUExZX1NFUklBTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICBSRVFVSVJFX0ZJRUxEIChSRVBMWV9TRVJJQUwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG90aGVyIG1lc3NhZ2UgdHlwZXMgYWxsb3dlZCBidXQgaWdub3JlZCAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBEQlVTX1ZBTElEOworfQorCitzdGF0aWMgREJ1c1ZhbGlkaXR5Citsb2FkX2FuZF92YWxpZGF0ZV9maWVsZCAoREJ1c0hlYWRlciAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnZhcmlhbnRfcmVhZGVyKQoreworICBpbnQgdHlwZTsKKyAgaW50IGV4cGVjdGVkX3R5cGU7CisgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlX3N0cjsKKyAgaW50IHZhbHVlX3BvczsKKyAgaW50IHN0cl9kYXRhX3BvczsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgaW50IGJhZF9zdHJpbmdfY29kZTsKKyAgZGJ1c19ib29sX3QgKCogc3RyaW5nX3ZhbGlkYXRpb25fZnVuYykgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGxlbik7CisKKyAgLyogU3VwcG9zZWQgdG8gaGF2ZSBiZWVuIGNoZWNrZWQgYWxyZWFkeSAqLworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworICBfZGJ1c19hc3NlcnQgKGZpZWxkICE9IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQpOworCisgIC8qIEJlZm9yZSB3ZSBjYW4gY2FjaGUgYSBmaWVsZCwgd2UgbmVlZCB0byBrbm93IGl0IGhhcyB0aGUgcmlnaHQgdHlwZSAqLworICB0eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAodmFyaWFudF9yZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW2ZpZWxkXS5jb2RlID09IGZpZWxkKTsKKworICBleHBlY3RlZF90eXBlID0gRVhQRUNURURfVFlQRV9PRl9GSUVMRCAoZmllbGQpOworICBpZiAodHlwZSAhPSBleHBlY3RlZF90eXBlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWVsZCAlZCBzaG91bGQgaGF2ZSB0eXBlICVkIGJ1dCBoYXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgZXhwZWN0ZWRfdHlwZSwgdHlwZSk7CisgICAgICByZXR1cm4gREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9IQVNfV1JPTkdfVFlQRTsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpZWxkIHdhcyBwcm92aWRlZCB0d2ljZSwgd2UgYXJlbid0IGhhcHB5ICovCisgIGlmIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID49IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkhlYWRlciBmaWVsZCAlZCBzZWVuIGEgc2Vjb25kIHRpbWVcbiIsIGZpZWxkKTsKKyAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0FQUEVBUlNfVFdJQ0U7CisgICAgfQorCisgIC8qIE5vdyB3ZSBjYW4gY2FjaGUgYW5kIGxvb2sgYXQgdGhlIGZpZWxkIGNvbnRlbnQgKi8KKyAgX2RidXNfdmVyYm9zZSAoImluaXRpYWxseSBjYWNoaW5nIGZpZWxkICVkXG4iLCBmaWVsZCk7CisgIF9kYnVzX2hlYWRlcl9jYWNoZV9vbmUgKGhlYWRlciwgZmllbGQsIHZhcmlhbnRfcmVhZGVyKTsKKworICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gTlVMTDsKKworICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5IHRoYXQgYWxsIHRoaXMgaXMgaW5pdGlhbGl6ZWQgKi8KKyAgdl9VSU5UMzIgPSAwOworICB2YWx1ZV9zdHIgPSBOVUxMOworICB2YWx1ZV9wb3MgPSAtMTsKKyAgc3RyX2RhdGFfcG9zID0gLTE7CisgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfVkFMSUQ7CisKKyAgaWYgKGV4cGVjdGVkX3R5cGUgPT0gREJVU19UWVBFX1VJTlQzMikKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljIChoZWFkZXIsIGZpZWxkLCBleHBlY3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfVUlOVDMyKTsKKyAgICB9CisgIGVsc2UgaWYgKGV4cGVjdGVkX3R5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgICAgICBleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCB8fAorICAgICAgICAgICBleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9TSUdOQVRVUkUpCisgICAgeworICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKGhlYWRlciwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX3N0ciwgJnZhbHVlX3Bvcyk7CisgICAgICBzdHJfZGF0YV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAodmFsdWVfcG9zLCA0KSArIDQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm9uZSBvZiB0aGUga25vd24gZmllbGRzIHNob3VsZCBoYXZlIHRoaXMgdHlwZSIpOworICAgIH0KKworICBzd2l0Y2ggKGZpZWxkKQorICAgIHsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lOworICAgICAgYmFkX3N0cmluZ19jb2RlID0gREJVU19JTlZBTElEX0JBRF9ERVNUSU5BVElPTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfSU5URVJGQUNFOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJl9kYnVzX2xvY2FsX2ludGVyZmFjZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJl9kYnVzX2xvY2FsX2ludGVyZmFjZV9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgc3RyX2RhdGFfcG9zKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNZXNzYWdlIGlzIG9uIHRoZSBsb2NhbCBpbnRlcmZhY2VcbiIpOworICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9JTlRFUkZBQ0U7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9NRU1CRVI6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfbWVtYmVyOworICAgICAgYmFkX3N0cmluZ19jb2RlID0gREJVU19JTlZBTElEX0JBRF9NRU1CRVI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRToKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lOworICAgICAgYmFkX3N0cmluZ19jb2RlID0gREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUjoKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfU0VOREVSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1BBVEg6CisgICAgICAvKiBPQkpFQ1RfUEFUSCB3YXMgdmFsaWRhdGVkIGdlbmVyaWNhbGx5IGR1ZSB0byBpdHMgdHlwZSAqLworICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IE5VTEw7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmX2RidXNfbG9jYWxfcGF0aF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJl9kYnVzX2xvY2FsX3BhdGhfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHN0cl9kYXRhX3BvcykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSBpcyBmcm9tIHRoZSBsb2NhbCBwYXRoXG4iKTsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSDsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTDoKKyAgICAgIC8qIENhbid0IGJlIDAgKi8KKyAgICAgIGlmICh2X1VJTlQzMiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CQURfU0VSSUFMOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfVU5JWF9GRFM6CisgICAgICAvKiBFdmVyeSB2YWx1ZSBtYWtlcyBzZW5zZSAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRToKKyAgICAgIC8qIFNJR05BVFVSRSB2YWxpZGF0ZWQgZ2VuZXJpY2FsbHkgZHVlIHRvIGl0cyB0eXBlICovCisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gTlVMTDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVua25vd24gZmllbGQgc2hvdWxkbid0IGJlIHNlZW4gaGVyZSIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChzdHJpbmdfdmFsaWRhdGlvbl9mdW5jKQorICAgIHsKKyAgICAgIGRidXNfdWludDMyX3QgbGVuOworCisgICAgICBfZGJ1c19hc3NlcnQgKGJhZF9zdHJpbmdfY29kZSAhPSBEQlVTX1ZBTElEKTsKKworICAgICAgbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAodmFsdWVfc3RyLCB2YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJWYWxpZGF0aW5nIHN0cmluZyBoZWFkZXIgZmllbGQ7IGNvZGUgJWQgaWYgZmFpbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICBiYWRfc3RyaW5nX2NvZGUpOworI2VuZGlmCisgICAgICBpZiAoISgqc3RyaW5nX3ZhbGlkYXRpb25fZnVuYykgKHZhbHVlX3N0ciwgc3RyX2RhdGFfcG9zLCBsZW4pKQorICAgICAgICByZXR1cm4gYmFkX3N0cmluZ19jb2RlOworICAgIH0KKworICByZXR1cm4gREJVU19WQUxJRDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbWVzc2FnZSBoZWFkZXIgZnJvbSBwb3RlbnRpYWxseS11bnRydXN0ZWQgZGF0YS4gVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgYW5kIHRoZSBkYXRhIHdhcworICogdmFsaWQuIElmIGl0IHJldHVybnMgI1RSVUUsIHRoZSBoZWFkZXIgd2lsbCBiZSBjcmVhdGVkLiBJZiBpdAorICogcmV0dXJucyAjRkFMU0UgYW5kICp2YWxpZGl0eSA9PSAjREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUiwgCisgKiB0aGVuIHRoZXJlIHdhc24ndCBlbm91Z2ggbWVtb3J5LiAgSWYgaXQgcmV0dXJucyAjRkFMU0UgCisgKiBhbmQgKnZhbGlkaXR5ICE9ICNEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SIHRoZW4gdGhlIGRhdGEgd2FzIAorICogaW52YWxpZC4KKyAqCisgKiBUaGUgYnl0ZV9vcmRlciwgZmllbGRzX2FycmF5X2xlbiwgYW5kIGJvZHlfbGVuIGFyZ3Mgc2hvdWxkIGJlIGZyb20KKyAqIF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkKCkuIFZhbGlkYXRpb24gcGVyZm9ybWVkIGluCisgKiBfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCgpIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuCisgKiBhbHJlYWR5IGRvbmUuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyIChtdXN0IGJlIGluaXRpYWxpemVkKQorICogQHBhcmFtIG1vZGUgd2hldGhlciB0byBkbyB2YWxpZGF0aW9uCisgKiBAcGFyYW0gdmFsaWRpdHkgcmV0dXJuIGxvY2F0aW9uIGZvciBpbnZhbGlkaXR5IHJlYXNvbgorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBmcm9tIGhlYWRlcgorICogQHBhcmFtIGZpZWxkc19hcnJheV9sZW4gY2xhaW1lZCBsZW5ndGggb2YgZmllbGRzIGFycmF5CisgKiBAcGFyYW0gYm9keV9sZW4gY2xhaW1lZCBsZW5ndGggb2YgYm9keQorICogQHBhcmFtIGhlYWRlcl9sZW4gY2xhaW1lZCBsZW5ndGggb2YgaGVhZGVyCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgaGVhZGVyLCA4LWFsaWduZWQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHN0cmluZyB0byBsb29rIGF0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IG9yIGRhdGEgd2FzIGludmFsaWQsICNUUlVFIG90aGVyd2lzZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2xvYWQgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgKnZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBpbnQgbGVmdG92ZXI7CisgIERCdXNWYWxpZGl0eSB2OworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlUmVhZGVyIGFycmF5X3JlYWRlcjsKKyAgdW5zaWduZWQgY2hhciB2X2J5dGU7CisgIGRidXNfdWludDMyX3Qgdl91aW50MzI7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBpbnQgcGFkZGluZ19zdGFydDsKKyAgaW50IHBhZGRpbmdfbGVuOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID09IChpbnQpIF9EQlVTX0FMSUdOX1ZBTFVFIChzdGFydCwgOCkpOworICBfZGJ1c19hc3NlcnQgKGhlYWRlcl9sZW4gPD0gbGVuKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgPT0gMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKHN0ciwgc3RhcnQsIGhlYWRlcl9sZW4sICZoZWFkZXItPmRhdGEsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBidWZmZXIgaW50byBuZXcgaGVhZGVyXG4iKTsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtb2RlID09IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGxlZnRvdmVyID0gbGVuIC0gaGVhZGVyX2xlbiAtIGJvZHlfbGVuIC0gc3RhcnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdiA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKCZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0b3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHN0YXJ0LCBsZW4pOworICAgICAgCisgICAgICBpZiAodiAhPSBEQlVTX1ZBTElEKQorICAgICAgICB7CisgICAgICAgICAgKnZhbGlkaXR5ID0gdjsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChsZWZ0b3ZlciA8IGxlbik7CisKKyAgcGFkZGluZ19sZW4gPSBoZWFkZXJfbGVuIC0gKEZJUlNUX0ZJRUxEX09GRlNFVCArIGZpZWxkc19hcnJheV9sZW4pOworICBwYWRkaW5nX3N0YXJ0ID0gc3RhcnQgKyBGSVJTVF9GSUVMRF9PRkZTRVQgKyBmaWVsZHNfYXJyYXlfbGVuOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ICsgaGVhZGVyX2xlbiA9PSAoaW50KSBfREJVU19BTElHTl9WQUxVRSAocGFkZGluZ19zdGFydCwgOCkpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ICsgaGVhZGVyX2xlbiA9PSBwYWRkaW5nX3N0YXJ0ICsgcGFkZGluZ19sZW4pOworCisgIGlmIChtb2RlICE9IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoc3RyLCBwYWRkaW5nX3N0YXJ0LCBwYWRkaW5nX2xlbikpCisgICAgICAgIHsKKyAgICAgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaGVhZGVyLT5wYWRkaW5nID0gcGFkZGluZ19sZW47CisKKyAgaWYgKG1vZGUgPT0gREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFkpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBXZSBub3cga25vdyB0aGUgZGF0YSBpcyB3ZWxsLWZvcm1lZCwgYnV0IHdlIGhhdmUgdG8gY2hlY2sgdGhhdAorICAgKiBpdCdzIHZhbGlkLgorICAgKi8KKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgc3RhcnQpOworCisgIC8qIEJZVEUgT1JERVIgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gQllURV9PUkRFUl9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl9ieXRlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICh2X2J5dGUgPT0gYnl0ZV9vcmRlcik7CisKKyAgLyogTUVTU0FHRSBUWVBFICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IFRZUEVfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfYnl0ZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIC8qIHVua25vd24gbWVzc2FnZSB0eXBlcyBhcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZCwgc28gb25seSB2YWxpZGF0aW9uIGhlcmUgaXMKKyAgICogdGhhdCBpdCBpc24ndCBpbnZhbGlkCisgICAqLworICBpZiAodl9ieXRlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEU7CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIC8qIEZMQUdTICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IEZMQUdTX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICAvKiB1bmtub3duIGZsYWdzIHNob3VsZCBiZSBpZ25vcmVkICovCisKKyAgLyogUFJPVE9DT0wgVkVSU0lPTiAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBWRVJTSU9OX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBpZiAodl9ieXRlICE9IERCVVNfTUFKT1JfUFJPVE9DT0xfVkVSU0lPTikKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX1BST1RPQ09MX1ZFUlNJT047CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIC8qIEJPRFkgTEVOR1RIICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gQk9EWV9MRU5HVEhfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfdWludDMyKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChib2R5X2xlbiA9PSAoc2lnbmVkKSB2X3VpbnQzMik7CisKKyAgLyogU0VSSUFMICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gU0VSSUFMX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZzZXJpYWwpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBpZiAoc2VyaWFsID09IDApCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9TRVJJQUw7CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5X3JlYWRlcik7CisgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXlfcmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdHJ1Y3RfcmVhZGVyOworICAgICAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudF9yZWFkZXI7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZWxkX2NvZGU7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5X3JlYWRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZhcnJheV9yZWFkZXIsICZzdHJ1Y3RfcmVhZGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3RydWN0X3JlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN0cnVjdF9yZWFkZXIsICZmaWVsZF9jb2RlKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdHJ1Y3RfcmVhZGVyKTsKKworICAgICAgaWYgKGZpZWxkX2NvZGUgPT0gREJVU19IRUFERVJfRklFTERfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbnZhbGlkIGhlYWRlciBmaWVsZCBjb2RlXG4iKTsKKyAgICAgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREU7CisgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisKKyAgICAgIGlmIChmaWVsZF9jb2RlID4gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmtub3duIGhlYWRlciBmaWVsZCBjb2RlICVkLCBza2lwcGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb2RlKTsKKyAgICAgICAgICBnb3RvIG5leHRfZmllbGQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3RydWN0X3JlYWRlcikgPT0gREJVU19UWVBFX1ZBUklBTlQpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnN0cnVjdF9yZWFkZXIsICZ2YXJpYW50X3JlYWRlcik7CisKKyAgICAgIHYgPSBsb2FkX2FuZF92YWxpZGF0ZV9maWVsZCAoaGVhZGVyLCBmaWVsZF9jb2RlLCAmdmFyaWFudF9yZWFkZXIpOworICAgICAgaWYgKHYgIT0gREJVU19WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWVsZCAlZCB3YXMgaW52YWxpZFxuIiwgZmllbGRfY29kZSk7CisgICAgICAgICAgKnZhbGlkaXR5ID0gdjsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKworICAgIG5leHRfZmllbGQ6CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXlfcmVhZGVyKTsKKyAgICB9CisKKyAgLyogQW55dGhpbmcgd2UgZGlkbid0IGZpbGwgaW4gaXMgbm93IGtub3duIG5vdCB0byBleGlzdCAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICB7CisgICAgICBpZiAoaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOKQorICAgICAgICBoZWFkZXItPmZpZWxkc1tpXS52YWx1ZV9wb3MgPSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQ7CisgICAgICArK2k7CisgICAgfQorCisgIHYgPSBjaGVja19tYW5kYXRvcnlfZmllbGRzIChoZWFkZXIpOworICBpZiAodiAhPSBEQlVTX1ZBTElEKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNYW5kYXRvcnkgZmllbGRzIHdlcmUgbWlzc2luZywgY29kZSAlZFxuIiwgdik7CisgICAgICAqdmFsaWRpdHkgPSB2OworICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKworICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICByZXR1cm4gVFJVRTsKKworIGludmFsaWQ6CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhLCAwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbGxzIGluIHRoZSBjb3JyZWN0IGJvZHkgbGVuZ3RoLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGJvZHlfbGVuIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3VwZGF0ZV9sZW5ndGhzIChEQnVzSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJvZHlfbGVuKQoreworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSk7Cit9CisKKy8qKgorICogVHJ5IHRvIGZpbmQgdGhlIGdpdmVuIGZpZWxkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCBjb2RlCisgKiBAcGFyYW0gcmVhZGVyIGEgdHlwZSByZWFkZXI7IG9uIHN1Y2Nlc3MgdGhpcyBpcyBsZWZ0IHBvaW50aW5nIGF0IHRoZSBzdHJ1Y3QKKyAqICAodXYpIGZvciB0aGUgZmllbGQsIHdoaWxlIG9uIGZhaWx1cmUgaXQgaXMgbGVmdCBwb2ludGluZyBpbnRvIGVtcHR5IHNwYWNlCisgKiAgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpZWxkcworICogQHBhcmFtIHJlYWxpZ25fcm9vdCBhbm90aGVyIHR5cGUgcmVhZGVyOyBvbiBzdWNjZXNzIG9yIGZhaWx1cmUgaXQgaXMgbGVmdAorICogIHBvaW50aW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IG9mIGZpZWxkcyAoaS5lLiB0aGUgdGhpbmcgdGhhdCBtaWdodAorICogIG5lZWQgcmVhbGlnbmluZykKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX2ZpZWxkX2Zvcl9tb2RpZmljYXRpb24gKERCdXNIZWFkZXIgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKHJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhbGlnbl9yb290LCByZWFkZXIpOworCisgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZmllbGRfY29kZTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfQllURSk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmc3ViLCAmZmllbGRfY29kZSk7CisKKyAgICAgIGlmIChmaWVsZF9jb2RlID09ICh1bnNpZ25lZCkgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICB9CisKKyBkb25lOgorICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgd2l0aCBiYXNpYyB0eXBlLiBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcKKyAqIHZhbHVlLCBpdCBpc24ndCBhbGxvd2VkIHRvIGJlICNOVUxMLiBJZiB0aGUgZmllbGQgZG9lc24ndCBleGlzdCwKKyAqIGl0IHdpbGwgYmUgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gc2V0CisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYXMgZm9yIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljKCkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKERCdXNIZWFkZXIgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworCisgIGlmICghcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogSWYgdGhlIGZpZWxkIGV4aXN0cyB3ZSBzZXQsIG90aGVyd2lzZSB3ZSBhcHBlbmQgKi8KKyAgaWYgKF9kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoaGVhZGVyLCBmaWVsZCkpCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICAgICAgREJ1c1R5cGVSZWFkZXIgcmVhbGlnbl9yb290OworCisgICAgICBpZiAoIWZpbmRfZmllbGRfZm9yX21vZGlmaWNhdGlvbiAoaGVhZGVyLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmcmVhbGlnbl9yb290KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmllbGQgd2FzIG1hcmtlZCBwcmVzZW50IGluIGNhY2hlIGJ1dCB3YXNuJ3QgZm91bmQiKTsKKworICAgICAgaWYgKCFzZXRfYmFzaWNfZmllbGQgKCZyZWFkZXIsIGZpZWxkLCB0eXBlLCB2YWx1ZSwgJnJlYWxpZ25fcm9vdCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisgICAgICBEQnVzVHlwZVdyaXRlciBhcnJheTsKKworICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUKTsKKworICAgICAgLyogcmVjdXJzZSBpbnRvIGFycmF5IHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgbGVuZ3RoLCBhbmQganVtcCB0bworICAgICAgICogZW5kIG9mIGFycmF5LgorICAgICAgICovCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX0VMRU1FTlRfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyYXkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyZWN1cnNlIGludG8gQVJSQVkgc2hvdWxkIG5vdCBoYXZlIHVzZWQgbWVtb3J5Iik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoYXJyYXkudS5hcnJheS5sZW5fcG9zID09IEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYXJyYXkudS5hcnJheS5zdGFydF9wb3MgPT0gRklSU1RfRklFTERfT0ZGU0VUKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYXJyYXkudmFsdWVfcG9zID09IEhFQURFUl9FTkRfQkVGT1JFX1BBRERJTkcgKGhlYWRlcikpOworCisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgdHlwZSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmd3JpdGVyLCAmYXJyYXkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bnJlY3Vyc2UgZnJvbSBBUlJBWSBzaG91bGQgbm90IGhhdmUgdXNlZCBtZW1vcnkiKTsKKyAgICB9CisKKyAgY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKTsKKworICAvKiBXZSBjb3VsZCBiZSBzbWFydGVyIGFib3V0IHRoaXMgKG9ubHkgaW52YWxpZGF0ZSBmaWVsZHMgYWZ0ZXIgdGhlCisgICAqIG9uZSB3ZSBtb2RpZmllZCwgb3IgZXZlbiBvbmx5IGlmIHRoZSBvbmUgd2UgbW9kaWZpZWQgY2hhbmdlZAorICAgKiBsZW5ndGgpLiBCdXQgdGhpcyBoYWNrIGlzIGEgc3RhcnQuCisgICAqLworICBfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKGhlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgb2YgYSBmaWVsZCB3aXRoIGJhc2ljIHR5cGUuIElmIHRoZSBmaWVsZAorICogZG9lc24ndCBleGlzdCwgcmV0dXJucyAjRkFMU0UsIG90aGVyd2lzZSByZXR1cm5zICNUUlVFLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBnZXQKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBhcyBmb3IgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljKCkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZmllbGQgZG9lc24ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoREJ1c0hlYWRlciAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgIT0gREJVU19IRUFERVJfRklFTERfSU5WQUxJRCk7CisgIF9kYnVzX2Fzc2VydCAoZmllbGQgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW2ZpZWxkXS5jb2RlID09IGZpZWxkKTsKKyAgLyogaW4gbGlnaHQgb2YgdGhpcyB5b3UgbWlnaHQgYXNrIHdoeSB0aGUgdHlwZSBpcyBwYXNzZWQgaW47CisgICAqIHRoZSBvbmx5IHJhdGlvbmFsZSBJIGNhbiB0aGluayBvZiBpcyBzbyB0aGUgY2FsbGVyIGhhcworICAgKiB0byBzcGVjaWZ5IGl0cyBleHBlY3RhdGlvbiBhbmQgYnJlYWtzIGlmIHdlIGNoYW5nZSBpdAorICAgKi8KKyAgX2RidXNfYXNzZXJ0ICh0eXBlID09IEVYUEVDVEVEX1RZUEVfT0ZfRklFTEQgKGZpZWxkKSk7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKGhlYWRlciwgZmllbGQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MgPj0gMCk7CisKKyAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUsIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSByYXcgbWFyc2hhbGVkIGRhdGEgZm9yIGEgZmllbGQuIElmIHRoZSBmaWVsZCBkb2Vzbid0CisgKiBleGlzdCwgcmV0dXJucyAjRkFMU0UsIG90aGVyd2lzZSByZXR1cm5zICNUUlVFLiAgUmV0dXJucyB0aGUgc3RhcnQKKyAqIG9mIHRoZSBtYXJzaGFsZWQgZGF0YSwgaS5lLiB1c3VhbGx5IHRoZSBieXRlIHdoZXJlIHRoZSBsZW5ndGgKKyAqIHN0YXJ0cyAoZm9yIHN0cmluZ3MgYW5kIGFycmF5cykgb3IgZm9yIGJhc2ljIHR5cGVzIGp1c3QgdGhlIHZhbHVlCisgKiBpdHNlbGYuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGdldAorICogQHBhcmFtIHN0ciByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBkYXRhIHN0cmluZworICogQHBhcmFtIHBvcyByZXR1cm4gbG9jYXRpb24gZm9yIHN0YXJ0IG9mIGZpZWxkIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3IChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpwb3MpCit7CisgIGlmICghX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHN0cikKKyAgICAqc3RyID0gJmhlYWRlci0+ZGF0YTsKKyAgaWYgKHBvcykKKyAgICAqcG9zID0gaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvczsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEZWxldGVzIGEgZmllbGQsIGlmIGl0IGV4aXN0cy4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gZGVsZXRlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfZGVsZXRlX2ZpZWxkIChEQnVzSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBmaWVsZCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3Jvb3Q7CisKKyAgaWYgKF9kYnVzX2hlYWRlcl9jYWNoZV9rbm93bl9ub25leGlzdGVudCAoaGVhZGVyLCBmaWVsZCkpCisgICAgcmV0dXJuIFRSVUU7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAvKiBTY2FuIHRvIHRoZSBmaWVsZCB3ZSB3YW50LCBkZWxldGUgYW5kIHJlYWxpZ24sIHJlYXBwZW5kCisgICAqIHBhZGRpbmcuIEZpZWxkIG1heSB0dXJuIG91dCBub3QgdG8gZXhpc3QuCisgICAqLworICBpZiAoIWZpbmRfZmllbGRfZm9yX21vZGlmaWNhdGlvbiAoaGVhZGVyLCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZyZWFsaWduX3Jvb3QpKQorICAgIHJldHVybiBUUlVFOyAvKiBub3RoaW5nIHRvIGRvICovCisKKyAgaWYgKCFyZXNlcnZlX2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX2RlbGV0ZSAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsaWduX3Jvb3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpOworCisgIF9kYnVzX2hlYWRlcl9jYWNoZV9pbnZhbGlkYXRlX2FsbCAoaGVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKGhlYWRlciwgZmllbGQpKTsgLyogRXhwZW5zaXZlIGFzc2VydGlvbiAuLi4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBUb2dnbGVzIGEgbWVzc2FnZSBmbGFnIGJpdCwgdHVybmluZyBvbiB0aGUgYml0IGlmIHZhbHVlID0gVFJVRSBhbmQKKyAqIGZsaXBwaW5nIGl0IG9mZiBpZiB2YWx1ZSA9IEZBTFNFLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZsYWcgdGhlIG1lc3NhZ2UgZmxhZyB0byB0b2dnbGUKKyAqIEBwYXJhbSB2YWx1ZSB0b2dnbGUgb24gb3Igb2ZmCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl90b2dnbGVfZmxhZyAoREJ1c0hlYWRlciAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICB2YWx1ZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqZmxhZ3NfcDsKKworICBmbGFnc19wID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoJmhlYWRlci0+ZGF0YSwgRkxBR1NfT0ZGU0VULCAxKTsKKworICBpZiAodmFsdWUpCisgICAgKmZsYWdzX3AgfD0gZmxhZzsKKyAgZWxzZQorICAgICpmbGFnc19wICY9IH5mbGFnOworfQorCisvKioKKyAqIEdldHMgYSBtZXNzYWdlIGZsYWcgYml0LCByZXR1cm5pbmcgVFJVRSBpZiB0aGUgYml0IGlzIHNldC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmbGFnIHRoZSBtZXNzYWdlIGZsYWcgdG8gZ2V0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZmxhZyBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9nZXRfZmxhZyAoREJ1c0hlYWRlciAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgZmxhZykKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZmxhZ3NfcDsKKworICBmbGFnc19wID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoJmhlYWRlci0+ZGF0YSwgRkxBR1NfT0ZGU0VULCAxKTsKKworICByZXR1cm4gKCpmbGFnc19wICYgZmxhZykgIT0gMDsKK30KKworLyoqCisgKiBTd2FwcyB0aGUgaGVhZGVyIGludG8gdGhlIGdpdmVuIG9yZGVyIGlmIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIG5ld19vcmRlciB0aGUgbmV3IGJ5dGUgb3JkZXIKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX2J5dGVzd2FwIChEQnVzSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5ld19vcmRlcikKK3sKKyAgY2hhciBieXRlX29yZGVyOworCisgIGJ5dGVfb3JkZXIgPSBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlcik7CisKKyAgaWYgKGJ5dGVfb3JkZXIgPT0gbmV3X29yZGVyKQorICAgIHJldHVybjsKKworICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICgmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwgMCk7CisKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlICgmaGVhZGVyLT5kYXRhLCBCWVRFX09SREVSX09GRlNFVCwgbmV3X29yZGVyKTsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuaCBiL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtaGVhZGVyLmggIE1hbmFnaW5nIG1hcnNoYWxpbmcvZGVtYXJzaGFsaW5nIG9mIG1lc3NhZ2UgaGVhZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfSEVBREVSX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0hFQURFUl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3R5cGVkZWYgc3RydWN0IERCdXNIZWFkZXIgICAgICBEQnVzSGVhZGVyOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0hlYWRlckZpZWxkIERCdXNIZWFkZXJGaWVsZDsKKworI2RlZmluZSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfVU5LTk9XTiAtMQorI2RlZmluZSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQgLTIKKworLyoqCisgKiBDYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBoZWFkZXIgZmllbGQgaW4gdGhlIG1lc3NhZ2UKKyAqLworc3RydWN0IERCdXNIZWFkZXJGaWVsZAoreworICBpbnQgICAgICAgICAgICB2YWx1ZV9wb3M7IC8qKjwgUG9zaXRpb24gb2YgZmllbGQgdmFsdWUsIG9yIC0xLy0yICovCit9OworCisvKioKKyAqIE1lc3NhZ2UgaGVhZGVyIGRhdGEgYW5kIHNvbWUgY2FjaGVkIGRldGFpbHMgb2YgaXQuCisgKi8KK3N0cnVjdCBEQnVzSGVhZGVyCit7CisgIERCdXNTdHJpbmcgZGF0YTsgLyoqPCBIZWFkZXIgbmV0d29yayBkYXRhLCBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgKiBzZXBhcmF0ZWx5IGZyb20gYm9keSBzbyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgKiBpbmRlcGVuZGVudGx5IHJlYWxsb2MgaXQuCisgICAgICAgICAgICAgICAgICAgICovCisKKyAgREJ1c0hlYWRlckZpZWxkIGZpZWxkc1tEQlVTX0hFQURFUl9GSUVMRF9MQVNUICsgMV07IC8qKjwgVHJhY2sgdGhlIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBlYWNoIGZpZWxkIGluIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgZGJ1c191aW50MzJfdCBwYWRkaW5nIDogMzsgICAgICAgIC8qKjwgYnl0ZXMgb2YgYWxpZ25tZW50IGluIGhlYWRlciAqLworICBkYnVzX3VpbnQzMl90IGJ5dGVfb3JkZXIgOiA4OyAgICAgLyoqPCBieXRlIG9yZGVyIG9mIGhlYWRlciAqLworfTsKKworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfaW5pdCAgICAgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9mcmVlICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX3JlaW5pdCAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfY3JlYXRlICAgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVycm9yX25hbWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfY29weSAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c0hlYWRlciAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIZWFkZXIgICAgICAgICpkZXN0KTsKK2ludCAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBzZXJpYWwpOworZGJ1c191aW50MzJfdCBfZGJ1c19oZWFkZXJfZ2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl91cGRhdGVfbGVuZ3RocyAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJvZHlfbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIHZhbHVlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2dldF9mbGFnICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgZmxhZyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9lbnN1cmVfc2lnbmF0dXJlICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnR5cGVfcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQgKGludCAgICAgICAgICAgICAgICBtYXhfbWVzc2FnZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9sb2FkICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9ieXRlc3dhcCAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG5ld19vcmRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjaGFyICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAgICAgICAgIChjb25zdCBEQnVzSGVhZGVyICAqaGVhZGVyKTsKKworCisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfSEVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzI2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCkBAIC0wLDAgKzEsMzU1NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyAgV291bGQgYmUgaW4gZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jLCBidXQgb25seSB1c2VkIGluIGJ1cy90ZXN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHZvaWQKK2Jhc2ljX3ZhbHVlX3plcm8gKERCdXNCYXNpY1ZhbHVlICp2YWx1ZSkKK3sKKyAgdmFsdWUtPnU2NCA9IDA7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYmFzaWNfdmFsdWVfZXF1YWwgKGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICpsaHMsCisgICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKnJocykKK3sKKyAgaWYgKHR5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgdHlwZSA9PSBEQlVTX1RZUEVfU0lHTkFUVVJFIHx8CisgICAgICB0eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkKKyAgICB7CisgICAgICByZXR1cm4gc3RyY21wIChsaHMtPnN0ciwgcmhzLT5zdHIpID09IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIGxocy0+dTY0ID09IHJocy0+dTY0OworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitlcXVhbF92YWx1ZXNfaGVscGVyIChEQnVzVHlwZVJlYWRlciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJocykKK3sKKyAgaW50IGxoc190eXBlOworICBpbnQgcmhzX3R5cGU7CisKKyAgbGhzX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChsaHMpOworICByaHNfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJocyk7CisKKyAgaWYgKGxoc190eXBlICE9IHJoc190eXBlKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGhzX3R5cGUgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGRidXNfdHlwZV9pc19iYXNpYyAobGhzX3R5cGUpKQorICAgIHsKKyAgICAgIERCdXNCYXNpY1ZhbHVlIGxoc192YWx1ZTsKKyAgICAgIERCdXNCYXNpY1ZhbHVlIHJoc192YWx1ZTsKKworICAgICAgYmFzaWNfdmFsdWVfemVybyAoJmxoc192YWx1ZSk7CisgICAgICBiYXNpY192YWx1ZV96ZXJvICgmcmhzX3ZhbHVlKTsKKyAgICAgIAorICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAobGhzLCAmbGhzX3ZhbHVlKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJocywgJnJoc192YWx1ZSk7CisKKyAgICAgIHJldHVybiBiYXNpY192YWx1ZV9lcXVhbCAobGhzX3R5cGUsICZsaHNfdmFsdWUsICZyaHNfdmFsdWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIGxoc19zdWI7CisgICAgICBEQnVzVHlwZVJlYWRlciByaHNfc3ViOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChsaHMsICZsaHNfc3ViKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJocywgJnJoc19zdWIpOworCisgICAgICByZXR1cm4gZXF1YWxfdmFsdWVzX2hlbHBlciAoJmxoc19zdWIsICZyaHNfc3ViKTsKKyAgICB9Cit9CisKKy8qKgorICogU2VlIHdoZXRoZXIgdGhlIHR3byByZWFkZXJzIHBvaW50IHRvIGlkZW50aWNhbCBkYXRhIGJsb2Nrcy4KKyAqCisgKiBAcGFyYW0gbGhzIHJlYWRlciAxCisgKiBAcGFyYW0gcmhzIHJlYWRlciAyCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZGF0YSBibG9ja3MgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfcmVhZGVyX2VxdWFsX3ZhbHVlcyAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJocykKK3sKKyAgREJ1c1R5cGVSZWFkZXIgY29weV9saHMgPSAqbGhzOworICBEQnVzVHlwZVJlYWRlciBjb3B5X3JocyA9ICpyaHM7CisKKyAgcmV0dXJuIGVxdWFsX3ZhbHVlc19oZWxwZXIgKCZjb3B5X2xocywgJmNvcHlfcmhzKTsKK30KKworLyogVEVTVFMgKi8KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIFdoZXRoZXIgdG8gZG8gdGhlIE9PTSBzdHVmZiAob25seSB3aXRoIG90aGVyIGV4cGVuc2l2ZSB0ZXN0cykgKi8KKyNkZWZpbmUgVEVTVF9PT01fSEFORExJTkcgMAorLyogV2UgZG8gc3RhcnQgb2Zmc2V0IDAgdGhyb3VnaCA5LCB0byBnZXQgdmFyaW91cyBhbGlnbm1lbnQgY2FzZXMuIFN0aWxsIHRoaXMKKyAqIG9idmlvdXNseSBtYWtlcyB0aGUgdGVzdCBzdWl0ZSBydW4gMTB4IGFzIHNsb3cuCisgKi8KKyNkZWZpbmUgTUFYX0lOSVRJQUxfT0ZGU0VUIDkKKworLyogTGFyZ2VzdCBpdGVyYXRpb24gY291bnQgdG8gdGVzdCBjb3B5aW5nLCByZWFsaWdubWVudCwKKyAqIGV0Yy4gd2l0aC4gaS5lLiB3ZSBvbmx5IHRlc3QgdGhpcyBzdHVmZiB3aXRoIHNvbWUgb2YgdGhlIHNtYWxsZXIKKyAqIGRhdGEgc2V0cy4KKyAqLworI2RlZmluZSBNQVhfSVRFUkFUSU9OU19GT1JfRVhQRU5TSVZFX1RFU1RTIDEwMDAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IGJ5dGVfb3JkZXI7CisgIGludCBpbml0aWFsX29mZnNldDsKKyAgREJ1c1N0cmluZyBzaWduYXR1cmU7CisgIERCdXNTdHJpbmcgYm9keTsKK30gRGF0YUJsb2NrOworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgc2F2ZWRfc2lnX2xlbjsKKyAgaW50IHNhdmVkX2JvZHlfbGVuOworfSBEYXRhQmxvY2tTdGF0ZTsKKworI2RlZmluZSBOX0ZFTkNFX0JZVEVTIDUKKyNkZWZpbmUgRkVOQ0VfQllURVNfU1RSICJhYmNkZSIKKyNkZWZpbmUgSU5JVElBTF9QQURESU5HX0JZVEUgJ1wwJworCitzdGF0aWMgZGJ1c19ib29sX3QKK2RhdGFfYmxvY2tfaW5pdCAoRGF0YUJsb2NrICpibG9jaywKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGluaXRpYWxfb2Zmc2V0KQoreworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYmxvY2stPnNpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZibG9jay0+Ym9keSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+c2lnbmF0dXJlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmYmxvY2stPnNpZ25hdHVyZSwgMCwgaW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVElBTF9QQURESU5HX0JZVEUpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoJmJsb2NrLT5ib2R5LCAwLCBpbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMX1BBRERJTkdfQllURSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYmxvY2stPnNpZ25hdHVyZSwgRkVOQ0VfQllURVNfU1RSKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZibG9jay0+Ym9keSwgRkVOQ0VfQllURVNfU1RSKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5zaWduYXR1cmUpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+Ym9keSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJsb2NrLT5ieXRlX29yZGVyID0gYnl0ZV9vcmRlcjsKKyAgYmxvY2stPmluaXRpYWxfb2Zmc2V0ID0gaW5pdGlhbF9vZmZzZXQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX3NhdmUgKERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgRGF0YUJsb2NrU3RhdGUgKnN0YXRlKQoreworICBzdGF0ZS0+c2F2ZWRfc2lnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBOX0ZFTkNFX0JZVEVTOworICBzdGF0ZS0+c2F2ZWRfYm9keV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVM7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX3Jlc3RvcmUgKERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrU3RhdGUgKnN0YXRlKQoreworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnNhdmVkX3NpZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBzdGF0ZS0+c2F2ZWRfc2lnX2xlbiAtIE5fRkVOQ0VfQllURVMpOworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5zYXZlZF9ib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBzdGF0ZS0+c2F2ZWRfYm9keV9sZW4gLSBOX0ZFTkNFX0JZVEVTKTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfdmVyaWZ5IChEYXRhQmxvY2sgKmJsb2NrKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFTkNFX0JZVEVTX1NUUikpCisgICAgeworICAgICAgaW50IG9mZnNldDsKKworICAgICAgb2Zmc2V0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVMgLSA4OworICAgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIG9mZnNldCk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJibG9jayBkaWQgbm90IHZlcmlmeTogYmFkIGJ5dGVzIGF0IGVuZCBvZiBzaWduYXR1cmUiKTsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFTkNFX0JZVEVTX1NUUikpCisgICAgeworICAgICAgaW50IG9mZnNldDsKKworICAgICAgb2Zmc2V0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTIC0gODsKKyAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICBvZmZzZXQgPSAwOworCisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIG9mZnNldCk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJibG9jayBkaWQgbm90IHZlcmlmeTogYmFkIGJ5dGVzIGF0IGVuZCBvZiBib2R5Iik7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYmxvY2stPmluaXRpYWxfb2Zmc2V0KSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJsb2NrLT5pbml0aWFsX29mZnNldCkpOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja19mcmVlIChEYXRhQmxvY2sgKmJsb2NrKQoreworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPnNpZ25hdHVyZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPmJvZHkpOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja19yZXNldCAoRGF0YUJsb2NrICpibG9jaykKK3sKKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKKworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gTl9GRU5DRV9CWVRFUyAtIGJsb2NrLT5pbml0aWFsX29mZnNldCk7CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVMgLSBibG9jay0+aW5pdGlhbF9vZmZzZXQpOworCisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlcikKK3sKKyAgaWYgKHJlYWRlcikKKyAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0IChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQpOworCisgIGlmICh3cml0ZXIpCisgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdCAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBOX0ZFTkNFX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVMpOworfQorCitzdGF0aWMgdm9pZAorcmVhbF9jaGVja19leHBlY3RlZF90eXBlIChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmdW5jbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxpbmUpCit7CisgIGludCB0OworCisgIHQgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpOworCisgIGlmICh0ICE9IGV4cGVjdGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJSZWFkIHR5cGUgJXMgd2hpbGUgZXhwZWN0aW5nICVzIGF0ICVzIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCksCisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgZnVuY25hbWUsIGxpbmUpOworCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyZWFkIHdyb25nIHR5cGUiKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgY2hlY2tfZXhwZWN0ZWRfdHlwZShyZWFkZXIsIGV4cGVjdGVkKSByZWFsX2NoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgZXhwZWN0ZWQsIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKQorCisjZGVmaW5lIE5FWFRfRVhQRUNUSU5HX1RSVUUocmVhZGVyKSAgZG8geyBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcikpICAgICAgICAgXAorIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuICgiX2RidXNfdHlwZV9yZWFkZXJfbmV4dCgpIHNob3VsZCBoYXZlIHJldHVybmVkIFRSVUUgYXQgJXMgJWRcbiIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5FWFRfRVhQRUNUSU5HX0ZBTFNFKHJlYWRlcikgZG8geyBpZiAoX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKSkgICAgICAgICAgXAorIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuICgiX2RidXNfdHlwZV9yZWFkZXJfbmV4dCgpIHNob3VsZCBoYXZlIHJldHVybmVkIEZBTFNFIGF0ICVzICVkXG4iLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfSU5WQUxJRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlICAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlOwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlQ2xhc3MgICAgICAgICAgVGVzdFR5cGVOb2RlQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXIgICAgICBUZXN0VHlwZU5vZGVDb250YWluZXI7Cit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXJDbGFzcyBUZXN0VHlwZU5vZGVDb250YWluZXJDbGFzczsKKworc3RydWN0IFRlc3RUeXBlTm9kZQoreworICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqa2xhc3M7Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyCit7CisgIFRlc3RUeXBlTm9kZSBiYXNlOworICBEQnVzTGlzdCAgICAqY2hpbGRyZW47Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ2xhc3MKK3sKKyAgaW50IHR5cGVjb2RlOworCisgIGludCBpbnN0YW5jZV9zaXplOworCisgIGludCBzdWJjbGFzc19kZXRhaWw7IC8qIGEgYmFkIGhhY2sgdG8gYXZvaWQgYSBidW5jaCBvZiBzdWJjbGFzcyBjYXN0aW5nICovCisKKyAgZGJ1c19ib29sX3QgICAoKiBjb25zdHJ1Y3QpICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUpOworICB2b2lkICAgICAgICAgICgqIGRlc3Ryb3kpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSk7CisKKyAgZGJ1c19ib29sX3QgKCogd3JpdGVfdmFsdWUpICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiByZWFkX3ZhbHVlKSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiBzZXRfdmFsdWUpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiBidWlsZF9zaWduYXR1cmUpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CisgIGRidXNfYm9vbF90ICgqIHdyaXRlX211bHRpKSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworICBkYnVzX2Jvb2xfdCAoKiByZWFkX211bHRpKSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyQ2xhc3MKK3sKKyAgVGVzdFR5cGVOb2RlQ2xhc3MgYmFzZTsKK307CisKKy8qIEZJWE1FIHRoaXMgY291bGQgYmUgY2hpbGxlZCBvdXQgc3Vic3RhbnRpYWxseSBieSB1bmlmeWluZworICogdGhlIGJhc2ljIHR5cGVzIGludG8gYmFzaWNfd3JpdGVfdmFsdWUvYmFzaWNfcmVhZF92YWx1ZQorICogYW5kIGJ5IG1lcmdpbmcgcmVhZF92YWx1ZSBhbmQgc2V0X3ZhbHVlIGludG8gb25lIGZ1bmN0aW9uCisgKiB0YWtpbmcgYSBmbGFnIGFyZ3VtZW50LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfd3JpdGVfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl9yZWFkX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl9zZXRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl93cml0ZV9tdWx0aSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfcmVhZF9tdWx0aSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3dyaXRlX211bHRpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl9yZWFkX211bHRpICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworc3RhdGljIGRidXNfYm9vbF90IGludDY0X3dyaXRlX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50NjRfcmVhZF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50NjRfc2V0X3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RyaW5nX3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJpbmdfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJpbmdfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBib29sX3dyaXRlX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJvb2xfcmVhZF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJvb2xfc2V0X3ZhbHVlICAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJ5dGVfd3JpdGVfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYnl0ZV9yZWFkX3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYnl0ZV9zZXRfdmFsdWUgICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZG91YmxlX3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkb3VibGVfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkb3VibGVfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBvYmplY3RfcGF0aF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IG9iamVjdF9wYXRoX3JlYWRfdmFsdWUgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IG9iamVjdF9wYXRoX3NldF92YWx1ZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHNpZ25hdHVyZV93cml0ZV92YWx1ZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnbmF0dXJlX3JlYWRfdmFsdWUgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnbmF0dXJlX3NldF92YWx1ZSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RydWN0X3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3RfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3Rfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3RfYnVpbGRfc2lnbmF0dXJlICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpOworc3RhdGljIGRidXNfYm9vbF90IGRpY3Rfd3JpdGVfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9yZWFkX3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9zZXRfdmFsdWUgICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9idWlsZF9zaWduYXR1cmUgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheV93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X2J1aWxkX3NpZ25hdHVyZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CitzdGF0aWMgZGJ1c19ib29sX3QgdmFyaWFudF93cml0ZV92YWx1ZSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2YXJpYW50X3JlYWRfdmFsdWUgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2YXJpYW50X3NldF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyB2b2lkICAgICAgICBjb250YWluZXJfZGVzdHJveSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUpOworCisKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGludDE2X2NsYXNzID0geworICBEQlVTX1RZUEVfSU5UMTYsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfdmFsdWUsCisgIGludDE2X3JlYWRfdmFsdWUsCisgIGludDE2X3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfbXVsdGksCisgIGludDE2X3JlYWRfbXVsdGkKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyB1aW50MTZfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9VSU5UMTYsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfdmFsdWUsIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBpbnQxNl9yZWFkX3ZhbHVlLCAgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCisgIGludDE2X3NldF92YWx1ZSwgICAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfbXVsdGksIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBpbnQxNl9yZWFkX211bHRpICAgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgaW50MzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9JTlQzMiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQzMl93cml0ZV92YWx1ZSwKKyAgaW50MzJfcmVhZF92YWx1ZSwKKyAgaW50MzJfc2V0X3ZhbHVlLAorICBOVUxMLAorICBpbnQzMl93cml0ZV9tdWx0aSwKKyAgaW50MzJfcmVhZF9tdWx0aQorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHVpbnQzMl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1VJTlQzMiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQzMl93cml0ZV92YWx1ZSwgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIGludDMyX3JlYWRfdmFsdWUsICAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KKyAgaW50MzJfc2V0X3ZhbHVlLCAgIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworICBOVUxMLAorICBpbnQzMl93cml0ZV9tdWx0aSwgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIGludDMyX3JlYWRfbXVsdGkgICAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBpbnQ2NF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0lOVDY0LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDY0X3dyaXRlX3ZhbHVlLAorICBpbnQ2NF9yZWFkX3ZhbHVlLAorICBpbnQ2NF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgdWludDY0X2NsYXNzID0geworICBEQlVTX1RZUEVfVUlOVDY0LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDY0X3dyaXRlX3ZhbHVlLCAvKiByZWN5Y2xlIGZyb20gaW50NjQgKi8KKyAgaW50NjRfcmVhZF92YWx1ZSwgIC8qIHJlY3ljbGUgZnJvbSBpbnQ2NCAqLworICBpbnQ2NF9zZXRfdmFsdWUsICAgLyogcmVjeWNsZSBmcm9tIGludDY0ICovCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzBfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMSwgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCisvKiB3aXRoIG51bCwgYSBsZW4gMyBzdHJpbmcgc2hvdWxkIGZpbGwgNCBieXRlcyBhbmQgdGh1cyBpcyAic3BlY2lhbCIgKi8KK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJpbmdfM19jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUklORywKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAzLCAvKiBzdHJpbmcgbGVuZ3RoICovCisgIE5VTEwsCisgIE5VTEwsCisgIHN0cmluZ193cml0ZV92YWx1ZSwKKyAgc3RyaW5nX3JlYWRfdmFsdWUsCisgIHN0cmluZ19zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKKy8qIHdpdGggbnVsLCBhIGxlbiA4IHN0cmluZyBzaG91bGQgZmlsbCA5IGJ5dGVzIGFuZCB0aHVzIGlzICJzcGVjaWFsIiAoZmFyLWZldGNoZWQgSSBzdXBwb3NlKSAqLworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cmluZ184X2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSSU5HLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDgsIC8qIHN0cmluZyBsZW5ndGggKi8KKyAgTlVMTCwKKyAgTlVMTCwKKyAgc3RyaW5nX3dyaXRlX3ZhbHVlLAorICBzdHJpbmdfcmVhZF92YWx1ZSwKKyAgc3RyaW5nX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGJvb2xfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9CT09MRUFOLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGJvb2xfd3JpdGVfdmFsdWUsCisgIGJvb2xfcmVhZF92YWx1ZSwKKyAgYm9vbF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYnl0ZV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0JZVEUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgYnl0ZV93cml0ZV92YWx1ZSwKKyAgYnl0ZV9yZWFkX3ZhbHVlLAorICBieXRlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBkb3VibGVfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9ET1VCTEUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgZG91YmxlX3dyaXRlX3ZhbHVlLAorICBkb3VibGVfcmVhZF92YWx1ZSwKKyAgZG91YmxlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBvYmplY3RfcGF0aF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIG9iamVjdF9wYXRoX3dyaXRlX3ZhbHVlLAorICBvYmplY3RfcGF0aF9yZWFkX3ZhbHVlLAorICBvYmplY3RfcGF0aF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzaWduYXR1cmVfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgc2lnbmF0dXJlX3dyaXRlX3ZhbHVlLAorICBzaWduYXR1cmVfcmVhZF92YWx1ZSwKKyAgc2lnbmF0dXJlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cnVjdF8xX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSVUNULAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDEsIC8qIG51bWJlciBvZiB0aW1lcyBjaGlsZHJlbiBhcHBlYXIgYXMgZmllbGRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBzdHJ1Y3Rfd3JpdGVfdmFsdWUsCisgIHN0cnVjdF9yZWFkX3ZhbHVlLAorICBzdHJ1Y3Rfc2V0X3ZhbHVlLAorICBzdHJ1Y3RfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RydWN0XzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJVQ1QsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMiwgLyogbnVtYmVyIG9mIHRpbWVzIGNoaWxkcmVuIGFwcGVhciBhcyBmaWVsZHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIHN0cnVjdF93cml0ZV92YWx1ZSwKKyAgc3RydWN0X3JlYWRfdmFsdWUsCisgIHN0cnVjdF9zZXRfdmFsdWUsCisgIHN0cnVjdF9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBkaWN0XzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwgLyogdGhpcyBpcyBjb3JyZWN0LCBhIGRpY3QgaXMgYW4gYXJyYXkgb2YgZGljdCBlbnRyeSAqLworICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDEsIC8qIG51bWJlciBvZiBlbnRyaWVzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBkaWN0X3dyaXRlX3ZhbHVlLAorICBkaWN0X3JlYWRfdmFsdWUsCisgIGRpY3Rfc2V0X3ZhbHVlLAorICBkaWN0X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGRidXNfYm9vbF90IGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBGQUxTRTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzBfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAwLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAxLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAyLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzlfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICA5LCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHZhcmlhbnRfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9WQVJJQU5ULAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDAsCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICB2YXJpYW50X3dyaXRlX3ZhbHVlLAorICB2YXJpYW50X3JlYWRfdmFsdWUsCisgIHZhcmlhbnRfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MqIGNvbnN0CitiYXNpY19ub2Rlc1tdID0geworICAmaW50MTZfY2xhc3MsCisgICZ1aW50MTZfY2xhc3MsCisgICZpbnQzMl9jbGFzcywKKyAgJnVpbnQzMl9jbGFzcywKKyAgJmludDY0X2NsYXNzLAorICAmdWludDY0X2NsYXNzLAorICAmYm9vbF9jbGFzcywKKyAgJmJ5dGVfY2xhc3MsCisgICZkb3VibGVfY2xhc3MsCisgICZzdHJpbmdfMF9jbGFzcywKKyAgJnN0cmluZ18xX2NsYXNzLAorICAmc3RyaW5nXzNfY2xhc3MsCisgICZzdHJpbmdfOF9jbGFzcywKKyAgJm9iamVjdF9wYXRoX2NsYXNzLAorICAmc2lnbmF0dXJlX2NsYXNzCit9OworI2RlZmluZSBOX0JBU0lDUyAoX0RCVVNfTl9FTEVNRU5UUyAoYmFzaWNfbm9kZXMpKQorCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MqIGNvbnN0Citjb250YWluZXJfbm9kZXNbXSA9IHsKKyAgJnN0cnVjdF8xX2NsYXNzLAorICAmYXJyYXlfMV9jbGFzcywKKyAgJnN0cnVjdF8yX2NsYXNzLAorICAmYXJyYXlfMF9jbGFzcywKKyAgJmFycmF5XzJfY2xhc3MsCisgICZ2YXJpYW50X2NsYXNzLAorICAmZGljdF8xX2NsYXNzIC8qIGxhc3Qgc2luY2Ugd2Ugd2FudCBzdHJ1Y3QgYW5kIGFycmF5IGJlZm9yZSBpdCAqLworICAvKiBhcnJheV85X2NsYXNzIGlzIG9taXR0ZWQgb24gcHVycG9zZSwgaXQncyB0b28gc2xvdzsKKyAgICogd2Ugb25seSB1c2UgaXQgaW4gb25lIGhhcmRjb2RlZCB0ZXN0IGJlbG93CisgICAqLworfTsKKyNkZWZpbmUgTl9DT05UQUlORVJTIChfREJVU19OX0VMRU1FTlRTIChjb250YWluZXJfbm9kZXMpKQorCitzdGF0aWMgVGVzdFR5cGVOb2RlKgorbm9kZV9uZXcgKGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICprbGFzcykKK3sKKyAgVGVzdFR5cGVOb2RlICpub2RlOworCisgIG5vZGUgPSBkYnVzX21hbGxvYzAgKGtsYXNzLT5pbnN0YW5jZV9zaXplKTsKKyAgaWYgKG5vZGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBub2RlLT5rbGFzcyA9IGtsYXNzOworCisgIGlmIChrbGFzcy0+Y29uc3RydWN0KQorICAgIHsKKyAgICAgIGlmICghKCoga2xhc3MtPmNvbnN0cnVjdCkgKG5vZGUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChub2RlKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQKK25vZGVfZGVzdHJveSAoVGVzdFR5cGVOb2RlICpub2RlKQoreworICBpZiAobm9kZS0+a2xhc3MtPmRlc3Ryb3kpCisgICAgKCogbm9kZS0+a2xhc3MtPmRlc3Ryb3kpIChub2RlKTsKKyAgZGJ1c19mcmVlIChub2RlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9ICgqIG5vZGUtPmtsYXNzLT53cml0ZV92YWx1ZSkgKG5vZGUsIGJsb2NrLCB3cml0ZXIsIHNlZWQpOworCisjaWYgMAorICAvKiBIYW5keSB0byBzZWUgd2hlcmUgdGhpbmdzIGJyZWFrLCBidXQgdG9vIGV4cGVuc2l2ZSB0byBkbyBhbGwgdGhlIHRpbWUgKi8KKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIERCdXNUeXBlUmVhZGVyIHJlc3RvcmVkOyAqLworCisgIGlmICghKCogbm9kZS0+a2xhc3MtPnJlYWRfdmFsdWUpIChub2RlLCByZWFkZXIsIHNlZWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogV2FybmluZzogaWYgdGhpcyBvbmUgZmFpbHMgZHVlIHRvIE9PTSwgaXQgaGFzIHNpZGUgZWZmZWN0cyAoY2FuCisgKiBtb2RpZnkgb25seSBzb21lIG9mIHRoZSBzdWItdmFsdWVzKS4gT0sgaW4gYSB0ZXN0IHN1aXRlLCBidXQgd2UKKyAqIG5ldmVyIGRvIHRoaXMgaW4gcmVhbCBjb2RlLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGlmICghKCogbm9kZS0+a2xhc3MtPnNldF92YWx1ZSkgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKnN0cikKK3sKKyAgaWYgKG5vZGUtPmtsYXNzLT5idWlsZF9zaWduYXR1cmUpCisgICAgcmV0dXJuICgqIG5vZGUtPmtsYXNzLT5idWlsZF9zaWduYXR1cmUpIChub2RlLCBzdHIpOworICBlbHNlCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfYXBwZW5kX2NoaWxkIChUZXN0VHlwZU5vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKworICBfZGJ1c19hc3NlcnQgKG5vZGUtPmtsYXNzLT5pbnN0YW5jZV9zaXplID49IChpbnQpIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSk7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGNoaWxkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsgLyogd2UgbmV2ZXIgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvbiBub2RlX2FwcGVuZF9jaGlsZCBhbnlob3cgLSBpdCdzIHJ1biBmcm9tIG91dHNpZGUgdGhlIG1hbGxvYy1mYWlsdXJlIHRlc3QgY29kZSAqLworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfd3JpdGVfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5fY29waWVzKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChub2RlLT5rbGFzcy0+d3JpdGVfbXVsdGkgIT0gTlVMTCk7CisgIHJldHZhbCA9ICgqIG5vZGUtPmtsYXNzLT53cml0ZV9tdWx0aSkgKG5vZGUsIGJsb2NrLCB3cml0ZXIsIHNlZWQsIG5fY29waWVzKTsKKworI2lmIDAKKyAgLyogSGFuZHkgdG8gc2VlIHdoZXJlIHRoaW5ncyBicmVhaywgYnV0IHRvbyBleHBlbnNpdmUgdG8gZG8gYWxsIHRoZSB0aW1lICovCisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisjZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfcmVhZF9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbl9jb3BpZXMpCit7CisgIF9kYnVzX2Fzc2VydCAobm9kZS0+a2xhc3MtPnJlYWRfbXVsdGkgIT0gTlVMTCk7CisKKyAgaWYgKCEoKiBub2RlLT5rbGFzcy0+cmVhZF9tdWx0aSkgKG5vZGUsIHJlYWRlciwgc2VlZCwgbl9jb3BpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsID0gMDsKK3N0YXRpYyBpbnQgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgPSAwOworc3RhdGljIGludCBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAgICpzaWduYXR1cmU7CisgIERhdGFCbG9jayAgICAgICAgICAqYmxvY2s7CisgIGludCAgICAgICAgICAgICAgICAgdHlwZV9vZmZzZXQ7CisgIFRlc3RUeXBlTm9kZSAgICAgICoqbm9kZXM7CisgIGludCAgICAgICAgICAgICAgICAgbl9ub2RlczsKK30gTm9kZUl0ZXJhdGlvbkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3RfY29weSAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgRGF0YUJsb2NrICpzcmM7CisgIERhdGFCbG9jayBkZXN0OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworCisgIHNyYyA9IG5pZC0+YmxvY2s7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFkYXRhX2Jsb2NrX2luaXQgKCZkZXN0LCBzcmMtPmJ5dGVfb3JkZXIsIHNyYy0+aW5pdGlhbF9vZmZzZXQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoc3JjLCAmcmVhZGVyLCBOVUxMKTsKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKCZkZXN0LCBOVUxMLCAmd3JpdGVyKTsKKworICAvKiBEQnVzVHlwZVdyaXRlciBhc3N1bWVzIGl0J3Mgd3JpdGluZyBpbnRvIGFuIGV4aXN0aW5nIHNpZ25hdHVyZSwKKyAgICogc28gZG9lc24ndCBhZGQgbnVsIG9uIGl0cyBvd24uIFdlIGhhdmUgdG8gZG8gdGhhdC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICgmZGVzdC5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmluaXRpYWxfb2Zmc2V0LCAnXDAnKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlciAoJndyaXRlciwgJnJlYWRlcikpCisgICAgZ290byBvdXQ7CisKKyAgLyogRGF0YSBibG9ja3Mgc2hvdWxkIG5vdyBiZSBpZGVudGljYWwgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZzcmMtPnNpZ25hdHVyZSwgJmRlc3Quc2lnbmF0dXJlKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU09VUkNFXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3JjLT5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzcmMtPnNpZ25hdHVyZSkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkRFU1RcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZkZXN0LnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlc3Quc2lnbmF0dXJlKSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaWduYXR1cmVzIGRpZCBub3QgbWF0Y2giKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZzcmMtPmJvZHksICZkZXN0LmJvZHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTT1VSQ0VcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzcmMtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzcmMtPmJvZHkpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJERVNUXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmZGVzdC5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVzdC5ib2R5KSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib2RpZXMgZGlkIG5vdCBtYXRjaCIpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorCisgIGRhdGFfYmxvY2tfZnJlZSAoJmRlc3QpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3RfdmFsdWVzX29ubHlfd3JpdGUgKE5vZGVJdGVyYXRpb25EYXRhICpuaWQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgc2lnX2xlbjsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKworICBzaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5pZC0+c2lnbmF0dXJlKTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPmJsb2NrLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5pZC0+YmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbmlkLT5ibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5ibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuaWQtPmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPmJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgbmlkLT5ibG9jaywgJndyaXRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIGlmIHdlIHdyb3RlIGFueSB0eXBlY29kZXMgdGhlbiB0aGlzIHdvdWxkIGZhaWwgKi8KKyAgX2RidXNfYXNzZXJ0IChzaWdfbGVuID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuaWQtPnNpZ25hdHVyZSkpOworCisgIC8qIEJ1dCBiZSBzdXJlIHdlIHdyb3RlIG91dCB0aGUgdmFsdWVzIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sICZyZWFkZXIsIGkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKGkgKyAxID09IG5pZC0+bl9ub2RlcykKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmcmVhZGVyKTsKKworICAgICAgKytpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogb2Zmc2V0IHRoZSBzZWVkIGZvciBzZXR0aW5nLCBzbyB3ZSBzZXQgZGlmZmVyZW50IG51bWJlcnMgdGhhbgorICogd2Ugb3JpZ2luYWxseSB3cm90ZS4gRG9uJ3Qgb2Zmc2V0IGJ5IGEgaHVnZSBudW1iZXIgc2luY2UgaW4KKyAqIHNvbWUgY2FzZXMgaXQncyB2YWx1ZSA9IHBvc3NpYmlsaXRpZXNbc2VlZCAlIG5fcG9zc2liaWxpdGllc10KKyAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHdyYXAgYXJvdW5kLiBib29sX2Zyb21fc2VlZAorICogaXMganVzdCBzZWVkICUgMiBldmVuLgorICovCisjZGVmaW5lIFNFVF9TRUVEIDEKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3Rfc2V0X3ZhbHVlcyAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3Jvb3Q7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IGk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCBOVUxMKTsKKworICByZWFsaWduX3Jvb3QgPSByZWFkZXI7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIFNFVF9TRUVEKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IHZhbHVlcyB3ZXJlIHNldCAqLworCisgIHJlYWRlciA9IHJlYWxpZ25fcm9vdDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sICZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIFNFVF9TRUVEKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9kZWxldGVfdmFsdWVzIChOb2RlSXRlcmF0aW9uRGF0YSAqbmlkKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IHQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCBOVUxMKTsKKworICB3aGlsZSAoKHQgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgLyogUmlnaHQgbm93LCBkZWxldGluZyBvbmx5IHdvcmtzIG9uIGFycmF5IGVsZW1lbnRzLiAgV2UgZGVsZXRlCisgICAgICAgKiBhbGwgYXJyYXkgZWxlbWVudHMsIGFuZCB0aGVuIHZlcmlmeSB0aGF0IHRoZXJlIGFyZW4ndCBhbnkKKyAgICAgICAqIGxlZnQuCisgICAgICAgKi8KKyAgICAgIGlmICh0ID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGFycmF5OworICAgICAgICAgIGludCBuX2VsZW1lbnRzOworICAgICAgICAgIGludCBlbGVtX3R5cGU7CisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXkpOworICAgICAgICAgIG5fZWxlbWVudHMgPSAwOworICAgICAgICAgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuX2VsZW1lbnRzICs9IDE7CisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiByZXNldCB0byBzdGFydCBvZiBhcnJheSAqLworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY3Vyc2luZyBpbnRvIGRlbGV0aW9uIGxvb3AgcmVhZGVyLnZhbHVlX3BvcyA9ICVkIGFycmF5LnZhbHVlX3BvcyA9ICVkIGFycmF5LnUuc3RhcnRfcG9zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnZhbHVlX3BvcywgYXJyYXkudmFsdWVfcG9zLCBhcnJheS51LmFycmF5LnN0YXJ0X3Bvcyk7CisgICAgICAgICAgd2hpbGUgKChlbGVtX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBhbHdheXMgZGVsZXRlIGZyb20gdGhlIHNhbWUgcGFydCBvZiB0aGUgYXJyYXkuICovCisgICAgICAgICAgICAgIHN0YXRpYyBpbnQgY3ljbGUgPSAwOworICAgICAgICAgICAgICBpbnQgZWxlbTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPiAwKTsKKworICAgICAgICAgICAgICBlbGVtID0gY3ljbGU7CisgICAgICAgICAgICAgIGlmIChlbGVtID09IDMgfHwgZWxlbSA+PSBuX2VsZW1lbnRzKSAvKiBlbmQgb2YgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBlbGVtID0gbl9lbGVtZW50cyAtIDE7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRlbGV0aW5nIGFycmF5IGVsZW1lbnQgJWQgb2YgJWQgdHlwZSAlcyBjeWNsZSAlZCByZWFkZXIgcG9zICVkIGVsZW0gcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLCBuX2VsZW1lbnRzLCBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUsIHJlYWRlci52YWx1ZV9wb3MsIGFycmF5LnZhbHVlX3Bvcyk7CisgICAgICAgICAgICAgIHdoaWxlIChlbGVtID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSkpCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBoYXZlIGhhZCBhbm90aGVyIGVsZW1lbnRcbiIpOworICAgICAgICAgICAgICAgICAgLS1lbGVtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX2RlbGV0ZSAoJmFycmF5LCAmcmVhZGVyKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgICBuX2VsZW1lbnRzIC09IDE7CisKKyAgICAgICAgICAgICAgLyogcmVzZXQgKi8KKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5KTsKKworICAgICAgICAgICAgICBpZiAoY3ljbGUgPiAyKQorICAgICAgICAgICAgICAgIGN5Y2xlID0gMDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN5Y2xlICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworICAgIH0KKworICAvKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBhcnJheSBlbGVtZW50cyBsZWZ0ICovCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChuaWQtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgTlVMTCk7CisKKyAgd2hpbGUgKCh0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl90ZXN0X25vZGVzX2l0ZXJhdGlvbiAodm9pZCAqZGF0YSkKK3sKKyAgTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCA9IGRhdGE7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIC8qIFN0dWZmIHRvIGRvOgorICAgKiAxLiB3cml0ZSB0aGUgdmFsdWUKKyAgICogMi4gc3RyY21wLWNvbXBhcmUgd2l0aCB0aGUgc2lnbmF0dXJlIHdlIGJ1aWx0CisgICAqIDMuIHJlYWQgdGhlIHZhbHVlCisgICAqIDQuIHR5cGUtaXRlcmF0ZSB0aGUgc2lnbmF0dXJlIGFuZCB0aGUgdmFsdWUgYW5kIHNlZSBpZiB0aGV5IGFyZSB0aGUgc2FtZSB0eXBlLXdpc2UKKyAgICovCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChuaWQtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJndyaXRlcik7CisKKyAgLyogREJ1c1R5cGVXcml0ZXIgYXNzdW1lcyBpdCdzIHdyaXRpbmcgaW50byBhbiBleGlzdGluZyBzaWduYXR1cmUsCisgICAqIHNvIGRvZXNuJ3QgYWRkIG51bCBvbiBpdHMgb3duLiBXZSBoYXZlIHRvIGRvIHRoYXQuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoJm5pZC0+YmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+dHlwZV9vZmZzZXQsICdcMCcpKQorICAgIGdvdG8gb3V0OworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfdmFsdWUgKG5pZC0+bm9kZXNbaV0sIG5pZC0+YmxvY2ssICZ3cml0ZXIsIGkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKG5pZC0+c2lnbmF0dXJlLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobmlkLT5zaWduYXR1cmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuaWQtPmJsb2NrLT5zaWduYXR1cmUsIG5pZC0+dHlwZV9vZmZzZXQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBzaWduYXR1cmUgJyVzJyBhbmQgZ290ICclcycgd2l0aCBpbml0aWFsIG9mZnNldCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAobmlkLT5zaWduYXR1cmUpLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoJm5pZC0+YmxvY2stPnNpZ25hdHVyZSwgbmlkLT50eXBlX29mZnNldCwgMCksCisgICAgICAgICAgICAgICAgICBuaWQtPnR5cGVfb2Zmc2V0KTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndyb25nIHNpZ25hdHVyZSIpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sICZyZWFkZXIsIGkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKGkgKyAxID09IG5pZC0+bl9ub2RlcykKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmcmVhZGVyKTsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAobl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA8PSBNQVhfSVRFUkFUSU9OU19GT1JfRVhQRU5TSVZFX1RFU1RTKQorICAgIHsKKyAgICAgIC8qIHRoaXMgc2V0IHZhbHVlcyB0ZXN0IHVzZXMgY29kZSBmcm9tIGNvcHkgYW5kCisgICAgICAgKiB2YWx1ZXNfb25seV93cml0ZSBzbyB3b3VsZCBpZGVhbGx5IGJlIGxhc3Qgc28geW91IGdldCBhCisgICAgICAgKiBzaW1wbGVyIHRlc3QgY2FzZSBmb3IgcHJvYmxlbXMgd2l0aCBjb3B5aW5nIG9yIHZhbHVlc19vbmx5CisgICAgICAgKiB3cml0aW5nOyBidXQgaXQgYWxzbyBuZWVkcyBhbiBhbHJlYWR5LXdyaXR0ZW4gRGF0YUJsb2NrIHNvIGl0CisgICAgICAgKiBoYXMgdG8gZ28gZmlyc3QuIENvbW1lbnQgaXQgb3V0IGlmIGl0IGJyZWFrcywgYW5kIHNlZSBpZiB0aGUKKyAgICAgICAqIGxhdGVyIHRlc3RzIGFsc28gYnJlYWsgLSBkZWJ1ZyB0aGVtIGZpcnN0IGlmIHNvLgorICAgICAgICovCisgICAgICBpZiAoIXJ1bl90ZXN0X3NldF92YWx1ZXMgKG5pZCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIXJ1bl90ZXN0X2RlbGV0ZV92YWx1ZXMgKG5pZCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIXJ1bl90ZXN0X2NvcHkgKG5pZCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIXJ1bl90ZXN0X3ZhbHVlc19vbmx5X3dyaXRlIChuaWQpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogRklYTUUgdHlwZS1pdGVyYXRlIGJvdGggc2lnbmF0dXJlIGFuZCB2YWx1ZSBhbmQgY29tcGFyZSB0aGUgcmVzdWx0aW5nCisgICAqIHRyZWUgdG8gdGhlIG5vZGUgdHJlZSBwZXJoYXBzCisgICAqLworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisKKyAgZGF0YV9ibG9ja19yZXNldCAobmlkLT5ibG9jayk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK3J1bl90ZXN0X25vZGVzX2luX29uZV9jb25maWd1cmF0aW9uIChUZXN0VHlwZU5vZGUgICAgKipub2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX25vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluaXRpYWxfb2Zmc2V0KQoreworICBEYXRhQmxvY2sgYmxvY2s7CisgIE5vZGVJdGVyYXRpb25EYXRhIG5pZDsKKworICBpZiAoIWRhdGFfYmxvY2tfaW5pdCAoJmJsb2NrLCBieXRlX29yZGVyLCBpbml0aWFsX29mZnNldCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgbmlkLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKKyAgbmlkLmJsb2NrID0gJmJsb2NrOworICBuaWQudHlwZV9vZmZzZXQgPSBpbml0aWFsX29mZnNldDsKKyAgbmlkLm5vZGVzID0gbm9kZXM7CisgIG5pZC5uX25vZGVzID0gbl9ub2RlczsKKworICBpZiAoVEVTVF9PT01fSEFORExJTkcgJiYKKyAgICAgIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgPD0gTUFYX0lURVJBVElPTlNfRk9SX0VYUEVOU0lWRV9URVNUUykKKyAgICB7CisgICAgICBfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInJ1bm5pbmcgdGVzdCBub2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2Rlc19pdGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5pZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFydW5fdGVzdF9ub2Rlc19pdGVyYXRpb24gKCZuaWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisKKyAgZGF0YV9ibG9ja19mcmVlICgmYmxvY2spOworfQorCitzdGF0aWMgdm9pZAorcnVuX3Rlc3Rfbm9kZXMgKFRlc3RUeXBlTm9kZSAqKm5vZGVzLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5fbm9kZXMpCit7CisgIGludCBpOworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghIG5vZGVfYnVpbGRfc2lnbmF0dXJlIChub2Rlc1tpXSwgJnNpZ25hdHVyZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCI+Pj4gdGVzdCBub2RlcyB3aXRoIHNpZ25hdHVyZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzaWduYXR1cmUpKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPD0gTUFYX0lOSVRJQUxfT0ZGU0VUKQorICAgIHsKKyAgICAgIHJ1bl90ZXN0X25vZGVzX2luX29uZV9jb25maWd1cmF0aW9uIChub2Rlcywgbl9ub2RlcywgJnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sIGkpOworICAgICAgcnVuX3Rlc3Rfbm9kZXNfaW5fb25lX2NvbmZpZ3VyYXRpb24gKG5vZGVzLCBuX25vZGVzLCAmc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwgaSk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgKz0gMTsKKyAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90b3RhbCArPSAxOworCisgIGlmIChuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCA9PSBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAxMDAlJSAlZCB0aGlzIHRlc3QgKCVkIGN1bXVsYXRpdmUpXG4iLAorICAgICAgICAgICAgICAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QsCisgICAgICAgICAgICAgICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsKTsKKyAgICB9CisgIC8qIHRoaXMgaGFwcGVucyB0byB0dXJuIG91dCB3ZWxsIHdpdGggbW9kID09IDEgKi8KKyAgZWxzZSBpZiAoKG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ICUKKyAgICAgICAgICAgIChpbnQpKG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgLyAxMC4wKSkgPT0gMSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgJWQlJSAiLCAoaW50KSAobl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgLyAoZG91YmxlKSBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0ICogMTAwKSk7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2lnbmF0dXJlKTsKK30KKworI2RlZmluZSBOX1ZBTFVFUyAoTl9CQVNJQ1MgKiBOX0NPTlRBSU5FUlMgKyBOX0JBU0lDUykKKworc3RhdGljIFRlc3RUeXBlTm9kZSoKK3ZhbHVlX2dlbmVyYXRvciAoaW50ICppcCkKK3sKKyAgaW50IGkgPSAqaXA7CisgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjaGlsZF9rbGFzczsKKyAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzczsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgVGVzdFR5cGVOb2RlICpub2RlOworCisgIF9kYnVzX2Fzc2VydCAoaSA8PSBOX1ZBTFVFUyk7CisKKyAgaWYgKGkgPT0gTl9WQUxVRVMpCisgICAgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlIGlmIChpIDwgTl9CQVNJQ1MpCisgICAgeworICAgICAgbm9kZSA9IG5vZGVfbmV3IChiYXNpY19ub2Rlc1tpXSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogaW1hZ2luZSBhbiBhcnJheToKKyAgICAgICAqIGNvbnRhaW5lciAwIG9mIGJhc2ljIDAKKyAgICAgICAqIGNvbnRhaW5lciAwIG9mIGJhc2ljIDEKKyAgICAgICAqIGNvbnRhaW5lciAwIG9mIGJhc2ljIDIKKyAgICAgICAqIGNvbnRhaW5lciAxIG9mIGJhc2ljIDAKKyAgICAgICAqIGNvbnRhaW5lciAxIG9mIGJhc2ljIDEKKyAgICAgICAqIGNvbnRhaW5lciAxIG9mIGJhc2ljIDIKKyAgICAgICAqLworICAgICAgaSAtPSBOX0JBU0lDUzsKKworICAgICAgY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2kgLyBOX0JBU0lDU107CisgICAgICBjaGlsZF9rbGFzcyA9IGJhc2ljX25vZGVzW2kgJSBOX0JBU0lDU107CisKKyAgICAgIG5vZGUgPSBub2RlX25ldyAoY29udGFpbmVyX2tsYXNzKTsKKyAgICAgIGNoaWxkID0gbm9kZV9uZXcgKGNoaWxkX2tsYXNzKTsKKworICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIGNoaWxkKTsKKyAgICB9CisKKyAgKmlwICs9IDE7IC8qIGluY3JlbWVudCB0aGUgZ2VuZXJhdG9yICovCisKKyAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitidWlsZF9ib2R5IChUZXN0VHlwZU5vZGUgKipub2RlcywKKyAgICAgICAgICAgIGludCAgICAgICAgICAgIG5fbm9kZXMsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgREJ1c1N0cmluZyAgICAqc2lnbmF0dXJlLAorICAgICAgICAgICAgREJ1c1N0cmluZyAgICAqYm9keSkKK3sKKyAgaW50IGk7CisgIERhdGFCbG9jayBibG9jazsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoISBub2RlX2J1aWxkX3NpZ25hdHVyZSAobm9kZXNbaV0sIHNpZ25hdHVyZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghZGF0YV9ibG9ja19pbml0ICgmYmxvY2ssIGJ5dGVfb3JkZXIsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKCZibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZ3cml0ZXIpOworICAKKyAgLyogREJ1c1R5cGVXcml0ZXIgYXNzdW1lcyBpdCdzIHdyaXRpbmcgaW50byBhbiBleGlzdGluZyBzaWduYXR1cmUsCisgICAqIHNvIGRvZXNuJ3QgYWRkIG51bCBvbiBpdHMgb3duLiBXZSBoYXZlIHRvIGRvIHRoYXQuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoJmJsb2NrLnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICdcMCcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChub2Rlc1tpXSwgJmJsb2NrLCAmd3JpdGVyLCBpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZibG9jay5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay5ib2R5KSAtIE5fRkVOQ0VfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBkYXRhX2Jsb2NrX2ZyZWUgKCZibG9jayk7ICAKK30KKworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKGludCAgICAgICAgICAgc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqYm9keSkKK3sKKyAgVGVzdFR5cGVOb2RlICpub2Rlc1sxXTsKKyAgaW50IGk7CisgIGludCBuX25vZGVzOworCisgIG5vZGVzWzBdID0gdmFsdWVfZ2VuZXJhdG9yICgmc2VxdWVuY2UpOworCisgIGlmIChub2Rlc1swXSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBuX25vZGVzID0gMTsKKyAgCisgIGJ1aWxkX2JvZHkgKG5vZGVzLCBuX25vZGVzLCBieXRlX29yZGVyLCBzaWduYXR1cmUsIGJvZHkpOworCisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ub2RlcykKKyAgICB7CisgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK21ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIG5fbmVzdGVkKQoreworICBUZXN0VHlwZU5vZGUgKnJvb3Q7CisgIFRlc3RUeXBlTm9kZSAqY29udGFpbmVyOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworICBpbnQgaTsKKworICByb290ID0gbm9kZV9uZXcgKGNvbnRhaW5lcl9rbGFzcyk7CisgIGNvbnRhaW5lciA9IHJvb3Q7CisgIGZvciAoaSA9IDE7IGkgPCBuX25lc3RlZDsgaSsrKQorICAgIHsKKyAgICAgIGNoaWxkID0gbm9kZV9uZXcgKGNvbnRhaW5lcl9rbGFzcyk7CisgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoY29udGFpbmVyLCBjaGlsZCk7CisgICAgICBjb250YWluZXIgPSBjaGlsZDsKKyAgICB9CisKKyAgLyogY29udGFpbmVyIHNob3VsZCBub3cgYmUgdGhlIG1vc3QtbmVzdGVkIGNvbnRhaW5lciAqLworCisgIGkgPSAwOworICB3aGlsZSAoKGNoaWxkID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgIHsKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChjb250YWluZXIsIGNoaWxkKTsKKworICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZyb290LCAxKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKiljb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICBub2RlX2Rlc3Ryb3kgKGNoaWxkKTsKKyAgICB9CisKKyAgbm9kZV9kZXN0cm95IChyb290KTsKK30KKworc3RhdGljIHZvaWQKK3N0YXJ0X25leHRfdGVzdCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBleHBlY3RlZCkKK3sKKyAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgPSAwOworICBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0ID0gZXhwZWN0ZWQ7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiPj4+ID4+PiAiKTsKKyAgZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsCisgICAgICAgICAgIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QpOworfQorCitzdGF0aWMgdm9pZAorbWFrZV9hbmRfcnVuX3Rlc3Rfbm9kZXMgKHZvaWQpCit7CisgIGludCBpLCBqLCBrLCBtOworCisgIC8qIFdlIHRyeSB0byBkbyB0aGlzIGluIG9yZGVyIG9mICJjb21wbGljYXRlZG5lc3MiIHNvIHRoYXQgdGVzdAorICAgKiBmYWlsdXJlcyB0ZW5kIHRvIHNob3cgdXAgaW4gdGhlIHNpbXBsZXN0IHRlc3QgY2FzZSB0aGF0CisgICAqIGRlbW9uc3RyYXRlcyB0aGUgZmFpbHVyZS4gIFRoZXJlIGFyZSBhbHNvIHNvbWUgdGVzdHMgdGhhdCBydW4KKyAgICogbW9yZSB0aGFuIG9uY2UgZm9yIHRoaXMgcmVhc29uLCBmaXJzdCB3aGlsZSBnb2luZyB0aHJvdWdoIHNpbXBsZQorICAgKiBjYXNlcywgc2Vjb25kIHdoaWxlIGdvaW5nIHRocm91Z2ggYSBicm9hZGVyIHJhbmdlIG9mIGNvbXBsZXgKKyAgICogY2FzZXMuCisgICAqLworICAvKiBFYWNoIGJhc2ljIG5vZGUuIFRoZSBiYXNpYyBub2RlcyBzaG91bGQgaW5jbHVkZToKKyAgICoKKyAgICogLSBlYWNoIGZpeGVkLXNpemUgdHlwZSAoaW4gc3VjaCBhIHdheSB0aGF0IGl0IGhhcyBkaWZmZXJlbnQgdmFsdWVzIGVhY2ggdGltZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgc28gd2UgY2FuIHRlbGwgaWYgd2UgbWl4IHR3byBvZiB0aGVtIHVwKQorICAgKiAtIHN0cmluZ3Mgb2YgdmFyaW91cyBsZW5ndGhzCisgICAqIC0gb2JqZWN0IHBhdGgKKyAgICogLSBzaWduYXR1cmUKKyAgICovCisgIC8qIEVhY2ggY29udGFpbmVyIG5vZGUuIFRoZSBjb250YWluZXIgbm9kZXMgc2hvdWxkIGluY2x1ZGU6CisgICAqCisgICAqICBzdHJ1Y3Qgd2l0aCAxIGFuZCAyIGNvcGllcyBvZiB0aGUgY29udGFpbmVkIGl0ZW0KKyAgICogIGFycmF5IHdpdGggMCwgMSwgMiBjb3BpZXMgb2YgdGhlIGNvbnRhaW5lZCBpdGVtCisgICAqICB2YXJpYW50CisgICAqLworICAvKiAgTGV0IGEgInZhbHVlIiBiZSBhIGJhc2ljIG5vZGUsIG9yIGEgY29udGFpbmVyIGNvbnRhaW5pbmcgYSBzaW5nbGUgYmFzaWMgbm9kZS4KKyAgICogIExldCBuX3ZhbHVlcyBiZSB0aGUgbnVtYmVyIG9mIHN1Y2ggdmFsdWVzIGkuZS4gKG5fY29udGFpbmVyICogbl9iYXNpYyArIG5fYmFzaWMpCisgICAqICBXaGVuIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8gbWFrZSBjb21iaW5hdGlvbnMsIGRvIHRoZSBiYXNpYyB0eXBlcworICAgKiAgZmlyc3QgYW5kIHRoZSBjb250YWluZXJzIHNlY29uZC4KKyAgICovCisgIC8qIEVhY2ggaXRlbSBpcyBzaG93biB3aXRoIGl0cyBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBjb21wbGV0ZSBzbworICAgKiB3ZSBjYW4ga2VlcCBhIGhhbmRsZSBvbiB0aGlzIHVuaXQgdGVzdAorICAgKi8KKworICAvKiBGSVhNRSB0ZXN0IGp1c3QgYW4gZW1wdHkgYm9keSwgbm8gdHlwZXMgYXQgYWxsICovCisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSBieSBpdHNlbGYgJWQgaXRlcmF0aW9uc1xuIiwgTl9WQUxVRVMpOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICAgICAgfQorICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSBieSBpdHNlbGYgd2l0aCBhcnJheXMgYXMgYmxvY2tzICVkIGl0ZXJhdGlvbnNcbiIsIE5fVkFMVUVTKTsKKyAgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IFRSVUU7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2RlID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgICAgICB9CisgIH0KKyAgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IEZBTFNFOworCisgIHN0YXJ0X25leHRfdGVzdCAoIkFsbCB2YWx1ZXMgaW4gb25lIGJpZyB0b3BsZXZlbCAlZCBpdGVyYXRpb25cbiIsIDEpOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2Rlc1tOX1ZBTFVFU107CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2RlID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBub2Rlc1tpIC0gMV0gPSBub2RlOworICAgICAgfQorCisgICAgcnVuX3Rlc3Rfbm9kZXMgKG5vZGVzLCBOX1ZBTFVFUyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9WQUxVRVM7IGkrKykKKyAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbaV0pOworICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSx2YWx1ZSBwYWlyIGNvbWJpbmF0aW9uIGFzIHRvcGxldmVsLCBpbiBib3RoIG9yZGVycyAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fVkFMVUVTICogTl9WQUxVRVMpOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2Rlc1syXTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZXNbMF0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoKG5vZGVzWzFdID0gdmFsdWVfZ2VuZXJhdG9yICgmaikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzIChub2RlcywgMik7CisKKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMV0pOworICAgICAgICAgIH0KKworICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzWzBdKTsKKyAgICAgIH0KKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIGNvbnRhaW5pbmcgZWFjaCB2YWx1ZSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisKKyAgICAgIG1ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29udGFpbmVyX2tsYXNzLCAxKTsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgY29udGFpbmluZyBlYWNoIHZhbHVlIHdpdGggYXJyYXlzIGFzIGJsb2NrcyAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IFRSVUU7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworCisgICAgICBtYWtlX2FuZF9ydW5fdmFsdWVzX2luc2lkZV9jb250YWluZXIgKGNvbnRhaW5lcl9rbGFzcywgMSk7CisgICAgfQorICBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzID0gRkFMU0U7CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2Ygc2FtZSBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisKKyAgICAgIG1ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29udGFpbmVyX2tsYXNzLCAyKTsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2Ygc2FtZSBjb250YWluZXIgb2Ygc2FtZSBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisKKyAgICAgIG1ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29udGFpbmVyX2tsYXNzLCAzKTsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSx2YWx1ZSBwYWlyIGluc2lkZSBhIHN0cnVjdCAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fVkFMVUVTICogTl9WQUxVRVMpOworICB7CisgICAgVGVzdFR5cGVOb2RlICp2YWwxLCAqdmFsMjsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisKKyAgICBub2RlID0gbm9kZV9uZXcgKCZzdHJ1Y3RfMV9jbGFzcyk7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKHZhbDEgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoKHZhbDIgPSB2YWx1ZV9nZW5lcmF0b3IgKCZqKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKworICAgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIHZhbDEpOworICAgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIHZhbDIpOworCisgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgICAgICBub2RlX2Rlc3Ryb3kgKHZhbDIpOworICAgICAgICAgIH0KKyAgICAgICAgbm9kZV9kZXN0cm95ICh2YWwxKTsKKyAgICAgIH0KKyAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiQWxsIHZhbHVlcyBpbiBvbmUgYmlnIHN0cnVjdCAlZCBpdGVyYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgMSk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICAgIG5vZGUgPSBub2RlX25ldyAoJnN0cnVjdF8xX2NsYXNzKTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgoY2hpbGQgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgY2hpbGQpOworCisgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlIGluIGEgbGFyZ2UgYXJyYXkgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKnZhbDsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisKKyAgICBub2RlID0gbm9kZV9uZXcgKCZhcnJheV85X2NsYXNzKTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgodmFsID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworCisgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCB2YWwpOworCisgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmbm9kZSwgMSk7CisKKyAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICBub2RlX2Rlc3Ryb3kgKHZhbCk7CisgICAgICB9CisKKyAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICB9CisKKyAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9TTE9XIikgPT0gTlVMTCB8fAorICAgICAgYXRvaSAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NMT1ciKSkgPCAxKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNraXBwaW5nIHJlbWFpbmluZyBtYXJzaGFsLXJlY3Vyc2l2ZSB0ZXN0cywgIgorICAgICAgICAgICJydW4gd2l0aCBEQlVTX1RFU1RfU0xPVz0xIChvciBtb3JlKSB0byBlbmFibGVcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqb3V0ZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworICAgICAgVGVzdFR5cGVOb2RlICpvdXRlcl9jb250YWluZXIgPSBub2RlX25ldyAob3V0ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IE5fQ09OVEFJTkVSUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgICAgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqaW5uZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2pdOworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqaW5uZXJfY29udGFpbmVyID0gbm9kZV9uZXcgKGlubmVyX2NvbnRhaW5lcl9rbGFzcyk7CisKKyAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAob3V0ZXJfY29udGFpbmVyLCBpbm5lcl9jb250YWluZXIpOworCisgICAgICAgICAgbSA9IDA7CisgICAgICAgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJm0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKGlubmVyX2NvbnRhaW5lciwgY2hpbGQpOworCisgICAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmb3V0ZXJfY29udGFpbmVyLCAxKTsKKworICAgICAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKWlubmVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilvdXRlcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgbm9kZV9kZXN0cm95IChpbm5lcl9jb250YWluZXIpOworICAgICAgICB9CisgICAgICBub2RlX2Rlc3Ryb3kgKG91dGVyX2NvbnRhaW5lcik7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqb3V0ZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworICAgICAgVGVzdFR5cGVOb2RlICpvdXRlcl9jb250YWluZXIgPSBub2RlX25ldyAob3V0ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IE5fQ09OVEFJTkVSUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmlubmVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tqXTsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmlubmVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChpbm5lcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG91dGVyX2NvbnRhaW5lciwgaW5uZXJfY29udGFpbmVyKTsKKworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOX0NPTlRBSU5FUlM7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgICAgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNlbnRlcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNba107CisgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2VudGVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChjZW50ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoaW5uZXJfY29udGFpbmVyLCBjZW50ZXJfY29udGFpbmVyKTsKKworICAgICAgICAgICAgICBtID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJm0pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoY2VudGVyX2NvbnRhaW5lciwgY2hpbGQpOworCisgICAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm91dGVyX2NvbnRhaW5lciwgMSk7CisKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopY2VudGVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilpbm5lcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2VudGVyX2NvbnRhaW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilvdXRlcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgbm9kZV9kZXN0cm95IChpbm5lcl9jb250YWluZXIpOworICAgICAgICB9CisgICAgICBub2RlX2Rlc3Ryb3kgKG91dGVyX2NvbnRhaW5lcik7CisgICAgfQorCisgIC8qIFRoaXMgb25lIHRha2VzIGEgcmVhbGx5IGxvbmcgdGltZSAoMTAgbWludXRlcyBvbiBhIENvcmUyKSwgc28gb25seSBlbmFibGUKKyAgICogaXQgaWYgeW91J3JlIHJlYWxseSBzdXJlICovCisgIGlmIChhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0xPVyIpKSA8IDIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgcmVhbGx5IHNsb3cgbWFyc2hhbC1yZWN1cnNpdmUgdGVzdCwgIgorICAgICAgICAgICJydW4gd2l0aCBEQlVTX1RFU1RfU0xPVz0yIChvciBtb3JlKSB0byBlbmFibGVcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUsdmFsdWUsdmFsdWUgdHJpcGxldCBjb21iaW5hdGlvbiBhcyB0b3BsZXZlbCwgaW4gYWxsIG9yZGVycyAlZCBpdGVyYXRpb25zXG4iLAorICAgICAgICAgICAgICAgICAgIE5fVkFMVUVTICogTl9WQUxVRVMgKiBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGVzWzNdOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2Rlc1swXSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICgobm9kZXNbMV0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZqKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKG5vZGVzWzJdID0gdmFsdWVfZ2VuZXJhdG9yICgmaykpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKG5vZGVzLCAzKTsKKworICAgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMl0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzWzFdKTsKKyAgICAgICAgICB9CisgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMF0pOworICAgICAgfQorICB9CisKK291dDoKKyAgZnByaW50ZiAoc3RkZXJyLCAiJWQgdG90YWwgaXRlcmF0aW9ucyBvZiByZWN1cnNpdmUgbWFyc2hhbGluZyB0ZXN0c1xuIiwKKyAgICAgICAgICAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90b3RhbCk7CisgIGZwcmludGYgKHN0ZGVyciwgImVhY2ggaXRlcmF0aW9uIHJhbiBhdCBpbml0aWFsIG9mZnNldHMgMCB0aHJvdWdoICVkIGluIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuXG4iLAorICAgICAgICAgICBNQVhfSU5JVElBTF9PRkZTRVQpOworICBmcHJpbnRmIChzdGRlcnIsICJvdXQgb2YgbWVtb3J5IGhhbmRsaW5nICVzIHRlc3RlZFxuIiwKKyAgICAgICAgICAgVEVTVF9PT01fSEFORExJTkcgPyAid2FzIiA6ICJ3YXMgbm90Iik7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19tYXJzaGFsX3JlY3Vyc2l2ZV90ZXN0ICh2b2lkKQoreworICBtYWtlX2FuZF9ydW5fdGVzdF9ub2RlcyAoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqCisgKgorICogICAgICAgICBJbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCB0eXBlIG5vZGUgY2xhc3MKKyAqCisgKgorICoKKyAqLworI2RlZmluZSBNQVhfTVVMVElfQ09VTlQgNQorCisjZGVmaW5lIFNBTVBMRV9JTlQxNiAgICAgICAgICAgMTIzNAorI2RlZmluZSBTQU1QTEVfSU5UMTZfQUxURVJOQVRFIDY3ODUKK3N0YXRpYyBkYnVzX2ludDE2X3QKK2ludDE2X2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgdmFsdWUgdGhhdCdzIHByZWRpY3RhYmxlIGZyb20gc2VlZC4gIFdlIGNvdWxkCisgICAqIGp1c3QgdXNlIHNlZWQgaXRzZWxmLCBidXQgdGhhdCB3b3VsZCBvbmx5IGV2ZXIgdG91Y2ggb25lIGJ5dGUgb2YKKyAgICogdGhlIGludCBzbyB3b3VsZCBtaXNzIHNvbWUga2luZHMgb2YgYnVnLgorICAgKi8KKyAgZGJ1c19pbnQxNl90IHY7CisKKyAgdiA9IDQyOyAvKiBqdXN0IHRvIHF1aWV0IGNvbXBpbGVyIGFmYWlrICovCisgIHN3aXRjaCAoc2VlZCAlIDUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHYgPSBTQU1QTEVfSU5UMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB2ID0gU0FNUExFX0lOVDE2X0FMVEVSTkFURTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHYgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHYgPSBfREJVU19JTlQxNl9NQVg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICB2ID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoc2VlZCA+IDEpCisgICAgdiAqPSBzZWVkOyAvKiB3cmFwcyBhcm91bmQgZXZlbnR1YWxseSwgd2hpY2ggaXMgZmluZSAqLworCisgIHJldHVybiB2OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90IHY7CisKKyAgdiA9IGludDE2X2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90IHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfaW50MTZfdCopICZ2KTsKKworICBfZGJ1c19hc3NlcnQgKHYgPT0gaW50MTZfZnJvbV9zZWVkIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCB2OworCisgIHYgPSBpbnQxNl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfd3JpdGVfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90IHZhbHVlc1tNQVhfTVVMVElfQ09VTlRdOworICBkYnVzX2ludDE2X3QgKnZfQVJSQVlfSU5UMTYgPSB2YWx1ZXM7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIHZhbHVlc1tpXSA9IGludDE2X2Zyb21fc2VlZCAoc2VlZCArIGkpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9BUlJBWV9JTlQxNiwgY291bnQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3JlYWRfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgKnZhbHVlczsKKyAgaW50IG5fZWxlbWVudHM7CisgIGludCBpOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2VsZW1lbnRzKTsKKworICBpZiAobl9lbGVtZW50cyAhPSBjb3VudCkKKyAgICBfZGJ1c193YXJuICgiZ290ICVkIGVsZW1lbnRzIGV4cGVjdGVkICVkXG4iLCBuX2VsZW1lbnRzLCBjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA9PSBjb3VudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgX2RidXNfYXNzZXJ0ICgoKGRidXNfaW50MTZfdClfZGJ1c191bnBhY2tfdWludDE2IChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopdmFsdWVzICsgKGkgKiAyKSkpID09CisgICAgICAgICAgICAgICAgICBpbnQxNl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2RlZmluZSBTQU1QTEVfSU5UMzIgICAgICAgICAgIDEyMzQ1Njc4CisjZGVmaW5lIFNBTVBMRV9JTlQzMl9BTFRFUk5BVEUgNTM3ODE0MjkKK3N0YXRpYyBkYnVzX2ludDMyX3QKK2ludDMyX2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgdmFsdWUgdGhhdCdzIHByZWRpY3RhYmxlIGZyb20gc2VlZC4gIFdlIGNvdWxkCisgICAqIGp1c3QgdXNlIHNlZWQgaXRzZWxmLCBidXQgdGhhdCB3b3VsZCBvbmx5IGV2ZXIgdG91Y2ggb25lIGJ5dGUgb2YKKyAgICogdGhlIGludCBzbyB3b3VsZCBtaXNzIHNvbWUga2luZHMgb2YgYnVnLgorICAgKi8KKyAgZGJ1c19pbnQzMl90IHY7CisKKyAgdiA9IDQyOyAvKiBqdXN0IHRvIHF1aWV0IGNvbXBpbGVyIGFmYWlrICovCisgIHN3aXRjaCAoc2VlZCAlIDUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHYgPSBTQU1QTEVfSU5UMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB2ID0gU0FNUExFX0lOVDMyX0FMVEVSTkFURTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHYgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHYgPSBfREJVU19JTlRfTUFYOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgdiA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHNlZWQgPiAxKQorICAgIHYgKj0gc2VlZDsgLyogd3JhcHMgYXJvdW5kIGV2ZW50dWFsbHksIHdoaWNoIGlzIGZpbmUgKi8KKworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2OworCisgIHYgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX2ludDMyX3QqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IGludDMyX2Zyb21fc2VlZCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgdjsKKworICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3dyaXRlX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2YWx1ZXNbTUFYX01VTFRJX0NPVU5UXTsKKyAgZGJ1c19pbnQzMl90ICp2X0FSUkFZX0lOVDMyID0gdmFsdWVzOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICB2YWx1ZXNbaV0gPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfZml4ZWRfbXVsdGkgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQVJSQVlfSU5UMzIsIGNvdW50KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl9yZWFkX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90ICp2YWx1ZXM7CisgIGludCBuX2VsZW1lbnRzOworICBpbnQgaTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9lbGVtZW50cyk7CisKKyAgaWYgKG5fZWxlbWVudHMgIT0gY291bnQpCisgICAgX2RidXNfd2FybiAoImdvdCAlZCBlbGVtZW50cyBleHBlY3RlZCAlZFxuIiwgbl9lbGVtZW50cywgY291bnQpOworICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPT0gY291bnQpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIF9kYnVzX2Fzc2VydCAoKChpbnQpX2RidXNfdW5wYWNrX3VpbnQzMiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXZhbHVlcyArIChpICogNCkpKSA9PQorICAgICAgICAgICAgICAgICAgaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19pbnQ2NF90CitpbnQ2NF9mcm9tX3NlZWQgKGludCBzZWVkKQoreworICBkYnVzX2ludDMyX3QgdjMyOworICBkYnVzX2ludDY0X3QgdjsKKworICB2MzIgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHYgPSAtIChkYnVzX2ludDMyX3QpIH4gdjMyOworICB2IHw9ICgoKGRidXNfaW50NjRfdCl2MzIpIDw8IDMyKTsKKworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQ2NF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDY0ICovCisgIGRidXNfaW50NjRfdCB2OworCisgIHYgPSBpbnQ2NF9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50NjRfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDY0ICovCisgIGRidXNfaW50NjRfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX2ludDY0X3QqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IGludDY0X2Zyb21fc2VlZCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDY0X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICB2ID0gaW50NjRfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIE1BWF9TQU1QTEVfU1RSSU5HX0xFTiAxMAorc3RhdGljIHZvaWQKK3N0cmluZ19mcm9tX3NlZWQgKGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgIGludCAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIGludCAgIHNlZWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgX2RidXNfYXNzZXJ0IChsZW4gPCBNQVhfU0FNUExFX1NUUklOR19MRU4pOworCisgIC8qIHZhcnkgdGhlIGxlbmd0aCBzbGlnaHRseSwgdGhvdWdoIHdlIGFsc28gaGF2ZSBtdWx0aXBsZSBzdHJpbmcKKyAgICogdmFsdWUgdHlwZXMgZm9yIHRoaXMsIHZhcnlpbmcgaXQgaGVyZSB0ZXN0cyB0aGUgc2V0X3ZhbHVlIGNvZGUKKyAgICovCisgIHN3aXRjaCAoc2VlZCAlIDMpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIGxlbiArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGVuIC09IDI7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChsZW4gPCAwKQorICAgIGxlbiA9IDA7CisKKyAgdiA9ICh1bnNpZ25lZCBjaGFyKSAoJ0EnICsgc2VlZCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGlmICh2IDwgJ0EnIHx8IHYgPiAneicpCisgICAgICAgIHYgPSAnQSc7CisKKyAgICAgIGJ1ZltpXSA9IHY7CisKKyAgICAgIHYgKz0gMTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgYnVmW2ldID0gJ1wwJzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJpbmdfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXT0iIjsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKworICBzdHJpbmdfZnJvbV9zZWVkIChidWYsIG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ19yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXTsKKyAgdiA9IGJ1ZjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgJnYpOworCisgIHN0cmluZ19mcm9tX3NlZWQgKGJ1Ziwgbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbCwKKyAgICAgICAgICAgICAgICAgICAgc2VlZCk7CisKKyAgaWYgKHN0cmNtcCAoYnVmLCB2KSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJyZWFkIHN0cmluZyAnJXMnIGV4cGVjdGVkICclcydcbiIsCisgICAgICAgICAgICAgICAgICB2LCBidWYpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyaW5nX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgc3RyaW5nX2Zyb21fc2VlZCAoYnVmLCBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsLAorICAgICAgICAgICAgICAgICAgICBzZWVkKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgeworICAgY29uc3QgY2hhciAqb2xkOworICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLCAmb2xkKTsKKyAgIF9kYnVzX3ZlcmJvc2UgKCJTRVRUSU5HIG5ldyBzdHJpbmcgJyVzJyBsZW4gJWQgaW4gcGxhY2Ugb2YgJyVzJyBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICB2X3N0cmluZywgc3RybGVuICh2X3N0cmluZyksIG9sZCwgc3RybGVuIChvbGQpKTsKKyB9CisjZW5kaWYKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBCT09MX0ZST01fU0VFRChzZWVkKSAoKGRidXNfYm9vbF90KSgoc2VlZCkgJSAyKSkKKworc3RhdGljIGRidXNfYm9vbF90Citib29sX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgdjsKKworICB2ID0gQk9PTF9GUk9NX1NFRUQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IEJPT0xfRlJPTV9TRUVEIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgdjsKKworICB2ID0gQk9PTF9GUk9NX1NFRUQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgQllURV9GUk9NX1NFRUQoc2VlZCkgKCh1bnNpZ25lZCBjaGFyKSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpKQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J5dGVfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgdiA9IEJZVEVfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J5dGVfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IEJZVEVfRlJPTV9TRUVEIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgdiA9IEJZVEVfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCitzdGF0aWMgZG91YmxlCitkb3VibGVfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgcmV0dXJuIFNBTVBMRV9JTlQzMiAqIChkb3VibGUpIHNlZWQgKyAwLjM7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG91YmxlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZG91YmxlIHY7CisKKyAgdiA9IGRvdWJsZV9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG91YmxlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworICBkb3VibGUgZXhwZWN0ZWQ7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSopICZ2KTsKKworICBleHBlY3RlZCA9IGRvdWJsZV9mcm9tX3NlZWQgKHNlZWQpOworCisgIGlmICghX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMICh2LCBleHBlY3RlZCkpCisgICAgeworI2lmZGVmIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSCisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZG91YmxlICVnIGdvdCAlZ1xuIGJpdHMgPSAweCUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJ4IHZzLlxuIGJpdHMgPSAweCUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCB2LAorICAgICAgICAgICAgICAgICAgKihkYnVzX3VpbnQ2NF90KikoY2hhciopJmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgKihkYnVzX3VpbnQ2NF90KikoY2hhciopJnYpOworI2VuZGlmCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb3VibGVfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworCisgIHYgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIE1BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOIDEwCitzdGF0aWMgdm9pZAorb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHNlZWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIHY7CisgIGludCBsZW47CisKKyAgbGVuID0gc2VlZCAlIDk7CisgIF9kYnVzX2Fzc2VydCAobGVuIDwgTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4pOworCisgIHYgPSAodW5zaWduZWQgY2hhcikgKCdBJyArIHNlZWQpOworCisgIGlmIChsZW4gPCAyKQorICAgIHsKKyAgICAgIGJ1ZlswXSA9ICcvJzsKKyAgICAgIGkgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgKyAxIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHYgPCAnQScgfHwgdiA+ICd6JykKKyAgICAgICAgICAgIHYgPSAnQSc7CisKKyAgICAgICAgICBidWZbaV0gPSAnLyc7CisgICAgICAgICAgKytpOworICAgICAgICAgIGJ1ZltpXSA9IHY7CisgICAgICAgICAgKytpOworICAgICAgICAgIAorICAgICAgICAgIHYgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICBidWZbaV0gPSAnXDAnOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiArIDFdOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSAmdik7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIGlmIChzdHJjbXAgKGJ1ZiwgdikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgicmVhZCBvYmplY3QgcGF0aCAnJXMnIGV4cGVjdGVkICclcydcbiIsCisgICAgICAgICAgICAgICAgICB2LCBidWYpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorb2JqZWN0X3BhdGhfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIG9iamVjdF9wYXRoX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gMTAKK3N0YXRpYyB2b2lkCitzaWduYXR1cmVfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICBzZWVkKQoreworICAvKiB0cnkgdG8gYXZvaWQgYXNjZW5kaW5nLCBkZXNjZW5kaW5nLCBvciBhbHRlcm5hdGluZyBsZW5ndGggdG8gaGVscCBmaW5kIGJ1Z3MgKi8KKyAgY29uc3QgY2hhciAqc2FtcGxlX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiYXNheCIsCisgICAgIiIsCisgICAgImFzYXUoeHh4eCkiLAorICAgICJ4IiwKKyAgICAiYWkiLAorICAgICJhKGlpKSIKKyAgfTsKKworICBzdHJjcHkgKGJ1Ziwgc2FtcGxlX3NpZ25hdHVyZXNbc2VlZCAlIF9EQlVTX05fRUxFTUVOVFMoc2FtcGxlX3NpZ25hdHVyZXMpXSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHNpZ25hdHVyZV9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNvbnN0IGNoYXIgKnY7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfU0lHTkFUVVJFX0xFTiArIDFdOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSAmdik7CisKKyAgc2lnbmF0dXJlX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICBpZiAoc3RyY21wIChidWYsIHYpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoInJlYWQgc2lnbmF0dXJlIHZhbHVlICclcycgZXhwZWN0ZWQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIHYsIGJ1Zik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NpZ25hdHVyZV9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHNpZ25hdHVyZV9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgeworICAgICAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfU1RSVUNUKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbiwgbGluayk7CisKKyAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChjaGlsZCwgJnN1Yiwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkLCAmc3ViLCByZWFsaWduX3Jvb3QsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaSA9PSAobl9jb3BpZXMgLSAxKSAmJiBuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnN1Yik7CisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHN0cnVjdF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cnVjdF9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cikKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgaW50IGk7CisgIGludCBvcmlnX2xlbjsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpKQorICAgIGdvdG8gb29tOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbiwgbGluayk7CisKKyAgICAgICAgICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwgc3RyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUikpCisgICAgZ290byBvb207CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBlbGVtZW50X3NpZ25hdHVyZTsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKyAgaW50IGVsZW1lbnRfdHlwZTsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVsZW1lbnRfc2lnbmF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9zaWduYXR1cmUpKQorICAgIGdvdG8gb29tOworCisgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICgmZWxlbWVudF9zaWduYXR1cmUsIDApOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRfc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzICYmCisgICAgICBkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkgJiYKKyAgICAgIGNoaWxkLT5rbGFzcy0+d3JpdGVfbXVsdGkpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX211bHRpIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQsIG5fY29waWVzKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbGVtZW50X3NpZ25hdHVyZSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBkYXRhX2Jsb2NrX3Jlc3RvcmUgKGJsb2NrLCAmc2F2ZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVsZW1lbnRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2NvcGllczsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBuX2NvcGllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfQVJSQVkpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBpZiAobl9jb3BpZXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCAmJiBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzICYmCisgICAgICAgICAgZGJ1c190eXBlX2lzX2ZpeGVkIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChyZWFkZXIpKSAmJgorICAgICAgICAgIGNoaWxkLT5rbGFzcy0+cmVhZF9tdWx0aSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghbm9kZV9yZWFkX211bHRpIChjaGlsZCwgJnN1Yiwgc2VlZCwgbl9jb3BpZXMpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IG5fY29waWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChjaGlsZC0+a2xhc3MtPnR5cGVjb2RlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcikpOworCisgICAgICAgICAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZzdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChpID09IChuX2NvcGllcyAtIDEpICYmIG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZzdWIpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmc3ViKTsKKworICAgICAgICAgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIGFycmF5X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gYXJyYXlfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBpbnQgb3JpZ19sZW47CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBEQlVTX1RZUEVfQVJSQVkpKQorICAgIGdvdG8gb29tOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cikpCisgICAgZ290byBvb207CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisgLyogMTAgaXMgcmFuZG9tIGp1c3QgdG8gYWRkIGFub3RoZXIgc2VlZCB0aGF0IHdlIHVzZSBpbiB0aGUgc3VpdGUgKi8KKyNkZWZpbmUgVkFSSUFOVF9TRUVEIDEwCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERhdGFCbG9ja1N0YXRlIHNhdmVkOworICBEQnVzVHlwZVdyaXRlciBzdWI7CisgIERCdXNTdHJpbmcgY29udGVudF9zaWduYXR1cmU7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29udGVudF9zaWduYXR1cmUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRfc2lnbmF0dXJlKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKHdyaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRfc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmc3ViLCBzZWVkICsgVkFSSUFOVF9TRUVEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3ViKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zaWduYXR1cmUpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzVHlwZVJlYWRlciBzdWI7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfVkFSSUFOVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKGNoaWxkLCAmc3ViLCBzZWVkICsgVkFSSUFOVF9TRUVEKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkLCAmc3ViLCByZWFsaWduX3Jvb3QsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmc3ViKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHZhcmlhbnRfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordmFyaWFudF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIHZhcmlhbnRfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBlbnRyeV92YWx1ZV9zaWduYXR1cmU7CisgIERCdXNTdHJpbmcgZGljdF9lbnRyeV9zaWduYXR1cmU7CisgIGludCBpOworICBpbnQgbl9lbnRyaWVzOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fZW50cmllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGljdF9lbnRyeV9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORykpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpY3RfZW50cnlfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGljdF9lbnRyeV9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIERCdXNUeXBlV3JpdGVyIGVudHJ5X3N1YjsKKyAgICAgIGRidXNfaW50MzJfdCBrZXk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnN1YiwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeV9zdWIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAga2V5ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZlbnRyeV9zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKKyAgICAgICAgZ290byBvb207CisgICAgICAKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmZW50cnlfc3ViLCBzZWVkICsgaSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJnN1YiwgJmVudHJ5X3N1YikpCisgICAgICAgIGdvdG8gb29tOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW50cnlfdmFsdWVfc2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2VudHJpZXM7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgbl9lbnRyaWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9BUlJBWSk7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmIChuX2VudHJpZXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGVudHJ5X3N1YjsKKworICAgICAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmZW50cnlfc3ViKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfaW50MzJfdCB2OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAoJmVudHJ5X3N1YiwgREJVU19UWVBFX0lOVDMyKTsKKworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmZW50cnlfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQzMl90KikgJnYpOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZlbnRyeV9zdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZlbnRyeV9zdWIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IHY7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAoJmVudHJ5X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfc2V0X3ZhbHVlIChjaGlsZCwgJmVudHJ5X3N1YiwgcmVhbGlnbl9yb290LCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmZW50cnlfc3ViKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoaSA9PSAobl9lbnRyaWVzIC0gMSkpCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnN1Yik7CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3Rfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfVFlQRV9BUlJBWSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HKSkKKyAgICBnb3RvIG9vbTsKKyAgCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitjb250YWluZXJfZGVzdHJveSAoVGVzdFR5cGVOb2RlICpub2RlKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMTZlOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCkBAIC0wLDAgKzEsMjc1NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgIE1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciByZWN1cnNpdmUgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01hcnNoYWwKKyAqIEB7CisgKi8KKworc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX3R5cGVfcmVhZGVyX2dyZWF0ZXJfdGhhbiAgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmhzKTsKKworc3RhdGljIHZvaWQgICAgICAgX2RidXNfdHlwZV93cml0ZXJfc2V0X2VuYWJsZWQgICAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBlbmFibGVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXJfcGFydGlhbCAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAgKipmaXh1cHMpOworCisvKiogdHVybiB0aGlzIG9uIHRvIGdldCBkZWx1Z2VkIGluIFR5cGVSZWFkZXIgdmVyYm9zZSBzcGFtICovCisjZGVmaW5lIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UgIDAKKworLyoqIHR1cm4gdGhpcyBvbiB0byBnZXQgZGVsdWdlZCBpbiBUeXBlV3JpdGVyIHZlcmJvc2Ugc3BhbSAqLworI2RlZmluZSBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRSAwCisKK3N0YXRpYyB2b2lkCitmcmVlX2ZpeHVwcyAoREJ1c0xpc3QgKipmaXh1cHMpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChmaXh1cHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworCisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChmaXh1cHMsIGxpbmspOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgKmZpeHVwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithcHBseV9hbmRfZnJlZV9maXh1cHMgKERCdXNMaXN0ICAgICAgKipmaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgaWYgKCpmaXh1cHMpCisgICAgX2RidXNfdmVyYm9zZSAoIiAlZCBGSVhVUFMgdG8gYXBwbHlcbiIsCisgICAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChmaXh1cHMpKTsKKyNlbmRpZgorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChmaXh1cHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworCisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChmaXh1cHMsIGxpbmspOworCisgICAgICBpZiAocmVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0FycmF5TGVuRml4dXAgKmY7CisKKyAgICAgICAgICBmID0gbGluay0+ZGF0YTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBhcHBseWluZyBGSVhVUCB0byByZWFkZXIgJXAgYXQgcG9zICVkIG5ld19sZW4gPSAlZCBvbGQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwgZi0+bGVuX3Bvc19pbl9yZWFkZXIsIGYtPm5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLCBOVUxMKSk7CisjZW5kaWYKKworICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoKERCdXNTdHJpbmcqKSByZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmxlbl9wb3NfaW5fcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlcik7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgICpmaXh1cHMgPSBOVUxMOworfQorCisvKioKKyAqIFZpcnR1YWwgdGFibGUgZm9yIGEgdHlwZSByZWFkZXIuCisgKi8KK3N0cnVjdCBEQnVzVHlwZVJlYWRlckNsYXNzCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgbmFtZSBmb3IgZGVidWdnaW5nICovCisgIGludCAgICAgICAgIGlkOyAgICAgICAgIC8qKjwgaW5kZXggaW4gYWxsX3JlYWRlcl9jbGFzc2VzICovCisgIGRidXNfYm9vbF90IHR5cGVzX29ubHk7IC8qKjwgb25seSBpdGVyYXRlcyBvdmVyIHR5cGVzLCBub3QgdmFsdWVzICovCisgIHZvaWQgICAgICAgICgqIHJlY3Vyc2UpICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcGFyZW50KTsgLyoqPCByZWN1cnNlIHdpdGggdGhpcyByZWFkZXIgYXMgc3ViICovCisgIGRidXNfYm9vbF90ICgqIGNoZWNrX2ZpbmlzaGVkKSAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7IC8qKjwgY2hlY2sgd2hldGhlciByZWFkZXIgaXMgYXQgdGhlIGVuZCAqLworICB2b2lkICAgICAgICAoKiBuZXh0KSAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSk7IC8qKjwgZ28gdG8gdGhlIG5leHQgdmFsdWUgKi8KK307CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdHlwZV9nZXRfYWxpZ25tZW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3RyLCBwb3MpKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRlcl9pbml0IChEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICBfREJVU19aRVJPICgqcmVhZGVyKTsKKyAgcmVhZGVyLT5ieXRlX29yZGVyID0gYnl0ZV9vcmRlcjsKKyAgcmVhZGVyLT5maW5pc2hlZCA9IEZBTFNFOworICByZWFkZXItPnR5cGVfc3RyID0gdHlwZV9zdHI7CisgIHJlYWRlci0+dHlwZV9wb3MgPSB0eXBlX3BvczsKKyAgcmVhZGVyLT52YWx1ZV9zdHIgPSB2YWx1ZV9zdHI7CisgIHJlYWRlci0+dmFsdWVfcG9zID0gdmFsdWVfcG9zOworfQorCitzdGF0aWMgdm9pZAorYmFzZV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIC8qIHBvaW50IHN1YnJlYWRlciBhdCB0aGUgc2FtZSBwbGFjZSBhcyBwYXJlbnQgKi8KKyAgcmVhZGVyX2luaXQgKHN1YiwKKyAgICAgICAgICAgICAgIHBhcmVudC0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIHBhcmVudC0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICBwYXJlbnQtPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgcGFyZW50LT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICBwYXJlbnQtPnZhbHVlX3Bvcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3Rfb3JfZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgYmFzZV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIHx8CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3BvcykgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworCisgIHN1Yi0+dHlwZV9wb3MgKz0gMTsKK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9vcl9kaWN0X2VudHJ5X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICAvKiBzdHJ1Y3QgYW5kIGRpY3QgZW50cnkgaGF2ZSA4IGJ5dGUgYWxpZ25tZW50ICovCisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA4KTsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBiYXNlX3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisKKyAgLyogcG9pbnQgdHlwZV9wb3MgYXQgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSAqLworICBzdWItPnR5cGVfcG9zICs9IDE7CisKKyAgLyogSW5pdCB3aXRoIHZhbHVlcyBsaWtlbHkgdG8gY3Jhc2ggdGhpbmdzIGlmIG1pc3VzZWQgKi8KKyAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9IF9EQlVTX0lOVF9NQVg7CisgIHN1Yi0+YXJyYXlfbGVuX29mZnNldCA9IDc7Cit9CisKKy8qKiBjb21wdXRlIHBvc2l0aW9uIG9mIGFycmF5IGxlbmd0aCBnaXZlbiBhcnJheV9sZW5fb2Zmc2V0LCB3aGljaCBpcworICAgIHRoZSBvZmZzZXQgYmFjayBmcm9tIHN0YXJ0X3BvcyB0byBlbmQgb2YgdGhlIGxlbiAqLworI2RlZmluZSBBUlJBWV9SRUFERVJfTEVOX1BPUyhyZWFkZXIpIFwKKyAgKChyZWFkZXIpLT51LmFycmF5LnN0YXJ0X3BvcyAtICgoaW50KShyZWFkZXIpLT5hcnJheV9sZW5fb2Zmc2V0KSAtIDQpCisKK3N0YXRpYyBpbnQKK2FycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChjb25zdCBEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICBkYnVzX3VpbnQzMl90IGFycmF5X2xlbjsKKyAgaW50IGxlbl9wb3M7CisKKyAgbGVuX3BvcyA9IEFSUkFZX1JFQURFUl9MRU5fUE9TIChyZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGxlbl9wb3MsIDQpID09ICh1bnNpZ25lZCkgbGVuX3Bvcyk7CisgIGFycmF5X2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsIGxlbl9wb3MsIDQpKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgIHJlYWRlciAlcCBsZW5fcG9zICVkIGFycmF5IGxlbiAldSBsZW5fb2Zmc2V0ICVkXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIGxlbl9wb3MsIGFycmF5X2xlbiwgcmVhZGVyLT5hcnJheV9sZW5fb2Zmc2V0KTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyAtIGxlbl9wb3MgLSA0IDwgOCk7CisKKyAgcmV0dXJuIGFycmF5X2xlbjsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGludCBhbGlnbm1lbnQ7CisgIGludCBsZW5fcG9zOworCisgIGFycmF5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgNCk7CisKKyAgbGVuX3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgIHN1Yi0+dmFsdWVfcG9zICs9IDQ7IC8qIGZvciB0aGUgbGVuZ3RoICovCisKKyAgYWxpZ25tZW50ID0gZWxlbWVudF90eXBlX2dldF9hbGlnbm1lbnQgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKTsKKworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgYWxpZ25tZW50KTsKKworICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID0gc3ViLT52YWx1ZV9wb3M7CisgIF9kYnVzX2Fzc2VydCAoKHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgLSAobGVuX3BvcyArIDQpKSA8IDgpOyAvKiBvbmx5IDMgYml0cyBpbiBhcnJheV9sZW5fb2Zmc2V0ICovCisgIHN1Yi0+YXJyYXlfbGVuX29mZnNldCA9IHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgLSAobGVuX3BvcyArIDQpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICAgIHR5cGUgcmVhZGVyICVwIGFycmF5IHN0YXJ0ID0gJWQgbGVuX29mZnNldCA9ICVkIGFycmF5IGxlbiA9ICVkIGFycmF5IGVsZW1lbnQgdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgIHN1Yi0+YXJyYXlfbGVuX29mZnNldCwKKyAgICAgICAgICAgICAgICAgYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHN1YiksCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit2YXJpYW50X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgaW50IHNpZ19sZW47CisgIGludCBjb250YWluZWRfYWxpZ25tZW50OworCisgIGJhc2VfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICAvKiBWYXJpYW50IGlzIDEgYnl0ZSBzaWcgbGVuZ3RoICh3aXRob3V0IG51bCksIHNpZ25hdHVyZSB3aXRoIG51bCwKKyAgICogcGFkZGluZyB0byA4LWJvdW5kYXJ5LCB0aGVuIHZhbHVlcworICAgKi8KKworICBzaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdWItPnZhbHVlX3N0ciwgc3ViLT52YWx1ZV9wb3MpOworCisgIHN1Yi0+dHlwZV9zdHIgPSBzdWItPnZhbHVlX3N0cjsKKyAgc3ViLT50eXBlX3BvcyA9IHN1Yi0+dmFsdWVfcG9zICsgMTsKKworICBzdWItPnZhbHVlX3BvcyA9IHN1Yi0+dHlwZV9wb3MgKyBzaWdfbGVuICsgMTsKKworICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpKTsKKyAgCisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCBjb250YWluZWRfYWxpZ25tZW50KTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgICB0eXBlIHJlYWRlciAlcCB2YXJpYW50IGNvbnRhaW5pbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9yZWFkZXJfY2hlY2tfZmluaXNoZWQgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGludCBlbmRfcG9zOworCisgIC8qIHJldHVybiB0aGUgYXJyYXkgZWxlbWVudCB0eXBlIGlmIGVsZW1lbnRzIHJlbWFpbiwgYW5kCisgICAqIFRZUEVfSU5WQUxJRCBvdGhlcndpc2UKKyAgICovCisKKyAgZW5kX3BvcyA9IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MgKyBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAocmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zIDw9IGVuZF9wb3MpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MpOworCisgIHJldHVybiByZWFkZXItPnZhbHVlX3BvcyA9PSBlbmRfcG9zOworfQorCitzdGF0aWMgdm9pZAorc2tpcF9vbmVfY29tcGxldGVfdHlwZSAoY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICp0eXBlX3BvcykKK3sKKyAgX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh0eXBlX3N0ciksCisJCQkgICAgIHR5cGVfcG9zKTsKK30KKworLyoqCisgKiBTa2lwcyB0byB0aGUgbmV4dCAiY29tcGxldGUiIHR5cGUgaW5zaWRlIGEgdHlwZSBzaWduYXR1cmUuCisgKiBUaGUgc2lnbmF0dXJlIGlzIHJlYWQgc3RhcnRpbmcgYXQgdHlwZV9wb3MsIGFuZCB0aGUgbmV4dAorICogdHlwZSBwb3NpdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHNhbWUgdmFyaWFibGUuCisgKgorICogQHBhcmFtIHR5cGVfc3RyIGEgdHlwZSBzaWduYXR1cmUgKG11c3QgYmUgdmFsaWQpCisgKiBAcGFyYW0gdHlwZV9wb3MgYW4gaW50ZWdlciBwb3NpdGlvbiBpbiB0aGUgdHlwZSBzaWduYXR1cmUgKGluIGFuZCBvdXQpCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgKGNvbnN0IGNoYXIgICAgICAgKnR5cGVfc3RyLAorCQkJICAgaW50ICAgICAgICAgICAgICAqdHlwZV9wb3MpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0OworCisgIF9kYnVzX2Fzc2VydCAodHlwZV9zdHIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHlwZV9wb3MgIT0gTlVMTCk7CisgIAorICBzdGFydCA9IHR5cGVfc3RyOworICBwID0gc3RhcnQgKyAqdHlwZV9wb3M7CisKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgCisgIHdoaWxlICgqcCA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgKytwOworCisgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgIAorICBpZiAoKnAgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikKKyAgICB7CisgICAgICBpbnQgZGVwdGg7CisKKyAgICAgIGRlcHRoID0gMTsKKworICAgICAgd2hpbGUgKFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICsrcDsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgaWYgKCpwID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgICAgICAgICBkZXB0aCArPSAxOworICAgICAgICAgIGVsc2UgaWYgKCpwID09IERCVVNfU1RSVUNUX0VORF9DSEFSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkZXB0aCAtPSAxOworICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCpwID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKQorICAgIHsKKyAgICAgIGludCBkZXB0aDsKKworICAgICAgZGVwdGggPSAxOworCisgICAgICB3aGlsZSAoVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgKytwOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICBpZiAoKnAgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgICAgICAgICBkZXB0aCArPSAxOworICAgICAgICAgIGVsc2UgaWYgKCpwID09IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGVwdGggLT0gMTsKKyAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKytwOworICAgIH0KKworICAqdHlwZV9wb3MgPSAoaW50KSAocCAtIHN0YXJ0KTsKK30KKworc3RhdGljIGludAorZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAoY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlX3BvcykKK3sKKyAgaW50IGVuZDsKKworICBlbmQgPSB0eXBlX3BvczsKKworICBza2lwX29uZV9jb21wbGV0ZV90eXBlICh0eXBlX3N0ciwgJmVuZCk7CisKKyAgcmV0dXJuIGVuZCAtIHR5cGVfcG9zOworfQorCitzdGF0aWMgdm9pZAorYmFzZV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIHN3aXRjaCAoY3VycmVudF90eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOgorICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgLyogU2NhbiBmb3J3YXJkIG92ZXIgdGhlIGVudGlyZSBjb250YWluZXIgY29udGVudHMgKi8KKyAgICAgIHsKKyAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworCisgICAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5ICYmIGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfVkFSSUFOVCkKKyAgICAgICAgICA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWN1cnNlIGludG8gdGhlIHN0cnVjdCBvciB2YXJpYW50ICovCisgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgICAgICAvKiBTa2lwIGV2ZXJ5dGhpbmcgaW4gdGhpcyBzdWJyZWFkZXIgKi8KKyAgICAgICAgICAgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi87CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGlmICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcyA9IHN1Yi52YWx1ZV9wb3M7CisKKyAgICAgICAgLyogTm93IHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgY29udGFpbmVyOyBmb3IgdmFyaWFudHMsIHRoZQorICAgICAgICAgKiBzdWJyZWFkZXIncyB0eXBlX3BvcyBpcyB0b3RhbGx5IGluYXBwbGljYWJsZSAoaXQncyBpbiB0aGUKKyAgICAgICAgICogdmFsdWUgc3RyaW5nKSBidXQgd2Uga25vdyB0aGF0IHdlIGluY3JlbWVudCBieSBvbmUgcGFzdCB0aGUKKyAgICAgICAgICogREJVU19UWVBFX1ZBUklBTlQKKyAgICAgICAgICovCisgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1ZBUklBTlQpCisgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyArPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyA9IHN1Yi50eXBlX3BvczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICB7CisgICAgICAgIGlmICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dmFsdWVfcG9zKTsKKworICAgICAgICBza2lwX29uZV9jb21wbGV0ZV90eXBlIChyZWFkZXItPnR5cGVfc3RyLCAmcmVhZGVyLT50eXBlX3Bvcyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9iYXNpYyAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlLCByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dmFsdWVfcG9zKTsKKworICAgICAgcmVhZGVyLT50eXBlX3BvcyArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RydWN0X3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICBpbnQgdDsKKworICBiYXNlX3JlYWRlcl9uZXh0IChyZWFkZXIsIGN1cnJlbnRfdHlwZSk7CisKKyAgLyogZm9yIFNUUlVDVCBjb250YWluZXJzIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QsCisgICAqIGZvciBJTlZBTElEIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzaWduYXR1cmUuCisgICAqIEluIGJvdGggY2FzZXMgd2UgYXJyYW5nZSBmb3IgZ2V0X2N1cnJlbnRfdHlwZSgpIHRvIHJldHVybiBJTlZBTElECisgICAqIHdoaWNoIGlzIGRlZmluZWQgdG8gaGFwcGVuIGlmZiB3ZSdyZSBhdCB0aGUgZW5kIChubyBtb3JlIG5leHQoKSkKKyAgICovCisgIHQgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworICBpZiAodCA9PSBEQlVTX1NUUlVDVF9FTkRfQ0hBUikKKyAgICB7CisgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICByZWFkZXItPmZpbmlzaGVkID0gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkaWN0X2VudHJ5X3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgaW50IHQ7CisKKyAgYmFzZV9yZWFkZXJfbmV4dCAocmVhZGVyLCBjdXJyZW50X3R5cGUpOworCisgIC8qIGZvciBTVFJVQ1QgY29udGFpbmVycyB3ZSByZXR1cm4gRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LAorICAgKiBmb3IgSU5WQUxJRCB3ZSByZXR1cm4gRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUgc2lnbmF0dXJlLgorICAgKiBJbiBib3RoIGNhc2VzIHdlIGFycmFuZ2UgZm9yIGdldF9jdXJyZW50X3R5cGUoKSB0byByZXR1cm4gSU5WQUxJRAorICAgKiB3aGljaCBpcyBkZWZpbmVkIHRvIGhhcHBlbiBpZmYgd2UncmUgYXQgdGhlIGVuZCAobm8gbW9yZSBuZXh0KCkpCisgICAqLworICB0ID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zKTsKKyAgaWYgKHQgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorICAgIHsKKyAgICAgIHJlYWRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICAgIHJlYWRlci0+ZmluaXNoZWQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FycmF5X3R5cGVzX29ubHlfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICAvKiBXZSBoYXZlIG9uZSAiZWxlbWVudCIgdG8gYmUgaXRlcmF0ZWQgb3ZlcgorICAgKiBpbiBlYWNoIGFycmF5LCB3aGljaCBpcyBpdHMgZWxlbWVudCB0eXBlLgorICAgKiBTbyB0aGUgZmluaXNoZWQgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSd2ZQorICAgKiBpdGVyYXRlZCBvdmVyIGl0IHlldCBvciBub3QuCisgICAqLworICByZWFkZXItPmZpbmlzaGVkID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIC8qIFNraXAgb25lIGFycmF5IGVsZW1lbnQgKi8KKyAgaW50IGVuZF9wb3M7CisKKyAgZW5kX3BvcyA9IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MgKyBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAocmVhZGVyKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgcmVhZGVyICVwIGFycmF5IG5leHQgU1RBUlQgc3RhcnRfcG9zID0gJWQgZW5kX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsCisgICAgICAgICAgICAgICAgIHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgIGVuZF9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zIDwgZW5kX3Bvcyk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPj0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3Bvcyk7CisKKyAgc3dpdGNoIChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcykpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICB7CisgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKworICAgICAgICAvKiBSZWN1cnNlIGludG8gdGhlIHN0cnVjdCBvciB2YXJpYW50ICovCisgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgLyogU2tpcCBldmVyeXRoaW5nIGluIHRoaXMgZWxlbWVudCAqLworICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1YikpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyAqLzsKKyAgICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudCAqLworICAgICAgICByZWFkZXItPnZhbHVlX3BvcyA9IHN1Yi52YWx1ZV9wb3M7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgeworICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnZhbHVlX3Bvcyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9iYXNpYyAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlLCByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dmFsdWVfcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgcmVhZGVyICVwIGFycmF5IG5leHQgRU5EIHN0YXJ0X3BvcyA9ICVkIGVuZF9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBjdXJyZW50X3R5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICBlbmRfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSkpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA8PSBlbmRfcG9zKTsKKworICBpZiAocmVhZGVyLT52YWx1ZV9wb3MgPT0gZW5kX3BvcykKKyAgICB7CisgICAgICBza2lwX29uZV9jb21wbGV0ZV90eXBlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dHlwZV9wb3MpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgYm9keV9yZWFkZXJfY2xhc3MgPSB7CisgICJib2R5IiwgMCwKKyAgRkFMU0UsCisgIE5VTEwsIC8qIGJvZHkgaXMgYWx3YXlzIHRvcGxldmVsLCBzbyBkb2Vzbid0IGdldCByZWN1cnNlZCBpbnRvICovCisgIE5VTEwsCisgIGJhc2VfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGJvZHlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MgPSB7CisgICJib2R5IHR5cGVzIiwgMSwKKyAgVFJVRSwKKyAgTlVMTCwgLyogYm9keSBpcyBhbHdheXMgdG9wbGV2ZWwsIHNvIGRvZXNuJ3QgZ2V0IHJlY3Vyc2VkIGludG8gKi8KKyAgTlVMTCwKKyAgYmFzZV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3Mgc3RydWN0X3JlYWRlcl9jbGFzcyA9IHsKKyAgInN0cnVjdCIsIDIsCisgIEZBTFNFLAorICBzdHJ1Y3Rfb3JfZGljdF9lbnRyeV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgc3RydWN0X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBzdHJ1Y3RfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MgPSB7CisgICJzdHJ1Y3QgdHlwZXMiLCAzLAorICBUUlVFLAorICBzdHJ1Y3Rfb3JfZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBzdHJ1Y3RfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGRpY3RfZW50cnlfcmVhZGVyX2NsYXNzID0geworICAiZGljdF9lbnRyeSIsIDQsCisgIEZBTFNFLAorICBzdHJ1Y3Rfb3JfZGljdF9lbnRyeV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgZGljdF9lbnRyeV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImRpY3RfZW50cnkgdHlwZXMiLCA1LAorICBUUlVFLAorICBzdHJ1Y3Rfb3JfZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBkaWN0X2VudHJ5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBhcnJheV9yZWFkZXJfY2xhc3MgPSB7CisgICJhcnJheSIsIDYsCisgIEZBTFNFLAorICBhcnJheV9yZWFkZXJfcmVjdXJzZSwKKyAgYXJyYXlfcmVhZGVyX2NoZWNrX2ZpbmlzaGVkLAorICBhcnJheV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MgPSB7CisgICJhcnJheSB0eXBlcyIsIDcsCisgIFRSVUUsCisgIGFycmF5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGFycmF5X3R5cGVzX29ubHlfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIHZhcmlhbnRfcmVhZGVyX2NsYXNzID0geworICAidmFyaWFudCIsIDgsCisgIEZBTFNFLAorICB2YXJpYW50X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBiYXNlX3JlYWRlcl9uZXh0Cit9OworCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzICogY29uc3QKK2FsbF9yZWFkZXJfY2xhc3Nlc1tdID0geworICAmYm9keV9yZWFkZXJfY2xhc3MsCisgICZib2R5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmc3RydWN0X3JlYWRlcl9jbGFzcywKKyAgJnN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzcywKKyAgJmRpY3RfZW50cnlfcmVhZGVyX2NsYXNzLAorICAmZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcywKKyAgJmFycmF5X3JlYWRlcl9jbGFzcywKKyAgJmFycmF5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmdmFyaWFudF9yZWFkZXJfY2xhc3MKK307CisjZW5kaWYKKworLyoqCisgKiBJbml0aWFsaXplcyBhIHR5cGUgcmVhZGVyLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGJsb2NrIHRvIHJlYWQKKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBibG9jayB0byByZWFkCisgKiBAcGFyYW0gdHlwZV9wb3MgbG9jYXRpb24gb2Ygc2lnbmF0dXJlCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB2YWx1ZXMgYmxvY2sKKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgc3RhcnQgb2YgdmFsdWVzIGJsb2NrCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX2luaXQgKERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICByZWFkZXJfaW5pdCAocmVhZGVyLCBieXRlX29yZGVyLCB0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlX3Bvcyk7CisKKyAgcmVhZGVyLT5rbGFzcyA9ICZib2R5X3JlYWRlcl9jbGFzczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgaW5pdCB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogTGlrZSBfZGJ1c190eXBlX3JlYWRlcl9pbml0KCkgYnV0IHRoZSBpdGVyYXRpb24gaXMgb3ZlciB0aGUKKyAqIHNpZ25hdHVyZSwgbm90IG92ZXIgdmFsdWVzLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHR5cGVfc3RyIHRoZSBzaWduYXR1cmUgc3RyaW5nCisgKiBAcGFyYW0gdHlwZV9wb3MgbG9jYXRpb24gaW4gdGhlIHNpZ25hdHVyZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5IChEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0eXBlX3BvcykKK3sKKyAgcmVhZGVyX2luaXQgKHJlYWRlciwgREJVU19DT01QSUxFUl9CWVRFX09SREVSIC8qIGlycmVsZXZhbnQgKi8sCisgICAgICAgICAgICAgICB0eXBlX3N0ciwgdHlwZV9wb3MsIE5VTEwsIF9EQlVTX0lOVF9NQVggLyogY3Jhc2hlcyBpZiB3ZSBzY3JldyB1cCAqLyk7CisKKyAgcmVhZGVyLT5rbGFzcyA9ICZib2R5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBpbml0IHR5cGVzIG9ubHkgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdGhlIHJlYWRlciBpcyBjdXJyZW50bHkgcG9pbnRpbmcgdG87CisgKiBvciBmb3IgYSB0eXBlcy1vbmx5IHJlYWRlciBnZXRzIHRoZSB0eXBlIGl0J3MgY3VycmVudGx5IHBvaW50aW5nIHRvLgorICogSWYgdGhlIHJlYWRlciBpcyBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgb3IgZW5kIG9mIGEgY29udGFpbmVyIHN1Y2gKKyAqIGFzIGFuIGFycmF5LCByZXR1cm5zICNEQlVTX1RZUEVfSU5WQUxJRC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqLworaW50CitfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChjb25zdCBEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICBpbnQgdDsKKworICBpZiAocmVhZGVyLT5maW5pc2hlZCB8fAorICAgICAgKHJlYWRlci0+a2xhc3MtPmNoZWNrX2ZpbmlzaGVkICYmCisgICAgICAgKCogcmVhZGVyLT5rbGFzcy0+Y2hlY2tfZmluaXNoZWQpIChyZWFkZXIpKSkKKyAgICB0ID0gREJVU19UWVBFX0lOVkFMSUQ7CisgIGVsc2UKKyAgICB0ID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zKTsKKworICBfZGJ1c19hc3NlcnQgKHQgIT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKHQgIT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKHQgIT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworICAKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIGN1cnJlbnQgdHlwZV9wb3MgPSAlZCB0eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpKTsKKyNlbmRpZgorCisgIHJldHVybiB0OworfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhlIHJlYWRlciBpcyBjdXJyZW50bHkKKyAqIHBvaW50aW5nIHRvLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBpZgorICogX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSgpIGRvZXNuJ3QgcmV0dXJuICNEQlVTX1RZUEVfQVJSQVkKKyAqIGZvciB0aGlzIHJlYWRlci4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqLworaW50CitfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcikKK3sKKyAgaW50IGVsZW1lbnRfdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKworICBlbGVtZW50X3R5cGUgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgKyAxKTsKKworICByZXR1cm4gZWxlbWVudF90eXBlOworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHZhbHVlIGJsb2NrCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqLworaW50CitfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcikKK3sKKyAgcmV0dXJuIHJlYWRlci0+dmFsdWVfcG9zOworfQorCisvKioKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbWFyc2hhbGVkIHZhbHVlIGluIHRoZSBkYXRhIGJlaW5nIHJlYWQuICBUaGUKKyAqIGFkZHJlc3MgbWF5IG5vdCBiZSBhbGlnbmVkOyB5b3UgaGF2ZSB0byBhbGlnbiBpdCB0byB0aGUgdHlwZSBvZiB0aGUKKyAqIHZhbHVlIHlvdSB3YW50IHRvIHJlYWQuIE1vc3Qgb2YgdGhlIGRlbWFyc2hhbCByb3V0aW5lcyBkbyB0aGlzIGZvcgorICogeW91LgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHZhbHVlX2xvY2F0aW9uIHRoZSBhZGRyZXNzIG9mIHRoZSBtYXJzaGFsZWQgdmFsdWUKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9yYXcgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICoqdmFsdWVfbG9jYXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpOworCisgICp2YWx1ZV9sb2NhdGlvbiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Cit9CisKKy8qKgorICogUmVhZHMgYSBiYXNpYy10eXBlZCB2YWx1ZSwgYXMgd2l0aCBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMoKS4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK3sKKyAgaW50IHQ7CisKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisKKyAgdCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgcmVhZCBiYXNpYyB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheS4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheQorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV9sZW5ndGggKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKQoreworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPmtsYXNzID09ICZhcnJheV9yZWFkZXJfY2xhc3MpOworCisgIHJldHVybiBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAocmVhZGVyKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB2YWx1ZXMsIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQKKyAqIGluIGFuIGFycmF5IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiAgRG9lcyBub3Qgd29yayBmb3IgYXJyYXlzIG9mCisgKiBzdHJpbmcgb3IgY29udGFpbmVyIHR5cGVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYXJyYXkgaW4tcGxhY2U7IGl0IGRvZXMgbm90IG1ha2UgYSBjb3B5LAorICogYW5kIGl0IGRvZXMgbm90IHN3YXAgdGhlIGJ5dGVzLgorICoKKyAqIElmIHlvdSBhc2sgZm9yICNEQlVTX1RZUEVfRE9VQkxFIHlvdSB3aWxsIGdldCBhICJjb25zdCBkb3VibGUqIiBiYWNrCisgKiBhbmQgdGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIGEgImNvbnN0IGRvdWJsZSoqIiBhbmQgc28gb24uCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIHZhbHVlIHBsYWNlIHRvIHJldHVybiB0aGUgYXJyYXkgdmFsdWVzCisgKiBAcGFyYW0gbl9lbGVtZW50cyBwbGFjZSB0byByZXR1cm4gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbl9lbGVtZW50cykKK3sKKyAgaW50IGVsZW1lbnRfdHlwZTsKKyAgaW50IGVuZF9wb3M7CisgIGludCByZW1haW5pbmdfbGVuOworICBpbnQgYWxpZ25tZW50OworICBpbnQgdG90YWxfbGVuOworCisgIF9kYnVzX2Fzc2VydCAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+a2xhc3MgPT0gJmFycmF5X3JlYWRlcl9jbGFzcyk7CisKKyAgZWxlbWVudF90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zKTsKKworICBfZGJ1c19hc3NlcnQgKGVsZW1lbnRfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7IC8qIHdoeSB3ZSBkb24ndCB1c2UgZ2V0X2N1cnJlbnRfdHlwZSgpICovCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKTsKKworICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1lbnRfdHlwZSk7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA+PSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zKTsKKworICB0b3RhbF9sZW4gPSBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAocmVhZGVyKTsKKyAgZW5kX3BvcyA9IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MgKyB0b3RhbF9sZW47CisgIHJlbWFpbmluZ19sZW4gPSBlbmRfcG9zIC0gcmVhZGVyLT52YWx1ZV9wb3M7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRfcG9zICVkIHRvdGFsX2xlbiAlZCByZW1haW5pbmdfbGVuICVkIHZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZW5kX3BvcywgdG90YWxfbGVuLCByZW1haW5pbmdfbGVuLCByZWFkZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHJlbWFpbmluZ19sZW4gPD0gdG90YWxfbGVuKTsKKworICBpZiAocmVtYWluaW5nX2xlbiA9PSAwKQorICAgICooY29uc3QgREJ1c0Jhc2ljVmFsdWUqKikgdmFsdWUgPSBOVUxMOworICBlbHNlCisgICAgKihjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKSB2YWx1ZSA9CisgICAgICAodm9pZCopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX2xlbik7CisKKyAgKm5fZWxlbWVudHMgPSByZW1haW5pbmdfbGVuIC8gYWxpZ25tZW50OworICBfZGJ1c19hc3NlcnQgKChyZW1haW5pbmdfbGVuICUgYWxpZ25tZW50KSA9PSAwKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgcmVhZCBmaXhlZCBhcnJheSB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyByZWFkZXIgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHR5cGUgYW5kCisgKiBjb3JyZXNwb25kaW5nIHZhbHVlIHRoYXQncyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IGNvbnRhaW5lci4gSXQncworICogYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMgYSBub24tY29udGFpbmVyLgorICoKKyAqIE5vdGUgdGhhdCBEQnVzVHlwZVJlYWRlciB0cmF2ZXJzZXMgdmFsdWVzLCBub3QgdHlwZXMuIFNvIGlmIHlvdQorICogaGF2ZSBhbiBlbXB0eSBhcnJheSBvZiBhcnJheSBvZiBpbnQsIHlvdSBjYW4ndCByZWN1cnNlIGludG8gaXQuIFlvdQorICogY2FuIG9ubHkgcmVjdXJzZSBpbnRvIGVhY2ggZWxlbWVudC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSBzdWIgYSByZWFkZXIgdG8gaW5pdCBwb2ludGluZyB0byB0aGUgZmlyc3QgY2hpbGQKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpzdWIpCit7CisgIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgKmtsYXNzOworICBpbnQgdDsKKworICB0ID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworCisgIHN3aXRjaCAodCkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIGtsYXNzID0gJnN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmc3RydWN0X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICBpZiAocmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAga2xhc3MgPSAmZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmZGljdF9lbnRyeV9yZWFkZXJfY2xhc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBrbGFzcyA9ICZhcnJheV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmYXJyYXlfcmVhZGVyX2NsYXNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCByZWN1cnNlIGludG8gdmFyaWFudCB0eXBlY29kZSIpOworICAgICAgZWxzZQorICAgICAgICBrbGFzcyA9ICZ2YXJpYW50X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c192ZXJib3NlICgicmVjdXJzaW5nIGludG8gdHlwZSAlc1xuIiwgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgaWYgKHQgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiWW91IGNhbid0IHJlY3Vyc2UgaW50byBhbiBlbXB0eSBhcnJheSBvciBvZmYgdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm9keVxuIik7CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb24ndCB5ZXQgaGFuZGxlIHJlY3Vyc2luZyBpbnRvIHRoaXMgdHlwZSIpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGtsYXNzID09IGFsbF9yZWFkZXJfY2xhc3Nlc1trbGFzcy0+aWRdKTsKKworICAoKiBrbGFzcy0+cmVjdXJzZSkgKHN1YiwgcmVhZGVyKTsKKyAgc3ViLT5rbGFzcyA9IGtsYXNzOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBSRUNVUlNFRCB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLCBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3ViLT50eXBlX3N0ciwgc3ViLT50eXBlX3BvcywgMCkpOworI2VuZGlmCit9CisKKy8qKgorICogU2tpcCB0byB0aGUgbmV4dCB2YWx1ZSBvbiB0aGlzICJsZXZlbCIuIGUuZy4gdGhlIG5leHQgZmllbGQgaW4gYQorICogc3RydWN0LCB0aGUgbmV4dCB2YWx1ZSBpbiBhbiBhcnJheS4gUmV0dXJucyBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZQorICogY3VycmVudCBjb250YWluZXIuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcmV0dXJucyBGQUxTRSBpZiBub3RoaW5nIG1vcmUgdG8gcmVhZCBhdCBvciBiZWxvdyB0aGlzIGxldmVsCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICBpbnQgdDsKKworICB0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgU1RBUlQgbmV4dCgpIHsgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCkpOworI2VuZGlmCisKKyAgaWYgKHQgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgcmV0dXJuIEZBTFNFOworCisgICgqIHJlYWRlci0+a2xhc3MtPm5leHQpIChyZWFkZXIsIHQpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBFTkQgbmV4dCgpIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikpKTsKKyNlbmRpZgorCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlcmUncyBhbm90aGVyIHZhbHVlIG9uIHRoaXMgImxldmVsIi4gZS5nLiB0aGUgbmV4dAorICogZmllbGQgaW4gYSBzdHJ1Y3QsIHRoZSBuZXh0IHZhbHVlIGluIGFuIGFycmF5LiBSZXR1cm5zIEZBTFNFIGF0IHRoZQorICogZW5kIG9mIHRoZSBjdXJyZW50IGNvbnRhaW5lci4KKyAqCisgKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byB1c2UgdGhpczsgaXQgbWFrZXMgZm9yIGFuIGF3a3dhcmQgZm9yL3doaWxlCisgKiBsb29wLiBBIG5pY2VyIG9uZSBpcyAid2hpbGUgKChjdXJyZW50X3R5cGUgPSBnZXRfY3VycmVudF90eXBlKCkpICE9IElOVkFMSUQpIgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHJldHVybnMgRkFMU0UgaWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYXQgb3IgYmVsb3cgdGhpcyBsZXZlbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIC8qIE5vdCBlZmZpY2llbnQgYnV0IHdvcmtzIGZvciBub3cuICovCisgIERCdXNUeXBlUmVhZGVyIGNvcHk7CisKKyAgY29weSA9ICpyZWFkZXI7CisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmY29weSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgc3RyaW5nIGFuZCByYW5nZSBvZiBzYWlkIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUKKyAqIG9mIHRoZSBjdXJyZW50IHZhbHVlLiBFc3NlbnRpYWxseSBhIG1vcmUgY29tcGxldGUgdmVyc2lvbiBvZgorICogX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSgpIChyZXR1cm5zIHRoZSBmdWxsIHR5cGUKKyAqIHJhdGhlciB0aGFuIG9ubHkgdGhlIG91dHNpZGUgb2YgdGhlIG9uaW9uKS4KKyAqCisgKiBOb3RlIHRob3VnaCB0aGF0IHRoZSBmaXJzdCBieXRlIGluIGEgc3RydWN0IHNpZ25hdHVyZSBpcworICogI0RCVVNfU1RSVUNUX0JFR0lOX0NIQVIgd2hpbGUgdGhlIGN1cnJlbnQgdHlwZSB3aWxsIGJlCisgKiAjREJVU19UWVBFX1NUUlVDVCBzbyBpdCBpc24ndCB0cnVlIHRoYXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisgKiBzaWduYXR1cmUgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHR5cGUuIEFub3RoZXIKKyAqIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RpbGwgcmV0dXJuIGEgc2lnbmF0dXJlIHdoZW4KKyAqIGluc2lkZSBhbiBlbXB0eSBhcnJheTsgc2F5IHlvdSByZWN1cnNlIGludG8gZW1wdHkgYXJyYXkgb2YgaW50MzIsCisgKiB0aGUgc2lnbmF0dXJlIGlzICJpIiBidXQgdGhlIGN1cnJlbnQgdHlwZSB3aWxsIGFsd2F5cyBiZQorICogI0RCVVNfVFlQRV9JTlZBTElEIHNpbmNlIHRoZXJlIGFyZSBubyBlbGVtZW50cyB0byBiZSBjdXJyZW50bHkKKyAqIHBvaW50aW5nIHRvLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHN0cl9wIHBsYWNlIHRvIHJldHVybiB0aGUgc3RyaW5nIHdpdGggdGhlIHR5cGUgaW4gaXQKKyAqIEBwYXJhbSBzdGFydF9wIHBsYWNlIHRvIHJldHVybiBzdGFydCBvZiB0aGUgdHlwZQorICogQHBhcmFtIGxlbl9wIHBsYWNlIHRvIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0eXBlCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9zaWduYXR1cmUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKipzdHJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqc3RhcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbGVuX3ApCit7CisgICpzdHJfcCA9IHJlYWRlci0+dHlwZV9zdHI7CisgICpzdGFydF9wID0gcmVhZGVyLT50eXBlX3BvczsKKyAgKmxlbl9wID0gZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3Bvcyk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNTdHJpbmcgcmVwbGFjZW1lbnQ7IC8qKjwgTWFyc2hhbGVkIHZhbHVlIGluY2x1ZGluZyBhbGlnbm1lbnQgcGFkZGluZyAqLworICBpbnQgcGFkZGluZzsgICAgICAgICAgICAvKio8IEhvdyBtdWNoIG9mIHRoZSByZXBsYWNlbWVudCBibG9jayBpcyBwYWRkaW5nICovCit9IFJlcGxhY2VtZW50QmxvY2s7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVwbGFjZW1lbnRfYmxvY2tfaW5pdCAoUmVwbGFjZW1lbnRCbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICpyZWFkZXIpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZibG9jay0+cmVwbGFjZW1lbnQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiAlIDggaXMgdGhlIHBhZGRpbmcgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbiBwcm9wZXJ0aWVzIGluCisgICAqIG91ciByZXBsYWNlbWVudCBzdHJpbmcgYXMgd2UgZG8gYXQgdGhlIHBvc2l0aW9uIGJlaW5nIHJlcGxhY2VkCisgICAqLworICBibG9jay0+cGFkZGluZyA9IHJlYWRlci0+dmFsdWVfcG9zICUgODsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoJmJsb2NrLT5yZXBsYWNlbWVudCwgYmxvY2stPnBhZGRpbmcpKQorICAgIGdvdG8gb29tOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5yZXBsYWNlbWVudCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZXBsYWNlbWVudF9ibG9ja19yZXBsYWNlIChSZXBsYWNlbWVudEJsb2NrICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3JlYWRlcjsKKyAgREJ1c0xpc3QgKmZpeHVwczsKKyAgaW50IG9yaWdfbGVuOworCisgIF9kYnVzX2Fzc2VydCAocmVhbGlnbl9yb290ICE9IE5VTEwpOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpOworCisgIHJlYWxpZ25fcmVhZGVyID0gKnJlYWxpZ25fcm9vdDsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJJTklUSUFMSVpJTkcgcmVwbGFjZW1lbnQgYmxvY2sgd3JpdGVyICVwIGF0IHZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgJndyaXRlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpKTsKKyNlbmRpZgorICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+cmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSk7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgPD0gcmVhZGVyLT52YWx1ZV9wb3MpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIkNPUFlJTkcgZnJvbSByZWFkZXIgYXQgdmFsdWVfcG9zICVkIHRvIHdyaXRlciAlcCBzdGFydGluZyBhZnRlciB2YWx1ZV9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgIHJlYWxpZ25fcmVhZGVyLnZhbHVlX3BvcywgJndyaXRlciwgcmVhZGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisgIGZpeHVwcyA9IE5VTEw7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyX3BhcnRpYWwgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsaWduX3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXh1cHMpKQorICAgIGdvdG8gb29tOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIlJFUExBQ0VNRU5UIGF0IHBhZGRpbmcgJWQgbGVuICVkXG4iLCBibG9jay0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJsb2NrLT5yZXBsYWNlbWVudCwgYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5yZXBsYWNlbWVudCkgLSBibG9jay0+cGFkZGluZyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJUTyBCRSBSRVBMQUNFRCBhdCB2YWx1ZV9wb3MgPSAlZCAoYWxpZ24gcGFkICVkKSBsZW4gJWQgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MgJSA4LAorICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKworICAvKiBNb3ZlIHRoZSByZXBsYWNlbWVudCBpbnRvIHBvc2l0aW9uCisgICAqIChyZWFsaWduX3JlYWRlciBzaG91bGQgbm93IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIHRvIGJlIHJlcGxhY2VkKQorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZibG9jay0+cmVwbGFjZW1lbnQsIGJsb2NrLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyopIHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MgLSByZWFkZXItPnZhbHVlX3BvcykpCisgICAgZ290byBvb207CisKKyAgLyogUHJvY2VzcyBvdXIgZml4dXBzIG5vdyB0aGF0IHdlIGNhbid0IGhhdmUgYW4gT09NIGVycm9yICovCisgIGFwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoJmZpeHVwcywgcmVhZGVyKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQsIG9yaWdfbGVuKTsKKyAgZnJlZV9maXh1cHMgKCZmaXh1cHMpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCityZXBsYWNlbWVudF9ibG9ja19mcmVlIChSZXBsYWNlbWVudEJsb2NrICpibG9jaykKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+cmVwbGFjZW1lbnQpOworfQorCisvKiBJbiB0aGUgdmFyaWFibGUtbGVuZ3RoIGNhc2UsIHdlIGhhdmUgdG8gZml4IGFsaWdubWVudCBhZnRlciB3ZSBpbnNlcnQuCisgKiBUaGUgc3RyYXRlZ3kgaXMgYXMgZm9sbG93czoKKyAqCisgKiAgLSBwYWQgYSBuZXcgc3RyaW5nIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZQorICogICAgc3RhcnQgb2YgdGhlIGN1cnJlbnQgYmFzaWMgdmFsdWUKKyAqICAtIHdyaXRlIHRoZSBuZXcgYmFzaWMgdmFsdWUKKyAqICAtIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwgcmVhZGVyIHRvIHRoZSBuZXcgc3RyaW5nLAorICogICAgd2hpY2ggd2lsbCBmaXggdGhlIGFsaWdubWVudCBvZiB0eXBlcyBmb2xsb3dpbmcKKyAqICAgIHRoZSBuZXcgdmFsdWUKKyAqICAgIC0gdGhpcyBjb3B5IGhhcyB0byBzdGFydCBhdCByZWFsaWduX3Jvb3QsCisgKiAgICAgIGJ1dCBub3QgcmVhbGx5IHdyaXRlIGFueXRoaW5nIHVudGlsIGl0CisgKiAgICAgIHBhc3NlcyB0aGUgdmFsdWUgYmVpbmcgc2V0CisgKiAgICAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2UgY2FuIHN0b3AgY29weWluZworICogICAgICB3aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3QgdmFsdWVzIGFyZSBib3RoCisgKiAgICAgIG9uIGFuIDgtYm91bmRhcnksIHNpbmNlIHdlIGtub3cgYWxsIGZvbGxvd2luZworICogICAgICBwYWRkaW5nIGFuZCBhbGlnbm1lbnQgd2lsbCBiZSBpZGVudGljYWwKKyAqICAtIGNvcHkgdGhlIG5ldyBzdHJpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwKKyAqICAgIHN0cmluZywgcmVwbGFjaW5nIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZQorICogICAgb3JpZ2luYWwgc3RyaW5nCisgKiAgLSBub3cgYW55IGFycmF5cyBpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIHRoYXQKKyAqICAgIGNvbnRhaW5lZCB0aGUgcmVwbGFjZWQgc3RyaW5nIG1heSBoYXZlIHRoZQorICogICAgd3JvbmcgbGVuZ3RoOyBzbyB3ZSBoYXZlIHRvIGZpeCB0aGF0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhZGVyX3NldF9iYXNpY192YXJpYWJsZV9sZW5ndGggKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBSZXBsYWNlbWVudEJsb2NrIGJsb2NrOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3Jvb3QgIT0gTlVMTCk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19pbml0ICgmYmxvY2ssIHJlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFdyaXRlIHRoZSBuZXcgYmFzaWMgdmFsdWUgKi8KKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiSU5JVElBTElaSU5HIHdyaXRlciAlcCB0byB3cml0ZSBiYXNpYyB2YWx1ZSBhdCB2YWx1ZV9wb3MgJWQgb2YgcmVwbGFjZW1lbnQgc3RyaW5nXG4iLAorICAgICAgICAgICAgICAgICAmd3JpdGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLnJlcGxhY2VtZW50KSk7CisjZW5kaWYKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2sucmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2sucmVwbGFjZW1lbnQpKTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiV1JJVElORyBiYXNpYyB2YWx1ZSB0byB3cml0ZXIgJXAgKHJlcGxhY2VtZW50IHN0cmluZylcbiIsICZ3cml0ZXIpOworI2VuZGlmCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ3cml0ZXIsIGN1cnJlbnRfdHlwZSwgdmFsdWUpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghcmVwbGFjZW1lbnRfYmxvY2tfcmVwbGFjZSAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJlcGxhY2VtZW50X2Jsb2NrX2ZyZWUgKCZibG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkZXJfc2V0X2Jhc2ljX2ZpeGVkX2xlbmd0aCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKChEQnVzU3RyaW5nKikgcmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Cit9CisKKy8qKgorICogU2V0cyBhIG5ldyB2YWx1ZSBmb3IgdGhlIGJhc2ljIHR5cGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgcmVhZGVyLAorICogbGVhdmluZyB0aGUgcmVhZGVyIHZhbGlkIHRvIGNvbnRpbnVlIHJlYWRpbmcuIEFueSBvdGhlciByZWFkZXJzCisgKiB3aWxsIGJlIGludmFsaWRhdGVkIGlmIHlvdSBzZXQgYSB2YXJpYWJsZS1sZW5ndGggdHlwZSBzdWNoIGFzIGEKKyAqIHN0cmluZy4KKyAqCisgKiBUaGUgcHJvdmlkZWQgcmVhbGlnbl9yb290IGlzIHRoZSByZWFkZXIgdG8gc3RhcnQgZnJvbSB3aGVuCisgKiByZWFsaWduaW5nIHRoZSBkYXRhIHRoYXQgZm9sbG93cyB0aGUgbmV3bHktc2V0IHZhbHVlLiBUaGUgcmVhZGVyCisgKiBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBhIHZhbHVlIGJlbG93IHRoZSByZWFsaWduX3Jvb3QgcGFyYW1ldGVyLgorICogSWYgdGhlIHR5cGUgYmVpbmcgc2V0IGlzIGZpeGVkLWxlbmd0aCwgdGhlbiByZWFsaWduX3Jvb3QgbWF5IGJlCisgKiAjTlVMTC4gT25seSB2YWx1ZXMgcmVhY2hhYmxlIGZyb20gcmVhbGlnbl9yb290IHdpbGwgYmUgcmVhbGlnbmVkLAorICogc28gaWYgeW91ciBzdHJpbmcgY29udGFpbnMgb3RoZXIgdmFsdWVzIHlvdSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoCisgKiB0aG9zZSBzb21laG93IHlvdXJzZWxmLiBJdCBpcyBPSyBpZiByZWFsaWduX3Jvb3QgaXMgdGhlIHNhbWUKKyAqIHJlYWRlciBhcyB0aGUgcmVhZGVyIHBhcmFtZXRlciwgdGhvdWdoIGlmIHlvdSBhcmVuJ3Qgc2V0dGluZyB0aGUKKyAqIHJvb3QgaXQgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZCBpZGVhLgorICoKKyAqIEB0b2RvIERCdXNUeXBlUmVhZGVyIGN1cnJlbnRseSB0YWtlcyAiY29uc3QiIHZlcnNpb25zIG9mIHRoZSB0eXBlCisgKiBhbmQgdmFsdWUgc3RyaW5ncywgYW5kIHRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhvc2Ugc3RyaW5ncyBieQorICogY2FzdGluZyBhd2F5IHRoZSBjb25zdCwgd2hpY2ggaXMgb2YgY291cnNlIGJhZCBpZiB3ZSB3YW50IHRvIGdldAorICogcGlja3kuIChUbyBiZSB0cnVseSBjbGVhbiB5b3UnZCBoYXZlIGFuIG9iamVjdCB3aGljaCBjb250YWluZWQgdGhlCisgKiB0eXBlIGFuZCB2YWx1ZSBzdHJpbmdzIGFuZCBzZXRfYmFzaWMgd291bGQgYmUgYSBtZXRob2Qgb24gdGhhdAorICogb2JqZWN0Li4uIHRoaXMgd291bGQgYWxzbyBtYWtlIERCdXNUeXBlUmVhZGVyIHRoZSBzYW1lIHRoaW5nIGFzCisgKiBEQnVzVHlwZU1hcmsuIEJ1dCBzaW5jZSBEQnVzTWVzc2FnZSBpcyBlZmZlY3RpdmVseSB0aGF0IG9iamVjdCBmb3IKKyAqIEQtQnVzIGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBjcmVhdGluZyBzb21lIHJhbmRvbSBvYmplY3QuKQorICoKKyAqIEB0b2RvIG9wdGltaXplIHRoaXMgYnkgb25seSByZXdyaXRpbmcgdW50aWwgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcworICogYXJlIGF0IHRoZSBzYW1lIGFsaWdubWVudC4gRnJlcXVlbnRseSB0aGlzIHNob3VsZCByZXN1bHQgaW4gb25seQorICogcmVwbGFjaW5nIHRoZSB2YWx1ZSB0aGF0J3MgaW1tZWRpYXRlbHkgYXQgaGFuZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciBpbmRpY2F0aW5nIHdoZXJlIHRvIHNldCBhIG5ldyB2YWx1ZQorICogQHBhcmFtIHZhbHVlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIHNldAorICogQHBhcmFtIHJlYWxpZ25fcm9vdCByZWFsaWduIGZyb20gaGVyZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3N0ciA9PSByZWFsaWduX3Jvb3QtPnZhbHVlX3N0cik7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPj0gcmVhbGlnbl9yb290LT52YWx1ZV9wb3MpOworCisgIGN1cnJlbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICBTRVQgQkFTSUMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgcmVhbGlnbl9yb290ID0gJXAgd2l0aCB2YWx1ZV9wb3MgJWQgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCA/IHJlYWxpZ25fcm9vdC0+dmFsdWVfcG9zIDogLTEsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHJlYWxpZ25fcm9vdC0+dmFsdWVfc3RyLCByZWFsaWduX3Jvb3QtPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZWFsaWduX3Jvb3QtPnZhbHVlX3N0cikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290LT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKGN1cnJlbnRfdHlwZSkpOworCisgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGN1cnJlbnRfdHlwZSkpCisgICAgeworICAgICAgcmVhZGVyX3NldF9iYXNpY19maXhlZF9sZW5ndGggKHJlYWRlciwgY3VycmVudF90eXBlLCB2YWx1ZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJlYWxpZ25fcm9vdCAhPSBOVUxMKTsKKyAgICAgIHJldHVybiByZWFkZXJfc2V0X2Jhc2ljX3ZhcmlhYmxlX2xlbmd0aCAocmVhZGVyLCBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCByZWFsaWduX3Jvb3QpOworICAgIH0KK30KKworLyoqCisgKiBSZWN1cnNpdmVseSBkZWxldGVzIGFueSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSByZWFkZXIsIGxlYXZpbmcgdGhlCisgKiByZWFkZXIgdmFsaWQgdG8gY29udGludWUgcmVhZGluZy4gQW55IG90aGVyIHJlYWRlcnMgd2lsbCBiZQorICogaW52YWxpZGF0ZWQuCisgKgorICogVGhlIHByb3ZpZGVkIHJlYWxpZ25fcm9vdCBpcyB0aGUgcmVhZGVyIHRvIHN0YXJ0IGZyb20gd2hlbgorICogcmVhbGlnbmluZyB0aGUgZGF0YSB0aGF0IGZvbGxvd3MgdGhlIG5ld2x5LXNldCB2YWx1ZS4KKyAqIFNlZSBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMoKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQorICogcmVhbGlnbl9yb290IHBhcmFtdGVyLgorICoKKyAqIEB0b2RvIGZvciBub3cgdGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHR5cGVjb2RlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSB2YWx1ZSwgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciBpbmRpY2F0aW5nIHdoZXJlIHRvIGRlbGV0ZSBhIHZhbHVlCisgKiBAcGFyYW0gcmVhbGlnbl9yb290IHJlYWxpZ24gZnJvbSBoZXJlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfcmVhZGVyX2RlbGV0ZSAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhbGlnbl9yb290KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIFJlcGxhY2VtZW50QmxvY2sgYmxvY2s7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3Jvb3QgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT5rbGFzcyA9PSAmYXJyYXlfcmVhZGVyX2NsYXNzKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIXJlcGxhY2VtZW50X2Jsb2NrX2luaXQgKCZibG9jaywgcmVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19yZXBsYWNlICgmYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmVwbGFjZW1lbnRfYmxvY2tfZnJlZSAoJmJsb2NrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIENvbXBhcmVzIHR3byByZWFkZXJzLCB3aGljaCBtdXN0IGJlIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIHZhbHVlIGRhdGEuCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZnVydGhlciBhbG9uZyB0aGFuIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBsaHMgbGVmdC1oYW5kLXNpZGUgKGZpcnN0KSBwYXJhbWV0ZXIKKyAqIEBwYXJhbSByaHMgbGVmdC1oYW5kLXNpZGUgKGZpcnN0KSBwYXJhbWV0ZXIKKyAqIEByZXR1cm5zIHdoZXRoZXIgbGhzIGlzIGdyZWF0ZXIgdGhhbiByaHMKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJocykKK3sKKyAgX2RidXNfYXNzZXJ0IChsaHMtPnZhbHVlX3N0ciA9PSByaHMtPnZhbHVlX3N0cik7CisKKyAgcmV0dXJuIGxocy0+dmFsdWVfcG9zID4gcmhzLT52YWx1ZV9wb3M7Cit9CisKKy8qCisgKgorICoKKyAqICAgICAgICAgREJ1c1R5cGVXcml0ZXIKKyAqCisgKgorICoKKyAqLworCisvKioKKyAqIEluaXRpYWxpemUgYSB3cml0ZSBpdGVyYXRvciwgd2hpY2ggaXMgdXNlZCB0byB3cml0ZSBvdXQgdmFsdWVzIGluCisgKiBzZXJpYWxpemVkIEQtQnVzIGZvcm1hdC4KKyAqCisgKiBUaGUgdHlwZV9wb3MgcGFzc2VkIGluIGlzIGV4cGVjdGVkIHRvIGJlIGluc2lkZSBhbiBhbHJlYWR5LXZhbGlkLAorICogdGhvdWdoIHBvdGVudGlhbGx5IGVtcHR5LCB0eXBlIHNpZ25hdHVyZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBieXRlCisgKiBhZnRlciB0eXBlX3BvcyBtdXN0IGJlIGVpdGhlciAjREJVU19UWVBFX0lOVkFMSUQgKGFrYSBudWwpIG9yIHNvbWUKKyAqIG90aGVyIHZhbGlkIHR5cGUuICNEQnVzVHlwZVdyaXRlciB3b24ndCBlbmZvcmNlIHRoYXQgdGhlIHNpZ25hdHVyZQorICogaXMgYWxyZWFkeSB2YWxpZCAoeW91IGNhbiBhcHBlbmQgdGhlIG51bCBieXRlIGF0IHRoZSBlbmQgaWYgeW91CisgKiBsaWtlKSwgYnV0IGp1c3QgYmUgYXdhcmUgdGhhdCB5b3UgbmVlZCB0aGUgbnVsIGJ5dGUgZXZlbnR1YWxseSBhbmQKKyAqICNEQnVzVHlwZVdyaXRlciBpc24ndCBnb2luZyB0byB3cml0ZSBpdCBmb3IgeW91LgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byBpbml0CisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byBtYXJzaGFsIGludG8KKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHR5cGVjb2RlcyBpbnRvCisgKiBAcGFyYW0gdHlwZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHR5cGVjb2RlcworICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXQgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICB3cml0ZXItPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICB3cml0ZXItPnR5cGVfc3RyID0gdHlwZV9zdHI7CisgIHdyaXRlci0+dHlwZV9wb3MgPSB0eXBlX3BvczsKKyAgd3JpdGVyLT52YWx1ZV9zdHIgPSB2YWx1ZV9zdHI7CisgIHdyaXRlci0+dmFsdWVfcG9zID0gdmFsdWVfcG9zOworICB3cml0ZXItPmNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisgIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBGQUxTRTsKKyAgd3JpdGVyLT5lbmFibGVkID0gVFJVRTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0ZXIgJXAgaW5pdCByZW1haW5pbmcgc2lnICclcydcbiIsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApIDoKKyAgICAgICAgICAgICAgICAgInVua25vd24iKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEluaXRpYWxpemUgYSB3cml0ZSBpdGVyYXRvciwgd2l0aCB0aGUgc2lnbmF0dXJlIHRvIGJlIHByb3ZpZGVkCisgKiBsYXRlci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdmFsdWVzIGludG8KKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHZhbHVlcworICoKKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHZhbHVlX3BvcykKK3sKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdCAod3JpdGVyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCB2YWx1ZV9zdHIsIHZhbHVlX3Bvcyk7Cit9CisKKy8qKgorICogQWRkcyB0eXBlIHN0cmluZyB0byB0aGUgd3JpdGVyLCBpZiBpdCBoYWQgbm9uZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIHR5cGVfc3RyIHR5cGUgc3RyaW5nIHRvIGFkZAorICogQHBhcmFtIHR5cGVfcG9zIHR5cGUgcG9zaXRpb24KKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2FkZF90eXBlcyAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZV9wb3MpCit7CisgIGlmICh3cml0ZXItPnR5cGVfc3RyID09IE5VTEwpIC8qIGtlZXBzIHVzIGZyb20gdXNpbmcgdGhpcyBhcyBzZXR0ZXIgKi8KKyAgICB7CisgICAgICB3cml0ZXItPnR5cGVfc3RyID0gdHlwZV9zdHI7CisgICAgICB3cml0ZXItPnR5cGVfcG9zID0gdHlwZV9wb3M7CisgICAgfQorfQorCisvKioKKyAqIFJlbW92ZXMgdHlwZSBzdHJpbmcgZnJvbSB0aGUgd3JpdGVyLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byByZW1vdmUgZnJvbQorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIpCit7CisgIHdyaXRlci0+dHlwZV9zdHIgPSBOVUxMOworICB3cml0ZXItPnR5cGVfcG9zID0gLTE7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c190eXBlX3dyaXRlcl9pbml0KCksIGV4Y2VwdCB0aGUgdHlwZSBzdHJpbmcKKyAqIHBhc3NlZCBpbiBzaG91bGQgY29ycmVzcG9uZCB0byBhbiBleGlzdGluZyBzaWduYXR1cmUgdGhhdAorICogbWF0Y2hlcyB3aGF0IHlvdSdyZSBnb2luZyB0byB3cml0ZSBvdXQuIFRoZSB3cml0ZXIgd2lsbAorICogY2hlY2sgd2hhdCB5b3Ugd3JpdGUgdnMuIHRoaXMgZXhpc3Rpbmcgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byBpbml0CisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byBtYXJzaGFsIGludG8KKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nIHdpdGggc2lnbmF0dXJlCisgKiBAcGFyYW0gdHlwZV9wb3Mgc3RhcnQgb2Ygc2lnbmF0dXJlCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdmFsdWVzIGludG8KKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdG8gaW5zZXJ0IHZhbHVlcworICoKKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHdyaXRlciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcqKXR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZV9wb3MpOworCisgIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljX25vX3R5cGVjb2RlIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICp2YWx1ZSkKK3sKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICByZXR1cm4gX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAod3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLT52YWx1ZV9wb3MpOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIElmIG91ciBwYXJlbnQgaXMgYW4gYXJyYXksIHRoaW5ncyBhcmUgYSBsaXR0bGUgYml0IGNvbXBsaWNhdGVkLgorICoKKyAqIFRoZSBwYXJlbnQgbXVzdCBoYXZlIGEgY29tcGxldGUgZWxlbWVudCB0eXBlLCBzdWNoIGFzCisgKiAiaSIgb3IgImFhaSIgb3IgIihpaSkiIG9yICJhKGlpKSIuIFRoZXJlIGNhbid0IGJlCisgKiB1bmNsb3NlZCBwYXJlbnMsIG9yIGFuICJhIiB3aXRoIG5vIGZvbGxvd2luZyB0eXBlLgorICoKKyAqIFRvIHJlY3Vyc2UsIHRoZSBvbmx5IGFsbG93ZWQgb3BlcmF0aW9uIGlzIHRvIHJlY3Vyc2UgaW50byB0aGUKKyAqIGZpcnN0IHR5cGUgaW4gdGhlIGVsZW1lbnQgdHlwZS4gU28gZm9yICJpIiB5b3UgY2FuJ3QgcmVjdXJzZSwgZm9yCisgKiAiYWkiIHlvdSBjYW4gcmVjdXJzZSBpbnRvIHRoZSBhcnJheSwgZm9yICIoaWkpIiB5b3UgY2FuIHJlY3Vyc2UKKyAqIGludG8gdGhlIHN0cnVjdC4KKyAqCisgKiBJZiB5b3UgcmVjdXJzZSBpbnRvIHRoZSBhcnJheSBmb3IgImFpIiwgdGhlbiB5b3UgbXVzdCBzcGVjaWZ5CisgKiAiaSIgZm9yIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5IHlvdSByZWN1cnNlIGludG8uCisgKgorICogV2hpbGUgaW5zaWRlIGFuIGFycmF5IGF0IGFueSBsZXZlbCwgd2UgbmVlZCB0byBhdm9pZCB3cml0aW5nIHRvCisgKiB0eXBlX3N0ciwgc2luY2UgdGhlIHR5cGUgb25seSBhcHBlYXJzIG9uY2UgZm9yIHRoZSB3aG9sZSBhcnJheSwKKyAqIGl0IGRvZXMgbm90IGFwcGVhciBmb3IgZWFjaCBhcnJheSBlbGVtZW50LgorICoKKyAqIFdoaWxlIGluc2lkZSBhbiBhcnJheSB0eXBlX3BvcyBwb2ludHMgdG8gdGhlIGV4cGVjdGVkIG5leHQKKyAqIHR5cGVjb2RlLCByYXRoZXIgdGhhbiB0aGUgbmV4dCBwbGFjZSB3ZSBjb3VsZCB3cml0ZSBhIHR5cGVjb2RlLgorICovCitzdGF0aWMgdm9pZAord3JpdGVyX3JlY3Vyc2VfaW5pdF9hbmRfY2hlY2sgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICpzdWIpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MpOworCisgIHN1Yi0+Y29udGFpbmVyX3R5cGUgPSBjb250YWluZXJfdHlwZTsKKworICBpZiAod3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiB8fAorICAgICAgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZIHx8IHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX1ZBUklBTlQpKQorICAgIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBUUlVFOworICBlbHNlCisgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiA9IEZBTFNFOworCisgIHN1Yi0+ZW5hYmxlZCA9IHdyaXRlci0+ZW5hYmxlZDsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uICYmIHdyaXRlci0+dHlwZV9zdHIpCisgICAgeworICAgICAgaW50IGV4cGVjdGVkOworCisgICAgICBleHBlY3RlZCA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zKTsKKworICAgICAgaWYgKGV4cGVjdGVkICE9IHN1Yi0+Y29udGFpbmVyX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIldyaXRpbmcgYW4gZWxlbWVudCBvZiB0eXBlICVzLCBidXQgdGhlIGV4cGVjdGVkIHR5cGUgaGVyZSBpcyAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChzdWItPmNvbnRhaW5lcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV3JpdGluZyBhbiBlbGVtZW50IG9mIHR5cGUgJXMsIGJ1dCBubyB2YWx1ZSBpcyBleHBlY3RlZCBoZXJlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvdmVyYWxsIHNpZ25hdHVyZSBleHBlY3RlZCBoZXJlIHdhcyAnJXMnIGFuZCB3ZSBhcmUgb24gYnl0ZSAlZCBvZiB0aGF0IHNpZ25hdHVyZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCBhcnJheSBlbGVtZW50IG9yIHZhcmlhbnQgY29udGVudCB3cml0dGVuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgcmVjdXJzZSBwYXJlbnQgJXMgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBpc19leHBlY3RhdGlvbiA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJyBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApIDoKKyAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICB3cml0ZXItPmVuYWJsZWQpOworICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCByZWN1cnNlIHN1YiAlcyAgIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgc3ViLT5lbmFibGVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGVjb2RlKQoreworICAvKiBBIHN1YndyaXRlciBpbnNpZGUgYW4gYXJyYXkgb3IgdmFyaWFudCB3aWxsIGhhdmUgdHlwZV9wb3MKKyAgICogcG9pbnRpbmcgdG8gdGhlIGV4cGVjdGVkIHR5cGVjb2RlOyBhIHdyaXRlciBub3QgaW5zaWRlIGFuIGFycmF5CisgICAqIG9yIHZhcmlhbnQgaGFzIHR5cGVfcG9zIHBvaW50aW5nIHRvIHRoZSBuZXh0IHBsYWNlIHRvIGluc2VydCBhCisgICAqIHR5cGVjb2RlLgorICAgKi8KKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB3cml0ZV9vcl92ZXJpZnkgc3RhcnQgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT5lbmFibGVkKTsKKyNlbmRpZgorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pCisgICAgeworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICB7CisgICAgICAgIGludCBleHBlY3RlZDsKKworICAgICAgICBleHBlY3RlZCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3Bvcyk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IHR5cGVjb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcnJheSBvciB2YXJpYW50IHR5cGUgcmVxdWlyZXMgdGhhdCB0eXBlICVzIGJlIHdyaXR0ZW4sIGJ1dCAlcyB3YXMgd3JpdHRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGV4cGVjdGVkKSwgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGVjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkFycmF5IG9yIHZhcmlhbnQgdHlwZSB3YXNuJ3QgZXhwZWN0aW5nIGFueSBtb3JlIHZhbHVlcyB0byBiZSB3cml0dGVuIGludG8gaXQsIGJ1dCBhIHZhbHVlICVzIHdhcyB3cml0dGVuLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBvdmVyYWxsIHNpZ25hdHVyZSBleHBlY3RlZCBoZXJlIHdhcyAnJXMnIGFuZCB3ZSBhcmUgb24gYnl0ZSAlZCBvZiB0aGF0IHNpZ25hdHVyZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodHlwZWNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh3cml0ZXItPnR5cGVfc3RyKSwgd3JpdGVyLT50eXBlX3Bvcyk7CisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgdHlwZSBpbnNlcnRlZCBzb21ld2hlcmUgaW5zaWRlIGFuIGFycmF5IG9yIHZhcmlhbnQiKTsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgICAgICAvKiBpZiBpbW1lZGlhdGVseSBpbnNpZGUgYW4gYXJyYXkgd2UnZCBhbHdheXMgYmUgYXBwZW5kaW5nIGFuIGVsZW1lbnQsCisgICAgICAgKiBzbyB0aGUgZXhwZWN0ZWQgdHlwZSBkb2Vzbid0IGNoYW5nZTsgaWYgaW5zaWRlIGEgc3RydWN0IG9yIHNvbWV0aGluZworICAgICAgICogYmVsb3cgYW4gYXJyYXksIHdlIG5lZWQgdG8gbW92ZSB0aHJvdWdoIHNhaWQgc3RydWN0IG9yIHNvbWV0aGluZy4KKyAgICAgICAqLworICAgICAgaWYgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB3cml0ZXItPnR5cGVfcG9zICs9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHdyaXRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlY29kZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxOworICAgIH0KKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHdyaXRlX29yX3ZlcmlmeSBlbmQgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3BvcywgMCkpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3JlY3Vyc2Vfc3RydWN0X29yX2RpY3RfZW50cnkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBiZWdpbl9jaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIpCit7CisgIC8qIEZJWE1FIHJpZ2h0IG5vdyBjb250YWluZWRfdHlwZSBpcyBpZ25vcmVkOyB3ZSBjb3VsZCBwcm9iYWJseQorICAgKiBhbG1vc3QgdHJpdmlhbGx5IGZpeCB0aGUgY29kZSBzbyBpZiBpdCdzIHByZXNlbnQgd2UKKyAgICogd3JpdGUgaXQgb3V0IGFuZCB0aGVuIHNldCB0eXBlX3Bvc19pc19leHBlY3RhdGlvbgorICAgKi8KKworICAvKiBFbnN1cmUgdGhhdCB3ZSdsbCBiZSBhYmxlIHRvIGFkZCBhbGlnbm1lbnQgcGFkZGluZyBhbmQgdGhlIHR5cGVjb2RlICovCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKHN1Yi0+dmFsdWVfc3RyLCA4KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoc3ViLCBiZWdpbl9jaGFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5zZXJ0IHN0cnVjdCB0eXBlY29kZSBhZnRlciBwcmVhbGxvYyIpOworCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgOCkgLSBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nIGZvciBzdHJ1Y3QiKTsKKyAgICAgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA4KTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZXJfcmVjdXJzZV9hcnJheSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgaXNfYXJyYXlfYXBwZW5kKQoreworICBkYnVzX3VpbnQzMl90IHZhbHVlID0gMDsKKyAgaW50IGFsaWdubWVudDsKKyAgaW50IGFsaWduZWQ7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgIHdyaXRlci0+dHlwZV9zdHIpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nIChjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT51LmFycmF5LmVsZW1lbnRfdHlwZV9wb3MgKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV3JpdGluZyBhbiBhcnJheSBvZiAnJXMnIGJ1dCB0aGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBleHBlY3RlZCB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBwYXJlbnQgYXJyYXlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuKSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5jb21wYXRpYmxlIHR5cGUgZm9yIGNoaWxkIGFycmF5Iik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgIGlmICh3cml0ZXItPmVuYWJsZWQgJiYgIWlzX2FycmF5X2FwcGVuZCkKKyAgICB7CisgICAgICAvKiAzIHBhZCArIDQgYnl0ZXMgZm9yIHRoZSBhcnJheSBsZW5ndGgsIGFuZCA0IGJ5dGVzIHBvc3NpYmxlIHBhZGRpbmcKKyAgICAgICAqIGJlZm9yZSBhcnJheSB2YWx1ZXMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKHN1Yi0+dmFsdWVfc3RyLCAzICsgNCArIDQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgc3ViLT50eXBlX3BvcyArPSAxOyAvKiBtb3ZlIHRvIHBvaW50IHRvIHRoZSBlbGVtZW50IHR5cGUsIHNpbmNlIHR5cGVfcG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSB0aGUgZXhwZWN0ZWQgdHlwZSBmb3IgZnVydGhlciB3cml0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3M7CisgICAgfQorCisgIGlmICghd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikKKyAgICB7CisgICAgICAvKiBzdWIgaXMgYSB0b3BsZXZlbC9vdXRlcm1vc3QgYXJyYXkgc28gd2UgbmVlZCB0byB3cml0ZSB0aGUgdHlwZSBkYXRhICovCisKKyAgICAgIC8qIGFsbG9jIHNwYWNlIGZvciBhcnJheSB0eXBlY29kZSwgZWxlbWVudCBzaWduYXR1cmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICh3cml0ZXItPnR5cGVfc3RyLCAxICsgY29udGFpbmVkX3R5cGVfbGVuKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbnNlcnQgYXJyYXkgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFycmF5IGVsZW1lbnQgdHlwZWNvZGVzIik7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSwgd2UgaG9sZCB0eXBlX3BvcyBwb2ludGluZyBhdCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlOworICAgICAgICogb3RoZXJ3aXNlIGFkdmFuY2UgaXQgdG8gcmVmbGVjdCB0aGUgYXJyYXkgdmFsdWUgd2UganVzdCByZWN1cnNlZCBpbnRvCisgICAgICAgKi8KKyAgICAgIGlmICh3cml0ZXItPmNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxICsgY29udGFpbmVkX3R5cGVfbGVuOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19hc3NlcnQgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pOyAvKiBiZWNhdXNlIGl0J3MgYW4gYXJyYXkgKi8KKyAgICB9CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICAvKiBXcml0ZSAob3IganVtcCBvdmVyLCBpZiBpc19hcnJheV9hcHBlbmQpIHRoZSBsZW5ndGggKi8KKyAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA0KTsKKworICAgICAgaWYgKGlzX2FycmF5X2FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zICs9IDQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWNfbm9fdHlwZWNvZGUgKHN1YiwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgYXJyYXkgbGVuIik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzdWItPnUuYXJyYXkubGVuX3BvcyA9PSBzdWItPnZhbHVlX3BvcyAtIDQpOworCisgICAgICAvKiBXcml0ZSBhbGlnbm1lbnQgcGFkZGluZyBmb3IgYXJyYXkgZWxlbWVudHMKKyAgICAgICAqIE5vdGUgdGhhdCB3ZSB3cml0ZSB0aGUgcGFkZGluZyAqZXZlbiBmb3IgZW1wdHkgYXJyYXlzKgorICAgICAgICogdG8gYXZvaWQgd29ua3kgc3BlY2lhbCBjYXNlcworICAgICAgICovCisgICAgICBhbGlnbm1lbnQgPSBlbGVtZW50X3R5cGVfZ2V0X2FsaWdubWVudCAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKworICAgICAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgYWxpZ25tZW50KTsKKyAgICAgIGlmIChhbGlnbmVkICE9IHN1Yi0+dmFsdWVfcG9zKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFpc19hcnJheV9hcHBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCAtIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcMCcpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyA9IGFsaWduZWQ7CisgICAgICAgIH0KKworICAgICAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgICAgICBpZiAoaXNfYXJyYXlfYXBwZW5kKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCBsZW47CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnUuYXJyYXkubGVuX3BvcywgNCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc3ViLT51LmFycmF5Lmxlbl9wb3MpOworICAgICAgICAgIGxlbiA9IF9kYnVzX3VucGFja191aW50MzIgKHN1Yi0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkubGVuX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSk7CisKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyArPSBsZW47CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBub3QgZW5hYmxlZCwgc28gd2Ugd29uJ3Qgd3JpdGUgdGhlIGxlbl9wb3M7IHNldCBpdCB0byAtMSB0byBzbyBpbmRpY2F0ZSAqLworICAgICAgc3ViLT51LmFycmF5Lmxlbl9wb3MgPSAtMTsKKyAgICAgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgPSBzdWItPnZhbHVlX3BvczsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChzdWItPnUuYXJyYXkubGVuX3BvcyA8IHN1Yi0+dS5hcnJheS5zdGFydF9wb3MpOworICBfZGJ1c19hc3NlcnQgKGlzX2FycmF5X2FwcGVuZCB8fCBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID09IHN1Yi0+dmFsdWVfcG9zKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCByZWN1cnNlIGFycmF5IGRvbmUgcmVtYWluaW5nIHNpZyAnJXMnIGFycmF5IHN0YXJ0X3BvcyA9ICVkIGxlbl9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZFxuIiwgc3ViLAorICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnR5cGVfc3RyLCBzdWItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zLCBzdWItPnUuYXJyYXkubGVuX3Bvcywgc3ViLT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFZhcmlhbnQgdmFsdWUgd2lsbCBub3JtYWxseSBoYXZlOgorICogICAxIGJ5dGUgc2lnbmF0dXJlIGxlbmd0aCBub3QgaW5jbHVkaW5nIG51bAorICogICBzaWduYXR1cmUgdHlwZWNvZGVzIChudWwgdGVybWluYXRlZCkKKyAqICAgcGFkZGluZyB0byBhbGlnbm1lbnQgb2YgY29udGFpbmVkIHR5cGUKKyAqICAgYm9keSBhY2NvcmRpbmcgdG8gc2lnbmF0dXJlCisgKgorICogVGhlIHNpZ25hdHVyZSBzdHJpbmcgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSB0eXBlCisgKiBpbiBpdCBidXQgdGhhdCB0eXBlIG1heSBiZSBjb21wbGV4L3JlY3Vyc2l2ZS4KKyAqCisgKiBTbyBhIHR5cGljYWwgdmFyaWFudCB0eXBlIHdpdGggdGhlIGludGVnZXIgMyB3aWxsIGhhdmUgdGhlc2UKKyAqIG9jdGV0czoKKyAqICAgMHgxICdpJyAnXDAnIFsxIGJ5dGUgcGFkZGluZyB0byBhbGlnbm1lbnQgYm91bmRhcnldIDB4MCAweDAgMHgwIDB4MworICoKKyAqIFRoZSBtYWluIHdvcmxkIG9mIGh1cnQgZm9yIHdyaXRpbmcgb3V0IGEgdmFyaWFudCBpcyB0aGF0IHRoZSB0eXBlCisgKiBzdHJpbmcgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHRoZSB2YWx1ZSBzdHJpbmcuIFdoaWNoIG1lYW5zCisgKiBpbnNlcnRpbmcgdG8gdGhlIHR5cGUgc3RyaW5nIHdpbGwgbW92ZSB0aGUgdmFsdWVfcG9zOyBhbmQgaXQgbWVhbnMKKyAqIHRoYXQgaW5zZXJ0aW5nIHRvIHRoZSB0eXBlIHN0cmluZyBjb3VsZCBicmVhayB0eXBlIGFsaWdubWVudC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZXJfcmVjdXJzZV92YXJpYW50IChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViKQoreworICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKyAgCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3b3JzdCBjYXNlLCB3aGljaCBpcyAxIGJ5dGUgc2lnCisgICAgICAgKiBsZW5ndGgsIG51bCBieXRlIGF0IGVuZCBvZiBzaWcsIGFuZCA3IGJ5dGVzIHBhZGRpbmcgdG8KKyAgICAgICAqIDgtYm91bmRhcnkuCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChzdWItPnZhbHVlX3N0ciwgY29udGFpbmVkX3R5cGVfbGVuICsgOSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogd3JpdGUgVkFSSUFOVCB0eXBlY29kZSB0byB0aGUgcGFyZW50J3MgdHlwZSBzdHJpbmcgKi8KKyAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHdyaXRlciwgREJVU19UWVBFX1ZBUklBTlQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBJZiBub3QgZW5hYmxlZCwgbWFyayB0aGF0IHdlIGhhdmUgbm8gdHlwZV9zdHIgYW55bW9yZSAuLi4gKi8KKworICBpZiAoIXdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBzdWItPnR5cGVfc3RyID0gTlVMTDsKKyAgICAgIHN1Yi0+dHlwZV9wb3MgPSAtMTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIElmIHdlJ3JlIGVuYWJsZWQgdGhlbiBjb250aW51ZSAuLi4gKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgdmFyaWFudCB0eXBlIHNpZyBsZW4iKTsKKworICBzdWItPnZhbHVlX3BvcyArPSAxOworCisgIC8qIEhlcmUgd2Ugc3dpdGNoIG92ZXIgdG8gdGhlIGV4cGVjdGVkIHR5cGUgc2lnIHdlJ3JlIGFib3V0IHRvIHdyaXRlICovCisgIHN1Yi0+dHlwZV9zdHIgPSBzdWItPnZhbHVlX3N0cjsKKyAgc3ViLT50eXBlX3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQsIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfc3RyLCBzdWItPnZhbHVlX3BvcykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgdmFyaWFudCB0eXBlIHNpZyIpOworCisgIHN1Yi0+dmFsdWVfcG9zICs9IGNvbnRhaW5lZF90eXBlX2xlbjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCB2YXJpYW50IHR5cGUgbnVsIHRlcm1pbmF0aW9uIik7CisKKyAgc3ViLT52YWx1ZV9wb3MgKz0gMTsKKworICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgY29udGFpbmVkX2FsaWdubWVudCkgLSBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCBhbGlnbm1lbnQgcGFkZGluZyBmb3IgdmFyaWFudCBib2R5Iik7CisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCBjb250YWluZWRfYWxpZ25tZW50KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlX2NvbnRhaW5lZF9sZW4gKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX2FycmF5X2FwcGVuZCkKK3sKKyAgd3JpdGVyX3JlY3Vyc2VfaW5pdF9hbmRfY2hlY2sgKHdyaXRlciwgY29udGFpbmVyX3R5cGUsIHN1Yik7CisKKyAgc3dpdGNoIChjb250YWluZXJfdHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgcmV0dXJuIHdyaXRlcl9yZWN1cnNlX3N0cnVjdF9vcl9kaWN0X2VudHJ5ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV9zdHJ1Y3Rfb3JfZGljdF9lbnRyeSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV9hcnJheSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQsIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLCBpc19hcnJheV9hcHBlbmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV92YXJpYW50ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0cmllZCB0byByZWN1cnNlIGludG8gdHlwZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogT3BlbnMgYSBuZXcgY29udGFpbmVyIGFuZCB3cml0ZXMgb3V0IHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGZvciB0aGF0IGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIKKyAqIEBwYXJhbSBjb250YWluZXJfdHlwZSB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHRvIG9wZW4KKyAqIEBwYXJhbSBjb250YWluZWRfdHlwZSB0aGUgYXJyYXkgZWxlbWVudCB0eXBlIG9yIHZhcmlhbnQgY29udGVudCB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVkX3R5cGVfc3RhcnQgcG9zaXRpb24gdG8gbG9vayBmb3IgdGhlIHR5cGUKKyAqIEBwYXJhbSBzdWIgdGhlIG5ldyBzdWItd3JpdGVyIHRvIHdyaXRlIGNvbnRhaW5lciBjb250ZW50cworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViKQoreworICBpbnQgY29udGFpbmVkX3R5cGVfbGVuOworCisgIGlmIChjb250YWluZWRfdHlwZSkKKyAgICBjb250YWluZWRfdHlwZV9sZW4gPSBmaW5kX2xlbl9vZl9jb21wbGV0ZV90eXBlIChjb250YWluZWRfdHlwZSwgY29udGFpbmVkX3R5cGVfc3RhcnQpOworICBlbHNlCisgICAgY29udGFpbmVkX3R5cGVfbGVuID0gMDsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZV9jb250YWluZWRfbGVuICh3cml0ZXIsIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIGFuIGV4aXN0aW5nIGFycmF5LiBFc3NlbnRpYWxseSwgdGhlIHdyaXRlciB3aWxsIHJlYWQgYW4KKyAqIGV4aXN0aW5nIGxlbmd0aCBhdCB0aGUgd3JpdGUgbG9jYXRpb247IGp1bXAgb3ZlciB0aGF0IGxlbmd0aDsgYW5kCisgKiB3cml0ZSBuZXcgZmllbGRzLiBPbiB1bnJlY3Vyc2UoKSwgdGhlIGV4aXN0aW5nIGxlbmd0aCB3aWxsIGJlCisgKiB1cGRhdGVkLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlcgorICogQHBhcmFtIGNvbnRhaW5lZF90eXBlIGVsZW1lbnQgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lZF90eXBlX3N0YXJ0IHBvc2l0aW9uIG9mIGVsZW1lbnQgdHlwZQorICogQHBhcmFtIHN1YiB0aGUgc3Vid3JpdGVyIHRvIGluaXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YikKK3sKKyAgaW50IGNvbnRhaW5lZF90eXBlX2xlbjsKKworICBpZiAoY29udGFpbmVkX3R5cGUpCisgICAgY29udGFpbmVkX3R5cGVfbGVuID0gZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKyAgZWxzZQorICAgIGNvbnRhaW5lZF90eXBlX2xlbiA9IDA7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2VfY29udGFpbmVkX2xlbiAod3JpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworfQorCitzdGF0aWMgaW50Cit3cml0ZXJfZ2V0X2FycmF5X2xlbiAoREJ1c1R5cGVXcml0ZXIgKndyaXRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSk7CisgIHJldHVybiB3cml0ZXItPnZhbHVlX3BvcyAtIHdyaXRlci0+dS5hcnJheS5zdGFydF9wb3M7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgY29udGFpbmVyIGNyZWF0ZWQgYnkgX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSgpCisgKiBhbmQgd3JpdGVzIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSB2YWx1ZXMgYmxvY2suCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gc3ViIHRoZSBzdWItd3JpdGVyIGNyZWF0ZWQgYnkgX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSgpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICpzdWIpCit7CisgIC8qIHR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIG5ldmVyIGdldHMgdW5zZXQgb25jZSBzZXQsIG9yIHdlJ2QgZ2V0IGFsbCBob3NlZCAqLworICBfZGJ1c19hc3NlcnQgKCF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIHx8CisgICAgICAgICAgICAgICAgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gJiYgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgdW5yZWN1cnNlIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBjb250YWluZXJfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLCB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAod3JpdGVyLT5jb250YWluZXJfdHlwZSkpOworICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB1bnJlY3Vyc2Ugc3ViIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBjb250YWluZXJfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdWIsIHN1Yi0+dHlwZV9wb3MsIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoc3ViLT5jb250YWluZXJfdHlwZSkpOworI2VuZGlmCisKKyAgaWYgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoc3ViLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHN1YiwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoc3ViLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgeworICAgICAgaWYgKHN1Yi0+dS5hcnJheS5sZW5fcG9zID49IDApIC8qIGxlbl9wb3MgPT0gLTEgaWYgd2Ugd2VyZW4ndCBlbmFibGVkIHdoZW4gd2UgcGFzc2VkIGl0ICovCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IGxlbjsKKworICAgICAgICAgIC8qIFNldCB0aGUgYXJyYXkgbGVuZ3RoICovCisgICAgICAgICAgbGVuID0gd3JpdGVyX2dldF9hcnJheV9sZW4gKHN1Yik7CisgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT5ieXRlX29yZGVyKTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICAgZmlsbGVkIGluIHN1YiBhcnJheSBsZW4gdG8gJXUgYXQgbGVuX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHN1Yi0+dS5hcnJheS5sZW5fcG9zKTsKKyNlbmRpZgorICAgICAgICB9CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICAgbm90IGZpbGxpbmcgaW4gc3ViIGFycmF5IGxlbiBiZWNhdXNlIHdlIHdlcmUgZGlzYWJsZWQgd2hlbiB3ZSBwYXNzZWQgdGhlIGxlblxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAvKiBOb3cgZ2V0IHR5cGVfcG9zIHJpZ2h0IGZvciB0aGUgcGFyZW50IHdyaXRlci4gSGVyZSBhcmUgdGhlIGNhc2VzOgorICAgKgorICAgKiBDYXNlcyAhd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbjoKKyAgICogICAoaW4gdGhlc2UgY2FzZXMgd2Ugd2FudCB0byB1cGRhdGUgdG8gdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQpCisgICAqCisgICAqIC0gaWYgd2UgcmVjdXJzZWQgaW50byBhIFNUUlVDVCB0aGVuIHdlIGRpZG4ndCBrbm93IGluIGFkdmFuY2UKKyAgICogICB3aGF0IHRoZSB0eXBlcyBpbiB0aGUgc3RydWN0IHdvdWxkIGJlOyBzbyB3ZSBoYXZlIHRvIGZpbGwgaW4KKyAgICogICB0aGF0IGluZm9ybWF0aW9uIG5vdy4KKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3MKKyAgICoKKyAgICogLSBpZiB3ZSByZWN1cnNlZCBpbnRvIGFueXRoaW5nIGVsc2UsIHdlIGtuZXcgdGhlIGZ1bGwgYXJyYXkKKyAgICogICB0eXBlLCBvciBrbmV3IHRoZSBzaW5nbGUgdHlwZWNvZGUgbWFya2luZyBWQVJJQU5ULCBzbworICAgKiAgIHdyaXRlci0+dHlwZV9wb3MgaXMgYWxyZWFkeSBjb3JyZWN0LgorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICogLSBub3RlIHRoYXQgdGhlIHBhcmVudCBpcyBuZXZlciBhbiBBUlJBWSBvciBWQVJJQU5ULCBpZiBpdCB3ZXJlCisgICAqICAgdGhlbiB0eXBlX3Bvc19pc19leHBlY3RhdGlvbiB3b3VsZCBiZSBUUlVFLiBUaGUgcGFyZW50CisgICAqICAgaXMgdGh1cyBrbm93biB0byBiZSBhIHRvcGxldmVsIG9yIFNUUlVDVC4KKyAgICoKKyAgICogQ2FzZXMgd2hlcmUgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbjoKKyAgICogICAoaW4gdGhlc2UgY2FzZXMgd2Ugd2FudCB0byB1cGRhdGUgdG8gbmV4dCBleHBlY3RlZCB0eXBlIHRvIHdyaXRlKQorICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gU1RSVUNUIGludG8gU1RSVUNUIGFuZCB3ZSBkaWRuJ3QgaW5jcmVtZW50CisgICAqICAgdHlwZV9wb3MgaW4gdGhlIHBhcmVudCBqdXN0IHRvIHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZQorICAgKiAgICF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIGNhc2UgKHRob3VnaCB3ZSBjb3VsZAorICAgKiAgIHNwZWNpYWwtY2FzZSB0aGlzIGluIHJlY3Vyc2Vfc3RydWN0IGluc3RlYWQgaWYgd2Ugd2FudGVkKQorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zID0gc3ViLT50eXBlX3BvcworICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gU1RSVUNUIGludG8gQVJSQVkgb3IgVkFSSUFOVCBhbmQgdHlwZV9wb3MKKyAgICogICBmb3IgcGFyZW50IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgYWxyZWFkeQorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICogLSB3ZSByZWN1cnNlZCBmcm9tIEFSUkFZIGludG8gYSBzdWItZWxlbWVudCwgc28gdHlwZV9wb3MgaW4gdGhlCisgICAqICAgcGFyZW50IGlzIHRoZSBlbGVtZW50IHR5cGUgYW5kIHNob3VsZCByZW1haW4gdGhlIGVsZW1lbnQgdHlwZQorICAgKiAgIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgbmV4dCBjaGlsZCBlbGVtZW50CisgICAqICAgICAgIHdyaXRlci0+dHlwZV9wb3Mgc2hvdWxkIHJlbWFpbiBhcy1pcworICAgKgorICAgKiAtIHdlIHJlY3Vyc2VkIGZyb20gVkFSSUFOVCBpbnRvIGl0cyB2YWx1ZSwgc28gdHlwZV9wb3MgaW4gdGhlCisgICAqICAgcGFyZW50IG1ha2VzIG5vIGRpZmZlcmVuY2Ugc2luY2UgdGhlcmUncyBvbmx5IG9uZSB2YWx1ZQorICAgKiAgIGFuZCB3ZSBqdXN0IGZpbmlzaGVkIHdyaXRpbmcgaXQgYW5kIHdvbid0IHVzZSB0eXBlX3BvcyBhZ2FpbgorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICoKKyAgICogRm9yIGFsbCB0aGVzZSwgRElDVF9FTlRSWSBpcyB0aGUgc2FtZSBhcyBTVFJVQ1QKKyAgICovCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9TVFJVQ1QgfHwKKyAgICAgICAgICAgc3ViLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkgJiYKKyAgICAgICAgICAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfU1RSVUNUIHx8CisgICAgICAgICAgIHdyaXRlci0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgfHwKKyAgICAgICAgICAgd3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBBZHZhbmNlIHRoZSBwYXJlbnQgdG8gdGhlIG5leHQgc3RydWN0IGZpZWxkICovCisgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgd3JpdGVyLT52YWx1ZV9wb3MgPSBzdWItPnZhbHVlX3BvczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHVucmVjdXJzZWQgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIik7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgYmFzaWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIHdyaXRlCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICAvKiBGaXJzdCBlbnN1cmUgdGhhdCBvdXIgdHlwZSByZWFsbG9jIHdpbGwgc3VjY2VlZCAqLworICBpZiAoIXdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gJiYgd3JpdGVyLT50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICh3cml0ZXItPnR5cGVfc3RyLCAxKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljX25vX3R5cGVjb2RlICh3cml0ZXIsIHR5cGUsIHZhbHVlKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAod3JpdGVyLCB0eXBlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gd3JpdGUgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIGJhc2ljIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24sCisgICAgICAgICAgICAgICAgIHdyaXRlci0+ZW5hYmxlZCk7CisjZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFdyaXRlcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB2YWx1ZXMsIGkuZS4gdGhvc2UgdGhhdCBhcmUKKyAqIGJvdGggZGJ1c190eXBlX2lzX2ZpeGVkKCkgYW5kIF9kYnVzX3R5cGVfaXNfYmFzaWMoKS4gVGhlIGJsb2NrCisgKiBtdXN0IGJlIHdyaXR0ZW4gaW5zaWRlIGFuIGFycmF5LgorICoKKyAqIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHNhaWQgYXJyYXkgb2YgdmFsdWVzLAorICogc28gZS5nLiBpZiBpdCdzIGFuIGFycmF5IG9mIGRvdWJsZSwgcGFzcyBpbiAiY29uc3QgZG91YmxlKioiCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2Ygc3R1ZmYgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gdmFsdWUgYWRkcmVzcyBvZiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cykKK3sKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKTsKKyAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID49IDApOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgZW50ZXJpbmcgZml4ZWQgbXVsdGkgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBuX2VsZW1lbnRzICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLCBuX2VsZW1lbnRzKTsKKyNlbmRpZgorCisgIGlmICghd3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlICh3cml0ZXIsIGVsZW1lbnRfdHlwZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIHNob3VsZCBub3QgaGFwcGVuIGlmIG9ubHkgdmVyaWZ5aW5nIHR5cGVjb2RlIik7CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfZml4ZWRfbXVsdGkgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLT52YWx1ZV9wb3MpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgZml4ZWQgbXVsdGkgd3JpdHRlbiBuZXcgdHlwZV9wb3MgPSAlZCBuZXcgdmFsdWVfcG9zID0gJWQgbl9lbGVtZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgbl9lbGVtZW50cyk7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2VuYWJsZV9pZl9hZnRlciAoREJ1c1R5cGVXcml0ZXIgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnN0YXJ0X2FmdGVyKQoreworICBpZiAoc3RhcnRfYWZ0ZXIpCisgICAgeworICAgICAgaWYgKCF3cml0ZXItPmVuYWJsZWQgJiYgX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuIChyZWFkZXIsIHN0YXJ0X2FmdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkICh3cml0ZXIsIFRSVUUpOworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVOQUJMSU5HIHdyaXRlciAlcCBhdCAlZCBiZWNhdXNlIHJlYWRlciBhdCB2YWx1ZV9wb3MgJWQgaXMgYWZ0ZXIgcmVhZGVyIGF0IHZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dmFsdWVfcG9zLCByZWFkZXItPnZhbHVlX3Bvcywgc3RhcnRfYWZ0ZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKCghd3JpdGVyLT5lbmFibGVkICYmICFfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gKHJlYWRlciwgc3RhcnRfYWZ0ZXIpKSB8fAorICAgICAgICAgICAgICAgICAgICAod3JpdGVyLT5lbmFibGVkICYmIF9kYnVzX3R5cGVfcmVhZGVyX2dyZWF0ZXJfdGhhbiAocmVhZGVyLCBzdGFydF9hZnRlcikpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2ZpeHVwIChEQnVzTGlzdCAgICAgICAgICAgICAgICoqZml4dXBzLAorICAgICAgICAgICAgICBjb25zdCBEQnVzQXJyYXlMZW5GaXh1cCAqZml4dXApCit7CisgIERCdXNBcnJheUxlbkZpeHVwICpmOworCisgIGYgPSBkYnVzX25ldyAoREJ1c0FycmF5TGVuRml4dXAsIDEpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAqZiA9ICpmaXh1cDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChmaXh1cHMsIGYpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoZi0+bGVuX3Bvc19pbl9yZWFkZXIgPT0gZml4dXAtPmxlbl9wb3NfaW5fcmVhZGVyKTsKKyAgX2RidXNfYXNzZXJ0IChmLT5uZXdfbGVuID09IGZpeHVwLT5uZXdfbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGhpcyBsb29wIGlzIHRyaXZpYWwgaWYgeW91IGlnbm9yZSBhbGwgdGhlIHN0YXJ0X2FmdGVyIG5vbnNlbnNlLAorICogc28gaWYgeW91J3JlIHRyeWluZyB0byBmaWd1cmUgaXQgb3V0LCBzdGFydCBieSBpZ25vcmluZyB0aGF0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3dyaXRlX3JlYWRlcl9oZWxwZXIgKERCdXNUeXBlV3JpdGVyICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyKQoreworICBpbnQgY3VycmVudF90eXBlOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgaWYgKGRidXNfdHlwZV9pc19jb250YWluZXIgKGN1cnJlbnRfdHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWJyZWFkZXI7CisgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgc3Vid3JpdGVyOworICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNpZ19zdHI7CisgICAgICAgICAgaW50IHNpZ19zdGFydDsKKyAgICAgICAgICBpbnQgc2lnX2xlbjsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBlbmFibGVkX2F0X3JlY3Vyc2U7CisgICAgICAgICAgZGJ1c19ib29sX3QgcGFzdF9zdGFydF9hZnRlcjsKKyAgICAgICAgICBpbnQgcmVhZGVyX2FycmF5X2xlbl9wb3M7CisgICAgICAgICAgaW50IHJlYWRlcl9hcnJheV9zdGFydF9wb3M7CisgICAgICAgICAgZGJ1c19ib29sX3QgdGhpc19pc19zdGFydF9hZnRlcjsKKworICAgICAgICAgIC8qIHR5cGVfcG9zIGlzIGNoZWNrZWQgc2luY2UgZS5nLiBpbiBhIHN0cnVjdCB0aGUgc3RydWN0CisgICAgICAgICAgICogYW5kIGl0cyBmaXJzdCBmaWVsZCBoYXZlIHRoZSBzYW1lIHZhbHVlX3Bvcy4KKyAgICAgICAgICAgKiB0eXBlX3N0ciB3aWxsIGRpZmZlciBpbiByZWFkZXIvc3RhcnRfYWZ0ZXIgZm9yIHZhcmlhbnRzCisgICAgICAgICAgICogd2hlcmUgdHlwZV9zdHIgaXMgaW5zaWRlIHRoZSB2YWx1ZV9zdHIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiBzdGFydF9hZnRlciAmJgorICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcyA9PSBzdGFydF9hZnRlci0+dmFsdWVfcG9zICYmCisgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9zdHIgPT0gc3RhcnRfYWZ0ZXItPnR5cGVfc3RyICYmCisgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgPT0gc3RhcnRfYWZ0ZXItPnR5cGVfcG9zKQorICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlciA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlciA9IEZBTFNFOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3VicmVhZGVyKTsKKworICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfbGVuX3BvcyA9IEFSUkFZX1JFQURFUl9MRU5fUE9TICgmc3VicmVhZGVyKTsKKyAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X3N0YXJ0X3BvcyA9IHN1YnJlYWRlci51LmFycmF5LnN0YXJ0X3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHF1aWV0IGdjYyAqLworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfbGVuX3BvcyA9IC0xOworICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfc3RhcnRfcG9zID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICgmc3VicmVhZGVyLCAmc2lnX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnX3N0YXJ0LCAmc2lnX2xlbik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhYm91dCB0byByZWN1cnNlIGludG8gJXMgcmVhZGVyIGF0ICVkIHN1YnJlYWRlciBhdCAlZCB3cml0ZXIgYXQgJWQgc3RhcnRfYWZ0ZXIgcmVhZGVyIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWQgaW5zaWRlX3N0YXJ0X2FmdGVyID0gJWQgdGhpc19pc19zdGFydF9hZnRlciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlYWRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXIgPyBzdGFydF9hZnRlci0+dmFsdWVfcG9zIDogLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIsIHRoaXNfaXNfc3RhcnRfYWZ0ZXIpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiAhdGhpc19pc19zdGFydF9hZnRlcikKKyAgICAgICAgICAgIGVuYWJsZV9pZl9hZnRlciAod3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgZW5hYmxlZF9hdF9yZWN1cnNlID0gd3JpdGVyLT5lbmFibGVkOworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZV9jb250YWluZWRfbGVuICh3cml0ZXIsIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3N0ciwgc2lnX3N0YXJ0LCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Vid3JpdGVyLCBGQUxTRSkpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY3Vyc2VkIGludG8gc3Vid3JpdGVyIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Vid3JpdGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3Vid3JpdGVyLnZhbHVlX3N0cikpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIXdyaXRlcl93cml0ZV9yZWFkZXJfaGVscGVyICgmc3Vid3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLCBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2lzX3N0YXJ0X2FmdGVyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYWJvdXQgdG8gdW5yZWN1cnNlIGZyb20gJXMgc3VicmVhZGVyIGF0ICVkIHdyaXRlciBhdCAlZCBzdWJ3cml0ZXIgYXQgJWQgIHdyaXRlIHRhcmdldCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVhZGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ3cml0ZXIudmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0cikpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlciAmJiAhdGhpc19pc19zdGFydF9hZnRlcikKKyAgICAgICAgICAgIGVuYWJsZV9pZl9hZnRlciAod3JpdGVyLCAmc3VicmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgcGFzdF9zdGFydF9hZnRlciA9IHdyaXRlci0+ZW5hYmxlZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3Vid3JpdGVyKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgICAgLyogSWYgd2Ugd2VyZW4ndCBlbmFibGVkIHdoZW4gd2UgcmVjdXJzZWQsIHdlIGRpZG4ndAorICAgICAgICAgICAqIHdyaXRlIGFuIGFycmF5IGxlbjsgaWYgd2UgcGFzc2VkIHN0YXJ0X2FmdGVyCisgICAgICAgICAgICogc29tZXdoZXJlIGluc2lkZSB0aGUgYXJyYXksIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZQorICAgICAgICAgICAqIGEgZml4dXAuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHN0YXJ0X2FmdGVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgIWVuYWJsZWRfYXRfcmVjdXJzZSAmJiBwYXN0X3N0YXJ0X2FmdGVyICYmCisgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgICAgICAgICAgZml4dXBzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNBcnJheUxlbkZpeHVwIGZpeHVwOworICAgICAgICAgICAgICBpbnQgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcjsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlcjsKKyAgICAgICAgICAgICAgaW50IG9sZF9sZW47CisKKyAgICAgICAgICAgICAgLyogdGhpcyBzdWJ3cml0ZXIgYWNjZXNzIGlzIG1vZGVyYXRlbHkgdW5rb3NoZXIgc2luY2Ugd2UKKyAgICAgICAgICAgICAgICogYWxyZWFkeSB1bnJlY3Vyc2VkLCBidXQgaXQgd29ya3MgYXMgbG9uZyBhcyB1bnJlY3Vyc2UKKyAgICAgICAgICAgICAgICogZG9lc24ndCBicmVhayB1cyBvbiBwdXJwb3NlCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyID0gd3JpdGVyX2dldF9hcnJheV9sZW4gKCZzdWJ3cml0ZXIpOworCisgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciA9CisgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcyAtIHJlYWRlcl9hcnJheV9zdGFydF9wb3M7CisKKyAgICAgICAgICAgICAgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIgPSByZWFkZXJfYXJyYXlfbGVuX3BvczsKKyAgICAgICAgICAgICAgZml4dXAubmV3X2xlbiA9CisgICAgICAgICAgICAgICAgYnl0ZXNfYmVmb3JlX3N0YXJ0X2FmdGVyICsKKyAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuICsKKyAgICAgICAgICAgICAgICBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyLCA0KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIpOworCisgICAgICAgICAgICAgIG9sZF9sZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyLCA0KSk7CisKKyAgICAgICAgICAgICAgaWYgKG9sZF9sZW4gIT0gZml4dXAubmV3X2xlbiAmJiAhYXBwZW5kX2ZpeHVwIChmaXh1cHMsICZmaXh1cCkpCisgICAgICAgICAgICAgICAgZ290byBvb207CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiR2VuZXJhdGVkIGZpeHVwIGxlbl9wb3NfaW5fcmVhZGVyID0gJWQgbmV3X2xlbiA9ICVkIHJlYWRlcl9hcnJheV9zdGFydF9wb3MgPSAlZCBzdGFydF9hZnRlci0+dmFsdWVfcG9zID0gJWQgYnl0ZXNfYmVmb3JlX3N0YXJ0X2FmdGVyID0gJWQgc3RhcnRfYWZ0ZXJfbmV3X2xlbiA9ICVkIGJ5dGVzX3dyaXR0ZW5fYWZ0ZXJfc3RhcnRfYWZ0ZXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwLm5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcl9hcnJheV9zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgdmFsOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKGN1cnJlbnRfdHlwZSkpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVhZGluZyBiYXNpYyB2YWx1ZSAlcyBhdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3Bvcyk7CisjZW5kaWYKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwgJnZhbCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXcml0aW5nIGJhc2ljIHZhbHVlICVzIGF0ICVkIHdyaXRlIHRhcmdldCBsZW4gJWQgaW5zaWRlX3N0YXJ0X2FmdGVyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc3RhcnRfYWZ0ZXIpOworI2VuZGlmCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIpCisgICAgICAgICAgICBlbmFibGVfaWZfYWZ0ZXIgKHdyaXRlciwgcmVhZGVyLCBzdGFydF9hZnRlcik7CisgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLCBjdXJyZW50X3R5cGUsICZ2YWwpKQorICAgICAgICAgICAgZ290byBvb207CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV3JvdGUgYmFzaWMgdmFsdWUgJXMsIG5ldyB2YWx1ZV9wb3MgJWQgd3JpdGUgdGFyZ2V0IGxlbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBpZiAoZml4dXBzKQorICAgIGFwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoZml4dXBzLCBOVUxMKTsgLyogTlVMTCBmb3IgcmVhZGVyIHRvIGFwcGx5IHRvICovCisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIGFsbCB2YWx1ZXMgaW4gdGhlIGdpdmVuIHJlYWRlciwgd3JpdGluZyBhIGNvcHkgb2YKKyAqIGVhY2ggdmFsdWUgdG8gdGhlIHdyaXRlci4gIFRoZSByZWFkZXIgd2lsbCBiZSBtb3ZlZCBmb3J3YXJkIHRvIGl0cworICogZW5kIHBvc2l0aW9uLgorICoKKyAqIElmIGEgcmVhZGVyIHN0YXJ0X2FmdGVyIGlzIHByb3ZpZGVkLCBpdCBzaG91bGQgYmUgYSByZWFkZXIgZm9yIHRoZQorICogc2FtZSBkYXRhIGFzIHRoZSByZWFkZXIgdG8gYmUgd3JpdHRlbi4gT25seSB2YWx1ZXMgb2NjdXJyaW5nIGFmdGVyCisgKiB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBzdGFydF9hZnRlciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHdyaXRlci4KKyAqCisgKiBJZiBzdGFydF9hZnRlciBpcyBwcm92aWRlZCwgdGhlbiB0aGUgY29weSBvZiB0aGUgcmVhZGVyIHdpbGwgYmUKKyAqIHBhcnRpYWwuIFRoaXMgbWVhbnMgdGhhdCBhcnJheSBsZW5ndGhzIHdpbGwgbm90IGhhdmUgYmVlbiBjb3BpZWQuCisgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHlvdSB3cm90ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB2YWx1ZSBhdAorICogc3RhcnRfYWZ0ZXIgdG8gdGhlIHdyaXRlci4gWW91IGhhdmUgdG8gcGFzcyBpbiB0aGUgc3RhcnQgcG9zaXRpb24KKyAqIGFuZCBsZW5ndGggb2YgdGhlIG5ldyB2YWx1ZS4gKElmIHlvdSBhcmUgZGVsZXRpbmcgdGhlIHZhbHVlCisgKiBhdCBzdGFydF9hZnRlciwgcGFzcyBpbiAwIGZvciB0aGUgbGVuZ3RoLikKKyAqCisgKiBJZiB0aGUgZml4dXBzIHBhcmFtZXRlciBpcyBub24tI05VTEwsIHRoZW4gYW55IGFycmF5IGxlbmd0aCB0aGF0CisgKiB3YXMgcmVhZCBidXQgbm90IHdyaXR0ZW4gZHVlIHRvIHN0YXJ0X2FmdGVyIHdpbGwgYmUgcHJvdmlkZWQKKyAqIGFzIGEgI0RCdXNBcnJheUxlbkZpeHVwLiBUaGUgZml4dXAgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZQorICogYXJyYXkgbGVuZ3RoIGluIHRoZSBzb3VyY2UgZGF0YSwgYW5kIHRoZSBjb3JyZWN0IGFycmF5IGxlbmd0aAorICogYXNzdW1pbmcgeW91IGNvbWJpbmUgdGhlIHNvdXJjZSBkYXRhIGJlZm9yZSBzdGFydF9hZnRlciB3aXRoCisgKiB0aGUgd3JpdHRlbiBkYXRhIGF0IHN0YXJ0X2FmdGVyIGFuZCBiZXlvbmQuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGNvcHkgdG8KKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byBjb3B5IGZyb20KKyAqIEBwYXJhbSBzdGFydF9hZnRlciAjTlVMTCBvciBhIHJlYWRlciBzaG93aW5nIHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gc3RhcnRfYWZ0ZXJfbmV3X3BvcyB0aGUgcG9zaXRpb24gb2Ygc3RhcnRfYWZ0ZXIgZXF1aXZhbGVudCBpbiB0aGUgdGFyZ2V0IGRhdGEKKyAqIEBwYXJhbSBzdGFydF9hZnRlcl9uZXdfbGVuIHRoZSBsZW5ndGggb2Ygc3RhcnRfYWZ0ZXIgZXF1aXZhbGVudCBpbiB0aGUgdGFyZ2V0IGRhdGEKKyAqIEBwYXJhbSBmaXh1cHMgbGlzdCB0byBhcHBlbmQgI0RCdXNBcnJheUxlbkZpeHVwIGlmIHRoZSB3cml0ZSB3YXMgcGFydGlhbAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsIChEQnVzVHlwZVdyaXRlciAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAgKipmaXh1cHMpCit7CisgIERCdXNUeXBlV3JpdGVyIG9yaWc7CisgIGludCBvcmlnX3R5cGVfbGVuOworICBpbnQgb3JpZ192YWx1ZV9sZW47CisgIGludCBuZXdfYnl0ZXM7CisgIGludCBvcmlnX2VuYWJsZWQ7CisKKyAgb3JpZyA9ICp3cml0ZXI7CisgIG9yaWdfdHlwZV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT50eXBlX3N0cik7CisgIG9yaWdfdmFsdWVfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKTsKKyAgb3JpZ19lbmFibGVkID0gd3JpdGVyLT5lbmFibGVkOworCisgIGlmIChzdGFydF9hZnRlcikKKyAgICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAod3JpdGVyLCBGQUxTRSk7CisKKyAgaWYgKCF3cml0ZXJfd3JpdGVfcmVhZGVyX2hlbHBlciAod3JpdGVyLCByZWFkZXIsIHN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cHMsIEZBTFNFKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAod3JpdGVyLCBvcmlnX2VuYWJsZWQpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKCF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKQorICAgIHsKKyAgICAgIG5ld19ieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnR5cGVfc3RyKSAtIG9yaWdfdHlwZV9sZW47CisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlICh3cml0ZXItPnR5cGVfc3RyLCBvcmlnLnR5cGVfcG9zLCBuZXdfYnl0ZXMpOworICAgIH0KKyAgbmV3X2J5dGVzID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIG9yaWdfdmFsdWVfbGVuOworICBfZGJ1c19zdHJpbmdfZGVsZXRlICh3cml0ZXItPnZhbHVlX3N0ciwgb3JpZy52YWx1ZV9wb3MsIG5ld19ieXRlcyk7CisKKyAgKndyaXRlciA9IG9yaWc7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdmFsdWVzIGluIHRoZSBnaXZlbiByZWFkZXIsIHdyaXRpbmcgYSBjb3B5IG9mCisgKiBlYWNoIHZhbHVlIHRvIHRoZSB3cml0ZXIuICBUaGUgcmVhZGVyIHdpbGwgYmUgbW92ZWQgZm9yd2FyZCB0byBpdHMKKyAqIGVuZCBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gY29weSB0bworICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIGNvcHkgZnJvbQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyIChEQnVzVHlwZVdyaXRlciAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyKQoreworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyX3BhcnRpYWwgKHdyaXRlciwgcmVhZGVyLCBOVUxMLCAwLCAwLCBOVUxMKTsKK30KKworLyoKKyAqIElmIGRpc2FibGVkLCBhIHdyaXRlciBjYW4gc3RpbGwgYmUgaXRlcmF0ZWQgZm9yd2FyZCBhbmQgcmVjdXJzZWQvdW5yZWN1cnNlZAorICogYnV0IHdvbid0IHdyaXRlIGFueSB2YWx1ZXMuIFR5cGVzIHdpbGwgc3RpbGwgYmUgd3JpdHRlbiB1bmxlc3MgdGhlCisgKiB3cml0ZXIgaXMgYSAidmFsdWVzIG9ubHkiIHdyaXRlciwgYmVjYXVzZSB0aGUgd3JpdGVyIG5lZWRzIGFjY2VzcyB0bworICogYSB2YWxpZCBzaWduYXR1cmUgdG8gYmUgYWJsZSB0byBpdGVyYXRlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHR5cGUgd3JpdGVyCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSBpZiB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkIChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgZW5hYmxlZCkKK3sKKyAgd3JpdGVyLT5lbmFibGVkID0gZW5hYmxlZCAhPSBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBEQnVzTWFyc2hhbCBncm91cCAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmggYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFkMWVmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oICBNYXJzaGFsbGluZyByb3V0aW5lcyBmb3IgcmVjdXJzaXZlIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX1JFQ1VSU0lWRV9ICisjZGVmaW5lIERCVVNfTUFSU0hBTF9SRUNVUlNJVkVfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1R5cGVSZWFkZXIgICAgICBEQnVzVHlwZVJlYWRlcjsKK3R5cGVkZWYgc3RydWN0IERCdXNUeXBlV3JpdGVyICAgICAgREJ1c1R5cGVXcml0ZXI7Cit0eXBlZGVmIHN0cnVjdCBEQnVzVHlwZVJlYWRlckNsYXNzIERCdXNUeXBlUmVhZGVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBEQnVzQXJyYXlMZW5GaXh1cCAgIERCdXNBcnJheUxlbkZpeHVwOworCisvKioKKyAqIFRoZSB0eXBlIHJlYWRlciBpcyBhbiBpdGVyYXRvciBmb3IgcmVhZGluZyB2YWx1ZXMgZnJvbSBhIGJsb2NrIG9mCisgKiB2YWx1ZXMuCisgKi8KK3N0cnVjdCBEQnVzVHlwZVJlYWRlcgoreworICBkYnVzX3VpbnQzMl90IGJ5dGVfb3JkZXIgOiA4OyAvKio8IGJ5dGUgb3JkZXIgb2YgdGhlIGJsb2NrICovCisKKyAgZGJ1c191aW50MzJfdCBmaW5pc2hlZCA6IDE7ICAgLyoqPCBtYXJrcyB3ZSdyZSBhdCBlbmQgaXRlcmF0b3IgZm9yIGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXJlIHdlIGRvbid0IGhhdmUgYW5vdGhlciB3YXkgdG8gdGVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZGJ1c191aW50MzJfdCBhcnJheV9sZW5fb2Zmc2V0IDogMzsgLyoqPCBieXRlcyBiYWNrIGZyb20gc3RhcnRfcG9zIHRoYXQgbGVuIGVuZHMgKi8KKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7ICAgLyoqPCBzdHJpbmcgY29udGFpbmluZyBzaWduYXR1cmUgb2YgYmxvY2sgKi8KKyAgaW50IHR5cGVfcG9zOyAgICAgICAgICAgICAgICAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHNpZ25hdHVyZSAqLworICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7ICAvKio8IHN0cmluZyBjb250YWluaW5nIHZhbHVlcyBvZiBibG9jayAqLworICBpbnQgdmFsdWVfcG9zOyAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gdmFsdWVzICovCisKKyAgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyAqa2xhc3M7IC8qKjwgdGhlIHZ0YWJsZSBmb3IgdGhlIHJlYWRlciAqLworICB1bmlvbgorICB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCBzdGFydF9wb3M7ICAgICAgICAgICAgICAgIC8qKjwgZm9yIGFycmF5IHJlYWRlcnMsIHRoZSBzdGFydCBvZiB0aGUgYXJyYXkgdmFsdWVzICovCisgICAgfSBhcnJheTsKKyAgfSB1OyAvKio8IGNsYXNzLXNwZWNpZmljIGRhdGEgKi8KK307CisKKy8qKgorICogVGhlIHR5cGUgd3JpdGVyIGlzIGFuIGl0ZXJhdG9yIGZvciB3cml0aW5nIHRvIGEgYmxvY2sgb2YgdmFsdWVzLgorICovCitzdHJ1Y3QgREJ1c1R5cGVXcml0ZXIKK3sKKyAgZGJ1c191aW50MzJfdCBieXRlX29yZGVyIDogODsgICAgICAgICAgICAvKio8IGJ5dGUgb3JkZXIgdG8gd3JpdGUgdmFsdWVzIHdpdGggKi8KKworICBkYnVzX3VpbnQzMl90IGNvbnRhaW5lcl90eXBlIDogODsgICAgICAgIC8qKjwgd2hhdCBhcmUgd2UgaW5zaWRlPyAoZS5nLiBzdHJ1Y3QsIHZhcmlhbnQsIGFycmF5KSAqLworCisgIGRidXNfdWludDMyX3QgdHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gOiAxOyAvKio8IHR5cGVfcG9zIGNhbiBiZSBlaXRoZXIgYW4gaW5zZXJ0aW9uIHBvaW50IGZvciBvciBhbiBleHBlY3RlZCBuZXh0IHR5cGUgKi8KKworICBkYnVzX3VpbnQzMl90IGVuYWJsZWQgOiAxOyAvKio8IHdoZXRoZXIgdG8gd3JpdGUgdmFsdWVzICovCisKKyAgREJ1c1N0cmluZyAqdHlwZV9zdHI7IC8qKjwgd2hlcmUgdG8gd3JpdGUgdHlwZWNvZGVzIChvciByZWFkIHR5cGUgZXhwZWN0YXRpb25zKSAqLworICBpbnQgdHlwZV9wb3M7ICAgICAgICAgLyoqPCBjdXJyZW50IHBvcyBpbiB0eXBlX3N0ciAqLworICBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7IC8qKjwgd2hlcmUgdG8gd3JpdGUgdmFsdWVzICovCisgIGludCB2YWx1ZV9wb3M7ICAgICAgICAgLyoqPCBuZXh0IHBvc2l0aW9uIHRvIHdyaXRlICovCisKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdCB7CisgICAgICBpbnQgc3RhcnRfcG9zOyAvKio8IHBvc2l0aW9uIG9mIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCisgICAgICBpbnQgbGVuX3BvczsgICAvKio8IHBvc2l0aW9uIG9mIGxlbmd0aCBvZiB0aGUgYXJyYXkgKi8KKyAgICAgIGludCBlbGVtZW50X3R5cGVfcG9zOyAvKio8IHBvc2l0aW9uIG9mIGFycmF5IGVsZW1lbnQgdHlwZSBpbiB0eXBlX3N0ciAqLworICAgIH0gYXJyYXk7CisgIH0gdTsgLyoqPCBjbGFzcy1zcGVjaWZpYyBkYXRhICovCit9OworCisvKioKKyAqIFdoZW4gbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGJsb2NrIG9mIHZhbHVlcywgYXJyYXkgbGVuZ3RocyBtYXkgbmVlZAorICogdG8gYmUgYWRqdXN0ZWQ7IHRob3NlIGFkanVzdG1lbnRzIGFyZSBkZXNjcmliZWQgYnkgdGhpcyBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBEQnVzQXJyYXlMZW5GaXh1cAoreworICBpbnQgbGVuX3Bvc19pbl9yZWFkZXI7IC8qKjwgd2hlcmUgdGhlIGxlbmd0aCB3YXMgaW4gdGhlIG9yaWdpbmFsIGJsb2NrICovCisgIGludCBuZXdfbGVuOyAgICAgICAgICAgLyoqPCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBsZW5ndGggaW4gdGhlIHdyaXR0ZW4tb3V0IGJsb2NrICovCit9OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Bvcyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfbGVuZ3RoICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5fZWxlbWVudHMpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9yYXcgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqKnZhbHVlX2xvY2F0aW9uKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgICAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpzdWJyZWFkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAgICAgICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqKnN0cl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpzdGFydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpsZW5fcCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWxpZ25fcm9vdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhbGlnbl9yb290KTsKKworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZXF1YWxfdmFsdWVzICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyaHMpOworCit2b2lkICAgICAgICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0ICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCQkgaW50ICAgICAgICAgICAgICAgICAgICp0eXBlX3Bvcyk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgICAgICAgICAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdHlwZXNfZGVsYXllZCAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfYWRkX3R5cGVzICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3Bvcyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICAgICAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgICAgICAqc3ViKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyKTsKKworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX1JFQ1VSU0lWRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExZTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYwpAQCAtMCwwICsxLDU4NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtbWFyc2hhbC12YWxpZGF0ZS5jLCBidXQgb25seSB1c2VkIGJ5IHRlc3RzL2J1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgREJ1c1ZhbGlkaXR5IGV4cGVjdGVkOworfSBWYWxpZGl0eVRlc3Q7CisKK3N0YXRpYyB2b2lkCitydW5fdmFsaWRpdHlfdGVzdHMgKGNvbnN0IFZhbGlkaXR5VGVzdCAqdGVzdHMsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbl90ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICgqIGZ1bmMpIChjb25zdCBEQnVzU3RyaW5nKixpbnQsaW50KSkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fdGVzdHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIERCdXNWYWxpZGl0eSB2OworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGVzdHNbaV0uZGF0YSk7CisKKyAgICAgIHYgPSAoKmZ1bmMpICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgICAgICBpZiAodiAhPSB0ZXN0c1tpXS5leHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbXByb3BlciB2YWxpZGF0aW9uIHJlc3VsdCAlZCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB2LCB0ZXN0c1tpXS5kYXRhKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgVmFsaWRpdHlUZXN0IHNpZ25hdHVyZV90ZXN0c1tdID0geworICB7ICIiLCBEQlVTX1ZBTElEIH0sCisgIHsgImkiLCBEQlVTX1ZBTElEIH0sCisgIHsgImFpIiwgREJVU19WQUxJRCB9LAorICB7ICIoaSkiLCBEQlVTX1ZBTElEIH0sCisgIHsgInciLCBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERSB9LAorICB7ICJhIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImFhYWFhYSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICB7ICJpaShpaSlhIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImlhIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIC8qIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfVE9PX0xPTkcsICovIC8qIHRvbyBoYXJkIHRvIHRlc3QgdGhpcyB3YXkgKi8KKyAgeyAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwKKyAgICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT04gfSwKKyAgeyAiKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKChpaSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIiwKKyAgICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OIH0sCisgIHsgIikiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0VOREVEX0JVVF9OT1RfU1RBUlRFRCB9LAorICB7ICJpKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEIH0sCisgIHsgImEpIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgIigiLCBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCB9LAorICB7ICIoaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIihpaWlpaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIihhaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIigpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgIigoKSkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiYSgpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgImkoKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICIoKWkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiKGEpIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImF7aWF9IiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImF7fSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiYXthaWl9IiwgREJVU19JTlZBTElEX0RJQ1RfS0VZX01VU1RfQkVfQkFTSUNfVFlQRSB9LAorICAvKiB7ICJhe2l9IiwgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEIH0sICovCisgIC8qIHsgIntpc30iLCBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9OT1RfSU5TSURFX0FSUkFZIH0sICovCisgIC8qIHsgImF7aXNpfSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFMgfSwgKi8KK307CisKK2RidXNfYm9vbF90CitfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX3Rlc3QgKHZvaWQpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgaTsKKworICBjb25zdCBjaGFyICp2YWxpZF9wYXRoc1tdID0geworICAgICIvIiwKKyAgICAiL2Zvby9iYXIiLAorICAgICIvZm9vIiwKKyAgICAiL2Zvby9iYXIvYmF6IgorICB9OworICBjb25zdCBjaGFyICppbnZhbGlkX3BhdGhzW10gPSB7CisgICAgImJhciIsCisgICAgImJhci9iYXoiLAorICAgICIvZm9vL2Jhci8iLAorICAgICIvZm9vLyIsCisgICAgImZvby8iLAorICAgICJib28vL2JsYWgiLAorICAgICIvLyIsCisgICAgIi8vLyIsCisgICAgImZvby8vL2JsYWgvIiwKKyAgICAiSGVsbG8gV29ybGQiLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX2ludGVyZmFjZXNbXSA9IHsKKyAgICAib3JnLmZyZWVkZXNrdG9wLkZvbyIsCisgICAgIkJhci5CYXoiLAorICAgICJCbGFoLkJsYWguQmxhaC5CbGFoLkJsYWgiLAorICAgICJhLmIiLAorICAgICJhLmIuYy5kLmUuZi5nIiwKKyAgICAiYTAuYjEuYzIuZDMuZTQuZjUuZzYiLAorICAgICJhYmMxMjMuZm9vMjciCisgIH07CisgIGNvbnN0IGNoYXIgKmludmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICIuIiwKKyAgICAiIiwKKyAgICAiLi4iLAorICAgICIuRm9vLkJhciIsCisgICAgIi4uRm9vLkJhciIsCisgICAgIkZvby5CYXIuIiwKKyAgICAiRm9vLkJhci4uIiwKKyAgICAiRm9vIiwKKyAgICAiOWZvby5iYXIuYmF6IiwKKyAgICAiZm9vLmJhci4uYmF6IiwKKyAgICAiZm9vLmJhci4uLmJheiIsCisgICAgImZvby5iYXIuYi4uYmxhaCIsCisgICAgIjoiLAorICAgICI6MC0xIiwKKyAgICAiMTAiLAorICAgICI6MTEuMzQzMjQiLAorICAgICIwLjAuMCIsCisgICAgIjAuLjAiLAorICAgICJmb28uQmFyLiUiLAorICAgICJmb28uQmFyISEiLAorICAgICIhRm9vLmJhci5ieiIsCisgICAgImZvby4kLmJsYWgiLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX3VuaXF1ZV9uYW1lc1tdID0geworICAgICI6MCIsCisgICAgIjphIiwKKyAgICAiOiIsCisgICAgIjouYSIsCisgICAgIjouMSIsCisgICAgIjowLjEiLAorICAgICI6MDAwLjIyMjIiLAorICAgICI6LmJsYWgiLAorICAgICI6YWJjZS5mcmVlZGVza3RvcC5ibGFoIgorICB9OworICBjb25zdCBjaGFyICppbnZhbGlkX3VuaXF1ZV9uYW1lc1tdID0geworICAgIC8vIjotIiwKKyAgICAiOiEiLAorICAgIC8vIjowLTEwIiwKKyAgICAiOmJsYWguIiwKKyAgICAiOmJsYWguIiwKKyAgICAiOmJsYWguLm9yZyIsCisgICAgIjpibGFoLm9yZy4uIiwKKyAgICAiOi4uYmxhaC5vcmciLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiSGVsbG8iLAorICAgICJCYXIiLAorICAgICJmb29iYXIiLAorICAgICJfZm9vYmFyIiwKKyAgICAiZm9vODkiCisgIH07CisKKyAgY29uc3QgY2hhciAqaW52YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIjlIZWxsbyIsCisgICAgIjEwIiwKKyAgICAiMSIsCisgICAgImZvby1iYXIiLAorICAgICJibGFoLm9yZyIsCisgICAgIi5ibGFoIiwKKyAgICAiYmxhaC4iLAorICAgICJIZWxsby4iLAorICAgICIhZm9vIiwKKyAgICAiIiwKKyAgICAiICAgIiwKKyAgICAiZm9vIGJhciIKKyAgfTsKKworICBjb25zdCBjaGFyICp2YWxpZF9zaWduYXR1cmVzW10gPSB7CisgICAgIiIsCisgICAgInNzcyIsCisgICAgImkiLAorICAgICJiIgorICB9OworCisgIGNvbnN0IGNoYXIgKmludmFsaWRfc2lnbmF0dXJlc1tdID0geworICAgICIgIiwKKyAgICAibm90IGEgdmFsaWQgc2lnbmF0dXJlIiwKKyAgICAiMTIzIiwKKyAgICAiLiIsCisgICAgIigiLAorICAgICJheyhpaSlpfSIgLyogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDMgKi8KKyAgfTsKKworICAvKiBTaWduYXR1cmUgd2l0aCByZWFzb24gKi8KKworICBydW5fdmFsaWRpdHlfdGVzdHMgKHNpZ25hdHVyZV90ZXN0cywgX0RCVVNfTl9FTEVNRU5UUyAoc2lnbmF0dXJlX3Rlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24pOworCisgIC8qIFBhdGggdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9wYXRocykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX3BhdGhzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9wYXRoICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlBhdGggXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX3BhdGhzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfcGF0aHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3BhdGhzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJQYXRoIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfcGF0aHNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkIHBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIEludGVyZmFjZSB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbnRlcmZhY2UgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgaW50ZXJmYWNlIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbnRlcmZhY2UgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIEJ1cyBuYW1lIHZhbGlkYXRpb24gKGNoZWNrIHRoYXQgdmFsaWQgaW50ZXJmYWNlcyBhcmUgdmFsaWQgYnVzIG5hbWVzLAorICAgKiBhbmQgaW52YWxpZCBpbnRlcmZhY2VzIGFyZSBpbnZhbGlkIHNlcnZpY2VzIGV4Y2VwdCBpZiB0aGV5IHN0YXJ0IHdpdGggJzonKQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkJ1cyBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGJ1cyBuYW1lIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIGlmIChpbnZhbGlkX2ludGVyZmFjZXNbaV1bMF0gIT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQnVzIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgYnVzIG5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIHVuaXF1ZSBuYW1lIHZhbGlkYXRpb24gKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfdW5pcXVlX25hbWVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfdW5pcXVlX25hbWVzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQnVzIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCB1bmlxdWUgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF91bmlxdWVfbmFtZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgdW5pcXVlIG5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisKKyAgLyogRXJyb3IgbmFtZSB2YWxpZGF0aW9uIChjdXJyZW50bHkgaWRlbnRpY2FsIHRvIGludGVyZmFjZXMpCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGVycm9yIG5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgaWYgKGludmFsaWRfaW50ZXJmYWNlc1tpXVswXSAhPSAnOicpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXJyb3IgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBlcnJvciBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBNZW1iZXIgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9tZW1iZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfbWVtYmVyc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVtYmVyIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9tZW1iZXJzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIG1lbWJlciIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9tZW1iZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9tZW1iZXJzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVtYmVyIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfbWVtYmVyc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgbWVtYmVyIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBTaWduYXR1cmUgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9zaWduYXR1cmVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfc2lnbmF0dXJlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiU2lnbmF0dXJlIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9zaWduYXR1cmVzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHNpZ25hdHVyZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9zaWduYXR1cmVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9zaWduYXR1cmVzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiU2lnbmF0dXJlIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfc2lnbmF0dXJlc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgc2lnbmF0dXJlIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBWYWxpZGF0ZSBjbGFpbWVkIGxlbmd0aCBsb25nZXIgdGhhbiByZWFsIGxlbmd0aCAqLworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImFiYy5lZmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCA4KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgdG9vLWxvbmcgc3RyaW5nIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImFiYyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLCA0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgdG9vLWxvbmcgc3RyaW5nIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJzc3MiKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZSAoJnN0ciwgMCwgNCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHNpZ25hdHVyZSIpOworCisgIC8qIFZhbGlkYXRlIHN0cmluZyBleGNlZWRpbmcgbWF4IG5hbWUgbGVuZ3RoICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIHdoaWxlIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPD0gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImFiYy5kZWYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisKKyAgLyogb3ZlcmxvbmcgbWVtYmVyICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAwKTsKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA8PSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworCisgIC8qIG92ZXJsb25nIHVuaXF1ZSBuYW1lICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAwKTsKKyAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIjoiKTsKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA8PSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIEJvZHkgdmFsaWRhdGlvbjsgdGVzdCBiYXNpYyB2YWxpZGF0aW9uIG9mIHZhbGlkIGJvZGllcyBmb3IgYm90aCBlbmRpYW4gKi8KKyAgCisgIHsKKyAgICBpbnQgc2VxdWVuY2U7CisgICAgREJ1c1N0cmluZyBzaWduYXR1cmU7CisgICAgREJ1c1N0cmluZyBib2R5OworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkgfHwgIV9kYnVzX3N0cmluZ19pbml0ICgmYm9keSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgIHNlcXVlbmNlID0gMDsKKyAgICB3aGlsZSAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgICAgeworICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgICAgICAgdmFsaWRpdHkgPSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoImludmFsaWQgY29kZSAlZCBleHBlY3RlZCB2YWxpZCBvbiBzZXF1ZW5jZSAlZCBsaXR0bGUgZW5kaWFuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHksIHNlcXVlbmNlKTsKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc2lnbmF0dXJlLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZ25hdHVyZSkpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZib2R5LCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc2lnbmF0dXJlLCAwKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZib2R5LCAwKTsKKyAgICAgICAgKytzZXF1ZW5jZTsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgc2VxdWVuY2UgPSAwOworICAgIHdoaWxlIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlLCAmYm9keSkpCisgICAgICB7CisgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICAgICAgICB2YWxpZGl0eSA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKCZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiaW52YWxpZCBjb2RlICVkIGV4cGVjdGVkIHZhbGlkIG9uIHNlcXVlbmNlICVkIGJpZyBlbmRpYW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSwgc2VxdWVuY2UpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJvZHksIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzaWduYXR1cmUsIDApOworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgICArK3NlcXVlbmNlOworICAgICAgfQorCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYm9keSk7CisgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODdhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCkBAIC0wLDAgKzEsMTI1OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBWYWxpZGF0aW9uIHJvdXRpbmVzIGZvciBtYXJzaGFsZWQgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIHJhbmdlIG9mIHR5cGVfc3RyIGZyb20gdHlwZV9wb3MgdG8gdHlwZV9lbmQgaXMgYQorICogdmFsaWQgc2lnbmF0dXJlLiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zICNUUlVFLCBpdCB3aWxsIGJlIHNhZmUKKyAqIHRvIGl0ZXJhdGUgb3ZlciB0aGUgc2lnbmF0dXJlIHdpdGggYSB0eXBlcy1vbmx5ICNEQnVzVHlwZVJlYWRlci4KKyAqIFRoZSByYW5nZSBwYXNzZWQgaW4gc2hvdWxkIE5PVCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZworICogbnVsL0RCVVNfVFlQRV9JTlZBTElELgorICoKKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gdHlwZV9wb3Mgd2hlcmUgdGhlIHR5cGVjb2RlcyBzdGFydAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdHlwZWNvZGVzCisgKiBAcmV0dXJucyAjREJVU19WQUxJRCBpZiB2YWxpZCwgcmVhc29uIHdoeSBpbnZhbGlkIG90aGVyd2lzZQorICovCitEQnVzVmFsaWRpdHkKK19kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgaW50IGxhc3Q7CisgIGludCBzdHJ1Y3RfZGVwdGg7CisgIGludCBhcnJheV9kZXB0aDsKKyAgaW50IGRpY3RfZW50cnlfZGVwdGg7CisgIERCdXNWYWxpZGl0eSByZXN1bHQ7CisKKyAgaW50IGVsZW1lbnRfY291bnQ7CisgIERCdXNMaXN0ICplbGVtZW50X2NvdW50X3N0YWNrOworCisgIHJlc3VsdCA9IERCVVNfVkFMSUQ7CisgIGVsZW1lbnRfY291bnRfc3RhY2sgPSBOVUxMOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3BvcyA8IF9EQlVTX0lOVDMyX01BWCAtIGxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHR5cGVfcG9zID49IDApOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fU0lHTkFUVVJFX0xFTkdUSCkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX1RPT19MT05HOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh0eXBlX3N0ciwgdHlwZV9wb3MsIDApOworCisgIGVuZCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHR5cGVfc3RyLCB0eXBlX3BvcyArIGxlbiwgMCk7CisgIHN0cnVjdF9kZXB0aCA9IDA7CisgIGFycmF5X2RlcHRoID0gMDsKKyAgZGljdF9lbnRyeV9kZXB0aCA9IDA7CisgIGxhc3QgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKworICB3aGlsZSAocCAhPSBlbmQpCisgICAgeworICAgICAgc3dpdGNoICgqcCkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgICAgICBhcnJheV9kZXB0aCArPSAxOworICAgICAgICAgIGlmIChhcnJheV9kZXB0aCA+IERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fQVJSQVlfUkVDVVJTSU9OOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfU1RSVUNUX0JFR0lOX0NIQVI6CisgICAgICAgICAgc3RydWN0X2RlcHRoICs9IDE7CisKKyAgICAgICAgICBpZiAoc3RydWN0X2RlcHRoID4gREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZWxlbWVudF9jb3VudF9zdGFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgwKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUjoKKyAgICAgICAgICBpZiAoc3RydWN0X2RlcHRoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYXN0ID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19saXN0X3BvcF9sYXN0ICgmZWxlbWVudF9jb3VudF9zdGFjayk7CisKKyAgICAgICAgICBzdHJ1Y3RfZGVwdGggLT0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSOgorICAgICAgICAgIGlmIChsYXN0ICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICBkaWN0X2VudHJ5X2RlcHRoICs9IDE7CisKKyAgICAgICAgICBpZiAoZGljdF9lbnRyeV9kZXB0aCA+IERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT047CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVsZW1lbnRfY291bnRfc3RhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOgorICAgICAgICAgIGlmIChkaWN0X2VudHJ5X2RlcHRoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0VOREVEX0JVVF9OT1RfU1RBUlRFRDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICBkaWN0X2VudHJ5X2RlcHRoIC09IDE7CisKKyAgICAgICAgICBlbGVtZW50X2NvdW50ID0gCisgICAgICAgICAgICBfREJVU19QT0lOVEVSX1RPX0lOVCAoX2RidXNfbGlzdF9wb3BfbGFzdCAoJmVsZW1lbnRfY291bnRfc3RhY2spKTsKKworICAgICAgICAgIGlmIChlbGVtZW50X2NvdW50ICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChlbGVtZW50X2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX05PX0ZJRUxEUzsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudF9jb3VudCA9PSAxKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19PTkxZX09ORV9GSUVMRDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFM7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOiAgICAgLyogZG9lc24ndCBhcHBlYXIgaW4gc2lnbmF0dXJlcyAqLworICAgICAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOiAvKiBkaXR0byAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFOworCSAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCpwICE9IERCVVNfVFlQRV9BUlJBWSAmJiAKKyAgICAgICAgICAqcCAhPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiAmJiAKKwkgICpwICE9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpIAorICAgICAgICB7CisgICAgICAgICAgZWxlbWVudF9jb3VudCA9IAorICAgICAgICAgICAgX0RCVVNfUE9JTlRFUl9UT19JTlQgKF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZlbGVtZW50X2NvdW50X3N0YWNrKSk7CisKKyAgICAgICAgICArK2VsZW1lbnRfY291bnQ7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZWxlbWVudF9jb3VudF9zdGFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChlbGVtZW50X2NvdW50KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChhcnJheV9kZXB0aCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gREJVU19UWVBFX0FSUkFZICYmIHAgIT0gZW5kKQorICAgICAgICAgICAgeworCSAgICAgICBjb25zdCBjaGFyICpwMTsKKwkgICAgICAgcDEgPSBwICsgMTsKKyAgICAgICAgICAgICAgIGlmICgqcDEgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIgfHwKKyAgICAgICAgICAgICAgICAgICAqcDEgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFOworICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorCSAgICB7CisgICAgICAgICAgICAgIGFycmF5X2RlcHRoID0gMDsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChsYXN0ID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCEoZGJ1c190eXBlX2lzX3ZhbGlkICgqcCkgJiYgZGJ1c190eXBlX2lzX2Jhc2ljICgqcCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsYXN0ID0gKnA7CisgICAgICArK3A7CisgICAgfQorCisKKyAgaWYgKGFycmF5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChzdHJ1Y3RfZGVwdGggPiAwKQorICAgIHsKKyAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChkaWN0X2VudHJ5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIAorICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChsYXN0ICE9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworCisgIHJlc3VsdCA9IERCVVNfVkFMSUQ7CisKK291dDoKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVsZW1lbnRfY291bnRfc3RhY2spOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBub3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byB2YWxpZGF0ZSB0aGUgaGVhZGVyJ3MgdmFsdWVzLAorICogc2luY2UgdGhlIGhlYWRlciBpcyBhIHZhbGlkIGJvZHkgd2l0aCBhIHBhcnRpY3VsYXIgc2lnbmF0dXJlLgorICovCitzdGF0aWMgREJ1c1ZhbGlkaXR5Cit2YWxpZGF0ZV9ib2R5X2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgd2Fsa19yZWFkZXJfdG9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipuZXdfcCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICAvKiBUaGUgc3BlYyBhbGxvd3MgYXJyYXlzIGFuZCBzdHJ1Y3RzIHRvIGVhY2ggbmVzdCAzMiwgZm9yIHRvdGFsCisgICAqIG5lc3Rpbmcgb2YgMiozMi4gV2Ugd2FudCB0byBpbXBvc2UgdGhlIHNhbWUgbGltaXQgb24gImR5bmFtaWMiCisgICAqIHZhbHVlIG5lc3RpbmcgKG5vdCB2aXNpYmxlIGluIHRoZSBzaWduYXR1cmUpIHdoaWNoIGlzIGludHJvZHVjZWQKKyAgICogYnkgREJVU19UWVBFX1ZBUklBTlQuCisgICAqLworICBpZiAodG90YWxfZGVwdGggPiAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICogMikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWTsKKyAgICB9CisKKyAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphOworICAgICAgaW50IGFsaWdubWVudDsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICB2YWxpZGF0aW5nIHZhbHVlIG9mIHR5cGUgJXMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgJWQgcCAlcCBlbmQgJXAgJWQgcmVtYWluXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgKGludCkgKGVuZCAtIHApKTsKKyNlbmRpZgorCisgICAgICAvKiBHdWFyYW50ZWUgdGhhdCBwIGhhcyBvbmUgYnl0ZSB0byBsb29rIGF0ICovCisgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICBzd2l0Y2ggKGN1cnJlbnRfdHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgICAgICsrcDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChjdXJyZW50X3R5cGUpOworICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBhbGlnbm1lbnQpOworICAgICAgICAgIGlmIChhID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0JPT0xFQU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgdiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApOworICAgICAgICAgICAgICBpZiAoISh2ID09IDAgfHwgdiA9PSAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JPT0xFQU5fTk9UX1pFUk9fT1JfT05FOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHAgKz0gYWxpZ25tZW50OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgY2xhaW1lZF9sZW47CisKKyAgICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA0KTsKKyAgICAgICAgICAgIGlmIChhICsgNCA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYWltZWRfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAoYnl0ZV9vcmRlciwgcCk7CisgICAgICAgICAgICBwICs9IDQ7CisKKyAgICAgICAgICAgIC8qIHAgbWF5IG5vdyBiZSA9PSBlbmQgKi8KKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocCA8PSBlbmQpOworCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhcnJheV9lbGVtX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChyZWFkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKCFkYnVzX3R5cGVfaXNfdmFsaWQgKGFycmF5X2VsZW1fdHlwZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoYXJyYXlfZWxlbV90eXBlKTsKKworICAgICAgICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBhbGlnbm1lbnQpOworCisgICAgICAgICAgICAgICAgLyogYSBtYXkgbm93IGJlID09IGVuZCAqLworICAgICAgICAgICAgICAgIGlmIChhID4gZW5kKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xhaW1lZF9sZW4gPiAodW5zaWduZWQgbG9uZykgKGVuZCAtIHApKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOworCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnN0ciwgcCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgICAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfcGF0aCAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JBRF9QQVRIOworCisgICAgICAgICAgICAgICAgcCArPSBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JBRF9VVEY4X0lOX1NUUklORzsKKworICAgICAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgY2xhaW1lZF9sZW4gPiAwKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphcnJheV9lbmQ7CisgICAgICAgICAgICAgICAgaW50IGFycmF5X2VsZW1fdHlwZTsKKworICAgICAgICAgICAgICAgIGlmIChjbGFpbWVkX2xlbiA+IERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEgpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9FWENFRURTX01BWElNVU07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdGhhdCB0aGUgcmVhZGVyIGlzIHR5cGVzIG9ubHksIHNvIHdlIGNhbid0CisgICAgICAgICAgICAgICAgICogdXNlIGl0IHRvIGl0ZXJhdGUgb3ZlciBlbGVtZW50cy4gSXQgc3RheXMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgKiBmb3IgYWxsIGVsZW1lbnRzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgICAgICBhcnJheV9lbmQgPSBwICsgY2xhaW1lZF9sZW47CisKKyAgICAgICAgICAgICAgICBhcnJheV9lbGVtX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChyZWFkZXIpOworCisgICAgICAgICAgICAgICAgLyogYXZvaWQgcmVjdXJzaXZlIGNhbGwgdG8gdmFsaWRhdGVfYm9keV9oZWxwZXIgaWYgdGhpcyBpcyBhbiBhcnJheQorICAgICAgICAgICAgICAgICAqIG9mIGZpeGVkLXNpemUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgKi8gCisgICAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoYXJyYXlfZWxlbV90eXBlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYm9vbHMgbmVlZCB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIHRoZXkgY2FuCisgICAgICAgICAgICAgICAgICAgICAqIGhhdmUgYW4gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5X2VsZW1fdHlwZSA9PSBEQlVTX1RZUEVfQk9PTEVBTikKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHY7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGFycmF5X2VsZW1fdHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgYXJyYXlfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsIHApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodiA9PSAwIHx8IHYgPT0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JPT0xFQU5fTk9UX1pFUk9fT1JfT05FOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBhbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBhcnJheV9lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocCA8IGFycmF5X2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmc3ViLCBieXRlX29yZGVyLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2RlcHRoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgJnApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9JTkNPUlJFQ1Q7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgbnVsIHRlcm1pbmF0aW9uICovCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwID09IGVuZCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1NUUklOR19NSVNTSU5HX05VTDsKKyAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgY2xhaW1lZF9sZW47CisgICAgICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICAgICAgICAgICAgY2xhaW1lZF9sZW4gPSAqcDsKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgLyogMSBpcyBmb3IgbnVsIHRlcm1pbmF0aW9uICovCisgICAgICAgICAgICBpZiAoY2xhaW1lZF9sZW4gKyAxID4gKHVuc2lnbmVkIGxvbmcpIChlbmQgLSBwKSkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFM7CisKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnN0ciwgcCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgICAgdmFsaWRpdHkgPQorICAgICAgICAgICAgICBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKTsKKworICAgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eTsKKworICAgICAgICAgICAgcCArPSBjbGFpbWVkX2xlbjsKKworICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwIDwgZW5kKTsKKyAgICAgICAgICAgIGlmICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTUlTU0lOR19OVUw7CisKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInAgPSAlcCBlbmQgPSAlcCBjbGFpbWVkX2xlbiAldVxuIiwgcCwgZW5kLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogMSBieXRlIHNpZyBsZW4sIHNpZyB0eXBlY29kZXMsIGFsaWduIHRvCisgICAgICAgICAgICAgKiBjb250YWluZWQtdHlwZS1ib3VuZGFyeSwgdmFsdWVzLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIEluIGFkZGl0aW9uIHRvIG5vcm1hbCBzaWduYXR1cmUgdmFsaWRhdGlvbiwgd2UgbmVlZCB0byBiZSBzdXJlCisgICAgICAgICAgICAgKiB0aGUgc2lnbmF0dXJlIGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgKHBvc3NpYmx5IGNvbnRhaW5lcikgdHlwZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgIERCdXNTdHJpbmcgc2lnOworICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworICAgICAgICAgICAgaW50IGNvbnRhaW5lZF9hbGlnbm1lbnQ7CisgICAgICAgICAgICBpbnQgY29udGFpbmVkX3R5cGU7CisgICAgICAgICAgICBEQnVzVmFsaWRpdHkgcmVhc29uOworCisgICAgICAgICAgICBjbGFpbWVkX2xlbiA9ICpwOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICAvKiArIDEgZm9yIG51bCAqLworICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuICsgMSA+ICh1bnNpZ25lZCBsb25nKSAoZW5kIC0gcCkpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFM7CisKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnNpZywgcCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgICAgcmVhc29uID0gX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uICgmc2lnLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnKSk7CisgICAgICAgICAgICBpZiAoIShyZWFzb24gPT0gREJVU19WQUxJRCkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IpCisgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhc29uOworICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0JBRDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwICs9IGNsYWltZWRfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTUlTU0lOR19OVUw7CisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKCZzaWcsIDApOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lZF90eXBlID09IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0VNUFRZOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChjb250YWluZWRfdHlwZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBjb250YWluZWRfYWxpZ25tZW50KTsKKyAgICAgICAgICAgIGlmIChhID4gZW5kKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5ICgmc3ViLCAmc2lnLCAwKTsKKworICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZzdWIsIGJ5dGVfb3JkZXIsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZGVwdGggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgZW5kLCAmcCk7CisgICAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkaXR5OworCisgICAgICAgICAgICBpZiAoX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1YikpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfU1BFQ0lGSUVTX01VTFRJUExFX1ZBTFVFUzsKKworICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA4KTsKKyAgICAgICAgICAgIGlmIChhID4gZW5kKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGF0ZV9ib2R5X2hlbHBlciAoJnN1YiwgYnl0ZV9vcmRlciwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2RlcHRoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgJnApOworICAgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHR5cGVjb2RlIGluIHN1cHBvc2VkbHktdmFsaWRhdGVkIHNpZ25hdHVyZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgiICAgdmFsaWRhdGVkIHZhbHVlIG9mIHR5cGUgJXMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgJWQgcCAlcCBlbmQgJXAgJWQgcmVtYWluXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgKGludCkgKGVuZCAtIHApKTsKKyNlbmRpZgorCisgICAgICBpZiAocCA+IGVuZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJub3QgZW5vdWdoIGRhdGEhISEgcCA9ICVwIGVuZCA9ICVwIGVuZC1wID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcCwgZW5kLCAoaW50KSAoZW5kIC0gcCkpOworICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICB9CisKKyAgICAgIGlmICh3YWxrX3JlYWRlcl90b19lbmQpCisgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3ApCisgICAgKm5ld19wID0gcDsKKworICByZXR1cm4gREJVU19WQUxJRDsKK30KKworLyoqCisgKiBWZXJpZmllcyB0aGF0IHRoZSByYW5nZSBvZiB2YWx1ZV9zdHIgZnJvbSB2YWx1ZV9wb3MgdG8gdmFsdWVfZW5kIGlzCisgKiBhIGxlZ2l0aW1hdGUgdmFsdWUgb2YgdHlwZSBleHBlY3RlZF9zaWduYXR1cmUuICBJZiB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zICNUUlVFLCBpdCB3aWxsIGJlIHNhZmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSB2YWx1ZXMgd2l0aAorICogI0RCdXNUeXBlUmVhZGVyLiBUaGUgc2lnbmF0dXJlIGlzIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSB2YWxpZC4KKyAqCisgKiBJZiBieXRlc19yZW1haW5pbmcgaXMgbm90ICNOVUxMLCB0aGVuIGxlZnRvdmVyIGJ5dGVzIHdpbGwgYmUgc3RvcmVkCisgKiB0aGVyZSBhbmQgI0RCVVNfVkFMSUQgcmV0dXJuZWQuIElmIGl0IGlzICNOVUxMLCB0aGVuCisgKiAjREJVU19JTlZBTElEX1RPT19NVUNIX0RBVEEgd2lsbCBiZSByZXR1cm5lZCBpZiBieXRlcyBhcmUgbGVmdAorICogb3Zlci4KKyAqCisgKiBAcGFyYW0gZXhwZWN0ZWRfc2lnbmF0dXJlIHRoZSBleHBlY3RlZCB0eXBlcyBpbiB0aGUgdmFsdWVfc3RyCisgKiBAcGFyYW0gZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0IHdoZXJlIGluIGV4cGVjdGVkX3NpZ25hdHVyZSBpcyB0aGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIGJ5dGVzX3JlbWFpbmluZyBwbGFjZSB0byBzdG9yZSBsZWZ0b3ZlciBieXRlcworICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJvZHkKKyAqIEBwYXJhbSB2YWx1ZV9wb3Mgd2hlcmUgdGhlIHZhbHVlcyBzdGFydAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdmFsdWVzIGFmdGVyIHZhbHVlX3BvcworICogQHJldHVybnMgI0RCVVNfVkFMSUQgaWYgdmFsaWQsIHJlYXNvbiB3aHkgaW52YWxpZCBvdGhlcndpc2UKKyAqLworREJ1c1ZhbGlkaXR5CitfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uIChjb25zdCBEQnVzU3RyaW5nICpleHBlY3RlZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBleHBlY3RlZF9zaWduYXR1cmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqYnl0ZXNfcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHZhbHVlX3BvcyA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlX3N0cikgLSBsZW4pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ2YWxpZGF0aW5nIGJvZHkgZnJvbSBwb3MgJWQgbGVuICVkIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MsIGxlbiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoZXhwZWN0ZWRfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9zaWduYXR1cmUsIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCk7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHZhbHVlX3N0ciwgdmFsdWVfcG9zLCBsZW4pOworICBlbmQgPSBwICsgbGVuOworCisgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZyZWFkZXIsIGJ5dGVfb3JkZXIsIFRSVUUsIDAsIHAsIGVuZCwgJnApOworICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICByZXR1cm4gdmFsaWRpdHk7CisgIAorICBpZiAoYnl0ZXNfcmVtYWluaW5nKQorICAgIHsKKyAgICAgICpieXRlc19yZW1haW5pbmcgPSBlbmQgLSBwOworICAgICAgcmV0dXJuIERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChwIDwgZW5kKQorICAgIHJldHVybiBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocCA9PSBlbmQpOworICAgICAgcmV0dXJuIERCVVNfVkFMSUQ7CisgICAgfQorfQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgKiBpbiBhIG5hbWUuCisgKi8KKyNkZWZpbmUgVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgIFwKKyAgKCAoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID09ICdfJykgKQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyBhIHNlY29uZCBvciBsYXRlcgorICogY2hhcmFjdGVyIGluIGEgbmFtZQorICovCisjZGVmaW5lIFZBTElEX05BTUVfQ0hBUkFDVEVSKGMpICAgICAgICAgICAgICAgICBcCisgICggKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpICkKKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIG9iamVjdCBwYXRoCisgKiBuYW1lIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gUGFydCBvZiB0aGUgdmFsaWRhdGlvbiBlbnN1cmVzIHRoYXQKKyAqIHRoZSBvYmplY3QgcGF0aCBjb250YWlucyBvbmx5IEFTQ0lJLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAdG9kbyBjaGFuZ2Ugc3BlYyB0byBkaXNhbGxvdyBtb3JlIHRoaW5ncywgc3VjaCBhcyBzcGFjZXMgaW4gdGhlCisgKiBwYXRoIG5hbWUKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhc3Rfc2xhc2g7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworCisgIGlmICgqcyAhPSAnLycpCisgICAgcmV0dXJuIEZBTFNFOworICBsYXN0X3NsYXNoID0gczsKKyAgKytzOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKnMgPT0gJy8nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChzIC0gbGFzdF9zbGFzaCkgPCAyKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvKiBubyBlbXB0eSBwYXRoIGNvbXBvbmVudHMgYWxsb3dlZCAqLworCisgICAgICAgICAgbGFzdF9zbGFzaCA9IHM7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICsrczsKKyAgICB9CisKKyAgaWYgKChlbmQgLSBsYXN0X3NsYXNoKSA8IDIgJiYKKyAgICAgIGxlbiA+IDEpCisgICAgcmV0dXJuIEZBTFNFOyAvKiB0cmFpbGluZyBzbGFzaCBub3QgYWxsb3dlZCB1bmxlc3MgdGhlIHN0cmluZyBpcyAiLyIgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworY29uc3QgY2hhciAqCitfZGJ1c192YWxpZGl0eV90b19lcnJvcl9tZXNzYWdlIChEQnVzVmFsaWRpdHkgdmFsaWRpdHkpCit7CisgIHN3aXRjaCAodmFsaWRpdHkpCisgICAgeworICAgIGNhc2UgREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiT3V0IG9mIG1lbW9yeSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHJlYXNvbiI7CisgICAgY2FzZSBEQlVTX1ZBTElEX0JVVF9JTkNPTVBMRVRFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYWxpZCBidXQgaW5jb21wbGV0ZSI7CisgICAgY2FzZSBEQlVTX1ZBTElESVRZX1VOS05PV046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYWxpZGl0eSB1bmtub3duIjsKKyAgICBjYXNlIERCVVNfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZhbGlkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gdHlwZWNvZGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFOiAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBhcnJheSBlbGVtZW50IHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORzogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiU2lnbmF0dXJlIGlzIHRvbyBsb25nIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTjogICAgICAgICAgICByZXR1cm4gIkV4Y2VlZGVkIG1heGltdW0gYXJyYXkgcmVjdXJzaW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT046ICAgICAgICAgICByZXR1cm4gIkV4Y2VlZGVkIG1heGltdW0gc3RydWN0IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU1RSVUNUX0VOREVEX0JVVF9OT1RfU1RBUlRFRDogICAgICAgICAgICAgICAgcmV0dXJuICJTdHJ1Y3QgZW5kZWQgYnV0IG5vdCBzdGFydGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEOiAgICAgICAgICAgICAgICByZXR1cm4gIlN0cnVjdCBzdGFydGVkIGJ1dCBub3QgZW5kZWQiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiU3RydWN0IGhhcyBubyBmaWVsZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiQWxpZ25tZW50IHBhZGRpbmcgbm90IG51bGwiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JPT0xFQU5fTk9UX1pFUk9fT1JfT05FOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQm9vbGVhbiBpcyBub3QgemVybyBvciBvbmUiOworICAgIGNhc2UgREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTm90IGVub3VnaCBkYXRhIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRvbyBtdWNoIGRhdGEiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9CWVRFX09SREVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIGJ5dGUgb3JkZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9QUk9UT0NPTF9WRVJTSU9OOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIHZlcnNpb24iOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIG1lc3NhZ2UgdHlwZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX1NFUklBTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgc2VyaWFsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9JTlNBTkVfRklFTERTX0FSUkFZX0xFTkdUSDogICAgICAgICAgICAgICAgICByZXR1cm4gIkluc2FuZSBmaWVsZHMgYXJyYXkgbGVuZ3RoIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEg6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkluc2FuZSBib2R5IGxlbmd0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUVTU0FHRV9UT09fTE9ORzogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNZXNzYWdlIHRvbyBsb25nIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQ09ERTogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkhlYWRlciBmaWVsZCBjb2RlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEU6ICAgICAgICAgICAgICAgICByZXR1cm4gIkhlYWRlciBmaWVsZCBoYXMgd3JvbmcgdHlwZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9JTlRFUkZBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVc2VzIGxvY2FsIGludGVyZmFjZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVc2VzIGxvY2FsIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFOiAgICAgICAgICAgICAgICAgIHJldHVybiAiSGVhZGVyIGZpZWxkIGFwcGVhcnMgdHdpY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9ERVNUSU5BVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIGRlc3RpbmF0aW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9NRU1CRVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIG1lbWJlciI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX0VSUk9SX05BTUU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgZXJyb3IgbmFtZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX1NFTkRFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgc2VuZGVyIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX1BBVEg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgcGF0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19JTlRFUkZBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIGludGVyZmFjZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19NRU1CRVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIG1lbWJlciI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19FUlJPUl9OQU1FOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIGVycm9yIG5hbWUiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfUkVQTFlfU0VSSUFMOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyByZXBseSBzZXJpYWwiOworICAgIGNhc2UgREJVU19JTlZBTElEX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTGVuZ3RoIG91dCBvZiBib3VuZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9FWENFRURTX01BWElNVU06ICAgICAgICAgICAgICAgIHJldHVybiAiQXJyYXkgbGVuZ3RoIGV4Y2VlZHMgbWF4aW11bSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX1BBVEg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgcGF0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOiAgICAgICAgICAgICAgcmV0dXJuICJTaWduYXR1cmUgbGVuZ3RoIG91dCBvZiBib3VuZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9VVEY4X0lOX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHV0ZjggaW4gc3RyaW5nIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfSU5DT1JSRUNUOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFycmF5IGxlbmd0aCBpbmNvcnJlY3QiOworICAgIGNhc2UgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOiAgICAgIHJldHVybiAiVmFyaWFudCBzaWduYXR1cmUgbGVuZ3RoIG91dCBvZiBib3VuZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0JBRDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFyaWFudCBzaWduYXR1cmUgYmFkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9FTVBUWTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGVtcHR5IjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9TUEVDSUZJRVNfTVVMVElQTEVfVkFMVUVTOiByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIHNwZWNpZmllcyBtdWx0aXBsZSB2YWx1ZXMiOworICAgIGNhc2UgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMOiAgICAgICAgICAgICAgIHJldHVybiAiVmFyaWFudCBzaWduYXR1cmUgbWlzc2luZyBudWwiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NUUklOR19NSVNTSU5HX05VTDogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiU3RyaW5nIG1pc3NpbmcgbnVsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTUlTU0lOR19OVUw6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNpZ25hdHVyZSBtaXNzaW5nIG51bCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTjogICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIGRpY3QgZW50cnkgcmVjdXJzaW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0VOREVEX0JVVF9OT1RfU1RBUlRFRDogICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgZW5kZWQgYnV0IG5vdCBzdGFydGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX1NUQVJURURfQlVUX05PVF9FTkRFRDogICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgc3RhcnRlZCBidXQgbm90IGVuZGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFM6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgaGFzIG5vIGZpZWxkcyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfT05MWV9PTkVfRklFTEQ6ICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGhhcyBvbmx5IG9uZSBmaWVsZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfVE9PX01BTllfRklFTERTOiAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGhhcyB0b28gbWFueSBmaWVsZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWTogICAgICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBub3QgaW5zaWRlIGFycmF5IjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0tFWV9NVVNUX0JFX0JBU0lDX1RZUEU6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRpY3Qga2V5IG11c3QgYmUgYmFzaWMgdHlwZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTkVTVEVEX1RPT19ERUVQTFk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYXJpYW50cyBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgYSBodWdlbHkgcmVjdXJzaXZlIHRyZWUgb2YgdmFsdWVzIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJJbnZhbGlkIjsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBpbnRlcmZhY2UgbmFtZQorICogaW4gdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uIGFuZCBhbgorICogQVNDSUkgc3Vic2V0LCBzZWUgdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaWZhY2U7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhc3RfZG90OworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBsYXN0X2RvdCA9IE5VTEw7CisgIGlmYWNlID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpICsgc3RhcnQ7CisgIGVuZCA9IGlmYWNlICsgbGVuOworICBzID0gaWZhY2U7CisKKyAgLyogY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBmaXJzdCBjaGFyIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lCisgICAqIGluIHRoZSBsb29wLiBOb3RlIHdlIGtub3cgbGVuID4gMAorICAgKi8KKyAgaWYgKF9EQlVTX1VOTElLRUxZICgqcyA9PSAnLicpKSAvKiBkaXNhbGxvdyBzdGFydGluZyB3aXRoIGEgLiAqLworICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID09ICcuJykKKyAgICAgICAgeworICAgICAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoKHMgKyAxKSA9PSBlbmQpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUiAoKihzICsgMSkpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBsYXN0X2RvdCA9IHM7CisgICAgICAgICAgKytzOyAvKiB3ZSBqdXN0IHZhbGlkYXRlZCB0aGUgbmV4dCBjaGFyLCBzbyBza2lwIHR3byAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICsrczsKKyAgICB9CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChsYXN0X2RvdCA9PSBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBtZW1iZXIgbmFtZQorICogaW4gdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uLCBldGMuLAorICogc2VlIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX21lbWJlciAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1lbWJlcjsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVtYmVyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpICsgc3RhcnQ7CisgIGVuZCA9IG1lbWJlciArIGxlbjsKKyAgcyA9IG1lbWJlcjsKKworICAvKiBjaGVjayBzcGVjaWFsIGNhc2VzIG9mIGZpcnN0IGNoYXIgc28gaXQgZG9lc24ndCBoYXZlIHRvIGJlIGRvbmUKKyAgICogaW4gdGhlIGxvb3AuIE5vdGUgd2Uga25vdyBsZW4gPiAwCisgICAqLworCisgIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgKytzOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgZXJyb3IgbmFtZQorICogaW4gdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uLCBldGMuLAorICogc2VlIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICAvKiBTYW1lIHJlc3RyaWN0aW9ucyBhcyBpbnRlcmZhY2UgbmFtZSBhdCB0aGUgbW9tZW50ICovCisgIHJldHVybiBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKHN0ciwgc3RhcnQsIGxlbik7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIHdldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqIGluIGEgYnVzIG5hbWUuCisgKi8KKyNkZWZpbmUgVkFMSURfSU5JVElBTF9CVVNfTkFNRV9DSEFSQUNURVIoYykgICAgICAgICBcCisgICggKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpIHx8ICgoYykgPT0gJy0nKSkKKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgYSBzZWNvbmQgb3IgbGF0ZXIKKyAqIGNoYXJhY3RlciBpbiBhIGJ1cyBuYW1lCisgKi8KKyNkZWZpbmUgVkFMSURfQlVTX05BTUVfQ0hBUkFDVEVSKGMpICAgICAgICAgICAgICAgICBcCisgICggKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpIHx8ICgoYykgPT0gJy0nKSkKKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9idXNfbmFtZV9mdWxsIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICBpc19uYW1lc3BhY2UpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaWZhY2U7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhc3RfZG90OworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBsYXN0X2RvdCA9IE5VTEw7CisgIGlmYWNlID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpICsgc3RhcnQ7CisgIGVuZCA9IGlmYWNlICsgbGVuOworICBzID0gaWZhY2U7CisKKyAgLyogY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBmaXJzdCBjaGFyIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lCisgICAqIGluIHRoZSBsb29wLiBOb3RlIHdlIGtub3cgbGVuID4gMAorICAgKi8KKyAgaWYgKCpzID09ICc6JykKKyAgeworICAgIC8qIHVuaXF1ZSBuYW1lICovCisgICAgKytzOworICAgIHdoaWxlIChzICE9IGVuZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCpzID09ICcuJykKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfQlVTX05BTUVfQ0hBUkFDVEVSICgqKHMgKyAxKSkpKQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICArK3M7IC8qIHdlIGp1c3QgdmFsaWRhdGVkIHRoZSBuZXh0IGNoYXIsIHNvIHNraXAgdHdvICovCisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgICsrczsKKyAgICAgIH0KKworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICgqcyA9PSAnLicpKSAvKiBkaXNhbGxvdyBzdGFydGluZyB3aXRoIGEgLiAqLworICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfQlVTX05BTUVfQ0hBUkFDVEVSICgqKHMgKyAxKSkpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGxhc3RfZG90ID0gczsKKyAgICAgICAgICArK3M7IC8qIHdlIGp1c3QgdmFsaWRhdGVkIHRoZSBuZXh0IGNoYXIsIHNvIHNraXAgdHdvICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfQlVTX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICsrczsKKyAgICB9CisKKyAgaWYgKCFpc19uYW1lc3BhY2UgJiYgX0RCVVNfVU5MSUtFTFkgKGxhc3RfZG90ID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGJ1cyBuYW1lIGluCisgKiB0aGUgRC1CdXMgcHJvdG9jb2wuIFRoaXMgaW5jbHVkZXMgYSBsZW5ndGggcmVzdHJpY3Rpb24sIGV0Yy4sIHNlZQorICogdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIHJldHVybiBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZV9mdWxsIChzdHIsIHN0YXJ0LCBsZW4sIEZBTFNFKTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHByZWZpeCBvZiBhIHZhbGlkIGJ1cyBuYW1lIGluCisgKiB0aGUgRC1CdXMgcHJvdG9jb2wuIFVubGlrZSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSgpLCB0aGlzIGFjY2VwdHMgc3RyaW5ncworICogd2l0aCBvbmx5IG9uZSBwZXJpb2Qtc2VwYXJhdGVkIGNvbXBvbmVudC4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgcmV0dXJuIF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lX2Z1bGwgKHN0ciwgc3RhcnQsIGxlbiwgVFJVRSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBtZXNzYWdlIHR5cGUKKyAqIHNpZ25hdHVyZSBpbiB0aGUgRC1CdXMgcHJvdG9jb2wuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgc2lnbmF0dXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmUgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uIChzdHIsIHN0YXJ0LCBsZW4pID09IERCVVNfVkFMSUQ7Cit9CisKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHBhdGgpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKGludGVyZmFjZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0sobWVtYmVyKQorLyoqIGRlZmluZSBfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0soZXJyb3JfbmFtZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhidXNfbmFtZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfc2lnbmF0dXJlKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0soc2lnbmF0dXJlKQorLyoqIGRlZmluZSBfZGJ1c19jaGVja19pc192YWxpZF91dGY4KCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0sodXRmOCkKKworLyoqIEB9ICovCisKKy8qIHRlc3RzIGluIGRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmggYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjAyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oCkBAIC0wLDAgKzEsMjE1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC12YWxpZGF0ZS5oICBWYWxpZGF0aW9uIHJvdXRpbmVzIGZvciBtYXJzaGFsZWQgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfVkFMSURBVEVfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfVkFMSURBVEVfSAorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoaXMgaXMgdXNlZCByYXRoZXIgdGhhbiBhIGJvb2wgZm9yIGhpZ2ggdmlzaWJpbGl0eQorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFksCisgIERCVVNfVkFMSURBVElPTl9NT0RFX0RBVEFfSVNfVU5UUlVTVEVECit9IERCdXNWYWxpZGF0aW9uTW9kZTsKKworLyoqCisgKiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGluIHVuaXQgdGVzdGluZywgc28gd2UgY2FuIHZlcmlmeSB0aGF0IGVhY2gKKyAqIGludmFsaWQgbWVzc2FnZSBpcyBpbnZhbGlkIGZvciB0aGUgZXhwZWN0ZWQgcmVhc29ucy4gVGh1cyB3ZSByZWFsbHkKKyAqIHdhbnQgYSBkaXN0aW5jdCBlbnVtIHZhbHVlIGZvciBldmVyeSBjb2RlcGF0aCBsZWF2aW5nIHRoZSB2YWxpZGF0b3IKKyAqIGZ1bmN0aW9ucy4gRW51bSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBtYW51YWxseSBmb3IgZWFzZSBvZiBkZWJ1Z2dpbmcKKyAqIChzbyB5b3UgY2FuIHNlZSB0aGUgZW51bSB2YWx1ZSBnaXZlbiBhIHByaW50ZikKKyAqLwordHlwZWRlZiBlbnVtCit7CisjZGVmaW5lIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UIDQKKyAgREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUiA9IC00LCAvKio8IGNhbid0IGRldGVybWluZSB2YWxpZGl0eSBkdWUgdG8gT09NICovCisgIERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT04gPSAtMywKKyAgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSA9IC0yLAorICBEQlVTX1ZBTElESVRZX1VOS05PV04gPSAtMSwKKyAgREJVU19WQUxJRCA9IDAsIC8qKjwgdGhlIGRhdGEgaXMgdmFsaWQgKi8KKyAgREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREUgPSAxLAorICBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgPSAyLAorICBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX1RPT19MT05HID0gMywgLyogdGhpcyBvbmUgaXMgaW1wb3NzaWJsZSByaWdodCBub3cgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHlvdSBjYW4ndCBwdXQgYSB0b28tbG9uZyB2YWx1ZSBpbiBhIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT04gPSA0LAorICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OID0gNSwKKyAgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQgPSA2LAorICBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCA9IDcsCisgIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyA9IDgsCisgIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMID0gOSwKKyAgREJVU19JTlZBTElEX0JPT0xFQU5fTk9UX1pFUk9fT1JfT05FID0gMTAsCisgIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEEgPSAxMSwKKyAgREJVU19JTlZBTElEX1RPT19NVUNIX0RBVEEgPSAxMiwgLyoqPCB0cmFpbGluZyBqdW5rIG1ha2VzIGl0IGludmFsaWQgKi8KKyAgREJVU19JTlZBTElEX0JBRF9CWVRFX09SREVSID0gMTMsCisgIERCVVNfSU5WQUxJRF9CQURfUFJPVE9DT0xfVkVSU0lPTiA9IDE0LAorICBEQlVTX0lOVkFMSURfQkFEX01FU1NBR0VfVFlQRSA9IDE1LAorICBEQlVTX0lOVkFMSURfQkFEX1NFUklBTCA9IDE2LAorICBEQlVTX0lOVkFMSURfSU5TQU5FX0ZJRUxEU19BUlJBWV9MRU5HVEggPSAxNywKKyAgREJVU19JTlZBTElEX0lOU0FORV9CT0RZX0xFTkdUSCA9IDE4LAorICBEQlVTX0lOVkFMSURfTUVTU0FHRV9UT09fTE9ORyA9IDE5LAorICBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREUgPSAyMCwKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9IQVNfV1JPTkdfVFlQRSA9IDIxLAorICBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9JTlRFUkZBQ0UgPSAyMiwKKyAgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSCA9IDIzLAorICBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0FQUEVBUlNfVFdJQ0UgPSAyNCwKKyAgREJVU19JTlZBTElEX0JBRF9ERVNUSU5BVElPTiA9IDI1LAorICBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRSA9IDI2LAorICBEQlVTX0lOVkFMSURfQkFEX01FTUJFUiA9IDI3LAorICBEQlVTX0lOVkFMSURfQkFEX0VSUk9SX05BTUUgPSAyOCwKKyAgREJVU19JTlZBTElEX0JBRF9TRU5ERVIgPSAyOSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfUEFUSCA9IDMwLAorICBEQlVTX0lOVkFMSURfTUlTU0lOR19JTlRFUkZBQ0UgPSAzMSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfTUVNQkVSID0gMzIsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX0VSUk9SX05BTUUgPSAzMywKKyAgREJVU19JTlZBTElEX01JU1NJTkdfUkVQTFlfU0VSSUFMID0gMzQsCisgIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUyA9IDM1LAorICBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0VYQ0VFRFNfTUFYSU1VTSA9IDM2LAorICBEQlVTX0lOVkFMSURfQkFEX1BBVEggPSAzNywKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUyA9IDM4LAorICBEQlVTX0lOVkFMSURfQkFEX1VURjhfSU5fU1RSSU5HID0gMzksCisgIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfSU5DT1JSRUNUID0gNDAsCisgIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUyA9IDQxLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfQkFEID0gNDIsCisgIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9FTVBUWSA9IDQzLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfU1BFQ0lGSUVTX01VTFRJUExFX1ZBTFVFUyA9IDQ0LAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTUlTU0lOR19OVUwgPSA0NSwKKyAgREJVU19JTlZBTElEX1NUUklOR19NSVNTSU5HX05VTCA9IDQ2LAorICBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMID0gNDcsCisgIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0RJQ1RfRU5UUllfUkVDVVJTSU9OID0gNDgsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0VOREVEX0JVVF9OT1RfU1RBUlRFRCA9IDQ5LAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgPSA1MCwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX05PX0ZJRUxEUyA9IDUxLAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfT05MWV9PTkVfRklFTEQgPSA1MiwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUyA9IDUzLAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9OT1RfSU5TSURFX0FSUkFZID0gNTQsCisgIERCVVNfSU5WQUxJRF9ESUNUX0tFWV9NVVNUX0JFX0JBU0lDX1RZUEUgPSA1NSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfVU5JWF9GRFMgPSA1NiwKKyAgREJVU19JTlZBTElEX05FU1RFRF9UT09fREVFUExZID0gNTcsCisgIERCVVNfVkFMSURJVFlfTEFTVAorfSBEQnVzVmFsaWRpdHk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNWYWxpZGl0eSBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1ZhbGlkaXR5IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gICAgICAoY29uc3QgREJ1c1N0cmluZyAqZXhwZWN0ZWRfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmJ5dGVzX3JlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CisKK2NvbnN0IGNoYXIgKl9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKERCdXNWYWxpZGl0eSB2YWxpZGl0eSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX3BhdGggICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX21lbWJlciAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lc3BhY2UgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZSAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKKy8qIGp1c3QgdG8gaGF2ZSBhIG5hbWUgY29uc2lzdGVudCB3aXRoIHRoZSBhYm92ZTogKi8KKyNkZWZpbmUgX2RidXNfdmFsaWRhdGVfdXRmOChzLGIsZSkgX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKHMsIGIsIGUpCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisKKy8qIEJlIHN1cmUgdGhleSBkb24ndCBleGlzdCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlbSBvdXRzaWRlIG9mIGNoZWNrcworICogYW5kIHNvIHdlIHdhbnQgdGhlIGNvbXBpbGUgZmFpbHVyZS4KKyAqLworI2RlZmluZSBERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyh3aGF0KQorI2RlZmluZSBERUZJTkVfREJVU19OQU1FX0NIRUNLKHdoYXQpCisKKyNlbHNlIC8qICFEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKy8qKiBBIG5hbWUgY2hlY2sgaXMgdXNlZCBpbiBfZGJ1c19yZXR1cm5faWZfZmFpbCgpLCBpdCdzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEuIHVzZSBfZGJ1c192YWxpZGF0ZV93aGF0ZXZlciBmb3IgdGhhdC4KKyAqLworI2RlZmluZSBERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyh3aGF0KSBcCitkYnVzX2Jvb2xfdCBfZGJ1c19jaGVja19pc192YWxpZF8jI3doYXQgKGNvbnN0IGNoYXIgKm5hbWUpCisKKy8qKiBEZWZpbmUgYSBuYW1lIGNoZWNrIHRvIGJlIHVzZWQgaW4gX2RidXNfcmV0dXJuX2lmX2ZhaWwoKSBzdGF0ZW1lbnRzLgorICovCisjZGVmaW5lIERFRklORV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitfZGJ1c19jaGVja19pc192YWxpZF8jI3doYXQgKGNvbnN0IGNoYXIgKm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERCdXNTdHJpbmcgc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChuYW1lID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBfZGJ1c192YWxpZGF0ZV8jI3doYXQgKCZzdHIsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7ICAgICAgICBcCit9CisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhwYXRoKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhpbnRlcmZhY2UpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKG1lbWJlcik7CisvKiogZGVmaW5lcyBfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKGVycm9yX25hbWUpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0soYnVzX25hbWUpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfc2lnbmF0dXJlKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKHNpZ25hdHVyZSk7CisvKiogZGVmaW5lcyBfZGJ1c19jaGVja19pc192YWxpZF91dGY4KCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKHV0ZjgpOworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIERCVVNfTUFSU0hBTF9WQUxJREFURV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVtb3J5LmMgYi9kYnVzL2RidXMtbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNWNiMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZW1vcnkuYwpAQCAtMCwwICsxLDk1OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbW9yeS5jICBELUJ1cyBtZW1vcnkgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtb3J5IE1lbW9yeSBBbGxvY2F0aW9uCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIGRidXNfbWFsbG9jKCksIGRidXNfZnJlZSgpLCBldGMuCisgKgorICogRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byBhbGxvY2F0aW5nIGFuZCByZWxlYXNpbmcKKyAqIGJsb2NrcyBvZiBtZW1vcnkuCisgKgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZW1vcnlJbnRlcm5hbHMgTWVtb3J5IGFsbG9jYXRpb24gaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBpbnRlcm5hbHMgb2YgZGJ1c19tYWxsb2MoKSBldGMuCisgKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyByZWxhdGVkIHRvIGFsbG9jYXRpbmcgYW5kIHJlbGVhc2luZyBibG9ja3MKKyAqIG9mIG1lbW9yeS4KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnkKKyAqCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBkYnVzX25ldworICoKKyAqIFNhZmUgbWFjcm8gZm9yIHVzaW5nIGRidXNfbWFsbG9jKCkuIEFjY2VwdHMgdGhlIHR5cGUKKyAqIHRvIGFsbG9jYXRlIGFuZCB0aGUgbnVtYmVyIG9mIHR5cGUgaW5zdGFuY2VzIHRvCisgKiBhbGxvY2F0ZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgbWVtb3J5IGJsb2NrCisgKiBjYXN0IHRvIHRoZSBkZXNpcmVkIHR5cGUsIGluc3RlYWQgb2YgYXMgYSB2b2lkKi4KKyAqCisgKiBAcGFyYW0gdHlwZSB0eXBlIG5hbWUgdG8gYWxsb2NhdGUKKyAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgaW5zdGFuY2VzIGluIHRoZSBhbGxvY2F0ZWQgYXJyYXkKKyAqIEByZXR1cm5zIHRoZSBuZXcgbWVtb3J5IGJsb2NrIG9yICNOVUxMIG9uIGZhaWx1cmUKKyAqLworCisvKioKKyAqIEBkZWYgZGJ1c19uZXcwCisgKgorICogU2FmZSBtYWNybyBmb3IgdXNpbmcgZGJ1c19tYWxsb2MwKCkuIEFjY2VwdHMgdGhlIHR5cGUKKyAqIHRvIGFsbG9jYXRlIGFuZCB0aGUgbnVtYmVyIG9mIHR5cGUgaW5zdGFuY2VzIHRvCisgKiBhbGxvY2F0ZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgbWVtb3J5IGJsb2NrCisgKiBjYXN0IHRvIHRoZSBkZXNpcmVkIHR5cGUsIGluc3RlYWQgb2YgYXMgYSB2b2lkKi4KKyAqIFRoZSBhbGxvY2F0ZWQgYXJyYXkgaXMgaW5pdGlhbGl6ZWQgdG8gYWxsLWJpdHMtemVyby4KKyAqCisgKiBAcGFyYW0gdHlwZSB0eXBlIG5hbWUgdG8gYWxsb2NhdGUKKyAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgaW5zdGFuY2VzIGluIHRoZSBhbGxvY2F0ZWQgYXJyYXkKKyAqIEByZXR1cm5zIHRoZSBuZXcgbWVtb3J5IGJsb2NrIG9yICNOVUxMIG9uIGZhaWx1cmUKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNGcmVlRnVuY3Rpb24KKyAqCisgKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBtZW1vcnkgdGhlIG1lbW9yeSB0byBmcmVlCisgKi8KKworLyoqIEB9ICovIC8qIGVuZCBvZiBwdWJsaWMgQVBJIGRvY3MgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzCisgKgorICogQHsKKyAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkZWJ1Z19pbml0aWFsaXplZCA9IEZBTFNFOworc3RhdGljIGludCBmYWlsX250aCA9IC0xOworc3RhdGljIHNpemVfdCBmYWlsX3NpemUgPSAwOworc3RhdGljIGludCBmYWlsX2FsbG9jX2NvdW50ZXIgPSBfREJVU19JTlRfTUFYOworc3RhdGljIGludCBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlID0gMTsKK3N0YXRpYyBpbnQgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPSAwOworc3RhdGljIGRidXNfYm9vbF90IGd1YXJkcyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGRpc2FibGVfbWVtX3Bvb2xzID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgYmFja3RyYWNlX29uX2ZhaWxfYWxsb2MgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBtYWxsb2NfY2Fubm90X2ZhaWwgPSBGQUxTRTsKK3N0YXRpYyBEQnVzQXRvbWljIG5fYmxvY2tzX291dHN0YW5kaW5nID0gezB9OworCisvKiogdmFsdWUgc3RvcmVkIGluIGd1YXJkIHBhZGRpbmcgZm9yIGRlYnVnZ2luZyBidWZmZXIgb3ZlcnJ1biAqLworI2RlZmluZSBHVUFSRF9WQUxVRSAweGRlYWRiZWVmCisvKiogc2l6ZSBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJsb2NrIHN0b3JlZCBpbiBndWFyZCBtb2RlICovCisjZGVmaW5lIEdVQVJEX0lORk9fU0laRSA4CisvKiogc2l6ZSBvZiB0aGUgR1VBUkRfVkFMVUUtZmlsbGVkIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlciBpbmZvICAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9QQUQgMTYKKy8qKiBzaXplIG9mIHRoZSBHVUFSRF9WQUxVRS1maWxsZWQgcGFkZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworI2RlZmluZSBHVUFSRF9FTkRfUEFEIDE2CisvKiogc2l6ZSBvZiBzdHVmZiBhdCBzdGFydCBvZiBibG9jayAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9PRkZTRVQgKEdVQVJEX1NUQVJUX1BBRCArIEdVQVJEX0lORk9fU0laRSkKKy8qKiB0b3RhbCBleHRyYSBzaXplIG92ZXIgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGZvciBndWFyZCBzdHVmZiAqLworI2RlZmluZSBHVUFSRF9FWFRSQV9TSVpFIChHVUFSRF9TVEFSVF9PRkZTRVQgKyBHVUFSRF9FTkRfUEFEKQorCitzdGF0aWMgdm9pZAorX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKHZvaWQpCit7CisgIGlmICghZGVidWdfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgZGVidWdfaW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSAhPSBOVUxMKQorCXsKKwkgIGZhaWxfbnRoID0gYXRvaSAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSk7CisgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gZmFpbF9udGg7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZmFpbCBkYnVzX21hbGxvYyBldmVyeSAlZCB0aW1lc1xuIiwgZmFpbF9udGgpOworCX0KKyAgICAgIAorICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZhaWxfc2l6ZSA9IGF0b2kgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOIikpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIGZhaWwgbWFsbG9jcyBvdmVyICVsZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgZmFpbF9zaXplKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfR1VBUkRTIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGd1YXJkcyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgdXNlIGRidXNfbWFsbG9jIGd1YXJkc1xuIik7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfRElTQUJMRV9NRU1fUE9PTFMiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGlzYWJsZV9tZW1fcG9vbHMgPSBUUlVFOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIGRpc2FibGUgbWVtb3J5IHBvb2xzXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfQkFDS1RSQUNFUyIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBiYWNrdHJhY2Vfb25fZmFpbF9hbGxvYyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgYmFja3RyYWNlIG9uIGZhaWxpbmcgYSBkYnVzX21hbGxvY1xuIik7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0NBTk5PVF9GQUlMIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIG1hbGxvY19jYW5ub3RfZmFpbCA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgYWJvcnQgaWYgc3lzdGVtIG1hbGxvYygpIGFuZCBmcmllbmRzIGZhaWxcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFdoZXRoZXIgdG8gdHVybiBvZmYgbWVtIHBvb2xzLCB1c2VmdWwgZm9yIGxlYWsgY2hlY2tpbmcuCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgbWVtcG9vbHMgc2hvdWxkIG5vdCBiZSB1c2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMgKHZvaWQpCit7CisgIF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnICgpOworICByZXR1cm4gZGlzYWJsZV9tZW1fcG9vbHM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zIHVudGlsIHdlIHNpbXVsYXRlIGEgZmFpbGVkCisgKiBhbGxvY2F0aW9uLiBJZiBzZXQgdG8gMCwgdGhlIG5leHQgYWxsb2NhdGlvbiB0byBydW4KKyAqIGZhaWxzOyBpZiBzZXQgdG8gMSwgb25lIHN1Y2NlZWRzIHRoZW4gdGhlIG5leHQgZmFpbHM7IGV0Yy4KKyAqIFNldCB0byBfREJVU19JTlRfTUFYIHRvIG5vdCBmYWlsIGFueXRoaW5nLiAKKyAqCisgKiBAcGFyYW0gdW50aWxfbmV4dF9mYWlsIG51bWJlciBvZiBzdWNjZXNzZnVsIGFsbG9jcyBiZWZvcmUgb25lIGZhaWxzCisgKi8KK3ZvaWQKK19kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKGludCB1bnRpbF9uZXh0X2ZhaWwpCit7CisgIF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnICgpOworCisgIGZhaWxfYWxsb2NfY291bnRlciA9IHVudGlsX25leHRfZmFpbDsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIlNldCBmYWlsIGFsbG9jIGNvdW50ZXIgPSAlZFxuIiwgZmFpbF9hbGxvY19jb3VudGVyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGFsbG9jcyB1bnRpbCB3ZSdsbCBzaW11bGF0ZQorICogYSBmYWlsZWQgYWxsb2MuCisgKgorICogQHJldHVybnMgY3VycmVudCBjb3VudGVyIHZhbHVlCisgKi8KK2ludAorX2RidXNfZ2V0X2ZhaWxfYWxsb2NfY291bnRlciAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisKKyAgcmV0dXJuIGZhaWxfYWxsb2NfY291bnRlcjsKK30KKworLyoqCisgKiBTZXRzIGhvdyBtYW55IG1hbGxvY3MgdG8gZmFpbCB3aGVuIHRoZSBmYWlsIGFsbG9jIGNvdW50ZXIgcmVhY2hlcworICogMC4KKyAqCisgKiBAcGFyYW0gZmFpbHVyZXNfcGVyX2ZhaWx1cmUgbnVtYmVyIHRvIGZhaWwKKyAqLwordm9pZAorX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKGludCBmYWlsdXJlc19wZXJfZmFpbHVyZSkKK3sKKyAgbl9mYWlsdXJlc19wZXJfZmFpbHVyZSA9IGZhaWx1cmVzX3Blcl9mYWlsdXJlOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBmYWlsdXJlcyB3ZSdsbCBoYXZlIHdoZW4gdGhlIGZhaWwgbWFsbG9jCisgKiBjb3VudGVyIHJlYWNoZXMgMC4KKyAqCisgKiBAcmV0dXJucyBudW1iZXIgb2YgZmFpbHVyZXMgcGxhbm5lZAorICovCitpbnQKK19kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICh2b2lkKQoreworICByZXR1cm4gbl9mYWlsdXJlc19wZXJfZmFpbHVyZTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIENhbGxlZCB3aGVuIGFib3V0IHRvIGFsbG9jIHNvbWUgbWVtb3J5OyBpZgorICogaXQgcmV0dXJucyAjVFJVRSwgdGhlbiB0aGUgYWxsb2NhdGlvbiBzaG91bGQKKyAqIGZhaWwuIElmIGl0IHJldHVybnMgI0ZBTFNFLCB0aGVuIHRoZSBhbGxvY2F0aW9uCisgKiBzaG91bGQgbm90IGZhaWwuCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyBhbGxvYyBzaG91bGQgZmFpbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgeworICAgIHN0YXRpYyBkYnVzX2Jvb2xfdCBjYWxsZWQgPSAwOworCisgICAgaWYgKCFjYWxsZWQpCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UoIlRPRE86IG1lbW9yeSBhbGxvY2F0aW9uIHRlc3RpbmcgZXJyb3JzIGRpc2FibGVkIGZvciBub3dcbiIpOworICAgICAgICBjYWxsZWQgPSAxOworICAgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKGZhaWxfYWxsb2NfY291bnRlciA8PSAwKQorICAgIHsKKyAgICAgIGlmIChiYWNrdHJhY2Vfb25fZmFpbF9hbGxvYykKKyAgICAgICAgX2RidXNfcHJpbnRfYmFja3RyYWNlICgpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbHVyZSAlZFxuIiwgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUpOworICAgICAgCisgICAgICBuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSArPSAxOworICAgICAgaWYgKG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlID49IG5fZmFpbHVyZXNfcGVyX2ZhaWx1cmUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZmFpbF9udGggPj0gMCkKKyAgICAgICAgICAgIGZhaWxfYWxsb2NfY291bnRlciA9IGZhaWxfbnRoOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhaWxfYWxsb2NfY291bnRlciA9IF9EQlVTX0lOVF9NQVg7CisKKyAgICAgICAgICBuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSA9IDA7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVzZXQgZmFpbCBhbGxvYyBjb3VudGVyIHRvICVkXG4iLCBmYWlsX2FsbG9jX2NvdW50ZXIpOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZhaWxfYWxsb2NfY291bnRlciAtPSAxOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIG1hbGxvYygpJ2QgYmxvY2tzLgorICoKKyAqIEByZXR1cm5zIG51bWJlciBvZiBibG9ja3MKKyAqLworaW50CitfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX2F0b21pY19nZXQgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7Cit9CisKKy8qKgorICogV2hlcmUgdGhlIGJsb2NrIGNhbWUgZnJvbS4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIFNPVVJDRV9VTktOT1dOLAorICBTT1VSQ0VfTUFMTE9DLAorICBTT1VSQ0VfUkVBTExPQywKKyAgU09VUkNFX01BTExPQ19aRVJPLAorICBTT1VSQ0VfUkVBTExPQ19OVUxMCit9IEJsb2NrU291cmNlOworCitzdGF0aWMgY29uc3QgY2hhcioKK3NvdXJjZV9zdHJpbmcgKEJsb2NrU291cmNlIHNvdXJjZSkKK3sKKyAgc3dpdGNoIChzb3VyY2UpCisgICAgeworICAgIGNhc2UgU09VUkNFX1VOS05PV046CisgICAgICByZXR1cm4gInVua25vd24iOworICAgIGNhc2UgU09VUkNFX01BTExPQzoKKyAgICAgIHJldHVybiAibWFsbG9jIjsKKyAgICBjYXNlIFNPVVJDRV9SRUFMTE9DOgorICAgICAgcmV0dXJuICJyZWFsbG9jIjsKKyAgICBjYXNlIFNPVVJDRV9NQUxMT0NfWkVSTzoKKyAgICAgIHJldHVybiAibWFsbG9jMCI7CisgICAgY2FzZSBTT1VSQ0VfUkVBTExPQ19OVUxMOgorICAgICAgcmV0dXJuICJyZWFsbG9jKE5VTEwpIjsKKyAgICB9CisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkludmFsaWQgbWFsbG9jIGJsb2NrIHNvdXJjZSBJRCIpOworICByZXR1cm4gImludmFsaWQhIjsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2d1YXJkcyAodm9pZCAgICAgICAqZnJlZV9ibG9jaywKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3Qgb3ZlcndyaXRlKQoreworICBpZiAoZnJlZV9ibG9jayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJsb2NrID0gKCh1bnNpZ25lZCBjaGFyKilmcmVlX2Jsb2NrKSAtIEdVQVJEX1NUQVJUX09GRlNFVDsKKyAgICAgIHNpemVfdCByZXF1ZXN0ZWRfYnl0ZXMgPSAqKGRidXNfdWludDMyX3QqKWJsb2NrOworICAgICAgQmxvY2tTb3VyY2Ugc291cmNlID0gKihkYnVzX3VpbnQzMl90KikoYmxvY2sgKyA0KTsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgZGJ1c19ib29sX3QgZmFpbGVkOworCisgICAgICBmYWlsZWQgPSBGQUxTRTsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDaGVja2luZyAlZCBieXRlcyByZXF1ZXN0IGZyb20gc291cmNlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2J5dGVzLCBzb3VyY2Vfc3RyaW5nIChzb3VyY2UpKTsKKyNlbmRpZgorICAgICAgCisgICAgICBpID0gR1VBUkRfSU5GT19TSVpFOworICAgICAgd2hpbGUgKGkgPCBHVUFSRF9TVEFSVF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlID0gKihkYnVzX3VpbnQzMl90KikgJmJsb2NrW2ldOworICAgICAgICAgIGlmICh2YWx1ZSAhPSBHVUFSRF9WQUxVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJsb2NrIG9mICVsdSBieXRlcyBmcm9tICVzIGhhZCBzdGFydCBndWFyZCB2YWx1ZSAweCV1eCBhdCAlZCBleHBlY3RlZCAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcmVxdWVzdGVkX2J5dGVzLCBzb3VyY2Vfc3RyaW5nIChzb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgaSwgR1VBUkRfVkFMVUUpOworICAgICAgICAgICAgICBmYWlsZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgfQorCisgICAgICBpID0gR1VBUkRfU1RBUlRfT0ZGU0VUICsgcmVxdWVzdGVkX2J5dGVzOworICAgICAgd2hpbGUgKGkgPCAoR1VBUkRfU1RBUlRfT0ZGU0VUICsgcmVxdWVzdGVkX2J5dGVzICsgR1VBUkRfRU5EX1BBRCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlID0gKihkYnVzX3VpbnQzMl90KikgJmJsb2NrW2ldOworICAgICAgICAgIGlmICh2YWx1ZSAhPSBHVUFSRF9WQUxVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJsb2NrIG9mICVsdSBieXRlcyBmcm9tICVzIGhhZCBlbmQgZ3VhcmQgdmFsdWUgMHgldXggYXQgJWQgZXhwZWN0ZWQgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGksIEdVQVJEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0KKworICAgICAgLyogc2V0IG1lbW9yeSB0byBhbnl0aGluZyBidXQgbnVsIGJ5dGVzICovCisgICAgICBpZiAob3ZlcndyaXRlKQorICAgICAgICBtZW1zZXQgKGZyZWVfYmxvY2ssICdnJywgcmVxdWVzdGVkX2J5dGVzKTsKKyAgICAgIAorICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ3VhcmQgdmFsdWUgY29ycnVwdGlvbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQqCitzZXRfZ3VhcmRzICh2b2lkICAgICAgICpyZWFsX2Jsb2NrLAorICAgICAgICAgICAgc2l6ZV90ICAgICAgcmVxdWVzdGVkX2J5dGVzLAorICAgICAgICAgICAgQmxvY2tTb3VyY2Ugc291cmNlKQoreworICB1bnNpZ25lZCBjaGFyICpibG9jayA9IHJlYWxfYmxvY2s7CisgIHVuc2lnbmVkIGludCBpOworICAKKyAgaWYgKGJsb2NrID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfYXNzZXJ0IChHVUFSRF9TVEFSVF9PRkZTRVQgKyBHVUFSRF9FTkRfUEFEID09IEdVQVJEX0VYVFJBX1NJWkUpOworICAKKyAgKigoZGJ1c191aW50MzJfdCopYmxvY2spID0gcmVxdWVzdGVkX2J5dGVzOworICAqKChkYnVzX3VpbnQzMl90KikoYmxvY2sgKyA0KSkgPSBzb3VyY2U7CisKKyAgaSA9IEdVQVJEX0lORk9fU0laRTsKKyAgd2hpbGUgKGkgPCBHVUFSRF9TVEFSVF9PRkZTRVQpCisgICAgeworICAgICAgKCooZGJ1c191aW50MzJfdCopICZibG9ja1tpXSkgPSBHVUFSRF9WQUxVRTsKKyAgICAgIAorICAgICAgaSArPSA0OworICAgIH0KKworICBpID0gR1VBUkRfU1RBUlRfT0ZGU0VUICsgcmVxdWVzdGVkX2J5dGVzOworICB3aGlsZSAoaSA8IChHVUFSRF9TVEFSVF9PRkZTRVQgKyByZXF1ZXN0ZWRfYnl0ZXMgKyBHVUFSRF9FTkRfUEFEKSkKKyAgICB7CisgICAgICAoKihkYnVzX3VpbnQzMl90KikgJmJsb2NrW2ldKSA9IEdVQVJEX1ZBTFVFOworICAgICAgCisgICAgICBpICs9IDQ7CisgICAgfQorICAKKyAgY2hlY2tfZ3VhcmRzIChibG9jayArIEdVQVJEX1NUQVJUX09GRlNFVCwgRkFMU0UpOworICAKKyAgcmV0dXJuIGJsb2NrICsgR1VBUkRfU1RBUlRfT0ZGU0VUOworfQorCisjZW5kaWYKKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgZG9jcyAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeQorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBBbGxvY2F0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcywgYXMgd2l0aCBzdGFuZGFyZAorICogbWFsbG9jKCkuIEd1YXJhbnRlZWQgdG8gcmV0dXJuICNOVUxMIGlmIGJ5dGVzIGlzIHplcm8KKyAqIG9uIGFsbCBwbGF0Zm9ybXMuIFJldHVybnMgI05VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMuCisgKiBUaGUgbWVtb3J5IG11c3QgYmUgcmVsZWFzZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqCisgKiBkYnVzX21hbGxvYygpIG1lbW9yeSBpcyBOT1Qgc2FmZSB0byBmcmVlIHdpdGggcmVndWxhciBmcmVlKCkgZnJvbQorICogdGhlIEMgbGlicmFyeS4gRnJlZSBpdCB3aXRoIGRidXNfZnJlZSgpIG9ubHkuCisgKgorICogQHBhcmFtIGJ5dGVzIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogQHJldHVybiBhbGxvY2F0ZWQgbWVtb3J5LCBvciAjTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlscy4KKyAqLwordm9pZCoKK2RidXNfbWFsbG9jIChzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWFsbG9jIG9mICVsZCBieXRlc1xuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgIGlmIChieXRlcyA9PSAwKSAvKiBzb21lIHN5c3RlbSBtYWxsb2NzIGhhbmRsZSB0aGlzLCBzb21lIGRvbid0ICovCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgZWxzZSBpZiAoZmFpbF9zaXplICE9IDAgJiYgYnl0ZXMgPiBmYWlsX3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKGd1YXJkcykKKyAgICB7CisgICAgICB2b2lkICpibG9jazsKKworICAgICAgYmxvY2sgPSBtYWxsb2MgKGJ5dGVzICsgR1VBUkRfRVhUUkFfU0laRSk7CisgICAgICBpZiAoYmxvY2spCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogbWFsbG9jICglbGQgKyAlbGQpXG4iLAorICAgICAgICAgICAgICAobG9uZykgYnl0ZXMsIChsb25nKSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfTUFMTE9DKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IG1hbGxvYyAoYnl0ZXMpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmIChtZW0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogbWFsbG9jICglbGQpXG4iLCAobG9uZykgYnl0ZXMpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgcmV0dXJuIG1lbTsKKyAgICB9Cit9CisKKy8qKgorICogQWxsb2NhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMsIGFzIHdpdGggc3RhbmRhcmQgbWFsbG9jKCksIGJ1dAorICogYWxsIGJ5dGVzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGFzIHdpdGggY2FsbG9jKCkuIEd1YXJhbnRlZWQgdG8KKyAqIHJldHVybiAjTlVMTCBpZiBieXRlcyBpcyB6ZXJvIG9uIGFsbCBwbGF0Zm9ybXMuIFJldHVybnMgI05VTEwgaWYgdGhlCisgKiBhbGxvY2F0aW9uIGZhaWxzLiAgVGhlIG1lbW9yeSBtdXN0IGJlIHJlbGVhc2VkIHdpdGggZGJ1c19mcmVlKCkuCisgKgorICogZGJ1c19tYWxsb2MwKCkgbWVtb3J5IGlzIE5PVCBzYWZlIHRvIGZyZWUgd2l0aCByZWd1bGFyIGZyZWUoKSBmcm9tCisgKiB0aGUgQyBsaWJyYXJ5LiBGcmVlIGl0IHdpdGggZGJ1c19mcmVlKCkgb25seS4KKyAqCisgKiBAcGFyYW0gYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiBAcmV0dXJuIGFsbG9jYXRlZCBtZW1vcnksIG9yICNOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICovCit2b2lkKgorZGJ1c19tYWxsb2MwIChzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWFsbG9jMCBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgZWxzZSBpZiAoZmFpbF9zaXplICE9IDAgJiYgYnl0ZXMgPiBmYWlsX3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKGd1YXJkcykKKyAgICB7CisgICAgICB2b2lkICpibG9jazsKKworICAgICAgYmxvY2sgPSBjYWxsb2MgKGJ5dGVzICsgR1VBUkRfRVhUUkFfU0laRSwgMSk7CisKKyAgICAgIGlmIChibG9jaykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBjYWxsb2MgKCVsZCArICVsZCwgMSlcbiIsCisgICAgICAgICAgICAgIChsb25nKSBieXRlcywgKGxvbmcpIEdVQVJEX0VYVFJBX1NJWkUpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBzZXRfZ3VhcmRzIChibG9jaywgYnl0ZXMsIFNPVVJDRV9NQUxMT0NfWkVSTyk7CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisgICAgICB2b2lkICptZW07CisgICAgICBtZW0gPSBjYWxsb2MgKGJ5dGVzLCAxKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICBpZiAobWVtKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IGNhbGxvYyAoJWxkKVxuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBtZW07CisgICAgfQorfQorCisvKioKKyAqIFJlc2l6ZXMgYSBibG9jayBvZiBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZGJ1c19tYWxsb2MoKSBvcgorICogZGJ1c19tYWxsb2MwKCkuIEd1YXJhbnRlZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGFuZCByZXR1cm4gI05VTEwgaWYgYnl0ZXMKKyAqIGlzIHplcm8gb24gYWxsIHBsYXRmb3Jtcy4gUmV0dXJucyAjTlVMTCBpZiB0aGUgcmVzaXplIGZhaWxzLgorICogSWYgdGhlIHJlc2l6ZSBmYWlscywgdGhlIG1lbW9yeSBpcyBub3QgZnJlZWQuCisgKgorICogQHBhcmFtIG1lbW9yeSBibG9jayB0byBiZSByZXNpemVkCisgKiBAcGFyYW0gYnl0ZXMgbmV3IHNpemUgb2YgdGhlIG1lbW9yeSBibG9jaworICogQHJldHVybiBhbGxvY2F0ZWQgbWVtb3J5LCBvciAjTlVMTCBpZiB0aGUgcmVzaXplIGZhaWxzLgorICovCit2b2lkKgorZGJ1c19yZWFsbG9jICh2b2lkICAqbWVtb3J5LAorICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgcmVhbGxvYyBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApIC8qIGd1YXJhbnRlZSB0aGlzIGlzIHNhZmUgKi8KKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG1lbW9yeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgZWxzZSBpZiAoZmFpbF9zaXplICE9IDAgJiYgYnl0ZXMgPiBmYWlsX3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKGd1YXJkcykKKyAgICB7CisgICAgICBpZiAobWVtb3J5KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IG9sZF9ieXRlczsKKyAgICAgICAgICB2b2lkICpibG9jazsKKyAgICAgICAgICAKKyAgICAgICAgICBjaGVja19ndWFyZHMgKG1lbW9yeSwgRkFMU0UpOworICAgICAgICAgIAorICAgICAgICAgIGJsb2NrID0gcmVhbGxvYyAoKCh1bnNpZ25lZCBjaGFyKiltZW1vcnkpIC0gR1VBUkRfU1RBUlRfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKworICAgICAgICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiByZWFsbG9jICglcCwgJWxkICsgJWxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksIChsb25nKSBieXRlcywgKGxvbmcpIEdVQVJEX0VYVFJBX1NJWkUpOworICAgICAgICAgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgb2xkX2J5dGVzID0gKihkYnVzX3VpbnQzMl90KilibG9jazsKKyAgICAgICAgICBpZiAoYnl0ZXMgPj0gb2xkX2J5dGVzKQorICAgICAgICAgICAgLyogb2xkIGd1YXJkcyBzaG91bGRuJ3QgaGF2ZSBtb3ZlZCAqLworICAgICAgICAgICAgY2hlY2tfZ3VhcmRzICgoKHVuc2lnbmVkIGNoYXIqKWJsb2NrKSArIEdVQVJEX1NUQVJUX09GRlNFVCwgRkFMU0UpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBzZXRfZ3VhcmRzIChibG9jaywgYnl0ZXMsIFNPVVJDRV9SRUFMTE9DKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdm9pZCAqYmxvY2s7CisgICAgICAgICAgCisgICAgICAgICAgYmxvY2sgPSBtYWxsb2MgKGJ5dGVzICsgR1VBUkRfRVhUUkFfU0laRSk7CisKKyAgICAgICAgICBpZiAoYmxvY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogbWFsbG9jICglbGQgKyAlbGQpXG4iLAorICAgICAgICAgICAgICAgICAgKGxvbmcpIGJ5dGVzLCAobG9uZykgR1VBUkRfRVhUUkFfU0laRSk7CisgICAgICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIHNldF9ndWFyZHMgKGJsb2NrLCBieXRlcywgU09VUkNFX1JFQUxMT0NfTlVMTCk7ICAgCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IHJlYWxsb2MgKG1lbW9yeSwgYnl0ZXMpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmIChtZW0gPT0gTlVMTCAmJiBtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogbWFsbG9jICglbGQpXG4iLCAobG9uZykgYnl0ZXMpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCAmJiBtZW0gIT0gTlVMTCkKKwkgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIG1lbTsKKyAgICB9Cit9CisKKy8qKgorICogRnJlZXMgYSBibG9jayBvZiBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZGJ1c19tYWxsb2MoKSBvcgorICogZGJ1c19tYWxsb2MwKCkuIElmIHBhc3NlZCAjTlVMTCwgZG9lcyBub3RoaW5nLgorICogCisgKiBAcGFyYW0gbWVtb3J5IGJsb2NrIHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQKK2RidXNfZnJlZSAodm9pZCAgKm1lbW9yeSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIGNoZWNrX2d1YXJkcyAobWVtb3J5LCBUUlVFKTsKKyAgICAgIGlmIChtZW1vcnkpCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgICAgICAgICAgX2RidXNfYXRvbWljX2RlYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbHNlCisgICAgICAgICAgZGJ1c19pbnQzMl90IG9sZF92YWx1ZTsKKworICAgICAgICAgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPj0gMSk7CisjZW5kaWYKKworICAgICAgICAgIGZyZWUgKCgodW5zaWduZWQgY2hhciopbWVtb3J5KSAtIEdVQVJEX1NUQVJUX09GRlNFVCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIAorICBpZiAobWVtb3J5KSAvKiB3ZSBndWFyYW50ZWUgaXQncyBzYWZlIHRvIGZyZWUgKE5VTEwpICovCisgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAgICAgX2RidXNfYXRvbWljX2RlYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbHNlCisgICAgICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgICAgICBvbGRfdmFsdWUgPSBfZGJ1c19hdG9taWNfZGVjICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPj0gMSk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgICBmcmVlIChtZW1vcnkpOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyBhICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncy4KKyAqIElmIHBhc3NlZCAjTlVMTCwgZG9lcyBub3RoaW5nLgorICoKKyAqIEBwYXJhbSBzdHJfYXJyYXkgdGhlIGFycmF5IHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQKK2RidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoYXIgKipzdHJfYXJyYXkpCit7CisgIGlmIChzdHJfYXJyYXkpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKHN0cl9hcnJheVtpXSkKKwl7CisJICBkYnVzX2ZyZWUgKHN0cl9hcnJheVtpXSk7CisJICBpKys7CisJfQorCisgICAgICBkYnVzX2ZyZWUgKHN0cl9hcnJheSk7CisgICAgfQorfQorCisvKiogQH0gKi8gLyogRW5kIG9mIHB1YmxpYyBBUEkgZG9jcyBibG9jayAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gaXMgdXNlZCB0byB0cmFjayBlYWNoCisgKiB0aW1lIHRoYXQgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZCwgc28gd2UgY2FuCisgKiByZWluaXQgdGhpbmdzIGFmdGVyIGl0J3MgYmVlbiBjYWxsZWQuIEl0IGlzIHNpbXBseQorICogaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHdlIHNodXQgZG93bi4KKyAqLworaW50IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiA9IDE7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBzaHV0ZG93bi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlIFNodXRkb3duQ2xvc3VyZTsKKworLyoqCisgKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHNodXRkb3duLgorICovCitzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlCit7CisgIFNodXRkb3duQ2xvc3VyZSAqbmV4dDsgICAgIC8qKjwgTmV4dCBTaHV0ZG93bkNsb3N1cmUgKi8KKyAgREJ1c1NodXRkb3duRnVuY3Rpb24gZnVuYzsgLyoqPCBGdW5jdGlvbiB0byBjYWxsICovCisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgZnVuY3Rpb24gKi8KK307CisKKy8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLIChzaHV0ZG93bl9mdW5jcykgKi8KK3N0YXRpYyBTaHV0ZG93bkNsb3N1cmUgKnJlZ2lzdGVyZWRfZ2xvYmFscyA9IE5VTEw7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UKKyAqIHRoZSBuZXh0IHRpbWUgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoREJ1c1NodXRkb3duRnVuY3Rpb24gIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3Qgb2s7CisKKyAgaWYgKCFfREJVU19MT0NLIChzaHV0ZG93bl9mdW5jcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG9rID0gX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuY191bmxvY2tlZCAoZnVuYywgZGF0YSk7CisgIF9EQlVTX1VOTE9DSyAoc2h1dGRvd25fZnVuY3MpOworICByZXR1cm4gb2s7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jX3VubG9ja2VkIChEQnVzU2h1dGRvd25GdW5jdGlvbiAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBTaHV0ZG93bkNsb3N1cmUgKmM7CisKKyAgYyA9IGRidXNfbmV3IChTaHV0ZG93bkNsb3N1cmUsIDEpOworCisgIGlmIChjID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGMtPmZ1bmMgPSBmdW5jOworICBjLT5kYXRhID0gZGF0YTsKKworICBjLT5uZXh0ID0gcmVnaXN0ZXJlZF9nbG9iYWxzOworICByZWdpc3RlcmVkX2dsb2JhbHMgPSBjOworCisgIHJldHVybiBUUlVFOworfQorCisvKiogQH0gKi8gLyogRW5kIG9mIHByaXZhdGUgQVBJIGRvY3MgYmxvY2sgKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnkKKyAqCisgKiBAeworICovCisKKy8qKgorICogRnJlZXMgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgaW50ZXJuYWxseSBieSBsaWJkYnVzIGFuZAorICogcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgZGJ1c190aHJlYWRzX2luaXQoKS4gbGliZGJ1cyBrZWVwcyBpbnRlcm5hbAorICogZ2xvYmFsIHZhcmlhYmxlcywgZm9yIGV4YW1wbGUgY2FjaGVzIGFuZCB0aHJlYWQgbG9ja3MsIGFuZCBpdAorICogY2FuIGJlIHVzZWZ1bCB0byBmcmVlIHRoZXNlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBkYnVzX3NodXRkb3duKCkgZG9lcyBOT1QgZnJlZSBtZW1vcnkgdGhhdCB3YXMgcmV0dXJuZWQKKyAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gSXQgb25seSBmcmVlcyBsaWJkYnVzLWludGVybmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogWW91IE1VU1QgZnJlZSBhbGwgbWVtb3J5IGFuZCByZWxlYXNlIGFsbCByZWZlcmVuY2UgY291bnRzCisgKiByZXR1cm5lZCB0byB5b3UgYnkgbGliZGJ1cyBwcmlvciB0byBjYWxsaW5nIGRidXNfc2h1dGRvd24oKS4KKyAqCisgKiBJZiBhIHNoYXJlZCBjb25uZWN0aW9uIGlzIG9wZW4sIGNhbGxpbmcgZGJ1c19zaHV0ZG93bigpIHdpbGwKKyAqIGRyYWluIGl0cyBxdWV1ZSBvZiBtZXNzYWdlcyBhbmQgZGlzY29ubmVjdCBpdC4gSW4gcGFydGljdWxhciwKKyAqIHRoaXMgd2lsbCByZXN1bHQgaW4gcHJvY2Vzc2luZyBvZiB0aGUgc3BlY2lhbCBEaXNjb25uZWN0ZWQKKyAqIHNpZ25hbCwgd2hpY2ggbWF5IHJlc3VsdCBpbiBhIGNhbGwgdG8gX2V4aXQoKSwgdW5sZXNzIHlvdQorICogaGF2ZSB1c2VkIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgdG8gZGlzYWJsZQorICogdGhhdCBiZWhhdmlvdXIuCisgKgorICogWW91IGNhbid0IGNvbnRpbnVlIHRvIHVzZSBhbnkgRC1CdXMgb2JqZWN0cywgc3VjaCBhcyBjb25uZWN0aW9ucywKKyAqIHRoYXQgd2VyZSBhbGxvY2F0ZWQgcHJpb3IgdG8gZGJ1c19zaHV0ZG93bigpLiBZb3UgY2FuLCBob3dldmVyLAorICogc3RhcnQgb3ZlcjsgY2FsbCBkYnVzX3RocmVhZHNfaW5pdCgpIGFnYWluLCBjcmVhdGUgbmV3IGNvbm5lY3Rpb25zLAorICogYW5kIHNvIGZvcnRoLgorICoKKyAqIFdBUk5JTkc6IGRidXNfc2h1dGRvd24oKSBpcyBOT1QgdGhyZWFkIHNhZmUsIGl0IG11c3QgYmUgY2FsbGVkCisgKiB3aGlsZSBOTyBvdGhlciB0aHJlYWRzIGFyZSB1c2luZyBELUJ1cy4gKFJlbWVtYmVyLCB5b3UgaGF2ZSB0byBmcmVlCisgKiBhbGwgRC1CdXMgb2JqZWN0cyBhbmQgbWVtb3J5IGJlZm9yZSB5b3UgY2FsbCBkYnVzX3NodXRkb3duKCksIHNvIG5vCisgKiB0aHJlYWQgY2FuIGJlIHVzaW5nIGxpYmRidXMuKQorICoKKyAqIFRoZSBwdXJwb3NlIG9mIGRidXNfc2h1dGRvd24oKSBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZ2V0CisgKiBjbGVhbiBvdXRwdXQgZnJvbSBtZW1vcnkgbGVhayBjaGVja2Vycy4gZGJ1c19zaHV0ZG93bigpIG1heSBhbHNvIGJlCisgKiB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZGxvcGVuKCkgbGliZGJ1cyBpbnN0ZWFkIG9mIGxpbmtpbmcgdG8gaXQsCisgKiBhbmQgd2FudCB0byBiZSBhYmxlIHRvIHVubG9hZCB0aGUgbGlicmFyeSBhZ2Fpbi4KKyAqCisgKiBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgZGJ1c19zaHV0ZG93bigpIC0gaW4gZmFjdCwKKyAqIG1vc3QgYXBwbGljYXRpb25zIHdvbid0IGJvdGhlciBhbmQgc2hvdWxkIG5vdCBmZWVsIGd1aWx0eS4KKyAqIAorICogWW91IGhhdmUgdG8ga25vdyB0aGF0IG5vYm9keSBpcyB1c2luZyBsaWJkYnVzIGluIHlvdXIgYXBwbGljYXRpb24ncworICogcHJvY2VzcyBiZWZvcmUgeW91IGNhbiBjYWxsIGRidXNfc2h1dGRvd24oKS4gT25lIGltcGxpY2F0aW9uIG9mIHRoaXMKKyAqIGlzIHRoYXQgY2FsbGluZyBkYnVzX3NodXRkb3duKCkgZnJvbSBhIGxpYnJhcnkgaXMgYWxtb3N0IGNlcnRhaW5seQorICogd3JvbmcsIHNpbmNlIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyB1cCB0by4KKyAqIAorICovCit2b2lkCitkYnVzX3NodXRkb3duICh2b2lkKQoreworICB3aGlsZSAocmVnaXN0ZXJlZF9nbG9iYWxzICE9IE5VTEwpCisgICAgeworICAgICAgU2h1dGRvd25DbG9zdXJlICpjOworCisgICAgICBjID0gcmVnaXN0ZXJlZF9nbG9iYWxzOworICAgICAgcmVnaXN0ZXJlZF9nbG9iYWxzID0gYy0+bmV4dDsKKyAgICAgIAorICAgICAgKCogYy0+ZnVuYykgKGMtPmRhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGMpOworICAgIH0KKworICAvKiBXZSB3cmFwIHRoaXMgaW4gdGhlIHRocmVhZC1pbml0aWFsaXphdGlvbiBsb2NrIGJlY2F1c2UKKyAgICogZGJ1c190aHJlYWRzX2luaXQoKSB1c2VzIHRoZSBjdXJyZW50IGdlbmVyYXRpb24gdG8gdGVsbCB3aGV0aGVyCisgICAqIHdlJ3JlIGluaXRpYWxpemVkLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHVuLWluaXRpYWxpemluZworICAgKiBwcm9wYWdhdGVzIGludG8gYWxsIHRocmVhZHMuICovCisgIF9kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKKyAgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uICs9IDE7CisgIF9kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICgpOworfQorCisvKiogQH0gKi8gLyoqIEVuZCBvZiBwdWJsaWMgQVBJIGRvY3MgYmxvY2sgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogQGluZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTWVtb3J5CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVtb3J5X3Rlc3QgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IG9sZF9ndWFyZHM7CisgIHZvaWQgKnA7CisgIHNpemVfdCBzaXplOworCisgIG9sZF9ndWFyZHMgPSBndWFyZHM7CisgIGd1YXJkcyA9IFRSVUU7CisgIHAgPSBkYnVzX21hbGxvYyAoNCk7CisgIGlmIChwID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIGZvciAoc2l6ZSA9IDQ7IHNpemUgPCAyNTY7IHNpemUgKz0gNCkKKyAgICB7CisgICAgICBwID0gZGJ1c19yZWFsbG9jIChwLCBzaXplKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgfQorICBmb3IgKHNpemUgPSAyNTY7IHNpemUgIT0gMDsgc2l6ZSAtPSA0KQorICAgIHsKKyAgICAgIHAgPSBkYnVzX3JlYWxsb2MgKHAsIHNpemUpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIGRidXNfZnJlZSAocCk7CisgIGd1YXJkcyA9IG9sZF9ndWFyZHM7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZW1vcnkuaCBiL2RidXMvZGJ1cy1tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ1NmJkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lbW9yeS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1vcnkuaCAgRC1CdXMgbWVtb3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfTUVNT1JZX0gKKyNkZWZpbmUgREJVU19NRU1PUllfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeQorICogQHsKKyAqLworCitEQlVTX0VYUE9SVAorREJVU19NQUxMT0MKK0RCVVNfQUxMT0NfU0laRSgxKQordm9pZCogZGJ1c19tYWxsb2MgICAgICAgIChzaXplX3QgYnl0ZXMpOworCitEQlVTX0VYUE9SVAorREJVU19NQUxMT0MKK0RCVVNfQUxMT0NfU0laRSgxKQordm9pZCogZGJ1c19tYWxsb2MwICAgICAgIChzaXplX3QgYnl0ZXMpOworCitEQlVTX0VYUE9SVAorREJVU19NQUxMT0MKK0RCVVNfQUxMT0NfU0laRSgyKQordm9pZCogZGJ1c19yZWFsbG9jICAgICAgICh2b2lkICAqbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpOworREJVU19FWFBPUlQKK3ZvaWQgIGRidXNfZnJlZSAgICAgICAgICAodm9pZCAgKm1lbW9yeSk7CisKKyNkZWZpbmUgZGJ1c19uZXcodHlwZSwgY291bnQpICAoKHR5cGUqKWRidXNfbWFsbG9jIChzaXplb2YgKHR5cGUpICogKGNvdW50KSkpCisjZGVmaW5lIGRidXNfbmV3MCh0eXBlLCBjb3VudCkgKCh0eXBlKilkYnVzX21hbGxvYzAgKHNpemVvZiAodHlwZSkgKiAoY291bnQpKSkKKworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hhciAqKnN0cl9hcnJheSk7CisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzRnJlZUZ1bmN0aW9uKSAodm9pZCAqbWVtb3J5KTsKKworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19zaHV0ZG93biAodm9pZCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1lbXBvb2wuYyBiL2RidXMvZGJ1cy1tZW1wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NjYxNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZW1wb29sLmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1wb29sLmggTWVtb3J5IHBvb2xzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tZW1wb29sLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXZhbGdyaW5kLWludGVybmFsLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZW1Qb29sIG1lbW9yeSBwb29scworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTWVtUG9vbCBvYmplY3QKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c01lbVBvb2wuICBBIG1lbW9yeSBwb29sIGlzIHVzZWQKKyAqIHRvIGRlY3JlYXNlIG1lbW9yeSBmcmFnbWVudGF0aW9uL292ZXJoZWFkIGFuZCBpbmNyZWFzZSBzcGVlZCBmb3IKKyAqIGJsb2NrcyBvZiBzbWFsbCB1bmlmb3JtbHktc2l6ZWQgb2JqZWN0cy4gVGhlIG1haW4gcG9pbnQgaXMgdG8gYXZvaWQKKyAqIHRoZSBvdmVyaGVhZCBvZiBhIG1hbGxvYyBibG9jayBmb3IgZWFjaCBzbWFsbCBvYmplY3QsIHNwZWVkIGlzCisgKiBzZWNvbmRhcnkuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbVBvb2xJbnRlcm5hbHMgTWVtb3J5IHBvb2wgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTWVtUG9vbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c01lbVBvb2wuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIHR5cGVkZWYgc28gREJ1c0ZyZWVkRWxlbWVudCBzdHJ1Y3QgY2FuIHJlZmVyIHRvIGl0c2VsZi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0ZyZWVkRWxlbWVudCBEQnVzRnJlZWRFbGVtZW50OworCisvKioKKyAqIHN0cnVjdCByZXByZXNlbnRpbmcgYW4gZWxlbWVudCBvbiB0aGUgZnJlZSBsaXN0LgorICogV2UganVzdCBjYXN0IGZyZWVkIGVsZW1lbnRzIHRvIHRoaXMgc28gd2UgY2FuCisgKiBtYWtlIGEgbGlzdCBvdXQgb2YgdGhlbS4KKyAqLworc3RydWN0IERCdXNGcmVlZEVsZW1lbnQKK3sKKyAgREJ1c0ZyZWVkRWxlbWVudCAqbmV4dDsgLyoqPCBuZXh0IGVsZW1lbnQgb2YgdGhlIGZyZWUgbGlzdCAqLworfTsKKworLyoqCisgKiBUaGUgZHVtbXkgc2l6ZSBvZiB0aGUgdmFyaWFibGUtbGVuZ3RoICJlbGVtZW50cyIKKyAqIGZpZWxkIGluIERCdXNNZW1CbG9jaworICovCisjZGVmaW5lIEVMRU1FTlRfUEFERElORyA0CisKKy8qKgorICogVHlwZWRlZiBmb3IgREJ1c01lbUJsb2NrIHNvIHRoZSBzdHJ1Y3QgY2FuIHJlY3Vyc2l2ZWx5CisgKiBwb2ludCB0byBpdHNlbGYuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNNZW1CbG9jayBEQnVzTWVtQmxvY2s7CisKKy8qKgorICogREJ1c01lbUJsb2NrIG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIG1hbGxvYygpLXJldHVybmVkCisgKiBibG9jayB0aGF0IGdldHMgY2h1bmtlZCB1cCBpbnRvIG9iamVjdHMgaW4gdGhlIG1lbW9yeSBwb29sLgorICovCitzdHJ1Y3QgREJ1c01lbUJsb2NrCit7CisgIERCdXNNZW1CbG9jayAqbmV4dDsgIC8qKjwgbmV4dCBibG9jayBpbiB0aGUgbGlzdCwgd2hpY2ggaXMgYWxyZWFkeSB1c2VkIHVwOworICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9ubHkgc2F2ZWQgc28gd2UgY2FuIGZyZWUgYWxsIHRoZSBibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICogICB3aGVuIHdlIGZyZWUgdGhlIG1lbSBwb29sLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiB0aGlzIGlzIGEgbG9uZyBzbyB0aGF0ICJlbGVtZW50cyIgaXMgYWxpZ25lZCAqLworICBsb25nIHVzZWRfc29fZmFyOyAgICAgLyoqPCBieXRlcyBvZiB0aGlzIGJsb2NrIGFscmVhZHkgYWxsb2NhdGVkIGFzIGVsZW1lbnRzLiAqLworICAKKyAgdW5zaWduZWQgY2hhciBlbGVtZW50c1tFTEVNRU5UX1BBRERJTkddOyAvKio8IHRoZSBibG9jayBkYXRhLCBhY3R1YWxseSBhbGxvY2F0ZWQgdG8gcmVxdWlyZWQgc2l6ZSAqLworfTsKKworLyoqCisgKiBJbnRlcm5hbHMgZmllbGRzIG9mIERCdXNNZW1Qb29sCisgKi8KK3N0cnVjdCBEQnVzTWVtUG9vbAoreworICBpbnQgZWxlbWVudF9zaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgYSBzaW5nbGUgb2JqZWN0IGluIHRoZSBwb29sICovCisgIGludCBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBibG9jayAqLworICB1bnNpZ25lZCBpbnQgemVyb19lbGVtZW50cyA6IDE7ICAvKio8IHdoZXRoZXIgdG8gemVyby1pbml0IGFsbG9jYXRlZCBlbGVtZW50cyAqLworCisgIERCdXNGcmVlZEVsZW1lbnQgKmZyZWVfZWxlbWVudHM7IC8qKjwgYSBmcmVlIGxpc3Qgb2YgZWxlbWVudHMgdG8gcmVjeWNsZSAqLworICBEQnVzTWVtQmxvY2sgKmJsb2NrczsgICAgICAgICAgICAvKio8IGJsb2NrcyBvZiBtZW1vcnkgZnJvbSBtYWxsb2MoKSAqLworICBpbnQgYWxsb2NhdGVkX2VsZW1lbnRzOyAgICAgICAgICAvKio8IENvdW50IG9mIG91dHN0YW5kaW5nIGFsbG9jYXRlZCBlbGVtZW50cyAqLworfTsKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbVBvb2wKKyAqCisgKiBAeworICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c01lbVBvb2wKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIG1lbW9yeSBwb29sLiBNZW1vcnkgcG9vbHMgYWxsb3cKKyAqIGF2b2lkaW5nIHBlci1tYWxsb2MtYmxvY2sgbWVtb3J5IG92ZXJoZWFkIHdoZW4gYWxsb2NhdGluZyBhIGxvdCBvZgorICogc21hbGwgb2JqZWN0cyB0aGF0IGFyZSBhbGwgdGhlIHNhbWUgc2l6ZS4gVGhleSBhcmUgc2xpZ2h0bHkKKyAqIGZhc3RlciB0aGFuIGNhbGxpbmcgbWFsbG9jKCkgYWxzby4KKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVtb3J5IHBvb2wsIG9yIHJldHVybnMgI05VTEwgb24gZmFpbHVyZS4gIE9iamVjdHMgaW4KKyAqIHRoZSBwb29sIG11c3QgYmUgYXQgbGVhc3Qgc2l6ZW9mKHZvaWQqKSBieXRlcyBlYWNoLCBkdWUgdG8gdGhlIHdheQorICogbWVtb3J5IHBvb2xzIHdvcmsuIFRvIGF2b2lkIGNyZWF0aW5nIDY0IGJpdCBwcm9ibGVtcywgdGhpcyBtZWFucyBhdAorICogbGVhc3QgOCBieXRlcyBvbiBhbGwgcGxhdGZvcm1zLCB1bmxlc3MgeW91IGFyZSA0IGJ5dGVzIG9uIDMyLWJpdAorICogYW5kIDggYnl0ZXMgb24gNjQtYml0LgorICoKKyAqIEBwYXJhbSBlbGVtZW50X3NpemUgc2l6ZSBvZiBhbiBlbGVtZW50IGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sLgorICogQHBhcmFtIHplcm9fZWxlbWVudHMgd2hldGhlciB0byB6ZXJvLWluaXRpYWxpemUgZWxlbWVudHMKKyAqIEByZXR1cm5zIHRoZSBuZXcgcG9vbCBvciAjTlVMTAorICovCitEQnVzTWVtUG9vbCoKK19kYnVzX21lbV9wb29sX25ldyAoaW50IGVsZW1lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgemVyb19lbGVtZW50cykKK3sKKyAgREJ1c01lbVBvb2wgKnBvb2w7CisKKyAgcG9vbCA9IGRidXNfbmV3MCAoREJ1c01lbVBvb2wsIDEpOworICBpZiAocG9vbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE1ha2UgdGhlIGVsZW1lbnQgc2l6ZSBhdCBsZWFzdCA4IGJ5dGVzLiAqLworICBpZiAoZWxlbWVudF9zaXplIDwgOCkKKyAgICBlbGVtZW50X3NpemUgPSA4OworICAKKyAgLyogdGhlc2UgYXNzZXJ0aW9ucyBhcmUgZXF1aXZhbGVudCBidXQgdGhlIGZpcnN0IGlzIG1vcmUgY2xlYXIKKyAgICogdG8gcHJvZ3JhbW1lcnMgdGhhdCBzZWUgaXQgZmFpbC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoZWxlbWVudF9zaXplID49IChpbnQpIHNpemVvZiAodm9pZCopKTsKKyAgX2RidXNfYXNzZXJ0IChlbGVtZW50X3NpemUgPj0gKGludCkgc2l6ZW9mIChEQnVzRnJlZWRFbGVtZW50KSk7CisKKyAgLyogYWxpZ24gdGhlIGVsZW1lbnQgc2l6ZSB0byBhIHBvaW50ZXIgYm91bmRhcnkgc28gd2Ugd29uJ3QgZ2V0IGJ1cworICAgKiBlcnJvcnMgdW5kZXIgb3RoZXIgYXJjaGl0ZWN0dXJlcy4gIAorICAgKi8KKyAgcG9vbC0+ZWxlbWVudF9zaXplID0gX0RCVVNfQUxJR05fVkFMVUUgKGVsZW1lbnRfc2l6ZSwgc2l6ZW9mICh2b2lkICopKTsKKworICBwb29sLT56ZXJvX2VsZW1lbnRzID0gemVyb19lbGVtZW50cyAhPSBGQUxTRTsKKworICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgPSAwOworICAKKyAgLyogcGljayBhIHNpemUgZm9yIHRoZSBmaXJzdCBibG9jazsgaXQgaW5jcmVhc2VzCisgICAqIGZvciBlYWNoIGJsb2NrIHdlIG5lZWQgdG8gYWxsb2NhdGUuIFRoaXMgaXMKKyAgICogYWN0dWFsbHkgaGFsZiB0aGUgaW5pdGlhbCBibG9jayBzaXplCisgICAqIHNpbmNlIF9kYnVzX21lbV9wb29sX2FsbG9jKCkgdW5jb25kaXRpb25hbGx5CisgICAqIGRvdWJsZXMgaXQgcHJpb3IgdG8gY3JlYXRpbmcgYSBuZXcgYmxvY2suICAqLworICBwb29sLT5ibG9ja19zaXplID0gcG9vbC0+ZWxlbWVudF9zaXplICogODsKKworICBfZGJ1c19hc3NlcnQgKChwb29sLT5ibG9ja19zaXplICUKKyAgICAgICAgICAgICAgICAgcG9vbC0+ZWxlbWVudF9zaXplKSA9PSAwKTsKKworICBWQUxHUklORF9DUkVBVEVfTUVNUE9PTCAocG9vbCwgMCwgemVyb19lbGVtZW50cyk7CisKKyAgcmV0dXJuIHBvb2w7Cit9CisKKy8qKgorICogRnJlZXMgYSBtZW1vcnkgcG9vbCAoYW5kIGFsbCBlbGVtZW50cyBhbGxvY2F0ZWQgZnJvbSBpdCkuCisgKgorICogQHBhcmFtIHBvb2wgdGhlIG1lbW9yeSBwb29sLgorICovCit2b2lkCitfZGJ1c19tZW1fcG9vbF9mcmVlIChEQnVzTWVtUG9vbCAqcG9vbCkKK3sKKyAgREJ1c01lbUJsb2NrICpibG9jazsKKworICBWQUxHUklORF9ERVNUUk9ZX01FTVBPT0wgKHBvb2wpOworCisgIGJsb2NrID0gcG9vbC0+YmxvY2tzOworICB3aGlsZSAoYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKm5leHQgPSBibG9jay0+bmV4dDsKKworICAgICAgZGJ1c19mcmVlIChibG9jayk7CisKKyAgICAgIGJsb2NrID0gbmV4dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChwb29sKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIG1lbW9yeSBwb29sLgorICogVGhlIG9iamVjdCBtdXN0IGJlIGZyZWVkIHdpdGggX2RidXNfbWVtX3Bvb2xfZGVhbGxvYygpLgorICoKKyAqIEBwYXJhbSBwb29sIHRoZSBtZW1vcnkgcG9vbAorICogQHJldHVybnMgdGhlIGFsbG9jYXRlZCBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCit2b2lkKgorX2RidXNfbWVtX3Bvb2xfYWxsb2MgKERCdXNNZW1Qb29sICpwb29sKQoreworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGlmIChfZGJ1c19kaXNhYmxlX21lbV9wb29scyAoKSkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgaW50IGFsbG9jX3NpemU7CisgICAgICAKKyAgICAgIC8qIFRoaXMgaXMgb2J2aW91c2x5IHJlYWxseSBzaWxseSwgYnV0IGl0J3MKKyAgICAgICAqIGRlYnVnLW1vZGUtb25seSBjb2RlIHRoYXQgaXMgY29tcGlsZWQgb3V0CisgICAgICAgKiB3aGVuIHRlc3RzIGFyZSBkaXNhYmxlZCAoX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMoKQorICAgICAgICogaXMgYSBjb25zdGFudCBleHByZXNzaW9uIEZBTFNFIHNvIHRoaXMgYmxvY2sKKyAgICAgICAqIHNob3VsZCB2YW5pc2gpCisgICAgICAgKi8KKyAgICAgIAorICAgICAgYWxsb2Nfc2l6ZSA9IHNpemVvZiAoREJ1c01lbUJsb2NrKSAtIEVMRU1FTlRfUEFERElORyArCisgICAgICAgIHBvb2wtPmVsZW1lbnRfc2l6ZTsKKyAgICAgIAorICAgICAgaWYgKHBvb2wtPnplcm9fZWxlbWVudHMpCisgICAgICAgIGJsb2NrID0gZGJ1c19tYWxsb2MwIChhbGxvY19zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYyAoYWxsb2Nfc2l6ZSk7CisKKyAgICAgIGlmIChibG9jayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgYmxvY2stPm5leHQgPSBwb29sLT5ibG9ja3M7CisgICAgICAgICAgcG9vbC0+YmxvY2tzID0gYmxvY2s7CisgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzICs9IDE7CisKKyAgICAgICAgICBWQUxHUklORF9NRU1QT09MX0FMTE9DIChwb29sLCAodm9pZCAqKSAmYmxvY2stPmVsZW1lbnRzWzBdLAorICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpOworICAgICAgICAgIHJldHVybiAodm9pZCopICZibG9jay0+ZWxlbWVudHNbMF07CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgRkFJTElORyBtZW1wb29sIGFsbG9jXG4iKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocG9vbC0+ZnJlZV9lbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgIERCdXNGcmVlZEVsZW1lbnQgKmVsZW1lbnQgPSBwb29sLT5mcmVlX2VsZW1lbnRzOworCisgICAgICAgICAgcG9vbC0+ZnJlZV9lbGVtZW50cyA9IHBvb2wtPmZyZWVfZWxlbWVudHMtPm5leHQ7CisKKyAgICAgICAgICBWQUxHUklORF9NRU1QT09MX0FMTE9DIChwb29sLCBlbGVtZW50LCBwb29sLT5lbGVtZW50X3NpemUpOworCisgICAgICAgICAgaWYgKHBvb2wtPnplcm9fZWxlbWVudHMpCisgICAgICAgICAgICBtZW1zZXQgKGVsZW1lbnQsICdcMCcsIHBvb2wtPmVsZW1lbnRfc2l6ZSk7CisKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB2b2lkICplbGVtZW50OworICAgICAgCisgICAgICAgICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgPT0gcG9vbC0+YmxvY2tfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTmVlZCBhIG5ldyBibG9jayAqLworICAgICAgICAgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgICAgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgICAgICAgICBpbnQgc2F2ZWRfY291bnRlcjsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAocG9vbC0+YmxvY2tfc2l6ZSA8PSBfREJVU19JTlRfTUFYIC8gNCkgLyogYXZvaWQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiB1c2UgYSBsYXJnZXIgYmxvY2sgc2l6ZSBmb3Igb3VyIG5leHQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICAgIHBvb2wtPmJsb2NrX3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKHBvb2wtPmJsb2NrX3NpemUgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbC0+ZWxlbWVudF9zaXplKSA9PSAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA9IHNpemVvZiAoREJ1c01lbUJsb2NrKSAtIEVMRU1FTlRfUEFERElORyArIHBvb2wtPmJsb2NrX3NpemU7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgICAgICAgICAvKiBXZSBzYXZlL3Jlc3RvcmUgdGhlIGNvdW50ZXIsIHNvIHRoYXQgbWVtb3J5IHBvb2xzIHdvbid0CisgICAgICAgICAgICAgICAqIGNhdXNlIGEgZ2l2ZW4gZnVuY3Rpb24gdG8gaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAqIGFsbG9jYXRpb25zIG9uIGRpZmZlcmVudCBpbnZvY2F0aW9ucy4gaS5lLiAgd2hlbiB0ZXN0aW5nCisgICAgICAgICAgICAgICAqIHdlIHdhbnQgY29uc2lzdGVudCBhbGxvYyBwYXR0ZXJucy4gU28gd2Ugc2tpcCBvdXIKKyAgICAgICAgICAgICAgICogbWFsbG9jIGhlcmUgZm9yIHB1cnBvc2VzIG9mIGZhaWxlZCBhbGxvYyBzaW11bGF0aW9uLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgc2F2ZWRfY291bnRlciA9IF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgKCk7CisgICAgICAgICAgICAgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKF9EQlVTX0lOVF9NQVgpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChwb29sLT56ZXJvX2VsZW1lbnRzKQorICAgICAgICAgICAgICAgIGJsb2NrID0gZGJ1c19tYWxsb2MwIChhbGxvY19zaXplKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJsb2NrID0gZGJ1c19tYWxsb2MgKGFsbG9jX3NpemUpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgICAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoc2F2ZWRfY291bnRlcik7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2F2ZWRfY291bnRlciA9PSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgICBibG9jay0+dXNlZF9zb19mYXIgPSAwOworICAgICAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICAgICAgcG9vbC0+YmxvY2tzID0gYmxvY2s7ICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgZWxlbWVudCA9ICZwb29sLT5ibG9ja3MtPmVsZW1lbnRzW3Bvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXJdOworICAgICAgICAgIAorICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgKz0gcG9vbC0+ZWxlbWVudF9zaXplOworCisgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzICs9IDE7CisKKyAgICAgICAgICBWQUxHUklORF9NRU1QT09MX0FMTE9DIChwb29sLCBlbGVtZW50LCBwb29sLT5lbGVtZW50X3NpemUpOworICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGFuIG9iamVjdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2l0aAorICogX2RidXNfbWVtX3Bvb2xfYWxsb2MoKS4gVGhlIHByZXZpb3VzIG9iamVjdAorICogbXVzdCBoYXZlIGNvbWUgZnJvbSB0aGlzIHNhbWUgcG9vbC4KKyAqIEBwYXJhbSBwb29sIHRoZSBtZW1vcnkgcG9vbAorICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgZWFybGllciBhbGxvY2F0ZWQuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGFsbG9jYXRlZCBlbGVtZW50cworICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAoREJ1c01lbVBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZWxlbWVudCkKK3sKKyAgVkFMR1JJTkRfTUVNUE9PTF9GUkVFIChwb29sLCBlbGVtZW50KTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGlmIChfZGJ1c19kaXNhYmxlX21lbV9wb29scyAoKSkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgREJ1c01lbUJsb2NrICpwcmV2OworCisgICAgICAvKiBtbW0sIGZhc3QuIDstKSBkZWJ1Zy1vbmx5IGNvZGUsIHNvIGRvZXNuJ3QgbWF0dGVyLiAqLworICAgICAgCisgICAgICBwcmV2ID0gTlVMTDsKKyAgICAgIGJsb2NrID0gcG9vbC0+YmxvY2tzOworCisgICAgICB3aGlsZSAoYmxvY2sgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChibG9jay0+ZWxlbWVudHMgPT0gKHVuc2lnbmVkIGNoYXIqKSBlbGVtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRidXNfZnJlZSAoYmxvY2spOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID4gMCk7CisgICAgICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyAtPSAxOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9PSAwKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YmxvY2tzID09IE5VTEwpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcmV0dXJuIHBvb2wtPmJsb2NrcyA9PSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIHByZXYgPSBibG9jazsKKyAgICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZyZWVkIG5vbmV4aXN0ZW50IGJsb2NrIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBEQnVzRnJlZWRFbGVtZW50ICpmcmVlZDsKKyAgICAgIAorICAgICAgZnJlZWQgPSBlbGVtZW50OworICAgICAgLyogdXNlZCBmb3IgaW50ZXJuYWwgbWVtcG9vbCBhZG1pbmlzdHJhdGlvbiAqLworICAgICAgVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEIChmcmVlZCwgc2l6ZW9mICgqZnJlZWQpKTsKKworICAgICAgZnJlZWQtPm5leHQgPSBwb29sLT5mcmVlX2VsZW1lbnRzOworICAgICAgcG9vbC0+ZnJlZV9lbGVtZW50cyA9IGZyZWVkOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA+IDApOworICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzIC09IDE7CisgICAgICAKKyAgICAgIHJldHVybiBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgPT0gMDsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUwordm9pZAorX2RidXNfbWVtX3Bvb2xfZ2V0X3N0YXRzIChEQnVzTWVtUG9vbCAgICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl91c2VfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmFsbG9jYXRlZF9wKQoreworICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICBEQnVzRnJlZWRFbGVtZW50ICpmcmVlZDsKKyAgZGJ1c191aW50MzJfdCBpbl91c2UgPSAwOworICBkYnVzX3VpbnQzMl90IGluX2ZyZWVfbGlzdCA9IDA7CisgIGRidXNfdWludDMyX3QgYWxsb2NhdGVkID0gMDsKKworICBpZiAocG9vbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGluX3VzZSA9IHBvb2wtPmVsZW1lbnRfc2l6ZSAqIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50czsKKworICAgICAgZm9yIChmcmVlZCA9IHBvb2wtPmZyZWVfZWxlbWVudHM7IGZyZWVkICE9IE5VTEw7IGZyZWVkID0gZnJlZWQtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICBpbl9mcmVlX2xpc3QgKz0gcG9vbC0+ZWxlbWVudF9zaXplOworICAgICAgICB9CisKKyAgICAgIGZvciAoYmxvY2sgPSBwb29sLT5ibG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYmxvY2sgPT0gcG9vbC0+YmxvY2tzKQorICAgICAgICAgICAgYWxsb2NhdGVkICs9IHBvb2wtPmJsb2NrX3NpemU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYWxsb2NhdGVkICs9IGJsb2NrLT51c2VkX3NvX2ZhcjsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoaW5fdXNlX3AgIT0gTlVMTCkKKyAgICAqaW5fdXNlX3AgPSBpbl91c2U7CisKKyAgaWYgKGluX2ZyZWVfbGlzdF9wICE9IE5VTEwpCisgICAgKmluX2ZyZWVfbGlzdF9wID0gaW5fZnJlZV9saXN0OworCisgIGlmIChhbGxvY2F0ZWRfcCAhPSBOVUxMKQorICAgICphbGxvY2F0ZWRfcCA9IGFsbG9jYXRlZDsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9TVEFUUyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyB2b2lkCit0aW1lX2Zvcl9zaXplIChpbnQgc2l6ZSkKK3sKKyAgaW50IGk7CisgIGludCBqOworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBjbG9ja190IHN0YXJ0OworICBjbG9ja190IGVuZDsKKyNlbmRpZgorI2RlZmluZSBGUkVFX0FSUkFZX1NJWkUgNTEyCisjZGVmaW5lIE5fSVRFUkFUSU9OUyBGUkVFX0FSUkFZX1NJWkUgKiA1MTIKKyAgdm9pZCAqdG9fZnJlZVtGUkVFX0FSUkFZX1NJWkVdOworICBEQnVzTWVtUG9vbCAqcG9vbDsKKworICBfZGJ1c192ZXJib3NlICgiVGltaW5ncyBmb3Igc2l6ZSAlZFxuIiwgc2l6ZSk7CisgIAorICBfZGJ1c192ZXJib3NlICgiIG1hbGxvY1xuIik7CisgIAorI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBzdGFydCA9IGNsb2NrICgpOworI2VuZGlmCisKKyAgaSA9IDA7CisgIGogPSAwOworICB3aGlsZSAoaSA8IE5fSVRFUkFUSU9OUykKKyAgICB7CisgICAgICB0b19mcmVlW2pdID0gZGJ1c19tYWxsb2MgKHNpemUpOworICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAodG9fZnJlZVtqXSk7CisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworCisKKworICBfZGJ1c192ZXJib3NlICgiIG1lbXBvb2xzXG4iKTsKKyAgCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisjZW5kaWYKKworICBwb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplLCBGQUxTRSk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAocG9vbCk7IAorICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChwb29sLCB0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19tZW1fcG9vbF9mcmVlIChwb29sKTsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKKworICBfZGJ1c192ZXJib3NlICgiIHplcm9lZCBtYWxsb2NcbiIpOworICAgIAorICBzdGFydCA9IGNsb2NrICgpOworI2VuZGlmCisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBkYnVzX21hbGxvYzAgKHNpemUpOworICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAodG9fZnJlZVtqXSk7CisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIiB6ZXJvZWQgbWVtcG9vbHNcbiIpOworICAKKyAgc3RhcnQgPSBjbG9jayAoKTsKKyNlbmRpZgorCisgIHBvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemUsIFRSVUUpOworICAKKyAgaSA9IDA7CisgIGogPSAwOworICB3aGlsZSAoaSA8IE5fSVRFUkFUSU9OUykKKyAgICB7CisgICAgICB0b19mcmVlW2pdID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHBvb2wpOyAKKyAgICAgIF9kYnVzX2Fzc2VydCAodG9fZnJlZVtqXSAhPSBOVUxMKTsgIC8qIGluIGEgcmVhbCBhcHAgb2YgY291cnNlIHRoaXMgaXMgd3JvbmcgKi8KKworICAgICAgKytqOworCisgICAgICBpZiAoaiA9PSBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgICB3aGlsZSAoaiA8IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAocG9vbCwgdG9fZnJlZVtqXSk7CisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfbWVtX3Bvb2xfZnJlZSAocG9vbCk7CisgIAorI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBlbmQgPSBjbG9jayAoKTsKKworICBfZGJ1c192ZXJib3NlICgiICBjcmVhdGVkL2Rlc3Ryb3llZCAlZCBlbGVtZW50cyBpbiAlZyBzZWNvbmRzXG4iLAorICAgICAgICAgICAgICAgICBOX0lURVJBVElPTlMsIChlbmQgLSBzdGFydCkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQyk7CisjZW5kaWYKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWVtUG9vbEludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTWVtUG9vbAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lbV9wb29sX3Rlc3QgKHZvaWQpCit7CisgIGludCBpOworICBpbnQgZWxlbWVudF9zaXplc1tdID0geyA0LCA4LCAxNiwgNTAsIDEyNCB9OworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZWxlbWVudF9zaXplcykpCisgICAgeworICAgICAgdGltZV9mb3Jfc2l6ZSAoZWxlbWVudF9zaXplc1tpXSk7CisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1lbXBvb2wuaCBiL2RidXMvZGJ1cy1tZW1wb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NjVhYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZW1wb29sLmgKQEAgLTAsMCArMSw1NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbXBvb2wuaCBNZW1vcnkgcG9vbHMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NRU1QT09MX0gKKyNkZWZpbmUgREJVU19NRU1QT09MX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lbVBvb2wgREJ1c01lbVBvb2w7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNNZW1Qb29sKiBfZGJ1c19tZW1fcG9vbF9uZXcgICAgIChpbnQgICAgICAgICAgZWxlbWVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICB6ZXJvX2VsZW1lbnRzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlICAgIChEQnVzTWVtUG9vbCAqcG9vbCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICAgX2RidXNfbWVtX3Bvb2xfYWxsb2MgICAoREJ1c01lbVBvb2wgKnBvb2wpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKERCdXNNZW1Qb29sICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICplbGVtZW50KTsKKworLyogaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK3ZvaWQgICAgICAgICBfZGJ1c19tZW1fcG9vbF9nZXRfc3RhdHMgKERCdXNNZW1Qb29sICAgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl91c2VfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmluX2ZyZWVfbGlzdF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19NRU1QT09MX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYyBiL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQyZTRjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCkBAIC0wLDAgKzEsMTMwNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIEdlbmVyYXRvciBvZiB2YWxpZCBhbmQgaW52YWxpZCBtZXNzYWdlIGRhdGEgZm9yIHRlc3Qgc3VpdGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtbWVzc2FnZS1mYWN0b3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bQorICB7CisgICAgQ0hBTkdFX1RZUEVfQURKVVNULAorICAgIENIQU5HRV9UWVBFX0FCU09MVVRFCisgIH0gQ2hhbmdlVHlwZTsKKworI2RlZmluZSBCWVRFX09SREVSX09GRlNFVCAgMAorI2RlZmluZSBUWVBFX09GRlNFVCAgICAgICAgMQorI2RlZmluZSBCT0RZX0xFTkdUSF9PRkZTRVQgNAorI2RlZmluZSBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCAxMgorCitzdGF0aWMgdm9pZAoraXRlcl9yZWN1cnNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpdGVyLT5kZXB0aCArPSAxOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoIDwgX0RCVVNfTUVTU0FHRV9EQVRBX01BWF9ORVNUSU5HKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdID49IDApOworfQorCitzdGF0aWMgaW50CitpdGVyX2dldF9zZXF1ZW5jZSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdID49IDApOworICByZXR1cm4gaXRlci0+c2VxdWVuY2Vfbm9zW2l0ZXItPmRlcHRoXTsKK30KKworc3RhdGljIHZvaWQKK2l0ZXJfc2V0X3NlcXVlbmNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKQoreworICBfZGJ1c19hc3NlcnQgKHNlcXVlbmNlID49IDApOworICBpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdID0gc2VxdWVuY2U7Cit9CisKK3N0YXRpYyB2b2lkCitpdGVyX3VucmVjdXJzZSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaXRlci0+ZGVwdGggLT0gMTsKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA+PSAwKTsKK30KKworc3RhdGljIHZvaWQKK2l0ZXJfbmV4dCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaXRlci0+c2VxdWVuY2Vfbm9zW2l0ZXItPmRlcHRoXSArPSAxOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2l0ZXJfZmlyc3RfaW5fc2VyaWVzIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpbnQgaTsKKworICBpID0gaXRlci0+ZGVwdGg7CisgIHdoaWxlIChpIDwgX0RCVVNfTUVTU0FHRV9EQVRBX01BWF9ORVNUSU5HKQorICAgIHsKKyAgICAgIGlmIChpdGVyLT5zZXF1ZW5jZV9ub3NbaV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytpOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0lubmVyR2VuZXJhdG9yRnVuYykgICAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICoqbWVzc2FnZV9wKTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c01lc3NhZ2VHZW5lcmF0b3JGdW5jKSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpOworCitzdGF0aWMgdm9pZAorc2V0X3JlcGx5X3NlcmlhbCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsIDEwMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdHJpdmlhbF9pbm5lciAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqKm1lc3NhZ2VfcCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgc3dpdGNoIChpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcikpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5Eb2N1bWVudEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKTsKKyAgICAgIHNldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2Zvby9iYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRvY3VtZW50RmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVkIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RFcnJvck5hbWUiKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIHsKKyAgICAgICAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgICAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gIlRoaXMgaXMgYW4gZXJyb3IiOworICAgICAgICAKKyAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICB9CisgICAgICAKKyAgICAgIHNldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICptZXNzYWdlX3AgPSBtZXNzYWdlOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfbWFueV9ib2RpZXNfaW5uZXIgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICoqbWVzc2FnZV9wKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c1N0cmluZyBzaWduYXR1cmU7CisgIERCdXNTdHJpbmcgYm9keTsKKyAgY2hhciBieXRlX29yZGVyOworCisgIC8qIEtlZXBpbmcgdGhpcyBzbWFsbCBtYWtlcyB0aGluZ3MgZ28gZmFzdGVyICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgiby56LkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm8uei5CIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYWgiKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBieXRlX29yZGVyID0gX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKTsKKworICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZib2R5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgCisgIGlmIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChpdGVyX2dldF9zZXF1ZW5jZSAoaXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU0lHTkFUVVJFOworCisgICAgICB2X1NJR05BVFVSRSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNpZ25hdHVyZSk7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU0lHTkFUVVJFKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZib2R5LCAwLCAmbWVzc2FnZS0+Ym9keSwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKTsKKyAgICAgIAorICAgICAgKm1lc3NhZ2VfcCA9IG1lc3NhZ2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICptZXNzYWdlX3AgPSBOVUxMOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZib2R5KTsKKworICByZXR1cm4gKm1lc3NhZ2VfcCAhPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAqbWVzc2FnZSkKK3sKKyAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIDEpOworICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgCisgIC8qIG1vdmUgZm9yIGVmZmljaWVuY3ksIHNpbmNlIHdlJ2xsIG51a2UgdGhlIG1lc3NhZ2UgYW55d2F5ICovCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfb3V0ZXIgKERCdXNNZXNzYWdlRGF0YUl0ZXIgICAqaXRlciwKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICBEQnVzSW5uZXJHZW5lcmF0b3JGdW5jIGZ1bmMpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIG1lc3NhZ2UgPSBOVUxMOworICBpZiAoISgqZnVuYykoaXRlciwgJm1lc3NhZ2UpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX25leHQgKGl0ZXIpOworICAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworCisgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdHJpdmlhbCAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgcmV0dXJuIGdlbmVyYXRlX291dGVyIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV90cml2aWFsX2lubmVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9tYW55X2JvZGllcyAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICByZXR1cm4gZ2VuZXJhdGVfb3V0ZXIgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX21hbnlfYm9kaWVzX2lubmVyKTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX21ldGhvZF9jYWxsICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgLyogS2VlcGluZyB0aGlzIHNtYWxsIG1ha2VzIHN0dWZmIGdvIGZhc3RlciAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm8uYi5RIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZi9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvLmIuWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJvIik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfc2lnbmFsICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2YvYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm8uYi5aIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJvIik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfbWV0aG9kX3JldHVybiAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIG1lc3NhZ2UgPSAgZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIAorICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX2Vycm9yICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9ICBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsICJmb28uYmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIAorICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgCisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCittZXNzYWdlX3dpdGhfbmVzdGluZ19sZXZlbHMgKGludCBsZXZlbHMpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgREJ1c01lc3NhZ2VJdGVyICpwYXJlbnRzOworICBEQnVzTWVzc2FnZUl0ZXIgKmNoaWxkcmVuOworICBpbnQgaTsKKworICAvKiBJZiBsZXZlbHMgaXMgaGlnaGVyIGl0IGJyZWFrcyBzaWdfcmVmY291bnQgaW4gREJ1c01lc3NhZ2VSZWFsSXRlcgorICAgKiBpbiBkYnVzLW1lc3NhZ2UuYywgdGhpcyBhc3NlcnQgaXMganVzdCB0byBoZWxwIHlvdSBrbm93IHlvdSBuZWVkCisgICAqIHRvIGZpeCB0aGF0IGlmIHlvdSBoaXQgaXQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAobGV2ZWxzIDwgMjU2KTsKKworICBwYXJlbnRzID0gZGJ1c19uZXcoREJ1c01lc3NhZ2VJdGVyLCBsZXZlbHMgKyAxKTsKKyAgY2hpbGRyZW4gPSBkYnVzX25ldyhEQnVzTWVzc2FnZUl0ZXIsIGxldmVscyArIDEpOworCisgIHZfSU5UMzIgPSA0MjsKKyAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICBpID0gMDsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZwYXJlbnRzW2ldKTsKKyAgd2hpbGUgKGkgPCBsZXZlbHMpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZwYXJlbnRzW2ldLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09IChsZXZlbHMgLSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZHJlbltpXSk7CisgICAgICArK2k7CisgICAgICBwYXJlbnRzW2ldID0gY2hpbGRyZW5baS0xXTsKKyAgICB9CisgIC0taTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmY2hpbGRyZW5baV0sIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIpOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnBhcmVudHNbaV0sICZjaGlsZHJlbltpXSk7CisgICAgICAtLWk7CisgICAgfQorCisgIGRidXNfZnJlZShwYXJlbnRzKTsKKyAgZGJ1c19mcmVlKGNoaWxkcmVuKTsKKworICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9zcGVjaWFsIChEQnVzTWVzc2FnZURhdGFJdGVyICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgaXRlbV9zZXE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgcG9zOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA9PSAwKTsKKyAgCisgIG1lc3NhZ2UgPSBOVUxMOworICBwb3MgPSAtMTsKKyAgdl9JTlQzMiA9IDQyOworICBpdGVtX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKworICBpZiAoaXRlbV9zZXEgPT0gMCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAvKiBzZXQgYW4gaW52YWxpZCB0eXBlY29kZSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCAnJCcpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEpCisgICAgeworICAgICAgY2hhciBsb25nX3NpZ1tEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgrMl07CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEggKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0FSUkFZOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKworICAgICAgdl9TVFJJTkcgPSBsb25nX3NpZzsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTjsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDIpCisgICAgeworICAgICAgY2hhciBsb25nX3NpZ1tEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqMis0XTsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDw9IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEggKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5UMzI7CisgICAgICArK2k7CisKKyAgICAgIHdoaWxlIChpIDwgKERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCoyICsgMykpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfU1RSVUNUX0VORF9DSEFSOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgIAorICAgICAgdl9TVFJJTkcgPSBsb25nX3NpZzsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAzKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA1KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUik7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNikKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgVFlQRV9PRkZTRVQsIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX01FU1NBR0VfVFlQRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDcpCisgICAgeworICAgICAgLyogTWVzc2FnZXMgb2YgdW5rbm93biB0eXBlIGFyZSBjb25zaWRlcmVkIHZhbGlkICovCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgVFlQRV9PRkZTRVQsIDEwMCk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA4KQorICAgIHsKKyAgICAgIGNoYXIgYnl0ZV9vcmRlcjsKKworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGJ5dGVfb3JkZXIgPSBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKCZtZXNzYWdlLT5oZWFkZXIpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoZGF0YSwgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEggLyAyICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7CisgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEggLyAyICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7CisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUVTU0FHRV9UT09fTE9ORzsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkcgPSAibm90IGEgdmFsaWQgYnVzIG5hbWUiOworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9TRU5ERVI7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxMCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9MT0NBTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTEpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsIERCVVNfUEFUSF9MT0NBTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEyKQorICAgIHsKKyAgICAgIC8qIE1ldGhvZCBjYWxscyBkb24ndCBoYXZlIHRvIGhhdmUgaW50ZXJmYWNlICovCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCBOVUxMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTMpCisgICAgeworICAgICAgLyogU2lnbmFscyByZXF1aXJlIGFuIGludGVyZmFjZSAqLworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9zaWduYWwgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX0lOVEVSRkFDRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE0KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX3JldHVybiAoKTsKKworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfZGVsZXRlX2ZpZWxkICgmbWVzc2FnZS0+aGVhZGVyLCBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE1KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfZXJyb3IgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLCBOVUxMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19FUlJPUl9OQU1FOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTYpCisgICAgeworICAgICAgY2hhciBsb25nX3NpZ1tEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqNCsxMF07CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgICAgIGludCBpOworICAgICAgaW50IG5fYmVnaW5zOworICAgICAgCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8PSAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKjMgKyAzKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0FSUkFZOworICAgICAgICAgICsraTsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSOworICAgICAgICAgICsraTsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIG5fYmVnaW5zID0gaSAvIDM7CisKKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVDMyOworICAgICAgKytpOworICAgICAgCisgICAgICB3aGlsZSAobl9iZWdpbnMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI7CisgICAgICAgICAgKytpOworICAgICAgICAgIG5fYmVnaW5zIC09IDE7CisgICAgICAgIH0KKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICAKKyAgICAgIHZfU1RSSU5HID0gbG9uZ19zaWc7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTjsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE3KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19UWVBFX0FSUkFZKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMiwgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9TVEFSVEVEX0JVVF9OT1RfRU5ERUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxOCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0VOREVEX0JVVF9OT1RfU1RBUlRFRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE5KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19UWVBFX0FSUkFZKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMiwgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAzLCBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMjApCisgICAgeworICAgICAgLyogNjQgbGV2ZWxzIG9mIG5lc3RpbmcgaXMgT0sgKi8KKyAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX3dpdGhfbmVzdGluZ19sZXZlbHMoNjQpOworCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDIxKQorICAgIHsKKyAgICAgIC8qIDY1IGxldmVscyBvZiBuZXN0aW5nIGlzIG5vdCBPSyAqLworICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Vfd2l0aF9uZXN0aW5nX2xldmVscyg2NSk7CisKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTkVTVEVEX1RPT19ERUVQTFk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX3dyb25nX2xlbmd0aCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBsZW5ndGhzW10gPSB7IC00MiwgLTE3LCAtMTYsIC0xNSwgLTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTUsIDE2LCAzMCB9OworICBpbnQgYWRqdXN0OworICBpbnQgbGVuX3NlcTsKKworIHJlc3RhcnQ6CisgIGxlbl9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIGlmIChsZW5fc2VxID09IF9EQlVTX05fRUxFTUVOVFMgKGxlbmd0aHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKGxlbl9zZXEgPCBfREJVU19OX0VMRU1FTlRTIChsZW5ndGhzKSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBpZiAoIWdlbmVyYXRlX21hbnlfYm9kaWVzIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgeworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOyAvKiByZXNldCB0byBmaXJzdCBib2R5ICovCisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOyAgICAgICAgICAgIC8qIG5leHQgbGVuZ3RoIGFkanVzdG1lbnQgKi8KKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBhZGp1c3QgPSBsZW5ndGhzW2xlbl9zZXFdOworCisgIGlmIChhZGp1c3QgPCAwKQorICAgIHsKKyAgICAgIGlmICgoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpICsgYWRqdXN0KSA8IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSkKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRhdGEsIERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSk7CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChkYXRhLCAtIGFkanVzdCk7CisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OOworICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChkYXRhLCBhZGp1c3QpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBOworICAgIH0KKworICAvKiBGaXh1cCBsZW5ndGhzICovCisgIHsKKyAgICBpbnQgb2xkX2JvZHlfbGVuOworICAgIGludCBuZXdfYm9keV9sZW47CisgICAgaW50IGJ5dGVfb3JkZXI7CisgICAgCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPj0gREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKTsKKyAgICAKKyAgICBieXRlX29yZGVyID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBCWVRFX09SREVSX09GRlNFVCk7CisgICAgb2xkX2JvZHlfbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBfZGJ1c19hc3NlcnQgKG9sZF9ib2R5X2xlbiA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisgICAgbmV3X2JvZHlfbGVuID0gb2xkX2JvZHlfbGVuICsgYWRqdXN0OworICAgIGlmIChuZXdfYm9keV9sZW4gPCAwKQorICAgICAgeworICAgICAgICBuZXdfYm9keV9sZW4gPSAwOworICAgICAgICAvKiB3ZSBqdXN0IG11bmdlZCB0aGUgaGVhZGVyLCBhbmQgYXJlbid0IHN1cmUgaG93ICovCisgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKyAgICAgIH0KKworICAgIF9kYnVzX3ZlcmJvc2UgKCJjaGFuZ2luZyBib2R5IGxlbiBmcm9tICV1IHRvICV1IGJ5IGFkanVzdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBvbGRfYm9keV9sZW4sIG5ld19ib2R5X2xlbiwgYWRqdXN0KTsKKyAgICAKKyAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19ib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfYnl0ZV9jaGFuZ2VkIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJ5dGVfc2VxOworICBpbnQgdl9CWVRFOworCisgIC8qIFRoaXMgaXMgYSBsaXR0bGUgY29udm9sdXRlZCB0byBtYWtlIHRoZSBib2RpZXMgdGhlCisgICAqIG91dGVyIGxvb3AgYW5kIGVhY2ggYnl0ZSBvZiBlYWNoIGJvZHkgdGhlIGlubmVyCisgICAqIGxvb3AKKyAgICovCisKKyByZXN0YXJ0OgorICBpZiAoIWdlbmVyYXRlX21hbnlfYm9kaWVzIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIGJ5dGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIAorICBpZiAoYnl0ZV9zZXEgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKyAgICAgIC8qIHJlc2V0IGJ5dGUgY291bnQgKi8KKyAgICAgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVW5kbyB0aGUgIm5leHQiIGluIGdlbmVyYXRlX21hbnlfYm9kaWVzICovCisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpIC0gMSk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworICB2X0JZVEUgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxKTsKKyAgdl9CWVRFICs9IGJ5dGVfc2VxOyAvKiBhcmJpdHJhcnkgYnV0IGRldGVybWluaXN0aWMgY2hhbmdlIHRvIHRoZSBieXRlICovCisgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgYnl0ZV9zZXEsIHZfQllURSk7CisgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmIDAKKy8qIFRoaXMgaXMgcmVhbGx5IGV4cGVuc2l2ZSBhbmQgZG9lc24ndCBhZGQgdG9vIG11Y2ggY292ZXJhZ2UgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX25leHRfdHlwZWNvZGUgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgYm9keV9zZXE7CisgIGludCBieXRlX3NlcTsKKyAgaW50IGJhc2VfZGVwdGg7CisKKyAgYmFzZV9kZXB0aCA9IGl0ZXItPmRlcHRoOworCisgcmVzdGFydDoKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRhdGEsIDApOworCisgIGJvZHlfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICAKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogVW5kbyB0aGUgIm5leHQiIGluIGdlbmVyYXRlX21hbnlfYm9kaWVzICovCisgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCBib2R5X3NlcSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICAgICAgCisgICAgICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworICAgICAgCisgICAgICBpZiAoYnl0ZV9zZXEgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgLyogcmVzZXQgYnl0ZSBjb3VudCAqLworICAgICAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgICAgICAgICBpdGVyX25leHQgKGl0ZXIpOyAvKiBnbyB0byB0aGUgbmV4dCBib2R5ICovCisgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworCisgICAgICBpZiAoZGJ1c190eXBlX2lzX3ZhbGlkIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxKSkpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZQorICAgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxID09IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworCisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgdHlwZWNvZGVzW10gPSB7CisgIERCVVNfVFlQRV9JTlZBTElELAorICBEQlVTX1RZUEVfQllURSwKKyAgREJVU19UWVBFX0JPT0xFQU4sCisgIERCVVNfVFlQRV9JTlQxNiwKKyAgREJVU19UWVBFX1VJTlQxNiwKKyAgREJVU19UWVBFX0lOVDMyLAorICBEQlVTX1RZUEVfVUlOVDMyLAorICBEQlVTX1RZUEVfSU5UNjQsCisgIERCVVNfVFlQRV9VSU5UNjQsCisgIERCVVNfVFlQRV9ET1VCTEUsCisgIERCVVNfVFlQRV9TVFJJTkcsCisgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgREJVU19UWVBFX0FSUkFZLAorICBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiwKKyAgREJVU19TVFJVQ1RfRU5EX0NIQVIsCisgIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSLAorICBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIsCisgIERCVVNfVFlQRV9VTklYX0ZELAorICAyNTUgLyogcmFuZG9tIGludmFsaWQgdHlwZWNvZGUgKi8KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdHlwZWNvZGVfY2hhbmdlZCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJ5dGVfc2VxOworICBpbnQgdHlwZWNvZGVfc2VxOworICBpbnQgYmFzZV9kZXB0aDsKKworICBiYXNlX2RlcHRoID0gaXRlci0+ZGVwdGg7CisKKyByZXN0YXJ0OgorICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisgIAorICBpZiAoIWZpbmRfbmV4dF90eXBlY29kZSAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIHR5cGVjb2RlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgaXRlcl9uZXh0IChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKHR5cGVjb2RlX3NlcSA8PSBfREJVU19OX0VMRU1FTlRTICh0eXBlY29kZXMpKTsKKyAgCisgIGlmICh0eXBlY29kZV9zZXEgPT0gX0RCVVNfTl9FTEVNRU5UUyAodHlwZWNvZGVzKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOyAvKiByZXNldCB0eXBlY29kZSBzZXF1ZW5jZSAqLworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7IC8qIGdvIHRvIHRoZSBuZXh0IGJ5dGVfc2VxICovCisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKworI2lmIDAKKyAgcHJpbnRmICgiQ2hhbmdpbmcgYnl0ZSAlZCBpbiBtZXNzYWdlICVkIHRvICVjXG4iLAorICAgICAgICAgIGJ5dGVfc2VxLCBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlciksIHR5cGVjb2Rlc1t0eXBlY29kZV9zZXFdKTsKKyNlbmRpZgorICAKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBieXRlX3NlcSwgdHlwZWNvZGVzW3R5cGVjb2RlX3NlcV0pOworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoYW5nZVR5cGUgdHlwZTsKKyAgZGJ1c191aW50MzJfdCB2YWx1ZTsgLyogY2FzdCB0byBzaWduZWQgZm9yIGFkanVzdHMgKi8KK30gVUludENoYW5nZTsKKworc3RhdGljIGNvbnN0IFVJbnRDaGFuZ2UgdWludDMyX2NoYW5nZXNbXSA9IHsKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAtMSB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIC0yIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgLTMgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgMiB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIDMgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCB9LAorICB7IENIQU5HRV9UWVBFX0FCU09MVVRFLCAwIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIDEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCAtIDEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCAtIDUgfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV91aW50MzJfY2hhbmdlZCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgYm9keV9zZXE7CisgIGludCBieXRlX3NlcTsKKyAgaW50IGNoYW5nZV9zZXE7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGludCBieXRlX29yZGVyOworICBjb25zdCBVSW50Q2hhbmdlICpjaGFuZ2U7CisgIGludCBiYXNlX2RlcHRoOworCisgIC8qIE91dGVyIGxvb3AgaXMgZWFjaCBib2R5LCBuZXh0IGxvb3AgaXMgZWFjaCBjaGFuZ2UsCisgICAqIGlubmVyIGxvb3AgaXMgZWFjaCBjaGFuZ2UgbG9jYXRpb24KKyAgICovCisKKyAgYmFzZV9kZXB0aCA9IGl0ZXItPmRlcHRoOworICAKKyBuZXh0X2JvZHk6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKyAgYm9keV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoIWdlbmVyYXRlX21hbnlfYm9kaWVzIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisKKyAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIGJvZHlfc2VxKTsgLyogdW5kbyB0aGUgIm5leHQiIGZyb20gZ2VuZXJhdGVfbWFueV9ib2RpZXMgKi8KKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyBuZXh0X2NoYW5nZToKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgY2hhbmdlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmIChjaGFuZ2Vfc2VxID09IF9EQlVTX05fRUxFTUVOVFMgKHVpbnQzMl9jaGFuZ2VzKSkKKyAgICB7CisgICAgICAvKiBSZXNldCBjaGFuZ2UgY291bnQgKi8KKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7CisgICAgICBnb3RvIG5leHRfYm9keTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAyKSk7CisgIGJ5dGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICAvKiBza2lwIDQgYnl0ZXMgYXQgYSB0aW1lICovCisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChieXRlX3NlcSwgNCkgPT0gKHVuc2lnbmVkKSBieXRlX3NlcSk7CisgIGlmIChieXRlX3NlcSA+PSAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpIC0gNCkpCisgICAgeworICAgICAgLyogcmVzZXQgYnl0ZSBjb3VudCAqLworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7CisgICAgICBnb3RvIG5leHRfY2hhbmdlOworICAgIH0KKyAgCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPD0gKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSAtIDQpKTsKKworICBieXRlX29yZGVyID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBCWVRFX09SREVSX09GRlNFVCk7CisgIAorICB2X1VJTlQzMiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKGRhdGEsIGJ5dGVfc2VxLCBieXRlX29yZGVyLCBOVUxMKTsKKworICBjaGFuZ2UgPSAmdWludDMyX2NoYW5nZXNbY2hhbmdlX3NlcV07CisKKyAgaWYgKGNoYW5nZS0+dHlwZSA9PSBDSEFOR0VfVFlQRV9BREpVU1QpCisgICAgeworICAgICAgdl9VSU5UMzIgKz0gKGludCkgY2hhbmdlLT52YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2X1VJTlQzMiA9IGNoYW5nZS0+dmFsdWU7CisgICAgfQorCisjaWYgMAorICBwcmludGYgKCJib2R5ICVkIGNoYW5nZSAlZCBwb3MgJWQgIiwKKyAgICAgICAgICBib2R5X3NlcSwgY2hhbmdlX3NlcSwgYnl0ZV9zZXEpOworCisgIGlmIChjaGFuZ2UtPnR5cGUgPT0gQ0hBTkdFX1RZUEVfQURKVVNUKQorICAgIHByaW50ZiAoImFkanVzdCBieSAlZCIsIChpbnQpIGNoYW5nZS0+dmFsdWUpOworICBlbHNlCisgICAgcHJpbnRmICgic2V0IHRvICV1IiwgY2hhbmdlLT52YWx1ZSk7CisgIAorICBwcmludGYgKCIgXHQldSAtPiAldVxuIiwKKyAgICAgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgYnl0ZV9vcmRlciwgTlVMTCksCisgICAgICAgICAgdl9VSU5UMzIpOworI2VuZGlmCisgIAorICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIGJ5dGVfc2VxLCB2X1VJTlQzMiwgYnl0ZV9vcmRlcik7CisgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgICAgICAgICAgCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMgZnVuYzsgIAorfSBEQnVzTWVzc2FnZUdlbmVyYXRvcjsKKworc3RhdGljIGNvbnN0IERCdXNNZXNzYWdlR2VuZXJhdG9yIGdlbmVyYXRvcnNbXSA9IHsKKyAgeyAidHJpdmlhbCBleGFtcGxlIG9mIGVhY2ggbWVzc2FnZSB0eXBlIiwgZ2VuZXJhdGVfdHJpdmlhbCB9LAorICB7ICJhc3NvcnRlZCBhcmd1bWVudHMiLCBnZW5lcmF0ZV9tYW55X2JvZGllcyB9LAorICB7ICJhc3NvcnRlZCBzcGVjaWFsIGNhc2VzIiwgZ2VuZXJhdGVfc3BlY2lhbCB9LAorICB7ICJlYWNoIHVpbnQzMiBtb2RpZmllZCIsIGdlbmVyYXRlX3VpbnQzMl9jaGFuZ2VkIH0sCisgIHsgIndyb25nIGJvZHkgbGVuZ3RocyIsIGdlbmVyYXRlX3dyb25nX2xlbmd0aCB9LAorICB7ICJlYWNoIGJ5dGUgbW9kaWZpZWQiLCBnZW5lcmF0ZV9ieXRlX2NoYW5nZWQgfSwKKyNpZiAwCisgIC8qIFRoaXMgaXMgcmVhbGx5IGV4cGVuc2l2ZSBhbmQgZG9lc24ndCBhZGQgdG9vIG11Y2ggY292ZXJhZ2UgKi8KKyAgeyAiY2hhbmdlIGVhY2ggdHlwZWNvZGUiLCBnZW5lcmF0ZV90eXBlY29kZV9jaGFuZ2VkIH0KKyNlbmRpZgorfTsKKwordm9pZAorX2RidXNfbWVzc2FnZV9kYXRhX2ZyZWUgKERCdXNNZXNzYWdlRGF0YSAqZGF0YSkKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhLT5kYXRhKTsKK30KKwordm9pZAorX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfaW5pdCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaW50IGk7CisgIAorICBpdGVyLT5kZXB0aCA9IDA7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElORykKKyAgICB7CisgICAgICBpdGVyLT5zZXF1ZW5jZV9ub3NbaV0gPSAwOworICAgICAgKytpOworICAgIH0KKyAgaXRlci0+Y291bnQgPSAwOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfZ2V0X2FuZF9uZXh0IChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZURhdGEgICAgICpkYXRhKQoreworICBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMgZnVuYzsKKyAgaW50IGdlbmVyYXRvcjsKKworIHJlc3RhcnQ6CisgIGdlbmVyYXRvciA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmIChnZW5lcmF0b3IgPT0gX0RCVVNfTl9FTEVNRU5UUyAoZ2VuZXJhdG9ycykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIAorICBpZiAoaXRlcl9maXJzdF9pbl9zZXJpZXMgKGl0ZXIpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiB0ZXN0aW5nIG1lc3NhZ2UgbG9hZGluZzogJXMgIiwgZ2VuZXJhdG9yc1tnZW5lcmF0b3JdLm5hbWUpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KKyAgCisgIGZ1bmMgPSBnZW5lcmF0b3JzW2dlbmVyYXRvcl0uZnVuYzsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YS0+ZGF0YSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIAorICBpZiAoKCpmdW5jKShpdGVyLCAmZGF0YS0+ZGF0YSwgJmRhdGEtPmV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICA7CisgIGVsc2UKKyAgICB7CisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOyAvKiBuZXh0IGdlbmVyYXRvciAqLworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhLT5kYXRhKTsKKyAgICAgIHByaW50ZiAoIiVkIHRlc3QgbG9hZHMgY3VtdWxhdGl2ZVxuIiwgaXRlci0+Y291bnQpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworCisgIGl0ZXItPmNvdW50ICs9IDE7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaCBiL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdhNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaCBHZW5lcmF0b3Igb2YgdmFsaWQgYW5kIGludmFsaWQgbWVzc2FnZSBkYXRhIGZvciB0ZXN0IHN1aXRlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUVTU0FHRV9GQUNUT1JZX0gKKyNkZWZpbmUgREJVU19NRVNTQUdFX0ZBQ1RPUllfSAorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c1ZhbGlkaXR5IGV4cGVjdGVkX3ZhbGlkaXR5OworICAKKyAgREJ1c1N0cmluZyBkYXRhOworCit9IERCdXNNZXNzYWdlRGF0YTsKKworI2RlZmluZSBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcgMTAKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBzZXF1ZW5jZV9ub3NbX0RCVVNfTUVTU0FHRV9EQVRBX01BWF9ORVNUSU5HXTsKKyAgaW50IGRlcHRoOworICBpbnQgY291bnQ7Cit9IERCdXNNZXNzYWdlRGF0YUl0ZXI7CisKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9mcmVlICAgICAgICAgICAgICAoREJ1c01lc3NhZ2VEYXRhICAgICAqZGF0YSk7Cit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2RhdGFfaXRlcl9pbml0ICAgICAgICAgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpOworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfZ2V0X2FuZF9uZXh0IChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZURhdGEgICAgICpkYXRhKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmggYi9kYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjRkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1pbnRlcm5hbC5oIERCdXNNZXNzYWdlIG9iamVjdCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19NRVNTQUdFX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19NRVNTQUdFX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcmVzb3VyY2VzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKworREJVU19CRUdJTl9ERUNMUworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCit2b2lkIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBvbGRfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbmV3X3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKndoeSk7CisjZWxzZQorLyogdGhpcyBieXBhc3NlcyBhbnkgInVudXNlZCIgd2FybmluZ3MgZm9yIHRoZSBvbGQgYW5kIG5ldyByZWZjb3VudCAqLworI2RlZmluZSBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZihtLCBvLCBuLCB3KSBcCisgIGRvIFwKKyAge1wKKyAgICAodm9pZCkgKG8pOyBcCisgICAgKHZvaWQpIChuKTsgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IERCdXNNZXNzYWdlTG9hZGVyIERCdXNNZXNzYWdlTG9hZGVyOworCit2b2lkIF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSAgKERCdXNNZXNzYWdlICAgICAgICptZXNzYWdlLAorCQkJCSAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipoZWFkZXIsCisJCQkJICAgICAgY29uc3QgREJ1c1N0cmluZyAqKmJvZHkpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyAgICAgIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbl9mZHMpOworCit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2xvY2sgICAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfdW5sb2NrICAgICAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAgICAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKmxpbmspOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzTWVzc2FnZUxvYWRlciogX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICAgICAgICAgICAgICAgICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNNZXNzYWdlTG9hZGVyKiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgICAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgICAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqKmJ1ZmZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAqYnVmZmVyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF91bml4X2ZkcyAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAqbWF4X25fZmRzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fdW5peF9mZHMgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgIG5fZmRzKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworREJ1c01lc3NhZ2UqICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BlZWtfbWVzc2FnZSAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c01lc3NhZ2UqICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlICAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworREJ1c0xpc3QqICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlX2xpbmsgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3B1dGJhY2tfbWVzc2FnZV9saW5rICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKmxpbmspOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CitEQnVzVmFsaWRpdHkgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2NvcnJ1cHRpb25fcmVhc29uIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBzaXplKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2xvbmcgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyhEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBuKTsKK2xvbmcgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworaW50ICAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9wZW5kaW5nX2Zkc19jb3VudCAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCogY2FsbGJhY2spICh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IERCdXNJbml0aWFsRkRzIERCdXNJbml0aWFsRkRzOworREJ1c0luaXRpYWxGRHMgKl9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKHZvaWQpOwordm9pZCAgICAgICAgICAgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKERCdXNJbml0aWFsRkRzICpmZHMpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19NRVNTQUdFX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCBiL2RidXMvZGJ1cy1tZXNzYWdlLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM0MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1wcml2YXRlLmggaGVhZGVyIHNoYXJlZCBiZXR3ZWVuIGRidXMtbWVzc2FnZS5jIGFuZCBkYnVzLW1lc3NhZ2UtdXRpbC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19NRVNTQUdFX1BSSVZBVEVfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfUFJJVkFURV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1kYXRhc2xvdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2VJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZUxvYWRlcgorICoKKyAqIFRoZSBEQnVzTWVzc2FnZUxvYWRlciBvYmplY3QgZW5jYXBzdWxhdGVzIHRoZSBwcm9jZXNzIG9mIGNvbnZlcnRpbmcKKyAqIGEgYnl0ZSBzdHJlYW0gaW50byBhIHNlcmllcyBvZiBEQnVzTWVzc2FnZS4gSXQgYnVmZmVycyB0aGUgaW5jb21pbmcKKyAqIGJ5dGVzIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLCBhbmQgZ2VuZXJhdGVzIGEgcXVldWUgb2YKKyAqIG1lc3NhZ2VzLiBEQnVzTWVzc2FnZUxvYWRlciBpcyB0eXBpY2FsbHkgdXNlZCBhcyBwYXJ0IG9mIGEKKyAqIERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24uIFRoZSBEQnVzVHJhbnNwb3J0IHRoZW4gaGFuZHMgb2ZmCisgKiB0aGUgbG9hZGVkIG1lc3NhZ2VzIHRvIGEgREJ1c0Nvbm5lY3Rpb24sIG1ha2luZyB0aGUgbWVzc2FnZXMKKyAqIHZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIEB0b2RvIHdyaXRlIHRlc3RzIGZvciBicmVhay1sb2FkZXIgdGhhdCBhKSByYW5kb21seSBkZWxldGUgaGVhZGVyCisgKiBmaWVsZHMgYW5kIGIpIHNldCBzdHJpbmcgZmllbGRzIHRvIHplcm8tbGVuZ3RoIGFuZCBvdGhlciBmdW5reQorICogdmFsdWVzLgorICoKKyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c01lc3NhZ2VMb2FkZXIuCisgKiBBbGwgbWVtYmVycyBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlTG9hZGVyCit7CisgIGludCByZWZjb3VudDsgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50LiAqLworCisgIERCdXNTdHJpbmcgZGF0YTsgICAgIC8qKjwgQnVmZmVyZWQgZGF0YSAqLworCisgIERCdXNMaXN0ICptZXNzYWdlczsgIC8qKjwgQ29tcGxldGUgbWVzc2FnZXMuICovCisKKyAgbG9uZyBtYXhfbWVzc2FnZV9zaXplOyAvKio8IE1heGltdW0gc2l6ZSBvZiBhIG1lc3NhZ2UgKi8KKyAgbG9uZyBtYXhfbWVzc2FnZV91bml4X2ZkczsgLyoqPCBNYXhpbXVtIHVuaXggZmRzIGluIGEgbWVzc2FnZSAqLworCisgIERCdXNWYWxpZGl0eSBjb3JydXB0aW9uX3JlYXNvbjsgLyoqPCB3aHkgd2Ugd2VyZSBjb3JydXB0ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgY29ycnVwdGVkIDogMTsgLyoqPCBXZSBnb3QgYnJva2VuIGRhdGEsIGFuZCBhcmUgbm8gbG9uZ2VyIHdvcmtpbmcgKi8KKworICB1bnNpZ25lZCBpbnQgYnVmZmVyX291dHN0YW5kaW5nIDogMTsgLyoqPCBTb21lb25lIGlzIHVzaW5nIHRoZSBidWZmZXIgdG8gcmVhZCAqLworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgdW5zaWduZWQgaW50IHVuaXhfZmRzX291dHN0YW5kaW5nIDogMTsgLyoqPCBTb21lb25lIGlzIHVzaW5nIHRoZSB1bml4IGZkIGFycmF5IHRvIHJlYWQgKi8KKworICBpbnQgKnVuaXhfZmRzOyAvKio8IEZpbGUgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYnV0IG5vdCB5ZXQgYmVlbiBoYW5kZWQgdG8gYW55IG1lc3NhZ2UuIEFycmF5IHdpbGwgYmUgYWxsb2NhdGVkIGF0IGZpcnN0IHVzZS4gKi8KKyAgdW5zaWduZWQgbl91bml4X2Zkc19hbGxvY2F0ZWQ7IC8qKjwgTnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBhcnJheSBoYXMgc3BhY2UgZm9yICovCisgIHVuc2lnbmVkIG5fdW5peF9mZHM7IC8qKjwgTnVtYmVyIG9mIHZhbGlkIGZpbGUgZGVzY3JpcHRvcnMgaW4gYXJyYXkgKi8KKyAgdm9pZCAoKiB1bml4X2Zkc19jaGFuZ2UpICh2b2lkICopOyAvKio8IE5vdGlmeSB3aGVuIHRoZSBwZW5kaW5nIGZkcyBjaGFuZ2UgKi8KKyAgdm9pZCAqdW5peF9mZHNfY2hhbmdlX2RhdGE7CisjZW5kaWYKK307CisKKworLyoqIEhvdyBtYW55IGJpdHMgYXJlIGluIHRoZSBjaGFuZ2VkX3N0YW1wIHVzZWQgdG8gdmFsaWRhdGUgaXRlcmF0b3JzICovCisjZGVmaW5lIENIQU5HRURfU1RBTVBfQklUUyAyMQorCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c01lc3NhZ2UKKyAqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlIHNlbnQgdG8KKyAqIGFub3RoZXIgYXBwbGljYXRpb24uIFRoaXMgaXMgYW4gb3BhcXVlIG9iamVjdCwgYWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2UKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzSGVhZGVyIGhlYWRlcjsgLyoqPCBIZWFkZXIgbmV0d29yayBkYXRhIGFuZCBhc3NvY2lhdGVkIGNhY2hlICovCisKKyAgREJ1c1N0cmluZyBib2R5OyAgIC8qKjwgQm9keSBuZXR3b3JrIGRhdGEuICovCisKKyAgdW5zaWduZWQgaW50IGxvY2tlZCA6IDE7IC8qKjwgTWVzc2FnZSBiZWluZyBzZW50LCBubyBtb2RpZmljYXRpb25zIGFsbG93ZWQuICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaW5fY2FjaGUgOiAxOyAvKio8IEhhcyBiZWVuICJmcmVlZCIgc2luY2UgaXQncyBpbiB0aGUgY2FjaGUgKHRoaXMgaXMgYSBkZWJ1ZyBmZWF0dXJlKSAqLworI2VuZGlmCisKKyAgREJ1c0xpc3QgKmNvdW50ZXJzOyAgIC8qKjwgMC1OIERCdXNDb3VudGVyIHVzZWQgdG8gdHJhY2sgbWVzc2FnZSBzaXplL3VuaXggZmRzLiAqLworICBsb25nIHNpemVfY291bnRlcl9kZWx0YTsgICAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHNpemUgY291bnRlcnMgYnkuICAgKi8KKworICBkYnVzX3VpbnQzMl90IGNoYW5nZWRfc3RhbXAgOiBDSEFOR0VEX1NUQU1QX0JJVFM7IC8qKjwgSW5jcmVtZW50ZWQgd2hlbiBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLiAqLworCisgIERCdXNEYXRhU2xvdExpc3Qgc2xvdF9saXN0OyAgIC8qKjwgRGF0YSBzdG9yZWQgYnkgYWxsb2NhdGVkIGludGVnZXIgSUQgKi8KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGludCBnZW5lcmF0aW9uOyAvKio8IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiB3aGVuIG1lc3NhZ2Ugd2FzIGNyZWF0ZWQgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50ICp1bml4X2ZkczsKKyAgLyoqPCBVbml4IGZpbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS4gVGhlc2UgYXJlCisgICAgIGNsb3NlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlc3Ryb3llZCwgaGVuY2UgbWFrZSBzdXJlIHRvIGR1cCgpCisgICAgIHRoZW0gd2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgdGhlbSBoZXJlLiAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzOyAvKio8IE51bWJlciBvZiB2YWxpZCBmZHMgaW4gdGhlIGFycmF5ICovCisgIHVuc2lnbmVkIG5fdW5peF9mZHNfYWxsb2NhdGVkOyAvKio8IEFsbG9jYXRlZCBzaXplIG9mIHRoZSBhcnJheSAqLworCisgIGxvbmcgdW5peF9mZF9jb3VudGVyX2RlbHRhOyAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHVuaXggZmQgY291bnRlciBieSAqLworI2VuZGlmCit9OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgYi9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZDU0MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZXNzYWdlLXV0aWwuYwpAQCAtMCwwICsxLDE3ODggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLW1lc3NhZ2UuYywgYnV0IG9ubHkgdXNlZCBieSBidXMvdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworLyogTmVjZXNzYXJ5IGZvciB0aGUgTGludXgtc3BlY2lmaWMgZmQgbGVhayBjaGVja2luZyBjb2RlIG9ubHkgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGEgbWVzc2FnZSBpdGVyYXRvciBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50CisgKiBsaXN0LiBPbmx5IGFyZ3VtZW50cyBvZiBiYXNpYyB0eXBlIGFuZCBhcnJheXMgb2YgZml4ZWQtbGVuZ3RoCisgKiBiYXNpYyB0eXBlIG1heSBiZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbi4gU2VlCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MoKSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0aGUgZmlyc3QgYXJndW1lbnQgdHlwZQorICogQHBhcmFtIC4uLiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQgdmFsdWUsIHRoZW4gbGlzdCBvZiB0eXBlLWxvY2F0aW9uIHBhaXJzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIHdhcyBzZXQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorCQkJICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgICAuLi4pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGl0ZXIgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoaXRlciwgZXJyb3IsIGZpcnN0X2FyZ190eXBlLCB2YXJfYXJncyk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1mYWN0b3J5LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGludCB2YWxpZGl0aWVzX3NlZW5bREJVU19WQUxJRElUWV9MQVNUICsgX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlRdOworCitzdGF0aWMgdm9pZAorcmVzZXRfdmFsaWRpdGllc19zZWVuICh2b2lkKQoreworICBpbnQgaTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRpdGllc19zZWVuKSkKKyAgICB7CisgICAgICB2YWxpZGl0aWVzX3NlZW5baV0gPSAwOworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JlY29yZF92YWxpZGl0eV9zZWVuIChEQnVzVmFsaWRpdHkgdmFsaWRpdHkpCit7CisgIHZhbGlkaXRpZXNfc2Vlblt2YWxpZGl0eSArIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UXSArPSAxOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdmFsaWRpdGllc19zZWVuIChkYnVzX2Jvb2xfdCBub3Rfc2VlbikKK3sKKyAgaW50IGk7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkaXRpZXNfc2VlbikpCisgICAgeworICAgICAgaWYgKChpIC0gX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlQpID09IERCVVNfVkFMSURJVFlfVU5LTk9XTiB8fAorICAgICAgICAgIChpIC0gX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlQpID09IERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT04pCisgICAgICAgIDsKKyAgICAgIGVsc2UgaWYgKChub3Rfc2VlbiAmJiB2YWxpZGl0aWVzX3NlZW5baV0gPT0gMCkgfHwKKyAgICAgICAgICAgICAgICghbm90X3NlZW4gJiYgdmFsaWRpdGllc19zZWVuW2ldID4gMCkpCisgICAgICAgIHByaW50ZiAoInZhbGlkaXR5ICUzZCBzZWVuICVkIHRpbWVzXG4iLAorICAgICAgICAgICAgICAgIGkgLSBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVCwKKyAgICAgICAgICAgICAgICB2YWxpZGl0aWVzX3NlZW5baV0pOworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzICh2b2lkKQoreworICBkYnVzX3NodXRkb3duICgpOworCisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSwgX19GSUxFX18pOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisKKyNpZmRlZiBfX2xpbnV4X18KK3N0cnVjdCBEQnVzSW5pdGlhbEZEcyB7CisgICAgZmRfc2V0IHNldDsKK307CisjZW5kaWYKKworREJ1c0luaXRpYWxGRHMgKgorX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAodm9pZCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworICBEQnVzSW5pdGlhbEZEcyAqZmRzOworCisgIC8qIHRoaXMgaXMgcGxhaW4gbWFsbG9jIHNvIGl0IHdvbid0IGludGVyZmVyZSB3aXRoIGxlYWsgY2hlY2tpbmcgKi8KKyAgZmRzID0gbWFsbG9jIChzaXplb2YgKERCdXNJbml0aWFsRkRzKSk7CisgIF9kYnVzX2Fzc2VydCAoZmRzICE9IE5VTEwpOworCisgIC8qIFRoaXMgd29ya3Mgb24gTGludXggb25seSAqLworCisgIGlmICgoZCA9IG9wZW5kaXIgKCIvcHJvYy9zZWxmL2ZkIikpKQorICAgIHsKKyAgICAgIHN0cnVjdCBkaXJlbnQgKmRlOworCisgICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgY2hhciAqZSA9IE5VTEw7CisgICAgICAgICAgaW50IGZkOworCisgICAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgbCA9IHN0cnRvbCAoZGUtPmRfbmFtZSwgJmUsIDEwKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm5vID09IDAgJiYgZSAmJiAhKmUpOworCisgICAgICAgICAgZmQgPSAoaW50KSBsOworCisgICAgICAgICAgaWYgKGZkIDwgMykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKGZkID09IGRpcmZkIChkKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgRkRfU0VUIChmZCwgJmZkcy0+c2V0KTsKKyAgICAgICAgfQorCisgICAgICBjbG9zZWRpciAoZCk7CisgICAgfQorCisgIHJldHVybiBmZHM7CisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCit2b2lkCitfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChEQnVzSW5pdGlhbEZEcyAqZmRzKQoreworI2lmZGVmIF9fbGludXhfXworICBESVIgKmQ7CisKKyAgLyogVGhpcyB3b3JrcyBvbiBMaW51eCBvbmx5ICovCisKKyAgaWYgKChkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKSkpCisgICAgeworICAgICAgc3RydWN0IGRpcmVudCAqZGU7CisKKyAgICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICBjaGFyICplID0gTlVMTDsKKyAgICAgICAgICBpbnQgZmQ7CisKKyAgICAgICAgICBpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICBsID0gc3RydG9sIChkZS0+ZF9uYW1lLCAmZSwgMTApOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZXJybm8gPT0gMCAmJiBlICYmICEqZSk7CisKKyAgICAgICAgICBmZCA9IChpbnQpIGw7CisKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkLCAmZmRzLT5zZXQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBfZGJ1c193YXJuICgiZmlsZSBkZXNjcmlwdG9yICVpIGxlYWtlZCBpbiAlcy5cbiIsIGZkLCBfX0ZJTEVfXyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmRsZWFrcyIpOworICAgICAgICB9CisKKyAgICAgIGNsb3NlZGlyIChkKTsKKyAgICB9CisKKyAgZnJlZSAoZmRzKTsKKyNlbHNlCisgIF9kYnVzX2Fzc2VydCAoZmRzID09IE5VTEwpOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaGF2ZV92YWxpZF9tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAobG9hZGVyKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgibG9hZGVyIGNvcnJ1cHRlZCBvbiBtZXNzYWdlIHRoYXQgd2FzIGV4cGVjdGVkIHRvIGJlIHZhbGlkOyBpbnZhbGlkIHJlYXNvbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIG1lc3NhZ2UgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAobG9hZGVyKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZGlkbid0IGxvYWQgbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSB2YWxpZCAobWVzc2FnZSBub3QgcG9wcGVkKVxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSA+IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoImhhZCBsZWZ0b3ZlciBieXRlcyBmcm9tIGV4cGVjdGVkLXRvLWJlLXZhbGlkIHNpbmdsZSBtZXNzYWdlXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworI2lmIDAKKyAgLyogRklYTUUgKi8KKyAgLyogVmVyaWZ5IHRoYXQgd2UncmUgYWJsZSB0byBwcm9wZXJseSBkZWFsIHdpdGggdGhlIG1lc3NhZ2UuCisgICAqIEZvciBleGFtcGxlLCB0aGlzIHdvdWxkIGRldGVjdCBpbXByb3BlciBoYW5kbGluZyBvZiBtZXNzYWdlcworICAgKiBpbiBub25zdGFuZGFyZCBieXRlIG9yZGVyLgorICAgKi8KKyAgaWYgKCFjaGVja19tZXNzYWdlX2hhbmRsaW5nIChtZXNzYWdlKSkKKyAgICBnb3RvIGZhaWxlZDsKKyNlbmRpZgorCisgIHJlY29yZF92YWxpZGl0eV9zZWVuIChEQlVTX1ZBTElEKTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19pbnZhbGlkX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAobG9hZGVyKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgibG9hZGVyIG5vdCBjb3JydXB0ZWQgb24gbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSBpbnZhbGlkXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZWNvcmRfdmFsaWRpdHlfc2VlbiAobG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgIAorICBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgIT0gREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTiAmJgorICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiAhPSBleHBlY3RlZF92YWxpZGl0eSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBjb3JydXB0ZWQgZm9yIHJlYXNvbiAlZCBhbmQgd2FzIGNvcnJ1cHRlZCBmb3IgJWQgaW5zdGVhZFxuIiwKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5LCBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2luY29tcGxldGVfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlciBjb3JydXB0ZWQgb24gbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSB2YWxpZCAoYnV0IGluY29tcGxldGUpLCBjb3JydXB0aW9uIHJlYXNvbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIG1lc3NhZ2UgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAobG9hZGVyKTsKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgibG9hZGVkIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW5jb21wbGV0ZVxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVjb3JkX3ZhbGlkaXR5X3NlZW4gKERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9yZXN1bHRzIChEQnVzTWVzc2FnZUxvYWRlciAgICAgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHF1ZXVlIG1lc3NhZ2VzIik7CisKKyAgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ID09IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIGNoZWNrX2hhdmVfdmFsaWRfbWVzc2FnZSAobG9hZGVyKTsKKyAgZWxzZSBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgPT0gREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSkKKyAgICByZXR1cm4gY2hlY2tfaW5jb21wbGV0ZV9tZXNzYWdlIChsb2FkZXIpOworICBlbHNlIGlmIChleHBlY3RlZF92YWxpZGl0eSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV04pCisgICAgeworICAgICAgLyogaGVyZSB3ZSBqdXN0IGtub3cgd2UgZGlkbid0IHNlZ2ZhdWx0IGFuZCB0aGF0IHdhcyB0aGUKKyAgICAgICAqIG9ubHkgdGVzdC4gQWxzbywgd2UgcmVjb3JkIHRoYXQgd2UgZ290IGNvdmVyYWdlCisgICAgICAgKiBmb3IgdGhlIHZhbGlkaXR5IHJlYXNvbi4KKyAgICAgICAqLworICAgICAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgICAgIHJlY29yZF92YWxpZGl0eV9zZWVuIChsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIGNoZWNrX2ludmFsaWRfbWVzc2FnZSAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSk7Cit9CisKKy8qKgorICogTG9hZHMgdGhlIG1lc3NhZ2UgaW4gdGhlIGdpdmVuIG1lc3NhZ2UgZmlsZS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgdG8gbG9hZAorICogQHBhcmFtIGRhdGEgc3RyaW5nIHRvIGxvYWQgbWVzc2FnZSBpbnRvCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSB3YXMgbG9hZGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c192ZXJib3NlICgiTG9hZGluZyByYXcgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoZGF0YSwgZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBsb2FkIG1lc3NhZ2UgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUcmllcyBsb2FkaW5nIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBtZXNzYWdlIGZpbGUKKyAqIGFuZCB2ZXJpZmllcyB0aGF0IERCdXNNZXNzYWdlTG9hZGVyIGNhbiBoYW5kbGUgaXQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBleHBlY3RlZF92YWxpZGl0eSB3aGF0IHRoZSBtZXNzYWdlIGhhcyB0byBiZSBsaWtlIHRvIHJldHVybiAjVFJVRQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaGFzIHRoZSBleHBlY3RlZCB2YWxpZGl0eQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBEQnVzU3RyaW5nIGRhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIHN0cmluZ1xuIik7CisKKyAgaWYgKCFkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGZpbGVuYW1lLCAmZGF0YSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dmFsID0gZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgKCZkYXRhLCBleHBlY3RlZF92YWxpZGl0eSk7CisKKyBmYWlsZWQ6CisKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGF0YSkgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRhdGEpKTsKKworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCBtZXNzYWdlIGxvYWRlciB0ZXN0IG9uICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVHJpZXMgbG9hZGluZyB0aGUgZ2l2ZW4gbWVzc2FnZSBkYXRhLgorICoKKyAqCisgKiBAcGFyYW0gZGF0YSB0aGUgbWVzc2FnZSBkYXRhCisgKiBAcGFyYW0gZXhwZWN0ZWRfdmFsaWRpdHkgd2hhdCB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgbGlrZSB0byByZXR1cm4gI1RSVUUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZXhwZWN0ZWQgdmFsaWRpdHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhIChjb25zdCBEQnVzU3RyaW5nICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBsZW47CisgIGludCBpOworCisgIGxvYWRlciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIFdyaXRlIHRoZSBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSAqLworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKworICAvKiBjaGVjayBzb21lIHRyaXZpYWwgbG9hZGVyIGZ1bmN0aW9ucyAqLworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgKGxvYWRlcik7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAobG9hZGVyKTsKKworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlcik7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBpKSk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlcik7CisgICAgfQorCisgIGlmICghY2hlY2tfbG9hZGVyX3Jlc3VsdHMgKGxvYWRlciwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICBsb2FkZXIgPSBOVUxMOworCisgIC8qIFdyaXRlIHRoZSBkYXRhIGFsbCBhdCBvbmNlICovCisKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworCisgIHsKKyAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgIF9kYnVzX3N0cmluZ19jb3B5IChkYXRhLCAwLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKTsKKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlcik7CisgIH0KKworICBpZiAoIWNoZWNrX2xvYWRlcl9yZXN1bHRzIChsb2FkZXIsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgbG9hZGVyID0gTlVMTDsKKworICAvKiBXcml0ZSB0aGUgZGF0YSAyIGJ5dGVzIGF0IGEgdGltZSAqLworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikKKyAgICB7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlcik7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBpKSk7CisgICAgICBpZiAoKGkrMSkgPCBsZW4pCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSsxKSk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlcik7CisgICAgfQorCisgIGlmICghY2hlY2tfbG9hZGVyX3Jlc3VsdHMgKGxvYWRlciwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICBsb2FkZXIgPSBOVUxMOworCisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisKKyAgaWYgKGxvYWRlcikKKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICpzdWJkaXIsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdF9kaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSB0ZXN0X2RpcmVjdG9yeVxuIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2Jhc2VfZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9kaXJlY3RvcnksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byB0ZXN0X2RpcmVjdG9yeSIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmdcbiIpOworCisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcHJpbnRmICgiVGVzdGluZyAlczpcbiIsIHN1YmRpcik7CisKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZW5hbWUsICIubWVzc2FnZS1yYXciKSkKKyAgICAgICAgOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlbmFtZSwgIi5tZXNzYWdlIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlNLSVA6IENvdWxkIG5vdCBsb2FkICVzLCBtZXNzYWdlIGJ1aWxkZXIgbGFuZ3VhZ2Ugbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLm1lc3NhZ2UgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIGlmICghICgqZnVuY3Rpb24pICgmZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5LCB1c2VyX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBldmVyeSBtZXNzYWdlIGZpbGUgaW4gdGhlIHRlc3Qgc3VpdGUuCisgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAjRkFMU0Ugb24gdGVzdCBmYWlsdXJlIG9yIGZhdGFsIGVycm9yLgorICoKKyAqIEBwYXJhbSB0ZXN0X2RhdGFfZGlyIHJvb3QgZGlyIG9mIHRoZSB0ZXN0IHN1aXRlIGRhdGEgZmlsZXMgKHRvcF9zcmNkaXIvdGVzdC9kYXRhKQorICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHRvIHJ1bgorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIGZvciBmdW5jdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZXJlJ3MgYSBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kaXJlY3RvcnksIHRlc3RfZGF0YV9kaXIpOworICAKKyAgaWYgKCFwcm9jZXNzX3Rlc3Rfc3ViZGlyICgmdGVzdF9kaXJlY3RvcnksICJ2YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRCwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW52YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTiwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW5jb21wbGV0ZS1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgMAorI2RlZmluZSBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFXyMjdHlwZW5hbWUpICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIGFyZ3VtZW50IHR5cGUgZnJvbSBtZXNzYWdlIGl0ZXIiKTsgICBcCisgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJnZfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodl8jI3R5cGVuYW1lICE9IGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIHZhbHVlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV8jI3R5cGVuYW1lKSAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyBhcmd1bWVudCB0eXBlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgXAorICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZ2XyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcCAodl8jI3R5cGVuYW1lLCBsaXRlcmFsKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyB2YWx1ZSBmcm9tIG1lc3NhZ2UgaXRlciIpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIG1vdmUgaXRlciB0byBuZXh0Iik7IFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQU5EX0NIRUNLX1NUUkNNUF9BTkRfTkVYVChpdGVyLCB0eXBlbmFtZSwgbGl0ZXJhbCkgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpOyAgICAgICAgICAgICAgXAorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBtb3ZlIGl0ZXIgdG8gbmV4dCIpOyBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCittZXNzYWdlX2l0ZXJfdGVzdCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheSwgYXJyYXkyOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkYnVzX2ludDE2X3Qgdl9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCB2X1VJTlQxNjsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGRidXNfaW50NjRfdCB2X0lOVDY0OworICBkYnVzX3VpbnQ2NF90IHZfVUlOVDY0OworICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgZGJ1c19ib29sX3Qgdl9CT09MRUFOOworCisgIGNvbnN0IGRidXNfaW50MzJfdCAqb3VyX2ludF9hcnJheTsKKyAgaW50IGxlbjsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisKKyAgR0VUX0FORF9DSEVDS19TVFJDTVBfQU5EX05FWFQgKGl0ZXIsIFNUUklORywgIlRlc3Qgc3RyaW5nIik7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIElOVDMyLCAtMHgxMjM0NTY3OCk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIFVJTlQzMiwgMHhlZGQxZSk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIERPVUJMRSwgMy4xNDE1OSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcmd1bWVudCB0eXBlIG5vdCBhbiBhcnJheSIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0RPVUJMRSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcnJheSB0eXBlIG5vdCBkb3VibGUiKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChhcnJheSwgRE9VQkxFLCAxLjUpOworICBHRVRfQU5EX0NIRUNLIChhcnJheSwgRE9VQkxFLCAyLjUpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyYXkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJyYXkiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJSZWFjaGVkIGVuZCBvZiBhcmd1bWVudHMiKTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChpdGVyLCBCWVRFLCAweEYwKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0FSUkFZKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIGFycmF5Iik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfSU5UMzIpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQXJyYXkgdHlwZSBub3QgaW50MzIiKTsKKworICAvKiBFbXB0eSBhcnJheSAqLworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycmF5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFycmF5Iik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVhY2hlZCBlbmQgb2YgYXJndW1lbnRzIik7CisKKyAgR0VUX0FORF9DSEVDSyAoaXRlciwgQllURSwgMHhGMCk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFyZ3VtZW50cyIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfdGVzdF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19pbnQxNl90IG91cl9pbnQxNjsKKyAgZGJ1c191aW50MTZfdCBvdXJfdWludDE2OworICBkYnVzX2ludDMyX3Qgb3VyX2ludDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDsKKyAgY29uc3QgY2hhciAqb3VyX3N0cjsKKyAgZG91YmxlIG91cl9kb3VibGU7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19ib29sX3Qgb3VyX2Jvb2w7CisgIHVuc2lnbmVkIGNoYXIgb3VyX2J5dGVfMSwgb3VyX2J5dGVfMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCAqb3VyX3VpbnQzMl9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQzMl9hcnJheV9sZW47CisgIGRidXNfaW50MzJfdCAqb3VyX2ludDMyX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50MzJfYXJyYXlfbGVuOworICBkYnVzX2ludDY0X3Qgb3VyX2ludDY0OworICBkYnVzX3VpbnQ2NF90IG91cl91aW50NjQ7CisgIGRidXNfaW50NjRfdCAqb3VyX3VpbnQ2NF9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQ2NF9hcnJheV9sZW47CisgIGNvbnN0IGRidXNfaW50NjRfdCAqb3VyX2ludDY0X2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50NjRfYXJyYXlfbGVuOworICBjb25zdCBkb3VibGUgKm91cl9kb3VibGVfYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9kb3VibGVfYXJyYXlfbGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpvdXJfYnl0ZV9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX2J5dGVfYXJyYXlfbGVuOworICBjb25zdCBkYnVzX2Jvb2xfdCAqb3VyX2Jvb2xlYW5fYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9ib29sZWFuX2FycmF5X2xlbjsKKyAgY2hhciAqKm91cl9zdHJpbmdfYXJyYXk7CisgIGludCBvdXJfc3RyaW5nX2FycmF5X2xlbjsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDE2LCAmb3VyX2ludDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmb3VyX3VpbnQxNiwKKwkJCQkgICBEQlVTX1RZUEVfSU5UMzIsICZvdXJfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmb3VyX3VpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJm91cl9pbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NCwgJm91cl91aW50NjQsCisJCQkJICAgREJVU19UWVBFX1NUUklORywgJm91cl9zdHIsCisJCQkJICAgREJVU19UWVBFX0RPVUJMRSwgJm91cl9kb3VibGUsCisJCQkJICAgREJVU19UWVBFX0JPT0xFQU4sICZvdXJfYm9vbCwKKwkJCQkgICBEQlVTX1RZUEVfQllURSwgJm91cl9ieXRlXzEsCisJCQkJICAgREJVU19UWVBFX0JZVEUsICZvdXJfYnl0ZV8yLAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50MzJfYXJyYXksICZvdXJfdWludDMyX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50MzJfYXJyYXksICZvdXJfaW50MzJfYXJyYXlfbGVuLAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50NjRfYXJyYXksICZvdXJfdWludDY0X2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50NjRfYXJyYXksICZvdXJfaW50NjRfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfZG91YmxlX2FycmF5LCAmb3VyX2RvdWJsZV9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfYnl0ZV9hcnJheSwgJm91cl9ieXRlX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9ib29sZWFuX2FycmF5LCAmb3VyX2Jvb2xlYW5fYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfc3RyaW5nX2FycmF5LCAmb3VyX3N0cmluZ19hcnJheV9sZW4sCisJCQkJICAgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzXG4iLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNvdWxkIG5vdCBnZXQgYXJndW1lbnRzIik7CisgICAgfQorCisgIGlmIChvdXJfaW50MTYgIT0gLTB4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIjE2LWJpdCBpbnRlZ2VycyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl91aW50MTYgIT0gMHgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiMTYtYml0IHVpbnRzIGRpZmZlciEiKTsKKyAgCisgIGlmIChvdXJfaW50ICE9IC0weDEyMzQ1Njc4KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludGVnZXJzIGRpZmZlciEiKTsKKworICBpZiAob3VyX3VpbnQgIT0gMHgxMjMwMDA0MikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1aW50cyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl9pbnQ2NCAhPSBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmNkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCI2NC1iaXQgaW50ZWdlcnMgZGlmZmVyISIpOworICBpZiAob3VyX3VpbnQ2NCAhPSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmNkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCI2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMgZGlmZmVyISIpOworCisgIHZfRE9VQkxFID0gMy4xNDE1OTsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlcyBkaWZmZXIhIik7CisKKyAgaWYgKHN0cmNtcCAob3VyX3N0ciwgIlRlc3Qgc3RyaW5nIikgIT0gMCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHJpbmdzIGRpZmZlciEiKTsKKworICBpZiAoIW91cl9ib29sKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJvb2xlYW5zIGRpZmZlciIpOworCisgIGlmIChvdXJfYnl0ZV8xICE9IDQyKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJ5dGVzIGRpZmZlciEiKTsKKworICBpZiAob3VyX2J5dGVfMiAhPSAyNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlcyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl91aW50MzJfYXJyYXlfbGVuICE9IDQgfHwKKyAgICAgIG91cl91aW50MzJfYXJyYXlbMF0gIT0gMHgxMjM0NTY3OCB8fAorICAgICAgb3VyX3VpbnQzMl9hcnJheVsxXSAhPSAweDIzNDU2NzgxIHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzJdICE9IDB4MzQ1Njc4MTIgfHwKKyAgICAgIG91cl91aW50MzJfYXJyYXlbM10gIT0gMHg0NTY3ODEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1aW50IGFycmF5IGRpZmZlcnMiKTsKKworICBpZiAob3VyX2ludDMyX2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfaW50MzJfYXJyYXlbMF0gIT0gMHgxMjM0NTY3OCB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzFdICE9IC0weDIzNDU2NzgxIHx8CisgICAgICBvdXJfaW50MzJfYXJyYXlbMl0gIT0gMHgzNDU2NzgxMiB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzNdICE9IC0weDQ1Njc4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludCBhcnJheSBkaWZmZXJzIik7CisKKyAgaWYgKG91cl91aW50NjRfYXJyYXlfbGVuICE9IDQgfHwKKyAgICAgIG91cl91aW50NjRfYXJyYXlbMF0gIT0gMHgxMjM0NTY3OCB8fAorICAgICAgb3VyX3VpbnQ2NF9hcnJheVsxXSAhPSAweDIzNDU2NzgxIHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzJdICE9IDB4MzQ1Njc4MTIgfHwKKyAgICAgIG91cl91aW50NjRfYXJyYXlbM10gIT0gMHg0NTY3ODEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1aW50NjQgYXJyYXkgZGlmZmVycyIpOworCisgIGlmIChvdXJfaW50NjRfYXJyYXlfbGVuICE9IDQgfHwKKyAgICAgIG91cl9pbnQ2NF9hcnJheVswXSAhPSAweDEyMzQ1Njc4IHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbMV0gIT0gLTB4MjM0NTY3ODEgfHwKKyAgICAgIG91cl9pbnQ2NF9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbM10gIT0gLTB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW50NjQgYXJyYXkgZGlmZmVycyIpOworCisgIGlmIChvdXJfZG91YmxlX2FycmF5X2xlbiAhPSAzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBhcnJheSBoYWQgd3JvbmcgbGVuZ3RoIik7CisKKyAgLyogT24gYWxsIElFRUUgbWFjaGluZXMgKGkuZS4gZXZlcnl0aGluZyBzYW5lKSBleGFjdCBlcXVhbGl0eQorICAgKiBzaG91bGQgYmUgcHJlc2VydmVkIG92ZXIgdGhlIHdpcmUKKyAgICovCisgIHZfRE9VQkxFID0gMC4xMjM0OworICBpZiAoISBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgKG91cl9kb3VibGVfYXJyYXlbMF0sIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworICB2X0RPVUJMRSA9IDk4NzYuNTQzMjE7CisgIGlmICghIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAob3VyX2RvdWJsZV9hcnJheVsxXSwgdl9ET1VCTEUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisgIHZfRE9VQkxFID0gLTMwMC4wOworICBpZiAoISBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgKG91cl9kb3VibGVfYXJyYXlbMl0sIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworCisgIGlmIChvdXJfYnl0ZV9hcnJheV9sZW4gIT0gNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlIGFycmF5IGhhZCB3cm9uZyBsZW5ndGgiKTsKKworICBpZiAob3VyX2J5dGVfYXJyYXlbMF0gIT0gJ2EnIHx8CisgICAgICBvdXJfYnl0ZV9hcnJheVsxXSAhPSAnYicgfHwKKyAgICAgIG91cl9ieXRlX2FycmF5WzJdICE9ICdjJyB8fAorICAgICAgb3VyX2J5dGVfYXJyYXlbM10gIT0gMjM0KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJ5dGUgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworCisgIGlmIChvdXJfYm9vbGVhbl9hcnJheV9sZW4gIT0gNSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib29sIGFycmF5IGhhZCB3cm9uZyBsZW5ndGgiKTsKKworICBpZiAob3VyX2Jvb2xlYW5fYXJyYXlbMF0gIT0gVFJVRSB8fAorICAgICAgb3VyX2Jvb2xlYW5fYXJyYXlbMV0gIT0gRkFMU0UgfHwKKyAgICAgIG91cl9ib29sZWFuX2FycmF5WzJdICE9IFRSVUUgfHwKKyAgICAgIG91cl9ib29sZWFuX2FycmF5WzNdICE9IFRSVUUgfHwKKyAgICAgIG91cl9ib29sZWFuX2FycmF5WzRdICE9IEZBTFNFKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJvb2wgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworCisgIGlmIChvdXJfc3RyaW5nX2FycmF5X2xlbiAhPSA0KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInN0cmluZyBhcnJheSB3YXMgd3JvbmcgbGVuZ3RoIik7CisKKyAgaWYgKHN0cmNtcCAob3VyX3N0cmluZ19hcnJheVswXSwgIkZvbyIpICE9IDAgfHwKKyAgICAgIHN0cmNtcCAob3VyX3N0cmluZ19hcnJheVsxXSwgImJhciIpICE9IDAgfHwKKyAgICAgIHN0cmNtcCAob3VyX3N0cmluZ19hcnJheVsyXSwgIiIpICE9IDAgfHwKKyAgICAgIHN0cmNtcCAob3VyX3N0cmluZ19hcnJheVszXSwgIndvbyB3b28gd29vIHdvbyIpICE9IDApCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic3RyaW5nIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChvdXJfc3RyaW5nX2FycmF5KTsKKyAgCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkbid0IHJlYWNoIGVuZCBvZiBhcmd1bWVudHMiKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcmlmeV90ZXN0X21lc3NhZ2VfYXJnc19pZ25vcmVkIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDsKKyAgREJ1c0luaXRpYWxGRHMgKmluaXRpYWxfZmRzOworCisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICAvKiBwYXJzZSB3aXRoIGVtcHR5IHNpZ25hdHVyZTogIiIgKi8KKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzICgmaXRlciwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzXG4iLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiYXJndW1lbnRzIGlnbm9yZWQuXG4iKTsKKyAgICB9CisKKyAgLyogcGFyc2Ugd2l0aCBzaG9ydGVyIHNpZ25hdHVyZTogInUiICovCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzXG4iLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiYXJndW1lbnRzIGlnbm9yZWQuXG4iKTsKKyAgICB9CisKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5X3Rlc3RfbWVzc2FnZV9tZW1sZWFrIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDE7CisgIGRidXNfdWludDMyX3Qgb3VyX3VpbnQyOworICBkYnVzX3VpbnQzMl90IG91cl91aW50MzsKKyAgY2hhciAqKm91cl9zdHJpbmdfYXJyYXkxOworICBpbnQgb3VyX3N0cmluZ19hcnJheV9sZW4xOworICBjaGFyICoqb3VyX3N0cmluZ19hcnJheTI7CisgIGludCBvdXJfc3RyaW5nX2FycmF5X2xlbjI7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50IG91cl91bml4X2ZkMTsKKyAgaW50IG91cl91bml4X2ZkMjsKKyNlbmRpZgorICBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHM7CisKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworCisgIC8qIHBhcnNlIHdpdGggd3Jvbmcgc2lnbmF0dXJlOiAidWFzaHV1IiAqLworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX3N0cmluZ19hcnJheTEsICZvdXJfc3RyaW5nX2FycmF5X2xlbjEsCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZvdXJfdW5peF9mZDEsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJleHBlY3RlZCBlcnJvcjogJXMgLSAlc1xuIiwgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIChlcnJvci5tZXNzYWdlICE9IE5VTEwpID8gZXJyb3IubWVzc2FnZSA6ICJubyBtZXNzYWdlIik7CisgICAgICAvKiBlbnN1cmUgYXJyYXkgb2Ygc3RyaW5nIGFuZCB1bml4IGZkIG5vdCBsZWFrZWQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAob3VyX3N0cmluZ19hcnJheTEgPT0gTlVMTCk7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIF9kYnVzX2Fzc2VydCAob3VyX3VuaXhfZmQxID09IC0xKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJlcnJvcjogcGFyc2Ugd2l0aCB3cm9uZyBzaWduYXR1cmU6ICd1YXNodXUnLlxuIik7CisgICAgfQorCisgIC8qIHBhcnNlIHdpdGggd3Jvbmcgc2lnbmF0dXJlOiAidWFzaHVhc2h1IiAqLworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX3N0cmluZ19hcnJheTEsICZvdXJfc3RyaW5nX2FycmF5X2xlbjEsCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZvdXJfdW5peF9mZDEsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX3N0cmluZ19hcnJheTIsICZvdXJfc3RyaW5nX2FycmF5X2xlbjIsCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZvdXJfdW5peF9mZDIsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJleHBlY3RlZCBlcnJvcjogJXMgLSAlc1xuIiwgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIChlcnJvci5tZXNzYWdlICE9IE5VTEwpID8gZXJyb3IubWVzc2FnZSA6ICJubyBtZXNzYWdlIik7CisgICAgICAvKiBlbnN1cmUgYXJyYXkgb2Ygc3RyaW5nIGFuZCB1bml4IGZkIG5vdCBsZWFrZWQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAob3VyX3N0cmluZ19hcnJheTEgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG91cl9zdHJpbmdfYXJyYXkyID09IE5VTEwpOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBfZGJ1c19hc3NlcnQgKG91cl91bml4X2ZkMSA9PSAtMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKG91cl91bml4X2ZkMiA9PSAtMSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXJyb3I6IHBhcnNlIHdpdGggd3Jvbmcgc2lnbmF0dXJlOiAndWFzaHVhc2h1Jy5cbiIpOworICAgIH0KKworICAvKiBwYXJzZSB3aXRoIGNvcnJlY3Qgc2lnbmF0dXJlOiAidWFzaHVhc2giICovCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzICgmaXRlciwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmb3VyX3VpbnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfc3RyaW5nX2FycmF5MSwgJm91cl9zdHJpbmdfYXJyYXlfbGVuMSwKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJm91cl91bml4X2ZkMSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmb3VyX3VpbnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfc3RyaW5nX2FycmF5MiwgJm91cl9zdHJpbmdfYXJyYXlfbGVuMiwKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJm91cl91bml4X2ZkMiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzXG4iLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNvdWxkIG5vdCBnZXQgYXJndW1lbnRzIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheTEpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheTIpOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBfZGJ1c19jbG9zZSAob3VyX3VuaXhfZmQxLCAmZXJyb3IpOworICAgICAgX2RidXNfY2xvc2UgKG91cl91bml4X2ZkMiwgJmVycm9yKTsKKyNlbmRpZgorICAgIH0KKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZXNzYWdlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqbWVzc2FnZV93aXRob3V0X3VuaXhfZmRzOworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgREJ1c01lc3NhZ2UgKmNvcHk7CisgIGNvbnN0IGNoYXIgKm5hbWUxOworICBjb25zdCBjaGFyICpuYW1lMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCBvdXJfdWludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgMHg0NTY3ODEyMyB9OworICBjb25zdCBkYnVzX2ludDMyX3Qgb3VyX2ludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgLTB4MjM0NTY3ODEsIDB4MzQ1Njc4MTIsIC0weDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfdWludDMyX3QgKnZfQVJSQVlfVUlOVDMyID0gb3VyX3VpbnQzMl9hcnJheTsKKyAgY29uc3QgZGJ1c19pbnQzMl90ICp2X0FSUkFZX0lOVDMyID0gb3VyX2ludDMyX2FycmF5OworICBjb25zdCBkYnVzX3VpbnQ2NF90IG91cl91aW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAweDIzNDU2NzgxLCAweDM0NTY3ODEyLCAweDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfaW50NjRfdCBvdXJfaW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAtMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgLTB4NDU2NzgxMjMgfTsKKyAgY29uc3QgZGJ1c191aW50NjRfdCAqdl9BUlJBWV9VSU5UNjQgPSBvdXJfdWludDY0X2FycmF5OworICBjb25zdCBkYnVzX2ludDY0X3QgKnZfQVJSQVlfSU5UNjQgPSBvdXJfaW50NjRfYXJyYXk7CisgIGNvbnN0IGNoYXIgKm91cl9zdHJpbmdfYXJyYXlbXSA9IHsgIkZvbyIsICJiYXIiLCAiIiwgIndvbyB3b28gd29vIHdvbyIgfTsKKyAgY29uc3QgY2hhciAqb3VyX3N0cmluZ19hcnJheTFbXSA9IHsgImZvbyIsICJCYXIiLCAiIiwgIldvbyB3b28gV29vIHdvbyIgfTsKKyAgY29uc3QgY2hhciAqKnZfQVJSQVlfU1RSSU5HID0gb3VyX3N0cmluZ19hcnJheTsKKyAgY29uc3QgY2hhciAqKnYxX0FSUkFZX1NUUklORyA9IG91cl9zdHJpbmdfYXJyYXkxOworICBjb25zdCBkb3VibGUgb3VyX2RvdWJsZV9hcnJheVtdID0geyAwLjEyMzQsIDk4NzYuNTQzMjEsIC0zMDAuMCB9OworICBjb25zdCBkb3VibGUgKnZfQVJSQVlfRE9VQkxFID0gb3VyX2RvdWJsZV9hcnJheTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciBvdXJfYnl0ZV9hcnJheVtdID0geyAnYScsICdiJywgJ2MnLCAyMzQgfTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdl9BUlJBWV9CWVRFID0gb3VyX2J5dGVfYXJyYXk7CisgIGNvbnN0IGRidXNfYm9vbF90IG91cl9ib29sZWFuX2FycmF5W10gPSB7IFRSVUUsIEZBTFNFLCBUUlVFLCBUUlVFLCBGQUxTRSB9OworICBjb25zdCBkYnVzX2Jvb2xfdCAqdl9BUlJBWV9CT09MRUFOID0gb3VyX2Jvb2xlYW5fYXJyYXk7CisgIGNoYXIgc2lnWzY0XTsKKyAgY29uc3QgY2hhciAqczsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19pbnQxNl90IHZfSU5UMTY7CisgIGRidXNfdWludDE2X3Qgdl9VSU5UMTY7CisgIGRidXNfaW50MzJfdCB2X0lOVDMyOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBkYnVzX3VpbnQzMl90IHYxX1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICB1bnNpZ25lZCBjaGFyIHYyX0JZVEU7CisgIGRidXNfYm9vbF90IHZfQk9PTEVBTjsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXIsIGFycmF5X2l0ZXIsIHN0cnVjdF9pdGVyOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCB2X1VOSVhfRkQ7CisgIGludCB2MV9VTklYX0ZEOworI2VuZGlmCisgIGNoYXIgKipkZWNvbXBvc2VkOworICBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHM7CisgIGRidXNfYm9vbF90IG9rOworICBjaGFyIGJhc2ljX3R5cGVzW10gPSBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMTZfQVNfU1RSSU5HIFwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NF9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HIFwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NF9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HOworCisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28uVGVzdEludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdE1ldGhvZCIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfZGVzdGluYXRpb24gKG1lc3NhZ2UsICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsICJGb28uVGVzdEludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdE1ldGhvZCIpKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIpID09IDApOworICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgMTIzNCk7CisKKyAgLyogc3RyaW5nIGxlbmd0aCBpbmNsdWRpbmcgbnVsIGJ5dGUgbm90IGEgbXVsdGlwbGUgb2YgNCAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCAib3JnLmZvby5iYXIxIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsICJvcmcuZm9vLmJhcjEiKSk7CisgIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCA1Njc4KTsKKworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisKKworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworCisgIF9kYnVzX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCAib3JnLmZvby5iYXIxIikpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSA9PSAxMjM0KTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgPT0gNTY3OCk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIikpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkgPT0gRkFMU0UpOworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSA9PSBUUlVFKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgRkFMU0UpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKG1lc3NhZ2UpID09IEZBTFNFKTsKKworICAvKiBTZXQvZ2V0IHNvbWUgaGVhZGVyIGZpZWxkcyAqLworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2ZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsICJvcmcuRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5Gb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhciIpID09IDApOworCisgIC8qIFNldC9nZXQgdGhlbSB3aXRoIGxvbmdlciB2YWx1ZXMgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvZm9vL2JhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2Zvby9iYXIiKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCAib3JnLkZvby5CYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLkZvby5CYXIiKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhckZvbyIpID09IDApOworCisgIC8qIFJlYWxsb2Mgc2hvcnRlciBhZ2FpbiAqLworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2ZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsICJvcmcuRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5Gb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhciIpID09IDApOworCisgIC8qIFBhdGggZGVjb21wb3NpbmcgKi8KKyAgZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvIik7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkWzBdID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvYS9iIik7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMF0sICJhIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkZWNvbXBvc2VkWzFdLCAiYiIpID09IDApOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWRbMl0gPT0gTlVMTCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWQpOworCisgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9zcGFtL2VnZ3MiKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGVjb21wb3NlZFswXSwgInNwYW0iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMV0sICJlZ2dzIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZFsyXSA9PSBOVUxMKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBUZXN0IHRoZSB2YXJhcmcgZnVuY3Rpb25zICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvby5UZXN0SW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0TWV0aG9kIik7CisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChtZXNzYWdlLCAxKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsIDU2NzgpOworCisgIHZfSU5UMTYgPSAtMHgxMjM7CisgIHZfVUlOVDE2ID0gMHgxMjM7CisgIHZfSU5UMzIgPSAtMHgxMjM0NTY3ODsKKyAgdl9VSU5UMzIgPSAweDEyMzAwMDQyOworICB2X0lOVDY0ID0gREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjZCk7CisgIHZfVUlOVDY0ID0gREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjZCk7CisgIHZfU1RSSU5HID0gIlRlc3Qgc3RyaW5nIjsKKyAgdl9ET1VCTEUgPSAzLjE0MTU5OworICB2X0JPT0xFQU4gPSBUUlVFOworICB2X0JZVEUgPSA0MjsKKyAgdjJfQllURSA9IDI0OworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHZfVU5JWF9GRCA9IDE7CisgIHYxX1VOSVhfRkQgPSAyOworI2VuZGlmCisKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQxNiwgJnZfSU5UMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQxNiwgJnZfVUlOVDE2LAorCQkJICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnZfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJnZfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NCwgJnZfVUlOVDY0LAorCQkJICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKwkJCSAgICBEQlVTX1RZUEVfRE9VQkxFLCAmdl9ET1VCTEUsCisJCQkgICAgREJVU19UWVBFX0JPT0xFQU4sICZ2X0JPT0xFQU4sCisJCQkgICAgREJVU19UWVBFX0JZVEUsICZ2X0JZVEUsCisJCQkgICAgREJVU19UWVBFX0JZVEUsICZ2Ml9CWVRFLAorCQkJICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQzMiwgJnZfQVJSQVlfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl91aW50MzJfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfaW50MzJfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQ2NCwgJnZfQVJSQVlfVUlOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl91aW50NjRfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDY0LCAmdl9BUlJBWV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfaW50NjRfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0RPVUJMRSwgJnZfQVJSQVlfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9kb3VibGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsICZ2X0FSUkFZX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2J5dGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0FSUkFZX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2Jvb2xlYW5fYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywgJnZfQVJSQVlfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9zdHJpbmdfYXJyYXkpLAorCisJCQkgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGkgPSAwOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDE2OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDMyOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0RPVUJMRTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQk9PTEVBTjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0lOVDMyOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UNjQ7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9ET1VCTEU7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CWVRFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQk9PTEVBTjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1NUUklORzsKKworICBtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMgPSBkYnVzX21lc3NhZ2VfY29weShtZXNzYWdlKTsKKyAgX2RidXNfYXNzZXJ0KG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmdl9VTklYX0ZELAorCQkJICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIF9kYnVzX2Fzc2VydCAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHNpZykpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJIRUFERVJcbiIpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlICgiQk9EWVxuIik7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTaWduYXR1cmUgZXhwZWN0ZWQgXCIlc1wiIGFjdHVhbCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgIHNpZywgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpKTsKKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsIHNpZykpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocywgc2lnKSA9PSAwKTsKKworICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChtZXNzYWdlKTsKKworICBjb3B5ID0gZGJ1c19tZXNzYWdlX2NvcHkgKG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpID09CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKGNvcHkpKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5oZWFkZXIucGFkZGluZyA9PSBjb3B5LT5oZWFkZXIucGFkZGluZyk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29weS0+aGVhZGVyLmRhdGEpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcHktPmJvZHkpKTsKKworICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChjb3B5KTsKKworICBuYW1lMSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKyAgbmFtZTIgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoY29weSk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKG5hbWUxLCBuYW1lMikgPT0gMCk7CisKKyAgbmFtZTEgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgIG5hbWUyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGNvcHkpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChuYW1lMSwgbmFtZTIpID09IDApOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoY29weSk7CisKKyAgLyogTWVzc2FnZSBsb2FkZXIgdGVzdCAqLworICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKyAgCisgIC8qIGNoZWNrIHJlZi91bnJlZiAqLworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgKGxvYWRlcik7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworCisgIC8qIFdyaXRlIHRoZSBoZWFkZXIgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKTsKKyAgZm9yIChpID0gMDsgaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsIGRhdGFbaV0pOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworICAgIH0KKworICAvKiBXcml0ZSB0aGUgYm9keSBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSAqLworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbWVzc2FnZS0+Ym9keSk7CisgIGZvciAoaSA9IDA7IGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsIGRhdGFbaV0pOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworICAgIH0KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHsKKyAgICBpbnQgKnVuaXhfZmRzOworICAgIHVuc2lnbmVkIG5fdW5peF9mZHM7CisgICAgLyogV3JpdGUgdW5peCBmZCAqLworICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF91bml4X2Zkcyhsb2FkZXIsICZ1bml4X2ZkcywgJm5fdW5peF9mZHMpOworICAgIF9kYnVzX2Fzc2VydChuX3VuaXhfZmRzID4gMCk7CisgICAgX2RidXNfYXNzZXJ0KG1lc3NhZ2UtPm5fdW5peF9mZHMgPT0gMSk7CisgICAgdW5peF9mZHNbMF0gPSBfZGJ1c19kdXAobWVzc2FnZS0+dW5peF9mZHNbMF0sIE5VTEwpOworICAgIF9kYnVzX2Fzc2VydCh1bml4X2Zkc1swXSA+PSAwKTsKKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fdW5peF9mZHMobG9hZGVyLCB1bml4X2ZkcywgMSk7CisgIH0KKyNlbmRpZgorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogTm93IHBvcCBiYWNrIHRoZSBtZXNzYWdlICovCisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHF1ZXVlIG1lc3NhZ2VzIik7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibWVzc2FnZSBsb2FkZXIgY29ycnVwdGVkIik7CisKKyAgbWVzc2FnZSA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChsb2FkZXIpOworICBpZiAoIW1lc3NhZ2UpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVjZWl2ZWQgYSBOVUxMIG1lc3NhZ2UiKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDU2NzgpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVwbHkgc2VyaWFsIGZpZWxkcyBkaWZmZXIiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIG92dmVyaWRlIHRoZSBzZXJpYWwsIHNpbmNlIGl0IHdhcyByZXNldCBieSBkYnVzX21lc3NhZ2VfY29weSgpICovCisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsKG1lc3NhZ2Vfd2l0aG91dF91bml4X2ZkcywgODkwMSk7CisKKyAgZGJ1c19tZXNzYWdlX2xvY2sgKG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZSAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKworICAgIHsKKyAgICAgIC8qIE1hcnNoYWwgYW5kIGRlbWFyc2hhbCB0aGUgbWVzc2FnZS4gKi8KKworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UyOworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY2hhciAqbWFyc2hhbGxlZCA9IE5VTEw7CisgICAgICBpbnQgbGVuID0gMDsKKyAgICAgIGNoYXIgZ2FyYmFnZV9oZWFkZXJbREJVU19NSU5JTVVNX0hFQURFUl9TSVpFXSA9ICJ4eHgiOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9tYXJzaGFsIChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMsICZtYXJzaGFsbGVkLCAmbGVuKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIG1hcnNoYWwgbWVzc2FnZSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGxlbiAhPSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWFyc2hhbGxlZCAhPSBOVUxMKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAobWFyc2hhbGxlZCwgbGVuKSA9PSBsZW4pOworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsIChtYXJzaGFsbGVkLCBsZW4sICZlcnJvcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChtZXNzYWdlMik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTIpOworICAgICAgZGJ1c19mcmVlIChtYXJzaGFsbGVkKTsKKworICAgICAgLyogRGVtYXJzaGFsIGludmFsaWQgbWVzc2FnZS4gKi8KKworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsICgiaW52YWxpZCIsIDcsICZlcnJvcik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIC8qIERlbWFyc2hhbCBpbnZhbGlkIChlbXB0eSkgbWVzc2FnZS4gKi8KKworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsICgiIiwgMCwgJmVycm9yKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgLyogQnl0ZXMgbmVlZGVkIHRvIGRlbWFyc2hhbCBlbXB0eSBtZXNzYWdlOiAwIChtb3JlKSAqLworCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkICgiIiwgMCkgPT0gMCk7CisgICAgICAKKyAgICAgIC8qIEJ5dGVzIG5lZWRlZCB0byBkZW1hcnNoYWwgaW52YWxpZCBtZXNzYWdlOiAtMSAoZXJyb3IpLiAqLworCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChnYXJiYWdlX2hlYWRlciwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKSA9PSAtMSk7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworCisgIC8qIFRlc3QgZW51bWVyYXRpb24gb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgZm9yIChpID0gc3RybGVuIChiYXNpY190eXBlcykgLSAxOyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgIERCdXNCYXNpY1ZhbHVlIHZhbDsKKyAgICAgIGludCBzb21lOworICAgICAgY2hhciogc2lnbmF0dXJlID0gX2RidXNfc3RyZHVwICgiPyIpOworCisgICAgICBzaWduYXR1cmVbMF0gPSBiYXNpY190eXBlc1tpXTsKKyAgICAgIHMgPSAiU29tZVRoaW5nVG9TYXkiOworICAgICAgbWVtc2V0ICgmdmFsLCAnXDAnLCBzaXplb2YgKHZhbCkpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoImRlLmVuZGUudGVzdCIsCisgICAgICAgICIvZGUvZW5kZS90ZXN0IiwgImRlLmVuZGUuVGVzdCIsICJBcnRpc3ROYW1lIik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCAmYXJyYXlfaXRlcik7CisgICAgICBmb3IgKHNvbWUgPSAwOyBzb21lIDwgMzsgc29tZSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJhc2ljX3R5cGVzW2ldID09IERCVVNfVFlQRV9TVFJJTkcpCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyYXlfaXRlciwgYmFzaWNfdHlwZXNbaV0sICZ2YWwpOworICAgICAgICB9CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmYXJyYXlfaXRlcik7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50ICgmaXRlcikgPT0gc29tZSk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZGJ1c19mcmVlIChzaWduYXR1cmUpOworICAgIH0KKyAgLyogQXJyYXkgb2Ygc3RydWN0cyAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoImRlLmVuZGUudGVzdCIsCisgICAgICAiL2RlL2VuZGUvdGVzdCIsICJkZS5lbmRlLlRlc3QiLCAiQXJ0aXN0TmFtZSIpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcsICZhcnJheV9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCBEQlVTX1RZUEVfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0cnVjdF9pdGVyKTsKKyAgcyA9ICJTcGFtQW5kRWdncyI7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN0cnVjdF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsICZzdHJ1Y3RfaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZhcnJheV9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50ICgmaXRlcikgPT0gMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGNoZWNrX21lbWxlYWtzICgpOworCisgIC8qIENoZWNrIHRoYXQgd2UgY2FuIGFiYW5kb24gYSBjb250YWluZXIgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisJCSAgCQkJICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisJCQkJCSAgIkZvby5UZXN0SW50ZXJmYWNlIiwKKwkJCQkJICAiTWV0aG9kIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKworICBvayA9IGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorCQkJICAJCQkgIChEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworCQkJCQkJICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKwkJCQkJCSAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisJCQkJCQkgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyYXlfaXRlcik7CisgIF9kYnVzX2Fzc2VydCAob2spOworICBvayA9IGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyYXlfaXRlciwgREJVU19UWVBFX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0cnVjdF9pdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChvayk7CisgIHMgPSAicGVhY2hlcyI7CisgIG9rID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3RydWN0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKTsKKyAgX2RidXNfYXNzZXJ0IChvayk7CisKKyAgLyogdWgtb2gsIGVycm9yLCB0cnkgYW5kIHVud2luZCAqLworCisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmYXJyYXlfaXRlciwgJnN0cnVjdF9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmaXRlcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBDaGVjayB3ZSBzaG91bGQgbm90IGxlYWsgYXJyYXkgb2Ygc3RyaW5nIG9yIHVuaXggZmQsIGZkLm8jMjEyNTkgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCIpOworCisgIC8qIHNpZ25hdHVyZSAidWFzaHVhc2giICovCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdl9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLCAmdl9BUlJBWV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX3N0cmluZ19hcnJheSksCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnZfVU5JWF9GRCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ2MV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLCAmdjFfQVJSQVlfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9zdHJpbmdfYXJyYXkxKSwKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmdjFfVU5JWF9GRCwKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGkgPSAwOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIF9kYnVzX2Fzc2VydCAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHNpZykpOworCisgIHZlcmlmeV90ZXN0X21lc3NhZ2VfYXJnc19pZ25vcmVkIChtZXNzYWdlKTsKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZV9tZW1sZWFrIChtZXNzYWdlKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIExvYWQgYWxsIHRoZSBzYW1wbGUgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBmYWN0b3J5ICovCisgIHsKKyAgICBEQnVzTWVzc2FnZURhdGFJdGVyIGRpdGVyOworICAgIERCdXNNZXNzYWdlRGF0YSBtZGF0YTsKKyAgICBpbnQgY291bnQ7CisKKyAgICByZXNldF92YWxpZGl0aWVzX3NlZW4gKCk7CisgICAgCisgICAgY291bnQgPSAwOworICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgKCZkaXRlcik7CisgICAgCisgICAgd2hpbGUgKF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoJmRpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGF0YSkpCisgICAgICB7CisgICAgICAgIGlmICghZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgKCZtZGF0YS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGF0YS5leHBlY3RlZF92YWxpZGl0eSkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIHZhbGlkaXR5ICVkIGFuZCBkaWQgbm90IGdldCBpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1kYXRhLmV4cGVjdGVkX3ZhbGlkaXR5KTsKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lc3NhZ2UgZGF0YSBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfbWVzc2FnZV9kYXRhX2ZyZWUgKCZtZGF0YSk7CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICAgIH0KKworICAgIHByaW50ZiAoIiVkIHNhbXBsZSBtZXNzYWdlcyB0ZXN0ZWRcbiIsIGNvdW50KTsKKworICAgIHByaW50X3ZhbGlkaXRpZXNfc2VlbiAoRkFMU0UpOworICAgIHByaW50X3ZhbGlkaXRpZXNfc2VlbiAoVFJVRSk7CisgIH0KKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworCisgIC8qIE5vdyBsb2FkIGV2ZXJ5IG1lc3NhZ2UgaW4gdGVzdF9kYXRhX2RpciBpZiB3ZSBoYXZlIG9uZSAqLworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9mb3JlYWNoX21lc3NhZ2VfZmlsZSAodGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZm9yZWFjaF9tZXNzYWdlX2ZpbGUgdGVzdCBmYWlsZWQiKTsKKworICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChpbml0aWFsX2Zkcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1lc3NhZ2UuYyBiL2RidXMvZGJ1cy1tZXNzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkOWM4YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZXNzYWdlLmMKQEAgLTAsMCArMSw1MDA5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS5jICBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1oZWFkZXIuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1vYmplY3QtdHJlZS5oIgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBfREJVU19UWVBFX0lTX1NUUklOR0xJS0UodHlwZSkgXAorICAodHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HIHx8IHR5cGUgPT0gREJVU19UWVBFX1NJR05BVFVSRSB8fCBcCisgICB0eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkKKworc3RhdGljIHZvaWQgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzIERCdXNNZXNzYWdlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTWVzc2FnZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgKgorICogVGhlIGd1dHMgb2YgREJ1c01lc3NhZ2UgYW5kIGl0cyBtZXRob2RzLgorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2VuYWJsZV9tZXNzYWdlX2NhY2hlICh2b2lkKQoreworICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBpZiAoZW5hYmxlZCA8IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfTUVTU0FHRV9DQUNIRSIpOworCisgICAgICBlbmFibGVkID0gVFJVRTsKKworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnMgPT0gJzAnKQorICAgICAgICAgICAgZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgIGVsc2UgaWYgKCpzID09ICcxJykKKyAgICAgICAgICAgIGVuYWJsZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEQlVTX01FU1NBR0VfQ0FDSEUgc2hvdWxkIGJlIDAgb3IgMSBpZiBzZXQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICBzKTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gZW5hYmxlZDsKK30KKyNlbHNlCisgICAgLyogY29uc3RhbnQgZXhwcmVzc2lvbiwgc2hvdWxkIGJlIG9wdGltaXplZCBhd2F5ICovCisjICAgZGVmaW5lIF9kYnVzX2VuYWJsZV9tZXNzYWdlX2NhY2hlKCkgKFRSVUUpCisjZW5kaWYKKworI2lmbmRlZiBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZgordm9pZAorX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBvbGRfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG5ld19yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqd2h5KQoreworICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBfZGJ1c190cmFjZV9yZWYgKCJEQnVzTWVzc2FnZSIsIG1lc3NhZ2UsIG9sZF9yZWZjb3VudCwgbmV3X3JlZmNvdW50LCB3aHksCisgICAgICAiREJVU19NRVNTQUdFX1RSQUNFIiwgJmVuYWJsZWQpOworfQorI2VuZGlmCisKKy8qIE5vdCB0aHJlYWQgbG9ja2VkLCBidXQgc3RyaWN0bHkgY29uc3QvcmVhZC1vbmx5IHNvIHNob3VsZCBiZSBPSworICovCisvKiogQW4gc3RhdGljIHN0cmluZyByZXByZXNlbnRpbmcgYW4gZW1wdHkgc2lnbmF0dXJlICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19lbXB0eV9zaWduYXR1cmVfc3RyLCAgIiIpOworCisvKiB0aGVzZSBoYXZlIHdhY2t5IHZhbHVlcyB0byBoZWxwIHRyYXAgdW5pbml0aWFsaXplZCBpdGVyYXRvcnM7CisgKiBidXQgaGFzIHRvIGZpdCBpbiAzIGJpdHMKKyAqLworZW51bSB7CisgIERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSID0gMywKKyAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIgPSA3Cit9OworCisvKiogdHlwZWRlZiBmb3IgaW50ZXJuYWxzIG9mIG1lc3NhZ2UgaXRlcmF0b3IgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNNZXNzYWdlUmVhbEl0ZXIgREJ1c01lc3NhZ2VSZWFsSXRlcjsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNNZXNzYWdlSXRlcgorICoKKyAqIE9iamVjdCByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBpbiBhIG1lc3NhZ2UuIEFsbCBmaWVsZHMgYXJlIGludGVybmFsLgorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2VSZWFsSXRlcgoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsgLyoqPCBNZXNzYWdlIHVzZWQgKi8KKyAgZGJ1c191aW50MzJfdCBjaGFuZ2VkX3N0YW1wIDogQ0hBTkdFRF9TVEFNUF9CSVRTOyAvKio8IHN0YW1wIHRvIGRldGVjdCBpbnZhbGlkIGl0ZXJzICovCisgIGRidXNfdWludDMyX3QgaXRlcl90eXBlIDogMzsgICAgICAvKio8IHdoZXRoZXIgdGhpcyBpcyBhIHJlYWRlciBvciB3cml0ZXIgaXRlciAqLworICBkYnVzX3VpbnQzMl90IHNpZ19yZWZjb3VudCA6IDg7ICAgLyoqPCBkZXB0aCBvZiBvcGVuX3NpZ25hdHVyZSgpICovCisgIHVuaW9uCisgIHsKKyAgICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7IC8qKjwgd3JpdGVyICovCisgICAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOyAvKio8IHJlYWRlciAqLworICB9IHU7IC8qKjwgdGhlIHR5cGUgd3JpdGVyIG9yIHJlYWRlciB0aGF0IGRvZXMgYWxsIHRoZSB3b3JrICovCit9OworCisvKioKKyAqIExheW91dCBvZiBhIERCdXNNZXNzYWdlSXRlciBvbiB0aGUgc3RhY2sgaW4gZGJ1cyAxLjEwLjAuIFRoaXMgaXMgbm8KKyAqIGxvbmdlciB1c2VkLCBidXQgZm9yIEFCSSBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gYXNzZXJ0IHRoYXQgdGhlCisgKiBuZXcgbGF5b3V0IGlzIHRoZSBzYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQgKmR1bW15MTsKKyAgdm9pZCAqZHVtbXkyOworICBkYnVzX3VpbnQzMl90IGR1bW15MzsKKyAgaW50IGR1bW15NDsKKyAgaW50IGR1bW15NTsKKyAgaW50IGR1bW15NjsKKyAgaW50IGR1bW15NzsKKyAgaW50IGR1bW15ODsKKyAgaW50IGR1bW15OTsKKyAgaW50IGR1bW15MTA7CisgIGludCBkdW1teTExOworICBpbnQgcGFkMTsKKyAgaW50IHBhZDI7CisgIHZvaWQgKnBhZDM7Cit9IERCdXNNZXNzYWdlSXRlcl8xXzEwXzA7CisKK3N0YXRpYyB2b2lkCitnZXRfY29uc3Rfc2lnbmF0dXJlIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqKnR5cGVfc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqdHlwZV9wb3NfcCkKK3sKKyAgaWYgKF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3IChoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3NfcCkpCisgICAgeworICAgICAgKnR5cGVfcG9zX3AgKz0gMTsgLyogc2tpcCB0aGUgc2lnbmF0dXJlIGxlbmd0aCB3aGljaCBpcyAxIGJ5dGUgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqdHlwZV9zdHJfcCA9ICZfZGJ1c19lbXB0eV9zaWduYXR1cmVfc3RyOworICAgICAgKnR5cGVfcG9zX3AgPSAwOworICAgIH0KK30KKworLyoqCisgKiBTd2FwcyB0aGUgbWVzc2FnZSB0byBjb21waWxlciBieXRlIG9yZGVyIGlmIHJlcXVpcmVkCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfYnl0ZXN3YXAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0cjsKKyAgaW50IHR5cGVfcG9zOworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgaWYgKGJ5dGVfb3JkZXIgPT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiU3dhcHBpbmcgbWVzc2FnZSBpbnRvIGNvbXBpbGVyIGJ5dGUgb3JkZXJcbiIpOworICAKKyAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworICAKKyAgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAodHlwZV9zdHIsIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5ib2R5LCAwKTsKKworICBfZGJ1c19oZWFkZXJfYnl0ZXN3YXAgKCZtZXNzYWdlLT5oZWFkZXIsIERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKSA9PQorICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7Cit9CisKKy8qKiBieXRlLXN3YXAgdGhlIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBtYXRjaCBvdXIgYnl0ZSBvcmRlci4KKyAqICBDYWxsZWQgb25seSB3aGVuIHdlIG5lZWQgdGhlIG1lc3NhZ2UgaW4gb3VyIG93biBieXRlIG9yZGVyLAorICogIG5vcm1hbGx5IHdoZW4gcmVhZGluZyBhcnJheXMgb2YgaW50ZWdlcnMgb3IgZG91Ymxlcy4KKyAqICBPdGhlcndpc2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgc2luY2UgaXQgd291bGQgZG8gbmVlZGxlc3MKKyAqICB3b3JrLgorICovCisjZGVmaW5lIGVuc3VyZV9ieXRlX29yZGVyKG1lc3NhZ2UpIF9kYnVzX21lc3NhZ2VfYnl0ZXN3YXAgKG1lc3NhZ2UpCisKKy8qKgorICogR2V0cyB0aGUgZGF0YSB0byBiZSBzZW50IG92ZXIgdGhlIG5ldHdvcmsgZm9yIHRoaXMgbWVzc2FnZS4KKyAqIFRoZSBoZWFkZXIgYW5kIHRoZW4gdGhlIGJvZHkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LgorICogVGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKKyAqIGRhdGEgb25jZSBhIG1lc3NhZ2UgaXMgbG9ja2VkICh3aXRoIGRidXNfbWVzc2FnZV9sb2NrKCkpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIGhlYWRlciByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2UgaGVhZGVyIGRhdGEuCisgKiBAcGFyYW0gYm9keSByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2UgYm9keSBkYXRhLgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgKERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICoqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICoqYm9keSkKK3sKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5sb2NrZWQpOworCisgICpoZWFkZXIgPSAmbWVzc2FnZS0+aGVhZGVyLmRhdGE7CisgICpib2R5ID0gJm1lc3NhZ2UtPmJvZHk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5peCBmZHMgdG8gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrIGZvciB0aGlzIG1lc3NhZ2UuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBkYXRhIG9uY2UgYQorICogbWVzc2FnZSBpcyBsb2NrZWQgKHdpdGggZGJ1c19tZXNzYWdlX2xvY2soKSkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0gZmRzIHJldHVybiBsb2NhdGlvbiBvZiB1bml4IGZkIGFycmF5CisgKiBAcGFyYW0gbl9mZHMgcmV0dXJuIG51bWJlciBvZiBlbnRyaWVzIGluIGFycmF5CisgKi8KK3ZvaWQgX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZHMoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICpuX2ZkcykKK3sKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5sb2NrZWQpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgKmZkcyA9IG1lc3NhZ2UtPnVuaXhfZmRzOworICAqbl9mZHMgPSBtZXNzYWdlLT5uX3VuaXhfZmRzOworI2Vsc2UKKyAgKmZkcyA9IE5VTEw7CisgICpuX2ZkcyA9IDA7CisjZW5kaWYKK30KKworLyoqCisgKiBTZXRzIHRoZSBzZXJpYWwgbnVtYmVyIG9mIGEgbWVzc2FnZS4KKyAqIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlIG9uIGEgbWVzc2FnZS4KKyAqCisgKiBEQnVzQ29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBzZXJpYWwgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgCisgKiB3aGVuIHRoZSBtZXNzYWdlIGlzIHNlbnQ7IHRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWVkZWQgd2hlbiBlbmNhcHN1bGF0aW5nIAorICogbWVzc2FnZXMgaW4gYW5vdGhlciBwcm90b2NvbCwgb3Igb3RoZXJ3aXNlIGJ5cGFzc2luZyBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNlcmlhbCB0aGUgc2VyaWFsCisgKi8KK3ZvaWQgCitkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKCZtZXNzYWdlLT5oZWFkZXIsIHNlcmlhbCk7Cit9CisKKy8qKgorICogQWRkcyBhIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgc2l6ZS91bml4IGZkcworICogb2YgdGhpcyBtZXNzYWdlLCBhbmQgZGVjcmVtZW50ZWQgYnkgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcworICogbWVzc2FnZSB3aGVuIHRoaXMgbWVzc2FnZSBpZiBmaW5hbGl6ZWQuICBUaGUgbGluayBjb250YWlucyBhCisgKiBjb3VudGVyIHdpdGggaXRzIHJlZmNvdW50IGFscmVhZHkgaW5jcmVtZW50ZWQsIGJ1dCB0aGUgY291bnRlcgorICogaXRzZWxmIG5vdCBpbmNyZW1lbnRlZC4gIE93bmVyc2hpcCBvZiBsaW5rIGFuZCBjb3VudGVyIHJlZmNvdW50IGlzCisgKiBwYXNzZWQgdG8gdGhlIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQXMgYSByZXN1bHQsIHRoZSBjb3VudGVyJ3MKKyAqIG5vdGlmeSBmdW5jdGlvbiBpcyBub3QgY2FsbGVkOyB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGVpdGhlciBjYWxsCisgKiBfZGJ1c19jb3VudGVyX25vdGlmeSgpIG9uIHRoZSBjb3VudGVyIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIGhvbGRpbmcKKyAqIGxvY2tzLCBvciB0YWtlIHRoZSBzYW1lIGFjdGlvbiB0aGF0IHdvdWxkIGJlIHRha2VuIGJ5IHRoZSBub3RpZnkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBsaW5rIGxpbmsgd2l0aCBjb3VudGVyIGFzIGRhdGEKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAqbGluaykKK3sKKyAgLyogcmlnaHQgbm93IHdlIGRvbid0IHJlY29tcHV0ZSB0aGUgZGVsdGEgd2hlbiBtZXNzYWdlCisgICAqIHNpemUgY2hhbmdlcywgYW5kIHRoYXQncyBPSyBmb3IgY3VycmVudCBwdXJwb3NlcworICAgKiBJIHRoaW5rLCBidXQgY291bGQgYmUgaW1wb3J0YW50IHRvIGNoYW5nZSBsYXRlci4KKyAgICogRG8gcmVjb21wdXRlIGl0IHdoZW5ldmVyIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyBjb3VudGVycywKKyAgICogc2luY2UgaXQncyBiYXNpY2FsbHkgZnJlZS4KKyAgICovCisgIGlmIChtZXNzYWdlLT5jb3VudGVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSA9CisgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpICsKKyAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEgPSBtZXNzYWdlLT5uX3VuaXhfZmRzOworI2VuZGlmCisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgibWVzc2FnZSBoYXMgc2l6ZSAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5zaXplX2NvdW50ZXJfZGVsdGEpOworI2VuZGlmCisgICAgfQorCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZtZXNzYWdlLT5jb3VudGVycywgbGluayk7CisKKyAgX2RidXNfY291bnRlcl9hZGp1c3Rfc2l6ZSAobGluay0+ZGF0YSwgbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKGxpbmstPmRhdGEsIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKK30KKworLyoqCisgKiBBZGRzIGEgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCBpbW1lZGlhdGVseSB3aXRoIHRoZSBzaXplL3VuaXggZmRzCisgKiBvZiB0aGlzIG1lc3NhZ2UsIGFuZCBkZWNyZW1lbnRlZCBieSB0aGUgc2l6ZS91bml4IGZkcyBvZiB0aGlzCisgKiBtZXNzYWdlIHdoZW4gdGhpcyBtZXNzYWdlIGlmIGZpbmFsaXplZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aCBsb2NrcyBoZWxkLiBBcyBhIHJlc3VsdCwgdGhlIGNvdW50ZXIncworICogbm90aWZ5IGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQ7IHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gZWl0aGVyIGNhbGwKKyAqIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkgb24gdGhlIGNvdW50ZXIgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgaG9sZGluZworICogbG9ja3MsIG9yIHRha2UgdGhlIHNhbWUgYWN0aW9uIHRoYXQgd291bGQgYmUgdGFrZW4gYnkgdGhlIG5vdGlmeSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXIgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvdW50ZXIpOworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19jb3VudGVyX3JlZiAoY291bnRlcik7CisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGNvdW50ZXIgdHJhY2tpbmcgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcyBtZXNzYWdlLCBhbmQKKyAqIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIgYnkgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJm1lc3NhZ2UtPmNvdW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJm1lc3NhZ2UtPmNvdW50ZXJzLCBsaW5rKTsKKworICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChjb3VudGVyLCAtIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChjb3VudGVyLCAtIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKworICBfZGJ1c19jb3VudGVyX25vdGlmeSAoY291bnRlcik7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvdW50ZXIpOworfQorCisvKioKKyAqIExvY2tzIGEgbWVzc2FnZS4gQWxsb3dzIGNoZWNraW5nIHRoYXQgYXBwbGljYXRpb25zIGRvbid0IGtlZXAgYQorICogcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBpbiB0aGUgb3V0Z29pbmcgcXVldWUgYW5kIGNoYW5nZSBpdAorICogdW5kZXJuZWF0aCB1cy4gTWVzc2FnZXMgYXJlIGxvY2tlZCB3aGVuIHRoZXkgZW50ZXIgdGhlIG91dGdvaW5nCisgKiBxdWV1ZSAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSgpKSwgYW5kIHRoZSBsaWJyYXJ5IGNvbXBsYWlucworICogaWYgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgd2hpbGUgbG9ja2VkLiBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvIAorICogY2FsbGVkIGV4dGVybmFsbHksIGZvciBhcHBsaWNhdGlvbnMgd3JhcHBpbmcgRC1CdXMgaW4gYW5vdGhlciBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2NrLgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfbG9jayAoREJ1c01lc3NhZ2UgICptZXNzYWdlKQoreworICBpZiAoIW1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfdXBkYXRlX2xlbmd0aHMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgICAgICAvKiBtdXN0IGhhdmUgYSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBib2R5ICovCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgICAgIG1lc3NhZ2UtPmxvY2tlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp2YWx1ZSkKK3sKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2hlYWRlcl9kZWxldGVfZmllbGQgKCZtZXNzYWdlLT5oZWFkZXIsIGZpZWxkKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Cit9CisKKyNpZiAwCisvKiBQcm9iYWJseSB3ZSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzICovCisvKioKKyAqIFNldHMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZSwgaS5lLiB0aGUgYXJndW1lbnRzIGluIHRoZQorICogbWVzc2FnZSBwYXlsb2FkLiBUaGUgc2lnbmF0dXJlIGluY2x1ZGVzIG9ubHkgImluIiBhcmd1bWVudHMgZm9yCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgYW5kIG9ubHkgIm91dCIgYXJndW1lbnRzIGZvcgorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4sIHNvIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCisgKiB3aGF0IHlvdSBtaWdodCBleHBlY3QgKGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUKKyAqIGVudGlyZSBDKystc3R5bGUgbWV0aG9kKS4KKyAqCisgKiBUaGUgc2lnbmF0dXJlIGlzIGEgc3RyaW5nIG1hZGUgdXAgb2YgdHlwZSBjb2RlcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyLiBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCBudWwgKG51bCBpcyBhbHNvCisgKiB0aGUgdmFsdWUgb2YgI0RCVVNfVFlQRV9JTlZBTElEKS4gVGhlIG1hY3JvcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyIGV2YWx1YXRlIHRvIGludGVnZXJzOyB0byBhc3NlbWJsZSBhIHNpZ25hdHVyZSB5b3UKKyAqIG1heSBmaW5kIGl0IHVzZWZ1bCB0byB1c2UgdGhlIHN0cmluZyBmb3Jtcywgc3VjaCBhcworICogI0RCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcuCisgKgorICogQW4gInVuc2V0IiBvciAjTlVMTCBzaWduYXR1cmUgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyBhbiBlbXB0eQorICogc2lnbmF0dXJlLiBJbiBmYWN0IGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkgd2lsbCBuZXZlciByZXR1cm4KKyAqICNOVUxMLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2Vfc2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzaWduYXR1cmUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfc2lnbmF0dXJlIChzaWduYXR1cmUpKTsKKyAgLyogY2FuJ3QgZGVsZXRlIHRoZSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBtZXNzYWdlIGJvZHkgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSk7Cit9CisjZW5kaWYKKworLyogTWVzc2FnZSBDYWNoZQorICoKKyAqIFdlIGNhY2hlIHNvbWUgREJ1c01lc3NhZ2UgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBhbGxvY2F0aW5nCisgKiB0aGVtLiAgSW4gbXkgcHJvZmlsaW5nIHRoaXMgY29uc2lzdGVudGx5IG1hZGUgYWJvdXQgYW4gOCUKKyAqIGRpZmZlcmVuY2UuICBJdCBhdm9pZHMgdGhlIG1hbGxvYyBmb3IgdGhlIG1lc3NhZ2UsIHRoZSBtYWxsb2MgZm9yCisgKiB0aGUgc2xvdCBsaXN0LCB0aGUgbWFsbG9jIGZvciB0aGUgaGVhZGVyIHN0cmluZyBhbmQgYm9keSBzdHJpbmcsCisgKiBhbmQgdGhlIGFzc29jaWF0ZWQgZnJlZSgpIGNhbGxzLiBJdCBkb2VzIGludHJvZHVjZSBhbm90aGVyIGdsb2JhbAorICogbG9jayB3aGljaCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlIGluIGNlcnRhaW4gY2FzZXMuCisgKgorICogRm9yIHRoZSBlY2hvIGNsaWVudC9zZXJ2ZXIgdGhlIHJvdW5kIHRyaXAgdGltZSBnb2VzIGZyb20gYXJvdW5kCisgKiAuMDAwMDc3IHRvIC4wMDAwNjkgd2l0aCB0aGUgbWVzc2FnZSBjYWNoZSBvbiBteSBsYXB0b3AuIFRoZSBzeXNwcm9mCisgKiBjaGFuZ2UgaXMgYXMgZm9sbG93cyAobnVtYmVycyBhcmUgY3VtdWxhdGl2ZSBwZXJjZW50YWdlKToKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGFycmF5IGFzIGl0IGlzIG5vdyAoMC4wMDAwNjkgcGVyKToKKyAqICAgIG5ld19lbXB0eV9oZWFkZXIgICAgICAgICAgIDEuNDYKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuNTYgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNDEKKyAqICAgIHVucmVmICAgICAgICAgICAgICAgICAgICAgIDIuMjQKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNjgKKyAqICAgICAgbGlzdF9jbGVhciAgICAgICAgICAgICAgIDAuNDMKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuMzMgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGxpc3QgKDAuMDAwMDcwIHBlciByb3VuZHRyaXApOgorICogICAgbmV3X2VtcHR5X2hlYWRlciAgICAgICAgICAgMi43MgorICogICAgICBsaXN0X3BvcF9maXJzdCAgICAgICAgICAgMS44OAorICogICAgdW5yZWYgICAgICAgICAgICAgICAgICAgICAgMy4zCisgKiAgICAgIGxpc3RfcHJlcGVuZCAgICAgICAgICAgICAxLjYzCisgKgorICogd2l0aG91dCBjYWNoZSAoMC4wMDAwNzcgcGVyIHJvdW5kdHJpcCk6CisgKiAgICBuZXdfZW1wdHlfaGVhZGVyICAgICAgICAgICA2LjcKKyAqICAgICAgc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIDMuNDMKKyAqICAgICAgICBkYnVzX21hbGxvYyAgICAgICAgICAgIDIuNDMKKyAqICAgICAgZGJ1c19tYWxsb2MwICAgICAgICAgICAgIDIuNTkKKyAqCisgKiAgICB1bnJlZiAgICAgICAgICAgICAgICAgICAgICA0LjAyCisgKiAgICAgIHN0cmluZ19mcmVlICAgICAgICAgICAgICAxLjgyCisgKiAgICAgICAgZGJ1c19mcmVlICAgICAgICAgICAgICAxLjYzCisgKiAgICAgIGRidXNfZnJlZSAgICAgICAgICAgICAgICAwLjcxCisgKgorICogSWYgeW91IGltcGxlbWVudCB0aGUgbWVzc2FnZV9jYWNoZSB3aXRoIGEgbGlzdCwgdGhlIHByaW1hcnkgcmVhc29uCisgKiBpdCdzIHNsb3dlciBpcyB0aGF0IHlvdSBhZGQgYW5vdGhlciB0aHJlYWQgbG9jayAob24gdGhlIERCdXNMaXN0CisgKiBtZW1wb29sKS4KKyAqLworCisvKiogQXZvaWQgY2FjaGluZyBodWdlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9NRVNTQUdFX1NJWkVfVE9fQ0FDSEUgMTAgKiBfREJVU19PTkVfS0lMT0JZVEUKKworLyoqIEF2b2lkIGNhY2hpbmcgdG9vIG1hbnkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSAgICA1CisKKy8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLIChtZXNzYWdlX2NhY2hlKSAqLworc3RhdGljIERCdXNNZXNzYWdlICptZXNzYWdlX2NhY2hlW01BWF9NRVNTQUdFX0NBQ0hFX1NJWkVdOworc3RhdGljIGludCBtZXNzYWdlX2NhY2hlX2NvdW50ID0gMDsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK2RidXNfbWVzc2FnZV9jYWNoZV9zaHV0ZG93biAodm9pZCAqZGF0YSkKK3sKKyAgaW50IGk7CisKKyAgaWYgKCFfREJVU19MT0NLIChtZXNzYWdlX2NhY2hlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ3ZSB3b3VsZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyAiCisgICAgICAgICJiZWZvcmUgcmVnaXN0ZXJpbmcgYSBzaHV0ZG93biBmdW5jdGlvbiIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpCisgICAgeworICAgICAgaWYgKG1lc3NhZ2VfY2FjaGVbaV0pCisgICAgICAgIGRidXNfbWVzc2FnZV9maW5hbGl6ZSAobWVzc2FnZV9jYWNoZVtpXSk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgbWVzc2FnZV9jYWNoZV9jb3VudCA9IDA7CisgIG1lc3NhZ2VfY2FjaGVfc2h1dGRvd25fcmVnaXN0ZXJlZCA9IEZBTFNFOworCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7Cit9CisKKy8qKgorICogVHJpZXMgdG8gZ2V0IGEgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGNhY2hlLiAgVGhlIHJldHJpZXZlZAorICogbWVzc2FnZSB3aWxsIGhhdmUganVuayBpbiBpdCwgc28gaXQgc3RpbGwgbmVlZHMgdG8gYmUgY2xlYXJlZCBvdXQKKyAqIGluIGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyKCkKKyAqCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm9uZSBjYWNoZWQKKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgaTsKKworICBtZXNzYWdlID0gTlVMTDsKKworICBpZiAoIV9EQlVTX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpKQorICAgIHsKKyAgICAgIC8qIHdlJ2QgaGF2ZSBpbml0aWFsaXplZCBnbG9iYWwgbG9ja3MgYmVmb3JlIGNhY2hpbmcgYW55dGhpbmcsCisgICAgICAgKiBzbyB0aGVyZSBjYW4ndCBiZSBhbnl0aGluZyBpbiB0aGUgY2FjaGUgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfY291bnQgPj0gMCk7CisKKyAgaWYgKG1lc3NhZ2VfY2FjaGVfY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfREJVU19VTkxPQ0sgKG1lc3NhZ2VfY2FjaGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUgdW5sZXNzIGNvdW50ID4gMCwgYW5kCisgICAqIG1lc3NhZ2VfY2FjaGUgaXMgdW5pbml0aWFsaXplZCB1bnRpbCB0aGUgc2h1dGRvd24gaXMKKyAgICogcmVnaXN0ZXJlZAorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpCisgICAgeworICAgICAgaWYgKG1lc3NhZ2VfY2FjaGVbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZV9jYWNoZVtpXTsKKyAgICAgICAgICBtZXNzYWdlX2NhY2hlW2ldID0gTlVMTDsKKyAgICAgICAgICBtZXNzYWdlX2NhY2hlX2NvdW50IC09IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICsraTsKKyAgICB9CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9jb3VudCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5jb3VudGVycyA9PSBOVUxMKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworc3RhdGljIHZvaWQKK2Nsb3NlX3VuaXhfZmRzKGludCAqZmRzLCB1bnNpZ25lZCAqbl9mZHMpCit7CisgIERCdXNFcnJvciBlOworICB1bnNpZ25lZCBpbnQgaTsKKworICBpZiAoKm5fZmRzIDw9IDApCisgICAgcmV0dXJuOworCisgIGRidXNfZXJyb3JfaW5pdCgmZSk7CisKKyAgZm9yIChpID0gMDsgaSA8ICpuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY2xvc2UoZmRzW2ldLCAmZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuKCJGYWlsZWQgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9yOiAlc1xuIiwgZS5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoJmUpOworICAgICAgICB9CisgICAgfQorCisgICpuX2ZkcyA9IDA7CisKKyAgLyogV2UgZG9uJ3QgZnJlZSB0aGUgYXJyYXkgaGVyZSwgaW4gY2FzZSB3ZSBjYW4gcmVjeWNsZSBpdCBsYXRlciAqLworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmcmVlX2NvdW50ZXIgKHZvaWQgKmVsZW1lbnQsCisgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIERCdXNDb3VudGVyICpjb3VudGVyID0gZWxlbWVudDsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYXRhOworCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgKGNvdW50ZXIsIC0gbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChjb3VudGVyLCAtIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKworICBfZGJ1c19jb3VudGVyX25vdGlmeSAoY291bnRlcik7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvdW50ZXIpOworfQorCisvKioKKyAqIFRyaWVzIHRvIGNhY2hlIGEgbWVzc2FnZSwgb3RoZXJ3aXNlIGZpbmFsaXplIGl0LgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkCitkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX2Jvb2xfdCB3YXNfY2FjaGVkOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgLyogVGhpcyBjYWxscyBhcHBsaWNhdGlvbiBjb2RlIGFuZCBoYXMgdG8gYmUgZG9uZSBmaXJzdCB0aGluZworICAgKiB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2sKKyAgICovCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NvdW50ZXIsIG1lc3NhZ2UpOworICBfZGJ1c19saXN0X2NsZWFyICgmbWVzc2FnZS0+Y291bnRlcnMpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgY2xvc2VfdW5peF9mZHMobWVzc2FnZS0+dW5peF9mZHMsICZtZXNzYWdlLT5uX3VuaXhfZmRzKTsKKyNlbmRpZgorCisgIHdhc19jYWNoZWQgPSBGQUxTRTsKKworICBpZiAoIV9EQlVTX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpKQorICAgIHsKKyAgICAgIC8qIFRoZSBvbmx5IHdheSB0byBnZXQgYSBub24tbnVsbCBtZXNzYWdlIGdvZXMgdGhyb3VnaAorICAgICAgICogZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQoKSB3aGljaCB0YWtlcyB0aGUgbG9jay4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHdvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgICAidGhlIGZpcnN0IHRpbWUgd2UgY29uc3RydWN0ZWQgYSBtZXNzYWdlIik7CisgICAgfQorCisgIGlmICghbWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9jb3VudCA9PSAwKTsKKworICAgICAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChkYnVzX21lc3NhZ2VfY2FjaGVfc2h1dGRvd24sIE5VTEwpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlX2NhY2hlW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkID0gVFJVRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID49IDApOworCisgIGlmICghX2RidXNfZW5hYmxlX21lc3NhZ2VfY2FjaGUgKCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSArCisgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSkgPgorICAgICAgTUFYX01FU1NBR0VfU0laRV9UT19DQUNIRSkKKyAgICBnb3RvIG91dDsKKworICBpZiAobWVzc2FnZV9jYWNoZV9jb3VudCA+PSBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZpbmQgZW1wdHkgc2xvdCAqLworICBpID0gMDsKKyAgd2hpbGUgKG1lc3NhZ2VfY2FjaGVbaV0gIT0gTlVMTCkKKyAgICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlW2ldID09IE5VTEwpOworICBtZXNzYWdlX2NhY2hlW2ldID0gbWVzc2FnZTsKKyAgbWVzc2FnZV9jYWNoZV9jb3VudCArPSAxOworICB3YXNfY2FjaGVkID0gVFJVRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBtZXNzYWdlLT5pbl9jYWNoZSA9IFRSVUU7CisjZW5kaWYKKworIG91dDoKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisgIAorICBpZiAoIXdhc19jYWNoZWQpCisgICAgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChtZXNzYWdlKTsKK30KKworI2lmIGRlZmluZWQoREJVU19FTkFCTEVfQ0hFQ0tTKSB8fCBkZWZpbmVkKERCVVNfRU5BQkxFX0FTU0VSVCkKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChEQnVzTWVzc2FnZVJlYWxJdGVyICppdGVyKQoreworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBpcyBOVUxMXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJml0ZXItPm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgaWYgKGl0ZXItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUikKKyAgICB7CisgICAgICBpZiAoaXRlci0+dS5yZWFkZXIuYnl0ZV9vcmRlciAhPSBieXRlX29yZGVyKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgY2hhbmdlZCBieXRlIG9yZGVyIHNpbmNlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIC8qIGJlY2F1c2Ugd2Ugc3dhcCB0aGUgbWVzc2FnZSBpbnRvIGNvbXBpbGVyIG9yZGVyIHdoZW4geW91IGluaXQgYW4gaXRlciAqLworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT51LnJlYWRlci5ieXRlX29yZGVyID09IERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7CisgICAgfQorICBlbHNlIGlmIChpdGVyLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpCisgICAgeworICAgICAgaWYgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgIT0gYnl0ZV9vcmRlcikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1cyBtZXNzYWdlIGNoYW5nZWQgYnl0ZSBvcmRlciBzaW5jZSBhcHBlbmQgaXRlcmF0b3Igd2FzIGNyZWF0ZWRcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgLyogYmVjYXVzZSB3ZSBzd2FwIHRoZSBtZXNzYWdlIGludG8gY29tcGlsZXIgb3JkZXIgd2hlbiB5b3UgaW5pdCBhbiBpdGVyICovCisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgPT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBsb29rcyB1bmluaXRpYWxpemVkIG9yIGNvcnJ1cHRlZFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChpdGVyLT5jaGFuZ2VkX3N0YW1wICE9IGl0ZXItPm1lc3NhZ2UtPmNoYW5nZWRfc3RhbXApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgaXRlcmF0b3IgaW52YWxpZCBiZWNhdXNlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIG1vZGlmaWVkIChvciBwZXJoYXBzIHRoZSBpdGVyYXRvciBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfQ0hFQ0tTIHx8IERCVVNfRU5BQkxFX0FTU0VSVCAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJhcmdzIGFyZy1nZXR0aW5nIGZ1bmN0aW9ucy4KKyAqIGRidXNfbWVzc2FnZV9nZXRfYXJncygpIGlzIHRoZSBwbGFjZSB0byBnbyBmb3IgY29tcGxldGUKKyAqIGRvY3VtZW50YXRpb24uCisgKgorICogQHNlZSBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIHZhcl9hcmdzIHJldHVybiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGxpc3Qgb2YgdHlwZS9sb2NhdGlvbiBwYWlycworICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICB2YXJfYXJncykKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgaW50IHNwZWNfdHlwZSwgbXNnX3R5cGUsIGksIGo7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCBjb3B5X2FyZ3M7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBzcGVjX3R5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKyAgaSA9IDA7CisKKyAgLyogY29weSB2YXJfYXJncyBmaXJzdCwgdGhlbiB3ZSBjYW4gZG8gYW5vdGhlciBpdGVyYXRpb24gb3ZlciBpdCB0bworICAgKiBmcmVlIG1lbW9yeSBhbmQgY2xvc2UgdW5peCBmZHMgaWYgcGFyc2UgZmFpbGVkIGF0IHNvbWUgcG9pbnQuCisgICAqLworICBEQlVTX1ZBX0NPUFkgKGNvcHlfYXJncywgdmFyX2FyZ3MpOworCisgIHdoaWxlIChzcGVjX3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgbXNnX3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZXIpOworCisgICAgICBpZiAobXNnX3R5cGUgIT0gc3BlY190eXBlKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50ICVkIGlzIHNwZWNpZmllZCB0byBiZSBvZiB0eXBlIFwiJXNcIiwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGFjdHVhbGx5IG9mIHR5cGUgXCIlc1wiXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoc3BlY190eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKG1zZ190eXBlKSk7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3BlY190eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSBpZHg7CisgICAgICAgICAgaW50ICpwZmQsIG5mZDsKKworICAgICAgICAgIHBmZCA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCopOworICAgICAgICAgIF9kYnVzX2Fzc2VydChwZmQpOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYygmcmVhbC0+dS5yZWFkZXIsICZpZHgpOworCisgICAgICAgICAgaWYgKGlkeC51MzIgPj0gcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgcmVmZXJzIHRvIGZpbGUgZGVzY3JpcHRvciBhdCBpbmRleCAlaSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGhhcyBvbmx5ICVpIGRlc2NyaXB0b3JzIGF0dGFjaGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeC51MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKG5mZCA9IF9kYnVzX2R1cChyZWFsLT5tZXNzYWdlLT51bml4X2Zkc1tpZHgudTMyXSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICpwZmQgPSBuZmQ7CisjZWxzZQorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBmaWxlIGRlc2NpcHRvciBwYXNzaW5nLlxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChzcGVjX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKnB0cjsKKworICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIERCdXNCYXNpY1ZhbHVlKik7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzcGVjX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBpbnQgc3BlY19lbGVtZW50X3R5cGU7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKipwdHI7CisgICAgICAgICAgaW50ICpuX2VsZW1lbnRzX3A7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgYXJyYXk7CisKKyAgICAgICAgICBzcGVjX2VsZW1lbnRfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICAgICAgZWxlbWVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKKworICAgICAgICAgIGlmIChzcGVjX2VsZW1lbnRfdHlwZSAhPSBlbGVtZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgJWQgaXMgc3BlY2lmaWVkIHRvIGJlIGFuIGFycmF5IG9mIFwiJXNcIiwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBhbiBhcnJheSBvZiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKHNwZWNfZWxlbWVudF90eXBlKSAmJgorICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzX3AgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgcHRyLCBuX2VsZW1lbnRzX3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9EQlVTX1RZUEVfSVNfU1RSSU5HTElLRSAoc3BlY19lbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICoqKnN0cl9hcnJheV9wOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICAgICAgY2hhciAqKnN0cl9hcnJheTsKKworICAgICAgICAgICAgICBzdHJfYXJyYXlfcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNoYXIqKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheV9wICE9IE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHNfcCAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAvKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSAwOworICAgICAgICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK25fZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdHJfYXJyYXkgPSBkYnVzX25ldzAgKGNoYXIqLCBuX2VsZW1lbnRzICsgMSk7CisgICAgICAgICAgICAgIGlmIChzdHJfYXJyYXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogTm93IGdvIHRocm91Z2ggYW5kIGR1cCBlYWNoIHN0cmluZyAqLworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZhcnJheSk7CisKKyAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgIHdoaWxlIChqIDwgbl9lbGVtZW50cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnMpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBzdHJfYXJyYXlbal0gPSBfZGJ1c19zdHJkdXAgKHMpOworICAgICAgICAgICAgICAgICAgaWYgKHN0cl9hcnJheVtqXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc3RyX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSkpCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaiA9PSBuX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpID09IERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChqID09IG5fZWxlbWVudHMpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheVtqXSA9PSBOVUxMKTsKKworICAgICAgICAgICAgICAqc3RyX2FycmF5X3AgPSBzdHJfYXJyYXk7CisgICAgICAgICAgICAgICpuX2VsZW1lbnRzX3AgPSBuX2VsZW1lbnRzOworICAgICAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbid0IHJlYWQgYXJyYXlzIG9mIGNvbnRhaW5lciB0eXBlcyAoc3RydWN0LCB2YXJpYW50LCBhcnJheSkgd2l0aCAlcyBmb3Igbm93XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbiBvbmx5IHJlYWQgYXJyYXlzIGFuZCBiYXNpYyB0eXBlcyB3aXRoICVzIGZvciBub3dcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBob3cgbWFueSBhcmd1bWVudHMgYWxyZWFkeSBoYW5kbGVkICovCisgICAgICBpKys7CisKKyAgICAgIHNwZWNfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFsLT51LnJlYWRlcikgJiYgc3BlY190eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgaGFzIG9ubHkgJWQgYXJndW1lbnRzLCBidXQgbW9yZSB3ZXJlIGV4cGVjdGVkIiwgaSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgLyogdGhlcmUgbWF5IG1lbW9yeSBvciB1bml4IGZkIGxlYWsgaW4gdGhlIGFib3ZlIGl0ZXJhdGlvbiBpZiBwYXJzZSBmYWlsZWQuCisgICAqIHNvIHdlIGhhdmUgYW5vdGhlciBpdGVyYXRpb24gb3ZlciBjb3B5X2FyZ3MgdG8gZnJlZSBtZW1vcnkgYW5kIGNsb3NlCisgICAqIHVuaXggZmRzLgorICAgKi8KKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgc3BlY190eXBlID0gZmlyc3RfYXJnX3R5cGU7CisgICAgICBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNwZWNfdHlwZSA9PSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICBpbnQgKnBmZDsKKworICAgICAgICAgICAgICBwZmQgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50ICopOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQocGZkKTsKKyAgICAgICAgICAgICAgaWYgKCpwZmQgPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoKnBmZCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAqcGZkID0gLTE7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChzcGVjX3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBtb3ZlIHRoZSBpbmRleCBmb3J3YXJkICovCisgICAgICAgICAgICAgIHZhX2FyZyAoY29weV9hcmdzLCBEQnVzQmFzaWNWYWx1ZSAqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzcGVjX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgc3BlY19lbGVtZW50X3R5cGU7CisKKyAgICAgICAgICAgICAgc3BlY19lbGVtZW50X3R5cGUgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoc3BlY19lbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIG1vdmUgdGhlIGluZGV4IGZvcndhcmQgKi8KKyAgICAgICAgICAgICAgICAgIHZhX2FyZyAoY29weV9hcmdzLCBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqKik7CisgICAgICAgICAgICAgICAgICB2YV9hcmcgKGNvcHlfYXJncywgaW50ICopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVFlQRV9JU19TVFJJTkdMSUtFIChzcGVjX2VsZW1lbnRfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciAqKipzdHJfYXJyYXlfcDsKKworICAgICAgICAgICAgICAgICAgc3RyX2FycmF5X3AgPSB2YV9hcmcgKGNvcHlfYXJncywgY2hhciAqKiopOworICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGUgaW5kZXggZm9yd2FyZCAqLworICAgICAgICAgICAgICAgICAgdmFfYXJnIChjb3B5X2FyZ3MsIGludCAqKTsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc3RyX2FycmF5X3AgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5ICgqc3RyX2FycmF5X3ApOworICAgICAgICAgICAgICAgICAgKnN0cl9hcnJheV9wID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzcGVjX3R5cGUgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50KTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgdmFfZW5kIChjb3B5X2FyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2UKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgTWVzc2FnZSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQSBEQnVzTWVzc2FnZSBpcyB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIGNvbW11bmljYXRpb24gb3ZlciBhCisgKiBEQnVzQ29ubmVjdGlvbi4gQSBEQnVzQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIGFwcGxpY2F0aW9uLCBhbmQgYSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAqIHNlbnQgdG8gYSByZW1vdGUgYXBwbGljYXRpb24uCisgKgorICogQSBtZXNzYWdlIGhhcyBhIG1lc3NhZ2UgdHlwZSwgcmV0dXJuZWQgZnJvbQorICogZGJ1c19tZXNzYWdlX2dldF90eXBlKCkuICBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEKKyAqIG1ldGhvZCBjYWxsLCBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwsIGEgc2lnbmFsLCBvciBhbiBlcnJvciByZXBseS4KKyAqCisgKiBBIG1lc3NhZ2UgaGFzIGhlYWRlciBmaWVsZHMgc3VjaCBhcyB0aGUgc2VuZGVyLCBkZXN0aW5hdGlvbiwgbWV0aG9kCisgKiBvciBzaWduYWwgbmFtZSwgYW5kIHNvIGZvcnRoLiBEQnVzTWVzc2FnZSBoYXMgYWNjZXNzb3IgZnVuY3Rpb25zIGZvcgorICogdGhlc2UsIHN1Y2ggYXMgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIoKS4KKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsKCksIGRidXNfbWVzc2FnZV9pc19zaWduYWwoKSwKKyAqIGFuZCBkYnVzX21lc3NhZ2VfaXNfZXJyb3IoKSBjaGVjayBzZXZlcmFsIGhlYWRlciBmaWVsZHMgYXQgb25jZSBhbmQgYXJlCisgKiBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIGNoZWNraW5nIHRoZSBoZWFkZXIgZmllbGRzIHdpdGggaW5kaXZpZHVhbAorICogYWNjZXNzb3IgZnVuY3Rpb25zLgorICoKKyAqIEZpbmFsbHksIGEgbWVzc2FnZSBoYXMgYXJndW1lbnRzLiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMKKyAqIGFyZSBpbiB0aGUgbWVzc2FnZSdzIHNpZ25hdHVyZSBoZWFkZXIgZmllbGQgKGFjY2Vzc2VkIHdpdGgKKyAqIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkpLiAgU2ltcGxlIGFyZ3VtZW50IHZhbHVlcyBhcmUgdXN1YWxseQorICogcmV0cmlldmVkIHdpdGggZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgYnV0IG1vcmUgY29tcGxleCB2YWx1ZXMgc3VjaAorICogYXMgc3RydWN0cyBtYXkgcmVxdWlyZSB0aGUgdXNlIG9mICNEQnVzTWVzc2FnZUl0ZXIuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZ29lcyBpbnRvIHNvbWUgbW9yZSBkZXRhaWwgYWJvdXQgaGVhZGVyIGZpZWxkcyBhbmQKKyAqIG1lc3NhZ2UgdHlwZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZQorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlCisgKiBzZW50IHRvIGFub3RoZXIgYXBwbGljYXRpb24uCisgKi8KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgb2YgYSBtZXNzYWdlIG9yIDAgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCisgKiBUaGUgbWVzc2FnZSdzIHNlcmlhbCBudW1iZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHNlbmRpbmcKKyAqIHRoZSBtZXNzYWdlIGFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlcGxpZXMgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIEFsbCBtZXNzYWdlcyByZWNlaXZlZCBvbiBhIGNvbm5lY3Rpb24gd2lsbCBoYXZlIGEgc2VyaWFsIHByb3ZpZGVkCisgKiBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uLgorICoKKyAqIEZvciBtZXNzYWdlcyB5b3UncmUgc2VuZGluZywgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSB3aWxsIGFzc2lnbiBhCisgKiBzZXJpYWwgYW5kIHJldHVybiBpdCB0byB5b3UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSBzZXJpYWwgb2YgYSBtZXNzYWdlICh0aGUgc2VyaWFsIG9mIHRoZSBtZXNzYWdlIHRoaXMKKyAqIGlzIGEgcmVwbHkgdG8pLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcmVwbHlfc2VyaWFsIHRoZSBzZXJpYWwgd2UncmUgcmVwbHlpbmcgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgcmVwbHlfc2VyaWFsKQoreworICBEQnVzQmFzaWNWYWx1ZSB2YWx1ZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV9zZXJpYWwgIT0gMCwgRkFMU0UpOyAvKiAwIGlzIGludmFsaWQgKi8KKworICB2YWx1ZS51MzIgPSByZXBseV9zZXJpYWw7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBhIHJlcGx5IHRvIG9yIDAgaWYgbm9uZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHJlcGx5IHNlcmlhbAorICovCitkYnVzX3VpbnQzMl90CitkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCAwKTsKKworICBpZiAoX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIHJldHVybiB2X1VJTlQzMjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIC8qIFRoaXMgY2FsbHMgYXBwbGljYXRpb24gY2FsbGJhY2tzISAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NvdW50ZXIsIG1lc3NhZ2UpOworICBfZGJ1c19saXN0X2NsZWFyICgmbWVzc2FnZS0+Y291bnRlcnMpOworCisgIF9kYnVzX2hlYWRlcl9mcmVlICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZXNzYWdlLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKG1lc3NhZ2UtPnVuaXhfZmRzLCAmbWVzc2FnZS0+bl91bml4X2Zkcyk7CisgIGRidXNfZnJlZShtZXNzYWdlLT51bml4X2Zkcyk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgZGJ1c19mcmVlIChtZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCBmcm9tX2NhY2hlOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2NhY2hlZCAoKTsKKworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBGQUxTRTsKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlLCAxKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBtZXNzYWdlLT5nZW5lcmF0aW9uID0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBOVUxMOworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworI2VuZGlmCisgICAgfQorCisgIF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIDAsIDEsICJuZXdfZW1wdHlfaGVhZGVyIik7CisKKyAgbWVzc2FnZS0+bG9ja2VkID0gRkFMU0U7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgbWVzc2FnZS0+aW5fY2FjaGUgPSBGQUxTRTsKKyNlbmRpZgorICBtZXNzYWdlLT5jb3VudGVycyA9IE5VTEw7CisgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSA9IDA7CisgIG1lc3NhZ2UtPmNoYW5nZWRfc3RhbXAgPSAwOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgbWVzc2FnZS0+bl91bml4X2ZkcyA9IDA7CisgIG1lc3NhZ2UtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gMDsKKyAgbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhID0gMDsKKyNlbmRpZgorCisgIGlmICghZnJvbV9jYWNoZSkKKyAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBpZiAoZnJvbV9jYWNoZSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfcmVpbml0ICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfaW5pdCAoJm1lc3NhZ2UtPmhlYWRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmbWVzc2FnZS0+Ym9keSwgMzIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGVhZGVyX2ZyZWUgKCZtZXNzYWdlLT5oZWFkZXIpOworICAgICAgICAgIGRidXNfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUuCisgKiBUeXBlcyBpbmNsdWRlICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsIGFuZCBzbyBmb3J0aC4KKyAqCisgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsKCksCisgKiBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4oKSwgZGJ1c19tZXNzYWdlX25ld19zaWduYWwoKSwKKyAqIG9yIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IoKSBpbnN0ZWFkLgorICogCisgKiBAcGFyYW0gbWVzc2FnZV90eXBlIHR5cGUgb2YgbWVzc2FnZQorICogQHJldHVybnMgbmV3IG1lc3NhZ2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ldyAoaW50IG1lc3NhZ2VfdHlwZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHRvIGludm9rZSBhIG1ldGhvZCBvbiBhIHJlbW90ZQorICogb2JqZWN0LiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZQorICogbWVzc2FnZS4gVGhlIGRlc3RpbmF0aW9uIG1heSBiZSAjTlVMTCBpbiB3aGljaCBjYXNlIG5vIGRlc3RpbmF0aW9uCisgKiBpcyBzZXQ7IHRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBELUJ1cyBpbiBhIHBlZXItdG8tcGVlcgorICogY29udGV4dCAobm8gbWVzc2FnZSBidXMpLiBUaGUgaW50ZXJmYWNlIG1heSBiZSAjTlVMTCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgaWYgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGl0IGlzIHVuZGVmaW5lZAorICogd2hpY2ggb25lIHdpbGwgYmUgaW52b2tlZC4KKyAqCisgKiBUaGUgcGF0aCBhbmQgbWV0aG9kIG5hbWVzIG1heSBub3QgYmUgI05VTEwuCisgKgorICogRGVzdGluYXRpb24sIHBhdGgsIGludGVyZmFjZSwgYW5kIG1ldGhvZCBuYW1lIGNhbid0IGNvbnRhaW4KKyAqIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgKHNlZSB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbikuCisgKiAKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiBuYW1lIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwYXRoIG9iamVjdCBwYXRoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IHRvCisgKiBAcGFyYW0gaWZhY2UgaW50ZXJmYWNlIHRvIGludm9rZSBtZXRob2Qgb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCB0byBpbnZva2UKKyAqCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzTWVzc2FnZSwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoY29uc3QgY2hhciAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXRob2QgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGVzdGluYXRpb24gPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChkZXN0aW5hdGlvbiksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKHBhdGgpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfaW50ZXJmYWNlIChpZmFjZSksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlciAobWV0aG9kKSwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sIHBhdGgsIGlmYWNlLCBtZXRob2QsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG1lc3NhZ2UgdGhhdCBpcyBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwuIFJldHVybnMKKyAqICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXRob2RfY2FsbCB0aGUgbWVzc2FnZSBiZWluZyByZXBsaWVkIHRvCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzTWVzc2FnZSwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAqbWV0aG9kX2NhbGwpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBjaGFyICpzZW5kZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXRob2RfY2FsbCAhPSBOVUxMLCBOVUxMKTsKKworICBzZW5kZXIgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWV0aG9kX2NhbGwpOworCisgIC8qIHNlbmRlciBpcyBhbGxvd2VkIHRvIGJlIG51bGwgaGVyZSBpbiBwZWVyLXRvLXBlZXIgY2FzZSAqLworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jcmVhdGUgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXRob2RfY2FsbCkpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHJlcHJlc2VudGluZyBhIHNpZ25hbCBlbWlzc2lvbi4gUmV0dXJucworICogI05VTEwgaWYgbWVtb3J5IGNhbid0IGJlIGFsbG9jYXRlZCBmb3IgdGhlIG1lc3NhZ2UuICBBIHNpZ25hbCBpcworICogaWRlbnRpZmllZCBieSBpdHMgb3JpZ2luYXRpbmcgb2JqZWN0IHBhdGgsIGludGVyZmFjZSwgYW5kIHRoZSBuYW1lCisgKiBvZiB0aGUgc2lnbmFsLgorICoKKyAqIFBhdGgsIGludGVyZmFjZSwgYW5kIHNpZ25hbCBuYW1lIG11c3QgYWxsIGJlIHZhbGlkICh0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgc3ludGF4IG9mIHRoZXNlIGZpZWxkcykuCisgKiAKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBvYmplY3QgZW1pdHRpbmcgdGhlIHNpZ25hbAorICogQHBhcmFtIGlmYWNlIHRoZSBpbnRlcmZhY2UgdGhlIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20KKyAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHNpZ25hbAorICogQHJldHVybnMgYSBuZXcgREJ1c01lc3NhZ2UsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKHBhdGgpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UgKGlmYWNlKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChuYW1lKSwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBhdGgsIGlmYWNlLCBuYW1lLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB0aGF0IGlzIGFuIGVycm9yIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZS4KKyAqIEVycm9yIHJlcGxpZXMgYXJlIG1vc3QgY29tbW9uIGluIHJlc3BvbnNlIHRvIG1ldGhvZCBjYWxscywgYnV0CisgKiBjYW4gYmUgcmV0dXJuZWQgaW4gcmVwbHkgdG8gYW55IG1lc3NhZ2UuCisgKgorICogVGhlIGVycm9yIG5hbWUgbXVzdCBiZSBhIHZhbGlkIGVycm9yIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBzeW50YXgKKyAqIGdpdmVuIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBtYWtlCisgKiB1cCBhbiBlcnJvciBuYW1lIGp1c3QgdXNlICNEQlVTX0VSUk9SX0ZBSUxFRC4KKyAqCisgKiBAcGFyYW0gcmVwbHlfdG8gdGhlIG1lc3NhZ2Ugd2UncmUgcmVwbHlpbmcgdG8KKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBlcnJvciBuYW1lCisgKiBAcGFyYW0gZXJyb3JfbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgKG9yICNOVUxMIGZvciBub25lLCBidXQgcGxlYXNlIGdpdmUgYSBtZXNzYWdlKQorICogQHJldHVybnMgYSBuZXcgZXJyb3IgbWVzc2FnZSBvYmplY3QsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfZXJyb3IgKERCdXNNZXNzYWdlICpyZXBseV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX21lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBjaGFyICpzZW5kZXI7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVwbHlfdG8gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZXJyb3JfbmFtZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lIChlcnJvcl9uYW1lKSwgTlVMTCk7CisKKyAgc2VuZGVyID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKHJlcGx5X3RvKTsKKworICAvKiBzZW5kZXIgbWF5IGJlIE5VTEwgZm9yIG5vbi1tZXNzYWdlLWJ1cyBjYXNlIG9yCisgICAqIHdoZW4gdGhlIG1lc3NhZ2UgYnVzIGlzIGRlYWxpbmcgd2l0aCBhbiB1bnJlZ2lzdGVyZWQKKyAgICogY29ubmVjdGlvbi4KKyAgICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jcmVhdGUgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgTlVMTCwgTlVMTCwgTlVMTCwgZXJyb3JfbmFtZSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAocmVwbHlfdG8pKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChlcnJvcl9tZXNzYWdlICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHRoYXQgaXMgYW4gZXJyb3IgcmVwbHkgdG8gYW5vdGhlciBtZXNzYWdlLCBhbGxvd2luZworICogeW91IHRvIHVzZSBwcmludGYgZm9ybWF0dGluZy4KKyAqCisgKiBTZWUgZGJ1c19tZXNzYWdlX25ld19lcnJvcigpIGZvciBkZXRhaWxzIC0gdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZQorICogYXNpZGUgZnJvbSB0aGUgcHJpbnRmIGZvcm1hdHRpbmcuCisgKgorICogQHRvZG8gYWRkIF9EQlVTX0dOVUNfUFJJTlRGIHRvIHRoaXMgKHJlcXVpcmVzIG1vdmluZyBfREJVU19HTlVDX1BSSU5URiB0bworICogcHVibGljIGhlYWRlciwgc2VlIERCVVNfREVQUkVDQVRFRCBmb3IgYW4gZXhhbXBsZSkKKyAqIAorICogQHBhcmFtIHJlcGx5X3RvIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgZXJyb3IgbmFtZQorICogQHBhcmFtIGVycm9yX2Zvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZSBmb3JtYXQgYXMgd2l0aCBwcmludGYKKyAqIEBwYXJhbSAuLi4gZm9ybWF0IHN0cmluZyBhcmd1bWVudHMKKyAqIEByZXR1cm5zIGEgbmV3IGVycm9yIG1lc3NhZ2UKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3ByaW50ZiAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorCQkJICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9mb3JtYXQsCisJCQkgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlcGx5X3RvICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSAoZXJyb3JfbmFtZSksIE5VTEwpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIHZhX3N0YXJ0IChhcmdzLCBlcnJvcl9mb3JtYXQpOworCisgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKCZzdHIsIGVycm9yX2Zvcm1hdCwgYXJncykpCisgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKHJlcGx5X3RvLCBlcnJvcl9uYW1lLAorCQkJCSAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICBlbHNlCisgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHZhX2VuZCAoYXJncyk7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgdGhhdCBpcyBhbiBleGFjdCByZXBsaWNhIG9mIHRoZSBtZXNzYWdlCisgKiBzcGVjaWZpZWQsIGV4Y2VwdCB0aGF0IGl0cyByZWZjb3VudCBpcyBzZXQgdG8gMSwgaXRzIG1lc3NhZ2Ugc2VyaWFsCisgKiBpcyByZXNldCB0byAwLCBhbmQgaWYgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugd2FzICJsb2NrZWQiIChpbiB0aGUKKyAqIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUgYW5kIHRodXMgbm90IG1vZGlmaWFibGUpIHRoZSBuZXcgbWVzc2FnZQorICogd2lsbCBub3QgYmUgbG9ja2VkLgorICoKKyAqIEB0b2RvIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCBpbiBwcm9ncmFtcyB0aGF0IHRyeSB0byByZWNvdmVyIGZyb20gT09NIGVycm9ycy4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG5ldyBtZXNzYWdlLm9yICNOVUxMIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIFVuaXggZmlsZSBkZXNjcmlwdG9ycyAoaW4gY2FzZSB0aGUgbWVzc2FnZSB0byBjb3B5IGluY2x1ZGVzIFVuaXggZmlsZSBkZXNjcmlwdG9ycykgY2FuIGJlIGFsbG9jYXRlZC4KKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX2NvcHkgKGNvbnN0IERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICByZXR2YWwgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlLCAxKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX2F0b21pY19pbmMgKCZyZXR2YWwtPnJlZmNvdW50KTsKKworICByZXR2YWwtPmxvY2tlZCA9IEZBTFNFOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIHJldHZhbC0+Z2VuZXJhdGlvbiA9IG1lc3NhZ2UtPmdlbmVyYXRpb247CisjZW5kaWYKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jb3B5ICgmbWVzc2FnZS0+aGVhZGVyLCAmcmV0dmFsLT5oZWFkZXIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoJnJldHZhbC0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9mcmVlICgmcmV0dmFsLT5oZWFkZXIpOworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZtZXNzYWdlLT5ib2R5LCAwLAorCQkJICAmcmV0dmFsLT5ib2R5LCAwKSkKKyAgICBnb3RvIGZhaWxlZF9jb3B5OworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgcmV0dmFsLT51bml4X2ZkcyA9IGRidXNfbmV3KGludCwgbWVzc2FnZS0+bl91bml4X2Zkcyk7CisgIGlmIChyZXR2YWwtPnVuaXhfZmRzID09IE5VTEwgJiYgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgZ290byBmYWlsZWRfY29weTsKKworICByZXR2YWwtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbWVzc2FnZS0+bl91bml4X2ZkczsKKworICBmb3IgKHJldHZhbC0+bl91bml4X2ZkcyA9IDA7CisgICAgICAgcmV0dmFsLT5uX3VuaXhfZmRzIDwgbWVzc2FnZS0+bl91bml4X2ZkczsKKyAgICAgICByZXR2YWwtPm5fdW5peF9mZHMrKykKKyAgICB7CisgICAgICByZXR2YWwtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10gPSBfZGJ1c19kdXAobWVzc2FnZS0+dW5peF9mZHNbcmV0dmFsLT5uX3VuaXhfZmRzXSwgTlVMTCk7CisKKyAgICAgIGlmIChyZXR2YWwtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10gPCAwKQorICAgICAgICBnb3RvIGZhaWxlZF9jb3B5OworICAgIH0KKworI2VuZGlmCisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKHJldHZhbCwgMCwgMSwgImNvcHkiKTsKKyAgcmV0dXJuIHJldHZhbDsKKworIGZhaWxlZF9jb3B5OgorICBfZGJ1c19oZWFkZXJfZnJlZSAoJnJldHZhbC0+aGVhZGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwtPmJvZHkpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgY2xvc2VfdW5peF9mZHMocmV0dmFsLT51bml4X2ZkcywgJnJldHZhbC0+bl91bml4X2Zkcyk7CisgIGRidXNfZnJlZShyZXR2YWwtPnVuaXhfZmRzKTsKKyNlbmRpZgorCisgIGRidXNfZnJlZSAocmV0dmFsKTsKKworICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNNZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZQorICogQHNlZSBkYnVzX21lc3NhZ2VfdW5yZWYKKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX3JlZiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UtPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+aW5fY2FjaGUsIE5VTEwpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDEpOworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZSwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLCAicmVmIik7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c01lc3NhZ2UsIGZyZWVpbmcgdGhlCisgKiBtZXNzYWdlIGlmIHRoZSBjb3VudCByZWFjaGVzIDAuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX3JlZgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfdW5yZWYgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+aW5fY2FjaGUpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPj0gMSk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIHsKKyAgICAgIC8qIENhbGxzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyEgKi8KKyAgICAgIGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSAobWVzc2FnZSk7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgYSBtZXNzYWdlLiBUeXBlcyBpbmNsdWRlCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOLAorICogI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLCAjREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLCBidXQgb3RoZXIKKyAqIHR5cGVzIGFyZSBhbGxvd2VkIGFuZCBhbGwgY29kZSBtdXN0IHNpbGVudGx5IGlnbm9yZSBtZXNzYWdlcyBvZgorICogdW5rbm93biB0eXBlLiAjREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCB3aWxsIG5ldmVyIGJlIHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZQorICovCitpbnQKK2RidXNfbWVzc2FnZV9nZXRfdHlwZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKTsKKworICByZXR1cm4gX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgKCZtZXNzYWdlLT5oZWFkZXIpOworfQorCisvKioKKyAqIEFwcGVuZHMgZmllbGRzIHRvIGEgbWVzc2FnZSBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuIFRoZQorICogdmFyaWFibGUgYXJndW1lbnQgbGlzdCBzaG91bGQgY29udGFpbiB0aGUgdHlwZSBvZiBlYWNoIGFyZ3VtZW50CisgKiBmb2xsb3dlZCBieSB0aGUgdmFsdWUgdG8gYXBwZW5kLiBBcHBlbmRhYmxlIHR5cGVzIGFyZSBiYXNpYyB0eXBlcywKKyAqIGFuZCBhcnJheXMgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzIChleGNlcHQgYXJyYXlzIG9mIFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLiBUbyBhcHBlbmQgdmFyaWFibGUtbGVuZ3RoIGJhc2ljIHR5cGVzLCBvciBhbnkgbW9yZQorICogY29tcGxleCB2YWx1ZSwgeW91IGhhdmUgdG8gdXNlIGFuIGl0ZXJhdG9yIHJhdGhlciB0aGFuIHRoaXMKKyAqIGZ1bmN0aW9uLgorICoKKyAqIFRvIGFwcGVuZCBhIGJhc2ljIHR5cGUsIHNwZWNpZnkgaXRzIHR5cGUgY29kZSBmb2xsb3dlZCBieSB0aGUKKyAqIGFkZHJlc3Mgb2YgdGhlIHZhbHVlLiBGb3IgZXhhbXBsZToKKyAqCisgKiBAY29kZQorICoKKyAqIGRidXNfaW50MzJfdCB2X0lOVDMyID0gNDI7CisgKiBjb25zdCBjaGFyICp2X1NUUklORyA9ICJIZWxsbyBXb3JsZCI7CisgKiBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICogQGVuZGNvZGUKKyAqCisgKiBUbyBhcHBlbmQgYW4gYXJyYXkgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzIChleGNlcHQgVW5peCBmaWxlCisgKiBkZXNjcmlwdG9ycyksIHBhc3MgaW4gdGhlIERCVVNfVFlQRV9BUlJBWSB0eXBlY29kZSwgdGhlIGVsZW1lbnQKKyAqIHR5cGVjb2RlLCB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkgcG9pbnRlciwgYW5kIGEgMzItYml0IGludGVnZXIKKyAqIGdpdmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gU28gZm9yIGV4YW1wbGU6IEBjb2RlCisgKiBjb25zdCBkYnVzX2ludDMyX3QgYXJyYXlbXSA9IHsgMSwgMiwgMyB9OyBjb25zdCBkYnVzX2ludDMyX3QKKyAqICp2X0FSUkFZID0gYXJyYXk7IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAqIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMywgREJVU19UWVBFX0lOVkFMSUQpOworICogQGVuZGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzIG9mIFVuaXggZmlsZSBkZXNjcmlwdG9ycy4gSWYKKyAqIHlvdSBuZWVkIHRob3NlIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlY3Vyc2UgaW50byB0aGUgYXJyYXkuCisgKgorICogRm9yIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJuYWxseSBkdXBsaWNhdGUKKyAqIHRoZSBkZXNjcmlwdG9yIHlvdSBwYXNzZWQgaW4uIEhlbmNlIHlvdSBtYXkgY2xvc2UgdGhlIGRlc2NyaXB0b3IKKyAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBAd2FybmluZyBpbiBDLCBnaXZlbiAiaW50IGFycmF5W10iLCAiJmFycmF5ID09IGFycmF5IiAodGhlCisgKiBjb21wLmxhbmcuYyBGQVEgc2F5cyBvdGhlcndpc2UsIGJ1dCBnY2MgYW5kIHRoZSBGQVEgZG9uJ3QgYWdyZWUpLgorICogU28gaWYgeW91J3JlIHVzaW5nIGFuIGFycmF5IGluc3RlYWQgb2YgYSBwb2ludGVyIHlvdSBoYXZlIHRvIGNyZWF0ZQorICogYSBwb2ludGVyIHZhcmlhYmxlLCBhc3NpZ24gdGhlIGFycmF5IHRvIGl0LCB0aGVuIHRha2UgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBwb2ludGVyIHZhcmlhYmxlLiBGb3Igc3RyaW5ncyBpdCB3b3JrcyB0byB3cml0ZQorICogY29uc3QgY2hhciAqYXJyYXkgPSAiSGVsbG8iIGFuZCB0aGVuIHVzZSAmYXJyYXkgdGhvdWdoLgorICoKKyAqIFRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSAjREJVU19UWVBFX0lOVkFMSUQsCisgKiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuIElmIHlvdSBkb24ndCBkbyB0aGlzCisgKiB0aGVuIGxpYmRidXMgd29uJ3Qga25vdyB0byBzdG9wIGFuZCB3aWxsIHJlYWQgaW52YWxpZCBtZW1vcnkuCisgKgorICogU3RyaW5nL3NpZ25hdHVyZS9wYXRoIGFycmF5cyBzaG91bGQgYmUgcGFzc2VkIGluIGFzICJjb25zdCBjaGFyKioqCisgKiBhZGRyZXNzX29mX2FycmF5IiBhbmQgImludCBuX2VsZW1lbnRzIgorICoKKyAqIEB0b2RvIHN1cHBvcnQgREJVU19UWVBFX1NUUlVDVCBhbmQgREJVU19UWVBFX1ZBUklBTlQgYW5kIGNvbXBsZXggYXJyYXlzCisgKgorICogQHRvZG8gSWYgdGhpcyBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZAorICogeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGZpcnN0X2FyZ190eXBlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50CisgKiBAcGFyYW0gLi4uIHZhbHVlIG9mIGZpcnN0IGFyZ3VtZW50LCBsaXN0IG9mIGFkZGl0aW9uYWwgdHlwZS12YWx1ZSBwYWlycworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKwkJCSAgaW50ICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJICAuLi4pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHZhX3N0YXJ0ICh2YXJfYXJncywgZmlyc3RfYXJnX3R5cGUpOworICByZXR2YWwgPSBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0IChtZXNzYWdlLAorCQkJCQkgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICB2YXJfYXJncyk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogTGlrZSBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MoKSBidXQgdGFrZXMgYSB2YV9saXN0IGZvciB1c2UgYnkgbGFuZ3VhZ2UgYmluZGluZ3MuCisgKgorICogQHRvZG8gZm9yIG5vdywgaWYgdGhpcyBmdW5jdGlvbiBmYWlscyBkdWUgdG8gT09NIGl0IHdpbGwgbGVhdmUKKyAqIHRoZSBtZXNzYWdlIGhhbGYtd3JpdHRlbiBhbmQgeW91IGhhdmUgdG8gZGlzY2FyZCB0aGUgbWVzc2FnZQorICogYW5kIHN0YXJ0IG92ZXIuCisgKgorICogQHNlZSBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MuCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGZpcnN0X2FyZ190eXBlIHR5cGUgb2YgZmlyc3QgYXJndW1lbnQKKyAqIEBwYXJhbSB2YXJfYXJncyB2YWx1ZSBvZiBmaXJzdCBhcmd1bWVudCwgdGhlbiBsaXN0IG9mIHR5cGUvdmFsdWUgcGFpcnMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QgKERCdXNNZXNzYWdlICptZXNzYWdlLAorCQkJCSBpbnQgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJIHZhX2xpc3QgICAgICB2YXJfYXJncykKK3sKKyAgaW50IHR5cGU7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgdHlwZSA9IGZpcnN0X2FyZ190eXBlOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisKKyAgd2hpbGUgKHR5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgaWYgKGRidXNfdHlwZV9pc19iYXNpYyAodHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqdmFsdWU7CisgICAgICAgICAgdmFsdWUgPSB2YV9hcmcgKHZhcl9hcmdzLCBjb25zdCBEQnVzQmFzaWNWYWx1ZSopOworCisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgZWxlbWVudF90eXBlOworICAgICAgICAgIERCdXNNZXNzYWdlSXRlciBhcnJheTsKKyAgICAgICAgICBjaGFyIGJ1ZlsyXTsKKworICAgICAgICAgIGVsZW1lbnRfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgIGJ1ZlswXSA9IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBidWZbMV0gPSAnXDAnOworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5KSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSAmJgorICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IERCdXNCYXNpY1ZhbHVlICoqdmFsdWU7CisgICAgICAgICAgICAgIGludCBuX2VsZW1lbnRzOworCisgICAgICAgICAgICAgIHZhbHVlID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgREJ1c0Jhc2ljVmFsdWUqKik7CisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfZml4ZWRfYXJyYXkgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cykpIHsKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZhcnJheSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfREJVU19UWVBFX0lTX1NUUklOR0xJS0UgKGVsZW1lbnRfdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKioqdmFsdWVfcDsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZhbHVlOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2YWx1ZV9wID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgY2hhcioqKik7CisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworCisgICAgICAgICAgICAgIHZhbHVlID0gKnZhbHVlX3A7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2VsZW1lbnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyYXkpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYXJyYXlzIG9mICVzIGNhbid0IGJlIGFwcGVuZGVkIHdpdGggJXMgZm9yIG5vd1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGVsZW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycmF5KSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJ0eXBlICVzIGlzbid0IHN1cHBvcnRlZCB5ZXQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHR5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgYXJndW1lbnRzIGZyb20gYSBtZXNzYWdlIGdpdmVuIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4gIFRoZQorICogc3VwcG9ydGVkIHR5cGVzIGluY2x1ZGUgdGhvc2Ugc3VwcG9ydGVkIGJ5CisgKiBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MoKTsgdGhhdCBpcywgYmFzaWMgdHlwZXMgYW5kIGFycmF5cyBvZgorICogZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgdGhleSB3b3VsZAorICogYmUgZm9yIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpIG9yCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKS4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aG9zZSB0eXBlcywgYXJyYXlzIG9mIHN0cmluZywgb2JqZWN0IHBhdGgsIGFuZAorICogc2lnbmF0dXJlIGFyZSBzdXBwb3J0ZWQ7IGJ1dCB0aGVzZSBhcmUgcmV0dXJuZWQgYXMgYWxsb2NhdGVkIG1lbW9yeQorICogYW5kIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCksIHdoaWxlIHRoZSBvdGhlcgorICogdHlwZXMgYXJlIHJldHVybmVkIGFzIGNvbnN0IHJlZmVyZW5jZXMuIFRvIGdldCBhIHN0cmluZyBhcnJheQorICogcGFzcyBpbiAiY2hhciAqKiphcnJheV9sb2NhdGlvbiIgYW5kICJpbnQgKm5fZWxlbWVudHMiLgorICoKKyAqIFNpbWlsYXIgdG8gZGJ1c19tZXNzYWdlX2dldF9maXhlZF9hcnJheSgpIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAqIHN1cHBvcnQgYXJyYXlzIG9mIHR5cGUgREJVU19UWVBFX1VOSVhfRkQuIElmIHlvdSBuZWVkIHRvIHBhcnNlCisgKiBtZXNzYWdlcyB3aXRoIGFycmF5cyBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMgeW91IG5lZWQgdG8gcmVjdXJzZQorICogaW50byB0aGUgYXJyYXkgbWFudWFsbHkuCisgKgorICogVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHJlYWQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZQorICogdGhlIEZEX0NMT0VYRUMgZmxhZyBzZXQuIElmIHlvdSBuZWVkIHRoZW0gd2l0aG91dCB0aGlzIGZsYWcgc2V0LAorICogbWFrZSBzdXJlIHRvIHVuc2V0IGl0IHdpdGggZmNudGwoKS4KKyAqCisgKiBUaGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBzaG91bGQgY29udGFpbiB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQKKyAqIGZvbGxvd2VkIGJ5IGEgcG9pbnRlciB0byB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZC4gVGhlIGxpc3QKKyAqIGlzIHRlcm1pbmF0ZWQgd2l0aCAjREJVU19UWVBFX0lOVkFMSUQuCisgKgorICogRXhjZXB0IGZvciBzdHJpbmcgYXJyYXlzLCB0aGUgcmV0dXJuZWQgdmFsdWVzIGFyZSBjb25zdGFudDsgZG8gbm90CisgKiBmcmVlIHRoZW0uIFRoZXkgcG9pbnQgaW50byB0aGUgI0RCdXNNZXNzYWdlLgorICoKKyAqIElmIHRoZSByZXF1ZXN0ZWQgYXJndW1lbnRzIGFyZSBub3QgcHJlc2VudCwgb3IgZG8gbm90IGhhdmUgdGhlCisgKiByZXF1ZXN0ZWQgdHlwZXMsIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSBzZXQuCisgKgorICogSWYgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1ZXN0ZWQgYXJlIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQKKyAqIGFyZ3VtZW50cyBhcmUgcmV0dXJuZWQgYW5kIHRoZSBleHRyYSBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgKiAKKyAqIEB0b2RvIHN1cHBvcnQgREJVU19UWVBFX1NUUlVDVCBhbmQgREJVU19UWVBFX1ZBUklBTlQgYW5kIGNvbXBsZXggYXJyYXlzCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4gb24gZmFpbHVyZQorICogQHBhcmFtIGZpcnN0X2FyZ190eXBlIHRoZSBmaXJzdCBhcmd1bWVudCB0eXBlCisgKiBAcGFyYW0gLi4uIGxvY2F0aW9uIGZvciBmaXJzdCBhcmd1bWVudCB2YWx1ZSwgdGhlbiBsaXN0IG9mIHR5cGUtbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9hcmdzIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkgICAgICAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgdmFfc3RhcnQgKHZhcl9hcmdzLCBmaXJzdF9hcmdfdHlwZSk7CisgIHJldHZhbCA9IGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgKG1lc3NhZ2UsIGVycm9yLCBmaXJzdF9hcmdfdHlwZSwgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIExpa2UgZGJ1c19tZXNzYWdlX2dldF9hcmdzIGJ1dCB0YWtlcyBhIHZhX2xpc3QgZm9yIHVzZSBieSBsYW5ndWFnZSBiaW5kaW5ncy4KKyAqCisgKiBAc2VlIGRidXNfbWVzc2FnZV9nZXRfYXJncworICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIHZhcl9hcmdzIHJldHVybiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGxpc3Qgb2YgdHlwZS9sb2NhdGlvbiBwYWlycworICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJICAgICAgdmFfbGlzdCAgICAgICAgICB2YXJfYXJncykKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICByZXR1cm4gX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoJml0ZXIsIGVycm9yLCBmaXJzdF9hcmdfdHlwZSwgdmFyX2FyZ3MpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfbWVzc2FnZV9pdGVyX2luaXRfY29tbW9uIChEQnVzTWVzc2FnZSAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUpCit7CisgIC8qIElmIHRoZXNlIHN0YXRpYyBhc3NlcnRpb25zIGZhaWwgb24geW91ciBwbGF0Zm9ybSwgcmVwb3J0IGl0IGFzIGEgYnVnLiAqLworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNNZXNzYWdlUmVhbEl0ZXIpIDw9IHNpemVvZiAoREJ1c01lc3NhZ2VJdGVyKSk7CisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKF9EQlVTX0FMSUdOT0YgKERCdXNNZXNzYWdlUmVhbEl0ZXIpIDw9CisgICAgICBfREJVU19BTElHTk9GIChEQnVzTWVzc2FnZUl0ZXIpKTsKKyAgLyogQSBmYWlsdXJlIG9mIHRoZXNlIHR3byBhc3NlcnRpb25zIHdvdWxkIGluZGljYXRlIHRoYXQgd2UndmUgYnJva2VuCisgICAqIEFCSSBvbiB0aGlzIHBsYXRmb3JtIHNpbmNlIDEuMTAuMC4gKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzTWVzc2FnZUl0ZXJfMV8xMF8wKSA9PQorICAgICAgc2l6ZW9mIChEQnVzTWVzc2FnZUl0ZXIpKTsKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoX0RCVVNfQUxJR05PRiAoREJ1c01lc3NhZ2VJdGVyXzFfMTBfMCkgPT0KKyAgICAgIF9EQlVTX0FMSUdOT0YgKERCdXNNZXNzYWdlSXRlcikpOworICAvKiBJZiB0aGlzIHN0YXRpYyBhc3NlcnRpb24gZmFpbHMsIGl0IG1lYW5zIHRoZSBEQnVzTWVzc2FnZUl0ZXIgc3RydWN0CisgICAqIGlzIG5vdCAicGFja2VkIiwgd2hpY2ggbWlnaHQgcmVzdWx0IGluICJpdGVyID0gb3RoZXJfaXRlciIgbm90IGNvcHlpbmcKKyAgICogZXZlcnkgYnl0ZS4gKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzTWVzc2FnZUl0ZXIpID09CisgICAgICA0ICogc2l6ZW9mICh2b2lkICopICsgc2l6ZW9mIChkYnVzX3VpbnQzMl90KSArIDkgKiBzaXplb2YgKGludCkpOworCisgIC8qIFNpbmNlIHRoZSBpdGVyYXRvciB3aWxsIHJlYWQgb3Igd3JpdGUgd2hvLWtub3dzLXdoYXQgZnJvbSB0aGUKKyAgICogbWVzc2FnZSwgd2UgbmVlZCB0byBnZXQgaW4gdGhlIHJpZ2h0IGJ5dGUgb3JkZXIKKyAgICovCisgIGVuc3VyZV9ieXRlX29yZGVyIChtZXNzYWdlKTsKKyAgCisgIHJlYWwtPm1lc3NhZ2UgPSBtZXNzYWdlOworICByZWFsLT5jaGFuZ2VkX3N0YW1wID0gbWVzc2FnZS0+Y2hhbmdlZF9zdGFtcDsKKyAgcmVhbC0+aXRlcl90eXBlID0gaXRlcl90eXBlOworICByZWFsLT5zaWdfcmVmY291bnQgPSAwOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNNZXNzYWdlSXRlciBmb3IgcmVhZGluZyB0aGUgYXJndW1lbnRzIG9mIHRoZQorICogbWVzc2FnZSBwYXNzZWQgaW4uCisgKgorICogV2hlbiBwb3NzaWJsZSwgZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgaXMgbXVjaCBtb3JlIGNvbnZlbmllbnQuCisgKiBTb21lIHR5cGVzIG9mIGFyZ3VtZW50IGNhbiBvbmx5IGJlIHJlYWQgd2l0aCAjREJ1c01lc3NhZ2VJdGVyCisgKiBob3dldmVyLgorICoKKyAqIFRoZSBlYXNpZXN0IHdheSB0byBpdGVyYXRlIGlzIGxpa2UgdGhpczogCisgKiBAY29kZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICogd2hpbGUgKChjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgKiAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKTsKKyAqIEBlbmRjb2RlCisgKgorICogI0RCdXNNZXNzYWdlSXRlciBjb250YWlucyBubyBhbGxvY2F0ZWQgbWVtb3J5OyBpdCBuZWVkIG5vdCBiZQorICogZnJlZWQsIGFuZCBjYW4gYmUgY29waWVkIGJ5IGFzc2lnbm1lbnQgb3IgbWVtY3B5KCkuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgbWVzc2FnZSBoYXMgbm8gYXJndW1lbnRzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQlEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpdGVyICE9IE5VTEwsIEZBTFNFKTsKKworICBnZXRfY29uc3Rfc2lnbmF0dXJlICgmbWVzc2FnZS0+aGVhZGVyLCAmdHlwZV9zdHIsICZ0eXBlX3Bvcyk7CisKKyAgX2RidXNfbWVzc2FnZV9pdGVyX2luaXRfY29tbW9uIChtZXNzYWdlLCByZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhbC0+dS5yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJm1lc3NhZ2UtPmhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEOworfQorCisvKioKKyAqIENoZWNrcyBpZiBhbiBpdGVyYXRvciBoYXMgYW55IG1vcmUgZmllbGRzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcyBmb2xsb3dpbmcKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2hhc19uZXh0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2hhc19uZXh0ICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIE1vdmVzIHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBmaWVsZCwgaWYgYW55LiBJZiB0aGVyZSdzIG5vIG5leHQKKyAqIGZpZWxkLCByZXR1cm5zICNGQUxTRS4gSWYgdGhlIGl0ZXJhdG9yIG1vdmVzIGZvcndhcmQsIHJldHVybnMKKyAqICNUUlVFLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBpdGVyYXRvciB3YXMgbW92ZWQgdG8gdGhlIG5leHQgZmllbGQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX25leHQgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCB0eXBlIG9mIHRoZSBhcmd1bWVudCB0aGF0IHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBwb2ludHMgdG8uIElmIHRoZSBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLCByZXR1cm5zCisgKiAjREJVU19UWVBFX0lOVkFMSUQuIFlvdSBjYW4gdGh1cyB3cml0ZSBhIGxvb3AgYXMgZm9sbG93czoKKyAqCisgKiBAY29kZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICogd2hpbGUgKChjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgKiAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcgorICogQHJldHVybnMgdGhlIGFyZ3VtZW50IHR5cGUKKyAqLworaW50CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5IHRoYXQgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIHBvaW50cyB0by4gTm90ZSB0aGF0IHlvdSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGl0ZXJhdG9yIHBvaW50cyB0bworICogYW4gYXJyYXkgcHJpb3IgdG8gdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcmV0dXJucyB0aGUgYXJyYXkgZWxlbWVudCB0eXBlCisgKi8KK2ludAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgREJVU19UWVBFX0lOVkFMSUQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiwgREJVU19UWVBFX0lOVkFMSUQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmVjdXJzZXMgaW50byBhIGNvbnRhaW5lciB2YWx1ZSB3aGVuIHJlYWRpbmcgdmFsdWVzIGZyb20gYSBtZXNzYWdlLAorICogaW5pdGlhbGl6aW5nIGEgc3ViLWl0ZXJhdG9yIHRvIHVzZSBmb3IgdHJhdmVyc2luZyB0aGUgY2hpbGQgdmFsdWVzCisgKiBvZiB0aGUgY29udGFpbmVyLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIHJlY3Vyc2VzIGludG8gYSB2YWx1ZSwgbm90IGEgdHlwZSwgc28geW91IGNhbiBvbmx5CisgKiByZWN1cnNlIGlmIHRoZSB2YWx1ZSBleGlzdHMuIFRoZSBtYWluIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdAorICogaWYgeW91IGhhdmUgZm9yIGV4YW1wbGUgYW4gZW1wdHkgYXJyYXkgb2YgYXJyYXkgb2YgaW50MzIsIHlvdSBjYW4KKyAqIHJlY3Vyc2UgaW50byB0aGUgb3V0ZXJtb3N0IGFycmF5LCBidXQgaXQgd2lsbCBoYXZlIG5vIHZhbHVlcywgc28KKyAqIHlvdSB3b24ndCBiZSBhYmxlIHRvIHJlY3Vyc2UgZnVydGhlci4gVGhlcmUncyBubyBhcnJheSBvZiBpbnQzMiB0bworICogcmVjdXJzZSBpbnRvLgorICoKKyAqIElmIGEgY29udGFpbmVyIGlzIGFuIGFycmF5IG9mIGZpeGVkLWxlbmd0aCB0eXBlcyAoZXhjZXB0IFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLCBpdCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIHVzZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgdG8gZ2V0IHRoZSB3aG9sZSBhcnJheSBpbiBvbmUKKyAqIHNob3QsIHJhdGhlciB0aGFuIGluZGl2aWR1YWxseSB3YWxraW5nIG92ZXIgdGhlIGFycmF5IGVsZW1lbnRzLgorICoKKyAqIEJlIHN1cmUgeW91IGhhdmUgc29tZWhvdyBjaGVja2VkIHRoYXQKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSgpIG1hdGNoZXMgdGhlIHR5cGUgeW91IGFyZSBleHBlY3RpbmcKKyAqIHRvIHJlY3Vyc2UgaW50by4gUmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB1bmRlZmluZWQgaWYgdGhlcmUgaXMKKyAqIG5vIGNvbnRhaW5lciB0byByZWN1cnNlIGludG8gYXQgdGhlIGN1cnJlbnQgaXRlcmF0b3IgcG9zaXRpb24uCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgdGhlIHN1Yi1pdGVyYXRvciB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfc3ViID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilzdWI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc3ViICE9IE5VTEwpOworCisgICpyZWFsX3N1YiA9ICpyZWFsOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZyZWFsX3N1Yi0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2lnbmF0dXJlIG9mIGEgbWVzc2FnZSBpdGVyYXRvci4gIFRoaXMKKyAqIGlzIHVzZWZ1bCBwcmltYXJpbHkgZm9yIGRlYWxpbmcgd2l0aCB2YXJpYW50czsgb25lIGNhbgorICogcmVjdXJzZSBpbnRvIGEgdmFyaWFudCBhbmQgZGV0ZXJtaW5lIHRoZSBzaWduYXR1cmUgb2YKKyAqIHRoZSB2YXJpYW50J3MgdmFsdWUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkuCisgKiAKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcmV0dXJucyB0aGUgY29udGFpbmVkIHNpZ25hdHVyZSwgb3IgTlVMTCBpZiBvdXQgb2YgbWVtb3J5CisgKi8KK2NoYXIgKgorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBjb25zdCBEQnVzU3RyaW5nICpzaWc7CisgIERCdXNTdHJpbmcgcmV0c3RyOworICBjaGFyICpyZXQ7CisgIGludCBzdGFydCwgbGVuOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgTlVMTCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJldHN0cikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAoJnJlYWwtPnUucmVhZGVyLCAmc2lnLAorCQkJCSAgICZzdGFydCwgJmxlbik7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKCZyZXRzdHIsCisJCQkJX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzaWcpICsgc3RhcnQsCisJCQkJbGVuKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnJldHN0ciwgJnJldCkpCisgICAgcmV0dXJuIE5VTEw7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0c3RyKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBSZWFkcyBhIGJhc2ljLXR5cGVkIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2UgaXRlcmF0b3IuCisgKiBCYXNpYyB0eXBlcyBhcmUgdGhlIG5vbi1jb250YWluZXJzIHN1Y2ggYXMgaW50ZWdlciBhbmQgc3RyaW5nLgorICoKKyAqIFRoZSB2YWx1ZSBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhdGlvbiB0byBzdG9yZQorICogdGhlIHJldHVybmVkIHZhbHVlLiBTbyBmb3IgaW50MzIgaXQgc2hvdWxkIGJlIGEgImRidXNfaW50MzJfdCoiCisgKiBhbmQgZm9yIHN0cmluZyBhICJjb25zdCBjaGFyKioiLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMKKyAqIGJ5IHJlZmVyZW5jZSBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIGNhbGwgZHVwbGljYXRlcyBVbml4IGZpbGUgZGVzY3JpcHRvcnMgd2hlbiByZWFkaW5nIHRoZW0uIEl0IGlzCisgKiB5b3VyIGpvYiB0byBjbG9zZSB0aGVtIHdoZW4geW91IGRvbid0IG5lZWQgdGhlbSBhbnltb3JlLgorICoKKyAqIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUKKyAqIHRoZSBGRF9DTE9FWEVDIGZsYWcgc2V0LiBJZiB5b3UgbmVlZCB0aGVtIHdpdGhvdXQgdGhpcyBmbGFnIHNldCwKKyAqIG1ha2Ugc3VyZSB0byB1bnNldCBpdCB3aXRoIGZjbnRsKCkuCisgKgorICogQmUgc3VyZSB5b3UgaGF2ZSBzb21laG93IGNoZWNrZWQgdGhhdAorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKCkgbWF0Y2hlcyB0aGUgdHlwZSB5b3UgYXJlCisgKiBleHBlY3RpbmcsIG9yIHlvdSdsbCBjcmFzaCB3aGVuIHlvdSB0cnkgdG8gdXNlIGFuIGludGVnZXIgYXMgYQorICogc3RyaW5nIG9yIHNvbWV0aGluZy4KKyAqCisgKiBUbyByZWFkIGFueSBjb250YWluZXIgdHlwZSAoYXJyYXksIHN0cnVjdCwgZGljdCkgeW91IHdpbGwgbmVlZCB0bworICogcmVjdXJzZSBpbnRvIHRoZSBjb250YWluZXIgd2l0aCBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCkuICBJZgorICogdGhlIGNvbnRhaW5lciBpcyBhbiBhcnJheSBvZiBmaXhlZC1sZW5ndGggdmFsdWVzIChleGNlcHQgVW5peCBmaWxlCisgKiBkZXNjcmlwdG9ycyksIHlvdSBjYW4gZ2V0IGFsbCB0aGUgYXJyYXkgZWxlbWVudHMgYXQgb25jZSB3aXRoCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKS4gT3RoZXJ3aXNlLCB5b3UgaGF2ZSB0byBpdGVyYXRlCisgKiBvdmVyIHRoZSBjb250YWluZXIncyBjb250ZW50cyBvbmUgdmFsdWUgYXQgYSB0aW1lLgorICoKKyAqIEFsbCBiYXNpYy10eXBlZCB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gZml0IGluIGEgI0RCdXNCYXNpY1ZhbHVlLAorICogc28gaW4gdmVyc2lvbnMgb2YgbGliZGJ1cyB0aGF0IGhhdmUgdGhhdCB0eXBlLCB5b3UgY2FuIHdyaXRlIGNvZGUgbGlrZSB0aGlzOgorICoKKyAqIEBjb2RlCisgKiBEQnVzQmFzaWNWYWx1ZSB2YWx1ZTsKKyAqIGludCB0eXBlOworICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmcmVhZF9pdGVyLCAmdmFsdWUpOworICogdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnJlYWRfaXRlcik7CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ3cml0ZV9pdGVyLCB0eXBlLCAmdmFsdWUpOworICogQGVuZGNvZGUKKyAqCisgKiAoQWxsIEQtQnVzIGJhc2ljIHR5cGVzIGFyZSBlaXRoZXIgbnVtZXJpYyBhbmQgOCBieXRlcyBvciBzbWFsbGVyLCBvcgorICogYmVoYXZlIGxpa2UgYSBzdHJpbmc7IHNvIGluIG9sZGVyIHZlcnNpb25zIG9mIGxpYmRidXMsIERCdXNCYXNpY1ZhbHVlCisgKiBjYW4gYmUgcmVwbGFjZWQgd2l0aCB1bmlvbiB7IGNoYXIgKnN0cmluZzsgdW5zaWduZWQgY2hhciBieXRlc1s4XTsgfSwKKyAqIGZvciBpbnN0YW5jZS4pCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gdmFsdWUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHZhbHVlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAodmFsdWUgIT0gTlVMTCk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgeworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBEQnVzQmFzaWNWYWx1ZSBpZHg7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMoJnJlYWwtPnUucmVhZGVyLCAmaWR4KTsKKworICAgICAgaWYgKGlkeC51MzIgPj0gcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcykgeworICAgICAgICAvKiBIbW0sIHdlIGNhbm5vdCByZWFsbHkgc2lnbmFsIGFuIGVycm9yIGhlcmUsIHNvIGxldCdzIG1ha2UKKyAgICAgICAgICAgc3VyZSB0byByZXR1cm4gYW4gaW52YWxpZCBmZC4gKi8KKyAgICAgICAgKigoaW50KikgdmFsdWUpID0gLTE7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgKigoaW50KikgdmFsdWUpID0gX2RidXNfZHVwKHJlYWwtPm1lc3NhZ2UtPnVuaXhfZmRzW2lkeC51MzJdLCBOVUxMKTsKKyNlbHNlCisgICAgICAqKChpbnQqKSB2YWx1ZSkgPSAtMTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS10eXBlZCB2YWx1ZSBwb2ludGVkCisgKiB0byBieSB0aGUgaXRlcmF0b3IuCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBPKDEpIGZvciBhcnJheXMgb2YgZml4ZWQtc2l6ZSB0eXBlcworICogYnV0IE8obikgZm9yIGFycmF5cyBvZiB2YXJpYWJsZS1sZW5ndGggdHlwZXMgc3VjaCBhcyBzdHJpbmdzLAorICogc28gaXQgbWF5IGJlIGEgYmFkIGlkZWEgdG8gdXNlIGl0LgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqLworaW50CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF9jb3VudCAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBEQnVzVHlwZVJlYWRlciBhcnJheTsKKyAgaW50IGVsZW1lbnRfdHlwZTsKKyAgaW50IG5fZWxlbWVudHMgPSAwOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IERCVVNfVFlQRV9BUlJBWSwgMCk7CisKKyAgZWxlbWVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworICBpZiAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKQorICAgIHsKKyAgICAgIGludCBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1lbnRfdHlwZSk7CisgICAgICBpbnQgdG90YWxfbGVuID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCAoJmFycmF5KTsKKyAgICAgIG5fZWxlbWVudHMgPSB0b3RhbF9sZW4gLyBhbGlnbm1lbnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICArK25fZWxlbWVudHM7CisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgcmV0dXJuIG5fZWxlbWVudHM7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheSBhcyBtYXJzaGFsZWQgaW4gdGhlIHdpcmUKKyAqIHByb3RvY29sLiBUaGUgaXRlcmF0b3IgbXVzdCBjdXJyZW50bHkgYmUgaW5zaWRlIGFuIGFycmF5LXR5cGVkCisgKiB2YWx1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgb24gdGhlIGdyb3VuZHMgdGhhdCBpdCBpcyBzdHVwaWQuICBXaHkKKyAqIHdvdWxkIHlvdSB3YW50IHRvIGtub3cgaG93IG1hbnkgYnl0ZXMgYXJlIGluIHRoZSBhcnJheSBhcyBtYXJzaGFsZWQKKyAqIGluIHRoZSB3aXJlIHByb3RvY29sPyAgVXNlIGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50KCkgaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5CisgKi8KK2ludAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbiAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV9sZW5ndGggKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmVhZHMgYSBibG9jayBvZiBmaXhlZC1sZW5ndGggdmFsdWVzIGZyb20gdGhlIG1lc3NhZ2UgaXRlcmF0b3IuCisgKiBGaXhlZC1sZW5ndGggdmFsdWVzIGFyZSB0aG9zZSBiYXNpYyB0eXBlcyB0aGF0IGFyZSBub3Qgc3RyaW5nLWxpa2UsCisgKiBzdWNoIGFzIGludGVnZXJzLCBib29sLCBkb3VibGUuIFRoZSByZXR1cm5lZCBibG9jayB3aWxsIGJlIGZyb20gdGhlCisgKiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcnJheSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAqCisgKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIGhlcmU6IGFsdGhvdWdoIERCVVNfVFlQRV9VTklYX0ZEIGlzCisgKiBjb25zaWRlcmVkIGEgJ2ZpeGVkJyB0eXBlIGFycmF5cyBvZiB0aGlzIHR5cGUgbWF5IG5vdCBiZSByZWFkIHdpdGgKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhlIG1lc3NhZ2UgaXRlciBzaG91bGQgYmUgImluIiB0aGUgYXJyYXkgKHRoYXQgaXMsIHlvdSByZWN1cnNlIGludG8gdGhlCisgKiBhcnJheSwgYW5kIHRoZW4geW91IGNhbGwgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgb24gdGhlCisgKiAic3ViLWl0ZXJhdG9yIiBjcmVhdGVkIGJ5IGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoKSkuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIHRvIHN0b3JlIHRoZQorICogcmV0dXJuZWQgYXJyYXkuIFNvIGZvciBpbnQzMiBpdCBzaG91bGQgYmUgYSAiY29uc3QgZGJ1c19pbnQzMl90KioiCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYnkgcmVmZXJlbmNlIGFuZCBzaG91bGQgbm90IGJlIGZyZWVkLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgZGJ1c190eXBlX2lzX2ZpeGVkKCkgcmV0dXJucworICogI1RSVUUgZm9yIHRoZSBlbGVtZW50IHR5cGUuCisgKgorICogSWYgYW4gYXJyYXkncyBlbGVtZW50cyBhcmUgbm90IGZpeGVkIGluIHNpemUsIHlvdSBoYXZlIHRvIHJlY3Vyc2UKKyAqIGludG8gdGhlIGFycmF5IHdpdGggZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpIGFuZCByZWFkIHRoZQorICogZWxlbWVudHMgb25lIGJ5IG9uZS4KKyAqIAorICogQmVjYXVzZSB0aGUgYXJyYXkgaXMgbm90IGNvcGllZCwgdGhpcyBmdW5jdGlvbiBydW5zIGluIGNvbnN0YW50CisgKiB0aW1lIGFuZCBpcyBmYXN0OyBpdCdzIG11Y2ggcHJlZmVycmVkIG92ZXIgd2Fsa2luZyB0aGUgZW50aXJlIGFycmF5CisgKiB3aXRoIGFuIGl0ZXJhdG9yLiAoSG93ZXZlciwgeW91IGNhbiBhbHdheXMgdXNlCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCksIGV2ZW4gZm9yIGZpeGVkLWxlbmd0aCB0eXBlczsKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uLikKKyAqIAorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gdmFsdWUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGJsb2NrCisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJsb2NrCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaW50IHN1YnR5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlKCZyZWFsLT51LnJlYWRlcik7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAodmFsdWUgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgoc3VidHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX3R5cGVfaXNfZml4ZWQgKHN1YnR5cGUpICYmIHN1YnR5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpKTsKKyNlbmRpZgorCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG5fZWxlbWVudHMpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNNZXNzYWdlSXRlciBmb3IgYXBwZW5kaW5nIGFyZ3VtZW50cyB0byB0aGUgZW5kCisgKiBvZiBhIG1lc3NhZ2UuCisgKgorICogQHRvZG8gSWYgYXBwZW5kaW5nIGFueSBvZiB0aGUgYXJndW1lbnRzIGZhaWxzIGR1ZSB0byBsYWNrIG9mCisgKiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZCB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQkgICAgICAgREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoaXRlciAhPSBOVUxMKTsKKworICBfZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jb21tb24gKG1lc3NhZ2UsIHJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIC8qIFdlIGNyZWF0ZSB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgcG9pbnQgaXRlcmF0b3JzIGF0IGl0ICJvbiBkZW1hbmQiCisgICAqIHdoZW4gYSB2YWx1ZSBpcyBhY3R1YWxseSBhcHBlbmRlZC4gVGhhdCBtZWFucyB0aGF0IGluaXQoKSBuZXZlciBmYWlscworICAgKiBkdWUgdG8gT09NLgorICAgKi8KKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IHNpZ25hdHVyZSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudAorICogc2lnbmF0dXJlLCBzdG9yZXMgaXQgaW4gdGhlIGl0ZXJhdG9yLCBhbmQgcG9pbnRzIHRoZSBpdGVyYXRvciB0bworICogdGhlIGVuZCBvZiBpdC4gVXNlZCBhbnkgdGltZSB3ZSB3cml0ZSB0byB0aGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9zaWduYXR1cmUgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwpCit7CisgIERCdXNTdHJpbmcgKnN0cjsKKyAgY29uc3QgREJ1c1N0cmluZyAqY3VycmVudF9zaWc7CisgIGludCBjdXJyZW50X3NpZ19wb3M7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIGlmIChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCk7CisgICAgICByZWFsLT5zaWdfcmVmY291bnQgKz0gMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBzdHIgPSBkYnVzX25ldyAoREJ1c1N0cmluZywgMSk7CisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9zaWcsICZjdXJyZW50X3NpZ19wb3MpKQorICAgIGN1cnJlbnRfc2lnID0gTlVMTDsKKworICBpZiAoY3VycmVudF9zaWcpCisgICAgeworICAgICAgaW50IGN1cnJlbnRfbGVuOworCisgICAgICBjdXJyZW50X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3Bvcyk7CisgICAgICBjdXJyZW50X3NpZ19wb3MgKz0gMTsgLyogbW92ZSBvbiB0byBzaWcgZGF0YSAqLworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCBjdXJyZW50X2xlbiArIDQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3BvcywgY3VycmVudF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCA0KSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVhbC0+c2lnX3JlZmNvdW50ID0gMTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbmV3IHNpZ25hdHVyZSBhcyB0aGUgbWVzc2FnZSBzaWduYXR1cmUsIGZyZWVzIHRoZQorICogc2lnbmF0dXJlIHN0cmluZywgYW5kIG1hcmtzIHRoZSBpdGVyYXRvciBhcyBub3QgaGF2aW5nIGEgdHlwZV9zdHIKKyAqIGFueW1vcmUuIEZyZWVzIHRoZSBzaWduYXR1cmUgZXZlbiBpZiBpdCBmYWlscywgc28geW91IGNhbid0CisgKiByZWFsbHkgcmVjb3ZlciBmcm9tIGZhaWx1cmUuIEtpbmRhIGJ1c3RlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2Vfc2lnbmF0dXJlIChEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsKQoreworICBEQnVzU3RyaW5nICpzdHI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA+IDApOworCisgIHJlYWwtPnNpZ19yZWZjb3VudCAtPSAxOworCisgIGlmIChyZWFsLT5zaWdfcmVmY291bnQgPiAwKQorICAgIHJldHVybiBUUlVFOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA9PSAwKTsKKworICByZXR2YWwgPSBUUlVFOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpOworICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZyZWFsLT5tZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKCZyZWFsLT51LndyaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICBkYnVzX2ZyZWUgKHN0cik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgbWFya3MgdGhlIGl0ZXJhdG9yIGFzIG5vdCBoYXZpbmcgYQorICogdHlwZV9zdHIgYW55bW9yZS4gIFNpbmNlIHRoZSBuZXcgc2lnbmF0dXJlIGlzIG5vdCBzZXQsIHRoZSBtZXNzYWdlCisgKiB3aWxsIGdlbmVyYWxseSBiZSBob3NlZCBhZnRlciB0aGlzIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCkKK3sKKyAgREJ1c1N0cmluZyAqc3RyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5zaWdfcmVmY291bnQgPiAwKTsKKworICByZWFsLT5zaWdfcmVmY291bnQgLT0gMTsKKworICBpZiAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID09IDApOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX3JlbW92ZV90eXBlcyAoJnJlYWwtPnUud3JpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKHN0cik7CisgIGRidXNfZnJlZSAoc3RyKTsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPm1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgYXBwZW5kIGl0ZXJhdG9yIGNhbid0IGJlIHVzZWQ6IG1lc3NhZ2UgaXMgbG9ja2VkIChoYXMgYWxyZWFkeSBiZWVuIHNlbnQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKK3N0YXRpYyBpbnQgKgorZXhwYW5kX2ZkX2FycmF5KERCdXNNZXNzYWdlICptLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICBuKQoreworICBfZGJ1c19hc3NlcnQobSk7CisKKyAgLyogVGhpcyBtYWtlcyBzcGFjZSBmb3IgYWRkaW5nIG4gbmV3IGZkcyB0byB0aGUgYXJyYXkgYW5kIHJldHVybnMgYQorICAgICBwb2ludGVyIHRvIHRoZSBwbGFjZSB3ZXJlIHRoZSBmaXJzdCBmZCBzaG91bGQgYmUgcHV0LiAqLworCisgIGlmIChtLT5uX3VuaXhfZmRzICsgbiA+IG0tPm5fdW5peF9mZHNfYWxsb2NhdGVkKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGs7CisgICAgICBpbnQgKnA7CisKKyAgICAgIC8qIE1ha2UgdHdpY2UgYXMgbXVjaCBzcGFjZSBhcyBuZWNlc3NhcnkgKi8KKyAgICAgIGsgPSAobS0+bl91bml4X2ZkcyArIG4pICogMjsKKworICAgICAgLyogQWxsb2NhdGUgYXQgbGVhc3QgZm91ciAqLworICAgICAgaWYgKGsgPCA0KQorICAgICAgICBrID0gNDsKKworICAgICAgcCA9IGRidXNfcmVhbGxvYyhtLT51bml4X2ZkcywgayAqIHNpemVvZihpbnQpKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBtLT51bml4X2ZkcyA9IHA7CisgICAgICBtLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IGs7CisgICAgfQorCisgIHJldHVybiBtLT51bml4X2ZkcyArIG0tPm5fdW5peF9mZHM7Cit9CisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIGEgYmFzaWMtdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuIFRoZSBiYXNpYyB0eXBlcyBhcmUgdGhlCisgKiBub24tY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgaW50ZWdlciBhbmQgc3RyaW5nLgorICoKKyAqIFRoZSAidmFsdWUiIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGJhc2ljLXR5cGVkIHZhbHVlLgorICogU28gZm9yIHN0cmluZywgY29uc3QgY2hhcioqLiBGb3IgaW50ZWdlciwgZGJ1c19pbnQzMl90Ki4KKyAqCisgKiBGb3IgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnRlcm5hbGx5IGR1cGxpY2F0ZQorICogdGhlIGRlc2NyaXB0b3IgeW91IHBhc3NlZCBpbi4gSGVuY2UgeW91IG1heSBjbG9zZSB0aGUgZGVzY3JpcHRvcgorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogY29uc3QgKnN0cmluZ19wOworICAgICAgY29uc3QgZGJ1c19ib29sX3QgKmJvb2xfcDsKKworICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3V0ZjggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgc3RyaW5nX3AgPSB2YWx1ZTsKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9zaWduYXR1cmUgKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGJvb2xfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCpib29sX3AgPT0gMCB8fCAqYm9vbF9wID09IDEsIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBjaGVjaywgYWxsIHBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaW50ICpmZHM7CisgICAgICBkYnVzX3VpbnQzMl90IHU7CisKKyAgICAgIC8qIEZpcnN0IHN0ZXAsIGluY2x1ZGUgdGhlIGZkIGluIHRoZSBmZCBsaXN0IG9mIHRoaXMgbWVzc2FnZSAqLworICAgICAgaWYgKCEoZmRzID0gZXhwYW5kX2ZkX2FycmF5KHJlYWwtPm1lc3NhZ2UsIDEpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAqZmRzID0gX2RidXNfZHVwKCooaW50KikgdmFsdWUsIE5VTEwpOworICAgICAgaWYgKCpmZHMgPCAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHUgPSByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzOworCisgICAgICAvKiBTZWNvbmQgc3RlcCwgd3JpdGUgdGhlIGluZGV4IHRvIHRoZSBmZCAqLworICAgICAgaWYgKCEocmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgREJVU19UWVBFX1VOSVhfRkQsICZ1KSkpIHsKKyAgICAgICAgX2RidXNfY2xvc2UoKmZkcywgTlVMTCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcyArPSAxOworICAgICAgdSArPSAxOworCisgICAgICAvKiBGaW5hbCBzdGVwLCB1cGRhdGUgdGhlIGhlYWRlciBhY2NvcmRpbmdseSAqLworICAgICAgcmV0ID0gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1KTsKKworICAgICAgLyogSWYgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMgZmFpbCB0aGUgbWVzc2FnZSBpcworICAgICAgICAgaG9zZWQuIEhvd2V2ZXIsIG5vIG1lbW9yeSBvciBmZHMgc2hvdWxkIGJlIGxlYWtlZCBzaW5jZSB3aGF0CisgICAgICAgICBoYXMgYmVlbiBhZGRlZCB0byBtZXNzYWdlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQKKyAgICAgICAgIGNhbiBoZW5jZSBiZSBhY2NvdW50ZWQgZm9yIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcKKyAgICAgICAgIGZyZWVkLiAqLworI2Vsc2UKKyAgICAgIHJldCA9IEZBTFNFOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgdG8gYW4gYXJyYXkuIFRoZQorICogZml4ZWQtbGVuZ3RoIHR5cGVzIGFyZSBhbGwgYmFzaWMgdHlwZXMgdGhhdCBhcmUgbm90IHN0cmluZy1saWtlLiBTbworICogaW50MzIsIGRvdWJsZSwgYm9vbCwgZXRjLiAoVW5peCBmaWxlIGRlc2NyaXB0b3JzIGhvd2V2ZXIgYXJlIG5vdAorICogc3VwcG9ydGVkLikgWW91IG11c3QgY2FsbCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIHRvCisgKiBvcGVuIGFuIGFycmF5IG9mIHZhbHVlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBZb3UgbWF5IGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgKGFuZCBpbnRlcm1peGVkIHdpdGggY2FsbHMgdG8KKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpKSBmb3IgdGhlIHNhbWUgYXJyYXkuCisgKgorICogVGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheS4gIFNvIGZvcgorICogaW50ZWdlciwgImRidXNfaW50MzJfdCoqIiBpcyBleHBlY3RlZCBmb3IgZXhhbXBsZS4KKyAqCisgKiBAd2FybmluZyBpbiBDLCBnaXZlbiAiaW50IGFycmF5W10iLCAiJmFycmF5ID09IGFycmF5IiAodGhlCisgKiBjb21wLmxhbmcuYyBGQVEgc2F5cyBvdGhlcndpc2UsIGJ1dCBnY2MgYW5kIHRoZSBGQVEgZG9uJ3QgYWdyZWUpLgorICogU28gaWYgeW91J3JlIHVzaW5nIGFuIGFycmF5IGluc3RlYWQgb2YgYSBwb2ludGVyIHlvdSBoYXZlIHRvIGNyZWF0ZQorICogYSBwb2ludGVyIHZhcmlhYmxlLCBhc3NpZ24gdGhlIGFycmF5IHRvIGl0LCB0aGVuIHRha2UgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBwb2ludGVyIHZhcmlhYmxlLgorICogQGNvZGUKKyAqIGNvbnN0IGRidXNfaW50MzJfdCBhcnJheVtdID0geyAxLCAyLCAzIH07CisgKiBjb25zdCBkYnVzX2ludDMyX3QgKnZfQVJSQVkgPSBhcnJheTsKKyAqIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmaXRlciwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMykpCisgKiAgIGZwcmludGYgKHN0ZGVyciwgIk5vIG1lbW9yeSFcbiIpOworICogQGVuZGNvZGUKKyAqIEZvciBzdHJpbmdzIGl0IHdvcmtzIHRvIHdyaXRlIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbgorICogdXNlICZhcnJheSB0aG91Z2guCisgKgorICogQHRvZG8gSWYgdGhpcyBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZAorICogeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cworICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpICYmIGVsZW1lbnRfdHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPnUud3JpdGVyLmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzID49IDAsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgIHsKKyAgICAgIGNvbnN0IGRidXNfYm9vbF90ICogY29uc3QgKmJvb2xzID0gdmFsdWU7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZWxlbWVudHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKCpib29scylbaV0gPT0gMCB8fCAoKmJvb2xzKVtpXSA9PSAxLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAoJnJlYWwtPnUud3JpdGVyLCBlbGVtZW50X3R5cGUsIHZhbHVlLCBuX2VsZW1lbnRzKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2U7IHlvdSBhcmUgcmVxdWlyZWQgdG8KKyAqIGFwcGVuZCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciB1c2luZyB0aGUgcmV0dXJuZWQKKyAqIHN1Yi1pdGVyYXRvciwgYW5kIHRoZW4gY2FsbAorICogZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCkuIENvbnRhaW5lciB0eXBlcyBhcmUgZm9yCisgKiBleGFtcGxlIHN0cnVjdCwgdmFyaWFudCwgYW5kIGFycmF5LiBGb3IgdmFyaWFudHMsIHRoZQorICogY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YgdGhlIHNpbmdsZSB2YWx1ZSBpbnNpZGUKKyAqIHRoZSB2YXJpYW50LiBGb3Igc3RydWN0cyBhbmQgZGljdCBlbnRyaWVzLCBjb250YWluZWRfc2lnbmF0dXJlCisgKiBzaG91bGQgYmUgI05VTEw7IGl0IHdpbGwgYmUgc2V0IHRvIHdoYXRldmVyIHR5cGVzIHlvdSB3cml0ZSBpbnRvCisgKiB0aGUgc3RydWN0LiAgRm9yIGFycmF5cywgY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YKKyAqIHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIGNvbnRhaW5lZF9zaWduYXR1cmUgdGhlIHR5cGUgb2YgY29udGFpbmVyIGNvbnRlbnRzCisgKiBAcGFyYW0gc3ViIHN1Yi1pdGVyYXRvciB0byBpbml0aWFsaXplCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqY29udGFpbmVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKyAgREJ1c1N0cmluZyBjb250YWluZWRfc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfY29udGFpbmVyICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN1YiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKHR5cGUgPT0gREJVU19UWVBFX1NUUlVDVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IERCVVNfVFlQRV9WQVJJQU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF9zaWduYXR1cmUgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSAhPSBOVUxMKSwgRkFMU0UpOworICAKKyAgLyogdGhpcyB3b3VsZCBmYWlsIGlmIHRoZSBjb250YWluZWRfc2lnbmF0dXJlIGlzIGEgZGljdCBlbnRyeSwgc2luY2UKKyAgICogZGljdCBlbnRyaWVzIGFyZSBpbnZhbGlkIHNpZ25hdHVyZXMgc3RhbmRhbG9uZSAodGhleSBtdXN0IGJlIGluCisgICAqIGFuIGFycmF5KQorICAgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgY29udGFpbmVkX3NpZ25hdHVyZSAmJiAqY29udGFpbmVkX3NpZ25hdHVyZSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSAoY29udGFpbmVkX3NpZ25hdHVyZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpyZWFsX3N1YiA9ICpyZWFsOworCisgIGlmIChjb250YWluZWRfc2lnbmF0dXJlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250YWluZWRfc3RyLCBjb250YWluZWRfc2lnbmF0dXJlKTsKKworICAgICAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZWRfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0gCit9CisKKworLyoqCisgKiBDbG9zZXMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2U7IG1heSB3cml0ZQorICogb3V0IG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2Uga25vd24gb25seSBhZnRlciB0aGUgZW50aXJlCisgKiBjb250YWluZXIgaXMgd3JpdHRlbiwgYW5kIG1heSBmcmVlIHJlc291cmNlcyBjcmVhdGVkIGJ5CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHN1YiBzdWItaXRlcmF0b3IgdG8gY2xvc2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsX3N1YiA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopc3ViOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUiwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWxfc3ViLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbF9zdWItPnUud3JpdGVyKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQWJhbmRvbnMgY3JlYXRpb24gb2YgYSBjb250YWluZWQtdHlwZWQgdmFsdWUgYW5kIGZyZWVzIHJlc291cmNlcyBjcmVhdGVkCisgKiBieSBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLiAgT25jZSB0aGlzIHJldHVybnMsIHRoZSBtZXNzYWdlCisgKiBpcyBob3NlZCBhbmQgeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYWJhbmRvbiBjcmVhdGlvbiBvZiBhIG1lc3NhZ2Ugd2hlbiB5b3UgaGF2ZQorICogb3BlbiBjb250YWluZXJzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgc3ViLWl0ZXJhdG9yIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChyZWFsX3N1Yi0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyNlbmRpZgorCisgIF9kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAocmVhbCk7Cit9CisKKy8qKgorICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBtZXNzYWdlIGRvZXMgbm90IHdhbnQgYSByZXBseTsgaWYKKyAqIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gbWF5IChidXQgaXMgbm90CisgKiByZXF1aXJlZCB0bykgb3B0aW1pemUgYnkgbm90IHNlbmRpbmcgbWV0aG9kIHJldHVybiBvciBlcnJvcgorICogcmVwbGllcy4gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hldGhlciB0aGUKKyAqIG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IGFycml2ZWQgYXQgdGhlIHJlbW90ZSBlbmQuIE5vcm1hbGx5IHlvdSBrbm93IGEKKyAqIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHdoZW4geW91IHJlY2VpdmUgdGhlIHJlcGx5IHRvIGl0LgorICoKKyAqIFRoZSBmbGFnIGlzICNGQUxTRSBieSBkZWZhdWx0LCB0aGF0IGlzIGJ5IGRlZmF1bHQgdGhlIG90aGVyIGVuZCBpcworICogcmVxdWlyZWQgdG8gcmVwbHkuCisgKgorICogT24gdGhlIHByb3RvY29sIGxldmVsIHRoaXMgdG9nZ2xlcyAjREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRAorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG5vX3JlcGx5ICNUUlVFIGlmIG5vIHJlcGx5IGlzIGRlc2lyZWQKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgbm9fcmVwbHkpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgX2RidXNfaGVhZGVyX3RvZ2dsZV9mbGFnICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fUkVQTFlfRVhQRUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fcmVwbHkpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgZXhwZWN0CisgKiBhIHJlcGx5LgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBzZW5kZXIgaXNuJ3Qgd2FpdGluZyBmb3IgYSByZXBseQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRCk7Cit9CisKKy8qKgorICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIG93bmVyIGZvciB0aGUgZGVzdGluYXRpb24gbmFtZSB3aWxsCisgKiBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4gV2hlbiB0aGlzCisgKiBmbGFnIGlzIHNldCwgdGhlIG1lc3NhZ2UgaXMgaGVsZCB1bnRpbCBhIG5hbWUgb3duZXIgZmluaXNoZXMKKyAqIHN0YXJ0aW5nIHVwLCBvciBmYWlscyB0byBzdGFydCB1cC4gSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmVwbHkKKyAqIHdpbGwgYmUgYW4gZXJyb3IuCisgKgorICogVGhlIGZsYWcgaXMgc2V0IHRvICNUUlVFIGJ5IGRlZmF1bHQsIGkuZS4gYXV0byBzdGFydGluZyBpcyB0aGUgZGVmYXVsdC4KKyAqCisgKiBPbiB0aGUgcHJvdG9jb2wgbGV2ZWwgdGhpcyB0b2dnbGVzICNEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQKKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBhdXRvX3N0YXJ0ICNUUlVFIGlmIGF1dG8tc3RhcnRpbmcgaXMgZGVzaXJlZAorICovCit2b2lkCitkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgYXV0b19zdGFydCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkKTsKKworICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhdXRvX3N0YXJ0KTsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIHdpbGwgY2F1c2UgYW4gb3duZXIgZm9yCisgKiBkZXN0aW5hdGlvbiBuYW1lIHRvIGJlIGF1dG8tc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugd2lsbCB1c2UgYXV0by1zdGFydAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9hdXRvX3N0YXJ0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gIV9kYnVzX2hlYWRlcl9nZXRfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fQVVUT19TVEFSVCk7Cit9CisKKworLyoqCisgKiBTZXRzIHRoZSBvYmplY3QgcGF0aCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0byAoZm9yCisgKiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgdGhlIG9uZSBhIHNpZ25hbCBpcyBiZWluZworICogZW1pdHRlZCBmcm9tIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgcGF0aCBtdXN0IGNvbnRhaW4gb25seSB2YWxpZCBjaGFyYWN0ZXJzIGFzIGRlZmluZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gb2JqZWN0X3BhdGggdGhlIHBhdGggb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9wYXRoIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAob2JqZWN0X3BhdGggPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKG9iamVjdF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wYXRoKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBvYmplY3QgcGF0aCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0byAoZm9yCisgKiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgYmVpbmcgZW1pdHRlZCBmcm9tIChmb3IKKyAqIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuIFJldHVybnMgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBTZWUgYWxzbyBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCgpLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBwYXRoIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9wYXRoIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIGEgcGFydGljdWxhciBvYmplY3QgcGF0aC4gIFRoZSBvYmplY3QKKyAqIHBhdGggaXMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYSBtZXRob2QgY2FsbCBvciB0aGUgZW1pdHRpbmcKKyAqIG9iamVjdCBmb3IgYSBzaWduYWwuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgcGF0aCBmaWVsZCBpbiB0aGUgaGVhZGVyCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX3BhdGggKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnBhdGgpCit7CisgIGNvbnN0IGNoYXIgKm1zZ19wYXRoOworICBtc2dfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgIAorICBpZiAobXNnX3BhdGggPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGF0aCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgIAorICBpZiAoc3RyY21wIChtc2dfcGF0aCwgcGF0aCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB0aGUgb2JqZWN0IHBhdGggdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGJlaW5nIGVtaXR0ZWQKKyAqIGZyb20gKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpIGluIGEgZGVjb21wb3NlZAorICogZm9ybWF0IChvbmUgYXJyYXkgZWxlbWVudCBwZXIgcGF0aCBjb21wb25lbnQpLgorICogRnJlZSB0aGUgcmV0dXJuZWQgYXJyYXkgd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQW4gZW1wdHkgYnV0IG5vbi1OVUxMIHBhdGggYXJyYXkgbWVhbnMgdGhlIHBhdGggIi8iLgorICogU28gdGhlIHBhdGggIi9mb28vYmFyIiBiZWNvbWVzIHsgImZvbyIsICJiYXIiLCBOVUxMIH0KKyAqIGFuZCB0aGUgcGF0aCAiLyIgYmVjb21lcyB7IE5VTEwgfS4KKyAqCisgKiBTZWUgYWxzbyBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgoKS4KKyAqIAorICogQHRvZG8gdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYnkgdXNpbmcgdGhlIGxlbiBmcm9tIHRoZSBtZXNzYWdlCisgKiBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RybGVuKCkgYWdhaW4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHBhdGggcGxhY2UgdG8gc3RvcmUgYWxsb2NhdGVkIGFycmF5IG9mIHBhdGggY29tcG9uZW50czsgI05VTEwgc2V0IGhlcmUgaWYgbm8gcGF0aCBmaWVsZCBleGlzdHMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFycmF5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAqKipwYXRoKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgKnBhdGggPSBOVUxMOworCisgIHYgPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpOworICBpZiAodiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHYsIHN0cmxlbiAodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgaW50ZXJmYWNlIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvCisgKiAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvcgorICogdGhlIGludGVyZmFjZSBhIHNpZ25hbCBpcyBiZWluZyBlbWl0dGVkIGZyb20KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgaW50ZXJmYWNlIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZmFjZSB0aGUgaW50ZXJmYWNlIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICppZmFjZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaWZhY2UgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSAoaWZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2UpOworfQorCisvKioKKyAqIEdldHMgdGhlIGludGVyZmFjZSB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0bworICogKGZvciBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgYmVpbmcgZW1pdHRlZAorICogZnJvbSAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuCisgKiBUaGUgaW50ZXJmYWNlIG5hbWUgaXMgZnVsbHktcXVhbGlmaWVkIChuYW1lc3BhY2VkKS4KKyAqIFJldHVybnMgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlIGludGVyZmFjZSAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGhhcyBhbiBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGlmYWNlIHRoZSBpbnRlcmZhY2UgbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGludGVyZmFjZSBmaWVsZCBpbiB0aGUgaGVhZGVyIG1hdGNoZXMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmlmYWNlKQoreworICBjb25zdCBjaGFyICptc2dfaW50ZXJmYWNlOworICBtc2dfaW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworICAgCisgIGlmIChtc2dfaW50ZXJmYWNlID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGlmYWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChpZmFjZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgCisgIGlmIChzdHJjbXAgKG1zZ19pbnRlcmZhY2UsIGlmYWNlKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKKworfQorCisvKioKKyAqIFNldHMgdGhlIGludGVyZmFjZSBtZW1iZXIgYmVpbmcgaW52b2tlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciBlbWl0dGVkCisgKiAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgbWVtYmVyIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICptZW1iZXIpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lbWJlciA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpbnRlcmZhY2UgbWVtYmVyIGJlaW5nIGludm9rZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgZW1pdHRlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuIFJldHVybnMgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVtYmVyIG5hbWUgKHNob3VsZCBub3QgYmUgZnJlZWQpIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgYW4gaW50ZXJmYWNlIG1lbWJlcgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbWVtYmVyIHRoZSBtZW1iZXIgbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgaXMgYSBtZW1iZXIgZmllbGQgaW4gdGhlIGhlYWRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKQoreworICBjb25zdCBjaGFyICptc2dfbWVtYmVyOworICBtc2dfbWVtYmVyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworIAorICBpZiAobXNnX21lbWJlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lbWJlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAKKyAgaWYgKHN0cmNtcCAobXNnX21lbWJlciwgbWVtYmVyKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKKworfQorCisvKioKKyAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGVycm9yIChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikuCisgKiBUaGUgbmFtZSBpcyBmdWxseS1xdWFsaWZpZWQgKG5hbWVzcGFjZWQpLgorICoKKyAqIFRoZSBlcnJvciBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBuYW1lIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmVycm9yX25hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2Vycm9yX25hbWUgKGVycm9yX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUpOworfQorCisvKioKKyAqIEdldHMgdGhlIGVycm9yIG5hbWUgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SIG9ubHkpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBlcnJvciBuYW1lIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIFNldHMgdGhlIG1lc3NhZ2UncyBkZXN0aW5hdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBuYW1lIG9mCisgKiBhbm90aGVyIGNvbm5lY3Rpb24gb24gdGhlIGJ1cyBhbmQgbWF5IGJlIGVpdGhlciB0aGUgdW5pcXVlIG5hbWUKKyAqIGFzc2lnbmVkIGJ5IHRoZSBidXMgdG8gZWFjaCBjb25uZWN0aW9uLCBvciBhIHdlbGwta25vd24gbmFtZQorICogc3BlY2lmaWVkIGluIGFkdmFuY2UuCisgKgorICogVGhlIGRlc3RpbmF0aW9uIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gbmFtZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmRlc3RpbmF0aW9uKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXN0aW5hdGlvbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKGRlc3RpbmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVzc2FnZSBvciAjTlVMTCBpZiB0aGVyZSBpcyBub25lIHNldC4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWVzc2FnZSBzZW5kZXIuCisgKgorICogVGhlIHNlbmRlciBtdXN0IGJlIGEgdmFsaWQgYnVzIG5hbWUgYXMgZGVmaW5lZCBpbiB0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogVXN1YWxseSB5b3UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMuIFRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gd2lsbAorICogY2FsbCBpdCB0byBzZXQgdGhlIG9yaWdpbiBvZiBlYWNoIG1lc3NhZ2UuIElmIHlvdSBhcmVuJ3QgaW1wbGVtZW50aW5nCisgKiBhIG1lc3NhZ2UgYnVzIGRhZW1vbiB5b3Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IHRoZSBzZW5kZXIuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc2VuZGVyKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZW5kZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB3aGljaCBvcmlnaW5hdGVkIHRoaXMKKyAqIG1lc3NhZ2UsIG9yICNOVUxMIGlmIHVua25vd24gb3IgaW5hcHBsaWNhYmxlLiBUaGUgc2VuZGVyIGlzIGZpbGxlZAorICogaW4gYnkgdGhlIG1lc3NhZ2UgYnVzLgorICoKKyAqIE5vdGUsIHRoZSByZXR1cm5lZCBzZW5kZXIgaXMgYWx3YXlzIHRoZSB1bmlxdWUgYnVzIG5hbWUuCisgKiBDb25uZWN0aW9ucyBtYXkgb3duIG11bHRpcGxlIG90aGVyIGJ1cyBuYW1lcywgYnV0IHRob3NlCisgKiBhcmUgbm90IGZvdW5kIGluIHRoZSBzZW5kZXIgZmllbGQuCisgKiAKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBzZW5kZXIgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UsIGkuZS4gdGhlIGFyZ3VtZW50cyBpbiB0aGUKKyAqIG1lc3NhZ2UgcGF5bG9hZC4gVGhlIHNpZ25hdHVyZSBpbmNsdWRlcyBvbmx5ICJpbiIgYXJndW1lbnRzIGZvcgorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMIGFuZCBvbmx5ICJvdXQiIGFyZ3VtZW50cyBmb3IKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOLCBzbyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbQorICogd2hhdCB5b3UgbWlnaHQgZXhwZWN0ICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlCisgKiBlbnRpcmUgQysrLXN0eWxlIG1ldGhvZCkuCisgKgorICogVGhlIHNpZ25hdHVyZSBpcyBhIHN0cmluZyBtYWRlIHVwIG9mIHR5cGUgY29kZXMgc3VjaCBhcworICogI0RCVVNfVFlQRV9JTlQzMi4gVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIHdpdGggbnVsIChudWwgaXMgYWxzbworICogdGhlIHZhbHVlIG9mICNEQlVTX1RZUEVfSU5WQUxJRCkuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7CisgIGludCB0eXBlX3BvczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworCisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh0eXBlX3N0ciwgdHlwZV9wb3MsIDApOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaGFzX3R5cGVfaW50ZXJmYWNlX21lbWJlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZW1iZXIpCit7CisgIGNvbnN0IGNoYXIgKm47CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGlmYWNlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG1lbWJlciAhPSBOVUxMKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSB0eXBlKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBPcHRpbWl6ZSBieSBjaGVja2luZyB0aGUgc2hvcnQgbWVtYmVyIG5hbWUgZmlyc3QKKyAgICogaW5zdGVhZCBvZiB0aGUgbG9uZ2VyIGludGVyZmFjZSBuYW1lCisgICAqLworCisgIG4gPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisKKyAgaWYgKG4gJiYgc3RyY21wIChuLCBtZW1iZXIpID09IDApCisgICAgeworICAgICAgbiA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKworICAgICAgaWYgKG4gPT0gTlVMTCB8fCBzdHJjbXAgKG4sIGlmYWNlKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEgbWV0aG9kIGNhbGwgd2l0aCB0aGUgZ2l2ZW4KKyAqIGludGVyZmFjZSBhbmQgbWVtYmVyIGZpZWxkcy4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdAorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLCBvciBoYXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIG9yCisgKiBtZW1iZXIgZmllbGQsIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgaW50ZXJmYWNlIGZpZWxkIGlzIG1pc3NpbmcsCisgKiB0aGVuIGl0IHdpbGwgYmUgYXNzdW1lZCBlcXVhbCB0byB0aGUgcHJvdmlkZWQgaW50ZXJmYWNlLiAgVGhlIEQtQnVzCisgKiBwcm90b2NvbCBhbGxvd3MgbWV0aG9kIGNhbGxlcnMgdG8gbGVhdmUgb3V0IHRoZSBpbnRlcmZhY2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGlmYWNlIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGlzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGNhbGwKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm1ldGhvZCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWV0aG9kICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBpbnRlcmZhY2UvbWV0aG9kIGFyZSB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZQorICAgKiBleHBlbnNpdmUsIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2hhc190eXBlX2ludGVyZmFjZV9tZW1iZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZSwgbWV0aG9kKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhIHNpZ25hbCB3aXRoIHRoZSBnaXZlbiBpbnRlcmZhY2UgYW5kCisgKiBtZW1iZXIgZmllbGRzLiAgSWYgdGhlIG1lc3NhZ2UgaXMgbm90ICNEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsIG9yCisgKiBoYXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIG9yIG1lbWJlciBmaWVsZCwgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZmFjZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKiBAcGFyYW0gc2lnbmFsX25hbWUgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGlzIHRoZSBzcGVjaWZpZWQgc2lnbmFsCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzaWduYWxfbmFtZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2lnbmFsX25hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IGludGVyZmFjZS9uYW1lIGFyZSB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZQorICAgKiBleHBlbnNpdmUsIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2hhc190eXBlX2ludGVyZmFjZV9tZW1iZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2UsIHNpZ25hbF9uYW1lKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBlcnJvciByZXBseSB3aXRoIHRoZSBnaXZlbiBlcnJvcgorICogbmFtZS4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdCAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IsIG9yIGhhcyBhCisgKiBkaWZmZXJlbnQgbmFtZSwgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgc3BlY2lmaWVkIGVycm9yCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IGVycm9yX25hbWUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLAorICAgKiBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbiA9IGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSk7CisKKyAgaWYgKG4gJiYgc3RyY21wIChuLCBlcnJvcl9uYW1lKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIHdhcyBzZW50IHRvIHRoZSBnaXZlbiBuYW1lLiAgSWYgdGhlCisgKiBtZXNzYWdlIGhhcyBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgb3IgaGFzIGEgZGlmZmVyZW50CisgKiBkZXN0aW5hdGlvbiwgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfZGVzdGluYXRpb24gKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IG5hbWUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLCBhbmQKKyAgICogbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgaWYgKHMgJiYgc3RyY21wIChzLCBuYW1lKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gdW5pcXVlIG5hbWUgYXMgaXRzIHNlbmRlci4KKyAqIElmIHRoZSBtZXNzYWdlIGhhcyBubyBzZW5kZXIgc3BlY2lmaWVkIG9yIGhhcyBhIGRpZmZlcmVudCBzZW5kZXIsCisgKiByZXR1cm5zICNGQUxTRS4gTm90ZSB0aGF0IGEgcGVlciBhcHBsaWNhdGlvbiB3aWxsIGFsd2F5cyBoYXZlIHRoZQorICogdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gYXMgdGhlIHNlbmRlci4gU28geW91IGNhbid0IHVzZSB0aGlzCisgKiBmdW5jdGlvbiB0byBzZWUgd2hldGhlciBhIHNlbmRlciBvd25lZCBhIHdlbGwta25vd24gbmFtZS4KKyAqCisgKiBNZXNzYWdlcyBmcm9tIHRoZSBidXMgaXRzZWxmIHdpbGwgaGF2ZSAjREJVU19TRVJWSUNFX0RCVVMKKyAqIGFzIHRoZSBzZW5kZXIuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHNlbmRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBuYW1lIGlzIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZSwgYW5kCisgICAqIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgcyA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKTsKKworICBpZiAocyAmJiBzdHJjbXAgKHMsIG5hbWUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiBzaWduYXR1cmU7IHNlZQorICogZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUoKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHdoYXQgdGhlIHNpZ25hdHVyZQorICogbG9va3MgbGlrZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNpZ25hdHVyZSB0eXBlY29kZSBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHNpZ25hdHVyZQorKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzaWduYXR1cmUpCit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaWduYXR1cmUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IHNpZ25hdHVyZSBpcyB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZSBleHBlbnNpdmUsCisgICAqIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHMgPSBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSk7CisKKyAgaWYgKHMgJiYgc3RyY21wIChzLCBzaWduYXR1cmUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2V0cyBhICNEQnVzRXJyb3IgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbgorICogbWVzc2FnZS4gVGhlIGVycm9yIGlzIG9ubHkgc2V0IGlmIHRoZSBtZXNzYWdlCisgKiBpcyBhbiBlcnJvciBtZXNzYWdlLCBhcyBpbiAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IuCisgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlLAorICogYW5kIHRoZSBlcnJvciBtZXNzYWdlIGlzIHNldCB0byB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIGlmIHRoZSBhcmd1bWVudCBleGlzdHMgYW5kIGlzIGEgc3RyaW5nLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIHdhcyBzZXQgKHRoZSBlcnJvciBpcworICogc2V0IGlmIGFuZCBvbmx5IGlmIHRoZSBtZXNzYWdlIGlzIGFuIGVycm9yIG1lc3NhZ2UpLiAgU28geW91IGNhbgorICogY2hlY2sgZm9yIGFuIGVycm9yIHJlcGx5IGFuZCBjb252ZXJ0IGl0IHRvIERCdXNFcnJvciBpbiBvbmUgZ286CisgKiBAY29kZQorICogIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgKiAgICByZXR1cm4gZXJyb3I7CisgKiAgZWxzZQorICogICAgcHJvY2VzcyByZXBseTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciB0byBzZXQKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNldCBpdCBmcm9tCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYWQgdHlwZSAjREJVU19NRVNTQUdFX1RZUEVfRVJST1IKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoREJ1c0Vycm9yICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHJldHVybiBGQUxTRTsKKworICBzdHIgPSBOVUxMOworICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgc3RyID8gIiVzIiA6IE5VTEwsIHN0cik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBtZXNzYWdlIGNvbnRhaW5zIHVuaXggZmRzCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIHVuaXggZmRzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfYXNzZXJ0KG1lc3NhZ2UpOworCisgIHJldHVybiBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMDsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVzc2FnZUludGVybmFscworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGUgaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiB0aGUgbWVzc2FnZSBsb2FkZXIuCisgKgorICogQHRvZG8gdGhpcyBzaG91bGQgYmUgYmFzZWQgb24gbWluIGhlYWRlciBzaXplIHBsdXMgc29tZSBhdmVyYWdlCisgKiBib2R5IHNpemUsIG9yIHNvbWV0aGluZy4gT3IgcmF0aGVyLCB0aGUgbWluIGhlYWRlciBzaXplIG9ubHksIGlmIHdlCisgKiB3YW50IHRvIHRyeSB0byByZWFkIG9ubHkgdGhlIGhlYWRlciwgc3RvcmUgdGhhdCBpbiBhIERCdXNNZXNzYWdlLAorICogdGhlbiByZWFkIG9ubHkgdGhlIGJvZHkgYW5kIHN0b3JlIHRoYXQsIGV0Yy4sIGRlcGVuZHMgb24KKyAqIGhvdyB3ZSBvcHRpbWl6ZSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCkgYW5kIHdoYXQKKyAqIHRoZSBleGFjdCBtZXNzYWdlIGZvcm1hdCBpcy4KKyAqLworI2RlZmluZSBJTklUSUFMX0xPQURFUl9EQVRBX0xFTiAzMgorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBsb2FkZXIuIFJldHVybnMgI05VTEwgaWYgbWVtb3J5IGNhbid0CisgKiBiZSBhbGxvY2F0ZWQuCisgKgorICogQHJldHVybnMgbmV3IGxvYWRlciwgb3IgI05VTEwuCisgKi8KK0RCdXNNZXNzYWdlTG9hZGVyKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICh2b2lkKQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworCisgIGxvYWRlciA9IGRidXNfbmV3MCAoREJ1c01lc3NhZ2VMb2FkZXIsIDEpOworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsb2FkZXItPnJlZmNvdW50ID0gMTsKKworICBsb2FkZXItPmNvcnJ1cHRlZCA9IEZBTFNFOworICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gREJVU19WQUxJRDsKKworICAvKiB0aGlzIGNhbiBiZSBjb25maWd1cmVkIGJ5IHRoZSBhcHAsIGJ1dCBkZWZhdWx0cyB0byB0aGUgcHJvdG9jb2wgbWF4ICovCisgIGxvYWRlci0+bWF4X21lc3NhZ2Vfc2l6ZSA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSDsKKworICAvKiBXZSBzZXQgYSB2ZXJ5IHJlbGF0aXZlbHkgY29uc2VydmF0aXZlIGRlZmF1bHQgaGVyZSBzaW5jZSBkdWUgdG8gaG93CisgIFNDTV9SSUdIVFMgd29ya3Mgd2UgbmVlZCB0byBwcmVhbGxvY2F0ZSBhbiBmZCBhcnJheSBvZiB0aGUgbWF4aW11bQorICBudW1iZXIgb2YgdW5peCBmZHMgd2Ugd2FudCB0byByZWNlaXZlIGluIGFkdmFuY2UuIEEKKyAgdHJ5LWFuZC1yZWFsbG9jYXRlIGxvb3AgaXMgbm90IHBvc3NpYmxlLiAqLworICBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzID0gREJVU19ERUZBVUxUX01FU1NBR0VfVU5JWF9GRFM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxvYWRlci0+ZGF0YSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChsb2FkZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIHByZWFsbG9jYXRlIHRoZSBidWZmZXIgZm9yIHNwZWVkLCBpZ25vcmUgZmFpbHVyZSAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSwgSU5JVElBTF9MT0FERVJfREFUQV9MRU4pOworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSwgMCk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBsb2FkZXItPnVuaXhfZmRzID0gTlVMTDsKKyAgbG9hZGVyLT5uX3VuaXhfZmRzID0gbG9hZGVyLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IDA7CisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBsb2FkZXI7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBsb2FkZXIuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIGxvYWRlcgorICovCitEQnVzTWVzc2FnZUxvYWRlciAqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIGxvYWRlci0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gbG9hZGVyOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgbG9hZGVyIGFuZCBmaW5hbGl6ZXMgdGhlCisgKiBsb2FkZXIgd2hlbiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIGxvYWRlci0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGxvYWRlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIGNsb3NlX3VuaXhfZmRzKGxvYWRlci0+dW5peF9mZHMsICZsb2FkZXItPm5fdW5peF9mZHMpOworICAgICAgZGJ1c19mcmVlKGxvYWRlci0+dW5peF9mZHMpOworI2VuZGlmCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZsb2FkZXItPm1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19tZXNzYWdlX3VucmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZsb2FkZXItPm1lc3NhZ2VzKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9hZGVyLT5kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAobG9hZGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogR2V0cyB0aGUgYnVmZmVyIHRvIHVzZSBmb3IgcmVhZGluZyBkYXRhIGZyb20gdGhlIG5ldHdvcmsuICBOZXR3b3JrCisgKiBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgaW50byBhbiBhbGxvY2F0ZWQgYnVmZmVyLCB3aGljaCBpcyB0aGVuIHVzZWQKKyAqIGluIHRoZSBEQnVzTWVzc2FnZSwgdG8gYXZvaWQgYXMgbWFueSBleHRyYSBtZW1jcHkncyBhcyBwb3NzaWJsZS4KKyAqIFRoZSBidWZmZXIgbXVzdCBhbHdheXMgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgdXNpbmcKKyAqIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKSwgZXZlbiBpZiBubyBieXRlcyBhcmUKKyAqIHN1Y2Nlc3NmdWxseSByZWFkLgorICoKKyAqIEB0b2RvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGEgbG90IG1vcmUgY2xldmVyLiBGb3IgZXhhbXBsZQorICogaXQgY2FuIHByb2JhYmx5IGFsd2F5cyByZXR1cm4gYSBidWZmZXIgc2l6ZSB0byByZWFkIGV4YWN0bHkKKyAqIHRoZSBib2R5IG9mIHRoZSBuZXh0IG1lc3NhZ2UsIHRodXMgYXZvaWRpbmcgYW55IG1lbW9yeSB3YXN0YWdlCisgKiBvciByZWFsbG9jcy4KKyAqCisgKiBAdG9kbyB3ZSBuZWVkIHRvIGVuZm9yY2UgYSBtYXggbGVuZ3RoIG9uIHN0cmluZ3MgaW4gaGVhZGVyIGZpZWxkcy4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBtZXNzYWdlIGxvYWRlci4KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlcgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICoqYnVmZmVyKQoreworICBfZGJ1c19hc3NlcnQgKCFsb2FkZXItPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisKKyAgKmJ1ZmZlciA9ICZsb2FkZXItPmRhdGE7CisKKyAgbG9hZGVyLT5idWZmZXJfb3V0c3RhbmRpbmcgPSBUUlVFOworfQorCisvKioKKyAqIFJldHVybnMgYSBidWZmZXIgb2J0YWluZWQgZnJvbSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCksCisgKiBpbmRpY2F0aW5nIHRvIHRoZSBsb2FkZXIgaG93IG1hbnkgYnl0ZXMgb2YgdGhlIGJ1ZmZlciB3ZXJlIGZpbGxlZAorICogaW4uIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHdheXMgYmUgY2FsbGVkLCBldmVuIGlmIG5vIGJ5dGVzIHdlcmUKKyAqIHN1Y2Nlc3NmdWxseSByZWFkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlci4KKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKmJ1ZmZlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2FkZXItPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyID09ICZsb2FkZXItPmRhdGEpOworCisgIGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nID0gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB0aGUgYnVmZmVyIHRvIHVzZSBmb3IgcmVhZGluZyB1bml4IGZkcyBmcm9tIHRoZSBuZXR3b3JrLgorICoKKyAqIFRoaXMgd29ya3Mgc2ltaWxhciB0byBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCkKKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBtZXNzYWdlIGxvYWRlci4KKyAqIEBwYXJhbSBmZHMgdGhlIGFycmF5IHRvIHJlYWQgZmRzIGludG8KKyAqIEBwYXJhbSBtYXhfbl9mZHMgaG93IG1hbnkgZmRzIHRvIHJlYWQgYXQgbW9zdAorICogQHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAqbWF4X25fZmRzKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcpOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIHdoZXJlIHdlIGNhbiBwdXQgdGhlIGZkcyB3ZSByZWFkLiBXZSBhbGxvY2F0ZQorICAgICBzcGFjZSBmb3IgbWF4X21lc3NhZ2VfdW5peF9mZHMgc2luY2UgdGhpcyBpcyBhbgorICAgICB1cHBlciBsaW1pdCBob3cgbWFueSBmZHMgY2FuIGJlIHJlY2VpdmVkIHdpdGhpbiBhIHNpbmdsZQorICAgICBtZXNzYWdlLiBTaW5jZSBTQ01fUklHSFRTIGRvZXNuJ3QgYWxsb3cgYSByZWFsbG9jYXRlK3JldHJ5IGxvZ2ljCisgICAgIHdlIGFyZSBhbGxvY2F0aW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFycmF5IHNpemUgcmlnaHQgZnJvbSB0aGUKKyAgICAgYmVnaW5uaW5nLiBUaGlzIHN1Y2tzIGEgYml0LCBob3dldmVyIHVubGVzcyBTQ01fUklHSFRTIGlzIGZpeGVkCisgICAgIHRoZXJlIGlzIG5vIGJldHRlciB3YXkuICovCisKKyAgaWYgKGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPCBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzKQorICAgIHsKKyAgICAgIGludCAqYSA9IGRidXNfcmVhbGxvYyhsb2FkZXItPnVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMgKiBzaXplb2YobG9hZGVyLT51bml4X2Zkc1swXSkpOworCisgICAgICBpZiAoIWEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbG9hZGVyLT51bml4X2ZkcyA9IGE7CisgICAgICBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkczsKKyAgICB9CisKKyAgKmZkcyA9IGxvYWRlci0+dW5peF9mZHMgKyBsb2FkZXItPm5fdW5peF9mZHM7CisgICptYXhfbl9mZHMgPSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkIC0gbG9hZGVyLT5uX3VuaXhfZmRzOworCisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBUUlVFOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiUGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHVuaXggZmQgcGFzc2luZyIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIGEgYnVmZmVyIG9idGFpbmVkIGZyb20gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKCkuCisgKgorICogVGhpcyB3b3JrcyBzaW1pbGFyIHRvIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGZkcyB0aGUgYXJyYXkgZmRzIHdlcmUgcmVhZCBpbnRvCisgKiBAcGFyYW0gbl9mZHMgaG93IG1hbnkgZmRzIHdlcmUgcmVhZAorICovCisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2ZkcyhEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgIG5fZmRzKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2Fzc2VydChsb2FkZXItPnVuaXhfZmRzX291dHN0YW5kaW5nKTsKKyAgX2RidXNfYXNzZXJ0KGxvYWRlci0+dW5peF9mZHMgKyBsb2FkZXItPm5fdW5peF9mZHMgPT0gZmRzKTsKKyAgX2RidXNfYXNzZXJ0KGxvYWRlci0+bl91bml4X2ZkcyArIG5fZmRzIDw9IGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQpOworCisgIGxvYWRlci0+bl91bml4X2ZkcyArPSBuX2ZkczsKKyAgbG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyA9IEZBTFNFOworCisgIGlmIChuX2ZkcyAmJiBsb2FkZXItPnVuaXhfZmRzX2NoYW5nZSkKKyAgICBsb2FkZXItPnVuaXhfZmRzX2NoYW5nZSAobG9hZGVyLT51bml4X2Zkc19jaGFuZ2VfZGF0YSk7CisjZWxzZQorICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIlBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCB1bml4IGZkIHBhc3NpbmciKTsKKyNlbmRpZgorfQorCisvKgorICogRklYTUUgd2hlbiB3ZSBtb3ZlIHRoZSBoZWFkZXIgb3V0IG9mIHRoZSBidWZmZXIsIHRoYXQgbWVtbW92ZXMgYWxsCisgKiBidWZmZXJlZCBtZXNzYWdlcy4gS2luZCBvZiBjcmFwcHkuCisgKgorICogQWxzbyB3ZSBjb3B5IHRoZSBoZWFkZXIgYW5kIGJvZHksIHdoaWNoIGlzIGtpbmQgb2YgY3JhcHB5LiAgVG8KKyAqIGF2b2lkIHRoaXMsIHdlIGhhdmUgdG8gYWxsb3cgaGVhZGVyIGFuZCBib2R5IHRvIGJlIGluIGEgc2luZ2xlCisgKiBtZW1vcnkgYmxvY2ssIHdoaWNoIGlzIGdvb2QgZm9yIG1lc3NhZ2VzIHdlIHJlYWQgYW5kIGJhZCBmb3IKKyAqIG1lc3NhZ2VzIHdlIGFyZSBjcmVhdGluZy4gQnV0IHdlIGNvdWxkIG1vdmVfbGVuKCkgdGhlIGJ1ZmZlciBpbnRvCisgKiB0aGlzIHNpbmdsZSBtZW1vcnkgYmxvY2ssIGFuZCBtb3ZlX2xlbigpIHdpbGwganVzdCBzd2FwIHRoZSBidWZmZXJzCisgKiBpZiB5b3UncmUgbW92aW5nIHRoZSBlbnRpcmUgYnVmZmVyIHJlcGxhY2luZyB0aGUgZGVzdCBzdHJpbmcuCisgKgorICogV2UgY291bGQgYWxzbyBoYXZlIHRoZSBtZXNzYWdlIGxvYWRlciB0ZWxsIHRoZSB0cmFuc3BvcnQgaG93IG1hbnkKKyAqIGJ5dGVzIHRvIHJlYWQ7IHNvIGl0IHdvdWxkIGZpcnN0IGFzayBmb3Igc29tZSBhcmJpdHJhcnkgbnVtYmVyIGxpa2UKKyAqIDI1NiwgdGhlbiBpZiB0aGUgbWVzc2FnZSB3YXMgaW5jb21wbGV0ZSBpdCB3b3VsZCB1c2UgdGhlCisgKiBoZWFkZXIvYm9keSBsZW4gdG8gYXNrIGZvciBleGFjdGx5IHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIChvcgorICogYmxvY2tzIHRoZSBzaXplIG9mIGEgdHlwaWNhbCBrZXJuZWwgYnVmZmVyIGZvciB0aGUgc29ja2V0KS4gVGhhdAorICogd2F5IHdlIGRvbid0IGdldCB0cmFpbGluZyBieXRlcyBpbiB0aGUgYnVmZmVyIHRoYXQgaGF2ZSB0byBiZQorICogbWVtbW92ZWQuIFRob3VnaCBJIHN1cHBvc2Ugd2UgYWxzbyBkb24ndCBoYXZlIGEgY2hhbmNlIG9mIHJlYWRpbmcgYQorICogYnVuY2ggb2Ygc21hbGwgbWVzc2FnZXMgYXQgb25jZSwgc28gdGhlIG9wdGltaXphdGlvbiBtYXkgYmUgc3R1cGlkLgorICoKKyAqIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8ga2VlcCBhICJzdGFydCIgaW5kZXggaW50bworICogbG9hZGVyLT5kYXRhIGFuZCBvbmx5IGRlbGV0ZSBpdCBvY2Nhc2lvbmFsbHksIGluc3RlYWQgb2YgYWZ0ZXIKKyAqIGVhY2ggbWVzc2FnZSBpcyBsb2FkZWQuCisgKgorICogbG9hZF9tZXNzYWdlKCkgcmV0dXJucyBGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeSBPUiB0aGUgbG9hZGVyIHdhcyBjb3JydXB0ZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90Citsb2FkX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIsCisgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4pCit7CisgIGRidXNfYm9vbF90IG9vbTsKKyAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0cjsKKyAgaW50IHR5cGVfcG9zOworICBEQnVzVmFsaWRhdGlvbk1vZGUgbW9kZTsKKyAgZGJ1c191aW50MzJfdCBuX3VuaXhfZmRzID0gMDsKKworICBtb2RlID0gREJVU19WQUxJREFUSU9OX01PREVfREFUQV9JU19VTlRSVVNURUQ7CisgIAorICBvb20gPSBGQUxTRTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZsb2FkZXItPmRhdGEsIDAsIGhlYWRlcl9sZW4gLyogKyBib2R5X2xlbiAqLyk7CisjZW5kaWYKKworICAvKiAxLiBWQUxJREFURSBBTkQgQ09QWSBPVkVSIEhFQURFUiAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpID09IDApOworICBfZGJ1c19hc3NlcnQgKChoZWFkZXJfbGVuICsgYm9keV9sZW4pIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSk7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfbG9hZCAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvYWRlci0+ZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgaGVhZGVyIGZvciBuZXcgbWVzc2FnZSBjb2RlICVkXG4iLCB2YWxpZGl0eSk7CisKKyAgICAgIC8qIGFzc2VydCBoZXJlIHNvIHdlIGNhbiBjYXRjaCBhbnkgY29kZSB0aGF0IHN0aWxsIHVzZXMgREJVU19WQUxJRCB0byBpbmRpY2F0ZQorICAgICAgICAgb29tIGVycm9ycy4gIFRoZXkgc2hvdWxkIHVzZSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SIGluc3RlYWQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsaWRpdHkgIT0gREJVU19WQUxJRCk7CisKKyAgICAgIGlmICh2YWxpZGl0eSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SKQorICAgICAgICBvb20gPSBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSB2YWxpZGl0eTsKKyAgICAgICAgfQorICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAodmFsaWRpdHkgPT0gREJVU19WQUxJRCk7CisKKyAgLyogMi4gVkFMSURBVEUgQk9EWSAqLworICBpZiAobW9kZSAhPSBEQlVTX1ZBTElEQVRJT05fTU9ERV9XRV9UUlVTVF9USElTX0RBVEFfQUJTT0xVVEVMWSkKKyAgICB7CisgICAgICBnZXRfY29uc3Rfc2lnbmF0dXJlICgmbWVzc2FnZS0+aGVhZGVyLCAmdHlwZV9zdHIsICZ0eXBlX3Bvcyk7CisgICAgICAKKyAgICAgIC8qIEJlY2F1c2UgdGhlIGJ5dGVzX3JlbWFpbmluZyBhcmcgaXMgTlVMTCwgdGhpcyB2YWxpZGF0ZXMgdGhhdCB0aGUKKyAgICAgICAqIGJvZHkgaXMgdGhlIHJpZ2h0IGxlbmd0aAorICAgICAgICovCisgICAgICB2YWxpZGl0eSA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKHR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV9sZW4pOworICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHZhbGlkYXRlIG1lc3NhZ2UgYm9keSBjb2RlICVkXG4iLCB2YWxpZGl0eSk7CisKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IHZhbGlkaXR5OworICAgICAgICAgIAorICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorCisgIC8qIDMuIENPUFkgT1ZFUiBVTklYIEZEUyAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfVU5JWF9GRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl91bml4X2Zkcyk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmIChuX3VuaXhfZmRzID4gbG9hZGVyLT5uX3VuaXhfZmRzKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UoIk1lc3NhZ2UgY29udGFpbnMgcmVmZXJlbmNlcyB0byBtb3JlIHVuaXggZmRzIHRoYW4gd2VyZSBzZW50ICV1ICE9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBuX3VuaXhfZmRzLCBsb2FkZXItPm5fdW5peF9mZHMpOworCisgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gREJVU19JTlZBTElEX01JU1NJTkdfVU5JWF9GRFM7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogSWYgdGhpcyB3YXMgYSByZWN5Y2xlZCBtZXNzYWdlIHRoZXJlIG1pZ2h0IHN0aWxsIGJlCisgICAgIHNvbWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGZkcyAqLworICBkYnVzX2ZyZWUobWVzc2FnZS0+dW5peF9mZHMpOworCisgIGlmIChuX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICBtZXNzYWdlLT51bml4X2ZkcyA9IF9kYnVzX21lbWR1cChsb2FkZXItPnVuaXhfZmRzLCBuX3VuaXhfZmRzICogc2l6ZW9mKG1lc3NhZ2UtPnVuaXhfZmRzWzBdKSk7CisgICAgICBpZiAobWVzc2FnZS0+dW5peF9mZHMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZSBkZXNjcmlwdG9yIGFycmF5XG4iKTsKKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbWVzc2FnZS0+bl91bml4X2ZkcyA9IG5fdW5peF9mZHM7CisgICAgICBsb2FkZXItPm5fdW5peF9mZHMgLT0gbl91bml4X2ZkczsKKyAgICAgIG1lbW1vdmUgKGxvYWRlci0+dW5peF9mZHMsIGxvYWRlci0+dW5peF9mZHMgKyBuX3VuaXhfZmRzLCBsb2FkZXItPm5fdW5peF9mZHMgKiBzaXplb2YgKGxvYWRlci0+dW5peF9mZHNbMF0pKTsKKworICAgICAgaWYgKGxvYWRlci0+dW5peF9mZHNfY2hhbmdlKQorICAgICAgICBsb2FkZXItPnVuaXhfZmRzX2NoYW5nZSAobG9hZGVyLT51bml4X2Zkc19jaGFuZ2VfZGF0YSk7CisgICAgfQorICBlbHNlCisgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBOVUxMOworCisjZWxzZQorCisgIGlmIChuX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiSG1tLCBtZXNzYWdlIGNsYWltcyB0byBjb21lIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAiCisgICAgICAgICAgICAgICAgICAgICAiYnV0IHRoYXQncyBub3Qgc3VwcG9ydGVkIG9uIG91ciBwbGF0Zm9ybSwgZGlzY29ubmVjdGluZy5cbiIpOworCisgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gREJVU19JTlZBTElEX01JU1NJTkdfVU5JWF9GRFM7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyNlbmRpZgorCisgIC8qIDMuIENPUFkgT1ZFUiBCT0RZIEFORCBRVUVVRSBNRVNTQUdFICovCisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxvYWRlci0+bWVzc2FnZXMsIG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYXBwZW5kIG5ldyBtZXNzYWdlIHRvIGxvYWRlciBxdWV1ZVxuIik7CisgICAgICBvb20gPSBUUlVFOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPj0KKyAgICAgICAgICAgICAgICAoaGVhZGVyX2xlbiArIGJvZHlfbGVuKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZsb2FkZXItPmRhdGEsIGhlYWRlcl9sZW4sIGJvZHlfbGVuLCAmbWVzc2FnZS0+Ym9keSwgMCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBtb3ZlIGJvZHkgaW50byBuZXcgbWVzc2FnZVxuIik7CisgICAgICBvb20gPSBUUlVFOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZsb2FkZXItPmRhdGEsIDAsIGhlYWRlcl9sZW4gKyBib2R5X2xlbik7CisKKyAgLyogZG9uJ3Qgd2FzdGUgbW9yZSB0aGFuIDJrIG9mIG1lbW9yeSAqLworICBfZGJ1c19zdHJpbmdfY29tcGFjdCAoJmxvYWRlci0+ZGF0YSwgMjA0OCk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSA9PSBoZWFkZXJfbGVuKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IGJvZHlfbGVuKTsKKworICBfZGJ1c192ZXJib3NlICgiTG9hZGVkIG1lc3NhZ2UgJXBcbiIsIG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoIW9vbSk7CisgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+Y29ycnVwdGVkKTsKKyAgX2RidXNfYXNzZXJ0IChsb2FkZXItPm1lc3NhZ2VzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZmluZF9sYXN0ICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisKKyAgLyogQ2xlYW4gdXAgKi8KKworICAvKiBkb2VzIG5vdGhpbmcgaWYgdGhlIG1lc3NhZ2UgaXNuJ3QgaW4gdGhlIGxpc3QgKi8KKyAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmxvYWRlci0+bWVzc2FnZXMsIG1lc3NhZ2UpOworICAKKyAgaWYgKG9vbSkKKyAgICBfZGJ1c19hc3NlcnQgKCFsb2FkZXItPmNvcnJ1cHRlZCk7CisgIGVsc2UKKyAgICBfZGJ1c19hc3NlcnQgKGxvYWRlci0+Y29ycnVwdGVkKTsKKworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmxvYWRlci0+ZGF0YSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ29udmVydHMgYnVmZmVyZWQgZGF0YSBpbnRvIG1lc3NhZ2VzLCBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhLiAgSWYKKyAqIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAdG9kbyB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHByb3BlciBuYW1lZCBoZWFkZXIgZmllbGRzIGV4aXN0CisgKiBmb3IgZWFjaCBtZXNzYWdlIHR5cGUuCisgKgorICogQHRvZG8gSWYgYSBtZXNzYWdlIGhhcyB1bmtub3duIHR5cGUsIHdlIHNob3VsZCBwcm9iYWJseSBlYXQgaXQKKyAqIHJpZ2h0IGhlcmUgcmF0aGVyIHRoYW4gcGFzc2luZyBpdCBvdXQgdG8gYXBwbGljYXRpb25zLiAgSG93ZXZlcgorICogaXQncyBub3QgYW4gZXJyb3IgdG8gc2VlIG1lc3NhZ2VzIG9mIHVua25vd24gdHlwZS4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSB0byBmaW5pc2guCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgd2hpbGUgKCFsb2FkZXItPmNvcnJ1cHRlZCAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpID49IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSkKKyAgICB7CisgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgICAgICBpbnQgYnl0ZV9vcmRlciwgZmllbGRzX2FycmF5X2xlbiwgaGVhZGVyX2xlbiwgYm9keV9sZW47CisKKyAgICAgIGlmIChfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCAobG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvYWRlci0+ZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0ICh2YWxpZGl0eSA9PSBEQlVTX1ZBTElEKTsKKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKCFsb2FkX21lc3NhZ2UgKGxvYWRlciwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAvKiBsb2FkX21lc3NhZ2UoKSByZXR1cm5zIGZhbHNlIGlmIGNvcnJ1cHRlZCBvciBPT007IGlmCisgICAgICAgICAgICAgICAqIGNvcnJ1cHRlZCB0aGVuIHJldHVybiBUUlVFIGZvciBub3QgT09NCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLT5jb3JydXB0ZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGxvYWRlci0+bWVzc2FnZXMgIT0gTlVMTCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJmxvYWRlci0+bWVzc2FnZXMsIG1lc3NhZ2UpICE9IE5VTEwpOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJJbml0aWFsIHBlZWsgYXQgaGVhZGVyIHNheXMgd2UgZG9uJ3QgaGF2ZSBhIHdob2xlIG1lc3NhZ2UgeWV0LCBvciBkYXRhIGJyb2tlbiB3aXRoIGludmFsaWQgY29kZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSk7CisgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IHZhbGlkaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFBlZWtzIGF0IGZpcnN0IGxvYWRlZCBtZXNzYWdlLCByZXR1cm5zICNOVUxMIGlmIG5vIG1lc3NhZ2VzIGhhdmUKKyAqIGJlZW4gcXVldWVkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBuZXh0IG1lc3NhZ2UsIG9yICNOVUxMIGlmIG5vbmUuCisgKi8KK0RCdXNNZXNzYWdlKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfcGVla19tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBpZiAobG9hZGVyLT5tZXNzYWdlcykKKyAgICByZXR1cm4gbG9hZGVyLT5tZXNzYWdlcy0+ZGF0YTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFBvcHMgYSBsb2FkZWQgbWVzc2FnZSAocGFzc2luZyBvd25lcnNoaXAgb2YgdGhlIG1lc3NhZ2UKKyAqIHRvIHRoZSBjYWxsZXIpLiBSZXR1cm5zICNOVUxMIGlmIG5vIG1lc3NhZ2VzIGhhdmUgYmVlbgorICogcXVldWVkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBuZXh0IG1lc3NhZ2UsIG9yICNOVUxMIGlmIG5vbmUuCisgKi8KK0RCdXNNZXNzYWdlKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIHJldHVybiBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvYWRlci0+bWVzc2FnZXMpOworfQorCisvKioKKyAqIFBvcHMgYSBsb2FkZWQgbWVzc2FnZSBpbnNpZGUgYSBsaXN0IGxpbmsgKHBhc3Npbmcgb3duZXJzaGlwIG9mIHRoZQorICogbWVzc2FnZSBhbmQgbGluayB0byB0aGUgY2FsbGVyKS4gUmV0dXJucyAjTlVMTCBpZiBubyBtZXNzYWdlcyBoYXZlCisgKiBiZWVuIGxvYWRlZC4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBtZXNzYWdlIGxpbmssIG9yICNOVUxMIGlmIG5vbmUuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2VfbGluayAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZsb2FkZXItPm1lc3NhZ2VzKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgcG9wcGVkIG1lc3NhZ2UgbGluaywgdXNlZCB0byB1bmRvIGEgcG9wLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgd2l0aCBhIG1lc3NhZ2UgaW4gaXQKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmsgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAqbGluaykKK3sKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZsb2FkZXItPm1lc3NhZ2VzLCBsaW5rKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbG9hZGVyIGlzIGNvbmZ1c2VkIGR1ZSB0byBiYWQgZGF0YS4KKyAqIElmIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCB0aGF0IGFyZSBpbnZhbGlkLCB0aGUKKyAqIGxvYWRlciBnZXRzIGNvbmZ1c2VkIGFuZCBnaXZlcyB1cCBwZXJtYW5lbnRseS4KKyAqIFRoaXMgc3RhdGUgaXMgY2FsbGVkICJjb3JydXB0ZWQuIgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGxvYWRlciBpcyBob3NlZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoKGxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gIT0gREJVU19WQUxJRCkgfHwKKyAgICAgICAgICAgICAgICAoIWxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPT0gREJVU19WQUxJRCkpOworICByZXR1cm4gbG9hZGVyLT5jb3JydXB0ZWQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoYXQga2luZCBvZiBiYWQgZGF0YSBjb25mdXNlZCB0aGUgbG9hZGVyLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgd2h5IHRoZSBsb2FkZXIgaXMgaG9zZWQsIG9yIERCVVNfVkFMSUQgaWYgaXQgaXNuJ3QuCisgKi8KK0RCdXNWYWxpZGl0eQorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2NvcnJ1cHRpb25fcmVhc29uIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBfZGJ1c19hc3NlcnQgKChsb2FkZXItPmNvcnJ1cHRlZCAmJiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uICE9IERCVVNfVkFMSUQpIHx8CisgICAgICAgICAgICAgICAgKCFsb2FkZXItPmNvcnJ1cHRlZCAmJiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID09IERCVVNfVkFMSUQpKTsKKworICByZXR1cm4gbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgbWVzc2FnZSB3ZSBhbGxvdy4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEBwYXJhbSBzaXplIHRoZSBtYXggbWVzc2FnZSBzaXplIGluIGJ5dGVzCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgIHNpemUpCit7CisgIGlmIChzaXplID4gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjbGFtcGluZyByZXF1ZXN0ZWQgbWF4IG1lc3NhZ2Ugc2l6ZSAlbGQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBzaXplLCBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgpOworICAgICAgc2l6ZSA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSDsKKyAgICB9CisgIGxvYWRlci0+bWF4X21lc3NhZ2Vfc2l6ZSA9IHNpemU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2Ugc2l6ZSBpbiBieXRlcy4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEByZXR1cm5zIG1heCBzaXplIGluIGJ5dGVzCisgKi8KK2xvbmcKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcikKK3sKKyAgcmV0dXJuIGxvYWRlci0+bWF4X21lc3NhZ2Vfc2l6ZTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHVuaXggZmRzIHBlciBtZXNzYWdlIHdlIGFsbG93LgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHBhcmFtIG4gdGhlIG1heCBudW1iZXIgb2YgdW5peCBmZHMgaW4gYSBtZXNzYWdlCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgbikKK3sKKyAgaWYgKG4gPiBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY2xhbXBpbmcgcmVxdWVzdGVkIG1heCBtZXNzYWdlIHVuaXhfZmRzICVsZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG4sIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTKTsKKyAgICAgIG4gPSBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUzsKKyAgICB9CisgIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMgPSBuOworfQorCisvKioKKyAqIEdldHMgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgdW5peCBmZHMgcGVyIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEByZXR1cm5zIG1heCB1bml4IGZkcworICovCitsb25nCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKQoreworICByZXR1cm4gbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkczsKK30KKworLyoqCisgKiBSZXR1cm4gaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBhcmUgcGVuZGluZyBpbiB0aGUgbG9hZGVyCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKi8KK2ludAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3BlbmRpbmdfZmRzX2NvdW50IChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHJldHVybiBsb2FkZXItPm5fdW5peF9mZHM7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcGVuZGluZyBmaWxlCisgKiBkZXNjcmlwdG9ycyBpbiB0aGUgbG9hZGVyIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgY2FsbGJhY2sKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqIGNhbGxiYWNrKSAodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBsb2FkZXItPnVuaXhfZmRzX2NoYW5nZSA9IGNhbGxiYWNrOworICBsb2FkZXItPnVuaXhfZmRzX2NoYW5nZV9kYXRhID0gZGF0YTsKKyNlbmRpZgorfQorCitzdGF0aWMgREJ1c0RhdGFTbG90QWxsb2NhdG9yIHNsb3RfYWxsb2NhdG9yID0KKyAgX0RCVVNfREFUQV9TTE9UX0FMTE9DQVRPUl9JTklUIChfREJVU19MT0NLX05BTUUgKG1lc3NhZ2Vfc2xvdHMpKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzTWVzc2FnZS4gVGhlIGFsbG9jYXRlZCBJRCBtYXkgdGhlbiBiZSB1c2VkCisgKiB3aXRoIGRidXNfbWVzc2FnZV9zZXRfZGF0YSgpIGFuZCBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEoKS4KKyAqIFRoZSBwYXNzZWQtaW4gc2xvdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIC0xLCBhbmQgaXMgZmlsbGVkIGluCisgKiB3aXRoIHRoZSBzbG90IElELiBJZiB0aGUgcGFzc2VkLWluIHNsb3QgaXMgbm90IC0xLCBpdCdzIGFzc3VtZWQKKyAqIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkLCBhbmQgaXRzIHJlZmNvdW50IGlzIGluY3JlbWVudGVkLgorICoKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNNZXNzYWdlIG9iamVjdHMgd2lsbAorICogaGF2ZSBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdAorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9wKTsKK30KKworLyoqCisgKiBEZWFsbG9jYXRlcyBhIGdsb2JhbCBJRCBmb3IgbWVzc2FnZSBkYXRhIHNsb3RzLgorICogZGJ1c19tZXNzYWdlX2dldF9kYXRhKCkgYW5kIGRidXNfbWVzc2FnZV9zZXRfZGF0YSgpIG1heSBubworICogbG9uZ2VyIGJlIHVzZWQgd2l0aCB0aGlzIHNsb3QuICBFeGlzdGluZyBkYXRhIHN0b3JlZCBvbiBleGlzdGluZworICogREJ1c01lc3NhZ2Ugb2JqZWN0cyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMKKyAqIGZpbmFsaXplZCwgYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUgcmVwbGFjZWQgaWYKKyAqIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuICBXaGVuIHRoZSByZWZjb3VudCBvbiB0aGUKKyAqIHBhc3NlZC1pbiBzbG90IHJlYWNoZXMgMCwgaXQgaXMgc2V0IHRvIC0xLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBzdG9yaW5nIHRoZSBzbG90IHRvIGRlYWxsb2NhdGUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCpzbG90X3AgPj0gMCk7CisKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhIERCdXNNZXNzYWdlLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIG1lc3NhZ2UgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2RhdGEgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3QgPj0gMCwgRkFMU0UpOworCisgIHJldHZhbCA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAvKiBEbyB0aGUgYWN0dWFsIGZyZWUgb3V0c2lkZSB0aGUgbWVzc2FnZSBsb2NrICovCisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfbWVzc2FnZV9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK2RidXNfbWVzc2FnZV9nZXRfZGF0YSAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgc2xvdCkKK3sKKyAgdm9pZCAqcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICByZXMgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgbWFjaGluZS1yZWFkYWJsZSAobm90IHRyYW5zbGF0ZWQpCisgKiBzdHJpbmcgaW50byBhIEQtQnVzIG1lc3NhZ2UgdHlwZS4KKyAqCisgKiBAY29kZQorICogICAibWV0aG9kX2NhbGwiICAgIC0+IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMCisgKiAgICJtZXRob2RfcmV0dXJuIiAgLT4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTgorICogICAic2lnbmFsIiAgICAgICAgIC0+IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTAorICogICAiZXJyb3IiICAgICAgICAgIC0+IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SCisgKiAgIGFueXRoaW5nIGVsc2UgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRAorICogQGVuZGNvZGUKKyAqCisgKi8KK2ludAorZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKGNvbnN0IGNoYXIgKnR5cGVfc3RyKQoreworICBpZiAoc3RyY21wICh0eXBlX3N0ciwgIm1ldGhvZF9jYWxsIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw7CisgIGlmIChzdHJjbXAgKHR5cGVfc3RyLCAibWV0aG9kX3JldHVybiIpID09IDApCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk47CisgIGVsc2UgaWYgKHN0cmNtcCAodHlwZV9zdHIsICJzaWduYWwiKSA9PSAwKQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw7CisgIGVsc2UgaWYgKHN0cmNtcCAodHlwZV9zdHIsICJlcnJvciIpID09IDApCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOworICBlbHNlCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7Cit9CisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgRC1CdXMgbWVzc2FnZSB0eXBlIGludG8gYQorICogbWFjaGluZS1yZWFkYWJsZSBzdHJpbmcgKG5vdCB0cmFuc2xhdGVkKS4KKyAqCisgKiBAY29kZQorICogICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCAgICAtPiAibWV0aG9kX2NhbGwiCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gIC0+ICJtZXRob2RfcmV0dXJuIgorICogICBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgICAgICAgICAtPiAic2lnbmFsIgorICogICBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiAgICAgICAgICAtPiAiZXJyb3IiCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgICAgICAgIC0+ICJpbnZhbGlkIgorICogQGVuZGNvZGUKKyAqCisgKi8KK2NvbnN0IGNoYXIgKgorZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChpbnQgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgICAgcmV0dXJuICJtZXRob2RfY2FsbCI7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgcmV0dXJuICJtZXRob2RfcmV0dXJuIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKyAgICAgIHJldHVybiAic2lnbmFsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiaW52YWxpZCI7CisgICAgfQorfQorCisvKioKKyAqIFR1cm4gYSBEQnVzTWVzc2FnZSBpbnRvIHRoZSBtYXJzaGFsbGVkIGZvcm0gYXMgZGVzY3JpYmVkIGluIHRoZSBELUJ1cworICogc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHZW5lcmFsbHksIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgZm9yIGVuY2Fwc3VsYXRpbmcgRC1CdXMgbWVzc2FnZXMgaW4KKyAqIGEgZGlmZmVyZW50IHByb3RvY29sLgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIERCdXNNZXNzYWdlCisgKiBAcGFyYW0gbWFyc2hhbGxlZF9kYXRhX3AgdGhlIGxvY2F0aW9uIHRvIHNhdmUgdGhlIG1hcnNoYWxsZWQgZm9ybSB0bworICogQHBhcmFtIGxlbl9wIHRoZSBsb2NhdGlvbiB0byBzYXZlIHRoZSBsZW5ndGggb2YgdGhlIG1hcnNoYWxsZWQgZm9ybSB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX21hcnNoYWwgKERCdXNNZXNzYWdlICAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICoqbWFyc2hhbGxlZF9kYXRhX3AsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpsZW5fcCkKK3sKKyAgREJ1c1N0cmluZyB0bXA7CisgIGRidXNfYm9vbF90IHdhc19sb2NrZWQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtc2cgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1hcnNoYWxsZWRfZGF0YV9wICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChsZW5fcCAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW5zdXJlIHRoZSBtZXNzYWdlIGlzIGxvY2tlZCwgdG8gZW5zdXJlIHRoZSBsZW5ndGggaGVhZGVyIGlzIGZpbGxlZCBpbi4gKi8KKyAgd2FzX2xvY2tlZCA9IG1zZy0+bG9ja2VkOworCisgIGlmICghd2FzX2xvY2tlZCkKKyAgICBkYnVzX21lc3NhZ2VfbG9jayAobXNnKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmKG1zZy0+aGVhZGVyLmRhdGEpLCAwLCAmdG1wLCAwKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgKmxlbl9wID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0bXApOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCYobXNnLT5ib2R5KSwgMCwgJnRtcCwgKmxlbl9wKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgKmxlbl9wID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0bXApOworCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ0bXAsIG1hcnNoYWxsZWRfZGF0YV9wKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworCisgIGlmICghd2FzX2xvY2tlZCkKKyAgICBtc2ctPmxvY2tlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworCisgZmFpbDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworCisgIGlmICghd2FzX2xvY2tlZCkKKyAgICBtc2ctPmxvY2tlZCA9IEZBTFNFOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBEZW1hcnNoYWwgYSBELUJ1cyBtZXNzYWdlIGZyb20gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdlbmVyYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZW5jYXBzdWxhdGluZyBELUJ1cyBtZXNzYWdlcyBpbgorICogYSBkaWZmZXJlbnQgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIHN0ciB0aGUgbWFyc2hhbGxlZCBEQnVzTWVzc2FnZQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHN0cgorICogQHBhcmFtIGVycm9yIHRoZSBsb2NhdGlvbiB0byBzYXZlIGVycm9ycyB0bworICogQHJldHVybnMgI05VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisgKi8KK0RCdXNNZXNzYWdlICoKK2RidXNfbWVzc2FnZV9kZW1hcnNoYWwgKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBEQnVzU3RyaW5nICpidWZmZXI7CisgIERCdXNNZXNzYWdlICptc2c7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHIgIT0gTlVMTCwgTlVMTCk7CisKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworCisgIGlmIChsb2FkZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKGJ1ZmZlciwgc3RyLCBsZW4pKQorICAgIGdvdG8gZmFpbF9vb207CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworCisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKGxvYWRlcikpCisgICAgZ290byBmYWlsX29vbTsKKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAobG9hZGVyKSkKKyAgICBnb3RvIGZhaWxfY29ycnVwdDsKKworICBtc2cgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAobG9hZGVyKTsKKworICBpZiAoIW1zZykKKyAgICBnb3RvIGZhaWxfb29tOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICByZXR1cm4gbXNnOworCisgZmFpbF9jb3JydXB0OgorICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLCAiTWVzc2FnZSBpcyBjb3JydXB0ZWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICBfZGJ1c192YWxpZGl0eV90b19lcnJvcl9tZXNzYWdlIChsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKSk7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICByZXR1cm4gTlVMTDsKKworIGZhaWxfb29tOgorICBfREJVU19TRVRfT09NIChlcnJvcik7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gYmUgaW4gdGhlIGJ1ZmZlciB0byBkZW1hcnNoYWwgYQorICogRC1CdXMgbWVzc2FnZS4KKyAqCisgKiBHZW5lcmFsbHksIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgZm9yIGVuY2Fwc3VsYXRpbmcgRC1CdXMgbWVzc2FnZXMgaW4KKyAqIGEgZGlmZmVyZW50IHByb3RvY29sLgorICoKKyAqIEBwYXJhbSBidWYgZGF0YSB0byBiZSBtYXJzaGFsbGVkCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgQHAgYnVmCisgKiBAcmV0dXJucyAtMSBpZiB0aGVyZSB3YXMgbm8gdmFsaWQgZGF0YSB0byBiZSBkZW1hcnNoYWxsZWQsIDAgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBkYXRhIHRvIGRldGVybWluZSBob3cgbXVjaCBzaG91bGQgYmUgZGVtYXJzaGFsbGVkLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGRlbWFyc2hhbGxlZAorICogCisgKi8KK2ludCAKK2RidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkKGNvbnN0IGNoYXIgKmJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4pCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgYnl0ZV9vcmRlciwgZmllbGRzX2FycmF5X2xlbiwgaGVhZGVyX2xlbiwgYm9keV9sZW47CisgIERCdXNWYWxpZGl0eSB2YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgIGludCBoYXZlX21lc3NhZ2U7CisKKyAgaWYgKCFidWYgfHwgbGVuIDwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKQorICAgIHJldHVybiAwOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgpCisgICAgbGVuID0gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIGJ1ZiwgbGVuKTsKKyAgCisgIHZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgaGF2ZV9tZXNzYWdlCisgICAgPSBfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZChEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWRpdHksICZieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgaWYgKHZhbGlkaXR5ID09IERCVVNfVkFMSUQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChoYXZlX21lc3NhZ2UgfHwgKGhlYWRlcl9sZW4gKyBib2R5X2xlbikgPiBsZW4pOworICAgICAgKHZvaWQpIGhhdmVfbWVzc2FnZTsgLyogdW51c2VkIHVubGVzcyBhc3NlcnRpbmcgKi8KKyAgICAgIHJldHVybiBoZWFkZXJfbGVuICsgYm9keV9sZW47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIC0xOyAvKiBicm9rZW4hICovCisgICAgfQorfQorCisvKioKKyAqIFNldHMgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY2FsbGVyIG9mIHRoZSBtZXRob2QgaXMgcHJlcGFyZWQKKyAqIHRvIHdhaXQgZm9yIGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gdG8gdGFrZSBwbGFjZSAoZm9yIGluc3RhbmNlCisgKiB2aWEgUG9sa2l0KSBiZWZvcmUgdGhlIGFjdHVhbCBtZXRob2QgaXMgcHJvY2Vzc2VkLgorICoKKyAqIFRoZSBmbGFnIGlzICNGQUxTRSBieSBkZWZhdWx0OyB0aGF0IGlzLCBieSBkZWZhdWx0IHRoZSBvdGhlciBlbmQgaXMKKyAqIGV4cGVjdGVkIHRvIG1ha2UgYW55IGF1dGhvcml6YXRpb24gZGVjaXNpb25zIG5vbi1pbnRlcmFjdGl2ZWx5CisgKiBhbmQgcHJvbXB0bHkuIEl0IG1heSB1c2UgdGhlIGVycm9yCisgKiAjREJVU19FUlJPUl9JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OX1JFUVVJUkVEIHRvIHNpZ25hbCB0aGF0CisgKiBhdXRob3JpemF0aW9uIGZhaWxlZCwgYnV0IGNvdWxkIGhhdmUgc3VjY2VlZGVkIGlmIHRoaXMgZmxhZyBoYWQKKyAqIGJlZW4gdXNlZC4KKyAqCisgKiBGb3IgbWVzc2FnZXMgd2hvc2UgdHlwZSBpcyBub3QgI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICogdGhpcyBmbGFnIGlzIG1lYW5pbmdsZXNzIGFuZCBzaG91bGQgbm90IGJlIHNldC4KKyAqCisgKiBPbiB0aGUgcHJvdG9jb2wgbGV2ZWwgdGhpcyB0b2dnbGVzCisgKiAjREJVU19IRUFERVJfRkxBR19BTExPV19JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gYWxsb3cgI1RSVUUgaWYgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiBpcyBhY2NlcHRhYmxlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9zZXRfYWxsb3dfaW50ZXJhY3RpdmVfYXV0aG9yaXphdGlvbiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBhbGxvdykKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkKTsKKworICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19BTExPV19JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93KTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZsYWcgY29udHJvbGxlZCBieQorICogZGJ1c19tZXNzYWdlX3NldF9hbGxvd19pbnRlcmFjdGl2ZV9hdXRob3JpemF0aW9uKCkgaGFzIGJlZW4gc2V0LgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X2FsbG93X2ludGVyYWN0aXZlX2F1dGhvcml6YXRpb24gKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19oZWFkZXJfZ2V0X2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfQUxMT1dfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTik7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1lc3NhZ2UtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS5oIGIvZGJ1cy9kYnVzLW1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNlNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UuaApAQCAtMCwwICsxLDMyMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UuaCBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX01FU1NBR0VfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2U7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBpdGVyYXRvci4gQ2FuIGJlIGNvcGllZCBieSB2YWx1ZSwgYW5kIGNvbnRhaW5zIG5vIGFsbG9jYXRlZCBtZW1vcnkgc28gbmV2ZXIgbmVlZHMgdG8gYmUgZnJlZWQgYW5kIGNhbiBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VJdGVyIERCdXNNZXNzYWdlSXRlcjsKKworLyoqCisgKiBEQnVzTWVzc2FnZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzLiAKKyAqLworc3RydWN0IERCdXNNZXNzYWdlSXRlcgoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTM7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NDsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15ODsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15OTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTA7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTE7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDE7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KK307CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ldyAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgbWVzc2FnZV90eXBlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAgIChjb25zdCBjaGFyICAqYnVzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZXRob2QpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKERCdXNNZXNzYWdlICptZXRob2RfY2FsbCk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICAgICAgICAoY29uc3QgY2hhciAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbmFtZSk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgICAgICAgICAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfZXJyb3JfcHJpbnRmICAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfZm9ybWF0LAorCQkJCQkgICAgIC4uLik7CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX2NvcHkgICAgICAgICAgICAgIChjb25zdCBEQnVzTWVzc2FnZSAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogIGRidXNfbWVzc2FnZV9yZWYgICAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0X3BhdGgpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0X3BhdGgpOyAgCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmlmYWNlKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmlmYWNlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm1lbWJlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm5hbWUpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpkZXN0aW5hdGlvbik7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlbmRlcik7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5ICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIG5vX3JlcGx5KTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZXRob2QpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNpZ25hbF9uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqZXJyb3JfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmJ1c19uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqdW5pcXVlX2J1c19uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2lnbmF0dXJlKTsKK0RCVVNfRVhQT1JUCitkYnVzX3VpbnQzMl90IGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHNlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHJlcGx5X3NlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c191aW50MzJfdCBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgYXV0b19zdGFydCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fc3RhcnQgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKioqcGF0aCk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICAuLi4pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCQkJICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9nZXRfYXJncyAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICAuLi4pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAgICAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9oYXNfbmV4dCAgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX25leHQgICAgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3NpZ25hdHVyZSAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAgICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdmFsdWUpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50KERCdXNNZXNzYWdlSXRlciAqaXRlcik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2lyZSBwcm90b2NvbCBzaXplIG9mIHRoZSBhcnJheSBpbiBieXRlcywKKyAqIHlvdSBkbyBub3Qgd2FudCB0byBrbm93IHRoYXQgcHJvYmFibHkKKyAqLworREJVU19FWFBPUlQKK0RCVVNfREVQUkVDQVRFRCBpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworI2VuZGlmCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5ICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAqbl9lbGVtZW50cyk7CisKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9maXhlZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuX2VsZW1lbnRzKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmNvbnRhaW5lZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1Yik7CisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfbWVzc2FnZV9sb2NrICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAgKERCdXNFcnJvciAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKKworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9zZXRfZGF0YSAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqdHlwZV9zdHIpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAgIChpbnQgdHlwZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19tZXNzYWdlX21hcnNoYWwgICAoREJ1c01lc3NhZ2UgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKiptYXJzaGFsbGVkX2RhdGFfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKmxlbl9wKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoY29uc3QgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGNvbnN0IGNoYXIgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX21lc3NhZ2Vfc2V0X2FsbG93X2ludGVyYWN0aXZlX2F1dGhvcml6YXRpb24gKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIGRidXNfYm9vbF90IGFsbG93KTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9nZXRfYWxsb3dfaW50ZXJhY3RpdmVfYXV0aG9yaXphdGlvbiAoCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWlzYy5jIGIvZGJ1cy9kYnVzLW1pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmRhNTYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1pc2MuYwpAQCAtMCwwICsxLDI1MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1pc2MuYyAgQSBmZXcgYXNzb3J0ZWQgcHVibGljIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWlzYyBNaXNjZWxsYW5lb3VzCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE1pc2NlbGxhbmVvdXMgQVBJIHRoYXQgZG9lc24ndCBjbGVhbmx5IGZpdCBhbnl3aGVyZSBlbHNlCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbnMgdGhlIG1hY2hpbmUgVVVJRCBvZiB0aGUgbWFjaGluZSB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogVGhpcyBVVUlEIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluIHRoZSBzYW1lIHVudGlsIHRoZSBuZXh0IHJlYm9vdAorICogKHVubGVzcyB0aGUgc3lzYWRtaW4gZm9vbGlzaGx5IGNoYW5nZXMgaXQgYW5kIHNjcmV3cyB0aGVtc2VsdmVzKS4KKyAqIEl0IHdpbGwgdXN1YWxseSByZW1haW4gdGhlIHNhbWUgYWNyb3NzIHJlYm9vdHMgYWxzbywgYnV0IGhhcmR3YXJlCisgKiBjb25maWd1cmF0aW9uIGNoYW5nZXMgb3IgcmVidWlsZGluZyB0aGUgbWFjaGluZSBjb3VsZCBicmVhayB0aGF0LgorICoKKyAqIFRoZSBpZGVhIGlzIHRoYXQgdHdvIHByb2Nlc3NlcyB3aXRoIHRoZSBzYW1lIG1hY2hpbmUgSUQgc2hvdWxkIGJlCisgKiBhYmxlIHRvIHVzZSBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyCisgKiBmZWF0dXJlcyBvZiB0aGUgT1MgdGhhdCByZXF1aXJlIGJvdGggcHJvY2Vzc2VzIHRvIGJlIHJ1bm5pbmcKKyAqIG9uIHRoZSBzYW1lIE9TIGtlcm5lbCBpbnN0YW5jZS4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgcGVyLW1hY2hpbmUKKyAqIGluc3RhbmNlcy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgaW4gYnVzIG5hbWVzIG9yCisgKiBYIHNlbGVjdGlvbiBuYW1lcy4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgbWFjaGluZSBob3N0bmFtZSwgYmVjYXVzZQorICogdGhlIGhvc3RuYW1lIGlzIGZyZXF1ZW50bHkgc2V0IHRvICJsb2NhbGhvc3QubG9jYWxkb21haW4iIGFuZAorICogbWF5IGFsc28gY2hhbmdlIGF0IHJ1bnRpbWUuCisgKgorICogWW91IGNhbiBnZXQgdGhlIG1hY2hpbmUgSUQgb2YgYSByZW1vdGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhlCisgKiBtZXRob2QgR2V0TWFjaGluZUlkIGZyb20gaW50ZXJmYWNlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuCisgKgorICogSWYgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBoYXMgdGhlIHNhbWUgbWFjaGluZSBJRCBhcyB0aGUgb25lCisgKiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGVuIHRoZSByZW1vdGUgYXBwbGljYXRpb24gaXMgb24gdGhlCisgKiBzYW1lIG1hY2hpbmUgYXMgeW91ciBhcHBsaWNhdGlvbi4KKyAqCisgKiBUaGUgVVVJRCBpcyBub3QgYSBVVUlEIGluIHRoZSBzZW5zZSBvZiBSRkM0MTIyOyB0aGUgZGV0YWlscworICogYXJlIGV4cGxhaW5lZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcmV0dXJucyBhIDMyLWJ5dGUtbG9uZyBoZXgtZW5jb2RlZCBVVUlEIHN0cmluZywgb3IgI05VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeQorICovCitjaGFyKgorZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyB1dWlkOworICBjaGFyICpzOworCisgIHMgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBzYXlzIGRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQoKSBvbmx5IGZhaWxzIG9uIE9PTTsKKyAgICogdGhpcyBjYW4gYWN0dWFsbHkgYWxzbyBmYWlsIGlmIHRoZSBELUJ1cyBpbnN0YWxsYXRpb24gaXMgZmF1bHR5CisgICAqIChubyBVVUlEKSAqYW5kKiByZWFkaW5nIGEgbmV3IHJhbmRvbSBVVUlEIGZhaWxzLCBidXQgd2UgaGF2ZSBubyB3YXkKKyAgICogdG8gcmVwb3J0IHRoYXQgKi8KKyAgaWYgKCFfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKCZ1dWlkLCBOVUxMKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmdXVpZCwgJnMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICAgICAgcmV0dXJuIHM7CisgICAgfQorCit9CisKKy8qKgorICogQGRlZiBEQlVTX01BSk9SX1ZFUlNJT04KKyAqCisgKiBUaGUgQ09NUElMRSBUSU1FIG1ham9yIHZlcnNpb24gb2YgbGliZGJ1cywgdGhhdCBpcywgdGhlICJYIiBpbiAiWC5ZLloiLAorICogYXMgYW4gaW50ZWdlciBsaXRlcmFsLiBDb25zaWRlciBjYXJlZnVsbHkgd2hldGhlciB0byB1c2UgdGhpcyBvciB0aGUKKyAqIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIGRidXNfZ2V0X3ZlcnNpb24oKS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19NSU5PUl9WRVJTSU9OCisgKgorICogVGhlIENPTVBJTEUgVElNRSBtaW5vciB2ZXJzaW9uIG9mIGxpYmRidXMsIHRoYXQgaXMsIHRoZSAiWSIgaW4gIlguWS5aIiwKKyAqIGFzIGFuIGludGVnZXIgbGl0ZXJhbC4gQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlCisgKiBydW50aW1lIHZlcnNpb24gZnJvbSBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfTUlDUk9fVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgbWljcm8gdmVyc2lvbiBvZiBsaWJkYnVzLCB0aGF0IGlzLCB0aGUgIloiIGluICJYLlkuWiIsCisgKiBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZQorICogcnVudGltZSB2ZXJzaW9uIGZyb20gZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX1ZFUlNJT04KKyAqCisgKiBUaGUgQ09NUElMRSBUSU1FIHZlcnNpb24gb2YgbGliZGJ1cywgYXMgYSBzaW5nbGUgaW50ZWdlciB0aGF0IGhhcyAwIGluIHRoZSBtb3N0CisgKiBzaWduaWZpY2FudCBieXRlLCB0aGUgbWFqb3IgdmVyc2lvbiBpbiB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJ5dGUsCisgKiB0aGUgbWlub3IgdmVyc2lvbiBpbiB0aGUgdGhpcmQgbW9zdCBzaWduaWZpY2FudCwgYW5kIHRoZSBtaWNybyB2ZXJzaW9uIGluIHRoZQorICogbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZS4gVGhpcyBtZWFucyB0d28gREJVU19WRVJTSU9OIGNhbiBiZSBjb21wYXJlZCB0byBzZWUKKyAqIHdoaWNoIGlzIGhpZ2hlci4KKyAqCisgKiBDb25zaWRlciBjYXJlZnVsbHkgd2hldGhlciB0byB1c2UgdGhpcyBvciB0aGUgcnVudGltZSB2ZXJzaW9uIGZyb20KKyAqIGRidXNfZ2V0X3ZlcnNpb24oKS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19WRVJTSU9OX1NUUklORworICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgdmVyc2lvbiBvZiBsaWJkYnVzLCBhcyBhIHN0cmluZyAiWC5ZLloiLgorICoKKyAqIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZSBydW50aW1lIHZlcnNpb24gZnJvbQorICogZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogR2V0cyB0aGUgRFlOQU1JQ0FMTFkgTElOS0VEIHZlcnNpb24gb2YgbGliZGJ1cy4gQWx0ZXJuYXRpdmVseSwgdGhlcmUKKyAqIGFyZSBtYWNyb3MgI0RCVVNfTUFKT1JfVkVSU0lPTiwgI0RCVVNfTUlOT1JfVkVSU0lPTiwgI0RCVVNfTUlDUk9fVkVSU0lPTiwKKyAqIGFuZCAjREJVU19WRVJTSU9OIHdoaWNoIGFsbG93IHlvdSB0byB0ZXN0IHRoZSBWRVJTSU9OIFlPVSBBUkUgQ09NUElMRUQgQUdBSU5TVC4KKyAqIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGdldCBlaXRoZXIgdGhlIHJ1bnRpbWUgb3IgdGhlIGNvbXBpbGUtdGltZSB2ZXJzaW9uLgorICogVGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoaWNoIG9mIHRoZXNlIHlvdSB3YW50IGluIGEgZ2l2ZW4gY2FzZS4KKyAqCisgKiBUaGUgbGliZGJ1cyBmdWxsIHZlcnNpb24gbnVtYmVyIGlzICJNQUpPUi5NSU5PUi5NSUNSTyIgd2hlcmUgdGhlCisgKiBNSU5PUiBjaGFuZ2VzIGlmIEFQSSBpcyBhZGRlZCwgYW5kIHRoZSBNSUNSTyBjaGFuZ2VzIHdpdGggZWFjaAorICogcmVsZWFzZSBvZiBhIE1BSk9SLk1JTk9SIHNlcmllcy4gIFRoZSBNSU5PUiBpcyBhbiBvZGQgbnVtYmVyIGZvcgorICogZGV2ZWxvcG1lbnQgcmVsZWFzZXMgYW5kIGFuIGV2ZW4gbnVtYmVyIGZvciBzdGFibGUgcmVsZWFzZXMuCisgKiAKKyAqIEBwYXJhbSBtYWpvcl92ZXJzaW9uX3AgcG9pbnRlciB0byByZXR1cm4gdGhlIG1ham9yIHZlcnNpb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWlub3JfdmVyc2lvbl9wIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uLCBvciAjTlVMTAorICogQHBhcmFtIG1pY3JvX3ZlcnNpb25fcCBwb2ludGVyIHRvIHJldHVybiB0aGUgbWljcm8gdmVyc2lvbiwgb3IgI05VTEwgCisgKiAKKyAqLwordm9pZAorZGJ1c19nZXRfdmVyc2lvbiAoaW50ICptYWpvcl92ZXJzaW9uX3AsCisgICAgICAgICAgICAgICAgICBpbnQgKm1pbm9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgIGludCAqbWljcm9fdmVyc2lvbl9wKQoreworICBpZiAobWFqb3JfdmVyc2lvbl9wKQorICAgICptYWpvcl92ZXJzaW9uX3AgPSBEQlVTX01BSk9SX1ZFUlNJT047CisgIGlmIChtaW5vcl92ZXJzaW9uX3ApCisgICAgKm1pbm9yX3ZlcnNpb25fcCA9IERCVVNfTUlOT1JfVkVSU0lPTjsKKyAgaWYgKG1pY3JvX3ZlcnNpb25fcCkKKyAgICAqbWljcm9fdmVyc2lvbl9wID0gREJVU19NSUNST19WRVJTSU9OOworfQorCisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgcHVibGljIEFQSSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKK2RidXNfYm9vbF90CitfZGJ1c19taXNjX3Rlc3QgKHZvaWQpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBEQnVzU3RyaW5nIHN0cjsKKworICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgY3Jhc2ggb24gTlVMTCAqLworICBkYnVzX2dldF92ZXJzaW9uIChOVUxMLCBOVUxMLCBOVUxMKTsKKworICAvKiBOb3cgdmVyaWZ5IHRoYXQgYWxsIHRoZSBjb21waWxlLXRpbWUgdmVyc2lvbiBzdHVmZgorICAgKiBpcyByaWdodCBhbmQgbWF0Y2hlcyB0aGUgcnVudGltZS4gVGhlc2UgdGVzdHMKKyAgICogYXJlIG1vc3RseSBpbnRlbmRlZCB0byBjYXRjaCB2YXJpb3VzIGtpbmRzIG9mCisgICAqIHR5cG8gKG1peGluZyB1cCBtYWpvciBhbmQgbWlub3IsIHRoYXQgc29ydCBvZiB0aGluZykuCisgICAqLworICBkYnVzX2dldF92ZXJzaW9uICgmbWFqb3IsICZtaW5vciwgJm1pY3JvKTsKKworICBfZGJ1c19hc3NlcnQgKG1ham9yID09IERCVVNfTUFKT1JfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAobWlub3IgPT0gREJVU19NSU5PUl9WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChtaWNybyA9PSBEQlVTX01JQ1JPX1ZFUlNJT04pOworCisjZGVmaW5lIE1BS0VfVkVSU0lPTih4LCB5LCB6KSAoKCh4KSA8PCAxNikgfCAoKHkpIDw8IDgpIHwgKHopKQorCisgIC8qIGNoZWNrIHRoYXQgTUFLRV9WRVJTSU9OIHdvcmtzIGFuZCBwcm9kdWNlcyB0aGUgaW50ZW5kZWQgb3JkZXJpbmcgKi8KKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDEsIDAsIDApID4gTUFLRV9WRVJTSU9OICgwLCAwLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgxLCAxLCAwKSA+IE1BS0VfVkVSU0lPTiAoMSwgMCwgMCkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMSwgMSwgMSkgPiBNQUtFX1ZFUlNJT04gKDEsIDEsIDApKTsKKworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMiwgMCwgMCkgPiBNQUtFX1ZFUlNJT04gKDEsIDEsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDIsIDEsIDApID4gTUFLRV9WRVJTSU9OICgxLCAxLCAxKSk7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgyLCAxLCAxKSA+IE1BS0VfVkVSU0lPTiAoMSwgMSwgMSkpOworCisgIC8qIGNoZWNrIERCVVNfVkVSU0lPTiAqLworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yLCBtaWNybykgPT0gREJVU19WRVJTSU9OKTsKKworICAvKiBjaGVjayB0aGF0IG9yZGVyaW5nIHdvcmtzIHdpdGggREJVU19WRVJTSU9OICovCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciAtIDEsIG1pbm9yLCBtaWNybykgPCBEQlVTX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yIC0gMSwgbWljcm8pIDwgREJVU19WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciwgbWljcm8gLSAxKSA8IERCVVNfVkVSU0lPTik7CisgIAorICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IgKyAxLCBtaW5vciwgbWljcm8pID4gREJVU19WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciArIDEsIG1pY3JvKSA+IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IsIG1pY3JvICsgMSkgPiBEQlVTX1ZFUlNJT04pOworCisgIC8qIENoZWNrIERCVVNfVkVSU0lPTl9TVFJJTkcgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIShfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnN0ciwgbWFqb3IpICYmCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJy4nKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnN0ciwgbWlub3IpICYmCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJy4nKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnN0ciwgbWljcm8pKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19WRVJTSU9OX1NUUklORykpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWlzYy5oIGIvZGJ1cy9kYnVzLW1pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcyZDllCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1pc2MuaApAQCAtMCwwICsxLDU2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWlzYy5oICBBIGZldyBhc3NvcnRlZCBwdWJsaWMgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZml0IGVsc2V3aGVyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX01JU0NfSAorI2RlZmluZSBEQlVTX01JU0NfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01pc2MKKyAqIEB7CisgKi8KK0RCVVNfRVhQT1JUCitjaGFyKiAgICAgICBkYnVzX2dldF9sb2NhbF9tYWNoaW5lX2lkICAodm9pZCk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2dldF92ZXJzaW9uICAgICAgICAgICAoaW50ICptYWpvcl92ZXJzaW9uX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptaW5vcl92ZXJzaW9uX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptaWNyb192ZXJzaW9uX3ApOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXRlbnYgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01JU0NfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbm9uY2UuYyBiL2RidXMvZGJ1cy1ub25jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGY2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbm9uY2UuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW5vbmNlLmMgIE5vbmNlIGhhbmRsaW5nIGZ1bmN0aW9ucyB1c2VkIGJ5IG5vbmNlLXRjcCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtsYXJhbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCBpbmZvQGtkYWIubmV0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorLy8gbWFqb3Igc2VjdGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBtb2RpZmllZCBjb2RlIGZyb20gbGliYXNzdWFuLCAoQykgRlNGCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citkb19jaGVja19ub25jZSAoREJ1c1NvY2tldCBmZCwgY29uc3QgREJ1c1N0cmluZyAqbm9uY2UsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgYnVmZmVyOworICBEQnVzU3RyaW5nIHA7CisgIHNpemVfdCBubGVmdDsKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworICBpbnQgbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBubGVmdCA9IDE2OworCisgIGlmICggICAhX2RidXNfc3RyaW5nX2luaXQgKCZidWZmZXIpCisgICAgICB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZwKSApIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgIHdoaWxlIChubGVmdCkKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm87CisKKyAgICAgIG4gPSBfZGJ1c19yZWFkX3NvY2tldCAoZmQsICZwLCBubGVmdCk7CisgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIgKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgOworICAgICAgZWxzZSBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrIChzYXZlZF9lcnJubykpCisgICAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwKTsKKyAgICAgIGVsc2UgaWYgKG49PS0xKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgbm9uY2UgZnJvbSBzb2NrZXQgKGZkPSVkKSIsIGZkICk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gc29ja2V0IChmZD0lZCkiLCBmZCApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoJmJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcCksIG4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgbmxlZnQgLT0gbjsKKyAgICAgICAgfQorICAgIH0KKworICByZXN1bHQgPSAgX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoJmJ1ZmZlciwgbm9uY2UsIDE2KTsKKyAgaWYgKCFyZXN1bHQpCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsICJOb25jZXMgZG8gbm90IG1hdGNoLCBhY2Nlc3MgZGVuaWVkIChmZD0lZCkiLCBmZCApOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYnVmZmVyKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJlYWRzIHRoZSBub25jZSBmcm9tIHRoZSBub25jZSBmaWxlIGFuZCBzdG9yZXMgaXQgaW4gYSBzdHJpbmcKKyAqCisgKiBAcGFyYW0gZm5hbWUgdGhlIGZpbGUgdG8gcmVhZCB0aGUgbm9uY2UgZnJvbQorICogQHBhcmFtIG5vbmNlIHJldHVybnMgdGhlIG5vbmNlLiBNdXN0IGJlIGFuIGluaXRpYWxpemVkIHN0cmluZywgdGhlIG5vbmNlIHdpbGwgYmUgYXBwZW5kZWQuCisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb2JqZWN0IHRvIHJlcG9ydCBwb3NzaWJsZSBlcnJvcnMKKyAqIEByZXR1cm4gRkFMU0UgaWZmIHJlYWRpbmcgdGhlIG5vbmNlIGZhaWxzIChlcnJvciBpcyBzZXQgdGhlbikKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfbm9uY2UgKGNvbnN0IERCdXNTdHJpbmcgKmZuYW1lLCBEQnVzU3RyaW5nICpub25jZSwgREJ1c0Vycm9yKiBlcnJvcikKK3sKKyAgRklMRSAqZnA7CisgIGNoYXIgYnVmZmVyWzE3XTsKKyAgc2l6ZV90IG5yZWFkOworCisgIGJ1ZmZlcltzaXplb2YgYnVmZmVyIC0gMV0gPSAnXDAnOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWFkaW5nIG5vbmNlIGZyb20gZmlsZTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZm5hbWUpKTsKKworCisgIGZwID0gZm9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZm5hbWUpLCAicmIiKTsKKyAgaWYgKCFmcCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICgpLAorCQkgICAgICAiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHJlYWQ6ICVzIiwKKwkJICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmbmFtZSksCisJCSAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBucmVhZCA9IGZyZWFkIChidWZmZXIsIDEsIHNpemVvZiBidWZmZXIgLSAxLCBmcCk7CisgIGZjbG9zZSAoZnApOworICBpZiAoIW5yZWFkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gZmlsZSAlcyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZm5hbWUpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAobm9uY2UsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciAtIDEgKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitEQnVzU29ja2V0CitfZGJ1c19hY2NlcHRfd2l0aF9ub25jZWZpbGUgKERCdXNTb2NrZXQgbGlzdGVuX2ZkLCBjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUpCit7CisgIERCdXNTb2NrZXQgZmQ7CisgIERCdXNTdHJpbmcgbm9uY2U7CisKKyAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUgIT0gTlVMTCk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgLy9QRU5ESU5HKGtkYWIpOiBzZXQgYmV0dGVyIGVycm9ycworICBpZiAoX2RidXNfcmVhZF9ub25jZSAoX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoKG5vbmNlZmlsZSksICZub25jZSwgTlVMTCkgIT0gVFJVRSkKKyAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICBmZCA9IF9kYnVzX2FjY2VwdCAobGlzdGVuX2ZkKTsKKyAgaWYgKCFfZGJ1c19zb2NrZXRfaXNfdmFsaWQgKGZkKSkKKyAgICByZXR1cm4gZmQ7CisgIGlmIChkb19jaGVja19ub25jZShmZCwgJm5vbmNlLCBOVUxMKSAhPSBUUlVFKSB7CisgICAgX2RidXNfdmVyYm9zZSAoIm5vbmNlIGNoZWNrIGZhaWxlZC4gQ2xvc2luZyBzb2NrZXQuXG4iKTsKKyAgICBfZGJ1c19jbG9zZV9zb2NrZXQoZmQsIE5VTEwpOworICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgIH0KKworICByZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfYW5kX3dyaXRlX25vbmNlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBub25jZTsKKyAgZGJ1c19ib29sX3QgcmV0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmbm9uY2UsIDE2LCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldCA9IF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKCZub25jZSwgZmlsZW5hbWUsIEZBTFNFLCBlcnJvcik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzZW5kcyB0aGUgbm9uY2Ugb3ZlciBhIGdpdmVuIHNvY2tldC4gQmxvY2tzIHdoaWxlIGRvaW5nIHNvLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRoZSBub25jZSBkYXRhIHRvICh1c3VhbGx5IGEgc29ja2V0KQorICogQHBhcmFtIG5vbmNlZmlsZSB0aGUgbm9uY2VmaWxlIGxvY2F0aW9uIHRvIHJlYWQgdGhlIG5vbmNlIGZyb20KKyAqIEBwYXJhbSBlcnJvciBjb250YWlucyBlcnJvciBkZXRhaWxzIGlmIEZBTFNFIGlzIHJldHVybmVkCisgKiBAcmV0dXJuIFRSVUUgaWZmIHRoZSBub25jZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgKiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzZXJ2ZXIgYWNjZXB0ZWQgdGhlIG5vbmNlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2VuZF9ub25jZSAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmVhZF9yZXN1bHQ7CisgIGludCBzZW5kX3Jlc3VsdDsKKyAgREJ1c1N0cmluZyBub25jZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5vbmNlZmlsZSkgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVhZF9yZXN1bHQgPSBfZGJ1c19yZWFkX25vbmNlIChub25jZWZpbGUsICZub25jZSwgZXJyb3IpOworICBpZiAoIXJlYWRfcmVzdWx0KQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgc2VuZF9yZXN1bHQgPSBfZGJ1c193cml0ZV9zb2NrZXQgKGZkLCAmbm9uY2UsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbm9uY2UpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKworICBpZiAoc2VuZF9yZXN1bHQgPT0gLTEpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2VuZCBub25jZSAoZmQ9JWQpOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgdXNlX3N1YmRpcikKK3sKKyAgICBEQnVzU3RyaW5nIHJhbmRvbVN0cjsKKyAgICBjb25zdCBjaGFyICp0bXA7CisKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX2Fzc2VydCAobm9uY2VmaWxlKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyYW5kb21TdHIpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKworICAgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmcmFuZG9tU3RyLCA4LCBlcnJvcikpCisgICAgICB7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICB9CisKKyAgICB0bXAgPSBfZGJ1c19nZXRfdG1wZGlyICgpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlZmlsZS0+ZGlyKQorICAgICAgICB8fCB0bXAgPT0gTlVMTAorICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+ZGlyLCB0bXApKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5kaXIsICIvZGJ1c19ub25jZS0iKQorICAgICAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZub25jZWZpbGUtPmRpciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmFuZG9tU3RyKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL25vbmNlIikpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL2RidXNfbm9uY2UtIikKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyYW5kb21TdHIpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgfQorCisgICAgICB9CisKKyAgICBpZiAoIWdlbmVyYXRlX2FuZF93cml0ZV9ub25jZSAoJm5vbmNlZmlsZS0+cGF0aCwgZXJyb3IpKQorICAgICAgeworICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgIGlmICh1c2Vfc3ViZGlyKQorICAgICAgICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgTlVMTCk7IC8vd2UgaWdub3JlIHBvc3NpYmxlIGVycm9ycyBkZWxldGluZyB0aGUgZGlyIGFuZCByZXR1cm4gdGhlIHdyaXRlIGVycm9yIGluc3RlYWQKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmFuZG9tU3RyKTsKKworICAgIHJldHVybiBUUlVFOworICBvbl9lcnJvcjoKKyAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgTlVMTCk7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPmRpcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPnBhdGgpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmFuZG9tU3RyKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX1dJTgorLyoqCisgKiBjcmVhdGVzIGEgbm9uY2UgZmlsZSBpbiBhIHVzZXItcmVhZGFibGUgbG9jYXRpb24gYW5kIHdyaXRlcyBhIGdlbmVyYXRlZCBub25jZSB0byBpdAorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgcmV0dXJucyB0aGUgbm9uY2UgZmlsZSBsb2NhdGlvbgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgY3JlYXRpbmcgdGhlIG5vbmNlIGZpbGUgZmFpbHMKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIHJldHVybiBkb19ub25jZWZpbGVfY3JlYXRlIChub25jZWZpbGUsIGVycm9yLCAvKnVzZV9zdWJkaXI9Ki9GQUxTRSk7Cit9CisKKy8qKgorICogZGVsZXRlcyB0aGUgbm9uY2VmaWxlIGFuZCBmcmVlcyB0aGUgREJ1c05vbmNlRmlsZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSB0aGUgbm9uY2UgZmlsZSB0byBkZWxldGUuIENvbnRlbnRzIHdpbGwgYmUgZnJlZWQuCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiB0aGUgbm9uY2UgZmlsZSBjb3VsZCBub3QgYmUgZGVsZXRlZAorICogQHJldHVybiBUUlVFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfZGVsZXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgX2RidXNfZGVsZXRlX2ZpbGUgKCZub25jZWZpbGUtPnBhdGgsIGVycm9yKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+ZGlyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+cGF0aCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlCisvKioKKyAqIGNyZWF0ZXMgYSBub25jZSBmaWxlIGluIGEgdXNlci1yZWFkYWJsZSBsb2NhdGlvbiBhbmQgd3JpdGVzIGEgZ2VuZXJhdGVkIG5vbmNlIHRvIGl0LgorICogSW5pdGlhbGl6ZXMgdGhlIG5vbmNlZmlsZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSByZXR1cm5zIHRoZSBub25jZSBmaWxlIGxvY2F0aW9uCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiBjcmVhdGluZyB0aGUgbm9uY2UgZmlsZSBmYWlscworICogQHJldHVybiBUUlVFIGlmZiB0aGUgbm9uY2UgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9jcmVhdGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgcmV0dXJuIGRvX25vbmNlZmlsZV9jcmVhdGUgKG5vbmNlZmlsZSwgZXJyb3IsIC8qdXNlX3N1YmRpcj0qL1RSVUUpOworfQorCisvKioKKyAqIGRlbGV0ZXMgdGhlIG5vbmNlZmlsZSBhbmQgZnJlZXMgdGhlIERCdXNOb25jZUZpbGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgdGhlIG5vbmNlIGZpbGUgdG8gZGVsZXRlLiBDb250ZW50cyB3aWxsIGJlIGZyZWVkLgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgdGhlIG5vbmNlIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQKKyAqIEByZXR1cm4gVFJVRQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgZXJyb3IpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5kaXIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5wYXRoKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisKKy8qKgorICogcmV0dXJucyB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBub25jZSBmaWxlCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSBhbiBpbml0aWFsaXplZCBub25jZWZpbGUgb2JqZWN0CisgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBub25jZSBmaWxlCisgKi8KK2NvbnN0IERCdXNTdHJpbmcqCitfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSkKK3sKKyAgICBfZGJ1c19hc3NlcnQgKG5vbmNlZmlsZSk7CisgICAgcmV0dXJuICZub25jZWZpbGUtPnBhdGg7Cit9CisKKy8qKgorICogcmVhZHMgZGF0YSBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yIGFuZCBjaGVja3MgaWYgdGhlIHJlY2VpdmVkIGRhdGEgbWF0Y2hlcworICogdGhlIGRhdGEgaW4gdGhlIGdpdmVuIG5vbmNlZmlsZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byByZWFkIHRoZSBub25jZSBmcm9tCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZSBmaWxlIHRvIGNoZWNrIHRoZSByZWNlaXZlZCBkYXRhIGFnYWluc3QKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIG9uIGZhaWwKKyAqIEByZXR1cm4gVFJVRSBpZmYgYSBub25jZSBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgcmVhZCBmcm9tIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIGFuZCBtYXRjaGVzIHRoZSBub25jZSBmcm9tIHRoZSBnaXZlbiBub25jZSBmaWxlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfY2hlY2tfbm9uY2UgKERCdXNTb2NrZXQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yKiBlcnJvcikKK3sKKyAgICByZXR1cm4gZG9fY2hlY2tfbm9uY2UgKGZkLCBfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKG5vbmNlZmlsZSksIGVycm9yKTsKK30KKworCisvKiogQH0gZW5kIG9mIG5vbmNlICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbm9uY2UuaCBiL2RidXMvZGJ1cy1ub25jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzY2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbm9uY2UuaApAQCAtMCwwICsxLDczIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbm9uY2UuaCAgTm9uY2UgaGFuZGxpbmcgZnVuY3Rpb25zIHVzZWQgYnkgbm9uY2UtdGNwIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS2xhcmFsdmRhbGVucyBEYXRha29uc3VsdCBBQiwgYSBLREFCIEdyb3VwIGNvbXBhbnksIGluZm9Aa2RhYi5uZXQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX05PTkNFX0gKKyNkZWZpbmUgREJVU19OT05DRV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNOb25jZUZpbGUgREJ1c05vbmNlRmlsZTsKKworc3RydWN0IERCdXNOb25jZUZpbGUKK3sKKyAgREJ1c1N0cmluZyBwYXRoOworICBEQnVzU3RyaW5nIGRpcjsKK307CisKKy8vIHNlcnZlcgorCitkYnVzX2Jvb2xfdCBfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX25vbmNlZmlsZV9jaGVja19ub25jZSAoREJ1c1NvY2tldCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworY29uc3QgREJ1c1N0cmluZyogX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoIChjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUpOworCitEQnVzU29ja2V0IF9kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZShEQnVzU29ja2V0IGxpc3Rlbl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSk7CisKKy8vIHNoYXJlZAorCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX25vbmNlIChjb25zdCBEQnVzU3RyaW5nICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKm5vbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKKy8vIGNsaWVudAorCitkYnVzX2Jvb2xfdCBfZGJ1c19zZW5kX25vbmNlIChEQnVzU29ja2V0IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX05PTkNFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5jIGIvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhM2I3MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5jCkBAIC0wLDAgKzEsMjMzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW9iamVjdC10cmVlLmMgIERCdXNPYmplY3RUcmVlIChpbnRlcm5hbHMgb2YgREJ1c0Nvbm5lY3Rpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW9iamVjdC10cmVlLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c09iamVjdFRyZWUgQSBoaWVyYXJjaHkgb2Ygb2JqZWN0cyB3aXRoIGNvbnRhaW5lci1jb250YWluZWQgcmVsYXRpb25zaGlwCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNPYmplY3RUcmVlIGlzIHVzZWQgYnkgREJ1c0Nvbm5lY3Rpb24gdG8gdHJhY2sgdGhlIG9iamVjdCB0cmVlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNPYmplY3RUcmVlLiBUaGVzZQorICogYXJlIGFsbCBsaWJyYXJ5LWludGVybmFsLgorICoKKyAqIEB7CisgKi8KKworLyoqIFN1Ym5vZGUgb2YgdGhlIG9iamVjdCBoaWVyYXJjaHkgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNPYmplY3RTdWJ0cmVlIERCdXNPYmplY3RTdWJ0cmVlOworCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqIF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKTsKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSogX2RidXNfb2JqZWN0X3N1YnRyZWVfcmVmICAgKERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAqc3VidHJlZSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgKnN1YnRyZWUpOworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzT2JqZWN0VHJlZQorICovCitzdHJ1Y3QgREJ1c09iamVjdFRyZWUKK3sKKyAgaW50ICAgICAgICAgICAgICAgICByZWZjb3VudDsgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb247IC8qKjwgQ29ubmVjdGlvbiB0aGlzIHRyZWUgYmVsb25ncyB0byAqLworCisgIERCdXNPYmplY3RTdWJ0cmVlICAqcm9vdDsgICAgICAgLyoqPCBSb290IG9mIHRoZSB0cmVlICgiLyIgbm9kZSkgKi8KK307CisKKy8qKgorICogU3RydWN0IHJlcHJlc2VudGluZyBhIHNpbmdsZSByZWdpc3RlcmVkIHN1YnRyZWUgaGFuZGxlciwgb3Igbm9kZQorICogdGhhdCdzIGEgcGFyZW50IG9mIGEgcmVnaXN0ZXJlZCBzdWJ0cmVlIGhhbmRsZXIuIElmCisgKiBtZXNzYWdlX2Z1bmN0aW9uICE9IE5VTEwgdGhlcmUncyBhY3R1YWxseSBhIGhhbmRsZXIgYXQgdGhpcyBub2RlLgorICovCitzdHJ1Y3QgREJ1c09iamVjdFN1YnRyZWUKK3sKKyAgREJ1c0F0b21pYyAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb3VudDsgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgICAgICAgKnBhcmVudDsgICAgICAgICAgICAgIC8qKjwgUGFyZW50IG5vZGUgKi8KKyAgREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24gICB1bnJlZ2lzdGVyX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgb24gdW5yZWdpc3RlciAqLworICBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbiAgICAgIG1lc3NhZ2VfZnVuY3Rpb247ICAgIC8qKjwgRnVuY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhOyAgICAgICAgICAgLyoqPCBEYXRhIGZvciBmdW5jdGlvbnMgKi8KKyAgREJ1c09iamVjdFN1YnRyZWUgICAgICAgICAgICAgICAgKipzdWJ0cmVlczsgICAgICAgICAgICAvKio8IENoaWxkIG5vZGVzICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJ0cmVlczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hpbGQgbm9kZXMgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc3VidHJlZXM7ICAgICAgICAvKio8IE51bWJlciBvZiBhbGxvY2F0ZWQgZW50cmllcyBpbiBzdWJ0cmVlcyAqLworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgIGludm9rZV9hc19mYWxsYmFjayA6IDE7IC8qKjwgV2hldGhlciB0byBpbnZva2UgbWVzc2FnZV9mdW5jdGlvbiB3aGVuIGNoaWxkIG5vZGVzIGRvbid0IGhhbmRsZSB0aGUgbWVzc2FnZSAqLworICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMV07IC8qKjwgQWxsb2NhdGVkIGFzIGxhcmdlIGFzIG5lY2Vzc2FyeSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0cmVlLCByZXByZXNlbnRpbmcgYSBtYXBwaW5nIGZyb20gcGF0aHMKKyAqIHRvIGhhbmRsZXIgdnRhYmxlcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB0aGlzIHRyZWUgYmVsb25ncyB0bworICogQHJldHVybnMgdGhlIG5ldyB0cmVlIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzT2JqZWN0VHJlZSoKK19kYnVzX29iamVjdF90cmVlX25ldyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNPYmplY3RUcmVlICp0cmVlOworCisgIC8qIHRoZSBjb25uZWN0aW9uIHBhc3NlZCBpbiBoZXJlIGlzbid0IGZ1bGx5IGNvbnN0cnVjdGVkLAorICAgKiBzbyBkb24ndCBkbyBhbnl0aGluZyBtb3JlIHRoYW4gc3RvcmUgYSBwb2ludGVyIHRvCisgICAqIGl0CisgICAqLworCisgIHRyZWUgPSBkYnVzX25ldzAgKERCdXNPYmplY3RUcmVlLCAxKTsKKyAgaWYgKHRyZWUgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB0cmVlLT5yZWZjb3VudCA9IDE7CisgIHRyZWUtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICB0cmVlLT5yb290ID0gX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3ICgiLyIsIE5VTEwsIE5VTEwpOworICBpZiAodHJlZS0+cm9vdCA9PSBOVUxMKQorICAgIGdvdG8gb29tOworICB0cmVlLT5yb290LT5pbnZva2VfYXNfZmFsbGJhY2sgPSBUUlVFOworICAKKyAgcmV0dXJuIHRyZWU7CisKKyBvb206CisgIGlmICh0cmVlKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodHJlZSk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqIEByZXR1cm5zIHRoZSBvYmplY3QgdHJlZQorICovCitEQnVzT2JqZWN0VHJlZSAqCitfZGJ1c19vYmplY3RfdHJlZV9yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBfZGJ1c19hc3NlcnQgKHRyZWUtPnJlZmNvdW50ID4gMCk7CisKKyAgdHJlZS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gdHJlZTsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudAorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKi8KK3ZvaWQKK19kYnVzX29iamVjdF90cmVlX3VucmVmIChEQnVzT2JqZWN0VHJlZSAqdHJlZSkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmVlLT5yZWZjb3VudCA+IDApOworCisgIHRyZWUtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHRyZWUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKHRyZWUpOworCisgICAgICBkYnVzX2ZyZWUgKHRyZWUpOworICAgIH0KK30KKworLyoqIFNldCB0byAxIHRvIGdldCBhIGJ1bmNoIG9mIGRlYnVnIHNwZXcgYWJvdXQgZmluZGluZyB0aGUKKyAqIHN1YnRyZWUgbm9kZXMKKyAqLworI2RlZmluZSBWRVJCT1NFX0ZJTkQgMAorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitmaW5kX3N1YnRyZWVfcmVjdXJzZSAoREJ1c09iamVjdFN1YnRyZWUgICpzdWJ0cmVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICppbmRleF9pbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICpleGFjdF9tYXRjaCkKK3sKKyAgaW50IGksIGo7CisgIGRidXNfYm9vbF90IHJldHVybl9kZWVwZXN0X21hdGNoOworCisgIHJldHVybl9kZWVwZXN0X21hdGNoID0gZXhhY3RfbWF0Y2ggIT0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKCEocmV0dXJuX2RlZXBlc3RfbWF0Y2ggJiYgY3JlYXRlX2lmX25vdF9mb3VuZCkpOworCisgIGlmIChwYXRoWzBdID09IE5VTEwpCisgICAgeworI2lmIFZFUkJPU0VfRklORAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgcGF0aCBleGhhdXN0ZWQsIHJldHVybmluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUpOworI2VuZGlmCisgICAgICBpZiAoZXhhY3RfbWF0Y2ggIT0gTlVMTCkKKwkqZXhhY3RfbWF0Y2ggPSBUUlVFOworICAgICAgcmV0dXJuIHN1YnRyZWU7CisgICAgfQorCisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCIgIHNlYXJjaGluZyBjaGlsZHJlbiBvZiAlcyBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIHBhdGhbMF0pOworI2VuZGlmCisgIAorICBpID0gMDsKKyAgaiA9IHN1YnRyZWUtPm5fc3VidHJlZXM7CisgIHdoaWxlIChpIDwgaikKKyAgICB7CisgICAgICBpbnQgaywgdjsKKworICAgICAgayA9IChpICsgaikgLyAyOworICAgICAgdiA9IHN0cmNtcCAocGF0aFswXSwgc3VidHJlZS0+c3VidHJlZXNba10tPm5hbWUpOworCisjaWYgVkVSQk9TRV9GSU5ECisgICAgICBfZGJ1c192ZXJib3NlICgiICAlcyBjbXAgJXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhbMF0sIHN1YnRyZWUtPnN1YnRyZWVzW2tdLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdik7CisjZW5kaWYKKyAgICAgIAorICAgICAgaWYgKHYgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpbmRleF9pbl9wYXJlbnQpCisgICAgICAgICAgICB7CisjaWYgVkVSQk9TRV9GSU5ECisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHN0b3JpbmcgcGFyZW50IGluZGV4ICVkXG4iLCBrKTsKKyNlbmRpZgorICAgICAgICAgICAgICAqaW5kZXhfaW5fcGFyZW50ID0gazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZXR1cm5fZGVlcGVzdF9tYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKm5leHQ7CisKKyAgICAgICAgICAgICAgbmV4dCA9IGZpbmRfc3VidHJlZV9yZWN1cnNlIChzdWJ0cmVlLT5zdWJ0cmVlc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFsxXSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfaW5fcGFyZW50LCBleGFjdF9tYXRjaCk7CisgICAgICAgICAgICAgIGlmIChuZXh0ID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjaykKKyAgICAgICAgICAgICAgICB7CisjaWYgVkVSQk9TRV9GSU5ECisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBubyBkZWVwZXIgbWF0Y2ggZm91bmQsIHJldHVybmluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUpOworI2VuZGlmCisJCSAgaWYgKGV4YWN0X21hdGNoICE9IE5VTEwpCisJCSAgICAqZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0cmVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmaW5kX3N1YnRyZWVfcmVjdXJzZSAoc3VidHJlZS0+c3VidHJlZXNba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoWzFdLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfaW5fcGFyZW50LCBleGFjdF9tYXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHYgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaiA9IGs7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGkgPSBrICsgMTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiICBubyBtYXRjaCBmb3VuZCwgY3VycmVudCB0cmVlICVzLCBjcmVhdGVfaWZfbm90X2ZvdW5kID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIGNyZWF0ZV9pZl9ub3RfZm91bmQpOworI2VuZGlmCisgIAorICBpZiAoY3JlYXRlX2lmX25vdF9mb3VuZCkKKyAgICB7CisgICAgICBEQnVzT2JqZWN0U3VidHJlZSogY2hpbGQ7CisgICAgICBpbnQgY2hpbGRfcG9zLCBuZXdfbl9zdWJ0cmVlczsKKworI2lmIFZFUkJPU0VfRklORAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRpbmcgc3VidHJlZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhbMF0pOworI2VuZGlmCisgICAgICAKKyAgICAgIGNoaWxkID0gX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3IChwYXRoWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGNoaWxkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBuZXdfbl9zdWJ0cmVlcyA9IHN1YnRyZWUtPm5fc3VidHJlZXMgKyAxOworICAgICAgaWYgKG5ld19uX3N1YnRyZWVzID4gc3VidHJlZS0+bWF4X3N1YnRyZWVzKQorICAgICAgICB7CisgICAgICAgICAgaW50IG5ld19tYXhfc3VidHJlZXM7CisgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKipuZXdfc3VidHJlZXM7CisKKyAgICAgICAgICBuZXdfbWF4X3N1YnRyZWVzID0gc3VidHJlZS0+bWF4X3N1YnRyZWVzID09IDAgPyAxIDogMiAqIHN1YnRyZWUtPm1heF9zdWJ0cmVlczsKKyAgICAgICAgICBuZXdfc3VidHJlZXMgPSBkYnVzX3JlYWxsb2MgKHN1YnRyZWUtPnN1YnRyZWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21heF9zdWJ0cmVlcyAqIHNpemVvZiAoREJ1c09iamVjdFN1YnRyZWUqKSk7CisgICAgICAgICAgaWYgKG5ld19zdWJ0cmVlcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoY2hpbGQpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBzdWJ0cmVlLT5zdWJ0cmVlcyA9IG5ld19zdWJ0cmVlczsKKyAgICAgICAgICBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPSBuZXdfbWF4X3N1YnRyZWVzOworICAgICAgICB9CisKKyAgICAgIC8qIFRoZSBiaW5hcnkgc2VhcmNoIGZhaWxlZCwgc28gaSA9PSBqIHBvaW50cyB0byB0aGUgCisgICAgICAgICBwbGFjZSB0aGUgY2hpbGQgc2hvdWxkIGJlIGluc2VydGVkLiAqLworICAgICAgY2hpbGRfcG9zID0gaTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY2hpbGRfcG9zIDwgbmV3X25fc3VidHJlZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgbmV3X25fc3VidHJlZXMgPD0gc3VidHJlZS0+bWF4X3N1YnRyZWVzKTsKKyAgICAgIGlmIChjaGlsZF9wb3MgKyAxIDwgbmV3X25fc3VidHJlZXMpCisJeworCSAgbWVtbW92ZSAoJnN1YnRyZWUtPnN1YnRyZWVzW2NoaWxkX3BvcysxXSwgCisJCSAgICZzdWJ0cmVlLT5zdWJ0cmVlc1tjaGlsZF9wb3NdLCAKKwkJICAgKG5ld19uX3N1YnRyZWVzIC0gY2hpbGRfcG9zIC0gMSkgKiAKKwkJICAgc2l6ZW9mIHN1YnRyZWUtPnN1YnRyZWVzWzBdKTsKKwl9CisgICAgICBzdWJ0cmVlLT5zdWJ0cmVlc1tjaGlsZF9wb3NdID0gY2hpbGQ7CisKKyAgICAgIGlmIChpbmRleF9pbl9wYXJlbnQpCisgICAgICAgICppbmRleF9pbl9wYXJlbnQgPSBjaGlsZF9wb3M7CisgICAgICBzdWJ0cmVlLT5uX3N1YnRyZWVzID0gbmV3X25fc3VidHJlZXM7CisgICAgICBjaGlsZC0+cGFyZW50ID0gc3VidHJlZTsKKworICAgICAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhbMV0sIGNyZWF0ZV9pZl9ub3RfZm91bmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9pbl9wYXJlbnQsIGV4YWN0X21hdGNoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXhhY3RfbWF0Y2ggIT0gTlVMTCkKKwkqZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgIHJldHVybiAocmV0dXJuX2RlZXBlc3RfbWF0Y2ggJiYgc3VidHJlZS0+aW52b2tlX2FzX2ZhbGxiYWNrKSA/IHN1YnRyZWUgOiBOVUxMOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitmaW5kX3N1YnRyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKmluZGV4X2luX3BhcmVudCkKK3sKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgZm9yIGV4YWN0IHJlZ2lzdGVyZWQgc3VidHJlZVxuIik7CisjZW5kaWYKKyAgCisgIHN1YnRyZWUgPSBmaW5kX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+cm9vdCwgcGF0aCwgRkFMU0UsIGluZGV4X2luX3BhcmVudCwgTlVMTCk7CisKKyAgaWYgKHN1YnRyZWUgJiYgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIHN1YnRyZWU7Cit9CisjZW5kaWYKKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorbG9va3VwX3N1YnRyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBmb3Igc3VidHJlZVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfaGFuZGxlciAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAqZXhhY3RfbWF0Y2gpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBkZWVwZXN0IGhhbmRsZXJcbiIpOworI2VuZGlmCisgIF9kYnVzX2Fzc2VydCAoZXhhY3RfbWF0Y2ggIT0gTlVMTCk7CisKKyAgKmV4YWN0X21hdGNoID0gRkFMU0U7IC8qIGVuc3VyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgCisgIHJldHVybiBmaW5kX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+cm9vdCwgcGF0aCwgRkFMU0UsIE5VTEwsIGV4YWN0X21hdGNoKTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZW5zdXJlX3N1YnRyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiRW5zdXJpbmcgc3VidHJlZVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBUUlVFLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNoYXIgKmZsYXR0ZW5fcGF0aCAoY29uc3QgY2hhciAqKnBhdGgpOworCisvKioKKyAqIFJlZ2lzdGVycyBhIG5ldyBzdWJ0cmVlIGluIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUuCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIGZhbGxiYWNrICNUUlVFIHRvIGhhbmRsZSBtZXNzYWdlcyB0byBjaGlsZHJlbiBvZiB0aGlzIHBhdGgKKyAqIEBwYXJhbSBwYXRoIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwYXRoIGVsZW1lbnRzIGdpdmluZyBwYXRoIHRvIHN1YnRyZWUKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZ0YWJsZSB1c2VkIHRvIHRyYXZlcnNlIHRoaXMgc3VidHJlZQorICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgdG8gcGFzcyB0byBtZXRob2RzIGluIHRoZSB2dGFibGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZAorICogQHJldHVybnMgI0ZBTFNFIGlmIGFuIGVycm9yICgjREJVU19FUlJPUl9OT19NRU1PUlkgb3IKKyAqICAgICNEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgaXMgcmVwb3J0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c09iamVjdFN1YnRyZWUgICpzdWJ0cmVlOworCisgIF9kYnVzX2Fzc2VydCAodHJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh2dGFibGUtPm1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocGF0aCAhPSBOVUxMKTsKKworICBzdWJ0cmVlID0gZW5zdXJlX3N1YnRyZWUgKHRyZWUsIHBhdGgpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmNvbXBsZXRlX3BhdGggPSBmbGF0dGVuX3BhdGggKHBhdGgpOworCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgaGFuZGxlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVfcGF0aCA/IGNvbXBsZXRlX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIoY2Fubm90IHJlcHJlc2VudCBwYXRoOiBvdXQgb2YgbWVtb3J5ISkiKTsKKworICAgICAgICAgIGRidXNfZnJlZSAoY29tcGxldGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gdnRhYmxlLT5tZXNzYWdlX2Z1bmN0aW9uOworICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gdnRhYmxlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uOworICBzdWJ0cmVlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjayA9IGZhbGxiYWNrICE9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEF0dGVtcHRzIHRvIHVucmVnaXN0ZXIgdGhlIGdpdmVuIHN1YnRyZWUuICBJZiB0aGUgc3VidHJlZSBpcyByZWdpc3RlcmVkLAorICogc3RvcmVzIGl0cyB1bnJlZ2lzdGVyIGZ1bmN0aW9uIGFuZCB1c2VyIGRhdGEgZm9yIGxhdGVyIHVzZSBhbmQgcmV0dXJucworICogI1RSVUUuICBJZiBzdWJ0cmVlIGlzIG5vdCByZWdpc3RlcmVkLCBzaW1wbHkgcmV0dXJucyAjRkFMU0UuICBEb2VzIG5vdCBmcmVlCisgKiBzdWJ0cmVlIG9yIHJlbW92ZSBpdCBmcm9tIHRoZSBvYmplY3QgdHJlZS4KKyAqCisgKiBAcGFyYW0gc3VidHJlZSB0aGUgc3VidHJlZSB0byB1bnJlZ2lzdGVyCisgKiBAcGFyYW0gdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQgc3RvcmVzIHN1YnRyZWUncyB1bnJlZ2lzdGVyX2Z1bmN0aW9uCisgKiBAcGFyYW0gdXNlcl9kYXRhX291dCBzdG9yZXMgc3VidHJlZSdzIHVzZXJfZGF0YQorICogQHJldHVybiAjRkFMU0UgaWYgdGhlIHN1YnRyZWUgd2FzIG5vdCByZWdpc3RlcmVkLCAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5yZWdpc3Rlcl9zdWJ0cmVlIChEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgICAgICAgKnN1YnRyZWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uICAqdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXNlcl9kYXRhX291dCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzdWJ0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHVucmVnaXN0ZXJfZnVuY3Rpb25fb3V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHVzZXJfZGF0YV9vdXQgIT0gTlVMTCk7CisKKyAgLyogQ29uZmlybSBzdWJ0cmVlIGlzIHJlZ2lzdGVyZWQgKi8KKyAgaWYgKHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID0gTlVMTDsKKworICAgICAgKnVucmVnaXN0ZXJfZnVuY3Rpb25fb3V0ID0gc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbjsKKyAgICAgICp1c2VyX2RhdGFfb3V0ID0gc3VidHJlZS0+dXNlcl9kYXRhOworCisgICAgICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgICAgIHN1YnRyZWUtPnVzZXJfZGF0YSA9IE5VTEw7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFzc2VydCB0aGF0IHRoaXMgdW5yZWdpc3RlcmVkIHN1YnRyZWUgaXMgZWl0aGVyIHRoZSByb290IG5vZGUgb3IgaGFzCisgICAgICAgICBjaGlsZHJlbiwgb3RoZXJ3aXNlIHdlIGhhdmUgYSBkYW5nbGluZyBwYXRoIHdoaWNoIHNob3VsZCBuZXZlcgorICAgICAgICAgaGFwcGVuICovCisgICAgICBfZGJ1c19hc3NlcnQgKHN1YnRyZWUtPnBhcmVudCA9PSBOVUxMIHx8IHN1YnRyZWUtPm5fc3VidHJlZXMgPiAwKTsKKworICAgICAgLyogVGhlIHN1YnRyZWUgaXMgbm90IHJlZ2lzdGVyZWQgKi8KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKgorICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgY2hpbGQgc3VidHJlZSBmcm9tIGl0cyBwYXJlbnQuICBJZiByZW1vdmFsIGlzCisgKiBzdWNjZXNzZnVsLCBhbHNvIGZyZWVzIHRoZSBjaGlsZC4gIFJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFCisgKiBvdGhlcndpc2UuICBBICNGQUxTRSByZXR1cm4gdmFsdWUgdGVsbHMgdW5yZWdpc3Rlcl9hbmRfZnJlZV9wYXRoX3JlY3Vyc2UgdG8KKyAqIHN0b3AgYXR0ZW1wdGluZyB0byByZW1vdmUgYW5jZXN0b3JzLCBpLmUuLCB0aGF0IG5vIGFuY2VzdG9ycyBvZiB0aGUKKyAqIHNwZWNpZmllZCBjaGlsZCBhcmUgZWxpZ2libGUgZm9yIHJlbW92YWwuCisgKgorICogQHBhcmFtIHBhcmVudCBwYXJlbnQgZnJvbSB3aGljaCB0byByZW1vdmUgY2hpbGQKKyAqIEBwYXJhbSBjaGlsZF9pbmRleCBwYXJlbnQtPnN1YnRyZWVzIGluZGV4IG9mIGNoaWxkIHRvIHJlbW92ZQorICogQHJldHVybiAjVFJVRSBpZiByZW1vdmFsIGFuZCBmcmVlIHN1Y2NlZWQsICNGQUxTRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGRidXNfYm9vbF90CithdHRlbXB0X2NoaWxkX3JlbW92YWwgKERCdXNPYmplY3RTdWJ0cmVlICAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hpbGRfaW5kZXgpCit7CisgIC8qIENhbmRpZGF0ZSBmb3IgcmVtb3ZhbCAqLworICBEQnVzT2JqZWN0U3VidHJlZSogY2FuZGlkYXRlOworCisgIF9kYnVzX2Fzc2VydCAocGFyZW50ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNoaWxkX2luZGV4ID49IDAgJiYgY2hpbGRfaW5kZXggPCBwYXJlbnQtPm5fc3VidHJlZXMpOworCisgIGNhbmRpZGF0ZSA9IHBhcmVudC0+c3VidHJlZXNbY2hpbGRfaW5kZXhdOworICBfZGJ1c19hc3NlcnQgKGNhbmRpZGF0ZSAhPSBOVUxMKTsKKworICBpZiAoY2FuZGlkYXRlLT5uX3N1YnRyZWVzID09IDAgJiYgY2FuZGlkYXRlLT5tZXNzYWdlX2Z1bmN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhlIGNhbmRpZGF0ZSBub2RlIGlzIGNoaWxkbGVzcyBhbmQgaXMgbm90IGEgcmVnaXN0ZXJlZAorICAgICAgICAgcGF0aCwgc28uLi4gKi8KKworICAgICAgLyogLi4uIHJlbW92ZSBpdCBmcm9tIGl0cyBwYXJlbnQuLi4gKi8KKyAgICAgIC8qIEFzc3VtZXMgYSAwLWJ5dGUgbWVtbW92ZSBpcyBPSyAqLworICAgICAgbWVtbW92ZSAoJnBhcmVudC0+c3VidHJlZXNbY2hpbGRfaW5kZXhdLAorICAgICAgICAgICAgICAgJnBhcmVudC0+c3VidHJlZXNbY2hpbGRfaW5kZXggKyAxXSwKKyAgICAgICAgICAgICAgIChwYXJlbnQtPm5fc3VidHJlZXMgLSBjaGlsZF9pbmRleCAtIDEpCisgICAgICAgICAgICAgICAqIHNpemVvZiAocGFyZW50LT5zdWJ0cmVlc1swXSkpOworICAgICAgcGFyZW50LT5uX3N1YnRyZWVzIC09IDE7CisKKyAgICAgIC8qIC4uLiBhbmQgZnJlZSBpdCAqLworICAgICAgY2FuZGlkYXRlLT5wYXJlbnQgPSBOVUxMOworICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKGNhbmRpZGF0ZSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlYXJjaGVzIHRoZSBvYmplY3QgdHJlZSBmb3IgYSByZWdpc3RlcmVkIHN1YnRyZWUgbm9kZSBhdCB0aGUgZ2l2ZW4gcGF0aC4KKyAqIElmIGEgcmVnaXN0ZXJlZCBub2RlIGlzIGZvdW5kLCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUgYW5kIGZyZWVkLCBhbmQKKyAqIFRSVUUgaXMgcmV0dXJuZWQuICBJZiBhIHJlZ2lzdGVyZWQgc3VidHJlZSBub2RlIGlzIG5vdCBmb3VuZCBhdCB0aGUgZ2l2ZW4KKyAqIHBhdGgsIHRoZSB0cmVlIGlzIG5vdCBtb2RpZmllZCBhbmQgRkFMU0UgaXMgcmV0dXJuZWQuCisgKgorICogVGhlIGZvdW5kIG5vZGUncyB1bnJlZ2lzdGVyX2Z1bmN0aW9uIGFuZCB1c2VyX2RhdGEgYXJlIHJldHVybmVkIGluIHRoZQorICogY29ycmVzcG9uZGluZyBfb3V0IGFyZ3VtZW50cy4gIFRoZSBjYWxsZXIgc2hvdWxkIGRlZmluZSB0aGVzZSB2YXJpYWJsZXMgYW5kCisgKiBwYXNzIHRoZWlyIGFkZHJlc3NlcyBhcyBhcmd1bWVudHMuCisgKgorICogTGlrZXdpc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGRlZmluZSBhbmQgc2V0IHRvIFRSVUUgYSBib29sZWFuIHZhcmlhYmxlLCB0aGVuCisgKiBwYXNzIGl0cyBhZGRyZXNzIGFzIHRoZSBjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzIGFyZ3VtZW50LgorICoKKyAqIE9uY2UgYSBtYXRjaGluZyByZWdpc3RlcmVkIG5vZGUgaXMgZm91bmQsIHJlbW92ZWQgYW5kIGZyZWVkLCB0aGUgcmVjdXJzaXZlCisgKiByZXR1cm4gcGF0aCBpcyB0cmF2ZXJzZWQuICBBbG9uZyB0aGUgd2F5LCBlbGlnaWJsZSBhbmNlc3RvciBub2RlcyBhcmUKKyAqIHJlbW92ZWQgYW5kIGZyZWVkLiAgQW4gYW5jZXN0b3Igbm9kZSBpcyBlbGlnaWJsZSBmb3IgcmVtb3ZhbCBpZiBhbmQgb25seSBpZgorICogMSkgaXQgaGFzIG5vIGNoaWxkcmVuLCBpLmUuLCBpdCBoYXMgYmVjb21lIGNoaWxkbGVzcyBhbmQgMikgaXQgaXMgbm90IGl0c2VsZgorICogYSByZWdpc3RlcmVkIGhhbmRsZXIuCisgKgorICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgL0EvQiBhbmQgL0EvQyBhcmUgcmVnaXN0ZXJlZCBwYXRocywgYW5kIHRoYXQgdGhlc2UgYXJlCisgKiB0aGUgb25seSBwYXRocyBpbiB0aGUgdHJlZS4gIElmIEIgaXMgcmVtb3ZlZCBhbmQgZnJlZWQsIEMgaXMgc3RpbGwgcmVhY2hhYmxlCisgKiB0aHJvdWdoIEEsIHNvIEEgY2Fubm90IGJlIHJlbW92ZWQgYW5kIGZyZWVkLiAgSWYgQyBpcyBzdWJzZXF1ZW50bHkgcmVtb3ZlZAorICogYW5kIGZyZWVkLCB0aGVuIEEgYmVjb21lcyBhIGNoaWxkbGVzcyBub2RlIGFuZCBpdCBiZWNvbWVzIGVsaWdpYmxlIGZvcgorICogcmVtb3ZhbCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhbmQgZnJlZWQuCisgKgorICogU2ltaWxhcmx5LCBzdXBwb3NlIC9BIGlzIGEgcmVnaXN0ZXJlZCBwYXRoLCBhbmQgL0EvQiBpcyBhbHNvIGEgcmVnaXN0ZXJlZAorICogcGF0aCwgYW5kIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHBhdGhzIGluIHRoZSB0cmVlLiAgSWYgQiBpcyByZW1vdmVkIGFuZAorICogZnJlZWQsIHRoZW4gZXZlbiB0aG91Z2ggQSBoYXMgYmVjb21lIGNoaWxkbGVzcywgaXQgY2FuJ3QgYmUgZnJlZWQgYmVjYXVzZSBpdAorICogcmVmZXJzIHRvIGEgcGF0aCB0aGF0IGlzIHN0aWxsIHJlZ2lzdGVyZWQuCisgKgorICogQHBhcmFtIHN1YnRyZWUgc3VidHJlZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHRoZSBzZWFyY2gsIHJvb3QgZm9yIGluaXRpYWwgY2FsbAorICogQHBhcmFtIHBhdGggcGF0aCB0byBzdWJ0cmVlIChzYW1lIGFzIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jaykKKyAqIEBwYXJhbSBjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzIHBvaW50ZXIgdG8gYSBib29sLCAjVFJVRSBmb3IgaW5pdGlhbCBjYWxsCisgKiBAcGFyYW0gdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQgcmV0dXJucyB0aGUgZm91bmQgbm9kZSdzIHVucmVnaXN0ZXJfZnVuY3Rpb24KKyAqIEBwYXJhbSB1c2VyX2RhdGFfb3V0IHJldHVybnMgdGhlIGZvdW5kIG5vZGUncyB1c2VyX2RhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgcmVnaXN0ZXJlZCBub2RlIHdhcyBmb3VuZCBhdCBwYXRoLCAjRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5yZWdpc3Rlcl9hbmRfZnJlZV9wYXRoX3JlY3Vyc2UKKyhEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgICAgICAgKnN1YnRyZWUsCisgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKipwYXRoLAorIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICAgICAgICAqY29udGludWVfcmVtb3ZhbF9hdHRlbXB0cywKKyBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbiAgKnVucmVnaXN0ZXJfZnVuY3Rpb25fb3V0LAorIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXNlcl9kYXRhX291dCkKK3sKKyAgaW50IGksIGo7CisKKyAgX2RidXNfYXNzZXJ0IChjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCpjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzKTsKKyAgX2RidXNfYXNzZXJ0ICh1bnJlZ2lzdGVyX2Z1bmN0aW9uX291dCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh1c2VyX2RhdGFfb3V0ICE9IE5VTEwpOworCisgIGlmIChwYXRoWzBdID09IE5VTEwpCisgICAgcmV0dXJuIHVucmVnaXN0ZXJfc3VidHJlZSAoc3VidHJlZSwgdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQsIHVzZXJfZGF0YV9vdXQpOworCisgIGkgPSAwOworICBqID0gc3VidHJlZS0+bl9zdWJ0cmVlczsKKyAgd2hpbGUgKGkgPCBqKQorICAgIHsKKyAgICAgIGludCBrLCB2OworCisgICAgICBrID0gKGkgKyBqKSAvIDI7CisgICAgICB2ID0gc3RyY21wIChwYXRoWzBdLCBzdWJ0cmVlLT5zdWJ0cmVlc1trXS0+bmFtZSk7CisKKyAgICAgIGlmICh2ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBmcmVlZDsKKyAgICAgICAgICBmcmVlZCA9IHVucmVnaXN0ZXJfYW5kX2ZyZWVfcGF0aF9yZWN1cnNlIChzdWJ0cmVlLT5zdWJ0cmVlc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfZnVuY3Rpb25fb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YV9vdXQpOworICAgICAgICAgIGlmIChmcmVlZCAmJiAqY29udGludWVfcmVtb3ZhbF9hdHRlbXB0cykKKyAgICAgICAgICAgICpjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzID0gYXR0ZW1wdF9jaGlsZF9yZW1vdmFsIChzdWJ0cmVlLCBrKTsKKyAgICAgICAgICByZXR1cm4gZnJlZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHYgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaiA9IGs7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGkgPSBrICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFVucmVnaXN0ZXJzIGFuIG9iamVjdCBzdWJ0cmVlIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAqIHNhbWUgcGF0aC4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgZ2xvYmFsIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHRoZSBzdWJ0cmVlIChzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIHRvIF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyKCkpCisgKi8KK3ZvaWQKK19kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKipwYXRoKQoreworICBkYnVzX2Jvb2xfdCBmb3VuZF9zdWJ0cmVlOworICBkYnVzX2Jvb2xfdCBjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzOworICBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbiB1bnJlZ2lzdGVyX2Z1bmN0aW9uOworICB2b2lkICp1c2VyX2RhdGE7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIF9kYnVzX2Fzc2VydCAodHJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworCisgIGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMgPSBUUlVFOworICB1bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgdXNlcl9kYXRhID0gTlVMTDsKKworICBmb3VuZF9zdWJ0cmVlID0gdW5yZWdpc3Rlcl9hbmRfZnJlZV9wYXRoX3JlY3Vyc2UgKHRyZWUtPnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGludWVfcmVtb3ZhbF9hdHRlbXB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5yZWdpc3Rlcl9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcl9kYXRhKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChmb3VuZF9zdWJ0cmVlID09IEZBTFNFKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJBdHRlbXB0ZWQgdG8gdW5yZWdpc3RlciBwYXRoIChwYXRoWzBdID0gJXMgcGF0aFsxXSA9ICVzKSB3aGljaCBpc24ndCByZWdpc3RlcmVkXG4iLAorICAgICAgICAgICAgICAgICAgcGF0aFswXSA/IHBhdGhbMF0gOiAibnVsbCIsCisgICAgICAgICAgICAgICAgICAocGF0aFswXSAmJiBwYXRoWzFdKSA/IHBhdGhbMV0gOiAibnVsbCIpOworICAgICAgZ290byB1bmxvY2s7ICAgIAorICAgIH0KKyNlbHNlCisgIF9kYnVzX2Fzc2VydCAoZm91bmRfc3VidHJlZSA9PSBUUlVFKTsKKyNlbmRpZgorCit1bmxvY2s6CisgIGNvbm5lY3Rpb24gPSB0cmVlLT5jb25uZWN0aW9uOworCisgIC8qIFVubG9jayBhbmQgY2FsbCBhcHBsaWNhdGlvbiBjb2RlICovCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKGNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKHVucmVnaXN0ZXJfZnVuY3Rpb24pCisgICAgKCogdW5yZWdpc3Rlcl9mdW5jdGlvbikgKGNvbm5lY3Rpb24sIHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAoY29ubmVjdGlvbikKKyNlbmRpZgorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3N1YnRyZWVfcmVjdXJzZSAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisgIC8qIERlbGV0ZSB0aGVtIGZyb20gdGhlIGVuZCwgZm9yIHNsaWdodGx5CisgICAqIG1vcmUgcm9idXN0bmVzcyBhZ2FpbnN0IG9kZCByZWVudHJhbmN5LgorICAgKi8KKyAgd2hpbGUgKHN1YnRyZWUtPm5fc3VidHJlZXMgPiAwKQorICAgIHsKKyAgICAgIERCdXNPYmplY3RTdWJ0cmVlICpjaGlsZDsKKworICAgICAgY2hpbGQgPSBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV07CisgICAgICBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV0gPSBOVUxMOworICAgICAgc3VidHJlZS0+bl9zdWJ0cmVlcyAtPSAxOworICAgICAgY2hpbGQtPnBhcmVudCA9IE5VTEw7CisKKyAgICAgIGZyZWVfc3VidHJlZV9yZWN1cnNlIChjb25uZWN0aW9uLCBjaGlsZCk7CisgICAgfQorCisgIC8qIENhbGwgYXBwbGljYXRpb24gY29kZSAqLworICBpZiAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbikKKyAgICAoKiBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKwkJCQkgICAgICBzdWJ0cmVlLT51c2VyX2RhdGEpOworCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgc3VidHJlZS0+dXNlcl9kYXRhID0gTlVMTDsKKworICAvKiBOb3cgZnJlZSBvdXJzZWx2ZXMgKi8KKyAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKHN1YnRyZWUpOworfQorCisvKioKKyAqIEZyZWUgYWxsIHRoZSBoYW5kbGVycyBpbiB0aGUgdHJlZS4gTG9jayBvbiB0cmVlJ3MgY29ubmVjdGlvbgorICogbXVzdCBub3QgYmUgaGVsZC4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBpZiAodHJlZS0+cm9vdCkKKyAgICBmcmVlX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS0+cm9vdCk7CisgIHRyZWUtPnJvb3QgPSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpCit7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICBjaGFyICoqcmV0dmFsOworICAKKyAgX2RidXNfYXNzZXJ0IChwYXJlbnRfcGF0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjaGlsZF9lbnRyaWVzICE9IE5VTEwpOworCisgICpjaGlsZF9lbnRyaWVzID0gTlVMTDsKKyAgCisgIHN1YnRyZWUgPSBsb29rdXBfc3VidHJlZSAodHJlZSwgcGFyZW50X3BhdGgpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciAqLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciosIHN1YnRyZWUtPm5fc3VidHJlZXMgKyAxKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgc3VidHJlZS0+bl9zdWJ0cmVlcykKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoc3VidHJlZS0+c3VidHJlZXNbaV0tPm5hbWUpOworICAgICAgICAgIGlmIChyZXR2YWxbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAocmV0dmFsKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICAgIAorICAqY2hpbGRfZW50cmllcyA9IHJldHZhbDsKKyAgcmV0dXJuIHJldHZhbCAhPSBOVUxMOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9kZWZhdWx0X2ludHJvc3BlY3RfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICoqcGF0aCkKK3sKKyAgREJ1c1N0cmluZyB4bWw7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgY2hhciAqKmNoaWxkcmVuOworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRidXNfYm9vbF90IGFscmVhZHlfdW5sb2NrZWQ7CisKKyAgLyogV2UgaGF2ZSB0aGUgY29ubmVjdGlvbiBsb2NrIGhlcmUgKi8KKworICBhbHJlYWR5X3VubG9ja2VkID0gRkFMU0U7CisgIAorICBfZGJ1c192ZXJib3NlICgiIGNvbnNpZGVyaW5nIGRlZmF1bHQgSW50cm9zcGVjdCgpIGhhbmRsZXIuLi5cbiIpOworCisgIHJlcGx5ID0gTlVMTDsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpKQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIgdXNpbmcgZGVmYXVsdCBJbnRyb3NwZWN0KCkgaGFuZGxlciFcbiIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnhtbCkpCisgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgIH0KKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworCisgIGNoaWxkcmVuID0gTlVMTDsKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGgsICZjaGlsZHJlbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmeG1sLCBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9ET0NUWVBFX0RFQ0xfTk9ERSkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8bm9kZT5cbiIpKQorICAgIGdvdG8gb3V0OworCisgIGkgPSAwOworICB3aGlsZSAoY2hpbGRyZW5baV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmeG1sLCAiICA8bm9kZSBuYW1lPVwiJXNcIi8+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0pKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8L25vZGU+XG4iKSkKKyAgICBnb3RvIG91dDsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnhtbCk7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HKSkKKyAgICBnb3RvIG91dDsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBhbHJlYWR5X3VubG9ja2VkID0gVFJVRTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgIAorIG91dDoKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghYWxyZWFkeV91bmxvY2tlZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmeG1sKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRyZW4pOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFRyaWVzIHRvIGRpc3BhdGNoIGEgbWVzc2FnZSBieSBkaXJlY3RpbmcgaXQgdG8gaGFuZGxlciBmb3IgdGhlCisgKiBvYmplY3QgcGF0aCBsaXN0ZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLCBpZiBhbnkuIE1lc3NhZ2VzIGFyZQorICogZGlzcGF0Y2hlZCBmaXJzdCB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyIHRoYXQgbWF0Y2hlcyB0aGUgbGFyZ2VzdAorICogbnVtYmVyIG9mIHBhdGggZWxlbWVudHM7IHRoYXQgaXMsIG1lc3NhZ2UgdG8gL2Zvby9iYXIvYmF6IHdvdWxkIGdvCisgKiB0byB0aGUgaGFuZGxlciBmb3IgL2Zvby9iYXIgYmVmb3JlIHRoZSBvbmUgZm9yIC9mb28uCisgKgorICogQHRvZG8gdGhyZWFkIHByb2JsZW1zCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gZGlzcGF0Y2gKKyAqIEBwYXJhbSBmb3VuZF9vYmplY3QgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyB3aGV0aGVyIG1lc3NhZ2Ugd2FzIGhhbmRsZWQgc3VjY2Vzc2Z1bGx5CisgKi8KK0RCdXNIYW5kbGVyUmVzdWx0CitfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgKmZvdW5kX29iamVjdCkKK3sKKyAgY2hhciAqKnBhdGg7CisgIGRidXNfYm9vbF90IGV4YWN0X21hdGNoOworICBEQnVzTGlzdCAqbGlzdDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIAorI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIkRpc3BhdGNoIG9mIG1lc3NhZ2UgYnkgb2JqZWN0IHBhdGhcbiIpOworI2VuZGlmCisgIAorICBwYXRoID0gTlVMTDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJnBhdGgpKQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGdldCBkZWNvbXBvc2VkIHBhdGhcbiIpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICB9CisKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBhdGggZmllbGQgaW4gbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorICAKKyAgLyogRmluZCB0aGUgZGVlcGVzdCBwYXRoIHRoYXQgY292ZXJzIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisgIHN1YnRyZWUgPSBmaW5kX2hhbmRsZXIgKHRyZWUsIChjb25zdCBjaGFyKiopIHBhdGgsICZleGFjdF9tYXRjaCk7CisgIAorICBpZiAoZm91bmRfb2JqZWN0KQorICAgICpmb3VuZF9vYmplY3QgPSAhIXN1YnRyZWU7CisKKyAgLyogQnVpbGQgYSBsaXN0IG9mIGFsbCBwYXRocyB0aGF0IGNvdmVyIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisKKyAgbGlzdCA9IE5VTEw7CisKKyAgd2hpbGUgKHN1YnRyZWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMICYmIChleGFjdF9tYXRjaCB8fCBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2spKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfcmVmIChzdWJ0cmVlKTsKKworICAgICAgICAgIC8qIHJ1biBkZWVwZXN0IHBhdGhzIGZpcnN0ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QsIHN1YnRyZWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoc3VidHJlZSk7CisgICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGV4YWN0X21hdGNoID0gRkFMU0U7CisgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+cGFyZW50OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiJWQgaGFuZGxlcnMgaW4gdGhlIHBhdGggdHJlZSBmb3IgdGhpcyBtZXNzYWdlXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0KSk7CisKKyAgLyogSW52b2tlIGVhY2ggaGFuZGxlciBpbiB0aGUgbGlzdCAqLworCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LCBsaW5rKTsKKyAgICAgIHN1YnRyZWUgPSBsaW5rLT5kYXRhOworCisgICAgICAvKiBtZXNzYWdlX2Z1bmN0aW9uIGlzIE5VTEwgaWYgd2UncmUgdW5yZWdpc3RlcmVkCisgICAgICAgKiBkdWUgdG8gcmVlbnRyYW5jeQorICAgICAgICovCisgICAgICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIERCdXNPYmplY3RQYXRoTWVzc2FnZUZ1bmN0aW9uIG1lc3NhZ2VfZnVuY3Rpb247CisgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhOworCisgICAgICAgICAgbWVzc2FnZV9mdW5jdGlvbiA9IHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb247CisgICAgICAgICAgdXNlcl9kYXRhID0gc3VidHJlZS0+dXNlcl9kYXRhOworCisjaWYgMAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChpbnZva2luZyBhIGhhbmRsZXIpXG4iKTsKKyNlbmRpZgorICAgICAgICAgIAorI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEZJWE1FIHlvdSBjb3VsZCB1bnJlZ2lzdGVyIHRoZSBzdWJ0cmVlIGluIGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgICogYmVmb3JlIHdlIGludm9rZSB0aGUgY2FsbGJhY2ssIGFuZCBJIGNhbid0IGZpZ3VyZSBvdXQgYQorICAgICAgICAgICAqIGdvb2Qgd2F5IHRvIHNvbHZlIHRoaXMuCisgICAgICAgICAgICovCisKKyAgICAgICAgICByZXN1bHQgPSAoKiBtZXNzYWdlX2Z1bmN0aW9uKSAodHJlZS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgZnJlZV9hbmRfcmV0dXJuOgorCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgeworICAgICAgLyogVGhpcyBoYXJkY29kZWQgZGVmYXVsdCBoYW5kbGVyIGRvZXMgYSBtaW5pbWFsIEludHJvc3BlY3QoKQorICAgICAgICovCisgICAgICByZXN1bHQgPSBoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2sgKHRyZWUsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKiopIHBhdGgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHdoaWxlIChsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsKKyAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0LCBsaW5rKTsKKyAgICB9CisgIAorICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChwYXRoKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSBkYXRhIHBhc3NlZCB0byBfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlcigpIGZvciBhCisgKiBoYW5kbGVyIGF0IHRoZSBnaXZlbiBwYXRoLgorICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBwYXRoIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwYXRoIGVsZW1lbnRzIGdpdmluZyBwYXRoIHRvIHN1YnRyZWUKKyAqIEByZXR1cm5zIHRoZSBvYmplY3QncyB1c2VyX2RhdGEgb3IgI05VTEwgaWYgbm9uZSBmb3VuZAorICovCit2b2lkKgorX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqcGF0aCkKK3sKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworCisgIF9kYnVzX2Fzc2VydCAodHJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworICAKKyAgLyogRmluZCB0aGUgZGVlcGVzdCBwYXRoIHRoYXQgY292ZXJzIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisgIHN1YnRyZWUgPSBmaW5kX2hhbmRsZXIgKHRyZWUsIChjb25zdCBjaGFyKiopIHBhdGgsICZleGFjdF9tYXRjaCk7CisKKyAgaWYgKChzdWJ0cmVlID09IE5VTEwpIHx8ICFleGFjdF9tYXRjaCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gb2JqZWN0IGF0IHNwZWNpZmllZCBwYXRoIGZvdW5kXG4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gc3VidHJlZS0+dXNlcl9kYXRhOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhIHN1YnRyZWUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBuYW1lIG5hbWUgdG8gZHVwbGljYXRlLgorICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIHN1YnRyZWUKKyAqLworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorYWxsb2NhdGVfc3VidHJlZV9vYmplY3QgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGludCBsZW47CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICBjb25zdCBzaXplX3QgZnJvbnRfcGFkZGluZyA9IF9EQlVTX1NUUlVDVF9PRkZTRVQgKERCdXNPYmplY3RTdWJ0cmVlLCBuYW1lKTsKKworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgbGVuID0gc3RybGVuIChuYW1lKTsKKworICBzdWJ0cmVlID0gZGJ1c19tYWxsb2MwIChNQVggKGZyb250X3BhZGRpbmcgKyAobGVuICsgMSksIHNpemVvZiAoREJ1c09iamVjdFN1YnRyZWUpKSk7CisKKyAgaWYgKHN1YnRyZWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKHN1YnRyZWUtPm5hbWUsIG5hbWUsIGxlbiArIDEpOworCisgIHJldHVybiBzdWJ0cmVlOworfQorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKworICBzdWJ0cmVlID0gYWxsb2NhdGVfc3VidHJlZV9vYmplY3QgKG5hbWUpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICBzdWJ0cmVlLT5wYXJlbnQgPSBOVUxMOworCisgIGlmICh2dGFibGUpCisgICAgeworICAgICAgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9IHZ0YWJsZS0+bWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSB2dGFibGUtPnVucmVnaXN0ZXJfZnVuY3Rpb247CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9IE5VTEw7CisgICAgICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgICB9CisKKyAgc3VidHJlZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBfZGJ1c19hdG9taWNfaW5jICgmc3VidHJlZS0+cmVmY291bnQpOworICBzdWJ0cmVlLT5zdWJ0cmVlcyA9IE5VTEw7CisgIHN1YnRyZWUtPm5fc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2sgPSBGQUxTRTsKKworICByZXR1cm4gc3VidHJlZTsKKworIG9vbToKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSAqCitfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgKERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlKQoreworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgX2RidXNfYXRvbWljX2luYyAoJnN1YnRyZWUtPnJlZmNvdW50KTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2luYyAoJnN1YnRyZWUtPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPiAwKTsKKyNlbmRpZgorCisgIHJldHVybiBzdWJ0cmVlOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZzdWJ0cmVlLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3ZhbHVlID4gMCk7CisKKyAgaWYgKG9sZF92YWx1ZSA9PSAxKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9PSBOVUxMKTsKKworICAgICAgZGJ1c19mcmVlIChzdWJ0cmVlLT5zdWJ0cmVlcyk7CisgICAgICBkYnVzX2ZyZWUgKHN1YnRyZWUpOworICAgIH0KK30KKworLyoqCisgKiBMaXN0cyB0aGUgcmVnaXN0ZXJlZCBmYWxsYmFjayBoYW5kbGVycyBhbmQgb2JqZWN0IHBhdGggaGFuZGxlcnMgYXQKKyAqIHRoZSBnaXZlbiBwYXJlbnRfcGF0aC4gVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gcGFyZW50X3BhdGggdGhlIHBhdGggdG8gbGlzdCB0aGUgY2hpbGQgaGFuZGxlcnMgb2YKKyAqIEBwYXJhbSBjaGlsZF9lbnRyaWVzIHJldHVybnMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBjaGlsZHJlbgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgY2hpbGQgZW50cmllcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX2FuZF91bmxvY2sgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgKioqY2hpbGRfZW50cmllcykKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIHJlc3VsdCA9IF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9lbnRyaWVzKTsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiogU2V0IHRvIDEgdG8gZ2V0IGEgYnVuY2ggb2Ygc3BldyBhYm91dCBkaXNhc3NlbWJsaW5nIHRoZSBwYXRoIHN0cmluZyAqLworI2RlZmluZSBWRVJCT1NFX0RFQ09NUE9TRSAwCisKKy8qKgorICogRGVjb21wb3NlIGFuIG9iamVjdCBwYXRoLiAgQSBwYXRoIG9mIGp1c3QgIi8iIGlzCisgKiByZXByZXNlbnRlZCBhcyBhbiBlbXB0eSB2ZWN0b3Igb2Ygc3RyaW5ncy4KKyAqIFRoZSBwYXRoIG5lZWQgbm90IGJlIG51bCB0ZXJtaW5hdGVkLgorICogCisgKiBAcGFyYW0gZGF0YSB0aGUgcGF0aCBkYXRhCisgKiBAcGFyYW0gbGVuICB0aGUgbGVuZ3RoIG9mIHRoZSBwYXRoIHN0cmluZworICogQHBhcmFtIHBhdGggYWRkcmVzcyB0byBzdG9yZSBuZXcgb2JqZWN0IHBhdGgKKyAqIEBwYXJhbSBwYXRoX2xlbiBsZW5ndGggb2Ygc3RvcmVkIHBhdGgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlY29tcG9zZV9wYXRoIChjb25zdCBjaGFyKiAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwYXRoX2xlbikKK3sKKyAgY2hhciAqKnJldHZhbDsKKyAgaW50IG5fY29tcG9uZW50czsKKyAgaW50IGksIGosIGNvbXA7CisKKyAgX2RidXNfYXNzZXJ0IChkYXRhICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisgIAorI2lmIFZFUkJPU0VfREVDT01QT1NFCisgIF9kYnVzX3ZlcmJvc2UgKCJEZWNvbXBvc2luZyBwYXRoIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgZGF0YSk7CisjZW5kaWYKKyAgCisgIG5fY29tcG9uZW50cyA9IDA7CisgIGlmIChsZW4gPiAxKSAvKiBpZiBwYXRoIGlzIG5vdCBqdXN0ICIvIiAqLworICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRhdGFbaV0gIT0gJ1wwJyk7CisgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gJy8nKQorICAgICAgICAgICAgbl9jb21wb25lbnRzICs9IDE7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dmFsID0gZGJ1c19uZXcwIChjaGFyKiwgbl9jb21wb25lbnRzICsgMSk7CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb21wID0gMDsKKyAgaWYgKG5fY29tcG9uZW50cyA9PSAwKQorICAgIGkgPSAxOworICBlbHNlCisgICAgaSA9IDA7CisgIHdoaWxlIChjb21wIDwgbl9jb21wb25lbnRzKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA8IGxlbik7CisgICAgICAKKyAgICAgIGlmIChkYXRhW2ldID09ICcvJykKKyAgICAgICAgKytpOworICAgICAgaiA9IGk7CisKKyAgICAgIHdoaWxlIChqIDwgbGVuICYmIGRhdGFbal0gIT0gJy8nKQorICAgICAgICArK2o7CisKKyAgICAgIC8qIE5vdyBbaSwgaikgaXMgdGhlIHBhdGggY29tcG9uZW50ICovCisgICAgICBfZGJ1c19hc3NlcnQgKGkgPCBqKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YVtpXSAhPSAnLycpOworICAgICAgX2RidXNfYXNzZXJ0IChqID09IGxlbiB8fCBkYXRhW2pdID09ICcvJyk7CisKKyNpZiBWRVJCT1NFX0RFQ09NUE9TRQorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKGNvbXBvbmVudCBpbiBbJWQsJWQpKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIGopOworI2VuZGlmCisgICAgICAKKyAgICAgIHJldHZhbFtjb21wXSA9IF9kYnVzX21lbWR1cCAoJmRhdGFbaV0sIGogLSBpICsgMSk7CisgICAgICBpZiAocmV0dmFsW2NvbXBdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChyZXR2YWwpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgcmV0dmFsW2NvbXBdW2otaV0gPSAnXDAnOworI2lmIFZFUkJPU0VfREVDT01QT1NFCisgICAgICBfZGJ1c192ZXJib3NlICgiICAoY29tcG9uZW50ICVkID0gXCIlc1wiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXAsIHJldHZhbFtjb21wXSk7CisjZW5kaWYKKworICAgICAgKytjb21wOworICAgICAgaSA9IGo7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKGkgPT0gbGVuKTsKKyAgCisgICpwYXRoID0gcmV0dmFsOworICBpZiAocGF0aF9sZW4pCisgICAgKnBhdGhfbGVuID0gbl9jb21wb25lbnRzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBAfSAqLworCitzdGF0aWMgY2hhcioKK2ZsYXR0ZW5fcGF0aCAoY29uc3QgY2hhciAqKnBhdGgpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpzOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChwYXRoWzBdID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcvJykpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKHBhdGhbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJy8nKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBwYXRoW2ldKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZzKSkKKyAgICBnb3RvIG5vbWVtOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gczsKKworIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiBOVUxMOworfQorCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtIAoreworICBTVFJfRVFVQUwsCisgIFNUUl9QUkVGSVgsCisgIFNUUl9ESUZGRVJFTlQKK30gU3RyQ29tcGFyaXNvbjsKKworLyogUmV0dXJucyBUUlVFIGlmIGNvbnRhaW5lciBpcyBhIHBhcmVudCBvZiBjaGlsZAorICovCitzdGF0aWMgU3RyQ29tcGFyaXNvbgorcGF0aF9jb250YWlucyAoY29uc3QgY2hhciAqKmNvbnRhaW5lciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipjaGlsZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChjaGlsZFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2OworCisgICAgICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgICAgIHJldHVybiBTVFJfUFJFRklYOyAvKiBjb250YWluZXIgcmFuIG91dCwgY2hpbGQgY29udGludWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGh1cyB0aGUgY29udGFpbmVyIGlzIGEgcGFyZW50IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hpbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChjb250YWluZXJbaV0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkW2ldICE9IE5VTEwpOworCisgICAgICB2ID0gc3RyY21wIChjb250YWluZXJbaV0sIGNoaWxkW2ldKTsKKworICAgICAgaWYgKHYgIT0gMCkKKyAgICAgICAgcmV0dXJuIFNUUl9ESUZGRVJFTlQ7IC8qIHRoZXkgb3ZlcmxhcCB1bnRpbCBoZXJlIGFuZCB0aGVuIGFyZSBkaWZmZXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3Qgb3ZlcmxhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIENoaWxkIHJhbiBvdXQ7IGlmIGNvbnRhaW5lciBhbHNvIGRpZCwgdGhleSBhcmUgZXF1YWw7CisgICAqIG90aGVyd2lzZSwgdGhlIGNoaWxkIGlzIGEgcGFyZW50IG9mIHRoZSBjb250YWluZXIuCisgICAqLworICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgcmV0dXJuIFNUUl9FUVVBTDsKKyAgZWxzZQorICAgIHJldHVybiBTVFJfRElGRkVSRU5UOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3NwZXdfc3VidHJlZV9yZWN1cnNlIChEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5kZW50KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBpbmRlbnQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAiKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzICglZCBjaGlsZHJlbilcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIHN1YnRyZWUtPm5fc3VidHJlZXMpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IHN1YnRyZWUtPm5fc3VidHJlZXMpCisgICAgeworICAgICAgc3Bld19zdWJ0cmVlX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2ldLCBpbmRlbnQgKyAyKTsKKworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwZXdfdHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIHNwZXdfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCAwKTsKK30KKyNlbmRpZgorCisvKioKKyAqIENhbGxiYWNrIGRhdGEgdXNlZCBpbiB0ZXN0cworICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICoqcGF0aDsgLyoqPCBQYXRoICovCisgIGRidXNfYm9vbF90IGhhbmRsZXJfZmFsbGJhY2s7IC8qKjwgdHJ1ZSBpZiB0aGUgaGFuZGxlciBtYXkgYmUgY2FsbGVkIGFzIGZhbGxiYWNrICovCisgIGRidXNfYm9vbF90IG1lc3NhZ2VfaGFuZGxlZDsgLyoqPCBHZXRzIHNldCB0byB0cnVlIGlmIG1lc3NhZ2UgaGFuZGxlciBjYWxsZWQgKi8KKyAgZGJ1c19ib29sX3QgaGFuZGxlcl91bnJlZ2lzdGVyZWQ7IC8qKjwgZ2V0cyBzZXQgdG8gdHJ1ZSBpZiBoYW5kbGVyIGlzIHVucmVnaXN0ZXJlZCAqLworfSBUcmVlVGVzdERhdGE7CisKKworc3RhdGljIHZvaWQKK3Rlc3RfdW5yZWdpc3Rlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgVHJlZVRlc3REYXRhICp0dGQgPSB1c2VyX2RhdGE7CisKKyAgdHRkLT5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAordGVzdF9tZXNzYWdlX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIFRyZWVUZXN0RGF0YSAqdHRkID0gdXNlcl9kYXRhOworCisgIHR0ZC0+bWVzc2FnZV9oYW5kbGVkID0gVFJVRTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fcmVnaXN0ZXIgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICBUcmVlVGVzdERhdGEgICAqdHJlZV90ZXN0X2RhdGEpCit7CisgIERCdXNPYmplY3RQYXRoVlRhYmxlIHZ0YWJsZSA9IHsgdGVzdF91bnJlZ2lzdGVyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbWVzc2FnZV9mdW5jdGlvbiwgTlVMTCB9OworCisgIHRyZWVfdGVzdF9kYXRhW2ldLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX2ZhbGxiYWNrID0gZmFsbGJhY2s7CisgIHRyZWVfdGVzdF9kYXRhW2ldLnBhdGggPSBwYXRoOworCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIGZhbGxiYWNrLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlZV90ZXN0X2RhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgpID09CisgICAgICAgICAgICAgICAgJnRyZWVfdGVzdF9kYXRhW2ldKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3Rlc3RfZGlzcGF0Y2ggKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgIFRyZWVUZXN0RGF0YSAgICp0cmVlX3Rlc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuX3Rlc3RfZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGludCBqOworICBEQnVzSGFuZGxlclJlc3VsdCByZXN1bHQ7CisgIGNoYXIgKmZsYXQ7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIAorICBmbGF0ID0gZmxhdHRlbl9wYXRoIChwYXRoKTsKKyAgaWYgKGZsYXQgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICBkYnVzX2ZyZWUgKGZsYXQpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGogPSAwOworICB3aGlsZSAoaiA8IG5fdGVzdF9kYXRhKQorICAgIHsKKyAgICAgIHRyZWVfdGVzdF9kYXRhW2pdLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICAgICAgKytqOworICAgIH0KKworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICh0cmVlLCBtZXNzYWdlLCBOVUxMKTsKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKworICBqID0gMDsKKyAgd2hpbGUgKGogPCBuX3Rlc3RfZGF0YSkKKyAgICB7CisgICAgICBpZiAodHJlZV90ZXN0X2RhdGFbal0ubWVzc2FnZV9oYW5kbGVkKQorCXsKKwkgIGlmICh0cmVlX3Rlc3RfZGF0YVtqXS5oYW5kbGVyX2ZhbGxiYWNrKQorCSAgICBfZGJ1c19hc3NlcnQgKHBhdGhfY29udGFpbnMgKHRyZWVfdGVzdF9kYXRhW2pdLnBhdGgsCisJCQkJCSBwYXRoKSAhPSBTVFJfRElGRkVSRU5UKTsKKwkgIGVsc2UKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLCBwYXRoKSA9PSBTVFJfRVFVQUwpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAodHJlZV90ZXN0X2RhdGFbal0uaGFuZGxlcl9mYWxsYmFjaykKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLAorCQkJCQkgcGF0aCkgPT0gU1RSX0RJRkZFUkVOVCk7CisJICBlbHNlCisJICAgIF9kYnVzX2Fzc2VydCAocGF0aF9jb250YWlucyAodHJlZV90ZXN0X2RhdGFbal0ucGF0aCwgcGF0aCkgIT0gU1RSX0VRVUFMKTsKKwl9CisKKyAgICAgICsrajsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgc2l6ZV90CitzdHJpbmdfYXJyYXlfbGVuZ3RoIChjb25zdCBjaGFyICoqYXJyYXkpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBhcnJheVtpXTsgaSsrKSA7CisgIHJldHVybiBpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpwYXRoOworICBjb25zdCBjaGFyICpyZXN1bHRbMjBdOworfSBEZWNvbXBvc2VQYXRoVGVzdDsKKworc3RhdGljIERlY29tcG9zZVBhdGhUZXN0IGRlY29tcG9zZV90ZXN0c1tdID0geworICB7ICIvZm9vIiwgeyAiZm9vIiwgTlVMTCB9IH0sCisgIHsgIi9mb28vYmFyIiwgeyAiZm9vIiwgImJhciIsIE5VTEwgfSB9LAorICB7ICIvIiwgeyBOVUxMIH0gfSwKKyAgeyAiL2EvYiIsIHsgImEiLCAiYiIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MiLCB7ICJhIiwgImIiLCAiYyIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MvZCIsIHsgImEiLCAiYiIsICJjIiwgImQiLCBOVUxMIH0gfSwKKyAgeyAiL2Zvby9iYXIvcSIsIHsgImZvbyIsICJiYXIiLCAicSIsIE5VTEwgfSB9LAorICB7ICIvZm9vL2Jhci90aGlzL2lzL2xvbmdlciIsIHsgImZvbyIsICJiYXIiLCAidGhpcyIsICJpcyIsICJsb25nZXIiLCBOVUxMIH0gfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90CitydW5fZGVjb21wb3NlX3Rlc3RzICh2b2lkKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChkZWNvbXBvc2VfdGVzdHMpKQorICAgIHsKKyAgICAgIGNoYXIgKipyZXN1bHQ7CisgICAgICBpbnQgICAgcmVzdWx0X2xlbjsKKyAgICAgIGludCAgICBleHBlY3RlZF9sZW47CisKKyAgICAgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKGRlY29tcG9zZV90ZXN0c1tpXS5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChkZWNvbXBvc2VfdGVzdHNbaV0ucGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LCAmcmVzdWx0X2xlbikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgZXhwZWN0ZWRfbGVuID0gc3RyaW5nX2FycmF5X2xlbmd0aCAoZGVjb21wb3NlX3Rlc3RzW2ldLnJlc3VsdCk7CisgICAgICAKKyAgICAgIGlmIChyZXN1bHRfbGVuICE9IChpbnQpIHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopcmVzdWx0KSB8fAorICAgICAgICAgIGV4cGVjdGVkX2xlbiAhPSByZXN1bHRfbGVuIHx8CisgICAgICAgICAgcGF0aF9jb250YWlucyAoZGVjb21wb3NlX3Rlc3RzW2ldLnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhcioqKSByZXN1bHQpICE9IFNUUl9FUVVBTCkKKyAgICAgICAgeworICAgICAgICAgIGludCByZWFsX2xlbiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopcmVzdWx0KTsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZGVjb21wb3NlIG9mICVzIHRvIGhhdmUgbGVuICVkLCByZXR1cm5lZCAlZCwgYXBwZWFycyB0byBoYXZlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZV90ZXN0c1tpXS5wYXRoLCBleHBlY3RlZF9sZW4sIHJlc3VsdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgcmVhbF9sZW4pOworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEZWNvbXBvc2UgcmVzdWx0ZWQgaW4gZWxlbWVudHM6IHsgIik7CisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgd2hpbGUgKGkgPCByZWFsX2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlwiJXNcIiVzIiwgcmVzdWx0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEpID09IHJlYWxfbGVuID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3dhcm4gKCJ9XG4iKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJwYXRoIGRlY29tcG9zZSBmYWlsZWRcbiIpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHJlc3VsdCk7CisKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBleGFjdCBzdWJ0cmVlLCByZWdpc3RlcmVkIG9yIHVucmVnaXN0ZXJlZFxuIik7CisjZW5kaWYKKworICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIEZBTFNFLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbiAodm9pZCAqZGF0YSkKK3sKKyAgY29uc3QgY2hhciAqcGF0aDBbXSA9IHsgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMVtdID0geyAiZm9vIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMltdID0geyAiZm9vIiwgImJhciIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDNbXSA9IHsgImZvbyIsICJiYXIiLCAiYmF6IiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNFtdID0geyAiZm9vIiwgImJhciIsICJib28iLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg1W10gPSB7ICJibGFoIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNltdID0geyAiYmxhaCIsICJib29mIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoN1tdID0geyAiYmxhaCIsICJib29mIiwgInRoaXMiLCAiaXMiLCAicmVhbGx5IiwgImxvbmciLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg4W10gPSB7ICJjaGlsZGxlc3MiLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg5W10gPSB7ICJibGFoIiwgImEiLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGgxMFtdID0geyAiYmxhaCIsICJiIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMTFbXSA9IHsgImJsYWgiLCAiYyIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDEyW10gPSB7ICJibGFoIiwgImEiLCAiZCIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDEzW10gPSB7ICJibGFoIiwgImIiLCAiZCIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDE0W10gPSB7ICJibGFoIiwgImMiLCAiZCIsIE5VTEwgfTsKKyAgREJ1c09iamVjdFBhdGhWVGFibGUgdGVzdF92dGFibGUgPSB7IE5VTEwsIHRlc3RfbWVzc2FnZV9mdW5jdGlvbiwgTlVMTCB9OworICBEQnVzT2JqZWN0VHJlZSAqdHJlZTsKKyAgVHJlZVRlc3REYXRhIHRyZWVfdGVzdF9kYXRhWzldOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisKKyAgaWYgKCFydW5fZGVjb21wb3NlX3Rlc3RzICgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHRyZWUgPSBOVUxMOworCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoOCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIAorICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMSwgVFJVRSwgMSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgJiYgIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg2LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg3LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMiwgVFJVRSwgMiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7ICAKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDAsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDIsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDUsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDcsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDgsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICAKKyAgLyogdGVzdCB0aGUgbGlzdF9yZWdpc3RlcmVkIGZ1bmN0aW9uICovCisKKyAgeworICAgIGNvbnN0IGNoYXIgKnJvb3RbXSA9IHsgTlVMTCB9OworICAgIGNoYXIgKipjaGlsZF9lbnRyaWVzOworICAgIGludCBuYjsKKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcGF0aDEsICZjaGlsZF9lbnRyaWVzKTsKKyAgICBpZiAoY2hpbGRfZW50cmllcyAhPSBOVUxMKQorICAgICAgeworCW5iID0gc3RyaW5nX2FycmF5X2xlbmd0aCAoKGNvbnN0IGNoYXIqKiljaGlsZF9lbnRyaWVzKTsKKwlfZGJ1c19hc3NlcnQgKG5iID09IDEpOworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoaWxkX2VudHJpZXMpOworICAgICAgfQorCisgICAgX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCBwYXRoMiwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMik7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisKKyAgICBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGg4LCAmY2hpbGRfZW50cmllcyk7CisgICAgaWYgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCkKKyAgICAgIHsKKwluYiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopY2hpbGRfZW50cmllcyk7CisJX2RidXNfYXNzZXJ0IChuYiA9PSAwKTsKKwlkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZF9lbnRyaWVzKTsKKyAgICAgIH0KKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcm9vdCwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMyk7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisgIH0KKworICAvKiBDaGVjayB0aGF0IGRlc3Ryb3lpbmcgdHJlZSBjYWxscyB1bnJlZ2lzdGVyIGZ1bmNzICovCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVmICh0cmVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCF0cmVlX3Rlc3RfZGF0YVtpXS5tZXNzYWdlX2hhbmRsZWQpOworICAgICAgKytpOworICAgIH0KKworICAvKiBOb3cgc3RhcnQgYWdhaW4gYW5kIHRyeSB0aGUgaW5kaXZpZHVhbCB1bnJlZ2lzdGVyIGZ1bmN0aW9uICovCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg4LCBUUlVFLCA4LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDApID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDEpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoMikgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgzKSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg0KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisgIAorICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg1KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNSkgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg2KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg3KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNykgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDgpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg4KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0uaGFuZGxlcl91bnJlZ2lzdGVyZWQpOworICAgICAgX2RidXNfYXNzZXJ0ICghdHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogVGVzdCByZW1vdmFsIG9mIG5ld2x5LWNoaWxkbGVzcyB1bnJlZ2lzdGVyZWQgbm9kZXMgKi8KKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMikpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMCkpOworCisgIC8qIFRlc3QgdGhhdCB1bnJlZ2lzdGVyZWQgcGFyZW50cyBjYW5ub3QgYmUgZnJlZWQgb3V0IGZyb20gdW5kZXIgdGhlaXIKKyAgICAgY2hpbGRyZW4gKi8KKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDApKTsKKworI2lmIDAKKyAgLyogVGhpcyB0cmlnZ2VycyB0aGUgIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggLi4uIiB3YXJuaW5nIG1lc3NhZ2UgKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMSk7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDIpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDApKTsKKworICAvKiBUZXN0IHRoYXQgcmVnaXN0ZXJlZCBwYXJlbnRzIGNhbm5vdCBiZSBmcmVlZCBvdXQgZnJvbSB1bmRlciB0aGVpcgorICAgICBjaGlsZHJlbiwgYW5kIHRoYXQgaWYgdGhleSBhcmUgdW5yZWdpc3RlcmVkIGJlZm9yZSB0aGVpciBjaGlsZHJlbiwgdGhleQorICAgICBhcmUgc3RpbGwgZnJlZWQgd2hlbiB0aGVpciBjaGlsZHJlbiBhcmUgdW5yZWdpc3RlcmVkICovCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMik7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCB3aXRoIE5VTEwgdW5yZWdpc3Rlcl9mdW5jdGlvbiBhbmQgdXNlcl9kYXRhICovCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIFRSVUUsIHBhdGgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDIpID09IE5VTEwpOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCBmcmVlaW5nIGEgbG9uZyBwYXRoICovCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMyk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMykpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCBmcmVlaW5nIG11bHRpcGxlIGNoaWxkcmVuIGZyb20gdGhlIHNhbWUgcGF0aCAqLworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNCwgVFJVRSwgNCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgzKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgzKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDQpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDQpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDQpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgzKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworCisgIC8qIFRlc3Qgc3VidHJlZSByZW1vdmFsICovCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIFRSVUUsIHBhdGgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEyLCBOVUxMKSk7CisKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAodHJlZSwgVFJVRSwgcGF0aDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTMsIE5VTEwpKTsKKworICBpZiAoIV9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICh0cmVlLCBUUlVFLCBwYXRoMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxNCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEyKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMikpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoOSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDUpKTsKKworICBpZiAoIV9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICh0cmVlLCBUUlVFLCBwYXRoMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxMiwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEzKTsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEzKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMTApKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg1KSk7CisKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAodHJlZSwgVFJVRSwgcGF0aDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTMsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgxNCk7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDE0KSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDExKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoNSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEyKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMikpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg5KSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoNSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEzKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMykpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg1KSk7CisKKyNpZiAwCisgIC8qIFRlc3QgYXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIG5vbi1leGlzdGVudCBwYXRocy4gIFRoZXNlIHRyaWdnZXIKKyAgICAgIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggLi4uIiB3YXJuaW5nIG1lc3NhZ2VzICovCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDApOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgxKTsKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMik7CisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDMpOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg0KTsKKyNlbmRpZgorCisgIC8qIFJlZ2lzdGVyIGl0IGFsbCBhZ2FpbiwgYW5kIHRlc3QgZGlzcGF0Y2ggKi8KKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBGQUxTRSwgMSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMiwgVFJVRSwgMiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNCwgVFJVRSwgNCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNSwgVFJVRSwgNSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNiwgRkFMU0UsIDYsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDcsIFRSVUUsIDcsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworI2lmIDAKKyAgc3Bld190cmVlICh0cmVlKTsKKyNlbmRpZgorCisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDAsIDAsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGgxLCAxLCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoMiwgMiwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDMsIDMsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg0LCA0LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoNSwgNSwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDYsIDYsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg3LCA3LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoOCwgOCwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIAorIG91dDoKKyAgaWYgKHRyZWUpCisgICAgeworICAgICAgLyogdGVzdCByZWYgKi8KKyAgICAgIF9kYnVzX29iamVjdF90cmVlX3JlZiAodHJlZSk7CisgICAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAodHJlZSk7CisgICAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAodHJlZSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNPYmplY3RUcmVlCisgKiBVbml0IHRlc3QgZm9yIERCdXNPYmplY3RUcmVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfdGVzdCAodm9pZCkKK3sKKyAgX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJvYmplY3QgdHJlZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oIGIvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3NmMyNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1vYmplY3QtdHJlZS5oICBEQnVzT2JqZWN0VHJlZSAoaW50ZXJuYWxzIG9mIERCdXNDb25uZWN0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfT0JKRUNUX1RSRUVfSAorI2RlZmluZSBEQlVTX09CSkVDVF9UUkVFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c09iamVjdFRyZWUgREJ1c09iamVjdFRyZWU7CisKK0RCdXNPYmplY3RUcmVlKiBfZGJ1c19vYmplY3RfdHJlZV9uZXcgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJ1c09iamVjdFRyZWUqIF9kYnVzX29iamVjdF90cmVlX3JlZiAgIChEQnVzT2JqZWN0VHJlZSAqdHJlZSk7Cit2b2lkICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKTsKKworZGJ1c19ib29sX3QgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgICAgICAgICAgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCk7CitEQnVzSGFuZGxlclJlc3VsdCBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICAgIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgKmZvdW5kX29iamVjdCk7Cit2b2lkKiAgICAgICAgICAgICBfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGVjb21wb3NlX3BhdGggKGNvbnN0IGNoYXIgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICoqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpwYXRoX2xlbik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX09CSkVDVF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaCBiL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNlNjYwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaCBEQnVzUGVuZGluZ0NhbGwgaW50ZXJuYWwgaW50ZXJmYWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUEVORElOR19DQUxMX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSAorCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworZGJ1c19ib29sX3QgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgaXNfYWRkZWQpOworREJ1c1RpbWVvdXQgICAgKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfdWludDMyX3QgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitEQnVzQ29ubmVjdGlvbiAqIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworREJ1c0Nvbm5lY3Rpb24gKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2Nvbm5lY3Rpb25fdW5sb2NrZWQgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9lcnJvcl91bmxvY2tlZCAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzUGVuZGluZ0NhbGwqIF9kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICB0aW1lb3V0X2hhbmRsZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1BlbmRpbmdDYWxsKiBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkICAgICAgICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2sgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIGIvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTM0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMKQEAgLTAsMCArMSw4NDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwuYyBPYmplY3QgcmVwcmVzZW50aW5nIGEgY2FsbCBpbiBwcm9ncmVzcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNQZW5kaW5nQ2FsbEludGVybmFscyBEQnVzUGVuZGluZ0NhbGwgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNQZW5kaW5nQ2FsbCBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgKgorICogVGhlIGd1dHMgb2YgREJ1c1BlbmRpbmdDYWxsIGFuZCBpdHMgbWV0aG9kcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzUGVuZGluZ0NhbGwKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlcGx5IG1lc3NhZ2UgdGhhdCB3ZSdyZSB3YWl0aW5nIGZvci4KKyAqLworCisvKioKKyAqIHNob3J0ZXIgYW5kIG1vcmUgdmlzaWJsZSB3YXkgdG8gd3JpdGUgX2RidXNfY29ubmVjdGlvbl9sb2NrKCkKKyAqLworI2RlZmluZSBDT05ORUNUSU9OX0xPQ0soY29ubmVjdGlvbikgICBfZGJ1c19jb25uZWN0aW9uX2xvY2soY29ubmVjdGlvbikKKy8qKgorICogc2hvcnRlciBhbmQgbW9yZSB2aXNpYmxlIHdheSB0byB3cml0ZSBfZGJ1c19jb25uZWN0aW9uX3VubG9jaygpCisgKi8KKyNkZWZpbmUgQ09OTkVDVElPTl9VTkxPQ0soY29ubmVjdGlvbikgX2RidXNfY29ubmVjdGlvbl91bmxvY2soY29ubmVjdGlvbikKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mICNEQnVzUGVuZGluZ0NhbGwgLSBhbGwgZmllbGRzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1BlbmRpbmdDYWxsCit7CisgIERCdXNBdG9taWMgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0RhdGFTbG90TGlzdCBzbG90X2xpc3Q7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIHN0b3JlZCBieSBhbGxvY2F0ZWQgaW50ZWdlciBJRCAqLworICAKKyAgREJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gZnVuY3Rpb247ICAgICAgICAgLyoqPCBOb3RpZmllciB3aGVuIHJlcGx5IGFycml2ZXMuICovCisKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb25uZWN0aW9ucyB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8KKyAgREJ1c01lc3NhZ2UgKnJlcGx5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXBseSAoYWZ0ZXIgd2UndmUgcmVjZWl2ZWQgaXQpICovCisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCAqLworCisgIERCdXNMaXN0ICp0aW1lb3V0X2xpbms7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJlYWxsb2NhdGVkIHRpbWVvdXQgcmVzcG9uc2UgKi8KKyAgCisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXhwZWN0ZWQgc2VyaWFsIG9mIHJlcGx5ICovCisKKyAgdW5zaWduZWQgaW50IGNvbXBsZXRlZCA6IDE7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUUlVFIGlmIGNvbXBsZXRlZCAqLworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7ICAgICAgICAgICAgICAgICAvKio8IEhhdmUgYWRkZWQgdGhlIHRpbWVvdXQgKi8KK307CisKK3N0YXRpYyB2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmdfY2FsbCwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KQoreworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBfZGJ1c190cmFjZV9yZWYgKCJEQnVzUGVuZGluZ0NhbGwiLCBwZW5kaW5nX2NhbGwsIG9sZF9yZWZjb3VudCwKKyAgICAgIG5ld19yZWZjb3VudCwgd2h5LCAiREJVU19QRU5ESU5HX0NBTExfVFJBQ0UiLCAmZW5hYmxlZCk7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfaW50MzJfdCBub3RpZnlfdXNlcl9kYXRhX3Nsb3QgPSAtMTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHBlbmRpbmcgcmVwbHkgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gd2hlcmUgcmVwbHkgd2lsbCBhcnJpdmUKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBsZW5ndGggb2YgdGltZW91dCwgLTEgKG9yCisgKiAgI0RCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgZm9yIGRlZmF1bHQsCisgKiAgI0RCVVNfVElNRU9VVF9JTkZJTklURSBmb3Igbm8gdGltZW91dAorICogQHBhcmFtIHRpbWVvdXRfaGFuZGxlciB0aW1lb3V0IGhhbmRsZXIsIHRha2VzIHBlbmRpbmcgY2FsbCBhcyBkYXRhCisgKiBAcmV0dXJucyBhIG5ldyAjREJ1c1BlbmRpbmdDYWxsIG9yICNOVUxMIGlmIG5vIG1lbW9yeS4KKyAqLworREJ1c1BlbmRpbmdDYWxsKgorX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgdGltZW91dF9oYW5kbGVyKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworCisgIF9kYnVzX2Fzc2VydCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSk7CisgCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSkKKyAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyA9IF9EQlVTX0RFRkFVTFRfVElNRU9VVF9WQUxVRTsKKworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBwZW5kaW5nID0gZGJ1c19uZXcwIChEQnVzUGVuZGluZ0NhbGwsIDEpOworICAKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzICE9IERCVVNfVElNRU9VVF9JTkZJTklURSkKKyAgICB7CisgICAgICB0aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsIE5VTEwpOyAgCisKKyAgICAgIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICAgICAgZGJ1c19mcmVlIChwZW5kaW5nKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBwZW5kaW5nLT50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwZW5kaW5nLT50aW1lb3V0ID0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYXRvbWljX2luYyAoJnBlbmRpbmctPnJlZmNvdW50KTsKKyAgcGVuZGluZy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmcGVuZGluZy0+c2xvdF9saXN0KTsKKworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCAwLCAxLCAibmV3X3VubG9ja2VkIik7CisKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKy8qKgorICogU2V0cyB0aGUgcmVwbHkgb2YgYSBwZW5kaW5nIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwKKyAqIG9yIGlmIHRoZSBtZXNzYWdlIGlzICNOVUxMLCBieSB0aW1pbmcgb3V0IHRoZSBwZW5kaW5nIGNhbGwuCisgKiAKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGNvbXBsZXRlIHRoZSBjYWxsIHdpdGgsIG9yICNOVUxMCisgKiAgdG8gdGltZSBvdXQgdGhlIGNhbGwKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlKQoreworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBwZW5kaW5nLT50aW1lb3V0X2xpbmstPmRhdGE7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGVuZGluZy0+dGltZW91dF9saW5rKTsKKyAgICB9CisgIGVsc2UKKyAgICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBfZGJ1c192ZXJib3NlICgiICBoYW5kaW5nIG1lc3NhZ2UgJXAgKCVzKSB0byBwZW5kaW5nIGNhbGwgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gPworICAgICAgICAgICAgICAgICAibWV0aG9kIHJldHVybiIgOgorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SID8KKyAgICAgICAgICAgICAgICAgImVycm9yIiA6ICJvdGhlciB0eXBlIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAocGVuZGluZy0+cmVwbHkgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZy0+cmVwbHlfc2VyaWFsID09IGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisgIHBlbmRpbmctPnJlcGx5ID0gbWVzc2FnZTsKK30KKworLyoqCisgKiBDYWxscyBub3RpZmllciBmdW5jdGlvbiBmb3IgdGhlIHBlbmRpbmcgY2FsbAorICogYW5kIHNldHMgdGhlIGNhbGwgdG8gY29tcGxldGVkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfY29tcGxldGUgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgX2RidXNfYXNzZXJ0ICghcGVuZGluZy0+Y29tcGxldGVkKTsKKyAgCisgIHBlbmRpbmctPmNvbXBsZXRlZCA9IFRSVUU7CisKKyAgaWYgKHBlbmRpbmctPmZ1bmN0aW9uKQorICAgIHsKKyAgICAgIHZvaWQgKnVzZXJfZGF0YTsKKyAgICAgIHVzZXJfZGF0YSA9IGRidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhIChwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisgICAgICAKKyAgICAgICgqIHBlbmRpbmctPmZ1bmN0aW9uKSAocGVuZGluZywgdXNlcl9kYXRhKTsKKyAgICB9Cit9CisKKy8qKgorICogSWYgdGhlIHBlbmRpbmcgY2FsbCBoYXNuJ3QgYmVlbiB0aW1lZCBvdXQsIGFkZCBpdHMgdGltZW91dAorICogZXJyb3IgcmVwbHkgdG8gdGhlIGNvbm5lY3Rpb24ncyBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHRoZSBjYWxsIHdhcyBzZW50IHRvCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9xdWV1ZV90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uID09IHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgaWYgKHBlbmRpbmctPnRpbWVvdXRfbGluaykKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBwZW5kaW5nLT50aW1lb3V0X2xpbmspOworICAgICAgcGVuZGluZy0+dGltZW91dF9saW5rID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiBhIHRpbWVvdXQgaGFzIGJlZW4gYWRkZWQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgb3IgI0ZBTFNFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdCAKK19kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnRpbWVvdXRfYWRkZWQ7Cit9CisKKworLyoqCisgKiBTZXRzIHdldGhlciB0aGUgdGltZW91dCBoYXMgYmVlbiBhZGRlZAorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBpc19hZGRlZCB3aGV0aGVyIG9yIG5vdCBhIHRpbWVvdXQgaXMgYWRkZWQKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19hZGRlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworCisgIHBlbmRpbmctPnRpbWVvdXRfYWRkZWQgPSBpc19hZGRlZDsKK30KKworCisvKioKKyAqIFJldHJpdmVzIHRoZSB0aW1lb3V0CisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgYSB0aW1lb3V0IG9iamVjdCBvciBOVUxMIGlmIGNhbGwgaGFzIG5vIHRpbWVvdXQKKyAqLworREJ1c1RpbWVvdXQgKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnRpbWVvdXQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcmVwbHkncyBzZXJpYWwgbnVtYmVyCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgYSBzZXJpYWwgbnVtYmVyIGZvciB0aGUgcmVwbHkgb3IgMCAKKyAqLworZGJ1c191aW50MzJfdCAKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBlbmRpbmctPnJlcGx5X3NlcmlhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSdzIHNlcmlhbCBudW1iZXIKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2VyaWFsIHRoZSBzZXJpYWwgbnVtYmVyIAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBzZXJpYWwpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gMCk7CisKKyAgcGVuZGluZy0+cmVwbHlfc2VyaWFsID0gc2VyaWFsOworfQorCisvKioKKyAqIEdldHMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVuZGluZyBjYWxsCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisgCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHVybiBwZW5kaW5nLT5jb25uZWN0aW9uOworfQorCisvKioKKyAqIEdldHMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVuZGluZyBjYWxsCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisgCisgIHJldHVybiBwZW5kaW5nLT5jb25uZWN0aW9uOworfQorCisvKioKKyAqIFNldHMgdGhlIHJlcGx5IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwgdG8gYSB0aW1lb3V0IGVycm9yCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGVycm9yIHJlcGx5IHRvIAorICogQHBhcmFtIHNlcmlhbCBzZXJpYWwgbnVtYmVyIGZvciB0aGUgcmVwbHkKKyAqIEByZXR1cm4gI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICBzZXJpYWwpCit7IAorICBEQnVzTGlzdCAqcmVwbHlfbGluazsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19SRVBMWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSByZW1vdGUgYXBwbGljYXRpb24gZGlkIG5vdCBzZW5kIGEgcmVwbHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG1lc3NhZ2UgYnVzIHNlY3VyaXR5IHBvbGljeSBibG9ja2VkIHRoZSByZXBseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcmVwbHkgdGltZW91dCBleHBpcmVkLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gd2FzIGJyb2tlbi4iKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlcGx5X2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHJlcGx5KTsKKyAgaWYgKHJlcGx5X2xpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBpdCdzIE9LIHRvIHVucmVmIHRoaXMsIG5vdGhpbmcgdGhhdCBjb3VsZCBoYXZlIGF0dGFjaGVkIGEgY2FsbGJhY2sKKyAgICAgICAqIGhhcyBldmVyIHNlZW4gaXQgKi8KKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSByZXBseV9saW5rOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nLCBzZXJpYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogd2hpbGUgdGhlIGxvY2sgb24gaXRzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCitEQnVzUGVuZGluZ0NhbGwgKgorX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZwZW5kaW5nLT5yZWZjb3VudCk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF90cmFjZV9yZWYgKHBlbmRpbmcsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwKKyAgICAgICJyZWZfdW5sb2NrZWQiKTsKKworICByZXR1cm4gcGVuZGluZzsKK30KKworCitzdGF0aWMgdm9pZAorX2RidXNfcGVuZGluZ19jYWxsX2xhc3RfdW5yZWYgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIAorICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2Ugc2hvdWxkIGJlIGFscmVhZHkgZGV0YWNoZWQKKyAgICogZnJvbSB0aGUgY29ubmVjdGlvbiwgb3IgbmV2ZXIgYXR0YWNoZWQuCisgICAqLworICBfZGJ1c19hc3NlcnQgKCFwZW5kaW5nLT50aW1lb3V0X2FkZGVkKTsgIAorCisgIGNvbm5lY3Rpb24gPSBwZW5kaW5nLT5jb25uZWN0aW9uOworCisgIC8qIHRoaXMgYXNzdW1lcyB3ZSBhcmVuJ3QgaG9sZGluZyBjb25uZWN0aW9uIGxvY2suLi4gKi8KKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJnBlbmRpbmctPnNsb3RfbGlzdCk7CisKKyAgaWYgKHBlbmRpbmctPnRpbWVvdXQgIT0gTlVMTCkKKyAgICBfZGJ1c190aW1lb3V0X3VucmVmIChwZW5kaW5nLT50aW1lb3V0KTsKKyAgICAgIAorICBpZiAocGVuZGluZy0+dGltZW91dF9saW5rKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoKERCdXNNZXNzYWdlICopcGVuZGluZy0+dGltZW91dF9saW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwZW5kaW5nLT50aW1lb3V0X2xpbmspOworICAgICAgcGVuZGluZy0+dGltZW91dF9saW5rID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHBlbmRpbmctPnJlcGx5KQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocGVuZGluZy0+cmVwbHkpOworICAgICAgcGVuZGluZy0+cmVwbHkgPSBOVUxMOworICAgIH0KKyAgICAgIAorICBkYnVzX2ZyZWUgKHBlbmRpbmcpOworCisgIGRidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90ICgmbm90aWZ5X3VzZXJfZGF0YV9zbG90KTsKKworICAvKiBjb25uZWN0aW9uIGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkLiAqLworICAvKiBGcmVlIHRoZSBjb25uZWN0aW9uIGxhc3QgdG8gYXZvaWQgYSB3ZWlyZCBzdGF0ZSB3aGlsZQorICAgKiBjYWxsaW5nIG91dCB0byBhcHBsaWNhdGlvbiBjb2RlIHdoZXJlIHRoZSBwZW5kaW5nIGV4aXN0cworICAgKiBidXQgbm90IHRoZSBjb25uZWN0aW9uLgorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBwZW5kaW5nIGNhbGwsCisgKiBmcmVlaW5nIGl0IGlmIHRoZSBjb3VudCByZWFjaGVzIDAuIEFzc3VtZXMKKyAqIGNvbm5lY3Rpb24gbG9jayBpcyBhbHJlYWR5IGhlbGQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2sgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmcGVuZGluZy0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCBvbGRfcmVmY291bnQsCisgICAgICBvbGRfcmVmY291bnQgLSAxLCAidW5yZWZfYW5kX3VubG9jayIpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgX2RidXNfcGVuZGluZ19jYWxsX2xhc3RfdW5yZWYgKHBlbmRpbmcpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBwZW5kaW5nIGNhbGwgaGFzIHJlY2VpdmVkIGEgcmVwbHkKKyAqIHlldCwgb3Igbm90LiBBc3N1bWVzIGNvbm5lY3Rpb24gbG9jayBpcyBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgcmVwbHkgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpCit7CisgIHJldHVybiBwZW5kaW5nLT5jb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3IgPQorICBfREJVU19EQVRBX1NMT1RfQUxMT0NBVE9SX0lOSVQgKF9EQlVTX0xPQ0tfTkFNRSAocGVuZGluZ19jYWxsX3Nsb3RzKSk7CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhICNEQnVzUGVuZGluZ0NhbGwsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgcGVuZGluZyBjYWxsIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworCisgIC8qIERyb3AgbG9ja3MgdG8gY2FsbCBvdXQgdG8gYXBwIGNvZGUgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzUGVuZGluZ0NhbGwgREJ1c1BlbmRpbmdDYWxsCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBlbmRpbmcgcmVwbHkgdG8gYSBtZXRob2QgY2FsbCBtZXNzYWdlCisgKgorICogQSBEQnVzUGVuZGluZ0NhbGwgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbgorICogZXhwZWN0ZWQgcmVwbHkuIEEgI0RCdXNQZW5kaW5nQ2FsbCBjYW4gYmUgY3JlYXRlZAorICogd2hlbiB5b3Ugc2VuZCBhIG1lc3NhZ2UgdGhhdCBzaG91bGQgaGF2ZSBhIHJlcGx5LgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVElNRU9VVF9JTkZJTklURQorICoKKyAqIEFuIGludGVnZXIgY29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIHRpbWVvdXQuIFRoaXMgaGFzIHRoZQorICogbnVtZXJpYyB2YWx1ZSAweDdmZmZmZmZmICh0aGUgbGFyZ2VzdCAzMi1iaXQgc2lnbmVkIGludGVnZXIpLgorICoKKyAqIEZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIEQtQnVzIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjQuMTIsIHVzZQorICogMHg3ZmZmZmZmZiwgb3IgSU5UMzJfTUFYIChhc3N1bWluZyB5b3VyIHBsYXRmb3JtIGhhcyBpdCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVAorICoKKyAqIEFuIGludGVnZXIgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcmVxdWVzdCB0byB1c2UgdGhlIGRlZmF1bHQgdGltZW91dC4KKyAqIFRoaXMgaGFzIG51bWVyaWMgdmFsdWUgLTEuCisgKgorICogRm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggRC1CdXMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEuNC4xMiwgdXNlIGEKKyAqIGxpdGVyYWwgLTEuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzUGVuZGluZ0NhbGwKKyAqCisgKiBPcGFxdWUgZGF0YSB0eXBlIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgcGVuZGluZy4KKyAqLworCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIHBlbmRpbmcgY2FsbC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICogQHJldHVybnMgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqLworREJ1c1BlbmRpbmdDYWxsICoKK2RidXNfcGVuZGluZ19jYWxsX3JlZiAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmcGVuZGluZy0+cmVmY291bnQpOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCArIDEsCisgICAgICAicmVmIik7CisKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogZnJlZWluZyBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX3VucmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJnBlbmRpbmctPnJlZmNvdW50KTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3RyYWNlX3JlZiAocGVuZGluZywgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgLSAxLAorICAgICAgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9sYXN0X3VucmVmKHBlbmRpbmcpOworfQorCisvKioKKyAqIFNldHMgYSBub3RpZmljYXRpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlcGx5IGlzCisgKiByZWNlaXZlZCBvciB0aGUgcGVuZGluZyBjYWxsIHRpbWVzIG91dC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcGFyYW0gZnVuY3Rpb24gbm90aWZpZXIgZnVuY3Rpb24KKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIG5vdGlmaWVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV91c2VyX2RhdGEgZnVuY3Rpb24gdG8gZnJlZSB0aGUgdXNlciBkYXRhCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgIGZyZWVfdXNlcl9kYXRhKQoreworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICAvKiBjb3VsZCBpbnZva2UgYXBwbGljYXRpb24gY29kZSEgKi8KKyAgaWYgKCFfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGFfdW5sb2NrZWQgKHBlbmRpbmcsIG5vdGlmeV91c2VyX2RhdGFfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgZnJlZV91c2VyX2RhdGEpKQorICAgIGdvdG8gb3V0OworICAKKyAgcGVuZGluZy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIENhbmNlbHMgdGhlIHBlbmRpbmcgY2FsbCwgc3VjaCB0aGF0IGFueSByZXBseSBvciBlcnJvciByZWNlaXZlZAorICogd2lsbCBqdXN0IGJlIGlnbm9yZWQuICBEcm9wcyB0aGUgZGJ1cyBsaWJyYXJ5J3MgaW50ZXJuYWwgcmVmZXJlbmNlCisgKiB0byB0aGUgI0RCdXNQZW5kaW5nQ2FsbCBzbyB3aWxsIGZyZWUgdGhlIGNhbGwgaWYgbm9ib2R5IGVsc2UgaXMKKyAqIGhvbGRpbmcgYSByZWZlcmVuY2UuIEhvd2V2ZXIgeW91IHVzdWFsbHkgZ2V0IGEgcmVmZXJlbmNlIGZyb20KKyAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkoKSBzbyBwcm9iYWJseSB5b3VyIGFwcCBvd25zIGEgcmVmCisgKiBhbHNvLgorICoKKyAqIE5vdGUgdGhhdCBjYW5jZWxpbmcgYSBwZW5kaW5nIGNhbGwgd2lsbCA8ZW0+bm90PC9lbT4gc2ltdWxhdGUgYQorICogdGltZWQtb3V0IGNhbGw7IGlmIGEgY2FsbCB0aW1lcyBvdXQsIHRoZW4gYSB0aW1lb3V0IGVycm9yIHJlcGx5IGlzCisgKiByZWNlaXZlZC4gSWYgeW91IGNhbmNlbCB0aGUgY2FsbCwgbm8gcmVwbHkgaXMgcmVjZWl2ZWQgdW5sZXNzIHRoZQorICogdGhlIHJlcGx5IHdhcyBhbHJlYWR5IHJlY2VpdmVkIGJlZm9yZSB5b3UgY2FuY2VsZWQuCisgKiAKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3BlbmRpbmdfY2FsbCAocGVuZGluZy0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgcGVuZGluZyBjYWxsIGhhcyByZWNlaXZlZCBhIHJlcGx5CisgKiB5ZXQsIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHJlcGx5IGhhcyBiZWVuIHJlY2VpdmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfYm9vbF90IGNvbXBsZXRlZDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgY29tcGxldGVkID0gcGVuZGluZy0+Y29tcGxldGVkOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGNvbXBsZXRlZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSByZXBseSwgb3IgcmV0dXJucyAjTlVMTCBpZiBub25lIGhhcyBiZWVuIHJlY2VpdmVkCisgKiB5ZXQuIE93bmVyc2hpcCBvZiB0aGUgcmVwbHkgbWVzc2FnZSBwYXNzZXMgdG8gdGhlIGNhbGxlci4gVGhpcworICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHBlbmRpbmcgY2FsbCwgc2luY2UgdGhlIHJlcGx5CisgKiBtZXNzYWdlIGlzIHRyYW5mZXJyZWQgdG8gdGhlIGNhbGxlci4KKyAqIAorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHJldHVybnMgdGhlIHJlcGx5IG1lc3NhZ2Ugb3IgI05VTEwuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZy0+Y29tcGxldGVkLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nLT5yZXBseSAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IHBlbmRpbmctPnJlcGx5OworICBwZW5kaW5nLT5yZXBseSA9IE5VTEw7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsICJkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSIpOworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBCbG9jayB1bnRpbCB0aGUgcGVuZGluZyBjYWxsIGlzIGNvbXBsZXRlZC4gIFRoZSBibG9ja2luZyBpcyBhcyB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOyBpdCBkb2VzIG5vdCBlbnRlciB0aGUKKyAqIG1haW4gbG9vcCBvciBwcm9jZXNzIG90aGVyIG1lc3NhZ2VzLCBpdCBzaW1wbHkgd2FpdHMgZm9yIHRoZSByZXBseQorICogaW4gcXVlc3Rpb24uCisgKgorICogSWYgdGhlIHBlbmRpbmcgY2FsbCBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiBpbW1lZGlhdGVseS4KKyAqCisgKiBAdG9kbyB3aGVuIHlvdSBzdGFydCBibG9ja2luZywgdGhlIHRpbWVvdXQgaXMgcmVzZXQsIGJ1dCBpdCBzaG91bGQKKyAqIHJlYWxseSBvbmx5IHVzZSB0aW1lIHJlbWFpbmluZyBzaW5jZSB0aGUgcGVuZGluZyBjYWxsIHdhcyBjcmVhdGVkLgorICogVGhpcyByZXF1aXJlcyBzdG9yaW5nIHRpbWVzdGFtcHMgaW5zdGVhZCBvZiBpbnRlcnZhbHMgaW4gdGhlIHRpbWVvdXQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzUGVuZGluZ0NhbGwuIFRoZSBhbGxvY2F0ZWQgSUQgbWF5IHRoZW4gYmUgdXNlZAorICogd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSgpIGFuZCBkYnVzX3BlbmRpbmdfY2FsbF9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKiAKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNQZW5kaW5nQ2FsbCBvYmplY3RzIHdpbGwKKyAqIGhhdmUgYSBzbG90IHdpdGggdGhlIGdpdmVuIGludGVnZXIgSUQgcmVzZXJ2ZWQuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNsb3QKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3RfcCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yICNEQnVzUGVuZGluZ0NhbGwgZGF0YSBzbG90cy4KKyAqIGRidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhKCkgYW5kIGRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhKCkgbWF5CisgKiBubyBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nCisgKiBEQnVzUGVuZGluZ0NhbGwgb2JqZWN0cyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlICNEQnVzUGVuZGluZ0NhbGwgaXMKKyAqIGZpbmFsaXplZCwgYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUgcmVwbGFjZWQgaWYKKyAqIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuICBXaGVuIHRoZSByZWZjb3VudCBvbiB0aGUKKyAqIHBhc3NlZC1pbiBzbG90IHJlYWNoZXMgMCwgaXQgaXMgc2V0IHRvIC0xLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBzdG9yaW5nIHRoZSBzbG90IHRvIGRlYWxsb2NhdGUKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2xvdF9wICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2ZyZWUgKCZzbG90X2FsbG9jYXRvciwgc2xvdF9wKTsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgI0RCdXNQZW5kaW5nQ2FsbCwgYWxvbmcKKyAqIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZworICogdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQgYWdhaW4sIG9yIHdoZW4KKyAqIHRoZSBwZW5kaW5nIGNhbGwgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3QgPj0gMCwgRkFMU0UpOworCisgIAorICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICByZXR2YWwgPSBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGFfdW5sb2NrZWQgKHBlbmRpbmcsIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK2RidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhIChEQnVzUGVuZGluZ0NhbGwgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgc2xvdCkKK3sKKyAgdm9pZCAqcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmggYi9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzN2VjMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaApAQCAtMCwwICsxLDc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGVuZGluZy1jYWxsLmggT2JqZWN0IHJlcHJlc2VudGluZyBhIGNhbGwgaW4gcHJvZ3Jlc3MuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19QRU5ESU5HX0NBTExfSAorI2RlZmluZSBEQlVTX1BFTkRJTkdfQ0FMTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNQZW5kaW5nQ2FsbAorICogQHsKKyAqLworCisjZGVmaW5lIERCVVNfVElNRU9VVF9JTkZJTklURSAoKGludCkgMHg3ZmZmZmZmZikKKyNkZWZpbmUgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUICgtMSkKKworREJVU19FWFBPUlQKK0RCdXNQZW5kaW5nQ2FsbCogZGJ1c19wZW5kaW5nX2NhbGxfcmVmICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgIGZyZWVfdXNlcl9kYXRhKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5ICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9nZXRfZGF0YSAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfUEVORElOR19DQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1waXBlLXVuaXguYyBiL2RidXMvZGJ1cy1waXBlLXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM1NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXBpcGUtdW5peC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1waXBlLXVuaXguYyB1bml4IHJlbGF0ZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqCisgKiB3cml0ZSBkYXRhIHRvIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BpcGVfd3JpdGUgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgd3JpdHRlbjsKKyAgCisgIHdyaXR0ZW4gPSBfZGJ1c193cml0ZSAocGlwZS0+ZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisgIGlmICh3cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJXcml0aW5nIHRvIHBpcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qKgorICogY2xvc2UgYSBwaXBlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2ludAorX2RidXNfcGlwZV9jbG9zZSAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGlmICghX2RidXNfY2xvc2UgKHBpcGUtPmZkLCBlcnJvcikpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAocGlwZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtcGlwZS13aW4uYyBiL2RidXMvZGJ1cy1waXBlLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2MyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcGlwZS13aW4uYwpAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorCisvKioKKyAqIHdyaXRlIGRhdGEgdG8gYSBwaXBlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfcGlwZV93cml0ZSAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmJ1ZmZlcl9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChidWZmZXIpOworICBpbnQgd3JpdHRlbjsKKworICB3cml0dGVuID0gX3dyaXRlIChwaXBlLT5mZCwgYnVmZmVyX2MgKyBzdGFydCwgbGVuKTsKKworICBpZiAod3JpdHRlbiA+PSAwKQorICAgIHJldHVybiB3cml0dGVuOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAiV3JpdGluZyB0byBwaXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIGNsb3NlIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworaW50CitfZGJ1c19waXBlX2Nsb3NlICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKF9jbG9zZSAocGlwZS0+ZmQpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIHBpcGUgZmQgJWQ6ICVzIiwgcGlwZS0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfcGlwZV9pbnZhbGlkYXRlIChwaXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1waXBlLmMgYi9kYnVzL2RidXMtcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNWZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcGlwZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1waXBlLmMgcGlwZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworLyoKKyAqIGluaXQgYSBwaXBlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBpbml0IGZyb20gCisgKi8KK3ZvaWQKK19kYnVzX3BpcGVfaW5pdCAoREJ1c1BpcGUgKnBpcGUsCisgICAgICAgICAgICAgICAgIGludCAgICAgICBmZCkKK3sKKyAgcGlwZS0+ZmQgPSBmZDsKK30KKworLyoqCisgKiBpbml0IGEgcGlwZSB3aXRoIHN0ZG91dAorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlCisgKi8KK3ZvaWQKK19kYnVzX3BpcGVfaW5pdF9zdGRvdXQgKERCdXNQaXBlICpwaXBlKQoreworICBfZGJ1c19waXBlX2luaXQgKHBpcGUsIDEpOworfQorCisvKioKKyAqIGNoZWNrIGlmIGEgcGlwZSBpcyB2YWxpZDsgcGlwZXMgY2FuIGJlIHNldCBpbnZhbGlkLCBzaW1pbGFyIHRvCisgKiBhIC0xIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHBpcGUgaXMgbm90IHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19waXBlX2lzX3ZhbGlkKERCdXNQaXBlICpwaXBlKQoreworICByZXR1cm4gcGlwZS0+ZmQgPj0gMDsKK30KKworLyoqCisgKiBDaGVjayBpZiBhIHBpcGUgaXMgc3Rkb3V0IG9yIHN0ZGVyci4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHJldHVybnMgI1RSVUUgaWYgcGlwZSBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIG91dC9lcnIgY2hhbm5lbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAoREJ1c1BpcGUgKnBpcGUpCit7CisgIHJldHVybiBwaXBlLT5mZCA9PSAxIHx8IHBpcGUtPmZkID09IDI7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBwaXBlIHRvIGFuIGludmFsaWQgdmFsdWUuCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZQorICovCit2b2lkCitfZGJ1c19waXBlX2ludmFsaWRhdGUgKERCdXNQaXBlICpwaXBlKQoreworICBwaXBlLT5mZCA9IC0xOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXBpcGUuaCBiL2RidXMvZGJ1cy1waXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MjRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1waXBlLmgKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuaCBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfUElQRV9ICisjZGVmaW5lIERCVVNfUElQRV9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworc3RydWN0IERCdXNQaXBlIHsKKyAgaW50IGZkOworfTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfcGlwZV9pbml0ICAgICAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBmZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfcGlwZV93cml0ZSAgICAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgIF9kYnVzX3BpcGVfY2xvc2UgICAgICAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfcGlwZV9pc192YWxpZCAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1wcm90b2NvbC5oIGIvZGJ1cy9kYnVzLXByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1wcm90b2NvbC5oCkBAIC0wLDAgKzEsNDc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcHJvdG9jb2wuaCAgRC1CdXMgcHJvdG9jb2wgY29uc3RhbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19QUk9UT0NPTF9ICisjZGVmaW5lIERCVVNfUFJPVE9DT0xfSAorCisvKiBEb24ndCBpbmNsdWRlIGFueXRoaW5nIGluIGhlcmUgZnJvbSBhbnl3aGVyZSBlbHNlLiBJdCdzCisgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFueSByYW5kb20gbGlicmFyeS4KKyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNpZiAwCit9IC8qIGF2b2lkcyBjb25mdXNpbmcgZW1hY3MgaW5kZW50YXRpb24gKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIE5vcm1hbGx5IGRvY3MgYXJlIGluIC5jIGZpbGVzLCBidXQgdGhlcmUgaXNuJ3QgYSAuYyBmaWxlIGZvciB0aGlzLiAqLworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Byb3RvY29sIFByb3RvY29sIGNvbnN0YW50cworICogQGluZ3JvdXAgIERCdXMKKyAqCisgKiBAYnJpZWYgRGVmaW5lcyBjb25zdGFudHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIEQtQnVzIHByb3RvY29sCisgKgorICogVGhpcyBoZWFkZXIgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkgbGlicmFyeSwgbm90IG9ubHkgbGliZGJ1cy4KKyAqCisgKiBAeworICovCisKKworLyogTWVzc2FnZSBieXRlIG9yZGVyICovCisjZGVmaW5lIERCVVNfTElUVExFX0VORElBTiAoJ2wnKSAgLyoqPCBDb2RlIG1hcmtpbmcgTFNCLWZpcnN0IGJ5dGUgb3JkZXIgaW4gdGhlIHdpcmUgcHJvdG9jb2wuICovCisjZGVmaW5lIERCVVNfQklHX0VORElBTiAgICAoJ0InKSAgLyoqPCBDb2RlIG1hcmtpbmcgTVNCLWZpcnN0IGJ5dGUgb3JkZXIgaW4gdGhlIHdpcmUgcHJvdG9jb2wuICovCisKKy8qKiBQcm90b2NvbCB2ZXJzaW9uLiAqLworI2RlZmluZSBEQlVTX01BSk9SX1BST1RPQ09MX1ZFUlNJT04gMQorCisvKiogVHlwZSBjb2RlIHRoYXQgaXMgbmV2ZXIgZXF1YWwgdG8gYSBsZWdpdGltYXRlIHR5cGUgY29kZSAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5WQUxJRCAgICAgICAoKGludCkgJ1wwJykKKy8qKiAjREJVU19UWVBFX0lOVkFMSUQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVkFMSURfQVNfU1RSSU5HICAgICAgICAiXDAiCisKKy8qIFByaW1pdGl2ZSB0eXBlcyAqLworLyoqIFR5cGUgY29kZSBtYXJraW5nIGFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JZVEUgICAgICAgICAgKChpbnQpICd5JykKKy8qKiAjREJVU19UWVBFX0JZVEUgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HICAgICAgICAgICAieSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIGJvb2xlYW4gKi8KKyNkZWZpbmUgREJVU19UWVBFX0JPT0xFQU4gICAgICAgKChpbnQpICdiJykKKy8qKiAjREJVU19UWVBFX0JPT0xFQU4gYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JPT0xFQU5fQVNfU1RSSU5HICAgICAgICAiYiIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDE2LWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMTYgICAgICAgICAoKGludCkgJ24nKQorLyoqICNEQlVTX1RZUEVfSU5UMTYgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDE2X0FTX1NUUklORyAgICAgICAgICAibiIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMTYgICAgICAgICgoaW50KSAncScpCisvKiogI0RCVVNfVFlQRV9VSU5UMTYgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcgICAgICAgICAicSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMzIgICAgICAgICAoKGludCkgJ2knKQorLyoqICNEQlVTX1RZUEVfSU5UMzIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyAgICAgICAgICAiaSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMzIgICAgICAgICgoaW50KSAndScpCisvKiogI0RCVVNfVFlQRV9VSU5UMzIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcgICAgICAgICAidSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UNjQgICAgICAgICAoKGludCkgJ3gnKQorLyoqICNEQlVTX1RZUEVfSU5UNjQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDY0X0FTX1NUUklORyAgICAgICAgICAieCIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UNjQgICAgICAgICgoaW50KSAndCcpCisvKiogI0RCVVNfVFlQRV9VSU5UNjQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQ2NF9BU19TVFJJTkcgICAgICAgICAidCIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhbiA4LWJ5dGUgZG91YmxlIGluIElFRUUgNzU0IGZvcm1hdCAqLworI2RlZmluZSBEQlVTX1RZUEVfRE9VQkxFICAgICAgICAoKGludCkgJ2QnKQorLyoqICNEQlVTX1RZUEVfRE9VQkxFIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9ET1VCTEVfQVNfU1RSSU5HICAgICAgICAgImQiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBVVEYtOCBlbmNvZGVkLCBudWwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZyAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSSU5HICAgICAgICAoKGludCkgJ3MnKQorLyoqICNEQlVTX1RZUEVfU1RSSU5HIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HICAgICAgICAgInMiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyBvYmplY3QgcGF0aCAqLworI2RlZmluZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEggICAoKGludCkgJ28nKQorLyoqICNEQlVTX1RZUEVfT0JKRUNUX1BBVEggYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX09CSkVDVF9QQVRIX0FTX1NUUklORyAgICAibyIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfVFlQRV9TSUdOQVRVUkUgICAgICgoaW50KSAnZycpCisvKiogI0RCVVNfVFlQRV9TSUdOQVRVUkUgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NJR05BVFVSRV9BU19TVFJJTkcgICAgICAiZyIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIHVuaXggZmlsZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIERCVVNfVFlQRV9VTklYX0ZEICAgICAgKChpbnQpICdoJykKKy8qKiAjREJVU19UWVBFX1VOSVhfRkQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VOSVhfRkRfQVNfU1RSSU5HICAgICAgICAiaCIKKworLyogQ29tcG91bmQgdHlwZXMgKi8KKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIGFycmF5IHR5cGUgKi8KKyNkZWZpbmUgREJVU19UWVBFX0FSUkFZICAgICAgICAgKChpbnQpICdhJykKKy8qKiAjREJVU19UWVBFX0FSUkFZIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgICAgICAgICAgImEiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyB2YXJpYW50IHR5cGUgKi8KKyNkZWZpbmUgREJVU19UWVBFX1ZBUklBTlQgICAgICAgKChpbnQpICd2JykKKy8qKiAjREJVU19UWVBFX1ZBUklBTlQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HICAgICAgICAidiIKKworLyoqIFNUUlVDVCBhbmQgRElDVF9FTlRSWSBhcmUgc29ydCBvZiBzcGVjaWFsIHNpbmNlIHRoZWlyIGNvZGVzIGNhbid0CisgKiBhcHBlYXIgaW4gYSB0eXBlIHN0cmluZywgaW5zdGVhZAorICogREJVU19TVFJVQ1RfQkVHSU5fQ0hBUi9EQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiBoYXZlIHRvIGFwcGVhcgorICovCisvKiogVHlwZSBjb2RlIHVzZWQgdG8gcmVwcmVzZW50IGEgc3RydWN0OyBob3dldmVyLCB0aGlzIHR5cGUgY29kZSBkb2VzIG5vdCBhcHBlYXIKKyAqIGluIHR5cGUgc2lnbmF0dXJlcywgaW5zdGVhZCAjREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiBhbmQgI0RCVVNfU1RSVUNUX0VORF9DSEFSIHdpbGwKKyAqIGFwcGVhciBpbiBhIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSVUNUICAgICAgICAoKGludCkgJ3InKQorLyoqICNEQlVTX1RZUEVfU1RSVUNUIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJVQ1RfQVNfU1RSSU5HICAgICAgICAgInIiCisvKiogVHlwZSBjb2RlIHVzZWQgdG8gcmVwcmVzZW50IGEgZGljdCBlbnRyeTsgaG93ZXZlciwgdGhpcyB0eXBlIGNvZGUgZG9lcyBub3QgYXBwZWFyCisgKiBpbiB0eXBlIHNpZ25hdHVyZXMsIGluc3RlYWQgI0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSIGFuZCAjREJVU19ESUNUX0VOVFJZX0VORF9DSEFSIHdpbGwKKyAqIGFwcGVhciBpbiBhIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX1RZUEVfRElDVF9FTlRSWSAgICAoKGludCkgJ2UnKQorLyoqICNEQlVTX1RZUEVfRElDVF9FTlRSWSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfRElDVF9FTlRSWV9BU19TVFJJTkcgICAgICJlIgorCisvKiogRG9lcyBub3QgaW5jbHVkZSAjREJVU19UWVBFX0lOVkFMSUQsICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSLCAjREJVU19TVFJVQ1RfRU5EX0NIQVIsCisgKiAjREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIsIG9yICNEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgLSBpLmUuIGl0IGlzIHRoZSBudW1iZXIgb2YKKyAqIHZhbGlkIHR5cGVzLCBub3QgdGhlIG51bWJlciBvZiBkaXN0aW5jdCBjaGFyYWN0ZXJzIHRoYXQgbWF5IGFwcGVhciBpbiBhIHR5cGUgc2lnbmF0dXJlLgorICovCisjZGVmaW5lIERCVVNfTlVNQkVSX09GX1RZUEVTICAgICgxNikKKworLyogY2hhcmFjdGVycyBvdGhlciB0aGFuIHR5cGVjb2RlcyB0aGF0IGFwcGVhciBpbiB0eXBlIHNpZ25hdHVyZXMgKi8KKworLyoqIENvZGUgbWFya2luZyB0aGUgc3RhcnQgb2YgYSBzdHJ1Y3QgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIgICAoKGludCkgJygnKQorLyoqICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HICAgIigiCisvKiogQ29kZSBtYXJraW5nIHRoZSBlbmQgb2YgYSBzdHJ1Y3QgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0VORF9DSEFSICAgICAoKGludCkgJyknKQorLyoqICNEQlVTX1NUUlVDVF9FTkRfQ0hBUiBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcgICAgICIpIgorLyoqIENvZGUgbWFya2luZyB0aGUgc3RhcnQgb2YgYSBkaWN0IGVudHJ5IHR5cGUgaW4gYSB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiAgICgoaW50KSAneycpCisvKiogI0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyAgICJ7IgorLyoqIENvZGUgbWFya2luZyB0aGUgZW5kIG9mIGEgZGljdCBlbnRyeSB0eXBlIGluIGEgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSICAgICAoKGludCkgJ30nKQorLyoqICNEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSX0FTX1NUUklORyAgICAgIn0iCisKKy8qKiBNYXggbGVuZ3RoIGluIGJ5dGVzIG9mIGEgYnVzIG5hbWUsIGludGVyZmFjZSwgb3IgbWVtYmVyIChub3Qgb2JqZWN0CisgKiBwYXRoLCBwYXRocyBhcmUgdW5saW1pdGVkKS4gVGhpcyBpcyBsaW1pdGVkIGJlY2F1c2UgbG90cyBvZiBzdHVmZgorICogaXMgTyhuKSBpbiB0aGlzIG51bWJlciwgcGx1cyBpdCB3b3VsZCBiZSBvYm5veGlvdXMgdG8gdHlwZSBpbiBhCisgKiBwYXJhZ3JhcGgtbG9uZyBtZXRob2QgbmFtZSBzbyBtb3N0IGxpa2VseSBzb21ldGhpbmcgbGlrZSB0aGF0IHdvdWxkCisgKiBiZSBhbiBleHBsb2l0LgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCAyNTUKKworLyoqIFRoaXMgb25lIGlzIDI1NSBzbyBpdCBmaXRzIGluIGEgYnl0ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fU0lHTkFUVVJFX0xFTkdUSCAyNTUKKworLyoqIE1heCBsZW5ndGggb2YgYSBtYXRjaCBydWxlIHN0cmluZzsgdG8ga2VlcCBwZW9wbGUgZnJvbSBob3NpbmcgdGhlCisgKiBkYWVtb24gd2l0aCBzb21lIGh1Z2UgcnVsZQorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCAxMDI0CisKKy8qKiBNYXggYXJnIG51bWJlciB5b3UgY2FuIG1hdGNoIG9uIGluIGEgbWF0Y2ggcnVsZSwgZS5nLgorICogYXJnMD0naGVsbG8nIGlzIE9LLCBhcmczNDg5NzIwOTg3PSdoZWxsbycgaXMgbm90CisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUiA2MworCisvKiogTWF4IGxlbmd0aCBvZiBhIG1hcnNoYWxlZCBhcnJheSBpbiBieXRlcyAoNjRNLCAyXjI2KSBXZSB1c2Ugc2lnbmVkCisgKiBpbnQgZm9yIGxlbmd0aHMgc28gbXVzdCBiZSBJTlRfTUFYIG9yIGxlc3MuICBXZSBuZWVkIHNvbWV0aGluZyBhCisgKiBiaXQgc21hbGxlciB0aGFuIElOVF9NQVggYmVjYXVzZSB0aGUgYXJyYXkgaXMgaW5zaWRlIGEgbWVzc2FnZSB3aXRoCisgKiBoZWFkZXIgaW5mbywgZXRjLiAgc28gYW4gSU5UX01BWCBhcnJheSB3b3VsZG4ndCBhbGxvdyB0aGUgbWVzc2FnZQorICogb3ZlcmhlYWQuICBUaGUgNjRNIG51bWJlciBpcyBhbiBhdHRlbXB0IGF0IGEgbGFyZ2VyIG51bWJlciB0aGFuCisgKiB3ZSdkIHJlYXNvbmFibHkgZXZlciB1c2UsIGJ1dCBzbWFsbCBlbm91Z2ggdGhhdCB5b3VyIGJ1cyB3b3VsZCBjaGV3CisgKiB0aHJvdWdoIGl0IGZhaXJseSBxdWlja2x5IHdpdGhvdXQgbG9ja2luZyB1cCBmb3JldmVyLiBJZiB5b3UgaGF2ZQorICogZGF0YSB0aGF0J3MgbGlrZWx5IHRvIGJlIGxhcmdlciB0aGFuIHRoaXMsIHlvdSBzaG91bGQgcHJvYmFibHkgYmUKKyAqIHNlbmRpbmcgaXQgaW4gbXVsdGlwbGUgaW5jcmVtZW50YWwgbWVzc2FnZXMgYW55aG93LgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEggKDY3MTA4ODY0KQorLyoqIE51bWJlciBvZiBiaXRzIHlvdSBuZWVkIGluIGFuIHVuc2lnbmVkIHRvIHN0b3JlIHRoZSBtYXggYXJyYXkgc2l6ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIX0JJVFMgMjYKKworLyoqIFRoZSBtYXhpbXVtIHRvdGFsIG1lc3NhZ2Ugc2l6ZSBpbmNsdWRpbmcgaGVhZGVyIGFuZCBib2R5OyBzaW1pbGFyCisgKiByYXRpb25hbGUgdG8gbWF4IGFycmF5IHNpemUuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIChEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIICogMikKKy8qKiBOdW1iZXIgb2YgYml0cyB5b3UgbmVlZCBpbiBhbiB1bnNpZ25lZCB0byBzdG9yZSB0aGUgbWF4IG1lc3NhZ2Ugc2l6ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEhfQklUUyAyNworCisvKiogVGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIGluIGEgbWVzc2FnZS4gU2ltaWxhcgorICogcmF0aW9uYWxlIGFzIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSC4gSG93ZXZlciB3ZSBkaXZpZGUgYnkgZm91cgorICogZ2l2ZW4gdGhhdCBvbmUgZmQgaXMgYW4gaW50IGFuZCBoZW5jZSBhdCBsZWFzdCAzMiBiaXRzLgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTIChEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgvNCkKKy8qKiBOdW1iZXIgb2YgYml0cyB5b3UgbmVlZCBpbiBhbiB1bnNpZ25lZCB0byBzdG9yZSB0aGUgbWF4IG1lc3NhZ2UgdW5peCBmZHMgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFNfQklUUyAoREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIX0JJVFMtMikKKworLyoqIERlcHRoIG9mIHJlY3Vyc2lvbiBpbiB0aGUgdHlwZSB0cmVlLiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgbGltaXRlZAorICogdG8gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEggc2luY2UgeW91IGNvdWxkIG9ubHkgaGF2ZSBhbiBhcnJheQorICogb2YgYXJyYXkgb2YgYXJyYXkgb2YgLi4uIHRoYXQgZml0IGluIHRoZSBtYXggc2lnbmF0dXJlLiAgQnV0IHRoYXQncworICogcHJvYmFibHkgYSBiaXQgdG9vIGxhcmdlLgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCAzMgorCisvKiBUeXBlcyBvZiBtZXNzYWdlICovCisKKy8qKiBUaGlzIHZhbHVlIGlzIG5ldmVyIGEgdmFsaWQgbWVzc2FnZSB0eXBlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAgICAgICAwCisvKiogTWVzc2FnZSB0eXBlIG9mIGEgbWV0aG9kIGNhbGwgbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICAgMQorLyoqIE1lc3NhZ2UgdHlwZSBvZiBhIG1ldGhvZCByZXR1cm4gbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gMgorLyoqIE1lc3NhZ2UgdHlwZSBvZiBhbiBlcnJvciByZXBseSBtZXNzYWdlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfRVJST1IgICAgICAgICAzCisvKiogTWVzc2FnZSB0eXBlIG9mIGEgc2lnbmFsIG1lc3NhZ2UsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgICAgICAgIDQKKworI2RlZmluZSBEQlVTX05VTV9NRVNTQUdFX1RZUEVTICAgICAgICAgIDUKKworLyogSGVhZGVyIGZsYWdzICovCisKKy8qKiBJZiBzZXQsIHRoaXMgZmxhZyBtZWFucyB0aGF0IHRoZSBzZW5kZXIgb2YgYSBtZXNzYWdlIGRvZXMgbm90IGNhcmUgYWJvdXQgZ2V0dGluZworICogYSByZXBseSwgc28gdGhlIHJlY2lwaWVudCBuZWVkIG5vdCBzZW5kIG9uZS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVEIDB4MQorLyoqCisgKiBJZiBzZXQsIHRoaXMgZmxhZyBtZWFucyB0aGF0IGV2ZW4gaWYgdGhlIG1lc3NhZ2UgYnVzIGtub3dzIGhvdyB0byBzdGFydCBhbiBvd25lciBmb3IKKyAqIHRoZSBkZXN0aW5hdGlvbiBidXMgbmFtZSAoc2VlIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24oKSksIGl0IHNob3VsZCBub3QKKyAqIGRvIHNvLiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlIGJ1cyBtYXkgbGF1bmNoIGEgcHJvZ3JhbSB0byBwcm9jZXNzIHRoZQorICogbWVzc2FnZS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQgICAgIDB4MgorLyoqCisgKiBJZiBzZXQgb24gYSBtZXRob2QgY2FsbCwgdGhpcyBmbGFnIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBpcyBwcmVwYXJlZCB0bworICogd2FpdCBmb3IgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbi4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX0FMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04gMHg0CisKKy8qIEhlYWRlciBmaWVsZHMgKi8KKworLyoqIE5vdCBlcXVhbCB0byBhbnkgdmFsaWQgaGVhZGVyIGZpZWxkIGNvZGUgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfSU5WQUxJRCAgICAgICAgMAorLyoqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgcGF0aCAtIHRoZSBwYXRoIGlzIHRoZSBvYmplY3QgZW1pdHRpbmcgYSBzaWduYWwgb3IgdGhlIG9iamVjdCByZWNlaXZpbmcgYSBtZXRob2QgY2FsbC4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X3BhdGgoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIICAgICAgICAgICAxCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBpbnRlcmZhY2UgY29udGFpbmluZyBhIG1lbWJlciAobWV0aG9kIG9yIHNpZ25hbCkuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UgICAgICAyCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgbWVtYmVyIChtZXRob2Qgb3Igc2lnbmFsKS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfbWVtYmVyKCkuICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiAgICAgICAgIDMKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgYW4gZXJyb3IgbmFtZSAoZm91bmQgaW4gI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SIG1lc3NhZ2VzKS4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FICAgICA0CisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgcmVwbHkgc2VyaWFsLCB1c2VkIHRvIG1hdGNoIGEgI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gbWVzc2FnZSB3aXRoIHRoZQorICogbWVzc2FnZSB0aGF0IGl0J3MgYSByZXBseSB0by4gU2VlIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsKCkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMICAgNQorLyoqCisgKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGJ1cyBuYW1lIG9mIGEgbWVzc2FnZS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24oKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiAgICA2CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgc2VuZGVyIG9mIGEgbWVzc2FnZTsgdXN1YWxseSBpbml0aWFsaXplZCBieSB0aGUgbWVzc2FnZSBidXMuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgICAgICAgICA3CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgdHlwZSBzaWduYXR1cmUgb2YgYSBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSAgICAgIDgKKy8qKgorICogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBudW1iZXIgb2YgdW5peCBmaWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTICAgICAgIDkKKworCisvKioKKyAqIFZhbHVlIG9mIHRoZSBoaWdoZXN0LW51bWJlcmVkIGhlYWRlciBmaWVsZCBjb2RlLCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSBzaXplIG9mIGFuIGFycmF5IGluZGV4ZWQgYnkgaGVhZGVyIGZpZWxkIGNvZGUuIFJlbWVtYmVyIHRob3VnaAorICogdGhhdCB1bmtub3duIGNvZGVzIG11c3QgYmUgaWdub3JlZCwgc28gY2hlY2sgZm9yIHRoYXQgYmVmb3JlCisgKiBpbmRleGluZyB0aGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfTEFTVCBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUworCisvKiogSGVhZGVyIGZvcm1hdCBpcyBkZWZpbmVkIGFzIGEgc2lnbmF0dXJlOgorICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb3JkZXIKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHR5cGUgSUQKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncworICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24KKyAqICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IGxlbmd0aAorICogICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbAorICogICBhcnJheSBvZiBzdHJ1Y3QgKGJ5dGUsdmFyaWFudCkgIChmaWVsZCBuYW1lLCB2YWx1ZSkKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgY2FuIGJlIGNvbXB1dGVkIGFzIHRoZQorICogZml4ZWQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBkYXRhLCBwbHVzIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBhcnJheSBhdCB0aGUgZW5kLCBwbHVzIHBhZGRpbmcgdG8gYW4gOC1ib3VuZGFyeS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORyAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKworCisvKioKKyAqIFRoZSBzbWFsbGVzdCBoZWFkZXIgc2l6ZSB0aGF0IGNhbiBvY2N1ci4gIChJdCB3b24ndCBiZSB2YWxpZCBkdWUgdG8KKyAqIG1pc3NpbmcgcmVxdWlyZWQgaGVhZGVyIGZpZWxkcy4pIFRoaXMgaXMgNCBieXRlcywgdHdvIHVpbnQzMiwgYW4KKyAqIGFycmF5IGxlbmd0aC4gVGhpcyBpc24ndCBhbnkga2luZCBvZiByZXNvdXJjZSBsaW1pdCwganVzdCB0aGUKKyAqIG5lY2Vzc2FyeS9sb2dpY2FsIG91dGNvbWUgb2YgdGhlIGhlYWRlciBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFIDE2CisKKy8qIEVycm9ycyAqLworLyogV0FSTklORyB0aGVzZSBnZXQgYXV0b2NvbnZlcnRlZCB0byBhbiBlbnVtIGluIGRidXMtZ2xpYi5oLiBUaHVzLAorICogaWYgeW91IGNoYW5nZSB0aGUgb3JkZXIgaXQgYnJlYWtzIHRoZSBBQkkuIEtlZXAgdGhlbSBpbiBvcmRlci4KKyAqIEFsc28sIGRvbid0IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBzaW5jZSB0aGF0IHdpbGwgYnJlYWsgdGhlIHNlZAorICogc2NyaXB0LgorICovCisvKiogQSBnZW5lcmljIGVycm9yOyAic29tZXRoaW5nIHdlbnQgd3JvbmciIC0gc2VlIHRoZSBlcnJvciBtZXNzYWdlIGZvciBtb3JlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GYWlsZWQiCisvKiogVGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFuIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT19NRU1PUlkgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm9NZW1vcnkiCisvKiogVGhlIGJ1cyBkb2Vzbid0IGtub3cgaG93IHRvIGxhdW5jaCBhIHNlcnZpY2UgdG8gc3VwcGx5IHRoZSBidXMgbmFtZSB5b3Ugd2FudGVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTiAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TZXJ2aWNlVW5rbm93biIKKy8qKiBUaGUgYnVzIG5hbWUgeW91IHJlZmVyZW5jZWQgZG9lc24ndCBleGlzdCAoaS5lLiBubyBhcHBsaWNhdGlvbiBvd25zIGl0KS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTmFtZUhhc05vT3duZXIiCisvKiogTm8gcmVwbHkgdG8gYSBtZXNzYWdlIGV4cGVjdGluZyBvbmUsIHVzdWFsbHkgbWVhbnMgYSB0aW1lb3V0IG9jY3VycmVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1JFUExZICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1JlcGx5IgorLyoqIFNvbWV0aGluZyB3ZW50IHdyb25nIHJlYWRpbmcgb3Igd3JpdGluZyB0byBhIHNvY2tldCwgZm9yIGV4YW1wbGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU9fRVJST1IgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLklPRXJyb3IiCisvKiogQSBELUJ1cyBidXMgYWRkcmVzcyB3YXMgbWFsZm9ybWVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0JBRF9BRERSRVNTICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5CYWRBZGRyZXNzIgorLyoqIFJlcXVlc3RlZCBvcGVyYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIChsaWtlIEVOT1NZUyBvbiBVTklYKS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm90U3VwcG9ydGVkIgorLyoqIFNvbWUgbGltaXRlZCByZXNvdXJjZSBpcyBleGhhdXN0ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkxpbWl0c0V4Y2VlZGVkIgorLyoqIFNlY3VyaXR5IHJlc3RyaWN0aW9ucyBkb24ndCBhbGxvdyBkb2luZyB3aGF0IHlvdSdyZSB0cnlpbmcgdG8gZG8uICovCisjZGVmaW5lIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFjY2Vzc0RlbmllZCIKKy8qKiBBdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BVVRIX0ZBSUxFRCAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQXV0aEZhaWxlZCIKKy8qKiBVbmFibGUgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKHByb2JhYmx5IGNhdXNlZCBieSBFQ09OTlJFRlVTRUQgb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1NFUlZFUiAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1NlcnZlciIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBwb3NzaWJseSBFVElNRURPVVQgb24gYSBzb2NrZXQuCisgKiBOb3RlIHRoYXQgI0RCVVNfRVJST1JfTk9fUkVQTFkgaXMgdXNlZCBmb3IgbWVzc2FnZSByZXBseSB0aW1lb3V0cy4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FRF9PVVQgYWxzbyBleGlzdHMuIFdlIGNhbid0IGZpeAorICogaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzbyBqdXN0IGJlIGNhcmVmdWwuCisgKi8KKyNkZWZpbmUgREJVU19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZW91dCIKKy8qKiBObyBuZXR3b3JrIGFjY2VzcyAocHJvYmFibHkgRU5FVFVOUkVBQ0ggb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX05FVFdPUksgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob05ldHdvcmsiCisvKiogQ2FuJ3QgYmluZCBhIHNvY2tldCBzaW5jZSBpdHMgYWRkcmVzcyBpcyBpbiB1c2UgKGkuZS4gRUFERFJJTlVTRSkuICovCisjZGVmaW5lIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkZHJlc3NJblVzZSIKKy8qKiBUaGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgYW5kIHlvdSdyZSB0cnlpbmcgdG8gdXNlIGl0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5EaXNjb25uZWN0ZWQiCisvKiogSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGEgbWV0aG9kIGNhbGwuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRBcmdzIgorLyoqIE1pc3NpbmcgZmlsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZU5vdEZvdW5kIgorLyoqIEV4aXN0aW5nIGZpbGUgYW5kIHRoZSBvcGVyYXRpb24geW91J3JlIHVzaW5nIGRvZXMgbm90IHNpbGVudGx5IG92ZXJ3cml0ZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX0VYSVNUUyAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZUV4aXN0cyIKKy8qKiBNZXRob2QgbmFtZSB5b3UgaW52b2tlZCBpc24ndCBrbm93biBieSB0aGUgb2JqZWN0IHlvdSBpbnZva2VkIGl0IG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duTWV0aG9kIgorLyoqIE9iamVjdCB5b3UgaW52b2tlZCBhIG1ldGhvZCBvbiBpc24ndCBrbm93bi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX09CSkVDVCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bk9iamVjdCIKKy8qKiBJbnRlcmZhY2UgeW91IGludm9rZWQgYSBtZXRob2Qgb24gaXNuJ3Qga25vd24gYnkgdGhlIG9iamVjdC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bkludGVyZmFjZSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gYWNjZXNzIGlzbid0IGtub3duIGJ5IHRoZSBvYmplY3QuICovCisjZGVmaW5lIERCVVNfRVJST1JfVU5LTk9XTl9QUk9QRVJUWSAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlVua25vd25Qcm9wZXJ0eSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gc2V0IGlzIHJlYWQtb25seS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9QUk9QRVJUWV9SRUFEX09OTFkgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuUHJvcGVydHlSZWFkT25seSIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBlLmcuIHdoaWxlIHN0YXJ0aW5nIGEgc2VydmljZS4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FT1VUIGFsc28gZXhpc3RzLiBXZSBjYW4ndCBmaXgKKyAqIGl0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgc28ganVzdCBiZSBjYXJlZnVsLgorICovCisjZGVmaW5lIERCVVNfRVJST1JfVElNRURfT1VUICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlRpbWVkT3V0IgorLyoqIFRyaWVkIHRvIHJlbW92ZSBvciBtb2RpZnkgYSBtYXRjaCBydWxlIHRoYXQgZGlkbid0IGV4aXN0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfTk9UX0ZPVU5EICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVOb3RGb3VuZCIKKy8qKiBUaGUgbWF0Y2ggcnVsZSBpc24ndCBzeW50YWN0aWNhbGx5IHZhbGlkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVJbnZhbGlkIgorLyoqIFdoaWxlIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MsIHRoZSBleGVjKCkgY2FsbCBmYWlsZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkV4ZWNGYWlsZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGZvcmsoKSBjYWxsIGZhaWxlZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GT1JLX0ZBSUxFRCAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRm9ya0ZhaWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCB0aGUgY2hpbGQgZXhpdGVkIHdpdGggYSBzdGF0dXMgY29kZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRFeGl0ZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGNoaWxkIGV4aXRlZCBvbiBhIHNpZ25hbC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRTaWduYWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GQUlMRUQgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRmFpbGVkIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgZW52aXJvbm1lbnQgY29ycmVjdGx5LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GYWlsZWRUb1NldHVwIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgY29uZmlnIHBhcnNlciBjb3JyZWN0bHkuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fQ09ORklHX0lOVkFMSUQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkNvbmZpZ0ludmFsaWQiCisvKiogQnVzIG5hbWUgd2FzIG5vdCB2YWxpZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdFZhbGlkIgorLyoqIFNlcnZpY2UgZmlsZSBub3QgZm91bmQgaW4gc3lzdGVtLXNlcnZpY2VzIGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdEZvdW5kIgorLyoqIFBlcm1pc3Npb25zIGFyZSBpbmNvcnJlY3Qgb24gdGhlIHNldHVpZCBoZWxwZXIuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLlBlcm1pc3Npb25zSW52YWxpZCIKKy8qKiBTZXJ2aWNlIGZpbGUgaW52YWxpZCAoTmFtZSwgVXNlciBvciBFeGVjIG1pc3NpbmcpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GaWxlSW52YWxpZCIKKy8qKiBUcmllZCB0byBnZXQgYSBVTklYIHByb2Nlc3MgSUQgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fTk9fTUVNT1JZICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLk5vTWVtb3J5IgorLyoqIFRyaWVkIHRvIGdldCBhIFVOSVggcHJvY2VzcyBJRCBhbmQgaXQgd2Fzbid0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTiAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5peFByb2Nlc3NJZFVua25vd24iCisvKiogQSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgdmFsaWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRTaWduYXR1cmUiCisvKiogQSBmaWxlIGNvbnRhaW5zIGludmFsaWQgc3ludGF4IG9yIGlzIG90aGVyd2lzZSBicm9rZW4uICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRGaWxlQ29udGVudCIKKy8qKiBBc2tlZCBmb3IgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IGFuZCBpdCB3YXNuJ3QgYXZhaWxhYmxlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TRUxpbnV4U2VjdXJpdHlDb250ZXh0VW5rbm93biIKKy8qKiBBc2tlZCBmb3IgQURUIGF1ZGl0IGRhdGEgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfQURUX0FVRElUX0RBVEFfVU5LTk9XTiAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkdEF1ZGl0RGF0YVVua25vd24iCisvKiogVGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IHBhdGguICovCisjZGVmaW5lIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9iamVjdFBhdGhJblVzZSIKKy8qKiBUaGUgbWVzc2FnZSBtZXRhIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBheWxvYWQuIGUuZy4gZXhwZWN0ZWQKKyAgICBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3ZXJlIG5vdCBzZW50IG92ZXIgdGhlIHNvY2tldCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbmNvbnNpc3RlbnRNZXNzYWdlIgorLyoqIFRoZSBtZXNzYWdlIGlzIG5vdCBhbGxvd2VkIHdpdGhvdXQgcGVyZm9ybWluZyBpbnRlcmFjdGl2ZSBhdXRob3JpemF0aW9uLAorICogYnV0IGNvdWxkIGhhdmUgc3VjY2VlZGVkIGlmIGFuIGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gc3RlcCB3YXMKKyAqIGFsbG93ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTl9SRVFVSVJFRCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSW50ZXJhY3RpdmVBdXRob3JpemF0aW9uUmVxdWlyZWQiCisKKy8qIFhNTCBpbnRyb3NwZWN0aW9uIGZvcm1hdCAqLworCisvKiogWE1MIG5hbWVzcGFjZSBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfTkFNRVNQQUNFICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzIgorLyoqIFhNTCBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfUFVCTElDX0lERU5USUZJRVIgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIKKy8qKiBYTUwgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQiCisvKiogWE1MIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX0RPQ1RZUEVfREVDTF9OT0RFICI8IURPQ1RZUEUgbm9kZSBQVUJMSUMgXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1BVQkxJQ19JREVOVElGSUVSICJcIlxuXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJcIj5cbiIKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDAKK3sgLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCit9CisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXJlc291cmNlcy5jIGIvZGJ1cy9kYnVzLXJlc291cmNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTdlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcmVzb3VyY2VzLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1yZXNvdXJjZXMuYyBSZXNvdXJjZSB0cmFja2luZy9saW1pdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Jlc291cmNlcyBSZXNvdXJjZSBsaW1pdHMgcmVsYXRlZCBjb2RlCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDb3VudGVyIGFuZCBvdGhlciBzdHVmZiByZWxhdGVkIHRvIHJlc291cmNlIGxpbWl0cworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0cmFja2luZyByZXNvdXJjZSBsaW1pdHMsCisgKiBzdWNoIGFzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkvdW5peCBmZHMgYSBjb25uZWN0aW9uIGNhbiB1c2UKKyAqIGZvciBtZXNzYWdlcywgZXRjLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNSZXNvdXJjZXNJbnRlcm5hbHMgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHJlc291cmNlIGxpbWl0cyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNDb3VudGVyLgorICogCisgKiBEQnVzQ291bnRlciBpbnRlcm5hbHMuIERCdXNDb3VudGVyIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNDb3VudGVyCit7CisgIGludCByZWZjb3VudDsgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgbG9uZyBzaXplX3ZhbHVlOyAgICAgICAvKio8IGN1cnJlbnQgc2l6ZSBjb3VudGVyIHZhbHVlICovCisgIGxvbmcgdW5peF9mZF92YWx1ZTsgICAgLyoqPCBjdXJyZW50IHVuaXggZmQgY291bnRlciB2YWx1ZSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgbG9uZyBwZWFrX3NpemVfdmFsdWU7ICAgICAvKio8IGxhcmdlc3QgZXZlciBzaXplIGNvdW50ZXIgdmFsdWUgKi8KKyAgbG9uZyBwZWFrX3VuaXhfZmRfdmFsdWU7ICAvKio8IGxhcmdlc3QgZXZlciB1bml4IGZkIGNvdW50ZXIgdmFsdWUgKi8KKyNlbmRpZgorCisgIGxvbmcgbm90aWZ5X3NpemVfZ3VhcmRfdmFsdWU7ICAgIC8qKjwgY2FsbCBub3RpZnkgZnVuY3Rpb24gd2hlbiBjcm9zc2luZyB0aGlzIHNpemUgdmFsdWUgKi8KKyAgbG9uZyBub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZTsgLyoqPCBjYWxsIG5vdGlmeSBmdW5jdGlvbiB3aGVuIGNyb3NzaW5nIHRoaXMgdW5peCBmZCB2YWx1ZSAqLworCisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uOyAvKio8IG5vdGlmeSBmdW5jdGlvbiAqLworICB2b2lkICpub3RpZnlfZGF0YTsgLyoqPCBkYXRhIGZvciBub3RpZnkgZnVuY3Rpb24gKi8KKyAgZGJ1c19ib29sX3Qgbm90aWZ5X3BlbmRpbmcgOiAxOyAvKio8IFRSVUUgaWYgdGhlIGd1YXJkIHZhbHVlIGhhcyBiZWVuIGNyb3NzZWQgKi8KKyAgREJ1c1JNdXRleCAqbXV0ZXg7ICAgIC8qKjwgTG9jayBvbiB0aGUgZW50aXJlIERCdXNDb3VudGVyICovCit9OworCisvKiogQH0gKi8gIC8qIGVuZCBvZiByZXNvdXJjZSBsaW1pdHMgaW50ZXJuYWxzIGRvY3MgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzUmVzb3VyY2VzCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBEQnVzQ291bnRlci4gREJ1c0NvdW50ZXIgaXMgdXNlZAorICogdG8gY291bnQgdXNhZ2Ugb2Ygc29tZSByZXNvdXJjZSBzdWNoIGFzIG1lbW9yeS4KKyAqCisgKiBAcmV0dXJucyBuZXcgY291bnRlciBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KK0RCdXNDb3VudGVyKgorX2RidXNfY291bnRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNDb3VudGVyICpjb3VudGVyOworCisgIGNvdW50ZXIgPSBkYnVzX25ldzAgKERCdXNDb3VudGVyLCAxKTsKKyAgaWYgKGNvdW50ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjb3VudGVyLT5yZWZjb3VudCA9IDE7CisKKyAgX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoJmNvdW50ZXItPm11dGV4KTsKKyAgaWYgKGNvdW50ZXItPm11dGV4ID09IE5VTEwpCisgIHsKKyAgICBkYnVzX2ZyZWUgKGNvdW50ZXIpOworICAgIGNvdW50ZXIgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlcgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyB0aGUgY291bnRlcgorICovCitEQnVzQ291bnRlciAqCitfZGJ1c19jb3VudGVyX3JlZiAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgY291bnRlci0+cmVmY291bnQgKz0gMTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlciBhbmQgcG9zc2libHkKKyAqIGZpbmFsaXplcyB0aGUgY291bnRlci4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX3VucmVmIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgZGJ1c19ib29sX3QgbGFzdF9yZWYgPSBGQUxTRTsKKworICBfZGJ1c19ybXV0ZXhfbG9jayAoY291bnRlci0+bXV0ZXgpOworCisgIF9kYnVzX2Fzc2VydCAoY291bnRlci0+cmVmY291bnQgPiAwKTsKKworICBjb3VudGVyLT5yZWZjb3VudCAtPSAxOworICBsYXN0X3JlZiA9IChjb3VudGVyLT5yZWZjb3VudCA9PSAwKTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgaWYgKGxhc3RfcmVmKQorICAgIHsKKyAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY291bnRlci0+bXV0ZXgpOworICAgICAgZGJ1c19mcmVlIChjb3VudGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRqdXN0cyB0aGUgdmFsdWUgb2YgdGhlIHNpemUgY291bnRlciBieSB0aGUgZ2l2ZW4KKyAqIGRlbHRhIHdoaWNoIG1heSBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aCBsb2NrcyBoZWxkLiBBZnRlciBjYWxsaW5nIGl0LCB3aGVuCisgKiBhbnkgcmVsZXZhbnQgbG9ja3MgYXJlIG5vIGxvbmdlciBoZWxkIHlvdSBtdXN0IGNhbGwgX2RidXNfY291bnRlcl9ub3RpZnkoKS4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHBhcmFtIGRlbHRhIHZhbHVlIHRvIGFkZCB0byB0aGUgc2l6ZSBjb3VudGVyJ3MgY3VycmVudCB2YWx1ZQorICovCit2b2lkCitfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSkKK3sKKyAgbG9uZyBvbGQgPSAwOworCisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgb2xkID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKworICBjb3VudGVyLT5zaXplX3ZhbHVlICs9IGRlbHRhOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgaWYgKGNvdW50ZXItPnBlYWtfc2l6ZV92YWx1ZSA8IGNvdW50ZXItPnNpemVfdmFsdWUpCisgICAgY291bnRlci0+cGVha19zaXplX3ZhbHVlID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKyNlbmRpZgorCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvdW50ZXIgJWxkIGJ5ICVsZCA9ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgb2xkLCBkZWx0YSwgY291bnRlci0+c2l6ZV92YWx1ZSk7CisjZW5kaWYKKworICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+c2l6ZV92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnNpemVfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkpKQorICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gVFJVRTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7Cit9CisKKy8qKgorICogQ2FsbHMgdGhlIG5vdGlmeSBmdW5jdGlvbiBmcm9tIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSgpLAorICogaWYgdGhhdCBmdW5jdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBjb3VudGVyIGhhcyBjcm9zc2VkIHRoZQorICogZ3VhcmQgdmFsdWUgKGluIGVpdGhlciBkaXJlY3Rpb24pIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGxvY2tzIGhlbGQsIHNpbmNlIGl0IGNhbiBjYWxsIG91dAorICogdG8gdXNlciBjb2RlLgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX25vdGlmeSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uID0gTlVMTDsKKyAgdm9pZCAqbm90aWZ5X2RhdGEgPSBOVUxMOworCisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisgIGlmIChjb3VudGVyLT5ub3RpZnlfcGVuZGluZykKKyAgICB7CisgICAgICBjb3VudGVyLT5ub3RpZnlfcGVuZGluZyA9IEZBTFNFOworICAgICAgbm90aWZ5X2Z1bmN0aW9uID0gY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uOworICAgICAgbm90aWZ5X2RhdGEgPSBjb3VudGVyLT5ub3RpZnlfZGF0YTsKKyAgICB9CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKGNvdW50ZXItPm11dGV4KTsKKworICBpZiAobm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogbm90aWZ5X2Z1bmN0aW9uKSAoY291bnRlciwgbm90aWZ5X2RhdGEpOworfQorCisvKioKKyAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIgYnkgdGhlIGdpdmVuCisgKiBkZWx0YSB3aGljaCBtYXkgYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQWZ0ZXIgY2FsbGluZyBpdCwgd2hlbgorICogYW55IHJlbGV2YW50IGxvY2tzIGFyZSBubyBsb25nZXIgaGVsZCB5b3UgbXVzdCBjYWxsIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBkZWx0YSB2YWx1ZSB0byBhZGQgdG8gdGhlIHVuaXggZmRzIGNvdW50ZXIncyBjdXJyZW50IHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIGRlbHRhKQoreworICBsb25nIG9sZCA9IDA7CisKKyAgX2RidXNfcm11dGV4X2xvY2sgKGNvdW50ZXItPm11dGV4KTsKKworICBvbGQgPSBjb3VudGVyLT51bml4X2ZkX3ZhbHVlOworICAKKyAgY291bnRlci0+dW5peF9mZF92YWx1ZSArPSBkZWx0YTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGlmIChjb3VudGVyLT5wZWFrX3VuaXhfZmRfdmFsdWUgPCBjb3VudGVyLT51bml4X2ZkX3ZhbHVlKQorICAgIGNvdW50ZXItPnBlYWtfdW5peF9mZF92YWx1ZSA9IGNvdW50ZXItPnVuaXhfZmRfdmFsdWU7CisjZW5kaWYKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIkFkanVzdGluZyBjb3VudGVyICVsZCBieSAlbGQgPSAlbGRcbiIsCisgICAgICAgICAgICAgICAgIG9sZCwgZGVsdGEsIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUpOworI2VuZGlmCisgIAorICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3VuaXhfZmRfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+dW5peF9mZF92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkpKQorICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gVFJVRTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2l6ZSBjb3VudGVyLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyBpdHMgY3VycmVudCBzaXplIHZhbHVlCisgKi8KK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKERCdXNDb3VudGVyICpjb3VudGVyKQoreworICByZXR1cm4gY291bnRlci0+c2l6ZV92YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zIGl0cyBjdXJyZW50IHVuaXggZmQgdmFsdWUKKyAqLworbG9uZworX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT51bml4X2ZkX3ZhbHVlOworfQorCisvKioKKyAqIFNldHMgdGhlIG5vdGlmeSBmdW5jdGlvbiBmb3IgdGhpcyBjb3VudGVyOyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIncyB2YWx1ZXMgY3Jvc3MgdGhlIGd1YXJkIHZhbHVlcyBpbgorICogZWl0aGVyIGRpcmVjdGlvbiAobW92aW5nIHVwLCBvciBtb3ZpbmcgZG93bikuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBzaXplX2d1YXJkX3ZhbHVlIHRoZSB2YWx1ZSB3ZSdyZSBub3RpZmllZCBpZiB0aGUgc2l6ZSBjb3VudGVyIGNyb3NzZXMKKyAqIEBwYXJhbSB1bml4X2ZkX2d1YXJkX3ZhbHVlIHRoZSB2YWx1ZSB3ZSdyZSBub3RpZmllZCBpZiB0aGUgdW5peCBmZCBjb3VudGVyIGNyb3NzZXMKKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIGluIG9yZGVyIHRvIG5vdGlmeQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAoREJ1c0NvdW50ZXIgICAgICAgICAgICAgICAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgdW5peF9mZF9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXJOb3RpZnlGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgX2RidXNfcm11dGV4X2xvY2sgKGNvdW50ZXItPm11dGV4KTsKKyAgY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgPSBzaXplX2d1YXJkX3ZhbHVlOworICBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSA9IHVuaXhfZmRfZ3VhcmRfdmFsdWU7CisgIGNvdW50ZXItPm5vdGlmeV9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBjb3VudGVyLT5ub3RpZnlfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY291bnRlci0+bm90aWZ5X3BlbmRpbmcgPSBGQUxTRTsKKyAgX2RidXNfcm11dGV4X3VubG9jayAoY291bnRlci0+bXV0ZXgpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfc2l6ZV92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT5wZWFrX3NpemVfdmFsdWU7Cit9CisKK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfdW5peF9mZF92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT5wZWFrX3VuaXhfZmRfdmFsdWU7Cit9CisjZW5kaWYKKworLyoqIEB9ICovICAvKiBlbmQgb2YgcmVzb3VyY2UgbGltaXRzIGV4cG9ydGVkIEFQSSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXJlc291cmNlcy5oIGIvZGJ1cy9kYnVzLXJlc291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWE1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcmVzb3VyY2VzLmgKQEAgLTAsMCArMSw2MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXJlc291cmNlcy5oIFJlc291cmNlIHRyYWNraW5nL2xpbWl0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUkVTT1VSQ0VTX0gKKyNkZWZpbmUgREJVU19SRVNPVVJDRVNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNDb3VudGVyIERCdXNDb3VudGVyOworCit0eXBlZGVmIHZvaWQgKCogREJ1c0NvdW50ZXJOb3RpZnlGdW5jdGlvbikgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqdXNlcl9kYXRhKTsKKworREJ1c0NvdW50ZXIqIF9kYnVzX2NvdW50ZXJfbmV3ICAgICAgICh2b2lkKTsKK0RCdXNDb3VudGVyKiBfZGJ1c19jb3VudGVyX3JlZiAgICAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfdW5yZWYgICAgIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK3ZvaWQgICAgICAgICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplICAgICAgIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgZGVsdGEpOwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgICAgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSk7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl9ub3RpZnkgICAgICAgICAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOworbG9uZyAgICAgICAgIF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKK2xvbmcgICAgICAgICBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK3ZvaWQgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICAgIChEQnVzQ291bnRlciAgICAgICAgICAgICAgICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIHNpemVfZ3VhcmRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgdW5peF9mZF9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlck5vdGlmeUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLworbG9uZyBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3NpemVfdmFsdWUgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKK2xvbmcgX2RidXNfY291bnRlcl9nZXRfcGVha191bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1JFU09VUkNFU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyBiL2RidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGJlODcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYwpAQCAtMCwwICsxLDQzMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLWRlYnVnLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUgREJ1c1NlcnZlckRlYnVnUGlwZQorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbi1wcm9jZXNzIHBpcGUgZGVidWcgc2VydmVyIHVzZWQgaW4gdW5pdCB0ZXN0cy4KKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1NlcnZlckRlYnVnUGlwZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGRlYnVnIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZSBEQnVzU2VydmVyRGVidWdQaXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlckRlYnVnUGlwZS4gQWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZQoreworICBEQnVzU2VydmVyIGJhc2U7ICAvKio8IFBhcmVudCBjbGFzcyBtZW1iZXJzLiAqLworCisgIGNoYXIgKm5hbWU7IC8qKjwgU2VydmVyIG5hbWUuICovCisKKyAgZGJ1c19ib29sX3QgZGlzY29ubmVjdGVkOyAvKio8IFRSVUUgaWYgZGlzY29ubmVjdCBoYXMgYmVlbiBjYWxsZWQgKi8KK307CisKKy8qIEZJWE1FIG5vdCB0aHJlYWRzYWZlIChyaWdodCBub3cgdGhlIHRlc3Qgc3VpdGUgZG9lc24ndCB1c2UgdGhyZWFkcyBhbnlob3cgKSAqLworc3RhdGljIERCdXNIYXNoVGFibGUgKnNlcnZlcl9waXBlX2hhc2g7CitzdGF0aWMgaW50IHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPSAwOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3BpcGVfaGFzaF9yZWYgKHZvaWQpCit7CisgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPT0gMCk7CisgICAgICAKKyAgICAgIHNlcnZlcl9waXBlX2hhc2ggPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BpcGVfaGFzaF91bnJlZiAodm9pZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfcGlwZV9oYXNoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPiAwKTsKKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50IC09IDE7CisgIGlmIChzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoc2VydmVyX3BpcGVfaGFzaCk7CisgICAgICBzZXJ2ZXJfcGlwZV9oYXNoID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19maW5hbGl6ZSAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBEQnVzU2VydmVyRGVidWdQaXBlICpkZWJ1Z19zZXJ2ZXIgPSAoREJ1c1NlcnZlckRlYnVnUGlwZSopIHNlcnZlcjsKKworICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIAorICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBkYnVzX2ZyZWUgKGRlYnVnX3NlcnZlci0+bmFtZSk7CisgIGRidXNfZnJlZSAoc2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgKChEQnVzU2VydmVyRGVidWdQaXBlKilzZXJ2ZXIpLT5kaXNjb25uZWN0ZWQgPSBUUlVFOworfQorCitzdGF0aWMgREJ1c1NlcnZlclZUYWJsZSBkZWJ1Z192dGFibGUgPSB7CisgIGRlYnVnX2ZpbmFsaXplLAorICBkZWJ1Z19kaXNjb25uZWN0Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZGVidWcgc2VydmVyIHVzaW5nIGFuIGluLXByb2Nlc3MgcGlwZQorICoKKyAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3IChjb25zdCBjaGFyICAgICAqc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlckRlYnVnUGlwZSAqZGVidWdfc2VydmVyOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNTdHJpbmcgbmFtZV9zdHI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghcGlwZV9oYXNoX3JlZiAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsIHNlcnZlcl9uYW1lKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSwgTlVMTCk7CisgICAgICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBkZWJ1Z19zZXJ2ZXIgPSBkYnVzX25ldzAgKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUsIDEpOworICBpZiAoZGVidWdfc2VydmVyID09IE5VTEwpCisgICAgZ290byBub21lbV8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICBnb3RvIG5vbWVtXzE7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZuYW1lX3N0ciwgc2VydmVyX25hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiZGVidWctcGlwZTpuYW1lPSIpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZuYW1lX3N0cikpCisgICAgZ290byBub21lbV8yOworICAKKyAgZGVidWdfc2VydmVyLT5uYW1lID0gX2RidXNfc3RyZHVwIChzZXJ2ZXJfbmFtZSk7CisgIGlmIChkZWJ1Z19zZXJ2ZXItPm5hbWUgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtXzI7CisgIAorICBpZiAoIV9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKCZkZWJ1Z19zZXJ2ZXItPmJhc2UsCisJCQkgICAgICAgJmRlYnVnX3Z0YWJsZSwgJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gZmFpbF8zOworCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzZXJ2ZXJfcGlwZV9oYXNoLAorCQkJCSAgICAgICBkZWJ1Z19zZXJ2ZXItPm5hbWUsCisJCQkJICAgICAgIGRlYnVnX3NlcnZlcikpCisgICAgZ290byBub21lbV80OworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgLyogc2VydmVyIGtlZXBzIHRoZSBwaXBlIGhhc2ggcmVmICovCisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoJmRlYnVnX3NlcnZlci0+YmFzZSwgMCwgMSwgImRlYnVnX3BpcGVfbmV3Iik7CisgIHJldHVybiAoREJ1c1NlcnZlciAqKWRlYnVnX3NlcnZlcjsKKworIG5vbWVtXzQ6CisgIF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlICgmZGVidWdfc2VydmVyLT5iYXNlKTsKKyBmYWlsXzM6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyLT5uYW1lKTsKKyBub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworIG5vbWVtXzE6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyKTsKKyBub21lbV8wOgorICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQ3JlYXRlcyB0aGUgY2xpZW50LXNpZGUgdHJhbnNwb3J0IGZvcgorICogYSBkZWJ1Zy1waXBlIGNvbm5lY3Rpb24gY29ubmVjdGVkIHRvIHRoZQorICogZ2l2ZW4gZGVidWctcGlwZSBzZXJ2ZXIgbmFtZS4KKyAqIAorICogQHBhcmFtIHNlcnZlcl9uYW1lIG5hbWUgb2Ygc2VydmVyIHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zICNOVUxMIG9uIG5vIG1lbW9yeSBvciB0cmFuc3BvcnQKKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAoY29uc3QgY2hhciAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQ7CisgIERCdXNUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzU29ja2V0IGNsaWVudF9mZCwgc2VydmVyX2ZkOworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChzZXJ2ZXJfcGlwZV9oYXNoID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX1NFUlZFUiwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBzZXJ2ZXIgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX25hbWUpOworICBpZiAoc2VydmVyID09IE5VTEwgfHwKKyAgICAgICgoREJ1c1NlcnZlckRlYnVnUGlwZSopc2VydmVyKS0+ZGlzY29ubmVjdGVkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19TRVJWRVIsIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiZGVidWctcGlwZTpuYW1lPSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHNlcnZlcl9uYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3NvY2tldHBhaXIgKCZjbGllbnRfZmQsICZzZXJ2ZXJfZmQsIEZBTFNFLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIGNyZWF0ZSBmdWxsIGR1cGxleCBwaXBlXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgY3JlYXRlIGZ1bGwtZHVwbGV4IHBpcGUiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYWRkcmVzcyk7CisgIGlmIChjbGllbnRfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIAorICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJmNsaWVudF9mZCk7CisKKyAgc2VydmVyX3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5ndWlkX2hleCwgTlVMTCk7CisgIGlmIChzZXJ2ZXJfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2VydmVyX2ZkLCBOVUxMKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlICgmc2VydmVyX2ZkKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zIChzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhcioqKSBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0IChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgIAorICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBTZWUgaWYgc29tZW9uZSB3YW50cyB0byBoYW5kbGUgdGhpcyBuZXcgY29ubmVjdGlvbiwKKyAgICogc2VsZi1yZWZlcmVuY2luZyBmb3IgcGFyYW5vaWEKKyAgICovCisgIGlmIChzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX3JlZiAoc2VydmVyKTsKKyAgICAgICgqIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24pIChzZXJ2ZXIsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworICAgIH0KKyAgCisgIC8qIElmIG5vIG9uZSBncmFiYmVkIGEgcmVmZXJlbmNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGRpZSwKKyAgICogYW5kIHRoZSBjbGllbnQgdHJhbnNwb3J0IHdpbGwgZ2V0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0CisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2lmX29ubHlfb25lX3JlZiAoY29ubmVjdGlvbik7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGNsaWVudF90cmFuc3BvcnQ7Cit9CisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGFzIGEgZGVidWcgcGlwZSBlbnRyeS4KKyAqIAorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqIAorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqIAorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImRlYnVnLXBpcGUiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5hbWUiKTsKKyAgICAgIAorICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgImRlYnVnLXBpcGUiLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3IChuYW1lLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmICgqc2VydmVyX3ApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyAqIE9wZW5zIGEgZGVidWcgcGlwZSB0cmFuc3BvcnQsIHVzZWQgaW4gdGhlIHRlc3Qgc3VpdGUuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZyBhcyBkZWJ1Zy1waXBlCisgKiBAcGFyYW0gdHJhbnNwb3J0X3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb3BlbmVkIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIHNldAorICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBhdHRlbXB0CisgKi8KK0RCdXNUcmFuc3BvcnRPcGVuUmVzdWx0CitfZGJ1c190cmFuc3BvcnRfb3Blbl9kZWJ1Z19waXBlIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImRlYnVnLXBpcGUiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5hbWUiKTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJkZWJ1Zy1waXBlIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAobmFtZSwgZXJyb3IpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfSAgICAgIAorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggYi9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc0MzExCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX0RFQlVHX1BJUEVfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9ERUJVR19QSVBFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciogICAgICAgICAgICAgX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3ICAgICAoY29uc3QgY2hhciAgICAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAgKGNvbnN0IGNoYXIgICAgICAgICpzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICBfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfREVCVUdfUElQRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYyBiL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOGJhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRhbm5lciBMb3ZlbGFjZSA8bG92ZWxhY2VAd2F5ZmFyZXIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBKb25hcyBCw6RociA8am9uYXMuYmFlaHJAd2ViLmRlPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci1sYXVuY2hkLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJMYXVuY2hkIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBMYXVuY2hkCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciB3aXRoIExhdW5jaGQgc3VwcG9ydAorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyNpbmNsdWRlIDxsYXVuY2guaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKworLyogcHV0IG90aGVyIHByaXZhdGUgbGF1bmNoZCBmdW5jdGlvbnMgaGVyZSAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfTEFVTkNIRCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgbmV3IHNlcnZlciBmcm9tIGxhdW5jaGQuCisgKgorICogbGF1bmNoZCBoYXMgYWxsb2NhZWQgYSBzb2NrZXQgZm9yIHVzLiBXZSBub3cgcXVlcnkgbGF1bmNoZCBmb3IgdGhlCisgKiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhpcyBzb2NrZXQgYW5kIGNyZWF0ZSBhIHNlcnZlciBvbiBpdC4KKyAqIEluIGFkZGl0aW9uIHdlIGluaGVyaXQgbGF1bmNoZCdzIGVudmlyb25tZW50IHdoaWNoIGhvbGRzIGEgdmFyaWFibGUKKyAqIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIHNvY2tldC4gVGhpcyBpcyB1c2VkIHRvIGluaXQgdGhlIHNlcnZlcidzCisgKiBhZGRyZXNzIHdoaWNoIGlzIHBhc3NlZCB0byBhdXRvbGF1bmNoZWQgc2VydmljZXMuCisgKgorICogQHBhcmFtIGxhdW5jaGRfZW52X3ZhciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hpY2ggaG9sZHMgdGhlIHVuaXggcGF0aCB0byB0aGUgc29ja2V0CisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlLgorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KKworREJ1c1NlcnZlciAqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9sYXVuY2hkIChjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIsIERCdXNFcnJvciAqIGVycm9yKQorICB7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgICAgaW50IGxhdW5jaGRfZmQ7CisgICAgbGF1bmNoX2RhdGFfdCBzb2NrZXRzX2RpY3QsIGNoZWNraW5fcmVzcG9uc2U7CisgICAgbGF1bmNoX2RhdGFfdCBjaGVja2luX3JlcXVlc3Q7CisgICAgbGF1bmNoX2RhdGFfdCBsaXN0ZW5pbmdfZmRfYXJyYXksIGxpc3RlbmluZ19mZDsKKyAgICBsYXVuY2hfZGF0YV90IGVudmlyb25tZW50X2RpY3QsIGVudmlyb25tZW50X3BhcmFtOworICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfc29ja2V0X3BhdGgsICpkaXNwbGF5OworCisgICAgbGF1bmNoZF9zb2NrZXRfcGF0aCA9IF9kYnVzX2dldGVudiAobGF1bmNoZF9lbnZfdmFyKTsKKyAgICBkaXNwbGF5ID0gX2RidXNfZ2V0ZW52ICgiRElTUExBWSIpOworCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBpZiAobGF1bmNoZF9zb2NrZXRfcGF0aCA9PSBOVUxMIHx8ICpsYXVuY2hkX3NvY2tldF9wYXRoID09ICdcMCcpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXVuY2hkJ3MgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgaXMgZW1wdHksIGJ1dCBzaG91bGQgY29udGFpbiBhIHNvY2tldCBwYXRoLlxuIiwgbGF1bmNoZF9lbnZfdmFyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDpwYXRoPSIpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGxhdW5jaGRfc29ja2V0X3BhdGgpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKChjaGVja2luX3JlcXVlc3QgPSBsYXVuY2hfZGF0YV9uZXdfc3RyaW5nIChMQVVOQ0hfS0VZX0NIRUNLSU4pKSA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgImxhdW5jaF9kYXRhX25ld19zdHJpbmcoXCIlc1wiKSBVbmFibGUgdG8gY3JlYXRlIHN0cmluZy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBMQVVOQ0hfS0VZX0NIRUNLSU4pOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAoKGNoZWNraW5fcmVzcG9uc2UgPSBsYXVuY2hfbXNnIChjaGVja2luX3JlcXVlc3QpKSA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoX21zZyhcIiVzXCIpIElQQyBmYWlsdXJlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExBVU5DSF9LRVlfQ0hFQ0tJTiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGlmIChMQVVOQ0hfREFUQV9FUlJOTyA9PSBsYXVuY2hfZGF0YV9nZXRfdHlwZSAoY2hlY2tpbl9yZXNwb25zZSkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDaGVjay1pbiBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGxhdW5jaF9kYXRhX2dldF9lcnJubyAoY2hlY2tpbl9yZXNwb25zZSkpKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgc29ja2V0c19kaWN0ID0KKyAgICAgIGxhdW5jaF9kYXRhX2RpY3RfbG9va3VwIChjaGVja2luX3Jlc3BvbnNlLCBMQVVOQ0hfSk9CS0VZX1NPQ0tFVFMpOworICAgIGlmIChOVUxMID09IHNvY2tldHNfZGljdCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHNvY2tldHMgZm91bmQgdG8gYW5zd2VyIHJlcXVlc3RzIG9uIVxuIik7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGxpc3RlbmluZ19mZF9hcnJheSA9CisgICAgICBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoc29ja2V0c19kaWN0LCAidW5peF9kb21haW5fbGlzdGVuZXIiKTsKKyAgICBpZiAoTlVMTCA9PSBsaXN0ZW5pbmdfZmRfYXJyYXkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBrbm93biBzb2NrZXRzIGZvdW5kIHRvIGFuc3dlciByZXF1ZXN0cyBvbiFcbiIpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAobGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2NvdW50IChsaXN0ZW5pbmdfZmRfYXJyYXkpICE9IDEpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgMSBzb2NrZXQgZnJvbSBsYXVuY2hkLCBnb3QgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2NvdW50IChsaXN0ZW5pbmdfZmRfYXJyYXkpKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgbGlzdGVuaW5nX2ZkID0gbGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2luZGV4IChsaXN0ZW5pbmdfZmRfYXJyYXksIDApOworICAgIGxhdW5jaGRfZmQgPSBsYXVuY2hfZGF0YV9nZXRfZmQgKGxpc3RlbmluZ19mZCk7CisKKyAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAobGF1bmNoZF9mZCk7CisKKyAgICBpZiAobGF1bmNoZF9mZCA8IDApCisgICAgICB7CisgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICBpZiAoZGlzcGxheSA9PSBOVUxMIHx8ICpkaXNwbGF5ID09ICdcMCcpCisgICAgeworICAgICAgZW52aXJvbm1lbnRfZGljdCA9IGxhdW5jaF9kYXRhX2RpY3RfbG9va3VwIChjaGVja2luX3Jlc3BvbnNlLCBMQVVOQ0hfSk9CS0VZX1VTRVJFTlZJUk9OTUVOVFZBUklBQkxFUyk7CisgICAgICBpZiAoTlVMTCA9PSBlbnZpcm9ubWVudF9kaWN0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZXRyaWV2ZSB1c2VyIGVudmlyb25tZW50IGZyb20gbGF1bmNoZC4iKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZW52aXJvbm1lbnRfcGFyYW0gPSBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoZW52aXJvbm1lbnRfZGljdCwgIkRJU1BMQVkiKTsKKyAgICAgICAgICBpZiAoTlVMTCA9PSBlbnZpcm9ubWVudF9wYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZXRyaWV2ZSBESVNQTEFZIGZyb20gbGF1bmNoZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRpc3BsYXkgPSBsYXVuY2hfZGF0YV9nZXRfc3RyaW5nKGVudmlyb25tZW50X3BhcmFtKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRlbnYgKCJESVNQTEFZIiwgZGlzcGxheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgIH0KKworICAgIHNlcnZlciA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAoJmxhdW5jaGRfZmQsIDEsICZhZGRyZXNzLCAwLCBlcnJvcik7CisgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgeworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgICAgcmV0dXJuIHNlcnZlcjsKKworICBsX2ZhaWxlZF8wOgorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIHR5cGUgJ2xhdW5jaGQnIHJlcXVlc3RlZCwgYnV0IGxhdW5jaGQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICB9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1sYXVuY2hkLmggYi9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjliOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci1sYXVuY2hkLmgKQEAgLTAsMCArMSwzNiBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisqIENvcHlyaWdodCAoQykgMjAwOCwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorKgorKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoKKyogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqCisqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpZm5kZWYgREJVU19TRVJWRVJfTEFVTkNIRF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX0xBVU5DSERfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciAqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2xhdW5jaGQgKGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwgREJ1c0Vycm9yICogZXJyb3IpOworCitEQlVTX0VORF9ERUNMUworI2VuZGlmIC8qIERCVVNfU0VSVkVSX0xBVU5DSERfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaCBiL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxM2JmMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmggVXNlZCBieSBzdWJjbGFzc2VzIG9mIERCdXNTZXJ2ZXIgb2JqZWN0IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9QUk9URUNURURfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9QUk9URUNURURfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hZGRyZXNzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcmVzb3VyY2VzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWRhdGFzbG90Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXJWVGFibGUgREJ1c1NlcnZlclZUYWJsZTsKKworLyoqCisgKiBWaXJ0dWFsIHRhYmxlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBzZXJ2ZXIgInN1YmNsYXNzZXMiCisgKi8KK3N0cnVjdCBEQnVzU2VydmVyVlRhYmxlCit7CisgIHZvaWQgICAgICAgICgqIGZpbmFsaXplKSAgICAgIChEQnVzU2VydmVyICpzZXJ2ZXIpOworICAvKio8IFRoZSBmaW5hbGl6ZSBtZXRob2QgbXVzdCBmcmVlIHRoZSBzZXJ2ZXIuICovCisgIAorICB2b2lkICAgICAgICAoKiBkaXNjb25uZWN0KSAgICAoREJ1c1NlcnZlciAqc2VydmVyKTsKKyAgLyoqPCBEaXNjb25uZWN0IHRoaXMgc2VydmVyLiAqLworfTsKKworLyoqCisgKiBAaW5ncm91cCBEQnVzU2VydmVySW50ZXJuYWxzCisgKiBJbnRlcm5hbHMgb2YgREJ1c1NlcnZlciBvYmplY3QKKyAqLworc3RydWN0IERCdXNTZXJ2ZXIKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKyAgY29uc3QgREJ1c1NlcnZlclZUYWJsZSAqdnRhYmxlOyAgICAgICAgICAgICAvKio8IFZpcnR1YWwgbWV0aG9kcyBmb3IgdGhpcyBpbnN0YW5jZS4gKi8KKyAgREJ1c1JNdXRleCAqbXV0ZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvY2sgb24gdGhlIHNlcnZlciBvYmplY3QgKi8KKworICBEQnVzR1VJRCBndWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR2xvYmFsbHkgdW5pcXVlIElEIG9mIHNlcnZlciAqLworCisgIERCdXNTdHJpbmcgZ3VpZF9oZXg7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZXgtZW5jb2RlZCB2ZXJzaW9uIG9mIEdVSUQgKi8KKyAgCisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXIgd2F0Y2hlcyAqLworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOyAgICAgICAgICAgICAgICAgIC8qKjwgT3VyIHRpbWVvdXRzICovICAKKworICBjaGFyICphZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyB0aGlzIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24uICovCisgIGRidXNfYm9vbF90IHB1Ymxpc2hlZF9hZGRyZXNzOyAgICAgICAgICAgICAgLyoqPCBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IHNlcnZlciBoYXMgcHVibGlzaGVkIGl0cyBidXMgYWRkcmVzcy4gKi8KKworICBpbnQgbWF4X2Nvbm5lY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGF0IG9uY2UuICovCisKKyAgREJ1c0RhdGFTbG90TGlzdCBzbG90X2xpc3Q7ICAgLyoqPCBEYXRhIHN0b3JlZCBieSBhbGxvY2F0ZWQgaW50ZWdlciBJRCAqLworICAKKyAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiAgbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb247CisgIC8qKjwgQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkLiAqLworICB2b2lkICpuZXdfY29ubmVjdGlvbl9kYXRhOworICAvKio8IERhdGEgZm9yIG5ldyBjb25uZWN0aW9uIGNhbGxiYWNrICovCisgIERCdXNGcmVlRnVuY3Rpb24gbmV3X2Nvbm5lY3Rpb25fZnJlZV9kYXRhX2Z1bmN0aW9uOworICAvKio8IENhbGxiYWNrIHRvIGludm9rZSB0byBmcmVlIG5ld19jb25uZWN0aW9uX2RhdGEKKyAgICogd2hlbiBzZXJ2ZXIgaXMgZmluYWxpemVkIG9yIGRhdGEgaXMgcmVwbGFjZWQuCisgICAqLworCisgIGNoYXIgKiphdXRoX21lY2hhbmlzbXM7IC8qKjwgQXJyYXkgb2YgYWxsb3dlZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zICovCisgIAorICB1bnNpZ25lZCBpbnQgZGlzY29ubmVjdGVkIDogMTsgICAgICAgICAgICAgIC8qKjwgVFJVRSBpZiB3ZSBhcmUgZGlzY29ubmVjdGVkLiAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgdW5zaWduZWQgaW50IGhhdmVfc2VydmVyX2xvY2sgOiAxOyAvKio8IERvZXMgc29tZW9uZSBoYXZlIHRoZSBzZXJ2ZXIgbXV0ZXggbG9ja2VkICovCisjZW5kaWYKK307CisKK2RidXNfYm9vbF90IF9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlcnZlcl9hZGRfd2F0Y2ggICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1NlcnZlciAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX2FkZF90aW1lb3V0ICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0IChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0IChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQsIC8qKjwgd2UgYXJlbid0IGluIGNoYXJnZSBvZiB0aGlzIGFkZHJlc3MgdHlwZSAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fT0ssICAgICAgICAgIC8qKjwgd2Ugc2V0IHVwIHRoZSBsaXN0ZW4gKi8KKyAgREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTLCAvKio8IG1hbGZvcm1lZCBhZGRyZXNzICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1QsIC8qKjwgd2VsbC1mb3JtZWQgYWRkcmVzcyBidXQgZmFpbGVkIHRvIHNldCBpdCB1cCAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQgLyoqPCBhZGRyZXNzIGlzIGFscmVhZHkgdXNlZCAqLworfSBEQnVzU2VydmVyTGlzdGVuUmVzdWx0OworCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0IF9kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCit2b2lkIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KTsKKyNlbHNlCisjZGVmaW5lIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYocyxvLG4sdykgXAorICBkbyBcCisgIHtcCisgICAgKHZvaWQpIChvKTsgXAorICAgICh2b2lkKSAobik7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soc2VydmVyKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZWxzZQorI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnQgKCEoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayk7IFwKKyAgICAoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayA9IFRSVUU7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoKHNlcnZlciktPmhhdmVfc2VydmVyX2xvY2spOyAgIFwKKyAgICAoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayA9IEZBTFNFOyAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhzZXJ2ZXIpICAgICAgICBfZGJ1c19hc3NlcnQgKChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrKQorLyogQSAiRE9fTk9UX0hBVkVfTE9DS19DSEVDSyIgaXMgaW1wb3NzaWJsZSBzaW5jZSB3ZSBuZWVkIHRoZSBsb2NrIHRvIGNoZWNrIHRoZSBmbGFnICovCisjZW5kaWYKKworI2RlZmluZSBUUkFDRV9MT0NLUyAwCisKKyNkZWZpbmUgU0VSVkVSX0xPQ0soc2VydmVyKSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiTE9DS1xuIik7IH0gICBcCisgICAgX2RidXNfcm11dGV4X2xvY2sgKChzZXJ2ZXIpLT5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUT09LX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFUlZFUl9VTkxPQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiVU5MT0NLXG4iKTsgIH0gICAgICAgIFwKKyAgICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoc2VydmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X3VubG9jayAoKHNlcnZlciktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfUFJPVEVDVEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMgYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTZmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jCkBAIC0wLDAgKzEsNTk5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXNvY2tldC5jIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyU29ja2V0IERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBTT0NLRVQKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyIG9uIFNPQ0tFVAorICoKKyAqIEB7CisgKi8KKy8qKgorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgU29ja2V0IHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlclNvY2tldCBEQnVzU2VydmVyU29ja2V0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlclNvY2tldC4gQWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1NlcnZlclNvY2tldAoreworICBEQnVzU2VydmVyIGJhc2U7ICAgLyoqPCBQYXJlbnQgY2xhc3MgbWVtYmVycy4gKi8KKyAgaW50IG5fZmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBmaWxlIGhhbmRsZXMgKi8KKyAgREJ1c1NvY2tldCAqZmRzOyAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9yIERCVVNfU09DS0VUX0lOVkFMSUQgaWYgZGlzY29ubmVjdGVkLiAqLworICBEQnVzV2F0Y2ggKip3YXRjaDsgLyoqPCBGaWxlIGRlc2NyaXB0b3Igd2F0Y2guICovCisgIGNoYXIgKnNvY2tldF9uYW1lOyAvKio8IE5hbWUgb2YgZG9tYWluIHNvY2tldCwgdG8gdW5saW5rIGlmIGFwcHJvcHJpYXRlICovCisgIERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZTsgLyoqPCBOb25jZSBmaWxlIHVzZWQgdG8gYXV0aGVudGljYXRlIGNsaWVudHMgKi8KK307CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZmluYWxpemUgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IHNvY2tldF9zZXJ2ZXItPm5fZmRzIDsgaSsrKQorICAgIGlmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSBOVUxMOworICAgICAgfQorCisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+ZmRzKTsKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUpOworICBpZiAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKQorCV9kYnVzX25vbmNlZmlsZV9kZWxldGUgKHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSwgTlVMTCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKTsKKyAgZGJ1c19mcmVlIChzZXJ2ZXIpOworfQorCisvKiBSZXR1cm4gdmFsdWUgaXMganVzdCBmb3IgbWVtb3J5LCBub3Qgb3RoZXIgZmFpbHVyZXMuICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9uZXdfY2xpZW50X2ZkX2FuZF91bmxvY2sgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgIGNsaWVudF9mZCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgdm9pZCAqbmV3X2Nvbm5lY3Rpb25fZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiQ3JlYXRpbmcgbmV3IGNsaWVudCBjb25uZWN0aW9uIHdpdGggZmQgJSIgREJVU19TT0NLRVRfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKGNsaWVudF9mZCkpOworCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICBpZiAoIV9kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKGNsaWVudF9mZCwgTlVMTCkpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9zb2NrZXQgKGNsaWVudF9mZCwgJnNlcnZlci0+Z3VpZF9oZXgsIE5VTEwpOworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIG5vdGUgdGhhdCBjbGllbnRfZmQgaXMgbm93IG93bmVkIGJ5IHRoZSB0cmFuc3BvcnQsIGFuZCB3aWxsIGJlCisgICAqIGNsb3NlZCBvbiB0cmFuc3BvcnQgZGlzY29ubmVjdGlvbi9maW5hbGl6YXRpb24KKyAgICovCisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgdHJhbnNwb3J0ID0gTlVMTDsgLyogbm93IHVuZGVyIHRoZSBjb25uZWN0aW9uIGxvY2sgKi8KKworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFNlZSBpZiBzb21lb25lIHdhbnRzIHRvIGhhbmRsZSB0aGlzIG5ldyBjb25uZWN0aW9uLCBzZWxmLXJlZmVyZW5jaW5nCisgICAqIGZvciBwYXJhbm9pYS4KKyAgICovCisgIG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgbmV3X2Nvbm5lY3Rpb25fZGF0YSA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YTsKKworICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIGlmIChuZXdfY29ubmVjdGlvbl9mdW5jdGlvbikKKyAgICB7CisgICAgICAoKiBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbikgKHNlcnZlciwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm5lY3Rpb25fZGF0YSk7CisgICAgfQorICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKKworICAvKiBJZiBubyBvbmUgZ3JhYmJlZCBhIHJlZmVyZW5jZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBkaWUuICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmIChjb25uZWN0aW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfaGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBEQnVzU2VydmVyU29ja2V0ICpzb2NrZXRfc2VydmVyID0gZGF0YTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIGludCBpOworICBkYnVzX2Jvb2xfdCBmb3VuZCA9IEZBTFNFOworI2VuZGlmCisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBmb3IgKGkgPSAwIDsgaSA8IHNvY2tldF9zZXJ2ZXItPm5fZmRzIDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSA9PSB3YXRjaCkKKyAgICAgICAgZm91bmQgPSBUUlVFOworICAgIH0KKyAgX2RidXNfYXNzZXJ0IChmb3VuZCk7CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlICgiSGFuZGxpbmcgY2xpZW50IGNvbm5lY3Rpb24sIGZsYWdzIDB4JXhcbiIsIGZsYWdzKTsKKworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHsKKyAgICAgIERCdXNTb2NrZXQgY2xpZW50X2ZkOworICAgICAgREJ1c1NvY2tldCBsaXN0ZW5fZmQ7CisgICAgICBpbnQgc2F2ZWRfZXJybm87CisKKyAgICAgIGxpc3Rlbl9mZCA9IF9kYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKTsKKworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSkKKyAgICAgICAgICBjbGllbnRfZmQgPSBfZGJ1c19hY2NlcHRfd2l0aF9ub25jZWZpbGUgKGxpc3Rlbl9mZCwgc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKTsKKyAgICAgIGVsc2UgCisgICAgICAgICAgY2xpZW50X2ZkID0gX2RidXNfYWNjZXB0IChsaXN0ZW5fZmQpOworCisgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICBpZiAoIV9kYnVzX3NvY2tldF9pc192YWxpZCAoY2xpZW50X2ZkKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVJTlRSIGhhbmRsZWQgZm9yIHVzICovCisKKyAgICAgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoc2F2ZWRfZXJybm8pKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIGNsaWVudCBhdmFpbGFibGUgdG8gYWNjZXB0IGFmdGVyIGFsbFxuIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhY2NlcHQgYSBjbGllbnQgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayAoc2VydmVyLCBjbGllbnRfZmQpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlamVjdGVkIGNsaWVudCBjb25uZWN0aW9uIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5ndXAgb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgZm9yIChpID0gMCA7IGkgPCBzb2NrZXRfc2VydmVyLT5uX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNvY2tldF9zZXJ2ZXItPmZkc1tpXSwgTlVMTCk7CisgICAgICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJnNvY2tldF9zZXJ2ZXItPmZkc1tpXSk7CisgICAgfQorCisgIGlmIChzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgdG1wOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsIHNvY2tldF9zZXJ2ZXItPnNvY2tldF9uYW1lKTsKKyAgICAgIF9kYnVzX2RlbGV0ZV9maWxlICgmdG1wLCBOVUxMKTsKKyAgICB9CisKKyAgaWYgKHNlcnZlci0+cHVibGlzaGVkX2FkZHJlc3MpCisgICAgICBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MoKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7Cit9CisKK3N0YXRpYyBjb25zdCBEQnVzU2VydmVyVlRhYmxlIHNvY2tldF92dGFibGUgPSB7CisgIHNvY2tldF9maW5hbGl6ZSwKKyAgc29ja2V0X2Rpc2Nvbm5lY3QKK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuICBUaGUKKyAqIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgYmUgbm9uYmxvY2tpbmcgKHVzZQorICogX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nKCkgdG8gbWFrZSBpdCBzbykuIFRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIHNob3VsZCBiZSBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLCB0aGF0IGlzLCBsaXN0ZW4oKSBzaG91bGQgaGF2ZQorICogYmVlbiBzdWNjZXNzZnVsbHkgaW52b2tlZCBvbiBpdC4gVGhlIHNlcnZlciB3aWxsIHVzZSBhY2NlcHQoKSB0bworICogYWNjZXB0IG5ldyBjbGllbnQgY29ubmVjdGlvbnMuCisgKgorICogQHBhcmFtIGZkcyBsaXN0IG9mIGZpbGUgZGVzY3JpcHRvcnMuCisgKiBAcGFyYW0gbl9mZHMgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBzZXJ2ZXIncyBhZGRyZXNzCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRvIGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIChOVUxMIGlmIG5vdCBuZWVkZWQpCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlCisgKiBAcmV0dXJucyB0aGUgbmV3IHNlcnZlciwgb3IgI05VTEwgb24gT09NIG9yIG90aGVyIGVycm9yLgorICoKKyAqLworREJ1c1NlcnZlcioKK19kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c05vbmNlRmlsZSAgICAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlcjsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBpbnQgaTsKKworICBzb2NrZXRfc2VydmVyID0gZGJ1c19uZXcwIChEQnVzU2VydmVyU29ja2V0LCAxKTsKKyAgaWYgKHNvY2tldF9zZXJ2ZXIgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8wOworCisgIHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSA9IG5vbmNlZmlsZTsKKworICBzb2NrZXRfc2VydmVyLT5mZHMgPSBkYnVzX25ldyAoREJ1c1NvY2tldCwgbl9mZHMpOworICBpZiAoIXNvY2tldF9zZXJ2ZXItPmZkcykKKyAgICBnb3RvIGZhaWxlZF8wOworCisgIHNvY2tldF9zZXJ2ZXItPndhdGNoID0gZGJ1c19uZXcwIChEQnVzV2F0Y2ggKiwgbl9mZHMpOworICBpZiAoIXNvY2tldF9zZXJ2ZXItPndhdGNoKQorICAgIGdvdG8gZmFpbGVkXzE7CisKKyAgZm9yIChpID0gMCA7IGkgPCBuX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBEQnVzV2F0Y2ggKndhdGNoOworCisgICAgICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAoZmRzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2hhbmRsZV93YXRjaCwgc29ja2V0X3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZF8yOworCisgICAgICBzb2NrZXRfc2VydmVyLT5uX2ZkcysrOworICAgICAgc29ja2V0X3NlcnZlci0+ZmRzW2ldID0gZmRzW2ldOworICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSB3YXRjaDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlICgmc29ja2V0X3NlcnZlci0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3Z0YWJsZSwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBmYWlsZWRfMjsKKworICBzZXJ2ZXIgPSAoREJ1c1NlcnZlciopc29ja2V0X3NlcnZlcjsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IG5fZmRzIDsgaSsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc2VydmVyX2FkZF93YXRjaCAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKyAgICAgICAgICAgIF9kYnVzX3NlcnZlcl9yZW1vdmVfd2F0Y2ggKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2pdKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgICAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKCZzb2NrZXRfc2VydmVyLT5iYXNlKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZF8yOworICAgICAgICB9CisgICAgfQorCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsIDAsIDEsICJuZXdfZm9yX3NvY2tldCIpOworICByZXR1cm4gKERCdXNTZXJ2ZXIqKSBzb2NrZXRfc2VydmVyOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisKKyBmYWlsZWRfMToKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5mZHMpOworCisgZmFpbGVkXzA6CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlcik7CisKKyAgaWYgKGVycm9yICE9IE5VTEwgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiBUQ1AuCisgKiBJZiBob3N0IGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byBsb2NhbGhvc3QuCisgKiBJZiBiaW5kIGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgZm9yIHRoZSBob3N0CisgKiBwYXJhbWV0ZXIsIGFuZCBpZiB0aGF0IGlzIE5VTEwsIHRoZW4gbG9jYWxob3N0CisgKiBJZiBiaW5kIGlzIGEgaG9zdG5hbWUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHdpbGwgbGlzdGVuCisgKiBvbiBhbGwgcmV0dXJuZWQgYWRkcmVzc2VzLgorICogSWYgZmFtaWx5IGlzIE5VTEwsIGhvc3RuYW1lIHJlc29sdXRpb24gd2lsbCB0cnkgYWxsIGFkZHJlc3MKKyAqIGZhbWlsaWVzLCBvdGhlcndpc2UgaXQgY2FuIGJlIGlwdjQgb3IgaXB2NiB0byByZXN0cmljdCB0aGUKKyAqIGFkZHJlc3NlcyBjb25zaWRlcmVkLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0bmFtZSB0byByZXBvcnQgZm9yIHRoZSBsaXN0ZW4gYWRkcmVzcworICogQHBhcmFtIGJpbmQgdGhlIGhvc3RuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uIG9yIDAgdG8gbGV0IHRoZSBPUyBjaG9vc2UKKyAqIEBwYXJhbSBmYW1pbHkKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcGFyYW0gdXNlX25vbmNlIHdoZXRoZXIgdG8gdXNlIGEgbm9uY2UgZm9yIGxvdy1sZXZlbCBhdXRoZW50aWNhdGlvbiAobm9uY2UtdGNwIHRyYW5zcG9ydCkgb3Igbm90ICh0Y3AgdHJhbnNwb3J0KQorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgdXNlX25vbmNlKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNTb2NrZXQgKmxpc3Rlbl9mZHMgPSBOVUxMOworICBpbnQgbmxpc3Rlbl9mZHMgPSAwLCBpOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNTdHJpbmcgaG9zdF9zdHI7CisgIERCdXNTdHJpbmcgcG9ydF9zdHI7CisgIERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZTsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5vbmNlZmlsZSA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwb3J0X3N0cikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBpZiAoaG9zdCA9PSBOVUxMKQorICAgIGhvc3QgPSAibG9jYWxob3N0IjsKKworICBpZiAocG9ydCA9PSBOVUxMKQorICAgIHBvcnQgPSAiMCI7CisKKyAgaWYgKGJpbmQgPT0gTlVMTCkKKyAgICBiaW5kID0gaG9zdDsKKyAgZWxzZSBpZiAoc3RyY21wIChiaW5kLCAiKiIpID09IDApCisgICAgYmluZCA9IE5VTEw7CisKKyAgbmxpc3Rlbl9mZHMgPV9kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0IChiaW5kLCBwb3J0LCBmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0ZW5fZmRzLCBlcnJvcik7CisgIGlmIChubGlzdGVuX2ZkcyA8PSAwKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZob3N0X3N0ciwgaG9zdCk7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHVzZV9ub25jZSA/ICJub25jZS10Y3A6aG9zdD0iIDogInRjcDpob3N0PSIpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZob3N0X3N0cikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixwb3J0PSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmcG9ydF9zdHIpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorICBpZiAoZmFtaWx5ICYmCisgICAgICAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLGZhbWlseT0iKSB8fAorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgZmFtaWx5KSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8yOworICAgIH0KKworICBpZiAodXNlX25vbmNlKQorICAgIHsKKyAgICAgIG5vbmNlZmlsZSA9IGRidXNfbmV3MCAoREJ1c05vbmNlRmlsZSwgMSk7CisgICAgICBpZiAobm9uY2VmaWxlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZF8yOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbm9uY2VmaWxlX2NyZWF0ZSAobm9uY2VmaWxlLCBlcnJvcikpCisgICAgICAgICAgZ290byBmYWlsZWRfMzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixub25jZWZpbGU9IikgfHwKKyAgICAgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsIF9kYnVzX25vbmNlZmlsZV9nZXRfcGF0aCAobm9uY2VmaWxlKSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZF80OworICAgICAgICB9CisKKyAgICB9CisKKyAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0IChsaXN0ZW5fZmRzLCBubGlzdGVuX2ZkcywgJmFkZHJlc3MsIG5vbmNlZmlsZSwgZXJyb3IpOworICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgeworICAgICAgaWYgKG5vbmNlZmlsZSAhPSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZF80OworICAgICAgZWxzZQorICAgICAgICBnb3RvIGZhaWxlZF8yOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBvcnRfc3RyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgZGJ1c19mcmVlKGxpc3Rlbl9mZHMpOworCisgIHJldHVybiBzZXJ2ZXI7CisKKyBmYWlsZWRfNDoKKyAgX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAobm9uY2VmaWxlLCBOVUxMKTsKKworIGZhaWxlZF8zOgorICBkYnVzX2ZyZWUgKG5vbmNlZmlsZSk7CisKKyBmYWlsZWRfMjoKKyAgZm9yIChpID0gMCA7IGkgPCBubGlzdGVuX2ZkcyA7IGkrKykKKyAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGxpc3Rlbl9mZHNbaV0sIE5VTEwpOworICBkYnVzX2ZyZWUobGlzdGVuX2Zkcyk7CisKKyBmYWlsZWRfMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwb3J0X3N0cik7CisKKyBmYWlsZWRfMDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgZm9yIHZhcmlvdXMgc29ja2V0LXJlbGF0ZWQKKyAqIGFkZHJlc3NlcyAod2VsbCwgY3VycmVudGx5IG9ubHkgdGNwIGFuZCBub25jZS10Y3ApLgorICoKKyAqIFNldHMgZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBub3QgT0suCisgKgorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqCisgKi8KK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQKK19kYnVzX3NlcnZlcl9saXN0ZW5fc29ja2V0IChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworCisgICpzZXJ2ZXJfcCA9IE5VTEw7CisKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJ0Y3AiKSA9PSAwIHx8IHN0cmNtcCAobWV0aG9kLCAibm9uY2UtdGNwIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpob3N0OworICAgICAgY29uc3QgY2hhciAqcG9ydDsKKyAgICAgIGNvbnN0IGNoYXIgKmJpbmQ7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHk7CisKKyAgICAgIGhvc3QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImhvc3QiKTsKKyAgICAgIGJpbmQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImJpbmQiKTsKKyAgICAgIHBvcnQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInBvcnQiKTsKKyAgICAgIGZhbWlseSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZmFtaWx5Iik7CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgKGhvc3QsIGJpbmQsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksIGVycm9yLCBzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDAgPyBUUlVFIDogRkFMU0UpOworCisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqCisgKiBUaGlzIGlzIGEgYmFkIGhhY2sgc2luY2UgaXQncyByZWFsbHkgdW5peCBkb21haW4gc29ja2V0CisgKiBzcGVjaWZpYy4gQWxzbywgdGhlIGZ1bmN0aW9uIHdlaXJkbHkgYWRvcHRzIG93bmVyc2hpcAorICogb2YgdGhlIHBhc3NlZC1pbiBzdHJpbmcuCisgKgorICogQHBhcmFtIHNlcnZlciBhIHNvY2tldCBzZXJ2ZXIKKyAqIEBwYXJhbSBmaWxlbmFtZSBzb2NrZXQgZmlsZW5hbWUgdG8gcmVwb3J0L2RlbGV0ZQorICoKKyAqLwordm9pZAorX2RidXNfc2VydmVyX3NvY2tldF9vd25fZmlsZW5hbWUgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpmaWxlbmFtZSkKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworCisgIHNvY2tldF9zZXJ2ZXItPnNvY2tldF9uYW1lID0gZmlsZW5hbWU7Cit9CisKKworLyoqIEB9ICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmggYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTg5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItc29ja2V0LmggU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBzb2NrZXRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19TRVJWRVJfU09DS0VUX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfU09DS0VUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1ub25jZS5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAgICAgICAgICAgKERCdXNTb2NrZXQgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOb25jZUZpbGUgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2F1dG9sYXVuY2ggICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0ICAgICAgIChjb25zdCBjaGFyICAgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqYmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgdXNlX25vbmNlKTsKK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CisKKwordm9pZCBfZGJ1c19zZXJ2ZXJfc29ja2V0X293bl9maWxlbmFtZSAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqZmlsZW5hbWUpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIGIvZGJ1cy9kYnVzLXNlcnZlci11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NjRhOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5jCkBAIC0wLDAgKzEsMzc1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXVuaXguYyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIFVuaXggbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1sYXVuY2hkLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtdW5peC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NlcnZlclVuaXggREJ1c1NlcnZlciBpbXBsZW1lbnRhdGlvbnMgZm9yIFVOSVgKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyIG9uIFVOSVgKKyAqCisgKiBAeworICovCisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGluIGEgcGxhdGZvcm0tc3BlY2lmaWMKKyAqIHdheSwgY3JlYXRpbmcgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzZXJ2ZXIgdHlwZSBpZiBhcHByb3ByaWF0ZS4KKyAqIFNldHMgZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBub3QgT0suCisgKgorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqCisgKi8KK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQKK19kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworCisgICpzZXJ2ZXJfcCA9IE5VTEw7CisKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJ1bml4IikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwYXRoIik7CisgICAgICBjb25zdCBjaGFyICp0bXBkaXIgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInRtcGRpciIpOworICAgICAgY29uc3QgY2hhciAqYWJzdHJhY3QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImFic3RyYWN0Iik7CisgICAgICBjb25zdCBjaGFyICpydW50aW1lID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJydW50aW1lIik7CisgICAgICBpbnQgbXV0dWFsbHlfZXhjbHVzaXZlX21vZGVzID0gMDsKKworICAgICAgbXV0dWFsbHlfZXhjbHVzaXZlX21vZGVzID0gKHBhdGggIT0gTlVMTCkgKyAodG1wZGlyICE9IE5VTEwpICsKKyAgICAgICAgKGFic3RyYWN0ICE9IE5VTEwpICsgKHJ1bnRpbWUgIT0gTlVMTCk7CisKKyAgICAgIGlmIChtdXR1YWxseV9leGNsdXNpdmVfbW9kZXMgPCAxKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzKGVycm9yLCAidW5peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHRtcGRpciBvciBhYnN0cmFjdCBvciBydW50aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICBpZiAobXV0dWFsbHlfZXhjbHVzaXZlX21vZGVzID4gMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzcGVjaWZ5IHR3byBvZiBcInBhdGhcIiwgXCJ0bXBkaXJcIiwgXCJhYnN0cmFjdFwiIGFuZCBcInJ1bnRpbWVcIiBhdCB0aGUgc2FtZSB0aW1lIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICBpZiAocnVudGltZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAgICAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgICAgICAgICBjb25zdCBjaGFyICpydW50aW1lZGlyOworCisgICAgICAgICAgaWYgKHN0cmNtcCAocnVudGltZSwgInllcyIpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICJpZiBnaXZlbiwgdGhlIG9ubHkgdmFsdWUgYWxsb3dlZCBmb3IgXCJydW50aW1lXCIgaXMgXCJ5ZXNcIiIpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcnVudGltZWRpciA9IF9kYnVzX2dldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworCisgICAgICAgICAgaWYgKHJ1bnRpbWVkaXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELCAiXCJYREdfUlVOVElNRV9ESVJcIiBpcyBub3Qgc2V0Iik7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgImJ1cyIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX3BhdGgsIHJ1bnRpbWVkaXIpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBXZSBjYW4gc2FmZWx5IHVzZSBmaWxlc3lzdGVtIHNvY2tldHMgaW4gdGhlIHJ1bnRpbWUgZGlyZWN0b3J5LAorICAgICAgICAgICAqIGFuZCB0aGV5IGFyZSBwcmVmZXJyZWQgYmVjYXVzZSB0aGV5IGNhbiBiZSBiaW5kLW1vdW50ZWQgYmV0d2VlbgorICAgICAgICAgICAqIExpbnV4IGNvbnRhaW5lcnMuICovCisgICAgICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAoCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRtcGRpciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAgICAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZpbGVuYW1lLCAiZGJ1cy0iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZmaWxlbmFtZSwgMTAsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX3BhdGgsIHRtcGRpcikgfHwKKyAgICAgICAgICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEFsd2F5cyB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlIGlmIHBvc3NpYmxlIHdpdGggdG1wZGlyICovCisKKyAgICAgICAgICAqc2VydmVyX3AgPQorICAgICAgICAgICAgX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSwKKyNpZmRlZiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBhdGgpCisgICAgICAgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChwYXRoLCBGQUxTRSwgZXJyb3IpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGFic3RyYWN0LCBUUlVFLCBlcnJvcik7CisgICAgICAgIH0KKworICAgICAgaWYgKCpzZXJ2ZXJfcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChtZXRob2QsICJzeXN0ZW1kIikgPT0gMCkKKyAgICB7CisgICAgICBpbnQgaSwgbjsKKyAgICAgIERCdXNTb2NrZXQgKmZkczsKKyAgICAgIERCdXNTdHJpbmcgYWRkcmVzczsKKworICAgICAgbiA9IF9kYnVzX2xpc3Rlbl9zeXN0ZW1kX3NvY2tldHMgKCZmZHMsIGVycm9yKTsKKyAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgICAgICAgZ290byBzeXN0ZW1kX29vbTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIjsiKSkKKyAgICAgICAgICAgICAgICBnb3RvIHN5c3RlbWRfb29tOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICghX2RidXNfYXBwZW5kX2FkZHJlc3NfZnJvbV9zb2NrZXQgKGZkc1tpXSwgJmFkZHJlc3MsIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gc3lzdGVtZF9lcnI7CisgICAgICAgIH0KKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0IChmZHMsIG4sICZhZGRyZXNzLCBOVUxMLCBlcnJvcik7CisgICAgICBpZiAoKnNlcnZlcl9wID09IE5VTEwpCisgICAgICAgIGdvdG8gc3lzdGVtZF9lcnI7CisKKyAgICAgIGRidXNfZnJlZSAoZmRzKTsKKworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKworICBzeXN0ZW1kX29vbToKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgc3lzdGVtZF9lcnI6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZHNbaV0sIE5VTEwpOworICAgICAgICB9CisgICAgICBkYnVzX2ZyZWUgKGZkcyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgImxhdW5jaGQiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZW52Iik7CisgICAgICBpZiAobGF1bmNoZF9lbnZfdmFyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAibGF1bmNoZCIsICJlbnYiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAobGF1bmNoZF9lbnZfdmFyLCBlcnJvcik7CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHdlIGRvbid0IGhhbmRsZSB0aGUgbWV0aG9kLCB3ZSByZXR1cm4gTlVMTCB3aXRoIHRoZQorICAgICAgICogZXJyb3IgdW5zZXQKKyAgICAgICAqLworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gVW5peCBkb21haW4gc29ja2V0LgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGZvciB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgREJ1c1NvY2tldCBsaXN0ZW5fZmQ7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgY2hhciAqcGF0aF9jb3B5OworICBEQnVzU3RyaW5nIHBhdGhfc3RyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnBhdGhfc3RyLCBwYXRoKTsKKyAgaWYgKChhYnN0cmFjdCAmJgorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXg6YWJzdHJhY3Q9IikpIHx8CisgICAgICAoIWFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDpwYXRoPSIpKSB8fAorICAgICAgIV9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKCZhZGRyZXNzLCAmcGF0aF9zdHIpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyAgICAgIHBhdGhfY29weSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcGF0aF9jb3B5ID0gX2RidXNfc3RyZHVwIChwYXRoKTsKKyAgICAgIGlmIChwYXRoX2NvcHkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgICAgIH0KKyAgICB9CisKKyAgbGlzdGVuX2ZkLmZkID0gX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0IChwYXRoLCBhYnN0cmFjdCwgZXJyb3IpOworCisgIGlmIChsaXN0ZW5fZmQuZmQgPCAwKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkXzE7CisgICAgfQorCisgIHNlcnZlciA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAoJmxpc3Rlbl9mZCwgMSwgJmFkZHJlc3MsIDAsIGVycm9yKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorCisgIGlmIChwYXRoX2NvcHkgIT0gTlVMTCkKKyAgICBfZGJ1c19zZXJ2ZXJfc29ja2V0X293bl9maWxlbmFtZShzZXJ2ZXIsIHBhdGhfY29weSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICByZXR1cm4gc2VydmVyOworCisgZmFpbGVkXzI6CisgIF9kYnVzX2Nsb3NlX3NvY2tldCAobGlzdGVuX2ZkLCBOVUxMKTsKKyBmYWlsZWRfMToKKyAgZGJ1c19mcmVlIChwYXRoX2NvcHkpOworIGZhaWxlZF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgIHJldHVybiBOVUxMOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5oIGIvZGJ1cy9kYnVzLXNlcnZlci11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiOTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItdW5peC5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3IgVW5peCBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9VTklYX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfVU5JWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmMgYi9kYnVzL2RidXMtc2VydmVyLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLXdpbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItd2luLmMgU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBXSU4gbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXdpbi5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyV2luIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBXaW5kb3dzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciBvbiBXaW5kb3dzIAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYworICogd2F5LCBjcmVhdGluZyBhIHBsYXRmb3JtLXNwZWNpZmljIHNlcnZlciB0eXBlIGlmIGFwcHJvcHJpYXRlLgorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqIAorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqIAorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgID0gTlVMTDsKKworICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImF1dG9sYXVuY2giKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKmJpbmQgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQgPSAiMCI7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHkgPSAiaXB2NCI7CisgICAgICBjb25zdCBjaGFyICpzY29wZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAic2NvcGUiKTsKKworICAgICAgaWYgKF9kYnVzX2RhZW1vbl9pc19zZXNzaW9uX2J1c19hZGRyZXNzX3B1Ymxpc2hlZCAoc2NvcGUpKQorICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQ7CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgKGhvc3QsIGJpbmQsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksIGVycm9yLCBGQUxTRSk7CisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICAoKnNlcnZlcl9wKS0+cHVibGlzaGVkX2FkZHJlc3MgPQorICAgICAgICAgICAgICBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICgoKnNlcnZlcl9wKS0+YWRkcmVzcywgc2NvcGUpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIG1ha2Ugc3VyZSBubyBoYW5kbGUgaXMgb3BlbgorICAgICAgICAgIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKiogQH0gKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci13aW4uaCBiL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci13aW4uaCBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRvd3MgbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9XSU5fSAorI2RlZmluZSBEQlVTX1NFUlZFUl9XSU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyogYWRkIGRlZmluaXRpb25zIGhlcmUgKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLmMgYi9kYnVzL2RidXMtc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmOTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXIuYwpAQCAtMCwwICsxLDEyNDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuYyBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8gCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiZGJ1cy1hZGRyZXNzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyIERCdXNTZXJ2ZXIKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgU2VydmVyIHRoYXQgbGlzdGVucyBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICoKKyAqIEEgREJ1c1NlcnZlciByZXByZXNlbnRzIGEgc2VydmVyIHRoYXQgb3RoZXIgYXBwbGljYXRpb25zCisgKiBjYW4gY29ubmVjdCB0by4gRWFjaCBjb25uZWN0aW9uIGZyb20gYW5vdGhlciBhcHBsaWNhdGlvbgorICogaXMgcmVwcmVzZW50ZWQgYnkgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQHRvZG8gVGhyZWFkIHNhZmV0eSBoYXNuJ3QgYmVlbiB0ZXN0ZWQgbXVjaCBmb3IgI0RCdXNTZXJ2ZXIKKyAqIEB0b2RvIE5lZWQgbm90aWZpY2F0aW9uIHRvIGFwcHMgb2YgZGlzY29ubmVjdGlvbiwgbWF5IG1hdHRlciBmb3Igc29tZSB0cmFuc3BvcnRzCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NlcnZlckludGVybmFscyBEQnVzU2VydmVyIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyCisgKgorICogQHsKKyAqLworCisjaWZuZGVmIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYKK3ZvaWQKK19kYnVzX3NlcnZlcl90cmFjZV9yZWYgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KQoreworICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBfZGJ1c190cmFjZV9yZWYgKCJEQnVzU2VydmVyIiwgc2VydmVyLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5LAorICAgICAgIkRCVVNfU0VSVkVSX1RSQUNFIiwgJmVuYWJsZWQpOworfQorI2VuZGlmCisKKy8qIHRoaXMgaXMgYSBsaXR0bGUgZnJhZ2lsZSBzaW5jZSBpdCBhc3N1bWVzIHRoZSBhZGRyZXNzIGRvZXNuJ3QKKyAqIGFscmVhZHkgaGF2ZSBhIGd1aWQsIGJ1dCBpdCBzaG91bGRuJ3QKKyAqLworc3RhdGljIGNoYXIqCitjb3B5X2FkZHJlc3Nfd2l0aF9ndWlkX2FwcGVuZGVkIChjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3VpZF9oZXgpCit7CisgIERCdXNTdHJpbmcgd2l0aF9ndWlkOworICBjaGFyICpyZXR2YWw7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmd2l0aF9ndWlkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChhZGRyZXNzLCAwLCAmd2l0aF9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJndpdGhfZ3VpZCkpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJndpdGhfZ3VpZCwgIixndWlkPSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2NvcHkgKGd1aWRfaGV4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2l0aF9ndWlkLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJndpdGhfZ3VpZCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmd2l0aF9ndWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJndpdGhfZ3VpZCwgJnJldHZhbCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ3aXRoX2d1aWQpOworICAgICAgCisgIHJldHVybiByZXR2YWw7IC8qIG1heSBiZSBOVUxMIGlmIHN0ZWFsX2RhdGEgZmFpbGVkICovCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgdGhlIERCdXNTZXJ2ZXIgYmFzZSBjbGFzcy4KKyAqIENoYWluZWQgdXAgdG8gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZ0YWJsZSBmb3IgdGhlIHN1YmNsYXNzLgorICogQHBhcmFtIGFkZHJlc3MgdGhlIHNlcnZlcidzIGFkZHJlc3MKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIHNlcnZlci0+dnRhYmxlID0gdnRhYmxlOworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisjZWxzZQorICAgIHsKKyAgICAgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID09IDApOworICAgIH0KKyNlbmRpZgorCisgIHNlcnZlci0+YWRkcmVzcyA9IE5VTEw7CisgIHNlcnZlci0+d2F0Y2hlcyA9IE5VTEw7CisgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICBzZXJ2ZXItPnB1Ymxpc2hlZF9hZGRyZXNzID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlcnZlci0+Z3VpZF9oZXgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV91dWlkICgmc2VydmVyLT5ndWlkLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c191dWlkX2VuY29kZSAoJnNlcnZlci0+Z3VpZCwgJnNlcnZlci0+Z3VpZF9oZXgpKQorICAgIGdvdG8gb29tOworICAKKyAgc2VydmVyLT5hZGRyZXNzID0gY29weV9hZGRyZXNzX3dpdGhfZ3VpZF9hcHBlbmRlZCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+Z3VpZF9oZXgpOworICBpZiAoc2VydmVyLT5hZGRyZXNzID09IE5VTEwpCisgICAgZ290byBvb207CisgIAorICBfZGJ1c19ybXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmc2VydmVyLT5tdXRleCk7CisgIGlmIChzZXJ2ZXItPm11dGV4ID09IE5VTEwpCisgICAgZ290byBvb207CisgIAorICBzZXJ2ZXItPndhdGNoZXMgPSBfZGJ1c193YXRjaF9saXN0X25ldyAoKTsKKyAgaWYgKHNlcnZlci0+d2F0Y2hlcyA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHNlcnZlci0+dGltZW91dHMgPSBfZGJ1c190aW1lb3V0X2xpc3RfbmV3ICgpOworICBpZiAoc2VydmVyLT50aW1lb3V0cyA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZzZXJ2ZXItPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWxpemVkIHNlcnZlciBvbiBhZGRyZXNzICVzXG4iLCBzZXJ2ZXItPmFkZHJlc3MpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyBmYWlsZWQ6CisgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmc2VydmVyLT5tdXRleCk7CisgIHNlcnZlci0+bXV0ZXggPSBOVUxMOworICBpZiAoc2VydmVyLT53YXRjaGVzKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAoc2VydmVyLT53YXRjaGVzKTsKKyAgICAgIHNlcnZlci0+d2F0Y2hlcyA9IE5VTEw7CisgICAgfQorICBpZiAoc2VydmVyLT50aW1lb3V0cykKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoc2VydmVyLT50aW1lb3V0cyk7CisgICAgICBzZXJ2ZXItPnRpbWVvdXRzID0gTlVMTDsKKyAgICB9CisgIGlmIChzZXJ2ZXItPmFkZHJlc3MpCisgICAgeworICAgICAgZGJ1c19mcmVlIChzZXJ2ZXItPmFkZHJlc3MpOworICAgICAgc2VydmVyLT5hZGRyZXNzID0gTlVMTDsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmVyLT5ndWlkX2hleCk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRmluYWxpemVzIHRoZSBtZW1iZXJzIG9mIHRoZSBEQnVzU2VydmVyIGJhc2UgY2xhc3MuCisgKiBDaGFpbmVkIHVwIHRvIGJ5IHN1YmNsYXNzIGZpbmFsaXplcnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICAvKiBXZSBkb24ndCBoYXZlIHRoZSBsb2NrLCBidXQgbm9ib2R5IHNob3VsZCBiZSBhY2Nlc3NpbmcKKyAgICogY29uY3VycmVudGx5IHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZSBhIHJlZgorICAgKi8KKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBfZGJ1c19hc3NlcnQgKCFzZXJ2ZXItPmhhdmVfc2VydmVyX2xvY2spOworI2VuZGlmCisgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT5kaXNjb25uZWN0ZWQpOworICAKKyAgLyogY2FsbHMgb3V0IHRvIGFwcGxpY2F0aW9uIGNvZGUuLi4gKi8KKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJnNlcnZlci0+c2xvdF9saXN0KTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKHNlcnZlciwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzZXJ2ZXItPndhdGNoZXMpOworICBfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoc2VydmVyLT50aW1lb3V0cyk7CisKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgCisgIGRidXNfZnJlZSAoc2VydmVyLT5hZGRyZXNzKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2ZXItPmd1aWRfaGV4KTsKK30KKworCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c1dhdGNoQWRkRnVuY3Rpb24pICAgICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uKSAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2F0Y2hUb2dnbGVGdW5jdGlvbikgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZW5hYmxlZCk7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbiByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVGdW5jdGlvbiB0b2dnbGVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICBlbmFibGVkKQoreworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgLyogVGhpcyBpc24ndCByZWFsbHkgc2FmZSBvciByZWFzb25hYmxlOyBhIGJldHRlciBwYXR0ZXJuIGlzIHRoZSAiZG8KKyAgICogZXZlcnl0aGluZywgdGhlbiBkcm9wIGxvY2sgYW5kIGNhbGwgb3V0IiBvbmU7IGJ1dCBpdCBoYXMgdG8gYmUKKyAgICogcHJvcGFnYXRlZCB1cCB0aHJvdWdoIGFsbCBjYWxsZXJzCisgICAqLworICAKKyAgd2F0Y2hlcyA9IHNlcnZlci0+d2F0Y2hlczsKKyAgaWYgKHdhdGNoZXMpCisgICAgeworICAgICAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgICAgIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgKHNlcnZlcik7CisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgICAgICBpZiAoYWRkX2Z1bmN0aW9uKQorICAgICAgICByZXR2YWwgPSAoKiBhZGRfZnVuY3Rpb24pICh3YXRjaGVzLCB3YXRjaCk7CisgICAgICBlbHNlIGlmIChyZW1vdmVfZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKHdhdGNoZXMsIHdhdGNoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiB0b2dnbGVfZnVuY3Rpb24pICh3YXRjaGVzLCB3YXRjaCwgZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgICAgICBzZXJ2ZXItPndhdGNoZXMgPSB3YXRjaGVzOworICAgICAgX2RidXNfc2VydmVyX3VucmVmX3VubG9ja2VkIChzZXJ2ZXIpOworCisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBZGRzIGEgd2F0Y2ggZm9yIHRoaXMgc2VydmVyLCBjaGFpbmluZyBvdXQgdG8gYXBwbGljYXRpb24tcHJvdmlkZWQKKyAqIHdhdGNoIGhhbmRsZXJzLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gYWRkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2VydmVyX2FkZF93YXRjaCAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAqd2F0Y2gpCit7CisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKyAgcmV0dXJuIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKHNlcnZlciwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgd2F0Y2ggcHJldmlvdXNseSBhZGRlZCB3aXRoIF9kYnVzX3NlcnZlcl9yZW1vdmVfd2F0Y2goKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCAgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICp3YXRjaCkKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChzZXJ2ZXIsIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYWxsIHdhdGNoIGFuZCBub3RpZmllcyBhcHAgdmlhIHNlcnZlcidzCisgKiBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfc2VydmVyX3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1NlcnZlciAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGVuYWJsZWQpCit7CisgIF9kYnVzX3dhdGNoX2xpc3RfdG9nZ2xlX2FsbF93YXRjaGVzIChzZXJ2ZXItPndhdGNoZXMsIGVuYWJsZWQpOworfQorCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEFkZEZ1bmN0aW9uKSAgICAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisKKworc3RhdGljIGRidXNfYm9vbF90Citwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0QWRkRnVuY3Rpb24gICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbiB0b2dnbGVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IHNhZmUgb3IgcmVhc29uYWJsZTsgYSBiZXR0ZXIgcGF0dGVybiBpcyB0aGUgImRvIGV2ZXJ5dGhpbmcsIHRoZW4KKyAgICogZHJvcCBsb2NrIGFuZCBjYWxsIG91dCIgb25lOyBidXQgaXQgaGFzIHRvIGJlIHByb3BhZ2F0ZWQgdXAgdGhyb3VnaCBhbGwgY2FsbGVycworICAgKi8KKyAgCisgIHRpbWVvdXRzID0gc2VydmVyLT50aW1lb3V0czsKKyAgaWYgKHRpbWVvdXRzKQorICAgIHsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICAgICAgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCAoc2VydmVyKTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgICAgIGlmIChhZGRfZnVuY3Rpb24pCisgICAgICAgIHJldHZhbCA9ICgqIGFkZF9mdW5jdGlvbikgKHRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgIGVsc2UgaWYgKHJlbW92ZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHRvZ2dsZV9mdW5jdGlvbikgKHRpbWVvdXRzLCB0aW1lb3V0LCBlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSB0aW1lb3V0czsKKyAgICAgIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoc2VydmVyKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQWRkcyBhIHRpbWVvdXQgZm9yIHRoaXMgc2VydmVyLCBjaGFpbmluZyBvdXQgdG8KKyAqIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHRpbWVvdXQgaGFuZGxlcnMuIFRoZSB0aW1lb3V0IHNob3VsZCBiZQorICogcmVwZWF0ZWRseSBoYW5kbGVkIHdpdGggZGJ1c190aW1lb3V0X2hhbmRsZSgpIGF0IGl0cyBnaXZlbiBpbnRlcnZhbAorICogdW50aWwgaXQgaXMgcmVtb3ZlZC4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byBhZGQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICpzZXJ2ZXIsCisJCQkgIERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9hZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB0aW1lb3V0IHByZXZpb3VzbHkgYWRkZWQgd2l0aCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQoKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9yZW1vdmVfdGltZW91dCAoREJ1c1NlcnZlciAgKnNlcnZlciwKKwkJCSAgICAgREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoc2VydmVyLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBUb2dnbGVzIGEgdGltZW91dCBhbmQgbm90aWZpZXMgYXBwIHZpYSBzZXJ2ZXIncworICogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB0aW1lb3V0IHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0IChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGVuYWJsZWQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoc2VydmVyLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3RvZ2dsZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisKKy8qKgorICogTGlrZSBkYnVzX3NlcnZlcl9yZWYoKSBidXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgbG9jayAobXVzdCBhbHJlYWR5IGJlIGhlbGQpCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID4gMCk7CisgIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKHNlcnZlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZl91bmxvY2tlZCIpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19zZXJ2ZXJfdW5yZWYoKSBidXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgbG9jayAobXVzdCBhbHJlYWR5IGJlIGhlbGQpCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICAvKiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIGRidXNfc2VydmVyX3VucmVmICovCisKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPiAwKTsKKworICBfZGJ1c19zZXJ2ZXJfdHJhY2VfcmVmIChzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwKKyAgICAgICJ1bnJlZl91bmxvY2tlZCIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+ZGlzY29ubmVjdGVkKTsKKyAgICAgIAorICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICgqIHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSkgKHNlcnZlcik7CisgICAgfQorfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKgorICogQHsKKyAqLworCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1NlcnZlcgorICoKKyAqIEFuIG9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgc2VydmVyIHRoYXQgbGlzdGVucyBmb3IKKyAqIGNvbm5lY3Rpb25zIGZyb20gb3RoZXIgYXBwbGljYXRpb25zLiBFYWNoIHRpbWUgYSBjb25uZWN0aW9uCisgKiBpcyBtYWRlLCBhIG5ldyBEQnVzQ29ubmVjdGlvbiBpcyBjcmVhdGVkIGFuZCBtYWRlIGF2YWlsYWJsZQorICogdmlhIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24uCisgKiBUaGUgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoCisgKiBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24oKS4KKyAqIAorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICBEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICgqIGZ1bmMpIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK30gbGlzdGVuX2Z1bmNzW10gPSB7CisgIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQgfQorICAsIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyB9CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgLCB7IF9kYnVzX3NlcnZlcl9saXN0ZW5fZGVidWdfcGlwZSB9CisjZW5kaWYKK307CisKKy8qKgorICogTGlzdGVucyBmb3IgbmV3IGNvbm5lY3Rpb25zIG9uIHRoZSBnaXZlbiBhZGRyZXNzLiAgSWYgdGhlcmUgYXJlCisgKiBtdWx0aXBsZSBzZW1pY29sb24tc2VwYXJhdGVkIGFkZHJlc3MgZW50cmllcyBpbiB0aGUgYWRkcmVzcywgdHJpZXMKKyAqIGVhY2ggb25lIGFuZCBsaXN0ZW5zIG9uIHRoZSBmaXJzdCBvbmUgdGhhdCB3b3Jrcy4KKyAqIAorICogUmV0dXJucyAjTlVMTCBhbmQgc2V0cyBlcnJvciBpZiBsaXN0ZW5pbmcgZmFpbHMgZm9yIGFueSByZWFzb24uCisgKiBPdGhlcndpc2UgcmV0dXJucyBhIG5ldyAjREJ1c1NlcnZlci4KKyAqIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLAorICogZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLCBhbmQKKyAqIGRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgdG8KKyAqIHJlbmRlciB0aGUgc2VydmVyIGZ1bGx5IGZ1bmN0aW9uYWwuCisgKgorICogVG8gZnJlZSB0aGUgc2VydmVyLCBhcHBsaWNhdGlvbnMgbXVzdCBjYWxsIGZpcnN0CisgKiBkYnVzX3NlcnZlcl9kaXNjb25uZWN0KCkgYW5kIHRoZW4gZGJ1c19zZXJ2ZXJfdW5yZWYoKS4KKyAqIAorICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIuCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlLgorICogQHJldHVybnMgYSBuZXcgI0RCdXNTZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKiAKKyAqLworREJ1c1NlcnZlcioKK2RidXNfc2VydmVyX2xpc3RlbiAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzQWRkcmVzc0VudHJ5ICoqZW50cmllczsKKyAgaW50IGxlbiwgaTsKKyAgREJ1c0Vycm9yIGZpcnN0X2Nvbm5lY3RfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGRidXNfYm9vbF90IGhhbmRsZWRfb25jZTsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoYWRkcmVzcyAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOworCisgIHNlcnZlciA9IE5VTEw7CisgIGhhbmRsZWRfb25jZSA9IEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKworICAgICAgZm9yIChqID0gMDsgaiA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGxpc3Rlbl9mdW5jcyk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIERCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgcmVzdWx0OworICAgICAgICAgIERCdXNFcnJvciB0bXBfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgICAgICByZXN1bHQgPSAoKiBsaXN0ZW5fZnVuY3Nbal0uZnVuYykgKGVudHJpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9lcnJvcik7CisKKyAgICAgICAgICBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIGhhbmRsZWRfb25jZSA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyID09IE5VTEwpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UsCisgICAgICAgICAgICAgICAgICAgICAgICJBZGRyZXNzICclcycgYWxyZWFkeSB1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pKTsKKyAgICAgICAgICAgICAgaGFuZGxlZF9vbmNlID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9CQURfQUREUkVTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgaGFuZGxlZF9vbmNlID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgICAgICAgICAgLyoga2VlcCB0cnlpbmcgYWRkcmVzc2VzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyID09IE5VTEwpOworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IpKQorICAgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgJmZpcnN0X2Nvbm5lY3RfZXJyb3IpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgLyoga2VlcCB0cnlpbmcgYWRkcmVzc2VzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICB9CisKKyBvdXQ6CisKKyAgaWYgKCFoYW5kbGVkX29uY2UpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHR5cGUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyaWVzWzBdKSk7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgYWRkcmVzcyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpOworICAgIH0KKyAgCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworCisgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKCZmaXJzdF9jb25uZWN0X2Vycm9yKSB8fAorICAgICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworICAgICAgCisgICAgICBpZiAoZXJyb3IgJiYgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIGFscmVhZHkgc2V0IHRoZSBlcnJvciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBkaWRuJ3Qgc2V0IHRoZSBlcnJvciBidXQgZWl0aGVyIGVycm9yIHNob3VsZCBiZQorICAgICAgICAgICAqIE5VTEwgb3IgZmlyc3RfY29ubmVjdF9lcnJvciBzaG91bGQgYmUgc2V0LgorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IpKTsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZmaXJzdF9jb25uZWN0X2Vycm9yLCBlcnJvcik7CisgICAgICAgIH0KKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZmlyc3RfY29ubmVjdF9lcnJvcik7IC8qIGJlIHN1cmUgd2UgZnJlZWQgaXQgKi8KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzU2VydmVyLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEByZXR1cm5zIHRoZSBzZXJ2ZXIKKyAqLworREJ1c1NlcnZlciAqCitkYnVzX3NlcnZlcl9yZWYgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG9sZF9yZWZjb3VudCA8PSAwKSkKKyAgICB7CisgICAgICBfZGJ1c19hdG9taWNfZGVjICgmc2VydmVyLT5yZWZjb3VudCk7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgIm9sZF9yZWZjb3VudCA+IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICBfZGJ1c19zZXJ2ZXJfdHJhY2VfcmVmIChzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwgInJlZiIpOworCisgIHJldHVybiBzZXJ2ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1NlcnZlci4gIEZpbmFsaXplcyB0aGUKKyAqIHNlcnZlciBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBUaGUgc2VydmVyIG11c3QgYmUgZGlzY29ubmVjdGVkIGJlZm9yZSB0aGUgcmVmY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfdW5yZWYgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICAvKiBrZWVwIHRoaXMgaW4gc3luYyB3aXRoIHVucmVmX3VubG9ja2VkICovCisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmc2VydmVyLT5yZWZjb3VudCk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG9sZF9yZWZjb3VudCA8PSAwKSkKKyAgICB7CisgICAgICAvKiB1bmRvIHNpZGUtZWZmZWN0IGZpcnN0CisgICAgICAgKiBwbGVhc2UgZG8gbm90IHRyeSB0byBzaW1wbGlmeSB0aGUgY29kZSBoZXJlIGJ5IHVzaW5nCisgICAgICAgKiBfZGJ1c19hdG9taWNfZ2V0KCksIHdoeSB3ZSBkb24ndCB1c2UgaXQgaXMKKyAgICAgICAqIGJlY2F1c2UgaXQgaXNzdWVzIGFub3RoZXIgYXRvbWljIG9wZXJhdGlvbiBldmVuIHRob3VnaAorICAgICAgICogREJVU19ESVNBQkxFX0NIRUNLUyBkZWZpbmVkLgorICAgICAgICogQnVnOiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD02ODMwMworICAgICAgICovCisgICAgICBfZGJ1c19hdG9taWNfaW5jICgmc2VydmVyLT5yZWZjb3VudCk7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgIm9sZF9yZWZjb3VudCA+IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoc2VydmVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsICJ1bnJlZiIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICAvKiBsb2NrIG5vdCBoZWxkISAqLworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPmRpc2Nvbm5lY3RlZCk7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT52dGFibGUtPmZpbmFsaXplICE9IE5VTEwpOworICAgICAgCisgICAgICAoKiBzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUpIChzZXJ2ZXIpOworICAgIH0KK30KKworLyoqCisgKiBSZWxlYXNlcyB0aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgc3RvcHMgbGlzdGVuaW5nIGZvcgorICogbmV3IGNsaWVudHMuIElmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgb25seSB0aGUgZmlyc3QKKyAqIGNhbGwgaGFzIGFuIGVmZmVjdC4gRG9lcyBub3QgbW9kaWZ5IHRoZSBzZXJ2ZXIncworICogcmVmZXJlbmNlIGNvdW50LgorICogCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK2RidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMKTsKKworICBkYnVzX3NlcnZlcl9yZWYgKHNlcnZlcik7CisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworCisgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT52dGFibGUtPmRpc2Nvbm5lY3QgIT0gTlVMTCk7CisKKyAgaWYgKCFzZXJ2ZXItPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICAvKiB0aGlzIGhhcyB0byBiZSBmaXJzdCBzbyByZWN1cnNpdmUgY2FsbHMgdG8gZGlzY29ubmVjdCBkb24ndCBoYXBwZW4gKi8KKyAgICAgIHNlcnZlci0+ZGlzY29ubmVjdGVkID0gVFJVRTsKKyAgICAgIAorICAgICAgKCogc2VydmVyLT52dGFibGUtPmRpc2Nvbm5lY3QpIChzZXJ2ZXIpOworICAgIH0KKworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBzZXJ2ZXIgaXMgc3RpbGwgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHJldHZhbCA9ICFzZXJ2ZXItPmRpc2Nvbm5lY3RlZDsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciwgYXMgYSBuZXdseS1hbGxvY2F0ZWQKKyAqIHN0cmluZyB3aGljaCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCisgKiBAcmV0dXJucyB0aGUgYWRkcmVzcyBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfc2VydmVyX2dldF9hZGRyZXNzIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGNoYXIgKnJldHZhbDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICByZXR2YWwgPSBfZGJ1c19zdHJkdXAgKHNlcnZlci0+YWRkcmVzcyk7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmlxdWUgSUQgb2YgdGhlIHNlcnZlciwgYXMgYSBuZXdseS1hbGxvY2F0ZWQKKyAqIHN0cmluZyB3aGljaCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgSUQgaXMKKyAqIG5vcm1hbGx5IHVzZWQgYnkgY2xpZW50cyB0byB0ZWxsIHdoZW4gdHdvICNEQnVzQ29ubmVjdGlvbgorICogd291bGQgYmUgZXF1aXZhbGVudCAoYmVjYXVzZSB0aGUgc2VydmVyIGFkZHJlc3MgcGFzc2VkCisgKiB0byBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIHdpbGwgaGF2ZSB0aGUgc2FtZSBndWlkIGluIHRoZQorICogdHdvIGNhc2VzKS4gZGJ1c19jb25uZWN0aW9uX29wZW4oKSBjYW4gcmUtdXNlIGFuIGV4aXN0aW5nCisgKiBjb25uZWN0aW9uIHdpdGggdGhlIHNhbWUgSUQgaW5zdGVhZCBvZiBvcGVuaW5nIGEgbmV3CisgKiBjb25uZWN0aW9uLgorICoKKyAqIFRoaXMgaXMgYW4gSUQgdW5pcXVlIHRvIGVhY2ggI0RCdXNTZXJ2ZXIuIFJlbWVtYmVyIHRoYXQKKyAqIGEgI0RCdXNTZXJ2ZXIgcmVwcmVzZW50cyBvbmx5IG9uZSBtb2RlIG9mIGNvbm5lY3RpbmcsCisgKiBzbyBlLmcuIGEgYnVzIGRhZW1vbiBjYW4gbGlzdGVuIG9uIG11bHRpcGxlIGFkZHJlc3NlcworICogd2hpY2ggd2lsbCBtZWFuIGl0IGhhcyBtdWx0aXBsZSAjREJ1c1NlcnZlciBlYWNoIHdpdGgKKyAqIHRoZWlyIG93biBJRC4KKyAqCisgKiBUaGUgSUQgaXMgbm90IGEgVVVJRCBpbiB0aGUgc2Vuc2Ugb2YgUkZDNDEyMjsgdGhlIGRldGFpbHMKKyAqIGFyZSBleHBsYWluZWQgaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCisgKiBAcmV0dXJucyB0aGUgaWQgb2YgdGhlIHNlcnZlciBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfc2VydmVyX2dldF9pZCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBjaGFyICpyZXR2YWw7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgcmV0dmFsID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJnNlcnZlci0+Z3VpZF9oZXgsICZyZXR2YWwpOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyBhIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGhhbmRsaW5nIG5ldyBjb25uZWN0aW9ucy4gIFRoZSBnaXZlbgorICogZnVuY3Rpb24gaXMgcGFzc2VkIGVhY2ggbmV3IGNvbm5lY3Rpb24gYXMgdGhlIGNvbm5lY3Rpb24gaXMKKyAqIGNyZWF0ZWQuIElmIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBjb25uZWN0aW9uJ3MKKyAqIHJlZmVyZW5jZSBjb3VudCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBzdGF5IGFsaXZlLiBPdGhlcndpc2UsIHRoZQorICogY29ubmVjdGlvbiB3aWxsIGJlIHVucmVmZXJlbmNlZCBhbmQgY2xvc2VkLiBUaGUgbmV3IGNvbm5lY3Rpb24KKyAqIGZ1bmN0aW9uIG1heSBhbHNvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiwgd2hpY2ggaXMgY29uc2lkZXJlZAorICogZ29vZCBmb3JtIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCB3YW50ZWQuCisgKgorICogVGhlIGNvbm5lY3Rpb24gaGVyZSBpcyBwcml2YXRlIGluIHRoZSBzZW5zZSBvZgorICogZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpLCBzbyBpZiB0aGUgbmV3IGNvbm5lY3Rpb24gZnVuY3Rpb24KKyAqIGtlZXBzIGEgcmVmZXJlbmNlIGl0IG11c3QgYXJyYW5nZSBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gYmUgY2xvc2VkLgorICogaS5lLiBsaWJkYnVzIGRvZXMgbm90IG93biB0aGlzIGNvbm5lY3Rpb24gb25jZSB0aGUgbmV3IGNvbm5lY3Rpb24KKyAqIGZ1bmN0aW9uIHRha2VzIGEgcmVmZXJlbmNlLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBmdW5jdGlvbiBhIGZ1bmN0aW9uIHRvIGhhbmRsZSBuZXcgY29ubmVjdGlvbnMuCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIG5ldyBjb25uZWN0aW9uIGhhbmRsZXIuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2RidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmN0aW9uOworICB2b2lkICpvbGRfZGF0YTsKKyAgCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIG9sZF9mcmVlX2Z1bmN0aW9uID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mcmVlX2RhdGFfZnVuY3Rpb247CisgIG9sZF9kYXRhID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhOworICAKKyAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2RhdGEgPSBkYXRhOworICBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2ZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAKKyAgaWYgKG9sZF9mcmVlX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogb2xkX2ZyZWVfZnVuY3Rpb24pIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgd2F0Y2ggZnVuY3Rpb25zIGZvciB0aGUgc2VydmVyLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gbG9vcCBhd2FyZSBvZiBmaWxlCisgKiBkZXNjcmlwdG9ycyB0aGF0IG5lZWQgdG8gYmUgbW9uaXRvcmVkIGZvciBldmVudHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpOworICogc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHJvdXRpbmUuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIGFkZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZWdpbiBtb25pdG9yaW5nIGEgbmV3IGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHN0b3AgbW9uaXRvcmluZyBhIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgd2hlbiB0aGUgd2F0Y2ggaXMgZW5hYmxlZC9kaXNhYmxlZAorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChEQnVzU2VydmVyICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICB3YXRjaGVzID0gc2VydmVyLT53YXRjaGVzOworICBzZXJ2ZXItPndhdGNoZXMgPSBOVUxMOworICBpZiAod2F0Y2hlcykKKyAgICB7CisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgcmVzdWx0ID0gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zICh3YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiUmUtZW50cmFudCBjYWxsIHRvICVzXG4iLCBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0KKyAgc2VydmVyLT53YXRjaGVzID0gd2F0Y2hlczsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdGltZW91dCBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIuIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiBsb29wIGF3YXJlIG9mIHRpbWVvdXRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpOworICogc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHJvdXRpbmUuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIGFkZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBhZGQgYSB0aW1lb3V0LgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byByZW1vdmUgYSB0aW1lb3V0LgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IHdoZW4gdGhlIHRpbWVvdXQgaXMgZW5hYmxlZC9kaXNhYmxlZAorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKwkJCQkgICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisJCQkJICAgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCSAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dHM7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHRpbWVvdXRzID0gc2VydmVyLT50aW1lb3V0czsKKyAgc2VydmVyLT50aW1lb3V0cyA9IE5VTEw7CisgIGlmICh0aW1lb3V0cykKKyAgICB7CisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgcmVzdWx0ID0gX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKHRpbWVvdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIlJlLWVudHJhbnQgY2FsbCB0byAlc1xuIiwgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9CisgIHNlcnZlci0+dGltZW91dHMgPSB0aW1lb3V0czsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGF0IHRoaXMgc2VydmVyIG9mZmVycyB0bworICogY2xpZW50cywgYXMgYSAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIG1lY2hhbmlzbSBuYW1lcy4gVGhpcworICogZnVuY3Rpb24gb25seSBhZmZlY3RzIGNvbm5lY3Rpb25zIGNyZWF0ZWQgPGVtPmFmdGVyPC9lbT4gaXQgaXMKKyAqIGNhbGxlZC4gIFBhc3MgI05VTEwgaW5zdGVhZCBvZiBhbiBhcnJheSB0byB1c2UgYWxsIGF2YWlsYWJsZQorICogbWVjaGFuaXNtcyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBtZWNoYW5pc21zLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHBhcmFtIG1lY2hhbmlzbXMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBtZWNoYW5pc21zCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm1lY2hhbmlzbXMpCit7CisgIGNoYXIgKipjb3B5OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgCisgIGlmIChtZWNoYW5pc21zICE9IE5VTEwpCisgICAgeworICAgICAgY29weSA9IF9kYnVzX2R1cF9zdHJpbmdfYXJyYXkgKG1lY2hhbmlzbXMpOworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgY29weSA9IE5VTEw7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpOworICBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcyA9IGNvcHk7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgREJ1c0RhdGFTbG90QWxsb2NhdG9yIHNsb3RfYWxsb2NhdG9yID0KKyAgX0RCVVNfREFUQV9TTE9UX0FMTE9DQVRPUl9JTklUIChfREJVU19MT0NLX05BTUUgKHNlcnZlcl9zbG90cykpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNTZXJ2ZXIuIFRoZSBhbGxvY2F0ZWQgSUQgbWF5IHRoZW4gYmUgdXNlZAorICogd2l0aCBkYnVzX3NlcnZlcl9zZXRfZGF0YSgpIGFuZCBkYnVzX3NlcnZlcl9nZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIC0xLiBJZiBhIG5vbm5lZ2F0aXZlCisgKiBzbG90IGlzIHBhc3NlZCBpbiwgdGhlIHJlZmNvdW50IGlzIGluY3JlbWVudGVkIG9uIHRoYXQKKyAqIHNsb3QsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IHNsb3QuCisgKiAgCisgKiBUaGUgYWxsb2NhdGVkIHNsb3QgaXMgZ2xvYmFsLCBpLmUuIGFsbCBEQnVzU2VydmVyIG9iamVjdHMgd2lsbCBoYXZlCisgKiBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNsb3QgSUQKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciBzZXJ2ZXIgZGF0YSBzbG90cy4KKyAqIGRidXNfc2VydmVyX2dldF9kYXRhKCkgYW5kIGRidXNfc2VydmVyX3NldF9kYXRhKCkKKyAqIG1heSBubyBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4KKyAqIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nIERCdXNTZXJ2ZXIgb2JqZWN0cworICogd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZmluYWxpemVkLAorICogYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUgcmVwbGFjZWQKKyAqIGlmIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIHRoZSBzbG90IHRvIGRlYWxsb2NhdGUKKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKyAgCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSBEQnVzU2VydmVyLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIHNlcnZlciBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF9kYXRhIChEQnVzU2VydmVyICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKQoreworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmM7CisgIHZvaWQgKm9sZF9kYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworCisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgLyogRG8gdGhlIGFjdHVhbCBmcmVlIG91dHNpZGUgdGhlIHNlcnZlciBsb2NrICovCisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfc2VydmVyX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK2RidXNfc2VydmVyX2dldF9kYXRhIChEQnVzU2VydmVyICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNsb3QpCit7CisgIHZvaWQgKnJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKyAgCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOworCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfdGVzdCAodm9pZCkKK3sKKyAgY29uc3QgY2hhciAqdmFsaWRfYWRkcmVzc2VzW10gPSB7CisgICAgInRjcDpwb3J0PTEyMzQiLAorICAgICJ0Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0xMjM0IiwKKyAgICAidGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNDt0Y3A6cG9ydD01Njc4IiwKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAidW5peDpwYXRoPS4vYm9vZ2llIiwKKyAgICAidGNwOnBvcnQ9MTIzNDt1bml4OnBhdGg9Li9ib29naWUiLAorI2VuZGlmCisgIH07CisKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9hZGRyZXNzZXMpOyBpKyspCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgIGNoYXIgKmlkOworCisgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKHZhbGlkX2FkZHJlc3Nlc1tpXSwgJmVycm9yKTsKKyAgICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJzZXJ2ZXIgbGlzdGVuIGVycm9yOiAlczogJXNcbiIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJGYWlsZWQgdG8gbGlzdGVuIGZvciB2YWxpZCBhZGRyZXNzLiIpOworICAgICAgICB9CisKKyAgICAgIGlkID0gZGJ1c19zZXJ2ZXJfZ2V0X2lkIChzZXJ2ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpZCAhPSBOVUxMKTsKKyAgICAgIGFkZHJlc3MgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoc2VydmVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKworICAgICAgaWYgKHN0cnN0ciAoYWRkcmVzcywgaWQpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgic2VydmVyIGlkICclcycgaXMgbm90IGluIHRoZSBzZXJ2ZXIgYWRkcmVzcyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGlkLCBhZGRyZXNzKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgc2VydmVyIGlkIG9yIGFkZHJlc3MiKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGlkKTsKKyAgICAgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisgICAgICAKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKHNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci5oIGIvZGJ1cy9kYnVzLXNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmVmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuaCBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NFUlZFUl9ICisjZGVmaW5lIERCVVNfU0VSVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKiBAeworICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXIgREJ1c1NlcnZlcjsKKworLyoqIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBhdmFpbGFibGUuIE11c3QgcmVmZXJlbmNlIGFuZCBzYXZlIHRoZSBuZXcKKyAqIGNvbm5lY3Rpb24sIG9yIGNsb3NlIHRoZSBuZXcgY29ubmVjdGlvbi4gU2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uKSAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKK0RCVVNfRVhQT1JUCitEQnVzU2VydmVyKiBkYnVzX3NlcnZlcl9saXN0ZW4gICAgICAgICAgIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c1NlcnZlciogZGJ1c19zZXJ2ZXJfcmVmICAgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2lkICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfc2VydmVyX2dldF9kYXRhICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2hhLmMgYi9kYnVzL2RidXMtc2hhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViZmJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zaGEuYwpAQCAtMCwwICsxLDk2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoYS5jIFNIQS0xIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk1IEEuIE0uIEt1Y2hsaW5nCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIiAvKiBmb3IgYnl0ZXN3YXAgcm91dGluZXMgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhlIGZvbGxvd2luZyBjb21tZW50cyBoYXZlIHRoZSBoaXN0b3J5IG9mIHdoZXJlIHRoaXMgY29kZQorICogY29tZXMgZnJvbS4gSSBhY3R1YWxseSBjb3BpZWQgaXQgZnJvbSBHTmV0IGluIEdOT01FIENWUy4KKyAqIC0gaHBAcmVkaGF0LmNvbQorICovCisKKy8qCisgKiAgc2hhLmggOiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtCisgKgorICogUGFydCBvZiB0aGUgUHl0aG9uIENyeXB0b2dyYXBoeSBUb29sa2l0LCB2ZXJzaW9uIDEuMC4wCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCBBLk0uIEt1Y2hsaW5nCisgKgorICogRGlzdHJpYnV0ZSBhbmQgdXNlIGZyZWVseTsgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBmdXJ0aGVyCisgKiBkaXNzZW1pbmF0aW9uIGFuZCB1c2FnZSBleGNlcHQgdGhvc2UgaW1wb3NlZCBieSB0aGUgbGF3cyBvZiB5b3VyCisgKiBjb3VudHJ5IG9mIHJlc2lkZW5jZS4KKyAqCisgKi8KKworLyogU0hBOiBOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtICovCisKKy8qIEJhc2VkIG9uIFNIQSBjb2RlIG9yaWdpbmFsbHkgcG9zdGVkIHRvIHNjaS5jcnlwdCBieSBQZXRlciBHdXRtYW5uCisgICBpbiBtZXNzYWdlIDwzMGFqbzUkb2U4QGNjdTIuYXVja2xhbmQuYWMubno+LgorICAgTW9kaWZpZWQgdG8gdGVzdCBmb3IgZW5kaWFubmVzcyBvbiBjcmVhdGlvbiBvZiBTSEEgb2JqZWN0cyBieSBBTUsuCisgICBBbHNvLCB0aGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBvZiBTSEEgd2FzIGZvdW5kIHRvIGhhdmUgYSB3ZWFrbmVzcworICAgYnkgTlNBL05JU1QuICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgZml4ZWQgdmVyc2lvbiBvZiBTSEEuCisqLworCisvKiBIZXJlJ3MgdGhlIGZpcnN0IHBhcmFncmFwaCBvZiBQZXRlciBHdXRtYW5uJ3MgcG9zdGluZzoKKworVGhlIGZvbGxvd2luZyBpcyBteSBTSEEgKEZJUFMgMTgwKSBjb2RlIHVwZGF0ZWQgdG8gYWxsb3cgdXNlIG9mIHRoZSAiZml4ZWQiCitTSEEsIHRoYW5rcyB0byBKaW0gR2lsbG9nbHkgYW5kIGFuIGFub255bW91cyBjb250cmlidXRvciBmb3IgdGhlIGluZm9ybWF0aW9uIG9uCit3aGF0J3MgY2hhbmdlZCBpbiB0aGUgbmV3IHZlcnNpb24uICBUaGUgZml4IGlzIGEgc2ltcGxlIGNoYW5nZSB3aGljaCBpbnZvbHZlcworYWRkaW5nIGEgc2luZ2xlIHJvdGF0ZSBpbiB0aGUgaW5pdGlhbCBleHBhbnNpb24gZnVuY3Rpb24uICBJdCBpcyB1bmtub3duCit3aGV0aGVyIHRoaXMgaXMgYW4gb3B0aW1hbCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSB3aGljaCB3YXMgZGlzY292ZXJlZCBpbiB0aGUKK1NIQSBvciB3aGV0aGVyIGl0J3Mgc2ltcGx5IGEgYmFuZGFpZCB3aGljaCBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIGEgbWluaW11bSBvZgorZWZmb3J0IChmb3IgZXhhbXBsZSB0aGUgcmVlbmdpbmVlcmluZyBvZiBhIGdyZWF0IG1hbnkgQ2Fwc3RvbmUgY2hpcHMpLgorKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NIQSBTSEEgaW1wbGVtZW50YXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgU0hBLTEgaGFzaAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb21wdXRpbmcgU0hBLTEgaGFzaC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU0hBSW50ZXJuYWxzIFNIQSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFscyBvZiBTSEEgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIFNIQS0xIChzZWUgaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZmlwc3B1YnMvZmlwMTgwLTEuaHRtKS4KKyAqIFRoaXMgU0hBIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcKKyAqCisgKiBAeworICovCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKy8qIFRoZSBTSEEgYmxvY2sgc2l6ZSBhbmQgbWVzc2FnZSBkaWdlc3Qgc2l6ZXMsIGluIGJ5dGVzICovCisKKyNkZWZpbmUgU0hBX0RBVEFTSVpFICAgIDY0CisjZGVmaW5lIFNIQV9ESUdFU1RTSVpFICAyMAorCisvKiBUaGUgU0hBIGYoKS1mdW5jdGlvbnMuICBUaGUgZjEgYW5kIGYzIGZ1bmN0aW9ucyBjYW4gYmUgb3B0aW1pemVkIHRvCisgICBzYXZlIG9uZSBib29sZWFuIG9wZXJhdGlvbiBlYWNoIC0gdGhhbmtzIHRvIFJpY2ggU2Nocm9lcHBlbCwKKyAgIHJjc0Bjcy5hcml6b25hLmVkdSBmb3IgZGlzY292ZXJpbmcgdGhpcyAqLworCisvKiNkZWZpbmUgZjEoeCx5LHopICggKCB4ICYgeSApIHwgKCB+eCAmIHogKSApICAgICAgICAgIC8vIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMSh4LHkseikgICggeiBeICggeCAmICggeSBeIHogKSApICkgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMih4LHkseikgICggeCBeIHkgXiB6ICkgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAyMC0zOSAqLworLyojZGVmaW5lIGYzKHgseSx6KSAoICggeCAmIHkgKSB8ICggeCAmIHogKSB8ICggeSAmIHogKSApICAgLy8gUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGYzKHgseSx6KSAgKCAoIHggJiB5ICkgfCAoIHogJiAoIHggfCB5ICkgKSApICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGY0KHgseSx6KSAgKCB4IF4geSBeIHogKSAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCisKKy8qIFRoZSBTSEEgTXlzdGVyaW91cyBDb25zdGFudHMgKi8KKworI2RlZmluZSBLMSAgMHg1QTgyNzk5OUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgIDAtMTkgKi8KKyNkZWZpbmUgSzIgIDB4NkVEOUVCQTFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisjZGVmaW5lIEszICAweDhGMUJCQ0RDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBLNCAgMHhDQTYyQzFENkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNjAtNzkgKi8KKworLyogU0hBIGluaXRpYWwgdmFsdWVzICovCisKKyNkZWZpbmUgaDBpbml0ICAweDY3NDUyMzAxTAorI2RlZmluZSBoMWluaXQgIDB4RUZDREFCODlMCisjZGVmaW5lIGgyaW5pdCAgMHg5OEJBRENGRUwKKyNkZWZpbmUgaDNpbml0ICAweDEwMzI1NDc2TAorI2RlZmluZSBoNGluaXQgIDB4QzNEMkUxRjBMCisKKy8qIE5vdGUgdGhhdCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGFkZCBwYXJlbnRoZXNlcyB0byB0aGVzZSBtYWNyb3MgaWYgdGhleQorICAgYXJlIHRvIGJlIGNhbGxlZCB3aXRoIGV4cHJlc3Npb25zIGFzIGFyZ3VtZW50cyAqLworLyogMzItYml0IHJvdGF0ZSBsZWZ0IC0ga2x1ZGdlZCB3aXRoIHNoaWZ0cyAqLworCisjZGVmaW5lIFJPVEwobixYKSAoICggKCBYICkgPDwgbiApIHwgKCAoIFggKSA+PiAoIDMyIC0gbiApICkgKQorCisvKiBUaGUgaW5pdGlhbCBleHBhbmRpbmcgZnVuY3Rpb24uICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBkZWZpbmVkIG92ZXIgYW4KKyAgIDgwLXdvcmQgZXhwYW5kZWQgaW5wdXQgYXJyYXkgVywgd2hlcmUgdGhlIGZpcnN0IDE2IGFyZSBjb3BpZXMgb2YgdGhlIGlucHV0CisgICBkYXRhLCBhbmQgdGhlIHJlbWFpbmluZyA2NCBhcmUgZGVmaW5lZCBieQorCisgICAgICAgIFdbIGkgXSA9IFdbIGkgLSAxNiBdIF4gV1sgaSAtIDE0IF0gXiBXWyBpIC0gOCBdIF4gV1sgaSAtIDMgXQorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyB0aGVzZSB2YWx1ZXMgb24gdGhlIGZseSBpbiBhIGNpcmN1bGFyCisgICBidWZmZXIgLSB0aGFua3MgdG8gQ29saW4gUGx1bWIsIGNvbGluQG55eDEwLmNzLmR1LmVkdSBmb3IgdGhpcworICAgb3B0aW1pemF0aW9uLgorCisgICBUaGUgdXBkYXRlZCBTSEEgY2hhbmdlcyB0aGUgZXhwYW5kaW5nIGZ1bmN0aW9uIGJ5IGFkZGluZyBhIHJvdGF0ZSBvZiAxCisgICBiaXQuICBUaGFua3MgdG8gSmltIEdpbGxvZ2x5LCBqaW1AcmFuZC5vcmcsIGFuZCBhbiBhbm9ueW1vdXMgY29udHJpYnV0b3IKKyAgIGZvciB0aGlzIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgZXhwYW5kKFcsaSkgKCBXWyBpICYgMTUgXSA9IFJPVEwoIDEsICggV1sgaSAmIDE1IF0gXiBXWyAoaSAtIDE0KSAmIDE1IF0gXiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1sgKGkgLSA4KSAmIDE1IF0gXiBXWyAoaSAtIDMpICYgMTUgXSApICkgKQorCisKKy8qIFRoZSBwcm90b3R5cGUgU0hBIHN1Yi1yb3VuZC4gIFRoZSBmdW5kYW1lbnRhbCBzdWItcm91bmQgaXM6CisKKyAgICAgICAgYScgPSBlICsgUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGE7CisgICAgICAgIGInID0gYTsKKyAgICAgICAgYycgPSBST1RMKCAzMCwgYiApOworICAgICAgICBkJyA9IGM7CisgICAgICAgIGUnID0gZDsKKworICAgYnV0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdW5yb2xsaW5nIHRoZSBsb29wIDUgdGltZXMgYW5kIHJlbmFtaW5nIHRoZQorICAgdmFyaWFibGVzICggZSwgYSwgYiwgYywgZCApID0gKCBhJywgYicsIGMnLCBkJywgZScgKSBlYWNoIGl0ZXJhdGlvbi4KKyAgIFRoaXMgY29kZSBpcyB0aGVuIHJlcGxpY2F0ZWQgMjAgdGltZXMgZm9yIGVhY2ggb2YgdGhlIDQgZnVuY3Rpb25zLCB1c2luZworICAgdGhlIG5leHQgMjAgdmFsdWVzIGZyb20gdGhlIFdbXSBhcnJheSBlYWNoIHRpbWUgKi8KKworI2RlZmluZSBzdWJSb3VuZChhLCBiLCBjLCBkLCBlLCBmLCBrLCBkYXRhKSBcCisgICAoIGUgKz0gUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGEsIGIgPSBST1RMKCAzMCwgYiApICkKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworLyogUGVyZm9ybSB0aGUgU0hBIHRyYW5zZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgY29kZSwgbGlrZSBNRDUsIHNlZW1zIHRvCisgICBicmVhayBzb21lIG9wdGltaXppbmcgY29tcGlsZXJzIGR1ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUgZXhwcmVzc2lvbnMKKyAgIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYmFzaWMgYmxvY2suICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHNwbGl0IGl0IGludG8KKyAgIHNlY3Rpb25zLCBlLmcuIGJhc2VkIG9uIHRoZSBmb3VyIHN1YnJvdW5kcworCisgICBOb3RlIHRoYXQgdGhpcyBjb3JydXB0cyB0aGUgY29udGV4dC0+ZGF0YSBhcmVhICovCisKK3N0YXRpYyB2b2lkCitTSEFUcmFuc2Zvcm0oZGJ1c191aW50MzJfdCAqZGlnZXN0LCBkYnVzX3VpbnQzMl90ICpkYXRhKQoreworICBkYnVzX3VpbnQzMl90IEEsIEIsIEMsIEQsIEU7ICAgICAvKiBMb2NhbCB2YXJzICovCisgIGRidXNfdWludDMyX3QgZURhdGFbMTZdOyAgICAgICAvKiBFeHBhbmRlZCBkYXRhICovCisKKyAgLyogU2V0IHVwIGZpcnN0IGJ1ZmZlciBhbmQgbG9jYWwgZGF0YSBidWZmZXIgKi8KKyAgQSA9IGRpZ2VzdFswXTsKKyAgQiA9IGRpZ2VzdFsxXTsKKyAgQyA9IGRpZ2VzdFsyXTsKKyAgRCA9IGRpZ2VzdFszXTsKKyAgRSA9IGRpZ2VzdFs0XTsKKyAgbWVtbW92ZSAoZURhdGEsIGRhdGEsIFNIQV9EQVRBU0laRSk7CisKKyAgLyogSGVhdnkgbWFuZ2xpbmcsIGluIDQgc3ViLXJvdW5kcyBvZiAyMCBpbnRlcmF0aW9ucyBlYWNoLiAqLworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjEsIEsxLCBlRGF0YVswXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzFdKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZURhdGFbMl0pOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBlRGF0YVszXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzRdKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYxLCBLMSwgZURhdGFbNV0pOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjEsIEsxLCBlRGF0YVs2XSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzddKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYxLCBLMSwgZURhdGFbOF0pOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjEsIEsxLCBlRGF0YVs5XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzEwXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzExXSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzEyXSk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMSwgSzEsIGVEYXRhWzEzXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzE0XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzE1XSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZXhwYW5kICggZURhdGEsIDE3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBleHBhbmQgKCBlRGF0YSwgMTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyMSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDIyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDMxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDUxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1OSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDYyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDcxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3OSkgKTsKKworICAvKiBCdWlsZCBtZXNzYWdlIGRpZ2VzdCAqLworICBkaWdlc3RbMF0gKz0gQTsKKyAgZGlnZXN0WzFdICs9IEI7CisgIGRpZ2VzdFsyXSArPSBDOworICBkaWdlc3RbM10gKz0gRDsKKyAgZGlnZXN0WzRdICs9IEU7Cit9CisKKy8qIFdoZW4gcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBDUFUgd2UgbmVlZCB0byBwZXJmb3JtIGJ5dGUgcmV2ZXJzYWwgb24gYW4KKyAgIGFycmF5IG9mIGxvbmd3b3Jkcy4gKi8KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBzd2FwX3dvcmRzKGJ1ZmZlciwgYnl0ZV9jb3VudCkKKyNlbHNlCitzdGF0aWMgdm9pZAorc3dhcF93b3JkcyAoZGJ1c191aW50MzJfdCAqYnVmZmVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgYnl0ZV9jb3VudCkKK3sKKyAgYnl0ZV9jb3VudCAvPSBzaXplb2YgKGRidXNfdWludDMyX3QpOworICB3aGlsZSAoYnl0ZV9jb3VudC0tKQorICAgIHsKKyAgICAgICpidWZmZXIgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqYnVmZmVyKTsKKyAgICAgICsrYnVmZmVyOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc2hhX2luaXQgKERCdXNTSEFDb250ZXh0ICpjb250ZXh0KQoreworICAvKiBTZXQgdGhlIGgtdmFycyB0byB0aGVpciBpbml0aWFsIHZhbHVlcyAqLworICBjb250ZXh0LT5kaWdlc3RbMF0gPSBoMGluaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFsxXSA9IGgxaW5pdDsKKyAgY29udGV4dC0+ZGlnZXN0WzJdID0gaDJpbml0OworICBjb250ZXh0LT5kaWdlc3RbM10gPSBoM2luaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFs0XSA9IGg0aW5pdDsKKworICAvKiBJbml0aWFsaXNlIGJpdCBjb3VudCAqLworICBjb250ZXh0LT5jb3VudF9sbyA9IGNvbnRleHQtPmNvdW50X2hpID0gMDsKK30KKworc3RhdGljIHZvaWQKK3NoYV9hcHBlbmQgKERCdXNTSEFDb250ZXh0ICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICBjb3VudCkKK3sKKyAgZGJ1c191aW50MzJfdCB0bXA7CisgIHVuc2lnbmVkIGludCBkYXRhQ291bnQ7CisKKyAgLyogVXBkYXRlIGJpdGNvdW50ICovCisgIHRtcCA9IGNvbnRleHQtPmNvdW50X2xvOworICBpZiAoKCBjb250ZXh0LT5jb3VudF9sbyA9IHRtcCArICggKCBkYnVzX3VpbnQzMl90KSBjb3VudCA8PCAzKSApIDwgdG1wKQorICAgIGNvbnRleHQtPmNvdW50X2hpKys7ICAgICAgICAgICAgIC8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKyAgY29udGV4dC0+Y291bnRfaGkgKz0gY291bnQgPj4gMjk7CisKKyAgLyogR2V0IGNvdW50IG9mIGJ5dGVzIGFscmVhZHkgaW4gZGF0YSAqLworICBkYXRhQ291bnQgPSAoaW50KSAodG1wID4+IDMpICYgMHgzRjsKKworICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworICBpZiAoZGF0YUNvdW50KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBjb250ZXh0LT5kYXRhICsgZGF0YUNvdW50OworCisgICAgICBkYXRhQ291bnQgPSBTSEFfREFUQVNJWkUgLSBkYXRhQ291bnQ7CisgICAgICBpZiAoY291bnQgPCBkYXRhQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBtZW1tb3ZlIChwLCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIG1lbW1vdmUgKHAsIGJ1ZmZlciwgZGF0YUNvdW50KTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gZGF0YUNvdW50OworICAgICAgY291bnQgLT0gZGF0YUNvdW50OworICAgIH0KKworICAvKiBQcm9jZXNzIGRhdGEgaW4gU0hBX0RBVEFTSVpFIGNodW5rcyAqLworICB3aGlsZSAoY291bnQgPj0gU0hBX0RBVEFTSVpFKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKGNvbnRleHQtPmRhdGEsIGJ1ZmZlciwgU0hBX0RBVEFTSVpFKTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gU0hBX0RBVEFTSVpFOworICAgICAgY291bnQgLT0gU0hBX0RBVEFTSVpFOworICAgIH0KKworICAvKiBIYW5kbGUgYW55IHJlbWFpbmluZyBieXRlcyBvZiBkYXRhLiAqLworICBtZW1tb3ZlIChjb250ZXh0LT5kYXRhLCBidWZmZXIsIGNvdW50KTsKK30KKworCisvKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gU0hBX0RBVEFTSVpFLWJ5dGUgYm91bmRhcnkgd2l0aCB0aGUgYml0IHBhdHRlcm4KKyAgIDEgMCogKDY0LWJpdCBjb3VudCBvZiBiaXRzIHByb2Nlc3NlZCwgTVNCLWZpcnN0KSAqLworCitzdGF0aWMgdm9pZAorc2hhX2ZpbmlzaCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXSkKK3sKKyAgaW50IGNvdW50OworICB1bnNpZ25lZCBjaGFyICpkYXRhX3A7CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgbW9kIDY0ICovCisgIGNvdW50ID0gKGludCkgY29udGV4dC0+Y291bnRfbG87CisgIGNvdW50ID0gKGNvdW50ID4+IDMpICYgMHgzRjsKKworICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisgICAgIGFsd2F5cyBhdCBsZWFzdCBvbmUgYnl0ZSBmcmVlICovCisgIGRhdGFfcCA9ICh1bnNpZ25lZCBjaGFyICopIGNvbnRleHQtPmRhdGEgKyBjb3VudDsKKyAgKmRhdGFfcCsrID0gMHg4MDsKKworICAvKiBCeXRlcyBvZiBwYWRkaW5nIG5lZWRlZCB0byBtYWtlIDY0IGJ5dGVzICovCisgIGNvdW50ID0gU0hBX0RBVEFTSVpFIC0gMSAtIGNvdW50OworCisgIC8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCisgIGlmIChjb3VudCA8IDgpCisgICAgeworICAgICAgLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKyAgICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCk7CisgICAgICBzd2FwX3dvcmRzIChjb250ZXh0LT5kYXRhLCBTSEFfREFUQVNJWkUpOworICAgICAgU0hBVHJhbnNmb3JtIChjb250ZXh0LT5kaWdlc3QsIGNvbnRleHQtPmRhdGEpOworCisgICAgICAvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisgICAgICBtZW1zZXQgKGNvbnRleHQtPmRhdGEsIDAsIFNIQV9EQVRBU0laRSAtIDgpOworICAgIH0KKyAgZWxzZQorICAgIC8qIFBhZCBibG9jayB0byA1NiBieXRlcyAqLworICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCAtIDgpOworCisgIC8qIEFwcGVuZCBsZW5ndGggaW4gYml0cyBhbmQgdHJhbnNmb3JtICovCisgIGNvbnRleHQtPmRhdGFbMTRdID0gY29udGV4dC0+Y291bnRfaGk7CisgIGNvbnRleHQtPmRhdGFbMTVdID0gY29udGV4dC0+Y291bnRfbG87CisKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGF0YSwgU0hBX0RBVEFTSVpFIC0gOCk7CisgIFNIQVRyYW5zZm9ybSAoY29udGV4dC0+ZGlnZXN0LCBjb250ZXh0LT5kYXRhKTsKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7CisgIG1lbW1vdmUgKGRpZ2VzdCwgY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1NIQQorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgU0hBIGNvbnRleHQuCisgKgorICogQHBhcmFtIGNvbnRleHQgYW4gdW5pbml0aWFsaXplZCBjb250ZXh0LCB0eXBpY2FsbHkgb24gdGhlIHN0YWNrLgorICovCit2b2lkCitfZGJ1c19zaGFfaW5pdCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQpCit7CisgIHNoYV9pbml0IChjb250ZXh0KTsKK30KKworLyoqCisgKiBGZWVkcyBtb3JlIGRhdGEgaW50byBhbiBleGlzdGluZyBzaGFzdW0gY29tcHV0YXRpb24uCisgKgorICogQHBhcmFtIGNvbnRleHQgdGhlIFNIQSBjb250ZXh0CisgKiBAcGFyYW0gZGF0YSB0aGUgYWRkaXRpb25hbCBkYXRhIHRvIGhhc2gKKyAqLwordm9pZAorX2RidXNfc2hhX3VwZGF0ZSAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIHVuc2lnbmVkIGludCBpbnB1dExlbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQ7CisKKyAgaW5wdXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSk7CisgIGlucHV0TGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworCisgIHNoYV9hcHBlbmQgKGNvbnRleHQsIGlucHV0LCBpbnB1dExlbik7Cit9CisKKy8qKgorICogU0hBIGZpbmFsaXphdGlvbi4gRW5kcyBhbiBTSEEgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0aW5nIHRoZQorICogdGhlIG1lc3NhZ2UgZGlnZXN0IGFuZCB6ZXJvaW5nIHRoZSBjb250ZXh0LiAgVGhlIHJlc3VsdHMgYXJlCisgKiByZXR1cm5lZCBhcyBhIHJhdyAyMC1ieXRlIGRpZ2VzdCwgbm90IGFzIHRoZSBhc2NpaS1oZXgtZGlnaXRzCisgKiBzdHJpbmcgZm9ybSBvZiB0aGUgZGlnZXN0LgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBTSEEgY29udGV4dAorICogQHBhcmFtIHJlc3VsdHMgc3RyaW5nIHRvIGFwcGVuZCB0aGUgMjAtYnl0ZSBTSEEgZGlnZXN0IHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgdG8gYXBwZW5kIHRoZSBkaWdlc3QKKyAqCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfZmluYWwgKERCdXNTSEFDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3VsdHMpCit7CisgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXTsKKworICBzaGFfZmluaXNoIChjb250ZXh0LCBkaWdlc3QpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKHJlc3VsdHMsIGRpZ2VzdCwgMjApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzb21lIGtpbmQgb2Ygc2VjdXJpdHkgcGFyYW5vaWEsIHRob3VnaCBpdCBzZWVtcyBwb2ludGxlc3MKKyAgICogdG8gbWUgZ2l2ZW4gdGhlIG5vbnplcm9lZCBzdHVmZiBmbHlpbmcgYXJvdW5kCisgICAqLworICBfREJVU19aRVJPKCpjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb21wdXRlcyB0aGUgQVNDSUkgaGV4LWVuY29kZWQgc2hhc3VtIG9mIHRoZSBnaXZlbiBkYXRhIGFuZAorICogYXBwZW5kcyBpdCB0byB0aGUgb3V0cHV0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhIHRvIGJlIGhhc2hlZAorICogQHBhcmFtIGFzY2lpX291dHB1dCBzdHJpbmcgdG8gYXBwZW5kIEFTQ0lJIHNoYXN1bSB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfY29tcHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICphc2NpaV9vdXRwdXQpCit7CisgIERCdXNTSEFDb250ZXh0IGNvbnRleHQ7CisgIERCdXNTdHJpbmcgZGlnZXN0OworCisgIF9kYnVzX3NoYV9pbml0ICgmY29udGV4dCk7CisKKyAgX2RidXNfc2hhX3VwZGF0ZSAoJmNvbnRleHQsIGRhdGEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWdlc3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3NoYV9maW5hbCAoJmNvbnRleHQsICZkaWdlc3QpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmRpZ2VzdCwgMCwgYXNjaWlfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXNjaWlfb3V0cHV0KSkpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zaGFfYmluYXJ5IChjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGlucHV0X2xlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKmV4cGVjdGVkKQoreworICBEQnVzU3RyaW5nIGlucHV0X3N0cjsKKyAgREJ1c1N0cmluZyBleHBlY3RlZF9zdHI7CisgIERCdXNTdHJpbmcgcmVzdWx0czsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZpbnB1dF9zdHIsIGlucHV0LCBpbnB1dF9sZW4pOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmV4cGVjdGVkX3N0ciwgZXhwZWN0ZWQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdHMiKTsKKworICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmaW5wdXRfc3RyLCAmcmVzdWx0cykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IGZvciBTSEEtMSByZXN1bHRzIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZleHBlY3RlZF9zdHIsICZyZXN1bHRzKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgaGFzaCAlcyBnb3QgJXMgZm9yIFNIQS0xIHN1bVxuIiwKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmVzdWx0cykpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2hhX3N0ciAoY29uc3QgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZCkKK3sKKyAgcmV0dXJuIGNoZWNrX3NoYV9iaW5hcnkgKGlucHV0LCBzdHJsZW4gKGlucHV0KSwgZXhwZWN0ZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RlY29kZV9jb21wYWN0X3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVjb2RlZCkKK3sKKyAgaW50IG5fYml0czsKKyAgZGJ1c19ib29sX3QgY3VycmVudF9iOworICBpbnQgb2Zmc2V0OworICBpbnQgbmV4dDsKKyAgbG9uZyB2YWw7CisgIGludCBsZW5ndGhfYnl0ZXM7CisgIAorICBvZmZzZXQgPSAwOworICBuZXh0ID0gMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBwYXJzZSBsZW5ndGggYXQgc3RhcnQgb2YgY29tcGFjdCBzdHJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChsaW5lKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChsaW5lLCBuZXh0LCAmbmV4dCk7CisgIAorICBvZmZzZXQgPSBuZXh0OworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBwYXJzZSBzdGFydCBiaXQgJ2InIGluIGNvbXBhY3Qgc3RyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAobGluZSkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghKHZhbCA9PSAwIHx8IHZhbCA9PSAxKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJ0aGUgdmFsdWUgJ2InIG11c3QgYmUgMCBvciAxLCBzZWUgc2hhLTEvUmVhZG1lLnR4dFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChsaW5lLCBuZXh0LCAmbmV4dCk7CisgIAorICBjdXJyZW50X2IgPSB2YWw7CisgIG5fYml0cyA9IDA7CisgIAorICB3aGlsZSAobmV4dCA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChsaW5lKSkKKyAgICB7CisgICAgICBpbnQgdG90YWxfYml0czsKKyAgICAgIAorICAgICAgb2Zmc2V0ID0gbmV4dDsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobGluZSwgb2Zmc2V0KSA9PSAnXicpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIGJpdCBjb3VudCBpbiBjb21wYWN0IHN0cmluZ1xuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIFdlIG5vdyBhcHBlbmQgInZhbCIgY29waWVzIG9mICJjdXJyZW50X2IiIGJpdHMgdG8gdGhlIHN0cmluZyAqLworICAgICAgdG90YWxfYml0cyA9IG5fYml0cyArIHZhbDsKKyAgICAgIHdoaWxlIChuX2JpdHMgPCB0b3RhbF9iaXRzKQorICAgICAgICB7CisgICAgICAgICAgaW50IGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCA9IG5fYml0cyAvIDg7CisgICAgICAgICAgaW50IGJpdF9jb250YWluaW5nX25leHRfYml0ID0gNyAtIChuX2JpdHMgJSA4KTsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZF9ieXRlOworICAgICAgICAgIAorICAgICAgICAgIGlmIChieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQgPj0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRlY29kZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkZWNvZGVkLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQgKyAxKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgdG8gZXh0ZW5kIHRvIG5leHQgYnl0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgb2xkX2J5dGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRlY29kZWQsIGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCk7CisgICAgICAgICAgb2xkX2J5dGUgfD0gY3VycmVudF9iIDw8IGJpdF9jb250YWluaW5nX25leHRfYml0OworCisjaWYgMAorICAgICAgICAgIHByaW50ZiAoIkFwcGVuZGluZyBiaXQgJWQgdG8gYnl0ZSAlZCBhdCBiaXQgJWQgcmVzdWx0aW5nIGluIGJ5dGUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYiwgYnl0ZV9jb250YWluaW5nX25leHRfYml0LAorICAgICAgICAgICAgICAgICAgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQsIG9sZF9ieXRlKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGVjb2RlZCwgYnl0ZV9jb250YWluaW5nX25leHRfYml0LCBvbGRfYnl0ZSk7CisgICAgICAgICAgCisgICAgICAgICAgKytuX2JpdHM7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgICAgICAgICAKKyAgICAgIGN1cnJlbnRfYiA9ICFjdXJyZW50X2I7CisgICAgfQorCisgIGxlbmd0aF9ieXRlcyA9IChuX2JpdHMgLyA4ICsgKChuX2JpdHMgJSA4KSA/IDEgOiAwKSk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRlY29kZWQpICE9IGxlbmd0aF9ieXRlcykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFeHBlY3RlZCBsZW5ndGggJWQgYnl0ZXMgJWQgYml0cyBmb3IgY29tcGFjdCBzdHJpbmcsIGdvdCAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgIGxlbmd0aF9ieXRlcywgbl9iaXRzLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9uZXh0X2V4cGVjdGVkX3Jlc3VsdCAoREJ1c1N0cmluZyAqcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzdWx0KQoreworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgCisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKHJlc3VsdHMsICZsaW5lKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzICgmbGluZSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiIyIpKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIkg+IikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBkb24ndCBwcmludCAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiRD4iKSB8fAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIjxEIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmbGluZSwgMCwgcmVzdWx0LCAwKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgd2hpbGUgKGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzdWx0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3dpdGNoIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHJlc3VsdCwgaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdhJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnYicpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2MnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdkJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnZScpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2YnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ14nOgorICAgICAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAocmVzdWx0LCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgIC0taTsgLyogdG8gb2Zmc2V0ICsraSBiZWxvdyAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorICAvKiBvdXQ6ICovCisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X2RhdGEgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdHNfZmlsZTsKKyAgREJ1c1N0cmluZyByZXN1bHRzX2ZpbGU7CisgIERCdXNTdHJpbmcgdGVzdHM7CisgIERCdXNTdHJpbmcgcmVzdWx0czsKKyAgREJ1c1N0cmluZyBsaW5lOworICBEQnVzU3RyaW5nIHRtcDsKKyAgaW50IGxpbmVfbm87CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IHN1Y2Nlc3NfY291bnQ7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0c19maWxlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0c19maWxlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0ZXN0c19maWxlLCB0ZXN0X2RhdGFfZGlyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZyZXN1bHRzX2ZpbGUsIHRlc3RfZGF0YV9kaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCAic2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RzX2ZpbGUsICZ0bXApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCAic2hhLTEvYnl0ZS1oYXNoZXMuc2hhMSIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZyZXN1bHRzX2ZpbGUsICZ0bXApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZ0ZXN0cywgJnRlc3RzX2ZpbGUsICZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IGxvYWQgdGVzdCBkYXRhIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdHNfZmlsZSksCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmcmVzdWx0cywgJnJlc3VsdHNfZmlsZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgbG9hZCByZXN1bHRzIGRhdGEgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHRzX2ZpbGUpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzdWNjZXNzX2NvdW50ID0gMDsKKyAgbGluZV9ubyA9IDA7CisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZ0ZXN0cywgJmxpbmUpKQorICAgIHsKKyAgICAgIGxpbmVfbm8gKz0gMTsKKworICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoJmxpbmUpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSA9PSAwKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIiMiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJIPiIpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiU0hBLTE6ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZsaW5lLCAwLCAiVHlwZSAzIiwgTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFNlZSBzaGEtMS9SZWFkbWUudHh0IC0gdGhlICJUeXBlIDMiIHRlc3RzIGFyZQorICAgICAgICAgICAgICAgKiByYW5kb20gc2VlZHMsIHJhdGhlciB0aGFuIGRhdGEgdG8gYmUgaGFzaGVkLgorICAgICAgICAgICAgICAgKiB3ZSdkIGhhdmUgdG8gZG8gYSBsaXR0bGUgYml0IG1vcmUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICogdG8gdXNlIHRob3NlIHRlc3RzLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHByaW50ZiAoIiAoZW5kaW5nIHRlc3RzIGR1ZSB0byBUeXBlIDMgdGVzdHMgc2VlbiAtIHRoaXMgaXMgbm9ybWFsKVxuIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiRD4iKSB8fAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIjxEIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHRlc3Q7CisgICAgICAgICAgREJ1c1N0cmluZyByZXN1bHQ7CisgICAgICAgICAgREJ1c1N0cmluZyBuZXh0X2xpbmU7CisgICAgICAgICAgREJ1c1N0cmluZyBleHBlY3RlZDsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBzdWNjZXNzOworCisgICAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZuZXh0X2xpbmUpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXhwZWN0ZWQpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3QpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0KSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICAgICAgLyogdGhlICJjb21wYWN0IHN0cmluZ3MiIGFyZSAiXiItdGVybWluYXRlZCBub3QKKyAgICAgICAgICAgKiBuZXdsaW5lLXRlcm1pbmF0ZWQgc28gcmVhZGFoZWFkIHRvIGZpbmQgdGhlCisgICAgICAgICAgICogIl4iCisgICAgICAgICAgICovCisgICAgICAgICAgd2hpbGUgKCFfZGJ1c19zdHJpbmdfZmluZCAoJmxpbmUsIDAsICJeIiwgTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3BvcF9saW5lICgmdGVzdHMsICZuZXh0X2xpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxpbmUsICcgJykgfHwKKyAgICAgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfbW92ZSAoJm5leHRfbGluZSwgMCwgJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghZGVjb2RlX2NvbXBhY3Rfc3RyaW5nICgmbGluZSwgJnRlc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZGVjb2RlIGxpbmUgJWQgYXMgYSBjb21wYWN0IHN0cmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmdGVzdCwgJnJlc3VsdCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdCIpOworCisgICAgICAgICAgaWYgKCFnZXRfbmV4dF9leHBlY3RlZF9yZXN1bHQgKCZyZXN1bHRzLCAmZXhwZWN0ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBhbiBleHBlY3RlZCByZXN1bHRcbiIpOworICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZyZXN1bHQsICZleHBlY3RlZCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGZvciBsaW5lICVkIGdvdCBoYXNoICVzIGV4cGVjdGVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZCkpOworICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdWNjZXNzX2NvdW50ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgICAgICBmYWlsdXJlOgorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHQpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbmV4dF9saW5lKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKworICAgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyAgcHJpbnRmICgiUGFzc2VkIHRoZSAlZCBTSEEtMSB0ZXN0cyBpbiB0aGUgdGVzdCBmaWxlXG4iLAorICAgICAgICAgIHN1Y2Nlc3NfY291bnQpOworICAKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdHNfZmlsZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0c19maWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzU0hBSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIFNIQSBjb21wdXRhdGlvbi4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2hhX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIHVuc2lnbmVkIGNoYXIgYWxsX2J5dGVzWzI1Nl07CisgIGludCBpOworCisgIGlmICh0ZXN0X2RhdGFfZGlyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFwcm9jZXNzX3Rlc3RfZGF0YSAodGVzdF9kYXRhX2RpcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYgKCJObyB0ZXN0IGRhdGEgZGlyXG4iKTsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDI1NikKKyAgICB7CisgICAgICBhbGxfYnl0ZXNbaV0gPSBpOworICAgICAgKytpOworICAgIH0KKworICBpZiAoIWNoZWNrX3NoYV9iaW5hcnkgKGFsbF9ieXRlcywgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICI0OTE2ZDZiZGI3Zjc4ZTY4MDM2OThjYWIzMmQxNTg2ZWE0NTdkZmM4IikpCisgICAgcmV0dXJuIEZBTFNFOworCisjZGVmaW5lIENIRUNLKGlucHV0LGV4cGVjdGVkKSBpZiAoIWNoZWNrX3NoYV9zdHIgKGlucHV0LCBleHBlY3RlZCkpIHJldHVybiBGQUxTRQorCisgIENIRUNLICgiIiwgImRhMzlhM2VlNWU2YjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDkiKTsKKyAgQ0hFQ0sgKCJhIiwgIjg2ZjdlNDM3ZmFhNWE3ZmNlMTVkMWRkY2I5ZWFlYWVhMzc3NjY3YjgiKTsKKyAgQ0hFQ0sgKCJhYmMiLCAiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpOworICBDSEVDSyAoIm1lc3NhZ2UgZGlnZXN0IiwgImMxMjI1MmNlZGE4YmU4OTk0ZDVmYTAyOTBhNDcyMzFjMWQxNmFhZTMiKTsKKyAgQ0hFQ0sgKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsICIzMmQxMGM3YjhjZjk2NTcwY2EwNGNlMzdmMmExOWQ4NDI0MGQzYTg5Iik7CisgIENIRUNLICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorICAgICAgICAgIjc2MWM0NTdiZjczYjE0ZDI3ZTllOTI2NWM0NmY0YjRkZGExMWY5NDAiKTsKKyAgQ0hFQ0sgKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisgICAgICAgICAiNTBhYmY1NzA2YTE1MDk5MGEwOGIyYzVlYTQwZmEwZTU4NTU1NDczMiIpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zaGEuaCBiL2RidXMvZGJ1cy1zaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDgwMzViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNoYS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGEuaCBTSEEtMSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0hBX0gKKyNkZWZpbmUgREJVU19TSEFfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NIQUNvbnRleHQgREJ1c1NIQUNvbnRleHQ7CisKKy8qKgorICogU3RydWN0IHN0b3Jpbmcgc3RhdGUgb2YgdGhlIFNIQSBhbGdvcml0aG0KKyAqLworc3RydWN0IERCdXNTSEFDb250ZXh0Cit7CisgIGRidXNfdWludDMyX3QgIGRpZ2VzdFs1XTsgICAgICAgICAvKio8IE1lc3NhZ2UgZGlnZXN0ICovCisgIGRidXNfdWludDMyX3QgIGNvdW50X2xvOyAgICAgICAgICAvKio8IDY0LWJpdCBiaXQgY291bnQgKi8KKyAgZGJ1c191aW50MzJfdCAgY291bnRfaGk7ICAgICAgICAgIC8qKjwgTm8gY2x1ZSAqLworICBkYnVzX3VpbnQzMl90ICBkYXRhWzE2XTsgICAgICAgICAgLyoqPCBTSEEgZGF0YSBidWZmZXIgKi8KK307CisKK3ZvaWQgICAgICAgIF9kYnVzX3NoYV9pbml0ICAgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0KTsKK3ZvaWQgICAgICAgIF9kYnVzX3NoYV91cGRhdGUgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfc2hhX2ZpbmFsICAgKERCdXNTSEFDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzdWx0cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zaGFfY29tcHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICphc2NpaV9vdXRwdXQpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TSEFfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNoYXJlZC5oIGIvZGJ1cy9kYnVzLXNoYXJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjkxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2hhcmVkLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGFyZWQuaCAgU3R1ZmYgdXNlZCBieSBib3RoIGRidXMvZGJ1cy5oIGxvdy1sZXZlbCBhbmQgQy9DKysgYmluZGluZyBBUElzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NIQVJFRF9ICisjZGVmaW5lIERCVVNfU0hBUkVEX0gKKworLyogRG9uJ3QgaW5jbHVkZSBhbnl0aGluZyBpbiBoZXJlIGZyb20gYW55d2hlcmUgZWxzZS4gSXQncworICogaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkgcmFuZG9tIGxpYnJhcnkuCisgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjaWYgMAorfSAvKiBhdm9pZHMgY29uZnVzaW5nIGVtYWNzIGluZGVudGF0aW9uICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNTaGFyZWQgU2hhcmVkIGNvbnN0YW50cyAKKyAqIEBpbmdyb3VwICBEQnVzCisgKgorICogQGJyaWVmIFNoYXJlZCBoZWFkZXIgaW5jbHVkZWQgYnkgYm90aCBsaWJkYnVzIGFuZCBDL0MrKyBiaW5kaW5ncyBzdWNoIGFzIHRoZSBHTGliIGJpbmRpbmdzLgorICoKKyAqIFVzdWFsbHkgYSBDL0MrKyBiaW5kaW5nIHN1Y2ggYXMgdGhlIEdMaWIgb3IgUXQgYmluZGluZyB3b24ndCB3YW50IHRvIGluY2x1ZGUgZGJ1cy5oIGluIGl0cworICogcHVibGljIGhlYWRlcnMuIEhvd2V2ZXIsIGEgZmV3IGNvbnN0YW50cyBhbmQgbWFjcm9zIG1heSBiZSB1c2VmdWwgdG8gaW5jbHVkZTsgdGhvc2UgYXJlCisgKiBmb3VuZCBoZXJlIGFuZCBpbiBkYnVzLXByb3RvY29sLmgKKyAqCisgKiBAeworICovCisKKworLyoqCisgKiBXZWxsLWtub3duIGJ1cyB0eXBlcy4gU2VlIGRidXNfYnVzX2dldCgpLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19CVVNfU0VTU0lPTiwgICAgLyoqPCBUaGUgbG9naW4gc2Vzc2lvbiBidXMgKi8KKyAgREJVU19CVVNfU1lTVEVNLCAgICAgLyoqPCBUaGUgc3lzdGVtd2lkZSBidXMgKi8KKyAgREJVU19CVVNfU1RBUlRFUiAgICAgLyoqPCBUaGUgYnVzIHRoYXQgc3RhcnRlZCB1cywgaWYgYW55ICovCit9IERCdXNCdXNUeXBlOworCisvKioKKyAqIFJlc3VsdHMgdGhhdCBhIG1lc3NhZ2UgaGFuZGxlciBjYW4gcmV0dXJuLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVELCAgICAgICAgIC8qKjwgTWVzc2FnZSBoYXMgaGFkIGl0cyBlZmZlY3QgLSBubyBuZWVkIHRvIHJ1biBtb3JlIGhhbmRsZXJzLiAqLyAKKyAgREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQsIC8qKjwgTWVzc2FnZSBoYXMgbm90IGhhZCBhbnkgZWZmZWN0IC0gc2VlIGlmIG90aGVyIGhhbmRsZXJzIHdhbnQgaXQuICovCisgIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlkgICAgICAvKio8IE5lZWQgbW9yZSBtZW1vcnkgaW4gb3JkZXIgdG8gcmV0dXJuICNEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQgb3IgI0RCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVELiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyIHdpdGggbW9yZSBtZW1vcnkuICovCit9IERCdXNIYW5kbGVyUmVzdWx0OworCisvKiBCdXMgbmFtZXMgKi8KKworLyoqIFRoZSBidXMgbmFtZSB1c2VkIHRvIHRhbGsgdG8gdGhlIGJ1cyBpdHNlbGYuICovCisjZGVmaW5lIERCVVNfU0VSVklDRV9EQlVTICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzIgorCisvKiBQYXRocyAqLworLyoqIFRoZSBvYmplY3QgcGF0aCB1c2VkIHRvIHRhbGsgdG8gdGhlIGJ1cyBpdHNlbGYuICovCisjZGVmaW5lIERCVVNfUEFUSF9EQlVTICAiL29yZy9mcmVlZGVza3RvcC9EQnVzIgorLyoqIFRoZSBvYmplY3QgcGF0aCB1c2VkIGluIGxvY2FsL2luLXByb2Nlc3MtZ2VuZXJhdGVkIG1lc3NhZ2VzLiAqLworI2RlZmluZSBEQlVTX1BBVEhfTE9DQUwgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbCIKKworLyogSW50ZXJmYWNlcywgdGhlc2UgI2RlZmluZSBkb24ndCBkbyBtdWNoIG90aGVyIHRoYW4KKyAqIGNhdGNoIHR5cG9zIGF0IGNvbXBpbGUgdGltZQorICovCisvKiogVGhlIGludGVyZmFjZSBleHBvcnRlZCBieSB0aGUgb2JqZWN0IHdpdGggI0RCVVNfU0VSVklDRV9EQlVTIGFuZCAjREJVU19QQVRIX0RCVVMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfREJVUyAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzIgorLyoqIFRoZSBtb25pdG9yaW5nIGludGVyZmFjZSBleHBvcnRlZCBieSB0aGUgZGJ1cy1kYWVtb24gKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORyAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLk1vbml0b3JpbmciCisKKy8qKiBUaGUgdmVyYm9zZSBpbnRlcmZhY2UgZXhwb3J0ZWQgYnkgdGhlIGRidXMtZGFlbW9uICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX1ZFUkJPU0UgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5WZXJib3NlIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IGludHJvc3BlY3RhYmxlIG9iamVjdHMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IG1vc3QgZGJ1cyBwZWVycyAqLworI2RlZmluZSBEQlVTX0lOVEVSRkFDRV9QRUVSICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIKKworLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGludGVyZmFjZSB3aG9zZSBtZXRob2RzIGNhbiBvbmx5IGJlIGludm9rZWQKKyAqIGJ5IHRoZSBsb2NhbCBpbXBsZW1lbnRhdGlvbiAobWVzc2FnZXMgZnJvbSByZW1vdGUgYXBwcyBhcmVuJ3QKKyAqIGFsbG93ZWQgdG8gc3BlY2lmeSB0aGlzIGludGVyZmFjZSkuCisgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfTE9DQUwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIgorCisvKiBPd25lciBmbGFncyAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCAweDEgLyoqPCBBbGxvdyBhbm90aGVyIHNlcnZpY2UgdG8gYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGlmIHJlcXVlc3RlZCAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HICAweDIgLyoqPCBSZXF1ZXN0IHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgICAgICAweDQgLyoqPCBJZiB3ZSBjYW4gbm90IGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBkbyBub3QgcGxhY2UgdXMgaW4gdGhlIHF1ZXVlICovCisKKy8qIFJlcGxpZXMgdG8gcmVxdWVzdCBmb3IgYSBuYW1lICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIgIDEgLyoqPCBTZXJ2aWNlIGhhcyBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIHJlcXVlc3RlZCBuYW1lICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFICAgICAgIDIgLyoqPCBTZXJ2aWNlIGNvdWxkIG5vdCBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgYW5kIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgcXVldWUgKi8KKyNkZWZpbmUgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTICAgICAgICAgMyAvKio8IFNlcnZpY2UgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUgKi8KKyNkZWZpbmUgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUiAgNCAvKio8IFNlcnZpY2UgaXMgYWxyZWFkeSB0aGUgcHJpbWFyeSBvd25lciAqLworCisvKiBSZXBsaWVzIHRvIHJlbGVhc2luZyBhIG5hbWUgKi8KKyNkZWZpbmUgREJVU19SRUxFQVNFX05BTUVfUkVQTFlfUkVMRUFTRUQgICAgICAgIDEgLyoqPCBTZXJ2aWNlIHdhcyByZWxlYXNlZCBmcm9tIHRoZSBnaXZlbiBuYW1lICovCisjZGVmaW5lIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVCAgICAyIC8qKjwgVGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGJ1cyAqLworI2RlZmluZSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVIgICAgICAgMyAvKio8IFNlcnZpY2UgaXMgbm90IGFuIG93bmVyIG9mIHRoZSBnaXZlbiBuYW1lICovCisKKy8qIFJlcGxpZXMgdG8gc2VydmljZSBzdGFydHMgKi8KKyNkZWZpbmUgREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTICAgICAgICAgMSAvKio8IFNlcnZpY2Ugd2FzIGF1dG8gc3RhcnRlZCAqLworI2RlZmluZSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORyAyIC8qKjwgU2VydmljZSB3YXMgYWxyZWFkeSBydW5uaW5nICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZiAwCit7IC8qIGF2b2lkcyBjb25mdXNpbmcgZW1hY3MgaW5kZW50YXRpb24gKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX1NIQVJFRF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2hlbGwuYyBiL2RidXMvZGJ1cy1zaGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODQ5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2hlbGwuYwpAQCAtMCwwICsxLDY0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoZWxsLmMgU2hlbGwgY29tbWFuZCBsaW5lIHV0aWxpdHkgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXNoZWxsLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyogU2luZ2xlIHF1b3RlcyBwcmVzZXJ2ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgZXhhY3RseS4gZXNjYXBlCisgKiBzZXF1ZW5jZXMgYXJlIG5vdCBhbGxvd2VkOyBub3QgZXZlbiBcJyAtIGlmIHlvdSB3YW50IGEgJworICogaW4gdGhlIHF1b3RlZCB0ZXh0LCB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSAnZm9vJ1wnJ2JhcicKKyAqCisgKiBEb3VibGUgcXVvdGVzIGFsbG93ICQgYCAiIFwgYW5kIG5ld2xpbmUgdG8gYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaC4KKyAqIE90aGVyd2lzZSBkb3VibGUgcXVvdGVzIHByZXNlcnZlIHRoaW5ncyBsaXRlcmFsbHkuCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90Cit1bnF1b3RlX3N0cmluZ19pbnBsYWNlIChjaGFyKiBzdHIsIGNoYXIqKiBlbmQpCit7CisgIGNoYXIqIGRlc3Q7CisgIGNoYXIqIHM7CisgIGNoYXIgcXVvdGVfY2hhcjsKKyAgCisgIGRlc3QgPSBzID0gc3RyOworCisgIHF1b3RlX2NoYXIgPSAqczsKKyAgCisgIGlmICghKCpzID09ICciJyB8fCAqcyA9PSAnXCcnKSkKKyAgICB7CisgICAgICAqZW5kID0gc3RyOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTa2lwIHRoZSBpbml0aWFsIHF1b3RlIG1hcmsgKi8KKyAgKytzOworCisgIGlmIChxdW90ZV9jaGFyID09ICciJykKKyAgICB7CisgICAgICB3aGlsZSAoKnMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgCisgICAgICAgICAgc3dpdGNoICgqcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAvKiBFbmQgb2YgdGhlIHN0cmluZywgcmV0dXJuIG5vdyAqLworICAgICAgICAgICAgICAqZGVzdCA9ICdcMCc7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgKmVuZCA9IHM7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIC8qIFBvc3NpYmxlIGVzY2FwZWQgcXVvdGUgb3IgXCAqLworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgIHN3aXRjaCAoKnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICBjYXNlICdgJzoKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAqZGVzdCA9ICpzOworICAgICAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyogbm90IGFuIGVzY2FwZWQgY2hhciAqLworICAgICAgICAgICAgICAgICAgKmRlc3QgPSAnXFwnOworICAgICAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICAgICAgLyogKytzIGFscmVhZHkgZG9uZS4gKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICpkZXN0ID0gKnM7CisgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2Fzc2VydChzID4gZGVzdCk7IC8qIGxvb3AgaW52YXJpYW50ICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAoKnMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICAgIAorICAgICAgICAgIGlmICgqcyA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBFbmQgb2YgdGhlIHN0cmluZywgcmV0dXJuIG5vdyAqLworICAgICAgICAgICAgICAqZGVzdCA9ICdcMCc7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgKmVuZCA9IHM7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKmRlc3QgPSAqczsKKyAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICB9CisgICAgfQorICAKKyAgLyogSWYgd2UgcmVhY2ggaGVyZSB0aGlzIG1lYW5zIHRoZSBjbG9zZSBxdW90ZSB3YXMgbmV2ZXIgZW5jb3VudGVyZWQgKi8KKworICAqZGVzdCA9ICdcMCc7CisgIAorICAqZW5kID0gczsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogCisgKiBVbnF1b3RlcyBhIHN0cmluZyBhcyB0aGUgc2hlbGwgKC9iaW4vc2gpIHdvdWxkLiBPbmx5IGhhbmRsZXMKKyAqIHF1b3RlczsgaWYgYSBzdHJpbmcgY29udGFpbnMgZmlsZSBnbG9icywgYXJpdGhtZXRpYyBvcGVyYXRvcnMsCisgKiB2YXJpYWJsZXMsIGJhY2t0aWNrcywgcmVkaXJlY3Rpb25zLCBvciBvdGhlciBzcGVjaWFsLXRvLXRoZS1zaGVsbAorICogZmVhdHVyZXMsIHRoZSByZXN1bHQgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcmVzdWx0IGEgcmVhbCBzaGVsbAorICogd291bGQgcHJvZHVjZSAodGhlIHZhcmlhYmxlcywgYmFja3RpY2tzLCBldGMuIHdpbGwgYmUgcGFzc2VkCisgKiB0aHJvdWdoIGxpdGVyYWxseSBpbnN0ZWFkIG9mIGJlaW5nIGV4cGFuZGVkKS4gVGhpcyBmdW5jdGlvbiBpcworICogZ3VhcmFudGVlZCB0byBzdWNjZWVkIGlmIGFwcGxpZWQgdG8gdGhlIHJlc3VsdCBvZgorICogX2RidXNfc2hlbGxfcXVvdGUoKS4gSWYgaXQgZmFpbHMsIGl0IHJldHVybnMgJU5VTEwuCisgKiBUaGUgQHAgcXVvdGVkX3N0cmluZyBuZWVkIG5vdCBhY3R1YWxseSBjb250YWluIHF1b3RlZCBvcgorICogZXNjYXBlZCB0ZXh0OyBfZGJ1c19zaGVsbF91bnF1b3RlKCkgc2ltcGx5IGdvZXMgdGhyb3VnaCB0aGUgc3RyaW5nIGFuZAorICogdW5xdW90ZXMvdW5lc2NhcGVzIGFueXRoaW5nIHRoYXQgdGhlIHNoZWxsIHdvdWxkLiBCb3RoIHNpbmdsZSBhbmQKKyAqIGRvdWJsZSBxdW90ZXMgYXJlIGhhbmRsZWQsIGFzIGFyZSBlc2NhcGVzIGluY2x1ZGluZyBlc2NhcGVkCisgKiBuZXdsaW5lcy4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkuCisgKiAKKyAqIFNoZWxsIHF1b3RpbmcgcnVsZXMgYXJlIGEgYml0IHN0cmFuZ2UuIFNpbmdsZSBxdW90ZXMgcHJlc2VydmUgdGhlCisgKiBsaXRlcmFsIHN0cmluZyBleGFjdGx5LiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZDsgbm90IGV2ZW4KKyAqIFwnIC0gaWYgeW91IHdhbnQgYSAnIGluIHRoZSBxdW90ZWQgdGV4dCwgeW91IGhhdmUgdG8gZG8gc29tZXRoaW5nCisgKiBsaWtlICdmb28nXCcnYmFyJy4gIERvdWJsZSBxdW90ZXMgYWxsb3cgJCwgYCwgIiwgXCwgYW5kIG5ld2xpbmUgdG8KKyAqIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2guIE90aGVyd2lzZSBkb3VibGUgcXVvdGVzIHByZXNlcnZlIHRoaW5ncworICogbGl0ZXJhbGx5LgorICoKKyAqIEBwYXJhbSBxdW90ZWRfc3RyaW5nIHNoZWxsLXF1b3RlZCBzdHJpbmcKKyAqKi8KK2NoYXIqCitfZGJ1c19zaGVsbF91bnF1b3RlIChjb25zdCBjaGFyICpxdW90ZWRfc3RyaW5nKQoreworICBjaGFyICp1bnF1b3RlZDsKKyAgY2hhciAqZW5kOworICBjaGFyICpzdGFydDsKKyAgY2hhciAqcmV0OworICBEQnVzU3RyaW5nIHJldHZhbDsKKworICB1bnF1b3RlZCA9IF9kYnVzX3N0cmR1cCAocXVvdGVkX3N0cmluZyk7CisgIGlmICh1bnF1b3RlZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0YXJ0ID0gdW5xdW90ZWQ7CisgIGVuZCA9IHVucXVvdGVkOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmV0dmFsKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgbG9vcCBhbGxvd3MgY2FzZXMgc3VjaCBhcworICAgKiAiZm9vImJsYWggYmxhaCdiYXInd29vIGZvbyJiYXoibGEgbGEgbGFcJ1wnJ2ZvbycKKyAgICovCisgIHdoaWxlICgqc3RhcnQpCisgICAgeworICAgICAgLyogQXBwZW5kIGFsbCBub24tcXVvdGVkIGNoYXJzLCBob25vcmluZyBiYWNrc2xhc2ggZXNjYXBlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgd2hpbGUgKCpzdGFydCAmJiAhKCpzdGFydCA9PSAnIicgfHwgKnN0YXJ0ID09ICdcJycpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzdGFydCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBhbGwgY2hhcmFjdGVycyBjYW4gZ2V0IGVzY2FwZWQgYnkgYmFja3NsYXNoLAorICAgICAgICAgICAgICAgKiBleGNlcHQgbmV3bGluZSwgd2hpY2ggaXMgcmVtb3ZlZCBpZiBpdCBmb2xsb3dzCisgICAgICAgICAgICAgICAqIGEgYmFja3NsYXNoIG91dHNpZGUgb2YgcXVvdGVzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgKytzdGFydDsKKyAgICAgICAgICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKnN0YXJ0ICE9ICdcbicpCisJCSAgICB7CisJCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmcmV0dmFsLCAqc3RhcnQpKQorCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZyZXR2YWwsICpzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghdW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoc3RhcnQsICZlbmQpKQorCSAgICBnb3RvIGVycm9yOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcmV0dmFsLCBzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcmV0dmFsKSk7CisgIGlmICghcmV0KQorICAgIGdvdG8gZXJyb3I7CisKKyAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsKTsKKyAgCisgIHJldHVybiByZXQ7CisgIAorIGVycm9yOgorICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwpOworICByZXR1cm4gTlVMTDsKK30KKworLyogX2RidXNfc2hlbGxfcGFyc2VfYXJndigpIGRvZXMgYSBzZW1pLWFyYml0cmFyeSB3ZWlyZCBzdWJzZXQgb2YgdGhlIHdheQorICogdGhlIHNoZWxsIHBhcnNlcyBhIGNvbW1hbmQgbGluZS4gV2UgZG9uJ3QgZG8gdmFyaWFibGUgZXhwYW5zaW9uLAorICogZG9uJ3QgdW5kZXJzdGFuZCB0aGF0IG9wZXJhdG9ycyBhcmUgdG9rZW5zLCBkb24ndCBkbyB0aWxkZSBleHBhbnNpb24sCisgKiBkb24ndCBkbyBjb21tYW5kIHN1YnN0aXR1dGlvbiwgbm8gYXJpdGhtZXRpYyBleHBhbnNpb24sIElGUyBnZXRzIGlnbm9yZWQsCisgKiBkb24ndCBkbyBmaWxlbmFtZSBnbG9icywgZG9uJ3QgcmVtb3ZlIHJlZGlyZWN0aW9uIHN0dWZmLCBldGMuCisgKgorICogUkVBRCBUSEUgVU5JWDk4IFNQRUMgb24gIlNoZWxsIENvbW1hbmQgTGFuZ3VhZ2UiIGJlZm9yZSBjaGFuZ2luZworICogdGhlIGJlaGF2aW9yIG9mIHRoaXMgY29kZS4KKyAqCisgKiBTdGVwcyB0byBwYXJzaW5nIHRoZSBhcmd2IHN0cmluZzoKKyAqCisgKiAgLSB0b2tlbml6ZSB0aGUgc3RyaW5nIChidXQgc2luY2Ugd2UgaWdub3JlIG9wZXJhdG9ycywKKyAqICAgIG91ciB0b2tlbml6YXRpb24gbWF5IGRpdmVyZ2UgZnJvbSB3aGF0IHRoZSBzaGVsbCB3b3VsZCBkbykKKyAqICAgIG5vdGUgdGhhdCB0b2tlbml6YXRpb24gaWdub3JlcyB0aGUgaW50ZXJuYWxzIG9mIGEgcXVvdGVkCisgKiAgICB3b3JkIGFuZCBpdCBhbHdheXMgc3BsaXRzIG9uIHNwYWNlcywgbm90IG9uIElGUyBldmVuCisgKiAgICBpZiB3ZSB1c2VkIElGUy4gV2UgYWxzbyBpZ25vcmUgImVuZCBvZiBpbnB1dCBpbmRpY2F0b3IiCisgKiAgICAoSSBndWVzcyB0aGlzIGlzIGNvbnRyb2wtRD8pCisgKgorICogICAgVG9rZW5pemF0aW9uIHN0ZXBzLCBmcm9tIFVOSVg5OCB3aXRoIG9wZXJhdG9yIHN0dWZmIHJlbW92ZWQsCisgKiAgICBhcmU6CisgKiAKKyAqICAgIDEpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYmFja3NsYXNoLCBzaW5nbGUtcXVvdGUgb3IKKyAqICAgICAgICBkb3VibGUtcXVvdGUgKFwsICcgb3IgIikgYW5kIGl0IGlzIG5vdCBxdW90ZWQsIGl0IHdpbGwgYWZmZWN0CisgKiAgICAgICAgcXVvdGluZyBmb3Igc3Vic2VxdWVudCBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHF1b3RlZAorICogICAgICAgIHRleHQuIFRoZSBydWxlcyBmb3IgcXVvdGluZyBhcmUgYXMgZGVzY3JpYmVkIGluIFF1b3RpbmcKKyAqICAgICAgICAuIER1cmluZyB0b2tlbiByZWNvZ25pdGlvbiBubyBzdWJzdGl0dXRpb25zIHdpbGwgYmUgYWN0dWFsbHkKKyAqICAgICAgICBwZXJmb3JtZWQsIGFuZCB0aGUgcmVzdWx0IHRva2VuIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZQorICogICAgICAgIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGlucHV0IChleGNlcHQgZm9yIG5ld2xpbmUKKyAqICAgICAgICBjaGFyYWN0ZXIgam9pbmluZyksIHVubW9kaWZpZWQsIGluY2x1ZGluZyBhbnkgZW1iZWRkZWQgb3IKKyAqICAgICAgICBlbmNsb3NpbmcgcXVvdGVzIG9yIHN1YnN0aXR1dGlvbiBvcGVyYXRvcnMsIGJldHdlZW4gdGhlIHF1b3RlCisgKiAgICAgICAgbWFyayBhbmQgdGhlIGVuZCBvZiB0aGUgcXVvdGVkIHRleHQuIFRoZSB0b2tlbiB3aWxsIG5vdCBiZQorICogICAgICAgIGRlbGltaXRlZCBieSB0aGUgZW5kIG9mIHRoZSBxdW90ZWQgZmllbGQuIgorICoKKyAqICAgIDIpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgbmV3bGluZSBjaGFyYWN0ZXIsCisgKiAgICAgICAgdGhlIGN1cnJlbnQgdG9rZW4gd2lsbCBiZSBkZWxpbWl0ZWQuIgorICoKKyAqICAgIDMpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgYmxhbmsgY2hhcmFjdGVyLCBhbnkKKyAqICAgICAgICB0b2tlbiBjb250YWluaW5nIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgZGVsaW1pdGVkIGFuZCB0aGUKKyAqICAgICAgICBjdXJyZW50IGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZC4iCisgKgorICogICAgNCkgIklmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHBhcnQgb2YgYSB3b3JkLCB0aGUgY3VycmVudAorICogICAgICAgIGNoYXJhY3RlciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoYXQgd29yZC4iCisgKgorICogICAgNSkgIklmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhICIjIiwgaXQgYW5kIGFsbCBzdWJzZXF1ZW50CisgKiAgICAgICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IGV4Y2x1ZGluZywgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIKKyAqICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBhcyBhIGNvbW1lbnQuIFRoZSBuZXdsaW5lIGNoYXJhY3RlciB0aGF0CisgKiAgICAgICAgZW5kcyB0aGUgbGluZSBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21tZW50LiBUaGUKKyAqICAgICAgICAiIyIgc3RhcnRzIGEgY29tbWVudCBvbmx5IHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgICAgICAgdG9rZW4uIFNpbmNlIHRoZSBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtY29tbWVudCBkb2VzIG5vdAorICogICAgICAgIGNvbnNpZGVyIGFuIGVzY2FwZWQgbmV3bGluZSBjaGFyYWN0ZXIgc3BlY2lhbGx5LCBhIGNvbW1lbnQKKyAqICAgICAgICBjYW5ub3QgYmUgY29udGludWVkIHRvIHRoZSBuZXh0IGxpbmUuIgorICoKKyAqICAgIDYpICJUaGUgY3VycmVudCBjaGFyYWN0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBvZiBhIG5ldyB3b3JkLiIKKyAqCisgKgorICogIC0gZm9yIGVhY2ggdG9rZW4gKHdvcmQpLCBwZXJmb3JtIHBvcnRpb25zIG9mIHdvcmQgZXhwYW5zaW9uLCBuYW1lbHkKKyAqICAgIGZpZWxkIHNwbGl0dGluZyAodXNpbmcgZGVmYXVsdCB3aGl0ZXNwYWNlIElGUykgYW5kIHF1b3RlCisgKiAgICByZW1vdmFsLiAgRmllbGQgc3BsaXR0aW5nIG1heSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICogICAgUXVvdGUgcmVtb3ZhbCBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICoKKyAqICAgIklmIHRoZSBjb21wbGV0ZSBleHBhbnNpb24gYXBwcm9wcmlhdGUgZm9yIGEgd29yZCByZXN1bHRzIGluIGFuCisgKiAgIGVtcHR5IGZpZWxkLCB0aGF0IGVtcHR5IGZpZWxkIHdpbGwgYmUgZGVsZXRlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiAgIGZpZWxkcyB0aGF0IGZvcm0gdGhlIGNvbXBsZXRlbHkgZXhwYW5kZWQgY29tbWFuZCwgdW5sZXNzIHRoZQorICogICBvcmlnaW5hbCB3b3JkIGNvbnRhaW5lZCBzaW5nbGUtcXVvdGUgb3IgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuIgorICogICAgLSBVTklYOTggc3BlYworICoKKyAqCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitkZWxpbWl0X3Rva2VuIChEQnVzU3RyaW5nICp0b2tlbiwKKyAgICAgICAgICAgICAgIERCdXNMaXN0ICoqcmV0dmFsLAorCSAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICpzdHI7CisKKyAgc3RyID0gX2RidXNfc3RyZHVwIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHRva2VuKSk7CisgIGlmICghc3RyKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmV0dmFsLCBzdHIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzTGlzdCoKK3Rva2VuaXplX2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyIGN1cnJlbnRfcXVvdGU7CisgIGNvbnN0IGNoYXIgKnA7CisgIERCdXNTdHJpbmcgY3VycmVudF90b2tlbjsKKyAgREJ1c0xpc3QgKnJldHZhbCA9IE5VTEw7CisgIGRidXNfYm9vbF90IHF1b3RlZDs7CisKKyAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgIHF1b3RlZCA9IEZBTFNFOworICBwID0gY29tbWFuZF9saW5lOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3F1b3RlID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogd2UgYXBwZW5kIG5vdGhpbmc7IGJhY2tzbGFzaC1uZXdsaW5lIGJlY29tZSBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY3VycmVudF90b2tlbiwgJ1xcJykgfHwgCisJICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1cnJlbnRfcXVvdGUgPT0gJyMnKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzY2FyZCB1cCB0byBhbmQgaW5jbHVkaW5nIG5leHQgbmV3bGluZSAqLworICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgICAgICAgKytwOworCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY3VycmVudF9xdW90ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBjdXJyZW50X3F1b3RlICYmCisgICAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgIShjdXJyZW50X3F1b3RlID09ICciJyAmJiBxdW90ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBFdmVyeXRoaW5nIGluc2lkZSBxdW90ZXMsIGFuZCB0aGUgY2xvc2UgcXVvdGUsCisgICAgICAgICAgICogZ2V0cyBhcHBlbmRlZCBsaXRlcmFsbHkuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkgICAgeworCSAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJZ290byBlcnJvcjsKKworCQlfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCWlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKwkJICB7CisJCSAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICBnb3RvIGluaXRfZXJyb3I7CisJCSAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgLyogSWYgdGhlIGN1cnJlbnQgdG9rZW4gY29udGFpbnMgdGhlIHByZXZpb3VzIGNoYXIsIGRlbGltaXQKKyAgICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgdG9rZW4uIEEgbm9uemVybyBsZW5ndGgKKyAgICAgICAgICAgICAgICogdG9rZW4gc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSBwcmV2aW91cyBjaGFyLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY3VycmVudF90b2tlbikgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJICAgIGdvdG8gZXJyb3I7CisKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCSAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmN1cnJlbnRfdG9rZW4pKQorCQkgICAgeworCQkgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICAgIGdvdG8gaW5pdF9lcnJvcjsKKwkJICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGRpc2NhcmQgYWxsIHVucXVvdGVkIGJsYW5rcyAoZG9uJ3QgYWRkIHRoZW0gdG8gYSB0b2tlbikgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAvKiBzaW5nbGUvZG91YmxlIHF1b3RlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRva2VuLAorICAgICAgICAgICAgICAgKiBlc2NhcGVzIGFyZSBtYXliZSBhcHBlbmRlZCBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwKKyAgICAgICAgICAgICAgICogY29tbWVudCBjaGFycyBhcmUgbmV2ZXIgYXBwZW5kZWQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkJeworCQkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkJICBnb3RvIGVycm9yOworCQl9CisKKyAgICAgICAgICAgICAgLyogRkFMTCBUSFJVICovCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIGN1cnJlbnRfcXVvdGUgPSAqcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIC8qIENvbWJpbmVzIHJ1bGVzIDQpIGFuZCA2KSAtIGlmIHdlIGhhdmUgYSB0b2tlbiwgYXBwZW5kIHRvIGl0LAorICAgICAgICAgICAgICAgKiBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IHRva2VuLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBXZSBuZWVkIHRvIGNvdW50IGNvbnNlY3V0aXZlIGJhY2tzbGFzaGVzIG1vZCAyLCAKKyAgICAgICAqIHRvIGRldGVjdCBlc2NhcGVkIGRvdWJsZXF1b3Rlcy4KKyAgICAgICAqLworICAgICAgaWYgKCpwICE9ICdcXCcpCisJcXVvdGVkID0gRkFMU0U7CisgICAgICBlbHNlCisJcXVvdGVkID0gIXF1b3RlZDsKKworICAgICAgKytwOworICAgIH0KKworICBpZiAoIWRlbGltaXRfdG9rZW4gKCZjdXJyZW50X3Rva2VuLCAmcmV0dmFsLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoY3VycmVudF9xdW90ZSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLCAiVW5jbG9zZWQgcXVvdGVzIGluIGNvbW1hbmQgbGluZSIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJObyB0b2tlbnMgZm91bmQgaW4gY29tbWFuZCBsaW5lIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjdXJyZW50X3Rva2VuKTsKKyAKKyAgcmV0dXJuIHJldHZhbDsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisgaW5pdF9lcnJvcjoKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZyZXR2YWwsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnJldHZhbCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIF9kYnVzX3NoZWxsX3BhcnNlX2FyZ3Y6CisgKiAKKyAqIFBhcnNlcyBhIGNvbW1hbmQgbGluZSBpbnRvIGFuIGFyZ3VtZW50IHZlY3RvciwgaW4gbXVjaCB0aGUgc2FtZSB3YXkKKyAqIHRoZSBzaGVsbCB3b3VsZCwgYnV0IHdpdGhvdXQgbWFueSBvZiB0aGUgZXhwYW5zaW9ucyB0aGUgc2hlbGwgd291bGQKKyAqIHBlcmZvcm0gKHZhcmlhYmxlIGV4cGFuc2lvbiwgZ2xvYnMsIG9wZXJhdG9ycywgZmlsZW5hbWUgZXhwYW5zaW9uLAorICogZXRjLiBhcmUgbm90IHN1cHBvcnRlZCkuIFRoZSByZXN1bHRzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCisgKiB0aG9zZSB5b3Ugd291bGQgZ2V0IGZyb20gYSBVTklYOTggL2Jpbi9zaCwgYXMgbG9uZyBhcyB0aGUgaW5wdXQKKyAqIGNvbnRhaW5zIG5vbmUgb2YgdGhlIHVuc3VwcG9ydGVkIHNoZWxsIGV4cGFuc2lvbnMuIElmIHRoZSBpbnB1dAorICogZG9lcyBjb250YWluIHN1Y2ggZXhwYW5zaW9ucywgdGhleSBhcmUgcGFzc2VkIHRocm91Z2gKKyAqIGxpdGVyYWxseS4gRnJlZSB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpdGggZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLgorICogCisgKiBAcGFyYW0gY29tbWFuZF9saW5lIGNvbW1hbmQgbGluZSB0byBwYXJzZQorICogQHBhcmFtIGFyZ2NwIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIGFyZ3MKKyAqIEBwYXJhbSBhcmd2cCByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGFyZ3MKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBpbmZvcm1hdGlvbgorICoqLworZGJ1c19ib29sX3QKK19kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGNvbnN0IGNoYXIgKmNvbW1hbmRfbGluZSwKKwkJCWludCAgICAgICAgKmFyZ2NwLAorCQkJY2hhciAgICAgKioqYXJndnAsCisJCQlEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgLyogQ29kZSBiYXNlZCBvbiBwb3B0UGFyc2VBcmd2U3RyaW5nKCkgZnJvbSBsaWJwb3B0ICovCisgIGludCBhcmdjID0gMDsKKyAgY2hhciAqKmFyZ3YgPSBOVUxMOworICBEQnVzTGlzdCAqdG9rZW5zID0gTlVMTDsKKyAgaW50IGk7CisgIERCdXNMaXN0ICp0bXBfbGlzdDsKKyAgCisgIGlmICghY29tbWFuZF9saW5lKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb21tYW5kIGxpbmUgaXMgTlVMTFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRva2VucyA9IHRva2VuaXplX2NvbW1hbmRfbGluZSAoY29tbWFuZF9saW5lLCBlcnJvcik7CisgIGlmICh0b2tlbnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gdG9rZW5zIGZvciBjb21tYW5kIGxpbmUgJyVzJ1xuIiwgY29tbWFuZF9saW5lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogQmVjYXVzZSB3ZSBjYW4ndCBoYXZlIGludHJvZHVjZWQgYW55IG5ldyBibGFuayBzcGFjZSBpbnRvIHRoZQorICAgKiB0b2tlbnMgKHdlIGRpZG4ndCBkbyBhbnkgbmV3IGV4cGFuc2lvbnMpLCB3ZSBkb24ndCBuZWVkIHRvCisgICAqIHBlcmZvcm0gZmllbGQgc3BsaXR0aW5nLiBJZiB3ZSB3ZXJlIGdvaW5nIHRvIGhvbm9yIElGUyBvciBkbyBhbnkKKyAgICogZXhwYW5zaW9ucywgd2Ugd291bGQgaGF2ZSB0byBkbyBmaWVsZCBzcGxpdHRpbmcgb24gZWFjaCB3b3JkCisgICAqIGhlcmUuIEFsc28sIGlmIHdlIHdlcmUgZ29pbmcgdG8gZG8gYW55IGV4cGFuc2lvbiB3ZSB3b3VsZCBuZWVkIHRvCisgICAqIHJlbW92ZSBhbnkgemVyby1sZW5ndGggd29yZHMgdGhhdCBkaWRuJ3QgY29udGFpbiBxdW90ZXMKKyAgICogb3JpZ2luYWxseTsgYnV0IHNpbmNlIHRoZXJlJ3Mgbm8gZXhwYW5zaW9uIHdlIGtub3cgYWxsIHdvcmRzIGhhdmUKKyAgICogbm9uemVybyBsZW5ndGgsIHVubGVzcyB0aGV5IGNvbnRhaW4gcXVvdGVzLgorICAgKiAKKyAgICogU28sIHdlIHNpbXBseSByZW1vdmUgcXVvdGVzLCBhbmQgZG9uJ3QgZG8gYW55IGZpZWxkIHNwbGl0dGluZyBvcgorICAgKiBlbXB0eSB3b3JkIHJlbW92YWwsIHNpbmNlIHdlIGtub3cgdGhlcmUgd2FzIG5vIHdheSB0byBpbnRyb2R1Y2UKKyAgICogc3VjaCB0aGluZ3MuCisgICAqLworCisgIGFyZ2MgPSBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZ0b2tlbnMpOworICBhcmd2ID0gZGJ1c19uZXcgKGNoYXIgKiwgYXJnYyArIDEpOworICBpZiAoIWFyZ3YpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaSA9IDA7CisgIHRtcF9saXN0ID0gdG9rZW5zOworICB3aGlsZSAodG1wX2xpc3QpCisgICAgeworICAgICAgYXJndltpXSA9IF9kYnVzX3NoZWxsX3VucXVvdGUgKHRtcF9saXN0LT5kYXRhKTsKKworICAgICAgaWYgKCFhcmd2W2ldKQorICAgICAgICB7CisgICAgICAgICAgaW50IGo7CisJICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCSAgICBkYnVzX2ZyZWUoYXJndltqXSk7CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKGFyZ3YpOworCSAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCSAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICB0bXBfbGlzdCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRva2VucywgdG1wX2xpc3QpOworICAgICAgKytpOworICAgIH0KKyAgYXJndlthcmdjXSA9IE5VTEw7CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0b2tlbnMsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmdG9rZW5zKTsKKyAgCisgIGlmIChhcmdjcCkKKyAgICAqYXJnY3AgPSBhcmdjOworCisgIGlmIChhcmd2cCkKKyAgICAqYXJndnAgPSBhcmd2OworICBlbHNlCisgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdG9rZW5zLCAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJnRva2Vucyk7CisKKyAgcmV0dXJuIEZBTFNFOworCit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2hlbGwuaCBiL2RidXMvZGJ1cy1zaGVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZGEyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2hlbGwuaApAQCAtMCwwICsxLDQxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hlbGwuaCBTaGVsbCBjb21tYW5kIGxpbmUgdXRpbGl0eSBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKworI2lmbmRlZiBEQlVTX1NIRUxMX0gKKyNkZWZpbmUgREJVU19TSEVMTF9ICisKK0RCVVNfQkVHSU5fREVDTFMKKworY2hhciogICAgICAgX2RidXNfc2hlbGxfdW5xdW90ZSAgICAoY29uc3QgY2hhciAqcXVvdGVkX3N0cmluZyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChjb25zdCBjaGFyICpjb21tYW5kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICphcmdjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKioqYXJndnAsCisJCQkJICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0hFTExfSCAqLworCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zaWduYXR1cmUuYyBiL2RidXMvZGJ1cy1zaWduYXR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE1MjFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNpZ25hdHVyZS5jCkBAIC0wLDAgKzEsNTg5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2lnbmF0dXJlLmMgIFJvdXRpbmVzIGZvciByZWFkaW5nIHJlY3Vyc2l2ZSB0eXBlIHNpZ25hdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mICNEQnVzU2lnbmF0dXJlSXRlciwgYWxsIGZpZWxkcyBhcmUgcHJpdmF0ZQorICovCit0eXBlZGVmIHN0cnVjdAoreyAKKyAgY29uc3QgY2hhciAqcG9zOyAgICAgICAgICAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzaWduYXR1cmUgc3RyaW5nICovCisgIHVuc2lnbmVkIGludCBmaW5pc2hlZCA6IDE7IC8qKjwgdHJ1ZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBpdGVyICovCisgIHVuc2lnbmVkIGludCBpbl9hcnJheSA6IDE7IC8qKjwgdHJ1ZSBpZiB3ZSBhcmUgYSBzdWJpdGVyYXRvciBwb2ludGluZyB0byBhbiBhcnJheSdzIGVsZW1lbnQgdHlwZSAqLworfSBEQnVzU2lnbmF0dXJlUmVhbEl0ZXI7CisKKy8qKiBtYWNybyB0aGF0IGNoZWNrcyB3aGV0aGVyIGEgdHlwZWNvZGUgaXMgYSBjb250YWluZXIgdHlwZSAqLworI2RlZmluZSBUWVBFX0lTX0NPTlRBSU5FUih0eXBlY29kZSkgICAgICAgICAgICAgXAorICAgICgodHlwZWNvZGUpID09IERCVVNfVFlQRV9TVFJVQ1QgfHwgICAgICAgICAgXAorICAgICAodHlwZWNvZGUpID09IERCVVNfVFlQRV9ESUNUX0VOVFJZIHx8ICAgICAgXAorICAgICAodHlwZWNvZGUpID09IERCVVNfVFlQRV9WQVJJQU5UIHx8ICAgICAgICAgXAorICAgICAodHlwZWNvZGUpID09IERCVVNfVFlQRV9BUlJBWSkKKworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2lnbmF0dXJlIFR5cGUgc2lnbmF0dXJlIHBhcnNpbmcKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgUGFyc2luZyBELUJ1cyB0eXBlIHNpZ25hdHVyZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhICNEQnVzU2lnbmF0dXJlSXRlciBmb3IgcmVhZGluZyBhIHR5cGUgc2lnbmF0dXJlLiAgVGhpcworICogZnVuY3Rpb24gaXMgbm90IHNhZmUgdG8gdXNlIG9uIGludmFsaWQgc2lnbmF0dXJlczsgYmUgc3VyZSB0bworICogdmFsaWRhdGUgcG90ZW50aWFsbHkgaW52YWxpZCBzaWduYXR1cmVzIHdpdGggZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUKKyAqIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBpdGVyIHBvaW50ZXIgdG8gYW4gaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqLwordm9pZAorZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0IChEQnVzU2lnbmF0dXJlSXRlciAqaXRlciwKKwkJCSAgY29uc3QgY2hhciAgICAgICAgKnNpZ25hdHVyZSkKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisKKyAgcmVhbF9pdGVyLT5wb3MgPSBzaWduYXR1cmU7CisgIHJlYWxfaXRlci0+ZmluaXNoZWQgPSBGQUxTRTsKKyAgcmVhbF9pdGVyLT5pbl9hcnJheSA9IEZBTFNFOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgdHlwZSBwb2ludGVkIHRvIGJ5IHRoZSBpdGVyYXRvci4KKyAqIElmIHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyBhdCBhIHR5cGUgY29kZSBzdWNoIGFzICdzJywgdGhlbgorICogaXQgd2lsbCBiZSByZXR1cm5lZCBkaXJlY3RseS4KKyAqCisgKiBIb3dldmVyLCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIGNvbnRhaW5lciB0eXBlIHN0YXJ0CisgKiBjaGFyYWN0ZXIgc3VjaCBhcyAnKCcgZm9yIGEgc3RydWN0dXJlLCB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGZvcgorICogdGhlIGNvbnRhaW5lciB3aWxsIGJlIHJldHVybmVkLCBlLmcuICBEQlVTX1RZUEVfU1RSVUNULCBub3QgJygnLgorICogSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkIGluaXRpYWxpemUgYSBzdWItaXRlcmF0b3Igd2l0aAorICogZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlKCkgdG8gcGFyc2UgdGhlIGNvbnRhaW5lciB0eXBlLgorICoKKyAqIEBwYXJhbSBpdGVyIHBvaW50ZXIgdG8gYW4gaXRlcmF0b3IgCisgKiBAcmV0dXJucyBjdXJyZW50IHR5cGUgKGUuZy4gI0RCVVNfVFlQRV9TVFJJTkcsICNEQlVTX1RZUEVfQVJSQVkpCisgKi8KK2ludAorZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisKKyAgcmV0dXJuIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChyZWFsX2l0ZXItPnBvcywgMCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBzaW5nbGUgY29tcGxldGUgdHlwZSBzdGFydGluZyBhdCB0aGUKKyAqIGdpdmVuIGl0ZXJhdG9yLgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mICIoaWkpaWkiCisgKiAod2hpY2ggaXMgImEgc3RydWN0IG9mIHR3byBpbnRzLCBmb2xsb3dlZCBieSBhbiBpbnQsIGZvbGxvd2VkIGJ5IGFuCisgKiBpbnQiKSwgdGhlbiAiKGlpKSIgd291bGQgYmUgcmV0dXJuZWQuIElmIHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyBhdAorICogb25lIG9mIHRoZSAiaSIgdGhlbiBqdXN0IHRoYXQgImkiIHdvdWxkIGJlIHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBpdGVyIHBvaW50ZXIgdG8gYW4gaXRlcmF0b3IgCisgKiBAcmV0dXJucyBjdXJyZW50IHNpZ25hdHVyZTsgb3IgI05VTEwgaWYgbm8gbWVtb3J5LiAgU2hvdWxkIGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkKKyAqLworY2hhciAqCitkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9zaWduYXR1cmUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKyAgREJ1c1N0cmluZyBzdHI7CisgIGNoYXIgKnJldDsKKyAgaW50IHBvczsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIHBvcyA9IDA7CisgIF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgKHJlYWxfaXRlci0+cG9zLCAmcG9zKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmc3RyLCByZWFsX2l0ZXItPnBvcywgcG9zKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJldCkpCisgICAgcmV0ID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHJldHVybiByZXQ7IAorfQorCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgdGhlIGVsZW1lbnQgdHlwZSBvZiBhbiBhcnJheTsKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBhdm9pZCBpbml0aWFsaXppbmcgYSBzdWItaXRlcmF0b3IgYW5kCisgKiBnZXR0aW5nIGl0cyBjdXJyZW50IHR5cGUuCisgKgorICogVW5kZWZpbmVkIGJlaGF2aW9yIHJlc3VsdHMgaWYgeW91IGludm9rZSB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlCisgKiBjdXJyZW50IHR5cGUgb2YgdGhlIGl0ZXJhdG9yIGlzIG5vdCAjREJVU19UWVBFX0FSUkFZLgorICoKKyAqIEBwYXJhbSBpdGVyIHBvaW50ZXIgdG8gYW4gaXRlcmF0b3IgCisgKiBAcmV0dXJucyBjdXJyZW50IGFycmF5IGVsZW1lbnQgdHlwZQorICovCitpbnQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlZBTElEKTsKKworICByZXR1cm4gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIgKHJlYWxfaXRlci0+cG9zLCAxKTsKK30KKworLyoqCisgKiBTa2lwIHRvIHRoZSBuZXh0IHZhbHVlIG9uIHRoaXMgImxldmVsIi4gZS5nLiB0aGUgbmV4dCBmaWVsZCBpbiBhCisgKiBzdHJ1Y3QsIHRoZSBuZXh0IHZhbHVlIGluIGFuIGFycmF5LiBSZXR1cm5zICNGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZQorICogY3VycmVudCBjb250YWluZXIuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcmV0dXJucyBGQUxTRSBpZiBub3RoaW5nIG1vcmUgdG8gcmVhZCBhdCBvciBiZWxvdyB0aGlzIGxldmVsCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKERCdXNTaWduYXR1cmVJdGVyICppdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKworICBpZiAocmVhbF9pdGVyLT5maW5pc2hlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgcG9zOworCisgICAgICBpZiAocmVhbF9pdGVyLT5pbl9hcnJheSkKKwl7CisJICByZWFsX2l0ZXItPmZpbmlzaGVkID0gVFJVRTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgICAgIHBvcyA9IDA7CisgICAgICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0IChyZWFsX2l0ZXItPnBvcywgJnBvcyk7CisgICAgICByZWFsX2l0ZXItPnBvcyArPSBwb3M7CisKKyAgICAgIGlmICgqcmVhbF9pdGVyLT5wb3MgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIKKwkgIHx8ICpyZWFsX2l0ZXItPnBvcyA9PSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpCisJeworCSAgcmVhbF9pdGVyLT5maW5pc2hlZCA9IFRSVUU7CisJICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICByZXR1cm4gKnJlYWxfaXRlci0+cG9zICE9IERCVVNfVFlQRV9JTlZBTElEOworICAgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgbmV3IGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBjdXJyZW50CisgKiBjb250YWluZXIuCisgKiAKKyAqIFRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHRoaXMgaWYgdGhlIGN1cnJlbnQgdHlwZSBpcworICogYSBub24tY29udGFpbmVyIChpLmUuIGlmIGRidXNfdHlwZV9pc19jb250YWluZXIoKSByZXR1cm5zICNGQUxTRQorICogZm9yIHRoZSByZXN1bHQgb2YgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlKCkpLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBjdXJyZW50IGludGVyYXRvcgorICogQHBhcmFtIHN1Yml0ZXIgYW4gaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZSBwb2ludGluZyB0byB0aGUgZmlyc3QgY2hpbGQKKyAqLwordm9pZAorZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlciwKKwkJCSAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgICAgICAgKnN1Yml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfc3ViX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIHN1Yml0ZXI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGRidXNfdHlwZV9pc19jb250YWluZXIgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoaXRlcikpKTsKKworICAqcmVhbF9zdWJfaXRlciA9ICpyZWFsX2l0ZXI7CisgIHJlYWxfc3ViX2l0ZXItPmluX2FycmF5ID0gRkFMU0U7CisgIHJlYWxfc3ViX2l0ZXItPnBvcysrOworCisgIGlmIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGl0ZXIpID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICByZWFsX3N1Yl9pdGVyLT5pbl9hcnJheSA9IFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2sgYSB0eXBlIHNpZ25hdHVyZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cworICogYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IqLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBoYXZpbmcKKyAqIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIHNpZ25hdHVyZSBhIHBvdGVudGlhbGx5IGludmFsaWQgdHlwZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHNpZ25hdHVyZSBpcyB2YWxpZCBvciAjRkFMU0UgaWYgYW4gZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJIERCdXNFcnJvciAgICAgICAgKmVycm9yKQorCQkJIAoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c1ZhbGlkaXR5IHJlYXNvbjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgc2lnbmF0dXJlKTsKKyAgcmVhc29uID0gX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgIGlmIChyZWFzb24gPT0gREJVU19WQUxJRCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSwgX2RidXNfdmFsaWRpdHlfdG9fZXJyb3JfbWVzc2FnZSAocmVhc29uKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrIHRoYXQgYSB0eXBlIHNpZ25hdHVyZSBpcyBib3RoIHZhbGlkIGFuZCBjb250YWlucyBleGFjdGx5IG9uZQorICogY29tcGxldGUgdHlwZS4gIk9uZSBjb21wbGV0ZSB0eXBlIiBtZWFucyBhIHNpbmdsZSBiYXNpYyB0eXBlLAorICogYXJyYXksIHN0cnVjdCwgb3IgZGljdGlvbmFyeSwgdGhvdWdoIHRoZSBzdHJ1Y3Qgb3IgYXJyYXkgbWF5IGJlCisgKiBhcmJpdHJhcmlseSByZWN1cnNpdmUgYW5kIGNvbXBsZXguIE1vcmUgdGhhbiBvbmUgY29tcGxldGUgdHlwZQorICogd291bGQgbWVhbiBmb3IgZXhhbXBsZSAiaWkiIG9yIHR3byBpbnRlZ2VycyBpbiBzZXF1ZW5jZS4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIGEgcG90ZW50aWFsbHkgaW52YWxpZCB0eXBlIHNpZ25hdHVyZQorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkIGFuZCBoYXMgZXhhY3RseSBvbmUgY29tcGxldGUgdHlwZQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zaWduYXR1cmVfdmFsaWRhdGVfc2luZ2xlIChjb25zdCBjaGFyICAgICAgICpzaWduYXR1cmUsCisJCQkJREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTaWduYXR1cmVJdGVyIGl0ZXI7CisKKyAgaWYgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnbmF0dXJlLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZ25hdHVyZSk7CisgIGlmIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICBnb3RvIGxvc2U7CisgIGlmICghZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgcmV0dXJuIFRSVUU7CisgbG9zZToKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfU0lHTkFUVVJFLCAiRXhhY3RseSBvbmUgY29tcGxldGUgdHlwZSByZXF1aXJlZCBpbiBzaWduYXR1cmUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEEgImNvbnRhaW5lciB0eXBlIiBjYW4gY29udGFpbiBiYXNpYyB0eXBlcywgb3IgbmVzdGVkCisgKiBjb250YWluZXIgdHlwZXMuICNEQlVTX1RZUEVfSU5WQUxJRCBpcyBub3QgYSBjb250YWluZXIgdHlwZS4KKyAqCisgKiBJdCBpcyBhbiBlcnJvciB0byBwYXNzIGFuIGludmFsaWQgdHlwZS1jb2RlLCBvdGhlciB0aGFuIERCVVNfVFlQRV9JTlZBTElELAorICogdG8gdGhpcyBmdW5jdGlvbi4gVGhlIHZhbGlkIHR5cGUtY29kZXMgYXJlIGRlZmluZWQgYnkgZGJ1cy1wcm90b2NvbC5oCisgKiBhbmQgY2FuIGJlIGNoZWNrZWQgd2l0aCBkYnVzX3R5cGVfaXNfdmFsaWQoKS4KKyAqCisgKiBAcGFyYW0gdHlwZWNvZGUgZWl0aGVyIGEgdmFsaWQgdHlwZS1jb2RlIG9yIERCVVNfVFlQRV9JTlZBTElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB0eXBlIGlzIGEgY29udGFpbmVyCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3R5cGVfaXNfY29udGFpbmVyIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfdHlwZV9pc192YWxpZCAodHlwZWNvZGUpIHx8IHR5cGVjb2RlID09IERCVVNfVFlQRV9JTlZBTElELAorCQkJICAgIEZBTFNFKTsKKyAgcmV0dXJuIFRZUEVfSVNfQ09OVEFJTkVSICh0eXBlY29kZSk7Cit9CisKKy8qKgorICogQSAiYmFzaWMgdHlwZSIgaXMgYSBzb21ld2hhdCBhcmJpdHJhcnkgY29uY2VwdCwgYnV0IHRoZSBpbnRlbnQgaXMKKyAqIHRvIGluY2x1ZGUgdGhvc2UgdHlwZXMgdGhhdCBhcmUgZnVsbHktc3BlY2lmaWVkIGJ5IGEgc2luZ2xlCisgKiB0eXBlY29kZSwgd2l0aCBubyBhZGRpdGlvbmFsIHR5cGUgaW5mb3JtYXRpb24gb3IgbmVzdGVkIHZhbHVlcy4gU28KKyAqIGFsbCBudW1iZXJzIGFuZCBzdHJpbmdzIGFyZSBiYXNpYyB0eXBlcyBhbmQgc3RydWN0cywgYXJyYXlzLCBhbmQKKyAqIHZhcmlhbnRzIGFyZSBub3QgYmFzaWMgdHlwZXMuICAjREJVU19UWVBFX0lOVkFMSUQgaXMgbm90IGEgYmFzaWMKKyAqIHR5cGUuCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaAorICogYW5kIGNhbiBiZSBjaGVja2VkIHdpdGggZGJ1c190eXBlX2lzX3ZhbGlkKCkuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI1RSVUUgaWYgdHlwZSBpcyBiYXNpYworICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2Jhc2ljIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfdHlwZV9pc192YWxpZCAodHlwZWNvZGUpIHx8IHR5cGVjb2RlID09IERCVVNfVFlQRV9JTlZBTElELAorCQkJICAgIEZBTFNFKTsKKworICAvKiBldmVyeXRoaW5nIHRoYXQgaXNuJ3QgaW52YWxpZCBvciBhIGNvbnRhaW5lciAqLworICByZXR1cm4gISh0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCB8fCBUWVBFX0lTX0NPTlRBSU5FUiAodHlwZWNvZGUpKTsKK30KKworLyoqCisgKiBUZWxscyB5b3Ugd2hldGhlciB2YWx1ZXMgb2YgdGhpcyB0eXBlIGNhbiBjaGFuZ2UgbGVuZ3RoIGlmIHlvdSBzZXQKKyAqIHRoZW0gdG8gc29tZSBvdGhlciB2YWx1ZS4gRm9yIHRoaXMgcHVycG9zZSwgeW91IGFzc3VtZSB0aGF0IHRoZQorICogZmlyc3QgYnl0ZSBvZiB0aGUgb2xkIGFuZCBuZXcgdmFsdWUgd291bGQgYmUgaW4gdGhlIHNhbWUgbG9jYXRpb24sCisgKiBzbyBhbGlnbm1lbnQgcGFkZGluZyBpcyBub3QgYSBmYWN0b3IuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpIG1heSBiZSB1c2VkLgorICoKKyAqIFNvbWUgc3RydWN0cyBhcmUgZml4ZWQtc2l6ZSAoaWYgdGhleSBjb250YWluIG9ubHkgZml4ZWQtc2l6ZSB0eXBlcykKKyAqIGJ1dCBzdHJ1Y3QgaXMgbm90IGNvbnNpZGVyZWQgYSBmaXhlZCB0eXBlIGZvciBwdXJwb3NlcyBvZiB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBJdCBpcyBhbiBlcnJvciB0byBwYXNzIGFuIGludmFsaWQgdHlwZS1jb2RlLCBvdGhlciB0aGFuIERCVVNfVFlQRV9JTlZBTElELAorICogdG8gdGhpcyBmdW5jdGlvbi4gVGhlIHZhbGlkIHR5cGUtY29kZXMgYXJlIGRlZmluZWQgYnkgZGJ1cy1wcm90b2NvbC5oCisgKiBhbmQgY2FuIGJlIGNoZWNrZWQgd2l0aCBkYnVzX3R5cGVfaXNfdmFsaWQoKS4KKyAqCisgKiBAcGFyYW0gdHlwZWNvZGUgZWl0aGVyIGEgdmFsaWQgdHlwZS1jb2RlIG9yIERCVVNfVFlQRV9JTlZBTElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIHR5cGUgY2FuIG9jY3VweSBkaWZmZXJlbnQgbGVuZ3RocworICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2ZpeGVkIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfdHlwZV9pc192YWxpZCAodHlwZWNvZGUpIHx8IHR5cGVjb2RlID09IERCVVNfVFlQRV9JTlZBTElELAorCQkJICAgIEZBTFNFKTsKKyAgCisgIHN3aXRjaCAodHlwZWNvZGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKioKKyAqIFJldHVybiAjVFJVRSBpZiB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCB0eXBlY29kZS4KKyAqICNEQlVTX1RZUEVfSU5WQUxJRCBzdXJwcmlzaW5nbHkgZW5vdWdoIGlzIG5vdCBjb25zaWRlcmVkIHZhbGlkLCBhbmQKKyAqIHJhbmRvbSB1bmtub3duIGJ5dGVzIGFyZW4ndCBlaXRoZXIuIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB3aXRoCisgKiB1bnRydXN0ZWQgZGF0YS4KKyAqCisgKiBAcGFyYW0gdHlwZWNvZGUgYSBwb3RlbnRpYWwgdHlwZS1jb2RlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX3ZhbGlkIChpbnQgdHlwZWNvZGUpCit7CisgIHN3aXRjaCAodHlwZWNvZGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKiogQH0gKi8gLyogZW5kIG9mIERCdXNTaWduYXR1cmUgZ3JvdXAgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKy8qKgorICogQGluZ3JvdXAgREJ1c1NpZ25hdHVyZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzU2lnbmF0dXJlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaWduYXR1cmVfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3Vic3ViaXRlcjsKKyAgY29uc3QgY2hhciAqc2lnOworICBkYnVzX2Jvb2xfdCBib29scmVzOworCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c1NpZ25hdHVyZUl0ZXIpID49IHNpemVvZiAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyKSk7CisKKyAgc2lnID0gIiI7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9JTlZBTElEKTsKKworICBzaWcgPSBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGVfc2luZ2xlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfU1RSSU5HKTsKKworICBzaWcgPSBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfQllURV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0JZVEUpOworCisgIHNpZyA9IERCVVNfVFlQRV9VSU5UMTZfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORworICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0RPVUJMRV9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9VSU5UMTYpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJml0ZXIsICZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9VSU5UMzIpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1ZBUklBTlQpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX0RPVUJMRSk7CisKKyAgc2lnID0gREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORworICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfVUlOVDE2KTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmc3ViaXRlciwgJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0RPVUJMRSk7CisKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmc3Vic3ViaXRlciwgJnN1YnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9ET1VCTEUpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJnN1Yml0ZXIsICZzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisKKyAgc2lnID0gREJVU19UWVBFX0FSUkFZX0FTX1NUUklORworICAgIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9JTlQxNl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORworICAgIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpOworCisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJml0ZXIsICZzdWJpdGVyKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmc3ViaXRlciwgJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9JTlQxNik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKCFib29scmVzKTsKKworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1ZBUklBTlQpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoIWJvb2xyZXMpOworCisgIHNpZyA9IERCVVNfVFlQRV9ESUNUX0VOVFJZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORworICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0RJQ1RfRU5UUllfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0JPT0xFQU5fQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIHJldHVybiBUUlVFOworI2lmIDAKKyBvb206CisgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2lnbmF0dXJlLmggYi9kYnVzL2RidXMtc2lnbmF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zaWduYXR1cmUuaApAQCAtMCwwICsxLDk1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2lnbmF0dXJlcy5oIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBELUJ1cyB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfU0lHTkFUVVJFU19ICisjZGVmaW5lIERCVVNfU0lHTkFUVVJFU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1NpZ25hdHVyZQorICogQHsKKyAqLworCisvKioKKyAqIERCdXNTaWduYXR1cmVJdGVyIHN0cnVjdDsgY29udGFpbnMgbm8gcHVibGljIGZpZWxkcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgCisgIHZvaWQgKmR1bW15MTsgICAgICAgICAvKio8IERvbid0IHVzZSB0aGlzICovCisgIHZvaWQgKmR1bW15MjsgICAgICAgICAvKio8IERvbid0IHVzZSB0aGlzICovCisgIGRidXNfdWludDMyX3QgZHVtbXk4OyAvKio8IERvbid0IHVzZSB0aGlzICovCisgIGludCBkdW1teTEyOyAgICAgICAgICAgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworICBpbnQgZHVtbXkxNzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KK30gREJ1c1NpZ25hdHVyZUl0ZXI7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICAgICAgICAgICAgIChEQnVzU2lnbmF0dXJlSXRlciAgICAgICAqaXRlciwKKwkJCQkJCSAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICpzaWduYXR1cmUpOworCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpOworCitEQlVTX0VYUE9SVAorY2hhciAqICAgICAgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X3NpZ25hdHVyZSAgICAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpOworCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAgICAgICAgICAgICAoREJ1c1NpZ25hdHVyZUl0ZXIgICAgICAgKml0ZXIpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAgICAgICAgICAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCisJCQkJCQkgICAgICBEQnVzU2lnbmF0dXJlSXRlciAgICAgICAqc3ViaXRlcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICpzaWduYXR1cmUsCisJCQkJCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19zaWduYXR1cmVfdmFsaWRhdGVfc2luZ2xlICAgICAgIChjb25zdCBjaGFyICAgICAgICpzaWduYXR1cmUsCisJCQkJCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c190eXBlX2lzX3ZhbGlkICAgICAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICB0eXBlY29kZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c190eXBlX2lzX2Jhc2ljICAgICAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICB0eXBlY29kZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdHlwZV9pc19jb250YWluZXIgICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgdHlwZWNvZGUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3R5cGVfaXNfZml4ZWQgICAgICAgICAgICAgICAgICAgKGludCAgICAgICAgICAgIHR5cGVjb2RlKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NJR05BVFVSRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc29ja2V0LXNldC1lcG9sbC5jIGIvZGJ1cy9kYnVzLXNvY2tldC1zZXQtZXBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRjMjZkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNvY2tldC1zZXQtZXBvbGwuYwpAQCAtMCwwICsxLDM3MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNvY2tldC1zZXQtZXBvbGwuYyAtIGEgc29ja2V0IHNldCBpbXBsZW1lbnRlZCB2aWEgTGludXggZXBvbGwoNCkKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNvY2tldC1zZXQuaCIKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisjaWZuZGVmIF9fbGludXhfXworIyBlcnJvciBUaGlzIGZpbGUgaXMgZm9yIExpbnV4IGVwb2xsKDQpCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNTb2NrZXRTZXQgcGFyZW50OworICAgIGludCBlcGZkOworfSBEQnVzU29ja2V0U2V0RXBvbGw7CisKK3N0YXRpYyBpbmxpbmUgREJ1c1NvY2tldFNldEVwb2xsICoKK3NvY2tldF9zZXRfZXBvbGxfY2FzdCAoREJ1c1NvY2tldFNldCAqc2V0KQoreworICBfZGJ1c19hc3NlcnQgKHNldC0+Y2xzID09ICZfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX2NsYXNzKTsKKyAgcmV0dXJuIChEQnVzU29ja2V0U2V0RXBvbGwgKikgc2V0OworfQorCisvKiB0aGlzIGlzIHNhZmUgdG8gY2FsbCBvbiBhIHBhcnRpYWxseS1hbGxvY2F0ZWQgc29ja2V0IHNldCAqLworc3RhdGljIHZvaWQKK3NvY2tldF9zZXRfZXBvbGxfZnJlZSAoREJ1c1NvY2tldFNldCAqc2V0KQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHNlbGYtPmVwZmQgIT0gLTEpCisgICAgY2xvc2UgKHNlbGYtPmVwZmQpOworCisgIGRidXNfZnJlZSAoc2VsZik7Cit9CisKK0RCdXNTb2NrZXRTZXQgKgorX2RidXNfc29ja2V0X3NldF9lcG9sbF9uZXcgKHZvaWQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZjsKKworICBzZWxmID0gZGJ1c19uZXcwIChEQnVzU29ja2V0U2V0RXBvbGwsIDEpOworCisgIGlmIChzZWxmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2VsZi0+cGFyZW50LmNscyA9ICZfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX2NsYXNzOworCisgIHNlbGYtPmVwZmQgPSBlcG9sbF9jcmVhdGUxIChFUE9MTF9DTE9FWEVDKTsKKworICBpZiAoc2VsZi0+ZXBmZCA9PSAtMSkKKyAgICB7CisgICAgICBpbnQgZmxhZ3M7CisKKyAgICAgIC8qIHRoZSBzaXplIGhpbnQgaXMgaWdub3JlZCB1bmxlc3MgeW91IGhhdmUgYSByYXRoZXIgb2xkIGtlcm5lbCwKKyAgICAgICAqIGJ1dCBtdXN0IGJlIHBvc2l0aXZlIG9uIHNvbWUgdmVyc2lvbnMsIHNvIGp1c3QgcGljayBzb21ldGhpbmcKKyAgICAgICAqIGFyYml0cmFyeTsgaXQncyBhIGhpbnQsIG5vdCBhIGxpbWl0ICovCisgICAgICBzZWxmLT5lcGZkID0gZXBvbGxfY3JlYXRlICg0Mik7CisKKyAgICAgIGZsYWdzID0gZmNudGwgKHNlbGYtPmVwZmQsIEZfR0VURkQsIDApOworCisgICAgICBpZiAoZmxhZ3MgIT0gLTEpCisgICAgICAgIGZjbnRsIChzZWxmLT5lcGZkLCBGX1NFVEZELCBmbGFncyB8IEZEX0NMT0VYRUMpOworICAgIH0KKworICBpZiAoc2VsZi0+ZXBmZCA9PSAtMSkKKyAgICB7CisgICAgICBzb2NrZXRfc2V0X2Vwb2xsX2ZyZWUgKChEQnVzU29ja2V0U2V0ICopIHNlbGYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiAoREJ1c1NvY2tldFNldCAqKSBzZWxmOworfQorCitzdGF0aWMgdWludDMyX3QKK3dhdGNoX2ZsYWdzX3RvX2Vwb2xsX2V2ZW50cyAodW5zaWduZWQgaW50IGZsYWdzKQoreworICB1aW50MzJfdCBldmVudHMgPSAwOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgZXZlbnRzIHw9IEVQT0xMSU47CisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpCisgICAgZXZlbnRzIHw9IEVQT0xMT1VUOworCisgIHJldHVybiBldmVudHM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2Vwb2xsX2V2ZW50c190b193YXRjaF9mbGFncyAodWludDMyX3QgZXZlbnRzKQoreworICBzaG9ydCBmbGFncyA9IDA7CisKKyAgaWYgKGV2ZW50cyAmIEVQT0xMSU4pCisgICAgZmxhZ3MgfD0gREJVU19XQVRDSF9SRUFEQUJMRTsKKyAgaWYgKGV2ZW50cyAmIEVQT0xMT1VUKQorICAgIGZsYWdzIHw9IERCVVNfV0FUQ0hfV1JJVEFCTEU7CisgIGlmIChldmVudHMgJiBFUE9MTEhVUCkKKyAgICBmbGFncyB8PSBEQlVTX1dBVENIX0hBTkdVUDsKKyAgaWYgKGV2ZW50cyAmIEVQT0xMRVJSKQorICAgIGZsYWdzIHw9IERCVVNfV0FUQ0hfRVJST1I7CisKKyAgcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9zZXRfZXBvbGxfYWRkIChEQnVzU29ja2V0U2V0ICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGVuYWJsZWQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OworICBpbnQgZXJyOworCisgIGV2ZW50LmRhdGEuZmQgPSBmZDsKKworICBpZiAoZW5hYmxlZCkKKyAgICB7CisgICAgICBldmVudC5ldmVudHMgPSB3YXRjaF9mbGFnc190b19lcG9sbF9ldmVudHMgKGZsYWdzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGFkZCAqc29tZXRoaW5nKiB0byByZXNlcnZlIHNwYWNlIGluIHRoZSBrZXJuZWwncyBkYXRhCisgICAgICAgKiBzdHJ1Y3R1cmVzOiBzZWUgc29ja2V0X3NldF9lcG9sbF9kaXNhYmxlIGZvciBtb3JlIGRldGFpbHMgKi8KKyAgICAgIGV2ZW50LmV2ZW50cyA9IEVQT0xMRVQ7CisgICAgfQorCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9BREQsIGZkLCAmZXZlbnQpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogQW55dGhpbmcgZXhjZXB0IEVOT01FTSwgRU5PU1BDIG1lYW5zIHdlIGhhdmUgYW4gaW50ZXJuYWwgZXJyb3IuICovCisgIGVyciA9IGVycm5vOworICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgICBjYXNlIEVOT01FTToKKyAgICAgIGNhc2UgRU5PU1BDOgorICAgICAgICAvKiBiZSBzaWxlbnQ6IHRoaXMgaXMgYmFzaWNhbGx5IE9PTSwgd2hpY2ggb3VyIGNhbGxlcnMgYXJlIGV4cGVjdGVkCisgICAgICAgICAqIHRvIGNvcGUgd2l0aCAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFQkFERjoKKyAgICAgICAgX2RidXNfd2FybiAoIkJhZCBmZCAlZFxuIiwgZmQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFRVhJU1Q6CisgICAgICAgIF9kYnVzX3dhcm4gKCJmZCAlZCBhZGRlZCBhbmQgdGhlbiBhZGRlZCBhZ2FpblxuIiwgZmQpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgX2RidXNfd2FybiAoIk1pc2MgZXJyb3Igd2hlbiB0cnlpbmcgdG8gd2F0Y2ggZmQgJWQ6ICVzXG4iLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9lbmFibGUgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncykKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnQ7CisgIGludCBlcnI7CisKKyAgZXZlbnQuZGF0YS5mZCA9IGZkOworICBldmVudC5ldmVudHMgPSB3YXRjaF9mbGFnc190b19lcG9sbF9ldmVudHMgKGZsYWdzKTsKKworICBpZiAoZXBvbGxfY3RsIChzZWxmLT5lcGZkLCBFUE9MTF9DVExfTU9ELCBmZCwgJmV2ZW50KSA9PSAwKQorICAgIHJldHVybjsKKworICBlcnIgPSBlcnJubzsKKworICAvKiBFbmFibGluZyBhIGZpbGUgZGVzY3JpcHRvciBpc24ndCBhbGxvd2VkIHRvIGZhaWwsIGV2ZW4gZm9yIE9PTSwgc28gd2UKKyAgICogZG8gb3VyIGJlc3QgdG8gYXZvaWQgYWxsIG9mIHRoZXNlLiAqLworICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgICBjYXNlIEVCQURGOgorICAgICAgICBfZGJ1c193YXJuICgiQmFkIGZkICVkXG4iLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVOT0VOVDoKKyAgICAgICAgX2RidXNfd2FybiAoImZkICVkIGVuYWJsZWQgYmVmb3JlIGl0IHdhcyBhZGRlZFxuIiwgZmQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFTk9NRU06CisgICAgICAgIF9kYnVzX3dhcm4gKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNoYW5nZSB3YXRjaCBmb3IgZmQgJWRcbiIsIGZkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9kYnVzX3dhcm4gKCJNaXNjIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHdhdGNoIGZkICVkOiAlc1xuIiwgZmQsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9kaXNhYmxlIChEQnVzU29ja2V0U2V0ICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgZmQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OworICBpbnQgZXJyOworCisgIC8qIFRoZSBuYWl2ZSB0aGluZyB0byBkbyB3b3VsZCBiZSBFUE9MTF9DVExfREVMLCBidXQgdGhhdCdsbCBwcm9iYWJseQorICAgKiBmcmVlIHJlc291cmNlcyBpbiB0aGUga2VybmVsLiBXaGVuIHdlIGNvbWUgdG8gZG8gc29ja2V0X3NldF9lcG9sbF9lbmFibGUsCisgICAqIHRoZXJlIG1pZ2h0IG5vdCBiZSBlbm91Z2ggcmVzb3VyY2VzIHRvIGJyaW5nIGl0IGJhY2shCisgICAqCisgICAqIFRoZSBuZXh0IGlkZWEgeW91IG1pZ2h0IGhhdmUgaXMgdG8gc2V0IHRoZSBmbGFncyB0byAwLiBIb3dldmVyLCBldmVudHMKKyAgICogYWx3YXlzIHRyaWdnZXIgb24gRVBPTExFUlIgYW5kIEVQT0xMSFVQLCBldmVuIGlmIGxpYmRidXMgaXNuJ3QgYWN0dWFsbHkKKyAgICogZGVsaXZlcmluZyB0aGVtIHRvIGEgREJ1c1dhdGNoLiBCZWNhdXNlIGVwb2xsIGlzIGxldmVsLXRyaWdnZXJlZCBieQorICAgKiBkZWZhdWx0LCB3ZSdsbCBidXN5LWxvb3Agb24gYW4gdW5oYW5kbGVkIGVycm9yIG9yIGhhbmd1cDsgbm90IGdvb2QuCisgICAqCisgICAqIFNvLCBsZXQncyBzZXQgaXQgdG8gYmUgZWRnZS10cmlnZ2VyZWQ6IHRoZW4gdGhlIHdvcnN0IGNhc2UgaXMgdGhhdAorICAgKiB3ZSByZXR1cm4gZnJvbSBwb2xsIGltbWVkaWF0ZWx5IG9uIG9uZSBpdGVyYXRpb24sIGlnbm9yZSBpdCBiZWNhdXNlIG5vCisgICAqIHdhdGNoIGlzIGVuYWJsZWQsIHRoZW4gZ28gYmFjayB0byBub3JtYWwuIFdoZW4gd2UgcmUtZW5hYmxlIGEgd2F0Y2gKKyAgICogd2UnbGwgc3dpdGNoIGJhY2sgdG8gbGV2ZWwtdHJpZ2dlcmVkIGFuZCBiZSBub3RpZmllZCBhZ2FpbiAodmVyaWZpZWQgdG8KKyAgICogd29yayBvbiAyLjYuMzIpLiBDb21waWxlIHRoaXMgZmlsZSB3aXRoIC1EVEVTVF9CRUhBVklPVVJfT0ZfRVBPTExFVCBmb3IKKyAgICogdGVzdCBjb2RlLgorICAgKi8KKyAgZXZlbnQuZGF0YS5mZCA9IGZkOworICBldmVudC5ldmVudHMgPSBFUE9MTEVUOworCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmZXZlbnQpID09IDApCisgICAgcmV0dXJuOworCisgIGVyciA9IGVycm5vOworICBfZGJ1c193YXJuICgiRXJyb3Igd2hlbiB0cnlpbmcgdG8gd2F0Y2ggZmQgJWQ6ICVzXG4iLCBmZCwKKyAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9yZW1vdmUgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgIGZkKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisgIGludCBlcnI7CisgIC8qIEtlcm5lbHMgPCAyLjYuOSByZXF1aXJlIGEgbm9uLU5VTEwgc3RydWN0IHBvaW50ZXIsIGV2ZW4gdGhvdWdoIGl0cworICAgKiBjb250ZW50cyBhcmUgaWdub3JlZCAqLworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZHVtbXkgPSB7IDAgfTsKKworICBpZiAoZXBvbGxfY3RsIChzZWxmLT5lcGZkLCBFUE9MTF9DVExfREVMLCBmZCwgJmR1bW15KSA9PSAwKQorICAgIHJldHVybjsKKworICBlcnIgPSBlcnJubzsKKyAgX2RidXNfd2FybiAoIkVycm9yIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSBmZCAlZDogJXNcbiIsIGZkLCBzdHJlcnJvciAoZXJyKSk7Cit9CisKKy8qIE9wdGltYWxseSwgdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gREJ1c0xvb3A6IHdlIHVzZSBpdCB0byB0cmFuc2xhdGUKKyAqIGJldHdlZW4gc3RydWN0IGVwb2xsX2V2ZW50IGFuZCBEQnVzU29ja2V0RXZlbnQgd2l0aG91dCBhbGxvY2F0aW5nIGhlYXAKKyAqIG1lbW9yeS4gKi8KKyNkZWZpbmUgTl9TVEFDS19ERVNDUklQVE9SUyA2NAorCitzdGF0aWMgaW50Citzb2NrZXRfc2V0X2Vwb2xsX3BvbGwgKERCdXNTb2NrZXRTZXQgICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0RXZlbnQgKnJldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbWF4X2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0aW1lb3V0X21zKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudHNbTl9TVEFDS19ERVNDUklQVE9SU107CisgIGludCBuX3JlYWR5OworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKG1heF9ldmVudHMgPiAwKTsKKworICBuX3JlYWR5ID0gZXBvbGxfd2FpdCAoc2VsZi0+ZXBmZCwgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTUlOIChfREJVU19OX0VMRU1FTlRTIChldmVudHMpLCBtYXhfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbXMpOworCisgIGlmIChuX3JlYWR5IDw9IDApCisgICAgcmV0dXJuIG5fcmVhZHk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fcmVhZHk7IGkrKykKKyAgICB7CisgICAgICByZXZlbnRzW2ldLmZkID0gZXZlbnRzW2ldLmRhdGEuZmQ7CisgICAgICByZXZlbnRzW2ldLmZsYWdzID0gZXBvbGxfZXZlbnRzX3RvX3dhdGNoX2ZsYWdzIChldmVudHNbaV0uZXZlbnRzKTsKKyAgICB9CisKKyAgcmV0dXJuIG5fcmVhZHk7Cit9CisKK0RCdXNTb2NrZXRTZXRDbGFzcyBfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX2NsYXNzID0geworICAgIHNvY2tldF9zZXRfZXBvbGxfZnJlZSwKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX2FkZCwKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX3JlbW92ZSwKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX2VuYWJsZSwKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX2Rpc2FibGUsCisgICAgc29ja2V0X3NldF9lcG9sbF9wb2xsCit9OworCisjaWZkZWYgVEVTVF9CRUhBVklPVVJfT0ZfRVBPTExFVAorLyogdXNhZ2U6IGNhdCAvZGV2L251bGwgfCAuL2Vwb2xsCisgKgorICogZGVzaXJlZCBvdXRwdXQ6CisgKiBjdGwgQUREOiAwCisgKiB3YWl0IGZvciBIVVAsIGVkZ2UtdHJpZ2dlcmVkOiAxCisgKiB3YWl0IGZvciBIVVAgYWdhaW46IDAKKyAqIGN0bCBNT0Q6IDAKKyAqIHdhaXQgZm9yIEhVUDogMQorICovCisKKyNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGlucHV0OworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgb3V0cHV0OworICBpbnQgZXBmZCA9IGVwb2xsX2NyZWF0ZTEgKEVQT0xMX0NMT0VYRUMpOworICBpbnQgZmQgPSAwOyAvKiBzdGRpbiAqLworICBpbnQgcmV0OworCisgIGlucHV0LmV2ZW50cyA9IEVQT0xMSFVQIHwgRVBPTExFVDsKKyAgcmV0ID0gZXBvbGxfY3RsIChlcGZkLCBFUE9MTF9DVExfQURELCBmZCwgJmlucHV0KTsKKyAgcHJpbnRmICgiY3RsIEFERDogJWRcbiIsIHJldCk7CisKKyAgcmV0ID0gZXBvbGxfd2FpdCAoZXBmZCwgJm91dHB1dCwgMSwgLTEpOworICBwcmludGYgKCJ3YWl0IGZvciBIVVAsIGVkZ2UtdHJpZ2dlcmVkOiAlZFxuIiwgcmV0KTsKKworICByZXQgPSBlcG9sbF93YWl0IChlcGZkLCAmb3V0cHV0LCAxLCAxKTsKKyAgcHJpbnRmICgid2FpdCBmb3IgSFVQIGFnYWluOiAlZFxuIiwgcmV0KTsKKworICBpbnB1dC5ldmVudHMgPSBFUE9MTEhVUDsKKyAgcmV0ID0gZXBvbGxfY3RsIChlcGZkLCBFUE9MTF9DVExfTU9ELCBmZCwgJmlucHV0KTsKKyAgcHJpbnRmICgiY3RsIE1PRDogJWRcbiIsIHJldCk7CisKKyAgcmV0ID0gZXBvbGxfd2FpdCAoZXBmZCwgJm91dHB1dCwgMSwgLTEpOworICBwcmludGYgKCJ3YWl0IGZvciBIVVA6ICVkXG4iLCByZXQpOworCisgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVEVTVF9CRUhBVklPVVJfT0ZfRVBPTExFVCAqLworCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNvY2tldC1zZXQtcG9sbC5jIGIvZGJ1cy9kYnVzLXNvY2tldC1zZXQtcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2UyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc29ja2V0LXNldC1wb2xsLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYyAtIGEgc29ja2V0IHNldCBpbXBsZW1lbnRlZCB2aWEgX2RidXNfcG9sbAorICoKKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc29ja2V0LXNldC5oIgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNTb2NrZXRTZXQgICAgICBwYXJlbnQ7CisgICAgREJ1c1BvbGxGRCAgICAgICAgKmZkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgbl9mZHM7CisgICAgaW50ICAgICAgICAgICAgICAgIG5fcmVzZXJ2ZWQ7CisgICAgaW50ICAgICAgICAgICAgICAgIG5fYWxsb2NhdGVkOworfSBEQnVzU29ja2V0U2V0UG9sbDsKKworI2RlZmluZSBSRUFMTE9DX0lOQ1JFTUVOVCA4CisjZGVmaW5lIE1JTklNVU1fU0laRSA4CisKKy8qIElmIHdlJ3JlIGluIHRoZSByZWdyZXNzaW9uIHRlc3RzLCBmb3JjZSByZWFsbG9jYXRpb24gdG8gaGFwcGVuIHNvb25lciAqLworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjZGVmaW5lIERFRkFVTFRfU0laRV9ISU5UIDEKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfU0laRV9ISU5UIE1JTklNVU1fU0laRQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgREJ1c1NvY2tldFNldFBvbGwgKgorc29ja2V0X3NldF9wb2xsX2Nhc3QgKERCdXNTb2NrZXRTZXQgKnNldCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXQtPmNscyA9PSAmX2RidXNfc29ja2V0X3NldF9wb2xsX2NsYXNzKTsKKyAgcmV0dXJuIChEQnVzU29ja2V0U2V0UG9sbCAqKSBzZXQ7Cit9CisKKy8qIHRoaXMgaXMgc2FmZSB0byBjYWxsIG9uIGEgcGFydGlhbGx5LWFsbG9jYXRlZCBzb2NrZXQgc2V0ICovCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9wb2xsX2ZyZWUgKERCdXNTb2NrZXRTZXQgKnNldCkKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKworICBkYnVzX2ZyZWUgKHNlbGYtPmZkcyk7CisgIGRidXNfZnJlZSAoc2VsZik7CisgIF9kYnVzX3ZlcmJvc2UgKCJmcmVlZCBzb2NrZXQgc2V0ICVwXG4iLCBzZWxmKTsKK30KKworREJ1c1NvY2tldFNldCAqCitfZGJ1c19zb2NrZXRfc2V0X3BvbGxfbmV3IChpbnQgc2l6ZV9oaW50KQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqcmV0OworCisgIGlmIChzaXplX2hpbnQgPD0gMCkKKyAgICBzaXplX2hpbnQgPSBERUZBVUxUX1NJWkVfSElOVDsKKworICByZXQgPSBkYnVzX25ldzAgKERCdXNTb2NrZXRTZXRQb2xsLCAxKTsKKworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0LT5wYXJlbnQuY2xzID0gJl9kYnVzX3NvY2tldF9zZXRfcG9sbF9jbGFzczsKKyAgcmV0LT5uX2ZkcyA9IDA7CisgIHJldC0+bl9hbGxvY2F0ZWQgPSBzaXplX2hpbnQ7CisKKyAgcmV0LT5mZHMgPSBkYnVzX25ldzAgKERCdXNQb2xsRkQsIHNpemVfaGludCk7CisKKyAgaWYgKHJldC0+ZmRzID09IE5VTEwpCisgICAgeworICAgICAgLyogc29ja2V0X3NldF9wb2xsX2ZyZWUgc3BlY2lmaWNhbGx5IHN1cHBvcnRzIGhhbGYtY29uc3RydWN0ZWQKKyAgICAgICAqIHNvY2tldCBzZXRzICovCisgICAgICBzb2NrZXRfc2V0X3BvbGxfZnJlZSAoKERCdXNTb2NrZXRTZXQgKikgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgibmV3IHNvY2tldCBzZXQgYXQgJXBcbiIsIHJldCk7CisgIHJldHVybiAoREJ1c1NvY2tldFNldCAqKSByZXQ7Cit9CisKK3N0YXRpYyBzaG9ydAord2F0Y2hfZmxhZ3NfdG9fcG9sbF9ldmVudHMgKHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgc2hvcnQgZXZlbnRzID0gMDsKKworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIGV2ZW50cyB8PSBfREJVU19QT0xMSU47CisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpCisgICAgZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisKKyAgcmV0dXJuIGV2ZW50czsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfc2V0X3BvbGxfYWRkIChEQnVzU29ja2V0U2V0ICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGVuYWJsZWQpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpzZWxmID0gc29ja2V0X3NldF9wb2xsX2Nhc3QgKHNldCk7CisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgX2RidXNfYXNzZXJ0ICghX2RidXNfcG9sbGFibGVfZXF1YWxzIChzZWxmLT5mZHNbaV0uZmQsIGZkKSk7CisjZW5kaWYKKworICBpZiAoc2VsZi0+bl9yZXNlcnZlZCA+PSBzZWxmLT5uX2FsbG9jYXRlZCkKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpuZXdfZmRzID0gZGJ1c19yZWFsbG9jIChzZWxmLT5mZHMsCisgICAgICAgICAgc2l6ZW9mIChEQnVzUG9sbEZEKSAqIChzZWxmLT5uX2FsbG9jYXRlZCArIFJFQUxMT0NfSU5DUkVNRU5UKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbmZsYXRpbmcgc2V0ICVwIGZyb20gJWQgZW4vJWQgcmVzLyVkIGFsbG9jIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi0+bl9mZHMsIHNlbGYtPm5fcmVzZXJ2ZWQsIHNlbGYtPm5fYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bl9hbGxvY2F0ZWQgKyBSRUFMTE9DX0lOQ1JFTUVOVCk7CisKKyAgICAgIGlmIChuZXdfZmRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgc2VsZi0+ZmRzID0gbmV3X2ZkczsKKyAgICAgIHNlbGYtPm5fYWxsb2NhdGVkICs9IFJFQUxMT0NfSU5DUkVNRU5UOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiYmVmb3JlIGFkZGluZyBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIHRvICVwLCAlZCBlbi8lZCByZXMvJWQgYWxsb2NcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAoZmQpLCBzZWxmLCBzZWxmLT5uX2Zkcywgc2VsZi0+bl9yZXNlcnZlZCwgc2VsZi0+bl9hbGxvY2F0ZWQpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fcmVzZXJ2ZWQgPj0gc2VsZi0+bl9mZHMpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fYWxsb2NhdGVkID4gc2VsZi0+bl9yZXNlcnZlZCk7CisKKyAgc2VsZi0+bl9yZXNlcnZlZCsrOworCisgIGlmIChlbmFibGVkKQorICAgIHsKKyAgICAgIHNlbGYtPmZkc1tzZWxmLT5uX2Zkc10uZmQgPSBmZDsKKyAgICAgIHNlbGYtPmZkc1tzZWxmLT5uX2Zkc10uZXZlbnRzID0gd2F0Y2hfZmxhZ3NfdG9fcG9sbF9ldmVudHMgKGZsYWdzKTsKKyAgICAgIHNlbGYtPm5fZmRzKys7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9wb2xsX2VuYWJsZSAoREJ1c1NvY2tldFNldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKF9kYnVzX3BvbGxhYmxlX2VxdWFscyAoc2VsZi0+ZmRzW2ldLmZkLCBmZCkpCisgICAgICAgIHsKKyAgICAgICAgICBzZWxmLT5mZHNbaV0uZXZlbnRzID0gd2F0Y2hfZmxhZ3NfdG9fcG9sbF9ldmVudHMgKGZsYWdzKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogd2UgYWxsb2NhdGVkIHNwYWNlIHdoZW4gdGhlIHNvY2tldCB3YXMgYWRkZWQgKi8KKyAgX2RidXNfYXNzZXJ0IChzZWxmLT5uX2ZkcyA8IHNlbGYtPm5fcmVzZXJ2ZWQpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fcmVzZXJ2ZWQgPD0gc2VsZi0+bl9hbGxvY2F0ZWQpOworCisgIHNlbGYtPmZkc1tzZWxmLT5uX2Zkc10uZmQgPSBmZDsKKyAgc2VsZi0+ZmRzW3NlbGYtPm5fZmRzXS5ldmVudHMgPSB3YXRjaF9mbGFnc190b19wb2xsX2V2ZW50cyAoZmxhZ3MpOworICBzZWxmLT5uX2ZkcysrOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9wb2xsX2Rpc2FibGUgKERCdXNTb2NrZXRTZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCkKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKF9kYnVzX3BvbGxhYmxlX2VxdWFscyAoc2VsZi0+ZmRzW2ldLmZkLCBmZCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSAhPSBzZWxmLT5uX2ZkcyAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlbGYtPmZkc1tpXS5mZCA9IHNlbGYtPmZkc1tzZWxmLT5uX2ZkcyAtIDFdLmZkOworICAgICAgICAgICAgICBzZWxmLT5mZHNbaV0uZXZlbnRzID0gc2VsZi0+ZmRzW3NlbGYtPm5fZmRzIC0gMV0uZXZlbnRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc2VsZi0+bl9mZHMtLTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X3BvbGxfcmVtb3ZlIChEQnVzU29ja2V0U2V0ICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCkKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKworICBzb2NrZXRfc2V0X3BvbGxfZGlzYWJsZSAoc2V0LCBmZCk7CisgIHNlbGYtPm5fcmVzZXJ2ZWQtLTsKKworICBfZGJ1c192ZXJib3NlICgiYWZ0ZXIgcmVtb3ZpbmcgZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiBmcm9tICVwLCAlZCBlbi8lZCByZXMvJWQgYWxsb2NcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAoZmQpLCBzZWxmLCBzZWxmLT5uX2Zkcywgc2VsZi0+bl9yZXNlcnZlZCwgc2VsZi0+bl9hbGxvY2F0ZWQpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fZmRzIDw9IHNlbGYtPm5fcmVzZXJ2ZWQpOworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fcmVzZXJ2ZWQgPD0gc2VsZi0+bl9hbGxvY2F0ZWQpOworCisgIGlmIChzZWxmLT5uX3Jlc2VydmVkICsgTUlOSU1VTV9TSVpFIDwgc2VsZi0+bl9hbGxvY2F0ZWQgLyAyKQorICAgIHsKKyAgICAgIC8qIE91ciBhcnJheSBpcyB0d2ljZSBhcyBiaWcgYXMgaXQgbmVlZHMgdG8gYmUgLSBkZWZsYXRlIGl0IHVudGlsIGl0J3MKKyAgICAgICAqIG9ubHkgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciByZXNlcnZlZC4gKi8KKyAgICAgIERCdXNQb2xsRkQgKm5ld19mZHMgPSBkYnVzX3JlYWxsb2MgKHNlbGYtPmZkcywKKyAgICAgICAgICBzaXplb2YgKERCdXNQb2xsRkQpICogKHNlbGYtPm5fcmVzZXJ2ZWQgKyBNSU5JTVVNX1NJWkUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImJlZm9yZSBkZWZsYXRpbmcgJXAsICVkIGVuLyVkIHJlcy8lZCBhbGxvY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYsIHNlbGYtPm5fZmRzLCBzZWxmLT5uX3Jlc2VydmVkLCBzZWxmLT5uX2FsbG9jYXRlZCk7CisKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X2ZkcyA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlaXJkLiBPaCB3ZWxsLCBuZXZlciBtaW5kLCB0aGUgdG9vLWJpZyBhcnJheSBpcyB1bnRvdWNoZWQgKi8KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgc2VsZi0+ZmRzID0gbmV3X2ZkczsKKyAgICAgIHNlbGYtPm5fYWxsb2NhdGVkID0gc2VsZi0+bl9yZXNlcnZlZDsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3dhdGNoX2ZsYWdzX2Zyb21fcG9sbF9yZXZlbnRzIChzaG9ydCByZXZlbnRzKQoreworICB1bnNpZ25lZCBpbnQgY29uZGl0aW9uID0gMDsKKworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9SRUFEQUJMRTsKKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgIGNvbmRpdGlvbiB8PSBEQlVTX1dBVENIX1dSSVRBQkxFOworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExIVVApCisgICAgY29uZGl0aW9uIHw9IERCVVNfV0FUQ0hfSEFOR1VQOworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExFUlIpCisgICAgY29uZGl0aW9uIHw9IERCVVNfV0FUQ0hfRVJST1I7CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChyZXZlbnRzICYgX0RCVVNfUE9MTE5WQUwpKQorICAgIGNvbmRpdGlvbiB8PSBfREJVU19XQVRDSF9OVkFMOworCisgIHJldHVybiBjb25kaXRpb247Cit9CisKKy8qKiBUaGlzIGlzIGJhc2ljYWxseSBMaW51eCdzIGVwb2xsX3dhaXQoMikgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgcG9sbCgyKTsKKyAqIGl0IHJldHVybnMgcmVzdWx0cyBpbnRvIGEgY2FsbGVyLXN1cHBsaWVkIGJ1ZmZlciBzbyB3ZSBjYW4gYmUgcmVlbnRyYW50LiAqLworc3RhdGljIGludAorc29ja2V0X3NldF9wb2xsX3BvbGwgKERCdXNTb2NrZXRTZXQgICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXRFdmVudCAqcmV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG1heF9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0aW1lb3V0X21zKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworICBpbnQgaTsKKyAgaW50IG5fZXZlbnRzOworICBpbnQgbl9yZWFkeTsKKworICBfZGJ1c19hc3NlcnQgKG1heF9ldmVudHMgPiAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bl9mZHM7IGkrKykKKyAgICBzZWxmLT5mZHNbaV0ucmV2ZW50cyA9IDA7CisKKyAgbl9yZWFkeSA9IF9kYnVzX3BvbGwgKHNlbGYtPmZkcywgc2VsZi0+bl9mZHMsIHRpbWVvdXRfbXMpOworCisgIGlmIChuX3JlYWR5IDw9IDApCisgICAgcmV0dXJuIG5fcmVhZHk7CisKKyAgbl9ldmVudHMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5uX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzZWxmLT5mZHNbaV0ucmV2ZW50cyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV2ZW50c1tuX2V2ZW50c10uZmQgPSBzZWxmLT5mZHNbaV0uZmQ7CisgICAgICAgICAgcmV2ZW50c1tuX2V2ZW50c10uZmxhZ3MgPSB3YXRjaF9mbGFnc19mcm9tX3BvbGxfcmV2ZW50cyAoc2VsZi0+ZmRzW2ldLnJldmVudHMpOworCisgICAgICAgICAgbl9ldmVudHMgKz0gMTsKKworICAgICAgICAgIC8qIFdlIGlnbm9yZSBldmVudHMgYmV5b25kIG1heF9ldmVudHMgYmVjYXVzZSB3ZSBoYXZlIG5vd2hlcmUgdG8KKyAgICAgICAgICAgKiBwdXQgdGhlbS4gX2RidXNfcG9sbCBpcyBsZXZlbC10cmlnZ2VyZWQsIHNvIHdlJ2xsIGp1c3QgYmUgdG9sZAorICAgICAgICAgICAqIGFib3V0IHRoZW0gbmV4dCB0aW1lIHJvdW5kIHRoZSBtYWluIGxvb3AgYW55d2F5LiAqLworICAgICAgICAgIGlmIChuX2V2ZW50cyA9PSBtYXhfZXZlbnRzKQorICAgICAgICAgICAgcmV0dXJuIG5fZXZlbnRzOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBuX2V2ZW50czsKK30KKworREJ1c1NvY2tldFNldENsYXNzIF9kYnVzX3NvY2tldF9zZXRfcG9sbF9jbGFzcyA9IHsKKyAgICBzb2NrZXRfc2V0X3BvbGxfZnJlZSwKKyAgICBzb2NrZXRfc2V0X3BvbGxfYWRkLAorICAgIHNvY2tldF9zZXRfcG9sbF9yZW1vdmUsCisgICAgc29ja2V0X3NldF9wb2xsX2VuYWJsZSwKKyAgICBzb2NrZXRfc2V0X3BvbGxfZGlzYWJsZSwKKyAgICBzb2NrZXRfc2V0X3BvbGxfcG9sbAorfTsKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zb2NrZXQtc2V0LmMgYi9kYnVzL2RidXMtc29ja2V0LXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGQ2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc29ja2V0LXNldC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyoKKyAqIGRidXMtc29ja2V0LXNldC5jIC0gdXNlZCB0byBib2x0IGZpbGUgZGVzY3JpcHRvcnMgb250byBhIGJ1cworICoKKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zb2NrZXQtc2V0Lmg+CisKK0RCdXNTb2NrZXRTZXQgKgorX2RidXNfc29ja2V0X3NldF9uZXcgKGludCBzaXplX2hpbnQpCit7CisgIERCdXNTb2NrZXRTZXQgKnJldDsKKworI2lmZGVmIERCVVNfSEFWRV9MSU5VWF9FUE9MTAorICByZXQgPSBfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX25ldyAoKTsKKworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKyNlbmRpZgorCisgIHJldCA9IF9kYnVzX3NvY2tldF9zZXRfcG9sbF9uZXcgKHNpemVfaGludCk7CisKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHJldHVybiByZXQ7CisKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc29ja2V0LXNldC5oIGIvZGJ1cy9kYnVzLXNvY2tldC1zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2MyNjNhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNvY2tldC1zZXQuaApAQCAtMCwwICsxLDEyMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKgorICogZGJ1cy1zb2NrZXQtc2V0LmggLSB1c2VkIHRvIGJvbHQgZmlsZSBkZXNjcmlwdG9ycyBvbnRvIGEgYnVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU09DS0VUX1NFVF9ICisjZGVmaW5lIERCVVNfU09DS0VUX1NFVF9ICisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c1BvbGxhYmxlIGZkOworICAgIHVuc2lnbmVkIGludCBmbGFnczsKK30gREJ1c1NvY2tldEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBEQnVzU29ja2V0U2V0IERCdXNTb2NrZXRTZXQ7CisKK3R5cGVkZWYgc3RydWN0IERCdXNTb2NrZXRTZXRDbGFzcyBEQnVzU29ja2V0U2V0Q2xhc3M7CitzdHJ1Y3QgREJ1c1NvY2tldFNldENsYXNzIHsKKyAgICB2b2lkICAgICAgICAgICAgKCpmcmVlKSAgICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZik7CisgICAgZGJ1c19ib29sX3QgICAgICgqYWRkKSAgICAgIChEQnVzU29ja2V0U2V0ICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisgICAgdm9pZCAgICAgICAgICAgICgqcmVtb3ZlKSAgIChEQnVzU29ja2V0U2V0ICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgIGZkKTsKKyAgICB2b2lkICAgICAgICAgICAgKCplbmFibGUpICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGZsYWdzKTsKKyAgICB2b2lkICAgICAgICAgICAgKCpkaXNhYmxlKSAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgICAgZmQpOworICAgIGludCAgICAgICAgICAgICAoKnBvbGwpICAgICAoREJ1c1NvY2tldFNldCAgICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICpyZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBtYXhfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0aW1lb3V0X21zKTsKK307CisKK3N0cnVjdCBEQnVzU29ja2V0U2V0IHsKKyAgICBEQnVzU29ja2V0U2V0Q2xhc3MgKmNsczsKK307CisKK0RCdXNTb2NrZXRTZXQgKl9kYnVzX3NvY2tldF9zZXRfbmV3ICAgICAgICAgICAoaW50ICAgICAgICAgICAgICAgc2l6ZV9oaW50KTsKKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2ZyZWUgKERCdXNTb2NrZXRTZXQgKnNlbGYpCit7CisgIChzZWxmLT5jbHMtPmZyZWUpIChzZWxmKTsKK30KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X3NldF9hZGQgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZW5hYmxlZCkKK3sKKyAgcmV0dXJuIChzZWxmLT5jbHMtPmFkZCkgKHNlbGYsIGZkLCBmbGFncywgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfc29ja2V0X3NldF9yZW1vdmUgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgZmQpCit7CisgIChzZWxmLT5jbHMtPnJlbW92ZSkgKHNlbGYsIGZkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2VuYWJsZSAoREJ1c1NvY2tldFNldCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgKHNlbGYtPmNscy0+ZW5hYmxlKSAoc2VsZiwgZmQsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X2Rpc2FibGUgKERCdXNTb2NrZXRTZXQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkKQoreworICAoc2VsZi0+Y2xzLT5kaXNhYmxlKSAoc2VsZiwgZmQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CitfZGJ1c19zb2NrZXRfc2V0X3BvbGwgKERCdXNTb2NrZXRTZXQgICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXRFdmVudCAgKnJldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1heF9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHRpbWVvdXRfbXMpCit7CisgIHJldHVybiAoc2VsZi0+Y2xzLT5wb2xsKSAoc2VsZiwgcmV2ZW50cywgbWF4X2V2ZW50cywgdGltZW91dF9tcyk7Cit9CisKKy8qIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucywgbm90IG5lY2Vzc2FyaWx5IGJ1aWx0IG9uIGFsbCBwbGF0Zm9ybXMgKi8KKworZXh0ZXJuIERCdXNTb2NrZXRTZXRDbGFzcyBfZGJ1c19zb2NrZXRfc2V0X3BvbGxfY2xhc3M7CitleHRlcm4gREJ1c1NvY2tldFNldENsYXNzIF9kYnVzX3NvY2tldF9zZXRfZXBvbGxfY2xhc3M7CisKK0RCdXNTb2NrZXRTZXQgKl9kYnVzX3NvY2tldF9zZXRfcG9sbF9uZXcgIChpbnQgIHNpemVfaGludCk7CitEQnVzU29ja2V0U2V0ICpfZGJ1c19zb2NrZXRfc2V0X2Vwb2xsX25ldyAodm9pZCk7CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisjZW5kaWYgLyogbXVsdGlwbGUtaW5jbHVzaW9uIGd1YXJkICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc29ja2V0cy13aW4uaCBiL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWQ2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc29ja2V0cy13aW4uaApAQCAtMCwwICsxLDUzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc29ja2V0cy5oIFdyYXBwZXJzIGFyb3VuZCBzb2NrZXQgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TT0NLRVRTX0gKKyNkZWZpbmUgREJVU19TT0NLRVRTX0gKKworI2lmIGRlZmluZWQoREJVU19XSU4pIHx8IGRlZmluZWQoREJVU19XSU5DRSkKKworCisKKyNpZm5kZWYgU1RSSUNUCisjZGVmaW5lIFNUUklDVAorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjdW5kZWYgU1RSSUNUCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisjdW5kZWYgaW50ZXJmYWNlCisKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNkZWZpbmUgREJVU19TT0NLRVRfQVBJX1JFVFVSTlNfRVJST1IobikgKChuKSA9PSBTT0NLRVRfRVJST1IpCisjZGVmaW5lIERCVVNfU09DS0VUX1NFVF9FUlJOTygpIChfZGJ1c193aW5fc2V0X2Vycm5vIChXU0FHZXRMYXN0RXJyb3IoKSkpCisKKyNlbHNlCisKKyNlcnJvciAiZGJ1cy1zb2NrZXRzLXdpbi5oIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgb24gbm9uLVdpbmRvd3MiCisKKyNlbmRpZiAvKiAhV2luMzIgKi8KKworI2VuZGlmIC8qIERCVVNfU09DS0VUU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3Bhd24td2luLmMgYi9kYnVzL2RidXMtc3Bhd24td2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0MWY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zcGF3bi13aW4uYwpAQCAtMCwwICsxLDEwNzMgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLy8jZGVmaW5lIFNQQVdOX0RFQlVHCisKKyNpZiAhZGVmaW5lZChTUEFXTl9ERUJVRykgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUElORygpCisjZWxzZQorI2RlZmluZSBQSU5HKCkgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWRcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgZmZsdXNoIChzdGRlcnIpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi13aW4zMi5jIFdyYXBwZXIgYXJvdW5kIGdfc3Bhd24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlICJkYnVzLXNwYXduLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyNkZWZpbmUgU1RSSUNUCisvLyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyN1bmRlZiBTVFJJQ1QKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI3VuZGVmIGludGVyZmFjZQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisvKioKKyAqIEJhYnlzaXR0ZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscworICovCitzdHJ1Y3QgREJ1c0JhYnlzaXR0ZXIKKyAgeworICAgIERCdXNBdG9taWMgcmVmY291bnQ7CisKKyAgICBIQU5ETEUgc3RhcnRfc3luY19ldmVudDsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisgICAgSEFORExFIGVuZF9zeW5jX2V2ZW50OworI2VuZGlmCisKKyAgICBjaGFyICpsb2dfbmFtZTsKKyAgICBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyBjaGlsZF9zZXR1cDsKKyAgICB2b2lkICp1c2VyX2RhdGE7CisKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICoqYXJndjsKKyAgICBjaGFyICoqZW52cDsKKworICAgIEhBTkRMRSBjaGlsZF9oYW5kbGU7CisgICAgREJ1c1NvY2tldCBzb2NrZXRfdG9fYmFieXNpdHRlcjsJLyogQ29ubmVjdGlvbiB0byB0aGUgYmFieXNpdHRlciB0aHJlYWQgKi8KKyAgICBEQnVzU29ja2V0IHNvY2tldF90b19tYWluOworCisgICAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsKKyAgICBEQnVzV2F0Y2ggKnNpdHRlcl93YXRjaDsKKyAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyBmaW5pc2hlZF9jYjsKKyAgICB2b2lkICpmaW5pc2hlZF9kYXRhOworCisgICAgZGJ1c19ib29sX3QgaGF2ZV9zcGF3bl9lcnJubzsKKyAgICBpbnQgc3Bhd25fZXJybm87CisgICAgZGJ1c19ib29sX3QgaGF2ZV9jaGlsZF9zdGF0dXM7CisgICAgaW50IGNoaWxkX3N0YXR1czsKKyAgfTsKKworc3RhdGljIHZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfdHJhY2VfcmVmIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgIGludCBvbGRfcmVmY291bnQsCisgICAgaW50IG5ld19yZWZjb3VudCwKKyAgICBjb25zdCBjaGFyICp3aHkpCit7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIF9kYnVzX3RyYWNlX3JlZiAoIkRCdXNCYWJ5c2l0dGVyIiwgc2l0dGVyLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5LAorICAgICAgIkRCVVNfQkFCWVNJVFRFUl9UUkFDRSIsICZlbmFibGVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgREJ1c0JhYnlzaXR0ZXIqCitfZGJ1c19iYWJ5c2l0dGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBzaXR0ZXIgPSBkYnVzX25ldzAgKERCdXNCYWJ5c2l0dGVyLCAxKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZzaXR0ZXItPnJlZmNvdW50KTsKKworICBfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoc2l0dGVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCsxLCBfX0ZVTkNUSU9OX18pOworCisgIHNpdHRlci0+c3RhcnRfc3luY19ldmVudCA9IENyZWF0ZUV2ZW50IChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBpZiAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworCisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSBzaXR0ZXItPnNvY2tldF90b19tYWluID0gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworCisgIHNpdHRlci0+YXJnYyA9IDA7CisgIHNpdHRlci0+YXJndiA9IE5VTEw7CisgIHNpdHRlci0+ZW52cCA9IE5VTEw7CisKKyAgc2l0dGVyLT53YXRjaGVzID0gX2RidXNfd2F0Y2hfbGlzdF9uZXcgKCk7CisgIGlmIChzaXR0ZXItPndhdGNoZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHNpdHRlci0+aGF2ZV9zcGF3bl9lcnJubyA9IEZBTFNFOworICBzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzID0gRkFMU0U7CisKKyAgcmV0dXJuIHNpdHRlcjsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHJldHVybnMgdGhlIGJhYnlzaXR0ZXIKKyAqLworREJ1c0JhYnlzaXR0ZXIgKgorX2RidXNfYmFieXNpdHRlcl9yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisgIFBJTkcoKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2luYyAoJnNpdHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoc2l0dGVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCsxLCBfX0ZVTkNUSU9OX18pOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgYmFieXNpdHRlclxuIik7CisKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCk7CisgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuc29jayAhPSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorfQorCisvKioKKyAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIGludCBpOworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIFBJTkcoKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJnNpdHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoc2l0dGVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudC0xLCBfX0ZVTkNUSU9OX18pOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKworICAgICAgaWYgKHNpdHRlci0+c29ja2V0X3RvX21haW4uc29jayAhPSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiwgTlVMTCk7CisgICAgICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fbWFpbi5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKworICAgICAgUElORygpOworICAgICAgaWYgKHNpdHRlci0+YXJndiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpdHRlci0+YXJnYzsgaSsrKQorICAgICAgICAgICAgaWYgKHNpdHRlci0+YXJndltpXSAhPSBOVUxMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHNpdHRlci0+YXJndltpXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+YXJndik7CisgICAgICAgICAgc2l0dGVyLT5hcmd2ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5lbnZwICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICoqZSA9IHNpdHRlci0+ZW52cDsKKworICAgICAgICAgIHdoaWxlICgqZSkKKyAgICAgICAgICAgIGRidXNfZnJlZSAoKmUrKyk7CisgICAgICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmVudnApOworICAgICAgICAgIHNpdHRlci0+ZW52cCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5jaGlsZF9oYW5kbGUpOworICAgICAgICAgIHNpdHRlci0+Y2hpbGRfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgICAgICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+d2F0Y2hlcykKKyAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzaXR0ZXItPndhdGNoZXMpOworCisgICAgICBpZiAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBQSU5HKCk7CisgICAgICAgICAgQ2xvc2VIYW5kbGUgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCk7CisgICAgICAgICAgc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ID0gTlVMTDsKKyAgICAgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmIChzaXR0ZXItPmVuZF9zeW5jX2V2ZW50ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5lbmRfc3luY19ldmVudCk7CisgICAgICAgICAgc2l0dGVyLT5lbmRfc3luY19ldmVudCA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+bG9nX25hbWUpOworCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlcik7CisgICAgfQorfQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuOyAvKiBjaGlsZCBpcyBhbHJlYWR5IGRlYWQsIG9yIHdlJ3JlIHNvIGhvc2VkIHdlJ2xsIG5ldmVyIHJlY292ZXIgKi8KKworICBQSU5HKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCAxMjM0NSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBQSU5HKCk7CisgIHJldHVybiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gTlVMTCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkLiBXZSBkbyB0aGlzIHNvIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCisgKiBkZXRhaWwgaXMgbm90IGNsdXR0ZXJpbmcgdXAgZGJ1cywgZm9yIGV4YW1wbGUgdGhlIHN5c3RlbSBsYXVuY2hlciBjb2RlLgorICogVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIGkuZS4gY2FsbAorICogX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkKCkuIEl0IHJldHVybnMgRkFMU0UgaWYgdGhlIGNoaWxkCisgKiBkaWQgbm90IHJldHVybiBhIHN0YXR1cyBjb2RlLCBlLmcuIGJlY2F1c2UgdGhlIGNoaWxkIHdhcyBzaWduYWxlZAorICogb3Igd2UgZmFpbGVkIHRvIGV2ZXIgbGF1bmNoIHRoZSBjaGlsZCBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHBhcmFtIHN0YXR1cyB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqc3RhdHVzKQoreworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoc2l0dGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDaGlsZCBoYXMgbm90IGV4aXRlZCIpOworCisgIGlmICghc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyB8fAorICAgICAgc2l0dGVyLT5jaGlsZF9zdGF0dXMgPT0gU1RJTExfQUNUSVZFKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc3RhdHVzID0gc2l0dGVyLT5jaGlsZF9zdGF0dXM7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlICNEQnVzRXJyb3Igd2l0aCBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHNwYXduZWQKKyAqIGNoaWxkIHByb2Nlc3MgZXhpdGVkIChvbiBhIHNpZ25hbCwgb3Igd2hhdGV2ZXIpLiBJZgorICogdGhlIGNoaWxkIHByb2Nlc3MgaGFzIG5vdCBleGl0ZWQsIGRvZXMgbm90aGluZyAoZXJyb3IKKyAqIHdpbGwgcmVtYWluIHVuc2V0KS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gZXJyb3IgYW4gZXJyb3IgdG8gZmlsbCBpbgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBQSU5HKCk7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIHJldHVybjsKKworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8pCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKHNpdHRlci0+c3Bhd25fZXJybm8pOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9ncmFtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgIH0KKyAgZWxzZSBpZiAoc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cykKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgc2l0dGVyLT5jaGlsZF9zdGF0dXMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkLCBzdGF0dXMgdW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSk7CisgICAgfQorICBQSU5HKCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgUElORygpOworICByZXR1cm4gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChzaXR0ZXItPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV93YXRjaCAoREJ1c1dhdGNoICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IGRhdGE7CisKKyAgLyogT24gVW5peCBkYnVzLXNwYXduIHVzZXMgYSBiYWJ5c2l0dGVyICpwcm9jZXNzKiwgdGh1cyBpdCBoYXMgdG8KKyAgICogYWN0dWFsbHkgc2VuZCB0aGUgZXhpdCBzdGF0dXNlcywgZXJyb3IgY29kZXMgYW5kIHdoYXRub3QgdGhyb3VnaAorICAgKiBzb2NrZXRzIGFuZC9vciBwaXBlcy4gT24gV2luMzIsIHRoZSBiYWJ5c2l0dGVyIGlzIGp1cyBhIHRocmVhZCwKKyAgICogc28gaXQgY2FuIHNldCB0aGUgc3RhdHVzIGZpZWxkcyBkaXJlY3RseSBpbiB0aGUgYmFieXNpdHRlciBzdHJ1Y3QKKyAgICoganVzdCBmaW5lLiBUaGUgc29ja2V0IHBpcGUgaXMgdXNlZCBqdXN0IHNvIHdlIGNhbiB3YXRjaCBpdCB3aXRoCisgICAqIHNlbGVjdCgpLCBhcyBzb29uIGFzIGFueXRoaW5nIGlzIHdyaXR0ZW4gdG8gaXQgd2Uga25vdyB0aGF0IHRoZQorICAgKiBiYWJ5c2l0dGVyIHRocmVhZCBoYXMgcmVjb3JkZWQgdGhlIHN0YXR1cyBpbiB0aGUgYmFieXNpdHRlcgorICAgKiBzdHJ1Y3QuCisgICAqLworCisgIFBJTkcoKTsKKyAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgIFBJTkcoKTsKKworICBpZiAoX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpICYmCisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiICE9IE5VTEwpCisgICAgeworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiAoc2l0dGVyLCBzaXR0ZXItPmZpbmlzaGVkX2RhdGEpOworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBwcm90ZWN0X2FyZ3YgbGlmdGVkIGZyb20gR0xpYiwgcmVsaWNlbnNlZCBieSBhdXRob3IsIFRvciBMaWxscXZpc3QgKi8KK3N0YXRpYyBpbnQKK3Byb3RlY3RfYXJndiAoY2hhciAgKiphcmd2LAorICAgICAgICAgICAgICBjaGFyICoqKm5ld19hcmd2KQoreworICBpbnQgaTsKKyAgaW50IGFyZ2MgPSAwOworCisgIHdoaWxlIChhcmd2W2FyZ2NdKQorICAgICsrYXJnYzsKKyAgKm5ld19hcmd2ID0gZGJ1c19tYWxsb2MgKChhcmdjICsgMSkgKiBzaXplb2YgKGNoYXIgKikpOworICBpZiAoKm5ld19hcmd2ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgKCpuZXdfYXJndilbaV0gPSBOVUxMOworCisgIC8qIFF1b3RlIGVhY2ggYXJndiBlbGVtZW50IGlmIG5lY2Vzc2FyeSwgc28gdGhhdCBpdCB3aWxsIGdldAorICAgKiByZWNvbnN0cnVjdGVkIGNvcnJlY3RseSBpbiB0aGUgQyBydW50aW1lIHN0YXJ0dXAgY29kZS4gIE5vdGUgdGhhdAorICAgKiB0aGUgdW5xdW90aW5nIGFsZ29yaXRobSBpbiB0aGUgQyBydW50aW1lIGlzIHJlYWxseSB3ZWlyZCwgYW5kCisgICAqIHJhdGhlciBkaWZmZXJlbnQgdGhhbiB3aGF0IFVuaXggc2hlbGxzIGRvLiBTZWUgc3RkYXJndi5jIGluIHRoZSBDCisgICAqIHJ1bnRpbWUgc291cmNlcyAoaW4gdGhlIFBsYXRmb3JtIFNESywgaW4gc3JjL2NydCkuCisgICAqCisgICAqIE5vdGUgdGhhdCBhbiBuZXdfYXJndlswXSBjb25zdHJ1Y3RlZCBieSB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICAgKiAqbm90KiBiZSBwYXNzZWQgYXMgdGhlIGZpbGVuYW1lIGFyZ3VtZW50IHRvIGEgc3Bhd24qIG9yIGV4ZWMqCisgICAqIGZhbWlseSBmdW5jdGlvbi4gVGhhdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIHJlYWwgZmlsZSBuYW1lCisgICAqIHdpdGhvdXQgYW55IHF1b3RpbmcuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKnAgPSBhcmd2W2ldOworICAgICAgY2hhciAqcTsKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgaW50IG5lZWRfZGJscXVvdGVzID0gRkFMU0U7CisgICAgICB3aGlsZSAoKnApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisgICAgICAgICAgICBuZWVkX2RibHF1b3RlcyA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJyInKQorICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqcHAgPSBwOworICAgICAgICAgICAgICB3aGlsZSAoKnBwICYmICpwcCA9PSAnXFwnKQorICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgIGlmICgqcHAgPT0gJyInKQorICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgfQorICAgICAgICAgIGxlbisrOworICAgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgICBxID0gKCpuZXdfYXJndilbaV0gPSBkYnVzX21hbGxvYyAobGVuICsgbmVlZF9kYmxxdW90ZXMqMiArIDEpOworCisgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKworICAgICAgcCA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChuZWVkX2RibHF1b3RlcykKKyAgICAgICAgKnErKyA9ICciJzsKKworICAgICAgd2hpbGUgKCpwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICciJykKKyAgICAgICAgICAgICpxKysgPSAnXFwnOworICAgICAgICAgIGVsc2UgaWYgKCpwID09ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnBwID0gcDsKKyAgICAgICAgICAgICAgd2hpbGUgKCpwcCAmJiAqcHAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICBwcCsrOworICAgICAgICAgICAgICBpZiAoKnBwID09ICciJykKKyAgICAgICAgICAgICAgICAqcSsrID0gJ1xcJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgIGlmIChuZWVkX2RibHF1b3RlcykKKyAgICAgICAgKnErKyA9ICciJzsKKyAgICAgICpxKysgPSAnXDAnOworICAgICAgLyogcHJpbnRmICgiYXJndlslZF06JXMsIG5lZWRfZGJscXVvdGVzOiVzIGxlbjolZCA9PiAlc1xuIiwgaSwgYXJndltpXSwgbmVlZF9kYmxxdW90ZXM/IlRSVUUiOiJGQUxTRSIsIGxlbiwgKCpuZXdfYXJndilbaV0pOyAqLworICAgIH0KKyAgKCpuZXdfYXJndilbYXJnY10gPSBOVUxMOworCisgIHJldHVybiBhcmdjOworfQorCisKKy8qIEZyb20gR1BHTUUsIHJlbGljZW5zZWQgYnkgZzEwIENvZGUgR21iSC4gICovCitzdGF0aWMgY2hhciAqCitjb21wb3NlX3N0cmluZyAoY2hhciAqKnN0cmluZ3MsIGNoYXIgc2VwYXJhdG9yKQoreworICBpbnQgaTsKKyAgaW50IG4gPSAwOworICBjaGFyICpidWY7CisgIGNoYXIgKnA7CisKKyAgaWYgKCFzdHJpbmdzIHx8ICFzdHJpbmdzWzBdKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspCisgICAgbiArPSBzdHJsZW4gKHN0cmluZ3NbaV0pICsgMTsKKyAgbisrOworCisgIGJ1ZiA9IHAgPSBtYWxsb2MgKG4pOworICBpZiAoIWJ1ZikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpID0gMDsgc3RyaW5nc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIHN0cmNweSAocCwgc3RyaW5nc1tpXSk7CisgICAgICBwICs9IHN0cmxlbiAoc3RyaW5nc1tpXSk7CisgICAgICAqKHArKykgPSBzZXBhcmF0b3I7CisgICAgfQorICBwLS07CisgICoocCsrKSA9ICdcMCc7CisgICpwID0gJ1wwJzsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqCitidWlsZF9jb21tYW5kbGluZSAoY2hhciAqKmFyZ3YpCit7CisgIHJldHVybiBjb21wb3NlX3N0cmluZyAoYXJndiwgJyAnKTsKK30KKworc3RhdGljIGNoYXIgKgorYnVpbGRfZW52X3N0cmluZyAoY2hhcioqIGVudnApCit7CisgIHJldHVybiBjb21wb3NlX3N0cmluZyAoZW52cCwgJ1wwJyk7Cit9CisKK3N0YXRpYyBIQU5ETEUKK3NwYXduX3Byb2dyYW0gKGNoYXIqIG5hbWUsIGNoYXIqKiBhcmd2LCBjaGFyKiogZW52cCkKK3sKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaSA9IHsgTlVMTCwgMCwgMCwgMCB9OworICBTVEFSVFVQSU5GT0Egc2k7CisgIGNoYXIgKmFyZ19zdHJpbmcsICplbnZfc3RyaW5nOworICBCT09MIHJlc3VsdDsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgaWYgKGFyZ3YgJiYgYXJndlswXSkKKyAgICBhcmdfc3RyaW5nID0gYnVpbGRfY29tbWFuZGxpbmUgKGFyZ3YgKyAxKTsKKyAgZWxzZQorICAgIGFyZ19zdHJpbmcgPSBOVUxMOworI2Vsc2UKKyAgYXJnX3N0cmluZyA9IGJ1aWxkX2NvbW1hbmRsaW5lIChhcmd2KTsKKyNlbmRpZgorICBpZiAoIWFyZ19zdHJpbmcpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIGVudl9zdHJpbmcgPSBidWlsZF9lbnZfc3RyaW5nKGVudnApOworCisgIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7CisgIHNpLmNiID0gc2l6ZW9mIChzaSk7CisjaWZkZWYgREJVU19XSU5DRQorICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzQSAobmFtZSwgYXJnX3N0cmluZywgTlVMTCwgTlVMTCwgRkFMU0UsIDAsCisjZWxzZQorICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzQSAoTlVMTCwgYXJnX3N0cmluZywgTlVMTCwgTlVMTCwgRkFMU0UsIDAsCisjZW5kaWYKKwkJCSAgIChMUFZPSUQpZW52X3N0cmluZywgTlVMTCwgJnNpLCAmcGkpOworICBmcmVlIChhcmdfc3RyaW5nKTsKKyAgaWYgKGVudl9zdHJpbmcpCisgICAgZnJlZSAoZW52X3N0cmluZyk7CisKKyAgaWYgKCFyZXN1bHQpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIENsb3NlSGFuZGxlIChwaS5oVGhyZWFkKTsKKyAgcmV0dXJuIHBpLmhQcm9jZXNzOworfQorCisKK3N0YXRpYyBEV09SRCBfX3N0ZGNhbGwKK2JhYnlzaXR0ZXIgKHZvaWQgKnBhcmFtZXRlcikKK3sKKyAgaW50IHJldCA9IDA7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSAoREJ1c0JhYnlzaXR0ZXIgKikgcGFyYW1ldGVyOworICBIQU5ETEUgaGFuZGxlOworCisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+Y2hpbGRfc2V0dXApCisgICAgeworICAgICAgUElORygpOworICAgICAgKCpzaXR0ZXItPmNoaWxkX3NldHVwKSAoc2l0dGVyLT51c2VyX2RhdGEpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiYmFieXNpdHRlcjogc3Bhd25pbmcgJXNcbiIsIHNpdHRlci0+bG9nX25hbWUpOworCisgIFBJTkcoKTsKKyAgaGFuZGxlID0gc3Bhd25fcHJvZ3JhbSAoc2l0dGVyLT5sb2dfbmFtZSwgc2l0dGVyLT5hcmd2LCBzaXR0ZXItPmVudnApOworCisgIFBJTkcoKTsKKyAgaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IGhhbmRsZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgICBzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8gPSBUUlVFOworICAgICAgc2l0dGVyLT5zcGF3bl9lcnJubyA9IEdldExhc3RFcnJvcigpOworICAgIH0KKyAgCisgIFBJTkcoKTsKKyAgU2V0RXZlbnQgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCk7CisKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisgICAgeworICAgICAgRFdPUkQgc3RhdHVzOworCisgICAgICBQSU5HKCk7CisgICAgICAvLyB3YWl0IHVudGlsIHByb2Nlc3MgZmluaXNoZWQKKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCBJTkZJTklURSk7CisKKyAgICAgIFBJTkcoKTsKKyAgICAgIHJldCA9IEdldEV4aXRDb2RlUHJvY2VzcyAoc2l0dGVyLT5jaGlsZF9oYW5kbGUsICZzdGF0dXMpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgIHNpdHRlci0+Y2hpbGRfc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgIHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgIENsb3NlSGFuZGxlIChzaXR0ZXItPmNoaWxkX2hhbmRsZSk7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgU2V0RXZlbnQgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQpOworI2VuZGlmCisKKyAgUElORygpOworICBzZW5kIChzaXR0ZXItPnNvY2tldF90b19tYWluLnNvY2ssICIgIiwgMSwgMCk7CisKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICByZXR1cm4gcmV0ID8gMCA6IDE7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAqKnNpdHRlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICpsb2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICoqZW52cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICAgY2hpbGRfc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIEhBTkRMRSBzaXR0ZXJfdGhyZWFkOworICBEV09SRCBzaXR0ZXJfdGhyZWFkX2lkOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAoYXJndlswXSAhPSBOVUxMKTsKKworICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAqc2l0dGVyX3AgPSBOVUxMOworCisgIFBJTkcoKTsKKyAgc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9uZXcgKCk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHNpdHRlci0+Y2hpbGRfc2V0dXAgPSBjaGlsZF9zZXR1cDsKKyAgc2l0dGVyLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgc2l0dGVyLT5sb2dfbmFtZSA9IF9kYnVzX3N0cmR1cCAobG9nX25hbWUpOworICBpZiAoc2l0dGVyLT5sb2dfbmFtZSA9PSBOVUxMICYmIGxvZ19uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBpZiAoc2l0dGVyLT5sb2dfbmFtZSA9PSBOVUxMKQorICAgIHNpdHRlci0+bG9nX25hbWUgPSBfZGJ1c19zdHJkdXAgKGFyZ3ZbMF0pOworCisgIGlmIChzaXR0ZXItPmxvZ19uYW1lID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBQSU5HKCk7CisgIGlmICghX2RidXNfc29ja2V0cGFpciAoJnNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNpdHRlci0+c29ja2V0X3RvX21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIGVycm9yKSkKKyAgICBnb3RvIG91dDA7CisKKyAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgUElORygpOworICBpZiAoIV9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPnNpdHRlcl93YXRjaCkpCisgICAgeworICAgICAgLyogd2UgbmVlZCB0byBmcmVlIGl0IGVhcmx5IHNvIHRoZSBkZXN0cnVjdG9yIHdvbid0IHRyeSB0byByZW1vdmUgaXQKKyAgICAgICAqIHdpdGhvdXQgaXQgaGF2aW5nIGJlZW4gYWRkZWQsIHdoaWNoIERCdXNMb29wIGRvZXNuJ3QgYWxsb3cgKi8KKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IE5VTEw7CisKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgc2l0dGVyLT5hcmdjID0gcHJvdGVjdF9hcmd2IChhcmd2LCAmc2l0dGVyLT5hcmd2KTsKKyAgaWYgKHNpdHRlci0+YXJnYyA9PSAtMSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorICBzaXR0ZXItPmVudnAgPSBlbnZwOworCisgIFBJTkcoKTsKKyAgc2l0dGVyX3RocmVhZCA9IChIQU5ETEUpIENyZWF0ZVRocmVhZCAoTlVMTCwgMCwgYmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfcmVmIChzaXR0ZXIpLCAwLCAmc2l0dGVyX3RocmVhZF9pZCk7CisKKyAgaWYgKHNpdHRlcl90aHJlYWQgPT0gMCkKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRk9SS19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbmV3IHRocmVhZCIpOworICAgICAgZ290byBvdXQwOworICAgIH0KKyAgQ2xvc2VIYW5kbGUgKHNpdHRlcl90aHJlYWQpOworCisgIFBJTkcoKTsKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50LCBJTkZJTklURSk7CisKKyAgUElORygpOworICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAqc2l0dGVyX3AgPSBzaXR0ZXI7CisgIGVsc2UKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIFBJTkcoKTsKKyAgcmV0dXJuIFRSVUU7CisKK291dDA6CisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0JhYnlzaXR0ZXJGaW5pc2hlZEZ1bmMgIGZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IGZpbmlzaGVkOworICBzaXR0ZXItPmZpbmlzaGVkX2RhdGEgPSB1c2VyX2RhdGE7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitzdGF0aWMgY2hhciAqCitnZXRfdGVzdF9leGVjIChjb25zdCBjaGFyICpleGUsCisgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpzY3JhdGNoX3NwYWNlKQoreworICBjb25zdCBjaGFyICpkYnVzX3Rlc3RfZXhlYzsKKworICBkYnVzX3Rlc3RfZXhlYyA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9FWEVDIik7CisKKyAgaWYgKGRidXNfdGVzdF9leGVjID09IE5VTEwpCisgICAgZGJ1c190ZXN0X2V4ZWMgPSBEQlVTX1RFU1RfRVhFQzsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChzY3JhdGNoX3NwYWNlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzY3JhdGNoX3NwYWNlLCAiJXMvJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdGVzdF9leGVjLCBleGUsIERCVVNfRVhFRVhUKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoc2NyYXRjaF9zcGFjZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoc2NyYXRjaF9zcGFjZSk7Cit9CisKKyNkZWZpbmUgTElWRV9DSElMRFJFTihzaXR0ZXIpICgoc2l0dGVyKS0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisKK3N0YXRpYyB2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBpZiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoc2l0dGVyLT5lbmRfc3luY19ldmVudCwgSU5GSU5JVEUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX25vbmV4aXN0ZW50ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBzaXR0ZXIgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIG5vbmV4aXN0ZW50IGJpbmFyeSAqLworCisgIGFyZ3ZbMF0gPSAiL3RoaXMvZG9lcy9ub3QvZXhpc3QvMzI1NDJzZGdhZmdhZmRnIjsKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgInNwYXduX25vbmV4aXN0ZW50IiwgYXJndiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIG5vbmV4aXN0ZW50IGV4ZWN1dGFibGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX3NlZ2ZhdWx0ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICBzaXR0ZXIgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIHNlZ2ZhdWx0IGJpbmFyeSAqLworCisgIGFyZ3ZbMF0gPSBnZXRfdGVzdF9leGVjICgidGVzdC1zZWdmYXVsdCIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCwgbmV2ZXIgbWluZCAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9zZWdmYXVsdCIsIGFyZ3YsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBzZWdmYXVsdGluZyBiaW5hcnlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9leGl0ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICBzaXR0ZXIgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIGV4aXQgZmFpbHVyZSBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3QtZXhpdCIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCwgbmV2ZXIgbWluZCAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9leGl0IiwgYXJndiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3YwKTsKKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIGJpbmFyeSB0aGF0IGV4aXRlZCB3aXRoIGZhaWx1cmUgY29kZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGxhdW5jaGluZyBleGl0aW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fYW5kX2tpbGwgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzU3RyaW5nIGFyZ3YwOworCisgIHNpdHRlciA9IE5VTEw7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgc2xlZXBpbmcgYmluYXJ5IHRoZW4ga2lsbGluZyBpdCAqLworCisgIGFyZ3ZbMF0gPSBnZXRfdGVzdF9leGVjICgidGVzdC1zbGVlcC1mb3JldmVyIiwgJmFyZ3YwKTsKKworICBpZiAoYXJndlswXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9PTSB3YXMgc2ltdWxhdGVkLCBuZXZlciBtaW5kICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgInNwYXduX2FuZF9raWxsIiwgYXJndiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKHNpdHRlcik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGFmdGVyIGtpbGxpbmcgc3Bhd25lZCBiaW5hcnlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBraWxsaW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19zcGF3bl90ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fbm9uZXhpc3RlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9ub25leGlzdGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIERvbid0IHJ1biB0aGUgb2Jub3hpb3VzIHNlZ2ZhdWx0IHRlc3QgYnkgZGVmYXVsdCwKKyAgICogaXQncyBhIHBhaW4gdG8gaGF2ZSB0byBjbGljayBhbGwgdGhvc2UgZXJyb3IgYm94ZXMuCisgICAqLworICBpZiAoZ2V0ZW52ICgiRE9fU0VHRkFVTFRfVEVTVCIpKQorICAgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9zZWdmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fc2VnZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX2V4aXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9leGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX2FuZF9raWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fYW5kX2tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNwYXduLmMgYi9kYnVzL2RidXMtc3Bhd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYzZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNwYXduLmMKQEAgLTAsMCArMSwxNzIzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3Bhd24uYyBXcmFwcGVyIGFyb3VuZCBmb3JrL2V4ZWMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1zcGF3bi5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTVEVNRAorI2lmZGVmIEhBVkVfU1lTTE9HX0gKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5c3RlbWQvc2Qtam91cm5hbC5oPgorI2VuZGlmCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoKKyAqIEknbSBwcmV0dHkgc3VyZSB0aGlzIHdob2xlIHNwYXduIGZpbGUgY291bGQgYmUgbWFkZSBzaW1wbGVyLAorICogaWYgeW91IHRob3VnaHQgYWJvdXQgaXQgYSBiaXQuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3Igc3RhdHVzIG9mIGEgcmVhZCgpCisgKi8KK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2ludHMgKGludCAgICAgICAgZmQsCisJICAgaW50ICAgICAgICpidWYsCisJICAgaW50ICAgICAgICBuX2ludHNfaW5fYnVmLAorCSAgIGludCAgICAgICAqbl9pbnRzX3JlYWQsCisJICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsgICAgCisgIFJlYWRTdGF0dXMgcmV0dmFsOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOworICAgICAgc2l6ZV90IHRvX3JlYWQ7CisKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKGludCkgKiBuX2ludHNfaW5fYnVmIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgYWdhaW46CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgKm5faW50c19yZWFkID0gKGludCkoYnl0ZXMgLyBzaXplb2YoaW50KSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmLAorICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIHNpemVfdCBieXRlcyA9IDA7ICAgIAorICBSZWFkU3RhdHVzIHJldHZhbDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICBhZ2FpbjoKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW50ZXJtZWRpYXRlIGNoaWxkIGJldHdlZW4gdGhlIG1haW4gcHJvY2VzcworICogYW5kIHRoZSBncmFuZGNoaWxkLiBUaGUgZ3JhbmRjaGlsZCBpcyBvdXIgc3Bhd25lZCBwcm9jZXNzLiBUaGUgaW50ZXJtZWRpYXRlCisgKiBjaGlsZCBpcyBhIGJhYnlzaXR0ZXIgcHJvY2VzczsgaXQga2VlcHMgdHJhY2sgb2Ygd2hlbiB0aGUgZ3JhbmRjaGlsZAorICogZXhpdHMvY3Jhc2hlcywgYW5kIHJlYXBzIHRoZSBncmFuZGNoaWxkLgorICoKKyAqIFdlIGF1dG9tYXRpY2FsbHkgcmVhcCB0aGUgYmFieXNpdHRlciBwcm9jZXNzLCBraWxsaW5nIGl0IGlmIG5lY2Vzc2FyeSwKKyAqIHdoZW4gdGhlIERCdXNCYWJ5c2l0dGVyJ3MgcmVmY291bnQgZ29lcyB0byB6ZXJvLgorICoKKyAqIFByb2Nlc3NlczoKKyAqCisgKiBtYWluIHByb2Nlc3MKKyAqIHwgZm9yaygpIEEKKyAqIFwtIGJhYnlzaXR0ZXIKKyAqICAgIHwgZm9yayAoKSBCCisgKiAgICBcLSBncmFuZGNoaWxkICAgICAtLT4gZXhlYyAtLT4gICAgc3Bhd25lZCBwcm9jZXNzCisgKgorICogSVBDOgorICogICAgICAgICAgICAgICAgICBjaGlsZF9lcnJfcmVwb3J0X3BpcGUKKyAqICAgICAgICAgIC8tLS0tLS0tLS0tLTwtLS0tLS0tLS08LS0tLS0tLS0tLS0tLS1cCisgKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICogICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIG1haW4gcHJvY2VzcyAgICAgICAgICAgYmFieXNpdHRlciAgICAgICAgICBncmFuZGNoaWxkCisgKiAgICAgICAgICBeICAgICAgICAgICAgICAgICBeCisgKiAgICAgICAgICB2ICAgICAgICAgICAgICAgICB2CisgKiAgICAgICAgICBcLS0tLS0tLTwtPi0tLS0tLS0vCisgKiAgICAgICAgICAgIGJhYnlzaXR0ZXJfcGlwZQorICoKKyAqIGNoaWxkX2Vycl9yZXBvcnRfcGlwZSBpcyBnZW51aW5lbHkgYSBwaXBlLgorICogVGhlIFJFQURfRU5EIChhbHNvIGNhbGxlZCBlcnJvcl9waXBlX2Zyb21fY2hpbGQpIGlzIHVzZWQgaW4gdGhlIG1haW4KKyAqIHByb2Nlc3MuIFRoZSBXUklURV9FTkQgKGFsc28gY2FsbGVkIGNoaWxkX2Vycl9yZXBvcnRfZmQpIGlzIHVzZWQgaW4KKyAqIHRoZSBncmFuZGNoaWxkIHByb2Nlc3MuCisgKgorICogT24gZmFpbHVyZSwgdGhlIGdyYW5kY2hpbGQgcHJvY2VzcyBzZW5kcyBDSElMRF9FWEVDX0ZBSUxFRCArIGVycm5vLgorICogT24gc3VjY2VzcywgdGhlIHBpcGUganVzdCBjbG9zZXMgKGJlY2F1c2UgaXQncyBjbG9zZS1vbi1leGVjKSB3aXRob3V0CisgKiBzZW5kaW5nIGFueSBieXRlcy4KKyAqCisgKiBiYWJ5c2l0dGVyX3BpcGUgaXMgbWlzLW5hbWVkOiBpdCdzIHJlYWxseSBhIGJpZGlyZWN0aW9uYWwgc29ja2V0cGFpci4KKyAqIFRoZSBbMF0gZW5kIChhbHNvIGNhbGxlZCBzb2NrZXRfdG9fYmFieXNpdHRlcikgaXMgdXNlZCBpbiB0aGUgbWFpbgorICogcHJvY2VzcywgdGhlIFsxXSBlbmQgKGFsc28gY2FsbGVkIHBhcmVudF9waXBlKSBpcyB1c2VkIGluIHRoZSBiYWJ5c2l0dGVyLgorICoKKyAqIElmIHRoZSBmb3JrKCkgbGFiZWxsZWQgQiBpbiB0aGUgZGlhZ3JhbSBhYm92ZSBmYWlscywgdGhlIGJhYnlzaXR0ZXIgc2VuZHMKKyAqIENISUxEX0ZPUktfRkFJTEVEICsgZXJybm8uCisgKiBPbiBzdWNjZXNzLCB0aGUgYmFieXNpdHRlciBzZW5kcyBDSElMRF9QSUQgKyB0aGUgZ3JhbmRjaGlsZCdzIHBpZC4KKyAqIE9uIFNJR0NITEQsIHRoZSBiYWJ5c2l0dGVyIHNlbmRzIENISUxEX0VYSVRFRCArIHRoZSBleGl0IHN0YXR1cy4KKyAqIFRoZSBtYWluIHByb2Nlc3MgZG9lc24ndCBleHBsaWNpdGx5IHNlbmQgYW55dGhpbmcsIGJ1dCB3aGVuIGl0IGV4aXRzLAorICogdGhlIGJhYnlzaXR0ZXIgZ2V0cyBQT0xMSFVQIG9yIFBPTExFUlIuCisgKi8KKworLyogTWVzc2FnZXMgZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzICovCitlbnVtCit7CisgIENISUxEX0VYSVRFRCwgICAgICAgICAgICAvKiBUaGlzIG1lc3NhZ2UgaXMgZm9sbG93ZWQgYnkgdGhlIGV4aXQgc3RhdHVzIGludCAqLworICBDSElMRF9GT1JLX0ZBSUxFRCwgICAgICAgLyogRm9sbG93ZWQgYnkgZXJybm8gKi8KKyAgQ0hJTERfRVhFQ19GQUlMRUQsICAgICAgIC8qIEZvbGxvd2VkIGJ5IGVycm5vICovCisgIENISUxEX1BJRCAgICAgICAgICAgICAgICAvKiBGb2xsb3dlZCBieSBwaWRfdCAqLworfTsKKworLyoqCisgKiBCYWJ5c2l0dGVyIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqLworc3RydWN0IERCdXNCYWJ5c2l0dGVyCit7CisgIGludCByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBjaGFyICpsb2dfbmFtZTsgLyoqPCB0aGUgbmFtZSB1bmRlciB3aGljaCB0byBsb2cgbWVzc2FnZXMgYWJvdXQgdGhpcworCQkgICAgcHJvY2VzcyBiZWluZyBzcGF3bmVkICovCisgIAorICBEQnVzU29ja2V0IHNvY2tldF90b19iYWJ5c2l0dGVyOyAvKio8IENvbm5lY3Rpb24gdG8gdGhlIGJhYnlzaXR0ZXIgcHJvY2VzcyAqLworICBpbnQgZXJyb3JfcGlwZV9mcm9tX2NoaWxkOyAvKio8IENvbm5lY3Rpb24gdG8gdGhlIHByb2Nlc3MgdGhhdCBkb2VzIHRoZSBleGVjKCkgKi8KKyAgCisgIHBpZF90IHNpdHRlcl9waWQ7ICAvKio8IFBJRCBPZiB0aGUgYmFieXNpdHRlciAqLworICBwaWRfdCBncmFuZGNoaWxkX3BpZDsgLyoqPCBQSUQgb2YgdGhlIGdyYW5kY2hpbGQgKi8KKworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOyAvKio8IFdhdGNoZXMgKi8KKworICBEQnVzV2F0Y2ggKmVycm9yX3dhdGNoOyAvKio8IEVycm9yIHBpcGUgd2F0Y2ggKi8KKyAgREJ1c1dhdGNoICpzaXR0ZXJfd2F0Y2g7IC8qKjwgU2l0dGVyIHBpcGUgd2F0Y2ggKi8KKworICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyBmaW5pc2hlZF9jYjsKKyAgdm9pZCAqZmluaXNoZWRfZGF0YTsKKworICBpbnQgZXJybnVtOyAvKio8IEVycm9yIG51bWJlciAqLworICBpbnQgc3RhdHVzOyAvKio8IEV4aXQgc3RhdHVzIGNvZGUgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfY2hpbGRfc3RhdHVzIDogMTsgLyoqPCBUcnVlIGlmIGNoaWxkIHN0YXR1cyBoYXMgYmVlbiByZWFwZWQgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfZm9ya19lcnJudW0gOiAxOyAvKio8IFRydWUgaWYgd2UgaGF2ZSBhbiBlcnJvciBjb2RlIGZyb20gZm9yaygpICovCisgIHVuc2lnbmVkIGludCBoYXZlX2V4ZWNfZXJybnVtIDogMTsgLyoqPCBUcnVlIGlmIHdlIGhhdmUgYW4gZXJyb3IgY29kZSBmcm9tIGV4ZWMoKSAqLworfTsKKworc3RhdGljIERCdXNCYWJ5c2l0dGVyKgorX2RidXNfYmFieXNpdHRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisKKyAgc2l0dGVyID0gZGJ1c19uZXcwIChEQnVzQmFieXNpdHRlciwgMSk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzaXR0ZXItPnJlZmNvdW50ID0gMTsKKworICBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkID0gLTE7CisgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gLTE7CisgIAorICBzaXR0ZXItPnNpdHRlcl9waWQgPSAtMTsKKyAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9IC0xOworCisgIHNpdHRlci0+d2F0Y2hlcyA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAoc2l0dGVyLT53YXRjaGVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisgIAorICByZXR1cm4gc2l0dGVyOworCisgZmFpbGVkOgorICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHJldHVybnMgdGhlIGJhYnlzaXR0ZXIKKyAqLworREJ1c0JhYnlzaXR0ZXIgKgorX2RidXNfYmFieXNpdHRlcl9yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+cmVmY291bnQgPiAwKTsKKyAgCisgIHNpdHRlci0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gc2l0dGVyOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpOworc3RhdGljIHZvaWQgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKTsKKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKiBXaGVuIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGJhYnlzaXR0ZXIgb2JqZWN0IHJlYWNoZXMKKyAqIHplcm8sIHRoZSBiYWJ5c2l0dGVyIGlzIGtpbGxlZCBhbmQgdGhlIGNoaWxkIHRoYXQgd2FzIGJlaW5nCisgKiBiYWJ5c2F0IGdldHMgZW1hbmNpcGF0ZWQuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBfZGJ1c19hc3NlcnQgKHNpdHRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPnJlZmNvdW50ID4gMCk7CisgIAorICBzaXR0ZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChzaXR0ZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgLyogSWYgd2UgaGF2ZW4ndCBmb3JrZWQgb3RoZXIgYmFieXNpdHRlcnMKKyAgICAgICAqIHNpbmNlIHRoaXMgYmFieXNpdHRlciBhbmQgc29ja2V0IHdlcmUKKyAgICAgICAqIGNyZWF0ZWQgdGhlbiB0aGlzIGNsb3NlIHdpbGwgY2F1c2UgdGhlCisgICAgICAgKiBiYWJ5c2l0dGVyIHRvIHdha2UgdXAgZnJvbSBwb2xsIHdpdGgKKyAgICAgICAqIGEgaGFuZ3VwIGFuZCB0aGVuIHRoZSBiYWJ5c2l0dGVyIHdpbGwKKyAgICAgICAqIHF1aXQgaXRzZWxmLgorICAgICAgICovCisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKworICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworCisgICAgICBpZiAoc2l0dGVyLT5zaXR0ZXJfcGlkID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgIC8qIEl0J3MgcG9zc2libGUgdGhlIGJhYnlzaXR0ZXIgZGllZCBvbiBpdHMgb3duIGFib3ZlIAorICAgICAgICAgICAqIGZyb20gdGhlIGNsb3NlLCBvciB3YXMga2lsbGVkIHJhbmRvbWx5CisgICAgICAgICAgICogYnkgc29tZSBvdGhlciBwcm9jZXNzLCBzbyBmaXJzdCB0cnkgdG8gcmVhcCBpdAorICAgICAgICAgICAqLworICAgICAgICAgIHJldCA9IHdhaXRwaWQgKHNpdHRlci0+c2l0dGVyX3BpZCwgJnN0YXR1cywgV05PSEFORyk7CisKKyAgICAgICAgICAvKiBJZiB3ZSBjb3VsZG4ndCByZWFwIHRoZSBjaGlsZCB0aGVuIGtpbGwgaXQsIGFuZAorICAgICAgICAgICAqIHRyeSBhZ2FpbgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgIGtpbGwgKHNpdHRlci0+c2l0dGVyX3BpZCwgU0lHS0lMTCk7CisKKyAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmV0ID0gd2FpdHBpZCAoc2l0dGVyLT5zaXR0ZXJfcGlkLCAmc3RhdHVzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHdoaWxlIChfREJVU19VTkxJS0VMWSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0hJTEQpCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJhYnlzaXR0ZXIgcHJvY2VzcyBub3QgYXZhaWxhYmxlIHRvIGJlIHJlYXBlZDsgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgZXJyb3IgJWQgaW4gd2FpdHBpZCgpIGZvciBiYWJ5c2l0dGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVhcGVkICVsZCwgd2FpdGluZyBmb3IgYmFieXNpdHRlciAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByZXQsIChsb25nKSBzaXR0ZXItPnNpdHRlcl9waWQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKFdJRkVYSVRFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHNpdHRlci0+c3RhdHVzKSkKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQmFieXNpdHRlciByZWNlaXZlZCBzaWduYWwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1RFUk1TSUcgKHNpdHRlci0+c3RhdHVzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQmFieXNpdHRlciBleGl0ZWQgYWJub3JtYWxseVxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzaXR0ZXItPnNpdHRlcl9waWQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT53YXRjaGVzKQorICAgICAgICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNpdHRlci0+d2F0Y2hlcyk7CisKKyAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5sb2dfbmFtZSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoc2l0dGVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2RhdGEgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgIGludCAgICAgICAgICAgICBmZCkKK3sKKyAgaW50IHdoYXQ7CisgIGludCBnb3Q7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgUmVhZFN0YXR1cyByOworCisgIHIgPSByZWFkX2ludHMgKGZkLCAmd2hhdCwgMSwgJmdvdCwgJmVycm9yKTsKKworICBzd2l0Y2ggKHIpCisgICAgeworICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHJlYWQgZGF0YSBmcm9tIGZkICVkOiAlc1xuIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIHI7CisKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgIHJldHVybiByOworCisgICAgY2FzZSBSRUFEX1NUQVRVU19PSzoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIGlmIChnb3QgPT0gMSkKKyAgICB7CisgICAgICBzd2l0Y2ggKHdoYXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBDSElMRF9FWElURUQ6CisgICAgICAgIGNhc2UgQ0hJTERfRk9SS19GQUlMRUQ6CisgICAgICAgIGNhc2UgQ0hJTERfRVhFQ19GQUlMRUQ6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGFyZzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgciA9IHJlYWRfaW50cyAoZmQsICZhcmcsIDEsICZnb3QsICZlcnJvcik7CisKKyAgICAgICAgICAgIHN3aXRjaCAocikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcmVhZCBhcmcgZnJvbSBmZCAlZDogJXNcbiIsIGZkLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChnb3QgPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENISUxEX0VYSVRFRCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IHJlc2V0IHNpdHRlci0+ZXJybnVtIHRvIDAgaGVyZS4gV2UgZ2V0IGhlcmUgaWYKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGJhYnlzaXR0ZXIgcmVwb3J0cyB0aGF0IHRoZSBncmFuZGNoaWxkIHByb2Nlc3MgaGFzCisgICAgICAgICAgICAgICAgICAgICAqIGV4aXRlZCwgYW5kIHRoZXJlIGFyZSB0d28gd2F5cyB0aGF0IGNhbiBoYXBwZW46CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIDEuIGdyYW5kY2hpbGQgc3VjY2Vzc2Z1bGx5IGV4ZWMoKXMgdGhlIGRlc2lyZWQgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICogYnV0IHRoZW4gdGhlIGRlc2lyZWQgcHJvY2VzcyBleGl0cyBvciBpcyB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAqIGJ5IGEgc2lnbmFsLiBUaGUgYmFieXNpdHRlciBvYnNlcnZlcyB0aGlzIGFuZCByZXBvcnRzCisgICAgICAgICAgICAgICAgICAgICAqIENISUxEX0VYSVRFRC4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogMi4gZ3JhbmRjaGlsZCBmYWlscyB0byBleGVjKCkgdGhlIGRlc2lyZWQgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICogYXR0ZW1wdHMgdG8gcmVwb3J0IHRoZSBleGVjKCkgZmFpbHVyZSAod2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICogd2Ugd2lsbCByZWNlaXZlIGFzIENISUxEX0VYRUNfRkFJTEVEKSwgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICogZXhpdHMgaXRzZWxmICh3aGljaCB3aWxsIHByb21wdCB0aGUgYmFieXNpdHRlciB0bworICAgICAgICAgICAgICAgICAgICAgKiBzZW5kIENISUxEX0VYSVRFRCkuIFdlIHdhbnQgdGhlIENISUxEX0VYRUNfRkFJTEVECisgICAgICAgICAgICAgICAgICAgICAqIHRvIHRha2UgcHJlY2VkZW5jZSAoYW5kIGhhdmUgaXRzIGVycm5vIGxvZ2dlZCksCisgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IoKSBkb2VzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+c3RhdHVzID0gYXJnOworICAgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjb3JkZWQgY2hpbGQgc3RhdHVzIGV4aXRlZCA9ICVkIHNpZ25hbGVkID0gJWQgZXhpdHN0YXR1cyA9ICVkIHRlcm1zaWcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cyksIFdJRlNJR05BTEVEIChzaXR0ZXItPnN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFWElUU1RBVFVTIChzaXR0ZXItPnN0YXR1cyksIFdURVJNU0lHIChzaXR0ZXItPnN0YXR1cykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdoYXQgPT0gQ0hJTERfRk9SS19GQUlMRUQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+aGF2ZV9mb3JrX2Vycm51bSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXJybnVtID0gYXJnOworICAgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjb3JkZWQgZm9yayBlcnJudW0gJWRcbiIsIHNpdHRlci0+ZXJybnVtKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ID09IENISUxEX0VYRUNfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfZXhlY19lcnJudW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmVycm51bSA9IGFyZzsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGV4ZWMgZXJybnVtICVkXG4iLCBzaXR0ZXItPmVycm51bSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hJTERfUElEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xOworCisgICAgICAgICAgICByID0gcmVhZF9waWQgKGZkLCAmcGlkLCAmZXJyb3IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHJlYWQgUElEIGZyb20gZmQgJWQ6ICVzXG4iLCBmZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19PSzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkID0gcGlkOworICAgICAgICAgICAgCisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjb3JkZWQgZ3JhbmRjaGlsZCBwaWQgJWRcbiIsIHNpdHRlci0+Z3JhbmRjaGlsZF9waWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5rbm93biBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYmFieXNpdHRlciBwcm9jZXNzXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBfZGJ1c192ZXJib3NlICgiQ2xvc2luZyBiYWJ5c2l0dGVyXG4iKTsKKworICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+d2F0Y2hlcyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5mZCA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciwgTlVMTCk7CisgICAgICBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkID0gLTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBfZGJ1c192ZXJib3NlICgiQ2xvc2luZyBjaGlsZCBlcnJvclxuIik7CisKKyAgaWYgKHNpdHRlci0+ZXJyb3Jfd2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+d2F0Y2hlcyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPmVycm9yX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+ZXJyb3Jfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+ZXJyb3Jfd2F0Y2gpOworICAgICAgc2l0dGVyLT5lcnJvcl93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIGlmIChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCwgTlVMTCk7CisgICAgICBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA9IC0xOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9iYWJ5c2l0dGVyX3NvY2tldCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHJldmVudHMpCit7CisgIC8qIEV2ZW4gaWYgd2UgaGF2ZSBQT0xMSFVQLCB3ZSB3YW50IHRvIGtlZXAgcmVhZGluZworICAgKiBkYXRhIHVudGlsIFBPTExJTiBnb2VzIGF3YXk7IHNvIHRoaXMgZnVuY3Rpb24gb25seQorICAgKiBsb29rcyBhdCBIVVAvRVJSIGlmIG5vIElOIGlzIHNldC4KKyAgICovCisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkaW5nIGRhdGEgZnJvbSBiYWJ5c2l0dGVyXG4iKTsKKyAgICAgIGlmIChyZWFkX2RhdGEgKHNpdHRlciwgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5mZCkgIT0gUkVBRF9TVEFUVVNfT0spCisgICAgICAgIGNsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyIChzaXR0ZXIpOworICAgIH0KKyAgZWxzZSBpZiAocmV2ZW50cyAmIChfREJVU19QT0xMRVJSIHwgX0RCVVNfUE9MTEhVUCkpCisgICAgeworICAgICAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2Vycm9yX3BpcGUgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHJldmVudHMpCit7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkaW5nIGRhdGEgZnJvbSBjaGlsZCBlcnJvclxuIik7CisgICAgICBpZiAocmVhZF9kYXRhIChzaXR0ZXIsIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkKSAhPSBSRUFEX1NUQVRVU19PSykKKyAgICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworICAgIH0KKyAgZWxzZSBpZiAocmV2ZW50cyAmIChfREJVU19QT0xMRVJSIHwgX0RCVVNfUE9MTEhVUCkpCisgICAgeworICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworICAgIH0KK30KKworLyogcmV0dXJucyB3aGV0aGVyIHRoZXJlIHdlcmUgYW55IHBvbGwgZXZlbnRzIGhhbmRsZWQgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYmFieXNpdHRlcl9pdGVyYXRpb24gKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGJsb2NrKQoreworICBEQnVzUG9sbEZEIGZkc1syXTsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IGRlc2NyaXB0b3JzX3JlYWR5OworCisgIGRlc2NyaXB0b3JzX3JlYWR5ID0gRkFMU0U7CisgIAorICBpID0gMDsKKworICBpZiAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKyAgICB7CisgICAgICBmZHNbaV0uZmQgPSBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZDsKKyAgICAgIGZkc1tpXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBmZHNbaV0ucmV2ZW50cyA9IDA7CisgICAgICArK2k7CisgICAgfQorICAKKyAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQgPj0gMCkKKyAgICB7CisgICAgICBmZHNbaV0uZmQgPSBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkOworICAgICAgZmRzW2ldLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIGZkc1tpXS5yZXZlbnRzID0gMDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGkgPiAwKQorICAgIHsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICByZXQgPSBfZGJ1c19wb2xsIChmZHMsIGksIDApOworICAgICAgICB9CisgICAgICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgIGlmIChyZXQgPT0gMCAmJiBibG9jaykKKyAgICAgICAgeworICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldCA9IF9kYnVzX3BvbGwgKGZkcywgaSwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGRlc2NyaXB0b3JzX3JlYWR5ID0gVFJVRTsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgaWYgKGZkc1tpXS5mZCA9PSBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCkKKyAgICAgICAgICAgICAgICBoYW5kbGVfZXJyb3JfcGlwZSAoc2l0dGVyLCBmZHNbaV0ucmV2ZW50cyk7CisgICAgICAgICAgICAgIGVsc2UgaWYgKGZkc1tpXS5mZCA9PSBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkKQorICAgICAgICAgICAgICAgIGhhbmRsZV9iYWJ5c2l0dGVyX3NvY2tldCAoc2l0dGVyLCBmZHNbaV0ucmV2ZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGRlc2NyaXB0b3JzX3JlYWR5OworfQorCisvKioKKyAqIE1hY3JvIHJldHVybnMgI1RSVUUgaWYgdGhlIGJhYnlzaXR0ZXIgc3RpbGwgaGFzIGxpdmUgc29ja2V0cyBvcGVuIHRvIHRoZQorICogYmFieXNpdHRlciBjaGlsZCBvciB0aGUgZ3JhbmRjaGlsZC4KKyAqLworI2RlZmluZSBMSVZFX0NISUxEUkVOKHNpdHRlcikgKChzaXR0ZXIpLT5zb2NrZXRfdG9fYmFieXNpdHRlci5mZCA+PSAwIHx8IChzaXR0ZXIpLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKworLyoqCisgKiBCbG9ja3MgdW50aWwgdGhlIGJhYnlzaXR0ZXIgcHJvY2VzcyBnaXZlcyB1cyB0aGUgUElEIG9mIHRoZSBzcGF3bmVkIGdyYW5kY2hpbGQsCisgKiB0aGVuIGtpbGxzIHRoZSBzcGF3bmVkIGdyYW5kY2hpbGQuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlciBvYmplY3QKKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICAvKiBiZSBzdXJlIHdlIGhhdmUgdGhlIFBJRCBvZiB0aGUgY2hpbGQgKi8KKyAgd2hpbGUgKExJVkVfQ0hJTERSRU4gKHNpdHRlcikgJiYKKyAgICAgICAgIHNpdHRlci0+Z3JhbmRjaGlsZF9waWQgPT0gLTEpCisgICAgYmFieXNpdHRlcl9pdGVyYXRpb24gKHNpdHRlciwgVFJVRSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkdvdCBjaGlsZCBQSUQgJWxkIGZvciBraWxsaW5nXG4iLAorICAgICAgICAgICAgICAgICAobG9uZykgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCk7CisgIAorICBpZiAoc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9PSAtMSkKKyAgICByZXR1cm47IC8qIGNoaWxkIGlzIGFscmVhZHkgZGVhZCwgb3Igd2UncmUgc28gaG9zZWQgd2UnbGwgbmV2ZXIgcmVjb3ZlciAqLworCisgIGtpbGwgKHNpdHRlci0+Z3JhbmRjaGlsZF9waWQsIFNJR0tJTEwpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBjaGlsZCBoYXMgZXhpdGVkLCB3aXRob3V0IGJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKworICAvKiBCZSBzdXJlIHdlJ3JlIHVwLXRvLWRhdGUgKi8KKyAgd2hpbGUgKExJVkVfQ0hJTERSRU4gKHNpdHRlcikgJiYKKyAgICAgICAgIGJhYnlzaXR0ZXJfaXRlcmF0aW9uIChzaXR0ZXIsIEZBTFNFKSkKKyAgICA7CisKKyAgLyogV2Ugd2lsbCBoYXZlIGV4aXRlZCB0aGUgYmFieXNpdHRlciB3aGVuIHRoZSBjaGlsZCBoYXMgZXhpdGVkICovCisgIHJldHVybiBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkIDwgMDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQuIFdlIGRvIHRoaXMgc28gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKKyAqIGRldGFpbCBpcyBub3QgY2x1dHRlcmluZyB1cCBkYnVzLCBmb3IgZXhhbXBsZSB0aGUgc3lzdGVtIGxhdW5jaGVyIGNvZGUuCisgKiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgY2hpbGQgaGFzIGV4aXRlZCwgaS5lLiBjYWxsCisgKiBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQoKS4gSXQgcmV0dXJucyBGQUxTRSBpZiB0aGUgY2hpbGQKKyAqIGRpZCBub3QgcmV0dXJuIGEgc3RhdHVzIGNvZGUsIGUuZy4gYmVjYXVzZSB0aGUgY2hpbGQgd2FzIHNpZ25hbGVkCisgKiBvciB3ZSBmYWlsZWQgdG8gZXZlciBsYXVuY2ggdGhlIGNoaWxkIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gc3RhdHVzIHRoZSByZXR1cm5lZCBzdGF0dXMgY29kZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpzdGF0dXMpCit7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNoaWxkIGhhcyBub3QgZXhpdGVkIik7CisgIAorICBpZiAoIXNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgfHwKKyAgICAgICEoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc3RhdHVzID0gV0VYSVRTVEFUVVMgKHNpdHRlci0+c3RhdHVzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgI0RCdXNFcnJvciB3aXRoIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGUgc3Bhd25lZAorICogY2hpbGQgcHJvY2VzcyBleGl0ZWQgKG9uIGEgc2lnbmFsLCBvciB3aGF0ZXZlcikuIElmCisgKiB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgbm90IGV4aXRlZCwgZG9lcyBub3RoaW5nIChlcnJvcgorICogd2lsbCByZW1haW4gdW5zZXQpLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBlcnJvciBhbiBlcnJvciB0byBmaWxsIGluCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIHJldHVybjsKKworICAvKiBOb3RlIHRoYXQgaWYgZXhlYyBmYWlscywgd2Ugd2lsbCBhbHNvIGdldCBhIGNoaWxkIHN0YXR1cworICAgKiBmcm9tIHRoZSBiYWJ5c2l0dGVyIHNheWluZyB0aGUgY2hpbGQgZXhpdGVkLAorICAgKiBzbyB3ZSBuZWVkIHRvIGdpdmUgcHJpb3JpdHkgdG8gdGhlIGV4ZWMgZXJyb3IKKyAgICovCisgIGlmIChzaXR0ZXItPmhhdmVfZXhlY19lcnJudW0pCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9ncmFtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgX2RidXNfc3RyZXJyb3IgKHNpdHRlci0+ZXJybnVtKSk7CisgICAgfQorICBlbHNlIGlmIChzaXR0ZXItPmhhdmVfZm9ya19lcnJudW0pCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsgYSBuZXcgcHJvY2VzcyAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+bG9nX25hbWUsIF9kYnVzX3N0cmVycm9yIChzaXR0ZXItPmVycm51bSkpOworICAgIH0KKyAgZWxzZSBpZiAoc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cykKKyAgICB7CisgICAgICBpZiAoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgV0VYSVRTVEFUVVMgKHNpdHRlci0+c3RhdHVzKSk7CisgICAgICBlbHNlIGlmIChXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyByZWNlaXZlZCBzaWduYWwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgV1RFUk1TSUcgKHNpdHRlci0+c3RhdHVzKSk7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyBleGl0ZWQgYWJub3JtYWxseSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmxvZ19uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCwgcmVhc29uIHVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+bG9nX25hbWUpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIHdhdGNoIGZ1bmN0aW9ucyB0byBub3RpZnkgdXMgd2hlbiB0aGUKKyAqIGJhYnlzaXR0ZXIgb2JqZWN0IG5lZWRzIHRvIHJlYWQvd3JpdGUgZmlsZSBkZXNjcmlwdG9ycy4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlZ2luIG1vbml0b3JpbmcgYSBuZXcgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gc3RvcCBtb25pdG9yaW5nIGEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSB3YXRjaCBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICByZXR1cm4gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChzaXR0ZXItPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV93YXRjaCAoREJ1c1dhdGNoICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IF9kYnVzX2JhYnlzaXR0ZXJfcmVmIChkYXRhKTsKKyAgaW50IHJldmVudHM7CisgIGludCBmZDsKKyAgCisgIHJldmVudHMgPSAwOworICBpZiAoY29uZGl0aW9uICYgREJVU19XQVRDSF9SRUFEQUJMRSkKKyAgICByZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKyAgaWYgKGNvbmRpdGlvbiAmIERCVVNfV0FUQ0hfRVJST1IpCisgICAgcmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworICBpZiAoY29uZGl0aW9uICYgREJVU19XQVRDSF9IQU5HVVApCisgICAgcmV2ZW50cyB8PSBfREJVU19QT0xMSFVQOworCisgIGZkID0gZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3YXRjaCk7CisKKyAgaWYgKGZkID09IHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkKQorICAgIGhhbmRsZV9lcnJvcl9waXBlIChzaXR0ZXIsIHJldmVudHMpOworICBlbHNlIGlmIChmZCA9PSBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkKQorICAgIGhhbmRsZV9iYWJ5c2l0dGVyX3NvY2tldCAoc2l0dGVyLCByZXZlbnRzKTsKKworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSAmJgorICAgICAgICAgYmFieXNpdHRlcl9pdGVyYXRpb24gKHNpdHRlciwgRkFMU0UpKQorICAgIDsKKworICAvKiBmZC5vICMzMjk5MjogaWYgdGhlIGhhbmRsZV8qIG1ldGhvZHMgY2xvc2VkIHRoZWlyIHNvY2tldHMsIHRoZXkgcHJldmlvdXNseQorICAgKiBkaWRuJ3QgYWx3YXlzIHJlbW92ZSB0aGUgd2F0Y2hlcy4gQ2hlY2sgdGhhdCB3ZSBkb24ndCByZWdyZXNzLiAqLworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQgIT0gLTEgfHwgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgIT0gLTEgfHwgc2l0dGVyLT5lcnJvcl93YXRjaCA9PSBOVUxMKTsKKworICBpZiAoX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpICYmCisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiICE9IE5VTEwpCisgICAgeworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiAoc2l0dGVyLCBzaXR0ZXItPmZpbmlzaGVkX2RhdGEpOworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiogSGVscHMgcmVtZW1iZXIgd2hpY2ggZW5kIG9mIHRoZSBwaXBlIGlzIHdoaWNoICovCisjZGVmaW5lIFJFQURfRU5EIDAKKy8qKiBIZWxwcyByZW1lbWJlciB3aGljaCBlbmQgb2YgdGhlIHBpcGUgaXMgd2hpY2ggKi8KKyNkZWZpbmUgV1JJVEVfRU5EIDEKKworCisvKiBBdm9pZHMgYSBkYW5nZXIgaW4gcmUtZW50cmFudCBzaXR1YXRpb25zIChjYWxsaW5nIGNsb3NlKCkKKyAqIG9uIGEgZmlsZSBkZXNjcmlwdG9yIHR3aWNlLCBhbmQgYW5vdGhlciBtb2R1bGUgaGFzCisgKiByZS1vcGVuZWQgaXQgc2luY2UgdGhlIGZpcnN0IGNsb3NlKS4KKyAqCisgKiBUaGlzIHByZXZpb3VzbHkgY2xhaW1lZCB0byBiZSByZWxldmFudCBmb3IgdGhyZWFkZWQgc2l0dWF0aW9ucywgYnV0IGJ5CisgKiB0cml2aWFsIGluc3BlY3Rpb24sIGl0IGlzIG5vdCB0aHJlYWQtc2FmZS4gSXQgZG9lc24ndCBhY3R1YWxseQorICogbWF0dGVyLCBzaW5jZSB0aGlzIG1vZHVsZSBpcyBvbmx5IHVzZWQgaW4gdGhlIC11dGlsIHZhcmlhbnQgb2YgdGhlCisgKiBsaWJyYXJ5LCB3aGljaCBpcyBvbmx5IHVzZWQgaW4gc2luZ2xlLXRocmVhZGVkIHNpdHVhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK2Nsb3NlX2FuZF9pbnZhbGlkYXRlIChpbnQgKmZkKQoreworICBpbnQgcmV0OworCisgIGlmICgqZmQgPCAwKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJldCA9IF9kYnVzX2Nsb3NlICgqZmQsIE5VTEwpOworICAgICAgKmZkID0gLTE7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFrZV9waXBlIChpbnQgICAgICAgICBwWzJdLAorICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgaW50IHJldHZhbDsKKworI2lmZGVmIEhBVkVfUElQRTIKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lOworCisgIHJldHZhbCA9IHBpcGUyIChwLCBPX0NMT0VYRUMpOworICBjbG9leGVjX2RvbmUgPSByZXR2YWwgPj0gMDsKKworICAvKiBDaGVjayBpZiBrZXJuZWwgc2VlbXMgdG8gYmUgdG9vIG9sZCB0byBrbm93IHBpcGUyKCkuIFdlIGFzc3VtZQorICAgICB0aGF0IGlmIHBpcGUyIGlzIGF2YWlsYWJsZSwgT19DTE9FWEVDIGlzIHRvby4gICovCisgIGlmIChyZXR2YWwgPCAwICYmIGVycm5vID09IEVOT1NZUykKKyNlbmRpZgorICAgIHsKKyAgICAgIHJldHZhbCA9IHBpcGUocCk7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChyZXR2YWwgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgREJVU19FUlJPUl9TUEFXTl9GQUlMRUQsCisJCSAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBpcGUgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBjaGlsZCBwcm9jZXNzICglcykiLAorCQkgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1BJUEUyCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKHBbMF0pOworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKHBbMV0pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2RvX3dyaXRlIChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICBzaXplX3QgYnl0ZXNfd3JpdHRlbjsKKyAgaW50IHJldDsKKyAgCisgIGJ5dGVzX3dyaXR0ZW4gPSAwOworICAKKyBhZ2FpbjoKKyAgCisgIHJldCA9IHdyaXRlIChmZCwgKChjb25zdCBjaGFyKilidWYpICsgYnl0ZXNfd3JpdHRlbiwgY291bnQgLSBieXRlc193cml0dGVuKTsKKworICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHdyaXRlIGRhdGEgdG8gcGlwZSFcbiIpOworICAgICAgICAgIGV4aXQgKDEpOyAvKiBnaXZlIHVwLCB3ZSBzdWNrICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBieXRlc193cml0dGVuICs9IHJldDsKKyAgCisgIGlmIChieXRlc193cml0dGVuIDwgY291bnQpCisgICAgZ290byBhZ2FpbjsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2Vycl9hbmRfZXhpdCAoaW50IGZkLCBpbnQgbXNnKQoreworICBpbnQgZW4gPSBlcnJubzsKKworICBkb193cml0ZSAoZmQsICZtc2csIHNpemVvZiAobXNnKSk7CisgIGRvX3dyaXRlIChmZCwgJmVuLCBzaXplb2YgKGVuKSk7CisgIAorICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3BpZCAoaW50IGZkLCBwaWRfdCBwaWQpCit7CisgIGludCBtc2cgPSBDSElMRF9QSUQ7CisgIAorICBkb193cml0ZSAoZmQsICZtc2csIHNpemVvZiAobXNnKSk7CisgIGRvX3dyaXRlIChmZCwgJnBpZCwgc2l6ZW9mIChwaWQpKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3N0YXR1c19hbmRfZXhpdCAoaW50IGZkLCBpbnQgc3RhdHVzKQoreworICBpbnQgbXNnID0gQ0hJTERfRVhJVEVEOworICAKKyAgZG9fd3JpdGUgKGZkLCAmbXNnLCBzaXplb2YgKG1zZykpOworICBkb193cml0ZSAoZmQsICZzdGF0dXMsIHNpemVvZiAoc3RhdHVzKSk7CisgIAorICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2V4ZWMgKGludCAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfZXJyX3JlcG9ydF9mZCwKKwkgY2hhciAgICAgICAgICAgICAgICAgICAgKiphcmd2LAorCSBjaGFyICAgICAgICAgICAgICAgICAgICAqKmVudnAsCisJIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jICAgY2hpbGRfc2V0dXAsCisJIHZvaWQgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGludCBpLCBtYXhfb3BlbjsKKyNlbmRpZgorCisgIF9kYnVzX3ZlcmJvc2VfcmVzZXQgKCk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDaGlsZCBwcm9jZXNzIGhhcyBQSUQgIiBEQlVTX1BJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfZ2V0cGlkICgpKTsKKyAgCisgIGlmIChjaGlsZF9zZXR1cCkKKyAgICAoKiBjaGlsZF9zZXR1cCkgKHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBtYXhfb3BlbiA9IHN5c2NvbmYgKF9TQ19PUEVOX01BWCk7CisgIAorICBmb3IgKGkgPSAzOyBpIDwgbWF4X29wZW47IGkrKykKKyAgICB7CisgICAgICBpbnQgcmV0dmFsOworCisgICAgICBpZiAoaSA9PSBjaGlsZF9lcnJfcmVwb3J0X2ZkKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgcmV0dmFsID0gZmNudGwgKGksIEZfR0VURkQpOworCisgICAgICBpZiAocmV0dmFsICE9IC0xICYmICEocmV0dmFsICYgRkRfQ0xPRVhFQykpCisgICAgICAgIF9kYnVzX3dhcm4gKCJGZCAlZCBkaWQgbm90IGhhdmUgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZyBzZXQhXG4iLCBpKTsKKyAgICB9CisjZW5kaWYKKworICBpZiAoZW52cCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZW52aXJvbiAhPSBOVUxMKTsKKworICAgICAgZW52cCA9IGVudmlyb247CisgICAgfQorICAKKyAgZXhlY3ZlIChhcmd2WzBdLCBhcmd2LCBlbnZwKTsKKyAgCisgIC8qIEV4ZWMgZmFpbGVkICovCisgIHdyaXRlX2Vycl9hbmRfZXhpdCAoY2hpbGRfZXJyX3JlcG9ydF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICBDSElMRF9FWEVDX0ZBSUxFRCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19iYWJ5c2l0X2V2ZW50cyAocGlkX3QgZ3JhbmRjaGlsZF9waWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgcGFyZW50X3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgcmV2ZW50cykKK3sKKyAgcGlkX3QgcmV0OworICBpbnQgc3RhdHVzOworICAKKyAgZG8KKyAgICB7CisgICAgICByZXQgPSB3YWl0cGlkIChncmFuZGNoaWxkX3BpZCwgJnN0YXR1cywgV05PSEFORyk7CisgICAgICAvKiBUaGUgbWFuIHBhZ2Ugc2F5cyBFSU5UUiBjYW4ndCBoYXBwZW4gd2l0aCBXTk9IQU5HLAorICAgICAgICogYnV0IHRoZXJlIGFyZSByZXBvcnRzIG9mIGl0IChtYXliZSBvbmx5IHdpdGggdmFsZ3JpbmQ/KQorICAgICAgICovCisgICAgfQorICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBjaGlsZCBleGl0ZWRcbiIpOworICAgICAgCisgICAgICA7IC8qIG5vIGNoaWxkIGV4aXRlZCAqLworICAgIH0KKyAgZWxzZSBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzbid0IHN1cHBvc2VkIHRvIGhhcHBlbi4gKi8KKyAgICAgIF9kYnVzX3dhcm4gKCJ1bmV4cGVjdGVkIHdhaXRwaWQoKSBmYWlsdXJlIGluIGNoZWNrX2JhYnlzaXRfZXZlbnRzKCk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGVsc2UgaWYgKHJldCA9PSBncmFuZGNoaWxkX3BpZCkKKyAgICB7CisgICAgICAvKiBDaGlsZCBleGl0ZWQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWFwZWQgY2hpbGQgcGlkICVsZFxuIiwgKGxvbmcpIHJldCk7CisgICAgICAKKyAgICAgIHdyaXRlX3N0YXR1c19hbmRfZXhpdCAocGFyZW50X3BpcGUsIHN0YXR1cyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIndhaXRwaWQoKSByZWFwZWQgcGlkICVkIHRoYXQgd2UndmUgbmV2ZXIgaGVhcmQgb2ZcbiIsCisgICAgICAgICAgICAgICAgICAoaW50KSByZXQpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJiYWJ5c2l0dGVyIGdvdCBQT0xMSU4gZnJvbSBwYXJlbnQgcGlwZVxuIik7CisgICAgfQorCisgIGlmIChyZXZlbnRzICYgKF9EQlVTX1BPTExFUlIgfCBfREJVU19QT0xMSFVQKSkKKyAgICB7CisgICAgICAvKiBQYXJlbnQgaXMgZ29uZSwgc28gd2UganVzdCBleGl0ICovCisgICAgICBfZGJ1c192ZXJib3NlICgiYmFieXNpdHRlciBnb3QgUE9MTEVSUiBvciBQT0xMSFVQIGZyb20gcGFyZW50XG4iKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0KK30KKworc3RhdGljIGludCBiYWJ5c2l0X3NpZ2NobGRfcGlwZSA9IC0xOworCitzdGF0aWMgdm9pZAorYmFieXNpdF9zaWduYWxfaGFuZGxlciAoaW50IHNpZ25vKQoreworICBjaGFyIGIgPSAnXDAnOworIGFnYWluOgorICBpZiAod3JpdGUgKGJhYnlzaXRfc2lnY2hsZF9waXBlLCAmYiwgMSkgPD0gMCkgCisgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgZ290byBhZ2FpbjsKK30KKworc3RhdGljIHZvaWQKK2JhYnlzaXQgKHBpZF90IGdyYW5kY2hpbGRfcGlkLAorICAgICAgICAgaW50ICAgcGFyZW50X3BpcGUpCit7CisgIGludCBzaWdjaGxkX3BpcGVbMl07CisKKyAgLyogV2UgZG9uJ3QgZXhlYywgc28gd2Uga2VlcCBwYXJlbnQgc3RhdGUsIHN1Y2ggYXMgdGhlIHBpZCB0aGF0CisgICAqIF9kYnVzX3ZlcmJvc2UoKSB1c2VzLiBSZXNldCB0aGUgcGlkIGhlcmUuCisgICAqLworICBfZGJ1c192ZXJib3NlX3Jlc2V0ICgpOworICAKKyAgLyogSSB0aG91Z2h0IFNJR0NITEQgd291bGQganVzdCB3YWtlIHVwIHRoZSBwb2xsLCBidXQKKyAgICogdGhhdCBkaWRuJ3Qgc2VlbSB0byB3b3JrLCBzbyBhZGRlZCB0aGlzIHBpcGUuCisgICAqIFByb2JhYmx5IHRoZSBwaXBlIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgb24gYnVzdGVkCisgICAqIG9wZXJhdGluZyBzeXN0ZW1zIGFueWhvdy4KKyAgICovCisgIGlmIChwaXBlIChzaWdjaGxkX3BpcGUpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzIHRvIGNyZWF0ZSBwaXBlIGluIGJhYnlzaXR0ZXIgcHJvY2Vzc1xuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgYmFieXNpdF9zaWdjaGxkX3BpcGUgPSBzaWdjaGxkX3BpcGVbV1JJVEVfRU5EXTsKKworICBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKFNJR0NITEQsIGJhYnlzaXRfc2lnbmFsX2hhbmRsZXIpOworICAKKyAgd3JpdGVfcGlkIChwYXJlbnRfcGlwZSwgZ3JhbmRjaGlsZF9waWQpOworCisgIGNoZWNrX2JhYnlzaXRfZXZlbnRzIChncmFuZGNoaWxkX3BpZCwgcGFyZW50X3BpcGUsIDApOworCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgcGZkc1syXTsKKyAgICAgIAorICAgICAgcGZkc1swXS5mZCA9IHBhcmVudF9waXBlOworICAgICAgcGZkc1swXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBwZmRzWzBdLnJldmVudHMgPSAwOworCisgICAgICBwZmRzWzFdLmZkID0gc2lnY2hsZF9waXBlW1JFQURfRU5EXTsKKyAgICAgIHBmZHNbMV0uZXZlbnRzID0gX0RCVVNfUE9MTElOOworICAgICAgcGZkc1sxXS5yZXZlbnRzID0gMDsKKyAgICAgIAorICAgICAgaWYgKF9kYnVzX3BvbGwgKHBmZHMsIF9EQlVTX05fRUxFTUVOVFMgKHBmZHMpLCAtMSkgPCAwICYmIGVycm5vICE9IEVJTlRSKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIl9kYnVzX3BvbGwoKSBlcnJvcjogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChwZmRzWzBdLnJldmVudHMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX2JhYnlzaXRfZXZlbnRzIChncmFuZGNoaWxkX3BpZCwgcGFyZW50X3BpcGUsIHBmZHNbMF0ucmV2ZW50cyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBmZHNbMV0ucmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgYjsKKyAgICAgICAgICBpZiAocmVhZCAoc2lnY2hsZF9waXBlW1JFQURfRU5EXSwgJmIsIDEpID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBkbyB3YWl0cGlkIGNoZWNrICovCisgICAgICAgICAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBleGl0ICgxKTsKK30KKworLyoqCisgKiBTcGF3bnMgYSBuZXcgcHJvY2Vzcy4gVGhlIGNoaWxkX3NldHVwCisgKiBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIGdpdmVuIHVzZXJfZGF0YSBhbmQgaXMgcnVuIGluIHRoZSBjaGlsZAorICoganVzdCBiZWZvcmUgY2FsbGluZyBleGVjKCkuCisgKgorICogQWxzbyBjcmVhdGVzIGEgImJhYnlzaXR0ZXIiIHdoaWNoIHRyYWNrcyB0aGUgc3RhdHVzIG9mIHRoZQorICogY2hpbGQgcHJvY2VzcywgYWR2aXNpbmcgdGhlIHBhcmVudCBpZiB0aGUgY2hpbGQgZXhpdHMuCisgKiBJZiB0aGUgc3Bhd24gZmFpbHMsIG5vIGJhYnlzaXR0ZXIgaXMgY3JlYXRlZC4KKyAqIElmIHNpdHRlcl9wIGlzICNOVUxMLCBubyBiYWJ5c2l0dGVyIGlzIGtlcHQuCisgKgorICogQHBhcmFtIHNpdHRlcl9wIHJldHVybiBsb2NhdGlvbiBmb3IgYmFieXNpdHRlciBvciAjTlVMTAorICogQHBhcmFtIGxvZ19uYW1lIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRvIGxvZyBtZXNzYWdlcyBhYm91dCB0aGlzIHByb2Nlc3MgYmVpbmcgc3Bhd25lZAorICogQHBhcmFtIGFyZ3YgdGhlIGV4ZWN1dGFibGUgYW5kIGFyZ3VtZW50cworICogQHBhcmFtIGVudiB0aGUgZW52aXJvbm1lbnQsIG9yICNOVUxMIHRvIGNvcHkgdGhlIHBhcmVudCdzCisgKiBAcGFyYW0gY2hpbGRfc2V0dXAgZnVuY3Rpb24gdG8gY2FsbCBpbiBjaGlsZCBwcmUtZXhlYygpCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSBmb3Igc2V0dXAgZnVuY3Rpb24KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QgdG8gYmUgZmlsbGVkIGluIGlmIGZ1bmN0aW9uIGZhaWxzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgZXJyb3IgaXMgZmlsbGVkIGluCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICoqc2l0dGVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqbG9nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgKiplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jICAgY2hpbGRfc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBpbnQgY2hpbGRfZXJyX3JlcG9ydF9waXBlWzJdID0geyAtMSwgLTEgfTsKKyAgREJ1c1NvY2tldCBiYWJ5c2l0dGVyX3BpcGVbMl0gPSB7IERCVVNfU09DS0VUX0lOSVQsIERCVVNfU09DS0VUX0lOSVQgfTsKKyAgcGlkX3QgcGlkOworI2lmZGVmIEhBVkVfU1lTVEVNRAorICBpbnQgZmRfb3V0ID0gLTE7CisgIGludCBmZF9lcnIgPSAtMTsKKyNlbmRpZgorICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAoYXJndlswXSAhPSBOVUxMKTsKKworICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAqc2l0dGVyX3AgPSBOVUxMOworCisgIHNpdHRlciA9IE5VTEw7CisKKyAgc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9uZXcgKCk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2l0dGVyLT5sb2dfbmFtZSA9IF9kYnVzX3N0cmR1cCAobG9nX25hbWUpOworICBpZiAoc2l0dGVyLT5sb2dfbmFtZSA9PSBOVUxMICYmIGxvZ19uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisgICAgfQorCisgIGlmIChzaXR0ZXItPmxvZ19uYW1lID09IE5VTEwpCisgICAgc2l0dGVyLT5sb2dfbmFtZSA9IF9kYnVzX3N0cmR1cCAoYXJndlswXSk7CisKKyAgaWYgKHNpdHRlci0+bG9nX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgIAorICBpZiAoIW1ha2VfcGlwZSAoY2hpbGRfZXJyX3JlcG9ydF9waXBlLCBlcnJvcikpCisgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworCisgIGlmICghX2RidXNfc29ja2V0cGFpciAoJmJhYnlzaXR0ZXJfcGlwZVswXSwgJmJhYnlzaXR0ZXJfcGlwZVsxXSwgVFJVRSwgZXJyb3IpKQorICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKworICAvKiBTZXR0aW5nIHVwIHRoZSBiYWJ5c2l0dGVyIGlzIG9ubHkgdXNlZnVsIGluIHRoZSBwYXJlbnQsCisgICAqIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJ1biBvdXQgb2YgbWVtb3J5IGFuZCBmYWlsCisgICAqIGFmdGVyIHdlJ3ZlIGFscmVhZHkgZm9ya2VkLCBzaW5jZSB0aGVuIHdlJ2QgbGVhaworICAgKiBjaGlsZCBwcm9jZXNzZXMgZXZlcnl3aGVyZS4KKyAgICovCisgIHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIGhhbmRsZV93YXRjaCwgc2l0dGVyLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgICAgICAgIAorICBpZiAoIV9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPmVycm9yX3dhdGNoKSkKKyAgICB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGZyZWUgaXQgZWFybHkgc28gdGhlIGRlc3RydWN0b3Igd29uJ3QgdHJ5IHRvIHJlbW92ZSBpdAorICAgICAgICogd2l0aG91dCBpdCBoYXZpbmcgYmVlbiBhZGRlZCwgd2hpY2ggREJ1c0xvb3AgZG9lc24ndCBhbGxvdyAqLworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBzaXR0ZXItPmVycm9yX3dhdGNoID0gTlVMTDsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisgICAgfQorICAgICAgCisgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChiYWJ5c2l0dGVyX3BpcGVbMF0uZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgICAgICAKKyAgaWYgKCFfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpKQorICAgIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gZnJlZSBpdCBlYXJseSBzbyB0aGUgZGVzdHJ1Y3RvciB3b24ndCB0cnkgdG8gcmVtb3ZlIGl0CisgICAgICAgKiB3aXRob3V0IGl0IGhhdmluZyBiZWVuIGFkZGVkLCB3aGljaCBEQnVzTG9vcCBkb2Vzbid0IGFsbG93ICovCisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgLyogVGhpcyBtYXkgZmFpbCwgYnV0IGl0J3Mgbm90IGNyaXRpY2FsLgorICAgKiBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSB3ZXJlIGNvbXBpbGVkIHdpdGggam91cm5hbGQgc3VwcG9ydCBidXQgYXJlIG5vdworICAgKiBydW5uaW5nIG9uIGEgbm9uLXN5c3RlbWQgc3lzdGVtLCB0aGlzIGlzIGdvaW5nIHRvIGZhaWwsIHNvIHdlCisgICAqIGhhdmUgdG8gY29wZSBncmFjZWZ1bGx5LiAqLworICBmZF9vdXQgPSBzZF9qb3VybmFsX3N0cmVhbV9mZCAoc2l0dGVyLT5sb2dfbmFtZSwgTE9HX0lORk8sIEZBTFNFKTsKKyAgZmRfZXJyID0gc2Rfam91cm5hbF9zdHJlYW1fZmQgKHNpdHRlci0+bG9nX25hbWUsIExPR19XQVJOSU5HLCBGQUxTRSk7CisjZW5kaWYKKworICBwaWQgPSBmb3JrICgpOworICAKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZPUktfRkFJTEVELAorCQkgICAgICAiRmFpbGVkIHRvIGZvcmsgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgZWxzZSBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogSW1tZWRpYXRlIGNoaWxkLCB0aGlzIGlzIHRoZSBiYWJ5c2l0dGVyIHByb2Nlc3MuICovCisgICAgICBpbnQgZ3JhbmRjaGlsZF9waWQ7CisgICAgICAKKyAgICAgIC8qIEJlIHN1cmUgd2UgY3Jhc2ggaWYgdGhlIHBhcmVudCBleGl0cworICAgICAgICogYW5kIHdlIHdyaXRlIHRvIHRoZSBlcnJfcmVwb3J0X3BpcGUKKyAgICAgICAqLworICAgICAgc2lnbmFsIChTSUdQSVBFLCBTSUdfREZMKTsKKworICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGVuZCBvZiB0aGUgcGlwZXMuICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMF0uZmQpOworICAgICAgCisgICAgICAvKiBDcmVhdGUgdGhlIGNoaWxkIHRoYXQgd2lsbCBleGVjICgpICovCisgICAgICBncmFuZGNoaWxkX3BpZCA9IGZvcmsgKCk7CisgICAgICAKKyAgICAgIGlmIChncmFuZGNoaWxkX3BpZCA8IDApCisJeworCSAgd3JpdGVfZXJyX2FuZF9leGl0IChiYWJ5c2l0dGVyX3BpcGVbMV0uZmQsCisJCQkgICAgICBDSElMRF9GT1JLX0ZBSUxFRCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgd3JpdGVfZXJyX2FuZF9leGl0KCkiKTsKKwl9CisgICAgICBlbHNlIGlmIChncmFuZGNoaWxkX3BpZCA9PSAwKQorICAgICAgeworI2lmZGVmIF9fbGludXhfXworICAgICAgICAgIGludCBmZCA9IC0xOworCisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgZmQgPSBvcGVuICgiL3Byb2Mvc2VsZi9vb21fc2NvcmVfYWRqIiwgT19XUk9OTFkgfCBPX0NMT0VYRUMpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmZCA9IG9wZW4gKCIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiLCBPX1dST05MWSk7CisgICAgICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChmZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHdyaXRlIChmZCwgIjAiLCBzaXplb2YgKGNoYXIpKSA8IDApCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIndyaXRpbmcgb29tX3Njb3JlX2FkaiBlcnJvcjogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgLyogR28gYmFjayB0byBpZ25vcmluZyBTSUdQSVBFLCBzaW5jZSBpdCdzIGV2aWwKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworCisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMV0uZmQpOworI2lmZGVmIEhBVkVfU1lTVEVNRAorCSAgLyogbG9nIHRvIHN5c3RlbWQgam91cm5hbCBpZiBwb3NzaWJsZSAqLworCSAgaWYgKGZkX291dCA+PSAwKQorICAgICAgICAgICAgZHVwMiAoZmRfb3V0LCBTVERPVVRfRklMRU5PKTsKKwkgIGlmIChmZF9lcnIgPj0gMCkKKyAgICAgICAgICAgIGR1cDIgKGZkX2VyciwgU1RERVJSX0ZJTEVOTyk7CisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9vdXQpOworICAgICAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfZXJyKTsKKyNlbmRpZgorCSAgZG9fZXhlYyAoY2hpbGRfZXJyX3JlcG9ydF9waXBlW1dSSVRFX0VORF0sCisJCSAgIGFyZ3YsCisJCSAgIGVudiwKKwkJICAgY2hpbGRfc2V0dXAsIHVzZXJfZGF0YSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgZXhlYygpIC0gc2hvdWxkIGhhdmUgZXhpdGVkIG9uIGVycm9yIik7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgICAgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmZkX291dCk7CisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9lcnIpOworI2VuZGlmCisgICAgICAgICAgYmFieXNpdCAoZ3JhbmRjaGlsZF9waWQsIGJhYnlzaXR0ZXJfcGlwZVsxXS5mZCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgYmFieXNpdCgpIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIC8qIENsb3NlIHRoZSB1bmNhcmVkLWFib3V0IGVuZHMgb2YgdGhlIHBpcGVzICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzFdLmZkKTsKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfb3V0KTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfZXJyKTsKKyNlbmRpZgorCisgICAgICBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyID0gYmFieXNpdHRlcl9waXBlWzBdOworICAgICAgYmFieXNpdHRlcl9waXBlWzBdLmZkID0gLTE7CisgICAgICAKKyAgICAgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gY2hpbGRfZXJyX3JlcG9ydF9waXBlW1JFQURfRU5EXTsKKyAgICAgIGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0gPSAtMTsKKworICAgICAgc2l0dGVyLT5zaXR0ZXJfcGlkID0gcGlkOworCisgICAgICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAgICAgKnNpdHRlcl9wID0gc2l0dGVyOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnYpOworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgY2xlYW51cF9hbmRfZmFpbDoKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIAorICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0pOworICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMF0uZmQpOworICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmJhYnlzaXR0ZXJfcGlwZVsxXS5mZCk7CisjaWZkZWYgSEFWRV9TWVNURU1ECisgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfb3V0KTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9lcnIpOworI2VuZGlmCisKKyAgaWYgKHNpdHRlciAhPSBOVUxMKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3Jlc3VsdF9mdW5jdGlvbiAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyAgZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBzaXR0ZXItPmZpbmlzaGVkX2NiID0gZmluaXNoZWQ7CisgIHNpdHRlci0+ZmluaXNoZWRfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitzdGF0aWMgY2hhciAqCitnZXRfdGVzdF9leGVjIChjb25zdCBjaGFyICpleGUsCisgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpzY3JhdGNoX3NwYWNlKQoreworICBjb25zdCBjaGFyICpkYnVzX3Rlc3RfZXhlYzsKKworICBkYnVzX3Rlc3RfZXhlYyA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9FWEVDIik7CisKKyAgaWYgKGRidXNfdGVzdF9leGVjID09IE5VTEwpCisgICAgZGJ1c190ZXN0X2V4ZWMgPSBEQlVTX1RFU1RfRVhFQzsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChzY3JhdGNoX3NwYWNlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzY3JhdGNoX3NwYWNlLCAiJXMvJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdGVzdF9leGVjLCBleGUsIERCVVNfRVhFRVhUKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoc2NyYXRjaF9zcGFjZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoc2NyYXRjaF9zcGFjZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSkKKyAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBUUlVFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9ub25leGlzdGVudCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgYmluYXJ5ICovCisgIAorICBhcmd2WzBdID0gIi90aGlzL2RvZXMvbm90L2V4aXN0LzMyNTQyc2RnYWZnYWZkZyI7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9ub25leGlzdGVudCIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX3NlZ2ZhdWx0ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNTdHJpbmcgYXJndjA7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzZWdmYXVsdCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3Qtc2VnZmF1bHQiLCAmYXJndjApOworCisgIGlmIChhcmd2WzBdID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NIHdhcyBzaW11bGF0ZWQsIG5ldmVyIG1pbmQgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCAic3Bhd25fc2VnZmF1bHQiLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXJndjApOworCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX2V4aXQgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIGV4aXQgZmFpbHVyZSBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3QtZXhpdCIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCwgbmV2ZXIgbWluZCAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9leGl0IiwgYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3YwKTsKKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIGJpbmFyeSB0aGF0IGV4aXRlZCB3aXRoIGZhaWx1cmUgY29kZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGxhdW5jaGluZyBleGl0aW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9hbmRfa2lsbCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzU3RyaW5nIGFyZ3YwOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgc2xlZXBpbmcgYmluYXJ5IHRoZW4ga2lsbGluZyBpdCAqLworCisgIGFyZ3ZbMF0gPSBnZXRfdGVzdF9leGVjICgidGVzdC1zbGVlcC1mb3JldmVyIiwgJmFyZ3YwKTsKKworICBpZiAoYXJndlswXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9PTSB3YXMgc2ltdWxhdGVkLCBuZXZlciBtaW5kICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgInNwYXduX2FuZF9raWxsIiwgYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKHNpdHRlcik7CisgICAgICAKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICAKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGFmdGVyIGtpbGxpbmcgc3Bhd25lZCBiaW5hcnlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGtpbGxpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfc3Bhd25fdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX25vbmV4aXN0ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fbm9uZXhpc3RlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fc2VnZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9zZWdmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9leGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9hbmRfa2lsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2FuZF9raWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNwYXduLmggYi9kYnVzL2RidXMtc3Bhd24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJhYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNwYXduLmgKQEAgLTAsMCArMSw2OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNwYXduLmggV3JhcHBlciBhcm91bmQgZm9yay9leGVjCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TUEFXTl9ICisjZGVmaW5lIERCVVNfU1BBV05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHZvaWQgKCogREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMpICh2b2lkICp1c2VyX2RhdGEpOworCit0eXBlZGVmIHN0cnVjdCBEQnVzQmFieXNpdHRlciBEQnVzQmFieXNpdHRlcjsKKwordHlwZWRlZiB2b2lkICgqIERCdXNCYWJ5c2l0dGVyRmluaXNoZWRGdW5jKSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICp1c2VyX2RhdGEpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgKipzaXR0ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKmxvZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jICAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfcmVzdWx0X2Z1bmN0aW9uICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0JhYnlzaXR0ZXJGaW5pc2hlZEZ1bmMgZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworREJ1c0JhYnlzaXR0ZXIqIF9kYnVzX2JhYnlzaXR0ZXJfcmVmICAgICAgICAgICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgICAgICAgICAgICAgICAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlcik7Cit2b2lkICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgICAgICAgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOworZGJ1c19ib29sX3QgX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NQQVdOX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIGIvZGJ1cy9kYnVzLXN0cmluZy1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2ZGU5MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXByaXZhdGUuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX1BSSVZBVEVfSAorI2RlZmluZSBEQlVTX1NUUklOR19QUklWQVRFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisKKyNpZm5kZWYgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUKKyNlcnJvciAiRG9uJ3QgZ28gaW5jbHVkaW5nIGRidXMtc3RyaW5nLXByaXZhdGUuaCBmb3Igbm8gZ29vZCByZWFzb24iCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c1N0cmluZy4KKyAqIAorICogREJ1c1N0cmluZyBpbnRlcm5hbHMuIERCdXNTdHJpbmcgaXMgYW4gb3BhcXVlIG9iamVjdHMsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciAqc3RyOyAgICAgICAgICAgIC8qKjwgU3RyaW5nIGRhdGEsIHBsdXMgbnVsIHRlcm1pbmF0aW9uICovCisgIGludCAgICAgICAgICAgIGxlbjsgICAgICAgICAgICAvKio8IExlbmd0aCB3aXRob3V0IG51bCAqLworICBpbnQgICAgICAgICAgICBhbGxvY2F0ZWQ7ICAgICAgLyoqPCBBbGxvY2F0ZWQgc2l6ZSBvZiBkYXRhICovCisgIHVuc2lnbmVkIGludCAgIGNvbnN0YW50IDogMTsgICAvKio8IFN0cmluZyBkYXRhIGlzIG5vdCBvd25lZCBieSBEQnVzU3RyaW5nICovCisgIHVuc2lnbmVkIGludCAgIGxvY2tlZCA6IDE7ICAgICAvKio8IERCdXNTdHJpbmcgaGFzIGJlZW4gbG9ja2VkIGFuZCBjYW4ndCBiZSBjaGFuZ2VkICovCisgIHVuc2lnbmVkIGludCAgIGludmFsaWQgOiAxOyAgICAvKio8IERCdXNTdHJpbmcgaXMgaW52YWxpZCAoZS5nLiBhbHJlYWR5IGZyZWVkKSAqLworICB1bnNpZ25lZCBpbnQgICBhbGlnbl9vZmZzZXQgOiAzOyAvKio8IHN0ciAtIGFsaWduX29mZnNldCBpcyB0aGUgYWN0dWFsIG1hbGxvYyBibG9jayAqLworfSBEQnVzUmVhbFN0cmluZzsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzUmVhbFN0cmluZykgPT0gc2l6ZW9mIChEQnVzU3RyaW5nKSk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTdHJpbmdJbnRlcm5hbHMgREJ1c1N0cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNTdHJpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNTdHJpbmcuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIERCdXNTdHJpbmcKKyAqLworI2RlZmluZSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCAoX0RCVVNfSU5UMzJfTUFYIC0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykKKworLyoqCisgKiBDaGVja3MgYSBidW5jaCBvZiBhc3NlcnRpb25zIGFib3V0IGEgc3RyaW5nIG9iamVjdAorICoKKyAqIEBwYXJhbSByZWFsIHRoZSBEQnVzUmVhbFN0cmluZworICovCisjZGVmaW5lIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUocmVhbCkgXAorICBkbyB7IFwKKyAgICAgICh2b2lkKSByZWFsOyAvKiBtaWdodCBiZSB1bnVzZWQgdW5sZXNzIGFzc2VydGluZyAqLyBcCisgICAgICBfZGJ1c19hc3NlcnQgKChyZWFsKSAhPSBOVUxMKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5pbnZhbGlkKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA+PSAwKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmFsbG9jYXRlZCA+PSAwKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA8PSAoKHJlYWwpLT5hbGxvY2F0ZWQgLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKSk7IFwKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJlYWwpLT5sZW4gPD0gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpOyBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUKKyAqIG1vZGlmaWFibGUgLSBtYXkgbm90IGJlIGxvY2tlZCBvciBjb25zdC4gQWxzbyBkZWNsYXJlcworICogdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4gCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLworI2RlZmluZSBEQlVTX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5jb25zdGFudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCEocmVhbCktPmxvY2tlZCkKKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBhYm91dCBhIHN0cmluZyBvYmplY3QgdGhhdCBtYXkgYmUgbG9ja2VkIGJ1dAorICogY2FuJ3QgYmUgY29uc3QuIGkuZS4gYSBzdHJpbmcgb2JqZWN0IHRoYXQgd2UgY2FuIGZyZWUuICBBbHNvCisgKiBkZWNsYXJlcyB0aGUgInJlYWwiIHZhcmlhYmxlIHBvaW50aW5nIHRvIERCdXNSZWFsU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCisjZGVmaW5lIERCVVNfTE9DS0VEX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIShyZWFsKS0+Y29uc3RhbnQpCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgdGhhdCBtYXkgYmUgY29uc3Qgb3IgbG9ja2VkLiAgQWxzbworICogZGVjbGFyZXMgdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4KKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZy4KKyAqLworI2RlZmluZSBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRShzdHIpIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSBibGFuayBieXRlCisgKiBAcGFyYW0gYyB0aGUgYnl0ZQorICovCisjZGVmaW5lIERCVVNfSVNfQVNDSUlfQkxBTksoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSB3aGl0ZXNwYWNlIGJ5dGUKKyAqIEBwYXJhbSBjIHRoZSBieXRlCisgKi8KKyNkZWZpbmUgREJVU19JU19BU0NJSV9XSElURShjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1xuJyB8fCAoYykgPT0gJ1xyJykKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NUUklOR19QUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jIGIvZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYmMwNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jCkBAIC0wLDAgKzEsOTM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLXN0cmluZy5jLCBidXQgbm90IHVzZWQgaW4gbGliZGJ1cworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtc3RyaW5nLXByaXZhdGUuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4CisgKgorICogQHRvZG8gbWVtY21wIG1pZ2h0IG1ha2UgdGhpcyBmYXN0ZXIuCisgKiAKKyAqIEBwYXJhbSBhIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBjX3N0ciB0aGUgQy1zdHlsZSBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzdWZmaXgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgdW5zaWduZWQgbG9uZyBjX3N0cl9sZW47CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgY19zdHJfbGVuID0gc3RybGVuIChjX3N0cik7CisgIGlmICgoKHVuc2lnbmVkIGxvbmcpcmVhbF9hLT5sZW4pIDwgY19zdHJfbGVuKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwID0gcmVhbF9hLT5zdHIgKyAocmVhbF9hLT5sZW4gLSBjX3N0cl9sZW4pOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKCphcCA9PSAnXDAnKTsKKyAgX2RidXNfYXNzZXJ0ICgqYnAgPT0gJ1wwJyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBnaXZlbiBieXRlIHNjYW5uaW5nIGJhY2t3YXJkIGZyb20gdGhlIGdpdmVuIHN0YXJ0LgorICogU2V0cyAqZm91bmQgdG8gLTEgaWYgdGhlIGJ5dGUgaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBwbGFjZSB0byBzdGFydCBzY2FubmluZyAod2lsbCBub3QgZmluZCB0aGUgYnl0ZSBhdCB0aGlzIHBvaW50KQorICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gZmluZAorICogQHBhcmFtIGZvdW5kIHJldHVybiBsb2NhdGlvbiBmb3Igd2hlcmUgaXQgd2FzIGZvdW5kCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChmb3VuZCAhPSBOVUxMKTsKKworICBpID0gc3RhcnQgLSAxOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gYnl0ZSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IGk7CisKKyAgcmV0dXJuIGkgPj0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCit0ZXN0X2hleF9yb3VuZHRyaXAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJ1c1N0cmluZyBvcmlnOworICBEQnVzU3RyaW5nIGVuY29kZWQ7CisgIERCdXNTdHJpbmcgZGVjb2RlZDsKKyAgaW50IGVuZDsKKworICBpZiAobGVuIDwgMCkKKyAgICBsZW4gPSBzdHJsZW4gKGRhdGEpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm9yaWcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbmNvZGVkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmb3JpZywgZGF0YSwgbGVuKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhcHBlbmQgb3JpZyBkYXRhIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJm9yaWcsIDAsICZlbmNvZGVkLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgZW5jb2RlIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmVuY29kZWQsIDAsICZlbmQsICZkZWNvZGVkLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgZGVjb2RlIik7CisgICAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlbmNvZGVkKSA9PSBlbmQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsICgmb3JpZywgJmRlY29kZWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAKKyAgICAgIHByaW50ZiAoIk9yaWdpbmFsIHN0cmluZyAlZCBieXRlcyBlbmNvZGVkICVkIGJ5dGVzIGRlY29kZWQgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3JpZyksCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZW5jb2RlZCksCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCkpOworICAgICAgcHJpbnRmICgiT3JpZ2luYWw6ICVzXG4iLCBkYXRhKTsKKyAgICAgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZkZWNvZGVkKTsKKyAgICAgIHByaW50ZiAoIkRlY29kZWQ6ICVzXG4iLCBzKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9yaWdpbmFsIHN0cmluZyBub3QgdGhlIHNhbWUgYXMgc3RyaW5nIGRlY29kZWQgZnJvbSBoZXgiKTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJm9yaWcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOyAgCit9CisKK3R5cGVkZWYgdm9pZCAoKiBUZXN0Um91bmR0cmlwRnVuYykgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4pOworc3RhdGljIHZvaWQKK3Rlc3Rfcm91bmR0cmlwcyAoVGVzdFJvdW5kdHJpcEZ1bmMgZnVuYykKK3sKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4iLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMSIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMiIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMjMiLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMTIzNCIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMjM0NSIsIC0xKTsKKyAgKCogZnVuYykgKCIiLCAwKTsKKyAgKCogZnVuYykgKCIxIiwgMSk7CisgICgqIGZ1bmMpICgiMTIiLCAyKTsKKyAgKCogZnVuYykgKCIxMjMiLCAzKTsKKyAgKCogZnVuYykgKCIxMjM0IiwgNCk7CisgICgqIGZ1bmMpICgiMTIzNDUiLCA1KTsKKyAgKCogZnVuYykgKCIiLCAxKTsKKyAgKCogZnVuYykgKCIxIiwgMik7CisgICgqIGZ1bmMpICgiMTIiLCAzKTsKKyAgKCogZnVuYykgKCIxMjMiLCA0KTsKKyAgKCogZnVuYykgKCIxMjM0IiwgNSk7CisgICgqIGZ1bmMpICgiMTIzNDUiLCA2KTsKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisgICAgaW50IGk7CisgICAgCisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChidWYpKQorICAgICAgeworICAgICAgICBidWZbaV0gPSBpOworICAgICAgICArK2k7CisgICAgICB9CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChidWYpKQorICAgICAgeworICAgICAgICAoKiBmdW5jKSAoYnVmLCBpKTsKKyAgICAgICAgKytpOworICAgICAgfQorICB9Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c1N0cmluZ0ludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzU3RyaW5nLgorICoKKyAqIEB0b2RvIE5lZWQgdG8gd3JpdGUgdGVzdHMgZm9yIF9kYnVzX3N0cmluZ19jb3B5KCkgYW5kCisgKiBfZGJ1c19zdHJpbmdfbW92ZSgpIG1vdmluZyB0by9mcm9tIGVhY2ggb2Ygc3RhcnQvbWlkZGxlL2VuZCBvZiBhCisgKiBzdHJpbmcuIEFsc28gbmVlZCB0ZXN0cyBmb3IgX2RidXNfc3RyaW5nX21vdmVfbGVuICgpCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIERCdXNTdHJpbmcgb3RoZXI7CisgIGludCBpLCBhLCBlbmQ7CisgIGxvbmcgdjsKKyAgaW50IGxlbnNbXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgMTAsIDE2LCAxNywgMTgsIDI1LCAzMSwgMzIsIDMzLCAzNCwgMzUsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiB9OworICBjaGFyICpzOworCisgIC8qIFRlc3Qgc2hvcnRlbmluZyBhbmQgc2V0dGluZyBsZW5ndGggKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAobGVucykpCisgICAgeworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgbGVuc1tpXSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzZXQgc3RyaW5nIGxlbmd0aCIpOworCisgICAgICBqID0gbGVuc1tpXTsKKyAgICAgIHdoaWxlIChqID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGopOworICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKCZzdHIsIDEpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAoaiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAtLWo7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIFRlc3QgZXF1YWxpdHkgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiSCIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDAsIDEsICZvdGhlciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDEsIDAsICZvdGhlciwgMSkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiSGVsbG8iKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAwLCA1LCAmb3RoZXIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxLCA0LCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAyLCAzLCAmb3RoZXIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAzLCAyLCAmb3RoZXIsIDMpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA0LCAxLCAmb3RoZXIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA1LCAwLCAmb3RoZXIsIDUpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMCwgNSwgJnN0ciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMSwgNCwgJnN0ciwgMSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMiwgMywgJnN0ciwgMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMywgMiwgJnN0ciwgMykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNCwgMSwgJnN0ciwgNCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNSwgMCwgJnN0ciwgNSkpOworCisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiV29ybGQiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA2LCAgNSwgJm90aGVyLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNywgIDQsICZvdGhlciwgMSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDgsICAzLCAmb3RoZXIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA5LCAgMiwgJm90aGVyLCAzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMTAsIDEsICZvdGhlciwgNCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDExLCAwLCAmb3RoZXIsIDUpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMCwgNSwgJnN0ciwgNikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMSwgNCwgJnN0ciwgNykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMiwgMywgJnN0ciwgOCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMywgMiwgJnN0ciwgOSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNCwgMSwgJnN0ciwgMTApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDUsIDAsICZzdHIsIDExKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICAvKiBUZXN0IGFwcGVuZGluZyBkYXRhICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImEiKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBzdHJpbmcgdG8gc3RyaW5nXG4iKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSAqIDIgKyAxKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICdiJykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgYnl0ZSB0byBzdHJpbmdcbiIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpICogMiArIDIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIENoZWNrIHN0ZWFsX2RhdGEgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzdGVhbCBkYXRhIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoKChpbnQpc3RybGVuIChzKSkgPT0gaSk7CisKKyAgZGJ1c19mcmVlIChzKTsKKworICAvKiBDaGVjayBtb3ZlICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnN0ciwgMCwgJm90aGVyLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgbW92ZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBtb3ZlIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnN0ciwgMCwgJm90aGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAvIDIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBtb3ZlIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDMpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisKKyAgLyogQ2hlY2sgY29weSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnN0ciwgMCwgJm90aGVyLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgY29weSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBjb3B5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIFdvcmxkSGVsbG8gV29ybGQiKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnN0ciwgMCwgJm90aGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAvIDIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBjb3B5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIFdvcmxkSGVsbG8gV29ybGRIZWxsbyBXb3JsZCIpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisKKyAgLyogQ2hlY2sgcmVwbGFjZSAqLworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsICJIZWxsbyBXb3JsZCIpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDUsIDEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIGNlbnRlciBzcGFjZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyIC0gMSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9IZWxsbyBXb3JsZFdvcmxkIikpOworCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIGVuZCBjaGFyYWN0ZXIiKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyIC0gMSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9IZWxsbyBXb3JsZFdvcmxlIikpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisKKyAgLyogRGlmZmVyZW50IHRlc3RzIGFyZSBwcm92aWRlZCBiZWNhdXNlIGRpZmZlcmVudCBiZWhhdmlvdXJzIGFyZQorICAgKiBpbXBsZW1lbnRlZCBpbiBfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4oKSBpbiBmdW5jdGlvbiBvZiByZXBsYWNpbmcgYW5kCisgICAqIHJlcGxhY2VkIGxlbmd0aHMKKyAgICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmb3RoZXIsICJGb28gU3RyaW5nIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBhID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDAsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDQsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIDAgbGVuZ3RoIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyBIZWxsbyBTdHJpbmciKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDUsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIGF0IHRoZSBlbmQiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgNiArIDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyBIZWxsbyBTdHJpbmcgV29ybGQiKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDAsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAtIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBzYW1lIGxlbmd0aCIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyA2ICsgNik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIEhlbGxvIFN0cmluZyBIZWxsbyIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgNiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwgNCwgMTIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIHdpdGggc2hvcnRlciBzdHJpbmciKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgNSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIFdvcmxkIEhlbGxvIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCAwLCAzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBhdCB0aGUgYmVnaW5uaW5nIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkggV29ybGQgSGVsbG8iKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDYsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAtIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBzYW1lIGxlbmd0aCIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyAzKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIIFdvcmxkIFdvcmxkIikpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisKKyAgLyogQ2hlY2sgaW5zZXJ0L3NldC9nZXQgYnl0ZSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIEhlbGxvIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDApID09ICdIJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxKSA9PSAnZScpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMikgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDMpID09ICdsJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA0KSA9PSAnbycpOworCisgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoJnN0ciwgMSwgJ3EnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDEpID09ICdxJyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmc3RyLCAwLCAxLCAyNTUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNhbid0IGluc2VydCBieXRlIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmc3RyLCAyLCA0LCAnWicpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNhbid0IGluc2VydCBieXRlIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksIDEsICdXJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgaW5zZXJ0IGJ5dGUiKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAwKSA9PSAyNTUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMSkgPT0gJ0gnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDIpID09ICdaJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAzKSA9PSAnWicpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNCkgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDUpID09ICdaJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA2KSA9PSAncScpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNykgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDgpID09ICdsJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA5KSA9PSAnbycpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMTApID09ICdXJyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAKKyAgLyogQ2hlY2sgYXBwZW5kL3BhcnNlIGludC9kb3VibGUgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIDI3KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGludCIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmc3RyLCAwLCAmdiwgJmVuZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBhcnNlIGludCIpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSAyNyk7CisgIF9kYnVzX2Fzc2VydCAoZW5kID09IGkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBUZXN0IGZpbmQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhcHBlbmQgdG8gc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSGUiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ0hlJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIkhlbGxvIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdIZWxsbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgImVsbG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2VsbG8nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAxKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAibG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2xvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMiwgImxvIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdsbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDMpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgNCwgImxvIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZCBmaW5kICdsbyciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJsIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICdsJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIkgiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ0gnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiIiwgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBmaW5kICcnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgIkhlbGxvISIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdIZWxsbyEnIik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiT2gsIEhlbGxvIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ09oLCBIZWxsbyciKTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgImlsbCIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdpbGwnIik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAicSIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdxJyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIDAsIDIsICJIZSIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCBmaW5kICdIZSciKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIDAsIDIsICJIZWxsbyIsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdIZWxsbyciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwgJ0gnLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBmaW5kICdIJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksICdvJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBub3QgZmluZCAnbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIDEpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSAxLCAnbycsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IC0xKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgMSwgJ2UnLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ2UnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAtMSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCAyLCAnZScsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgZmluZCAnZSciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDEpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIEhleCBlbmNvZGluZyAqLworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImNhZmViYWJlLCB0aGlzIGlzIGEgYm9ndXMgaGV4IHN0cmluZyIpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3RoZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZzdHIsIDAsICZlbmQsICZvdGhlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGVjY29kZWQgYm9ndXMgaGV4IHN0cmluZyB3aXRoIG5vIGVycm9yIik7CisKKyAgX2RidXNfYXNzZXJ0IChlbmQgPT0gOCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisKKyAgdGVzdF9yb3VuZHRyaXBzICh0ZXN0X2hleF9yb3VuZHRyaXApOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaW50IGZvdW5kLCBmb3VuZF9sZW47ICAKKworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiMDEyXHJcbjU2N1xuOTAiKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSB8fCBmb3VuZCAhPSAzIHx8IGZvdW5kX2xlbiAhPSAyKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBmaW5kICdcXHJcXG4nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGZvdW5kICE9IDMgfHwgZm91bmRfbGVuICE9IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgcmV0dXJuIHZhbHVlcyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCA1LCAmZm91bmQsICZmb3VuZF9sZW4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBmaW5kICdcXG4nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGZvdW5kICE9IDggfHwgZm91bmRfbGVuICE9IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgcmV0dXJuIHZhbHVlcyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDksICZmb3VuZCwgJmZvdW5kX2xlbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRm91bmQgbm90IGV4cGVjdGVkICdcXG4nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZWxzZSBpZiAoZm91bmQgIT0gMTEgfHwgZm91bmRfbGVuICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgcmV0dXJuIHZhbHVlcyAnXFxuJyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgZm91bmQgPSAtMTsKKyAgICBmb3VuZF9sZW4gPSAtMTsKKyAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgIiIpOworICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDAsICZmb3VuZCwgJmZvdW5kX2xlbikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmb3VuZCBhbiBlb2wgaW4gYW4gZW1wdHkgc3RyaW5nIik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZCA9PSAwKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kX2xlbiA9PSAwKTsKKyAgICAKKyAgICBmb3VuZCA9IC0xOworICAgIGZvdW5kX2xlbiA9IC0xOworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiZm9vYmFyIik7CisgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZvdW5kIGVvbCBpbiBzdHJpbmcgdGhhdCBsYWNrcyBvbmUiKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kID09IDYpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmRfbGVuID09IDApOworCisgICAgZm91bmQgPSAtMTsKKyAgICBmb3VuZF9sZW4gPSAtMTsKKyAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImZvb2JhclxuIik7CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDAsICZmb3VuZCwgJmZvdW5kX2xlbikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGZpbmQgZW9sIGluIHN0cmluZyB0aGF0IGhhcyBvbmUgYXQgZW5kIik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZCA9PSA2KTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kX2xlbiA9PSAxKTsKKyAgfQorCisgIHsKKyAgICBEQnVzU3RyaW5nIGxpbmU7CisKKyNkZWZpbmUgRklSU1RfTElORSAidGhpcyBpcyBhIGxpbmUiCisjZGVmaW5lIFNFQ09ORF9MSU5FICJ0aGlzIGlzIGEgc2Vjb25kIGxpbmUiCisgICAgLyogdGhpcmQgbGluZSBpcyBlbXB0eSAqLworI2RlZmluZSBUSElSRF9MSU5FICIiCisjZGVmaW5lIEZPVVJUSF9MSU5FICJ0aGlzIGlzIGEgZm91cnRoIGxpbmUiCisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgRklSU1RfTElORSAiXG4iIFNFQ09ORF9MSU5FICJcclxuIiBUSElSRF9MSU5FICJcbiIgRk9VUlRIX0xJTkUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZzdHIsICZsaW5lKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBwb3AgZmlyc3QgbGluZSIpOworCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZsaW5lLCBGSVJTVF9MSU5FKSk7CisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZzdHIsICZsaW5lKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBwb3Agc2Vjb25kIGxpbmUiKTsKKworICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmbGluZSwgU0VDT05EX0xJTkUpKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCB0aGlyZCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIFRISVJEX0xJTkUpKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCBmb3VydGggbGluZSIpOworCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZsaW5lLCBGT1VSVEhfTElORSkpOworICAgIAorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworICB9CisKKyAgeworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgMTApKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHNldCBsZW5ndGgiKTsKKworICAgIC8qIGFjdHVhbGx5IGNvbXBhY3QgKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19jb21wYWN0ICgmc3RyLCAyMDQ4KSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBjb21wYWN0IGFmdGVyIHNldF9sZW5ndGgiKTsKKworICAgIC8qIHBlZWsgaW5zaWRlIHRvIG1ha2Ugc3VyZSBpdCB3b3JrZWQgKi8KKyAgICBpZiAoKChEQnVzUmVhbFN0cmluZyAqKSZzdHIpLT5hbGxvY2F0ZWQgPiAzMCkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvbXBhY3Rpbmcgc3RyaW5nIGRpZG4ndCBkbyBhbnl0aGluZyIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmV4cGVjdGVkIGNvbnRlbnQgYWZ0ZXIgY29tcGFjdCIpOworCisgICAgLyogY29tcGFjdCBub3RoaW5nICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMjA0OCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gY29tcGFjdCAybmQgdGltZSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmV4cGVjdGVkIGNvbnRlbnQgYWZ0ZXIgMm5kIGNvbXBhY3QiKTsKKworICAgIC8qIGFuZCBtYWtlIHN1cmUgaXQgc3RpbGwgd29ya3MuLi4qLworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIjEyMzQ1NiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBhZnRlciBjb21wYWN0Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoxMjM0NTYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCBhZnRlciBhcHBlbmQiKTsKKworICAgIC8qIGFmdGVyIGdyb3dpbmcgYXV0b21hdGljYWxseSwgdGhpcyBzaG91bGQgZG8gbm90aGluZyAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzdHIsIDIwMDAwKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBjb21wYWN0IGFmdGVyIGdyb3ciKTsKKworICAgIC8qIGJ1dCB0aGlzIG9uZSB3aWxsIGRvIHNvbWV0aGluZyAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzdHIsIDApKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgYWZ0ZXIgZ3JvdyIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqMTIzNDU2IikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmV4cGVjdGVkIGNvbnRlbnQiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiFAIyQlIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGFmdGVyIGNvbXBhY3QiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpajEyMzQ1NiFAIyQlIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmV4cGVjdGVkIGNvbnRlbnQiKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyIHR3b19zdHJpbmdzW10gPSAib25lXHR0d28iOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgdHdvX3N0cmluZ3MpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19zcGxpdF9vbl9ieXRlICgmc3RyLCAnXHQnLCAmb3RoZXIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IG9yIGRlbGltaXRlciBub3QgZm91bmQiKTsKKworICAgIGlmIChzdHJjbXAgKF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0ciksICJvbmUiKSAhPSAwKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibGVmdCBzaWRlIGFmdGVyIHNwbGl0IG9uIHRhYiBpcyB3cm9uZyIpOworCisgICAgaWYgKHN0cmNtcCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmb3RoZXIpLCAidHdvIikgIT0gMCkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInJpZ2h0IHNpZGUgYWZ0ZXIgc3BsaXQgb24gdGFiIGlzIHdyb25nIik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisgIH0KKworICB7CisgICAgY29uc3QgY2hhciB1cHBlcl9zdHJpbmdbXSA9ICJUT1VQUEVSU1RSSU5HIjsKKyAgICBjb25zdCBjaGFyIGxvd2VyX3N0cmluZ1tdID0gInRvdXBwZXJzdHJpbmciOworICAgIGNvbnN0IGNoYXIgbG93ZXIyX3N0cmluZ1tdID0gInRvdXBwZXJTVFJJTkciOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgdXBwZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZzdHIpKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBsb3dlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkgZmFpbGVkIik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCB1cHBlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoJnN0ciwgMCwgNyk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgbG93ZXIyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSBmYWlsZWQgaW4gcGFydGlhbCBjb252ZXJzaW9uIik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIH0KKworICB7CisgICAgY29uc3QgY2hhciBsb3dlcl9zdHJpbmdbXSA9ICJ0b3VwcGVyc3RyaW5nIjsKKyAgICBjb25zdCBjaGFyIHVwcGVyX3N0cmluZ1tdID0gIlRPVVBQRVJTVFJJTkciOworICAgIGNvbnN0IGNoYXIgdXBwZXIyX3N0cmluZ1tdID0gIlRPVVBQRVJzdHJpbmciOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgbG93ZXJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgX2RidXNfc3RyaW5nX3RvdXBwZXJfYXNjaWkgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZzdHIpKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCB1cHBlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiX2RidXNfc3RyaW5nX3RvdXBwZXJfYXNjaWkgZmFpbGVkIik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBsb3dlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoJnN0ciwgMCwgNyk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgdXBwZXIyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSBmYWlsZWQgaW4gcGFydGlhbCBjb252ZXJzaW9uIik7CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3RyaW5nLmMgYi9kYnVzL2RidXMtc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkOWYyYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmcuYwpAQCAtMCwwICsxLDI2OTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmcuYyBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorLyogd2UgYWxsb3cgYSBzeXN0ZW0gaGVhZGVyIGhlcmUsIGZvciBzcGVlZC9jb252ZW5pZW5jZSAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorLyogZm9yIHZzbnByaW50ZiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIERCVVNfQ0FOX1VTRV9EQlVTX1NUUklOR19QUklWQVRFIDEKKyNpbmNsdWRlICJkYnVzLXN0cmluZy1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiIC8qIHByb2JhYmx5IHNob3VsZCBiZSByZW1vdmVkIGJ5IG1vdmluZyB0aGUgdXNhZ2Ugb2YgREJVU19UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludG8gdGhlIG1hcnNoYWxpbmctcmVsYXRlZCBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZvciBEQlVTX1ZBX0NPUFkgKi8KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N0cmluZyBEQnVzU3RyaW5nIGNsYXNzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNTdHJpbmcgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNhZmVyIHN0cmluZyBoYW5kbGluZworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzU3RyaW5nLiBEQnVzU3RyaW5nIGlzIGludGVuZGVkCisgKiB0byBiZSBhIHN0cmluZyBjbGFzcyB0aGF0IG1ha2VzIGl0IGhhcmQgdG8gbWVzcyB1cCBzZWN1cml0eSBpc3N1ZXMKKyAqIChhbmQganVzdCBpbiBnZW5lcmFsIGhhcmRlciB0byB3cml0ZSBidWdneSBjb2RlKS4gIEl0IHNob3VsZCBiZQorICogdXNlZCAob3IgZXh0ZW5kZWQgYW5kIHRoZW4gdXNlZCkgcmF0aGVyIHRoYW4gdGhlIGxpYmMgc3R1ZmYgaW4KKyAqIHN0cmluZy5oLiAgVGhlIHN0cmluZyBjbGFzcyBpcyBhIGJpdCBpbmNvbnZlbmllbnQgYXQgc3BvdHMgYmVjYXVzZQorICogaXQgaGFuZGxlcyBvdXQtb2YtbWVtb3J5IGZhaWx1cmVzIGFuZCB0cmllcyB0byBiZSBleHRyYS1yb2J1c3QuCisgKiAKKyAqIEEgREJ1c1N0cmluZyBoYXMgYSBtYXhpbXVtIGxlbmd0aCBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZTsgdGhpcworICogY2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgYSBidWZmZXIgZG9lc24ndCBnZXQgdG9vIGJpZy4gIFRoZQorICogX2RidXNfc3RyaW5nX2xlbmd0aGVuKCkgbWV0aG9kIGNoZWNrcyBmb3Igb3ZlcmZsb3csIGFuZCBmb3IgbWF4CisgKiBsZW5ndGggYmVpbmcgZXhjZWVkZWQuCisgKiAKKyAqIFRyeSB0byBhdm9pZCBjb252ZXJzaW9uIHRvIGEgcGxhaW4gQyBzdHJpbmcsIGkuZS4gYWRkIG1ldGhvZHMgb24KKyAqIHRoZSBzdHJpbmcgb2JqZWN0IGluc3RlYWQsIG9ubHkgY29udmVydCB0byBDIHN0cmluZyB3aGVuIHBhc3NpbmcKKyAqIHRoaW5ncyBvdXQgdG8gdGhlIHB1YmxpYyBBUEkuIEluIHBhcnRpY3VsYXIsIG5vIHNwcmludGYsIHN0cmNweSwKKyAqIHN0cmNhdCwgYW55IG9mIHRoYXQgc2hvdWxkIGJlIHVzZWQuIFRoZSBHU3RyaW5nIGZlYXR1cmUgb2YKKyAqIGFjY2VwdGluZyBuZWdhdGl2ZSBudW1iZXJzIGZvciAibGVuZ3RoIG9mIHN0cmluZyIgaXMgYWxzbyBhYnNlbnQsCisgKiBiZWNhdXNlIGl0IGNvdWxkIGtlZXAgdXMgZnJvbSBkZXRlY3RpbmcgYm9ndXMgaHVnZSBsZW5ndGhzLiBpLmUuIGlmCisgKiB3ZSBwYXNzZWQgaW4gc29tZSBib2d1cyBodWdlIGxlbmd0aCBpdCB3b3VsZCBiZSB0YWtlbiB0byBtZWFuCisgKiAiY3VycmVudCBsZW5ndGggb2Ygc3RyaW5nIiBpbnN0ZWFkIG9mICJicm9rZW4gY3JhY2siCisgKgorICogQHRvZG8gI0RCdXNTdHJpbmcgbmVlZHMgYSBsb3Qgb2YgY2xlYW5pbmcgdXA7IHNvbWUgb2YgdGhlCisgKiBBUEkgaXMgbm8gbG9uZ2VyIHVzZWQsIGFuZCB0aGUgQVBJIGlzIHByZXR0eSBpbmNvbnNpc3RlbnQuCisgKiBJbiBwYXJ0aWN1bGFyIGFsbCB0aGUgImFwcGVuZCIgQVBJcywgZXNwZWNpYWxseSB0aG9zZSBpbnZvbHZpbmcKKyAqIGFsaWdubWVudCBidXQgcHJvYmFibHkgbG90cyBvZiB0aGVtLCBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlCisgKiBtYXJzaGFsaW5nIGNvZGUgd2hpY2ggYWx3YXlzIGRvZXMgImluc2VydHMiIG5vdy4KKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQKK2ZpeHVwX2FsaWdubWVudCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwpCit7CisgIHVuc2lnbmVkIGNoYXIgKmFsaWduZWQ7CisgIHVuc2lnbmVkIGNoYXIgKnJlYWxfYmxvY2s7CisgIHVuc2lnbmVkIGludCBvbGRfYWxpZ25fb2Zmc2V0OworCisgIC8qIHdlIGhhdmUgdG8gaGF2ZSBleHRyYSBzcGFjZSBpbiByZWFsLT5hbGxvY2F0ZWQgZm9yIHRoZSBhbGlnbiBvZmZzZXQgYW5kIG51bCBieXRlICovCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+bGVuIDw9IHJlYWwtPmFsbG9jYXRlZCAtIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpOworICAKKyAgb2xkX2FsaWduX29mZnNldCA9IHJlYWwtPmFsaWduX29mZnNldDsKKyAgcmVhbF9ibG9jayA9IHJlYWwtPnN0ciAtIG9sZF9hbGlnbl9vZmZzZXQ7CisgIAorICBhbGlnbmVkID0gX0RCVVNfQUxJR05fQUREUkVTUyAocmVhbF9ibG9jaywgOCk7CisKKyAgcmVhbC0+YWxpZ25fb2Zmc2V0ID0gYWxpZ25lZCAtIHJlYWxfYmxvY2s7CisgIHJlYWwtPnN0ciA9IGFsaWduZWQ7CisgIAorICBpZiAob2xkX2FsaWduX29mZnNldCAhPSByZWFsLT5hbGlnbl9vZmZzZXQpCisgICAgeworICAgICAgLyogSGVyZSBjb21lcyB0aGUgc3VjayAqLworICAgICAgbWVtbW92ZSAocmVhbF9ibG9jayArIHJlYWwtPmFsaWduX29mZnNldCwKKyAgICAgICAgICAgICAgIHJlYWxfYmxvY2sgKyBvbGRfYWxpZ25fb2Zmc2V0LAorICAgICAgICAgICAgICAgcmVhbC0+bGVuICsgMSk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+YWxpZ25fb2Zmc2V0IDwgOCk7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAocmVhbC0+c3RyLCA4KSA9PSByZWFsLT5zdHIpOworfQorCitzdGF0aWMgdm9pZAordW5kb19hbGlnbm1lbnQgKERCdXNSZWFsU3RyaW5nICpyZWFsKQoreworICBpZiAocmVhbC0+YWxpZ25fb2Zmc2V0ICE9IDApCisgICAgeworICAgICAgbWVtbW92ZSAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0LAorICAgICAgICAgICAgICAgcmVhbC0+c3RyLAorICAgICAgICAgICAgICAgcmVhbC0+bGVuICsgMSk7CisKKyAgICAgIHJlYWwtPnN0ciA9IHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldDsKKyAgICAgIHJlYWwtPmFsaWduX29mZnNldCA9IDA7CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVwIHRvIHRoZSBnaXZlbiBhbGxvY2F0aW9uIHNpemUKKyAqIGJlZm9yZSBpdCBoYXMgdG8gcmVhbGxvYy4gVGhlIHN0cmluZyBzdGFydHMgbGlmZSB3aXRoIHplcm8gbGVuZ3RoLgorICogVGhlIHN0cmluZyBtdXN0IGV2ZW50dWFsbHkgYmUgZnJlZWQgd2l0aCBfZGJ1c19zdHJpbmdfZnJlZSgpLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byBob2xkIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBhbGxvY2F0ZV9zaXplIGFtb3VudCB0byBwcmVhbGxvY2F0ZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsbG9jYXRlX3NpemUpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsOworCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c1N0cmluZykgPT0gc2l6ZW9mIChEQnVzUmVhbFN0cmluZykpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworCisgIHJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7CisKKyAgLyogSXQncyB2ZXJ5IGltcG9ydGFudCBub3QgdG8gdG91Y2ggYW55dGhpbmcKKyAgICogb3RoZXIgdGhhbiByZWFsLT5zdHIgaWYgd2UncmUgZ29pbmcgdG8gZmFpbCwKKyAgICogc2luY2Ugd2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byByZXNldAorICAgKiBhbiBleGlzdGluZyBzdHJpbmcsIGUuZy4gaW4gX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEoKQorICAgKi8KKyAgCisgIHJlYWwtPnN0ciA9IGRidXNfbWFsbG9jIChfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HICsgYWxsb2NhdGVfc2l6ZSk7CisgIGlmIChyZWFsLT5zdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7ICAKKyAgCisgIHJlYWwtPmFsbG9jYXRlZCA9IF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcgKyBhbGxvY2F0ZV9zaXplOworICByZWFsLT5sZW4gPSAwOworICByZWFsLT5zdHJbcmVhbC0+bGVuXSA9ICdcMCc7CisgIAorICByZWFsLT5jb25zdGFudCA9IEZBTFNFOworICByZWFsLT5sb2NrZWQgPSBGQUxTRTsKKyAgcmVhbC0+aW52YWxpZCA9IEZBTFNFOworICByZWFsLT5hbGlnbl9vZmZzZXQgPSAwOworICAKKyAgZml4dXBfYWxpZ25tZW50IChyZWFsKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgc3RyaW5nLiBUaGUgc3RyaW5nIHN0YXJ0cyBsaWZlIHdpdGggemVybyBsZW5ndGguICBUaGUKKyAqIHN0cmluZyBtdXN0IGV2ZW50dWFsbHkgYmUgZnJlZWQgd2l0aCBfZGJ1c19zdHJpbmdfZnJlZSgpLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byBob2xkIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbml0IChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKHN0ciwgMCk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBjb25zdGFudCBzdHJpbmcuIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgbm90IGNvcGllZAorICogKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUgbW9kaWZpZWQuCisgKiBJdCBpcyBzYWZlIGJ1dCBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgX2RidXNfc3RyaW5nX2ZyZWUoKQorICogb24gYSBjb25zdCBzdHJpbmcuIFRoZSBzdHJpbmcgaGFzIGEgbGVuZ3RoIGxpbWl0IG9mIE1BWElOVCAtIDguCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIGEgc3RyaW5nIHRvIGJlIHN0b3JlZCBpbiBzdHIgKG5vdCBjb3BpZWQhISEpCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19pbml0X2NvbnN0IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKHN0ciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSkpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgY29uc3RhbnQgc3RyaW5nIHdpdGggYSBsZW5ndGguIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMKKyAqIG5vdCBjb3BpZWQgKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUKKyAqIG1vZGlmaWVkLiAgSXQgaXMgc2FmZSBidXQgbm90IG5lY2Vzc2FyeSB0byBjYWxsIF9kYnVzX3N0cmluZ19mcmVlKCkKKyAqIG9uIGEgY29uc3Qgc3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byB1c2UgZm9yIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSBhIHN0cmluZyB0byBiZSBzdG9yZWQgaW4gc3RyIChub3QgY29waWVkISEhKQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIHRvIHVzZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPT0gMCB8fCB2YWx1ZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7CisgIAorICByZWFsLT5zdHIgPSAodW5zaWduZWQgY2hhciopIHZhbHVlOworICByZWFsLT5sZW4gPSBsZW47CisgIHJlYWwtPmFsbG9jYXRlZCA9IHJlYWwtPmxlbiArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkc7IC8qIGEgbGllLCBqdXN0IHRvIGF2b2lkIHNwZWNpYWwtY2FzZSBhc3NlcnRpb25zLi4uICovCisgIHJlYWwtPmNvbnN0YW50ID0gVFJVRTsKKyAgcmVhbC0+bG9ja2VkID0gVFJVRTsKKyAgcmVhbC0+aW52YWxpZCA9IEZBTFNFOworICByZWFsLT5hbGlnbl9vZmZzZXQgPSAwOworCisgIC8qIFdlIGRvbid0IHJlcXVpcmUgY29uc3Qgc3RyaW5ncyB0byBiZSA4LWJ5dGUgYWxpZ25lZCBhcyB0aGUKKyAgICogbWVtb3J5IGlzIGNvbWluZyBmcm9tIGVsc2V3aGVyZS4KKyAgICovCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBzdHJpbmcgZnJvbSBhbm90aGVyIHN0cmluZy4gVGhlCisgKiBzdHJpbmcgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggX2RidXNfc3RyaW5nX2ZyZWUoKS4KKyAqCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byBob2xkIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBmcm9tIGluc3RhbmNlIGZyb20gd2hpY2ggdGhlIHN0cmluZyBpcyBpbml0aWFsaXplZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luaXRfZnJvbV9zdHJpbmcoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZnJvbSkKK3sKKyBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChzdHIpKQorICAgICByZXR1cm4gRkFMU0U7CisgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKHN0ciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmcm9tKSk7Cit9CisKKy8qKgorICogRnJlZXMgYSBzdHJpbmcgY3JlYXRlZCBieSBfZGJ1c19zdHJpbmdfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHdoZXJlIHRoZSBzdHJpbmcgaXMgc3RvcmVkLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfZnJlZSAoREJ1c1N0cmluZyAqc3RyKQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbCA9IChEQnVzUmVhbFN0cmluZyopIHN0cjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbCk7CisgIAorICBpZiAocmVhbC0+Y29uc3RhbnQpCisgICAgcmV0dXJuOworCisgIC8qIHNvIGl0J3Mgc2FmZSBpZiBAcCBzdHIgcmV0dXJuZWQgYnkgYSBmYWlsZWQKKyAgICogX2RidXNfc3RyaW5nX2luaXQgY2FsbAorICAgKiBCdWc6IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTY1OTU5CisgICAqLworICBpZiAocmVhbC0+c3RyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRidXNfZnJlZSAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0KTsKKworICByZWFsLT5pbnZhbGlkID0gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb21wYWN0IChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgIGludCAgICAgICAgICAgICBtYXhfd2FzdGUpCit7CisgIHVuc2lnbmVkIGNoYXIgKm5ld19zdHI7CisgIGludCBuZXdfYWxsb2NhdGVkOworICBpbnQgd2FzdGU7CisKKyAgd2FzdGUgPSByZWFsLT5hbGxvY2F0ZWQgLSAocmVhbC0+bGVuICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk7CisKKyAgaWYgKHdhc3RlIDw9IG1heF93YXN0ZSkKKyAgICByZXR1cm4gVFJVRTsKKworICBuZXdfYWxsb2NhdGVkID0gcmVhbC0+bGVuICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORzsKKworICBuZXdfc3RyID0gZGJ1c19yZWFsbG9jIChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsIG5ld19hbGxvY2F0ZWQpOworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19zdHIgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlYWwtPnN0ciA9IG5ld19zdHIgKyByZWFsLT5hbGlnbl9vZmZzZXQ7CisgIHJlYWwtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7CisgIGZpeHVwX2FsaWdubWVudCAocmVhbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworLyogTm90IHVzaW5nIHRoaXMgZmVhdHVyZSBhdCB0aGUgbW9tZW50LAorICogc28gbWFya2VkIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTLW9ubHkKKyAqLworLyoqCisgKiBMb2NrcyBhIHN0cmluZyBzdWNoIHRoYXQgYW55IGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgc3RyaW5nIHdpbGwKKyAqIHJlc3VsdCBpbiBhYm9ydGluZyB0aGUgcHJvZ3JhbS4gQWxzbywgaWYgdGhlIHN0cmluZyBpcyB3YXN0aW5nIGEKKyAqIGxvdCBvZiBtZW1vcnkgKGFsbG9jYXRpb24gaXMgc3VmZmljaWVudGx5IGxhcmdlciB0aGFuIHdoYXQgdGhlCisgKiBzdHJpbmcgaXMgcmVhbGx5IHVzaW5nKSwgX2RidXNfc3RyaW5nX2xvY2soKSB3aWxsIHJlYWxsb2MgdGhlCisgKiBzdHJpbmcncyBkYXRhIHRvICJjb21wYWN0IiBpdC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gbG9jay4KKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2xvY2sgKERCdXNTdHJpbmcgKnN0cikKK3sgIAorICBEQlVTX0xPQ0tFRF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7IC8qIGNhbiBsb2NrIG11bHRpcGxlIHRpbWVzICovCisKKyAgcmVhbC0+bG9ja2VkID0gVFJVRTsKKworICAvKiBUcnkgdG8gcmVhbGxvYyB0byBhdm9pZCBleGNlc3MgbWVtb3J5IHVzYWdlLCBzaW5jZQorICAgKiB3ZSBrbm93IHdlIHdvbid0IGNoYW5nZSB0aGUgc3RyaW5nIGZ1cnRoZXIKKyAgICovCisjZGVmaW5lIE1BWF9XQVNURSA0OAorICBjb21wYWN0IChyZWFsLCBNQVhfV0FTVEUpOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhbGxvY2F0ZV9mb3JfbGVuZ3RoIChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5ld19sZW5ndGgpCit7CisgIGludCBuZXdfYWxsb2NhdGVkOworICB1bnNpZ25lZCBjaGFyICpuZXdfc3RyOworCisgIC8qIGF0IGxlYXN0IGRvdWJsZSBvdXIgb2xkIGFsbG9jYXRpb24gdG8gYXZvaWQgTyhuKSwgYXZvaWRpbmcKKyAgICogb3ZlcmZsb3cKKyAgICovCisgIGlmIChyZWFsLT5hbGxvY2F0ZWQgPiAoX0RCVVNfU1RSSU5HX01BWF9MRU5HVEggKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKSAvIDIpCisgICAgbmV3X2FsbG9jYXRlZCA9IF9EQlVTX1NUUklOR19NQVhfTEVOR1RIICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORzsKKyAgZWxzZQorICAgIG5ld19hbGxvY2F0ZWQgPSByZWFsLT5hbGxvY2F0ZWQgKiAyOworCisgIC8qIGlmIHlvdSBjaGFuZ2UgdGhlIGNvZGUganVzdCBhYm92ZSBoZXJlLCBydW4gdGhlIHRlc3RzIHdpdGhvdXQKKyAgICogdGhlIGZvbGxvd2luZyBhc3NlcnQtb25seSBoYWNrIGJlZm9yZSB5b3UgY29tbWl0CisgICAqLworICAvKiBUaGlzIGlzIGtleWVkIG9mZiBhc3NlcnRzIGluIGFkZGl0aW9uIHRvIHRlc3RzIHNvIHdoZW4geW91CisgICAqIGRpc2FibGUgYXNzZXJ0cyB0byBwcm9maWxlLCB5b3UgZG9uJ3QgZ2V0IHRoaXMgZGVzdHJveWVyCisgICAqIG9mIHByb2ZpbGVzLgorICAgKi8KKyNpZiBkZWZpbmVkIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykgJiYgIWRlZmluZWQgKERCVVNfRElTQUJMRV9BU1NFUlQpCisgIG5ld19hbGxvY2F0ZWQgPSAwOyAvKiBlbnN1cmUgYSByZWFsbG9jIGV2ZXJ5IHRpbWUgc28gdGhhdCB3ZSBnbworICAgICAgICAgICAgICAgICAgICAgICogdGhyb3VnaCBhbGwgbWFsbG9jIGZhaWx1cmUgY29kZXBhdGhzCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorCisgIC8qIEJ1dCBiZSBzdXJlIHdlIGFsd2F5cyBhbGxvYyBhdCBsZWFzdCBzcGFjZSBmb3IgdGhlIG5ldyBsZW5ndGggKi8KKyAgbmV3X2FsbG9jYXRlZCA9IE1BWCAobmV3X2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xlbmd0aCArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpOworCisgIF9kYnVzX2Fzc2VydCAobmV3X2FsbG9jYXRlZCA+PSByZWFsLT5hbGxvY2F0ZWQpOyAvKiBjb2RlIHJlbGllcyBvbiB0aGlzICovCisgIG5ld19zdHIgPSBkYnVzX3JlYWxsb2MgKHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldCwgbmV3X2FsbG9jYXRlZCk7CisgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X3N0ciA9PSBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVhbC0+c3RyID0gbmV3X3N0ciArIHJlYWwtPmFsaWduX29mZnNldDsKKyAgcmVhbC0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKKyAgZml4dXBfYWxpZ25tZW50IChyZWFsKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb21wYWN0cyB0aGUgc3RyaW5nIHRvIGF2b2lkIHdhc3RlZCBtZW1vcnkuICBXYXN0ZWQgbWVtb3J5IGlzCisgKiBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgYnV0IG5vdCBhY3R1YWxseSByZXF1aXJlZCB0byBzdG9yZSB0aGUKKyAqIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICBUaGUgY29tcGFjdCBpcyBvbmx5IGRvbmUgaWYgbW9yZQorICogdGhhbiB0aGUgZ2l2ZW4gYW1vdW50IG9mIG1lbW9yeSBpcyBiZWluZyB3YXN0ZWQgKG90aGVyd2lzZSB0aGUKKyAqIHdhc3RlIGlzIGlnbm9yZWQgYW5kIHRoZSBjYWxsIGRvZXMgbm90aGluZykuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbWF4X3dhc3RlIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB3YXN0ZSB0byBpZ25vcmUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgY29tcGFjdCBmYWlsZWQgZHVlIHRvIHJlYWxsb2MgZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvbXBhY3QgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtYXhfd2FzdGUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIHJldHVybiBjb21wYWN0IChyZWFsLCBtYXhfd2FzdGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9sZW5ndGggKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5ld19sZW5ndGgpCit7CisgIC8qIE5vdGUsIHdlIGFyZSBzZXR0aW5nIHRoZSBsZW5ndGggbm90IGluY2x1ZGluZyBudWwgdGVybWluYXRpb24gKi8KKworICAvKiBleGNlZWRpbmcgbWF4IGxlbmd0aCBpcyB0aGUgc2FtZSBhcyBmYWlsdXJlIHRvIGFsbG9jYXRlIG1lbW9yeSAqLworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19sZW5ndGggPiBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCkpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlIGlmIChuZXdfbGVuZ3RoID4gKHJlYWwtPmFsbG9jYXRlZCAtIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpICYmCisgICAgICAgICAgIF9EQlVTX1VOTElLRUxZICghcmVhbGxvY2F0ZV9mb3JfbGVuZ3RoIChyZWFsLCBuZXdfbGVuZ3RoKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgeworICAgICAgcmVhbC0+bGVuID0gbmV3X2xlbmd0aDsKKyAgICAgIHJlYWwtPnN0cltuZXdfbGVuZ3RoXSA9ICdcMCc7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorb3Blbl9nYXAgKGludCAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgREJ1c1JlYWxTdHJpbmcgKmRlc3QsCisgICAgICAgICAgaW50ICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChsZW4gPiBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCAtIGRlc3QtPmxlbikKKyAgICByZXR1cm4gRkFMU0U7IC8qIGRldGVjdGVkIG92ZXJmbG93IG9mIGRlc3QtPmxlbiArIGxlbiBiZWxvdyAqLworICAKKyAgaWYgKCFzZXRfbGVuZ3RoIChkZXN0LCBkZXN0LT5sZW4gKyBsZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1tb3ZlIChkZXN0LT5zdHIgKyBpbnNlcnRfYXQgKyBsZW4sIAorICAgICAgICAgICBkZXN0LT5zdHIgKyBpbnNlcnRfYXQsCisgICAgICAgICAgIGRlc3QtPmxlbiAtIGxlbiAtIGluc2VydF9hdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9kYXRhCisvKioKKyAqIEdldHMgdGhlIHJhdyBjaGFyYWN0ZXIgYnVmZmVyIGZyb20gdGhlIHN0cmluZy4gIFRoZSByZXR1cm5lZCBidWZmZXIKKyAqIHdpbGwgYmUgbnVsLXRlcm1pbmF0ZWQsIGJ1dCBub3RlIHRoYXQgc3RyaW5ncyBtYXkgY29udGFpbiBiaW5hcnkKKyAqIGRhdGEgc28gdGhlcmUgbWF5IGJlIGV4dHJhIG51bCBjaGFyYWN0ZXJzIHByaW9yIHRvIHRoZSB0ZXJtaW5hdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGxpdHRsZS11c2VkLCBleHRlbmQgREJ1c1N0cmluZyBvciBhZGQKKyAqIHN0dWZmIHRvIGRidXMtc3lzZGVwcy5jIGluc3RlYWQuIEl0J3MgYW4gZXJyb3IgdG8gdXNlIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgY29uc3Qgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHJldHVybnMgdGhlIGRhdGEKKyAqLworY2hhcioKK19kYnVzX3N0cmluZ19nZXRfZGF0YSAoREJ1c1N0cmluZyAqc3RyKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIHJldHVybiAoY2hhciopIHJlYWwtPnN0cjsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKi8KKworLyogb25seSBkbyB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhCisvKioKKyAqIEdldHMgdGhlIHJhdyBjaGFyYWN0ZXIgYnVmZmVyIGZyb20gYSBjb25zdCBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcmV0dXJucyB0aGUgc3RyaW5nIGRhdGEKKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICByZXR1cm4gKGNvbnN0IGNoYXIqKSByZWFsLT5zdHI7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICovCisKKy8qKgorICogR2V0cyBhIHN1Yi1wb3J0aW9uIG9mIHRoZSByYXcgY2hhcmFjdGVyIGJ1ZmZlciBmcm9tIHRoZQorICogc3RyaW5nLiBUaGUgImxlbiIgZmllbGQgaXMgcmVxdWlyZWQgc2ltcGx5IGZvciBlcnJvcgorICogY2hlY2tpbmcsIHRvIGJlIHN1cmUgeW91IGRvbid0IHRyeSB0byB1c2UgbW9yZQorICogc3RyaW5nIHRoYW4gZXhpc3RzLiBUaGUgbnVsIHRlcm1pbmF0aW9uIG9mIHRoZQorICogcmV0dXJuZWQgYnVmZmVyIHJlbWFpbnMgYXQgdGhlIGVuZCBvZiB0aGUgZW50aXJlCisgKiBzdHJpbmcsIG5vdCBhdCBzdGFydCArIGxlbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBieXRlIG9mZnNldCB0byByZXR1cm4KKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgc3RyaW5nIGRhdGEKKyAqLworY2hhcioKK19kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworICAKKyAgcmV0dXJuIChjaGFyKikgcmVhbC0+c3RyICsgc3RhcnQ7Cit9CisKKy8qIG9ubHkgZG8gdGhlIGZ1bmN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhlIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4KKy8qKgorICogY29uc3QgdmVyc2lvbiBvZiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuKCkuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBvZmZzZXQgdG8gcmV0dXJuCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIHJldHVybgorICogQHJldHVybnMgdGhlIHN0cmluZyBkYXRhCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWwtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIHJldHVybiAoY29uc3QgY2hhciopIHJlYWwtPnN0ciArIHN0YXJ0OworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKi8KKworLyogb25seSBkbyB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX3NldF9ieXRlCisvKioKKyAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBpIHRoZSBwb3NpdGlvbgorICogQHBhcmFtIGJ5dGUgdGhlIG5ldyB2YWx1ZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoaSA8IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwKTsKKyAgCisgIHJlYWwtPnN0cltpXSA9IGJ5dGU7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX3NldF9ieXRlICovCisKKy8qIG9ubHkgaGF2ZSB0aGUgZnVuY3Rpb24gaWYgd2UgZGlkbid0IGNyZWF0ZSBhIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZQorLyoqCisgKiBHZXRzIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gSXQgaXMKKyAqIGFsbG93ZWQgdG8gYXNrIGZvciB0aGUgbnVsIGJ5dGUgYXQgdGhlIGVuZCBvZgorICogdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgcG9zaXRpb24KKyAqIEByZXR1cm5zIHRoZSBieXRlIGF0IHRoYXQgcG9zaXRpb24KKyAqLwordW5zaWduZWQgY2hhcgorX2RidXNfc3RyaW5nX2dldF9ieXRlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQpCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICByZXR1cm4gcmVhbC0+c3RyW3N0YXJ0XTsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKi8KKworLyoqCisgKiBJbnNlcnRzIGEgbnVtYmVyIG9mIGJ5dGVzIG9mIGEgZ2l2ZW4gdmFsdWUgYXQgdGhlCisgKiBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBpIHRoZSBwb3NpdGlvbgorICogQHBhcmFtIG5fYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzCisgKiBAcGFyYW0gYnl0ZSB0aGUgdmFsdWUgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChEQnVzU3RyaW5nICAgKnN0ciwKKwkJCSAgIGludCAgICAgICAgICAgaSwKKwkJCSAgIGludCAgICAgICAgICAgbl9ieXRlcywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoaSA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobl9ieXRlcyA+PSAwKTsKKworICBpZiAobl9ieXRlcyA9PSAwKQorICAgIHJldHVybiBUUlVFOworICAKKyAgaWYgKCFvcGVuX2dhcCAobl9ieXRlcywgcmVhbCwgaSkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgbWVtc2V0IChyZWFsLT5zdHIgKyBpLCBieXRlLCBuX2J5dGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgc2luZ2xlIGJ5dGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGkgdGhlIHBvc2l0aW9uCisgKiBAcGFyYW0gYnl0ZSB0aGUgdmFsdWUgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKERCdXNTdHJpbmcgICAqc3RyLAorCQkJICAgaW50ICAgICAgICAgICBpLAorCQkJICAgdW5zaWduZWQgY2hhciBieXRlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChpIDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwKTsKKyAgCisgIGlmICghb3Blbl9nYXAgKDEsIHJlYWwsIGkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHJbaV0gPSBieXRlOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX2dldF9kYXRhKCksIGJ1dCByZW1vdmVzIHRoZQorICogZ290dGVuIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc3RyaW5nLiBUaGUgY2FsbGVyCisgKiBtdXN0IGZyZWUgdGhlIGRhdGEgcmV0dXJuZWQuIFRoaXMgZnVuY3Rpb24gbWF5CisgKiBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgYW5kIHJldHVybiAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZGF0YV9yZXR1cm4gbG9jYXRpb24gdG8gcmV0dXJuIHRoZSBidWZmZXIKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zdGVhbF9kYXRhIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoZGF0YV9yZXR1cm4gIT0gTlVMTCk7CisKKyAgdW5kb19hbGlnbm1lbnQgKHJlYWwpOworICAKKyAgKmRhdGFfcmV0dXJuID0gKGNoYXIqKSByZWFsLT5zdHI7CisKKyAgLyogcmVzZXQgdGhlIHN0cmluZyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0IChzdHIpKQorICAgIHsKKyAgICAgIC8qIGhybSwgcHV0IGl0IGJhY2sgdGhlbiAqLworICAgICAgcmVhbC0+c3RyID0gKHVuc2lnbmVkIGNoYXIqKSAqZGF0YV9yZXR1cm47CisgICAgICAqZGF0YV9yZXR1cm4gPSBOVUxMOworICAgICAgZml4dXBfYWxpZ25tZW50IChyZWFsKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBkYXRhIGZyb20gdGhlIHN0cmluZyBpbnRvIGEgY2hhcioKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBkYXRhX3JldHVybiBwbGFjZSB0byByZXR1cm4gdGhlIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGRhdGFfcmV0dXJuICE9IE5VTEwpOworICAKKyAgKmRhdGFfcmV0dXJuID0gZGJ1c19tYWxsb2MgKHJlYWwtPmxlbiArIDEpOworICBpZiAoKmRhdGFfcmV0dXJuID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbWNweSAoKmRhdGFfcmV0dXJuLCByZWFsLT5zdHIsIHJlYWwtPmxlbiArIDEpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvcGllcyB0aGUgY29udGVudHMgb2YgYSBEQnVzU3RyaW5nIGludG8gYSBkaWZmZXJlbnQgYnVmZmVyLiBJdCBpcworICogYSBidWcgaWYgYXZhaWxfbGVuIGlzIHRvbyBzaG9ydCB0byBob2xkIHRoZSBzdHJpbmcgY29udGVudHMuIG51bAorICogdGVybWluYXRpb24gaXMgbm90IGNvcGllZCwganVzdCB0aGUgc3VwcGxpZWQgYnl0ZXMuCisgKiAKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBidWZmZXIgYSBDIGJ1ZmZlciB0byBjb3B5IGRhdGEgdG8KKyAqIEBwYXJhbSBhdmFpbF9sZW4gbWF4aW11bSBsZW5ndGggb2YgQyBidWZmZXIKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorCQkJICAgICBjaGFyICAgICAgICAgICAgICAqYnVmZmVyLAorCQkJICAgICBpbnQgICAgICAgICAgICAgICAgYXZhaWxfbGVuKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICBfZGJ1c19hc3NlcnQgKGF2YWlsX2xlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhdmFpbF9sZW4gPj0gcmVhbC0+bGVuKTsKKyAgCisgIG1lbWNweSAoYnVmZmVyLCByZWFsLT5zdHIsIHJlYWwtPmxlbik7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBjb250ZW50cyBvZiBhIERCdXNTdHJpbmcgaW50byBhIGRpZmZlcmVudCBidWZmZXIuIEl0IGlzCisgKiBhIGJ1ZyBpZiBhdmFpbF9sZW4gaXMgdG9vIHNob3J0IHRvIGhvbGQgdGhlIHN0cmluZyBjb250ZW50cyBwbHVzIGEKKyAqIG51bCBieXRlLiAKKyAqIAorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGJ1ZmZlciBhIEMgYnVmZmVyIHRvIGNvcHkgZGF0YSB0bworICogQHBhcmFtIGF2YWlsX2xlbiBtYXhpbXVtIGxlbmd0aCBvZiBDIGJ1ZmZlcgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXJfd2l0aF9udWwgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGF2YWlsX2xlbiA+IHJlYWwtPmxlbik7CisgIAorICBtZW1jcHkgKGJ1ZmZlciwgcmVhbC0+c3RyLCByZWFsLT5sZW4rMSk7Cit9CisKKy8qIE9ubHkgaGF2ZSB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgKKy8qKgorICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIChub3QgaW5jbHVkaW5nIG51bCB0ZXJtaW5hdGlvbikuCisgKgorICogQHJldHVybnMgdGhlIGxlbmd0aC4KKyAqLworaW50CitfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29uc3QgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICByZXR1cm4gcmVhbC0+bGVuOworfQorI2VuZGlmIC8qICFfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAqLworCisvKioKKyAqIE1ha2VzIGEgc3RyaW5nIGxvbmdlciBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiAgQ2hlY2tzIHdoZXRoZXIKKyAqIGFkZGluZyBhZGRpdGlvbmFsX2xlbmd0aCB0byB0aGUgY3VycmVudCBsZW5ndGggd291bGQgb3ZlcmZsb3cgYW4KKyAqIGludGVnZXIsIGFuZCBjaGVja3MgZm9yIGV4Y2VlZGluZyBhIHN0cmluZydzIG1heCBsZW5ndGguCisgKiBUaGUgbmV3IGJ5dGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQsIG90aGVyIHRoYW4gbnVsLXRlcm1pbmF0aW5nCisgKiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIFRoZSB1bmluaXRpYWxpemVkIGJ5dGVzIG1heSBjb250YWluCisgKiBudWwgYnl0ZXMgb3Igb3RoZXIganVuay4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYWRkaXRpb25hbF9sZW5ndGggbGVuZ3RoIHRvIGFkZCB0byB0aGUgc3RyaW5nLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19sZW5ndGhlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhZGRpdGlvbmFsX2xlbmd0aCkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7ICAKKyAgX2RidXNfYXNzZXJ0IChhZGRpdGlvbmFsX2xlbmd0aCA+PSAwKTsKKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKGFkZGl0aW9uYWxfbGVuZ3RoID4gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEggLSByZWFsLT5sZW4pKQorICAgIHJldHVybiBGQUxTRTsgLyogd291bGQgb3ZlcmZsb3cgKi8KKyAgCisgIHJldHVybiBzZXRfbGVuZ3RoIChyZWFsLAorICAgICAgICAgICAgICAgICAgICAgcmVhbC0+bGVuICsgYWRkaXRpb25hbF9sZW5ndGgpOworfQorCisvKioKKyAqIE1ha2VzIGEgc3RyaW5nIHNob3J0ZXIgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gbGVuZ3RoX3RvX3JlbW92ZSBsZW5ndGggdG8gcmVtb3ZlIGZyb20gdGhlIHN0cmluZy4KKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3Nob3J0ZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW5ndGhfdG9fcmVtb3ZlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChsZW5ndGhfdG9fcmVtb3ZlID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbmd0aF90b19yZW1vdmUgPD0gcmVhbC0+bGVuKTsKKworICBzZXRfbGVuZ3RoIChyZWFsLAorICAgICAgICAgICAgICByZWFsLT5sZW4gLSBsZW5ndGhfdG9fcmVtb3ZlKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcuIENhbiBiZSB1c2VkIHRvIHRydW5jYXRlIG9yIGxlbmd0aGVuCisgKiB0aGUgc3RyaW5nLiBJZiB0aGUgc3RyaW5nIGlzIGxlbmd0aGVuZWQsIHRoZSBmdW5jdGlvbiBtYXkgZmFpbCBhbmQKKyAqIHJldHVybiAjRkFMU0UuIE5ld2x5LWFkZGVkIGJ5dGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQsIGFzIHdpdGgKKyAqIF9kYnVzX3N0cmluZ19sZW5ndGhlbigpLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBsZW5ndGggbmV3IGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbmd0aCkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoID49IDApOworCisgIHJldHVybiBzZXRfbGVuZ3RoIChyZWFsLCBsZW5ndGgpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsaWduX2luc2VydF9wb2ludF90aGVuX29wZW5fZ2FwIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqaW5zZXJ0X2F0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGdhcF9zaXplKQoreworICB1bnNpZ25lZCBsb25nIG5ld19sZW47IC8qIHVsb25nIHRvIGF2b2lkIF9EQlVTX0FMSUdOX1ZBTFVFIG92ZXJmbG93ICovCisgIHVuc2lnbmVkIGxvbmcgZ2FwX3BvczsKKyAgaW50IGluc2VydF9hdDsKKyAgaW50IGRlbHRhOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChhbGlnbm1lbnQgPj0gMSk7CisgIF9kYnVzX2Fzc2VydCAoYWxpZ25tZW50IDw9IDgpOyAvKiBpdCBoYXMgdG8gYmUgYSBidWcgaWYgPiA4ICovCisKKyAgaW5zZXJ0X2F0ID0gKmluc2VydF9hdF9wOworCisgIF9kYnVzX2Fzc2VydCAoaW5zZXJ0X2F0IDw9IHJlYWwtPmxlbik7CisgIAorICBnYXBfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKGluc2VydF9hdCwgYWxpZ25tZW50KTsKKyAgbmV3X2xlbiA9IHJlYWwtPmxlbiArIChnYXBfcG9zIC0gaW5zZXJ0X2F0KSArIGdhcF9zaXplOworICAKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfbGVuID4gKHVuc2lnbmVkIGxvbmcpIF9EQlVTX1NUUklOR19NQVhfTEVOR1RIKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkZWx0YSA9IG5ld19sZW4gLSByZWFsLT5sZW47CisgIF9kYnVzX2Fzc2VydCAoZGVsdGEgPj0gMCk7CisKKyAgaWYgKGRlbHRhID09IDApIC8qIG9ubHkgaGFwcGVucyBpZiBnYXBfc2l6ZSA9PSAwIGFuZCBpbnNlcnRfYXQgaXMgYWxpZ25lZCBhbHJlYWR5ICovCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICgoKHVuc2lnbmVkIGxvbmcpICppbnNlcnRfYXRfcCkgPT0gZ2FwX3Bvcyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZICghb3Blbl9nYXAgKG5ld19sZW4gLSByZWFsLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsLCBpbnNlcnRfYXQpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogbnVsIHRoZSBwYWRkaW5nIGlmIHdlIGhhZCB0byBhZGQgYW55IHBhZGRpbmcgKi8KKyAgaWYgKGdhcF9zaXplIDwgZGVsdGEpCisgICAgeworICAgICAgbWVtc2V0ICgmcmVhbC0+c3RyW2luc2VydF9hdF0sICdcMCcsCisgICAgICAgICAgICAgIGdhcF9wb3MgLSBpbnNlcnRfYXQpOworICAgIH0KKworICAqaW5zZXJ0X2F0X3AgPSBnYXBfcG9zOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxpZ25fbGVuZ3RoX3RoZW5fbGVuZ3RoZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdGhlbl9sZW5ndGhlbl9ieSkKK3sKKyAgaW50IGluc2VydF9hdDsKKworICBpbnNlcnRfYXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgCisgIHJldHVybiBhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50LCB0aGVuX2xlbmd0aGVuX2J5KTsKK30KKworLyoqCisgKiBBbGlnbiB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIHRvIGEgc3BlY2lmaWMgYWxpZ25tZW50ICh0eXBpY2FsbHkgNCBvciA4KQorICogYnkgYXBwZW5kaW5nIG51bCBieXRlcyB0byB0aGUgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBhbGlnbm1lbnQgdGhlIGFsaWdubWVudAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FsaWduX2xlbmd0aCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWxpZ25tZW50KQoreworICByZXR1cm4gYWxpZ25fbGVuZ3RoX3RoZW5fbGVuZ3RoZW4gKHN0ciwgYWxpZ25tZW50LCAwKTsKK30KKworLyoqCisgKiBQcmVhbGxvY2F0ZSBleHRyYV9ieXRlcyBzdWNoIHRoYXQgYSBmdXR1cmUgbGVuZ3RoZW5pbmcgb2YgdGhlCisgKiBzdHJpbmcgYnkgZXh0cmFfYnl0ZXMgaXMgZ3VhcmFudGVlZCB0byBzdWNjZWVkIHdpdGhvdXQgYW4gb3V0IG9mCisgKiBtZW1vcnkgZXJyb3IuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGV4dHJhX2J5dGVzIGJ5dGVzIHRvIGFsbG9jCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBleHRyYV9ieXRlcykKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgZXh0cmFfYnl0ZXMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKHN0ciwgZXh0cmFfYnl0ZXMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgIGNvbnN0IGNoYXIgICAgICpidWZmZXIsCisgICAgICAgIGludCAgICAgICAgICAgICBidWZmZXJfbGVuKQoreworICBpZiAoYnVmZmVyX2xlbiA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuICgoREJ1c1N0cmluZyopcmVhbCwgYnVmZmVyX2xlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbWNweSAocmVhbC0+c3RyICsgKHJlYWwtPmxlbiAtIGJ1ZmZlcl9sZW4pLAorICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICBidWZmZXJfbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgbnVsLXRlcm1pbmF0ZWQgQy1zdHlsZSBzdHJpbmcgdG8gYSBEQnVzU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBidWZmZXIgdGhlIG51bC10ZXJtaW5hdGVkIGNoYXJhY3RlcnMgdG8gYXBwZW5kCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXIpCit7CisgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX2xlbjsKKyAgCisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlciAhPSBOVUxMKTsKKyAgCisgIGJ1ZmZlcl9sZW4gPSBzdHJsZW4gKGJ1ZmZlcik7CisgIGlmIChidWZmZXJfbGVuID4gKHVuc2lnbmVkIGxvbmcpIF9EQlVTX1NUUklOR19NQVhfTEVOR1RIKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHJldHVybiBhcHBlbmQgKHJlYWwsIGJ1ZmZlciwgYnVmZmVyX2xlbik7Cit9CisKKy8qKiBhc3NpZ24gMiBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fMl9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDE2X3QqKShwKSkgPSAqKChkYnVzX3VpbnQxNl90Kikob2N0ZXRzKSk7CisKKy8qKiBhc3NpZ24gNCBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fNF9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDMyX3QqKShwKSkgPSAqKChkYnVzX3VpbnQzMl90Kikob2N0ZXRzKSk7CisKKy8qKiBhc3NpZ24gOCBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fOF9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDY0X3QqKShwKSkgPSAqKChkYnVzX3VpbnQ2NF90Kikob2N0ZXRzKSk7CisKKy8qKgorICogSW5zZXJ0cyAyIGJ5dGVzIGFsaWduZWQgb24gYSAyIGJ5dGUgYm91bmRhcnkKKyAqIHdpdGggYW55IGFsaWdubWVudCBwYWRkaW5nIGluaXRpYWxpemVkIHRvIDAuCisgKgorICogQHBhcmFtIHN0ciB0aGUgREJ1c1N0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBpbnNlcnQKKyAqIEBwYXJhbSBvY3RldHMgMiBieXRlcyB0byBpbnNlcnQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbnNlcnRfMl9hbGlnbmVkIChEQnVzU3RyaW5nICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9jdGV0c1syXSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICBpZiAoIWFsaWduX2luc2VydF9wb2ludF90aGVuX29wZW5fZ2FwIChzdHIsICZpbnNlcnRfYXQsIDIsIDIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBBU1NJR05fMl9PQ1RFVFMgKHJlYWwtPnN0ciArIGluc2VydF9hdCwgb2N0ZXRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIDQgYnl0ZXMgYWxpZ25lZCBvbiBhIDQgYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydAorICogQHBhcmFtIG9jdGV0cyA0IGJ5dGVzIHRvIGluc2VydAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF80X2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgJmluc2VydF9hdCwgNCwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0lHTl80X09DVEVUUyAocmVhbC0+c3RyICsgaW5zZXJ0X2F0LCBvY3RldHMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgOCBieXRlcyBhbGlnbmVkIG9uIGFuIDggYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydAorICogQHBhcmFtIG9jdGV0cyA4IGJ5dGVzIHRvIGluc2VydAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF84X2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzhdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgJmluc2VydF9hdCwgOCwgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGluc2VydF9hdCwgOCkgPT0gKHVuc2lnbmVkKSBpbnNlcnRfYXQpOworICAKKyAgQVNTSUdOXzhfT0NURVRTIChyZWFsLT5zdHIgKyBpbnNlcnRfYXQsIG9jdGV0cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBJbnNlcnRzIHBhZGRpbmcgYXQgKmluc2VydF9hdCBzdWNoIHRvIGFsaWduIGl0IHRvIHRoZSBnaXZlbgorICogYm91bmRhcnkuIEluaXRpYWxpemVzIHRoZSBwYWRkaW5nIHRvIG51bCBieXRlcy4gU2V0cyAqaW5zZXJ0X2F0CisgKiB0byB0aGUgYWxpZ25lZCBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IGxvY2F0aW9uIHRvIGJlIGFsaWduZWQKKyAqIEBwYXJhbSBhbGlnbm1lbnQgYWxpZ25tZW50IGJvdW5kYXJ5ICgxLCAyLCA0LCBvciA4KQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF9hbGlnbm1lbnQgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgaW5zZXJ0X2F0LCBhbGlnbm1lbnQsIDApKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFICgqaW5zZXJ0X2F0LCBhbGlnbm1lbnQpID09ICh1bnNpZ25lZCkgKmluc2VydF9hdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHByaW50Zi1zdHlsZSBmb3JtYXR0ZWQgc3RyaW5nCisgKiB0byB0aGUgI0RCdXNTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZm9ybWF0IHByaW50ZiBmb3JtYXQKKyAqIEBwYXJhbSBhcmdzIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICAgIGFyZ3MpCit7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworICBpbnQgbGVuOworICB2YV9saXN0IGFyZ3NfY29weTsKKworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICBEQlVTX1ZBX0NPUFkgKGFyZ3NfY29weSwgYXJncyk7CisKKyAgLyogTWVhc3VyZSB0aGUgbWVzc2FnZSBsZW5ndGggd2l0aG91dCB0ZXJtaW5hdGluZyBudWwgKi8KKyAgbGVuID0gX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoZm9ybWF0LCBhcmdzKTsKKworICBpZiAobGVuIDwgMCkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBsZW4pKQorICAgIHsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHZzcHJpbnRmICgoY2hhciopIChyZWFsLT5zdHIgKyAocmVhbC0+bGVuIC0gbGVuKSksCisgICAgICAgICAgICBmb3JtYXQsIGFyZ3NfY29weSk7CisgIHJldCA9IFRSVUU7CisKK291dDoKKyAgdmFfZW5kIChhcmdzX2NvcHkpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHByaW50Zi1zdHlsZSBmb3JtYXR0ZWQgc3RyaW5nCisgKiB0byB0aGUgI0RCdXNTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZm9ybWF0IHByaW50ZiBmb3JtYXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKHN0ciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEFwcGVuZHMgYmxvY2sgb2YgYnl0ZXMgd2l0aCB0aGUgZ2l2ZW4gbGVuZ3RoIHRvIGEgREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBieXRlcyB0byBhcHBlbmQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICByZXR1cm4gYXBwZW5kIChyZWFsLCBidWZmZXIsIGxlbik7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJpbmcsIHJldHVybmluZyAjRkFMU0UKKyAqIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gYXBwZW5kCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgaWYgKCFzZXRfbGVuZ3RoIChyZWFsLCByZWFsLT5sZW4gKyAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVhbC0+c3RyW3JlYWwtPmxlbi0xXSA9IGJ5dGU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitkZWxldGUgKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICBpbnQgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgIGludCAgICAgICAgICAgICBsZW4pCit7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm47CisgIAorICBtZW1tb3ZlIChyZWFsLT5zdHIgKyBzdGFydCwgcmVhbC0+c3RyICsgc3RhcnQgKyBsZW4sIHJlYWwtPmxlbiAtIChzdGFydCArIGxlbikpOworICByZWFsLT5sZW4gLT0gbGVuOworICByZWFsLT5zdHJbcmVhbC0+bGVuXSA9ICdcMCc7Cit9CisKKy8qKgorICogRGVsZXRlcyBhIHNlZ21lbnQgb2YgYSBEQnVzU3RyaW5nIHdpdGggbGVuZ3RoIGxlbiBzdGFydGluZyBhdAorICogc3RhcnQuIChIaW50OiB0byBjbGVhciBhbiBlbnRpcmUgc3RyaW5nLCBzZXR0aW5nIGxlbmd0aCB0byAwCisgKiB3aXRoIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoKCkgaXMgZWFzaWVyLikKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQgZGVsZXRpbmcKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBkZWxldGUKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2RlbGV0ZSAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisgIAorICBkZWxldGUgKHJlYWwsIHN0YXJ0LCBsZW4pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvcHkgKERCdXNSZWFsU3RyaW5nICpzb3VyY2UsCisgICAgICBpbnQgICAgICAgICAgICAgc3RhcnQsCisgICAgICBpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgREJ1c1JlYWxTdHJpbmcgKmRlc3QsCisgICAgICBpbnQgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFvcGVuX2dhcCAobGVuLCBkZXN0LCBpbnNlcnRfYXQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIG1lbW1vdmUgKGRlc3QtPnN0ciArIGluc2VydF9hdCwKKyAgICAgICAgICAgc291cmNlLT5zdHIgKyBzdGFydCwKKyAgICAgICAgICAgbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBmb3IgdHdvIHN0cmluZ3Mgd2UncmUgY29weWluZyBhIHNlZ21lbnQgYmV0d2VlbiwKKyAqIGFuZCBkZWNsYXJlcyByZWFsX3NvdXJjZS9yZWFsX2Rlc3QgdmFyaWFibGVzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgb2Zmc2V0CisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdCBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdGhlIGNvcGllZCBzZWdtZW50IGlzIGluc2VydGVkCisgKi8KKyNkZWZpbmUgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRShzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpICAgICAgIFwKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfc291cmNlID0gKERCdXNSZWFsU3RyaW5nKikgc291cmNlOyAgICAgICAgICAgICAgIFwKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfZGVzdCA9IChEQnVzUmVhbFN0cmluZyopIGRlc3Q7ICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc291cmNlKSAhPSAoZGVzdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9zb3VyY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9kZXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghcmVhbF9kZXN0LT5jb25zdGFudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghcmVhbF9kZXN0LT5sb2NrZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQpID49IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQpIDw9IHJlYWxfc291cmNlLT5sZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoaW5zZXJ0X2F0KSA+PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoaW5zZXJ0X2F0KSA8PSByZWFsX2Rlc3QtPmxlbikKKworLyoqCisgKiBNb3ZlcyB0aGUgZW5kIG9mIG9uZSBzdHJpbmcgaW50byBhbm90aGVyIHN0cmluZy4gQm90aCBzdHJpbmdzCisgKiBtdXN0IGJlIGluaXRpYWxpemVkLCB2YWxpZCBzdHJpbmdzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBjaG9wIG9mZiB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBtb3ZlIHRoZSBjaG9wcGVkLW9mZiBwYXJ0IG9mIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX21vdmUgKERCdXNTdHJpbmcgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfc291cmNlID0gKERCdXNSZWFsU3RyaW5nKikgc291cmNlOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWxfc291cmNlLT5sZW4pOworICAKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoc291cmNlLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LCBpbnNlcnRfYXQpOworfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX21vdmUoKSwgYnV0IGRvZXMgbm90IGRlbGV0ZSB0aGUgc2VjdGlvbgorICogb2YgdGhlIHNvdXJjZSBzdHJpbmcgdGhhdCdzIGNvcGllZCB0byB0aGUgZGVzdCBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcGllZCBwYXJ0IG9mIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvcHkgKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRSAoc291cmNlLCBzdGFydCwgZGVzdCwgaW5zZXJ0X2F0KTsKKworICByZXR1cm4gY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0LAorICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0LAorICAgICAgICAgICAgICAgcmVhbF9kZXN0LAorICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3N0cmluZ19tb3ZlKCksIGJ1dCBjYW4gbW92ZSBhIHNlZ21lbnQgZnJvbQorICogdGhlIG1pZGRsZSBvZiB0aGUgc291cmNlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBvZiBzb3VyY2Ugc3RyaW5nIHRvIG1vdmUKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gbW92ZQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBtb3ZlIHRoZSBieXRlcyBmcm9tIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19tb3ZlX2xlbiAoREJ1c1N0cmluZyAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCisKK3sKKyAgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRSAoc291cmNlLCBzdGFydCwgZGVzdCwgaW5zZXJ0X2F0KTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoKHN0YXJ0ICsgbGVuKSA8PSByZWFsX3NvdXJjZS0+bGVuKTsKKworCisgIGlmIChsZW4gPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0YXJ0ID09IDAgJiYKKyAgICAgICAgICAgbGVuID09IHJlYWxfc291cmNlLT5sZW4gJiYKKyAgICAgICAgICAgcmVhbF9kZXN0LT5sZW4gPT0gMCkKKyAgICB7CisgICAgICAvKiBTaG9ydC1jaXJjdWl0IG1vdmluZyBhbiBlbnRpcmUgZXhpc3Rpbmcgc3RyaW5nIHRvIGFuIGVtcHR5IHN0cmluZworICAgICAgICogYnkganVzdCBzd2FwcGluZyB0aGUgYnVmZmVycy4KKyAgICAgICAqLworICAgICAgLyogd2UgYXNzdW1lIC0+Y29uc3RhbnQgZG9lc24ndCBtYXR0ZXIgYXMgeW91IGNhbid0IGhhdmUKKyAgICAgICAqIGEgY29uc3RhbnQgc3RyaW5nIGludm9sdmVkIGluIGEgbW92ZS4KKyAgICAgICAqLworI2RlZmluZSBBU1NJR05fREFUQShhLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYSktPnN0ciA9IChiKS0+c3RyOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYSktPmxlbiA9IChiKS0+bGVuOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYSktPmFsbG9jYXRlZCA9IChiKS0+YWxsb2NhdGVkOyAgICAgICAgXAorICAgICAgICAoYSktPmFsaWduX29mZnNldCA9IChiKS0+YWxpZ25fb2Zmc2V0OyAgXAorICAgICAgfSB3aGlsZSAoMCkKKyAgICAgIAorICAgICAgREJ1c1JlYWxTdHJpbmcgdG1wOworCisgICAgICBBU1NJR05fREFUQSAoJnRtcCwgcmVhbF9zb3VyY2UpOworICAgICAgQVNTSUdOX0RBVEEgKHJlYWxfc291cmNlLCByZWFsX2Rlc3QpOworICAgICAgQVNTSUdOX0RBVEEgKHJlYWxfZGVzdCwgJnRtcCk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgIHJlYWxfZGVzdCwKKyAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBkZWxldGUgKHJlYWxfc291cmNlLCBzdGFydCwKKyAgICAgICAgICAgICAgbGVuKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX2NvcHkoKSwgYnV0IGNhbiBjb3B5IGEgc2VnbWVudCBmcm9tIHRoZSBtaWRkbGUgb2YKKyAqIHRoZSBzb3VyY2Ugc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBjb3B5aW5nIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIGNvcHkKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcGllZCBzZWdtZW50IG9mIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvcHlfbGVuIChjb25zdCBEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRSAoc291cmNlLCBzdGFydCwgZGVzdCwgaW5zZXJ0X2F0KTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbF9zb3VyY2UtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWxfc291cmNlLT5sZW4gLSBzdGFydCk7CisgIAorICByZXR1cm4gY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICByZWFsX2Rlc3QsCisgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworfQorCisvKioKKyAqIFJlcGxhY2VzIGEgc2VnbWVudCBvZiBkZXN0IHN0cmluZyB3aXRoIGEgc2VnbWVudCBvZiBzb3VyY2Ugc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBjb3B5aW5nIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIGNvcHkKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSByZXBsYWNlX2F0IHN0YXJ0IG9mIHNlZ21lbnQgb2YgZGVzdCBzdHJpbmcgdG8gcmVwbGFjZQorICogQHBhcmFtIHJlcGxhY2VfbGVuIGxlbmd0aCBvZiBzZWdtZW50IG9mIGRlc3Qgc3RyaW5nIHRvIHJlcGxhY2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICByZXBsYWNlX2xlbikKK3sKKyAgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRSAoc291cmNlLCBzdGFydCwgZGVzdCwgcmVwbGFjZV9hdCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWxfc291cmNlLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsX3NvdXJjZS0+bGVuIC0gc3RhcnQpOworICBfZGJ1c19hc3NlcnQgKHJlcGxhY2VfYXQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAocmVwbGFjZV9hdCA8PSByZWFsX2Rlc3QtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAocmVwbGFjZV9sZW4gPD0gcmVhbF9kZXN0LT5sZW4gLSByZXBsYWNlX2F0KTsKKworICBpZiAobGVuID09IHJlcGxhY2VfbGVuKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKHJlYWxfZGVzdC0+c3RyICsgcmVwbGFjZV9hdCwKKyAgICAgICAgICAgICAgIHJlYWxfc291cmNlLT5zdHIgKyBzdGFydCwgbGVuKTsKKyAgICB9CisgIGVsc2UgaWYgKGxlbiA8IHJlcGxhY2VfbGVuKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKHJlYWxfZGVzdC0+c3RyICsgcmVwbGFjZV9hdCwKKyAgICAgICAgICAgICAgIHJlYWxfc291cmNlLT5zdHIgKyBzdGFydCwgbGVuKTsKKyAgICAgIGRlbGV0ZSAocmVhbF9kZXN0LCByZXBsYWNlX2F0ICsgbGVuLAorICAgICAgICAgICAgICByZXBsYWNlX2xlbiAtIGxlbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGRpZmY7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobGVuID4gcmVwbGFjZV9sZW4pOworCisgICAgICBkaWZmID0gbGVuIC0gcmVwbGFjZV9sZW47CisKKyAgICAgIC8qIEZpcnN0IG9mIGFsbCB3ZSBjaGVjayBpZiBkZXN0aW5hdGlvbiBzdHJpbmcgY2FuIGJlIGVubGFyZ2VkIGFzCisgICAgICAgKiByZXF1aXJlZCwgdGhlbiB3ZSBvdmVyd3JpdGUgcHJldmlvdXMgYnl0ZXMKKyAgICAgICAqLworCisgICAgICBpZiAoIWNvcHkgKHJlYWxfc291cmNlLCBzdGFydCArIHJlcGxhY2VfbGVuLCBkaWZmLAorICAgICAgICAgICAgICAgICByZWFsX2Rlc3QsIHJlcGxhY2VfYXQgKyByZXBsYWNlX2xlbikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbWVtbW92ZSAocmVhbF9kZXN0LT5zdHIgKyByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPnN0ciArIHN0YXJ0LCByZXBsYWNlX2xlbik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIExvb2tzIGZvciB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgYnl0ZSwgZGVsZXRlcyB0aGF0IGJ5dGUsCisgKiBhbmQgbW92ZXMgZXZlcnl0aGluZyBhZnRlciB0aGUgYnl0ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIHNlcGFyYXRlIHN0cmluZy4gIEJvdGggc3RyaW5ncyBtdXN0IGJlIGluaXRpYWxpemVkLCB2YWxpZAorICogc3RyaW5ncy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gYnl0ZSB0aGUgYnl0ZSB0byByZW1vdmUgYW5kIHNwbGl0IHRoZSBzdHJpbmcgYXQKKyAqIEBwYXJhbSB0YWlsIHRoZSBzcGxpdCBvZmYgc3RyaW5nCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgb3IgaWYgYnl0ZSBjb3VsZCBub3QgYmUgZm91bmQKKyAqCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqdGFpbCkKK3sKKyAgaW50IGJ5dGVfcG9zaXRpb247CisgIGNoYXIgYnl0ZV9zdHJpbmdbMl0gPSAiIjsKKyAgaW50IGhlYWRfbGVuZ3RoOworICBpbnQgdGFpbF9sZW5ndGg7CisKKyAgYnl0ZV9zdHJpbmdbMF0gPSAoY2hhcikgYnl0ZTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kIChzb3VyY2UsIDAsIGJ5dGVfc3RyaW5nLCAmYnl0ZV9wb3NpdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGhlYWRfbGVuZ3RoID0gYnl0ZV9wb3NpdGlvbjsKKyAgdGFpbF9sZW5ndGggPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKSAtIGhlYWRfbGVuZ3RoIC0gMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoc291cmNlLCBieXRlX3Bvc2l0aW9uICsgMSwgdGFpbF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsLCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogcmVtb3ZlIHRoZSB0cmFpbGluZyBkZWxpbWl0ZXIgYnl0ZSBmcm9tIHRoZSBoZWFkIG5vdy4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHNvdXJjZSwgaGVhZF9sZW5ndGgpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogVW5pY29kZSBtYWNyb3MgYW5kIHV0ZjhfdmFsaWRhdGUoKSBmcm9tIEdMaWIgT3dlbiBUYXlsb3IsIEhhdm9jCisgKiBQZW5uaW5ndG9uLCBhbmQgVG9tIFRyb21leSBhcmUgdGhlIGF1dGhvcnMgYW5kIGF1dGhvcml6ZWQgcmVsaWNlbnNlLgorICovCisKKy8qKiBjb21wdXRlcyBsZW5ndGggYW5kIG1hc2sgb2YgYSB1bmljb2RlIGNoYXJhY3RlcgorICogQHBhcmFtIENoYXIgdGhlIGNoYXIKKyAqIEBwYXJhbSBNYXNrIHRoZSBtYXNrIHZhcmlhYmxlIHRvIGFzc2lnbiB0bworICogQHBhcmFtIExlbiB0aGUgbGVuZ3RoIHZhcmlhYmxlIHRvIGFzc2lnbiB0bworICovCisjZGVmaW5lIFVURjhfQ09NUFVURShDaGFyLCBNYXNrLCBMZW4pCQkJCQkgICAgICBcCisgIGlmIChDaGFyIDwgMTI4KQkJCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDE7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHg3ZjsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhlMCkgPT0gMHhjMCkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gMjsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDFmOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGYwKSA9PSAweGUwKQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSAzOwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MGY7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZjgpID09IDB4ZjApCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDQ7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgwNzsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmYykgPT0gMHhmOCkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gNTsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDAzOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGZlKSA9PSAweGZjKQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSA2OwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MDE7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNYXNrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKioKKyAqIGNvbXB1dGVzIGxlbmd0aCBvZiBhIHVuaWNvZGUgY2hhcmFjdGVyIGluIFVURi04CisgKiBAcGFyYW0gQ2hhciB0aGUgY2hhcgorICovCisjZGVmaW5lIFVURjhfTEVOR1RIKENoYXIpICAgICAgICAgICAgICBcCisgICgoQ2hhcikgPCAweDgwID8gMSA6ICAgICAgICAgICAgICAgICBcCisgICAoKENoYXIpIDwgMHg4MDAgPyAyIDogICAgICAgICAgICAgICBcCisgICAgKChDaGFyKSA8IDB4MTAwMDAgPyAzIDogICAgICAgICAgICBcCisgICAgICgoQ2hhcikgPCAweDIwMDAwMCA/IDQgOiAgICAgICAgICBcCisgICAgICAoKENoYXIpIDwgMHg0MDAwMDAwID8gNSA6IDYpKSkpKQorICAgCisvKioKKyAqIEdldHMgYSBVVEYtOCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gUmVzdWx0IHZhcmlhYmxlIGZvciBleHRyYWN0ZWQgdW5pY29kZSBjaGFyLgorICogQHBhcmFtIENoYXJzIHRoZSBieXRlcyB0byBkZWNvZGUKKyAqIEBwYXJhbSBDb3VudCBjb3VudGVyIHZhcmlhYmxlCisgKiBAcGFyYW0gTWFzayBtYXNrIGZvciB0aGlzIGNoYXIKKyAqIEBwYXJhbSBMZW4gbGVuZ3RoIGZvciB0aGlzIGNoYXIgaW4gYnl0ZXMKKyAqLworI2RlZmluZSBVVEY4X0dFVChSZXN1bHQsIENoYXJzLCBDb3VudCwgTWFzaywgTGVuKQkJCSAgICAgIFwKKyAgKFJlc3VsdCkgPSAoQ2hhcnMpWzBdICYgKE1hc2spOwkJCQkJICAgICAgXAorICBmb3IgKChDb3VudCkgPSAxOyAoQ291bnQpIDwgKExlbik7ICsrKENvdW50KSkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBpZiAoKChDaGFycylbKENvdW50KV0gJiAweGMwKSAhPSAweDgwKQkJCQkgICAgICBcCisJewkJCQkJCQkJICAgICAgXAorCSAgKFJlc3VsdCkgPSAtMTsJCQkJCQkgICAgICBcCisJICBicmVhazsJCQkJCQkJICAgICAgXAorCX0JCQkJCQkJCSAgICAgIFwKKyAgICAgIChSZXN1bHQpIDw8PSA2OwkJCQkJCQkgICAgICBcCisgICAgICAoUmVzdWx0KSB8PSAoKENoYXJzKVsoQ291bnQpXSAmIDB4M2YpOwkJCQkgICAgICBcCisgICAgfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBVbmljb2RlICg1LjIpIGNoYXIgaXMgaW4gYSB2YWxpZCByYW5nZS4KKyAqCisgKiBUaGUgZmlyc3QgY2hlY2sgY29tZXMgZnJvbSB0aGUgVW5pY29kZSBndWFyYW50ZWUgdG8gbmV2ZXIgZW5jb2RlCisgKiBhIHBvaW50IGFib3ZlIDB4MDAxMGZmZmYsIHNpbmNlIFVURi0xNiBjb3VsZG4ndCByZXByZXNlbnQgaXQuCisgKgorICogVGhlIHNlY29uZCBjaGVjayBjb3ZlcnMgc3Vycm9nYXRlIHBhaXJzIChjYXRlZ29yeSBDcykuCisgKgorICogQHBhcmFtIENoYXIgdGhlIGNoYXJhY3RlcgorICovCisjZGVmaW5lIFVOSUNPREVfVkFMSUQoQ2hhcikgICAgICAgICAgICAgICAgICAgXAorICAgICgoQ2hhcikgPCAweDExMDAwMCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQ2hhcikgJiAweEZGRkZGODAwKSAhPSAweEQ4MDApKQorCisvKioKKyAqIEZpbmRzIHRoZSBnaXZlbiBzdWJzdHJpbmcgaW4gdGhlIHN0cmluZywKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIHN1YnN0cmluZyB3YXMgZm91bmQsIGlmIGl0IHdhcyBmb3VuZC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIHRoZSBzdWJzdHJpbmcgd2Fzbid0IGZvdW5kLgorICogU2V0cyAqc3RhcnQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHRoZSBzdWJzdHJpbmcKKyAqIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gc3Vic3RyIHRoZSBzdWJzdHJpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGl0IHdhcyBmb3VuZCwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19maW5kX3RvIChzdHIsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29uc3QgREJ1c1JlYWxTdHJpbmcqKXN0ciktPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIsIGZvdW5kKTsKK30KKworLyoqCisgKiBGaW5kcyBlbmQgb2YgbGluZSAoIlxyXG4iIG9yICJcbiIpIGluIHRoZSBzdHJpbmcsCisgKiByZXR1cm5pbmcgI1RSVUUgYW5kIGZpbGxpbmcgaW4gdGhlIGJ5dGUgaW5kZXgKKyAqIHdoZXJlIHRoZSBlb2wgc3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgZW9sIHdhc24ndCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gZm91bmQgcmV0dXJuIGxvY2F0aW9uIGZvciB3aGVyZSBlb2wgd2FzIGZvdW5kIG9yIHN0cmluZyBsZW5ndGggb3RoZXJ3aXNlCisgKiBAcGFyYW0gZm91bmRfbGVuIHJldHVybiBsZW5ndGggb2YgZm91bmQgZW9sIHN0cmluZyBvciB6ZXJvIG90aGVyd2lzZQorICogQHJldHVybnMgI1RSVUUgaWYgZm91bmQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19maW5kX2VvbCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kX2xlbikKK3sKKyAgaW50IGk7CisKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSAnXHInKSAKKyAgICAgICAgeworICAgICAgICAgIGlmICgoaSsxKSA8IHJlYWwtPmxlbiAmJiByZWFsLT5zdHJbaSsxXSA9PSAnXG4nKSAvKiAiXHJcbiIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZvdW5kKSAKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgICAgICpmb3VuZF9sZW4gPSAyOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgZWxzZSAvKiBvbmx5ICJcciIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZvdW5kKSAKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgICAgICpmb3VuZF9sZW4gPSAxOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgIGVsc2UgaWYgKHJlYWwtPnN0cltpXSA9PSAnXG4nKSAgLyogb25seSAiXG4iICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgKmZvdW5kID0gaTsKKyAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDE7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IHJlYWwtPmxlbjsKKworICBpZiAoZm91bmRfbGVuKQorICAgICpmb3VuZF9sZW4gPSAwOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBnaXZlbiBzdWJzdHJpbmcgaW4gdGhlIHN0cmluZywKKyAqIHVwIHRvIGEgY2VydGFpbiBwb3NpdGlvbiwKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIHN1YnN0cmluZyB3YXMgZm91bmQsIGlmIGl0IHdhcyBmb3VuZC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIHRoZSBzdWJzdHJpbmcgd2Fzbid0IGZvdW5kLgorICogU2V0cyAqc3RhcnQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHRoZSBzdWJzdHJpbmcKKyAqIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3AgbG9va2luZworICogQHBhcmFtIHN1YnN0ciB0aGUgc3Vic3RyaW5nCisgKiBAcGFyYW0gZm91bmQgcmV0dXJuIGxvY2F0aW9uIGZvciB3aGVyZSBpdCB3YXMgZm91bmQsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfdG8gKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKwkJICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisJCSAgICAgIGludCAgICAgICAgICAgICAgIGVuZCwKKwkJICAgICAgY29uc3QgY2hhciAgICAgICAqc3Vic3RyLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN1YnN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN1YnN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBlbmQpOworCisgIC8qIHdlIGFsd2F5cyAiZmluZCIgYW4gZW1wdHkgc3RyaW5nICovCisgIGlmICgqc3Vic3RyID09ICdcMCcpCisgICAgeworICAgICAgaWYgKGZvdW5kKQorICAgICAgICAqZm91bmQgPSBzdGFydDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgZW5kKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gc3Vic3RyWzBdKQorICAgICAgICB7CisgICAgICAgICAgaW50IGogPSBpICsgMTsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoaiA8IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHN1YnN0cltqIC0gaV0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZWxzZSBpZiAocmVhbC0+c3RyW2pdICE9IHN1YnN0cltqIC0gaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc3Vic3RyW2ogLSBpXSA9PSAnXDAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgKmZvdW5kID0gaTsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gZW5kOworICAKKyAgcmV0dXJuIEZBTFNFOyAgCit9CisKKy8qKgorICogRmluZHMgYSBibGFuayAoc3BhY2Ugb3IgdGFiKSBpbiB0aGUgc3RyaW5nLiBSZXR1cm5zICNUUlVFCisgKiBpZiBmb3VuZCwgI0ZBTFNFIG90aGVyd2lzZS4gSWYgYSBibGFuayBpcyBub3QgZm91bmQgc2V0cworICogKmZvdW5kIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBmb3VuZCBwbGFjZSB0byBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGJsYW5rCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIGJsYW5rIHdhcyBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgcmVhbC0+bGVuKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gJyAnIHx8CisgICAgICAgICAgcmVhbC0+c3RyW2ldID09ICdcdCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IHJlYWwtPmxlbjsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTa2lwcyBibGFua3MgZnJvbSBzdGFydCwgc3RvcmluZyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGluICplbmQKKyAqIChibGFuayBpcyBzcGFjZSBvciB0YWIpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3JlIHRoZSBmaXJzdCBub24tYmxhbmsgYnl0ZSBpbmRleAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgcmVhbC0+bGVuKQorICAgIHsKKyAgICAgIGlmICghREJVU19JU19BU0NJSV9CTEFOSyAocmVhbC0+c3RyW2ldKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpID09IHJlYWwtPmxlbiB8fCAhREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ldKSk7CisgIAorICBpZiAoZW5kKQorICAgICplbmQgPSBpOworfQorCisKKy8qKgorICogU2tpcHMgd2hpdGVzcGFjZSBmcm9tIHN0YXJ0LCBzdG9yaW5nIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBpbiAqZW5kLgorICogKHdoaXRlc3BhY2UgaXMgc3BhY2UsIHRhYiwgbmV3bGluZSwgQ1IpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3JlIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBieXRlIGluZGV4CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19za2lwX3doaXRlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPT0gcmVhbC0+bGVuIHx8ICEoREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ldKSkpOworICAKKyAgaWYgKGVuZCkKKyAgICAqZW5kID0gaTsKK30KKworLyoqCisgKiBTa2lwcyB3aGl0ZXNwYWNlIGZyb20gZW5kLCBzdG9yaW5nIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdHJhaWxpbmcKKyAqIHdoaXRlc3BhY2UgaW4gKnN0YXJ0LiAod2hpdGVzcGFjZSBpcyBzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0YXJ0IHNjYW5uaW5nIGJhY2t3YXJkCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RvcmUgdGhlIHN0YXJ0IG9mIHdoaXRlc3BhY2UgY2hhcnMKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3NraXBfd2hpdGVfcmV2ZXJzZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc3RhcnQpCit7CisgIGludCBpOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPj0gMCk7CisgIAorICBpID0gZW5kOworICB3aGlsZSAoaSA+IDApCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaS0xXSkpCisgICAgICAgIGJyZWFrOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCAmJiAoaSA9PSAwIHx8ICEoREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ktMV0pKSkpOworICAKKyAgaWYgKHN0YXJ0KQorICAgICpzdGFydCA9IGk7Cit9CisKKy8qKgorICogQXNzaWducyBhIG5ld2xpbmUtdGVybWluYXRlZCBvciBcXHJcXG4tdGVybWluYXRlZCBsaW5lIGZyb20gdGhlIGZyb250CisgKiBvZiB0aGUgc3RyaW5nIHRvIHRoZSBnaXZlbiBkZXN0IHN0cmluZy4gVGhlIGRlc3Qgc3RyaW5nJ3MgcHJldmlvdXMKKyAqIGNvbnRlbnRzIGFyZSBkZWxldGVkLiBJZiB0aGUgc291cmNlIHN0cmluZyBjb250YWlucyBubyBuZXdsaW5lLAorICogbW92ZXMgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nIHRvIHRoZSBkZXN0IHN0cmluZy4KKyAqCisgKiBAdG9kbyBvd2VuIGNvcnJlY3RseSBub3RlcyB0aGF0IHRoaXMgaXMgYSBzdHVwaWQgZnVuY3Rpb24gKGl0IHdhcworICogd3JpdHRlbiBwdXJlbHkgZm9yIHRlc3QgY29kZSwKKyAqIGUuZy4gZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYykuIFByb2JhYmx5IHNob3VsZCBiZSBlbmZvcmNlZCBhcyB0ZXN0CisgKiBjb2RlIG9ubHkgd2l0aCBpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICogCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nIChjb250ZW50cyBhcmUgcmVwbGFjZWQpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5LCBvciBzb3VyY2UgaGFzIGxlbmd0aCAwCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqZGVzdCkKK3sKKyAgaW50IGVvbCwgZW9sX2xlbjsKKyAgCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkZXN0LCAwKTsKKyAgCisgIGVvbCA9IDA7CisgIGVvbF9sZW4gPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoc291cmNlLCAwLCAmZW9sLCAmZW9sX2xlbikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChlb2wgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkpOworICAgICAgaWYgKGVvbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogSWYgdGhlcmUncyBubyBuZXdsaW5lIGFuZCBzb3VyY2UgaGFzIHplcm8gbGVuZ3RoLCB3ZSdyZSBkb25lICovCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAvKiBvdGhlcndpc2UsIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZpbGUgaGFzIG5vIGVvbCBjaGFyYWN0ZXJzICovCisgICAgfQorCisgIC8qIHJlbWVtYmVyIGVvbCBjYW4gYmUgMCBpZiBpdCdzIGFuIGVtcHR5IGxpbmUsIGJ1dCBlb2xfbGVuIHNob3VsZCBub3QgYmUgemVybyBhbHNvCisgICAqIHNpbmNlIGZpbmRfZW9sIHJldHVybmVkIFRSVUUKKyAgICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoc291cmNlLCAwLCBlb2wgKyBlb2xfbGVuLCBkZXN0LCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAvKiByZW1vdmUgbGluZSBlbmRpbmcgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGVzdCwgZW9sKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5IHdoZW4gc2hvcnRlbmluZyBhIHN0cmluZyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIERlbGV0ZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZmlyc3QgYmxhbmsgc3BhY2UKKyAqIGluIHRoZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoc3RyLCAwLCAmaSkpCisgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaSwgJmkpOworCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHN0ciwgMCwgaSk7Cit9CisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIERlbGV0ZXMgYW55IGxlYWRpbmcgYmxhbmtzIGluIHRoZSBzdHJpbmcKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIDAsICZpKTsKKworICBpZiAoaSA+IDApCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCAwLCBpKTsKK30KKyNlbmRpZgorCisvKioKKyAqIERlbGV0ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlIChzdHIsIDAsICZpKTsKKworICBpZiAoaSA+IDApCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCAwLCBpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlX3JldmVyc2UgKHN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0ciksICZpKTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBpKTsKK30KKworLyoqCisgKiBUZXN0cyB0d28gREJ1c1N0cmluZyBmb3IgZXF1YWxpdHkuCisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbCAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2IgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBiOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2IpOworCisgIGlmIChyZWFsX2EtPmxlbiAhPSByZWFsX2ItPmxlbikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYXAgPSByZWFsX2EtPnN0cjsKKyAgYnAgPSByZWFsX2ItPnN0cjsKKyAgYV9lbmQgPSByZWFsX2EtPnN0ciArIHJlYWxfYS0+bGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFRlc3RzIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eSB1cCB0byB0aGUgZ2l2ZW4gbGVuZ3RoLgorICogVGhlIHN0cmluZ3MgbWF5IGJlIHNob3J0ZXIgdGhhbiB0aGUgZ2l2ZW4gbGVuZ3RoLgorICoKKyAqIEB0b2RvIHdyaXRlIGEgdW5pdCB0ZXN0CisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHBhcmFtIGxlbiB0aGUgbWF4aW11bSBsZW5ndGggdG8gbG9vayBhdAorICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9sZW4gKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisKKyAgaWYgKHJlYWxfYS0+bGVuICE9IHJlYWxfYi0+bGVuICYmCisgICAgICAocmVhbF9hLT5sZW4gPCBsZW4gfHwgcmVhbF9iLT5sZW4gPCBsZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IHJlYWxfYi0+c3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgTUlOIChyZWFsX2EtPmxlbiwgbGVuKTsKKyAgd2hpbGUgKGFwICE9IGFfZW5kKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBUZXN0cyB0d28gc3ViLXBhcnRzIG9mIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eS4gIFRoZSBzcGVjaWZpZWQKKyAqIHJhbmdlIG9mIHRoZSBmaXJzdCBzdHJpbmcgbXVzdCBleGlzdDsgdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbgorICogb2YgdGhlIHNlY29uZCBzdHJpbmcgbXVzdCBleGlzdC4KKyAqCisgKiBAdG9kbyB3cml0ZSBhIHVuaXQgdGVzdAorICoKKyAqIEB0b2RvIG1lbWNtcCBpcyBwcm9iYWJseSBmYXN0ZXIKKyAqCisgKiBAcGFyYW0gYSBmaXJzdCBzdHJpbmcKKyAqIEBwYXJhbSBhX3N0YXJ0IHdoZXJlIHRvIHN0YXJ0IHN1YnN0cmluZyBpbiBmaXJzdCBzdHJpbmcKKyAqIEBwYXJhbSBhX2xlbiBsZW5ndGggb2Ygc3Vic3RyaW5nIGluIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHBhcmFtIGJfc3RhcnQgd2hlcmUgdG8gc3RhcnQgc3Vic3RyaW5nIGluIHNlY29uZCBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0d28gc3Vic3RyaW5ncyBhcmUgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBiX3N0YXJ0KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisgIF9kYnVzX2Fzc2VydCAoYV9zdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhX2xlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhX3N0YXJ0IDw9IHJlYWxfYS0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChhX2xlbiA8PSByZWFsX2EtPmxlbiAtIGFfc3RhcnQpOworICBfZGJ1c19hc3NlcnQgKGJfc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoYl9zdGFydCA8PSByZWFsX2ItPmxlbik7CisgIAorICBpZiAoYV9sZW4gPiByZWFsX2ItPmxlbiAtIGJfc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFwID0gcmVhbF9hLT5zdHIgKyBhX3N0YXJ0OworICBicCA9IHJlYWxfYi0+c3RyICsgYl9zdGFydDsKKyAgYV9lbmQgPSBhcCArIGFfbGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYnAgPD0gKHJlYWxfYi0+c3RyICsgcmVhbF9iLT5sZW4pKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgc3RyaW5nIGlzIGVxdWFsIHRvIGEgQyBzdHJpbmcuCisgKgorICogQHBhcmFtIGEgdGhlIHN0cmluZworICogQHBhcmFtIGNfc3RyIHRoZSBDIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqY19zdHIpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgYXAgPSByZWFsX2EtPnN0cjsKKyAgYnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIGNfc3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgcmVhbF9hLT5sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCAmJiAqYnApCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIGlmIChhcCAhPSBhX2VuZCB8fCAqYnApCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIGdpdmVuIEMgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBhIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBjX3N0ciB0aGUgQyBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHN0cmluZyBzdGFydHMgd2l0aCBpdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyIChjb25zdCBEQnVzU3RyaW5nICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIF9kYnVzX2Fzc2VydCAoY19zdHIgIT0gTlVMTCk7CisgIAorICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kICYmICpicCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgaWYgKCpicCA9PSAnXDAnKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFwcGVuZHMgYSB0d28tY2hhcmFjdGVyIGhleCBkaWdpdCB0byBhIHN0cmluZywgd2hlcmUgdGhlIGhleCBkaWdpdAorICogaGFzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYnl0ZS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBieXRlIHRoZSBieXRlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGVfYXNfaGV4IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisgIGNvbnN0IGNoYXIgaGV4ZGlnaXRzWzE2XSA9IHsKKyAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJworICB9OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkaWdpdHNbKGJ5dGUgPj4gNCldKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZGlnaXRzWyhieXRlICYgMHgwZildKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gMSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEVuY29kZXMgYSBzdHJpbmcgaW4gaGV4LCB0aGUgd2F5IE1ENSBhbmQgU0hBLTEgYXJlIHVzdWFsbHkKKyAqIGVuY29kZWQuIChFYWNoIGJ5dGUgaXMgdHdvIGhleCBkaWdpdHMuKQorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBlbmNvZGUKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGVuY29kaW5nCisgKiBAcGFyYW0gZGVzdCBzdHJpbmcgd2hlcmUgZW5jb2RlZCBkYXRhIHNob3VsZCBiZSBwbGFjZWQKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgZW5jb2RlZCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlbmNvZGluZyB3YXMgc3VjY2Vzc2Z1bCwgI0ZBTFNFIGlmIG5vIG1lbW9yeSBldGMuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKCZyZXN1bHQsICpwKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgICsrcDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnJlc3VsdCwgMCwgZGVzdCwgaW5zZXJ0X2F0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIGhleCBlbmNvZGluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzdHJpbmcgdG8gZGVjb2RlCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBpbmRleCB0byBzdGFydCBkZWNvZGUKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBoZXggZGF0YSwgb3IgI05VTEwKKyAqIEBwYXJhbSBkZXN0IHN0cmluZyB3aGVyZSBkZWNvZGVkIGRhdGEgc2hvdWxkIGJlIHBsYWNlZAorICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSBkZWNvZGVkIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIGRlY29kaW5nIHdhcyBzdWNjZXNzZnVsLCAjRkFMU0UgaWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKwkJCSBpbnQgICAgICAgICAgICAgICplbmRfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IGhpZ2hfYml0czsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBoaWdoX2JpdHMgPSBUUlVFOworICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsOworCisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgIHZhbCA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgIHZhbCA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgIHZhbCA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgIHZhbCA9IDU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHZhbCA9IDY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgIHZhbCA9IDc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgIHZhbCA9IDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgIHZhbCA9IDk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICB2YWwgPSAxMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgIHZhbCA9IDExOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgdmFsID0gMTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICB2YWwgPSAxMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgIHZhbCA9IDE0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgdmFsID0gMTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgIGlmIChoaWdoX2JpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIDw8IDQpKQorCSAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnJlc3VsdCk7CisgICAgICAgICAgCisgICAgICAgICAgYiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSk7CisKKyAgICAgICAgICBiIHw9IHZhbDsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSwgYik7CisgICAgICAgIH0KKworICAgICAgaGlnaF9iaXRzID0gIWhpZ2hfYml0czsKKworICAgICAgKytwOworICAgIH0KKworIGRvbmU6CisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZyZXN1bHQsIDAsIGRlc3QsIGluc2VydF9hdCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7ICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBBU0NJSSB3aXRoIG5vCisgKiBudWwgYnl0ZXMuIElmIHRoZSBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZQorICogc3RyaW5nLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGFsbCB2YWxpZCBBU0NJSQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghX0RCVVNfSVNBU0NJSSAoKnMpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAKKyAgICAgICsrczsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byBsb3dlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdBJyAmJiAqcyA8PSAnWicpCisgICAgICAgICAgKnMgKz0gJ2EnIC0gJ0EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byB1cHBlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdhJyAmJiAqcyA8PSAneicpCisgICAgICAgICAgKnMgKz0gJ0EnIC0gJ2EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBVVEYtOC4gSWYgdGhlCisgKiBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZSBzdHJpbmcsIHJldHVybnMKKyAqICNGQUxTRS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgbnVsIGJ5dGVzIGluIHRoZSBnaXZlbiByYW5nZSwKKyAqIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgc3RhcnQgYW5kIHN0YXJ0K2xlbiBhcmUgbm90IG9uIGNoYXJhY3RlcgorICogYm91bmRhcmllcywgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhbGwgdmFsaWQgVVRGLTgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIC8qIHdlIGFyZSBkb2luZyBfREJVU19VTkxJS0VMWSgpIGhlcmUgd2hpY2ggbWlnaHQgYmUKKyAgICogZHViaW91cyBpbiBhIGdlbmVyaWMgbGlicmFyeSBsaWtlIEdMaWIsIGJ1dCBpbiBELUJ1cworICAgKiB3ZSBrbm93IHdlJ3JlIHZhbGlkYXRpbmcgbWVzc2FnZXMgYW5kIHRoYXQgaXQgd291bGQKKyAgICogb25seSBiZSBldmlsL2Jyb2tlbiBhcHBzIHRoYXQgd291bGQgaGF2ZSBpbnZhbGlkCisgICAqIFVURi04LiBBbHNvLCB0aGlzIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIGEgcGVyZm9ybWFuY2UKKyAgICogYm90dGxlbmVjayBpbiBwcm9maWxlcy4KKyAgICovCisgIAorICBpZiAoX0RCVVNfVU5MSUtFTFkgKGxlbiA+IHJlYWwtPmxlbiAtIHN0YXJ0KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBwID0gcmVhbC0+c3RyICsgc3RhcnQ7CisgIGVuZCA9IHAgKyBsZW47CisgIAorICB3aGlsZSAocCA8IGVuZCkKKyAgICB7CisgICAgICBpbnQgaSwgbWFzaywgY2hhcl9sZW47CisgICAgICBkYnVzX3VuaWNoYXJfdCByZXN1bHQ7CisKKyAgICAgIC8qIG51bCBieXRlcyBjb25zaWRlcmVkIGludmFsaWQgKi8KKyAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLyogU3BlY2lhbC1jYXNlIEFTQ0lJOyB0aGlzIG1ha2VzIHVzIGdvIGEgbG90IGZhc3RlciBpbgorICAgICAgICogRC1CdXMgcHJvZmlsZXMgd2hlcmUgd2UgYXJlIHR5cGljYWxseSB2YWxpZGF0aW5nCisgICAgICAgKiBmdW5jdGlvbiBuYW1lcyBhbmQgc3VjaC4gV2UgaGF2ZSB0byBrbm93IHRoYXQKKyAgICAgICAqIGFsbCBmb2xsb3dpbmcgY2hlY2tzIHdpbGwgcGFzcyBmb3IgQVNDSUkgdGhvdWdoLAorICAgICAgICogY29tbWVudHMgZm9sbG93IC4uLgorICAgICAgICovICAgICAgCisgICAgICBpZiAoKnAgPCAxMjgpCisgICAgICAgIHsKKyAgICAgICAgICArK3A7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgVVRGOF9DT01QVVRFICgqcCwgbWFzaywgY2hhcl9sZW4pOworCisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKGNoYXJfbGVuID09IDApKSAgLyogQVNDSUk6IGNoYXJfbGVuID09IDEgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBieXRlcyBleGlzdHMgaW4gdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoKGVuZCAtIHApIDwgY2hhcl9sZW4pKSAvKiBBU0NJSTogcCA8IGVuZCBhbmQgY2hhcl9sZW4gPT0gMSAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBVVEY4X0dFVCAocmVzdWx0LCBwLCBpLCBtYXNrLCBjaGFyX2xlbik7CisKKyAgICAgIC8qIENoZWNrIGZvciBvdmVybG9uZyBVVEYtOCAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChVVEY4X0xFTkdUSCAocmVzdWx0KSAhPSBjaGFyX2xlbikpIC8qIEFTQ0lJOiBVVEY4X0xFTkdUSCA9PSAxICovCisgICAgICAgIGJyZWFrOworI2lmIDAKKyAgICAgIC8qIFRoZSBVTklDT0RFX1ZBTElEIGNoZWNrIGJlbG93IHdpbGwgY2F0Y2ggdGhpcyAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChyZXN1bHQgPT0gKGRidXNfdW5pY2hhcl90KS0xKSkgLyogQVNDSUk6IHJlc3VsdCA9IGFzY2lpIHZhbHVlICovCisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVVOSUNPREVfVkFMSUQgKHJlc3VsdCkpKSAvKiBBU0NJSTogYWx3YXlzIHZhbGlkICovCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBVTklDT0RFX1ZBTElEIHNob3VsZCBoYXZlIGNhdWdodCBpdCAqLworICAgICAgX2RidXNfYXNzZXJ0IChyZXN1bHQgIT0gKGRidXNfdW5pY2hhcl90KS0xKTsKKyAgICAgIAorICAgICAgcCArPSBjaGFyX2xlbjsKKyAgICB9CisKKyAgLyogU2VlIHRoYXQgd2UgY292ZXJlZCB0aGUgZW50aXJlIGxlbmd0aCBpZiBhIGxlbmd0aCB3YXMKKyAgICogcGFzc2VkIGluCisgICAqLworICBpZiAoX0RCVVNfVU5MSUtFTFkgKHAgIT0gZW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhbGwgbnVsIGJ5dGVzLiBJZiB0aGUKKyAqIGdpdmVuIHJhbmdlIGlzIG5vdCBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlIHN0cmluZywgcmV0dXJucworICogI0ZBTFNFLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYWxsIG51bCBieXRlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgqcyAhPSAnXDAnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytzOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsZWFycyBhbGwgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSBzdHJpbmcgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3plcm8gKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgbWVtc2V0IChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsICdcMCcsIHJlYWwtPmFsbG9jYXRlZCk7Cit9CisvKiogQH0gKi8KKworLyogdGVzdHMgYXJlIGluIGRidXMtc3RyaW5nLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN0cmluZy5oIGIvZGJ1cy9kYnVzLXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjcwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3RyaW5nLmgKQEAgLTAsMCArMSwzODkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmcuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX0gKKyNkZWZpbmUgREJVU19TVFJJTkdfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogREJ1c1N0cmluZyBvYmplY3QKKyAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzU3RyaW5nIERCdXNTdHJpbmc7CisKK3N0cnVjdCBEQnVzU3RyaW5nCit7CisjaWYgZGVmaW5lZChEQlVTX1dJTikgJiYgZGVmaW5lZChfREVCVUcpCisgIGNvbnN0IGNoYXIgKmR1bW15MTsgLyoqPCBwbGFjZWhvbGRlciAqLworI2Vsc2UKKyAgY29uc3Qgdm9pZCAqZHVtbXkxOyAvKio8IHBsYWNlaG9sZGVyICovCisjZW5kaWYKKyAgaW50ICAgZHVtbXkyOyAgICAgICAvKio8IHBsYWNlaG9sZGVyICovCisgIGludCAgIGR1bW15MzsgICAgICAgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXlfYml0MSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15X2JpdDIgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teV9iaXQzIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXlfYml0cyA6IDM7IC8qKjwgcGxhY2Vob2xkZXIgKi8KK307CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisvKiBTb21lIHNpbXBsZSBpbmxpbmluZyBoYWNrczsgdGhlIGN1cnJlbnQgbGlua2VyIGlzIG5vdCBzbWFydCBlbm91Z2gKKyAqIHRvIGlubGluZSBub24tZXhwb3J0ZWQgc3ltYm9scyBhY3Jvc3MgZmlsZXMgaW4gdGhlIGxpYnJhcnkuCisgKiBOb3RlIHRoYXQgdGhlc2UgYnJlYWsgdHlwZSBzYWZldHkgKGR1ZSB0byB0aGUgY2FzdHMpCisgKi8KKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9kYXRhKHMpICgoY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocykgKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkyKQorI2RlZmluZSBfZGJ1c19zdHJpbmdfc2V0X2J5dGUocywgaSwgYikgKCgoKHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pID0gKHVuc2lnbmVkIGNoYXIpIChiKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9ieXRlKHMsIGkpICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShzKSAoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4ocyxzdGFydCxsZW4pICgoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpICsgKHN0YXJ0KSkKKyNlbmRpZgorCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbml0ICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxsb2NhdGVfc2l6ZSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19pbml0X2Zyb21fc3RyaW5nICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmZyb20pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2xvY2sgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb21wYWN0ICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBtYXhfd2FzdGUpOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NoYXIqICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9kYXRhICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YQorREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKTsKKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKi8KK2NoYXIqICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbgorREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworI2VuZGlmCisjaWZuZGVmIF9kYnVzX3N0cmluZ19zZXRfYnl0ZQorREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworI2VuZGlmCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZQorREJVU19QUklWQVRFX0VYUE9SVAordW5zaWduZWQgY2hhciBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQpOworI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAqLworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaSwKKwkJCQkJCSAgaW50ICAgICAgICAgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqKmRhdGFfcmV0dXJuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGFfbGVuICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqKmRhdGFfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfY29weV9kYXRhICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfY29weV9kYXRhX2xlbiAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlciAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICpidWZmZXIsCisJCQkJCQkgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXJfd2l0aF9udWwgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYXZhaWxfbGVuKTsKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0cik7CisjZW5kaWYgLyogIV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICovCisKKy8qKgorICogR2V0IHRoZSBzdHJpbmcncyBsZW5ndGggYXMgYW4gdW5zaWduZWQgaW50ZWdlciwgZm9yIGNvbXBhcmlzb24gd2l0aAorICogc2l6ZV90IGFuZCBzaW1pbGFyIHVuc2lnbmVkIHR5cGVzIHRoYXQgZG9lcyBub3QgdHJpZ2dlciBjb21waWxlcgorICogd2FybmluZ3MgYWJvdXQgcG90ZW50aWFsIHZhbHVlIGNoYW5nZXMgZHVyaW5nIGNvbnZlcnNpb24uCisgKgorICogREJ1c1N0cmluZyBsZW5ndGhzIGFyZSBzaWduZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IHdlIGtub3cgdGhhdAorICogdGhlIGxlbmd0aCBpcyBhbHdheXMgPj0gMCAoYW5kIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgYXNzZXJ0cworICogdGhhdCB0aGlzIGlzIHRoZSBjYXNlKSBzbyB3ZSBrbm93IHRoYXQgdGhpcyBjYXN0IGRvZXMgbm90IGNoYW5nZSB0aGUKKyAqIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorX2RidXNfc3RyaW5nX2dldF9sZW5ndGhfdWludCAoY29uc3QgREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gKHVuc2lnbmVkIGludCkgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7Cit9CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2xlbmd0aGVuICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGVuZ3RoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbmd0aF90b19yZW1vdmUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuZ3RoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FsaWduX2xlbmd0aCAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFsaWdubWVudCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBleHRyYV9ieXRlcyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmQgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpidWZmZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgIHZhbHVlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgIHZhbHVlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgyLCAzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICAgIGFyZ3MpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0XzJfYWxpZ25lZCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9jdGV0c1syXSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfNF9hbGlnbmVkICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luc2VydF84X2FsaWduZWQgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX21vdmUgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5ICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbW92ZV9sZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvcHlfbGVuICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgcmVwbGFjZV9sZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKnRhaWwpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmRfcmV0dXJuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAqdmFsdWVfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZW5kX3JldHVybik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfZW9sICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kX2xlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kX3RvICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZSAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmQpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZV9yZXZlcnNlICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqc3RhcnQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWwgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmNfc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYl9zdGFydCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqY19zdHIpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmNfc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3BvcF9saW5lICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOyAKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorCQkJCQkJICBpbnQgICAgICAgICAgICAgICAqZW5kX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfemVybyAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKworCisvKioKKyAqIFdlIGFsbG9jYXRlIDEgYnl0ZSBmb3IgbnVsIHRlcm1pbmF0aW9uLCBwbHVzIDcgYnl0ZXMgZm9yIHBvc3NpYmxlCisgKiBhbGlnbl9vZmZzZXQsIHNvIHdlIGFsd2F5cyBuZWVkIDggYnl0ZXMgb24gdG9wIG9mIHRoZSBzdHJpbmcncworICogbGVuZ3RoIHRvIGJlIGluIHRoZSBhbGxvY2F0ZWQgYmxvY2suCisgKi8KKyNkZWZpbmUgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyA4CisKKy8qKgorICogRGVmaW5lcyBhIHN0YXRpYyBjb25zdCB2YXJpYWJsZSB3aXRoIHR5cGUgI0RCdXNTdHJpbmcgY2FsbGVkICJuYW1lIgorICogY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nIGxpdGVyYWwuCisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdmFsdWUKKyAqLworI2RlZmluZSBfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhuYW1lLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgY2hhciBfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZVtdID0gc3RyOyAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgREJ1c1N0cmluZyBuYW1lID0geyBfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWUpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWUpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBGQUxTRSwgMCB9CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3ludGF4LmMgYi9kYnVzL2RidXMtc3ludGF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmNjU5YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeW50YXguYwpAQCAtMCwwICsxLDMwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5bnRheC5jIC0gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHN0cmluZ3Mgd2l0aCBzcGVjaWFsIHN5bnRheAorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zeW50YXguaCIKKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGFyZWQuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N5bnRheCBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RyaW5ncyB3aXRoIHNwZWNpYWwgc3ludGF4CisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgRC1CdXMgdHlwZSBzaWduYXR1cmVzCisgKiBAeworICovCisKKy8qKgorICogQ2hlY2sgYW4gb2JqZWN0IHBhdGggZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMIGNhbiBhbHdheXMKKyAqIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGhhdmluZworICogYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIHBhdGggYSBwb3RlbnRpYWxseSBpbnZhbGlkIG9iamVjdCBwYXRoLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgcGF0aCBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9wYXRoIChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBsZW47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcGF0aCk7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICAvKiBJbiBnZW5lcmFsLCBpdCBvdWdodCB0byBiZSB2YWxpZC4uLiAqLworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c192YWxpZGF0ZV9wYXRoICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgcGF0aCB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJPYmplY3QgcGF0aCB3YXMgbm90IHZhbGlkOiAnJXMnIiwgcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVjayBhbiBpbnRlcmZhY2UgbmFtZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cworICogYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nCisgKiBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gbmFtZSBhIHBvdGVudGlhbGx5IGludmFsaWQgaW50ZXJmYWNlIG5hbWUsIHdoaWNoIG11c3Qgbm90IGJlICNOVUxMCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBsZW47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICAvKiBJbiBnZW5lcmFsLCBpdCBvdWdodCB0byBiZSB2YWxpZC4uLiAqLworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsIGxlbikpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHNsb3cgcGF0aDogc3RyaW5nIGlzIGludmFsaWQsIGZpbmQgb3V0IHdoeSAqLworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsIGxlbikpCisgICAgeworICAgICAgLyogZG9uJ3QgcXVvdGUgdGhlIGFjdHVhbCBzdHJpbmcgaGVyZSwgc2luY2UgYSBEQnVzRXJyb3IgYWxzbyBuZWVkcyB0bworICAgICAgICogYmUgdmFsaWQgVVRGLTggKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBuYW1lIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRklYTUU6IGxhdGVyLCBkaWFnbm9zZSBleGFjdGx5IGhvdyBpdCB3YXMgaW52YWxpZCAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBuYW1lIHdhcyBub3QgdmFsaWQ6ICclcyciLCBuYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGEgbWVtYmVyIChtZXRob2Qvc2lnbmFsKSBuYW1lIGZvciB2YWxpZGl0eS4gUmVtZW1iZXIgdGhhdCAjTlVMTAorICogY2FuIGFsd2F5cyBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dAorICogaGF2aW5nIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBuYW1lIGEgcG90ZW50aWFsbHkgaW52YWxpZCBtZW1iZXIgbmFtZSwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5hbWUgaXMgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdmFsaWRhdGVfbWVtYmVyIChjb25zdCBjaGFyICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnN0ciwgMCwgbGVuKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogc2xvdyBwYXRoOiBzdHJpbmcgaXMgaW52YWxpZCwgZmluZCBvdXQgd2h5ICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAgICAgKiBiZSB2YWxpZCBVVEYtOCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgd2FzIG5vdCB2YWxpZCBVVEYtOCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBGSVhNRTogbGF0ZXIsIGRpYWdub3NlIGV4YWN0bHkgaG93IGl0IHdhcyBpbnZhbGlkICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgd2FzIG5vdCB2YWxpZDogJyVzJyIsIG5hbWUpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2sgYW4gZXJyb3IgbmFtZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwKKyAqIGNhbiBhbHdheXMgYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQKKyAqIGhhdmluZyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gbmFtZSBhIHBvdGVudGlhbGx5IGludmFsaWQgZXJyb3IgbmFtZSwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5hbWUgaXMgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgbGVuOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIG5hbWUpOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgLyogSW4gZ2VuZXJhbCwgaXQgb3VnaHQgdG8gYmUgdmFsaWQuLi4gKi8KKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwgbGVuKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogc2xvdyBwYXRoOiBzdHJpbmcgaXMgaW52YWxpZCwgZmluZCBvdXQgd2h5ICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAgICAgKiBiZSB2YWxpZCBVVEYtOCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbmFtZSB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJFcnJvciBuYW1lIHdhcyBub3QgdmFsaWQ6ICclcyciLCBuYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGEgYnVzIG5hbWUgZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMCisgKiBjYW4gYWx3YXlzIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0CisgKiBoYXZpbmcgYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIG5hbWUgYSBwb3RlbnRpYWxseSBpbnZhbGlkIGJ1cyBuYW1lLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgbmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJCdXMgbmFtZSB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJCdXMgbmFtZSB3YXMgbm90IHZhbGlkOiAnJXMnIiwgbmFtZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVjayBhIHN0cmluZyBmb3IgdmFsaWRpdHkuIFN0cmluZ3Mgb24gRC1CdXMgbXVzdCBiZSB2YWxpZCBVVEYtOC4KKyAqIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cyBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLAorICogaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBhbGxlZ2VkX3V0ZjggYSBzdHJpbmcgdG8gYmUgY2hlY2tlZCwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGFsbGVnZWRfdXRmOCBpcyB2YWxpZCBVVEYtOAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV91dGY4IChjb25zdCBjaGFyICAgICAgICphbGxlZ2VkX3V0ZjgsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFsbGVnZWRfdXRmOCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFsbGVnZWRfdXRmOCk7CisKKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAqIGJlIHZhbGlkIFVURi04ICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAiU3RyaW5nIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGdyb3VwICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3ludGF4LmggYi9kYnVzL2RidXMtc3ludGF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmMjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeW50YXguaApAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3ludGF4LmggLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RyaW5ncyB3aXRoIHNwZWNpYWwgc3ludGF4CisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NZTlRBWF9ICisjZGVmaW5lIERCVVNfU1lOVEFYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX3BhdGggICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfaW50ZXJmYWNlICAgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV9tZW1iZXIgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfYnVzX25hbWUgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV91dGY4ICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICphbGxlZ2VkX3V0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBtdWx0aXBsZS1pbmNsdXNpb24gZ3VhcmQgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAwZWMzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jCkBAIC0wLDAgKzEsMzAyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgSW1wbGVtZW50cyB0aHJlYWRzIHVzaW5nIHB0aHJlYWRzIChpbnRlcm5hbCB0byBsaWJkYnVzKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKy8qIFdoZXRoZXIgd2UgaGF2ZSBhICJtb25vdG9uaWMiIGNsb2NrOyBpLmUuIGEgY2xvY2sgbm90IGFmZmVjdGVkIGJ5CisgKiBjaGFuZ2VzIGluIHN5c3RlbSB0aW1lLgorICogVGhpcyBpcyBpbml0aWFsaXplZCBvbmNlIGluIGNoZWNrX21vbm90b25pY19jbG9jayBiZWxvdy4KKyAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MTIxCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYXZlX21vbm90b25pY19jbG9jayA9IDA7CisjZW5kaWYKKworc3RydWN0IERCdXNSTXV0ZXggeworICBwdGhyZWFkX211dGV4X3QgbG9jazsgLyoqPCB0aGUgbG9jayAqLworfTsKKworc3RydWN0IERCdXNDTXV0ZXggeworICBwdGhyZWFkX211dGV4X3QgbG9jazsgLyoqPCB0aGUgbG9jayAqLworfTsKKworc3RydWN0IERCdXNDb25kVmFyIHsKKyAgcHRocmVhZF9jb25kX3QgY29uZDsgLyoqPCB0aGUgY29uZGl0aW9uICovCit9OworCisjZGVmaW5lIERCVVNfTVVURVgobSkgICAgICAgICAoKERCdXNNdXRleCopIG0pCisjZGVmaW5lIERCVVNfTVVURVhfUFRIUkVBRChtKSAoKERCdXNNdXRleFBUaHJlYWQqKSBtKQorCisjZGVmaW5lIERCVVNfQ09ORF9WQVIoYykgICAgICAgICAoKERCdXNDb25kVmFyKikgYykKKyNkZWZpbmUgREJVU19DT05EX1ZBUl9QVEhSRUFEKGMpICgoREJ1c0NvbmRWYXJQVGhyZWFkKikgYykKKworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorLyogKHRtcCAhPSAwKSBpcyBhIG5vLW9wIHVzYWdlIHRvIHNpbGVuY2UgY29tcGlsZXIgKi8KKyNkZWZpbmUgUFRIUkVBRF9DSEVDSyhmdW5jX25hbWUsIHJlc3VsdF9vcl9jYWxsKSAgICBcCisgICAgZG8geyBpbnQgdG1wID0gKHJlc3VsdF9vcl9jYWxsKTsgaWYgKHRtcCAhPSAwKSB7O30gfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFBUSFJFQURfQ0hFQ0soZnVuY19uYW1lLCByZXN1bHRfb3JfY2FsbCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHRtcCA9IChyZXN1bHRfb3JfY2FsbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRtcCAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoInB0aHJlYWQgZnVuY3Rpb24gJXMgZmFpbGVkIHdpdGggJWQgJXMgaW4gJXNcbiIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCB0bXAsIHN0cmVycm9yKHRtcCksIF9EQlVTX0ZVTkNUSU9OX05BTUUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKK0RCdXNDTXV0ZXggKgorX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAodm9pZCkKK3sKKyAgREJ1c0NNdXRleCAqcG11dGV4OworICBpbnQgcmVzdWx0OworCisgIHBtdXRleCA9IGRidXNfbmV3IChEQnVzQ011dGV4LCAxKTsKKyAgaWYgKHBtdXRleCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnBtdXRleC0+bG9jaywgTlVMTCk7CisKKyAgaWYgKHJlc3VsdCA9PSBFTk9NRU0gfHwgcmVzdWx0ID09IEVBR0FJTikKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBtdXRleCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9pbml0IiwgcmVzdWx0KTsKKyAgICB9CisKKyAgcmV0dXJuIHBtdXRleDsKK30KKworREJ1c1JNdXRleCAqCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICh2b2lkKQoreworICBEQnVzUk11dGV4ICpwbXV0ZXg7CisgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhhdHRyOworICBpbnQgcmVzdWx0OworCisgIHBtdXRleCA9IGRidXNfbmV3IChEQnVzUk11dGV4LCAxKTsKKyAgaWYgKHBtdXRleCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKCZtdXRleGF0dHIpOworICBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmbXV0ZXhhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnBtdXRleC0+bG9jaywgJm11dGV4YXR0cik7CisgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKCZtdXRleGF0dHIpOworCisgIGlmIChyZXN1bHQgPT0gRU5PTUVNIHx8IHJlc3VsdCA9PSBFQUdBSU4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChwbXV0ZXgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHJlc3VsdCk7CisgICAgfQorCisgIHJldHVybiBwbXV0ZXg7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9mcmVlIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJm11dGV4LT5sb2NrKSk7CisgIGRidXNfZnJlZSAobXV0ZXgpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfZnJlZSAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZtdXRleC0+bG9jaykpOworICBkYnVzX2ZyZWUgKG11dGV4KTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X2xvY2sgKERCdXNDTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9sb2NrIiwgcHRocmVhZF9tdXRleF9sb2NrICgmbXV0ZXgtPmxvY2spKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X2xvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9sb2NrIiwgcHRocmVhZF9tdXRleF9sb2NrICgmbXV0ZXgtPmxvY2spKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X3VubG9jayIsIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbXV0ZXgtPmxvY2spKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X3VubG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X3VubG9jayIsIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbXV0ZXgtPmxvY2spKTsKK30KKworREJ1c0NvbmRWYXIgKgorX2RidXNfcGxhdGZvcm1fY29uZHZhcl9uZXcgKHZvaWQpCit7CisgIERCdXNDb25kVmFyICpwY29uZDsKKyAgcHRocmVhZF9jb25kYXR0cl90IGF0dHI7CisgIGludCByZXN1bHQ7CisgIAorICBwY29uZCA9IGRidXNfbmV3IChEQnVzQ29uZFZhciwgMSk7CisgIGlmIChwY29uZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHB0aHJlYWRfY29uZGF0dHJfaW5pdCAoJmF0dHIpOworI2lmZGVmIEhBVkVfTU9OT1RPTklDX0NMT0NLCisgIGlmIChoYXZlX21vbm90b25pY19jbG9jaykKKyAgICBwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrICgmYXR0ciwgQ0xPQ0tfTU9OT1RPTklDKTsKKyNlbmRpZgorCisgIHJlc3VsdCA9IHB0aHJlYWRfY29uZF9pbml0ICgmcGNvbmQtPmNvbmQsICZhdHRyKTsKKyAgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95ICgmYXR0cik7CisKKyAgaWYgKHJlc3VsdCA9PSBFQUdBSU4gfHwgcmVzdWx0ID09IEVOT01FTSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBjb25kKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfaW5pdCIsIHJlc3VsdCk7CisgICAgfQorICAKKyAgcmV0dXJuIHBjb25kOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9jb25kX2Rlc3Ryb3kiLCBwdGhyZWFkX2NvbmRfZGVzdHJveSAoJmNvbmQtPmNvbmQpKTsKKyAgZGJ1c19mcmVlIChjb25kKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0IChEQnVzQ29uZFZhciAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9jb25kX3dhaXQiLCBwdGhyZWFkX2NvbmRfd2FpdCAoJmNvbmQtPmNvbmQsICZtdXRleC0+bG9jaykpOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0X3RpbWVvdXQgKERCdXNDb25kVmFyICAgICAgICAgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIHN0cnVjdCB0aW1ldmFsIHRpbWVfbm93OworICBzdHJ1Y3QgdGltZXNwZWMgZW5kX3RpbWU7CisgIGludCByZXN1bHQ7CisKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworICBpZiAoaGF2ZV9tb25vdG9uaWNfY2xvY2spCisgICAgeworICAgICAgc3RydWN0IHRpbWVzcGVjIG1vbm90b25pY190aW1lcjsKKyAgICAgIGNsb2NrX2dldHRpbWUgKENMT0NLX01PTk9UT05JQywmbW9ub3RvbmljX3RpbWVyKTsKKyAgICAgIHRpbWVfbm93LnR2X3NlYyA9IG1vbm90b25pY190aW1lci50dl9zZWM7CisgICAgICB0aW1lX25vdy50dl91c2VjID0gbW9ub3RvbmljX3RpbWVyLnR2X25zZWMgLyAxMDAwOworICAgIH0KKyAgZWxzZQorICAgIC8qIFRoaXMgZWxzZSBmYWxscyB0aHJvdWdoIHRvIGdldHRpbWVvZmRheSAqLworI2VuZGlmCisgIGdldHRpbWVvZmRheSAoJnRpbWVfbm93LCBOVUxMKTsKKyAgCisgIGVuZF90aW1lLnR2X3NlYyA9IHRpbWVfbm93LnR2X3NlYyArIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgZW5kX3RpbWUudHZfbnNlYyA9ICh0aW1lX25vdy50dl91c2VjICsgKHRpbWVvdXRfbWlsbGlzZWNvbmRzICUgMTAwMCkgKiAxMDAwKSAqIDEwMDA7CisgIGlmIChlbmRfdGltZS50dl9uc2VjID4gMTAwMCoxMDAwKjEwMDApCisgICAgeworICAgICAgZW5kX3RpbWUudHZfc2VjICs9IDE7CisgICAgICBlbmRfdGltZS50dl9uc2VjIC09IDEwMDAqMTAwMCoxMDAwOworICAgIH0KKworICByZXN1bHQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0ICgmY29uZC0+Y29uZCwgJm11dGV4LT5sb2NrLCAmZW5kX3RpbWUpOworICAKKyAgaWYgKHJlc3VsdCAhPSBFVElNRURPVVQpCisgICAgeworICAgICAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF90aW1lZHdhaXQiLCByZXN1bHQpOworICAgIH0KKworICAvKiByZXR1cm4gdHJ1ZSBpZiB3ZSBkaWQgbm90IHRpbWUgb3V0ICovCisgIHJldHVybiByZXN1bHQgIT0gRVRJTUVET1VUOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dha2Vfb25lIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9zaWduYWwiLCBwdGhyZWFkX2NvbmRfc2lnbmFsICgmY29uZC0+Y29uZCkpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbW9ub3RvbmljX2Nsb2NrICh2b2lkKQoreworI2lmZGVmIEhBVkVfTU9OT1RPTklDX0NMT0NLCisgIHN0cnVjdCB0aW1lc3BlYyBkdW1teTsKKyAgaWYgKGNsb2NrX2dldHJlcyAoQ0xPQ0tfTU9OT1RPTklDLCAmZHVtbXkpID09IDApCisgICAgaGF2ZV9tb25vdG9uaWNfY2xvY2sgPSBUUlVFOworI2VuZGlmCit9CisKK2RidXNfYm9vbF90CitfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIC8qIFRoZXNlIGhhdmUgc3RhdGljIHZhcmlhYmxlcywgYW5kIHdlIG5lZWQgdG8gaGFuZGxlIGJvdGggdGhlIGNhc2UKKyAgICogd2hlcmUgZGJ1c190aHJlYWRzX2luaXQoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIHdoZW4gaXQgaGFzbid0OworICAgKiBzbyBpbml0aWFsaXplIHRoZW0gYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBhbGxvd2VkIHRvIGVudGVyLgorICAgKi8KKyAgY2hlY2tfbW9ub3RvbmljX2Nsb2NrICgpOworICAodm9pZCkgX2RidXNfY2hlY2tfc2V0dWlkICgpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGluaXRfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCit2b2lkCitfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJmluaXRfbXV0ZXgpOworfQorCit2b2lkCitfZGJ1c190aHJlYWRzX3VubG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCkKK3sKKyAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZpbml0X211dGV4KTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg3YTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCkBAIC0wLDAgKzEsMzAyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgSW1wbGVtZW50cyB0aHJlYWRzIHVzaW5nIFdpbmRvd3MgdGhyZWFkcyAoaW50ZXJuYWwgdG8gbGliZGJ1cykKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIGRidXNfYm9vbF90IGdsb2JhbF9pbml0X2RvbmUgPSBGQUxTRTsKK3N0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGluaXRfbG9jazsKKworLyogQ2FsbGVkIGZyb20gQysrIGNvZGUgaW4gZGJ1cy1pbml0LXdpbi5jcHAuICovCit2b2lkCitfZGJ1c190aHJlYWRzX3dpbmRvd3NfaW5pdF9nbG9iYWwgKHZvaWQpCit7CisgIC8qIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBhY3RzIGFzIG91ciBnbG9iYWwgY29uc3RydWN0b3IKKyAgICogYWN0dWFsbHkgZ2V0cyBsaW5rZWQgaW4gd2hlbiB3ZSdyZSBsaW5rZWQgc3RhdGljYWxseSAqLworICBfZGJ1c190aHJlYWRzX3dpbmRvd3NfZW5zdXJlX2N0b3JfbGlua2VkICgpOworCisgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZpbml0X2xvY2spOworICBnbG9iYWxfaW5pdF9kb25lID0gVFJVRTsKK30KKworc3RydWN0IERCdXNDb25kVmFyIHsKKyAgREJ1c0xpc3QgKmxpc3Q7ICAgICAgICAvKio8IGxpc3QgdGhyZWFkLWxvY2FsLXN0b3JlZCBldmVudHMgd2FpdGluZyBvbiB0aGUgY29uZCB2YXJpYWJsZSAqLworICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qKjwgbG9jayBwcm90ZWN0aW5nIHRoZSBsaXN0ICovCit9OworCitzdGF0aWMgRFdPUkQgZGJ1c19jb25kX2V2ZW50X3RscyA9IFRMU19PVVRfT0ZfSU5ERVhFUzsKKworCitzdGF0aWMgSE1PRFVMRSBkYnVzX2RsbF9obW9kdWxlOworCit2b2lkICoKK19kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKHZvaWQpCit7CisgIHJldHVybiBkYnVzX2RsbF9obW9kdWxlOworfQorCisjaWZkZWYgREJVU19XSU5DRQorI2RlZmluZSBoaW5zdF90IEhBTkRMRQorI2Vsc2UKKyNkZWZpbmUgaGluc3RfdCBISU5TVEFOQ0UKKyNlbmRpZgorCitCT09MIFdJTkFQSSBEbGxNYWluIChoaW5zdF90LCBEV09SRCwgTFBWT0lEKTsKKworLyogV2UgbmVlZCB0aGlzIHRvIGZyZWUgdGhlIFRMUyBldmVudHMgb24gdGhyZWFkIGV4aXQgKi8KK0JPT0wgV0lOQVBJCitEbGxNYWluIChoaW5zdF90IGhpbnN0RExMLAorCSBEV09SRCAgICAgZmR3UmVhc29uLAorCSBMUFZPSUQgICAgbHB2UmVzZXJ2ZWQpCit7CisgIEhBTkRMRSBldmVudDsKKyAgc3dpdGNoIChmZHdSZWFzb24pIAorICAgIHsgCisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICBkYnVzX2RsbF9obW9kdWxlID0gaGluc3RETEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6IAorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisKKwkgIFRsc0ZyZWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7IAorCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IAorICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RCdXNDTXV0ZXggKgorX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAodm9pZCkKK3sKKyAgSEFORExFIGhhbmRsZTsKKyAgaGFuZGxlID0gQ3JlYXRlTXV0ZXggKE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgcmV0dXJuIChEQnVzQ011dGV4ICopIGhhbmRsZTsKK30KKworREJ1c1JNdXRleCAqCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICh2b2lkKQoreworICBIQU5ETEUgaGFuZGxlOworICBoYW5kbGUgPSBDcmVhdGVNdXRleCAoTlVMTCwgRkFMU0UsIE5VTEwpOworICByZXR1cm4gKERCdXNSTXV0ZXggKikgaGFuZGxlOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIENsb3NlSGFuZGxlICgoSEFORExFICopIG11dGV4KTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBDbG9zZUhhbmRsZSAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoKEhBTkRMRSAqKSBtdXRleCwgSU5GSU5JVEUpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKChIQU5ETEUgKikgbXV0ZXgsIElORklOSVRFKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBSZWxlYXNlTXV0ZXggKChIQU5ETEUgKikgbXV0ZXgpOworfQorCitEQnVzQ29uZFZhciAqCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvbmRWYXIgKmNvbmQ7CisgICAgCisgIGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXIsIDEpOworICBpZiAoY29uZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgY29uZC0+bGlzdCA9IE5VTEw7CisgIAorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIHJldHVybiBjb25kOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreworICBEZWxldGVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbmQtPmxpc3QpOworICBkYnVzX2ZyZWUgKGNvbmQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkgIERCdXNDTXV0ZXggKm11dGV4LAorCQkJICBpbnQgbWlsbGlzZWNvbmRzKQoreworICBEV09SRCByZXR2YWw7CisgIGRidXNfYm9vbF90IHJldDsKKyAgSEFORExFIGV2ZW50ID0gVGxzR2V0VmFsdWUgKGRidXNfY29uZF9ldmVudF90bHMpOworCisgIGlmICghZXZlbnQpCisgICAgeworICAgICAgZXZlbnQgPSBDcmVhdGVFdmVudCAoMCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmIChldmVudCA9PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICAgIFRsc1NldFZhbHVlIChkYnVzX2NvbmRfZXZlbnRfdGxzLCBldmVudCk7CisgICAgfQorCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogVGhlIGV2ZW50IG11c3Qgbm90IGJlIHNpZ25hbGVkLiBDaGVjayB0aGlzICovCisgIF9kYnVzX2Fzc2VydCAoV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApID09IFdBSVRfVElNRU9VVCk7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9hcHBlbmQgKCZjb25kLT5saXN0LCBldmVudCk7CisgIAorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBQcmVwZW5kIGZhaWxlZCAqLworCisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgKG11dGV4KTsKKyAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIG1pbGxpc2Vjb25kcyk7CisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChtdXRleCk7CisgIAorICBpZiAocmV0dmFsID09IFdBSVRfVElNRU9VVCkKKyAgICB7CisgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZjb25kLT5saXN0LCBldmVudCk7CisKKyAgICAgIC8qIEluIHRoZSBtZWFudGltZSB3ZSBjb3VsZCBoYXZlIGJlZW4gc2lnbmFsZWQsIHNvIHdlIG11c3QgYWdhaW4KKyAgICAgICAqIHdhaXQgZm9yIHRoZSBzaWduYWwsIHRoaXMgdGltZSB3aXRoIG5vIHRpbWVvdXQsIHRvIHJlc2V0CisgICAgICAgKiBpdC4gcmV0dmFsIGlzIHNldCBhZ2FpbiB0byBob25vdXIgdGhlIGxhdGUgYXJyaXZhbCBvZiB0aGUKKyAgICAgICAqIHNpZ25hbCAqLworICAgICAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApOworCisgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgIH0KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogTm93IGV2ZW50IG11c3Qgbm90IGJlIGluc2lkZSB0aGUgYXJyYXksIGNoZWNrIHRoaXMgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X3JlbW92ZSAoJmNvbmQtPmxpc3QsIGV2ZW50KSA9PSBGQUxTRSk7CisKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyNlbmRpZiAvKiAhR19ESVNBQkxFX0FTU0VSVCAqLworCisgIHJldHVybiByZXR2YWwgIT0gV0FJVF9USU1FT1VUOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIElORklOSVRFKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorCQkJCSAgICAgREJ1c0NNdXRleCAgICAgICAgICAgICAgICAqbXV0ZXgsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgcmV0dXJuIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIAorICBpZiAoY29uZC0+bGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNldEV2ZW50IChfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNvbmQtPmxpc3QpKTsKKyAgICAgIC8qIEF2b2lkIGxpdmUgbG9jayBieSBwdXNoaW5nIHRoZSB3YWl0ZXIgdG8gdGhlIG11dGV4IGxvY2sKKyAgICAgICAgIGluc3RydWN0aW9uLCB3aGljaCBpcyBmYWlyLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY291bGQKKyAgICAgICAgIGFjcXVpcmUgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhZ2FpbiBiZWZvcmUgdGhlIHdhaXRlciBoYXMgYQorICAgICAgICAgY2hhbmNlIGl0c2VsZiwgbGVhZGluZyB0byBzdGFydmF0aW9uLiAgKi8KKyAgICAgIFNsZWVwICgwKTsKKyAgICB9CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIC8qIFdlIHJldXNlIHRoaXMgb3ZlciBzZXZlcmFsIGdlbmVyYXRpb25zLCBiZWNhdXNlIHdlIGNhbid0CisgICAqIGZyZWUgdGhlIGV2ZW50cyBvbmNlIHRoZXkgYXJlIGluIHVzZQorICAgKi8KKyAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgPT0gVExTX09VVF9PRl9JTkRFWEVTKQorICAgIHsKKyAgICAgIGRidXNfY29uZF9ldmVudF90bHMgPSBUbHNBbGxvYyAoKTsKKyAgICAgIGlmIChkYnVzX2NvbmRfZXZlbnRfdGxzID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZ2xvYmFsX2luaXRfZG9uZSk7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmaW5pdF9sb2NrKTsKK30KKwordm9pZAorX2RidXNfdGhyZWFkc191bmxvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZ2xvYmFsX2luaXRfZG9uZSk7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmaW5pdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJhNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jCkBAIC0wLDAgKzEsNDUxNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdW5peC5jIFdyYXBwZXJzIGFyb3VuZCBVTklYIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWZpbGUuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1dSSVRFVgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUE9MTAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0JBQ0tUUkFDRQorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFBFRVJVQ1JFRAorI2luY2x1ZGUgPHVjcmVkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0FMTE9DQV9ICisjaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQURUCisjaW5jbHVkZSA8YnNtL2FkdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyNpbmNsdWRlIDxzeXN0ZW1kL3NkLWRhZW1vbi5oPgorI2VuZGlmCisKKyNpZiAhREJVU19VU0VfU1lOQworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisjaWZuZGVmIEFJX0FERFJDT05GSUcKKyNkZWZpbmUgQUlfQUREUkNPTkZJRyAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NPQ0tMRU5fVAorI2RlZmluZSBzb2NrbGVuX3QgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fc3VuKSB8fCBkZWZpbmVkIChfX3N1bl9fKQorLyoKKyAqIENNU19TUEFDRSBldGMuIGRlZmluaXRpb25zIGZvciBTb2xhcmlzIDwgMTAsIGJhc2VkIG9uCisgKiAgIGh0dHA6Ly9tYWlsbWFuLnZpZGVvbGFuLm9yZy9waXBlcm1haWwvdmxjLWRldmVsLzIwMDYtTWF5LzAyNDQwMi5odG1sCisgKiB2aWEKKyAqICAgaHR0cDovL3dpa2kub3BlbmNzdy5vcmcvcG9ydGluZy1mYXEjdG9jMTAKKyAqCisgKiBUaGVzZSBhcmUgb25seSByZWRlZmluZWQgZm9yIFNvbGFyaXMsIGZvciBub3c6IGlmIHlvdXIgT1MgbmVlZHMgdGhlc2UgdG9vLAorICogcGxlYXNlIGZpbGUgYSBidWcuIChPciBwcmVmZXJhYmx5LCBpbXByb3ZlIHlvdXIgT1Mgc28gdGhleSdyZSBub3QgbmVlZGVkLikKKyAqLworCisjIGlmbmRlZiBDTVNHX0FMSUdOCisjICAgaWZkZWYgX19zdW5fXworIyAgICAgZGVmaW5lIENNU0dfQUxJR04obGVuKSBfQ01TR19EQVRBX0FMSUdOIChsZW4pCisjICAgZWxzZQorICAgICAgLyogYWxpZ25pbmcgdG8gc2l6ZW9mIChsb25nKSBpcyBhc3N1bWVkIHRvIGJlIHBvcnRhYmxlIChmZC5vIzQwMjM1KSAqLworIyAgICAgZGVmaW5lIENNU0dfQUxJR04obGVuKSAoKChsZW4pICsgc2l6ZW9mIChsb25nKSAtIDEpICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihzaXplb2YgKGxvbmcpIC0gMSkpCisjICAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgQ01TR19TUEFDRQorIyAgIGRlZmluZSBDTVNHX1NQQUNFKGxlbikgKENNU0dfQUxJR04gKHNpemVvZiAoc3RydWN0IGNtc2doZHIpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTVNHX0FMSUdOIChsZW4pKQorIyBlbmRpZgorCisjIGlmbmRlZiBDTVNHX0xFTgorIyAgIGRlZmluZSBDTVNHX0xFTihsZW4pIChDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkgKyAobGVuKSkKKyMgZW5kaWYKKworI2VuZGlmIC8qIFNvbGFyaXMgKi8KKworLyoqCisgKiBFbnN1cmUgdGhhdCB0aGUgc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycyBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIKKyAqIGFyZSBvcGVuLCBieSBvcGVuaW5nIC9kZXYvbnVsbCBpZiBuZWNlc3NhcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgREJ1c0Vycm9yLCB0byBhdm9pZCBjYWxsaW5nIG1hbGxvYygpLCBzbworICogdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBjb250ZXh0cyB3aGVyZSBhbiBhc3luYy1zaWduYWwtc2FmZSBmdW5jdGlvbgorICogaXMgcmVxdWlyZWQgKGZvciBleGFtcGxlIGFmdGVyIGZvcmsoKSkuIEluc3RlYWQsIG9uIGZhaWx1cmUgaXQgc2V0cworICogZXJybm8gYW5kIHJldHVybnMgc29tZXRoaW5nIGxpa2UgIkZhaWxlZCB0byBvcGVuIC9kZXYvbnVsbCIgaW4KKyAqICplcnJvcl9zdHJfcC4gQ2FsbGVycyBhcmUgZXhwZWN0ZWQgdG8gY29tYmluZSAqZXJyb3Jfc3RyX3AKKyAqIHdpdGggX2RidXNfc3RyZXJyb3IgKGVycm5vKSB0byBnZXQgYSBmdWxsIGVycm9yIHJlcG9ydC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGlsZSBzaW5nbGUtdGhyZWFkZWQ6IGVpdGhlciBkdXJpbmcKKyAqIHN0YXJ0dXAgb2YgYW4gZXhlY3V0YWJsZSwgb3IgYWZ0ZXIgZm9yaygpLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZW5zdXJlX3N0YW5kYXJkX2ZkcyAoREJ1c0Vuc3VyZVN0YW5kYXJkRmRzRmxhZ3MgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqZXJyb3Jfc3RyX3ApCit7CisgIHN0YXRpYyBpbnQgY29uc3QgcmVsZXZhbnRfZmxhZ1tdID0geyBEQlVTX0ZPUkNFX1NURElOX05VTEwsCisgICAgICBEQlVTX0ZPUkNFX1NURE9VVF9OVUxMLAorICAgICAgREJVU19GT1JDRV9TVERFUlJfTlVMTCB9OworICAvKiBTaG91bGQgYWx3YXlzIGdldCByZXBsYWNlZCB3aXRoIHRoZSByZWFsIGVycm9yIGJlZm9yZSB1c2UgKi8KKyAgY29uc3QgY2hhciAqZXJyb3Jfc3RyID0gIkZhaWxlZCBteXN0ZXJpb3VzbHkiOworICBpbnQgZGV2bnVsbCA9IC0xOworICBpbnQgc2F2ZWRfZXJybm87CisgIC8qIFRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIHRoZSBzdGFuZGFyZCBmZHMgaGF2aW5nIHRoZWlyIFBPU0lYIHZhbHVlcy4gKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoU1RESU5fRklMRU5PID09IDApOworICBfREJVU19TVEFUSUNfQVNTRVJUIChTVERPVVRfRklMRU5PID09IDEpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChTVERFUlJfRklMRU5PID09IDIpOworICBpbnQgaTsKKworICBmb3IgKGkgPSBTVERJTl9GSUxFTk87IGkgPD0gU1RERVJSX0ZJTEVOTzsgaSsrKQorICAgIHsKKyAgICAgIC8qIEJlY2F1c2Ugd2UgcmVseSBvbiBiZWluZyBzaW5nbGUtdGhyZWFkZWQsIGFuZCB3ZSB3YW50IHRoZQorICAgICAgICogc3RhbmRhcmQgZmRzIHRvIG5vdCBiZSBjbG9zZS1vbi1leGVjLCB3ZSBkb24ndCBzZXQgaXQKKyAgICAgICAqIGNsb3NlLW9uLWV4ZWMuICovCisgICAgICBpZiAoZGV2bnVsbCA8IGkpCisgICAgICAgIGRldm51bGwgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRFdSKTsKKworICAgICAgaWYgKGRldm51bGwgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jfc3RyID0gIkZhaWxlZCB0byBvcGVuIC9kZXYvbnVsbCI7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgLyogV2UgYWxyZWFkeSBvcGVuZWQgYWxsIGZkcyA8IGksIHNvIHRoZSBvbmx5IHdheSB0aGlzIGFzc2VydGlvbgorICAgICAgICogY291bGQgZmFpbCBpcyBpZiBhbm90aGVyIHRocmVhZCBjbG9zZWQgb25lLCBhbmQgd2UgZG9jdW1lbnQKKyAgICAgICAqIHRoaXMgZnVuY3Rpb24gYXMgbm90IHNhZmUgZm9yIG11bHRpLXRocmVhZGluZy4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoZGV2bnVsbCA+PSBpKTsKKworICAgICAgaWYgKGRldm51bGwgIT0gaSAmJiAoZmxhZ3MgJiByZWxldmFudF9mbGFnW2ldKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGR1cDIgKGRldm51bGwsIGkpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJyb3Jfc3RyID0gIkZhaWxlZCB0byBkdXAyIC9kZXYvbnVsbCBvbnRvIGEgc3RhbmRhcmQgZmQiOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBlcnJvcl9zdHIgPSBOVUxMOworCitvdXQ6CisgIHNhdmVkX2Vycm5vID0gZXJybm87CisKKyAgaWYgKGRldm51bGwgPiBTVERFUlJfRklMRU5PKQorICAgIGNsb3NlIChkZXZudWxsKTsKKworICBpZiAoZXJyb3Jfc3RyX3AgIT0gTlVMTCkKKyAgICAqZXJyb3Jfc3RyX3AgPSBlcnJvcl9zdHI7CisKKyAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgcmV0dXJuIChlcnJvcl9zdHIgPT0gTlVMTCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGludCAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkX3AsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZG9tYWluLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgU09DS19DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICAqZmRfcCA9IHNvY2tldCAoZG9tYWluLCB0eXBlIHwgU09DS19DTE9FWEVDLCBwcm90b2NvbCk7CisgIGNsb2V4ZWNfZG9uZSA9ICpmZF9wID49IDA7CisKKyAgLyogQ2hlY2sgaWYga2VybmVsIHNlZW1zIHRvIGJlIHRvbyBvbGQgdG8ga25vdyBTT0NLX0NMT0VYRUMgKi8KKyAgaWYgKCpmZF9wIDwgMCAmJiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT1RZUEUpKQorI2VuZGlmCisgICAgeworICAgICAgKmZkX3AgPSBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KKworICBpZiAoKmZkX3AgPj0gMCkKKyAgICB7CisjaWZkZWYgU09DS19DTE9FWEVDCisgICAgICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMoKmZkX3ApOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzb2NrZXQgZmQgJWQgb3BlbmVkXG4iLCAqZmRfcCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcihlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBPcGVucyBhIFVOSVggZG9tYWluIHNvY2tldCAoYXMgaW4gdGhlIHNvY2tldCgpIGNhbGwpLgorICogRG9lcyBub3QgYmluZCB0aGUgc29ja2V0LgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZAorICoKKyAqIEBwYXJhbSBmZCByZXR1cm4gbG9jYXRpb24gZm9yIHNvY2tldCBkZXNjcmlwdG9yCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX29wZW5fdW5peF9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19vcGVuX3NvY2tldChmZCwgUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGVycm9yKTsKK30KKworLyoqCisgKiBDbG9zZXMgYSBzb2NrZXQuIFNob3VsZCBub3QgYmUgdXNlZCBvbiBub24tc29ja2V0CisgKiBmaWxlIGRlc2NyaXB0b3JzIG9yIGhhbmRsZXMuCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jbG9zZV9zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX2Nsb3NlIChmZC5mZCwgZXJyb3IpOworfQorCisvKioKKyAqIExpa2UgX2RidXNfcmVhZCgpLCBidXQgb25seSB3b3JrcyBvbiBzb2NrZXRzIHNvIGlzCisgKiBhdmFpbGFibGUgb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIHNvY2tldAorICogQHBhcmFtIGJ1ZmZlciBzdHJpbmcgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCBtYXggYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGFwcGVuZGVkIHRvIHRoZSBzdHJpbmcKKyAqLworaW50CitfZGJ1c19yZWFkX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50KQoreworICByZXR1cm4gX2RidXNfcmVhZCAoZmQuZmQsIGJ1ZmZlciwgY291bnQpOworfQorCisvKioKKyAqIExpa2UgX2RidXNfd3JpdGUoKSwgYnV0IG9ubHkgc3VwcG9ydHMgc29ja2V0cworICogYW5kIGlzIHRodXMgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUKKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBzdGFydCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnVmZmVyIHRvIHdyaXRlCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJ5IHRvIHdyaXRlCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c193cml0ZV9zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICBjb25zdCBjaGFyICpkYXRhOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgbGVuKTsKKworIGFnYWluOgorCisgIGJ5dGVzX3dyaXR0ZW4gPSBzZW5kIChmZC5mZCwgZGF0YSwgbGVuLCBNU0dfTk9TSUdOQUwpOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIHJldHVybiBieXRlc193cml0dGVuOworCisjZWxzZQorICByZXR1cm4gX2RidXNfd3JpdGUgKGZkLmZkLCBidWZmZXIsIHN0YXJ0LCBsZW4pOworI2VuZGlmCit9CisKKy8qKgorICogTGlrZSBfZGJ1c19yZWFkX3NvY2tldCgpIGJ1dCBhbHNvIHRyaWVzIHRvIHJlYWQgdW5peCBmZHMgZnJvbSB0aGUKKyAqIHNvY2tldC4gV2hlbiB0aGVyZSBhcmUgbW9yZSBmZHMgdG8gcmVhZCB0aGFuIHNwYWNlIGluIHRoZSBhcnJheQorICogcGFzc2VkIHRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIHdpdGggRU5PU1BDLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgc29ja2V0CisgKiBAcGFyYW0gYnVmZmVyIHN0cmluZyB0byBhcHBlbmQgZGF0YSB0bworICogQHBhcmFtIGNvdW50IG1heCBhbW91bnQgb2YgZGF0YSB0byByZWFkCisgKiBAcGFyYW0gZmRzIGFycmF5IHRvIHBsYWNlIHJlYWQgZmlsZSBkZXNjcmlwdG9ycyBpbgorICogQHBhcmFtIG5fZmRzIG9uIGlucHV0IHNwYWNlIGluIGZkcyBhcnJheSwgb24gb3V0cHV0IGhvdyBtYW55IGZkcyBhY3R1YWxseSBnb3QgcmVhZAorICogQHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGFwcGVuZGVkIHRvIHN0cmluZworICovCitpbnQKK19kYnVzX3JlYWRfc29ja2V0X3dpdGhfdW5peF9mZHMgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuX2ZkcykgeworI2lmbmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBpbnQgcjsKKworICBpZiAoKHIgPSBfZGJ1c19yZWFkX3NvY2tldChmZCwgYnVmZmVyLCBjb3VudCkpIDwgMCkKKyAgICByZXR1cm4gcjsKKworICAqbl9mZHMgPSAwOworICByZXR1cm4gcjsKKworI2Vsc2UKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgc3RydWN0IG1zZ2hkciBtOworICBzdHJ1Y3QgaW92ZWMgaW92OworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoKm5fZmRzID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBfREJVU19aRVJPKGlvdik7CisgIGlvdi5pb3ZfYmFzZSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGNvdW50KTsKKyAgaW92Lmlvdl9sZW4gPSBjb3VudDsKKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSAmaW92OworICBtLm1zZ19pb3ZsZW4gPSAxOworCisgIC8qIEhtbSwgd2UgaGF2ZSBubyBjbHVlIGhvdyBsb25nIHRoZSBjb250cm9sIGRhdGEgd2lsbCBhY3R1YWxseSBiZQorICAgICB0aGF0IGlzIHF1ZXVlZCBmb3IgdXMuIFRoZSBsZWFzdCB3ZSBjYW4gZG8gaXMgYXNzdW1lIHRoYXQgdGhlCisgICAgIGNhbGxlciBrbm93cy4gSGVuY2UgbGV0J3MgbWFrZSBzcGFjZSBmb3IgdGhlIG51bWJlciBvZiBmZHMgdGhhdAorICAgICB3ZSBzaGFsbCByZWFkIGF0IG1heCBwbHVzIHRoZSBjbXNnIGhlYWRlci4gKi8KKyAgbS5tc2dfY29udHJvbGxlbiA9IENNU0dfU1BBQ0UoKm5fZmRzICogc2l6ZW9mKGludCkpOworCisgIC8qIEl0J3MgcHJvYmFibHkgc2FmZSB0byBhc3N1bWUgdGhhdCBzeXN0ZW1zIHdpdGggU0NNX1JJR0hUUyBhbHNvCisgICAgIGtub3cgYWxsb2NhKCkgKi8KKyAgbS5tc2dfY29udHJvbCA9IGFsbG9jYShtLm1zZ19jb250cm9sbGVuKTsKKyAgbWVtc2V0KG0ubXNnX2NvbnRyb2wsIDAsIG0ubXNnX2NvbnRyb2xsZW4pOworCisgIC8qIERvIG5vdCBpbmNsdWRlIHRoZSBwYWRkaW5nIGF0IHRoZSBlbmQgd2hlbiB3ZSB0ZWxsIHRoZSBrZXJuZWwKKyAgICogaG93IG11Y2ggd2UncmUgd2lsbGluZyB0byByZWNlaXZlLiBUaGlzIGF2b2lkcyBnZXR0aW5nCisgICAqIHRoZSBwYWRkaW5nIGZpbGxlZCB3aXRoIGFkZGl0aW9uYWwgZmRzIHRoYXQgd2Ugd2VyZW4ndCBleHBlY3RpbmcsCisgICAqIGlmIGEgKHBvdGVudGlhbGx5IG1hbGljaW91cykgc2VuZGVyIGluY2x1ZGVkIHRoZW0uIChmZC5vICM4MzYyMikgKi8KKyAgbS5tc2dfY29udHJvbGxlbiA9IENNU0dfTEVOICgqbl9mZHMgKiBzaXplb2YoaW50KSk7CisKKyBhZ2FpbjoKKworICBieXRlc19yZWFkID0gcmVjdm1zZyAoZmQuZmQsICZtLCAwCisjaWZkZWYgTVNHX0NNU0dfQ0xPRVhFQworICAgICAgICAgICAgICAgICAgICAgICB8TVNHX0NNU0dfQ0xPRVhFQworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAobm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhY3R1YWxseSByZWFsbG9jIGFueXRoaW5nKSAqLworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgY21zZ2hkciAqY207CisgICAgICBkYnVzX2Jvb2xfdCBmb3VuZCA9IEZBTFNFOworCisgICAgICBmb3IgKGNtID0gQ01TR19GSVJTVEhEUigmbSk7IGNtOyBjbSA9IENNU0dfTlhUSERSKCZtLCBjbSkpCisgICAgICAgIGlmIChjbS0+Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICYmIGNtLT5jbXNnX3R5cGUgPT0gU0NNX1JJR0hUUykKKyAgICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGludCAqcGF5bG9hZCA9IChpbnQgKikgQ01TR19EQVRBIChjbSk7CisgICAgICAgICAgICBzaXplX3QgcGF5bG9hZF9sZW5fYnl0ZXMgPSAoY20tPmNtc2dfbGVuIC0gQ01TR19MRU4gKDApKTsKKyAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkX2xlbl9mZHMgPSBwYXlsb2FkX2xlbl9ieXRlcyAvIHNpemVvZiAoaW50KTsKKyAgICAgICAgICAgIHNpemVfdCBmZHNfdG9fdXNlOworCisgICAgICAgICAgICAvKiBFdmVyeSBub24tbmVnYXRpdmUgaW50IGZpdHMgaW4gYSBzaXplX3Qgd2l0aG91dCB0cnVuY2F0aW9uLAorICAgICAgICAgICAgICogYW5kIHdlIGFscmVhZHkga25vdyB0aGF0ICpuX2ZkcyBpcyBub24tbmVnYXRpdmUsIHNvCisgICAgICAgICAgICAgKiBjYXN0aW5nIChzaXplX3QpICpuX2ZkcyBpcyBPSyAqLworICAgICAgICAgICAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChzaXplX3QpID49IHNpemVvZiAoaW50KSk7CisKKyAgICAgICAgICAgIGlmIChfREJVU19MSUtFTFkgKHBheWxvYWRfbGVuX2ZkcyA8PSAoc2l6ZV90KSAqbl9mZHMpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhlIGZkcyBpbiB0aGUgcGF5bG9hZCB3aWxsIGZpdCBpbiBvdXIgYnVmZmVyICovCisgICAgICAgICAgICAgICAgZmRzX3RvX3VzZSA9IHBheWxvYWRfbGVuX2ZkczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVG9vIG1hbnkgZmRzIGluIHRoZSBwYXlsb2FkLiBUaGlzIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgICAgICAgICAgKiBhbnkgbW9yZSBiZWNhdXNlIHdlJ3JlIHNldHRpbmcgbS5tc2dfY29udHJvbGxlbiB0bworICAgICAgICAgICAgICAgICAqIHRoZSBleGFjdCBudW1iZXIgd2UgY2FuIGFjY2VwdCwgYnV0IGJlIHNhZmUgYW5kCisgICAgICAgICAgICAgICAgICogdHJ1bmNhdGUuICovCisgICAgICAgICAgICAgICAgZmRzX3RvX3VzZSA9IChzaXplX3QpICpuX2ZkczsKKworICAgICAgICAgICAgICAgIC8qIENsb3NlIHRoZSBleGNlc3MgZmRzIHRvIGF2b2lkIERvUzogaWYgdGhleSBzdGF5ZWQgb3BlbiwKKyAgICAgICAgICAgICAgICAgKiBzb21lb25lIGNvdWxkIHNlbmQgdXMgYW4gZXh0cmEgZmQgcGVyIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKiBhbmQgd2UnZCBldmVudHVhbGx5IHJ1biBvdXQuICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gZmRzX3RvX3VzZTsgaSA8IHBheWxvYWRfbGVuX2ZkczsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbG9zZSAocGF5bG9hZFtpXSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5IChmZHMsIHBheWxvYWQsIGZkc190b191c2UgKiBzaXplb2YgKGludCkpOworICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgLyogVGhpcyBjYW5ub3Qgb3ZlcmZsb3cgYmVjYXVzZSB3ZSBoYXZlIGNob3NlbiBmZHNfdG9fdXNlCisgICAgICAgICAgICAgKiB0byBiZSA8PSAqbl9mZHMgKi8KKyAgICAgICAgICAgICpuX2ZkcyA9IChpbnQpIGZkc190b191c2U7CisKKyAgICAgICAgICAgIC8qIExpbnV4IGRvZXNuJ3QgdGVsbCB1cyB3aGV0aGVyIE1TR19DTVNHX0NMT0VYRUMgYWN0dWFsbHkKKyAgICAgICAgICAgICAgIHdvcmtlZCwgaGVuY2Ugd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoaXMgbGlzdCBhbmQgc2V0CisgICAgICAgICAgICAgICBDTE9FWEVDIGV2ZXJ5d2hlcmUgaW4gYW55IGNhc2UgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZHNfdG9fdXNlOyBpKyspCisgICAgICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGZkc1tpXSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgKm5fZmRzID0gMDsKKworICAgICAgaWYgKG0ubXNnX2ZsYWdzICYgTVNHX0NUUlVOQykKKyAgICAgICAgeworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgLyogSG1tLCBhcHBhcmVudGx5IHRoZSBjb250cm9sIGRhdGEgd2FzIHRydW5jYXRlZC4gVGhlIGJhZAorICAgICAgICAgICAgIHRoaW5nIGlzIHRoYXQgd2UgbWlnaHQgaGF2ZSBjb21wbGV0ZWx5IGxvc3QgYSBjb3VwbGUgb2YgZmRzCisgICAgICAgICAgICAgd2l0aG91dCBjaGFuY2UgdG8gcmVjb3ZlciB0aGVtLiBIZW5jZSBsZXQncyB0cmVhdCB0aGlzIGFzIGEKKyAgICAgICAgICAgICBzZXJpb3VzIGVycm9yLiAqLworCisgICAgICAgICAgLyogV2Ugc3RpbGwgbmVlZCB0byBjbG9zZSB3aGF0ZXZlciBmZHMgd2UgKmRpZCogcmVjZWl2ZSwKKyAgICAgICAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBuZXZlciBnZXQgY2xvc2VkLiAoQ1ZFLTIwMjAtMTIwNDkpICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpuX2ZkczsgaSsrKQorICAgICAgICAgICAgY2xvc2UgKGZkc1tpXSk7CisKKyAgICAgICAgICAqbl9mZHMgPSAwOworICAgICAgICAgIGVycm5vID0gRU5PU1BDOworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MpICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCArIGJ5dGVzX3JlYWQpOworCisjaWYgMAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfcmVhZCk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgfQorI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKSB7CisKKyNpZm5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAobl9mZHMgPiAwKSB7CisgICAgZXJybm8gPSBFTk9UU1VQOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBfZGJ1c193cml0ZV9zb2NrZXQoZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisjZWxzZQorICByZXR1cm4gX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKGZkLCBidWZmZXIsIHN0YXJ0LCBsZW4sIE5VTEwsIDAsIDAsIGZkcywgbl9mZHMpOworI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpIHsKKworI2lmbmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmIChuX2ZkcyA+IDApIHsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3NvY2tldF90d28oZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbHNlCisKKyAgc3RydWN0IG1zZ2hkciBtOworICBzdHJ1Y3QgY21zZ2hkciAqY207CisgIHN0cnVjdCBpb3ZlYyBpb3ZbMl07CisgIGludCBieXRlc193cml0dGVuOworCisgIF9kYnVzX2Fzc2VydCAobGVuMSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4yID49IDApOworICBfZGJ1c19hc3NlcnQgKG5fZmRzID49IDApOworCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92WzBdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIxLCBzdGFydDEsIGxlbjEpOworICBpb3ZbMF0uaW92X2xlbiA9IGxlbjE7CisKKyAgaWYgKGJ1ZmZlcjIpCisgICAgeworICAgICAgaW92WzFdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICAgICAgaW92WzFdLmlvdl9sZW4gPSBsZW4yOworICAgIH0KKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSBpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IGJ1ZmZlcjIgPyAyIDogMTsKKworICBpZiAobl9mZHMgPiAwKQorICAgIHsKKyAgICAgIG0ubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFKG5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgbS5tc2dfY29udHJvbCA9IGFsbG9jYShtLm1zZ19jb250cm9sbGVuKTsKKyAgICAgIG1lbXNldChtLm1zZ19jb250cm9sLCAwLCBtLm1zZ19jb250cm9sbGVuKTsKKworICAgICAgY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsKKyAgICAgIGNtLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICAgIGNtLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgICAgY20tPmNtc2dfbGVuID0gQ01TR19MRU4obl9mZHMgKiBzaXplb2YoaW50KSk7CisgICAgICBtZW1jcHkoQ01TR19EQVRBKGNtKSwgZmRzLCBuX2ZkcyAqIHNpemVvZihpbnQpKTsKKyAgICB9CisKKyBhZ2FpbjoKKworICBieXRlc193cml0dGVuID0gc2VuZG1zZyAoZmQuZmQsICZtLCAwCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1TR19OT1NJR05BTAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlX3R3bygpIGJ1dCBvbmx5IHdvcmtzIG9uIHNvY2tldHMgYW5kIGlzIHRodXMKKyAqIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gYnVmZmVyMSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBzdGFydDEgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBsZW4xIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGJ1ZmZlcjIgc2Vjb25kIGJ1ZmZlciwgb3IgI05VTEwKKyAqIEBwYXJhbSBzdGFydDIgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcGFyYW0gbGVuMiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHJldHVybnMgdG90YWwgYnl0ZXMgd3JpdHRlbiBmcm9tIGJvdGggYnVmZmVycywgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgY29uc3QgY2hhciAqZGF0YTE7CisgIGNvbnN0IGNoYXIgKmRhdGEyOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgc3RydWN0IG1zZ2hkciBtOworCisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworICBkYXRhMSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisKKyAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgIGVsc2UKKyAgICB7CisgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICBzdGFydDIgPSAwOworICAgICAgbGVuMiA9IDA7CisgICAgfQorCisgIHZlY3RvcnNbMF0uaW92X2Jhc2UgPSAoY2hhciopIGRhdGExOworICB2ZWN0b3JzWzBdLmlvdl9sZW4gPSBsZW4xOworICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgdmVjdG9yc1sxXS5pb3ZfbGVuID0gbGVuMjsKKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSB2ZWN0b3JzOworICBtLm1zZ19pb3ZsZW4gPSBkYXRhMiA/IDIgOiAxOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKGZkLmZkLCAmbSwgTVNHX05PU0lHTkFMKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3R3byAoZmQuZmQsIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LCBhbmQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICogYW5kIHNhbWUgZXJybm8gYXMgcmVhZCgpLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdAorICogX2RidXNfcmVhZCgpIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4gQWxzbywgX2RidXNfcmVhZCgpIGNhbgorICogcmV0dXJuIEVOT01FTSwgZXZlbiB0aG91Z2ggcmVndWxhciBVTklYIHJlYWQgZG9lc24ndC4KKyAqCisgKiBVbmxpa2UgX2RidXNfcmVhZF9zb2NrZXQoKSwgX2RidXNfcmVhZCgpIGlzIG5vdCBhdmFpbGFibGUKKyAqIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK2ludAorX2RidXNfcmVhZCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCkKK3sKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgYWdhaW46CisKKyAgYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBkYXRhLCBjb3VudCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAobm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhY3R1YWxseSByZWFsbG9jIGFueXRoaW5nKSAqLworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgd3JpdGUoKSBzeXN0ZW0gY2FsbCB0aGF0IHdyaXRlcyBhIHBhcnQgb2YgYQorICogREJ1c1N0cmluZyBhbmQgaGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGUgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIGludCBieXRlc193cml0dGVuOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBsZW4pOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlIChmZCwgZGF0YSwgbGVuKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworI2lmIDAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwKQorICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc193cml0dGVuKTsKKyNlbmRpZgorCisgIHJldHVybiBieXRlc193cml0dGVuOworfQorCisvKioKKyAqIExpa2UgX2RidXNfd3JpdGUoKSBidXQgd2lsbCB1c2Ugd3JpdGV2KCkgaWYgcG9zc2libGUKKyAqIHRvIHdyaXRlIGJvdGggYnVmZmVycyBpbiBzZXF1ZW5jZS4gVGhlIHJldHVybiB2YWx1ZQorICogaXMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHRoZSBmaXJzdCBidWZmZXIsCisgKiBwbHVzIHRoZSBudW1iZXIgd3JpdHRlbiBpbiB0aGUgc2Vjb25kLiBJZiB0aGUgZmlyc3QKKyAqIGJ1ZmZlciBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgYW4gZXJyb3Igb2NjdXJzCisgKiB3cml0aW5nIHRoZSBzZWNvbmQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpcnN0CisgKiBpcyByZXR1cm5lZCAoaS5lLiB0aGUgZXJyb3IgaXMgaWdub3JlZCksIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3QgaGF2ZSB3cml0ZXYuIEhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqIFRoZSBzZWNvbmQgYnVmZmVyIG1heSBiZSAjTlVMTC4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGJ1ZmZlcjEgZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gc3RhcnQxIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gbGVuMSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgZnJvbSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBidWZmZXIyIHNlY29uZCBidWZmZXIsIG9yICNOVUxMCisgKiBAcGFyYW0gc3RhcnQyIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHBhcmFtIGxlbjIgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEByZXR1cm5zIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gZnJvbSBib3RoIGJ1ZmZlcnMsIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworI2lmZGVmIEhBVkVfV1JJVEVWCisgIHsKKyAgICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgICBjb25zdCBjaGFyICpkYXRhMTsKKyAgICBjb25zdCBjaGFyICpkYXRhMjsKKyAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgIGRhdGExID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKworICAgIGlmIChidWZmZXIyICE9IE5VTEwpCisgICAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICAgIHN0YXJ0MiA9IDA7CisgICAgICAgIGxlbjIgPSAwOworICAgICAgfQorCisgICAgdmVjdG9yc1swXS5pb3ZfYmFzZSA9IChjaGFyKikgZGF0YTE7CisgICAgdmVjdG9yc1swXS5pb3ZfbGVuID0gbGVuMTsKKyAgICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgICB2ZWN0b3JzWzFdLmlvdl9sZW4gPSBsZW4yOworCisgIGFnYWluOgorCisgICAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRldiAoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxKTsKKworICAgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgIGdvdG8gYWdhaW47CisKKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKyAgfQorI2Vsc2UgLyogSEFWRV9XUklURVYgKi8KKyAgeworICAgIGludCByZXQxLCByZXQyOworCisgICAgcmV0MSA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKyAgICBpZiAocmV0MSA9PSBsZW4xICYmIGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgcmV0MiA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgICAgICAgaWYgKHJldDIgPCAwKQorICAgICAgICAgIHJldDIgPSAwOyAvKiB3ZSBjYW4ndCByZXBvcnQgYW4gZXJyb3IgYXMgdGhlIGZpcnN0IHdyaXRlIHdhcyBPSyAqLworCisgICAgICAgIHJldHVybiByZXQxICsgcmV0MjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gcmV0MTsKKyAgfQorI2VuZGlmIC8qICFIQVZFX1dSSVRFViAqLworfQorCisjZGVmaW5lIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEggOTkKKworLyoqCisgKiBAZGVmIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEgKKyAqCisgKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcGF0aCB0byBhIFVOSVggZG9tYWluIHNvY2tldCwKKyAqIHNvY2thZGRyX3VuOjpzdW5fcGF0aCBtZW1iZXIuIFBPU0lYIHJlcXVpcmVzIHRoYXQgYWxsIHN5c3RlbXMKKyAqIHN1cHBvcnQgYXQgbGVhc3QgMTAwIGJ5dGVzIGhlcmUsIGluY2x1ZGluZyB0aGUgbnVsIHRlcm1pbmF0aW9uLgorICogV2UgdXNlIDk5IGZvciB0aGUgbWF4IHZhbHVlIHRvIGFsbG93IGZvciB0aGUgbnVsLgorICoKKyAqIFdlIGNvdWxkIHByb2JhYmx5IGFsc28gZG8gc2l6ZW9mIChhZGRyLnN1bl9wYXRoKQorICogYnV0IHRoaXMgd2F5IHdlIGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zCisgKiB3aGljaCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYS4KKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBVTklYIGRvbWFpbiBzb2NrZXQgYXQgdGhlCisgKiBnaXZlbiBwYXRoLiAgVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkIHNvY2tldHMgaWYKKyAqIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OyBzZWUgIm1hbiA3IHVuaXgiIG9uIExpbnV4KS4KKyAqIE9uIG5vbi1MaW51eCBhYnN0cmFjdCBzb2NrZXQgdXNhZ2UgYWx3YXlzIGZhaWxzLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBVTklYIGRvbWFpbiBzb2NrZXQKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBwYXRoX2xlbjsKKyAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3RpbmcgdG8gdW5peCBzb2NrZXQgJXMgYWJzdHJhY3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgsIGFic3RyYWN0KTsKKworCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGFkZHIpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBwYXRoX2xlbiA9IHN0cmxlbiAocGF0aCk7CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyNpZmRlZiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5ICgmYWRkci5zdW5fcGF0aFsxXSwgcGF0aCwgcGF0aF9sZW4pOworICAgICAgLyogX2RidXNfdmVyYm9zZV9ieXRlcyAoYWRkci5zdW5fcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSk7ICovCisjZWxzZSAvKiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZVxuIik7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgcGF0aF9sZW4pOworICAgIH0KKworICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgVU5JWCBkb21haW4gc29ja2V0IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgc3BlY2lmaWVkCisgKiBwcm9jZXNzIHRvIGV4ZWN1dGUuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCisgKiBAcGFyYW0gYXJndiB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZS4KKyAqIGFyZ3ZbMF0gdHlwaWNhbGx5IGlzIGlkZW50aWNhbCB0byB0aGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19jb25uZWN0X2V4ZWMgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkc1syXTsKKyAgcGlkX3QgcGlkOworICBpbnQgcmV0dmFsOworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmUgPSAwOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW5nIHRvIHByb2Nlc3MgJXNcbiIsIHBhdGgpOworCisjaWZkZWYgU09DS19DTE9FWEVDCisgIHJldHZhbCA9IHNvY2tldHBhaXIgKEFGX1VOSVgsIFNPQ0tfU1RSRUFNfFNPQ0tfQ0xPRVhFQywgMCwgZmRzKTsKKyAgY2xvZXhlY19kb25lID0gKHJldHZhbCA+PSAwKTsKKworICBpZiAocmV0dmFsIDwgMCAmJiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT1RZUEUpKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gc29ja2V0cGFpciAoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkcyk7CisgICAgfQorCisgIGlmIChyZXR2YWwgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0IHBhaXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1swXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmRzWzFdKTsKKyAgICB9CisKKyAgcGlkID0gZm9yayAoKTsKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsoKSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBjbG9zZSAoZmRzWzBdKTsKKyAgICAgIGNsb3NlIChmZHNbMV0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogY2hpbGQgKi8KKyAgICAgIGNsb3NlIChmZHNbMF0pOworCisgICAgICBkdXAyIChmZHNbMV0sIFNURElOX0ZJTEVOTyk7CisgICAgICBkdXAyIChmZHNbMV0sIFNURE9VVF9GSUxFTk8pOworCisgICAgICBpZiAoZmRzWzFdICE9IFNURElOX0ZJTEVOTyAmJgorICAgICAgICAgIGZkc1sxXSAhPSBTVERPVVRfRklMRU5PKQorICAgICAgICBjbG9zZSAoZmRzWzFdKTsKKworICAgICAgLyogSW5oZXJpdCBTVERFUlIgYW5kIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBmcm9tIHRoZQorICAgICAgICAgcGFyZW50ICovCisKKyAgICAgIF9kYnVzX2Nsb3NlX2FsbCAoKTsKKworICAgICAgZXhlY3ZwIChwYXRoLCBhcmd2KTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIGV4ZWN1dGUgcHJvY2VzcyAlczogJXNcbiIsIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBfZXhpdCgxKTsKKyAgICB9CisKKyAgLyogcGFyZW50ICovCisgIGNsb3NlIChmZHNbMV0pOworCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZHNbMF0sIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIGNsb3NlIChmZHNbMF0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gZmRzWzBdOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwYXRoLAorICogdGhlbiBsaXN0ZW5zIG9uIHRoZSBzb2NrZXQuIFRoZSBzb2NrZXQgaXMKKyAqIHNldCB0byBiZSBub25ibG9ja2luZy4KKyAqCisgKiBVc2VzIGFic3RyYWN0IHNvY2tldHMgaW5zdGVhZCBvZiBmaWxlc3lzdGVtLWxpbmtlZAorICogc29ja2V0cyBpZiByZXF1ZXN0ZWQgKGl0J3MgcG9zc2libGUgb25seSBvbiBMaW51eDsKKyAqIHNlZSAibWFuIDcgdW5peCIgb24gTGludXgpLgorICogT24gbm9uLUxpbnV4IGFic3RyYWN0IHNvY2tldCB1c2FnZSBhbHdheXMgZmFpbHMuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkCisgKgorICogQHBhcmFtIHBhdGggdGhlIHNvY2tldCBuYW1lCisgKiBAcGFyYW0gYWJzdHJhY3QgI1RSVUUgdG8gdXNlIGFic3RyYWN0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbGlzdGVuaW5nIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2xpc3Rlbl91bml4X3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgbGlzdGVuX2ZkOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKyAgc2l6ZV90IHBhdGhfbGVuOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJsaXN0ZW5pbmcgb24gdW5peCBzb2NrZXQgJXMgYWJzdHJhY3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgsIGFic3RyYWN0KTsKKworICBpZiAoIV9kYnVzX29wZW5fdW5peF9zb2NrZXQgKCZsaXN0ZW5fZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgX0RCVVNfWkVSTyAoYWRkcik7CisgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgIHBhdGhfbGVuID0gc3RybGVuIChwYXRoKTsKKworICBpZiAoYWJzdHJhY3QpCisgICAgeworI2lmZGVmIEhBVkVfQUJTVFJBQ1RfU09DS0VUUworICAgICAgLyogcmVtZW1iZXIgdGhhdCBhYnN0cmFjdCBuYW1lcyBhcmVuJ3QgbnVsLXRlcm1pbmF0ZWQgc28gd2UgcmVseQorICAgICAgICogb24gc3VuX3BhdGggYmVpbmcgZmlsbGVkIGluIHdpdGggemVyb2VzIGFib3ZlLgorICAgICAgICovCisgICAgICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IHNheXMgInVzZSBhYnN0cmFjdCIgKi8KKyAgICAgIHBhdGhfbGVuKys7IC8qIEFjY291bnQgZm9yIHRoZSBleHRyYSBudWwgYnl0ZSBhZGRlZCB0byB0aGUgc3RhcnQgb2Ygc3VuX3BhdGggKi8KKworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiQWJzdHJhY3Qgc29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgICAgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIHN0cm5jcHkgKCZhZGRyLnN1bl9wYXRoWzFdLCBwYXRoLCBwYXRoX2xlbik7CisgICAgICAvKiBfZGJ1c192ZXJib3NlX2J5dGVzIChhZGRyLnN1bl9wYXRoLCBzaXplb2YgKGFkZHIuc3VuX3BhdGgpKTsgKi8KKyNlbHNlIC8qIEhBVkVfQUJTVFJBQ1RfU09DS0VUUyAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlXG4iKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRGlzY3Vzc2VkIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBvZiB0aGlzIHdpdGggTmFsaW4sCisgICAgICAgKiBhbmQgd2UgY291bGRuJ3QgdGhpbmsgb2Ygd2hlcmUgaXQgd291bGQga2ljayBvdXIgYXNzLCBidXQKKyAgICAgICAqIGl0IHN0aWxsIHNlZW1zIGEgYml0IHN1Y2t5LiBJdCBhbHNvIGhhcyBub24tc2VjdXJpdHkgc3Vja2FnZTsKKyAgICAgICAqIHJlYWxseSB3ZSdkIHByZWZlciB0byBleGl0IGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBpbiB1c2UuCisgICAgICAgKiBCdXQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcy4KKyAgICAgICAqCisgICAgICAgKiBKdXN0IHRvIGJlIGV4dHJhIGNhcmVmdWwsIEkgdGhyZXcgaW4gdGhlIHN0YXQoKSAtIGNsZWFybHkKKyAgICAgICAqIHRoZSBzdGF0KCkgY2FuJ3QgKmZpeCogYW55IHNlY3VyaXR5IGlzc3VlLCBidXQgaXQgYXQgbGVhc3QKKyAgICAgICAqIGF2b2lkcyBpbmFkdmVydGVudC9hY2NpZGVudGFsIGRhdGEgbG9zcy4KKyAgICAgICAqLworICAgICAgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgICAgICBpZiAoc3RhdCAocGF0aCwgJnNiKSA9PSAwICYmCisgICAgICAgICAgICBTX0lTU09DSyAoc2Iuc3RfbW9kZSkpCisgICAgICAgICAgdW5saW5rIChwYXRoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgICAgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIHN0cm5jcHkgKGFkZHIuc3VuX3BhdGgsIHBhdGgsIHBhdGhfbGVuKTsKKyAgICB9CisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBfREJVU19TVFJVQ1RfT0ZGU0VUIChzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArIHBhdGhfbGVuKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNvY2tldCBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobGlzdGVuIChsaXN0ZW5fZmQsIDMwIC8qIGJhY2tsb2cgKi8pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxpc3RlbiBvbiBzb2NrZXQgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGxpc3Rlbl9mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBUcnkgb3BlbmluZyB1cCB0aGUgcGVybWlzc2lvbnMsIGJ1dCBpZiB3ZSBjYW4ndCwganVzdCBnbyBhaGVhZAorICAgKiBhbmQgY29udGludWUsIG1heWJlIGl0IHdpbGwgYmUgZ29vZCBlbm91Z2guCisgICAqLworICBpZiAoIWFic3RyYWN0ICYmIGNobW9kIChwYXRoLCAwNzc3KSA8IDApCisgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBzZXQgbW9kZSAwNzc3IG9uIHNvY2tldCAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoKTsKKworICByZXR1cm4gbGlzdGVuX2ZkOworfQorCisvKioKKyAqIEFjcXVpcmVzIG9uZSBvciBtb3JlIHNvY2tldHMgcGFzc2VkIGluIGZyb20gc3lzdGVtZC4gVGhlIHNvY2tldHMKKyAqIGFyZSBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0cyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gZmRzIHRoZSBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycworICovCitpbnQKK19kYnVzX2xpc3Rlbl9zeXN0ZW1kX3NvY2tldHMgKERCdXNTb2NrZXQgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9TWVNURU1ECisgIGludCByLCBuOworICBpbnQgZmQ7CisgIERCdXNTb2NrZXQgKm5ld19mZHM7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbiA9IHNkX2xpc3Rlbl9mZHMgKFRSVUUpOworICBpZiAobiA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vICgtbiksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhY3F1aXJlIHN5c3RlbWQgc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKC1uKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChuIDw9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJObyBzb2NrZXQgcmVjZWl2ZWQuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyBuOyBmZCArKykKKyAgICB7CisgICAgICByID0gc2RfaXNfc29ja2V0IChmZCwgQUZfVU5TUEVDLCBTT0NLX1NUUkVBTSwgMSk7CisgICAgICBpZiAociA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKC1yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB2ZXJpZnkgc3lzdGVtZCBzb2NrZXQgdHlwZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoLXIpKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgaWYgKCFyKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFzc2VkIHNvY2tldCBoYXMgd3JvbmcgdHlwZS4iKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogT0ssIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGFyZSBhbGwgZ29vZCwgc28gbGV0J3MgdGFrZSBwb3Nlc3Npb24gb2YKKyAgICAgdGhlbSB0aGVuLiAqLworCisgIG5ld19mZHMgPSBkYnVzX25ldyAoREJ1c1NvY2tldCwgbik7CisgIGlmICghbmV3X2ZkcykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZSBoYW5kbGUgYXJyYXkuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyBuOyBmZCArKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgbmV3X2Zkc1tmZCAtIFNEX0xJU1RFTl9GRFNfU1RBUlRdLmZkID0gZmQ7CisgICAgfQorCisgICpmZHMgPSBuZXdfZmRzOworICByZXR1cm4gbjsKKworIGZhaWw6CisKKyAgZm9yIChmZCA9IFNEX0xJU1RFTl9GRFNfU1RBUlQ7IGZkIDwgU0RfTElTVEVOX0ZEU19TVEFSVCArIG47IGZkICsrKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgfQorCisgIGRidXNfZnJlZSAobmV3X2Zkcyk7CisgIHJldHVybiAtMTsKKyNlbHNlCisgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgImRidXMgd2FzIGNvbXBpbGVkIHdpdGhvdXQgc3lzdGVtZCBzdXBwb3J0Iik7CisgIHJldHVybiAtMTsKKyNlbmRpZgorfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIGEgc29ja2V0IGF0IHRoZSBnaXZlbiBob3N0CisgKiBhbmQgcG9ydC4gVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZAorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK0RCdXNTb2NrZXQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK0RCdXNTb2NrZXQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJybm8gPSAwOworICBEQnVzU29ja2V0IGZkID0gREJVU19TT0NLRVRfSU5JVDsKKyAgaW50IHJlczsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworCisgIGlmICghZmFtaWx5KQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY0IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY2IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIGZhbWlseSAlcyIsIGZhbWlseSk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHOworCisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgaG9zdC9wb3J0OiBcIiVzOiVzXCI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIGdhaV9zdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19vcGVuX3NvY2tldCAoJmZkLmZkLCB0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDAsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICAgICAgfQorICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICAgICAgaWYgKGNvbm5lY3QgKGZkLmZkLCAoc3RydWN0IHNvY2thZGRyKikgdG1wLT5haV9hZGRyLCB0bXAtPmFpX2FkZHJsZW4pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLmZkLCBOVUxMKTsKKyAgICAgICAgICBmZC5mZCA9IC0xOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKGZkLmZkID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yKHNhdmVkX2Vycm5vKSk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyBub25jZWZpbGVTdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm5vbmNlZmlsZVN0ciwgbm9uY2VmaWxlKTsKKyAgICAgIHJldCA9IF9kYnVzX3NlbmRfbm9uY2UgKGZkLCAmbm9uY2VmaWxlU3RyLCBlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZVN0cik7CisKKyAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLmZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZC5mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZC5mZCwgTlVMTCk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKworICByZXR1cm4gZmQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsIHRoZW4gbGlzdGVucyBvbgorICogdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcyBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuICBJbiBjYXNlIG9mIHBvcnQ9MAorICogYSByYW5kb20gZnJlZSBwb3J0IGlzIHVzZWQgYW5kIHJldHVybmVkIGluIHRoZSBwb3J0IHBhcmFtZXRlci4KKyAqIElmIGluYWRkcl9hbnkgaXMgc3BlY2lmaWVkLCB0aGUgaG9zdG5hbWUgaXMgaWdub3JlZC4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uLCBpZiB6ZXJvIGEgZnJlZSBwb3J0IHdpbGwgYmUgdXNlZAorICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSByZXRwb3J0IHN0cmluZyB0byByZXR1cm4gdGhlIGFjdHVhbCBwb3J0IGxpc3RlbmVkIG9uCisgKiBAcGFyYW0gZmRzX3AgbG9jYXRpb24gdG8gc3RvcmUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpc3RlbmluZyBmaWxlIGRlc2NyaXB0b3JzIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnJldHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAgICAqKmZkc19wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IHNhdmVkX2Vycm5vOworICBpbnQgbmxpc3Rlbl9mZCA9IDAsIHJlcywgaTsKKyAgREJ1c1NvY2tldCAqbGlzdGVuX2ZkID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworICB1bnNpZ25lZCBpbnQgcmV1c2VhZGRyOworCisgICpmZHNfcCA9IE5VTEw7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyBmYW1pbHkgJXMiLCBmYW1pbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUcgfCBBSV9QQVNTSVZFOworCisgcmVkb19sb29rdXBfd2l0aF9wb3J0OgorICBhaSA9IE5VTEw7CisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwIHx8ICFhaSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaW50IGZkID0gLTEsIHRjcF9ub2RlbGF5X29uOworICAgICAgREJ1c1NvY2tldCAqbmV3bGlzdGVuX2ZkOworCisgICAgICBpZiAoIV9kYnVzX29wZW5fc29ja2V0ICgmZmQsIHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIHJldXNlYWRkciA9IDE7CisgICAgICBpZiAoc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnJldXNlYWRkciwgc2l6ZW9mKHJldXNlYWRkcikpPT0tMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IHNvY2tldCBvcHRpb24gXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgIC8qIE5hZ2xlJ3MgYWxnb3JpdGhtIGltcG9zZXMgYSBodWdlIGRlbGF5IG9uIHRoZSBpbml0aWFsIG1lc3NhZ2VzCisgICAgICAgICBnb2luZyBvdmVyIFRDUC4gKi8KKyAgICAgIHRjcF9ub2RlbGF5X29uID0gMTsKKyAgICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmdGNwX25vZGVsYXlfb24sIHNpemVvZiAodGNwX25vZGVsYXlfb24pKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IFRDUF9OT0RFTEFZIHNvY2tldCBvcHRpb24gXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgIGlmIChiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlKGZkLCBOVUxMKTsKKyAgICAgICAgICBpZiAoc2F2ZWRfZXJybm8gPT0gRUFERFJJTlVTRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRGVwZW5kaW5nIG9uIGtlcm5lbCBwb2xpY3ksIGJpbmRpbmcgdG8gYW4gSVB2NiBhZGRyZXNzCisgICAgICAgICAgICAgICAgIG1pZ2h0IGltcGxpY2l0bHkgYmluZCB0byBhIGNvcnJlc3BvbmRpbmcgSVB2NAorICAgICAgICAgICAgICAgICBhZGRyZXNzIG9yIHZpY2UgdmVyc2EsIHJlc3VsdGluZyBpbiBFQUREUklOVVNFIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgb3RoZXIgb25lIChlLmcuIGJpbmR2Nm9ubHk9MCBvbiBMaW51eCkuCisKKyAgICAgICAgICAgICAgICAgQWxzbywgYWZ0ZXIgd2UgImdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0IiBhZnRlciBiaW5kaW5nCisgICAgICAgICAgICAgICAgIGEgcG9ydCBvbiBvbmUgb2YgdGhlIHBvc3NpYmxlIGFkZHJlc3Nlcywgd2Ugd2lsbAorICAgICAgICAgICAgICAgICB0cnkgdG8gYmluZCB0aGF0IHNhbWUgcG9ydCBvbiBldmVyeSBhZGRyZXNzLCBpbmNsdWRpbmcgdGhlCisgICAgICAgICAgICAgICAgIHNhbWUgYWRkcmVzcyBhZ2FpbiBmb3IgYSBzZWNvbmQgdGltZTsgdGhhdCBvbmUgd2lsbAorICAgICAgICAgICAgICAgICBhbHNvIGZhaWwgd2l0aCBFQUREUklOVVNFLgorCisgICAgICAgICAgICAgICAgIEZvciBib3RoIHRob3NlIHJlYXNvbnMsIGlnbm9yZSBFQUREUklOVVNFIGhlcmUgKi8KKyAgICAgICAgICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHNhdmVkX2Vycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmIChsaXN0ZW4gKGZkLCAzMCAvKiBiYWNrbG9nICovKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbGlzdGVuIG9uIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIG5ld2xpc3Rlbl9mZCA9IGRidXNfcmVhbGxvYyhsaXN0ZW5fZmQsIHNpemVvZihEQnVzU29ja2V0KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHNhdmVkX2Vycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGhhbmRsZSBhcnJheTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgbGlzdGVuX2ZkID0gbmV3bGlzdGVuX2ZkOworICAgICAgbGlzdGVuX2ZkW25saXN0ZW5fZmRdLmZkID0gZmQ7CisgICAgICBubGlzdGVuX2ZkKys7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocmV0cG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIHBvcnQsIG9yIHVzZWQgMCwgdGhlbgorICAgICAgICAgICAgIHRoZSBrZXJuZWwgY2hvb3NlcyBhIHBvcnQuIEFmdGVyIHRoZSBmaXJzdCBhZGRyZXNzCisgICAgICAgICAgICAgaXMgYm91bmQgdG8sIHdlIG5lZWQgdG8gZm9yY2UgYWxsIHJlbWFpbmluZyBhZGRyZXNzZXMKKyAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgcG9ydCAqLworICAgICAgICAgIGlmICghcG9ydCB8fCAhc3RyY21wKHBvcnQsICIwIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRybGVuOworICAgICAgICAgICAgICBjaGFyIHBvcnRidWZbNTBdOworCisgICAgICAgICAgICAgIGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgICAgICAgICAgIHJlc3VsdCA9IGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyKikgJmFkZHIsICZhZGRybGVuKTsKKworICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xIHx8CisgICAgICAgICAgICAgICAgICAocmVzID0gZ2V0bmFtZWluZm8gKChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBhZGRybGVuLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0YnVmLCBzaXplb2YocG9ydGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBwb3J0IFwiJXM6JXNcIjogJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIGdhaV9zdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogUmVsZWFzZSBjdXJyZW50IGFkZHJlc3MgbGlzdCAmIHJlZG8gbG9va3VwICovCisgICAgICAgICAgICAgIHBvcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEocmV0cG9ydCk7CisgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICAgIGdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB0bXAgPSB0bXAtPmFpX25leHQ7CisgICAgfQorICBmcmVlYWRkcmluZm8oYWkpOworICBhaSA9IE5VTEw7CisKKyAgaWYgKCFubGlzdGVuX2ZkKQorICAgIHsKKyAgICAgIGVycm5vID0gRUFERFJJTlVTRTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZCA7IGkrKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAobGlzdGVuX2ZkW2ldLmZkLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAqZmRzX3AgPSBsaXN0ZW5fZmQ7CisKKyAgcmV0dXJuIG5saXN0ZW5fZmQ7CisKKyBmYWlsZWQ6CisgIGlmIChhaSkKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgX2RidXNfY2xvc2UobGlzdGVuX2ZkW2ldLmZkLCBOVUxMKTsKKyAgZGJ1c19mcmVlKGxpc3Rlbl9mZCk7CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZV9jcmVkZW50aWFsc19ieXRlIChpbnQgICAgICAgICAgICAgc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgY2hhciBidWZbMV0gPSB7ICdcMCcgfTsKKyNpZiBkZWZpbmVkKEhBVkVfQ01TR0NSRUQpCisgIHVuaW9uIHsKKwkgIHN0cnVjdCBjbXNnaGRyIGhkcjsKKwkgIGNoYXIgY3JlZFtDTVNHX1NQQUNFIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpXTsKKyAgfSBjbXNnOworICBzdHJ1Y3QgaW92ZWMgaW92OworICBzdHJ1Y3QgbXNnaGRyIG1zZzsKKyAgaW92Lmlvdl9iYXNlID0gYnVmOworICBpb3YuaW92X2xlbiA9IDE7CisKKyAgX0RCVVNfWkVSTyhtc2cpOworICBtc2cubXNnX2lvdiA9ICZpb3Y7CisgIG1zZy5tc2dfaW92bGVuID0gMTsKKworICBtc2cubXNnX2NvbnRyb2wgPSAoY2FkZHJfdCkgJmNtc2c7CisgIG1zZy5tc2dfY29udHJvbGxlbiA9IENNU0dfU1BBQ0UgKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSk7CisgIF9EQlVTX1pFUk8oY21zZyk7CisgIGNtc2cuaGRyLmNtc2dfbGVuID0gQ01TR19MRU4gKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSk7CisgIGNtc2cuaGRyLmNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUOworICBjbXNnLmhkci5jbXNnX3R5cGUgPSBTQ01fQ1JFRFM7CisjZW5kaWYKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworIGFnYWluOgorCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICBieXRlc193cml0dGVuID0gc2VuZG1zZyAoc2VydmVyX2ZkLCAmbXNnLCAwCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1TR19OT1NJR05BTAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgIC8qIElmIHdlIEhBVkVfQ01TR0NSRUQsIHRoZSBPUyBzdGlsbCBtaWdodCBub3QgbGV0IHVzIHNlbmRtc2coKQorICAgKiB3aXRoIGEgU09MX1NPQ0tFVC9TQ01fQ1JFRFMgbWVzc2FnZSAtIGZvciBpbnN0YW5jZSwgRnJlZUJTRAorICAgKiBvbmx5IGFsbG93cyB0aGF0IG9uIEFGX1VOSVguIFRyeSBqdXN0IGRvaW5nIGEgc2VuZCgpIGluc3RlYWQuICovCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5WQUwpCisjZW5kaWYKKyAgICB7CisgICAgICBieXRlc193cml0dGVuID0gc2VuZCAoc2VydmVyX2ZkLCBidWYsIDEsIDAKKyNpZiBIQVZFX0RFQ0xfTVNHX05PU0lHTkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1TR19OT1NJR05BTAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgY3JlZGVudGlhbHMgYnl0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuID09IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJ3cm90ZSB6ZXJvIGJ5dGVzIHdyaXRpbmcgY3JlZGVudGlhbHMgYnl0ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfd3JpdHRlbiA9PSAxKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cm90ZSBjcmVkZW50aWFscyBieXRlXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworLyogcmV0dXJuIEZBTFNFIG9uIE9PTSwgVFJVRSBvdGhlcndpc2UsIGV2ZW4gaWYgbm8gY3JlZGVudGlhbHMgd2VyZSBmb3VuZCAqLworc3RhdGljIGRidXNfYm9vbF90CithZGRfbGludXhfc2VjdXJpdHlfbGFiZWxfdG9fY3JlZGVudGlhbHMgKGludCAgICAgICAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKFNPX1BFRVJTRUMpCisgIERCdXNTdHJpbmcgYnVmOworICBzb2NrbGVuX3QgbGVuID0gMTAyNDsKKyAgZGJ1c19ib29sX3Qgb29tID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZidWYsIGxlbikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJ1ZiwgbGVuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgd2hpbGUgKGdldHNvY2tvcHQgKGNsaWVudF9mZCwgU09MX1NPQ0tFVCwgU09fUEVFUlNFQywKKyAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJmJ1ZiksICZsZW4pIDwgMCkKKyAgICB7CisgICAgICBpbnQgZSA9IGVycm5vOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZ2V0c29ja29wdCBmYWlsZWQgd2l0aCAlcywgbGVuIG5vdyAlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZSksICh1bnNpZ25lZCBsb25nKSBsZW4pOworCisgICAgICBpZiAoZSAhPSBFUkFOR0UgfHwgbGVuIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoX3VpbnQgKCZidWYpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRzb2Nrb3B0KFNPX1BFRVJTRUMpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZSkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIElmIG5vdCBlbm91Z2ggc3BhY2UsIGxlbiBpcyB1cGRhdGVkIHRvIGJlIGVub3VnaC4KKyAgICAgICAqIFRyeSBhZ2FpbiB3aXRoIGEgbGFyZ2UgZW5vdWdoIGJ1ZmZlci4gKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZidWYsIGxlbikpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3aWxsIHRyeSBhZ2FpbiB3aXRoICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGxlbik7CisgICAgfQorCisgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZ2V0c29ja29wdChTT19QRUVSU0VDKSB5aWVsZGVkIDw9IDAgYnl0ZXM6ICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBsZW4pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aF91aW50ICgmYnVmKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJWx1ID4gJXUiLCAodW5zaWduZWQgbG9uZykgbGVuLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGhfdWludCAoJmJ1ZikpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ2V0c29ja29wdChTT19QRUVSU0VDKSBvdmVyZmxvd2VkIik7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZidWYsIGxlbiAtIDEpID09IDApCisgICAgeworICAgICAgLyogdGhlIGtlcm5lbCBpbmNsdWRlZCB0aGUgdHJhaWxpbmcgXDAgaW4gaXRzIGNvdW50LAorICAgICAgICogYnV0IERCdXNTdHJpbmcgYWx3YXlzIGhhcyBhbiBleHRyYSBcMCBhZnRlciB0aGUgZGF0YSBhbnl3YXkgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzdWJ0cmFjdGluZyB0cmFpbGluZyBcXDBcbiIpOworICAgICAgbGVuLS07CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZidWYsIGxlbikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvcnRlbmluZyBzdHJpbmcgc2hvdWxkIG5vdCBsZWFkIHRvIE9PTSIpOworICAgICAgb29tID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RybGVuIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZidWYpKSAhPSBsZW4pCisgICAgeworICAgICAgLyogTFNNIHBlb3BsZSBvbiB0aGUgbGludXgtc2VjdXJpdHktbW9kdWxlQCBtYWlsaW5nIGxpc3Qgc2F5IHRoaXMKKyAgICAgICAqIHNob3VsZCBuZXZlciBoYXBwZW46IHRoZSBsYWJlbCBzaG91bGQgYmUgYSBieXRlc3RyaW5nIHdpdGgKKyAgICAgICAqIGFuIG9wdGlvbmFsIHRyYWlsaW5nIFwwICovCisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgbGFiZWwgZnJvbSBrZXJuZWwgaGFkIGFuIGVtYmVkZGVkIFxcMCwgIgorICAgICAgICAgICAgICAgICAgICAgImlnbm9yaW5nIGl0XG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZ2V0c29ja29wdChTT19QRUVSU0VDKTogJWx1IGJ5dGVzIGV4Y2x1ZGluZyBcXDA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGVuLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZidWYpKTsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9saW51eF9zZWN1cml0eV9sYWJlbCAoY3JlZGVudGlhbHMsCisgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmJ1ZikpKQorICAgIHsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWYpOworICByZXR1cm4gIW9vbTsKKyNlbHNlCisgIC8qIG5vIGVycm9yICovCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qKgorICogUmVhZHMgYSBzaW5nbGUgYnl0ZSB3aGljaCBtdXN0IGJlIG51bCAoYW4gZXJyb3Igb2NjdXJzIG90aGVyd2lzZSksCisgKiBhbmQgcmVhZHMgdW5peCBjcmVkZW50aWFscyBpZiBhdmFpbGFibGUuIENsZWFycyB0aGUgY3JlZGVudGlhbHMKKyAqIG9iamVjdCwgdGhlbiBhZGRzIHBpZC91aWQgaWYgYXZhaWxhYmxlLCBzbyBhbnkgcHJldmlvdXMgY3JlZGVudGlhbHMKKyAqIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGFyZSBsb3N0LgorICoKKyAqIERCdXNTZXJ2ZXIgbWFrZXMgdGhlIHNlY3VyaXR5IGFzc3VtcHRpb24gdGhhdCB0aGUgY3JlZGVudGlhbHMKKyAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGFyZSB0aGUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIGFjdGl2ZQorICogYXQgdGhlIHRpbWUgdGhlIHNvY2tldCB3YXMgb3BlbmVkLiBEbyBub3QgYWRkIEFQSXMgdG8gdGhpcworICogbWV0aG9kIHRoYXQgd291bGQgYnJlYWsgdGhhdCBhc3N1bXB0aW9uLgorICoKKyAqIEluIHBhcnRpY3VsYXIsIGl0IGlzIGluY29ycmVjdCB0byB1c2UgYW55IEFQSSBvZiB0aGUgZm9ybQorICogImdldCB0aGUgcHJvY2VzcyBJRCBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLCB0aGVuCisgKiBkZXRlcm1pbmUgaXRzIHVpZCwgZ2lkLCBvciBvdGhlciBjcmVkZW50aWFscyBmcm9tIHRoZSBwaWQiCisgKiAoZS5nLiBsb29raW5nIGluIC9wcm9jIG9uIExpbnV4KS4gSWYgd2UgZGlkIHRoYXQsIHdlIHdvdWxkCisgKiBiZSB2dWxuZXJhYmxlIHRvIHNldmVyYWwgYXR0YWNrcy4gQSBtYWxpY2lvdXMgcHJvY2VzcyBjb3VsZAorICogcXVldWUgdXAgdGhlIHJlc3Qgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSBhbmQgYSBtYWxpY2lvdXMKKyAqIG1lc3NhZ2UgdGhhdCBpdCBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2VuZCwgdGhlbiByYWNlIHdpdGgKKyAqIHRoZSBEQnVzU2VydmVyIHRvIGV4ZWMoKSBhIG1vcmUgcHJpdmlsZWdlZCAoZS5nLiBzZXR1aWQpIGJpbmFyeSB0aGF0CisgKiB3b3VsZCBoYXZlIGJlZW4gYWxsb3dlZCB0byBzZW5kIHRoYXQgbWVzc2FnZTsgb3IgaXQgY291bGQgZXhpdCwKKyAqIGFuZCBhcnJhbmdlIGZvciBlbm91Z2ggc2V0dWlkIHByb2Nlc3NlcyB0byBiZSBzdGFydGVkIHRoYXQgaXRzCisgKiBwaWQgd291bGQgYmUgcmVjeWNsZWQgZm9yIG9uZSBvZiB0aG9zZSBwcm9jZXNzZXMgd2l0aCBoaWdoCisgKiBwcm9iYWJpbGl0eTsgb3IgaXQgY291bGQgZmQtcGFzcyB0aGUgY29ubmVjdGlvbiB0byBhIG1vcmUKKyAqIHByaXZpbGVnZWQgcHJvY2Vzcy4KKyAqCisgKiBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBieXRlIHdhcyByZWFkLCBub3Qgd2hldGhlcgorICogd2UgZ290IHZhbGlkIGNyZWRlbnRpYWxzLiBPbiBzb21lIHN5c3RlbXMsIHN1Y2ggYXMgTGludXgsCisgKiByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQsIGJ1dCB3ZSBkbyBpdAorICogYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICoKKyAqIEZhaWxzIGlmIG5vIGJ5dGUgaXMgYXZhaWxhYmxlLCBzbyB5b3UgbXVzdCBzZWxlY3QoKSBmaXJzdC4KKyAqCisgKiBUaGUgcG9pbnQgb2YgdGhlIGJ5dGUgaXMgdGhhdCBvbiBzb21lIHN5c3RlbXMgd2UgaGF2ZSB0bworICogdXNlIHNlbmRtc2coKS9yZWN2bXNnKCkgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNsaWVudF9mZCB0aGUgY2xpZW50IGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGNyZWRlbnRpYWxzIG9iamVjdCB0byBhZGQgY2xpZW50IGNyZWRlbnRpYWxzIHRvCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgZXJyb3IgY29kZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgIChEQnVzU29ja2V0ICAgICAgIGNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgc3RydWN0IG1zZ2hkciBtc2c7CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgIGNoYXIgYnVmOworICBkYnVzX3VpZF90IHVpZF9yZWFkOworICBkYnVzX3BpZF90IHBpZF9yZWFkOworICBpbnQgYnl0ZXNfcmVhZDsKKworI2lmZGVmIEhBVkVfQ01TR0NSRUQKKyAgdW5pb24geworICAgIHN0cnVjdCBjbXNnaGRyIGhkcjsKKyAgICBjaGFyIGNyZWRbQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKV07CisgIH0gY21zZzsKKyNlbmRpZgorCisgIC8qIFRoZSBQT1NJWCBzcGVjIGNlcnRhaW5seSBkb2Vzbid0IHByb21pc2UgdGhpcywgYnV0CisgICAqIHdlIG5lZWQgdGhlc2UgYXNzZXJ0aW9ucyB0byBmYWlsIGFzIHNvb24gYXMgd2UncmUgd3JvbmcgYWJvdXQKKyAgICogaXQgc28gd2UgY2FuIGRvIHRoZSBwb3J0aW5nIGZpeHVwcworICAgKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChwaWRfdCkgPD0gc2l6ZW9mIChkYnVzX3BpZF90KSk7CisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAoZGJ1c191aWRfdCkpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGdpZF90KSA8PSBzaXplb2YgKGRidXNfZ2lkX3QpKTsKKworICB1aWRfcmVhZCA9IERCVVNfVUlEX1VOU0VUOworICBwaWRfcmVhZCA9IERCVVNfUElEX1VOU0VUOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChjcmVkZW50aWFscyk7CisKKyAgaW92Lmlvdl9iYXNlID0gJmJ1ZjsKKyAgaW92Lmlvdl9sZW4gPSAxOworCisgIF9EQlVTX1pFUk8obXNnKTsKKyAgbXNnLm1zZ19pb3YgPSAmaW92OworICBtc2cubXNnX2lvdmxlbiA9IDE7CisKKyNpZiBkZWZpbmVkKEhBVkVfQ01TR0NSRUQpCisgIF9EQlVTX1pFUk8oY21zZyk7CisgIG1zZy5tc2dfY29udHJvbCA9IChjYWRkcl90KSAmY21zZzsKKyAgbXNnLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKTsKKyNlbmRpZgorCisgYWdhaW46CisgIGJ5dGVzX3JlYWQgPSByZWN2bXNnIChjbGllbnRfZmQuZmQsICZtc2csIDApOworCisgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisJZ290byBhZ2FpbjsKKworICAgICAgLyogRUFHQUlOIG9yIEVXT1VMREJMT0NLIHdvdWxkIGJlIHVuZXhwZWN0ZWQgaGVyZSBzaW5jZSB3ZSB3b3VsZAorICAgICAgICogbm9ybWFsbHkgb25seSBjYWxsIHJlYWRfY3JlZGVudGlhbHMgaWYgdGhlIHNvY2tldCB3YXMgcmVhZHkKKyAgICAgICAqIGZvciByZWFkaW5nCisgICAgICAgKi8KKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGJ5dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICB7CisgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB3ZSBhcmUgdXNpbmcgcmVjdm1zZyB3cm9uZywKKyAgICAgICAqIHNvIGlzIGVzc2VudGlhbGx5IGhlcmUgZm9yIHBhcmFub2lhCisgICAgICAgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzIGJ5dGUgKHplcm8tbGVuZ3RoIHJlYWQpIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChidWYgIT0gJ1wwJykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDcmVkZW50aWFscyBieXRlIHdhcyBub3QgbnVsIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWFkIGNyZWRlbnRpYWxzIGJ5dGVcbiIpOworCisgIHsKKyNpZmRlZiBTT19QRUVSQ1JFRAorICAgIC8qIFN1cHBvcnRlZCBieSBhdCBsZWFzdCBMaW51eCBhbmQgT3BlbkJTRCwgd2l0aCBtaW5vciBkaWZmZXJlbmNlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWVjaGFuaXNtIHBhc3NlcyB0aGUgcHJvY2VzcyBJRCB0aHJvdWdoIGFuZCBkb2VzIG5vdCByZXF1aXJlCisgICAgICogdGhlIHBlZXIncyBjb29wZXJhdGlvbiwgc28gd2UgcHJlZmVyIGl0IG92ZXIgYWxsIG90aGVycy4gTm90YWJseSwKKyAgICAgKiBMaW51eCBhbHNvIHN1cHBvcnRzIFNDTV9DUkVERU5USUFMUywgd2hpY2ggaXMgc2ltaWxhciB0byBGcmVlQlNECisgICAgICogU0NNX0NSRURTOyBpdCdzIGltcGxlbWVudGVkIGluIEdJTywgYnV0IHdlIGRvbid0IHVzZSBpdCBpbiBkYnVzIGF0IGFsbCwKKyAgICAgKiBiZWNhdXNlIHRoaXMgaXMgbXVjaCBsZXNzIGZyYWdpbGUuCisgICAgICovCisjaWZkZWYgX19PcGVuQlNEX18KKyAgICBzdHJ1Y3Qgc29ja3BlZXJjcmVkIGNyOworI2Vsc2UKKyAgICBzdHJ1Y3QgdWNyZWQgY3I7CisjZW5kaWYKKyAgICBpbnQgY3JfbGVuID0gc2l6ZW9mIChjcik7CisKKyAgICBpZiAoZ2V0c29ja29wdCAoY2xpZW50X2ZkLmZkLCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyLCAmY3JfbGVuKSAhPSAwKQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldHNvY2tvcHQoU09fUEVFUkNSRUQpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB9CisgICAgZWxzZSBpZiAoY3JfbGVuICE9IHNpemVvZiAoY3IpKQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldHNvY2tvcHQoU09fUEVFUkNSRUQpLCByZXR1cm5lZCAlZCBieXRlcywgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNyX2xlbiwgKGludCkgc2l6ZW9mIChjcikpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcGlkX3JlYWQgPSBjci5waWQ7CisgICAgICAgIHVpZF9yZWFkID0gY3IudWlkOworICAgICAgfQorI2VsaWYgZGVmaW5lZChIQVZFX1VOUENCSUQpICYmIGRlZmluZWQoTE9DQUxfUEVFUkVJRCkKKyAgICAvKiBBbm90aGVyIHZhcmlhbnQgb2YgdGhlIGFib3ZlIC0gdXNlZCBvbiBOZXRCU0QKKyAgICAgKi8KKyAgICBzdHJ1Y3QgdW5wY2JpZCBjcjsKKyAgICBzb2NrbGVuX3QgY3JfbGVuID0gc2l6ZW9mIChjcik7CisKKyAgICBpZiAoZ2V0c29ja29wdCAoY2xpZW50X2ZkLmZkLCAwLCBMT0NBTF9QRUVSRUlELCAmY3IsICZjcl9sZW4pICE9IDApCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0c29ja29wdChMT0NBTF9QRUVSRUlEKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgfQorICAgIGVsc2UgaWYgKGNyX2xlbiAhPSBzaXplb2YgKGNyKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRzb2Nrb3B0KExPQ0FMX1BFRVJFSUQpLCByZXR1cm5lZCAlZCBieXRlcywgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNyX2xlbiwgKGludCkgc2l6ZW9mIChjcikpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcGlkX3JlYWQgPSBjci51bnBfcGlkOworICAgICAgICB1aWRfcmVhZCA9IGNyLnVucF9ldWlkOworICAgICAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICAgIC8qIFdlIG9ubHkgY2hlY2sgZm9yIEhBVkVfQ01TR0NSRUQsIGJ1dCB3ZSdyZSByZWFsbHkgYXNzdW1pbmcgdGhhdCB0aGUKKyAgICAgKiBwcmVzZW5jZSBvZiB0aGF0IHN0cnVjdCBpbXBsaWVzIFNDTV9DUkVEUy4gU3VwcG9ydGVkIGJ5IGF0IGxlYXN0CisgICAgICogRnJlZUJTRCBhbmQgRHJhZ29uZmx5QlNELgorICAgICAqCisgICAgICogVGhpcyBtZWNoYW5pc20gcmVxdWlyZXMgdGhlIHBlZXIgdG8gaGVscCB1cyAoaXQgaGFzIHRvIHNlbmQgdXMgYQorICAgICAqIFNDTV9DUkVEUyBtZXNzYWdlKSBidXQgaXQgZG9lcyBwYXNzIHRoZSBwcm9jZXNzIElEIHRocm91Z2gsCisgICAgICogd2hpY2ggbWFrZXMgaXQgYmV0dGVyIHRoYW4gZ2V0cGVlcmVpZCgpLgorICAgICAqLworICAgIHN0cnVjdCBjbXNnY3JlZCAqY3JlZDsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21zZ3A7CisKKyAgICBmb3IgKGNtc2dwID0gQ01TR19GSVJTVEhEUiAoJm1zZyk7CisgICAgICAgICBjbXNncCAhPSBOVUxMOworICAgICAgICAgY21zZ3AgPSBDTVNHX05YVEhEUiAoJm1zZywgY21zZ3ApKQorICAgICAgeworICAgICAgICBpZiAoY21zZ3AtPmNtc2dfdHlwZSA9PSBTQ01fQ1JFRFMgJiYKKyAgICAgICAgICAgIGNtc2dwLT5jbXNnX2xldmVsID09IFNPTF9TT0NLRVQgJiYKKyAgICAgICAgICAgIGNtc2dwLT5jbXNnX2xlbiA+PSBDTVNHX0xFTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjcmVkID0gKHN0cnVjdCBjbXNnY3JlZCAqKSBDTVNHX0RBVEEgKGNtc2dwKTsKKyAgICAgICAgICAgIHBpZF9yZWFkID0gY3JlZC0+Y21jcmVkX3BpZDsKKyAgICAgICAgICAgIHVpZF9yZWFkID0gY3JlZC0+Y21jcmVkX2V1aWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRQRUVSVUNSRUQpCisgICAgLyogU3VwcG9ydGVkIGluIGF0IGxlYXN0IFNvbGFyaXMgPj0gMTAuIEl0IHNob3VsZCBwcm9iYWJseSBiZSBoaWdoZXIKKyAgICAgKiB1cCB0aGlzIGxpc3QsIGJlY2F1c2UgaXQgY2FycmllcyB0aGUgcGlkIGFuZCB3ZSB1c2UgdGhpcyBjb2RlIHBhdGgKKyAgICAgKiBmb3IgYXVkaXQgZGF0YS4gKi8KKyAgICB1Y3JlZF90ICogdWNyZWQgPSBOVUxMOworICAgIGlmIChnZXRwZWVydWNyZWQgKGNsaWVudF9mZC5mZCwgJnVjcmVkKSA9PSAwKQorICAgICAgeworICAgICAgICBwaWRfcmVhZCA9IHVjcmVkX2dldHBpZCAodWNyZWQpOworICAgICAgICB1aWRfcmVhZCA9IHVjcmVkX2dldGV1aWQgKHVjcmVkKTsKKyNpZmRlZiBIQVZFX0FEVAorICAgICAgICAvKiBnZW5lcmF0ZSBhdWRpdCBzZXNzaW9uIGRhdGEgYmFzZWQgb24gc29ja2V0IHVjcmVkICovCisgICAgICAgIGFkdF9zZXNzaW9uX2RhdGFfdCAqYWR0aCA9IE5VTEw7CisgICAgICAgIGFkdF9leHBvcnRfZGF0YV90ICpkYXRhID0gTlVMTDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICBpZiAoYWR0X3N0YXJ0X3Nlc3Npb24gKCZhZHRoLCBOVUxMLCAwKSB8fCAoYWR0aCA9PSBOVUxMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkdF9zdGFydF9zZXNzaW9uKCk6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWR0X3NldF9mcm9tX3VjcmVkIChhZHRoLCB1Y3JlZCwgQURUX05FVykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkdF9zZXRfZnJvbV91Y3JlZCgpOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBhZHRfZXhwb3J0X3Nlc3Npb25fZGF0YSAoYWR0aCwgJmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYWR0X2V4cG9ydF9zZXNzaW9uX2RhdGEoKTogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhIChjcmVkZW50aWFscywgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgYWR0X2VuZF9zZXNzaW9uIChhZHRoKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSEFWRV9BRFQgKi8KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0cGVlcnVjcmVkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyAgICBpZiAodWNyZWQgIT0gTlVMTCkKKyAgICAgIHVjcmVkX2ZyZWUgKHVjcmVkKTsKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBXaGVuIGFkZGluZyBuZXcgbWVjaGFuaXNtcywgcGxlYXNlIGFkZCB0aGVtIGFib3ZlIHRoaXMgcG9pbnQKKyAgICAgKiBpZiB0aGV5IHN1cHBvcnQgcGFzc2luZyB0aGUgcHJvY2VzcyBJRCB0aHJvdWdoLCBvciBiZWxvdyBpZiBub3QuCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUEVFUkVJRCkKKyAgICAvKiBnZXRwZWVyZWlkKCkgb3JpZ2luYXRlcyBmcm9tIEQuSi4gQmVybnN0ZWluIGFuZCBpcyBmYWlybHkKKyAgICAgKiB3aWRlbHktc3VwcG9ydGVkLiBBY2NvcmRpbmcgdG8gYSB3ZWIgc2VhcmNoLCBpdCBtaWdodCBiZSBwcmVzZW50IGluCisgICAgICogYW55L2FsbCBvZjoKKyAgICAgKgorICAgICAqIC0gQUlYPworICAgICAqIC0gQmxhY2tiZXJyeT8KKyAgICAgKiAtIEN5Z3dpbgorICAgICAqIC0gRnJlZUJTRCA0LjYrIChidXQgd2UgcHJlZmVyIFNDTV9DUkVEUzogaXQgY2FycmllcyB0aGUgcGlkKQorICAgICAqIC0gTWFjIE9TIFgKKyAgICAgKiAtIE1pbml4IDMuMS44KworICAgICAqIC0gTWlyQlNEPworICAgICAqIC0gTmV0QlNEIDUuMCsgKGJ1dCBMT0NBTF9QRUVSRUlEIHdvdWxkIGJlIGJldHRlcjogaXQgY2FycmllcyB0aGUgcGlkKQorICAgICAqIC0gT3BlbkJTRCAzLjArIChidXQgd2UgcHJlZmVyIFNPX1BFRVJDUkVEOiBpdCBjYXJyaWVzIHRoZSBwaWQpCisgICAgICogLSBRTlg/CisgICAgICovCisgICAgdWlkX3QgZXVpZDsKKyAgICBnaWRfdCBlZ2lkOworICAgIGlmIChnZXRwZWVyZWlkIChjbGllbnRfZmQuZmQsICZldWlkLCAmZWdpZCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgdWlkX3JlYWQgPSBldWlkOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRwZWVyZWlkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHN1cHBvcnRlZCBtZWNoYW5pc20gKi8KKworI3dhcm5pbmcgU29ja2V0IGNyZWRlbnRpYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBVbml4IE9TCisjd2FybmluZyBQbGVhc2UgdGVsbCBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EQnVzCisKKyAgICAvKiBQbGVhc2UgYWRkIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGtub3duIHRvIHN1cHBvcnQgYXQgbGVhc3Qgb25lIG9mCisgICAgICogdGhlIG1lY2hhbmlzbXMgYWJvdmUgdG8gdGhpcyBsaXN0LCBrZWVwaW5nIGFscGhhYmV0aWNhbCBvcmRlci4KKyAgICAgKiBFdmVyeXRoaW5nIG5vdCBpbiB0aGlzIGxpc3QgIGlzIGJlc3QtZWZmb3J0LgorICAgICAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBcCisgICAgZGVmaW5lZChfX2xpbnV4X18pIHx8IFwKKyAgICBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBcCisgICAgZGVmaW5lZChfX05ldEJTRF9fKQorIyBlcnJvciBDcmVkZW50aWFscyBwYXNzaW5nIG5vdCB3b3JraW5nIG9uIHRoaXMgT1MgaXMgYSByZWdyZXNzaW9uIQorI2VuZGlmCisKKyAgICBfZGJ1c192ZXJib3NlICgiU29ja2V0IGNyZWRlbnRpYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBPU1xuIik7CisjZW5kaWYKKyAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVkZW50aWFsczoiCisgICAgICAgICAgICAgICAgICIgIHBpZCAiREJVU19QSURfRk9STUFUCisgICAgICAgICAgICAgICAgICIgIHVpZCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICJcbiIsCisJCSBwaWRfcmVhZCwKKwkJIHVpZF9yZWFkKTsKKworICBpZiAocGlkX3JlYWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgcGlkX3JlYWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAodWlkX3JlYWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1aWRfcmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIGlmICghYWRkX2xpbnV4X3NlY3VyaXR5X2xhYmVsX3RvX2NyZWRlbnRpYWxzIChjbGllbnRfZmQuZmQsIGNyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNlbmRzIGEgc2luZ2xlIG51bCBieXRlIHdpdGggb3VyIFVOSVggY3JlZGVudGlhbHMgYXMgYW5jaWxsYXJ5CisgKiBkYXRhLiAgUmV0dXJucyAjVFJVRSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uICBPbgorICogc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2VuZGluZyBjcmVkZW50aWFscywganVzdCB3cml0ZXMgYSBieXRlLAorICogZG9lc24ndCBzZW5kIGFueSBjcmVkZW50aWFscy4gIE9uIHNvbWUgc3lzdGVtcywgc3VjaCBhcyBMaW51eCwKKyAqIHJlYWRpbmcvd3JpdGluZyB0aGUgYnl0ZSBpc24ndCBhY3R1YWxseSByZXF1aXJlZCwgYnV0IHdlIGRvIGl0CisgKiBhbnl3YXkganVzdCB0byBhdm9pZCBtdWx0aXBsZSBjb2RlcGF0aHMuCisgKgorICogRmFpbHMgaWYgbm8gYnl0ZSBjYW4gYmUgd3JpdHRlbiwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXJfZmQgZmlsZSBkZXNjcmlwdG9yIGZvciBjb25uZWN0aW9uIHRvIHNlcnZlcgorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgd2FzIHNlbnQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0ICAoREJ1c1NvY2tldCAgICAgICBzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICh3cml0ZV9jcmVkZW50aWFsc19ieXRlIChzZXJ2ZXJfZmQuZmQsIGVycm9yKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiBvbiBhIGxpc3RlbmluZyBzb2NrZXQuCisgKiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKgorICogVGhpcyB3aWxsIGVuYWJsZSBGRF9DTE9FWEVDIGZvciB0aGUgcmV0dXJuZWQgc29ja2V0LgorICoKKyAqIEBwYXJhbSBsaXN0ZW5fZmQgdGhlIGxpc3RlbiBmaWxlIGRlc2NyaXB0b3IKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGZkIG9mIHRoZSBjbGllbnQsIG9yIC0xIG9uIGVycm9yCisgKi8KK0RCdXNTb2NrZXQKK19kYnVzX2FjY2VwdCAgKERCdXNTb2NrZXQgbGlzdGVuX2ZkKQoreworICBEQnVzU29ja2V0IGNsaWVudF9mZDsKKyAgc3RydWN0IHNvY2thZGRyIGFkZHI7CisgIHNvY2tsZW5fdCBhZGRybGVuOworI2lmZGVmIEhBVkVfQUNDRVBUNAorICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisjZW5kaWYKKworICBhZGRybGVuID0gc2l6ZW9mIChhZGRyKTsKKworIHJldHJ5OgorCisjaWZkZWYgSEFWRV9BQ0NFUFQ0CisgIC8qCisgICAqIEF0IGNvbXBpbGUtdGltZSwgd2UgYXNzdW1lIHRoYXQgaWYgYWNjZXB0NCgpIGlzIGF2YWlsYWJsZSBpbgorICAgKiBsaWJjIGhlYWRlcnMsIFNPQ0tfQ0xPRVhFQyBpcyB0b28uIEF0IHJ1bnRpbWUsIGl0IGlzIHN0aWxsCisgICAqIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXQgZWl0aGVyIGlzIHN1cHBvcnRlZCBieSB0aGUgcnVubmluZyBrZXJuZWwuCisgICAqLworICBjbGllbnRfZmQuZmQgPSBhY2NlcHQ0IChsaXN0ZW5fZmQuZmQsICZhZGRyLCAmYWRkcmxlbiwgU09DS19DTE9FWEVDKTsKKyAgY2xvZXhlY19kb25lID0gY2xpZW50X2ZkLmZkID49IDA7CisKKyAgaWYgKGNsaWVudF9mZC5mZCA8IDAgJiYgKGVycm5vID09IEVOT1NZUyB8fCBlcnJubyA9PSBFSU5WQUwpKQorI2VuZGlmCisgICAgeworICAgICAgY2xpZW50X2ZkLmZkID0gYWNjZXB0IChsaXN0ZW5fZmQuZmQsICZhZGRyLCAmYWRkcmxlbik7CisgICAgfQorCisgIGlmIChjbGllbnRfZmQuZmQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImNsaWVudCBmZCAlZCBhY2NlcHRlZFxuIiwgY2xpZW50X2ZkLmZkKTsKKworI2lmZGVmIEhBVkVfQUNDRVBUNAorICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGNsaWVudF9mZC5mZCk7CisgICAgfQorCisgIHJldHVybiBjbGllbnRfZmQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzCisgKiBwcml2YXRlIHRvIHRoZSB1c2VyCisgKgorICogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICoqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKERCdXNTdHJpbmcgKmRpciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZGlyZWN0b3J5OworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkaXJlY3RvcnkgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRpcik7CisKKyAgaWYgKHN0YXQgKGRpcmVjdG9yeSwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNiLnN0X3VpZCAhPSBnZXRldWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAiJXMgZGlyZWN0b3J5IGlzIG93bmVkIGJ5IHVzZXIgJWx1LCBub3QgJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzYi5zdF91aWQsCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZ2V0ZXVpZCAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICgoU19JUk9USCAmIHNiLnN0X21vZGUpIHx8IChTX0lXT1RIICYgc2Iuc3RfbW9kZSkgfHwKKyAgICAgIChTX0lSR1JQICYgc2Iuc3RfbW9kZSkgfHwgKFNfSVdHUlAgJiBzYi5zdF9tb2RlKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgIiVzIGRpcmVjdG9yeSBpcyBub3QgcHJpdmF0ZSB0byB0aGUgdXNlciIsIGRpcmVjdG9yeSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvX2Zyb21fcGFzc3dkIChzdHJ1Y3QgcGFzc3dkICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNVc2VySW5mbyAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIF9kYnVzX2Fzc2VydCAocC0+cHdfbmFtZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwLT5wd19kaXIgIT0gTlVMTCk7CisKKyAgaW5mby0+dWlkID0gcC0+cHdfdWlkOworICBpbmZvLT5wcmltYXJ5X2dpZCA9IHAtPnB3X2dpZDsKKyAgaW5mby0+dXNlcm5hbWUgPSBfZGJ1c19zdHJkdXAgKHAtPnB3X25hbWUpOworICBpbmZvLT5ob21lZGlyID0gX2RidXNfc3RyZHVwIChwLT5wd19kaXIpOworCisgIGlmIChpbmZvLT51c2VybmFtZSA9PSBOVUxMIHx8CisgICAgICBpbmZvLT5ob21lZGlyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvIChEQnVzVXNlckluZm8gICAgICAgKmluZm8sCisgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICp1c2VybmFtZV9jOworCisgIC8qIGV4YWN0bHkgb25lIG9mIHVzZXJuYW1lL3VpZCBwcm92aWRlZCAqLworICBfZGJ1c19hc3NlcnQgKHVzZXJuYW1lICE9IE5VTEwgfHwgdWlkICE9IERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfYXNzZXJ0ICh1c2VybmFtZSA9PSBOVUxMIHx8IHVpZCA9PSBEQlVTX1VJRF9VTlNFVCk7CisKKyAgaW5mby0+dWlkID0gREJVU19VSURfVU5TRVQ7CisgIGluZm8tPnByaW1hcnlfZ2lkID0gREJVU19HSURfVU5TRVQ7CisgIGluZm8tPmdyb3VwX2lkcyA9IE5VTEw7CisgIGluZm8tPm5fZ3JvdXBfaWRzID0gMDsKKyAgaW5mby0+dXNlcm5hbWUgPSBOVUxMOworICBpbmZvLT5ob21lZGlyID0gTlVMTDsKKworICBpZiAodXNlcm5hbWUgIT0gTlVMTCkKKyAgICB1c2VybmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSk7CisgIGVsc2UKKyAgICB1c2VybmFtZV9jID0gTlVMTDsKKworICAvKiBGb3Igbm93IGFzc3VtaW5nIHRoYXQgdGhlIGdldHB3bmFtKCkgYW5kIGdldHB3dWlkKCkgZmxhdm9ycworICAgKiBhcmUgYWx3YXlzIHN5bW1ldHJpY2FsLCBpZiBub3Qgd2UgaGF2ZSB0byBhZGQgbW9yZSBjb25maWd1cmUKKyAgICogY2hlY2tzCisgICAqLworCisjaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9HRVRQV05BTV9SKSB8fCBkZWZpbmVkIChIQVZFX05PTlBPU0lYX0dFVFBXTkFNX1IpCisgIHsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworICAgIGludCByZXN1bHQ7CisgICAgc2l6ZV90IGJ1ZmxlbjsKKyAgICBjaGFyICpidWY7CisgICAgc3RydWN0IHBhc3N3ZCBwX3N0cjsKKworICAgIC8qIHJldHJpZXZlIG1heGltdW0gbmVlZGVkIHNpemUgZm9yIGJ1ZiAqLworICAgIGJ1ZmxlbiA9IHN5c2NvbmYgKF9TQ19HRVRQV19SX1NJWkVfTUFYKTsKKworICAgIC8qIHN5c2NvbmYgYWN0dWFsbHkgcmV0dXJucyBhIGxvbmcsIGJ1dCBldmVyeXRoaW5nIGVsc2UgZXhwZWN0cyBzaXplX3QsCisgICAgICogc28ganVzdCByZWNhc3QgaGVyZS4KKyAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA2MQorICAgICAqLworICAgIGlmICgobG9uZykgYnVmbGVuIDw9IDApCisgICAgICBidWZsZW4gPSAxMDI0OworCisgICAgcmVzdWx0ID0gLTE7CisgICAgd2hpbGUgKDEpCisgICAgICB7CisgICAgICAgIGJ1ZiA9IGRidXNfbWFsbG9jIChidWZsZW4pOworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIHAgPSBOVUxMOworI2lmZGVmIEhBVkVfUE9TSVhfR0VUUFdOQU1fUgorICAgICAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgICAgIHJlc3VsdCA9IGdldHB3dWlkX3IgKHVpZCwgJnBfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPSBnZXRwd25hbV9yICh1c2VybmFtZV9jLCAmcF9zdHIsIGJ1ZiwgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwKTsKKyNlbHNlCisgICAgICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgcCA9IGdldHB3dWlkX3IgKHVpZCwgJnBfc3RyLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwID0gZ2V0cHduYW1fciAodXNlcm5hbWVfYywgJnBfc3RyLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIHJlc3VsdCA9IDA7CisjZW5kaWYgLyogIUhBVkVfUE9TSVhfR0VUUFdOQU1fUiAqLworICAgICAgICAvL1RyeSBhIGJpZ2dlciBidWZmZXIgaWYgRVJBTkdFIHdhcyByZXR1cm5lZAorICAgICAgICBpZiAocmVzdWx0ID09IEVSQU5HRSAmJiBidWZsZW4gPCA1MTIgKiAxMDI0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIGJ1ZmxlbiAqPSAyOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBpZiAocmVzdWx0ID09IDAgJiYgcCA9PSAmcF9zdHIpCisgICAgICB7CisgICAgICAgIGlmICghZmlsbF91c2VyX2luZm9fZnJvbV9wYXNzd2QgKHAsIGluZm8sIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIFwiJXNcIiB1bmtub3duIG9yIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSBwYXNzd29yZCBlbnRyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MgPyB1c2VybmFtZV9jIDogIj8/PyIpOworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNlciAlcyB1bmtub3duXG4iLCB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbHNlIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisgIHsKKyAgICAvKiBJIGd1ZXNzIHdlJ3JlIHNjcmV3ZWQgb24gdGhyZWFkIHNhZmV0eSBoZXJlICovCisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKworICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgICBwID0gZ2V0cHd1aWQgKHVpZCk7CisgICAgZWxzZQorICAgICAgcCA9IGdldHB3bmFtICh1c2VybmFtZV9jKTsKKworICAgIGlmIChwICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmICghZmlsbF91c2VyX2luZm9fZnJvbV9wYXNzd2QgKHAsIGluZm8sIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlciBcIiVzXCIgdW5rbm93biBvciBubyBtZW1vcnkgdG8gYWxsb2NhdGUgcGFzc3dvcmQgZW50cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzZXIgJXMgdW5rbm93blxuIiwgdXNlcm5hbWVfYyA/IHVzZXJuYW1lX2MgOiAiPz8/Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2VuZGlmICAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworCisgIC8qIEZpbGwgdGhpcyBpbiBzbyB3ZSBjYW4gdXNlIGl0IHRvIGdldCBncm91cHMgKi8KKyAgdXNlcm5hbWVfYyA9IGluZm8tPnVzZXJuYW1lOworCisjaWZkZWYgSEFWRV9HRVRHUk9VUExJU1QKKyAgeworICAgIGdpZF90ICpidWY7CisgICAgaW50IGJ1Zl9jb3VudDsKKyAgICBpbnQgaTsKKyAgICBpbnQgaW5pdGlhbF9idWZfY291bnQ7CisKKyAgICBpbml0aWFsX2J1Zl9jb3VudCA9IDE3OworICAgIGJ1Zl9jb3VudCA9IGluaXRpYWxfYnVmX2NvdW50OworICAgIGJ1ZiA9IGRidXNfbmV3IChnaWRfdCwgYnVmX2NvdW50KTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGlmIChnZXRncm91cGxpc3QgKHVzZXJuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cHJpbWFyeV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgYnVmLCAmYnVmX2NvdW50KSA8IDApCisgICAgICB7CisgICAgICAgIGdpZF90ICpuZXc7CisgICAgICAgIC8qIFByZXN1bWVkIGNhdXNlIG9mIG5lZ2F0aXZlIHJldHVybiBjb2RlOiBidWYgaGFzIGluc3VmZmljaWVudAorICAgICAgICAgICBlbnRyaWVzIHRvIGhvbGQgdGhlIGVudGlyZSBncm91cCBsaXN0LiBUaGUgTGludXggYmVoYXZpb3IgaW4gdGhpcworICAgICAgICAgICBjYXNlIGlzIHRvIHBhc3MgYmFjayB0aGUgYWN0dWFsIG51bWJlciBvZiBncm91cHMgaW4gYnVmX2NvdW50LCBidXQKKyAgICAgICAgICAgb24gTWFjIE9TIFggMTAuNSwgYnVmX2NvdW50IGlzIHVuaGVscGZ1bGx5IGxlZnQgYWxvbmUuCisgICAgICAgICAgIFNvIGFzIGEgaGFjaywgdHJ5IHRvIGhlbHAgb3V0IGEgYml0IGJ5IGd1ZXNzaW5nIGEgbGFyZ2VyCisgICAgICAgICAgIG51bWJlciBvZiBncm91cHMsIHdpdGhpbiByZWFzb24uLiBtaWdodCBzdGlsbCBmYWlsLCBvZiBjb3Vyc2UsCisgICAgICAgICAgIGJ1dCB3ZSBjYW4gYXQgbGVhc3QgcHJpbnQgYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuICBJIGxvb2tlZCB1cAorICAgICAgICAgICB0aGUgInJpZ2h0IHdheSIgdG8gZG8gdGhpcyBieSBkb3dubG9hZGluZyBBcHBsZSdzIG93biBzb3VyY2UgY29kZQorICAgICAgICAgICBmb3IgdGhlICJpZCIgY29tbWFuZCwgYW5kIGl0IHR1cm5zIG91dCB0aGF0IHRoZXkgdXNlIGFuCisgICAgICAgICAgIHVuZG9jdW1lbnRlZCBsaWJyYXJ5IGZ1bmN0aW9uIGdldGdyb3VwbGlzdF8yICghKSB3aGljaCBpcyBub3QKKyAgICAgICAgICAgZGVjbGFyZWQgaW4gYW55IGhlYWRlciBpbiAvdXNyL2luY2x1ZGUgKCEhKS4gVGhhdCBkaWQgbm90IHNlZW0KKyAgICAgICAgICAgbGlrZSB0aGUgd2F5IHRvIGdvIGhlcmUuCisgICAgICAgICovCisgICAgICAgIGlmIChidWZfY291bnQgPT0gaW5pdGlhbF9idWZfY291bnQpCisgICAgICAgICAgeworICAgICAgICAgICAgYnVmX2NvdW50ICo9IDE2OyAvKiBSZXRyeSB3aXRoIGFuIGFyYml0cmFyaWx5IHNjYWxlZC11cCBhcnJheSAqLworICAgICAgICAgIH0KKyAgICAgICAgbmV3ID0gZGJ1c19yZWFsbG9jIChidWYsIGJ1Zl9jb3VudCAqIHNpemVvZiAoYnVmWzBdKSk7CisgICAgICAgIGlmIChuZXcgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKworICAgICAgICBidWYgPSBuZXc7CisKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBpZiAoZ2V0Z3JvdXBsaXN0ICh1c2VybmFtZV9jLCBpbmZvLT5wcmltYXJ5X2dpZCwgYnVmLCAmYnVmX2NvdW50KSA8IDApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGVycm5vID09IDApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiSXQgYXBwZWFycyB0aGF0IHVzZXJuYW1lIFwiJXNcIiBpcyBpbiBtb3JlIHRoYW4gJWQgZ3JvdXBzLlxuUHJvY2VlZGluZyB3aXRoIGp1c3QgdGhlIGZpcnN0ICVkIGdyb3Vwcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MsIGJ1Zl9jb3VudCwgYnVmX2NvdW50KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGdyb3VwcyBmb3IgdXNlcm5hbWUgXCIlc1wiIHByaW1hcnkgR0lEICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19HSURfRk9STUFUICI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jLCBpbmZvLT5wcmltYXJ5X2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgaW5mby0+Z3JvdXBfaWRzID0gZGJ1c19uZXcgKGRidXNfZ2lkX3QsIGJ1Zl9jb3VudCk7CisgICAgaWYgKGluZm8tPmdyb3VwX2lkcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZfY291bnQ7ICsraSkKKyAgICAgIGluZm8tPmdyb3VwX2lkc1tpXSA9IGJ1ZltpXTsKKworICAgIGluZm8tPm5fZ3JvdXBfaWRzID0gYnVmX2NvdW50OworCisgICAgZGJ1c19mcmVlIChidWYpOworICB9CisjZWxzZSAgLyogSEFWRV9HRVRHUk9VUExJU1QgKi8KKyAgeworICAgIC8qIFdlIGp1c3QgZ2V0IHRoZSBvbmUgZ3JvdXAgSUQgKi8KKyAgICBpbmZvLT5ncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgMSk7CisgICAgaWYgKGluZm8tPmdyb3VwX2lkcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBpbmZvLT5uX2dyb3VwX2lkcyA9IDE7CisKKyAgICAoaW5mby0+Z3JvdXBfaWRzKVswXSA9IGluZm8tPnByaW1hcnlfZ2lkOworICB9CisjZW5kaWYgLyogSEFWRV9HRVRHUk9VUExJU1QgKi8KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIGluZm8gZm9yIHRoZSBnaXZlbiB1c2VybmFtZS4KKyAqCisgKiBAcGFyYW0gaW5mbyB1c2VyIGluZm8gb2JqZWN0IHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfaW5mb19maWxsIChEQnVzVXNlckluZm8gICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gZmlsbF91c2VyX2luZm8gKGluZm8sIERCVVNfVUlEX1VOU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBlcnJvcik7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIGluZm8gZm9yIHRoZSBnaXZlbiB1c2VyIElELgorICoKKyAqIEBwYXJhbSBpbmZvIHVzZXIgaW5mbyBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIHVpZCB0aGUgdXNlciBJRAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9pbmZvX2ZpbGxfdWlkIChEQnVzVXNlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKQoreworICByZXR1cm4gZmlsbF91c2VyX2luZm8gKGluZm8sIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlcnJvcik7Cit9CisKKy8qKgorICogQWRkcyB0aGUgY3JlZGVudGlhbHMgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byB0aGUKKyAqIHBhc3NlZC1pbiBjcmVkZW50aWFscyBvYmplY3QuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIGFkZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeTsgZG9lcyBub3QgcHJvcGVybHkgcm9sbCBiYWNrIG9uIGZhaWx1cmUsIHNvIG9ubHkgc29tZSBjcmVkZW50aWFscyBtYXkgaGF2ZSBiZWVuIGFkZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIC8qIFRoZSBQT1NJWCBzcGVjIGNlcnRhaW5seSBkb2Vzbid0IHByb21pc2UgdGhpcywgYnV0CisgICAqIHdlIG5lZWQgdGhlc2UgYXNzZXJ0aW9ucyB0byBmYWlsIGFzIHNvb24gYXMgd2UncmUgd3JvbmcgYWJvdXQKKyAgICogaXQgc28gd2UgY2FuIGRvIHRoZSBwb3J0aW5nIGZpeHVwcworICAgKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChwaWRfdCkgPD0gc2l6ZW9mIChkYnVzX3BpZF90KSk7CisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAoZGJ1c191aWRfdCkpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGdpZF90KSA8PSBzaXplb2YgKGRidXNfZ2lkX3QpKTsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQoY3JlZGVudGlhbHMsIF9kYnVzX2dldHBpZCgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRldWlkKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmQgdG8gdGhlIHN0cmluZyB0aGUgaWRlbnRpdHkgd2Ugd291bGQgbGlrZSB0byBoYXZlIHdoZW4gd2UKKyAqIGF1dGhlbnRpY2F0ZSwgb24gVU5JWCB0aGlzIGlzIHRoZSBjdXJyZW50IHByb2Nlc3MgVUlEIGFuZCBvbgorICogV2luZG93cyBzb21ldGhpbmcgZWxzZSwgcHJvYmFibHkgYSBXaW5kb3dzIFNJRCBzdHJpbmcuICBObyBlc2NhcGluZworICogaXMgcmVxdWlyZWQsIHRoYXQgaXMgZG9uZSBpbiBkYnVzLWF1dGguYy4gVGhlIHVzZXJuYW1lIGhlcmUKKyAqIG5lZWQgbm90IGJlIGFueXRoaW5nIGh1bWFuLXJlYWRhYmxlLCBpdCBjYW4gYmUgdGhlIG1hY2hpbmUtcmVhZGFibGUKKyAqIGZvcm0gaS5lLiBhIHVzZXIgaWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRldWlkICgpKTsKK30KKworLyoqCisgKiBHZXRzIG91ciBwcm9jZXNzIElECisgKiBAcmV0dXJucyBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2dldHBpZCAodm9pZCkKK3sKKyAgcmV0dXJuIGdldHBpZCAoKTsKK30KKworLyoqIEdldHMgb3VyIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBVSUQKKyAqLworZGJ1c191aWRfdAorX2RidXNfZ2V0dWlkICh2b2lkKQoreworICByZXR1cm4gZ2V0dWlkICgpOworfQorCisvKiogR2V0cyBvdXIgZWZmZWN0aXZlIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBlZmZlY3RpdmUgVUlECisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2dldGV1aWQgKHZvaWQpCit7CisgIHJldHVybiBnZXRldWlkICgpOworfQorCisvKioKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIHNlcGFyYXRlIGZyb20gX2RidXNfZ2V0cGlkKCkgaXMgdG8gYWxsb3cgaXQKKyAqIG9uIFdpbmRvd3MgZm9yIGxvZ2dpbmcgYnV0IG5vdCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKgorICogQHJldHVybnMgcHJvY2VzcyBJRCB0byBwdXQgaW4gbG9nIG1lc3NhZ2VzCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19kYnVzX3BpZF9mb3JfbG9nICh2b2lkKQoreworICByZXR1cm4gZ2V0cGlkICgpOworfQorCisvKioKKyAqIEdldHMgYSBVSUQgZnJvbSBhIFVJRCBzdHJpbmcuCisgKgorICogQHBhcmFtIHVpZF9zdHIgdGhlIFVJRCBpbiBzdHJpbmcgZm9ybQorICogQHBhcmFtIHVpZCBVSUQgdG8gZmlsbCBpbgorICogQHJldHVybnMgI1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IGZpbGxlZCBpbiBVSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VpZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICp1aWRfc3RyLAorICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgICAgKnVpZCkKK3sKKyAgaW50IGVuZDsKKyAgbG9uZyB2YWw7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgc3RyaW5nIHdhcyB6ZXJvIGxlbmd0aFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHZhbCA9IC0xOworICBlbmQgPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKHVpZF9zdHIsIDAsICZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBwYXJzZSBzdHJpbmcgYXMgYSBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgic3RyaW5nIGNvbnRhaW5lZCB0cmFpbGluZyBzdHVmZiBhZnRlciBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqdWlkID0gdmFsOworCisgIHJldHVybiBUUlVFOworfQorCisjaWYgIURCVVNfVVNFX1NZTkMKKy8qIFRvIGJlIHRocmVhZC1zYWZlIGJ5IGRlZmF1bHQgb24gcGxhdGZvcm1zIHRoYXQgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZQorICogYXRvbWljIG9wZXJhdGlvbnMgKG5vdGFibHkgRGViaWFuIGFybWVsLCB3aGljaCBpcyBhcm12NHQpLCB3ZSBtdXN0CisgKiB1c2UgYSBtdXRleCB0aGF0IGNhbiBiZSBpbml0aWFsaXplZCBzdGF0aWNhbGx5LCBsaWtlIHRoaXMuCisgKiBHTGliID49IDIuMzIgdXNlcyBhIHNpbWlsYXIgc3lzdGVtLgorICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGF0b21pY19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZW5kaWYKKworLyoqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBpbmNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgaW5jcmVtZW50aW5nCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2luYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgcmV0dXJuIF9fc3luY19hZGRfYW5kX2ZldGNoKCZhdG9taWMtPnZhbHVlLCAxKS0xOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IHJlczsKKworICBwdGhyZWFkX211dGV4X2xvY2sgKCZhdG9taWNfbXV0ZXgpOworICByZXMgPSBhdG9taWMtPnZhbHVlOworICBhdG9taWMtPnZhbHVlICs9IDE7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogQXRvbWljYWxseSBkZWNyZW1lbnQgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBkZWNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgZGVjcmVtZW50aW5nCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZhdG9taWMtPnZhbHVlLCAxKSsxOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IHJlczsKKworICBwdGhyZWFkX211dGV4X2xvY2sgKCZhdG9taWNfbXV0ZXgpOworICByZXMgPSBhdG9taWMtPnZhbHVlOworICBhdG9taWMtPnZhbHVlIC09IDE7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogQXRvbWljYWxseSBnZXQgdGhlIHZhbHVlIG9mIGFuIGludGVnZXIuIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUKKyAqIHRoZXJlYWZ0ZXIsIHNvIHRoaXMgaXMgbW9zdGx5IG9ubHkgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBnZXQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGlzIG1vbWVudAorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyNpZiBEQlVTX1VTRV9TWU5DCisgIF9fc3luY19zeW5jaHJvbml6ZSAoKTsKKyAgcmV0dXJuIGF0b21pYy0+dmFsdWU7CisjZWxzZQorICBkYnVzX2ludDMyX3QgcmVzOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJmF0b21pY19tdXRleCk7CisgIHJlcyA9IGF0b21pYy0+dmFsdWU7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogV3JhcHBlciBmb3IgcG9sbCgpLgorICoKKyAqIEBwYXJhbSBmZHMgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdG8gcG9sbAorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgbnVtYmVycyBvZiBmZHMgd2l0aCByZXZlbnRzLCBvciA8MCBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BvbGwgKERCdXNQb2xsRkQgKmZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEJST0tFTl9QT0xMKQorICAvKiBEQnVzUG9sbEZEIGlzIGEgc3RydWN0IHBvbGxmZCBpbiB0aGlzIGNvZGUgcGF0aCwgc28gd2UgY2FuIGp1c3QgcG9sbCgpICovCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyA8IC0xKQorICAgIHsKKyAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzID0gLTE7CisgICAgfQorCisgIHJldHVybiBwb2xsIChmZHMsCisgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyNlbHNlIC8qICEgSEFWRV9QT0xMICovCisgIC8qIEVtdWxhdGUgcG9sbCgpIGluIHRlcm1zIG9mIHNlbGVjdCgpICovCisgIGZkX3NldCByZWFkX3NldCwgd3JpdGVfc2V0LCBlcnJfc2V0OworICBpbnQgbWF4X2ZkID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgRkRfWkVSTyAoJndyaXRlX3NldCk7CisgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMSU4pCisJRkRfU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorCUZEX1NFVCAoZmRwLT5mZCwgJndyaXRlX3NldCk7CisKKyAgICAgIEZEX1NFVCAoZmRwLT5mZCwgJmVycl9zZXQpOworCisgICAgICBtYXhfZmQgPSBNQVggKG1heF9mZCwgZmRwLT5mZCk7CisgICAgfQorCisgIHR2LnR2X3NlYyA9IHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgdHYudHZfdXNlYyA9ICh0aW1lb3V0X21pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKKworICByZWFkeSA9IHNlbGVjdCAobWF4X2ZkICsgMSwgJnJlYWRfc2V0LCAmd3JpdGVfc2V0LCAmZXJyX3NldCwKKyAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMCA/IE5VTEwgOiAmdHYpOworCisgIGlmIChyZWFkeSA+IDApCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisJeworCSAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworCSAgZmRwLT5yZXZlbnRzID0gMDsKKworCSAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpKQorCSAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisJICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpKQorCSAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworCSAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmZXJyX3NldCkpCisJICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJlYWR5OworI2VuZGlmCit9CisKKy8qKgorICogR2V0IGN1cnJlbnQgdGltZSwgYXMgaW4gZ2V0dGltZW9mZGF5KCkuIFVzZSB0aGUgbW9ub3RvbmljIGNsb2NrIGlmCisgKiBhdmFpbGFibGUsIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gdGhlIHN5c3RlbSB0aW1lIGNoYW5nZXMuCisgKgorICogQHBhcmFtIHR2X3NlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBzZWNvbmRzCisgKiBAcGFyYW0gdHZfdXNlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLwordm9pZAorX2RidXNfZ2V0X21vbm90b25pY190aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMpCit7CisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgc3RydWN0IHRpbWVzcGVjIHRzOworICBjbG9ja19nZXR0aW1lIChDTE9DS19NT05PVE9OSUMsICZ0cyk7CisKKyAgaWYgKHR2X3NlYykKKyAgICAqdHZfc2VjID0gdHMudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHRzLnR2X25zZWMgLyAxMDAwOworI2Vsc2UKKyAgc3RydWN0IHRpbWV2YWwgdDsKKworICBnZXR0aW1lb2ZkYXkgKCZ0LCBOVUxMKTsKKworICBpZiAodHZfc2VjKQorICAgICp0dl9zZWMgPSB0LnR2X3NlYzsKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0LnR2X3VzZWM7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXQgY3VycmVudCB0aW1lLCBhcyBpbiBnZXR0aW1lb2ZkYXkoKS4gTmV2ZXIgdXNlcyB0aGUgbW9ub3RvbmljCisgKiBjbG9jay4KKyAqCisgKiBAcGFyYW0gdHZfc2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIHNlY29uZHMKKyAqIEBwYXJhbSB0dl91c2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworICovCit2b2lkCitfZGJ1c19nZXRfcmVhbF90aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKQoreworICBzdHJ1Y3QgdGltZXZhbCB0OworCisgIGdldHRpbWVvZmRheSAoJnQsIE5VTEwpOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHQudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHQudHZfdXNlYzsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgZGlyZWN0b3J5OyBzdWNjZWVkcyBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBjcmVhdGVkIG9yIGFscmVhZHkgZXhpc3RlZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAobWtkaXIgKGZpbGVuYW1lX2MsIDA3MDApIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUVYSVNUKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIGZpbGVuYW1lIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgKgorICogQHRvZG8gaXQgbWlnaHQgYmUgY3V0ZSB0byBjb2xsYXBzZSBtdWx0aXBsZSAnLycgc3VjaCBhcyAiZm9vLy8iCisgKiBjb25jYXQgIi8vYmFyIgorICoKKyAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gbmV4dF9jb21wb25lbnQgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChEQnVzU3RyaW5nICAgICAgICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpuZXh0X2NvbXBvbmVudCkKK3sKKyAgZGJ1c19ib29sX3QgZGlyX2VuZHNfaW5fc2xhc2g7CisgIGRidXNfYm9vbF90IGZpbGVfc3RhcnRzX3dpdGhfc2xhc2g7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpID09IDAgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuZXh0X2NvbXBvbmVudCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkaXJfZW5kc19pbl9zbGFzaCA9ICcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlyKSAtIDEpOworCisgIGZpbGVfc3RhcnRzX3dpdGhfc2xhc2ggPSAnLycgPT0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChuZXh0X2NvbXBvbmVudCwgMCk7CisKKyAgaWYgKGRpcl9lbmRzX2luX3NsYXNoICYmIGZpbGVfc3RhcnRzX3dpdGhfc2xhc2gpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKGRpciwgMSk7CisgICAgfQorICBlbHNlIGlmICghKGRpcl9lbmRzX2luX3NsYXNoIHx8IGZpbGVfc3RhcnRzX3dpdGhfc2xhc2gpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChkaXIsICcvJykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5IChuZXh0X2NvbXBvbmVudCwgMCwgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpKTsKK30KKworLyoqIG5hbm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQgICAgICAgMTAwMDAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUNST1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAwMDAKKy8qKiBtaWxsaXNlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgICAgICAxMDAwCisvKiogbmFub3NlY29uZHMgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQgIDEwMDAwMDAKKy8qKiBtaWNyb3NlY29uZHMgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBNSUNST1NFQ09ORFNfUEVSX01JTExJU0VDT05EIDEwMDAKKworLyoqCisgKiBTbGVlcHMgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAqLwordm9pZAorX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChpbnQgbWlsbGlzZWNvbmRzKQoreworI2lmZGVmIEhBVkVfTkFOT1NMRUVQCisgIHN0cnVjdCB0aW1lc3BlYyByZXE7CisgIHN0cnVjdCB0aW1lc3BlYyByZW07CisKKyAgcmVxLnR2X3NlYyA9IG1pbGxpc2Vjb25kcyAvIE1JTExJU0VDT05EU19QRVJfU0VDT05EOworICByZXEudHZfbnNlYyA9IChtaWxsaXNlY29uZHMgJSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCkgKiBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQ7CisgIHJlbS50dl9zZWMgPSAwOworICByZW0udHZfbnNlYyA9IDA7CisKKyAgd2hpbGUgKG5hbm9zbGVlcCAoJnJlcSwgJnJlbSkgPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIHJlcSA9IHJlbTsKKyNlbGlmIGRlZmluZWQgKEhBVkVfVVNMRUVQKQorICB1c2xlZXAgKG1pbGxpc2Vjb25kcyAqIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQpOworI2Vsc2UgLyogISBIQVZFX1VTTEVFUCAqLworICBzbGVlcCAoTUFYIChtaWxsaXNlY29uZHMgLyAxMDAwLCAxKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiBzZWN1cmVseSByYW5kb20gYnl0ZXMsCisgKiB1c2luZyB0aGUgYmVzdCBtZWNoYW5pc20gd2UgY2FuIGNvbWUgdXAgd2l0aC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBuX2J5dGVzIHRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGFwcGVuZCB0byBzdHJpbmcKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgb2xkX2xlbjsKKyAgaW50IGZkOworICBpbnQgcmVzdWx0OworCisgIG9sZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgZmQgPSAtMTsKKworICAvKiBub3RlLCB1cmFuZG9tIG9uIGxpbnV4IHdpbGwgZmFsbCBiYWNrIHRvIHBzZXVkb3JhbmRvbSAqLworICBmZCA9IG9wZW4gKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9wZW4gL2Rldi91cmFuZG9tOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIvZGV2L3VyYW5kb20gZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisKKyAgcmVzdWx0ID0gX2RidXNfcmVhZCAoZmQsIHN0ciwgbl9ieXRlcyk7CisKKyAgaWYgKHJlc3VsdCAhPSBuX2J5dGVzKQorICAgIHsKKyAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCAvZGV2L3VyYW5kb206ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU2hvcnQgcmVhZCBmcm9tIC9kZXYvdXJhbmRvbSIpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb2xkX2xlbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkICVkIGJ5dGVzIGZyb20gL2Rldi91cmFuZG9tXG4iLAorICAgICAgICAgICAgICAgICBuX2J5dGVzKTsKKworICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEV4aXQgdGhlIHByb2Nlc3MsIHJldHVybmluZyB0aGUgZ2l2ZW4gdmFsdWUuCisgKgorICogQHBhcmFtIGNvZGUgdGhlIGV4aXQgY29kZQorICovCit2b2lkCitfZGJ1c19leGl0IChpbnQgY29kZSkKK3sKKyAgX2V4aXQgKGNvZGUpOworfQorCisvKioKKyAqIEEgd3JhcHBlciBhcm91bmQgc3RyZXJyb3IoKSBiZWNhdXNlIHNvbWUgcGxhdGZvcm1zCisgKiBtYXkgYmUgbGFtZSBhbmQgbm90IGhhdmUgc3RyZXJyb3IoKS4gQWxzbywgbmV2ZXIKKyAqIHJldHVybnMgTlVMTC4KKyAqCisgKiBAcGFyYW0gZXJyb3JfbnVtYmVyIGVycm5vLgorICogQHJldHVybnMgZXJyb3IgZGVzY3JpcHRpb24uCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19zdHJlcnJvciAoaW50IGVycm9yX251bWJlcikKK3sKKyAgY29uc3QgY2hhciAqbXNnOworCisgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworICBpZiAobXNnID09IE5VTEwpCisgICAgbXNnID0gInVua25vd24iOworCisgIHJldHVybiBtc2c7Cit9CisKKy8qKgorICogc2lnbmFsIChTSUdQSVBFLCBTSUdfSUdOKTsKKyAqLwordm9pZAorX2RidXNfZGlzYWJsZV9zaWdwaXBlICh2b2lkKQoreworICBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworfQorCisvKioKKyAqIFNldHMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSBjbG9zZQorICogb24gZXhlYy4gU2hvdWxkIGJlIGNhbGxlZCBmb3IgYWxsIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGluIEQtQnVzIGNvZGUuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqLwordm9pZAorX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGludCBmZCkKK3sKKyAgaW50IHZhbDsKKworICB2YWwgPSBmY250bCAoZmQsIEZfR0VURkQsIDApOworCisgIGlmICh2YWwgPCAwKQorICAgIHJldHVybjsKKworICB2YWwgfD0gRkRfQ0xPRVhFQzsKKworICBmY250bCAoZmQsIEZfU0VURkQsIHZhbCk7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jbG9zZSAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworIGFnYWluOgorICBpZiAoY2xvc2UgKGZkKSA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIGZkICVkIiwgZmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEdXBsaWNhdGVzIGEgZmlsZSBkZXNjcmlwdG9yLiBNYWtlcyBzdXJlIHRoZSBmZCByZXR1cm5lZCBpcyA+PSAzCisgKiAoaS5lLiBhdm9pZHMgc3RkaW4vc3Rkb3V0L3N0ZGVycikuIFNldHMgT19DTE9FWEVDLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGR1cGxpY2F0ZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyBkdXBsaWNhdGVkIGZpbGUgZGVzY3JpcHRvcgorICogKi8KK2ludAorX2RidXNfZHVwKGludCAgICAgICAgZmQsCisgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgaW50IG5ld19mZDsKKworI2lmZGVmIEZfRFVQRkRfQ0xPRVhFQworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgbmV3X2ZkID0gZmNudGwoZmQsIEZfRFVQRkRfQ0xPRVhFQywgMyk7CisgIGNsb2V4ZWNfZG9uZSA9IG5ld19mZCA+PSAwOworCisgIGlmIChuZXdfZmQgPCAwICYmIGVycm5vID09IEVJTlZBTCkKKyNlbmRpZgorICAgIHsKKyAgICAgIG5ld19mZCA9IGZjbnRsKGZkLCBGX0RVUEZELCAzKTsKKyAgICB9CisKKyAgaWYgKG5ld19mZCA8IDApIHsKKworICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGR1cGxpY2F0ZSBmZCAlZCIsIGZkKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworI2lmZGVmIEZfRFVQRkRfQ0xPRVhFQworICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKG5ld19mZCk7CisgICAgfQorCisgIHJldHVybiBuZXdfZmQ7Cit9CisKKy8qKgorICogU2V0cyBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSBub25ibG9ja2luZy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIG9mIGVycm9yIGxvY2F0aW9uLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKERCdXNTb2NrZXQgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQuZmQsIGVycm9yKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGludCAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgdmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHZhbCA9IGZjbnRsIChmZCwgRl9HRVRGTCwgMCk7CisgIGlmICh2YWwgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGZsYWdzIGZyb20gZmlsZSBkZXNjcmlwdG9yICVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXQgZmxhZ3MgZm9yIGZkICVkOiAlc1xuIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZjbnRsIChmZCwgRl9TRVRGTCwgdmFsIHwgT19OT05CTE9DSykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IG5vbmJsb2NraW5nIGZsYWcgb2YgZmlsZSBkZXNjcmlwdG9yICVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBzZXQgZmQgJWQgbm9uYmxvY2tpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZmQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIE9uIEdOVSBsaWJjIHN5c3RlbXMsIHByaW50IGEgY3J1ZGUgYmFja3RyYWNlIHRvIHN0ZGVyci4gIE9uIG90aGVyCisgKiBzeXN0ZW1zLCBwcmludCAibm8gYmFja3RyYWNlIHN1cHBvcnQiIGFuZCBibG9jayBmb3IgcG9zc2libGUgZ2RiCisgKiBhdHRhY2htZW50IGlmIGFuIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4KKyAqLwordm9pZAorX2RidXNfcHJpbnRfYmFja3RyYWNlICh2b2lkKQoreworI2lmIGRlZmluZWQgKEhBVkVfQkFDS1RSQUNFKSAmJiBkZWZpbmVkIChEQlVTX0JVSUxUX1JfRFlOQU1JQykKKyAgdm9pZCAqYnRbNTAwXTsKKyAgaW50IGJ0X3NpemU7CisgIGludCBpOworICBjaGFyICoqc3ltczsKKworICBidF9zaXplID0gYmFja3RyYWNlIChidCwgNTAwKTsKKworICBzeW1zID0gYmFja3RyYWNlX3N5bWJvbHMgKGJ0LCBidF9zaXplKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBidF9zaXplKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHVzZSBkYnVzX3dhcm4gc2luY2UgaXQgY2FuIF9kYnVzX2Fib3J0KCkgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgJXNcbiIsIHN5bXNbaV0pOworICAgICAgKytpOworICAgIH0KKyAgZmZsdXNoIChzdGRlcnIpOworCisgIGZyZWUgKHN5bXMpOworI2VsaWYgZGVmaW5lZCAoSEFWRV9CQUNLVFJBQ0UpICYmICEgZGVmaW5lZCAoREJVU19CVUlMVF9SX0RZTkFNSUMpCisgIGZwcmludGYgKHN0ZGVyciwgIiAgRC1CdXMgbm90IGJ1aWx0IHdpdGggLXJkeW5hbWljIHNvIHVuYWJsZSB0byBwcmludCBhIGJhY2t0cmFjZVxuIik7CisjZWxzZQorICBmcHJpbnRmIChzdGRlcnIsICIgIEQtQnVzIG5vdCBjb21waWxlZCB3aXRoIGJhY2t0cmFjZSBzdXBwb3J0IHNvIHVuYWJsZSB0byBwcmludCBhIGJhY2t0cmFjZVxuIik7CisjZW5kaWYKK30KKworLyoqCisgKiBDcmVhdGVzIHBhaXIgb2YgY29ubmVjdCBzb2NrZXRzIChhcyBpbiBzb2NrZXRwYWlyKCkpLgorICogU2V0cyBib3RoIGVuZHMgb2YgdGhlIHBhaXIgbm9uYmxvY2tpbmcuCisgKgorICogTWFya3MgYm90aCBmaWxlIGRlc2NyaXB0b3JzIGFzIGNsb3NlLW9uLWV4ZWMKKyAqCisgKiBAcGFyYW0gZmQxIHJldHVybiBsb2NhdGlvbiBmb3Igb25lIGVuZAorICogQHBhcmFtIGZkMiByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvdGhlciBlbmQKKyAqIEBwYXJhbSBibG9ja2luZyAjVFJVRSBpZiBwYWlyIHNob3VsZCBiZSBibG9ja2luZworICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKGlmIGVycm9yIGlzIHNldCkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NvY2tldHBhaXIgKERCdXNTb2NrZXQgKmZkMSwKKyAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgKmZkMiwKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NraW5nLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9TT0NLRVRQQUlSCisgIGludCBmZHNbMl07CisgIGludCByZXR2YWw7CisKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lOworCisgIHJldHZhbCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU18U09DS19DTE9FWEVDLCAwLCBmZHMpOworICBjbG9leGVjX2RvbmUgPSByZXR2YWwgPj0gMDsKKworICBpZiAocmV0dmFsIDwgMCAmJiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT1RZUEUpKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmRzKTsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgZnVsbC1kdXBsZXggcGlwZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChmZHNbMF0pOworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1sxXSk7CisgICAgfQorCisgIGlmICghYmxvY2tpbmcgJiYKKyAgICAgICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZHNbMF0sIE5VTEwpIHx8CisgICAgICAgIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmRzWzFdLCBOVUxMKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgZnVsbC1kdXBsZXggcGlwZSBub25ibG9ja2luZyIpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmRzWzBdLCBOVUxMKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZHNbMV0sIE5VTEwpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZkMS0+ZmQgPSBmZHNbMF07CisgIGZkMi0+ZmQgPSBmZHNbMV07CisKKyAgX2RidXNfdmVyYm9zZSAoImZ1bGwtZHVwbGV4IHBpcGUgJWQgPC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICBmZDEtPmZkLCBmZDItPmZkKTsKKworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIF9kYnVzX3dhcm4gKCJfZGJ1c19zb2NrZXRwYWlyKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgT1NcbiIpOworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgIl9kYnVzX3NvY2tldHBhaXIoKSBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBPUyIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBNZWFzdXJlIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3VtZW50cywKKyAqIG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bC4KKyAqCisgKiBAcGFyYW0gZm9ybWF0IGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEByZXR1cm5zIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgYXJncywgb3IgLTEgaWYgbm8gbWVtb3J5CisgKi8KK2ludAorX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgYXJncykKK3sKKyAgY2hhciBzdGF0aWNfYnVmWzEwMjRdOworICBpbnQgYnVmc2l6ZSA9IHNpemVvZiAoc3RhdGljX2J1Zik7CisgIGludCBsZW47CisgIHZhX2xpc3QgYXJnc19jb3B5OworCisgIERCVVNfVkFfQ09QWSAoYXJnc19jb3B5LCBhcmdzKTsKKyAgbGVuID0gdnNucHJpbnRmIChzdGF0aWNfYnVmLCBidWZzaXplLCBmb3JtYXQsIGFyZ3NfY29weSk7CisgIHZhX2VuZCAoYXJnc19jb3B5KTsKKworICAvKiBJZiB2c25wcmludGYoKSByZXR1cm5lZCBub24tbmVnYXRpdmUsIHRoZW4gZWl0aGVyIHRoZSBzdHJpbmcgZml0cyBpbgorICAgKiBzdGF0aWNfYnVmLCBvciB0aGlzIE9TIGhhcyB0aGUgUE9TSVggYW5kIEM5OSBiZWhhdmlvdXIgd2hlcmUgdnNucHJpbnRmCisgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBuZWVkZWQsIG9yIHRoaXMgT1MgcmV0dXJucyB0aGUKKyAgICogdHJ1bmNhdGVkIGxlbmd0aC4KKyAgICoKKyAgICogV2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHNucHJpbnRmIG1pZ2h0IGp1c3QgaWdub3JlIHRoZSBsZW5ndGggYW5kCisgICAqIG92ZXJydW4gdGhlIGJ1ZmZlciAoNjQtYml0IFNvbGFyaXMgNyksIGJlY2F1c2UgdGhhdCdzIHBhdGhvbG9naWNhbC4KKyAgICogSWYgeW91ciBsaWJjIGlzIHJlYWxseSB0aGF0IGJhZCwgY29tZSBiYWNrIHdoZW4geW91IGhhdmUgYSBiZXR0ZXIgb25lLiAqLworICBpZiAobGVuID09IGJ1ZnNpemUpCisgICAgeworICAgICAgLyogVGhpcyBjb3VsZCBiZSB0aGUgdHJ1bmNhdGVkIGxlbmd0aCAoVHJ1NjQgYW5kIElSSVggaGF2ZSB0aGlzIGJ1ZyksCisgICAgICAgKiBvciB0aGUgcmVhbCBsZW5ndGggY291bGQgYmUgY29pbmNpZGVudGFsbHkgdGhlIHNhbWUuIFdoaWNoIGlzIGl0PworICAgICAgICogSWYgdnNucHJpbnRmIHJldHVybnMgdGhlIHRydW5jYXRlZCBsZW5ndGgsIHdlJ2xsIGdvIHRvIHRoZSBzbG93CisgICAgICAgKiBwYXRoLiAqLworICAgICAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworCisgICAgICBpZiAodnNucHJpbnRmIChzdGF0aWNfYnVmLCAxLCBmb3JtYXQsIGFyZ3NfY29weSkgPT0gMSkKKyAgICAgICAgbGVuID0gLTE7CisKKyAgICAgIHZhX2VuZCAoYXJnc19jb3B5KTsKKyAgICB9CisKKyAgLyogSWYgdnNucHJpbnRmKCkgcmV0dXJuZWQgbmVnYXRpdmUsIHdlIGhhdmUgdG8gZG8gbW9yZSB3b3JrLgorICAgKiBIUC1VWCByZXR1cm5zIG5lZ2F0aXZlLiAqLworICB3aGlsZSAobGVuIDwgMCkKKyAgICB7CisgICAgICBjaGFyICpidWY7CisKKyAgICAgIGJ1ZnNpemUgKj0gMjsKKworICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1ZnNpemUpOworCisgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworICAgICAgbGVuID0gdnNucHJpbnRmIChidWYsIGJ1ZnNpemUsIGZvcm1hdCwgYXJnc19jb3B5KTsKKyAgICAgIHZhX2VuZCAoYXJnc19jb3B5KTsKKworICAgICAgZGJ1c19mcmVlIChidWYpOworCisgICAgICAvKiBJZiB0aGUgcmVwb3J0ZWQgbGVuZ3RoIGlzIGV4YWN0bHkgdGhlIGJ1ZmZlciBzaXplLCByb3VuZCB1cCB0byB0aGUKKyAgICAgICAqIG5leHQgc2l6ZSwgaW4gY2FzZSB2c25wcmludGYgaGFzIGJlZW4gcmV0dXJuaW5nIHRoZSB0cnVuY2F0ZWQKKyAgICAgICAqIGxlbmd0aCAqLworICAgICAgaWYgKGxlbiA9PSBidWZzaXplKQorICAgICAgICBsZW4gPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworICogVE1QRElSLCBUTVAsIGFuZCBURU1QIGluIHRoYXQgb3JkZXIuIElmIG5vbmUgb2YgdGhvc2UgYXJlIHNldCAiL3RtcCIgaXMgcmV0dXJuZWQKKyAqCisgKiBAcmV0dXJucyBsb2NhdGlvbiBvZiB0ZW1wIGRpcmVjdG9yeSwgb3IgI05VTEwgaWYgbm8gbWVtb3J5IGZvciBsb2NraW5nCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRfdG1wZGlyKHZvaWQpCit7CisgIC8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLX3N5c2RlcHMgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIqIHRtcGRpciA9IE5VTEw7CisKKyAgaWYgKCFfREJVU19MT0NLIChzeXNkZXBzKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgLyogVE1QRElSIGlzIHdoYXQgZ2xpYmMgdXNlcywgdGhlbgorICAgICAgICogZ2xpYmMgZmFsbHMgYmFjayB0byB0aGUgUF90bXBkaXIgbWFjcm8gd2hpY2gKKyAgICAgICAqIGp1c3QgZXhwYW5kcyB0byAiL3RtcCIKKyAgICAgICAqLworICAgICAgaWYgKHRtcGRpciA9PSBOVUxMKQorICAgICAgICB0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworCisgICAgICAvKiBUaGVzZSB0d28gZW52IHZhcmlhYmxlcyBhcmUgcHJvYmFibHkKKyAgICAgICAqIGJyb2tlbiwgYnV0IG1heWJlIHNvbWUgT1MgdXNlcyB0aGVtPworICAgICAgICovCisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVE1QIik7CisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVEVNUCIpOworCisgICAgICAvKiBBbmQgdGhpcyBpcyB0aGUgc2FuZSBmYWxsYmFjay4gKi8KKyAgICAgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICAgICAgdG1wZGlyID0gIi90bXAiOworICAgIH0KKworICBfREJVU19VTkxPQ0sgKHN5c2RlcHMpOworCisgIF9kYnVzX2Fzc2VydCh0bXBkaXIgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHRtcGRpcjsKK30KKworI2lmIGRlZmluZWQoREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfTEFVTkNIRCkKKy8qKgorICogRXhlY3V0ZSBhIHN1YnByb2Nlc3MsIHJldHVybmluZyB1cCB0byAxMDI0IGJ5dGVzIG9mIG91dHB1dAorICogaW50byBAcCByZXN1bHQuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAjVFJVRSBhbmQgYXBwZW5kcyB0aGUgb3V0cHV0IHRvIEBwCisgKiByZXN1bHQuIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQKKyAqIHNldHMgYW4gZXJyb3IgaW4gQHAgZXJyb3IuCisgKgorICogQG5vdGUgSXQncyBub3QgYW4gZXJyb3IgaWYgdGhlIHN1YnByb2Nlc3MgdGVybWluYXRlcyBub3JtYWxseQorICogd2l0aG91dCB3cml0aW5nIGFueSBkYXRhIHRvIHN0ZG91dC4gVmVyaWZ5IHRoZSBAcCByZXN1bHQgbGVuZ3RoCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCB0byBjb3ZlciB0aGlzIGNhc2UuCisgKgorICogQHBhcmFtIHByb2duYW1lIGluaXRpYWwgcGF0aCB0byBleGVjIChtYXkgb3IgbWF5IG5vdCBiZSBhYnNvbHV0ZSkKKyAqIEBwYXJhbSBwYXRoX2ZhbGxiYWNrIGlmICVUUlVFLCBzZWFyY2ggUEFUSCBmb3IgZXhlY3V0YWJsZQorICogQHBhcmFtIGFyZ3YgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgYXJndW1lbnRzCisgKiBAcGFyYW0gcmVzdWx0IGEgREJ1c1N0cmluZyB3aGVyZSB0aGUgb3V0cHV0IGNhbiBiZSBhcHBlbmQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAoY29uc3QgY2hhciAqcHJvZ3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgcGF0aF9mYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICogY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmVzdWx0X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBpbnQgZXJyb3JzX3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBwaWRfdCBwaWQ7CisgIGludCByZXQ7CisgIGludCBzdGF0dXM7CisgIGludCBvcmlnX2xlbjsKKworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHNpZ3NldF90IG5ld19zZXQsIG9sZF9zZXQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIFdlIG5lZWQgdG8gYmxvY2sgYW55IGV4aXN0aW5nIGhhbmRsZXJzIGZvciBTSUdDSExEIHRlbXBvcmFyaWx5OyB0aGV5CisgICAqIHdpbGwgY2F1c2Ugd2FpdHBpZCgpIGJlbG93IHRvIGZhaWwuCisgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMzQ3CisgICAqLworICBzaWdlbXB0eXNldCAoJm5ld19zZXQpOworICBzaWdhZGRzZXQgKCZuZXdfc2V0LCBTSUdDSExEKTsKKyAgc2lncHJvY21hc2sgKFNJR19CTE9DSywgJm5ld19zZXQsICZvbGRfc2V0KTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXN1bHQpOworCisjZGVmaW5lIFJFQURfRU5EICAgICAgICAwCisjZGVmaW5lIFdSSVRFX0VORCAgICAgICAxCisgIGlmIChwaXBlIChyZXN1bHRfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIHRvIGNhbGwgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBpZiAocGlwZSAoZXJyb3JzX3BpcGUpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUgdG8gY2FsbCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsoKSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBmb3JrKCkgdG8gY2FsbCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIHByb2Nlc3MgKi8KKyAgICAgIGludCBmZDsKKworICAgICAgZmQgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRFdSKTsKKyAgICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgLyogaHVoPyEgY2FuJ3Qgb3BlbiAvZGV2L251bGw/ICovCisgICAgICAgIF9leGl0ICgxKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIi9kZXYvbnVsbCBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKworICAgICAgLyogc2V0LXVwIHN0ZFhYWCAqLworICAgICAgY2xvc2UgKHJlc3VsdF9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoZXJyb3JzX3BpcGVbUkVBRF9FTkRdKTsKKworICAgICAgaWYgKGR1cDIgKGZkLCAwKSA9PSAtMSkgLyogc2V0dXAgc3RkaW4gKi8KKyAgICAgICAgX2V4aXQgKDEpOworICAgICAgaWYgKGR1cDIgKHJlc3VsdF9waXBlW1dSSVRFX0VORF0sIDEpID09IC0xKSAvKiBzZXR1cCBzdGRvdXQgKi8KKyAgICAgICAgX2V4aXQgKDEpOworICAgICAgaWYgKGR1cDIgKGVycm9yc19waXBlW1dSSVRFX0VORF0sIDIpID09IC0xKSAvKiBzZXR1cCBzdGRlcnIgKi8KKyAgICAgICAgX2V4aXQgKDEpOworCisgICAgICBfZGJ1c19jbG9zZV9hbGwgKCk7CisKKyAgICAgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm9sZF9zZXQsIE5VTEwpOworCisgICAgICAvKiBJZiBpdCBsb29rcyBmdWxseS1xdWFsaWZpZWQsIHRyeSBleGVjdiBmaXJzdCAqLworICAgICAgaWYgKHByb2dwYXRoWzBdID09ICcvJykKKyAgICAgICAgeworICAgICAgICAgIGV4ZWN2IChwcm9ncGF0aCwgYXJndik7CisgICAgICAgICAgLyogT2ssIHRoYXQgZmFpbGVkLiAgTm93IGlmIHBhdGhfZmFsbGJhY2sgaXMgZ2l2ZW4sIGxldCdzCisgICAgICAgICAgICogdHJ5IHVucXVhbGlmaWVkLiAgVGhpcyBpcyBtb3N0bHkgYSBoYWNrIHRvIHdvcmsKKyAgICAgICAgICAgKiBhcm91bmQgc3lzdGVtcyB3aGljaCBzaGlwIGRidXMtbGF1bmNoIGluIC91c3IvYmluCisgICAgICAgICAgICogYnV0IGV2ZXJ5dGhpbmcgZWxzZSBpbiAvYmluIChiZWNhdXNlIGRidXMtbGF1bmNoCisgICAgICAgICAgICogZGVwZW5kcyBvbiBYMTEpLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwYXRoX2ZhbGxiYWNrKQorICAgICAgICAgICAgLyogV2UgbXVzdCBoYXZlIGEgc2xhc2gsIGJlY2F1c2Ugd2UgY2hlY2tlZCBhYm92ZSAqLworICAgICAgICAgICAgZXhlY3ZwIChzdHJyY2hyIChwcm9ncGF0aCwgJy8nKSsxLCBhcmd2KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBleGVjdnAgKHByb2dwYXRoLCBhcmd2KTsKKworICAgICAgLyogc3RpbGwgbm90aGluZywgd2UgZmFpbGVkICovCisgICAgICBfZXhpdCAoMSk7CisgICAgfQorCisgIC8qIHBhcmVudCBwcm9jZXNzICovCisgIGNsb3NlIChyZXN1bHRfcGlwZVtXUklURV9FTkRdKTsKKyAgY2xvc2UgKGVycm9yc19waXBlW1dSSVRFX0VORF0pOworICByZXN1bHRfcGlwZVtXUklURV9FTkRdID0gLTE7CisgIGVycm9yc19waXBlW1dSSVRFX0VORF0gPSAtMTsKKworICByZXQgPSAwOworICBkbworICAgIHsKKyAgICAgIHJldCA9IF9kYnVzX3JlYWQgKHJlc3VsdF9waXBlW1JFQURfRU5EXSwgcmVzdWx0LCAxMDI0KTsKKyAgICB9CisgIHdoaWxlIChyZXQgPiAwKTsKKworICAvKiByZWFwIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGF2b2lkIGl0IGxpbmdlcmluZyBhcyB6b21iaWUgKi8KKyAgZG8KKyAgICB7CisgICAgICByZXQgPSB3YWl0cGlkIChwaWQsICZzdGF0dXMsIDApOworICAgIH0KKyAgd2hpbGUgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgLyogV2Ugc3VjY2VlZGVkIGlmIHRoZSBwcm9jZXNzIGV4aXRlZCB3aXRoIHN0YXR1cyAwIGFuZAorICAgICBhbnl0aGluZyB3YXMgcmVhZCAqLworICBpZiAoIVdJRkVYSVRFRCAoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyAoc3RhdHVzKSAhPSAwICkKKyAgICB7CisgICAgICAvKiBUaGUgcHJvY2VzcyBlbmRlZCB3aXRoIGVycm9yICovCisgICAgICBEQnVzU3RyaW5nIGVycm9yX21lc3NhZ2U7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXJyb3JfbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgcmV0ID0gMDsKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICByZXQgPSBfZGJ1c19yZWFkIChlcnJvcnNfcGlwZVtSRUFEX0VORF0sICZlcnJvcl9tZXNzYWdlLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgd2hpbGUgKHJldCA+IDApOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAocmVzdWx0LCBvcmlnX2xlbik7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlcnJvcl9tZXNzYWdlKSA+IDApCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmZXJyb3JfbWVzc2FnZSkpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IHdpdGhvdXQgYW55IGVycm9yIG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm9sZF9zZXQsIE5VTEwpOworCisgIGlmIChyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgaWYgKHJlc3VsdF9waXBlWzBdICE9IC0xKQorICAgIGNsb3NlIChyZXN1bHRfcGlwZVswXSk7CisgIGlmIChyZXN1bHRfcGlwZVsxXSAhPSAtMSkKKyAgICBjbG9zZSAocmVzdWx0X3BpcGVbMV0pOworICBpZiAoZXJyb3JzX3BpcGVbMF0gIT0gLTEpCisgICAgY2xvc2UgKGVycm9yc19waXBlWzBdKTsKKyAgaWYgKGVycm9yc19waXBlWzFdICE9IC0xKQorICAgIGNsb3NlIChlcnJvcnNfcGlwZVsxXSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKioKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSBuZXcgc2Vzc2lvbiBidXMuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAjVFJVRSBhbmQgYXBwZW5kcyB0aGUgYWRkcmVzcyB0byBAcAorICogYWRkcmVzcy4gSWYgYSBmYWlsdXJlIGhhcHBlbnMsIHJldHVybnMgI0ZBTFNFIGFuZAorICogc2V0cyBhbiBlcnJvciBpbiBAcCBlcnJvci4KKyAqCisgKiBAcGFyYW0gc2NvcGUgc2NvcGUgb2YgYXV0b2xhdW5jaCAoV2luZG93cyBvbmx5KQorICogQHBhcmFtIGFkZHJlc3MgYSBEQnVzU3RyaW5nIHdoZXJlIHRoZSBhZGRyZXNzIGNhbiBiZSBzdG9yZWQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MgKGNvbnN0IGNoYXIgKnNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworI2lmZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgIC8qIFBlcmZvcm0gWDExLWJhc2VkIGF1dG9sYXVuY2guIChXZSBhbHNvIHN1cHBvcnQgbGF1bmNoZC1iYXNlZCBhdXRvbGF1bmNoLAorICAgKiBidXQgdGhhdCdzIGRvbmUgZWxzZXdoZXJlLCBhbmQgaWYgaXQgd29ya2VkLCB0aGlzIGZ1bmN0aW9uIHdvdWxkbid0CisgICAqIGJlIGNhbGxlZC4pICovCisgIGNvbnN0IGNoYXIgKmRpc3BsYXk7CisgIGNoYXIgKnByb2dwYXRoOworICBjaGFyICphcmd2WzZdOworICBpbnQgaTsKKyAgREJ1c1N0cmluZyB1dWlkOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKF9kYnVzX2NoZWNrX3NldHVpZCAoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGF1dG9sYXVuY2ggd2hlbiBzZXR1aWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIGZkLm8gIzE5OTk3OiBpZiAkRElTUExBWSBpc24ndCBzZXQgdG8gc29tZXRoaW5nIHVzZWZ1bCwgdGhlbgorICAgKiBkYnVzLWxhdW5jaC14MTEgaXMganVzdCBnb2luZyB0byBmYWlsLiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8KKyAgICogcnVuIGl0LCB3ZSBtaWdodCBhcyB3ZWxsIGJhaWwgb3V0IGVhcmx5IHdpdGggYSBuaWNlIGVycm9yLgorICAgKgorICAgKiBUaGlzIGlzIG5vdCBzdHJpY3RseSB0cnVlIGluIGEgd29ybGQgd2hlcmUgdGhlIHVzZXIgYnVzIGV4aXN0cywKKyAgICogYmVjYXVzZSBkYnVzLWxhdW5jaCAtLWF1dG9sYXVuY2gga25vd3MgaG93IHRvIGNvbm5lY3QgdG8gdGhhdCAtCisgICAqIGJ1dCBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGNvbm5lY3QgdG8gdGhlIHVzZXIgYnVzLCB3ZSdkIGhhdmUgZG9uZQorICAgKiBzbyBiZWZvcmUgdHJ5aW5nIGF1dG9sYXVuY2g6IGluIGFueSBjYXNlLiAqLworICBkaXNwbGF5ID0gX2RidXNfZ2V0ZW52ICgiRElTUExBWSIpOworCisgIGlmIChkaXNwbGF5ID09IE5VTEwgfHwgZGlzcGxheVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICJVbmFibGUgdG8gYXV0b2xhdW5jaCBhIGRidXMtZGFlbW9uIHdpdGhvdXQgYSAkRElTUExBWSBmb3IgWDExIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkICgmdXVpZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX1VTRV9URVNUX0JJTkFSWSIpICE9IE5VTEwpCisgICAgcHJvZ3BhdGggPSBURVNUX0JVU19MQVVOQ0hfQklOQVJZOworICBlbHNlCisjZW5kaWYKKyAgICBwcm9ncGF0aCA9IERCVVNfQklORElSICIvZGJ1cy1sYXVuY2giOworICAvKgorICAgKiBhcmd2WzBdIGlzIGFsd2F5cyBkYnVzLWxhdW5jaCwgdGhhdCdzIHRoZSBuYW1lIHdoYXQgd2UnbGwKKyAgICogZ2V0IGZyb20gL3Byb2MsIG9yIHBzKDEpLCByZWdhcmRsZXNzIHdoYXQgdGhlIHByb2dwYXRoIGlzLAorICAgKiBzZWUgZmQubyM2OTcxNgorICAgKi8KKyAgaSA9IDA7CisgIGFyZ3ZbaV0gPSAiZGJ1cy1sYXVuY2giOworICArK2k7CisgIGFyZ3ZbaV0gPSAiLS1hdXRvbGF1bmNoIjsKKyAgKytpOworICBhcmd2W2ldID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmdXVpZCk7CisgICsraTsKKyAgYXJndltpXSA9ICItLWJpbmFyeS1zeW50YXgiOworICArK2k7CisgIGFyZ3ZbaV0gPSAiLS1jbG9zZS1zdGRlcnIiOworICArK2k7CisgIGFyZ3ZbaV0gPSBOVUxMOworICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpID09IF9EQlVTX05fRUxFTUVOVFMgKGFyZ3YpKTsKKworICByZXR2YWwgPSBfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAocHJvZ3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiwgYWRkcmVzcywgZXJyb3IpOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICByZXR1cm4gcmV0dmFsOworI2Vsc2UKKyAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAiVXNpbmcgWDExIGZvciBkYnVzLWRhZW1vbiBhdXRvbGF1bmNoIHdhcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUsICIKKyAgICAgICJzZXQgeW91ciBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW5zdGVhZCIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBSZWFkcyB0aGUgdXVpZCBvZiB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGZyb20KKyAqIHRoZSBkYnVzIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsbHkgdHJ5IHRvIGNyZWF0ZSBpdAorICogKG9ubHkgcm9vdCBjYW4gZG8gdGhpcyB1c3VhbGx5KS4KKyAqCisgKiBPbiBVTklYLCByZWFkcyBhIGZpbGUgdGhhdCBnZXRzIGNyZWF0ZWQgYnkgZGJ1cy11dWlkZ2VuCisgKiBpbiBhIHBvc3QtaW5zdGFsbCBzY3JpcHQuIE9uIFdpbmRvd3MsIGlmIHRoZXJlJ3MgYSBzdGFuZGFyZAorICogbWFjaGluZSB1dWlkIHdlIGNvdWxkIGp1c3QgdXNlIHRoYXQsIGJ1dCBJIGNhbid0IGZpbmQgb25lCisgKiB3aXRoIHRoZSByaWdodCBwcm9wZXJ0aWVzICh0aGUgaGFyZHdhcmUgcHJvZmlsZSBndWlkIGNhbiBjaGFuZ2UKKyAqIHdpdGhvdXQgcmVib290aW5nIEkgYmVsaWV2ZSkuIElmIHRoZXJlJ3Mgbm8gc3RhbmRhcmQgb25lCisgKiB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcmVnaXN0cnkgaW5zdGVhZCBvZiBhIGZpbGUgZm9yCisgKiB0aGlzLCBhbmQgSSdtIG5vdCBzdXJlIGhvdyB3ZSdkIGVuc3VyZSB0aGUgdXVpZCBnZXRzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIG1hY2hpbmVfaWQgZ3VpZCB0byBpbml0IHdpdGggdGhlIG1hY2hpbmUncyB1dWlkCisgKiBAcGFyYW0gY3JlYXRlX2lmX25vdF9mb3VuZCB0cnkgdG8gY3JlYXRlIHRoZSB1dWlkIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQgKERCdXNHVUlEICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgYjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFKTsKKworICBiID0gX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgRkFMU0UsIGVycm9yKTsKKyAgaWYgKGIpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19lcnJvcl9mcmVlIChlcnJvcik7CisKKyAgLyogRmFsbGJhY2sgdG8gdGhlIHN5c3RlbSBtYWNoaW5lIElEICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsICIvZXRjL21hY2hpbmUtaWQiKTsKKyAgYiA9IF9kYnVzX3JlYWRfdXVpZF9maWxlICgmZmlsZW5hbWUsIG1hY2hpbmVfaWQsIEZBTFNFLCBlcnJvcik7CisKKyAgaWYgKGIpCisgICAgeworICAgICAgLyogdHJ5IHRvIGNvcHkgaXQgdG8gdGhlIERCVVNfTUFDSElORV9VVUlEX0ZJTEUsIGJ1dCBkbyBub3QKKyAgICAgICAqIGNvbXBsYWluIGlmIHRoYXQgaXNuJ3QgcG9zc2libGUgZm9yIHdoYXRldmVyIHJlYXNvbiAqLworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgREJVU19NQUNISU5FX1VVSURfRklMRSk7CisgICAgICBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgTlVMTCk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWNyZWF0ZV9pZl9ub3RfZm91bmQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGlmIG5vbmUgZm91bmQsIHRyeSB0byBtYWtlIGEgbmV3IG9uZSAqLworICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgREJVU19NQUNISU5FX1VVSURfRklMRSk7CisKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV91dWlkIChtYWNoaW5lX2lkLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgZXJyb3IpOworfQorCisvKioKKyAqIHF1cmllcyBsYXVuY2hkIGZvciBhIHNwZWNpZmljIGVudiB2YXIgd2hpY2ggaG9sZHMgdGhlIHNvY2tldCBwYXRoLgorICogQHBhcmFtIHNvY2tldF9wYXRoIGFwcGVuZCB0aGUgc29ja2V0IHBhdGggdG8gdGhpcyBEQnVzU3RyaW5nCisgKiBAcGFyYW0gbGF1bmNoZF9lbnZfdmFyIHRoZSBlbnYgdmFyIHRvIGxvb2sgdXAKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZW52IHZhcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX2xhdW5jaGRfc29ja2V0IChEQnVzU3RyaW5nICpzb2NrZXRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisgIGNoYXIgKmFyZ3ZbNF07CisgIGludCBpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19jaGVja19zZXR1aWQgKCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGxhdW5jaGQgc29ja2V0IHdoZW4gc2V0dWlkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGkgPSAwOworICBhcmd2W2ldID0gImxhdW5jaGN0bCI7CisgICsraTsKKyAgYXJndltpXSA9ICJnZXRlbnYiOworICArK2k7CisgIGFyZ3ZbaV0gPSAoY2hhciopbGF1bmNoZF9lbnZfdmFyOworICArK2k7CisgIGFyZ3ZbaV0gPSBOVUxMOworICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpID09IF9EQlVTX05fRUxFTUVOVFMgKGFyZ3YpKTsKKworICBpZiAoIV9yZWFkX3N1YnByb2Nlc3NfbGluZV9hcmd2KGFyZ3ZbMF0sIFRSVUUsIGFyZ3YsIHNvY2tldF9wYXRoLCBlcnJvcikpCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBubyBlcnJvciwgYnV0IG5vIHJlc3VsdCBlaXRoZXIgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKHNvY2tldF9wYXRoKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogc3RyaXAgdGhlIGNhcnJpYWdlLXJldHVybiAqLworICBfZGJ1c19zdHJpbmdfc2hvcnRlbihzb2NrZXRfcGF0aCwgMSk7CisgIHJldHVybiBUUlVFOworI2Vsc2UgLyogREJVU19FTkFCTEVfTEFVTkNIRCAqLworICBkYnVzX3NldF9lcnJvcihlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICJjYW4ndCBsb29rdXAgc29ja2V0IGZyb20gbGF1bmNoZDsgbGF1bmNoZCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzc19sYXVuY2hkIChEQnVzU3RyaW5nICphZGRyZXNzLCBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgdmFsaWRfc29ja2V0OworICBEQnVzU3RyaW5nIHNvY2tldF9wYXRoOworCisgIGlmIChfZGJ1c19jaGVja19zZXR1aWQgKCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGxhdW5jaGQgc29ja2V0IHdoZW4gc2V0dWlkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzb2NrZXRfcGF0aCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB2YWxpZF9zb2NrZXQgPSBfZGJ1c19sb29rdXBfbGF1bmNoZF9zb2NrZXQgKCZzb2NrZXRfcGF0aCwgIkRCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQiLCBlcnJvcik7CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIXZhbGlkX3NvY2tldCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcihlcnJvciwgIm5vIHNvY2tldCBwYXRoIiwKKyAgICAgICAgICAgICAgICAibGF1bmNoZCBkaWQgbm90IHByb3ZpZGUgYSBzb2NrZXQgcGF0aCwgIgorICAgICAgICAgICAgICAgICJ2ZXJpZnkgdGhhdCBvcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0IGlzIGxvYWRlZCEiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGFkZHJlc3MsICJ1bml4OnBhdGg9IikpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzb2NrZXRfcGF0aCwgMCwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFkZHJlc3MpKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX3VzZXJfYnVzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpydW50aW1lX2RpciA9IF9kYnVzX2dldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKyAgc3RydWN0IHN0YXQgc3RidWY7CisgIERCdXNTdHJpbmcgdXNlcl9idXNfcGF0aDsKKworICBpZiAocnVudGltZV9kaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiWERHX1JVTlRJTUVfRElSIG5vdCBmb3VuZCBpbiBlbnZpcm9ubWVudCIpOworICAgICAgKnN1cHBvcnRlZCA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7ICAgICAgICAvKiBDYW5ub3QgdXNlIGl0LCBidXQgbm90IGFuIGVycm9yICovCisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VyX2J1c19wYXRoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZ1c2VyX2J1c19wYXRoLCAiJXMvYnVzIiwgcnVudGltZV9kaXIpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAobHN0YXQgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnVzZXJfYnVzX3BhdGgpLCAmc3RidWYpID09IC0xKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJYREdfUlVOVElNRV9ESVIvYnVzIG5vdCBhdmFpbGFibGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgKnN1cHBvcnRlZCA9IEZBTFNFOworICAgICAgcmV0ID0gVFJVRTsgICAgICAgLyogQ2Fubm90IHVzZSBpdCwgYnV0IG5vdCBhbiBlcnJvciAqLworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChzdGJ1Zi5zdF91aWQgIT0gZ2V0dWlkICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJYREdfUlVOVElNRV9ESVIvYnVzIG93bmVkIGJ5IHVpZCAlbGQsIG5vdCBvdXIgdWlkICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZykgc3RidWYuc3RfdWlkLCAobG9uZykgZ2V0dWlkICgpKTsKKyAgICAgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIHJldCA9IFRSVUU7ICAgICAgIC8qIENhbm5vdCB1c2UgaXQsIGJ1dCBub3QgYW4gZXJyb3IgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoKHN0YnVmLnN0X21vZGUgJiBTX0lGTVQpICE9IFNfSUZTT0NLKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJYREdfUlVOVElNRV9ESVIvYnVzIGlzIG5vdCBhIHNvY2tldDogc3RfbW9kZSA9IDBvJWxvIiwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nKSBzdGJ1Zi5zdF9tb2RlKTsKKyAgICAgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIHJldCA9IFRSVUU7ICAgICAgIC8qIENhbm5vdCB1c2UgaXQsIGJ1dCBub3QgYW4gZXJyb3IgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGFkZHJlc3MsICJ1bml4OnBhdGg9IikgfHwKKyAgICAgICFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChhZGRyZXNzLCAmdXNlcl9idXNfcGF0aCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICpzdXBwb3J0ZWQgPSBUUlVFOworICByZXQgPSBUUlVFOworCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcl9idXNfcGF0aCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2Vzc2lvbiBidXMgYnkgcXVlcnlpbmcgYQorICogcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kLgorICoKKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCBiZSBhIGJvb2xlYW4gc3BlY2lmeWluZyB3aGV0aGVyCisgKiBvciBub3QgYSBkeW5hbWljIHNlc3Npb24gbG9va3VwIGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgorICoKKyAqIElmIHN1cHBvcnRlZCBpcyBUUlVFIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzICNUUlVFLCB0aGUKKyAqIGFkZHJlc3Mgd2lsbCBiZSAgYXBwZW5kZWQgdG8gQHAgYWRkcmVzcy4KKyAqIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQgc2V0cyBhbiBlcnJvciBpbgorICogQHAgZXJyb3IuCisgKgorICogSWYgc3VwcG9ydGVkIGlzIEZBTFNFLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gc3VwcG9ydGVkIHJldHVybnMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQKKyAqIEBwYXJhbSBhZGRyZXNzIGEgREJ1c1N0cmluZyB3aGVyZSB0aGUgYWRkcmVzcyBjYW4gYmUgc3RvcmVkCisgKiBAcGFyYW0gZXJyb3IgYSBEQnVzRXJyb3IgdG8gc3RvcmUgdGhlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIGFuIGVycm9yIGhhcHBlbmVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICAqc3VwcG9ydGVkID0gVFJVRTsKKyAgcmV0dXJuIF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3NfbGF1bmNoZCAoYWRkcmVzcywgZXJyb3IpOworI2Vsc2UKKyAgKnN1cHBvcnRlZCA9IEZBTFNFOworCisgIGlmICghX2RidXNfbG9va3VwX3VzZXJfYnVzIChzdXBwb3J0ZWQsIGFkZHJlc3MsIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKCpzdXBwb3J0ZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogT24gbm9uLU1hYyBVbml4IHBsYXRmb3JtcywgaWYgdGhlIHNlc3Npb24gYWRkcmVzcyBpc24ndCBhbHJlYWR5CisgICAqIHNldCBpbiBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZQorICAgKiAkWERHX1JVTlRJTUVfRElSL2J1cyBjYW4ndCBiZSB1c2VkLCB3ZSBwdW50IGFuZCBmYWxsIGJhY2sgdG8gdGhlCisgICAqIGF1dG9sYXVuY2g6IGdsb2JhbCBkZWZhdWx0OyBzZWUgaW5pdF9zZXNzaW9uX2FkZHJlc3MgaW4KKyAgICogZGJ1cy9kYnVzLWJ1cy5jLiAqLworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBidXMgZGFlbW9uIGlzIHNpZ25hbGVkIHRvIHJlbG9hZCBpdHMgY29uZmlndXJhdGlvbjsgYW55CisgKiBjYWNoZXMgc2hvdWxkIGJlIG51a2VkLiBPZiBjb3Vyc2UgYW55IGNhY2hlcyB0aGF0IG5lZWQgZXhwbGljaXQgcmVsb2FkCisgKiBhcmUgcHJvYmFibHkgYnJva2VuLCBidXQgYydlc3QgbGEgdmllLgorICoKKyAqCisgKi8KK3ZvaWQKK19kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaF9zeXN0ZW0gKCk7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGEga2V5cmluZyBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWxzCisgKiBzaG91bGQgYmUgc3RvcmVkLiAgVGhlIGNyZWRlbnRpYWxzIHNob3VsZCBoYXZlIGVpdGhlciBhIFdpbmRvd3Mgb3IKKyAqIFVOSVggdXNlciBpbiB0aGVtLiAgVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgcGF0aC4KKyAqCisgKiBPbiBVTklYIHRoZSBkaXJlY3RvcnkgaXMgfi8uZGJ1cy1rZXlyaW5ncyB3aGlsZSBvbiBXaW5kb3dzIGl0IHNob3VsZCBwcm9iYWJseQorICogYmUgc29tZXRoaW5nIGVsc2UsIHNpbmNlIHRoZSBkb3RmaWxlIGNvbnZlbnRpb24gaXMgbm90IG5vcm1hbCBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBkaXJlY3Rvcnkgc3RyaW5nIHRvIGFwcGVuZCBkaXJlY3RvcnkgdG8KKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBmb3IKKyAqCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzIChEQnVzU3RyaW5nICAgICAgKmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIERCdXNTdHJpbmcgaG9tZWRpcjsKKyAgREJ1c1N0cmluZyBkb3RkaXI7CisgIGRidXNfdWlkX3QgdWlkOworCisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRlbnRpYWxzKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmhvbWVkaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICB1aWQgPSBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGNyZWRlbnRpYWxzKTsKKyAgX2RidXNfYXNzZXJ0ICh1aWQgIT0gREJVU19VSURfVU5TRVQpOworCisgIGlmICghX2RidXNfaG9tZWRpcl9mcm9tX3VpZCAodWlkLCAmaG9tZWRpcikpCisgICAgZ290byBmYWlsZWQ7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICB7CisgICAgY29uc3QgY2hhciAqb3ZlcnJpZGU7CisKKyAgICBvdmVycmlkZSA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9IT01FRElSIik7CisgICAgaWYgKG92ZXJyaWRlICE9IE5VTEwgJiYgKm92ZXJyaWRlICE9ICdcMCcpCisgICAgICB7CisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaG9tZWRpciwgMCk7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmhvbWVkaXIsIG92ZXJyaWRlKSkKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNpbmcgZmFrZSBob21lZGlyIGZvciB0ZXN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmaG9tZWRpcikpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90IHN0cmljdGx5IHRocmVhZC1zYWZlLCBidXQgaWYgd2UgZmFpbCBhdCB0aHJlYWQtc2FmZXR5IGhlcmUsCisgICAgICAgICAqIHRoZSB3b3JzdCB0aGF0IHdpbGwgaGFwcGVuIGlzIHNvbWUgZXh0cmEgd2FybmluZ3MuICovCisgICAgICAgIHN0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3dhcm5lZCA9IEZBTFNFOworICAgICAgICBpZiAoIWFscmVhZHlfd2FybmVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVc2luZyB5b3VyIHJlYWwgaG9tZSBkaXJlY3RvcnkgZm9yIHRlc3RpbmcsIHNldCBEQlVTX1RFU1RfSE9NRURJUiB0byBhdm9pZFxuIik7CisgICAgICAgICAgICBhbHJlYWR5X3dhcm5lZCA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgIi5kYnVzLWtleXJpbmdzIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmhvbWVkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvdGRpcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvL1BFTkRJTkcoa2RhYikgZG9jcworZGJ1c19ib29sX3QKK19kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzY29wZSkKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8vUEVORElORyhrZGFiKSBkb2NzCit2b2lkCitfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpCit7CisKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUFHQUlOIG9yIEVXT1VMREJMT0NLICh0aGlzIGhhcyB0byBiZSBkb25lIGRpZmZlcmVudGx5CisgKiBmb3IgV2luc29jayBzbyBpcyBhYnN0cmFjdGVkKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIGUgPT0gRUFHQUlOIG9yIGUgPT0gRVdPVUxEQkxPQ0sKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKGludCBlKQoreworICByZXR1cm4gZSA9PSBFQUdBSU4gfHwgZSA9PSBFV09VTERCTE9DSzsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChybWRpciAoZmlsZW5hbWVfYykgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqICBDaGVja3Mgd2hldGhlciBmaWxlIGRlc2NyaXB0b3JzIG1heSBiZSBwYXNzZWQgdmlhIHRoZSBzb2NrZXQKKyAqCisgKiAgQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqICBAcmV0dXJuIFRSVUUgd2hlbiBmZCBwYXNzaW5nIG92ZXIgdGhpcyBzb2NrZXQgaXMgc3VwcG9ydGVkCisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQgKERCdXNTb2NrZXQgZmQpCit7CisjaWZkZWYgU0NNX1JJR0hUUworICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHVuOworICB9IHNhX2J1ZjsKKworICBzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhX2J1Zik7CisKKyAgX0RCVVNfWkVSTyhzYV9idWYpOworCisgIGlmIChnZXRzb2NrbmFtZShmZC5mZCwgJnNhX2J1Zi5zYSwgJnNhX2xlbikgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gc2FfYnVmLnNhLnNhX2ZhbWlseSA9PSBBRl9VTklYOworCisjZWxzZQorICByZXR1cm4gRkFMU0U7CisKKyNlbmRpZgorfQorCisvKioKKyAqIENsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0IHRocmVlIChpLmUuIHN0ZGluLAorICogc3Rkb3V0LCBzdGRlcnIpLgorICovCit2b2lkCitfZGJ1c19jbG9zZV9hbGwgKHZvaWQpCit7CisgIGludCBtYXhmZHMsIGk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworCisgIC8qIE9uIExpbnV4IHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGEgYml0IGlmIC9wcm9jIGlzIGF2YWlsYWJsZS4gSWYgaXQKKyAgICAgaXNuJ3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gdGhlIGJydXRlIGZvcmNlIHdheS4gKi8KKworICBkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKTsKKyAgaWYgKGQpCisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBkaXJlbnQgYnVmLCAqZGU7CisgICAgICAgICAgaW50IGssIGZkOworICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICBjaGFyICplID0gTlVMTDsKKworICAgICAgICAgIGsgPSByZWFkZGlyX3IgKGQsICZidWYsICZkZSk7CisgICAgICAgICAgaWYgKGsgIT0gMCB8fCAhZGUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgIGwgPSBzdHJ0b2wgKGRlLT5kX25hbWUsICZlLCAxMCk7CisgICAgICAgICAgaWYgKGVycm5vICE9IDAgfHwgZSA9PSBOVUxMIHx8ICplICE9ICdcMCcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGZkID0gKGludCkgbDsKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICB9CisKKyAgICAgIGNsb3NlZGlyIChkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBtYXhmZHMgPSBzeXNjb25mIChfU0NfT1BFTl9NQVgpOworCisgIC8qIFBpY2sgc29tZXRoaW5nIHJlYXNvbmFibGUgaWYgZm9yIHNvbWUgcmVhc29uIHN5c2NvbmYgc2F5cworICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBpZiAobWF4ZmRzIDwgMCkKKyAgICBtYXhmZHMgPSAxMDI0OworCisgIC8qIGNsb3NlIGFsbCBpbmhlcml0ZWQgZmRzICovCisgIGZvciAoaSA9IDM7IGkgPCBtYXhmZHM7IGkrKykKKyAgICBjbG9zZSAoaSk7Cit9CisKKy8qKgorICogKipOT1RFKio6IElmIHlvdSBtb2RpZnkgdGhpcyBmdW5jdGlvbiwgcGxlYXNlIGFsc28gY29uc2lkZXIgbWFraW5nCisgKiB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gR0xpYi4gIFNlZQorICogZ2xpYi9ndXRpbHMuYzpnX2NoZWNrX3NldHVpZCgpLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIHdhcyBleGVjdXRlZCBhcyBzZXR1aWQgKG9yIGFuCisgKiBlcXVpdmFsZW50IF9fbGliY19lbmFibGVfc2VjdXJlIGlzIGF2YWlsYWJsZSkuICBTZWU6CisgKiBodHRwOi8vb3NkaXIuY29tL21sL2xpbnV4Lmxmcy5oYXJkZW5lZC8yMDA3LTA0L21zZzAwMDMyLmh0bWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX3NldHVpZCAodm9pZCkKK3sKKyAgLyogVE9ETzogZ2V0IF9fbGliY19lbmFibGVfc2VjdXJlIGV4cG9ydGVkIGZyb20gZ2xpYmMuCisgICAqIFNlZSBodHRwOi8vd3d3Lm9wZW53YWxsLmNvbS9saXN0cy9vd2wtZGV2LzIwMTIvMDgvMTQvMQorICAgKi8KKyNpZiAwICYmIGRlZmluZWQoSEFWRV9MSUJDX0VOQUJMRV9TRUNVUkUpCisgIHsKKyAgICAvKiBTZWUgZ2xpYmMvaW5jbHVkZS91bmlzdGQuaCAqLworICAgIGV4dGVybiBpbnQgX19saWJjX2VuYWJsZV9zZWN1cmU7CisgICAgcmV0dXJuIF9fbGliY19lbmFibGVfc2VjdXJlOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfSVNTRVRVR0lEKQorICAvKiBCU0Q6IGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL21hbi5jZ2k/cXVlcnk9aXNzZXR1Z2lkJnNla3Rpb249MiAqLworICByZXR1cm4gaXNzZXR1Z2lkICgpOworI2Vsc2UKKyAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCB1c2VyIElEJ3MgKi8KKyAgZ2lkX3QgcmdpZCwgZWdpZCwgc2dpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCBncm91cCBJRCdzICovCisKKyAgLyogV2UgY2FsbCBpbnRvIHRoaXMgZnVuY3Rpb24gZnJvbSBfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMoKQorICAgKiB0byBtYWtlIHN1cmUgdGhlc2UgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFydCB0aHJlYWRpbmcuICovCisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBjaGVja19zZXR1aWRfaW5pdGlhbGlzZWQ7CisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBpc19zZXR1aWQ7CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZICghY2hlY2tfc2V0dWlkX2luaXRpYWxpc2VkKSkKKyAgICB7CisjaWZkZWYgSEFWRV9HRVRSRVNVSUQKKyAgICAgIGlmIChnZXRyZXN1aWQgKCZydWlkLCAmZXVpZCwgJnN1aWQpICE9IDAgfHwKKyAgICAgICAgICBnZXRyZXNnaWQgKCZyZ2lkLCAmZWdpZCwgJnNnaWQpICE9IDApCisjZW5kaWYgLyogSEFWRV9HRVRSRVNVSUQgKi8KKyAgICAgICAgeworICAgICAgICAgIHN1aWQgPSBydWlkID0gZ2V0dWlkICgpOworICAgICAgICAgIHNnaWQgPSByZ2lkID0gZ2V0Z2lkICgpOworICAgICAgICAgIGV1aWQgPSBnZXRldWlkICgpOworICAgICAgICAgIGVnaWQgPSBnZXRlZ2lkICgpOworICAgICAgICB9CisKKyAgICAgIGNoZWNrX3NldHVpZF9pbml0aWFsaXNlZCA9IFRSVUU7CisgICAgICBpc19zZXR1aWQgPSAocnVpZCAhPSBldWlkIHx8IHJ1aWQgIT0gc3VpZCB8fAorICAgICAgICAgICAgICAgICAgIHJnaWQgIT0gZWdpZCB8fCByZ2lkICE9IHNnaWQpOworCisgICAgfQorICByZXR1cm4gaXNfc2V0dWlkOworI2VuZGlmCit9CisKKy8qKgorICogUmVhZCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBzb2NrZXQgYW5kIGFwcGVuZCBpdCB0byB0aGUgc3RyaW5nCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBhZGRyZXNzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfYWRkcmVzc19mcm9tX3NvY2tldCAoREJ1c1NvY2tldCAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgdW5pb24geworICAgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl91biB1bjsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpcHY0OworICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBpcHY2OworICB9IHNvY2tldDsKKyAgY2hhciBob3N0aXBbSU5FVDZfQUREUlNUUkxFTl07CisgIGludCBzaXplID0gc2l6ZW9mIChzb2NrZXQpOworICBEQnVzU3RyaW5nIHBhdGhfc3RyOworCisgIGlmIChnZXRzb2NrbmFtZSAoZmQuZmQsICZzb2NrZXQuc2EsICZzaXplKSkKKyAgICBnb3RvIGVycjsKKworICBzd2l0Y2ggKHNvY2tldC5zYS5zYV9mYW1pbHkpCisgICAgeworICAgIGNhc2UgQUZfVU5JWDoKKyAgICAgIGlmIChzb2NrZXQudW4uc3VuX3BhdGhbMF09PSdcMCcpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnBhdGhfc3RyLCAmKHNvY2tldC51bi5zdW5fcGF0aFsxXSkpOworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kIChhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSAmJgorICAgICAgICAgICAgICBfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChhZGRyZXNzLCAmcGF0aF9zdHIpKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIHNvY2tldC51bi5zdW5fcGF0aCk7CisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmQgKGFkZHJlc3MsICJ1bml4OnBhdGg9IikgJiYKKyAgICAgICAgICAgICAgX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoYWRkcmVzcywgJnBhdGhfc3RyKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICBpZiAoaW5ldF9udG9wIChBRl9JTkVULCAmc29ja2V0LmlwdjQuc2luX2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChhZGRyZXNzLCAidGNwOmZhbWlseT1pcHY0LGhvc3Q9JXMscG9ydD0ldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdGlwLCBudG9ocyAoc29ja2V0LmlwdjQuc2luX3BvcnQpKSkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworI2lmZGVmIEFGX0lORVQ2CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIGhvc3RpcCk7CisgICAgICBpZiAoaW5ldF9udG9wIChBRl9JTkVUNiwgJnNvY2tldC5pcHY2LnNpbjZfYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKGFkZHJlc3MsICJ0Y3A6ZmFtaWx5PWlwdjYscG9ydD0ldSxob3N0PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMgKHNvY2tldC5pcHY2LnNpbjZfcG9ydCkpICYmCisgICAgICAgICAgICBfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChhZGRyZXNzLCAmcGF0aF9zdHIpKQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKEVJTlZBTCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGFkZHJlc3MgZnJvbSBzb2NrZXQ6IFVua25vd24gc29ja2V0IHR5cGUuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorIGVycjoKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CitfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vOworfQorCit2b2lkCitfZGJ1c19yZXN0b3JlX3NvY2tldF9lcnJubyAoaW50IHNhdmVkX2Vycm5vKQoreworICBlcnJubyA9IHNhdmVkX2Vycm5vOworfQorCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy11bml4LmggYi9kYnVzL2RidXMtc3lzZGVwcy11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5Y2FlMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguaApAQCAtMCwwICsxLDE3MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdW5peC5oIFVOSVgtc3BlY2lmaWMgd3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NZU0RFUFNfVU5JWF9ICisjZGVmaW5lIERCVVNfU1lTREVQU19VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2Vycm9yICJEb24ndCBpbmNsdWRlIHRoaXMgb24gV2luZG93cyIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTeXNkZXBzVW5peCBVTklYLXNwZWNpZmljIGludGVybmFsIEFQSQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFsIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGF2YWlsYWJsZSBvbiBVTklYIG9ubHkKKyAqIEB7CisgKi8KKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCBfZGJ1c19kdXAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludAorX2RidXNfcmVhZCAgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCk7CitpbnQKK19kYnVzX3dyaXRlICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitpbnQKK19kYnVzX3dyaXRlX3R3byAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKTsKKworaW50IF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworaW50IF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCAgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitpbnQgX2RidXNfY29ubmVjdF9leGVjIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICAgIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK2ludCBfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzIChEQnVzU29ja2V0ICAqKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2NyZWRlbnRpYWxzIChpbnQgICAgICAgICAgICAgICBjbGllbnRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfY3JlZGVudGlhbHMgKGludCAgICAgICAgICAgICAgc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoREJ1c1N0cmluZyAqc29ja2V0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfdXNlcl9idXMgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworCisvKiogSW5mb3JtYXRpb24gYWJvdXQgYSBVTklYIHVzZXIgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNVc2VySW5mbyAgREJ1c1VzZXJJbmZvOworLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCBncm91cCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0dyb3VwSW5mbyBEQnVzR3JvdXBJbmZvOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCB1c2VyCisgKi8KK3N0cnVjdCBEQnVzVXNlckluZm8KK3sKKyAgZGJ1c191aWRfdCAgdWlkOyAgICAgICAgICAgIC8qKjwgVUlEICovCisgIGRidXNfZ2lkX3QgIHByaW1hcnlfZ2lkOyAgICAvKio8IEdJRCAqLworICBkYnVzX2dpZF90ICpncm91cF9pZHM7ICAgICAgLyoqPCBHcm91cHMgSURzLCAqaW5jbHVkaW5nKiBhYm92ZSBwcmltYXJ5IGdyb3VwICovCisgIGludCAgICAgICAgIG5fZ3JvdXBfaWRzOyAgICAvKio8IFNpemUgb2YgZ3JvdXAgSURzIGFycmF5ICovCisgIGNoYXIgICAgICAgKnVzZXJuYW1lOyAgICAgICAvKio8IFVzZXJuYW1lICovCisgIGNoYXIgICAgICAgKmhvbWVkaXI7ICAgICAgICAvKio8IEhvbWUgZGlyZWN0b3J5ICovCit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCBncm91cAorICovCitzdHJ1Y3QgREJ1c0dyb3VwSW5mbworeworICBkYnVzX2dpZF90ICBnaWQ7ICAgICAgICAgICAgLyoqPCBHSUQgKi8KKyAgY2hhciAgICAgICAqZ3JvdXBuYW1lOyAgICAgIC8qKjwgR3JvdXAgbmFtZSAqLworfTsKKworZGJ1c19ib29sX3QgX2RidXNfdXNlcl9pbmZvX2ZpbGwgICAgIChEQnVzVXNlckluZm8gICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfdXNlcl9pbmZvX2ZpbGxfdWlkIChEQnVzVXNlckluZm8gICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlICAgICAoREJ1c1VzZXJJbmZvICAgICAqaW5mbyk7CisKK2RidXNfYm9vbF90IF9kYnVzX2dyb3VwX2luZm9fZmlsbCAgICAgKERCdXNHcm91cEluZm8gICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19ncm91cF9pbmZvX2ZpbGxfZ2lkIChEQnVzR3JvdXBJbmZvICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlICAgICAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbyk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfdWlkX3QgICAgX2RidXNfZ2V0ZXVpZCAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3BhcnNlX3VpZCAoY29uc3QgREJ1c1N0cmluZyAgKnVpZF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2Nsb3NlX2FsbCAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX2FwcGVuZF9hZGRyZXNzX2Zyb21fc29ja2V0IChEQnVzU29ja2V0ICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50IGZkKTsKKwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfRk9SQ0VfU1RESU5fTlVMTCA9ICgxIDw8IDApLAorICBEQlVTX0ZPUkNFX1NURE9VVF9OVUxMID0gKDEgPDwgMSksCisgIERCVVNfRk9SQ0VfU1RERVJSX05VTEwgPSAoMSA8PCAyKQorfSBEQnVzRW5zdXJlU3RhbmRhcmRGZHNGbGFnczsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZW5zdXJlX3N0YW5kYXJkX2ZkcyAoREJ1c0Vuc3VyZVN0YW5kYXJkRmRzRmxhZ3MgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqZXJyb3Jfc3RyX3ApOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MjRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCkBAIC0wLDAgKzEsMTQ1MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgV291bGQgYmUgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjaWZkZWYgSEFWRV9TWVNMT0dfSAorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19TWVNMSU1JVFNfSAorI2luY2x1ZGUgPHN5cy9zeXNsaW1pdHMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNURU1ECisjaW5jbHVkZSA8c3lzdGVtZC9zZC1kYWVtb24uaD4KKyNlbmRpZgorCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNJbnRlcm5hbHNVdGlscworICogQHsKKyAqLworCisKKy8qKgorICogRG9lcyB0aGUgY2hkaXIsIGZvcmssIHNldHNpZCwgZXRjLiB0byBiZWNvbWUgYSBkYWVtb24gcHJvY2Vzcy4KKyAqCisgKiBAcGFyYW0gcGlkZmlsZSAjTlVMTCwgb3IgcGlkZmlsZSB0byBjcmVhdGUKKyAqIEBwYXJhbSBwcmludF9waWRfcGlwZSBwaXBlIHRvIHByaW50IGRhZW1vbidzIHBpZCB0bywgb3IgLTEgZm9yIG5vbmUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHBhcmFtIGtlZXBfdW1hc2sgI1RSVUUgdG8ga2VlcCB0aGUgb3JpZ2luYWwgdW1hc2sKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iZWNvbWVfZGFlbW9uIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGtlZXBfdW1hc2spCit7CisgIGNvbnN0IGNoYXIgKnM7CisgIHBpZF90IGNoaWxkX3BpZDsKKyAgaW50IGRldl9udWxsX2ZkOworCisgIF9kYnVzX3ZlcmJvc2UgKCJCZWNvbWluZyBhIGRhZW1vbi4uLlxuIik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZGlyIHRvIC9cbiIpOworICBpZiAoY2hkaXIgKCIvIikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGRpcigpIHRvIHJvb3QgZGlyZWN0b3J5Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmb3JraW5nLi4uXG4iKTsKKyAgc3dpdGNoICgoY2hpbGRfcGlkID0gZm9yayAoKSkpCisgICAgeworICAgIGNhc2UgLTE6CisgICAgICBfZGJ1c192ZXJib3NlICgiZm9yayBmYWlsZWRcbiIpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JrIGRhZW1vbjogJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAwOgorICAgICAgX2RidXNfdmVyYm9zZSAoImluIGNoaWxkLCBjbG9zaW5nIHN0ZCBmaWxlIGRlc2NyaXB0b3JzXG4iKTsKKworICAgICAgLyogc2lsZW50bHkgaWdub3JlIGZhaWx1cmVzIGhlcmUsIGlmIHNvbWVvbmUKKyAgICAgICAqIGRvZXNuJ3QgaGF2ZSAvZGV2L251bGwgd2UgbWF5IGFzIHdlbGwgdHJ5CisgICAgICAgKiB0byBjb250aW51ZSBhbnlob3cKKyAgICAgICAqLworICAgICAgCisgICAgICBkZXZfbnVsbF9mZCA9IG9wZW4gKCIvZGV2L251bGwiLCBPX1JEV1IpOworICAgICAgaWYgKGRldl9udWxsX2ZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMCk7CisgICAgICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDEpOworICAgICAgICAgIAorICAgICAgICAgIHMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX0RFQlVHX09VVFBVVCIpOworICAgICAgICAgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAyKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgia2VlcGluZyBzdGRlcnIgb3BlbiBkdWUgdG8gREJVU19ERUJVR19PVVRQVVRcbiIpOworICAgICAgICAgIGNsb3NlIChkZXZfbnVsbF9mZCk7CisgICAgICAgIH0KKworICAgICAgaWYgKCFrZWVwX3VtYXNrKQorICAgICAgICB7CisgICAgICAgICAgLyogR2V0IGEgcHJlZGljdGFibGUgdW1hc2sgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2V0dGluZyB1bWFza1xuIik7CisgICAgICAgICAgdW1hc2sgKDAyMik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoImNhbGxpbmcgc2V0c2lkKClcbiIpOworICAgICAgaWYgKHNldHNpZCAoKSA9PSAtMSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0c2lkKCkgZmFpbGVkIik7CisgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKHBpZGZpbGUsIHByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfcGlkLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGlkIGZpbGUgb3IgcGlwZSB3cml0ZSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBraWxsIChjaGlsZF9waWQsIFNJR1RFUk0pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgicGFyZW50IGV4aXRpbmdcbiIpOworICAgICAgX2V4aXQgKDApOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBDcmVhdGVzIGEgZmlsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBwaWQgb3VyIHByb2Nlc3MgSUQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcGlkLAorCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqY2ZpbGVuYW1lOworICBpbnQgZmQ7CisgIEZJTEUgKmY7CisKKyAgY2ZpbGVuYW1lID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICBmZCA9IG9wZW4gKGNmaWxlbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0x8T19CSU5BUlksIDA2NDQpOworICAKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKChmID0gZmRvcGVuIChmZCwgInciKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZkb3BlbiBmZCAlZDogJXMiLCBmZCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChmcHJpbnRmIChmLCAiJWx1XG4iLCBwaWQpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIHRvIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIGZjbG9zZSAoZik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmY2xvc2UgKGYpID09IEVPRikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsb3NlIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBnaXZlbiBwaWRfdG9fd3JpdGUgdG8gYSBwaWRmaWxlIChpZiBub24tTlVMTCkgYW5kL29yIHRvIGEKKyAqIHBpcGUgKGlmIG5vbi1OVUxMKS4gRG9lcyBub3RoaW5nIGlmIHBpZGZpbGUgYW5kIHByaW50X3BpZF9waXBlIGFyZSBib3RoCisgKiBOVUxMLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlIHRoZSBmaWxlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgdGhlIHBpcGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwaWRfdG9fd3JpdGUgdGhlIHBpZCB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHBpZGZpbGUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgcGlkIGZpbGUgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAocGlkZmlsZSkpOworICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfZmlsZSAocGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSB3cml0ZSBmYWlsZWRcbiIpOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgZmlsZSByZXF1ZXN0ZWRcbiIpOworICAgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgIT0gTlVMTCAmJiBfZGJ1c19waXBlX2lzX3ZhbGlkIChwcmludF9waWRfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwaWQ7CisgICAgICBpbnQgYnl0ZXM7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIG91ciBwaWQgdG8gcGlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByaW50X3BpZF9waXBlLT5mZCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmcGlkLCBwaWRfdG9fd3JpdGUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWQsICJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwkgIAorICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZCk7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfcGlkX3BpcGUsICZwaWQsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBfZGJ1c19waXBlX3dyaXRlIHNldHMgZXJyb3Igb25seSBvbiBmYWlsdXJlLCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIG1lc3NhZ2UgYnVzIFBJRDogZGlkIG5vdCB3cml0ZSBlbm91Z2ggYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwkgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgcGlwZSB0byB3cml0ZSB0b1xuIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGFmdGVyIHRoZSBmb3JrIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvIHRoaXMgdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlIGRhZW1vbiBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyKQoreworICBEQnVzU3RyaW5nIHU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCB1c2VyKTsKKworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKCZ1LCBOVUxMLCBOVUxMKTsKK30KKworCisvKiBUaGUgSEFWRV9MSUJBVURJVCBjYXNlIGxpdmVzIGluIHNlbGludXguYyAqLworI2lmbmRlZiBIQVZFX0xJQkFVRElUCisvKioKKyAqIENoYW5nZXMgdGhlIHVzZXIgYW5kIGdyb3VwIHRoZSBidXMgaXMgcnVubmluZyBhcy4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlciB0byBiZWNvbWUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlciAgKGNvbnN0IGNoYXIgICAgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfZ2lkX3QgZ2lkOworICBEQnVzU3RyaW5nIHU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCB1c2VyKTsKKworICBpZiAoIV9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwICgmdSwgJnVpZCwgJmdpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVXNlciAnJXMnIGRvZXMgbm90IGFwcGVhciB0byBleGlzdD8iLAorICAgICAgICAgICAgICAgICAgICAgIHVzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzZXRncm91cHMoKSBvbmx5IHdvcmtzIGlmIHdlIGFyZSBhIHByaXZpbGVnZWQgcHJvY2VzcywKKyAgICogc28gd2UgZG9uJ3QgcmV0dXJuIGVycm9yIG9uIGZhaWx1cmU7IHRoZSBvbmx5IHBvc3NpYmxlCisgICAqIGZhaWx1cmUgaXMgdGhhdCB3ZSBkb24ndCBoYXZlIHBlcm1zIHRvIGRvIGl0LgorICAgKgorICAgKiBub3Qgc3VyZSB0aGlzIGlzIHJpZ2h0LCBtYXliZSBpZiBzZXR1aWQoKQorICAgKiBpcyBnb2luZyB0byB3b3JrIHRoZW4gc2V0Z3JvdXBzKCkgc2hvdWxkIGFsc28gd29yay4KKyAgICovCisgIGlmIChzZXRncm91cHMgKDAsIE5VTEwpIDwgMCkKKyAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGRyb3Agc3VwcGxlbWVudGFyeSBncm91cHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgIC8qIFNldCBHSUQgZmlyc3QsIG9yIHRoZSBzZXR1aWQgbWF5IHJlbW92ZSBvdXIgcGVybWlzc2lvbgorICAgKiB0byBjaGFuZ2UgdGhlIEdJRAorICAgKi8KKyAgaWYgKHNldGdpZCAoZ2lkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgR0lEIHRvICVsdTogJXMiLCBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzZXR1aWQgKHVpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFVJRCB0byAlbHU6ICVzIiwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiAhSEFWRV9MSUJBVURJVCAqLworCisjaWZkZWYgSEFWRV9TRVRSTElNSVQKKworLyogV2UgYXNzdW1lIHRoYXQgaWYgd2UgaGF2ZSBzZXRybGltaXQsIHdlIGFsc28gaGF2ZSBnZXRybGltaXQgYW5kCisgKiBzdHJ1Y3QgcmxpbWl0LgorICovCisKK3N0cnVjdCBEQnVzUkxpbWl0IHsKKyAgICBzdHJ1Y3QgcmxpbWl0IGxpbTsKK307CisKK0RCdXNSTGltaXQgKgorX2RidXNfcmxpbWl0X3NhdmVfZmRfbGltaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSTGltaXQgKnNlbGY7CisKKyAgc2VsZiA9IGRidXNfbmV3MCAoREJ1c1JMaW1pdCwgMSk7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnNlbGYtPmxpbSkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGZkIGxpbWl0OiAlcyIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZGJ1c19mcmVlIChzZWxmKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yYWlzZV9mZF9saW1pdF9pZl9wcml2aWxlZ2VkICh1bnNpZ25lZCBpbnQgIGRlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICplcnJvcikKK3sKKyAgc3RydWN0IHJsaW1pdCBsaW07CisKKyAgLyogTm8gcG9pbnQgdG8gZG9pbmcgdGhpcyBwcmFjdGljYWxseSBzcGVha2luZworICAgKiBpZiB3ZSdyZSBub3QgdWlkIDAuICBXZSBleHBlY3QgdGhlIHN5c3RlbQorICAgKiBidXMgdG8gdXNlIHRoaXMgYmVmb3JlIHdlIGNoYW5nZSBVSUQsIGFuZAorICAgKiB0aGUgc2Vzc2lvbiBidXMgdGFrZXMgdGhlIExpbnV4IGRlZmF1bHQsCisgICAqIGN1cnJlbnRseSAxMDI0IGZvciBjdXIgYW5kIDQwOTYgZm9yIG1heC4KKyAgICovCisgIGlmIChnZXR1aWQgKCkgIT0gMCkKKyAgICB7CisgICAgICAvKiBub3QgYW4gZXJyb3IsIHdlJ3JlIHByb2JhYmx5IHRoZSBzZXNzaW9uIGJ1cyAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChnZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBmZCBsaW1pdDogJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGxpbS5ybGltX2N1ciA9PSBSTElNX0lORklOSVRZIHx8IGxpbS5ybGltX2N1ciA+PSBkZXNpcmVkKQorICAgIHsKKyAgICAgIC8qIG5vdCBhbiBlcnJvciwgZXZlcnl0aGluZyBpcyBmaW5lICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogSWdub3JlICJtYXhpbXVtIGxpbWl0IiwgYXNzdW1lIHdlIGhhdmUgdGhlICJzdXBlcnVzZXIiCisgICAqIHByaXZpbGVnZXMuICBPbiBMaW51eCB0aGlzIGlzIENBUF9TWVNfUkVTT1VSQ0UuCisgICAqLworICBsaW0ucmxpbV9jdXIgPSBsaW0ucmxpbV9tYXggPSBkZXNpcmVkOworCisgIGlmIChzZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBmZCBsaW1pdCB0byAldTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChEQnVzUkxpbWl0ICpzYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgaWYgKHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnNhdmVkLT5saW0pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlc3RvcmUgb2xkIGZkIGxpbWl0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiAhSEFWRV9TRVRSTElNSVQgKi8KKworc3RhdGljIHZvaWQKK2ZkX2xpbWl0X25vdF9zdXBwb3J0ZWQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgImNhbm5vdCBjaGFuZ2UgZmQgbGltaXQgb24gdGhpcyBwbGF0Zm9ybSIpOworfQorCitEQnVzUkxpbWl0ICoKK19kYnVzX3JsaW1pdF9zYXZlX2ZkX2xpbWl0IChEQnVzRXJyb3IgKmVycm9yKQoreworICBmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChlcnJvcik7CisgIHJldHVybiBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfcmxpbWl0X3JhaXNlX2ZkX2xpbWl0X2lmX3ByaXZpbGVnZWQgKHVuc2lnbmVkIGludCAgZGVzaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKQoreworICBmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChEQnVzUkxpbWl0ICpzYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgZmRfbGltaXRfbm90X3N1cHBvcnRlZCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKyNlbmRpZgorCit2b2lkCitfZGJ1c19ybGltaXRfZnJlZSAoREJ1c1JMaW1pdCAqbGltKQoreworICBkYnVzX2ZyZWUgKGxpbSk7Cit9CisKK3ZvaWQKK19kYnVzX2luaXRfc3lzdGVtX2xvZyAoZGJ1c19ib29sX3QgaXNfZGFlbW9uKQoreworI2lmZGVmIEhBVkVfU1lTTE9HX0gKKyAgaW50IGxvZ29wdHMgPSBMT0dfUElEOworCisjaWYgSEFWRV9ERUNMX0xPR19QRVJST1IKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgaWYgKCFpc19kYWVtb24gfHwgc2RfYm9vdGVkICgpIDw9IDApCisjZW5kaWYKKyAgICBsb2dvcHRzIHw9IExPR19QRVJST1I7CisjZW5kaWYKKworICBvcGVubG9nICgiZGJ1cyIsIGxvZ29wdHMsIExPR19EQUVNT04pOworI2VuZGlmCit9CisKKy8qKgorICogTG9nIGEgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGxvZyBmaWxlIChlLmcuIHN5c2xvZyBvbiBVbml4KS4KKyAqCisgKiBAcGFyYW0gc2V2ZXJpdHkgYSBzZXZlcml0eSB2YWx1ZQorICogQHBhcmFtIG1zZyBhIHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KK3ZvaWQKK19kYnVzX3N5c3RlbV9sb2cgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2YV9zdGFydCAoYXJncywgbXNnKTsKKworICBfZGJ1c19zeXN0ZW1fbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBJZiB0aGUgRkFUQUwgc2V2ZXJpdHkgaXMgZ2l2ZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0KKyAqIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZAorX2RidXNfc3lzdGVtX2xvZ3YgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpCit7CisgIHZhX2xpc3QgdG1wOworI2lmZGVmIEhBVkVfU1lTTE9HX0gKKyAgaW50IGZsYWdzOworICBzd2l0Y2ggKHNldmVyaXR5KQorICAgIHsKKyAgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX0lORk86CisgICAgICAgIGZsYWdzID0gIExPR19EQUVNT04gfCBMT0dfTk9USUNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX1dBUk5JTkc6CisgICAgICAgIGZsYWdzID0gIExPR19EQUVNT04gfCBMT0dfV0FSTklORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWToKKyAgICAgICAgZmxhZ3MgPSBMT0dfQVVUSCB8IExPR19OT1RJQ0U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfRkFUQUw6CisgICAgICAgIGZsYWdzID0gTE9HX0RBRU1PTnxMT0dfQ1JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm47CisgICAgfQorCisgIERCVVNfVkFfQ09QWSAodG1wLCBhcmdzKTsKKyAgdnN5c2xvZyAoZmxhZ3MsIG1zZywgdG1wKTsKKyAgdmFfZW5kICh0bXApOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NZU0xPR19IKSB8fCAhSEFWRV9ERUNMX0xPR19QRVJST1IKKyAgICB7CisgICAgICAvKiB2c3lzbG9nKCkgd29uJ3Qgd3JpdGUgdG8gc3RkZXJyLCBzbyB3ZSdkIGJldHRlciBkbyBpdCAqLworICAgICAgREJVU19WQV9DT1BZICh0bXAsIGFyZ3MpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1c1siIERCVVNfUElEX0ZPUk1BVCAiXTogIiwgX2RidXNfZ2V0cGlkICgpKTsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgdG1wKTsKKyAgICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOworICAgICAgdmFfZW5kICh0bXApOworICAgIH0KKyNlbmRpZgorCisgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgZXhpdCAoMSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIFVOSVggc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gc2lnIHRoZSBzaWduYWwgdG8gaGFuZGxlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlcgorICovCit2b2lkCitfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgIHNpZ3NldF90IGVtcHR5X21hc2s7CisgIAorICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKHNpZywgICZhY3QsIE5VTEwpOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgcmV0dXJuIChhY2Nlc3MgKGZpbGUsIEZfT0spID09IDApOworfQorCisvKiogQ2hlY2tzIGlmIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKyoKKyogQHBhcmFtIHVzZXJuYW1lIHVzZXIgdG8gY2hlY2sKKyogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisqIEByZXR1cm5zICNUUlVFIGlzIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlaSBhbmQgdGhlcmUgYXJlIG5vIGVycm9ycworKi8KK2RidXNfYm9vbF90IAorX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisKKyAgREJ1c1N0cmluZyB1LCBmOworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gRkFMU0U7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmYsIERCVVNfQ09OU09MRV9BVVRIX0RJUikpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgdXNlcm5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmYsICZ1KSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfZmlsZV9leGlzdHMgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmYpKTsKKworIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogc3RhdCgpIHdyYXBwZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBzdGF0CisgKiBAcGFyYW0gc3RhdGJ1ZiB0aGUgc3RhdCBpbmZvIHRvIGZpbGwgaW4KKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RhdCAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIHN0cnVjdCBzdGF0IHNiOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChzdGF0IChmaWxlbmFtZV9jLCAmc2IpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3RhdGJ1Zi0+bW9kZSA9IHNiLnN0X21vZGU7CisgIHN0YXRidWYtPm5saW5rID0gc2Iuc3Rfbmxpbms7CisgIHN0YXRidWYtPnVpZCA9IHNiLnN0X3VpZDsKKyAgc3RhdGJ1Zi0+Z2lkID0gc2Iuc3RfZ2lkOworICBzdGF0YnVmLT5zaXplID0gc2Iuc3Rfc2l6ZTsKKyAgc3RhdGJ1Zi0+YXRpbWUgPSBzYi5zdF9hdGltZTsKKyAgc3RhdGJ1Zi0+bXRpbWUgPSBzYi5zdF9tdGltZTsKKyAgc3RhdGJ1Zi0+Y3RpbWUgPSBzYi5zdF9jdGltZTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEludGVybmFscyBvZiBkaXJlY3RvcnkgaXRlcmF0b3IKKyAqLworc3RydWN0IERCdXNEaXJJdGVyCit7CisgIERJUiAqZDsgLyoqPCBUaGUgRElSKiBmcm9tIG9wZW5kaXIoKSAqLworICAKK307CisKKy8qKgorICogT3BlbiBhIGRpcmVjdG9yeSB0byBpdGVyYXRlIG92ZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBkaXJlY3RvcnkgbmFtZQorICogQHBhcmFtIGVycm9yIGV4Y2VwdGlvbiByZXR1cm4gb2JqZWN0IG9yICNOVUxMCisgKiBAcmV0dXJucyBuZXcgaXRlcmF0b3IsIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNEaXJJdGVyKgorX2RidXNfZGlyZWN0b3J5X29wZW4gKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBESVIgKmQ7CisgIERCdXNEaXJJdGVyICppdGVyOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGQgPSBvcGVuZGlyIChmaWxlbmFtZV9jKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZGlyZWN0b3J5IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGl0ZXIgPSBkYnVzX25ldzAgKERCdXNEaXJJdGVyLCAxKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBjbG9zZWRpciAoZCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJlY3RvcnkgaXRlcmF0b3IiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpdGVyLT5kID0gZDsKKworICByZXR1cm4gaXRlcjsKK30KKworLyoqCisgKiBHZXQgbmV4dCBmaWxlIGluIHRoZSBkaXJlY3RvcnkuIFdpbGwgbm90IHJldHVybiAiLiIgb3IgIi4uIiAgb24KKyAqIFVOSVguIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGNvbnRlbnRzIG9mICJmaWxlbmFtZSIgYXJlCisgKiB1bmRlZmluZWQuIFRoZSBlcnJvciBpcyBuZXZlciBzZXQgaWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQsIGFuZCBub3QgbmVjZXNzYXJpbHkgdGhyZWFkLXNhZmUuCisgKiBPbmx5IHVzZSBpdCBmb3IgdGVzdCBjb2RlIG9yIHNpbmdsZS10aHJlYWRlZCB1dGlsaXRpZXMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZmlsZW5hbWUgc3RyaW5nIHRvIGJlIHNldCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBkaXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmaWxlbmFtZSB3YXMgZmlsbGVkIGluIHdpdGggYSBuZXcgZmlsZW5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChEQnVzRGlySXRlciAgICAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBzdHJ1Y3QgZGlyZW50ICplbnQ7CisgIGludCBlcnI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgZXJybm8gPSAwOworICBlbnQgPSByZWFkZGlyIChpdGVyLT5kKTsKKworICBpZiAoIWVudCkKKyAgICB7CisgICAgICBlcnIgPSBlcnJubzsKKworICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycikpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChlbnQtPmRfbmFtZVswXSA9PSAnLicgJiYKKyAgICAgICAgICAgKGVudC0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKyAgICAgICAgICAgIChlbnQtPmRfbmFtZVsxXSA9PSAnLicgJiYgZW50LT5kX25hbWVbMl0gPT0gJ1wwJykpKQorICAgIGdvdG8gYWdhaW47CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZmlsZW5hbWUsIDApOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChmaWxlbmFtZSwgZW50LT5kX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSB0byByZWFkIGRpcmVjdG9yeSBlbnRyeSIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ2xvc2VzIGEgZGlyZWN0b3J5IGl0ZXJhdGlvbi4KKyAqLwordm9pZAorX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChEQnVzRGlySXRlciAqaXRlcikKK3sKKyAgY2xvc2VkaXIgKGl0ZXItPmQpOworICBkYnVzX2ZyZWUgKGl0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvX2Zyb21fZ3JvdXAgKHN0cnVjdCBncm91cCAgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIF9kYnVzX2Fzc2VydCAoZy0+Z3JfbmFtZSAhPSBOVUxMKTsKKyAgCisgIGluZm8tPmdpZCA9IGctPmdyX2dpZDsKKyAgaW5mby0+Z3JvdXBuYW1lID0gX2RidXNfc3RyZHVwIChnLT5ncl9uYW1lKTsKKworICAvKiBpbmZvLT5tZW1iZXJzID0gZGJ1c19zdHJkdXB2IChnLT5ncl9tZW0pICovCisgIAorICBpZiAoaW5mby0+Z3JvdXBuYW1lID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfZ3JvdXBfaW5mbyAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpncm91cF9jX3N0cjsKKworICBfZGJ1c19hc3NlcnQgKGdyb3VwbmFtZSAhPSBOVUxMIHx8IGdpZCAhPSBEQlVTX0dJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoZ3JvdXBuYW1lID09IE5VTEwgfHwgZ2lkID09IERCVVNfR0lEX1VOU0VUKTsKKworICBpZiAoZ3JvdXBuYW1lKQorICAgIGdyb3VwX2Nfc3RyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpOworICBlbHNlCisgICAgZ3JvdXBfY19zdHIgPSBOVUxMOworICAKKyAgLyogRm9yIG5vdyBhc3N1bWluZyB0aGF0IHRoZSBnZXRncm5hbSgpIGFuZCBnZXRncmdpZCgpIGZsYXZvcnMKKyAgICogYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIHB3bmFtIGZsYXZvcnMsIGlmIG5vdCB3ZSBoYXZlCisgICAqIHRvIGFkZCBtb3JlIGNvbmZpZ3VyZSBjaGVja3MuCisgICAqLworICAKKyNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX0dFVFBXTkFNX1IpIHx8IGRlZmluZWQgKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUikKKyAgeworICAgIHN0cnVjdCBncm91cCAqZzsKKyAgICBpbnQgcmVzdWx0OworICAgIHNpemVfdCBidWZsZW47CisgICAgY2hhciAqYnVmOworICAgIHN0cnVjdCBncm91cCBnX3N0cjsKKyAgICBkYnVzX2Jvb2xfdCBiOworCisgICAgLyogcmV0cmlldmUgbWF4aW11bSBuZWVkZWQgc2l6ZSBmb3IgYnVmICovCisgICAgYnVmbGVuID0gc3lzY29uZiAoX1NDX0dFVEdSX1JfU0laRV9NQVgpOworCisgICAgLyogc3lzY29uZiBhY3R1YWxseSByZXR1cm5zIGEgbG9uZywgYnV0IGV2ZXJ5dGhpbmcgZWxzZSBleHBlY3RzIHNpemVfdCwKKyAgICAgKiBzbyBqdXN0IHJlY2FzdCBoZXJlLgorICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDYxCisgICAgICovCisgICAgaWYgKChsb25nKSBidWZsZW4gPD0gMCkKKyAgICAgIGJ1ZmxlbiA9IDEwMjQ7CisKKyAgICByZXN1bHQgPSAtMTsKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKyAgICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1Zmxlbik7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgZyA9IE5VTEw7CisjaWZkZWYgSEFWRV9QT1NJWF9HRVRQV05BTV9SCisgICAgICAgIGlmIChncm91cF9jX3N0cikKKyAgICAgICAgICByZXN1bHQgPSBnZXRncm5hbV9yIChncm91cF9jX3N0ciwgJmdfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPSBnZXRncmdpZF9yIChnaWQsICZnX3N0ciwgYnVmLCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmcpOworI2Vsc2UKKyAgICAgICAgZyA9IGdldGdybmFtX3IgKGdyb3VwX2Nfc3RyLCAmZ19zdHIsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNlbmRpZiAvKiAhSEFWRV9QT1NJWF9HRVRQV05BTV9SICovCisgICAgICAgIC8qIFRyeSBhIGJpZ2dlciBidWZmZXIgaWYgRVJBTkdFIHdhcyByZXR1cm5lZDoKKyAgICAgICAgICAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MjcKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFUkFOR0UgJiYgYnVmbGVuIDwgNTEyICogMTAyNCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICBidWZsZW4gKj0gMjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IDAgJiYgZyA9PSAmZ19zdHIpCisgICAgICB7CisgICAgICAgIGIgPSBmaWxsX3VzZXJfaW5mb19mcm9tX2dyb3VwIChnLCBpbmZvLCBlcnJvcik7CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyB1bmtub3duIG9yIGZhaWxlZCB0byBsb29rIGl0IHVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfY19zdHIgPyBncm91cF9jX3N0ciA6ICI/Pz8iKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbHNlIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisgIHsKKyAgICAvKiBJIGd1ZXNzIHdlJ3JlIHNjcmV3ZWQgb24gdGhyZWFkIHNhZmV0eSBoZXJlICovCisgICAgc3RydWN0IGdyb3VwICpnOworCisgICAgZyA9IGdldGdybmFtIChncm91cF9jX3N0cik7CisKKyAgICBpZiAoZyAhPSBOVUxMKQorICAgICAgeworICAgICAgICByZXR1cm4gZmlsbF91c2VyX2luZm9fZnJvbV9ncm91cCAoZywgaW5mbywgZXJyb3IpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgJXMgdW5rbm93biBvciBmYWlsZWQgdG8gbG9vayBpdCB1cFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2Nfc3RyID8gZ3JvdXBfY19zdHIgOiAiPz8/Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2VuZGlmICAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBEQnVzR3JvdXBJbmZvIHN0cnVjdAorICogd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZS4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBncm91cG5hbWUgbmFtZSBvZiBncm91cAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3VwX2luZm9fZmlsbCAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfZ3JvdXBfaW5mbyAoaW5mbywgREJVU19HSURfVU5TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwbmFtZSwgZXJyb3IpOworCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIERCdXNHcm91cEluZm8gc3RydWN0CisgKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBncm91cCBJRC4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBnaWQgZ3JvdXAgSUQKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ncm91cF9pbmZvX2ZpbGxfZ2lkIChEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBmaWxsX2dyb3VwX2luZm8gKGluZm8sIGdpZCwgTlVMTCwgZXJyb3IpOworfQorCisvKioKKyAqIFBhcnNlIGEgVU5JWCB1c2VyIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lIHRleHQKKyAqIEBwYXJhbSB1aWRfcCBwbGFjZSB0byByZXR1cm4gdGhlIHVpZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWRfcCkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF91c2VyX2lkICh1c2VybmFtZSwgdWlkX3ApOworCit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIGdyb3VwIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUgdGV4dAorICogQHBhcmFtIGdpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgZ2lkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICByZXR1cm4gX2RidXNfZ2V0X2dyb3VwX2lkIChncm91cG5hbWUsIGdpZF9wKTsKK30KKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVU5JWCB1c2VyIElELiBPbiBVTklYLAorICoganVzdCBjYWxscyBfZGJ1c19ncm91cHNfZnJvbV91aWQoKS4gT24gV2luZG93cywgc2hvdWxkIGFsd2F5cworICogZmFpbCBzaW5jZSB3ZSBkb24ndCBrbm93IGFueSBVTklYIGdyb3Vwcy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVSUQKKyAqIEBwYXJhbSBncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBvZiBncm91cCBJRHMKKyAqIEBwYXJhbSBuX2dyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpCit7CisgIHJldHVybiBfZGJ1c19ncm91cHNfZnJvbV91aWQgKHVpZCwgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIGlzIGF0IHRoZSBjb25zb2xlLgorICogU2hvdWxkIGFsd2F5cyBmYWlsIG9uIFdpbmRvd3MgKHNldCB0aGUgZXJyb3IgdG8KKyAqICNEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpLgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19pc19jb25zb2xlX3VzZXIgKHVpZCwgZXJyb3IpOworCit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIG1hdGNoZXMgdGhlIFVJRCBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVOSVggdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1aWQgb3ducyB0aGUgcHJvY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyIChkYnVzX3VpZF90IHVpZCkKK3sKKyAgcmV0dXJuIHVpZCA9PSBfZGJ1c19nZXRldWlkICgpOworfQorCisvKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFdpbmRvd3MgdXNlciBTSUQgbWF0Y2hlcyB0aGUgb3duZXIgb2YKKyAqIHRoZSBwcm9jZXNzLiBTaG91bGQgYWx3YXlzIHJldHVybiAjRkFMU0Ugb24gVU5JWC4KKyAqCisgKiBAcGFyYW0gd2luZG93c19zaWQgdGhlIFdpbmRvd3MgdXNlciBTSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoaXMgdXNlciBvd25zIHRoZSBwcm9jZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2luZG93c191c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgREJ1c0ludGVybmFsc1V0aWxzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEdldCB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGNvbXBsZXRlIGZpbGVuYW1lCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZGlybmFtZSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSBuYW1lIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRpcm5hbWUpCit7CisgIGludCBzZXA7CisgIAorICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IGRpcm5hbWUpOworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogSWdub3JlIGFueSBzZXBhcmF0b3JzIG9uIHRoZSBlbmQgKi8KKyAgc2VwID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKTsKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOyAvKiBlbXB0eSBzdHJpbmcgcGFzc2VkIGluICovCisgICAgCisgIHdoaWxlIChzZXAgPiAwICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJykKKyAgICAtLXNlcDsKKworICBfZGJ1c19hc3NlcnQgKHNlcCA+PSAwKTsKKyAgCisgIGlmIChzZXAgPT0gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi8iKTsKKyAgCisgIC8qIE5vdyBmaW5kIHRoZSBwcmV2aW91cyBzZXBhcmF0b3IgKi8KKyAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJy8nLCAmc2VwKTsKKyAgaWYgKHNlcCA8IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7CisgIAorICAvKiBza2lwIG11bHRpcGxlIHNlcGFyYXRvcnMgKi8KKyAgd2hpbGUgKHNlcCA+IDAgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworICAKKyAgaWYgKHNlcCA9PSAwICYmCisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLycpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIvIik7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwIC0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworfQorLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQKK3N0cmluZ19zcXVhc2hfbm9ucHJpbnRhYmxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgaW50IGksIGxlbjsgCisgIAorICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHN0cik7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICAKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICh1bnNpZ25lZCBjaGFyKSBidWZbaV07CisgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICBidWZbaV0gPSAnICc7CisgICAgICBlbHNlIGlmIChjIDwgMHgyMCB8fCBjID4gMTI3KQorICAgICAgICBidWZbaV0gPSAnPyc7CisgICAgfQorfQorCisvKioKKyAqIEdldCBhIHByaW50YWJsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29tbWFuZCB1c2VkIHRvIGV4ZWN1dGUKKyAqIHRoZSBwcm9jZXNzIHdpdGggcGlkLiAgVGhpcyBzdHJpbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKKyAqIGluZm9ybWF0aXZlIHB1cnBvc2VzIHN1Y2ggYXMgbG9nZ2luZzsgaXQgbWF5IG5vdCBiZSB0cnVzdGVkLgorICogCisgKiBUaGUgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIHByaW50YWJsZSBBU0NJSSBhbmQgbm8gbG9uZ2VyCisgKiB0aGFuIG1heF9sZW4uCisgKiAKKyAqIEBwYXJhbSBwaWQgUHJvY2VzcyBpZAorICogQHBhcmFtIHN0ciBBcHBlbmQgY29tbWFuZCB0byB0aGlzIHN0cmluZworICogQHBhcmFtIG1heF9sZW4gTWF4aW11bSBsZW5ndGggb2YgcmV0dXJuZWQgY29tbWFuZAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QgCitfZGJ1c19jb21tYW5kX2Zvcl9waWQgKHVuc2lnbmVkIGxvbmcgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBtYXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgLyogVGhpcyBpcyBhbGwgTGludXgtc3BlY2lmaWMgZm9yIG5vdyAqLworICBEQnVzU3RyaW5nIHBhdGg7CisgIERCdXNTdHJpbmcgY21kbGluZTsKKyAgaW50IGZkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhdGgpKSAKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNtZGxpbmUpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnBhdGgsICIvcHJvYy8lbGQvY21kbGluZSIsIHBpZCkpCisgICAgZ290byBvb207CisgIAorICBmZCA9IG9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIAorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgCisgIGlmICghX2RidXNfcmVhZCAoZmQsICZjbWRsaW5lLCBtYXhfbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOyAgICAgIAorICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2Nsb3NlIChmZCwgZXJyb3IpKQorICAgIGdvdG8gZmFpbDsKKyAgCisgIHN0cmluZ19zcXVhc2hfbm9ucHJpbnRhYmxlICgmY21kbGluZSk7ICAKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY21kbGluZSwgMCwgc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbWRsaW5lKTsgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICByZXR1cm4gVFJVRTsKK29vbToKKyAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworZmFpbDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbWRsaW5lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogcmVwbGFjZXMgdGhlIHRlcm0gREJVU19QUkVGSVggaW4gY29uZmlndXJlX3RpbWVfcGF0aCBieSB0aGUKKyAqIGN1cnJlbnQgZGJ1cyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBPbiB1bml4IHRoaXMgZnVuY3Rpb24gaXMgYSBub29wCisgKgorICogQHBhcmFtIGNvbmZpZ3VyZV90aW1lX3BhdGgKKyAqIEByZXR1cm4gcmVhbCBwYXRoCisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoY29uc3QgY2hhciAqY29uZmlndXJlX3RpbWVfcGF0aCkKK3sKKyAgcmV0dXJuIGNvbmZpZ3VyZV90aW1lX3BhdGg7Cit9CisKKyNkZWZpbmUgREJVU19VTklYX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiAiL2RidXMtMS9zZXJ2aWNlcyIKKyNkZWZpbmUgREJVU19VTklYX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSICIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlCisgKiBhY3RpdmF0aW9uIGZpbGVzCisgKgorICogT24gVU5JWCB0aGlzIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgeGRnIGZyZWVkZXNrdG9wLm9yZyBkYXRhIGRpcmVjdG9yaWVzOgorICoKKyAqIFhER19EQVRBX0hPTUU9JHtYREdfREFUQV9IT01FLSRIT01FLy5sb2NhbC9zaGFyZX0KKyAqIFhER19EQVRBX0RJUlM9JHtYREdfREFUQV9ESVJTLS91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZX0KKyAqCisgKiBhbmQKKyAqCisgKiBEQlVTX0RBVEFESVIKKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9ob21lOworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9kaXJzOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZWRpcl9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgeGRnX2RhdGFfaG9tZSA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0hPTUUiKTsKKyAgeGRnX2RhdGFfZGlycyA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0RJUlMiKTsKKworICBpZiAoeGRnX2RhdGFfaG9tZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgeGRnX2RhdGFfaG9tZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmhvbWVkaXI7CisgICAgICBEQnVzU3RyaW5nIGxvY2FsX3NoYXJlOworCisgICAgICBpZiAoIV9kYnVzX2hvbWVkaXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZob21lZGlyKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChob21lZGlyKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmxvY2FsX3NoYXJlLCAiLy5sb2NhbC9zaGFyZSIpOworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmc2VydmljZWRpcl9wYXRoLCAmbG9jYWxfc2hhcmUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiOiIpKQorICAgIGdvdG8gb29tOworCisgIGlmICh4ZGdfZGF0YV9kaXJzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCB4ZGdfZGF0YV9kaXJzKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgIjoiKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlOiIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyoKKyAgICogYWRkIGNvbmZpZ3VyZWQgZGF0YWRpciB0byBkZWZhdWx0cworICAgKiB0aGlzIG1heSBiZSB0aGUgc2FtZSBhcyBhbiB4ZGcgZGlyCisgICAqIGhvd2V2ZXIgdGhlIGNvbmZpZyBwYXJzZXIgc2hvdWxkIHRha2UKKyAgICogY2FyZSBvZiBkdXBsaWNhdGVzCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIERCVVNfREFUQURJUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVU5JWF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzeXN0ZW0gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIE9uIFdpbmRvd3MgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBhbmQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIG5vdGhpbmcuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00KKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICAvKgorICAgKiBEQlVTX0RBVEFESVIgbWF5IGJlIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgc3RhbmRhcmQgZGlyZWN0b3JpZXMuIEhvd2V2ZXIsCisgICAqIHRoZSBjb25maWcgcGFyc2VyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGR1cGxpY2F0ZXMuCisgICAqCisgICAqIEFsc28sIGFwcGVuZCAvbGliIGFzIGNvdW50ZXJwYXJ0IG9mIC91c3Ivc2hhcmUgb24gdGhlIHJvb3QKKyAgICogZGlyZWN0b3J5ICh0aGUgcm9vdCBkaXJlY3RvcnkgZG9lcyBub3Qga25vdyAvc2hhcmUpLCBpbiBvcmRlciB0bworICAgKiBmYWNpbGl0YXRlIGVhcmx5IGJvb3Qgc3lzdGVtIGJ1cyBhY3RpdmF0aW9uIHdoZXJlIC91c3IgbWlnaHQgbm90CisgICAqIGJlIGF2YWlsYWJsZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBjaGFyIHN0YW5kYXJkX3NlYXJjaF9wYXRoW10gPQorICAgICIvdXNyL2xvY2FsL3NoYXJlOiIKKyAgICAiL3Vzci9zaGFyZToiCisgICAgREJVU19EQVRBRElSICI6IgorICAgICIvbGliIjsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlZGlyX3BhdGg7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlZGlyX3BhdGgsIHN0YW5kYXJkX3NlYXJjaF9wYXRoKTsKKworICByZXR1cm4gX2RidXNfc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVU5JWF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMpOworfQorCisvKioKKyAqIEFwcGVuZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3lzdGVtLmNvbmYgZmlsZQorICogKHRoZXJlIGlzIG5vIHN5c3RlbSBidXMgb24gV2luZG93cyBzbyB0aGlzIGNhbiBqdXN0CisgKiByZXR1cm4gRkFMU0UgYW5kIHByaW50IGEgd2FybmluZyBvciBzb21ldGhpbmcpCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSk7Cit9CisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzZXNzaW9uLmNvbmYgZmlsZS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC13aW4uYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3NTRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKQEAgLTAsMCArMSwxNzA0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1zeXNkZXBzLmMsIGJ1dCBub3QgdXNlZCBpbiBsaWJkYnVzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2RlZmluZSBTVFJTQUZFX05PX0RFUFJFQ0FURQorCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1zb2NrZXRzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPiAgIC8vIFdTQSBlcnJvciBjb2RlcworCisjaWZuZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGxtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisKKy8qKgorICogRG9lcyB0aGUgY2hkaXIsIGZvcmssIHNldHNpZCwgZXRjLiB0byBiZWNvbWUgYSBkYWVtb24gcHJvY2Vzcy4KKyAqCisgKiBAcGFyYW0gcGlkZmlsZSAjTlVMTCwgb3IgcGlkZmlsZSB0byBjcmVhdGUKKyAqIEBwYXJhbSBwcmludF9waWRfcGlwZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgZGFlbW9uJ3MgcGlkIHRvLCBvciAtMSBmb3Igbm9uZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcGFyYW0ga2VlcF91bWFzayAjVFJVRSB0byBrZWVwIHRoZSBvcmlnaW5hbCB1bWFzaworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JlY29tZV9kYWVtb24gKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzaykKK3sKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRhZW1vbml6ZSBvbiBXaW5kb3dzIik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgZmlsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBwaWQgb3VyIHByb2Nlc3MgSUQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpjZmlsZW5hbWU7CisgIEhBTkRMRSBobmQ7CisgIGNoYXIgcGlkc3RyWzIwXTsKKyAgaW50IHRvdGFsOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgY2ZpbGVuYW1lID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaG5kID0gQ3JlYXRlRmlsZUEgKGNmaWxlbmFtZSwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgUElEIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBjZmlsZW5hbWUsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNucHJpbnRmIChwaWRzdHIsIHNpemVvZiAocGlkc3RyKSwgIiVsdVxuIiwgcGlkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcm1hdCBQSUQgZm9yIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdG90YWwgPSAwOworICBieXRlc190b193cml0ZSA9IHN0cmxlbiAocGlkc3RyKTs7CisKKyAgd2hpbGUgKHRvdGFsIDwgYnl0ZXNfdG9fd3JpdGUpCisgICAgeworICAgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbjsKKyAgICAgIEJPT0wgcmVzOworCisgICAgICByZXMgPSBXcml0ZUZpbGUgKGhuZCwgcGlkc3RyICsgdG90YWwsIGJ5dGVzX3RvX3dyaXRlIC0gdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLCBOVUxMKTsKKworICAgICAgaWYgKHJlcyA9PSAwIHx8IGJ5dGVzX3dyaXR0ZW4gPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gJXM6ICVzIiwgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgIH0KKworICBpZiAoQ2xvc2VIYW5kbGUgKGhuZCkgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBnaXZlbiBwaWRfdG9fd3JpdGUgdG8gYSBwaWRmaWxlIChpZiBub24tTlVMTCkgYW5kL29yIHRvIGEKKyAqIHBpcGUgKGlmIG5vbi1OVUxMKS4gRG9lcyBub3RoaW5nIGlmIHBpZGZpbGUgYW5kIHByaW50X3BpZF9waXBlIGFyZSBib3RoCisgKiBOVUxMLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlIHRoZSBmaWxlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgdGhlIHBpcGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwaWRfdG9fd3JpdGUgdGhlIHBpZCB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHBpZGZpbGUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgcGlkIGZpbGUgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAocGlkZmlsZSkpOworICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfZmlsZSAocGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSB3cml0ZSBmYWlsZWRcbiIpOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgZmlsZSByZXF1ZXN0ZWRcbiIpOworICAgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgIT0gTlVMTCAmJiBfZGJ1c19waXBlX2lzX3ZhbGlkIChwcmludF9waWRfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwaWQ7CisgICAgICBpbnQgYnl0ZXM7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIG91ciBwaWQgdG8gcGlwZSAlZFxuIiwgcHJpbnRfcGlkX3BpcGUtPmZkKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZwaWQsIHBpZF90b193cml0ZSkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZCwgIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkKTsKKyAgICAgIGlmIChfZGJ1c19waXBlX3dyaXRlIChwcmludF9waWRfcGlwZSwgJnBpZCwgMCwgYnl0ZXMsIGVycm9yKSAhPSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgIC8qIF9kYnVzX3BpcGVfd3JpdGUgc2V0cyBlcnJvciBvbmx5IG9uIGZhaWx1cmUsIG5vdCBzaG9ydCB3cml0ZSAqLworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgbWVzc2FnZSBidXMgUElEOiBkaWQgbm90IHdyaXRlIGVub3VnaCBieXRlc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBpZCBwaXBlIHRvIHdyaXRlIHRvXG4iKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgYWZ0ZXIgdGhlIGZvcmsgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdG8gdGhpcyB1c2VyLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VybmFtZSBnaXZlbiBpbiB0aGUgZGFlbW9uIGNvbmZpZ3VyYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192ZXJpZnlfZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIpCit7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoYW5nZXMgdGhlIHVzZXIgYW5kIGdyb3VwIHRoZSBidXMgaXMgcnVubmluZyBhcy4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlciB0byBiZWNvbWUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlciAgKGNvbnN0IGNoYXIgICAgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChEQnVzRXJyb3IgKmVycm9yKQoreworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICJjYW5ub3QgY2hhbmdlIGZkIGxpbWl0IG9uIHRoaXMgcGxhdGZvcm0iKTsKK30KKworREJ1c1JMaW1pdCAqCitfZGJ1c19ybGltaXRfc2F2ZV9mZF9saW1pdCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgZmRfbGltaXRfbm90X3N1cHBvcnRlZCAoZXJyb3IpOworICByZXR1cm4gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yYWlzZV9mZF9saW1pdF9pZl9wcml2aWxlZ2VkICh1bnNpZ25lZCBpbnQgIGRlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICplcnJvcikKK3sKKyAgZmRfbGltaXRfbm90X3N1cHBvcnRlZCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19ybGltaXRfcmVzdG9yZV9mZF9saW1pdCAoREJ1c1JMaW1pdCAqc2F2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGZkX2xpbWl0X25vdF9zdXBwb3J0ZWQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitfZGJ1c19ybGltaXRfZnJlZSAoREJ1c1JMaW1pdCAqbGltKQoreworICAvKiBfZGJ1c19ybGltaXRfc2F2ZV9mZF9saW1pdCgpIGNhbm5vdCByZXR1cm4gbm9uLU5VTEwgb24gV2luZG93cworICAgKiBzbyB0aGVyZSBjYW5ub3QgYmUgYW55dGhpbmcgdG8gZnJlZSAqLworICBfZGJ1c19hc3NlcnQgKGxpbSA9PSBOVUxMKTsKK30KKwordm9pZAorX2RidXNfaW5pdF9zeXN0ZW1fbG9nIChkYnVzX2Jvb2xfdCBpc19kYWVtb24pCit7CisgIC8qIE91dHB1dERlYnVnU3RyaW5nQSBkb2Vzbid0IG5lZWQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb24sIGRvIG5vdGhpbmcgKi8KK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3lzdGVtX2xvZyAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0IChhcmdzLCBtc2cpOworCisgIF9kYnVzX3N5c3RlbV9sb2d2IChzZXZlcml0eSwgbXNnLCBhcmdzKTsKKworICB2YV9lbmQgKGFyZ3MpOworfQorCisvKioKKyAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBsb2cgZmlsZSAoZS5nLiBzeXNsb2cgb24gVW5peCkuCisgKgorICogQHBhcmFtIHNldmVyaXR5IGEgc2V2ZXJpdHkgdmFsdWUKKyAqIEBwYXJhbSBtc2cgYSBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZworICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICoKKyAqIElmIHRoZSBGQVRBTCBzZXZlcml0eSBpcyBnaXZlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbQorICogd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkCitfZGJ1c19zeXN0ZW1fbG9ndiAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXJncykKK3sKKyAgY2hhciAqcyA9ICIiOworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgY2hhciBmb3JtYXRbMTAyNF07CisKKyAgc3dpdGNoKHNldmVyaXR5KSAKKyAgIHsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfSU5GTzogcyA9ICJpbmZvIjsgYnJlYWs7CisgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX1dBUk5JTkc6IHMgPSAid2FybmluZyI7IGJyZWFrOworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWTogcyA9ICJzZWN1cml0eSI7IGJyZWFrOworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19GQVRBTDogcyA9ICJmYXRhbCI7IGJyZWFrOworICAgfQorICAgCisgIHNucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlcyVzIiwgcyAsbXNnKTsKKyAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYXJncyk7CisgIE91dHB1dERlYnVnU3RyaW5nQShidWYpOworICAKKyAgaWYgKHNldmVyaXR5ID09IERCVVNfU1lTVEVNX0xPR19GQVRBTCkKKyAgICBleGl0ICgxKTsKK30KKworLyoqIEluc3RhbGxzIGEgc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gc2lnIHRoZSBzaWduYWwgdG8gaGFuZGxlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlcgorICovCit2b2lkCitfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIl9kYnVzX3NldF9zaWduYWxfaGFuZGxlcigpIGhhcyB0byBiZSBpbXBsZW1lbnRlZFxuIik7Cit9CisKKy8qKgorICogc3RhdCgpIHdyYXBwZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBzdGF0CisgKiBAcGFyYW0gc3RhdGJ1ZiB0aGUgc3RhdCBpbmZvIHRvIGZpbGwgaW4KKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RhdChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgREJ1c1N0YXQgICAgICAgICAqc3RhdGJ1ZiwKKyAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgd2ZhZDsKKyAgY2hhciAqbGFzdGRvdDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKCFHZXRGaWxlQXR0cmlidXRlc0V4QSAoZmlsZW5hbWVfYywgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLCAmd2ZhZCkpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh3ZmFkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCisgICAgc3RhdGJ1Zi0+bW9kZSA9IF9TX0lGRElSOworICBlbHNlCisgICAgc3RhdGJ1Zi0+bW9kZSA9IF9TX0lGUkVHOworCisgIHN0YXRidWYtPm1vZGUgfD0gX1NfSVJFQUQ7CisgIGlmICh3ZmFkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKKyAgICBzdGF0YnVmLT5tb2RlIHw9IF9TX0lXUklURTsKKworICBsYXN0ZG90ID0gc3RycmNociAoZmlsZW5hbWVfYywgJy4nKTsKKyAgaWYgKGxhc3Rkb3QgJiYgc3RyaWNtcCAobGFzdGRvdCwgIi5leGUiKSA9PSAwKQorICAgIHN0YXRidWYtPm1vZGUgfD0gX1NfSUVYRUM7CisKKyAgc3RhdGJ1Zi0+bW9kZSB8PSAoc3RhdGJ1Zi0+bW9kZSAmIDA3MDApID4+IDM7CisgIHN0YXRidWYtPm1vZGUgfD0gKHN0YXRidWYtPm1vZGUgJiAwNzAwKSA+PiA2OworCisgIHN0YXRidWYtPm5saW5rID0gMTsKKworI2lmZGVmIEVOQUJMRV9VSURfVE9fU0lECisgIHsKKyAgICBQU0lEIG93bmVyX3NpZCwgZ3JvdXBfc2lkOworICAgIFBTRUNVUklUWV9ERVNDUklQVE9SIHNkOworCisgICAgc2QgPSBOVUxMOworICAgIHJjID0gR2V0TmFtZWRTZWN1cml0eUluZm8gKChjaGFyICopIGZpbGVuYW1lX2MsIFNFX0ZJTEVfT0JKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9XTkVSX1NFQ1VSSVRZX0lORk9STUFUSU9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUF9TRUNVUklUWV9JTkZPUk1BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJfc2lkLCAmZ3JvdXBfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIHJjKTsKKyAgICAgICAgaWYgKHNkICE9IE5VTEwpCisgICAgICAgICAgTG9jYWxGcmVlIChzZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAKKyAgICAvKiBGSVhNRSAqLworICAgIHN0YXRidWYtPnVpZCA9IF9kYnVzX3dpbl9zaWRfdG9fdWlkX3QgKG93bmVyX3NpZCk7CisgICAgc3RhdGJ1Zi0+Z2lkID0gX2RidXNfd2luX3NpZF90b191aWRfdCAoZ3JvdXBfc2lkKTsKKworICAgIExvY2FsRnJlZSAoc2QpOworICB9CisjZWxzZQorICBzdGF0YnVmLT51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgc3RhdGJ1Zi0+Z2lkID0gREJVU19HSURfVU5TRVQ7CisjZW5kaWYKKworICBzdGF0YnVmLT5zaXplID0gKChkYnVzX2ludDY0X3QpIHdmYWQubkZpbGVTaXplSGlnaCA8PCAzMikgKyB3ZmFkLm5GaWxlU2l6ZUxvdzsKKworICBzdGF0YnVmLT5hdGltZSA9CisgICAgKCgoZGJ1c19pbnQ2NF90KSB3ZmFkLmZ0TGFzdEFjY2Vzc1RpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdExhc3RBY2Nlc3NUaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHN0YXRidWYtPm10aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lIDw8IDMyKSArCisgICAgIHdmYWQuZnRMYXN0V3JpdGVUaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHN0YXRidWYtPmN0aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRDcmVhdGlvblRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdENyZWF0aW9uVGltZS5kd0xvd0RhdGVUaW1lKSAvIDEwMDAwMDAwIC0gREJVU19JTlQ2NF9DT05TVEFOVCAoMTE2NDQ0NzM2MDAwMDAwMDAwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgZGlyZWN0b3J5IGl0ZXJhdG9yCisgKi8KK3N0cnVjdCBEQnVzRGlySXRlcgorICB7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBXSU4zMl9GSU5EX0RBVEFBIGZpbGVpbmZvOyAgLyogZnJvbSBGaW5kRmlyc3QvRmluZE5leHQgKi8KKyAgICBkYnVzX2Jvb2xfdCBmaW5pc2hlZDsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzICovCisgICAgaW50IG9mZnNldDsKKyAgfTsKKworLyoqCisgKiBPcGVuIGEgZGlyZWN0b3J5IHRvIGl0ZXJhdGUgb3Zlci4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXhjZXB0aW9uIHJldHVybiBvYmplY3Qgb3IgI05VTEwKKyAqIEByZXR1cm5zIG5ldyBpdGVyYXRvciwgb3IgI05VTEwgb24gZXJyb3IKKyAqLworREJ1c0Rpckl0ZXIqCitfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNEaXJJdGVyICppdGVyOworICBEQnVzU3RyaW5nIGZpbGVzcGVjOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfZnJvbV9zdHJpbmcgKCZmaWxlc3BlYywgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpcmVjdG9yeSBmaWxlbmFtZSBjb3B5Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlc3BlYywgIi8iKSB8fCBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZXNwZWMsICJcXCIpICkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlc3BlYywgIioiKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYXBwZW5kIGZpbGVuYW1lIHdpbGRjYXJkIik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZXNwZWMsICIqIikpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZXNwZWMsICJcXCoiKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYXBwZW5kIGZpbGVuYW1lIHdpbGRjYXJkIDIiKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBpdGVyID0gZGJ1c19uZXcwIChEQnVzRGlySXRlciwgMSk7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlc3BlYyk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJlY3RvcnkgaXRlcmF0b3IiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpdGVyLT5maW5pc2hlZCA9IEZBTFNFOworICBpdGVyLT5vZmZzZXQgPSAwOworICBpdGVyLT5oYW5kbGUgPSBGaW5kRmlyc3RGaWxlQSAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZXNwZWMpLCAmKGl0ZXItPmZpbGVpbmZvKSk7CisgIGlmIChpdGVyLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgaWYgKEdldExhc3RFcnJvciAoKSA9PSBFUlJPUl9OT19NT1JFX0ZJTEVTKQorICAgICAgICBpdGVyLT5maW5pc2hlZCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIGRidXNfZnJlZSAoIGl0ZXIgKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVzcGVjKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlc3BlYyk7CisgIHJldHVybiBpdGVyOworfQorCisvKioKKyAqIEdldCBuZXh0IGZpbGUgaW4gdGhlIGRpcmVjdG9yeS4gV2lsbCBub3QgcmV0dXJuICIuIiBvciAiLi4iICBvbgorICogVU5JWC4gSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgY29udGVudHMgb2YgImZpbGVuYW1lIiBhcmUKKyAqIHVuZGVmaW5lZC4gVGhlIGVycm9yIGlzIG5ldmVyIHNldCBpZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZmlsZW5hbWUgc3RyaW5nIHRvIGJlIHNldCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBkaXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmaWxlbmFtZSB3YXMgZmlsbGVkIGluIHdpdGggYSBuZXcgZmlsZW5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChEQnVzRGlySXRlciAgICAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJyID0gR2V0TGFzdEVycm9yKCk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKK2FnYWluOgorICBTZXRMYXN0RXJyb3IgKDApOworCisgIGlmICghaXRlciB8fCBpdGVyLT5maW5pc2hlZCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoaXRlci0+b2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICBpZiAoRmluZE5leHRGaWxlQSAoaXRlci0+aGFuZGxlLCAmKGl0ZXItPmZpbGVpbmZvKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT19NT1JFX0ZJTEVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTZXRMYXN0RXJyb3Ioc2F2ZWRfZXJyKTsKKyAgICAgICAgICAgICAgaXRlci0+ZmluaXNoZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbmV4dCBpbiBkaXJlY3Rvcnk6ICVzIiwgZW1zZyk7CisgICAgICAgICAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpdGVyLT5vZmZzZXQrKzsKKworICBpZiAoaXRlci0+ZmluaXNoZWQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVswXSA9PSAnLicgJiYKKyAgICAgKGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVsxXSA9PSAnXDAnIHx8CisgICAgICAgIChpdGVyLT5maWxlaW5mby5jRmlsZU5hbWVbMV0gPT0gJy4nICYmIGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVsyXSA9PSAnXDAnKSkpCisgICAgICBnb3RvIGFnYWluOworCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChmaWxlbmFtZSwgMCk7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoZmlsZW5hbWUsIGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IHRvIHJlYWQgZGlyZWN0b3J5IGVudHJ5Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsb3NlcyBhIGRpcmVjdG9yeSBpdGVyYXRpb24uCisgKi8KK3ZvaWQKK19kYnVzX2RpcmVjdG9yeV9jbG9zZSAoREJ1c0Rpckl0ZXIgKml0ZXIpCit7CisgIGlmICghaXRlcikKKyAgICAgIHJldHVybjsKKyAgRmluZENsb3NlKGl0ZXItPmhhbmRsZSk7CisgIGRidXNfZnJlZSAoaXRlcik7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgREJ1c0ludGVybmFsc1V0aWxzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEdldCB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGNvbXBsZXRlIGZpbGVuYW1lCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZGlybmFtZSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSBuYW1lIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGlybmFtZSkKK3sKKyAgaW50IHNlcDsKKworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IGRpcm5hbWUpOworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogSWdub3JlIGFueSBzZXBhcmF0b3JzIG9uIHRoZSBlbmQgKi8KKyAgc2VwID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKTsKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOyAvKiBlbXB0eSBzdHJpbmcgcGFzc2VkIGluICovCisKKyAgd2hpbGUgKHNlcCA+IDAgJiYKKyAgICAgICAgIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXAgLSAxKSA9PSAnLycgfHwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXAgLSAxKSA9PSAnXFwnKSkKKyAgICAtLXNlcDsKKworICBfZGJ1c19hc3NlcnQgKHNlcCA+PSAwKTsKKworICBpZiAoc2VwID09IDAgfHwKKyAgICAgIChzZXAgPT0gMiAmJgorICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDEpID09ICc6JyAmJgorICAgICAgIGlzYWxwaGEgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApKSkpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZmlsZW5hbWUsIDAsIHNlcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcm5hbWUpKTsKKworICB7CisgICAgaW50IHNlcDEsIHNlcDI7CisgICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJy8nLCAmc2VwMSk7CisgICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJ1xcJywgJnNlcDIpOworCisgICAgc2VwID0gTUFYIChzZXAxLCBzZXAyKTsKKyAgfQorICBpZiAoc2VwIDwgMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi4iKTsKKworICB3aGlsZSAoc2VwID4gMCAmJgorICAgICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJyB8fAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICdcXCcpKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworCisgIGlmICgoc2VwID09IDAgfHwKKyAgICAgICAoc2VwID09IDIgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMSkgPT0gJzonICYmCisgICAgICAgIGlzYWxwaGEgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApKSkpCisgICAgICAmJgorICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCkgPT0gJy8nIHx8CisgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwKSA9PSAnXFwnKSkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworICBlbHNlCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZmlsZW5hbWUsIDAsIHNlcCAtIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcm5hbWUpKTsKK30KKworCisvKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFVOSVggdXNlciBJRCBtYXRjaGVzIHRoZSBVSUQgb2YKKyAqIHRoZSBwcm9jZXNzLiBTaG91bGQgYWx3YXlzIHJldHVybiAjRkFMU0Ugb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVTklYIHVzZXIgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoaXMgdWlkIG93bnMgdGhlIHByb2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfcHJvY2Vzc19vd25lciAoZGJ1c191aWRfdCB1aWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QgX2RidXNfd2luZG93c191c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgdW5peCBlbXVsYXRpb24gZnVuY3Rpb25zIC0gc2hvdWxkIGJlIHJlbW92ZWQgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIGlzIGF0IHRoZSBjb25zb2xlLgorICogU2hvdWxkIGFsd2F5cyBmYWlsIG9uIFdpbmRvd3MgKHNldCB0aGUgZXJyb3IgdG8KKyAqICNEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpLgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgIlVOSVggdXNlciBJRHMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzXG4iKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogUGFyc2UgYSBVTklYIGdyb3VwIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUgdGV4dAorICogQHBhcmFtIGdpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgZ2lkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIHVzZXIgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUgdGV4dAorICogQHBhcmFtIHVpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgdWlkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVU5JWCB1c2VyIElELiBPbiBVTklYLAorICoganVzdCBjYWxscyBfZGJ1c19ncm91cHNfZnJvbV91aWQoKS4gT24gV2luZG93cywgc2hvdWxkIGFsd2F5cworICogZmFpbCBzaW5jZSB3ZSBkb24ndCBrbm93IGFueSBVTklYIGdyb3Vwcy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVSUQKKyAqIEBwYXJhbSBncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBvZiBncm91cCBJRHMKKyAqIEBwYXJhbSBuX2dyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworCisKKy8qKiBAfSAqLyAvKiBEQnVzU3RyaW5nIHN0dWZmICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBlcnJvciBoYW5kbGluZworIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworCisvKiBsYW4gbWFuYWdlciBlcnJvciBjb2RlcyAqLworY29uc3QgY2hhcioKK19kYnVzX2xtX3N0cmVycm9yKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisgIHN3aXRjaCAoZXJyb3JfbnVtYmVyKQorICAgIHsKKyAgICBjYXNlIE5FUlJfTmV0Tm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIHdvcmtzdGF0aW9uIGRyaXZlciBpcyBub3QgaW5zdGFsbGVkLiI7CisgICAgY2FzZSBORVJSX1Vua25vd25TZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgY291bGQgbm90IGJlIGxvY2F0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2hhcmVNZW06CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgbmV0d29yayBjYW5ub3QgYWNjZXNzIGEgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiI7CisgICAgY2FzZSBORVJSX05vTmV0d29ya1Jlc291cmNlOgorICAgICAgcmV0dXJuICJBIG5ldHdvcmsgcmVzb3VyY2Ugc2hvcnRhZ2Ugb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfUmVtb3RlT25seToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB3b3Jrc3RhdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90UmVkaXJlY3RlZDoKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiI7CisgICAgY2FzZSBORVJSX1NlcnZlck5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBTZXJ2ZXIgc2VydmljZSBpcyBub3Qgc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9JdGVtTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBxdWV1ZSBpcyBlbXB0eS4iOworICAgIGNhc2UgTkVSUl9Vbmtub3duRGV2RGlyOgorICAgICAgcmV0dXJuICJUaGUgZGV2aWNlIG9yIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9SZWRpcmVjdGVkUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBpbnZhbGlkIG9uIGEgcmVkaXJlY3RlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9EdXBsaWNhdGVTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfTm9Sb29tOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdXQgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55SXRlbXM6CisgICAgICByZXR1cm4gIlJlcXVlc3RlZCBhZGRpdGlvbiBvZiBpdGVtcyBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZE1heFVzZXJzOgorICAgICAgcmV0dXJuICJUaGUgUGVlciBzZXJ2aWNlIHN1cHBvcnRzIG9ubHkgdHdvIHNpbXVsdGFuZW91cyB1c2Vycy4iOworICAgIGNhc2UgTkVSUl9CdWZUb29TbWFsbDoKKyAgICAgIHJldHVybiAiVGhlIEFQSSByZXR1cm4gYnVmZmVyIGlzIHRvbyBzbWFsbC4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVFcnI6CisgICAgICByZXR1cm4gIkEgcmVtb3RlIEFQSSBlcnJvciBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9MYW5tYW5JbmlFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBvcGVuaW5nIG9yIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iOworICAgIGNhc2UgTkVSUl9OZXR3b3JrRXJyb3I6CisgICAgICByZXR1cm4gIkEgZ2VuZXJhbCBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX1drc3RhSW5jb25zaXN0ZW50U3RhdGU6CisgICAgICByZXR1cm4gIlRoZSBXb3Jrc3RhdGlvbiBzZXJ2aWNlIGlzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gUmVzdGFydCB0aGUgY29tcHV0ZXIgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIFdvcmtzdGF0aW9uIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfV2tzdGFOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgV29ya3N0YXRpb24gc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Ccm93c2VyTm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiI7CisgICAgY2FzZSBORVJSX0ludGVybmFsRXJyb3I6CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0JhZFRyYW5zYWN0Q29uZmlnOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIG5vdCBjb25maWd1cmVkIGZvciB0cmFuc2FjdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZEFQSToKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBBUEkgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgcmVtb3RlIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9CYWRFdmVudE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBldmVudCBuYW1lIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfRHVwTmFtZVJlYm9vdDoKKyAgICAgIHJldHVybiAiVGhlIGNvbXB1dGVyIG5hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhlIG5ldHdvcmsuIENoYW5nZSBpdCBhbmQgcmVzdGFydCB0aGUgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfQ2ZnQ29tcE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfQ2ZnUGFyYW1Ob3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiI7CisgICAgY2FzZSBORVJSX0xpbmVUb29Mb25nOgorICAgICAgcmV0dXJuICJBIGxpbmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gbG9uZy4iOworICAgIGNhc2UgTkVSUl9RTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0pvYk5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgam9iIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0Rlc3ROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZGVzdGluYXRpb24gY2Fubm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0Rlc3RFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1FFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIHF1ZXVlIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1FOb1Jvb206CisgICAgICByZXR1cm4gIk5vIG1vcmUgcHJpbnRlcnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0pvYk5vUm9vbToKKyAgICAgIHJldHVybiAiTm8gbW9yZSBwcmludCBqb2JzIGNhbiBiZSBhZGRlZC4iOworICAgIGNhc2UgTkVSUl9EZXN0Tm9Sb29tOgorICAgICAgcmV0dXJuICJObyBtb3JlIHByaW50ZXIgZGVzdGluYXRpb25zIGNhbiBiZSBhZGRlZC4iOworICAgIGNhc2UgTkVSUl9EZXN0SWRsZToKKyAgICAgIHJldHVybiAiVGhpcyBwcmludGVyIGRlc3RpbmF0aW9uIGlzIGlkbGUgYW5kIGNhbm5vdCBhY2NlcHQgY29udHJvbCBvcGVyYXRpb25zLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJbnZhbGlkT3A6CisgICAgICByZXR1cm4gIlRoaXMgcHJpbnRlciBkZXN0aW5hdGlvbiByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgY29udHJvbCBmdW5jdGlvbi4iOworICAgIGNhc2UgTkVSUl9Qcm9jTm9SZXNwb25kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgcHJvY2Vzc29yIGlzIG5vdCByZXNwb25kaW5nLiI7CisgICAgY2FzZSBORVJSX1Nwb29sZXJOb3RMb2FkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzcG9vbGVyIGlzIG5vdCBydW5uaW5nLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50IGRlc3RpbmF0aW9uIGluIGl0cyBjdXJyZW50IHN0YXRlLiI7CisgICAgY2FzZSBORVJSX1FJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50ZXIgcXVldWUgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfSm9iSW52YWxpZFN0YXRlOgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIHRoZSBwcmludCBqb2IgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfU3Bvb2xOb01lbW9yeToKKyAgICAgIHJldHVybiAiQSBzcG9vbGVyIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfRHJpdmVyTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2UgZHJpdmVyIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0RhdGFUeXBlSW52YWxpZDoKKyAgICAgIHJldHVybiAiVGhlIGRhdGEgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwcmludCBwcm9jZXNzb3IuIjsKKyAgICBjYXNlIE5FUlJfUHJvY05vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgcHJvY2Vzc29yIGlzIG5vdCBpbnN0YWxsZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZVRhYmxlTG9ja2VkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBkYXRhYmFzZSBpcyBsb2NrZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZVRhYmxlRnVsbDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgdGFibGUgaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlSW5zdGFsbGVkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIHNlcnZpY2UgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VFbnRyeUxvY2tlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byBjb250cm9sIGFjdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZU5vdEluc3RhbGxlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkU2VydmljZU5hbWU6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlQ3RsVGltZW91dDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgaXMgbm90IHJlc3BvbmRpbmcgdG8gdGhlIGNvbnRyb2wgZnVuY3Rpb24uIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUN0bEJ1c3k6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGNvbnRyb2wgaXMgYnVzeS4iOworICAgIGNhc2UgTkVSUl9CYWRTZXJ2aWNlUHJvZ05hbWU6CisgICAgICByZXR1cm4gIlRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMgYW4gaW52YWxpZCBzZXJ2aWNlIHByb2dyYW0gbmFtZS4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90Q3RybDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY291bGQgbm90IGJlIGNvbnRyb2xsZWQgaW4gaXRzIHByZXNlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUtpbGxQcm9jOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBlbmRlZCBhYm5vcm1hbGx5LiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VDdGxOb3RWYWxpZDoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBwYXVzZSBvciBzdG9wIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX05vdEluRGlzcGF0Y2hUYmw6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGNvbnRyb2wgZGlzcGF0Y2hlciBjb3VsZCBub3QgZmluZCB0aGUgc2VydmljZSBuYW1lIGluIHRoZSBkaXNwYXRjaCB0YWJsZS4iOworICAgIGNhc2UgTkVSUl9CYWRDb250cm9sUmVjdjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBkaXNwYXRjaGVyIHBpcGUgcmVhZCBmYWlsZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZU5vdFN0YXJ0aW5nOgorICAgICAgcmV0dXJuICJBIHRocmVhZCBmb3IgdGhlIG5ldyBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlMb2dnZWRPbjoKKyAgICAgIHJldHVybiAiVGhpcyB3b3Jrc3RhdGlvbiBpcyBhbHJlYWR5IGxvZ2dlZCBvbiB0byB0aGUgbG9jYWwtYXJlYSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX05vdExvZ2dlZE9uOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gaXMgbm90IGxvZ2dlZCBvbiB0byB0aGUgbG9jYWwtYXJlYSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX0JhZFVzZXJuYW1lOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBuYW1lIG9yIGdyb3VwIG5hbWUgcGFyYW1ldGVyIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkUGFzc3dvcmQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0FkZE5hbWVfVzoKKyAgICAgIHJldHVybiAiQFcgVGhlIGxvZ29uIHByb2Nlc3NvciBkaWQgbm90IGFkZCB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0FkZE5hbWVfRjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHByb2Nlc3NvciBkaWQgbm90IGFkZCB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0RlbE5hbWVfVzoKKyAgICAgIHJldHVybiAiQFcgVGhlIGxvZ29mZiBwcm9jZXNzb3IgZGlkIG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgYWxpYXMuIjsKKyAgICBjYXNlIE5FUlJfVW5hYmxlVG9EZWxOYW1lX0Y6CisgICAgICByZXR1cm4gIlRoZSBsb2dvZmYgcHJvY2Vzc29yIGRpZCBub3QgZGVsZXRlIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX0xvZ29uc1BhdXNlZDoKKyAgICAgIHJldHVybiAiTmV0d29yayBsb2dvbnMgYXJlIHBhdXNlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dvblNlcnZlckNvbmZsaWN0OgorICAgICAgcmV0dXJuICJBIGNlbnRyYWxpemVkIGxvZ29uLXNlcnZlciBjb25mbGljdCBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dvbk5vVXNlclBhdGg6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB3aXRob3V0IGEgdmFsaWQgdXNlciBwYXRoLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2NyaXB0RXJyb3I6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgb3IgcnVubmluZyB0aGUgbG9nb24gc2NyaXB0LiI7CisgICAgY2FzZSBORVJSX1N0YW5kYWxvbmVMb2dvbjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHNlcnZlciB3YXMgbm90IHNwZWNpZmllZC4gWW91ciBjb21wdXRlciB3aWxsIGJlIGxvZ2dlZCBvbiBhcyBTVEFOREFMT05FLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2VydmVyTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBsb2dvbiBzZXJ2ZXIgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0xvZ29uRG9tYWluRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGVyZSBpcyBhbHJlYWR5IGEgbG9nb24gZG9tYWluIGZvciB0aGlzIGNvbXB1dGVyLiI7CisgICAgY2FzZSBORVJSX05vblZhbGlkYXRlZExvZ29uOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gc2VydmVyIGNvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgbG9nb24uIjsKKyAgICBjYXNlIE5FUlJfQUNGTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzZWN1cml0eSBkYXRhYmFzZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfR3JvdXBOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGdyb3VwIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1VzZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUmVzb3VyY2VOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHJlc291cmNlIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0dyb3VwRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgZ3JvdXAgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfVXNlckV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9SZXNvdXJjZUV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHJlc291cmNlIHBlcm1pc3Npb24gbGlzdCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9Ob3RQcmltYXJ5OgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gdGhlIHByaW1hcnkgZG9tYWluIGNvbnRyb2xsZXIgb2YgdGhlIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb3RMb2FkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZWN1cml0eSBkYXRhYmFzZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb1Jvb206CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB0b28gbWFueSBuYW1lcyBpbiB0aGUgdXNlciBhY2NvdW50cyBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9BQ0ZGaWxlSU9GYWlsOgorICAgICAgcmV0dXJuICJBIGRpc2sgSS9PIGZhaWx1cmUgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfQUNGVG9vTWFueUxpc3RzOgorICAgICAgcmV0dXJuICJUaGUgbGltaXQgb2YgNjQgZW50cmllcyBwZXIgcmVzb3VyY2Ugd2FzIGV4Y2VlZGVkLiI7CisgICAgY2FzZSBORVJSX1VzZXJMb2dvbjoKKyAgICAgIHJldHVybiAiRGVsZXRpbmcgYSB1c2VyIHdpdGggYSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLiI7CisgICAgY2FzZSBORVJSX0FDRk5vUGFyZW50OgorICAgICAgcmV0dXJuICJUaGUgcGFyZW50IGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgbG9jYXRlZC4iOworICAgIGNhc2UgTkVSUl9DYW5Ob3RHcm93U2VnbWVudDoKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGFkZCB0byB0aGUgc2VjdXJpdHkgZGF0YWJhc2Ugc2Vzc2lvbiBjYWNoZSBzZWdtZW50LiI7CisgICAgY2FzZSBORVJSX1NwZUdyb3VwT3A6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHRoaXMgc3BlY2lhbCBncm91cC4iOworICAgIGNhc2UgTkVSUl9Ob3RJbkNhY2hlOgorICAgICAgcmV0dXJuICJUaGlzIHVzZXIgaXMgbm90IGNhY2hlZCBpbiB1c2VyIGFjY291bnRzIGRhdGFiYXNlIHNlc3Npb24gY2FjaGUuIjsKKyAgICBjYXNlIE5FUlJfVXNlckluR3JvdXA6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGFscmVhZHkgYmVsb25ncyB0byB0aGlzIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX1VzZXJOb3RJbkdyb3VwOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBncm91cC4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50VW5kZWZpbmVkOgorICAgICAgcmV0dXJuICJUaGlzIHVzZXIgYWNjb3VudCBpcyB1bmRlZmluZWQuIjsKKyAgICBjYXNlIE5FUlJfQWNjb3VudEV4cGlyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBhY2NvdW50IGhhcyBleHBpcmVkLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRXb3Jrc3RhdGlvbjoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gbG9nIG9uIGZyb20gdGhpcyB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTG9nb25Ib3VyczoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gbG9nIG9uIGF0IHRoaXMgdGltZS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEV4cGlyZWQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgaGFzIGV4cGlyZWQuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRDYW50Q2hhbmdlOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgb2YgdGhpcyB1c2VyIGNhbm5vdCBjaGFuZ2UuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRIaXN0Q29uZmxpY3Q6CisgICAgICByZXR1cm4gIlRoaXMgcGFzc3dvcmQgY2Fubm90IGJlIHVzZWQgbm93LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vU2hvcnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBwYXNzd29yZCBwb2xpY3kgcmVxdWlyZW1lbnRzLiBDaGVjayB0aGUgbWluaW11bSBwYXNzd29yZCBsZW5ndGgsIHBhc3N3b3JkIGNvbXBsZXhpdHkgYW5kIHBhc3N3b3JkIGhpc3RvcnkgcmVxdWlyZW1lbnRzLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vUmVjZW50OgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgb2YgdGhpcyB1c2VyIGlzIHRvbyByZWNlbnQgdG8gY2hhbmdlLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWREYXRhYmFzZToKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGlzIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9EYXRhYmFzZVVwVG9EYXRlOgorICAgICAgcmV0dXJuICJObyB1cGRhdGVzIGFyZSBuZWNlc3NhcnkgdG8gdGhpcyByZXBsaWNhbnQgbmV0d29yay9sb2NhbCBzZWN1cml0eSBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9TeW5jUmVxdWlyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgcmVwbGljYW50IGRhdGFiYXNlIGlzIG91dGRhdGVkOyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQuIjsKKyAgICBjYXNlIE5FUlJfVXNlTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0JhZEFzZ1R5cGU6CisgICAgICByZXR1cm4gIlRoaXMgYXNnX3R5cGUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VJc1NoYXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGJlaW5nIHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9Ob0NvbXB1dGVyTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGNvbXB1dGVyIG5hbWUgY291bGQgbm90IGJlIGFkZGVkIGFzIGEgbWVzc2FnZSBhbGlhcy4gVGhlIG5hbWUgbWF5IGFscmVhZHkgZXhpc3Qgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfTXNnQWxyZWFkeVN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBNZXNzZW5nZXIgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfTXNnSW5pdEZhaWxlZDoKKyAgICAgIHJldHVybiAiVGhlIE1lc3NlbmdlciBzZXJ2aWNlIGZhaWxlZCB0byBzdGFydC4iOworICAgIGNhc2UgTkVSUl9OYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIGFsaWFzIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9BbHJlYWR5Rm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgaGFzIGFscmVhZHkgYmVlbiBmb3J3YXJkZWQuIjsKKyAgICBjYXNlIE5FUlJfQWRkRm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgaGFzIGJlZW4gYWRkZWQgYnV0IGlzIHN0aWxsIGZvcndhcmRlZC4iOworICAgIGNhc2UgTkVSUl9BbHJlYWR5RXhpc3RzOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgYWxyZWFkeSBleGlzdHMgbG9jYWxseS4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55TmFtZXM6CisgICAgICByZXR1cm4gIlRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRlZCBtZXNzYWdlIGFsaWFzZXMgaGFzIGJlZW4gZXhjZWVkZWQuIjsKKyAgICBjYXNlIE5FUlJfRGVsQ29tcHV0ZXJOYW1lOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iOworICAgIGNhc2UgTkVSUl9Mb2NhbEZvcndhcmQ6CisgICAgICByZXR1cm4gIk1lc3NhZ2VzIGNhbm5vdCBiZSBmb3J3YXJkZWQgYmFjayB0byB0aGUgc2FtZSB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9HcnBNc2dQcm9jZXNzb3I6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBkb21haW4gbWVzc2FnZSBwcm9jZXNzb3IuIjsKKyAgICBjYXNlIE5FUlJfUGF1c2VkUmVtb3RlOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSB3YXMgc2VudCwgYnV0IHRoZSByZWNpcGllbnQgaGFzIHBhdXNlZCB0aGUgTWVzc2VuZ2VyIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfQmFkUmVjZWl2ZToKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2Ugd2FzIHNlbnQgYnV0IG5vdCByZWNlaXZlZC4iOworICAgIGNhc2UgTkVSUl9OYW1lSW5Vc2U6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIGFsaWFzIGlzIGN1cnJlbnRseSBpbiB1c2UuIFRyeSBhZ2FpbiBsYXRlci4iOworICAgIGNhc2UgTkVSUl9Nc2dOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgTWVzc2VuZ2VyIHNlcnZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9jYWxOYW1lOgorICAgICAgcmV0dXJuICJUaGUgbmFtZSBpcyBub3Qgb24gdGhlIGxvY2FsIGNvbXB1dGVyLiI7CisgICAgY2FzZSBORVJSX05vRm9yd2FyZE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBmb3J3YXJkZWQgbWVzc2FnZSBhbGlhcyBjb3VsZCBub3QgYmUgZm91bmQgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfUmVtb3RlRnVsbDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgdGFibGUgb24gdGhlIHJlbW90ZSBzdGF0aW9uIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTmFtZU5vdEZvcndhcmRlZDoKKyAgICAgIHJldHVybiAiTWVzc2FnZXMgZm9yIHRoaXMgYWxpYXMgYXJlIG5vdCBjdXJyZW50bHkgYmVpbmcgZm9yd2FyZGVkLiI7CisgICAgY2FzZSBORVJSX1RydW5jYXRlZEJyb2FkY2FzdDoKKyAgICAgIHJldHVybiAiVGhlIGJyb2FkY2FzdCBtZXNzYWdlIHdhcyB0cnVuY2F0ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZERldmljZToKKyAgICAgIHJldHVybiAiVGhpcyBpcyBhbiBpbnZhbGlkIGRldmljZSBuYW1lLiI7CisgICAgY2FzZSBORVJSX1dyaXRlRmF1bHQ6CisgICAgICByZXR1cm4gIkEgd3JpdGUgZmF1bHQgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfRHVwbGljYXRlTmFtZToKKyAgICAgIHJldHVybiAiQSBkdXBsaWNhdGUgbWVzc2FnZSBhbGlhcyBleGlzdHMgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfRGVsZXRlTGF0ZXI6CisgICAgICByZXR1cm4gIkBXIFRoaXMgbWVzc2FnZSBhbGlhcyB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXIuIjsKKyAgICBjYXNlIE5FUlJfSW5jb21wbGV0ZURlbDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgd2FzIG5vdCBzdWNjZXNzZnVsbHkgZGVsZXRlZCBmcm9tIGFsbCBuZXR3b3Jrcy4iOworICAgIGNhc2UgTkVSUl9NdWx0aXBsZU5ldHM6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gY29tcHV0ZXJzIHdpdGggbXVsdGlwbGUgbmV0d29ya3MuIjsKKyAgICBjYXNlIE5FUlJfTmV0TmFtZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGlzIHNoYXJlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VOb3RTaGFyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGlzIG5vdCBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfQ2xpZW50TmFtZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJBIHNlc3Npb24gZG9lcyBub3QgZXhpc3Qgd2l0aCB0aGF0IGNvbXB1dGVyIG5hbWUuIjsKKyAgICBjYXNlIE5FUlJfRmlsZUlkTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIG5vdCBhbiBvcGVuIGZpbGUgd2l0aCB0aGF0IGlkZW50aWZpY2F0aW9uIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9FeGVjRmFpbHVyZToKKyAgICAgIHJldHVybiAiQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gZXhlY3V0aW5nIGEgcmVtb3RlIGFkbWluaXN0cmF0aW9uIGNvbW1hbmQuIjsKKyAgICBjYXNlIE5FUlJfVG1wRmlsZToKKyAgICAgIHJldHVybiAiQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gb3BlbmluZyBhIHJlbW90ZSB0ZW1wb3JhcnkgZmlsZS4iOworICAgIGNhc2UgTkVSUl9Ub29NdWNoRGF0YToKKyAgICAgIHJldHVybiAiVGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBhIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBjb21tYW5kIGhhcyBiZWVuIHRydW5jYXRlZCB0byA2NEsuIjsKKyAgICBjYXNlIE5FUlJfRGV2aWNlU2hhcmVDb25mbGljdDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgY2Fubm90IGJlIHNoYXJlZCBhcyBib3RoIGEgc3Bvb2xlZCBhbmQgYSBub24tc3Bvb2xlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9Ccm93c2VyVGFibGVJbmNvbXBsZXRlOgorICAgICAgcmV0dXJuICJUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGxpc3Qgb2Ygc2VydmVycyBtYXkgYmUgaW5jb3JyZWN0LiI7CisgICAgY2FzZSBORVJSX05vdExvY2FsRG9tYWluOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgaXMgbm90IGFjdGl2ZSBpbiB0aGlzIGRvbWFpbi4iOworI2lmZGVmIE5FUlJfSXNEZnNTaGFyZQorCisgICAgY2FzZSBORVJSX0lzRGZzU2hhcmU6CisgICAgICByZXR1cm4gIlRoZSBzaGFyZSBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgRGlzdHJpYnV0ZWQgRmlsZSBTeXN0ZW0gYmVmb3JlIGl0IGNhbiBiZSBkZWxldGVkLiI7CisjZW5kaWYKKworICAgIGNhc2UgTkVSUl9EZXZJbnZhbGlkT3BDb2RlOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIGludmFsaWQgZm9yIHRoaXMgZGV2aWNlLiI7CisgICAgY2FzZSBORVJSX0Rldk5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBjYW5ub3QgYmUgc2hhcmVkLiI7CisgICAgY2FzZSBORVJSX0Rldk5vdE9wZW46CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIHdhcyBub3Qgb3Blbi4iOworICAgIGNhc2UgTkVSUl9CYWRRdWV1ZURldlN0cmluZzoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgbmFtZSBsaXN0IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkUXVldWVQcmlvcml0eToKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIHByaW9yaXR5IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfTm9Db21tRGV2czoKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIG5vIHNoYXJlZCBjb21tdW5pY2F0aW9uIGRldmljZXMuIjsKKyAgICBjYXNlIE5FUlJfUXVldWVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIHlvdSBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGV2U3RyaW5nOgorICAgICAgcmV0dXJuICJUaGlzIGxpc3Qgb2YgZGV2aWNlcyBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0JhZERldjoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9JblVzZUJ5U3Bvb2xlcjoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIHNwb29sZXIuIjsKKyAgICBjYXNlIE5FUlJfQ29tbURldkluVXNlOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZSBhcyBhIGNvbW11bmljYXRpb24gZGV2aWNlLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRDb21wdXRlcjoKKyAgICAgIHJldHVybiAiVGhpcyBjb21wdXRlciBuYW1lIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfTWF4TGVuRXhjZWVkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzdHJpbmcgYW5kIHByZWZpeCBzcGVjaWZpZWQgYXJlIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX0JhZENvbXBvbmVudDoKKyAgICAgIHJldHVybiAiVGhpcyBwYXRoIGNvbXBvbmVudCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0NhbnRUeXBlOgorICAgICAgcmV0dXJuICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGlucHV0LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlFbnRyaWVzOgorICAgICAgcmV0dXJuICJUaGUgYnVmZmVyIGZvciB0eXBlcyBpcyBub3QgYmlnIGVub3VnaC4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlRmlsZVRvb0JpZzoKKyAgICAgIHJldHVybiAiUHJvZmlsZSBmaWxlcyBjYW5ub3QgZXhjZWVkIDY0Sy4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlT2Zmc2V0OgorICAgICAgcmV0dXJuICJUaGUgc3RhcnQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZS4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlQ2xlYW51cDoKKyAgICAgIHJldHVybiAiVGhlIHN5c3RlbSBjYW5ub3QgZGVsZXRlIGN1cnJlbnQgY29ubmVjdGlvbnMgdG8gbmV0d29yayByZXNvdXJjZXMuIjsKKyAgICBjYXNlIE5FUlJfUHJvZmlsZVVua25vd25DbWQ6CisgICAgICByZXR1cm4gIlRoZSBzeXN0ZW0gd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGluIHRoaXMgZmlsZS4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlTG9hZEVycjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgcHJvZmlsZSBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVTYXZlRXJyOgorICAgICAgcmV0dXJuICJAVyBFcnJvcnMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSBwcm9maWxlIGZpbGUuIFRoZSBwcm9maWxlIHdhcyBwYXJ0aWFsbHkgc2F2ZWQuIjsKKyAgICBjYXNlIE5FUlJfTG9nT3ZlcmZsb3c6CisgICAgICByZXR1cm4gIkxvZyBmaWxlICUxIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTG9nRmlsZUNoYW5nZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbG9nIGZpbGUgaGFzIGNoYW5nZWQgYmV0d2VlbiByZWFkcy4iOworICAgIGNhc2UgTkVSUl9Mb2dGaWxlQ29ycnVwdDoKKyAgICAgIHJldHVybiAiTG9nIGZpbGUgJTEgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9Tb3VyY2VJc0RpcjoKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBwYXRoIGNhbm5vdCBiZSBhIGRpcmVjdG9yeS4iOworICAgIGNhc2UgTkVSUl9CYWRTb3VyY2U6CisgICAgICByZXR1cm4gIlRoZSBzb3VyY2UgcGF0aCBpcyBpbGxlZ2FsLiI7CisgICAgY2FzZSBORVJSX0JhZERlc3Q6CisgICAgICByZXR1cm4gIlRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIGlsbGVnYWwuIjsKKyAgICBjYXNlIE5FUlJfRGlmZmVyZW50U2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcGF0aHMgYXJlIG9uIGRpZmZlcmVudCBzZXJ2ZXJzLiI7CisgICAgY2FzZSBORVJSX1J1blNydlBhdXNlZDoKKyAgICAgIHJldHVybiAiVGhlIFJ1biBzZXJ2ZXIgeW91IHJlcXVlc3RlZCBpcyBwYXVzZWQuIjsKKyAgICBjYXNlIE5FUlJfRXJyQ29tbVJ1blNydjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggYSBSdW4gc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0Vycm9yRXhlY2luZ0dob3N0OgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHN0YXJ0aW5nIGEgYmFja2dyb3VuZCBwcm9jZXNzLiI7CisgICAgY2FzZSBORVJSX1NoYXJlTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzaGFyZWQgcmVzb3VyY2UgeW91IGFyZSBjb25uZWN0ZWQgdG8gY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRMYW5hOgorICAgICAgcmV0dXJuICJUaGUgTEFOIGFkYXB0ZXIgbnVtYmVyIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfT3BlbkZpbGVzOgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgb3BlbiBmaWxlcyBvbiB0aGUgY29ubmVjdGlvbi4iOworICAgIGNhc2UgTkVSUl9BY3RpdmVDb25uczoKKyAgICAgIHJldHVybiAiQWN0aXZlIGNvbm5lY3Rpb25zIHN0aWxsIGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0JhZFBhc3N3b3JkQ29yZToKKyAgICAgIHJldHVybiAiVGhpcyBzaGFyZSBuYW1lIG9yIHBhc3N3b3JkIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfRGV2SW5Vc2U6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQgYnkgYW4gYWN0aXZlIHByb2Nlc3MuIjsKKyAgICBjYXNlIE5FUlJfTG9jYWxEcml2ZToKKyAgICAgIHJldHVybiAiVGhlIGRyaXZlIGxldHRlciBpcyBpbiB1c2UgbG9jYWxseS4iOworICAgIGNhc2UgTkVSUl9BbGVydEV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBjbGllbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlBbGVydHM6CisgICAgICByZXR1cm4gIlRoZSBhbGVydCB0YWJsZSBpcyBmdWxsLiI7CisgICAgY2FzZSBORVJSX05vU3VjaEFsZXJ0OgorICAgICAgcmV0dXJuICJBbiBpbnZhbGlkIG9yIG5vbmV4aXN0ZW50IGFsZXJ0IG5hbWUgd2FzIHJhaXNlZC4iOworICAgIGNhc2UgTkVSUl9CYWRSZWNpcGllbnQ6CisgICAgICByZXR1cm4gIlRoZSBhbGVydCByZWNpcGllbnQgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9BY2N0TGltaXRFeGNlZWRlZDoKKyAgICAgIHJldHVybiAiQSB1c2VyJ3Mgc2Vzc2lvbiB3aXRoIHRoaXMgc2VydmVyIGhhcyBiZWVuIGRlbGV0ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZExvZ1NlZWs6CisgICAgICByZXR1cm4gIlRoZSBsb2cgZmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1ZXN0ZWQgcmVjb3JkIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9CYWRVYXNDb25maWc6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkVUFTT3A6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgd2hlbiB0aGUgTmV0bG9nb24gc2VydmljZSBpcyBydW5uaW5nLiI7CisgICAgY2FzZSBORVJSX0xhc3RBZG1pbjoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgb24gdGhlIGxhc3QgYWRtaW5pc3RyYXRpdmUgYWNjb3VudC4iOworICAgIGNhc2UgTkVSUl9EQ05vdEZvdW5kOgorICAgICAgcmV0dXJuICJDb3VsZCBub3QgZmluZCBkb21haW4gY29udHJvbGxlciBmb3IgdGhpcyBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfTG9nb25UcmFja2luZ0Vycm9yOgorICAgICAgcmV0dXJuICJDb3VsZCBub3Qgc2V0IGxvZ29uIGluZm9ybWF0aW9uIGZvciB0aGlzIHVzZXIuIjsKKyAgICBjYXNlIE5FUlJfTmV0bG9nb25Ob3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgTmV0bG9nb24gc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9DYW5Ob3RHcm93VUFTRmlsZToKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGFkZCB0byB0aGUgdXNlciBhY2NvdW50cyBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9UaW1lRGlmZkF0REM6CisgICAgICByZXR1cm4gIlRoaXMgc2VydmVyJ3MgY2xvY2sgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcmltYXJ5IGRvbWFpbiBjb250cm9sbGVyJ3MgY2xvY2suIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRNaXNtYXRjaDoKKyAgICAgIHJldHVybiAiQSBwYXNzd29yZCBtaXNtYXRjaCBoYXMgYmVlbiBkZXRlY3RlZC4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hTZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhIHZhbGlkIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hTZXNzaW9uOgorICAgICAgcmV0dXJuICJUaGUgc2Vzc2lvbiBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgc2Vzc2lvbi4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hDb25uZWN0aW9uOgorICAgICAgcmV0dXJuICJUaGUgY29ubmVjdGlvbiBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgY29ubmVjdGlvbi4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55U2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm8gc3BhY2UgZm9yIGFub3RoZXIgZW50cnkgaW4gdGhlIHRhYmxlIG9mIGF2YWlsYWJsZSBzZXJ2ZXJzLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlTZXNzaW9uczoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBoYXMgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgaXQgc3VwcG9ydHMuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUNvbm5lY3Rpb25zOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGhhcyByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBpdCBzdXBwb3J0cy4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55RmlsZXM6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgY2Fubm90IG9wZW4gbW9yZSBmaWxlcyBiZWNhdXNlIGl0IGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9Ob0FsdGVybmF0ZVNlcnZlcnM6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSBubyBhbHRlcm5hdGUgc2VydmVycyByZWdpc3RlcmVkIG9uIHRoaXMgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX1RyeURvd25MZXZlbDoKKyAgICAgIHJldHVybiAiVHJ5IGRvd24tbGV2ZWwgKHJlbW90ZSBhZG1pbiBwcm90b2NvbCkgdmVyc2lvbiBvZiBBUEkgaW5zdGVhZC4iOworICAgIGNhc2UgTkVSUl9VUFNEcml2ZXJOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIGRyaXZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQgYnkgdGhlIFVQUyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX1VQU0ludmFsaWRDb25maWc6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuIjsKKyAgICBjYXNlIE5FUlJfVVBTSW52YWxpZENvbW1Qb3J0OgorICAgICAgcmV0dXJuICJUaGUgVVBTIHNlcnZpY2UgY291bGQgbm90IGFjY2VzcyB0aGUgc3BlY2lmaWVkIENvbW0gUG9ydC4iOworICAgIGNhc2UgTkVSUl9VUFNTaWduYWxBc3NlcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIFVQUyBpbmRpY2F0ZWQgYSBsaW5lIGZhaWwgb3IgbG93IGJhdHRlcnkgc2l0dWF0aW9uLiBTZXJ2aWNlIG5vdCBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX1VQU1NodXRkb3duRmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIHNlcnZpY2UgZmFpbGVkIHRvIHBlcmZvcm0gYSBzeXN0ZW0gc2h1dCBkb3duLiI7CisgICAgY2FzZSBORVJSX0JhZERvc1JldENvZGU6CisgICAgICByZXR1cm4gIlRoZSBwcm9ncmFtIGJlbG93IHJldHVybmVkIGFuIE1TLURPUyBlcnJvciBjb2RlOiI7CisgICAgY2FzZSBORVJSX1Byb2dOZWVkc0V4dHJhTWVtOgorICAgICAgcmV0dXJuICJUaGUgcHJvZ3JhbSBiZWxvdyBuZWVkcyBtb3JlIG1lbW9yeToiOworICAgIGNhc2UgTkVSUl9CYWREb3NGdW5jdGlvbjoKKyAgICAgIHJldHVybiAiVGhlIHByb2dyYW0gYmVsb3cgY2FsbGVkIGFuIHVuc3VwcG9ydGVkIE1TLURPUyBmdW5jdGlvbjoiOworICAgIGNhc2UgTkVSUl9SZW1vdGVCb290RmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gZmFpbGVkIHRvIGJvb3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkRmlsZUNoZWNrU3VtOgorICAgICAgcmV0dXJuICJUaGUgZmlsZSBiZWxvdyBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX05vUnBsQm9vdFN5c3RlbToKKyAgICAgIHJldHVybiAiTm8gbG9hZGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgYm9vdC1ibG9jayBkZWZpbml0aW9uIGZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUnBsTG9hZHJOZXRCaW9zRXJyOgorICAgICAgcmV0dXJuICJOZXRCSU9TIHJldHVybmVkIGFuIGVycm9yOiAgICAgIFRoZSBOQ0IgYW5kIFNNQiBhcmUgZHVtcGVkIGFib3ZlLiI7CisgICAgY2FzZSBORVJSX1JwbExvYWRyRGlza0VycjoKKyAgICAgIHJldHVybiAiQSBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9JbWFnZVBhcmFtRXJyOgorICAgICAgcmV0dXJuICJJbWFnZSBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uIGZhaWxlZC4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55SW1hZ2VQYXJhbXM6CisgICAgICByZXR1cm4gIlRvbyBtYW55IGltYWdlIHBhcmFtZXRlcnMgY3Jvc3MgZGlzayBzZWN0b3IgYm91bmRhcmllcy4iOworICAgIGNhc2UgTkVSUl9Ob25Eb3NGbG9wcHlVc2VkOgorICAgICAgcmV0dXJuICJUaGUgaW1hZ2Ugd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbSBhbiBNUy1ET1MgZGlza2V0dGUgZm9ybWF0dGVkIHdpdGggL1MuIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFJlc3RhcnQ6CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHdpbGwgYmUgcmVzdGFydGVkIGxhdGVyLiI7CisgICAgY2FzZSBORVJSX1JwbFNydnJDYWxsRmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgY2FsbCB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIgZmFpbGVkLiI7CisgICAgY2FzZSBORVJSX0NhbnRDb25uZWN0UnBsU3J2cjoKKyAgICAgIHJldHVybiAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0NhbnRPcGVuSW1hZ2VGaWxlOgorICAgICAgcmV0dXJuICJDYW5ub3Qgb3BlbiBpbWFnZSBmaWxlIG9uIHRoZSBSZW1vdGVib290IHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9DYWxsaW5nUnBsU3J2cjoKKyAgICAgIHJldHVybiAiQ29ubmVjdGluZyB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuLi4iOworICAgIGNhc2UgTkVSUl9TdGFydGluZ1JwbEJvb3Q6CisgICAgICByZXR1cm4gIkNvbm5lY3RpbmcgdG8gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLi4uIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFNlcnZpY2VUZXJtOgorICAgICAgcmV0dXJuICJSZW1vdGUgYm9vdCBzZXJ2aWNlIHdhcyBzdG9wcGVkOyBjaGVjayB0aGUgZXJyb3IgbG9nIGZvciB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0uIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFN0YXJ0RmFpbGVkOgorICAgICAgcmV0dXJuICJSZW1vdGUgYm9vdCBzdGFydHVwIGZhaWxlZDsgY2hlY2sgdGhlIGVycm9yIGxvZyBmb3IgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtLiI7CisgICAgY2FzZSBORVJSX1JQTF9DT05ORUNURUQ6CisgICAgICByZXR1cm4gIkEgc2Vjb25kIGNvbm5lY3Rpb24gdG8gYSBSZW1vdGVib290IHJlc291cmNlIGlzIG5vdCBhbGxvd2VkLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJDb25maWd1cmVkVG9Ob3RSdW46CisgICAgICByZXR1cm4gIlRoZSBicm93c2VyIHNlcnZpY2Ugd2FzIGNvbmZpZ3VyZWQgd2l0aCBNYWludGFpblNlcnZlckxpc3Q9Tm8uIjsKKyAgICBjYXNlIE5FUlJfUnBsTm9BZGFwdGVyc1N0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0IHNpbmNlIG5vbmUgb2YgdGhlIG5ldHdvcmsgYWRhcHRlcnMgc3RhcnRlZCB3aXRoIHRoaXMgc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9ScGxCYWRSZWdpc3RyeToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgZHVlIHRvIGJhZCBzdGFydHVwIGluZm9ybWF0aW9uIGluIHRoZSByZWdpc3RyeS4iOworICAgIGNhc2UgTkVSUl9ScGxCYWREYXRhYmFzZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgYmVjYXVzZSBpdHMgZGF0YWJhc2UgaXMgYWJzZW50IG9yIGNvcnJ1cHQuIjsKKyAgICBjYXNlIE5FUlJfUnBsUnBsZmlsZXNTaGFyZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgYmVjYXVzZSBSUExGSUxFUyBzaGFyZSBpcyBhYnNlbnQuIjsKKyAgICBjYXNlIE5FUlJfUnBsTm90UnBsU2VydmVyOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIFJQTFVTRVIgZ3JvdXAgaXMgYWJzZW50LiI7CisgICAgY2FzZSBORVJSX1JwbENhbm5vdEVudW06CisgICAgICByZXR1cm4gIkNhbm5vdCBlbnVtZXJhdGUgc2VydmljZSByZWNvcmRzLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiV29ya3N0YXRpb24gcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxXa3N0YU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxXa3N0YU5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiV29ya3N0YXRpb24gbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiUHJvZmlsZSByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiUHJvZmlsZSByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJQcm9maWxlIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgcHJvZmlsZS4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlTm90RW1wdHk6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB3b3Jrc3RhdGlvbnMgdXNpbmcgdGhpcyBwcm9maWxlLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ0luZm9Db3JydXB0ZWQ6CisgICAgICByZXR1cm4gIkNvbmZpZ3VyYXRpb24gcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxDb25maWdOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxBZGFwdGVySW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQWRhcHRlciBJRCByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbEludGVybmFsOgorICAgICAgcmV0dXJuICJBbiBpbnRlcm5hbCBzZXJ2aWNlIGVycm9yIGhhcyBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9ScGxWZW5kb3JJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJWZW5kb3IgSUQgcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290SW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQm9vdCBibG9jayByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTmVlZHNVc2VyQWNjdDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudCBmb3IgdGhpcyB3b3Jrc3RhdGlvbiByZWNvcmQgaXMgbWlzc2luZy4iOworICAgIGNhc2UgTkVSUl9ScGxOZWVkc1JQTFVTRVJBY2N0OgorICAgICAgcmV0dXJuICJUaGUgUlBMVVNFUiBsb2NhbCBncm91cCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJCb290IGJsb2NrIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbEluY29tcGF0aWJsZVByb2ZpbGU6CisgICAgICByZXR1cm4gIkNob3NlbiBwcm9maWxlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgd29ya3N0YXRpb24uIjsKKyAgICBjYXNlIE5FUlJfUnBsQWRhcHRlck5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiQ2hvc2VuIG5ldHdvcmsgYWRhcHRlciBJRCBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxDb25maWdOb3RFbXB0eToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHByb2ZpbGVzIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxCb290SW5Vc2U6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB3b3Jrc3RhdGlvbnMsIHByb2ZpbGVzLCBvciBjb25maWd1cmF0aW9ucyB1c2luZyB0aGlzIGJvb3QgYmxvY2suIjsKKyAgICBjYXNlIE5FUlJfUnBsQmFja3VwRGF0YWJhc2U6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIGJhY2t1cCBSZW1vdGVib290IGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1JwbEFkYXB0ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiQWRhcHRlciByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxWZW5kb3JOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVmVuZG9yIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvck5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiVmVuZG9yIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgdmVuZG9yIHJlY29yZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290TmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICIoYm9vdCBuYW1lLCB2ZW5kb3IgSUQpIGlzIGluIHVzZSBieSBzb21lIG90aGVyIGJvb3QgYmxvY2sgcmVjb3JkLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiBuYW1lIGlzIGluIHVzZSBieSBzb21lIG90aGVyIGNvbmZpZ3VyYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfRGZzSW50ZXJuYWxDb3JydXB0aW9uOgorICAgICAgcmV0dXJuICJUaGUgaW50ZXJuYWwgZGF0YWJhc2UgbWFpbnRhaW5lZCBieSB0aGUgRGZzIHNlcnZpY2UgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVEYXRhQ29ycnVwdDoKKyAgICAgIHJldHVybiAiT25lIG9mIHRoZSByZWNvcmRzIGluIHRoZSBpbnRlcm5hbCBEZnMgZGF0YWJhc2UgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIG5vIERGUyBuYW1lIHdob3NlIGVudHJ5IHBhdGggbWF0Y2hlcyB0aGUgaW5wdXQgRW50cnkgUGF0aC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVBbHJlYWR5RXhpc3RzOgorICAgICAgcmV0dXJuICJBIHJvb3Qgb3IgbGluayB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX0Rmc0FscmVhZHlTaGFyZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgc2hhcmUgc3BlY2lmaWVkIGlzIGFscmVhZHkgc2hhcmVkIGluIHRoZSBEZnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm9TdWNoU2hhcmU6CisgICAgICByZXR1cm4gIlRoZSBpbmRpY2F0ZWQgc2VydmVyIHNoYXJlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluZGljYXRlZCBERlMgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc05vdEFMZWFmVm9sdW1lOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCB2YWxpZCBvbiB0aGlzIHBvcnRpb24gb2YgdGhlIG5hbWVzcGFjZS4iOworICAgIGNhc2UgTkVSUl9EZnNMZWFmVm9sdW1lOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCB2YWxpZCBvbiB0aGlzIHBvcnRpb24gb2YgdGhlIG5hbWVzcGFjZS4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVIYXNNdWx0aXBsZVNlcnZlcnM6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgYW1iaWd1b3VzIGJlY2F1c2UgdGhlIGxpbmsgaGFzIG11bHRpcGxlIHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ2FudENyZWF0ZUp1bmN0aW9uUG9pbnQ6CisgICAgICByZXR1cm4gIlVuYWJsZSB0byBjcmVhdGUgYSBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc1NlcnZlck5vdERmc0F3YXJlOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIG5vdCBEZnMgQXdhcmUuIjsKKyAgICBjYXNlIE5FUlJfRGZzQmFkUmVuYW1lUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCByZW5hbWUgdGFyZ2V0IHBhdGggaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVJc09mZmxpbmU6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgREZTIGxpbmsgaXMgb2ZmbGluZS4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hTZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgc2VydmVyIGlzIG5vdCBhIHNlcnZlciBmb3IgdGhpcyBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc0N5Y2xpY2FsTmFtZToKKyAgICAgIHJldHVybiAiQSBjeWNsZSBpbiB0aGUgRGZzIG5hbWUgd2FzIGRldGVjdGVkLiI7CisgICAgY2FzZSBORVJSX0Rmc05vdFN1cHBvcnRlZEluU2VydmVyRGZzOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gYSBzZXJ2ZXItYmFzZWQgRGZzLiI7CisgICAgY2FzZSBORVJSX0Rmc0R1cGxpY2F0ZVNlcnZpY2U6CisgICAgICByZXR1cm4gIlRoaXMgbGluayBpcyBhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIHNlcnZlci1zaGFyZS4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50UmVtb3ZlTGFzdFNlcnZlclNoYXJlOgorICAgICAgcmV0dXJuICJDYW4ndCByZW1vdmUgdGhlIGxhc3Qgc2VydmVyLXNoYXJlIHN1cHBvcnRpbmcgdGhpcyByb290IG9yIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzVm9sdW1lSXNJbnRlckRmczoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbiBJbnRlci1ERlMgbGluay4iOworICAgIGNhc2UgTkVSUl9EZnNJbmNvbnNpc3RlbnQ6CisgICAgICByZXR1cm4gIlRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgRGZzIFNlcnZpY2UgaGFzIGJlY29tZSBpbmNvbnNpc3RlbnQuIjsKKyAgICBjYXNlIE5FUlJfRGZzU2VydmVyVXBncmFkZWQ6CisgICAgICByZXR1cm4gIlRoZSBEZnMgU2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQgb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfRGZzRGF0YUlzSWRlbnRpY2FsOgorICAgICAgcmV0dXJuICJUaGUgRGZzIGRhdGEgYmVpbmcgcmVjb25jaWxlZCBpcyBpZGVudGljYWwuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ2FudFJlbW92ZURmc1Jvb3Q6CisgICAgICByZXR1cm4gIlRoZSBERlMgcm9vdCBjYW5ub3QgYmUgZGVsZXRlZC4gVW5pbnN0YWxsIERGUyBpZiByZXF1aXJlZC4iOworICAgIGNhc2UgTkVSUl9EZnNDaGlsZE9yUGFyZW50SW5EZnM6CisgICAgICByZXR1cm4gIkEgY2hpbGQgb3IgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgc2hhcmUgaXMgYWxyZWFkeSBpbiBhIERmcy4iOworICAgIGNhc2UgTkVSUl9EZnNJbnRlcm5hbEVycm9yOgorICAgICAgcmV0dXJuICJEZnMgaW50ZXJuYWwgZXJyb3IuIjsKKyAgICAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBkZWZpbmVkIGluIG1pbmd3ICovCisjaWYgMAorCisgICAgY2FzZSBORVJSX1NldHVwQWxyZWFkeUpvaW5lZDoKKyAgICAgIHJldHVybiAiVGhpcyBtYWNoaW5lIGlzIGFscmVhZHkgam9pbmVkIHRvIGEgZG9tYWluLiI7CisgICAgY2FzZSBORVJSX1NldHVwTm90Sm9pbmVkOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgbm90IGN1cnJlbnRseSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfU2V0dXBEb21haW5Db250cm9sbGVyOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgYSBkb21haW4gY29udHJvbGxlciBhbmQgY2Fubm90IGJlIHVuam9pbmVkIGZyb20gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfRGVmYXVsdEpvaW5SZXF1aXJlZDoKKyAgICAgIHJldHVybiAiVGhlIGRlc3RpbmF0aW9uIGRvbWFpbiBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRpbmcgbWFjaGluZSBhY2NvdW50cyBpbiBPVXMuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZFdvcmtncm91cE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgd29ya2dyb3VwIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9OYW1lVXNlc0luY29tcGF0aWJsZUNvZGVQYWdlOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNvbXB1dGVyIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdXNlZCBvbiB0aGUgZG9tYWluIGNvbnRyb2xsZXIuIjsKKyAgICBjYXNlIE5FUlJfQ29tcHV0ZXJBY2NvdW50Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcHV0ZXIgYWNjb3VudCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUGVyc29uYWxTa3U6CisgICAgICByZXR1cm4gIlRoaXMgdmVyc2lvbiBvZiBXaW5kb3dzIGNhbm5vdCBiZSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRNdXN0Q2hhbmdlOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgbXVzdCBjaGFuZ2UgYXQgdGhlIG5leHQgbG9nb24uIjsKKyAgICBjYXNlIE5FUlJfQWNjb3VudExvY2tlZE91dDoKKyAgICAgIHJldHVybiAiVGhlIGFjY291bnQgaXMgbG9ja2VkIG91dC4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZFRvb0xvbmc6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBpcyB0b28gbG9uZy4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE5vdENvbXBsZXhFbm91Z2g6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBjb21wbGV4aXR5IHBvbGljeS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEZpbHRlckVycm9yOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwYXNzd29yZCBmaWx0ZXIgRExMcy4iOworI2VuZGlmCisKKyAgICB9CisgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworICBpZiAobXNnID09IE5VTEwpCisgICAgbXNnID0gInVua25vd24iOworCisgIHJldHVybiBtc2c7CisjZW5kaWYgLy9EQlVTX1dJTkNFCit9CisKKy8qKgorICogR2V0IGEgcHJpbnRhYmxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb21tYW5kIHVzZWQgdG8gZXhlY3V0ZQorICogdGhlIHByb2Nlc3Mgd2l0aCBwaWQuICBUaGlzIHN0cmluZyBzaG91bGQgb25seSBiZSB1c2VkIGZvcgorICogaW5mb3JtYXRpdmUgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nOyBpdCBtYXkgbm90IGJlIHRydXN0ZWQuCisgKgorICogVGhlIGNvbW1hbmQgaXMgZ3VhcmFudGVlZCB0byBiZSBwcmludGFibGUgQVNDSUkgYW5kIG5vIGxvbmdlcgorICogdGhhbiBtYXhfbGVuLgorICoKKyAqIEBwYXJhbSBwaWQgUHJvY2VzcyBpZAorICogQHBhcmFtIHN0ciBBcHBlbmQgY29tbWFuZCB0byB0aGlzIHN0cmluZworICogQHBhcmFtIG1heF9sZW4gTWF4aW11bSBsZW5ndGggb2YgcmV0dXJuZWQgY29tbWFuZAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbW1hbmRfZm9yX3BpZCAodW5zaWduZWQgbG9uZyAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1heF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICAvLyBGSVhNRQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiByZXBsYWNlcyB0aGUgdGVybSBEQlVTX1BSRUZJWCBpbiBjb25maWd1cmVfdGltZV9wYXRoIGJ5IHRoZQorICogY3VycmVudCBkYnVzIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIE9uIHVuaXggdGhpcyBmdW5jdGlvbiBpcyBhIG5vb3AKKyAqCisgKiBAcGFyYW0gY29uZmlndXJlX3RpbWVfcGF0aAorICogQHJldHVybiByZWFsIHBhdGgKKyAqLworY29uc3QgY2hhciAqCitfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4IChjb25zdCBjaGFyICpjb25maWd1cmVfdGltZV9wYXRoKQoreworI2lmbmRlZiBEQlVTX1BSRUZJWAorICByZXR1cm4gY29uZmlndXJlX3RpbWVfcGF0aDsKKyNlbHNlCisgIHN0YXRpYyBjaGFyIHJldHZhbFsxMDAwXTsKKyAgc3RhdGljIGNoYXIgcnVudGltZV9wcmVmaXhbMTAwMF07CisgIGludCBsZW4gPSAxMDAwOworICBpbnQgaTsKKworICBpZiAoIWNvbmZpZ3VyZV90aW1lX3BhdGgpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChydW50aW1lX3ByZWZpeCwgbGVuKSB8fAorICAgICAgIHN0cm5jbXAgKGNvbmZpZ3VyZV90aW1lX3BhdGgsIERCVVNfUFJFRklYICIvIiwKKyAgICAgICAgICAgICAgICBzdHJsZW4gKERCVVNfUFJFRklYKSArIDEpKSkgeworICAgICBzdHJuY3B5IChyZXR2YWwsIGNvbmZpZ3VyZV90aW1lX3BhdGgsIHNpemVvZiAocmV0dmFsKSAtIDEpOworICAgICAvKiBzdHJuY3B5IGRvZXMgbm90IGd1YXJhbnRlZSB0byAwLXRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgIHJldHZhbFtzaXplb2YgKHJldHZhbCkgLSAxXSA9ICdcMCc7CisgIH0gZWxzZSB7CisgICAgIHNpemVfdCByZW1haW5pbmc7CisKKyAgICAgc3RybmNweSAocmV0dmFsLCBydW50aW1lX3ByZWZpeCwgc2l6ZW9mIChyZXR2YWwpIC0gMSk7CisgICAgIHJldHZhbFtzaXplb2YgKHJldHZhbCkgLSAxXSA9ICdcMCc7CisgICAgIHJlbWFpbmluZyA9IHNpemVvZiAocmV0dmFsKSAtIDEgLSBzdHJsZW4gKHJldHZhbCk7CisgICAgIHN0cm5jYXQgKHJldHZhbCwKKyAgICAgICAgIGNvbmZpZ3VyZV90aW1lX3BhdGggKyBzdHJsZW4gKERCVVNfUFJFRklYKSArIDEsCisgICAgICAgICByZW1haW5pbmcpOworICB9CisKKyAgLyogU29tZWhvdywgaW4gc29tZSBzaXR1YXRpb25zLCBiYWNrc2xhc2hlcyBnZXQgY29sbGFwc2VkIGluIHRoZSBzdHJpbmcuCisgICAqIFNpbmNlIHdpbmRvd3MgQyBsaWJyYXJ5IGFjY2VwdHMgYm90aCBmb3J3YXJkIGFuZCBiYWNrc2xhc2hlcyBhcworICAgKiBwYXRoIHNlcGFyYXRvcnMsIGNvbnZlcnQgYWxsIGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcy4KKyAgICovCisKKyAgZm9yKGkgPSAwOyByZXR2YWxbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYocmV0dmFsW2ldID09ICdcXCcpCisgICAgICByZXR2YWxbaV0gPSAnLyc7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorfQorCisvKioKKyAqIHJldHVybiB0aGUgcmVsb2NhdGVkIERBVEFESVIKKyAqCisgKiBAcmV0dXJucyByZWxvY2F0ZWQgREFUQURJUiBzdGF0aWMgc3RyaW5nCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorX2RidXNfd2luZG93c19nZXRfZGF0YWRpciAodm9pZCkKK3sKKwlyZXR1cm4gX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeChEQlVTX0RBVEFESVIpOworfQorCisjdW5kZWYgREJVU19EQVRBRElSCisjZGVmaW5lIERCVVNfREFUQURJUiBfZGJ1c193aW5kb3dzX2dldF9kYXRhZGlyICgpCisKKworI2RlZmluZSBEQlVTX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiAiL2RidXMtMS9zZXJ2aWNlcyIKKyNkZWZpbmUgREJVU19TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUiAiL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiCisKKy8qKgorICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlyZWN0b3JpZXMgZm9yIGEgc2Vzc2lvbiBidXMgdG8gbG9vayBmb3Igc2VydmljZQorICogYWN0aXZhdGlvbiBmaWxlcworICoKKyAqIE9uIFdpbmRvd3MgdGhpcyBzaG91bGQgYmUgZGF0YSBkaXJlY3RvcmllczoKKyAqCisgKiAlQ29tbW9uUHJvZ3JhbUZpbGVzJS9kYnVzCisgKgorICogYW5kCisgKgorICogcmVsb2NhdGVkIERCVVNfREFUQURJUgorICoKKyAqIEBwYXJhbSBkaXJzIHRoZSBkaXJlY3RvcnkgbGlzdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NCisgKi8KKworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpCit7CisgIGNvbnN0IGNoYXIgKmNvbW1vbl9wcm9nczsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlZGlyX3BhdGg7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlcnZpY2VkaXJfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgREJVU19XSU5DRQorICB7CisgICAgLyogT24gV2luZG93cyBDRSwgd2UgYWRqdXN0IGRhdGFkaXIgZHluYW1pY2FsbHkgdG8gaW5zdGFsbGF0aW9uIGxvY2F0aW9uLiAgKi8KKyAgICBjb25zdCBjaGFyICpkYXRhX2RpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfREFUQURJUiIpOworCisgICAgaWYgKGRhdGFfZGlyICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgZGF0YV9kaXIpKQorICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IpKQorICAgICAgICAgIGdvdG8gb29tOworICAgICAgfQorICB9CisjZWxzZQorLyoKKyB0aGUgY29kZSBmb3IgYWNjZXNzaW5nIHNlcnZpY2VzIHJlcXVpcmVzIGFic29sdXRlIGJhc2UgcGF0aGVzCisgaW4gY2FzZSBEQlVTX0RBVEFESVIgaXMgcmVsYXRpdmUgbWFrZSBpdCBhYnNvbHV0ZQorKi8KKyNpZmRlZiBEQlVTX1dJTgorICB7CisgICAgREJ1c1N0cmluZyBwOworCisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZwLCBEQlVTX0RBVEFESVIpOworCisgICAgaWYgKCFfZGJ1c19wYXRoX2lzX2Fic29sdXRlICgmcCkpCisgICAgICB7CisgICAgICAgIGNoYXIgaW5zdGFsbF9yb290WzEwMDBdOworICAgICAgICBpZiAoX2RidXNfZ2V0X2luc3RhbGxfcm9vdCAoaW5zdGFsbF9yb290LCBzaXplb2YoaW5zdGFsbF9yb290KSkpCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBpbnN0YWxsX3Jvb3QpKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICB9CisgIH0KKyNlbmRpZgorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIERCVVNfREFUQURJUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBfREJVU19QQVRIX1NFUEFSQVRPUikpCisgICAgZ290byBvb207CisjZW5kaWYKKworICBjb21tb25fcHJvZ3MgPSBfZGJ1c19nZXRlbnYgKCJDb21tb25Qcm9ncmFtRmlsZXMiKTsKKworICBpZiAoY29tbW9uX3Byb2dzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBjb21tb25fcHJvZ3MpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBfREJVU19QQVRIX1NFUEFSQVRPUikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIV9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlyZWN0b3JpZXMgZm9yIGEgc3lzdGVtIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlCisgKiBhY3RpdmF0aW9uIGZpbGVzCisgKgorICogT24gVU5JWCB0aGlzIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgeGRnIGZyZWVkZXNrdG9wLm9yZyBkYXRhIGRpcmVjdG9yaWVzOgorICoKKyAqIFhER19EQVRBX0RJUlM9JHtYREdfREFUQV9ESVJTLS91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZX0KKyAqCisgKiBhbmQKKyAqCisgKiBEQlVTX0RBVEFESVIKKyAqCisgKiBPbiBXaW5kb3dzIHRoZXJlIGlzIG5vIHN5c3RlbSBidXMgYW5kIHRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBub3RoaW5nLgorICoKKyAqIEBwYXJhbSBkaXJzIHRoZSBkaXJlY3RvcnkgbGlzdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NCisgKi8KKworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKERCdXNMaXN0ICoqZGlycykKK3sKKyAgKmRpcnMgPSBOVUxMOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZSAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lKQoreworICBEQnVzU3RyaW5nIHRtcDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHN0ciwgX2RidXNfd2luZG93c19nZXRfZGF0YWRpciAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCAiZGJ1cy0xIik7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChzdHIsICZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcCwgYmFzZW5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoc3RyLCAmdG1wKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzeXN0ZW0uY29uZiBmaWxlCisgKiAodGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBvbiBXaW5kb3dzIHNvIHRoaXMgY2FuIGp1c3QKKyAqIHJldHVybiBGQUxTRSBhbmQgcHJpbnQgYSB3YXJuaW5nIG9yIHNvbWV0aGluZykKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZShzdHIsICJzeXN0ZW0uY29uZiIpOworfQorCisvKioKKyAqIEFwcGVuZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc2Vzc2lvbi5jb25mIGZpbGUuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3Nlc3Npb25fY29uZmlnX2ZpbGUgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKHN0ciwgInNlc3Npb24uY29uZiIpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzYxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy11dGlsLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXV0aWwuYyBUZXN0cyBmb3IgZGJ1cy1zeXNkZXBzLmggQVBJCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIERCVVNfV0lOCisgIC8qIGRvIG5vdGhpbmcsIGl0J3MgaW4gc3RkbGliLmggKi8KKyNlbGlmIChkZWZpbmVkIF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZWxzZQorZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworI2VuZGlmCisKKy8qKgorICogR2V0cyBhICNOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBrZXk9dmFsdWUgcGFpcnMgZnJvbSB0aGUKKyAqIGVudmlyb25tZW50LiBVc2UgZGJ1c19mcmVlX3N0cmluZ19hcnJheSB0byBmcmVlIGl0LgorICoKKyAqIEByZXR1cm5zIHRoZSBlbnZpcm9ubWVudCBvciAjTlVMTCBvbiBPT00KKyAqLworY2hhciAqKgorX2RidXNfZ2V0X2Vudmlyb25tZW50ICh2b2lkKQoreworICBpbnQgaSwgbGVuZ3RoOworICBjaGFyICoqZW52aXJvbm1lbnQ7CisKKyAgX2RidXNfYXNzZXJ0IChlbnZpcm9uICE9IE5VTEwpOworCisgIGZvciAobGVuZ3RoID0gMDsgZW52aXJvbltsZW5ndGhdICE9IE5VTEw7IGxlbmd0aCsrKTsKKworICAvKiBBZGQgb25lIGZvciBOVUxMICovCisgIGxlbmd0aCsrOworCisgIGVudmlyb25tZW50ID0gZGJ1c19uZXcwIChjaGFyICosIGxlbmd0aCk7CisKKyAgaWYgKGVudmlyb25tZW50ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgZW52aXJvbltpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZW52aXJvbm1lbnRbaV0gPSBfZGJ1c19zdHJkdXAgKGVudmlyb25baV0pOworCisgICAgICBpZiAoZW52aXJvbm1lbnRbaV0gPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChlbnZpcm9uW2ldICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgZW52aXJvbm1lbnQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gZW52aXJvbm1lbnQ7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworc3RhdGljIHZvaWQKK2NoZWNrX2Rpcm5hbWUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmLCBkOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lICgmZiwgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmZCwgZGlybmFtZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZvciBmaWxlbmFtZSBcIiVzXCIgZ290IGRpcm5hbWUgXCIlc1wiIGFuZCBleHBlY3RlZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmQpLAorICAgICAgICAgICAgICAgICAgZGlybmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BhdGhfYWJzb2x1dGUgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBleHBlY3RlZCkKK3sKKyAgREJ1c1N0cmluZyBwOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcCwgcGF0aCk7CisKKyAgaWYgKF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSAhPSBleHBlY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRm9yIHBhdGggXCIlc1wiIGV4cGVjdGVkIGFic29sdXRlID0gJWQgZ290ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcGF0aCwgZXhwZWN0ZWQsIF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBkYnVzLXN5c2RlcHMuYy4KKyAqIAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N5c2RlcHNfdGVzdCAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19kaXJuYW1lICgiZm9vXFxiYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXFxcYmFyIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vL1xcL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvb1xcYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyXFwiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXGJhci8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyXFxcXCIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIlxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXFxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFxcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFwvIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvXFwvIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFxmb29cXGJhciIsICJjOlxcZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOlxcZm9vIiwgImM6XFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6L2ZvbyIsICJjOi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFwiLCAiYzpcXCIpOworICBjaGVja19kaXJuYW1lICgiYzovIiwgImM6LyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2Vsc2UgIAorICBjaGVja19kaXJuYW1lICgiZm9vIiwgIi4iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy8vYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyLy8vLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2Jhci8vLy8vLy8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvZm9vIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi8vLy9mb28iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby8vYmFyIiwgIi9mb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi9mb28vLy9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiLyIsICIvIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvLy8iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19wYXRoX2Fic29sdXRlICgiYzovIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOi9mb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIiIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvbyIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvby9iYXIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb29cXGJhciIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFwiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFxmb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6IiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOlxcZm9vXFxiYXIiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIlxcIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisjZWxzZSAgCisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvZm9vIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28iLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28vYmFyIiwgRkFMU0UpOworI2VuZGlmCisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgYi9kYnVzL2RidXMtc3lzZGVwcy13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkyNjdlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMKQEAgLTAsMCArMSwzNzA5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5jIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUGV0ZXIgS8O8bW1lbCAgPHN5bnRoZXRpY3BwQGdteC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXN0aWFuIEVocmxpY2hlciA8Y2guZWhybGljaGVyQGdteC5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjZGVmaW5lIFNUUlNBRkVfTk9fREVQUkVDQVRFCisKKyNpZm5kZWYgREJVU19XSU5DRQorI2lmbmRlZiBfV0lOMzJfV0lOTlQKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDUwMQorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGEuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtc29ja2V0cy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLW5vbmNlLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisjaW5jbHVkZSA8aXBobHBhcGkuaD4KKworLyogRGVjbGFyYXRpb25zIG1pc3NpbmcgaW4gbWluZ3cncyBhbmQgd2luZG93cyBzZGsgNy4wIGhlYWRlcnMgKi8KK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U3RyaW5nU2lkVG9TaWRBIChMUENTVFIgIFN0cmluZ1NpZCwgUFNJRCAqU2lkKTsKK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U2lkVG9TdHJpbmdTaWRBIChQU0lEIFNpZCwgTFBTVFIgKlN0cmluZ1NpZCk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmbmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8bWJzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1dTMlRDUElQX0gKKy8qIGdldGFkZHJpbmZvIGZvciBXaW5kb3dzIENFIChhbmQgV2luZG93cykuICAqLworI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2lmbmRlZiBQUk9DRVNTX1FVRVJZX0xJTUlURURfSU5GT1JNQVRJT04KKy8qIE1pbkdXMzIgPCA0IGRvZXMgbm90IGRlZmluZSB0aGlzIHZhbHVlIGluIGl0cyBoZWFkZXJzICovCisjZGVmaW5lIFBST0NFU1NfUVVFUllfTElNSVRFRF9JTkZPUk1BVElPTiAoMHgxMDAwKQorI2VuZGlmCisKK3R5cGVkZWYgaW50IHNvY2tsZW5fdDsKKworCit2b2lkCitfZGJ1c193aW5fc2V0X2Vycm5vIChpbnQgZXJyKQoreworI2lmZGVmIERCVVNfV0lOQ0UKKyAgU2V0TGFzdEVycm9yIChlcnIpOworI2Vsc2UKKyAgZXJybm8gPSBlcnI7CisjZW5kaWYKK30KKworc3RhdGljIEJPT0wgaXNfd2lueHBfc3AzX29yX2xvd2VyKCk7CisKKy8qCisgKiBfTUlCX1RDUFJPV19FWCBhbmQgZnJpZW5kcyBhcmUgbm90IGF2YWlsYWJsZSBpbiBzeXN0ZW0gaGVhZGVycworICogIGFuZCBhcmUgbWFwcGVkIHRvIGF0dHJpYnV0ZSBpZGVudGljYWwgLi4uT1dORVJfUElEIHR5cGVkZWZzLgorICovCit0eXBlZGVmIE1JQl9UQ1BST1dfT1dORVJfUElEIF9NSUJfVENQUk9XX0VYOwordHlwZWRlZiBNSUJfVENQVEFCTEVfT1dORVJfUElEIE1JQl9UQ1BUQUJMRV9FWDsKK3R5cGVkZWYgUE1JQl9UQ1BUQUJMRV9PV05FUl9QSUQgUE1JQl9UQ1BUQUJMRV9FWDsKK3R5cGVkZWYgRFdPUkQgKFdJTkFQSSAqUHJvY0FsbG9jYXRlQW5kR2V0VGNwRXh0VGFibGVGcm9tU3RhY2spKFBNSUJfVENQVEFCTEVfRVgqLEJPT0wsSEFORExFLERXT1JELERXT1JEKTsKK3N0YXRpYyBQcm9jQWxsb2NhdGVBbmRHZXRUY3BFeHRUYWJsZUZyb21TdGFjayBscGZuQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrID0gTlVMTDsKKworLyoqCisgKiBBbGxvY2F0ZUFuZEdldFRjcEV4VGFibGVGcm9tU3RhY2soKSBpcyB1bmRvY3VtZW50ZWQgYW5kIG5vdCBleHBvcnRlZCwKKyAqIGJ1dCBpcyB0aGUgb25seSB3YXkgdG8gZG8gdGhpcyBpbiBvbGRlciBYUCB2ZXJzaW9ucy4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2VkdXJlcyBjb3VsZCBiZSBsb2FkZWQKKyAqLworc3RhdGljIEJPT0wKK2xvYWRfZXhfaXBfaGVscGVyX3Byb2NlZHVyZXModm9pZCkKK3sKKyAgSE1PRFVMRSBoTW9kdWxlID0gTG9hZExpYnJhcnkgKCJpcGhscGFwaS5kbGwiKTsKKyAgaWYgKGhNb2R1bGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY291bGQgbm90IGxvYWQgaXBobHBhcGkuZGxsXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbHBmbkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayA9IChQcm9jQWxsb2NhdGVBbmRHZXRUY3BFeHRUYWJsZUZyb21TdGFjaylHZXRQcm9jQWRkcmVzcyAoaE1vZHVsZSwgIkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayIpOworICBpZiAobHBmbkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgZmluZCBmdW5jdGlvbiBBbGxvY2F0ZUFuZEdldFRjcEV4VGFibGVGcm9tU3RhY2sgaW4gaXBobHBhcGkuZGxsXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdldCBwaWQgZnJvbSBsb2NhbGhvc3QgdGNwIGNvbm5lY3Rpb24gdXNpbmcgcGVlcl9wb3J0CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbiBXaW5YUCA+PSBTUDMKKyAqIEBwYXJhbSBwZWVyX3BvcnQgcGVlcnMgdGNwIHBvcnQKKyAqIEByZXR1cm4gcHJvY2VzcyBpZCBvciAwIGlmIGNvbm5lY3Rpb24gaGFzIG5vdCBiZWVuIGZvdW5kCisgKi8KK3N0YXRpYyBkYnVzX3BpZF90CitnZXRfcGlkX2Zyb21fZXh0ZW5kZWRfdGNwX3RhYmxlKGludCBwZWVyX3BvcnQpCit7CisgIGRidXNfcGlkX3QgcmVzdWx0OworICBEV09SRCBlcnJvckNvZGUsIHNpemUgPSAwLCBpOworICBNSUJfVENQVEFCTEVfT1dORVJfUElEICp0Y3BfdGFibGU7CisKKyAgaWYgKChlcnJvckNvZGUgPQorICAgICAgIEdldEV4dGVuZGVkVGNwVGFibGUgKE5VTEwsICZzaXplLCBUUlVFLCBBRl9JTkVULCBUQ1BfVEFCTEVfT1dORVJfUElEX0FMTCwgMCkpID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpCisgICAgeworICAgICAgdGNwX3RhYmxlID0gKE1JQl9UQ1BUQUJMRV9PV05FUl9QSUQgKikgZGJ1c19tYWxsb2MgKHNpemUpOworICAgICAgaWYgKHRjcF90YWJsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoInVuZXhwZWN0ZWQgZXJyb3IgcmV0dXJuZWQgZnJvbSBHZXRFeHRlbmRlZFRjcFRhYmxlIiwgZXJyb3JDb2RlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoKGVycm9yQ29kZSA9IEdldEV4dGVuZGVkVGNwVGFibGUgKHRjcF90YWJsZSwgJnNpemUsIFRSVUUsIEFGX0lORVQsIFRDUF9UQUJMRV9PV05FUl9QSURfQUxMLCAwKSkgIT0gTk9fRVJST1IpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGZldGNoaW5nIHRjcCB0YWJsZSAlZFxuIiwgKGludCllcnJvckNvZGUpOworICAgICAgZGJ1c19mcmVlICh0Y3BfdGFibGUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJlc3VsdCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB0Y3BfdGFibGUtPmR3TnVtRW50cmllczsgaSsrKQorICAgIHsKKyAgICAgIE1JQl9UQ1BST1dfT1dORVJfUElEICpwID0gJnRjcF90YWJsZS0+dGFibGVbaV07CisgICAgICBpbnQgbG9jYWxfYWRkcmVzcyA9IG50b2hsIChwLT5kd0xvY2FsQWRkcik7CisgICAgICBpbnQgbG9jYWxfcG9ydCA9IG50b2hzIChwLT5kd0xvY2FsUG9ydCk7CisgICAgICBpZiAocC0+ZHdTdGF0ZSA9PSBNSUJfVENQX1NUQVRFX0VTVEFCCisgICAgICAgICAgJiYgbG9jYWxfYWRkcmVzcyA9PSBJTkFERFJfTE9PUEJBQ0sgJiYgbG9jYWxfcG9ydCA9PSBwZWVyX3BvcnQpCisgICAgICAgICByZXN1bHQgPSBwLT5kd093bmluZ1BpZDsKKyAgICB9CisKKyAgZGJ1c19mcmVlICh0Y3BfdGFibGUpOworICBfZGJ1c192ZXJib3NlICgiZ290IHBpZCAlbHVcbiIsIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZ2V0IHBpZCBmcm9tIGxvY2FsaG9zdCB0Y3AgY29ubmVjdGlvbiB1c2luZyBwZWVyX3BvcnQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9uIGFsbCBXaW5YUCB2ZXJzaW9ucywgYnV0CisgKiBub3QgaW4gd2luZSAoYXQgbGVhc3QgdmVyc2lvbiA8PSAxLjYuMCkKKyAqIEBwYXJhbSBwZWVyX3BvcnQgcGVlcnMgdGNwIHBvcnQKKyAqIEByZXR1cm4gcHJvY2VzcyBpZCBvciAwIGlmIGNvbm5lY3Rpb24gaGFzIG5vdCBiZWVuIGZvdW5kCisgKi8KK3N0YXRpYyBkYnVzX3BpZF90CitnZXRfcGlkX2Zyb21fdGNwX2V4X3RhYmxlKGludCBwZWVyX3BvcnQpCit7CisgIGRidXNfcGlkX3QgcmVzdWx0OworICBEV09SRCBlcnJvckNvZGUsIGk7CisgIFBNSUJfVENQVEFCTEVfRVggdGNwX3RhYmxlID0gTlVMTDsKKworICBpZiAoIWxvYWRfZXhfaXBfaGVscGVyX3Byb2NlZHVyZXMgKCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZQorICAgICAgICAoIkVycm9yIG5vdCBiZWVuIGFibGUgdG8gbG9hZCBpcGhlbHBlciBwcm9jZWR1cmVzXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBlcnJvckNvZGUgPSBscGZuQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrICgmdGNwX3RhYmxlLCBUUlVFLCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAyKTsKKworICBpZiAoZXJyb3JDb2RlICE9IE5PX0VSUk9SKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UKKyAgICAgICAgKCJFcnJvciBub3QgYmVlbiBhYmxlIHRvIGNhbGwgQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrKClcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJlc3VsdCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB0Y3BfdGFibGUtPmR3TnVtRW50cmllczsgaSsrKQorICAgIHsKKyAgICAgIF9NSUJfVENQUk9XX0VYICpwID0gJnRjcF90YWJsZS0+dGFibGVbaV07CisgICAgICBpbnQgbG9jYWxfcG9ydCA9IG50b2hzIChwLT5kd0xvY2FsUG9ydCk7CisgICAgICBpbnQgbG9jYWxfYWRkcmVzcyA9IG50b2hsIChwLT5kd0xvY2FsQWRkcik7CisgICAgICBpZiAobG9jYWxfYWRkcmVzcyA9PSBJTkFERFJfTE9PUEJBQ0sgJiYgbG9jYWxfcG9ydCA9PSBwZWVyX3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgPSBwLT5kd093bmluZ1BpZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGNwX3RhYmxlKTsKKyAgX2RidXNfdmVyYm9zZSAoImdvdCBwaWQgJWx1XG4iLCByZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEBicmllZiByZXR1cm4gcGVlciBwcm9jZXNzIGlkIGZyb20gdGNwIGhhbmRsZSBmb3IgbG9jYWxob3N0IGNvbm5lY3Rpb25zCisgKiBAcGFyYW0gaGFuZGxlIHRjcCBzb2NrZXQgZGVzY3JpcHRvcgorICogQHJldHVybiBwcm9jZXNzIGlkIG9yIDAgaW4gY2FzZSB0aGUgcHJvY2VzcyBpZCBjb3VsZCBub3QgYmUgZmV0Y2hlZAorICovCitzdGF0aWMgZGJ1c19waWRfdAorX2RidXNfZ2V0X3BlZXJfcGlkX2Zyb21fdGNwX2hhbmRsZSAoaW50IGhhbmRsZSkKK3sKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgc29ja2xlbl90IGxlbiA9IHNpemVvZiAoYWRkcik7CisgIGludCBwZWVyX3BvcnQ7CisKKyAgZGJ1c19waWRfdCByZXN1bHQ7CisgIGRidXNfYm9vbF90IGlzX2xvY2FsaG9zdCA9IEZBTFNFOworCisgIGdldHBlZXJuYW1lIChoYW5kbGUsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZsZW4pOworCisgIGlmIChhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKQorICAgIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmFkZHI7CisgICAgICBwZWVyX3BvcnQgPSBudG9ocyAocy0+c2luX3BvcnQpOworICAgICAgaXNfbG9jYWxob3N0ID0gKG50b2hsIChzLT5zaW5fYWRkci5zX2FkZHIpID09IElOQUREUl9MT09QQkFDSyk7CisgICAgfQorICBlbHNlIGlmIChhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRklYTUUgWzYxOTIyXTogSVBWNiBzdXBwb3J0IG5vdCB3b3JraW5nIG9uIHdpbmRvd3NcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgICAvKgorICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICogKSZhZGRyOworICAgICAgICAgcGVlcl9wb3J0ID0gbnRvaHMgKHMtPnNpbjZfcG9ydCk7CisgICAgICAgICBpc19sb2NhbGhvc3QgPSAobWVtY21wKHMtPnNpbjZfYWRkci5zNl9hZGRyLCBpbjZhZGRyX2xvb3BiYWNrLnM2X2FkZHIsIDE2KSA9PSAwKTsKKyAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJJUFY2ICUwOHggJTA4eFxuIiwgcy0+c2luNl9hZGRyLnM2X2FkZHIsIGluNmFkZHJfbG9vcGJhY2suczZfYWRkcik7CisgICAgICAgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgibm8gaWRlYSB3aGF0IGFkZHJlc3MgZmFtaWx5ICVkIGlzXG4iLCBhZGRyLnNzX2ZhbWlseSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFpc19sb2NhbGhvc3QpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBmZXRjaCBwcm9jZXNzIGlkIGZyb20gcmVtb3RlIHByb2Nlc3NcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChwZWVyX3BvcnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlCisgICAgICAgICgiRXJyb3Igbm90IGJlZW4gYWJsZSB0byBmZXRjaCB0Y3AgcGVlciBwb3J0IGZyb20gY29ubmVjdGlvblxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInRyeWluZyB0byBnZXQgcGVlcidzIHBpZFxuIik7CisKKyAgcmVzdWx0ID0gZ2V0X3BpZF9mcm9tX2V4dGVuZGVkX3RjcF90YWJsZSAocGVlcl9wb3J0KTsKKyAgaWYgKHJlc3VsdCA+IDApCisgICAgICByZXR1cm4gcmVzdWx0OworICByZXN1bHQgPSBnZXRfcGlkX2Zyb21fdGNwX2V4X3RhYmxlIChwZWVyX3BvcnQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBDb252ZXJ0IEdldExhc3RFcnJvcigpIHRvIGEgZGJ1cyBlcnJvci4gICovCitjb25zdCBjaGFyKgorX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAodm9pZCkKK3sKKyAgc3dpdGNoIChHZXRMYXN0RXJyb3IoKSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworICAgIAorICAgIGNhc2UgRVJST1JfTk9fTU9SRV9GSUxFUzoKKyAgICBjYXNlIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVM6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQ7IC8qIGtlcm5lbCBvdXQgb2YgbWVtb3J5ICovCisKKyAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgY2FzZSBFUlJPUl9DQU5OT1RfTUFLRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQ7CisKKyAgICBjYXNlIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTUVNT1JZOworCisgICAgY2FzZSBFUlJPUl9GSUxFX0VYSVNUUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTOworCisgICAgY2FzZSBFUlJPUl9GSUxFX05PVF9GT1VORDoKKyAgICBjYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9OT1RfRk9VTkQ7CisgICAgfQorICAKKyAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworfQorCisKK2NoYXIqCitfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBjaGFyICptc2c7CisKKyAgRm9ybWF0TWVzc2FnZUEgKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUyB8CisgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICAgIE5VTEwsIGVycm9yX251bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgIChMUFNUUikgJm1zZywgMCwgTlVMTCk7CisKKyAgaWYgKG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9PSAnXG4nKQorICAgIG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9ICdcMCc7CisgIGlmIChtc2dbc3RybGVuIChtc2cpIC0gMV0gPT0gJ1xyJykKKyAgICBtc2dbc3RybGVuIChtc2cpIC0gMV0gPSAnXDAnOworCisgIHJldHVybiBtc2c7Cit9CisKK3ZvaWQKK19kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoY2hhciAqc3RyaW5nKQoreworICBMb2NhbEZyZWUgKHN0cmluZyk7Cit9CisKKy8qKgorICogU29ja2V0IGludGVyZmFjZQorICoKKyAqLworCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LCBhbmQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICogYW5kIHNhbWUgZXJybm8gYXMgcmVhZCgpLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdAorICogX2RidXNfcmVhZF9zb2NrZXQoKSBoYW5kbGVzIEVJTlRSIGZvciB5b3UuIAorICogX2RidXNfcmVhZF9zb2NrZXQoKSBjYW4gcmV0dXJuIEVOT01FTSwgZXZlbiB0aG91Z2ggCisgKiByZWd1bGFyIFVOSVggcmVhZCBkb2Vzbid0LgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhIHRvCisgKiBAcGFyYW0gY291bnQgdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMQorICovCisKK2ludAorX2RidXNfcmVhZF9zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCkKK3sKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJybm8gKEVOT01FTSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBjb3VudCk7CisKKyBhZ2FpbjoKKyAKKyAgX2RidXNfdmVyYm9zZSAoInJlY3Y6IGNvdW50PSVkIGZkPSVJdVxuIiwgY291bnQsIGZkLnNvY2spOworICBieXRlc19yZWFkID0gcmVjdiAoZmQuc29jaywgZGF0YSwgY291bnQsIDApOworICAKKyAgaWYgKGJ5dGVzX3JlYWQgPT0gU09DS0VUX0VSUk9SKQorCXsKKwkgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworCSAgX2RidXNfdmVyYm9zZSAoInJlY3Y6IGZhaWxlZDogJXMgKCVkKVxuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSwgZXJybm8pOworCSAgYnl0ZXNfcmVhZCA9IC0xOworCX0KKwllbHNlCisJICBfZGJ1c192ZXJib3NlICgicmVjdjogPSAlZFxuIiwgYnl0ZXNfcmVhZCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UgICAgCQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAoZG9lc24ndCBhY3R1YWxseSByZWFsbG9jKSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQgKyBieXRlc19yZWFkKTsKKworI2lmIDAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3JlYWQpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBieXRlc19yZWFkOworICAgIH0KK30KKworLyoqCisgKiBUaGluIHdyYXBwZXIgYXJvdW5kIHRoZSB3cml0ZSgpIHN5c3RlbSBjYWxsIHRoYXQgd3JpdGVzIGEgcGFydCBvZiBhCisgKiBEQnVzU3RyaW5nIGFuZCBoYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiAKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0IChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCBjaGFyICpkYXRhOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgbGVuKTsKKworIGFnYWluOgorCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kOiBsZW49JWQgZmQ9JUl1XG4iLCBsZW4sIGZkLnNvY2spOworICBieXRlc193cml0dGVuID0gc2VuZCAoZmQuc29jaywgZGF0YSwgbGVuLCAwKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgic2VuZDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBieXRlc193cml0dGVuID0gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kOiA9ICVkXG4iLCBieXRlc193cml0dGVuKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKyAgICAKKyNpZiAwCisgIGlmIChieXRlc193cml0dGVuID4gMCkKKyAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfd3JpdHRlbik7CisjZW5kaWYKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworCisvKioKKyAqIENsb3NlcyBhIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xvc2Vfc29ja2V0IChEQnVzU29ja2V0IGZkLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworIGFnYWluOgorICBpZiAoY2xvc2Vzb2NrZXQgKGZkLnNvY2spID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIHNvY2tldDogc29ja2V0PSVJdSwgLCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmQuc29jaywgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBfZGJ1c192ZXJib3NlICgiX2RidXNfY2xvc2Vfc29ja2V0OiBzb2NrZXQ9JUl1LCBcbiIsIGZkLnNvY2spOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSBjbG9zZQorICogb24gZXhlYy4gU2hvdWxkIGJlIGNhbGxlZCBmb3IgYWxsIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGluIEQtQnVzIGNvZGUuCisgKgorICogQHBhcmFtIGhhbmRsZSB0aGUgV2luZG93cyBIQU5ETEUgKGEgU09DS0VUIGlzIGFsc28gT0spCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c193aW5faGFuZGxlX3NldF9jbG9zZV9vbl9leGVjIChIQU5ETEUgaGFuZGxlKQoreworICBpZiAoICFTZXRIYW5kbGVJbmZvcm1hdGlvbiggKEhBTkRMRSkgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZMQUdfSU5IRVJJVCB8IEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLypkaXNhYmxlIGJvdGggZmxhZ3MqLyApICkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJEaXNhYmxpbmcgc29ja2V0IGhhbmRsZSBpbmhlcml0YW5jZSBmYWlsZWQ6IiwgR2V0TGFzdEVycm9yKCkpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIG9mIGVycm9yIGxvY2F0aW9uLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKERCdXNTb2NrZXQgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIHVfbG9uZyBvbmUgPSAxOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChpb2N0bHNvY2tldCAoaGFuZGxlLnNvY2ssIEZJT05CSU8sICZvbmUpID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBzb2NrZXQgJUl1IHRvIG5vbmJsb2NraW5nOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnNvY2ssIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIExpa2UgX2RidXNfd3JpdGUoKSBidXQgd2lsbCB1c2Ugd3JpdGV2KCkgaWYgcG9zc2libGUKKyAqIHRvIHdyaXRlIGJvdGggYnVmZmVycyBpbiBzZXF1ZW5jZS4gVGhlIHJldHVybiB2YWx1ZQorICogaXMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHRoZSBmaXJzdCBidWZmZXIsCisgKiBwbHVzIHRoZSBudW1iZXIgd3JpdHRlbiBpbiB0aGUgc2Vjb25kLiBJZiB0aGUgZmlyc3QKKyAqIGJ1ZmZlciBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgYW4gZXJyb3Igb2NjdXJzCisgKiB3cml0aW5nIHRoZSBzZWNvbmQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpcnN0CisgKiBpcyByZXR1cm5lZCAoaS5lLiB0aGUgZXJyb3IgaXMgaWdub3JlZCksIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3QgaGF2ZSB3cml0ZXYuIEhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqIFRoZSBzZWNvbmQgYnVmZmVyIG1heSBiZSAjTlVMTC4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGJ1ZmZlcjEgZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gc3RhcnQxIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gbGVuMSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgZnJvbSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBidWZmZXIyIHNlY29uZCBidWZmZXIsIG9yICNOVUxMCisgKiBAcGFyYW0gc3RhcnQyIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHBhcmFtIGxlbjIgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEByZXR1cm5zIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gZnJvbSBib3RoIGJ1ZmZlcnMsIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3R3byAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKQoreworICBXU0FCVUYgdmVjdG9yc1syXTsKKyAgY29uc3QgY2hhciAqZGF0YTE7CisgIGNvbnN0IGNoYXIgKmRhdGEyOworICBpbnQgcmM7CisgIERXT1JEIGJ5dGVzX3dyaXR0ZW47CisKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIxICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0MSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDIgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4yID49IDApOworCisKKyAgZGF0YTEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIxLCBzdGFydDEsIGxlbjEpOworCisgIGlmIChidWZmZXIyICE9IE5VTEwpCisgICAgZGF0YTIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICBlbHNlCisgICAgeworICAgICAgZGF0YTIgPSBOVUxMOworICAgICAgc3RhcnQyID0gMDsKKyAgICAgIGxlbjIgPSAwOworICAgIH0KKworICB2ZWN0b3JzWzBdLmJ1ZiA9IChjaGFyKikgZGF0YTE7CisgIHZlY3RvcnNbMF0ubGVuID0gbGVuMTsKKyAgdmVjdG9yc1sxXS5idWYgPSAoY2hhciopIGRhdGEyOworICB2ZWN0b3JzWzFdLmxlbiA9IGxlbjI7CisKKyBhZ2FpbjoKKyAKKyAgX2RidXNfdmVyYm9zZSAoIldTQVNlbmQ6IGxlbjErMj0lZCslZCBmZD0lSXVcbiIsIGxlbjEsIGxlbjIsIGZkLnNvY2spOworICByYyA9IFdTQVNlbmQgKGZkLnNvY2ssCisgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxLCAKKyAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAwLCAKKyAgICAgICAgICAgICAgICBOVUxMLCAKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAKKyAgaWYgKHJjID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiV1NBU2VuZDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBieXRlc193cml0dGVuID0gLTE7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfdmVyYm9zZSAoIldTQVNlbmQ6ID0gJWxkXG4iLCBieXRlc193cml0dGVuKTsKKyAgICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgICAKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKKyNpZiAwCisKKy8qKgorICogT3BlbnMgdGhlIGNsaWVudCBzaWRlIG9mIGEgV2luZG93cyBuYW1lZCBwaXBlLiBUaGUgY29ubmVjdGlvbiBELUJVUworICogZmlsZSBkZXNjcmlwdG9yIGluZGV4IGlzIHJldHVybmVkLiBJdCBpcyBzZXQgdXAgYXMgbm9uYmxvY2tpbmcuCisgKiAKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIG5hbWVkIHBpcGUgc29ja2V0CisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIEQtQlVTIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2Nvbm5lY3RfbmFtZWRfcGlwZSAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm90IGltcGxlbWVudGVkIik7Cit9CisKKyNlbmRpZgorCisvKioKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dpbl9zdGFydHVwX3dpbnNvY2sgKHZvaWQpCit7CisgIC8qIFN0cmFpZ2h0IGZyb20gTVNETiwgZGV1Z2xpZmllZCAqLworCisgIC8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLX3N5c2RlcHMgKi8KKyAgc3RhdGljIGRidXNfYm9vbF90IGJlZW5oZXJlID0gRkFMU0U7CisKKyAgV09SRCB3VmVyc2lvblJlcXVlc3RlZDsKKyAgV1NBREFUQSB3c2FEYXRhOworICBpbnQgZXJyOworCisgIGlmICghX0RCVVNfTE9DSyAoc3lzZGVwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChiZWVuaGVyZSkKKyAgICBnb3RvIG91dDsKKworICB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEICgyLCAwKTsKKworICBlcnIgPSBXU0FTdGFydHVwICh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOworICBpZiAoZXJyICE9IDApCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ291bGQgbm90IGluaXRpYWxpemUgV2luU29jayIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIC8qIENvbmZpcm0gdGhhdCB0aGUgV2luU29jayBETEwgc3VwcG9ydHMgMi4wLiAgTm90ZSB0aGF0IGlmIHRoZSBETEwKKyAgICogc3VwcG9ydHMgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIDIuMCBpbiBhZGRpdGlvbiB0byAyLjAsIGl0IHdpbGwKKyAgICogc3RpbGwgcmV0dXJuIDIuMCBpbiB3VmVyc2lvbiBzaW5jZSB0aGF0IGlzIHRoZSB2ZXJzaW9uIHdlCisgICAqIHJlcXVlc3RlZC4KKyAgICovCisgIGlmIChMT0JZVEUgKHdzYURhdGEud1ZlcnNpb24pICE9IDIgfHwKKyAgICAgIEhJQllURSAod3NhRGF0YS53VmVyc2lvbikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJObyB1c2FibGUgV2luU29jayBmb3VuZCIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIGJlZW5oZXJlID0gVFJVRTsKKworb3V0OgorICBfREJVU19VTkxPQ0sgKHN5c2RlcHMpOworICByZXR1cm4gVFJVRTsKK30KKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBVVEYgLyBzdHJpbmcgY29kZQorIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBNZWFzdXJlIHRoZSBtZXNzYWdlIGxlbmd0aCB3aXRob3V0IHRlcm1pbmF0aW5nIG51bCAKKyAqLworaW50IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisgIC8qIE1TVkNSVCdzIHZzbnByaW50ZiBzZW1hbnRpY3MgYXJlIGEgYml0IGRpZmZlcmVudCAqLworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgaW50IGJ1ZnNpemU7CisgIGludCBsZW47CisgIHZhX2xpc3QgYXJnc19jb3B5OworCisgIGJ1ZnNpemUgPSBzaXplb2YgKGJ1Zik7CisgIERCVVNfVkFfQ09QWSAoYXJnc19jb3B5LCBhcmdzKTsKKyAgbGVuID0gX3ZzbnByaW50ZiAoYnVmLCBidWZzaXplIC0gMSwgZm9ybWF0LCBhcmdzX2NvcHkpOworICB2YV9lbmQgKGFyZ3NfY29weSk7CisKKyAgd2hpbGUgKGxlbiA9PSAtMSkgLyogdHJ5IGFnYWluICovCisgICAgeworICAgICAgY2hhciAqcDsKKworICAgICAgYnVmc2l6ZSAqPSAyOworCisgICAgICBwID0gbWFsbG9jIChidWZzaXplKTsKKworICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICBEQlVTX1ZBX0NPUFkgKGFyZ3NfY29weSwgYXJncyk7CisgICAgICBsZW4gPSBfdnNucHJpbnRmIChwLCBidWZzaXplIC0gMSwgZm9ybWF0LCBhcmdzX2NvcHkpOworICAgICAgdmFfZW5kIChhcmdzX2NvcHkpOworICAgICAgZnJlZSAocCk7CisgICAgfQorCisgIHJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHRoZSBVVEYtMTYgZm9ybSBvZiBhIFVURi04IHN0cmluZy4gVGhlIHJlc3VsdCBzaG91bGQgYmUKKyAqIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIFVURi04IHN0cmluZworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICovCit3Y2hhcl90ICoKK19kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChjb25zdCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgczsKKyAgaW50IG47CisgIHdjaGFyX3QgKnJldHZhbDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnMsIHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnMsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcykpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJJbnZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX1VURjgsIDAsIHN0ciwgLTEsIE5VTEwsIDApOworCisgIGlmIChuID09IDApCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dmFsID0gZGJ1c19uZXcgKHdjaGFyX3QsIG4pOworCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgcmV0dmFsLCBuKSAhPSBuKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJNdWx0aUJ5dGVUb1dpZGVDaGFyIGluY29uc2lzdGVuY3kiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFVURi04IGZvcm0gb2YgYSBVVEYtMTYgc3RyaW5nLiBUaGUgcmVzdWx0IHNob3VsZCBiZQorICogZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgVVRGLTE2IHN0cmluZworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICovCitjaGFyICoKK19kYnVzX3dpbl91dGYxNl90b191dGY4IChjb25zdCB3Y2hhcl90ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGludCBuOworICBjaGFyICpyZXR2YWw7CisKKyAgbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX1VURjgsIDAsIHN0ciwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCisgIGlmIChuID09IDApCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dmFsID0gZGJ1c19tYWxsb2MgKG4pOworCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgcmV0dmFsLCBuLCBOVUxMLCBOVUxMKSAhPSBuKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJXaWRlQ2hhclRvTXVsdGlCeXRlIGluY29uc2lzdGVuY3kiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZGJ1c19ib29sX3QKK19kYnVzX3dpbl9hY2NvdW50X3RvX3NpZCAoY29uc3Qgd2NoYXJfdCAqd2FjY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAJICoqcHBzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAJICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBEV09SRCBzaWRfbGVuZ3RoLCB3ZG9tYWluX2xlbmd0aDsKKyAgU0lEX05BTUVfVVNFIHVzZTsKKyAgd2NoYXJfdCAqd2RvbWFpbjsKKworICAqcHBzaWQgPSBOVUxMOworCisgIHNpZF9sZW5ndGggPSAwOworICB3ZG9tYWluX2xlbmd0aCA9IDA7CisgIGlmICghTG9va3VwQWNjb3VudE5hbWVXIChOVUxMLCB3YWNjb3VudCwgTlVMTCwgJnNpZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmd2RvbWFpbl9sZW5ndGgsICZ1c2UpICYmCisgICAgICBHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnBwc2lkID0gZGJ1c19tYWxsb2MgKHNpZF9sZW5ndGgpOworICBpZiAoISpwcHNpZCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHdkb21haW4gPSBkYnVzX25ldyAod2NoYXJfdCwgd2RvbWFpbl9sZW5ndGgpOworICBpZiAoIXdkb21haW4pCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQxOworICAgIH0KKworICBpZiAoIUxvb2t1cEFjY291bnROYW1lVyAoTlVMTCwgd2FjY291bnQsIChQU0lEKSAqcHBzaWQsICZzaWRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RvbWFpbiwgJndkb21haW5fbGVuZ3RoLCAmdXNlKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGdvdG8gb3V0MjsKKyAgICB9CisKKyAgaWYgKCFJc1ZhbGlkU2lkICgoUFNJRCkgKnBwc2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiSW52YWxpZCBTSUQiKTsKKyAgICAgIGdvdG8gb3V0MjsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0MjoKKyAgZGJ1c19mcmVlICh3ZG9tYWluKTsKK291dDE6CisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoKnBwc2lkKTsKKyAgICAgICpwcHNpZCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcy13aW4gKi8KKworCisvKioKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIHNlcGFyYXRlIGZyb20gX2RidXNfZ2V0cGlkKCkgaXMgdG8gYWxsb3cgaXQKKyAqIG9uIFdpbmRvd3MgZm9yIGxvZ2dpbmcgYnV0IG5vdCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKiAKKyAqIEByZXR1cm5zIHByb2Nlc3MgSUQgdG8gcHV0IGluIGxvZyBtZXNzYWdlcworICovCit1bnNpZ25lZCBsb25nCitfZGJ1c19waWRfZm9yX2xvZyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldHBpZCAoKTsKK30KKworI2lmbmRlZiBEQlVTX1dJTkNFCisKK3N0YXRpYyBCT09MIGlzX3dpbnhwX3NwM19vcl9sb3dlcigpCit7CisgICBPU1ZFUlNJT05JTkZPRVggb3N2aTsKKyAgIERXT1JETE9ORyBkd2xDb25kaXRpb25NYXNrID0gMDsKKyAgIGludCBvcD1WRVJfTEVTU19FUVVBTDsKKworICAgLy8gSW5pdGlhbGl6ZSB0aGUgT1NWRVJTSU9OSU5GT0VYIHN0cnVjdHVyZS4KKworICAgWmVyb01lbW9yeSgmb3N2aSwgc2l6ZW9mKE9TVkVSU0lPTklORk9FWCkpOworICAgb3N2aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk9FWCk7CisgICBvc3ZpLmR3TWFqb3JWZXJzaW9uID0gNTsKKyAgIG9zdmkuZHdNaW5vclZlcnNpb24gPSAxOworICAgb3N2aS53U2VydmljZVBhY2tNYWpvciA9IDM7CisgICBvc3ZpLndTZXJ2aWNlUGFja01pbm9yID0gMDsKKworICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29uZGl0aW9uIG1hc2suCisKKyAgIFZFUl9TRVRfQ09ORElUSU9OKCBkd2xDb25kaXRpb25NYXNrLCBWRVJfTUFKT1JWRVJTSU9OLCBvcCApOworICAgVkVSX1NFVF9DT05ESVRJT04oIGR3bENvbmRpdGlvbk1hc2ssIFZFUl9NSU5PUlZFUlNJT04sIG9wICk7CisgICBWRVJfU0VUX0NPTkRJVElPTiggZHdsQ29uZGl0aW9uTWFzaywgVkVSX1NFUlZJQ0VQQUNLTUFKT1IsIG9wICk7CisgICBWRVJfU0VUX0NPTkRJVElPTiggZHdsQ29uZGl0aW9uTWFzaywgVkVSX1NFUlZJQ0VQQUNLTUlOT1IsIG9wICk7CisKKyAgIC8vIFBlcmZvcm0gdGhlIHRlc3QuCisKKyAgIHJldHVybiBWZXJpZnlWZXJzaW9uSW5mbygKKyAgICAgICZvc3ZpLAorICAgICAgVkVSX01BSk9SVkVSU0lPTiB8IFZFUl9NSU5PUlZFUlNJT04gfAorICAgICAgVkVSX1NFUlZJQ0VQQUNLTUFKT1IgfCBWRVJfU0VSVklDRVBBQ0tNSU5PUiwKKyAgICAgIGR3bENvbmRpdGlvbk1hc2spOworfQorCisvKiogR2V0cyBvdXIgU0lECisgKiBAcGFyYW0gc2lkIHBvaW50cyB0byBzaWQgYnVmZmVyLCBuZWVkIHRvIGJlIGZyZWVkIHdpdGggTG9jYWxGcmVlKCkKKyAqIEBwYXJhbSBwcm9jZXNzX2lkIHRoZSBwcm9jZXNzIGlkIGZvciB3aGljaCB0aGUgc2lkIHNob3VsZCBiZSByZXR1cm5lZCAodXNlIDAgZm9yIGN1cnJlbnQgcHJvY2VzcykKKyAqIEByZXR1cm5zIHByb2Nlc3Mgc2lkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRzaWQoY2hhciAqKnNpZCwgZGJ1c19waWRfdCBwcm9jZXNzX2lkKQoreworICBIQU5ETEUgcHJvY2Vzc190b2tlbiA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBUT0tFTl9VU0VSICp0b2tlbl91c2VyID0gTlVMTDsKKyAgRFdPUkQgbjsKKyAgUFNJRCBwc2lkOworICBpbnQgcmV0dmFsID0gRkFMU0U7CisKKyAgSEFORExFIHByb2Nlc3NfaGFuZGxlOworICBpZiAocHJvY2Vzc19pZCA9PSAwKQorICAgIHByb2Nlc3NfaGFuZGxlID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgZWxzZSBpZiAoaXNfd2lueHBfc3AzX29yX2xvd2VyKCkpCisgICAgcHJvY2Vzc19oYW5kbGUgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLCBGQUxTRSwgcHJvY2Vzc19pZCk7CisgIGVsc2UKKyAgICBwcm9jZXNzX2hhbmRsZSA9IE9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfTElNSVRFRF9JTkZPUk1BVElPTiwgRkFMU0UsIHByb2Nlc3NfaWQpOworCisgIGlmICghT3BlblByb2Nlc3NUb2tlbiAocHJvY2Vzc19oYW5kbGUsIFRPS0VOX1FVRVJZLCAmcHJvY2Vzc190b2tlbikpCisgICAgeworICAgICAgX2RidXNfd2luX3dhcm5fd2luX2Vycm9yICgiT3BlblByb2Nlc3NUb2tlbiBmYWlsZWQiLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBpZiAoKCFHZXRUb2tlbkluZm9ybWF0aW9uIChwcm9jZXNzX3Rva2VuLCBUb2tlblVzZXIsIE5VTEwsIDAsICZuKQorICAgICAgICAgICAgJiYgR2V0TGFzdEVycm9yICgpICE9IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpCisgICAgICAgICAgIHx8ICh0b2tlbl91c2VyID0gYWxsb2NhIChuKSkgPT0gTlVMTAorICAgICAgICAgICB8fCAhR2V0VG9rZW5JbmZvcm1hdGlvbiAocHJvY2Vzc190b2tlbiwgVG9rZW5Vc2VyLCB0b2tlbl91c2VyLCBuLCAmbikpCisgICAgeworICAgICAgX2RidXNfd2luX3dhcm5fd2luX2Vycm9yICgiR2V0VG9rZW5JbmZvcm1hdGlvbiBmYWlsZWQiLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBwc2lkID0gdG9rZW5fdXNlci0+VXNlci5TaWQ7CisgIGlmICghSXNWYWxpZFNpZCAocHNpZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSgiJXMgaW52YWxpZCBzaWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgaWYgKCFDb252ZXJ0U2lkVG9TdHJpbmdTaWRBIChwc2lkLCBzaWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UoIiVzIGludmFsaWQgc2lkXG4iLF9fRlVOQ1RJT05fXyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisvL29rYXk6CisgIHJldHZhbCA9IFRSVUU7CisKK2ZhaWxlZDoKKyAgQ2xvc2VIYW5kbGUgKHByb2Nlc3NfaGFuZGxlKTsKKyAgaWYgKHByb2Nlc3NfdG9rZW4gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgQ2xvc2VIYW5kbGUgKHByb2Nlc3NfdG9rZW4pOworCisgIF9kYnVzX3ZlcmJvc2UoIl9kYnVzX2dldHNpZCgpIGdvdCAnJXMnIGFuZCByZXR1cm5zICVkXG4iLCAqc2lkLCByZXR2YWwpOworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBwaXBlcworIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDcmVhdGVzIHBhaXIgb2YgY29ubmVjdCBzb2NrZXRzIChhcyBpbiBzb2NrZXRwYWlyKCkpLgorICogU2V0cyBib3RoIGVuZHMgb2YgdGhlIHBhaXIgbm9uYmxvY2tpbmcuCisgKgorICogTWFya3MgYm90aCBmaWxlIGRlc2NyaXB0b3JzIGFzIGNsb3NlLW9uLWV4ZWMKKyAqCisgKiBAcGFyYW0gZmQxIHJldHVybiBsb2NhdGlvbiBmb3Igb25lIGVuZAorICogQHBhcmFtIGZkMiByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvdGhlciBlbmQKKyAqIEBwYXJhbSBibG9ja2luZyAjVFJVRSBpZiBwYWlyIHNob3VsZCBiZSBibG9ja2luZworICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKGlmIGVycm9yIGlzIHNldCkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NvY2tldHBhaXIgKERCdXNTb2NrZXQgKmZkMSwKKyAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgKmZkMiwKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NraW5nLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIFNPQ0tFVCB0ZW1wLCBzb2NrZXQxID0gLTEsIHNvY2tldDIgPSAtMTsKKyAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworICBpbnQgbGVuOworICB1X2xvbmcgYXJnOworCisgIGlmICghX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRlbXAgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHRlbXAgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBfREJVU19aRVJPIChzYWRkcik7CisgIHNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzYWRkci5zaW5fcG9ydCA9IDA7CisgIHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sIChJTkFERFJfTE9PUEJBQ0spOworCisgIGlmIChiaW5kICh0ZW1wLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2YgKHNhZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgaWYgKGxpc3RlbiAodGVtcCwgMSkgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgbGVuID0gc2l6ZW9mIChzYWRkcik7CisgIGlmIChnZXRzb2NrbmFtZSAodGVtcCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgJmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgc29ja2V0MSA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICBpZiAoc29ja2V0MSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGlmIChjb25uZWN0IChzb2NrZXQxLCAoc3RydWN0IHNvY2thZGRyICAqKSZzYWRkciwgbGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQxOworICAgIH0KKworICBzb2NrZXQyID0gYWNjZXB0ICh0ZW1wLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJmxlbik7CisgIGlmIChzb2NrZXQyID09IElOVkFMSURfU09DS0VUKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MTsKKyAgICB9CisKKyAgaWYgKCFibG9ja2luZykKKyAgICB7CisgICAgICBhcmcgPSAxOworICAgICAgaWYgKGlvY3Rsc29ja2V0IChzb2NrZXQxLCBGSU9OQklPLCAmYXJnKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisKKyAgICAgIGFyZyA9IDE7CisgICAgICBpZiAoaW9jdGxzb2NrZXQgKHNvY2tldDIsIEZJT05CSU8sICZhcmcpID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBnb3RvIG91dDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgZmQxLT5zb2NrID0gc29ja2V0MTsKKyAgZmQyLT5zb2NrID0gc29ja2V0MjsKKworICBfZGJ1c192ZXJib3NlICgiZnVsbC1kdXBsZXggcGlwZSAlSXU6JUl1IDwtPiAlSXU6JUl1XG4iLAorICAgICAgICAgICAgICAgICBmZDEtPnNvY2ssIHNvY2tldDEsIGZkMi0+c29jaywgc29ja2V0Mik7CisKKyAgY2xvc2Vzb2NrZXQgKHRlbXApOworCisgIHJldHVybiBUUlVFOworCitvdXQyOgorICBjbG9zZXNvY2tldCAoc29ja2V0Mik7CitvdXQxOgorICBjbG9zZXNvY2tldCAoc29ja2V0MSk7CitvdXQwOgorICBjbG9zZXNvY2tldCAodGVtcCk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldHVwIHNvY2tldCBwYWlyOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgcG9sbCgpLgorICoKKyAqIEBwYXJhbSBmZHMgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdG8gcG9sbAorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgbnVtYmVycyBvZiBmZHMgd2l0aCByZXZlbnRzLCBvciA8MCBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BvbGwgKERCdXNQb2xsRkQgKmZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisjZGVmaW5lIFVTRV9DSFJJU19JTVBMIDAKKworI2lmIFVTRV9DSFJJU19JTVBMCisKKyNkZWZpbmUgREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkUgMjAwMAorICBjaGFyIG1zZ1tEQlVTX1BPTExfQ0hBUl9CVUZGRVJfU0laRV07CisgIGNoYXIgKm1zZ3A7CisKKyAgaW50IHJldCA9IDA7CisgIGludCBpOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgaW50IHJlYWR5OworCisjZGVmaW5lIERCVVNfU1RBQ0tfV1NBRVZFTlRTIDI1NgorICBXU0FFVkVOVCBldmVudHNPblN0YWNrW0RCVVNfU1RBQ0tfV1NBRVZFTlRTXTsKKyAgV1NBRVZFTlQgKnBFdmVudHMgPSBOVUxMOworICBpZiAobl9mZHMgPiBEQlVTX1NUQUNLX1dTQUVWRU5UUykKKyAgICBwRXZlbnRzID0gY2FsbG9jKHNpemVvZihXU0FFVkVOVCksIG5fZmRzKTsKKyAgZWxzZQorICAgIHBFdmVudHMgPSBldmVudHNPblN0YWNrOworCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgbXNncCA9IG1zZzsKKyAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiV1NBRXZlbnRTZWxlY3Q6IHRvPSVkXG5cdCIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlc6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIkU6JUl1XG5cdCIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgIC8vIEZJWE1FOiBtb3JlIHJvYnVzdCBjb2RlIGZvciBsb25nICBtc2cKKyAgICAgIC8vICAgICAgICBjcmVhdGUgb24gaGVhcCB3aGVuIG1zZ1tdIGJlY29tZXMgdG9vIHNtYWxsCisgICAgICBpZiAobXNncCA+PSBtc2cgKyBEQlVTX1BPTExfQ0hBUl9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJ1ZmZlciBvdmVyZmxvdyBpbiBfZGJ1c19wb2xsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiXG4iKTsKKyAgX2RidXNfdmVyYm9zZSAoIiVzIixtc2cpOworI2VuZGlmCisgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisgICAgICBXU0FFVkVOVCBldjsKKyAgICAgIGxvbmcgbE5ldHdvcmtFdmVudHMgPSBGRF9PT0I7CisKKyAgICAgIGV2ID0gV1NBQ3JlYXRlRXZlbnQoKTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICBsTmV0d29ya0V2ZW50cyB8PSBGRF9SRUFEIHwgRkRfQUNDRVBUIHwgRkRfQ0xPU0U7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisgICAgICAgIGxOZXR3b3JrRXZlbnRzIHw9IEZEX1dSSVRFIHwgRkRfQ09OTkVDVDsKKworICAgICAgV1NBRXZlbnRTZWxlY3QoZmRwLT5mZC5zb2NrLCBldiwgbE5ldHdvcmtFdmVudHMpOworCisgICAgICBwRXZlbnRzW2ldID0gZXY7CisgICAgfQorCisKKyAgcmVhZHkgPSBXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHMgKG5fZmRzLCBwRXZlbnRzLCBGQUxTRSwgdGltZW91dF9taWxsaXNlY29uZHMsIEZBTFNFKTsKKworICBpZiAoREJVU19TT0NLRVRfQVBJX1JFVFVSTlNfRVJST1IgKHJlYWR5KSkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBpZiAoZXJybm8gIT0gV1NBRVdPVUxEQkxPQ0spCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHM6IGZhaWxlZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0ID0gLTE7CisgICAgfQorICBlbHNlIGlmIChyZWFkeSA9PSBXU0FfV0FJVF9USU1FT1VUKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHM6IFdTQV9XQUlUX1RJTUVPVVRcbiIpOworICAgICAgcmV0ID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKHJlYWR5ID49IFdTQV9XQUlUX0VWRU5UXzAgJiYgcmVhZHkgPCAoaW50KShXU0FfV0FJVF9FVkVOVF8wICsgbl9mZHMpKQorICAgIHsKKyAgICAgIG1zZ3AgPSBtc2c7CisgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHM6ID0lZFxuXHQiLCByZWFkeSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKyAgICAgICAgICBXU0FORVRXT1JLRVZFTlRTIG5lOworCisgICAgICAgICAgZmRwLT5yZXZlbnRzID0gMDsKKworICAgICAgICAgIFdTQUVudW1OZXR3b3JrRXZlbnRzKGZkcC0+ZmQuc29jaywgcEV2ZW50c1tpXSwgJm5lKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9SRUFEIHwgRkRfQUNDRVBUIHwgRkRfQ0xPU0UpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9XUklURSB8IEZEX0NPTk5FQ1QpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfT09CKSkKKyAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX1JFQUQgfCBGRF9BQ0NFUFQgfCBGRF9DTE9TRSkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfV1JJVEUgfCBGRF9DT05ORUNUKSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9PT0IpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVJdSAiLCBmZHAtPmZkLnNvY2spOworCisgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAibE5ldHdvcmtFdmVudHM6JWQgIiwgbmUubE5ldHdvcmtFdmVudHMpOworCisgICAgICAgICAgaWYobmUubE5ldHdvcmtFdmVudHMpCisgICAgICAgICAgICByZXQrKzsKKworICAgICAgICAgIFdTQUV2ZW50U2VsZWN0KGZkcC0+ZmQuc29jaywgcEV2ZW50c1tpXSwgMCk7CisgICAgICAgIH0KKworICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlcyIsbXNnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiV1NBV2FpdEZvck11bHRpcGxlRXZlbnRzOiBmYWlsZWQgZm9yIHVua25vd24gcmVhc29uISIpOworICAgICAgcmV0ID0gLTE7CisgICAgfQorCisgIGZvcihpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgV1NBQ2xvc2VFdmVudChwRXZlbnRzW2ldKTsKKyAgICB9CisKKyAgaWYgKG5fZmRzID4gREJVU19TVEFDS19XU0FFVkVOVFMpCisgICAgZnJlZShwRXZlbnRzKTsKKworICByZXR1cm4gcmV0OworCisjZWxzZSAgIC8qIFVTRV9DSFJJU19JTVBMICovCisKKyNkZWZpbmUgREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkUgMjAwMAorICBjaGFyIG1zZ1tEQlVTX1BPTExfQ0hBUl9CVUZGRVJfU0laRV07CisgIGNoYXIgKm1zZ3A7CisKKyAgZmRfc2V0IHJlYWRfc2V0LCB3cml0ZV9zZXQsIGVycl9zZXQ7CisgIFNPQ0tFVCBtYXhfZmQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZWFkeTsKKworICBGRF9aRVJPICgmcmVhZF9zZXQpOworICBGRF9aRVJPICgmd3JpdGVfc2V0KTsKKyAgRkRfWkVSTyAoJmVycl9zZXQpOworCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgbXNncCA9IG1zZzsKKyAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAic2VsZWN0OiB0bz0lZFxuXHQiLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJSOiVJdSAiLCBmZHAtPmZkLnNvY2spOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXOiVJdSAiLCBmZHAtPmZkLnNvY2spOworCisgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVJdVxuXHQiLCBmZHAtPmZkLnNvY2spOworCisgICAgICAvLyBGSVhNRTogbW9yZSByb2J1c3QgY29kZSBmb3IgbG9uZyAgbXNnCisgICAgICAvLyAgICAgICAgY3JlYXRlIG9uIGhlYXAgd2hlbiBtc2dbXSBiZWNvbWVzIHRvbyBzbWFsbAorICAgICAgaWYgKG1zZ3AgPj0gbXNnICsgREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJidWZmZXIgb3ZlcmZsb3cgaW4gX2RidXNfcG9sbCIpOworICAgICAgICB9CisgICAgfQorCisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgIF9kYnVzX3ZlcmJvc2UgKCIlcyIsbXNnKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOyAKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICBGRF9TRVQgKGZkcC0+ZmQuc29jaywgJnJlYWRfc2V0KTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgRkRfU0VUIChmZHAtPmZkLnNvY2ssICZ3cml0ZV9zZXQpOworCisgICAgICBGRF9TRVQgKGZkcC0+ZmQuc29jaywgJmVycl9zZXQpOworCisgICAgICBtYXhfZmQgPSBNQVggKG1heF9mZCwgZmRwLT5mZC5zb2NrKTsKKyAgICB9CisKKyAgLy8gQXZvaWQgcmFuZG9tIGxvY2t1cHMgd2l0aCBzZW5kKCksIGZvciBsYWNrIG9mIGEgYmV0dGVyIHNvbHV0aW9uIHNvIGZhcgorICB0di50dl9zZWMgPSB0aW1lb3V0X21pbGxpc2Vjb25kcyA8IDAgPyAxIDogdGltZW91dF9taWxsaXNlY29uZHMgLyAxMDAwOworICB0di50dl91c2VjID0gdGltZW91dF9taWxsaXNlY29uZHMgPCAwID8gMCA6ICh0aW1lb3V0X21pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKKworICByZWFkeSA9IHNlbGVjdCAobWF4X2ZkICsgMSwgJnJlYWRfc2V0LCAmd3JpdGVfc2V0LCAmZXJyX3NldCwgJnR2KTsKKworICBpZiAoREJVU19TT0NLRVRfQVBJX1JFVFVSTlNfRVJST1IgKHJlYWR5KSkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBpZiAoZXJybm8gIT0gV1NBRVdPVUxEQkxPQ0spCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWxlY3Q6IGZhaWxlZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgIH0KKyAgZWxzZSBpZiAocmVhZHkgPT0gMCkKKyAgICBfZGJ1c192ZXJib3NlICgic2VsZWN0OiA9IDBcbiIpOworICBlbHNlCisgICAgaWYgKHJlYWR5ID4gMCkKKyAgICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgICAgICAgbXNncCA9IG1zZzsKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAic2VsZWN0OiA9ICVkOlxuXHQiLCByZWFkeSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLnNvY2ssICZyZWFkX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZC5zb2NrLCAmd3JpdGVfc2V0KSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLnNvY2ssICZlcnJfc2V0KSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiRTolSXVcblx0IiwgZmRwLT5mZC5zb2NrKTsKKyAgICAgICAgICB9CisgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlcyIsbXNnKTsKKyNlbmRpZgorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKyAgICAgICAgICAgIGZkcC0+cmV2ZW50cyA9IDA7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZC5zb2NrLCAmcmVhZF9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQuc29jaywgJndyaXRlX3NldCkpCisgICAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQuc29jaywgJmVycl9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTEVSUjsKKyAgICAgICAgICB9CisgICAgICB9CisgIHJldHVybiByZWFkeTsKKyNlbmRpZiAgLyogVVNFX0NIUklTX0lNUEwgKi8KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorT3JpZ2luYWwgQ1ZTIHZlcnNpb24gb2YgZGJ1cy1zeXNkZXBzLmMKKyAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmMgV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworCisvKioKKyAqIEV4aXQgdGhlIHByb2Nlc3MsIHJldHVybmluZyB0aGUgZ2l2ZW4gdmFsdWUuCisgKgorICogQHBhcmFtIGNvZGUgdGhlIGV4aXQgY29kZQorICovCit2b2lkCitfZGJ1c19leGl0IChpbnQgY29kZSkKK3sKKyAgX2V4aXQgKGNvZGUpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIGEgc29ja2V0IGF0IHRoZSBnaXZlbiBob3N0IAorICogYW5kIHBvcnQuIFRoZSBjb25uZWN0aW9uIGZkIGlzIHJldHVybmVkLCBhbmQgaXMgc2V0IHVwIGFzCisgKiBub25ibG9ja2luZy4KKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBmYW1pbHkgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIGxpc3RlbiBvbiwgTlVMTCBmb3IgYWxsCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitEQnVzU29ja2V0CitfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICByZXR1cm4gX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGhvc3QsIHBvcnQsIGZhbWlseSwgKGNvbnN0IGNoYXIqKU5VTEwsIGVycm9yKTsKK30KKworREJ1c1NvY2tldAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTb2NrZXQgZmQgPSBEQlVTX1NPQ0tFVF9JTklUOworICBpbnQgcmVzOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgfQorCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgfQorICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworI2lmZGVmIEFJX0FERFJDT05GSUcKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHOworI2Vsc2UKKyAgaGludHMuYWlfZmxhZ3MgPSAwOworI2VuZGlmCisKKyAgaWYgKChyZXMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSkpICE9IDAgfHwgIWFpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBfZGJ1c19zdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaWYgKChmZC5zb2NrID0gc29ja2V0ICh0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDApKSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgICAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIGlmIChjb25uZWN0IChmZC5zb2NrLCAoc3RydWN0IHNvY2thZGRyKikgdG1wLT5haV9hZGRyLCB0bXAtPmFpX2FkZHJsZW4pID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBjbG9zZXNvY2tldChmZC5zb2NrKTsKKyAgICAgICAgICBmZC5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgZnJlZWFkZHJpbmZvKGFpKTsKKworICBpZiAoIV9kYnVzX3NvY2tldF9pc192YWxpZCAoZmQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICB9CisKKyAgaWYgKG5vbmNlZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgbm9uY2VmaWxlU3RyOworICAgICAgZGJ1c19ib29sX3QgcmV0OworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlZmlsZVN0cikgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCgmbm9uY2VmaWxlU3RyLCBub25jZWZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkLnNvY2spOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgICAgIH0KKworICAgICAgcmV0ID0gX2RidXNfc2VuZF9ub25jZSAoZmQsICZub25jZWZpbGVTdHIsIGVycm9yKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGVTdHIpOworCisgICAgICBpZiAoIXJldCkKKyAgICAgICAgeworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZC5zb2NrKTsKKyAgICAgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgICAgICB9CisgICAgfQorCisgIC8qIEV2ZXJ5IFNPQ0tFVCBpcyBhbHNvIGEgSEFORExFLiAqLworICBfZGJ1c193aW5faGFuZGxlX3NldF9jbG9zZV9vbl9leGVjICgoSEFORExFKSBmZC5zb2NrKTsKKworICBpZiAoIV9kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKGZkLCBlcnJvcikpCisgICAgeworICAgICAgY2xvc2Vzb2NrZXQgKGZkLnNvY2spOworICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIGZkOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwYXRoLCB0aGVuIGxpc3RlbnMgb24KKyAqIHRoZSBzb2NrZXQuIFRoZSBzb2NrZXQgaXMgc2V0IHRvIGJlIG5vbmJsb2NraW5nLiAgSW4gY2FzZSBvZiBwb3J0PTAKKyAqIGEgcmFuZG9tIGZyZWUgcG9ydCBpcyB1c2VkIGFuZCByZXR1cm5lZCBpbiB0aGUgcG9ydCBwYXJhbWV0ZXIuCisgKiBJZiBpbmFkZHJfYW55IGlzIHNwZWNpZmllZCwgdGhlIGhvc3RuYW1lIGlzIGlnbm9yZWQuCisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0byBsaXN0ZW4gb24KKyAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiwgaWYgemVybyBhIGZyZWUgcG9ydCB3aWxsIGJlIHVzZWQgCisgKiBAcGFyYW0gZmFtaWx5IHRoZSBhZGRyZXNzIGZhbWlseSB0byBsaXN0ZW4gb24sIE5VTEwgZm9yIGFsbAorICogQHBhcmFtIHJldHBvcnQgc3RyaW5nIHRvIHJldHVybiB0aGUgYWN0dWFsIHBvcnQgbGlzdGVuZWQgb24KKyAqIEBwYXJhbSBmZHNfcCBsb2NhdGlvbiB0byBzdG9yZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuaW5nIGZpbGUgZGVzY3JpcHRvcnMgb3IgLTEgb24gZXJyb3IKKyAqLworCitpbnQKK19kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpyZXRwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgKipmZHNfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTb2NrZXQgKmxpc3Rlbl9mZCA9IE5VTEw7CisgIGludCBubGlzdGVuX2ZkID0gMCwgcmVzLCBpLCBwb3J0X251bSA9IC0xOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisKKyAgLy8gT24gVmlzdGEsIHNvY2thZGRyX2dlbiBtdXN0IGJlIGEgc29ja2FkZHJfaW42LCBhbmQgbm90IGEgc29ja2FkZHJfaW42X29sZAorICAvL1RoYXQncyByZXF1aXJlZCBmb3IgZmFtaWx5ID09IElQdjYod2hpY2ggaXMgdGhlIGRlZmF1bHQgb24gVmlzdGEgaWYgZmFtaWx5IGlzIG5vdCBnaXZlbikKKyAgLy9TbyB3ZSB1c2Ugb3VyIG93biB1bmlvbiBpbnN0ZWFkIG9mIHNvY2thZGRyX2dlbjoKKworICB0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgQWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcmVzc0luOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgQWRkcmVzc0luNjsKKyAgfSBteXNvY2thZGRyX2dlbjsKKworICAqZmRzX3AgPSBOVUxMOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3dpbl9zdGFydHVwX3dpbnNvY2sgKCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBfREJVU19aRVJPIChoaW50cyk7CisKKyAgaWYgKCFmYW1pbHkpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY0IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY2IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyBmYW1pbHkgJXMiLCBmYW1pbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworI2lmZGVmIEFJX0FERFJDT05GSUcKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHIHwgQUlfUEFTU0lWRTsKKyNlbHNlCisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyNlbmRpZgorCisgcmVkb19sb29rdXBfd2l0aF9wb3J0OgorICBpZiAoKHJlcyA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKSkgIT0gMCB8fCAhYWkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgaG9zdC9wb3J0OiBcIiVzOiVzXCI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICB0bXAgPSBhaTsKKyAgd2hpbGUgKHRtcCkKKyAgICB7CisgICAgICBEQnVzU29ja2V0IGZkID0gREJVU19TT0NLRVRfSU5JVCwgKm5ld2xpc3Rlbl9mZDsKKyAgICAgIGlmICgoZmQuc29jayA9IHNvY2tldCAodG1wLT5haV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKSkgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICBpZiAoYmluZCAoZmQuc29jaywgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkLnNvY2spOworICAgICAgICAgIGlmIChlcnJubyA9PSBXU0FFQUREUklOVVNFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggcG9ydD0wIHRyaWVzIHRvCisgICAgICAgICAgICAgICAqIGJpbmQgdGhlIHNhbWUgcG9ydCB0d2ljZSwgc28gd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAqIGlnbm9yZSB0aGUgc2Vjb25kIGJpbmQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICB0bXAgPSB0bXAtPmFpX25leHQ7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgICAgaWYgKGxpc3RlbiAoZmQuc29jaywgMzAgLyogYmFja2xvZyAqLykgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxpc3RlbiBvbiBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQuc29jayk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgbmV3bGlzdGVuX2ZkID0gZGJ1c19yZWFsbG9jKGxpc3Rlbl9mZCwgc2l6ZW9mKERCdXNTb2NrZXQpKihubGlzdGVuX2ZkKzEpKTsKKyAgICAgIGlmICghbmV3bGlzdGVuX2ZkKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkLnNvY2spOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZSBoYW5kbGUgYXJyYXkiKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgbGlzdGVuX2ZkID0gbmV3bGlzdGVuX2ZkOworICAgICAgbGlzdGVuX2ZkW25saXN0ZW5fZmRdID0gZmQ7CisgICAgICBubGlzdGVuX2ZkKys7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocmV0cG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIHBvcnQsIG9yIHVzZWQgMCwgdGhlbgorICAgICAgICAgICAgIHRoZSBrZXJuZWwgY2hvb3NlcyBhIHBvcnQuIEFmdGVyIHRoZSBmaXJzdCBhZGRyZXNzCisgICAgICAgICAgICAgaXMgYm91bmQgdG8sIHdlIG5lZWQgdG8gZm9yY2UgYWxsIHJlbWFpbmluZyBhZGRyZXNzZXMKKyAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgcG9ydCAqLworICAgICAgICAgIGlmICghcG9ydCB8fCAhc3RyY21wKHBvcnQsICIwIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG15c29ja2FkZHJfZ2VuIGFkZHI7CisgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgICAgICAgICBjaGFyIHBvcnRidWZbTklfTUFYU0VSVl07CisKKyAgICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLnNvY2ssICZhZGRyLkFkZHJlc3MsICZhZGRybGVuKSA9PSBTT0NLRVRfRVJST1IgfHwKKyAgICAgICAgICAgICAgICAocmVzID0gZ2V0bmFtZWluZm8gKCZhZGRyLkFkZHJlc3MsIGFkZHJsZW4sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0YnVmLCBzaXplb2YocG9ydGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDU0VSVikpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIHBvcnQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8oKSk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZChyZXRwb3J0LCBwb3J0YnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBSZWxlYXNlIGN1cnJlbnQgYWRkcmVzcyBsaXN0ICYgcmVkbyBsb29rdXAgKi8KKyAgICAgICAgICAgICAgcG9ydCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShyZXRwb3J0KTsKKyAgICAgICAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICAgICAgICAgICAgZ290byByZWRvX2xvb2t1cF93aXRoX3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgIAorICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgIH0KKyAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgYWkgPSBOVUxMOworCisgIGlmICghbmxpc3Rlbl9mZCkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm5vIChXU0FFQUREUklOVVNFKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBzc2NhbmYoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHJldHBvcnQpLCAiJWQiLCAmcG9ydF9udW0pOworCisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZCA7IGkrKykKKyAgICB7CisgICAgICBfZGJ1c193aW5faGFuZGxlX3NldF9jbG9zZV9vbl9leGVjICgoSEFORExFKSBsaXN0ZW5fZmRbaV0uc29jayk7CisgICAgICBpZiAoIV9kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKGxpc3Rlbl9mZFtpXSwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgKmZkc19wID0gbGlzdGVuX2ZkOworCisgIHJldHVybiBubGlzdGVuX2ZkOworCisgZmFpbGVkOgorICBpZiAoYWkpCisgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgZm9yIChpID0gMCA7IGkgPCBubGlzdGVuX2ZkIDsgaSsrKQorICAgIGNsb3Nlc29ja2V0IChsaXN0ZW5fZmRbaV0uc29jayk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmQpOworICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiBvbiBhIGxpc3RlbmluZyBzb2NrZXQuCisgKiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKgorICogQHBhcmFtIGxpc3Rlbl9mZCB0aGUgbGlzdGVuIGZpbGUgZGVzY3JpcHRvcgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gZmQgb2YgdGhlIGNsaWVudCwgb3IgLTEgb24gZXJyb3IKKyAqLworREJ1c1NvY2tldAorX2RidXNfYWNjZXB0ICAoREJ1c1NvY2tldCBsaXN0ZW5fZmQpCit7CisgIERCdXNTb2NrZXQgY2xpZW50X2ZkOworCisgcmV0cnk6CisgIGNsaWVudF9mZC5zb2NrID0gYWNjZXB0IChsaXN0ZW5fZmQuc29jaywgTlVMTCwgTlVMTCk7CisKKyAgaWYgKCFfZGJ1c19zb2NrZXRfaXNfdmFsaWQgKGNsaWVudF9mZCkpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiY2xpZW50IGZkICVJdSBhY2NlcHRlZFxuIiwgY2xpZW50X2ZkLnNvY2spOworICAKKyAgcmV0dXJuIGNsaWVudF9mZDsKK30KKworCisKKworZGJ1c19ib29sX3QKK19kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0IChEQnVzU29ja2V0ICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKy8qIEZJWE1FOiBmb3IgdGhlIHNlc3Npb24gYnVzIGNyZWRlbnRpYWxzIHNob3VsZG4ndCBtYXR0ZXIgKD8pLCBidXQKKyAqIGZvciB0aGUgc3lzdGVtIGJ1cyB0aGV5IGFyZSBwcmVzdW1hYmx5IGVzc2VudGlhbC4gQSByb3VnaCBvdXRsaW5lCisgKiBvZiBhIHdheSB0byBpbXBsZW1lbnQgdGhlIGNyZWRlbnRpYWwgdHJhbnNmZXIgd291bGQgYmUgdGhpczoKKyAqCisgKiBjbGllbnQgd2FpdHMgdG8gKnJlYWQqIGEgYnl0ZS4KKyAqCisgKiBzZXJ2ZXIgY3JlYXRlcyBhIG5hbWVkIHBpcGUgd2l0aCBhIHJhbmRvbSBuYW1lLCBzZW5kcyBhIGJ5dGUKKyAqIGNvbnRpbmluZyBpdHMgbGVuZ3RoLCBhbmQgaXRzIG5hbWUuCisgKgorICogY2xpZW50IHJlYWRzIHRoZSBuYW1lLCBjb25uZWN0cyB0byBpdCAodXNpbmcgV2luMzIgQVBJKS4KKyAqCisgKiBzZXJ2ZXIgd2FpdHMgZm9yIGNvbm5lY3Rpb24gdG8gdGhlIG5hbWVkIHBpcGUsIHRoZW4gY2FsbHMKKyAqIEltcGVyc29uYXRlTmFtZWRQaXBlQ2xpZW50KCksIG5vdGVzIGl0cyBub3ctY3VycmVudCBjcmVkZW50aWFscywKKyAqIGNhbGxzIFJldmVydFRvU2VsZigpLCBjbG9zZXMgaXRzIGhhbmRsZXMgdG8gdGhlIG5hbWVkIHBpcGUsIGFuZAorICogaXMgZG9uZS4gKE1heWJlIHRoZXJlIGlzIHNvbWUgb3RoZXIgd2F5IHRvIGdldCB0aGUgU0lEIG9mIGEgbmFtZWQKKyAqIHBpcGUgY2xpZW50IHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBpbXBlcnNvbmF0aW9uPykKKyAqCisgKiBjbGllbnQgY2xvc2VzIGl0cyBoYW5kbGVzIGFuZCBpcyBkb25lLgorICogCisgKiBSYWxmOiBXaHkgbm90IHNlbmRpbmcgY3JlZGVudGlhbHMgb3ZlciB0aGUgZ2l2ZW4gdGhpcyBjb25uZWN0aW9uID8KKyAqIFVzaW5nIG5hbWVkIHBpcGVzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gYmUgY29ubmVjdGVkIGZyb20gYSB1bml4IGNsaWVudC4gIAorICoKKyAqLworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgREJ1c1N0cmluZyBidWY7IAorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmJ1ZiwgIlwwIiwgMSk7CithZ2FpbjoKKyAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlX3NvY2tldCAoaGFuZGxlLCAmYnVmLCAwLCAxICk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgY3JlZGVudGlhbHMgYnl0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuID09IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJ3cm90ZSB6ZXJvIGJ5dGVzIHdyaXRpbmcgY3JlZGVudGlhbHMgYnl0ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfd3JpdHRlbiA9PSAxKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cm90ZSAxIHplcm8gYnl0ZSwgY3JlZGVudGlhbCBzZW5kaW5nIGlzbid0IGltcGxlbWVudGVkIHlldFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgd2hpY2ggbXVzdCBiZSBudWwgKGFuIGVycm9yIG9jY3VycyBvdGhlcndpc2UpLAorICogYW5kIHJlYWRzIHVuaXggY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLiBGaWxscyBpbiBwaWQvdWlkL2dpZCB3aXRoCisgKiAtMSBpZiBubyBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlLiBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIGEgYnl0ZSB3YXMgcmVhZCwgbm90IHdoZXRoZXIgd2UgZ290IHZhbGlkIGNyZWRlbnRpYWxzLiBPbiBzb21lCisgKiBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LCByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkKKyAqIHJlcXVpcmVkLCBidXQgd2UgZG8gaXQgYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICoKKyAqIEZhaWxzIGlmIG5vIGJ5dGUgaXMgYXZhaWxhYmxlLCBzbyB5b3UgbXVzdCBzZWxlY3QoKSBmaXJzdC4KKyAqCisgKiBUaGUgcG9pbnQgb2YgdGhlIGJ5dGUgaXMgdGhhdCBvbiBzb21lIHN5c3RlbXMgd2UgaGF2ZSB0bworICogdXNlIHNlbmRtc2coKS9yZWN2bXNnKCkgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGhhbmRsZSB0aGUgY2xpZW50IGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHN0cnVjdCB0byBmaWxsIHdpdGggY3JlZGVudGlhbHMgb2YgY2xpZW50CisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgZXJyb3IgY29kZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgIChEQnVzU29ja2V0ICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgaW50IGJ5dGVzX3JlYWQgPSAwOworICBEQnVzU3RyaW5nIGJ1ZjsKKworICBjaGFyICpzaWQgPSBOVUxMOworICBkYnVzX3BpZF90IHBpZDsKKyAgaW50IHJldHZhbCA9IEZBTFNFOworCisgIC8vIGNvdWxkIGZhaWwgZHVlIHRvbyBPT00KKyAgaWYgKF9kYnVzX3N0cmluZ19pbml0ICgmYnVmKSkKKyAgICB7CisgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXQgKGhhbmRsZSwgJmJ1ZiwgMSApOworCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApIAorICAgICAgICBfZGJ1c192ZXJib3NlICgiZ290IG9uZSB6ZXJvIGJ5dGUgZnJvbSBzZXJ2ZXJcbiIpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1Zik7CisgICAgfQorCisgIHBpZCA9IF9kYnVzX2dldF9wZWVyX3BpZF9mcm9tX3RjcF9oYW5kbGUgKGhhbmRsZS5zb2NrKTsKKyAgaWYgKHBpZCA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQgKGNyZWRlbnRpYWxzLCBwaWQpOworCisgIGlmIChfZGJ1c19nZXRzaWQgKCZzaWQsIHBpZCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLCBzaWQpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0OgorICBpZiAoc2lkKQorICAgIExvY2FsRnJlZSAoc2lkKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzIAorKiBwcml2YXRlIHRvIHRoZSB1c2VyIAorKgorKiBAcGFyYW0gZGlyIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorKiovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlciAoREJ1c1N0cmluZyAqZGlyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICAvKiBUT0RPICovCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIGZpbGVuYW1lIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgKgorICogQHRvZG8gaXQgbWlnaHQgYmUgY3V0ZSB0byBjb2xsYXBzZSBtdWx0aXBsZSAnLycgc3VjaCBhcyAiZm9vLy8iCisgKiBjb25jYXQgIi8vYmFyIgorICoKKyAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gbmV4dF9jb21wb25lbnQgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChEQnVzU3RyaW5nICAgICAgICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpuZXh0X2NvbXBvbmVudCkKK3sKKyAgZGJ1c19ib29sX3QgZGlyX2VuZHNfaW5fc2xhc2g7CisgIGRidXNfYm9vbF90IGZpbGVfc3RhcnRzX3dpdGhfc2xhc2g7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpID09IDAgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuZXh0X2NvbXBvbmVudCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkaXJfZW5kc19pbl9zbGFzaCA9CisgICAgKCcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgLSAxKSB8fAorICAgICAnXFwnID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlyKSAtIDEpKTsKKworICBmaWxlX3N0YXJ0c193aXRoX3NsYXNoID0KKyAgICAoJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobmV4dF9jb21wb25lbnQsIDApIHx8CisgICAgICdcXCcgPT0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChuZXh0X2NvbXBvbmVudCwgMCkpOworCisgIGlmIChkaXJfZW5kc19pbl9zbGFzaCAmJiBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChkaXIsIDEpOworICAgIH0KKyAgZWxzZSBpZiAoIShkaXJfZW5kc19pbl9zbGFzaCB8fCBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGlyLCAnXFwnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0gREJ1c0NyZWRlbnRpYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSh1c2VybmFtZSkpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gdGhlCisgKiBwYXNzZWQtaW4gY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBhZGQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnk7IGRvZXMgbm90IHByb3Blcmx5IHJvbGwgYmFjayBvbiBmYWlsdXJlLCBzbyBvbmx5IHNvbWUgY3JlZGVudGlhbHMgbWF5IGhhdmUgYmVlbiBhZGRlZAorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBjaGFyICpzaWQgPSBOVUxMOworCisgIGlmICghX2RidXNfZ2V0c2lkKCZzaWQsIF9kYnVzX2dldHBpZCgpKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQgKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLHNpZCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgZ290byBlbmQ7CitmYWlsZWQ6CisgIHJldHZhbCA9IEZBTFNFOworZW5kOgorICBpZiAoc2lkKQorICAgIExvY2FsRnJlZShzaWQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIHRoZSBzdHJpbmcgdGhlIGlkZW50aXR5IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB3aGVuIHdlCisgKiBhdXRoZW50aWNhdGUsIG9uIFVOSVggdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZXNzIFVJRCBhbmQgb24KKyAqIFdpbmRvd3Mgc29tZXRoaW5nIGVsc2UsIHByb2JhYmx5IGEgV2luZG93cyBTSUQgc3RyaW5nLiAgTm8gZXNjYXBpbmcKKyAqIGlzIHJlcXVpcmVkLCB0aGF0IGlzIGRvbmUgaW4gZGJ1cy1hdXRoLmMuIFRoZSB1c2VybmFtZSBoZXJlCisgKiBuZWVkIG5vdCBiZSBhbnl0aGluZyBodW1hbi1yZWFkYWJsZSwgaXQgY2FuIGJlIHRoZSBtYWNoaW5lLXJlYWRhYmxlCisgKiBmb3JtIGkuZS4gYSB1c2VyIGlkLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKiBAdG9kbyB0byB3aGljaCBjbGFzcyBiZWxvbmdzIHRoaXMgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c1N0cmluZyAqc3RyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgY2hhciAqc2lkID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldHNpZCgmc2lkLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IF9kYnVzX3N0cmluZ19hcHBlbmQgKHN0cixzaWQpOworCisgIExvY2FsRnJlZShzaWQpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEdldHMgb3VyIHByb2Nlc3MgSUQKKyAqIEByZXR1cm5zIHByb2Nlc3MgSUQKKyAqLworZGJ1c19waWRfdAorX2RidXNfZ2V0cGlkICh2b2lkKQoreworICByZXR1cm4gR2V0Q3VycmVudFByb2Nlc3NJZCAoKTsKK30KKworLyoqIEdldHMgb3VyIFVuaXggVUlECisgKiBAcmV0dXJucyBvbiBXaW5kb3dzLCBqdXN0IERCVVNfVUlEX1VOU0VUCisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2dldHVpZCAodm9pZCkKK3sKKyAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisgIFNsZWVwIChtaWxsaXNlY29uZHMpOworfQorCisKKy8qKgorICogR2V0IGN1cnJlbnQgdGltZSwgYXMgaW4gZ2V0dGltZW9mZGF5KCkuIE5ldmVyIHVzZXMgdGhlIG1vbm90b25pYworICogY2xvY2suCisgKgorICogQHBhcmFtIHR2X3NlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBzZWNvbmRzCisgKiBAcGFyYW0gdHZfdXNlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLwordm9pZAorX2RidXNfZ2V0X3JlYWxfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyAgRklMRVRJTUUgZnQ7CisgIGRidXNfdWludDY0X3QgdGltZTY0OworCisgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lICgmZnQpOworCisgIG1lbWNweSAoJnRpbWU2NCwgJmZ0LCBzaXplb2YgKHRpbWU2NCkpOworCisgIC8qIENvbnZlcnQgZnJvbSAxMDBzIG9mIG5hbm9zZWNvbmRzIHNpbmNlIDE2MDEtMDEtMDEKKyAgKiB0byBVbml4IGVwb2NoLiBZZXMsIHRoaXMgaXMgWTIwMzggdW5zYWZlLgorICAqLworICB0aW1lNjQgLT0gREJVU19JTlQ2NF9DT05TVEFOVCAoMTE2NDQ0NzM2MDAwMDAwMDAwKTsKKyAgdGltZTY0IC89IDEwOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHRpbWU2NCAvIDEwMDAwMDA7CisKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0aW1lNjQgJSAxMDAwMDAwOworfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUsIGFzIGluIGdldHRpbWVvZmRheSgpLiBVc2UgdGhlIG1vbm90b25pYyBjbG9jayBpZgorICogYXZhaWxhYmxlLCB0byBhdm9pZCBwcm9ibGVtcyB3aGVuIHRoZSBzeXN0ZW0gdGltZSBjaGFuZ2VzLgorICoKKyAqIEBwYXJhbSB0dl9zZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2Ygc2Vjb25kcworICogQHBhcmFtIHR2X3VzZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKi8KK3ZvaWQKK19kYnVzX2dldF9tb25vdG9uaWNfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKQoreworICAvKiBubyBpbXBsZW1lbnRhdGlvbiB5ZXQsIGZhbGwgYmFjayB0byB3YWxsLWNsb2NrIHRpbWUgKi8KKyAgX2RidXNfZ2V0X3JlYWxfdGltZSAodHZfc2VjLCB0dl91c2VjKTsKK30KKworLyoqCisgKiBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICovCit2b2lkCitfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpCit7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGRpcmVjdG9yeTsgc3VjY2VlZHMgaWYgdGhlIGRpcmVjdG9yeQorICogaXMgY3JlYXRlZCBvciBhbHJlYWR5IGV4aXN0ZWQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIGRpcmVjdG9yeSBmaWxlbmFtZQorICogQHBhcmFtIGVycm9yIGluaXRpYWxpemVkIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2RpcmVjdG9yeSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKCFDcmVhdGVEaXJlY3RvcnlBIChmaWxlbmFtZV9jLCBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoR2V0TGFzdEVycm9yICgpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzLAorICogdXNpbmcgdGhlIGJlc3QgbWVjaGFuaXNtIHdlIGNhbiBjb21lIHVwIHdpdGguCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbl9ieXRlcyB0aGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBhcHBlbmQgdG8gc3RyaW5nCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGludCBvbGRfbGVuOworICBjaGFyICpwOworICBIQ1JZUFRQUk9WIGhwcm92OworCisgIG9sZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBuX2J5dGVzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9sZF9sZW4sIG5fYnl0ZXMpOworCisgIGlmICghQ3J5cHRBY3F1aXJlQ29udGV4dCAoJmhwcm92LCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9WRVJJRllDT05URVhUKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghQ3J5cHRHZW5SYW5kb20gKGhwcm92LCBuX2J5dGVzLCBwKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0IChocHJvdiwgMCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIENyeXB0UmVsZWFzZUNvbnRleHQgKGhwcm92LCAwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAKKyAqIFRNUERJUiwgVE1QLCBhbmQgVEVNUCBpbiB0aGF0IG9yZGVyLiBJZiBub25lIG9mIHRob3NlIGFyZSBzZXQgIi90bXAiIGlzIHJldHVybmVkCisgKgorICogQHJldHVybnMgbG9jYXRpb24gb2YgdGVtcCBkaXJlY3RvcnksIG9yICNOVUxMIGlmIG5vIG1lbW9yeSBmb3IgbG9ja2luZworICovCitjb25zdCBjaGFyKgorX2RidXNfZ2V0X3RtcGRpcih2b2lkKQoreworICAvKiBQcm90ZWN0ZWQgYnkgX0RCVVNfTE9DS19zeXNkZXBzICovCisgIHN0YXRpYyBjb25zdCBjaGFyKiB0bXBkaXIgPSBOVUxMOworICBzdGF0aWMgY2hhciBidWZbMTAwMF07CisKKyAgaWYgKCFfREJVU19MT0NLIChzeXNkZXBzKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9zbGFzaDsKKworICAgICAgaWYgKCFHZXRUZW1wUGF0aEEgKHNpemVvZiAoYnVmKSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJHZXRUZW1wUGF0aCBmYWlsZWRcbiIpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIC8qIERyb3AgdGVybWluYXRpbmcgYmFja3NsYXNoIG9yIHNsYXNoICovCisgICAgICBsYXN0X3NsYXNoID0gX21ic3JjaHIgKGJ1ZiwgJ1xcJyk7CisgICAgICBpZiAobGFzdF9zbGFzaCA+IGJ1ZiAmJiBsYXN0X3NsYXNoWzFdID09ICdcMCcpCisgICAgICAgIGxhc3Rfc2xhc2hbMF0gPSAnXDAnOworICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyIChidWYsICcvJyk7CisgICAgICBpZiAobGFzdF9zbGFzaCA+IGJ1ZiAmJiBsYXN0X3NsYXNoWzFdID09ICdcMCcpCisgICAgICAgIGxhc3Rfc2xhc2hbMF0gPSAnXDAnOworCisgICAgICB0bXBkaXIgPSBidWY7CisgICAgfQorCisgIF9EQlVTX1VOTE9DSyAoc3lzZGVwcyk7CisKKyAgX2RidXNfYXNzZXJ0KHRtcGRpciAhPSBOVUxMKTsKKworICByZXR1cm4gdG1wZGlyOworfQorCisKKy8qKgorICogRGVsZXRlcyB0aGUgZ2l2ZW4gZmlsZS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIAorICogQHJldHVybnMgI1RSVUUgaWYgdW5saW5rKCkgc3VjY2VlZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWxldGVfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChEZWxldGVGaWxlQSAoZmlsZW5hbWVfYykgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGVsZXRlIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisjaWYgIWRlZmluZWQgKERCVVNfRElTQUJMRV9BU1NFUlQpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMpCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKERCVVNfV0lOQ0UpCisjIGlmZGVmIEJBQ0tUUkFDRVMKKyMgIHVuZGVmIEJBQ0tUUkFDRVMKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBCQUNLVFJBQ0VTCisjZW5kaWYKKworI2lmZGVmIEJBQ0tUUkFDRVMKKy8qCisgKiBCYWNrdHJhY2UgR2VuZXJhdG9yCisgKgorICogQ29weXJpZ2h0IDIwMDQgRXJpYyBQb2VjaAorICogQ29weXJpZ2h0IDIwMDQgUm9iZXJ0IFNoZWFybWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8d2ludmVyLmg+CisjaW5jbHVkZSA8aW1hZ2VobHAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIGZwcmludGYgKHN0ZGVyciwgZm10LCAjI19fVkFfQVJHU19fKQorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgQk9PTCBpbnQKKworI2RlZmluZSBfX2kzODZfXworI2VuZGlmCisKKy8vI2RlZmluZSBNQUtFX0ZVTkNQVFIoZikgc3RhdGljIHR5cGVvZihmKSAqIHAjI2YKKworLy9NQUtFX0ZVTkNQVFIoU3RhY2tXYWxrKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldE1vZHVsZUJhc2UpOworLy9NQUtFX0ZVTkNQVFIoU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcyk7CisvL01BS0VfRlVOQ1BUUihTeW1Jbml0aWFsaXplKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldFN5bUZyb21BZGRyKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldE1vZHVsZUluZm8pOworc3RhdGljIEJPT0wgKFdJTkFQSSAqcFN0YWNrV2FsaykoCisgIERXT1JEIE1hY2hpbmVUeXBlLAorICBIQU5ETEUgaFByb2Nlc3MsCisgIEhBTkRMRSBoVGhyZWFkLAorICBMUFNUQUNLRlJBTUUgU3RhY2tGcmFtZSwKKyAgUFZPSUQgQ29udGV4dFJlY29yZCwKKyAgUFJFQURfUFJPQ0VTU19NRU1PUllfUk9VVElORSBSZWFkTWVtb3J5Um91dGluZSwKKyAgUEZVTkNUSU9OX1RBQkxFX0FDQ0VTU19ST1VUSU5FIEZ1bmN0aW9uVGFibGVBY2Nlc3NSb3V0aW5lLAorICBQR0VUX01PRFVMRV9CQVNFX1JPVVRJTkUgR2V0TW9kdWxlQmFzZVJvdXRpbmUsCisgIFBUUkFOU0xBVEVfQUREUkVTU19ST1VUSU5FIFRyYW5zbGF0ZUFkZHJlc3MKKyk7CisjaWZkZWYgX1dJTjY0CitzdGF0aWMgRFdPUkQ2NCAoV0lOQVBJICpwU3ltR2V0TW9kdWxlQmFzZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQ2NCBkd0FkZHIKKyk7CitzdGF0aWMgUFZPSUQgIChXSU5BUEkgKnBTeW1GdW5jdGlvblRhYmxlQWNjZXNzKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IEFkZHJCYXNlCispOworI2Vsc2UKK3N0YXRpYyBEV09SRCAoV0lOQVBJICpwU3ltR2V0TW9kdWxlQmFzZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgZHdBZGRyCispOworc3RhdGljIFBWT0lEICAoV0lOQVBJICpwU3ltRnVuY3Rpb25UYWJsZUFjY2VzcykoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkckJhc2UKKyk7CisjZW5kaWYKK3N0YXRpYyBCT09MICAoV0lOQVBJICpwU3ltSW5pdGlhbGl6ZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgUFNUUiBVc2VyU2VhcmNoUGF0aCwKKyAgQk9PTCBmSW52YWRlUHJvY2VzcworKTsKK3N0YXRpYyBCT09MICAoV0lOQVBJICpwU3ltR2V0U3ltRnJvbUFkZHIpKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIEFkZHJlc3MsCisgIFBEV09SRCBEaXNwbGFjZW1lbnQsCisgIFBJTUFHRUhMUF9TWU1CT0wgU3ltYm9sCispOworc3RhdGljIEJPT0wgIChXSU5BUEkgKnBTeW1HZXRNb2R1bGVJbmZvKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIsCisgIFBJTUFHRUhMUF9NT0RVTEUgTW9kdWxlSW5mbworKTsKK3N0YXRpYyBEV09SRCAgKFdJTkFQSSAqcFN5bVNldE9wdGlvbnMpKAorICBEV09SRCBTeW1PcHRpb25zCispOworCisKK3N0YXRpYyBCT09MIGluaXRfYmFja3RyYWNlKCkKK3sKKyAgICBITU9EVUxFIGhtb2REYmdIZWxwID0gTG9hZExpYnJhcnlBKCJkYmdoZWxwIik7CisvKgorICAgICNkZWZpbmUgR0VURlVOQyh4KSBcCisgICAgcCMjeCA9ICh0eXBlb2YoeCkqKUdldFByb2NBZGRyZXNzKGhtb2REYmdIZWxwLCAjeCk7IFwKKyAgICBpZiAoIXAjI3gpIFwKKyAgICB7IFwKKyAgICAgICAgcmV0dXJuIEZBTFNFOyBcCisgICAgfQorICAgICovCisKKworLy8gICAgR0VURlVOQyhTdGFja1dhbGspOworLy8gICAgR0VURlVOQyhTeW1HZXRNb2R1bGVCYXNlKTsKKy8vICAgIEdFVEZVTkMoU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcyk7CisvLyAgICBHRVRGVU5DKFN5bUluaXRpYWxpemUpOworLy8gICAgR0VURlVOQyhTeW1HZXRTeW1Gcm9tQWRkcik7CisvLyAgICBHRVRGVU5DKFN5bUdldE1vZHVsZUluZm8pOworCisjZGVmaW5lIEZVTkMoeCkgI3gKKworICAgICAgcFN0YWNrV2FsayA9IChCT09MICAoV0lOQVBJICopKAorRFdPUkQgTWFjaGluZVR5cGUsCitIQU5ETEUgaFByb2Nlc3MsCitIQU5ETEUgaFRocmVhZCwKK0xQU1RBQ0tGUkFNRSBTdGFja0ZyYW1lLAorUFZPSUQgQ29udGV4dFJlY29yZCwKK1BSRUFEX1BST0NFU1NfTUVNT1JZX1JPVVRJTkUgUmVhZE1lbW9yeVJvdXRpbmUsCitQRlVOQ1RJT05fVEFCTEVfQUNDRVNTX1JPVVRJTkUgRnVuY3Rpb25UYWJsZUFjY2Vzc1JvdXRpbmUsCitQR0VUX01PRFVMRV9CQVNFX1JPVVRJTkUgR2V0TW9kdWxlQmFzZVJvdXRpbmUsCitQVFJBTlNMQVRFX0FERFJFU1NfUk9VVElORSBUcmFuc2xhdGVBZGRyZXNzCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTdGFja1dhbGspKTsKKyNpZmRlZiBfV0lONjQKKyAgICBwU3ltR2V0TW9kdWxlQmFzZT0oRFdPUkQ2NCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IGR3QWRkcgorKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltR2V0TW9kdWxlQmFzZSkpOworICAgIHBTeW1GdW5jdGlvblRhYmxlQWNjZXNzPShQVk9JRCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IEFkZHJCYXNlCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1GdW5jdGlvblRhYmxlQWNjZXNzKSk7CisjZWxzZQorICAgIHBTeW1HZXRNb2R1bGVCYXNlPShEV09SRCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUdldE1vZHVsZUJhc2UpKTsKKyAgICBwU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcz0oUFZPSUQgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkckJhc2UKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MpKTsKKyNlbmRpZgorICAgIHBTeW1Jbml0aWFsaXplID0gKEJPT0wgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgUFNUUiBVc2VyU2VhcmNoUGF0aCwKKyAgQk9PTCBmSW52YWRlUHJvY2VzcworKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltSW5pdGlhbGl6ZSkpOworICAgIHBTeW1HZXRTeW1Gcm9tQWRkciA9IChCT09MICAoV0lOQVBJICopKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIEFkZHJlc3MsCisgIFBEV09SRCBEaXNwbGFjZW1lbnQsCisgIFBJTUFHRUhMUF9TWU1CT0wgU3ltYm9sCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1HZXRTeW1Gcm9tQWRkcikpOworICAgIHBTeW1HZXRNb2R1bGVJbmZvID0gKEJPT0wgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgZHdBZGRyLAorICBQSU1BR0VITFBfTU9EVUxFIE1vZHVsZUluZm8KKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUdldE1vZHVsZUluZm8pKTsKK3BTeW1TZXRPcHRpb25zID0gKERXT1JEICAoV0lOQVBJICopKAorRFdPUkQgU3ltT3B0aW9ucworKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltU2V0T3B0aW9ucykpOworCisKKyAgICBwU3ltU2V0T3B0aW9ucyhTWU1PUFRfVU5ETkFNRSk7CisKKyAgICBwU3ltSW5pdGlhbGl6ZShHZXRDdXJyZW50UHJvY2VzcygpLCBOVUxMLCBUUlVFKTsKKworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2JhY2t0cmFjZV9mb3JfdGhyZWFkKEhBTkRMRSBoVGhyZWFkKQoreworICAgIFNUQUNLRlJBTUUgc2Y7CisgICAgQ09OVEVYVCBjb250ZXh0OworICAgIERXT1JEIGR3SW1hZ2VUeXBlOworCisgICAgaWYgKCFwU3RhY2tXYWxrKQorICAgICAgICBpZiAoIWluaXRfYmFja3RyYWNlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAvKiBjYW4ndCB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgY3VycmVudCB0aHJlYWQgYXMgR2V0VGhyZWFkQ29udGV4dAorICAgICAqIGRvZXNuJ3Qgc3VwcG9ydCBnZXR0aW5nIGNvbnRleHQgZnJvbSBjdXJyZW50IHRocmVhZCAqLworICAgIGlmIChoVGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRFBSSU5URigiQmFja3RyYWNlOlxuIik7CisKKyAgICBfREJVU19aRVJPKGNvbnRleHQpOworICAgIGNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9GVUxMOworCisgICAgU3VzcGVuZFRocmVhZChoVGhyZWFkKTsKKworICAgIGlmICghR2V0VGhyZWFkQ29udGV4dChoVGhyZWFkLCAmY29udGV4dCkpCisgICAgeworICAgICAgICBEUFJJTlRGKCJDb3VsZG4ndCBnZXQgdGhyZWFkIGNvbnRleHQgKGVycm9yICVsZClcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgUmVzdW1lVGhyZWFkKGhUaHJlYWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX0RCVVNfWkVSTyhzZik7CisKKyNpZmRlZiBfX2kzODZfXworICAgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LkVicDsKKyAgICBzZi5BZGRyRnJhbWUuTW9kZSA9IEFkZHJNb2RlRmxhdDsKKyAgICBzZi5BZGRyUEMuT2Zmc2V0ID0gY29udGV4dC5FaXA7CisgICAgc2YuQWRkclBDLk1vZGUgPSBBZGRyTW9kZUZsYXQ7CisgICAgZHdJbWFnZVR5cGUgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjsKKyNlbGlmIF9NX1g2NAorICBkd0ltYWdlVHlwZSAgICAgICAgICAgICAgICA9IElNQUdFX0ZJTEVfTUFDSElORV9BTUQ2NDsKKyAgc2YuQWRkclBDLk9mZnNldCAgICA9IGNvbnRleHQuUmlwOworICBzZi5BZGRyUEMuTW9kZSAgICAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyRnJhbWUuT2Zmc2V0ID0gY29udGV4dC5Sc3A7CisgIHNmLkFkZHJGcmFtZS5Nb2RlICAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJTdGFjay5PZmZzZXQgPSBjb250ZXh0LlJzcDsKKyAgc2YuQWRkclN0YWNrLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyNlbGlmIF9NX0lBNjQKKyAgZHdJbWFnZVR5cGUgICAgICAgICAgICAgICAgID0gSU1BR0VfRklMRV9NQUNISU5FX0lBNjQ7CisgIHNmLkFkZHJQQy5PZmZzZXQgICAgPSBjb250ZXh0LlN0SUlQOworICBzZi5BZGRyUEMuTW9kZSAgICAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyRnJhbWUuT2Zmc2V0ID0gY29udGV4dC5JbnRTcDsKKyAgc2YuQWRkckZyYW1lLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkckJTdG9yZS5PZmZzZXQ9IGNvbnRleHQuUnNCU1A7CisgIHNmLkFkZHJCU3RvcmUuTW9kZSAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJTdGFjay5PZmZzZXQgPSBjb250ZXh0LkludFNwOworICBzZi5BZGRyU3RhY2suTW9kZSAgID0gQWRkck1vZGVGbGF0OworI2Vsc2UKKyMgZXJyb3IgWW91IG5lZWQgdG8gZmlsbCBpbiB0aGUgU1RBQ0tGUkFNRSBzdHJ1Y3R1cmUgZm9yIHlvdXIgYXJjaGl0ZWN0dXJlCisjZW5kaWYKKworICAgIHdoaWxlIChwU3RhY2tXYWxrKGR3SW1hZ2VUeXBlLCBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgaFRocmVhZCwgJnNmLCAmY29udGV4dCwgTlVMTCwgcFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICBwU3ltR2V0TW9kdWxlQmFzZSwgTlVMTCkpCisgICAgeworICAgICAgICBCWVRFIGJ1ZmZlclsyNTZdOworICAgICAgICBJTUFHRUhMUF9TWU1CT0wgKiBwU3ltYm9sID0gKElNQUdFSExQX1NZTUJPTCAqKWJ1ZmZlcjsKKyAgICAgICAgRFdPUkQgZHdEaXNwbGFjZW1lbnQ7CisKKyAgICAgICAgcFN5bWJvbC0+U2l6ZU9mU3RydWN0ID0gc2l6ZW9mKElNQUdFSExQX1NZTUJPTCk7CisgICAgICAgIHBTeW1ib2wtPk1heE5hbWVMZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIHNpemVvZihJTUFHRUhMUF9TWU1CT0wpICsgMTsKKworICAgICAgICBpZiAoIXBTeW1HZXRTeW1Gcm9tQWRkcihHZXRDdXJyZW50UHJvY2VzcygpLCBzZi5BZGRyUEMuT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdEaXNwbGFjZW1lbnQsIHBTeW1ib2wpKQorICAgICAgICB7CisgICAgICAgICAgICBJTUFHRUhMUF9NT0RVTEUgTW9kdWxlSW5mbzsKKyAgICAgICAgICAgIE1vZHVsZUluZm8uU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKE1vZHVsZUluZm8pOworCisgICAgICAgICAgICBpZiAoIXBTeW1HZXRNb2R1bGVJbmZvKEdldEN1cnJlbnRQcm9jZXNzKCksIHNmLkFkZHJQQy5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNb2R1bGVJbmZvKSkKKyAgICAgICAgICAgICAgICBEUFJJTlRGKCIxXHQlcFxuIiwgKHZvaWQqKXNmLkFkZHJQQy5PZmZzZXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIERQUklOVEYoIjJcdCVzKzB4JWx4XG4iLCBNb2R1bGVJbmZvLkltYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc2YuQWRkclBDLk9mZnNldCAtIE1vZHVsZUluZm8uQmFzZU9mSW1hZ2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGR3RGlzcGxhY2VtZW50KQorICAgICAgICAgICAgRFBSSU5URigiM1x0JXMrMHglbHhcbiIsIHBTeW1ib2wtPk5hbWUsIGR3RGlzcGxhY2VtZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRFBSSU5URigiNFx0JXNcbiIsIHBTeW1ib2wtPk5hbWUpOworICAgIH0KKworICAgIFJlc3VtZVRocmVhZChoVGhyZWFkKTsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSBkdW1wX3RocmVhZF9wcm9jKExQVk9JRCBscFBhcmFtZXRlcikKK3sKKyAgICBkdW1wX2JhY2t0cmFjZV9mb3JfdGhyZWFkKChIQU5ETEUpbHBQYXJhbWV0ZXIpOworICAgIHJldHVybiAwOworfQorCisvKiBjYW5ub3QgZ2V0IHZhbGlkIGNvbnRleHQgZnJvbSBjdXJyZW50IHRocmVhZCwgc28gd2UgaGF2ZSB0byBleGVjdXRlCisgKiBiYWNrdHJhY2UgZnJvbSBhbm90aGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQgZHVtcF9iYWNrdHJhY2UoKQoreworICAgIEhBTkRMRSBoQ3VycmVudFRocmVhZDsKKyAgICBIQU5ETEUgaFRocmVhZDsKKyAgICBEV09SRCBkd1RocmVhZElkOworICAgIER1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLCBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksICZoQ3VycmVudFRocmVhZCwgMCwgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7CisgICAgaFRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBkdW1wX3RocmVhZF9wcm9jLCAoTFBWT0lEKWhDdXJyZW50VGhyZWFkLAorICAgICAgICAwLCAmZHdUaHJlYWRJZCk7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CisgICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CisgICAgQ2xvc2VIYW5kbGUoaEN1cnJlbnRUaHJlYWQpOworfQorI2VuZGlmCisjZW5kaWYgLyogYXNzZXJ0cyBvciB0ZXN0cyBlbmFibGVkICovCisKKyNpZmRlZiBCQUNLVFJBQ0VTCit2b2lkIF9kYnVzX3ByaW50X2JhY2t0cmFjZSh2b2lkKQoreworICBpbml0X2JhY2t0cmFjZSgpOworICBkdW1wX2JhY2t0cmFjZSgpOworfQorI2Vsc2UKK3ZvaWQgX2RidXNfcHJpbnRfYmFja3RyYWNlKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIEQtQnVzIG5vdCBjb21waWxlZCB3aXRoIGJhY2t0cmFjZSBzdXBwb3J0XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgZGJ1c191aW50MzJfdCBmcm9tQXNjaWkoY2hhciBhc2NpaSkKK3sKKyAgICBpZihhc2NpaSA+PSAnMCcgJiYgYXNjaWkgPD0gJzknKQorICAgICAgICByZXR1cm4gYXNjaWkgLSAnMCc7CisgICAgaWYoYXNjaWkgPj0gJ0EnICYmIGFzY2lpIDw9ICdGJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ0EnICsgMTA7CisgICAgaWYoYXNjaWkgPj0gJ2EnICYmIGFzY2lpIDw9ICdmJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIDA7ICAgIAorfQorCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAgIChEQnVzR1VJRCAgICAgICAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworI2lmZGVmIERCVVNfV0lOQ0UKKwlyZXR1cm4gVFJVRTsKKyAgLy8gVE9ETworI2Vsc2UKKyAgICBIV19QUk9GSUxFX0lORk9BIGluZm87CisgICAgY2hhciAqbHBjID0gJmluZm8uc3pId1Byb2ZpbGVHdWlkWzBdOworICAgIGRidXNfdWludDMyX3QgdTsKKworICAgIC8vICB0aGUgaHctcHJvZmlsZSBndWlkIGxpdmVzIGxvbmcgZW5vdWdoCisgICAgaWYoIUdldEN1cnJlbnRId1Byb2ZpbGVBKCZpbmZvKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7IC8vIEZJWE1FCisgICAgICAgIHJldHVybiBGQUxTRTsgIAorICAgICAgfQorCisgICAgLy8gRm9ybTogezEyMzQwMDAxLTQ5ODAtMTkyMC02Nzg4LTEyMzQ1Njc4OTAxMn0KKyAgICBscGMrKzsKKyAgICAvLyAxMjM0MDAwMQorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s0XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzBdID0gdTsKKworICAgIGxwYyArPSA5OworICAgIC8vIDQ5ODAtMTkyMAorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s1XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzZdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbN10pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s4XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzFdID0gdTsKKyAgICAKKyAgICBscGMgKz0gMTA7CisgICAgLy8gNjc4OC0xMjM0CisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzhdKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbMl0gPSB1OworICAgIAorICAgIGxwYyArPSA5OworICAgIC8vIDU2Nzg5MDEyCisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzRdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNV0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s2XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzddKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbM10gPSB1OworI2VuZGlmCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworSEFORExFIF9kYnVzX2dsb2JhbF9sb2NrIChjb25zdCBjaGFyICptdXRleG5hbWUpCit7CisgIEhBTkRMRSBtdXRleDsKKyAgRFdPUkQgZ290TXV0ZXg7CisKKyAgbXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBtdXRleG5hbWUgKTsKKyAgaWYoICFtdXRleCApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgZ290TXV0ZXggPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBtdXRleCwgSU5GSU5JVEUgKTsKKyAgIHN3aXRjaCggZ290TXV0ZXggKQorICAgICB7CisgICAgICAgY2FzZSBXQUlUX0FCQU5ET05FRDoKKyAgICAgICAgICAgICAgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUgKG11dGV4KTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIGNhc2UgV0FJVF9GQUlMRUQ6CisgICAgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgfQorCisgICByZXR1cm4gbXV0ZXg7Cit9CisKK3N0YXRpYwordm9pZCBfZGJ1c19nbG9iYWxfdW5sb2NrIChIQU5ETEUgbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICBDbG9zZUhhbmRsZSAobXV0ZXgpOyAKK30KKworLy8gZm9yIHByb3BlciBjbGVhbnVwIGluIGRidXMtZGFlbW9uCitzdGF0aWMgSEFORExFIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworc3RhdGljIEhBTkRMRSBoREJ1c1NoYXJlZE1lbSA9IE5VTEw7CisvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworc3RhdGljIGNvbnN0IGNoYXIgKmNVbmlxdWVEQnVzSW5pdE11dGV4ID0gIlVuaXF1ZURCdXNJbml0TXV0ZXgiOworLy8gc3luYyBfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzCitzdGF0aWMgY29uc3QgY2hhciAqY0RCdXNBdXRvbGF1bmNoTXV0ZXggPSAiREJ1c0F1dG9sYXVuY2hNdXRleCI7CisvLyBtdXRleCB0byBkZXRlcm1pbmUgaWYgZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBzdGFydGVkIChwZXIgdXNlcikKK3N0YXRpYyBjb25zdCBjaGFyICpjREJ1c0RhZW1vbk11dGV4ID0gIkRCdXNEYWVtb25NdXRleCI7CisvLyBuYW1lZCBzaG0gZm9yIGRidXMgYWRyZXNzIGluZm8gKHBlciB1c2VyKQorc3RhdGljIGNvbnN0IGNoYXIgKmNEQnVzRGFlbW9uQWRkcmVzc0luZm8gPSAiREJ1c0RhZW1vbkFkZHJlc3NJbmZvIjsKKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goREJ1c1N0cmluZyAqb3V0KQoreworICAgIERCdXNTdHJpbmcgaW5zdGFsbF9wYXRoOworCisgICAgY2hhciBwYXRoW01BWF9QQVRIKjJdOworICAgIGludCBwYXRoX3NpemUgPSBzaXplb2YocGF0aCk7CisKKyAgICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3QocGF0aCxwYXRoX3NpemUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdCgmaW5zdGFsbF9wYXRoKTsKKyAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKCZpbnN0YWxsX3BhdGgscGF0aCk7CisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdChvdXQpOworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpKCZpbnN0YWxsX3BhdGgsMCxfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmaW5zdGFsbF9wYXRoKSk7CisKKyAgICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmaW5zdGFsbF9wYXRoLCBvdXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKERCdXNTdHJpbmcgKm91dCwgY29uc3QgY2hhciAqYmFzZXN0cmluZywgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIF9kYnVzX3N0cmluZ19pbml0KG91dCk7CisgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LGJhc2VzdHJpbmcpOworCisgIGlmICghc2NvcGUpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIippbnN0YWxsLXBhdGgiKSA9PSAwCisgICAgICAgIC8vIGZvciAxLjMgY29tcGF0aWJpbGl0eQorICAgICAgICB8fCBzdHJjbXAoc2NvcGUsImluc3RhbGwtcGF0aCIpID09IDApCisgICAgeworICAgICAgREJ1c1N0cmluZyB0ZW1wOworICAgICAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goJnRlbXApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUob3V0KTsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZ0ZW1wKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmdGVtcCk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIip1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyhvdXQpKQorICAgICAgICB7CisgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKG91dCk7CisgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RybGVuKHNjb3BlKSA+IDApCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsIi0iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LHNjb3BlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3NobV9uYW1lIChEQnVzU3RyaW5nICpvdXQsY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKG91dCxjREJ1c0RhZW1vbkFkZHJlc3NJbmZvLHNjb3BlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfbXV0ZXhfbmFtZSAoREJ1c1N0cmluZyAqb3V0LGNvbnN0IGNoYXIgKnNjb3BlKQoreworICByZXR1cm4gX2RidXNfZ2V0X2FkZHJlc3Nfc3RyaW5nIChvdXQsY0RCdXNEYWVtb25NdXRleCxzY29wZSk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19kYWVtb25faXNfc2Vzc2lvbl9idXNfYWRkcmVzc19wdWJsaXNoZWQgKGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgREJ1c1N0cmluZyBtdXRleF9uYW1lOworCisgIGlmICghX2RidXNfZ2V0X211dGV4X25hbWUoJm11dGV4X25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoaERCdXNEYWVtb25NdXRleCkKKyAgICAgIHJldHVybiBUUlVFOworCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICAvLyB3ZSB1c2UgQ3JlYXRlTXV0ZXggaW5zdGVhZCBvZiBPcGVuTXV0ZXggYmVjYXVzZSBvZiBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMsCisgIC8vIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM2ODQzMTUlMjhWUy44NSUyOS5hc3B4CisgIGhEQnVzRGFlbW9uTXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJm11dGV4X25hbWUpICk7CisKKyAgLyogVGhlIGNsaWVudCB1c2VzIG11dGV4IG93bmVyc2hpcCB0byBkZXRlY3QgYSBydW5uaW5nIHNlcnZlciwgc28gdGhlIHNlcnZlciBzaG91bGQgZG8gc28gdG9vLgorICAgICBGb3J0dW5hbGx5IHRoZSBjbGllbnQgZGVsZXRlcyB0aGUgbXV0ZXggaW4gdGhlIGxvY2sgcHJvdGVjdGVkIGFyZWEsIHNvIGNoZWNraW5nIHByZXNlbmNlIAorICAgICB3aWxsIHdvcmsgdG9vLiAgKi8KKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisKKyAgaWYgKGhEQnVzRGFlbW9uTXV0ZXggID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZShoREJ1c0RhZW1vbk11dGV4KTsKKyAgICAgIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAvLyBtdXRleCB3YXNuJ3QgY3JlYXRlZCBiZWZvcmUsIHNvIHJldHVybiBmYWxzZS4KKyAgLy8gV2UgbGVhdmUgdGhlIG11dGV4IG5hbWUgYWxsb2NhdGVkIGZvciBsYXRlciByZXVzYWdlCisgIC8vIGluIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MuCisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHJlc3MsIGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgY2hhciAqc2hhcmVkX2FkZHIgPSBOVUxMOworICBEQnVzU3RyaW5nIHNobV9uYW1lOworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisgIGRidXNfdWludDY0X3QgbGVuOworCisgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyk7CisKKyAgaWYgKCFfZGJ1c19nZXRfbXV0ZXhfbmFtZSgmbXV0ZXhfbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICBpZiAoIWhEQnVzRGFlbW9uTXV0ZXgpCisgICAgeworICAgICAgaERCdXNEYWVtb25NdXRleCA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworCisgIC8vIGFjcXVpcmUgdGhlIG11dGV4CisgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KCBoREJ1c0RhZW1vbk11dGV4LCAxMCApICE9IFdBSVRfT0JKRUNUXzApCisgICAgeworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgQ2xvc2VIYW5kbGUoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfc2htX25hbWUoJnNobV9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSggJnNobV9uYW1lICk7CisgICAgICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIGNyZWF0ZSBzaG0KKyAgbGVuID0gc3RybGVuIChhZGRyZXNzKSArIDE7CisKKyAgaERCdXNTaGFyZWRNZW0gPSBDcmVhdGVGaWxlTWFwcGluZ0EoIElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCBQQUdFX1JFQURXUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA+PiAzMiwgbGVuICYgMHhmZmZmZmZmZnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnNobV9uYW1lKSApOworICBfZGJ1c19hc3NlcnQoIGhEQnVzU2hhcmVkTWVtICk7CisKKyAgc2hhcmVkX2FkZHIgPSBNYXBWaWV3T2ZGaWxlKCBoREJ1c1NoYXJlZE1lbSwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDAgKTsKKworICBfZGJ1c19hc3NlcnQgKHNoYXJlZF9hZGRyKTsKKworICBzdHJjcHkoIHNoYXJlZF9hZGRyLCBhZGRyZXNzKTsKKworICAvLyBjbGVhbnVwCisgIFVubWFwVmlld09mRmlsZSggc2hhcmVkX2FkZHIgKTsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgIF9kYnVzX3ZlcmJvc2UoICJwdWJsaXNoZWQgc2Vzc2lvbiBidXMgYWRkcmVzcyBhdCAlc1xuIixfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzaG1fbmFtZSkgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSggJnNobV9uYW1lICk7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpCit7CisgIEhBTkRMRSBsb2NrOworCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICBDbG9zZUhhbmRsZSggaERCdXNTaGFyZWRNZW0gKTsKKworICBoREJ1c1NoYXJlZE1lbSA9IE5VTEw7CisKKyAgUmVsZWFzZU11dGV4KCBoREJ1c0RhZW1vbk11dGV4ICk7CisKKyAgQ2xvc2VIYW5kbGUoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKworICBoREJ1c0RhZW1vbk11dGV4ID0gTlVMTDsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htIChEQnVzU3RyaW5nICphZGRyZXNzLCBEQnVzU3RyaW5nICpzaG1fbmFtZSkKK3sKKyAgSEFORExFIHNoYXJlZE1lbTsKKyAgY2hhciAqc2hhcmVkX2FkZHI7CisgIGludCBpOworCisgIC8vIHJlYWQgc2htCisgIGZvcihpPTA7aTwyMDsrK2kpIHsKKyAgICAgIC8vIHdlIGtub3cgdGhhdCBkYnVzLWRhZW1vbiBpcyBhdmFpbGFibGUsIHNvIHdlIHdhaXQgdW50aWwgc2htIGlzIGF2YWlsYWJsZQorICAgICAgc2hhcmVkTWVtID0gT3BlbkZpbGVNYXBwaW5nQSggRklMRV9NQVBfUkVBRCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShzaG1fbmFtZSkpOworICAgICAgaWYoIHNoYXJlZE1lbSA9PSAwICkKKyAgICAgICAgICBTbGVlcCggMTAwICk7CisgICAgICBpZiAoIHNoYXJlZE1lbSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICB9CisKKyAgaWYoIHNoYXJlZE1lbSA9PSAwICkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBzaGFyZWRfYWRkciA9IE1hcFZpZXdPZkZpbGUoIHNoYXJlZE1lbSwgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCApOworCisgIGlmKCAhc2hhcmVkX2FkZHIgKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0KCBhZGRyZXNzICk7CisKKyAgX2RidXNfc3RyaW5nX2FwcGVuZCggYWRkcmVzcywgc2hhcmVkX2FkZHIgKTsKKworICAvLyBjbGVhbnVwCisgIFVubWFwVmlld09mRmlsZSggc2hhcmVkX2FkZHIgKTsKKworICBDbG9zZUhhbmRsZSggc2hhcmVkTWVtICk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucyAoREJ1c1N0cmluZyAqYWRkcmVzcywgREJ1c1N0cmluZyAqc2htX25hbWUsIGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgSEFORExFIGRhZW1vbjsKKyAgREJ1c1N0cmluZyBtdXRleF9uYW1lOworICBkYnVzX2Jvb2xfdCBiUmV0ID0gVFJVRTsKKworICBpZiAoIV9kYnVzX2dldF9tdXRleF9uYW1lKCZtdXRleF9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLy8gc3luYyBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzLCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgYW5kIF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMKKyAgbG9jayA9IF9kYnVzX2dsb2JhbF9sb2NrKCBjVW5pcXVlREJ1c0luaXRNdXRleCApOworCisgIC8vIGRvIGNoZWNrcworICBkYWVtb24gPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJm11dGV4X25hbWUpICk7CisgIGlmKFdhaXRGb3JTaW5nbGVPYmplY3QoIGRhZW1vbiwgMTAgKSAhPSBXQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgUmVsZWFzZU11dGV4IChkYWVtb24pOworICAgICAgQ2xvc2VIYW5kbGUgKGRhZW1vbik7CisKKyAgICAgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyByZWFkIHNobQorICBiUmV0ID0gX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htKCBhZGRyZXNzLCBzaG1fbmFtZSApOworCisgIC8vIGNsZWFudXAKKyAgQ2xvc2VIYW5kbGUgKCBkYWVtb24gKTsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworCisgIHJldHVybiBiUmV0OworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsIERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBIQU5ETEUgbXV0ZXg7CisgIFNUQVJUVVBJTkZPQSBzaTsKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIExQU1RSIGxwRmlsZTsKKyAgY2hhciBkYnVzX2V4ZV9wYXRoW01BWF9QQVRIXTsKKyAgY2hhciBkYnVzX2FyZ3NbTUFYX1BBVEggKiAyXTsKKyAgY29uc3QgY2hhciAqIGRhZW1vbl9uYW1lID0gREJVU19EQUVNT05fTkFNRSAiLmV4ZSI7CisgIERCdXNTdHJpbmcgc2htX25hbWU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19nZXRfc2htX25hbWUoJnNobV9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgZGV0ZXJtaW5lIHNobSBuYW1lIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbXV0ZXggPSBfZGJ1c19nbG9iYWxfbG9jayAoIGNEQnVzQXV0b2xhdW5jaE11dGV4ICk7CisKKyAgaWYgKF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMoYWRkcmVzcywmc2htX25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSggImZvdW5kIHJ1bm5pbmcgZGJ1cyBkYWVtb24gZm9yIHNjb3BlICclcycgYXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlID8gc2NvcGUgOiAiIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2htX25hbWUpICk7CisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIVNlYXJjaFBhdGhBKE5VTEwsIGRhZW1vbl9uYW1lLCBOVUxMLCBzaXplb2YoZGJ1c19leGVfcGF0aCksIGRidXNfZXhlX3BhdGgsICZscEZpbGUpKQorICAgIHsKKyAgICAgIC8vIExvb2sgaW4gZGlyZWN0b3J5IGNvbnRhaW5pbmcgZGJ1cyBzaGFyZWQgbGlicmFyeQorICAgICAgSE1PRFVMRSBobW9kOworICAgICAgY2hhciBkYnVzX21vZHVsZV9wYXRoW01BWF9QQVRIXTsKKyAgICAgIERXT1JEIHJjOworCisgICAgICBfZGJ1c192ZXJib3NlKCAiZGlkIG5vdCBmb3VuZCBkYnVzIGRhZW1vbiBleGVjdXRhYmxlIG9uIGRlZmF1bHQgc2VhcmNoIHBhdGgsICIKKyAgICAgICAgICAgICJ0cnlpbmcgcGF0aCB3aGVyZSBkYnVzIHNoYXJlZCBsaWJyYXJ5IGlzIGxvY2F0ZWQiKTsKKworICAgICAgaG1vZCA9IF9kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUoKTsKKyAgICAgIHJjID0gR2V0TW9kdWxlRmlsZU5hbWVBKGhtb2QsIGRidXNfbW9kdWxlX3BhdGgsIHNpemVvZihkYnVzX21vZHVsZV9wYXRoKSk7CisgICAgICBpZiAocmMgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgcmV0cmlldmUgZGJ1cyBzaGFyZWQgbGlicmFyeSBmaWxlIG5hbWUiKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZXh0X2lkeCA9IHN0cnJjaHIoZGJ1c19tb2R1bGVfcGF0aCwgJ1xcJyk7CisgICAgICAgICAgaWYgKGV4dF9pZHgpCisgICAgICAgICAgKmV4dF9pZHggPSAnXDAnOworICAgICAgICAgIGlmICghU2VhcmNoUGF0aEEoZGJ1c19tb2R1bGVfcGF0aCwgZGFlbW9uX25hbWUsIE5VTEwsIHNpemVvZihkYnVzX2V4ZV9wYXRoKSwgZGJ1c19leGVfcGF0aCwgJmxwRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgZmluZCBkYnVzLWRhZW1vbiBleGVjdXRhYmxlIik7CisgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICBwcmludGYgKCJwbGVhc2UgYWRkIHRoZSBwYXRoIHRvICVzIHRvIHlvdXIgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuIiwgZGFlbW9uX25hbWUpOworICAgICAgICAgICAgICBwcmludGYgKCJvciBzdGFydCB0aGUgZGFlbW9uIG1hbnVhbGx5XG5cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCAiZm91bmQgZGJ1cyBkYWVtb24gZXhlY3V0YWJsZSBhdCAlcyIsZGJ1c19tb2R1bGVfcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAvLyBDcmVhdGUgcHJvY2VzcworICBaZXJvTWVtb3J5KCAmc2ksIHNpemVvZihzaSkgKTsKKyAgc2kuY2IgPSBzaXplb2Yoc2kpOworICBaZXJvTWVtb3J5KCAmcGksIHNpemVvZihwaSkgKTsKKworICBfc25wcmludGYoZGJ1c19hcmdzLCBzaXplb2YoZGJ1c19hcmdzKSAtIDEsICJcIiVzXCIgJXMiLCBkYnVzX2V4ZV9wYXRoLCAgIiAtLXNlc3Npb24iKTsKKworLy8gIGFyZ3ZbaV0gPSAiLS1jb25maWctZmlsZT1idXNcXHNlc3Npb24uY29uZiI7CisvLyAgcHJpbnRmKCJjcmVhdGUgcHJvY2VzcyBcIiVzXCIgJXNcbiIsIGRidXNfZXhlX3BhdGgsIGRidXNfYXJncyk7CisgIGlmKENyZWF0ZVByb2Nlc3NBKGRidXNfZXhlX3BhdGgsIGRidXNfYXJncywgTlVMTCwgTlVMTCwgRkFMU0UsIENSRUFURV9OT19XSU5ET1csIE5VTEwsIE5VTEwsICZzaSwgJnBpKSkKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFRocmVhZCk7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFByb2Nlc3MpOworICAgICAgcmV0dmFsID0gX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htKCBhZGRyZXNzLCAmc2htX25hbWUgKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gRkFMU0UpCisgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJGYWlsZWQgdG8gZ2V0IGF1dG9sYXVuY2ggYWRkcmVzcyBmcm9tIGxhdW5jaGVkIGRidXMtZGFlbW9uIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkZhaWxlZCB0byBsYXVuY2ggZGJ1cy1kYWVtb24iKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKworb3V0OgorICBpZiAocmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBlbHNlCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgX2RidXNfZ2xvYmFsX3VubG9jayAobXV0ZXgpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNobV9uYW1lKTsKKworICByZXR1cm4gcmV0dmFsOworIH0KKworCisvKiogTWFrZXMgdGhlIGZpbGUgcmVhZGFibGUgYnkgZXZlcnkgdXNlciBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZpbGUncyBwZXJtaXNzaW9ucyBjb3VsZCBiZSBjaGFuZ2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIC8vIFRPRE8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIGFuIGludGVnZXIKKyAqCisgKiBAcGFyYW0gYXRvbWljIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gaW5jcmVtZW50CisgKiBAcmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIGluY3JlbWVudGluZworICoKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfaW5jIChEQnVzQXRvbWljICphdG9taWMpCit7CisgIC8vICsvLSAxIGlzIG5lZWRlZCBoZXJlIQorICAvLyBubyB2b2xhdGlsZSBhcmd1bWVudCB3aXRoIG1pbmd3CisgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCAoJmF0b21pYy0+dmFsdWUpIC0gMTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudCBhbiBpbnRlZ2VyCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGRlY3JlbWVudAorICogQHJldHVybnMgdGhlIHZhbHVlIGJlZm9yZSBkZWNyZW1lbnRpbmcKKyAqCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworICAvLyArLy0gMSBpcyBuZWVkZWQgaGVyZSEKKyAgLy8gbm8gdm9sYXRpbGUgYXJndW1lbnQgd2l0aCBtaW5ndworICByZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQgKCZhdG9taWMtPnZhbHVlKSArIDE7Cit9CisKKy8qKgorICogQXRvbWljYWxseSBnZXQgdGhlIHZhbHVlIG9mIGFuIGludGVnZXIuIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUKKyAqIHRoZXJlYWZ0ZXIsIHNvIHRoaXMgaXMgbW9zdGx5IG9ubHkgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBnZXQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGlzIG1vbWVudAorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyAgLyogSW4gdGhpcyBzaXR1YXRpb24sIEdMaWIgaXNzdWVzIGEgTWVtb3J5QmFycmllcigpIGFuZCB0aGVuIHJldHVybnMKKyAgICogYXRvbWljLT52YWx1ZS4gSG93ZXZlciwgbWluZ3cgZnJvbSBtaW5ndy5vcmcgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoCisgICAqIG1pbmd3LXc2NCBmcm9tIG1pbmd3LXc2NC5zZi5uZXQpIGRvZXMgbm90IGhhdmUgTWVtb3J5QmFycmllciBpbiBpdHMKKyAgICogaGVhZGVycywgc28gd2UgaGF2ZSB0byBnZXQgYSBtZW1vcnkgYmFycmllciBzb21lIG90aGVyIHdheS4KKyAgICoKKyAgICogSW50ZXJsb2NrZWRJbmNyZW1lbnQgaXMgb2xkZXIsIGFuZCBpcyBkb2N1bWVudGVkIG9uIE1TRE4gdG8gYmUgYSBmdWxsCisgICAqIG1lbW9yeSBiYXJyaWVyLCBzbyBsZXQncyB1c2UgdGhhdC4KKyAgICovCisgIGxvbmcgZHVtbXkgPSAwOworCisgIEludGVybG9ja2VkRXhjaGFuZ2UgKCZkdW1teSwgMSk7CisKKyAgcmV0dXJuIGF0b21pYy0+dmFsdWU7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIGJ1cyBkYWVtb24gaXMgc2lnbmFsZWQgdG8gcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uOyBhbnkKKyAqIGNhY2hlcyBzaG91bGQgYmUgbnVrZWQuIE9mIGNvdXJzZSBhbnkgY2FjaGVzIHRoYXQgbmVlZCBleHBsaWNpdCByZWxvYWQKKyAqIGFyZSBwcm9iYWJseSBicm9rZW4sIGJ1dCBjJ2VzdCBsYSB2aWUuCisgKgorICogCisgKi8KK3ZvaWQKK19kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCkKK3sKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUFHQUlOIG9yIEVXT1VMREJMT0NLICh0aGlzIGhhcyB0byBiZSBkb25lIGRpZmZlcmVudGx5CisgKiBmb3IgV2luc29jayBzbyBpcyBhYnN0cmFjdGVkKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIGUgPT0gRUFHQUlOIG9yIGUgPT0gRVdPVUxEQkxPQ0sKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKGludCBlKQoreworICByZXR1cm4gZSA9PSBXU0FFV09VTERCTE9DSzsKK30KKworLyoqCisgKiByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRidXMgaW5zdGFsbGF0aW9uIAorICoKKyAqIEBwYXJhbSBwcmVmaXggYnVmZmVyIGZvciBpbnN0YWxsYXRpb24gcGF0aAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2luc3RhbGxfcm9vdChjaGFyICpwcmVmaXgsIGludCBsZW4pCit7CisgICAgLy9UbyBmaW5kIHRoZSBwcmVmaXgsIHdlIGN1dCB0aGUgZmlsZW5hbWUgYW5kIGFsc28gXGJpblwgaWYgcHJlc2VudAorICAgIERXT1JEIHBhdGhMZW5ndGg7CisgICAgY2hhciAqbGFzdFNsYXNoOworICAgIFNldExhc3RFcnJvciggMCApOworICAgIHBhdGhMZW5ndGggPSBHZXRNb2R1bGVGaWxlTmFtZUEoX2RidXNfd2luX2dldF9kbGxfaG1vZHVsZSgpLCBwcmVmaXgsIGxlbik7CisgICAgaWYgKCBwYXRoTGVuZ3RoID09IDAgfHwgR2V0TGFzdEVycm9yKCkgIT0gMCApIHsKKyAgICAgICAgKnByZWZpeCA9ICdcMCc7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbGFzdFNsYXNoID0gX21ic3JjaHIocHJlZml4LCAnXFwnKTsKKyAgICBpZiAobGFzdFNsYXNoID09IE5VTEwpIHsKKyAgICAgICAgKnByZWZpeCA9ICdcMCc7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy9jdXQgb2ZmIGJpbmFyeSBuYW1lCisgICAgbGFzdFNsYXNoWzFdID0gMDsKKworICAgIC8vY3V0IHBvc3NpYmxlICJcXGJpbiIKKworICAgIC8vdGhpcyBmYWlscyBpZiB3ZSBhcmUgaW4gYSBkb3VibGUtYnl0ZSBzeXN0ZW0gY29kZXBhZ2UgYW5kIHRoZQorICAgIC8vZm9sZGVyJ3MgbmFtZSBoYXBwZW5zIHRvIGVuZCB3aXRoIHRoZSAqYnl0ZXMqCisgICAgLy8iXFxiaW4iLi4uIChJLmUuIHRoZSBzZWNvbmQgYnl0ZSBvZiBzb21lIEhhbiBjaGFyYWN0ZXIgYW5kIHRoZW4KKyAgICAvL3RoZSBMYXRpbiAiYmluIiwgYnV0IHRoYXQgaXMgbm90IGxpa2VseSBJIHRoaW5rLi4uCisgICAgaWYgKGxhc3RTbGFzaCAtIHByZWZpeCA+PSA0ICYmIHN0cm5pY21wKGxhc3RTbGFzaCAtIDQsICJcXGJpbiIsIDQpID09IDApCisgICAgICAgIGxhc3RTbGFzaFstM10gPSAwOworICAgIGVsc2UgaWYgKGxhc3RTbGFzaCAtIHByZWZpeCA+PSAxMCAmJiBzdHJuaWNtcChsYXN0U2xhc2ggLSAxMCwgIlxcYmluXFxkZWJ1ZyIsIDEwKSA9PSAwKQorICAgICAgICBsYXN0U2xhc2hbLTldID0gMDsKKyAgICBlbHNlIGlmIChsYXN0U2xhc2ggLSBwcmVmaXggPj0gMTIgJiYgc3RybmljbXAobGFzdFNsYXNoIC0gMTIsICJcXGJpblxccmVsZWFzZSIsIDEyKSA9PSAwKQorICAgICAgICBsYXN0U2xhc2hbLTExXSA9IDA7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogU2VlIGNvbW1lbnQgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgLyogUHJvYmFibHkgZmlsbCB0aGlzIGluIHdpdGggc29tZXRoaW5nIGJhc2VkIG9uIENPTT8gKi8KKyAgKnN1cHBvcnRlZCA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBrZXlyaW5nIGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMKKyAqIHNob3VsZCBiZSBzdG9yZWQuICBUaGUgY3JlZGVudGlhbHMgc2hvdWxkIGhhdmUgZWl0aGVyIGEgV2luZG93cyBvcgorICogVU5JWCB1c2VyIGluIHRoZW0uICBUaGUgZGlyZWN0b3J5IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBwYXRoLgorICoKKyAqIE9uIFVOSVggdGhlIGRpcmVjdG9yeSBpcyB+Ly5kYnVzLWtleXJpbmdzIHdoaWxlIG9uIFdpbmRvd3MgaXQgc2hvdWxkIHByb2JhYmx5CisgKiBiZSBzb21ldGhpbmcgZWxzZSwgc2luY2UgdGhlIGRvdGZpbGUgY29udmVudGlvbiBpcyBub3Qgbm9ybWFsIG9uIFdpbmRvd3MuCisgKiAKKyAqIEBwYXJhbSBkaXJlY3Rvcnkgc3RyaW5nIHRvIGFwcGVuZCBkaXJlY3RvcnkgdG8KKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBmb3IKKyAqICAKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9rZXlyaW5nX2RpcmVjdG9yeV9mb3JfY3JlZGVudGlhbHMgKERCdXNTdHJpbmcgICAgICAqZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscykKK3sKKyAgREJ1c1N0cmluZyBob21lZGlyOworICBEQnVzU3RyaW5nIGRvdGRpcjsKKyAgY29uc3QgY2hhciAqaG9tZXBhdGg7CisgIGNvbnN0IGNoYXIgKmhvbWVkcml2ZTsKKworICBfZGJ1c19hc3NlcnQgKGNyZWRlbnRpYWxzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChjcmVkZW50aWFscykpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmhvbWVkaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBob21lZHJpdmUgPSBfZGJ1c19nZXRlbnYoIkhPTUVEUklWRSIpOworICBpZiAoaG9tZWRyaXZlICE9IE5VTEwgJiYgKmhvbWVkcml2ZSAhPSAnXDAnKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQoJmhvbWVkaXIsaG9tZWRyaXZlKTsKKyAgICB9CisKKyAgaG9tZXBhdGggPSBfZGJ1c19nZXRlbnYoIkhPTUVQQVRIIik7CisgIGlmIChob21lcGF0aCAhPSBOVUxMICYmICpob21lcGF0aCAhPSAnXDAnKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQoJmhvbWVkaXIsaG9tZXBhdGgpOworICAgIH0KKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgeworICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRlOworICAgIAorICAgIG92ZXJyaWRlID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0hPTUVESVIiKTsKKyAgICBpZiAob3ZlcnJpZGUgIT0gTlVMTCAmJiAqb3ZlcnJpZGUgIT0gJ1wwJykKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZob21lZGlyLCAwKTsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmaG9tZWRpciwgb3ZlcnJpZGUpKQorICAgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBmYWtlIGhvbWVkaXIgZm9yIHRlc3Rpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZob21lZGlyKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3Qgc3RyaWN0bHkgdGhyZWFkLXNhZmUsIGJ1dCBpZiB3ZSBmYWlsIGF0IHRocmVhZC1zYWZldHkgaGVyZSwKKyAgICAgICAgICogdGhlIHdvcnN0IHRoYXQgd2lsbCBoYXBwZW4gaXMgc29tZSBleHRyYSB3YXJuaW5ncy4gKi8KKyAgICAgICAgc3RhdGljIGRidXNfYm9vbF90IGFscmVhZHlfd2FybmVkID0gRkFMU0U7CisgICAgICAgIGlmICghYWxyZWFkeV93YXJuZWQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVzaW5nIHlvdXIgcmVhbCBob21lIGRpcmVjdG9yeSBmb3IgdGVzdGluZywgc2V0IERCVVNfVEVTVF9IT01FRElSIHRvIGF2b2lkXG4iKTsKKyAgICAgICAgICAgIGFscmVhZHlfd2FybmVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorICAvKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSAuc29tZXRoaW5nIGRpcmVjdG9yeSBpbiBXaW5kb3dzIENFCisgICAgIHVzaW5nIHRoZSBmaWxlIGV4cGxvcmVyLiAgKi8KKyNkZWZpbmUgS0VZUklOR19ESVIgImRidXMta2V5cmluZ3MiCisjZWxzZQorI2RlZmluZSBLRVlSSU5HX0RJUiAiLmRidXMta2V5cmluZ3MiCisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgS0VZUklOR19ESVIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKyAgCisgZmFpbGVkOiAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQSAoZmlsZSk7CisKKyAgaWYgKGF0dHJpYnV0ZXMgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUEFUSF9OT1RfRk9VTkQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBBIHdyYXBwZXIgYXJvdW5kIHN0cmVycm9yKCkgYmVjYXVzZSBzb21lIHBsYXRmb3JtcworICogbWF5IGJlIGxhbWUgYW5kIG5vdCBoYXZlIHN0cmVycm9yKCkuCisgKgorICogQHBhcmFtIGVycm9yX251bWJlciBlcnJuby4KKyAqIEByZXR1cm5zIGVycm9yIGRlc2NyaXB0aW9uLgorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3IgKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgV1NBRUlOVFI6CisgICAgICByZXR1cm4gIkludGVycnVwdGVkIGZ1bmN0aW9uIGNhbGwiOworICAgIGNhc2UgV1NBRUFDQ0VTOgorICAgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgICAgY2FzZSBXU0FFRkFVTFQ6CisgICAgICByZXR1cm4gIkJhZCBhZGRyZXNzIjsKKyAgICBjYXNlIFdTQUVJTlZBTDoKKyAgICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudCI7CisgICAgY2FzZSBXU0FFTUZJTEU6CisgICAgICByZXR1cm4gIlRvbyBtYW55IG9wZW4gZmlsZXMiOworICAgIGNhc2UgV1NBRVdPVUxEQkxPQ0s6CisgICAgICByZXR1cm4gIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIjsKKyAgICBjYXNlIFdTQUVJTlBST0dSRVNTOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQUVBTFJFQURZOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyI7CisgICAgY2FzZSBXU0FFTk9UU09DSzoKKyAgICAgIHJldHVybiAiU29ja2V0IG9wZXJhdGlvbiBvbiBub25zb2NrZXQiOworICAgIGNhc2UgV1NBRURFU1RBRERSUkVROgorICAgICAgcmV0dXJuICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIjsKKyAgICBjYXNlIFdTQUVNU0dTSVpFOgorICAgICAgcmV0dXJuICJNZXNzYWdlIHRvbyBsb25nIjsKKyAgICBjYXNlIFdTQUVQUk9UT1RZUEU6CisgICAgICByZXR1cm4gIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCI7CisgICAgY2FzZSBXU0FFTk9QUk9UT09QVDoKKyAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIG9wdGlvbiI7CisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRVNPQ0tUTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVPUE5PVFNVUFA6CisgICAgICByZXR1cm4gIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVQRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseSI7CisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgICBjYXNlIFdTQUVBRERSTk9UQVZBSUw6CisgICAgICByZXR1cm4gIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiOworICAgIGNhc2UgV1NBRU5FVERPV046CisgICAgICByZXR1cm4gIk5ldHdvcmsgaXMgZG93biI7CisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSI7CisgICAgY2FzZSBXU0FFTkVUUkVTRVQ6CisgICAgICByZXR1cm4gIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0IjsKKyAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDoKKyAgICAgIHJldHVybiAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiOworICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIjsKKyAgICBjYXNlIFdTQUVOT0JVRlM6CisgICAgICByZXR1cm4gIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiOworICAgIGNhc2UgV1NBRUlTQ09OTjoKKyAgICAgIHJldHVybiAiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIjsKKyAgICBjYXNlIFdTQUVOT1RDT05OOgorICAgICAgcmV0dXJuICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCI7CisgICAgY2FzZSBXU0FFU0hVVERPV046CisgICAgICByZXR1cm4gIkNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biI7CisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IjsKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZWZ1c2VkIjsKKyAgICBjYXNlIFdTQUVIT1NURE9XTjoKKyAgICAgIHJldHVybiAiSG9zdCBpcyBkb3duIjsKKyAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTm8gcm91dGUgdG8gaG9zdCI7CisgICAgY2FzZSBXU0FFUFJPQ0xJTToKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgcHJvY2Vzc2VzIjsKKyAgICBjYXNlIFdTQUVESVNDT046CisgICAgICByZXR1cm4gIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQVRZUEVfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJDbGFzcyB0eXBlIG5vdCBmb3VuZCI7CisgICAgY2FzZSBXU0FIT1NUX05PVF9GT1VORDoKKyAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQiOworICAgIGNhc2UgV1NBVFJZX0FHQUlOOgorICAgICAgcmV0dXJuICJOb25hdXRob3JpdGF0aXZlIGhvc3Qgbm90IGZvdW5kIjsKKyAgICBjYXNlIFdTQU5PX1JFQ09WRVJZOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGEgbm9ucmVjb3ZlcmFibGUgZXJyb3IiOworICAgIGNhc2UgV1NBTk9fREFUQToKKyAgICAgIHJldHVybiAiVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkIHR5cGUiOworICAgIGNhc2UgV1NBX0lOVkFMSURfSEFORExFOgorICAgICAgcmV0dXJuICJTcGVjaWZpZWQgZXZlbnQgb2JqZWN0IGhhbmRsZSBpcyBpbnZhbGlkIjsKKyAgICBjYXNlIFdTQV9JTlZBTElEX1BBUkFNRVRFUjoKKyAgICAgIHJldHVybiAiT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZCI7CisgICAgY2FzZSBXU0FfSU9fSU5DT01QTEVURToKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBJL08gZXZlbnQgb2JqZWN0IG5vdCBpbiBzaWduYWxlZCBzdGF0ZSI7CisgICAgY2FzZSBXU0FfSU9fUEVORElORzoKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBvcGVyYXRpb25zIHdpbGwgY29tcGxldGUgbGF0ZXIiOworICAgIGNhc2UgV1NBX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuICJJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSI7CisgICAgY2FzZSBXU0FfT1BFUkFUSU9OX0FCT1JURUQ6CisgICAgICByZXR1cm4gIk92ZXJsYXBwZWQgb3BlcmF0aW9uIGFib3J0ZWQiOworI2lmZGVmIFdTQUlOVkFMSURQUk9DVEFCTEUKKworICAgIGNhc2UgV1NBSU5WQUxJRFBST0NUQUJMRToKKyAgICAgIHJldHVybiAiSW52YWxpZCBwcm9jZWR1cmUgdGFibGUgZnJvbSBzZXJ2aWNlIHByb3ZpZGVyIjsKKyNlbmRpZgorI2lmZGVmIFdTQUlOVkFMSURQUk9WSURFUgorCisgICAgY2FzZSBXU0FJTlZBTElEUFJPVklERVI6CisgICAgICByZXR1cm4gIkludmFsaWQgc2VydmljZSBwcm92aWRlciB2ZXJzaW9uIG51bWJlciI7CisjZW5kaWYKKyNpZmRlZiBXU0FQUk9WSURFUkZBSUxFRElOSVQKKworICAgIGNhc2UgV1NBUFJPVklERVJGQUlMRURJTklUOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlcnZpY2UgcHJvdmlkZXIiOworI2VuZGlmCisKKyAgICBjYXNlIFdTQVNZU0NBTExGQUlMVVJFOgorICAgICAgcmV0dXJuICJTeXN0ZW0gY2FsbCBmYWlsdXJlIjsKKyAgICB9CisgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworICBpZiAobXNnID09IE5VTEwpCisgICAgbXNnID0gInVua25vd24iOworCisgIHJldHVybiBtc2c7CisjZW5kaWYgLy9EQlVTX1dJTkNFCit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gYSBXaW4zMiBlcnJvcgorICogY29kZSB0byBhIERCdXNFcnJvci4gRG9lcyBub3RoaW5nIGlmIGVycm9yIGlzICNOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IuCisgKiBAcGFyYW0gY29kZSB0aGUgV2luMzIgZXJyb3IgY29kZQorICovCit2b2lkCitfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBjb2RlKQoreworICBjaGFyICptc2c7CisKKyAgLyogQXMgd2Ugd2FudCB0aGUgRW5nbGlzaCBtZXNzYWdlLCB1c2UgdGhlIEEgQVBJICovCisgIEZvcm1hdE1lc3NhZ2VBIChGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgICBOVUxMLCBjb2RlLCBNQUtFTEFOR0lEIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksCisgICAgICAgICAgICAgICAgICAoTFBTVFIpICZtc2csIDAsIE5VTEwpOworICBpZiAobXNnKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgIndpbjMyLmVycm9yIiwgIiVzIiwgbXNnKTsKKyAgICAgIExvY2FsRnJlZSAobXNnKTsKKyAgICB9CisgIGVsc2UKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsICJ3aW4zMi5lcnJvciIsICJVbmtub3duIGVycm9yIGNvZGUgJWQgb3IgRm9ybWF0TWVzc2FnZSBmYWlsZWQiLCBjb2RlKTsKK30KKwordm9pZAorX2RidXNfd2luX3dhcm5fd2luX2Vycm9yIChjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvZGUpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IgKCZlcnJvciwgY29kZSk7CisgIF9kYnVzX3dhcm4gKCIlczogJXNcbiIsIG1lc3NhZ2UsIGVycm9yLm1lc3NhZ2UpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGRpcmVjdG9yeTsgRGlyZWN0b3J5IG11c3QgYmUgZW1wdHkKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWxldGVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoUmVtb3ZlRGlyZWN0b3J5QSAoZmlsZW5hbWVfYykgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlbW92ZSBkaXJlY3RvcnkgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWxlbmFtZSBpcyBhbiBhYnNvbHV0ZSBwYXRoCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgYW4gYWJzb2x1dGUgcGF0aAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGF0aF9pc19hYnNvbHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZmlsZW5hbWUpID4gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMSkgPT0gJzonCisgICAgICAgICAgIHx8IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApID09ICdcXCcKKyAgICAgICAgICAgfHwgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkgPT0gJy8nOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfY2hlY2tfc2V0dWlkICh2b2lkKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKHZvaWQpCit7CisgIHJldHVybiBlcnJubzsKK30KKwordm9pZAorX2RidXNfcmVzdG9yZV9zb2NrZXRfZXJybm8gKGludCBzYXZlZF9lcnJubykKK3sKKyAgX2RidXNfd2luX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworfQorCisvKiogQH0gZW5kIG9mIHN5c2RlcHMtd2luICovCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5oIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliMzBkNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmMgV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJVUyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NZU0RFUFNfV0lOX0gKKyNkZWZpbmUgREJVU19TWVNERVBTX1dJTl9ICisKK2V4dGVybiB2b2lkICpfZGJ1c193aW5fZ2V0X2RsbF9obW9kdWxlICh2b2lkKTsKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworI2RlZmluZSBEQlVTX0NPTlNPTEVfRElSICIvdmFyL3J1bi9jb25zb2xlLyIKKworCit2b2lkIF9kYnVzX3dpbl9zZXRfZXJybm8gKGludCBlcnIpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3dpbl9zdGFydHVwX3dpbnNvY2sgKHZvaWQpOwordm9pZCBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgIChjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NoYXIgKiBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChpbnQgZXJyb3JfbnVtYmVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChjaGFyICpzdHJpbmcpOworCitleHRlcm4gY29uc3QgY2hhciogX2RidXNfbG1fc3RyZXJyb3IgIChpbnQgZXJyb3JfbnVtYmVyKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c193aW5fYWNjb3VudF90b19zaWQgKGNvbnN0IHdjaGFyX3QgKndhY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKipwcHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luMzJfc2lkX3RvX25hbWVfYW5kX2RvbWFpbiAoZGJ1c191aWRfdCAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgICoqd25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICAgKip3ZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCisKKy8qIERvbid0IGRlZmluZSBEQlVTX0NPTlNPTEVfRElSIG9uIFdpbjMyICovCisKK3djaGFyX3QgICAgKl9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChjb25zdCBjaGFyICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcik7CitjaGFyICAgICAgICpfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoY29uc3Qgd2NoYXJfdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChEQnVzRXJyb3IgKmVycm9yLCBpbnQgY29kZSk7CisKK2RidXNfYm9vbF90CitfZGJ1c193aW5fc2lkX3RvX25hbWVfYW5kX2RvbWFpbiAoZGJ1c191aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgKip3bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICAqKndkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2ZpbGVfZXhpc3RzIChjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pbnN0YWxsX3Jvb3QoY2hhciAqcHJlZml4LCBpbnQgbGVuKTsKKwordm9pZCAgICAgICAgX2RidXNfdGhyZWFkc193aW5kb3dzX2luaXRfZ2xvYmFsICh2b2lkKTsKK3ZvaWQgICAgICAgIF9kYnVzX3RocmVhZHNfd2luZG93c19lbnN1cmVfY3Rvcl9saW5rZWQgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRzaWQoY2hhciAqKnNpZCwgZGJ1c19waWRfdCBwcm9jZXNzX2lkKTsKKyNlbmRpZgorCisvKiogQH0gZW5kIG9mIHN5c2RlcHMtd2luLmggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCkBAIC0wLDAgKzEsMTE2NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jIFdyYXBwZXJzIGZvciBXaW5kb3dzIENFIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFBldGVyIEvDvG1tZWwgIDxzeW50aGV0aWNwcEBnbXgubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdGlhbiBFaHJsaWNoZXIgPGNoLmVocmxpY2hlckBnbXguZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKy8qIEluY2x1ZGluZyBzaGxvYmouaCBjcmVhdGVzIHRyb3VibGUgb24gc29tZSBjb21waWxlcnMuICBKdXN0IGNoaWNrZW4KKyAgIG91dCBoZXJlIGJ5IGRlZmluaW5nIGp1c3Qgd2hhdCB3ZSBuZWVkLiAgKi8KKyNpZm5kZWYgQ1NJRExfUEVSU09OQUwKKyNkZWZpbmUgQ1NJRExfUEVSU09OQUwgNQorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluIERFU1QuICAqLworc3RhdGljIGNoYXIgKgorc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgIGNoYXIgKmQgPSBkZXN0OworICBjb25zdCBjaGFyICpzID0gc3JjOworCisgIGRvCisgICAgKmQrKyA9ICpzOworICB3aGlsZSAoKnMrKyAhPSAnXDAnKTsKKworICByZXR1cm4gZCAtIDE7Cit9CisKKworLyogVGhpcyBpcyBzcGVjaWFsIGNhc2VkLCBiZWNhdXNlIHdlIG11c3QgYXZvaWQgdXNpbmcgbWFueSBkYnVzCisgICBmdW5jdGlvbnMgKHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb25zKTogVGhvc2UgZnVuY3Rpb25zIG1heSBpbiB0dXJuCisgICBjYXVzZSB2ZXJib3NlIG91dHB1dCBhbmQgY2hlY2sgdGhlIGZsYWchICAqLworc3RhdGljIGNoYXIgKgorZ2V0X3ZlcmJvc2Vfc2V0dGluZygpCit7CisgIGNvbnN0IHdjaGFyX3QgZGlyW10gPSBMIlNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1cyI7CisgIGNvbnN0IHdjaGFyX3QgbmFtZVtdID0gTCJWZXJib3NlIjsKKyAgSEtFWSByb290X2tleTsKKyAgSEtFWSBrZXlfaGFuZGxlOworICBEV09SRCBuYnl0ZXM7CisgIERXT1JEIG4xOworICBEV09SRCB0eXBlOworICB3Y2hhcl90ICpyZXN1bHRfdyA9IE5VTEw7CisgIGNoYXIgKnJlc3VsdDsKKyAgaW50IGxlbjsKKworICByb290X2tleSA9IEhLRVlfTE9DQUxfTUFDSElORTsKKyAgaWYgKFJlZ09wZW5LZXlFeFcgKHJvb3Rfa2V5LCBkaXIsIDAsIEtFWV9SRUFELCAma2V5X2hhbmRsZSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbmJ5dGVzID0gMTsKKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeFcgKGtleV9oYW5kbGUsIG5hbWUsIDAsIE5VTEwsIE5VTEwsICZuYnl0ZXMpKQorICAgIHsKKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgLyogUm91bmQgdXAgdG8gbXVsdGlwbGUgb2Ygd2NoYXJfdCwgY29udmVydCB0byBudW1iZXIgb2Ygd2NoYXJfdCdzLCBhbmQgYWRkIDEuICAqLworICBuMSA9ICgobmJ5dGVzICsgc2l6ZW9mKHdjaGFyX3QpIC0gMSkgLyBzaXplb2YgKHdjaGFyX3QpKSArIDE7CisgIHJlc3VsdF93ID0gbWFsbG9jIChuMSAqIHNpemVvZiAod2NoYXJfdCkpOworICBpZiAoIXJlc3VsdF93KQorICAgIHsKKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeFcgKGtleV9oYW5kbGUsIG5hbWUsIDAsICZ0eXBlLCAoTFBCWVRFKSByZXN1bHRfdywgJm5ieXRlcykpCisgICAgeworICAgICAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgIHJlc3VsdF93W24xIC0gMV0gPSAwOyAvKiBNYWtlIHN1cmUgaXQgaXMgcmVhbGx5IGEgc3RyaW5nLiAgKi8KKworICAvKiBOT1RFOiBSRUdfTVVMVElfU1ogYW5kIFJFR19FWFBBTkRfU1ogbm90IHN1cHBvcnRlZCwgYmVjYXVzZSB0aGV5CisgICAgIGFyZSBub3QgbmVlZGVkIGluIHRoaXMgbW9kdWxlLiAgKi8KKyAgaWYgKHR5cGUgIT0gUkVHX1NaKQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdF93KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9VVEY4LCAwLCByZXN1bHRfdywgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHRfdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmVzdWx0ID0gbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgeworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX1VURjgsIDAsIHJlc3VsdF93LCAtMSwgcmVzdWx0LCBsZW4sIE5VTEwsIE5VTEwpOworICBmcmVlIChyZXN1bHRfdyk7CisgIGlmIChsZW4gPCAwKQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUmV0dXJuIGEgc3RyaW5nIGZyb20gdGhlIFczMiBSZWdpc3RyeSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgICBDYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZXR1cm4gdmFsdWUuICBBIE5VTEwgZm9yIHJvb3QgaXMgYW4gYWxpYXMKKyAgIGZvciBIS0VZX0NVUlJFTlRfVVNFUiwgSEtFWV9MT0NBTF9NQUNISU5FIGluIHR1cm4uICovCitzdGF0aWMgY2hhciAqCityZWFkX3czMl9yZWdpc3RyeV9zdHJpbmcgKGNvbnN0IGNoYXIgKnJvb3QsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgSEtFWSByb290X2tleSwga2V5X2hhbmRsZTsKKyAgRFdPUkQgbjEsIG5ieXRlcywgdHlwZTsKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKwkKKyAgaWYgKCAhcm9vdCApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0NMQVNTRVNfUk9PVCIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NMQVNTRVNfUk9PVDsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0NVUlJFTlRfVVNFUiIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX0xPQ0FMX01BQ0hJTkUiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOworICBlbHNlIGlmICggIXN0cmNtcCggcm9vdCwgIkhLRVlfVVNFUlMiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9VU0VSUzsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChSZWdPcGVuS2V5RXhBIChyb290X2tleSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICByZXR1cm4gTlVMTDsgLyogbm8gbmVlZCBmb3IgYSBSZWdDbG9zZSwgc28gcmV0dXJuIGRpcmVjdCAqLworICAgICAgLyogSXQgc2VlbXMgdG8gYmUgY29tbW9uIHByYWN0aXNlIHRvIGZhbGwgYmFjayB0byBIS0xNLiAqLworICAgICAgaWYgKFJlZ09wZW5LZXlFeEEgKEhLRVlfTE9DQUxfTUFDSElORSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogc3RpbGwgbm8gbmVlZCBmb3IgYSBSZWdDbG9zZSwgc28gcmV0dXJuIGRpcmVjdCAqLworICAgIH0KKworICBuYnl0ZXMgPSAxOworICBpZiAoUmVnUXVlcnlWYWx1ZUV4QSAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgTlVMTCwgTlVMTCwgJm5ieXRlcykpCisgICAgeworICAgICAgaWYgKHJvb3QpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgLyogVHJ5IHRvIGZhbGxiYWNrIHRvIEhLTE0gYWxzbyBmb3IgYSBtaXNzaW5nIHZhbHVlLiAgKi8KKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIGlmIChSZWdPcGVuS2V5RXhBIChIS0VZX0xPQ0FMX01BQ0hJTkUsIGRpciwgMCwgS0VZX1JFQUQsICZrZXlfaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE5vcGUuICAqLworICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEgKGtleV9oYW5kbGUsIG5hbWUsIDAsIE5VTEwsIE5VTEwsICZuYnl0ZXMpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIG4xID0gbmJ5dGVzICsgMTsKKyAgcmVzdWx0ID0gbWFsbG9jIChuMSk7CisgIGlmICghcmVzdWx0KQorICAgIGdvdG8gb3V0OworICBpZiAoUmVnUXVlcnlWYWx1ZUV4QSAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgJnR5cGUsIHJlc3VsdCwgJm4xKSkKKyAgICB7CisgICAgICBmcmVlKHJlc3VsdCk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorICByZXN1bHRbbmJ5dGVzXSA9IDA7IC8qIE1ha2Ugc3VyZSBpdCBpcyByZWFsbHkgYSBzdHJpbmcuICAqLworCisgb3V0OgorICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9pbnN0X2RpciAoKQoreworICByZXR1cm4gcmVhZF93MzJfcmVnaXN0cnlfc3RyaW5nICgiSEtFWV9MT0NBTF9NQUNISU5FIiwKKwkJCQkgICJTb2Z0d2FyZVxcZnJlZWRlc2t0b3BcXERCdXMiLAorCQkJCSAgIkluc3RhbGwgRGlyZWN0b3J5Iik7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9lbnZfaW5fcmVnaXN0cnkgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHJldHVybiByZWFkX3czMl9yZWdpc3RyeV9zdHJpbmcgKCJIS0VZX0xPQ0FMX01BQ0hJTkUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXGZyZWVkZXNrdG9wXFxEQnVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9wcm9ncmFtX2luX2luc3RfZGlyIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBjaGFyICp0bXA7CisKKyAgdG1wID0gZmluZF9pbnN0X2RpciAoKTsKKyAgaWYgKCF0bXApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gbWFsbG9jIChzdHJsZW4gKHRtcCkgKyA1ICsgc3RybGVuIChuYW1lKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBmcmVlICh0bXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKHJlc3VsdCwgdG1wKSwgIlxcYmluXFwiKSwgbmFtZSk7CisgIGZyZWUgKHRtcCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX2luc3Rfc3ViZGlyIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBjaGFyICp0bXA7CisKKyAgdG1wID0gZmluZF9pbnN0X2RpciAoKTsKKyAgaWYgKCF0bXApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gbWFsbG9jIChzdHJsZW4gKHRtcCkgKyAxICsgc3RybGVuIChuYW1lKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBmcmVlICh0bXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKHJlc3VsdCwgdG1wKSwgIlxcIiksIG5hbWUpOworICBmcmVlICh0bXApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9teV9kb2N1bWVudHNfZm9sZGVyICgpCit7CisgIC8qIE9uZSBmb3Igc2FmZXR5LCBqdXN0IGluIGNhc2UuICAqLworICBjaGFyIGRpcltNQVhfUEFUSCArIDFdOworICBjaGFyICpyZXN1bHQ7CisKKyAgZGlyWzBdID0gJ1wwJzsKKyAgLyogTWF5IHJldHVybiBmYWxzZSBldmVuIGlmIHN1Y2Nlc3NmdWwuICAqLworICBTSEdldFNwZWNpYWxGb2xkZXJQYXRoQSAoMCwgZGlyLCBDU0lETF9QRVJTT05BTCwgMCk7CisgIGlmIChkaXJbMF0gPT0gJ1wwJykKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQgPSBtYWxsb2MgKHN0cmxlbiAoZGlyKSArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgc3RyY3B5IChyZXN1bHQsIGRpcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2RlZmluZSBNQVhfRU5WIDMwCisKK2NoYXIgKmVudmlyb25bTUFYX0VOViArIDFdOworCitjaGFyICoKK2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNoYXIgKnBhc3RfcmVzdWx0OworICBjaGFyICoqZW52cDsKKyAgaW50IGlkeDsKKworICBpZiAocGFzdF9yZXN1bHQpCisgICAgeworICAgICAgZnJlZSAocGFzdF9yZXN1bHQpOworICAgICAgcGFzdF9yZXN1bHQgPSBOVUxMOworICAgIH0KKworICBpZiAoISBzdHJjbXAgKG5hbWUsICJEQlVTX1ZFUkJPU0UiKSkKKyAgICByZXR1cm4gcGFzdF9yZXN1bHQgPSBnZXRfdmVyYm9zZV9zZXR0aW5nICgpOworICBlbHNlIGlmICghIHN0cmNtcCAobmFtZSwgIkhPTUVQQVRIIikpCisgICAgcmV0dXJuIHBhc3RfcmVzdWx0ID0gZmluZF9teV9kb2N1bWVudHNfZm9sZGVyICgpOworICBlbHNlIGlmICghIHN0cmNtcCAobmFtZSwgIkRCVVNfREFUQURJUiIpKQorICAgIHJldHVybiBwYXN0X3Jlc3VsdCA9IGZpbmRfaW5zdF9zdWJkaXIgKCJzaGFyZSIpOworCisgIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwICE9IDA7IGVudnArKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICp2YXJwID0gbmFtZTsKKyAgICAgIGNoYXIgKmVwID0gKmVudnA7CisgICAgICBpbnQgc2FtZV9uYW1lID0gMDsKKworICAgICAgd2hpbGUgKCp2YXJwID09ICplcCAmJiAqdmFycCAhPSAnXDAnKQorCXsKKwkgICsrZXA7CisJICArK3ZhcnA7CisJfTsKKworICAgICAgaWYgKCp2YXJwID09ICdcMCcgJiYgKmVwID09ICc9JykKKwlyZXR1cm4gZXAgKyAxOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCitpbnQKK3B1dGVudiAoY2hhciAqc3RyKQoreworICBjaGFyICoqZW52cDsKKyAgaW50IGlkeDsKKyAgZm9yIChlbnZwID0gZW52aXJvbjsgKmVudnAgIT0gMDsgZW52cCsrKQorICAgIHsKKyAgICAgIGNoYXIgKnZhcnAgPSBzdHI7CisgICAgICBjaGFyICplcCA9ICplbnZwOworICAgICAgaW50IHNhbWVfbmFtZSA9IDA7CisKKyAgICAgIHdoaWxlICgqdmFycCA9PSAqZXAgJiYgKnZhcnAgIT0gJ1wwJykKKwl7CisJICBpZiAoKnZhcnAgPT0gJz0nKQorCSAgICBzYW1lX25hbWUgPSAxOworCSAgKytlcDsKKwkgICsrdmFycDsKKwl9OworCisgICAgICBpZiAoKnZhcnAgPT0gKmVwICYmICp2YXJwID09ICdcMCcpCisJcmV0dXJuIDA7CisgICAgICBpZiAoc2FtZV9uYW1lKQorCXsKKwkgICplbnZwID0gc3RyOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBpZHggPSBlbnZwIC0gZW52aXJvbjsKKyAgaWYgKGlkeCA+IE1BWF9FTlYpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoRU5PTUVNKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZW52aXJvbltpZHhdID0gc3RyOworICByZXR1cm4gMDsKK30KKworCitjbG9ja190CitjbG9jayAodm9pZCkKK3sKKyAgcmV0dXJuIEdldFRpY2tDb3VudCAoKTsKK30KKworCit2b2lkCithYm9ydCAodm9pZCkKK3sKKyAgLyogVGhpcyBpcyB3aGF0IHdpbmRvd3MgZG9lcy4gICovCisgIGV4aXQgKDMpOworfQorCisKK3ZvaWQKK0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCkKK3sKKyAgU1lTVEVNVElNRSBzdDsKKyAgR2V0U3lzdGVtVGltZSAoJnN0KTsKKyAgU3lzdGVtVGltZVRvRmlsZVRpbWUgKCZzdCwgZnRwKTsKK30KKworCit1bnNpZ25lZCBjaGFyKgorX21ic3JjaHIgKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHN0ciwgdW5zaWduZWQgaW50IGNoKQoreworICAvKiBGSVhNRS4gIFRoaXMgaXMgbm90IG11bHRpLWJ5dGUgc2FmZS4gICovCisgIHJldHVybiBzdHJyY2hyIChzdHIsIGNoKTsKK30KKworCitIQU5ETEUgT3BlbkZpbGVNYXBwaW5nQShEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisJCQlCT09MIGJJbmhlcml0SGFuZGxlLAorCQkJTFBDU1RSIGxwTmFtZSkKK3sKKyAgRFdPUkQgZmxQcm90ZWN0ID0gMDsKKyAgSEFORExFIGhNYXBwaW5nOworCisgIGlmIChkd0Rlc2lyZWRBY2Nlc3MgJiBGSUxFX01BUF9SRUFEKQorICAgIGZsUHJvdGVjdCB8PSBQQUdFX1JFQURPTkxZOworCisgIGlmIChkd0Rlc2lyZWRBY2Nlc3MgJiBGSUxFX01BUF9XUklURSkKKyAgICBmbFByb3RlY3QgfD0gUEFHRV9SRUFEV1JJVEU7CisKKyAgU2V0TGFzdEVycm9yICgwKTsKKyAgaE1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZ0EoSU5WQUxJRF9IQU5ETEVfVkFMVUUsCisJCQkJTlVMTCwgZmxQcm90ZWN0LCAwLCAwLCBscE5hbWUpOworICBpZiAoaE1hcHBpbmcgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgLyogSnVzdCBpbiBjYXNlIFdpbmRvd3MgQ0UgY2hhbmdlcyBpdHMgYmVoYXZpb3VyLCB3ZSBjaGVjayBmb3IKKyAgICAgICAgIHRoZSByaWdodCBlcnJvciB2YWx1ZSBoZXJlLiAgKi8KKyAgICAgIGlmIChHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZShoTWFwcGluZyk7CisgICAgICAgICAgaE1hcHBpbmcgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIGhNYXBwaW5nOworfQorCisKK0JPT0wKK01vdmVGaWxlRXhBIChMUENTVFIgbHBFeGlzdGluZ0ZpbGVOYW1lLCBMUENTVFIgbHBOZXdGaWxlTmFtZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgX2RidXNfYXNzZXJ0IChkd0ZsYWdzID09IE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcpOworCisgIGlmIChfZGJ1c19maWxlX2V4aXN0cyAobHBOZXdGaWxlTmFtZSkpCisgICAgeworICAgICAgQk9PTCByZXN1bHQgPSBEZWxldGVGaWxlQSAobHBOZXdGaWxlTmFtZSk7CisgICAgICBpZiAocmVzdWx0ID09IDApCisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIE1vdmVGaWxlQSAobHBFeGlzdGluZ0ZpbGVOYW1lLCBscE5ld0ZpbGVOYW1lKTsKK30KKworCitCT09MCitTZXRIYW5kbGVJbmZvcm1hdGlvbiAoSEFORExFIGhPYmplY3QsIERXT1JEIGR3TWFzaywgRFdPUkQgZHdGbGFncykKK3sKKyAgX2RidXNfYXNzZXJ0IChkd01hc2sgPT0gKEhBTkRMRV9GTEFHX0lOSEVSSVQgfCBIQU5ETEVfRkxBR19QUk9URUNUX0ZST01fQ0xPU0UpKTsKKyAgX2RidXNfYXNzZXJ0IChkd0ZsYWdzID09IDApOworCisgIC8qIE5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRSwgYW5kIGFjdHVhbGx5IHRoZSBkZWZhdWx0LiAgU28ganVzdAorICAgICByZXR1cm4gb3ZlcndoZWxtaW5nIHN1Y2Nlc3MuICAqLworICByZXR1cm4gMTsKK30KKworCitEV09SRAorU2VhcmNoUGF0aEEgKExQQ1NUUiBscFBhdGgsIExQQ1NUUiBscEZpbGVOYW1lLCBMUENTVFIgbHBFeHRlbnNpb24sCisgICAgICAgICAgICAgRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBTVFIgbHBCdWZmZXIsIExQU1RSKiBscEZpbGVQYXJ0KQoreworICBjaGFyICpmaWxlbmFtZTsKKyAgY2hhciAqZmlsZXBhcnQ7CisgIGludCBmaWxlbmFtZV9sZW47CisgIAorICBfZGJ1c19hc3NlcnQgKGxwUGF0aCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChscEV4dGVuc2lvbiA9PSBOVUxMKTsKKyAgCisgIGZpbGVuYW1lID0gZmluZF9wcm9ncmFtX2luX2luc3RfZGlyIChscEZpbGVOYW1lKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICB7CisgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV9sZW4gPSBzdHJsZW4gKGZpbGVuYW1lKSArIDE7CisgIGlmIChmaWxlbmFtZV9sZW4gPiBuQnVmZmVyTGVuZ3RoKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBmaWxlbmFtZV9sZW47CisgICAgfQorCisgIHN0cmNweSAobHBCdWZmZXIsIGZpbGVuYW1lKTsKKyAgZnJlZSAoZmlsZW5hbWUpOworCisgIGZpbGVwYXJ0ID0gX21ic3JjaHIgKGxwQnVmZmVyLCAnXFwnKTsKKyAgaWYgKCFmaWxlcGFydCkKKyAgICBmaWxlcGFydCA9IGxwQnVmZmVyOworICAqbHBGaWxlUGFydCA9IGZpbGVwYXJ0OworCisgIHJldHVybiBmaWxlbmFtZV9sZW4gLSAxOworfQorCisKKy8qKiBHZXRzIG91ciBTSUQKKyAqIEBwYXJhbSBzaWQgcG9pbnRzIHRvIHNpZCBidWZmZXIsIG5lZWQgdG8gYmUgZnJlZWQgd2l0aCBMb2NhbEZyZWUoKQorICogQHJldHVybnMgcHJvY2VzcyBzaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldHNpZChjaGFyICoqc2lkKQoreworICAvKiBUaGVyZSBpcyBub3RoaW5nIGxpa2UgdGhpcyBvbiBXaW5kb3dzIENFLCBzbyB3ZSBmYWtlIGl0LiAgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgYXNpZFtdID0gIlMtMS01LTIxLTUxNTk2Nzg5OS05MjAwMjYyNjYtMTcwODUzNzc2OC0xMDAwIjsKKyAgY2hhciAqYnVmID0gTG9jYWxBbGxvYyAoTE1FTV9GSVhFRCwgc2l6ZW9mIChhc2lkKSk7CisgIGlmICghYnVmKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoIkxvY2FsQWxsb2MgZmFpbGVkIiwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWVtY3B5IChidWYsIGFzaWQsIHNpemVvZiAoYXNpZCkpOworICAqc2lkID0gYnVmOworICByZXR1cm4gVFJVRTsKK30KKworCitCT09MCitMb29rdXBBY2NvdW50TmFtZVcgKExQQ1dTVFIgbHBTeXN0ZW1OYW1lLCBMUENXU1RSIGxwQWNjb3VudE5hbWUsIFBTSUQgU2lkLCBQRFdPUkQgY2JTaWQsCisgICAgICAgICAgICAgICAgICAgIExQV1NUUiBSZWZlcmVuY2VkRG9tYWluTmFtZSwgUERXT1JEIGNjaFJlZmVyZW5jZWREb21haW5OYW1lLCBQU0lEX05BTUVfVVNFIHBlVXNlKQoreworICAvKiBDdXJyZW50bHkgbm90IG5lZWRlZC4gICovCisgIHJldHVybiBGQUxTRTsKK30KKworCitCT09MCitJc1ZhbGlkU2lkIChQU0lEIHBzaWQpCit7CisgIC8qIEN1cnJlbnRseSBub3QgbmVlZGVkLiAgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisKK0hBTkRMRQorQ3JlYXRlRmlsZUEgKExQQ1NUUiBscEZpbGVOYW1lLCBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsIERXT1JEIGR3U2hhcmVkTW9kZSwKKwkgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcywKKwkgICAgIERXT1JEIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgRFdPUkQgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsCisJICAgICBIQU5ETEUgaFRlbXBsYXRlRmlsZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIHJlc3VsdCA9IENyZWF0ZUZpbGVXIChmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlZE1vZGUsCisJCQlscFNlY3VyaXR5QXR0cmlidXRlcywgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorCQkJZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIGhUZW1wbGF0ZUZpbGUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitEZWxldGVGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gRGVsZXRlRmlsZVcgKGZpbGVuYW1lKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoZmlsZW5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorTW92ZUZpbGVBIChMUENTVFIgbHBFeGlzdGluZ0ZpbGVOYW1lLCBMUENTVFIgbHBOZXdGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZXhpc3RpbmdfZmlsZW5hbWU7CisgIHdjaGFyX3QgKm5ld19maWxlbmFtZTsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZXhpc3RpbmdfZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBFeGlzdGluZ0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCEgZXhpc3RpbmdfZmlsZW5hbWUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG5ld19maWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE5ld0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCEgbmV3X2ZpbGVuYW1lKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZXhpc3RpbmdfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXN1bHQgPSBNb3ZlRmlsZVcgKGV4aXN0aW5nX2ZpbGVuYW1lLCBuZXdfZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChleGlzdGluZ19maWxlbmFtZSk7CisgIGRidXNfZnJlZSAobmV3X2ZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0RXT1JECitHZXRGaWxlQXR0cmlidXRlc0EoTFBDU1RSIGxwRmlsZU5hbWUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBEV09SRCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfRklMRV9BVFRSSUJVVEVTOworCisgIHJlc3VsdCA9IEdldEZpbGVBdHRyaWJ1dGVzVyAoZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitHZXRGaWxlQXR0cmlidXRlc0V4QSAoTFBDU1RSIGxwRmlsZU5hbWUsIEdFVF9GSUxFRVhfSU5GT19MRVZFTFMgZkluZm9MZXZlbElkLAorICAgICAgICAgICAgICAgICAgICAgIFBWT0lEIGxwRmlsZUluZm9ybWF0aW9uKQoreworICB3Y2hhcl90ICpmaWxlbmFtZTsKKyAgRFdPUkQgcmVzdWx0OworICBpbnQgZXJyOworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUzsKKworICByZXN1bHQgPSBHZXRGaWxlQXR0cmlidXRlc0V4VyAoZmlsZW5hbWUsIGZJbmZvTGV2ZWxJZCwgbHBGaWxlSW5mb3JtYXRpb24pOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitIQU5ETEUKK0NyZWF0ZUZpbGVNYXBwaW5nQSAoSEFORExFIGhGaWxlLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBBdHRyaWJ1dGVzLAorCQkgICAgRFdPUkQgZmxQcm90ZWN0LCBEV09SRCBkd01heGltdW1TaXplSGlnaCwKKwkJICAgIERXT1JEIGR3TWF4aW11bVNpemVMb3csIExQQ1NUUiBscE5hbWUpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIHJlc3VsdCA9IENyZWF0ZUZpbGVNYXBwaW5nVyAoaEZpbGUsIGxwQXR0cmlidXRlcywgZmxQcm90ZWN0LAorCQkJICAgICAgIGR3TWF4aW11bVNpemVIaWdoLCBkd01heGltdW1TaXplTG93LAorCQkJICAgICAgIG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0NyZWF0ZURpcmVjdG9yeUEgKExQQ1NUUiBscFBhdGhOYW1lLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXMpCit7CisgIHdjaGFyX3QgKnBhdGhuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFBhdGhOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5VyAocGF0aG5hbWUsIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAocGF0aG5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorUmVtb3ZlRGlyZWN0b3J5QSAoTFBDU1RSIGxwUGF0aE5hbWUpCit7CisgIHdjaGFyX3QgKnBhdGhuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFBhdGhOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gUmVtb3ZlRGlyZWN0b3J5VyAocGF0aG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgQk9PTAorY29udmVydF9maW5kX2RhdGEgKExQV0lOMzJfRklORF9EQVRBVyBmZHcsIExQV0lOMzJfRklORF9EQVRBQSBmZGEpCit7CisgIGNoYXIgKmZpbGVuYW1lOworICBpbnQgbGVuOworCisgIGZkYS0+ZHdGaWxlQXR0cmlidXRlcyA9IGZkdy0+ZHdGaWxlQXR0cmlidXRlczsKKyAgZmRhLT5mdENyZWF0aW9uVGltZSA9IGZkdy0+ZnRDcmVhdGlvblRpbWU7CisgIGZkYS0+ZnRMYXN0QWNjZXNzVGltZSA9IGZkdy0+ZnRMYXN0QWNjZXNzVGltZTsKKyAgZmRhLT5mdExhc3RXcml0ZVRpbWUgPSBmZHctPmZ0TGFzdFdyaXRlVGltZTsKKyAgZmRhLT5uRmlsZVNpemVIaWdoID0gZmR3LT5uRmlsZVNpemVIaWdoOworICBmZGEtPm5GaWxlU2l6ZUxvdyA9IGZkdy0+bkZpbGVTaXplTG93OworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGZkdy0+Y0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGVuID0gc2l6ZW9mIChmZGEtPmNGaWxlTmFtZSk7CisgIHN0cm5jcHkgKGZkYS0+Y0ZpbGVOYW1lLCBmaWxlbmFtZSwgbGVuKTsKKyAgZmRhLT5jRmlsZU5hbWVbbGVuIC0gMV0gPSAnXDAnOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworSEFORExFCitGaW5kRmlyc3RGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUsIExQV0lOMzJfRklORF9EQVRBQSBscEZpbmRGaWxlRGF0YSkKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIFdJTjMyX0ZJTkRfREFUQVcgZmluZF9maWxlX2RhdGE7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgcGF0aG5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghcGF0aG5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIHJlc3VsdCA9IEZpbmRGaXJzdEZpbGVXIChwYXRobmFtZSwgJmZpbmRfZmlsZV9kYXRhKTsKKyAgaWYgKHJlc3VsdCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBCT09MIHJlcyA9IGNvbnZlcnRfZmluZF9kYXRhICgmZmluZF9maWxlX2RhdGEsIGxwRmluZEZpbGVEYXRhKTsKKyAgICAgIGlmICghIHJlcykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgICAgICAgICBGaW5kQ2xvc2UgKHJlc3VsdCk7CisgICAgICAgICAgU2V0TGFzdEVycm9yIChlcnIpOworICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitGaW5kTmV4dEZpbGVBIChIQU5ETEUgaEZpbmRGaWxlLCBMUFdJTjMyX0ZJTkRfREFUQUEgbHBGaW5kRmlsZURhdGEpCit7CisgIFdJTjMyX0ZJTkRfREFUQVcgZmluZF9maWxlX2RhdGE7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHJlc3VsdCA9IEZpbmROZXh0RmlsZVcgKGhGaW5kRmlsZSwgJmZpbmRfZmlsZV9kYXRhKTsKKyAgaWYgKHJlc3VsdCkKKyAgICByZXN1bHQgPSBjb252ZXJ0X2ZpbmRfZGF0YSAoJmZpbmRfZmlsZV9kYXRhLCBscEZpbmRGaWxlRGF0YSk7CisKKyAgcmV0dXJuIHJlc3VsdDsgIAorfQorCisKK0hBTkRMRQorQ3JlYXRlTXV0ZXhBIChMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBNdXRleEF0dHJpYnV0ZXMsIEJPT0wgYkluaXRpYWxPd25lciwKKwkgICAgICBMUENTVFIgbHBOYW1lKQoreworICB3Y2hhcl90ICpuYW1lOworICBIQU5ETEUgcmVzdWx0OworICBpbnQgZXJyOworCisgIGlmIChscE5hbWUpCisgICAgeworICAgICAgbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE5hbWUsIE5VTEwpOworICAgICAgaWYgKCFuYW1lKQorCXJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CisgIGVsc2UKKyAgICBuYW1lID0gTlVMTDsKKworICByZXN1bHQgPSBDcmVhdGVNdXRleFcgKGxwTXV0ZXhBdHRyaWJ1dGVzLCBiSW5pdGlhbE93bmVyLCBuYW1lKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitDcmVhdGVQcm9jZXNzQSAoTFBDU1RSIHBzekltYWdlTmFtZSwgTFBTVFIgcHN6Q21kTGluZSwKKyAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhUHJvY2VzcywKKyAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhVGhyZWFkLCBCT09MIGZJbmhlcml0SGFuZGxlcywKKyAgICAgICAgICAgICAgICBEV09SRCBmZHdDcmVhdGUsIFBWT0lEIHB2RW52aXJvbm1lbnQsIExQQ1NUUiBwc3pDdXJEaXIsCisgICAgICAgICAgICAgICAgTFBTVEFSVFVQSU5GT0EgcHNpU3RhcnRJbmZvLAorICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBwUHJvY0luZm8pCit7CisgIHdjaGFyX3QgKmltYWdlX25hbWUgPSBOVUxMOworICB3Y2hhcl90ICpjbWRfbGluZSA9IE5VTEw7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIF9kYnVzX2Fzc2VydCAocHNhUHJvY2VzcyA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwc2FUaHJlYWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZkluaGVyaXRIYW5kbGVzID09IEZBTFNFKTsKKyAgX2RidXNfYXNzZXJ0IChwdkVudmlyb25tZW50ID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBzekN1ckRpciA9PSBOVUxMKTsKKyAgLyogcHNpU3RhcnRJbmZvIGlzIGdlbmVyYWxseSBub3QgTlVMTC4gICovCisKKyAgaWYgKHBzekltYWdlTmFtZSkKKyAgICB7CisgICAgICBpbWFnZV9uYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKHBzekltYWdlTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIWltYWdlX25hbWUpCisJcmV0dXJuIDA7CisgICAgfQorICBpZiAocHN6Q21kTGluZSkKKyAgICB7CisgICAgICBjbWRfbGluZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChwc3pDbWRMaW5lLCBOVUxMKTsKKyAgICAgIGlmICghY21kX2xpbmUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW1hZ2VfbmFtZSkKKyAgICAgICAgICAgIGRidXNfZnJlZSAoaW1hZ2VfbmFtZSk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVzdWx0ID0gQ3JlYXRlUHJvY2Vzc1cgKGltYWdlX25hbWUsIGNtZF9saW5lLCBOVUxMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkd0NyZWF0ZSwgTlVMTCwgTlVMTCwgTlVMTCwgcFByb2NJbmZvKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoaW1hZ2VfbmFtZSk7CisgIGRidXNfZnJlZSAoY21kX2xpbmUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTE9ORworUmVnT3BlbktleUV4QSAoSEtFWSBoS2V5LCBMUENTVFIgbHBTdWJLZXksIERXT1JEIHVsT3B0aW9ucywKKyAgICAgICAgICAgICAgIFJFR1NBTSBzYW1EZXNpcmVkLCBQSEtFWSBwaGtSZXN1bHQpCit7CisgIHdjaGFyX3QgKnN1YmtleTsKKyAgTE9ORyByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwU3ViS2V5KQorICAgIHsKKyAgICAgIHN1YmtleSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFN1YktleSwgTlVMTCk7CisgICAgICBpZiAoIXN1YmtleSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICBzdWJrZXkgPSBOVUxMOworCisgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeCAoaEtleSwgc3Via2V5LCB1bE9wdGlvbnMsIHNhbURlc2lyZWQsIHBoa1Jlc3VsdCk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHN1YmtleSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitMT05HCitSZWdRdWVyeVZhbHVlRXhBIChIS0VZIGhLZXksIExQQ1NUUiBscFZhbHVlTmFtZSwgTFBEV09SRCBscFJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgTFBEV09SRCBscFR5cGUsIExQQllURSBscERhdGEsIExQRFdPUkQgbHBjYkRhdGEpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIExPTkcgZXJyOworICBCWVRFICpkYXRhOworICBEV09SRCBkYXRhX2xlbjsKKyAgRFdPUkQgdHlwZTsKKworICBpZiAobHBWYWx1ZU5hbWUpCisgICAgeworICAgICAgbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFZhbHVlTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIEdldExhc3RFcnJvciAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBuYW1lID0gTlVMTDsKKworICBkYXRhX2xlbiA9IDA7CisgIGVyciA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKGhLZXksIG5hbWUsIGxwUmVzZXJ2ZWQsIGxwVHlwZSwgTlVMTCwgJmRhdGFfbGVuKTsKKyAgaWYgKGVyciB8fCAhbHBjYkRhdGEpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIGRhdGEgPSBtYWxsb2MgKGRhdGFfbGVuICsgc2l6ZW9mICh3Y2hhcl90KSk7CisgIGlmICghZGF0YSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG5hbWUpOworICAgICAgcmV0dXJuIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgCisgIGVyciA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKGhLZXksIG5hbWUsIGxwUmVzZXJ2ZWQsICZ0eXBlLCBkYXRhLCAmZGF0YV9sZW4pOworICBpZiAobHBUeXBlKQorICAgICpscFR5cGUgPSB0eXBlOworICBkYnVzX2ZyZWUgKG5hbWUpOworICAvKiBJZiBlcnIgaXMgRVJST1JfTU9SRV9EQVRBLCB0aGVyZSBwcm9iYWJseSB3YXMgYSByYWNlIGNvbmRpdGlvbi4KKyAgICAgV2UgY2FuIHB1bnQgdGhpcyB0byB0aGUgY2FsbGVyIGp1c3QgYXMgd2VsbC4gICovCisgIGlmIChlcnIpCisgICAgeworICAgICAgZnJlZSAoZGF0YSk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAvKiBOT1RFOiBSRUdfTVVMVElfU1ogYW5kIFJFR19FWFBBTkRfU1ogbm90IHN1cHBvcnRlZCwgYmVjYXVzZSB0aGV5CisgICAgIGFyZSBub3QgbmVlZGVkIGluIHRoaXMgbW9kdWxlLiAgKi8KKyAgaWYgKHR5cGUgPT0gUkVHX1NaKQorICAgIHsKKyAgICAgIGNoYXIgKmRhdGFfYzsKKyAgICAgIGludCBkYXRhX2NfbGVuOworCisgICAgICAvKiBUaGlzIGlzIHZhbGlkIHNpbmNlIHdlIGFsbG9jYXRlZCBvbmUgbW9yZSBhYm92ZS4gICovCisgICAgICBkYXRhW2RhdGFfbGVuXSA9ICdcMCc7CisgICAgICBkYXRhW2RhdGFfbGVuICsgMV0gPSAnXDAnOworCisgICAgICAvKiBUaGUgY2FzdCBpcyB2YWxpZCBiZWNhdXNlIG1hbGxvYyBndWFyYW50ZWVzIGFsaWdubWVudCBvZgorICAgICAgICAgYmFzaWMgdHlwZXMuICAqLworICAgICAgZGF0YV9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKCh3Y2hhcl90KikgZGF0YSwgTlVMTCk7CisgICAgICBpZiAoIWRhdGFfYykKKyAgICAgICAgeworICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICBkYXRhX2NfbGVuID0gc3RybGVuIChkYXRhX2MpICsgMTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9jX2xlbiA8PSBkYXRhX2xlbiArIHNpemVvZiAod2NoYXJfdCkpOworICAgICAgbWVtY3B5IChkYXRhLCBkYXRhX2MsIGRhdGFfY19sZW4pOworICAgICAgZGF0YV9sZW4gPSBkYXRhX2NfbGVuOworICAgICAgZGJ1c19mcmVlIChkYXRhX2MpOworICAgIH0KKworICAvKiBEQVRBIGFuZCBEQVRBX0xFTiBub3cgY29udGFpbiB0aGUgcmVzdWx0LiAgKi8KKyAgaWYgKGxwRGF0YSkKKyAgICB7CisgICAgICBpZiAoZGF0YV9sZW4gPiAqbHBjYkRhdGEpCisgICAgICAgIGVyciA9IEVSUk9SX01PUkVfREFUQTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWVtY3B5IChscERhdGEsIGRhdGEsIGRhdGFfbGVuKTsKKyAgICB9CisgIGZyZWUgKGRhdGEpOworICAqbHBjYkRhdGEgPSBkYXRhX2xlbjsKKyAgcmV0dXJuIGVycjsKK30KKworCitEV09SRAorRm9ybWF0TWVzc2FnZUEgKERXT1JEIGR3RmxhZ3MsIFBDVk9JRCBscFNvdXJjZSwgRFdPUkQgZHdNZXNzYWdlSWQsCisJCURXT1JEIGR3TGFuZ3VhZ2VJZCwgTFBTVFIgbHBCdWZmZXIsIERXT1JEIG5TaXplLAorCQl2YV9saXN0KiBBcmd1bWVudHMpCit7CisgIExQV1NUUiBidWZmZXJfdyA9IE5VTEw7CisgIExQU1RSIGJ1ZmZlcl9jOworICBEV09SRCBsZW47CisgIGNoYXIgKmJ1ZmZlcl9uZXc7CisgIERXT1JEIGJ1ZmZlcl9uZXdfbGVuOworICBCT09MIGJ1ZmZlcl93X2ZyZWU7CisKKyAgbGVuID0gRm9ybWF0TWVzc2FnZVcgKGR3RmxhZ3MgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisJCQlscFNvdXJjZSwgZHdNZXNzYWdlSWQsIGR3TGFuZ3VhZ2VJZCwKKwkJCShMUFdTVFIpICZidWZmZXJfdywgMCwgQXJndW1lbnRzKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIGJ1ZmZlcl9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGJ1ZmZlcl93LCBOVUxMKTsKKyAgaWYgKCEgYnVmZmVyX2MpCisgICAgeworICAgICAgTG9jYWxGcmVlIChidWZmZXJfdyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byByZXR1cm4gYSBidWZmZXIgdGhhdCdzIGZyZWVhYmxlIHdpdGggTG9jYWxGcmVlLiAgKi8KKyAgICAgIGJ1ZmZlcl9uZXcgPSAoY2hhciAqKSBidWZmZXJfdzsKKyAgICAgIGJ1ZmZlcl9uZXdfbGVuID0gc2l6ZW9mICh3Y2hhcl90KSAqIChsZW4gKyAxKTsKKyAgICAgIGJ1ZmZlcl93X2ZyZWUgPSBGQUxTRTsKKyAgICAgIC8qIEF2b2lkIGFsaWdubWVudCBpc3N1ZSBieSB1c2luZyBtZW1jcHkuICAqLworICAgICAgbWVtY3B5IChscEJ1ZmZlciwgJmJ1ZmZlcl9uZXcsIHNpemVvZiAoYnVmZmVyX25ldykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZmZlcl9uZXcgPSBscEJ1ZmZlcjsKKyAgICAgIGJ1ZmZlcl9uZXdfbGVuID0gblNpemU7CisgICAgICBidWZmZXJfd19mcmVlID0gVFJVRTsKKyAgICB9CisKKyAgc3RybmNweSAoYnVmZmVyX25ldywgYnVmZmVyX2MsIGJ1ZmZlcl9uZXdfbGVuKTsKKyAgZGJ1c19mcmVlIChidWZmZXJfYyk7CisgIGJ1ZmZlcl9uZXdbYnVmZmVyX25ld19sZW4gLSAxXSA9ICdcMCc7CisgIGlmIChidWZmZXJfd19mcmVlKQorICAgIExvY2FsRnJlZSAoYnVmZmVyX3cpOworCisgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgIG5vdCBzdHJpbmcgbGVuZ3RoLiAgKi8KKyAgcmV0dXJuIHN0cmxlbiAoYnVmZmVyX25ldyk7Cit9CisKKworRFdPUkQKK0dldE1vZHVsZUZpbGVOYW1lQSAoSElOU1RBTkNFIGhNb2R1bGUsIExQU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICB3Y2hhcl90ICpmaWxlbmFtZV93OworICBjaGFyICpmaWxlbmFtZV9jOworICBEV09SRCBsZW47CisKKyAgaWYgKG5TaXplID09IDApCisgICAgeworICAgICAgLyogV2luZG93cyBYUC8yMDAwLiAgKi8KKyAgICAgIFNldExhc3RFcnJvciAoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZmlsZW5hbWVfdyA9IG1hbGxvYyAoc2l6ZW9mICh3Y2hhcl90KSAqIG5TaXplKTsKKyAgaWYgKCEgZmlsZW5hbWVfdykKKyAgICByZXR1cm4gMDsKKworICBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZVcgKGhNb2R1bGUsIGZpbGVuYW1lX3csIG5TaXplKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIC8qIE5vdGU6IElmIHdlIGZhaWwgd2l0aCBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLCB0aGlzIGlzIHN0aWxsCisgICAgICAgKGFwcHJveGltYXRlbHkpIGNvcnJlY3QuICAqLworICAgICAgZnJlZSAoZmlsZW5hbWVfdyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZmlsZW5hbWVfd1tuU2l6ZSAtIDFdID0gJ1wwJzsKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3dpbl91dGYxNl90b191dGY4IChmaWxlbmFtZV93LCBOVUxMKTsKKyAgZnJlZSAoZmlsZW5hbWVfdyk7CisgIGlmICghIGZpbGVuYW1lX2MpCisgICAgcmV0dXJuIDA7CisKKyAgc3RybmNweSAobHBGaWxlbmFtZSwgZmlsZW5hbWVfYywgblNpemUpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lX2MpOworICBscEZpbGVuYW1lW25TaXplIC0gMV0gPSAnXDAnOworICAvKiBzdHJsZW4gaXMgY29ycmVjdCAobm90IF9tYnN0cmxlbiksIGJlY2F1c2Ugd2Ugd2FudCBzdG9yYWdlIGFuZAorICAgICBub3Qgc3RyaW5nIGxlbmd0aC4gICovCisgIHJldHVybiBzdHJsZW4gKGxwRmlsZW5hbWUpOworfQorCisKK0RXT1JECitHZXRUZW1wUGF0aEEgKERXT1JEIG5CdWZmZXJMZW5ndGgsIExQU1RSIGxwQnVmZmVyKQoreworICB3Y2hhcl90IGR1bW15WzFdOworICBEV09SRCBsZW47CisKKyAgbGVuID0gR2V0VGVtcFBhdGhXICgwLCBkdW1teSk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSBNQVhfUEFUSCk7CisKKyAgLyogQmV0dGVyIGJlIHNhZmUgdGhhbiBzb3JyeS4gIE1TRE4gZG9lc24ndCBzYXkgaWYgbGVuIGlzIHdpdGggb3IKKyAgICAgd2l0aG91dCB0ZXJtaW5hdGluZyAwLiAgKi8KKyAgbGVuKys7CisKKyAgeworICAgIHdjaGFyX3QgKmJ1ZmZlcl93OworICAgIERXT1JEIGxlbl93OworICAgIGNoYXIgKmJ1ZmZlcl9jOworICAgIERXT1JEIGxlbl9jOworCisgICAgYnVmZmVyX3cgPSBtYWxsb2MgKHNpemVvZiAod2NoYXJfdCkgKiBsZW4pOworICAgIGlmICghIGJ1ZmZlcl93KQorICAgICAgcmV0dXJuIDA7CisKKyAgICBsZW5fdyA9IEdldFRlbXBQYXRoVyAobGVuLCBidWZmZXJfdyk7CisgICAgLyogR2l2ZSB1cCBpZiB3ZSBzdGlsbCBjYW4ndCBnZXQgYXQgaXQuICAqLworICAgIGlmIChsZW5fdyA9PSAwIHx8IGxlbl93ID49IGxlbikKKyAgICAgIHsKKyAgICAgICAgZnJlZSAoYnVmZmVyX3cpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgIC8qIEJldHRlciBiZSByZWFsbHkgc2FmZS4gICovCisgICAgYnVmZmVyX3dbbGVuX3ddID0gJ1wwJzsKKworICAgIGJ1ZmZlcl9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGJ1ZmZlcl93LCBOVUxMKTsKKyAgICBmcmVlIChidWZmZXJfdyk7CisgICAgaWYgKCEgYnVmZmVyX2MpCisgICAgICByZXR1cm4gMDsKKworICAgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgICAgbm90IHN0cmluZyBsZW5ndGguICAqLworICAgIGxlbl9jID0gc3RybGVuIChidWZmZXJfYykgKyAxOworICAgIGlmIChsZW5fYyA+IG5CdWZmZXJMZW5ndGgpCisgICAgICByZXR1cm4gbGVuX2M7CisKKyAgICBzdHJjcHkgKGxwQnVmZmVyLCBidWZmZXJfYyk7CisgICAgZGJ1c19mcmVlIChidWZmZXJfYyk7CisgICAgcmV0dXJuIGxlbl9jIC0gMTsKKyAgfQorfQorCisKK0JPT0wKK1NIR2V0U3BlY2lhbEZvbGRlclBhdGhBIChIV05EIGh3bmRPd25lciwgTFBTVFIgbHBzelBhdGgsIGludCBuRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkNyZWF0ZSkKK3sKKyAgd2NoYXJfdCBwYXRoW01BWF9QQVRIXTsKKyAgY2hhciAqcGF0aF9jOworICBCT09MIHJlc3VsdDsKKworICBwYXRoWzBdID0gKHdjaGFyX3QpIDA7CisgIHJlc3VsdCA9IFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXIChod25kT3duZXIsIHBhdGgsIG5Gb2xkZXIsIGZDcmVhdGUpOworICAvKiBOb3RlOiBNYXkgcmV0dXJuIGZhbHNlIGV2ZW4gaWYgc3VjY2VlZHMuICAqLworCisgIHBhdGhbTUFYX1BBVEggLSAxXSA9ICh3Y2hhcl90KSAwOworICBwYXRoX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAocGF0aCwgTlVMTCk7CisgIGlmICghIHBhdGhfYykKKyAgICByZXR1cm4gMDsKKyAgCisgIHN0cm5jcHkgKGxwc3pQYXRoLCBwYXRoX2MsIE1BWF9QQVRIKTsKKyAgZGJ1c19mcmVlIChwYXRoX2MpOworICBscHN6UGF0aFtNQVhfUEFUSCAtIDFdID0gJ1wwJzsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitPdXRwdXREZWJ1Z1N0cmluZ0EgKExQQ1NUUiBscE91dHB1dFN0cmluZykKK3sKKyAgd2NoYXJfdCAqc3RyOworICBIQU5ETEUgcmVzdWx0OworICBpbnQgZXJyOworCisgIHN0ciA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE91dHB1dFN0cmluZywgTlVMTCk7CisgIGlmICghc3RyKQorICAgIHJldHVybjsKKworICBPdXRwdXREZWJ1Z1N0cmluZ1cgKHN0cik7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHN0cik7CisgIFNldExhc3RFcnJvciAoZXJyKTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBiL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFjNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmggRW11bGF0aW9uIG9mIHN5c3RlbS9saWJjIGZlYXR1cmVzIGZvciBXaW5kb3dzIENFIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NZU0RFUFNfV0lOQ0VfR0xVRV9ICisjZGVmaW5lIERCVVNfU1lTREVQU19XSU5DRV9HTFVFX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogRm9yIGdldGFkZHJpbmZvLCBjb25maWd1cmUvY21ha2UgZGVmaW5lZCBfV0lOMzJfV0NFIHRvIHNvbWV0aGluZyA+PSAweDA0MDEuICAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworREJVU19CRUdJTl9ERUNMUworCisvKiBzaGxvYmouaCBkZWNsYXJlcyB0aGVzZSBvbmx5IGZvciBfV0lOMzJfSUUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGRlZmluZS4KKyAgIEluIGFueSBjYXNlLCB3aXRoIG1pbmd3MzJjZSB3ZSBvbmx5IGdldCBhIFNIR2V0U3BlY2lhbEZvbGRlclBhdGguICAqLworI2RlZmluZSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoVyBTSEdldFNwZWNpYWxGb2xkZXJQYXRoCitCT09MIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoQShIV05ELExQU1RSLGludCxCT09MKTsKK0JPT0wgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXKEhXTkQsTFBXU1RSLGludCxCT09MKTsKKworI2lmbmRlZiBUTFNfT1VUX09GX0lOREVYRVMKKyNkZWZpbmUgVExTX09VVF9PRl9JTkRFWEVTIDB4ZmZmZmZmZmYKKyNlbmRpZgorCisKKy8qIFNlcmlvdXNseS4gIFdpbmRvd3MgQ0UgZG9lcyBub3QgaGF2ZSBlcnJuby4gIERvbid0IHlvdSBoYXRlIGl0IHdoZW4KKyAgIHRoYXQgaGFwcGVucz8gICovCisjZGVmaW5lIGVycm5vICgoaW50KUdldExhc3RFcnJvciAoKSkKKworI2RlZmluZSBFTk9FTlQgICAgICAgICAgRVJST1JfRklMRV9OT1RfRk9VTkQKKyNkZWZpbmUgRU1GSUxFICAgICAgICAgIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMKKyNkZWZpbmUgRUFDQ0VTICAgICAgICAgIEVSUk9SX0FDQ0VTU19ERU5JRUQKKyNkZWZpbmUgRUJBREYgICAgICAgICAgIEVSUk9SX0lOVkFMSURfSEFORExFCisjZGVmaW5lIEVOT01FTSAgICAgICAgICBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWQorI2RlZmluZSBFWERFViAgICAgICAgICAgRVJST1JfTk9UX1NBTUVfREVWSUNFCisjZGVmaW5lIEVORklMRSAgICAgICAgICBFUlJPUl9OT19NT1JFX0ZJTEVTCisjZGVmaW5lIEVST0ZTICAgICAgICAgICBFUlJPUl9XUklURV9QUk9URUNUCisjZGVmaW5lIEVOT0xDSyAgICAgICAgICBFUlJPUl9TSEFSSU5HX0JVRkZFUl9FWENFRURFRAorI2RlZmluZSBFTk9TWVMgICAgICAgICAgRVJST1JfTk9UX1NVUFBPUlRFRAorI2RlZmluZSBFRVhJU1QgICAgICAgICAgRVJST1JfRklMRV9FWElTVFMKKyNkZWZpbmUgRVBFUk0gICAgICAgICAgIEVSUk9SX0NBTk5PVF9NQUtFCisjZGVmaW5lIEVJTlZBTCAgICAgICAgICBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUgorI2RlZmluZSBFSU5UUiAgICAgICAgICAgRVJST1JfSU5WQUxJRF9BVF9JTlRFUlJVUFRfVElNRQorI2RlZmluZSBFUElQRSAgICAgICAgICAgRVJST1JfQlJPS0VOX1BJUEUKKyNkZWZpbmUgRU5PU1BDICAgICAgICAgIEVSUk9SX0RJU0tfRlVMTAorI2RlZmluZSBFTk9URU1QVFkgICAgICAgRVJST1JfRElSX05PVF9FTVBUWQorI2RlZmluZSBFQlVTWSAgICAgICAgICAgRVJST1JfQlVTWQorI2RlZmluZSBFTkFNRVRPT0xPTkcgICAgRVJST1JfRklMRU5BTUVfRVhDRURfUkFOR0UKKyNkZWZpbmUgRUFHQUlOICAgICAgICAgIEVSUk9SX01PUkVfREFUQQorI2RlZmluZSBFTk9URElSICAgICAgICAgRVJST1JfRElSRUNUT1JZCisjZGVmaW5lIEVSQU5HRSAgICAgICAgICBFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XCisjZGVmaW5lIEVOWElPICAgICAgICAgICBFUlJPUl9GSUxFX0lOVkFMSUQKKyNkZWZpbmUgRUZBVUxUICAgICAgICAgIEVSUk9SX1BST0NFU1NfQUJPUlRFRAorI2RlZmluZSBFSU8gICAgICAgICAgICAgRVJST1JfSU9fREVWSUNFCisjZGVmaW5lIEVERUFETE9DSyAgICAgICBFUlJPUl9QT1NTSUJMRV9ERUFETE9DSworI2RlZmluZSBFTk9ERVYgICAgICAgICAgRVJST1JfQkFEX0RFVklDRQorCisvKiBXaW5kb3dzIENFIGlzIG1pc3NpbmcgbW9yZSBzdHVmZiB0aGF0IGlzIHByZXR0eSBzdGFuZGFyZC4gICovCisKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKKyNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAorI2RlZmluZSBzdHJuaWNtcCBfc3RybmljbXAKKworI2RlZmluZSBlbnZpcm9uIF9kYnVzX3dpbmNlX2Vudmlyb24KK2V4dGVybiBjaGFyICplbnZpcm9uW107CisKKyNkZWZpbmUgZ2V0ZW52IF9kYnVzX3dpbmNlX2dldGVudgorY2hhciAqZ2V0ZW52IChjb25zdCBjaGFyICpuYW1lKTsKKworI2RlZmluZSBwdXRlbnYgX2RidXNfd2luY2VfcHV0ZW52CitpbnQgcHV0ZW52IChjaGFyICpzdHIpOworCisjZGVmaW5lIGNsb2NrIF9kYnVzX3dpbmNlX2Nsb2NrCitjbG9ja190IGNsb2NrICh2b2lkKTsKKworI2RlZmluZSBhYm9ydCBfZGJ1c193aW5jZV9hYm9ydAordm9pZCBhYm9ydCAodm9pZCk7CisKKyNkZWZpbmUgX1NfSUZNVCAgICAgICAgIDAxNzAwMDAgICAgICAgICAvKiBmaWxlIHR5cGUgbWFzayAqLworI2RlZmluZSBfU19JRkRJUiAgICAgICAgMDA0MDAwMCAgICAgICAgIC8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBfU19JRkNIUiAgICAgICAgMDAyMDAwMCAgICAgICAgIC8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIF9TX0lGSUZPICAgICAgICAwMDEwMDAwICAgICAgICAgLyogcGlwZSAqLworI2RlZmluZSBfU19JRlJFRyAgICAgICAgMDEwMDAwMCAgICAgICAgIC8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUgX1NfSVJFQUQgICAgICAgIDAwMDA0MDAgICAgICAgICAvKiByZWFkIHBlcm1pc3Npb24sIG93bmVyICovCisjZGVmaW5lIF9TX0lXUklURSAgICAgICAwMDAwMjAwICAgICAgICAgLyogd3JpdGUgcGVybWlzc2lvbiwgb3duZXIgKi8KKyNkZWZpbmUgX1NfSUVYRUMgICAgICAgIDAwMDAxMDAgICAgICAgICAvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uLCBvd25lciAqLworCisjaWZuZGVmIF9fT0ZGX1RfREVGSU5FRAordHlwZWRlZiBsb25nIG9mZl90OworI2RlZmluZSBfX09GRl9UX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAordHlwZWRlZiBpbnQgaW50cHRyX3Q7CisjZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjZW5kaWYKKyNpZm5kZWYgX1VJTlRQVFJfVF9ERUZJTkVECit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50cHRyX3Q7CisjZGVmaW5lIF9VSU5UUFRSX1RfREVGSU5FRAorI2VuZGlmCisKKyNpZm5kZWYgX01BWF9GTkFNRQorI2RlZmluZSBfTUFYX0ZOQU1FIDI1NgorI2VuZGlmCisKKyNpZm5kZWYgX0lPRkJGCisjZGVmaW5lIF9JT0ZCRgkwCisjZW5kaWYKKyNpZm5kZWYgX0lPTEJGCisjZGVmaW5lIF9JT0xCRgkxCisjZW5kaWYKKyNpZm5kZWYgX0lPTkJGCisjZGVmaW5lIF9JT05CRgkyCisjZW5kaWYKKworCisvKiBXaW5kb3dzIENFIGlzIG1pc3Npbmcgc29tZSBXaW5kb3dzIGZ1bmN0aW9ucyB0aGF0IHdlIHdhbnQuICAqLworCisjZGVmaW5lIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIF9kYnVzX3dpbmNlX0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lCit2b2lkIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCk7CisKKyNkZWZpbmUgX21ic3JjaHIgX2RidXNfd2luY2VfbWJzcmNocgordW5zaWduZWQgY2hhciogX21ic3JjaHIgKGNvbnN0IHVuc2lnbmVkIGNoYXIqLCB1bnNpZ25lZCBpbnQpOworCisjZGVmaW5lIE9wZW5GaWxlTWFwcGluZ0EgX2RidXNfd2luY2VfT3BlbkZpbGVNYXBwaW5nQQorSEFORExFIE9wZW5GaWxlTWFwcGluZ0EoRFdPUkQsQk9PTCxMUENTVFIpOworCisjZGVmaW5lIE1vdmVGaWxlRXhBIF9kYnVzX3dpbmNlX01vdmVGaWxlRXhBCitCT09MIE1vdmVGaWxlRXhBKExQQ1NUUixMUENTVFIsRFdPUkQpOworI2lmbmRlZiBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HCisjZGVmaW5lIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcgMHgwMDAwMDAwMQorI2VuZGlmCisKKyNkZWZpbmUgU2V0SGFuZGxlSW5mb3JtYXRpb24gX2RidXNfd2luY2VfU2V0SGFuZGxlSW5mb3JtYXRpb24KK0JPT0wgU2V0SGFuZGxlSW5mb3JtYXRpb24oSEFORExFLERXT1JELERXT1JEKTsKKyNpZm5kZWYgSEFORExFX0ZMQUdfSU5IRVJJVAorI2RlZmluZSBIQU5ETEVfRkxBR19JTkhFUklUIDB4MDEKKyNlbmRpZgorI2lmbmRlZiBIQU5ETEVfRkxBR19QUk9URUNUCisjZGVmaW5lIEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSAweDAyCisjZW5kaWYKKworI2RlZmluZSBTZWFyY2hQYXRoQSBfZGJ1c193aW5jZV9TZWFyY2hQYXRoQQorRFdPUkQgU2VhcmNoUGF0aEEoTFBDU1RSLExQQ1NUUixMUENTVFIsRFdPUkQsTFBTVFIsTFBTVFIqKTsKKworLyogSW5zdGVhZCBvZiBlbXVsYXRpbmcgYWxsIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoaXMsIHdlIHJlcGxhY2UgdGhlCisgICB3aG9sZSB0aGluZy4gICovCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRzaWQoY2hhciAqKnNpZCk7CisKKworI2RlZmluZSBMb29rdXBBY2NvdW50TmFtZVcgX2RidXNfd2luY2VfTG9va3VwQWNjb3VudE5hbWVXCitCT09MIExvb2t1cEFjY291bnROYW1lVyhMUENXU1RSLExQQ1dTVFIsUFNJRCxQRFdPUkQsTFBXU1RSLFBEV09SRCxQU0lEX05BTUVfVVNFKTsKKworI2RlZmluZSBJc1ZhbGlkU2lkIF9kYnVzX3dpbmNlX0lzVmFsaWRTaWQKK0JPT0wgSXNWYWxpZFNpZChQU0lEKTsKKworCisvKiBXaW5kb3dzIENFIGRvZXMgb25seSBoYXZlIHRoZSBVTklDT0RFIGludGVyZmFjZXMgKEZvb1cpLCBidXQgd2UKKyAgIHdhbnQgdG8gdXNlIHRoZSBBU0NJSSBpbnRlcmZhY2VzIChGb29BKS4gIFdlIGltcGxlbWVudCB0aGVtCisgICBoZXJlLiAgKi8KKworI2RlZmluZSBDcmVhdGVGaWxlQSBfZGJ1c193aW5jZV9DcmVhdGVGaWxlQQorSEFORExFIENyZWF0ZUZpbGVBKExQQ1NUUixEV09SRCxEV09SRCxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsSEFORExFKTsKKworI2RlZmluZSBEZWxldGVGaWxlQSBfZGJ1c193aW5jZV9EZWxldGVGaWxlQQorQk9PTCBEZWxldGVGaWxlQShMUENTVFIpOworCisjZGVmaW5lIEdldEZpbGVBdHRyaWJ1dGVzQSBfZGJ1c193aW5jZV9HZXRGaWxlQXR0cmlidXRlc0EKK0RXT1JEIEdldEZpbGVBdHRyaWJ1dGVzQShMUENTVFIpOworCisjZGVmaW5lIEdldEZpbGVBdHRyaWJ1dGVzRXhBIF9kYnVzX3dpbmNlX0dldEZpbGVBdHRyaWJ1dGVzRXhBCitCT09MIEdldEZpbGVBdHRyaWJ1dGVzRXhBKExQQ1NUUixHRVRfRklMRUVYX0lORk9fTEVWRUxTLFBWT0lEKTsKKworI2RlZmluZSBDcmVhdGVGaWxlTWFwcGluZ0EgX2RidXNfd2luY2VfQ3JlYXRlRmlsZU1hcHBpbmdBCitIQU5ETEUgQ3JlYXRlRmlsZU1hcHBpbmdBKEhBTkRMRSxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsRFdPUkQsTFBDU1RSKTsKKworI2RlZmluZSBDcmVhdGVEaXJlY3RvcnlBIF9kYnVzX3dpbmNlX0NyZWF0ZURpcmVjdG9yeUEKK0JPT0wgQ3JlYXRlRGlyZWN0b3J5QShMUENTVFIsTFBTRUNVUklUWV9BVFRSSUJVVEVTKTsKKworI2RlZmluZSBSZW1vdmVEaXJlY3RvcnlBIF9kYnVzX3dpbmNlX1JlbW92ZURpcmVjdG9yeUEKK0JPT0wgUmVtb3ZlRGlyZWN0b3J5QShMUENTVFIpOworCisjZGVmaW5lIEZpbmRGaXJzdEZpbGVBIF9kYnVzX3dpbmNlX0ZpbmRGaXJzdEZpbGVBCitIQU5ETEUgRmluZEZpcnN0RmlsZUEoTFBDU1RSLExQV0lOMzJfRklORF9EQVRBQSk7CisKKyNkZWZpbmUgRmluZE5leHRGaWxlQSBfZGJ1c193aW5jZV9GaW5kTmV4dEZpbGVBCitCT09MIEZpbmROZXh0RmlsZUEoSEFORExFLExQV0lOMzJfRklORF9EQVRBQSk7CisKKyNkZWZpbmUgQ3JlYXRlTXV0ZXhBIF9kYnVzX3dpbmNlX0NyZWF0ZU11dGV4QQorSEFORExFIENyZWF0ZU11dGV4QShMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTCxMUENTVFIpOworCisjZGVmaW5lIENyZWF0ZVByb2Nlc3NBIF9kYnVzX3dpbmNlX0NyZWF0ZVByb2Nlc3NBCitCT09MIENyZWF0ZVByb2Nlc3NBKExQQ1NUUixMUFNUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wsRFdPUkQsUFZPSUQsTFBDU1RSLExQU1RBUlRVUElORk9BLExQUFJPQ0VTU19JTkZPUk1BVElPTik7CisjaWZuZGVmIENSRUFURV9OT19XSU5ET1cKKyNkZWZpbmUgQ1JFQVRFX05PX1dJTkRPVyAweDA4MDAwMDAwCisjZW5kaWYKKworCisjZGVmaW5lIFJlZ09wZW5LZXlFeEEgX2RidXNfd2luY2VfUmVnT3BlbktleUV4QQorTE9ORyBSZWdPcGVuS2V5RXhBKEhLRVksTFBDU1RSLERXT1JELFJFR1NBTSxQSEtFWSk7CisKKyNkZWZpbmUgUmVnUXVlcnlWYWx1ZUV4QSBfZGJ1c193aW5jZV9SZWdRdWVyeVZhbHVlRXhBCitMT05HIFdJTkFQSSBSZWdRdWVyeVZhbHVlRXhBKEhLRVksTFBDU1RSLExQRFdPUkQsTFBEV09SRCxMUEJZVEUsTFBEV09SRCk7CisKKworI2RlZmluZSBGb3JtYXRNZXNzYWdlQSBfZGJ1c193aW5jZV9Gb3JtYXRNZXNzYWdlQQorRFdPUkQgRm9ybWF0TWVzc2FnZUEoRFdPUkQsUENWT0lELERXT1JELERXT1JELExQU1RSLERXT1JELHZhX2xpc3QqKTsKKworI2RlZmluZSBHZXRNb2R1bGVGaWxlTmFtZUEgX2RidXNfd2luY2VfR2V0TW9kdWxlRmlsZU5hbWVBCitEV09SRCBHZXRNb2R1bGVGaWxlTmFtZUEoSElOU1RBTkNFLExQU1RSLERXT1JEKTsKKworI2RlZmluZSBHZXRUZW1wUGF0aEEgX2RidXNfd2luY2VfR2V0VGVtcFBhdGhBCitEV09SRCBHZXRUZW1wUGF0aEEoRFdPUkQsTFBTVFIpOworCisjZGVmaW5lIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBIF9kYnVzX3dpbmNlX1NIR2V0U3BlY2lhbEZvbGRlclBhdGhBCitCT09MIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBKEhXTkQsTFBTVFIsaW50LEJPT0wpOworCisKKyNkZWZpbmUgT3V0cHV0RGVidWdTdHJpbmdBIF9kYnVzX3dpbmNlX091dHB1dERlYnVnU3RyaW5nQQordm9pZCBPdXRwdXREZWJ1Z1N0cmluZ0EoTFBDU1RSKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TWVNERVBTX1dJTkNFX0dMVUVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMuYyBiL2RidXMvZGJ1cy1zeXNkZXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ODZkNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLmMKQEAgLTAsMCArMSw3NTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmMgV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIHNoYXJlZCBiZXR3ZWVuIFVOSVggYW5kIFdpbmRvd3MgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1pc2MuaCIKKworLyogTk9URTogSWYgeW91IGluY2x1ZGUgYW55IHVuaXgvd2luZG93cy1zcGVjaWZpYyBoZWFkZXJzIGhlcmUsIHlvdSBhcmUgcHJvYmFibHkgZG9pbmcgc29tZXRoaW5nCisgKiB3cm9uZyBhbmQgc2hvdWxkIGJlIHB1dHRpbmcgc29tZSBjb2RlIGluIGRidXMtc3lzZGVwcy11bml4LmMgb3IgZGJ1cy1zeXNkZXBzLXdpbi5jLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgQU5TSSBDIGhlYWRlcnMuLi4KKyAqLworI2lmIEhBVkVfTE9DQUxFX0gKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorICAjaW5jbHVkZSA8c3RkbGliLmg+CisjZWxpZiAoZGVmaW5lZCBfX0FQUExFX18pCisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2Vsc2UKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3lzZGVwcyBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFsIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGF2YWlsYWJsZSBvbiBVTklYIGFuZCBXaW5kb3dzCisgKgorICogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGhhcyBhIGR1YWwgcHVycG9zZS4gRmlyc3QsIGl0IGVuY2Fwc3VsYXRlcworICogYWxsIHVzYWdlIG9mIG9wZXJhdGluZyBzeXN0ZW0gQVBJcyBmb3IgZWFzZSBvZiBhdWRpdGluZyBhbmQgdG8KKyAqIGF2b2lkIGNsdXR0ZXJpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgd2l0aCBiaXphcnJlIE9TIHF1aXJrcyBhbmQKKyAqIGhlYWRlcnMuIFNlY29uZCwgaXQgYWJzdHJhY3RzIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtIEFQSXMgZm9yCisgKiBwb3J0YWJpbGl0eS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEFib3J0cyB0aGUgcHJvZ3JhbSB3aXRoIFNJR0FCUlQgKGR1bXBpbmcgY29yZSkuCisgKi8KK3ZvaWQKK19kYnVzX2Fib3J0ICh2b2lkKQoreworICBjb25zdCBjaGFyICpzOworICAKKyAgX2RidXNfcHJpbnRfYmFja3RyYWNlICgpOworICAKKyAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfQkxPQ0tfT05fQUJPUlQiKTsKKyAgaWYgKHMgJiYgKnMpCisgICAgeworICAgICAgLyogZG9uJ3QgdXNlIF9kYnVzX3dhcm4gaGVyZSBzaW5jZSBpdCBjYW4gX2RidXNfYWJvcnQoKSAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBQcm9jZXNzICVsdSBzbGVlcGluZyBmb3IgZ2RiIGF0dGFjaFxuIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCkpOworICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgxMDAwICogMTgwKTsKKyAgICB9CisgIAorICBhYm9ydCAoKTsKKyAgX2RidXNfZXhpdCAoMSk7IC8qIGluIGNhc2Ugc29tZW9uZSBtYW5hZ2VzIHRvIGlnbm9yZSBTSUdBQlJUID8gKi8KK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWlzYworICoKKyAqIFdyYXBwZXIgZm9yIHNldGVudigpLiBJZiB0aGUgdmFsdWUgaXMgI05VTEwsIHVuc2V0cworICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICoKKyAqIFRoZXJlIGlzIGFuIHVuZml4YWJsZSBtZW1sZWFrIGluIHRoYXQgaXQgaXMgdW5zYWZlIHRvCisgKiBmcmVlIG1lbW9yeSBtYWxsb2NlZCBmb3IgdXNlIHdpdGggc2V0ZW52LiBUaGlzIGlzIGJlY2F1c2UKKyAqIHdlIGNhbiBub3QgcmVseSBvbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mCisgKiB0aGUgdW5kZXJseWluZyBsaWJjIGxpYnJhcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUsIGJlY2F1c2UgYWx0ZXJpbmcgdGhlIGVudmlyb25tZW50CisgKiBpbiBVbml4IGlzIG5vdCB0aHJlYWQtc2FmZSBpbiBnZW5lcmFsLgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2V0ZW52IChjb25zdCBjaGFyICp2YXJuYW1lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKHZhcm5hbWUgIT0gTlVMTCk7CisgIAorICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTlNFVEVOVgorICAgICAgdW5zZXRlbnYgKHZhcm5hbWUpOworICAgICAgcmV0dXJuIFRSVUU7CisjZWxzZQorICAgICAgY2hhciAqcHV0ZW52X3ZhbHVlOworICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgbGVuID0gc3RybGVuICh2YXJuYW1lKTsKKworICAgICAgLyogVXNlIHN5c3RlbSBtYWxsb2MgdG8gYXZvaWQgbWVtbGVha3MgdGhhdCBkYnVzX21hbGxvYworICAgICAgICogd2lsbCBnZXQgdXBzZXQgYWJvdXQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgcHV0ZW52X3ZhbHVlID0gbWFsbG9jIChsZW4gKyAyKTsKKyAgICAgIGlmIChwdXRlbnZfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdHJjcHkgKHB1dGVudl92YWx1ZSwgdmFybmFtZSk7CisjaWYgZGVmaW5lZChEQlVTX1dJTikKKyAgICAgIHN0cmNhdCAocHV0ZW52X3ZhbHVlLCAiPSIpOworI2VuZGlmCisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgICByZXR1cm4gKHNldGVudiAodmFybmFtZSwgdmFsdWUsIFRSVUUpID09IDApOworI2Vsc2UKKyAgICAgIGNoYXIgKnB1dGVudl92YWx1ZTsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzaXplX3QgdmFybmFtZV9sZW47CisgICAgICBzaXplX3QgdmFsdWVfbGVuOworCisgICAgICB2YXJuYW1lX2xlbiA9IHN0cmxlbiAodmFybmFtZSk7CisgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKTsKKyAgICAgIAorICAgICAgbGVuID0gdmFybmFtZV9sZW4gKyB2YWx1ZV9sZW4gKyAxIC8qICc9JyAqLyA7CisKKyAgICAgIC8qIFVzZSBzeXN0ZW0gbWFsbG9jIHRvIGF2b2lkIG1lbWxlYWtzIHRoYXQgZGJ1c19tYWxsb2MKKyAgICAgICAqIHdpbGwgZ2V0IHVwc2V0IGFib3V0LgorICAgICAgICovCisgICAgICAKKyAgICAgIHB1dGVudl92YWx1ZSA9IG1hbGxvYyAobGVuICsgMSk7CisgICAgICBpZiAocHV0ZW52X3ZhbHVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUsIHZhcm5hbWUpOworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUgKyB2YXJuYW1lX2xlbiwgIj0iKTsKKyAgICAgIHN0cmNweSAocHV0ZW52X3ZhbHVlICsgdmFybmFtZV9sZW4gKyAxLCB2YWx1ZSk7CisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIGdldGVudigpLgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEByZXR1cm5zIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG9yICNOVUxMIGlmIHVuc2V0CisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUpCit7ICAKKyAgLyogRG9uJ3QgcmVzcGVjdCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMKKyAgICogc2V0dWlkLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBnbGliYydzIF9fc2VjdXJlX2dldGVudigpLgorICAgKi8KKyAgaWYgKF9kYnVzX2NoZWNrX3NldHVpZCAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGdldGVudiAodmFybmFtZSk7Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgY2xlYXJlbnYoKS4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xlYXJlbnYgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IHJjID0gVFJVRTsKKworI2lmZGVmIEhBVkVfQ0xFQVJFTlYKKyAgaWYgKGNsZWFyZW52ICgpICE9IDApCisgICAgIHJjID0gRkFMU0U7CisjZWxzZQorCisgIGlmIChlbnZpcm9uICE9IE5VTEwpCisgICAgZW52aXJvblswXSA9IE5VTEw7CisjZW5kaWYKKworICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogU3BsaXQgcGF0aHMgaW50byBhIGxpc3Qgb2YgY2hhciBzdHJpbmdzCisgKiAKKyAqIEBwYXJhbSBkaXJzIHN0cmluZyB3aXRoIHBhdGhlcyAKKyAqIEBwYXJhbSBzdWZmaXggc3RyaW5nIGNvbmNhdGVkIHRvIGVhY2ggcGF0aCBpbiBkaXJzCisgKiBAcGFyYW0gZGlyX2xpc3QgY29udGFpbnMgYSBsaXN0IG9mIHNwbGl0dGVkIHBhdGhlcworICogcmV0dXJuICNUUlVFIGlzIHBhdGhlcyBjb3VsZCBiZSBzcGxpdHRlcywjRkFMU0UgaW4gb29tIGNhc2UgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kIChEQnVzU3RyaW5nICpkaXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKipkaXJfbGlzdCkKK3sKKyAgIGludCBzdGFydDsKKyAgIGludCBpOworICAgaW50IGxlbjsKKyAgIGNoYXIgKmNwYXRoOworICAgREJ1c1N0cmluZyBmaWxlX3N1ZmZpeDsKKworICAgc3RhcnQgPSAwOworICAgaSA9IDA7CisKKyAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9zdWZmaXgsIHN1ZmZpeCk7CisKKyAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJzKTsKKworICAgd2hpbGUgKF9kYnVzX3N0cmluZ19maW5kIChkaXJzLCBzdGFydCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IsICZpKSkKKyAgICAgeworICAgICAgIERCdXNTdHJpbmcgcGF0aDsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXRoKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJnBhdGgpOworCisgICAgICAgIC8qIGNoZWNrIGZvciBhbiBlbXB0eSBwYXRoICovCisgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBhdGgpID09IDApCisgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSgmcGF0aCwgJmNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRpcl9saXN0LCBjcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGJ1c19mcmVlIChjcGF0aCk7CisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICB9CisKKyAgICAgICBuZXh0OgorICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICBzdGFydCA9IGkgKyAxOworICAgIH0gCisgICAgICAKKyAgaWYgKHN0YXJ0ICE9IGxlbikKKyAgICB7IAorICAgICAgREJ1c1N0cmluZyBwYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGF0aCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhKCZwYXRoLCAmY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChkaXJfbGlzdCwgY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgIGRidXNfZnJlZSAoY3BhdGgpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7IAorICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfbGlzdF9mb3JlYWNoIChkaXJfbGlzdCwgKERCdXNGb3JlYWNoRnVuY3Rpb24pZGJ1c19mcmVlLCBOVUxMKTsgCisgIF9kYnVzX2xpc3RfY2xlYXIgKGRpcl9saXN0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKgorICogQHsKKyAqLworLyoqCisgKiBBcHBlbmRzIGFuIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIHZhbHVlKQoreworICAvKiB0aGlzIGNhbGN1bGF0aW9uIGlzIGZyb20gY29tcC5sYW5nLmMgZmFxICovCisjZGVmaW5lIE1BWF9MT05HX0xFTiAoKHNpemVvZiAobG9uZykgKiA4ICsgMikgLyAzICsgMSkgIC8qICsxIGZvciAnLScgKi8KKyAgaW50IG9yaWdfbGVuOworICBpbnQgaTsKKyAgY2hhciAqYnVmOworICAKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBNQVhfTE9OR19MRU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9yaWdfbGVuLCBNQVhfTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9MT05HX0xFTiwgIiVsZCIsIHZhbHVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKCpidWYpCisgICAgeworICAgICAgKytidWY7CisgICAgICArK2k7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKHN0ciwgTUFYX0xPTkdfTEVOIC0gaSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgdmFsdWUpCit7CisgIC8qIHRoaXMgaXMgd3JvbmcsIGJ1dCBkZWZpbml0ZWx5IG9uIHRoZSBoaWdoIHNpZGUuICovCisjZGVmaW5lIE1BWF9VTE9OR19MRU4gKE1BWF9MT05HX0xFTiAqIDIpCisgIGludCBvcmlnX2xlbjsKKyAgaW50IGk7CisgIGNoYXIgKmJ1ZjsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgTUFYX1VMT05HX0xFTikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1ZiA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb3JpZ19sZW4sIE1BWF9VTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9VTE9OR19MRU4sICIlbHUiLCB2YWx1ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlICgqYnVmKQorICAgIHsKKyAgICAgICsrYnVmOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIE1BWF9VTE9OR19MRU4gLSBpKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFBhcnNlcyBhbiBpbnRlZ2VyIGNvbnRhaW5lZCBpbiBhIERCdXNTdHJpbmcuIEVpdGhlciByZXR1cm4gcGFyYW1ldGVyCisgKiBtYXkgYmUgI05VTEwgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIGl0LiBUaGUgaW50ZWdlciBpcyBwYXJzZWQKKyAqIGFuZCBzdG9yZWQgaW4gdmFsdWVfcmV0dXJuLiBSZXR1cm4gcGFyYW1ldGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgKiBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlZ2VyCisgKiBAcGFyYW0gdmFsdWVfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW50ZWdlciB2YWx1ZSBvciAjTlVMTAorICogQHBhcmFtIGVuZF9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGludGVnZXIsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcGFyc2VfaW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pCit7CisgIGxvbmcgdjsKKyAgY29uc3QgY2hhciAqcDsKKyAgY2hhciAqZW5kOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCk7CisKKyAgZW5kID0gTlVMTDsKKyAgX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKCk7CisgIHYgPSBzdHJ0b2wgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciBjb250YWluZWQgaW4gYSBEQnVzU3RyaW5nLiBFaXRoZXIgcmV0dXJuCisgKiBwYXJhbWV0ZXIgbWF5IGJlICNOVUxMIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdC4gVGhlIGludGVnZXIKKyAqIGlzIHBhcnNlZCBhbmQgc3RvcmVkIGluIHZhbHVlX3JldHVybi4gUmV0dXJuIHBhcmFtZXRlcnMgYXJlIG5vdAorICogaW5pdGlhbGl6ZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBieXRlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgaW50ZWdlcgorICogQHBhcmFtIHZhbHVlX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGludGVnZXIgdmFsdWUgb3IgI05VTEwKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBpbnRlZ2VyLCBvciAjTlVMTAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kX3JldHVybikKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworICBjb25zdCBjaGFyICpwOworICBjaGFyICplbmQ7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KTsKKworICBlbmQgPSBOVUxMOworICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAoKTsKKyAgdiA9IHN0cnRvdWwgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgZ3JvdXAgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBGaWxscyBuX2J5dGVzIG9mIHRoZSBnaXZlbiBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMuCisgKgorICogQHBhcmFtIGJ1ZmZlciBhbiBhbGxvY2F0ZWQgYnVmZmVyCisgKiBAcGFyYW0gbl9ieXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZSB0bworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmc3RyLCBuX2J5dGVzLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKCZzdHIsIGJ1ZmZlciwgbl9ieXRlcyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiByYW5kb20gYnl0ZXMsIHdoZXJlIHRoZSBieXRlcyBhcmUKKyAqIGNob3NlbiBmcm9tIHRoZSBhbHBoYW51bWVyaWMgQVNDSUkgc3Vic2V0LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gQVNDSUkgYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeSBvciBvdGhlciBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgaW50IGk7CisgIGludCBsZW47CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoc3RyLCBuX2J5dGVzLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGkgPSBsZW4gLSBuX2J5dGVzOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVyc1tfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgaSkgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgKGxldHRlcnMpIC0gMSldKTsKKworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoc3RyLCBsZW4gLSBuX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9ieXRlcykpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgVU5JWCBlcnJubywgb3IgV2luZG93cyBlcnJubyBvciBXaW5Tb2NrIGVycm9yIHZhbHVlIGludG8KKyAqIGEgI0RCdXNFcnJvciBuYW1lLgorICoKKyAqIEB0b2RvIHNob3VsZCBjb3ZlciBtb3JlIGVycm5vcywgc3BlY2lmaWNhbGx5IHRob3NlCisgKiBmcm9tIG9wZW4oKS4KKyAqIAorICogQHBhcmFtIGVycm9yX251bWJlciB0aGUgZXJybm8uCisgKiBAcmV0dXJucyBhbiBlcnJvciBuYW1lCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBzd2l0Y2ggKGVycm9yX251bWJlcikKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworICAgICAgCisjaWZkZWYgRVBST1RPTk9TVVBQT1JUCisgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VsaWYgZGVmaW5lZChXU0FFUFJPVE9OT1NVUFBPUlQpCisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisjaWZkZWYgRUFGTk9TVVBQT1JUCisgICAgY2FzZSBFQUZOT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VsaWYgZGVmaW5lZChXU0FFQUZOT1NVUFBPUlQpCisgICAgY2FzZSBXU0FFQUZOT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisjaWZkZWYgRU5GSUxFCisgICAgY2FzZSBFTkZJTEU6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQ7IC8qIGtlcm5lbCBvdXQgb2YgbWVtb3J5ICovCisjZW5kaWYKKyNpZmRlZiBFTUZJTEUKKyAgICBjYXNlIEVNRklMRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRDsKKyNlbmRpZgorI2lmZGVmIEVBQ0NFUworICAgIGNhc2UgRUFDQ0VTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRDsKKyNlbmRpZgorI2lmZGVmIEVQRVJNCisgICAgY2FzZSBFUEVSTToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQ7CisjZW5kaWYKKyNpZmRlZiBFTk9CVUZTCisgICAgY2FzZSBFTk9CVUZTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTUVNT1JZOworI2VuZGlmCisjaWZkZWYgRU5PTUVNCisgICAgY2FzZSBFTk9NRU06CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisjZW5kaWYKKyNpZmRlZiBFQ09OTlJFRlVTRUQKKyAgICBjYXNlIEVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX1NFUlZFUjsKKyNlbGlmIGRlZmluZWQoV1NBRUNPTk5SRUZVU0VEKQorICAgIGNhc2UgV1NBRUNPTk5SRUZVU0VEOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fU0VSVkVSOworI2VuZGlmCisjaWZkZWYgRVRJTUVET1VUCisgICAgY2FzZSBFVElNRURPVVQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9USU1FT1VUOworI2VsaWYgZGVmaW5lZChXU0FFVElNRURPVVQpCisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9USU1FT1VUOworI2VuZGlmCisjaWZkZWYgRU5FVFVOUkVBQ0gKKyAgICBjYXNlIEVORVRVTlJFQUNIOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTkVUV09SSzsKKyNlbGlmIGRlZmluZWQoV1NBRU5FVFVOUkVBQ0gpCisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX05FVFdPUks7CisjZW5kaWYKKyNpZmRlZiBFQUREUklOVVNFCisgICAgY2FzZSBFQUREUklOVVNFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0U7CisjZWxpZiBkZWZpbmVkKFdTQUVBRERSSU5VU0UpCisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0U7CisjZW5kaWYKKyNpZmRlZiBFRVhJU1QKKyAgICBjYXNlIEVFWElTVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTOworI2VuZGlmCisjaWZkZWYgRU5PRU5UCisgICAgY2FzZSBFTk9FTlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GSUxFX05PVF9GT1VORDsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIGN1cnJlbnQgc3lzdGVtIGVycm5vIHZhbHVlIGludG8gYSAjREJ1c0Vycm9yIG5hbWUuCisgKgorICogQHJldHVybnMgYW4gZXJyb3IgbmFtZQorICovCitjb25zdCBjaGFyKgorX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyk7Cit9CisKKy8qKgorICogQXNzaWduIDAgdG8gdGhlIGdsb2JhbCBlcnJubyB2YXJpYWJsZQorICovCit2b2lkCitfZGJ1c19zZXRfZXJybm9fdG9femVybyAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX1dJTkNFCisgIFNldExhc3RFcnJvciAoMCk7CisjZWxzZQorICBlcnJubyA9IDA7CisjZW5kaWYKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRU5PTUVNCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlID09IEVOT01FTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2Vub21lbSAoaW50IGUpCit7CisgIHJldHVybiBlID09IEVOT01FTTsKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUlOVFIKKyAqIEByZXR1cm5zICNUUlVFIGlmIGUgPT0gRUlOVFIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19laW50ciAoaW50IGUpCit7CisgIHJldHVybiBlID09IEVJTlRSOworfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBFUElQRQorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gPT0gRVBJUEUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lcGlwZSAoaW50IGUpCit7CisgIHJldHVybiBlID09IEVQSVBFOworfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBFVE9PTUFOWVJFRlMKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVycm5vID09IEVUT09NQU5ZUkVGUworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2lzX2Vycm5vX2V0b29tYW55cmVmcyAoaW50IGUpCit7CisjaWZkZWYgRVRPT01BTllSRUZTCisgIHJldHVybiBlID09IEVUT09NQU5ZUkVGUzsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldCBlcnJvciBtZXNzYWdlIGZyb20gZXJybm8KKyAqIEByZXR1cm5zIF9kYnVzX3N0cmVycm9yKGVycm5vKQorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmVycm9yIChlcnJubyk7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcyAqLworCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy5oIGIvZGJ1cy9kYnVzLXN5c2RlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDE1MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMuaApAQCAtMCwwICsxLDY5MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuaCBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19ICisjZGVmaW5lIERCVVNfU1lTREVQU19ICisKKyNpZm5kZWYgVkVSU0lPTgorI3dhcm5pbmcgUGxlYXNlIGluY2x1ZGUgY29uZmlnLmggYmVmb3JlIGRidXMtc3lzZGVwcy5oCisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1maWxlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCisvKiB0aGlzIGlzIHBlcmhhcHMgYm9ndXMsIGJ1dCBzdHJjbXAoKSBldGMuIGFyZSBmYXN0ZXIgaWYgd2UgdXNlIHRoZQorICogc3R1ZmYgc3RyYWlnaHQgb3V0IG9mIHN0cmluZy5oLCBzbyBoYXZlIHRoaXMgaGVyZSBmb3Igbm93LgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEFJWCBzeXMvcG9sbC5oIGRvZXMgI2RlZmluZSBldmVudHMgcmVxZXZlbnRzLCBhbmQgb3RoZXIKKyAqIHdvbmRlcm91c25lc3MsIHNvIG11c3QgaW5jbHVkZSBzeXMvcG9sbCBiZWZvcmUgZGVjbGFyaW5nCisgKiBEQnVzUG9sbEZECisgKi8gCisjaWZkZWYgSEFWRV9QT0xMCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorLyogV2luZG93cyBDRSBsYWNrcyBzb21lIHN5c3RlbSBmdW5jdGlvbnMgKHN1Y2ggYXMgZXJybm8gYW5kIGNsb2NrKS4KKyAgIFdlIGJyaW5nIHRoZW0gaW4gaGVyZS4gICovCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCIKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorI2VuZGlmCisKK0RCVVNfQkVHSU5fREVDTFMKKworI2lmZGVmIERCVVNfV0lOCisjZGVmaW5lIF9EQlVTX1BBVEhfU0VQQVJBVE9SICI7IgorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfUEFUSF9TRVBBUkFUT1IgIjoiCisjZW5kaWYKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworCisvKiogQW4gb3BhcXVlIGxpc3QgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0xpc3QgREJ1c0xpc3Q7CisKKy8qKiBPYmplY3QgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY3JlZGVudGlhbHMgc3VjaCBhcyBVTklYIG9yIFdpbmRvd3MgdXNlciBJRCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NyZWRlbnRpYWxzIERCdXNDcmVkZW50aWFsczsKKworLyoqIEEgd3JhcHBlciBhcm91bmQgYSBwaXBlIGRlc2NyaXB0b3Igb3IgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUGlwZSBEQnVzUGlwZTsKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3lzZGVwcworICoKKyAqIEB7CisgKi8KKwordm9pZCBfZGJ1c19hYm9ydCAodm9pZCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworZGJ1c19ib29sX3QgX2RidXNfY2hlY2tfc2V0dWlkICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX2dldGVudiAoY29uc3QgY2hhciAqdmFybmFtZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19jbGVhcmVudiAodm9pZCk7CitjaGFyICoqICAgICBfZGJ1c19nZXRfZW52aXJvbm1lbnQgKHZvaWQpOworCisvKiogQSBwcm9jZXNzIElEICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZGJ1c19waWRfdDsKKy8qKiBBIHVzZXIgSUQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYnVzX3VpZF90OworLyoqIEEgZ3JvdXAgSUQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYnVzX2dpZF90OworCisvKiogYW4gaW52YWxpZCBQSUQgdXNlZCB0byByZXByZXNlbnQgYW4gdW5pbml0aWFsaXplZCBkYnVzX3BpZF90IGZpZWxkICovCisjZGVmaW5lIERCVVNfUElEX1VOU0VUICgoZGJ1c19waWRfdCkgLTEpCisvKiogYW4gaW52YWxpZCBVSUQgdXNlZCB0byByZXByZXNlbnQgYW4gdW5pbml0aWFsaXplZCBkYnVzX3VpZF90IGZpZWxkICovCisjZGVmaW5lIERCVVNfVUlEX1VOU0VUICgoZGJ1c191aWRfdCkgLTEpCisvKiogYW4gaW52YWxpZCBHSUQgdXNlZCB0byByZXByZXNlbnQgYW4gdW5pbml0aWFsaXplZCBkYnVzX2dpZF90IGZpZWxkICovCisjZGVmaW5lIERCVVNfR0lEX1VOU0VUICgoZGJ1c19naWRfdCkgLTEpCisKKy8qKiBhbiBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBkYnVzX3BpZF90ICovCisjZGVmaW5lIERCVVNfUElEX0ZPUk1BVCAiJWx1IgorLyoqIGFuIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGRidXNfdWlkX3QgKi8KKyNkZWZpbmUgREJVU19VSURfRk9STUFUICIlbHUiCisvKiogYW4gYXBwcm9wcmlhdGUgcHJpbnRmIGZvcm1hdCBmb3IgZGJ1c19naWRfdCAqLworI2RlZmluZSBEQlVTX0dJRF9GT1JNQVQgIiVsdSIKKworLyoqCisgKiBTb2NrZXQgaW50ZXJmYWNlCisgKi8KKyNpZmRlZiBEQlVTX1dJTgorCit0eXBlZGVmIHN0cnVjdCB7IFNPQ0tFVCBzb2NrOyB9IERCdXNTb2NrZXQ7CisjIGRlZmluZSBEQlVTX1NPQ0tFVF9GT1JNQVQgIkl1IgorIyBkZWZpbmUgREJVU19TT0NLRVRfSU5JVCB7IElOVkFMSURfU09DS0VUIH0KKworc3RhdGljIGlubGluZSBTT0NLRVQKK19kYnVzX3NvY2tldF9wcmludGFibGUgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gcy5zb2NrOyB9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX3NvY2tldF9pc192YWxpZCAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzLnNvY2sgIT0gSU5WQUxJRF9TT0NLRVQ7IH0KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoREJ1c1NvY2tldCAqcykgeyBzLT5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7IH0KKworc3RhdGljIGlubGluZSBpbnQKK19kYnVzX3NvY2tldF9nZXRfaW50IChEQnVzU29ja2V0IHMpIHsgcmV0dXJuIChpbnQpcy5zb2NrOyB9CisKKyNlbHNlIC8qIG5vdCBEQlVTX1dJTiAqLworCit0eXBlZGVmIHN0cnVjdCB7IGludCBmZDsgfSBEQnVzU29ja2V0OworIyBkZWZpbmUgREJVU19TT0NLRVRfRk9STUFUICJkIgorIyBkZWZpbmUgREJVU19TT0NLRVRfSU5JVCB7IC0xIH0KKworc3RhdGljIGlubGluZSBpbnQKK19kYnVzX3NvY2tldF9wcmludGFibGUgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gcy5mZDsgfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19zb2NrZXRfaXNfdmFsaWQgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gcy5mZCA+PSAwOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKERCdXNTb2NrZXQgKnMpIHsgcy0+ZmQgPSAtMTsgfQorCitzdGF0aWMgaW5saW5lIGludAorX2RidXNfc29ja2V0X2dldF9pbnQgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gcy5mZDsgfQorCisjZW5kaWYgLyogbm90IERCVVNfV0lOICovCisKK3N0YXRpYyBpbmxpbmUgREJ1c1NvY2tldAorX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICh2b2lkKQoreworICBEQnVzU29ja2V0IHMgPSBEQlVTX1NPQ0tFVF9JTklUOworCisgIHJldHVybiBzOworfQorCitkYnVzX2Jvb2xfdCBfZGJ1c19zZXRfc29ja2V0X25vbmJsb2NraW5nIChEQnVzU29ja2V0ICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19jbG9zZV9zb2NrZXQgICAgIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgIF9kYnVzX3JlYWRfc29ja2V0ICAgICAgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0ICAgICAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitpbnQgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpOworCitpbnQgX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2ZkcyAgICAgIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbl9mZHMpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50IF9kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzICAgICAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKTsKK2ludCBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2Zkc190d28gKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKTsKKworREJ1c1NvY2tldCBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQgIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQnVzU29ja2V0IF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlICAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitpbnQgX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgICAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqcmV0cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0ICAgICoqZmRzX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCdXNTb2NrZXQgX2RidXNfYWNjZXB0ICAgICAgIChEQnVzU29ja2V0ICAgICAgbGlzdGVuX2ZkKTsKKworZGJ1c19ib29sX3QgX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgIGNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICBzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lKTsKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKworZGJ1c19ib29sX3QgX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3ApOworZGJ1c19ib29sX3QgX2RidXNfcGFyc2VfdW5peF9ncm91cF9mcm9tX2NvbmZpZyAgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfZ3JvdXBzX2Zyb21fdWlkICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgKipncm91cF9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKm5fZ3JvdXBfaWRzKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c191bml4X3VzZXJfaXNfcHJvY2Vzc19vd25lciAgICAoZGJ1c191aWRfdCAgICAgICAgIHVpZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAoY29uc3QgY2hhciAgICAgICAgKndpbmRvd3Nfc2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoREJ1c1N0cmluZyAgICAgICpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGFlbW9uX2lzX3Nlc3Npb25fYnVzX2FkZHJlc3NfcHVibGlzaGVkIChjb25zdCBjaGFyICpzY29wZSk7CisKK2RidXNfYm9vbF90IF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHJlc3MsIGNvbnN0IGNoYXIqIHNobV9uYW1lKTsKKwordm9pZCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19zb2NrZXRfY2FuX3Bhc3NfdW5peF9mZChEQnVzU29ja2V0IGZkKTsKKworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhbiBhdG9taWNhbGx5LW1vZGlmaWFibGUgaW50ZWdlcgorICogdGhhdCBjYW4gYmUgdXNlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNBdG9taWMgREJ1c0F0b21pYzsKKworLyoqCisgKiBBbiBhdG9taWMgaW50ZWdlciBzYWZlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICovCitzdHJ1Y3QgREJ1c0F0b21pYworeworI2lmZGVmIERCVVNfV0lOCisgIHZvbGF0aWxlIGxvbmcgdmFsdWU7IC8qKjwgVmFsdWUgb2YgdGhlIGF0b21pYyBpbnRlZ2VyLiAqLworI2Vsc2UKKyAgdm9sYXRpbGUgZGJ1c19pbnQzMl90IHZhbHVlOyAvKio8IFZhbHVlIG9mIHRoZSBhdG9taWMgaW50ZWdlci4gKi8KKyNlbmRpZgorfTsKKworLyogVGhlIHZhbHVlIHdlIGdldCBmcm9tIGF1dG9mb28gaXMgaW4gdGhlIGZvcm0gb2YgYSBjcHAgZXhwcmVzc2lvbjsKKyAqIGNvbnZlcnQgdGhhdCB0byBhIGNvbnZlbnRpb25hbCBkZWZpbmVkL3VuZGVmIHN3aXRjaC4gKFdlIGNhbid0IGdldAorICogdGhlIGNvbnZlbnRpb25hbCBkZWZpbmVkL3VuZGVmIGJlY2F1c2Ugb2YgbXVsdGlhcmNoIGJ1aWxkcyBvbmx5IHJ1bm5pbmcKKyAqIC4vY29uZmlndXJlIG9uY2UsIG9uIERhcndpbi4pICovCisjaWYgREJVU19IQVZFX0FUT01JQ19JTlRfQ09ORAorIyAgIGRlZmluZSBEQlVTX0hBVkVfQVRPTUlDX0lOVCAxCisjZWxzZQorIyAgIHVuZGVmIERCVVNfSEFWRV9BVE9NSUNfSU5UCisjZW5kaWYKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19pbnQzMl90IF9kYnVzX2F0b21pY19pbmMgKERCdXNBdG9taWMgKmF0b21pYyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2ludDMyX3QgX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfaW50MzJfdCBfZGJ1c19hdG9taWNfZ2V0IChEQnVzQXRvbWljICphdG9taWMpOworCisjaWZkZWYgREJVU19XSU4KKworLyogT24gV2luZG93cywgeW91IGNhbiBvbmx5IHBvbGwgc29ja2V0cy4gV2UgZW11bGF0ZSBVbml4IHBvbGwoKSB1c2luZworICogc2VsZWN0KCksIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgcHJlY2lzZSB0eXBlIHdlIHB1dCBpbiBEQnVzUG9sbEZEOworICogdXNlIERCdXNTb2NrZXQgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIGNoZWNrIHdlIGFyZSBkb2luZyBpdCByaWdodC4KKyAqLwordHlwZWRlZiBEQnVzU29ja2V0IERCdXNQb2xsYWJsZTsKKyMgZGVmaW5lIERCVVNfUE9MTEFCTEVfRk9STUFUICJJdSIKKworc3RhdGljIGlubGluZSBEQnVzUG9sbGFibGUKK19kYnVzX3NvY2tldF9nZXRfcG9sbGFibGUgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gczsgfQorCitzdGF0aWMgaW5saW5lIFNPQ0tFVAorX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlIChEQnVzUG9sbGFibGUgcCkgeyByZXR1cm4gcC5zb2NrOyB9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkIChEQnVzUG9sbGFibGUgcCkgeyByZXR1cm4gX2RidXNfc29ja2V0X2lzX3ZhbGlkIChwKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3BvbGxhYmxlX2ludmFsaWRhdGUgKERCdXNQb2xsYWJsZSAqcCkgeyBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAocCk7IH0KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfcG9sbGFibGVfZXF1YWxzIChEQnVzUG9sbGFibGUgYSwgREJ1c1BvbGxhYmxlIGIpIHsgcmV0dXJuIGEuc29jayA9PSBiLnNvY2s7IH0KKworI2Vsc2UgLyogIURCVVNfV0lOICovCisKKy8qIE9uIFVuaXgsIHlvdSBjYW4gcG9sbCBzb2NrZXRzLCBwaXBlcywgZXRjLiwgYW5kIHdlIG11c3QgcHV0IGV4YWN0bHkKKyAqICJpbnQiIGluIERCdXNQb2xsRkQgYmVjYXVzZSB3ZSdyZSByZWx5aW5nIG9uIGl0cyBsYXlvdXQgZXhhY3RseSBtYXRjaGluZworICogc3RydWN0IHBvbGxmZC4gKFRoaXMgaXMgc2lsbHksIGFuZCBvbmUgZGF5IHdlIHNob3VsZCB1c2UgYSBiZXR0ZXIKKyAqIGFic3RyYWN0aW9uLikKKyAqLwordHlwZWRlZiBpbnQgREJ1c1BvbGxhYmxlOworIyBkZWZpbmUgREJVU19QT0xMQUJMRV9GT1JNQVQgImQiCisKK3N0YXRpYyBpbmxpbmUgREJ1c1BvbGxhYmxlCitfZGJ1c19zb2NrZXRfZ2V0X3BvbGxhYmxlIChEQnVzU29ja2V0IHMpIHsgcmV0dXJuIHMuZmQ7IH0KKworc3RhdGljIGlubGluZSBpbnQKK19kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAoREJ1c1BvbGxhYmxlIHApIHsgcmV0dXJuIHA7IH0KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKERCdXNQb2xsYWJsZSBwKSB7IHJldHVybiBwID49IDA7IH0KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19wb2xsYWJsZV9pbnZhbGlkYXRlIChEQnVzUG9sbGFibGUgKnApIHsgKnAgPSAtMTsgfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19wb2xsYWJsZV9lcXVhbHMgKERCdXNQb2xsYWJsZSBhLCBEQnVzUG9sbGFibGUgYikgeyByZXR1cm4gYSA9PSBiOyB9CisKKyNlbmRpZiAvKiAhREJVU19XSU4gKi8KKworI2lmIGRlZmluZWQoSEFWRV9QT0xMKSAmJiAhZGVmaW5lZChCUk9LRU5fUE9MTCkKKy8qKgorICogQSBwb3J0YWJsZSBzdHJ1Y3QgcG9sbGZkIHdyYXBwZXIsIG9yIGFuIGVtdWxhdGlvbiBvZiBzdHJ1Y3QgcG9sbGZkCisgKiBvbiBwbGF0Zm9ybXMgd2hlcmUgcG9sbCgpIGlzIG1pc3Npbmcgb3IgYnJva2VuLgorICovCit0eXBlZGVmIHN0cnVjdCBwb2xsZmQgREJ1c1BvbGxGRDsKKworLyoqIFRoZXJlIGlzIGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMSU4gICAgICBQT0xMSU4KKy8qKiBUaGVyZSBpcyB1cmdlbnQgZGF0YSB0byByZWFkICovCisjZGVmaW5lIF9EQlVTX1BPTExQUkkgICAgIFBPTExQUkkKKy8qKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jayAqLworI2RlZmluZSBfREJVU19QT0xMT1VUICAgICBQT0xMT1VUCisvKiogRXJyb3IgY29uZGl0aW9uICovCisjZGVmaW5lIF9EQlVTX1BPTExFUlIgICAgIFBPTExFUlIKKy8qKiBIdW5nIHVwICovCisjZGVmaW5lIF9EQlVTX1BPTExIVVAgICAgIFBPTExIVVAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIFBPTExOVkFMCisjZWxzZQorLyogRW11bGF0ZSBwb2xsKCkgdmlhIHNlbGVjdCgpLiBCZWNhdXNlIHdlIGFyZW4ndCByZWFsbHkgZ29pbmcgdG8gY2FsbAorICogcG9sbCgpLCBhbnkgc2ltaWxhcmx5LXNoYXBlZCBzdHJ1Y3QgaXMgYWNjZXB0YWJsZSwgYW5kIGFueSBwb3dlciBvZiAyCisgKiB3aWxsIGRvIGZvciB0aGUgZXZlbnRzL3JldmVudHM7IHRoZXNlIHZhbHVlcyBoYXBwZW4gdG8gbWF0Y2ggTGludXgKKyAqIGFuZCAqQlNELiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c1BvbGxhYmxlIGZkOyAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yICovCisgIHNob3J0IGV2ZW50czsgICAgICAvKio8IEV2ZW50cyB0byBwb2xsIGZvciAqLworICBzaG9ydCByZXZlbnRzOyAgICAgLyoqPCBFdmVudHMgdGhhdCBvY2N1cnJlZCAqLworfSBEQnVzUG9sbEZEOworCisvKiogVGhlcmUgaXMgZGF0YSB0byByZWFkICovCisjZGVmaW5lIF9EQlVTX1BPTExJTiAgICAgIDB4MDAwMQorLyoqIFRoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTFBSSSAgICAgMHgwMDAyCisvKiogV3JpdGluZyBub3cgd2lsbCBub3QgYmxvY2sgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE9VVCAgICAgMHgwMDA0CisvKiogRXJyb3IgY29uZGl0aW9uICovCisjZGVmaW5lIF9EQlVTX1BPTExFUlIgICAgIDB4MDAwOAorLyoqIEh1bmcgdXAgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEhVUCAgICAgMHgwMDEwCisvKiogSW52YWxpZCByZXF1ZXN0OiBmZCBub3Qgb3BlbiAqLworI2RlZmluZSBfREJVU19QT0xMTlZBTCAgICAweDAwMjAKKyNlbmRpZgorCitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgX2RidXNfcG9sbCAoREJ1c1BvbGxGRCAqZmRzLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2dldF9yZWFsX3RpbWUgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYyk7CisKKy8qKgorICogZGlyZWN0b3J5IGludGVyZmFjZQorICovCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfZGVsZXRlX2RpcmVjdG9yeSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorCQkJCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5leHRfY29tcG9uZW50KTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19nZXRfZGlybmFtZSAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGlybmFtZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXRoX2lzX2Fic29sdXRlICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSk7CisKK2RidXNfYm9vbF90IF9kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKTsKKworZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSAgKERCdXNTdHJpbmcgKnN0cik7CitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKTsKKworLyoqIE9wYXF1ZSB0eXBlIGZvciByZWFkaW5nIGEgZGlyZWN0b3J5IGxpc3RpbmcgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNEaXJJdGVyIERCdXNEaXJJdGVyOworCitEQnVzRGlySXRlciogX2RidXNfZGlyZWN0b3J5X29wZW4gICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKERCdXNEaXJJdGVyICAgICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlICAgICAgICAgKERCdXNEaXJJdGVyICAgICAgKml0ZXIpOworCitkYnVzX2Jvb2xfdCAgX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlciAgICAoREJ1c1N0cmluZyAqZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiBfZGJ1c19nZXRfdG1wZGlyICAgICAgKHZvaWQpOworCisvKioKKyAqIFJhbmRvbSBudW1iZXJzIAorICovCitfREJVU19HTlVDX1dBUk5fVU5VU0VEX1JFU1VMVAorZGJ1c19ib29sX3QgX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAgICAgICAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgICAgICAgIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChpbnQgZXJyb3JfbnVtYmVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICh2b2lkKTsKKworaW50ICAgICAgICAgX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gICAgICAgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICBfZGJ1c19yZXN0b3JlX3NvY2tldF9lcnJubyAgICAgICAgICAgICAgIChpbnQgc2F2ZWRfZXJybm8pOwordm9pZCAgICAgICAgX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gICAgICAgICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrIChpbnQgZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICAgICAgICAgICAgICAgIChpbnQgZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIgICAgICAgICAgICAgICAgIChpbnQgZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZXBpcGUgICAgICAgICAgICAgICAgIChpbnQgZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZXRvb21hbnlyZWZzICAgICAgICAgIChpbnQgZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICAgICAgICAgICAgICAgICh2b2lkKTsKKwordm9pZCBfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2V4aXQgKGludCBjb2RlKSBfREJVU19HTlVDX05PUkVUVVJOOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncyk7CisKKworLyoqCisgKiBQb3J0YWJsZSBzdHJ1Y3Qgd2l0aCBzdGF0KCkgcmVzdWx0cworICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBsb25nIG1vZGU7ICAvKio8IEZpbGUgbW9kZSAqLworICB1bnNpZ25lZCBsb25nIG5saW5rOyAvKio8IE51bWJlciBvZiBoYXJkIGxpbmtzICovCisgIGRidXNfdWlkX3QgICAgdWlkOyAgIC8qKjwgVXNlciBvd25pbmcgZmlsZSAqLworICBkYnVzX2dpZF90ICAgIGdpZDsgICAvKio8IEdyb3VwIG93bmluZyBmaWxlICovCisgIHVuc2lnbmVkIGxvbmcgc2l6ZTsgIC8qKjwgU2l6ZSBvZiBmaWxlICovCisgIHVuc2lnbmVkIGxvbmcgYXRpbWU7IC8qKjwgQWNjZXNzIHRpbWUgKi8KKyAgdW5zaWduZWQgbG9uZyBtdGltZTsgLyoqPCBNb2RpZnkgdGltZSAqLworICB1bnNpZ25lZCBsb25nIGN0aW1lOyAvKio8IENyZWF0aW9uIHRpbWUgKi8KK30gREJ1c1N0YXQ7CisKK2RidXNfYm9vbF90IF9kYnVzX3N0YXQgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0YXQgICAgICAgICAqc3RhdGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3NvY2tldHBhaXIgKERCdXNTb2NrZXQgICAgICAgKmZkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgICAgKmZkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGJsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCit2b2lkICAgICAgICBfZGJ1c19wcmludF9iYWNrdHJhY2UgICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfYmVjb21lX2RhZW1vbiAgIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGtlZXBfdW1hc2spOworCitkYnVzX2Jvb2xfdCBfZGJ1c192ZXJpZnlfZGFlbW9uX3VzZXIgICAgKGNvbnN0IGNoYXIgKnVzZXIpOworZGJ1c19ib29sX3QgX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2NvbW1hbmRfZm9yX3BpZCAodW5zaWduZWQgbG9uZyAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1heF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKTsKKworLyoqIEEgVU5JWCBzaWduYWwgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqIERCdXNTaWduYWxIYW5kbGVyKSAoaW50IHNpZyk7CisKK3ZvaWQgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChpbnQgICAgICAgICAgICAgICBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcik7CisKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJfYXRfY29uc29sZSAoY29uc3QgY2hhciAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKwordm9pZCBfZGJ1c19pbml0X3N5c3RlbV9sb2cgKGRidXNfYm9vbF90IGlzX2RhZW1vbik7CisKK3R5cGVkZWYgZW51bSB7CisgIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLAorICBEQlVTX1NZU1RFTV9MT0dfRkFUQUwKK30gREJ1c1N5c3RlbUxvZ1NldmVyaXR5OworCit2b2lkIF9kYnVzX3N5c3RlbV9sb2cgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgyLCAzKTsKK3ZvaWQgX2RidXNfc3lzdGVtX2xvZ3YgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpOworCisvKiBEZWZpbmUgREJVU19WQV9DT1BZKCkgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBjb3B5aW5nIHZhX2xpc3QgdmFyaWFibGVzLgorICogY29uZmlnLmggbWF5IGhhdmUgYWxyZWFkeSBkZWZpbmVkIERCVVNfVkFfQ09QWSBhcyB2YV9jb3B5IG9yIF9fdmFfY29weS4KKyAqLworI2lmICFkZWZpbmVkIChEQlVTX1ZBX0NPUFkpCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19QUENfXykgJiYgKGRlZmluZWQgKF9DQUxMX1NZU1YpIHx8IGRlZmluZWQgKF9XSU4zMikpCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgKCooYXAxKSA9ICooYXAyKSkKKyMgIGVsaWYgZGVmaW5lZCAoREJVU19WQV9DT1BZX0FTX0FSUkFZKQorIyAgICBkZWZpbmUgREJVU19WQV9DT1BZKGFwMSwgYXAyKSAgIG1lbWNweSAoKGFwMSksIChhcDIpLCBzaXplb2YgKHZhX2xpc3QpKQorIyAgZWxzZSAvKiB2YV9saXN0IGlzIGEgcG9pbnRlciAqLworIyAgICBkZWZpbmUgREJVU19WQV9DT1BZKGFwMSwgYXAyKSAgICgoYXAxKSA9IChhcDIpKQorIyAgZW5kaWYgLyogdmFfbGlzdCBpcyBhIHBvaW50ZXIgKi8KKyNlbmRpZiAvKiAhREJVU19WQV9DT1BZICovCisKKworLyoqCisgKiBDYXN0cyBhIHByaW1pdGl2ZSBDIHR5cGUgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGluZGV4ZXMKKyAqIGEgcGFydGljdWxhciBieXRlIG9mIHRoZSBhcnJheS4KKyAqLworI2RlZmluZSBfREJVU19CWVRFX09GX1BSSU1JVElWRShwLCBpKSBcCisgICAgKCgoY29uc3QgY2hhciopJihwKSlbKGkpXSkKKy8qKiBPbiB4ODYgdGhlcmUgaXMgYW4gODAtYml0IEZQVSwgYW5kIGlmIHlvdSBkbyAiYSA9PSBiIiBpdCBtYXkgaGF2ZSBhCisgKiBvciBiIGluIGFuIDgwLWJpdCByZWdpc3RlciwgdGh1cyBmYWlsaW5nIHRvIGNvbXBhcmUgdGhlIHR3byA2NC1iaXQKKyAqIGRvdWJsZXMgZm9yIGJpdHdpc2UgZXF1YWxpdHkuIFNvIHRoaXMgbWFjcm8gY29tcGFyZXMgdGhlIHR3byBkb3VibGVzCisgKiBiaXR3aXNlLgorICovCisjZGVmaW5lIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTChhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAwKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMCkgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDEpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAxKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgMikgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDIpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAzKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMykgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDQpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA0KSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNSkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDUpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCA2KSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgNikgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDcpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA3KSkKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICphZGRyZXNzLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworCisvKiogVHlwZSByZXByZXNlbnRpbmcgYSB1bml2ZXJzYWxseSB1bmlxdWUgSUQKKyAqIEB0b2RvIHJlbmFtZSB0byBVVUlEIGluc3RlYWQgb2YgR1VJRAorICovCit0eXBlZGVmIHVuaW9uIERCdXNHVUlEIERCdXNHVUlEOworCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAgIChEQnVzR1VJRCAgICAgICAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRocmVhZHMgYXMgaW4gZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpLCBhcHByb3ByaWF0ZWx5CisgKiBmb3IgdGhlIHBsYXRmb3JtLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdCBfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpOworCisvKioKKyAqIExvY2sgYSBzdGF0aWMgbXV0ZXggdXNlZCB0byBwcm90ZWN0IF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYygpLgorICovCit2b2lkIF9kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKKy8qKgorICogVW5kbyBfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMoKS4KKyAqLwordm9pZCBfZGJ1c190aHJlYWRzX3VubG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKERCdXNTdHJpbmcgKmRpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGlyX2xpc3QpOworCit1bnNpZ25lZCBsb25nIF9kYnVzX3BpZF9mb3JfbG9nICh2b2lkKTsKKworLyogRklYTUUgbW92ZSBiYWNrIHRvIGRidXMtc3lzZGVwcy11bml4LmggcHJvYmFibHkgLQorICogdGhlIFBJRCBmaWxlIGhhbmRsaW5nIGp1c3QgbmVlZHMgYSBsaXR0bGUgbW9yZSBhYnN0cmFjdGlvbgorICogaW4gdGhlIGJ1cyBkYWVtb24gZmlyc3QuCisgKi8KK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfcGlkX3QgICAgX2RidXNfZ2V0cGlkICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aWRfdCAgICBfZGJ1c19nZXR1aWQgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19mbHVzaF9jYWNoZXMgKHZvaWQpOworCisvKgorICogcmVwbGFjZXMgdGhlIHRlcm0gREJVU19QUkVGSVggaW4gY29uZmlndXJlX3RpbWVfcGF0aCBieSB0aGUKKyAqIGN1cnJlbnQgZGJ1cyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBPbiB1bml4IHRoaXMgZnVuY3Rpb24gaXMgYSBub29wCisgKgorICogQHBhcmFtIGNvbmZpZ3VyZV90aW1lX3BhdGgKKyAqIEByZXR1cm4gcmVhbCBwYXRoCisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoY29uc3QgY2hhciAqY29uZmlndXJlX3RpbWVfcGF0aCk7CisKKy8qIERvIG5vdCBzZXQgdGhpcyB0b28gaGlnaDogaXQgaXMgYSBkZW5pYWwtb2Ytc2VydmljZSByaXNrLgorICogU2VlIDxodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD04MjgyMD4KKyAqCisgKiAoVGhpcyBuZWVkcyB0byBiZSBpbiB0aGUgbm9uLVVuaXgtc3BlY2lmaWMgaGVhZGVyIHNvIHRoYXQKKyAqIHRoZSBjb25maWctcGFyc2VyIGNhbiB1c2UgaXQuKQorICovCisjZGVmaW5lIERCVVNfREVGQVVMVF9NRVNTQUdFX1VOSVhfRkRTIDE2CisKK3R5cGVkZWYgc3RydWN0IERCdXNSTGltaXQgREJ1c1JMaW1pdDsKKworREJ1c1JMaW1pdCAgICAgKl9kYnVzX3JsaW1pdF9zYXZlX2ZkX2xpbWl0ICAgICAgICAgICAgICAgICAoREJ1c0Vycm9yICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgX2RidXNfcmxpbWl0X3JhaXNlX2ZkX2xpbWl0X2lmX3ByaXZpbGVnZWQgICh1bnNpZ25lZCBpbnQgIGRlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICBfZGJ1c19ybGltaXRfcmVzdG9yZV9mZF9saW1pdCAgICAgICAgICAgICAgKERCdXNSTGltaXQgICAqc2F2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICBfZGJ1c19ybGltaXRfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNSTGltaXQgICAqbGltKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKworI2lmZGVmIERCVVNfV0lOCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX1NZU0RFUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRlc3QtbWFpbi5jIGIvZGJ1cy9kYnVzLXRlc3QtbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTQwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGVzdC1tYWluLmMKQEAgLTAsMCArMSw2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuYyAgUHJvZ3JhbSB0byBydW4gYWxsIHRlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy10eXBlcy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1VOSVgKKyMgaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcjsKKyAgY29uc3QgY2hhciAqc3BlY2lmaWNfdGVzdDsKKworI2lmZGVmIERCVVNfVU5JWAorICAvKiBjbG9zZSBhbnkgaW5oZXJpdGVkIGZkcyBzbyBkYnVzLXNwYXduJ3MgY2hlY2sgZm9yIGNsb3NlLW9uLWV4ZWMgd29ya3MgKi8KKyAgX2RidXNfY2xvc2VfYWxsICgpOworI2VuZGlmCisKKyNpZiBIQVZFX1NFVExPQ0FMRQorICBzZXRsb2NhbGUoTENfQUxMLCAiIik7CisjZW5kaWYKKyAgCisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItLXRhcCIpICE9IDApCisgICAgdGVzdF9kYXRhX2RpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICB0ZXN0X2RhdGFfZGlyID0gTlVMTDsKKworICBpZiAoYXJnYyA+IDIpCisgICAgc3BlY2lmaWNfdGVzdCA9IGFyZ3ZbMl07CisgIGVsc2UKKyAgICBzcGVjaWZpY190ZXN0ID0gTlVMTDsKKyAgCisgIGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMgKHRlc3RfZGF0YV9kaXIsIHNwZWNpZmljX3Rlc3QpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGVzdC5jIGIvZGJ1cy9kYnVzLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTkwZDZlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRlc3QuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuYyAgUHJvZ3JhbSB0byBydW4gYWxsIHRlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICpmYWlsdXJlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVbml0IHRlc3QgZmFpbGVkOiAlc1xuIiwgZmFpbHVyZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbWVtbGVha3MgKHZvaWQpCit7CisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgcHJpbnRmICgiJXM6IGNoZWNraW5nIGZvciBtZW1sZWFrc1xuIiwgInRlc3QtZGJ1cyIpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkpOworICAgICAgZGllICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCpUZXN0RnVuYykodm9pZCk7Cit0eXBlZGVmIGRidXNfYm9vbF90ICgqVGVzdERhdGFGdW5jKShjb25zdCBjaGFyICpkYXRhKTsKKworc3RhdGljIHZvaWQKK3J1bl90ZXN0IChjb25zdCBjaGFyICAgICAgICAgICAgICp0ZXN0X25hbWUsCisJICBjb25zdCBjaGFyICAgICAgICAgICAgICpzcGVjaWZpY190ZXN0LAorCSAgVGVzdEZ1bmMgICAgICAgICAgICAgICAgdGVzdCkKK3sKKyAgaWYgKCFzcGVjaWZpY190ZXN0IHx8IHN0cmNtcCAoc3BlY2lmaWNfdGVzdCwgdGVzdF9uYW1lKSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzOiBydW5uaW5nICVzIHRlc3RzXG4iLCAidGVzdC1kYnVzIiwgdGVzdF9uYW1lKTsKKyAgICAgIGlmICghdGVzdCAoKSkKKwlkaWUgKHRlc3RfbmFtZSk7CisKKyAgICAgIGNoZWNrX21lbWxlYWtzICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3J1bl9kYXRhX3Rlc3QgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKnRlc3RfbmFtZSwKKwkgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAqc3BlY2lmaWNfdGVzdCwKKwkgICAgICAgVGVzdERhdGFGdW5jICAgICAgICAgICAgdGVzdCwKKwkgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAqdGVzdF9kYXRhX2RpcikKK3sKKyAgaWYgKCFzcGVjaWZpY190ZXN0IHx8IHN0cmNtcCAoc3BlY2lmaWNfdGVzdCwgdGVzdF9uYW1lKSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzOiBydW5uaW5nICVzIHRlc3RzXG4iLCAidGVzdC1kYnVzIiwgdGVzdF9uYW1lKTsKKyAgICAgIGlmICghdGVzdCAodGVzdF9kYXRhX2RpcikpCisJZGllICh0ZXN0X25hbWUpOworCisgICAgICBjaGVja19tZW1sZWFrcyAoKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisvKioKKyAqIEFuIGV4cG9ydGVkIHN5bWJvbCB0byBiZSBydW4gaW4gb3JkZXIgdG8gZXhlY3V0ZQorICogdW5pdCB0ZXN0cy4gU2hvdWxkIG5vdCBiZSB1c2VkIGJ5CisgKiBhbnkgYXBwIG90aGVyIHRoYW4gb3VyIHRlc3QgYXBwLCB0aGlzIHN5bWJvbAorICogd29uJ3QgZXhpc3QgaW4gc29tZSBidWlsZHMgb2YgdGhlIGxpYnJhcnkuCisgKiAod2l0aCAtLWVuYWJsZS10ZXN0cz1ubykKKyAqCisgKiBAcGFyYW0gdGVzdF9kYXRhX2RpciB0aGUgZGlyZWN0b3J5IHdpdGggdGVzdCBkYXRhICh0ZXN0L2RhdGEgbm9ybWFsbHkpCisgKiBAcGFyYW0gc3BlY2lmaWNfdGVzdCBydW4gc3BlY2lmaWMgdGVzdCBvciAjTlVMTCB0byBydW4gYWxsIHRlc3RzCisgKi8KK3ZvaWQKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIsIGNvbnN0IGNoYXIgKnNwZWNpZmljX3Rlc3QpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKCFfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKCkpCisgICAgZGllICgiZGVidWcgdGhyZWFkcyBpbml0Iik7CisgIAorICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHRlc3RfZGF0YV9kaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmICh0ZXN0X2RhdGFfZGlyICE9IE5VTEwpCisgICAgcHJpbnRmICgiVGVzdCBkYXRhIGluICVzXG4iLCB0ZXN0X2RhdGFfZGlyKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YSFcbiIpOworCisgIHJ1bl90ZXN0ICgic3RyaW5nIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3RyaW5nX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJzeXNkZXBzIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3lzZGVwc190ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgiZGF0YS1zbG90Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfZGF0YV9zbG90X3Rlc3QpOworCisgIHJ1bl90ZXN0ICgibWlzYyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21pc2NfdGVzdCk7CisgIAorICBydW5fdGVzdCAoImFkZHJlc3MiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19hZGRyZXNzX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgic2VydmVyIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc2VydmVyX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgib2JqZWN0LXRyZWUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19vYmplY3RfdHJlZV90ZXN0KTsKKworICBydW5fdGVzdCAoInNpZ25hdHVyZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3NpZ25hdHVyZV90ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgibWFyc2hhbGxpbmciLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgibWFyc2hhbC1yZWN1cnNpdmUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3JlY3Vyc2l2ZV90ZXN0KTsKKworICBydW5fdGVzdCAoImJ5dGVzd2FwIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWFyc2hhbF9ieXRlc3dhcF90ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgibWVtb3J5Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVtb3J5X3Rlc3QpOworCisjaWYgMQorICBydW5fdGVzdCAoIm1lbS1wb29sIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVtX3Bvb2xfdGVzdCk7CisjZW5kaWYKKyAgCisgIHJ1bl90ZXN0ICgibGlzdCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2xpc3RfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJtYXJzaGFsLXZhbGlkYXRlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0KTsKKworICBydW5fZGF0YV90ZXN0ICgibWVzc2FnZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21lc3NhZ2VfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisgIAorICBydW5fdGVzdCAoImhhc2giLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19oYXNoX3Rlc3QpOworCisjaWYgIWRlZmluZWQoREJVU19XSU5DRSkKKyAgcnVuX2RhdGFfdGVzdCAoInNwYXduIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc3Bhd25fdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisjZW5kaWYKKyAgCisgIHJ1bl9kYXRhX3Rlc3QgKCJjcmVkZW50aWFscyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2NyZWRlbnRpYWxzX3Rlc3QsIHRlc3RfZGF0YV9kaXIpOworCisjaWZkZWYgREJVU19VTklYCisgIHJ1bl9kYXRhX3Rlc3QgKCJ1c2VyZGIiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c191c2VyZGJfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyAgcnVuX3Rlc3QgKCJ0cmFuc3BvcnQtdW5peCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3RyYW5zcG9ydF91bml4X3Rlc3QpOworI2VuZGlmCisgIAorICBydW5fdGVzdCAoImtleXJpbmciLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19rZXlyaW5nX3Rlc3QpOworCisgIHJ1bl9kYXRhX3Rlc3QgKCJzaGEiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zaGFfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisgIAorICBydW5fZGF0YV90ZXN0ICgiYXV0aCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2F1dGhfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyAgcHJpbnRmICgiJXM6IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIsICJ0ZXN0LWRidXMiKTsKKyNlbHNlCisgIHByaW50ZiAoIk5vdCBjb21waWxlZCB3aXRoIHVuaXQgdGVzdHMsIG5vdCBydW5uaW5nIGFueVxuIik7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRlc3QuaCBiL2RidXMvZGJ1cy10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4NzZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10ZXN0LmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10ZXN0LmggIERlY2xhcmF0aW9ucyBvZiB0ZXN0IGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfVEVTVF9ICisjZGVmaW5lIERCVVNfVEVTVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKworLyogT25seSB0aGluZ3MgdGhhdCBhcmUgaW4gbGliZGJ1cy0xLmxhIGFuZCB1c2VkIGZyb20gbGliZGJ1cy1pbnRlcm5hbC5sYQorICogbmVlZCB0byBoYXZlIERCVVNfUFJJVkFURV9FWFBPUlQuIElmIHlvdSBnZXQKKyAqCisgKiB3YXJuaW5nOiAnZm9vJyByZWRlY2xhcmVkIHdpdGhvdXQgZGxsaW1wb3J0IGF0dHJpYnV0ZTogcHJldmlvdXMKKyAqIGRsbGltcG9ydCBpZ25vcmVkIFstV2F0dHJpYnV0ZXNdCisgKgorICogdGhlbiB5b3UgaGF2ZSBhZGRlZCB0b28gbWFueS4KKyAqLworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19oYXNoX3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbGlzdF90ZXN0ICAgICAgICAgICAgICAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfdGVzdCAgICAgICAgICAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19tYXJzaGFsX3JlY3Vyc2l2ZV90ZXN0ICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfYnl0ZXN3YXBfdGVzdCAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0ICAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX21pc2NfdGVzdCAgICAgICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19zaWduYXR1cmVfdGVzdCAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbWVtX3Bvb2xfdGVzdCAgICAgICAgICAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ190ZXN0ICAgICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19hZGRyZXNzX3Rlc3QgICAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX3Rlc3QgICAgICAgICAgICAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX21lc3NhZ2VfdGVzdCAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgX2RidXNfYXV0aF90ZXN0ICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3NoYV90ZXN0ICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19rZXlyaW5nX3Rlc3QgICAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZGF0YV9zbG90X3Rlc3QgICAgICAgICAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3N5c2RlcHNfdGVzdCAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfc3Bhd25fdGVzdCAgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJkYl90ZXN0ICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190cmFuc3BvcnRfdW5peF90ZXN0ICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbWVtb3J5X3Rlc3QgICAgICAgICAgICAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX29iamVjdF90cmVlX3Rlc3QgICAgICAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19jcmVkZW50aWFsc190ZXN0ICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKKwordm9pZCAgICAgICAgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICp0ZXN0X2RhdGFfZGlyLAorCQkJCQkJCWNvbnN0IGNoYXIgICAgICAgICAgKnNwZWNpZmljX3Rlc3QpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2ZpbGUgIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgIChjb25zdCBEQnVzU3RyaW5nICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSk7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhKTsKKworCisvKiByZXR1cm5zIEZBTFNFIG9uIGZhdGFsIGZhaWx1cmUgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0ZvcmVhY2hNZXNzYWdlRmlsZUZ1bmMpIChjb25zdCBEQnVzU3RyaW5nICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhKTsKKworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2ZvcmVhY2hfbWVzc2FnZV9maWxlIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqdGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hNZXNzYWdlRmlsZUZ1bmMgIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAgICAoaW50ICAgICAgICAgICBzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpib2R5KTsKKworCisjZW5kaWYgLyogREJVU19URVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmggYi9kYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmFjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aHJlYWRzLWludGVybmFsLmggIEQtQnVzIHRocmVhZCBwcmltaXRpdmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1RocmVhZHNJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBBIG11dGV4IHdoaWNoIGlzIHJlY3Vyc2l2ZSBpZiBwb3NzaWJsZSwgZWxzZSBub24tcmVjdXJzaXZlLgorICogVGhpcyBpcyB0eXBpY2FsbHkgcmVjdXJzaXZlLCBidXQgdGhhdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNSTXV0ZXggREJ1c1JNdXRleDsKKworLyoqCisgKiBBIG11dGV4IHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBjb25kaXRpb24gdmFyaWFibGVzLgorICogVGhpcyBpcyB0eXBpY2FsbHkgbm9uLXJlY3Vyc2l2ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NNdXRleCBEQnVzQ011dGV4OworCisvKiogQH0gKi8KKworREJVU19CRUdJTl9ERUNMUworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgX2RidXNfcm11dGV4X2xvY2sgICAgICAgICAgICAgICAoREJ1c1JNdXRleCAgICAgICAqbXV0ZXgpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3JtdXRleF91bmxvY2sgICAgICAgICAgICAgKERCdXNSTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19ybXV0ZXhfbmV3X2F0X2xvY2F0aW9uICAgIChEQnVzUk11dGV4ICAgICAgKipsb2NhdGlvbl9wKTsKK3ZvaWQgICAgICAgICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAgIChEQnVzUk11dGV4ICAgICAgKipsb2NhdGlvbl9wKTsKKwordm9pZCAgICAgICAgIF9kYnVzX2NtdXRleF9sb2NrICAgICAgICAgICAgICAgKERCdXNDTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19jbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIChEQnVzQ011dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfY211dGV4X25ld19hdF9sb2NhdGlvbiAgICAoREJ1c0NNdXRleCAgICAgICoqbG9jYXRpb25fcCk7Cit2b2lkICAgICAgICAgX2RidXNfY211dGV4X2ZyZWVfYXRfbG9jYXRpb24gICAoREJ1c0NNdXRleCAgICAgICoqbG9jYXRpb25fcCk7CisKK0RCdXNDb25kVmFyKiBfZGJ1c19jb25kdmFyX25ldyAgICAgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX2ZyZWUgICAgICAgICAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl93YWl0ICAgICAgICAgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgKm11dGV4KTsKK2RidXNfYm9vbF90ICBfZGJ1c19jb25kdmFyX3dhaXRfdGltZW91dCAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX3dha2Vfb25lICAgICAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24gICAoREJ1c0NvbmRWYXIgICAgICAqKmxvY2F0aW9uX3ApOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAgKERCdXNDb25kVmFyICAgICAgKipsb2NhdGlvbl9wKTsKKworLyogUHJpdmF0ZSB0byB0aHJlYWRpbmcgaW1wbGVtZW50YXRpb25zIGFuZCBkYnVzLXRocmVhZHMuYyAqLworCitEQnVzUk11dGV4ICAqX2RidXNfcGxhdGZvcm1fcm11dGV4X25ldyAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgICAgICAoREJ1c1JNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9sb2NrICAgICAgKERCdXNSTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfdW5sb2NrICAgIChEQnVzUk11dGV4ICAgICAgICptdXRleCk7CisKK0RCdXNDTXV0ZXggICpfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbmV3ICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAgICAgIChEQnVzQ011dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY211dGV4X2xvY2sgICAgICAoREJ1c0NNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgICAgKERCdXNDTXV0ZXggICAgICAgKm11dGV4KTsKKworREJ1c0NvbmRWYXIqIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfbmV3ICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfZnJlZSAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kKTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAqbXV0ZXgpOworZGJ1c19ib29sX3QgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICAgICAgICpjb25kKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVEhSRUFEU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGhyZWFkcy5jIGIvZGJ1cy9kYnVzLXRocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRocmVhZHMuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRocmVhZHMuaCAgRC1CdXMgdGhyZWFkcyBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCitzdGF0aWMgaW50IHRocmVhZF9pbml0X2dlbmVyYXRpb24gPSAwOworCisvKioKKyAqIEBkZWZncm91cCBEQnVzVGhyZWFkc0ludGVybmFscyBUaHJlYWQgZnVuY3Rpb25zCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIF9kYnVzX3JtdXRleF9sb2NrKCksIGV0Yy4KKyAqCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRocmVhZHMgYW5kIHRocmVhZCBsb2Nrcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtdXRleAorICogb3IgY3JlYXRlcyBhIG5vLW9wIG11dGV4IGlmIHRocmVhZHMgYXJlIG5vdCBpbml0aWFsaXplZC4KKyAqIE1heSByZXR1cm4gI05VTEwgZXZlbiBpZiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgaW5kaWNhdGluZworICogb3V0LW9mLW1lbW9yeS4KKyAqCisgKiBJZiBwb3NzaWJsZSwgdGhlIG11dGV4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLCB0bworICogYXZvaWQgZGVhZGxvY2tzLiBIb3dldmVyLCB0aGF0IGNhbm5vdCBiZSByZWxpZWQgb24uCisgKgorICogQHBhcmFtIGxvY2F0aW9uX3AgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgbXV0ZXgsIGNhbiByZXR1cm4gI05VTEwgb24gT09NCisgKi8KK3ZvaWQKK19kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gKERCdXNSTXV0ZXggKipsb2NhdGlvbl9wKQoreworICBfZGJ1c19hc3NlcnQgKGxvY2F0aW9uX3AgIT0gTlVMTCk7CisKKyAgaWYgKCFkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICgpKQorICAgIHsKKyAgICAgICpsb2NhdGlvbl9wID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKmxvY2F0aW9uX3AgPSBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICgpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbXV0ZXgKKyAqIG9yIGNyZWF0ZXMgYSBuby1vcCBtdXRleCBpZiB0aHJlYWRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgKiBNYXkgcmV0dXJuICNOVUxMIGV2ZW4gaWYgdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIGluZGljYXRpbmcKKyAqIG91dC1vZi1tZW1vcnkuCisgKgorICogVGhlIHJldHVybmVkIG11dGV4IGlzIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBjb25kaXRpb24gdmFyaWFibGVzLgorICoKKyAqIEBwYXJhbSBsb2NhdGlvbl9wIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IG11dGV4LCBjYW4gcmV0dXJuICNOVUxMIG9uIE9PTQorICovCit2b2lkCitfZGJ1c19jbXV0ZXhfbmV3X2F0X2xvY2F0aW9uIChEQnVzQ011dGV4ICoqbG9jYXRpb25fcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2NhdGlvbl9wICE9IE5VTEwpOworCisgIGlmICghZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAoKSkKKyAgICB7CisgICAgICAqbG9jYXRpb25fcCA9IE5VTEw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICpsb2NhdGlvbl9wID0gX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAoKTsKK30KKworLyoqCisgKiBGcmVlcyBhIERCdXNSTXV0ZXg7IGRvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoREJ1c1JNdXRleCAqKmxvY2F0aW9uX3ApCit7CisgIGlmIChsb2NhdGlvbl9wID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICgqbG9jYXRpb25fcCAhPSBOVUxMKQorICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlICgqbG9jYXRpb25fcCk7Cit9CisKKy8qKgorICogRnJlZXMgYSBEQnVzQ011dGV4OyBkb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfY211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKERCdXNDTXV0ZXggKipsb2NhdGlvbl9wKQoreworICBpZiAobG9jYXRpb25fcCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoKmxvY2F0aW9uX3AgIT0gTlVMTCkKKyAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoKmxvY2F0aW9uX3ApOworfQorCisvKioKKyAqIExvY2tzIGEgbXV0ZXguIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICogTG9ja3MgbWF5IGJlIHJlY3Vyc2l2ZSBpZiB0aHJlYWRpbmcgaW1wbGVtZW50YXRpb24gaW5pdGlhbGl6ZWQKKyAqIHJlY3Vyc2l2ZSBsb2Nrcy4KKyAqLwordm9pZAorX2RidXNfcm11dGV4X2xvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2xvY2sgKG11dGV4KTsKK30KKworLyoqCisgKiBMb2NrcyBhIG11dGV4LiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqIExvY2tzIG1heSBiZSByZWN1cnNpdmUgaWYgdGhyZWFkaW5nIGltcGxlbWVudGF0aW9uIGluaXRpYWxpemVkCisgKiByZWN1cnNpdmUgbG9ja3MuCisgKi8KK3ZvaWQKK19kYnVzX2NtdXRleF9sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgaWYgKG11dGV4ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChtdXRleCk7Cit9CisKKy8qKgorICogVW5sb2NrcyBhIG11dGV4LiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK3ZvaWQKK19kYnVzX3JtdXRleF91bmxvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X3VubG9jayAobXV0ZXgpOworfQorCisvKioKKyAqIFVubG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCit2b2lkCitfZGJ1c19jbXV0ZXhfdW5sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgaWYgKG11dGV4ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgKG11dGV4KTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNvbmRpdGlvbiB2YXJpYWJsZSB1c2luZyB0aGUgZnVuY3Rpb24gc3VwcGxpZWQKKyAqIHRvIGRidXNfdGhyZWFkc19pbml0KCksIG9yIGNyZWF0ZXMgYSBuby1vcCBjb25kaXRpb24gdmFyaWFibGUKKyAqIGlmIHRocmVhZHMgYXJlIG5vdCBpbml0aWFsaXplZC4gTWF5IHJldHVybiAjTlVMTCBldmVuIGlmCisgKiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgaW5kaWNhdGluZyBvdXQtb2YtbWVtb3J5LgorICoKKyAqIEByZXR1cm5zIG5ldyBtdXRleCBvciAjTlVMTAorICovCitEQnVzQ29uZFZhciAqCitfZGJ1c19jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgaWYgKCFkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICgpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAoKTsKK30KKworCisvKioKKyAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBfZGJ1c19jb25kdmFyX25ldy4gIEl0IGhvd2V2ZXIKKyAqIGdpdmVzIGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYnkgYWxsb2NhdGluZyBhIHBvaW50ZXIKKyAqIHRvIHBvaW50IHRvIHRoZSBjb25kdmFyIGxvY2F0aW9uOyB0aGlzIHVzZWQgdG8gYmUgdXNlZnVsLgorICoKKyAqIEByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiBhIG5ldyBjb25kdmFyIG9yICNOVUxMIG9uIE9PTQorICovCisKK3ZvaWQgCitfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAoREJ1c0NvbmRWYXIgKipsb2NhdGlvbl9wKQoreworICBfZGJ1c19hc3NlcnQgKGxvY2F0aW9uX3AgIT0gTlVMTCk7CisKKyAgKmxvY2F0aW9uX3AgPSBfZGJ1c19jb25kdmFyX25ldygpOworfQorCisKKy8qKgorICogRnJlZXMgYSBjb25kaXRpb25hbCB2YXJpYWJsZSBjcmVhdGVkIHdpdGggZGJ1c19jb25kdmFyX25ldygpOyBkb2VzCisgKiBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfZnJlZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIGlmIChjb25kID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfZnJlZSAoY29uZCk7Cit9CisKKy8qKgorICogRnJlZXMgYSBjb25kaXRpb24gdmFyaWFibGU7IGRvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKERCdXNDb25kVmFyICoqbG9jYXRpb25fcCkKK3sKKyAgaWYgKGxvY2F0aW9uX3AgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpsb2NhdGlvbl9wICE9IE5VTEwpCisgICAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl9mcmVlICgqbG9jYXRpb25fcCk7Cit9CisKKy8qKgorICogQXRvbWljYWxseSB1bmxvY2tzIHRoZSBtdXRleCBhbmQgd2FpdHMgZm9yIHRoZSBjb25kaXRpb25zCisgKiB2YXJpYWJsZSB0byBiZSBzaWduYWxsZWQuIExvY2tzIHRoZSBtdXRleCBhZ2FpbiBiZWZvcmUKKyAqIHJldHVybmluZy4KKyAqIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIGlmIChjb25kID09IE5VTEwgfHwgbXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0IChjb25kLCBtdXRleCk7Cit9CisKKy8qKgorICogQXRvbWljYWxseSB1bmxvY2tzIHRoZSBtdXRleCBhbmQgd2FpdHMgZm9yIHRoZSBjb25kaXRpb25zIHZhcmlhYmxlCisgKiB0byBiZSBzaWduYWxsZWQsIG9yIGZvciBhIHRpbWVvdXQuIExvY2tzIHRoZSBtdXRleCBhZ2FpbiBiZWZvcmUKKyAqIHJldHVybmluZy4gIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLiAgUmV0dXJuIHZhbHVlCisgKiBpcyAjRkFMU0UgaWYgd2UgdGltZWQgb3V0LCAjVFJVRSBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIGNvbmQgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICogQHBhcmFtIG11dGV4IHRoZSBtdXRleAorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdAorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSB0aW1lb3V0IG9jY3VycmVkLCAjVFJVRSBpZiBub3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICAgICAgICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBpZiAoY29uZCA9PSBOVUxMIHx8IG11dGV4ID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChjb25kLCBtdXRleCwKKyAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK30KKworLyoqCisgKiBJZiB0aGVyZSBhcmUgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIHdha2UKKyAqIHVwIGV4YWN0bHkgb25lLiAKKyAqIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX3dha2Vfb25lIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgaWYgKGNvbmQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoY29uZCk7Cit9CisKK3N0YXRpYyBEQnVzUk11dGV4ICpnbG9iYWxfbG9ja3NbX0RCVVNfTl9HTE9CQUxfTE9DS1NdID0geyBOVUxMIH07CisKK3N0YXRpYyB2b2lkCitzaHV0ZG93bl9nbG9iYWxfbG9ja3MgKHZvaWQgKm5pbCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9EQlVTX05fR0xPQkFMX0xPQ0tTOyBpKyspCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChnbG9iYWxfbG9ja3NbaV0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfZnJlZSAoZ2xvYmFsX2xvY2tzW2ldKTsKKyAgICAgIGdsb2JhbF9sb2Nrc1tpXSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfZ2xvYmFsX2xvY2tzICh2b2lkKQoreworICBpbnQgaTsKKyAgZGJ1c19ib29sX3Qgb2s7CisKKyAgZm9yIChpID0gMDsgaSA8IF9EQlVTX05fR0xPQkFMX0xPQ0tTOyBpKyspCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChnbG9iYWxfbG9ja3NbaV0gPT0gTlVMTCk7CisKKyAgICAgIGdsb2JhbF9sb2Nrc1tpXSA9IF9kYnVzX3BsYXRmb3JtX3JtdXRleF9uZXcgKCk7CisKKyAgICAgIGlmIChnbG9iYWxfbG9ja3NbaV0gPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9sb2NrIChnbG9iYWxfbG9ja3NbX0RCVVNfTE9DS19zaHV0ZG93bl9mdW5jc10pOworICBvayA9IF9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmNfdW5sb2NrZWQgKHNodXRkb3duX2dsb2JhbF9sb2NrcywgTlVMTCk7CisgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKGdsb2JhbF9sb2Nrc1tfREJVU19MT0NLX3NodXRkb3duX2Z1bmNzXSk7CisKKyAgaWYgKCFvaykKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlIChnbG9iYWxfbG9ja3NbaV0pOworICAgICAgZ2xvYmFsX2xvY2tzW2ldID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9jayAoREJ1c0dsb2JhbExvY2sgbG9jaykKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2NrID49IDApOworICBfZGJ1c19hc3NlcnQgKGxvY2sgPCBfREJVU19OX0dMT0JBTF9MT0NLUyk7CisKKyAgaWYgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gIT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uICYmCisgICAgICAhZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2xvY2sgKGdsb2JhbF9sb2Nrc1tsb2NrXSk7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c191bmxvY2sgKERCdXNHbG9iYWxMb2NrIGxvY2spCit7CisgIF9kYnVzX2Fzc2VydCAobG9jayA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsb2NrIDwgX0RCVVNfTl9HTE9CQUxfTE9DS1MpOworCisgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKGdsb2JhbF9sb2Nrc1tsb2NrXSk7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaHJlYWRzIFRocmVhZCBmdW5jdGlvbnMKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgZGJ1c190aHJlYWRzX2luaXQoKSBhbmQgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpCisgKgorICogRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aHJlYWRzIGFuZCB0aHJlYWQgbG9ja3MuCisgKgorICogSWYgdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIHRoZSBELUJ1cyBsaWJyYXJ5IGhhcyBsb2NrcyBvbiBhbGwKKyAqIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiwgZWFjaCAjREJ1c0Nvbm5lY3Rpb24gaGFzIGEKKyAqIGxvY2ssIHNvIG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIHRvdWNoIHRoZSBjb25uZWN0aW9uLiAgKFNlZQorICogQHJlZiBEQnVzQ29ubmVjdGlvbiBmb3IgbW9yZSBvbiBjb25uZWN0aW9uIGxvY2tpbmcuKQorICoKKyAqIE1vc3Qgb3RoZXIgb2JqZWN0cywgaG93ZXZlciwgZG8gbm90IGhhdmUgbG9ja3MgLSB0aGV5IGNhbiBvbmx5IGJlCisgKiB1c2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZSwgdW5sZXNzIHlvdSBsb2NrIHRoZW0geW91cnNlbGYuCisgKiBGb3IgZXhhbXBsZSwgYSAjREJ1c01lc3NhZ2UgY2FuJ3QgYmUgbW9kaWZpZWQgZnJvbSB0d28gdGhyZWFkcworICogYXQgb25jZS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIHRocmVhZHMsIGxpa2UgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpLgorICogVGhpcyB2ZXJzaW9uIHByZXZpb3VzbHkgYWxsb3dlZCB1c2VyLXNwZWNpZmllZCB0aHJlYWRpbmcKKyAqIHByaW1pdGl2ZXMsIGJ1dCBzaW5jZSBELUJ1cyAxLjYgaXQgaWdub3JlcyB0aGVtIGFuZCBiZWhhdmVzCisgKiBleGFjdGx5IGxpa2UgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpLgorICoKKyAqIEBwYXJhbSBmdW5jdGlvbnMgaWdub3JlZCwgZm9ybWVybHkgZnVuY3Rpb25zIGZvciB1c2luZyB0aHJlYWRzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3RocmVhZHNfaW5pdCAoY29uc3QgREJ1c1RocmVhZEZ1bmN0aW9ucyAqZnVuY3Rpb25zKQoreworICBfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKCk7CisKKyAgaWYgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgIHsKKyAgICAgIF9kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICgpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfdGhyZWFkc19pbml0X3BsYXRmb3JtX3NwZWNpZmljKCkgfHwKKyAgICAgICFpbml0X2dsb2JhbF9sb2NrcyAoKSkKKyAgICB7CisgICAgICBfZGJ1c190aHJlYWRzX3VubG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbjsKKworICBfZGJ1c190aHJlYWRzX3VubG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworCisvKiBEZWZhdWx0IHRocmVhZCBpbXBsZW1lbmF0aW9uICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhyZWFkcy4gSWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLCB0aGUgRC1CdXMKKyAqIGxpYnJhcnkgd2lsbCBub3QgbG9jayBhbnkgZGF0YSBzdHJ1Y3R1cmVzLiAgSWYgaXQgaXMgY2FsbGVkLCBELUJ1cworICogd2lsbCBkbyBsb2NraW5nLCBhdCBzb21lIGNvc3QgaW4gZWZmaWNpZW5jeS4KKyAqCisgKiBTaW5jZSBELUJ1cyAxLjcgaXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgdGhyZWFkLAorICogYW55IG51bWJlciBvZiB0aW1lcyAoYnV0IGl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIKKyAqIGxpYmRidXMgQVBJIGlzIHVzZWQpLgorICoKKyAqIEluIEQtQnVzIDEuNiBvciBvbGRlciwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgbWFpbiB0aHJlYWQKKyAqIGJlZm9yZSBhbnkgb3RoZXIgdGhyZWFkIHN0YXJ0cy4gQXMgYSByZXN1bHQsIGl0IGlzIG5vdCBzdWZmaWNpZW50IHRvCisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IG9yIHBsdWdpbiwgdW5sZXNzIHRoZSBsaWJyYXJ5IG9yIHBsdWdpbgorICogaW1wb3NlcyBhIHNpbWlsYXIgcmVxdWlyZW1lbnQgb24gaXRzIGNhbGxlcnMuCisgKgorICogZGJ1c19zaHV0ZG93bigpIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHRoaXMgZnVuY3Rpb24gd2hlbiBpdAorICogcmVzZXRzIGFsbCBnbG9iYWwgc3RhdGUgaW4gbGliZGJ1cy4KKyAqIAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICh2b2lkKQoreworICByZXR1cm4gZGJ1c190aHJlYWRzX2luaXQgKE5VTEwpOworfQorCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworZGJ1c19ib29sX3QKK19kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAodm9pZCkKK3sKKyAgcmV0dXJuIGRidXNfdGhyZWFkc19pbml0IChOVUxMKTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGhyZWFkcy5oIGIvZGJ1cy9kYnVzLXRocmVhZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI4YTBiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRocmVhZHMuaApAQCAtMCwwICsxLDE4OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRocmVhZHMuaCAgRC1CdXMgdGhyZWFkcyBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1RIUkVBRFNfSAorI2RlZmluZSBEQlVTX1RIUkVBRFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1RocmVhZHMKKyAqIEB7CisgKi8KKworLyoqIEFuIG9wYXF1ZSBtdXRleCB0eXBlIHByb3ZpZGVkIGJ5IHRoZSAjREJ1c1RocmVhZEZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvbiBpbnN0YWxsZWQgYnkgZGJ1c190aHJlYWRzX2luaXQoKS4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNNdXRleCBEQnVzTXV0ZXg7CisvKiogQW4gb3BhcXVlIGNvbmRpdGlvbiB2YXJpYWJsZSB0eXBlIHByb3ZpZGVkIGJ5IHRoZSAjREJ1c1RocmVhZEZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvbiBpbnN0YWxsZWQgYnkgZGJ1c190aHJlYWRzX2luaXQoKS4gKi8KK3R5cGVkZWYgc3RydWN0IERCdXNDb25kVmFyIERCdXNDb25kVmFyOworCisvKiogRGVwcmVjYXRlZCwgcHJvdmlkZSBEQnVzUmVjdXJzaXZlTXV0ZXhOZXdGdW5jdGlvbiBpbnN0ZWFkLiAqLwordHlwZWRlZiBEQnVzTXV0ZXgqICAoKiBEQnVzTXV0ZXhOZXdGdW5jdGlvbikgICAgKHZvaWQpOworLyoqIERlcHJlY2F0ZWQsIHByb3ZpZGUgREJ1c1JlY3Vyc2l2ZU11dGV4RnJlZUZ1bmN0aW9uIGluc3RlYWQuICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNNdXRleEZyZWVGdW5jdGlvbikgICAoREJ1c011dGV4ICptdXRleCk7CisvKiogRGVwcmVjYXRlZCwgcHJvdmlkZSBEQnVzUmVjdXJzaXZlTXV0ZXhMb2NrRnVuY3Rpb24gaW5zdGVhZC4gUmV0dXJuIHZhbHVlIGlzIGxvY2sgc3VjY2VzcywgYnV0IGdldHMgaWdub3JlZCBpbiBwcmFjdGljZS4gKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c011dGV4TG9ja0Z1bmN0aW9uKSAgIChEQnVzTXV0ZXggKm11dGV4KTsKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleFVubG9ja0Z1bmN0aW9uIGluc3RlYWQuIFJldHVybiB2YWx1ZSBpcyB1bmxvY2sgc3VjY2VzcywgYnV0IGdldHMgaWdub3JlZCBpbiBwcmFjdGljZS4gKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c011dGV4VW5sb2NrRnVuY3Rpb24pIChEQnVzTXV0ZXggKm11dGV4KTsKKworLyoqIENyZWF0ZXMgYSBuZXcgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXgsIG9yIHJldHVybnMgI05VTEwgaWYgbm90CisgKiBlbm91Z2ggbWVtb3J5LiAgQ2FuIG9ubHkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuICBGb3VuZCBpbgorICogI0RCdXNUaHJlYWRGdW5jdGlvbnMuIERvIG5vdCBqdXN0IHVzZSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSBmb3IKKyAqIHRoaXMsIGJlY2F1c2UgaXQgZG9lcyBub3Qgc2F2ZS9yZXN0b3JlIHRoZSByZWN1cnNpb24gY291bnQgd2hlbgorICogd2FpdGluZyBvbiBhIGNvbmRpdGlvbi4gbGliZGJ1cyByZXF1aXJlcyB0aGUgSmF2YS1zdHlsZSBiZWhhdmlvcgorICogd2hlcmUgdGhlIG11dGV4IGlzIGZ1bGx5IHVubG9ja2VkIHRvIHdhaXQgb24gYSBjb25kaXRpb24uCisgKi8KK3R5cGVkZWYgREJ1c011dGV4KiAgKCogREJ1c1JlY3Vyc2l2ZU11dGV4TmV3RnVuY3Rpb24pICAgICh2b2lkKTsKKy8qKiBGcmVlcyBhIHJlY3Vyc2l2ZWx5LWxvY2thYmxlIG11dGV4LiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1JlY3Vyc2l2ZU11dGV4RnJlZUZ1bmN0aW9uKSAgIChEQnVzTXV0ZXggKm11dGV4KTsKKy8qKiBMb2NrcyBhIHJlY3Vyc2l2ZWx5LWxvY2thYmxlIG11dGV4LiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKiBDYW4gb25seSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhMb2NrRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIFVubG9ja3MgYSByZWN1cnNpdmVseS1sb2NrYWJsZSBtdXRleC4gIEZvdW5kIGluICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICogQ2FuIG9ubHkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1JlY3Vyc2l2ZU11dGV4VW5sb2NrRnVuY3Rpb24pIChEQnVzTXV0ZXggKm11dGV4KTsKKworLyoqIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKiBDYW4gb25seSBmYWlsIChyZXR1cm5pbmcgI05VTEwpIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqLwordHlwZWRlZiBEQnVzQ29uZFZhciogICgqIERCdXNDb25kVmFyTmV3RnVuY3Rpb24pICAgICAgICAgKHZvaWQpOworLyoqIEZyZWVzIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhckZyZWVGdW5jdGlvbikgICAgICAgIChEQnVzQ29uZFZhciAqY29uZCk7CisKKy8qKiBXYWl0cyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZS4gIEZvdW5kIGluCisgKiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gTXVzdCB3b3JrIHdpdGggZWl0aGVyIGEgcmVjdXJzaXZlIG9yCisgKiBub25yZWN1cnNpdmUgbXV0ZXgsIHdoaWNoZXZlciB0aGUgdGhyZWFkIGltcGxlbWVudGF0aW9uCisgKiBwcm92aWRlcy4gTm90ZSB0aGF0IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIGRvZXMgbm90IHdvcmsgd2l0aAorICogY29uZGl0aW9uIHZhcmlhYmxlcyAoZG9lcyBub3Qgc2F2ZS9yZXN0b3JlIHRoZSByZWN1cnNpb24gY291bnQpIHNvCisgKiBkb24ndCB0cnkgdXNpbmcgc2ltcGx5IHB0aHJlYWRfY29uZF93YWl0KCkgYW5kIGEKKyAqIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIHRvIGltcGxlbWVudCB0aGlzLCBpdCB3b24ndCB3b3JrIHJpZ2h0LgorICoKKyAqIEhhcyBubyBlcnJvciBjb25kaXRpb25zLiBNdXN0IHN1Y2NlZWQgaWYgaXQgcmV0dXJucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICgqIERCdXNDb25kVmFyV2FpdEZ1bmN0aW9uKSAgICAgICAgKERCdXNDb25kVmFyICpjb25kLAorCQkJCQkJCSAgREJ1c011dGV4ICAgKm11dGV4KTsKKworLyoqIFdhaXRzIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlIHdpdGggYSB0aW1lb3V0LiAgRm91bmQgaW4KKyAqICAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gUmV0dXJucyAjVFJVRSBpZiB0aGUgd2FpdCBkaWQgbm90CisgKiAgdGltZSBvdXQsIGFuZCAjRkFMU0UgaWYgaXQgZGlkLgorICoKKyAqIEhhcyBubyBlcnJvciBjb25kaXRpb25zLiBNdXN0IHN1Y2NlZWQgaWYgaXQgcmV0dXJucy4gCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgICAoKiBEQnVzQ29uZFZhcldhaXRUaW1lb3V0RnVuY3Rpb24pIChEQnVzQ29uZFZhciAqY29uZCwKKwkJCQkJCQkgIERCdXNNdXRleCAgICptdXRleCwKKwkJCQkJCQkgIGludCAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisvKiogV2FrZXMgb25lIHdhaXRpbmcgdGhyZWFkIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgKCogREJ1c0NvbmRWYXJXYWtlT25lRnVuY3Rpb24pIChEQnVzQ29uZFZhciAqY29uZCk7CisKKy8qKiBXYWtlcyBhbGwgd2FpdGluZyB0aHJlYWRzIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgKCogREJ1c0NvbmRWYXJXYWtlQWxsRnVuY3Rpb24pIChEQnVzQ29uZFZhciAqY29uZCk7CisKKy8qKgorICogRmxhZ3MgaW5kaWNhdGluZyB3aGljaCBmdW5jdGlvbnMgYXJlIHByZXNlbnQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuIFVzZWQgdG8gYWxsb3cKKyAqIHRoZSBsaWJyYXJ5IHRvIGRldGVjdCBvbGRlciBjYWxsZXJzIG9mIGRidXNfdGhyZWFkc19pbml0KCkgaWYgbmV3IHBvc3NpYmxlIGZ1bmN0aW9ucworICogYXJlIGFkZGVkIHRvICNEQnVzVGhyZWFkRnVuY3Rpb25zLgorICovCit0eXBlZGVmIGVudW0gCit7CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9ORVdfTUFTSyAgICAgID0gMSA8PCAwLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfRlJFRV9NQVNLICAgICA9IDEgPDwgMSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX0xPQ0tfTUFTSyAgICAgPSAxIDw8IDIsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9VTkxPQ0tfTUFTSyAgID0gMSA8PCAzLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9ORVdfTUFTSyAgICA9IDEgPDwgNCwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfRlJFRV9NQVNLICAgPSAxIDw8IDUsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBSVRfTUFTSyAgID0gMSA8PCA2LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUlUX1RJTUVPVVRfTUFTSyAgID0gMSA8PCA3LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUtFX09ORV9NQVNLID0gMSA8PCA4LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUtFX0FMTF9NQVNLID0gMSA8PCA5LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX05FV19NQVNLICAgID0gMSA8PCAxMCwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9GUkVFX01BU0sgICA9IDEgPDwgMTEsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfTE9DS19NQVNLICAgPSAxIDw8IDEyLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX1VOTE9DS19NQVNLID0gMSA8PCAxMywKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0FMTF9NQVNLICAgICA9ICgxIDw8IDE0KSAtIDEKK30gREJ1c1RocmVhZEZ1bmN0aW9uc01hc2s7CisKKy8qKgorICogRnVuY3Rpb25zIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBtYWtlIHRoZSBELUJ1cyBsaWJyYXJ5CisgKiB0aHJlYWQtYXdhcmUuCisgKgorICogSWYgeW91IHN1cHBseSBib3RoIHJlY3Vyc2l2ZSBhbmQgbm9uLXJlY3Vyc2l2ZSBtdXRleGVzLAorICogbGliZGJ1cyB3aWxsIHVzZSB0aGUgbm9uLXJlY3Vyc2l2ZSB2ZXJzaW9uIGZvciBjb25kaXRpb24gdmFyaWFibGVzLAorICogYW5kIHRoZSByZWN1cnNpdmUgdmVyc2lvbiBpbiBvdGhlciBjb250ZXh0cy4KKyAqCisgKiBUaGUgY29uZGl0aW9uIHZhcmlhYmxlIGZ1bmN0aW9ucyBoYXZlIHRvIHdvcmsgd2l0aCBub25yZWN1cnNpdmUKKyAqIG11dGV4ZXMgaWYgeW91IHByb3ZpZGUgdGhvc2UsIG9yIHdpdGggcmVjdXJzaXZlIG11dGV4ZXMgaWYgeW91CisgKiBkb24ndC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgaW50IG1hc2s7IC8qKjwgTWFzayBpbmRpY2F0aW5nIHdoaWNoIGZ1bmN0aW9ucyBhcmUgcHJlc2VudC4gKi8KKworICBEQnVzTXV0ZXhOZXdGdW5jdGlvbiBtdXRleF9uZXc7IC8qKjwgRnVuY3Rpb24gdG8gY3JlYXRlIGEgbXV0ZXg7IG9wdGlvbmFsIGFuZCBkZXByZWNhdGVkLiAqLworICBEQnVzTXV0ZXhGcmVlRnVuY3Rpb24gbXV0ZXhfZnJlZTsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIGEgbXV0ZXg7IG9wdGlvbmFsIGFuZCBkZXByZWNhdGVkLiAqLworICBEQnVzTXV0ZXhMb2NrRnVuY3Rpb24gbXV0ZXhfbG9jazsgLyoqPCBGdW5jdGlvbiB0byBsb2NrIGEgbXV0ZXg7IG9wdGlvbmFsIGFuZCBkZXByZWNhdGVkLiAqLworICBEQnVzTXV0ZXhVbmxvY2tGdW5jdGlvbiBtdXRleF91bmxvY2s7IC8qKjwgRnVuY3Rpb24gdG8gdW5sb2NrIGEgbXV0ZXg7IG9wdGlvbmFsIGFuZCBkZXByZWNhdGVkLiAqLworCisgIERCdXNDb25kVmFyTmV3RnVuY3Rpb24gY29uZHZhcl9uZXc7IC8qKjwgRnVuY3Rpb24gdG8gY3JlYXRlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCisgIERCdXNDb25kVmFyRnJlZUZ1bmN0aW9uIGNvbmR2YXJfZnJlZTsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIGEgY29uZGl0aW9uIHZhcmlhYmxlICovCisgIERCdXNDb25kVmFyV2FpdEZ1bmN0aW9uIGNvbmR2YXJfd2FpdDsgLyoqPCBGdW5jdGlvbiB0byB3YWl0IG9uIGEgY29uZGl0aW9uICovCisgIERCdXNDb25kVmFyV2FpdFRpbWVvdXRGdW5jdGlvbiBjb25kdmFyX3dhaXRfdGltZW91dDsgLyoqPCBGdW5jdGlvbiB0byB3YWl0IG9uIGEgY29uZGl0aW9uIHdpdGggYSB0aW1lb3V0ICovCisgIERCdXNDb25kVmFyV2FrZU9uZUZ1bmN0aW9uIGNvbmR2YXJfd2FrZV9vbmU7IC8qKjwgRnVuY3Rpb24gdG8gd2FrZSBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiAqLworICBEQnVzQ29uZFZhcldha2VBbGxGdW5jdGlvbiBjb25kdmFyX3dha2VfYWxsOyAvKio8IEZ1bmN0aW9uIHRvIHdha2UgYWxsIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uICovCisgCisgIERCdXNSZWN1cnNpdmVNdXRleE5ld0Z1bmN0aW9uIHJlY3Vyc2l2ZV9tdXRleF9uZXc7IC8qKjwgRnVuY3Rpb24gdG8gY3JlYXRlIGEgcmVjdXJzaXZlIG11dGV4ICovCisgIERCdXNSZWN1cnNpdmVNdXRleEZyZWVGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfZnJlZTsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIGEgcmVjdXJzaXZlIG11dGV4ICovCisgIERCdXNSZWN1cnNpdmVNdXRleExvY2tGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfbG9jazsgLyoqPCBGdW5jdGlvbiB0byBsb2NrIGEgcmVjdXJzaXZlIG11dGV4ICovCisgIERCdXNSZWN1cnNpdmVNdXRleFVubG9ja0Z1bmN0aW9uIHJlY3Vyc2l2ZV9tdXRleF91bmxvY2s7IC8qKjwgRnVuY3Rpb24gdG8gdW5sb2NrIGEgcmVjdXJzaXZlIG11dGV4ICovCisKKyAgdm9pZCAoKiBwYWRkaW5nMSkgKHZvaWQpOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogcGFkZGluZzIpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIHBhZGRpbmczKSAodm9pZCk7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBwYWRkaW5nNCkgKHZvaWQpOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIAorfSBEQnVzVGhyZWFkRnVuY3Rpb25zOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfdGhyZWFkc19pbml0ICAgICAgICAgKGNvbnN0IERCdXNUaHJlYWRGdW5jdGlvbnMgKmZ1bmN0aW9ucyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKHZvaWQpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVEhSRUFEU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGltZW91dC5jIGIvZGJ1cy9kYnVzLXRpbWVvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ2Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRpbWVvdXQuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRpbWVvdXQuYyBEQnVzVGltZW91dCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10aW1lb3V0LmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaW1lb3V0SW50ZXJuYWxzIERCdXNUaW1lb3V0IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgREJ1c1RpbWVvdXQKKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzVGltZW91dAorICovCitzdHJ1Y3QgREJ1c1RpbWVvdXQKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgaW50IGludGVydmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gKi8KKworICBEQnVzVGltZW91dEhhbmRsZXIgaGFuZGxlcjsgICAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgaGFuZGxlci4gKi8KKyAgdm9pZCAqaGFuZGxlcl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGhhbmRsZXIgZGF0YS4gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbjsgLyoqPCBGcmVlIHRoZSB0aW1lb3V0IGhhbmRsZXIgZGF0YS4gKi8KKyAgCisgIHZvaWQgKmRhdGE7CQkgICAJICAgICAgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBkYXRhLiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jdGlvbjsgICAgICAgICAvKio8IEZyZWUgdGhlIGFwcGxpY2F0aW9uIGRhdGEuICovCisgIHVuc2lnbmVkIGludCBlbmFibGVkIDogMTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiB0aW1lb3V0IGlzIGFjdGl2ZS4gKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBEQnVzVGltZW91dCwgZW5hYmxlZCBieSBkZWZhdWx0LgorICogQHBhcmFtIGludGVydmFsIHRoZSB0aW1lb3V0IGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgdGltZW91dCBvY2N1cnMuCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyB0aGUgbmV3IERCdXNUaW1lb3V0IG9iamVjdCwKKyAqLworREJ1c1RpbWVvdXQqCitfZGJ1c190aW1lb3V0X25ldyAoaW50ICAgICAgICAgICAgICAgICBpbnRlcnZhbCwKKwkJICAgREJ1c1RpbWVvdXRIYW5kbGVyICBoYW5kbGVyLAorCQkgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisJCSAgIERCdXNGcmVlRnVuY3Rpb24gICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBEQnVzVGltZW91dCAqdGltZW91dDsKKworICB0aW1lb3V0ID0gZGJ1c19uZXcwIChEQnVzVGltZW91dCwgMSk7CisgIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICB0aW1lb3V0LT5yZWZjb3VudCA9IDE7CisgIHRpbWVvdXQtPmludGVydmFsID0gaW50ZXJ2YWw7CisKKyAgdGltZW91dC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIHRpbWVvdXQtPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisgIHRpbWVvdXQtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworCisgIHRpbWVvdXQtPmVuYWJsZWQgPSBUUlVFOworICAKKyAgcmV0dXJuIHRpbWVvdXQ7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1RpbWVvdXQgb2JqZWN0LgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqLworREJ1c1RpbWVvdXQgKgorX2RidXNfdGltZW91dF9yZWYgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICB0aW1lb3V0LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB0aW1lb3V0OworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNUaW1lb3V0IG9iamVjdAorICogYW5kIGZpbmFsaXplcyB0aGUgb2JqZWN0IGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgb2JqZWN0LgorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3VucmVmIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0aW1lb3V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRpbWVvdXQtPnJlZmNvdW50ID4gMCk7CisgIAorICB0aW1lb3V0LT5yZWZjb3VudCAtPSAxOworICBpZiAodGltZW91dC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3RpbWVvdXRfc2V0X2RhdGEgKHRpbWVvdXQsIE5VTEwsIE5VTEwpOyAvKiBjYWxsIGZyZWVfZGF0YV9mdW5jdGlvbiAqLworCisgICAgICBpZiAodGltZW91dC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pCisJKCogdGltZW91dC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0LT5oYW5kbGVyX2RhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHRpbWVvdXQpOworICAgIH0KK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB0aW1lb3V0IGludGVydmFsLiBOb3RlIHRoYXQgeW91IGhhdmUgdG8gZGlzYWJsZSBhbmQKKyAqIHJlLWVuYWJsZSB0aGUgdGltZW91dCB1c2luZyB0aGUgdGltZW91dCB0b2dnbGUgZnVuY3Rpb24KKyAqIChfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkKCkgZXRjLikgdG8gbm90aWZ5IHRoZQorICogYXBwbGljYXRpb24gb2YgdGhpcyBjaGFuZ2UuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQKKyAqIEBwYXJhbSBpbnRlcnZhbCB0aGUgbmV3IGludGVydmFsCisgKi8KK3ZvaWQKK19kYnVzX3RpbWVvdXRfc2V0X2ludGVydmFsIChEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaW50ZXJ2YWwpCit7CisgIF9kYnVzX2Fzc2VydCAoaW50ZXJ2YWwgPj0gMCk7CisgIAorICB0aW1lb3V0LT5pbnRlcnZhbCA9IGludGVydmFsOworfQorCisvKioKKyAqIENoYW5nZXMgdGhlIHRpbWVvdXQncyBlbmFibGVkLW5lc3MuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIHVzZQorICogX2RidXNfY29ubmVjdGlvbl90b2dnbGVfdGltZW91dF91bmxvY2tlZCgpIGV0Yy4gaW5zdGVhZCwgaWYKKyAqIHRoZSB0aW1lb3V0IGlzIHBhc3NlZCBvdXQgdG8gYW4gYXBwbGljYXRpb24gbWFpbiBsb29wLgorICogaS5lLiB5b3UgY2FuJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEQtQnVzIGxpYnJhcnksIGl0J3MKKyAqIG9ubHkgdXNlZCBpbiB0aGUgbWVzc2FnZSBidXMgZGFlbW9uIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0CisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSBpZiB0aW1lb3V0IHNob3VsZCBiZSBlbmFibGVkLgorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkIChEQnVzVGltZW91dCAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIGVuYWJsZWQpCit7CisgIHRpbWVvdXQtPmVuYWJsZWQgPSBlbmFibGVkICE9IEZBTFNFOworfQorCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1RpbWVvdXRMaXN0CisgKgorICogT3BhcXVlIGRhdGEgdHlwZSByZXByZXNlbnRpbmcgYSBsaXN0IG9mIHRpbWVvdXRzCisgKiBhbmQgYSBzZXQgb2YgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbi9EQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uLgorICogQXV0b21hdGljYWxseSBoYW5kbGVzIHJlbW92aW5nL3JlLWFkZGluZyB0aW1lb3V0cworICogd2hlbiB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpcyB1cGRhdGVkIG9yIGNoYW5nZWQuCisgKiBIb2xkcyBhIHJlZmVyZW5jZSBjb3VudCB0byBlYWNoIHRpbWVvdXQuCisgKgorICovCisKKy8qKgorICogREJ1c1RpbWVvdXRMaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEFsbCBmaWVsZHMKKyAqIGFyZSBwcml2YXRlLgorICoKKyAqLworc3RydWN0IERCdXNUaW1lb3V0TGlzdAoreworICBEQnVzTGlzdCAqdGltZW91dHM7IC8qKjwgVGltZW91dCBvYmplY3RzLiAqLworCisgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gYWRkX3RpbWVvdXRfZnVuY3Rpb247ICAgICAgIC8qKjwgQ2FsbGJhY2sgZm9yIGFkZGluZyBhIHRpbWVvdXQuICovCisgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gcmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb247IC8qKjwgQ2FsbGJhY2sgZm9yIHJlbW92aW5nIGEgdGltZW91dC4gKi8KKyAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdGltZW91dF90b2dnbGVkX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIHdoZW4gdGltZW91dCBpcyBlbmFibGVkL2Rpc2FibGVkIG9yIGNoYW5nZXMgaW50ZXJ2YWwgKi8KKyAgdm9pZCAqdGltZW91dF9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB0aW1lb3V0IGNhbGxiYWNrcyAqLworICBEQnVzRnJlZUZ1bmN0aW9uIHRpbWVvdXRfZnJlZV9kYXRhX2Z1bmN0aW9uOyAgICAgICAvKio8IEZyZWUgZnVuY3Rpb24gZm9yIHRpbWVvdXQgY2FsbGJhY2sgZGF0YSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRpbWVvdXQgbGlzdC4gUmV0dXJucyAjTlVMTCBpZiBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBleGlzdHMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyB0aW1lb3V0IGxpc3QsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNUaW1lb3V0TGlzdCoKK19kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKHZvaWQpCit7CisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0OworCisgIHRpbWVvdXRfbGlzdCA9IGRidXNfbmV3MCAoREJ1c1RpbWVvdXRMaXN0LCAxKTsKKyAgaWYgKHRpbWVvdXRfbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiB0aW1lb3V0X2xpc3Q7Cit9CisKKy8qKgorICogRnJlZXMgYSBEQnVzVGltZW91dExpc3QuCisgKgorICogQHBhcmFtIHRpbWVvdXRfbGlzdCB0aGUgdGltZW91dCBsaXN0LgorICovCit2b2lkCitfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0X2xpc3QpCit7CisgIC8qIGZyZWUgdGltZW91dF9kYXRhIGFuZCByZW1vdmUgdGltZW91dHMgYXMgYSBzaWRlIGVmZmVjdCAqLworICBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAodGltZW91dF9saXN0LAorCQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLAorCQkgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgX2RidXNfdGltZW91dF91bnJlZiwKKwkJICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzKTsKKworICBkYnVzX2ZyZWUgKHRpbWVvdXRfbGlzdCk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdGltZW91dCBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMgdGhlICJiYWNrZW5kIgorICogZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QKKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gdGhlIGFkZCB0aW1lb3V0IGZ1bmN0aW9uLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiB0aGUgcmVtb3ZlIHRpbWVvdXQgZnVuY3Rpb24uCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiB0b2dnbGUgbm90aWZ5IGZ1bmN0aW9uLCBvciAjTlVMTAorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgZm9yIHRob3NlIGZ1bmN0aW9ucy4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gdGhlIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKwkJCQkgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKwkJCQkgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgLyogQWRkIHRpbWVvdXRzIHdpdGggdGhlIG5ldyBmdW5jdGlvbiwgZmFpbGluZyBvbiBPT00gKi8KKyAgaWYgKGFkZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdGltZW91dF9saXN0LT50aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAKKyAgICAgICAgICBpZiAoISgqIGFkZF9mdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiByZW1vdmUgaXQgYWxsIGFnYWluIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmsyOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmdGltZW91dF9saXN0LT50aW1lb3V0cyk7CisgICAgICAgICAgICAgIHdoaWxlIChsaW5rMiAhPSBsaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdGltZW91dF9saXN0LT50aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rMik7CisKKyAgICAgICAgICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKGxpbmsyLT5kYXRhLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbGluazIgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIFJlbW92ZSBhbGwgY3VycmVudCB0aW1lb3V0cyBmcm9tIHByZXZpb3VzIHRpbWVvdXQgaGFuZGxlcnMgKi8KKworICBpZiAodGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisJCQkgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uLAorCQkJICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisgICAgfQorCisgIGlmICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZnJlZV9kYXRhX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbikgKHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKKworICB0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uID0gYWRkX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uID0gcmVtb3ZlX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbiA9IHRvZ2dsZWRfZnVuY3Rpb247CisgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhID0gZGF0YTsKKyAgdGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGRzIGEgbmV3IHRpbWVvdXQgdG8gdGhlIHRpbWVvdXQgbGlzdCwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbiBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIGFkZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBJZiBubyBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190aW1lb3V0X2xpc3RfYWRkX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0LAorCQkJCURCdXNUaW1lb3V0ICAgICAqdGltZW91dCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsIHRpbWVvdXQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c190aW1lb3V0X3JlZiAodGltZW91dCk7CisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+YWRkX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISgqIHRpbWVvdXRfbGlzdC0+YWRkX3RpbWVvdXRfZnVuY3Rpb24pICh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsIHRpbWVvdXQpOworICAgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKHRpbWVvdXQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdGltZW91dCBmcm9tIHRoZSB0aW1lb3V0IGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0IChEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdCwKKwkJCQkgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpCit7CisgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJOb25leGlzdGVudCB0aW1lb3V0IHdhcyByZW1vdmVkIik7CisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+cmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uKSAodGltZW91dCwKKwkJCQkJICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKKworICBfZGJ1c190aW1lb3V0X3VucmVmICh0aW1lb3V0KTsKK30KKworLyoqCisgKiBTZXRzIGEgdGltZW91dCB0byB0aGUgZ2l2ZW4gZW5hYmxlZCBzdGF0ZSwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbidzIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIHRvIGVuYWJsZQorICovCit2b2lkCitfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgZW5hYmxlZCA9ICEhZW5hYmxlZDsKKyAgCisgIGlmIChlbmFibGVkID09IHRpbWVvdXQtPmVuYWJsZWQpCisgICAgcmV0dXJuOworCisgIHRpbWVvdXQtPmVuYWJsZWQgPSBlbmFibGVkOworICAKKyAgaWYgKHRpbWVvdXRfbGlzdC0+dGltZW91dF90b2dnbGVkX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT50aW1lb3V0X3RvZ2dsZWRfZnVuY3Rpb24pICh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RpbWVvdXQgREJ1c1RpbWVvdXQKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgT2JqZWN0IHJlcHJlc2VudGluZyBhIHRpbWVvdXQKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1RpbWVvdXQuIEEgdGltZW91dAorICogcmVwcmVzZW50cyBhIHRpbWVvdXQgdGhhdCB0aGUgbWFpbiBsb29wIG5lZWRzIHRvIG1vbml0b3IsCisgKiBhcyBpbiBRdCdzIFFUaW1lciBvciBHTGliJ3MgZ190aW1lb3V0X2FkZCgpLgorICoKKyAqIFVzZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgb3IgZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkKKyAqIHRvIGJlIG5vdGlmaWVkIHdoZW4gbGliZGJ1cyBuZWVkcyB0byBhZGQgb3IgcmVtb3ZlIHRpbWVvdXRzLgorICogCisgKiBAeworICovCisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzVGltZW91dAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgdGltZW91dC4KKyAqLworCisvKioKKyAqIEdldHMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwuIFRoZSBkYnVzX3RpbWVvdXRfaGFuZGxlKCkKKyAqIHNob3VsZCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoaXMgaW50ZXJ2YWwgZWxhcHNlcywKKyAqIHN0YXJ0aW5nIGFmdGVyIGl0IGVsYXBzZXMgb25jZS4KKyAqCisgKiBUaGUgaW50ZXJ2YWwgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlCisgKiB0aW1lb3V0OyBpZiBzbywgdGhlIHRpbWVvdXQgd2lsbCBiZSBkaXNhYmxlZCBhbmQKKyAqIHJlLWVuYWJsZWQgKGNhbGxpbmcgdGhlICJ0aW1lb3V0IHRvZ2dsZWQgZnVuY3Rpb24iKQorICogdG8gbm90aWZ5IHlvdSBvZiB0aGUgY2hhbmdlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLgorICovCitpbnQKK2RidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gdGltZW91dC0+aW50ZXJ2YWw7Cit9CisKKy8qKgorICogR2V0cyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c190aW1lb3V0X3NldF9kYXRhKCkKKyAqIG9yICNOVUxMIGlmIG5vbmUuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zIHByZXZpb3VzbHktc2V0IGRhdGEuCisgKi8KK3ZvaWQqCitkYnVzX3RpbWVvdXRfZ2V0X2RhdGEgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gdGltZW91dC0+ZGF0YTsKK30KKworLyoqCisgKiBTZXRzIGRhdGEgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfdGltZW91dF9nZXRfZGF0YSgpLgorICogSW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBhbmQKKyAqIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gdG8gc3RvcmUgdGhlaXIgb3duIGRhdGEuICBGb3IgZXhhbXBsZSB3aXRoCisgKiBRdCB5b3UgbWlnaHQgc3RvcmUgdGhlIFFUaW1lciBmb3IgdGhpcyB0aW1lb3V0IGFuZCB3aXRoIEdMaWIKKyAqIHlvdSBtaWdodCBzdG9yZSBhIGdfdGltZW91dF9hZGQgcmVzdWx0IGlkLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YS4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2RidXNfdGltZW91dF9zZXRfZGF0YSAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCwKKwkJICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisJCSAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGlmICh0aW1lb3V0LT5mcmVlX2RhdGFfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB0aW1lb3V0LT5mcmVlX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0LT5kYXRhKTsKKworICB0aW1lb3V0LT5kYXRhID0gZGF0YTsKKyAgdGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCisvKioKKyAqIENhbGxzIHRoZSB0aW1lb3V0IGhhbmRsZXIgZm9yIHRoaXMgdGltZW91dC4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0CisgKiBvY2N1cnMuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zICNGQUxTRSwgdGhlbiB0aGVyZSB3YXNuJ3QKKyAqIGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIHRoZSB0aW1lb3V0LiBUeXBpY2FsbHkganVzdAorICogbGV0dGluZyB0aGUgdGltZW91dCBmaXJlIGFnYWluIG5leHQgdGltZSBpdCBuYXR1cmFsbHkKKyAqIHRpbWVzIG91dCBpcyBhbiBhZGVxdWF0ZSByZXNwb25zZSB0byB0aGF0IHByb2JsZW0sCisgKiBidXQgeW91IGNvdWxkIHRyeSB0byBkbyBtb3JlIGlmIHlvdSB3YW50ZWQuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIG1lbW9yeSAKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGltZW91dF9oYW5kbGUgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gKCogdGltZW91dC0+aGFuZGxlcikgKHRpbWVvdXQtPmhhbmRsZXJfZGF0YSk7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSB0aW1lb3V0IGlzIGVuYWJsZWQgb3Igbm90LiBJZiBub3QKKyAqIGVuYWJsZWQsIGl0IHNob3VsZCBub3QgYmUgcG9sbGVkIGJ5IHRoZSBtYWluIGxvb3AuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHRpbWVvdXQgaXMgZW5hYmxlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c190aW1lb3V0X2dldF9lbmFibGVkIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmVuYWJsZWQ7Cit9CisKKy8qKiBAfSBlbmQgcHVibGljIEFQSSBkb2NzICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGltZW91dC5oIGIvZGJ1cy9kYnVzLXRpbWVvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUyYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRpbWVvdXQuaApAQCAtMCwwICsxLDc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGltZW91dC5oIERCdXNUaW1lb3V0IGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVElNRU9VVF9ICisjZGVmaW5lIERCVVNfVElNRU9VVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaW1lb3V0SW50ZXJuYWxzCisgKiBAeworICovCisKKy8qIFB1YmxpYyBtZXRob2RzIG9uIERCdXNUaW1lb3V0IGFyZSBpbiBkYnVzLWNvbm5lY3Rpb24uaCAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzVGltZW91dExpc3QgREJ1c1RpbWVvdXRMaXN0OworCisvKiogZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHRpbWVvdXQgaXMgaGFuZGxlZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEhhbmRsZXIpICh2b2lkICpkYXRhKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1RpbWVvdXQqIF9kYnVzX3RpbWVvdXRfbmV3ICAgICAgICAgIChpbnQgICAgICAgICAgICAgICAgIGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJ1c1RpbWVvdXQqIF9kYnVzX3RpbWVvdXRfcmVmICAgICAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgICAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfc2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW50ZXJ2YWwpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfc2V0X2VuYWJsZWQgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgZW5hYmxlZCk7CisKK0RCdXNUaW1lb3V0TGlzdCAqX2RidXNfdGltZW91dF9saXN0X25ldyAgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X2ZyZWUgICAgICAgICAgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKwkJCQkJCSAgICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisJCQkJCQkgICAgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisJCQkJCQkgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkJCSAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworZGJ1c19ib29sX3QgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfYWRkX3RpbWVvdXQgICAgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKwkJCQkJCSAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgICp0aW1lb3V0KTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0IChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF90b2dnbGVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgZW5hYmxlZCk7CisKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RJTUVPVVRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCBiL2RidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2MjdhMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmggVXNlZCBieSBzdWJjbGFzc2VzIG9mIERCdXNUcmFuc3BvcnQgb2JqZWN0IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RSQU5TUE9SVF9QUk9URUNURURfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9QUk9URUNURURfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYXV0aC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1yZXNvdXJjZXMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzVHJhbnNwb3J0VlRhYmxlIERCdXNUcmFuc3BvcnRWVGFibGU7CisKKy8qKgorICogVGhlIHZpcnR1YWwgdGFibGUgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvCisgKiBjcmVhdGUgYSBuZXcga2luZCBvZiB0cmFuc3BvcnQuCisgKi8KK3N0cnVjdCBEQnVzVHJhbnNwb3J0VlRhYmxlCit7CisgIHZvaWQgICAgICAgICgqIGZpbmFsaXplKSAgICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIC8qKjwgVGhlIGZpbmFsaXplIG1ldGhvZCBtdXN0IGZyZWUgdGhlIHRyYW5zcG9ydC4gKi8KKworICBkYnVzX2Jvb2xfdCAoKiBoYW5kbGVfd2F0Y2gpICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncyk7CisgIC8qKjwgVGhlIGhhbmRsZV93YXRjaCBtZXRob2QgaGFuZGxlcyByZWFkaW5nL3dyaXRpbmcKKyAgICogZGF0YSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGZsYWdzLgorICAgKi8KKworICB2b2lkICAgICAgICAoKiBkaXNjb25uZWN0KSAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICAvKio8IERpc2Nvbm5lY3QgdGhpcyB0cmFuc3BvcnQuICovCisKKyAgZGJ1c19ib29sX3QgKCogY29ubmVjdGlvbl9zZXQpICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBDYWxsZWQgd2hlbiB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gaGFzIGJlZW4gZmlsbGVkIGluICovCisKKyAgdm9pZCAgICAgICAgKCogZG9faXRlcmF0aW9uKSAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworICAvKio8IENhbGxlZCB0byBkbyBhIHNpbmdsZSAiaXRlcmF0aW9uIiAoYmxvY2sgb24gc2VsZWN0L3BvbGwKKyAgICogZm9sbG93ZWQgYnkgcmVhZGluZyBvciB3cml0aW5nIGRhdGEpLgorICAgKi8KKworICB2b2lkICAgICAgICAoKiBsaXZlX21lc3NhZ2VzX2NoYW5nZWQpIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICAvKio8IE91dHN0YW5kaW5nIG1lc3NhZ2VzIGNvdW50ZXIgY2hhbmdlZCAqLworCisgIGRidXNfYm9vbF90ICgqIGdldF9zb2NrZXRfZmQpIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0ICAgICpmZF9wKTsKKyAgLyoqPCBHZXQgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLworfTsKKworLyoqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgdHJhbnNwb3J0IHN1Y2ggYXMgYSBzb2NrZXQuCisgKiBBIHRyYW5zcG9ydCBjYW4gc2h1dHRsZSBtZXNzYWdlcyBmcm9tIHBvaW50IEEgdG8gcG9pbnQgQiwKKyAqIGFuZCBpcyB0aGUgYmFja2VuZCBmb3IgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydAoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50LiAqLworCisgIGNvbnN0IERCdXNUcmFuc3BvcnRWVGFibGUgKnZ0YWJsZTsgICAgICAgICAgLyoqPCBWaXJ0dWFsIG1ldGhvZHMgZm9yIHRoaXMgaW5zdGFuY2UuICovCisKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247ICAgICAgICAgICAgICAgICAvKio8IENvbm5lY3Rpb24gb3duaW5nIHRoaXMgdHJhbnNwb3J0LiAqLworCisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlLWxvYWRpbmcgYnVmZmVyLiAqLworCisgIERCdXNBdXRoICphdXRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBdXRoZW50aWNhdGlvbiBjb252ZXJzYXRpb24gKi8KKworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzOyAgICAgICAgICAgICAgIC8qKjwgQ3JlZGVudGlhbHMgb2Ygb3RoZXIgZW5kIHJlYWQgZnJvbSB0aGUgc29ja2V0ICovICAKKworICBsb25nIG1heF9saXZlX21lc3NhZ2VzX3NpemU7ICAgICAgICAgICAgICAgIC8qKjwgTWF4IHRvdGFsIHNpemUgb2YgcmVjZWl2ZWQgbWVzc2FnZXMuICovCisgIGxvbmcgbWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHM7ICAgICAgICAgICAgLyoqPCBNYXggdG90YWwgdW5peCBmZHMgb2YgcmVjZWl2ZWQgbWVzc2FnZXMuICovCisKKyAgREJ1c0NvdW50ZXIgKmxpdmVfbWVzc2FnZXM7ICAgICAgICAgICAgICAgICAvKio8IENvdW50ZXIgZm9yIHNpemUvdW5peCBmZHMgb2YgYWxsIGxpdmUgbWVzc2FnZXMuICovCisKKyAgY2hhciAqYWRkcmVzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFkZHJlc3Mgb2YgdGhlIHNlcnZlciB3ZSBhcmUgY29ubmVjdGluZyB0byAoI05VTEwgZm9yIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIHRyYW5zcG9ydCkgKi8KKworICBjaGFyICpleHBlY3RlZF9ndWlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR1VJRCB3ZSBleHBlY3QgdGhlIHNlcnZlciB0byBoYXZlLCAjTlVMTCBvbiBzZXJ2ZXIgc2lkZSBvciBpZiB3ZSBkb24ndCBoYXZlIGFuIGV4cGVjdGF0aW9uICovCisgIAorICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uIHVuaXhfdXNlcl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiBmb3IgY2hlY2tpbmcgd2hldGhlciBhIHVzZXIgaXMgYXV0aG9yaXplZC4gKi8KKyAgdm9pZCAqdW5peF91c2VyX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgdW5peF91c2VyX2Z1bmN0aW9uICovCisgIAorICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfdW5peF91c2VyX2RhdGE7ICAgICAgICAgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHVuaXhfdXNlcl9kYXRhICovCisKKyAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiB3aW5kb3dzX3VzZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gZm9yIGNoZWNraW5nIHdoZXRoZXIgYSB1c2VyIGlzIGF1dGhvcml6ZWQuICovCisgIHZvaWQgKndpbmRvd3NfdXNlcl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgZm9yIHdpbmRvd3NfdXNlcl9mdW5jdGlvbiAqLworICAKKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3dpbmRvd3NfdXNlcl9kYXRhOyAgICAgICAgICAgIC8qKjwgRnVuY3Rpb24gdG8gZnJlZSB3aW5kb3dzX3VzZXJfZGF0YSAqLworICAKKyAgdW5zaWduZWQgaW50IGRpc2Nvbm5lY3RlZCA6IDE7ICAgICAgICAgICAgICAvKio8ICNUUlVFIGlmIHdlIGFyZSBkaXNjb25uZWN0ZWQuICovCisgIHVuc2lnbmVkIGludCBhdXRoZW50aWNhdGVkIDogMTsgICAgICAgICAgICAgLyoqPCBDYWNoZSBvZiBhdXRoIHN0YXRlOyB1c2UgX2RidXNfdHJhbnNwb3J0X3BlZWtfaXNfYXV0aGVudGljYXRlZCgpIHRvIHF1ZXJ5IHZhbHVlICovCisgIHVuc2lnbmVkIGludCBzZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgOiAxOyAgLyoqPCAjVFJVRSBpZiB3ZSBuZWVkIHRvIHNlbmQgY3JlZGVudGlhbHMgKi8KKyAgdW5zaWduZWQgaW50IHJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA6IDE7IC8qKjwgI1RSVUUgaWYgd2UgbmVlZCB0byByZWNlaXZlIGNyZWRlbnRpYWxzICovCisgIHVuc2lnbmVkIGludCBpc19zZXJ2ZXIgOiAxOyAgICAgICAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBvbiB0aGUgc2VydmVyIHNpZGUgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZF9ieXRlc19yZWNvdmVyZWQgOiAxOyAgICAvKio8ICNUUlVFIGlmIHdlJ3ZlIHJlY292ZXJlZCB1bnVzZWQgYnl0ZXMgZnJvbSBhdXRoICovCisgIHVuc2lnbmVkIGludCBhbGxvd19hbm9ueW1vdXMgOiAxOyAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBhbiBhbm9ueW1vdXMgY2xpZW50IGNhbiBjb25uZWN0ICovCit9OworCitkYnVzX2Jvb2xfdCBfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUcmFuc3BvcnRWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICphZGRyZXNzKTsKK3ZvaWQgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9maW5hbGl6ZV9iYXNlIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVELCAgICAvKio8IHdlIGFyZW4ndCBpbiBjaGFyZ2Ugb2YgdGhpcyBhZGRyZXNzIHR5cGUgKi8KKyAgREJVU19UUkFOU1BPUlRfT1BFTl9PSywgICAgICAgICAgICAgLyoqPCB3ZSBzZXQgdXAgdGhlIGxpc3RlbiAqLworICBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTLCAgICAvKio8IG1hbGZvcm1lZCBhZGRyZXNzICovCisgIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUIC8qKjwgd2VsbC1mb3JtZWQgYWRkcmVzcyBidXQgZmFpbGVkIHRvIHNldCBpdCB1cCAqLworfSBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdDsKKworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHgpICAgICAgXAorICBfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoKHgpLT5hdXRoKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMgYi9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzNjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCkBAIC0wLDAgKzEsMTQ4MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyAgU29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0U29ja2V0IERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGZvciBzb2NrZXRzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1RyYW5zcG9ydCBvbiBzb2NrZXRzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnRTb2NrZXQgREJ1c1RyYW5zcG9ydFNvY2tldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnRTb2NrZXQuIEFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydFNvY2tldAoreworICBEQnVzVHJhbnNwb3J0IGJhc2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgUGFyZW50IGluc3RhbmNlICovCisgIERCdXNTb2NrZXQgZmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IuICovCisgIERCdXNXYXRjaCAqcmVhZF93YXRjaDsgICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3IgcmVhZGFiaWxpdHkuICovCisgIERCdXNXYXRjaCAqd3JpdGVfd2F0Y2g7ICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3Igd3JpdGFiaWxpdHkuICovCisKKyAgaW50IG1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb247ICAgICAvKio8IFRvIGF2b2lkIGJsb2NraW5nIHRvbyBsb25nLiAqLworICBpbnQgbWF4X2J5dGVzX3dyaXR0ZW5fcGVyX2l0ZXJhdGlvbjsgIC8qKjwgVG8gYXZvaWQgYmxvY2tpbmcgdG9vIGxvbmcuICovCisKKyAgaW50IG1lc3NhZ2VfYnl0ZXNfd3JpdHRlbjsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBvZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvdXRnb2luZyBtZXNzYWdlIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYmVlbiB3cml0dGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzU3RyaW5nIGVuY29kZWRfb3V0Z29pbmc7ICAgICAgICAgIC8qKjwgRW5jb2RlZCB2ZXJzaW9uIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG91dGdvaW5nIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNTdHJpbmcgZW5jb2RlZF9pbmNvbWluZzsgICAgICAgICAgLyoqPCBFbmNvZGVkIHZlcnNpb24gb2YgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5jb21pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0YXRpYyB2b2lkCitmcmVlX3dhdGNoZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCkKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uKQorICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpCisgICAgeworICAgICAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikKKyAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2ZpbmFsaXplIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKyAgCisgIGZyZWVfd2F0Y2hlcyAodHJhbnNwb3J0KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworICAKKyAgX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID09IE5VTEwpOworICAKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfd3JpdGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBkYnVzX2Jvb2xfdCBuZWVkZWQ7CisKKyAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9PSBOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisgIGlmIChfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAodHJhbnNwb3J0KSkKKyAgICBuZWVkZWQgPSBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICBlbHNlCisgICAgeworICAgICAgaWYgKHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgICAgICBuZWVkZWQgPSBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgREJ1c0F1dGhTdGF0ZSBhdXRoX3N0YXRlOworICAgICAgICAgIAorICAgICAgICAgIGF1dGhfc3RhdGUgPSBfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAgICAgCisgICAgICAgICAgLyogSWYgd2UgbmVlZCBtZW1vcnkgd2UgaW5zdGFsbCB0aGUgd3JpdGUgd2F0Y2gganVzdCBpbiBjYXNlLAorICAgICAgICAgICAqIGlmIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgaXQsIGl0IHdpbGwgZ2V0IGRlLWluc3RhbGxlZAorICAgICAgICAgICAqIG5leHQgdGltZSB3ZSB0cnkgcmVhZGluZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EIHx8CisgICAgICAgICAgICAgIGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWSkKKyAgICAgICAgICAgIG5lZWRlZCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbmVlZGVkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX3dyaXRlX3dhdGNoKCk6IG5lZWRlZCA9ICVkIG9uIGNvbm5lY3Rpb24gJXAgd2F0Y2ggJXAgZmQgPSAlIiBEQlVTX1NPQ0tFVF9GT1JNQVQgIiBvdXRnb2luZyBtZXNzYWdlcyBleGlzdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgbmVlZGVkLCB0cmFuc3BvcnQtPmNvbm5lY3Rpb24sIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoLAorICAgICAgICAgICAgICAgICBfZGJ1c19zb2NrZXRfcHJpbnRhYmxlIChzb2NrZXRfdHJhbnNwb3J0LT5mZCksCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCk7CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcmVhZF93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG5lZWRfcmVhZF93YXRjaDsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlIiBEQlVTX1NPQ0tFVF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc29ja2V0X3ByaW50YWJsZSAoc29ja2V0X3RyYW5zcG9ydC0+ZmQpKTsKKyAgCisgIGlmICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCA9PSBOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisgIGlmIChfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAodHJhbnNwb3J0KSkKKyAgICBuZWVkX3JlYWRfd2F0Y2ggPQorICAgICAgKF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcykgPCB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUpICYmCisgICAgICAoX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA8IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMpOworICBlbHNlCisgICAgeworICAgICAgaWYgKHRyYW5zcG9ydC0+cmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgICAgICBuZWVkX3JlYWRfd2F0Y2ggPSBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIHJlYXNvbiB0byBkaXNhYmxlIG5lZWRfcmVhZF93YXRjaCB3aGVuIG5vdCBXQUlUSU5HX0ZPUl9JTlBVVAorICAgICAgICAgICAqIGlzIHRvIGF2b2lkIHNwaW5uaW5nIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2hlbiB3ZSdyZSB3YWl0aW5nCisgICAgICAgICAgICogdG8gd3JpdGUgb3IgZm9yIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgYXV0aCBwcm9jZXNzCisgICAgICAgICAgICovCisgICAgICAgICAgREJ1c0F1dGhTdGF0ZSBhdXRoX3N0YXRlOworICAgICAgICAgIAorICAgICAgICAgIGF1dGhfc3RhdGUgPSBfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgICAgICAgICAvKiBJZiB3ZSBuZWVkIG1lbW9yeSB3ZSBpbnN0YWxsIHRoZSByZWFkIHdhdGNoIGp1c3QgaW4gY2FzZSwKKyAgICAgICAgICAgKiBpZiB0aGVyZSdzIG5vIG5lZWQgZm9yIGl0LCBpdCB3aWxsIGdldCBkZS1pbnN0YWxsZWQKKyAgICAgICAgICAgKiBuZXh0IHRpbWUgd2UgdHJ5IHJlYWRpbmcuIElmIHdlJ3JlIGF1dGhlbnRpY2F0ZWQgd2UKKyAgICAgICAgICAgKiBpbnN0YWxsIGl0IHNpbmNlIHdlIG5vcm1hbGx5IGhhdmUgaXQgaW5zdGFsbGVkIHdoaWxlCisgICAgICAgICAgICogYXV0aGVudGljYXRlZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQgfHwKKyAgICAgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZIHx8CisgICAgICAgICAgICAgIGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQpCisgICAgICAgICAgICBuZWVkX3JlYWRfd2F0Y2ggPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHNldHRpbmcgcmVhZCB3YXRjaCBlbmFibGVkID0gJWRcbiIsIG5lZWRfcmVhZF93YXRjaCk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9yZWFkX3dhdGNoKTsKKworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19pb19lcnJvciAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworfQorCisvKiByZXR1cm4gdmFsdWUgaXMgd2hldGhlciB3ZSBzdWNjZXNzZnVsbHkgcmVhZCBhbnkgbmV3IGRhdGEuICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlYWRfZGF0YV9pbnRvX2F1dGggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgKm9vbSkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzU3RyaW5nICpidWZmZXI7CisgIGludCBieXRlc19yZWFkOworICBpbnQgc2F2ZWRfZXJybm87CisKKyAgKm9vbSA9IEZBTFNFOworCisgIF9kYnVzX2F1dGhfZ2V0X2J1ZmZlciAodHJhbnNwb3J0LT5hdXRoLCAmYnVmZmVyKTsKKyAgCisgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKTsKKyAgc2F2ZWRfZXJybm8gPSBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAoKTsKKworICBfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+YXV0aCwgYnVmZmVyKTsKKworICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiByZWFkICVkIGJ5dGVzIGluIGF1dGggcGhhc2VcbiIsIGJ5dGVzX3JlYWQpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIC8qIEVJTlRSIGFscmVhZHkgaGFuZGxlZCBmb3IgdXMgKi8KKworICAgICAgaWYgKF9kYnVzX2dldF9pc19lcnJub19lbm9tZW0gKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgeworICAgICAgICAgICpvb20gPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrIChzYXZlZF9lcnJubykpCisgICAgICAgIDsgLyogZG8gbm90aGluZywganVzdCByZXR1cm4gRkFMU0UgYmVsb3cgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfcmVhZCA9PSAwKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RlZCBmcm9tIHJlbW90ZSBhcHBcbiIpOworICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSB3cm90ZSBhbnkgYnl0ZXMgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfZGF0YV9mcm9tX2F1dGggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgaW50IHNhdmVkX2Vycm5vOworICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgaWYgKCFfZGJ1c19hdXRoX2dldF9ieXRlc190b19zZW5kICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikpOworICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgIGlmIChieXRlc193cml0dGVuID4gMCkKKyAgICB7CisgICAgICBfZGJ1c19hdXRoX2J5dGVzX3NlbnQgKHRyYW5zcG9ydC0+YXV0aCwgYnl0ZXNfd3JpdHRlbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIC8qIEVJTlRSIGFscmVhZHkgaGFuZGxlZCBmb3IgdXMgKi8KKyAgICAgIAorICAgICAgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHdyaXRpbmcgdG8gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBGQUxTRSBvbiBPT00gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXhjaGFuZ2VfY3JlZGVudGlhbHMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBkb19yZWFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3dyaXRpbmcpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9kYnVzX3ZlcmJvc2UgKCJleGNoYW5nZV9jcmVkZW50aWFsczogZG9fcmVhZGluZyA9ICVkLCBkb193cml0aW5nID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBkb19yZWFkaW5nLCBkb193cml0aW5nKTsKKworICBpZiAoZG9fd3JpdGluZyAmJiB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZykKKyAgICB7CisgICAgICBpZiAoX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgdHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byB3cml0ZSBjcmVkZW50aWFsczogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGlmIChkb19yZWFkaW5nICYmIHRyYW5zcG9ydC0+cmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgIHsKKyAgICAgIC8qIEZJWE1FIHRoaXMgY2FuIGZhaWwgZHVlIHRvIElPIGVycm9yIF9vcl8gT09NLCBicm9rZW4KKyAgICAgICAqIChzb21ld2hhdCB0cmlja3kgdG8gZml4IHNpbmNlIHRoZSBPT00gZXJyb3IgY2FuIGJlIHNldCBhZnRlcgorICAgICAgICogd2UgYWxyZWFkeSByZWFkIHRoZSBjcmVkZW50aWFscyBieXRlLCBzbyBiYXNpY2FsbHkgd2UgbmVlZCB0bworICAgICAgICogc2VwYXJhdGUgcmVhZGluZyB0aGUgYnl0ZSBhbmQgc3RvcmluZyBpdCBpbiB0aGUKKyAgICAgICAqIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMpLiBEb2VzIG5vdCByZWFsbHkgbWF0dGVyIGZvciBub3cKKyAgICAgICAqIGJlY2F1c2Ugc3RvcmluZyBpbiBjcmVkZW50aWFscyBuZXZlciBhY3R1YWxseSBmYWlscyBvbiB1bml4LgorICAgICAgICovICAgICAgCisgICAgICBpZiAoX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byByZWFkIGNyZWRlbnRpYWxzICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCEodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX2F1dGhlbnRpY2F0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZG9fcmVhZGluZywKKyAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBkb193cml0aW5nLAorCQkgICBkYnVzX2Jvb2xfdCAgICphdXRoX2NvbXBsZXRlZCkKK3sKKyAgZGJ1c19ib29sX3Qgb29tOworICBkYnVzX2Jvb2xfdCBvcmlnX2F1dGhfc3RhdGU7CisKKyAgb29tID0gRkFMU0U7CisgIAorICBvcmlnX2F1dGhfc3RhdGUgPSBfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAodHJhbnNwb3J0KTsKKworICAvKiBUaGlzIGlzIGVzc2VudGlhbCB0byBhdm9pZCB0aGUgY2hlY2tfd3JpdGVfd2F0Y2goKSBhdCB0aGUgZW5kLAorICAgKiB3ZSBkb24ndCB3YW50IHRvIGFkZCBhIHdyaXRlIHdhdGNoIGluIGRvX2l0ZXJhdGlvbiBiZWZvcmUKKyAgICogd2UgdHJ5IHdyaXRpbmcgYW5kIGdldCBFQUdBSU4KKyAgICovCisgIGlmIChvcmlnX2F1dGhfc3RhdGUpCisgICAgeworICAgICAgaWYgKGF1dGhfY29tcGxldGVkKQorICAgICAgICAqYXV0aF9jb21wbGV0ZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIAorICB3aGlsZSAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpICYmCisgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAodHJhbnNwb3J0KSkKKyAgICB7ICAgICAgCisgICAgICBpZiAoIWV4Y2hhbmdlX2NyZWRlbnRpYWxzICh0cmFuc3BvcnQsIGRvX3JlYWRpbmcsIGRvX3dyaXRpbmcpKQorICAgICAgICB7CisgICAgICAgICAgLyogT09NICovCisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSAlZCByZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworI2RlZmluZSBUUkFOU1BPUlRfU0lERSh0KSAoKHQpLT5pc19zZXJ2ZXIgPyAic2VydmVyIiA6ICJjbGllbnQiKQorICAgICAgc3dpdGNoIChfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCkpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiB3YWl0aW5nIGZvciBpbnB1dFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgaWYgKCFkb19yZWFkaW5nIHx8ICFyZWFkX2RhdGFfaW50b19hdXRoICh0cmFuc3BvcnQsICZvb20pKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogd2FpdGluZyBmb3IgbWVtb3J5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORDoKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IGJ5dGVzIHRvIHNlbmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIGlmICghZG9fd3JpdGluZyB8fCAhd3JpdGVfZGF0YV9mcm9tX2F1dGggKHRyYW5zcG9ydCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiBuZWVkIHRvIGRpc2Nvbm5lY3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQ6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiBhdXRoZW50aWNhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgaWYgKGF1dGhfY29tcGxldGVkKQorICAgICphdXRoX2NvbXBsZXRlZCA9IChvcmlnX2F1dGhfc3RhdGUgIT0gX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKHRyYW5zcG9ydCkpOworICAKKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKKyAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKworICBpZiAob29tKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIGZhbHNlIG9uIG9vbSAqLworc3RhdGljIGRidXNfYm9vbF90Citkb193cml0aW5nIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIGludCB0b3RhbDsKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBkYnVzX2Jvb2xfdCBvb207CisgIAorICAvKiBObyBtZXNzYWdlcyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uISAqLworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJOb3QgYXV0aGVudGljYXRlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90IGNvbm5lY3RlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisjaWYgMQorICBfZGJ1c192ZXJib3NlICgiZG9fd3JpdGluZygpLCBoYXZlX21lc3NhZ2VzID0gJWQsIGZkID0gJSIgREJVU19TT0NLRVRfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKHNvY2tldF90cmFuc3BvcnQtPmZkKSk7CisjZW5kaWYKKyAgCisgIG9vbSA9IEZBTFNFOworICB0b3RhbCA9IDA7CisKKyAgd2hpbGUgKCF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCAmJgorICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAgICAgY29uc3QgREJ1c1N0cmluZyAqaGVhZGVyOworICAgICAgY29uc3QgREJ1c1N0cmluZyAqYm9keTsKKyAgICAgIGludCBoZWFkZXJfbGVuLCBib2R5X2xlbjsKKyAgICAgIGludCB0b3RhbF9ieXRlc190b193cml0ZTsKKyAgICAgIGludCBzYXZlZF9lcnJubzsKKyAgICAgIAorICAgICAgaWYgKHRvdGFsID4gc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3dyaXR0ZW5fcGVyX2l0ZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlZCBieXRlcyBleGNlZWRzICVkIGJ5dGVzIHdyaXR0ZW4gcGVyIGl0ZXJhdGlvbiwgcmV0dXJuaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsLCBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBtZXNzYWdlID0gX2RidXNfY29ubmVjdGlvbl9nZXRfbWVzc2FnZV90b19zZW5kICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICAgICAgZGJ1c19tZXNzYWdlX2xvY2sgKG1lc3NhZ2UpOworCisjaWYgMAorICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisjZW5kaWYKKyAgICAgIAorICAgICAgX2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLCAmYm9keSk7CisKKyAgICAgIGhlYWRlcl9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoaGVhZGVyKTsKKyAgICAgIGJvZHlfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJvZHkpOworCisgICAgICBpZiAoX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZyAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERvZXMgZmQgcGFzc2luZyBldmVuIG1ha2Ugc2Vuc2Ugd2l0aCBlbmNvZGVkIGRhdGE/ICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0KCFEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHRyYW5zcG9ydCkpOworCisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX2VuY29kZV9kYXRhICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCAmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfYXV0aF9lbmNvZGVfZGF0YSAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDApOworICAgICAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZyk7CisKKyNpZiAwCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImVuY29kZWQgbWVzc2FnZSBpcyAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICBieXRlc193cml0dGVuID0KKyAgICAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlIC0gc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuKTsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSA9IGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKworI2lmIDAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibWVzc2FnZSBpcyAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8PSAwICYmIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2VuZCB0aGUgZmRzIGFsb25nIHdpdGggdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgY29uc3QgaW50ICp1bml4X2ZkczsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbjsKKworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyhtZXNzYWdlLCAmdW5peF9mZHMsICZuKTsKKworICAgICAgICAgICAgICBieXRlc193cml0dGVuID0KKyAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2Zkc190d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisgICAgICAgICAgICAgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwICYmIG4gPiAwKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIldyb3RlICVpIHVuaXggZmRzXG4iLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8IGhlYWRlcl9sZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldF90d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYm9keV9sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiAtIGhlYWRlcl9sZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuIC0gaGVhZGVyX2xlbikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVJTlRSIGFscmVhZHkgaGFuZGxlZCBmb3IgdXMgKi8KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBJZiB0aGUgb3RoZXIgZW5kIGNsb3NlZCB0aGUgc29ja2V0IHdpdGggY2xvc2UoKSBvciBzaHV0ZG93bigpLCB3ZQorICAgICAgICAgICAqIHJlY2VpdmUgRVBJUEUgaGVyZSBidXQgd2UgbXVzdCBub3QgY2xvc2UgdGhlIHNvY2tldCB5ZXQ6IHRoZXJlCisgICAgICAgICAgICogbWlnaHQgc3RpbGwgYmUgc29tZSBkYXRhIHRvIHJlYWQuIFNlZToKKyAgICAgICAgICAgKiBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwOC1NYXJjaC8wMDk1MjYuaHRtbAorICAgICAgICAgICAqLworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrIChzYXZlZF9lcnJubykgfHwgX2RidXNfZ2V0X2lzX2Vycm5vX2VwaXBlIChzYXZlZF9lcnJubykpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIC8qIFNpbmNlIExpbnV4IGNvbW1pdCAyNTg4OGUgKGZyb20gMi42LjM3LXJjNCwgTm92IDIwMTApLCBzZW5kbXNnKCkKKyAgICAgICAgICAgKiBvbiBVbml4IHNvY2tldHMgcmV0dXJucyAtMSBlcnJubz1FVE9PTUFOWVJFRlMgd2hlbiB0aGUgcGFzc2ZkCisgICAgICAgICAgICogbWVjaGFuaXNtIChTQ01fUklHSFRTKSBpcyB1c2VkIHJlY3Vyc2l2ZWx5IHdpdGggYSByZWN1cnNpb24gbGV2ZWwKKyAgICAgICAgICAgKiBvZiBtYXhpbXVtIDQuIFRoZSBrZXJuZWwgZG9lcyBub3QgaGF2ZSBhbiBBUEkgdG8gY2hlY2sgd2hldGhlcgorICAgICAgICAgICAqIHRoZSBwYXNzZWQgZmRzIGNhbiBiZSBmb3J3YXJkZWQgYW5kIGl0IGNhbiBjaGFuZ2UgYXN5bmNocm9ub3VzbHkuCisgICAgICAgICAgICogU2VlOgorICAgICAgICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTgwMTYzCisgICAgICAgICAgICovCisKKyAgICAgICAgICBlbHNlIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZXRvb21hbnlyZWZzIChzYXZlZF9lcnJubykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIG9ubHkgc2VuZCBmZHMgaW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAqIEVUT09NQU5ZUkVGUyBjYW5ub3QgaGFwcGVuIGFmdGVyLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPT0gMCk7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBkaXNjYXJkIG1lc3NhZ2Ugb2YgJWQgYnl0ZXMgZHVlIHRvIEVUT09NQU5ZUkVGU1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19jb21wYWN0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMjA0OCk7CisKKyAgICAgICAgICAgICAgLyogVGhlIG1lc3NhZ2Ugd2FzIG5vdCBhY3R1YWxseSBzZW50IGJ1dCBpdCBuZWVkcyB0byBiZSByZW1vdmVkCisgICAgICAgICAgICAgICAqIGZyb20gdGhlIG91dGdvaW5nIHF1ZXVlCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igd3JpdGluZyB0byByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiB3cm90ZSAlZCBieXRlcyBvZiAlZFxuIiwgYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisgICAgICAgICAgCisgICAgICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfd3JpdHRlbjsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuIDw9CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9PSB0b3RhbF9ieXRlc190b193cml0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nLCAwKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nLCAyMDQ4KTsKKworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgIGlmIChvb20pCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHJldHVybnMgZmFsc2Ugb24gb3V0LW9mLW1lbW9yeSAqLworc3RhdGljIGRidXNfYm9vbF90Citkb19yZWFkaW5nIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgREJ1c1N0cmluZyAqYnVmZmVyOworICBpbnQgYnl0ZXNfcmVhZDsKKyAgaW50IHRvdGFsOworICBkYnVzX2Jvb2xfdCBvb207CisgIGludCBzYXZlZF9lcnJubzsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlIiBEQlVTX1NPQ0tFVF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc29ja2V0X3ByaW50YWJsZSAoc29ja2V0X3RyYW5zcG9ydC0+ZmQpKTsKKyAgCisgIC8qIE5vIG1lc3NhZ2VzIHdpdGhvdXQgYXV0aGVudGljYXRpb24hICovCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKHRyYW5zcG9ydCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgb29tID0gRkFMU0U7CisgIAorICB0b3RhbCA9IDA7CisKKyBhZ2FpbjoKKyAgCisgIC8qIFNlZSBpZiB3ZSd2ZSBleGNlZWRlZCBtYXggbWVzc2FnZXMgYW5kIG5lZWQgdG8gZGlzYWJsZSByZWFkaW5nICovCisgIGNoZWNrX3JlYWRfd2F0Y2ggKHRyYW5zcG9ydCk7CisgIAorICBpZiAodG90YWwgPiBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlZCBieXRlcyBleGNlZWRzICVkIGJ5dGVzIHJlYWQgcGVyIGl0ZXJhdGlvbiwgcmV0dXJuaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG90YWwsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpOworICAKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCkpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBpZiAoX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICB7CisgICAgICAvKiBEb2VzIGZkIHBhc3NpbmcgZXZlbiBtYWtlIHNlbnNlIHdpdGggZW5jb2RlZCBkYXRhPyAqLworICAgICAgX2RidXNfYXNzZXJ0KCFEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHRyYW5zcG9ydCkpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nKSA+IDApCisgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworICAgICAgZWxzZQorICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pOworCisgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZykgPT0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCk7CisgICAgICAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX2RlY29kZV9kYXRhICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJPdXQgb2YgbWVtb3J5IGRlY29kaW5nIGluY29taW5nIGRhdGFcbiIpOworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworCisgICAgICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZywgMCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLCAyMDQ4KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaWYgKERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIGludCAqZmRzLCBuX2ZkczsKKworICAgICAgICAgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKHRyYW5zcG9ydC0+bG9hZGVyLCAmZmRzLCAmbl9mZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiT3V0IG9mIG1lbW9yeSByZWFkaW5nIGZpbGUgZGVzY3JpcHRvcnNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2Zkcyhzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHMsICZuX2Zkcyk7CisgICAgICAgICAgc2F2ZWRfZXJybm8gPSBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAoKTsKKworICAgICAgICAgIGlmIChieXRlc19yZWFkID49IDAgJiYgbl9mZHMgPiAwKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSgiUmVhZCAlaSB1bml4IGZkc1xuIiwgbl9mZHMpOworCisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX3VuaXhfZmRzKHRyYW5zcG9ydC0+bG9hZGVyLCBmZHMsIGJ5dGVzX3JlYWQgPCAwID8gMCA6IG5fZmRzKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKTsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgICB9CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIC8qIEVJTlRSIGFscmVhZHkgaGFuZGxlZCBmb3IgdXMgKi8KKworICAgICAgaWYgKF9kYnVzX2dldF9pc19lcnJub19lbm9tZW0gKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJPdXQgb2YgbWVtb3J5IGluIHJlYWQoKS9kb19yZWFkaW5nKClcbiIpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBhcHA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChieXRlc19yZWFkID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RlZCBmcm9tIHJlbW90ZSBhcHBcbiIpOworICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIHJlYWQgJWQgYnl0ZXNcbiIsIGJ5dGVzX3JlYWQpOworICAgICAgCisgICAgICB0b3RhbCArPSBieXRlc19yZWFkOyAgICAgIAorCisgICAgICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBvdXQgb2YgbWVtb3J5IHdoZW4gcXVldWVpbmcgbWVzc2FnZXMgd2UganVzdCByZWFkIGluIHRoZSB0cmFuc3BvcnRcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIFRyeSByZWFkaW5nIG1vcmUgZGF0YSB1bnRpbCB3ZSBnZXQgRUFHQUlOIGFuZCByZXR1cm4sIG9yCisgICAgICAgKiBleGNlZWQgbWF4IGJ5dGVzIHBlciBpdGVyYXRpb24uICBJZiBpbiBibG9ja2luZyBtb2RlIG9mCisgICAgICAgKiBjb3Vyc2Ugd2UnbGwgYmxvY2sgaW5zdGVhZCBvZiByZXR1cm5pbmcuCisgICAgICAgKi8KKyAgICAgIGdvdG8gYWdhaW47CisgICAgfQorCisgb3V0OgorICBpZiAob29tKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3VuaXhfZXJyb3Jfd2l0aF9yZWFkX3RvX2NvbWUgKERCdXNUcmFuc3BvcnQgKml0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICp0cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCAqKSBpdHJhbnNwb3J0OworCisgIGlmICghKGZsYWdzICYgREJVU19XQVRDSF9IQU5HVVAgfHwgZmxhZ3MgJiBEQlVTX1dBVENIX0VSUk9SKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgLyogSWYgd2UgaGF2ZSBhIHJlYWQgd2F0Y2ggZW5hYmxlZCAuLi4KKyAgICAgd2UgLW1pZ2h0IGhhdmUgZGF0YSBpbmNvbWluZyAuLi4gPT4gaGFuZGxlIHRoZSBIQU5HVVAgdGhlcmUgKi8KKyAgaWYgKHdhdGNoICE9IHRyYW5zcG9ydC0+cmVhZF93YXRjaCAmJgorICAgICAgX2RidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKHRyYW5zcG9ydC0+cmVhZF93YXRjaCkpCisgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgIHJldHVybiBUUlVFOyAKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfaGFuZGxlX3dhdGNoIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c19hc3NlcnQgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggfHwKKyAgICAgICAgICAgICAgICB3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggIT0gTlVMTCk7CisgIAorICAvKiBJZiB3ZSBoaXQgYW4gZXJyb3IgaGVyZSBvbiBhIHdyaXRlIHdhdGNoLCBkb24ndCBkaXNjb25uZWN0IHRoZSB0cmFuc3BvcnQgeWV0IGJlY2F1c2UgZGF0YSBjYW4KKyAgICogc3RpbGwgYmUgaW4gdGhlIGJ1ZmZlciBhbmQgZG9fcmVhZGluZyBtYXkgbmVlZCBzZXZlcmFsIGl0ZXJhdGlvbiB0byByZWFkCisgICAqIGl0IGFsbCAoYmVjYXVzZSBvZiBpdHMgbWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbiBsaW1pdCkuIAorICAgKi8KKyAgaWYgKCEoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSAmJiB1bml4X2Vycm9yX3dpdGhfcmVhZF90b19jb21lICh0cmFuc3BvcnQsIHdhdGNoLCBmbGFncykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkhhbmcgdXAgb3IgZXJyb3Igb24gd2F0Y2hcbiIpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIAorICBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCAmJgorICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkpCisgICAgeworICAgICAgZGJ1c19ib29sX3QgYXV0aF9maW5pc2hlZDsKKyNpZiAxCisgICAgICBfZGJ1c192ZXJib3NlICgiaGFuZGxpbmcgcmVhZCB3YXRjaCAlcCBmbGFncyA9ICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGZsYWdzKTsKKyNlbmRpZgorICAgICAgaWYgKCFkb19hdXRoZW50aWNhdGlvbiAodHJhbnNwb3J0LCBUUlVFLCBGQUxTRSwgJmF1dGhfZmluaXNoZWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZG8gYSByZWFkIGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogYSBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBpcyBzbyB3ZQorICAgICAgICogaGF2ZSBhIGNoYW5jZSB0byBwcm9wYWdhdGUgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgKiBzdGF0ZSBmdXJ0aGVyIHVwLiAgU3BlY2lmaWNhbGx5LCB3ZSBuZWVkIHRvCisgICAgICAgKiBwcm9jZXNzIGFueSBwZW5kaW5nIGRhdGEgZnJvbSB0aGUgYXV0aCBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGlmICghYXV0aF9maW5pc2hlZCkKKwl7CisJICBpZiAoIWRvX3JlYWRpbmcgKHRyYW5zcG9ydCkpCisJICAgIHsKKwkgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIHJlYWRcbiIpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJOb3QgcmVhZGluZyBhbnl0aGluZyBzaW5jZSB3ZSBqdXN0IGNvbXBsZXRlZCB0aGUgYXV0aGVudGljYXRpb25cbiIpOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCAmJgorICAgICAgICAgICAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKSkKKyAgICB7CisjaWYgMQorICAgICAgX2RidXNfdmVyYm9zZSAoImhhbmRsaW5nIHdyaXRlIHdhdGNoLCBoYXZlX291dGdvaW5nX21lc3NhZ2VzID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKTsKKyNlbmRpZgorICAgICAgaWYgKCFkb19hdXRoZW50aWNhdGlvbiAodHJhbnNwb3J0LCBGQUxTRSwgVFJVRSwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKCFkb193cml0aW5nICh0cmFuc3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byB3cml0ZVxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIFNlZSBpZiB3ZSBzdGlsbCBuZWVkIHRoZSB3cml0ZSB3YXRjaCAqLworICAgICAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisgICAgfQorI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBlbHNlCisgICAgeworICAgICAgaWYgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhc2tlZCB0byBoYW5kbGUgcmVhZCB3YXRjaCB3aXRoIG5vbi1yZWFkIGNvbmRpdGlvbiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICBlbHNlIGlmICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCkKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImFza2VkIHRvIGhhbmRsZSB3cml0ZSB3YXRjaCB3aXRoIG5vbi13cml0ZSBjb25kaXRpb24gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c192ZXJib3NlICgiYXNrZWQgdG8gaGFuZGxlIHdhdGNoICVwIG9uIGZkICUiIERCVVNfU09DS0VUX0ZPUk1BVCAiIHRoYXQgd2UgZG9uJ3QgcmVjb2duaXplXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3YXRjaCkpOworICAgIH0KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NvY2tldF9kaXNjb25uZWN0IChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKyAgCisgIGZyZWVfd2F0Y2hlcyAodHJhbnNwb3J0KTsKKyAgCisgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsIE5VTEwpOworICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJnNvY2tldF90cmFuc3BvcnQtPmZkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfY29ubmVjdGlvbl9zZXQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9zZXRfaGFuZGxlciAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAdG9kbyBXZSBuZWVkIHRvIGhhdmUgYSB3YXkgdG8gd2FrZSB1cCB0aGUgc2VsZWN0IHNsZWVwIGlmCisgKiBhIG5ldyBpdGVyYXRpb24gcmVxdWVzdCBjb21lcyBpbiB3aXRoIGEgZmxhZyAocmVhZC93cml0ZSkgdGhhdAorICogd2UncmUgbm90IGN1cnJlbnRseSBzZXJ2aW5nLiBPdGhlcndpc2UgYSBjYWxsIHRoYXQganVzdCByZWFkcworICogY291bGQgYmxvY2sgYSB3cml0ZSBjYWxsIGZvcmV2ZXIgKGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZworICogbWVzc2FnZXMpLgorICovCitzdGF0aWMgIHZvaWQKK3NvY2tldF9kb19pdGVyYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzUG9sbEZEIHBvbGxfZmQ7CisgIGludCBwb2xsX3JlczsKKyAgaW50IHBvbGxfdGltZW91dDsKKworICBfZGJ1c192ZXJib3NlICgiIGl0ZXJhdGlvbiBmbGFncyA9ICVzJXMgdGltZW91dCA9ICVkIHJlYWRfd2F0Y2ggPSAlcCB3cml0ZV93YXRjaCA9ICVwIGZkID0gJSIgREJVU19TT0NLRVRfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyA/ICJyZWFkIiA6ICIiLAorICAgICAgICAgICAgICAgICBmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgPyAid3JpdGUiIDogIiIsCisgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgX2RidXNfc29ja2V0X3ByaW50YWJsZSAoc29ja2V0X3RyYW5zcG9ydC0+ZmQpKTsKKyAgCisgIC8qIHRoZSBwYXNzZWQgaW4gRE9fUkVBRElORy9ET19XUklUSU5HIGZsYWdzIGluZGljYXRlIHdoZXRoZXIgdG8KKyAgICogcmVhZC93cml0ZSBtZXNzYWdlcywgYnV0IHJlZ2FyZGxlc3Mgb2YgdGhvc2Ugd2UgbWF5IG5lZWQgdG8gYmxvY2sKKyAgICogZm9yIHJlYWRpbmcvd3JpdGluZyB0byBkbyBhdXRoLiAgQnV0IGlmIHdlIGRvIHJlYWRpbmcgZm9yIGF1dGgsCisgICAqIHdlIGRvbid0IHdhbnQgdG8gcmVhZCBhbnkgbWVzc2FnZXMgeWV0IGlmIG5vdCBnaXZlbiBET19SRUFESU5HLgorICAgKi8KKworICBwb2xsX2ZkLmZkID0gX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAoc29ja2V0X3RyYW5zcG9ydC0+ZmQpOworICBwb2xsX2ZkLmV2ZW50cyA9IDA7CisgIAorICBpZiAoX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKHRyYW5zcG9ydCkpCisgICAgeworICAgICAgLyogVGhpcyBpcyBraW5kIG9mIGEgaGFjazsgaWYgd2UgaGF2ZSBzdHVmZiB0byB3cml0ZSwgdGhlbiB0cnkKKyAgICAgICAqIHRvIGF2b2lkIHRoZSBwb2xsLiBUaGlzIGlzIHByb2JhYmx5IGFib3V0IGEgNSUgc3BlZWR1cCBvbiBhbgorICAgICAgICogZWNobyBjbGllbnQvc2VydmVyLgorICAgICAgICoKKyAgICAgICAqIElmIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyB3ZXJlIHJlcXVlc3RlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCisgICAgICAgKiBzaW5jZSBpdCBjb3VsZCBoYXZlIGZ1bmt5IGVmZmVjdHM6CisgICAgICAgKiAgIC0gYm90aCBlbmRzIHNwaW5uaW5nIHdhaXRpbmcgZm9yIHRoZSBvdGhlciBvbmUgdG8gcmVhZAorICAgICAgICogICAgIGRhdGEgc28gdGhleSBjYW4gZmluaXNoIHdyaXRpbmcKKyAgICAgICAqICAgLSBwcmlvcml0aXppbmcgYWxsIHdyaXRpbmcgYWhlYWQgb2YgcmVhZGluZworICAgICAgICovCisgICAgICBpZiAoKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykgJiYKKyAgICAgICAgICAhKGZsYWdzICYgKERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfCBEQlVTX0lURVJBVElPTl9CTE9DSykpICYmCisgICAgICAgICAgIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkICYmCisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIGRvX3dyaXRpbmcgKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgfHwKKyAgICAgICAgICAgICAgIV9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgZGVjaWRlZCB0byBkbyB0aGUgcG9sbCgpIGFmdGVyIGFsbCAqLworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcpCisJcG9sbF9mZC5ldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcpCisgICAgICAgIHBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0F1dGhTdGF0ZSBhdXRoX3N0YXRlOworICAgICAgCisgICAgICBhdXRoX3N0YXRlID0gX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpOworCisgICAgICBpZiAodHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9JTlBVVCkKKwlwb2xsX2ZkLmV2ZW50cyB8PSBfREJVU19QT0xMSU47CisKKyAgICAgIGlmICh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgIGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORCkKKwlwb2xsX2ZkLmV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworICAgIH0KKworICBpZiAocG9sbF9mZC5ldmVudHMpCisgICAgeworICAgICAgaW50IHNhdmVkX2Vycm5vOworCisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9CTE9DSykKKwlwb2xsX3RpbWVvdXQgPSB0aW1lb3V0X21pbGxpc2Vjb25kczsKKyAgICAgIGVsc2UKKwlwb2xsX3RpbWVvdXQgPSAwOworCisgICAgICAvKiBGb3IgYmxvY2tpbmcgc2VsZWN0cyB3ZSBkcm9wIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVyZQorICAgICAgICogdG8gYXZvaWQgYmxvY2tpbmcgb3V0IGNvbm5lY3Rpb24gYWNjZXNzIGR1cmluZyBhIHBvdGVudGlhbGx5CisgICAgICAgKiBpbmRlZmluaXRlIGJsb2NraW5nIGNhbGwuIFRoZSBpbyBwYXRoIGlzIHN0aWxsIHByb3RlY3RlZAorICAgICAgICogYnkgdGhlIGlvX3BhdGhfY29uZCBjb25kdmFyLCBzbyB3ZSB3b24ndCByZWVudGVyIHRoaXMuCisgICAgICAgKi8KKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0JMT0NLKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9jayBwcmUgcG9sbFxuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgIGFnYWluOgorICAgICAgcG9sbF9yZXMgPSBfZGJ1c19wb2xsICgmcG9sbF9mZCwgMSwgcG9sbF90aW1lb3V0KTsKKyAgICAgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisKKyAgICAgIGlmIChwb2xsX3JlcyA8IDAgJiYgX2RidXNfZ2V0X2lzX2Vycm5vX2VpbnRyIChzYXZlZF9lcnJubykpCisJZ290byBhZ2FpbjsKKworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHBvbGxcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocG9sbF9yZXMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwb2xsX3JlcyA9PSAwKQorICAgICAgICAgICAgcG9sbF9mZC5yZXZlbnRzID0gMDsgLyogc29tZSBjb25jZXJuIHRoYXQgcG9zaXggZG9lcyBub3QgZ3VhcmFudGVlIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWxncmluZCBmbGFncyBpdCBhcyBhbiBlcnJvci4gdGhvdWdoIGl0IHByb2JhYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBndWFyYW50ZWVkIG9uIGxpbnV4IGF0IGxlYXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgCisgICAgICAgICAgaWYgKHBvbGxfZmQucmV2ZW50cyAmIF9EQlVTX1BPTExFUlIpCisgICAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG5lZWRfcmVhZCA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMSU4pID4gMDsKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgbmVlZF93cml0ZSA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMT1VUKSA+IDA7CisJICAgICAgZGJ1c19ib29sX3QgYXV0aGVudGljYXRpb25fY29tcGxldGVkOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbiBpdGVyYXRpb24sIG5lZWRfcmVhZD0lZCBuZWVkX3dyaXRlPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWQsIG5lZWRfd3JpdGUpOworICAgICAgICAgICAgICBkb19hdXRoZW50aWNhdGlvbiAodHJhbnNwb3J0LCBuZWVkX3JlYWQsIG5lZWRfd3JpdGUsCisJCQkJICZhdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpOworCisJICAgICAgLyogU2VlIGNvbW1lbnQgaW4gc29ja2V0X2hhbmRsZV93YXRjaC4gKi8KKwkgICAgICBpZiAoYXV0aGVudGljYXRpb25fY29tcGxldGVkKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChuZWVkX3JlYWQgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykpCisgICAgICAgICAgICAgICAgZG9fcmVhZGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgaWYgKG5lZWRfd3JpdGUgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykpCisgICAgICAgICAgICAgICAgZG9fd3JpdGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGZyb20gX2RidXNfcG9sbCgpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgfQorICAgIH0KKworCisgb3V0OgorICAvKiBXZSBuZWVkIHRvIGluc3RhbGwgdGhlIHdyaXRlIHdhdGNoIG9ubHkgaWYgd2UgZGlkIG5vdAorICAgKiBzdWNjZXNzZnVsbHkgd3JpdGUgZXZlcnl0aGluZy4gTm90ZSB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCB3ZQorICAgKiBkb24ndCBjYWxsIGNoZWNrX3dyaXRlX3dhdGNoICpiZWZvcmUqIGRvX3dyaXRpbmcsIHNpbmNlIGl0J3MKKyAgICogaW5lZmZpY2llbnQgdG8gYWRkIHRoZSB3cml0ZSB3YXRjaCwgYW5kIHdlIGNhbiBhdm9pZCBpdCBtb3N0IG9mCisgICAqIHRoZSB0aW1lIHNpbmNlIHdlIGNhbiB3cml0ZSBpbW1lZGlhdGVseS4KKyAgICogCisgICAqIEhvd2V2ZXIsIHdlIE1VU1QgYWx3YXlzIGNhbGwgY2hlY2tfd3JpdGVfd2F0Y2goKTsgREJ1c0Nvbm5lY3Rpb24gY29kZQorICAgKiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBydW5uaW5nIGFuIGl0ZXJhdGlvbiB3aWxsIG5vdGljZSB0aGF0CisgICAqIG1lc3NhZ2VzIGFyZSBwZW5kaW5nLgorICAgKi8KKyAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gbGVhdmluZyBkb19pdGVyYXRpb24oKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfbGl2ZV9tZXNzYWdlc19jaGFuZ2VkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIC8qIFNlZSBpZiB3ZSBzaG91bGQgbG9vayBmb3IgaW5jb21pbmcgbWVzc2FnZXMgYWdhaW4gKi8KKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9nZXRfc29ja2V0X2ZkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAgICAqZmRfcCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICAKKyAgKmZkX3AgPSBzb2NrZXRfdHJhbnNwb3J0LT5mZDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSBzb2NrZXRfdnRhYmxlID0geworICBzb2NrZXRfZmluYWxpemUsCisgIHNvY2tldF9oYW5kbGVfd2F0Y2gsCisgIHNvY2tldF9kaXNjb25uZWN0LAorICBzb2NrZXRfY29ubmVjdGlvbl9zZXQsCisgIHNvY2tldF9kb19pdGVyYXRpb24sCisgIHNvY2tldF9saXZlX21lc3NhZ2VzX2NoYW5nZWQsCisgIHNvY2tldF9nZXRfc29ja2V0X2ZkCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gc29ja2V0IGZpbGUgZGVzY3JpcHRvci4gIFRoZSBmaWxlCisgKiBkZXNjcmlwdG9yIG11c3QgYmUgbm9uYmxvY2tpbmcgKHVzZSBfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcoKSB0bworICogbWFrZSBpdCBzbykuIFRoaXMgZnVuY3Rpb24gaXMgc2hhcmVkIGJ5IHZhcmlvdXMgdHJhbnNwb3J0cyB0aGF0CisgKiBib2lsIGRvd24gdG8gYSBmdWxsIGR1cGxleCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gc2VydmVyX2d1aWQgbm9uLSNOVUxMIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSB0cmFuc3BvcnQncyBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQ7CisgIAorICBzb2NrZXRfdHJhbnNwb3J0ID0gZGJ1c19uZXcwIChEQnVzVHJhbnNwb3J0U29ja2V0LCAxKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykpCisgICAgZ290byBmYWlsZWRfMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZykpCisgICAgZ290byBmYWlsZWRfMTsKKyAgCisgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChfZGJ1c19zb2NrZXRfZ2V0X3BvbGxhYmxlIChmZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9XUklUQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMjsKKyAgCisgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKF9kYnVzX3NvY2tldF9nZXRfcG9sbGFibGUgKGZkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzM7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlICgmc29ja2V0X3RyYW5zcG9ydC0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZ3VpZCwgYWRkcmVzcykpCisgICAgZ290byBmYWlsZWRfNDsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoc29ja2V0X3RyYW5zcG9ydC0+YmFzZS5hdXRoLCBfZGJ1c19zb2NrZXRfY2FuX3Bhc3NfdW5peF9mZChmZCkpOworI2VuZGlmCisKKyAgc29ja2V0X3RyYW5zcG9ydC0+ZmQgPSBmZDsKKyAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuID0gMDsKKyAgCisgIC8qIFRoZXNlIHZhbHVlcyBzaG91bGQgcHJvYmFibHkgYmUgdHVuYWJsZSBvciBzb21ldGhpbmcuICovICAgICAKKyAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbiA9IDIwNDg7CisgIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc193cml0dGVuX3Blcl9pdGVyYXRpb24gPSAyMDQ4OworICAKKyAgcmV0dXJuIChEQnVzVHJhbnNwb3J0Kikgc29ja2V0X3RyYW5zcG9ydDsKKworIGZhaWxlZF80OgorICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworIGZhaWxlZF8zOgorICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgZmFpbGVkXzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZyk7CisgZmFpbGVkXzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZyk7CisgZmFpbGVkXzA6CisgIGRidXNfZnJlZSAoc29ja2V0X3RyYW5zcG9ydCk7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gaG9zdG5hbWUgYW5kIHBvcnQuCisgKiBJZiBob3N0IGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byBsb2NhbGhvc3QKKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gZmFtaWx5IHRoZSBhZGRyZXNzIGZhbWlseSB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gbm9uY2VmaWxlIHBhdGggdG8gbm9uY2UgZmlsZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NvY2tldCBmZDsKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGhvc3QgPT0gTlVMTCkKKyAgICBob3N0ID0gImxvY2FsaG9zdCI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgbm9uY2VmaWxlID8gIm5vbmNlLXRjcDoiIDogInRjcDoiKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJob3N0PSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGhvc3QpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixwb3J0PSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHBvcnQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGZhbWlseSAhPSBOVUxMICYmCisgICAgICAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLGZhbWlseT0iKSB8fAorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgZmFtaWx5KSkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwgJiYKKyAgICAgICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIsbm9uY2VmaWxlPSIpIHx8CisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBub25jZWZpbGUpKSkKKyAgICBnb3RvIGVycm9yOworCisgIGZkID0gX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGhvc3QsIHBvcnQsIGZhbWlseSwgbm9uY2VmaWxlLCBlcnJvcik7CisgIGlmICghX2RidXNfc29ja2V0X2lzX3ZhbGlkIChmZCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0Y3Agc29ja2V0ICVzOiVzXG4iLAorICAgICAgICAgICAgICAgICBob3N0LCBwb3J0KTsKKyAgCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZCwgTlVMTCk7CisgICAgICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJmZkKTsKKyAgICB9CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKKworZXJyb3I6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBPcGVucyBhIFRDUCBzb2NrZXQgdHJhbnNwb3J0LgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcgYXMgYSB0Y3AgdHJhbnNwb3J0LgorICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0KERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworICBkYnVzX2Jvb2xfdCBpc1RjcDsKKyAgZGJ1c19ib29sX3QgaXNOb25jZVRjcDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlzVGNwID0gc3RyY21wIChtZXRob2QsICJ0Y3AiKSA9PSAwOworICBpc05vbmNlVGNwID0gc3RyY21wIChtZXRob2QsICJub25jZS10Y3AiKSA9PSAwOworCisgIGlmIChpc1RjcCB8fCBpc05vbmNlVGNwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImhvc3QiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInBvcnQiKTsKKyAgICAgIGNvbnN0IGNoYXIgKmZhbWlseSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZmFtaWx5Iik7CisgICAgICBjb25zdCBjaGFyICpub25jZWZpbGUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5vbmNlZmlsZSIpOworCisgICAgICBpZiAoKGlzTm9uY2VUY3AgPT0gVFJVRSkgIT0gKG5vbmNlZmlsZSAhPSBOVUxMKSkgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIG1ldGhvZCwgIm5vbmNlZmlsZSIsIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgfQorCisgICAgICBpZiAocG9ydCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgbWV0aG9kLCAicG9ydCIsIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGhvc3QsIHBvcnQsIGZhbWlseSwgbm9uY2VmaWxlLCBlcnJvcik7CisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKiogQH0gKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCBiL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNjdmZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgKQEAgLTAsMCArMSw0NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCBTb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfU09DS0VUX0gKKyNkZWZpbmUgREJVU19UUkFOU1BPUlRfU09DS0VUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1RyYW5zcG9ydCogICAgICAgICAgX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0ICAgICAoREJ1c1NvY2tldCAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnNlcnZlcl9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MpOworREJ1c1RyYW5zcG9ydCogICAgICAgICAgX2RidXNfdHJhbnNwb3J0X25ld19mb3JfdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnRPcGVuUmVzdWx0IF9kYnVzX3RyYW5zcG9ydF9vcGVuX3NvY2tldCAgICAgICAgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAgKip0cmFuc3BvcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CisKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiMWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jCkBAIC0wLDAgKzEsNDM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXVuaXguYyBVTklYIHNvY2tldCBzdWJjbGFzc2VzIG9mIERCdXNUcmFuc3BvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUcmFuc3BvcnRVbml4IERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGZvciBVTklYCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1RyYW5zcG9ydCBvbiBVTklYCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gVW5peCBkb21haW4gc29ja2V0CisgKiBwYXRoLiBUaGlzIGNyZWF0ZXMgYSBjbGllbnQtc2lkZSBvZiBhIHRyYW5zcG9ydC4KKyAqCisgKiBAdG9kbyBvbmNlIHdlIGFkZCBhIHdheSB0byBlc2NhcGUgcGF0aHMgaW4gYSBkYnVzCisgKiBhZGRyZXNzLCB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGRvIGVzY2FwaW5nLgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBkb21haW4gc29ja2V0LgorICogQHBhcmFtIGFic3RyYWN0ICNUUlVFIHRvIHVzZSBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhIG5ldyB0cmFuc3BvcnQsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NvY2tldCBmZCA9IERCVVNfU09DS0VUX0lOSVQ7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICgoYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OmFic3RyYWN0PSIpKSB8fAorICAgICAgKCFhYnN0cmFjdCAmJgorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXg6cGF0aD0iKSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgcGF0aCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKyAgCisgIGZkLmZkID0gX2RidXNfY29ubmVjdF91bml4X3NvY2tldCAocGF0aCwgYWJzdHJhY3QsIGVycm9yKTsKKyAgaWYgKGZkLmZkIDwgMCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB1bml4IHNvY2tldCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcGF0aCk7CisKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChmZCwgTlVMTCwgJmFkZHJlc3MpOworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8xOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIAorICByZXR1cm4gdHJhbnNwb3J0OworCisgZmFpbGVkXzE6CisgIF9kYnVzX2Nsb3NlX3NvY2tldCAoZmQsIE5VTEwpOworIGZhaWxlZF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIGJpbmFyeSBhbmQgYXJndW1lbnRzLiBUaGlzCisgKiBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuIFRoZSBwcm9jZXNzIHdpbGwgYmUgZm9ya2VkCisgKiBvZmYgYW5kIGV4ZWN1dGVkIHdpdGggc3RkaW4vc3Rkb3V0IGNvbm5lY3RlZCB0byBhIGxvY2FsIEFGX1VOSVgKKyAqIHNvY2tldC4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhcmd2IFBhcmFtZXRlcnMgbGlzdAorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2V4ZWMgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgICAgIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NvY2tldCBmZCA9IERCVVNfU09DS0VUX0lOSVQ7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICB1bnNpZ25lZCBpOworICBjaGFyICplc2NhcGVkOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBlc2NhcGVkID0gZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSAocGF0aCk7CisgIGlmICghZXNjYXBlZCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peGV4ZWM6cGF0aD0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBlc2NhcGVkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGRidXNfZnJlZSAoZXNjYXBlZCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChlc2NhcGVkKTsKKworICBpZiAoYXJndikKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBzdWNjZXNzOworCisgICAgICAgICAgZXNjYXBlZCA9IGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgKGFyZ3ZbaV0pOworICAgICAgICAgIGlmICghZXNjYXBlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc3VjY2VzcyA9IF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmYWRkcmVzcywgIixhcmd2JXU9JXMiLCBpLCBlc2NhcGVkKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGVzY2FwZWQpOworCisgICAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgZmQuZmQgPSBfZGJ1c19jb25uZWN0X2V4ZWMgKHBhdGgsIGFyZ3YsIGVycm9yKTsKKyAgaWYgKGZkLmZkIDwgMCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gcHJvY2VzcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcGF0aCk7CisKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChmZCwgTlVMTCwgJmFkZHJlc3MpOworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICByZXR1cm4gdHJhbnNwb3J0OworCisgZmFpbGVkOgorICBpZiAoZmQuZmQgPj0gMCkKKyAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGZkLCBOVUxMKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBPcGVucyBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQgdHlwZXMuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZworICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJ1bml4IikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwYXRoIik7CisgICAgICBjb25zdCBjaGFyICp0bXBkaXIgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInRtcGRpciIpOworICAgICAgY29uc3QgY2hhciAqYWJzdHJhY3QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImFic3RyYWN0Iik7CisgICAgICAgICAgCisgICAgICBpZiAodG1wZGlyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB1c2UgdGhlIFwidG1wZGlyXCIgb3B0aW9uIGZvciBhbiBhZGRyZXNzIHRvIGNvbm5lY3QgdG8sIG9ubHkgaW4gYW4gYWRkcmVzcyB0byBsaXN0ZW4gb24iKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorICAgICAgICAgIAorICAgICAgaWYgKHBhdGggPT0gTlVMTCAmJiBhYnN0cmFjdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgInVuaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGggb3IgYWJzdHJhY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKHBhdGggIT0gTlVMTCAmJiBhYnN0cmFjdCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzcGVjaWZ5IGJvdGggXCJwYXRoXCIgYW5kIFwiYWJzdHJhY3RcIiBvcHRpb25zIGluIGFuIGFkZHJlc3MiKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICBpZiAocGF0aCkKKyAgICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCAocGF0aCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCAoYWJzdHJhY3QsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgIGlmICgqdHJhbnNwb3J0X3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgInVuaXhleGVjIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwYXRoOworICAgICAgdW5zaWduZWQgaTsKKyAgICAgIGNoYXIgKiphcmd2OworCisgICAgICBwYXRoID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwYXRoIik7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBwcm9jZXNzIHBhdGggc3BlY2lmaWVkIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgLyogRmlyc3QgY291bnQgYXJndiBhcmd1bWVudHMgKi8KKyAgICAgIGZvciAoaSA9IDE7IDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgY2hhciB0WzQrMjArMV07IC8qICJhcmd2IiBwbHVzIHNwYWNlIGZvciBhIGZvcm1hdHRlZCBiYXNlIDEwIDY0Yml0IGludGVnZXIsIHBsdXMgTlVMICovCisKKyAgICAgICAgICBzbnByaW50ZiAodCwgc2l6ZW9mKHQpLCAiYXJndiV1IiwgaSk7CisKKyAgICAgICAgICBpZiAoIWRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCB0KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIC8qIEFsbG9jYXRlIHN0cmluZyBhcnJheSAqLworICAgICAgYXJndiA9IGRidXNfbmV3MCAoY2hhciosIGkrMSk7CisgICAgICBpZiAoIWFyZ3YpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgLyogRmlsbCBpbiBzdHJpbmcgYXJyYXkgKi8KKyAgICAgIGZvciAoaSA9IDA7IDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgY2hhciB0WzQrMjArMV07CisgICAgICAgICAgY29uc3QgY2hhciAqcDsKKworICAgICAgICAgIHNucHJpbnRmICh0LCBzaXplb2YodCksICJhcmd2JXUiLCBpKTsKKworICAgICAgICAgIHAgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgdCk7CisgICAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIC8qIElmIGFyZ3YwIGlzbid0IHNwZWNpZmllZCwgZmlsbCBpbiB0aGUgcGF0aCBpbnN0ZWFkICovCisgICAgICAgICAgICAgICAgcCA9IHBhdGg7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGFyZ3ZbaV0gPSBfZGJ1c19zdHJkdXAgKHApOworICAgICAgICAgIGlmICghYXJndltpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZXhlYyAocGF0aCwgYXJndiwgZXJyb3IpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisKKyAgICAgIGlmICgqdHJhbnNwb3J0X3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOworICAgICAgICB9CisgICAgfQorI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyAgZWxzZSBpZiAoc3RyY21wIChtZXRob2QsICJsYXVuY2hkIikgPT0gMCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJlbnYiKTsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfc29ja2V0OworICAgICAgREJ1c1N0cmluZyBzb2NrZXRfcGF0aDsKKyAgICAgIGRidXNfYm9vbF90IHZhbGlkX3NvY2tldDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNvY2tldF9wYXRoKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGxhdW5jaGRfZW52X3ZhciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgImxhdW5jaGQiLCAiZW52IiwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgdmFsaWRfc29ja2V0ID0gX2RidXNfbG9va3VwX2xhdW5jaGRfc29ja2V0ICgmc29ja2V0X3BhdGgsIGxhdW5jaGRfZW52X3ZhciwgZXJyb3IpOworCisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgaWYgKCF2YWxpZF9zb2NrZXQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvcigmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICJsYXVuY2hkJ3MgZW52IHZhciAlcyBkb2VzIG5vdCBleGlzdCIsIGxhdW5jaGRfZW52X3Zhcik7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKGVycm9yKTsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorCisgICAgICBsYXVuY2hkX3NvY2tldCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmc29ja2V0X3BhdGgpOworICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCAobGF1bmNoZF9zb2NrZXQsIEZBTFNFLCBlcnJvcik7CisKKyAgICAgIGlmICgqdHJhbnNwb3J0X3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X3VuaXhfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmM7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0OworICBjb25zdCBjaGFyICphZGRyZXNzOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKCJ1bml4ZXhlYzphcmd2MD1mYWxzZSxhcmd2MT1mb29iYXIscGF0aD0vYmluL2ZhbHNlIiwgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChjICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisKKyAgYWRkcmVzcyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2FkZHJlc3MgKGMpOworICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgLyogTGV0J3Mgc2VlIGlmIHRoZSBhZGRyZXNzIGdvdCBwYXJzZWQsIHJlb3JkZXJlZCBhbmQgZm9ybWF0dGVkIGNvcnJlY3RseSAqLworICByZXQgPSBzdHJjbXAgKGFkZHJlc3MsICJ1bml4ZXhlYzpwYXRoPS9iaW4vZmFsc2UsYXJndjA9ZmFsc2UsYXJndjE9Zm9vYmFyIikgPT0gMDsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGMpOworCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmggYi9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODNhODMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmgKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC11bml4LmggVU5JWCBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfVU5JWF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1VOSVhfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNUcmFuc3BvcnQqIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfVU5JWF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5jIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmMxNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYwpAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXdpbi5jIFdpbmRvd3Mgc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0VW5peCBEQnVzVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnQgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPcGVucyBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQgdHlwZXMuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZworICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICAvKiBjdXJyZW50bHkgbm8gV2luZG93cy1zcGVjaWZpYyB0cmFuc3BvcnRzICovCisgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmggYi9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTk3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtd2luLmggV2luZG93cyBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1dJTl9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1dJTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LmMgYi9kYnVzL2RidXMtdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1ODZiMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE1OTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQuYyBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1hZGRyZXNzLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtbWFpbmxvb3AuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UuaCIKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtc2VydmVyLWRlYnVnLXBpcGUuaCIKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0IERCdXNUcmFuc3BvcnQgb2JqZWN0CisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmICJCYWNrZW5kIiBmb3IgYSBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1RyYW5zcG9ydC4gIEEgdHJhbnNwb3J0IGlzIGFuCisgKiBhYnN0cmFjdGlvbiB0aGF0IGNhbiBzZW5kIGFuZCByZWNlaXZlIGRhdGEgdmlhIHZhcmlvdXMga2luZHMgb2YKKyAqIG5ldHdvcmsgY29ubmVjdGlvbnMgb3Igb3RoZXIgSVBDIG1lY2hhbmlzbXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzVHJhbnNwb3J0CisgKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSB3YXkgbWVzc2FnZSBzdHJlYW0uCisgKiBEQnVzVHJhbnNwb3J0IGFic3RyYWN0cyB2YXJpb3VzIGtpbmRzIG9mIGFjdHVhbAorICogdHJhbnNwb3J0IG1lY2hhbmlzbSwgc3VjaCBhcyBkaWZmZXJlbnQgbmV0d29yayBwcm90b2NvbHMsCisgKiBvciBlbmNyeXB0aW9uIHNjaGVtZXMuCisgKi8KKworc3RhdGljIHZvaWQKK2xpdmVfbWVzc2FnZXNfbm90aWZ5IChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICp1c2VyX2RhdGEpCit7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IHVzZXJfZGF0YTsKKworICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJTaXplIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb3VudGVyKSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJVbml4IEZEIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChjb3VudGVyKSk7CisjZW5kaWYKKworICAvKiBkaXNhYmxlIG9yIHJlLWVuYWJsZSB0aGUgcmVhZCB3YXRjaCBmb3IgdGhlIHRyYW5zcG9ydCBpZgorICAgKiByZXF1aXJlZC4KKyAgICovCisgIGlmICh0cmFuc3BvcnQtPnZ0YWJsZS0+bGl2ZV9tZXNzYWdlc19jaGFuZ2VkKQorICAgIHsKKyAgICAgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpICh0cmFuc3BvcnQpOworICAgIH0KKworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBiYXNlIGNsYXNzIG1lbWJlcnMgb2YgREJ1c1RyYW5zcG9ydC4gIENoYWluZWQgdXAgdG8KKyAqIGJ5IHN1YmNsYXNzZXMgaW4gdGhlaXIgY29uc3RydWN0b3IuICBUaGUgc2VydmVyIEdVSUQgaXMgdGhlCisgKiBnbG9iYWxseSB1bmlxdWUgSUQgZm9yIHRoZSBzZXJ2ZXIgY3JlYXRpbmcgdGhpcyBjb25uZWN0aW9uCisgKiBhbmQgd2lsbCBiZSAjTlVMTCBmb3IgdGhlIGNsaWVudCBzaWRlIG9mIGEgY29ubmVjdGlvbi4gVGhlIEdVSUQKKyAqIGlzIGluIGhleCBmb3JtYXQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0IGJlaW5nIGNyZWF0ZWQuCisgKiBAcGFyYW0gdnRhYmxlIHRoZSBzdWJjbGFzcyB2dGFibGUuCisgKiBAcGFyYW0gc2VydmVyX2d1aWQgbm9uLSNOVUxMIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHJhbnNwb3J0VlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKmFkZHJlc3MpCit7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisgIERCdXNBdXRoICphdXRoOworICBEQnVzQ291bnRlciAqY291bnRlcjsKKyAgY2hhciAqYWRkcmVzc19jb3B5OworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICAKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKHNlcnZlcl9ndWlkKQorICAgIGF1dGggPSBfZGJ1c19hdXRoX3NlcnZlcl9uZXcgKHNlcnZlcl9ndWlkKTsKKyAgZWxzZQorICAgIGF1dGggPSBfZGJ1c19hdXRoX2NsaWVudF9uZXcgKCk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNvdW50ZXIgPSBfZGJ1c19jb3VudGVyX25ldyAoKTsKKyAgaWYgKGNvdW50ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorCisgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKKyAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKHNlcnZlcl9ndWlkKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyA9PSBOVUxMKTsKKyAgICAgIGFkZHJlc3NfY29weSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGFkZHJlc3MsICZhZGRyZXNzX2NvcHkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgICAgICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIAorICB0cmFuc3BvcnQtPnJlZmNvdW50ID0gMTsKKyAgdHJhbnNwb3J0LT52dGFibGUgPSB2dGFibGU7CisgIHRyYW5zcG9ydC0+bG9hZGVyID0gbG9hZGVyOworICB0cmFuc3BvcnQtPmF1dGggPSBhdXRoOworICB0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMgPSBjb3VudGVyOworICB0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKKyAgdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgPSBGQUxTRTsKKyAgdHJhbnNwb3J0LT5pc19zZXJ2ZXIgPSAoc2VydmVyX2d1aWQgIT0gTlVMTCk7CisgIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nID0gIXRyYW5zcG9ydC0+aXNfc2VydmVyOworICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9IHRyYW5zcG9ydC0+aXNfc2VydmVyOworICB0cmFuc3BvcnQtPmFkZHJlc3MgPSBhZGRyZXNzX2NvcHk7CisgIAorICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGEgPSBOVUxMOworICB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgPSBOVUxMOworCisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2Z1bmN0aW9uID0gTlVMTDsKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSA9IE5VTEw7CisgIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSA9IE5VTEw7CisgIAorICB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgPSBOVUxMOworICAKKyAgLyogVHJ5IHRvIGRlZmF1bHQgdG8gc29tZXRoaW5nIHRoYXQgd29uJ3QgdG90YWxseSBob3NlIHRoZSBzeXN0ZW0sCisgICAqIGJ1dCBkb2Vzbid0IGltcG9zZSB0b28gbXVjaCBvZiBhIGxpbWl0YXRpb24uCisgICAqLworICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgPSBfREJVU19PTkVfTUVHQUJZVEUgKiA2MzsKKworICAvKiBPbiBMaW51eCBSTElNSVRfTk9GSUxFIGRlZmF1bHRzIHRvIDEwMjQsIHNvIGFsbG93aW5nIDQwOTYgZmRzIGxpdmUKKyAgICAgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggKi8KKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcyA9IDQwOTY7CisKKyAgLyogY3JlZGVudGlhbHMgcmVhZCBmcm9tIHNvY2tldCBpZiBhbnkgKi8KKyAgdHJhbnNwb3J0LT5jcmVkZW50aWFscyA9IGNyZWRzOworCisgIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfbWVzc2FnZXNfbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+YWRkcmVzcykKKyAgICBfZGJ1c192ZXJib3NlICgiSW5pdGlhbGl6ZWQgdHJhbnNwb3J0IG9uIGFkZHJlc3MgJXNcbiIsIHRyYW5zcG9ydC0+YWRkcmVzcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRmluYWxpemVzIGJhc2UgY2xhc3MgbWVtYmVycyBvZiBEQnVzVHJhbnNwb3J0LgorICogQ2hhaW5lZCB1cCB0byBmcm9tIHN1YmNsYXNzIGZpbmFsaXplcnMuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZmluYWxpemVfYmFzZSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAoIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworCisgIGlmICh0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgIT0gTlVMTCkKKyAgICAoKiB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEpICh0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhKTsKKworICBpZiAodHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhICE9IE5VTEwpCisgICAgKCogdHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhKSAodHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSk7CisgIAorICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAodHJhbnNwb3J0LT5sb2FkZXIpOworICBfZGJ1c19hdXRoX3VucmVmICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCBOVUxMKTsKKyAgX2RidXNfY291bnRlcl91bnJlZiAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQtPmFkZHJlc3MpOworICBkYnVzX2ZyZWUgKHRyYW5zcG9ydC0+ZXhwZWN0ZWRfZ3VpZCk7CisgIGlmICh0cmFuc3BvcnQtPmNyZWRlbnRpYWxzKQorICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmICh0cmFuc3BvcnQtPmNyZWRlbnRpYWxzKTsKK30KKworCisvKioKKyAqIFZlcmlmaWVzIGlmIGEgZ2l2ZW4gRC1CdXMgYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3MKKyAqIGJ5IGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBpdC4gSWYgaXQgaXMsIHJldHVybnMgdGhlCisgKiBvcGVuZWQgREJ1c1RyYW5zcG9ydCBvYmplY3QuIElmIGl0IGlzbid0LCByZXR1cm5zICNOVUxMCisgKiBhbmQgc2V0cyBAcCBlcnJvci4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyB0byBiZSBjaGVja2VkLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgREJ1c1RyYW5zcG9ydCoKK2NoZWNrX2FkZHJlc3MgKGNvbnN0IGNoYXIgKmFkZHJlc3MsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgbGVuLCBpOworCisgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfcGFyc2VfYWRkcmVzcyAoYWRkcmVzcywgJmVudHJpZXMsICZsZW4sIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgIC8qIG5vdCBhIHZhbGlkIGFkZHJlc3MgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X29wZW4gKGVudHJpZXNbaV0sIGVycm9yKTsKKyAgICAgIGlmICh0cmFuc3BvcnQgIT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgImF1dG9zdGFydCIgbWV0aG9kLgorICogVGhpcyBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHNjb3BlIHNjb3BlIG9mIGF1dG9sYXVuY2ggKFdpbmRvd3Mgb25seSkKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIERCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9hdXRvbGF1bmNoIChjb25zdCBjaGFyICpzY29wZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBEQnVzVHJhbnNwb3J0ICpyZXN1bHQgPSBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MgKHNjb3BlLCAmYWRkcmVzcywgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXN1bHQgPSBjaGVja19hZGRyZXNzIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhZGRyZXNzKSwgZXJyb3IpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBlbHNlCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fYXV0b2xhdW5jaCAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJhdXRvbGF1bmNoIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzY29wZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAic2NvcGUiKTsKKworICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfYXV0b2xhdW5jaCAoc2NvcGUsIGVycm9yKTsKKworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0gICAgICAKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIERCdXNUcmFuc3BvcnRPcGVuUmVzdWx0ICgqIGZ1bmMpIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworfSBvcGVuX2Z1bmNzW10gPSB7CisgIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0IH0sCisgIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgfSwKKyAgeyBfZGJ1c190cmFuc3BvcnRfb3Blbl9hdXRvbGF1bmNoIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAsIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSB9CisjZW5kaWYKK307CisKKy8qKgorICogVHJ5IHRvIG9wZW4gYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBlbnRyeS4gIChUaGlzCisgKiBvcGVucyBhIGNsaWVudC1zaWRlLW9mLXRoZS1jb25uZWN0aW9uIHRyYW5zcG9ydC4pCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIG5ldyB0cmFuc3BvcnQgb2YgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9vcGVuIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBjb25zdCBjaGFyICpleHBlY3RlZF9ndWlkX29yaWc7CisgIGNoYXIgKmV4cGVjdGVkX2d1aWQ7CisgIGludCBpOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgdHJhbnNwb3J0ID0gTlVMTDsKKyAgZXhwZWN0ZWRfZ3VpZF9vcmlnID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJndWlkIik7CisgIGV4cGVjdGVkX2d1aWQgPSBfZGJ1c19zdHJkdXAgKGV4cGVjdGVkX2d1aWRfb3JpZyk7CisKKyAgaWYgKGV4cGVjdGVkX2d1aWRfb3JpZyAhPSBOVUxMICYmIGV4cGVjdGVkX2d1aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKG9wZW5fZnVuY3MpOyArK2kpCisgICAgeworICAgICAgREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgcmVzdWx0OworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworICAgICAgcmVzdWx0ID0gKCogb3Blbl9mdW5jc1tpXS5mdW5jKSAoZW50cnksICZ0cmFuc3BvcnQsICZ0bXBfZXJyb3IpOworCisgICAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fT0s6CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgICAgICAgICAgLyoga2VlcCBnb2luZyB0aHJvdWdoIHRoZSBsb29wIG9mIG9wZW4gZnVuY3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICAKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKCZ0bXBfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHR5cGUgKGV4YW1wbGVzIG9mIHZhbGlkIHR5cGVzIGFyZSBcInRjcFwiIGFuZCBvbiBVTklYIFwidW5peFwiKSIpOworICAgICAgCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgIGRidXNfbW92ZV9lcnJvcigmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBkYnVzX2ZyZWUgKGV4cGVjdGVkX2d1aWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgIC8qIEluIHRoZSBjYXNlIG9mIGF1dG9zdGFydCB0aGUgaW5pdGlhbCBndWlkIGlzIE5VTEwKKyAgICAgICAqIGFuZCB0aGUgYXV0b3N0YXJ0IHRyYW5zcG9ydCByZWN1cnNpdmVseSBjYWxscworICAgICAgICogX2RidXNfb3Blbl90cmFuc3BvcnQgd2ljaCByZXR1cm5zIGEgdHJhbnNwb3J0CisgICAgICAgKiB3aXRoIGEgZ3VpZC4gIFRoYXQgZ3VpZCBpcyB0aGUgZGVmaW5pdGl2ZSBvbmUuCisgICAgICAgKgorICAgICAgICogRklYTUU6IGlmIG1vcmUgdHJhbnNwb3J0cyBhcmUgYWRkZWQgdGhleSBtYXkgaGF2ZQorICAgICAgICogYW4gZWZmZWN0IG9uIHRoZSBleHBlY3RlZF9ndWlkIHNlbWFudGljcyAoaS5lLiAKKyAgICAgICAqIGV4cGVjdGVkX2d1aWQgYW5kIHRyYW5zcG9ydC0+ZXhwZWN0ZWRfZ3VpZCBtYXkKKyAgICAgICAqIGJvdGggaGF2ZSB2YWx1ZXMpLiAgVGhpcyBpcyB2ZXJ5IHVubGlrZWx5IHRob3VnaAorICAgICAgICogd2Ugc2hvdWxkIGVpdGhlciB0aHJvdyBhc3NlcnRzIGhlcmUgZm9yIHRob3NlIAorICAgICAgICogY29ybmVyIGNhc2VzIG9yIHJlZmFjdG9yIHRoZSBjb2RlIHNvIGl0IGlzIAorICAgICAgICogY2xlYXJlciBvbiB3aGF0IGlzIGV4cGVjdGVkIGFuZCB3aGF0IGlzIG5vdAorICAgICAgICovCisgICAgICBpZihleHBlY3RlZF9ndWlkKQorICAgICAgICB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgPSBleHBlY3RlZF9ndWlkOworICAgIH0KKworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcmV0dXJucyB0aGUgdHJhbnNwb3J0LgorICovCitEQnVzVHJhbnNwb3J0ICoKK19kYnVzX3RyYW5zcG9ydF9yZWYgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnJlZmNvdW50ID4gMCk7CisgIAorICB0cmFuc3BvcnQtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSB0cmFuc3BvcnQuCisgKiBEaXNjb25uZWN0cyBhbmQgZmluYWxpemVzIHRoZSB0cmFuc3BvcnQgaWYKKyAqIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3VucmVmIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+cmVmY291bnQgPiAwKTsKKyAgCisgIHRyYW5zcG9ydC0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHRyYW5zcG9ydC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmluYWxpemluZ1xuIik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmZpbmFsaXplICE9IE5VTEwpOworICAgICAgCisgICAgICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+ZmluYWxpemUpICh0cmFuc3BvcnQpOworICAgIH0KK30KKworLyoqCisgKiBDbG9zZXMgb3VyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhcHBsaWNhdGlvbi4gRnVydGhlcgorICogYXR0ZW1wdHMgdG8gdXNlIHRoaXMgdHJhbnNwb3J0IHdpbGwgZmFpbC4gT25seSB0aGUgZmlyc3QgY2FsbCB0bworICogX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QoKSB3aWxsIGhhdmUgYW4gZWZmZWN0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIAorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnZ0YWJsZS0+ZGlzY29ubmVjdCAhPSBOVUxMKTsKKyAgCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICByZXR1cm47CisKKyAgKCogdHJhbnNwb3J0LT52dGFibGUtPmRpc2Nvbm5lY3QpICh0cmFuc3BvcnQpOworICAKKyAgdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgPSBUUlVFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIHRyYW5zcG9ydCBoYXMgbm90IGJlZW4gZGlzY29ubmVjdGVkLgorICogRGlzY29ubmVjdGlvbiBjYW4gcmVzdWx0IGZyb20gX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QoKQorICogb3IgYmVjYXVzZSB0aGUgc2VydmVyIGRyb3BzIGl0cyBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHJldHVybnMgd2hldGhlciB3ZSdyZSBjb25uZWN0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiAhdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXV0aF92aWFfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgZGJ1c19ib29sX3QgYWxsb3c7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uIHVuaXhfdXNlcl9mdW5jdGlvbjsKKyAgdm9pZCAqdW5peF91c2VyX2RhdGE7CisgIGRidXNfdWlkX3QgdWlkOworCisgIC8qIERyb3BwaW5nIHRoZSBsb2NrIGhlcmUgcHJvYmFibHkgaXNuJ3QgdGhhdCBzYWZlLiAqLworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19hc3NlcnQgKGF1dGhfaWRlbnRpdHkgIT0gTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IHRyYW5zcG9ydC0+Y29ubmVjdGlvbjsKKyAgdW5peF91c2VyX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb247CisgIHVuaXhfdXNlcl9kYXRhID0gdHJhbnNwb3J0LT51bml4X3VzZXJfZGF0YTsKKyAgdWlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgICAgICAgICAgCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbik7CisKKyAgYWxsb3cgPSAoKiB1bml4X3VzZXJfZnVuY3Rpb24pIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4X3VzZXJfZGF0YSk7CisgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHVuaXggdXNlciBmdW5jdGlvblxuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAoY29ubmVjdGlvbik7CisKKyAgaWYgKGFsbG93KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGF1dGhvcml6ZWRcbiIsIHVpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBVSUQgIkRCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgIiB3YXMgcmVqZWN0ZWQsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgIH0KKworICByZXR1cm4gYWxsb3c7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXV0aF92aWFfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsgIAorICBkYnVzX2Jvb2xfdCBhbGxvdzsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gd2luZG93c191c2VyX2Z1bmN0aW9uOworICB2b2lkICp3aW5kb3dzX3VzZXJfZGF0YTsKKyAgY2hhciAqd2luZG93c19zaWQ7CisKKyAgLyogRHJvcHBpbmcgdGhlIGxvY2sgaGVyZSBwcm9iYWJseSBpc24ndCB0aGF0IHNhZmUuICovCisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aF9pZGVudGl0eSAhPSBOVUxMKTsKKworICBjb25uZWN0aW9uID0gdHJhbnNwb3J0LT5jb25uZWN0aW9uOworICB3aW5kb3dzX3VzZXJfZnVuY3Rpb24gPSB0cmFuc3BvcnQtPndpbmRvd3NfdXNlcl9mdW5jdGlvbjsKKyAgd2luZG93c191c2VyX2RhdGEgPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhOworICB3aW5kb3dzX3NpZCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChhdXRoX2lkZW50aXR5KSk7CisKKyAgaWYgKHdpbmRvd3Nfc2lkID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKGNvbm5lY3Rpb24pOworCisgIGFsbG93ID0gKCogd2luZG93c191c2VyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzX3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzX3VzZXJfZGF0YSk7CisgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHdpbmRvd3MgdXNlciBmdW5jdGlvblxuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAoY29ubmVjdGlvbik7CisKKyAgaWYgKGFsbG93KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgU0lEICclcycgYXV0aG9yaXplZFxuIiwgd2luZG93c19zaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgU0lEICclcycgd2FzIHJlamVjdGVkLCBkaXNjb25uZWN0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChhdXRoX2lkZW50aXR5KSk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2F1dGhfdmlhX2RlZmF1bHRfcnVsZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworICBEQnVzQ3JlZGVudGlhbHMgKm91cl9pZGVudGl0eTsKKyAgZGJ1c19ib29sX3QgYWxsb3c7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aF9pZGVudGl0eSAhPSBOVUxMKTsKKworICAvKiBCeSBkZWZhdWx0LCBjb25uZWN0aW9uIGlzIGFsbG93ZWQgaWYgdGhlIGNsaWVudCBpcyAxKSByb290IG9yIDIpCisgICAqIGhhcyB0aGUgc2FtZSBVSUQgYXMgdXMgb3IgMykgYW5vbnltb3VzIGlzIGFsbG93ZWQuCisgICAqLworICAKKyAgb3VyX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICBpZiAob3VyX2lkZW50aXR5ID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAKKyAgaWYgKHRyYW5zcG9ydC0+YWxsb3dfYW5vbnltb3VzIHx8CisgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpID09IDAgfHwKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAob3VyX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2lkZW50aXR5KSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZShvdXJfaWRlbnRpdHksREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGF1dGhvcml6ZWQgYXMgU0lEICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nIG91ciBTSUQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKG91cl9pZGVudGl0eSkpOworICAgICAgZWxzZQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBVSUQgIkRCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgICAgICIgbWF0Y2hpbmcgb3VyIFVJRCAiREJVU19VSURfRk9STUFUIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKG91cl9pZGVudGl0eSkpOworICAgICAgLyogV2UgaGF2ZSBhdXRoZW50aWNhdGVkISAqLworICAgICAgYWxsb3cgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlKG91cl9pZGVudGl0eSxEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBTSUQgJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBvdXIgU0lEIGlzICclcycsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChhdXRoX2lkZW50aXR5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChhdXRoX2lkZW50aXR5KSA6ICI8bnVsbD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKG91cl9pZGVudGl0eSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQob3VyX2lkZW50aXR5KSA6ICI8bnVsbD4iKSk7CisgICAgICBlbHNlCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBhdXRob3JpemVkIGFzIFVJRCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgb3VyIFVJRCBpcyAiREJVU19VSURfRk9STUFUIiwgZGlzY29ubmVjdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKG91cl9pZGVudGl0eSkpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgICBhbGxvdyA9IEZBTFNFOworICAgIH0gIAorCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChvdXJfaWRlbnRpdHkpOworICAKKyAgcmV0dXJuIGFsbG93OworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgd2UgaGF2ZSBiZWVuIGF1dGhlbnRpY2F0ZWQuIEl0IHdpbGwgcmV0dXJuICNUUlVFIGV2ZW4gaWYKKyAqIHRoZSB0cmFuc3BvcnQgaXMgbm93IGRpc2Nvbm5lY3RlZCwgYnV0IHdhcyBldmVyIGF1dGhlbnRpY2F0ZWQgYmVmb3JlCisgKiBkaXNjb25uZWN0aW5nLgorICoKKyAqIFRoaXMgcmVwbGFjZXMgdGhlIG9sZGVyIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCgpIHdoaWNoCisgKiBoYWQgc2lkZS1lZmZlY3RzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgd2hldGhlciB3ZSdyZSBhdXRoZW50aWNhdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfcGVla19pc19hdXRoZW50aWNhdGVkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQ7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB3ZSBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC4gSXQgd2lsbCByZXR1cm4gI1RSVUUgZXZlbiBpZgorICogdGhlIHRyYW5zcG9ydCBpcyBub3cgZGlzY29ubmVjdGVkLCBidXQgd2FzIGV2ZXIgYXV0aGVudGljYXRlZCBiZWZvcmUKKyAqIGRpc2Nvbm5lY3RpbmcuCisgKgorICogSWYgd2UgaGF2ZSBub3QgZmluaXNoZWQgYXV0aGVudGljYXRpbmcsIGJ1dCB3ZSBoYXZlIGVub3VnaCBidWZmZXJlZCBpbnB1dAorICogdG8gZmluaXNoIHRoZSBqb2IsIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGRvIHNvIGJlZm9yZSBpdCByZXR1cm5zLgorICoKKyAqIFRoaXMgdXNlZCB0byBiZSBjYWxsZWQgX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKCksIGJ1dCB0aGF0CisgKiBuYW1lIHNlZW1zIGluYXBwcm9wcmlhdGUgZm9yIGEgZnVuY3Rpb24gd2l0aCBzaWRlLWVmZmVjdHMuCisgKgorICogQHRvZG8gd2UgZHJvcCBjb25uZWN0aW9uLT5tdXRleCB3aGVuIGNhbGxpbmcgdGhlIHVuaXhfdXNlcl9mdW5jdGlvbiwKKyAqIGFuZCB3aW5kb3dzX3VzZXJfZnVuY3Rpb24sIHdoaWNoIG1heSBub3QgYmUgc2FmZSByZWFsbHkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB3aGV0aGVyIHdlJ3JlIGF1dGhlbnRpY2F0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7ICAKKyAgaWYgKHRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IG1heWJlX2F1dGhlbnRpY2F0ZWQ7CisgICAgICAKKyAgICAgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBwYXJhbm9pYSByZWYgc2luY2Ugd2UgY2FsbCB1c2VyIGNhbGxiYWNrcyBzb21ldGltZXMgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0KKyAgICAgICAgKCEodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpKTsKKworICAgICAgaWYgKG1heWJlX2F1dGhlbnRpY2F0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQ6CisgICAgICAgICAgICAgIC8qIGxlYXZlIGFzIG1heWJlX2F1dGhlbnRpY2F0ZWQgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIGNsaWVudCwgdmVyaWZ5IHRoZSBHVUlECisgICAgICAgKi8KKyAgICAgIGlmIChtYXliZV9hdXRoZW50aWNhdGVkICYmICF0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9ndWlkOworCisgICAgICAgICAgc2VydmVyX2d1aWQgPSBfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyX2d1aWQgIT0gTlVMTCk7CisKKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkICYmCisgICAgICAgICAgICAgIHN0cmNtcCAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBleHBlY3RlZCBHVUlEICclcycgYW5kIHdlIGdvdCAnJXMnIGZyb20gdGhlIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCk7CisgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIHNlcnZlciwgc2VlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhpcyBpZGVudGl0eSB0byBwcm9jZWVkLgorICAgICAgICovCisgICAgICBpZiAobWF5YmVfYXV0aGVudGljYXRlZCAmJiB0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYm9vbF90IGFsbG93OworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIGhhdmUgYW4gYXV0aCdkIHVzZXIgYW5kIGEgdXNlciBmdW5jdGlvbiwgZGVsZWdhdGUKKyAgICAgICAgICAgKiBkZWNpZGluZyB3aGV0aGVyIGF1dGggY3JlZGVudGlhbHMgYXJlIGdvb2QgZW5vdWdoIHRvIHRoZQorICAgICAgICAgICAqIGFwcDsgb3RoZXJ3aXNlLCB1c2Ugb3VyIGRlZmF1bHQgZGVjaXNpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV91bml4X3VzZXJfZnVuY3Rpb24gKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAodHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFsbG93ID0gYXV0aF92aWFfd2luZG93c191c2VyX2Z1bmN0aW9uICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV9kZWZhdWx0X3J1bGVzICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYWxsb3cpCisgICAgICAgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkID0gbWF5YmVfYXV0aGVudGljYXRlZDsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBtYXliZV9hdXRoZW50aWNhdGVkOworICAgIH0KK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIG5vdCBhdXRoZW50aWNhdGVkIG9yIGF1dGhlbnRpY2F0ZWQgYXMgYW5vbnltb3VzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aF9pZGVudGl0eSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSB0cmFuc3BvcnQgc3VwcG9ydHMgc2VuZGluZyB1bml4IGZkcy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIFRSVUUgaXQgaXMgcG9zc2libGUgdG8gc2VuZCB1bml4IGZkcyBhY3Jvc3MgdGhlIHRyYW5zcG9ydC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhZGRyZXNzIG9mIGEgdHJhbnNwb3J0LiBJdCB3aWxsIGJlCisgKiAjTlVMTCBmb3IgYSBzZXJ2ZXItc2lkZSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB0cmFuc3BvcnQncyBhZGRyZXNzCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c190cmFuc3BvcnRfZ2V0X2FkZHJlc3MgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+YWRkcmVzczsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpZCBvZiB0aGUgc2VydmVyIHdlIGFyZSBjb25uZWN0ZWQgdG8gKHNlZQorICogZGJ1c19zZXJ2ZXJfZ2V0X2lkKCkpLiBPbmx5IHdvcmtzIG9uIGNsaWVudCBzaWRlLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgdHJhbnNwb3J0J3Mgc2VydmVyJ3MgaWQgb3IgI05VTEwgaWYgd2UgYXJlIHRoZSBzZXJ2ZXIgc2lkZQorICovCitjb25zdCBjaGFyKgorX2RidXNfdHJhbnNwb3J0X2dldF9zZXJ2ZXJfaWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKHRyYW5zcG9ydC0+aXNfc2VydmVyKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmICh0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKHRyYW5zcG9ydC0+YXV0aCk7CisgIGVsc2UKKyAgICByZXR1cm4gdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkOworfQorCisvKioKKyAqIEhhbmRsZXMgYSB3YXRjaCBieSByZWFkaW5nIGRhdGEsIHdyaXRpbmcgZGF0YSwgb3IgZGlzY29ubmVjdGluZworICogdGhlIHRyYW5zcG9ydCwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhdGNoZWQgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGZ1bGx5IGhhbmRsZSB0aGUgd2F0Y2gKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgY29uZGl0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5oYW5kbGVfd2F0Y2ggIT0gTlVMTCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSA8IDApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJUcmllZCB0byBoYW5kbGUgYW4gaW52YWxpZGF0ZWQgd2F0Y2g7IHRoaXMgd2F0Y2ggc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAod2F0Y2gsICZjb25kaXRpb24pOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3dhdGNoX3JlZiAod2F0Y2gpOworICByZXR2YWwgPSAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+aGFuZGxlX3dhdGNoKSAodHJhbnNwb3J0LCB3YXRjaCwgY29uZGl0aW9uKTsKKyAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgY29ubmVjdGlvbiB1c2luZyB0aGlzIHRyYW5zcG9ydC4gQWxsb3dzIHRoZSB0cmFuc3BvcnQKKyAqIHRvIGFkZCB3YXRjaGVzIHRvIHRoZSBjb25uZWN0aW9uLCBxdWV1ZSBpbmNvbWluZyBtZXNzYWdlcywKKyAqIGFuZCBwdWxsIG91dGdvaW5nIG1lc3NhZ2VzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5jb25uZWN0aW9uX3NldCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPT0gTlVMTCk7CisgIAorICB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIGlmICghKCogdHJhbnNwb3J0LT52dGFibGUtPmNvbm5lY3Rpb25fc2V0KSAodHJhbnNwb3J0KSkKKyAgICB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gPSBOVUxMOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiAhPSBOVUxMOworfQorCisvKioKKyAqIEdldCB0aGUgc29ja2V0IGZpbGUgZGVzY3JpcHRvciwgaWYgYW55LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZkX3AgcG9pbnRlciB0byBmaWxsIGluIHdpdGggdGhlIGRlc2NyaXB0b3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgZGVzY3JpcHRvciB3YXMgYXZhaWxhYmxlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X3NvY2tldF9mZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgKmZkX3ApCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIGlmICh0cmFuc3BvcnQtPnZ0YWJsZS0+Z2V0X3NvY2tldF9mZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dmFsID0gKCogdHJhbnNwb3J0LT52dGFibGUtPmdldF9zb2NrZXRfZmQpICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfcCk7CisgIAorICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBQZXJmb3JtcyBhIHNpbmdsZSBwb2xsKCkvc2VsZWN0KCkgb24gdGhlIHRyYW5zcG9ydCdzIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGFuZCB0aGVuIHJlYWRzL3dyaXRlcyBkYXRhIGFzIGFwcHJvcHJpYXRlLAorICogcXVldWVpbmcgaW5jb21pbmcgbWVzc2FnZXMgYW5kIHNlbmRpbmcgb3V0Z29pbmcgbWVzc2FnZXMuCisgKiBUaGlzIGlzIHRoZSBiYWNrZW5kIGZvciBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbigpLgorICogU2VlIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uKCkgZm9yIGZ1bGwgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gZmxhZ3MgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVhZCBvciB3cml0ZSwgYW5kIHdoZXRoZXIgdG8gYmxvY2suCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgaWYgYmxvY2tpbmcsIHRpbWVvdXQgb3IgLTEgZm9yIG5vIHRpbWVvdXQuCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmRvX2l0ZXJhdGlvbiAhPSBOVUxMKTsKKworICBfZGJ1c192ZXJib3NlICgiVHJhbnNwb3J0IGl0ZXJhdGlvbiBmbGFncyAweCV4IHRpbWVvdXQgJWQgY29ubmVjdGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGZsYWdzLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKTsKKyAgCisgIGlmICgoZmxhZ3MgJiAoREJVU19JVEVSQVRJT05fRE9fV1JJVElORyB8CisgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykpID09IDApCisgICAgcmV0dXJuOyAvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+ZG9faXRlcmF0aW9uKSAodHJhbnNwb3J0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlY292ZXJfdW51c2VkX2J5dGVzIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgcGxhaW50ZXh0OworICAgICAgY29uc3QgREJ1c1N0cmluZyAqZW5jb2RlZDsKKyAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgICAgIGludCBvcmlnX2xlbjsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBsYWludGV4dCkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAKKyAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZCk7CisKKyAgICAgIGlmICghX2RidXNfYXV0aF9kZWNvZGVfZGF0YSAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkLCAmcGxhaW50ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisgICAgICAKKyAgICAgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZwbGFpbnRleHQsIDAsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJWQgdW51c2VkIGJ5dGVzIHNlbnQgdG8gbWVzc2FnZSBsb2FkZXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisKKyAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ5dGVzOworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworICAgICAgaW50IG9yaWdfbGVuOworICAgICAgZGJ1c19ib29sX3Qgc3VjY2VlZGVkOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpOworICAgICAgICAgICAgICAgIAorICAgICAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXMpOworCisgICAgICBzdWNjZWVkZWQgPSBUUlVFOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYnl0ZXMsIDAsIGJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikpKQorICAgICAgICBzdWNjZWVkZWQgPSBGQUxTRTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAlZCB1bnVzZWQgYnl0ZXMgc2VudCB0byBtZXNzYWdlIGxvYWRlclxuIiwgCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtCisgICAgICAgICAgICAgICAgICAgICBvcmlnX2xlbik7CisgICAgICAKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKworICAgICAgaWYgKHN1Y2NlZWRlZCkKKyAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgZWxzZQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBfZGJ1c192ZXJib3NlICgiTm90IGVub3VnaCBtZW1vcnkgdG8gdHJhbnNmZXIgdW51c2VkIGJ5dGVzIGZyb20gYXV0aCBjb252ZXJzYXRpb25cbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmVwb3J0cyBvdXIgY3VycmVudCBkaXNwYXRjaCBzdGF0dXMgKHdoZXRoZXIgdGhlcmUncyBidWZmZXJlZAorICogZGF0YSB0byBiZSBxdWV1ZWQgYXMgbWVzc2FnZXMsIG9yIG5vdCwgb3Igd2UgbmVlZCBtZW1vcnkpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgY3VycmVudCBzdGF0dXMKKyAqLworREJ1c0Rpc3BhdGNoU3RhdHVzCitfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAoX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA+PSB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgfHwKKyAgICAgIF9kYnVzX2NvdW50ZXJfZ2V0X3VuaXhfZmRfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcykgPj0gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcykKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsgLyogY29tcGxldGUgZm9yIG5vdyAqLworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKHRyYW5zcG9ydCkpCisgICAgeworICAgICAgaWYgKF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKSA9PQorICAgICAgICAgIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkpCisgICAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworICAgICAgZWxzZSBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsKKyAgICB9CisKKyAgaWYgKCF0cmFuc3BvcnQtPnVudXNlZF9ieXRlc19yZWNvdmVyZWQgJiYKKyAgICAgICFyZWNvdmVyX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0KSkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKworICB0cmFuc3BvcnQtPnVudXNlZF9ieXRlc19yZWNvdmVyZWQgPSBUUlVFOworICAKKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAodHJhbnNwb3J0LT5sb2FkZXIpKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgKHRyYW5zcG9ydC0+bG9hZGVyKSAhPSBOVUxMKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworfQorCisvKioKKyAqIFByb2Nlc3NlcyBkYXRhIHdlJ3ZlIHJlYWQgd2hpbGUgaGFuZGxpbmcgYSB3YXRjaCwgcG90ZW50aWFsbHkKKyAqIGNvbnZlcnRpbmcgc29tZSBvZiBpdCB0byBtZXNzYWdlcyBhbmQgcXVldWVpbmcgdGhvc2UgbWVzc2FnZXMgb24KKyAqIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgdG8gcXVldWUgYWxsIG1lc3NhZ2VzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIl9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcygpXG4iKTsKKyNlbmRpZgorICAKKyAgLyogUXVldWUgYW55IG1lc3NhZ2VzICovCisgIHdoaWxlICgoc3RhdHVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgKHRyYW5zcG9ydCkpID09IERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rICh0cmFuc3BvcnQtPmxvYWRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgicXVldWVpbmcgcmVjZWl2ZWQgbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisKKyAgICAgIGlmICghX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAobWVzc2FnZSwgdHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3B1dGJhY2tfbWVzc2FnZV9saW5rICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAgICAgc3RhdHVzID0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgZGlkbid0IGNhbGwgdGhlIG5vdGlmeSBmdW5jdGlvbiB3aGVuIHdlIGFkZGVkIHRoZSBjb3VudGVyLCBzbworICAgICAgICAgICAqIGNhdGNoIHVwIG5vdy4gU2luY2Ugd2UgaGF2ZSB0aGUgY29ubmVjdGlvbidzIGxvY2ssIGl0J3MgZGVzaXJhYmxlCisgICAgICAgICAgICogdGhhdCB3ZSBieXBhc3MgdGhlIG5vdGlmeSBmdW5jdGlvbiBhbmQgY2FsbCB0aGlzIHZpcnR1YWwgbWV0aG9kCisgICAgICAgICAgICogZGlyZWN0bHkuICovCisgICAgICAgICAgaWYgKHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpCisgICAgICAgICAgICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+bGl2ZV9tZXNzYWdlc19jaGFuZ2VkKSAodHJhbnNwb3J0KTsKKworICAgICAgICAgIC8qIHBhc3Mgb3duZXJzaGlwIG9mIGxpbmsgYW5kIG1lc3NhZ2UgcmVmIHRvIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2VfbGluayAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAodHJhbnNwb3J0LT5sb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3JydXB0ZWQgbWVzc2FnZSBzdHJlYW0sIGRpc2Nvbm5lY3RpbmdcbiIpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgfQorCisgIHJldHVybiBzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZQorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAodHJhbnNwb3J0LT5sb2FkZXIsIHNpemUpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gbiB0aGUgbWF4IG51bWJlciBvZiB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbikKK3sKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzICh0cmFuc3BvcnQtPmxvYWRlciwgbik7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgbWF4IG1lc3NhZ2Ugc2l6ZQorICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAodHJhbnNwb3J0LT5sb2FkZXIpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggbWVzc2FnZSB1bml4IGZkcworICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzICh0cmFuc3BvcnQtPmxvYWRlcik7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBzaXplIHRoZSBtYXggc2l6ZSBvZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKQoreworICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgPSBzaXplOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIG4gdGhlIG1heCB1bml4IGZkcyBvZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMgPSBuOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggYnl0ZXMgZm9yIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemU7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggdW5peCBmZHMgZm9yIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkczsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSB1aWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdXNlciBJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3VzZXIgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICp1aWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqdWlkID0gX0RCVVNfSU5UMzJfTUFYOyAvKiBiZXR0ZXIgdGhhbiBzb21lIHJvb3Qgb3Igc3lzdGVtIHVzZXIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FzZSBvZiBidWdzIGluIHRoZSBjYWxsZXIuIENhbGxlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV2ZXIgdXNlIHRoaXMgdmFsdWUgb24gcHVycG9zZSwgaG93ZXZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSkKKyAgICB7CisgICAgICAqdWlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBwaWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgcHJvY2VzcyBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgcHJvY2VzcyBJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworCisgICpwaWQgPSBEQlVTX1BJRF9VTlNFVDsgLyogQ2FsbGVyIHNob3VsZCBuZXZlciB1c2UgdGhpcyB2YWx1ZSBvbiBwdXJwb3NlLAorCQkJICAqIGJ1dCB3ZSBzZXQgaXQgdG8gYSBzYWZlIG51bWJlciwgSU5UX01BWCwKKwkJCSAgKiBqdXN0IHRvIHJvb3Qgb3V0IHBvc3NpYmxlIGJ1Z3MgaW4gYmFkIGNhbGxlcnMuCisJCQkgICovCisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSkKKyAgICB7CisgICAgICAqcGlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3BpZCAoYXV0aF9pZGVudGl0eSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGRhdGEgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgQURUIGF1ZGl0IGRhdGEgCisgKiBAcGFyYW0gZGF0YV9zaXplIHJldHVybiBsZW5ndGggb2YgYXVkaXQgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgYXVkaXQgZGF0YSBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVjcmVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKERCdXNUcmFuc3BvcnQgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqZGF0YV9zaXplKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKmRhdGEgPSBOVUxMOworICAqZGF0YV9zaXplID0gMDsKKyAgCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCkpCisgICAgeworICAgICAgKmRhdGEgPSAodm9pZCAqKSBfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGEgKGF1dGhfaWRlbnRpdHkpOworICAgICAgKmRhdGFfc2l6ZSA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YV9zaXplIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKiBAcGFyYW0gb2xkX2RhdGEgdGhlIG9sZCB1c2VyIGRhdGEgdG8gYmUgZnJlZWQKKyAqIEBwYXJhbSBvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uIG9sZCBmcmVlIGRhdGEgZnVuY3Rpb24gdG8gZnJlZSBpdCB3aXRoCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbikKK3sgIAorICAqb2xkX2RhdGEgPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhOworICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbiA9IHRyYW5zcG9ydC0+ZnJlZV91bml4X3VzZXJfZGF0YTsKKworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhID0gZGF0YTsKKyAgdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgKipsYWJlbF9wKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKmxhYmVsX3AgPSBOVUxMOworCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfTElOVVhfU0VDVVJJVFlfTEFCRUwpKQorICAgIHsKKyAgICAgIC8qIElmIG5vIG1lbW9yeSwgd2UgYXJlIHN1cHBvc2VkIHRvIHJldHVybiBUUlVFIGFuZCBzZXQgTlVMTCAqLworICAgICAgKmxhYmVsX3AgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoYXV0aF9pZGVudGl0eSkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlcigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHdpbmRvd3Nfc2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdXNlciBpcyBhdmFpbGFibGU7IHRoZSByZXR1cm5lZCB2YWx1ZSBtYXkgc3RpbGwgYmUgI05VTEwgaWYgbm8gbWVtb3J5IHRvIGNvcHkgaXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKip3aW5kb3dzX3NpZF9wKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKndpbmRvd3Nfc2lkX3AgPSBOVUxMOworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICB7CisgICAgICAvKiBJZiBubyBtZW1vcnksIHdlIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gVFJVRSBhbmQgc2V0IE5VTEwgKi8KKyAgICAgICp3aW5kb3dzX3NpZF9wID0gX2RidXNfc3RyZHVwIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGF1dGhfaWRlbnRpdHkpKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSB0aGUgb2xkIHVzZXIgZGF0YSB0byBiZSBmcmVlZAorICogQHBhcmFtIG9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gb2xkIGZyZWUgZGF0YSBmdW5jdGlvbiB0byBmcmVlIGl0IHdpdGgKKyAqLworCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgICpvbGRfZGF0YSA9IHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGE7CisgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhOworCisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEgPSBkYXRhOworICB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKgorICogU2V0cyB0aGUgU0FTTCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBtZWNoYW5pc21zIHRoZSAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIG1lY2hhbmlzbXMKKyAqCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqbWVjaGFuaXNtcykKK3sKKyAgcmV0dXJuIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgKHRyYW5zcG9ydC0+YXV0aCwgbWVjaGFuaXNtcyk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzKCkKKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSB2YWx1ZSAjVFJVRSB0byBhbGxvdyBhbm9ueW1vdXMgY29ubmVjdGlvbgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X2FsbG93X2Fub255bW91cyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIHRyYW5zcG9ydC0+YWxsb3dfYW5vbnltb3VzID0gdmFsdWUgIT0gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJuIGhvdyBtYW55IGZpbGUgZGVzY3JpcHRvcnMgYXJlIHBlbmRpbmcgaW4gdGhlIGxvYWRlcgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICovCitpbnQKK19kYnVzX3RyYW5zcG9ydF9nZXRfcGVuZGluZ19mZHNfY291bnQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9wZW5kaW5nX2Zkc19jb3VudCAodHJhbnNwb3J0LT5sb2FkZXIpOworfQorCisvKioKKyAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcGVuZGluZyBmaWxlCisgKiBkZXNjcmlwdG9ycyBpbiB0aGUgbG9hZGVyIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCogY2FsbGJhY2spICh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIGRhdGEpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9nZXRfc3RhdHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcXVldWVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcXVldWVfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnBlYWtfcXVldWVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcGVha19xdWV1ZV9mZHMpCit7CisgIGlmIChxdWV1ZV9ieXRlcyAhPSBOVUxMKQorICAgICpxdWV1ZV9ieXRlcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7CisKKyAgaWYgKHF1ZXVlX2ZkcyAhPSBOVUxMKQorICAgICpxdWV1ZV9mZHMgPSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpOworCisgIGlmIChwZWFrX3F1ZXVlX2J5dGVzICE9IE5VTEwpCisgICAgKnBlYWtfcXVldWVfYnl0ZXMgPSBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3NpemVfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7CisKKyAgaWYgKHBlYWtfcXVldWVfZmRzICE9IE5VTEwpCisgICAgKnBlYWtfcXVldWVfZmRzID0gX2RidXNfY291bnRlcl9nZXRfcGVha191bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzc4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQuaCBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYWRkcmVzcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnQgREJ1c1RyYW5zcG9ydDsKKworREJ1c1RyYW5zcG9ydCogICAgIF9kYnVzX3RyYW5zcG9ydF9vcGVuICAgICAgICAgICAgICAgICAgIChEQnVzQWRkcmVzc0VudHJ5ICAgICAgICAgICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICplcnJvcik7CitEQnVzVHJhbnNwb3J0KiAgICAgX2RidXNfdHJhbnNwb3J0X3JlZiAgICAgICAgICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAgICAgICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9wZWVrX2lzX2F1dGhlbnRpY2F0ZWQgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19hbm9ueW1vdXMgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKworY29uc3QgY2hhciogICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWRkcmVzcyAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2NvbnN0IGNoYXIqICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3NlcnZlcl9pZCAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2hhbmRsZV93YXRjaCAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNvbmRpdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZG9faXRlcmF0aW9uICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworREJ1c0Rpc3BhdGNoU3RhdHVzIF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF9zaXplICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3NpemUgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG4pOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG4pOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9zb2NrZXRfZmQgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgICAgICAgICAgICAgICpmZF9wKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlciAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgKnVpZCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqcGlkKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3dpbmRvd3NfdXNlciAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfbGludXhfc2VjdXJpdHlfbGFiZWwgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqbGFiZWxfcCk7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9hdXRoX21lY2hhbmlzbXMgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKiptZWNoYW5pc21zKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X2FsbG93X2Fub255bW91cyAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKTsKK2ludCAgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3BlbmRpbmdfZmRzX2NvdW50ICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCogY2FsbGJhY2spICh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLwordm9pZCBfZGJ1c190cmFuc3BvcnRfZ2V0X3N0YXRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcXVldWVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpxdWV1ZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpwZWFrX3F1ZXVlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcGVha19xdWV1ZV9mZHMpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXR5cGVzLmggYi9kYnVzL2RidXMtdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFhNTVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXR5cGVzLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10eXBlcy5oICB0eXBlcyBzdWNoIGFzIGRidXNfYm9vbF90CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfVFlQRVNfSAorI2RlZmluZSBEQlVTX1RZUEVTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKwordHlwZWRlZiBkYnVzX3VpbnQzMl90ICBkYnVzX3VuaWNoYXJfdDsKKy8qIGJvb2xlYW4gc2l6ZSBtdXN0IGJlIGZpeGVkIGF0IDQgYnl0ZXMgZHVlIHRvIHdpcmUgcHJvdG9jb2whICovCit0eXBlZGVmIGRidXNfdWludDMyX3QgIGRidXNfYm9vbF90OworCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNUeXBlcyBCYXNpYyB0eXBlcworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX2Jvb2xfdCwgZGJ1c19pbnQzMl90LCBldGMuCisgKgorICogVHlwZWRlZnMgZm9yIGNvbW1vbiBwcmltaXRpdmUgdHlwZXMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfYm9vbF90CisgKgorICogQSBib29sZWFuLCB2YWxpZCB2YWx1ZXMgYXJlICNUUlVFIGFuZCAjRkFMU0UuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX3VpbnQzMl90CisgKgorICogQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19pbnQzMl90CisgKgorICogQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfdWludDE2X3QKKyAqCisgKiBBIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX2ludDE2X3QKKyAqCisgKiBBIDE2LWJpdCBzaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX3VpbnQ2NF90CisgKgorICogQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlci4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfaW50NjRfdAorICoKKyAqIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX0hBVkVfSU5UNjQKKyAqCisgKiBBbHdheXMgZGVmaW5lZC4KKyAqCisgKiBJbiBvbGRlciBsaWJkYnVzIHZlcnNpb25zLCB0aGlzIHdvdWxkIGJlIHVuZGVmaW5lZCBpZiB0aGVyZSB3YXMgbm8KKyAqIDY0LWJpdCBpbnRlZ2VyIHR5cGUgb24gdGhhdCBwbGF0Zm9ybS4gbGliZGJ1cyBubyBsb25nZXIgc3VwcG9ydHMKKyAqIHN1Y2ggcGxhdGZvcm1zLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX0lOVDY0X0NPTlNUQU5UCisgKgorICogRGVjbGFyZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBjb25zdGFudC4gVGhlIG1hY3JvCisgKiBhZGRzIHRoZSBuZWNlc3NhcnkgIkxMIiBvciB3aGF0ZXZlciBhZnRlciB0aGUgaW50ZWdlciwKKyAqIGdpdmluZyBhIGxpdGVyYWwgc3VjaCBhcyAiMzI1MTQ1MjQ2NzY1TEwiCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVUlOVDY0X0NPTlNUQU5UCisgKgorICogRGVjbGFyZSBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50LiBUaGUgbWFjcm8KKyAqIGFkZHMgdGhlIG5lY2Vzc2FyeSAiVUxMIiBvciB3aGF0ZXZlciBhZnRlciB0aGUgaW50ZWdlciwKKyAqIGdpdmluZyBhIGxpdGVyYWwgc3VjaCBhcyAiMzI1MTQ1MjQ2NzY1VUxMIgorICovCisKKy8qKgorICogQW4gOC1ieXRlIHN0cnVjdCB5b3UgY291bGQgdXNlIHRvIGFjY2VzcyBpbnQ2NCB3aXRob3V0IGhhdmluZworICogaW50NjQgc3VwcG9ydC4gVXNlICNkYnVzX2ludDY0X3Qgb3IgI2RidXNfdWludDY0X3QgaW5zdGVhZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZGJ1c191aW50MzJfdCBmaXJzdDMyOyAgLyoqPCBmaXJzdCAzMiBiaXRzIGluIHRoZSA4IGJ5dGVzIChiZXdhcmUgZW5kaWFuIGlzc3VlcykgKi8KKyAgZGJ1c191aW50MzJfdCBzZWNvbmQzMjsgLyoqPCBzZWNvbmQgMzIgYml0cyBpbiB0aGUgOCBieXRlcyAoYmV3YXJlIGVuZGlhbiBpc3N1ZXMpICovCit9IERCdXM4Qnl0ZVN0cnVjdDsKKworLyoqCisgKiBBIHNpbXBsZSB2YWx1ZSB1bmlvbiB0aGF0IGxldHMgeW91IGFjY2VzcyBieXRlcyBhcyBpZiB0aGV5CisgKiB3ZXJlIHZhcmlvdXMgdHlwZXM7IHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBiYXNpYyB0eXBlcyB2aWEKKyAqIHZvaWQgcG9pbnRlcnMgYW5kIHZhcmFyZ3MuCisgKgorICogVGhpcyB1bmlvbiBhbHNvIGNvbnRhaW5zIGEgcG9pbnRlciBtZW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkCisgKiB0byByZXRyaWV2ZSBhIHN0cmluZyBmcm9tIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpLCBmb3IKKyAqIGluc3RhbmNlKSwgc28gb24gZnV0dXJlIHBsYXRmb3JtcyBpdCBjb3VsZCBjb25jZWl2YWJseSBiZSBsYXJnZXIKKyAqIHRoYW4gOCBieXRlcy4KKyAqLwordHlwZWRlZiB1bmlvbgoreworICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzhdOyAvKio8IGFzIDggaW5kaXZpZHVhbCBieXRlcyAqLworICBkYnVzX2ludDE2X3QgIGkxNjsgICAvKio8IGFzIGludDE2ICovCisgIGRidXNfdWludDE2X3QgdTE2OyAgIC8qKjwgYXMgaW50MTYgKi8KKyAgZGJ1c19pbnQzMl90ICBpMzI7ICAgLyoqPCBhcyBpbnQzMiAqLworICBkYnVzX3VpbnQzMl90IHUzMjsgICAvKio8IGFzIGludDMyICovCisgIGRidXNfYm9vbF90ICAgYm9vbF92YWw7IC8qKjwgYXMgYm9vbGVhbiAqLworICBkYnVzX2ludDY0X3QgIGk2NDsgICAvKio8IGFzIGludDY0ICovCisgIGRidXNfdWludDY0X3QgdTY0OyAgIC8qKjwgYXMgaW50NjQgKi8KKyAgREJ1czhCeXRlU3RydWN0IGVpZ2h0OyAvKio8IGFzIDgtYnl0ZSBzdHJ1Y3QgKi8KKyAgZG91YmxlIGRibDsgICAgICAgICAgLyoqPCBhcyBkb3VibGUgKi8KKyAgdW5zaWduZWQgY2hhciBieXQ7ICAgLyoqPCBhcyBieXRlICovCisgIGNoYXIgKnN0cjsgICAgICAgICAgIC8qKjwgYXMgY2hhciogKHN0cmluZywgb2JqZWN0IHBhdGggb3Igc2lnbmF0dXJlKSAqLworICBpbnQgZmQ7ICAgICAgICAgICAgICAvKio8IGFzIFVuaXggZmlsZSBkZXNjcmlwdG9yICovCit9IERCdXNCYXNpY1ZhbHVlOworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIERCVVNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmMgYi9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhhMjNlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11c2VyZGItdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtdXNlcmRiLmMsIGJ1dCBub3QgdXNlZCBpbiBsaWJkYnVzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBEQlVTX1VTRVJEQl9JTkNMVURFU19QUklWQVRFIDEKKyNpbmNsdWRlICJkYnVzLXVzZXJkYi5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgSEFWRV9TWVNURU1ECisjaW5jbHVkZSA8c3lzdGVtZC9zZC1sb2dpbi5oPgorI2VuZGlmCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVUlEIHNlbnQgaW4gaXMgdGhlIGNvbnNvbGUgdXNlcgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc19jb25zb2xlX3VzZXIgKGRidXNfdWlkX3QgdWlkLAorCQkgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICBkYnVzX2Jvb2xfdCByZXN1bHQgPSBGQUxTRTsKKworI2lmZGVmIEhBVkVfU1lTVEVNRAorICAvKiBjaGVjayBpZiB3ZSBoYXZlIGxvZ2luZCAqLworICBpZiAoYWNjZXNzICgiL3J1bi9zeXN0ZW1kL3NlYXRzLyIsIEZfT0spID49IDApCisgICAgeworICAgICAgaW50IHI7CisKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyB1c2VyIGlzIGxvZ2dlZCBpbiBvbiBhdCBsZWFzdCBvbmUgcGh5c2ljYWwKKyAgICAgICAgIHNlYXQgKi8KKyAgICAgIHIgPSBzZF91aWRfZ2V0X3NlYXRzICh1aWQsIDAsIE5VTEwpOworICAgICAgaWYgKHIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vICgtciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHNlYXRzIG9mIHVzZXIgXCIiIERCVVNfVUlEX0ZPUk1BVCAiXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoLXIpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIChyID4gMCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRQorCisgIERCdXNTdHJpbmcgZjsKKyAgREJ1c1N0YXQgc3Q7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmYpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKCZmLCBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RhdCgmZiwgJnN0LCBOVUxMKSAmJiAoc3QudWlkID09IHVpZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlKCZmKTsKKworI2VuZGlmIC8qIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFICovCisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgZ2V0IHN5c3RlbSBkYXRhYmFzZS4iKTsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogVFBURDogdGhpcyBzaG91bGQgYmUgY2FjaGUtc2FmZSwgd2UndmUgbG9ja2VkIHRoZSBEQiBhbmQKKyAgICBfZGJ1c191c2VyX2F0X2NvbnNvbGUgZG9lc24ndCBwYXNzIGl0IG9uLiAqLworICBpbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKGRiLCB1aWQsIE5VTEwsIGVycm9yKTsKKworICBpZiAoaW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlc3VsdCA9IF9kYnVzX3VzZXJfYXRfY29uc29sZSAoaW5mby0+dXNlcm5hbWUsIGVycm9yKTsKKworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgSUQgZ2l2ZW4gdXNlcm5hbWUKKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gdWlkIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBleGlzdGVkIGFuZCB3ZSBnb3QgdGhlIFVJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3VzZXJfaWQgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKQoreworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKHVzZXJuYW1lLCB1aWQsIE5VTEwpOworfQorCisvKioKKyAqIEdldHMgZ3JvdXAgSUQgZ2l2ZW4gZ3JvdXBuYW1lCisgKgorICogQHBhcmFtIGdyb3VwbmFtZSB0aGUgZ3JvdXBuYW1lCisgKiBAcGFyYW0gZ2lkIHJldHVybiBsb2NhdGlvbiBmb3IgR0lECisgKiBAcmV0dXJucyAjVFJVRSBpZiBncm91cCBuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgR0lECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfZ3JvdXBfaWQgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWQpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzR3JvdXBJbmZvICppbmZvOworCisgIC8qIEZJWE1FOiB0aGlzIGNhbid0IGRpc3Rpbmd1aXNoIEVOT01FTSBmcm9tIG90aGVyIGVycm9ycyAqLworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBuYW1lIChkYiwgZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKmdpZCA9IGluZm8tPmdpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIElEIGFuZCBwcmltYXJ5IGdyb3VwIGdpdmVuIHVzZXJuYW1lCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHBhcmFtIHVpZF9wIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcGFyYW0gZ2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBHSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgVUlEIGFuZCBHSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCkKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKworICAvKiBGSVhNRTogdGhpcyBjYW4ndCBkaXN0aW5ndWlzaCBFTk9NRU0gZnJvbSBvdGhlciBlcnJvcnMgKi8KKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lIChkYiwgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh1aWRfcCkKKyAgICAqdWlkX3AgPSBpbmZvLT51aWQ7CisgIGlmIChnaWRfcCkKKyAgICAqZ2lkX3AgPSBpbmZvLT5wcmltYXJ5X2dpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTG9va3MgdXAgYSBnaWQgb3IgZ3JvdXAgbmFtZSBpbiB0aGUgdXNlciBkYXRhYmFzZS4gIE9ubHkgb25lIG9mCisgKiBuYW1lIG9yIEdJRCBjYW4gYmUgcHJvdmlkZWQuIFRoZXJlIGFyZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhpcworICogdGhhdCBhcmUgYmV0dGVyIHRvIHVzZSwgdGhpcyBvbmUgZG9lcyBubyBsb2NraW5nIG9yIGFueXRoaW5nIG9uIHRoZQorICogZGF0YWJhc2UgYW5kIG90aGVyd2lzZSBzb3J0IG9mIHN1Y2tzLgorICoKKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEBwYXJhbSBnaWQgdGhlIGdyb3VwIElEIG9yICNEQlVTX0dJRF9VTlNFVAorICogQHBhcmFtIGdyb3VwbmFtZSBncm91cCBuYW1lIG9yICNOVUxMIAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zIHRoZSBlbnRyeSBpbiB0aGUgZGF0YWJhc2UKKyAqLworREJ1c0dyb3VwSW5mbyoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzR3JvdXBJbmZvICppbmZvOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAvKiBTZWUgaWYgdGhlIGdyb3VwIGlzIHJlYWxseSBhIG51bWJlciAqLworICAgaWYgKGdpZCA9PSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG47CisKKyAgICAgIGlmIChfZGJ1c19pc19hX251bWJlciAoZ3JvdXBuYW1lLCAmbikpCisgICAgICAgIGdpZCA9IG47CisgICAgfQorCisgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisgICAgaW5mbyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKGRiLT5ncm91cHMsIGdpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+Z3JvdXBzX2J5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpKTsKKyAgaWYgKGluZm8pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlVzaW5nIGNhY2hlIGZvciBHSUQgIkRCVVNfR0lEX0ZPUk1BVCIgaW5mb3JtYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICBpbmZvLT5naWQpOworICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGdpZCAhPSBEQlVTX0dJRF9VTlNFVCkKKwlfZGJ1c192ZXJib3NlICgiTm8gY2FjaGUgZm9yIEdJRCAiREJVU19HSURfRk9STUFUIlxuIiwKKwkJICAgICAgIGdpZCk7CisgICAgICBlbHNlCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBncm91cG5hbWUgXCIlc1wiXG4iLAorCQkgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpKTsKKyAgICAgIAorICAgICAgaW5mbyA9IGRidXNfbmV3MCAoREJ1c0dyb3VwSW5mbywgMSk7CisgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGdpZCAhPSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfZ3JvdXBfaW5mb19maWxsX2dpZCAoaW5mbywgZ2lkLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2dyb3VwX2luZm9fZmlsbCAoaW5mbywgZ3JvdXBuYW1lLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIGRvbid0IHVzZSB0aGVzZSBwYXN0IGhlcmUgKi8KKyAgICAgIGdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgZ3JvdXBuYW1lID0gTlVMTDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyIChkYi0+Z3JvdXBzLCBpbmZvLT5naWQsIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoZGItPmdyb3Vwc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGRiLT5ncm91cHMsIGluZm8tPmdpZCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIGluZm87CisgICAgfQorfQorCisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUsCisgKiByZXR1cm5lZCBncm91cCBpbmZvIHNob3VsZCBub3QgYmUgZnJlZWQuIAorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cCBuYW1lCisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byBncm91cCBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwbmFtZSAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChkYiwgREJVU19HSURfVU5TRVQsIGdyb3VwbmFtZSwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gR0lELAorICogcmV0dXJuZWQgZ3JvdXAgaW5mbyBzaG91bGQgbm90IGJlIGZyZWVkLiAKKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIGdpZCB0aGUgZ3JvdXAgSUQKKyAqIEBwYXJhbSBpbmZvIHJldHVybiBsb2NhdGlvbiBmb3IgY29uc3QgcmVmIHRvIGdyb3VwIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ2lkIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgICppbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKGRiLCBnaWQsIE5VTEwsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVJRC4gUmV0dXJucyAjRkFMU0UKKyAqIGlmIG5vIG1lbW9yeSwgb3IgdXNlciBpc24ndCBrbm93biwgYnV0IGFsd2F5cyBpbml0aWFsaXplcworICogZ3JvdXBfaWRzIHRvIGEgTlVMTCBhcnJheS4gCisgKgorICogQHBhcmFtIHVpZCB0aGUgVUlECisgKiBAcGFyYW0gZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgYXJyYXkgb2YgZ3JvdXAgSURzCisgKiBAcGFyYW0gbl9ncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBsZW5ndGggb2YgcmV0dXJuZWQgYXJyYXkKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBVSUQgZXhpc3RlZCBhbmQgd2UgZ290IHNvbWUgY3JlZGVudGlhbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKm5fZ3JvdXBfaWRzKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICAqZ3JvdXBfaWRzID0gTlVMTDsKKyAgKm5fZ3JvdXBfaWRzID0gMDsKKworICAvKiBGSVhNRTogdGhpcyBjYW4ndCBkaXN0aW5ndWlzaCBFTk9NRU0gZnJvbSBvdGhlciBlcnJvcnMgKi8KKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoZGIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaW5mby0+dWlkID09IHVpZCk7CisgIAorICBpZiAoaW5mby0+bl9ncm91cF9pZHMgPiAwKQorICAgIHsKKyAgICAgICpncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgaW5mby0+bl9ncm91cF9pZHMpOworICAgICAgaWYgKCpncm91cF9pZHMgPT0gTlVMTCkKKyAgICAgICAgeworCSAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAqbl9ncm91cF9pZHMgPSBpbmZvLT5uX2dyb3VwX2lkczsKKworICAgICAgbWVtY3B5ICgqZ3JvdXBfaWRzLCBpbmZvLT5ncm91cF9pZHMsIGluZm8tPm5fZ3JvdXBfaWRzICogc2l6ZW9mIChkYnVzX2dpZF90KSk7CisgICAgfQorCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBVbml0IHRlc3QgZm9yIGRidXMtdXNlcmRiLmMuCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyZGJfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWU7CisgIGNvbnN0IERCdXNTdHJpbmcgKmhvbWVkaXI7CisgIGRidXNfdWlkX3QgdWlkOworICB1bnNpZ25lZCBsb25nICpncm91cF9pZHM7CisgIGludCBuX2dyb3VwX2lkcywgaTsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGlmICghX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZ1c2VybmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCB1c2VybmFtZSIpOworCisgIGlmICghX2RidXNfaG9tZWRpcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJmhvbWVkaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgaG9tZWRpciIpOyAgCisKKyAgaWYgKCFfZGJ1c19nZXRfdXNlcl9pZCAodXNlcm5hbWUsICZ1aWQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgdWlkIik7CisKKyAgaWYgKCFfZGJ1c19ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZ2V0IGdyb3VwcyIpOworCisgIHByaW50ZiAoIiAgICBDdXJyZW50IHVzZXI6ICVzIGhvbWVkaXI6ICVzIGdpZHM6IiwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVzZXJuYW1lKSwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGhvbWVkaXIpKTsKKworICBmb3IgKGk9MDsgaTxuX2dyb3VwX2lkczsgaSsrKQorICAgICAgcHJpbnRmKCIgJWxkIiwgZ3JvdXBfaWRzW2ldKTsKKworICBwcmludGYgKCJcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcHJpbnRmICgiSXMgQ29uc29sZSB1c2VyOiAlaVxuIiwKKyAgICAgICAgICBfZGJ1c19pc19jb25zb2xlX3VzZXIgKHVpZCwgJmVycm9yKSk7CisgIHByaW50ZiAoIkludm9jYXRpb24gd2FzIE9LOiAlc1xuIiwgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAieWVzIik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgcHJpbnRmICgiSXMgQ29uc29sZSB1c2VyIDQ3MTE6ICVpXG4iLAorICAgICAgICAgIF9kYnVzX2lzX2NvbnNvbGVfdXNlciAoNDcxMSwgJmVycm9yKSk7CisgIHByaW50ZiAoIkludm9jYXRpb24gd2FzIE9LOiAlc1xuIiwgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAieWVzIik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBkYnVzX2ZyZWUgKGdyb3VwX2lkcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy11c2VyZGIuYyBiL2RidXMvZGJ1cy11c2VyZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY5MjdhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXVzZXJkYi5jCkBAIC0wLDAgKzEsNjg3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXNlcmRiLmMgVXNlciBkYXRhYmFzZSBhYnN0cmFjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNkZWZpbmUgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKKy8qKgorICogRnJlZXMgdGhlIGdpdmVuICNEQnVzVXNlckluZm8ncyBtZW1iZXJzIHdpdGggX2RidXNfdXNlcl9pbmZvX2ZyZWUoKQorICogYW5kIGFsc28gY2FsbHMgZGJ1c19mcmVlKCkgb24gdGhlIGJsb2NrIGl0c2VsZgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBpbmZvCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoREJ1c1VzZXJJbmZvICppbmZvKQoreworICBpZiAoaW5mbyA9PSBOVUxMKSAvKiBoYXNoIHRhYmxlIHdpbGwgcGFzcyBOVUxMICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX3VzZXJfaW5mb19mcmVlIChpbmZvKTsKKyAgZGJ1c19mcmVlIChpbmZvKTsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgZ2l2ZW4gI0RCdXNHcm91cEluZm8ncyBtZW1iZXJzIHdpdGggX2RidXNfZ3JvdXBfaW5mb19mcmVlKCkKKyAqIGFuZCBhbHNvIGNhbGxzIGRidXNfZnJlZSgpIG9uIHRoZSBibG9jayBpdHNlbGYKKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgaW5mbworICovCit2b2lkCitfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkIChEQnVzR3JvdXBJbmZvICppbmZvKQoreworICBpZiAoaW5mbyA9PSBOVUxMKSAvKiBoYXNoIHRhYmxlIHdpbGwgcGFzcyBOVUxMICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2dyb3VwX2luZm9fZnJlZSAoaW5mbyk7CisgIGRidXNfZnJlZSAoaW5mbyk7Cit9CisKKy8qKgorICogRnJlZXMgdGhlIG1lbWJlcnMgb2YgaW5mbworICogKGJ1dCBub3QgaW5mbyBpdHNlbGYpCisgKiBAcGFyYW0gaW5mbyB0aGUgdXNlciBpbmZvIHN0cnVjdAorICovCit2b2lkCitfZGJ1c191c2VyX2luZm9fZnJlZSAoREJ1c1VzZXJJbmZvICppbmZvKQoreworICBkYnVzX2ZyZWUgKGluZm8tPmdyb3VwX2lkcyk7CisgIGRidXNfZnJlZSAoaW5mby0+dXNlcm5hbWUpOworICBkYnVzX2ZyZWUgKGluZm8tPmhvbWVkaXIpOworfQorCisvKioKKyAqIEZyZWVzIHRoZSBtZW1iZXJzIG9mIGluZm8gKGJ1dCBub3QgaW5mbyBpdHNlbGYpLgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBncm91cCBpbmZvCisgKi8KK3ZvaWQKK19kYnVzX2dyb3VwX2luZm9fZnJlZSAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbykKK3sKKyAgZGJ1c19mcmVlIChpbmZvLT5ncm91cG5hbWUpOworfQorCisvKioKKyAqIENoZWNrcyBpZiBhIGdpdmVuIHN0cmluZyBpcyBhY3R1YWxseSBhIG51bWJlciAKKyAqIGFuZCBjb252ZXJ0cyBpdCBpZiBpdCBpcyAKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gY2hlY2sKKyAqIEBwYXJhbSBudW0gdGhlIG1lbW9yeSBsb2NhdGlvbiBvZiB0aGUgdW5zaWduZWQgbG9uZyB0byBmaWxsIGluCisgKiBAcmV0dXJucyBUUlVFIGlmIHN0ciBpcyBhIG51bWJlciBhbmQgbnVtIGlzIGZpbGxlZCBpbiAKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2lzX2FfbnVtYmVyIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAqbnVtKQoreworICBpbnQgZW5kOworCisgIGlmIChfZGJ1c19zdHJpbmdfcGFyc2VfdWludCAoc3RyLCAwLCBudW0sICZlbmQpICYmCisgICAgICBlbmQgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogTG9va3MgdXAgYSB1aWQgb3IgdXNlcm5hbWUgaW4gdGhlIHVzZXIgZGF0YWJhc2UuICBPbmx5IG9uZSBvZiBuYW1lCisgKiBvciBVSUQgY2FuIGJlIHByb3ZpZGVkLiBUaGVyZSBhcmUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoaXMgdGhhdAorICogYXJlIGJldHRlciB0byB1c2UsIHRoaXMgb25lIGRvZXMgbm8gbG9ja2luZyBvciBhbnl0aGluZyBvbiB0aGUKKyAqIGRhdGFiYXNlIGFuZCBvdGhlcndpc2Ugc29ydCBvZiBzdWNrcy4KKyAqCisgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlCisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElEIG9yICNEQlVTX1VJRF9VTlNFVAorICogQHBhcmFtIHVzZXJuYW1lIHVzZXJuYW1lIG9yICNOVUxMIAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zIHRoZSBlbnRyeSBpbiB0aGUgZGF0YWJhc2UKKyAqLworREJ1c1VzZXJJbmZvKgorX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1VzZXJJbmZvICppbmZvOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBfZGJ1c19hc3NlcnQgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCB8fCB1c2VybmFtZSAhPSBOVUxMKTsKKworICAvKiBTZWUgaWYgdGhlIHVzZXJuYW1lIGlzIHJlYWxseSBhIG51bWJlciAqLworICBpZiAodWlkID09IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKworICAgICAgaWYgKF9kYnVzX2lzX2FfbnVtYmVyICh1c2VybmFtZSwgJm4pKQorICAgICAgICB1aWQgPSBuOworICAgIH0KKworICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChkYi0+dXNlcnMsIHVpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+dXNlcnNfYnlfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSkpOworCisgIGlmIChpbmZvKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBjYWNoZSBmb3IgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGluZm9ybWF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dWlkKTsKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBVSUQgIkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisJCSAgICAgICB1aWQpOworICAgICAgZWxzZQorCV9kYnVzX3ZlcmJvc2UgKCJObyBjYWNoZSBmb3IgdXNlciBcIiVzXCJcbiIsCisJCSAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVzZXJuYW1lKSk7CisgICAgICAKKyAgICAgIGluZm8gPSBkYnVzX25ldzAgKERCdXNVc2VySW5mbywgMSk7CisgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfdXNlcl9pbmZvX2ZpbGxfdWlkIChpbmZvLCB1aWQsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c191c2VyX2luZm9fZmlsbCAoaW5mbywgdXNlcm5hbWUsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBiZSBzdXJlIHdlIGRvbid0IHVzZSB0aGVzZSBhZnRlciBoZXJlICovCisgICAgICB1aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgIHVzZXJuYW1lID0gTlVMTDsKKworICAgICAgLyogaW5zZXJ0IGludG8gaGFzaCAqLworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyIChkYi0+dXNlcnMsIGluZm8tPnVpZCwgaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgKGluZm8pOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChkYi0+dXNlcnNfYnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT51c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGRiLT51c2VycywgaW5mby0+dWlkKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkYXRhYmFzZV9sb2NrZWQgPSBGQUxTRTsKK3N0YXRpYyBEQnVzVXNlckRhdGFiYXNlICpzeXN0ZW1fZGIgPSBOVUxMOworc3RhdGljIERCdXNTdHJpbmcgcHJvY2Vzc191c2VybmFtZTsKK3N0YXRpYyBEQnVzU3RyaW5nIHByb2Nlc3NfaG9tZWRpcjsKKyAgICAgIAorc3RhdGljIHZvaWQKK3NodXRkb3duX3N5c3RlbV9kYiAodm9pZCAqZGF0YSkKK3sKKyAgaWYgKHN5c3RlbV9kYiAhPSBOVUxMKQorICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKHN5c3RlbV9kYik7CisgIHN5c3RlbV9kYiA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvY2Vzc191c2VybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvY2Vzc19ob21lZGlyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpbml0X3N5c3RlbV9kYiAodm9pZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChkYXRhYmFzZV9sb2NrZWQpOworICAgIAorICBpZiAoc3lzdGVtX2RiID09IE5VTEwpCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICAgICAgCisgICAgICBzeXN0ZW1fZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX25ldyAoKTsKKyAgICAgIGlmIChzeXN0ZW1fZGIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoc3lzdGVtX2RiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2dldHVpZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIAorICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGlzIHJlYWxseSBzaG91bGQgbm90IGhhcHBlbi4gKi8KKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBnZXQgcGFzc3dvcmQgZGF0YWJhc2UgaW5mb3JtYXRpb24gZm9yIFVJRCBvZiBjdXJyZW50IHByb2Nlc3M6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnByb2Nlc3NfdXNlcm5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcHJvY2Vzc19ob21lZGlyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvY2Vzc191c2VybmFtZSk7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwcm9jZXNzX3VzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT51c2VybmFtZSkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2Nlc3NfaG9tZWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+aG9tZWRpcikgfHwKKyAgICAgICAgICAhX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoc2h1dGRvd25fc3lzdGVtX2RiLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvY2Vzc191c2VybmFtZSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX2hvbWVkaXIpOworICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKHN5c3RlbV9kYik7CisgICAgICAgICAgc3lzdGVtX2RiID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTG9ja3MgZ2xvYmFsIHN5c3RlbSB1c2VyIGRhdGFiYXNlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKF9EQlVTX0xPQ0sgKHN5c3RlbV91c2VycykpCisgICAgeworICAgICAgZGF0YWJhc2VfbG9ja2VkID0gVFJVRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKgorICogVW5sb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAodm9pZCkKK3sKKyAgZGF0YWJhc2VfbG9ja2VkID0gRkFMU0U7CisgIF9EQlVTX1VOTE9DSyAoc3lzdGVtX3VzZXJzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBzeXN0ZW0gZ2xvYmFsIHVzZXIgZGF0YWJhc2U7CisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZCAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSgpKS4KKyAqCisgKiBAcmV0dXJucyB0aGUgZGF0YWJhc2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNVc2VyRGF0YWJhc2UqCitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZGF0YWJhc2VfbG9ja2VkKTsKKworICBpbml0X3N5c3RlbV9kYiAoKTsKKyAgCisgIHJldHVybiBzeXN0ZW1fZGI7Cit9CisKKy8qKgorICogRmx1c2hlcyB0aGUgc3lzdGVtIGdsb2JhbCB1c2VyIGRhdGFiYXNlOworICovCit2b2lkCitfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHsKKyAgICAgIC8qIG5vdGhpbmcgdG8gZmx1c2ggKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgIGlmIChzeXN0ZW1fZGIgIT0gTlVMTCkKKyAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoIChzeXN0ZW1fZGIpOworCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKK30KKworLyoqCisgKiBHZXRzIHVzZXJuYW1lIG9mIHVzZXIgb3duaW5nIGN1cnJlbnQgcHJvY2Vzcy4gIFRoZSByZXR1cm5lZCBzdHJpbmcKKyAqIGlzIHZhbGlkIHVudGlsIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHBsYWNlIHRvIHN0b3JlIHBvaW50ZXIgdG8gdXNlcm5hbWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzIChjb25zdCBEQnVzU3RyaW5nICoqdXNlcm5hbWUpCit7CisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFpbml0X3N5c3RlbV9kYiAoKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAqdXNlcm5hbWUgPSAmcHJvY2Vzc191c2VybmFtZTsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOyAgCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyBob21lZGlyIG9mIHVzZXIgb3duaW5nIGN1cnJlbnQgcHJvY2Vzcy4gIFRoZSByZXR1cm5lZCBzdHJpbmcKKyAqIGlzIHZhbGlkIHVudGlsIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIGhvbWVkaXIgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byBob21lZGlyCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzIChjb25zdCBEQnVzU3RyaW5nICAqKmhvbWVkaXIpCit7CisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFpbml0X3N5c3RlbV9kYiAoKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAqaG9tZWRpciA9ICZwcm9jZXNzX2hvbWVkaXI7CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBob21lIGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIHVzZXIuCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHBhcmFtIGhvbWVkaXIgc3RyaW5nIHRvIGFwcGVuZCBob21lIGRpcmVjdG9yeSB0bworICogQHJldHVybnMgI1RSVUUgaWYgdXNlciBleGlzdGVkIGFuZCB3ZSBhcHBlbmRlZCB0aGVpciBob21lZGlyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fdXNlcm5hbWUgKGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpob21lZGlyKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworCisgIC8qIEZJWE1FOiB0aGlzIGNhbid0IGRpc3Rpbmd1aXNoIEVOT01FTSBmcm9tIG90aGVyIGVycm9ycyAqLworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgKGRiLCB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChob21lZGlyLCBpbmZvLT5ob21lZGlyKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBob21lIGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIHVzZXIuCisgKgorICogQHBhcmFtIHVpZCB0aGUgdWlkCisgKiBAcGFyYW0gaG9tZWRpciBzdHJpbmcgdG8gYXBwZW5kIGhvbWUgZGlyZWN0b3J5IHRvCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGV4aXN0ZWQgYW5kIHdlIGFwcGVuZGVkIHRoZWlyIGhvbWVkaXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hvbWVkaXJfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqaG9tZWRpcikKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKworICAvKiBGSVhNRTogdGhpcyBjYW4ndCBkaXN0aW5ndWlzaCBFTk9NRU0gZnJvbSBvdGhlciBlcnJvcnMgKi8KKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoZGIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoaG9tZWRpciwgaW5mby0+aG9tZWRpcikpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkcyB0aGUgY3JlZGVudGlhbHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXNlcm5hbWUuCisgKgorICogVXNlZCBhbW9uZyBvdGhlciBwdXJwb3NlcyB0byBwYXJzZXMgYSBkZXNpcmVkIGlkZW50aXR5IHByb3ZpZGVkCisgKiBmcm9tIGEgY2xpZW50IGluIHRoZSBhdXRoIHByb3RvY29sLiBPbiBVTklYIHRoaXMgbWVhbnMgcGFyc2luZyBhCisgKiBVSUQsIG9uIFdpbmRvd3MgcHJvYmFibHkgcGFyc2luZyBhbiBTSUQgc3RyaW5nLgorICogCisgKiBAdG9kbyB0aGlzIGlzIGJyb2tlbiBiZWNhdXNlIGl0IHRyZWF0cyBPT00gYW5kIHBhcnNlIGVycm9yCisgKiB0aGUgc2FtZSB3YXkuIE5lZWRzIGEgI0RCdXNFcnJvci4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIGZpbGwgaW4gCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgdXNlcm5hbWUgZXhpc3RlZCBhbmQgd2UgZ290IHNvbWUgY3JlZGVudGlhbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgKERCdXNDcmVkZW50aWFscyAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisKKyAgLyogRklYTUU6IHRoaXMgY2FuJ3QgZGlzdGluZ3Vpc2ggRU5PTUVNIGZyb20gb3RoZXIgZXJyb3JzICovCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAoZGIsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChjcmVkZW50aWFscywgaW5mby0+dWlkKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHVzZXIgZGF0YWJhc2Ugb2JqZWN0IHVzZWQgdG8gbG9vayB1cCBhbmQKKyAqIGNhY2hlIHVzZXIgaW5mb3JtYXRpb24uCisgKiBAcmV0dXJucyBuZXcgZGF0YWJhc2UsIG9yICNOVUxMIG9uIG91dCBvZiBtZW1vcnkKKyAqLworREJ1c1VzZXJEYXRhYmFzZSoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICh2b2lkKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgCisgIGRiID0gZGJ1c19uZXcwIChEQnVzVXNlckRhdGFiYXNlLCAxKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZGItPnJlZmNvdW50ID0gMTsKKworICBkYi0+dXNlcnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoREJ1c0ZyZWVGdW5jdGlvbikgX2RidXNfdXNlcl9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+dXNlcnMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBkYi0+Z3JvdXBzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIChEQnVzRnJlZUZ1bmN0aW9uKSBfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+Z3JvdXBzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGItPnVzZXJzX2J5X25hbWUgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgIGlmIChkYi0+dXNlcnNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgZGItPmdyb3Vwc19ieV9uYW1lID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKGRiLT5ncm91cHNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgcmV0dXJuIGRiOworICAKKyBmYWlsZWQ6CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKGRiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmx1c2ggYWxsIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgdXNlciBkYXRhYmFzZS4gCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKERCdXNVc2VyRGF0YWJhc2UgKmRiKSAKK3sKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT51c2Vyc19ieV9uYW1lKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT5ncm91cHNfYnlfbmFtZSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbChkYi0+dXNlcnMpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwoZGItPmdyb3Vwcyk7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworLyoqCisgKiBJbmNyZW1lbnRzIHJlZmNvdW50IG9mIHVzZXIgZGF0YWJhc2UuCisgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlCisgKiBAcmV0dXJucyB0aGUgZGF0YWJhc2UKKyAqLworREJ1c1VzZXJEYXRhYmFzZSAqCitfZGJ1c191c2VyX2RhdGFiYXNlX3JlZiAoREJ1c1VzZXJEYXRhYmFzZSAgKmRiKQoreworICBfZGJ1c19hc3NlcnQgKGRiLT5yZWZjb3VudCA+IDApOworCisgIGRiLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBkYjsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisvKioKKyAqIERlY3JlbWVudHMgcmVmY291bnQgb2YgdXNlciBkYXRhYmFzZS4KKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqLwordm9pZAorX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoREJ1c1VzZXJEYXRhYmFzZSAgKmRiKQoreworICBfZGJ1c19hc3NlcnQgKGRiLT5yZWZjb3VudCA+IDApOworCisgIGRiLT5yZWZjb3VudCAtPSAxOworICBpZiAoZGItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKGRiLT51c2VycykKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoZGItPnVzZXJzKTsKKworICAgICAgaWYgKGRiLT5ncm91cHMpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT5ncm91cHMpOworCisgICAgICBpZiAoZGItPnVzZXJzX2J5X25hbWUpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT51c2Vyc19ieV9uYW1lKTsKKworICAgICAgaWYgKGRiLT5ncm91cHNfYnlfbmFtZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoZGItPmdyb3Vwc19ieV9uYW1lKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChkYik7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIHVzZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBVSUQsCisgKiByZXR1cm5lZCB1c2VyIGluZm8gc2hvdWxkIG5vdCBiZSBmcmVlZC4gCisgKgorICogQHBhcmFtIGRiIHVzZXIgZGF0YWJhc2UKKyAqIEBwYXJhbSB1aWQgdGhlIHVzZXIgSUQKKyAqIEBwYXJhbSBpbmZvIHJldHVybiBsb2NhdGlvbiBmb3IgY29uc3QgcmVmIHRvIHVzZXIgaW5mbworICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgKERCdXNVc2VyRGF0YWJhc2UgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwIChkYiwgdWlkLCBOVUxMLCBlcnJvcik7CisgIHJldHVybiAqaW5mbyAhPSBOVUxMOworfQorCisvKioKKyAqIEdldHMgdGhlIHVzZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiB1c2VybmFtZS4KKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VyIG5hbWUKKyAqIEBwYXJhbSBpbmZvIHJldHVybiBsb2NhdGlvbiBmb3IgY29uc3QgcmVmIHRvIHVzZXIgaW5mbworICogQHBhcmFtIGVycm9yIGVycm9yIGxvY2F0aW9uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVXNlckluZm8gICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwIChkYiwgREJVU19VSURfVU5TRVQsIHVzZXJuYW1lLCBlcnJvcik7CisgIHJldHVybiAqaW5mbyAhPSBOVUxMOworfQorCisvKiogQH0gKi8KKworLyogVGVzdHMgaW4gZGJ1cy11c2VyZGItdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdXNlcmRiLmggYi9kYnVzL2RidXMtdXNlcmRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmYzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy11c2VyZGIuaApAQCAtMCwwICsxLDEzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXVzZXJkYi5oIFVzZXIgZGF0YWJhc2UgYWJzdHJhY3Rpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19VU0VSREJfSAorI2RlZmluZSBEQlVTX1VTRVJEQl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2Vycm9yICJEb24ndCBpbmNsdWRlIHRoaXMgb24gV2luZG93cyIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNVc2VyRGF0YWJhc2UgREJ1c1VzZXJEYXRhYmFzZTsKKworI2lmZGVmIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUKKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzVXNlckRhdGFiYXNlCisgKi8KK3N0cnVjdCBEQnVzVXNlckRhdGFiYXNlCit7CisgIGludCByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzSGFzaFRhYmxlICp1c2VyczsgLyoqPCBVc2VycyBpbiB0aGUgZGF0YWJhc2UgYnkgVUlEICovCisgIERCdXNIYXNoVGFibGUgKmdyb3VwczsgLyoqPCBHcm91cHMgaW4gdGhlIGRhdGFiYXNlIGJ5IEdJRCAqLworICBEQnVzSGFzaFRhYmxlICp1c2Vyc19ieV9uYW1lOyAvKio8IFVzZXJzIGluIHRoZSBkYXRhYmFzZSBieSBuYW1lICovCisgIERCdXNIYXNoVGFibGUgKmdyb3Vwc19ieV9uYW1lOyAvKio8IEdyb3VwcyBpbiB0aGUgZGF0YWJhc2UgYnkgbmFtZSAqLworCit9OworCisKK0RCdXNVc2VyRGF0YWJhc2UqIF9kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICAgICAgICAgICAodm9pZCk7CitEQnVzVXNlckRhdGFiYXNlKiBfZGJ1c191c2VyX2RhdGFiYXNlX3JlZiAgICAgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYik7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoICAgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYik7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmICAgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9naWQgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0dyb3VwSW5mbyAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVXNlckluZm8gICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwbmFtZSAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1VzZXJJbmZvKiAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgICAgICAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzR3JvdXBJbmZvKiBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCAoREJ1c1VzZXJEYXRhYmFzZSAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgICAoREJ1c1VzZXJJbmZvICAgICAqaW5mbyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkICAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbyk7CisjZW5kaWYgLyogREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAqLworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzVXNlckRhdGFiYXNlKiBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gICAgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAgICh2b2lkKSBfREJVU19HTlVDX1dBUk5fVU5VU0VEX1JFU1VMVDsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbSAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfdXNlcl9pZCAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWQpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2dyb3VwX2lkICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKTsKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX2Zyb21fdWlkICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdXNlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgX2RidXNfZ3JvdXBzX2Zyb21fdWlkCQkoZGJ1c191aWRfdCAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICoqZ3JvdXBfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpuX2dyb3VwX2lkcyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19pc19jb25zb2xlX3VzZXIgICAgICAgICAgICAgICAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19pc19hX251bWJlciAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICpudW0pOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c191c2VybmFtZV9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoY29uc3QgREJ1c1N0cmluZyAqKnVzZXJuYW1lKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2hvbWVkaXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgIChjb25zdCBEQnVzU3RyaW5nICoqaG9tZWRpcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19ob21lZGlyX2Zyb21fdXNlcm5hbWUgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpob21lZGlyKTsKKworZGJ1c19ib29sX3QgX2RidXNfaG9tZWRpcl9mcm9tX3VpZCAgICAgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmhvbWVkaXIpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19VU0VSREJfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXV1aWRnZW4uYyBiL2RidXMvZGJ1cy11dWlkZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwNDE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy11dWlkZ2VuLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11dWlkZ2VuLmMgIFRoZSBndXRzIG9mIHRoZSBkYnVzLXV1aWRnZW4gYmluYXJ5IGxpdmUgaW4gbGliZGJ1cywgaW4gdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdXVpZGdlbi5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKyNpZmRlZiBEQlVTX1dJTgorI2Vycm9yICJkYnVzLXV1aWRnZW4gc2hvdWxkIG5vdCBiZSBuZWVkZWQgb24gV2luZG93cyIKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzSW50ZXJuYWxzVXVpZGdlbiBkYnVzLXV1aWRnZW4gaW1wbGVtZW50YXRpb24KKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBGdW5jdGlvbnMgZm9yIGRidXMtdXVpZGdlbiBiaW5hcnkKKyAqCisgKiBUaGVzZSBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgQUJJLCBhbmQgaWYgeW91IGNhbGwgdGhlbQorICogeW91IHdpbGwgZ2V0IHNjcmV3ZWQgYnkgZnV0dXJlIGNoYW5nZXMuCisgKiAKKyAqIEB7CisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CityZXR1cm5fdXVpZCAoREJ1c0dVSUQgICAqdXVpZCwKKyAgICAgICAgICAgICBjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGlmICh1dWlkX3ApCisgICAgeworICAgICAgREJ1c1N0cmluZyBlbmNvZGVkOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW5jb2RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfdXVpZF9lbmNvZGUgKHV1aWQsICZlbmNvZGVkKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmVuY29kZWQsIHV1aWRfcCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBGb3IgdXNlIGJ5IHRoZSBkYnVzLXV1aWRnZW4gYmluYXJ5IE9OTFksIGRvIG5vdCBjYWxsIHRoaXMuCisgKiBXZSBjYW4gYW5kIHdpbGwgY2hhbmdlIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBtb2RpZnlpbmcKKyAqIHRoZSBsaWJkYnVzIHNvbmFtZS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgb3IgI05VTEwgZm9yIHRoZSBtYWNoaW5lIElEIGZpbGUKKyAqIEBwYXJhbSB1dWlkX3Agb3V0IHBhcmFtIHRvIHJldHVybiB0aGUgdXVpZAorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgd2hldGhlciB0byBjcmVhdGUgaXQgaWYgbm90IGFscmVhZHkgdGhlcmUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnV1aWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNHVUlEIHV1aWQ7CisgIAorICBpZiAoZmlsZW5hbWUpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmaWxlbmFtZV9zdHI7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lX3N0ciwgZmlsZW5hbWUpOworICAgICAgaWYgKCFfZGJ1c19yZWFkX3V1aWRfZmlsZSAoJmZpbGVuYW1lX3N0ciwgJnV1aWQsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGVycm9yKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICgmdXVpZCwgY3JlYXRlX2lmX25vdF9mb3VuZCwgZXJyb3IpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBpZiAoIXJldHVybl91dWlkKCZ1dWlkLCB1dWlkX3AsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBUUlVFOworICAKKyBlcnJvcjoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQHBhcmFtIHV1aWRfcCBvdXQgcGFyYW0gdG8gcmV0dXJuIHRoZSB1dWlkCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfdXVpZCAoY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzR1VJRCB1dWlkOworCisgIGlmICghX2RidXNfZ2VuZXJhdGVfdXVpZCAoJnV1aWQsIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHJldHVybl91dWlkICgmdXVpZCwgdXVpZF9wLCBlcnJvcik7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXV1aWRnZW4uaCBiL2RidXMvZGJ1cy11dWlkZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0YTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy11dWlkZ2VuLmgKQEAgLTAsMCArMSw0OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXV1aWRnZW4uaCAgVGhlIGd1dHMgb2YgdGhlIGRidXMtdXVpZGdlbiBiaW5hcnkgbGl2ZSBpbiBsaWJkYnVzLCBpbiB0aGlzIGZpbGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZkZWYgREJVU19JTlNJREVfREJVU19ICisjZXJyb3IgIllvdSBjYW4ndCBpbmNsdWRlIGRidXMtdXVpZGdlbi5oIGluIHRoZSBwdWJsaWMgaGVhZGVyIGRidXMuaCIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfVVVJREdFTl9ICisjZGVmaW5lIERCVVNfVVVJREdFTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dldF91dWlkICAgIChjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZW5zdXJlX3V1aWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2NyZWF0ZV91dWlkICAgICAgICAgICAgICAgICAgICAoY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1VVSURHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXZhbGdyaW5kLWludGVybmFsLmggYi9kYnVzL2RidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzYwYjQwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXZhbGdyaW5kLWludGVybmFsLmgKQEAgLTAsMCArMSw2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXZhbGdyaW5kLWludGVybmFsLmggLSB2YWxncmluZCBnbHVlCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19WQUxHUklORF9JTlRFUk5BTF9ICisjZGVmaW5lIERCVVNfVkFMR1JJTkRfSU5URVJOQUxfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworI2lmZGVmIFdJVEhfVkFMR1JJTkQKKyMgICBpbmNsdWRlIDxtZW1jaGVjay5oPgorIyAgIGluY2x1ZGUgPHZhbGdyaW5kLmg+CisjZWxzZQorIyAgIGRlZmluZSBWQUxHUklORF9DUkVBVEVfTUVNUE9PTChfMSwgXzIsIF8zKSBkbyB7IH0gd2hpbGUgKDApCisjICAgZGVmaW5lIFZBTEdSSU5EX0RFU1RST1lfTUVNUE9PTChfMSkgZG8geyB9IHdoaWxlICgwKQorIyAgIGRlZmluZSBWQUxHUklORF9NRU1QT09MX0FMTE9DKF8xLCBfMiwgXzMpIGRvIHsgfSB3aGlsZSAoMCkKKyMgICBkZWZpbmUgVkFMR1JJTkRfTUVNUE9PTF9GUkVFKF8xLCBfMikgZG8geyB9IHdoaWxlICgwKQorCisvKiBSZWNlbnQgZ2NjIHdpbGwgd2FybiBpZiB5b3UgaGF2ZSBhIHN0YXRlbWVudCB0aGF0J3MganVzdCBhIG1hY3JvCisgKiBleHBhbmRpbmcgdG8gKDApLCBidXQgbm90IGlmIHlvdSBoYXZlIGFuIGlubGluZSBzdHViIGZ1bmN0aW9uIHRoYXQKKyAqIGFsd2F5cyByZXR1cm5zIDAsIHNvIGxldCdzIGRvIHRoZSBsYXR0ZXIuICovCitzdGF0aWMgaW5saW5lIGludAorVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEICh2b2lkICAgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgbGVuKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK1ZBTEdSSU5EX1BSSU5URiAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorVkFMR1JJTkRfUFJJTlRGX0JBQ0tUUkFDRSAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICByZXR1cm4gMDsKK30KKworIyAgIGRlZmluZSBSVU5OSU5HX09OX1ZBTEdSSU5EIDAKKyNlbmRpZiAvKiBXSVRIX1ZBTEdSSU5EICovCisKKyNlbmRpZiAvKiBoZWFkZXIgZ3VhcmQgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy13YXRjaC5jIGIvZGJ1cy9kYnVzLXdhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzZjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy13YXRjaC5jCkBAIC0wLDAgKzEsNzYzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtd2F0Y2guYyBEQnVzV2F0Y2ggaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNXYXRjaEludGVybmFscyBEQnVzV2F0Y2ggaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBEQnVzV2F0Y2gKKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIERCdXNXYXRjaAorICovCitzdHJ1Y3QgREJ1c1dhdGNoCit7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzUG9sbGFibGUgZmQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IuICovCisgIHVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKio8IENvbmRpdGlvbnMgdG8gd2F0Y2guICovCisKKyAgREJ1c1dhdGNoSGFuZGxlciBoYW5kbGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBoYW5kbGVyLiAqLworICB2b2lkICpoYW5kbGVyX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdhdGNoIGhhbmRsZXIgZGF0YS4gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbjsgLyoqPCBGcmVlIHRoZSB3YXRjaCBoYW5kbGVyIGRhdGEuICovCisgIAorICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBkYXRhLiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jdGlvbjsgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhLiAqLworICB1bnNpZ25lZCBpbnQgZW5hYmxlZCA6IDE7ICAgICAgICAgICAgLyoqPCBXaGV0aGVyIGl0J3MgZW5hYmxlZC4gKi8KKyAgdW5zaWduZWQgaW50IG9vbV9sYXN0X3RpbWUgOiAxOyAgICAgIC8qKjwgV2hldGhlciBpdCB3YXMgT09NIGxhc3QgdGltZS4gKi8KK307CisKK2RidXNfYm9vbF90CitfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgcmV0dXJuIHdhdGNoLT5lbmFibGVkOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIHJldHVybiB3YXRjaC0+b29tX2xhc3RfdGltZTsKK30KKwordm9pZAorX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgKERCdXNXYXRjaCAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgb29tKQoreworICB3YXRjaC0+b29tX2xhc3RfdGltZSA9IG9vbTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IERCdXNXYXRjaC4gVXNlZCB0byBhZGQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgcG9sbGVkCisgKiBieSBhIG1haW4gbG9vcC4KKyAqIAorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgd2F0Y2hlZC4KKyAqIEBwYXJhbSBmbGFncyB0aGUgY29uZGl0aW9ucyB0byB3YXRjaCBmb3Igb24gdGhlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gZW5hYmxlZCB0aGUgaW5pdGlhbCBlbmFibGVkIHN0YXRlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlciBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSBmb3IgaGFuZGxlciBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKiBAcmV0dXJucyB0aGUgbmV3IERCdXNXYXRjaCBvYmplY3QuCisgKi8KK0RCdXNXYXRjaCoKK19kYnVzX3dhdGNoX25ldyAoREJ1c1BvbGxhYmxlICAgICAgZmQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIERCdXNXYXRjaCAqd2F0Y2g7CisKKyNkZWZpbmUgVkFMSURfV0FUQ0hfRkxBR1MgKERCVVNfV0FUQ0hfV1JJVEFCTEUgfCBEQlVTX1dBVENIX1JFQURBQkxFKQorICAKKyAgX2RidXNfYXNzZXJ0ICgoZmxhZ3MgJiBWQUxJRF9XQVRDSF9GTEFHUykgPT0gZmxhZ3MpOworICAKKyAgd2F0Y2ggPSBkYnVzX25ldzAgKERCdXNXYXRjaCwgMSk7CisgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgd2F0Y2gtPnJlZmNvdW50ID0gMTsKKyAgd2F0Y2gtPmZkID0gZmQ7CisgIHdhdGNoLT5mbGFncyA9IGZsYWdzOworICB3YXRjaC0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisKKyAgd2F0Y2gtPmhhbmRsZXIgPSBoYW5kbGVyOworICB3YXRjaC0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKyAgd2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAKKyAgcmV0dXJuIHdhdGNoOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNXYXRjaCBvYmplY3QuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgd2F0Y2ggb2JqZWN0LgorICovCitEQnVzV2F0Y2ggKgorX2RidXNfd2F0Y2hfcmVmIChEQnVzV2F0Y2ggKndhdGNoKQoreworICB3YXRjaC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gd2F0Y2g7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1dhdGNoIG9iamVjdAorICogYW5kIGZpbmFsaXplcyB0aGUgb2JqZWN0IGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3VucmVmIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHdhdGNoLT5yZWZjb3VudCA+IDApOworCisgIHdhdGNoLT5yZWZjb3VudCAtPSAxOworICBpZiAod2F0Y2gtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKF9kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkICh3YXRjaC0+ZmQpKQorICAgICAgICBfZGJ1c193YXJuICgidGhpcyB3YXRjaCBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIik7CisKKyAgICAgIGRidXNfd2F0Y2hfc2V0X2RhdGEgKHdhdGNoLCBOVUxMLCBOVUxMKTsgLyogY2FsbCBmcmVlX2RhdGFfZnVuY3Rpb24gKi8KKworICAgICAgaWYgKHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikKKwkoKiB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pICh3YXRjaC0+aGFuZGxlcl9kYXRhKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlICh3YXRjaCk7CisgICAgfQorfQorCisvKioKKyAqIENsZWFycyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBub3ctaW52YWxpZCB3YXRjaCBvYmplY3Qgc28gdGhhdAorICogbm8gb25lIHRyaWVzIHRvIHVzZSBpdC4gIFRoaXMgaXMgYmVjYXVzZSBhIHdhdGNoIG1heSBzdGF5IGFsaXZlIGR1ZQorICogdG8gcmVmZXJlbmNlIGNvdW50cyBhZnRlciB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZC4KKyAqIEludmFsaWRhdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY2F0Y2ggYnVncy4gSXQgYWxzbworICoga2VlcHMgcGVvcGxlIGZyb20gZG9pbmcgZG9ya3kgdGhpbmdzIGxpa2UgYXNzdW1pbmcgZmlsZSBkZXNjcmlwdG9ycworICogYXJlIHVuaXF1ZSAobmV2ZXIgcmVjeWNsZWQpLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggb2JqZWN0LgorICovCit2b2lkCitfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19wb2xsYWJsZV9pbnZhbGlkYXRlICgmd2F0Y2gtPmZkKTsKKyAgd2F0Y2gtPmZsYWdzID0gMDsKK30KKworLyoqCisgKiBTYW5pdGl6ZXMgdGhlIGdpdmVuIGNvbmRpdGlvbiBzbyB0aGF0IGl0IG9ubHkgY29udGFpbnMKKyAqIGZsYWdzIHRoYXQgdGhlIERCdXNXYXRjaCByZXF1ZXN0ZWQuIGUuZy4gaWYgdGhlCisgKiB3YXRjaCBpcyBhIERCVVNfV0FUQ0hfUkVBREFCTEUgd2F0Y2ggdGhlbgorICogREJVU19XQVRDSF9XUklUQUJMRSB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGNvbmRpdGlvbi4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqIEBwYXJhbSBjb25kaXRpb24gYWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uIHRvIHNhbml0aXplLgorICovCit2b2lkCitfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY29uZGl0aW9uKQoreworICBpZiAoISh3YXRjaC0+ZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSkKKyAgICAqY29uZGl0aW9uICY9IH5EQlVTX1dBVENIX1JFQURBQkxFOworICBpZiAoISh3YXRjaC0+ZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKSkKKyAgICAqY29uZGl0aW9uICY9IH5EQlVTX1dBVENIX1dSSVRBQkxFOworfQorCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1dhdGNoTGlzdAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiB3YXRjaGVzCisgKiBhbmQgYSBzZXQgb2YgREJ1c0FkZFdhdGNoRnVuY3Rpb24vREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24uCisgKiBBdXRvbWF0aWNhbGx5IGhhbmRsZXMgcmVtb3ZpbmcvcmUtYWRkaW5nIHdhdGNoZXMKKyAqIHdoZW4gdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGlzIHVwZGF0ZWQgb3IgY2hhbmdlZC4KKyAqIEhvbGRzIGEgcmVmZXJlbmNlIGNvdW50IHRvIGVhY2ggd2F0Y2guCisgKgorICogVXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYm90aCBEQnVzU2VydmVyIGFuZAorICogREJ1c0NsaWVudC4KKyAqCisgKi8KKworLyoqCisgKiBEQnVzV2F0Y2hMaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEFsbCBmaWVsZHMKKyAqIGFyZSBwcml2YXRlLgorICoKKyAqLworc3RydWN0IERCdXNXYXRjaExpc3QKK3sKKyAgREJ1c0xpc3QgKndhdGNoZXM7ICAgICAgICAgICAvKio8IFdhdGNoIG9iamVjdHMuICovCisKKyAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gYWRkX3dhdGNoX2Z1bmN0aW9uOyAgICAvKio8IENhbGxiYWNrIGZvciBhZGRpbmcgYSB3YXRjaC4gKi8KKyAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gcmVtb3ZlX3dhdGNoX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIGZvciByZW1vdmluZyBhIHdhdGNoLiAqLworICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gd2F0Y2hfdG9nZ2xlZF9mdW5jdGlvbjsgLyoqPCBDYWxsYmFjayBvbiB0b2dnbGluZyBlbmFibGVtZW50ICovCisgIHZvaWQgKndhdGNoX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB3YXRjaCBjYWxsYmFja3MgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiB3YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb247ICAvKio8IEZyZWUgZnVuY3Rpb24gZm9yIHdhdGNoIGNhbGxiYWNrIGRhdGEgKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB3YXRjaCBsaXN0LiBSZXR1cm5zICNOVUxMIGlmIGluc3VmZmljaWVudAorICogbWVtb3J5IGV4aXN0cy4KKyAqCisgKiBAcmV0dXJucyB0aGUgbmV3IHdhdGNoIGxpc3QsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNXYXRjaExpc3QqCitfZGJ1c193YXRjaF9saXN0X25ldyAodm9pZCkKK3sKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdDsKKworICB3YXRjaF9saXN0ID0gZGJ1c19uZXcwIChEQnVzV2F0Y2hMaXN0LCAxKTsKKyAgaWYgKHdhdGNoX2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gd2F0Y2hfbGlzdDsKK30KKworLyoqCisgKiBGcmVlcyBhIERCdXNXYXRjaExpc3QuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2xpc3RfZnJlZSAoREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdCkKK3sKKyAgLyogZnJlZSB3YXRjaF9kYXRhIGFuZCByZW1vdmVzIHdhdGNoZXMgYXMgYSBzaWRlIGVmZmVjdCAqLworICBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHdhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJndhdGNoX2xpc3QtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIF9kYnVzX3dhdGNoX3VucmVmLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisKKyAgZGJ1c19mcmVlICh3YXRjaF9saXN0KTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorc3RhdGljIGNvbnN0IGNoYXIqCit3YXRjaF9mbGFnc190b19zdHJpbmcgKGludCBmbGFncykKK3sKKyAgY29uc3QgY2hhciAqd2F0Y2hfdHlwZTsKKworICBpZiAoKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkgJiYKKyAgICAgIChmbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpKQorICAgIHdhdGNoX3R5cGUgPSAicmVhZHdyaXRlIjsKKyAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHdhdGNoX3R5cGUgPSAicmVhZCI7CisgIGVsc2UgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICB3YXRjaF90eXBlID0gIndyaXRlIjsKKyAgZWxzZQorICAgIHdhdGNoX3R5cGUgPSAibm90IHJlYWQgb3Igd3JpdGUiOworICByZXR1cm4gd2F0Y2hfdHlwZTsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworLyoqCisgKiBTZXRzIHRoZSB3YXRjaCBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMgdGhlICJiYWNrZW5kIgorICogZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkgYW5kCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIHRoZSBhZGQgd2F0Y2ggZnVuY3Rpb24uCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIHRoZSByZW1vdmUgd2F0Y2ggZnVuY3Rpb24uCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiBvbiB0b2dnbGluZyBlbmFibGVkIGZsYWcsIG9yICNOVUxMCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhvc2UgZnVuY3Rpb25zLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgLyogQWRkIHdhdGNoZXMgd2l0aCB0aGUgbmV3IHdhdGNoIGZ1bmN0aW9uLCBmYWlsaW5nIG9uIE9PTSAqLworICBpZiAoYWRkX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgYSAlcyB3YXRjaCBvbiBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIHVzaW5nIG5ld2x5LXNldCBhZGQgd2F0Y2ggZnVuY3Rpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfZmxhZ3NfdG9fc3RyaW5nIChkYnVzX3dhdGNoX2dldF9mbGFncyAobGluay0+ZGF0YSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAod2F0Y2gtPmZkKSk7CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoISgqIGFkZF9mdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiByZW1vdmUgaXQgYWxsIGFnYWluIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmsyOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisgICAgICAgICAgICAgIHdoaWxlIChsaW5rMiAhPSBsaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rMik7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggKndhdGNoMiA9IGxpbmsyLT5kYXRhOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUmVtb3Zpbmcgd2F0Y2ggb24gZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiB1c2luZyBuZXdseS1zZXQgcmVtb3ZlIGZ1bmN0aW9uIGJlY2F1c2UgaW5pdGlhbCBhZGQgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlICh3YXRjaDItPmZkKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAobGluazItPmRhdGEsIGRhdGEpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBsaW5rMiA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorICAKKyAgLyogUmVtb3ZlIGFsbCBjdXJyZW50IHdhdGNoZXMgZnJvbSBwcmV2aW91cyB3YXRjaCBoYW5kbGVycyAqLworCisgIGlmICh3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgYWxsIHByZS1leGlzdGluZyB3YXRjaGVzXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSk7CisgICAgfQorCisgIGlmICh3YXRjaF9saXN0LT53YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB3YXRjaF9saXN0LT53YXRjaF9mcmVlX2RhdGFfZnVuY3Rpb24pICh3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgCisgIHdhdGNoX2xpc3QtPmFkZF93YXRjaF9mdW5jdGlvbiA9IGFkZF9mdW5jdGlvbjsKKyAgd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uID0gcmVtb3ZlX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT53YXRjaF90b2dnbGVkX2Z1bmN0aW9uID0gdG9nZ2xlZF9mdW5jdGlvbjsKKyAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSA9IGRhdGE7CisgIHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGRzIGEgbmV3IHdhdGNoIHRvIHRoZSB3YXRjaCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB3YXRjaF9saXN0IHRoZSB3YXRjaCBsaXN0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKERCdXNXYXRjaExpc3QgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZ3YXRjaF9saXN0LT53YXRjaGVzLCB3YXRjaCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgX2RidXNfd2F0Y2hfcmVmICh3YXRjaCk7CisKKyAgaWYgKHdhdGNoX2xpc3QtPmFkZF93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgd2F0Y2ggb24gZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAod2F0Y2gtPmZkKSk7CisgICAgICAKKyAgICAgIGlmICghKCogd2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB3YXRjaCBmcm9tIHRoZSB3YXRjaCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJOb25leGlzdGVudCB3YXRjaCB3YXMgcmVtb3ZlZCIpOworICAKKyAgaWYgKHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyB3YXRjaCBvbiBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlICh3YXRjaC0+ZmQpKTsKKyAgICAgIAorICAgICAgKCogd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgICB9CisgIAorICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworfQorCisvKioKKyAqIFNldHMgYSB3YXRjaCB0byB0aGUgZ2l2ZW4gZW5hYmxlZCBzdGF0ZSwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbidzIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgI1RSVUUgdG8gZW5hYmxlCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2xpc3RfdG9nZ2xlX3dhdGNoIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGVuYWJsZWQgPSAhIWVuYWJsZWQ7CisgIAorICBpZiAoZW5hYmxlZCA9PSB3YXRjaC0+ZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgd2F0Y2gtPmVuYWJsZWQgPSBlbmFibGVkOworICAKKyAgaWYgKHdhdGNoX2xpc3QtPndhdGNoX3RvZ2dsZWRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiVG9nZ2xpbmcgd2F0Y2ggJXAgb24gZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlICh3YXRjaC0+ZmQpLAorICAgICAgICAgICAgICAgICAgICAgd2F0Y2gtPmVuYWJsZWQpOworICAgICAgCisgICAgICAoKiB3YXRjaF9saXN0LT53YXRjaF90b2dnbGVkX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgYWxsIHdhdGNoZXMgdG8gdGhlIGdpdmVuIGVuYWJsZWQgc3RhdGUsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSB0byBlbmFibGUKKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfYWxsX3dhdGNoZXMgKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICBlbmFibGVkKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisgICAgICAgbGluayAhPSBOVUxMOworICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzLCBsaW5rKSkKKyAgICB7CisgICAgICBfZGJ1c193YXRjaF9saXN0X3RvZ2dsZV93YXRjaCAod2F0Y2hfbGlzdCwgbGluay0+ZGF0YSwgZW5hYmxlZCk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIHRoZSB3YXRjaC4KKyAqCisgKiBAdG9kbyB0aGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIGJlY2F1c2Ugb2YgdGhlIHdlaXJkCisgKiB3YXkgY29ubmVjdGlvbiB3YXRjaGVzIGFyZSBkb25lLCBzZWUgdGhlIG5vdGUKKyAqIGluIGRvY3MgZm9yIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKCkuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaAorICogQHBhcmFtIGhhbmRsZXIgdGhlIG5ldyBoYW5kbGVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmcmVlIGRhdGEgd2l0aCB0aGlzCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3NldF9oYW5kbGVyIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBpZiAod2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorICAgICgqIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikgKHdhdGNoLT5oYW5kbGVyX2RhdGEpOworCisgIHdhdGNoLT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgd2F0Y2gtPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisgIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNXYXRjaCBEQnVzV2F0Y2gKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgT2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLgorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzV2F0Y2guIEEgd2F0Y2ggcmVwcmVzZW50cworICogYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGUgbWFpbiBsb29wIG5lZWRzIHRvIG1vbml0b3IsCisgKiBhcyBpbiBRdCdzIFFTb2NrZXROb3RpZmllciBvciBHTGliJ3MgZ19pb19hZGRfd2F0Y2goKS4KKyAqCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvciBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkKKyAqIHRvIGJlIG5vdGlmaWVkIHdoZW4gbGliZGJ1cyBuZWVkcyB0byBhZGQgb3IgcmVtb3ZlIHdhdGNoZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzV2F0Y2gKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgZGVzY3JpcHRvcgorICogdG8gYmUgd2F0Y2hlZCBmb3IgY2hhbmdlcyBpbiByZWFkYWJpbGl0eSwKKyAqIHdyaXRhYmlsaXR5LCBvciBoYW5ndXAuCisgKi8KKworLyoqCisgKiBEZXByZWNhdGVkIGZvcm1lciBuYW1lIG9mIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKS4KKyAqIAorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaC4KKyAqLworaW50CitkYnVzX3dhdGNoX2dldF9mZCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAtMSk7CisKKyAgcmV0dXJuIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQod2F0Y2gpOworfQorCisvKioKKyAqIFJldHVybnMgYSBVTklYIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLAorICogd2hpY2ggbWF5IGJlIGEgcGlwZSwgc29ja2V0LCBvciBvdGhlciB0eXBlIG9mCisgKiBkZXNjcmlwdG9yLiBPbiBVTklYIHRoaXMgaXMgcHJlZmVycmVkIHRvCisgKiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSBzaW5jZSBpdCB3b3JrcyB3aXRoCisgKiBtb3JlIGtpbmRzIG9mICNEQnVzV2F0Y2guCisgKgorICogQWx3YXlzIHJldHVybnMgLTEgb24gV2luZG93cy4gT24gV2luZG93cyB5b3UgdXNlCisgKiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSB0byBnZXQgYSBXaW5zb2NrIHNvY2tldCB0byB3YXRjaC4KKyAqIAorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaC4KKyAqLworaW50CitkYnVzX3dhdGNoX2dldF91bml4X2ZkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIC0xKTsKKworICAvKiBGSVhNRSByZW1vdmUgI2lmZGVmIGFuZCBkbyB0aGlzIG9uIGEgbG93ZXIgbGV2ZWwKKyAgICogKHdhdGNoIHNob3VsZCBoYXZlIHNldF9zb2NrZXQgYW5kIHNldF91bml4X2ZkIGFuZCB0cmFjaworICAgKiB3aGljaCBpdCBoYXMsIGFuZCB0aGUgdHJhbnNwb3J0IHNob3VsZCBwcm92aWRlIHRoZQorICAgKiBhcHByb3ByaWF0ZSB3YXRjaCB0eXBlKQorICAgKi8KKyNpZmRlZiBEQlVTX1VOSVgKKyAgcmV0dXJuIHdhdGNoLT5mZDsKKyNlbHNlCisgIHJldHVybiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoIHdhdGNoICk7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc29ja2V0IHRvIGJlIHdhdGNoZWQsIG9uIFVOSVggdGhpcyB3aWxsIHJldHVybiAtMSBpZiBvdXIKKyAqIHRyYW5zcG9ydCBpcyBub3Qgc29ja2V0LWJhc2VkIHNvIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSBpcworICogcHJlZmVycmVkLgorICoKKyAqIE9uIFdpbmRvd3MsIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSByZXR1cm5zIC0xIGJ1dCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIGEgV2luc29jayBzb2NrZXQgKGFzc3VtaW5nIHRoZSB0cmFuc3BvcnQgaXMgc29ja2V0LWJhc2VkLAorICogYXMgaXQgYWx3YXlzIGlzIGZvciBub3cpLgorICogCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgc29ja2V0IHRvIHdhdGNoLgorICovCitpbnQKK2RidXNfd2F0Y2hfZ2V0X3NvY2tldCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAtMSk7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgcmV0dXJuIHdhdGNoLT5mZDsKKyNlbHNlCisgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludCAod2F0Y2gtPmZkKTsKKyNlbmRpZgorfQorCitEQnVzU29ja2V0CitfZGJ1c193YXRjaF9nZXRfc29ja2V0IChEQnVzV2F0Y2ggKndhdGNoKQoreworICBEQnVzU29ja2V0IHM7CisKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBzLmZkID0gd2F0Y2gtPmZkOworI2Vsc2UKKyAgcyA9IHdhdGNoLT5mZDsKKyNlbmRpZgorCisgIHJldHVybiBzOworfQorCitEQnVzUG9sbGFibGUKK19kYnVzX3dhdGNoX2dldF9wb2xsYWJsZSAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKworICByZXR1cm4gd2F0Y2gtPmZkOworfQorCisvKioKKyAqIEdldHMgZmxhZ3MgZnJvbSBEQnVzV2F0Y2hGbGFncyBpbmRpY2F0aW5nCisgKiB3aGF0IGNvbmRpdGlvbnMgc2hvdWxkIGJlIG1vbml0b3JlZCBvbiB0aGUKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogVGhlIGZsYWdzIHJldHVybmVkIHdpbGwgb25seSBjb250YWluIERCVVNfV0FUQ0hfUkVBREFCTEUKKyAqIGFuZCBEQlVTX1dBVENIX1dSSVRBQkxFLCBuZXZlciBEQlVTX1dBVENIX0hBTkdVUCBvcgorICogREJVU19XQVRDSF9FUlJPUjsgYWxsIHdhdGNoZXMgaW1wbGljaXRseSBpbmNsdWRlIGEgd2F0Y2gKKyAqIGZvciBoYW5ndXBzLCBlcnJvcnMsIGFuZCBvdGhlciBleGNlcHRpb25hbCBjb25kaXRpb25zLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSBjb25kaXRpb25zIHRvIHdhdGNoLgorICovCit1bnNpZ25lZCBpbnQKK2RidXNfd2F0Y2hfZ2V0X2ZsYWdzIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIDApOworICBfZGJ1c19hc3NlcnQgKCh3YXRjaC0+ZmxhZ3MgJiBWQUxJRF9XQVRDSF9GTEFHUykgPT0gd2F0Y2gtPmZsYWdzKTsKKworICByZXR1cm4gd2F0Y2gtPmZsYWdzOworfQorCisvKioKKyAqIEdldHMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfd2F0Y2hfc2V0X2RhdGEoKQorICogb3IgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyBwcmV2aW91c2x5LXNldCBkYXRhLgorICovCit2b2lkKgorZGJ1c193YXRjaF9nZXRfZGF0YSAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCBOVUxMKTsKKworICByZXR1cm4gd2F0Y2gtPmRhdGE7Cit9CisKKy8qKgorICogU2V0cyBkYXRhIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBkYnVzX3dhdGNoX2dldF9kYXRhKCkuCisgKiBJbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSBEQnVzQWRkV2F0Y2hGdW5jdGlvbiBhbmQKKyAqIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uIHRvIHN0b3JlIHRoZWlyIG93biBkYXRhLiAgRm9yIGV4YW1wbGUgd2l0aAorICogUXQgeW91IG1pZ2h0IHN0b3JlIHRoZSBRU29ja2V0Tm90aWZpZXIgZm9yIHRoaXMgd2F0Y2ggYW5kIHdpdGggR0xpYgorICogeW91IG1pZ2h0IHN0b3JlIGEgR1NvdXJjZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YS4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2RidXNfd2F0Y2hfc2V0X2RhdGEgKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTZXR0aW5nIHdhdGNoIGZkICUiIERCVVNfUE9MTEFCTEVfRk9STUFUICIgZGF0YSB0byBkYXRhID0gJXAgZnVuY3Rpb24gPSAlcCBmcm9tIGRhdGEgPSAlcCBmdW5jdGlvbiA9ICVwXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKHdhdGNoLT5mZCksCisgICAgICAgICAgICAgICAgIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbiwgd2F0Y2gtPmRhdGEsIHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24pOworICAKKyAgaWYgKHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB3YXRjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKSAod2F0Y2gtPmRhdGEpOworICAKKyAgd2F0Y2gtPmRhdGEgPSBkYXRhOworICB3YXRjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBhIHdhdGNoIGlzIGVuYWJsZWQgb3Igbm90LiBJZiBub3QKKyAqIGVuYWJsZWQsIGl0IHNob3VsZCBub3QgYmUgcG9sbGVkIGJ5IHRoZSBtYWluIGxvb3AuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgd2F0Y2ggaXMgZW5hYmxlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIHdhdGNoLT5lbmFibGVkOworfQorCisKKy8qKgorICogQ2FsbGVkIHRvIG5vdGlmeSB0aGUgRC1CdXMgbGlicmFyeSB3aGVuIGEgcHJldmlvdXNseS1hZGRlZCB3YXRjaCBpcworICogcmVhZHkgZm9yIHJlYWRpbmcgb3Igd3JpdGluZywgb3IgaGFzIGFuIGV4Y2VwdGlvbiBzdWNoIGFzIGEgaGFuZ3VwLgorICogCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgI0ZBTFNFLCB0aGVuIHRoZSBmaWxlIGRlc2NyaXB0b3IgbWF5IHN0aWxsCisgKiBiZSByZWFkeSBmb3IgcmVhZGluZyBvciB3cml0aW5nLCBidXQgbW9yZSBtZW1vcnkgaXMgbmVlZGVkIGluIG9yZGVyCisgKiB0byBkbyB0aGUgcmVhZGluZyBvciB3cml0aW5nLiBJZiB5b3UgaWdub3JlIHRoZSAjRkFMU0UgcmV0dXJuLCB5b3VyCisgKiBhcHBsaWNhdGlvbiBtYXkgc3BpbiBpbiBhIGJ1c3kgbG9vcCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHVudGlsCisgKiBtZW1vcnkgYmVjb21lcyBhdmFpbGFibGUsIGJ1dCBub3RoaW5nIG1vcmUgY2F0YXN0cm9waGljIHNob3VsZAorICogaGFwcGVuLgorICoKKyAqIGRidXNfd2F0Y2hfaGFuZGxlKCkgY2Fubm90IGJlIGNhbGxlZCBkdXJpbmcgdGhlCisgKiBEQnVzQWRkV2F0Y2hGdW5jdGlvbiwgYXMgdGhlIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgcmVhZHkgdG8gaGFuZGxlCisgKiB0aGF0IHdhdGNoIHlldC4KKyAqIAorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gcmVmZXJlbmNlIGEgREJ1c1dhdGNoIGFmdGVyIGl0IGhhcyBiZWVuIHBhc3NlZAorICogdG8gcmVtb3ZlX2Z1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEBwYXJhbSBmbGFncyB0aGUgcG9sbCBjb25kaXRpb24gdXNpbmcgI0RCdXNXYXRjaEZsYWdzIHZhbHVlcworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZXJlIHdhc24ndCBlbm91Z2ggbWVtb3J5IAorICovCitkYnVzX2Jvb2xfdAorZGJ1c193YXRjaF9oYW5kbGUgKERCdXNXYXRjaCAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncykKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoIV9kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkICh3YXRjaC0+ZmQpIHx8IHdhdGNoLT5mbGFncyA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiV2F0Y2ggaXMgaW52YWxpZCwgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkICh3YXRjaC0+ZmQpIC8qIGZhaWxzIGlmIHdhdGNoIHdhcyByZW1vdmVkICovLCBUUlVFKTsKKyAgCisgIF9kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAod2F0Y2gsICZmbGFncyk7CisKKyAgaWYgKGZsYWdzID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIHNhbml0aXphdGlvbiwgd2F0Y2ggZmxhZ3Mgb24gZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiB3ZXJlIDBcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKHdhdGNoLT5mZCkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgqIHdhdGNoLT5oYW5kbGVyKSAod2F0Y2gsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLT5oYW5kbGVyX2RhdGEpOworfQorCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXdhdGNoLmggYi9kYnVzL2RidXMtd2F0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDhiYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXdhdGNoLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy13YXRjaC5oIERCdXNXYXRjaCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19XQVRDSF9ICisjZGVmaW5lIERCVVNfV0FUQ0hfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzV2F0Y2hJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyogUHVibGljIG1ldGhvZHMgb24gREJ1c1dhdGNoIGFyZSBpbiBkYnVzLWNvbm5lY3Rpb24uaCAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzV2F0Y2hMaXN0IERCdXNXYXRjaExpc3Q7CisKKyNkZWZpbmUgX0RCVVNfV0FUQ0hfTlZBTCAoMTw8NCkKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB3YXRjaCBpcyBoYW5kbGVkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEhhbmRsZXIpIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNXYXRjaCogX2RidXNfd2F0Y2hfbmV3ICAgICAgICAgICAgICAgIChEQnVzUG9sbGFibGUgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1dhdGNoKiBfZGJ1c193YXRjaF9yZWYgICAgICAgICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICBfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmNvbmRpdGlvbik7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoSGFuZGxlciAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1dhdGNoTGlzdCogX2RidXNfd2F0Y2hfbGlzdF9uZXcgICAgICAgICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAgICAgICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7Cit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1dhdGNoTGlzdCAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICBvb20pOworCitEQnVzU29ja2V0ICAgICBfZGJ1c193YXRjaF9nZXRfc29ja2V0ICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzUG9sbGFibGUgICBfZGJ1c193YXRjaF9nZXRfcG9sbGFibGUgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19XQVRDSF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMuaCBiL2RidXMvZGJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmNlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMuaApAQCAtMCwwICsxLDEwNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLmggIENvbnZlbmllbmNlIGhlYWRlciBpbmNsdWRpbmcgYWxsIG90aGVyIGhlYWRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSAorI2RlZmluZSBEQlVTX0gKKworI2RlZmluZSBEQlVTX0lOU0lERV9EQlVTX0ggMQorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFyY2gtZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hZGRyZXNzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1taXNjLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXIuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hhcmVkLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNpZ25hdHVyZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeW50YXguaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorCisjdW5kZWYgREJVU19JTlNJREVfREJVU19ICisKKy8qKgorICogQGRlZmdyb3VwIERCdXMgRC1CdXMgbG93LWxldmVsIHB1YmxpYyBBUEkKKyAqIEBicmllZiBUaGUgbG93LWxldmVsIHB1YmxpYyBBUEkgb2YgdGhlIEQtQnVzIGxpYnJhcnkKKyAqCisgKiBsaWJkYnVzIHByb3ZpZGVzIGEgbG93LWxldmVsIEMgQVBJIGludGVuZGVkIHByaW1hcmlseSBmb3IgdXNlIGJ5CisgKiBiaW5kaW5ncyB0byBzcGVjaWZpYyBvYmplY3Qgc3lzdGVtcyBhbmQgbGFuZ3VhZ2VzLiAgRC1CdXMgaXMgbW9zdAorICogY29udmVuaWVudCB3aGVuIHVzZWQgd2l0aCB0aGUgR0xpYiBiaW5kaW5ncywgUHl0aG9uIGJpbmRpbmdzLCBRdAorICogYmluZGluZ3MsIE1vbm8gYmluZGluZ3MsIGFuZCBzbyBmb3J0aC4gIFRoaXMgbG93LWxldmVsIEFQSSBoYXMgYQorICogbG90IG9mIGNvbXBsZXhpdHkgdXNlZnVsIG9ubHkgZm9yIGJpbmRpbmdzLgorICogCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBtYWlucGFnZQorICoKKyAqIFRoaXMgbWFudWFsIGRvY3VtZW50cyB0aGUgPGVtPmxvdy1sZXZlbDwvZW0+IEQtQnVzIEMgQVBJLiA8Yj5JZiB5b3UgdXNlCisgKiB0aGlzIGxvdy1sZXZlbCBBUEkgZGlyZWN0bHksIHlvdSdyZSBzaWduaW5nIHVwIGZvciBzb21lIHBhaW4uPC9iPgorICoKKyAqIENhdmVhdHMgYXNpZGUsIHlvdSBtaWdodCBnZXQgc3RhcnRlZCBsZWFybmluZyB0aGUgbG93LWxldmVsIEFQSSBieSByZWFkaW5nCisgKiBhYm91dCBAcmVmIERCdXNDb25uZWN0aW9uIGFuZCBAcmVmIERCdXNNZXNzYWdlLgorICogCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBwbGFjZXMgdG8gbG9vayBmb3IgRC1CdXMgaW5mb3JtYXRpb24sIHN1Y2gKKyAqIGFzIHRoZSB0dXRvcmlhbCBhbmQgdGhlIHNwZWNpZmljYXRpb247IHRob3NlIGNhbiBiZSBmb3VuZCBhdCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzIj50aGUgRC1CdXMKKyAqIHdlYnNpdGU8L2E+LiBJZiB5b3UncmUgaW50ZXJlc3RlZCBpbiBhIHN5c2FkbWluIG9yIHBhY2thZ2UKKyAqIG1haW50YWluZXIncyBwZXJzcGVjdGl2ZSBvbiB0aGUgZGJ1cy1kYWVtb24gaXRzZWxmIGFuZCBpdHMKKyAqIGNvbmZpZ3VyYXRpb24sIGJlIHN1cmUgdG8gY2hlY2sgb3V0IHRoZSBtYW4gcGFnZXMgYXMgd2VsbC4KKyAqCisgKiBUaGUgbG93LWxldmVsIEFQSSBkb2N1bWVudGVkIGluIHRoaXMgbWFudWFsIGRlbGliZXJhdGVseSBsYWNrcworICogbW9zdCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgLSB0aG9zZSBhcmUgbGVmdCB1cCB0byBoaWdoZXItbGV2ZWwgbGlicmFyaWVzCisgKiBiYXNlZCBvbiBmcmFtZXdvcmtzIHN1Y2ggYXMgR0xpYiwgUXQsIFB5dGhvbiwgTW9ubywgSmF2YSwKKyAqIGV0Yy4gVGhlc2UgaGlnaGVyLWxldmVsIGxpYnJhcmllcyAob2Z0ZW4gY2FsbGVkICJELUJ1cyBiaW5kaW5ncyIpCisgKiBoYXZlIGZlYXR1cmVzIHN1Y2ggYXMgb2JqZWN0IHN5c3RlbXMgYW5kIG1haW4gbG9vcHMgdGhhdCBhbGxvdyBhCisgKiA8ZW0+bXVjaDwvZW0+IG1vcmUgY29udmVuaWVudCBBUEkuCisgKiAKKyAqIFRoZSBsb3ctbGV2ZWwgQVBJIGFsc28gY29udGFpbnMgcGxlbnR5IG9mIGNsdXR0ZXIgdG8gc3VwcG9ydAorICogaW50ZWdyYXRpb24gd2l0aCBhcmJpdHJhcnkgb2JqZWN0IHN5c3RlbXMsIGxhbmd1YWdlcywgbWFpbiBsb29wcywKKyAqIGFuZCBzbyBmb3J0aC4gVGhlc2UgZmVhdHVyZXMgYWRkIGEgbG90IG9mIG5vaXNlIHRvIHRoZSBBUEkgdGhhdCB5b3UKKyAqIHByb2JhYmx5IGRvbid0IGNhcmUgYWJvdXQgdW5sZXNzIHlvdSdyZSBjb2RpbmcgYSBiaW5kaW5nLgorICoKKyAqIFRoaXMgbWFudWFsIGFsc28gY29udGFpbnMgZG9jcyBmb3IgQHJlZiBEQnVzSW50ZXJuYWxzICJELUJ1cyBpbnRlcm5hbHMiLAorICogc28geW91IGNhbiB1c2UgaXQgdG8gZ2V0IG9yaWVudGVkIHRvIHRoZSBELUJ1cyBzb3VyY2UgY29kZSBpZiB5b3UncmUKKyAqIGludGVyZXN0ZWQgaW4gcGF0Y2hpbmcgdGhlIGNvZGUuIFlvdSBzaG91bGQgYWxzbyByZWFkIHRoZQorICogZmlsZSBIQUNLSU5HIHdoaWNoIGNvbWVzIHdpdGggdGhlIHNvdXJjZSBjb2RlIGlmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgdG8KKyAqIEQtQnVzLgorICoKKyAqIEFzIHlvdSByZWFkIHRoZSBjb2RlLCB5b3UgY2FuIGlkZW50aWZ5IGludGVybmFsIEQtQnVzIGZ1bmN0aW9ucworICogYmVjYXVzZSB0aGV5IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZSAoJ18nKSBjaGFyYWN0ZXIuIEFsc28sIGFueQorICogaWRlbnRpZmllciBvciBtYWNybyB0aGF0IGxhY2tzIGEgREJ1cywgZGJ1c18sIG9yIERCVVNfIG5hbWVwYWNlCisgKiBwcmVmaXggaXMgaW50ZXJuYWwsIHdpdGggYSBjb3VwbGUgb2YgZXhjZXB0aW9ucyBzdWNoIGFzICNOVUxMLAorICogI1RSVUUsIGFuZCAjRkFMU0UuCisgKi8KKworI2VuZGlmIC8qIERCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy92ZXJzaW9uaW5mby5yYy5pbiBiL2RidXMvdmVyc2lvbmluZm8ucmMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NWIzOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvdmVyc2lvbmluZm8ucmMuaW4KQEAgLTAsMCArMSw1MiBAQAorLyogdmVyc2lvbmluZm8ucmMuaW4gLSBmb3IgZGJ1cworICogQ29weXJpZ2h0IChDKSAyMDA1IGcxMCBDb2RlIEdtYkgKKyAqIAorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworICogdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworIAorLyogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSBjb25maWd1cmUgdG8gY3JlYXRlIHZlcnNpb25pbmZvLnJjICovCisKKyNsaW5lIF9fTElORV9fICJ2ZXJzaW9uaW5mby5yYy5pbiIKKworI2luY2x1ZGUgPGFmeHJlcy5oPgorCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIEBCVUlMRF9GSUxFVkVSU0lPTkAKKyBQUk9EVUNUVkVSU0lPTiBAQlVJTERfRklMRVZFUlNJT05ACisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDIxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgyMEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MUwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiUHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiRnJlZURlc2t0b3Aub3JnXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImRidXMgLSBGcmVlRGVza3RvcCBtZXNzYWdlIGJ1cyBzeXN0ZW1cMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJkYnVzXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwOSBGcmVlRGVza3RvcC5vcmdcMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJkYnVzLTEuZGxsXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIlwwIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgImRidXNcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICJAQlVJTERfVElNRVNUQU1QQFwwIgorICAgICAgICBFTkQKKyAgICBFTkQKK0VORAorCmRpZmYgLS1naXQgYS9kb2MvLmdpdGlnbm9yZSBiL2RvYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE4IEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi4xLmh0bWwKKyoubG8KKyoubGEKKyoubworYXBpCitkYnVzLmRldmhlbHAKK2RidXMtc3BlY2lmaWNhdGlvbi5odG1sCitkYnVzLXRlc3QtcGxhbi5odG1sCitkYnVzLXR1dG9yaWFsLmh0bWwKK2RidXMtZmFxLmh0bWwKK2RidXMtZGFlbW9uLjEKK2RidXMtZG9jcworZGJ1cy1kb2NzLnRhci5negorZG94eWdlbi5zdGFtcApkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlLmFtIGIvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzg1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOTQgQEAKK2FwaWRpciA9IEBodG1sZGlyQC9hcGkKKworbWFuX3BhZ2VzID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLjEgXAorCWRidXMtZGFlbW9uLjEgXAorCWRidXMtbGF1bmNoLjEgXAorCWRidXMtbW9uaXRvci4xIFwKKwlkYnVzLXJ1bi1zZXNzaW9uLjEgXAorCWRidXMtc2VuZC4xIFwKKwlkYnVzLXRlc3QtdG9vbC4xIFwKKwlkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEgXAorCWRidXMtdXVpZGdlbi4xIFwKKwkkKE5VTEwpCisKK01BTl9YTUxfRklMRVMgPSAkKHBhdHN1YnN0ICUuMSwlLjEueG1sLCQobWFuX3BhZ2VzKSkKKworaWYgREJVU19YTUxfRE9DU19FTkFCTEVECittYW4xX01BTlMgPSAkKG1hbl9wYWdlcykKK2VuZGlmCisKK01BTl9IVE1MX0ZJTEVTID0gJChwYXRzdWJzdCAlLjEsJS4xLmh0bWwsJChtYW5fcGFnZXMpKQorCitEVERTID0gXAorCWJ1c2NvbmZpZy5kdGQgXAorCWludHJvc3BlY3QuZHRkCisKK2Rpc3RfZG9jX0RBVEEgPSBzeXN0ZW0tYWN0aXZhdGlvbi50eHQKKworIyB1cGxvYWRlZCBhbmQgZGlzdHJpYnV0ZWQsIGJ1dCBub3QgaW5zdGFsbGVkCitTVEFUSUNfRE9DUyA9IFwKKwlkYnVzLWZhcS54bWwgXAorCWRidXMtc3BlY2lmaWNhdGlvbi54bWwgXAorCWRidXMtdGVzdC1wbGFuLnhtbCBcCisJZGJ1cy10dXRvcmlhbC54bWwgXAorCWRidXMtYXBpLWRlc2lnbi5kdWNrIFwKKwlkY29wLWhvd3RvLnR4dCBcCisJaW50cm9zcGVjdC54c2wgXAorCSQoRFREUykKKworRVhUUkFfRElTVCA9IFwKKwlmaWxlLWJvaWxlcnBsYXRlLmMgXAorCWRveHlnZW5fdG9fZGV2aGVscC54c2wgXAorCSQoU1RBVElDX0RPQ1MpCisKK2h0bWxfREFUQSA9CisKK2Rpc3RfaHRtbF9EQVRBID0KKworIyBkaWFncmFtLnBuZy9kaWFncmFtLnN2ZyBhcmVuJ3QgcmVhbGx5IEhUTUwsIGJ1dCBtdXN0IGdvIGluIHRoZSBzYW1lCisjIGRpcmVjdG9yeSBhcyB0aGUgSFRNTCB0byBhdm9pZCBicm9rZW4gbGlua3MKK1NUQVRJQ19IVE1MID0gXAorCWRpYWdyYW0ucG5nIFwKKwlkaWFncmFtLnN2ZyBcCisJJChOVUxMKQorCisjIFN0YXRpYyBIVE1MIGhlbHBlciBmaWxlcyBnZW5lcmF0ZWQgYnkgeWVscC1idWlsZC4KK1lFTFBfU1RBVElDX0hUTUwgPSBcCisJeWVscC5qcyBcCisJQy5jc3MgXAorCWpxdWVyeS5qcyBcCisJanF1ZXJ5LnN5bnRheC5qcyBcCisJanF1ZXJ5LnN5bnRheC5icnVzaC5odG1sLmpzIFwKKwlqcXVlcnkuc3ludGF4LmNvcmUuanMgXAorCWpxdWVyeS5zeW50YXgubGF5b3V0LnllbHAuanMgXAorCSQoTlVMTCkKKworZGlzdF9odG1sX0RBVEEgKz0gJChTVEFUSUNfSFRNTCkKKworIyBDb250ZW50IEhUTUwgZmlsZXMgZ2VuZXJhdGVkIGJ5IHllbHAtYnVpbGQuCitZRUxQX0hUTUwgPSBcCisJZGJ1cy1hcGktZGVzaWduLmh0bWwgXAorCSQoTlVMTCkKKworWE1MVE9fSFRNTCA9CQkJCQlcCisJZGJ1cy1mYXEuaHRtbAkJCQlcCisJZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwJCQlcCisJZGJ1cy10ZXN0LXBsYW4uaHRtbAkJCVwKKwlkYnVzLXR1dG9yaWFsLmh0bWwJCQlcCisJJChNQU5fSFRNTF9GSUxFUykJCQlcCisJJChOVUxMKQorCitpZiBEQlVTX1hNTF9ET0NTX0VOQUJMRUQKK2h0bWxfREFUQSArPSAkKFhNTFRPX0hUTUwpCisKKyUuaHRtbDogJS54bWwKKwkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CisKKyUuMTogJS4xLnhtbAorCSQoWE1MVE8pIG1hbiAkPAorZW5kaWYKKworaWYgREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRAorYWxsLWxvY2FsOjogZG94eWdlbi5zdGFtcAorCitkb3h5Z2VuLnN0YW1wOiAkKHdpbGRjYXJkICQodG9wX3NyY2RpcikvZGJ1cy8qLltjaF0pCisJJChBTV9WX0dFTiljZCAkKHRvcF9idWlsZGRpcikgJiYgZG94eWdlbiBEb3h5ZmlsZQorCUB0b3VjaCAkQAorCitpZiBEQlVTX0hBVkVfWFNMVFBST0MKK2h0bWxfREFUQSArPSBkYnVzLmRldmhlbHAKKworZGJ1cy5kZXZoZWxwOiAkKHNyY2RpcikvZG94eWdlbl90b19kZXZoZWxwLnhzbCBkb3h5Z2VuLnN0YW1wCisJJChYU0xUUFJPQykgLW8gJEAgJDwgYXBpL3htbC9pbmRleC54bWwKK2VuZGlmCisKK2lmIERCVVNfRFVDS1RZUEVfRE9DU19FTkFCTEVECitodG1sX0RBVEEgKz0gJChZRUxQX0hUTUwpICQoWUVMUF9TVEFUSUNfSFRNTCkKKworJS5wYWdlOiAlLmR1Y2sKKwkkKERVQ0tUWVBFKSAtbyAkQCAkPAorJS5odG1sOiAlLnBhZ2UKKwkkKFlFTFBfQlVJTEQpIGh0bWwgJDwKKyQoWUVMUF9TVEFUSUNfSFRNTCk6ICQoWUVMUF9IVE1MKQorZW5kaWYKKworIyB0aGlzIGFzc3VtZXMgQ1JFQVRFX1NVQkRJUlMgaXNuJ3Qgc2V0IHRvIFlFUyBpbiBEb3h5ZmlsZQorIyAod2hpY2ggaXQgaXNuJ3QgY3VycmVudGx5KQoraW5zdGFsbC1kYXRhLWxvY2FsOjogZG94eWdlbi5zdGFtcAorCSQoTUtESVJfUCkgJChERVNURElSKSQoYXBpZGlyKQorCSQoSU5TVEFMTF9EQVRBKSBhcGkvaHRtbC8qICQoREVTVERJUikkKGFwaWRpcikKKwordW5pbnN0YWxsLWxvY2FsOjoKKwlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyouaHRtbAorCXJtIC1mICQoREVTVERJUikkKGFwaWRpcikvKi5wbmcKKwlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyouY3NzCisJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLmpzCisJcm0gLWYgJChERVNURElSKSQoaHRtbGRpcikvKi5odG1sCisJcm0gLWYgJChERVNURElSKSQoZG9jZGlyKS8qLnR4dAorCXJtIC1mICQoREVTVERJUikkKGh0bWxkaXIpLyoucG5nCisJcm0gLWYgJChERVNURElSKSQoaHRtbGRpcikvKi5zdmcKKwlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChhcGlkaXIpIHx8IFwKKwkJcm1kaXIgJChERVNURElSKSQoYXBpZGlyKQorZW5kaWYKKworaWYgREJVU19DQU5fVVBMT0FEX0RPQ1MKK0JPTlVTX0ZJTEVTID0gXAorCSQodG9wX3NyY2RpcikvUkVBRE1FIFwKKwkkKHRvcF9zcmNkaXIpL0hBQ0tJTkcgXAorCSQodG9wX3NyY2RpcikvQVVUSE9SUyBcCisJJCh0b3Bfc3JjZGlyKS9ORVdTIFwKKwkkKHRvcF9zcmNkaXIpL0NPUFlJTkcgXAorCSQodG9wX3NyY2RpcikvQ2hhbmdlTG9nCisKK2RidXMtZG9jczogJChTVEFUSUNfRE9DUykgJChNQU5fWE1MX0ZJTEVTKSAkKGRpc3RfZG9jX0RBVEEpICQoZGlzdF9odG1sX0RBVEEpICQoTUFOX0hUTUxfRklMRVMpICQoQk9OVVNfRklMRVMpIGRveHlnZW4uc3RhbXAgJChYTUxUT19IVE1MKSAkKFlFTFBfSFRNTCkgJChZRUxQX1NUQVRJQ19IVE1MKQorCSQoQU1fVl9hdClybSAtcmYgJEAgJEAudG1wCisJJChBTV9WX0dFTikkKE1LRElSX1ApICRALnRtcC9hcGkKKwkkKEFNX1ZfYXQpY2QgJChzcmNkaXIpICYmIGNwICQoU1RBVElDX0RPQ1MpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljZCAkKHNyY2RpcikgJiYgY3AgJChkaXN0X2RvY19EQVRBKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY2QgJChzcmNkaXIpICYmIGNwICQoU1RBVElDX0hUTUwpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljcCAkKFhNTFRPX0hUTUwpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljcCAkKFlFTFBfSFRNTCkgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNwICQoWUVMUF9TVEFUSUNfSFRNTCkgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNwICQoTUFOX0hUTUxfRklMRVMpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljcCAkKE1BTl9YTUxfRklMRVMpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljcCAkKEJPTlVTX0ZJTEVTKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgLXIgYXBpL2h0bWwgQGFic19idWlsZGRpckAvJEAudG1wL2FwaQorCSQoQU1fVl9hdCltdiAkQC50bXAgJEAKKworZGJ1cy1kb2NzLnRhci5nejogZGJ1cy1kb2NzCisJJChBTV9WX0dFTil0YXIgY3pmICRAICQ8CisKK0RPQ19TRVJWRVIgPSBkYnVzLmZyZWVkZXNrdG9wLm9yZworRE9DX1dXV19ESVIgPSAvc3J2L2RidXMuZnJlZWRlc2t0b3Aub3JnL3d3dworCitTUEVDSUZJQ0FUSU9OX1NFUlZFUiA9IHNwZWNpZmljYXRpb25zLmZyZWVkZXNrdG9wLm9yZworU1BFQ0lGSUNBVElPTl9QQVRIID0gL3Nydi9zcGVjaWZpY2F0aW9ucy5mcmVlZGVza3RvcC5vcmcvd3d3L2RidXMvMS4wCisKK21haW50YWluZXItdXBsb2FkLWRvY3M6IGRidXMtZG9jcy50YXIuZ3ogZGJ1cy1kb2NzCisJc2NwIGRidXMtZG9jcy50YXIuZ3ogJChET0NfU0VSVkVSKTokKERPQ19XV1dfRElSKS8KKwlyc3luYyAtcnB2elAgLS1jaG1vZD1EZytzLHVnK3J3WCxvPXJYIFwKKwkJZGJ1cy1kb2NzLyAkKERPQ19TRVJWRVIpOiQoRE9DX1dXV19ESVIpL2RvYy8KKwljZCAkKHNyY2RpcikgJiYgc2NwIC1wICQoRFREUykgJChTUEVDSUZJQ0FUSU9OX1NFUlZFUik6JChTUEVDSUZJQ0FUSU9OX1BBVEgpLworZWxzZQorbWFpbnRhaW5lci11cGxvYWQtZG9jczoKKwlAZWNobyAiQ2FuJ3QgdXBsb2FkIGRvY3VtZW50YXRpb24hIFJlLXJ1biBjb25maWd1cmUgd2l0aCIKKwlAZWNobyAiICAtLWVuYWJsZS1kb3h5Z2VuLWRvY3MgLS1lbmFibGUteG1sLWRvY3MgLS1lbmFibGUtZHVja3R5cGUtZG9jcyIKKwlAZWNobyAiYW5kIGVuc3VyZSB0aGF0IG1hbjJodG1sIGlzIGluc3RhbGxlZC4iCisJQGZhbHNlCitlbmRpZgorCitDTEVBTkZJTEVTID0gXAorCSQobWFuMV9NQU5TKSBcCisJJChNQU5fWE1MX0ZJTEVTKSBcCisJJChYTUxUT19IVE1MKSBcCisJJChZRUxQX0hUTUwpIFwKKwkkKFlFTFBfU1RBVElDX0hUTUwpIFwKKwkkKE5VTEwpCisKK2NsZWFuLWxvY2FsOgorCXJtIC1mICQoaHRtbF9EQVRBKQorCXJtIC1yZiBhcGkKKwlybSAtcmYgZGJ1cy1kb2NzIGRidXMtZG9jcy50bXAKKwlybSAtZiAqLjEuaHRtbAorCXJtIC1mIGRveHlnZW4uc3RhbXAKZGlmZiAtLWdpdCBhL2RvYy9UT0RPIGIvZG9jL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9UT0RPCkBAIC0wLDAgKzEsMTU1IEBACitJbXBvcnRhbnQgZm9yIDEuMgorPT09CisKKyAtIFN5c3RlbSBidXMgYWN0aXZhdGlvbgorCisgLSBXaW5kb3dzIHBvcnQKKworSW1wb3J0YW50IGZvciAxLjAgR0xpYiBCaW5kaW5ncworPT09CisKKyAtIFRlc3QgcG9pbnQtdG8tcG9pbnQgbW9kZQorCisgLSBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyBzZW5kZXIKKworIC0gZm9ybWF0X3ZlcnNpb24gaW4gdGhlIG9iamVjdCBpbmZvIGRvZXNuJ3QgbG9vayBsaWtlIGl0J3MgaGFuZGxlZCBjb3JyZWN0bHkuIFRoZSBjcmVhdG9yCisgICBvZiB0aGUgb2JqZWN0IGluZm8gc2hvdWxkIHNwZWNpZnkgc29tZSBmaXhlZCBudW1iZXIgcGVyIHN0cnVjdCB2ZXJzaW9uOyB0aGUgbGlicmFyeQorICAgc2hvdWxkIGhhbmRsZSBvbmx5IHNwZWNpZmljIG51bWJlcnMgaXQga25vd3MgYWJvdXQuIFRoZXJlJ3Mgbm8gYXNzdW1wdGlvbiB0aGF0IGFsbCAKKyAgIG51bWJlcnMgPj0gdGhlIGdpdmVuIG9uZSBhcmUgY29tcGF0aWJsZS4gVGhlIGlkZWEgaXMgdGhhdCBuZXcgdmVyc2lvbnMgb2YgdGhlIGxpYgorICAgY2FuIG9mZmVyIHRvdGFsbHkgZGlmZmVyZW50IG9iamVjdCBpbmZvIHN0cnVjdHMsIGJ1dCBvbGQgdmVyc2lvbnMKKyAgIGtlZXAgd29ya2luZy4KKworSW1wb3J0YW50IGZvciAxLjAgUHl0aG9uIGJpbmRpbmdzCis9PT0KKworIC0gSGFtbWVyIGRvd24gQVBJCisKKyAtIEZpeCByZW1vdmluZyBvZiBzaWduYWxzIGZyb20gdGhlIG1hdGNoIHRyZWUKKworIC0gRml4IHJlZmNvdW50aW5nIGFuZCB1c2VyZGF0YSBsaWZlY3ljbGVzCisKKyAtIFdyaXRlIGEgZ2VuZXJpYyBtYWlubG9vcAorCitNaWdodCBhcyBXZWxsIGZvciAxLjAKKz09PQorCisgLSBwcm90b2NvbCB2ZXJzaW9uIGluIGVhY2ggbWVzc2FnZSBpcyBwcmV0dHkgc2lsbHkKKworQ2FuIEJlIFBvc3QgMS4wCis9PT0KKworIC0gcmV2YW1wIGRidXMtbGF1bmNoIGEgYml0LAorICAgc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA2LU9jdG9iZXIvMDA1OTA2Lmh0bWwKKyAgIGZvciBzb21lIHRob3VnaHRzLgorCisgLSBjbGVhbiB1cCB0aGUgY3JlZHMgaXNzdWUgb24gKkJTRCdzIGluIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYy4KKyAgIFRoZXkgc2hvdWxkIHdvcmsgYXMgaXMgYnV0IHdlIG5lZWQgdG8gcmVhcmFuZ2UgaXQgdG8gbWFrZSBpdAorICAgY2xlYXJlciB3aGljaCBtZXRob2QgaXMgYmVpbmcgdXNlZC4gIGNvbmZpZ3VyZS5pbiBzaG91bGQKKyAgIGJlIGZpeGVkIHVwIHRvIG1ha2UgdGhhdCBkZWNpdGlvbi4KKworIC0gX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCgpIGlzIGVzc2VudGlhbGx5IGFsd2F5cyBicm9rZW4gYmVjYXVzZQorICAgdGhlIGNvbm5lY3Rpb24gZmluYWxpemVyIGNhbGxzIG5vbi11bmxvY2tlZCBmdW5jdGlvbnMuIE9uZSBmaXggaXMgdG8gbWFrZSAKKyAgIHRoZSBmaW5hbGl6ZXIgcnVuIHdpdGggdGhlIGxvY2sgaGVsZCwgYnV0IHNpbmNlIGl0IGNhbGxzIG91dCB0byB0aGUgYXBwIHRoYXQgbWF5IAorICAgYmUgcHJldHR5IGJyb2tlbi4gTW9yZSBsaWtlbHkgYWxsIHRoZSB1c2VzIG9mIHVucmVmX3VubG9ja2VkIGFyZSBqdXN0IHdyb25nLgorCisgLSBpZiB0aGUgR1VJRCBpcyBvYnRhaW5lZCBvbmx5IGR1cmluZyBhdXRoZW50aWNhdGlvbiwgbm90IGluIHRoZSBhZGRyZXNzLCAKKyAgIHdlIGNvdWxkIHN0aWxsIHNoYXJlIHRoZSBjb25uZWN0aW9uCisKKyAtIEFsbG93IGEgZGJ1c19nX3Byb3h5X3RvX3N0cmluZygpL2dfb2JqZWN0X3RvX3N0cmluZygpIHRoYXQKKyAgIHdvdWxkIGNvbnZlcnQgdGhlIHByb3h5IHRvIGFuICJJT1IiIGFuZCBkYnVzX2dfcHJveHlfZnJvbV9zdHJpbmcoKQorICAgdGhhdCB3b3VsZCBkZWNvZGU7IHVzaW5nIHRoZXNlLCBkYnVzLWdsaWIgdXNlcnMgY291bGQgYXZvaWQKKyAgIERCdXNDb25uZWN0aW9uIGVudGlyZWx5LiBPZiBjb3Vyc2UgdGhlIHNhbWUgYXBwbGllcyB0byBvdGhlciBraW5kcworICAgb2YgYmluZGluZy4gVGhpcyB3b3VsZCB1c2UgZGJ1c19jb25uZWN0aW9uX29wZW4oKSdzIGNvbm5lY3Rpb24tc2hhcmluZworICAgZmVhdHVyZSB0byBhdm9pZCBtYXNzaXZlIHByb2xpZmVyYXRpb24gb2YgY29ubmVjdGlvbnMuCisKKyAtIERCdXNXYXRjaExpc3QvVGltZW91dExpc3QgZHVwbGljYXRlIGEgbG90IG9mIGNvZGUsIGFzIGRvCisgICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoL3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCBpbiBkYnVzLWNvbm5lY3Rpb24uYworICAgYW5kIGRidXMtc2VydmVyLmMuIFRoaXMgY291bGQgYWxsIGJlIG1vcHBlZCB1cCwgY3V0LWFuZC1wYXN0ZSAKKyAgIGZpeGVkLCBjb2RlIHNpemUgcmVkdWNlZC4KKworIC0gY2hhbmdlIC5zZXJ2aWNlIGZpbGVzIHRvIGFsbG93IE5hbWVzPWxpc3QgaW4gYWRkaXRpb24gdG8gTmFtZT1zdHJpbmcKKworIC0gVGhlIG1lc3NhZ2UgYnVzIGludGVybmFsIGNvZGUgc3RpbGwgc2F5cyAic2VydmljZSIgZm9yIAorICAgIm5hbWUiLCAiYmFzZSBzZXJ2aWNlIiBmb3IgInVuaXF1ZSBuYW1lIiwgImFjdGl2YXRlIiBmb3IgCisgICAic3RhcnQiOyB3b3VsZCBiZSBuaWNlIHRvIGNsZWFuIHVwLgorCisgLSBQcm9wZXJ0eSBsaXN0IGZlYXR1cmUgb24gbWVzc2FnZSBidXMgKGxpc3Qgb2YgcHJvcGVydGllcyBhc3NvY2lhdGVkIAorICAgd2l0aCBhIGNvbm5lY3Rpb24pLiBNYXkgYWxzbyBpbmNsdWRlIG1lc3NhZ2UgbWF0Y2hpbmcgcnVsZXMgCisgICB0aGF0IGludm9sdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorICAgY29ubmVjdGlvbi4KKworIC0gRGlzY29ubmVjdGluZyB0aGUgcmVtb3RlIGVuZCBvbiBpbnZhbGlkIFVURi04IGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgCisgICBpZGVhLiBUaGUgZGVmaW5pdGlvbiBvZiAidmFsaWQiIGlzIHNsaWdodGx5IGZ1enp5LiBJIHRoaW5rIGl0IG1pZ2h0IAorICAgYmUgYmV0dGVyIHRvIGp1c3Qgc2lsZW50bHkgImZpeCIgdGhlIFVURi04LCBvciBwZXJoYXBzIHJldHVybiBhbiBlcnJvci4KKworIC0gYnVpbGQgYW5kIGluc3RhbGwgdGhlIERveHlnZW4gbWFudWFsIGluIE1ha2VmaWxlIHdoZW4gLS1lbmFibGUtZG9jcworCisgLSBpZiB5b3Ugc2VuZCB0aGUgc2FtZSBtZXNzYWdlIHRvIG11bHRpcGxlIGNvbm5lY3Rpb25zLCB0aGUgc2VyaWFsIG51bWJlciAKKyAgIHdpbGwgb25seSBiZSByaWdodCBmb3Igb25lIG9mIHRoZW0uIFByb2JhYmx5IG5lZWQgdG8ganVzdCB3cml0ZSgpIHRoZSBzZXJpYWwgCisgICBudW1iZXIsIHJhdGhlciB0aGFuIHB1dHRpbmcgaXQgaW4gdGhlIERCdXNNZXNzYWdlLCBvciBzb21ldGhpbmcuCisKKyAtIHBlcmhhcHMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGhhdmUgcHJvcGVydGllcyB0aGF0IHJlZmxlY3QgYXR0cmlidXRlcworICAgb2YgdGhlIHNlc3Npb24sIHN1Y2ggYXMgaG9zdG5hbWUsIGFyY2hpdGVjdHVyZSwgb3BlcmF0aW5nIHN5c3RlbSwgCisgICBldGMuIENvdWxkIGJlIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdhbnRzIHRvIHNwZWNpYWwtY2FzZSBiZWhhdmlvciAKKyAgIGZvciBhIHBhcnRpY3VsYXIgaG9zdCBvciBjbGFzcyBvZiBob3N0cywgZm9yIGV4YW1wbGUuCisKKyAtIGN1cnJlbnRseSB0aGUgc2VjdXJpdHkgcG9saWN5IHN0dWZmIGZvciBtZXNzYWdlcyB0by9mcm9tIAorICAgdGhlIGJ1cyBkcml2ZXIgaXMga2luZCBvZiBzdHJhbmdlOyBiYXNpY2FsbHkgaXQncyBoYXJkY29kZWQgdGhhdCAKKyAgIHlvdSBjYW4gYWx3YXlzIHRhbGsgdG8gdGhlIGRyaXZlciwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlIAorICAgaGFzIHJ1bGVzIGZvciBpdCBhbnl3YXksIG9yIHNvbWV0aGluZy4gaXQncyBjb25jZXB0dWFsbHkgCisgICBzY3Jld3kgYXQgdGhlIG1vbWVudC4KKworIC0gd2hlbiBtYWtpbmcgYSBtZXRob2QgY2FsbCwgaWYgdGhlIGNhbGwgc2VyaWFsIHdlcmUgZ2xvYmFsbHkgdW5pcXVlLAorICAgd2UgY291bGQgZm9yd2FyZCB0aGUgY2FsbCBzZXJpYWwgYWxvbmcgd2l0aCBhbnkgbWV0aG9kIGNhbGxzIG1hZGUKKyAgIGFzIGEgcmVzdWx0IG9mIHRoZSBmaXJzdCBtZXRob2QgY2FsbCwgYW5kIGFsbG93IHJlZW50cmFuY3kgdGhhdCB3YXMKKyAgIHN0cmljdGx5IHBhcnQgb2YgdGhlIGNhbGwgc3RhY2sgb2Ygc2FpZCBtZXRob2QgY2FsbC4gQnV0IEkgZG9uJ3QKKyAgIHJlYWxseSBzZWUgaG93IHRvIGRvIHRoaXMgd2l0aG91dCBtYWtpbmcgdGhlIHVzZXIgcGFzcyBhcm91bmQgdGhlCisgICBjYWxsIHNlcmlhbCB0byBhbGwgbWV0aG9kIGNhbGxzIGFsbCB0aGUgdGltZSwgb3IgZGlzYWxsb3dpbmcgCisgICBhc3luYyBjYWxscy4KKworICAgSWYgZG9uZSBwb3N0IDEuMCB3aWxsIHByb2JhYmx5IGJlIGFuIG9wdGlvbmFsL3VnbHktQVBJIHR5cGUgCisgICBvZiB0aGluZy4KKworIC0gSSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBEQnVzT2JqZWN0LCBidXQgcmVmY291bnRpbmcgYW5kIG9iamVjdAorICAgZGF0YSBjb3VsZCBzdGlsbCBiZSBmYWN0b3JlZCBvdXQgaW50byBhbiBpbnRlcm5hbCAiYmFzZSBjbGFzcyIgCisgICBwZXJoYXBzLgorCisgLSBLZWVwIGNvbnZlbmllbmNlIHdyYXBwZXJzIGluIHN5bmMgd2l0aCBidXMgbWV0aG9kcworCisgLSBkb2N1bWVudCB0aGUgYXV0aCBwcm90b2NvbCBhcyBhIHNldCBvZiBzdGF0ZXMgYW5kIHRyYW5zaXRpb25zLCBhbmQKKyAgIHRoZW4gcmVpbXBsZW1lbnQgaXQgaW4gdGhvc2UgdGVybXMKKworIC0gcmVjdXJzaXZlIGRpc3BhdGNoLCBzZWUgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKworIC0gZG8gd2UgbmVlZCBwZXItZGlzcGxheSBhY3RpdmF0aW9uOyBpZiBzbyBJJ2QgbGlrZSB0byBkbyB0aGlzIGJ5IHNldHRpbmcgYQorICAgImRpc3BsYXkgSUQiIHByb3BlcnR5IG9uIHNjcmVlbiAwLCB3aXRoIGEgR1VJRCwgYW5kIGtleWluZyBhY3RpdmF0aW9uIGJ5IAorICAgc2FpZCBHVUlELiBPdGhlcndpc2UgeW91IGdldCBhbGwga2luZHMgb2YgdW5yb2J1c3QKKyAgIHN0cmluZy9ob3N0bmFtZS1iYXNlZCBtZXNzLiBwZXItc2NyZWVuIGlzIHRoZW4gZG9uZSBieSBhcHBlbmRpbmcgc2NyZWVuIG51bWJlcgorICAgdG8gdGhlIGRpc3BsYXkuIElmIGRpc3BsYXlzIGhhdmUgYSBkZXRlcm1pbmlzdGljIElEIGxpa2UgdGhpcywgeW91IGNhbiAKKyAgIGRvIHBlci1kaXNwbGF5IGJ5IHNpbXBseSBpbmNsdWRpbmcgR1VJRCBpbiB0aGUgc2VydmljZSBuYW1lLgorCisgLSBvcHRpbWl6YXRpb24gYW5kIHByb2ZpbGluZyEKKworIC0gTWF0Y2ggcnVsZXMgYXJlbid0IGluIHRoZSBzcGVjIChwcm9iYWJseSBhIGxvdCBvZiBtZXRob2RzIG9uIHRoZSBidXMKKyAgIGFyZSBub3QpCisKKyAtIHRoZSAiYnJlYWsgbG9hZGVyIiBhbmQgdmFsaWQvaW52YWxpZCBtZXNzYWdlIHRlc3RzIGFyZSBhbGwgZGlzYWJsZWQ7CisgICB0aGV5IG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJlLWVuYWJsZWQgd2l0aCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBzdHVmZi4KKyAgIEkgdGhpbmsgSSB3YW50IHRvIGRyb3AgdGhlIC5tZXNzYWdlIGZpbGVzIHRoaW5nIGFuZCBqdXN0IGhhdmUgY29kZQorICAgdGhhdCBnZW5lcmF0ZXMgbWVzc2FnZXMsIG1vcmUgbGlrZSB0aGUgdGVzdHMgZm9yCisgICBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKHRoaXMgaXMgbW9zdGx5IGRvbmUgbm93LCBqdXN0IG5lZWRzIHNvbWUKKyAgIGNsZWFudXApCisKKyAtIGp1c3QgYmVmb3JlIDEuMCwgdHJ5IGEgSEFWRV9JTlQ2ND0wIGJ1aWxkIGFuZCBiZSBzdXJlIGl0IHJ1bnMKKworIC0gV2luZG93cyBwb3J0IG5lZWRzIHJlY3Vyc2l2ZSBtdXRleGVzCisKK1Nob3VsZCBCZSBQb3N0IDEuMAorPT09CisKKyAtIGxvb2sgaW50byBzdXBwb3J0aW5nIHRoZSBjb25jZXB0IG9mIGEgImNvbm5lY3Rpb24iIGdlbmVyaWNhbGx5CisgICAod2hhdCBkb2VzIHRoaXMgVE9ETyBpdGVtIG1lYW4/KQorCisgLSB0ZXN0L25hbWUtdGVzdCBzaG91bGQgYmUgbmFtZWQgdGVzdC93aXRoLWJ1cyBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisKKwpkaWZmIC0tZ2l0IGEvZG9jL2J1c2NvbmZpZy5kdGQgYi9kb2MvYnVzY29uZmlnLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVhYzMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2J1c2NvbmZpZy5kdGQKQEAgLTAsMCArMSw3MCBAQAorPCFFTEVNRU5UIGJ1c2NvbmZpZyAodXNlciB8CisgICAgICAgICAgICAgICAgICAgICB0eXBlIHwKKyAgICAgICAgICAgICAgICAgICAgIGZvcmsgfAorICAgICAgICAgICAgICAgICAgICAga2VlcF91bWFzayB8CisgICAgICAgICAgICAgICAgICAgICBsaXN0ZW4gfCAKKyAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUgfAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRpciB8CisgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlZGlyIHwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VoZWxwZXIgfAorICAgICAgICAgICAgICAgICAgICAgYXV0aCB8CisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBvbGljeSB8CisgICAgICAgICAgICAgICAgICAgICBsaW1pdCB8CisgICAgICAgICAgICAgICAgICAgICBzZWxpbnV4IHwKKyAgICAgICAgICAgICAgICAgICAgIGFwcGFybW9yKSo+CisKKzwhRUxFTUVOVCB1c2VyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBsaXN0ZW4gKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGluY2x1ZGVkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VoZWxwZXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGF1dGggKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHBpZGZpbGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGZvcmsgRU1QVFk+Cis8IUVMRU1FTlQga2VlcF91bWFzayBFTVBUWT4KKworPCFFTEVNRU5UIGluY2x1ZGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGluY2x1ZGUgCisgICAgICAgICAgaWdub3JlX21pc3NpbmcgKHllc3xubykgIm5vIgorICAgICAgICAgIGlmX3NlbGludXhfZW5hYmxlZCAoeWVzfG5vKSAibm8iCisgICAgICAgICAgc2VsaW51eF9yb290X3JlbGF0aXZlICh5ZXN8bm8pICJubyI+CisKKzwhRUxFTUVOVCBwb2xpY3kgKGFsbG93fGRlbnkpKj4KKzwhQVRUTElTVCBwb2xpY3kgCisgICAgICAgICAgY29udGV4dCAoZGVmYXVsdHxtYW5kYXRvcnkpICNJTVBMSUVECisgICAgICAgICAgdXNlciBDREFUQSAjSU1QTElFRAorICAgICAgICAgIGdyb3VwIENEQVRBICNJTVBMSUVECisgICAgICAgICAgYXRfY29uc29sZSAoeWVzfG5vKSAjSU1QTElFRD4KKworPCFFTEVNRU5UIGFsbG93IEVNUFRZPgorPCFBVFRMSVNUIGFsbG93IAorICAgICAgICAgIHVzZXIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZSBDREFUQSAjSU1QTElFRAorICAgICAgICAgIG93biBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHNlbmRfdG8gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICByZWNlaXZlX2Zyb20gQ0RBVEEgI0lNUExJRUQ+CisKKzwhRUxFTUVOVCBkZW55IEVNUFRZPgorPCFBVFRMSVNUIGRlbnkKKyAgICAgICAgICB1c2VyIENEQVRBICNJTVBMSUVECisgICAgICAgICAgc2VuZCBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHJlY2VpdmUgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBvd24gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kX3RvIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZV9mcm9tIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgbGltaXQgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGxpbWl0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgc2VsaW51eCAoYXNzb2NpYXRlKSo+Cis8IUVMRU1FTlQgYXNzb2NpYXRlIEVNUFRZPgorPCFBVFRMSVNUIGFzc29jaWF0ZQorICAgICAgICAgIG93biBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgICBjb250ZXh0IENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIGFwcGFybW9yIEVNUFRZPgorPCFBVFRMSVNUIGFwcGFybW9yCisgICAgICAgICAgbW9kZSAocmVxdWlyZWR8ZW5hYmxlZHxkaXNhYmxlZCkgImVuYWJsZWQiPgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtYXBpLWRlc2lnbi5kdWNrIGIvZG9jL2RidXMtYXBpLWRlc2lnbi5kdWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2VhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1hcGktZGVzaWduLmR1Y2sKQEAgLTAsMCArMSw4ODggQEAKKz0gRC1CdXMgQVBJIERlc2lnbiBHdWlkZWxpbmVzCitAbGlua1tndWlkZSA+aW5kZXhdCitAY3JlZGl0W3R5cGU9ImF1dGhvciBjb3B5cmlnaHQiXQorICBAbmFtZSBQaGlsaXAgV2l0aG5hbGwKKyAgQGVtYWlsIHBoaWxpcC53aXRobmFsbEBjb2xsYWJvcmEuY28udWsKKyAgQHllYXJzIDIwMTUKK0BkZXNjIEd1aWRlbGluZXMgZm9yIHdyaXRpbmcgaGlnaCBxdWFsaXR5IEQtQnVzIEFQSXMKK0ByZXZpc2lvbltkYXRlPTIwMTUtMDItMDUgc3RhdHVzPWRyYWZ0XQorCitbc3lub3BzaXNdCisgIFt0aXRsZV0KKyAgU3VtbWFyeQorCisgIFRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIEQtQnVzIGlzIGluIGltcGxlbWVudGluZyBhIHNlcnZpY2Ugd2hpY2ggd2lsbCBiZQorICBjb25zdW1lZCBieSBtdWx0aXBsZSBjbGllbnQgcHJvZ3JhbXMsIGFuZCBoZW5jZSBhbGwgaW50ZXJmYWNlcyBleHBvcnRlZCBvbiB0aGUKKyAgYnVzIGZvcm0gYSBwdWJsaWMgQVBJLiBEZXNpZ25pbmcgYSBELUJ1cyBBUEkgaXMgbGlrZSBkZXNpZ25pbmcgYW55IG90aGVyIEFQSToKKyAgdGhlcmUgaXMgYSBsb3Qgb2YgZmxleGliaWxpdHksIGJ1dCB0aGVyZSBhcmUgZGVzaWduIHBhdHRlcm5zIHRvIGZvbGxvdyBhbmQKKyAgYW50aS1wYXR0ZXJucyB0byBhdm9pZC4KKworICBUaGlzIGd1aWRlIGFpbXMgdG8gZXhwbGFpbiB0aGUgYmVzdCBwcmFjdGljZXMgZm9yIHdyaXRpbmcgRC1CdXMgQVBJcy4gVGhlc2UKKyAgaGF2ZSBiZWVuIHJlZmluZWQgb3ZlciBzZXZlcmFsIHllYXJzIG9mIHVzZSBvZiBELUJ1cyBpbiBtYW55IHByb2plY3RzLgorICBQb2ludGVycyB3aWxsIGJlIGdpdmVuIGZvciBpbXBsZW1lbnRpbmcgQVBJcyB1c2luZyBjb21tb24gRC1CdXMKKyAgbGlicmFyaWVzIGxpa2UKKyAgJGxpbmtbPj5odHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2lvL3N0YWJsZS9nZGJ1cy1jb252ZW5pZW5jZS5odG1sXShHREJ1cyksCisgIGJ1dCBkZXRhaWxlZCBpbXBsZW1lbnRhdGlvbiBpbnN0cnVjdGlvbnMgYXJlIGxlZnQgdG8gdGhlIGxpYnJhcmllc+KAmQorICBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgeW91IHNob3VsZCAkZW0obm90KSB1c2UgZGJ1cy1nbGliIHRvIGltcGxlbWVudCBELUJ1cworICBzZXJ2aWNlcyBhcyBpdCBpcyBkZXByZWNhdGVkIGFuZCB1bm1haW50YWluZWQuIE1vc3Qgc2VydmljZXMgc2hvdWxkIGFsc28gYXZvaWQKKyAgbGliZGJ1cyAoZGJ1cy0xKSwgd2hpY2ggaXMgYSBsb3ctbGV2ZWwgbGlicmFyeSBhbmQgaXMgYXdrd2FyZCB0byB1c2UKKyAgY29ycmVjdGx5OiBpdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHZpYSBhIGxhbmd1YWdlIGJpbmRpbmcgc3VjaCBhcworICAkbGlua1s+Pmh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0ZGJ1cy5odG1sXShRdERCdXMpLgorCisgIEZvciBkb2N1bWVudGF0aW9uIG9uIEQtQnVzIGl0c2VsZiwgc2VlIHRoZQorICAkbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWxdKEQtQnVzCisgIHNwZWNpZmljYXRpb24pLgorCitbbGlua3Mgc2VjdGlvbl0KKworPT0gQVBJcworICAgW2lkPSJhcGlzIl0KKworQSBELUJ1cyBBUEkgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIG9uZSBvciBtb3JlIGludGVyZmFjZXMsIHdoaWNoIHdpbGwgYmUKK2ltcGxlbWVudGVkIGJ5IG9iamVjdHMgZXhwb3NlZCBieSBhIHNlcnZpY2Ugb24gdGhlIGJ1cy4gVHlwaWNhbGx5IGFuIEFQSSBpcworZGVzaWduZWQgYXMgYSBzZXQgb2YgJGxpbmtbPiNpbnRlcmZhY2UtZmlsZXNdKGludGVyZmFjZSBmaWxlcyksIGFuZCB0aGUKK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlIGZvbGxvd3MgdGhvc2UgZmlsZXMuIFNvbWUgcHJvamVjdHMsIGhvd2V2ZXIsCitjaG9vc2UgdG8gZGVmaW5lIHRoZSBBUEkgaW4gdGhlIGNvZGUgZm9yIHRoZSBzZXJ2aWNlLCBhbmQgdG8gZXhwb3J0IFhNTAoraW50ZXJmYWNlIGZpbGVzIGZyb20gdGhlIHJ1bm5pbmcgc2VydmljZQorJGxpbmtbPj5odHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI3N0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGVdKHVzaW5nCitELUJ1cyBpbnRyb3NwZWN0aW9uKS4gQm90aCBhcmUgdmFsaWQgYXBwcm9hY2hlcy4KKworRm9yIHNpbXBsaWNpdHksIHRoaXMgZG9jdW1lbnQgdXNlcyB0aGUgWE1MIGRlc2NyaXB0aW9ucyBvZiBELUJ1cyBpbnRlcmZhY2VzIGFzCit0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uLgorCis9PSBJbnRlcmZhY2UgZmlsZXMKKyAgIFtpZD0iaW50ZXJmYWNlLWZpbGVzIl0KKworQSBELUJ1cyBpbnRlcmZhY2UgZmlsZSBpcyBhbiBYTUwgZmlsZSB3aGljaCBkZXNjcmliZXMgb25lIG9yIG1vcmUgRC1CdXMKK2ludGVyZmFjZXMsIGFuZCBpcyB0aGUgYmVzdCB3YXkgb2YgZGVzY3JpYmluZyBhIEQtQnVzIEFQSSBpbiBhIG1hY2hpbmUKK3JlYWRhYmxlIHdheS4gVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjaW50cm9zcGVjdGlvbi1mb3JtYXRdKEQtQnVzCitzcGVjaWZpY2F0aW9uKSwgYW5kIGlzIHN1cHBvcnRlZCBieSB0b29scyBzdWNoIGFzICRjbWQoZ2RidXMtY29kZWdlbikuCisKK0ludGVyZmFjZSBmaWxlcyBmb3IgcHVibGljIEFQSSBzaG91bGQgYmUgaW5zdGFsbGVkIHRvCiskY29kZSgkdmFyKCQkKGRhdGFkaXIkKSkvZGJ1cy0xL2ludGVyZmFjZXMpIHNvIHRoYXQgb3RoZXIgc2VydmljZXMgY2FuIGxvYWQKK3RoZW0uIFByaXZhdGUgQVBJcyBzaG91bGQgbm90IGJlIGluc3RhbGxlZC4gVGhlcmUgc2hvdWxkIGJlIG9uZSBmaWxlIGluc3RhbGxlZAorcGVyIEQtQnVzIGludGVyZmFjZSwgbmFtZWQgYWZ0ZXIgdGhlIGludGVyZmFjZSwgY29udGFpbmluZyBhIHNpbmdsZSB0b3AtbGV2ZWwKKyRjb2RlKDxub2RlPikgZWxlbWVudCB3aXRoIGEgc2luZ2xlICRjb2RlKDxpbnRlcmZhY2U+KSBiZW5lYXRoIGl0LiBGb3IgZXhhbXBsZSwKK2ludGVyZmFjZSAkY29kZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxLk1hbmFnZXIpIHdvdWxkIGJlIGRlc2NyaWJlZCBieSBmaWxlCiskZmlsZSgkdmFyKCQkKGRhdGFkaXIkKSkvZGJ1cy0xL2ludGVyZmFjZXMvY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5NYW5hZ2VyLnhtbCk6CisKK1tsaXN0aW5nXQorICBbdGl0bGVdCisgICAgRXhhbXBsZSBELUJ1cyBJbnRlcmZhY2UgWE1MCisgIFtkZXNjXQorICAgIEEgYnJpZWYgZXhhbXBsZSBpbnRlcmZhY2UgWE1MIGRvY3VtZW50LgorICBbY29kZSBtaW1lPSJhcHBsaWNhdGlvbi94bWwiXQorICAgIDwhRE9DVFlQRSBub2RlIFBVQkxJQworICAgICAgICAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBPYmplY3QgSW50cm9zcGVjdGlvbiAxLjAvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2ludHJvc3BlY3QuZHRkIiA+CisgICAgPG5vZGUgeG1sbnM6ZG9jPSJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9kYnVzLzEuMC9kb2MuZHRkIj4KKyAgICAgIDxpbnRlcmZhY2UgbmFtZT0iY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5JbnRlcmVzdGluZ0ludGVyZmFjZSI+CisgICAgICAgIDxtZXRob2QgbmFtZT0iQWRkQ29udGFjdCI+CisgICAgICAgICAgPGFyZyBuYW1lPSJuYW1lIiBkaXJlY3Rpb249ImluIiB0eXBlPSJzIj4KKyAgICAgICAgICAgIDxkb2M6ZG9jPjxkb2M6c3VtbWFyeT5OYW1lIG9mIG5ldyBjb250YWN0PC9kb2M6c3VtbWFyeT48L2RvYzpkb2M+CisgICAgICAgICAgPC9hcmc+CisgICAgICAgICAgPGFyZyBuYW1lPSJlbWFpbCIgZGlyZWN0aW9uPSJpbiIgdHlwZT0icyI+CisgICAgICAgICAgICA8ZG9jOmRvYz48ZG9jOnN1bW1hcnk+RS1tYWlsIGFkZHJlc3Mgb2YgbmV3IGNvbnRhY3Q8L2RvYzpzdW1tYXJ5PjwvZG9jOmRvYz4KKyAgICAgICAgICA8L2FyZz4KKyAgICAgICAgICA8YXJnIG5hbWU9ImlkIiBkaXJlY3Rpb249Im91dCIgdHlwZT0idSI+CisgICAgICAgICAgICA8ZG9jOmRvYz48ZG9jOnN1bW1hcnk+SUQgb2YgbmV3bHkgYWRkZWQgY29udGFjdDwvZG9jOnN1bW1hcnk+PC9kb2M6ZG9jPgorICAgICAgICAgIDwvYXJnPgorICAgICAgICAgIDxkb2M6ZG9jPgorICAgICAgICAgICAgPGRvYzpkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgPGRvYzpwYXJhPgorICAgICAgICAgICAgICAgIEFkZHMgYSBuZXcgY29udGFjdCB0byB0aGUgYWRkcmVzcyBib29rIHdpdGggdGhlaXIgbmFtZSBhbmQKKyAgICAgICAgICAgICAgICBlLW1haWwgYWRkcmVzcy4KKyAgICAgICAgICAgICAgPC9kb2M6cGFyYT4KKyAgICAgICAgICAgIDwvZG9jOmRlc2NyaXB0aW9uPgorICAgICAgICAgIDwvZG9jOmRvYz4KKyAgICAgICAgPC9tZXRob2Q+CisgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L25vZGU+CisKK0lmIGFuIGludGVyZmFjZSBkZWZpbmVkIGJ5IHNlcnZpY2UgQSBuZWVkcyB0byBiZSB1c2VkIGJ5IGNsaWVudCBCLCBjbGllbnQgQgorc2hvdWxkIGRlY2xhcmUgYSBidWlsZCB0aW1lIGRlcGVuZGVuY3kgb24gc2VydmljZSBBLCBhbmQgdXNlIHRoZSBpbnN0YWxsZWQgY29weQorb2YgdGhlIGludGVyZmFjZSBmaWxlIGZvciBhbnkgY29kZSBnZW5lcmF0aW9uIGl0IGhhcyB0byBkby4gSXQgc2hvdWxkICRlbShub3QpCitoYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgaW50ZXJmYWNlLCBhcyB0aGF0IGNvdWxkIHRoZW4gZ28gb3V0IG9mIHN5bmMgd2l0aCB0aGUKK2Nhbm9uaWNhbCBjb3B5IGluIHNlcnZpY2UgQeKAmXMgZ2l0IHJlcG9zaXRvcnkuCisKKz09IEFQSSB2ZXJzaW9uaW5nCisgICBbaWQ9ImFwaS12ZXJzaW9uaW5nIl0KKworJGxpbmtbPj5odHRwOi8vb21ldGVyLmNvbS9wYXJhbGxlbC5odG1sXShKdXN0IGxpa2UgQyBBUElzKSwgRC1CdXMgaW50ZXJmYWNlcworc2hvdWxkIGJlIGRlc2lnbmVkIHRvIGJlIHVzYWJsZSBpbiBwYXJhbGxlbCB3aXRoIEFQSS1pbmNvbXBhdGlibGUgdmVyc2lvbnMuIFRoaXMKK2lzIGFjaGlldmVkIGJ5IGluY2x1ZGluZyBhIHZlcnNpb24gbnVtYmVyIGluIGVhY2ggaW50ZXJmYWNlIG5hbWUsIHNlcnZpY2UgbmFtZQorYW5kIG9iamVjdCBwYXRoIHdoaWNoIGlzIGluY3JlbWVudGVkIG9uIGV2ZXJ5IGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgY2hhbmdlLgorCitWZXJzaW9uIG51bWJlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCBBUElzIGZyb20gdGhlIGZpcnN0IHJlbGVhc2UsIGFzIHRoYXQKK21lYW5zIG1vdmluZyB0byBhIG5ldyB2ZXJzaW9uIGlzIGFzIHNpbXBsZSBhcyBpbmNyZW1lbnRpbmcgdGhlIG51bWJlciwgcmF0aGVyCit0aGFuIGluc2VydGluZyBhIG51bWJlciBldmVyeXdoZXJlLCB3aGljaCB0YWtlcyBtb3JlIGVmZm9ydC4KKworTmV3IEFQSSBjYW4gYmUgYWRkZWQgdG8gYSBELUJ1cyBpbnRlcmZhY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlIHZlcnNpb24KK251bWJlciwgYXMgc3VjaCBhZGRpdGlvbnMgYXJlIHN0aWxsIGJhY2t3YXJkcy1jb21wYXRpYmxlLiBIb3dldmVyLCBjbGllbnRzCitzaG91bGQgZ3JhY2VmdWxseSBoYW5kbGUgdGhlICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlVua25vd25NZXRob2QpCitlcnJvciByZXBseSBmcm9tIGFsbCBELUJ1cyBtZXRob2QgY2FsbHMgaWYgdGhleSB3YW50IHRvIHJ1biBhZ2FpbnN0IG9sZGVyCit2ZXJzaW9ucyBvZiB0aGUgc2VydmljZSB3aGljaCBkb27igJl0IGltcGxlbWVudCBuZXcgbWV0aG9kcy4gKFRoaXMgYWxzbyBwcmV2ZW50cwordXNlIG9mIGdlbmVyYXRlZCBiaW5kaW5nczsgYW55IG1ldGhvZCB3aGljaCBhIGNsaWVudCB3YW50cyB0byBncmFjZWZ1bGx5IGZhbGwKK2JhY2sgZnJvbSBzaG91bGQgYmUgY2FsbGVkIHVzaW5nIGEgZ2VuZXJpYyBELUJ1cyBtZXRob2QgaW52b2NhdGlvbiByYXRoZXIgdGhhbgorYSBzcGVjaWZpYyBnZW5lcmF0ZWQgYmluZGluZy4pCisKK1doZW4gQVBJIGlzIGJyb2tlbiwgY2hhbmdlZCBvciByZW1vdmVkLCB0aGUgc2VydmljZeKAmXMgdmVyc2lvbiBudW1iZXIgbXVzdCBiZQorYnVtcGVkOyBmb3IgZXhhbXBsZSwgZnJvbSAkY29kZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxKQordG8gJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMikuIElmIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIG1haW50YWluZWQgaW4KK3RoZSBzZXJ2aWNlIGJ5IGltcGxlbWVudGluZyBib3RoIHRoZSBvbGQgYW5kIG5ldyBpbnRlcmZhY2VzLCB0aGUgc2VydmljZSBjYW4KK293biAkZW0oYm90aCkgd2VsbC1rbm93biBuYW1lcyBhbmQgY2xpZW50cyBjYW4gdXNlIHdoaWNoZXZlciB0aGV5IHN1cHBvcnQuCisKK0FzIGRpc2N1c3NlZCBpbiAkbGlua1s+I2Fubm90YXRpb25zXSwgbmV3IG9yIGRlcHJlY2F0ZWQgQVBJcyBzaG91bGQgYmUgbWFya2VkIGluCit0aGUgaW50ZXJmYWNlIFhNTCB1c2luZyBhbm5vdGF0aW9ucy4KKworTm90ZSwgaG93ZXZlciwgdGhhdCBzdXBwb3J0aW5nIG11bHRpcGxlIGludGVyZmFjZSB2ZXJzaW9ucyBzaW11bHRhbmVvdXNseQorcmVxdWlyZXMgdGhhdCAkZW0ob2JqZWN0IHBhdGhzKSBhcmUgdmVyc2lvbmVkIGFzIHdlbGwsIHNvIG9iamVjdHMgJGVtKG11c3Qgbm90KQorYmUgcHV0IG9uIHRoZSBidXMgYXQgdGhlIHJvb3QgcGF0aCAo4oCYL+KAmSkuIFRoaXMgaXMgZm9yIHRlY2huaWNhbCByZWFzb25zOiBzaWduYWxzCitzZW50IGZyb20gYSBELUJ1cyBzZXJ2aWNlIGhhdmUgdGhlIG9yaWdpbmF0aW5nIHNlcnZpY2UgbmFtZSBvdmVyd3JpdHRlbiBieSBpdHMKK3VuaXF1ZSBuYW1lIChlLmcuICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTIpIGlzIG92ZXJ3cml0dGVuIGJ5ICRjb2RlKDoxOjE1KSkuCitJZiBvYmplY3QgcGF0aHMgYXJlIHNoYXJlZCBiZXR3ZWVuIG9iamVjdHMgaW1wbGVtZW50aW5nIHR3byB2ZXJzaW9ucyBvZiB0aGUKK3NlcnZpY2XigJlzIGludGVyZmFjZSwgY2xpZW50IHByb2dyYW1zIGNhbm5vdCB0ZWxsIHdoaWNoIG9iamVjdCBhIHNpZ25hbCBoYXMgY29tZQorZnJvbS4gVGhlIHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIGluIGFsbCBvYmplY3QgcGF0aHMsIGZvcgorZXhhbXBsZSAkY29kZSgvY29tL2V4YW1wbGUvTXlTZXJ2aWNlMS9NYW5hZ2VyKSBpbnN0ZWFkIG9mICRjb2RlKC8pIG9yCiskY29kZSgvY29tL2V4YW1wbGUvTXlTZXJ2aWNlL01hbmFnZXIpLgorCitJbiBzdW1tYXJ5LCB2ZXJzaW9uIG51bWJlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCBzZXJ2aWNlIG5hbWVzLCBpbnRlcmZhY2UKK25hbWVzIGFuZCBvYmplY3QgcGF0aHM6CitbbGlzdF0KKyogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMSkKKyogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5JbnRlcmVzdGluZ0ludGVyZmFjZSkKKyogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5PdGhlckludGVyZmFjZSkKKyogJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvTWFuYWdlcikKKyogJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvT3RoZXJPYmplY3QpCisKKz09IEFQSSBkZXNpZ24KKyAgIFtpZD0iYXBpLWRlc2lnbiJdCisKK0QtQnVzIEFQSSBkZXNpZ24gaXMgYnJvYWRseSB0aGUgc2FtZSBhcyBDIEFQSSBkZXNpZ24sIGJ1dCB0aGVyZSBhcmUgYSBmZXcKK2FkZGl0aW9uYWwgcG9pbnRzIHRvIGJlYXIgaW4gbWluZCB3aGljaCBhcmlzZSBib3RoIGZyb20gRC1CdXPigJkgZmVhdHVyZXMKKyhleHBsaWNpdCBlcnJvcnMsIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMpLCBhbmQgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gYXMgYW4gSVBDCitzeXN0ZW0uCisKK0QtQnVzIG1ldGhvZCBjYWxscyBhcmUgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIEMgZnVuY3Rpb24gY2FsbHMsIHR5cGljYWxseQordGFraW5nIG9uIHRoZSBvcmRlciBvZiBtaWxsaXNlY29uZHMgdG8gY29tcGxldGUgYSByb3VuZCB0cmlwLiBUaGVyZWZvcmUsIHRoZQorZGVzaWduIHNob3VsZCBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG1ldGhvZCBjYWxscyBuZWVkZWQgdG8gcGVyZm9ybSBhbgorb3BlcmF0aW9uLgorCitUaGUgdHlwZSBzeXN0ZW0gaXMgdmVyeSBleHByZXNzaXZlLCBlc3BlY2lhbGx5IGNvbXBhcmVkIHRvIEPigJlzLCBhbmQgQVBJcyBzaG91bGQKK3Rha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgaXQuCisKK1NpbWlsYXJseSwgaXRzIHN1cHBvcnQgZm9yIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMgZGlmZmVyZW50aWF0ZXMgaXQgZnJvbSBub3JtYWwKK0MgQVBJcywgYW5kIHdlbGwgd3JpdHRlbiBELUJ1cyBBUElzIG1ha2UgZnVsbCB1c2Ugb2YgdGhlc2UgZmVhdHVyZXMgd2hlcmUKK2FwcHJvcHJpYXRlLiBUaGV5IGNhbiBiZSBjb3VwbGVkIHdpdGggc3RhbmRhcmQgaW50ZXJmYWNlcyBkZWZpbmVkIGluIHRoZSBELUJ1cworc3BlY2lmaWNhdGlvbiB0byBhbGxvdyBmb3IgY29uc2lzdGVudCBhY2Nlc3MgdG8gcHJvcGVydGllcyBhbmQgb2JqZWN0cyBpbiBhCitoaWVyYXJjaHkuCisKKz09PSBNaW5pbWl6aW5nIFJvdW5kIFRyaXBzCisgICAgW2lkPSJyb3VuZC10cmlwcyJdCisKK0VhY2ggRC1CdXMgbWV0aG9kIGNhbGwgaXMgYSByb3VuZCB0cmlwIGZyb20gYSBjbGllbnQgcHJvZ3JhbSB0byBhIHNlcnZpY2UgYW5kCitiYWNrIGFnYWluLCB3aGljaCBpcyBleHBlbnNpdmUg4oCUIHRha2luZyBvbiB0aGUgb3JkZXIgb2YgYSBtaWxsaXNlY29uZC4gT25lIG9mCit0aGUgdG9wIHByaW9yaXRpZXMgaW4gRC1CdXMgQVBJIGRlc2lnbiBpcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHJvdW5kIHRyaXBzCituZWVkZWQgYnkgY2xpZW50cy4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBjb21iaW5hdGlvbiBvZiBwcm92aWRpbmcgc3BlY2lmaWMKK2NvbnZlbmllbmNlIEFQSXMgYW5kIGRlc2lnbmluZyBBUElzIHdoaWNoIG9wZXJhdGUgb24gbGFyZ2UgZGF0YSBzZXRzIGluIGEgc2luZ2xlCitjYWxsLCByYXRoZXIgdGhhbiByZXF1aXJpbmcgYXMgbWFueSBjYWxscyBhcyBlbGVtZW50cyBpbiB0aGUgZGF0YSBzZXQuCisKK0NvbnNpZGVyIGFuIGFkZHJlc3MgYm9vayBBUEksICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuQWRkcmVzc0Jvb2spLiBJdAorbWlnaHQgaGF2ZSBhbiAkY29kZShBZGRDb250YWN0KHNzJCkg4oaSICh1JCkpIG1ldGhvZCB0byBhZGQgYSBjb250YWN0ICh0YWtpbmcgbmFtZQorYW5kIGUtbWFpbCBhZGRyZXNzIHBhcmFtZXRlcnMgYW5kIHJldHVybmluZyBhIHVuaXF1ZSBjb250YWN0IElEKSwgYW5kIGEKKyRjb2RlKFJlbW92ZUNvbnRhY3QodSQpKSBtZXRob2QgdG8gcmVtb3ZlIG9uZSBieSBJRC4gSW4gdGhlIG5vcm1hbCBjYXNlIG9mCitvcGVyYXRpbmcgb24gc2luZ2xlIGNvbnRhY3RzIGluIHRoZSBhZGRyZXNzIGJvb2ssIHRoZXNlIGNhbGxzIGFyZSBvcHRpbWFsLgorSG93ZXZlciwgaWYgdGhlIHVzZXIgd2FudHMgdG8gaW1wb3J0IGEgbGlzdCBvZiBjb250YWN0cywgb3IgZGVsZXRlIG11bHRpcGxlCitjb250YWN0cyBzaW11bHRhbmVvdXNseSwgb25lIGNhbGwgaGFzIHRvIGJlIG1hZGUgcGVyIGNvbnRhY3Qg4oCUIHRoaXMgY291bGQgdGFrZQorYSBsb25nIHRpbWUgZm9yIGxhcmdlIGNvbnRhY3QgbGlzdHMuCisKK0luc3RlYWQgb2YgdGhlICRjb2RlKEFkZENvbnRhY3QpIGFuZCAkY29kZShSZW1vdmVDb250YWN0KSBtZXRob2RzLCB0aGUgaW50ZXJmYWNlCitjb3VsZCBoYXZlIGFuICRjb2RlKFVwZGF0ZUNvbnRhY3RzKGEoc3MkKWF1JCkg4oaSIChhdSQpKSBtZXRob2QsIHdoaWNoIHRha2VzIGFuIGFycmF5CitvZiBzdHJ1Y3RzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb250YWN0c+KAmSBkZXRhaWxzLCBhbmQgYW4gYXJyYXkgb2YgSURzIG9mIHRoZQorY29udGFjdHMgdG8gZGVsZXRlLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBJRHMgZm9yIHRoZSBuZXcgY29udGFjdHMuIFRoaXMKK3JlZHVjZXMgdGhlIG51bWJlciBvZiByb3VuZCB0cmlwcyBuZWVkZWQgdG8gb25lLgorCitBZGRpbmcgY29udmVuaWVuY2UgQVBJcyB0byByZXBsYWNlIGEgc2VyaWVzIG9mIGNvbW1vbiBtZXRob2QgY2FsbHMgd2l0aCBhIHNpbmdsZQorbWV0aG9kIGNhbGwgc3BlY2lmaWNhbGx5IGZvciB0aGF0IHRhc2sgaXMgYmVzdCBkb25lIGFmdGVyIHRoZSBBUEkgaGFzIGJlZW4KK3Byb2ZpbGVkIGFuZCBib3R0bGVuZWNrcyBpZGVudGlmaWVkLCBvdGhlcndpc2UgaXQgY291bGQgbGVhZCB0byBwcmVtYXR1cmUKK29wdGltaXphdGlvbi4gT25lIGFyZWEgd2hlcmUgY29udmVuaWVuY2UgbWV0aG9kcyBjYW4gdHlwaWNhbGx5IGJlIGFkZGVkCitpcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgYSBjbGllbnQsIHdoZXJlIG11bHRpcGxlIG1ldGhvZCBjYWxscyBhcmUgbmVlZGVkIHRvCitlc3RhYmxpc2ggaXRzIHN0YXRlIHdpdGggdGhlIHNlcnZpY2UuCisKKz09PSBUYWtpbmcgQWR2YW50YWdlIG9mIHRoZSBUeXBlIFN5c3RlbQorICAgIFtpZD0idHlwZS1zeXN0ZW0iXQorCitELUJ1c+KAmSB0eXBlIHN5c3RlbSBpcyBzaW1pbGFyIHRvIFB5dGhvbuKAmXMsIGJ1dCB3aXRoIGEgdGVyc2VyIHN5bnRheCB3aGljaCBtYXkgYmUKK3VuZmFtaWxpYXIgdG8gQyBkZXZlbG9wZXJzLiBUaGUga2V5IHRvIHVzaW5nIHRoZSB0eXBlIHN5c3RlbSBlZmZlY3RpdmVseSBpcwordG8gZXhwb3NlIGFzIG11Y2ggc3RydWN0dXJlIGluIHR5cGVzIGFzIHBvc3NpYmxlLiBJbiBwYXJ0aWN1bGFyLCBzZW5kaW5nCitzdHJ1Y3R1cmVkIHN0cmluZ3Mgb3ZlciBELUJ1cyBzaG91bGQgYmUgYXZvaWRlZCwgYXMgdGhleSBuZWVkIHRvIGJlIGJ1aWx0IGFuZAorcGFyc2VkOyBib3RoIGFyZSBjb21wbGV4IG9wZXJhdGlvbnMgd2hpY2ggYXJlIHByb25lIHRvIGJ1Z3MuCisKK0ZvciBBUElzIGJlaW5nIHVzZWQgaW4gY29uc3RyYWluZWQgc2l0dWF0aW9ucywgZW51bWVyYXRlZCB2YWx1ZXMgc2hvdWxkIGJlCit0cmFuc21pdHRlZCBhcyB1bnNpZ25lZCBpbnRlZ2Vycy4gRm9yIEFQSXMgd2hpY2ggbmVlZCB0byBiZSBleHRlbmRlZCBieSB0aGlyZAorcGFydGllcyBvciB3aGljaCBhcmUgdXNlZCBpbiBtb3JlIGxvb3NlbHkgY291cGxlZCBzeXN0ZW1zLCBlbnVtZXJhdGVkIHZhbHVlcworc2hvdWxkIGJlIHN0cmluZ3MgaW4gc29tZSBkZWZpbmVkIGZvcm1hdC4KKworVHJhbnNtaXR0aW5nIHZhbHVlcyBhcyBpbnRlZ2VycyBtZWFucyBzdHJpbmcgcGFyc2luZyBhbmQgbWF0Y2hpbmcgY2FuIGJlCithdm9pZGVkLCB0aGUgbWVzc2FnZXMgYXJlIG1vcmUgY29tcGFjdCwgYW5kIHR5cG9zIGNhbiBiZSBtb3JlIGVhc2lseSBhdm9pZGVkIGJ5CitkZXZlbG9wZXJzIChpZiwgZm9yIGV4YW1wbGUsIEMgZW51bXMgYXJlIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uKS4KKworVHJhbnNtaXR0aW5nIHZhbHVlcyBhcyBzdHJpbmdzIG1lYW5zIGFkZGl0aW9uYWwgdmFsdWVzIGNhbiBiZSBkZWZpbmVkIGJ5IHRoaXJkCitwYXJ0aWVzIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdGluZyBvdmVyIGludGVnZXIgdmFsdWVzOyBmb3IgaW5zdGFuY2UgYnkgdXNpbmcKK3RoZSBzYW1lIHJldmVyc2UtZG9tYWluLW5hbWUgbmFtZXNwYWNpbmcgYXMgRC1CdXMgaW50ZXJmYWNlcy4KKworSW4gYm90aCBjYXNlcywgdGhlIGludGVyZmFjZSBkb2N1bWVudGF0aW9uIHNob3VsZCBkZXNjcmliZSB0aGUgbWVhbmluZyBvZiBlYWNoCit2YWx1ZS4gSXQgc2hvdWxkIHN0YXRlIHdoZXRoZXIgdGhlIHR5cGUgY2FuIGJlIGV4dGVuZGVkIGluIGZ1dHVyZSBhbmQsIGlmIHNvLAoraG93IHRoZSBzZXJ2aWNlIGFuZCBjbGllbnQgc2hvdWxkIGhhbmRsZSB1bnJlY29nbml6ZWQgdmFsdWVzIOKAlCB0eXBpY2FsbHkgYnkKK2NvbnNpZGVyaW5nIHRoZW0gZXF1YWwgdG8gYW4g4oCYdW5rbm93buKAmSBvciDigJhmYWlsdXJl4oCZIHZhbHVlLiBDb252ZW50aW9uYWxseSwgemVybworaXMgdXNlZCBhcyB0aGUg4oCYdW5rbm93buKAmSB2YWx1ZS4KKworW2V4YW1wbGVdCisgIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mOgorICBbY29kZSBzdHlsZT0iaW52YWxpZCIgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgIFN0YXR1czoKKworICAgICAgICBTdGF0dXMgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgVmFsaWQgc3RhdHVzZXM6IOKAmHVua25vd27igJksIOKAmHJlYWR54oCZLCDigJhjb21wbGV0ZeKAmS4KKyAgICAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iU3RhdHVzIiB0eXBlPSJzIiBhY2Nlc3M9InJlYWQiIC8+CisKKyAgVXNlOgorICBbY29kZSBzdHlsZT0idmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgICBTdGF0dXM6CisKKyAgICAgICAgU3RhdHVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIFZhbGlkIHN0YXR1c2VzOiAwID0gVW5rbm93biwgMSA9IFJlYWR5LCAyID0gQ29tcGxldGUuCisgICAgICAgIFVucmVjb2duaXplZCBzdGF0dXNlcyBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbCB0byBVbmtub3duLgorICAgIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJTdGF0dXMiIHR5cGU9InUiIGFjY2Vzcz0icmVhZCIgLz4KKworU2ltaWxhcmx5LCBlbnVtZXJhdGVkIHZhbHVlcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGJvb2xlYW5zLCBhcyB0aGV5IGFsbG93CitleHRyYSB2YWx1ZXMgdG8gYmUgYWRkZWQgaW4gZnV0dXJlLCBhbmQgdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFib3V0IHRoZSBzZW5zZSBvZgordGhlIGJvb2xlYW4gdmFsdWUuCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKKyAgW2NvZGUgc3R5bGU9ImludmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIE1vdmVBZGRyZXNzQm9vazoKKyAgICAgICBAZGlyZWN0aW9uOiAlVFJVRSB0byBtb3ZlIGl0IHVwIGluIHRoZSBsaXN0LCAlRkFMU0UgdG8gbW92ZSBpdCBkb3duCisKKyAgICAgICBNb3ZlIHRoaXMgYWRkcmVzcyBib29rIHVwIG9yIGRvd24gaW4gdGhlIHVzZXLigJlzIGxpc3Qgb2YgYWRkcmVzcyBib29rcy4KKyAgICAgICBIaWdoZXIgYWRkcmVzcyBib29rcyBoYXZlIHRoZWlyIGNvbnRhY3RzIGRpc3BsYXllZCBmaXJzdCBpbiBzZWFyY2gKKyAgICAgICByZXN1bHRzLgorICAgIC0tPgorICAgIDxtZXRob2QgbmFtZT0iTW92ZUFkZHJlc3NCb29rIj4KKyAgICAgIDxhcmcgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJiIiBkaXJlY3Rpb249ImluIiAvPgorICAgIDwvbWV0aG9kPgorCisgIEJlIG1vcmUgZXhwbGljaXQgdGhhbiBhIGJvb2xlYW46CisgIFtjb2RlIHN0eWxlPSJ2YWxpZCIgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgTW92ZUFkZHJlc3NCb29rOgorICAgICAgIEBkaXJlY3Rpb246IDAgPSBNb3ZlIGl0IHVwIGluIHRoZSBsaXN0LCAxID0gTW92ZSBpdCBkb3duCisKKyAgICAgICBNb3ZlIHRoaXMgYWRkcmVzcyBib29rIHVwIG9yIGRvd24gaW4gdGhlIHVzZXLigJlzIGxpc3Qgb2YgYWRkcmVzcyBib29rcy4KKyAgICAgICBIaWdoZXIgYWRkcmVzcyBib29rcyBoYXZlIHRoZWlyIGNvbnRhY3RzIGRpc3BsYXllZCBmaXJzdCBpbiBzZWFyY2gKKyAgICAgICByZXN1bHRzLgorCisgICAgICAgVW5yZWNvZ25pemVkIGVudW0gdmFsdWVzIGZvciBAZGlyZWN0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBhZGRyZXNzIGJvb2sKKyAgICAgICBub3QgbW92aW5nLgorICAgIC0tPgorICAgIDxtZXRob2QgbmFtZT0iTW92ZUFkZHJlc3NCb29rIj4KKyAgICAgIDxhcmcgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ1IiBkaXJlY3Rpb249ImluIiAvPgorICAgIDwvbWV0aG9kPgorCitFbnVtZXJhdGVkIHZhbHVlcyBzaG91bGQgYWxzbyBiZSB1c2VkIGluc3RlYWQgb2YgJGVtKGh1bWFuIHJlYWRhYmxlKSBzdHJpbmdzLAord2hpY2ggc2hvdWxkIG5vdCBiZSBzZW50IG92ZXIgdGhlIGJ1cyBpZiBwb3NzaWJsZS4gVGhlIHNlcnZpY2UgYW5kIGNsaWVudCBjb3VsZAorYmUgcnVubmluZyBpbiBkaWZmZXJlbnQgbG9jYWxlcywgYW5kIGhlbmNlIGludGVycHJldCBhbnkgaHVtYW4gcmVhZGFibGUgc3RyaW5ncworZGlmZmVyZW50bHksIG9yIHByZXNlbnQgdGhlbSB0byB0aGUgdXNlciBpbiB0aGUgd3JvbmcgbGFuZ3VhZ2UuIFRyYW5zbWl0IGFuCitlbnVtZXJhdGVkIHZhbHVlIGFuZCBjb252ZXJ0IGl0IHRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGluIHRoZSBjbGllbnQuCisKK0luIHNpdHVhdGlvbnMgd2hlcmUgYSBzZXJ2aWNlIGhhcyByZWNlaXZlZCBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBmcm9tCitzb21ld2hlcmUgZWxzZSwgaXQgc2hvdWxkIHBhc3MgaXQgb24gdW5tb2RpZmllZCB0byB0aGUgY2xpZW50LCBpZGVhbGx5IHdpdGggaXRzCitsb2NhbGUgYWxvbmdzaWRlLiBQYXNzaW5nIGh1bWFuIHJlYWRhYmxlIGluZm9ybWF0aW9uIHRvIGEgY2xpZW50IGlzIGJldHRlciB0aGFuCitwYXNzaW5nIG5vdGhpbmcuCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKKyAgW2NvZGUgc3R5bGU9ImludmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIFByb2dyZXNzTm90aWZpY2F0aW9uOgorICAgICAgIEBwcm9ncmVzc19tZXNzYWdlOiBIdW1hbiByZWFkYWJsZSBwcm9ncmVzcyBtZXNzYWdlIHN0cmluZy4KKworICAgICAgIEVtaXR0ZWQgd2hlbmV2ZXIgc2lnbmlmaWNhbnQgcHJvZ3Jlc3MgaXMgbWFkZSB3aXRoIHNvbWUgZXhhbXBsZQorICAgICAgIG9wZXJhdGlvbi4gVGhlIEBwcm9ncmVzc19tZXNzYWdlIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSBVSSBkaWFsb2d1ZSB0bworICAgICAgIHBsZWFzZSB0aGUgdXNlci4KKyAgICAtLT4KKyAgICA8c2lnbmFsIG5hbWU9IlByb2dyZXNzTm90aWZpY2F0aW9uIj4KKyAgICAgIDxhcmcgbmFtZT0icHJvZ3Jlc3NfbWVzc2FnZSIgdHlwZT0icyIgLz4KKyAgICA8L21ldGhvZD4KKworICBUaGUgcHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIGFuIGVudW1lcmF0ZWQgdmFsdWU6CisgIFtjb2RlIHN0eWxlPSJ2YWxpZCIgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgUHJvZ3Jlc3NOb3RpZmljYXRpb246CisgICAgICAgQHByb2dyZXNzX3N0YXRlOiAwID0gUHJlcGFyaW5nLCAxID0gSW4gcHJvZ3Jlc3MsIDIgPSBGaW5pc2hlZAorCisgICAgICAgRW1pdHRlZCB3aGVuZXZlciBzaWduaWZpY2FudCBwcm9ncmVzcyBpcyBtYWRlIHdpdGggc29tZSBleGFtcGxlCisgICAgICAgb3BlcmF0aW9uLiBUaGUgQHByb2dyZXNzX3N0YXRlIGlzIHR5cGljYWxseSBjb252ZXJ0ZWQgdG8gYSBodW1hbiByZWFkYWJsZQorICAgICAgIHN0cmluZyBhbmQgcHJlc2VudGVkIHRvIHRoZSB1c2VyLiBVbnJlY29nbml6ZWQgQHByb2dyZXNzX3N0YXRlIHZhbHVlcworICAgICAgIHNob3VsZCBiZSB0cmVhdGVkIGFzIHN0YXRlIDEsIGluIHByb2dyZXNzLgorICAgIC0tPgorICAgIDxzaWduYWwgbmFtZT0iUHJvZ3Jlc3NOb3RpZmljYXRpb24iPgorICAgICAgPGFyZyBuYW1lPSJwcm9ncmVzc19zdGF0ZSIgdHlwZT0idSIgLz4KKyAgICA8L21ldGhvZD4KKworRC1CdXMgaGFzIG5vbmUgb2YgdGhlIHByb2JsZW1zIG9mIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgaW50ZWdlcnMgd2hpY2ggQyBoYXMKKyhzcGVjaWZpY2FsbHksIGl0IGRvZXMgbm90IGRvIGltcGxpY2l0IHNpZ24gY29udmVyc2lvbiksIHNvIGludGVnZXIgdHlwZXMgc2hvdWxkCithbHdheXMgYmUgY2hvc2VuIHRvIGJlIGFuIGFwcHJvcHJpYXRlIHNpemUgYW5kIHNpZ25lZG5lc3MgZm9yIHRoZSBkYXRhIHRoZXkKK2NvdWxkIHBvc3NpYmx5IGNvbnRhaW4uIFR5cGljYWxseSwgdW5zaWduZWQgdmFsdWVzIGFyZSBtb3JlIGZyZXF1ZW50bHkgbmVlZGVkCit0aGFuIHNpZ25lZCB2YWx1ZXMuCisKK1N0cnVjdHVyZXMgY2FuIGJlIHVzZWQgYWxtb3N0IGFueXdoZXJlIGluIGEgRC1CdXMgdHlwZSwgYW5kIGFycmF5cyBvZiBzdHJ1Y3R1cmVzCithcmUgcGFydGljdWxhcmx5IHVzZWZ1bC4gU3RydWN0dXJlcyBzaG91bGQgYmUgdXNlZCB3aGVyZXZlciBkYXRhIGZpZWxkcyBhcmUKK3JlbGF0ZWQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgc3RydWN0dXJlcyBhcmUgbm90IGV4dGVuc2libGUgaW4gZnV0dXJlLCBzbyBhbHdheXMKK2NvbnNpZGVyICRsaW5rWz4jZXh0ZW5zaWJpbGl0eV0uCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBzZXZlcmFsIGlkZW50aWNhbGx5LWluZGV4ZWQgYXJyYXlzIGNvbnRhaW5pbmcKKyAgZGlmZmVyZW50IHByb3BlcnRpZXMgb2YgdGhlIHNhbWUgc2V0IG9mIGl0ZW1zOgorICBbY29kZSBzdHlsZT0iaW52YWxpZCIgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgQWRkQ29udGFjdHM6CisgICAgICAgQG5hbWVzOiBBcnJheSBvZiBjb250YWN0IG5hbWVzIHRvIGFkZC4KKyAgICAgICBAZW1haWxzOiBDb3JyZXNwb25kaW5nIGFycmF5IG9mIGNvbnRhY3QgZS1tYWlsIGFkZHJlc3Nlcy4KKyAgICAgICBAaWRzOiBSZXR1cm5lZCBhcnJheSBvZiB0aGUgSURzIG9mIHRoZSBuZXcgY29udGFjdHMuIFRoaXMgd2lsbCBiZSB0aGUKKyAgICAgICAgIHNhbWUgbGVuZ3RoIGFzIEBuYW1lcy4KKworICAgICAgIEFkZCB6ZXJvIG9yIG1vcmUgY29udGFjdHMgdG8gdGhlIGFkZHJlc3MgYm9vaywgdXNpbmcgdGhlaXIgbmFtZXMgYW5kCisgICAgICAgZS1tYWlsIGFkZHJlc3Nlcy4gQG5hbWVzIGFuZCBAZW1haWxzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLgorICAgIC0tPgorICAgIDxtZXRob2QgbmFtZT0iQWRkQ29udGFjdHMiPgorICAgICAgPGFyZyBuYW1lPSJuYW1lcyIgdHlwZT0iYXMiIGRpcmVjdGlvbj0iaW4iIC8+CisgICAgICA8YXJnIG5hbWU9ImVtYWlscyIgdHlwZT0iYXMiIGRpcmVjdGlvbj0iaW4iIC8+CisgICAgICA8YXJnIG5hbWU9ImlkcyIgdHlwZT0iYXUiIGRpcmVjdGlvbj0ib3V0IiAvPgorICAgIDwvbWV0aG9kPgorCisgIFRoZSBhcnJheXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgYXJyYXkgb2Ygc3RydWN0dXJlczoKKyAgW2NvZGUgc3R5bGU9ImludmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIEFkZENvbnRhY3RzOgorICAgICAgIEBkZXRhaWxzOiBBcnJheSBvZiAoY29udGFjdCBuYW1lLCBjb250YWN0IGUtbWFpbCBhZGRyZXNzKSB0byBhZGQuCisgICAgICAgQGlkczogUmV0dXJuZWQgYXJyYXkgb2YgdGhlIElEcyBvZiB0aGUgbmV3IGNvbnRhY3RzLiBUaGlzIHdpbGwgYmUgdGhlCisgICAgICAgICBzYW1lIGxlbmd0aCBhcyBAZGV0YWlscy4KKworICAgICAgIEFkZCB6ZXJvIG9yIG1vcmUgY29udGFjdHMgdG8gdGhlIGFkZHJlc3MgYm9vaywgdXNpbmcgdGhlaXIgbmFtZXMgYW5kCisgICAgICAgZS1tYWlsIGFkZHJlc3Nlcy4KKyAgICAtLT4KKyAgICA8bWV0aG9kIG5hbWU9IkFkZENvbnRhY3RzIj4KKyAgICAgIDxhcmcgbmFtZT0iZGV0YWlscyIgdHlwZT0iYShzcykiIGRpcmVjdGlvbj0iaW4iIC8+CisgICAgICA8YXJnIG5hbWU9ImlkcyIgdHlwZT0iYXUiIGRpcmVjdGlvbj0ib3V0IiAvPgorICAgIDwvbWV0aG9kPgorCitOb3RlIHRoYXQgRC1CdXMgYXJyYXlzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbWl0dGVkIHdpdGggdGhlaXIgbGVuZ3RoLCBzbyB0aGVyZQoraXMgbm8gbmVlZCB0byBudWxsLXRlcm1pbmF0ZSB0aGVtIG9yIGVuY29kZSB0aGVpciBsZW5ndGggc2VwYXJhdGVseS4KKworW2NvbW1lbnRdCisgIEZJWE1FOiBNZW50aW9uIG1heWJlIHR5cGVzIGFuZCB0aGUgZXh0ZW5kZWQga2RidXMvR1ZhcmlhbnQgdHlwZSBzeXN0ZW0gb25jZQorICB0aGF04oCZcyBzdGFibGUgYW5kIHJvdW5kLXRyaXAtYWJpbGl0eSBpcyBubyBsb25nZXIgYSBjb25jZXJuLgorCis9PT0gRXh0ZW5zaWJpbGl0eQorICAgIFtpZD0iZXh0ZW5zaWJpbGl0eSJdCisKK1NvbWUgRC1CdXMgQVBJcyBoYXZlIHZlcnkgd2VsbC1kZWZpbmVkIHVzZSBjYXNlcywgYW5kIHdpbGwgbmV2ZXIgbmVlZCBleHRlbnNpb24uCitPdGhlcnMgYXJlIHVzZWQgaW4gbW9yZSBsb29zZWx5IGNvdXBsZWQgc3lzdGVtcyB3aGljaCBtYXkgY2hhbmdlIG92ZXIgdGltZSwgYW5kCitoZW5jZSBzaG91bGQgYmUgZGVzaWduZWQgdG8gYmUgZXh0ZW5zaWJsZSBmcm9tIHRoZSBiZWdpbm5pbmcgd2l0aG91dCB0aGUgbmVlZAordG8gYnJlYWsgQVBJIGluIGZ1dHVyZS4gVGhpcyBpcyBhIHRyYWRlIG9mZiBiZXR3ZWVuIGhhdmluZyBhIG1vcmUgY29tcGxleCBBUEksCithbmQgYmVpbmcgYWJsZSB0byBlYXNpbHkgZXh0ZW5kIGl0IGluIGZ1dHVyZS4KKworVGhlIGtleSB0b29sIGZvciBleHRlbnNpYmlsaXR5IGluIEQtQnVzIGlzICRjb2RlKGF7c3Z9KSwgdGhlIGRpY3Rpb25hcnkgbWFwcGluZworc3RyaW5ncyB0byB2YXJpYW50cy4gSWYgd2VsbC1kZWZpbmVkIG5hbWVzcGFjZWQgc3RyaW5ncyBhcmUgdXNlZCBhcyB0aGUKK2RpY3Rpb25hcnkga2V5cywgYXJiaXRyYXJ5IEQtQnVzIHBlZXJzIGNhbiBhZGQgd2hhdGV2ZXIgaW5mb3JtYXRpb24gdGhleSBuZWVkCitpbnRvIHRoZSBkaWN0aW9uYXJ5LiBBbnkgb3RoZXIgcGVlciB3aGljaCB1bmRlcnN0YW5kcyBpdCBjYW4gcXVlcnkgYW5kIHJldHJpZXZlCit0aGUgaW5mb3JtYXRpb247IG90aGVyIHBlZXJzIHdpbGwgaWdub3JlIGl0LgorCitUaGUgY2Fub25pY2FsIGV4YW1wbGUgb2YgYW4gZXh0ZW5zaWJsZSBBUEkgdXNpbmcgJGNvZGUoYXtzdn0pIGlzCiskbGlua1s+Pmh0dHA6Ly90ZWxlcGF0aHkuZnJlZWRlc2t0b3Aub3JnL3NwZWMvXShUZWxlcGF0aHkpLsKgSXQgdXNlcyAkY29kZShhe3N2fSkKK3ZhbHVlcyBhcyB0aGUgZmluYWwgZWxlbWVudCBpbiBzdHJ1Y3R1cmVzIHRvIGFsbG93IHRoZW0gdG8gYmUgZXh0ZW5kZWQgaW4KK2Z1dHVyZS4KKworQSBzZWNvbmRhcnkgdG9vbCBpcyB0aGUgdXNlIG9mIGZsYWcgZmllbGRzIGluIG1ldGhvZCBjYWxscy4gVGhlIHNldCBvZiBhY2NlcHRlZAorZmxhZ3MgaXMgZW50aXJlbHkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIGludGVyZmFjZSBkZXNpZ25lciBhbmQsIGFzIHdpdGgKK2VudW1lcmF0ZWQgdHlwZXMsIGNhbiBiZSBleHRlbmRlZCBpbiBmdXR1cmUgd2l0aG91dCBicmVha2luZyBBUEkuIEFkZGluZyBtb3JlCitmbGFncyBhbGxvd3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG1ldGhvZCBjYWxsIHRvIGJlIHR3ZWFrZWQuCisKKz09PSBVc2luZyBTaWduYWxzLCBQcm9wZXJ0aWVzIGFuZCBFcnJvcnMKKyAgICBbaWQ9InVzaW5nLXRoZS1mZWF0dXJlcyJdCisKK0QtQnVzIG1ldGhvZCBjYWxscyBhcmUgZXhwbGljaXRseSBhc3luY2hyb25vdXMgZHVlIHRvIHRoZSBsYXRlbmN5IGluaGVyZW50IGluCitJUEMuIFRoaXMgbWVhbnMgdGhhdCBwZWVycyBzaG91bGQgbm90IGJsb2NrIG9uIHJlY2VpdmluZyBhIHJlcGx5IGZyb20gYSBtZXRob2QKK2NhbGw7IHRoZXkgc2hvdWxkIHNjaGVkdWxlIG90aGVyIHdvcmsgKGluIGEgbWFpbiBsb29wKSBhbmQgaGFuZGxlIHRoZSByZXBseSB3aGVuCitpdCBpcyByZWNlaXZlZC4gRXZlbiB0aG91Z2ggbWV0aG9kIHJlcGxpZXMgbWF5IHRha2UgYSB3aGlsZSwgdGhlIGNhbGxlciBpcworJGVtKGd1YXJhbnRlZWQpIHRvIHJlY2VpdmUgZXhhY3RseSBvbmUgcmVwbHkgZXZlbnR1YWxseS4gVGhpcyByZXBseSBjb3VsZCBiZSB0aGUKK3JldHVybiB2YWx1ZSBmcm9tIHRoZSBtZXRob2QsIGFuIGVycm9yIGZyb20gdGhlIG1ldGhvZCwgb3IgYW4gZXJyb3IgZnJvbSB0aGUKK0QtQnVzIGRhZW1vbiBpbmRpY2F0aW5nIHRoZSBzZXJ2aWNlIGZhaWxlZCBpbiBzb21lIHdheSAoZS5nLiBkdWUgdG8gY3Jhc2hpbmcpLgorCitCZWNhdXNlIG9mIHRoaXMsIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSBjYXJlZnVsIHRvIGFsd2F5cyByZXBseQorZXhhY3RseSBvbmNlIHRvIGVhY2ggbWV0aG9kIGNhbGwuIFJlcGx5aW5nIGF0IHRoZSBlbmQgb2YgYSBsb25nLXJ1bm5pbmcKK29wZXJhdGlvbiBpcyBjb3JyZWN0IOKAlCB0aGUgY2xpZW50IHdpbGwgcGF0aWVudGx5IHdhaXQgdW50aWwgdGhlIG9wZXJhdGlvbiBoYXMKK2ZpbmlzaGVkIGFuZCB0aGUgcmVwbHkgaXMgcmVjZWl2ZWQuCisKK05vdGUgdGhhdCBELUJ1cyBjbGllbnQgYmluZGluZ3MgbWF5IGltcGxlbWVudCBzeW50aGV0aWMgdGltZW91dHMgb2Ygc2V2ZXJhbAordGVucyBvZiBzZWNvbmRzLCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBmb3IgYSBjYWxsLiBGb3IgdmVyeSBsb25nLXJ1bm5pbmcKK29wZXJhdGlvbnMsIHlvdSBzaG91bGQgZGlzYWJsZSB0aGUgY2xpZW50IGJpbmRpbmdz4oCZIHRpbWVvdXQgYW5kIG1ha2UgaXQgY2xlYXIKK2luIHRoZSBjbGllbnTigJlzIFVJIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBub3QgZnJvemVuIGFuZCBpcyBzaW1wbHkgcnVubmluZyBhCitsb25nIG9wZXJhdGlvbi4KKworQW4gYW50aS1wYXR0ZXJuIHRvIGF2b2lkIGluIHRoaXMgc2l0dWF0aW9uIGlzIHRvIHN0YXJ0IGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbgord2hlbiBhIG1ldGhvZCBjYWxsIGlzIHJlY2VpdmVkLCB0aGVuIHRvIG5ldmVyIHJlcGx5IHRvIHRoZSBtZXRob2QgY2FsbCBhbmQKK2luc3RlYWQgbm90aWZ5IHRoZSBjbGllbnQgb2YgY29tcGxldGlvbiBvZiB0aGUgb3BlcmF0aW9uIHZpYSBhIHNpZ25hbC4gVGhpcworYXBwcm9hY2ggaXMgaW5jb3JyZWN0IGFzIHNpZ25hbCBlbWlzc2lvbnMgZG8gbm90IGhhdmUgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcAord2l0aCBtZXRob2QgY2FsbHMg4oCUIHRoZSBzaWduYWwgY291bGQgdGhlb3JldGljYWxseSBiZSBlbWl0dGVkIG11bHRpcGxlIHRpbWVzLCBvcgorbmV2ZXIsIHdoaWNoIHRoZSBjbGllbnQgd291bGQgbm90IGJlIGFibGUgdG8gaGFuZGxlLgorCitTaW1pbGFybHksIHVzZSBhIEQtQnVzIGVycm9yIHJlcGx5IHRvIHNpZ25pZnkgZmFpbHVyZSBvZiBhbiBvcGVyYXRpb24gdHJpZ2dlcmVkCitieSBhIG1ldGhvZCBjYWxsLCByYXRoZXIgdGhhbiB1c2luZyBhIGN1c3RvbSBlcnJvciBjb2RlIGluIHRoZSBtZXRob2TigJlzCityZXBseS4gVGhpcyBtZWFucyB0aGF0IGEgcmVwbHkgYWx3YXlzIGluZGljYXRlcyBzdWNjZXNzLCBhbmQgYW4gZXJyb3IgYWx3YXlzCitpbmRpY2F0ZXMgZmFpbHVyZSDigJQgcmF0aGVyIHRoYW4gYSByZXBseSBpbmRpY2F0aW5nIGVpdGhlciBkZXBlbmRpbmcgb24gaXRzCitwYXJhbWV0ZXJzLCBhbmQgaGF2aW5nIHRvIHJldHVybiBkdW1teSB2YWx1ZXMgaW4gdGhlIG90aGVyIHBhcmFtZXRlcnMuIFVzaW5nCitELUJ1cyBlcnJvciByZXBsaWVzIGFsc28gbWVhbnMgc3VjaCBmYWlsdXJlcyBjYW4gYmUgaGlnaGxpZ2h0ZWQgaW4gZGVidWdnaW5nCit0b29scywgc2ltcGxpZnlpbmcgZGVidWdnaW5nLgorCitDbGllbnRzIHNob3VsZCBoYW5kbGUgYWxsIHBvc3NpYmxlIHN0YW5kYXJkIGFuZCBkb2N1bWVudGVkIEQtQnVzIGVycm9ycyBmb3IgZWFjaAorbWV0aG9kIGNhbGwuIElQQyBpbmhlcmVudGx5IGhhcyBtb3JlIHBvdGVudGlhbCBmYWlsdXJlcyB0aGFuIG5vcm1hbCBDIGZ1bmN0aW9uCitjYWxscywgYW5kIGNsaWVudHMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGhhbmRsZSBhbGwgb2YgdGhlbSBncmFjZWZ1bGx5LgorCis9PT0gVXNpbmcgU3RhbmRhcmQgSW50ZXJmYWNlcworICAgIFtpZD0ic3RhbmRhcmQtaW50ZXJmYWNlcyJdCisKK1VzZSBzdGFuZGFyZCBELUJ1cyBpbnRlcmZhY2VzIHdoZXJlIHBvc3NpYmxlLgorCis9PT09IFByb3BlcnRpZXMKKyAgICAgW2lkPSJpbnRlcmZhY2UtcHJvcGVydGllcyJdCisKK1RoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjc3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzXSgkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzKSkKK2ludGVyZmFjZSwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkgYWxsIG9iamVjdHMgdG8gbm90aWZ5IGNsaWVudHMgb2YgY2hhbmdlcwordG8gdGhlaXIgcHJvcGVydHkgdmFsdWVzLCB3aXRoIHRoZSAkY29kZShQcm9wZXJ0aWVzQ2hhbmdlZCkgc2lnbmFsLiBUaGlzIHNpZ25hbAorZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgaW5kaXZpZHVhbCAkY29kZSgkdmFyKFByb3BlcnR5TmFtZSlDaGFuZ2VkKSBzaWduYWxzLCBhbmQKK2FsbG93cyBtdWx0aXBsZSBwcm9wZXJ0aWVzIHRvIGJlIG5vdGlmaWVkIGluIGEgc2luZ2xlIHNpZ25hbCBlbWlzc2lvbiwgcmVkdWNpbmcKK0lQQyByb3VuZCB0cmlwcy4gU2ltaWxhcmx5LCB0aGUgJGNvZGUoR2V0KSBhbmQgJGNvZGUoU2V0KSBtZXRob2RzIGNhbiBiZSB1c2VkIHRvCittYW5pcHVsYXRlIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0LCBlbGltaW5hdGluZyByZWR1bmRhbnQKKyRjb2RlKEdldCR2YXIoUHJvcGVydHlOYW1lKSkgYW5kICRjb2RlKFNldCR2YXIoUHJvcGVydHlOYW1lKSkgbWV0aG9kcy4KKworW2V4YW1wbGVdCisgIEZvciBleGFtcGxlLCBjb25zaWRlciBhbiBvYmplY3QgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZQorICAkY29kZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxLlNvbWVJbnRlcmZhY2UpIHdpdGggbWV0aG9kczoKKyAgW2xpc3RdCisgICogJGNvZGUoR2V0TmFtZSgkKSDihpIgKHMkKSkKKyAgKiAkY29kZShTZXROYW1lKHMkKSDihpIgKCQpKQorICAqICRjb2RlKEdldFN0YXR1cygkKSDihpIgKHUkKSkKKyAgKiAkY29kZShSdW5PcGVyYXRpb24oc3MkKSDihpIgKHUkKSkKKyAgYW5kIHNpZ25hbHM6CisgIFtsaXN0XQorICAqICRjb2RlKE5hbWVDaGFuZ2VkKHUkKSkKKyAgKiAkY29kZShTdGF0dXNDaGFuZ2VkKHUkKSkKKworICBUaGUgaW50ZXJmYWNlIGNvdWxkIGJlIGN1dCBkb3duIHRvIGEgc2luZ2xlIG1ldGhvZDoKKyAgW2xpc3RdCisgICogJGNvZGUoUnVuT3BlcmF0aW9uKHNzJCkg4oaSICh1JCkpCisgIFRoZSBvYmplY3QgY291bGQgdGhlbiBpbXBsZW1lbnQgdGhlICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMpCisgIGludGVyZmFjZSBhbmQgZGVmaW5lIHByb3BlcnRpZXM6CisgIFtsaXN0XQorICAqICRjb2RlKE5hbWUpIG9mIHR5cGUgJGNvZGUocyksIHJlYWTigJN3cml0ZQorICAqICRjb2RlKFN0YXR1cykgb2YgdHlwZSAkY29kZSh1KSwgcmVhZC1vbmx5CisKKyAgVGhlICRjb2RlKE5hbWVDaGFuZ2VkKSBhbmQgJGNvZGUoU3RhdHVzQ2hhbmdlZCkgc2lnbmFscyB3b3VsZCBiZSByZXBsYWNlZCBieQorICAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkKS4KKworPT09PSBPYmplY3QgTWFuYWdlcgorICAgICBbaWQ9ImludGVyZmFjZS1vYmplY3QtbWFuYWdlciJdCisKK1RoZSBzcGVjaWZpY2F0aW9uIGFsc28gZGVmaW5lcyB0aGUKKyRsaW5rWz4+aHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNzdGFuZGFyZC1pbnRlcmZhY2VzLW9iamVjdG1hbmFnZXJdKCRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIpKQoraW50ZXJmYWNlLCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBhIHNlcnZpY2UgbmVlZHMgdG8gZXhwb3NlIGEgdmFyaWFibGUKK251bWJlciBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIGNsYXNzIGluIGEgZmxhdCBvciB0cmVlLWxpa2Ugc3RydWN0dXJlLCBhbmQKK2NsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGJlIGludGVyZXN0ZWQgaW4gbW9zdCBvciBhbGwgb2YgdGhlIG9iamVjdHMuIEZvcgorZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIGJ5IGFuIGFkZHJlc3MgYm9vayBzZXJ2aWNlIHdoaWNoIGV4cG9zZXMgbXVsdGlwbGUKK2FkZHJlc3MgYm9va3MsIGVhY2ggYXMgYSBzZXBhcmF0ZSBvYmplY3QuIFRoZSAkY29kZShHZXRNYW5hZ2VkT2JqZWN0cykgbWV0aG9kCithbGxvd3MgdGhlIGZ1bGwgb2JqZWN0IHRyZWUgdG8gYmUgcXVlcmllZCwgcmV0dXJuaW5nIGFsbCB0aGUgb2JqZWN0c+KAmSBwcm9wZXJ0aWVzCit0b28sIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBmdXJ0aGVyIElQQyByb3VuZCB0cmlwcyB0byBxdWVyeSB0aGUgcHJvcGVydGllcy4KKworSWYgY2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGJlIGludGVyZXN0ZWQgaW4gbW9zdCBvZiB0aGUgZXhwb3NlZCBvYmplY3RzLAorJGNvZGUoT2JqZWN0TWFuYWdlcikgc2hvdWxkICRlbShub3QpIGJlIHVzZWQsIGFzIGl0IHdpbGwgc2VuZCBhbGwgb2YgdGhlIG9iamVjdHMKK3RvIGVhY2ggY2xpZW50IGFueXdheSwgd2FzdGluZyBidXMgYmFuZHdpZHRoLiBBIGZpbGUgbWFuYWdlciwgdGhlcmVmb3JlLCBzaG91bGQKK25vdCBleHBvc2UgdGhlIGVudGlyZSBmaWxlIHN5c3RlbSBoaWVyYXJjaHkgdXNpbmcgJGNvZGUoT2JqZWN0TWFuYWdlcikuCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYW4gb2JqZWN0IGltcGxlbWVudGluZyBhbiBpbnRlcmZhY2UKKyAgJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5BZGRyZXNzQm9va01hbmFnZXIpIHdpdGggbWV0aG9kczoKKyAgW2xpc3RdCisgICogJGNvZGUoR2V0QWRkcmVzc0Jvb2tzKCQpIOKGkiAoYW8kKSkKKyAgYW5kIHNpZ25hbHM6CisgIFtsaXN0XQorICAqICRjb2RlKEFkZHJlc3NCb29rQWRkZWQobyQpKQorICAqICRjb2RlKEFkZHJlc3NCb29rUmVtb3ZlZChvJCkpCisKKyAgSWYgdGhlIG1hbmFnZXIgb2JqZWN0IGlzIGF0IHBhdGgKKyAgJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvQWRkcmVzc0Jvb2tNYW5hZ2VyKSwgZWFjaCBhZGRyZXNzIGJvb2sgaXMgYQorICBjaGlsZCBvYmplY3QsIGUuZy4KKyAgJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvQWRkcmVzc0Jvb2tNYW5hZ2VyL1NvbWVBZGRyZXNzQm9vaykuCisKKyAgVGhlIGludGVyZmFjZSBjb3VsZCBiZSBlbGltaW5hdGVkLCBhbmQgdGhlCisgICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIpIGludGVyZmFjZSBpbXBsZW1lbnRlZCBvbiB0aGUgbWFuYWdlcgorICBvYmplY3QgaW5zdGVhZC4KKworICBDYWxscyB0byAkY29kZShHZXRBZGRyZXNzQm9va3MpIHdvdWxkIGJlY29tZSBjYWxscyB0byAkY29kZShHZXRNYW5hZ2VkT2JqZWN0cykKKyAgYW5kIGVtaXNzaW9ucyBvZiB0aGUgJGNvZGUoQWRkcmVzc0Jvb2tBZGRlZCkgYW5kICRjb2RlKEFkZHJlc3NCb29rUmVtb3ZlZCkKKyAgc2lnbmFscyB3b3VsZCBiZWNvbWUgZW1pc3Npb25zIG9mICRjb2RlKEludGVyZmFjZXNBZGRlZCkgYW5kCisgICRjb2RlKEludGVyZmFjZXNSZW1vdmVkKS4KKworPT09IE5hbWluZyBDb252ZW50aW9ucworICAgIFtpZD0ibmFtaW5nLWNvbnZlbnRpb25zIl0KKworQWxsIEQtQnVzIG5hbWVzLCBmcm9tIHNlcnZpY2UgbmFtZXMgdGhyb3VnaCB0byBtZXRob2QgcGFyYW1ldGVycywgZm9sbG93IGEgc2V0CitvZiBjb252ZW50aW9ucy4gRm9sbG93aW5nIHRoZXNlIGNvbnZlbnRpb25zIG1ha2VzIEFQSXMgbW9yZSBuYXR1cmFsIHRvIHVzZSBhbmQKK2NvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgc2VydmljZXMgb24gdGhlIHN5c3RlbS4KKworU2VydmljZXMgdXNlIHJldmVyc2UtZG9tYWluLW5hbWUgbm90YXRpb24sIGJhc2VkIG9uIHRoZSBkb21haW4gbmFtZSBvZiB0aGUKK3Byb2plY3QgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlIChhbGwgaW4gbG93ZXIgY2FzZSksIHBsdXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlCitzZXJ2aWNlIChpbiBjYW1lbCBjYXNlKS4KKworW2V4YW1wbGVdCisgIEZvciBleGFtcGxlLCB2ZXJzaW9uIDIgb2YgYW4gYWRkcmVzcyBib29rIGFwcGxpY2F0aW9uIGNhbGxlZCAkY29kZShDb250YWN0RGV4KQorICBwcm92aWRlZCBieSBhIHNvZnR3YXJlIHZlbmRvciB3aG9zZSB3ZWJzaXRlIGlzICRjb2RlKGNob2NvbGF0ZXRlYXBvdC5jb20pCisgIHdvdWxkIHVzZSBzZXJ2aWNlIG5hbWUgJGNvZGUoY29tLmNob2NvbGF0ZXRlYXBvdC5Db250YWN0RGV4MikuCisKK0FsbW9zdCBhbGwgbmFtZXMgdXNlIGNhbWVsIGNhc2Ugd2l0aCBubyB1bmRlcnNjb3JlcywgYXMgaW4gdGhlIGV4YW1wbGVzIGJlbG93LgorTWV0aG9kIGFuZCBzaWduYWwgcGFyYW1ldGVycyBhcmUgYW4gZXhjZXB0aW9uLCB1c2luZworJGNvZGUobG93ZXJjYXNlX3dpdGhfdW5kZXJzY29yZXMpLiBUeXBlIGluZm9ybWF0aW9uIGlzIG5ldmVyIGVuY29kZWQgaW4gdGhlCitwYXJhbWV0ZXIgbmFtZSAoaS5lLiAkZW0obm90KQorJGxpbmtbPj5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1bmdhcmlhbl9ub3RhdGlvbl0oSHVuZ2FyaWFuIG5vdGF0aW9uKSkuCisKK1tleGFtcGxlXQorICBbdGVybXNdCisgIC0gU2VydmljZSBOYW1lCisgICogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMSkKKyAgLSBJbnRlcmZhY2UgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZSkKKyAgLSBPYmplY3QgUGF0aCAoUm9vdCBPYmplY3QpCisgICogJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEpCisgIC0gT2JqZWN0IFBhdGggKENoaWxkIE9iamVjdCkKKyAgKiAkY29kZSgvY29tL2V4YW1wbGUvTXlTZXJ2aWNlMS9Tb21lQ2hpbGQpCisgIC0gT2JqZWN0IFBhdGggKEdyYW5kY2hpbGQgT2JqZWN0KQorICAqICRjb2RlKC9jb20vZXhhbXBsZS9NeVNlcnZpY2UxL0Fub3RoZXJDaGlsZC9HcmFuZGNoaWxkMSkKKyAgLSBNZXRob2QgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZS5NZXRob2ROYW1lKQorICAtIFNpZ25hbCBOYW1lCisgICogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5Tb21lSW50ZXJmYWNlLlNpZ25hbE5hbWUpCisgIC0gUHJvcGVydHkgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZS5Qcm9wZXJ0eU5hbWUpCisKK1NlZSBhbHNvOiAkbGlua1s+I2FwaS12ZXJzaW9uaW5nXS4KKworPT0gQ29kZSBnZW5lcmF0aW9uCisgICBbaWQ9ImNvZGUtZ2VuZXJhdGlvbiJdCisKK1JhdGhlciB0aGFuIG1hbnVhbGx5IGltcGxlbWVudGluZyBib3RoIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBzaWRlcyBvZiBhIEQtQnVzCitpbnRlcmZhY2UsIGl0IGlzIG9mdGVuIGVhc2llciB0byB3cml0ZSB0aGUgaW50ZXJmYWNlIFhNTCBkZXNjcmlwdGlvbiBhbmQgdXNlIGEKK3Rvb2wgc3VjaCBhcworJGxpbmtbPj5odHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2lvL3N0YWJsZS9nZGJ1cy1jb2RlZ2VuLmh0bWxdKCRjbWQoZ2RidXMtY29kZWdlbikpCit0byBnZW5lcmF0ZSB0eXBlLXNhZmUgQyBBUElzLCB0aGVuIGJ1aWxkIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aG9zZS4gVGhpcworYXZvaWRzIHRoZSB0ZWRpb3VzIGFuZCBlcnJvci1wcm9uZSBwcm9jZXNzIG9mIHdyaXRpbmcgY29kZSB0byBidWlsZCBhbmQgcmVhZAorRC1CdXMgcGFyYW1ldGVyIHZhcmlhbnRzIGZvciBlYWNoIG1ldGhvZCBjYWxsLgorCitVc2Ugb2YgY29kZSBnZW5lcmF0b3JzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBndWlkZTsgZm9yIG1vcmUgaW5mb3JtYXRpb24sCitzZWUgdGhlCiskbGlua1s+Pmh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9naW8vc3RhYmxlL2dkYnVzLWNvZGVnZW4uaHRtbF0oJGNtZChnZGJ1cy1jb2RlZ2VuKQorbWFudWFsKS4KKworPT0gQW5ub3RhdGlvbnMKKyAgIFtpZD0iYW5ub3RhdGlvbnMiXQorCitBbm5vdGF0aW9ucyBtYXkgYmUgYWRkZWQgdG8gdGhlIGludGVyZmFjZSBYTUwgdG8gZXhwb3NlIG1ldGFkYXRhIG9uIHRoZSBBUEkKK3doaWNoIGNhbiBiZSB1c2VkIGJ5IGRvY3VtZW50YXRpb24gb3IgY29kZSBnZW5lcmF0aW9uIHRvb2xzIHRvIG1vZGlmeSB0aGVpcgorb3V0cHV0LiBTb21lIHN0YW5kYXJkIGFubm90YXRpb25zIGFyZSBnaXZlbiBpbiB0aGUKKyRsaW5rWz4+aHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNpbnRyb3NwZWN0aW9uLWZvcm1hdF0oRC1CdXMKK3NwZWNpZmljYXRpb24pLCBidXQgZnVydGhlciBhbm5vdGF0aW9ucyBtYXkgYmUgZGVmaW5lZCBieSBzcGVjaWZpYyB0b29scy4KKworRm9yIGV4YW1wbGUsICRjbWQoZ2RidXMtY29kZWdlbikgZGVmaW5lcyBzZXZlcmFsIHVzZWZ1bCBhbm5vdGF0aW9ucywgbGlzdGVkIG9uCitpdHMgbWFuIHBhZ2UuCisKK1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgYXJlIHRoZSBtb3N0IHVzZWZ1bDoKKworW3Rlcm1zXQorLSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkKQorKiBNYXJrIGEgc3ltYm9sIGFzIGRlcHJlY2F0ZWQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgdGhlIEFQSSBpcyBjaGFuZ2VkLAorICBzcGVjaWZ5aW5nIHRoZSB2ZXJzaW9uIGludHJvZHVjaW5nIHRoZSBkZXByZWNhdGlvbiwgdGhlIHJlYXNvbiBmb3IKKyAgZGVwcmVjYXRpb24sIGFuZCBhIHJlcGxhY2VtZW50IHN5bWJvbCB0byB1c2UuCistICRjb2RlKG9yZy5ndGsuR0RCdXMuU2luY2UpCisqIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gYWRkZWQgdG8gdGhlIEFQSSBhZnRlciB0aGUgaW5pdGlhbCByZWxlYXNlLiBUaGlzCisgIHNob3VsZCBpbmNsdWRlIHRoZSB2ZXJzaW9uIHRoZSBzeW1ib2wgd2FzIGZpcnN0IGFkZGVkIGluLgorLSAkY29kZShvcmcuZ3RrLkdEQnVzLkMuTmFtZSkgYW5kICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbCkKKyogQm90aCB1c2VkIGludGVyY2hhbmdlYWJseSB0byBoaW50IGF0IGEgQyBmdW5jdGlvbiBuYW1lIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcKKyAgY29kZSBmb3IgYSBzeW1ib2wuIFVzZSBvZiB0aGlzIGFubm90YXRpb24gY2FuIG1ha2UgZ2VuZXJhdGVkIGJpbmRpbmdzIGEgbG90CisgIG1vcmUgcGxlYXNhbnQgdG8gdXNlLgorLSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWwpCisqIEluZGljYXRlIHdoZXRoZXIgYSBwcm9wZXJ0eSBpcyBleHBlY3RlZCB0byBlbWl0IGNoYW5nZSBzaWduYWxzLiBUaGlzIGNhbgorICBhZmZlY3QgY29kZSBnZW5lcmF0aW9uLCBidXQgaXMgYWxzbyB1c2VmdWwgZG9jdW1lbnRhdGlvbiwgYXMgY2xpZW50IHByb2dyYW1zCisgIHRoZW4ga25vdyB3aGVuIHRvIGV4cGVjdCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgd2hlbiB0aGV5IGhhdmUgdG8KKyAgcmVxdWVyeS4KKworPT0gRG9jdW1lbnRhdGlvbgorICAgW2lkPSJkb2N1bWVudGF0aW9uIl0KKworQWxzbyBqdXN0IGxpa2UgQyBBUElzLCBELUJ1cyBBUElzIG11c3QgYmUgZG9jdW1lbnRlZC4gVGhlcmUgYXJlIHNldmVyYWwgbWV0aG9kcworZm9yIGRvY3VtZW50aW5nIHRoZSBpbnRlcmZhY2VzLCBtZXRob2RzLCBwcm9wZXJ0aWVzIGFuZCBzaWduYWxzIGluIGEgRC1CdXMKK2ludGVyZmFjZSBYTUwgZmlsZSwgZWFjaCB1bmZvcnR1bmF0ZWx5IHdpdGggdGhlaXIgb3duIGRvd25zaWRlcy4gWW91IHNob3VsZAorY2hvb3NlIHRoZSBtZXRob2Qgd2hpY2ggYmVzdCBtYXRjaGVzIHRoZSB0b29saW5nIGFuZCB3b3JrZmxvdyB5b3UgYXJlIHVzaW5nLgorCis9PT0gWE1MIENvbW1lbnRzCisKK1hNTCBjb21tZW50cyBjb250YWluaW5nIGRvY3VtZW50YXRpb24gaW4gdGhlCiskbGlua1s+Pmh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9ndGstZG9jLW1hbnVhbC9zdGFibGUvZG9jdW1lbnRpbmdfc3ludGF4Lmh0bWwuZW5dKGd0ay1kb2MKK2Zvcm1hdCkgaXMgdGhlIHJlY29tbWVuZGVkIGZvcm1hdCBmb3IgdXNlIHdpdGgKKyRsaW5rWz4+aHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dpby9zdGFibGUvZ2RidXMtY29kZWdlbi5odG1sXSgkY21kKGdkYnVzLWNvZGVnZW4pKS4KK1VzaW5nICRjbWQoZ2RidXMtY29kZWdlbiksIHRoZXNlIGNvbW1lbnRzIGNhbiBiZSBleHRyYWN0ZWQsIGNvbnZlcnRlZCB0byBEb2NCb29rCitmb3JtYXQgYW5kIGluY2x1ZGVkIGluIHRoZSBwcm9qZWN04oCZcyBBUEkgbWFudWFsLiBGb3IgZXhhbXBsZToKKworW2xpc3RpbmddCisgIFt0aXRsZV0KKyAgICBEb2N1bWVudGF0aW9uIENvbW1lbnRzIGluIEQtQnVzIEludGVyZmFjZSBYTUwKKyAgW2Rlc2NdCisgICAgRXhhbXBsZSBndGstZG9j4oCTc3R5bGUgZG9jdW1lbnRhdGlvbiBjb21tZW50cyBpbiB0aGUgaW50cm9zcGVjdGlvbiBYTUwgZm9yCisgICAgdGhlICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMpIGludGVyZmFjZS4KKyAgW2NvZGUgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM6CisgICAgICAgIEBzaG9ydF9kZXNjcmlwdGlvbjogU3RhbmRhcmQgcHJvcGVydHkgZ2V0dGVyL3NldHRlciBpbnRlcmZhY2UKKworICAgICAgICBJbnRlcmZhY2UgZm9yIGFsbCBvYmplY3RzIHdoaWNoIGV4cG9zZSBwcm9wZXJ0aWVzIG9uIHRoZSBidXMsIGFsbG93aW5nCisgICAgICAgIHRob3NlIHByb3BlcnRpZXMgdG8gYmUgZ290LCBzZXQsIGFuZCBzaWduYWxzIGVtaXR0ZWQgdG8gbm90aWZ5IG9mIGNoYW5nZXMKKyAgICAgICAgdG8gdGhlIHByb3BlcnR5IHZhbHVlcy4KKyAgICAtLT4KKyAgICA8aW50ZXJmYWNlIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMiPgorICAgICAgPCEtLQorICAgICAgICAgIEdldDoKKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWU6IE5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbi4KKyAgICAgICAgICBAcHJvcGVydHlfbmFtZTogTmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAgIEB2YWx1ZTogUHJvcGVydHkgdmFsdWUsIHdyYXBwZWQgaW4gYSB2YXJpYW50LgorCisgICAgICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYXQgQHByb3BlcnR5X25hbWUgb24KKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWUgb24gdGhpcyBvYmplY3QuIElmIEBpbnRlcmZhY2VfbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcsCisgICAgICAgICAgYWxsIGludGVyZmFjZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgQHByb3BlcnR5X25hbWU7IGlmIG11bHRpcGxlCisgICAgICAgICAgcHJvcGVydGllcyBtYXRjaCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisKKyAgICAgICAgICBJZiBAaW50ZXJmYWNlX25hbWUgb3IgQHByb3BlcnR5X25hbWUgZG8gbm90IGV4aXN0LCBhCisgICAgICAgICAgI29yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRBcmdzIGVycm9yIGlzIHJldHVybmVkLgorICAgICAgLS0+CisgICAgICA8bWV0aG9kIG5hbWU9IkdldCI+CisgICAgICAgIDxhcmcgdHlwZT0icyIgbmFtZT0iaW50ZXJmYWNlX25hbWUiIGRpcmVjdGlvbj0iaW4iLz4KKyAgICAgICAgPGFyZyB0eXBlPSJzIiBuYW1lPSJwcm9wZXJ0eV9uYW1lIiBkaXJlY3Rpb249ImluIi8+CisgICAgICAgIDxhcmcgdHlwZT0idiIgbmFtZT0idmFsdWUiIGRpcmVjdGlvbj0ib3V0Ii8+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPCEtLQorICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VkOgorICAgICAgICAgIEBpbnRlcmZhY2VfbmFtZTogTmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZWQgb24uCisgICAgICAgICAgQGNoYW5nZWRfcHJvcGVydGllczogTWFwIG9mIHByb3BlcnR5IG5hbWUgdG8gdXBkYXRlZCB2YWx1ZSBmb3IgdGhlCisgICAgICAgICAgICBjaGFuZ2VkIHByb3BlcnRpZXMuCisgICAgICAgICAgQGludmFsaWRhdGVkX3Byb3BlcnRpZXM6IExpc3Qgb2YgbmFtZXMgb2Ygb3RoZXIgcHJvcGVydGllcyB3aGljaCBoYXZlCisgICAgICAgICAgICBjaGFuZ2VkLCBidXQgd2hvc2UgdXBkYXRlZCB2YWx1ZXMgYXJlIG5vdCBub3RpZmllZC4KKworICAgICAgICAgIEVtaXR0ZWQgd2hlbiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSB2YWx1ZXMgb24gQGludGVyZmFjZV9uYW1lLgorICAgICAgICAgIEEgcHJvcGVydHkgbWF5IGJlIGxpc3RlZCBpbiBAY2hhbmdlZF9wcm9wZXJ0aWVzIG9yCisgICAgICAgICAgQGludmFsaWRhdGVkX3Byb3BlcnRpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlcnZpY2Ugd2FudHMgdG8KKyAgICAgICAgICBicm9hZGNhc3QgdGhlIHByb3BlcnR54oCZcyBuZXcgdmFsdWUuIElmIGEgdmFsdWUgaXMgbGFyZ2Ugb3IgaW5mcmVxdWVudGx5CisgICAgICAgICAgdXNlZCwgdGhlIHNlcnZpY2UgbWlnaHQgbm90IHdhbnQgdG8gYnJvYWRjYXN0IGl0LCBhbmQgd2lsbCB3YWl0IGZvcgorICAgICAgICAgIGNsaWVudHMgdG8gcmVxdWVzdCBpdCBpbnN0ZWFkLgorICAgICAgLS0+CisgICAgICA8c2lnbmFsIG5hbWU9IlByb3BlcnRpZXNDaGFuZ2VkIj4KKyAgICAgICAgPGFyZyB0eXBlPSJzIiBuYW1lPSJpbnRlcmZhY2VfbmFtZSIvPgorICAgICAgICA8YXJnIHR5cGU9ImF7c3Z9IiBuYW1lPSJjaGFuZ2VkX3Byb3BlcnRpZXMiLz4KKyAgICAgICAgPGFyZyB0eXBlPSJhcyIgbmFtZT0iaW52YWxpZGF0ZWRfcHJvcGVydGllcyIvPgorICAgICAgPC9zaWduYWw+CisgICAgPC9pbnRlcmZhY2U+CisKK1tjb21tZW50XQorICBGSVhNRTogVGhpcyBpcyBvbmx5IHByZXNlbnQgdG8gZml4CisgICRsaW5rWz4+aHR0cHM6Ly9naXRodWIuY29tL3Byb2plY3RtYWxsYXJkL21hbGxhcmQtZHVja3R5cGUvaXNzdWVzLzJdLgorCis9PT0gWE1MIEFubm90YXRpb25zCisKK0RvY3VtZW50YXRpb24gY2FuIGFsc28gYmUgYWRkZWQgYXMgYW5ub3RhdGlvbiBlbGVtZW50cyBpbiB0aGUgWE1MLiBUaGlzIGZvcm1hdAoraXMgYWxzbyBzdXBwb3J0ZWQgYnkgJGNtZChnZGJ1cy1jb2RlZ2VuKSwgYnV0IGd0ay1kb2MgY29tbWVudHMgYXJlIHByZWZlcnJlZC4KK0ZvciBleGFtcGxlOgorCitbbGlzdGluZ10KKyAgW3RpdGxlXQorICAgIERvY3VtZW50YXRpb24gQW5ub3RhdGlvbnMgaW4gRC1CdXMgSW50ZXJmYWNlIFhNTAorICBbZGVzY10KKyAgICBFeGFtcGxlIEdEQnVzIGRvY3VtZW50YXRpb24gYW5ub3RhdGlvbnMgaW4gdGhlIGludHJvc3BlY3Rpb24gWE1MIGZvcgorICAgIHRoZSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzKSBpbnRlcmZhY2UuCisgIFtjb2RlIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPGludGVyZmFjZSBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIj4KKyAgICAgIDxhbm5vdGF0aW9uIG5hbWU9Im9yZy5ndGsuR0RCdXMuRG9jU3RyaW5nIiB2YWx1ZT0iSW50ZXJmYWNlIGZvciBhbGwKKyAgICAgICAgb2JqZWN0cyB3aGljaCBleHBvc2UgcHJvcGVydGllcyBvbiB0aGUgYnVzLCBhbGxvd2luZyB0aG9zZSBwcm9wZXJ0aWVzIHRvCisgICAgICAgIGJlIGdvdCwgc2V0LCBhbmQgc2lnbmFscyBlbWl0dGVkIHRvIG5vdGlmeSBvZiBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0eQorICAgICAgICB2YWx1ZXMuIi8+CisgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZy5TaG9ydCIKKyAgICAgICAgdmFsdWU9IlN0YW5kYXJkIHByb3BlcnR5IGdldHRlci9zZXR0ZXIgaW50ZXJmYWNlIi8+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iR2V0Ij4KKyAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciIHZhbHVlPSJSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mCisgICAgICAgICAgdGhlIHByb3BlcnR5IGF0IEBwcm9wZXJ0eV9uYW1lIG9uIEBpbnRlcmZhY2VfbmFtZSBvbiB0aGlzIG9iamVjdC4gSWYKKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWUgaXMgYW4gZW1wdHkgc3RyaW5nLCBhbGwgaW50ZXJmYWNlcyB3aWxsIGJlIHNlYXJjaGVkCisgICAgICAgICAgZm9yIEBwcm9wZXJ0eV9uYW1lOyBpZiBtdWx0aXBsZSBwcm9wZXJ0aWVzIG1hdGNoLCB0aGUgcmVzdWx0IGlzCisgICAgICAgICAgdW5kZWZpbmVkLgorCisgICAgICAgICAgSWYgQGludGVyZmFjZV9uYW1lIG9yIEBwcm9wZXJ0eV9uYW1lIGRvIG5vdCBleGlzdCwgYQorICAgICAgICAgICNvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbnZhbGlkQXJncyBlcnJvciBpcyByZXR1cm5lZC4iLz4KKworICAgICAgICA8YXJnIHR5cGU9InMiIG5hbWU9ImludGVyZmFjZV9uYW1lIiBkaXJlY3Rpb249ImluIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJOYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhlIHByb3BlcnR5IGlzIGRlZmluZWQgb24uIi8+CisgICAgICAgIDwvYXJnPgorCisgICAgICAgIDxhcmcgdHlwZT0icyIgbmFtZT0icHJvcGVydHlfbmFtZSIgZGlyZWN0aW9uPSJpbiI+CisgICAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciCisgICAgICAgICAgICB2YWx1ZT0iTmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LiIvPgorICAgICAgICA8L2FyZz4KKworICAgICAgICA8YXJnIHR5cGU9InYiIG5hbWU9InZhbHVlIiBkaXJlY3Rpb249Im91dCI+CisgICAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciCisgICAgICAgICAgICB2YWx1ZT0iUHJvcGVydHkgdmFsdWUsIHdyYXBwZWQgaW4gYSB2YXJpYW50LiIvPgorICAgICAgICA8L2FyZz4KKyAgICAgIDwvbWV0aG9kPgorCisgICAgICA8c2lnbmFsIG5hbWU9IlByb3BlcnRpZXNDaGFuZ2VkIj4KKyAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciIHZhbHVlPSJFbWl0dGVkIHdoZW4gb25lIG9yCisgICAgICAgICAgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSB2YWx1ZXMgb24gQGludGVyZmFjZV9uYW1lLiBBIHByb3BlcnR5IG1heSBiZQorICAgICAgICAgIGxpc3RlZCBpbiBAY2hhbmdlZF9wcm9wZXJ0aWVzIG9yIEBpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzIGRlcGVuZGluZyBvbgorICAgICAgICAgIHdoZXRoZXIgdGhlIHNlcnZpY2Ugd2FudHMgdG8gYnJvYWRjYXN0IHRoZSBwcm9wZXJ0eeKAmXMgbmV3IHZhbHVlLiBJZiBhCisgICAgICAgICAgdmFsdWUgaXMgbGFyZ2Ugb3IgaW5mcmVxdWVudGx5IHVzZWQsIHRoZSBzZXJ2aWNlIG1pZ2h0IG5vdCB3YW50IHRvCisgICAgICAgICAgYnJvYWRjYXN0IGl0LCBhbmQgd2lsbCB3YWl0IGZvciBjbGllbnRzIHRvIHJlcXVlc3QgaXQgaW5zdGVhZC4iLz4KKworICAgICAgICA8YXJnIHR5cGU9InMiIG5hbWU9ImludGVyZmFjZV9uYW1lIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJOYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhlIHByb3BlcnRpZXMgY2hhbmdlZCBvbi4iLz4KKyAgICAgICAgPC9hcmc+CisKKyAgICAgICAgPGFyZyB0eXBlPSJhe3N2fSIgbmFtZT0iY2hhbmdlZF9wcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJNYXAgb2YgcHJvcGVydHkgbmFtZSB0byB1cGRhdGVkIHZhbHVlIGZvciB0aGUgY2hhbmdlZAorICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiIvPgorICAgICAgICA8L2FyZz4KKworICAgICAgICA8YXJnIHR5cGU9ImFzIiBuYW1lPSJpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJMaXN0IG9mIG5hbWVzIG9mIG90aGVyIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBidXQKKyAgICAgICAgICAgICAgd2hvc2UgdXBkYXRlZCB2YWx1ZXMgYXJlIG5vdCBub3RpZmllZC4iLz4KKyAgICAgICAgPC9hcmc+CisgICAgICA8L3NpZ25hbD4KKyAgICA8L2ludGVyZmFjZT4KKworW2NvbW1lbnRdCisgIEZJWE1FOiBUaGlzIGlzIG9ubHkgcHJlc2VudCB0byBmaXgKKyAgJGxpbmtbPj5odHRwczovL2dpdGh1Yi5jb20vcHJvamVjdG1hbGxhcmQvbWFsbGFyZC1kdWNrdHlwZS9pc3N1ZXMvMl0uCisKKz09IFNlcnZpY2UgZmlsZXMKKyAgIFtpZD0ic2VydmljZS1maWxlcyJdCisKK0VhY2ggRC1CdXMgc2VydmljZSBtdXN0IGluc3RhbGwgYSAkZmlsZSguc2VydmljZSkgZmlsZSBkZXNjcmliaW5nIGl0cyBzZXJ2aWNlCituYW1lIGFuZCB0aGUgY29tbWFuZCB0byBydW4gdG8gc3RhcnQgdGhlIHNlcnZpY2UuIFRoaXMgYWxsb3dzIGZvciBzZXJ2aWNlCithY3RpdmF0aW9uIChzZWUgdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXNdKEQtQnVzCitzcGVjaWZpY2F0aW9uKSkuCisKK1NlcnZpY2UgZmlsZXMgbXVzdCBiZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZeKAmXMgd2VsbC1rbm93biBuYW1lLCBmb3IgZXhhbXBsZQorZmlsZSAkZmlsZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxLnNlcnZpY2UpIGZvciB3ZWxsLWtub3duIG5hbWUKKyRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEpLiBGaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBpbgorJGZpbGUoJHZhcigkJChkYXRhZGlyJCkpL2RidXMtMS9zZXJ2aWNlcykgZm9yIHRoZSBzZXNzaW9uIGJ1cyBhbmQKKyRmaWxlKCR2YXIoJCQoZGF0YWRpciQpKS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzKSBmb3IgdGhlIHN5c3RlbSBidXMuIE5vdGUsIGhvd2V2ZXIsCit0aGF0IHNlcnZpY2VzIG9uIHRoZSBzeXN0ZW0gYnVzIGFsbW9zdCBhbHdheXMgbmVlZCBhCiskbGlua1s+I3NlY3VyaXR5LXBvbGljaWVzXShzZWN1cml0eSBwb2xpY3kpIGFzIHdlbGwuCisKKz09IFNlY3VyaXR5IFBvbGljaWVzCisgICBbaWQ9InNlY3VyaXR5LXBvbGljaWVzIl0KKworQXQgYSBoaWdoIGxldmVsLCB0aGUgRC1CdXMgc2VjdXJpdHkgbW9kZWwgaXM6CitbbGlzdF0KKyogVGhlcmUgaXMgYSBzeXN0ZW0gYnVzLCBhbmQgemVybyBvciBtb3JlIHNlc3Npb24gYnVzZXMuCisqIEFueSBwcm9jZXNzIG1heSBjb25uZWN0IHRvIHRoZSBzeXN0ZW0gYnVzLiBUaGUgc3lzdGVtIGJ1cyBsaW1pdHMgd2hpY2ggY2FuIG93bgorICBuYW1lcyBvciBzZW5kIG1ldGhvZCBjYWxscywgYW5kIG9ubHkgcHJvY2Vzc2VzIHJ1bm5pbmcgYXMgcHJpdmlsZWdlZCB1c2VycyBjYW4KKyAgcmVjZWl2ZSB1bmljYXN0IG1lc3NhZ2VzIG5vdCBhZGRyZXNzZWQgdG8gdGhlbS4gRXZlcnkgcHJvY2VzcyBtYXkgcmVjZWl2ZQorICBicm9hZGNhc3RzLgorKiBFYWNoIHNlc3Npb24gYnVzIGhhcyBhbiBvd25lciAoYSB1c2VyKS4gT25seSBpdHMgb3duZXIgbWF5IGNvbm5lY3Q7IG9uCisgIGdlbmVyYWwtcHVycG9zZSBMaW51eCwgYSBzZXNzaW9uIGJ1cyBpcyBub3QgdHJlYXRlZCBhcyBhIHByaXZpbGVnZSBib3VuZGFyeSwKKyAgc28gdGhlcmUgaXMgbm8gZnVydGhlciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcyBvbiBpdC4KKworRnVsbCBjb3ZlcmFnZSBvZiBzZWN1cmluZyBELUJ1cyBzZXJ2aWNlcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZ3VpZGUsCitob3dldmVyIHRoZXJlIGFyZSBzb21lIHN0ZXBzIHdoaWNoIHlvdSBjYW4gdGFrZSB3aGVuIGRlc2lnbmluZyBhbiBBUEkgdG8gZWFzZQorc2VjdXJpdHkgcG9saWN5IGltcGxlbWVudGF0aW9uLgorCitELUJ1cyBzZWN1cml0eSBwb2xpY2llcyBhcmUgd3JpdHRlbiBhcyBYTUwgZmlsZXMgaW4KKyRmaWxlKCR2YXIoJCQoc3lzY29uZmRpciQpL2RidXMtMS9zeXN0ZW0uZCkpIGFuZAorJGZpbGUoJHZhcigkJChzeXNjb25mZGlyJCkvZGJ1cy0xL3Nlc3Npb24uZCkpIGFuZCB1c2UgYW4gYWxsb3cvZGVueSBtb2RlbCwgd2hlcmUKK2VhY2ggbWVzc2FnZSAobWV0aG9kIGNhbGwsIHNpZ25hbCBlbWlzc2lvbiwgZXRjLikgY2FuIGJlIGFsbG93ZWQgb3IgZGVuaWVkCithY2NvcmRpbmcgdG8gdGhlIHN1bSBvZiBhbGwgcG9saWN5IHJ1bGVzIHdoaWNoIG1hdGNoIGl0LiBFYWNoICRjb2RlKDxhbGxvdz4pIG9yCiskY29kZSg8ZGVueT4pIHJ1bGUgaW4gdGhlIHBvbGljeSBzaG91bGQgaGF2ZSB0aGUgJGNvZGUob3duKSwKKyRjb2RlKHNlbmRfZGVzdGluYXRpb24pIG9yICRjb2RlKHJlY2VpdmVfc2VuZGVyKSBhdHRyaWJ1dGUgc2V0LgorCitXaGVuIGRlc2lnbmluZyBhbiBBUEksIGJlYXIgaW4gbWluZCB0aGUgbmVlZCB0byB3cml0ZSBhbmQgaW5zdGFsbCBzdWNoIGEKK3NlY3VyaXR5IHBvbGljeSwgYW5kIGNvbnNpZGVyIHNwbGl0dGluZyB1cCBtZXRob2RzIG9yIHByb3ZpZGluZyBtb3JlIHJlc3RyaWN0ZWQKK3ZlcnNpb25zIHdoaWNoIGFjY2VwdCBjb25zdHJhaW5lZCBwYXJhbWV0ZXJzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGV4cG9zZWQgd2l0aAorbGVzcyByZXN0cmljdGl2ZSBzZWN1cml0eSBwb2xpY2llcyBpZiBuZWVkZWQgYnkgbGVzcyB0cnVzdGVkIGNsaWVudHMuCisKK1NlY29uZGx5LCB0aGUgZGVmYXVsdCBELUJ1cyBzZWN1cml0eSBwb2xpY3kgZm9yIHRoZSBzeXN0ZW0gYnVzIGlzIHJlc3RyaWN0aXZlCitlbm91Z2ggdG8gYWxsb3cgc2Vuc2l0aXZlIGRhdGEsIHN1Y2ggYXMgcGFzc3dvcmRzLCB0byBiZSBzYWZlbHkgc2VudCBvdmVyIHRoZQorYnVzIGluIHVuaWNhc3QgbWVzc2FnZXMgKGluY2x1ZGluZyB1bmljYXN0IHNpZ25hbHMpOyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvCitjb21wbGljYXRlIEFQSXMgYnkgaW1wbGVtZW50aW5nIGV4dHJhIHNlY3VyaXR5LiBOb3RlLCBob3dldmVyLCB0aGF0IHNlbnNpdGl2ZQorZGF0YSBtdXN0ICRlbShub3QpIGJlIHNlbnQgaW4gYnJvYWRjYXN0IHNpZ25hbHMsIGFzIHRoZXkgY2FuIGJlIHNlZW4gYnkgYWxsCitwZWVycyBvbiB0aGUgYnVzLiBUaGUgZGVmYXVsdCBwb2xpY3kgZm9yIHRoZSBzZXNzaW9uIGJ1cyBpcyBub3QgcmVzdHJpY3RpdmUsIGJ1dAoraXQgaXMgdHlwaWNhbGx5IG5vdCBhIHNlY3VyaXR5IGJvdW5kYXJ5LgorCis9PSBEZWJ1Z2dpbmcKKyAgIFtpZD0iZGVidWdnaW5nIl0KKworRGVidWdnaW5nIHNlcnZpY2VzIHJ1bm5pbmcgb24gRC1CdXMgY2FuIGJlIHRyaWNreSwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZQorbGF1bmNoZWQgdmlhIHNlcnZpY2UgYWN0aXZhdGlvbiBhbmQgaGVuY2UgaW4gYW4gZW52aXJvbm1lbnQgb3V0IG9mIHlvdXIgY29udHJvbC4KKworVGhyZWUgbWFpbiB0b29scyBhcmUgYXZhaWxhYmxlOiBELUJ1cyBNb25pdG9yLCBCdXN0bGUgYW5kIEQtRmVldC4KKworPT09IEQtQnVzIE1vbml0b3IKKyAgICBbaWQ9ImRidXMtbW9uaXRvciJdCisKKyRsaW5rWz4+aHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLW1vbml0b3IuMS5odG1sXSgkY21kKGRidXMtbW9uaXRvcikpCitpcyBhIGNvcmUgRC1CdXMgdG9vbCwgYW5kIGFsbG93cyBlYXZlc2Ryb3BwaW5nIG9uIHRoZSBzZXNzaW9uIG9yIHN5c3RlbSBidXMsCitwcmludGluZyBhbGwgbWVzc2FnZXMgaXQgc2Vlcy4gVGhlIG1lc3NhZ2VzIG1heSBiZSBmaWx0ZXJlZCB1c2luZyBhIHN0YW5kYXJkCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlc10oRC1CdXMKK21hdGNoIHJ1bGUpIHRvIG1ha2UgdGhlIHN0cmVhbSBtb3JlIG1hbmFnZWFibGUuCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIEQtQnVzIGhhdmUgcmVxdWlyZWQgdGhlIHNlY3VyaXR5IHBvbGljeSBmb3IgdGhlIHN5c3RlbSBidXMKK3RvIGJlIG1hbnVhbGx5IHJlbGF4ZWQgdG8gYWxsb3cgZWF2ZXNkcm9wcGluZyBvbiBhbGwgbWVzc2FnZXMuIFRoaXMgbWVhbnQgdGhhdAorZGVidWdnaW5nIGl0IHdhcyBkaWZmaWN1bHQgYW5kIGluc2VjdXJlLiBUaGUgbGF0ZXN0IHZlcnNpb25zIG9mIEQtQnVzIGFkZAorc3VwcG9ydCBmb3IgbW9uaXRvci1vbmx5IGNvbm5lY3Rpb25zIGZvciB0aGUgcm9vdCB1c2VyLCB3aGljaCBtZWFucyB0aGF0CiskY21kKGRidXMtbW9uaXRvcikgY2FuIGJlIHJ1biBhcyByb290IHRvIHBhaW5sZXNzbHkgbW9uaXRvciBhbGwgbWVzc2FnZXMgb24gdGhlCitzeXN0ZW0gYnVzIHdpdGhvdXQgbW9kaWZ5aW5nIGl0cyBzZWN1cml0eSBwb2xpY3kuCisKKz09PSBCdXN0bGUKKyAgICBbaWQ9ImJ1c3RsZSJdCisKKyRsaW5rWz4+aHR0cDovL3dpbGx0aG9tcHNvbi5jby51ay9idXN0bGUvXShCdXN0bGUpIGlzIGEgZ3JhcGhpY2FsIHZlcnNpb24gb2YKKyRjbWQoZGJ1cy1tb25pdG9yKSwgd2l0aCBhIFVJIGZvY3VzZWQgb24gcHJvZmlsaW5nIEQtQnVzIHBlcmZvcm1hbmNlIGJ5IHBsb3R0aW5nCittZXNzYWdlcyBvbiBhIHRpbWVsaW5lLiBJdCBpcyBpZGVhbCBmb3IgZmluZGluZyBib3R0bGVuZWNrcyBpbiBJUEMgcGVyZm9ybWFuY2UKK2JldHdlZW4gYSBzZXJ2aWNlIGFuZCBjbGllbnQuCisKKz09PSBELUZlZXQKKyAgICBbaWQ9ImQtZmVldCJdCisKKyRsaW5rWz4+aHR0cHM6Ly93aWtpLmdub21lLm9yZy9BcHBzL0RGZWV0XShELUZlZXQpIGlzIGFuIGludHJvc3BlY3Rpb24gdG9vbCBmb3IKK0QtQnVzLCB3aGljaCBkaXNwbGF5cyBhbGwgcGVlcnMgb24gdGhlIGJ1cyBncmFwaGljYWxseSwgd2l0aCB0aGVpciBvYmplY3RzLAoraW50ZXJmYWNlcywgbWV0aG9kcywgc2lnbmFscyBhbmQgcHJvcGVydGllcyBsaXN0ZWQgZm9yIGV4YW1pbmF0aW9uLiBJdCBpcyB1c2VmdWwKK2ZvciBkZWJ1Z2dpbmcgYWxsIGtpbmRzIG9mIGlzc3VlcyByZWxhdGVkIHRvIHByZXNlbmNlIG9mIHNlcnZpY2VzIG9uIHRoZSBidXMKK2FuZCB0aGUgb2JqZWN0cyB0aGV5IGV4cG9zZS4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbC5pbiBiL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk4MDgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sLmluCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC40L2RvY2Jvb2t4LmR0ZCI+Cis8cmVmZW50cnkgaWQ9J2RidXNjbGVhbnVwc29ja2V0czEnPgorCis8IS0tICBkYnVzJmJzb2w7LWNsZWFudXAmYnNvbDstc29ja2V0cyBtYW51YWwgcGFnZS4KKyBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLWNsZWFudXAtc29ja2V0czwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLWNsZWFudXAtc29ja2V0czwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPmNsZWFuIHVwIGxlZnRvdmVyIHNvY2tldHMgaW4gYSBkaXJlY3Rvcnk8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1jbGVhbnVwLXNvY2tldHM8L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT5ESVJFQ1RPUlk8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLWNsZWFudXAtc29ja2V0czwvY29tbWFuZD4gY29tbWFuZCBjbGVhbnMgdXAgdW51c2VkIEQtQnVzCitjb25uZWN0aW9uIHNvY2tldHMuIFNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IKK21vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpZyBwaWN0dXJlLjwvcGFyYT4KKworCis8cGFyYT5JZiBnaXZlbiBubyBhcmd1bWVudHMsIDxjb21tYW5kPmRidXMtY2xlYW51cC1zb2NrZXRzPC9jb21tYW5kPiBjbGVhbnMgdXAgc29ja2V0cworaW4gdGhlIHN0YW5kYXJkIGRlZmF1bHQgc29ja2V0IGRpcmVjdG9yeSBmb3IgdGhlCitwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzOyB0aGlzIGlzIHVzdWFsbHkgL3RtcC4KK09wdGlvbmFsbHksIHlvdSBjYW4gcGFzcyBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgb24gdGhlIGNvbW1hbmQgbGluZS48L3BhcmE+CisKKworPHBhcmE+T24gTGludXgsIHRoaXMgcHJvZ3JhbSBpcyBlc3NlbnRpYWxseSB1c2VsZXNzLCBiZWNhdXNlIEQtQnVzIGRlZmF1bHRzCit0byB1c2luZyAiYWJzdHJhY3Qgc29ja2V0cyIgdGhhdCBleGlzdCBvbmx5IGluIG1lbW9yeSBhbmQgZG9uJ3QgaGF2ZSBhCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gL3RtcC48L3BhcmE+CisKKworPHBhcmE+T24gbW9zdCBvdGhlciBmbGF2b3JzIG9mIFVOSVgsIGl0J3MgcG9zc2libGUgZm9yIHRoZSBzb2NrZXQgZmlsZXMgdG8KK2xlYWsgd2hlbiBwcm9ncmFtcyB1c2luZyBELUJ1cyBleGl0IGFibm9ybWFsbHkgb3Igd2l0aG91dCBjbG9zaW5nCit0aGVpciBELUJ1cyBjb25uZWN0aW9ucy4gVGh1cywgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gcnVuCitkYnVzLWNsZWFudXAtc29ja2V0cyBpbiBhIGNyb24gam9iIHRvIG1vcCB1cCBhbnkgbGVha2VkIHNvY2tldHMuCitPciB5b3UgY2FuIGp1c3QgaWdub3JlIHRoZSBsZWFrZWQgc29ja2V0cywgdGhleSBhcmVuJ3QgcmVhbGx5IGh1cnRpbmcKK2FueXRoaW5nLCBvdGhlciB0aGFuIGNsdXR0ZXJpbmcgdGhlIG91dHB1dCBvZiAibHMgL3RtcCI8L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtY2xlYW51cC1zb2NrZXRzIHdhcyBhZGFwdGVkIGJ5IEhhdm9jIFBlbm5pbmd0b24gZnJvbQorbGluYy1jbGVhbnVwLXNvY2tldHMgd3JpdHRlbiBieSBNaWNoYWVsIE1lZWtzLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4gYi9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2N2E5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLWRhZW1vbi4xLnhtbC5pbgpAQCAtMCwwICsxLDk5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0nZGJ1c2RhZW1vbjEnPgorCis8IS0tICBkYnVzJmJzb2w7LWRhZW1vbiBtYW51YWwgcGFnZS4KKyBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwOCBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtZGFlbW9uPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtZGFlbW9uPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+TWVzc2FnZSBidXMgZGFlbW9uPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorPCEtLSBib2R5IGJlZ2lucyBoZXJlIC0tPgorPHJlZnN5bm9wc2lzZGl2IGlkPSdzeW5vcHNpcyc+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPjwvY21kc3lub3BzaXM+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXZlcnNpb24gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1zZXNzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tc3lzdGVtIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tY29uZmlnLWZpbGU9PHJlcGxhY2VhYmxlPkZJTEU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1wcmludC1hZGRyZXNzIDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49REVTQ1JJUFRPUjwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXByaW50LXBpZCA8L2FyZz48YXJnIGNob2ljZT0nb3B0Jz48cmVwbGFjZWFibGU+PURFU0NSSVBUT1I8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tZm9yayA8L2FyZz4KKyAgICA8c2JyLz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCisKKzxyZWZzZWN0MSBpZD0nZGVzY3JpcHRpb24nPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT48Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD4gaXMgdGhlIEQtQnVzIG1lc3NhZ2UgYnVzIGRhZW1vbi4gU2VlCis8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAordGhlIGJpZyBwaWN0dXJlLiBELUJ1cyBpcyBmaXJzdCBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBvbmUtdG8tb25lCitjb21tdW5pY2F0aW9uIGJldHdlZW4gYW55IHR3byBhcHBsaWNhdGlvbnM7IDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyBhbgorYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgbGlicmFyeSB0byBpbXBsZW1lbnQgYSBtZXNzYWdlIGJ1cworZGFlbW9uLiBNdWx0aXBsZSBwcm9ncmFtcyBjb25uZWN0IHRvIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gYW5kIGNhbgorZXhjaGFuZ2UgbWVzc2FnZXMgd2l0aCBvbmUgYW5vdGhlci48L3BhcmE+CisKKzxwYXJhPlRoZXJlIGFyZSB0d28gc3RhbmRhcmQgbWVzc2FnZSBidXMgaW5zdGFuY2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBpbml0IHNlcnZpY2UpIGFuZCB0aGUKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KKzxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB1c2VkIGZvciBib3RoIG9mIHRoZXNlIGluc3RhbmNlcywgYnV0IHdpdGgKK2EgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gZmlsZS48L3BhcmE+CisKKzxwYXJhPlRoZSAtLXNlc3Npb24gb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyItLWNvbmZpZy1maWxlPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc2Vzc2lvbi5jb25mIiBhbmQgdGhlIC0tc3lzdGVtCitvcHRpb24gaXMgZXF1aXZhbGVudCB0bworIi0tY29uZmlnLWZpbGU9QEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZiIuIEJ5IGNyZWF0aW5nCithZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHVzaW5nIHRoZSAtLWNvbmZpZy1maWxlIG9wdGlvbiwKK2FkZGl0aW9uYWwgc3BlY2lhbC1wdXJwb3NlIG1lc3NhZ2UgYnVzIGRhZW1vbnMgY291bGQgYmUgY3JlYXRlZC48L3BhcmE+CisKKzxwYXJhPlRoZSBzeXN0ZW13aWRlIGRhZW1vbiBpcyBub3JtYWxseSBsYXVuY2hlZCBieSBhbiBpbml0IHNjcmlwdCwKK3N0YW5kYXJkbHkgY2FsbGVkIHNpbXBseSAibWVzc2FnZWJ1cyIuPC9wYXJhPgorCis8cGFyYT5UaGUgc3lzdGVtd2lkZSBkYWVtb24gaXMgbGFyZ2VseSB1c2VkIGZvciBicm9hZGNhc3Rpbmcgc3lzdGVtIGV2ZW50cywKK3N1Y2ggYXMgY2hhbmdlcyB0byB0aGUgcHJpbnRlciBxdWV1ZSwgb3IgYWRkaW5nL3JlbW92aW5nIGRldmljZXMuPC9wYXJhPgorCis8cGFyYT5UaGUgcGVyLXNlc3Npb24gZGFlbW9uIGlzIHVzZWQgZm9yIHZhcmlvdXMgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24KK2Ftb25nIGRlc2t0b3AgYXBwbGljYXRpb25zIChob3dldmVyLCBpdCBpcyBub3QgdGllZCB0byBYIG9yIHRoZSBHVUkKK2luIGFueSB3YXkpLjwvcGFyYT4KKworPHBhcmE+U0lHSFVQIHdpbGwgY2F1c2UgdGhlIEQtQnVzIGRhZW1vbiB0byBQQVJUSUFMTFkgcmVsb2FkIGl0cworY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0byBmbHVzaCBpdHMgdXNlci9ncm91cCBpbmZvcm1hdGlvbiBjYWNoZXMuIFNvbWUKK2NvbmZpZ3VyYXRpb24gY2hhbmdlcyB3b3VsZCByZXF1aXJlIGtpY2tpbmcgYWxsIGFwcHMgb2ZmIHRoZSBidXM7IHNvIHRoZXkgd2lsbAorb25seSB0YWtlIGVmZmVjdCBpZiB5b3UgcmVzdGFydCB0aGUgZGFlbW9uLiBQb2xpY3kgY2hhbmdlcyBzaG91bGQgdGFrZSBlZmZlY3QKK3dpdGggU0lHSFVQLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdvcHRpb25zJz48dGl0bGU+T1BUSU9OUzwvdGl0bGU+Cis8cGFyYT5UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDo8L3BhcmE+Cis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1jb25maWctZmlsZT1GSUxFPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Vc2UgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZS48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZm9yazwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+Rm9yY2UgdGhlIG1lc3NhZ2UgYnVzIHRvIGZvcmsgYW5kIGJlY29tZSBhIGRhZW1vbiwgZXZlbiBpZgordGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCBzcGVjaWZ5IHRoYXQgaXQgc2hvdWxkLgorSW4gbW9zdCBjb250ZXh0cyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFscmVhZHkgZ2V0cyB0aGlzCityaWdodCwgdGhvdWdoLiBUaGlzIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLW5vZm9yazwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorICAgIDxwYXJhPkZvcmNlIHRoZSBtZXNzYWdlIGJ1cyBub3QgdG8gZm9yayBhbmQgYmVjb21lIGEgZGFlbW9uLCBldmVuIGlmCisgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHNwZWNpZmllcyB0aGF0IGl0IHNob3VsZC4gT24gV2luZG93cywKKyAgICAgIHRoZSBkYnVzLWRhZW1vbiBuZXZlciBmb3Jrcywgc28gdGhpcyBvcHRpb24gaXMgYWxsb3dlZCBidXQgZG9lcworICAgICAgbm90aGluZy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtYWRkcmVzc1s9REVTQ1JJUFRPUl08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSBhZGRyZXNzIG9mIHRoZSBtZXNzYWdlIGJ1cyB0byBzdGFuZGFyZCBvdXRwdXQsIG9yCit0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWQgYnkgcHJvZ3JhbXMgdGhhdAorbGF1bmNoIHRoZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtcGlkWz1ERVNDUklQVE9SXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0CitsYXVuY2ggdGhlIG1lc3NhZ2UgYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zZXNzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Vc2UgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UKK2J1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc3lzdGVtPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Vc2UgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSBkYWVtb24uPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWludHJvc3BlY3Q8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSBpbnRyb3NwZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgRC1CdXMgaW50ZXJuYWwgaW50ZXJmYWNlcy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYWRkcmVzc1s9QUREUkVTU108L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNldCB0aGUgYWRkcmVzcyB0byBsaXN0ZW4gb24uIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgYWRkcmVzcworY29uZmlndXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW1kLWFjdGl2YXRpb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkVuYWJsZSBzeXN0ZW1kLXN0eWxlIHNlcnZpY2UgYWN0aXZhdGlvbi4gT25seSB1c2VmdWwgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIHN5c3RlbWQgc3lzdGVtIGFuZCBzZXNzaW9uIG1hbmFnZXIgb24gTGludXguPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLW5vcGlkZmlsZTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+RG9uJ3Qgd3JpdGUgYSBQSUQgZmlsZSBldmVuIGlmIG9uZSBpcyBjb25maWd1cmVkIGluIHRoZSBjb25maWd1cmF0aW9uCitmaWxlcy48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nY29uZmlndXJhdGlvbl9maWxlJz48dGl0bGU+Q09ORklHVVJBVElPTiBGSUxFPC90aXRsZT4KKzxwYXJhPkEgbWVzc2FnZSBidXMgZGFlbW9uIGhhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHNwZWNpYWxpemVzIGl0Citmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgb25lIGNvbmZpZ3VyYXRpb24KK2ZpbGUgbWlnaHQgc2V0IHVwIHRoZSBtZXNzYWdlIGJ1cyB0byBiZSBhIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMsCit3aGlsZSBhbm90aGVyIG1pZ2h0IHNldCBpdCB1cCB0byBiZSBhIHBlci11c2VyLWxvZ2luLXNlc3Npb24gYnVzLjwvcGFyYT4KKworPHBhcmE+VGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbHNvIGVzdGFibGlzaGVzIHJlc291cmNlIGxpbWl0cywgc2VjdXJpdHkKK3BhcmFtZXRlcnMsIGFuZCBzbyBmb3J0aC48L3BhcmE+CisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHBhcnQgb2YgYW55IGludGVyb3BlcmFiaWxpdHkKK3NwZWNpZmljYXRpb24gYW5kIGl0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkOyB0aGlzCitkb2N1bWVudCBpcyBkb2N1bWVudGF0aW9uLCBub3Qgc3BlY2lmaWNhdGlvbi48L3BhcmE+CisKKzxwYXJhPlRoZSBzdGFuZGFyZCBzeXN0ZW13aWRlIGFuZCBwZXItc2Vzc2lvbiBtZXNzYWdlIGJ1cyBzZXR1cHMgYXJlCitjb25maWd1cmVkIGluIHRoZSBmaWxlcyAiQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZiIgYW5kCisiQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYiLiAgVGhlc2UgZmlsZXMgbm9ybWFsbHkKKyZsdDtpbmNsdWRlJmd0OyBhIHN5c3RlbS1sb2NhbC5jb25mIG9yIHNlc3Npb24tbG9jYWwuY29uZiBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMTsgeW91IGNhbiBwdXQgbG9jYWwKK292ZXJyaWRlcyBpbiB0aG9zZSBmaWxlcyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbgorZmlsZXMuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgYW4gWE1MIGRvY3VtZW50LiBJdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZworZG9jdHlwZSBkZWNsYXJhdGlvbjo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworICAgJmx0OyFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAgICAiPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQnPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkPC91bGluaz4iJmd0OworCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSBmb2xsb3dpbmcgZWxlbWVudHMgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7YnVzY29uZmlnJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPlJvb3QgZWxlbWVudC48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7dHlwZSZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cy4gQ3VycmVudGx5IGtub3duIHZhbHVlcyBhcmUKKyJzeXN0ZW0iIGFuZCAic2Vzc2lvbiI7IGlmIG90aGVyIHZhbHVlcyBhcmUgc2V0LCB0aGV5IHNob3VsZCBiZQorZWl0aGVyIGFkZGVkIHRvIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLCBvciBuYW1lc3BhY2VkLiAgVGhlIGxhc3QKKyZsdDt0eXBlJmd0OyBlbGVtZW50ICJ3aW5zIiAocHJldmlvdXMgdmFsdWVzIGFyZSBpZ25vcmVkKS4gVGhpcyBlbGVtZW50Citvbmx5IGNvbnRyb2xzIHdoaWNoIG1lc3NhZ2UgYnVzIHNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUKK3NldCBpbiBhY3RpdmF0ZWQgY2xpZW50cy4gIE1vc3Qgb2YgdGhlIHBvbGljeSB0aGF0IGRpc3Rpbmd1aXNoZXMgYQorc2Vzc2lvbiBidXMgZnJvbSB0aGUgc3lzdGVtIGJ1cyBpcyBjb250cm9sbGVkIGZyb20gdGhlIG90aGVyIGVsZW1lbnRzCitpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLjwvcGFyYT4KKworCis8cGFyYT5JZiB0aGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cyBpcyAic2Vzc2lvbiIsIHRoZW4gdGhlCitEQlVTX1NUQVJURVJfQlVTX1RZUEUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gInNlc3Npb24iCithbmQgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNldAordG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlc3Npb24gYnVzLiAgTGlrZXdpc2UsIGlmIHRoZSB0eXBlIG9mIHRoZQorbWVzc2FnZSBidXMgaXMgInN5c3RlbSIsIHRoZW4gdGhlIERCVVNfU1RBUlRFUl9CVVNfVFlQRSBlbnZpcm9ubWVudAordmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gInN5c3RlbSIgYW5kIHRoZSBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKK2Vudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gYnVzCisod2hpY2ggaXMgbm9ybWFsbHkgd2VsbCBrbm93biBhbnl3YXkpLjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7dHlwZSZndDtzZXNzaW9uJmx0Oy90eXBlJmd0OzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtpbmNsdWRlJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPkluY2x1ZGUgYSBmaWxlICZsdDtpbmNsdWRlJmd0O2ZpbGVuYW1lLmNvbmYmbHQ7L2luY2x1ZGUmZ3Q7IGF0IHRoaXMgcG9pbnQuICBJZiB0aGUKK2ZpbGVuYW1lIGlzIHJlbGF0aXZlLCBpdCBpcyBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKK2RvaW5nIHRoZSBpbmNsdWRpbmcuPC9wYXJhPgorCisKKzxwYXJhPiZsdDtpbmNsdWRlJmd0OyBoYXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlICJpZ25vcmVfbWlzc2luZz0oeWVzfG5vKSIKK3doaWNoIGRlZmF1bHRzIHRvICJubyIgaWYgbm90IHByb3ZpZGVkLiBUaGlzIGF0dHJpYnV0ZQorY29udHJvbHMgd2hldGhlciBpdCdzIGEgZmF0YWwgZXJyb3IgZm9yIHRoZSBpbmNsdWRlZCBmaWxlCit0byBiZSBhYnNlbnQuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2luY2x1ZGVkaXImZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SW5jbHVkZSBhbGwgZmlsZXMgaW4gJmx0O2luY2x1ZGVkaXImZ3Q7Zm9vLmQmbHQ7L2luY2x1ZGVkaXImZ3Q7IGF0IHRoaXMKK3BvaW50LiBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBpbmNsdWRlZCBpbiB1bmRlZmluZWQgb3JkZXIuCitPbmx5IGZpbGVzIGVuZGluZyBpbiAiLmNvbmYiIGFyZSBpbmNsdWRlZC48L3BhcmE+CisKKworPHBhcmE+VGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBleHRlbnNpb24gb2YgdGhlIHN5c3RlbSBidXMgYnkgcGFydGljdWxhcgorcGFja2FnZXMuIEZvciBleGFtcGxlLCBpZiBDVVBTIHdhbnRzIHRvIGJlIGFibGUgdG8gc2VuZCBvdXQKK25vdGlmaWNhdGlvbiBvZiBwcmludGVyIHF1ZXVlIGNoYW5nZXMsIGl0IGNvdWxkIGluc3RhbGwgYSBmaWxlIHRvCitARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL3N5c3RlbS5kIG9yCitARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3N5c3RlbS5kIHRoYXQgYWxsb3dlZCBhbGwgYXBwcyB0byByZWNlaXZlCit0aGlzIG1lc3NhZ2UgYW5kIGFsbG93ZWQgdGhlIHByaW50ZXIgZGFlbW9uIHVzZXIgdG8gc2VuZCBpdC48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7dXNlciZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgdXNlciBhY2NvdW50IHRoZSBkYWVtb24gc2hvdWxkIHJ1biBhcywgYXMgZWl0aGVyIGEgdXNlcm5hbWUgb3IgYQorVUlELiBJZiB0aGUgZGFlbW9uIGNhbm5vdCBjaGFuZ2UgdG8gdGhpcyBVSUQgb24gc3RhcnR1cCwgaXQgd2lsbCBleGl0LgorSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGUgZGFlbW9uIHdpbGwgbm90IGNoYW5nZSBvciBjYXJlCithYm91dCBpdHMgVUlELjwvcGFyYT4KKworCis8cGFyYT5UaGUgbGFzdCAmbHQ7dXNlciZndDsgZW50cnkgaW4gdGhlIGZpbGUgIndpbnMiLCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLjwvcGFyYT4KKworCis8cGFyYT5UaGUgdXNlciBpcyBjaGFuZ2VkIGFmdGVyIHRoZSBidXMgaGFzIGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbi4gIFNvCitzb2NrZXRzIGV0Yy4gd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSBjaGFuZ2luZyB1c2VyLCBidXQgbm8gZGF0YSB3aWxsIGJlCityZWFkIGZyb20gY2xpZW50cyBiZWZvcmUgY2hhbmdpbmcgdXNlci4gVGhpcyBtZWFucyB0aGF0IHNvY2tldHMKK2FuZCBQSUQgZmlsZXMgY2FuIGJlIGNyZWF0ZWQgaW4gYSBsb2NhdGlvbiB0aGF0IHJlcXVpcmVzIHJvb3QKK3ByaXZpbGVnZXMgZm9yIHdyaXRpbmcuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2ZvcmsmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SWYgcHJlc2VudCwgdGhlIGJ1cyBkYWVtb24gYmVjb21lcyBhIHJlYWwgZGFlbW9uIChmb3JrcworaW50byB0aGUgYmFja2dyb3VuZCwgZXRjLikuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQKK3JhdGhlciB0aGFuIHRoZSAtLWZvcmsgY29tbWFuZCBsaW5lIG9wdGlvbi48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7a2VlcF91bWFzayZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5JZiBwcmVzZW50LCB0aGUgYnVzIGRhZW1vbiBrZWVwcyBpdHMgb3JpZ2luYWwgdW1hc2sgd2hlbiBmb3JraW5nLgorVGhpcyBtYXkgYmUgdXNlZnVsIHRvIGF2b2lkIGFmZmVjdGluZyB0aGUgYmVoYXZpb3Igb2YgY2hpbGQgcHJvY2Vzc2VzLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtzeXNsb2cmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SWYgcHJlc2VudCwgdGhlIGJ1cyBkYWVtb24gd2lsbCBsb2cgdG8gc3lzbG9nLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtwaWRmaWxlJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPklmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIHdpbGwgd3JpdGUgaXRzIHBpZCB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCitUaGUgLS1ub3BpZGZpbGUgY29tbWFuZC1saW5lIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBzZXR0aW5nLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthbGxvd19hbm9ueW1vdXMmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SWYgcHJlc2VudCwgY29ubmVjdGlvbnMgdGhhdCBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBBTk9OWU1PVVMKK21lY2hhbmlzbSB3aWxsIGJlIGF1dGhvcml6ZWQgdG8gY29ubmVjdC4gVGhpcyBvcHRpb24gaGFzIG5vIHByYWN0aWNhbAorZWZmZWN0IHVubGVzcyB0aGUgQU5PTllNT1VTIG1lY2hhbmlzbSBoYXMgYWxzbyBiZWVuIGVuYWJsZWQgdXNpbmcgdGhlCis8ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthdXRoJmd0OzwvZW1waGFzaXM+IGVsZW1lbnQsIGRlc2NyaWJlZCBiZWxvdy48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7bGlzdGVuJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPkFkZCBhbiBhZGRyZXNzIHRoYXQgdGhlIGJ1cyBzaG91bGQgbGlzdGVuIG9uLiBUaGUKK2FkZHJlc3MgaXMgaW4gdGhlIHN0YW5kYXJkIEQtQnVzIGZvcm1hdCB0aGF0IGNvbnRhaW5zCithIHRyYW5zcG9ydCBuYW1lIHBsdXMgcG9zc2libGUgcGFyYW1ldGVycy9vcHRpb25zLjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3VuaXg6cGF0aD0vdG1wL2ZvbyZsdDsvbGlzdGVuJmd0OzwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3RjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQmbHQ7L2xpc3RlbiZndDs8L3BhcmE+CisKKworPHBhcmE+SWYgdGhlcmUgYXJlIG11bHRpcGxlICZsdDtsaXN0ZW4mZ3Q7IGVsZW1lbnRzLCB0aGVuIHRoZSBidXMgbGlzdGVucworb24gbXVsdGlwbGUgYWRkcmVzc2VzLiBUaGUgYnVzIHdpbGwgcGFzcyBpdHMgYWRkcmVzcyB0bworc3RhcnRlZCBzZXJ2aWNlcyBvciBvdGhlciBpbnRlcmVzdGVkIHBhcnRpZXMgd2l0aAordGhlIGxhc3QgYWRkcmVzcyBnaXZlbiBpbiAmbHQ7bGlzdGVuJmd0OyBmaXJzdC4gVGhhdCBpcywKK2FwcHMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgbGFzdCAmbHQ7bGlzdGVuJmd0OyBhZGRyZXNzIGZpcnN0LjwvcGFyYT4KKworCis8cGFyYT50Y3Agc29ja2V0cyBjYW4gYWNjZXB0IElQdjQgYWRkcmVzc2VzLCBJUHY2IGFkZHJlc3NlcyBvciBob3N0bmFtZXMuCitJZiBhIGhvc3RuYW1lIHJlc29sdmVzIHRvIG11bHRpcGxlIGFkZHJlc3NlcywgdGhlIHNlcnZlciB3aWxsIGJpbmQKK3RvIGFsbCBvZiB0aGVtLiBUaGUgZmFtaWx5PWlwdjQgb3IgZmFtaWx5PWlwdjYgb3B0aW9ucyBjYW4gYmUgdXNlZAordG8gZm9yY2UgaXQgdG8gYmluZCB0byBhIHN1YnNldCBvZiBhZGRyZXNzZXM8L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O2xpc3RlbiZndDt0Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0wLGZhbWlseT1pcHY0Jmx0Oy9saXN0ZW4mZ3Q7PC9wYXJhPgorCisKKzxwYXJhPkEgc3BlY2lhbCBjYXNlIGlzIHVzaW5nIGEgcG9ydCBudW1iZXIgb2YgemVybyAob3Igb21pdHRpbmcgdGhlIHBvcnQpLAord2hpY2ggbWVhbnMgdG8gY2hvb3NlIGFuIGF2YWlsYWJsZSBwb3J0IHNlbGVjdGVkIGJ5IHRoZSBvcGVyYXRpbmcKK3N5c3RlbS4gVGhlIHBvcnQgbnVtYmVyIGNob3NlbiBjYW4gYmUgb2J0YWluZWQgd2l0aCB0aGUKKy0tcHJpbnQtYWRkcmVzcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGFuZCB3aWxsIGJlIHByZXNlbnQgaW4gb3RoZXIKK2Nhc2VzIHdoZXJlIHRoZSBzZXJ2ZXIgcmVwb3J0cyBpdHMgb3duIGFkZHJlc3MsIHN1Y2ggYXMgd2hlbgorREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIHNldC48L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O2xpc3RlbiZndDt0Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0wJmx0Oy9saXN0ZW4mZ3Q7PC9wYXJhPgorCisKKzxwYXJhPnRjcC9ub25jZS10Y3AgYWRkcmVzc2VzIGFsc28gYWxsb3cgYSBiaW5kPWhvc3RuYW1lIG9wdGlvbiwKK3VzZWQgaW4gYSBsaXN0ZW5hYmxlIGFkZHJlc3MgdG8gY29uZmlndXJlIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2gKK3RoZSBzZXJ2ZXIgd2lsbCBsaXN0ZW46IGVpdGhlciB0aGUgaG9zdG5hbWUgaXMgdGhlIElQIGFkZHJlc3Mgb2YKK29uZSBvZiB0aGUgbG9jYWwgbWFjaGluZSdzIGludGVyZmFjZXMgKG1vc3QgY29tbW9ubHkgMTI3LjAuMC4xKSwKK2EgRE5TIG5hbWUgdGhhdCByZXNvbHZlcyB0byBvbmUgb2YgdGhvc2UgSVAgYWRkcmVzc2VzLCAnMC4wLjAuMCcKK3RvIGxpc3RlbiBvbiBhbGwgSVB2NCBpbnRlcmZhY2VzIHNpbXVsdGFuZW91c2x5LCBvciAnOjonCit0byBsaXN0ZW4gb24gYWxsIElQdjQgYW5kIElQdjYgaW50ZXJmYWNlcyBzaW11bHRhbmVvdXNseSAoaWYgc3VwcG9ydGVkCitieSB0aGUgT1MpLiAgSWYgbm90IHNwZWNpZmllZCwKK3RoZSBkZWZhdWx0IGlzIHRoZSBzYW1lIHZhbHVlIGFzICJob3N0Ii48L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O2xpc3RlbiZndDt0Y3A6aG9zdD1sb2NhbGhvc3QsYmluZD0wLjAuMC4wLHBvcnQ9MCZsdDsvbGlzdGVuJmd0OzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthdXRoJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPkxpc3RzIHBlcm1pdHRlZCBhdXRob3JpemF0aW9uIG1lY2hhbmlzbXMuIElmIHRoaXMgZWxlbWVudCBkb2Vzbid0CitleGlzdCwgdGhlbiBhbGwga25vd24gbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZQorJmx0O2F1dGgmZ3Q7IGVsZW1lbnRzLCBhbGwgdGhlIGxpc3RlZCBtZWNoYW5pc21zIGFyZSBhbGxvd2VkLiAgVGhlIG9yZGVyIGluCit3aGljaCBtZWNoYW5pc21zIGFyZSBsaXN0ZWQgaXMgbm90IG1lYW5pbmdmdWwuPC9wYXJhPgorCisKKzxwYXJhPkV4YW1wbGU6ICZsdDthdXRoJmd0O0VYVEVSTkFMJmx0Oy9hdXRoJmd0OzwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7YXV0aCZndDtEQlVTX0NPT0tJRV9TSEExJmx0Oy9hdXRoJmd0OzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtzZXJ2aWNlZGlyJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPkFkZHMgYSBkaXJlY3RvcnkgdG8gc2NhbiBmb3IgLnNlcnZpY2UgZmlsZXMuIERpcmVjdG9yaWVzIGFyZQorc2Nhbm5lZCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCB0byBhcHBlYXIgaW4gdGhlIGNvbmZpZyBmaWxlCisodGhlIGZpcnN0IC5zZXJ2aWNlIGZpbGUgZm91bmQgdGhhdCBwcm92aWRlcyBhIHBhcnRpY3VsYXIKK3NlcnZpY2Ugd2lsbCBiZSB1c2VkKS48L3BhcmE+CisKKworPHBhcmE+U2VydmljZSBmaWxlcyB0ZWxsIHRoZSBidXMgaG93IHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgYSBwcm9ncmFtLgorVGhleSBhcmUgcHJpbWFyaWx5IHVzZWQgd2l0aCB0aGUgcGVyLXVzZXItc2Vzc2lvbiBidXMsCitub3QgdGhlIHN5c3RlbXdpZGUgYnVzLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLyZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4mbHQ7c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8mZ3Q7IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhIHNlcmllcworb2YgJmx0O3NlcnZpY2VkaXIvJmd0OyBlbGVtZW50cyBmb3IgZWFjaCBvZiB0aGUgZGF0YSBkaXJlY3RvcmllcyBpbiB0aGUgIlhERworQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiIgd2l0aCB0aGUgc3ViZGlyZWN0b3J5ICJkYnVzLTEvc2VydmljZXMiLAorc28gZm9yIGV4YW1wbGUgIi91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiB3b3VsZCBiZSBhbW9uZyB0aGUKK2RpcmVjdG9yaWVzIHNlYXJjaGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGUgIlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uIiBjYW4gYmUgZm91bmQgYXQKKzx1bGluayB1cmw9J2h0dHA6Ly9mcmVlZGVza3RvcC5vcmcvd2lraS9TdGFuZGFyZHMvYmFzZWRpci1zcGVjJz5odHRwOi8vZnJlZWRlc2t0b3Aub3JnL3dpa2kvU3RhbmRhcmRzL2Jhc2VkaXItc3BlYzwvdWxpbms+IGlmIGl0IGhhc24ndCBtb3ZlZCwKK290aGVyd2lzZSB0cnkgeW91ciBmYXZvcml0ZSBzZWFyY2ggZW5naW5lLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OyBvcHRpb24gaXMgb25seSByZWxldmFudCB0byB0aGUKK3Blci11c2VyLXNlc3Npb24gYnVzIGRhZW1vbiBkZWZpbmVkIGluCitARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3Nlc3Npb24uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLyZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4mbHQ7c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLyZndDsgc3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBzeXN0ZW0td2lkZQorYWN0aXZhdGlvbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3Igc2VydmljZSBmaWxlcy4KK1RoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIEBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8mZ3Q7IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQorcGVyLXN5c3RlbSBidXMgZGFlbW9uIGRlZmluZWQgaW4KK0BFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLmNvbmYuIFB1dHRpbmcgaXQgaW4gYW55IG90aGVyCitjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcHJvYmFibHkgYmUgbm9uc2Vuc2UuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlcnZpY2VoZWxwZXIvJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPiZsdDtzZXJ2aWNlaGVscGVyLyZndDsgc3BlY2lmaWVzIHRoZSBzZXR1aWQgaGVscGVyIHRoYXQgaXMgdXNlZCB0byBsYXVuY2gKK3N5c3RlbSBkYWVtb25zIHdpdGggYW4gYWx0ZXJuYXRlIHVzZXIuIFR5cGljYWxseSB0aGlzIHNob3VsZCBiZQordGhlIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgZXhlY3V0YWJsZSBpbiBsb2NhdGVkIGluIGxpYmV4ZWMuPC9wYXJhPgorCisKKzxwYXJhPlRoZSAmbHQ7c2VydmljZWhlbHBlci8mZ3Q7IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBwZXItc3lzdGVtIGJ1cyBkYWVtb24KK2RlZmluZWQgaW4gQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7bGltaXQmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+Jmx0O2xpbWl0Jmd0OyBlc3RhYmxpc2hlcyBhIHJlc291cmNlIGxpbWl0LiBGb3IgZXhhbXBsZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgJmx0O2xpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiJmd0OzY0Jmx0Oy9saW1pdCZndDsKKyAgJmx0O2xpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiJmd0OzUxMiZsdDsvbGltaXQmZ3Q7Cis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSBuYW1lIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuCitBdmFpbGFibGUgbGltaXQgbmFtZXMgYXJlOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAgICAgIm1heF9pbmNvbWluZ19ieXRlcyIgICAgICAgICA6IHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBmcm9tIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfaW5jb21pbmdfdW5peF9mZHMiICAgICAgOiB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBmcm9tIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfb3V0Z29pbmdfYnl0ZXMiICAgICAgICAgOiB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkIHVwIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X291dGdvaW5nX3VuaXhfZmRzIiAgICAgIDogdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkIHVwIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X21lc3NhZ2Vfc2l6ZSIgICAgICAgICAgIDogbWF4IHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzCisgICAgICAibWF4X21lc3NhZ2VfdW5peF9mZHMiICAgICAgIDogbWF4IHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAgICAgICJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RhcnRlZCBzZXJ2aWNlIGhhcyB0byBjb25uZWN0CisgICAgICAiYXV0aF90aW1lb3V0IiAgICAgICAgICAgICAgIDogbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgZ2l2ZW4gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUKKyAgICAgICJwZW5kaW5nX2ZkX3RpbWVvdXQiICAgICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQgaXMgZ2l2ZW4gdG8gYmUgdHJhbnNtaXR0ZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzLWRhZW1vbiBiZWZvcmUgZGlzY29ubmVjdGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCisgICAgICAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIgIDogbWF4IG51bWJlciBvZiBhdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMiIDogbWF4IG51bWJlciBvZiB1bmF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgIm1heF9jb25uZWN0aW9uc19wZXJfdXNlciIgICA6IG1heCBudW1iZXIgb2YgY29tcGxldGVkIGNvbm5lY3Rpb25zIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSB1c2VyCisgICAgICAibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiIDogbWF4IG51bWJlciBvZiBzZXJ2aWNlIGxhdW5jaGVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgYXQgdGhlIHNhbWUgdGltZQorICAgICAgIm1heF9uYW1lc19wZXJfY29ubmVjdGlvbiIgICA6IG1heCBudW1iZXIgb2YgbmFtZXMgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGNhbiBvd24KKyAgICAgICJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iOiBtYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiIgOiBtYXggbnVtYmVyIG9mIHBlbmRpbmcgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGllcyBwZXIgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgY2FsbHMtaW4tcHJvZ3Jlc3MpCisgICAgICAicmVwbHlfdGltZW91dCIgICAgICAgICAgICAgIDogbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCBhIG1ldGhvZCBjYWxsIHRpbWVzIG91dAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgbWF4IGluY29taW5nL291dGdvaW5nIHF1ZXVlIHNpemVzIGFsbG93IGEgbmV3IG1lc3NhZ2UgdG8gYmUgcXVldWVkCitpZiBvbmUgYnl0ZSByZW1haW5zIGJlbG93IHRoZSBtYXguIFNvIHlvdSBjYW4gaW4gZmFjdCBleGNlZWQgdGhlIG1heAorYnkgbWF4X21lc3NhZ2Vfc2l6ZS48L3BhcmE+CisKKworPHBhcmE+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyBkaXZpZGVkIGJ5IG1heF9jb25uZWN0aW9uc19wZXJfdXNlciBpcyB0aGUKK251bWJlciBvZiB1c2VycyB0aGF0IGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGRlbmlhbC1vZi1zZXJ2aWNlIGFsbCBvdGhlciB1c2VycyBieSB1c2luZwordXAgYWxsIGNvbm5lY3Rpb25zIG9uIHRoZSBzeXN0ZW13aWRlIGJ1cy48L3BhcmE+CisKKworPHBhcmE+TGltaXRzIGFyZSBub3JtYWxseSBvbmx5IG9mIGludGVyZXN0IG9uIHRoZSBzeXN0ZW13aWRlIGJ1cywgbm90IHRoZSB1c2VyIHNlc3Npb24KK2J1c2VzLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtwb2xpY3kmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+VGhlICZsdDtwb2xpY3kmZ3Q7IGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHBvbGljeSB0byBiZSBhcHBsaWVkIHRvIGEgcGFydGljdWxhcgorc2V0IG9mIGNvbm5lY3Rpb25zIHRvIHRoZSBidXMuIEEgcG9saWN5IGlzIG1hZGUgdXAgb2YKKyZsdDthbGxvdyZndDsgYW5kICZsdDtkZW55Jmd0OyBlbGVtZW50cy4gUG9saWNpZXMgYXJlIG5vcm1hbGx5IHVzZWQgd2l0aCB0aGUgc3lzdGVtd2lkZSBidXM7Cit0aGV5IGFyZSBhbmFsb2dvdXMgdG8gYSBmaXJld2FsbCBpbiB0aGF0IHRoZXkgYWxsb3cgZXhwZWN0ZWQgdHJhZmZpYworYW5kIHByZXZlbnQgdW5leHBlY3RlZCB0cmFmZmljLjwvcGFyYT4KKworCis8cGFyYT5DdXJyZW50bHksIHRoZSBzeXN0ZW0gYnVzIGhhcyBhIGRlZmF1bHQtZGVueSBwb2xpY3kgZm9yIHNlbmRpbmcgbWV0aG9kIGNhbGxzCithbmQgb3duaW5nIGJ1cyBuYW1lcy4gIEV2ZXJ5dGhpbmcgZWxzZSwgaW4gcGFydGljdWxhciByZXBseSBtZXNzYWdlcywgcmVjZWl2ZQorY2hlY2tzLCBhbmQgc2lnbmFscyBoYXMgYSBkZWZhdWx0IGFsbG93IHBvbGljeS48L3BhcmE+CisKKworPHBhcmE+SW4gZ2VuZXJhbCwgaXQgaXMgYmVzdCB0byBrZWVwIHN5c3RlbSBzZXJ2aWNlcyBhcyBzbWFsbCwgdGFyZ2V0ZWQgcHJvZ3JhbXMgd2hpY2gKK3J1biBpbiB0aGVpciBvd24gcHJvY2VzcyBhbmQgcHJvdmlkZSBhIHNpbmdsZSBidXMgbmFtZS4gIFRoZW4sIGFsbCB0aGF0IGlzIG5lZWRlZAoraXMgYW4gJmx0O2FsbG93Jmd0OyBydWxlIGZvciB0aGUgIm93biIgcGVybWlzc2lvbiB0byBsZXQgdGhlIHByb2Nlc3MgY2xhaW0gdGhlIGJ1cworbmFtZSwgYW5kIGEgInNlbmRfZGVzdGluYXRpb24iIHJ1bGUgdG8gYWxsb3cgdHJhZmZpYyBmcm9tIHNvbWUgb3IgYWxsIHVpZHMgdG8KK3lvdXIgc2VydmljZS48L3BhcmE+CisKKworPHBhcmE+VGhlICZsdDtwb2xpY3kmZ3Q7IGVsZW1lbnQgaGFzIG9uZSBvZiBmb3VyIGF0dHJpYnV0ZXM6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgIGNvbnRleHQ9IihkZWZhdWx0fG1hbmRhdG9yeSkiCisgIGF0X2NvbnNvbGU9Iih0cnVlfGZhbHNlKSIKKyAgdXNlcj0idXNlcm5hbWUgb3IgdXNlcmlkIgorICBncm91cD0iZ3JvdXAgbmFtZSBvciBnaWQiCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlBvbGljaWVzIGFyZSBhcHBsaWVkIHRvIGEgY29ubmVjdGlvbiBhcyBmb2xsb3dzOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAgLSBhbGwgY29udGV4dD0iZGVmYXVsdCIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgIC0gYWxsIGdyb3VwPSJjb25uZWN0aW9uJ3MgdXNlcidzIGdyb3VwIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIC0gYWxsIHVzZXI9ImNvbm5lY3Rpb24ncyBhdXRoIHVzZXIiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAgIGluIHVuZGVmaW5lZCBvcmRlcgorICAgLSBhbGwgYXRfY29uc29sZT0idHJ1ZSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgIC0gYWxsIGF0X2NvbnNvbGU9ImZhbHNlIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgLSBhbGwgY29udGV4dD0ibWFuZGF0b3J5IiBwb2xpY2llcyBhcmUgYXBwbGllZAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5Qb2xpY2llcyBhcHBsaWVkIGxhdGVyIHdpbGwgb3ZlcnJpZGUgdGhvc2UgYXBwbGllZCBlYXJsaWVyLAord2hlbiB0aGUgcG9saWNpZXMgb3ZlcmxhcC4gTXVsdGlwbGUgcG9saWNpZXMgd2l0aCB0aGUgc2FtZQordXNlci9ncm91cC9jb250ZXh0IGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcgoraW4gdGhlIGNvbmZpZyBmaWxlLjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtkZW55Jmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthbGxvdyZndDs8L2VtcGhhc2lzPjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5BICZsdDtkZW55Jmd0OyBlbGVtZW50IGFwcGVhcnMgYmVsb3cgYSAmbHQ7cG9saWN5Jmd0OyBlbGVtZW50IGFuZCBwcm9oaWJpdHMgc29tZQorYWN0aW9uLiBUaGUgJmx0O2FsbG93Jmd0OyBlbGVtZW50IG1ha2VzIGFuIGV4Y2VwdGlvbiB0byBwcmV2aW91cyAmbHQ7ZGVueSZndDsKK3N0YXRlbWVudHMsIGFuZCB3b3JrcyBqdXN0IGxpa2UgJmx0O2RlbnkmZ3Q7IGJ1dCB3aXRoIHRoZSBpbnZlcnNlIG1lYW5pbmcuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBwb3NzaWJsZSBhdHRyaWJ1dGVzIG9mIHRoZXNlIGVsZW1lbnRzIGFyZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgIHNlbmRfaW50ZXJmYWNlPSJpbnRlcmZhY2VfbmFtZSIKKyAgIHNlbmRfbWVtYmVyPSJtZXRob2Rfb3Jfc2lnbmFsX25hbWUiCisgICBzZW5kX2Vycm9yPSJlcnJvcl9uYW1lIgorICAgc2VuZF9kZXN0aW5hdGlvbj0ibmFtZSIKKyAgIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiIHwgIm1ldGhvZF9yZXR1cm4iIHwgInNpZ25hbCIgfCAiZXJyb3IiCisgICBzZW5kX3BhdGg9Ii9wYXRoL25hbWUiCisKKyAgIHJlY2VpdmVfaW50ZXJmYWNlPSJpbnRlcmZhY2VfbmFtZSIKKyAgIHJlY2VpdmVfbWVtYmVyPSJtZXRob2Rfb3Jfc2lnbmFsX25hbWUiCisgICByZWNlaXZlX2Vycm9yPSJlcnJvcl9uYW1lIgorICAgcmVjZWl2ZV9zZW5kZXI9Im5hbWUiCisgICByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIiB8ICJtZXRob2RfcmV0dXJuIiB8ICJzaWduYWwiIHwgImVycm9yIgorICAgcmVjZWl2ZV9wYXRoPSIvcGF0aC9uYW1lIgorCisgICBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgfCAiZmFsc2UiCisgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgfCAiZmFsc2UiCisKKyAgIGVhdmVzZHJvcD0idHJ1ZSIgfCAiZmFsc2UiCisKKyAgIG93bj0ibmFtZSIKKyAgIG93bl9wcmVmaXg9Im5hbWUiCisgICB1c2VyPSJ1c2VybmFtZSIKKyAgIGdyb3VwPSJncm91cG5hbWUiCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPkV4YW1wbGVzOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAgJmx0O2Rlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlNlcnZpY2UiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8mZ3Q7CisgICAmbHQ7ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8mZ3Q7CisgICAmbHQ7ZGVueSByZWNlaXZlX3NlbmRlcj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvJmd0OworICAgJmx0O2RlbnkgdXNlcj0iam9obiIvJmd0OworICAgJmx0O2RlbnkgZ3JvdXA9ImVuZW1pZXMiLyZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhlICZsdDtkZW55Jmd0OyBlbGVtZW50J3MgYXR0cmlidXRlcyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGVueSAibWF0Y2hlcyIgYQorcGFydGljdWxhciBhY3Rpb24uIElmIGl0IG1hdGNoZXMsIHRoZSBhY3Rpb24gaXMgZGVuaWVkICh1bmxlc3MgbGF0ZXIKK3J1bGVzIGluIHRoZSBjb25maWcgZmlsZSBhbGxvdyBpdCkuPC9wYXJhPgorCis8cGFyYT5zZW5kX2Rlc3RpbmF0aW9uIGFuZCByZWNlaXZlX3NlbmRlciBydWxlcyBtZWFuIHRoYXQgbWVzc2FnZXMgbWF5IG5vdCBiZQorc2VudCB0byBvciByZWNlaXZlZCBmcm9tIHRoZSAqb3duZXIqIG9mIHRoZSBnaXZlbiBuYW1lLCBub3QgdGhhdAordGhleSBtYXkgbm90IGJlIHNlbnQgKnRvIHRoYXQgbmFtZSouIFRoYXQgaXMsIGlmIGEgY29ubmVjdGlvbgorb3ducyBzZXJ2aWNlcyBBLCBCLCBDLCBhbmQgc2VuZGluZyB0byBBIGlzIGRlbmllZCwgc2VuZGluZyB0byBCIG9yIEMKK3dpbGwgbm90IHdvcmsgZWl0aGVyLjwvcGFyYT4KKworPHBhcmE+VGhlIG90aGVyIHNlbmRfKiBhbmQgcmVjZWl2ZV8qIGF0dHJpYnV0ZXMgYXJlIHB1cmVseSB0ZXh0dWFsL2J5LXZhbHVlCittYXRjaGVzIGFnYWluc3QgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBtZXNzYWdlIGhlYWRlci48L3BhcmE+CisKKzxwYXJhPiJFYXZlc2Ryb3BwaW5nIiBvY2N1cnMgd2hlbiBhbiBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG1lc3NhZ2UgdGhhdAord2FzIGV4cGxpY2l0bHkgYWRkcmVzc2VkIHRvIGEgbmFtZSB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgb3duLCBvcgoraXMgYSByZXBseSB0byBzdWNoIGEgbWVzc2FnZS4gRWF2ZXNkcm9wcGluZyB0aHVzIG9ubHkgYXBwbGllcyB0bworbWVzc2FnZXMgdGhhdCBhcmUgYWRkcmVzc2VkIHRvIHNlcnZpY2VzIGFuZCByZXBsaWVzIHRvIHN1Y2ggbWVzc2FnZXMKKyhpLmUuIGl0IGRvZXMgbm90IGFwcGx5IHRvIHNpZ25hbHMpLjwvcGFyYT4KKworPHBhcmE+Rm9yICZsdDthbGxvdyZndDssIGVhdmVzZHJvcD0idHJ1ZSIgaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgbWF0Y2hlcyBldmVuCit3aGVuIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyB0aGF0Cit0aGUgcnVsZSBvbmx5IGFsbG93cyBtZXNzYWdlcyB0byBnbyB0byB0aGVpciBzcGVjaWZpZWQgcmVjaXBpZW50LgorRm9yICZsdDtkZW55Jmd0OywgZWF2ZXNkcm9wPSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBtYXRjaGVzCitvbmx5IHdoZW4gZWF2ZXNkcm9wcGluZy4gZWF2ZXNkcm9wPSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgZm9yICZsdDtkZW55Jmd0OworYWxzbywgYnV0IGhlcmUgaXQgbWVhbnMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzIGFsd2F5cywgZXZlbiB3aGVuCitub3QgZWF2ZXNkcm9wcGluZy4gVGhlIGVhdmVzZHJvcCBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgY29tYmluZWQgd2l0aAorc2VuZCBhbmQgcmVjZWl2ZSBydWxlcyAod2l0aCBzZW5kXyogYW5kIHJlY2VpdmVfKiBhdHRyaWJ1dGVzKS48L3BhcmE+CisKKzxwYXJhPlRoZSBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIHdvcmtzIHNpbWlsYXJseSB0byB0aGUgZWF2ZXNkcm9wCithdHRyaWJ1dGUuIEl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlICZsdDtkZW55Jmd0OyBvciAmbHQ7YWxsb3cmZ3Q7IG1hdGNoZXMgYSByZXBseQordGhhdCBpcyBleHBlY3RlZCAoY29ycmVzcG9uZHMgdG8gYSBwcmV2aW91cyBtZXRob2QgY2FsbCBtZXNzYWdlKS4KK1RoaXMgYXR0cmlidXRlIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHJlcGx5IG1lc3NhZ2VzIChlcnJvcnMgYW5kIG1ldGhvZAorcmV0dXJucyksIGFuZCBpcyBpZ25vcmVkIGZvciBvdGhlciBtZXNzYWdlIHR5cGVzLjwvcGFyYT4KKworCis8cGFyYT5Gb3IgJmx0O2FsbG93Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpcyB0aGUgZGVmYXVsdCBhbmQgaW5kaWNhdGVzIHRoYXQKK29ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYXJlIGFsbG93ZWQgYnkgdGhlCitydWxlLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9ImZhbHNlIiBtZWFucyB0aGF0IHRoZSBydWxlIGFsbG93cyBhbnkgcmVwbHkKK2V2ZW4gaWYgdW5leHBlY3RlZC48L3BhcmE+CisKKworPHBhcmE+Rm9yICZsdDtkZW55Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgYnV0IGluZGljYXRlcyB0aGF0Cit0aGUgcnVsZSBtYXRjaGVzIG9ubHkgd2hlbiB0aGUgcmVwbHkgd2FzIG5vdAorcmVxdWVzdGVkLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIGFwcGxpZXMKK2Fsd2F5cywgcmVnYXJkbGVzcyBvZiBwZW5kaW5nIHJlcGx5IHN0YXRlLjwvcGFyYT4KKworCis8cGFyYT51c2VyIGFuZCBncm91cCBkZW5pYWxzIG1lYW4gdGhhdCB0aGUgZ2l2ZW4gdXNlciBvciBncm91cCBtYXkKK25vdCBjb25uZWN0IHRvIHRoZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisKKworPHBhcmE+Rm9yICJuYW1lIiwgInVzZXJuYW1lIiwgImdyb3VwbmFtZSIsIGV0Yy4KK3RoZSBjaGFyYWN0ZXIgIioiIGNhbiBiZSBzdWJzdGl0dXRlZCwgbWVhbmluZyAiYW55LiIgQ29tcGxleCBnbG9icworbGlrZSAiZm9vLmJhci4qIiBhcmVuJ3QgYWxsb3dlZCBmb3Igbm93IGJlY2F1c2UgdGhleSdkIGJlIHdvcmsgdG8KK2ltcGxlbWVudCBhbmQgbWF5YmUgZW5jb3VyYWdlIHNsb3BweSBzZWN1cml0eSBhbnl3YXkuPC9wYXJhPgorCisKKzxwYXJhPiZsdDthbGxvdyBvd25fcHJlZml4PSJhLmIiLyZndDsgYWxsb3dzIHlvdSB0byBvd24gdGhlIG5hbWUgImEuYiIgb3IgYW55CituYW1lIHdob3NlIGZpcnN0IGRvdC1zZXBhcmF0ZWQgZWxlbWVudHMgYXJlICJhLmIiOiBpbiBwYXJ0aWN1bGFyLAoreW91IGNhbiBvd24gImEuYi5jIiBvciAiYS5iLmMuZCIsIGJ1dCBub3QgImEuYmMiIG9yICJhLmMiLgorVGhpcyBpcyB1c2VmdWwgd2hlbiBzZXJ2aWNlcyBsaWtlIFRlbGVwYXRoeSBhbmQgUmVzZXJ2ZURldmljZQorZGVmaW5lIGEgbWVhbmluZyBmb3Igc3VidHJlZXMgb2Ygd2VsbC1rbm93biBuYW1lcywgc3VjaCBhcworb3JnLmZyZWVkZXNrdG9wLlRlbGVwYXRoeS5Db25uZWN0aW9uTWFuYWdlci4oYW55dGhpbmcpCithbmQgb3JnLmZyZWVkZXNrdG9wLlJlc2VydmVEZXZpY2UxLihhbnl0aGluZykuPC9wYXJhPgorCisKKzxwYXJhPkl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gZGVueSBhIHVzZXIgb3IgZ3JvdXAgaW5zaWRlIGEgJmx0O3BvbGljeSZndDsKK2ZvciBhIHVzZXIgb3IgZ3JvdXA7IHVzZXIvZ3JvdXAgZGVuaWFscyBjYW4gb25seSBiZSBpbnNpZGUKK2NvbnRleHQ9ImRlZmF1bHQiIG9yIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMuPC9wYXJhPgorCisKKzxwYXJhPkEgc2luZ2xlICZsdDtkZW55Jmd0OyBydWxlIG1heSBzcGVjaWZ5IGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzIHN1Y2ggYXMKK3NlbmRfZGVzdGluYXRpb24gYW5kIHNlbmRfaW50ZXJmYWNlIGFuZCBzZW5kX3R5cGUuIEluIHRoaXMgY2FzZSwgdGhlCitkZW5pYWwgYXBwbGllcyBvbmx5IGlmIGJvdGggYXR0cmlidXRlcyBtYXRjaCB0aGUgbWVzc2FnZSBiZWluZyBkZW5pZWQuCitlLmcuICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJmb28uYmFyIiBzZW5kX2Rlc3RpbmF0aW9uPSJmb28uYmxhaCIvJmd0OyB3b3VsZAorZGVueSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbiBpbnRlcmZhY2UgQU5EIHRoZSBnaXZlbiBidXMgbmFtZS4KK1RvIGdldCBhbiBPUiBlZmZlY3QgeW91IHNwZWNpZnkgbXVsdGlwbGUgJmx0O2RlbnkmZ3Q7IHJ1bGVzLjwvcGFyYT4KKworCis8cGFyYT5Zb3UgY2FuJ3QgaW5jbHVkZSBib3RoIHNlbmRfIGFuZCByZWNlaXZlXyBhdHRyaWJ1dGVzIG9uIHRoZSBzYW1lCitydWxlLCBzaW5jZSAid2hldGhlciB0aGUgbWVzc2FnZSBjYW4gYmUgc2VudCIgYW5kICJ3aGV0aGVyIGl0IGNhbiBiZQorcmVjZWl2ZWQiIGFyZSBldmFsdWF0ZWQgc2VwYXJhdGVseS48L3BhcmE+CisKKworPHBhcmE+QmUgY2FyZWZ1bCB3aXRoIHNlbmRfaW50ZXJmYWNlL3JlY2VpdmVfaW50ZXJmYWNlLCBiZWNhdXNlIHRoZQoraW50ZXJmYWNlIGZpZWxkIGluIG1lc3NhZ2VzIGlzIG9wdGlvbmFsLiAgSW4gcGFydGljdWxhciwgZG8gTk9UCitzcGVjaWZ5ICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZm9vLkJhciIvJmd0OyEgIFRoaXMgd2lsbCBjYXVzZQorbm8taW50ZXJmYWNlIG1lc3NhZ2VzIHRvIGJlIGJsb2NrZWQgZm9yIGFsbCBzZXJ2aWNlcywgd2hpY2ggaXMKK2FsbW9zdCBjZXJ0YWlubHkgbm90IHdoYXQgeW91IGludGVuZGVkLiAgQWx3YXlzIHVzZSBydWxlcyBvZgordGhlIGZvcm06ICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZm9vLkJhciIgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZvby5TZXJ2aWNlIi8mZ3Q7PC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlbGludXgmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+VGhlICZsdDtzZWxpbnV4Jmd0OyBlbGVtZW50IGNvbnRhaW5zIHNldHRpbmdzIHJlbGF0ZWQgdG8gU2VjdXJpdHkgRW5oYW5jZWQgTGludXguCitNb3JlIGRldGFpbHMgYmVsb3cuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2Fzc29jaWF0ZSZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5BbiAmbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50IGFwcGVhcnMgYmVsb3cgYW4gJmx0O3NlbGludXgmZ3Q7IGVsZW1lbnQgYW5kCitjcmVhdGVzIGEgbWFwcGluZy4gUmlnaHQgbm93IG9ubHkgb25lIGtpbmQgb2YgYXNzb2NpYXRpb24gaXMgcG9zc2libGU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAmbHQ7YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkZvb2JhciIgY29udGV4dD0iZm9vX3QiLyZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhpcyBtZWFucyB0aGF0IGlmIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biB0aGUgbmFtZQorIm9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIHRoZW4gdGhlIHNvdXJjZSBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQKK29mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgd2lsbCBiZSAiZm9vX3QiIC0gc2VlIHRoZQorc2hvcnQgZGlzY3Vzc2lvbiBvZiBTRUxpbnV4IGJlbG93LjwvcGFyYT4KKworCis8cGFyYT5Ob3RlLCB0aGUgY29udGV4dCBoZXJlIGlzIHRoZSB0YXJnZXQgY29udGV4dCB3aGVuIHJlcXVlc3RpbmcgYSBuYW1lLAorTk9UIHRoZSBjb250ZXh0IG9mIHRoZSBjb25uZWN0aW9uIG93bmluZyB0aGUgbmFtZS48L3BhcmE+CisKKworPHBhcmE+VGhlcmUncyBjdXJyZW50bHkgbm8gd2F5IHRvIHNldCBhIGRlZmF1bHQgZm9yIG93bmluZyBhbnkgbmFtZSwgaWYKK3dlIGFkZCB0aGlzIHN5bnRheCBpdCB3aWxsIGxvb2sgbGlrZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthc3NvY2lhdGUgb3duPSIqIiBjb250ZXh0PSJmb29fdCIvJmd0OworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKzxwYXJhPklmIHlvdSBmaW5kIGEgcmVhc29uIHRoaXMgaXMgdXNlZnVsLCBsZXQgdGhlIGRldmVsb3BlcnMga25vdy4KK1JpZ2h0IG5vdyB0aGUgZGVmYXVsdCB3aWxsIGJlIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBidXMgaXRzZWxmLjwvcGFyYT4KKworCis8cGFyYT5JZiB0d28gJmx0O2Fzc29jaWF0ZSZndDsgZWxlbWVudHMgc3BlY2lmeSB0aGUgc2FtZSBuYW1lLCB0aGUgZWxlbWVudAorYXBwZWFyaW5nIGxhdGVyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSB1c2VkLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthcHBhcm1vciZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgJmx0O2FwcGFybW9yJmd0OyBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIEFwcEFybW9yIG1lZGlhdGlvbiBvbgordGhlIGJ1cy4gSXQgY2FuIGNvbnRhaW4gb25lIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWF0aW9uIG1vZGU6PC9wYXJhPgorCis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthcHBhcm1vciBtb2RlPSIoZW5hYmxlZHxkaXNhYmxlZHxyZXF1aXJlZCkiLyZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKzxwYXJhPlRoZSBkZWZhdWx0IG1vZGUgaXMgImVuYWJsZWQiLiBJbiAiZW5hYmxlZCIgbW9kZSwgQXBwQXJtb3IgbWVkaWF0aW9uCit3aWxsIGJlIHBlcmZvcm1lZCBpZiBBcHBBcm1vciBzdXBwb3J0IGlzIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsLiBJZiBpdCBpcyBub3QKK2F2YWlsYWJsZSwgZGJ1cy1kYWVtb24gd2lsbCBzdGFydCBidXQgQXBwQXJtb3IgbWVkaWF0aW9uIHdpbGwgbm90IG9jY3VyLiBJbgorImRpc2FibGVkIiBtb2RlLCBBcHBBcm1vciBtZWRpYXRpb24gaXMgZGlzYWJsZWQuIEluICJyZXF1aXJlZCIgbW9kZSwgQXBwQXJtb3IKK21lZGlhdGlvbiB3aWxsIGJlIGVuYWJsZWQgaWYgQXBwQXJtb3Igc3VwcG9ydCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZQorZGJ1cy1kYWVtb24gd2lsbCByZWZ1c2UgdG8gc3RhcnQuPC9wYXJhPgorCis8cGFyYT5UaGUgQXBwQXJtb3IgbWVkaWF0aW9uIG1vZGUgb2YgdGhlIGJ1cyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgYnVzCitzdGFydHMuIE1vZGlmeWluZyB0aGUgbW9kZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBzZW5kaW5nIGEgU0lHSFVQCitzaWduYWwgdG8gdGhlIGRhZW1vbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBtZWRpYXRpb24gbW9kZS48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nc2VsaW51eCc+PHRpdGxlPlNFTGludXg8L3RpdGxlPgorPHBhcmE+U2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4Lyc+aHR0cDovL3d3dy5uc2EuZ292L3NlbGludXgvPC91bGluaz4gZm9yIGZ1bGwgZGV0YWlscyBvbiBTRUxpbnV4LiBTb21lIHVzZWZ1bCBleGNlcnB0czo8L3BhcmE+CisKKworPHBhcmE+RXZlcnkgc3ViamVjdCAocHJvY2VzcykgYW5kIG9iamVjdCAoZS5nLiBmaWxlLCBzb2NrZXQsIElQQyBvYmplY3QsCitldGMpIGluIHRoZSBzeXN0ZW0gaXMgYXNzaWduZWQgYSBjb2xsZWN0aW9uIG9mIHNlY3VyaXR5IGF0dHJpYnV0ZXMsCitrbm93biBhcyBhIHNlY3VyaXR5IGNvbnRleHQuIEEgc2VjdXJpdHkgY29udGV4dCBjb250YWlucyBhbGwgb2YgdGhlCitzZWN1cml0eSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc3ViamVjdCBvciBvYmplY3QKK3RoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzZWN1cml0eSBwb2xpY3kuPC9wYXJhPgorCisKKzxwYXJhPkluIG9yZGVyIHRvIGJldHRlciBlbmNhcHN1bGF0ZSBzZWN1cml0eSBjb250ZXh0cyBhbmQgdG8gcHJvdmlkZQorZ3JlYXRlciBlZmZpY2llbmN5LCB0aGUgcG9saWN5IGVuZm9yY2VtZW50IGNvZGUgb2YgU0VMaW51eCB0eXBpY2FsbHkKK2hhbmRsZXMgc2VjdXJpdHkgaWRlbnRpZmllcnMgKFNJRHMpIHJhdGhlciB0aGFuIHNlY3VyaXR5IGNvbnRleHRzLiBBCitTSUQgaXMgYW4gaW50ZWdlciB0aGF0IGlzIG1hcHBlZCBieSB0aGUgc2VjdXJpdHkgc2VydmVyIHRvIGEgc2VjdXJpdHkKK2NvbnRleHQgYXQgcnVudGltZS48L3BhcmE+CisKKworPHBhcmE+V2hlbiBhIHNlY3VyaXR5IGRlY2lzaW9uIGlzIHJlcXVpcmVkLCB0aGUgcG9saWN5IGVuZm9yY2VtZW50IGNvZGUKK3Bhc3NlcyBhIHBhaXIgb2YgU0lEcyAodHlwaWNhbGx5IHRoZSBTSUQgb2YgYSBzdWJqZWN0IGFuZCB0aGUgU0lEIG9mCithbiBvYmplY3QsIGJ1dCBzb21ldGltZXMgYSBwYWlyIG9mIHN1YmplY3QgU0lEcyBvciBhIHBhaXIgb2Ygb2JqZWN0CitTSURzKSwgYW5kIGFuIG9iamVjdCBzZWN1cml0eSBjbGFzcyB0byB0aGUgc2VjdXJpdHkgc2VydmVyLiBUaGUgb2JqZWN0CitzZWN1cml0eSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGtpbmQgb2Ygb2JqZWN0LCBlLmcuIGEgcHJvY2VzcywgYSByZWd1bGFyCitmaWxlLCBhIGRpcmVjdG9yeSwgYSBUQ1Agc29ja2V0LCBldGMuPC9wYXJhPgorCisKKzxwYXJhPkFjY2VzcyBkZWNpc2lvbnMgc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBhIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBmb3IgYQorZ2l2ZW4gcGFpciBvZiBTSURzIGFuZCBjbGFzcy4gRWFjaCBvYmplY3QgY2xhc3MgaGFzIGEgc2V0IG9mCithc3NvY2lhdGVkIHBlcm1pc3Npb25zIGRlZmluZWQgdG8gY29udHJvbCBvcGVyYXRpb25zIG9uIG9iamVjdHMgd2l0aAordGhhdCBjbGFzcy48L3BhcmE+CisKKworPHBhcmE+RC1CdXMgcGVyZm9ybXMgU0VMaW51eCBzZWN1cml0eSBjaGVja3MgaW4gdHdvIHBsYWNlcy48L3BhcmE+CisKKworPHBhcmE+Rmlyc3QsIGFueSB0aW1lIGEgbWVzc2FnZSBpcyByb3V0ZWQgZnJvbSBvbmUgY29ubmVjdGlvbiB0byBhbm90aGVyCitjb25uZWN0aW9uLCB0aGUgYnVzIGRhZW1vbiB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YKK3RoZSBmaXJzdCBjb25uZWN0aW9uIGFzIHNvdXJjZSwgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgc2Vjb25kIGNvbm5lY3Rpb24KK2FzIHRhcmdldCwgb2JqZWN0IGNsYXNzICJkYnVzIiBhbmQgcmVxdWVzdGVkIHBlcm1pc3Npb24gInNlbmRfbXNnIi48L3BhcmE+CisKKworPHBhcmE+SWYgYSBzZWN1cml0eSBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgY29ubmVjdGlvbgorKGltcG9zc2libGUgd2hlbiB1c2luZyBVTklYIGRvbWFpbiBzb2NrZXRzKSwgdGhlbiB0aGUgdGFyZ2V0Citjb250ZXh0IHVzZWQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0LCBiZWNhdXNlIHdlJ3JlCithc3N1bWluZyB0aGF0IG9ubHkgVU5JWCBkb21haW4gc29ja2V0cyB3aWxsIGJlIHVzZWQgdG8KK2Nvbm5lY3QgdG8gdGhlIHN5c3RlbXdpZGUgYnVzLiBJZiB0aGlzIGNoYW5nZXMsIHdlJ2xsCitwcm9iYWJseSBhZGQgYSB3YXkgdG8gc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gY29udGV4dC48L3BhcmE+CisKKworPHBhcmE+U2Vjb25kLCBhbnkgdGltZSBhIGNvbm5lY3Rpb24gYXNrcyB0byBvd24gYSBuYW1lLAordGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBzZWN1cml0eQorY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBhcyBzb3VyY2UsIHRoZSBzZWN1cml0eSBjb250ZXh0IHNwZWNpZmllZAorZm9yIHRoZSBuYW1lIGluIHRoZSBjb25maWcgZmlsZSBhcyB0YXJnZXQsIG9iamVjdAorY2xhc3MgImRidXMiIGFuZCByZXF1ZXN0ZWQgcGVybWlzc2lvbiAiYWNxdWlyZV9zdmMiLjwvcGFyYT4KKworCis8cGFyYT5UaGUgc2VjdXJpdHkgY29udGV4dCBmb3IgYSBidXMgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyZsdDthc3NvY2lhdGUmZ3Q7IGVsZW1lbnQgZGVzY3JpYmVkIGVhcmxpZXIgaW4gdGhpcyBkb2N1bWVudC4KK0lmIGEgbmFtZSBoYXMgbm8gc2VjdXJpdHkgY29udGV4dCBhc3NvY2lhdGVkIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgYnVzIGRhZW1vbgoraXRzZWxmIHdpbGwgYmUgdXNlZC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXBwYXJtb3InPjx0aXRsZT5BcHBBcm1vcjwvdGl0bGU+Cis8cGFyYT5UaGUgQXBwQXJtb3IgY29uZmluZW1lbnQgY29udGV4dCBpcyBzdG9yZWQgd2hlbiBhcHBsaWNhdGlvbnMgY29ubmVjdCB0bwordGhlIGJ1cy4gVGhlIGNvbmZpbmVtZW50IGNvbnRleHQgY29uc2lzdHMgb2YgYSBsYWJlbCBhbmQgYSBjb25maW5lbWVudCBtb2RlLgorV2hlbiBhIHNlY3VyaXR5IGRlY2lzaW9uIGlzIHJlcXVpcmVkLCB0aGUgZGFlbW9uIHVzZXMgdGhlIGNvbmZpbmVtZW50IGNvbnRleHQKK3RvIHF1ZXJ5IHRoZSBBcHBBcm1vciBwb2xpY3kgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGFsbG93ZWQgb3IKK2RlbmllZCBhbmQgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgYXVkaXRlZC48L3BhcmE+CisKKzxwYXJhPlRoZSBkYWVtb24gcGVyZm9ybXMgQXBwQXJtb3Igc2VjdXJpdHkgY2hlY2tzIGluIHRocmVlIHBsYWNlcy48L3BhcmE+CisKKzxwYXJhPkZpcnN0LCBhbnkgdGltZSBhIG1lc3NhZ2UgaXMgcm91dGVkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29ubmVjdGlvbiwgdGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgZmlyc3QKK2Nvbm5lY3Rpb24gYXMgc291cmNlLCBsYWJlbCBhbmQvb3IgY29ubmVjdGlvbiBuYW1lIG9mIHRoZSBzZWNvbmQgY29ubmVjdGlvbiBhcwordGFyZ2V0LCBhbG9uZyB3aXRoIHRoZSBidXMgbmFtZSwgdGhlIHBhdGggbmFtZSwgdGhlIGludGVyZmFjZSBuYW1lLCBhbmQgdGhlCittZW1iZXIgbmFtZS4gUmVwbHkgbWVzc2FnZXMsIHN1Y2ggYXMgbWV0aG9kX3JldHVybiBhbmQgZXJyb3IgbWVzc2FnZXMsIGFyZQoraW1wbGljaXRseSBhbGxvd2VkIGlmIHRoZXkgYXJlIGluIHJlc3BvbnNlIHRvIGEgbWVzc2FnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4KK2FsbG93ZWQuPC9wYXJhPgorCis8cGFyYT5TZWNvbmQsIGFueSB0aW1lIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biBhIG5hbWUsIHRoZSBidXMgZGFlbW9uIHdpbGwKK2NoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjb25uZWN0aW9uIGFzIHNvdXJjZSwgdGhlIHJlcXVlc3RlZAorbmFtZSBhcyB0YXJnZXQsIGFsb25nIHdpdGggdGhlIGJ1cyBuYW1lLjwvcGFyYT4KKworPHBhcmE+VGhpcmQsIGFueSB0aW1lIGEgY29ubmVjdGlvbiBhdHRlbXB0cyB0byBlYXZlc2Ryb3AsIHRoZSBidXMgZGFlbW9uIHdpbGwKK2NoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjb25uZWN0aW9uIGFzIHRoZSBzb3VyY2UsIGFsb25nIHdpdGgKK3RoZSBidXMgbmFtZS48L3BhcmE+CisKKzxwYXJhPkFwcEFybW9yIHJ1bGVzIGZvciBidXMgbWVkaWF0aW9uIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBidXMgY29uZmlndXJhdGlvbgorZmlsZXMuIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBBcHBBcm1vciBwcm9maWxlLiBQbGVhc2Ugc2VlCis8ZW1waGFzaXMgcmVtYXA9J0knPmFwcGFybW9yLmQoNSk8L2VtcGhhc2lzPiBmb3IgbW9yZSBkZXRhaWxzLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdkZWJ1Z2dpbmcnPjx0aXRsZT5ERUJVR0dJTkc8L3RpdGxlPgorPHBhcmE+SWYgeW91J3JlIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoZXJlIHlvdXIgbWVzc2FnZXMgYXJlIGdvaW5nIG9yIHdoeQoreW91IGFyZW4ndCBnZXR0aW5nIG1lc3NhZ2VzLCB0aGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgeW91IGNhbiB0cnkuPC9wYXJhPgorCis8cGFyYT5SZW1lbWJlciB0aGF0IHRoZSBzeXN0ZW0gYnVzIGlzIGhlYXZpbHkgbG9ja2VkIGRvd24gYW5kIGlmIHlvdQoraGF2ZW4ndCBpbnN0YWxsZWQgYSBzZWN1cml0eSBwb2xpY3kgZmlsZSB0byBhbGxvdyB5b3VyIG1lc3NhZ2UKK3Rocm91Z2gsIGl0IHdvbid0IHdvcmsuIEZvciB0aGUgc2Vzc2lvbiBidXMsIHRoaXMgaXMgbm90IGEgY29uY2Vybi48L3BhcmE+CisKKzxwYXJhPlRoZSBzaW1wbGVzdCB3YXkgdG8gZmlndXJlIG91dCB3aGF0J3MgaGFwcGVuaW5nIG9uIHRoZSBidXMgaXMgdG8gcnVuCit0aGUgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzLW1vbml0b3I8L2VtcGhhc2lzPiBwcm9ncmFtLCB3aGljaCBjb21lcyB3aXRoIHRoZSBELUJ1cworcGFja2FnZS4gWW91IGNhbiBhbHNvIHNlbmQgdGVzdCBtZXNzYWdlcyB3aXRoIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1zZW5kPC9lbXBoYXNpcz4uIFRoZXNlCitwcm9ncmFtcyBoYXZlIHRoZWlyIG93biBtYW4gcGFnZXMuPC9wYXJhPgorCis8cGFyYT5JZiB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGhlIGRhZW1vbiBpdHNlbGYgaXMgZG9pbmcsIHlvdSBtaWdodCBjb25zaWRlcgorcnVubmluZyBhIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGRhZW1vbiB0byB0ZXN0IGFnYWluc3QuIFRoaXMgd2lsbCBhbGxvdyB5b3UKK3RvIHB1dCB0aGUgZGFlbW9uIHVuZGVyIGEgZGVidWdnZXIsIG9yIHJ1biBpdCB3aXRoIHZlcmJvc2Ugb3V0cHV0LCB3aXRob3V0CittZXNzaW5nIHVwIHlvdXIgcmVhbCBzZXNzaW9uIGFuZCBzeXN0ZW0gZGFlbW9ucy48L3BhcmE+CisKKzxwYXJhPlRvIHJ1biBhIHNlcGFyYXRlIHRlc3QgY29weSBvZiB0aGUgZGFlbW9uLCBmb3IgZXhhbXBsZSB5b3UgbWlnaHQgb3BlbiBhIHRlcm1pbmFsCithbmQgdHlwZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgREJVU19WRVJCT1NFPTEgZGJ1cy1kYWVtb24gLS1zZXNzaW9uIC0tcHJpbnQtYWRkcmVzcworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPHBhcmE+VGhlIHRlc3QgZGFlbW9uIGFkZHJlc3Mgd2lsbCBiZSBwcmludGVkIHdoZW4gdGhlIGRhZW1vbiBzdGFydHMuIFlvdSB3aWxsIG5lZWQKK3RvIGNvcHktYW5kLXBhc3RlIHRoaXMgYWRkcmVzcyBhbmQgdXNlIGl0IGFzIHRoZSB2YWx1ZSBvZiB0aGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHlvdSBsYXVuY2ggdGhlIGFwcGxpY2F0aW9ucworeW91IHdhbnQgdG8gdGVzdC4gVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFwcGxpY2F0aW9ucyB0byBjb25uZWN0IHRvIHlvdXIKK3Rlc3QgYnVzIGluc3RlYWQgb2YgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBvZiB5b3VyIHJlYWwgc2Vzc2lvbiBidXMuPC9wYXJhPgorCis8cGFyYT5EQlVTX1ZFUkJPU0U9MSB3aWxsIGhhdmUgTk8gRUZGRUNUIHVubGVzcyB5b3VyIGNvcHkgb2YgRC1CdXMKK3dhcyBjb21waWxlZCB3aXRoIHZlcmJvc2UgbW9kZSBlbmFibGVkLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbgorcHJvZHVjdGlvbiBidWlsZHMgZHVlIHRvIHBlcmZvcm1hbmNlIGltcGFjdC4gWW91IG1heSBuZWVkIHRvIHJlYnVpbGQKK0QtQnVzIGlmIHlvdXIgY29weSB3YXMgbm90IGJ1aWx0IHdpdGggZGVidWdnaW5nIGluIG1pbmQuIChEQlVTX1ZFUkJPU0UKK2Fsc28gYWZmZWN0cyB0aGUgRC1CdXMgbGlicmFyeSBhbmQgdGh1cyBhcHBsaWNhdGlvbnMgdXNpbmcgRC1CdXM7IGl0IG1heQorYmUgdXNlZnVsIHRvIHNlZSB2ZXJib3NlIG91dHB1dCBvbiBib3RoIHRoZSBjbGllbnQgc2lkZSBhbmQgZnJvbSB0aGUgZGFlbW9uLik8L3BhcmE+CisKKzxwYXJhPklmIHlvdSB3YW50IHRvIGdldCBmYW5jeSwgeW91IGNhbiBjcmVhdGUgYSBjdXN0b20gYnVzCitjb25maWd1cmF0aW9uIGZvciB5b3VyIHRlc3QgYnVzIChzZWUgdGhlIHNlc3Npb24uY29uZiBhbmQgc3lzdGVtLmNvbmYKK2ZpbGVzIHRoYXQgZGVmaW5lIHRoZSB0d28gZGVmYXVsdCBjb25maWd1cmF0aW9ucyBmb3IgZXhhbXBsZSkuIFRoaXMKK3dvdWxkIGFsbG93IHlvdSB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSBmb3IgLnNlcnZpY2UgZmlsZXMsCitmb3IgZXhhbXBsZS48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtZmFxLnhtbCBiL2RvYy9kYnVzLWZhcS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyOTZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLWZhcS54bWwKQEAgLTAsMCArMSw2NzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiCitbCitdPgorCis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+CisgICAgPHRpdGxlPkQtQnVzIEZBUTwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPlZlcnNpb24gMC4zPC9yZWxlYXNlaW5mbz4KKyAgICA8ZGF0ZT4xNyBOb3ZlbWJlciAyMDA2PC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5IYXZvYzwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBlbm5pbmd0b248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorCSAgICA8ZW1haWw+aHBAcG9ib3guY29tPC9lbWFpbD4KKwkgIDwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPG90aGVybmFtZSByb2xlPSJtaSI+QTwvb3RoZXJuYW1lPgorCTxzdXJuYW1lPldoZWVsZXI8L3N1cm5hbWU+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICA8L2FydGljbGVpbmZvPgorCisgIDxxYW5kYXNldCBpZD0iZmFxIj4KKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGF0IGlzIEQtQnVzPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBwcm9iYWJseSBiZXN0IGFuc3dlcmVkIGJ5IHJlYWRpbmcgdGhlIEQtQnVzIDx1bGluayB1cmw9ImRidXMtdHV0b3JpYWwuaHRtbCI+dHV0b3JpYWw8L3VsaW5rPiBvcgorICAgICAgICAgIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIDx1bGluayB1cmw9ImRidXMtc3BlY2lmaWNhdGlvbi5odG1sIj5zcGVjaWZpY2F0aW9uPC91bGluaz4uIEluCisgICAgICAgICAgc2hvcnQsIGl0IGlzIGEgc3lzdGVtIGNvbnNpc3Rpbmcgb2YgMSkgYSB3aXJlIHByb3RvY29sIGZvciBleHBvc2luZyBhCisgICAgICAgICAgdHlwaWNhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2UvZnJhbWV3b3JrIHRvIG90aGVyIGFwcGxpY2F0aW9uczsgYW5kCisgICAgICAgICAgMikgYSBidXMgZGFlbW9uIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBmaW5kIGFuZCBtb25pdG9yIG9uZSBhbm90aGVyLgorICAgICAgICAgIFBocmFzZWQgZGlmZmVyZW50bHksIEQtQnVzIGlzIDEpIGFuIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIChJUEMpIHN5c3RlbSBhbmQgMikgc29tZSBoaWdoZXItbGV2ZWwgCisgICAgICAgICAgc3RydWN0dXJlIChsaWZlY3ljbGUgdHJhY2tpbmcsIHNlcnZpY2UgYWN0aXZhdGlvbiwgc2VjdXJpdHkgcG9saWN5KSBwcm92aWRlZCBieSB0d28gYnVzIGRhZW1vbnMsCisgICAgICAgICAgb25lIHN5c3RlbXdpZGUgYW5kIG9uZSBwZXItdXNlci1zZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXMgRC1CdXMgc3RhYmxlL2ZpbmlzaGVkPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGxvdy1sZXZlbCBsaWJyYXJ5ICJsaWJkYnVzIiBhbmQgdGhlIHByb3RvY29sIHNwZWNpZmljYXRpb24gYXJlIGNvbnNpZGVyZWQgCisgICAgICAgICAgQUJJIHN0YWJsZS4gVGhlIDx1bGluayB1cmw9IlJFQURNRSI+UkVBRE1FPC91bGluaz4KKyAgICAgICAgICBmaWxlIGhhcyBhIGRpc2N1c3Npb24gb2YgdGhlIEFQSS9BQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMuCisgICAgICAgICAgSGlnaGVyLWxldmVsIGJpbmRpbmdzIChzdWNoIGFzIHRob3NlIGZvciBRdCwgR0xpYiwgUHl0aG9uLCBKYXZhLCBDIykgZWFjaCAKKyAgICAgICAgICBoYXZlIHRoZWlyIG93biByZWxlYXNlIHNjaGVkdWxlcyBhbmQgZGVncmVlIG9mIG1hdHVyaXR5LCBub3QgbGlua2VkIHRvIAorICAgICAgICAgIHRoZSBsb3ctbGV2ZWwgbGlicmFyeSBhbmQgYnVzIGRhZW1vbiByZWxlYXNlLiBDaGVjayB0aGUgcHJvamVjdCBwYWdlIGZvcgorICAgICAgICAgIHRoZSBiaW5kaW5nIHlvdSdyZSBjb25zaWRlcmluZyB0byB1bmRlcnN0YW5kIHRoYXQgcHJvamVjdCdzIHBvbGljaWVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGlzIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gbGljZW5zZWQ/IENhbiBJIHVzZSBpdCBpbiAKKyAgICAgICAgICBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnM/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgc2hvcnQgYW5zd2VyIGlzIHllcywgeW91IGNhbiB1c2UgaXQgaW4gcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zLgorICAgICAgICAgIFlvdSBzaG91bGQgcmVhZCB0aGUgPHVsaW5rIHVybD0iQ09QWUlORyI+Q09QWUlORzwvdWxpbms+IGZpbGUsIHdoaWNoCisgICAgICAgICAgb2ZmZXJzIHlvdSB0aGUgY2hvaWNlIG9mIHR3byBsaWNlbnNlcy4gVGhlc2UgYXJlIHRoZSBHUEwgYW5kIHRoZQorICAgICAgICAgIEFGTC4gVGhlIEdQTCByZXF1aXJlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gYmUgbGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICAgICAgICAgIGFzIHdlbGwuIFRoZSBBRkwgaXMgYW4gIlgtc3R5bGUiIG9yICJCU0Qtc3R5bGUiIGxpY2Vuc2UgY29tcGF0aWJsZQorICAgICAgICAgIHdpdGggcHJvcHJpZXRhcnkgbGljZW5zaW5nLCBidXQgaXQgZG9lcyBoYXZlIHNvbWUgcmVxdWlyZW1lbnRzOyBpbgorICAgICAgICAgIHBhcnRpY3VsYXIgaXQgcHJvaGliaXRzIHlvdSBmcm9tIGZpbGluZyBhIGxhd3N1aXQgYWxsZWdpbmcgdGhhdCB0aGUKKyAgICAgICAgICBELUJ1cyBzb2Z0d2FyZSBpbmZyaW5nZXMgeW91ciBwYXRlbnRzIDxlbXBoYXNpcz53aGlsZSB5b3UgY29udGludWUgdG8KKyAgICAgICAgICB1c2UgRC1CdXM8L2VtcGhhc2lzPi4gIElmIHlvdSdyZSBnb2luZyB0byBzdWUsIHlvdSBoYXZlIHRvIHN0b3AgdXNpbmcKKyAgICAgICAgICB0aGUgc29mdHdhcmUuIFJlYWQgdGhlIGxpY2Vuc2VzIHRvIGRldGVybWluZSB0aGVpciBtZWFuaW5nLCB0aGlzIEZBUQorICAgICAgICAgIGVudHJ5IGlzIG5vdCBpbnRlbmRlZCB0byBjaGFuZ2UgdGhlIG1lYW5pbmcgb3IgdGVybXMgb2YgdGhlIGxpY2Vuc2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYnVzIG5hbWUsIGFuZCBvYmplY3QgcGF0aCwgCisgICAgICAgICAgYW5kIGFuIGludGVyZmFjZT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSBpbWFnaW5lIGEgQysrIHByb2dyYW0gdGhhdCBpbXBsZW1lbnRzIGEgbmV0d29yayBzZXJ2aWNlLCB0aGVuCisgICAgICAgICAgdGhlIGJ1cyBuYW1lIGlzIHRoZSBob3N0bmFtZSBvZiB0aGUgY29tcHV0ZXIgcnVubmluZyB0aGlzIEMrKyBwcm9ncmFtLAorICAgICAgICAgIHRoZSBvYmplY3QgcGF0aCBpcyBhIEMrKyBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciwgYW5kIGFuIGludGVyZmFjZSBpcworICAgICAgICAgIGEgQysrIGNsYXNzIChhIHB1cmUgdmlydHVhbCBvciBhYnN0cmFjdCBjbGFzcywgdG8gYmUgZXhhY3QpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIEphdmEgdGVybXMsIHRoZSBvYmplY3QgcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlLCAKKyAgICAgICAgICBhbmQgYW4gaW50ZXJmYWNlIGlzIGEgSmF2YSBpbnRlcmZhY2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUGVvcGxlIGdldCBjb25mdXNlZCBiZWNhdXNlIGlmIHRoZXkgd3JpdGUgYW4gYXBwbGljYXRpb24gCisgICAgICAgICAgd2l0aCBhIHNpbmdsZSBvYmplY3QgaW5zdGFuY2UgYW5kIGEgc2luZ2xlIGludGVyZmFjZSwgCisgICAgICAgICAgdGhlbiB0aGUgYnVzIG5hbWUsIG9iamVjdCBwYXRoLCBhbmQgaW50ZXJmYWNlIGxvb2sgCisgICAgICAgICAgcmVkdW5kYW50LiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgYSB0ZXh0IGVkaXRvciAKKyAgICAgICAgICB0aGF0IHVzZXMgdGhlIGJ1cyBuYW1lIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yPC9saXRlcmFsPiwKKyAgICAgICAgICBoYXMgYSBnbG9iYWwgc2luZ2xldG9uIG9iamVjdCBjYWxsZWQgCisgICAgICAgICAgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9UZXh0RWRpdG9yPC9saXRlcmFsPiwgYW5kIAorICAgICAgICAgIHRoYXQgc2luZ2xldG9uIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvcjwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgYSB0ZXh0IGVkaXRvciBhcHBsaWNhdGlvbiBjb3VsZCBhcyBlYXNpbHkgb3duIG11bHRpcGxlIGJ1cworICAgICAgICAgIG5hbWVzIChmb3IgZXhhbXBsZSwgPGxpdGVyYWw+b3JnLmtkZS5LV3JpdGU8L2xpdGVyYWw+IGluIGFkZGl0aW9uIHRvCisgICAgICAgICAgZ2VuZXJpYyA8bGl0ZXJhbD5UZXh0RWRpdG9yPC9saXRlcmFsPiksIGhhdmUgbXVsdGlwbGUgb2JqZWN0cyAobWF5YmUKKyAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2tkZS9kb2N1bWVudHMvNDM1MjwvbGl0ZXJhbD4gd2hlcmUgdGhlIG51bWJlciBjaGFuZ2VzCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudCksIGFuZCBlYWNoIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgbXVsdGlwbGUKKyAgICAgICAgICBpbnRlcmZhY2VzLCBzdWNoIGFzIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9saXRlcmFsPiwKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuQmFzaWNUZXh0RmllbGQ8L2xpdGVyYWw+LAorICAgICAgICAgIDxsaXRlcmFsPm9yZy5rZGUuUmljaFRleHREb2N1bWVudDwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworCisgICAgPHFhbmRhZW50cnkgaWQ9InNlcnZpY2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGF0IGlzIGEgInNlcnZpY2UiPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBzZXJ2aWNlIGlzIGEgcHJvZ3JhbSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBieSB0aGUgYnVzIGRhZW1vbiAKKyAgICAgICAgICB0byBwcm92aWRlIHNvbWUgZnVuY3Rpb25hbGl0eSB0byBvdGhlciBwcm9ncmFtcy4gU2VydmljZXMKKyAgICAgICAgICBhcmUgbm9ybWFsbHkgbGF1bmNoZWQgYWNjb3JkaW5nIHRvIHRoZSBidXMgbmFtZSB0aGV5IHdpbGwgCisgICAgICAgICAgaGF2ZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBQZW9wbGUgb2Z0ZW4gbWlzdXNlIHRoZSB3b3JkICJzZXJ2aWNlIiBmb3IgYW55IAorICAgICAgICAgIGJ1cyBuYW1lLCBidXQgdGhpcyB0ZW5kcyB0byBiZSBhbWJpZ3VvdXMgYW5kIGNvbmZ1c2luZyBzbyBpcyBkaXNjb3VyYWdlZC4KKyAgICAgICAgICBJbiB0aGUgRC1CdXMgZG9jcyB3ZSB0cnkgdG8gdXNlICJzZXJ2aWNlIiBvbmx5IHdoZW4gdGFsa2luZyBhYm91dCAKKyAgICAgICAgICBwcm9ncmFtcyB0aGUgYnVzIGtub3dzIGhvdyB0byBsYXVuY2gsIGkuZS4gYSBzZXJ2aWNlIGFsd2F5cyBoYXMgYSAKKyAgICAgICAgICAuc2VydmljZSBmaWxlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeSBpZD0iY29tcG9uZW50cyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElzIEQtQnVzIGEgImNvbXBvbmVudCBzeXN0ZW0iPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXQgaGVscHMgdG8ga2VlcCB0aGVzZSBjb25jZXB0cyBzZXBhcmF0ZSBpbiB5b3VyIG1pbmQ6CisgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPYmplY3QvY29tcG9uZW50IHN5c3RlbQorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBHVUkgY29udHJvbC93aWRnZXQgZW1iZWRkaW5nIGludGVyZmFjZXMKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gc3lzdGVtIG9yIHdpcmUgcHJvdG9jb2wKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIG5vdCBhIGNvbXBvbmVudCBzeXN0ZW0uICJDb21wb25lbnQgc3lzdGVtIiB3YXMgb3JpZ2luYWxseQorICAgICAgICAgIGRlZmluZWQgYnkgQ09NLCBhbmQgd2FzIGVzc2VudGlhbGx5IGEgd29ya2Fyb3VuZCBmb3IgdGhlIGxpbWl0YXRpb25zCisgICAgICAgICAgb2YgdGhlIEMrKyBvYmplY3Qgc3lzdGVtIChhZGRpbmcgaW50cm9zcGVjdGlvbiwgcnVudGltZSBsb2NhdGlvbiBvZgorICAgICAgICAgIG9iamVjdHMsIEFCSSBndWFyYW50ZWVzLCBhbmQgc28gZm9ydGgpLiBXaXRoIHRoZSBDIyBsYW5ndWFnZSBhbmQgQ0xSLAorICAgICAgICAgIE1pY3Jvc29mdCBhZGRlZCB0aGVzZSBmZWF0dXJlcyB0byB0aGUgcHJpbWFyeSBvYmplY3Qgc3lzdGVtLCBsZWF2aW5nCisgICAgICAgICAgQ09NIG9ic29sZXRlLiBTaW1pbGFybHksIEphdmEgaGFzIG11Y2ggbGVzcyBuZWVkIGZvciBzb21ldGhpbmcgbGlrZQorICAgICAgICAgIENPTSB0aGFuIEMrKyBkaWQuIEV2ZW4gUU9iamVjdCAoZnJvbSBRdCkgYW5kIEdPYmplY3QgKGZyb20gR0xpYikgb2ZmZXIKKyAgICAgICAgICBzb21lIG9mIHRoZSBzYW1lIGZlYXR1cmVzIGZvdW5kIGluIENPTS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb21wb25lbnQgc3lzdGVtcyBhcmUgbm90IGFib3V0IEdVSSBjb250cm9sIGVtYmVkZGluZy4gRW1iZWRkaW5nCisgICAgICAgICAgYSBzcHJlYWRzaGVldCBpbiBhIHdvcmQgcHJvY2Vzc29yIGRvY3VtZW50IGlzIGEgbWF0dGVyIG9mIGRlZmluaW5nCisgICAgICAgICAgc29tZSBzcGVjaWZpYyA8ZW1waGFzaXM+aW50ZXJmYWNlczwvZW1waGFzaXM+IHRoYXQgb2JqZWN0cworICAgICAgICAgIGNhbiBpbXBsZW1lbnQuIFRoZXNlIGludGVyZmFjZXMgcHJvdmlkZSBtZXRob2RzIHJlbGF0ZWQgdG8gCisgICAgICAgICAgR1VJIGNvbnRyb2xzLiBTbyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRob3NlIGludGVyZmFjZXMgCisgICAgICAgICAgY2FuIGJlIGVtYmVkZGVkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSB3b3JkICJjb21wb25lbnQiIGp1c3QgbWVhbnMgIm9iamVjdCB3aXRoIHNvbWUgZmFuY3kgZmVhdHVyZXMiIGFuZAorICAgICAgICAgIGluIG1vZGVybiBsYW5ndWFnZXMgYWxsIG9iamVjdHMgYXJlIGVmZmVjdGl2ZWx5ICJjb21wb25lbnRzLiIKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTbyBjb21wb25lbnRzIGFyZSBmYW5jeSBvYmplY3RzLCBhbmQgc29tZSBvYmplY3RzIGFyZSBHVUkgY29udHJvbHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSB0aGlyZCwgdW5yZWxhdGVkIGZlYXR1cmUgaXMgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gb3IgSVBDLgorICAgICAgICAgIEQtQnVzIGlzIGFuIElQQyBzeXN0ZW0uIEdpdmVuIGFuIG9iamVjdCAob3IgImNvbXBvbmVudCIgaWYgeW91IG11c3QpLCAKKyAgICAgICAgICB5b3UgY2FuIGV4cG9zZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGF0IG9iamVjdCBvdmVyIGFuIElQQyBzeXN0ZW0uCisgICAgICAgICAgRXhhbXBsZXMgb2YgSVBDIHN5c3RlbXMgYXJlIERDT00sIENPUkJBLCBTT0FQLCBYTUwtUlBDLCBhbmQgRC1CdXMuCisgICAgICAgICAgWW91IGNhbiB1c2UgYW55IG9mIHRoZXNlIElQQyBzeXN0ZW1zIHdpdGggYW55IG9iamVjdC9jb21wb25lbnQgc3lzdGVtLAorICAgICAgICAgIHRob3VnaCBzb21lIG9mIHRoZW0gYXJlICJ0dW5lZCIgZm9yIHNwZWNpZmljIG9iamVjdCBzeXN0ZW1zLgorICAgICAgICAgIFlvdSBjYW4gdGhpbmsgb2YgYW4gSVBDIHN5c3RlbSBwcmltYXJpbHkgYXMgYSB3aXJlIHByb3RvY29sLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSBjb21iaW5lIGFuIElQQyBzeXN0ZW0gd2l0aCBhIHNldCBvZiBHVUkgY29udHJvbCBpbnRlcmZhY2VzLCAKKyAgICAgICAgICB0aGVuIHlvdSBjYW4gaGF2ZSBhbiBvdXQtb2YtcHJvY2VzcyBvciBkeW5hbWljYWxseS1sb2FkZWQgR1VJIGNvbnRyb2wuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW5vdGhlciByZWxhdGVkIGNvbmNlcHQgaXMgdGhlIDxmaXJzdHRlcm0+cGx1Z2luPC9maXJzdHRlcm0+IG9yCisgICAgICAgICAgPGZpcnN0dGVybT5leHRlbnNpb248L2ZpcnN0dGVybT4uICBHZW5lcmljIHBsdWdpbiBzeXN0ZW1zIHN1Y2ggYXMgdGhlCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnIj5FY2xpcHNlPC91bGluaz4gc3lzdGVtIGFyZSBub3Qgc28gZGlmZmVyZW50CisgICAgICAgICAgZnJvbSBjb21wb25lbnQvb2JqZWN0IHN5c3RlbXMsIHRob3VnaCBwZXJoYXBzIGEgInBsdWdpbiIgdGVuZHMgdG8gYmUgYQorICAgICAgICAgIGJ1bmRsZSBvZiBvYmplY3RzIHdpdGggYSB1c2VyLXZpc2libGUgbmFtZSBhbmQgY2FuIGJlCisgICAgICAgICAgZG93bmxvYWRlZC9wYWNrYWdlZCBhcyBhIHVuaXQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5IGlkPSJzcGVlZCI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBmYXN0IGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPZiBjb3Vyc2UgaXQgZGVwZW5kcyBhIGJpdCBvbiB3aGF0IHlvdSdyZSBkb2luZy4gCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9waXBlcm1haWwvZGJ1cy8yMDA0LU5vdmVtYmVyLzAwMTc3OS5odG1sIj4KKyAgICAgICAgICAgIFRoaXMgbWFpbDwvdWxpbms+IGNvbnRhaW5zIHNvbWUgYmVuY2htYXJraW5nLiAgQXQgdGhlIHRpbWUgb2YgdGhhdAorICAgICAgICAgIGJlbmNobWFyaywgRC1CdXMgb25lLXRvLW9uZSBjb21tdW5pY2F0aW9uIHdhcyBhYm91dCAyLjV4IHNsb3dlciB0aGFuCisgICAgICAgICAgc2ltcGx5IHB1c2hpbmcgdGhlIGRhdGEgcmF3IG92ZXIgYSBzb2NrZXQuIEFmdGVyIHRoZSByZWNlbnQgcmV3cml0ZSBvZgorICAgICAgICAgIHRoZSBtYXJzaGFsaW5nIGNvZGUsIEQtQnVzIGlzIHNsb3dlciB0aGFuIHRoYXQgYmVjYXVzZSBhIGxvdCBvZgorICAgICAgICAgIG9wdGltaXphdGlvbiB3b3JrIHdhcyBsb3N0LiBCdXQgaXQgY2FuIHByb2JhYmx5IGJlIHNwZWQgdXAgYWdhaW4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBpbnRlcm1lZGlhdGUgYnVzIGRhZW1vbiBzaG91bGQgYmUgCisgICAgICAgICAgKGFuZCBhcyBsYXN0IHByb2ZpbGVkLCB3YXMpIGFib3V0IHR3aWNlIGFzIHNsb3cgYXMgb25lLXRvLW9uZSAKKyAgICAgICAgICBtb2RlLCBiZWNhdXNlIGEgcm91bmQgdHJpcCBpbnZvbHZlcyBmb3VyIHNvY2tldCByZWFkcy93cml0ZXMgcmF0aGVyIAorICAgICAgICAgIHRoYW4gdHdvIHNvY2tldCByZWFkcy93cml0ZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIG92ZXJoZWFkIGNvbWVzIGZyb20gYSBjb3VwbGUgb2YgcGxhY2VzOyBwYXJ0IG9mIGl0IGlzIHNpbXBseSAKKyAgICAgICAgICAiYWJzdHJhY3Rpb24gcGVuYWx0eSIgKHRoZXJlIGFyZSBsYXllcnMgb2YgY29kZSB0byBzdXBwb3J0IAorICAgICAgICAgIG11bHRpcGxlIG1haW4gbG9vcHMsIG11bHRpcGxlIHRyYW5zcG9ydCB0eXBlcywgc2VjdXJpdHksIGV0Yy4pLgorICAgICAgICAgIFByb2JhYmx5IHRoZSBsYXJnZXN0IHBhcnQgY29tZXMgZnJvbSBkYXRhIHZhbGlkYXRpb24KKyAgICAgICAgICAoYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHRydXN0IGluY29taW5nIGRhdGEpLgorICAgICAgICAgIEl0IHdvdWxkIGJlIHNpbXBsZSB0byBhZGQgYSAibm8gdmFsaWRhdGlvbiIgbW9kZSwgYnV0IHByb2JhYmx5IAorICAgICAgICAgIG5vdCBhIGdvb2QgaWRlYSBhbGwgdGhpbmdzIGNvbnNpZGVyZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmF3IGJhbmR3aWR0aCBpc24ndCB0aGUgb25seSBjb25jZXJuOyBELUJ1cyBpcyBkZXNpZ25lZCB0byAKKyAgICAgICAgICBlbmFibGUgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gYW5kIGF2b2lkIHJvdW5kIHRyaXBzLgorICAgICAgICAgIFRoaXMgaXMgZnJlcXVlbnRseSBhIG1vcmUgaW1wb3J0YW50IHBlcmZvcm1hbmNlIGlzc3VlIAorICAgICAgICAgIHRoYW4gdGhyb3VnaHB1dC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisKKyAgICA8cWFuZGFlbnRyeSBpZD0ic2l6ZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBsYXJnZSBpcyB0aGUgRC1CdXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBwcm9kdWN0aW9uIGJ1aWxkICh3aXRoIGFzc2VydGlvbnMsIHVuaXQgdGVzdHMsIGFuZCB2ZXJib3NlIGxvZ2dpbmcKKyAgICAgICAgICBkaXNhYmxlZCkgaXMgb24gdGhlIG9yZGVyIG9mIGEgMTUwSyBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIG11Y2gsIG11Y2ggc21hbGxlciBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSBwb3NzaWJsZSBieSBvbWl0dGluZyBvdXQKKyAgICAgICAgICBvZiBtZW1vcnkgaGFuZGxpbmcsIGhhcmRjb2RpbmcgYSBtYWluIGxvb3AgKG9yIGFsd2F5cyB1c2luZyBibG9ja2luZworICAgICAgICAgIEkvTyksIHNraXBwaW5nIHZhbGlkYXRpb24sIGFuZCBvdGhlcndpc2Ugc2ltcGxpZnlpbmcgdGhpbmdzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisgICAgCisgICAgPHFhbmRhZW50cnkgaWQ9Im90aGVyLWlwYyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIG90aGVyIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uCisgICAgICAgICAgb3IgbmV0d29ya2luZyBwcm90b2NvbHM/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBLZWVwIGluIG1pbmQsIGl0IGlzIG5vdCBvbmx5IGFuIElQQyBzeXN0ZW07IGl0IGFsc28gaW5jbHVkZXMKKyAgICAgICAgICBsaWZlY3ljbGUgdHJhY2tpbmcsIHNlcnZpY2UgYWN0aXZhdGlvbiwgc2VjdXJpdHkgcG9saWN5LCBhbmQgb3RoZXIKKyAgICAgICAgICBoaWdoZXItbGV2ZWwgc3RydWN0dXJlIGFuZCBhc3N1bXB0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgYmVzdCBwbGFjZSB0byBzdGFydCBpcyB0byByZWFkIHRoZSBELUJ1cyA8dWxpbmsgdXJsPSJkYnVzLXR1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC91bGluaz4sIHNvIAorICAgICAgICAgIHlvdSBoYXZlIGEgY29uY3JldGUgaWRlYSB3aGF0IEQtQnVzIGFjdHVhbGx5IGlzLiBJZiB5b3UgCisgICAgICAgICAgdW5kZXJzdGFuZCBvdGhlciBwcm90b2NvbHMgb24gYSB3aXJlIGZvcm1hdCBsZXZlbCwgeW91IAorICAgICAgICAgIG1heSBhbHNvIHdhbnQgdG8gcmVhZCB0aGUgRC1CdXMgPHVsaW5rIHVybD0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiPnNwZWNpZmljYXRpb248L3VsaW5rPiB0byBzZWUgd2hhdCAKKyAgICAgICAgICBELUJ1cyBsb29rcyBsaWtlIG9uIGEgbG93IGxldmVsLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIHRoZSA8dWxpbmsgdXJsPSJkYnVzLXR1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC91bGluaz4gYW5kIDx1bGluayB1cmw9ImRidXMtc3BlY2lmaWNhdGlvbi5odG1sIj5zcGVjaWZpY2F0aW9uPC91bGluaz4gYm90aCBleHBsYWluLCBELUJ1cyBpcyB0dW5lZCAKKyAgICAgICAgICBmb3Igc29tZSBzcGVjaWZpYyB1c2UgY2FzZXMuIFRodXMsIGl0IHByb2JhYmx5IGlzbid0IHR1bmVkIAorICAgICAgICAgIGZvciB3aGF0IHlvdSB3YW50IHRvIGRvLCB1bmxlc3MgeW91IGFyZSBkb2luZyB0aGUgdGhpbmdzIAorICAgICAgICAgIEQtQnVzIHdhcyBkZXNpZ25lZCBmb3IuIERvbid0IG1ha2UgdGhlIG1pc3Rha2Ugb2YgdGhpbmtpbmcgCisgICAgICAgICAgdGhhdCBhbnkgc3lzdGVtIGludm9sdmluZyAiSVBDIiBpcyB0aGUgc2FtZSB0aGluZy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgRC1CdXMgYXV0aG9ycyB3b3VsZCBub3QgcmVjb21tZW5kIHVzaW5nIEQtQnVzIAorICAgICAgICAgIGZvciBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGNvbXBhcmUgRC1CdXMgdG8gc29tZSBvdGhlciAKKyAgICAgICAgICBwcm90b2NvbHMgcHJpbWFyaWx5IHRvIGhlbHAgeW91IHVuZGVyc3RhbmQgRC1CdXMgCisgICAgICAgICAgYW5kIGRlY2lkZSB3aGV0aGVyIGl0J3MgYXBwcm9wcmlhdGU7IEQtQnVzIGlzIG5laXRoZXIgaW50ZW5kZWQKKyAgICAgICAgICBub3IgY2xhaW1lZCB0byBiZSB0aGUgcmlnaHQgY2hvaWNlIGZvciBldmVyeSBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnJpZGdlIEQtQnVzIHRvIG90aGVyIElQQyBzeXN0ZW1zLCAKKyAgICAgICAgICBqdXN0IGFzIEQtQnVzIGNhbiBiZSBicmlkZ2VkIHRvIG9iamVjdCBzeXN0ZW1zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGU6IHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgc3Vic2NyaWJlcnMgYXJlIDxlbXBoYXNpcz52ZXJ5IG11Y2ggbm90CisgICAgICAgICAgaW50ZXJlc3RlZDwvZW1waGFzaXM+IGluIGRlYmF0aW5nIHdoaWNoIElQQyBzeXN0ZW0gaXMgdGhlIE9uZSBUcnVlCisgICAgICAgICAgU3lzdGVtLiBTbyBpZiB5b3Ugd2FudCB0byBkaXNjdXNzIHRoYXQsIHBsZWFzZSB1c2UgYW5vdGhlciBmb3J1bS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+ICAgICAgCisgICAgPC9xYW5kYWVudHJ5PgorCisgICAgCisgICAgPHFhbmRhZW50cnkgaWQ9ImNvcmJhIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gQ09SQkE/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9tZy5vcmciPkNPUkJBPC91bGluaz4gaXMgZGVzaWduZWQgdG8gc3VwcG9ydAorICAgICAgICAgb2JqZWN0LW9yaWVudGVkIElQQyBiZXR3ZWVuIG9iamVjdHMsIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxpbmcKKyAgICAgICAgIHBhcmFtZXRlcnMgYXMgbmVjZXNzYXJ5LiBDT1JCQSBpcyBzdHJvbmdseSBzdXBwb3J0ZWQgYnkgdGhlIDx1bGluaworICAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm9tZy5vcmciPk9wZW4gTWFuYWdlbWVudCBHcm91cCAoT01HKTwvdWxpbms+LCB3aGljaAorICAgICAgICAgcHJvZHVjZXMgdmFyaW91cyBzdGFuZGFyZHMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGZvciBDT1JCQSBhbmQgaGFzCisgICAgICAgICB0aGUgYmFja2luZyBvZiBtYW55IGxhcmdlIG9yZ2FuaXphdGlvbnMuICBUaGVyZSBhcmUgbWFueSBDT1JCQSBPUkJzCisgICAgICAgICBhdmFpbGFibGUsIGJvdGggcHJvcHJpZXRhcnkgT1JCcyBhbmQgZnJlZSAvIG9wZW4gc291cmNlIHNvZnR3YXJlIE9SQnMKKyAgICAgICAgICh0aGUgbGF0dGVyIGluY2x1ZGUgPHVsaW5rCisgICAgICAgICB1cmw9Imh0dHA6Ly9vcmJpdC1yZXNvdXJjZS5zb3VyY2Vmb3JnZS5uZXQvIj5PUkJpdDwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgIHVybD0iaHR0cDovL3d3dy5taWNvLm9yZy8iPk1JQ088L3VsaW5rPiwgYW5kIDx1bGluaworICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnRoZWFjZW9yYi5jb20vIj5UaGUgQUNFIE9yYiAoVEFPKTwvdWxpbms+KS4gIE1hbnkKKyAgICAgICAgIG9yZ2FuaXphdGlvbnMgY29udGludWUgdG8gdXNlIENPUkJBIE9SQnMgZm9yIHZhcmlvdXMga2luZHMgb2YgSVBDLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEJvdGggR05PTUUgYW5kIEtERSBoYXZlIHVzZWQgQ09SQkEgYW5kIHRoZW4gbW92ZWQgYXdheSBmcm9tIGl0LiAgS0RFCisgICAgICAgICAgaGFkIG1vcmUgc3VjY2VzcyB3aXRoIGEgc3lzdGVtIGNhbGxlZCBEQ09QLCBhbmQgR05PTUUgbGF5ZXJlZCBhIHN5c3RlbQorICAgICAgICAgIGNhbGxlZCBCb25vYm8gb24gdG9wIG9mIENPUkJBLiBXaXRob3V0IGN1c3RvbSBleHRlbnNpb25zLCBDT1JCQSBkb2VzCisgICAgICAgICAgbm90IHN1cHBvcnQgbWFueSBvZiB0aGUgdGhpbmdzIG9uZSB3YW50cyB0byBkbyBpbiBhIGRlc2t0b3AKKyAgICAgICAgICBlbnZpcm9ubWVudCB3aXRoIHRoZSBHTk9NRS9LREUgYXJjaGl0ZWN0dXJlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENPUkJBIG9uIHRoZSBvdGhlciBoYW5kIGhhcyBhIG51bWJlciBvZiBmZWF0dXJlcyBvZiBpbnRlcmVzdCBmb3IKKyAgICAgICAgICBlbnRlcnByaXNlIGFuZCB3ZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQsIHRob3VnaCBYTUwgc3lzdGVtcyBzdWNoIGFzCisgICAgICAgICAgU09BUCBhcmUgdGhlIGxhdGVzdCBmYWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTGlrZSBELUJ1cywgQ09SQkEgdXNlcyBhIGZhc3QgYmluYXJ5IHByb3RvY29sIChJSU9QKS4gQm90aCBzeXN0ZW1zCisgICAgICAgICAgd29yayBpbiB0ZXJtcyBvZiBvYmplY3RzIGFuZCBtZXRob2RzLCBhbmQgaGF2ZSBjb25jZXB0cyBzdWNoIGFzCisgICAgICAgICAgIm9uZXdheSIgY2FsbHMuIE9ubHkgRC1CdXMgaGFzIGRpcmVjdCBzdXBwb3J0IGZvciAic2lnbmFscyIgYXMgaW4KKyAgICAgICAgICBHTGliL1F0IChvciBKYXZhIGxpc3RlbmVycywgb3IgQyMgZGVsZWdhdGVzKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBoYXJkY29kZXMgYW5kIHNwZWNpZmllcyBhIGxvdCBvZiB0aGluZ3MgdGhhdCBDT1JCQSBsZWF2ZXMgb3Blbi1lbmRlZCwKKyAgICAgICAgICBiZWNhdXNlIENPUkJBIGlzIG1vcmUgZ2VuZXJpYyBhbmQgRC1CdXMgaGFzIHR3byBzcGVjaWZpYyB1c2UtY2FzZXMgaW4gbWluZC4KKyAgICAgICAgICBUaGlzIG1ha2VzIEQtQnVzIGEgYml0IHNpbXBsZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgdW5saWtlIENPUkJBIEQtQnVzIGRvZXMgPGVtcGhhc2lzPm5vdDwvZW1waGFzaXM+IHNwZWNpZnkgdGhlCisgICAgICAgICAgQVBJIGZvciB0aGUgbGFuZ3VhZ2UgYmluZGluZ3MuIEluc3RlYWQsICJuYXRpdmUiIGJpbmRpbmdzIGFkYXB0ZWQKKyAgICAgICAgICBzcGVjaWZpY2FsbHkgdG8gdGhlIGNvbnZlbnRpb25zIG9mIGEgZnJhbWV3b3JrIHN1Y2ggYXMgUU9iamVjdCwKKyAgICAgICAgICBHT2JqZWN0LCBDIywgSmF2YSwgUHl0aG9uLCBldGMuIGFyZSBlbmNvdXJhZ2VkLiBUaGUgbGliZGJ1cyByZWZlcmVuY2UKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIGJhY2tlbmQgZm9yIGJpbmRpbmdzIG9mIHRoaXMKKyAgICAgICAgICBuYXR1cmUsIHJhdGhlciB0aGFuIHRvIGJlIHVzZWQgZGlyZWN0bHkuIFRoZSByYXRpb25hbGUgaXMgdGhhdCBhbiBJUEMKKyAgICAgICAgICBzeXN0ZW0gQVBJIHNob3VsZCBub3QgImxlYWsiIGFsbCBvdmVyIGEgcHJvZ3JhbTsgaXQgc2hvdWxkIGNvbWUgaW50bworICAgICAgICAgIHBsYXkgb25seSBqdXN0IGJlZm9yZSBkYXRhIGdvZXMgb3ZlciB0aGUgd2lyZS4gQXMgYW4gYXNpZGUsIE9NRyBpcworICAgICAgICAgIGFwcGFyZW50bHkgd29ya2luZyBvbiBhIHNpbXBsZXIgQysrIGJpbmRpbmcgZm9yIENPUkJBLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1hbnkgQ09SQkEgaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgT1JCaXQgYXJlIGZhc3RlciB0aGFuIHRoZSBsaWJkYnVzCisgICAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiAgT25lIHJlYXNvbiBpcyB0aGF0IEQtQnVzIGNvbnNpZGVycyBkYXRhCisgICAgICAgICAgZnJvbSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uIHRvIGJlIHVudHJ1c3RlZCBhbmQgZXh0ZW5zaXZlbHkKKyAgICAgICAgICB2YWxpZGF0ZXMgaXQuIEJ1dCBnZW5lcmFsbHkgc3BlYWtpbmcgb3RoZXIgcHJpb3JpdGllcyB3ZXJlIHBsYWNlZAorICAgICAgICAgIGFoZWFkIG9mIHJhdyBzcGVlZCBpbiB0aGUgbGliZGJ1cyBpbXBsZW1lbnRhdGlvbi4gQSBmYXN0IEQtQnVzCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gYWxvbmcgdGhlIGxpbmVzIG9mIE9SQml0IHNob3VsZCBiZSBwb3NzaWJsZSwgb2YgY291cnNlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9uIGEgbW9yZSB0cml2aWFsIG5vdGUsIEQtQnVzIGludm9sdmVzIHN1YnN0YW50aWFsbHkgZmV3ZXIgYWNyb255bXMKKyAgICAgICAgICB0aGFuIENPUkJBLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ4bWxycGNzb2FwIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gWE1MLVJQQyBhbmQgU09BUD8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAvIj5TT0FQPC91bGluaz4gYW5kIDx1bGluaworICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnhtbHJwYy5jb20iPlhNTC1SUEM8L3VsaW5rPiwgUlBDIGNhbGxzIGFyZSB0cmFuc2Zvcm1lZAorICAgICAgICAgIGludG8gYW4gWE1MLWJhc2VkIGZvcm1hdCwgdGhlbiBzZW50IG92ZXIgdGhlIHdpcmUgKHR5cGljYWxseSB1c2luZyB0aGUKKyAgICAgICAgICBIVFRQIHByb3RvY29sKSwgd2hlcmUgdGhleSBhcmUgcHJvY2Vzc2VkIGFuZCByZXR1cm5lZC4gIFhNTC1SUEMgaXMgdGhlCisgICAgICAgICAgc2ltcGxlIHByb3RvY29sIChpdHMgc3BlYyBpcyBvbmx5IGEgcGFnZSBvciB0d28pLCBhbmQgU09BUCBpcyB0aGUKKyAgICAgICAgICBmdWxsLWZlYXR1cmVkIHByb3RvY29sLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFhNTC1SUEMgYW5kIFNPQVAgaW1wb3NlIFhNTCBwYXJzaW5nIG92ZXJoZWFkIHRoYXQgaXMgbm9ybWFsbHkKKyAgICAgICAgICBpcnJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBJbnRlcm5ldCwgYnV0IHNpZ25pZmljYW50IGZvcgorICAgICAgICAgIGNvbnN0YW50IGZpbmUtZ3JhaW5lZCBJUEMgYW1vbmcgYXBwbGljYXRpb25zIGluIGEgZGVza3RvcCBzZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIG9mZmVycyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCB3aXRoIHRoZSBidXMgZGFlbW9uIAorICAgICAgICAgIHN1cHBvcnRzIGxpZmVjeWNsZSB0cmFja2luZyBvZiBvdGhlciBhcHBsaWNhdGlvbnMgY29ubmVjdGVkCisgICAgICAgICAgdG8gdGhlIGJ1cy4gV2l0aCBYTUwtUlBDIGFuZCBTT0FQLCB0eXBpY2FsbHkgZWFjaCBtZXRob2QgY2FsbCAKKyAgICAgICAgICBleGlzdHMgaW4gaXNvbGF0aW9uIGFuZCBoYXMgaXRzIG93biBIVFRQIGNvbm5lY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5IGlkPSJkY2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ0U/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvZGNlLyI+RGlzdHJpYnV0ZWQgQ29tcHV0aW5nCisgICAgICAgICAgRW52aXJvbm1lbnQgKERDRSk8L3VsaW5rPiBpcyBhbiBpbmR1c3RyeS1zdGFuZGFyZCB2ZW5kb3ItbmV1dHJhbAorICAgICAgICAgIHN0YW5kYXJkIHRoYXQgaW5jbHVkZXMgYW4gSVBDIG1lY2hhbmlzbS4gIDx1bGluaworICAgICAgICAgIHVybD0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL2NvbW0vcHJlc3MvMDUtMDEtMTIuaHRtIj5UaGUgT3BlbiBHcm91cAorICAgICAgICAgIGhhcyByZWxlYXNlZCBhbiBpbXBsZW1lbnRhdGlvbiBhcyBvcGVuIHNvdXJjZSBzb2Z0d2FyZTwvdWxpbms+LiAgRENFCisgICAgICAgICAgaXMgcXVpdGUgY2FwYWJsZSwgYW5kIGluY2x1ZGVzIGEgdmFzdCBhbW91bnQgb2YgZnVuY3Rpb25hbGl0eSBzdWNoIGFzCisgICAgICAgICAgYSBkaXN0cmlidXRlZCB0aW1lIHNlcnZpY2UuICBBcyB0aGUgbmFtZSBpbXBsaWVzLCBEQ0UgaXMgaW50ZW5kZWQgZm9yCisgICAgICAgICAgdXNlIGluIGEgbGFyZ2UsIG11bHRpLWNvbXB1dGVyIGRpc3RyaWJ1dGVkIGFwcGxpY2F0aW9uLiBELUJ1cyB3b3VsZAorICAgICAgICAgIG5vdCBiZSB3ZWxsLXN1aXRlZCBmb3IgdGhpcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworCisgICAgPHFhbmRhZW50cnkgaWQ9ImRjb20iPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09NIGFuZCBDT00/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb21wYXJpbmcgRC1CdXMgdG8gQ09NIGlzIGFwcGxlcyBhbmQgb3JhbmdlczsgCisgICAgICAgICAgc2VlIDx4cmVmIGxpbmtlbmQ9ImNvbXBvbmVudHMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRENPTSAoZGlzdHJpYnV0ZWQgQ09NKSBpcyBhIFdpbmRvd3MgSVBDIHN5c3RlbSBkZXNpZ25lZCBmb3IgdXNlIHdpdGgKKyAgICAgICAgICB0aGUgQ09NIG9iamVjdCBzeXN0ZW0uIEl0J3Mgc2ltaWxhciBpbiBzb21lIHdheXMgdG8gRENFIGFuZCBDT1JCQS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworICAgIDxxYW5kYWVudHJ5IGlkPSJpbnRlcm5ldC1jb21tdW5pY2F0aW9ucy1lbmdpbmUiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBaZXJvQydzIEludGVybmV0IENvbW11bmljYXRpb25zIEVuZ2luZSAoSWNlKQorICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuemVyb2MuY29tL2ljZS5odG1sIj4gSW50ZXJuZXQKKyAgICAgICAgICBDb21tdW5pY2F0aW9ucyBFbmdpbmUgKEljZSk8L3VsaW5rPiBpcyBhIHBvd2VyZnVsIElQQyBtZWNoYW5pc20gbW9yZQorICAgICAgICAgIG9uIHRoZSBsZXZlbCBvZiBTT0FQIG9yIENPUkJBIHRoYW4gRC1CdXMuICBJY2UgaGFzIGEgImR1YWwtbGljZW5zZSIKKyAgICAgICAgICBidXNpbmVzcyBhcm91bmQgaXQ7IGkuZS4geW91IGNhbiB1c2UgaXQgdW5kZXIgdGhlIEdQTCwgb3IgcGF5IGZvciBhCisgICAgICAgICAgcHJvcHJpZXRhcnkgbGljZW5zZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworICAgIDxxYW5kYWVudHJ5IGlkPSJpbnRlci1jbGllbnQtZXhjaGFuZ2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBJbnRlci1DbGllbnQgRXhjaGFuZ2UgKElDRSk/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lngub3JnL1gxMVI2LjguMS9kb2NzL0lDRS9pY2UucGRmIj5JQ0U8L3VsaW5rPgorICAgICAgICAgIHdhcyBkZXZlbG9wZWQgZm9yIHRoZSBYIFNlc3Npb24gTWFuYWdlbWVudCBwcm90b2NvbCAoWFNNUCksIGFzIHBhcnQgb2YKKyAgICAgICAgICB0aGUgWCBXaW5kb3cgU3lzdGVtIChYMTFSNi4xKS4gVGhlIGlkZWEgd2FzIHRvIGFsbG93IGRlc2t0b3Agc2Vzc2lvbnMKKyAgICAgICAgICB0byBjb250YWluIG5vbmdyYXBoaWNhbCBjbGllbnRzIGluIGFkZGl0aW9uIHRvIFggY2xpZW50cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJQ0UgaXMgYSBiaW5hcnkgcHJvdG9jb2wgZGVzaWduZWQgZm9yIGRlc2t0b3AgdXNlLCBhbmQgS0RFJ3MgRENPUAorICAgICAgICAgIGJ1aWxkcyBvbiBJQ0UuICBJQ0UgaXMgc3Vic3RhbnRpYWxseSBzaW1wbGVyIHRoYW4gRC1CdXMgKGluIGNvbnRyYXN0CisgICAgICAgICAgdG8gbW9zdCBvZiB0aGUgb3RoZXIgSVBDIHN5c3RlbXMgbWVudGlvbmVkIGhlcmUsIHdoaWNoIGFyZSBtb3JlCisgICAgICAgICAgY29tcGxleCkuIElDRSBkb2Vzbid0IHJlYWxseSBkZWZpbmUgYSBtYXBwaW5nIHRvIG9iamVjdHMgYW5kIG1ldGhvZHMKKyAgICAgICAgICAoRENPUCBhZGRzIHRoYXQgbGF5ZXIpLiAgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBJQ0UgKGxpYklDRSkKKyAgICAgICAgICBpcyBvZnRlbiBjb25zaWRlcmVkIHRvIGJlIGhvcnJpYmxlIChhbmQgaG9ycmlibHkgaW5zZWN1cmUpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIERDT1AgYW5kIFhTTVAgYXJlIHRoZSBvbmx5IHR3byB3aWRlbHktdXNlZCBhcHBsaWNhdGlvbnMgb2YgSUNFLAorICAgICAgICAgIGFuZCBib3RoIGNvdWxkIGluIHByaW5jaXBsZSBiZSByZXBsYWNlZCBieSBELUJ1cy4gKFRob3VnaCB3aGV0aGVyIAorICAgICAgICAgIEdOT01FIGFuZCBLREUgd2lsbCBib3RoZXIgaXMgYW4gb3BlbiBxdWVzdGlvbi4pCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIAorCisgICAgPHFhbmRhZW50cnkgaWQ9ImRjb3AiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09QPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgaXMgaW50ZW50aW9uYWxseSBwcmV0dHkgc2ltaWxhciB0byA8dWxpbmsKKyAgICAgICAgICB1cmw9Imh0dHA6Ly9kZXZlbG9wZXIua2RlLm9yZy9kb2N1bWVudGF0aW9uL2xpYnJhcnkva2RlcXQvZGNvcC5odG1sIj5EQ09QPC91bGluaz4sCisgICAgICAgICAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgIkRDT1AgdGhlIG5leHQgZ2VuZXJhdGlvbiIgc3VpdGFibGUgZm9yIAorICAgICAgICAgIHNoYXJpbmcgYmV0d2VlbiB0aGUgdmFyaW91cyBvcGVuIHNvdXJjZSBkZXNrdG9wIHByb2plY3RzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIGEgYml0IG1vcmUgY29tcGxleCB0aGFuIERDT1AsIHRob3VnaCB0aGUgUXQgYmluZGluZyBmb3IgRC1CdXMKKyAgICAgICAgICBzaG91bGQgbm90IGJlIG1vcmUgY29tcGxleCBmb3IgcHJvZ3JhbW1lcnMuIFRoZSBhZGRpdGlvbmFsIGNvbXBsZXhpdHkKKyAgICAgICAgICBvZiBELUJ1cyBhcmlzZXMgZnJvbSBpdHMgc2VwYXJhdGlvbiBvZiBvYmplY3QgcmVmZXJlbmNlcyB2cy4gYnVzIG5hbWVzCisgICAgICAgICAgdnMuIGludGVyZmFjZXMgYXMgZGlzdGluY3QgY29uY2VwdHMsIGFuZCBpdHMgc3VwcG9ydCBmb3Igb25lLXRvLW9uZQorICAgICAgICAgIGNvbm5lY3Rpb25zIGluIGFkZGl0aW9uIHRvIGNvbm5lY3Rpb25zIG92ZXIgdGhlIGJ1cy4gVGhlIGxpYmRidXMKKyAgICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIGEgbG90IG9mIEFQSSB0byBzdXBwb3J0IG11bHRpcGxlIGJpbmRpbmdzCisgICAgICAgICAgYW5kIG1haW4gbG9vcHMsIGFuZCBwZXJmb3JtcyBkYXRhIHZhbGlkYXRpb24gYW5kIG91dC1vZi1tZW1vcnkgaGFuZGxpbmcgCisgICAgICAgICAgaW4gb3JkZXIgdG8gc3VwcG9ydCBzZWN1cmUgYXBwbGljYXRpb25zIHN1Y2ggYXMgdGhlIHN5c3RlbXdpZGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIHByb2JhYmx5IHNvbWV3aGF0IHNsb3dlciB0aGFuIERDT1AgZHVlIHRvIGRhdGEgdmFsaWRhdGlvbiAKKyAgICAgICAgICBhbmQgbW9yZSAibGF5ZXJzIiBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBBIGNvbXBhcmlzb24gCisgICAgICAgICAgaGFzbid0IGJlZW4gcG9zdGVkIHRvIHRoZSBsaXN0IHRob3VnaC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBdCB0aGlzIHRpbWUsIEtERSBoYXMgbm90IGNvbW1pdHRlZCB0byB1c2luZyBELUJ1cywgYnV0IHRoZXJlIGhhdmUKKyAgICAgICAgICBiZWVuIGRpc2N1c3Npb25zIG9mIEtERSBicmlkZ2luZyBELUJ1cyBhbmQgRENPUCwgb3IgZXZlbiBjaGFuZ2luZworICAgICAgICAgIERDT1AncyBpbXBsZW1lbnRhdGlvbiB0byB1c2UgRC1CdXMgaW50ZXJuYWxseSAoc28gdGhhdCBHTk9NRSBhbmQgS0RFCisgICAgICAgICAgd291bGQgZW5kIHVwIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgYnVzKS4gU2VlIHRoZSBLREUgbWFpbGluZyBsaXN0IAorICAgICAgICAgIGFyY2hpdmVzIGZvciBzb21lIG9mIHRoZXNlIGRpc2N1c3Npb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ5ZXQtbW9yZS1pcGMiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBbeWV0IG1vcmUgSVBDIG1lY2hhbmlzbXNdPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlcmUgYXJlIGNvdW50bGVzcyB1c2VzIG9mIG5ldHdvcmsgc29ja2V0cyBpbiB0aGUgd29ybGQuICA8dWxpbmsKKyAgICAgICAgICB1cmw9Imh0dHA6Ly93d3cubWJ1cy5vcmcvIj5NQlVTPC91bGluaz4sIFN1biBPTkMvUlBDLCBKYWJiZXIvWE1QUCwKKyAgICAgICAgICBTSVAsIGFyZSBzb21lIHdlIGNhbiB0aGluayBvZiBxdWlja2x5LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ3aGljaC1pcGMiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGljaCBJUEMgbWVjaGFuaXNtIHNob3VsZCBJIHVzZT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSdyZSB3cml0aW5nIGFuIEludGVybmV0IG9yIEludHJhbmV0IGFwcGxpY2F0aW9uLCBYTUwtUlBDIG9yIFNPQVAKKyAgICAgICAgICB3b3JrIGZvciBtYW55IHBlb3BsZS4gVGhlc2UgYXJlIHN0YW5kYXJkLCBhdmFpbGFibGUgZm9yIG1vc3QKKyAgICAgICAgICBsYW5ndWFnZXMsIHNpbXBsZSB0byBkZWJ1ZyBhbmQgZWFzeSB0byB1c2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91J3JlIHdyaXRpbmcgYSBkZXNrdG9wIGFwcGxpY2F0aW9uIGZvciBVTklYLCAKKyAgICAgICAgICB0aGVuIEQtQnVzIGlzIG9mIGNvdXJzZSBvdXIgcmVjb21tZW5kYXRpb24gZm9yIAorICAgICAgICAgIHRhbGtpbmcgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGRlc2t0b3Agc2Vzc2lvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBpcyBhbHNvIGRlc2lnbmVkIGZvciBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHN5c3RlbSBkYWVtb25zIGFuZAorICAgICAgICAgIGNvbW11bmljYXRpb25zIGJldHdlZW4gdGhlIGRlc2t0b3AgYW5kIHN5c3RlbSBkYWVtb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgY29tcGxpY2F0ZWQgc3VjaCBhcyBjbHVzdGVyaW5nLCAKKyAgICAgICAgICBkaXN0cmlidXRlZCBzd2FybXMsIHBlZXItdG8tcGVlciwgb3Igd2hhdGV2ZXIgdGhlbiAKKyAgICAgICAgICB0aGUgYXV0aG9ycyBvZiB0aGlzIEZBUSBkb24ndCBoYXZlIGV4cGVydGlzZSBpbiB0aGVzZQorICAgICAgICAgIGFyZWFzIGFuZCB5b3Ugc2hvdWxkIGFzayBzb21lb25lIGVsc2Ugb3IgdHJ5IGEgc2VhcmNoIGVuZ2luZS4KKyAgICAgICAgICBELUJ1cyBpcyBtb3N0IGxpa2VseSBhIHBvb3IgY2hvaWNlIGJ1dCBjb3VsZCBiZSBhcHByb3ByaWF0ZQorICAgICAgICAgIGZvciBzb21lIHRoaW5ncy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBOb3RlOiB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IGlzIHByb2JhYmx5IG5vdCB0aGUgcGxhY2UgdG8gCisgICAgICAgICAgZGlzY3VzcyB3aGljaCBzeXN0ZW0gaXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIAorICAgICAgICAgIHRob3VnaCB5b3UgYXJlIHdlbGNvbWUgdG8gYXNrIHNwZWNpZmljIHF1ZXN0aW9ucyBhYm91dCAKKyAgICAgICAgICBELUJ1cyA8ZW1waGFzaXM+YWZ0ZXIgcmVhZGluZyB0aGlzIEZBUSwgdGhlIHR1dG9yaWFsLCBhbmQgCisgICAgICAgICAgICBzZWFyY2hpbmcgdGhlIGxpc3QgYXJjaGl2ZXM8L2VtcGhhc2lzPi4gVGhlIGJlc3Qgd2F5IAorICAgICAgICAgIHRvIHNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyBpcyBwcm9iYWJseSB0byB1c2UgCisgICAgICAgICAgYW4gSW50ZXJuZXQgZW5naW5lIHN1Y2ggYXMgR29vZ2xlLiBPbiBHb29nbGUsIAorICAgICAgICAgIGluY2x1ZGUgInNpdGU6ZnJlZWRlc2t0b3Aub3JnIiBpbiB5b3VyIHNlYXJjaC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGNhbiBJIHN1Ym1pdCBhIGJ1ZyBvciBwYXRjaD8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBELUJ1cyA8dWxpbmsgdXJsPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciPndlYiBzaXRlPC91bGluaz4KKyAgICAgICAgICBoYXMgYSBsaW5rIHRvIHRoZSBidWcgdHJhY2tlciwgd2hpY2ggaXMgdGhlIGJlc3QgcGxhY2UgdG8gc3RvcmUKKyAgICAgICAgICBwYXRjaGVzLiAgWW91IGNhbiBhbHNvIHBvc3QgdGhlbSB0byB0aGUgbGlzdCwgZXNwZWNpYWxseSBpZiB5b3Ugd2FudAorICAgICAgICAgIHRvIGRpc2N1c3MgdGhlIHBhdGNoIG9yIGdldCBmZWVkYmFjay4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisgIDwvcWFuZGFzZXQ+CisKKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLWxhdW5jaC4xIGIvZG9jL2RidXMtbGF1bmNoLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyYTNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLWxhdW5jaC4xCkBAIC0wLDAgKzEsMjExIEBACisuXCIgCisuXCIgZGJ1c1wtbGF1bmNoIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC1sYXVuY2ggMQorLlNIIE5BTUUKK2RidXNcLWxhdW5jaCBcLSBVdGlsaXR5IHRvIHN0YXJ0IGEgbWVzc2FnZSBidXMgZnJvbSBhIHNoZWxsIHNjcmlwdAorLlNIIFNZTk9QU0lTCisuUFAKKy5CIGRidXNcLWxhdW5jaCBbXC1cLXZlcnNpb25dIFtcLVwtc2hcLXN5bnRheF0gW1wtXC1jc2hcLXN5bnRheF0gW1wtXC1hdXRvXC1zeW50YXhdIFtcLVwtZXhpdFwtd2l0aFwtc2Vzc2lvbl0gW1wtXC1hdXRvbGF1bmNoPU1BQ0hJTkVJRF0gW1wtXC1jb25maWdcLWZpbGU9RklMRU5BTUVdIFtQUk9HUkFNXSBbQVJHUy4uLl0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzXC1sYXVuY2hcZlAgY29tbWFuZCBpcyB1c2VkIHRvIHN0YXJ0IGEgc2Vzc2lvbiBidXMgCitpbnN0YW5jZSBvZiBcZklkYnVzXC1kYWVtb25cZlAgZnJvbSBhIHNoZWxsIHNjcmlwdC4KK0l0IHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBmcm9tIGEgdXNlcidzIGxvZ2luCitzY3JpcHRzLiBVbmxpa2UgdGhlIGRhZW1vbiBpdHNlbGYsIFxmSWRidXNcLWxhdW5jaFxmUCBleGl0cywgc28KK2JhY2t0aWNrcyBvciB0aGUgJCgpIGNvbnN0cnVjdCBjYW4gYmUgdXNlZCB0byByZWFkIGluZm9ybWF0aW9uIGZyb20KK1xmSWRidXNcLWxhdW5jaFxmUC4KKworV2l0aCBubyBhcmd1bWVudHMsIFxmSWRidXNcLWxhdW5jaFxmUCB3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBhbmQgcHJpbnQgdGhlIGFkZHJlc3MgYW5kIFBJRCBvZiB0aGF0IGluc3RhbmNlIHRvIHN0YW5kYXJkCitvdXRwdXQuCisKK1lvdSBtYXkgc3BlY2lmeSBhIHByb2dyYW0gdG8gYmUgcnVuOyBpbiB0aGlzIGNhc2UsIFxmSWRidXNcLWxhdW5jaFxmUAord2lsbCBsYXVuY2ggYSBzZXNzaW9uIGJ1cyBpbnN0YW5jZSwgc2V0IHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudAordmFyaWFibGVzIHNvIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBjYW4gZmluZCB0aGUgYnVzLCBhbmQgdGhlbiBleGVjdXRlIHRoZQorc3BlY2lmaWVkIHByb2dyYW0sIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuICBTZWUgYmVsb3cgZm9yCitleGFtcGxlcy4KKworSWYgeW91IGxhdW5jaCBhIHByb2dyYW0sIFxmSWRidXNcLWxhdW5jaFxmUCB3aWxsIG5vdCBwcmludCB0aGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgYnVzIHRvIHN0YW5kYXJkIG91dHB1dC4KKworV2hlbiBcZklkYnVzXC1sYXVuY2hcZlAgcHJpbnRzIGJ1cyBpbmZvcm1hdGlvbiB0byBzdGFuZGFyZCBvdXRwdXQsIGJ5CitkZWZhdWx0IGl0IGlzIGluIGEgc2ltcGxlIGtleVwtdmFsdWUgcGFpcnMgZm9ybWF0LiBIb3dldmVyLCB5b3UgbWF5IAorcmVxdWVzdCBzZXZlcmFsIGFsdGVybmF0ZSBzeW50YXhlcyB1c2luZyB0aGUgXC1cLXNoXC1zeW50YXgsIFwtXC1jc2hcLXN5bnRheCwKK1wtXC1iaW5hcnlcLXN5bnRheCwgb3IKK1wtXC1hdXRvXC1zeW50YXggb3B0aW9ucy4gU2V2ZXJhbCBvZiB0aGVzZSBjYXVzZSBcZklkYnVzXC1sYXVuY2hcZlAgdG8gZW1pdCBzaGVsbCBjb2RlCit0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorCitXaXRoIHRoZSBcLVwtYXV0b1wtc3ludGF4IG9wdGlvbiwgXGZJZGJ1c1wtbGF1bmNoXGZQIGxvb2tzIGF0IHRoZSB2YWx1ZQorb2YgdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSB3aGljaCBzaGVsbCBzeW50YXgKK3Nob3VsZCBiZSB1c2VkLiAgSWYgU0hFTEwgZW5kcyBpbiAiY3NoIiwgdGhlbiBjc2hcLWNvbXBhdGlibGUgY29kZSBpcworZW1pdHRlZDsgb3RoZXJ3aXNlIEJvdXJuZSBzaGVsbCBjb2RlIGlzIGVtaXR0ZWQuICBJbnN0ZWFkIG9mIHBhc3NpbmcKK1wtXC1hdXRvXC1zeW50YXgsIHlvdSBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IGEgcGFydGljdWxhciBvbmUgYnkgdXNpbmcKK1wtXC1zaFwtc3ludGF4IGZvciBCb3VybmUgc3ludGF4LCBvciBcLVwtY3NoXC1zeW50YXggZm9yIGNzaCBzeW50YXguCitJbiBzY3JpcHRzLCBpdCdzIG1vcmUgcm9idXN0IHRvIGF2b2lkIFwtXC1hdXRvXC1zeW50YXggYW5kIHlvdSBob3BlZnVsbHkKK2tub3cgd2hpY2ggc2hlbGwgeW91ciBzY3JpcHQgaXMgd3JpdHRlbiBpbi4KKworLlBQCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8gZm9yIG1vcmUgaW5mb3JtYXRpb24KK2Fib3V0IERcLUJ1cy4gU2VlIGFsc28gdGhlIG1hbiBwYWdlIGZvciBcZklkYnVzXC1kYWVtb25cZlAuCisKKy5TSCBFWEFNUExFUworCitEaXN0cmlidXRpb25zIHJ1bm5pbmcKKy5CIGRidXNcLWxhdW5jaAorYXMgcGFydCBvZiBhIHN0YW5kYXJkIFggc2Vzc2lvbiBzaG91bGQgcnVuCisuQiAiZGJ1c1wtbGF1bmNoIFwtXC1leGl0XC13aXRoXC1zZXNzaW9uIgorYWZ0ZXIgdGhlIFggc2VydmVyIGhhcyBzdGFydGVkIGFuZCBiZWNvbWUgYXZhaWxhYmxlLCBhcyBhIHdyYXBwZXIgYXJvdW5kCit0aGUgIm1haW4iIFggY2xpZW50ICh0eXBpY2FsbHkgYSBzZXNzaW9uIG1hbmFnZXIgb3Igd2luZG93IG1hbmFnZXIpLCBhcyBpbgordGhlc2UgZXhhbXBsZXM6CisKKy5SUworLkIgImRidXNcLWxhdW5jaCBcLVwtZXhpdFwtd2l0aFwtc2Vzc2lvbiBnbm9tZVwtc2Vzc2lvbiIKKworLkIgImRidXNcLWxhdW5jaCBcLVwtZXhpdFwtd2l0aFwtc2Vzc2lvbiBvcGVuYm94IgorCisuQiAiZGJ1c1wtbGF1bmNoIFwtXC1leGl0XC13aXRoXC1zZXNzaW9uIH4vLnhzZXNzaW9uIgorLlJFCisKK0lmIHlvdXIgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGRvIHRoaXMsIHlvdSBjYW4gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMKK2J5IHJ1bm5pbmcgeW91ciBzZXNzaW9uIG9yIHdpbmRvdyBtYW5hZ2VyIGluIHRoZSBzYW1lIHdheSBpbiBhIHNjcmlwdAorcnVuIGJ5IHlvdXIgWCBzZXNzaW9uLCBzdWNoIGFzCisuQlIgfi8ueHNlc3Npb24gLAorLkIgfi8ueGluaXRyYworb3IKKy5CUiB+Ly5YY2xpZW50cyAuCisKK1RvIHN0YXJ0IGEgRC1CdXMgc2Vzc2lvbiB3aXRoaW4gYSB0ZXh0LW1vZGUgc2Vzc2lvbiwgeW91IGNhbiBydW4KK2RidXMtbGF1bmNoIGluIHRoZSBiYWNrZ3JvdW5kLiBGb3IgaW5zdGFuY2UsIGluIGEgc2gtY29tcGF0aWJsZSBzaGVsbDoKKworLm5mCisgICMjIHRlc3QgZm9yIGFuIGV4aXN0aW5nIGJ1cyBkYWVtb24sIGp1c3QgdG8gYmUgc2FmZQorICBpZiB0ZXN0IFwteiAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIgOyB0aGVuCisgICAgICAjIyBpZiBub3QgZm91bmQsIGxhdW5jaCBhIG5ldyBvbmUKKyAgICAgIGV2YWwgYGRidXNcLWxhdW5jaCBcLVwtc2hcLXN5bnRheGAKKyAgICAgIGVjaG8gIkRcLUJ1cyBwZXJcLXNlc3Npb24gZGFlbW9uIGFkZHJlc3MgaXM6ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCisgIGZpCisuZmkKK05vdGUgdGhhdCBpbiB0aGlzIGNhc2UsIGRidXMtbGF1bmNoIHdpbGwgZXhpdCwgYW5kIGRidXMtZGFlbW9uIHdpbGwgbm90IGJlCit0ZXJtaW5hdGVkIGF1dG9tYXRpY2FsbHkgb24gbG9nb3V0LgorCisuU0ggQVVUT01BVElDIExBVU5DSElORworCisuUFAKK0lmIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBub3Qgc2V0IGZvciBhIHByb2Nlc3MgdGhhdCB0cmllcyB0byB1c2UKK0RcLUJ1cywgYnkgZGVmYXVsdCB0aGUgcHJvY2VzcyB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIGRidXNcLWxhdW5jaCB3aXRoCit0aGUgXC1cLWF1dG9sYXVuY2ggb3B0aW9uIHRvIHN0YXJ0IHVwIGEgbmV3IHNlc3Npb24gYnVzIG9yIGZpbmQgdGhlIAorZXhpc3RpbmcgYnVzIGFkZHJlc3Mgb24gdGhlIFggZGlzcGxheSBvciBpbiBhIGZpbGUgaW4KK34vLmRidXMvc2Vzc2lvblwtYnVzLworCisuUFAKK1doZW5ldmVyIGFuIGF1dG9sYXVuY2ggb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gdGhhdCBoYWQgdG8KK3N0YXJ0IGEgbmV3IGJ1cyB3aWxsIGJlIGluIGl0cyBvd24gbGl0dGxlIHdvcmxkOyBpdCBjYW4gZWZmZWN0aXZlbHkKK2VuZCB1cCBzdGFydGluZyBhIHdob2xlIG5ldyBzZXNzaW9uIGlmIGl0IHRyaWVzIHRvIHVzZSBhIGxvdCBvZiAKK2J1cyBzZXJ2aWNlcy4gVGhpcyBjYW4gYmUgc3Vib3B0aW1hbCBvciBldmVuIHRvdGFsbHkgYnJva2VuLCBkZXBlbmRpbmcKK29uIHRoZSBhcHAgYW5kIHdoYXQgaXQgdHJpZXMgdG8gZG8uCisKKy5QUAorVGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgYXV0b2xhdW5jaC4gT25lIGlzIHNzaCB0byBhIHJlbW90ZQorbWFjaGluZS4gVGhlIGlkZWFsIGZpeCBmb3IgdGhhdCB3b3VsZCBiZSBmb3J3YXJkaW5nIG9mCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW4gdGhlIHNhbWUgd2F5IHRoYXQgRElTUExBWSBpcyBmb3J3YXJkZWQuCitJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gZWRpdCB0aGUgc2Vzc2lvbi5jb25mIGNvbmZpZyBmaWxlIHRvIAoraGF2ZSB5b3VyIHNlc3Npb24gYnVzIGxpc3RlbiBvbiBUQ1AsIGFuZCBtYW51YWxseSBzZXQKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywgaWYgeW91IGxpa2UuCisKKy5QUAorVGhlIHNlY29uZCBjb21tb24gcmVhc29uIGZvciBhdXRvbGF1bmNoIGlzIGFuIHN1IHRvIGFub3RoZXIgdXNlciwgYW5kCitkaXNwbGF5IG9mIFggYXBwbGljYXRpb25zIHJ1bm5pbmcgYXMgdGhlIHNlY29uZCB1c2VyIG9uIHRoZSBkaXNwbGF5CitiZWxvbmdpbmcgdG8gdGhlIGZpcnN0IHVzZXIuIFBlcmhhcHMgdGhlIGlkZWFsIGZpeCBpbiB0aGlzIGNhc2UKK3dvdWxkIGJlIHRvIGFsbG93IHRoZSBzZWNvbmQgdXNlciB0byBjb25uZWN0IHRvIHRoZSBzZXNzaW9uIGJ1cyBvZiB0aGUKK2ZpcnN0IHVzZXIsIGp1c3QgYXMgdGhleSBjYW4gY29ubmVjdCB0byB0aGUgZmlyc3QgdXNlcidzIGRpc3BsYXkuCitIb3dldmVyLCBhIG1lY2hhbmlzbSBmb3IgdGhhdCBoYXMgbm90IGJlZW4gY29kZWQuCisKKy5QUAorWW91IGNhbiBhbHdheXMgYXZvaWQgYXV0b2xhdW5jaCBieSBtYW51YWxseSBzZXR0aW5nCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MuIEF1dG9sYXVuY2ggaGFwcGVucyBiZWNhdXNlIHRoZSBkZWZhdWx0CithZGRyZXNzIGlmIG5vbmUgaXMgc2V0IGlzICJhdXRvbGF1bmNoOiIsIHNvIGlmIGFueSBvdGhlciBhZGRyZXNzIGlzCitzZXQgdGhlcmUgd2lsbCBiZSBubyBhdXRvbGF1bmNoLiBZb3UgY2FuIGhvd2V2ZXIgaW5jbHVkZSBhdXRvbGF1bmNoIGluCithbiBleHBsaWNpdCBzZXNzaW9uIGJ1cyBhZGRyZXNzIGFzIGEgZmFsbGJhY2ssIGZvciBleGFtcGxlCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9InNvbWV0aGluZzosYXV0b2xhdW5jaDoiIFwtIGluIHRoYXQgY2FzZSBpZgordGhlIGZpcnN0IGFkZHJlc3MgZG9lc24ndCB3b3JrLCBwcm9jZXNzZXMgd2lsbCBhdXRvbGF1bmNoLiAoVGhlIGJ1cworYWRkcmVzcyB2YXJpYWJsZSBjb250YWlucyBhIGNvbW1hXC1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMgdG8gdHJ5LikKKworLlBQCitUaGUgXC1cLWF1dG9sYXVuY2ggb3B0aW9uIGlzIGNvbnNpZGVyZWQgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KK2RldGFpbCBvZiBsaWJkYnVzLCBhbmQgaW4gZmFjdCB0aGVyZSBhcmUgcGxhbnMgdG8gY2hhbmdlIGl0LiBUaGVyZSdzCitubyByZWFsIHJlYXNvbiB0byB1c2UgaXQgb3V0c2lkZSBvZiB0aGUgbGliZGJ1cyBpbXBsZW1lbnRhdGlvbiBhbnlob3cuCisKKy5TSCBPUFRJT05TCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKKy5UUAorLkkgIlwtXC1hdXRvXC1zeW50YXgiCitDaG9vc2UgXC1cLWNzaFwtc3ludGF4IG9yIFwtXC1zaFwtc3ludGF4IGJhc2VkIG9uIHRoZSBTSEVMTCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworLkkgIlwtXC1iaW5hcnlcLXN5bnRheCIKK1dyaXRlIHRvIHN0ZG91dCBhIG51bFwtdGVybWluYXRlZCBidXMgYWRkcmVzcywgdGhlbiB0aGUgYnVzIFBJRCBhcyBhCitiaW5hcnkgaW50ZWdlciBvZiBzaXplIHNpemVvZihwaWRfdCksIHRoZW4gdGhlIGJ1cyBYIHdpbmRvdyBJRCBhcyBhCitiaW5hcnkgaW50ZWdlciBvZiBzaXplIHNpemVvZihsb25nKS4gSW50ZWdlcnMgYXJlIGluIHRoZSBtYWNoaW5lJ3MKK2J5dGUgb3JkZXIsIG5vdCBuZXR3b3JrIGJ5dGUgb3JkZXIgb3IgYW55IG90aGVyIGNhbm9uaWNhbCBieXRlIG9yZGVyLgorCisuVFAKKy5JICJcLVwtY2xvc2VcLXN0ZGVyciIKK0Nsb3NlIHRoZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgc3RyZWFtIGJlZm9yZSBzdGFydGluZyB0aGUgRFwtQnVzCitkYWVtb24uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNhcHR1cmUgZGJ1c1wtbGF1bmNoIGVycm9yCittZXNzYWdlcyBidXQgeW91IGRvbid0IHdhbnQgZGJ1c1wtZGFlbW9uIHRvIGtlZXAgdGhlIHN0cmVhbSBvcGVuIHRvCit5b3VyIGFwcGxpY2F0aW9uLgorCisuVFAKKy5JICJcLVwtY29uZmlnXC1maWxlPUZJTEVOQU1FIgorUGFzcyBcLVwtY29uZmlnXC1maWxlPUZJTEVOQU1FIHRvIHRoZSBidXMgZGFlbW9uLCBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgCit0aGUgXC1cLXNlc3Npb24gYXJndW1lbnQuIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGRidXNcLWRhZW1vbgorCisuVFAKKy5JICJcLVwtY3NoXC1zeW50YXgiCitFbWl0IGNzaCBjb21wYXRpYmxlIGNvZGUgdG8gc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworLlRQCisuSSAiXC1cLWV4aXRcLXdpdGhcLXNlc3Npb24iCitJZiB0aGlzIG9wdGlvbiBpcyBwcm92aWRlZCwgYSBwZXJzaXN0ZW50ICJiYWJ5c2l0dGVyIiBwcm9jZXNzIHdpbGwgYmUgCitjcmVhdGVkIHRoYXQgd2F0Y2hlcyBzdGRpbiBmb3IgSFVQIGFuZCB0cmllcyB0byBjb25uZWN0IHRvIHRoZSBYCitzZXJ2ZXIuIElmIHRoaXMgcHJvY2VzcyBnZXRzIGEgSFVQIG9uIHN0ZGluIG9yIGxvc2VzIGl0cyBYIGNvbm5lY3Rpb24sCitpdCBraWxscyB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLgorCisuVFAKKy5JICJcLVwtYXV0b2xhdW5jaD1NQUNISU5FSUQiCitUaGlzIG9wdGlvbiBpbXBsaWVzIHRoYXQgXGZJZGJ1c1wtbGF1bmNoXGZQIHNob3VsZCBzY2FuIGZvciBhCitwcmV2aW91c2x5XC1zdGFydGVkIHNlc3Npb24gYW5kIHJldXNlIHRoZSB2YWx1ZXMgZm91bmQgdGhlcmUuIElmIG5vCitzZXNzaW9uIGlzIGZvdW5kLCBpdCB3aWxsIHN0YXJ0IGEgbmV3IHNlc3Npb24uIFRoZQorXC1cLWV4aXRcLXdpdGhcLXNlc3Npb24gb3B0aW9uIGlzIGltcGxpZWQgaWYgXC1cLWF1dG9sYXVuY2ggaXMgZ2l2ZW4uCitUaGlzIG9wdGlvbiBpcyBmb3IgdGhlIGV4Y2x1c2l2ZSB1c2Ugb2YgbGliZGJ1cywgeW91IGRvIG5vdCB3YW50IHRvCit1c2UgaXQgbWFudWFsbHkuIEl0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKworLlRQCisuSSAiXC1cLXNoXC1zeW50YXgiCitFbWl0IEJvdXJuZVwtc2hlbGwgY29tcGF0aWJsZSBjb2RlIHRvIHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKy5UUAorLkkgIlwtXC12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1c1wtbGF1bmNoCisKKy5TSCBOT1RFUworCitJZiB5b3UgcnVuCisuQiAiZGJ1c1wtbGF1bmNoIG15YXBwIgorKHdpdGggYW55IG90aGVyIG9wdGlvbnMpLCBkYnVzXC1kYWVtb24gd2lsbAorLkkgbm90CitleGl0IHdoZW4KKy5CIG15YXBwCit0ZXJtaW5hdGVzOiB0aGlzIGlzIGJlY2F1c2UKKy5CIG15YXBwCitpcyBhc3N1bWVkIHRvIGJlIHBhcnQgb2YgYSBsYXJnZXIgc2Vzc2lvbiwgcmF0aGVyIHRoYW4gYSBzZXNzaW9uIGluIGl0cworb3duIHJpZ2h0LgorCisuU0ggQVVUSE9SCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUworCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbiBiL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTM1ZDljCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtbGF1bmNoLjEueG1sLmluCkBAIC0wLDAgKzEsMjg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzbGF1bmNoMSc+CisKKzwhLS0gIGRidXMmYnNvbDstbGF1bmNoIG1hbnVhbCBwYWdlLgorIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtbGF1bmNoPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtbGF1bmNoPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+VXRpbGl0eSB0byBzdGFydCBhIG1lc3NhZ2UgYnVzIGZyb20gYSBzaGVsbCBzY3JpcHQ8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS12ZXJzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0taGVscCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNoLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNzaC1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1hdXRvLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWJpbmFyeS1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1jbG9zZS1zdGRlcnIgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1leGl0LXdpdGgtc2Vzc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWF1dG9sYXVuY2g9PHJlcGxhY2VhYmxlPk1BQ0hJTkVJRDwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1jb25maWctZmlsZT08cmVwbGFjZWFibGU+RklMRU5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT5QUk9HUkFNPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0JyByZXA9J3JlcGVhdCc+PHJlcGxhY2VhYmxlPkFSR1M8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIHN0YXJ0IGEgc2Vzc2lvbiBidXMKK2luc3RhbmNlIG9mIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPiBmcm9tIGEgc2hlbGwgc2NyaXB0LgorSXQgd291bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGZyb20gYSB1c2VyJ3MgbG9naW4KK3NjcmlwdHMuIFVubGlrZSB0aGUgZGFlbW9uIGl0c2VsZiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGV4aXRzLCBzbworYmFja3RpY2tzIG9yIHRoZSAkKCkgY29uc3RydWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbQorPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+LjwvcGFyYT4KKworPHBhcmE+V2l0aCBubyBhcmd1bWVudHMsIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBhbmQgcHJpbnQgdGhlIGFkZHJlc3MgYW5kIFBJRCBvZiB0aGF0IGluc3RhbmNlIHRvIHN0YW5kYXJkCitvdXRwdXQuPC9wYXJhPgorCis8cGFyYT5Zb3UgbWF5IHNwZWNpZnkgYSBwcm9ncmFtIHRvIGJlIHJ1bjsgaW4gdGhpcyBjYXNlLCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4KK3dpbGwgbGF1bmNoIGEgc2Vzc2lvbiBidXMgaW5zdGFuY2UsIHNldCB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyBzbyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gY2FuIGZpbmQgdGhlIGJ1cywgYW5kIHRoZW4gZXhlY3V0ZSB0aGUKK3NwZWNpZmllZCBwcm9ncmFtLCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLiAgU2VlIGJlbG93IGZvcgorZXhhbXBsZXMuPC9wYXJhPgorCis8cGFyYT5JZiB5b3UgbGF1bmNoIGEgcHJvZ3JhbSwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHdpbGwgbm90IHByaW50IHRoZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LjwvcGFyYT4KKworPHBhcmE+V2hlbiA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gcHJpbnRzIGJ1cyBpbmZvcm1hdGlvbiB0byBzdGFuZGFyZCBvdXRwdXQsIGJ5CitkZWZhdWx0IGl0IGlzIGluIGEgc2ltcGxlIGtleS12YWx1ZSBwYWlycyBmb3JtYXQuIEhvd2V2ZXIsIHlvdSBtYXkKK3JlcXVlc3Qgc2V2ZXJhbCBhbHRlcm5hdGUgc3ludGF4ZXMgdXNpbmcgdGhlIC0tc2gtc3ludGF4LCAtLWNzaC1zeW50YXgsCistLWJpbmFyeS1zeW50YXgsIG9yCistLWF1dG8tc3ludGF4IG9wdGlvbnMuIFNldmVyYWwgb2YgdGhlc2UgY2F1c2UgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHRvIGVtaXQgc2hlbGwgY29kZQordG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC48L3BhcmE+CisKKzxwYXJhPldpdGggdGhlIC0tYXV0by1zeW50YXggb3B0aW9uLCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gbG9va3MgYXQgdGhlIHZhbHVlCitvZiB0aGUgU0hFTEwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNoZWxsIHN5bnRheAorc2hvdWxkIGJlIHVzZWQuICBJZiBTSEVMTCBlbmRzIGluICJjc2giLCB0aGVuIGNzaC1jb21wYXRpYmxlIGNvZGUgaXMKK2VtaXR0ZWQ7IG90aGVyd2lzZSBCb3VybmUgc2hlbGwgY29kZSBpcyBlbWl0dGVkLiAgSW5zdGVhZCBvZiBwYXNzaW5nCistLWF1dG8tc3ludGF4LCB5b3UgbWF5IGV4cGxpY2l0bHkgc3BlY2lmeSBhIHBhcnRpY3VsYXIgb25lIGJ5IHVzaW5nCistLXNoLXN5bnRheCBmb3IgQm91cm5lIHN5bnRheCwgb3IgLS1jc2gtc3ludGF4IGZvciBjc2ggc3ludGF4LgorSW4gc2NyaXB0cywgaXQncyBtb3JlIHJvYnVzdCB0byBhdm9pZCAtLWF1dG8tc3ludGF4IGFuZCB5b3UgaG9wZWZ1bGx5Citrbm93IHdoaWNoIHNoZWxsIHlvdXIgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uPC9wYXJhPgorCisKKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRC1CdXMuIFNlZSBhbHNvIHRoZSBtYW4gcGFnZSBmb3IgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+LjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdleGFtcGxlcyc+PHRpdGxlPkVYQU1QTEVTPC90aXRsZT4KKzxwYXJhPkRpc3RyaWJ1dGlvbnMgcnVubmluZworPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+CithcyBwYXJ0IG9mIGEgc3RhbmRhcmQgWCBzZXNzaW9uIHNob3VsZCBydW4KKzxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbjwvZW1waGFzaXM+CithZnRlciB0aGUgWCBzZXJ2ZXIgaGFzIHN0YXJ0ZWQgYW5kIGJlY29tZSBhdmFpbGFibGUsIGFzIGEgd3JhcHBlciBhcm91bmQKK3RoZSAibWFpbiIgWCBjbGllbnQgKHR5cGljYWxseSBhIHNlc3Npb24gbWFuYWdlciBvciB3aW5kb3cgbWFuYWdlciksIGFzIGluCit0aGVzZSBleGFtcGxlczo8L3BhcmE+CisKKyAgPGJsb2NrcXVvdGUgcmVtYXA9J1JTJz4KKzxwYXJhPjxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbiBnbm9tZS1zZXNzaW9uPC9lbXBoYXNpcz48L3BhcmE+CisKKzxwYXJhPjxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbiBvcGVuYm94PC9lbXBoYXNpcz48L3BhcmE+CisKKzxwYXJhPjxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbiB+Ly54c2Vzc2lvbjwvZW1waGFzaXM+CisgIDwvcGFyYT48L2Jsb2NrcXVvdGU+IDwhLS0gcmVtYXA9J1JFJyAtLT4KKworPHBhcmE+SWYgeW91ciBkaXN0cmlidXRpb24gZG9lcyBub3QgZG8gdGhpcywgeW91IGNhbiBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cworYnkgcnVubmluZyB5b3VyIHNlc3Npb24gb3Igd2luZG93IG1hbmFnZXIgaW4gdGhlIHNhbWUgd2F5IGluIGEgc2NyaXB0CitydW4gYnkgeW91ciBYIHNlc3Npb24sIHN1Y2ggYXMKKzxmaWxlbmFtZT5+Ly54c2Vzc2lvbjwvZmlsZW5hbWU+LAorPGZpbGVuYW1lPn4vLnhpbml0cmM8L2ZpbGVuYW1lPgorb3IKKzxmaWxlbmFtZT5+Ly5YY2xpZW50czwvZmlsZW5hbWU+LjwvcGFyYT4KKworPHBhcmE+VG8gc3RhcnQgYSBELUJ1cyBzZXNzaW9uIHdpdGhpbiBhIHRleHQtbW9kZSBzZXNzaW9uLAorICBkbyBub3QgdXNlIDxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2g8L2VtcGhhc2lzPi4KKyAgSW5zdGVhZCwgc2VlIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZGJ1cy1ydW4tc2Vzc2lvbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uCis8L3BhcmE+CisKKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAjIyB0ZXN0IGZvciBhbiBleGlzdGluZyBidXMgZGFlbW9uLCBqdXN0IHRvIGJlIHNhZmUKKyAgaWYgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIgOyB0aGVuCisgICAgICAjIyBpZiBub3QgZm91bmQsIGxhdW5jaCBhIG5ldyBvbmUKKyAgICAgIGV2YWwgYGRidXMtbGF1bmNoIC0tc2gtc3ludGF4YAorICAgICAgZWNobyAiRC1CdXMgcGVyLXNlc3Npb24gZGFlbW9uIGFkZHJlc3MgaXM6ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCisgIGZpCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorPHBhcmE+Tm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgZGJ1cy1sYXVuY2ggd2lsbCBleGl0LCBhbmQgZGJ1cy1kYWVtb24gd2lsbCBub3QgYmUKK3Rlcm1pbmF0ZWQgYXV0b21hdGljYWxseSBvbiBsb2dvdXQuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dG9tYXRpY19sYXVuY2hpbmcnPjx0aXRsZT5BVVRPTUFUSUMgTEFVTkNISU5HPC90aXRsZT4KKzxwYXJhPklmIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBub3Qgc2V0IGZvciBhIHByb2Nlc3MgdGhhdCB0cmllcyB0byB1c2UKK0QtQnVzLCBieSBkZWZhdWx0IHRoZSBwcm9jZXNzIHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgZGJ1cy1sYXVuY2ggd2l0aAordGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gdG8gc3RhcnQgdXAgYSBuZXcgc2Vzc2lvbiBidXMgb3IgZmluZCB0aGUKK2V4aXN0aW5nIGJ1cyBhZGRyZXNzIG9uIHRoZSBYIGRpc3BsYXkgb3IgaW4gYSBmaWxlIGluCit+Ly5kYnVzL3Nlc3Npb24tYnVzLzwvcGFyYT4KKworCis8cGFyYT5XaGVuZXZlciBhbiBhdXRvbGF1bmNoIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaGFkIHRvCitzdGFydCBhIG5ldyBidXMgd2lsbCBiZSBpbiBpdHMgb3duIGxpdHRsZSB3b3JsZDsgaXQgY2FuIGVmZmVjdGl2ZWx5CitlbmQgdXAgc3RhcnRpbmcgYSB3aG9sZSBuZXcgc2Vzc2lvbiBpZiBpdCB0cmllcyB0byB1c2UgYSBsb3Qgb2YKK2J1cyBzZXJ2aWNlcy4gVGhpcyBjYW4gYmUgc3Vib3B0aW1hbCBvciBldmVuIHRvdGFsbHkgYnJva2VuLCBkZXBlbmRpbmcKK29uIHRoZSBhcHAgYW5kIHdoYXQgaXQgdHJpZXMgdG8gZG8uPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlIGFyZSB0d28gY29tbW9uIHJlYXNvbnMgZm9yIGF1dG9sYXVuY2guIE9uZSBpcyBzc2ggdG8gYSByZW1vdGUKK21hY2hpbmUuIFRoZSBpZGVhbCBmaXggZm9yIHRoYXQgd291bGQgYmUgZm9yd2FyZGluZyBvZgorREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGluIHRoZSBzYW1lIHdheSB0aGF0IERJU1BMQVkgaXMgZm9yd2FyZGVkLgorSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIGVkaXQgdGhlIHNlc3Npb24uY29uZiBjb25maWcgZmlsZSB0bworaGF2ZSB5b3VyIHNlc3Npb24gYnVzIGxpc3RlbiBvbiBUQ1AsIGFuZCBtYW51YWxseSBzZXQKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywgaWYgeW91IGxpa2UuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBzZWNvbmQgY29tbW9uIHJlYXNvbiBmb3IgYXV0b2xhdW5jaCBpcyBhbiBzdSB0byBhbm90aGVyIHVzZXIsIGFuZAorZGlzcGxheSBvZiBYIGFwcGxpY2F0aW9ucyBydW5uaW5nIGFzIHRoZSBzZWNvbmQgdXNlciBvbiB0aGUgZGlzcGxheQorYmVsb25naW5nIHRvIHRoZSBmaXJzdCB1c2VyLiBQZXJoYXBzIHRoZSBpZGVhbCBmaXggaW4gdGhpcyBjYXNlCit3b3VsZCBiZSB0byBhbGxvdyB0aGUgc2Vjb25kIHVzZXIgdG8gY29ubmVjdCB0byB0aGUgc2Vzc2lvbiBidXMgb2YgdGhlCitmaXJzdCB1c2VyLCBqdXN0IGFzIHRoZXkgY2FuIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHVzZXIncyBkaXNwbGF5LgorSG93ZXZlciwgYSBtZWNoYW5pc20gZm9yIHRoYXQgaGFzIG5vdCBiZWVuIGNvZGVkLjwvcGFyYT4KKworCis8cGFyYT5Zb3UgY2FuIGFsd2F5cyBhdm9pZCBhdXRvbGF1bmNoIGJ5IG1hbnVhbGx5IHNldHRpbmcKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUy4gQXV0b2xhdW5jaCBoYXBwZW5zIGJlY2F1c2UgdGhlIGRlZmF1bHQKK2FkZHJlc3MgaWYgbm9uZSBpcyBzZXQgaXMgImF1dG9sYXVuY2g6Iiwgc28gaWYgYW55IG90aGVyIGFkZHJlc3MgaXMKK3NldCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9sYXVuY2guIFlvdSBjYW4gaG93ZXZlciBpbmNsdWRlIGF1dG9sYXVuY2ggaW4KK2FuIGV4cGxpY2l0IHNlc3Npb24gYnVzIGFkZHJlc3MgYXMgYSBmYWxsYmFjaywgZm9yIGV4YW1wbGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0ic29tZXRoaW5nOixhdXRvbGF1bmNoOiIgLSBpbiB0aGF0IGNhc2UgaWYKK3RoZSBmaXJzdCBhZGRyZXNzIGRvZXNuJ3Qgd29yaywgcHJvY2Vzc2VzIHdpbGwgYXV0b2xhdW5jaC4gKFRoZSBidXMKK2FkZHJlc3MgdmFyaWFibGUgY29udGFpbnMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMgdG8gdHJ5Lik8L3BhcmE+CisKKworPHBhcmE+VGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlsIG9mIGxpYmRidXMsIGFuZCBpbiBmYWN0IHRoZXJlIGFyZSBwbGFucyB0byBjaGFuZ2UgaXQuIFRoZXJlJ3MKK25vIHJlYWwgcmVhc29uIHRvIHVzZSBpdCBvdXRzaWRlIG9mIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uIGFueWhvdy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYXV0by1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkNob29zZSAtLWNzaC1zeW50YXggb3IgLS1zaC1zeW50YXggYmFzZWQgb24gdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWJpbmFyeS1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPldyaXRlIHRvIHN0ZG91dCBhIG51bC10ZXJtaW5hdGVkIGJ1cyBhZGRyZXNzLCB0aGVuIHRoZSBidXMgUElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKHBpZF90KSwgdGhlbiB0aGUgYnVzIFggd2luZG93IElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKGxvbmcpLiBJbnRlZ2VycyBhcmUgaW4gdGhlIG1hY2hpbmUncworYnl0ZSBvcmRlciwgbm90IG5ldHdvcmsgYnl0ZSBvcmRlciBvciBhbnkgb3RoZXIgY2Fub25pY2FsIGJ5dGUgb3JkZXIuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY2xvc2Utc3RkZXJyPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5DbG9zZSB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbSBiZWZvcmUgc3RhcnRpbmcgdGhlIEQtQnVzCitkYWVtb24uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNhcHR1cmUgZGJ1cy1sYXVuY2ggZXJyb3IKK21lc3NhZ2VzIGJ1dCB5b3UgZG9uJ3Qgd2FudCBkYnVzLWRhZW1vbiB0byBrZWVwIHRoZSBzdHJlYW0gb3BlbiB0bworeW91ciBhcHBsaWNhdGlvbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1jb25maWctZmlsZT1GSUxFTkFNRTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UGFzcyAtLWNvbmZpZy1maWxlPUZJTEVOQU1FIHRvIHRoZSBidXMgZGFlbW9uLCBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQKK3RoZSAtLXNlc3Npb24gYXJndW1lbnQuIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGRidXMtZGFlbW9uPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY3NoLXN5bnRheDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+RW1pdCBjc2ggY29tcGF0aWJsZSBjb2RlIHRvIHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZXhpdC13aXRoLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPklmIHRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkLCBhIHBlcnNpc3RlbnQgImJhYnlzaXR0ZXIiIHByb2Nlc3Mgd2lsbCBiZQorY3JlYXRlZCB0aGF0IHdhdGNoZXMgc3RkaW4gZm9yIEhVUCBhbmQgdHJpZXMgdG8gY29ubmVjdCB0byB0aGUgWAorc2VydmVyLiBJZiB0aGlzIHByb2Nlc3MgZ2V0cyBhIEhVUCBvbiBzdGRpbiBvciBsb3NlcyBpdHMgWCBjb25uZWN0aW9uLAoraXQga2lsbHMgdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1hdXRvbGF1bmNoPU1BQ0hJTkVJRDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VGhpcyBvcHRpb24gaW1wbGllcyB0aGF0IDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiBzaG91bGQgc2NhbiBmb3IgYQorcHJldmlvdXNseS1zdGFydGVkIHNlc3Npb24gYW5kIHJldXNlIHRoZSB2YWx1ZXMgZm91bmQgdGhlcmUuIElmIG5vCitzZXNzaW9uIGlzIGZvdW5kLCBpdCB3aWxsIHN0YXJ0IGEgbmV3IHNlc3Npb24uIFRoZQorLS1leGl0LXdpdGgtc2Vzc2lvbiBvcHRpb24gaXMgaW1wbGllZCBpZiAtLWF1dG9sYXVuY2ggaXMgZ2l2ZW4uCitUaGlzIG9wdGlvbiBpcyBmb3IgdGhlIGV4Y2x1c2l2ZSB1c2Ugb2YgbGliZGJ1cywgeW91IGRvIG5vdCB3YW50IHRvCit1c2UgaXQgbWFudWFsbHkuIEl0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zaC1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkVtaXQgQm91cm5lLXNoZWxsIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSB2ZXJzaW9uIG9mIGRidXMtbGF1bmNoPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0taGVscDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIGhlbHAgaW5mbyBvZiBkYnVzLWxhdW5jaDwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdub3Rlcyc+PHRpdGxlPk5PVEVTPC90aXRsZT4KKzxwYXJhPklmIHlvdSBydW4KKzxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1sYXVuY2ggbXlhcHA8L2VtcGhhc2lzPgorKHdpdGggYW55IG90aGVyIG9wdGlvbnMpLCBkYnVzLWRhZW1vbiB3aWxsCis8ZW1waGFzaXMgcmVtYXA9J0knPm5vdDwvZW1waGFzaXM+CitleGl0IHdoZW4KKzxlbXBoYXNpcyByZW1hcD0nQic+bXlhcHA8L2VtcGhhc2lzPgordGVybWluYXRlczogdGhpcyBpcyBiZWNhdXNlCis8ZW1waGFzaXMgcmVtYXA9J0InPm15YXBwPC9lbXBoYXNpcz4KK2lzIGFzc3VtZWQgdG8gYmUgcGFydCBvZiBhIGxhcmdlciBzZXNzaW9uLCByYXRoZXIgdGhhbiBhIHNlc3Npb24gaW4gaXRzCitvd24gcmlnaHQuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dGhvcic+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT5TZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUzwvdWxpbms+PC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLW1vbml0b3IuMSBiL2RvYy9kYnVzLW1vbml0b3IuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjgyYjllCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtbW9uaXRvci4xCkBAIC0wLDAgKzEsNzggQEAKKy5cIiAKKy5cIiBkYnVzXC1tb25pdG9yIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC1tb25pdG9yIDEKKy5TSCBOQU1FCitkYnVzXC1tb25pdG9yIFwtIGRlYnVnIHByb2JlIHRvIHByaW50IG1lc3NhZ2UgYnVzIG1lc3NhZ2VzCisuU0ggU1lOT1BTSVMKKy5QUAorLkIgZGJ1c1wtbW9uaXRvcgorW1wtXC1zeXN0ZW0gfCBcLVwtc2Vzc2lvbiB8IFwtXC1hZGRyZXNzIEFERFJFU1NdIFtcLVwtcHJvZmlsZSB8IFwtXC1tb25pdG9yXQorW3dhdGNoIGV4cHJlc3Npb25zXQorCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFxmSWRidXNcLW1vbml0b3JcZlAgY29tbWFuZCBpcyB1c2VkIHRvIG1vbml0b3IgbWVzc2FnZXMgZ29pbmcKK3Rocm91Z2ggYSBEXC1CdXMgbWVzc2FnZSBidXMuICBTZWUKK2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYmlnIHBpY3R1cmUuCisKKy5QUAorVGhlcmUgYXJlIHR3byB3ZWxsXC1rbm93biBtZXNzYWdlIGJ1c2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBzZXJ2aWNlKSBhbmQgdGhlCitwZXJcLXVzZXJcLWxvZ2luXC1zZXNzaW9uIG1lc3NhZ2UgYnVzIChzdGFydGVkIGVhY2ggdGltZSBhIHVzZXIgbG9ncyBpbikuCitUaGUgXC1cLXN5c3RlbSBhbmQgXC1cLXNlc3Npb24gb3B0aW9ucyBkaXJlY3QgXGZJZGJ1c1wtbW9uaXRvclxmUCB0bworbW9uaXRvciB0aGUgc3lzdGVtIG9yIHNlc3Npb24gYnVzZXMgcmVzcGVjdGl2ZWx5LiAgSWYgbmVpdGhlciBpcworc3BlY2lmaWVkLCBcZklkYnVzXC1tb25pdG9yXGZQIG1vbml0b3JzIHRoZSBzZXNzaW9uIGJ1cy4KKworLlBQCitcZklkYnVzXC1tb25pdG9yXGZQIGhhcyB0d28gZGlmZmVyZW50IG91dHB1dCBtb2RlcywgdGhlICdjbGFzc2ljJ1wtc3R5bGUKK21vbml0b3JpbmcgbW9kZSBhbmQgcHJvZmlsaW5nIG1vZGUuIFRoZSBwcm9maWxpbmcgZm9ybWF0IGlzIGEgY29tcGFjdAorZm9ybWF0IHdpdGggYSBzaW5nbGUgbGluZSBwZXIgbWVzc2FnZSBhbmQgbWljcm9zZWNvbmRcLXJlc29sdXRpb24gdGltaW5nCitpbmZvcm1hdGlvbi4gVGhlIFwtXC1wcm9maWxlIGFuZCBcLVwtbW9uaXRvciBvcHRpb25zIHNlbGVjdCB0aGUgcHJvZmlsaW5nCithbmQgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0IHJlc3BlY3RpdmVseS4gSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsCitcZklkYnVzXC1tb25pdG9yXGZQIHVzZXMgdGhlIG1vbml0b3Jpbmcgb3V0cHV0IGZvcm1hdC4KKworLlBQCitJbiBvcmRlciB0byBnZXQgXGZJZGJ1c1wtbW9uaXRvclxmUCB0byBzZWUgdGhlIG1lc3NhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4sIHlvdSBzaG91bGQgc3BlY2lmeSBhIHNldCBvZiB3YXRjaCBleHByZXNzaW9ucyBhcyB5b3Ugd291bGQgZXhwZWN0IHRvCitiZSBwYXNzZWQgdG8gdGhlIFxmSWRidXNfYnVzX2FkZF9tYXRjaFxmUCBmdW5jdGlvbi4KKworLlBQIAorVGhlIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gbWF5IGtlZXAgXGZJZGJ1c1wtbW9uaXRvclxmUCBmcm9tIHNlZWluZworYWxsIG1lc3NhZ2VzLCBlc3BlY2lhbGx5IGlmIHlvdSBydW4gdGhlIG1vbml0b3IgYXMgYSBub25cLXJvb3QgdXNlci4KKworLlNIIE9QVElPTlMKKy5UUAorLkkgIlwtXC1zeXN0ZW0iCitNb25pdG9yIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMuCisuVFAKKy5JICJcLVwtc2Vzc2lvbiIKK01vbml0b3IgdGhlIHNlc3Npb24gbWVzc2FnZSBidXMuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pCisuVFAKKy5JICJcLVwtYWRkcmVzcyBBRERSRVNTIgorTW9uaXRvciBhbiBhcmJpdHJhcnkgbWVzc2FnZSBidXMgZ2l2ZW4gYXQgQUREUkVTUy4KKy5UUAorLkkgIlwtXC1wcm9maWxlIgorVXNlIHRoZSBwcm9maWxpbmcgb3V0cHV0IGZvcm1hdC4KKy5UUAorLkkgIlwtXC1tb25pdG9yIgorVXNlIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pCisKKy5TSCBFWEFNUExFCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgZGJ1c1wtbW9uaXRvciB0byB3YXRjaCBmb3IgdGhlIGdub21lIHR5cGluZworbW9uaXRvciB0byBzYXkgdGhpbmdzCisubmYKKworICBkYnVzXC1tb25pdG9yICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmdub21lLlR5cGluZ01vbml0b3InLGludGVyZmFjZT0nb3JnLmdub21lLlR5cGluZ01vbml0b3InIgorCisuZmkKKworLlNIIEFVVEhPUgorZGJ1c1wtbW9uaXRvciB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuCitUaGUgcHJvZmlsaW5nIG91dHB1dCBtb2RlIHdhcyBhZGRlZCBieSBPbGxpIFNhbGxpLgorCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLW1vbml0b3IuMS54bWwuaW4gYi9kb2MvZGJ1cy1tb25pdG9yLjEueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODA3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1tb25pdG9yLjEueG1sLmluCkBAIC0wLDAgKzEsMTMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzbW9uaXRvcjEnPgorCis8IS0tICBkYnVzJmJzb2w7LW1vbml0b3IgbWFudWFsIHBhZ2UuCisgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy1tb25pdG9yPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtbW9uaXRvcjwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPmRlYnVnIHByb2JlIHRvIHByaW50IG1lc3NhZ2UgYnVzIG1lc3NhZ2VzPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorPCEtLSBib2R5IGJlZ2lucyBoZXJlIC0tPgorPHJlZnN5bm9wc2lzZGl2IGlkPSdzeW5vcHNpcyc+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4KKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWFkZHJlc3MgPHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPjwvYXJnPjwvZ3JvdXA+CisgICAgPGdyb3VwIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJvZmlsZSA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPi0tbW9uaXRvciA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcGNhcCA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPi0tYmluYXJ5IDwvYXJnPjwvZ3JvdXA+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+d2F0Y2g8L3JlcGxhY2VhYmxlPjwvYXJnPjxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPmV4cHJlc3Npb25zPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8c2JyLz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCisKKzxyZWZzZWN0MSBpZD0nZGVzY3JpcHRpb24nPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT5UaGUgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBjb21tYW5kIGlzIHVzZWQgdG8gbW9uaXRvciBtZXNzYWdlcyBnb2luZwordGhyb3VnaCBhIEQtQnVzIG1lc3NhZ2UgYnVzLiAgU2VlCis8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAordGhlIGJpZyBwaWN0dXJlLjwvcGFyYT4KKworCis8cGFyYT5UaGVyZSBhcmUgdHdvIHdlbGwta25vd24gbWVzc2FnZSBidXNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMKKyhpbnN0YWxsZWQgb24gbWFueSBzeXN0ZW1zIGFzIHRoZSAibWVzc2FnZWJ1cyIgc2VydmljZSkgYW5kIHRoZQorcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorVGhlIC0tc3lzdGVtIGFuZCAtLXNlc3Npb24gb3B0aW9ucyBkaXJlY3QgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiB0bworbW9uaXRvciB0aGUgc3lzdGVtIG9yIHNlc3Npb24gYnVzZXMgcmVzcGVjdGl2ZWx5LiAgSWYgbmVpdGhlciBpcworc3BlY2lmaWVkLCA8Y29tbWFuZD5kYnVzLW1vbml0b3I8L2NvbW1hbmQ+IG1vbml0b3JzIHRoZSBzZXNzaW9uIGJ1cy48L3BhcmE+CisKKworPHBhcmE+PGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBoYXMgdHdvIGRpZmZlcmVudCB0ZXh0IG91dHB1dAorbW9kZXM6IHRoZSAnY2xhc3NpYyctc3R5bGUKK21vbml0b3JpbmcgbW9kZSwgYW5kIHByb2ZpbGluZyBtb2RlLiBUaGUgcHJvZmlsaW5nIGZvcm1hdCBpcyBhIGNvbXBhY3QKK2Zvcm1hdCB3aXRoIGEgc2luZ2xlIGxpbmUgcGVyIG1lc3NhZ2UgYW5kIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltaW5nCitpbmZvcm1hdGlvbi4gVGhlIC0tcHJvZmlsZSBhbmQgLS1tb25pdG9yIG9wdGlvbnMgc2VsZWN0IHRoZSBwcm9maWxpbmcKK2FuZCBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQgcmVzcGVjdGl2ZWx5LjwvcGFyYT4KKworPHBhcmE+PGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBhbHNvIGhhcyB0d28gYmluYXJ5IG91dHB1dCBtb2Rlcy4KKyAgVGhlIGJpbmFyeSBtb2RlLCBzZWxlY3RlZCBieSA8bGl0ZXJhbD4tLWJpbmFyeTwvbGl0ZXJhbD4sIG91dHB1dHMgdGhlCisgIGVudGlyZSBiaW5hcnkgbWVzc2FnZSBzdHJlYW0gKHdpdGhvdXQgdGhlIGluaXRpYWwgYXV0aGVudGljYXRpb24gaGFuZHNoYWtlKS4KKyAgVGhlIFBDQVAgbW9kZSwgc2VsZWN0ZWQgYnkgPGxpdGVyYWw+LS1wY2FwPC9saXRlcmFsPiwgYWRkcyBhCisgIFBDQVAgZmlsZSBoZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0LCBhbmQgcHJlcGVuZHMgYSBQQ0FQCisgIG1lc3NhZ2UgaGVhZGVyIHRvIGVhY2ggbWVzc2FnZTsgdGhpcyBwcm9kdWNlcyBhIGJpbmFyeSBmaWxlIHRoYXQgY2FuCisgIGJlIHJlYWQgYnksIGZvciBpbnN0YW5jZSwgV2lyZXNoYXJrLjwvcGFyYT4KKworPHBhcmE+SWYgbm8gbW9kZSBpcyBzcGVjaWZpZWQsCis8Y29tbWFuZD5kYnVzLW1vbml0b3I8L2NvbW1hbmQ+IHVzZXMgdGhlIG1vbml0b3Jpbmcgb3V0cHV0IGZvcm1hdC48L3BhcmE+CisKKworPHBhcmE+SW4gb3JkZXIgdG8gZ2V0IDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdG8gc2VlIHRoZSBtZXNzYWdlcyB5b3UgYXJlIGludGVyZXN0ZWQKK2luLCB5b3Ugc2hvdWxkIHNwZWNpZnkgYSBzZXQgb2Ygd2F0Y2ggZXhwcmVzc2lvbnMgYXMgeW91IHdvdWxkIGV4cGVjdCB0bworYmUgcGFzc2VkIHRvIHRoZSA8ZW1waGFzaXMgcmVtYXA9J0knPmRidXNfYnVzX2FkZF9tYXRjaDwvZW1waGFzaXM+IGZ1bmN0aW9uLjwvcGFyYT4KKworCis8cGFyYT5UaGUgbWVzc2FnZSBidXMgY29uZmlndXJhdGlvbiBtYXkga2VlcCA8Y29tbWFuZD5kYnVzLW1vbml0b3I8L2NvbW1hbmQ+IGZyb20gc2VlaW5nCithbGwgbWVzc2FnZXMsIGVzcGVjaWFsbHkgaWYgeW91IHJ1biB0aGUgbW9uaXRvciBhcyBhIG5vbi1yb290IHVzZXIuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J29wdGlvbnMnPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXN5c3RlbTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+TW9uaXRvciB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zZXNzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Nb25pdG9yIHRoZSBzZXNzaW9uIG1lc3NhZ2UgYnVzLiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKTwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1hZGRyZXNzIEFERFJFU1M8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPk1vbml0b3IgYW4gYXJiaXRyYXJ5IG1lc3NhZ2UgYnVzIGdpdmVuIGF0IEFERFJFU1MuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXByb2ZpbGU8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgcHJvZmlsaW5nIG91dHB1dCBmb3JtYXQuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLW1vbml0b3I8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0LiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKTwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdleGFtcGxlJz48dGl0bGU+RVhBTVBMRTwvdGl0bGU+Cis8cGFyYT5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgZGJ1cy1tb25pdG9yIHRvIHdhdGNoIGZvciB0aGUgZ25vbWUgdHlwaW5nCittb25pdG9yIHRvIHNheSB0aGluZ3M8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworICBkYnVzLW1vbml0b3IgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZ25vbWUuVHlwaW5nTW9uaXRvcicsaW50ZXJmYWNlPSdvcmcuZ25vbWUuVHlwaW5nTW9uaXRvciciCisKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtbW9uaXRvciB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuCitUaGUgcHJvZmlsaW5nIG91dHB1dCBtb2RlIHdhcyBhZGRlZCBieSBPbGxpIFNhbGxpLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1ydW4tc2Vzc2lvbi4xLnhtbC5pbiBiL2RvYy9kYnVzLXJ1bi1zZXNzaW9uLjEueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWMyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1ydW4tc2Vzc2lvbi4xLnhtbC5pbgpAQCAtMCwwICsxLDE1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0nZGJ1c3J1bnNlc3Npb24xJz4KKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy1ydW4tc2Vzc2lvbjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLXJ1bi1zZXNzaW9uPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+c3RhcnQgYSBwcm9jZXNzIGFzIGEgbmV3IEQtQnVzIHNlc3Npb248L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1ydW4tc2Vzc2lvbjwvY29tbWFuZD4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tY29uZmlnLWZpbGUgPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+RklMRU5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1kYnVzLWRhZW1vbiA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5CSU5BUlk8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPlBST0dSQU08L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnIHJlcD0ncmVwZWF0Jz48cmVwbGFjZWFibGU+QVJHVU1FTlRTPC9yZXBsYWNlYWJsZT48L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtcnVuLXNlc3Npb248L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+LS1oZWxwIDwvYXJnPgorPC9jbWRzeW5vcHNpcz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1ydW4tc2Vzc2lvbjwvY29tbWFuZD4gICAgPGFyZyBjaG9pY2U9J3BsYWluJz4tLXZlcnNpb24gPC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+PGNvbW1hbmQ+ZGJ1cy1ydW4tc2Vzc2lvbjwvY29tbWFuZD4KK2lzIHVzZWQgdG8gc3RhcnQgYSBzZXNzaW9uIGJ1cyBpbnN0YW5jZSBvZgorPGVtcGhhc2lzIHJlbWFwPSdCJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+Citmcm9tIGEgc2hlbGwgc2NyaXB0LCBhbmQgc3RhcnQgYSBzcGVjaWZpZWQgcHJvZ3JhbSBpbiB0aGF0IHNlc3Npb24uIFRoZQorPGVtcGhhc2lzIHJlbWFwPSdCJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+Cit3aWxsIHJ1biBmb3IgYXMgbG9uZyBhcyB0aGUgcHJvZ3JhbSBkb2VzLCBhZnRlciB3aGljaCBpdCB3aWxsIHRlcm1pbmF0ZS48L3BhcmE+CisKKzxwYXJhPk9uZSB1c2UgaXMgdG8gcnVuIGEgc2hlbGwgd2l0aCBpdHMgb3duCis8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtZGFlbW9uPC9lbXBoYXNpcz4KK2luIGEgdGV4dCZoeXBoZW47bW9kZSBvciBTU0ggc2Vzc2lvbiwgYW5kIGhhdmUgdGhlCis8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtZGFlbW9uPC9lbXBoYXNpcz4KK3Rlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IG9uIGxlYXZpbmcgdGhlIHN1YiZoeXBoZW47c2hlbGwsIGxpa2UgdGhpczo8L3BhcmE+CisKKzxwYXJhPiAgICBkYnVzLXJ1bi1zZXNzaW9uIC0tIGJhc2g8L3BhcmE+CisKKzxwYXJhPm9yIHRvIHJlcGxhY2UgdGhlIGxvZ2luIHNoZWxsIGFsdG9nZXRoZXIsIGJ5IGNvbWJpbmluZyA8Y29tbWFuZD5kYnVzLXJ1bi1zZXNzaW9uPC9jb21tYW5kPgord2l0aCB0aGUgPGVtcGhhc2lzIHJlbWFwPSdCJz5leGVjPC9lbXBoYXNpcz4gYnVpbHRpbjo8L3BhcmE+CisKKzxwYXJhPiAgICBleGVjIGRidXMtcnVuLXNlc3Npb24gLS0gYmFzaDwvcGFyYT4KKworPHBhcmE+QW5vdGhlciB1c2UgaXMgdG8gcnVuIHJlZ3Jlc3Npb24gdGVzdHMgYW5kIHNpbWlsYXIgdGhpbmdzIGluIGFuIGlzb2xhdGVkCitELUJ1cyBzZXNzaW9uLCB0byBhdm9pZCBlaXRoZXIgaW50ZXJmZXJpbmcgd2l0aCB0aGUgInJlYWwiIEQtQnVzIHNlc3Npb24KK29yIHJlbHlpbmcgb24gdGhlcmUgYWxyZWFkeSBiZWluZyBhIEQtQnVzIHNlc3Npb24gYWN0aXZlLCBmb3IgaW5zdGFuY2U6PC9wYXJhPgorCis8cGFyYT4gICAgZGJ1cy1ydW4tc2Vzc2lvbiAtLSBtYWtlIGNoZWNrPC9wYXJhPgorCis8cGFyYT5vciAoaW4KKzxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+YXV0b21ha2U8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+KTo8L3BhcmE+CisKKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICBBTV9URVNUU19FTlZJUk9OTUVOVCA9IGV4cG9ydCBNWV9ERUJVRz1hbGw7CisgIExPR19DT01QSUxFUiA9IGRidXMtcnVuLXNlc3Npb24KKyAgQU1fTE9HX0ZMQUdTID0gLS0KKzwvbGl0ZXJhbGxheW91dD48L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J29wdGlvbnMnPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNvbmZpZy1maWxlPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+LCA8b3B0aW9uPi0tY29uZmlnLWZpbGU8L29wdGlvbj4gPHJlcGxhY2VhYmxlPkZJTEVOQU1FPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlBhc3MKKzxvcHRpb24+LS1jb25maWctZmlsZT08L29wdGlvbj48cmVwbGFjZWFibGU+RklMRU5BTUU8L3JlcGxhY2VhYmxlPgordG8gdGhlIGJ1cyBkYWVtb24sIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0aGUKKzxvcHRpb24+LS1zZXNzaW9uPC9vcHRpb24+Cithcmd1bWVudC4gU2VlCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtZGFlbW9uPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5Pi48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZGJ1cy1kYWVtb249PC9vcHRpb24+PHJlcGxhY2VhYmxlPkJJTkFSWTwvcmVwbGFjZWFibGU+LCA8b3B0aW9uPi0tZGJ1cy1kYWVtb248L29wdGlvbj4gPHJlcGxhY2VhYmxlPkJJTkFSWTwvcmVwbGFjZWFibGU+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5SdW4gPGVtcGhhc2lzIHJlbWFwPSdJJz5CSU5BUlk8L2VtcGhhc2lzPiBhcyA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtZGFlbW9uPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwgaW5zdGVhZCBvZiBzZWFyY2hpbmcgdGhlIDxlbnZhcj5QQVRIPC9lbnZhcj4KK2luIHRoZSB1c3VhbCB3YXkgZm9yIGFuIGV4ZWN1dGFibGUgY2FsbGVkIDxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPi48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0taGVscDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdXNhZ2UgaW5mb3JtYXRpb24gYW5kIGV4aXQuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSB2ZXJzaW9uIG9mIGRidXMtcnVuLXNlc3Npb24gYW5kIGV4aXQuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdleGl0X3N0YXR1cyc+PHRpdGxlPkVYSVQgU1RBVFVTPC90aXRsZT4KKzxwYXJhPjxjb21tYW5kPmRidXMtcnVuLXNlc3Npb248L2NvbW1hbmQ+CitleGl0cyB3aXRoIHRoZSBleGl0IHN0YXR1cyBvZgorPGVtcGhhc2lzIHJlbWFwPSdJJz5QUk9HUkFNPC9lbXBoYXNpcz4sCiswIGlmIHRoZQorPG9wdGlvbj4tLWhlbHA8L29wdGlvbj4gb3IgPG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj4KK29wdGlvbnMgd2VyZSB1c2VkLCAxMjcgb24gYW4gZXJyb3Igd2l0aGluCis8Y29tbWFuZD5kYnVzLXJ1bi1zZXNzaW9uPC9jb21tYW5kPgoraXRzZWxmLCBvcgorMTI4KzxlbXBoYXNpcyByZW1hcD0nSSc+bjwvZW1waGFzaXM+CitpZiB0aGUKKzxlbXBoYXNpcyByZW1hcD0nSSc+UFJPR1JBTTwvZW1waGFzaXM+Cit3YXMga2lsbGVkIGJ5IHNpZ25hbAorPGVtcGhhc2lzIHJlbWFwPSdJJz5uPC9lbXBoYXNpcz4uPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdlbnZpcm9ubWVudCc+PHRpdGxlPkVOVklST05NRU5UPC90aXRsZT4KKzxwYXJhPjxlbnZhcj5QQVRIPC9lbnZhcj4KK2lzIHNlYXJjaGVkIHRvIGZpbmQKKzxlbXBoYXNpcyByZW1hcD0nSSc+UFJPR1JBTTwvZW1waGFzaXM+LAorYW5kIChpZiB0aGUgLS1kYnVzLWRhZW1vbiBvcHRpb24gaXMgbm90IHVzZWQgb3IgaXRzIGFyZ3VtZW50IGRvZXMgbm90Citjb250YWluIGEKKzxlbXBoYXNpcyByZW1hcD0nQic+LzwvZW1waGFzaXM+IGNoYXJhY3RlcikgdG8gZmluZCA8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtZGFlbW9uPC9lbXBoYXNpcz4uPC9wYXJhPgorCis8cGFyYT5UaGUgc2Vzc2lvbiBidXMnIGFkZHJlc3MgaXMgbWFkZSBhdmFpbGFibGUgdG8KKzxlbXBoYXNpcyByZW1hcD0nSSc+UFJPR1JBTTwvZW1waGFzaXM+CitpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKzxlbXBoYXNpcyByZW1hcD0nQic+REJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9lbXBoYXNpcz4uPC9wYXJhPgorCis8cGFyYT5UaGUgdmFyaWFibGVzCisgIDxlbXBoYXNpcyByZW1hcD0nQic+REJVU19TRVNTSU9OX0JVU19QSUQ8L2VtcGhhc2lzPiwKKyAgPGVtcGhhc2lzIHJlbWFwPSdCJz5EQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lEPC9lbXBoYXNpcz4sCisgIDxlbXBoYXNpcyByZW1hcD0nQic+REJVU19TVEFSVEVSX0JVU19UWVBFPC9lbXBoYXNpcz4gYW5kCisgIDxlbXBoYXNpcyByZW1hcD0nQic+REJVU19TVEFSVEVSX0FERFJFU1M8L2VtcGhhc2lzPgorICBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgaWYgcHJlc2VudC48L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J3NlZV9hbHNvJz48dGl0bGU+U0VFIEFMU088L3RpdGxlPgorPHBhcmE+PGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtbGF1bmNoPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtc2VuZC4xIGIvZG9jL2RidXMtc2VuZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWE2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1zZW5kLjEKQEAgLTAsMCArMSwxMDkgQEAKKy5cIiAKKy5cIiBkYnVzXC1zZW5kIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC1zZW5kIDEKKy5TSCBOQU1FCitkYnVzXC1zZW5kIFwtIFNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBidXMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC1zZW5kCitbXGZCXC1cLXN5c3RlbVxmUCB8IFxmQlwtXC1zZXNzaW9uXGZQXQorW1xmQlwtXC1kZXN0PVxmSU5BTUVcZlBdCitbXGZCXC1cLXByaW50XC1yZXBseVxmUFtcZkI9bGl0ZXJhbFxmUF1dCitbXGZCXC1cLXJlcGx5XC10aW1lb3V0PVxmSU1TRUNcZlBdCitbXGZCXC1cLXR5cGU9XGZJVFlQRVxmUF0KK1xmSU9CSkVDVF9QQVRIXGZQIFxmSUlOVEVSRkFDRVxmQi5cZklNRU1CRVJcZlAgW1xmSUNPTlRFTlRTXGZQIC4uLl0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzXC1zZW5kXGZQIGNvbW1hbmQgaXMgdXNlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBhIERcLUJ1cyBtZXNzYWdlCitidXMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSAKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBiaWcgcGljdHVyZS4KKworLlBQCitUaGVyZSBhcmUgdHdvIHdlbGxcLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzIAorKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBzZXJ2aWNlKSBhbmQgdGhlIAorcGVyXC11c2VyXC1sb2dpblwtc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorVGhlIFxmQlwtXC1zeXN0ZW1cZlAgYW5kIFxmQlwtXC1zZXNzaW9uXGZQIG9wdGlvbnMgZGlyZWN0CitcZkJkYnVzXC1zZW5kXGZQIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4KK0lmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCBcZkJkYnVzXC1zZW5kXGZQIHNlbmRzIHRvIHRoZSBzZXNzaW9uIGJ1cy4KKworLlBQIAorTmVhcmx5IGFsbCB1c2VzIG9mIFxmQmRidXNcLXNlbmRcZlAgbXVzdCBwcm92aWRlIHRoZSBcZkJcLVwtZGVzdFxmUCBhcmd1bWVudAord2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBjb25uZWN0aW9uIG9uIHRoZSBidXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gSWYKK1xmQlwtXC1kZXN0XGZQIGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC4KKworLlBQCitUaGUgb2JqZWN0IHBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQgbXVzdCBhbHdheXMgYmUKK3NwZWNpZmllZC4gRm9sbG93aW5nIGFyZ3VtZW50cywgaWYgYW55LCBhcmUgdGhlIG1lc3NhZ2UgY29udGVudHMKKyhtZXNzYWdlIGFyZ3VtZW50cykuICBUaGVzZSBhcmUgZ2l2ZW4gYXMgdHlwZVwtc3BlY2lmaWVkIHZhbHVlcyBhbmQgCittYXkgaW5jbHVkZSBjb250YWluZXJzIChhcnJheXMsIGRpY3RzLCBhbmQgdmFyaWFudHMpIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworLm5mCis8Y29udGVudHM+ICAgOjo9IDxpdGVtPiB8IDxjb250YWluZXI+IFsgPGl0ZW0+IHwgPGNvbnRhaW5lcj4uLi5dCis8aXRlbT4gICAgICAgOjo9IDx0eXBlPjo8dmFsdWU+Cis8Y29udGFpbmVyPiAgOjo9IDxhcnJheT4gfCA8ZGljdD4gfCA8dmFyaWFudD4KKzxhcnJheT4gICAgICA6Oj0gYXJyYXk6PHR5cGU+Ojx2YWx1ZT5bLDx2YWx1ZT4uLi5dIAorPGRpY3Q+ICAgICAgIDo6PSBkaWN0Ojx0eXBlPjo8dHlwZT46PGtleT4sPHZhbHVlPlssPGtleT4sPHZhbHVlPi4uLl0KKzx2YXJpYW50PiAgICA6Oj0gdmFyaWFudDo8dHlwZT46PHZhbHVlPgorPHR5cGU+ICAgICAgIDo6PSBzdHJpbmcgfCBpbnQxNiB8IHVpbnQgMTYgfCBpbnQzMiB8IHVpbnQzMiB8IGludDY0IHwgdWludDY0IHwgZG91YmxlIHwgYnl0ZSB8IGJvb2xlYW4gfCBvYmpwYXRoCisuZmkKKworRFwtQnVzIHN1cHBvcnRzIG1vcmUgdHlwZXMgdGhhbiB0aGVzZSwgYnV0IFxmQmRidXNcLXNlbmRcZlAgY3VycmVudGx5Citkb2VzIG5vdC4gIEFsc28sIFxmQmRidXNcLXNlbmRcZlAgZG9lcyBub3QgcGVybWl0IGVtcHR5IGNvbnRhaW5lcnMKK29yIG5lc3RlZCBjb250YWluZXJzIChlLmcuIGFycmF5cyBvZiB2YXJpYW50cykuCisKKy5QUAorSGVyZSBpcyBhbiBleGFtcGxlIGludm9jYXRpb246CisubmYKKworICBkYnVzXC1zZW5kIFwtXC1kZXN0PW9yZy5mcmVlZGVza3RvcC5FeGFtcGxlTmFtZSAgICAgICAgICAgICAgIFxcCisgICAgICAgICAgICAvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAgICAgICAgICAgICAgXFwKKyAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5FeGFtcGxlSW50ZXJmYWNlLkV4YW1wbGVNZXRob2QgICBcXAorICAgICAgICAgICAgaW50MzI6NDcgc3RyaW5nOidoZWxsbyB3b3JsZCcgZG91YmxlOjY1LjMyICAgICAgIFxcCisgICAgICAgICAgICBhcnJheTpzdHJpbmc6IjFzdCBpdGVtIiwibmV4dCBpdGVtIiwibGFzdCBpdGVtIiAgXFwKKyAgICAgICAgICAgIGRpY3Q6c3RyaW5nOmludDMyOiJvbmUiLDEsInR3byIsMiwidGhyZWUiLDMgICAgICBcXAorICAgICAgICAgICAgdmFyaWFudDppbnQzMjpcLTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAgICAgb2JqcGF0aDovb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAKKworLmZpCisKK05vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHNlcGFyYXRlZCBmcm9tIGEgbWV0aG9kIG9yIHNpZ25hbCAKK25hbWUgYnkgYSBkb3QsIHRob3VnaCBpbiB0aGUgYWN0dWFsIHByb3RvY29sIHRoZSBpbnRlcmZhY2UKK2FuZCB0aGUgaW50ZXJmYWNlIG1lbWJlciBhcmUgc2VwYXJhdGUgZmllbGRzLgorCisuU0ggT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisuVFAKKy5CSSBcLVwtZGVzdD0gTkFNRQorU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBtZXNzYWdlLgorLlRQCisuQiAiXC1cLXByaW50XC1yZXBseSIKK0Jsb2NrIGZvciBhIHJlcGx5IHRvIHRoZSBtZXNzYWdlIHNlbnQsIGFuZCBwcmludCBhbnkgcmVwbHkgcmVjZWl2ZWQKK2luIGEgaHVtYW4tcmVhZGFibGUgZm9ybS4KKy5UUAorLkIgIlwtXC1wcmludFwtcmVwbHk9bGl0ZXJhbCIKK0Jsb2NrIGZvciBhIHJlcGx5IHRvIHRoZSBtZXNzYWdlIHNlbnQsIGFuZCBwcmludCB0aGUgYm9keSBvZiB0aGUKK3JlcGx5LiBJZiB0aGUgcmVwbHkgaXMgYW4gb2JqZWN0IHBhdGggb3IgYSBzdHJpbmcsIGl0IGlzIHByaW50ZWQKK2xpdGVyYWxseSwgd2l0aCBubyBwdW5jdHVhdGlvbiwgZXNjYXBlIGNoYXJhY3RlcnMgZXRjLgorLlRQCisuQkkgXC1cLXJlcGx5XC10aW1lb3V0PSBNU0VDCitXYWl0IGZvciBhIHJlcGx5IGZvciB1cCB0byBcZklNU0VDXGZQIG1pbGxpc2Vjb25kcy4KK1RoZSBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uXChoeWRlZmluZWQsIHR5cGljYWxseSAyNSBzZWNvbmRzLgorLlRQCisuQiAiXC1cLXN5c3RlbSIKK1NlbmQgdG8gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy4KKy5UUAorLkIgIlwtXC1zZXNzaW9uIgorU2VuZCB0byB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0LikKKy5UUAorLkJJIFwtXC10eXBlPSBUWVBFCitTcGVjaWZ5IFxmQm1ldGhvZF9jYWxsXGZQIG9yIFxmQnNpZ25hbFxmUCAoZGVmYXVsdHMgdG8gIlxmQnNpZ25hbFxmUCIpLgorCisuU0ggQVVUSE9SCitkYnVzXC1zZW5kIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KKworLlNIIEJVR1MKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBEXC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvCmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1zZW5kLjEueG1sLmluIGIvZG9jL2RidXMtc2VuZC4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFiYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtc2VuZC4xLnhtbC5pbgpAQCAtMCwwICsxLDE3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0nZGJ1c3NlbmQxJz4KKworPCEtLSAgZGJ1cyZic29sOy1zZW5kIG1hbnVhbCBwYWdlLgorIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtc2VuZDwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLXNlbmQ8L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5TZW5kIGEgbWVzc2FnZSB0byBhIG1lc3NhZ2UgYnVzPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorPCEtLSBib2R5IGJlZ2lucyBoZXJlIC0tPgorPHJlZnN5bm9wc2lzZGl2IGlkPSdzeW5vcHNpcyc+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4KKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWFkZHJlc3M9PHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPjwvYXJnPjwvZ3JvdXA+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1zZW5kZXI9PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tZGVzdD08cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXByaW50LXJlcGx5IDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49bGl0ZXJhbDwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1yZXBseS10aW1lb3V0PTxyZXBsYWNlYWJsZT5NU0VDPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXR5cGU9PHJlcGxhY2VhYmxlPlRZUEU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPk9CSkVDVF9QQVRIPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5JTlRFUkZBQ0UuTUVNQkVSPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0JyByZXA9J3JlcGVhdCc+PHJlcGxhY2VhYmxlPkNPTlRFTlRTPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8c2JyLz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCisKKzxyZWZzZWN0MSBpZD0nZGVzY3JpcHRpb24nPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT5UaGUgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBjb21tYW5kIGlzIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBELUJ1cyBtZXNzYWdlCitidXMuIFNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpZyBwaWN0dXJlLjwvcGFyYT4KKworCis8cGFyYT5UaGVyZSBhcmUgdHdvIHdlbGwta25vd24gbWVzc2FnZSBidXNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMKKyhpbnN0YWxsZWQgb24gbWFueSBzeXN0ZW1zIGFzIHRoZSAibWVzc2FnZWJ1cyIgc2VydmljZSkgYW5kIHRoZQorcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorVGhlIDxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj4gYW5kIDxvcHRpb24+LS1zZXNzaW9uPC9vcHRpb24+IG9wdGlvbnMgZGlyZWN0Cis8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4KK0lmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IHNlbmRzIHRvIHRoZSBzZXNzaW9uIGJ1cy48L3BhcmE+CisKKworPHBhcmE+TmVhcmx5IGFsbCB1c2VzIG9mIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gbXVzdCBwcm92aWRlIHRoZSA8b3B0aW9uPi0tZGVzdDwvb3B0aW9uPiBhcmd1bWVudAord2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBjb25uZWN0aW9uIG9uIHRoZSBidXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gSWYKKzxvcHRpb24+LS1kZXN0PC9vcHRpb24+IGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC48L3BhcmE+CisKKworPHBhcmE+VGhlIG9iamVjdCBwYXRoIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kIG11c3QgYWx3YXlzIGJlCitzcGVjaWZpZWQuIEZvbGxvd2luZyBhcmd1bWVudHMsIGlmIGFueSwgYXJlIHRoZSBtZXNzYWdlIGNvbnRlbnRzCisobWVzc2FnZSBhcmd1bWVudHMpLiAgVGhlc2UgYXJlIGdpdmVuIGFzIHR5cGUtc3BlY2lmaWVkIHZhbHVlcyBhbmQKK21heSBpbmNsdWRlIGNvbnRhaW5lcnMgKGFycmF5cywgZGljdHMsIGFuZCB2YXJpYW50cykgYXMgZGVzY3JpYmVkIGJlbG93LjwvcGFyYT4KKworPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CismbHQ7Y29udGVudHMmZ3Q7ICAgOjo9ICZsdDtpdGVtJmd0OyB8ICZsdDtjb250YWluZXImZ3Q7IFsgJmx0O2l0ZW0mZ3Q7IHwgJmx0O2NvbnRhaW5lciZndDsuLi5dCismbHQ7aXRlbSZndDsgICAgICAgOjo9ICZsdDt0eXBlJmd0OzombHQ7dmFsdWUmZ3Q7CismbHQ7Y29udGFpbmVyJmd0OyAgOjo9ICZsdDthcnJheSZndDsgfCAmbHQ7ZGljdCZndDsgfCAmbHQ7dmFyaWFudCZndDsKKyZsdDthcnJheSZndDsgICAgICA6Oj0gYXJyYXk6Jmx0O3R5cGUmZ3Q7OiZsdDt2YWx1ZSZndDtbLCZsdDt2YWx1ZSZndDsuLi5dCismbHQ7ZGljdCZndDsgICAgICAgOjo9IGRpY3Q6Jmx0O3R5cGUmZ3Q7OiZsdDt0eXBlJmd0OzombHQ7a2V5Jmd0OywmbHQ7dmFsdWUmZ3Q7WywmbHQ7a2V5Jmd0OywmbHQ7dmFsdWUmZ3Q7Li4uXQorJmx0O3ZhcmlhbnQmZ3Q7ICAgIDo6PSB2YXJpYW50OiZsdDt0eXBlJmd0OzombHQ7dmFsdWUmZ3Q7CismbHQ7dHlwZSZndDsgICAgICAgOjo9IHN0cmluZyB8IGludDE2IHwgdWludCAxNiB8IGludDMyIHwgdWludDMyIHwgaW50NjQgfCB1aW50NjQgfCBkb3VibGUgfCBieXRlIHwgYm9vbGVhbiB8IG9ianBhdGgKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKzxwYXJhPkQtQnVzIHN1cHBvcnRzIG1vcmUgdHlwZXMgdGhhbiB0aGVzZSwgYnV0IDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gY3VycmVudGx5Citkb2VzIG5vdC4gIEFsc28sIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gZG9lcyBub3QgcGVybWl0IGVtcHR5IGNvbnRhaW5lcnMKK29yIG5lc3RlZCBjb250YWluZXJzIChlLmcuIGFycmF5cyBvZiB2YXJpYW50cykuPC9wYXJhPgorCisKKzxwYXJhPkhlcmUgaXMgYW4gZXhhbXBsZSBpbnZvY2F0aW9uOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorCisgIGRidXMtc2VuZCAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkV4YW1wbGVOYW1lICAgICAgICAgICAgICAgJmJzb2w7CisgICAgICAgICAgICAvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAgICAgICAgICAgICAgJmJzb2w7CisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuRXhhbXBsZUludGVyZmFjZS5FeGFtcGxlTWV0aG9kICAgJmJzb2w7CisgICAgICAgICAgICBpbnQzMjo0NyBzdHJpbmc6J2hlbGxvIHdvcmxkJyBkb3VibGU6NjUuMzIgICAgICAgJmJzb2w7CisgICAgICAgICAgICBhcnJheTpzdHJpbmc6IjFzdCBpdGVtIiwibmV4dCBpdGVtIiwibGFzdCBpdGVtIiAgJmJzb2w7CisgICAgICAgICAgICBkaWN0OnN0cmluZzppbnQzMjoib25lIiwxLCJ0d28iLDIsInRocmVlIiwzICAgICAgJmJzb2w7CisgICAgICAgICAgICB2YXJpYW50OmludDMyOi04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJzb2w7CisgICAgICAgICAgICBvYmpwYXRoOi9vcmcvZnJlZWRlc2t0b3Avc2FtcGxlL29iamVjdC9uYW1lCisKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKzxwYXJhPk5vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHNlcGFyYXRlZCBmcm9tIGEgbWV0aG9kIG9yIHNpZ25hbAorbmFtZSBieSBhIGRvdCwgdGhvdWdoIGluIHRoZSBhY3R1YWwgcHJvdG9jb2wgdGhlIGludGVyZmFjZQorYW5kIHRoZSBpbnRlcmZhY2UgbWVtYmVyIGFyZSBzZXBhcmF0ZSBmaWVsZHMuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J29wdGlvbnMnPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzxwYXJhPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOjwvcGFyYT4KKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWRlc3Q9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBtZXNzYWdlLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wcmludC1yZXBseTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+QmxvY2sgZm9yIGEgcmVwbHkgdG8gdGhlIG1lc3NhZ2Ugc2VudCwgYW5kIHByaW50IGFueSByZXBseSByZWNlaXZlZAoraW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtLiBJdCBhbHNvIG1lYW5zIHRoZSBtZXNzYWdlIHR5cGUgKDxvcHRpb24+LS10eXBlPTwvb3B0aW9uPikgaXMgPGVtcGhhc2lzIHJlbWFwPSdCJz5tZXRob2RfY2FsbDwvZW1waGFzaXM+LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wcmludC1yZXBseT1saXRlcmFsPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5CbG9jayBmb3IgYSByZXBseSB0byB0aGUgbWVzc2FnZSBzZW50LCBhbmQgcHJpbnQgdGhlIGJvZHkgb2YgdGhlCityZXBseS4gSWYgdGhlIHJlcGx5IGlzIGFuIG9iamVjdCBwYXRoIG9yIGEgc3RyaW5nLCBpdCBpcyBwcmludGVkCitsaXRlcmFsbHksIHdpdGggbm8gcHVuY3R1YXRpb24sIGVzY2FwZSBjaGFyYWN0ZXJzIGV0Yy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcmVwbHktdGltZW91dD08L29wdGlvbj48cmVwbGFjZWFibGU+TVNFQzwvcmVwbGFjZWFibGU+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5XYWl0IGZvciBhIHJlcGx5IGZvciB1cCB0byA8ZW1waGFzaXMgcmVtYXA9J0knPk1TRUM8L2VtcGhhc2lzPiBtaWxsaXNlY29uZHMuCitUaGUgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbiZoeXBoZW47ZGVmaW5lZCwgdHlwaWNhbGx5IDI1IHNlY29uZHMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXN5c3RlbTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U2VuZCB0byB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zZXNzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5TZW5kIHRvIHRoZSBzZXNzaW9uIG1lc3NhZ2UgYnVzLiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKTwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1hZGRyZXNzPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5BRERSRVNTPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNlbmQgdG8gPHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPi48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2VuZGVyPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlJlcXVlc3Qgb3duZXJzaGlwIG9mIG5hbWUgPHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPiBiZWZvcmUgc2VuZGluZyBtZXNzYWdlLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS10eXBlPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5UWVBFPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNwZWNpZnkgPGVtcGhhc2lzIHJlbWFwPSdCJz5tZXRob2RfY2FsbDwvZW1waGFzaXM+IG9yIDxlbXBoYXNpcyByZW1hcD0nQic+c2lnbmFsPC9lbXBoYXNpcz4gKGRlZmF1bHRzIHRvICI8ZW1waGFzaXMgcmVtYXA9J0InPnNpZ25hbDwvZW1waGFzaXM+IikuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dGhvcic+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT5kYnVzLXNlbmQgd2FzIHdyaXR0ZW4gYnkgUGhpbGlwIEJsdW5kZWxsLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBiL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGZlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbApAQCAtMCwwICsxLDY1NzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iID8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIgorWworXT4KKzxhcnRpY2xlIGlkPSJpbmRleCI+CisgIDxhcnRpY2xlaW5mbz4KKyAgICA8dGl0bGU+RC1CdXMgU3BlY2lmaWNhdGlvbjwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPlZlcnNpb24gMC4yNjwvcmVsZWFzZWluZm8+CisgICAgPGRhdGU+MjAxNS0wMi0xOTwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkhhdm9jPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPlBlbm5pbmd0b248L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmhwQHBvYm94LmNvbTwvZW1haWw+CisgICAgICAgICAgPC9hZGRyZXNzPgorICAgICAgICA8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkFuZGVyczwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5DYXJsc3Nvbjwvc3VybmFtZT4KKyAgICAgICAgPGFmZmlsaWF0aW9uPgorICAgICAgICAgIDxvcmduYW1lPkNvZGVGYWN0b3J5IEFCPC9vcmduYW1lPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxmaXJzdG5hbWU+QWxleGFuZGVyPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkxhcnNzb248L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFsZXhsQHJlZGhhdC5jb208L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKyAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGZpcnN0bmFtZT5TdmVuPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkhlcnpiZXJnPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPG9yZ25hbWU+SW1lbmRpbyBBQjwvb3JnbmFtZT4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5zdmVuQGltZW5kaW8uY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxmaXJzdG5hbWU+U2ltb248L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+TWNWaXR0aWU8L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8b3JnbmFtZT5Db2xsYWJvcmEgTHRkLjwvb3JnbmFtZT4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5zaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs8L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKyAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGZpcnN0bmFtZT5EYXZpZDwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5aZXV0aGVuPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPGFkZHJlc3M+CisgICAgICAgICAgICA8ZW1haWw+emV1dGhlbkBnbWFpbC5jb208L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKyAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgICA8cmV2aGlzdG9yeT4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yNjwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTUtMDItMTk8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3YsIHJoPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPgorICAgICAgICAgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIGNhbiByZXR1cm4gTGludXhTZWN1cml0eUxhYmVsIG9yCisgICAgICAgICBXaW5kb3dzU0lEOyBhZGQgcHJpdmlsZWdlZCBCZWNvbWVNb25pdG9yIG1ldGhvZAorICAgICAgIDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjI1PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxNC0xMS0xMDwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdiwgbGVubmFydDwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz4KKyAgICAgICAgIEFMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04gZmxhZywgRW1pdHNDaGFuZ2VkU2lnbmFsPWNvbnN0CisgICAgICAgPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjQ8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMDE0LTEwLTAxPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5TTWNWPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPgorICAgICAgICAgbm9uLW1ldGhvZC1jYWxscyBuZXZlciBleHBlY3QgYSByZXBseSBldmVuIHdpdGhvdXQgTk9fUkVQTFlfRVhQRUNURUQ7CisgICAgICAgICBkb2N1bWVudCBob3cgdG8gcXVvdGUgbWF0Y2ggcnVsZXMKKyAgICAgICA8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yMzwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTQtMDEtMDY8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPlNNY1YsIENZPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPgorICAgICAgICAgbWV0aG9kIGNhbGwgbWVzc2FnZXMgd2l0aCBubyBJTlRFUkZBQ0UgbWF5IGJlIGNvbnNpZGVyZWQgYW4gZXJyb3I7CisgICAgICAgICBkb2N1bWVudCB0Y3A6YmluZD0uLi4gYW5kIG5vbmNlLXRjcDpiaW5kPS4uLjsgZGVmaW5lIGxpc3RlbmFibGUKKyAgICAgICAgIGFuZCBjb25uZWN0YWJsZSBhZGRyZXNzZXMKKyAgICAgICA8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yMjwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTMtMTAtMDk8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5hZGQgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzLCBkb2N1bWVudAorICAgICAgICBHZXRBdGRBdWRpdFNlc3Npb25EYXRhLCBkb2N1bWVudCBHZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgZG9jdW1lbnQgYW5kIGNvcnJlY3QgLnNlcnZpY2UgZmlsZSBzeW50YXggYW5kIG5hbWluZworICAgICAgPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjE8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMDEzLTA0LTI1PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmFsbG93IFVuaWNvZGUgbm9uY2hhcmFjdGVycyBpbiBVVEYtOCAoVW5pY29kZQorICAgICAgICAgQ29ycmlnZW5kdW0gIzkpPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjA8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMiBGZWJydWFyeSAyMDEzPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2LCB3YWx0ZXJzPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPnJlb3JnYW5pc2UgZm9yIGNsYXJpdHksIHJlbW92ZSBmYWxzZSBjbGFpbXMgYWJvdXQKKyAgICAgICAgIGJhc2ljIHR5cGVzLCBtZW50aW9uIC9vL2ZkL0RCdXM8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xOTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwIEZlYnJ1YXJ5IDIwMTI8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3YvbHA8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+Zm9ybWFsbHkgZGVmaW5lIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIGFuZCB3ZWxsLWtub3duCisgICAgICAgIGJ1cyBuYW1lczsgZG9jdW1lbnQgYmVzdCBwcmFjdGljZXMgZm9yIGludGVyZmFjZSwgYnVzLCBtZW1iZXIgYW5kCisgICAgICAgIGVycm9yIG5hbWVzLCBhbmQgb2JqZWN0IHBhdGhzOyBkb2N1bWVudCB0aGUgc2VhcmNoIHBhdGggZm9yIHNlc3Npb24KKyAgICAgICAgYW5kIHN5c3RlbSBzZXJ2aWNlcyBvbiBVbml4OyBkb2N1bWVudCB0aGUgc3lzdGVtZCB0cmFuc3BvcnQ8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xODwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjI5IEp1bHkgMjAxMTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5kZWZpbmUgZWF2ZXNkcm9wcGluZywgdW5pY2FzdCwgYnJvYWRjYXN0OyBhZGQgZWF2ZXNkcm9wCisgICAgICAgICBtYXRjaCBrZXl3b3JkOyBwcm9tb3RlIHR5cGUgc3lzdGVtIHRvIGEgdG9wLWxldmVsIHNlY3Rpb248L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xNzwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjEgSnVuZSAyMDExPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2L2RhdmlkejwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5kZWZpbmUgT2JqZWN0TWFuYWdlcjsgcmVzZXJ2ZSBleHRyYSBwc2V1ZG8tdHlwZS1jb2RlcyB1c2VkCisgICAgICAgICBieSBHVmFyaWFudDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE2PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MTEgQXByaWwgMjAxMTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmFkZCBwYXRoX25hbWVzcGFjZSwgYXJnMG5hbWVzcGFjZTsgYXJnTnBhdGggbWF0Y2hlcyBvYmplY3QKKyAgICAgICAgcGF0aHM8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xNTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjMgTm92ZW1iZXIgMjAxMDwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE0PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MTIgTWF5IDIwMTA8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMzwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIzIERlemVtYmVyIDIwMDk8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMjwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjcgTm92ZW1iZXIsIDIwMDY8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjYgRmVicnVhcnkgMjAwNTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjEwPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjggSmFudWFyeSAyMDA1PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuOTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjcgSmFudWFyIDIwMDU8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC44PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MDYgU2VwdGVtYmVyIDIwMDM8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5GaXJzdCByZWxlYXNlZCBkb2N1bWVudC48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgIDwvcmV2aGlzdG9yeT4KKyAgPC9hcnRpY2xlaW5mbz4KKworICA8c2VjdDEgaWQ9ImludHJvZHVjdGlvbiI+CisgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBhIHN5c3RlbSBmb3IgbG93LW92ZXJoZWFkLCBlYXN5IHRvIHVzZQorICAgICAgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gKElQQykuIEluIG1vcmUgZGV0YWlsOgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRC1CdXMgaXMgPGVtcGhhc2lzPmxvdy1vdmVyaGVhZDwvZW1waGFzaXM+IGJlY2F1c2UgaXQgdXNlcyBhCisgICAgICAgICAgICBiaW5hcnkgcHJvdG9jb2wsIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gYSB0ZXh0CisgICAgICAgICAgICBmb3JtYXQgc3VjaCBhcyBYTUwuIEJlY2F1c2UgRC1CdXMgaXMgaW50ZW5kZWQgZm9yIHBvdGVudGlhbGx5CisgICAgICAgICAgICBoaWdoLXJlc29sdXRpb24gc2FtZS1tYWNoaW5lIElQQywgbm90IHByaW1hcmlseSBmb3IgSW50ZXJuZXQgSVBDLAorICAgICAgICAgICAgdGhpcyBpcyBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24uIEQtQnVzIGlzIGFsc28gZGVzaWduZWQgdG8KKyAgICAgICAgICAgIGF2b2lkIHJvdW5kIHRyaXBzIGFuZCBhbGxvdyBhc3luY2hyb25vdXMgb3BlcmF0aW9uLCBtdWNoIGxpa2UKKyAgICAgICAgICAgIHRoZSBYIHByb3RvY29sLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRC1CdXMgaXMgPGVtcGhhc2lzPmVhc3kgdG8gdXNlPC9lbXBoYXNpcz4gYmVjYXVzZSBpdCB3b3JrcyBpbiB0ZXJtcworICAgICAgICAgICAgb2YgPGZpcnN0dGVybT5tZXNzYWdlczwvZmlyc3R0ZXJtPiByYXRoZXIgdGhhbiBieXRlIHN0cmVhbXMsIGFuZAorICAgICAgICAgICAgYXV0b21hdGljYWxseSBoYW5kbGVzIGEgbG90IG9mIHRoZSBoYXJkIElQQyBpc3N1ZXMuIEFsc28sIHRoZSBELUJ1cworICAgICAgICAgICAgbGlicmFyeSBpcyBkZXNpZ25lZCB0byBiZSB3cmFwcGVkIGluIGEgd2F5IHRoYXQgbGV0cyBkZXZlbG9wZXJzIHVzZQorICAgICAgICAgICAgdGhlaXIgZnJhbWV3b3JrJ3MgZXhpc3Rpbmcgb2JqZWN0L3R5cGUgc3lzdGVtLCByYXRoZXIgdGhhbiBsZWFybmluZworICAgICAgICAgICAgYSBuZXcgb25lIHNwZWNpZmljYWxseSBmb3IgSVBDLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgVGhlIGJhc2UgRC1CdXMgcHJvdG9jb2wgaXMgYSBvbmUtdG8tb25lIChwZWVyLXRvLXBlZXIgb3IgY2xpZW50LXNlcnZlcikKKyAgICAgIHByb3RvY29sLCBzcGVjaWZpZWQgaW4gPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbCIvPi4gVGhhdCBpcywgaXQgaXMKKyAgICAgIGEgc3lzdGVtIGZvciBvbmUgYXBwbGljYXRpb24gdG8gdGFsayB0byBhIHNpbmdsZSBvdGhlcgorICAgICAgYXBwbGljYXRpb24uIEhvd2V2ZXIsIHRoZSBwcmltYXJ5IGludGVuZGVkIGFwcGxpY2F0aW9uIG9mIHRoZSBwcm90b2NvbCBpcyB0aGUKKyAgICAgIEQtQnVzIDxmaXJzdHRlcm0+bWVzc2FnZSBidXM8L2ZpcnN0dGVybT4sIHNwZWNpZmllZCBpbiA8eHJlZgorICAgICAgbGlua2VuZD0ibWVzc2FnZS1idXMiLz4uIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdAorICAgICAgYWNjZXB0cyBjb25uZWN0aW9ucyBmcm9tIG11bHRpcGxlIG90aGVyIGFwcGxpY2F0aW9ucywgYW5kIGZvcndhcmRzCisgICAgICBtZXNzYWdlcyBhbW9uZyB0aGVtLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgVXNlcyBvZiBELUJ1cyBpbmNsdWRlIG5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2hhbmdlcyAobm90aWZpY2F0aW9uIG9mIHdoZW4KKyAgICAgIGEgY2FtZXJhIGlzIHBsdWdnZWQgaW4gdG8gYSBjb21wdXRlciwgb3IgYSBuZXcgdmVyc2lvbiBvZiBzb21lIHNvZnR3YXJlCisgICAgICBoYXMgYmVlbiBpbnN0YWxsZWQpLCBvciBkZXNrdG9wIGludGVyb3BlcmFiaWxpdHksIGZvciBleGFtcGxlIGEgZmlsZQorICAgICAgbW9uaXRvcmluZyBzZXJ2aWNlIG9yIGEgY29uZmlndXJhdGlvbiBzZXJ2aWNlLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgRC1CdXMgaXMgZGVzaWduZWQgZm9yIHR3byBzcGVjaWZpYyB1c2UgY2FzZXM6CisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBICJzeXN0ZW0gYnVzIiBmb3Igbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBzeXN0ZW0gdG8gdXNlciBzZXNzaW9ucywKKyAgICAgICAgICAgIGFuZCB0byBhbGxvdyB0aGUgc3lzdGVtIHRvIHJlcXVlc3QgaW5wdXQgZnJvbSB1c2VyIHNlc3Npb25zLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSAic2Vzc2lvbiBidXMiIHVzZWQgdG8gaW1wbGVtZW50IGRlc2t0b3AgZW52aXJvbm1lbnRzIHN1Y2ggYXMgCisgICAgICAgICAgICBHTk9NRSBhbmQgS0RFLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgRC1CdXMgaXMgbm90IGludGVuZGVkIHRvIGJlIGEgZ2VuZXJpYyBJUEMgc3lzdGVtIGZvciBhbnkgcG9zc2libGUgCisgICAgICBhcHBsaWNhdGlvbiwgYW5kIGludGVudGlvbmFsbHkgb21pdHMgbWFueSBmZWF0dXJlcyBmb3VuZCBpbiBvdGhlciAKKyAgICAgIElQQyBzeXN0ZW1zIGZvciB0aGlzIHJlYXNvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSBidXMgZGFlbW9ucyBvZmZlciBhIG51bWJlciBvZiBmZWF0dXJlcyBub3QgZm91bmQgaW4KKyAgICAgIG90aGVyIElQQyBzeXN0ZW1zLCBzdWNoIGFzIHNpbmdsZS1vd25lciAiYnVzIG5hbWVzIiAoc2ltaWxhciB0byBYCisgICAgICBzZWxlY3Rpb25zKSwgb24tZGVtYW5kIHN0YXJ0dXAgb2Ygc2VydmljZXMsIGFuZCBzZWN1cml0eSBwb2xpY2llcy4KKyAgICAgIEluIG1hbnkgd2F5cywgdGhlc2UgZmVhdHVyZXMgYXJlIHRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIGRldmVsb3BpbmcgCisgICAgICBELUJ1czsgb3RoZXIgc3lzdGVtcyB3b3VsZCBoYXZlIHN1ZmZpY2VkIGlmIElQQyB3ZXJlIHRoZSBvbmx5IGdvYWwuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBELUJ1cyBtYXkgdHVybiBvdXQgdG8gYmUgdXNlZnVsIGluIHVuYW50aWNpcGF0ZWQgYXBwbGljYXRpb25zLCBidXQgZnV0dXJlCisgICAgICB2ZXJzaW9ucyBvZiB0aGlzIHNwZWMgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcHJvYmFibHkgd2lsbCBub3QKKyAgICAgIGluY29ycG9yYXRlIGZlYXR1cmVzIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhlIGNvcmUgdXNlIGNhc2VzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgVGhlIGtleSB3b3JkcyAiTVVTVCIsICJNVVNUIE5PVCIsICJSRVFVSVJFRCIsICJTSEFMTCIsICJTSEFMTCBOT1QiLAorICAgICAgIlNIT1VMRCIsICJTSE9VTEQgTk9UIiwgIlJFQ09NTUVOREVEIiwgIk1BWSIsIGFuZCAiT1BUSU9OQUwiIGluIHRoaXMKKyAgICAgIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcyBkZXNjcmliZWQgaW4gUkZDIDIxMTkuIEhvd2V2ZXIsIHRoZQorICAgICAgZG9jdW1lbnQgY291bGQgdXNlIGEgc2VyaW91cyBhdWRpdCB0byBiZSBzdXJlIGl0IG1ha2VzIHNlbnNlIHRvIGRvCisgICAgICBzby4gQWxzbywgdGhleSBhcmUgbm90IGNhcGl0YWxpemVkLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0ic3RhYmlsaXR5Ij4KKyAgICAgIDx0aXRsZT5Qcm90b2NvbCBhbmQgU3BlY2lmaWNhdGlvbiBTdGFiaWxpdHk8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBELUJ1cyBwcm90b2NvbCBpcyBmcm96ZW4gKG9ubHkgY29tcGF0aWJsZSBleHRlbnNpb25zIGFyZSBhbGxvd2VkKSBhcworICAgICAgICBvZiBOb3ZlbWJlciA4LCAyMDA2LiAgSG93ZXZlciwgdGhpcyBzcGVjaWZpY2F0aW9uIGNvdWxkIHN0aWxsIHVzZSBhIGZhaXIKKyAgICAgICAgYml0IG9mIHdvcmsgdG8gbWFrZSBpbnRlcm9wZXJhYmxlIHJlaW1wbGVtZW50YXRpb24gcG9zc2libGUgd2l0aG91dAorICAgICAgICByZWZlcmVuY2UgdG8gdGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4gVGh1cywgdGhpcworICAgICAgICBzcGVjaWZpY2F0aW9uIGlzIG5vdCBtYXJrZWQgMS4wLiBUbyBtYXJrIGl0IDEuMCwgd2UnZCBsaWtlIHRvIHNlZQorICAgICAgICBzb21lb25lIGludmVzdCBzaWduaWZpY2FudCBlZmZvcnQgaW4gY2xhcmlmeWluZyB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAgICBsYW5ndWFnZSwgYW5kIGdyb3dpbmcgdGhlIHNwZWNpZmljYXRpb24gdG8gY292ZXIgbW9yZSBhc3BlY3RzIG9mIHRoZQorICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24ncyBiZWhhdmlvci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbnRpbCB0aGlzIHdvcmsgaXMgY29tcGxldGUsIGFueSBhdHRlbXB0IHRvIHJlaW1wbGVtZW50IEQtQnVzIHdpbGwgCisgICAgICAgIHByb2JhYmx5IHJlcXVpcmUgbG9va2luZyBhdCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGFuZC9vciBhc2tpbmcKKyAgICAgICAgcXVlc3Rpb25zIG9uIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QgYWJvdXQgaW50ZW5kZWQgYmVoYXZpb3IuIAorICAgICAgICBRdWVzdGlvbnMgb24gdGhlIGxpc3QgYXJlIHZlcnkgd2VsY29tZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBOb25ldGhlbGVzcywgdGhpcyBkb2N1bWVudCBzaG91bGQgYmUgYSB1c2VmdWwgc3RhcnRpbmcgcG9pbnQgYW5kIGlzIAorICAgICAgICB0byBvdXIga25vd2xlZGdlIGFjY3VyYXRlLCB0aG91Z2ggaW5jb21wbGV0ZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIAorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0idHlwZS1zeXN0ZW0iPgorICAgIDx0aXRsZT5UeXBlIFN5c3RlbTwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgIEQtQnVzIGhhcyBhIHR5cGUgc3lzdGVtLCBpbiB3aGljaCB2YWx1ZXMgb2YgdmFyaW91cyB0eXBlcyBjYW4gYmUKKyAgICAgIHNlcmlhbGl6ZWQgaW50byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHJlZmVycmVkIHRvIGFzIHRoZQorICAgICAgPGZpcnN0dGVybT53aXJlIGZvcm1hdDwvZmlyc3R0ZXJtPiBpbiBhIHN0YW5kYXJkIHdheS4KKyAgICAgIENvbnZlcnRpbmcgYSB2YWx1ZSBmcm9tIHNvbWUgb3RoZXIgcmVwcmVzZW50YXRpb24gaW50byB0aGUgd2lyZQorICAgICAgZm9ybWF0IGlzIGNhbGxlZCA8Zmlyc3R0ZXJtPm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4gYW5kIGNvbnZlcnRpbmcKKyAgICAgIGl0IGJhY2sgZnJvbSB0aGUgd2lyZSBmb3JtYXQgaXMgPGZpcnN0dGVybT51bm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSB0eXBlIHRhZ3MgaW4gdGhlIG1hcnNoYWxlZCBkYXRhOyBhCisgICAgICBibG9jayBvZiBtYXJzaGFsZWQgdmFsdWVzIG11c3QgaGF2ZSBhIGtub3duIDxmaXJzdHRlcm0+dHlwZQorICAgICAgICBzaWduYXR1cmU8L2ZpcnN0dGVybT4uIFRoZSB0eXBlIHNpZ25hdHVyZSBpcyBtYWRlIHVwIG9mIHplcm8gb3IgbW9yZQorICAgICAgPGZpcnN0dGVybSBpZD0idGVybS1zaW5nbGUtY29tcGxldGUtdHlwZSI+c2luZ2xlIGNvbXBsZXRlCisgICAgICAgIHR5cGVzPC9maXJzdHRlcm0+LCBlYWNoIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUKKyAgICAgIDxmaXJzdHRlcm0+dHlwZSBjb2RlczwvZmlyc3R0ZXJtPi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEEgdHlwZSBjb2RlIGlzIGFuIEFTQ0lJIGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlCisgICAgICB0eXBlIG9mIGEgdmFsdWUuIEJlY2F1c2UgQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCwgdGhlIHR5cGUgc2lnbmF0dXJlCisgICAgICB3aWxsIGFsd2F5cyBmb3JtIGEgdmFsaWQgQVNDSUkgc3RyaW5nLiBBIHNpbXBsZSBzdHJpbmcgY29tcGFyZQorICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB0eXBlIHNpZ25hdHVyZXMgYXJlIGVxdWl2YWxlbnQuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBIHNpbmdsZSBjb21wbGV0ZSB0eXBlIGlzIGEgc2VxdWVuY2Ugb2YgdHlwZSBjb2RlcyB0aGF0IGZ1bGx5IGRlc2NyaWJlcworICAgICAgb25lIHR5cGU6IGVpdGhlciBhIGJhc2ljIHR5cGUsIG9yIGEgc2luZ2xlIGZ1bGx5LWRlc2NyaWJlZCBjb250YWluZXIgdHlwZS4KKyAgICAgIEEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgaXMgYSBiYXNpYyB0eXBlIGNvZGUsIGEgdmFyaWFudCB0eXBlIGNvZGUsCisgICAgICBhbiBhcnJheSB3aXRoIGl0cyBlbGVtZW50IHR5cGUsIG9yIGEgc3RydWN0IHdpdGggaXRzIGZpZWxkcyAoYWxsIG9mIHdoaWNoCisgICAgICBhcmUgZGVmaW5lZCBiZWxvdykuIFNvIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlcyBhcmUgbm90IHNpbmdsZSBjb21wbGV0ZQorICAgICAgdHlwZXM6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICJhYSIKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICIoaWkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAiaWkpIgorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIEFuZCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXMgY29udGFpbiBtdWx0aXBsZSBjb21wbGV0ZSB0eXBlczoKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgImlpIgorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgImFpYWkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAiKGlpKShpaSkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgTm90ZSBob3dldmVyIHRoYXQgYSBzaW5nbGUgY29tcGxldGUgdHlwZSBtYXkgPGVtcGhhc2lzPmNvbnRhaW48L2VtcGhhc2lzPgorICAgICAgbXVsdGlwbGUgb3RoZXIgc2luZ2xlIGNvbXBsZXRlIHR5cGVzLCBieSBjb250YWluaW5nIGEgc3RydWN0IG9yIGRpY3QKKyAgICAgIGVudHJ5LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0iYmFzaWMtdHlwZXMiPgorICAgICAgPHRpdGxlPkJhc2ljIHR5cGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzaW1wbGVzdCB0eXBlIGNvZGVzIGFyZSB0aGUgPGZpcnN0dGVybSBpZD0idGVybS1iYXNpYy10eXBlIj5iYXNpYworICAgICAgICAgIHR5cGVzPC9maXJzdHRlcm0+LCB3aGljaCBhcmUgdGhlIHR5cGVzIHdob3NlIHN0cnVjdHVyZSBpcyBlbnRpcmVseQorICAgICAgICBkZWZpbmVkIGJ5IHRoZWlyIDEtY2hhcmFjdGVyIHR5cGUgY29kZS4gQmFzaWMgdHlwZXMgY29uc2lzdCBvZgorICAgICAgICBmaXhlZCB0eXBlcyBhbmQgc3RyaW5nLWxpa2UgdHlwZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGZpcnN0dGVybSBpZD0idGVybS1maXhlZC10eXBlIj5maXhlZCB0eXBlczwvZmlyc3R0ZXJtPgorICAgICAgICBhcmUgYmFzaWMgdHlwZXMgd2hvc2UgdmFsdWVzIGhhdmUgYSBmaXhlZCBsZW5ndGgsIG5hbWVseSBCWVRFLAorICAgICAgICBCT09MRUFOLCBET1VCTEUsIFVOSVhfRkQsIGFuZCBzaWduZWQgb3IgdW5zaWduZWQgaW50ZWdlcnMgb2YgbGVuZ3RoCisgICAgICAgIDE2LCAzMiBvciA2NCBiaXRzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXMgYSBzaW1wbGUgZXhhbXBsZSwgdGhlIHR5cGUgY29kZSBmb3IgMzItYml0IGludGVnZXIgKDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPikgaXMKKyAgICAgICAgdGhlIEFTQ0lJIGNoYXJhY3RlciAnaScuIFNvIHRoZSBzaWduYXR1cmUgZm9yIGEgYmxvY2sgb2YgdmFsdWVzIAorICAgICAgICBjb250YWluaW5nIGEgc2luZ2xlIDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPiB3b3VsZCBiZToKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBBIGJsb2NrIG9mIHZhbHVlcyBjb250YWluaW5nIHR3byA8bGl0ZXJhbD5JTlQzMjwvbGl0ZXJhbD4gd291bGQgaGF2ZSB0aGlzIHNpZ25hdHVyZToKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJpaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4gICAgICAgIAorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZml4ZWQgdHlwZXMgYXJlIGxpc3RlZCBpbiB0aGlzIHRhYmxlLgorCisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QVNDSUkgdHlwZS1jb2RlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW5jb2Rpbmc8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+eTwvbGl0ZXJhbD4gKDEyMSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VbnNpZ25lZCA4LWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+YjwvbGl0ZXJhbD4gKDk4KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkJvb2xlYW4gdmFsdWU6IDAgaXMgZmFsc2UsIDEgaXMgdHJ1ZSwgYW55IG90aGVyIHZhbHVlCisgICAgICAgICAgICAgICAgICBhbGxvd2VkIGJ5IHRoZSBtYXJzaGFsbGluZyBmb3JtYXQgaXMgaW52YWxpZDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5uPC9saXRlcmFsPiAoMTEwKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNpZ25lZCAodHdvJ3MgY29tcGxlbWVudCkgMTYtYml0IGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnE8L2xpdGVyYWw+ICgxMTMpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5zaWduZWQgMTYtYml0IGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+aTwvbGl0ZXJhbD4gKDEwNSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5TaWduZWQgKHR3bydzIGNvbXBsZW1lbnQpIDMyLWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD51PC9saXRlcmFsPiAoMTE3KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPng8L2xpdGVyYWw+ICgxMjApPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U2lnbmVkICh0d28ncyBjb21wbGVtZW50KSA2NC1iaXQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgKG1uZW1vbmljOiB4IGFuZCB0IGFyZSB0aGUgZmlyc3QgY2hhcmFjdGVycyBpbiAic2l4dHkiIG5vdAorICAgICAgICAgICAgICAgICAgYWxyZWFkeSB1c2VkIGZvciBzb21ldGhpbmcgbW9yZSBjb21tb24pPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD50PC9saXRlcmFsPiAoMTE2KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkRPVUJMRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5kPC9saXRlcmFsPiAoMTAwKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PklFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5oPC9saXRlcmFsPiAoMTA0KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHJlcHJlc2VudGluZyBhbiBpbmRleCBpbnRvIGFuCisgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZCBhcnJheSBvZiBmaWxlIGRlc2NyaXB0b3JzLCB0cmFuc2ZlcnJlZCB2aWEgc29tZQorICAgICAgICAgICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgbWVjaGFuaXNtIChtbmVtb25pYzogaCBmb3IgaGFuZGxlKTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxmaXJzdHRlcm0gaWQ9InRlcm0tc3RyaW5nLWxpa2UtdHlwZSI+c3RyaW5nLWxpa2UgdHlwZXM8L2ZpcnN0dGVybT4KKyAgICAgICAgYXJlIGJhc2ljIHR5cGVzIHdpdGggYSB2YXJpYWJsZSBsZW5ndGguIFRoZSB2YWx1ZSBvZiBhbnkgc3RyaW5nLWxpa2UKKyAgICAgICAgdHlwZSBpcyBjb25jZXB0dWFsbHkgMCBvciBtb3JlIFVuaWNvZGUgY29kZXBvaW50cyBlbmNvZGVkIGluIFVURi04LAorICAgICAgICBub25lIG9mIHdoaWNoIG1heSBiZSBVKzAwMDAuIFRoZSBVVEYtOCB0ZXh0IG11c3QgYmUgdmFsaWRhdGVkCisgICAgICAgIHN0cmljdGx5OiBpbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IG5vdCBjb250YWluIG92ZXJsb25nIHNlcXVlbmNlcworICAgICAgICBvciBjb2RlcG9pbnRzIGFib3ZlIFUrMTBGRkZGLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgU2luY2UgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMjEsIGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlCisgICAgICAgIENvcnJpZ2VuZHVtICM5LCB0aGUgIm5vbmNoYXJhY3RlcnMiIFUrRkREMC4uVStGREVGLCBVK25GRkZFIGFuZAorICAgICAgICBVK25GRkZGIGFyZSBhbGxvd2VkIGluIFVURi04IHN0cmluZ3MgKGJ1dCBub3RlIHRoYXQgb2xkZXIgdmVyc2lvbnMgb2YKKyAgICAgICAgRC1CdXMgcmVqZWN0ZWQgdGhlc2Ugbm9uY2hhcmFjdGVycykuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWFyc2hhbGxpbmcgZm9ybWF0cyBmb3IgdGhlIHN0cmluZy1saWtlIHR5cGVzIGFsbCBlbmQgd2l0aCBhCisgICAgICAgIHNpbmdsZSB6ZXJvIChOVUwpIGJ5dGUsIGJ1dCB0aGF0IGJ5dGUgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZgorICAgICAgICB0aGUgdGV4dC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHN0cmluZy1saWtlIHR5cGVzIGFyZSBsaXN0ZWQgaW4gdGhpcyB0YWJsZS4KKworICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFTQ0lJIHR5cGUtY29kZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhbGlkaXR5IGNvbnN0cmFpbnRzPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+czwvbGl0ZXJhbD4gKDExNSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5ObyBleHRyYSBjb25zdHJhaW50czwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5vPC9saXRlcmFsPiAoMTExKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk11c3QgYmUKKyAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCI+YQorICAgICAgICAgICAgICAgICAgICBzeW50YWN0aWNhbGx5IHZhbGlkIG9iamVjdCBwYXRoPC9saW5rPjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+ZzwvbGl0ZXJhbD4gKDEwMyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5aZXJvIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgIDxmaXJzdHRlcm0gbGlua2VuZD0idGVybS1zaW5nbGUtY29tcGxldGUtdHlwZSI+c2luZ2xlCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHR5cGVzPC9maXJzdHRlcm0+PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLW9iamVjdC1wYXRoIj4KKyAgICAgICAgPHRpdGxlPlZhbGlkIE9iamVjdCBQYXRoczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gb2JqZWN0IHBhdGggaXMgYSBuYW1lIHVzZWQgdG8gcmVmZXIgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorICAgICAgICAgIENvbmNlcHR1YWxseSwgZWFjaCBwYXJ0aWNpcGFudCBpbiBhIEQtQnVzIG1lc3NhZ2UgZXhjaGFuZ2UgbWF5IGhhdmUKKyAgICAgICAgICBhbnkgbnVtYmVyIG9mIG9iamVjdCBpbnN0YW5jZXMgKHRoaW5rIG9mIEMrKyBvciBKYXZhIG9iamVjdHMpIGFuZCBlYWNoCisgICAgICAgICAgc3VjaCBpbnN0YW5jZSB3aWxsIGhhdmUgYSBwYXRoLiBMaWtlIGEgZmlsZXN5c3RlbSwgdGhlIG9iamVjdAorICAgICAgICAgIGluc3RhbmNlcyBpbiBhbiBhcHBsaWNhdGlvbiBmb3JtIGEgaGllcmFyY2hpY2FsIHRyZWUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPYmplY3QgcGF0aHMgYXJlIG9mdGVuIG5hbWVzcGFjZWQgYnkgc3RhcnRpbmcgd2l0aCBhIHJldmVyc2VkCisgICAgICAgICAgZG9tYWluIG5hbWUgYW5kIGNvbnRhaW5pbmcgYW4gaW50ZXJmYWNlIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUKKyAgICAgICAgICBzYW1lIHdheSBhcworICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIj5pbnRlcmZhY2UKKyAgICAgICAgICAgIG5hbWVzPC9saW5rPiBhbmQKKyAgICAgICAgICA8bGluayBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyI+d2VsbC1rbm93bgorICAgICAgICAgICAgYnVzIG5hbWVzPC9saW5rPi4KKyAgICAgICAgICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcGxlbWVudCBtb3JlIHRoYW4gb25lIHNlcnZpY2UsIG9yCisgICAgICAgICAgbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGEgc2VydmljZSwgaW4gdGhlIHNhbWUgcHJvY2VzcywKKyAgICAgICAgICBldmVuIGlmIHRoZSBzZXJ2aWNlcyBzaGFyZSBhIGNvbm5lY3Rpb24gYnV0IGNhbm5vdCBvdGhlcndpc2UKKyAgICAgICAgICBjby1vcGVyYXRlIChmb3IgaW5zdGFuY2UsIGlmIHRoZXkgYXJlIGltcGxlbWVudGVkIGJ5IGRpZmZlcmVudAorICAgICAgICAgIHBsdWdpbnMpLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRm9yIGluc3RhbmNlLCBpZiB0aGUgb3duZXIgb2YgPGxpdGVyYWw+ZXhhbXBsZS5jb208L2xpdGVyYWw+IGlzCisgICAgICAgICAgZGV2ZWxvcGluZyBhIEQtQnVzIEFQSSBmb3IgYSBtdXNpYyBwbGF5ZXIsIHRoZXkgbWlnaHQgdXNlIHRoZQorICAgICAgICAgIGhpZXJhcmNoeSBvZiBvYmplY3QgcGF0aHMgdGhhdCBzdGFydCB3aXRoCisgICAgICAgICAgPGxpdGVyYWw+L2NvbS9leGFtcGxlL011c2ljUGxheWVyMTwvbGl0ZXJhbD4gZm9yIGl0cyBvYmplY3RzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGZvbGxvd2luZyBydWxlcyBkZWZpbmUgYSB2YWxpZCBvYmplY3QgcGF0aC4gSW1wbGVtZW50YXRpb25zIG11c3QKKyAgICAgICAgICBub3Qgc2VuZCBvciBhY2NlcHQgbWVzc2FnZXMgd2l0aCBpbnZhbGlkIG9iamVjdCBwYXRocy4KKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgcGF0aCBtYXkgYmUgb2YgYW55IGxlbmd0aC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGFuIEFTQ0lJICcvJyAoaW50ZWdlciA0NykgY2hhcmFjdGVyLAorICAgICAgICAgICAgICAgIGFuZCBtdXN0IGNvbnNpc3Qgb2YgZWxlbWVudHMgc2VwYXJhdGVkIGJ5IHNsYXNoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBObyBlbGVtZW50IG1heSBiZSB0aGUgZW1wdHkgc3RyaW5nLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBNdWx0aXBsZSAnLycgY2hhcmFjdGVycyBjYW5ub3Qgb2NjdXIgaW4gc2VxdWVuY2UuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEEgdHJhaWxpbmcgJy8nIGNoYXJhY3RlciBpcyBub3QgYWxsb3dlZCB1bmxlc3MgdGhlCisgICAgICAgICAgICAgICAgcGF0aCBpcyB0aGUgcm9vdCBwYXRoIChhIHNpbmdsZSAnLycgY2hhcmFjdGVyKS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1zaWduYXR1cmUiPgorICAgICAgICA8dGl0bGU+VmFsaWQgU2lnbmF0dXJlczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGludmFsaWQgc2lnbmF0dXJlcy4KKyAgICAgICAgICBWYWxpZCBzaWduYXR1cmVzIHdpbGwgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzaWduYXR1cmUgaXMgYSBsaXN0IG9mIHNpbmdsZSBjb21wbGV0ZSB0eXBlcy4KKyAgICAgICAgICAgICAgICBBcnJheXMgbXVzdCBoYXZlIGVsZW1lbnQgdHlwZXMsIGFuZCBzdHJ1Y3RzIG11c3QKKyAgICAgICAgICAgICAgICBoYXZlIGJvdGggb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9ubHkgdHlwZSBjb2Rlcywgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMsIGFuZCBvcGVuIGFuZAorICAgICAgICAgICAgICAgIGNsb3NlIGN1cmx5IGJyYWNrZXRzIGFyZSBhbGxvd2VkIGluIHRoZSBzaWduYXR1cmUuIFRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gdHlwZSBjb2RlCisgICAgICAgICAgICAgICAgaXMgbm90IGFsbG93ZWQgaW4gc2lnbmF0dXJlcywgYmVjYXVzZSBwYXJlbnRoZXNlcworICAgICAgICAgICAgICAgIGFyZSB1c2VkIGluc3RlYWQuIFNpbWlsYXJseSwgdGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gdHlwZSBjb2RlIGlzIG5vdCBhbGxvd2VkIGluCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlcywgYmVjYXVzZSBjdXJseSBicmFja2V0cyBhcmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBkZXB0aCBvZiBjb250YWluZXIgdHlwZSBuZXN0aW5nIGlzIDMyIGFycmF5IHR5cGUKKyAgICAgICAgICAgICAgICBjb2RlcyBhbmQgMzIgb3BlbiBwYXJlbnRoZXNlcy4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICB0b3RhbCBkZXB0aCBvZiByZWN1cnNpb24gaXMgNjQsIGZvciBhbiAiYXJyYXkgb2YgYXJyYXkgb2YgYXJyYXkKKyAgICAgICAgICAgICAgICBvZiAuLi4gc3RydWN0IG9mIHN0cnVjdCBvZiBzdHJ1Y3Qgb2YgLi4uIiAgd2hlcmUgdGhlcmUgYXJlIDMyCisgICAgICAgICAgICAgICAgYXJyYXkgYW5kIDMyIHN0cnVjdC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2lnbmF0dXJlIGlzIDI1NS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoZW4gc2lnbmF0dXJlcyBhcHBlYXIgaW4gbWVzc2FnZXMsIHRoZSBtYXJzaGFsbGluZyBmb3JtYXQKKyAgICAgICAgICBndWFyYW50ZWVzIHRoYXQgdGhleSB3aWxsIGJlIGZvbGxvd2VkIGJ5IGEgbnVsIGJ5dGUgKHdoaWNoIGNhbgorICAgICAgICAgIGJlIGludGVycHJldGVkIGFzIGVpdGhlciBDLXN0eWxlIHN0cmluZyB0ZXJtaW5hdGlvbiBvciB0aGUgSU5WQUxJRAorICAgICAgICAgIHR5cGUtY29kZSksIGJ1dCB0aGlzIGlzIG5vdCBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgc2lnbmF0dXJlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iY29udGFpbmVyLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5Db250YWluZXIgdHlwZXM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gYWRkaXRpb24gdG8gYmFzaWMgdHlwZXMsIHRoZXJlIGFyZSBmb3VyIDxmaXJzdHRlcm0+Y29udGFpbmVyPC9maXJzdHRlcm0+IAorICAgICAgICB0eXBlczogPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiwgPGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+LCA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiwgCisgICAgICAgIGFuZCA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gaGFzIGEgdHlwZSBjb2RlLCBBU0NJSSBjaGFyYWN0ZXIgJ3InLCBidXQgdGhpcyB0eXBlIAorICAgICAgICBjb2RlIGRvZXMgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzLiBJbnN0ZWFkLCBBU0NJSSBjaGFyYWN0ZXJzCisgICAgICAgICcoJyBhbmQgJyknIGFyZSB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBzdHJ1Y3QuCisgICAgICAgIFNvIGZvciBleGFtcGxlLCBhIHN0cnVjdCBjb250YWluaW5nIHR3byBpbnRlZ2VycyB3b3VsZCBoYXZlIHRoaXMgCisgICAgICAgIHNpZ25hdHVyZToKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBTdHJ1Y3RzIGNhbiBiZSBuZXN0ZWQsIHNvIGZvciBleGFtcGxlIGEgc3RydWN0IGNvbnRhaW5pbmcgCisgICAgICAgIGFuIGludGVnZXIgYW5kIGFub3RoZXIgc3RydWN0OgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIihpKGlpKSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFRoZSB2YWx1ZSBibG9jayBzdG9yaW5nIHRoYXQgc3RydWN0IHdvdWxkIGNvbnRhaW4gdGhyZWUgaW50ZWdlcnM7IHRoZQorICAgICAgICB0eXBlIHNpZ25hdHVyZSBhbGxvd3MgeW91IHRvIGRpc3Rpbmd1aXNoICIoaShpaSkpIiBmcm9tICIoKGlpKWkpIiBvcgorICAgICAgICAiKGlpaSkiIG9yICJpaWkiLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gdHlwZSBjb2RlICdyJyBpcyBub3QgY3VycmVudGx5IHVzZWQgaW4gdGhlIEQtQnVzIHByb3RvY29sLAorICAgICAgICBidXQgaXMgdXNlZnVsIGluIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbC4gVGhpcyB0eXBlIGNvZGUgCisgICAgICAgIGlzIHNwZWNpZmllZCB0byBhbGxvdyBzdWNoIGNvZGUgdG8gaW50ZXJvcGVyYXRlIGluIG5vbi1wcm90b2NvbCBjb250ZXh0cy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVtcHR5IHN0cnVjdHVyZXMgYXJlIG5vdCBhbGxvd2VkOyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZQorICAgICAgICB0eXBlIGNvZGUgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD4gaGFzIEFTQ0lJIGNoYXJhY3RlciAnYScgYXMgdHlwZSBjb2RlLiBUaGUgYXJyYXkgdHlwZSBjb2RlIG11c3QgYmUKKyAgICAgICAgZm9sbG93ZWQgYnkgYSA8Zmlyc3R0ZXJtPnNpbmdsZSBjb21wbGV0ZSB0eXBlPC9maXJzdHRlcm0+LiBUaGUgc2luZ2xlCisgICAgICAgIGNvbXBsZXRlIHR5cGUgZm9sbG93aW5nIHRoZSBhcnJheSBpcyB0aGUgdHlwZSBvZiBlYWNoIGFycmF5IGVsZW1lbnQuIFNvCisgICAgICAgIHRoZSBzaW1wbGUgZXhhbXBsZSBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgd2hpY2ggaXMgYW4gYXJyYXkgb2YgMzItYml0IGludGVnZXJzLiBCdXQgYW4gYXJyYXkgY2FuIGJlIG9mIGFueSB0eXBlLCAKKyAgICAgICAgc3VjaCBhcyB0aGlzIGFycmF5LW9mLXN0cnVjdC13aXRoLXR3by1pbnQzMi1maWVsZHM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYShpaSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIE9yIHRoaXMgYXJyYXkgb2YgYXJyYXkgb2YgaW50ZWdlcjoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhYWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiBoYXMgQVNDSUkgY2hhcmFjdGVyICd2JyBhcyBpdHMgdHlwZSBjb2RlLiBBIG1hcnNoYWxlZCB2YWx1ZSBvZgorICAgICAgICB0eXBlIDxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+IHdpbGwgaGF2ZSB0aGUgc2lnbmF0dXJlIG9mIGEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgYXMgcGFydAorICAgICAgICBvZiB0aGUgPGVtcGhhc2lzPnZhbHVlPC9lbXBoYXNpcz4uICBUaGlzIHNpZ25hdHVyZSB3aWxsIGJlIGZvbGxvd2VkIGJ5IGEKKyAgICAgICAgbWFyc2hhbGVkIHZhbHVlIG9mIHRoYXQgdHlwZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFVubGlrZSBhIG1lc3NhZ2Ugc2lnbmF0dXJlLCB0aGUgdmFyaWFudCBzaWduYXR1cmUgY2FuCisgICAgICAgIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlLiAgU28gImkiLCAiYWkiCisgICAgICAgIG9yICIoaWkpIiBpcyBPSywgYnV0ICJpaSIgaXMgbm90LiAgVXNlIG9mIHZhcmlhbnRzIG1heSBub3QKKyAgICAgICAgY2F1c2UgYSB0b3RhbCBtZXNzYWdlIGRlcHRoIHRvIGJlIGxhcmdlciB0aGFuIDY0LCBpbmNsdWRpbmcKKyAgICAgICAgb3RoZXIgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgc3RydWN0dXJlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gd29ya3MgZXhhY3RseSBsaWtlIGEgc3RydWN0LCBidXQgcmF0aGVyCisgICAgICAgIHRoYW4gcGFyZW50aGVzZXMgaXQgdXNlcyBjdXJseSBicmFjZXMsIGFuZCBpdCBoYXMgbW9yZSByZXN0cmljdGlvbnMuCisgICAgICAgIFRoZSByZXN0cmljdGlvbnMgYXJlOiBpdCBvY2N1cnMgb25seSBhcyBhbiBhcnJheSBlbGVtZW50IHR5cGU7IGl0IGhhcworICAgICAgICBleGFjdGx5IHR3byBzaW5nbGUgY29tcGxldGUgdHlwZXMgaW5zaWRlIHRoZSBjdXJseSBicmFjZXM7IHRoZSBmaXJzdAorICAgICAgICBzaW5nbGUgY29tcGxldGUgdHlwZSAodGhlICJrZXkiKSBtdXN0IGJlIGEgYmFzaWMgdHlwZSByYXRoZXIgdGhhbiBhCisgICAgICAgIGNvbnRhaW5lciB0eXBlLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyBvdXRzaWRlIG9mCisgICAgICAgIGFycmF5cywgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIHR3bworICAgICAgICBmaWVsZHMsIGFuZCBtdXN0IG5vdCBhY2NlcHQgZGljdCBlbnRyaWVzIHdpdGggbm9uLWJhc2ljLXR5cGVkIGtleXMuIEEKKyAgICAgICAgZGljdCBlbnRyeSBpcyBhbHdheXMgYSBrZXktdmFsdWUgcGFpci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gaXMgYWx3YXlzIHRoZSBrZXkuCisgICAgICAgIEEgbWVzc2FnZSBpcyBjb25zaWRlcmVkIGNvcnJ1cHQgaWYgdGhlIHNhbWUga2V5IG9jY3VycyB0d2ljZSBpbiB0aGUgc2FtZQorICAgICAgICBhcnJheSBvZiA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPi4gSG93ZXZlciwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVqZWN0IGRpY3RzIHdpdGggZHVwbGljYXRlIGtleXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBtb3N0IGxhbmd1YWdlcywgYW4gYXJyYXkgb2YgZGljdCBlbnRyeSB3b3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIAorICAgICAgICBtYXAsIGhhc2ggdGFibGUsIG9yIGRpY3Qgb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDI+CisgICAgICA8dGl0bGU+U3VtbWFyeSBvZiB0eXBlczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIEQtQnVzIHR5cGVzLgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5DYXRlZ29yeTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29kZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5yZXNlcnZlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVkFMSUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MCAoQVNDSUkgTlVMKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCBhIHZhbGlkIHR5cGUgY29kZSwgdXNlZCB0byB0ZXJtaW5hdGUgc2lnbmF0dXJlczwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PmZpeGVkLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTIxIChBU0NJSSAneScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+OC1iaXQgdW5zaWduZWQgaW50ZWdlcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PmZpeGVkLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+OTggKEFTQ0lJICdiJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Cb29sZWFuIHZhbHVlLCAwIGlzIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPiBhbmQgMSBpcyA8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPi4gRXZlcnl0aGluZyBlbHNlIGlzIGludmFsaWQuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTEwIChBU0NJSSAnbicpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExMyAoQVNDSUkgJ3EnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA1IChBU0NJSSAnaScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNyAoQVNDSUkgJ3UnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTIwIChBU0NJSSAneCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNiAoQVNDSUkgJ3QnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMCAoQVNDSUkgJ2QnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PklFRUUgNzU0IGRvdWJsZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PnN0cmluZy1saWtlLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTUgKEFTQ0lJICdzJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VVEYtOCBzdHJpbmcgKDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gYmUgdmFsaWQgVVRGLTgpLiBNdXN0IGJlIG51bCB0ZXJtaW5hdGVkIGFuZCBjb250YWluIG5vIG90aGVyIG51bCBieXRlcy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5zdHJpbmctbGlrZSwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTEgKEFTQ0lJICdvJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIG9mIGFuIG9iamVjdCBpbnN0YW5jZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PnN0cmluZy1saWtlLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDMgKEFTQ0lJICdnJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BIHR5cGUgc2lnbmF0dXJlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Y29udGFpbmVyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+OTcgKEFTQ0lJICdhJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BcnJheTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PmNvbnRhaW5lcjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTQgKEFTQ0lJICdyJyksIDQwIChBU0NJSSAnKCcpLCA0MSAoQVNDSUkgJyknKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlN0cnVjdDsgdHlwZSBjb2RlIDExNCAncicgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBpbgorICAgICAgICAgICAgICAgICAgYmluZGluZ3MgYW5kIGltcGxlbWVudGF0aW9ucyB0byByZXByZXNlbnQgdGhlIGdlbmVyYWwKKyAgICAgICAgICAgICAgICAgIGNvbmNlcHQgb2YgYSBzdHJ1Y3QsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcworICAgICAgICAgICAgICAgICAgdXNlZCBvbiBELUJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5jb250YWluZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExOCAoQVNDSUkgJ3YnKSA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5WYXJpYW50IHR5cGUgKHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSB2YWx1ZSBpdHNlbGYpPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Y29udGFpbmVyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDEgKEFTQ0lJICdlJyksIDEyMyAoQVNDSUkgJ3snKSwgMTI1IChBU0NJSSAnfScpIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkVudHJ5IGluIGEgZGljdCBvciBtYXAgKGFycmF5IG9mIGtleS12YWx1ZSBwYWlycykuCisgICAgICAgICAgICAgICAgICBUeXBlIGNvZGUgMTAxICdlJyBpcyByZXNlcnZlZCBmb3IgdXNlIGluIGJpbmRpbmdzIGFuZAorICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHRvIHJlcHJlc2VudCB0aGUgZ2VuZXJhbCBjb25jZXB0IG9mIGEKKyAgICAgICAgICAgICAgICAgIGRpY3Qgb3IgZGljdC1lbnRyeSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgICB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PmZpeGVkLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVOSVhfRkQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA0IChBU0NJSSAnaCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5peCBmaWxlIGRlc2NyaXB0b3I8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+cmVzZXJ2ZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA5IChBU0NJSSAnbScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIDx1bGluaworICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTI3ODU3Ij5hCisgICAgICAgICAgICAgICAgICAnbWF5YmUnIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW4gR1ZhcmlhbnQ8L3VsaW5rPiwKKyAgICAgICAgICAgICAgICAgIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzIHVudGlsCisgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaGVyZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5yZXNlcnZlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PihyZXNlcnZlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40MiAoQVNDSUkgJyonKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlJlc2VydmVkIGZvciB1c2UgaW4gYmluZGluZ3MvaW1wbGVtZW50YXRpb25zIHRvCisgICAgICAgICAgICAgICAgICByZXByZXNlbnQgYW55IDxmaXJzdHRlcm0+c2luZ2xlIGNvbXBsZXRlIHR5cGU8L2ZpcnN0dGVybT4sCisgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMgdXNlZCBvbiBELUJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+cmVzZXJ2ZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjMgKEFTQ0lJICc/Jyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgdXNlIGluIGJpbmRpbmdzL2ltcGxlbWVudGF0aW9ucyB0bworICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGFueSA8Zmlyc3R0ZXJtPmJhc2ljIHR5cGU8L2ZpcnN0dGVybT4sIGFuZCBtdXN0CisgICAgICAgICAgICAgICAgICBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMgdXNlZCBvbiBELUJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+cmVzZXJ2ZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ocmVzZXJ2ZWQpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQgKEFTQ0lJICdAJyksIDM4IChBU0NJSSAnJmFtcDsnKSwKKyAgICAgICAgICAgICAgICAgIDk0IChBU0NJSSAnXicpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSBieSBiaW5kaW5ncy9pbXBsZW1lbnRhdGlvbnMsCisgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMgdXNlZCBvbiBELUJ1cy4KKyAgICAgICAgICAgICAgICAgIEdWYXJpYW50IHVzZXMgdGhlc2UgdHlwZS1jb2RlcyB0byBlbmNvZGUgY2FsbGluZworICAgICAgICAgICAgICAgICAgY29udmVudGlvbnMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nIj4KKyAgICA8dGl0bGU+TWFyc2hhbGluZyAoV2lyZSBGb3JtYXQpPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgRC1CdXMgZGVmaW5lcyBhIG1hcnNoYWxsaW5nIGZvcm1hdCBmb3IgaXRzIHR5cGUgc3lzdGVtLCB3aGljaCBpcworICAgICAgdXNlZCBpbiBELUJ1cyBtZXNzYWdlcy4gVGhpcyBpcyBub3QgdGhlIG9ubHkgcG9zc2libGUgbWFyc2hhbGxpbmcKKyAgICAgIGZvcm1hdCBmb3IgdGhlIHR5cGUgc3lzdGVtOiBmb3IgaW5zdGFuY2UsIEdWYXJpYW50IChwYXJ0IG9mIEdMaWIpCisgICAgICByZS11c2VzIHRoZSBELUJ1cyB0eXBlIHN5c3RlbSBidXQgaW1wbGVtZW50cyBhbiBhbHRlcm5hdGl2ZSBtYXJzaGFsbGluZworICAgICAgZm9ybWF0LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5CeXRlIG9yZGVyIGFuZCBhbGlnbm1lbnQ8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgR2l2ZW4gYSB0eXBlIHNpZ25hdHVyZSwgYSBibG9jayBvZiBieXRlcyBjYW4gYmUgY29udmVydGVkIGludG8gdHlwZWQKKyAgICAgICAgdmFsdWVzLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2NrIG9mIGJ5dGVzLiAgQnl0ZQorICAgICAgICBvcmRlciBhbmQgYWxpZ25tZW50IGlzc3VlcyBhcmUgaGFuZGxlZCB1bmlmb3JtbHkgZm9yIGFsbCBELUJ1cyB0eXBlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgYmxvY2sgb2YgYnl0ZXMgaGFzIGFuIGFzc29jaWF0ZWQgYnl0ZSBvcmRlci4gVGhlIGJ5dGUgb3JkZXIKKyAgICAgICAgaGFzIHRvIGJlIGRpc2NvdmVyZWQgaW4gc29tZSB3YXk7IGZvciBELUJ1cyBtZXNzYWdlcywgdGhlCisgICAgICAgIGJ5dGUgb3JkZXIgaXMgcGFydCBvZiB0aGUgbWVzc2FnZSBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCisgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWVzc2FnZXMiLz4uIEZvciBub3csIGFzc3VtZQorICAgICAgICB0aGF0IHRoZSBieXRlIG9yZGVyIGlzIGtub3duIHRvIGJlIGVpdGhlciBsaXR0bGUgZW5kaWFuIG9yIGJpZworICAgICAgICAgIGVuZGlhbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggdmFsdWUgaW4gYSBibG9jayBvZiBieXRlcyBpcyBhbGlnbmVkICJuYXR1cmFsbHksIiBmb3IgZXhhbXBsZQorICAgICAgICA0LWJ5dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIGEgNC1ieXRlIGJvdW5kYXJ5LCBhbmQgOC1ieXRlIHZhbHVlcyB0byBhbgorICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIFRvIHByb3Blcmx5IGFsaWduIGEgdmFsdWUsIDxmaXJzdHRlcm0+YWxpZ25tZW50CisgICAgICAgIHBhZGRpbmc8L2ZpcnN0dGVybT4gbWF5IGJlIG5lY2Vzc2FyeS4gVGhlIGFsaWdubWVudCBwYWRkaW5nIG11c3QgYWx3YXlzCisgICAgICAgIGJlIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHBhZGRpbmcgdG8gcHJvcGVybHkgYWxpZ24gdGhlIGZvbGxvd2luZyB2YWx1ZTsKKyAgICAgICAgYW5kIGl0IG11c3QgYWx3YXlzIGJlIG1hZGUgdXAgb2YgbnVsIGJ5dGVzLiBUaGUgYWxpZ25tZW50IHBhZGRpbmcgbXVzdAorICAgICAgICBub3QgYmUgbGVmdCB1bmluaXRpYWxpemVkIChpdCBjYW4ndCBjb250YWluIGdhcmJhZ2UpLCBhbmQgbW9yZSBwYWRkaW5nCisgICAgICAgIHRoYW4gcmVxdWlyZWQgbXVzdCBub3QgYmUgdXNlZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFzIGFuIGV4Y2VwdGlvbiB0byBuYXR1cmFsIGFsaWdubWVudCwgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiBhbmQKKyAgICAgICAgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gdmFsdWVzIGFyZSBhbHdheXMgYWxpZ25lZCB0byBhbiA4LWJ5dGUKKyAgICAgICAgYm91bmRhcnksIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudHMgb2YgdGhlaXIgY29udGVudHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5NYXJzaGFsbGluZyBiYXNpYyB0eXBlczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUbyBtYXJzaGFsIGFuZCB1bm1hcnNoYWwgZml4ZWQgdHlwZXMsIHlvdSBzaW1wbHkgcmVhZCBvbmUgdmFsdWUKKyAgICAgICAgZnJvbSB0aGUgZGF0YSBibG9jayBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdHlwZSBjb2RlIGluIHRoZSBzaWduYXR1cmUuCisgICAgICAgIEFsbCBzaWduZWQgaW50ZWdlciB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gdHdvJ3MgY29tcGxlbWVudCwgRE9VQkxFCisgICAgICAgIHZhbHVlcyBhcmUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCwgYW5kIEJPT0xFQU4KKyAgICAgICAgdmFsdWVzIGFyZSBlbmNvZGVkIGluIDMyIGJpdHMgKG9mIHdoaWNoIG9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgICAgICAgIGJpdCBpcyB1c2VkKS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzdHJpbmctbGlrZSB0eXBlcyBhcmUgYWxsIG1hcnNoYWxsZWQgYXMgYQorICAgICAgICBmaXhlZC1sZW5ndGggdW5zaWduZWQgaW50ZWdlciA8dmFybmFtZT5uPC92YXJuYW1lPiBnaXZpbmcgdGhlCisgICAgICAgIGxlbmd0aCBvZiB0aGUgdmFyaWFibGUgcGFydCwgZm9sbG93ZWQgYnkgPHZhcm5hbWU+bjwvdmFybmFtZT4KKyAgICAgICAgbm9uemVybyBieXRlcyBvZiBVVEYtOCB0ZXh0LCBmb2xsb3dlZCBieSBhIHNpbmdsZSB6ZXJvIChudWwpIGJ5dGUKKyAgICAgICAgd2hpY2ggaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUgdGV4dC4gVGhlIGFsaWdubWVudAorICAgICAgICBvZiB0aGUgc3RyaW5nLWxpa2UgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgYWxpZ25tZW50IG9mCisgICAgICAgIDx2YXJuYW1lPm48L3Zhcm5hbWU+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIHRoZSBTVFJJTkcgYW5kIE9CSkVDVF9QQVRIIHR5cGVzLCA8dmFybmFtZT5uPC92YXJuYW1lPiBpcworICAgICAgICBlbmNvZGVkIGluIDQgYnl0ZXMsIGxlYWRpbmcgdG8gNC1ieXRlIGFsaWdubWVudC4KKyAgICAgICAgRm9yIHRoZSBTSUdOQVRVUkUgdHlwZSwgPHZhcm5hbWU+bjwvdmFybmFtZT4gaXMgZW5jb2RlZCBhcyBhIHNpbmdsZQorICAgICAgICBieXRlLiBBcyBhIHJlc3VsdCwgYWxpZ25tZW50IHBhZGRpbmcgaXMgbmV2ZXIgcmVxdWlyZWQgYmVmb3JlIGEKKyAgICAgICAgU0lHTkFUVVJFLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDI+CisgICAgICA8dGl0bGU+TWFyc2hhbGxpbmcgY29udGFpbmVyczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBcnJheXMgYXJlIG1hcnNoYWxsZWQgYXMgYSA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+CisgICAgICAgIDx2YXJuYW1lPm48L3Zhcm5hbWU+IGdpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBkYXRhIGluIGJ5dGVzLAorICAgICAgICBmb2xsb3dlZCBieSBhbGlnbm1lbnQgcGFkZGluZyB0byB0aGUgYWxpZ25tZW50IGJvdW5kYXJ5IG9mIHRoZSBhcnJheQorICAgICAgICBlbGVtZW50IHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSA8dmFybmFtZT5uPC92YXJuYW1lPiBieXRlcyBvZiB0aGUKKyAgICAgICAgYXJyYXkgZWxlbWVudHMgbWFyc2hhbGxlZCBpbiBzZXF1ZW5jZS4gPHZhcm5hbWU+bjwvdmFybmFtZT4gZG9lcyBub3QKKyAgICAgICAgaW5jbHVkZSB0aGUgcGFkZGluZyBhZnRlciB0aGUgbGVuZ3RoLCBvciBhbnkgcGFkZGluZyBhZnRlciB0aGUKKyAgICAgICAgbGFzdCBlbGVtZW50LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIGluc3RhbmNlLCBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWVzc2FnZSBpcyBhIG11bHRpcGxlCisgICAgICAgIG9mIDggYnl0ZXMgYW5kIHRoZSBieXRlLW9yZGVyIGlzIGJpZy1lbmRpYW4sIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seQorICAgICAgICB0aGUgNjQtYml0IGludGVnZXIgNSB3b3VsZCBiZSBtYXJzaGFsbGVkIGFzOgorCisgICAgICAgIDxzY3JlZW4+CiswMCAwMCAwMCAwOCAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj44IGJ5dGVzIG9mIGRhdGE8L2xpbmVhbm5vdGF0aW9uPgorMDAgMDAgMDAgMDAgICAgICAgICAgICAgICA8bGluZWFubm90YXRpb24+cGFkZGluZyB0byA4LWJ5dGUgYm91bmRhcnk8L2xpbmVhbm5vdGF0aW9uPgorMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDA1ICA8bGluZWFubm90YXRpb24+Zmlyc3QgZWxlbWVudCA9IDU8L2xpbmVhbm5vdGF0aW9uPgorICAgICAgICA8L3NjcmVlbj4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFycmF5cyBoYXZlIGEgbWF4aW11bSBsZW5ndGggZGVmaW5lZCB0byBiZSAyIHRvIHRoZSAyNnRoIHBvd2VyIG9yCisgICAgICAgIDY3MTA4ODY0ICg2NCBNaUIpLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3Qgc2VuZCBvciBhY2NlcHQgYXJyYXlzCisgICAgICAgIGV4Y2VlZGluZyB0aGlzIGxlbmd0aC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFN0cnVjdHMgYW5kIGRpY3QgZW50cmllcyBhcmUgbWFyc2hhbGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIKKyAgICAgICAgY29udGVudHMsIGJ1dCB0aGVpciBhbGlnbm1lbnQgaXMgYWx3YXlzIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSwKKyAgICAgICAgZXZlbiBpZiB0aGVpciBjb250ZW50cyB3b3VsZCBub3JtYWxseSBiZSBsZXNzIHN0cmljdGx5IGFsaWduZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBWYXJpYW50cyBhcmUgbWFyc2hhbGxlZCBhcyB0aGUgPGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPiBvZgorICAgICAgICB0aGUgY29udGVudHMgKHdoaWNoIG11c3QgYmUgYSBzaW5nbGUgY29tcGxldGUgdHlwZSksIGZvbGxvd2VkIGJ5IGEKKyAgICAgICAgbWFyc2hhbGxlZCB2YWx1ZSB3aXRoIHRoZSB0eXBlIGdpdmVuIGJ5IHRoYXQgc2lnbmF0dXJlLiBUaGUKKyAgICAgICAgdmFyaWFudCBoYXMgdGhlIHNhbWUgMS1ieXRlIGFsaWdubWVudCBhcyB0aGUgc2lnbmF0dXJlLCB3aGljaCBtZWFucworICAgICAgICB0aGF0IGFsaWdubWVudCBwYWRkaW5nIGJlZm9yZSBhIHZhcmlhbnQgaXMgbmV2ZXIgbmVlZGVkLgorICAgICAgICBVc2Ugb2YgdmFyaWFudHMgbWF5IG5vdCBjYXVzZSBhIHRvdGFsIG1lc3NhZ2UgZGVwdGggdG8gYmUgbGFyZ2VyCisgICAgICAgIHRoYW4gNjQsIGluY2x1ZGluZyBvdGhlciBjb250YWluZXIgdHlwZXMgc3VjaCBhcyBzdHJ1Y3R1cmVzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDI+CisgICAgICA8dGl0bGU+U3VtbWFyeSBvZiBELUJ1cyBtYXJzaGFsbGluZzwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBHaXZlbiBhbGwgdGhpcywgdGhlIHR5cGVzIGFyZSBtYXJzaGFsZWQgb24gdGhlIHdpcmUgYXMgZm9sbG93czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5FbmNvZGluZzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFsaWdubWVudDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Ob3QgYXBwbGljYWJsZTsgY2Fubm90IGJlIG1hcnNoYWxlZC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5OL0E8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkEgc2luZ2xlIDgtYml0IGJ5dGUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXMgZm9yIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4sIGJ1dCBvbmx5IDAgYW5kIDEgYXJlIHZhbGlkIHZhbHVlcy48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCBJRUVFIDc1NCBkb3VibGUgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pjg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QSA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IGluZGljYXRpbmcgdGhlIHN0cmluZydzIAorICAgICAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIGV4Y2x1ZGluZyBpdHMgdGVybWluYXRpbmcgbnVsLCBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgICAgICAgIG5vbi1udWwgc3RyaW5nIGRhdGEgb2YgdGhlIGdpdmVuIGxlbmd0aCwgZm9sbG93ZWQgYnkgYSB0ZXJtaW5hdGluZyBudWwgCisgICAgICAgICAgICAgICAgICBieXRlLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+T0JKRUNUX1BBVEg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RXhhY3RseSB0aGUgc2FtZSBhcyA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGV4Y2VwdCB0aGUgCisgICAgICAgICAgICAgICAgICBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBvYmplY3QgcGF0aCAoc2VlIGFib3ZlKS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDQgKGZvciB0aGUgbGVuZ3RoKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2FtZSBhcyA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGV4Y2VwdCB0aGUgbGVuZ3RoIGlzIGEgc2luZ2xlIAorICAgICAgICAgICAgICAgICAgYnl0ZSAodGh1cyBzaWduYXR1cmVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAyNTUpCisgICAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSAoc2VlIGFib3ZlKS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIEEgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiBnaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgZGF0YSBpbiBieXRlcywgZm9sbG93ZWQgYnkgCisgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgcGFkZGluZyB0byB0aGUgYWxpZ25tZW50IGJvdW5kYXJ5IG9mIHRoZSBhcnJheSBlbGVtZW50IHR5cGUsCisgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBlYWNoIGFycmF5IGVsZW1lbnQuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA0IChmb3IgdGhlIGxlbmd0aCkKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICBBIHN0cnVjdCBtdXN0IHN0YXJ0IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSByZWdhcmRsZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgdHlwZSBvZiB0aGUgc3RydWN0IGZpZWxkcy4gVGhlIHN0cnVjdCB2YWx1ZSBjb25zaXN0cyBvZiBlYWNoCisgICAgICAgICAgICAgICAgICBmaWVsZCBtYXJzaGFsZWQgaW4gc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSB0aGF0IDgtYnl0ZQorICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgOAorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICBUaGUgbWFyc2hhbGVkIDxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD4gb2YgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHR5cGUsIGZvbGxvd2VkIGJ5IGEgbWFyc2hhbGVkIHZhbHVlIHdpdGggdGhlIHR5cGUKKyAgICAgICAgICAgICAgICAgIGdpdmVuIGluIHRoZSBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAxIChhbGlnbm1lbnQgb2YgdGhlIHNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgSWRlbnRpY2FsIHRvIFNUUlVDVC4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDgKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VTklYX0ZEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZQorICAgICAgICAgICAgICAgIG9yZGVyLiBUaGUgYWN0dWFsIGZpbGUgZGVzY3JpcHRvcnMgbmVlZCB0byBiZQorICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkIG91dC1vZi1iYW5kIHZpYSBzb21lIHBsYXRmb3JtIHNwZWNpZmljCisgICAgICAgICAgICAgICAgbWVjaGFuaXNtLiBPbiB0aGUgd2lyZSwgdmFsdWVzIG9mIHRoaXMgdHlwZSBzdG9yZSB0aGUgaW5kZXggdG8gdGhlCisgICAgICAgICAgICAgICAgZmlsZSBkZXNjcmlwdG9yIGluIHRoZSBhcnJheSBvZiBmaWxlIGRlc2NyaXB0b3JzIHRoYXQKKyAgICAgICAgICAgICAgICBhY2NvbXBhbnkgdGhlIG1lc3NhZ2UuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0ibWVzc2FnZS1wcm90b2NvbCI+CisgICAgPHRpdGxlPk1lc3NhZ2UgUHJvdG9jb2w8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICBBIDxmaXJzdHRlcm0+bWVzc2FnZTwvZmlyc3R0ZXJtPiBjb25zaXN0cyBvZiBhCisgICAgICA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYSA8Zmlyc3R0ZXJtPmJvZHk8L2ZpcnN0dGVybT4uIElmIHlvdQorICAgICAgdGhpbmsgb2YgYSBtZXNzYWdlIGFzIGEgcGFja2FnZSwgdGhlIGhlYWRlciBpcyB0aGUgYWRkcmVzcywgYW5kIHRoZSBib2R5CisgICAgICBjb250YWlucyB0aGUgcGFja2FnZSBjb250ZW50cy4gVGhlIG1lc3NhZ2UgZGVsaXZlcnkgc3lzdGVtIHVzZXMgdGhlIGhlYWRlcgorICAgICAgaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGVyZSB0byBzZW5kIHRoZSBtZXNzYWdlIGFuZCBob3cgdG8gaW50ZXJwcmV0CisgICAgICBpdDsgdGhlIHJlY2lwaWVudCBpbnRlcnByZXRzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorICAgIDwvcGFyYT4KKyAgICAKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIGlzIG1hZGUgdXAgb2YgemVybyBvciBtb3JlCisgICAgICA8Zmlyc3R0ZXJtPmFyZ3VtZW50czwvZmlyc3R0ZXJtPiwgd2hpY2ggYXJlIHR5cGVkIHZhbHVlcywgc3VjaCBhcyBhbgorICAgICAgaW50ZWdlciBvciBhIGJ5dGUgYXJyYXkuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBCb3RoIGhlYWRlciBhbmQgYm9keSB1c2UgdGhlIEQtQnVzIDxsaW5rIGxpbmtlbmQ9InR5cGUtc3lzdGVtIj50eXBlCisgICAgICAgIHN5c3RlbTwvbGluaz4gYW5kIGZvcm1hdCBmb3Igc2VyaWFsaXppbmcgZGF0YS4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgRm9ybWF0PC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBib2R5LiBUaGUgaGVhZGVyIGlzIGEgYmxvY2sgb2YKKyAgICAgICAgdmFsdWVzIHdpdGggYSBmaXhlZCBzaWduYXR1cmUgYW5kIG1lYW5pbmcuICBUaGUgYm9keSBpcyBhIHNlcGFyYXRlIGJsb2NrCisgICAgICAgIG9mIHZhbHVlcywgd2l0aCBhIHNpZ25hdHVyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCwgYWxsb3dpbmcgdGhlIGJvZHkgdG8KKyAgICAgICAgYmVnaW4gb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdoZW4gc3RvcmluZyB0aGUgZW50aXJlIG1lc3NhZ2UgaW4gYSBzaW5nbGUKKyAgICAgICAgYnVmZmVyLiBJZiB0aGUgaGVhZGVyIGRvZXMgbm90IG5hdHVyYWxseSBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICAgICAgICB1cCB0byA3IGJ5dGVzIG9mIG51bC1pbml0aWFsaXplZCBhbGlnbm1lbnQgcGFkZGluZyBtdXN0IGJlIGFkZGVkLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYm9keSBuZWVkIG5vdCBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbWVzc2FnZSwgaW5jbHVkaW5nIGhlYWRlciwgaGVhZGVyIGFsaWdubWVudCBwYWRkaW5nLCAKKyAgICAgICAgYW5kIGJvZHkgaXMgMiB0byB0aGUgMjd0aCBwb3dlciBvciAxMzQyMTc3MjggKDEyOCBNaUIpLgorICAgICAgICBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3Qgc2VuZCBvciBhY2NlcHQgbWVzc2FnZXMgZXhjZWVkaW5nIHRoaXMgc2l6ZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzaWduYXR1cmUgb2YgdGhlIGhlYWRlciBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJ5eXl5dXVhKHl2KSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgV3JpdHRlbiBvdXQgbW9yZSByZWFkYWJseSwgdGhpcyBpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIEJZVEUsIEJZVEUsIEJZVEUsIEJZVEUsIFVJTlQzMiwgVUlOVDMyLCBBUlJBWSBvZiBTVFJVQ1Qgb2YgKEJZVEUsVkFSSUFOVCkKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZXNlIHZhbHVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjFzdCA8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkVuZGlhbm5lc3MgZmxhZzsgQVNDSUkgJ2wnIGZvciBsaXR0bGUtZW5kaWFuIAorICAgICAgICAgICAgICAgICAgb3IgQVNDSUkgJ0InIGZvciBiaWctZW5kaWFuLiBCb3RoIGhlYWRlciBhbmQgYm9keSBhcmUgCisgICAgICAgICAgICAgICAgaW4gdGhpcyBlbmRpYW5uZXNzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ybmQgPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48Zmlyc3R0ZXJtPk1lc3NhZ2UgdHlwZTwvZmlyc3R0ZXJtPi4gVW5rbm93biB0eXBlcyBtdXN0IGJlIGlnbm9yZWQuIAorICAgICAgICAgICAgICAgICAgQ3VycmVudGx5LWRlZmluZWQgdHlwZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+M3JkIDxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Qml0d2lzZSBPUiBvZiBmbGFncy4gVW5rbm93biBmbGFncworICAgICAgICAgICAgICAgICAgbXVzdCBiZSBpZ25vcmVkLiBDdXJyZW50bHktZGVmaW5lZCBmbGFncyBhcmUgZGVzY3JpYmVkIGJlbG93LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT40dGggPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NYWpvciBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBzZW5kaW5nIGFwcGxpY2F0aW9uLiAgSWYKKyAgICAgICAgICAgICAgICB0aGUgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgcmVjZWl2aW5nIGFwcGxpY2F0aW9uIGRvZXMgbm90CisgICAgICAgICAgICAgICAgbWF0Y2gsIHRoZSBhcHBsaWNhdGlvbnMgd2lsbCBub3QgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgRC1CdXMgY29ubmVjdGlvbiBtdXN0IGJlIGRpc2Nvbm5lY3RlZC4gVGhlIG1ham9yIHByb3RvY29sCisgICAgICAgICAgICAgICAgdmVyc2lvbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGlzIDEuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjFzdCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+TGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBtZXNzYWdlIGJvZHksIHN0YXJ0aW5nIAorICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuIFRoZSBoZWFkZXIgZW5kcyBhZnRlciAKKyAgICAgICAgICAgICAgICAgIGl0cyBhbGlnbm1lbnQgcGFkZGluZyB0byBhbiA4LWJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4ybmQgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzZXJpYWwgb2YgdGhpcyBtZXNzYWdlLCB1c2VkIGFzIGEgY29va2llIAorICAgICAgICAgICAgICAgICAgYnkgdGhlIHNlbmRlciB0byBpZGVudGlmeSB0aGUgcmVwbHkgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgdG8gdGhpcyByZXF1ZXN0LiBUaGlzIG11c3Qgbm90IGJlIHplcm8uCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+ICAgICAgCisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkFSUkFZPC9saXRlcmFsPiBvZiA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IG9mICg8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPiw8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPik8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgPGZpcnN0dGVybT5oZWFkZXIKKyAgICAgICAgICAgICAgICAgIGZpZWxkczwvZmlyc3R0ZXJtPiB3aGVyZSB0aGUgYnl0ZSBpcyB0aGUgZmllbGQgY29kZSwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgdmFyaWFudCBpcyB0aGUgZmllbGQgdmFsdWUuIFRoZSBtZXNzYWdlIHR5cGUgZGV0ZXJtaW5lcyAKKyAgICAgICAgICAgICAgICAgIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPGZpcnN0dGVybT5NZXNzYWdlIHR5cGVzPC9maXJzdHRlcm0+IHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgc2Vjb25kIGJ5dGUKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcmU6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVjaW1hbCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGlzIGlzIGFuIGludmFsaWQgdHlwZS48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk1ldGhvZCBjYWxsLiBUaGlzIG1lc3NhZ2UgdHlwZSBtYXkgcHJvbXB0IGEKKyAgICAgICAgICAgICAgICAgIHJlcGx5LjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NZXRob2QgcmVwbHkgd2l0aCByZXR1cm5lZCBkYXRhLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RXJyb3IgcmVwbHkuIElmIHRoZSBmaXJzdCBhcmd1bWVudCBleGlzdHMgYW5kIGlzIGEKKyAgICAgICAgICAgICAgICBzdHJpbmcsIGl0IGlzIGFuIGVycm9yIG1lc3NhZ2UuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U2lnbmFsIGVtaXNzaW9uLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEZsYWdzIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgdGhpcmQgYnl0ZSBvZiB0aGUgaGVhZGVyOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkhleCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5OT19SRVBMWV9FWFBFQ1RFRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDE8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgZG9lcyBub3QgZXhwZWN0IG1ldGhvZCByZXR1cm4gcmVwbGllcyBvcgorICAgICAgICAgICAgICAgICAgICBlcnJvciByZXBsaWVzLCBldmVuIGlmIGl0IGlzIG9mIGEgdHlwZSB0aGF0IGNhbgorICAgICAgICAgICAgICAgICAgICBoYXZlIGEgcmVwbHk7IHRoZSByZXBseSBjYW4gYmUgb21pdHRlZCBhcyBhbgorICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24uIEl0IGlzIGNvbXBsaWFudCB3aXRoIHRoaXMgc3BlY2lmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB0byByZXR1cm4gdGhlIHJlcGx5IGRlc3BpdGUgdGhpcyBmbGFnLCBhbHRob3VnaCBkb2luZworICAgICAgICAgICAgICAgICAgICBzbyBvbiBhIGJ1cyB3aXRoIGEgbm9uLXRyaXZpYWwgc2VjdXJpdHkgcG9saWN5CisgICAgICAgICAgICAgICAgICAgIChzdWNoIGFzIHRoZSB3ZWxsLWtub3duIHN5c3RlbSBidXMpIG1heSByZXN1bHQgaW4KKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzIGRlbmlhbCBtZXNzYWdlcyBiZWluZyBsb2dnZWQgZm9yIHRoZSByZXBseS4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgTUVUSE9EX0NBTEwgaXMgdGhlIG9ubHkgbWVzc2FnZSB0eXBlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiB0aGF0IGNhbiBleHBlY3QgYSByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgc28gdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhpcyBmbGFnIGluIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICB0aHJlZSBtZXNzYWdlIHR5cGVzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGVkIGlzIG1lYW5pbmdsZXNzOiByZXBsaWVzIHRvIHRob3NlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZXMgc2hvdWxkIG5vdCBiZSBzZW50LCB3aGV0aGVyIHRoaXMgZmxhZyBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Tk9fQVVUT19TVEFSVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgYnVzIG11c3Qgbm90IGxhdW5jaCBhbiBvd25lcgorICAgICAgICAgICAgICAgICAgZm9yIHRoZSBkZXN0aW5hdGlvbiBuYW1lIGluIHJlc3BvbnNlIHRvIHRoaXMgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QUxMT1dfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbiBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgdG8KKyAgICAgICAgICAgICAgICAgICAgaW5mb3JtIHRoZSByZWNlaXZpbmcgc2lkZSB0aGF0IHRoZSBjYWxsZXIgaXMgcHJlcGFyZWQKKyAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiwgd2hpY2ggbWlnaHQKKyAgICAgICAgICAgICAgICAgICAgdGFrZSBhIGNvbnNpZGVyYWJsZSB0aW1lIHRvIGNvbXBsZXRlLiBGb3IgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IHdvdWxkIGJlIGFwcHJvcHJpYXRlIHRvCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IHRoZSB1c2VyIGZvciBwYXNzd29yZHMgb3IgY29uZmlybWF0aW9uIHZpYQorICAgICAgICAgICAgICAgICAgICBQb2xraXQgb3IgYSBzaW1pbGFyIGZyYW1ld29yay4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgd2hlbgorICAgICAgICAgICAgICAgICAgICB1bnByaXZpbGVnZWQgY29kZSBjYWxscyBhIG1vcmUgcHJpdmlsZWdlZCBtZXRob2QgY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgYW5kIGFuIGF1dGhvcml6YXRpb24gZnJhbWV3b3JrIGlzIGRlcGxveWVkIHRoYXQgYWxsb3dzCisgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24uIElmIG5vIHN1Y2ggZnJhbWV3b3JrCisgICAgICAgICAgICAgICAgICAgIGlzIGRlcGxveWVkIGl0IGhhcyBubyBlZmZlY3QuIFRoaXMgZmxhZyBzaG91bGQgbm90CisgICAgICAgICAgICAgICAgICAgIGJlIHNldCBieSBkZWZhdWx0IGJ5IGNsaWVudCBpbXBsZW1lbnRhdGlvbnMuIElmIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIHNldCwgdGhlIGNhbGxlciBzaG91bGQgYWxzbyBzZXQgYSBzdWl0YWJseSBsb25nIHRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgb24gdGhlIG1ldGhvZCBjYWxsIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpbnRlcmFjdGlvbgorICAgICAgICAgICAgICAgICAgICBtYXkgY29tcGxldGUuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGZvciBtZXRob2QgY2FsbAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcywgYW5kIHNoYWxsIGJlIGlnbm9yZWQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEludGVyYWN0aW9uIHRoYXQgdGFrZXMgcGxhY2UgYXMgYSBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBlZmZlY3Qgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQgaXMgb3V0c2lkZSB0aGUgc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmbGFnLCBldmVuIGlmIGl0IGNvdWxkIGFsc28gYmUgY2hhcmFjdGVyaXplZAorICAgICAgICAgICAgICAgICAgICBhcyBhdXRoZW50aWNhdGlvbiBvciBhdXRob3JpemF0aW9uLiBGb3IgaW5zdGFuY2UsIGluCisgICAgICAgICAgICAgICAgICAgIGEgbWV0aG9kIGNhbGwgdGhhdCBkaXJlY3RzIGEgbmV0d29yayBtYW5hZ2VtZW50IHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgdG8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGEgdmlydHVhbCBwcml2YXRlIG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgIHRoaXMgZmxhZyBzaG91bGQgY29udHJvbCBob3cgdGhlIG5ldHdvcmsgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIG1ha2VzIHRoZSBkZWNpc2lvbiAiaXMgdGhpcyB1c2VyIGFsbG93ZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlIHN5c3RlbSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24/IiwgYnV0IGl0IHNob3VsZAorICAgICAgICAgICAgICAgICAgICBub3QgYWZmZWN0IGhvdyBvciB3aGV0aGVyIHRoZSBuZXR3b3JrIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSBpbnRlcmFjdHMgd2l0aCB0aGUgdXNlciB0byBvYnRhaW4gdGhlIGNyZWRlbnRpYWxzCisgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gdGhlIFZQTi4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiBhIHRoaXMgZmxhZyBpcyBub3Qgc2V0IG9uIGEgbWV0aG9kIGNhbGwsIGFuZCBhCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgZGV0ZXJtaW5lcyB0aGF0IHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkIHdpdGhvdXQgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiwgYnV0CisgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIGFsbG93ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnRlcmFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uLCBpdCBtYXkgcmV0dXJuIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbnRlcmFjdGl2ZUF1dGhvcml6YXRpb25SZXF1aXJlZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gd2lsbCBub3QgYmUgYXBwbGllZCwgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcgc2VydmljZXMgdGhhdCBwcmUtZGF0ZSB0aGlzIGZsYWcgbWlnaHQKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSB1c2UgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbi4gSG93ZXZlciwKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgRC1CdXMgQVBJcyB0aGF0IHdpbGwgdXNlIGludGVyYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gc2hvdWxkIGRvY3VtZW50IHRoYXQgdGhlIGNhbGwgbWF5IHRha2UKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2VyIHRoYW4gdXN1YWwsIGFuZCBuZXcgRC1CdXMgQVBJcyBzaG91bGQgYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiBpbiB0aGUgYWJzZW5jZSBvZiB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1oZWFkZXItZmllbGRzIj4KKyAgICAgICAgPHRpdGxlPkhlYWRlciBGaWVsZHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBhcnJheSBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgY29udGFpbnMgPGZpcnN0dGVybT5oZWFkZXIKKyAgICAgICAgICBmaWVsZHM8L2ZpcnN0dGVybT4sIHdoZXJlIGVhY2ggZmllbGQgaXMgYSAxLWJ5dGUgZmllbGQgY29kZSBmb2xsb3dlZAorICAgICAgICAgIGJ5IGEgZmllbGQgdmFsdWUuIEEgaGVhZGVyIG11c3QgY29udGFpbiB0aGUgcmVxdWlyZWQgaGVhZGVyIGZpZWxkcyBmb3IKKyAgICAgICAgICBpdHMgbWVzc2FnZSB0eXBlLCBhbmQgemVybyBvciBtb3JlIG9mIGFueSBvcHRpb25hbCBoZWFkZXIKKyAgICAgICAgICBmaWVsZHMuIEZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHByb3RvY29sIHNwZWNpZmljYXRpb24gbWF5IGFkZCBuZXcKKyAgICAgICAgICBmaWVsZHMuIEltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBmaWVsZHMgdGhleSBkbyBub3QKKyAgICAgICAgICB1bmRlcnN0YW5kLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgaW52ZW50IHRoZWlyIG93biBoZWFkZXIgZmllbGRzOworICAgICAgICAgIG9ubHkgY2hhbmdlcyB0byB0aGlzIHNwZWNpZmljYXRpb24gbWF5IGludHJvZHVjZSBuZXcgaGVhZGVyIGZpZWxkcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFnYWluLCBpZiBhbiBpbXBsZW1lbnRhdGlvbiBzZWVzIGEgaGVhZGVyIGZpZWxkIGNvZGUgdGhhdCBpdCBkb2VzIG5vdAorICAgICAgICAgIGV4cGVjdCwgaXQgbXVzdCBpZ25vcmUgdGhhdCBmaWVsZCwgYXMgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAgKGJ1dCBjb21wYXRpYmxlKSB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gVGhpcyBhbHNvIGFwcGxpZXMgCisgICAgICAgICAgdG8ga25vd24gaGVhZGVyIGZpZWxkcyBhcHBlYXJpbmcgaW4gdW5leHBlY3RlZCBtZXNzYWdlcywgZm9yIAorICAgICAgICAgIGV4YW1wbGU6IGlmIGEgc2lnbmFsIGhhcyBhIHJlcGx5IHNlcmlhbCBpdCBtdXN0IGJlIGlnbm9yZWQKKyAgICAgICAgICBldmVuIHRob3VnaCBpdCBoYXMgbm8gbWVhbmluZyBhcyBvZiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3dldmVyLCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBub3Qgc2VuZCBvciBhY2NlcHQga25vd24gaGVhZGVyIGZpZWxkcworICAgICAgICAgIHdpdGggdGhlIHdyb25nIHR5cGUgc3RvcmVkIGluIHRoZSBmaWVsZCB2YWx1ZS4gU28gZm9yIGV4YW1wbGUgYQorICAgICAgICAgIG1lc3NhZ2Ugd2l0aCBhbiA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGZpZWxkIG9mIHR5cGUKKyAgICAgICAgICA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IHdvdWxkIGJlIGNvbnNpZGVyZWQgY29ycnVwdC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhlcmUgYXJlIHRoZSBjdXJyZW50bHktZGVmaW5lZCBoZWFkZXIgZmllbGRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSI1Ij4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlY2ltYWwgQ29kZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UmVxdWlyZWQgSW48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk4vQTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+bm90IGFsbG93ZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCBhIHZhbGlkIGZpZWxkIG5hbWUgKGVycm9yIGlmIGl0IGFwcGVhcnMgaW4gYSBtZXNzYWdlKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+T0JKRUNUX1BBVEg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBvYmplY3QgdG8gc2VuZCBhIGNhbGwgdG8sCisgICAgICAgICAgICAgICAgICAgIG9yIHRoZSBvYmplY3QgYSBzaWduYWwgaXMgZW1pdHRlZCBmcm9tLgorICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCBwYXRoCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbDwvbGl0ZXJhbD4gaXMgcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHNlbmQgbWVzc2FnZXMgd2l0aCB0aGlzIHBhdGgsCisgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBidXMgZGFlbW9uIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCBhbnkgYXBwbGljYXRpb24gdGhhdCBhdHRlbXB0cyB0byBkbyBzby4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSB0byBpbnZva2UgYSBtZXRob2QgY2FsbCBvbiwgb3IgCisgICAgICAgICAgICAgICAgICAgIHRoYXQgYSBzaWduYWwgaXMgZW1pdHRlZCBmcm9tLiBPcHRpb25hbCBmb3IgCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxscywgcmVxdWlyZWQgZm9yIHNpZ25hbHMuCisgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbDwvbGl0ZXJhbD4gaXMgcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHNlbmQgbWVzc2FnZXMgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1cworICAgICAgICAgICAgICAgICAgICBkYWVtb24gd2lsbCBkaXNjb25uZWN0IGFueSBhcHBsaWNhdGlvbiB0aGF0IGF0dGVtcHRzIHRvCisgICAgICAgICAgICAgICAgICAgIGRvIHNvLgorICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjM8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG1lbWJlciwgZWl0aGVyIHRoZSBtZXRob2QgbmFtZSBvciBzaWduYWwgbmFtZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RVJST1JfTkFNRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG5hbWUgb2YgdGhlIGVycm9yIHRoYXQgb2NjdXJyZWQsIGZvciBlcnJvcnM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+UkVQTFlfU0VSSUFMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+NTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+LCA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIG1lc3NhZ2UgdGhpcyBtZXNzYWdlIGlzIGEgcmVwbHkKKyAgICAgICAgICAgICAgICAgICAgdG8uIChUaGUgc2VyaWFsIG51bWJlciBpcyB0aGUgc2Vjb25kIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4gaW4gdGhlIGhlYWRlci4pPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+NjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRoaXMgbWVzc2FnZSBpcyBpbnRlbmRlZCBmb3IuCisgICAgICAgICAgICAgICAgICAgIE9ubHkgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlIGJ1cywgc2VlIAorICAgICAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cyIvPi48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0VOREVSPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+NzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBuYW1lIG9mIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBmaWxscyBpbiB0aGlzIGZpZWxkIHNvIGl0IGlzIHJlbGlhYmxlOyB0aGUgZmllbGQgaXMKKyAgICAgICAgICAgICAgICAgICAgb25seSBtZWFuaW5nZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYnVzLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcHRpb25hbDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIHNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZSBib2R5LgorICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgCisgICAgICAgICAgICAgICAgICBlbXB0eSBzaWduYXR1cmUgIiIgKGkuZS4gdGhlIGJvZHkgbXVzdCBiZSAwLWxlbmd0aCkuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVOSVhfRkRTPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+OTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBudW1iZXIgb2YgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQKKyAgICAgICAgICAgICAgICAgIGFjY29tcGFueSB0aGUgbWVzc2FnZS4gIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQKKyAgICAgICAgICAgICAgICAgIHRoYXQgbm8gVW5peCBmaWxlIGRlc2NyaXB0b3JzIGFjY29tcGFueSB0aGUKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIFRoZSBhY3R1YWwgZmlsZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCB2aWEgcGxhdGZvcm0gc3BlY2lmaWMgbWVjaGFuaXNtCisgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZC4gVGhleSBtdXN0IGJlIHNlbnQgYXQgdGhlIHNhbWUgdGltZSBhcworICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgbWVzc2FnZSBpdHNlbGYuIFRoZXkgbWF5IG5vdCBiZSBzZW50CisgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgaXRzZWxmIGlzCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBvciBhZnRlciB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICBpdHNlbGYuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzIj4KKyAgICAgIDx0aXRsZT5WYWxpZCBOYW1lczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHZhcmlvdXMgbmFtZXMgaW4gRC1CdXMgbWVzc2FnZXMgaGF2ZSBzb21lIHJlc3RyaWN0aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBpcyBhIDxmaXJzdHRlcm0+bWF4aW11bSBuYW1lIGxlbmd0aDwvZmlyc3R0ZXJtPiAKKyAgICAgICAgb2YgMjU1IHdoaWNoIGFwcGxpZXMgdG8gYnVzIG5hbWVzLCBpbnRlcmZhY2VzLCBhbmQgbWVtYmVycy4gCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIj4KKyAgICAgICAgPHRpdGxlPkludGVyZmFjZSBuYW1lczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEludGVyZmFjZXMgaGF2ZSBuYW1lcyB3aXRoIHR5cGUgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPiwgbWVhbmluZyB0aGF0IAorICAgICAgICAgIHRoZXkgbXVzdCBiZSB2YWxpZCBVVEYtOC4gSG93ZXZlciwgdGhlcmUgYXJlIGFsc28gc29tZSAKKyAgICAgICAgICBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyB0aGF0IGFwcGx5IHRvIGludGVyZmFjZSBuYW1lcyAKKyAgICAgICAgICBzcGVjaWZpY2FsbHk6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgYXJlIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBlbGVtZW50cyBzZXBhcmF0ZWQgYnkKKyAgICAgICAgICAgICAgICBhIHBlcmlvZCAoJy4nKSBjaGFyYWN0ZXIuIEFsbCBlbGVtZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgCisgICAgICAgICAgICAgICAgb25lIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycyAKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIgYW5kIG11c3Qgbm90IGJlZ2luIHdpdGggYSBkaWdpdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+SW50ZXJmYWNlIG5hbWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgJy4nIChwZXJpb2QpCisgICAgICAgICAgICAgIGNoYXJhY3RlciAoYW5kIHRodXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzKS4KKyAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgYmVnaW4gd2l0aCBhICcuJyAocGVyaW9kKSBjaGFyYWN0ZXIuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+SW50ZXJmYWNlIG5hbWVzIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEludGVyZmFjZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcmV2ZXJzZWQgRE5TIGRvbWFpbiBuYW1lIG9mCisgICAgICAgICAgdGhlIGF1dGhvciBvZiB0aGUgaW50ZXJmYWNlIChpbiBsb3dlci1jYXNlKSwgbGlrZSBpbnRlcmZhY2UgbmFtZXMKKyAgICAgICAgICBpbiBKYXZhLiBJdCBpcyBjb252ZW50aW9uYWwgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcmZhY2UgbmFtZQorICAgICAgICAgIHRvIGNvbnNpc3Qgb2Ygd29yZHMgcnVuIHRvZ2V0aGVyLCB3aXRoIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXJzCisgICAgICAgICAgb24gYWxsIHdvcmRzICgiQ2FtZWxDYXNlIikuIFNldmVyYWwgbGV2ZWxzIG9mIGhpZXJhcmNoeSBjYW4gYmUgdXNlZC4KKyAgICAgICAgICBJdCBpcyBhbHNvIGEgZ29vZCBpZGVhIHRvIGluY2x1ZGUgdGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZQorICAgICAgICAgIGluIHRoZSBuYW1lLCBhbmQgaW5jcmVtZW50IGl0IGlmIGluY29tcGF0aWJsZSBjaGFuZ2VzIGFyZSBtYWRlOworICAgICAgICAgIHRoaXMgd2F5LCBhIHNpbmdsZSBvYmplY3QgY2FuIGltcGxlbWVudCBzZXZlcmFsIHZlcnNpb25zIG9mIGFuCisgICAgICAgICAgaW50ZXJmYWNlIGluIHBhcmFsbGVsLCBpZiBuZWNlc3NhcnkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBGb3IgaW5zdGFuY2UsIGlmIHRoZSBvd25lciBvZiA8bGl0ZXJhbD5leGFtcGxlLmNvbTwvbGl0ZXJhbD4gaXMKKyAgICAgICAgICBkZXZlbG9waW5nIGEgRC1CdXMgQVBJIGZvciBhIG11c2ljIHBsYXllciwgdGhleSBtaWdodCBkZWZpbmUKKyAgICAgICAgICBpbnRlcmZhY2VzIGNhbGxlZCA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NdXNpY1BsYXllcjE8L2xpdGVyYWw+LAorICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyMS5UcmFjazwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxLlNlZWthYmxlPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGNvbmNlcHRzIHRoYXQgd291bGQgYmUKKyAgICAgICAgICBjYWxsZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBpbiBKYXZhOiBlaXRoZXIgY2FuIGJlIGlkZW50aWZpZWQgb24KKyAgICAgICAgICBELUJ1cyBieSBhbiBpbnRlcmZhY2UgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiPgorICAgICAgICA8dGl0bGU+QnVzIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ29ubmVjdGlvbnMgaGF2ZSBvbmUgb3IgbW9yZSBidXMgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisgICAgICAgICAgQSBjb25uZWN0aW9uIGhhcyBleGFjdGx5IG9uZSBidXMgbmFtZSB0aGF0IGlzIGEgPGZpcnN0dGVybT51bmlxdWUKKyAgICAgICAgICAgIGNvbm5lY3Rpb24gbmFtZTwvZmlyc3R0ZXJtPi4gVGhlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWUgcmVtYWlucworICAgICAgICAgIHdpdGggdGhlIGNvbm5lY3Rpb24gZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuCisgICAgICAgICAgQSBidXMgbmFtZSBpcyBvZiB0eXBlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4sCisgICAgICAgICAgbWVhbmluZyB0aGF0IGl0IG11c3QgYmUgdmFsaWQgVVRGLTguIEhvd2V2ZXIsIHRoZXJlIGFyZSBhbHNvCisgICAgICAgICAgc29tZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyB0aGF0IGFwcGx5IHRvIGJ1cyBuYW1lcyAKKyAgICAgICAgICBzcGVjaWZpY2FsbHk6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5CdXMgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGEgY29sb24gKCc6JykKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYXJlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzLiBPdGhlciBidXMgbmFtZXMKKyAgICAgICAgICAgICAgICBhcmUgY2FsbGVkIDxmaXJzdHRlcm0+d2VsbC1rbm93biBidXMgbmFtZXM8L2ZpcnN0dGVybT4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5CdXMgbmFtZXMgYXJlIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBlbGVtZW50cyBzZXBhcmF0ZWQgYnkKKyAgICAgICAgICAgICAgICBhIHBlcmlvZCAoJy4nKSBjaGFyYWN0ZXIuIEFsbCBlbGVtZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgCisgICAgICAgICAgICAgICAgb25lIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycyAKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXy0iLiBPbmx5IGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSB1bmlxdWUKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uIG5hbWUgbWF5IGJlZ2luIHdpdGggYSBkaWdpdCwgZWxlbWVudHMgaW4KKyAgICAgICAgICAgICAgICBvdGhlciBidXMgbmFtZXMgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5CdXMgbmFtZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSAnLicgKHBlcmlvZCkKKyAgICAgICAgICAgICAgY2hhcmFjdGVyIChhbmQgdGh1cyBhdCBsZWFzdCB0d28gZWxlbWVudHMpLgorICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5CdXMgbmFtZXMgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGUgdGhhdCB0aGUgaHlwaGVuICgnLScpIGNoYXJhY3RlciBpcyBhbGxvd2VkIGluIGJ1cyBuYW1lcyBidXQKKyAgICAgICAgICBub3QgaW4gaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTGlrZSA8bGluayBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSI+aW50ZXJmYWNlCisgICAgICAgICAgICBuYW1lczwvbGluaz4sIHdlbGwta25vd24gYnVzIG5hbWVzIHNob3VsZCBzdGFydCB3aXRoIHRoZQorICAgICAgICAgIHJldmVyc2VkIEROUyBkb21haW4gbmFtZSBvZiB0aGUgYXV0aG9yIG9mIHRoZSBpbnRlcmZhY2UgKGluCisgICAgICAgICAgbG93ZXItY2FzZSksIGFuZCBpdCBpcyBjb252ZW50aW9uYWwgZm9yIHRoZSByZXN0IG9mIHRoZSB3ZWxsLWtub3duCisgICAgICAgICAgYnVzIG5hbWUgdG8gY29uc2lzdCBvZiB3b3JkcyBydW4gdG9nZXRoZXIsIHdpdGggaW5pdGlhbAorICAgICAgICAgIGNhcGl0YWwgbGV0dGVycy4gQXMgd2l0aCBpbnRlcmZhY2UgbmFtZXMsIGluY2x1ZGluZyBhIHZlcnNpb24KKyAgICAgICAgICBudW1iZXIgaW4gd2VsbC1rbm93biBidXMgbmFtZXMgaXMgYSBnb29kIGlkZWE7IGl0J3MgcG9zc2libGUgdG8KKyAgICAgICAgICBoYXZlIHRoZSB3ZWxsLWtub3duIGJ1cyBuYW1lIGZvciBtb3JlIHRoYW4gb25lIHZlcnNpb24KKyAgICAgICAgICBzaW11bHRhbmVvdXNseSBpZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIGEgd2VsbC1rbm93biBidXMgbmFtZSBpbXBsaWVzIHRoZSBwcmVzZW5jZSBvZiBhICJtYWluIiBpbnRlcmZhY2UsCisgICAgICAgICAgdGhhdCAibWFpbiIgaW50ZXJmYWNlIGlzIG9mdGVuIGdpdmVuIHRoZSBzYW1lIG5hbWUgYXMKKyAgICAgICAgICB0aGUgd2VsbC1rbm93biBidXMgbmFtZSwgYW5kIHNpdHVhdGVkIGF0IHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdAorICAgICAgICAgIHBhdGguIEZvciBpbnN0YW5jZSwgaWYgdGhlIG93bmVyIG9mIDxsaXRlcmFsPmV4YW1wbGUuY29tPC9saXRlcmFsPgorICAgICAgICAgIGlzIGRldmVsb3BpbmcgYSBELUJ1cyBBUEkgZm9yIGEgbXVzaWMgcGxheWVyLCB0aGV5IG1pZ2h0IGRlZmluZQorICAgICAgICAgIHRoYXQgYW55IGFwcGxpY2F0aW9uIHRoYXQgdGFrZXMgdGhlIHdlbGwta25vd24gbmFtZQorICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyMTwvbGl0ZXJhbD4gc2hvdWxkIGhhdmUgYW4gb2JqZWN0CisgICAgICAgICAgYXQgdGhlIG9iamVjdCBwYXRoIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9NdXNpY1BsYXllcjE8L2xpdGVyYWw+CisgICAgICAgICAgd2hpY2ggaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1tZW1iZXIiPgorICAgICAgICA8dGl0bGU+TWVtYmVyIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWVtYmVyIChpLmUuIG1ldGhvZCBvciBzaWduYWwpIG5hbWVzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIgYW5kIG1heSBub3QgYmVnaW4gd2l0aCBhCisgICAgICAgICAgICAgICAgZGlnaXQuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBub3QgY29udGFpbiB0aGUgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBiZSBhdCBsZWFzdCAxIGJ5dGUgaW4gbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXQgaXMgY29udmVudGlvbmFsIGZvciBtZW1iZXIgbmFtZXMgb24gRC1CdXMgdG8gY29uc2lzdCBvZgorICAgICAgICAgIGNhcGl0YWxpemVkIHdvcmRzIHdpdGggbm8gcHVuY3R1YXRpb24gKCJjYW1lbC1jYXNlIikuCisgICAgICAgICAgTWV0aG9kIG5hbWVzIHNob3VsZCB1c3VhbGx5IGJlIHZlcmJzLCBzdWNoIGFzCisgICAgICAgICAgPGxpdGVyYWw+R2V0SXRlbXM8L2xpdGVyYWw+LCBhbmQgc2lnbmFsIG5hbWVzIHNob3VsZCB1c3VhbGx5IGJlCisgICAgICAgICAgYSBkZXNjcmlwdGlvbiBvZiBhbiBldmVudCwgc3VjaCBhcyA8bGl0ZXJhbD5JdGVtc0NoYW5nZWQ8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIj4KKyAgICAgICAgPHRpdGxlPkVycm9yIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSBuYW1pbmcgY29udmVudGlvbnMgYXMgaW50ZXJmYWNlCisgICAgICAgICAgbmFtZXMsIGFuZCBvZnRlbiBjb250YWluIDxsaXRlcmFsPi5FcnJvci48L2xpdGVyYWw+OyBmb3IgaW5zdGFuY2UsCisgICAgICAgICAgdGhlIG93bmVyIG9mIDxsaXRlcmFsPmV4YW1wbGUuY29tPC9saXRlcmFsPiBtaWdodCBkZWZpbmUgdGhlCisgICAgICAgICAgZXJyb3JzIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyLkVycm9yLkZpbGVOb3RGb3VuZDwvbGl0ZXJhbD4KKyAgICAgICAgICBhbmQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIuRXJyb3IuT3V0T2ZNZW1vcnk8L2xpdGVyYWw+LgorICAgICAgICAgIFRoZSBlcnJvcnMgZGVmaW5lZCBieSBELUJ1cyBpdHNlbGYsIHN1Y2ggYXMKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GYWlsZWQ8L2xpdGVyYWw+LCBmb2xsb3cgYQorICAgICAgICAgIHNpbWlsYXIgcGF0dGVybi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIFR5cGVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIG9mIHRoZSBtZXNzYWdlIHR5cGVzICg8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+LCA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIGFuZAorICAgICAgICA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+KSBoYXMgaXRzIG93biBleHBlY3RlZCB1c2FnZSBjb252ZW50aW9ucyBhbmQgaGVhZGVyIGZpZWxkcy4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVzZSBjb252ZW50aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QiPgorICAgICAgICA8dGl0bGU+TWV0aG9kIENhbGxzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU29tZSBtZXNzYWdlcyBpbnZva2UgYW4gb3BlcmF0aW9uIG9uIGEgcmVtb3RlIG9iamVjdC4gIFRoZXNlIGFyZQorICAgICAgICAgIGNhbGxlZCBtZXRob2QgY2FsbCBtZXNzYWdlcyBhbmQgaGF2ZSB0aGUgdHlwZSB0YWcgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LiBTdWNoCisgICAgICAgICAgbWVzc2FnZXMgbWFwIG5hdHVyYWxseSB0byBtZXRob2RzIG9uIG9iamVjdHMgaW4gYSB0eXBpY2FsIHByb2dyYW0uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXRob2QgY2FsbCBtZXNzYWdlIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+IGhlYWRlciBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gT3B0aW9uYWxseSwgdGhlIG1lc3NhZ2UgaGFzIGFuCisgICAgICAgICAgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBmaWVsZCBnaXZpbmcgdGhlIGludGVyZmFjZSB0aGUgbWV0aG9kIGlzIGEgcGFydCBvZi4KKyAgICAgICAgICBJbmNsdWRpbmcgdGhlIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gaW4gYWxsIG1ldGhvZCBjYWxsCisgICAgICAgICAgbWVzc2FnZXMgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW4gdGhlIGFic2VuY2Ugb2YgYW4gPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBmaWVsZCwgaWYgdHdvCisgICAgICAgICAgb3IgbW9yZSBpbnRlcmZhY2VzIG9uIHRoZSBzYW1lIG9iamVjdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICBuYW1lLCBpdCBpcyB1bmRlZmluZWQgd2hpY2ggb2YgdGhvc2UgbWV0aG9kcyB3aWxsIGJlIGludm9rZWQuCisgICAgICAgICAgSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8gZWl0aGVyIHJldHVybiBhbiBlcnJvciwgb3IgZGVsaXZlciB0aGUKKyAgICAgICAgICBtZXNzYWdlIGFzIHRob3VnaCBpdCBoYWQgYW4gYXJiaXRyYXJ5IG9uZSBvZiB0aG9zZSBpbnRlcmZhY2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIHNvbWUgc2l0dWF0aW9ucyAoc3VjaCBhcyB0aGUgd2VsbC1rbm93biBzeXN0ZW0gYnVzKSwgbWVzc2FnZXMKKyAgICAgICAgICBhcmUgZmlsdGVyZWQgdGhyb3VnaCBhbiBhY2Nlc3MtY29udHJvbCBsaXN0IGV4dGVybmFsIHRvIHRoZQorICAgICAgICAgIHJlbW90ZSBvYmplY3QgaW1wbGVtZW50YXRpb24uIElmIHRoYXQgZmlsdGVyIHJlamVjdHMgY2VydGFpbgorICAgICAgICAgIG1lc3NhZ2VzIGJ5IG1hdGNoaW5nIHRoZWlyIGludGVyZmFjZSwgb3IgYWNjZXB0cyBvbmx5IG1lc3NhZ2VzCisgICAgICAgICAgdG8gc3BlY2lmaWMgaW50ZXJmYWNlcywgaXQgbXVzdCBhbHNvIHJlamVjdCBtZXNzYWdlcyB0aGF0IGhhdmUgbm8KKyAgICAgICAgICA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+OiBvdGhlcndpc2UsIG1hbGljaW91cworICAgICAgICAgIGFwcGxpY2F0aW9ucyBjb3VsZCB1c2UgdGhpcyB0byBieXBhc3MgdGhlIGZpbHRlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZXRob2QgY2FsbCBtZXNzYWdlcyBhbHNvIGluY2x1ZGUgYSA8bGl0ZXJhbD5QQVRIPC9saXRlcmFsPiBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4gSWYgdGhlIGNhbGwgaXMgcGFzc2luZworICAgICAgICAgIHRocm91Z2ggYSBtZXNzYWdlIGJ1cywgdGhlIG1lc3NhZ2Ugd2lsbCBhbHNvIGhhdmUgYQorICAgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICB0byByZWNlaXZlIHRoZSBtZXNzYWdlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdoZW4gYW4gYXBwbGljYXRpb24gaGFuZGxlcyBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIGl0IGlzIHJlcXVpcmVkIHRvCisgICAgICAgICAgcmV0dXJuIGEgcmVwbHkuIFRoZSByZXBseSBpcyBpZGVudGlmaWVkIGJ5IGEgPGxpdGVyYWw+UkVQTFlfU0VSSUFMPC9saXRlcmFsPiBoZWFkZXIgZmllbGQKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gYmVpbmcgcmVwbGllZCB0by4gVGhlCisgICAgICAgICAgcmVwbHkgY2FuIGhhdmUgb25lIG9mIHR3byB0eXBlczsgZWl0aGVyIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJZiB0aGUgcmVwbHkgaGFzIHR5cGUgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4sIHRoZSBhcmd1bWVudHMgdG8gdGhlIHJlcGx5IG1lc3NhZ2UgCisgICAgICAgICAgYXJlIHRoZSByZXR1cm4gdmFsdWUocykgb3IgIm91dCBwYXJhbWV0ZXJzIiBvZiB0aGUgbWV0aG9kIGNhbGwuIAorICAgICAgICAgIElmIHRoZSByZXBseSBoYXMgdHlwZSA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIHRoZW4gYW4gImV4Y2VwdGlvbiIgaGFzIGJlZW4gdGhyb3duLCAKKyAgICAgICAgICBhbmQgdGhlIGNhbGwgZmFpbHM7IG5vIHJldHVybiB2YWx1ZSB3aWxsIGJlIHByb3ZpZGVkLiBJdCBtYWtlcyAKKyAgICAgICAgICBubyBzZW5zZSB0byBzZW5kIG11bHRpcGxlIHJlcGxpZXMgdG8gdGhlIHNhbWUgbWV0aG9kIGNhbGwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXZlbiBpZiBhIG1ldGhvZCBjYWxsIGhhcyBubyByZXR1cm4gdmFsdWVzLCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IAorICAgICAgICAgIHJlcGx5IGlzIHJlcXVpcmVkLCBzbyB0aGUgY2FsbGVyIHdpbGwga25vdyB0aGUgbWV0aG9kIAorICAgICAgICAgIHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4gcmVwbHkgbWVzc2FnZSBtdXN0IGhhdmUgdGhlIDxsaXRlcmFsPlJFUExZX1NFUklBTDwvbGl0ZXJhbD4gCisgICAgICAgICAgaGVhZGVyIGZpZWxkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIGEgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UgaGFzIHRoZSBmbGFnIDxsaXRlcmFsPk5PX1JFUExZX0VYUEVDVEVEPC9saXRlcmFsPiwgCisgICAgICAgICAgdGhlbiBhcyBhbiBvcHRpbWl6YXRpb24gdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmluZyB0aGUgbWV0aG9kIAorICAgICAgICAgIGNhbGwgbWF5IGNob29zZSB0byBvbWl0IHRoZSByZXBseSBtZXNzYWdlIChyZWdhcmRsZXNzIG9mIAorICAgICAgICAgIHdoZXRoZXIgdGhlIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4pLiAKKyAgICAgICAgICBIb3dldmVyLCBpdCBpcyBhbHNvIGFjY2VwdGFibGUgdG8gaWdub3JlIHRoZSA8bGl0ZXJhbD5OT19SRVBMWV9FWFBFQ1RFRDwvbGl0ZXJhbD4KKyAgICAgICAgICBmbGFnIGFuZCByZXBseSBhbnl3YXkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVW5sZXNzIGEgbWVzc2FnZSBoYXMgdGhlIGZsYWcgPGxpdGVyYWw+Tk9fQVVUT19TVEFSVDwvbGl0ZXJhbD4sIGlmIHRoZQorICAgICAgICAgIGRlc3RpbmF0aW9uIG5hbWUgZG9lcyBub3QgZXhpc3QgdGhlbiBhIHByb2dyYW0gdG8gb3duIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgIG5hbWUgd2lsbCBiZSBzdGFydGVkIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQuICBUaGUgbWVzc2FnZQorICAgICAgICAgIHdpbGwgYmUgaGVsZCB1bnRpbCB0aGUgbmV3IHByb2dyYW0gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgb3IgaGFzCisgICAgICAgICAgZmFpbGVkIHRvIHN0YXJ0OyBpbiBjYXNlIG9mIGZhaWx1cmUsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMKKyAgICAgICAgICBmbGFnIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgYSBtZXNzYWdlIGJ1cywgaXQgaXMgaWdub3JlZAorICAgICAgICAgIGR1cmluZyBvbmUtdG8tb25lIGNvbW11bmljYXRpb24gd2l0aCBubyBpbnRlcm1lZGlhdGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0NCBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QtYXBpcyI+CisgICAgICAgICAgPHRpdGxlPk1hcHBpbmcgbWV0aG9kIGNhbGxzIHRvIG5hdGl2ZSBBUElzPC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFQSXMgZm9yIEQtQnVzIG1heSBtYXAgbWV0aG9kIGNhbGxzIHRvIGEgbWV0aG9kIGNhbGwgaW4gYSBzcGVjaWZpYworICAgICAgICAgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHN1Y2ggYXMgQysrLCBvciBtYXkgbWFwIGEgbWV0aG9kIGNhbGwgd3JpdHRlbgorICAgICAgICAgICAgaW4gYW4gSURMIHRvIGEgRC1CdXMgbWVzc2FnZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBBUElzIG9mIHRoaXMgbmF0dXJlLCBhcmd1bWVudHMgdG8gYSBtZXRob2QgYXJlIG9mdGVuIHRlcm1lZCAiaW4iCisgICAgICAgICAgICAod2hpY2ggaW1wbGllcyBzZW50IGluIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4pLCBvciAib3V0IiAod2hpY2ggaW1wbGllcworICAgICAgICAgICAgcmV0dXJuZWQgaW4gdGhlIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+KS4gU29tZSBBUElzIHN1Y2ggYXMgQ09SQkEgYWxzbyBoYXZlCisgICAgICAgICAgICAiaW5vdXQiIGFyZ3VtZW50cywgd2hpY2ggYXJlIGJvdGggc2VudCBhbmQgcmVjZWl2ZWQsIGkuZS4gdGhlIGNhbGxlcgorICAgICAgICAgICAgcGFzc2VzIGluIGEgdmFsdWUgd2hpY2ggaXMgbW9kaWZpZWQuIE1hcHBlZCB0byBELUJ1cywgYW4gImlub3V0IgorICAgICAgICAgICAgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBhbiAiaW4iIGFyZ3VtZW50LCBmb2xsb3dlZCBieSBhbiAib3V0IgorICAgICAgICAgICAgYXJndW1lbnQuIFlvdSBjYW4ndCBwYXNzIHRoaW5ncyAiYnkgcmVmZXJlbmNlIiBvdmVyIHRoZSB3aXJlLCBzbworICAgICAgICAgICAgImlub3V0IiBpcyBwdXJlbHkgYW4gaWxsdXNpb24gb2YgdGhlIGluLXByb2Nlc3MgQVBJLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEdpdmVuIGEgbWV0aG9kIHdpdGggemVybyBvciBvbmUgcmV0dXJuIHZhbHVlcywgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlCisgICAgICAgICAgICBhcmd1bWVudHMsIHdoZXJlIGVhY2ggYXJndW1lbnQgbWF5IGJlICJpbiIsICJvdXQiLCBvciAiaW5vdXQiLCB0aGUKKyAgICAgICAgICAgIGNhbGxlciBjb25zdHJ1Y3RzIGEgbWVzc2FnZSBieSBhcHBlbmRpbmcgZWFjaCAiaW4iIG9yICJpbm91dCIgYXJndW1lbnQsCisgICAgICAgICAgICBpbiBvcmRlci4gIm91dCIgYXJndW1lbnRzIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIGNhbGxlcidzIG1lc3NhZ2UuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHJlY2lwaWVudCBjb25zdHJ1Y3RzIGEgcmVwbHkgYnkgYXBwZW5kaW5nIGZpcnN0IHRoZSByZXR1cm4gdmFsdWUgCisgICAgICAgICAgICBpZiBhbnksIHRoZW4gZWFjaCAib3V0IiBvciAiaW5vdXQiIGFyZ3VtZW50LCBpbiBvcmRlci4gCisgICAgICAgICAgICAiaW4iIGFyZ3VtZW50cyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSByZXBseSBtZXNzYWdlLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEVycm9yIHJlcGxpZXMgYXJlIG5vcm1hbGx5IG1hcHBlZCB0byBleGNlcHRpb25zIGluIGxhbmd1YWdlcyB0aGF0IGhhdmUKKyAgICAgICAgICAgIGV4Y2VwdGlvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gY29udmVydGluZyBmcm9tIG5hdGl2ZSBBUElzIHRvIEQtQnVzLCBpdCBpcyBwZXJoYXBzIG5pY2UgdG8gCisgICAgICAgICAgICBtYXAgRC1CdXMgbmFtaW5nIGNvbnZlbnRpb25zICgiRm9vQmFyIikgdG8gbmF0aXZlIGNvbnZlbnRpb25zIAorICAgICAgICAgICAgc3VjaCBhcyAiZm9vQmFyIiBvciAiZm9vX2JhciIgYXV0b21hdGljYWxseS4gVGhpcyBpcyBPSyAKKyAgICAgICAgICAgIGFzIGxvbmcgYXMgeW91IGNhbiBzYXkgdGhhdCB0aGUgbmF0aXZlIEFQSSBpcyBvbmUgdGhhdCAKKyAgICAgICAgICAgIHdhcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgRC1CdXMuIEl0IG1ha2VzIHRoZSBtb3N0IHNlbnNlCisgICAgICAgICAgICB3aGVuIHdyaXRpbmcgb2JqZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0IHdpbGwgYmUgZXhwb3J0ZWQgCisgICAgICAgICAgICBvdmVyIHRoZSBidXMuIE9iamVjdCBwcm94aWVzIHVzZWQgdG8gaW52b2tlIHJlbW90ZSBELUJ1cyAKKyAgICAgICAgICAgIG9iamVjdHMgcHJvYmFibHkgbmVlZCB0aGUgYWJpbGl0eSB0byBjYWxsIGFueSBELUJ1cyBtZXRob2QsCisgICAgICAgICAgICBhbmQgdGh1cyBhIG1hZ2ljIG5hbWUgbWFwcGluZyBsaWtlIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYW55dGhpbmcgb2YgbmF0aXZlIEFQSSBiaW5kaW5nczsKKyAgICAgICAgICAgIHRoZSBwcmVjZWRpbmcgaXMgb25seSBhIHN1Z2dlc3RlZCBjb252ZW50aW9uIGZvciBjb25zaXN0ZW5jeSAKKyAgICAgICAgICAgIGFtb25nIGJpbmRpbmdzLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0ND4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1zaWduYWwiPgorICAgICAgICA8dGl0bGU+U2lnbmFsIEVtaXNzaW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVW5saWtlIG1ldGhvZCBjYWxscywgc2lnbmFsIGVtaXNzaW9ucyBoYXZlIG5vIHJlcGxpZXMuIAorICAgICAgICAgIEEgc2lnbmFsIGVtaXNzaW9uIGlzIHNpbXBseSBhIHNpbmdsZSBtZXNzYWdlIG9mIHR5cGUgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPi4KKyAgICAgICAgICBJdCBtdXN0IGhhdmUgdGhyZWUgaGVhZGVyIGZpZWxkczogPGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD4gZ2l2aW5nIHRoZSBvYmplY3QgCisgICAgICAgICAgdGhlIHNpZ25hbCB3YXMgZW1pdHRlZCBmcm9tLCBwbHVzIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gZ2l2aW5nCisgICAgICAgICAgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzaWduYWwuIFRoZSA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGhlYWRlciBpcyByZXF1aXJlZAorICAgICAgICAgIGZvciBzaWduYWxzLCB0aG91Z2ggaXQgaXMgb3B0aW9uYWwgZm9yIG1ldGhvZCBjYWxscy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLWVycm9ycyI+CisgICAgICAgIDx0aXRsZT5FcnJvcnM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZXNzYWdlcyBvZiB0eXBlIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiBhcmUgbW9zdCBjb21tb25seSByZXBsaWVzIAorICAgICAgICAgIHRvIGEgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCBidXQgbWF5IGJlIHJldHVybmVkIGluIHJlcGx5IAorICAgICAgICAgIHRvIGFueSBraW5kIG9mIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIGJ1cyBmb3IgZXhhbXBsZQorICAgICAgICAgIHdpbGwgcmV0dXJuIGFuIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiBpbiByZXBseSB0byBhIHNpZ25hbCBlbWlzc2lvbiBpZiAKKyAgICAgICAgICB0aGUgYnVzIGRvZXMgbm90IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBzZW5kIHRoZSBzaWduYWwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IG1heSBoYXZlIGFueSBhcmd1bWVudHMsIGJ1dCBpZiB0aGUgZmlyc3QgCisgICAgICAgICAgYXJndW1lbnQgaXMgYSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LCBpdCBtdXN0IGJlIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgbWF5IGJlIGxvZ2dlZCBvciBzaG93biB0byB0aGUgdXNlcgorICAgICAgICAgIGluIHNvbWUgd2F5LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtbm90YXRpb24iPgorICAgICAgICA8dGl0bGU+Tm90YXRpb24gaW4gdGhpcyBkb2N1bWVudDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgZG9jdW1lbnQgdXNlcyBhIHNpbXBsZSBwc2V1ZG8tSURMIHRvIGRlc2NyaWJlIHBhcnRpY3VsYXIgbWV0aG9kIAorICAgICAgICAgIGNhbGxzIGFuZCBzaWduYWxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRob2QgY2FsbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUgKGluIFNUUklORyBuYW1lLCBpbiBVSU5UMzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBVSU5UMzIgcmVzdWx0Y29kZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFRoaXMgbWVhbnMgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiA9IG9yZy5mcmVlZGVza3RvcC5EQnVzLCA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+ID0gU3RhcnRTZXJ2aWNlQnlOYW1lLCAKKyAgICAgICAgICA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gYXJndW1lbnRzIGFyZSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+LCA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBhcmd1bWVudAorICAgICAgICAgIGlzIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4uIFJlbWVtYmVyIHRoYXQgdGhlIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gZmllbGQgY2FuJ3QgY29udGFpbiBhbnkgJy4nIChwZXJpb2QpCisgICAgICAgICAgY2hhcmFjdGVycyBzbyBpdCdzIGtub3duIHRoYXQgdGhlIGxhc3QgcGFydCBvZiB0aGUgbmFtZSBpbgorICAgICAgICAgIHRoZSAiSURMIiBpcyB0aGUgbWVtYmVyIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW4gQysrIHRoYXQgbWlnaHQgZW5kIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmc6OmZyZWVkZXNrdG9wOjpEQnVzOjpTdGFydFNlcnZpY2VCeU5hbWUgKGNvbnN0IGNoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yIGVxdWFsbHkgdmFsaWQsIHRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgZG9uZSBhcyBhbiBhcmd1bWVudDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICB2b2lkIG9yZzo6ZnJlZWRlc2t0b3A6OkRCdXM6OlN0YXJ0U2VydmljZUJ5TmFtZSAoY29uc3QgY2hhciAgICpuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcmVzdWx0Y29kZSk7CisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBJdCdzIHJlYWxseSB1cCB0byB0aGUgQVBJIGRlc2lnbmVyIGhvdyB0aGV5IHdhbnQgdG8gbWFrZSAKKyAgICAgICAgICB0aGlzIGxvb2suIFlvdSBjb3VsZCBkZXNpZ24gYW4gQVBJIHdoZXJlIHRoZSBuYW1lc3BhY2Ugd2Fzbid0IHVzZWQgCisgICAgICAgICAgaW4gQysrLCB1c2luZyBTVEwgb3IgUXQsIHVzaW5nIHZhcmFyZ3MsIG9yIHdoYXRldmVyIHlvdSB3YW50ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU2lnbmFscyBhcmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0IChTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFNpZ25hbHMgZG9uJ3Qgc3BlY2lmeSAiaW4iIHZzLiAib3V0IiBiZWNhdXNlIG9ubHkgCisgICAgICAgICAgYSBzaW5nbGUgZGlyZWN0aW9uIGlzIHBvc3NpYmxlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEl0IGlzbid0IGVzcGVjaWFsbHkgZW5jb3VyYWdlZCB0byB1c2UgdGhpcyBsYW1lIHBzZXVkby1JREwgaW4gYWN0dWFsCisgICAgICAgICAgQVBJIGltcGxlbWVudGF0aW9uczsgeW91IG1pZ2h0IHVzZSB0aGUgbmF0aXZlIG5vdGF0aW9uIGZvciB0aGUKKyAgICAgICAgICBsYW5ndWFnZSB5b3UncmUgdXNpbmcsIG9yIHlvdSBtaWdodCB1c2UgQ09NIG9yIENPUkJBIElETCwgZm9yIGV4YW1wbGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1wcm90b2NvbC1oYW5kbGluZy1pbnZhbGlkIj4KKyAgICAgIDx0aXRsZT5JbnZhbGlkIFByb3RvY29sIGFuZCBTcGVjIEV4dGVuc2lvbnM8L3RpdGxlPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZSBELUJ1cyBwcm90b2NvbCBzaG91bGQgYmUgc3RyaWN0bHkgcGFyc2VkIGFuZAorICAgICAgICB2YWxpZGF0ZWQsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBkZWZpbmVkIGV4dGVuc2lvbiBwb2ludHMuIEFueSBpbnZhbGlkCisgICAgICAgIHByb3RvY29sIG9yIHNwZWMgdmlvbGF0aW9ucyBzaG91bGQgcmVzdWx0IGluIGltbWVkaWF0ZWx5IGRyb3BwaW5nIHRoZQorICAgICAgICBjb25uZWN0aW9uIHdpdGhvdXQgbm90aWNlIHRvIHRoZSBvdGhlciBlbmQuIEV4Y2VwdGlvbnMgc2hvdWxkIGJlCisgICAgICAgIGNhcmVmdWxseSBjb25zaWRlcmVkLCBlLmcuIGFuIGV4Y2VwdGlvbiBtYXkgYmUgd2FycmFudGVkIGZvciBhCisgICAgICAgIHdlbGwtdW5kZXJzdG9vZCBpZGlvc3luY3Jhc3kgb2YgYSB3aWRlbHktZGVwbG95ZWQgaW1wbGVtZW50YXRpb24uICBJbgorICAgICAgICBjYXNlcyB3aGVyZSB0aGUgb3RoZXIgZW5kIG9mIGEgY29ubmVjdGlvbiBpcyAxMDAlIHRydXN0ZWQgYW5kIGtub3duIHRvCisgICAgICAgIGJlIGZyaWVuZGx5LCBza2lwcGluZyB2YWxpZGF0aW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGNvdWxkIGFsc28gbWFrZQorICAgICAgICBzZW5zZSBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgR2VuZXJhbGx5IHNwZWFraW5nIHZpb2xhdGlvbnMgb2YgdGhlICJtdXN0IiByZXF1aXJlbWVudHMgaW4gdGhpcyBzcGVjIAorICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBwb3NzaWJsZSBhdHRlbXB0cyB0byBleHBsb2l0IHNlY3VyaXR5LCBhbmQgdmlvbGF0aW9ucyAKKyAgICAgICAgb2YgdGhlICJzaG91bGQiIHN1Z2dlc3Rpb25zIHNob3VsZCBiZSBjb25zaWRlcmVkIGxlZ2l0aW1hdGUgKHRob3VnaCBwZXJoYXBzCisgICAgICAgIHRoZXkgc2hvdWxkIGdlbmVyYXRlIGFuIGVycm9yIGluIHNvbWUgY2FzZXMpLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGFyZSBidWlsdCBpbiB0byBELUJ1cyBvbiBwdXJwb3NlIGFuZCBtdXN0CisgICAgICAgIG5vdCBiZSB0cmVhdGVkIGFzIGludmFsaWQgcHJvdG9jb2wuIFRoZSBleHRlbnNpb24gcG9pbnRzIGFyZSBpbnRlbmRlZAorICAgICAgICBmb3IgdXNlIGJ5IGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHNwZWMsIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCBmb3IgdGhpcmQKKyAgICAgICAgcGFydGllcy4gIEF0IHRoZSBtb21lbnQsIHRoZSBvbmx5IHdheSBhIHRoaXJkIHBhcnR5IGNvdWxkIGV4dGVuZCBELUJ1cworICAgICAgICB3aXRob3V0IGJyZWFraW5nIGludGVyb3BlcmFiaWxpdHkgd291bGQgYmUgdG8gaW50cm9kdWNlIGEgd2F5IHRvIG5lZ290aWF0ZSBuZXcKKyAgICAgICAgZmVhdHVyZSBzdXBwb3J0IGFzIHBhcnQgb2YgdGhlIGF1dGggcHJvdG9jb2wsIHVzaW5nIEVYVEVOU0lPTl8tcHJlZml4ZWQKKyAgICAgICAgY29tbWFuZHMuIFRoZXJlIGlzIG5vdCB5ZXQgYSBzdGFuZGFyZCB3YXkgdG8gbmVnb3RpYXRlIGZlYXR1cmVzLgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBJbiB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgKHNlZSA8eHJlZiBsaW5rZW5kPSJhdXRoLXByb3RvY29sIi8+KSB1bmtub3duIAorICAgICAgICAgICAgICAgIGNvbW1hbmRzIHJlc3VsdCBpbiBhbiBFUlJPUiByYXRoZXIgdGhhbiBhIGRpc2Nvbm5lY3QuIFRoaXMgZW5hYmxlcyAKKyAgICAgICAgICAgICAgICBmdXR1cmUgZXh0ZW5zaW9ucyB0byB0aGUgcHJvdG9jb2wuIENvbW1hbmRzIHN0YXJ0aW5nIHdpdGggRVhURU5TSU9OXyBhcmUgCisgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgZm9yIHRoaXJkIHBhcnRpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIHN1cHBvcnRzIHBsdWdnYWJsZSBhdXRoIG1lY2hhbmlzbXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGFkZHJlc3MgZm9ybWF0IChzZWUgPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+KSBzdXBwb3J0cyBuZXcKKyAgICAgICAgICAgICAga2luZHMgb2YgdHJhbnNwb3J0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIE1lc3NhZ2VzIHdpdGggYW4gdW5rbm93biB0eXBlIChzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAgICAgICA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+LAorICAgICAgICAgICAgICA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD4pIGFyZSBpZ25vcmVkLiAKKyAgICAgICAgICAgICAgVW5rbm93bi10eXBlIG1lc3NhZ2VzIG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQgaW4gdGhlIHNhbWUgd2F5IAorICAgICAgICAgICAgICBhcyB0aGUga25vd24gbWVzc2FnZXMsIGhvd2V2ZXIuIFRoZXkgc3RpbGwgaGF2ZSB0aGUgbm9ybWFsIAorICAgICAgICAgICAgICBoZWFkZXIgYW5kIGJvZHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgSGVhZGVyIGZpZWxkcyB3aXRoIGFuIHVua25vd24gb3IgdW5leHBlY3RlZCBmaWVsZCBjb2RlIG11c3QgYmUgaWdub3JlZCwgCisgICAgICAgICAgICAgIHRob3VnaCBhZ2FpbiB0aGV5IG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTmV3IHN0YW5kYXJkIGludGVyZmFjZXMgKHdpdGggbmV3IG1ldGhvZHMgYW5kIHNpZ25hbHMpIGNhbiBvZiBjb3Vyc2UgYmUgYWRkZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3QyPgorCisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJhdXRoLXByb3RvY29sIj4KKyAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gUHJvdG9jb2w8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgQmVmb3JlIHRoZSBmbG93IG9mIG1lc3NhZ2VzIGJlZ2lucywgdHdvIGFwcGxpY2F0aW9ucyBtdXN0CisgICAgICBhdXRoZW50aWNhdGUuIEEgc2ltcGxlIHBsYWluLXRleHQgcHJvdG9jb2wgaXMgdXNlZCBmb3IKKyAgICAgIGF1dGhlbnRpY2F0aW9uOyB0aGlzIHByb3RvY29sIGlzIGEgU0FTTCBwcm9maWxlLCBhbmQgbWFwcyBmYWlybHkKKyAgICAgIGRpcmVjdGx5IGZyb20gdGhlIFNBU0wgc3BlY2lmaWNhdGlvbi4gVGhlIG1lc3NhZ2UgZW5jb2RpbmcgaXMKKyAgICAgIE5PVCB1c2VkIGhlcmUsIG9ubHkgcGxhaW4gdGV4dCBtZXNzYWdlcy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJbiBleGFtcGxlcywgIkM6IiBhbmQgIlM6IiBpbmRpY2F0ZSBsaW5lcyBzZW50IGJ5IHRoZSBjbGllbnQgYW5kCisgICAgICBzZXJ2ZXIgcmVzcGVjdGl2ZWx5LgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtcHJvdG9jb2wtb3ZlcnZpZXciPgorICAgICAgPHRpdGxlPlByb3RvY29sIE92ZXJ2aWV3PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgcHJvdG9jb2wgaXMgYSBsaW5lLWJhc2VkIHByb3RvY29sLCB3aGVyZSBlYWNoIGxpbmUgZW5kcyB3aXRoCisgICAgICAgIFxyXG4uIEVhY2ggbGluZSBiZWdpbnMgd2l0aCBhbiBhbGwtY2FwcyBBU0NJSSBjb21tYW5kIG5hbWUgY29udGFpbmluZworICAgICAgICBvbmx5IHRoZSBjaGFyYWN0ZXIgcmFuZ2UgW0EtWl9dLCBhIHNwYWNlLCB0aGVuIGFueSBhcmd1bWVudHMgZm9yIHRoZQorICAgICAgICBjb21tYW5kLCB0aGVuIHRoZSBcclxuIGVuZGluZyB0aGUgbGluZS4gVGhlIHByb3RvY29sIGlzCisgICAgICAgIGNhc2Utc2Vuc2l0aXZlLiBBbGwgYnl0ZXMgbXVzdCBiZSBpbiB0aGUgQVNDSUkgY2hhcmFjdGVyIHNldC4KKworICAgICAgICBDb21tYW5kcyBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlciBhcmUgYXMgZm9sbG93czoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5BVVRIIFttZWNoYW5pc21dIFtpbml0aWFsLXJlc3BvbnNlXTwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5DQU5DRUw8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QkVHSU48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+REFUQSAmbHQ7ZGF0YSBpbiBoZXggZW5jb2RpbmcmZ3Q7PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVSUk9SIFtodW1hbi1yZWFkYWJsZSBlcnJvciBleHBsYW5hdGlvbl08L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+TkVHT1RJQVRFX1VOSVhfRkQ8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgRnJvbSBzZXJ2ZXIgdG8gY2xpZW50IGFyZSBhcyBmb2xsb3dzOgorCisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPlJFSkVDVEVEICZsdDtzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWNoYW5pc20gbmFtZXMmZ3Q7PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPk9LICZsdDtHVUlEIGluIGhleCZndDs8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+REFUQSAmbHQ7ZGF0YSBpbiBoZXggZW5jb2RpbmcmZ3Q7PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVSUk9SPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkFHUkVFX1VOSVhfRkQ8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW5vZmZpY2lhbCBleHRlbnNpb25zIHRvIHRoZSBjb21tYW5kIHNldCBtdXN0IGJlZ2luIHdpdGggdGhlIGxldHRlcnMgCisgICAgICAgICJFWFRFTlNJT05fIiwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZnV0dXJlIG9mZmljaWFsIGNvbW1hbmRzLgorICAgICAgICBGb3IgZXhhbXBsZSwgIkVYVEVOU0lPTl9DT01fTVlET01BSU5fRE9fU1RVRkYiLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLW51bC1ieXRlIj4KKyAgICAgIDx0aXRsZT5TcGVjaWFsIGNyZWRlbnRpYWxzLXBhc3NpbmcgbnVsIGJ5dGU8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEltbWVkaWF0ZWx5IGFmdGVyIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlciwgdGhlIGNsaWVudCBtdXN0IHNlbmQgYQorICAgICAgICBzaW5nbGUgbnVsIGJ5dGUuIFRoaXMgYnl0ZSBtYXkgYmUgYWNjb21wYW5pZWQgYnkgY3JlZGVudGlhbHMKKyAgICAgICAgaW5mb3JtYXRpb24gb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IHVzZSBzZW5kbXNnKCkgd2l0aAorICAgICAgICBTQ01fQ1JFRFMgb3IgU0NNX0NSRURFTlRJQUxTIHRvIHBhc3MgY3JlZGVudGlhbHMgb3ZlciBVTklYIGRvbWFpbgorICAgICAgICBzb2NrZXRzLiBIb3dldmVyLCB0aGUgbnVsIGJ5dGUgbXVzdCBiZSBzZW50IGV2ZW4gb24gb3RoZXIga2luZHMgb2YKKyAgICAgICAgc29ja2V0LCBhbmQgZXZlbiBvbiBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGRvIG5vdCByZXF1aXJlIGEgYnl0ZSB0byBiZQorICAgICAgICBzZW50IGluIG9yZGVyIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLiBUaGUgdGV4dCBwcm90b2NvbCBkZXNjcmliZWQgaW4KKyAgICAgICAgdGhpcyBkb2N1bWVudCBiZWdpbnMgYWZ0ZXIgdGhlIHNpbmdsZSBudWwgYnl0ZS4gSWYgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50IGlzIG5vdCBhIG51bCBieXRlLCB0aGUgc2VydmVyIG1heSBkaXNjb25uZWN0IAorICAgICAgICB0aGF0IGNsaWVudC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIG51bCBieXRlIGluIGFueSBjb250ZXh0IG90aGVyIHRoYW4gdGhlIGluaXRpYWwgYnl0ZSBpcyBhbiBlcnJvcjsgCisgICAgICAgIHRoZSBwcm90b2NvbCBpcyBBU0NJSS1vbmx5LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjcmVkZW50aWFscyBzZW50IGFsb25nIHdpdGggdGhlIG51bCBieXRlIG1heSBiZSB1c2VkIHdpdGggdGhlIAorICAgICAgICBTQVNMIG1lY2hhbmlzbSBFWFRFUk5BTC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWF1dGgiPgorICAgICAgPHRpdGxlPkFVVEggY29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYW4gQVVUSCBjb21tYW5kIGhhcyBubyBhcmd1bWVudHMsIGl0IGlzIGEgcmVxdWVzdCB0byBsaXN0CisgICAgICAgIGF2YWlsYWJsZSBtZWNoYW5pc21zLiBUaGUgc2VydmVyIG11c3QgcmVzcG9uZCB3aXRoIGEgUkVKRUNURUQKKyAgICAgICAgY29tbWFuZCBsaXN0aW5nIHRoZSBtZWNoYW5pc21zIGl0IHVuZGVyc3RhbmRzLCBvciB3aXRoIGFuIGVycm9yLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGFuIEFVVEggY29tbWFuZCBzcGVjaWZpZXMgYSBtZWNoYW5pc20sIGFuZCB0aGUgc2VydmVyIHN1cHBvcnRzCisgICAgICAgIHNhaWQgbWVjaGFuaXNtLCB0aGUgc2VydmVyIHNob3VsZCBiZWdpbiBleGNoYW5naW5nIFNBU0wKKyAgICAgICAgY2hhbGxlbmdlLXJlc3BvbnNlIGRhdGEgd2l0aCB0aGUgY2xpZW50IHVzaW5nIERBVEEgY29tbWFuZHMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtZWNoYW5pc20gZ2l2ZW4gaW4gdGhlIEFVVEgKKyAgICAgICAgY29tbWFuZCwgaXQgbXVzdCBzZW5kIGVpdGhlciBhIFJFSkVDVEVEIGNvbW1hbmQgbGlzdGluZyB0aGUgbWVjaGFuaXNtcworICAgICAgICBpdCBkb2VzIHN1cHBvcnQsIG9yIGFuIGVycm9yLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIHRoZSBbaW5pdGlhbC1yZXNwb25zZV0gYXJndW1lbnQgaXMgcHJvdmlkZWQsIGl0IGlzIGludGVuZGVkIGZvciB1c2UKKyAgICAgICAgd2l0aCBtZWNoYW5pc21zIHRoYXQgaGF2ZSBubyBpbml0aWFsIGNoYWxsZW5nZSAob3IgYW4gZW1wdHkgaW5pdGlhbAorICAgICAgICBjaGFsbGVuZ2UpLCBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCB0byBhbiBpbml0aWFsIERBVEEgY29tbWFuZC4gSWYKKyAgICAgICAgdGhlIHNlbGVjdGVkIG1lY2hhbmlzbSBoYXMgYW4gaW5pdGlhbCBjaGFsbGVuZ2UgYW5kIFtpbml0aWFsLXJlc3BvbnNlXQorICAgICAgICB3YXMgcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlamVjdCBhdXRoZW50aWNhdGlvbiBieSBzZW5kaW5nCisgICAgICAgIFJFSkVDVEVELgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzIGFmdGVyIGV4Y2hhbmdpbmcgREFUQSBjb21tYW5kcywgCisgICAgICAgIGFuIE9LIGNvbW1hbmQgbXVzdCBiZSBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIEJFR0lOCisgICAgICAgIGNvbW1hbmQgZnJvbSB0aGUgY2xpZW50IG11c3QgYmUgdGhlIGZpcnN0IG9jdGV0IG9mIHRoZQorICAgICAgICBhdXRoZW50aWNhdGVkL2VuY3J5cHRlZCBzdHJlYW0gb2YgRC1CdXMgbWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgQkVHSU4gaXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciwgdGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkCisgICAgICAgIGJ5IHRoZSBjbGllbnQgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIE9LIGNvbW1hbmQgbXVzdCBiZSB0aGUKKyAgICAgICAgZmlyc3Qgb2N0ZXQgb2YgdGhlIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cworICAgICAgICBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWNhbmNlbCI+CisgICAgICA8dGl0bGU+Q0FOQ0VMIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEF0IGFueSB0aW1lIHVwIHRvIHNlbmRpbmcgdGhlIEJFR0lOIGNvbW1hbmQsIHRoZSBjbGllbnQgbWF5IHNlbmQgYQorICAgICAgICBDQU5DRUwgY29tbWFuZC4gT24gcmVjZWl2aW5nIHRoZSBDQU5DRUwgY29tbWFuZCwgdGhlIHNlcnZlciBtdXN0CisgICAgICAgIHNlbmQgYSBSRUpFQ1RFRCBjb21tYW5kIGFuZCBhYm9ydCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICBleGNoYW5nZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWRhdGEiPgorICAgICAgPHRpdGxlPkRBVEEgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIERBVEEgY29tbWFuZCBtYXkgY29tZSBmcm9tIGVpdGhlciBjbGllbnQgb3Igc2VydmVyLCBhbmQgc2ltcGx5IAorICAgICAgICBjb250YWlucyBhIGhleC1lbmNvZGVkIGJsb2NrIG9mIGRhdGEgdG8gYmUgaW50ZXJwcmV0ZWQgCisgICAgICAgIGFjY29yZGluZyB0byB0aGUgU0FTTCBtZWNoYW5pc20gaW4gdXNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFNvbWUgU0FTTCBtZWNoYW5pc21zIHN1cHBvcnQgc2VuZGluZyBhbiAiZW1wdHkgc3RyaW5nIjsgCisgICAgICAgIEZJWE1FIHdlIG5lZWQgc29tZSB3YXkgdG8gZG8gdGhpcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWJlZ2luIj4KKyAgICAgIDx0aXRsZT5CRUdJTiBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgQkVHSU4gY29tbWFuZCBhY2tub3dsZWRnZXMgdGhhdCB0aGUgY2xpZW50IGhhcyByZWNlaXZlZCBhbiAKKyAgICAgICAgT0sgY29tbWFuZCBmcm9tIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0IHRoZSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAgICAgICAgaXMgYWJvdXQgdG8gYmVnaW4uIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBvY3RldCByZWNlaXZlZCBieSB0aGUgc2VydmVyIGFmdGVyIHRoZSBcclxuIG9mIHRoZSBCRUdJTgorICAgICAgICBjb21tYW5kIGZyb20gdGhlIGNsaWVudCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUKKyAgICAgICAgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtcmVqZWN0ZWQiPgorICAgICAgPHRpdGxlPlJFSkVDVEVEIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBSRUpFQ1RFRCBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGV4Y2hhbmdlIGhhcyBmYWlsZWQsIGFuZCBmdXJ0aGVyIGV4Y2hhbmdlIG9mIERBVEEgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgVGhlIGNsaWVudCB3b3VsZCBub3JtYWxseSB0cnkgYW5vdGhlciBtZWNoYW5pc20sIG9yIHRyeSBwcm92aWRpbmcKKyAgICAgICAgZGlmZmVyZW50IHJlc3BvbnNlcyB0byBjaGFsbGVuZ2VzLgorICAgICAgPC9wYXJhPjxwYXJhPgorICAgICAgICBPcHRpb25hbGx5LCB0aGUgUkVKRUNURUQgY29tbWFuZCBoYXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgICBhdmFpbGFibGUgYXV0aCBtZWNoYW5pc21zIGFzIGFyZ3VtZW50cy4gSWYgYSBzZXJ2ZXIgZXZlciBwcm92aWRlcworICAgICAgICBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lY2hhbmlzbXMsIGl0IG11c3QgcHJvdmlkZSB0aGUgc2FtZSBsaXN0IAorICAgICAgICBlYWNoIHRpbWUgaXQgc2VuZHMgYSBSRUpFQ1RFRCBtZXNzYWdlLiBDbGllbnRzIGFyZSBmcmVlIHRvIAorICAgICAgICBpZ25vcmUgYWxsIGxpc3RzIHJlY2VpdmVkIGFmdGVyIHRoZSBmaXJzdC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLW9rIj4KKyAgICAgIDx0aXRsZT5PSyBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgT0sgY29tbWFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuCisgICAgICAgIGF1dGhlbnRpY2F0ZWQuIFRoZSBjbGllbnQgbWF5IG5vdyBwcm9jZWVkIHdpdGggbmVnb3RpYXRpbmcKKyAgICAgICAgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4gVG8gZG8gdGhhdCBpdCBzaGFsbCBzZW5kCisgICAgICAgIE5FR09USUFURV9VTklYX0ZEIHRvIHRoZSBzZXJ2ZXIuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgY2xpZW50IG11c3QgcmVzcG9uZCB0byB0aGUgT0sgY29tbWFuZCBieQorICAgICAgICBzZW5kaW5nIGEgQkVHSU4gY29tbWFuZCwgZm9sbG93ZWQgYnkgaXRzIHN0cmVhbSBvZiBtZXNzYWdlcywKKyAgICAgICAgb3IgYnkgZGlzY29ubmVjdGluZy4gIFRoZSBzZXJ2ZXIgbXVzdCBub3QgYWNjZXB0IGFkZGl0aW9uYWwKKyAgICAgICAgY29tbWFuZHMgdXNpbmcgdGhpcyBwcm90b2NvbCBhZnRlciB0aGUgQkVHSU4gY29tbWFuZCBoYXMgYmVlbgorICAgICAgICByZWNlaXZlZC4gRnVydGhlciBjb21tdW5pY2F0aW9uIHdpbGwgYmUgYSBzdHJlYW0gb2YgRC1CdXMKKyAgICAgICAgbWVzc2FnZXMgKG9wdGlvbmFsbHkgZW5jcnlwdGVkLCBhcyBuZWdvdGlhdGVkKSByYXRoZXIgdGhhbgorICAgICAgICB0aGlzIHByb3RvY29sLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGEgY2xpZW50IHNlbmRzIEJFR0lOIHRoZSBmaXJzdCBvY3RldCByZWNlaXZlZCBieSB0aGUgY2xpZW50CisgICAgICAgIGFmdGVyIHRoZSBcclxuIG9mIHRoZSBPSyBjb21tYW5kIG11c3QgYmUgdGhlIGZpcnN0IG9jdGV0IG9mCisgICAgICAgIHRoZSBhdXRoZW50aWNhdGVkL2VuY3J5cHRlZCBzdHJlYW0gb2YgRC1CdXMgbWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIE9LIGNvbW1hbmQgaGFzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIEdVSUQgb2YgdGhlIHNlcnZlci4KKyAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9ImFkZHJlc3NlcyIvPiBmb3IgbW9yZSBvbiBzZXJ2ZXIgR1VJRHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1lcnJvciI+CisgICAgICA8dGl0bGU+RVJST1IgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEVSUk9SIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgZWl0aGVyIHNlcnZlciBvciBjbGllbnQgZGlkIG5vdAorICAgICAgICBrbm93IGEgY29tbWFuZCwgZG9lcyBub3QgYWNjZXB0IHRoZSBnaXZlbiBjb21tYW5kIGluIHRoZSBjdXJyZW50CisgICAgICAgIGNvbnRleHQsIG9yIGRpZCBub3QgdW5kZXJzdGFuZCB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLiBUaGlzCisgICAgICAgIGFsbG93cyB0aGUgcHJvdG9jb2wgdG8gYmUgZXh0ZW5kZWQ7IGEgY2xpZW50IG9yIHNlcnZlciBjYW4gc2VuZCBhCisgICAgICAgIGNvbW1hbmQgcHJlc2VudCBvciBwZXJtaXR0ZWQgb25seSBpbiBuZXcgcHJvdG9jb2wgdmVyc2lvbnMsIGFuZCBpZgorICAgICAgICBhbiBFUlJPUiBpcyByZWNlaXZlZCBpbnN0ZWFkIG9mIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlLCBmYWxsIGJhY2sKKyAgICAgICAgdG8gdXNpbmcgc29tZSBvdGhlciB0ZWNobmlxdWUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYW4gRVJST1IgaXMgc2VudCwgdGhlIHNlcnZlciBvciBjbGllbnQgdGhhdCBzZW50IHRoZQorICAgICAgICBlcnJvciBtdXN0IGNvbnRpbnVlIGFzIGlmIHRoZSBjb21tYW5kIGNhdXNpbmcgdGhlIEVSUk9SIGhhZCBuZXZlciBiZWVuCisgICAgICAgIHJlY2VpdmVkLiBIb3dldmVyLCB0aGUgdGhlIHNlcnZlciBvciBjbGllbnQgcmVjZWl2aW5nIHRoZSBlcnJvciAKKyAgICAgICAgc2hvdWxkIHRyeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0ZXZlciBjYXVzZWQgdGhlIGVycm9yOyAKKyAgICAgICAgaWYgb25seSBjYW5jZWxpbmcvcmVqZWN0aW5nIHRoZSBhdXRoZW50aWNhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiB0aGUgRC1CdXMgcHJvdG9jb2wgY2hhbmdlcyBpbmNvbXBhdGlibHkgYXQgc29tZSBmdXR1cmUgdGltZSwKKyAgICAgICAgYXBwbGljYXRpb25zIGltcGxlbWVudGluZyB0aGUgbmV3IHByb3RvY29sIHdvdWxkIHByb2JhYmx5IGJlIGFibGUgdG8KKyAgICAgICAgY2hlY2sgZm9yIHN1cHBvcnQgb2YgdGhlIG5ldyBwcm90b2NvbCBieSBzZW5kaW5nIGEgbmV3IGNvbW1hbmQgYW5kCisgICAgICAgIHJlY2VpdmluZyBhbiBFUlJPUiBmcm9tIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgaXQuIFRodXMgdGhlCisgICAgICAgIEVSUk9SIGZlYXR1cmUgb2YgdGhlIGF1dGggcHJvdG9jb2wgaXMgYW4gZXNjYXBlIGhhdGNoIHRoYXQgbGV0cyB1cworICAgICAgICBuZWdvdGlhdGUgZXh0ZW5zaW9ucyBvciBjaGFuZ2VzIHRvIHRoZSBELUJ1cyBwcm90b2NvbCBpbiB0aGUgZnV0dXJlLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtbmVnb3RpYXRlLXVuaXgtZmQiPgorICAgICAgPHRpdGxlPk5FR09USUFURV9VTklYX0ZEIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBORUdPVElBVEVfVU5JWF9GRCBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQKKyAgICAgICAgc3VwcG9ydHMgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4gVGhpcyBjb21tYW5kIG1heSBvbmx5CisgICAgICAgIGJlIHNlbnQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaXMgYXV0aGVudGljYXRlZCwgaS5lLiBhZnRlciBPSworICAgICAgICB3YXMgcmVjZWl2ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjb21tYW5kIG1heSBvbmx5IGJlIHNlbnQgb24KKyAgICAgICAgdHJhbnNwb3J0cyB0aGF0IHN1cHBvcnQgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiByZWNlaXZpbmcgTkVHT1RJQVRFX1VOSVhfRkQgdGhlIHNlcnZlciBtdXN0IHJlc3BvbmQgd2l0aAorICAgICAgICBlaXRoZXIgQUdSRUVfVU5JWF9GRCBvciBFUlJPUi4gSXQgc2hhbGwgcmVzcG9uZCB0aGUgZm9ybWVyIGlmCisgICAgICAgIHRoZSB0cmFuc3BvcnQgY2hvc2VuIHN1cHBvcnRzIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgYW5kCisgICAgICAgIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiBJdCBzaGFsbCByZXNwb25kIHRoZSBsYXR0ZXIKKyAgICAgICAgaWYgdGhlIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFVuaXggZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHBhc3NpbmcsIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUsIG9yIHRoZQorICAgICAgICBzZXJ2ZXIgZGVjaWRlcyBub3QgdG8gZW5hYmxlIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIGR1ZSB0bworICAgICAgICBzZWN1cml0eSBvciBvdGhlciByZWFzb25zLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtYWdyZWUtdW5peC1mZCI+CisgICAgICA8dGl0bGU+QUdSRUVfVU5JWF9GRCBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgQUdSRUVfVU5JWF9GRCBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2ZXIgc3VwcG9ydHMKKyAgICAgICAgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4gVGhpcyBjb21tYW5kIG1heSBvbmx5IGJlIHNlbnQKKyAgICAgICAgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaXMgYXV0aGVudGljYXRlZCwgYW5kIHRoZSBjbGllbnQgc2VudAorICAgICAgICBORUdPVElBVEVfVU5JWF9GRCB0byBlbmFibGUgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4gVGhpcworICAgICAgICBjb21tYW5kIG1heSBvbmx5IGJlIHNlbnQgb24gdHJhbnNwb3J0cyB0aGF0IHN1cHBvcnQgVW5peCBmaWxlCisgICAgICAgIGRlc2NyaXB0b3IgcGFzc2luZy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiByZWNlaXZpbmcgQUdSRUVfVU5JWF9GRCB0aGUgY2xpZW50IG11c3QgcmVzcG9uZCB3aXRoIEJFR0lOLAorICAgICAgICBmb2xsb3dlZCBieSBpdHMgc3RyZWFtIG9mIG1lc3NhZ2VzLCBvciBieSBkaXNjb25uZWN0aW5nLiAgVGhlCisgICAgICAgIHNlcnZlciBtdXN0IG5vdCBhY2NlcHQgYWRkaXRpb25hbCBjb21tYW5kcyB1c2luZyB0aGlzIHByb3RvY29sCisgICAgICAgIGFmdGVyIHRoZSBCRUdJTiBjb21tYW5kIGhhcyBiZWVuIHJlY2VpdmVkLiBGdXJ0aGVyCisgICAgICAgIGNvbW11bmljYXRpb24gd2lsbCBiZSBhIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcyAob3B0aW9uYWxseQorICAgICAgICBlbmNyeXB0ZWQsIGFzIG5lZ290aWF0ZWQpIHJhdGhlciB0aGFuIHRoaXMgcHJvdG9jb2wuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1mdXR1cmUiPgorICAgICAgPHRpdGxlPkZ1dHVyZSBFeHRlbnNpb25zPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBGdXR1cmUgZXh0ZW5zaW9ucyB0byB0aGUgYXV0aGVudGljYXRpb24gYW5kIG5lZ290aWF0aW9uCisgICAgICAgIHByb3RvY29sIGFyZSBwb3NzaWJsZS4gRm9yIHRoYXQgbmV3IGNvbW1hbmRzIG1heSBiZQorICAgICAgICBpbnRyb2R1Y2VkLiBJZiBhIGNsaWVudCBvciBzZXJ2ZXIgcmVjZWl2ZXMgYW4gdW5rbm93biBjb21tYW5kCisgICAgICAgIGl0IHNoYWxsIHJlc3BvbmQgd2l0aCBFUlJPUiBhbmQgbm90IGNvbnNpZGVyIHRoaXMgZmF0YWwuIE5ldworICAgICAgICBjb21tYW5kcyBtYXkgYmUgaW50cm9kdWNlZCBib3RoIGJlZm9yZSwgYW5kIGFmdGVyCisgICAgICAgIGF1dGhlbnRpY2F0aW9uLCBpLmUuIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgT0sgY29tbWFuZC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1leGFtcGxlcyI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gZXhhbXBsZXM8L3RpdGxlPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbjwvdGl0bGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgKE1BR0lDX0NPT0tJRSBpcyBhIG1hZGUgdXAgbWVjaGFuaXNtKQorCisgICAgICAgICAgICBDOiBBVVRIIE1BR0lDX0NPT0tJRSAzMTM4MzYzOTM1MzMzMTM3MzkzNjM1MzgzNjM0CisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2YgZmluZGluZyBvdXQgbWVjaGFuaXNtcyB0aGVuIHBpY2tpbmcgb25lPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBDOiBBVVRICisgICAgICAgICAgICBTOiBSRUpFQ1RFRCBLRVJCRVJPU19WNCBTS0VZCisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBjbGllbnQgc2VuZHMgdW5rbm93biBjb21tYW5kIHRoZW4gZmFsbHMgYmFjayB0byByZWd1bGFyIGF1dGg8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEZPT0JBUgorICAgICAgICAgICAgUzogRVJST1IKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IGluaXRpYWwgYXV0aCBtZWNoYW5pc208L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHdyb25nIHBhc3N3b3JkIG9yIHRoZSBsaWtlIGZvbGxvd2VkIGJ5IHN1Y2Nlc3NmdWwgcmV0cnk8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogUkVKRUNURUQKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHNrZXkgY2FuY2VsbGVkIGFuZCByZXN0YXJ0ZWQ8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBDQU5DRUwKKyAgICAgICAgICAgIFM6IFJFSkVDVEVECisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbiB3aXRoIHN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24gb2YgVW5peCBGRCBwYXNzaW5nPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogTkVHT1RJQVRFX1VOSVhfRkQKKyAgICAgICAgICAgIFM6IEFHUkVFX1VOSVhfRkQKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb24gd2l0aCB1bnN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24gb2YgVW5peCBGRCBwYXNzaW5nPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogTkVHT1RJQVRFX1VOSVhfRkQKKyAgICAgICAgICAgIFM6IEVSUk9SCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLXN0YXRlcyI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gc3RhdGUgZGlhZ3JhbXM8L3RpdGxlPgorICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRvY3VtZW50cyB0aGUgYXV0aCBwcm90b2NvbCBpbiB0ZXJtcyBvZiAKKyAgICAgICAgYSBzdGF0ZSBtYWNoaW5lIGZvciB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLiBUaGlzIGlzIAorICAgICAgICBwcm9iYWJseSB0aGUgbW9zdCByb2J1c3Qgd2F5IHRvIGltcGxlbWVudCB0aGUgcHJvdG9jb2wuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0iYXV0aC1zdGF0ZXMtY2xpZW50Ij4KKyAgICAgICAgPHRpdGxlPkNsaWVudCBzdGF0ZXM8L3RpdGxlPgorICAgICAgICAKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVG8gbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmUgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlCisgICAgICAgICAgcHJvdG9jb2wgc3RhdGUgbWFjaGluZSBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgdGhlCisgICAgICAgICAgZm9sbG93aW5nIG5vdGF0aW9uIGlzIHVzZWQ6IE1FQ0goQ0hBTEwpIG1lYW5zIHRoYXQgdGhlCisgICAgICAgICAgc2VydmVyIGNoYWxsZW5nZSBDSEFMTCB3YXMgZmVkIHRvIHRoZSBtZWNoYW5pc20gTUVDSCwgd2hpY2gKKyAgICAgICAgICByZXR1cm5zIG9uZSBvZgorCisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQ09OVElOVUUoUkVTUCkgbWVhbnMgY29udGludWUgdGhlIGF1dGggY29udmVyc2F0aW9uCisgICAgICAgICAgICAgICAgYW5kIHNlbmQgUkVTUCBhcyB0aGUgcmVzcG9uc2UgdG8gdGhlIHNlcnZlcjsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPSyhSRVNQKSBtZWFucyB0aGF0IGFmdGVyIHNlbmRpbmcgUkVTUCB0byB0aGUgc2VydmVyCisgICAgICAgICAgICAgICAgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBpcyBmaW5pc2hlZAorICAgICAgICAgICAgICAgIGFuZCB0aGUgc2VydmVyIHNob3VsZCByZXR1cm4gIk9LIjsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBFUlJPUiBtZWFucyB0aGF0IENIQUxMIHdhcyBpbnZhbGlkIGFuZCBjb3VsZCBub3QgYmUKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgCisgICAgICAgICAgQm90aCBSRVNQIGFuZCBDSEFMTCBtYXkgYmUgZW1wdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBDbGllbnQgc3RhcnRzIGJ5IGdldHRpbmcgYW4gaW5pdGlhbCByZXNwb25zZSBmcm9tIHRoZQorICAgICAgICAgIGRlZmF1bHQgbWVjaGFuaXNtIGFuZCBzZW5kcyBBVVRIIE1FQ0ggUkVTUCwgb3IgQVVUSCBNRUNIIGlmCisgICAgICAgICAgdGhlIG1lY2hhbmlzbSBkaWQgbm90IHByb3ZpZGUgYW4gaW5pdGlhbCByZXNwb25zZS4gIElmIHRoZQorICAgICAgICAgIG1lY2hhbmlzbSByZXR1cm5zIENPTlRJTlVFLCB0aGUgY2xpZW50IHN0YXJ0cyBpbiBzdGF0ZQorICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+LCBpZiB0aGUgbWVjaGFuaXNtCisgICAgICAgICAgcmV0dXJucyBPSyB0aGUgY2xpZW50IHN0YXJ0cyBpbiBzdGF0ZQorICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICAKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGNsaWVudCBzaG91bGQga2VlcCB0cmFjayBvZiBhdmFpbGFibGUgbWVjaGFuaXNtcyBhbmQKKyAgICAgICAgICB3aGljaCBpdCBtZWNoYW5pc21zIGl0IGhhcyBhbHJlYWR5IGF0dGVtcHRlZC4gVGhpcyBsaXN0IGlzCisgICAgICAgICAgdXNlZCB0byBkZWNpZGUgd2hpY2ggQVVUSCBjb21tYW5kIHRvIHNlbmQuIFdoZW4gdGhlIGxpc3QgaXMKKyAgICAgICAgICBleGhhdXN0ZWQsIHRoZSBjbGllbnQgc2hvdWxkIGdpdmUgdXAgYW5kIGNsb3NlIHRoZQorICAgICAgICAgIGNvbm5lY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBEQVRBIENIQUxMCisgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKENIQUxMKSByZXR1cm5zIENPTlRJTlVFKFJFU1ApICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBSRVNQLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKENIQUxMKSByZXR1cm5zIE9LKFJFU1ApICZyYXJyOyBzZW5kIERBVEEKKyAgICAgICAgICAgICAgICAgICAgICBSRVNQLCBnb3RvIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgRVJST1IgJnJhcnI7IHNlbmQgRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICBbbXNnXSwgZ290byA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1RFRCBbbWVjaHNdICZyYXJyOworICAgICAgICAgICAgICAgICAgc2VuZCBBVVRIIFtuZXh0IG1lY2hdLCBnb3RvCisgICAgICAgICAgICAgICAgICBXYWl0aW5nRm9yRGF0YSBvciA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgIENBTkNFTCwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JSZWplY3Q8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBPSyAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgQkVHSU4sIHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIE9LICZyYXJyOyBzZW5kIEJFR0lOLCB0ZXJtaW5hdGUgYXV0aAorICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLCA8ZW1waGFzaXM+YXV0aGVudGljYXRlZDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIFJFSkVDVEVEIFttZWNoc10gJnJhcnI7IHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwKKyAgICAgICAgICAgICAgICAgIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4gb3IKKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIERBVEEgJnJhcnI7IHNlbmQgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZCBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1RFRCBbbWVjaHNdICZyYXJyOyBzZW5kIEFVVEggW25leHQgbWVjaF0sCisgICAgICAgICAgICAgICAgICBnb3RvIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+IG9yCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyB0ZXJtaW5hdGUgYXV0aAorICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLCBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYXV0aC1zdGF0ZXMtc2VydmVyIj4KKyAgICAgICAgPHRpdGxlPlNlcnZlciBzdGF0ZXM8L3RpdGxlPgorIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBGb3IgdGhlIHNlcnZlciBNRUNIKFJFU1ApIG1lYW5zIHRoYXQgdGhlIGNsaWVudCByZXNwb25zZQorICAgICAgICAgIFJFU1Agd2FzIGZlZCB0byB0aGUgdGhlIG1lY2hhbmlzbSBNRUNILCB3aGljaCByZXR1cm5zIG9uZSBvZgorCisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQ09OVElOVUUoQ0hBTEwpIG1lYW5zIGNvbnRpbnVlIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBhbmQKKyAgICAgICAgICAgICAgICBzZW5kIENIQUxMIGFzIHRoZSBjaGFsbGVuZ2UgdG8gdGhlIGNsaWVudDsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPSyBtZWFucyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZDsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBSRUpFQ1RFRCBtZWFucyB0aGF0IHRoZSBjbGllbnQgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvcgorICAgICAgICAgICAgICAgIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBSRVNQLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgVGhlIHNlcnZlciBzdGFydHMgb3V0IGluIHN0YXRlCisgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4uICBJZiB0aGUgY2xpZW50IGlzCisgICAgICAgICAgcmVqZWN0ZWQgdG9vIG1hbnkgdGltZXMgdGhlIHNlcnZlciBtdXN0IGRpc2Nvbm5lY3QgdGhlCisgICAgICAgICAgY2xpZW50LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBBVVRIICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQVVUSCBNRUNIIFJFU1AKKworICAgICAgICAgICAgICAgICAgPHNpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSCBub3QgdmFsaWQgbWVjaGFuaXNtICZyYXJyOyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIENPTlRJTlVFKENIQUxMKSAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgICAgIERBVEEgQ0hBTEwsIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBPSyAmcmFycjsgc2VuZCBPSywgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQmVnaW48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBSRUpFQ1RFRCAmcmFycjsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlCisgICAgICAgICAgICAgICAgICBhdXRoIGNvbnZlcnNhdGlvbiwgZGlzY29ubmVjdAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEVSUk9SICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgICAKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSBSRVNQCisgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgQ09OVElOVUUoQ0hBTEwpICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBDSEFMTCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIE9LICZyYXJyOyBzZW5kIE9LLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JCZWdpbjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIFJFSkVDVEVEICZyYXJyOyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICZyYXJyOyB0ZXJtaW5hdGUgYXV0aCBjb252ZXJzYXRpb24sCisgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQ0FOQ0VMICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlIGF1dGggY29udmVyc2F0aW9uLAorICAgICAgICAgICAgICAgICAgY2xpZW50IGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBDQU5DRUwgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHNlbmQgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQmVnaW48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICA8L3NlY3QzPgorICAgICAgCisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtbWVjaGFuaXNtcyI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gbWVjaGFuaXNtczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIG5ldyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zLgorICAgICAgICBELUJ1cyBhbHNvIGFsbG93cyBhbnkgc3RhbmRhcmQgU0FTTCBtZWNoYW5pc20gb2YgY291cnNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJhdXRoLW1lY2hhbmlzbXMtc2hhIj4KKyAgICAgICAgPHRpdGxlPkRCVVNfQ09PS0lFX1NIQTE8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20gaXMgZGVzaWduZWQgdG8gZXN0YWJsaXNoIHRoYXQgYSBjbGllbnQKKyAgICAgICAgICBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBhIHByaXZhdGUgZmlsZSBvd25lZCBieSB0aGUgdXNlciBiZWluZworICAgICAgICAgIGF1dGhlbnRpY2F0ZWQuIElmIHRoZSBjbGllbnQgY2FuIHByb3ZlIHRoYXQgaXQgaGFzIGFjY2VzcyB0byBhIHNlY3JldAorICAgICAgICAgIGNvb2tpZSBzdG9yZWQgaW4gdGhpcyBmaWxlLCB0aGVuIHRoZSBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4gCisgICAgICAgICAgVGh1cyB0aGUgc2VjdXJpdHkgb2YgREJVU19DT09LSUVfU0hBMSBkZXBlbmRzIG9uIGEgc2VjdXJlIGhvbWUgCisgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRocm91Z2hvdXQgdGhpcyBkZXNjcmlwdGlvbiwgImhleCBlbmNvZGluZyIgbXVzdCBvdXRwdXQgdGhlIGRpZ2l0cworICAgICAgICAgIGZyb20gYSB0byBmIGluIGxvd2VyLWNhc2U7IHRoZSBkaWdpdHMgQSB0byBGIG11c3Qgbm90IGJlIHVzZWQKKyAgICAgICAgICBpbiB0aGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXV0aGVudGljYXRpb24gcHJvY2VlZHMgYXMgZm9sbG93czoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY2xpZW50IHNlbmRzIHRoZSB1c2VybmFtZSBpdCB3b3VsZCBsaWtlIHRvIGF1dGhlbnRpY2F0ZSAKKyAgICAgICAgICAgICAgICBhcywgaGV4LWVuY29kZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzZXJ2ZXIgc2VuZHMgdGhlIG5hbWUgb2YgaXRzICJjb29raWUgY29udGV4dCIgKHNlZSBiZWxvdyk7IGEKKyAgICAgICAgICAgICAgICBzcGFjZSBjaGFyYWN0ZXI7IHRoZSBpbnRlZ2VyIElEIG9mIHRoZSBzZWNyZXQgY29va2llIHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICBtdXN0IGRlbW9uc3RyYXRlIGtub3dsZWRnZSBvZjsgYSBzcGFjZSBjaGFyYWN0ZXI7IHRoZW4gYQorICAgICAgICAgICAgICAgIHJhbmRvbWx5LWdlbmVyYXRlZCBjaGFsbGVuZ2Ugc3RyaW5nLCBhbGwgb2YgdGhpcyBoZXgtZW5jb2RlZCBpbnRvCisgICAgICAgICAgICAgICAgb25lLCBzaW5nbGUgc3RyaW5nLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY2xpZW50IGxvY2F0ZXMgdGhlIGNvb2tpZSBhbmQgZ2VuZXJhdGVzIGl0cyBvd24KKyAgICAgICAgICAgICAgICByYW5kb21seS1nZW5lcmF0ZWQgY2hhbGxlbmdlIHN0cmluZy4gVGhlIGNsaWVudCB0aGVuIGNvbmNhdGVuYXRlcworICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBkZWNvZGVkIGNoYWxsZW5nZSwgYSAiOiIgY2hhcmFjdGVyLCBpdHMgb3duIGNoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICBhbm90aGVyICI6IiBjaGFyYWN0ZXIsIGFuZCB0aGUgY29va2llLiBJdCBjb21wdXRlcyB0aGUgU0hBLTEgaGFzaAorICAgICAgICAgICAgICAgIG9mIHRoaXMgY29tcG9zaXRlIHN0cmluZyBhcyBhIGhleCBkaWdlc3QuIEl0IGNvbmNhdGVuYXRlcyB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQncyBjaGFsbGVuZ2Ugc3RyaW5nLCBhIHNwYWNlIGNoYXJhY3RlciwgYW5kIHRoZSBTSEEtMSBoZXgKKyAgICAgICAgICAgICAgICBkaWdlc3QsIGhleC1lbmNvZGVzIHRoZSByZXN1bHQgYW5kIHNlbmRzIGl0IGJhY2sgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNlcnZlciBnZW5lcmF0ZXMgdGhlIHNhbWUgY29uY2F0ZW5hdGVkIHN0cmluZyB1c2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCBhbmQgY29tcHV0ZXMgaXRzIFNIQS0xIGhhc2guIEl0IGNvbXBhcmVzIHRoZSBoYXNoIHdpdGgKKyAgICAgICAgICAgICAgICB0aGUgaGFzaCByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQ7IGlmIHRoZSB0d28gaGFzaGVzIG1hdGNoLCB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFYWNoIHNlcnZlciBoYXMgYSAiY29va2llIGNvbnRleHQsIiB3aGljaCBpcyBhIG5hbWUgdGhhdCBpZGVudGlmaWVzIGEKKyAgICAgICAgICBzZXQgb2YgY29va2llcyB0aGF0IGFwcGx5IHRvIHRoYXQgc2VydmVyLiBBIHNhbXBsZSBjb250ZXh0IG1pZ2h0IGJlCisgICAgICAgICAgIm9yZ19mcmVlZGVza3RvcF9zZXNzaW9uX2J1cyIuIENvbnRleHQgbmFtZXMgbXVzdCBiZSB2YWxpZCBBU0NJSSwKKyAgICAgICAgICBub256ZXJvIGxlbmd0aCwgYW5kIG1heSBub3QgY29udGFpbiB0aGUgY2hhcmFjdGVycyBzbGFzaCAoIi8iKSwKKyAgICAgICAgICBiYWNrc2xhc2ggKCJcIiksIHNwYWNlICgiICIpLCBuZXdsaW5lICgiXG4iKSwgY2FycmlhZ2UgcmV0dXJuICgiXHIiKSwKKyAgICAgICAgICB0YWIgKCJcdCIpLCBvciBwZXJpb2QgKCIuIikuIFRoZXJlIGlzIGEgZGVmYXVsdCBjb250ZXh0LAorICAgICAgICAgICJvcmdfZnJlZWRlc2t0b3BfZ2VuZXJhbCIgdGhhdCdzIHVzZWQgYnkgc2VydmVycyB0aGF0IGRvIG5vdCBzcGVjaWZ5CisgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvb2tpZXMgYXJlIHN0b3JlZCBpbiBhIHVzZXIncyBob21lIGRpcmVjdG9yeSwgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgIDxmaWxlbmFtZT5+Ly5kYnVzLWtleXJpbmdzLzwvZmlsZW5hbWU+LiBUaGlzIGRpcmVjdG9yeSBtdXN0IAorICAgICAgICAgIG5vdCBiZSByZWFkYWJsZSBvciB3cml0YWJsZSBieSBvdGhlciB1c2Vycy4gSWYgaXQgaXMsIAorICAgICAgICAgIGNsaWVudHMgYW5kIHNlcnZlcnMgbXVzdCBpZ25vcmUgaXQuIFRoZSBkaXJlY3RvcnkgCisgICAgICAgICAgY29udGFpbnMgY29va2llIGZpbGVzIG5hbWVkIGFmdGVyIHRoZSBjb29raWUgY29udGV4dC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIGNvb2tpZSBmaWxlIGNvbnRhaW5zIG9uZSBjb29raWUgcGVyIGxpbmUuIEVhY2ggbGluZSAKKyAgICAgICAgICBoYXMgdGhyZWUgc3BhY2Utc2VwYXJhdGVkIGZpZWxkczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llIElEIG51bWJlciwgd2hpY2ggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFuZAorICAgICAgICAgICAgICAgIG1heSBub3QgYmUgdXNlZCB0d2ljZSBpbiB0aGUgc2FtZSBmaWxlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llJ3MgY3JlYXRpb24gdGltZSwgaW4gVU5JWCBzZWNvbmRzLXNpbmNlLXRoZS1lcG9jaAorICAgICAgICAgICAgICAgIGZvcm1hdC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNvb2tpZSBpdHNlbGYsIGEgaGV4LWVuY29kZWQgcmFuZG9tIGJsb2NrIG9mIGJ5dGVzLiBUaGUgY29va2llCisgICAgICAgICAgICAgICAgbWF5IGJlIG9mIGFueSBsZW5ndGgsIHRob3VnaCBvYnZpb3VzbHkgc2VjdXJpdHkgaW5jcmVhc2VzIAorICAgICAgICAgICAgICAgIGFzIHRoZSBsZW5ndGggaW5jcmVhc2VzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9ubHkgc2VydmVyIHByb2Nlc3NlcyBtb2RpZnkgdGhlIGNvb2tpZSBmaWxlLgorICAgICAgICAgIFRoZXkgbXVzdCBkbyBzbyB3aXRoIHRoaXMgcHJvY2VkdXJlOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENyZWF0ZSBhIGxvY2tmaWxlIG5hbWUgYnkgYXBwZW5kaW5nICIubG9jayIgdG8gdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgY29va2llIGZpbGUuICBUaGUgc2VydmVyIHNob3VsZCBhdHRlbXB0IHRvIGNyZWF0ZSB0aGlzIGZpbGUKKyAgICAgICAgICAgICAgICB1c2luZyA8bGl0ZXJhbD5PX0NSRUFUIHwgT19FWENMPC9saXRlcmFsPi4gIElmIGZpbGUgY3JlYXRpb24KKyAgICAgICAgICAgICAgICBmYWlscywgdGhlIGxvY2sgZmFpbHMuIFNlcnZlcnMgc2hvdWxkIHJldHJ5IGZvciBhIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICBwZXJpb2Qgb2YgdGltZSwgdGhlbiB0aGV5IG1heSBjaG9vc2UgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGxvY2sKKyAgICAgICAgICAgICAgICB0byBrZWVwIHVzZXJzIGZyb20gaGF2aW5nIHRvIG1hbnVhbGx5IGRlbGV0ZSBhIHN0YWxlCisgICAgICAgICAgICAgICAgbG9jay4gPGZvb3Rub3RlPjxwYXJhPkxvY2tmaWxlcyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHJlYWwgZmlsZQorICAgICAgICAgICAgICAgIGxvY2tpbmcgPGxpdGVyYWw+ZmNudGwoKTwvbGl0ZXJhbD4gYmVjYXVzZSByZWFsIGxvY2tpbmcKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgYXJlIHN0aWxsIGZsYWt5IG9uIG5ldHdvcmsKKyAgICAgICAgICAgICAgICBmaWxlc3lzdGVtcy48L3BhcmE+PC9mb290bm90ZT4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT25jZSB0aGUgbG9ja2ZpbGUgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIHNlcnZlciBsb2FkcyB0aGUgY29va2llCisgICAgICAgICAgICAgICAgZmlsZS4gSXQgc2hvdWxkIHRoZW4gZGVsZXRlIGFueSBjb29raWVzIHRoYXQgYXJlIG9sZCAodGhlCisgICAgICAgICAgICAgICAgdGltZW91dCBjYW4gYmUgZmFpcmx5IHNob3J0KSwgb3IgbW9yZSB0aGFuIGEgcmVhc29uYWJsZQorICAgICAgICAgICAgICAgIHRpbWUgaW4gdGhlIGZ1dHVyZSAoc28gdGhhdCBjb29raWVzIG5ldmVyIGFjY2lkZW50YWxseSAKKyAgICAgICAgICAgICAgICBiZWNvbWUgcGVybWFuZW50LCBpZiB0aGUgY2xvY2sgd2FzIHNldCBmYXIgaW50byB0aGUgZnV0dXJlIAorICAgICAgICAgICAgICAgIGF0IHNvbWUgcG9pbnQpLiBJZiBubyByZWNlbnQga2V5cyByZW1haW4sIHRoZSAKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgbWF5IGdlbmVyYXRlIGEgbmV3IGtleS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHBydW5lZCBhbmQgcG9zc2libHkgYWRkZWQtdG8gY29va2llIGZpbGUgCisgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNhdmVkIGF0b21pY2FsbHkgKHVzaW5nIGEgdGVtcG9yYXJ5IAorICAgICAgICAgICAgICAgIGZpbGUgd2hpY2ggaXMgcmVuYW1lKCknZCkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBsb2NrIG11c3QgYmUgZHJvcHBlZCBieSBkZWxldGluZyB0aGUgbG9ja2ZpbGUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ2xpZW50cyBuZWVkIG5vdCBsb2NrIHRoZSBmaWxlIGluIG9yZGVyIHRvIGxvYWQgaXQsIAorICAgICAgICAgIGJlY2F1c2Ugc2VydmVycyBhcmUgcmVxdWlyZWQgdG8gc2F2ZSB0aGUgZmlsZSBhdG9taWNhbGx5LiAgICAgICAgICAKKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImFkZHJlc3NlcyI+CisgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzZXM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU2VydmVyIGFkZHJlc3NlcyBjb25zaXN0IG9mIGEgdHJhbnNwb3J0IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYW5kCisgICAgICB0aGVuIGFuIG9wdGlvbmFsLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGZvcm0ga2V5PXZhbHVlLgorICAgICAgRWFjaCB2YWx1ZSBpcyBlc2NhcGVkLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEZvciBleGFtcGxlOiAKKyAgICAgIDxwcm9ncmFtbGlzdGluZz51bml4OnBhdGg9L3RtcC9kYnVzLXRlc3Q8L3Byb2dyYW1saXN0aW5nPgorICAgICAgV2hpY2ggaXMgdGhlIGFkZHJlc3MgdG8gYSB1bml4IHNvY2tldCB3aXRoIHRoZSBwYXRoIC90bXAvZGJ1cy10ZXN0LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFZhbHVlIGVzY2FwaW5nIGlzIHNpbWlsYXIgdG8gVVJJIGVzY2FwaW5nIGJ1dCBzaW1wbGVyLgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHNldCBvZiBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgaXM6CisgICAgICAgICAgICA8bGl0ZXJhbD5bMC05QS1aYS16Xy0vLlxdPC9saXRlcmFsPi4gVG8gZXNjYXBlLCBlYWNoCisgICAgICAgICAgICA8ZW1waGFzaXM+Ynl0ZTwvZW1waGFzaXM+IChub3RlLCBub3QgY2hhcmFjdGVyKSB3aGljaCBpcyBub3QgaW4gdGhlCisgICAgICAgICAgICBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBU0NJSQorICAgICAgICAgICAgcGVyY2VudCAoPGxpdGVyYWw+JTwvbGl0ZXJhbD4pIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGJ5dGUgaW4gaGV4LgorICAgICAgICAgICAgVGhlIGhleCB2YWx1ZSBtdXN0IGFsd2F5cyBiZSB0d28gZGlnaXRzLCBldmVuIGlmIHRoZSBmaXJzdCBkaWdpdCBpcworICAgICAgICAgICAgemVyby4gVGhlIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBtYXkgYmUgZXNjYXBlZCBpZiBkZXNpcmVkLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gdW5lc2NhcGUsIGFwcGVuZCBlYWNoIGJ5dGUgaW4gdGhlIHZhbHVlOyBpZiBhIGJ5dGUgaXMgYW4gQVNDSUkKKyAgICAgICAgICAgIHBlcmNlbnQgKDxsaXRlcmFsPiU8L2xpdGVyYWw+KSBjaGFyYWN0ZXIgdGhlbiBhcHBlbmQgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgaGV4IHZhbHVlIGluc3RlYWQuIEl0IGlzIGFuIGVycm9yIGlmIGEgPGxpdGVyYWw+JTwvbGl0ZXJhbD4gYnl0ZQorICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSB0d28gaGV4IGRpZ2l0cyBmb2xsb3dpbmcuIEl0IGlzIGFuIGVycm9yIGlmIGEKKyAgICAgICAgICAgIG5vbi1vcHRpb25hbGx5LWVzY2FwZWQgYnl0ZSBpcyBzZWVuIHVuZXNjYXBlZC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIFRoZSBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIGlzIGludGVuZGVkIHRvIHByZXNlcnZlIGFkZHJlc3MgCisgICAgICByZWFkYWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBIHNlcnZlciBtYXkgc3BlY2lmeSBhIGtleS12YWx1ZSBwYWlyIHdpdGggdGhlIGtleSA8bGl0ZXJhbD5ndWlkPC9saXRlcmFsPgorICAgICAgYW5kIHRoZSB2YWx1ZSBhIGhleC1lbmNvZGVkIDE2LWJ5dGUgc2VxdWVuY2UuIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+CisgICAgICBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgPGxpdGVyYWw+Z3VpZDwvbGl0ZXJhbD4gZmllbGQuICBJZiBwcmVzZW50LAorICAgICAgdGhpcyBVVUlEIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIG9uZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIGFub3RoZXIuIEEKKyAgICAgIHNlcnZlciBzaG91bGQgdXNlIGEgZGlmZmVyZW50IFVVSUQgZm9yIGVhY2ggYWRkcmVzcyBpdCBsaXN0ZW5zIG9uLiBGb3IKKyAgICAgIGV4YW1wbGUsIGlmIGEgbWVzc2FnZSBidXMgZGFlbW9uIG9mZmVycyBib3RoIFVOSVggZG9tYWluIHNvY2tldCBhbmQgVENQCisgICAgICBjb25uZWN0aW9ucywgYnV0IHRyZWF0cyBjbGllbnRzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgY29ubmVjdCwKKyAgICAgIHRob3NlIHR3byBjb25uZWN0aW9ucyBhcmUgZXF1aXZhbGVudCBwb3N0LWNvbm5lY3Rpb24gYnV0IHNob3VsZCBoYXZlCisgICAgICBkaXN0aW5jdCBVVUlEcyB0byBkaXN0aW5ndWlzaCB0aGUga2luZHMgb2YgY29ubmVjdGlvbi4KKyAgICA8L3BhcmE+CisgICAgCisgICAgPHBhcmE+CisgICAgICBUaGUgaW50ZW50IG9mIHRoZSBhZGRyZXNzIFVVSUQgZmVhdHVyZSBpcyB0byBhbGxvdyBhIGNsaWVudCB0byBhdm9pZAorICAgICAgb3BlbmluZyBtdWx0aXBsZSBpZGVudGljYWwgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgc2VydmVyLCBieSBhbGxvd2luZyB0aGUKKyAgICAgIGNsaWVudCB0byBjaGVjayB3aGV0aGVyIGFuIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gYW4gYWxyZWFkeS1leGlzdGluZworICAgICAgY29ubmVjdGlvbi4gIENvbXBhcmluZyB0d28gYWRkcmVzc2VzIGlzIGluc3VmZmljaWVudCwgYmVjYXVzZSBhZGRyZXNzZXMKKyAgICAgIGNhbiBiZSByZWN5Y2xlZCBieSBkaXN0aW5jdCBzZXJ2ZXJzLCBhbmQgZXF1aXZhbGVudCBhZGRyZXNzZXMgbWF5IGxvb2sKKyAgICAgIGRpZmZlcmVudCBpZiBzaW1wbHkgY29tcGFyZWQgYXMgc3RyaW5ncyAoZm9yIGV4YW1wbGUsIHRoZSBob3N0IGluIGEgVENQCisgICAgICBhZGRyZXNzIGNhbiBiZSBnaXZlbiBhcyBhbiBJUCBhZGRyZXNzIG9yIGFzIGEgaG9zdG5hbWUpLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGtleSBpcyA8bGl0ZXJhbD5ndWlkPC9saXRlcmFsPiBldmVuIHRob3VnaCB0aGUgCisgICAgICByZXN0IG9mIHRoZSBBUEkgYW5kIGRvY3VtZW50YXRpb24gc2F5cyAiVVVJRCwiIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBbRklYTUUgY2xhcmlmeSBpZiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gZWFjaCBpcyBhIHJlcXVpcmVtZW50IAorICAgICAgb3IganVzdCBhIHN1Z2dlc3Rpb25dCisgICAgICBXaGVuIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIsIG11bHRpcGxlIHNlcnZlciBhZGRyZXNzZXMgY2FuIGJlCisgICAgICBzZXBhcmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiBUaGUgbGlicmFyeSB3aWxsIHRoZW4gdHJ5IHRvIGNvbm5lY3QKKyAgICAgIHRvIHRoZSBmaXJzdCBhZGRyZXNzIGFuZCBpZiB0aGF0IGZhaWxzLCBpdCdsbCB0cnkgdG8gY29ubmVjdCB0bworICAgICAgdGhlIG5leHQgb25lIHNwZWNpZmllZCwgYW5kIHNvIGZvcnRoLiBGb3IgZXhhbXBsZQorICAgICAgPHByb2dyYW1saXN0aW5nPnVuaXg6cGF0aD0vdG1wL2RidXMtdGVzdDt1bml4OnBhdGg9L3RtcC9kYnVzLXRlc3QyPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFNvbWUgYWRkcmVzc2VzIGFyZSA8Zmlyc3R0ZXJtPmNvbm5lY3RhYmxlPC9maXJzdHRlcm0+LiBBIGNvbm5lY3RhYmxlCisgICAgICBhZGRyZXNzIGlzIG9uZSBjb250YWluaW5nIGVub3VnaCBpbmZvcm1hdGlvbiBmb3IgYSBjbGllbnQgdG8gY29ubmVjdAorICAgICAgdG8gaXQuIEZvciBpbnN0YW5jZSwgPGxpdGVyYWw+dGNwOmhvc3Q9MTI3LjAuMC4xLHBvcnQ9NDI0MjwvbGl0ZXJhbD4KKyAgICAgIGlzIGEgY29ubmVjdGFibGUgYWRkcmVzcy4gSXQgaXMgbm90IG5lY2Vzc2FyaWx5IHBvc3NpYmxlIHRvIGxpc3RlbgorICAgICAgb24gZXZlcnkgY29ubmVjdGFibGUgYWRkcmVzczogZm9yIGluc3RhbmNlLCBpdCBpcyBub3QgcG9zc2libGUgdG8KKyAgICAgIGxpc3RlbiBvbiBhIDxsaXRlcmFsPnVuaXhleGVjOjwvbGl0ZXJhbD4gYWRkcmVzcy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFNvbWUgYWRkcmVzc2VzIGFyZSA8Zmlyc3R0ZXJtPmxpc3RlbmFibGU8L2ZpcnN0dGVybT4uIEEgbGlzdGVuYWJsZQorICAgICAgYWRkcmVzcyBpcyBvbmUgY29udGFpbmluZyBlbm91Z2ggaW5mb3JtYXRpb24gZm9yIGEgc2VydmVyIHRvIGxpc3RlbiBvbgorICAgICAgaXQsIHByb2R1Y2luZyBhIGNvbm5lY3RhYmxlIGFkZHJlc3MgKHdoaWNoIG1heSBkaWZmZXIgZnJvbSB0aGUKKyAgICAgIG9yaWdpbmFsIGFkZHJlc3MpLiBNYW55IGxpc3RlbmFibGUgYWRkcmVzc2VzIGFyZSBub3QgY29ubmVjdGFibGU6CisgICAgICBmb3IgaW5zdGFuY2UsIDxsaXRlcmFsPnRjcDpob3N0PTEyNy4wLjAuMTwvbGl0ZXJhbD4KKyAgICAgIGlzIGxpc3RlbmFibGUsIGJ1dCBub3QgY29ubmVjdGFibGUgKGJlY2F1c2UgaXQgZG9lcyBub3Qgc3BlY2lmeQorICAgICAgYSBwb3J0IG51bWJlcikuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBMaXN0ZW5pbmcgb24gYW4gYWRkcmVzcyB0aGF0IGlzIG5vdCBjb25uZWN0YWJsZSB3aWxsIHJlc3VsdCBpbiBhCisgICAgICBjb25uZWN0YWJsZSBhZGRyZXNzIHRoYXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBsaXN0ZW5hYmxlIGFkZHJlc3MuCisgICAgICBGb3IgaW5zdGFuY2UsIGxpc3RlbmluZyBvbiA8bGl0ZXJhbD50Y3A6aG9zdD0xMjcuMC4wLjE8L2xpdGVyYWw+CisgICAgICBtaWdodCByZXN1bHQgaW4gdGhlIGNvbm5lY3RhYmxlIGFkZHJlc3MKKyAgICAgIDxsaXRlcmFsPnRjcDpob3N0PTEyNy4wLjAuMSxwb3J0PTMwOTU4PC9saXRlcmFsPiwKKyAgICAgIGxpc3RlbmluZyBvbiA8bGl0ZXJhbD51bml4OnRtcGRpcj0vdG1wPC9saXRlcmFsPgorICAgICAgbWlnaHQgcmVzdWx0IGluIHRoZSBjb25uZWN0YWJsZSBhZGRyZXNzCisgICAgICA8bGl0ZXJhbD51bml4OmFic3RyYWN0PS90bXAvZGJ1cy1VOE9TZG1mNzwvbGl0ZXJhbD4sIG9yCisgICAgICBsaXN0ZW5pbmcgb24gPGxpdGVyYWw+dW5peDpydW50aW1lPXllczwvbGl0ZXJhbD4KKyAgICAgIG1pZ2h0IHJlc3VsdCBpbiB0aGUgY29ubmVjdGFibGUgYWRkcmVzcworICAgICAgPGxpdGVyYWw+dW5peDpwYXRoPS9ydW4vdXNlci8xMjM0L2J1czwvbGl0ZXJhbD4uCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorICAKKyAgPHNlY3QxIGlkPSJ0cmFuc3BvcnRzIj4KKyAgICA8dGl0bGU+VHJhbnNwb3J0czwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBbRklYTUUgd2UgbmVlZCB0byBzcGVjaWZ5IGluIGRldGFpbCBlYWNoIHRyYW5zcG9ydCBhbmQgaXRzIHBvc3NpYmxlIGFyZ3VtZW50c10KKyAgICAKKyAgICAgIEN1cnJlbnQgdHJhbnNwb3J0cyBpbmNsdWRlOiB1bml4IGRvbWFpbiBzb2NrZXRzIChpbmNsdWRpbmcgCisgICAgICBhYnN0cmFjdCBuYW1lc3BhY2Ugb24gbGludXgpLCBsYXVuY2hkLCBzeXN0ZW1kLCBUQ1AvSVAsIGFuIGV4ZWN1dGVkIHN1YnByb2Nlc3MgYW5kIGEgZGVidWcvdGVzdGluZyB0cmFuc3BvcnQKKyAgICAgIHVzaW5nIGluLXByb2Nlc3MgcGlwZXMuIEZ1dHVyZSBwb3NzaWJsZSB0cmFuc3BvcnRzIGluY2x1ZGUgb25lIHRoYXQKKyAgICAgIHR1bm5lbHMgb3ZlciBYMTEgcHJvdG9jb2wuCisgICAgPC9wYXJhPgorICAKKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cyI+CisgICAgICA8dGl0bGU+VW5peCBEb21haW4gU29ja2V0czwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW5peCBkb21haW4gc29ja2V0cyBjYW4gYmUgZWl0aGVyIHBhdGhzIGluIHRoZSBmaWxlIHN5c3RlbSBvciBvbiBMaW51eCAKKyAgICAgICAga2VybmVscywgdGhleSBjYW4gYmUgYWJzdHJhY3Qgd2hpY2ggYXJlIHNpbWlsYXIgdG8gcGF0aHMgYnV0CisgICAgICAgIGRvIG5vdCBzaG93IHVwIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gYSBzb2NrZXQgaXMgb3BlbmVkIGJ5IHRoZSBELUJ1cyBsaWJyYXJ5IGl0IHRydW5jYXRlcyB0aGUgcGF0aCAKKyAgICAgICAgbmFtZSByaWdodCBiZWZvcmUgdGhlIGZpcnN0IHRyYWlsaW5nIE51bCBieXRlLiAgVGhpcyBpcyB0cnVlIGZvciBib3RoCisgICAgICAgIG5vcm1hbCBwYXRocyBhbmQgYWJzdHJhY3QgcGF0aHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhIGRlcGFydHVyZSBmcm9tCisgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIEQtQnVzIHRoYXQgd291bGQgY3JlYXRlIHNvY2tldHMgd2l0aCBhIGZpeGVkCisgICAgICAgIGxlbmd0aCBwYXRoIG5hbWUuICBOYW1lcyB3aGljaCB3ZXJlIHNob3J0ZXIgdGhhbiB0aGUgZml4ZWQgbGVuZ3RoCisgICAgICAgIHdvdWxkIGJlIHBhZGRlZCBieSBOdWwgYnl0ZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW5peCBkb21haW4gc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXggYWRkcmVzc2VzIHRoYXQgc3BlY2lmeSA8bGl0ZXJhbD5wYXRoPC9saXRlcmFsPiBvcgorICAgICAgICA8bGl0ZXJhbD5hYnN0cmFjdDwvbGl0ZXJhbD4gYXJlIGJvdGggbGlzdGVuYWJsZSBhbmQgY29ubmVjdGFibGUuCisgICAgICAgIFVuaXggYWRkcmVzc2VzIHRoYXQgc3BlY2lmeSA8bGl0ZXJhbD50bXBkaXI8L2xpdGVyYWw+IGFyZSBvbmx5CisgICAgICAgIGxpc3RlbmFibGU6IHRoZSBjb3JyZXNwb25kaW5nIGNvbm5lY3RhYmxlIGFkZHJlc3Mgd2lsbCBzcGVjaWZ5CisgICAgICAgIGVpdGhlciA8bGl0ZXJhbD5wYXRoPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5hYnN0cmFjdDwvbGl0ZXJhbD4uCisgICAgICAgIFNpbWlsYXJseSwgVW5peCBhZGRyZXNzZXMgdGhhdCBzcGVjaWZ5IDxsaXRlcmFsPnJ1bnRpbWU8L2xpdGVyYWw+CisgICAgICAgIGFyZSBvbmx5IGxpc3RlbmFibGUsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0YWJsZSBhZGRyZXNzCisgICAgICAgIHdpbGwgc3BlY2lmeSA8bGl0ZXJhbD5wYXRoPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy11bml4LWRvbWFpbi1zb2NrZXRzLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4gCisgICAgICAgICAgVW5peCBkb21haW4gc29ja2V0IGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInVuaXg6IiBwcmVmaXggCisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+cGF0aDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQuIElmIHNldCwgdGhlICJ0bXBkaXIiIGFuZCAiYWJzdHJhY3QiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnRtcGRpcjwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT50ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHdoaWNoIGEgc29ja2V0IGZpbGUgd2l0aCBhIHJhbmRvbSBmaWxlIG5hbWUgc3RhcnRpbmcgd2l0aCAnZGJ1cy0nIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgc2VydmVyLiBUaGlzIGtleSBjYW4gb25seSBiZSB1c2VkIGluIHNlcnZlciBhZGRyZXNzZXMsIG5vdCBpbiBjbGllbnQgYWRkcmVzc2VzLiBJZiBzZXQsIHRoZSAicGF0aCIgYW5kICJhYnN0cmFjdCIga2V5IG11c3Qgbm90IGJlIHNldC48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+YWJzdHJhY3Q8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT51bmlxdWUgc3RyaW5nIChwYXRoKSBpbiB0aGUgYWJzdHJhY3QgbmFtZXNwYWNlLiBJZiBzZXQsIHRoZSAicGF0aCIgb3IgInRtcGRpciIga2V5IG11c3Qgbm90IGJlIHNldC4gVGhpcyBrZXkgaXMgb25seSBzdXBwb3J0ZWQgb24gcGxhdGZvcm1zIHdpdGggImFic3RyYWN0IFVuaXggc29ja2V0cyIsIG9mIHdoaWNoIExpbnV4IGlzIHRoZSBvbmx5IGtub3duIGV4YW1wbGUuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnJ1bnRpbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnllczwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PklmIGdpdmVuLCBUaGlzIGtleSBjYW4gb25seSBiZSB1c2VkIGluIHNlcnZlciBhZGRyZXNzZXMsIG5vdCBpbiBjbGllbnQgYWRkcmVzc2VzLiBJZiBzZXQsIGl0cyB2YWx1ZSBtdXN0IGJlIDxsaXRlcmFsPnllczwvbGl0ZXJhbD4uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gYW4gYWRkcmVzcyBzdHJpbmcgbGlrZSA8bGl0ZXJhbD51bml4OnJ1bnRpbWU9eWVzO3VuaXg6dG1wZGlyPS90bXA8L2xpdGVyYWw+IHNvIHRoYXQgdGhlcmUgY2FuIGJlIGEgZmFsbGJhY2sgaWYgPGxpdGVyYWw+WERHX1JVTlRJTUVfRElSPC9saXRlcmFsPiBpcyBub3Qgc2V0LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIEV4YWN0bHkgb25lIG9mIHRoZSBrZXlzIDxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+LAorICAgICAgICAgPGxpdGVyYWw+YWJzdHJhY3Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD5ydW50aW1lPC9saXRlcmFsPiBvcgorICAgICAgICAgPGxpdGVyYWw+dG1wZGlyPC9saXRlcmFsPiBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtbGF1bmNoZCI+CisgICAgICA8dGl0bGU+bGF1bmNoZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgbGF1bmNoZCBpcyBhbiBvcGVuLXNvdXJjZSBzZXJ2ZXIgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCByZXBsYWNlcyBpbml0LCBpbmV0ZAorICAgICAgICBhbmQgY3JvbiBvbiBBcHBsZSBNYWMgT1MgWCB2ZXJzaW9ucyAxMC40IGFuZCBhYm92ZS4gSXQgcHJvdmlkZXMgYSBjb21tb24gc2Vzc2lvbgorICAgICAgICBidXMgYWRkcmVzcyBmb3IgZWFjaCB1c2VyIGFuZCBkZXByZWNhdGVzIHRoZSBYMTEtZW5hYmxlZCBELUJ1cyBsYXVuY2hlciBvbiBPU1guCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBsYXVuY2hkIGFsbG9jYXRlcyBhIHNvY2tldCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgdW5peCBwYXRoIHRocm91Z2ggdGhlCisgICAgICAgIERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQgdmFyaWFibGUgaW4gbGF1bmNoZCdzIGVudmlyb25tZW50LiBFdmVyeSBwcm9jZXNzCisgICAgICAgIHNwYXduZWQgYnkgbGF1bmNoZCAob3IgZGJ1cy1kYWVtb24sIGlmIGl0IHdhcyBzdGFydGVkIGJ5IGxhdW5jaGQpIGNhbiBhY2Nlc3MKKyAgICAgICAgaXQgdGhyb3VnaCBpdHMgZW52aXJvbm1lbnQuCisgICAgICAgIE90aGVyIHByb2Nlc3NlcyBjYW4gcXVlcnkgZm9yIHRoZSBsYXVuY2hkIHNvY2tldCBieSBleGVjdXRpbmc6CisgICAgICAgICQgbGF1bmNoY3RsIGdldGVudiBEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUCisgICAgICAgIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgc28gZG9lc24ndCBoYXZlIHRvIGJlIGRvbmUKKyAgICAgICAgbWFudWFsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgbGF1bmNoZCBpcyBub3QgYXZhaWxhYmxlIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIGxhdW5jaGQgYWRkcmVzc2VzIGFyZSBsaXN0ZW5hYmxlIGFuZCBjb25uZWN0YWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy1sYXVuY2hkLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBsYXVuY2hkIGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgImxhdW5jaGQ6IiBwcmVmaXgKKyAgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5lbnY8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihlbnZpcm9ubWVudCB2YXJpYWJsZSk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PnBhdGggb2YgdGhlIHVuaXggZG9tYWluIHNvY2tldCBmb3IgdGhlIGxhdW5jaGQgY3JlYXRlZCBkYnVzLWRhZW1vbi48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBUaGUgPGxpdGVyYWw+ZW52PC9saXRlcmFsPiBrZXkgaXMgcmVxdWlyZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1zeXN0ZW1kIj4KKyAgICAgIDx0aXRsZT5zeXN0ZW1kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBzeXN0ZW1kIGlzIGFuIG9wZW4tc291cmNlIHNlcnZlciBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0CisgICAgICAgIHJlcGxhY2VzIGluaXQgYW5kIGluZXRkIG9uIG5ld2VyIExpbnV4IHN5c3RlbXMuIEl0IHN1cHBvcnRzCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uLiBUaGUgRC1CdXMgc3lzdGVtZCB0cmFuc3BvcnQgaXMgdXNlZCB0byBhY3F1aXJlCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uIGZpbGUgZGVzY3JpcHRvcnMgZnJvbSBzeXN0ZW1kIGFuZCB1c2UgdGhlbQorICAgICAgICBhcyBELUJ1cyB0cmFuc3BvcnQgd2hlbiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHNwYXduZWQgYnkKKyAgICAgICAgc29ja2V0IGFjdGl2YXRpb24gZnJvbSBpdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgYWNjZXB0cyBvbmx5IG9uZSBvciBtb3JlIFVuaXggZG9tYWluIG9yCisgICAgICAgIFRDUCBzdHJlYW1zIHNvY2tldHMgcGFzc2VkIGluIHZpYSBzb2NrZXQgYWN0aXZhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZSBvbiBub24tTGludXggb3BlcmF0aW5nIHN5c3RlbXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHN5c3RlbWQgdHJhbnNwb3J0IGRlZmluZXMgbm8gcGFyYW1ldGVyIGtleXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgc3lzdGVtZCBhZGRyZXNzZXMgYXJlIGxpc3RlbmFibGUsIGJ1dCBub3QgY29ubmVjdGFibGUuIFRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIGNvbm5lY3RhYmxlIGFkZHJlc3MgaXMgdGhlIDxsaXRlcmFsPnVuaXg8L2xpdGVyYWw+CisgICAgICAgIG9yIDxsaXRlcmFsPnRjcDwvbGl0ZXJhbD4gYWRkcmVzcyBvZiB0aGUgc29ja2V0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJ0cmFuc3BvcnRzLXRjcC1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5UQ1AgU29ja2V0czwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHRjcCB0cmFuc3BvcnQgcHJvdmlkZXMgVENQL0lQIGJhc2VkIGNvbm5lY3Rpb25zIGJldHdlZW4gY2xpZW50cworICAgICAgICBsb2NhdGVkIG9uIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBob3N0cy4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVXNpbmcgdGNwIHRyYW5zcG9ydCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHNlY3VyZSBhdXRoZW50aWZpY2F0aW9uIG1lY2hhbmlzbXVzIAorICAgICAgICBvdmVyIGEgbmV0d29yayBpcyB1bnNlY3VyZS4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4gIAorICAgICAgICBPbiBXaW5kb3dzIGFuZCBtb3N0IFVuaXggcGxhdGZvcm1zLCB0aGUgVENQIHN0YWNrIGlzIHVuYWJsZSB0byB0cmFuc2ZlcgorICAgICAgICBjcmVkZW50aWFscyBvdmVyIGEgVENQIGNvbm5lY3Rpb24sIHNvIHRoZSBFWFRFUk5BTCBhdXRoZW50aWNhdGlvbgorICAgICAgICBtZWNoYW5pc20gZG9lcyBub3Qgd29yayBmb3IgdGhpcyB0cmFuc3BvcnQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQWxsIDxsaXRlcmFsPnRjcDwvbGl0ZXJhbD4gYWRkcmVzc2VzIGFyZSBsaXN0ZW5hYmxlLgorICAgICAgICA8bGl0ZXJhbD50Y3A8L2xpdGVyYWw+IGFkZHJlc3NlcyBpbiB3aGljaCBib3RoCisgICAgICAgIDxsaXRlcmFsPmhvc3Q8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5wb3J0PC9saXRlcmFsPiBhcmUKKyAgICAgICAgc3BlY2lmaWVkLCBhbmQgPGxpdGVyYWw+cG9ydDwvbGl0ZXJhbD4gaXMgbm9uLXplcm8sCisgICAgICAgIGFyZSBhbHNvIGNvbm5lY3RhYmxlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJ0cmFuc3BvcnRzLXRjcC1zb2NrZXRzLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4gCisgICAgICAgICBUQ1AvSVAgc29ja2V0IGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInRjcDoiIHByZWZpeCAKKyAgICAgICAgIGFuZCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcga2V5L3ZhbHVlIHBhaXJzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+TmFtZTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+VmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pmhvc3Q8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5ETlMgbmFtZSBvciBJUCBhZGRyZXNzPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+YmluZDwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5Vc2VkIGluIGEgbGlzdGVuYWJsZSBhZGRyZXNzIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICBvbiB3aGljaCB0aGUgc2VydmVyIHdpbGwgbGlzdGVuOiBlaXRoZXIgdGhlIElQIGFkZHJlc3Mgb2Ygb25lIG9mCisgICAgICAgICAgICB0aGUgbG9jYWwgbWFjaGluZSdzIGludGVyZmFjZXMgKG1vc3QgY29tbW9ubHkgPGxpdGVyYWw+MTI3LjAuMC4xCisgICAgICAgICAgICA8L2xpdGVyYWw+KSwgb3IgYSBETlMgbmFtZSB0aGF0IHJlc29sdmVzIHRvIG9uZSBvZiB0aG9zZSBJUAorICAgICAgICAgICAgYWRkcmVzc2VzLCBvciAnKicgdG8gbGlzdGVuIG9uIGFsbCBpbnRlcmZhY2VzIHNpbXVsdGFuZW91c2x5LgorICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgdGhlIHNhbWUgdmFsdWUgYXMgImhvc3QiLgorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5wb3J0PC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihudW1iZXIpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PlRoZSB0Y3AgcG9ydCB0aGUgc2VydmVyIHdpbGwgb3Blbi4gQSB6ZXJvIHZhbHVlIGxldCB0aGUgc2VydmVyIAorICAgICAgICAgICAgY2hvb3NlIGEgZnJlZSBwb3J0IHByb3ZpZGVkIGZyb20gdGhlIHVuZGVybGF5aW5nIG9wZXJhdGluZyBzeXN0ZW0uIAorICAgICAgICAgICAgbGliZGJ1cyBpcyBhYmxlIHRvIHJldHJpZXZlIHRoZSByZWFsIHVzZWQgcG9ydCBmcm9tIHRoZSBzZXJ2ZXIuICAKKyAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+ZmFtaWx5PC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PklmIHNldCwgcHJvdmlkZSB0aGUgdHlwZSBvZiBzb2NrZXQgZmFtaWx5IGVpdGhlciAiaXB2NCIgb3IgImlwdjYiLiBJZiB1bnNldCwgdGhlIGZhbWlseSBpcyB1bnNwZWNpZmllZC48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1ub25jZS10Y3Atc29ja2V0cyI+CisgICAgICA8dGl0bGU+Tm9uY2Utc2VjdXJlZCBUQ1AgU29ja2V0czwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG5vbmNlLXRjcCB0cmFuc3BvcnQgcHJvdmlkZXMgYSBzZWN1cmVkIFRDUCB0cmFuc3BvcnQsIHVzaW5nIGEKKyAgICAgICAgc2ltcGxlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSB0byBlbnN1cmUgdGhhdCBvbmx5IGNsaWVudHMgd2l0aCByZWFkCisgICAgICAgIGFjY2VzcyB0byBhIGNlcnRhaW4gbG9jYXRpb24gaW4gdGhlIGZpbGVzeXN0ZW0gY2FuIGNvbm5lY3QgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgVGhlIHNlcnZlciB3cml0ZXMgYSBzZWNyZXQsIHRoZSBub25jZSwgdG8gYSBmaWxlIGFuZCBhbiBpbmNvbWluZyBjbGllbnQKKyAgICAgICAgY29ubmVjdGlvbiBpcyBvbmx5IGFjY2VwdGVkIGlmIHRoZSBjbGllbnQgc2VuZHMgdGhlIG5vbmNlIHJpZ2h0IGFmdGVyCisgICAgICAgIHRoZSBjb25uZWN0LiBUaGUgbm9uY2UgbWVjaGFuaXNtIHJlcXVpcmVzIG5vIHNldHVwIGFuZCBpcyBvcnRob2dvbmFsIHRvCisgICAgICAgIHRoZSBoaWdoZXItbGV2ZWwgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgIEF1dGhlbnRpY2F0aW9uIHNlY3Rpb24uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBPbiBzdGFydCwgdGhlIHNlcnZlciBnZW5lcmF0ZXMgYSByYW5kb20gMTYgYnl0ZSBub25jZSBhbmQgd3JpdGVzIGl0CisgICAgICAgIHRvIGEgZmlsZSBpbiB0aGUgdXNlcidzIHRlbXBvcmFyeSBkaXJlY3RvcnkuIFRoZSBub25jZSBmaWxlIGxvY2F0aW9uCisgICAgICAgIGlzIHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIHRoZSBzZXJ2ZXIncyBELUJ1cyBhZGRyZXNzIHVzaW5nIHRoZQorICAgICAgICAibm9uY2VmaWxlIiBrZXktdmFsdWUgcGFpci4KKworICAgICAgICBBZnRlciBhbiBhY2NlcHQsIHRoZSBzZXJ2ZXIgcmVhZHMgMTYgYnl0ZXMgZnJvbSB0aGUgc29ja2V0LiBJZiB0aGUKKyAgICAgICAgcmVhZCBieXRlcyBkbyBub3QgbWF0Y2ggdGhlIG5vbmNlIHN0b3JlZCBpbiB0aGUgbm9uY2UgZmlsZSwgdGhlCisgICAgICAgIHNlcnZlciBNVVNUIGltbWVkaWF0ZWx5IGRyb3AgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgIElmIHRoZSBub25jZSBtYXRjaCB0aGUgcmVjZWl2ZWQgYnl0ZSBzZXF1ZW5jZSwgdGhlIGNsaWVudCBpcyBhY2NlcHRlZAorICAgICAgICBhbmQgdGhlIHRyYW5zcG9ydCBiZWhhdmVzIGxpa2UgYW4gdW5zZWN1cmVkIHRjcCB0cmFuc3BvcnQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBzb2NrZXQsIHRoZSBjbGllbnQgTVVTVCByZWFkCisgICAgICAgIHRoZSBub25jZSBmcm9tIHRoZSBmaWxlIHB1Ymxpc2hlZCBieSB0aGUgc2VydmVyIHZpYSB0aGUgbm9uY2VmaWxlPQorICAgICAgICBrZXktdmFsdWUgcGFpciBhbmQgc2VuZCBpdCBvdmVyIHRoZSBzb2NrZXQuIEFmdGVyIHRoYXQsIHRoZQorICAgICAgICB0cmFuc3BvcnQgYmVoYXZlcyBsaWtlIGFuIHVuc2VjdXJlZCB0Y3AgdHJhbnNwb3J0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFsbCBub25jZS10Y3AgYWRkcmVzc2VzIGFyZSBsaXN0ZW5hYmxlLiBub25jZS10Y3AgYWRkcmVzc2VzIGluIHdoaWNoCisgICAgICAgIDxsaXRlcmFsPmhvc3Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD5wb3J0PC9saXRlcmFsPiBhbmQKKyAgICAgICAgPGxpdGVyYWw+bm9uY2VmaWxlPC9saXRlcmFsPiBhcmUgYWxsIHNwZWNpZmllZCwKKyAgICAgICAgYW5kIDxsaXRlcmFsPnBvcnQ8L2xpdGVyYWw+IGlzIG5vbnplcm8sIGFyZSBhbHNvIGNvbm5lY3RhYmxlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJ0cmFuc3BvcnRzLW5vbmNlLXRjcC1zb2NrZXRzLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4gCisgICAgICAgICBOb25jZSBUQ1AvSVAgc29ja2V0IGFkZHJlc3NlcyB1c2VzIHRoZSAibm9uY2UtdGNwOiIgcHJlZml4IAorICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+aG9zdDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkROUyBuYW1lIG9yIElQIGFkZHJlc3M8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5iaW5kPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PlRoZSBzYW1lIGFzIGZvciB0Y3A6IGFkZHJlc3NlcworICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5wb3J0PC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihudW1iZXIpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PlRoZSB0Y3AgcG9ydCB0aGUgc2VydmVyIHdpbGwgb3Blbi4gQSB6ZXJvIHZhbHVlIGxldCB0aGUgc2VydmVyIAorICAgICAgICAgICAgY2hvb3NlIGEgZnJlZSBwb3J0IHByb3ZpZGVkIGZyb20gdGhlIHVuZGVybGF5aW5nIG9wZXJhdGluZyBzeXN0ZW0uIAorICAgICAgICAgICAgbGliZGJ1cyBpcyBhYmxlIHRvIHJldHJpZXZlIHRoZSByZWFsIHVzZWQgcG9ydCBmcm9tIHRoZSBzZXJ2ZXIuICAKKyAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+ZmFtaWx5PC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PklmIHNldCwgcHJvdmlkZSB0aGUgdHlwZSBvZiBzb2NrZXQgZmFtaWx5IGVpdGhlciAiaXB2NCIgb3IgImlwdjYiLiBJZiB1bnNldCwgdGhlIGZhbWlseSBpcyB1bnNwZWNpZmllZC48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5ub25jZWZpbGU8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PkZpbGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgc2VjcmV0LgorICAgICAgICAgICAgIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIGNvbm5lY3RhYmxlIGFkZHJlc3NlczoKKyAgICAgICAgICAgICBhIGxpc3RlbmluZyBELUJ1cyBzZXJ2ZXIgdGhhdCBvZmZlcnMgdGhpcyB0cmFuc3BvcnQKKyAgICAgICAgICAgICB3aWxsIGFsd2F5cyBjcmVhdGUgYSBuZXcgbm9uY2UgZmlsZS48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1leGVjIj4KKyAgICAgIDx0aXRsZT5FeGVjdXRlZCBTdWJwcm9jZXNzZXMgb24gVW5peDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyB0cmFuc3BvcnQgZm9ya3Mgb2ZmIGEgcHJvY2VzcyBhbmQgY29ubmVjdHMgaXRzIHN0YW5kYXJkCisgICAgICAgIGlucHV0IGFuZCBzdGFuZGFyZCBvdXRwdXQgd2l0aCBhbiBhbm9ueW1vdXMgVW5peCBkb21haW4KKyAgICAgICAgc29ja2V0LiBUaGlzIHNvY2tldCBpcyB0aGVuIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYnkgdGhlCisgICAgICAgIHRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgbWF5IGJlIHVzZWQgdG8gdXNlIG91dC1vZi1wcm9jZXNzCisgICAgICAgIGZvcndhcmRlciBwcm9ncmFtcyBhcyBiYXNpcyBmb3IgdGhlIEQtQnVzIHByb3RvY29sLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmb3JrZWQgcHJvY2VzcyB3aWxsIGluaGVyaXQgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBhbmQKKyAgICAgICAgcHJvY2VzcyBncm91cCBmcm9tIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFeGVjdXRlZCBzdWJwcm9jZXNzZXMgYXJlIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD51bml4ZXhlYzwvbGl0ZXJhbD4gYWRkcmVzc2VzIGFyZSBjb25uZWN0YWJsZSwgYnV0IGFyZSBub3QKKyAgICAgICAgbGlzdGVuYWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy1leGVjLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFeGVjdXRlZCBzdWJwcm9jZXNzIGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInVuaXhleGVjOiIgcHJlZml4CisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+cGF0aDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHBhdGgpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5QYXRoIG9mIHRoZSBiaW5hcnkgdG8gZXhlY3V0ZSwgZWl0aGVyIGFuIGFic29sdXRlCisgICAgICAgICAgICBwYXRoIG9yIGEgYmluYXJ5IG5hbWUgdGhhdCBpcyBzZWFyY2hlZCBmb3IgaW4gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgIHNlYXJjaCBwYXRoIG9mIHRoZSBPUy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QKKyAgICAgICAgICAgIGFyZ3VtZW50IG9mIGV4ZWNscCgpLiBUaGlzIGtleSBpcyBtYW5kYXRvcnkuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PmFyZ3YwPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+VGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBleGVjdXRpbmcgdGhlCisgICAgICAgICAgICBiaW5hcnkuIElmIG9taXR0ZWQgdGhlIHNhbWUgdmFsdWUgYXMgc3BlY2lmaWVkIGZvciBwYXRoPQorICAgICAgICAgICAgd2lsbCBiZSB1c2VkLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YKKyAgICAgICAgICAgIGV4ZWNscCgpLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5hcmd2MSwgYXJndjIsIC4uLjwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBiaW5hcnkuIFRoaXMgY29ycmVzcG9uZHMKKyAgICAgICAgICAgIHRvIHRoZSB0aGlyZCBhbmQgbGF0ZXIgYXJndW1lbnRzIG9mIGV4ZWNscCgpLiBJZiBhCisgICAgICAgICAgICBzcGVjaWZpYyBhcmd2WCBpcyBub3Qgc3BlY2lmaWVkIG5vIGZ1cnRoZXIgYXJndlkgZm9yIFkgPiBYCisgICAgICAgICAgICBhcmUgdGFrZW4gaW50byBhY2NvdW50LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CisgICA8c2VjdDEgaWQ9Im1ldGEtdHJhbnNwb3J0cyI+CisgICAgPHRpdGxlPk1ldGEgVHJhbnNwb3J0czwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBNZXRhIHRyYW5zcG9ydHMgYXJlIGEga2luZCBvZiB0cmFuc3BvcnQgd2l0aCBzcGVjaWFsIGVuaGFuY2VtZW50cyBvcgorICAgICAgYmVoYXZpb3IuIEN1cnJlbnRseSBhdmFpbGFibGUgbWV0YSB0cmFuc3BvcnRzIGluY2x1ZGU6IGF1dG9sYXVuY2gKKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoIj4KKyAgICAgPHRpdGxlPkF1dG9sYXVuY2g8L3RpdGxlPgorICAgICA8cGFyYT5UaGUgYXV0b2xhdW5jaCB0cmFuc3BvcnQgcHJvdmlkZXMgYSB3YXkgZm9yIGRidXMgY2xpZW50cyB0byBhdXRvZGV0ZWN0CisgICAgICAgYSBydW5uaW5nIGRidXMgc2Vzc2lvbiBidXMgYW5kIHRvIGF1dG9sYXVuY2ggYSBzZXNzaW9uIGJ1cyBpZiBub3QgcHJlc2VudC4KKyAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIFVuaXgsIDxsaXRlcmFsPmF1dG9sYXVuY2g8L2xpdGVyYWw+IGFkZHJlc3NlcyBhcmUgY29ubmVjdGFibGUsCisgICAgICAgIGJ1dCBub3QgbGlzdGVuYWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiBXaW5kb3dzLCA8bGl0ZXJhbD5hdXRvbGF1bmNoPC9saXRlcmFsPiBhZGRyZXNzZXMgYXJlIGJvdGgKKyAgICAgICAgY29ubmVjdGFibGUgYW5kIGxpc3RlbmFibGUuCisgICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QzIGlkPSJtZXRhLXRyYW5zcG9ydHMtYXV0b2xhdW5jaC1hZGRyZXNzZXMiPgorICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgIDxwYXJhPgorICAgICAgICAgQXV0b2xhdW5jaCBhZGRyZXNzZXMgdXNlcyB0aGUgImF1dG9sYXVuY2g6IiBwcmVmaXggYW5kIHN1cHBvcnQgdGhlCisgICAgICAgICBmb2xsb3dpbmcga2V5L3ZhbHVlIHBhaXJzOgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+TmFtZTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+c2NvcGU8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+c2NvcGUgb2YgYXV0b2xhdW5jaCAoV2luZG93cyBvbmx5KQorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIippbnN0YWxsLXBhdGgiIC0gbGltaXQgc2Vzc2lvbiBidXMgdG8gZGJ1cyBpbnN0YWxsYXRpb24gcGF0aC4KKyAgICAgICAgICAgICAgIFRoZSBkYnVzIGluc3RhbGxhdGlvbiBwYXRoIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbG9jYXRpb24gb2YKKyAgICAgICAgICAgICAgIHRoZSBzaGFyZWQgZGJ1cyBsaWJyYXJ5LiBJZiB0aGUgbGlicmFyeSBpcyBsb2NhdGVkIGluIGEgJ2JpbicKKyAgICAgICAgICAgICAgIHN1YmRpcmVjdG9yeSB0aGUgaW5zdGFsbGF0aW9uIHJvb3QgaXMgdGhlIGRpcmVjdG9yeSBhYm92ZSwKKyAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWJyYXJ5IGxpdmVzIGlzIHRha2VuIGFzCisgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcm9vdC4KKyAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAmbHQ7aW5zdGFsbC1yb290Jmd0Oy9iaW4vW2xpYl1kYnVzLTEuZGxsCisgICAgICAgICAgICAgICAgICAgJmx0O2luc3RhbGwtcm9vdCZndDsvW2xpYl1kYnVzLTEuZGxsCisgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIip1c2VyIiAtIGxpbWl0IHNlc3Npb24gYnVzIHRvIHRoZSByZWNlbnQgdXNlci4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgIG90aGVyIHZhbHVlcyAtIHNwZWNpZnkgZGVkaWNhdGVkIHNlc3Npb24gYnVzIGxpa2UgInJlbGVhc2UiLAorICAgICAgICAgICAgICAgImRlYnVnIiBvciBvdGhlcgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgPC90Z3JvdXA+CisgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgIDwvc2VjdDM+CisKKyAgICAgPHNlY3QzIGlkPSJtZXRhLXRyYW5zcG9ydHMtYXV0b2xhdW5jaC13aW5kb3dzLWltcGxlbWVudGF0aW9uIj4KKyAgICAgIDx0aXRsZT5XaW5kb3dzIGltcGxlbWVudGF0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiBzdGFydCwgdGhlIHNlcnZlciBvcGVucyBhIHBsYXRmb3JtIHNwZWNpZmljIHRyYW5zcG9ydCwgY3JlYXRlcyBhIG11dGV4CisgICAgICAgIGFuZCBhIHNoYXJlZCBtZW1vcnkgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxhdGVkIHNlc3Npb24gYnVzIGFkZHJlc3MuCisgICAgICAgIFRoaXMgbXV0ZXggd2lsbCBiZSBpbnNwZWN0ZWQgYnkgdGhlIGRidXMgY2xpZW50IGxpYnJhcnkgdG8gZGV0ZWN0IGEKKyAgICAgICAgcnVubmluZyBkYnVzIHNlc3Npb24gYnVzLiBUaGUgYWNjZXNzIHRvIHRoZSBtdXRleCBhbmQgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgc2VjdGlvbiBhcmUgcHJvdGVjdGVkIGJ5IGdsb2JhbCBsb2Nrcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgIEluIHRoZSByZWNlbnQgaW1wbGVtZW50YXRpb24gdGhlIGF1dG9sYXVuY2ggdHJhbnNwb3J0IHVzZXMgYSB0Y3AgdHJhbnNwb3J0CisgICAgICAgb24gbG9jYWxob3N0IHdpdGggYSBwb3J0IGNob29zZW4gZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhpcyBkZXRhaWwgbWF5CisgICAgICAgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRGlzY2xhaW1lcjogVGhlIHJlY2VudCBpbXBsZW1lbnRhdGlvbiBpcyBpbiBhbiBlYXJseSBzdGF0ZSBhbmQgbWF5IG5vdAorICAgICAgICB3b3JrIGluIGFsbCBjaXJ1bXN0YW5jZXMgYW5kL29yIG1heSBoYXZlIHNlY3VyaXR5IGlzc3Vlcy4gQmVjYXVzZSBvZiB0aGlzCisgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZG9jdW1lbnRhdGVkIHlldC4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InV1aWRzIj4KKyAgICA8dGl0bGU+VVVJRHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgQSB3b3JraW5nIEQtQnVzIGltcGxlbWVudGF0aW9uIHVzZXMgdW5pdmVyc2FsbHktdW5pcXVlIElEcyBpbiB0d28gcGxhY2VzLgorICAgICAgRmlyc3QsIGVhY2ggc2VydmVyIGFkZHJlc3MgaGFzIGEgVVVJRCBpZGVudGlmeWluZyB0aGUgYWRkcmVzcywgCisgICAgICBhcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+LiBTZWNvbmQsIGVhY2ggb3BlcmF0aW5nCisgICAgICBzeXN0ZW0ga2VybmVsIGluc3RhbmNlIHJ1bm5pbmcgYSBELUJ1cyBjbGllbnQgb3Igc2VydmVyIGhhcyBhIFVVSUQKKyAgICAgIGlkZW50aWZ5aW5nIHRoYXQga2VybmVsLCByZXRyaWV2ZWQgYnkgaW52b2tpbmcgdGhlIG1ldGhvZAorICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQoKSAoc2VlIDx4cmVmCisgICAgICBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiLz4pLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSB0ZXJtICJVVUlEIiBpbiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGxpdGVyYWxseSwgaS5lLiBhbgorICAgICAgaWRlbnRpZmllciB0aGF0IGlzIHVuaXZlcnNhbGx5IHVuaXF1ZS4gSXQgaXMgbm90IGludGVuZGVkIHRvIHJlZmVyIHRvCisgICAgICBSRkM0MTIyLCBhbmQgaW4gZmFjdCB0aGUgRC1CdXMgVVVJRCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoYXQgUkZDLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSBVVUlEIG11c3QgY29udGFpbiAxMjggYml0cyBvZiBkYXRhIGFuZCBiZSBoZXgtZW5jb2RlZC4gIFRoZQorICAgICAgaGV4LWVuY29kZWQgc3RyaW5nIG1heSBub3QgY29udGFpbiBoeXBoZW5zIG9yIG90aGVyIG5vbi1oZXgtZGlnaXQKKyAgICAgIGNoYXJhY3RlcnMsIGFuZCBpdCBtdXN0IGJlIGV4YWN0bHkgMzIgY2hhcmFjdGVycyBsb25nLiAgVG8gZ2VuZXJhdGUgYQorICAgICAgVVVJRCwgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGNvbmNhdGVuYXRlcyA5NiBiaXRzIG9mIHJhbmRvbQorICAgICAgZGF0YSBmb2xsb3dlZCBieSB0aGUgMzItYml0IHRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCAoaW4gYmlnCisgICAgICBlbmRpYW4gYnl0ZSBvcmRlcikuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgSXQgd291bGQgYWxzbyBiZSBhY2NlcHRhYmxlIGFuZCBwcm9iYWJseSBiZXR0ZXIgdG8gc2ltcGx5IGdlbmVyYXRlIDEyOAorICAgICAgYml0cyBvZiByYW5kb20gZGF0YSwgYXMgbG9uZyBhcyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgb2YgaGlnaAorICAgICAgcXVhbGl0eS4gVGhlIHRpbWVzdGFtcCBjb3VsZCBjb25jZWl2YWJseSBoZWxwIGlmIHRoZSByYW5kb20gYml0cyBhcmUgbm90CisgICAgICB2ZXJ5IHJhbmRvbS4gV2l0aCBhIHF1YWxpdHkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsIGNvbGxpc2lvbnMgYXJlCisgICAgICBleHRyZW1lbHkgdW5saWtlbHkgZXZlbiB3aXRoIG9ubHkgOTYgYml0cywgc28gaXQncyBzb21ld2hhdCBhY2FkZW1pYy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkLCBob3dldmVyLCBzdGljayB0byByYW5kb20gZGF0YSBmb3IgdGhlIGZpcnN0IDk2IGJpdHMKKyAgICAgIG9mIHRoZSBVVUlELgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKyAgICAKKyAgPHNlY3QxIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzIj4KKyAgICA8dGl0bGU+U3RhbmRhcmQgSW50ZXJmYWNlczwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1ub3RhdGlvbiIvPiBmb3IgZGV0YWlscyBvbiAKKyAgICAgICB0aGUgbm90YXRpb24gdXNlZCBpbiB0aGlzIHNlY3Rpb24uIFRoZXJlIGFyZSBzb21lIHN0YW5kYXJkIGludGVyZmFjZXMKKyAgICAgIHRoYXQgbWF5IGJlIHVzZWZ1bCBhY3Jvc3MgdmFyaW91cyBELUJ1cyBhcHBsaWNhdGlvbnMuCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wZWVyIj4KKyAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXI8L2xpdGVyYWw+IGludGVyZmFjZSAKKyAgICAgICAgaGFzIHR3byBtZXRob2RzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nICgpCisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQgKG91dCBTVFJJTkcgbWFjaGluZV91dWlkKQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpcHQgb2YgdGhlIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiBtZXNzYWdlCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4sIGFuIGFwcGxpY2F0aW9uIHNob3VsZCBkbworICAgICAgICBub3RoaW5nIG90aGVyIHRoYW4gcmVwbHkgd2l0aCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGFzCisgICAgICAgIHVzdWFsLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIG9iamVjdCBwYXRoIGEgcGluZyBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWlwdCBvZiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQ8L2xpdGVyYWw+LCBhbiBhcHBsaWNhdGlvbiBzaG91bGQgCisgICAgICAgIHJlcGx5IHdpdGggYSA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBjb250YWluaW5nIGEgaGV4LWVuY29kZWQgCisgICAgICAgIFVVSUQgcmVwcmVzZW50aW5nIHRoZSBpZGVudGl0eSBvZiB0aGUgbWFjaGluZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIG9uLgorICAgICAgICBUaGlzIFVVSUQgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIHByb2Nlc3NlcyBvbiBhIHNpbmdsZSBzeXN0ZW0gYXQgbGVhc3QKKyAgICAgICAgdW50aWwgdGhhdCBzeXN0ZW0gbmV4dCByZWJvb3RzLiBJdCBzaG91bGQgYmUgdGhlIHNhbWUgYWNyb3NzIHJlYm9vdHMgCisgICAgICAgIGlmIHBvc3NpYmxlLCBidXQgdGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBhbmQgaXMgbm90IAorICAgICAgICBndWFyYW50ZWVkLgorICAgICAgICBJdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggb2JqZWN0IHBhdGggYSBHZXRNYWNoaW5lSWQgaXMgc2VudCB0by4gIFRoZQorICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFuZGxlcyB0aGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBVVUlEIGlzIGludGVuZGVkIHRvIGJlIHBlci1pbnN0YW5jZS1vZi10aGUtb3BlcmF0aW5nLXN5c3RlbSwgc28gbWF5IHJlcHJlc2VudAorICAgICAgICBhIHZpcnR1YWwgbWFjaGluZSBydW5uaW5nIG9uIGEgaHlwZXJ2aXNvciwgcmF0aGVyIHRoYW4gYSBwaHlzaWNhbCBtYWNoaW5lLgorICAgICAgICBCYXNpY2FsbHkgaWYgdHdvIHByb2Nlc3NlcyBzZWUgdGhlIHNhbWUgVVVJRCwgdGhleSBzaG91bGQgYWxzbyBzZWUgdGhlIHNhbWUKKyAgICAgICAgc2hhcmVkIG1lbW9yeSwgVU5JWCBkb21haW4gc29ja2V0cywgcHJvY2VzcyBJRHMsIGFuZCBvdGhlciBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgCisgICAgICAgIGEgcnVubmluZyBPUyBrZXJuZWwgaW4gY29tbW9uIGJldHdlZW4gdGhlIHByb2Nlc3Nlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgVVVJRCBpcyBvZnRlbiB1c2VkIHdoZXJlIG90aGVyIHByb2dyYW1zIG1pZ2h0IHVzZSBhIGhvc3RuYW1lLiBIb3N0bmFtZXMgCisgICAgICAgIGNhbiBjaGFuZ2Ugd2l0aG91dCByZWJvb3RpbmcsIGhvd2V2ZXIsIG9yIGp1c3QgYmUgImxvY2FsaG9zdCIgLSBzbyB0aGUgVVVJRAorICAgICAgICBpcyBtb3JlIHJvYnVzdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8eHJlZiBsaW5rZW5kPSJ1dWlkcyIvPiBleHBsYWlucyB0aGUgZm9ybWF0IG9mIHRoZSBVVUlELgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBpbnRlcmZhY2UgaGFzIG9uZSBtZXRob2Q6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0IChvdXQgU1RSSU5HIHhtbF9kYXRhKQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9iamVjdHMgaW5zdGFuY2VzIG1heSBpbXBsZW1lbnQKKyAgICAgICAgPGxpdGVyYWw+SW50cm9zcGVjdDwvbGl0ZXJhbD4gd2hpY2ggcmV0dXJucyBhbiBYTUwgZGVzY3JpcHRpb24gb2YKKyAgICAgICAgdGhlIG9iamVjdCwgaW5jbHVkaW5nIGl0cyBpbnRlcmZhY2VzICh3aXRoIHNpZ25hbHMgYW5kIG1ldGhvZHMpLCBvYmplY3RzCisgICAgICAgIGJlbG93IGl0IGluIHRoZSBvYmplY3QgcGF0aCB0cmVlLCBhbmQgaXRzIHByb3BlcnRpZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHhyZWYgbGlua2VuZD0iaW50cm9zcGVjdGlvbi1mb3JtYXQiLz4gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhpcyBYTUwgc3RyaW5nLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXByb3BlcnRpZXMiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBNYW55IG5hdGl2ZSBBUElzIHdpbGwgaGF2ZSBhIGNvbmNlcHQgb2Ygb2JqZWN0IDxmaXJzdHRlcm0+cHJvcGVydGllczwvZmlyc3R0ZXJtPiAKKyAgICAgICAgb3IgPGZpcnN0dGVybT5hdHRyaWJ1dGVzPC9maXJzdHRlcm0+LiBUaGVzZSBjYW4gYmUgZXhwb3NlZCB2aWEgdGhlIAorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzPC9saXRlcmFsPiBpbnRlcmZhY2UuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLkdldCAoaW4gU1RSSU5HIGludGVyZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gU1RSSU5HIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgVkFSSUFOVCB2YWx1ZSk7CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuU2V0IChpbiBTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBTVFJJTkcgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFZBUklBTlQgdmFsdWUpOworICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLkdldEFsbCAoaW4gU1RSSU5HIGludGVyZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IERJQ1QmbHQ7U1RSSU5HLFZBUklBTlQmZ3Q7IHByb3BzKTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJdCBpcyBjb252ZW50aW9uYWwgdG8gZ2l2ZSBELUJ1cyBwcm9wZXJ0aWVzIG5hbWVzIGNvbnNpc3Rpbmcgb2YKKyAgICAgICAgY2FwaXRhbGl6ZWQgd29yZHMgd2l0aG91dCBwdW5jdHVhdGlvbiAoIkNhbWVsQ2FzZSIpLCBsaWtlCisgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtbWVtYmVyIj5tZW1iZXIgbmFtZXM8L2xpbms+LgorICAgICAgICBGb3IgaW5zdGFuY2UsIHRoZSBHT2JqZWN0IHByb3BlcnR5CisgICAgICAgIDxsaXRlcmFsPmNvbm5lY3Rpb24tc3RhdHVzPC9saXRlcmFsPiBvciB0aGUgUXQgcHJvcGVydHkKKyAgICAgICAgPGxpdGVyYWw+Y29ubmVjdGlvblN0YXR1czwvbGl0ZXJhbD4gY291bGQgYmUgcmVwcmVzZW50ZWQgb24gRC1CdXMKKyAgICAgICAgYXMgPGxpdGVyYWw+Q29ubmVjdGlvblN0YXR1czwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgU3RyaWN0bHkgc3BlYWtpbmcsIEQtQnVzIHByb3BlcnR5IG5hbWVzIGFyZSBub3QgcmVxdWlyZWQgdG8gZm9sbG93CisgICAgICAgIHRoZSBzYW1lIG5hbWluZyByZXN0cmljdGlvbnMgYXMgbWVtYmVyIG5hbWVzLCBidXQgRC1CdXMgcHJvcGVydHkKKyAgICAgICAgbmFtZXMgdGhhdCB3b3VsZCBub3QgYmUgdmFsaWQgbWVtYmVyIG5hbWVzIChpbiBwYXJ0aWN1bGFyLAorICAgICAgICBHT2JqZWN0LXN0eWxlIGRhc2gtc2VwYXJhdGVkIHByb3BlcnR5IG5hbWVzKSBjYW4gY2F1c2UgaW50ZXJvcGVyYWJpbGl0eQorICAgICAgICBwcm9ibGVtcyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHdyaXRhYmxlIGNhbiBiZSBkZXRlcm1pbmVkCisgICAgICAgIGJ5IGNhbGxpbmcgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUuSW50cm9zcGVjdDwvbGl0ZXJhbD4sCisgICAgICAgIHNlZSA8eHJlZiBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLWludHJvc3BlY3RhYmxlIi8+LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBtYXkgYmUgcHJvdmlkZWQgZm9yIHRoZSBpbnRlcmZhY2UgbmFtZTsgaW4gdGhpcyBjYXNlLCAKKyAgICAgICAgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSwgCisgICAgICAgIHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgKHBpY2tpbmcgb25lIGJ5IGFjY29yZGluZyB0byBhbiBhcmJpdHJhcnkgCisgICAgICAgIGRldGVybWluaXN0aWMgcnVsZSwgb3IgcmV0dXJuaW5nIGFuIGVycm9yLCBhcmUgdGhlIHJlYXNvbmFibGUgCisgICAgICAgIHBvc3NpYmlsaXRpZXMpLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgY2hhbmdlIG9uIGFuIG9iamVjdCwgdGhlCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuUHJvcGVydGllc0NoYW5nZWQ8L2xpdGVyYWw+CisgICAgICAgIHNpZ25hbCBtYXkgYmUgZW1pdHRlZCAodGhpcyBzaWduYWwgd2FzIGFkZGVkIGluIDAuMTQpOgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZCAoU1RSSU5HIGludGVyZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyBjaGFuZ2VkX3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZJmx0O1NUUklORyZndDsgaW52YWxpZGF0ZWRfcHJvcGVydGllcyk7CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgd2hlcmUgPGxpdGVyYWw+Y2hhbmdlZF9wcm9wZXJ0aWVzPC9saXRlcmFsPiBpcyBhIGRpY3Rpb25hcnkKKyAgICAgICAgY29udGFpbmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggdGhlIG5ldyB2YWx1ZXMgYW5kCisgICAgICAgIDxsaXRlcmFsPmludmFsaWRhdGVkX3Byb3BlcnRpZXM8L2xpdGVyYWw+IGlzIGFuIGFycmF5IG9mCisgICAgICAgIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VkIGJ1dCB0aGUgdmFsdWUgaXMgbm90IGNvbnZleWVkLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFdoZXRoZXIgdGhlIDxsaXRlcmFsPlByb3BlcnRpZXNDaGFuZ2VkPC9saXRlcmFsPiBzaWduYWwgaXMKKyAgICAgICAgc3VwcG9ydGVkIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUuSW50cm9zcGVjdDwvbGl0ZXJhbD4uIE5vdGUKKyAgICAgICAgdGhhdCB0aGUgc2lnbmFsIG1heSBiZSBzdXBwb3J0ZWQgZm9yIGFuIG9iamVjdCBidXQgaXQgbWF5CisgICAgICAgIGRpZmZlciBob3cgd2hldGhlciBhbmQgaG93IGl0IGlzIHVzZWQgb24gYSBwZXItcHJvcGVydHkgYmFzaXMKKyAgICAgICAgKGZvciBlLmcuIHBlcmZvcm1hbmNlIG9yIHNlY3VyaXR5IHJlYXNvbnMpLiBFYWNoIHByb3BlcnR5IChvcgorICAgICAgICB0aGUgcGFyZW50IGludGVyZmFjZSkgbXVzdCBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydHkuRW1pdHNDaGFuZ2VkU2lnbmFsPC9saXRlcmFsPgorICAgICAgICBhbm5vdGF0aW9uIHRvIGNvbnZleSB0aGlzICh1c3VhbGx5IHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGlzIHN1ZmZpY2llbnQgbWVhbmluZyB0aGF0IHRoZQorICAgICAgICBhbm5vdGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgdXNlZCkuIFNlZSA8eHJlZgorICAgICAgICBsaW5rZW5kPSJpbnRyb3NwZWN0aW9uLWZvcm1hdCIvPiBmb3IgZGV0YWlscyBvbiB0aGlzCisgICAgICAgIGFubm90YXRpb24uCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1vYmplY3RtYW5hZ2VyIj4KKyAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQW4gQVBJIGNhbiBvcHRpb25hbGx5IG1ha2UgdXNlIG9mIHRoaXMgaW50ZXJmYWNlIGZvciBvbmUgb3IKKyAgICAgICAgbW9yZSBzdWItdHJlZXMgb2Ygb2JqZWN0cy4gVGhlIHJvb3Qgb2YgZWFjaCBzdWItdHJlZSBpbXBsZW1lbnRzCisgICAgICAgIHRoaXMgaW50ZXJmYWNlIHNvIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gZ2V0IGFsbCBvYmplY3RzLAorICAgICAgICBpbnRlcmZhY2VzIGFuZCBwcm9wZXJ0aWVzIGluIGEgc2luZ2xlIG1ldGhvZCBjYWxsLiAgSXQgaXMKKyAgICAgICAgYXBwcm9wcmlhdGUgdG8gdXNlIHRoaXMgaW50ZXJmYWNlIGlmIHVzZXJzIG9mIHRoZSB0cmVlIG9mCisgICAgICAgIG9iamVjdHMgYXJlIGV4cGVjdGVkIHRvIGJlIGludGVyZXN0ZWQgaW4gYWxsIGludGVyZmFjZXMgb2YgYWxsCisgICAgICAgIG9iamVjdHMgaW4gdGhlIHRyZWU7IGEgbW9yZSBncmFudWxhciBBUEkgc2hvdWxkIGJlIHVzZWQgaWYKKyAgICAgICAgdXNlcnMgb2YgdGhlIG9iamVjdHMgYXJlIGV4cGVjdGVkIHRvIGJlIGludGVyZXN0ZWQgaW4gYSBzbWFsbAorICAgICAgICBzdWJzZXQgb2YgdGhlIG9iamVjdHMsIGEgc21hbGwgc3Vic2V0IG9mIHRoZWlyIGludGVyZmFjZXMsIG9yCisgICAgICAgIGJvdGguCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1ldGhvZCB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGdldCBhbGwgb2JqZWN0cyBhbmQKKyAgICAgICAgcHJvcGVydGllcyBpcyA8bGl0ZXJhbD5HZXRNYW5hZ2VkT2JqZWN0czwvbGl0ZXJhbD46CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIuR2V0TWFuYWdlZE9iamVjdHMgKG91dCBESUNUJmx0O09CSlBBVEgsRElDVCZsdDtTVFJJTkcsRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsmZ3Q7Jmd0OyBvYmpwYXRoX2ludGVyZmFjZXNfYW5kX3Byb3BlcnRpZXMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgaXMgYSBkaWN0IHdob3NlIGtleXMgYXJlCisgICAgICAgIG9iamVjdCBwYXRocy4gQWxsIHJldHVybmVkIG9iamVjdCBwYXRocyBhcmUgY2hpbGRyZW4gb2YgdGhlCisgICAgICAgIG9iamVjdCBwYXRoIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSwgaS5lLiB0aGVpciBvYmplY3QKKyAgICAgICAgcGF0aHMgc3RhcnQgd2l0aCB0aGUgT2JqZWN0TWFuYWdlcidzIG9iamVjdCBwYXRoIHBsdXMgJy8nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggdmFsdWUgaXMgYSBkaWN0IHdob3NlIGtleXMgYXJlIGludGVyZmFjZXMgbmFtZXMuICBFYWNoCisgICAgICAgIHZhbHVlIGluIHRoaXMgaW5uZXIgZGljdCBpcyB0aGUgc2FtZSBkaWN0IHRoYXQgd291bGQgYmUKKyAgICAgICAgcmV0dXJuZWQgYnkgdGhlIDxsaW5rCisgICAgICAgIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5HZXRBbGwoKTwvbGluaz4KKyAgICAgICAgbWV0aG9kIGZvciB0aGF0IGNvbWJpbmF0aW9uIG9mIG9iamVjdCBwYXRoIGFuZCBpbnRlcmZhY2UuIElmCisgICAgICAgIGFuIGludGVyZmFjZSBoYXMgbm8gcHJvcGVydGllcywgdGhlIGVtcHR5IGRpY3QgaXMgcmV0dXJuZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQ2hhbmdlcyBhcmUgZW1pdHRlZCB1c2luZyB0aGUgZm9sbG93aW5nIHR3byBzaWduYWxzOgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyLkludGVyZmFjZXNBZGRlZCAoT0JKUEFUSCBvYmplY3RfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElDVCZsdDtTVFJJTkcsRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsmZ3Q7IGludGVyZmFjZXNfYW5kX3Byb3BlcnRpZXMpOworICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIuSW50ZXJmYWNlc1JlbW92ZWQgKE9CSlBBVEggb2JqZWN0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVkmbHQ7U1RSSU5HJmd0OyBpbnRlcmZhY2VzKTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGxpdGVyYWw+SW50ZXJmYWNlc0FkZGVkPC9saXRlcmFsPiBzaWduYWwgaXMgZW1pdHRlZCB3aGVuCisgICAgICAgIGVpdGhlciBhIG5ldyBvYmplY3QgaXMgYWRkZWQgb3Igd2hlbiBhbiBleGlzdGluZyBvYmplY3QgZ2FpbnMKKyAgICAgICAgb25lIG9yIG1vcmUgaW50ZXJmYWNlcy4gVGhlCisgICAgICAgIDxsaXRlcmFsPkludGVyZmFjZXNSZW1vdmVkPC9saXRlcmFsPiBzaWduYWwgaXMgZW1pdHRlZAorICAgICAgICB3aGVuZXZlciBhbiBvYmplY3QgaXMgcmVtb3ZlZCBvciBpdCBsb3NlcyBvbmUgb3IgbW9yZQorICAgICAgICBpbnRlcmZhY2VzLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+SW50ZXJmYWNlc0FkZGVkPC9saXRlcmFsPiBzaWduYWwgY29udGFpbnMgYSBkaWN0IHdpdGgKKyAgICAgICAgdGhlIGludGVyZmFjZXMgYW5kIHByb3BlcnRpZXMgKGlmIGFueSkgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8KKyAgICAgICAgdGhlIGdpdmVuIG9iamVjdCBwYXRoLiBTaW1pbGFybHksIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZQorICAgICAgICA8bGl0ZXJhbD5JbnRlcmZhY2VzUmVtb3ZlZDwvbGl0ZXJhbD4gc2lnbmFsIGNvbnRhaW5zIGFuIGFycmF5CisgICAgICAgIG9mIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2VyZSByZW1vdmVkLiBOb3RlIHRoYXQgY2hhbmdlcyBvbgorICAgICAgICBwcm9wZXJ0aWVzIG9uIGV4aXN0aW5nIGludGVyZmFjZXMgYXJlIG5vdCByZXBvcnRlZCB1c2luZyB0aGlzCisgICAgICAgIGludGVyZmFjZSAtIGFuIGFwcGxpY2F0aW9uIHNob3VsZCBhbHNvIG1vbml0b3IgdGhlIGV4aXN0aW5nIDxsaW5rCisgICAgICAgIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyI+UHJvcGVydGllc0NoYW5nZWQ8L2xpbms+CisgICAgICAgIHNpZ25hbCBvbiBlYWNoIG9iamVjdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBcHBsaWNhdGlvbnMgU0hPVUxEIE5PVCBleHBvcnQgb2JqZWN0cyB0aGF0IGFyZSBjaGlsZHJlbiBvZiBhbgorICAgICAgICBvYmplY3QgKGRpcmVjdGx5IG9yIG90aGVyd2lzZSkgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGJ1dAorICAgICAgICB3aGljaCBhcmUgbm90IHJldHVybmVkIGluIHRoZSByZXBseSBmcm9tIHRoZQorICAgICAgICA8bGl0ZXJhbD5HZXRNYW5hZ2VkT2JqZWN0cygpPC9saXRlcmFsPiBtZXRob2Qgb2YgdGhpcworICAgICAgICBpbnRlcmZhY2Ugb24gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgaW50ZW50IG9mIHRoZSA8bGl0ZXJhbD5PYmplY3RNYW5hZ2VyPC9saXRlcmFsPiBpbnRlcmZhY2UKKyAgICAgICAgaXMgdG8gbWFrZSBpdCBlYXN5IHRvIHdyaXRlIGEgcm9idXN0IGNsaWVudAorICAgICAgICBpbXBsZW1lbnRhdGlvbi4gVGhlIHRyaXZpYWwgY2xpZW50IGltcGxlbWVudGF0aW9uIG9ubHkgbmVlZHMKKyAgICAgICAgdG8gbWFrZSB0d28gbWV0aG9kIGNhbGxzOgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaCAoYnVzX3Byb3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxuYW1lPSdvcmcuZXhhbXBsZS5BcHAnLHBhdGhfbmFtZXNwYWNlPScvb3JnL2V4YW1wbGUvQXBwJyIpOworICAgICAgICAgIG9iamVjdHMgPSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyLkdldE1hbmFnZWRPYmplY3RzIChhcHBfcHJveHkpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIG9uIHRoZSBtZXNzYWdlIGJ1cyBhbmQgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbidzCisgICAgICAgIDxsaXRlcmFsPk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+LCByZXNwZWN0aXZlbHkuIFdoZW5ldmVyIGEgbmV3CisgICAgICAgIHJlbW90ZSBvYmplY3QgaXMgY3JlYXRlZCAob3IgYW4gZXhpc3Rpbmcgb2JqZWN0IGdhaW5zIGEgbmV3CisgICAgICAgIGludGVyZmFjZSksIHRoZSA8bGl0ZXJhbD5JbnRlcmZhY2VzQWRkZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcworICAgICAgICBlbWl0dGVkLCBhbmQgc2luY2UgdGhpcyBzaWduYWwgY29udGFpbnMgYWxsIHByb3BlcnRpZXMgZm9yIHRoZQorICAgICAgICBpbnRlcmZhY2VzLCBubyBjYWxscyB0byB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLlByb3BlcnRpZXM8L2xpdGVyYWw+IGludGVyZmFjZSBvbiB0aGUKKyAgICAgICAgcmVtb3RlIG9iamVjdCBhcmUgbmVlZGVkLiBBZGRpdGlvbmFsbHksIHNpbmNlIHRoZSBpbml0aWFsCisgICAgICAgIDxsaXRlcmFsPkFkZE1hdGNoKCk8L2xpdGVyYWw+IHJ1bGUgYWxyZWFkeSBpbmNsdWRlcyBzaWduYWwKKyAgICAgICAgbWVzc2FnZXMgZnJvbSB0aGUgbmV3bHkgY3JlYXRlZCBjaGlsZCBvYmplY3QsIG5vIG5ldworICAgICAgICA8bGl0ZXJhbD5BZGRNYXRjaCgpPC9saXRlcmFsPiBjYWxsIGlzIG5lZWRlZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIDxlbXBoYXNpcz4KKyAgICAgICAgICBUaGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICBpbnRlcmZhY2Ugd2FzIGFkZGVkIGluIHZlcnNpb24gMC4xNyBvZiB0aGUgRC1CdXMKKyAgICAgICAgICBzcGVjaWZpY2F0aW9uLgorICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJpbnRyb3NwZWN0aW9uLWZvcm1hdCI+CisgICAgPHRpdGxlPkludHJvc3BlY3Rpb24gRGF0YSBGb3JtYXQ8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgQXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiLz4sIAorICAgICAgb2JqZWN0cyBtYXkgYmUgaW50cm9zcGVjdGVkIGF0IHJ1bnRpbWUsIHJldHVybmluZyBhbiBYTUwgc3RyaW5nIAorICAgICAgdGhhdCBkZXNjcmliZXMgdGhlIG9iamVjdC4gVGhlIHNhbWUgWE1MIGZvcm1hdCBtYXkgYmUgdXNlZCBpbiAKKyAgICAgIG90aGVyIGNvbnRleHRzIGFzIHdlbGwsIGZvciBleGFtcGxlIGFzIGFuICJJREwiIGZvciBnZW5lcmF0aW5nIAorICAgICAgc3RhdGljIGxhbmd1YWdlIGJpbmRpbmdzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnRyb3NwZWN0aW9uIGRhdGE6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICZsdDshRE9DVFlQRSBub2RlIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBPYmplY3QgSW50cm9zcGVjdGlvbiAxLjAvL0VOIgorICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9pbnRyb3NwZWN0LmR0ZCImZ3Q7CisgICAgICAgICZsdDtub2RlIG5hbWU9Ii9jb20vZXhhbXBsZS9zYW1wbGVfb2JqZWN0IiZndDsKKyAgICAgICAgICAmbHQ7aW50ZXJmYWNlIG5hbWU9ImNvbS5leGFtcGxlLlNhbXBsZUludGVyZmFjZSImZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkZyb2JhdGUiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImZvbyIgdHlwZT0iaSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0icyIgZGlyZWN0aW9uPSJvdXQiLyZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXoiIHR5cGU9ImF7dXN9IiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkIiB2YWx1ZT0idHJ1ZSIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkJhemlmeSImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSIoaWl1KSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0idiIgZGlyZWN0aW9uPSJvdXQiLyZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJNb2dyaWZ5IiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9IihpaWF2KSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7c2lnbmFsIG5hbWU9IkNoYW5nZWQiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9Im5ld192YWx1ZSIgdHlwZT0iYiIvJmd0OworICAgICAgICAgICAgJmx0Oy9zaWduYWwmZ3Q7CisgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iQmFyIiB0eXBlPSJ5IiBhY2Nlc3M9InJlYWR3cml0ZSIvJmd0OworICAgICAgICAgICZsdDsvaW50ZXJmYWNlJmd0OworICAgICAgICAgICZsdDtub2RlIG5hbWU9ImNoaWxkX29mX3NhbXBsZV9vYmplY3QiLyZndDsKKyAgICAgICAgICAmbHQ7bm9kZSBuYW1lPSJhbm90aGVyX2NoaWxkX29mX3NhbXBsZV9vYmplY3QiLyZndDsKKyAgICAgICAmbHQ7L25vZGUmZ3Q7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEEgbW9yZSBmb3JtYWwgRFREIGFuZCBzcGVjIG5lZWRzIHdyaXRpbmcsIGJ1dCBoZXJlIGFyZSBzb21lIHF1aWNrIG5vdGVzLgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgT25seSB0aGUgcm9vdCAmbHQ7bm9kZSZndDsgZWxlbWVudCBjYW4gb21pdCB0aGUgbm9kZSBuYW1lLCBhcyBpdCdzCisgICAgICAgICAgICBrbm93biB0byBiZSB0aGUgb2JqZWN0IHRoYXQgd2FzIGludHJvc3BlY3RlZC4gIElmIHRoZSByb290CisgICAgICAgICAgICAmbHQ7bm9kZSZndDsgZG9lcyBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgYW4gYWJzb2x1dGUKKyAgICAgICAgICAgIG9iamVjdCBwYXRoLiBJZiBjaGlsZCAmbHQ7bm9kZSZndDsgaGF2ZSBvYmplY3QgcGF0aHMsIHRoZXkgbXVzdCBiZQorICAgICAgICAgICAgcmVsYXRpdmUuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiBhIGNoaWxkICZsdDtub2RlJmd0OyBoYXMgYW55IHN1Yi1lbGVtZW50cywgdGhlbiB0aGV5IAorICAgICAgICAgICAgbXVzdCByZXByZXNlbnQgYSBjb21wbGV0ZSBpbnRyb3NwZWN0aW9uIG9mIHRoZSBjaGlsZC4KKyAgICAgICAgICAgIElmIGEgY2hpbGQgJmx0O25vZGUmZ3Q7IGlzIGVtcHR5LCB0aGVuIGl0IG1heSBvciBtYXkgCisgICAgICAgICAgICBub3QgaGF2ZSBzdWItZWxlbWVudHM7IHRoZSBjaGlsZCBtdXN0IGJlIGludHJvc3BlY3RlZAorICAgICAgICAgICAgaW4gb3JkZXIgdG8gZmluZCBvdXQuIFRoZSBpbnRlbnQgaXMgdGhhdCBpZiBhbiBvYmplY3QgCisgICAgICAgICAgICBrbm93cyB0aGF0IGl0cyBjaGlsZHJlbiBhcmUgImZhc3QiIHRvIGludHJvc3BlY3QKKyAgICAgICAgICAgIGl0IGNhbiBnbyBhaGVhZCBhbmQgcmV0dXJuIHRoZWlyIGluZm9ybWF0aW9uLCBidXQgCisgICAgICAgICAgICBvdGhlcndpc2UgaXQgY2FuIG9taXQgaXQuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZGlyZWN0aW9uIGVsZW1lbnQgb24gJmx0O2FyZyZndDsgbWF5IGJlIG9taXR0ZWQsIAorICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSBpdCBkZWZhdWx0cyB0byAiaW4iIGZvciBtZXRob2QgY2FsbHMgCisgICAgICAgICAgICBhbmQgIm91dCIgZm9yIHNpZ25hbHMuIFNpZ25hbHMgb25seSBhbGxvdyAib3V0IiAKKyAgICAgICAgICAgIHNvIHdoaWxlIGRpcmVjdGlvbiBtYXkgYmUgc3BlY2lmaWVkLCBpdCdzIHBvaW50bGVzcy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBwb3NzaWJsZSBkaXJlY3Rpb25zIGFyZSAiaW4iIGFuZCAib3V0IiwgCisgICAgICAgICAgICB1bmxpa2UgQ09SQkEgdGhlcmUgaXMgbm8gImlub3V0IgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHBvc3NpYmxlIHByb3BlcnR5IGFjY2VzcyBmbGFncyBhcmUgCisgICAgICAgICAgICAicmVhZHdyaXRlIiwgInJlYWQiLCBhbmQgIndyaXRlIgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTXVsdGlwbGUgaW50ZXJmYWNlcyBjYW4gb2YgY291cnNlIGJlIGxpc3RlZCBmb3IgCisgICAgICAgICAgICBvbmUgJmx0O25vZGUmZ3Q7LgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlICJuYW1lIiBhdHRyaWJ1dGUgb24gYXJndW1lbnRzIGlzIG9wdGlvbmFsLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgICAgTWV0aG9kLCBpbnRlcmZhY2UsIHByb3BlcnR5LCBhbmQgc2lnbmFsIGVsZW1lbnRzIG1heSBoYXZlCisgICAgICAgICJhbm5vdGF0aW9ucyIsIHdoaWNoIGFyZSBnZW5lcmljIGtleS92YWx1ZSBwYWlycyBvZiBtZXRhZGF0YS4KKyAgICAgICAgVGhleSBhcmUgc2ltaWxhciBjb25jZXB0dWFsbHkgdG8gSmF2YSdzIGFubm90YXRpb25zIGFuZCBDIyBhdHRyaWJ1dGVzLgorICAgICAgICBXZWxsLWtub3duIGFubm90YXRpb25zOgorICAgICA8L3BhcmE+CisgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXMgKHNlcGFyYXRlZCBieSAsKTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgPHRib2R5PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+dHJ1ZSxmYWxzZTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PldoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgZGVwcmVjYXRlZDsgZGVmYXVsdHMgdG8gZmFsc2U8L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT5UaGUgQyBzeW1ib2w7IG1heSBiZSB1c2VkIGZvciBtZXRob2RzIGFuZCBpbnRlcmZhY2VzPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgPGVudHJ5Pm9yZy5mcmVlZGVza3RvcC5EQnVzLk1ldGhvZC5Ob1JlcGx5PC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+dHJ1ZSxmYWxzZTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PklmIHNldCwgZG9uJ3QgZXhwZWN0IGEgcmVwbHkgdG8gdGhlIG1ldGhvZCBjYWxsOyBkZWZhdWx0cyB0byBmYWxzZS48L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydHkuRW1pdHNDaGFuZ2VkU2lnbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+dHJ1ZSxpbnZhbGlkYXRlcyxjb25zdCxmYWxzZTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIHRoZQorICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICBzaWduYWwsIHNlZSA8eHJlZgorICAgICAgICAgICAgICAgICBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXByb3BlcnRpZXMiLz4gaXMgbm90CisgICAgICAgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgZW1pdHRlZCBpZiB0aGUgcHJvcGVydHkgY2hhbmdlcy4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gPGxpdGVyYWw+Y29uc3Q8L2xpdGVyYWw+IHRoZSBwcm9wZXJ0eSBuZXZlcgorICAgICAgICAgICAgICAgICBjaGFuZ2VzIHZhbHVlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdCBpdAorICAgICAgICAgICAgICAgICBiZWxvbmdzIHRvLCBhbmQgaGVuY2UgdGhlIHNpZ25hbCBpcyBuZXZlciBlbWl0dGVkIGZvcgorICAgICAgICAgICAgICAgICBpdC4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gPGxpdGVyYWw+aW52YWxpZGF0ZXM8L2xpdGVyYWw+IHRoZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgaXMgZW1pdHRlZCBidXQgdGhlIHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgc2lnbmFsLgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0aGUgc2lnbmFsIGlzCisgICAgICAgICAgICAgICAgIGVtaXR0ZWQgd2l0aCB0aGUgdmFsdWUgaW5jbHVkZWQuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGZvciB0aGUgYW5ub3RhdGlvbiBkZWZhdWx0cyB0bworICAgICAgICAgICAgICAgICA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBpZiB0aGUgZW5jbG9zaW5nIGludGVyZmFjZQorICAgICAgICAgICAgICAgICBlbGVtZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGFubm90YXRpb24uIE90aGVyd2lzZSBpdAorICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBlbmNsb3NpbmcKKyAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGVsZW1lbnQuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgVGhpcyBhbm5vdGF0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY29kZQorICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzIHRvIGltcGxlbWVudCBjbGllbnQtc2lkZSBjYWNoaW5nIG9mCisgICAgICAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlcy4gRm9yIGFsbCBwcm9wZXJ0aWVzIGZvciB3aGljaCB0aGUKKyAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiBpcyBzZXQgdG8gPGxpdGVyYWw+Y29uc3Q8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pbnZhbGlkYXRlczwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdGhlIGNsaWVudCBtYXkKKyAgICAgICAgICAgICAgICAgdW5jb25kaXRpb25hbGx5IGNhY2hlIHRoZSB2YWx1ZXMgYXMgdGhlIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgZG9uJ3QgY2hhbmdlIG9yIG5vdGlmaWNhdGlvbnMgYXJlIGdlbmVyYXRlZCBmb3IgdGhlbQorICAgICAgICAgICAgICAgICBpZiB0aGV5IGRvLgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90Ym9keT4KKyAgICAgICA8L3Rncm91cD4KKyAgICAgPC9pbmZvcm1hbHRhYmxlPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9Im1lc3NhZ2UtYnVzIj4KKyAgICA8dGl0bGU+TWVzc2FnZSBCdXMgU3BlY2lmaWNhdGlvbjwvdGl0bGU+CisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1vdmVydmlldyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgT3ZlcnZpZXc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gb25lIG9yIG1vcmUgYXBwbGljYXRpb25zLiAKKyAgICAgICAgT25jZSBjb25uZWN0ZWQsIGFwcGxpY2F0aW9ucyBjYW4gZXhjaGFuZ2UgbWVzc2FnZXMgd2l0aCBvdGhlciAKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIGFsc28gY29ubmVjdGVkIHRvIHRoZSBidXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gb3JkZXIgdG8gcm91dGUgbWVzc2FnZXMgYW1vbmcgY29ubmVjdGlvbnMsIHRoZSBtZXNzYWdlIGJ1cyBrZWVwcyBhCisgICAgICAgIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBjb25uZWN0aW9ucy4gRWFjaCBjb25uZWN0aW9uIGhhcyBvbmUKKyAgICAgICAgdW5pcXVlLWZvci10aGUtbGlmZXRpbWUtb2YtdGhlLWJ1cyBuYW1lIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuCisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIGZvciBhIGNvbm5lY3Rpb24uIEFkZGl0aW9uYWwKKyAgICAgICAgbmFtZXMgYXJlIHVzdWFsbHkgIndlbGwta25vd24gbmFtZXMiIHN1Y2ggYXMKKyAgICAgICAgImNvbS5leGFtcGxlLlRleHRFZGl0b3IiLiBXaGVuIGEgbmFtZSBpcyBib3VuZCB0byBhIGNvbm5lY3Rpb24sCisgICAgICAgIHRoYXQgY29ubmVjdGlvbiBpcyBzYWlkIHRvIDxmaXJzdHRlcm0+b3duPC9maXJzdHRlcm0+IHRoZSBuYW1lLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBidXMgaXRzZWxmIG93bnMgYSBzcGVjaWFsIG5hbWUsCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPiwgd2l0aCBhbiBvYmplY3QKKyAgICAgICAgbG9jYXRlZCBhdCA8bGl0ZXJhbD4vb3JnL2ZyZWVkZXNrdG9wL0RCdXM8L2xpdGVyYWw+IHRoYXQKKyAgICAgICAgaW1wbGVtZW50cyB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+CisgICAgICAgIGludGVyZmFjZS4gVGhpcyBzZXJ2aWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gbWFrZQorICAgICAgICBhZG1pbmlzdHJhdGl2ZSByZXF1ZXN0cyBvZiB0aGUgYnVzIGl0c2VsZi4gRm9yIGV4YW1wbGUsCisgICAgICAgIGFwcGxpY2F0aW9ucyBjYW4gYXNrIHRoZSBidXMgdG8gYXNzaWduIGEgbmFtZSB0byBhIGNvbm5lY3Rpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCBuYW1lIG1heSBoYXZlIDxmaXJzdHRlcm0+cXVldWVkIG93bmVyczwvZmlyc3R0ZXJtPi4gIFdoZW4gYW4KKyAgICAgICAgYXBwbGljYXRpb24gcmVxdWVzdHMgYSBuYW1lIGZvciBhIGNvbm5lY3Rpb24gYW5kIHRoZSBuYW1lIGlzIGFscmVhZHkgaW4KKyAgICAgICAgdXNlLCB0aGUgYnVzIHdpbGwgb3B0aW9uYWxseSBhZGQgdGhlIGNvbm5lY3Rpb24gdG8gYSBxdWV1ZSB3YWl0aW5nIGZvciAKKyAgICAgICAgdGhlIG5hbWUuIElmIHRoZSBjdXJyZW50IG93bmVyIG9mIHRoZSBuYW1lIGRpc2Nvbm5lY3RzIG9yIHJlbGVhc2VzCisgICAgICAgIHRoZSBuYW1lLCB0aGUgbmV4dCBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSB3aWxsIGJlY29tZSB0aGUgbmV3IG93bmVyLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBmZWF0dXJlIGNhdXNlcyB0aGUgcmlnaHQgdGhpbmcgdG8gaGFwcGVuIGlmIHlvdSBzdGFydCB0d28gdGV4dAorICAgICAgICBlZGl0b3JzIGZvciBleGFtcGxlOyB0aGUgZmlyc3Qgb25lIG1heSByZXF1ZXN0ICJjb20uZXhhbXBsZS5UZXh0RWRpdG9yIiwKKyAgICAgICAgYW5kIHRoZSBzZWNvbmQgd2lsbCBiZSBxdWV1ZWQgYXMgYSBwb3NzaWJsZSBvd25lciBvZiB0aGF0IG5hbWUuIFdoZW4gCisgICAgICAgIHRoZSBmaXJzdCBleGl0cywgdGhlIHNlY29uZCB3aWxsIHRha2Ugb3Zlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgc2VuZCA8Zmlyc3R0ZXJtPnVuaWNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8KKyAgICAgICAgYSBzcGVjaWZpYyByZWNpcGllbnQgb3IgdG8gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZiwgb3IKKyAgICAgICAgPGZpcnN0dGVybT5icm9hZGNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8gYWxsIGludGVyZXN0ZWQgcmVjaXBpZW50cy4KKyAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmciLz4gZm9yIGRldGFpbHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1idXMtbmFtZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE5hbWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIGNvbm5lY3Rpb24gaGFzIGF0IGxlYXN0IG9uZSBuYW1lLCBhc3NpZ25lZCBhdCBjb25uZWN0aW9uIHRpbWUgYW5kCisgICAgICAgIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD4gbWV0aG9kIGNhbGwuICBUaGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHktYXNzaWduZWQgbmFtZSBpcyBjYWxsZWQgdGhlIGNvbm5lY3Rpb24ncyA8Zmlyc3R0ZXJtPnVuaXF1ZQorICAgICAgICBuYW1lPC9maXJzdHRlcm0+LiAgVW5pcXVlIG5hbWVzIGFyZSBuZXZlciByZXVzZWQgZm9yIHR3byBkaWZmZXJlbnQKKyAgICAgICAgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgYnVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE93bmVyc2hpcCBvZiBhIHVuaXF1ZSBuYW1lIGlzIGEgcHJlcmVxdWlzaXRlIGZvciBpbnRlcmFjdGlvbiB3aXRoIAorICAgICAgICB0aGUgbWVzc2FnZSBidXMuIEl0IGxvZ2ljYWxseSBmb2xsb3dzIHRoYXQgdGhlIHVuaXF1ZSBuYW1lIGlzIGFsd2F5cyAKKyAgICAgICAgdGhlIGZpcnN0IG5hbWUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjb21lcyB0byBvd24sIGFuZCB0aGUgbGFzdCAKKyAgICAgICAgb25lIHRoYXQgaXQgbG9zZXMgb3duZXJzaGlwIG9mLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIG11c3QgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICc6JyAoQVNDSUkgY29sb24KKyAgICAgICAgY2hhcmFjdGVyKTsgYnVzIG5hbWVzIHRoYXQgYXJlIG5vdCB1bmlxdWUgbmFtZXMgbXVzdCBub3QgYmVnaW4KKyAgICAgICAgd2l0aCB0aGlzIGNoYXJhY3Rlci4gKFRoZSBidXMgbXVzdCByZWplY3QgYW55IGF0dGVtcHQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgdG8gbWFudWFsbHkgcmVxdWVzdCBhIG5hbWUgYmVnaW5uaW5nIHdpdGggJzonLikgVGhpcyByZXN0cmljdGlvbgorICAgICAgICBjYXRlZ29yaWNhbGx5IHByZXZlbnRzICJzcG9vZmluZyI7IG1lc3NhZ2VzIHNlbnQgdG8gYSB1bmlxdWUgbmFtZQorICAgICAgICB3aWxsIGFsd2F5cyBnbyB0byB0aGUgZXhwZWN0ZWQgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGFsbCB0aGUgbmFtZXMgdGhhdCBpdCBvd25zIGFyZSBkZWxldGVkIChvcgorICAgICAgICB0cmFuc2ZlcnJlZCB0byB0aGUgbmV4dCBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSBpZiBhbnkpLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgY29ubmVjdGlvbiBjYW4gcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBpdCB1c2luZworICAgICAgICB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVxdWVzdE5hbWU8L2xpdGVyYWw+IG1lc3NhZ2UuIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtYnVzIi8+IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGEgdmFsaWQKKyAgICAgICAgbmFtZS4gVGhlc2UgbmFtZXMgY2FuIGJlIHJlbGVhc2VkIGFnYWluIHVzaW5nIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvbGl0ZXJhbD4gbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtcmVxdWVzdC1uYW1lIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBSZXF1ZXN0TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIHJlcXVlc3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5GbGFnczwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgbWV0aG9kIGNhbGwgc2hvdWxkIGJlIHNlbnQgdG8KKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4gYW5kIGFza3MgdGhlIG1lc3NhZ2UgYnVzIHRvCisgICAgICAgICAgYXNzaWduIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBtZXRob2QgY2FsbGVyLiBFYWNoIG5hbWUgbWFpbnRhaW5zIGEKKyAgICAgICAgICBxdWV1ZSBvZiBwb3NzaWJsZSBvd25lcnMsIHdoZXJlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBpcyB0aGUgcHJpbWFyeQorICAgICAgICAgIG9yIGN1cnJlbnQgb3duZXIgb2YgdGhlIG5hbWUuIEVhY2ggcG90ZW50aWFsIG93bmVyIGluIHRoZSBxdWV1ZQorICAgICAgICAgIG1haW50YWlucyB0aGUgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgYW5kCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIHNldHRpbmdzIGZyb20gaXRzIGxhdGVzdCBSZXF1ZXN0TmFtZQorICAgICAgICAgIGNhbGwuICBXaGVuIFJlcXVlc3ROYW1lIGlzIGludm9rZWQgdGhlIGZvbGxvd2luZyBvY2N1cnM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgdGhlIG1ldGhvZCBjYWxsZXIgaXMgY3VycmVudGx5IHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoZSBuYW1lLAorICAgICAgICAgICAgICAgIHRoZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBhbmQgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSB1cGRhdGVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBuZXcgUmVxdWVzdE5hbWUgY2FsbCwgCisgICAgICAgICAgICAgICAgYW5kIG5vdGhpbmcgZnVydGhlciBoYXBwZW5zLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHRoZSBjdXJyZW50IHByaW1hcnkgb3duZXIgKGhlYWQgb2YgdGhlIHF1ZXVlKSBoYXMKKyAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBzZXQsIGFuZCB0aGUgUmVxdWVzdE5hbWUKKyAgICAgICAgICAgICAgICBpbnZvY2F0aW9uIGhhcyB0aGUgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBmbGFnLCB0aGVuCisgICAgICAgICAgICAgICAgdGhlIGNhbGxlciBvZiBSZXF1ZXN0TmFtZSByZXBsYWNlcyB0aGUgY3VycmVudCBwcmltYXJ5IG93bmVyIGF0CisgICAgICAgICAgICAgICAgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCB0aGUgY3VycmVudCBwcmltYXJ5IG93bmVyIG1vdmVzIHRvIHRoZQorICAgICAgICAgICAgICAgIHNlY29uZCBwb3NpdGlvbiBpbiB0aGUgcXVldWUuIElmIHRoZSBjYWxsZXIgb2YgUmVxdWVzdE5hbWUgd2FzIAorICAgICAgICAgICAgICAgIGluIHRoZSBxdWV1ZSBwcmV2aW91c2x5IGl0cyBmbGFncyBhcmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSAKKyAgICAgICAgICAgICAgICB0aGUgbmV3IFJlcXVlc3ROYW1lIGluIGFkZGl0aW9uIHRvIG1vdmluZyBpdCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgcmVwbGFjZW1lbnQgaXMgbm90IHBvc3NpYmxlLCBhbmQgdGhlIG1ldGhvZCBjYWxsZXIgaXMKKyAgICAgICAgICAgICAgICBjdXJyZW50bHkgaW4gdGhlIHF1ZXVlIGJ1dCBub3QgdGhlIHByaW1hcnkgb3duZXIsIGl0cyBmbGFncyBhcmUKKyAgICAgICAgICAgICAgICB1cGRhdGVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBuZXcgUmVxdWVzdE5hbWUgY2FsbC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiByZXBsYWNlbWVudCBpcyBub3QgcG9zc2libGUsIGFuZCB0aGUgbWV0aG9kIGNhbGxlciBpcworICAgICAgICAgICAgICAgIGN1cnJlbnRseSBub3QgaW4gdGhlIHF1ZXVlLCB0aGUgbWV0aG9kIGNhbGxlciBpcyBhcHBlbmRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiBhbnkgY29ubmVjdGlvbiBpbiB0aGUgcXVldWUgaGFzIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRQorICAgICAgICAgICAgICAgIHNldCBhbmQgaXMgbm90IHRoZSBwcmltYXJ5IG93bmVyLCBpdCBpcyByZW1vdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgcXVldWUuIFRoaXMgY2FuIGFwcGx5IHRvIHRoZSBwcmV2aW91cyBwcmltYXJ5IG93bmVyIChpZiBpdAorICAgICAgICAgICAgICAgIHdhcyByZXBsYWNlZCkgb3IgdGhlIG1ldGhvZCBjYWxsZXIgKGlmIGl0IHVwZGF0ZWQgdGhlCisgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIGZsYWcgd2hpbGUgc3RpbGwgc3R1Y2sgaW4gdGhlCisgICAgICAgICAgICAgICAgcXVldWUsIG9yIGlmIGl0IHdhcyBqdXN0IGFkZGVkIHRvIHRoZSBxdWV1ZSB3aXRoIHRoYXQgZmxhZyBzZXQpLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGUgdGhhdCBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHJlc3VsdHMgaW4gImp1bXBpbmcgdGhlCisgICAgICAgICAgcXVldWUsIiBldmVuIGlmIGFub3RoZXIgYXBwbGljYXRpb24gYWxyZWFkeSBpbiB0aGUgcXVldWUgaGFkIHNwZWNpZmllZAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuICBUaGlzIGNvbWVzIHVwIGlmIGEgcHJpbWFyeSBvd25lcgorICAgICAgICAgIHRoYXQgZG9lcyBub3QgYWxsb3cgcmVwbGFjZW1lbnQgZ29lcyBhd2F5LCBhbmQgdGhlIG5leHQgcHJpbWFyeSBvd25lcgorICAgICAgICAgIGRvZXMgYWxsb3cgcmVwbGFjZW1lbnQuIEluIHRoaXMgY2FzZSwgcXVldWVkIGl0ZW1zIHRoYXQgc3BlY2lmaWVkCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyA8ZW1waGFzaXM+ZG8gbm90PC9lbXBoYXNpcz4KKyAgICAgICAgICBhdXRvbWF0aWNhbGx5IHJlcGxhY2UgdGhlIG5ldyBwcmltYXJ5IG93bmVyLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGlzIG5vdCBzYXZlZCwgaXQgaXMgb25seSB1c2VkIGF0IHRoZQorICAgICAgICAgIHRpbWUgUmVxdWVzdE5hbWUgaXMgY2FsbGVkLiBUaGlzIGlzIGRlbGliZXJhdGUgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgIGFueXRpbWUgdHdvIGFwcGxpY2F0aW9ucyBhcmUgYm90aCBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCAKKyAgICAgICAgICBhbmQgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZmxhZ3MgYXJndW1lbnQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGxvZ2ljYWxseSBPUmVkCisgICAgICAgICAgdG9nZXRoZXI6CisKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MHgxPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKworICAgICAgICAgICAgICAgICAgICBJZiBhbiBhcHBsaWNhdGlvbiBBIHNwZWNpZmllcyB0aGlzIGZsYWcgYW5kIHN1Y2NlZWRzIGluCisgICAgICAgICAgICAgICAgICAgIGJlY29taW5nIHRoZSBvd25lciBvZiB0aGUgbmFtZSwgYW5kIGFub3RoZXIgYXBwbGljYXRpb24gQgorICAgICAgICAgICAgICAgICAgICBsYXRlciBjYWxscyBSZXF1ZXN0TmFtZSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGZsYWcsIHRoZW4gYXBwbGljYXRpb24gQQorICAgICAgICAgICAgICAgICAgICB3aWxsIGxvc2Ugb3duZXJzaGlwIGFuZCByZWNlaXZlIGEKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3Q8L2xpdGVyYWw+IHNpZ25hbCwgYW5kCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIEIgd2lsbCBiZWNvbWUgdGhlIG5ldyBvd25lci4gSWYgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQKKyAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZCBieSBhcHBsaWNhdGlvbiBBLCBvciBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb24gQiwgdGhlbiBhcHBsaWNhdGlvbiBCIHdpbGwgbm90IHJlcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gQSBhcyB0aGUgb3duZXIuCisKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4weDI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIFRyeSB0byByZXBsYWNlIHRoZSBjdXJyZW50IG93bmVyIGlmIHRoZXJlIGlzIG9uZS4gSWYgdGhpcworICAgICAgICAgICAgICAgICAgICBmbGFnIGlzIG5vdCBzZXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgb25seSBiZWNvbWUgdGhlIG93bmVyIG9mCisgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgb3duZXIuIElmIHRoaXMgZmxhZyBpcyBzZXQsCisgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgb3duZXIgaWYKKyAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgb3duZXIgc3BlY2lmaWVkIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5ULgorCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4weDQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIFdpdGhvdXQgdGhpcyBmbGFnLCBpZiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhIG5hbWUgdGhhdCBpcworICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IG93bmVkLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwbGFjZWQgaW4gYSBxdWV1ZSB0bworICAgICAgICAgICAgICAgICAgICBvd24gdGhlIG5hbWUgd2hlbiB0aGUgY3VycmVudCBvd25lciBnaXZlcyBpdCB1cC4gSWYgdGhpcworICAgICAgICAgICAgICAgICAgICBmbGFnIGlzIGdpdmVuLCB0aGUgYXBwbGljYXRpb24gd2lsbCBub3QgYmUgcGxhY2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdGhlIHJlcXVlc3QgZm9yIHRoZSBuYW1lIHdpbGwgc2ltcGx5IGZhaWwuICBUaGlzIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgYWxzbyBhZmZlY3RzIGJlaGF2aW9yIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgcmVwbGFjZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBvd25lcjsgYnkgZGVmYXVsdCB0aGUgYXBwbGljYXRpb24gbW92ZXMgYmFjayBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHF1ZXVlLCB1bmxlc3MgdGhpcyBmbGFnIHdhcyBwcm92aWRlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBiZWNhbWUgdGhlIG5hbWUgb3duZXIuCisKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisKKyAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PiA8ZW50cnk+VGhlIGNhbGxlciBpcyBub3cgdGhlIHByaW1hcnkgb3duZXIgb2YKKyAgICAgICAgICAgICAgICAgIHRoZSBuYW1lLCByZXBsYWNpbmcgYW55IHByZXZpb3VzIG93bmVyLiBFaXRoZXIgdGhlIG5hbWUgaGFkIG5vCisgICAgICAgICAgICAgICAgICBvd25lciBiZWZvcmUsIG9yIHRoZSBjYWxsZXIgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGFuZCB0aGUgY3VycmVudCBvd25lciBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5ULjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9JTl9RVUVVRTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisKKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbmFtZSBhbHJlYWR5IGhhZCBhbiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIHdhcyBub3Qgc3BlY2lmaWVkLCBhbmQgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG93bmVyIGRpZCBub3Qgc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvciB0aGUgcmVxdWVzdGluZworICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkaWQgbm90IHNwZWNpZnkgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0VYSVNUUzwvZW50cnk+IDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbmFtZSBhbHJlYWR5IGhhcyBhbiBvd25lciwKKyAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSB3YXMgc3BlY2lmaWVkLCBhbmQgZWl0aGVyCisgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCB3YXMgbm90IHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnQgb3duZXIsIG9yIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgd2FzIG5vdAorICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9BTFJFQURZX09XTkVSPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgYXBwbGljYXRpb24gdHJ5aW5nIHRvIHJlcXVlc3Qgb3duZXJzaGlwIG9mIGEgbmFtZSBpcyBhbHJlYWR5IHRoZSBvd25lciBvZiBpdC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9zZWN0Mz4KKworICAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXJlbGVhc2UtbmFtZSI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgUmVsZWFzZU5hbWUgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgdG8gcmVsZWFzZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgbWV0aG9kIGNhbGwgc2hvdWxkIGJlIHNlbnQgdG8KKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4gYW5kIGFza3MgdGhlIG1lc3NhZ2UgYnVzIHRvCisgICAgICAgICAgcmVsZWFzZSB0aGUgbWV0aG9kIGNhbGxlcidzIGNsYWltIHRvIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgY2FsbGVyIGlzCisgICAgICAgICAgdGhlIHByaW1hcnkgb3duZXIsIGEgbmV3IHByaW1hcnkgb3duZXIgd2lsbCBiZSBzZWxlY3RlZCBmcm9tIHRoZQorICAgICAgICAgIHF1ZXVlIGlmIGFueSBvdGhlciBvd25lcnMgYXJlIHdhaXRpbmcuIElmIHRoZSBjYWxsZXIgaXMgd2FpdGluZyBpbgorICAgICAgICAgIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUsIHRoZSBjYWxsZXIgd2lsbCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZAorICAgICAgICAgIHdpbGwgbm90IGJlIG1hZGUgYW4gb3duZXIgb2YgdGhlIG5hbWUgaWYgaXQgbGF0ZXIgYmVjb21lcyBhdmFpbGFibGUuCisgICAgICAgICAgSWYgdGhlcmUgYXJlIG5vIG90aGVyIG93bmVycyBpbiB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCBpdCB3aWxsIGJlCisgICAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBidXMgZW50aXJlbHkuCisKKyAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4gPGVudHJ5PlRoZSBjYWxsZXIgaGFzIHJlbGVhc2VkIGhpcyBjbGFpbSBvbgorICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUuIEVpdGhlciB0aGUgY2FsbGVyIHdhcyB0aGUgcHJpbWFyeSBvd25lciBvZgorICAgICAgICAgICAgICAgICAgdGhlIG5hbWUsIGFuZCB0aGUgbmFtZSBpcyBub3cgdW51c2VkIG9yIHRha2VuIGJ5IHNvbWVib2R5CisgICAgICAgICAgICAgICAgICB3YWl0aW5nIGluIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUsIG9yIHRoZSBjYWxsZXIgd2FzIHdhaXRpbmcKKyAgICAgICAgICAgICAgICAgIGluIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUgYW5kIGhhcyBub3cgYmVlbiByZW1vdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICBxdWV1ZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9OX0VYSVNURU5UPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIGJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgY2FsbGVyIHdhcyBub3QgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhpcyBuYW1lLAorICAgICAgICAgICAgICAgICAgYW5kIHdhcyBhbHNvIG5vdCB3YWl0aW5nIGluIHRoZSBxdWV1ZSB0byBvd24gdGhpcyBuYW1lLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L3NlY3QzPgorCisgICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbGlzdC1xdWV1ZWQtb3duZXJzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RRdWV1ZWRPd25lcnM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgU1RSSU5HIExpc3RRdWV1ZWRPd25lcnMgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSB3ZWxsLWtub3duIGJ1cyBuYW1lIHRvIHF1ZXJ5LCBzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLmNhcHB1Y2Npbm88L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSB1bmlxdWUgYnVzIG5hbWVzIG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBxdWV1ZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBjYWxsIHNob3VsZCBiZSBzZW50IHRvCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IGFuZCBsaXN0cyB0aGUgY29ubmVjdGlvbnMKKyAgICAgICAgICBjdXJyZW50bHkgcXVldWVkIGZvciBhIGJ1cyBuYW1lIChzZWUKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXF1ZXVlZC1vd25lciIvPikuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmciPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE1lc3NhZ2UgUm91dGluZzwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBNZXNzYWdlcyBtYXkgaGF2ZSBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCAoc2VlIDx4cmVmCisgICAgICAgICAgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1oZWFkZXItZmllbGRzIi8+KSwgcmVzdWx0aW5nIGluIGEKKyAgICAgICAgPGZpcnN0dGVybT51bmljYXN0IG1lc3NhZ2U8L2ZpcnN0dGVybT4uICBJZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIG1lc3NhZ2UKKyAgICAgICAgcmVjaXBpZW50IGJ5IG5hbWUuIE1ldGhvZCBjYWxscyBhbmQgcmVwbGllcyBub3JtYWxseSBzcGVjaWZ5IHRoaXMgZmllbGQuCisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtdXN0IHNlbmQgbWVzc2FnZXMgKG9mIGFueSB0eXBlKSB3aXRoIHRoZQorICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgc2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVjaXBpZW50LAorICAgICAgICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlY2lwaWVudCBoYXMgc2V0IHVwIGEgbWF0Y2ggcnVsZSBtYXRjaGluZworICAgICAgICB0aGUgbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gdGhlIG1lc3NhZ2UgYnVzIHJlY2VpdmVzIGEgc2lnbmFsLCBpZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIGFic2VudCwgaXQgaXMgY29uc2lkZXJlZCB0bworICAgICAgICBiZSBhIDxmaXJzdHRlcm0+YnJvYWRjYXN0IHNpZ25hbDwvZmlyc3R0ZXJtPiwgYW5kIGlzIHNlbnQgdG8gYWxsCisgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIDxmaXJzdHRlcm0+bWVzc2FnZSBtYXRjaGluZyBydWxlczwvZmlyc3R0ZXJtPiB0aGF0CisgICAgICAgIG1hdGNoIHRoZSBtZXNzYWdlLiBNb3N0IHNpZ25hbCBtZXNzYWdlcyBhcmUgYnJvYWRjYXN0cywgYW5kCisgICAgICAgIG5vIG90aGVyIG1lc3NhZ2UgdHlwZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uCisgICAgICAgIG1heSBiZSBicm9hZGNhc3QuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBVbmljYXN0IHNpZ25hbCBtZXNzYWdlcyAodGhvc2Ugd2l0aCBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICBmaWVsZCkgYXJlIG5vdCBjb21tb25seSB1c2VkLCBidXQgdGhleSBhcmUgdHJlYXRlZCBsaWtlIGFueSB1bmljYXN0CisgICAgICAgIG1lc3NhZ2U6IHRoZXkgYXJlIGRlbGl2ZXJlZCB0byB0aGUgc3BlY2lmaWVkIHJlY2VpcGllbnQsCisgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXRzIG1hdGNoIHJ1bGVzLiAgT25lIHVzZSBmb3IgdW5pY2FzdCBzaWduYWxzIGlzIHRvCisgICAgICAgIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gd2hpY2ggYSBzaWduYWwgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGludGVuZGVkCisgICAgICAgIHJlY2lwaWVudCBjYW4gY2FsbCA8eHJlZiBsaW5rZW5kPSJidXMtbWVzc2FnZXMtYWRkLW1hdGNoIi8+IHRvCisgICAgICAgIHJlY2VpdmUgdGhhdCBzaWduYWw6IGlmIHRoZSBzaWduYWwgaXMgc2VudCBkaXJlY3RseSB0byB0aGF0IHJlY2lwaWVudAorICAgICAgICB1c2luZyBhIHVuaWNhc3QgbWVzc2FnZSwgaXQgZG9lcyBub3QgbmVlZCB0byBhZGQgYSBtYXRjaCBydWxlIGF0IGFsbCwKKyAgICAgICAgYW5kIHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9uLiAgQW5vdGhlciB1c2UgZm9yIHVuaWNhc3Qgc2lnbmFscywKKyAgICAgICAgb24gbWVzc2FnZSBidXNlcyB3aG9zZSBzZWN1cml0eSBwb2xpY3kgcHJldmVudHMgZWF2ZXNkcm9wcGluZywgaXMgdG8KKyAgICAgICAgc2VuZCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2hpY2ggc2hvdWxkIG9ubHkgYmUgdmlzaWJsZSB0byBvbmUKKyAgICAgICAgcmVjaXBpZW50LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgV2hlbiB0aGUgbWVzc2FnZSBidXMgcmVjZWl2ZXMgYSBtZXRob2QgY2FsbCwgaWYgdGhlCisgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCBpcyBhYnNlbnQsIHRoZSBjYWxsIGlzIHRha2VuIHRvIGJlCisgICAgICAgIGEgc3RhbmRhcmQgb25lLXRvLW9uZSBtZXNzYWdlIGFuZCBpbnRlcnByZXRlZCBieSB0aGUgbWVzc2FnZSBidXMKKyAgICAgICAgaXRzZWxmLiBGb3IgZXhhbXBsZSwgc2VuZGluZyBhbgorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLlBpbmc8L2xpdGVyYWw+IG1lc3NhZ2Ugd2l0aCBubworICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gd2lsbCBjYXVzZSB0aGUgbWVzc2FnZSBidXMgaXRzZWxmIHRvCisgICAgICAgIHJlcGx5IHRvIHRoZSBwaW5nIGltbWVkaWF0ZWx5OyB0aGUgbWVzc2FnZSBidXMgd2lsbCBub3QgbWFrZSB0aGlzCisgICAgICAgIG1lc3NhZ2UgdmlzaWJsZSB0byBvdGhlciBhcHBsaWNhdGlvbnMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBDb250aW51aW5nIHRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLlBpbmc8L2xpdGVyYWw+IGV4YW1wbGUsIGlmCisgICAgICAgIHRoZSBwaW5nIG1lc3NhZ2Ugd2VyZSBzZW50IHdpdGggYSA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gbmFtZSBvZgorICAgICAgICA8bGl0ZXJhbD5jb20ueW95b2R5bmUuU2NyZWVuc2F2ZXI8L2xpdGVyYWw+LCB0aGVuIHRoZSBwaW5nIHdvdWxkIGJlCisgICAgICAgIGZvcndhcmRlZCwgYW5kIHRoZSBZb3lvZHluZSBDb3Jwb3JhdGlvbiBzY3JlZW5zYXZlciBhcHBsaWNhdGlvbiB3b3VsZCBiZQorICAgICAgICBleHBlY3RlZCB0byByZXBseSB0byB0aGUgcGluZy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIE1lc3NhZ2UgYnVzIGltcGxlbWVudGF0aW9ucyBtYXkgaW1wb3NlIGEgc2VjdXJpdHkgcG9saWN5IHdoaWNoCisgICAgICAgIHByZXZlbnRzIGNlcnRhaW4gbWVzc2FnZXMgZnJvbSBiZWluZyBzZW50IG9yIHJlY2VpdmVkLgorICAgICAgICBXaGVuIGEgbWV0aG9kIGNhbGwgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBvciByZWNlaXZlZCBkdWUgdG8gYSBzZWN1cml0eQorICAgICAgICBwb2xpY3ksIHRoZSBtZXNzYWdlIGJ1cyBzaG91bGQgc2VuZCBhbiBlcnJvciByZXBseSwgdW5sZXNzIHRoZQorICAgICAgICBvcmlnaW5hbCBtZXNzYWdlIGhhZCB0aGUgPGxpdGVyYWw+Tk9fUkVQTFk8L2xpdGVyYWw+IGZsYWcuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtcm91dGluZy1lYXZlc2Ryb3BwaW5nIj4KKyAgICAgICAgPHRpdGxlPkVhdmVzZHJvcHBpbmc8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSZWNlaXZpbmcgYSB1bmljYXN0IG1lc3NhZ2Ugd2hvc2UgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgaW5kaWNhdGVzIGEgZGlmZmVyZW50IHJlY2lwaWVudCBpcyBjYWxsZWQKKyAgICAgICAgICA8Zmlyc3R0ZXJtPmVhdmVzZHJvcHBpbmc8L2ZpcnN0dGVybT4uIE9uIGEgbWVzc2FnZSBidXMgd2hpY2ggYWN0cyBhcworICAgICAgICAgIGEgc2VjdXJpdHkgYm91bmRhcnkgKGxpa2UgdGhlIHN0YW5kYXJkIHN5c3RlbSBidXMpLCB0aGUgc2VjdXJpdHkKKyAgICAgICAgICBwb2xpY3kgc2hvdWxkIHVzdWFsbHkgcHJldmVudCBlYXZlc2Ryb3BwaW5nLCBzaW5jZSB1bmljYXN0IG1lc3NhZ2VzCisgICAgICAgICAgYXJlIG5vcm1hbGx5IGtlcHQgcHJpdmF0ZSBhbmQgbWF5IGNvbnRhaW4gc2VjdXJpdHktc2Vuc2l0aXZlCisgICAgICAgICAgaW5mb3JtYXRpb24uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFYXZlc2Ryb3BwaW5nIGlzIG1haW5seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0b29scywgc3VjaCBhcworICAgICAgICAgIHRoZSA8bGl0ZXJhbD5kYnVzLW1vbml0b3I8L2xpdGVyYWw+IHRvb2wgaW4gdGhlIHJlZmVyZW5jZQorICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIEQtQnVzLiBUb29scyB3aGljaCBlYXZlc2Ryb3Agb24gdGhlIG1lc3NhZ2UgYnVzCisgICAgICAgICAgc2hvdWxkIGJlIGNhcmVmdWwgdG8gYXZvaWQgc2VuZGluZyBhIHJlcGx5IG9yIGVycm9yIGluIHJlc3BvbnNlIHRvCisgICAgICAgICAgbWVzc2FnZXMgaW50ZW5kZWQgZm9yIGEgZGlmZmVyZW50IGNsaWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENsaWVudHMgbWF5IGF0dGVtcHQgdG8gZWF2ZXNkcm9wIGJ5IGFkZGluZyBtYXRjaCBydWxlcworICAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcyIvPikgY29udGFpbmluZworICAgICAgICAgIHRoZSA8bGl0ZXJhbD5lYXZlc2Ryb3A9J3RydWUnPC9saXRlcmFsPiBtYXRjaC4gSWYgdGhlIG1lc3NhZ2UgYnVzJworICAgICAgICAgIHNlY3VyaXR5IHBvbGljeSBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nLCB0aGUgbWF0Y2ggcnVsZSBjYW4KKyAgICAgICAgICBzdGlsbCBiZSBhZGRlZCwgYnV0IHdpbGwgbm90IGhhdmUgYW55IHByYWN0aWNhbCBlZmZlY3QuIEZvcgorICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBtZXNzYWdlIGJ1cyBpbXBsZW1lbnRhdGlvbnMsIGlmIGFkZGluZyBzdWNoCisgICAgICAgICAgYSBtYXRjaCBydWxlIHJlc3VsdHMgaW4gYW4gZXJyb3IgcmVwbHksIHRoZSBjbGllbnQgbWF5IGZhbGwgYmFjayB0bworICAgICAgICAgIGFkZGluZyB0aGUgc2FtZSBydWxlIHdpdGggdGhlIDxsaXRlcmFsPmVhdmVzZHJvcDwvbGl0ZXJhbD4gbWF0Y2gKKyAgICAgICAgICBvbWl0dGVkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWF2ZXNkcm9wcGluZyBpbnRlcmFjdHMgcG9vcmx5IHdpdGggYnVzZXMgd2l0aCBub24tdHJpdmlhbAorICAgICAgICAgIGFjY2VzcyBjb250cm9sIHJlc3RyaWN0aW9ucy4gVGhlCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWJlY29tZS1tb25pdG9yIi8+IG1ldGhvZCBwcm92aWRlcworICAgICAgICAgIGFuIGFsdGVybmF0aXZlIHdheSB0byBtb25pdG9yIGJ1c2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmctbWF0Y2gtcnVsZXMiPgorICAgICAgICA8dGl0bGU+TWF0Y2ggUnVsZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbiBpbXBvcnRhbnQgcGFydCBvZiB0aGUgbWVzc2FnZSBidXMgcm91dGluZyBwcm90b2NvbCBpcyBtYXRjaAorICAgICAgICAgIHJ1bGVzLiBNYXRjaCBydWxlcyBkZXNjcmliZSB0aGUgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byBhCisgICAgICAgICAgY2xpZW50LCBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuICBCcm9hZGNhc3Qgc2lnbmFscworICAgICAgICAgIGFyZSBvbmx5IHNlbnQgdG8gY2xpZW50cyB3aGljaCBoYXZlIGEgc3VpdGFibGUgbWF0Y2ggcnVsZTogdGhpcworICAgICAgICAgIGF2b2lkcyB3YWtpbmcgdXAgY2xpZW50IHByb2Nlc3NlcyB0byBkZWFsIHdpdGggc2lnbmFscyB0aGF0IGFyZQorICAgICAgICAgIG5vdCByZWxldmFudCB0byB0aGF0IGNsaWVudC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZXNzYWdlcyB0aGF0IGxpc3QgYSBjbGllbnQgYXMgdGhlaXIgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgZG8gbm90IG5lZWQgdG8gbWF0Y2ggdGhlIGNsaWVudCdzIG1hdGNoIHJ1bGVzLCBhbmQgYXJlIHNlbnQgdG8gdGhhdAorICAgICAgICAgIGNsaWVudCByZWdhcmRsZXNzLiBBcyBhIHJlc3VsdCwgbWF0Y2ggcnVsZXMgYXJlIG1haW5seSB1c2VkIHRvCisgICAgICAgICAgcmVjZWl2ZSBhIHN1YnNldCBvZiBicm9hZGNhc3Qgc2lnbmFscy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNYXRjaCBydWxlcyBjYW4gYWxzbyBiZSB1c2VkIGZvciBlYXZlc2Ryb3BwaW5nCisgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLWVhdmVzZHJvcHBpbmciLz4pLAorICAgICAgICAgIGlmIHRoZSBzZWN1cml0eSBwb2xpY3kgb2YgdGhlIG1lc3NhZ2UgYnVzIGFsbG93cyBpdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNYXRjaCBydWxlcyBhcmUgYWRkZWQgdXNpbmcgdGhlIEFkZE1hdGNoIGJ1cyBtZXRob2QgCisgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJidXMtbWVzc2FnZXMtYWRkLW1hdGNoIi8+KS4gIFJ1bGVzIGFyZQorICAgICAgICAgIHNwZWNpZmllZCBhcyBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQga2V5L3ZhbHVlIHBhaXJzLiAKKyAgICAgICAgICBFeGNsdWRpbmcgYSBrZXkgZnJvbSB0aGUgcnVsZSBpbmRpY2F0ZXMgYSB3aWxkY2FyZCBtYXRjaC4gIAorICAgICAgICAgIEZvciBpbnN0YW5jZSBleGNsdWRpbmcgdGhlIHRoZSBtZW1iZXIgZnJvbSBhIG1hdGNoIHJ1bGUgYnV0IAorICAgICAgICAgIGFkZGluZyBhIHNlbmRlciB3b3VsZCBsZXQgYWxsIG1lc3NhZ2VzIGZyb20gdGhhdCBzZW5kZXIgdGhyb3VnaC4KKyAgICAgICAgICBBbiBleGFtcGxlIG9mIGEgY29tcGxldGUgcnVsZSB3b3VsZCBiZSAKKyAgICAgICAgICAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxpbnRlcmZhY2U9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxtZW1iZXI9J0ZvbycscGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JyxhcmcyPSdiYXInIgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdpdGhpbiBzaW5nbGUgcXVvdGVzIChBU0NJSSBhcG9zdHJvcGhlLCBVKzAwMjcpLCBhIGJhY2tzbGFzaAorICAgICAgICAgIChVKzAwNUMpIHJlcHJlc2VudHMgaXRzZWxmLCBhbmQgYW4gYXBvc3Ryb3BoZSBlbmRzIHRoZSBxdW90ZWQKKyAgICAgICAgICBzZWN0aW9uLiBPdXRzaWRlIHNpbmdsZSBxdW90ZXMsIFwnIChiYWNrc2xhc2gsIGFwb3N0cm9waGUpCisgICAgICAgICAgcmVwcmVzZW50cyBhbiBhcG9zdHJvcGhlLCBhbmQgYW55IGJhY2tzbGFzaCBub3QgZm9sbG93ZWQgYnkKKyAgICAgICAgICBhbiBhcG9zdHJvcGhlIHJlcHJlc2VudHMgaXRzZWxmLiBGb3IgaW5zdGFuY2UsIHRoZSBtYXRjaCBydWxlcworICAgICAgICAgIDxsaXRlcmFsPmFyZzA9JydcJycnLGFyZzE9J1wnLGFyZzI9JywnLGFyZzM9J1xcJzwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgPGxpdGVyYWw+YXJnMD1cJyxhcmcxPVwsYXJnMj0nLCcsYXJnMz1cXDwvbGl0ZXJhbD4KKyAgICAgICAgICBib3RoIG1hdGNoIG1lc3NhZ2VzIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGEgMS1jaGFyYWN0ZXIgc3RyaW5nCisgICAgICAgICAgY29udGFpbmluZyBhbiBhcG9zdHJvcGhlLCBhIDEtY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIGEKKyAgICAgICAgICBiYWNrc2xhc2gsIGEgMS1jaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb21tYSwgYW5kIGEKKyAgICAgICAgICAyLWNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0d28gYmFja3NsYXNoZXM8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhpcyBpZGlvc3luY3JhdGljIHF1b3Rpbmcgc3R5bGUgaXMgYmFzZWQgb24gdGhlIHJ1bGVzIGZvcgorICAgICAgICAgICAgICBlc2NhcGluZyBpdGVtcyB0byBhcHBlYXIgaW5zaWRlIHNpbmdsZS1xdW90ZWQgc3RyaW5ncworICAgICAgICAgICAgICBpbiBQT1NJWCA8bGl0ZXJhbD4vYmluL3NoPC9saXRlcmFsPiwgYnV0IHBsZWFzZQorICAgICAgICAgICAgICBub3RlIHRoYXQgYmFja3NsYXNoZXMgdGhhdCBhcmUgbm90IGluc2lkZSBzaW5nbGUgcXVvdGVzIGhhdmUKKyAgICAgICAgICAgICAgZGlmZmVyZW50IGJlaGF2aW91ci4gVGhpcyBzeW50YXggZG9lcyBub3Qgb2ZmZXIgYW55IHdheSB0bworICAgICAgICAgICAgICByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSBpbnNpZGUgc2luZ2xlIHF1b3RlcyAoaXQgaXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgIHRvIGxlYXZlIHRoZSBzaW5nbGUtcXVvdGVkIHNlY3Rpb24sIGJhY2tzbGFzaC1lc2NhcGUgdGhlCisgICAgICAgICAgICAgIGFwb3N0cm9waGUgYW5kIHJlLWVudGVyIHNpbmdsZSBxdW90ZXMpLCBvciB0byByZXByZXNlbnQgYQorICAgICAgICAgICAgICBjb21tYSBvdXRzaWRlIHNpbmdsZSBxdW90ZXMgKGl0IGlzIG5lY2Vzc2FyeSB0byB3cmFwIGl0IGluCisgICAgICAgICAgICAgIGEgc2luZ2xlLXF1b3RlZCBzZWN0aW9uKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2Zvb3Rub3RlPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSAKKyAgICAgICAgICBhIG1hdGNoIHJ1bGUuCisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5LZXk8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlBvc3NpYmxlIFZhbHVlczwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD50eXBlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+J3NpZ25hbCcsICdtZXRob2RfY2FsbCcsICdtZXRob2RfcmV0dXJuJywgJ2Vycm9yJzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggb24gdGhlIG1lc3NhZ2UgdHlwZS4gIEFuIGV4YW1wbGUgb2YgYSB0eXBlIG1hdGNoIGlzIHR5cGU9J3NpZ25hbCc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+c2VuZGVyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QSBidXMgb3IgdW5pcXVlIG5hbWUgKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLWJ1cy1uYW1lIi8+CisgICAgICAgICAgICAgICAgICBhbmQgPHhyZWYgbGlua2VuZD0idGVybS11bmlxdWUtbmFtZSIvPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoIG1lc3NhZ2VzIHNlbnQgYnkgYSBwYXJ0aWN1bGFyIHNlbmRlci4gIEFuIGV4YW1wbGUgb2YgYSBzZW5kZXIgbWF0Y2gKKyAgICAgICAgICAgICAgICAgIGlzIHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkhhbCc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+aW50ZXJmYWNlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW4gaW50ZXJmYWNlIG5hbWUgKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSIvPik8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoIG1lc3NhZ2VzIHNlbnQgb3ZlciBvciB0byBhIHBhcnRpY3VsYXIgaW50ZXJmYWNlLiAgQW4gZXhhbXBsZSBvZiBhbgorICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIG1hdGNoIGlzIGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkhhbC5NYW5hZ2VyJy4KKyAgICAgICAgICAgICAgICAgIElmIGEgbWVzc2FnZSBvbWl0cyB0aGUgaW50ZXJmYWNlIGhlYWRlciwgaXQgbXVzdCBub3QgbWF0Y2ggYW55IHJ1bGUgCisgICAgICAgICAgICAgICAgICB0aGF0IHNwZWNpZmllcyB0aGlzIGtleS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+bWVtYmVyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW55IHZhbGlkIG1ldGhvZCBvciBzaWduYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2hlcyBtZXNzYWdlcyB3aGljaCBoYXZlIHRoZSBnaXZlIG1ldGhvZCBvciBzaWduYWwgbmFtZS4gQW4gZXhhbXBsZSBvZgorICAgICAgICAgICAgICAgICAgYSBtZW1iZXIgbWF0Y2ggaXMgbWVtYmVyPSdOYW1lT3duZXJDaGFuZ2VkJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5wYXRoPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW4gb2JqZWN0IHBhdGggKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmctb2JqZWN0LXBhdGgiLz4pPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGFyZSBzZW50IGZyb20gb3IgdG8gdGhlIGdpdmVuIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBhCisgICAgICAgICAgICAgICAgICBwYXRoIG1hdGNoIGlzIHBhdGg9Jy9vcmcvZnJlZWRlc2t0b3AvSGFsL01hbmFnZXInPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnBhdGhfbmFtZXNwYWNlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW4gb2JqZWN0IHBhdGg8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGFyZSBzZW50IGZyb20gb3IgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHdoaWNoIHRoZSBvYmplY3QgcGF0aCBpcyBlaXRoZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdmFsdWUsIG9yIHRoYXQgdmFsdWUgZm9sbG93ZWQgYnkgb25lIG9yCisgICAgICAgICAgICAgICAgICAgICAgbW9yZSBwYXRoIGNvbXBvbmVudHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5wYXRoX25hbWVzcGFjZT0nL2NvbS9leGFtcGxlL2Zvbyc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgd291bGQgbWF0Y2ggc2lnbmFscyBzZW50IGJ5CisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L2NvbS9leGFtcGxlL2ZvbzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBvciBieQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9mb28vYmFyPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICBidXQgbm90IGJ5CisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L2NvbS9leGFtcGxlL2Zvb2JhcjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICBVc2luZyBib3RoIDxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+IGFuZAorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnBhdGhfbmFtZXNwYWNlPC9saXRlcmFsPiBpbiB0aGUgc2FtZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUgaXMgbm90IGFsbG93ZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1hdGNoIGtleSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAwLjE2IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgRC1CdXMgc3BlY2lmaWNhdGlvbiBhbmQgaW1wbGVtZW50ZWQgYnkgdGhlIGJ1cworICAgICAgICAgICAgICAgICAgICAgICAgZGFlbW9uIGluIGRidXMgMS41LjAgYW5kIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+ZGVzdGluYXRpb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BIHVuaXF1ZSBuYW1lIChzZWUgPHhyZWYgbGlua2VuZD0idGVybS11bmlxdWUtbmFtZSIvPik8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggYXJlIGJlaW5nIHNlbnQgdG8gdGhlIGdpdmVuIHVuaXF1ZSBuYW1lLiBBbgorICAgICAgICAgICAgICAgICAgZXhhbXBsZSBvZiBhIGRlc3RpbmF0aW9uIG1hdGNoIGlzIGRlc3RpbmF0aW9uPSc6MS4wJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5hcmdbMCwgMSwgMiwgMywgLi4uXTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFueSBzdHJpbmc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZyBtYXRjaGVzIGFyZSBzcGVjaWFsIGFuZCBhcmUgdXNlZCBmb3IgZnVydGhlciByZXN0cmljdGluZyB0aGUgCisgICAgICAgICAgICAgICAgICBtYXRjaCBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIGluIHRoZSBib2R5IG9mIGEgbWVzc2FnZS4gT25seSBhcmd1bWVudHMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgU1RSSU5HIGNhbiBiZSBtYXRjaGVkIGluIHRoaXMgd2F5LiBBbiBleGFtcGxlIG9mIGFuIGFyZ3VtZW50IG1hdGNoIAorICAgICAgICAgICAgICAgICAgd291bGQgYmUgYXJnMz0nRm9vJy4gT25seSBhcmd1bWVudCBpbmRleGVzIGZyb20gMCB0byA2MyBzaG91bGQgYmUgCisgICAgICAgICAgICAgICAgICBhY2NlcHRlZC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+YXJnWzAsIDEsIDIsIDMsIC4uLl1wYXRoPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QW55IHN0cmluZzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkFyZ3VtZW50IHBhdGggbWF0Y2hlcyBwcm92aWRlIGEgc3BlY2lhbGlzZWQgZm9ybSBvZiB3aWxkY2FyZCBtYXRjaGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoLWxpa2UgbmFtZXNwYWNlcy4gVGhleSBjYW4gbWF0Y2ggYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgZWl0aGVyIFNUUklORyBvcgorICAgICAgICAgICAgICAgICAgICAgIE9CSkVDVF9QQVRILiBBcyB3aXRoIG5vcm1hbCBhcmd1bWVudCBtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBhcmd1bWVudCBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdHJpbmcgZ2l2ZW4gaW4gdGhlIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgcnVsZSB0aGVuIHRoZSBydWxlIGlzIHNhdGlzZmllZC4gQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhbHNvIGEKKyAgICAgICAgICAgICAgICAgICAgICBtYXRjaCB3aGVuIGVpdGhlciB0aGUgc3RyaW5nIGdpdmVuIGluIHRoZSBtYXRjaCBydWxlIG9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIG1lc3NhZ2UgYXJndW1lbnQgZW5kcyB3aXRoICcvJyBhbmQgaXMgYSBwcmVmaXggb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuIEFuIGV4YW1wbGUgYXJndW1lbnQgcGF0aCBtYXRjaCBpcyBhcmcwcGF0aD0nL2FhL2JiLycuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBtYXRjaCBtZXNzYWdlcyB3aXRoIGZpcnN0IGFyZ3VtZW50cyBvZiAnLycsICcvYWEvJywKKyAgICAgICAgICAgICAgICAgICAgICAnL2FhL2JiLycsICcvYWEvYmIvY2MvJyBhbmQgJy9hYS9iYi9jYycuIEl0IHdvdWxkIG5vdCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzIHdpdGggZmlyc3QgYXJndW1lbnRzIG9mICcvYWEvYicsICcvYWEnIG9yIGV2ZW4gJy9hYS9iYicuPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlRoaXMgaXMgaW50ZW5kZWQgZm9yIG1vbml0b3Jpbmcg4oCcZGlyZWN0b3JpZXPigJ0gaW4gZmlsZSBzeXN0ZW0tbGlrZQorICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoaWVzLCBhcyB1c2VkIGluIHRoZSA8Y2l0ZXRpdGxlPmRjb25mPC9jaXRldGl0bGU+IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0uIEFuIGFwcGxpY2F0aW9uIGludGVyZXN0ZWQgaW4gYWxsIG5vZGVzIGluIGEgcGFydGljdWxhciBoaWVyYXJjaHkgd291bGQKKyAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIDxsaXRlcmFsPmFyZzBwYXRoPScvY2EvZXhhbXBsZS9mb28vJzwvbGl0ZXJhbD4uIFRoZW4gdGhlIHNlcnZpY2UgY291bGQKKyAgICAgICAgICAgICAgICAgICAgICBlbWl0IGEgc2lnbmFsIHdpdGggemVyb3RoIGFyZ3VtZW50IDxsaXRlcmFsPiIvY2EvZXhhbXBsZS9mb28vYmFyIjwvbGl0ZXJhbD4gdG8KKyAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnQgYSBtb2RpZmljYXRpb24gdG8gdGhlIOKAnGJhcuKAnSBwcm9wZXJ0eSwgb3IgYSBzaWduYWwgd2l0aCB6ZXJvdGgKKyAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCA8bGl0ZXJhbD4iL2NhL2V4YW1wbGUvIjwvbGl0ZXJhbD4gdG8gcmVwcmVzZW50IGF0b21pYyBtb2RpZmljYXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICBtYW55IHByb3BlcnRpZXMgd2l0aGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgdGhlIGludGVyZXN0ZWQgYXBwbGljYXRpb24gd291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZCBpbiBib3RoIGNhc2VzLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYXRjaCBrZXkgd2FzIGFkZGVkIGluIHZlcnNpb24gMC4xMiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIEQtQnVzIHNwZWNpZmljYXRpb24sIGltcGxlbWVudGVkIGZvciBTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBieSB0aGUgYnVzIGRhZW1vbiBpbiBkYnVzIDEuMi4wIGFuZCBsYXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbXBsZW1lbnRlZCBmb3IgT0JKRUNUX1BBVEggYXJndW1lbnRzIGluIGRidXMgMS41LjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+YXJnMG5hbWVzcGFjZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pkxpa2UgYSBidXMgbmFtZSwgZXhjZXB0IHRoYXQgdGhlIHN0cmluZyBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgdG8gY29udGFpbiBhICcuJyAocGVyaW9kKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPk1hdGNoIG1lc3NhZ2VzIHdob3NlIGZpcnN0IGFyZ3VtZW50IGlzIG9mIHR5cGUgU1RSSU5HLCBhbmQgaXMgYSBidXMgbmFtZQorICAgICAgICAgICAgICAgICAgICAgIG9yIGludGVyZmFjZSBuYW1lIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4gVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICBmb3Igd2F0Y2hpbmcgbmFtZSBvd25lciBjaGFuZ2VzIGZvciBhIGdyb3VwIG9mIHJlbGF0ZWQgYnVzIG5hbWVzLCByYXRoZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAgIGZvciBhIHNpbmdsZSBuYW1lIG9yIGFsbCBuYW1lIGNoYW5nZXMuPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkJlY2F1c2UgZXZlcnkgdmFsaWQgaW50ZXJmYWNlIG5hbWUgaXMgYWxzbyBhIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgYnVzIG5hbWUsIHRoaXMgY2FuIGFsc28gYmUgdXNlZCBmb3IgbWVzc2FnZXMgd2hvc2UKKyAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBhcmd1bWVudCBpcyBhbiBpbnRlcmZhY2UgbmFtZS48L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+Rm9yIGV4YW1wbGUsIHRoZSBtYXRjaCBydWxlCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+bWVtYmVyPSdOYW1lT3duZXJDaGFuZ2VkJyxhcmcwbmFtZXNwYWNlPSdjb20uZXhhbXBsZS5iYWNrZW5kJzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzIG5hbWUgb3duZXIgY2hhbmdlcyBmb3IgYnVzIG5hbWVzIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5iYWNrZW5kLmZvbzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuYmFja2VuZC5mb28uYmFyPC9saXRlcmFsPiwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuYmFja2VuZDwvbGl0ZXJhbD4gaXRzZWxmLjwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT5TZWUgYWxzbyA8eHJlZiBsaW5rZW5kPSdidXMtbWVzc2FnZXMtbmFtZS1vd25lci1jaGFuZ2VkJy8+LjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYXRjaCBrZXkgd2FzIGFkZGVkIGluIHZlcnNpb24gMC4xNiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIEQtQnVzIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudGVkIGJ5IHRoZSBidXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhZW1vbiBpbiBkYnVzIDEuNS4wIGFuZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+ZWF2ZXNkcm9wPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+J3RydWUnPC9saXRlcmFsPiwgPGxpdGVyYWw+J2ZhbHNlJzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNpbmNlIEQtQnVzIDEuNS42LCBtYXRjaCBydWxlcyBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggbWVzc2FnZXMgd2hpY2ggaGF2ZSBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBmaWVsZCB1bmxlc3MgdGhlIG1hdGNoIHJ1bGUgc3BlY2lmaWNhbGx5CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLWVhdmVzZHJvcHBpbmciLz4pCisgICAgICAgICAgICAgICAgICAgIGJ5IHNwZWNpZnlpbmcgPGxpdGVyYWw+ZWF2ZXNkcm9wPSd0cnVlJzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG1hdGNoIHJ1bGUuICA8bGl0ZXJhbD5lYXZlc2Ryb3A9J2ZhbHNlJzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLiBNZXNzYWdlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgZGVsaXZlcmVkIHRvIHRoZWlyIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICByZWdhcmRsZXNzIG9mIG1hdGNoIHJ1bGVzLCBzbyB0aGlzIG1hdGNoIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgIGFmZmVjdCBub3JtYWwgZGVsaXZlcnkgb2YgdW5pY2FzdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICAgICAgSWYgdGhlIG1lc3NhZ2UgYnVzIGhhcyBhIHNlY3VyaXR5IHBvbGljeSB3aGljaCBmb3JiaWRzCisgICAgICAgICAgICAgICAgICAgIGVhdmVzZHJvcHBpbmcsIHRoaXMgbWF0Y2ggbWF5IHN0aWxsIGJlIHVzZWQgd2l0aG91dCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgYnV0IHdpbGwgbm90IGhhdmUgYW55IHByYWN0aWNhbCBlZmZlY3QuCisgICAgICAgICAgICAgICAgICAgIEluIG9sZGVyIHZlcnNpb25zIG9mIEQtQnVzLCB0aGlzIG1hdGNoIHdhcyBub3QgYWxsb3dlZAorICAgICAgICAgICAgICAgICAgICBpbiBtYXRjaCBydWxlcywgYW5kIGFsbCBtYXRjaCBydWxlcyBiZWhhdmVkIGFzIGlmCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+IGhhZCBiZWVuIHVzZWQuCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1zdGFydGluZy1zZXJ2aWNlcyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgU3RhcnRpbmcgU2VydmljZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBjYW4gc3RhcnQgYXBwbGljYXRpb25zIG9uIGJlaGFsZiBvZiBvdGhlciBhcHBsaWNhdGlvbnMuCisgICAgICAgIEluIENPUkJBIHRlcm1zLCB0aGlzIHdvdWxkIGJlIGNhbGxlZCA8Zmlyc3R0ZXJtPmFjdGl2YXRpb248L2ZpcnN0dGVybT4uCisgICAgICAgIEFuIGFwcGxpY2F0aW9uIHRoYXQgY2FuIGJlIHN0YXJ0ZWQgaW4gdGhpcyB3YXkgaXMgY2FsbGVkIGEKKyAgICAgICAgPGZpcnN0dGVybT5zZXJ2aWNlPC9maXJzdHRlcm0+LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFdpdGggRC1CdXMsIHN0YXJ0aW5nIGEgc2VydmljZSBpcyBub3JtYWxseSBkb25lIGJ5IG5hbWUuIFRoYXQgaXMsCisgICAgICAgIGFwcGxpY2F0aW9ucyBhc2sgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YXJ0IHNvbWUgcHJvZ3JhbSB0aGF0IHdpbGwgb3duIGEKKyAgICAgICAgd2VsbC1rbm93biBuYW1lLCBzdWNoIGFzIDxsaXRlcmFsPmNvbS5leGFtcGxlLlRleHRFZGl0b3I8L2xpdGVyYWw+LgorICAgICAgICBUaGlzIGltcGxpZXMgYSBjb250cmFjdCBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIG5hbWUKKyAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuVGV4dEVkaXRvcjwvbGl0ZXJhbD4gZm9yIHdoaWNoIG9iamVjdAorICAgICAgICB0aGUgb3duZXIgb2YgdGhhdCBuYW1lIHdpbGwgcHJvdmlkZSwgYW5kIHdoYXQgaW50ZXJmYWNlcyB0aG9zZSAKKyAgICAgICAgb2JqZWN0cyB3aWxsIGhhdmUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVG8gZmluZCBhbiBleGVjdXRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIG5hbWUsIHRoZSBidXMgZGFlbW9uCisgICAgICAgIGxvb2tzIGZvciA8Zmlyc3R0ZXJtPnNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXM8L2ZpcnN0dGVybT4uICBTZXJ2aWNlCisgICAgICAgIGRlc2NyaXB0aW9uIGZpbGVzIGRlZmluZSBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBleGVjdXRhYmxlcy4gRGlmZmVyZW50CisgICAgICAgIGtpbmRzIG9mIG1lc3NhZ2UgYnVzIHdpbGwgbG9vayBmb3IgdGhlc2UgZmlsZXMgaW4gZGlmZmVyZW50IHBsYWNlcywgc2VlCisgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXR5cGVzIi8+LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXMgaGF2ZSB0aGUgIi5zZXJ2aWNlIiBmaWxlCisgICAgICAgIGV4dGVuc2lvbi4gVGhlIG1lc3NhZ2UgYnVzIHdpbGwgb25seSBsb2FkIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXMKKyAgICAgICAgZW5kaW5nIHdpdGggLnNlcnZpY2U7IGFsbCBvdGhlciBmaWxlcyB3aWxsIGJlIGlnbm9yZWQuICBUaGUgZmlsZSBmb3JtYXQKKyAgICAgICAgaXMgc2ltaWxhciB0byB0aGF0IG9mIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Rlc2t0b3AtZW50cnktc3BlYy9kZXNrdG9wLWVudHJ5LXNwZWMtbGF0ZXN0Lmh0bWwiPmRlc2t0b3AKKyAgICAgICAgZW50cmllczwvdWxpbms+LiBBbGwgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcyBtdXN0IGJlIGluIFVURi04CisgICAgICAgIGVuY29kaW5nLiBUbyBlbnN1cmUgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIG5hbWUgY29sbGlzaW9ucywgc2VydmljZSBmaWxlcworICAgICAgICBtdXN0IGJlIG5hbWVzcGFjZWQgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIG1lc3NhZ2VzIGFuZCBzZXJ2aWNlCisgICAgICAgIG5hbWVzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gdGhlIHdlbGwta25vd24gc3lzdGVtIGJ1cywgdGhlIG5hbWUgb2YgYSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGUKKyAgICAgICAgbXVzdCBiZSBpdHMgd2VsbC1rbm93biBuYW1lIHBsdXMgPGxpdGVyYWw+LnNlcnZpY2U8L2xpdGVyYWw+LAorICAgICAgICBmb3IgaW5zdGFuY2UKKyAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuQ29uZmlndXJhdGlvbkRhdGFiYXNlLnNlcnZpY2U8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gdGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMsIHNlcnZpY2VzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUKKyAgICAgICAgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlIG5hbWluZyBjb252ZW50aW9uIGFzIG9uIHRoZSBzeXN0ZW0gYnVzLAorICAgICAgICBidXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRoZXkgYXJlIG5vdCByZXF1aXJlZCB0byBkbyBzby4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFtGSVhNRSB0aGUgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyIHNwZWNpZmllZCB0aGFuICJzaW1pbGFyIHRvCisgICAgICAgIC5kZXNrdG9wIGVudHJpZXMiIGVzcC4gc2luY2UgZGVza3RvcCBlbnRyaWVzIGFyZSBhbHJlYWR5CisgICAgICAgIGJhZGx5LXNwZWNpZmllZC4gOy0pXQorICAgICAgICBUaGVzZSBzZWN0aW9ucyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFwcGx5IHRvIHNlcnZpY2UgZmlsZXMgYXMgd2VsbDoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5HZW5lcmFsIHN5bnRheDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5Db21tZW50IGZvcm1hdDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICBTZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIG11c3QgY29udGFpbiBhCisgICAgICAgIDxsaXRlcmFsPkQtQlVTIFNlcnZpY2U8L2xpdGVyYWw+IGdyb3VwIHdpdGggYXQgbGVhc3QgdGhlIGtleXMKKyAgICAgICAgPGxpdGVyYWw+TmFtZTwvbGl0ZXJhbD4gKHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHNlcnZpY2UpCisgICAgICAgIGFuZCA8bGl0ZXJhbD5FeGVjPC9saXRlcmFsPiAodGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQpLgorCisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAjIFNhbXBsZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGUKKyAgICAgICAgICAgIFtELUJVUyBTZXJ2aWNlXQorICAgICAgICAgICAgTmFtZT1jb20uZXhhbXBsZS5Db25maWd1cmF0aW9uRGF0YWJhc2UKKyAgICAgICAgICAgIEV4ZWM9L3Vzci9iaW4vc2FtcGxlLWNvbmZpZ2QKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFkZGl0aW9uYWxseSwgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcyBmb3IgdGhlIHdlbGwta25vd24gc3lzdGVtCisgICAgICAgIGJ1cyBvbiBVbml4IG11c3QgY29udGFpbiBhIDxsaXRlcmFsPlVzZXI8L2xpdGVyYWw+IGtleSwgd2hvc2UgdmFsdWUKKyAgICAgICAgaXMgdGhlIG5hbWUgb2YgYSB1c2VyIGFjY291bnQgKGUuZy4gPGxpdGVyYWw+cm9vdDwvbGl0ZXJhbD4pLgorICAgICAgICBUaGUgc3lzdGVtIHNlcnZpY2Ugd2lsbCBiZSBydW4gYXMgdGhhdCB1c2VyLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgV2hlbiBhbiBhcHBsaWNhdGlvbiBhc2tzIHRvIHN0YXJ0IGEgc2VydmljZSBieSBuYW1lLCB0aGUgYnVzIGRhZW1vbiB0cmllcyB0bworICAgICAgICBmaW5kIGEgc2VydmljZSB0aGF0IHdpbGwgb3duIHRoYXQgbmFtZS4gSXQgdGhlbiB0cmllcyB0byBzcGF3biB0aGUKKyAgICAgICAgZXhlY3V0YWJsZSBhc3NvY2lhdGVkIHdpdGggaXQuIElmIHRoaXMgZmFpbHMsIGl0IHdpbGwgcmVwb3J0IGFuCisgICAgICAgIGVycm9yLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gdGhlIHdlbGwta25vd24gc3lzdGVtIGJ1cywgaXQgaXMgbm90IHBvc3NpYmxlIGZvciB0d28gLnNlcnZpY2UgZmlsZXMKKyAgICAgICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHRvIG9mZmVyIHRoZSBzYW1lIHNlcnZpY2UsIGJlY2F1c2UgdGhleSBhcmUKKyAgICAgICAgY29uc3RyYWluZWQgdG8gaGF2ZSBuYW1lcyB0aGF0IG1hdGNoIHRoZSBzZXJ2aWNlIG5hbWUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBPbiB0aGUgd2VsbC1rbm93biBzZXNzaW9uIGJ1cywgaWYgdHdvIC5zZXJ2aWNlIGZpbGVzIGluIHRoZSBzYW1lCisgICAgICAgIGRpcmVjdG9yeSBvZmZlciB0aGUgc2FtZSBzZXJ2aWNlIG5hbWUsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorICAgICAgICBEaXN0cmlidXRvcnMgc2hvdWxkIGF2b2lkIHRoaXMgc2l0dWF0aW9uLCBmb3IgaW5zdGFuY2UgYnkgbmFtaW5nCisgICAgICAgIHNlc3Npb24gc2VydmljZXMnIC5zZXJ2aWNlIGZpbGVzIGFjY29yZGluZyB0byB0aGVpciBzZXJ2aWNlIG5hbWUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJZiB0d28gLnNlcnZpY2UgZmlsZXMgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzIG9mZmVyIHRoZSBzYW1lCisgICAgICAgIHNlcnZpY2UgbmFtZSwgdGhlIG9uZSBpbiB0aGUgaGlnaGVyLXByaW9yaXR5IGRpcmVjdG9yeSBpcyB1c2VkOgorICAgICAgICBmb3IgaW5zdGFuY2UsIG9uIHRoZSBzeXN0ZW0gYnVzLCAuc2VydmljZSBmaWxlcyBpbgorICAgICAgICAvdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhvc2UKKyAgICAgICAgaW4gL3Vzci9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBleGVjdXRhYmxlIGxhdW5jaGVkIHdpbGwgaGF2ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgPGxpdGVyYWw+REJVU19TVEFSVEVSX0FERFJFU1M8L2xpdGVyYWw+IHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgbWVzc2FnZSBidXMgc28gaXQgY2FuIGNvbm5lY3QgYW5kIHJlcXVlc3QgdGhlIGFwcHJvcHJpYXRlIG5hbWVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBleGVjdXRhYmxlIGJlaW5nIGxhdW5jaGVkIG1heSB3YW50IHRvIGtub3cgd2hldGhlciB0aGUgbWVzc2FnZSBidXMKKyAgICAgICAgc3RhcnRpbmcgaXQgaXMgb25lIG9mIHRoZSB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXMgKHNlZSA8eHJlZgorICAgICAgICBsaW5rZW5kPSJtZXNzYWdlLWJ1cy10eXBlcyIvPikuIFRvIGZhY2lsaXRhdGUgdGhpcywgdGhlIGJ1cyBtdXN0IGFsc28gc2V0CisgICAgICAgIHRoZSA8bGl0ZXJhbD5EQlVTX1NUQVJURVJfQlVTX1RZUEU8L2xpdGVyYWw+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIG9uZQorICAgICAgICBvZiB0aGUgd2VsbC1rbm93biBidXNlcy4gVGhlIGN1cnJlbnRseS1kZWZpbmVkIHZhbHVlcyBmb3IgdGhpcyB2YXJpYWJsZQorICAgICAgICBhcmUgPGxpdGVyYWw+c3lzdGVtPC9saXRlcmFsPiBmb3IgdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMsCisgICAgICAgIGFuZCA8bGl0ZXJhbD5zZXNzaW9uPC9saXRlcmFsPiBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UKKyAgICAgICAgYnVzLiBUaGUgbmV3IGV4ZWN1dGFibGUgbXVzdCBzdGlsbCBjb25uZWN0IHRvIHRoZSBhZGRyZXNzIGdpdmVuCisgICAgICAgIGluIDxsaXRlcmFsPkRCVVNfU1RBUlRFUl9BRERSRVNTPC9saXRlcmFsPiwgYnV0IG1heSBhc3N1bWUgdGhhdCB0aGUKKyAgICAgICAgcmVzdWx0aW5nIGNvbm5lY3Rpb24gaXMgdG8gdGhlIHdlbGwta25vd24gYnVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFtGSVhNRSB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IHNvbWV3aGVyZSwgZWl0aGVyIHNwZWNpZmllZAorICAgICAgICBpbiB0aGUgLnNlcnZpY2UgZmlsZSwgYnkgdGhlIGNsaWVudCwgb3IganVzdCBhIGdsb2JhbCB2YWx1ZQorICAgICAgICBhbmQgaWYgdGhlIGNsaWVudCBiZWluZyBhY3RpdmF0ZWQgZmFpbHMgdG8gY29ubmVjdCB3aXRoaW4gdGhhdAorICAgICAgICB0aW1lb3V0LCBhbiBlcnJvciBzaG91bGQgYmUgc2VudCBiYWNrLl0KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy1zdGFydGluZy1zZXJ2aWNlcy1zY29wZSI+CisgICAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBTZXJ2aWNlIFNjb3BlPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlICJzY29wZSIgb2YgYSBzZXJ2aWNlIGlzIGl0cyAicGVyLSIsIHN1Y2ggYXMgcGVyLXNlc3Npb24sCisgICAgICAgICAgcGVyLW1hY2hpbmUsIHBlci1ob21lLWRpcmVjdG9yeSwgb3IgcGVyLWRpc3BsYXkuIFRoZSByZWZlcmVuY2UKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHlldCBzdXBwb3J0IHN0YXJ0aW5nIHNlcnZpY2VzIGluIGEgZGlmZmVyZW50CisgICAgICAgICAgc2NvcGUgZnJvbSB0aGUgbWVzc2FnZSBidXMgaXRzZWxmLiBTbyBlLmcuIGlmIHlvdSBzdGFydCBhIHNlcnZpY2UKKyAgICAgICAgICBvbiB0aGUgc2Vzc2lvbiBidXMgaXRzIHNjb3BlIGlzIHBlci1zZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdlIGNvdWxkIGFkZCBhbiBvcHRpb25hbCBzY29wZSB0byBhIGJ1cyBuYW1lLiBGb3IgZXhhbXBsZSwgZm9yCisgICAgICAgICAgcGVyLShkaXNwbGF5LHNlc3Npb24gcGFpciksIHdlIGNvdWxkIGhhdmUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggZGlzcGxheQorICAgICAgICAgIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGxvZ2luIGFuZCBzZXQgb24gc2NyZWVuIDAgYnkgZXhlY3V0aW5nIGEKKyAgICAgICAgICBzcGVjaWFsICJzZXQgZGlzcGxheSBJRCIgYmluYXJ5LiBUaGUgSUQgd291bGQgYmUgc3RvcmVkIGluIGEKKyAgICAgICAgICA8bGl0ZXJhbD5fREJVU19ESVNQTEFZX0lEPC9saXRlcmFsPiBwcm9wZXJ0eSBhbmQgd291bGQgYmUgYSBzdHJpbmcgb2YKKyAgICAgICAgICByYW5kb20gYnl0ZXMuIFRoaXMgSUQgd291bGQgdGhlbiBiZSB1c2VkIHRvIHNjb3BlIG5hbWVzLgorICAgICAgICAgIFN0YXJ0aW5nL2xvY2F0aW5nIGEgc2VydmljZSBjb3VsZCBiZSBkb25lIGJ5IElELW5hbWUgcGFpciByYXRoZXIgdGhhbgorICAgICAgICAgIG9ubHkgYnkgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb250cmFzdCB0aGlzIHdpdGggYSBwZXItZGlzcGxheSBzY29wZS4gVG8gYWNoaWV2ZSB0aGF0LCB3ZSB3b3VsZCAKKyAgICAgICAgICB3YW50IGEgc2luZ2xlIGJ1cyBzcGFubmluZyBhbGwgc2Vzc2lvbnMgdXNpbmcgYSBnaXZlbiBkaXNwbGF5LgorICAgICAgICAgIFNvIHdlIG1pZ2h0IHNldCBhIDxsaXRlcmFsPl9EQlVTX0RJU1BMQVlfQlVTX0FERFJFU1M8L2xpdGVyYWw+IAorICAgICAgICAgIHByb3BlcnR5IG9uIHNjcmVlbiAwIG9mIHRoZSBkaXNwbGF5LCBwb2ludGluZyB0byB0aGlzIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy10eXBlcyI+CisgICAgICA8dGl0bGU+V2VsbC1rbm93biBNZXNzYWdlIEJ1cyBJbnN0YW5jZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFR3byBzdGFuZGFyZCBtZXNzYWdlIGJ1cyBpbnN0YW5jZXMgYXJlIGRlZmluZWQgaGVyZSwgYWxvbmcgd2l0aCBob3cgCisgICAgICAgIHRvIGxvY2F0ZSB0aGVtIGFuZCB3aGVyZSB0aGVpciBzZXJ2aWNlIGZpbGVzIGxpdmUuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzLWxvZ2luIj4KKyAgICAgICAgPHRpdGxlPkxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4sIGEgPGZpcnN0dGVybT5sb2dpbiBzZXNzaW9uIG1lc3NhZ2UKKyAgICAgICAgICAgIGJ1czwvZmlyc3R0ZXJtPiBtYXkgYmUgc3RhcnRlZC4gQWxsIGFwcGxpY2F0aW9ucyBpbiB0aGUgdXNlcidzIGxvZ2luCisgICAgICAgICAgc2Vzc2lvbiBtYXkgaW50ZXJhY3Qgd2l0aCBvbmUgYW5vdGhlciB1c2luZyB0aGlzIG1lc3NhZ2UgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBhZGRyZXNzIG9mIHRoZSBsb2dpbiBzZXNzaW9uIG1lc3NhZ2UgYnVzIGlzIGdpdmVuIAorICAgICAgICAgIGluIHRoZSA8bGl0ZXJhbD5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2xpdGVyYWw+IGVudmlyb25tZW50IAorICAgICAgICAgIHZhcmlhYmxlLiBJZiB0aGF0IHZhcmlhYmxlIGlzIG5vdCBzZXQsIGFwcGxpY2F0aW9ucyBtYXkgCisgICAgICAgICAgYWxzbyB0cnkgdG8gcmVhZCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBYIFdpbmRvdyBTeXN0ZW0gcm9vdCAKKyAgICAgICAgICB3aW5kb3cgcHJvcGVydHkgPGxpdGVyYWw+X0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvbGl0ZXJhbD4uCisgICAgICAgICAgVGhlIHJvb3Qgd2luZG93IHByb3BlcnR5IG11c3QgaGF2ZSB0eXBlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4uCisgICAgICAgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBoYXZlIHByZWNlZGVuY2Ugb3ZlciB0aGUgCisgICAgICAgICAgcm9vdCB3aW5kb3cgcHJvcGVydHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+VGhlIGFkZHJlc3Mgb2YgdGhlIGxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXMgaXMgZ2l2ZW4gaW4gdGhlCisgICAgICAgIDxsaXRlcmFsPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgdmFyaWFibGUuIElmCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBub3Qgc2V0LCBvciBpZiBpdCdzIHNldCB0byB0aGUgc3RyaW5nCisgICAgICAgICJhdXRvbGF1bmNoOiIsIHRoZSBzeXN0ZW0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1zcGVjaWZpYyBtZXRob2RzIG9mCisgICAgICAgIGxvY2F0aW5nIGEgcnVubmluZyBELUJ1cyBzZXNzaW9uIHNlcnZlciwgb3Igc3RhcnRpbmcgb25lIGlmIGEgcnVubmluZworICAgICAgICBpbnN0YW5jZSBjYW5ub3QgYmUgZm91bmQuIE5vdGUgdGhhdCB0aGlzIG1lY2hhbmlzbSBpcyBub3QgcmVjb21tZW5kZWQKKyAgICAgICAgZm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIGlmIGEgZGFlbW9uIGlzIHJ1bm5pbmcuIEl0IGlzIGluaGVyZW50bHkKKyAgICAgICAgcmFjeSB0byBhdHRlbXB0IHRvIG1ha2UgdGhpcyBkZXRlcm1pbmF0aW9uLCBzaW5jZSB0aGUgYnVzIGRhZW1vbiBtYXkKKyAgICAgICAgYmUgc3RhcnRlZCBqdXN0IGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICAgICAgIFRoZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgZG8gbm90IHRyeSB0byBtYWtlIHRoaXMKKyAgICAgICAgZGV0ZXJtaW5hdGlvbiBmb3IgdGhlaXIgZnVuY3Rpb25hbGl0eSBwdXJwb3NlcywgYW5kIGluc3RlYWQgdGhleQorICAgICAgICBzaG91bGQgYXR0ZW1wdCB0byBzdGFydCB0aGUgc2VydmVyLjwvcGFyYT4KKworICAgICAgICA8c2VjdDQgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzLWxvZ2luLXgtd2luZG93cyI+CisgICAgICAgICAgPHRpdGxlPlggV2luZG93aW5nIFN5c3RlbTwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgdGhlIFggV2luZG93aW5nIFN5c3RlbSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgbG9jYXRlIHRoZQorICAgICAgICAgICAgd2luZG93IG93bmVyIG9mIHRoZSBzZWxlY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhlIGF0b20gZm9ybWVkIGJ5CisgICAgICAgICAgICBjb25jYXRlbmF0aW5nOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBsaXRlcmFsIHN0cmluZyAiX0RCVVNfU0VTU0lPTl9CVVNfU0VMRUNUSU9OXyI8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBjdXJyZW50IHVzZXIncyB1c2VybmFtZTwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGxpdGVyYWwgY2hhcmFjdGVyICdfJyAodW5kZXJzY29yZSk8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBtYWNoaW5lJ3MgSUQ8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBmb3IgdGhlIHdpbmRvdyB0aGF0IG93bnMKKyAgICAgICAgICAgIHRoaXMgWCBzZWxlY3Rpb246CisgICAgICAgICAgICA8aW5mb3JtYWx0YWJsZSBmcmFtZT0iYWxsIj4KKyAgICAgICAgICAgICAgPHRncm91cCBjb2xzPSIyIj4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+QXRvbTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+bWVhbmluZzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+X0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgc29ja2V0PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5fREJVU19TRVNTSU9OX0JVU19QSUQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBQSUQgb2YgdGhlIHNlcnZlciBwcm9jZXNzPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBdCBsZWFzdCB0aGUgX0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBwcm9wZXJ0eSBNVVNUIGJlCisgICAgICAgICAgICBwcmVzZW50IGluIHRoaXMgd2luZG93LgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgdGhlIFggc2VsZWN0aW9uIGNhbm5vdCBiZSBsb2NhdGVkIG9yIGlmIHJlYWRpbmcgdGhlCisgICAgICAgICAgICBwcm9wZXJ0aWVzIGZyb20gdGhlIHdpbmRvdyBmYWlscywgdGhlIGltcGxlbWVudGF0aW9uIE1VU1QgY29uY2x1ZGUKKyAgICAgICAgICAgIHRoYXQgdGhlcmUgaXMgbm8gRC1CdXMgc2VydmVyIHJ1bm5pbmcgYW5kIHByb2NlZWQgdG8gc3RhcnQgYSBuZXcKKyAgICAgICAgICAgIHNlcnZlci4gKFNlZSBiZWxvdyBvbiBjb25jdXJyZW5jeSBpc3N1ZXMpCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGYWlsdXJlIHRvIGNvbm5lY3QgdG8gdGhlIEQtQnVzIHNlcnZlciBhZGRyZXNzIHRodXMgb2J0YWluZWQKKyAgICAgICAgICAgIE1VU1QgYmUgdHJlYXRlZCBhcyBhIGZhdGFsIGNvbm5lY3Rpb24gZXJyb3IgYW5kIHNob3VsZCBiZSByZXBvcnRlZAorICAgICAgICAgICAgdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgYW4gYWx0ZXJuYXRpdmUsIGFuIGltcGxlbWVudGF0aW9uIE1BWSBmaW5kIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgaW4gdGhlIGZvbGxvd2luZyBmaWxlIGxvY2F0ZWQgaW4gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LAorICAgICAgICAgICAgaW4gc3ViZGlyZWN0b3J5IC5kYnVzL3Nlc3Npb24tYnVzLzoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgbWFjaGluZSdzIElEPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJy0nIChkYXNoKTwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIFggZGlzcGxheSB3aXRob3V0IHRoZSBzY3JlZW4gbnVtYmVyLCB3aXRoIHRoZQorICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwcmVmaXhlcyByZW1vdmVkLCBpZiBwcmVzZW50OiAiOiIsICJsb2NhbGhvc3Q6IgorICAgICAgICAgICAgICAgIC4ibG9jYWxob3N0LmxvY2FsZG9tYWluOiIuIFRoYXQgaXMsIGEgZGlzcGxheSBvZgorICAgICAgICAgICAgICAgICJsb2NhbGhvc3Q6MTAuMCIgcHJvZHVjZXMganVzdCB0aGUgbnVtYmVyICIxMCI8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgTkFNRT12YWx1ZSBhc3NpZ25tZW50IHBhaXJzIGFuZAorICAgICAgICAgICAgbGluZXMgc3RhcnRpbmcgd2l0aCAjIGFyZSBjb21tZW50cyAobm8gY29tbWVudHMgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgIG90aGVyd2lzZSkuIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZXMgYXJlIGRlZmluZWQ6CisgICAgICAgICAgICA8aW5mb3JtYWx0YWJsZQorICAgICAgICAgICAgICBmcmFtZT0iYWxsIj4KKyAgICAgICAgICAgICAgPHRncm91cCBjb2xzPSIyIj4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFyaWFibGU8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPm1lYW5pbmc8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgc29ja2V0PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5EQlVTX1NFU1NJT05fQlVTX1BJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIFBJRCBvZiB0aGUgc2VydmVyIHByb2Nlc3M8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnRoZSB3aW5kb3cgSUQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEF0IGxlYXN0IHRoZSBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgdmFyaWFibGUgTVVTVCBiZSBwcmVzZW50CisgICAgICAgICAgICBpbiB0aGlzIGZpbGUuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGYWlsdXJlIHRvIG9wZW4gdGhpcyBmaWxlIE1VU1QgYmUgaW50ZXJwcmV0ZWQgYXMgYWJzZW5jZSBvZiBhCisgICAgICAgICAgICBydW5uaW5nIHNlcnZlci4gVGhlcmVmb3JlLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBwcm9jZWVkIHRvCisgICAgICAgICAgICBhdHRlbXB0aW5nIHRvIGxhdW5jaCBhIG5ldyBidXMgc2VydmVyIGlmIHRoZSBmaWxlIGNhbm5vdCBiZQorICAgICAgICAgICAgb3BlbmVkLgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSG93ZXZlciwgc3VjY2VzcyBpbiBvcGVuaW5nIHRoaXMgZmlsZSBNVVNUIE5PVCBsZWFkIHRvIHRoZQorICAgICAgICAgICAgY29uY2x1c2lvbiB0aGF0IHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gVGh1cywgYSBmYWlsdXJlIHRvIGNvbm5lY3QgdG8KKyAgICAgICAgICAgIHRoZSBidXMgYWRkcmVzcyBvYnRhaW5lZCBieSB0aGUgYWx0ZXJuYXRpdmUgbWV0aG9kIE1VU1QgTk9UIGJlCisgICAgICAgICAgICBjb25zaWRlcmVkIGEgZmF0YWwgZXJyb3IuIElmIHRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBlc3RhYmxpc2hlZCwKKyAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHByb2NlZWQgdG8gY2hlY2sgdGhlIFggc2VsZWN0aW9uIHNldHRpbmdzIG9yCisgICAgICAgICAgICB0byBzdGFydCB0aGUgc2VydmVyIG9uIGl0cyBvd24uCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB0aGUgaW1wbGVtZW50YXRpb24gY29uY2x1ZGVzIHRoYXQgdGhlIEQtQnVzIHNlcnZlciBpcyBub3QKKyAgICAgICAgICAgIHJ1bm5pbmcgaXQgTVVTVCBhdHRlbXB0IHRvIHN0YXJ0IGEgbmV3IHNlcnZlciBhbmQgaXQgTVVTVCBhbHNvCisgICAgICAgICAgICBlbnN1cmUgdGhhdCB0aGUgZGFlbW9uIHN0YXJ0ZWQgYXMgYW4gZWZmZWN0IG9mIHRoZSAiYXV0b2xhdW5jaCIKKyAgICAgICAgICAgIG1lY2hhbmlzbSBwcm92aWRlcyB0aGUgbG9va3VwIG1lY2hhbmlzbXMgZGVzY3JpYmVkIGFib3ZlLCBzbworICAgICAgICAgICAgc3Vic2VxdWVudCBjYWxscyBjYW4gbG9jYXRlIHRoZSBuZXdseSBzdGFydGVkIHNlcnZlci4gVGhlCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBNVVNUIGFsc28gZW5zdXJlIHRoYXQgaWYgdHdvIG9yIG1vcmUgY29uY3VycmVudAorICAgICAgICAgICAgaW5pdGlhdGlvbnMgaGFwcGVuLCBvbmx5IG9uZSBzZXJ2ZXIgcmVtYWlucyBydW5uaW5nIGFuZCBhbGwgb3RoZXIKKyAgICAgICAgICAgIGluaXRpYXRpb25zIGFyZSBhYmxlIHRvIG9idGFpbiB0aGUgYWRkcmVzcyBvZiB0aGlzIHNlcnZlciBhbmQKKyAgICAgICAgICAgIGNvbm5lY3QgdG8gaXQuIEluIG90aGVyIHdvcmRzLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBlbnN1cmUgdGhhdAorICAgICAgICAgICAgdGhlIFggc2VsZWN0aW9uIGlzIG5vdCBwcmVzZW50IHdoZW4gaXQgYXR0ZW1wdHMgdG8gc2V0IGl0LCB3aXRob3V0CisgICAgICAgICAgICBhbGxvd2luZyBhbm90aGVyIHByb2Nlc3MgdG8gc2V0IHRoZSBzZWxlY3Rpb24gYmV0d2VlbiB0aGUKKyAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBhbmQgdGhlIHNldHRpbmcgKGUuZy4sIGJ5IHVzaW5nIFhHcmFiU2VydmVyIC8KKyAgICAgICAgICAgIFh1bmdyYWJTZXJ2ZXIpLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0ND4KKyAgICAgICAgPHNlY3Q0PgorICAgICAgICAgIDx0aXRsZT48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgT24gVW5peCBzeXN0ZW1zLCB0aGUgc2Vzc2lvbiBidXMgc2hvdWxkIHNlYXJjaCBmb3IgLnNlcnZpY2UgZmlsZXMKKyAgICAgICAgICAgIGluIDxsaXRlcmFsPiRYREdfREFUQV9ESVJTL2RidXMtMS9zZXJ2aWNlczwvbGl0ZXJhbD4gYXMgZGVmaW5lZAorICAgICAgICAgICAgYnkgdGhlCisgICAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sIj5YREcgQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbjwvdWxpbms+LgorICAgICAgICAgICAgSW1wbGVtZW50YXRpb25zIG1heSBhbHNvIHNlYXJjaCBhZGRpdGlvbmFsIGxvY2F0aW9ucywgd2hpY2gKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZWFyY2hlZCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gYW55dGhpbmcgaW4KKyAgICAgICAgICAgIFhER19EQVRBX0hPTUUsIFhER19EQVRBX0RJUlMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBkZWZhdWx0czsKKyAgICAgICAgICAgIGZvciBleGFtcGxlLCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGFsc28KKyAgICAgICAgICAgIGxvb2tzIGluIDxsaXRlcmFsPiR7ZGF0YWRpcn0vZGJ1cy0xL3NlcnZpY2VzPC9saXRlcmFsPiBhcworICAgICAgICAgICAgc2V0IGF0IGNvbXBpbGUgdGltZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBkZXNjcmliZWQgaW4gdGhlIFhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uLCBzb2Z0d2FyZQorICAgICAgICAgICAgcGFja2FnZXMgc2hvdWxkIGluc3RhbGwgdGhlaXIgc2Vzc2lvbiAuc2VydmljZSBmaWxlcyB0byB0aGVpcgorICAgICAgICAgICAgY29uZmlndXJlZCA8bGl0ZXJhbD4ke2RhdGFkaXJ9L2RidXMtMS9zZXJ2aWNlczwvbGl0ZXJhbD4sCisgICAgICAgICAgICB3aGVyZSA8bGl0ZXJhbD4ke2RhdGFkaXJ9PC9saXRlcmFsPiBpcyBhcyBkZWZpbmVkIGJ5IHRoZSBHTlUKKyAgICAgICAgICAgIGNvZGluZyBzdGFuZGFyZHMuIFN5c3RlbSBhZG1pbmlzdHJhdG9ycyBvciB1c2VycyBjYW4gYXJyYW5nZQorICAgICAgICAgICAgZm9yIHRoZXNlIHNlcnZpY2UgZmlsZXMgdG8gYmUgcmVhZCBieSBzZXR0aW5nIFhER19EQVRBX0RJUlMgb3IgYnkKKyAgICAgICAgICAgIHN5bWxpbmtpbmcgdGhlbSBpbnRvIHRoZSBkZWZhdWx0IGxvY2F0aW9ucy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdDQ+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy10eXBlcy1zeXN0ZW0iPgorICAgICAgICA8dGl0bGU+U3lzdGVtIG1lc3NhZ2UgYnVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBjb21wdXRlciBtYXkgaGF2ZSBhIDxmaXJzdHRlcm0+c3lzdGVtIG1lc3NhZ2UgYnVzPC9maXJzdHRlcm0+LAorICAgICAgICAgIGFjY2Vzc2libGUgdG8gYWxsIGFwcGxpY2F0aW9ucyBvbiB0aGUgc3lzdGVtLiBUaGlzIG1lc3NhZ2UgYnVzIG1heSBiZQorICAgICAgICAgIHVzZWQgdG8gYnJvYWRjYXN0IHN5c3RlbSBldmVudHMsIHN1Y2ggYXMgYWRkaW5nIG5ldyBoYXJkd2FyZSBkZXZpY2VzLCAKKyAgICAgICAgICBjaGFuZ2VzIGluIHRoZSBwcmludGVyIHF1ZXVlLCBhbmQgc28gZm9ydGguCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cyBpcyBnaXZlbiAKKyAgICAgICAgICBpbiB0aGUgPGxpdGVyYWw+REJVU19TWVNURU1fQlVTX0FERFJFU1M8L2xpdGVyYWw+IGVudmlyb25tZW50IAorICAgICAgICAgIHZhcmlhYmxlLiBJZiB0aGF0IHZhcmlhYmxlIGlzIG5vdCBzZXQsIGFwcGxpY2F0aW9ucyBzaG91bGQgdHJ5IAorICAgICAgICAgIHRvIGNvbm5lY3QgdG8gdGhlIHdlbGwta25vd24gYWRkcmVzcworICAgICAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vdmFyL3J1bi9kYnVzL3N5c3RlbV9idXNfc29ja2V0PC9saXRlcmFsPi4KKyAgICAgICAgICA8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBob25vcnMgdGhlIAorICAgICAgICAgICAgICA8bGl0ZXJhbD4kKGxvY2Fsc3RhdGVkaXIpPC9saXRlcmFsPiBjb25maWd1cmUgb3B0aW9uIAorICAgICAgICAgICAgICBmb3IgdGhpcyBhZGRyZXNzLCBvbiBib3RoIGNsaWVudCBhbmQgc2VydmVyIHNpZGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9mb290bm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPbiBVbml4IHN5c3RlbXMsIHRoZSBzeXN0ZW0gYnVzIHNob3VsZCBkZWZhdWx0IHRvIHNlYXJjaGluZworICAgICAgICAgIGZvciAuc2VydmljZSBmaWxlcyBpbgorICAgICAgICAgIDxsaXRlcmFsPi91c3IvbG9jYWwvc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczwvbGl0ZXJhbD4sCisgICAgICAgICAgPGxpdGVyYWw+L3Vzci9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICA8bGl0ZXJhbD4vbGliL2RidXMtMS9zeXN0ZW0tc2VydmljZXM8L2xpdGVyYWw+LCB3aXRoIHRoYXQgb3JkZXIKKyAgICAgICAgICBvZiBwcmVjZWRlbmNlLiBJdCBtYXkgYWxzbyBzZWFyY2ggb3RoZXIgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMKKyAgICAgICAgICBsb2NhdGlvbnMsIGJ1dCBzaG91bGQgbm90IHZhcnkgdGhlc2UgbG9jYXRpb25zIGJhc2VkIG9uIGVudmlyb25tZW50CisgICAgICAgICAgdmFyaWFibGVzLgorICAgICAgICAgIDxmb290bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgc3lzdGVtIGJ1cyBpcyBzZWN1cml0eS1zZW5zaXRpdmUgYW5kIGlzIHR5cGljYWxseSBleGVjdXRlZAorICAgICAgICAgICAgICBieSBhbiBpbml0IHN5c3RlbSB3aXRoIGEgY2xlYW4gZW52aXJvbm1lbnQuIEl0cyBsYXVuY2ggaGVscGVyCisgICAgICAgICAgICAgIHByb2Nlc3MgaXMgcGFydGljdWxhcmx5IHNlY3VyaXR5LXNlbnNpdGl2ZSwgYW5kIHNwZWNpZmljYWxseQorICAgICAgICAgICAgICBjbGVhcnMgaXRzIG93biBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2Zvb3Rub3RlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNvZnR3YXJlIHBhY2thZ2VzIHNob3VsZCBpbnN0YWxsIHRoZWlyIHN5c3RlbSAuc2VydmljZQorICAgICAgICAgIGZpbGVzIHRvIHRoZWlyIGNvbmZpZ3VyZWQKKyAgICAgICAgICA8bGl0ZXJhbD4ke2RhdGFkaXJ9L2RidXMtMS9zeXN0ZW0tc2VydmljZXM8L2xpdGVyYWw+LAorICAgICAgICAgIHdoZXJlIDxsaXRlcmFsPiR7ZGF0YWRpcn08L2xpdGVyYWw+IGlzIGFzIGRlZmluZWQgYnkgdGhlIEdOVQorICAgICAgICAgIGNvZGluZyBzdGFuZGFyZHMuIFN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gYXJyYW5nZQorICAgICAgICAgIGZvciB0aGVzZSBzZXJ2aWNlIGZpbGVzIHRvIGJlIHJlYWQgYnkgZWRpdGluZyB0aGUgc3lzdGVtIGJ1cycKKyAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgb3IgYnkgc3ltbGlua2luZyB0aGVtIGludG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICBsb2NhdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1idXMtbWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE1lc3NhZ2VzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3BlY2lhbCBtZXNzYWdlIGJ1cyBuYW1lIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPgorICAgICAgICByZXNwb25kcyB0byBhIG51bWJlciBvZiBhZGRpdGlvbmFsIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1oZWxsbyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBTVFJJTkcgSGVsbG8gKCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGNvbm5lY3Rpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEJlZm9yZSBhbiBhcHBsaWNhdGlvbiBpcyBhYmxlIHRvIHNlbmQgbWVzc2FnZXMgdG8gb3RoZXIgYXBwbGljYXRpb25zCisgICAgICAgICAgaXQgbXVzdCBzZW5kIHRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD4gbWVzc2FnZQorICAgICAgICAgIHRvIHRoZSBtZXNzYWdlIGJ1cyB0byBvYnRhaW4gYSB1bmlxdWUgbmFtZS4gSWYgYW4gYXBwbGljYXRpb24gd2l0aG91dAorICAgICAgICAgIGEgdW5pcXVlIG5hbWUgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiwgb3IgYQorICAgICAgICAgIG1lc3NhZ2UgdG8gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZiB0aGF0IGlzbid0IHRoZQorICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9saXRlcmFsPiBtZXNzYWdlLCBpdCB3aWxsIGJlCisgICAgICAgICAgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nICJkaXNjb25uZWN0IiByZXF1ZXN0OyBpZiBhIGNsaWVudCB3aXNoZXMgdG8KKyAgICAgICAgICBkaXNjb25uZWN0IGZyb20gdGhlIGJ1cywgaXQgc2ltcGx5IGNsb3NlcyB0aGUgc29ja2V0IChvciBvdGhlciAKKyAgICAgICAgICBjb21tdW5pY2F0aW9uIGNoYW5uZWwpLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbGlzdC1uYW1lcyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0TmFtZXM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgU1RSSU5HIExpc3ROYW1lcyAoKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgU1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BcnJheSBvZiBzdHJpbmdzIHdoZXJlIGVhY2ggc3RyaW5nIGlzIGEgYnVzIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjdXJyZW50bHktb3duZWQgbmFtZXMgb24gdGhlIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWxpc3QtYWN0aXZhdGFibGUtbmFtZXMiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdEFjdGl2YXRhYmxlTmFtZXM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgU1RSSU5HIExpc3RBY3RpdmF0YWJsZU5hbWVzICgpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWFjaCBzdHJpbmcgaXMgYSBidXMgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG5hbWVzIHRoYXQgY2FuIGJlIGFjdGl2YXRlZCBvbiB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1leGlzdHMiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUhhc093bmVyPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEJPT0xFQU4gTmFtZUhhc093bmVyIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIGNoZWNrPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5CT09MRUFOPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWUsIHRydWUgaWYgdGhlIG5hbWUgZXhpc3RzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGV4aXN0cyAoY3VycmVudGx5IGhhcyBhbiBvd25lcikuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLW5hbWUtb3duZXItY2hhbmdlZCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lT3duZXJDaGFuZ2VkPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgaXMgYSBzaWduYWw6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgTmFtZU93bmVyQ2hhbmdlZCAoU1RSSU5HIG5hbWUsIFNUUklORyBvbGRfb3duZXIsIFNUUklORyBuZXdfb3duZXIpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB3aXRoIGEgbmV3IG93bmVyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+T2xkIG93bmVyIG9yIGVtcHR5IHN0cmluZyBpZiBub25lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmV3IG93bmVyIG9yIGVtcHR5IHN0cmluZyBpZiBub25lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIHNpZ25hbCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3duZXIgb2YgYSBuYW1lIGhhcyBjaGFuZ2VkLgorICAgICAgICAgIEl0J3MgYWxzbyB0aGUgc2lnbmFsIHRvIHVzZSB0byBkZXRlY3QgdGhlIGFwcGVhcmFuY2Ugb2YgCisgICAgICAgICAgbmV3IG5hbWVzIG9uIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWxvc3QiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3Q8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lTG9zdCAoU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB3aGljaCB3YXMgbG9zdDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBzaWduYWwgaXMgc2VudCB0byBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoZW4gaXQgbG9zZXMKKyAgICAgICAgICBvd25lcnNoaXAgb2YgYSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWFjcXVpcmVkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVBY3F1aXJlZDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIGlzIGEgc2lnbmFsOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIE5hbWVBY3F1aXJlZCAoU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB3aGljaCB3YXMgYWNxdWlyZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgc2lnbmFsIGlzIHNlbnQgdG8gYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGVuIGl0IGdhaW5zCisgICAgICAgICAgb3duZXJzaGlwIG9mIGEgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtc3RhcnQtc2VydmljZS1ieS1uYW1lIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZTwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgU3RhcnRTZXJ2aWNlQnlOYW1lIChpbiBTVFJJTkcgbmFtZSwgaW4gVUlOVDMyIGZsYWdzKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gc3RhcnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5GbGFncyAoY3VycmVudGx5IG5vdCB1c2VkKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBUcmllcyB0byBsYXVuY2ggdGhlIGV4ZWN1dGFibGUgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy1zdGFydGluZy1zZXJ2aWNlcyIvPi4KKworICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PklkZW50aWZpZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIHNlcnZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QSBjb25uZWN0aW9uIGFscmVhZHkgb3ducyB0aGUgZ2l2ZW4gbmFtZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50PC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCAoaW4gQVJSQVkgb2YgRElDVCZsdDtTVFJJTkcsU1RSSU5HJmd0OyBlbnZpcm9ubWVudCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgRElDVCZsdDtTVFJJTkcsU1RSSU5HJmd0OzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RW52aXJvbm1lbnQgdG8gYWRkIG9yIHVwZGF0ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIE5vcm1hbGx5LCBzZXNzaW9uIGJ1cyBhY3RpdmF0ZWQgc2VydmljZXMgaW5oZXJpdCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGJ1cyBkYWVtb24uICBUaGlzIG1ldGhvZCBhZGRzIHRvIG9yIG1vZGlmaWVzIHRoYXQgZW52aXJvbm1lbnQgd2hlbiBhY3RpdmF0aW5nIHNlcnZpY2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNvbWUgYnVzIGluc3RhbmNlcywgc3VjaCBhcyB0aGUgc3RhbmRhcmQgc3lzdGVtIGJ1cywgbWF5IGRpc2FibGUgYWNjZXNzIHRvIHRoaXMgbWV0aG9kIGZvciBzb21lIG9yIGFsbCBjYWxsZXJzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGUsIGJvdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgbXVzdCBiZSB2YWxpZCBVVEYtOC4gIFRoZXJlJ3Mgbm8gd2F5IHRvIHVwZGF0ZSB0aGUgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCB3aXRoIGRhdGEgdGhhdCBpcyBpbnZhbGlkIFVURi04LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1uYW1lLW93bmVyIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldE5hbWVPd25lcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBTVFJJTkcgR2V0TmFtZU93bmVyIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIGdldCB0aGUgb3duZXIgb2Y8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlLCBhIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmV0dXJucyB0aGUgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZSBvZiB0aGUgcHJpbWFyeSBvd25lciBvZiB0aGUgbmFtZQorICAgICAgICBnaXZlbi4gSWYgdGhlIHJlcXVlc3RlZCBuYW1lIGRvZXNuJ3QgaGF2ZSBhbiBvd25lciwgcmV0dXJucyBhCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk5hbWVIYXNOb093bmVyPC9saXRlcmFsPiBlcnJvci4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtY29ubmVjdGlvbi11bml4LXVzZXIiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0Q29ubmVjdGlvblVuaXhVc2VyPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBHZXRDb25uZWN0aW9uVW5peFVzZXIgKGluIFNUUklORyBidXNfbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgb3Igd2VsbC1rbm93biBidXMgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0bworICAgICAgICAgICAgICAgICAgICBxdWVyeSwgc3VjaCBhcyA8bGl0ZXJhbD46MTIuMzQ8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLnRlYTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5peCB1c2VyIElEPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJldHVybnMgdGhlIFVuaXggdXNlciBJRCBvZiB0aGUgcHJvY2VzcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci4gSWYKKyAgICAgICAgdW5hYmxlIHRvIGRldGVybWluZSBpdCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUKKyAgICAgICAgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uKSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtZ2V0LWNvbm5lY3Rpb24tdW5peC1wcm9jZXNzLWlkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCAoaW4gU1RSSU5HIGJ1c19uYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBvciB3ZWxsLWtub3duIGJ1cyBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBzdWNoIGFzIDxsaXRlcmFsPjoxMi4zNDwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUudGVhPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Vbml4IHByb2Nlc3MgaWQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmV0dXJucyB0aGUgVW5peCBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLiBJZgorICAgICAgICB1bmFibGUgdG8gZGV0ZXJtaW5lIGl0IChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhlIHByb2Nlc3MgaXMgbm90IG9uIHRoZQorICAgICAgICBzYW1lIG1hY2hpbmUgYXMgdGhlIGJ1cyBkYWVtb24pLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtY29ubmVjdGlvbi1jcmVkZW50aWFscyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uQ3JlZGVudGlhbHM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRJQ1QmbHQ7U1RSSU5HLFZBUklBTlQmZ3Q7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q3JlZGVudGlhbHM8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFJldHVybnMgYXMgbWFueSBjcmVkZW50aWFscyBhcyBwb3NzaWJsZSBmb3IgdGhlIHByb2Nlc3MgY29ubmVjdGVkIHRvCisgICAgICAgIHRoZSBzZXJ2ZXIuIElmIHVuYWJsZSB0byBkZXRlcm1pbmUgY2VydGFpbiBjcmVkZW50aWFscyAoZm9yIGluc3RhbmNlLAorICAgICAgICBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uLAorICAgICAgICBvciBiZWNhdXNlIHRoaXMgdmVyc2lvbiBvZiB0aGUgYnVzIGRhZW1vbiBkb2VzIG5vdCBzdXBwb3J0IGEKKyAgICAgICAgcGFydGljdWxhciBzZWN1cml0eSBmcmFtZXdvcmspLCBvciBpZiB0aGUgdmFsdWVzIG9mIHRob3NlIGNyZWRlbnRpYWxzCisgICAgICAgIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBkb2N1bWVudGVkIGhlcmUsIHRoZW4gdGhvc2UgY3JlZGVudGlhbHMKKyAgICAgICAgYXJlIG9taXR0ZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBLZXlzIGluIHRoZSByZXR1cm5lZCBkaWN0aW9uYXJ5IG5vdCBjb250YWluaW5nICIuIiBhcmUgZGVmaW5lZAorICAgICAgICBieSB0aGlzIHNwZWNpZmljYXRpb24uIEJ1cyBkYWVtb24gaW1wbGVtZW50b3JzIHN1cHBvcnRpbmcKKyAgICAgICAgY3JlZGVudGlhbHMgZnJhbWV3b3JrcyBub3QgbWVudGlvbmVkIGluIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGVpdGhlcgorICAgICAgICBjb250cmlidXRlIHBhdGNoZXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLCBvciB1c2Uga2V5cyBjb250YWluaW5nCisgICAgICAgICIuIiBhbmQgc3RhcnRpbmcgd2l0aCBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5LZXk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZSB0eXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXhVc2VySUQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbnVtZXJpYyBVbml4IHVzZXIgSUQsIGFzIGRlZmluZWQgYnkgUE9TSVg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UHJvY2Vzc0lEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG51bWVyaWMgcHJvY2VzcyBJRCwgb24gcGxhdGZvcm1zIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgdGhpcyBjb25jZXB0LiBPbiBVbml4LCB0aGlzIGlzIHRoZSBwcm9jZXNzIElEIGRlZmluZWQgYnkKKyAgICAgICAgICAgICAgICAgIFBPU0lYLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5XaW5kb3dzU0lEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIFdpbmRvd3Mgc2VjdXJpdHkgaWRlbnRpZmllciBpbiBpdHMgc3RyaW5nIGZvcm0sCisgICAgICAgICAgICAgICAgZS5nLiAiUy0xLTUtMjEtMzYyMzgxMTAxNS0zMzYxMDQ0MzQ4LTMwMzAwODIwLTEwMTMiIGZvcgorICAgICAgICAgICAgICAgIGEgZG9tYWluIG9yIGxvY2FsIGNvbXB1dGVyIHVzZXIgb3IgIlMtMS01LTE4IiBmb3IgdGhlCisgICAgICAgICAgICAgICAgTE9DQUxfU1lTVEVNIHVzZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5MaW51eFNlY3VyaXR5TGFiZWw8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA8cGFyYT5PbiBMaW51eCBzeXN0ZW1zLCB0aGUgc2VjdXJpdHkgbGFiZWwgdGhhdCB3b3VsZCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgU09fUEVFUlNFQyBnZXRzb2Nrb3B0IGNhbGwuIFRoZSBhcnJheSBjb250YWlucworICAgICAgICAgICAgICAgICAgICB0aGUgbm9uLXplcm8gYnl0ZXMgb2YgdGhlIHNlY3VyaXR5IGxhYmVsIGluIGFuIHVuc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgIEFTQ0lJLWNvbXBhdGlibGUgZW5jb2Rpbmc8Zm9vdG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+SXQgY291bGQgYmUgQVNDSUkgb3IgVVRGLTgsIGJ1dCBjb3VsZCBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICBJU08gTGF0aW4tMSBvciBhbnkgb3RoZXIgZW5jb2RpbmcuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2Zvb3Rub3RlPiwgZm9sbG93ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIFNFTGludXggY29udGV4dAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zeXN0ZW1fdTpzeXN0ZW1fcjppbml0X3Q6czA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIChhIHN0cmluZyBvZiBsZW5ndGggMjcpIHdvdWxkIGJlIGVuY29kZWQgYXMgMjggYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgZW5kaW5nIHdpdGggJzonLCAncycsICcwJywgJ1x4MDAnLjxmb290bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Ob3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9sZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb25uZWN0aW9uU0VMaW51eENvbnRleHQgbWV0aG9kLCB3aGljaCBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICBub3QgYXBwZW5kIHRoZSB6ZXJvIGJ5dGUuIEFsd2F5cyBhcHBlbmRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIGJ5dGUgYWxsb3dzIGNhbGxlcnMgdG8gcmVhZCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBtZXNzYWdlIHBheWxvYWQgd2l0aG91dCBjb3B5aW5nLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9mb290bm90ZT4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBPbiBTRUxpbnV4IHN5c3RlbXMgdGhpcyBpcyB0aGUgU0VMaW51eCBjb250ZXh0LCBhcyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgYnkgPGxpdGVyYWw+cHMgLVo8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmxzIC1aPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbCB2YWx1ZXMgbWlnaHQgaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zeXN0ZW1fdTpzeXN0ZW1fcjppbml0X3Q6czA8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD51bmNvbmZpbmVkX3U6dW5jb25maW5lZF9yOnVuY29uZmluZWRfdDpzMC1zMDpjMC5jMTAyMzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnVuY29uZmluZWRfdTp1bmNvbmZpbmVkX3I6Y2hyb21lX3NhbmRib3hfdDpzMC1zMDpjMC5jMTAyMzwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT24gU21hY2sgc3lzdGVtcywgdGhpcyBpcyB0aGUgU21hY2sgbGFiZWwuCisgICAgICAgICAgICAgICAgICAgIFR5cGljYWwgdmFsdWVzIG1pZ2h0IGluY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+XzwvbGl0ZXJhbD4sIDxsaXRlcmFsPio8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Vc2VyPC9saXRlcmFsPiwgPGxpdGVyYWw+U3lzdGVtPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBvciA8bGl0ZXJhbD5TeXN0ZW06OlNoYXJlZDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT24gQXBwQXJtb3Igc3lzdGVtcywgdGhpcyBpcyB0aGUgQXBwQXJtb3IgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgYSBjb21wb3NpdGUgc3RyaW5nIGVuY29kaW5nIHRoZSBBcHBBcm1vciBsYWJlbCAob25lIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMpIGFuZCB0aGUgZW5mb3JjZW1lbnQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbCB2YWx1ZXMgbWlnaHQgaW5jbHVkZSA8bGl0ZXJhbD51bmNvbmZpbmVkPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L3Vzci9iaW4vZmlyZWZveCAoZW5mb3JjZSk8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnVzZXIxIChjb21wbGFpbik8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCBpbiBELUJ1cyAxLjcgdG8gcmVkdWNlIHRoZSByb3VuZC10cmlwcworICAgICAgICAgIHJlcXVpcmVkIHRvIGxpc3QgYSBwcm9jZXNzJ3MgY3JlZGVudGlhbHMuIEluIG9sZGVyIHZlcnNpb25zLCBjYWxsaW5nCisgICAgICAgICAgdGhpcyBtZXRob2Qgd2lsbCBmYWlsOiBhcHBsaWNhdGlvbnMgc2hvdWxkIHJlY292ZXIgYnkgdXNpbmcgdGhlCisgICAgICAgICAgc2VwYXJhdGUgbWV0aG9kcyBzdWNoIGFzCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXVuaXgtdXNlciIvPgorICAgICAgICAgIGluc3RlYWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1hZHQtYXVkaXQtc2Vzc2lvbi1kYXRhIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldEFkdEF1ZGl0U2Vzc2lvbkRhdGE8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgQllURSBHZXRBZHRBdWRpdFNlc3Npb25EYXRhIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5hdWRpdGluZyBkYXRhIGFzIHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgIGFkdF9leHBvcnRfc2Vzc2lvbl9kYXRhKCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJldHVybnMgYXVkaXRpbmcgZGF0YSB1c2VkIGJ5IFNvbGFyaXMgQURULCBpbiBhbiB1bnNwZWNpZmllZAorICAgICAgICAgIGJpbmFyeSBmb3JtYXQuIElmIHlvdSBrbm93IHdoYXQgdGhpcyBtZWFucywgcGxlYXNlIGNvbnRyaWJ1dGUKKyAgICAgICAgICBkb2N1bWVudGF0aW9uIHZpYSB0aGUgRC1CdXMgYnVnIHRyYWNraW5nIHN5c3RlbS4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBvbiB0aGUgY29yZSBEQnVzIGludGVyZmFjZSBmb3IgaGlzdG9yaWNhbCByZWFzb25zOworICAgICAgICAgIHRoZSBzYW1lIGluZm9ybWF0aW9uIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB2aWEKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJidXMtbWVzc2FnZXMtZ2V0LWNvbm5lY3Rpb24tY3JlZGVudGlhbHMiLz4KKyAgICAgICAgICBpbiBmdXR1cmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXNlbGludXgtc2VjdXJpdHktY29udGV4dCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBCWVRFIEdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0IChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5zb21lIHNvcnQgb2Ygc3RyaW5nIG9mIGJ5dGVzLCBub3QgbmVjZXNzYXJpbHkgVVRGLTgsCisgICAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRpbmcgJ1wwJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmV0dXJucyB0aGUgc2VjdXJpdHkgY29udGV4dCB1c2VkIGJ5IFNFTGludXgsIGluIGFuIHVuc3BlY2lmaWVkCisgICAgICAgICAgZm9ybWF0LiBJZiB5b3Uga25vdyB3aGF0IHRoaXMgbWVhbnMsIHBsZWFzZSBjb250cmlidXRlCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiB2aWEgdGhlIEQtQnVzIGJ1ZyB0cmFja2luZyBzeXN0ZW0uCisgICAgICAgICAgVGhpcyBtZXRob2QgaXMgb24gdGhlIGNvcmUgREJ1cyBpbnRlcmZhY2UgZm9yIGhpc3RvcmljYWwgcmVhc29uczsKKyAgICAgICAgICB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdmlhCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLWNyZWRlbnRpYWxzIi8+CisgICAgICAgICAgaW4gZnV0dXJlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBZGRNYXRjaCAoaW4gU1RSSU5HIHJ1bGUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggcnVsZSB0byBhZGQgdG8gdGhlIGNvbm5lY3Rpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBBZGRzIGEgbWF0Y2ggcnVsZSB0byBtYXRjaCBtZXNzYWdlcyBnb2luZyB0aHJvdWdoIHRoZSBtZXNzYWdlIGJ1cyAoc2VlIDx4cmVmIGxpbmtlbmQ9J21lc3NhZ2UtYnVzLXJvdXRpbmctbWF0Y2gtcnVsZXMnLz4pLiAKKyAgICAgICAgSWYgdGhlIGJ1cyBkb2VzIG5vdCBoYXZlIGVub3VnaCByZXNvdXJjZXMgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9PTTwvbGl0ZXJhbD4KKyAgICAgICAgZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXJlbW92ZS1tYXRjaCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZW1vdmVNYXRjaDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBSZW1vdmVNYXRjaCAoaW4gU1RSSU5HIHJ1bGUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggcnVsZSB0byByZW1vdmUgZnJvbSB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJlbW92ZXMgdGhlIGZpcnN0IHJ1bGUgdGhhdCBtYXRjaGVzIChzZWUgPHhyZWYgbGlua2VuZD0nbWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcycvPikuIAorICAgICAgICBJZiB0aGUgcnVsZSBpcyBub3QgZm91bmQgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk1hdGNoUnVsZU5vdEZvdW5kPC9saXRlcmFsPgorICAgICAgICBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtaWQiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgR2V0SWQgKG91dCBTVFJJTkcgaWQpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgYnVzIGRhZW1vbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBHZXRzIHRoZSB1bmlxdWUgSUQgb2YgdGhlIGJ1cy4gVGhlIHVuaXF1ZSBJRCBoZXJlIGlzIHNoYXJlZCBhbW9uZyBhbGwgYWRkcmVzc2VzIHRoZSAKKyAgICAgICAgYnVzIGRhZW1vbiBpcyBsaXN0ZW5pbmcgb24gKFRDUCwgVU5JWCBkb21haW4gc29ja2V0LCBldGMuKSBhbmQgaXRzIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gCisgICAgICAgIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+LiBFYWNoIGFkZHJlc3MgdGhlIGJ1cyBpcyBsaXN0ZW5pbmcgb24gYWxzbyBoYXMgaXRzIG93biB1bmlxdWUgCisgICAgICAgIElELCBhcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+LiBUaGUgcGVyLWJ1cyBhbmQgcGVyLWFkZHJlc3MgSURzIGFyZSBub3QgcmVsYXRlZC4KKyAgICAgICAgVGhlcmUgaXMgYWxzbyBhIHBlci1tYWNoaW5lIElELCBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wZWVyIi8+IGFuZCByZXR1cm5lZAorICAgICAgICBieSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCgpLgorICAgICAgICBGb3IgYSBkZXNrdG9wIHNlc3Npb24gYnVzLCB0aGUgYnVzIElEIGNhbiBiZSB1c2VkIGFzIGEgd2F5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgdXNlcidzIHNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWJlY29tZS1tb25pdG9yIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk1vbml0b3JpbmcuQmVjb21lTW9uaXRvcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBCZWNvbWVNb25pdG9yIChpbiBBUlJBWSBvZiBTVFJJTkcgcnVsZSwgaW4gVUlOVDMyIGZsYWdzKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoIHJ1bGVzIHRvIGFkZCB0byB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCB1c2VkLCBtdXN0IGJlIDA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ29udmVydHMgdGhlIGNvbm5lY3Rpb24gaW50byBhIDxlbXBoYXNpcz5tb25pdG9yCisgICAgICAgICAgICBjb25uZWN0aW9uPC9lbXBoYXNpcz4gd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBkZWJ1Z2dpbmcvbW9uaXRvcmluZworICAgICAgICAgIHRvb2wuIE9ubHkgYSB1c2VyIHdobyBpcyBwcml2aWxlZ2VkIG9uIHRoaXMKKyAgICAgICAgICBidXMgKGJ5IHNvbWUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGVmaW5pdGlvbikgbWF5IGNyZWF0ZQorICAgICAgICAgIG1vbml0b3IgY29ubmVjdGlvbnM8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgSW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggdXNlciAoaWRlbnRpZmllZCBieQorICAgICAgICAgICAgICBudW1lcmljIHVzZXIgSUQpIG1heSBtb25pdG9yIHRoZWlyIG93biBzZXNzaW9uIGJ1cywKKyAgICAgICAgICAgICAgYW5kIHRoZSByb290IHVzZXIgKHVzZXIgSUQgemVybykgbWF5IG1vbml0b3IgdGhlCisgICAgICAgICAgICAgIHN5c3RlbSBidXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9mb290bm90ZT4uCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgICBNb25pdG9yIGNvbm5lY3Rpb25zIGxvc2UgYWxsIHRoZWlyIGJ1cyBuYW1lcywgaW5jbHVkaW5nIHRoZSB1bmlxdWUKKyAgICAgICAgIGNvbm5lY3Rpb24gbmFtZSwgYW5kIGFsbCB0aGVpciBtYXRjaCBydWxlcy4gU2VuZGluZyBtZXNzYWdlcyBvbiBhCisgICAgICAgICBtb25pdG9yIGNvbm5lY3Rpb24gaXMgbm90IGFsbG93ZWQ6IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIGEgcHJpdmF0ZQorICAgICAgICAgY29ubmVjdGlvbiBmb3IgbW9uaXRvcmluZy4KKyAgICAgICA8L3BhcmE+CisKKyAgICAgICA8cGFyYT4KKyAgICAgICAgIE1vbml0b3IgY29ubmVjdGlvbnMgbWF5IHJlY2VpdmUgYWxsIG1lc3NhZ2VzLCBldmVuIG1lc3NhZ2VzIHRoYXQKKyAgICAgICAgIHNob3VsZCBvbmx5IGhhdmUgZ29uZSB0byBzb21lIG90aGVyIGNvbm5lY3Rpb24gKCJlYXZlc2Ryb3BwaW5nIikuCisgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBsaXN0IG9mIG1hdGNoIHJ1bGVzLCB3aGljaCByZXBsYWNlIGFueQorICAgICAgICAgbWF0Y2ggcnVsZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgYWN0aXZlIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICBUaGVzZSBtYXRjaCBydWxlcyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgaWYgdGhleSBjb250YWluZWQgdGhlCisgICAgICAgICBzcGVjaWFsIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+IG1lbWJlci4KKyAgICAgICA8L3BhcmE+CisKKyAgICAgICA8cGFyYT4KKyAgICAgICAgIEFzIGEgc3BlY2lhbCBjYXNlLCBhbiBlbXB0eSBsaXN0IG9mIG1hdGNoIHJ1bGVzICh3aGljaCB3b3VsZAorICAgICAgICAgb3RoZXJ3aXNlIG1hdGNoIG5vdGhpbmcsIG1ha2luZyB0aGUgbW9uaXRvciB1c2VsZXNzKSBpcyB0cmVhdGVkCisgICAgICAgICBhcyBhIHNob3J0aGFuZCBmb3IgbWF0Y2hpbmcgYWxsIG1lc3NhZ2VzLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICAgVGhlIHNlY29uZCBhcmd1bWVudCBtaWdodCBiZSB1c2VkIGZvciBmbGFncyB0byBpbmZsdWVuY2UgdGhlCisgICAgICAgICBiZWhhdmlvdXIgb2YgdGhlIG1vbml0b3IgY29ubmVjdGlvbiBpbiBmdXR1cmUgRC1CdXMgdmVyc2lvbnMuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgICBNZXNzYWdlIGJ1cyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF0dGVtcHQgdG8gbWluaW1pemUgdGhlCisgICAgICAgICBzaWRlLWVmZmVjdHMgb2YgbW9uaXRvcmluZyDigJQgaW4gcGFydGljdWxhciwgdW5saWtlIG9yZGluYXJ5CisgICAgICAgICBlYXZlc2Ryb3BwaW5nLCBtb25pdG9yaW5nIHRoZSBzeXN0ZW0gYnVzIGRvZXMgbm90IHJlcXVpcmUgdGhlCisgICAgICAgICBhY2Nlc3MgY29udHJvbCBydWxlcyB0byBiZSByZWxheGVkLCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIHNldAorICAgICAgICAgb2YgbWVzc2FnZXMgdGhhdCBjYW4gYmUgZGVsaXZlcmVkIHRvIHRoZWlyIChub24tbW9uaXRvcikKKyAgICAgICAgIGRlc3RpbmF0aW9ucy4gSG93ZXZlciwgaXQgaXMgdW5hdm9pZGFibGUgdGhhdCBtb25pdG9yaW5nCisgICAgICAgICB3aWxsIGluY3JlYXNlIHRoZSBtZXNzYWdlIGJ1cydzIHJlc291cmNlIGNvbnN1bXB0aW9uLiBJbgorICAgICAgICAgZWRnZSBjYXNlcyB3aGVyZSB0aGVyZSB3YXMgYmFyZWx5IGVub3VnaCB0aW1lIG9yIG1lbW9yeSB3aXRob3V0CisgICAgICAgICBtb25pdG9yaW5nLCB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBtZXNzYWdlIGRlbGl2ZXJpZXMgZmFpbGluZworICAgICAgICAgd2hlbiB0aGV5IHdvdWxkIG90aGVyd2lzZSBoYXZlIHN1Y2NlZWRlZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorPCEtLQorICA8YXBwZW5kaXggaWQ9ImltcGxlbWVudGF0aW9uLW5vdGVzIj4KKyAgICA8dGl0bGU+SW1wbGVtZW50YXRpb24gbm90ZXM8L3RpdGxlPgorICAgIDxzZWN0MSBpZD0iaW1wbGVtZW50YXRpb24tbm90ZXMtc3Vic2VjdGlvbiI+CisgICAgICA8dGl0bGU+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDE+CisgIDwvYXBwZW5kaXg+CistLT4KKworICA8Z2xvc3Nhcnk+PHRpdGxlPkdsb3NzYXJ5PC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgZ2xvc3NhcnkgZGVmaW5lcyBzb21lIG9mIHRoZSB0ZXJtcyB1c2VkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1idXMtbmFtZSI+PGdsb3NzdGVybT5CdXMgTmFtZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gbmFtZXMgYW5kCisgICAgICAgICAgY29ubmVjdGlvbnMuIChOb3JtYWxseSwgdGhlcmUncyBvbmUgY29ubmVjdGlvbiBwZXIgYXBwbGljYXRpb24uKSAgQQorICAgICAgICAgIGJ1cyBuYW1lIGlzIHNpbXBseSBhbiBpZGVudGlmaWVyIHVzZWQgdG8gbG9jYXRlIGNvbm5lY3Rpb25zLiBGb3IKKyAgICAgICAgICBleGFtcGxlLCB0aGUgaHlwb3RoZXRpY2FsIDxsaXRlcmFsPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvbGl0ZXJhbD4KKyAgICAgICAgICBuYW1lIG1pZ2h0IGJlIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBzY3JlZW5zYXZlciBmcm9tIFlveW9keW5lCisgICAgICAgICAgQ29ycG9yYXRpb24uICBBbiBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIDxmaXJzdHRlcm0+b3duPC9maXJzdHRlcm0+IGEKKyAgICAgICAgICBuYW1lIGlmIHRoZSBtZXNzYWdlIGJ1cyBoYXMgYXNzb2NpYXRlZCB0aGUgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uCisgICAgICAgICAgd2l0aCB0aGUgbmFtZS4gIE5hbWVzIG1heSBhbHNvIGhhdmUgPGZpcnN0dGVybT5xdWV1ZWQKKyAgICAgICAgICBvd25lcnM8L2ZpcnN0dGVybT4gKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXF1ZXVlZC1vd25lciIvPikuCisgICAgICAgICAgICBUaGUgYnVzIGFzc2lnbnMgYSB1bmlxdWUgbmFtZSB0byBlYWNoIGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tdW5pcXVlLW5hbWUiLz4uIE90aGVyIG5hbWVzIAorICAgICAgICAgICAgICBjYW4gYmUgdGhvdWdodCBvZiBhcyAid2VsbC1rbm93biBuYW1lcyIgYW5kIGFyZSAKKyAgICAgICAgICAgICAgdXNlZCB0byBmaW5kIGFwcGxpY2F0aW9ucyB0aGF0IG9mZmVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiLz4gZm9yIGRldGFpbHMgb2YKKyAgICAgICAgICB0aGUgc3ludGF4IGFuZCBuYW1pbmcgY29udmVudGlvbnMgZm9yIGJ1cyBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisgICAgICAKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1tZXNzYWdlIj48Z2xvc3N0ZXJtPk1lc3NhZ2U8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXNzYWdlIGlzIHRoZSBhdG9taWMgdW5pdCBvZiBjb21tdW5pY2F0aW9uIHZpYSB0aGUgRC1CdXMKKyAgICAgICAgICBwcm90b2NvbC4gSXQgY29uc2lzdHMgb2YgYSA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYQorICAgICAgICAgIDxmaXJzdHRlcm0+Ym9keTwvZmlyc3R0ZXJtPjsgdGhlIGJvZHkgaXMgbWFkZSB1cCBvZgorICAgICAgICAgIDxmaXJzdHRlcm0+YXJndW1lbnRzPC9maXJzdHRlcm0+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLW1lc3NhZ2UtYnVzIj48Z2xvc3N0ZXJtPk1lc3NhZ2UgQnVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdCBmb3J3YXJkcyAKKyAgICAgICAgICBvciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucworICAgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgbWVzc2FnZSBidXMuIEl0IGFsc28gbWFuYWdlcyAKKyAgICAgICAgICA8Zmlyc3R0ZXJtPm5hbWVzPC9maXJzdHRlcm0+IHVzZWQgZm9yIHJvdXRpbmcKKyAgICAgICAgICBtZXNzYWdlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1uYW1lIj48Z2xvc3N0ZXJtPk5hbWU8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4uICJOYW1lIiBtYXkgCisgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gcmVmZXIgdG8gc29tZSBvZiB0aGUgb3RoZXIgbmFtZXMKKyAgICAgICAgICAgIGluIEQtQnVzLCBzdWNoIGFzIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ibmFtZXNwYWNlIj48Z2xvc3N0ZXJtPk5hbWVzcGFjZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVc2VkIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aGVuIGRlZmluaW5nIG5ldyBpbnRlcmZhY2VzLCBidXMgbmFtZXMKKyAgICAgICAgICBldGMuIFRoZSBjb252ZW50aW9uIHVzZWQgaXMgdGhlIHNhbWUgb25lIEphdmEgdXNlcyBmb3IgZGVmaW5pbmcKKyAgICAgICAgICBjbGFzc2VzOiBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIi8+LAorICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1vYmplY3QiPjxnbG9zc3Rlcm0+T2JqZWN0PC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYXBwbGljYXRpb24gY29udGFpbnMgPGZpcnN0dGVybT5vYmplY3RzPC9maXJzdHRlcm0+LCB3aGljaCBoYXZlCisgICAgICAgICAgPGZpcnN0dGVybT5pbnRlcmZhY2VzPC9maXJzdHRlcm0+IGFuZAorICAgICAgICAgIDxmaXJzdHRlcm0+bWV0aG9kczwvZmlyc3R0ZXJtPi4gT2JqZWN0cyBhcmUgcmVmZXJyZWQgdG8gYnkgYSBuYW1lLAorICAgICAgICAgIGNhbGxlZCBhIDxmaXJzdHRlcm0+cGF0aDwvZmlyc3R0ZXJtPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ib25lLXRvLW9uZSI+PGdsb3NzdGVybT5PbmUtdG8tT25lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFuIGFwcGxpY2F0aW9uIHRhbGtpbmcgZGlyZWN0bHkgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiwgd2l0aG91dCBnb2luZworICAgICAgICAgIHRocm91Z2ggYSBtZXNzYWdlIGJ1cy4gT25lLXRvLW9uZSBjb25uZWN0aW9ucyBtYXkgYmUgInBlZXIgdG8gcGVlciIgb3IKKyAgICAgICAgICAiY2xpZW50IHRvIHNlcnZlci4iIFRoZSBELUJ1cyBwcm90b2NvbCBoYXMgbm8gY29uY2VwdCBvZiBjbGllbnQKKyAgICAgICAgICB2cy4gc2VydmVyIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYXV0aGVudGljYXRlZDsgdGhlIGZsb3cgb2YgbWVzc2FnZXMKKyAgICAgICAgICBpcyBzeW1tZXRyaWNhbCAoZnVsbCBkdXBsZXgpLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXBhdGgiPjxnbG9zc3Rlcm0+UGF0aDwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlcyAob2JqZWN0IG5hbWVzKSBpbiBELUJ1cyBhcmUgb3JnYW5pemVkIGludG8gYQorICAgICAgICAgIGZpbGVzeXN0ZW0tc3R5bGUgaGllcmFyY2h5LCBzbyBlYWNoIG9iamVjdCBpcyBuYW1lZCBieSBhIHBhdGguIEFzIGluCisgICAgICAgICAgTERBUCwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gImZpbGVzIiBhbmQgImRpcmVjdG9yaWVzIjsgYSBwYXRoCisgICAgICAgICAgY2FuIHJlZmVyIHRvIGFuIG9iamVjdCwgd2hpbGUgc3RpbGwgaGF2aW5nIGNoaWxkIG9iamVjdHMgYmVsb3cgaXQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tcXVldWVkLW93bmVyIj48Z2xvc3N0ZXJtPlF1ZXVlZCBOYW1lIE93bmVyPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYnVzIG5hbWUgaGFzIGEgcHJpbWFyeSBvd25lcjsgbWVzc2FnZXMgc2VudCB0byB0aGUgbmFtZSBnbyB0byB0aGUKKyAgICAgICAgICBwcmltYXJ5IG93bmVyLiBIb3dldmVyLCBjZXJ0YWluIG5hbWVzIGFsc28gbWFpbnRhaW4gYSBxdWV1ZSBvZgorICAgICAgICAgIHNlY29uZGFyeSBvd25lcnMgIndhaXRpbmcgaW4gdGhlIHdpbmdzLiIgSWYgdGhlIHByaW1hcnkgb3duZXIgcmVsZWFzZXMKKyAgICAgICAgICB0aGUgbmFtZSwgdGhlbiB0aGUgZmlyc3Qgc2Vjb25kYXJ5IG93bmVyIGluIHRoZSBxdWV1ZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgYmVjb21lcyB0aGUgbmV3IG93bmVyIG9mIHRoZSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXNlcnZpY2UiPjxnbG9zc3Rlcm0+U2VydmljZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIHNlcnZpY2UgaXMgYW4gZXhlY3V0YWJsZSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBieSB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICBTZXJ2aWNlcyBub3JtYWxseSBndWFyYW50ZWUgc29tZSBwYXJ0aWN1bGFyIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSB0aGV5CisgICAgICAgICAgbWF5IGd1YXJhbnRlZSB0aGF0IHRoZXkgd2lsbCByZXF1ZXN0IGEgc3BlY2lmaWMgbmFtZSBzdWNoIGFzCisgICAgICAgICAgImNvbS5leGFtcGxlLlNjcmVlbnNhdmVyIiwgaGF2ZSBhIHNpbmdsZXRvbiBvYmplY3QKKyAgICAgICAgICAiL2NvbS9leGFtcGxlL0FwcGxpY2F0aW9uIiwgYW5kIHRoYXQgb2JqZWN0IHdpbGwgaW1wbGVtZW50IHRoZQorICAgICAgICAgIGludGVyZmFjZSAiY29tLmV4YW1wbGUuU2NyZWVuc2F2ZXIuQ29udHJvbCIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tc2VydmljZS1kZXNjcmlwdGlvbi1maWxlcyI+PGdsb3NzdGVybT5TZXJ2aWNlIERlc2NyaXB0aW9uIEZpbGVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICIuc2VydmljZSBmaWxlcyIgdGVsbCB0aGUgYnVzIGFib3V0IHNlcnZpY2UgYXBwbGljYXRpb25zIHRoYXQgY2FuIGJlCisgICAgICAgICAgbGF1bmNoZWQgKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXNlcnZpY2UiLz4pLiBNb3N0IGltcG9ydGFudGx5IHRoZXkKKyAgICAgICAgICBwcm92aWRlIGEgbWFwcGluZyBmcm9tIGJ1cyBuYW1lcyB0byBzZXJ2aWNlcyB0aGF0IHdpbGwgcmVxdWVzdCB0aG9zZQorICAgICAgICAgICAgbmFtZXMgd2hlbiB0aGV5IHN0YXJ0IHVwLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXVuaXF1ZS1uYW1lIj48Z2xvc3N0ZXJtPlVuaXF1ZSBDb25uZWN0aW9uIE5hbWU8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIHNwZWNpYWwgbmFtZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIGVhY2ggY29ubmVjdGlvbiBieSB0aGUKKyAgICAgICAgICBtZXNzYWdlIGJ1cy4gVGhpcyBuYW1lIHdpbGwgbmV2ZXIgY2hhbmdlIG93bmVyLCBhbmQgd2lsbCBiZSB1bmlxdWUKKyAgICAgICAgICAobmV2ZXIgcmV1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIG1lc3NhZ2UgYnVzKS4KKyAgICAgICAgICBJdCB3aWxsIGJlZ2luIHdpdGggYSAnOicgY2hhcmFjdGVyLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICA8L2dsb3NzYXJ5PgorPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtdGVzdC1wbGFuLnhtbCBiL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlZmQyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKQEAgLTAsMCArMSwyMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiCitbCitdPgorCis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+CisgICAgPHRpdGxlPkQtQnVzIFRlc3QgUGxhbjwvdGl0bGU+CisgICAgPGRhdGU+MTQgRmVicnVhcnkgMjAwMzwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+QW5kZXJzPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+Q2FybHNzb248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+Q29kZUZhY3RvcnkgQUI8L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U8L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9hcnRpY2xlaW5mbz4KKyAgPHNlY3QxIGlkPSJpbnRyb2R1Y3Rpb24iPgorICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhpcyBkb2N1bWVudCB0cmllcyB0byBleHBsYWluIHRoZSBkZXRhaWxzIG9mIHRoZSB0ZXN0IHBsYW4gZm9yIEQtQnVzCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iaW1wb3J0YW5jZS1vZi10ZXN0aW5nIj4KKyAgICAgIDx0aXRsZT5UaGUgaW1wb3J0YW5jZSBvZiB0ZXN0aW5nPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBcyB3aXRoIGFueSBiaWcgbGlicmFyeSBvciBwcm9ncmFtLCB0ZXN0aW5nIGlzIGltcG9ydGFudC4gSXQKKyAgICAgICAgY2FuIGhlbHAgZmluZCBidWdzIGFuZCByZWdyZXNzaW9ucyBhbmQgbWFrZSB0aGUgY29kZSBiZXR0ZXIKKyAgICAgICAgb3ZlcmFsbC4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgaXMgYSBsYXJnZSBhbmQgY29tcGxleCBwaWVjZSBvZiBzb2Z0d2FyZSAoYWJvdXQgMjUsMDAwCisgICAgICAgIGxpbmVzIG9mIGNvZGUgZm9yIHRoZSBjbGllbnQgbGlicmFyeSwgYW5kIDIsNTAwIGxpbmVzIG9mIGNvZGUKKyAgICAgICAgZm9yIHRoZSBidXMgZGFlbW9uKSBhbmQgaXQncyB0aGVyZWZvcmUgaW1wb3J0YW50IHRvIHRyeSB0byBtYWtlIHN1cmUKKyAgICAgICAgdGhhdCBhbGwgcGFydHMgb2YgdGhlIHNvZnR3YXJlIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyBjYW4gYmUgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciB0ZXN0aW5nIGJ5IHBhc3NpbmcKKyAgICAgICAgPGxpdGVyYWw+LS1lbmFibGUtdGVzdHM8L2xpdGVyYWw+LiB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4gSXQKKyAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBwcm9kdWN0aW9uIHN5c3RlbXMgYnVpbGQgd2l0aG91dCB0ZXN0aW5nCisgICAgICAgIHNpbmNlIHRoYXQgcmVkdWNlcyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgc2l6ZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImNsaWVudC1saWJyYXJ5Ij4KKyAgICA8dGl0bGU+VGVzdGluZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIHRlc3RzIGZvciB0aGUgY2xpZW50IGxpYnJhcnkgY29uc2lzdCBvZiB0aGUgdGVzdC1kYnVzCisgICAgICBwcm9ncmFtIHdoaWNoIGlzIGEgdW5pdCB0ZXN0IGZvciBhbGwgYXNwZWN0cyBvZiB0aGUgY2xpZW50CisgICAgICBsaWJyYXJ5LiBXaGVuZXZlciBhIGJ1ZyBpbiB0aGUgY2xpZW50IGxpYnJhcnkgaXMgZm91bmQgYW5kCisgICAgICBmaXhlZCwgYSB0ZXN0IGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWcgd29uJ3Qgb2NjdXIgYWdhaW4uCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iZGF0YS1zdHJ1Y3R1cmVzIj4KKyAgICAgIDx0aXRsZT5EYXRhIFN0cnVjdHVyZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICBUaGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgY29uc2lzdHMgb2Ygc29tZSBkYXRhIHN0cnVjdHVyZXMgdGhhdAorICAgICAgYXJlIHVzZWQgaW50ZXJuYWxseTsgYSBsaW5rZWQgbGlzdCBjbGFzcywgYSBoYXNodGFibGUgY2xhc3MgYW5kCisgICAgICBhIHN0cmluZyBjbGFzcy4gQWxsIGFzcGVjdHMgb2YgdGhvc2UgYXJlIHRlc3RlZCBieSB0ZXN0LWRidXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtbG9hZGVyIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIGxvYWRlcjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgbG9hZGVyIGlzIHRoZSBwYXJ0IG9mIEQtQnVzIHRoYXQgdGFrZXMgbWVzc2FnZXMgaW4KKyAgICAgICAgcmF3IGNoYXJhY3RlciBmb3JtIGFuZCBwYXJzZXMgdGhlbSwgdHVybmluZyB0aGVtIGludG8gREJ1c01lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgaXMgb25lIG9mIHRoZSBwYXJ0cyBvZiBELUJ1cyB0aGF0CisgICAgICAgIDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gYmUgYWJzb2x1dGVseSBidWctZnJlZSBhbmQKKyAgICAgICAgcm9idXN0LiBUaGUgbWVzc2FnZSBsb2FkZXIgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGludmFsaWQKKyAgICAgICAgYW5kIGluY29tcGxldGUgbWVzc2FnZXMgd2l0aG91dCBjcmFzaGluZy4gTm90IGRvaW5nIHNvIGlzIGEKKyAgICAgICAgc2VyaW91cyBpc3N1ZSBhbmQgY2FuIGVhc2lseSByZXN1bHQgaW4gRC1CdXMgYmVpbmcgZXhwbG9pdGFibGUKKyAgICAgICAgdG8gRG9TIGF0dGFja3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVG8gc29sdmUgdGhlc2UgcHJvYmxlbXMsIHRoZXJlIGlzIGEgdGVzdGluZyBmZWF0dXJlIGNhbGxlZCB0aGUKKyAgICAgICAgTWVzc2FnZSBCdWlsZGVyLiBUaGUgbWVzc2FnZSBidWlsZGVyIGNhbiB0YWtlIGEgc2VyaWFsaXplZAorICAgICAgICBtZXNzYWdlIGluIHN0cmluZy1mb3JtIGFuZCBjb252ZXJ0IGl0IGludG8gYSByYXcgY2hhcmFjdGVyCisgICAgICAgIHN0cmluZyB3aGljaCBjYW4gdGhlbiBiZSBsb2FkZWQgYnkgdGhlIG1lc3NhZ2UgbG9hZGVyLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxmaWd1cmU+CisJPHRpdGxlPkV4YW1wbGUgb2YgYSBtZXNzYWdlIGluIHN0cmluZyBmb3JtPC90aXRsZT4KKwk8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbyBtZXNzYWdlCisKKyAgICAgICAgICBWQUxJRF9IRUFERVIKKyAgICAgICAgICBGSUVMRF9OQU1FIG5hbWUKKyAgICAgICAgICBUWVBFIFNUUklORworICAgICAgICAgIFNUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8nCisgICAgICAgICAgRklFTERfTkFNRSBzcnZjCisgICAgICAgICAgVFlQRSBTVFJJTkcKKyAgICAgICAgICBTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworICAgICAgICAgIEFMSUdOIDgKKyAgICAgICAgICBFTkRfTEVOR1RIIEhlYWRlcgorICAgICAgICAgIFNUQVJUX0xFTkdUSCBCb2R5CisgICAgICAgICAgRU5EX0xFTkdUSCBCb2R5CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L2ZpZ3VyZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZmlsZSBmb3JtYXQgb2YgbWVzc2FnZXMgaW4gc3RyaW5nIGZvcm0gaXMgZG9jdW1lbnRlZCBpbgorICAgICAgICB0aGUgRC1CdXMgUmVmZXJlbmNlIE1hbnVhbC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSB0ZXN0IHBhcnQgb2YgdGVzdC1kYnVzIGlzIHVzaW5nIHRoZSBtZXNzYWdlCisgICAgICAgIGJ1aWxkZXIgdG8gYnVpbGQgZGlmZmVyZW50IGtpbmRzIG9mIG1lc3NhZ2VzLCBib3RoIHZhbGlkLAorICAgICAgICBpbnZhbGlkLCBhbmQgaW52YWxpZCBvbmVzLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZGVyIHdvbid0CisgICAgICAgIGNyYXNoIG9yIGxlYWsgbWVtb3J5IG9mIGFueSBvZiB0aG9zZSwgYW5kIHRoYXQgdGhlIGxvYWRlcgorICAgICAgICBrbm93cyBpZiBhIG1lc3NhZ2UgaXMgdmFsaWQgb3Igbm90LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGlzIGFsc28gYSB0ZXN0IHByb2dyYW0gY2FsbGVkCisgICAgICAgIDxsaXRlcmFsPmJyZWFrLWxvYWRlcjwvbGl0ZXJhbD4gdGhhdCBsb2FkcyBhIG1lc3NhZ2UgaW4KKyAgICAgICAgc3RyaW5nLWZvcm0gaW50byByYXcgY2hhcmFjdGVyIGZvcm0gdXNpbmcgdGhlIG1lc3NhZ2UKKyAgICAgICAgYnVpbGRlci4gSXQgdGhlbiByYW5kb21seSBjaGFuZ2VzIHRoZSBtZXNzYWdlLCBpdCBjYW4gZm9yCisgICAgICAgIGV4YW1wbGUgcmVwbGFjZSBzaW5nbGUgYnl0ZXMgb2YgZGF0YSBvciBtb2RpZnkgdGhlIGxlbmd0aCBvZgorICAgICAgICB0aGUgbWVzc2FnZS4gVGhpcyBpcyB0byBzaW11bGF0ZSBuZXR3b3JrIGVycm9ycy4gVGhlCisgICAgICAgIGJyZWFrLWxvYWRlciBwcm9ncmFtIHNhdmVzIGFsbCB0aGUgbWVzc2FnZXMgbGVhZGluZyB0byBlcnJvcnMKKyAgICAgICAgc28gaXQgY2FuIGVhc2lseSBiZSBydW4gZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aGVudGljYXRpb24iPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBGb3IgdGVzdGluZyBhdXRoZW50aWNhdGlvbiwgdGhlcmUgaXMgYSB0ZXN0aW5nIGZlYXR1cmUgdGhhdAorICAgICAgICBjYW4gcmVhZCBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZXMgZnJvbSBhIGZpbGUgYW5kIHBsYXkgdGhlbQorICAgICAgICBiYWNrIHRvIGEgZHVtbXkgc2VydmVyIGFuZCBjbGllbnQgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgYXV0aGVudGljYXRpb24gaXMgd29ya2luZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8ZmlndXJlPgorCTx0aXRsZT5FeGFtcGxlIG9mIGFuIGF1dGhlbnRpY2F0aW9uIHNjcmlwdDwvdGl0bGU+CisJPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICMjIHRoaXMgdGVzdHMgYSBzdWNjZXNzZnVsIGF1dGggb2YgdHlwZSBFWFRFUk5BTAorICAgICAgICAgIAorICAgICAgICAgIFNFUlZFUgorICAgICAgICAgIFNFTkQgJ0FVVEggRVhURVJOQUwgVVNFUk5BTUVfSEVYJworICAgICAgICAgIEVYUEVDVF9DT01NQU5EIE9LCisgICAgICAgICAgRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisgICAgICAgICAgU0VORCAnQkVHSU4nCisgICAgICAgICAgRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvZmlndXJlPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0iZGFlbW9uIj4KKyAgICA8dGl0bGU+VGVzdGluZyB0aGUgRC1CdXMgYnVzIGRhZW1vbjwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBTaW5jZSB0aGUgRC1CdXMgYnVzIGRhZW1vbiBpcyB1c2luZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgaXQKKyAgICAgIHdpbGwgYmVuZWZpdCBmcm9tIGFsbCB0ZXN0cyBkb25lIG9uIHRoZSBjbGllbnQgbGlicmFyeSwgYnV0CisgICAgICB0aGVyZSBpcyBzdGlsbCB0aGUgaXNzdWUgb2YgdGVzdGluZyBjbGllbnQtc2VydmVyIGNvbW11bmljYXRpb24uCisgICAgICBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgc2luY2UgaXQgaXQgbWF5IHJlcXVpcmUgYW5vdGhlciBwcm9jZXNzCisgICAgICBydW5uaW5nLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImRlYnVnLXRyYW5zcG9ydCI+CisgICAgICA8dGl0bGU+VGhlIGRlYnVnIHRyYW5zcG9ydDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gRC1CdXMsIGEgPGVtcGhhc2lzPnRyYW5zcG9ydDwvZW1waGFzaXM+IGlzIGEgY2xhc3MgdGhhdAorICAgICAgICBoYW5kbGVzIHNlbmRpbmcgYW5kIHJlY2VpdmluZyByYXcgZGF0YSBvdmVyIGEgY2VydGFpbgorICAgICAgICBtZWRpdW0uIFRoZSB0cmFuc3BvcnQgdGhhdCBpcyB1c2VkIG1vc3QgaW4gRC1CdXMgaXMgdGhlIFVOSVgKKyAgICAgICAgdHJhbnNwb3J0IHdpdGggc2VuZHMgYW5kIHJlY2V2aWVzIGRhdGEgb3ZlciBhIFVOSVggc29ja2V0LiBBCisgICAgICAgIHRyYW5zcG9ydCB0aGF0IHR1bm5lbHMgZGF0YSB0aHJvdWdoIFgxMSBjbGllbnQgbWVzc2FnZXMgaXMKKyAgICAgICAgYWxzbyB1bmRlciBkZXZlbG9wbWVudC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRC1CdXMgZGVidWcgdHJhbnNwb3J0IGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNwb3J0IHRoYXQKKyAgICAgICAgd29ya3MgaW4tcHJvY2Vzcy4gVGhpcyBtZWFucyB0aGF0IGEgY2xpZW50IGFuZCBzZXJ2ZXIgdGhhdAorICAgICAgICBleGlzdHMgaW4gdGhlIHNhbWUgcHJvY2VzcyBjYW4gdGFsayB0byBlYWNob3RoZXIgd2l0aG91dCB1c2luZworICAgICAgICBhIHNvY2tldC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idGVzdC1idXMiPgorICAgICAgPHRpdGxlPlRoZSB0ZXN0LWJ1cyBwcm9ncmFtPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdGVzdC1idXMgcHJvZ3JhbSBpcyBhIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIHRlc3QgdmFyaW91cworICAgICAgICBwYXJ0cyBvZiB0aGUgRC1CdXMgYnVzIGRhZW1vbjsgcm9idXN0bmVzcyBhbmQgdGhhdCBpdCBjb25mb3JtcworICAgICAgICB0byB0aGUgc3BlY2lmaWNhdGlvbnMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHRlc3QgcHJvZ3JhbSBoYXMgdGhlIG5lY2Vzc2FyeSBjb2RlIGZyb20gdGhlIGJ1cyBkYWVtb24KKyAgICAgICAgbGlua2VkIGluLCBhbmQgaXQgdXNlcyB0aGUgZGVidWcgdHJhbnNwb3J0IGZvcgorICAgICAgICBjb21tdW5pY2F0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJ1cyBkYWVtb24gY29kZSBjYW4gYmUKKyAgICAgICAgdGVzdGVkIHdpdGhvdXQgdGhlIHJlYWwgYnVzIGFjdHVhbGx5IHJ1bm5pbmcsIHdoaWNoIG1ha2VzCisgICAgICAgIHRlc3RpbmcgZWFzaWVyLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB0ZXN0LWJ1cyBwcm9ncmFtIHNob3VsZCB0ZXN0IGFsbCBtYWpvciBmZWF0dXJlcyBvZiB0aGUKKyAgICAgICAgYnVzLCBzdWNoIGFzIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBub3RpZmljYXRpb24gd2hlbiB0aGluZ3MKKyAgICAgICAgb2NjdXJzIGFuZCBtZXNzYWdlIG1hdGNoaW5nLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0ib3RoZXItdGVzdHMiPgorICAgIDx0aXRsZT5PdGhlciB0ZXN0czwvdGl0bGU+CisKKyAgICA8c2VjdDIgaWQ9Im9vbS1yb2J1c3RuZXNzIj4KKyAgICAgIDx0aXRsZT5PdXQtT2YtTWVtb3J5IHJvYnVzdG5lc3M8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFNpbmNlIEQtQnVzIHNob3VsZCBiZSBhYmxlIHRvIGJlIHVzZWQgaW4gZW1iZWRkZWQgZGV2aWNlcywgYW5kCisgICAgICAgIGFsc28gYXMgYSBzeXN0ZW0gc2VydmljZSwgaXQgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoCisgICAgICAgIGxvdy1tZW1vcnkgc2l0dWF0aW9ucyB3aXRob3V0IGV4aXRpbmcgb3IgY3Jhc2hpbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb2RlCisgICAgICAgIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgZGJ1c19tYWxsb2MgcmV0dXJuaW5nIE5VTEwuIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRvIHRlc3QgdGhpcywgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICBleGlzdC4gPGxpdGVyYWw+REJVU19NQUxMT0NfRkFJTF9OVEg8L2xpdGVyYWw+IHdpbGwgbWFrZSBldmVyeQorICAgICAgICBudGggY2FsbCB0byBkYnVzX21hbGxvYyByZXR1cm4gTlVMTCwgYW5kCisgICAgICAgIDxsaXRlcmFsPkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOPC9saXRlcmFsPiB3aWxsIG1ha2UgYW55CisgICAgICAgIGRidXNfbWFsbG9jIGNhbGwgd2l0aCBhIHJlcXVlc3QgZm9yIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkCisgICAgICAgIG51bWJlciBvZiBieXRlcyBmYWlsLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImxlYWtzLWFuZC1vdGhlci1zdHVmZiI+CisgICAgICA8dGl0bGU+TWVtb3J5IGxlYWtzIGFuZCBjb2RlIHJvYnVzdG5lc3M8L3RpdGxlPiAKKyAgICAgIDxwYXJhPgorICAgICAgICBOYXR1cmFsbHkgdGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgdGVzdHMgY2FuJ3QgYmUgd3JpdHRlbgorICAgICAgICBmb3IsIGZvciBleGFtcGxlIHRoaW5ncyBsaWtlIG1lbW9yeSBsZWFrcyBhbmQgb3V0LW9mLWJvdW5kcworICAgICAgICBtZW1vcnkgcmVhZGluZyBvciB3cml0aW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEx1Y2tpbHkgdGhlcmUgZXhpc3RzIGdvb2QgdG9vbHMgZm9yIGNhdGNoaW5nIHN1Y2ggZXJyb3JzLiBPbmUKKyAgICAgICAgZnJlZSBnb29kIHRvb2wgaXMgPHVsaW5rIHVybD0iaHR0cDovL2RldmVsLWhvbWUua2RlLm9yZy9+c2V3YXJkai8iPlZhbGdyaW5kPC91bGluaz4sIHdoaWNoIHJ1bnMgdGhlIHByb2dyYW0gaW4gYQorICAgICAgICB2aXJ0dWFsIENQVSB3aGljaCBtYWtlcyBjYXRjaGluZyBlcnJvcnMgZWFzeS4gQWxsIHRlc3QgcHJvZ3JhbXMgY2FuIGJlIHJ1biB1bmRlciBWYWxncmluZCwgCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXRlc3QtdG9vbC4xLnhtbC5pbiBiL2RvYy9kYnVzLXRlc3QtdG9vbC4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdjNDNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtdGVzdC10b29sLjEueG1sLmluCkBAIC0wLDAgKzEsMzI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIiAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0iZGJ1cy10ZXN0LXRvb2wuMSI+CisgIDxyZWZlbnRyeWluZm8+CisgICAgPGNvcHlyaWdodD4KKyAgICAgIDx5ZWFyPjIwMTU8L3llYXI+CisgICAgICA8aG9sZGVyPkNvbGxhYm9yYSBMdGQuPC9ob2xkZXI+CisgICAgPC9jb3B5cmlnaHQ+CisgICAgPGxlZ2Fsbm90aWNlPgorICAgICAgPHBhcmE+VGhpcyBtYW4gcGFnZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcworICAgICAgICBkYnVzLXRlc3QtdG9vbCAoR1BMLTIrKS4gVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQKKyAgICAgICAgcGVybWl0dGVkIGJ5IGxhdy48L3BhcmE+CisgICAgPC9sZWdhbG5vdGljZT4KKyAgPC9yZWZlbnRyeWluZm8+CisKKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+ZGJ1cy10ZXN0LXRvb2w8L3JlZmVudHJ5dGl0bGU+CisgICAgPG1hbnZvbG51bT4xPC9tYW52b2xudW0+CisgICAgPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0ic291cmNlIj5ELUJ1czwvcmVmbWlzY2luZm8+CisgICAgPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+CisgIDwvcmVmbWV0YT4KKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZGJ1cy10ZXN0LXRvb2w8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+RC1CdXMgdHJhZmZpYyBnZW5lcmF0b3IgYW5kIHRlc3QgdG9vbDwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2RpdiBpZD0ic3lub3BzaXMiPgorICAgIDxjbWRzeW5vcHNpcz4KKyAgICAgIDxjb21tYW5kPmRidXMtdGVzdC10b29sPC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj5ibGFjay1ob2xlPC9hcmc+CisgICAgICA8Z3JvdXAgY2hvaWNlPSJvcHQiPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc2Vzc2lvbjwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc3lzdGVtPC9hcmc+CisgICAgICA8L2dyb3VwPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1uYW1lPTxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbm8tcmVhZDwvYXJnPgorICAgIDwvY21kc3lub3BzaXM+CisKKyAgICA8Y21kc3lub3BzaXM+CisgICAgICA8Y29tbWFuZD5kYnVzLXRlc3QtdG9vbDwvY29tbWFuZD4KKyAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+ZWNobzwvYXJnPgorICAgICAgPGdyb3VwIGNob2ljZT0ib3B0Ij4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXNlc3Npb248L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXN5c3RlbTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbmFtZT08cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLXNsZWVwLW1zPTxyZXBsYWNlYWJsZT5NUzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPC9jbWRzeW5vcHNpcz4KKworICAgIDxjbWRzeW5vcHNpcz4KKyAgICAgIDxjb21tYW5kPmRidXMtdGVzdC10b29sPC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj5zcGFtPC9hcmc+CisgICAgICA8Z3JvdXAgY2hvaWNlPSJvcHQiPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc2Vzc2lvbjwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc3lzdGVtPC9hcmc+CisgICAgICA8L2dyb3VwPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1kZXN0PTxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tY291bnQ9PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1mbG9vZDwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1pZ25vcmUtZXJyb3JzPC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLW1lc3NhZ2VzLXBlci1jb25uPTxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbm8tcmVwbHk8L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tcXVldWU9PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1zZWVkPTxyZXBsYWNlYWJsZT5TRUVEPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxncm91cCBjaG9pY2U9Im9wdCI+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1zdHJpbmc8L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLWJ5dGVzPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1lbXB0eTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICAgIDxncm91cCBjaG9pY2U9Im9wdCI+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1wYXlsb2FkPTxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXN0ZGluPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1tZXNzYWdlLXN0ZGluPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1yYW5kb20tc2l6ZTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICA8L2NtZHN5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MSBpZD0iZGVzY3JpcHRpb24iPgorICAgIDx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+CisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy10ZXN0LXRvb2w8L2NvbW1hbmQ+IGlzIGEgbXVsdGktcHVycG9zZSB0b29sCisgICAgICBmb3IgZGVidWdnaW5nIGFuZCBwcm9maWxpbmcgRC1CdXMuPC9wYXJhPgorCisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy10ZXN0LXRvb2wgYmxhY2staG9sZTwvY29tbWFuZD4KKyAgICAgIGNvbm5lY3RzIHRvIEQtQnVzLCBvcHRpb25hbGx5IHJlcXVlc3RzIGEgbmFtZSwgdGhlbiBkb2VzIG5vdAorICAgICAgcmVwbHkgdG8gbWVzc2FnZXMuIEl0IG5vcm1hbGx5IHJlYWRzIGFuZCBkaXNjYXJkcyBtZXNzYWdlcyBmcm9tCisgICAgICBpdHMgRC1CdXMgc29ja2V0LCBidXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc2xlZXAgZm9yZXZlciB3aXRob3V0CisgICAgICByZWFkaW5nLjwvcGFyYT4KKworICAgIDxwYXJhPjxjb21tYW5kPmRidXMtdGVzdC10b29sIGVjaG88L2NvbW1hbmQ+CisgICAgICBjb25uZWN0cyB0byBELUJ1cywgb3B0aW9uYWxseSByZXF1ZXN0cyBhIG5hbWUsIHRoZW4gc2VuZHMgYmFjayBhbgorICAgICAgZW1wdHkgcmVwbHkgdG8gZXZlcnkgbWV0aG9kIGNhbGwsIGFmdGVyIGFuIG9wdGlvbmFsIGRlbGF5LjwvcGFyYT4KKworICAgIDxwYXJhPjxjb21tYW5kPmRidXMtdGVzdC10b29sIHNwYW08L2NvbW1hbmQ+CisgICAgICBjb25uZWN0cyB0byBELUJ1cyBhbmQgbWFrZXMgcmVwZWF0ZWQgbWV0aG9kIGNhbGxzLAorICAgICAgbm9ybWFsbHkgbmFtZWQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuU3BhbTwvbGl0ZXJhbD4uPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0ib3B0aW9ucyI+CisgICAgPHRpdGxlPk9QVElPTlM8L3RpdGxlPgorICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5Db21tb24gb3B0aW9uczwvdGl0bGU+CisgICAgICA8dmFyaWFibGVsaXN0IHJlbWFwPSJUUCI+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5Db25uZWN0IHRvIHRoZSBzZXNzaW9uIGJ1cy4gVGhpcyBpcyB0aGUgZGVmYXVsdC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tc3lzdGVtPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPkNvbm5lY3QgdG8gdGhlIHN5c3RlbSBidXMuPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICA8L3JlZnNlY3QyPgorCisgICAgPHJlZnNlY3QyPgorICAgICAgPHRpdGxlPmJsYWNrLWhvbGUgbW9kZTwvdGl0bGU+CisgICAgICA8dmFyaWFibGVsaXN0IHJlbWFwPSJUUCI+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tbmFtZT08L29wdGlvbj48cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPkJlZm9yZSBwcm9jZWVkaW5nLCByZXF1ZXN0IG93bmVyc2hpcCBvZiB0aGUgd2VsbC1rbm93bgorICAgICAgICAgICAgICBidXMgbmFtZSA8cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+LCBmb3IgZXhhbXBsZQorICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5Ob1JlcGx5PC9saXRlcmFsPi4gQnkgZGVmYXVsdCwKKyAgICAgICAgICAgICAgbm8gbmFtZSBpcyByZXF1ZXN0ZWQsIGFuZCB0aGUgdG9vbCBjYW4gb25seSBiZSBhZGRyZXNzZWQgYnkKKyAgICAgICAgICAgICAgYSB1bmlxdWUgYnVzIG5hbWUgc3VjaCBhcyA8bGl0ZXJhbD46MS4yMzwvbGl0ZXJhbD4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5vLXJlYWQ8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+RG8gbm90IHJlYWQgZnJvbSB0aGUgRC1CdXMgc29ja2V0LjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5lY2hvIG1vZGU8L3RpdGxlPgorICAgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5hbWU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5CZWZvcmUgcHJvY2VlZGluZywgcmVxdWVzdCBvd25lcnNoaXAgb2YgdGhlIHdlbGwta25vd24KKyAgICAgICAgICAgICAgYnVzIG5hbWUgPHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPiwgZm9yIGV4YW1wbGUKKyAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuRWNobzwvbGl0ZXJhbD4uIEJ5IGRlZmF1bHQsCisgICAgICAgICAgICAgIG5vIG5hbWUgaXMgcmVxdWVzdGVkLCBhbmQgdGhlIHRvb2wgY2FuIG9ubHkgYmUgYWRkcmVzc2VkIGJ5CisgICAgICAgICAgICAgIGEgdW5pcXVlIGJ1cyBuYW1lIHN1Y2ggYXMgPGxpdGVyYWw+OjEuMjM8L2xpdGVyYWw+LjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zbGVlcC1tcz08L29wdGlvbj48cmVwbGFjZWFibGU+TVM8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5CbG9jayBmb3IgPHJlcGxhY2VhYmxlPk1TPC9yZXBsYWNlYWJsZT4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgIGJlZm9yZSByZXBseWluZyB0byBhIG1ldGhvZCBjYWxsLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5zcGFtIG1vZGU8L3RpdGxlPgorICAgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLWRlc3Q9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5TZW5kIG1ldGhvZCBjYWxscyB0byB0aGUgd2VsbC1rbm93biBvciB1bmlxdWUKKyAgICAgICAgICAgICAgYnVzIG5hbWUgPHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPi4KKyAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdGhlIGRidXMtZGFlbW9uLAorICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLWNvdW50PTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+U2VuZCA8cmVwbGFjZWFibGU+TjwvcmVwbGFjZWFibGU+IG1ldGhvZCBjYWxscyBpbiB0b3RhbC4KKyAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgMS48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tcXVldWU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5TZW5kIDxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT4gbWV0aG9kIGNhbGxzIGJlZm9yZQorICAgICAgICAgICAgICB3YWl0aW5nIGZvciBhbnkgcmVwbGllcywgdGhlbiBzZW5kIG9uZSBuZXcgY2FsbCBwZXIgcmVwbHkKKyAgICAgICAgICAgICAgcmVjZWl2ZWQsIGtlZXBpbmcgPHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPiBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgICAgImluIGZsaWdodCIgYXQgYWxsIHRpbWVzIHVudGlsIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgIHdpdGggdGhlIDxvcHRpb24+LS1jb3VudDwvb3B0aW9uPiBvcHRpb24gaGF2ZSBiZWVuIHNlbnQuCisgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIDEsIHVubGVzcyA8b3B0aW9uPi0tZmxvb2Q8L29wdGlvbj4KKyAgICAgICAgICAgICAgaXMgdXNlZC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tZmxvb2Q8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+U2VuZCBhbGwgbWVzc2FnZXMgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlcGx5LAorICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIDxvcHRpb24+LS1xdWV1ZTwvb3B0aW9uPiB3aXRoIGFuIGFyYml0cmFyaWx5CisgICAgICAgICAgICAgIGxhcmdlIDxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5vLXJlcGx5PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPlNldCB0aGUgIm5vIHJlcGx5IGRlc2lyZWQiIGZsYWcgb24gdGhlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICBUaGlzIGltcGxpZXMgPG9wdGlvbj4tLWZsb29kPC9vcHRpb24+LCBzaW5jZSBpdCBkaXNhYmxlcworICAgICAgICAgICAgICB0aGUgcmVwbGllcyB0aGF0IHdvdWxkIGJlIHVzZWQgZm9yIGEgZmluaXRlCisgICAgICAgICAgICAgIDxvcHRpb24+LS1xdWV1ZTwvb3B0aW9uPiBsZW5ndGguPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW1lc3NhZ2VzLXBlci1jb25uPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+SWYgZ2l2ZW4sIHNlbmQgPHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPiBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgICAgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgdGhlbiBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QuCisgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBhbGwgbWV0aG9kCisgICAgICAgICAgICAgIGNhbGxzLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zdHJpbmc8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VGhlIHBheWxvYWQgb2YgZWFjaCBtZXNzYWdlIGlzIGEgVVRGLTggc3RyaW5nLiBUaGlzIGlzIHRoZQorICAgICAgICAgICAgICBkZWZhdWx0LiBUaGUgYWN0dWFsIHN0cmluZyB1c2VkIGlzIGdpdmVuIGJ5IHRoZQorICAgICAgICAgICAgICA8b3B0aW9uPi0tcGF5bG9hZDwvb3B0aW9uPiBvciA8b3B0aW9uPi0tc3RkaW48L29wdGlvbj4KKyAgICAgICAgICAgICAgb3B0aW9uLCBkZWZhdWx0aW5nIHRvICJoZWxsbywgd29ybGQhIi48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tYnl0ZXM8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VGhlIHBheWxvYWQgb2YgZWFjaCBtZXNzYWdlIGlzIGEgYnl0ZS1hcnJheS4KKyAgICAgICAgICAgICAgVGhlIGFjdHVhbCBieXRlcyB1c2VkIGFyZSBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgPG9wdGlvbj4tLXBheWxvYWQ8L29wdGlvbj4gb3IgPG9wdGlvbj4tLXN0ZGluPC9vcHRpb24+CisgICAgICAgICAgICAgIG9wdGlvbiwgZGVmYXVsdGluZyB0byB0aGUgQVNDSUkgZW5jb2Rpbmcgb2YKKyAgICAgICAgICAgICAgImhlbGxvLCB3b3JsZCEiLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1lbXB0eTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5UaGUgbWVzc2FnZXMgaGF2ZSBubyBwYXlsb2FkLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1wYXlsb2FkPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VXNlIDxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT4gYXMgdGhlCisgICAgICAgICAgICAgIDxvcHRpb24+LS1zdHJpbmc8L29wdGlvbj4gb3IgPG9wdGlvbj4tLWJ5dGVzPC9vcHRpb24+CisgICAgICAgICAgICAgIGluIHRoZSBtZXNzYWdlcy4gVGhlIGRlZmF1bHQgaXMgImhlbGxvLCB3b3JsZCEiLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zdGRpbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5SZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCwKKyAgICAgICAgICAgICAgYW5kIHVzZSB0aGF0IGFzIHRoZSA8b3B0aW9uPi0tc3RyaW5nPC9vcHRpb24+IG9yCisgICAgICAgICAgICAgIDxvcHRpb24+LS1ieXRlczwvb3B0aW9uPiBpbiB0aGUgbWVzc2FnZXMuPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW1lc3NhZ2Utc3RkaW48L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+UmVhZCBhIGNvbXBsZXRlIGJpbmFyeSBELUJ1cyBtZXRob2QgY2FsbCBtZXNzYWdlIGZyb20KKyAgICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQsIGFuZCB1c2UgdGhhdCBmb3IgZWFjaCBtZXRob2QgY2FsbC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tcmFuZG9tLXNpemU8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+UmVhZCB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBBU0NJSSBkZWNpbWFsIG51bWJlcnMgZnJvbQorICAgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCwgY2hvb3NlIG9uZSBhdCByYW5kb20gZm9yIGVhY2ggbWVzc2FnZSwKKyAgICAgICAgICAgICAgYW5kIHNlbmQgYSBtZXNzYWdlIHdob3NlIHBheWxvYWQgaXMgYSBzdHJpbmcgb2YgdGhhdAorICAgICAgICAgICAgICBsZW5ndGguPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLXNlZWQ9PC9vcHRpb24+PHJlcGxhY2VhYmxlPlNFRUQ8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5Vc2UgPHJlcGxhY2VhYmxlPlNFRUQ8L3JlcGxhY2VhYmxlPiBhcyB0aGUgc2VlZAorICAgICAgICAgICAgICBmb3IgdGhlIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCB0byBoYXZlIHNvbWV3aGF0CisgICAgICAgICAgICAgIHJlcGVhdGFibGUgc2VxdWVuY2VzIG9mIHJhbmRvbSBtZXNzYWdlcy48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgIDwvcmVmc2VjdDI+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJidWdzIj4KKyAgICA8dGl0bGU+QlVHUzwvdGl0bGU+CisgICAgICA8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgYnVnIHRyYWNrZXIgb3IgbWFpbGluZyBsaXN0LgorICAgICAgICBTZWUgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8iPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4uPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0ic2VlX2Fsc28iPgorICAgIDx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+CisgICAgPHBhcmE+PGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLXNlbmQ8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+PC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXR1dG9yaWFsLnhtbCBiL2RvYy9kYnVzLXR1dG9yaWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ5NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtdHV0b3JpYWwueG1sCkBAIC0wLDAgKzEsNzQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIgorWworXT4KKworPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBUdXRvcmlhbDwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPlZlcnNpb24gMC41LjA8L3JlbGVhc2VpbmZvPgorICAgIDxkYXRlPjIwIEF1Z3VzdCAyMDA2PC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5IYXZvYzwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBlbm5pbmd0b248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPjxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5XaGVlbGVyPC9zdXJuYW1lPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+Sm9objwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBhbG1pZXJpPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPlJlZCBIYXQsIEluYy48L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+am9obnBAcmVkaGF0LmNvbTwvZW1haWw+PC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5Db2xpbjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPldhbHRlcnM8L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPjxlbWFpbD53YWx0ZXJzQHJlZGhhdC5jb208L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9hcnRpY2xlaW5mbz4KKworICA8c2VjdDEgaWQ9Im1ldGEiPgorICAgIDx0aXRsZT5UdXRvcmlhbCBXb3JrIEluIFByb2dyZXNzPC90aXRsZT4KKyAgICAKKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgdHV0b3JpYWwgaXMgbm90IGNvbXBsZXRlOyBpdCBwcm9iYWJseSBjb250YWlucyBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiwgYnV0IAorICAgICAgYWxzbyBoYXMgcGxlbnR5IG9mIGdhcHMuIFJpZ2h0IG5vdywgeW91J2xsIGFsc28gbmVlZCB0byByZWZlciB0byB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbiwKKyAgICAgIERveHlnZW4gcmVmZXJlbmNlIGRvY3VtZW50YXRpb24sIGFuZCBsb29rIGF0IHNvbWUgZXhhbXBsZXMgb2YgaG93IG90aGVyIGFwcHMgdXNlIEQtQnVzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgRW5oYW5jaW5nIHRoZSB0dXRvcmlhbCBpcyBkZWZpbml0ZWx5IGVuY291cmFnZWQgLSBzZW5kIHlvdXIgcGF0Y2hlcyBvciBzdWdnZXN0aW9ucyB0byB0aGUKKyAgICAgIG1haWxpbmcgbGlzdC4gSWYgeW91IGNyZWF0ZSBhIEQtQnVzIGJpbmRpbmcsIHBsZWFzZSBhZGQgYSBzZWN0aW9uIHRvIHRoZSB0dXRvcmlhbCBmb3IgeW91ciAKKyAgICAgIGJpbmRpbmcsIGlmIG9ubHkgYSBzaG9ydCBzZWN0aW9uIHdpdGggYSBjb3VwbGUgb2YgZXhhbXBsZXMuCisgICAgPC9wYXJhPgorCisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJ3aGF0aXMiPgorICAgIDx0aXRsZT5XaGF0IGlzIEQtQnVzPzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBhIHN5c3RlbSBmb3IgPGZpcnN0dGVybT5pbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbjwvZmlyc3R0ZXJtPgorICAgICAgKElQQykuIEFyY2hpdGVjdHVyYWxseSwgaXQgaGFzIHNldmVyYWwgbGF5ZXJzOgorCisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBIGxpYnJhcnksIDxmaXJzdHRlcm0+bGliZGJ1czwvZmlyc3R0ZXJtPiwgdGhhdCBhbGxvd3MgdHdvCisgICAgICAgICAgICBhcHBsaWNhdGlvbnMgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIGFuZCBleGNoYW5nZSBtZXNzYWdlcy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgPGZpcnN0dGVybT5tZXNzYWdlIGJ1cyBkYWVtb248L2ZpcnN0dGVybT4gZXhlY3V0YWJsZSwgYnVpbHQgb24KKyAgICAgICAgICAgIGxpYmRidXMsIHRoYXQgbXVsdGlwbGUgYXBwbGljYXRpb25zIGNhbiBjb25uZWN0IHRvLiBUaGUgZGFlbW9uIGNhbgorICAgICAgICAgICAgcm91dGUgbWVzc2FnZXMgZnJvbSBvbmUgYXBwbGljYXRpb24gdG8gemVybyBvciBtb3JlIG90aGVyCisgICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8Zmlyc3R0ZXJtPldyYXBwZXIgbGlicmFyaWVzPC9maXJzdHRlcm0+IG9yIDxmaXJzdHRlcm0+YmluZGluZ3M8L2ZpcnN0dGVybT4gCisgICAgICAgICAgICBiYXNlZCBvbiBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGZyYW1ld29ya3MuICBGb3IgZXhhbXBsZSwgbGliZGJ1cy1nbGliIGFuZAorICAgICAgICAgICAgbGliZGJ1cy1xdC4gVGhlcmUgYXJlIGFsc28gYmluZGluZ3MgdG8gbGFuZ3VhZ2VzIHN1Y2ggYXMKKyAgICAgICAgICAgIFB5dGhvbi4gVGhlc2Ugd3JhcHBlciBsaWJyYXJpZXMgYXJlIHRoZSBBUEkgbW9zdCBwZW9wbGUgc2hvdWxkIHVzZSwKKyAgICAgICAgICAgIGFzIHRoZXkgc2ltcGxpZnkgdGhlIGRldGFpbHMgb2YgRC1CdXMgcHJvZ3JhbW1pbmcuIGxpYmRidXMgaXMgCisgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSBhIGxvdy1sZXZlbCBiYWNrZW5kIGZvciB0aGUgaGlnaGVyIGxldmVsIGJpbmRpbmdzLgorICAgICAgICAgICAgTXVjaCBvZiB0aGUgbGliZGJ1cyBBUEkgaXMgb25seSB1c2VmdWwgZm9yIGJpbmRpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBsaWJkYnVzIG9ubHkgc3VwcG9ydHMgb25lLXRvLW9uZSBjb25uZWN0aW9ucywganVzdCBsaWtlIGEgcmF3IG5ldHdvcmsKKyAgICAgIHNvY2tldC4gSG93ZXZlciwgcmF0aGVyIHRoYW4gc2VuZGluZyBieXRlIHN0cmVhbXMgb3ZlciB0aGUgY29ubmVjdGlvbiwgeW91CisgICAgICBzZW5kIDxmaXJzdHRlcm0+bWVzc2FnZXM8L2ZpcnN0dGVybT4uIE1lc3NhZ2VzIGhhdmUgYSBoZWFkZXIgaWRlbnRpZnlpbmcKKyAgICAgIHRoZSBraW5kIG9mIG1lc3NhZ2UsIGFuZCBhIGJvZHkgY29udGFpbmluZyBhIGRhdGEgcGF5bG9hZC4gbGliZGJ1cyBhbHNvCisgICAgICBhYnN0cmFjdHMgdGhlIGV4YWN0IHRyYW5zcG9ydCB1c2VkIChzb2NrZXRzIHZzLiB3aGF0ZXZlciBlbHNlKSwgYW5kCisgICAgICBoYW5kbGVzIGRldGFpbHMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gZm9ybXMgdGhlIGh1YiBvZiBhIHdoZWVsLiBFYWNoIHNwb2tlIG9mIHRoZSB3aGVlbAorICAgICAgaXMgYSBvbmUtdG8tb25lIGNvbm5lY3Rpb24gdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgbGliZGJ1cy4gIEFuCisgICAgICBhcHBsaWNhdGlvbiBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGJ1cyBkYWVtb24gb3ZlciBpdHMgc3Bva2UsIGFuZCB0aGUgYnVzCisgICAgICBkYWVtb24gZm9yd2FyZHMgdGhlIG1lc3NhZ2UgdG8gb3RoZXIgY29ubmVjdGVkIGFwcGxpY2F0aW9ucyBhcworICAgICAgYXBwcm9wcmlhdGUuIFRoaW5rIG9mIHRoZSBkYWVtb24gYXMgYSByb3V0ZXIuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgYnVzIGRhZW1vbiBoYXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9uIGEgdHlwaWNhbCBjb21wdXRlci4gIFRoZQorICAgICAgZmlyc3QgaW5zdGFuY2UgaXMgYSBtYWNoaW5lLWdsb2JhbCBzaW5nbGV0b24sIHRoYXQgaXMsIGEgc3lzdGVtIGRhZW1vbgorICAgICAgc2ltaWxhciB0byBzZW5kbWFpbCBvciBBcGFjaGUuIFRoaXMgaW5zdGFuY2UgaGFzIGhlYXZ5IHNlY3VyaXR5CisgICAgICByZXN0cmljdGlvbnMgb24gd2hhdCBtZXNzYWdlcyBpdCB3aWxsIGFjY2VwdCwgYW5kIGlzIHVzZWQgZm9yIHN5c3RlbXdpZGUKKyAgICAgIGNvbW11bmljYXRpb24uIFRoZSBvdGhlciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgb25lIHBlciB1c2VyIGxvZ2luIHNlc3Npb24uCisgICAgICBUaGVzZSBpbnN0YW5jZXMgYWxsb3cgYXBwbGljYXRpb25zIGluIHRoZSB1c2VyJ3Mgc2Vzc2lvbiB0byBjb21tdW5pY2F0ZSAKKyAgICAgIHdpdGggb25lIGFub3RoZXIuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgc3lzdGVtd2lkZSBhbmQgcGVyLXVzZXIgZGFlbW9ucyBhcmUgc2VwYXJhdGUuICBOb3JtYWwgd2l0aGluLXNlc3Npb24KKyAgICAgIElQQyBkb2VzIG5vdCBpbnZvbHZlIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzIHByb2Nlc3MgYW5kIHZpY2UgdmVyc2EuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJ1c2VzIj4KKyAgICAgIDx0aXRsZT5ELUJ1cyBhcHBsaWNhdGlvbnM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGFyZSBtYW55LCBtYW55IHRlY2hub2xvZ2llcyBpbiB0aGUgd29ybGQgdGhhdCBoYXZlICJJbnRlci1wcm9jZXNzCisgICAgICAgIGNvbW11bmljYXRpb24iIG9yICJuZXR3b3JraW5nIiBpbiB0aGVpciBzdGF0ZWQgcHVycG9zZTogPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5vbWcub3JnIj5DT1JCQTwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvZGNlLyI+RENFPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9jb20vIj5EQ09NPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly9kZXZlbG9wZXIua2RlLm9yZy9kb2N1bWVudGF0aW9uL2xpYnJhcnkva2RlcXQvZGNvcC5odG1sIj5EQ09QPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly93d3cueG1scnBjLmNvbSI+WE1MLVJQQzwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLyI+U09BUDwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm1idXMub3JnLyI+TUJVUzwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lnplcm9jLmNvbS9pY2UuaHRtbCI+SW50ZXJuZXQgQ29tbXVuaWNhdGlvbnMgRW5naW5lIChJQ0UpPC91bGluaz4sCisgICAgICAgIGFuZCBwcm9iYWJseSBodW5kcmVkcyBtb3JlLgorICAgICAgICBFYWNoIG9mIHRoZXNlIGlzIHRhaWxvcmVkIGZvciBwYXJ0aWN1bGFyIGtpbmRzIG9mIGFwcGxpY2F0aW9uLgorICAgICAgICBELUJ1cyBpcyBkZXNpZ25lZCBmb3IgdHdvIHNwZWNpZmljIGNhc2VzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uIGJldHdlZW4gZGVza3RvcCBhcHBsaWNhdGlvbnMgaW4gdGhlIHNhbWUgZGVza3RvcAorICAgICAgICAgICAgICBzZXNzaW9uOyB0byBhbGxvdyBpbnRlZ3JhdGlvbiBvZiB0aGUgZGVza3RvcCBzZXNzaW9uIGFzIGEgd2hvbGUsCisgICAgICAgICAgICAgIGFuZCBhZGRyZXNzIGlzc3VlcyBvZiBwcm9jZXNzIGxpZmVjeWNsZSAod2hlbiBkbyBkZXNrdG9wIGNvbXBvbmVudHMgCisgICAgICAgICAgICAgIHN0YXJ0IGFuZCBzdG9wIHJ1bm5pbmcpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZGVza3RvcCBzZXNzaW9uIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgCisgICAgICAgICAgICAgIHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdvdWxkIHR5cGljYWxseSBpbmNsdWRlIHRoZSBrZXJuZWwgCisgICAgICAgICAgICAgIGFuZCBhbnkgc3lzdGVtIGRhZW1vbnMgb3IgcHJvY2Vzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEZvciB0aGUgd2l0aGluLWRlc2t0b3Atc2Vzc2lvbiB1c2UgY2FzZSwgdGhlIEdOT01FIGFuZCBLREUgZGVza3RvcHMgCisgICAgICAgIGhhdmUgc2lnbmlmaWNhbnQgcHJldmlvdXMgZXhwZXJpZW5jZSB3aXRoIGRpZmZlcmVudCBJUEMgc29sdXRpb25zCisgICAgICAgIHN1Y2ggYXMgQ09SQkEgYW5kIERDT1AuIEQtQnVzIGlzIGJ1aWx0IG9uIHRoYXQgZXhwZXJpZW5jZSBhbmQgCisgICAgICAgIGNhcmVmdWxseSB0YWlsb3JlZCB0byBtZWV0IHRoZSBuZWVkcyBvZiB0aGVzZSBkZXNrdG9wIHByb2plY3RzIAorICAgICAgICBpbiBwYXJ0aWN1bGFyLiBELUJ1cyBtYXkgb3IgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3Igb3RoZXIgCisgICAgICAgIGFwcGxpY2F0aW9uczsgdGhlIEZBUSBoYXMgc29tZSBjb21wYXJpc29ucyB0byBvdGhlciBJUEMgc3lzdGVtcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgcHJvYmxlbSBzb2x2ZWQgYnkgdGhlIHN5c3RlbXdpZGUgb3IgY29tbXVuaWNhdGlvbi13aXRoLXRoZS1PUyBjYXNlIAorICAgICAgICBpcyBleHBsYWluZWQgd2VsbCBieSB0aGUgZm9sbG93aW5nIHRleHQgZnJvbSB0aGUgTGludXggSG90cGx1ZyBwcm9qZWN0OgorICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgQSBnYXAgaW4gY3VycmVudCBMaW51eCBzdXBwb3J0IGlzIHRoYXQgcG9saWNpZXMgd2l0aCBhbnkgc29ydCBvZgorICAgICAgICAgICBkeW5hbWljICJpbnRlcmFjdCB3aXRoIHVzZXIiIGNvbXBvbmVudCBhcmVuJ3QgY3VycmVudGx5CisgICAgICAgICAgIHN1cHBvcnRlZC4gRm9yIGV4YW1wbGUsIHRoYXQncyBvZnRlbiBuZWVkZWQgdGhlIGZpcnN0IHRpbWUgYSBuZXR3b3JrCisgICAgICAgICAgIGFkYXB0ZXIgb3IgcHJpbnRlciBpcyBjb25uZWN0ZWQsIGFuZCB0byBkZXRlcm1pbmUgYXBwcm9wcmlhdGUgcGxhY2VzCisgICAgICAgICAgIHRvIG1vdW50IGRpc2sgZHJpdmVzLiBJdCB3b3VsZCBzZWVtIHRoYXQgc3VjaCBhY3Rpb25zIGNvdWxkIGJlCisgICAgICAgICAgIHN1cHBvcnRlZCBmb3IgYW55IGNhc2Ugd2hlcmUgYSByZXNwb25zaWJsZSBodW1hbiBjYW4gYmUgaWRlbnRpZmllZDoKKyAgICAgICAgICAgc2luZ2xlIHVzZXIgd29ya3N0YXRpb25zLCBvciBhbnkgc3lzdGVtIHdoaWNoIGlzIHJlbW90ZWx5CisgICAgICAgICAgIGFkbWluaXN0ZXJlZC4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgaXMgYSBjbGFzc2ljICJyZW1vdGUgc3lzYWRtaW4iIHByb2JsZW0sIHdoZXJlIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgaG90cGx1Z2dpbmcgbmVlZHMgdG8gZGVsaXZlciBhbiBldmVudCBmcm9tIG9uZSBzZWN1cml0eSBkb21haW4KKyAgICAgICAgICAgIChvcGVyYXRpbmcgc3lzdGVtIGtlcm5lbCwgaW4gdGhpcyBjYXNlKSB0byBhbm90aGVyIChkZXNrdG9wIGZvcgorICAgICAgICAgICAgbG9nZ2VkLWluIHVzZXIsIG9yIHJlbW90ZSBzeXNhZG1pbikuIEFueSBlZmZlY3RpdmUgcmVzcG9uc2UgbXVzdCBnbworICAgICAgICAgICAgdGhlIG90aGVyIHdheTogdGhlIHJlbW90ZSBkb21haW4gdGFraW5nIHNvbWUgYWN0aW9uIHRoYXQgbGV0cyB0aGUKKyAgICAgICAgICAgIGtlcm5lbCBleHBvc2UgdGhlIGRlc2lyZWQgZGV2aWNlIGNhcGFiaWxpdGllcy4gKFRoZSBhY3Rpb24gY2FuIG9mdGVuCisgICAgICAgICAgICBiZSB0YWtlbiBhc3luY2hyb25vdXNseSwgZm9yIGV4YW1wbGUgbGV0dGluZyBuZXcgaGFyZHdhcmUgYmUgaWRsZQorICAgICAgICAgICAgdW50aWwgYSBtZWV0aW5nIGZpbmlzaGVzLikgQXQgdGhpcyB3cml0aW5nLCBMaW51eCBkb2Vzbid0IGhhdmUKKyAgICAgICAgICAgIHdpZGVseSBhZG9wdGVkIHNvbHV0aW9ucyB0byBzdWNoIHByb2JsZW1zLiBIb3dldmVyLCB0aGUgbmV3IEQtQnVzCisgICAgICAgICAgICB3b3JrIG1heSBiZWdpbiB0byBzb2x2ZSB0aGF0IHByb2JsZW0uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Jsb2NrcXVvdGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgbWF5IGhhcHBlbiB0byBiZSB1c2VmdWwgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gdGhlIG9uZSBpdCB3YXMKKyAgICAgICAgZGVzaWduZWQgZm9yLiBJdHMgZ2VuZXJhbCBwcm9wZXJ0aWVzIHRoYXQgZGlzdGluZ3Vpc2ggaXQgZnJvbSAKKyAgICAgICAgb3RoZXIgZm9ybXMgb2YgSVBDIGFyZToKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgQmluYXJ5IHByb3RvY29sIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXN5bmNocm9ub3VzbHkgCisgICAgICAgICAgICAgIChzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgWCBXaW5kb3cgU3lzdGVtIHByb3RvY29sKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTdGF0ZWZ1bCwgcmVsaWFibGUgY29ubmVjdGlvbnMgaGVsZCBvcGVuIG92ZXIgdGltZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgaXMgYSBkYWVtb24sIG5vdCBhICJzd2FybSIgb3IgCisgICAgICAgICAgICAgIGRpc3RyaWJ1dGVkIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBNYW55IGltcGxlbWVudGF0aW9uIGFuZCBkZXBsb3ltZW50IGlzc3VlcyBhcmUgc3BlY2lmaWVkIHJhdGhlcgorICAgICAgICAgICAgICB0aGFuIGxlZnQgYW1iaWd1b3VzL2NvbmZpZ3VyYWJsZS9wbHVnZ2FibGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgU2VtYW50aWNzIGFyZSBzaW1pbGFyIHRvIHRoZSBleGlzdGluZyBEQ09QIHN5c3RlbSwgYWxsb3dpbmcgCisgICAgICAgICAgICAgIEtERSB0byBhZG9wdCBpdCBtb3JlIGVhc2lseS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTZWN1cml0eSBmZWF0dXJlcyB0byBzdXBwb3J0IHRoZSBzeXN0ZW13aWRlIG1vZGUgb2YgdGhlIAorICAgICAgICAgICAgICBtZXNzYWdlIGJ1cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImNvbmNlcHRzIj4KKyAgICA8dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU29tZSBiYXNpYyBjb25jZXB0cyBhcHBseSBubyBtYXR0ZXIgd2hhdCBhcHBsaWNhdGlvbiBmcmFtZXdvcmsgeW91J3JlCisgICAgICB1c2luZyB0byB3cml0ZSBhIEQtQnVzIGFwcGxpY2F0aW9uLiBUaGUgZXhhY3QgY29kZSB5b3Ugd3JpdGUgd2lsbCBiZQorICAgICAgZGlmZmVyZW50IGZvciBHTGliIHZzLiBRdCB2cy4gUHl0aG9uIGFwcGxpY2F0aW9ucywgaG93ZXZlci4KKyAgICA8L3BhcmE+CisgICAgCisgICAgPHBhcmE+CisgICAgICBIZXJlIGlzIGEgZGlhZ3JhbSAoPHVsaW5rIHVybD0iZGlhZ3JhbS5wbmciPnBuZzwvdWxpbms+IDx1bGluaworICAgICAgdXJsPSJkaWFncmFtLnN2ZyI+c3ZnPC91bGluaz4pIHRoYXQgbWF5IGhlbHAgeW91IHZpc3VhbGl6ZSB0aGUgY29uY2VwdHMKKyAgICAgIHRoYXQgZm9sbG93LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0ib2JqZWN0cyI+CisgICAgICA8dGl0bGU+TmF0aXZlIE9iamVjdHMgYW5kIE9iamVjdCBQYXRoczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgWW91ciBwcm9ncmFtbWluZyBmcmFtZXdvcmsgcHJvYmFibHkgZGVmaW5lcyB3aGF0IGFuICJvYmplY3QiIGlzIGxpa2U7CisgICAgICAgIHVzdWFsbHkgd2l0aCBhIGJhc2UgY2xhc3MuIEZvciBleGFtcGxlOiBqYXZhLmxhbmcuT2JqZWN0LCBHT2JqZWN0LCBRT2JqZWN0LAorICAgICAgICBweXRob24ncyBiYXNlIE9iamVjdCwgb3Igd2hhdGV2ZXIuIExldCdzIGNhbGwgdGhpcyBhIDxmaXJzdHRlcm0+bmF0aXZlIG9iamVjdDwvZmlyc3R0ZXJtPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbG93LWxldmVsIEQtQnVzIHByb3RvY29sLCBhbmQgY29ycmVzcG9uZGluZyBsaWJkYnVzIEFQSSwgZG9lcyBub3QgY2FyZSBhYm91dCBuYXRpdmUgb2JqZWN0cy4gCisgICAgICAgIEhvd2V2ZXIsIGl0IHByb3ZpZGVzIGEgY29uY2VwdCBjYWxsZWQgYW4gCisgICAgICAgIDxmaXJzdHRlcm0+b2JqZWN0IHBhdGg8L2ZpcnN0dGVybT4uIFRoZSBpZGVhIG9mIGFuIG9iamVjdCBwYXRoIGlzIHRoYXQgCisgICAgICAgIGhpZ2hlci1sZXZlbCBiaW5kaW5ncyBjYW4gbmFtZSBuYXRpdmUgb2JqZWN0IGluc3RhbmNlcywgYW5kIGFsbG93IHJlbW90ZSBhcHBsaWNhdGlvbnMgCisgICAgICAgIHRvIHJlZmVyIHRvIHRoZW0uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG9iamVjdCBwYXRoCisgICAgICAgIGxvb2tzIGxpa2UgYSBmaWxlc3lzdGVtIHBhdGgsIGZvciBleGFtcGxlIGFuIG9iamVjdCBjb3VsZCBiZSAKKyAgICAgICAgbmFtZWQgPGxpdGVyYWw+L29yZy9rZGUva3NwcmVhZC9zaGVldHMvMy9jZWxscy80LzU8L2xpdGVyYWw+LiAKKyAgICAgICAgSHVtYW4tcmVhZGFibGUgcGF0aHMgYXJlIG5pY2UsIGJ1dCB5b3UgYXJlIGZyZWUgdG8gY3JlYXRlIGFuIAorICAgICAgICBvYmplY3QgbmFtZWQgPGxpdGVyYWw+L2NvbS9teWNvbXBhbnkvYzV5bzgxN3kwYzF5MWM1YjwvbGl0ZXJhbD4gCisgICAgICAgIGlmIGl0IG1ha2VzIHNlbnNlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE5hbWVzcGFjaW5nIG9iamVjdCBwYXRocyBpcyBzbWFydCwgYnkgc3RhcnRpbmcgdGhlbSB3aXRoIHRoZSBjb21wb25lbnRzCisgICAgICAgIG9mIGEgZG9tYWluIG5hbWUgeW91IG93biAoZS5nLiA8bGl0ZXJhbD4vb3JnL2tkZTwvbGl0ZXJhbD4pLiBUaGlzIAorICAgICAgICBrZWVwcyBkaWZmZXJlbnQgY29kZSBtb2R1bGVzIGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBzdGVwcGluZyAKKyAgICAgICAgb24gb25lIGFub3RoZXIncyB0b2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+ICAgIAorCisgICAgPHNlY3QyIGlkPSJtZW1iZXJzIj4KKyAgICAgIDx0aXRsZT5NZXRob2RzIGFuZCBTaWduYWxzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggb2JqZWN0IGhhcyA8Zmlyc3R0ZXJtPm1lbWJlcnM8L2ZpcnN0dGVybT47IHRoZSB0d28ga2luZHMgb2YgbWVtYmVyCisgICAgICAgIGFyZSA8Zmlyc3R0ZXJtPm1ldGhvZHM8L2ZpcnN0dGVybT4gYW5kCisgICAgICAgIDxmaXJzdHRlcm0+c2lnbmFsczwvZmlyc3R0ZXJtPi4gTWV0aG9kcyBhcmUgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZQorICAgICAgICBpbnZva2VkIG9uIGFuIG9iamVjdCwgd2l0aCBvcHRpb25hbCBpbnB1dCAoYWthIGFyZ3VtZW50cyBvciAiaW4KKyAgICAgICAgcGFyYW1ldGVycyIpIGFuZCBvdXRwdXQgKGFrYSByZXR1cm4gdmFsdWVzIG9yICJvdXQgcGFyYW1ldGVycyIpLgorICAgICAgICBTaWduYWxzIGFyZSBicm9hZGNhc3RzIGZyb20gdGhlIG9iamVjdCB0byBhbnkgaW50ZXJlc3RlZCBvYnNlcnZlcnMgCisgICAgICAgIG9mIHRoZSBvYmplY3Q7IHNpZ25hbHMgbWF5IGNvbnRhaW4gYSBkYXRhIHBheWxvYWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBCb3RoIG1ldGhvZHMgYW5kIHNpZ25hbHMgYXJlIHJlZmVycmVkIHRvIGJ5IG5hbWUsIHN1Y2ggYXMgCisgICAgICAgICJGcm9iYXRlIiBvciAiT25DbGlja2VkIi4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImludGVyZmFjZXMiPgorICAgICAgPHRpdGxlPkludGVyZmFjZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggb2JqZWN0IHN1cHBvcnRzIG9uZSBvciBtb3JlIDxmaXJzdHRlcm0+aW50ZXJmYWNlczwvZmlyc3R0ZXJtPi4KKyAgICAgICAgVGhpbmsgb2YgYW4gaW50ZXJmYWNlIGFzIGEgbmFtZWQgZ3JvdXAgb2YgbWV0aG9kcyBhbmQgc2lnbmFscywgCisgICAgICAgIGp1c3QgYXMgaXQgaXMgaW4gR0xpYiBvciBRdCBvciBKYXZhLiBJbnRlcmZhY2VzIGRlZmluZSB0aGUgCisgICAgICAgIDxlbXBoYXNpcz50eXBlPC9lbXBoYXNpcz4gb2YgYW4gb2JqZWN0IGluc3RhbmNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIERCdXMgaWRlbnRpZmllcyBpbnRlcmZhY2VzIHdpdGggYSBzaW1wbGUgbmFtZXNwYWNlZCBzdHJpbmcsCisgICAgICAgIHNvbWV0aGluZyBsaWtlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZTwvbGl0ZXJhbD4uCisgICAgICAgIE1vc3QgYmluZGluZ3Mgd2lsbCBtYXAgdGhlc2UgaW50ZXJmYWNlIG5hbWVzIGRpcmVjdGx5IHRvIAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgY29uc3RydWN0LCBmb3IgZXhhbXBsZSAKKyAgICAgICAgdG8gSmF2YSBpbnRlcmZhY2VzIG9yIEMrKyBwdXJlIHZpcnR1YWwgY2xhc3Nlcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJwcm94aWVzIj4KKyAgICAgIDx0aXRsZT5Qcm94aWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIDxmaXJzdHRlcm0+cHJveHkgb2JqZWN0PC9maXJzdHRlcm0+IGlzIGEgY29udmVuaWVudCBuYXRpdmUgb2JqZWN0IGNyZWF0ZWQgdG8gCisgICAgICAgIHJlcHJlc2VudCBhIHJlbW90ZSBvYmplY3QgaW4gYW5vdGhlciBwcm9jZXNzLiBUaGUgbG93LWxldmVsIERCdXMgQVBJIGludm9sdmVzIG1hbnVhbGx5IGNyZWF0aW5nIAorICAgICAgICBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHNlbmRpbmcgaXQsIHRoZW4gbWFudWFsbHkgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIAorICAgICAgICB0aGUgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuIEhpZ2hlci1sZXZlbCBiaW5kaW5ncyBwcm92aWRlIHByb3hpZXMgYXMgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgIFByb3hpZXMgbG9vayBsaWtlIGEgbm9ybWFsIG5hdGl2ZSBvYmplY3Q7IGJ1dCB3aGVuIHlvdSBpbnZva2UgYSBtZXRob2Qgb24gdGhlIHByb3h5IAorICAgICAgICBvYmplY3QsIHRoZSBiaW5kaW5nIGNvbnZlcnRzIGl0IGludG8gYSBEQnVzIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHdhaXRzIGZvciB0aGUgcmVwbHkgCisgICAgICAgIG1lc3NhZ2UsIHVucGFja3MgdGhlIHJldHVybiB2YWx1ZSwgYW5kIHJldHVybnMgaXQgZnJvbSB0aGUgbmF0aXZlIG1ldGhvZC4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gcHNldWRvY29kZSwgcHJvZ3JhbW1pbmcgd2l0aG91dCBwcm94aWVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoIi9yZW1vdGUvb2JqZWN0L3BhdGgiLCAiTWV0aG9kTmFtZSIsIGFyZzEsIGFyZzIpOworICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldEJ1c0Nvbm5lY3Rpb24oKTsKKyAgICAgICAgICBjb25uZWN0aW9uLnNlbmQobWVzc2FnZSk7CisgICAgICAgICAgTWVzc2FnZSByZXBseSA9IGNvbm5lY3Rpb24ud2FpdEZvclJlcGx5KG1lc3NhZ2UpOworICAgICAgICAgIGlmIChyZXBseS5pc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IHJlcGx5LmdldFJldHVyblZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFByb2dyYW1taW5nIHdpdGggcHJveGllcyBtaWdodCBsb29rIGxpa2UgdGhpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KGdldEJ1c0Nvbm5lY3Rpb24oKSwgIi9yZW1vdGUvb2JqZWN0L3BhdGgiKTsKKyAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBwcm94eS5NZXRob2ROYW1lKGFyZzEsIGFyZzIpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImJ1cy1uYW1lcyI+CisgICAgICA8dGl0bGU+QnVzIE5hbWVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gZWFjaCBhcHBsaWNhdGlvbiBjb25uZWN0cyB0byB0aGUgYnVzIGRhZW1vbiwgdGhlIGRhZW1vbiBpbW1lZGlhdGVseQorICAgICAgICBhc3NpZ25zIGl0IGEgbmFtZSwgY2FsbGVkIHRoZSA8Zmlyc3R0ZXJtPnVuaXF1ZSBjb25uZWN0aW9uIG5hbWU8L2ZpcnN0dGVybT4uCisgICAgICAgIEEgdW5pcXVlIG5hbWUgYmVnaW5zIHdpdGggYSAnOicgKGNvbG9uKSBjaGFyYWN0ZXIuIFRoZXNlIG5hbWVzIGFyZSBuZXZlciAKKyAgICAgICAgcmV1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIGJ1cyBkYWVtb24gLSB0aGF0IGlzLCB5b3Uga25vdyAKKyAgICAgICAgYSBnaXZlbiBuYW1lIHdpbGwgYWx3YXlzIHJlZmVyIHRvIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgorICAgICAgICBBbiBleGFtcGxlIG9mIGEgdW5pcXVlIG5hbWUgbWlnaHQgYmUKKyAgICAgICAgPGxpdGVyYWw+OjM0LTkwNzwvbGl0ZXJhbD4uIFRoZSBudW1iZXJzIGFmdGVyIHRoZSBjb2xvbiBoYXZlIAorICAgICAgICBubyBtZWFuaW5nIG90aGVyIHRoYW4gdGhlaXIgdW5pcXVlbmVzcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gYSBuYW1lIGlzIG1hcHBlZCAKKyAgICAgICAgdG8gYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uJ3MgY29ubmVjdGlvbiwgdGhhdCBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIAorICAgICAgICA8Zmlyc3R0ZXJtPm93bjwvZmlyc3R0ZXJtPiB0aGF0IG5hbWUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBcHBsaWNhdGlvbnMgbWF5IGFzayB0byBvd24gYWRkaXRpb25hbCA8Zmlyc3R0ZXJtPndlbGwta25vd24KKyAgICAgICAgbmFtZXM8L2ZpcnN0dGVybT4uIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGUgYSBzcGVjaWZpY2F0aW9uIHRvCisgICAgICAgIGRlZmluZSBhIG5hbWUgY2FsbGVkIDxsaXRlcmFsPmNvbS5teWNvbXBhbnkuVGV4dEVkaXRvcjwvbGl0ZXJhbD4uCisgICAgICAgIFlvdXIgZGVmaW5pdGlvbiBjb3VsZCBzcGVjaWZ5IHRoYXQgdG8gb3duIHRoaXMgbmFtZSwgYW4gYXBwbGljYXRpb24KKyAgICAgICAgc2hvdWxkIGhhdmUgYW4gb2JqZWN0IGF0IHRoZSBwYXRoCisgICAgICAgIDxsaXRlcmFsPi9jb20vbXljb21wYW55L1RleHRGaWxlTWFuYWdlcjwvbGl0ZXJhbD4gc3VwcG9ydGluZyB0aGUKKyAgICAgICAgaW50ZXJmYWNlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5GaWxlSGFuZGxlcjwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBBcHBsaWNhdGlvbnMgY291bGQgdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHRoaXMgYnVzIG5hbWUsIAorICAgICAgICBvYmplY3QsIGFuZCBpbnRlcmZhY2UgdG8gZXhlY3V0ZSBtZXRob2QgY2FsbHMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBZb3UgY291bGQgdGhpbmsgb2YgdGhlIHVuaXF1ZSBuYW1lcyBhcyBJUCBhZGRyZXNzZXMsIGFuZCB0aGUKKyAgICAgICAgd2VsbC1rbm93biBuYW1lcyBhcyBkb21haW4gbmFtZXMuIFNvCisgICAgICAgIDxsaXRlcmFsPmNvbS5teWNvbXBhbnkuVGV4dEVkaXRvcjwvbGl0ZXJhbD4gbWlnaHQgbWFwIHRvIHNvbWV0aGluZyBsaWtlCisgICAgICAgIDxsaXRlcmFsPjozNC05MDc8L2xpdGVyYWw+IGp1c3QgYXMgPGxpdGVyYWw+bXljb21wYW55LmNvbTwvbGl0ZXJhbD4gbWFwcworICAgICAgICB0byBzb21ldGhpbmcgbGlrZSA8bGl0ZXJhbD4xOTIuMTY4LjAuNTwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBOYW1lcyBoYXZlIGEgc2Vjb25kIGltcG9ydGFudCB1c2UsIG90aGVyIHRoYW4gcm91dGluZyBtZXNzYWdlcy4gIFRoZXkKKyAgICAgICAgYXJlIHVzZWQgdG8gdHJhY2sgbGlmZWN5Y2xlLiBXaGVuIGFuIGFwcGxpY2F0aW9uIGV4aXRzIChvciBjcmFzaGVzKSwgaXRzCisgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIG1lc3NhZ2UgYnVzIHdpbGwgYmUgY2xvc2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgICAgICAgIGtlcm5lbC4gVGhlIG1lc3NhZ2UgYnVzIHRoZW4gc2VuZHMgb3V0IG5vdGlmaWNhdGlvbiBtZXNzYWdlcyB0ZWxsaW5nCisgICAgICAgIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgYXBwbGljYXRpb24ncyBuYW1lcyBoYXZlIGxvc3QgdGhlaXIKKyAgICAgICAgb3duZXIuIEJ5IHRyYWNraW5nIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHlvdXIgYXBwbGljYXRpb24gY2FuIHJlbGlhYmx5CisgICAgICAgIG1vbml0b3IgdGhlIGxpZmV0aW1lIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEJ1cyBuYW1lcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvb3JkaW5hdGUgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gYmUgc3VyZSBvbmx5IG9uZQorICAgICAgICA8bGl0ZXJhbD5jb20ubXljb21wYW55LlRleHRFZGl0b3I8L2xpdGVyYWw+IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgZm9yCisgICAgICAgIGV4YW1wbGUsIGhhdmUgdGhlIHRleHQgZWRpdG9yIGFwcGxpY2F0aW9uIGV4aXQgaWYgdGhlIGJ1cyBuYW1lIGFscmVhZHkKKyAgICAgICAgaGFzIGFuIG93bmVyLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iYWRkcmVzc2VzIj4KKyAgICAgIDx0aXRsZT5BZGRyZXNzZXM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXBwbGljYXRpb25zIHVzaW5nIEQtQnVzIGFyZSBlaXRoZXIgc2VydmVycyBvciBjbGllbnRzLiAgQSBzZXJ2ZXIKKyAgICAgICAgbGlzdGVucyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnM7IGEgY2xpZW50IGNvbm5lY3RzIHRvIGEgc2VydmVyLiBPbmNlCisgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBpdCBpcyBhIHN5bW1ldHJpYyBmbG93IG9mIG1lc3NhZ2VzOyB0aGUKKyAgICAgICAgY2xpZW50LXNlcnZlciBkaXN0aW5jdGlvbiBvbmx5IG1hdHRlcnMgd2hlbiBzZXR0aW5nIHVwIHRoZSAKKyAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgYnVzIGRhZW1vbiwgYXMgeW91IHByb2JhYmx5IGFyZSwgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAgICAgd2lsbCBiZSBhIGNsaWVudCBvZiB0aGUgYnVzIGRhZW1vbi4gVGhhdCBpcywgdGhlIGJ1cyBkYWVtb24gbGlzdGVucyAKKyAgICAgICAgZm9yIGNvbm5lY3Rpb25zIGFuZCB5b3VyIGFwcGxpY2F0aW9uIGluaXRpYXRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cyAKKyAgICAgICAgZGFlbW9uLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBELUJ1cyA8Zmlyc3R0ZXJtPmFkZHJlc3M8L2ZpcnN0dGVybT4gc3BlY2lmaWVzIHdoZXJlIGEgc2VydmVyIHdpbGwKKyAgICAgICAgbGlzdGVuLCBhbmQgd2hlcmUgYSBjbGllbnQgd2lsbCBjb25uZWN0LiAgRm9yIGV4YW1wbGUsIHRoZSBhZGRyZXNzCisgICAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vdG1wL2FiY2RlZjwvbGl0ZXJhbD4gc3BlY2lmaWVzIHRoYXQgdGhlIHNlcnZlciB3aWxsCisgICAgICAgIGxpc3RlbiBvbiBhIFVOSVggZG9tYWluIHNvY2tldCBhdCB0aGUgcGF0aAorICAgICAgICA8bGl0ZXJhbD4vdG1wL2FiY2RlZjwvbGl0ZXJhbD4gYW5kIHRoZSBjbGllbnQgd2lsbCBjb25uZWN0IHRvIHRoYXQKKyAgICAgICAgc29ja2V0LiBBbiBhZGRyZXNzIGNhbiBhbHNvIHNwZWNpZnkgVENQL0lQIHNvY2tldHMsIG9yIGFueSBvdGhlcgorICAgICAgICB0cmFuc3BvcnQgZGVmaW5lZCBpbiBmdXR1cmUgaXRlcmF0aW9ucyBvZiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gdXNpbmcgRC1CdXMgd2l0aCBhIG1lc3NhZ2UgYnVzIGRhZW1vbiwKKyAgICAgICAgbGliZGJ1cyBhdXRvbWF0aWNhbGx5IGRpc2NvdmVycyB0aGUgYWRkcmVzcyBvZiB0aGUgcGVyLXNlc3Npb24gYnVzIAorICAgICAgICBkYWVtb24gYnkgcmVhZGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSXQgZGlzY292ZXJzIHRoZSAKKyAgICAgICAgc3lzdGVtd2lkZSBidXMgZGFlbW9uIGJ5IGNoZWNraW5nIGEgd2VsbC1rbm93biBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aAorICAgICAgICAodGhvdWdoIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBhZGRyZXNzIHdpdGggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgeW91J3JlIHVzaW5nIEQtQnVzIHdpdGhvdXQgYSBidXMgZGFlbW9uLCBpdCdzIHVwIHRvIHlvdSB0byAKKyAgICAgICAgZGVmaW5lIHdoaWNoIGFwcGxpY2F0aW9uIHdpbGwgYmUgdGhlIHNlcnZlciBhbmQgd2hpY2ggd2lsbCBiZSAKKyAgICAgICAgdGhlIGNsaWVudCwgYW5kIHNwZWNpZnkgYSBtZWNoYW5pc20gZm9yIHRoZW0gdG8gYWdyZWUgb24gCisgICAgICAgIHRoZSBzZXJ2ZXIncyBhZGRyZXNzLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImJpZ3BpY3R1cmUiPgorICAgICAgPHRpdGxlPkJpZyBDb25jZXB0dWFsIFBpY3R1cmU8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgUHVsbGluZyBhbGwgdGhlc2UgY29uY2VwdHMgdG9nZXRoZXIsIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIAorICAgICAgICBtZXRob2QgY2FsbCBvbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGluc3RhbmNlLCBhIG51bWJlciBvZiAKKyAgICAgICAgbmVzdGVkIGNvbXBvbmVudHMgaGF2ZSB0byBiZSBuYW1lZDoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIEFkZHJlc3MgLSZndDsgW0J1cyBOYW1lXSAtJmd0OyBQYXRoIC0mZ3Q7IEludGVyZmFjZSAtJmd0OyBNZXRob2QKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgVGhlIGJ1cyBuYW1lIGlzIGluIGJyYWNrZXRzIHRvIGluZGljYXRlIHRoYXQgaXQncyBvcHRpb25hbCAtLSB5b3Ugb25seQorICAgICAgICBwcm92aWRlIGEgbmFtZSB0byByb3V0ZSB0aGUgbWV0aG9kIGNhbGwgdG8gdGhlIHJpZ2h0IGFwcGxpY2F0aW9uCisgICAgICAgIHdoZW4gdXNpbmcgdGhlIGJ1cyBkYWVtb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0IGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorICAgICAgICBhcHBsaWNhdGlvbiwgYnVzIG5hbWVzIGFyZW4ndCB1c2VkOyB0aGVyZSdzIG5vIGJ1cyBkYWVtb24uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGFsc28gb3B0aW9uYWwsIHByaW1hcmlseSBmb3IgaGlzdG9yaWNhbCAKKyAgICAgICAgcmVhc29uczsgRENPUCBkb2VzIG5vdCByZXF1aXJlIHNwZWNpZnlpbmcgdGhlIGludGVyZmFjZSwgCisgICAgICAgIGluc3RlYWQgc2ltcGx5IGZvcmJpZGRpbmcgZHVwbGljYXRlIG1ldGhvZCBuYW1lcyAKKyAgICAgICAgb24gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLiBELUJ1cyB3aWxsIHRodXMgbGV0IHlvdSAKKyAgICAgICAgb21pdCB0aGUgaW50ZXJmYWNlLCBidXQgaWYgeW91ciBtZXRob2QgbmFtZSBpcyBhbWJpZ3VvdXMgCisgICAgICAgIGl0IGlzIHVuZGVmaW5lZCB3aGljaCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2VzIC0gQmVoaW5kIHRoZSBTY2VuZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEQtQnVzIHdvcmtzIGJ5IHNlbmRpbmcgbWVzc2FnZXMgYmV0d2VlbiBwcm9jZXNzZXMuIElmIHlvdSdyZSB1c2luZyAKKyAgICAgICAgYSBzdWZmaWNpZW50bHkgaGlnaC1sZXZlbCBiaW5kaW5nLCB5b3UgbWF5IG5ldmVyIHdvcmsgd2l0aCBtZXNzYWdlcyBkaXJlY3RseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBhcmUgNCBtZXNzYWdlIHR5cGVzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBNZXRob2QgY2FsbCBtZXNzYWdlcyBhc2sgdG8gaW52b2tlIGEgbWV0aG9kIAorICAgICAgICAgICAgICBvbiBhbiBvYmplY3QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWV0aG9kIHJldHVybiBtZXNzYWdlcyByZXR1cm4gdGhlIHJlc3VsdHMgCisgICAgICAgICAgICAgIG9mIGludm9raW5nIGEgbWV0aG9kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEVycm9yIG1lc3NhZ2VzIHJldHVybiBhbiBleGNlcHRpb24gY2F1c2VkIGJ5IAorICAgICAgICAgICAgICBpbnZva2luZyBhIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTaWduYWwgbWVzc2FnZXMgYXJlIG5vdGlmaWNhdGlvbnMgdGhhdCBhIGdpdmVuIHNpZ25hbCAKKyAgICAgICAgICAgICAgaGFzIGJlZW4gZW1pdHRlZCAodGhhdCBhbiBldmVudCBoYXMgb2NjdXJyZWQpLiAKKyAgICAgICAgICAgICAgWW91IGNvdWxkIGFsc28gdGhpbmsgb2YgdGhlc2UgYXMgImV2ZW50IiBtZXNzYWdlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIG1ldGhvZCBjYWxsIG1hcHMgdmVyeSBzaW1wbHkgdG8gbWVzc2FnZXM6IHlvdSBzZW5kIGEgbWV0aG9kIGNhbGwKKyAgICAgICAgbWVzc2FnZSwgYW5kIHJlY2VpdmUgZWl0aGVyIGEgbWV0aG9kIHJldHVybiBtZXNzYWdlIG9yIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgaW4gcmVwbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCBtZXNzYWdlIGhhcyBhIDxmaXJzdHRlcm0+aGVhZGVyPC9maXJzdHRlcm0+LCBpbmNsdWRpbmcgPGZpcnN0dGVybT5maWVsZHM8L2ZpcnN0dGVybT4sIAorICAgICAgICBhbmQgYSA8Zmlyc3R0ZXJtPmJvZHk8L2ZpcnN0dGVybT4sIGluY2x1ZGluZyA8Zmlyc3R0ZXJtPmFyZ3VtZW50czwvZmlyc3R0ZXJtPi4gWW91IGNhbiB0aGluayAKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcyB0aGUgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lc3NhZ2UsIGFuZCB0aGUgYm9keSBhcyB0aGUgcGF5bG9hZC4KKyAgICAgICAgSGVhZGVyIGZpZWxkcyBtaWdodCBpbmNsdWRlIHRoZSBzZW5kZXIgYnVzIG5hbWUsIGRlc3RpbmF0aW9uIGJ1cyBuYW1lLCBtZXRob2Qgb3Igc2lnbmFsIG5hbWUsIAorICAgICAgICBhbmQgc28gZm9ydGguIE9uZSBvZiB0aGUgaGVhZGVyIGZpZWxkcyBpcyBhIDxmaXJzdHRlcm0+dHlwZSBzaWduYXR1cmU8L2ZpcnN0dGVybT4gZGVzY3JpYmluZyB0aGUgCisgICAgICAgIHZhbHVlcyBmb3VuZCBpbiB0aGUgYm9keS4gRm9yIGV4YW1wbGUsIHRoZSBsZXR0ZXIgImkiIG1lYW5zICIzMi1iaXQgaW50ZWdlciIgc28gdGhlIHNpZ25hdHVyZSAKKyAgICAgICAgImlpIiBtZWFucyB0aGUgcGF5bG9hZCBoYXMgdHdvIDMyLWJpdCBpbnRlZ2Vycy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJjYWxscHJvY2VkdXJlIj4KKyAgICAgIDx0aXRsZT5DYWxsaW5nIGEgTWV0aG9kIC0gQmVoaW5kIHRoZSBTY2VuZXM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBtZXRob2QgY2FsbCBpbiBEQnVzIGNvbnNpc3RzIG9mIHR3byBtZXNzYWdlczsgYSBtZXRob2QgY2FsbCBtZXNzYWdlIHNlbnQgZnJvbSBwcm9jZXNzIEEgdG8gcHJvY2VzcyBCLCAKKyAgICAgICAgYW5kIGEgbWF0Y2hpbmcgbWV0aG9kIHJlcGx5IG1lc3NhZ2Ugc2VudCBmcm9tIHByb2Nlc3MgQiB0byBwcm9jZXNzIEEuIEJvdGggdGhlIGNhbGwgYW5kIHRoZSByZXBseSBtZXNzYWdlcworICAgICAgICBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGJ1cyBkYWVtb24uIFRoZSBjYWxsZXIgaW5jbHVkZXMgYSBkaWZmZXJlbnQgc2VyaWFsIG51bWJlciBpbiBlYWNoIGNhbGwgbWVzc2FnZSwgYW5kIHRoZQorICAgICAgICByZXBseSBtZXNzYWdlIGluY2x1ZGVzIHRoaXMgbnVtYmVyIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gbWF0Y2ggcmVwbGllcyB0byBjYWxscy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjYWxsIG1lc3NhZ2Ugd2lsbCBjb250YWluIGFueSBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZC4KKyAgICAgICAgVGhlIHJlcGx5IG1lc3NhZ2UgbWF5IGluZGljYXRlIGFuIGVycm9yLCBvciBtYXkgY29udGFpbiBkYXRhIHJldHVybmVkIGJ5IHRoZSBtZXRob2QuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIG1ldGhvZCBpbnZvY2F0aW9uIGluIERCdXMgaGFwcGVucyBhcyBmb2xsb3dzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgYmluZGluZyBtYXkgcHJvdmlkZSBhIHByb3h5LCBzdWNoIHRoYXQgaW52b2tpbmcgYSBtZXRob2Qgb24gCisgICAgICAgICAgICAgIGFuIGluLXByb2Nlc3Mgb2JqZWN0IGludm9rZXMgYSBtZXRob2Qgb24gYSByZW1vdGUgb2JqZWN0IGluIGFub3RoZXIgcHJvY2Vzcy4gSWYgc28sIHRoZSAKKyAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FsbHMgYSBtZXRob2Qgb24gdGhlIHByb3h5LCBhbmQgdGhlIHByb3h5CisgICAgICAgICAgICAgIGNvbnN0cnVjdHMgYSBtZXRob2QgY2FsbCBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEZvciBtb3JlIGxvdy1sZXZlbCBBUElzLCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN0cnVjdCBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaXRzZWxmLCB3aXRob3V0CisgICAgICAgICAgICAgIHVzaW5nIGEgcHJveHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlIGNvbnRhaW5zOiBhIGJ1cyBuYW1lIGJlbG9uZ2luZyB0byB0aGUgcmVtb3RlIHByb2Nlc3M7IHRoZSBuYW1lIG9mIHRoZSBtZXRob2Q7IAorICAgICAgICAgICAgICB0aGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2Q7IGFuIG9iamVjdCBwYXRoIGluc2lkZSB0aGUgcmVtb3RlIHByb2Nlc3M7IGFuZCBvcHRpb25hbGx5IHRoZSBuYW1lIG9mIHRoZSAKKyAgICAgICAgICAgICAgaW50ZXJmYWNlIHRoYXQgc3BlY2lmaWVzIHRoZSBtZXRob2QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYnVzIGRhZW1vbiBsb29rcyBhdCB0aGUgZGVzdGluYXRpb24gYnVzIG5hbWUuIElmIGEgcHJvY2VzcyBvd25zIHRoYXQgbmFtZSwgCisgICAgICAgICAgICAgIHRoZSBidXMgZGFlbW9uIGZvcndhcmRzIHRoZSBtZXRob2QgY2FsbCB0byB0aGF0IHByb2Nlc3MuIE90aGVyd2lzZSwgdGhlIGJ1cyBkYWVtb24KKyAgICAgICAgICAgICAgY3JlYXRlcyBhbiBlcnJvciBtZXNzYWdlIGFuZCBzZW5kcyBpdCBiYWNrIGFzIHRoZSByZXBseSB0byB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgcmVjZWl2aW5nIHByb2Nlc3MgdW5wYWNrcyB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZS4gSW4gYSBzaW1wbGUgbG93LWxldmVsIEFQSSBzaXR1YXRpb24sIGl0IAorICAgICAgICAgICAgICBtYXkgaW1tZWRpYXRlbHkgcnVuIHRoZSBtZXRob2QgYW5kIHNlbmQgYSBtZXRob2QgcmVwbHkgbWVzc2FnZSB0byB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICAgICAgV2hlbiB1c2luZyBhIGhpZ2gtbGV2ZWwgYmluZGluZyBBUEksIHRoZSBiaW5kaW5nIG1pZ2h0IGV4YW1pbmUgdGhlIG9iamVjdCBwYXRoLCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgIGFuZCBtZXRob2QgbmFtZSwgYW5kIGNvbnZlcnQgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaW50byBhbiBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIG9uIAorICAgICAgICAgICAgICBhIG5hdGl2ZSBvYmplY3QgKEdPYmplY3QsIGphdmEubGFuZy5PYmplY3QsIFFPYmplY3QsIGV0Yy4pLCB0aGVuIGNvbnZlcnQgdGhlIHJldHVybiAKKyAgICAgICAgICAgICAgdmFsdWUgZnJvbSB0aGUgbmF0aXZlIG1ldGhvZCBpbnRvIGEgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGJ1cyBkYWVtb24gcmVjZWl2ZXMgdGhlIG1ldGhvZCByZXBseSBtZXNzYWdlIGFuZCBzZW5kcyBpdCB0byB0aGUgcHJvY2VzcyB0aGF0IAorICAgICAgICAgICAgICBtYWRlIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgcHJvY2VzcyB0aGF0IG1hZGUgdGhlIG1ldGhvZCBjYWxsIGxvb2tzIGF0IHRoZSBtZXRob2QgcmVwbHkgYW5kIG1ha2VzIHVzZSBvZiBhbnkgCisgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMgaW5jbHVkZWQgaW4gdGhlIHJlcGx5LiBUaGUgcmVwbHkgbWF5IGFsc28gaW5kaWNhdGUgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgICAgV2hlbiB1c2luZyBhIGJpbmRpbmcsIHRoZSBtZXRob2QgcmVwbHkgbWVzc2FnZSBtYXkgYmUgY29udmVydGVkIGludG8gdGhlIHJldHVybiB2YWx1ZSBvZiAKKyAgICAgICAgICAgICAgb2YgYSBwcm94eSBtZXRob2QsIG9yIGludG8gYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGJ1cyBkYWVtb24gbmV2ZXIgcmVvcmRlcnMgbWVzc2FnZXMuIFRoYXQgaXMsIGlmIHlvdSBzZW5kIHR3byBtZXRob2QgY2FsbCBtZXNzYWdlcyB0byB0aGUgc2FtZSByZWNpcGllbnQsIAorICAgICAgICB0aGV5IHdpbGwgYmUgcmVjZWl2ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzZW50LiBUaGUgcmVjaXBpZW50IGlzIG5vdCByZXF1aXJlZCB0byByZXBseSB0byB0aGUgY2FsbHMKKyAgICAgICAgaW4gb3JkZXIsIGhvd2V2ZXI7IGZvciBleGFtcGxlLCBpdCBtYXkgcHJvY2VzcyBlYWNoIG1ldGhvZCBjYWxsIGluIGEgc2VwYXJhdGUgdGhyZWFkLCBhbmQgcmV0dXJuIHJlcGx5IG1lc3NhZ2VzCisgICAgICAgIGluIGFuIHVuZGVmaW5lZCBvcmRlciBkZXBlbmRpbmcgb24gd2hlbiB0aGUgdGhyZWFkcyBjb21wbGV0ZS4gTWV0aG9kIGNhbGxzIGhhdmUgYSB1bmlxdWUgc2VyaWFsIAorICAgICAgICBudW1iZXIgdXNlZCBieSB0aGUgbWV0aG9kIGNhbGxlciB0byBtYXRjaCByZXBseSBtZXNzYWdlcyB0byBjYWxsIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ic2lnbmFscHJvY2VkdXJlIj4KKyAgICAgIDx0aXRsZT5FbWl0dGluZyBhIFNpZ25hbCAtIEJlaGluZCB0aGUgU2NlbmVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgc2lnbmFsIGluIERCdXMgY29uc2lzdHMgb2YgYSBzaW5nbGUgbWVzc2FnZSwgc2VudCBieSBvbmUgcHJvY2VzcyB0byBhbnkgbnVtYmVyIG9mIG90aGVyIHByb2Nlc3Nlcy4gCisgICAgICAgIFRoYXQgaXMsIGEgc2lnbmFsIGlzIGEgdW5pZGlyZWN0aW9uYWwgYnJvYWRjYXN0LiBUaGUgc2lnbmFsIG1heSBjb250YWluIGFyZ3VtZW50cyAoYSBkYXRhIHBheWxvYWQpLCBidXQgCisgICAgICAgIGJlY2F1c2UgaXQgaXMgYSBicm9hZGNhc3QsIGl0IG5ldmVyIGhhcyBhICJyZXR1cm4gdmFsdWUuIiBDb250cmFzdCB0aGlzIHdpdGggYSBtZXRob2QgY2FsbCAKKyAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJjYWxscHJvY2VkdXJlIi8+KSB3aGVyZSB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZSBoYXMgYSBtYXRjaGluZyBtZXRob2QgcmVwbHkgbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBlbWl0dGVyIChha2Egc2VuZGVyKSBvZiBhIHNpZ25hbCBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgcmVjaXBpZW50cy4gUmVjaXBpZW50cyByZWdpc3RlcgorICAgICAgICB3aXRoIHRoZSBidXMgZGFlbW9uIHRvIHJlY2VpdmUgc2lnbmFscyBiYXNlZCBvbiAibWF0Y2ggcnVsZXMiIC0gdGhlc2UgcnVsZXMgd291bGQgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHNlbmRlciBhbmQgCisgICAgICAgIHRoZSBzaWduYWwgbmFtZS4gVGhlIGJ1cyBkYWVtb24gc2VuZHMgZWFjaCBzaWduYWwgb25seSB0byByZWNpcGllbnRzIHdobyBoYXZlIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiB0aGF0IAorICAgICAgICBzaWduYWwuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIHNpZ25hbCBpbiBEQnVzIGhhcHBlbnMgYXMgZm9sbG93czoKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgQSBzaWduYWwgbWVzc2FnZSBpcyBjcmVhdGVkIGFuZCBzZW50IHRvIHRoZSBidXMgZGFlbW9uLiBXaGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgQVBJIHRoaXMgbWF5IGJlIAorICAgICAgICAgICAgICBkb25lIG1hbnVhbGx5LCB3aXRoIGNlcnRhaW4gYmluZGluZ3MgaXQgbWF5IGJlIGRvbmUgZm9yIHlvdSBieSB0aGUgYmluZGluZyB3aGVuIGEgbmF0aXZlIG9iamVjdAorICAgICAgICAgICAgICBlbWl0cyBhIG5hdGl2ZSBzaWduYWwgb3IgZXZlbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIHNpZ25hbCBtZXNzYWdlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBzcGVjaWZpZXMgdGhlIHNpZ25hbDsKKyAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNpZ25hbDsgdGhlIGJ1cyBuYW1lIG9mIHRoZSBwcm9jZXNzIHNlbmRpbmcgdGhlIHNpZ25hbDsgYW5kIAorICAgICAgICAgICAgICBhbnkgYXJndW1lbnRzIAorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEFueSBwcm9jZXNzIG9uIHRoZSBtZXNzYWdlIGJ1cyBjYW4gcmVnaXN0ZXIgIm1hdGNoIHJ1bGVzIiBpbmRpY2F0aW5nIHdoaWNoIHNpZ25hbHMgaXQgCisgICAgICAgICAgICAgIGlzIGludGVyZXN0ZWQgaW4uIFRoZSBidXMgaGFzIGEgbGlzdCBvZiByZWdpc3RlcmVkIG1hdGNoIHJ1bGVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBidXMgZGFlbW9uIGV4YW1pbmVzIHRoZSBzaWduYWwgYW5kIGRldGVybWluZXMgd2hpY2ggcHJvY2Vzc2VzIGFyZSBpbnRlcmVzdGVkIGluIGl0LgorICAgICAgICAgICAgICBJdCBzZW5kcyB0aGUgc2lnbmFsIG1lc3NhZ2UgdG8gdGhlc2UgcHJvY2Vzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEVhY2ggcHJvY2VzcyByZWNlaXZpbmcgdGhlIHNpZ25hbCBkZWNpZGVzIHdoYXQgdG8gZG8gd2l0aCBpdDsgaWYgdXNpbmcgYSBiaW5kaW5nLCAKKyAgICAgICAgICAgICAgdGhlIGJpbmRpbmcgbWF5IGNob29zZSB0byBlbWl0IGEgbmF0aXZlIHNpZ25hbCBvbiBhIHByb3h5IG9iamVjdC4gSWYgdXNpbmcgdGhlIAorICAgICAgICAgICAgICBsb3ctbGV2ZWwgQVBJLCB0aGUgcHJvY2VzcyBtYXkganVzdCBsb29rIGF0IHRoZSBzaWduYWwgc2VuZGVyIGFuZCBuYW1lIGFuZCBkZWNpZGUKKyAgICAgICAgICAgICAgd2hhdCB0byBkbyBiYXNlZCBvbiB0aGF0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iaW50cm9zcGVjdGlvbiI+CisgICAgICA8dGl0bGU+SW50cm9zcGVjdGlvbjwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyBvYmplY3RzIG1heSBzdXBwb3J0IHRoZSBpbnRlcmZhY2UgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+LgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZCA8bGl0ZXJhbD5JbnRyb3NwZWN0PC9saXRlcmFsPiB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMKKyAgICAgICAgYW4gWE1MIHN0cmluZy4gVGhlIFhNTCBzdHJpbmcgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzLCBtZXRob2RzLCBhbmQgc2lnbmFscyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBTZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGludHJvc3BlY3Rpb24gZm9ybWF0LgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0iZ2xpYi1jbGllbnQiPgorICAgIDx0aXRsZT5HTGliIEFQSXM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIHJlY29tbWVuZGVkIEdMaWIgQVBJIGZvciBELUJ1cyBpcyBHREJ1cywgd2hpY2ggaGFzIGJlZW4KKyAgICAgIGRpc3RyaWJ1dGVkIHdpdGggR0xpYiBzaW5jZSB2ZXJzaW9uIDIuMjYuIEl0IGlzIG5vdCBkb2N1bWVudGVkIGhlcmUuCisgICAgICBTZWUgPHVsaW5rIHVybD0iaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dpby9zdGFibGUvZ2RidXMtY29udmVuaWVuY2UuaHRtbCI+dGhlCisgICAgICAgIEdMaWIgZG9jdW1lbnRhdGlvbjwvdWxpbms+IGZvciBkZXRhaWxzIG9mIGhvdyB0byB1c2UgR0RCdXMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBbiBvbGRlciBBUEksIGRidXMtZ2xpYiwgYWxzbyBleGlzdHMuIEl0IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZAorICAgICAgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUuIFdoZW5ldmVyIHBvc3NpYmxlLCBwb3J0aW5nIGV4aXN0aW5nIGNvZGUKKyAgICAgIGZyb20gZGJ1cy1nbGliIHRvIEdEQnVzIGlzIGFsc28gcmVjb21tZW5kZWQuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0icHl0aG9uLWNsaWVudCI+CisgICAgPHRpdGxlPlB5dGhvbiBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFB5dGhvbiBBUEksIGRidXMtcHl0aG9uLCBpcyBub3cgZG9jdW1lbnRlZCBzZXBhcmF0ZWx5IGluCisgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtcHl0aG9uL2RvYy90dXRvcmlhbC5odG1sIj50aGUgZGJ1cy1weXRob24gdHV0b3JpYWw8L3VsaW5rPiAoYWxzbyBhdmFpbGFibGUgaW4gZG9jL3R1dG9yaWFsLnR4dCwKKyAgICAgIGFuZCBkb2MvdHV0b3JpYWwuaHRtbCBpZiBidWlsdCB3aXRoIHB5dGhvbi1kb2N1dGlscywgaW4gdGhlIGRidXMtcHl0aG9uCisgICAgICBzb3VyY2UgZGlzdHJpYnV0aW9uKS4KKyAgICA8L3BhcmE+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJxdC1jbGllbnQiPgorICAgIDx0aXRsZT5RdCBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFF0IGJpbmRpbmcgZm9yIGxpYmRidXMsIFF0REJ1cywgaGFzIGJlZW4gZGlzdHJpYnV0ZWQgd2l0aCBRdAorICAgICAgc2luY2UgdmVyc2lvbiA0LjIuIEl0IGlzIG5vdCBkb2N1bWVudGVkIGhlcmUuIFNlZQorICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC01L3F0ZGJ1cy1pbmRleC5odG1sIj50aGUgUXQKKyAgICAgICAgZG9jdW1lbnRhdGlvbjwvdWxpbms+IGZvciBkZXRhaWxzIG9mIGhvdyB0byB1c2UgUXREQnVzLgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluIGIvZG9jL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuMS54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0OTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluCkBAIC0wLDAgKzEsMjEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIiAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0iZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC4xIj4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAxNTwveWVhcj4KKyAgICAgIDxob2xkZXI+Q29sbGFib3JhIEx0ZC48L2hvbGRlcj4KKyAgICA8L2NvcHlyaWdodD4KKyAgICA8bGVnYWxub3RpY2U+CisgICAgICA8cGFyYT5UaGlzIG1hbiBwYWdlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzCisgICAgICAgIGRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgKE1JVC9YMTEpLiBUaGVyZSBpcyBOTyBXQVJSQU5UWSwKKyAgICAgICAgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LjwvcGFyYT4KKyAgICA8L2xlZ2Fsbm90aWNlPgorICA8L3JlZmVudHJ5aW5mbz4KKworICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0ibWFudWFsIj5Vc2VyIENvbW1hbmRzPC9yZWZtaXNjaW5mbz4KKyAgICA8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorICA8L3JlZm1ldGE+CisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+dXBkYXRlIGVudmlyb25tZW50IHVzZWQgZm9yIEQtQnVzIHNlc3Npb24gc2VydmljZXM8L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXYgaWQ9InN5bm9wc2lzIj4KKyAgICA8Y21kc3lub3BzaXM+CisgICAgICA8Y29tbWFuZD5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1zeXN0ZW1kPC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLXZlcmJvc2U8L2FyZz4KKyAgICAgIDxncm91cCBjaG9pY2U9InBsYWluIj4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLWFsbDwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iIHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIiByZXA9InJlcGVhdCI+PHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+PTxyZXBsYWNlYWJsZT5WQUw8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICA8L2NtZHN5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MSBpZD0iZGVzY3JpcHRpb24iPgorICAgIDx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+CisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudDwvY29tbWFuZD4KKyAgICAgIHVwZGF0ZXMgdGhlIGxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgYnkKKyAgICAgIDxjb21tYW5kPmRidXMtZGFlbW9uIC0tc2Vzc2lvbjwvY29tbWFuZD4KKyAgICAgIHdoZW4gaXQgYWN0aXZhdGVzIHNlc3Npb24gc2VydmljZXMgd2l0aG91dCB1c2luZworICAgICAgPGNvbW1hbmQ+c3lzdGVtZDwvY29tbWFuZD4uPC9wYXJhPgorCisgICAgPHBhcmE+V2l0aCB0aGUgPG9wdGlvbj4tLXN5c3RlbWQ8L29wdGlvbj4gb3B0aW9uLAorICAgICAgaWYgYW4gaW5zdGFuY2Ugb2YgPGNvbW1hbmQ+c3lzdGVtZCAtLXVzZXI8L2NvbW1hbmQ+IGlzCisgICAgICBhdmFpbGFibGUgb24gRC1CdXMsIGl0IGFsc28gdXBkYXRlcyB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIHVzZWQgYnkgPGNvbW1hbmQ+c3lzdGVtZCAtLXVzZXI8L2NvbW1hbmQ+CisgICAgICB3aGVuIGl0IGFjdGl2YXRlcyB1c2VyIHNlcnZpY2VzLCBpbmNsdWRpbmcgRC1CdXMgc2Vzc2lvbiBzZXJ2aWNlcworICAgICAgZm9yIHdoaWNoIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBoYXMgYmVlbiBjb25maWd1cmVkIHRvCisgICAgICBkZWxlZ2F0ZSBhY3RpdmF0aW9uIHRvIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+LgorICAgICAgVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIDxvcHRpb24+aW1wb3J0LWVudmlyb25tZW50PC9vcHRpb24+CisgICAgICBjb21tYW5kIHByb3ZpZGVkIGJ5CisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPnN5c3RlbWN0bDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4pLjwvcGFyYT4KKworICAgIDxwYXJhPlZhcmlhYmxlcyB0aGF0IGFyZSBzcGVjaWFsIHRvIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPgorICAgICAgb3IgPGNvbW1hbmQ+c3lzdGVtZDwvY29tbWFuZD4gbWF5IGJlIHNldCwgYnV0IHRoZWlyIHZhbHVlcyB3aWxsCisgICAgICBiZSBvdmVycmlkZGVuIHdoZW4gYSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuIEZvciBpbnN0YW5jZSwgaXQgaXMKKyAgICAgIG5vdCB1c2VmdWwgdG8gYWRkIDxlbnZhcj5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2VudmFyPiB0bworICAgICAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+J3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCwKKyAgICAgIGFsdGhvdWdoIGl0IG1pZ2h0IHN0aWxsIGJlIHVzZWZ1bCB0byBhZGQgaXQgdG8KKyAgICAgIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+J3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudC48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJvcHRpb25zIj4KKyAgICA8dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi0tYWxsPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+U2V0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJlc2VudCBpbgorICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IHVzZWQgYnkKKyAgICAgICAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+LgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi0tc3lzdGVtZDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHN5c3RlbWQgdXNlciBzZXJ2aWNlcyBhcyB3ZWxsIGFzCisgICAgICAgICAgICBmb3IgdHJhZGl0aW9uYWwgRC1CdXMgc2Vzc2lvbiBzZXJ2aWNlcy48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tLXZlcmJvc2U8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5PdXRwdXQgbWVzc2FnZXMgdG8gc3RhbmRhcmQgZXJyb3IgZXhwbGFpbmluZyB3aGF0CisgICAgICAgICAgICBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IGlzIGRvaW5nLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5JZiA8cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT4gaXMgcHJlc2VudCBpbiB0aGUKKyAgICAgICAgICAgIGVudmlyb25tZW50IG9mIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+LAorICAgICAgICAgICAgc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGZvciBELUJ1cyBzZXJ2aWNlcy4gSXRzIHZhbHVlIG11c3QgYmUKKyAgICAgICAgICAgIFVURi04IChpZiBub3QsIGl0IGlzIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcpLiBJZgorICAgICAgICAgICAgPHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+IGlzIG5vdCBwcmVzZW50CisgICAgICAgICAgICBpbiB0aGUgZW52aXJvbm1lbnQsIHRoaXMgYXJndW1lbnQgaXMgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+PTxyZXBsYWNlYWJsZT5WQUw8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlNldCA8cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT4gdG8gPHJlcGxhY2VhYmxlPlZBTDwvcmVwbGFjZWFibGU+LAorICAgICAgICAgICAgd2hpY2ggbXVzdCBiZSBVVEYtOC48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0iZXhhbXBsZXMiPgorICAgIDx0aXRsZT5FWEFNUExFUzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICA8Y29tbWFuZD5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9jb21tYW5kPiBpcworICAgICAgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gTGludXggZGlzdHJpYnV0aW9ucycgWDExIHNlc3Npb24KKyAgICAgIHN0YXJ0dXAgc2NyaXB0cywgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgInVzZXIgYnVzIiBkZXNpZ24uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+VG8gcHJvcGFnYXRlIDxlbnZhcj5ESVNQTEFZPC9lbnZhcj4gYW5kIDxlbnZhcj5YQVVUSE9SSVRZPC9lbnZhcj4KKyAgICAgIHRvIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPgorICAgICAgYW5kLCBpZiBwcmVzZW50LCA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPiwKKyAgICAgIGFuZCBwcm9wYWdhdGUgPGVudmFyPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvZW52YXI+IHRvCisgICAgICA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPjoKKyAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ic2giPgorICAgICAgICBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IC0tc3lzdGVtZCBcCisgICAgICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgRElTUExBWSBYQVVUSE9SSVRZCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPlRvIHByb3BhZ2F0ZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VwdAorICAgICAgPGVudmFyPlhER19TRUFUPC9lbnZhcj4sIDxlbnZhcj5YREdfU0VTU0lPTl9JRDwvZW52YXI+CisgICAgICBhbmQgPGVudmFyPlhER19WVE5SPC9lbnZhcj4gdG8gPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+CisgICAgICAoYW5kLCBpZiBwcmVzZW50LCA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPikgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgIHdpdGggbGVnYWN5IFgxMSBzZXNzaW9uIHN0YXJ0dXAgc2NyaXB0czoKKyAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ic2giPgorICAgICAgICAjIGluIGEgc3Vic2hlbGwgc28gdGhlIHZhcmlhYmxlcyByZW1haW4gc2V0IGluIHRoZQorICAgICAgICAjIHBhcmVudCBzY3JpcHQKKyAgICAgICAgKAorICAgICAgICAgIHVuc2V0IFhER19TRUFUCisgICAgICAgICAgdW5zZXQgWERHX1NFU1NJT05fSUQKKyAgICAgICAgICB1bnNldCBYREdfVlROUgorCisgICAgICAgICAgZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCAtLXN5c3RlbWQgLS1hbGwKKyAgICAgICAgKQorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJleGl0X3N0YXR1cyI+CisgICAgPHRpdGxlPkVYSVQgU1RBVFVTPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+CisgICAgICBleGl0cyB3aXRoIHN0YXR1cyAwIG9uIHN1Y2Nlc3MsIEVYX1VTQUdFICg2NCkgb24gaW52YWxpZAorICAgICAgY29tbWFuZC1saW5lIG9wdGlvbnMsIEVYX09TRVJSICg3MSkgaWYgdW5hYmxlIHRvIGNvbm5lY3QKKyAgICAgIHRvIHRoZSBzZXNzaW9uIGJ1cywgb3IgRVhfVU5BVkFJTEFCTEUgKDY5KSBpZiB1bmFibGUgdG8KKyAgICAgIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBPdGhlciBub256ZXJvIGV4aXQgY29kZXMgbWlnaHQgYmUKKyAgICAgIGFkZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJlbnZpcm9ubWVudCI+CisgICAgPHRpdGxlPkVOVklST05NRU5UPC90aXRsZT4KKyAgICAgIDxwYXJhPjxlbnZhcj5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2VudmFyPiwKKyAgICAgICAgPGVudmFyPlhER19SVU5USU1FX0RJUjwvZW52YXI+IGFuZC9vciA8ZW52YXI+RElTUExBWTwvZW52YXI+CisgICAgICAgIGFyZSB1c2VkIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlc3Npb24gYnVzLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDEgaWQ9ImxpbWl0YXRpb25zIj4KKyAgICA8dGl0bGU+TElNSVRBVElPTlM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gdW5zZXQKKyAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBzZXQgKGFsdGhvdWdoCisgICAgICA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPiBkb2VzKSwgc28KKyAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+IGRvZXMgbm90CisgICAgICBvZmZlciB0aGlzIGZ1bmN0aW9uYWxpdHkgZWl0aGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSB0aGUgZW5jb2Rpbmcgb2Ygbm9uLUFTQ0lJIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICBuYW1lcyBvciB2YWx1ZXMgYW5kIGFsbG93cyB0aGVtIHRvIGNvbnRhaW4gYW55IG5vbi16ZXJvIGJ5dGUsIGJ1dAorICAgICAgbmVpdGhlciA8Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD4gbm9yIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+CisgICAgICBzdXBwb3J0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCBub24tVVRGLTggbmFtZXMgb3IgdmFsdWVzLgorICAgICAgQWNjb3JkaW5nbHksIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+CisgICAgICBhc3N1bWVzIHRoYXQgYW55IG5hbWUgb3IgdmFsdWUgdGhhdCBhcHBlYXJzIHRvIGJlIHZhbGlkIFVURi04IGlzCisgICAgICBpbnRlbmRlZCB0byBiZSBVVEYtOCwgYW5kIGlnbm9yZXMgb3RoZXIgbmFtZXMgb3IgdmFsdWVzIHdpdGggYSB3YXJuaW5nLgorICAgIDwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDEgaWQ9ImJ1Z3MiPgorICAgIDx0aXRsZT5CVUdTPC90aXRsZT4KKyAgICAgIDxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBidWcgdHJhY2tlciBvciBtYWlsaW5nIGxpc3QuCisgICAgICAgIFNlZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyI+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPi48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJzZWVfYWxzbyI+CisgICAgPHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKyAgICA8cGFyYT48Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtZGFlbW9uPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+c3lzdGVtZDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICB0aGUgPG9wdGlvbj5pbXBvcnQtZW52aXJvbm1lbnQ8L29wdGlvbj4gY29tbWFuZCBvZgorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5zeXN0ZW1jdGw8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+PC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXV1aWRnZW4uMSBiL2RvYy9kYnVzLXV1aWRnZW4uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ4ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtdXVpZGdlbi4xCkBAIC0wLDAgKzEsODkgQEAKKy5cIiAKKy5cIiBkYnVzXC11dWlkZ2VuIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisuXCIKKy5USCBkYnVzXC11dWlkZ2VuIDEKKy5TSCBOQU1FCitkYnVzXC11dWlkZ2VuIFwtIFV0aWxpdHkgdG8gZ2VuZXJhdGUgVVVJRHMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzXC11dWlkZ2VuIFtcLVwtdmVyc2lvbl0gW1wtXC1lbnN1cmVbPUZJTEVOQU1FXV0gW1wtXC1nZXRbPUZJTEVOQU1FXV0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzXC11dWlkZ2VuXGZQIGNvbW1hbmQgZ2VuZXJhdGVzIG9yIHJlYWRzIGEgdW5pdmVyc2FsbHkgdW5pcXVlIElELgorCisuUFAKK05vdGUgdGhhdCB0aGUgRFwtQnVzIFVVSUQgaGFzIG5vIHJlbGF0aW9uc2hpcCB0byBSRkMgNDEyMiBhbmQgZG9lcyBub3QgZ2VuZXJhdGUKK1VVSURzIGNvbXBhdGlibGUgd2l0aCB0aGF0IHNwZWMuIE1hbnkgc3lzdGVtcyBoYXZlIGEgc2VwYXJhdGUgY29tbWFuZAorZm9yIHRoYXQgKG9mdGVuIGNhbGxlZCAidXVpZGdlbiIpLgorCisuUFAKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRFwtQnVzLgorCisuUFAKK1RoZSBwcmltYXJ5IHVzYWdlIG9mIFxmSWRidXNcLXV1aWRnZW5cZlAgaXMgdG8gcnVuIGluIHRoZSBwb3N0XC1pbnN0YWxsCitzY3JpcHQgb2YgYSBEXC1CdXMgcGFja2FnZSBsaWtlIHRoaXM6CisubmYKKyAgZGJ1c1wtdXVpZGdlbiBcLVwtZW5zdXJlCisuZmkKKworLlBQCitUaGlzIHdpbGwgZW5zdXJlIHRoYXQgL3Zhci9saWIvZGJ1cy9tYWNoaW5lXC1pZCBleGlzdHMgYW5kIGhhcyB0aGUgdXVpZCBpbiBpdC4KK0l0IHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB1dWlkLCBzaW5jZSB0aGlzIGlkIHNob3VsZCByZW1haW4gZml4ZWQKK2ZvciBhIHNpbmdsZSBtYWNoaW5lIHVudGlsIHRoZSBuZXh0IHJlYm9vdCBhdCBsZWFzdC4KKworLlBQCitUaGUgaW1wb3J0YW50IHByb3BlcnRpZXMgb2YgdGhlIG1hY2hpbmUgVVVJRCBhcmUgdGhhdCAxKSBpdCByZW1haW5zCit1bmNoYW5nZWQgdW50aWwgdGhlIG5leHQgcmVib290IGFuZCAyKSBpdCBpcyBkaWZmZXJlbnQgZm9yIGFueSB0d28gCitydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgT1Mga2VybmVsLiBUaGF0IGlzLCBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgCitzYW1lIFVVSUQsIHRoZXkgc2hvdWxkIGFsc28gc2VlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluCitzb2NrZXRzLCBsb2NhbCBYIGRpc3BsYXlzLCBsb2NhbGhvc3QubG9jYWxkb21haW4gcmVzb2x1dGlvbiwgcHJvY2VzcworSURzLCBhbmQgc28gZm9ydGguCisKKy5QUAorSWYgeW91IHJ1biBcZklkYnVzXC11dWlkZ2VuXGZQIHdpdGggbm8gb3B0aW9ucyBpdCBqdXN0IHByaW50cyBhIG5ldyB1dWlkIG1hZGUKK3VwIG91dCBvZiB0aGluIGFpci4KKworLlBQCitJZiB5b3UgcnVuIGl0IHdpdGggXC1cLWdldCwgaXQgcHJpbnRzIHRoZSBtYWNoaW5lIFVVSUQgYnkgZGVmYXVsdCwgb3IKK3RoZSBVVUlEIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUuCisKKy5QUAorSWYgeW91IHRyeSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbWFjaGluZVwtaWQgb24gYSBydW5uaW5nIHN5c3RlbSwgaXQgd2lsbAorcHJvYmFibHkgcmVzdWx0IGluIGJhZCB0aGluZ3MgaGFwcGVuaW5nLiBEb24ndCB0cnkgdG8gY2hhbmdlIHRoaXMgZmlsZS4gQWxzbywKK2Rvbid0IG1ha2UgaXQgdGhlIHNhbWUgb24gdHdvIGRpZmZlcmVudCBzeXN0ZW1zOyBpdCBuZWVkcyB0byBiZSBkaWZmZXJlbnQKK2FueXRpbWUgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscyBydW5uaW5nLgorCisuUFAKK1RoZSBVVUlEIHNob3VsZCBiZSBkaWZmZXJlbnQgb24gdHdvIGRpZmZlcmVudCB2aXJ0dWFsIG1hY2hpbmVzLAorYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBrZXJuZWxzLgorCisuU0ggT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisuVFAKKy5JICJcLVwtZ2V0Wz1GSUxFTkFNRV0iCitJZiBhIGZpbGVuYW1lIGlzIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gbG9jYWxzdGF0ZWRpci9saWIvZGJ1cy9tYWNoaW5lXC1pZAorKGxvY2Fsc3RhdGVkaXIgaXMgdXN1YWxseSAvdmFyKS4gSWYgdGhpcyBmaWxlIGV4aXN0cyBhbmQgaXMgdmFsaWQsIHRoZQordXVpZCBpbiB0aGUgZmlsZSBpcyBwcmludGVkIG9uIHN0ZG91dC4gT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBleGl0cyAKK3dpdGggYSBub256ZXJvIHN0YXR1cy4KKworLlRQCisuSSAiXC1cLWVuc3VyZVs9RklMRU5BTUVdIgorSWYgYSBmaWxlbmFtZSBpcyBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIGxvY2Fsc3RhdGVkaXIvbGliL2RidXMvbWFjaGluZVwtaWQKKyhsb2NhbHN0YXRlZGlyIGlzIHVzdWFsbHkgL3ZhcikuIElmIHRoaXMgZmlsZSBleGlzdHMgdGhlbiBpdCB3aWxsIGJlCit2YWxpZGF0ZWQsIGFuZCBhIGZhaWx1cmUgY29kZSByZXR1cm5lZCBpZiBpdCBjb250YWlucyB0aGUgd3JvbmcgdGhpbmcuCitJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIHdpdGggYSBuZXcgdXVpZCBpbiBpdC4KK09uIHN1Y2Nlc3MsIHByaW50cyBubyBvdXRwdXQuCisKKy5UUAorLkkgIlwtXC12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1c1wtdXVpZGdlbgorCisuU0ggQVVUSE9SCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUworCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIERcLUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXV1aWRnZW4uMS54bWwuaW4gYi9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sLmluCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzdXVpZGdlbjEnPgorCis8IS0tICBkYnVzJmJzb2w7LXV1aWRnZW4gbWFudWFsIHBhZ2UuCisgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy11dWlkZ2VuPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtdXVpZGdlbjwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlV0aWxpdHkgdG8gZ2VuZXJhdGUgVVVJRHM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy11dWlkZ2VuPC9jb21tYW5kPiAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXZlcnNpb24gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWVuc3VyZSA8L2FyZz48YXJnIGNob2ljZT0nb3B0Jz48cmVwbGFjZWFibGU+PUZJTEVOQU1FPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tZ2V0IDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49RklMRU5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLXV1aWRnZW48L2NvbW1hbmQ+IGNvbW1hbmQgZ2VuZXJhdGVzIG9yIHJlYWRzIGEgdW5pdmVyc2FsbHkgdW5pcXVlIElELjwvcGFyYT4KKworCis8cGFyYT5Ob3RlIHRoYXQgdGhlIEQtQnVzIFVVSUQgaGFzIG5vIHJlbGF0aW9uc2hpcCB0byBSRkMgNDEyMiBhbmQgZG9lcyBub3QgZ2VuZXJhdGUKK1VVSURzIGNvbXBhdGlibGUgd2l0aCB0aGF0IHNwZWMuIE1hbnkgc3lzdGVtcyBoYXZlIGEgc2VwYXJhdGUgY29tbWFuZAorZm9yIHRoYXQgKG9mdGVuIGNhbGxlZCAidXVpZGdlbiIpLjwvcGFyYT4KKworCis8cGFyYT5TZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24KK2Fib3V0IEQtQnVzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcHJpbWFyeSB1c2FnZSBvZiA8Y29tbWFuZD5kYnVzLXV1aWRnZW48L2NvbW1hbmQ+IGlzIHRvIHJ1biBpbiB0aGUgcG9zdC1pbnN0YWxsCitzY3JpcHQgb2YgYSBELUJ1cyBwYWNrYWdlIGxpa2UgdGhpczo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoaXMgd2lsbCBlbnN1cmUgdGhhdCAvdmFyL2xpYi9kYnVzL21hY2hpbmUtaWQgZXhpc3RzIGFuZCBoYXMgdGhlIHV1aWQgaW4gaXQuCitJdCB3b24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdXVpZCwgc2luY2UgdGhpcyBpZCBzaG91bGQgcmVtYWluIGZpeGVkCitmb3IgYSBzaW5nbGUgbWFjaGluZSB1bnRpbCB0aGUgbmV4dCByZWJvb3QgYXQgbGVhc3QuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBpbXBvcnRhbnQgcHJvcGVydGllcyBvZiB0aGUgbWFjaGluZSBVVUlEIGFyZSB0aGF0IDEpIGl0IHJlbWFpbnMKK3VuY2hhbmdlZCB1bnRpbCB0aGUgbmV4dCByZWJvb3QgYW5kIDIpIGl0IGlzIGRpZmZlcmVudCBmb3IgYW55IHR3bworcnVubmluZyBpbnN0YW5jZXMgb2YgdGhlIE9TIGtlcm5lbC4gVGhhdCBpcywgaWYgdHdvIHByb2Nlc3NlcyBzZWUgdGhlCitzYW1lIFVVSUQsIHRoZXkgc2hvdWxkIGFsc28gc2VlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluCitzb2NrZXRzLCBsb2NhbCBYIGRpc3BsYXlzLCBsb2NhbGhvc3QubG9jYWxkb21haW4gcmVzb2x1dGlvbiwgcHJvY2VzcworSURzLCBhbmQgc28gZm9ydGguPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSBydW4gPGNvbW1hbmQ+ZGJ1cy11dWlkZ2VuPC9jb21tYW5kPiB3aXRoIG5vIG9wdGlvbnMgaXQganVzdCBwcmludHMgYSBuZXcgdXVpZCBtYWRlCit1cCBvdXQgb2YgdGhpbiBhaXIuPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSBydW4gaXQgd2l0aCAtLWdldCwgaXQgcHJpbnRzIHRoZSBtYWNoaW5lIFVVSUQgYnkgZGVmYXVsdCwgb3IKK3RoZSBVVUlEIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUuPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSB0cnkgdG8gY2hhbmdlIGFuIGV4aXN0aW5nIG1hY2hpbmUtaWQgb24gYSBydW5uaW5nIHN5c3RlbSwgaXQgd2lsbAorcHJvYmFibHkgcmVzdWx0IGluIGJhZCB0aGluZ3MgaGFwcGVuaW5nLiBEb24ndCB0cnkgdG8gY2hhbmdlIHRoaXMgZmlsZS4gQWxzbywKK2Rvbid0IG1ha2UgaXQgdGhlIHNhbWUgb24gdHdvIGRpZmZlcmVudCBzeXN0ZW1zOyBpdCBuZWVkcyB0byBiZSBkaWZmZXJlbnQKK2FueXRpbWUgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscyBydW5uaW5nLjwvcGFyYT4KKworCis8cGFyYT5UaGUgVVVJRCBzaG91bGQgYmUgZGlmZmVyZW50IG9uIHR3byBkaWZmZXJlbnQgdmlydHVhbCBtYWNoaW5lcywKK2JlY2F1c2UgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZ2V0Wz1GSUxFTkFNRV08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPklmIGEgZmlsZW5hbWUgaXMgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBsb2NhbHN0YXRlZGlyL2xpYi9kYnVzL21hY2hpbmUtaWQKKyhsb2NhbHN0YXRlZGlyIGlzIHVzdWFsbHkgL3ZhcikuIElmIHRoaXMgZmlsZSBleGlzdHMgYW5kIGlzIHZhbGlkLCB0aGUKK3V1aWQgaW4gdGhlIGZpbGUgaXMgcHJpbnRlZCBvbiBzdGRvdXQuIE90aGVyd2lzZSwgdGhlIGNvbW1hbmQgZXhpdHMKK3dpdGggYSBub256ZXJvIHN0YXR1cy48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1lbnN1cmVbPUZJTEVOQU1FXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+SWYgYSBmaWxlbmFtZSBpcyBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIGxvY2Fsc3RhdGVkaXIvbGliL2RidXMvbWFjaGluZS1pZAorKGxvY2Fsc3RhdGVkaXIgaXMgdXN1YWxseSAvdmFyKS4gSWYgdGhpcyBmaWxlIGV4aXN0cyB0aGVuIGl0IHdpbGwgYmUKK3ZhbGlkYXRlZCwgYW5kIGEgZmFpbHVyZSBjb2RlIHJldHVybmVkIGlmIGl0IGNvbnRhaW5zIHRoZSB3cm9uZyB0aGluZy4KK0lmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIG5ldyB1dWlkIGluIGl0LgorT24gc3VjY2VzcywgcHJpbnRzIG5vIG91dHB1dC48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzLXV1aWRnZW48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2Rjb3AtaG93dG8udHh0IGIvZG9jL2Rjb3AtaG93dG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDNiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGNvcC1ob3d0by50eHQKQEAgLTAsMCArMSw1NTkgQEAKKwkJRENPUDogRGVza3RvcCBDT21tdW5pY2F0aW9ucyBQcm90b2NvbAorCisJCSAgICBQcmVzdG9uIEJyb3duIDxwYnJvd25Aa2RlLm9yZz4KKwkJCSAgIE9jdG9iZXIgMTQsIDE5OTkKKworCSBSZXZpc2VkIGFuZCBleHRlbmRlZCBieSBNYXR0aGlhcyBFdHRyaWNoIDxldHRyaWNoQGtkZS5vcmc+CisJCQkgICBNYXIgMjksIDIwMDAKKworICAgICAgICBFeHRlbmRlZCB3aXRoIERDT1AgU2lnbmFscyBieSBXYWxkbyBCYXN0aWFuIDxiYXN0aWFuQGtkZS5vcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWIgMTksIDIwMDEKKworCitNb3RpdmF0aW9uIGFuZCBCYWNrZ3JvdW5kOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1vdGl2YXRpb24gYmVoaW5kIGJ1aWxkaW5nIGEgcHJvdG9jb2wgbGlrZSBEQ09QIGlzIHNpbXBsZS4gIEZvcgordGhlIHBhc3QgeWVhciwgd2UgaGF2ZSBiZWVuIGF0dGVtcHRpbmcgdG8gZW5hYmxlIGludGVycHJvY2VzcworY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEtERSBhcHBsaWNhdGlvbnMuIEtERSBhbHJlYWR5IGhhcyBhbiBleHRyZW1lbHkKK3NpbXBsZSBJUEMgbWVjaGFuaXNtIGNhbGxlZCBLV01jb20sIHdoaWNoIGlzICh3YXMhKSB1c2VkIGZvciBjb21tdW5pY2F0aW5nCitiZXR3ZWVuIHRoZSBwYW5lbCBhbmQgdGhlIHdpbmRvdyBtYW5hZ2VyIGZvciBpbnN0YW5jZS4gIEl0IGlzIGFib3V0IGFzCitzaW1wbGUgYXMgaXQgZ2V0cywgcGFzc2luZyBtZXNzYWdlcyB2aWEgWCBBdG9tcy4gIEZvciB0aGlzIHJlYXNvbiBpdAoraXMgbGltaXRlZCBpbiB0aGUgc2l6ZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgZGF0YSB0aGF0IGNhbiBiZSBwYXNzZWQKKyhYIGF0b21zIG11c3QgYmUgc21hbGwgdG8gcmVtYWluIGVmZmljaWVudCkgYW5kIGl0IGFsc28gbWFrZXMgaXQgc28KK3RoYXQgWCBpcyByZXF1aXJlZC4gIENPUkJBIHdhcyB0aG91Z2h0IHRvIGJlIGEgbW9yZSBlZmZlY3RpdmUgSVBDL1JQQworc29sdXRpb24uICBIb3dldmVyLCBhZnRlciBhIHllYXIgb2YgYXR0ZW1wdGluZyB0byBtYWtlIGhlYXZ5IHVzZSBvZgorQ09SQkEgaW4gS0RFLCB3ZSBoYXZlIHJlYWxpemVkIHRoYXQgaXQgaXMgYSBiaXQgc2xvdyBhbmQgbWVtb3J5CitpbnRlbnNpdmUgZm9yIHNpbXBsZSB1c2UuICBJdCBhbHNvIGhhcyBubyBhdXRoZW50aWNhdGlvbiBhdmFpbGFibGUuCisKK1doYXQgd2UgcmVhbGx5IG5lZWRlZCB3YXMgYW4gZXh0cmVtZWx5IHNpbXBsZSBwcm90b2NvbCB3aXRoIGJhc2ljCithdXRob3JpemF0aW9uLCBhbG9uZyB0aGUgbGluZXMgb2YgTUlULU1BR0lDLUNPT0tJRSwgYXMgdXNlZCBieSBYLiAgSXQKK3dvdWxkIG5vdCBiZSBhYmxlIHRvIGRvIE5FQVJMWSB3aGF0IENPUkJBIHdhcyBhYmxlIHRvIGRvLCBidXQgZm9yIHRoZQorc2ltcGxlIHRhc2tzIHJlcXVpcmVkIGl0IHdvdWxkIGJlIHN1ZmZpY2llbnQuIFNvbWUgZXhhbXBsZXMgb2Ygc3VjaAordGFza3MgbWlnaHQgYmUgYW4gYXBwbGljYXRpb24gc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIHBhbmVsIHNheWluZywKKyJJIGhhdmUgc3RhcnRlZCwgc3RvcCBkaXNwbGF5aW5nIHRoZSAnYXBwbGljYXRpb24gc3RhcnRpbmcnIHdhaXQKK3N0YXRlLCIgb3IgaGF2aW5nIGEgbmV3IGFwcGxpY2F0aW9uIHRoYXQgc3RhcnRzIHF1ZXJ5IHRvIHNlZSBpZiBhbnkKK290aGVyIGFwcGxpY2F0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGFyZSBydW5uaW5nLiAgSWYgdGhleSBhcmUsIHNpbXBseQorY2FsbCBhIGZ1bmN0aW9uIG9uIHRoZSByZW1vdGUgYXBwbGljYXRpb24gdG8gY3JlYXRlIGEgbmV3IHdpbmRvdywKK3JhdGhlciB0aGFuIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MuCisKK0ltcGxlbWVudGF0aW9uOgorLS0tLS0tLS0tLS0tLS0tCisKK0RDT1AgaXMgYSBzaW1wbGUgSVBDL1JQQyBtZWNoYW5pc20gYnVpbHQgdG8gb3BlcmF0ZSBvdmVyIHNvY2tldHMuCitFaXRoZXIgdW5peCBkb21haW4gc29ja2V0cyBvciB0Y3AvaXAgc29ja2V0cyBhcmUgc3VwcG9ydGVkLiBEQ09QIGlzCitidWlsdCBvbiB0b3Agb2YgdGhlIEludGVyIENsaWVudCBFeGNoYW5nZSAoSUNFKSBwcm90b2NvbCwgd2hpY2ggY29tZXMKK3N0YW5kYXJkIGFzIGEgcGFydCBvZiBYMTFSNiBhbmQgbGF0ZXIuIEl0IGFsc28gZGVwZW5kcyBvbiBRdCwgYnV0CitiZXlvbmQgdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBvdGhlciBsaWJyYXJpZXMuIEJlY2F1c2Ugb2YgdGhpcywKK2l0IGlzIGV4dHJlbWVseSBsaWdodHdlaWdodCwgZW5hYmxpbmcgaXQgdG8gYmUgbGlua2VkIGludG8gYWxsIEtERQorYXBwbGljYXRpb25zIHdpdGggbG93IG92ZXJoZWFkLgorCitNb2RlbDoKKy0tLS0tLQorCitUaGUgbW9kZWwgaXMgc2ltcGxlLiAgRWFjaCBhcHBsaWNhdGlvbiB1c2luZyBEQ09QIGlzIGEgY2xpZW50LiAgVGhleQorY29tbXVuaWNhdGUgdG8gZWFjaCBvdGhlciB0aHJvdWdoIGEgRENPUCBzZXJ2ZXIsIHdoaWNoIGZ1bmN0aW9ucyBsaWtlCithIHRyYWZmaWMgZGlyZWN0b3IsIGRpc3BhdGNoaW5nIG1lc3NhZ2VzL2NhbGxzIHRvIHRoZSBwcm9wZXIKK2Rlc3RpbmF0aW9ucy4gIEFsbCBjbGllbnRzIGFyZSBwZWVycyBvZiBlYWNoIG90aGVyLgorCitUd28gdHlwZXMgb2YgYWN0aW9ucyBhcmUgcG9zc2libGUgd2l0aCBEQ09QOiAic2VuZCBhbmQgZm9yZ2V0IgorbWVzc2FnZXMsIHdoaWNoIGRvIG5vdCBibG9jaywgYW5kICJjYWxscywiIHdoaWNoIGJsb2NrIHdhaXRpbmcgZm9yCitzb21lIGRhdGEgdG8gYmUgcmV0dXJuZWQuCisKK0FueSBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IGlzIHNlcmlhbGl6ZWQgKG1hcnNoYWxsZWQsIGZvciB5b3UgQ09SQkEKK3R5cGVzKSB1c2luZyB0aGUgYnVpbHQtaW4gUURhdGFTdHJlYW0gb3BlcmF0b3JzIGF2YWlsYWJsZSBpbiBhbGwgb2YKK3RoZSBRdCBjbGFzc2VzLiAgVGhpcyBpcyBmYXN0IGFuZCBlYXN5LiAgSW4gZmFjdCBpdCdzIHNvIGxpdHRsZSB3b3JrCit0aGF0IHlvdSBjYW4gZWFzaWx5IHdyaXRlIHRoZSBtYXJzaGFsbGluZyBjb2RlIGJ5IGhhbmQuIEluIGFkZGl0aW9uLAordGhlcmUncyBhIHNpbXBsZSBJREwtbGlrZSBjb21waWxlciBhdmFpbGFibGUgKGRjb3BpZGwgYW5kIGRjb3BpZGwyY3BwKQordGhhdCBnZW5lcmF0ZXMgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgeW91LiBVc2luZyB0aGUgZGNvcGlkbCBjb21waWxlcgoraGFzIHRoZSBhZGRpdGlvbmFsIGJlbmVmaXQgb2YgdHlwZSBzYWZldHkuCisKK1RoaXMgSE9XVE8gZGVzY3JpYmVzIHRoZSBtYW51YWwgbWV0aG9kIGZpcnN0IGFuZCBjb3ZlcnMgdGhlIGRjb3BpZGwKK2NvbXBpbGVyIGxhdGVyLgorCitFc3RhYmxpc2hpbmcgdGhlIENvbm5lY3Rpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tBcHBsaWNhdGlvbiBoYXMgZ2FpbmVkIGEgbWV0aG9kIGNhbGxlZCAiS0FwcGxpY2F0aW9uOjpkY29wQ2xpZW50KCkiCit3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0byBhIERDT1BDbGllbnQgaW5zdGFuY2UuICBUaGUgZmlyc3QgdGltZSB0aGlzCittZXRob2QgaXMgY2FsbGVkLCB0aGUgY2xpZW50IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC4gIERDT1BDbGllbnRzIGhhdmUKK3VuaXF1ZSBpZGVudGlmaWVycyBhdHRhY2hlZCB0byB0aGVtIHdoaWNoIGFyZSBiYXNlZCBvbiB3aGF0CitLQXBwbGljYXRpb246Om5hbWUoKSByZXR1cm5zLiAgSW4gZmFjdCwgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZQoraW5zdGFuY2Ugb2YgdGhlIHByb2dyYW0gcnVubmluZywgdGhlIGFwcElkIHdpbGwgYmUgZXF1YWwgdG8KK0tBcHBsaWNhdGlvbjo6bmFtZSgpLgorCitUbyBhY3R1YWxseSBlbmFibGUgRENPUCBjb21tdW5pY2F0aW9uIHRvIGJlZ2luLCB5b3UgbXVzdCB1c2UKK0RDT1BDbGllbnQ6OmF0dGFjaCgpLiAgVGhpcyB3aWxsIGF0dGVtcHQgdG8gYXR0YWNoIHRvIHRoZSBEQ09QIHNlcnZlci4KK0lmIG5vIHNlcnZlciBpcyBmb3VuZCBvciB0aGVyZSBpcyBhbnkgb3RoZXIgdHlwZSBvZiBlcnJvciwgYXR0YWNoKCkKK3dpbGwgcmV0dXJuIGZhbHNlLiBLQXBwbGljYXRpb24gd2lsbCBjYXRjaCBhIGRjb3Agc2lnbmFsIGFuZCBkaXNwbGF5IGFuCithcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIGJveCBpbiB0aGF0IGNhc2UuCisKK0FmdGVyIGNvbm5lY3Rpbmcgd2l0aCB0aGUgc2VydmVyIHZpYSBEQ09QQ2xpZW50OjphdHRhY2goKSwgeW91IG5lZWQgdG8KK3JlZ2lzdGVyIHRoaXMgYXBwSWQgd2l0aCB0aGUgc2VydmVyIHNvIGl0IGtub3dzIGFib3V0IHlvdS4gIE90aGVyd2lzZSwKK3lvdSBhcmUgY29tbXVuaWNhdGluZyBhbm9ueW1vdXNseS4gIFVzZSB0aGUKK0RDT1BDbGllbnQ6OnJlZ2lzdGVyQXMoY29uc3QgUUNTdHJpbmcgJm5hbWUpIHRvIGRvIHNvLiAgSW4gdGhlIHNpbXBsZQorY2FzZToKKworLyoKKyAqIHJldHVybnMgdGhlIGFwcElkIHRoYXQgaXMgYWN0dWFsbHkgcmVnaXN0ZXJlZCwgd2hpY2ggX21heV8gYmUKKyAqIGRpZmZlcmVudCBmcm9tIHdoYXQgeW91IHBhc3NlZAorICovCithcHBJZCA9IGNsaWVudC0+cmVnaXN0ZXJBcyhrQXBwLT5uYW1lKCkpOworCitJZiB5b3UgbmV2ZXIgcmV0cmlldmUgdGhlIERDT1BDbGllbnQgcG9pbnRlciBmcm9tIEtBcHBsaWNhdGlvbiwgdGhlCitvYmplY3Qgd2lsbCBub3QgYmUgY3JlYXRlZCBhbmQgdGh1cyB0aGVyZSB3aWxsIGJlIG5vIG1lbW9yeSBvdmVyaGVhZC4KKworWW91IG1heSBhbHNvIGRldGFjaCBmcm9tIHRoZSBzZXJ2ZXIgYnkgY2FsbGluZyBEQ09QQ2xpZW50OjpkZXRhY2goKS4KK0lmIHlvdSB3aXNoIHRvIGF0dGFjaCBhZ2FpbiB5b3Ugd2lsbCBuZWVkIHRvIHJlLXJlZ2lzdGVyIGFzIHdlbGwuICBJZgoreW91IG9ubHkgd2lzaCB0byBjaGFuZ2UgdGhlIElEIHVuZGVyIHdoaWNoIHlvdSBhcmUgcmVnaXN0ZXJlZCwgc2ltcGx5CitjYWxsIERDT1BDbGllbnQ6OnJlZ2lzdGVyQXMoKSB3aXRoIHRoZSBuZXcgbmFtZS4KKworS1VuaXF1ZUFwcGxpY2F0aW9uIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGl0c2VsZiB0byBEQ09QLiBJZiB5b3UKK2FyZSB1c2luZyBLVW5pcXVlQXBwbGljYXRpb24geW91IHNob3VsZCBub3QgYXR0YWNoIG9yIHJlZ2lzdGVyCit5b3Vyc2VsZiwgdGhpcyBpcyBhbHJlYWR5IGRvbmUuIFRoZSBhcHBJZCBpcyBieSBkZWZpbml0aW9uCitlcXVhbCB0byBrYXBwLT5uYW1lKCkuIFlvdSBjYW4gcmV0cmlldmUgdGhlIHJlZ2lzdGVyZWQgRENPUCBjbGllbnQKK2J5IGNhbGxpbmcga2FwcC0+ZGNvcENsaWVudCgpLgorCitTZW5kaW5nIERhdGEgdG8gYSBSZW1vdGUgQXBwbGljYXRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGFjdHVhbGx5IGNvbW11bmljYXRlLCB5b3UgaGF2ZSBvbmUgb2YgdHdvIGNob2ljZXMuICBZb3UgbWF5IGVpdGhlcgorY2FsbCB0aGUgInNlbmQiIG9yIHRoZSAiY2FsbCIgbWV0aG9kLiAgQm90aCBtZXRob2RzIHJlcXVpcmUgdGhyZWUKK2lkZW50aWZpY2F0aW9uIHBhcmFtZXRlcnM6IGFuIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIsIGEgcmVtb3RlIG9iamVjdCwKK2EgcmVtb3RlIGZ1bmN0aW9uLiBTZW5kaW5nIGlzIGFzeW5jaHJvbm91cyAoaS5lLiBpdCByZXR1cm5zIGltbWVkaWF0ZWx5KQorYW5kIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbiB5b3VyIG93biBhcHBsaWNhdGlvbiBiZWluZyBzZW50IGEgbWVzc2FnZSBhdAorc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBUaGVuICJzZW5kIiByZXF1aXJlcyBvbmUgYW5kICJjYWxsIiByZXF1aXJlcwordHdvIGRhdGEgcGFyYW1ldGVycy4KKworVGhlIHJlbW90ZSBvYmplY3QgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IGhpZXJhcmNoeS4gIFRoYXQgaXMsCitpZiB0aGUgdG9wbGV2ZWwgb2JqZWN0IGlzIGNhbGxlZCAiZm9vT2JqZWN0IiBhbmQgaGFzIHRoZSBjaGlsZAorImJhck9iamVjdCIsIHlvdSB3b3VsZCByZWZlcmVuY2UgdGhpcyBvYmplY3QgYXMgImZvb09iamVjdC9iYXJPYmplY3QiLgorRnVuY3Rpb25zIG11c3QgYmUgZGVzY3JpYmVkIGJ5IGEgZnVsbCBmdW5jdGlvbiBzaWduYXR1cmUuICBJZiB0aGUKK3JlbW90ZSBmdW5jdGlvbiBpcyBjYWxsZWQgImRvSXQiLCBhbmQgaXQgdGFrZXMgYW4gaW50LCBpdCB3b3VsZCBiZQorZGVzY3JpYmVkIGFzICJkb0l0KGludCkiLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgbm90CitzcGVjaWZpZWQgaGVyZSwgYXMgaXQgaXMgbm90IHBhcnQgb2YgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSAob3IgYXQKK2xlYXN0IHRoZSBDKysgdW5kZXJzdGFuZGluZyBvZiBhIGZ1bmN0aW9uIHNpZ25hdHVyZSkuICBZb3Ugd2lsbCBnZXQKK3RoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIGJhY2sgYXMgYW4gZXh0cmEgcGFyYW1ldGVyIHRvCitEQ09QQ2xpZW50OjpjYWxsKCkuICBTZWUgdGhlIHNlY3Rpb24gb24gY2FsbCgpIGZvciBtb3JlIGRldGFpbHMuCisKK0luIG9yZGVyIHRvIGFjdHVhbGx5IGdldCB0aGUgZGF0YSB0byB0aGUgcmVtb3RlIGNsaWVudCwgaXQgbXVzdCBiZQorInNlcmlhbGl6ZWQiIHZpYSBhIFFEYXRhU3RyZWFtIG9wZXJhdGluZyBvbiBhIFFCeXRlQXJyYXkuIFRoaXMgaXMgaG93Cit0aGUgZGF0YSBwYXJhbWV0ZXIgaXMgImJ1aWx0Ii4gQSBmZXcgZXhhbXBsZXMgd2lsbCBtYWtlIGNsZWFyIGhvdyB0aGlzCit3b3Jrcy4KKworU2F5IHlvdSB3YW50IHRvIGNhbGwgImRvSXQiIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIG5vdCBibG9jayAob3Igd2FpdAorZm9yIGEgcmVzcG9uc2UpLiAgWW91IHdpbGwgbm90IHJlY2VpdmUgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcmVtb3RlbHkKK2NhbGxlZCBmdW5jdGlvbiwgYnV0IHlvdSB3aWxsIG5vdCBoYW5nIHdoaWxlIHRoZSBSUEMgaXMgcHJvY2Vzc2VkIGVpdGhlci4KK1RoZSByZXR1cm4gdmFsdWUgb2Ygc2VuZCgpIGluZGljYXRlcyB3aGV0aGVyIERDT1AgY29tbXVuaWNhdGlvbiBzdWNjZWVkZWQKK29yIG5vdC4KKworUUJ5dGVBcnJheSBkYXRhOworUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1dyaXRlT25seSk7CithcmcgPDwgNTsKK2lmICghY2xpZW50LT5zZW5kKCJzb21lQXBwSWQiLCAiZm9vT2JqZWN0L2Jhck9iamVjdCIsICJkb0l0KGludCkiLAorCSAgICAgICAgICBkYXRhKSkKKyAgcURlYnVnKCJ0aGVyZSB3YXMgc29tZSBlcnJvciB1c2luZyBEQ09QLiIpOworCitPSywgbm93IGxldCdzIHNheSB3ZSB3YW50ZWQgdG8gZ2V0IHRoZSBkYXRhIGJhY2sgZnJvbSB0aGUgcmVtb3RlbHkKK2NhbGxlZCBmdW5jdGlvbi4gIFlvdSBoYXZlIHRvIGV4ZWN1dGUgYSBjYWxsKCkgaW5zdGVhZCBvZiBhIHNlbmQoKS4KK1RoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIHRoZW4gYmUgYXZhaWxhYmxlIGluIHRoZSBkYXRhIHBhcmFtZXRlciAicmVwbHkiLgorVGhlIGFjdHVhbCByZXR1cm4gdmFsdWUgb2YgY2FsbCgpIGlzIHN0aWxsIHdoZXRoZXIgb3Igbm90IERDT1AKK2NvbW11bmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisKK1FCeXRlQXJyYXkgZGF0YSwgcmVwbHlEYXRhOworUUNTdHJpbmcgcmVwbHlUeXBlOworUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1dyaXRlT25seSk7CithcmcgPDwgNTsKK2lmICghY2xpZW50LT5jYWxsKCJzb21lQXBwSWQiLCAiZm9vT2JqZWN0L2Jhck9iamVjdCIsICJkb0l0KGludCkiLAorICAgICAgICAgICAgICAgICAgZGF0YSwgcmVwbHlUeXBlLCByZXBseURhdGEpKQorICBxRGVidWcoInRoZXJlIHdhcyBzb21lIGVycm9yIHVzaW5nIERDT1AuIik7CitlbHNlIHsKKyAgUURhdGFTdHJlYW0gcmVwbHkocmVwbHlEYXRhLCBJT19SZWFkT25seSk7CisgIGlmIChyZXBseVR5cGUgPT0gIlFTdHJpbmciKSB7CisgICAgUVN0cmluZyByZXN1bHQ7CisgICAgcmVwbHkgPj4gcmVzdWx0OworICAgIHByaW50KCJ0aGUgcmVzdWx0IGlzOiAlcyIscmVzdWx0LmxhdGluMSgpKTsKKyAgfSBlbHNlCisgICAgcURlYnVnKCJkb0l0IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdHlwZSBvZiByZXBseSEiKTsKK30KKworTi5CLjogWW91IGNhbm5vdCBjYWxsKCkgYSBtZXRob2QgYmVsb25naW5nIHRvIGFuIGFwcGxpY2F0aW9uIHdoaWNoIGhhcworcmVnaXN0ZXJlZCB3aXRoIGFuIHVuaXF1ZSBudW1lcmljIGlkIGFwcGVuZGVkIHRvIGl0cyB0ZXh0dWFsIG5hbWUgKHNlZQorZGNvcGNsaWVudC5oIGZvciBtb3JlIGluZm8pLiBJbiB0aGlzIGNhc2UsIERDT1Agd291bGQgbm90IGtub3cgd2hpY2gKK2FwcGxpY2F0aW9uIGl0IHNob3VsZCBjb25uZWN0IHdpdGggdG8gY2FsbCB0aGUgbWV0aG9kLiBUaGlzIGlzIG5vdCBhbiBpc3N1ZQord2l0aCBzZW5kKCksIGFzIHlvdSBjYW4gYnJvYWRjYXN0IHRvIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQKK3dpdGggYXBwbmFtZS08bnVtZXJpY19pZD4gYnkgdXNpbmcgYSB3aWxkY2FyZCAoZS5nLiAna29uc29sZS0qJyksIHdoaWNoCit3aWxsIHNlbmQgeW91ciBzaWduYWwgdG8gYWxsIGFwcGxpY2F0aW9ucyBjYWxsZWQgJ2tvbnNvbGUnLgorCitSZWNlaXZpbmcgRGF0YSB2aWEgRENPUDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDdXJyZW50bHkgdGhlIG9ubHkgcmVhbCB3YXkgdG8gcmVjZWl2ZSBkYXRhIGZyb20gRENPUCBpcyB0byBtdWx0aXBseQoraW5oZXJpdCBmcm9tIHRoZSBub3JtYWwgY2xhc3MgdGhhdCB5b3UgYXJlIGluaGVyaXRpbmcgKHVzdWFsbHkgc29tZQorc29ydCBvZiBRV2lkZ2V0IHN1YmNsYXNzIG9yIFFPYmplY3QpIGFzIHdlbGwgYXMgdGhlIERDT1BPYmplY3QgY2xhc3MuCitEQ09QT2JqZWN0IHByb3ZpZGVzIG9uZSB2ZXJ5IGltcG9ydGFudCBtZXRob2Q6IERDT1BPYmplY3Q6OnByb2Nlc3MoKS4KK1RoaXMgaXMgYSBwdXJlIHZpcnR1YWwgbWV0aG9kIHRoYXQgeW91IG11c3QgaW1wbGVtZW50IGluIG9yZGVyIHRvCitwcm9jZXNzIERDT1AgbWVzc2FnZXMgdGhhdCB5b3UgcmVjZWl2ZS4gIEl0IHRha2VzIGEgZnVuY3Rpb24KK3NpZ25hdHVyZSwgUUJ5dGVBcnJheSBvZiBwYXJhbWV0ZXJzLCBhbmQgYSByZWZlcmVuY2UgdG8gYSBRQnl0ZUFycmF5Citmb3IgdGhlIHJlcGx5IGRhdGEgdGhhdCB5b3UgbXVzdCBmaWxsIGluLgorCitUaGluayBvZiBEQ09QT2JqZWN0Ojpwcm9jZXNzKCkgYXMgYSBzb3J0IG9mIGRpc3BhdGNoIGFnZW50LiAgSW4gdGhlCitmdXR1cmUsIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgYSBwcmVjb21waWxlciBmb3IgeW91ciBzb3VyY2VzIHRvIHdyaXRlCit0aGlzIG1ldGhvZCBmb3IgeW91LiAgSG93ZXZlciwgdW50aWwgdGhhdCBwb2ludCB5b3UgbmVlZCB0byBleGFtaW5lCit0aGUgaW5jb21pbmcgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCB0YWtlIGFjdGlvbiBhY2NvcmRpbmdseS4gIEhlcmUgaXMKK2FuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24uCisKK2Jvb2wgQmFyT2JqZWN0Ojpwcm9jZXNzKGNvbnN0IFFDU3RyaW5nICZmdW4sIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsCisJCSAgICAgICAgUUNTdHJpbmcgJnJlcGx5VHlwZSwgUUJ5dGVBcnJheSAmcmVwbHlEYXRhKQoreworICBpZiAoZnVuID09ICJkb0l0KGludCkiKSB7CisgICAgUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1JlYWRPbmx5KTsKKyAgICBpbnQgaTsgLy8gcGFyYW1ldGVyCisgICAgYXJnID4+IGk7CisgICAgUVN0cmluZyByZXN1bHQgPSBzZWxmLT5kb0l0IChpKTsKKyAgICBRRGF0YVN0cmVhbSByZXBseShyZXBseURhdGEsIElPX1dyaXRlT25seSk7CisgICAgcmVwbHkgPDwgcmVzdWx0OworICAgIHJlcGx5VHlwZSA9ICJRU3RyaW5nIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBxRGVidWcoInVua25vd24gZnVuY3Rpb24gY2FsbCB0byBCYXJPYmplY3Q6OnByb2Nlc3MoKSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitSZWNlaXZpbmcgQ2FsbHMgYW5kIHByb2Nlc3NpbmcgdGhlbToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3VyIGFwcGxpY2F0aW9ucyBpcyBhYmxlIHRvIHByb2Nlc3MgaW5jb21pbmcgZnVuY3Rpb24gY2FsbHMKK3JpZ2h0IGF3YXkgdGhlIGFib3ZlIGNvZGUgaXMgYWxsIHlvdSBuZWVkLiBXaGVuIHlvdXIgYXBwbGljYXRpb24KK25lZWRzIHRvIGRvIG1vcmUgY29tcGxleCB0YXNrcyB5b3UgbWlnaHQgd2FudCB0byBkbyB0aGUgcHJvY2Vzc2luZworb3V0IG9mICdwcm9jZXNzJyBmdW5jdGlvbiBjYWxsIGFuZCBzZW5kIHRoZSByZXN1bHQgYmFjayBsYXRlciB3aGVuCitpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKworRm9yIHRoaXMgeW91IGNhbiBhc2sgeW91ciBEQ09QQ2xpZW50IGZvciBhIHRyYW5zYWN0aW9uSWQuIFlvdSBjYW4KK3RoZW4gcmV0dXJuIGZyb20gdGhlICdwcm9jZXNzJyBmdW5jdGlvbiBhbmQgd2hlbiB0aGUgcmVzdWx0IGlzCithdmFpbGFibGUgZmluaXNoIHRoZSB0cmFuc2FjdGlvbi4gSW4gdGhlIG1lYW4gdGltZSB5b3VyIGFwcGxpY2F0aW9uCitjYW4gcmVjZWl2ZSBpbmNvbWluZyBEQ09QIGZ1bmN0aW9uIGNhbGxzIGZyb20gb3RoZXIgY2xpZW50cy4KKworU3VjaCBjb2RlIGNvdWxkIGxpa2UgdGhpczoKKworYm9vbCBCYXJPYmplY3Q6OnByb2Nlc3MoY29uc3QgUUNTdHJpbmcgJmZ1biwgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwKKwkJICAgICAgICBRQ1N0cmluZyAmLCBRQnl0ZUFycmF5ICYpCit7CisgIGlmIChmdW4gPT0gImRvSXQoaW50KSIpIHsKKyAgICBRRGF0YVN0cmVhbSBhcmcoZGF0YSwgSU9fUmVhZE9ubHkpOworICAgIGludCBpOyAvLyBwYXJhbWV0ZXIKKyAgICBhcmcgPj4gaTsKKyAgICBRU3RyaW5nIHJlc3VsdCA9IHNlbGYtPmRvSXQoaSk7CisKKyAgICBEQ09QQ2xpZW50VHJhbnNhY3Rpb24gKm15VHJhbnNhY3Rpb247CisgICAgbXlUcmFuc2FjdGlvbiA9IGthcHAtPmRjb3BDbGllbnQoKS0+YmVnaW5UcmFuc2FjdGlvbigpOworCisgICAgLy8gc3RhcnQgcHJvY2Vzc2luZy4uLgorICAgIC8vIENhbGxzIHNsb3RQcm9jZXNzaW5nRG9uZSB3aGVuIGZpbmlzaGVkLgorICAgIHN0YXJ0UHJvY2Vzc2luZyggbXlUcmFuc2FjdGlvbiwgaSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBxRGVidWcoInVua25vd24gZnVuY3Rpb24gY2FsbCB0byBCYXJPYmplY3Q6OnByb2Nlc3MoKSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzbG90UHJvY2Vzc2luZ0RvbmUoRENPUENsaWVudFRyYW5zYWN0aW9uICpteVRyYW5zYWN0aW9uLCBjb25zdCBRU3RyaW5nICZyZXN1bHQpCit7CisgICAgUUNTdHJpbmcgcmVwbHlUeXBlID0gIlFTdHJpbmciOworICAgIFFCeXRlQXJyYXkgcmVwbHlEYXRhOworICAgIFFEYXRhU3RyZWFtIHJlcGx5KHJlcGx5RGF0YSwgSU9fV3JpdGVPbmx5KTsKKyAgICByZXBseSA8PCByZXN1bHQ7CisgICAga2FwcC0+ZGNvcENsaWVudCgpLT5lbmRUcmFuc2FjdGlvbiggbXlUcmFuc2FjdGlvbiwgcmVwbHlUeXBlLCByZXBseURhdGEgKTsKK30KKworRENPUCBTaWduYWxzCistLS0tLS0tLS0tLS0KKworU29tZXRpbWVzIGEgY29tcG9uZW50IHdhbnRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB2aWEgRENPUCB0byBvdGhlcgorY29tcG9uZW50cyBidXQgZG9lcyBub3Qga25vdyB3aGljaCBjb21wb25lbnRzIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiB0aGVzZQorbm90aWZpY2F0aW9ucy4gT25lIGNvdWxkIHVzZSBhIGJyb2FkY2FzdCBpbiBzdWNoIGEgY2FzZSBidXQgdGhpcyBpcyBhIHZlcnkKK2NydWRlIG1ldGhvZC4gRm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1ldGhvZCBEQ09QIHNpZ25hbHMgaGF2ZSBiZWVuIGludmVudGVkLgorCitEQ09QIHNpZ25hbHMgYXJlIHZlcnkgc2ltaWxhaXIgdG8gUXQgc2lnbmFscywgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMgCit0aG91Z2guIEEgRENPUCBzaWduYWwgY2FuIGJlIGNvbm5lY3RlZCB0byBhIERDT1AgZnVuY3Rpb24uIFdoZW5ldmVyIHRoZSBEQ09QCitzaWduYWwgZ2V0cyBlbWl0dGVkLCB0aGUgRENPUCBmdW5jdGlvbnMgdG8gd2hpY2ggdGhlIHNpZ25hbCBpcyBjb25uZWN0ZWQgYXJlCitiZWluZyBjYWxsZWQuIERDT1Agc2lnbmFscyBhcmUsIGp1c3QgbGlrZSBRdCBzaWduYWxzLCBvbmUgd2F5LiBUaGV5IGRvIG5vdAorcHJvdmlkZSBhIHJldHVybiB2YWx1ZS4gCisKK0EgRENPUCBzaWduYWwgb3JpZ2luYXRlcyBmcm9tIGEgRENPUCBPYmplY3QvRENPUCBDbGllbnQgY29tYmluYXRpb24gKHNlbmRlcikuIAorSXQgY2FuIGJlIGNvbm5lY3RlZCB0byBhIGZ1bmN0aW9uIG9mIGFub3RoZXIgRENPUCBPYmplY3QvRENPUCBDbGllbnQgCitjb21iaW5hdGlvbiAocmVjZWl2ZXIpLgorCitUaGVyZSBhcmUgdHdvIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gY29ubmVjdGlvbnMgb2YgUXQgc2lnbmFscyBhbmQgCitjb25uZWN0aW9ucyBvZiBEQ09QIHNpZ25hbHMuIEluIERDT1AsIHVubGlrZSBRdCwgYSBzaWduYWwgY29ubmVjdGlvbnMgY2FuCitoYXZlIGFuIGFub255bW91cyBzZW5kZXIgYW5kLCB1bmxpa2UgUXQsIGEgRENPUCBzaWduYWwgY29ubmVjdGlvbiBjYW4gYmUKK25vbi12b2xhdGlsZS4KKworV2l0aCBEQ09QIG9uZSBjYW4gY29ubmVjdCBhIHNpZ25hbCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIHNlbmRpbmcgRENPUCBPYmplY3QgCitvciBEQ09QIENsaWVudC4gSW4gdGhhdCBjYXNlIHNpZ25hbHMgZnJvbSBhbnkgRENPUCBPYmplY3QgYW5kL29yIERDT1AgQ2xpZW50Cit3aWxsIGJlIGRlbGl2ZXJlZC4gVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgY2VydGFpbiBldmVudHMgd2l0aG91dAordHlpbmcgb25lc2VsZiB0byBhIGNlcnRhaW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50ZXMgdGhlIGV2ZW50cy4KKworQW5vdGhlciBEQ09QIGZlYXR1cmUgYXJlIHNvIGNhbGxlZCBub24tdm9sYXRpbGUgY29ubmVjdGlvbnMuIFdpdGggUXQgc2lnbmFsCitjb25uZWN0aW9ucywgdGhlIGNvbm5lY3Rpb24gZ2V0cyBkZWxldGVkIHdoZW4gZWl0aGVyIHNlbmRlciBvciByZWNlaXZlciBvZgordGhlIHNpZ25hbCBnZXRzIGRlbGV0ZWQuIEEgdm9sYXRpbGUgRENPUCBzaWduYWwgY29ubmVjdGlvbiB3aWxsIGJlaGF2ZSB0aGUKK3NhbWUuIEhvd2V2ZXIsIGEgbm9uLXZvbGF0aWxlIERDT1Agc2lnbmFsIGNvbm5lY3Rpb24gd2lsbCBub3QgZ2V0IGRlbGV0ZWQgCit3aGVuIHRoZSBzZW5kaW5nIG9iamVjdCBnZXRzIGRlbGV0ZWQuIE9uY2UgYSBuZXcgb2JqZWN0IGdldHMgY3JlYXRlZCB3aXRoIAordGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWwgc2VuZGluZyBvYmplY3QsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVzdG9yZWQuCitUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB3aGVuIHRoZSByZWNlaXZpbmcgb2JqZWN0IGdldHMgZGVsZXRlZCwKK2luIHRoYXQgY2FzZSB0aGUgc2lnbmFsIGNvbm5lY3Rpb24gd2lsbCBhbHdheXMgYmUgZGVsZXRlZC4KKworQSByZWNlaXZlciBjYW4gY3JlYXRlIGEgbm9uLXZvbGF0aWxlIGNvbm5lY3Rpb24gd2hpbGUgdGhlIHNlbmRlciBkb2Vzbid0ICh5ZXQpCitleGlzdC4gQW4gYW5vbnltb3VzIERDT1AgY29ubmVjdGlvbiBzaG91bGQgYWx3YXlzIGJlIG5vbi12b2xhdGlsZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBLTGF1bmNoZXIgZW1pdHMgYSBzaWduYWwgd2hlbmV2ZXIgaXQgbm90aWNlcwordGhhdCBhbiBhcHBsaWNhdGlvbiB0aGF0IHdhcyBzdGFydGVkIHZpYSBLTGF1bmNoZXIgdGVybWluYXRlcy4KKworICAgUUJ5dGVBcnJheSBwYXJhbXM7CisgICBRRGF0YVN0cmVhbSBzdHJlYW0ocGFyYW1zLCBJT19Xcml0ZU9ubHkpOworICAgc3RyZWFtIDw8IHBpZDsKKyAgIGthcHAtPmRjb3BDbGllbnQoKS0+ZW1pdERDT1BTaWduYWwoImNsaWVudERpZWQocGlkX3QpIiwgcGFyYW1zKTsKKworVGhlIHRhc2sgbWFuYWdlciBvZiB0aGUgS0RFIHBhbmVsIGNvbm5lY3RzIHRvIHRoaXMgc2lnbmFsLiBJdCB1c2VzIGFuIAorYW5vbnltb3VzIGNvbm5lY3Rpb24gKGl0IGRvZXNuJ3QgcmVxdWlyZSB0aGF0IHRoZSBzaWduYWwgaXMgYmVpbmcgZW1pdHRlZAorYnkgS0xhdW5jaGVyKSB0aGF0IGlzIG5vbi12b2xhdGlsZToKKworICAgY29ubmVjdERDT1BTaWduYWwoMCwgMCwgImNsaWVudERpZWQocGlkX3QpIiwgImNsaWVudERpZWQocGlkX3QpIiwgZmFsc2UpOworCitJdCBjb25uZWN0cyB0aGUgY2xpZW50RGllZChwaWRfdCkgc2lnbmFsIHRvIGl0cyBvd24gY2xpZW50RGllZChwaWRfdCkgRENPUAorZnVuY3Rpb24uIEluIHRoaXMgY2FzZSB0aGUgc2lnbmFsIGFuZCB0aGUgZnVuY3Rpb24gdG8gY2FsbCBoYXZlIHRoZSBzYW1lIG5hbWUuCitUaGlzIGlzbid0IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBhcmd1bWVudHMgb2YgYm90aCBzaWduYWwgYW5kIHJlY2VpdmluZyBmdW5jdGlvbgorbWF0Y2guIFRoZSByZWNlaXZpbmcgZnVuY3Rpb24gbWF5IGlnbm9yZSBvbmUgb3IgbW9yZSBvZiB0aGUgdHJhaWxpbmcgYXJndW1lbnRzCitvZiB0aGUgc2lnbmFsLiBFLmcuIGl0IGlzIGFsbG93ZWQgdG8gY29ubmVjdCB0aGUgY2xpZW50RGllZChwaWRfdCkgc2lnbmFsIHRvCithIGNsaWVudERpZWQodm9pZCkgRENPUCBmdW5jdGlvbi4KKworVXNpbmcgdGhlIGRjb3BpZGwgY29tcGlsZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkY29waWRsIG1ha2VzIHNldHRpbmcgdXAgYSBEQ09QIHNlcnZlciBlYXN5LiBJbnN0ZWFkIG9mIGhhdmluZyB0byBpbXBsZW1lbnQKK3RoZSBwcm9jZXNzKCkgbWV0aG9kIGFuZCB1bm1hcnNoYWxsaW5nIChyZXRyaWV2aW5nIGZyb20gUUJ5dGVBcnJheSkgcGFyYW1ldGVycworbWFudWFsbHksIHlvdSBjYW4gbGV0IGRjb3BpZGwgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29kZSBvbiB5b3VyIGJlaGFsZi4KKworVGhpcyBhbHNvIGFsbG93cyB5b3UgdG8gZGVzY3JpYmUgdGhlIGludGVyZmFjZSBmb3IgeW91ciBjbGFzcyBpbiBhCitzaW5nbGUsIHNlcGFyYXRlIGhlYWRlciBmaWxlLgorCitXcml0aW5nIGFuIElETCBmaWxlIGlzIHZlcnkgc2ltaWxhciB0byB3cml0aW5nIGEgbm9ybWFsIEMrKyBoZWFkZXIuIEFuCitleGNlcHRpb24gaXMgdGhlIGtleXdvcmQgJ0FTWU5DJy4gSXQgaW5kaWNhdGVzIHRoYXQgYSBjYWxsIHRvIHRoaXMKK2Z1bmN0aW9uIHNoYWxsIGJlIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4gRm9yIHRoZSBDKysgY29tcGlsZXIsIGl0CitleHBhbmRzIHRvICd2b2lkJy4KKworRXhhbXBsZToKKworI2lmbmRlZiBNWV9JTlRFUkZBQ0VfSAorI2RlZmluZSBNWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8ZGNvcG9iamVjdC5oPgorCitjbGFzcyBNeUludGVyZmFjZSA6IHZpcnR1YWwgcHVibGljIERDT1BPYmplY3QKK3sKKyAgS19EQ09QCisKKyAga19kY29wOgorCisgICAgdmlydHVhbCBBU1lOQyBteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpID0gMDsKKyAgICB2aXJ0dWFsIFFSZWN0IG15U3luY2hyb25vdXNNZXRob2QoKSA9IDA7Cit9OworCisjZW5kaWYKKworQXMgeW91IGNhbiBzZWUsIHlvdSdyZSBlc3NlbnRpYWxseSBkZWNsYXJpbmcgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcywgd2hpY2gKK3ZpcnR1YWxseSBpbmhlcml0cyBmcm9tIERDT1BPYmplY3QuCisKK0lmIHlvdSdyZSB1c2luZyB0aGUgc3RhbmRhcmQgS0RFIGJ1aWxkIHNjcmlwdHMsIHRoZW4geW91IGNhbiBzaW1wbHkKK2FkZCB0aGlzIGZpbGUgKHdoaWNoIHlvdSB3b3VsZCBjYWxsIE15SW50ZXJmYWNlLmgpIHRvIHlvdXIgc291cmNlcworZGlyZWN0b3J5LiBUaGVuIHlvdSBlZGl0IHlvdXIgTWFrZWZpbGUuYW0sIGFkZGluZyAnTXlJbnRlcmZhY2Uuc2tlbCcKK3RvIHlvdXIgU09VUkNFUyBsaXN0IGFuZCBNeUludGVyZmFjZS5oIHRvIGluY2x1ZGVfSEVBREVSUy4KKworVGhlIGJ1aWxkIHNjcmlwdHMgd2lsbCB1c2UgZGNvcGlkbCB0byBwYXJzZSBNeUludGVyZmFjZS5oLCBjb252ZXJ0aW5nCitpdCB0byBhbiBYTUwgZGVzY3JpcHRpb24gaW4gTXlJbnRlcmZhY2Uua2lkbC4gTmV4dCwgYSBmaWxlIGNhbGxlZAorTXlJbnRlcmZhY2Vfc2tlbC5jcHAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQsIGNvbXBpbGVkIGFuZAorbGlua2VkIHdpdGggeW91ciBiaW5hcnkuCisKK1RoZSBuZXh0IHRoaW5nIHlvdSBoYXZlIHRvIGRvIGlzIHRvIGNob29zZSB3aGljaCBvZiB5b3VyIGNsYXNzZXMgd2lsbAoraW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIE15SW50ZXJmYWNlLmguIEFsdGVyIHRoZSBpbmhlcml0YW5jZQorb2YgdGhpcyBjbGFzcyBzdWNoIHRoYXQgaXQgdmlydHVhbGx5IGluaGVyaXRzIGZyb20gTXlJbnRlcmZhY2UuIFRoZW4KK2FkZCBkZWNsYXJhdGlvbnMgdG8geW91ciBjbGFzcyBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aG9zZSBvbiBNeUludGVyZmFjZS5oLAorYnV0IHZpcnR1YWwsIG5vdCBwdXJlIHZpcnR1YWwuCisKK0V4YW1wbGU6CisKK2NsYXNzIE15Q2xhc3M6IHB1YmxpYyBRT2JqZWN0LCB2aXJ0dWFsIHB1YmxpYyBNeUludGVyZmFjZQoreworICBRX09CSkVDVAorICAKKyAgcHVibGljOgorICAgIE15Q2xhc3MoKTsgCisgICAgfk15Q2xhc3MoKTsKKworICAgIEFTWU5DIG15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcik7CisgICAgUVJlY3QgbXlTeW5jaHJvbm91c01ldGhvZCgpOworfTsKKworTm90ZTogKFF0IGlzc3VlKSBSZW1lbWJlciB0aGF0IGlmIHlvdSBhcmUgaW5oZXJpdGluZyBmcm9tIFFPYmplY3QsIHlvdSBtdXN0CitwbGFjZSBpdCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgY2xhc3Nlcy4KKworSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgY2xhc3MnIGN0b3IsIHlvdSBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZQordGhvc2UgY2xhc3NlcyBmcm9tIHdoaWNoIHlvdSBhcmUgaW5oZXJpdGluZyBmcm9tLiBUaGlzIGlzLCBvZiBjb3Vyc2UsIGdvb2QKK3ByYWN0aXNlLCBidXQgaXQgaXMgZXNzZW50aWFsIGhlcmUgYXMgeW91IG5lZWQgdG8gdGVsbCBEQ09QT2JqZWN0IHRoZSBuYW1lIG9mCit0aGUgaW50ZXJmYWNlIHdoaWNoIHlvdXIgYXJlIGltcGxlbWVudGluZy4KKworRXhhbXBsZToKKworTXlDbGFzczo6TXlDbGFzcygpCisgIDogUU9iamVjdCgpLAorICAgIERDT1BPYmplY3QoIk15SW50ZXJmYWNlIikKK3sKKyAgLy8gd2hhdGV2ZXIuLi4KK30KKworTm93IHlvdSBjYW4gc2ltcGx5IGltcGxlbWVudCB0aGUgbWV0aG9kcyB5b3UgaGF2ZSBkZWNsYXJlZCBpbiB5b3VyIGludGVyZmFjZSwKK2V4YWN0bHkgdGhlIHNhbWUgYXMgeW91IHdvdWxkIG5vcm1hbGx5LgorCitFeGFtcGxlOgorCit2b2lkIE15Q2xhc3M6Om15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcikKK3sKKyAgcURlYnVnKCJteUFzeW5jTWV0aG9kIGNhbGxlZCB3aXRoIHBhcmFtIGAiICsgc29tZVBhcmFtZXRlciArICInIik7Cit9CisKKworSXQgaXMgbm90IG5lY2Vzc2FyeSAodGhvdWdoIHZlcnkgY2xlYW4pIHRvIGRlZmluZSBhbiBpbnRlcmZhY2UgYXMgYW4KK2Fic3RyYWN0IGNsYXNzIG9mIGl0cyBvd24sIGxpa2Ugd2UgZGlkIGluIHRoZSBleGFtcGxlIGFib3ZlLiBXZSBjb3VsZAoranVzdCBhcyB3ZWxsIGhhdmUgZGVmaW5lZCBhIGtfZGNvcCBzZWN0aW9uIGRpcmVjdGx5IHdpdGhpbiBNeUNsYXNzOgorCitjbGFzcyBNeUNsYXNzOiBwdWJsaWMgUU9iamVjdCwgdmlydHVhbCBwdWJsaWMgRENPUE9iamVjdAoreworICBRX09CSkVDVAorICBLX0RDT1AKKworICBwdWJsaWM6CisgICAgTXlDbGFzcygpOyAKKyAgICB+TXlDbGFzcygpOworCisgIGtfZGNvcDoKKyAgICBBU1lOQyBteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpOworICAgIFFSZWN0IG15U3luY2hyb25vdXNNZXRob2QoKTsKK307CisKK0luIGFkZGl0aW9uIHRvIHNrZWxldG9ucywgZGNvcGlkbDJjcHAgYWxzbyBnZW5lcmF0ZSBzdHVicy4gVGhvc2UgbWFrZQoraXQgZWFzeSB0byBjYWxsIGEgRENPUCBpbnRlcmZhY2Ugd2l0aG91dCBkb2luZyB0aGUgbWFyc2hhbGxpbmcKK21hbnVhbGx5LiBUbyB1c2UgYSBzdHViLCBhZGQgTXlJbnRlcmZhY2Uuc3R1YiB0byB0aGUgU09VUkNFUyBsaXN0IG9mCit5b3VyIE1ha2VmaWxlLmFtLiBUaGUgc3R1YiBjbGFzcyB3aWxsIHRoZW4gYmUgY2FsbGVkIE15SW50ZXJmYWNlX3N0dWIuCisKK0NvbmNsdXNpb246CistLS0tLS0tLS0tLQorCitIb3BlZnVsbHkgdGhpcyBkb2N1bWVudCB3aWxsIGdldCB5b3Ugd2VsbCBvbiB5b3VyIHdheSBpbnRvIHRoZSB3b3JsZAorb2YgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggS0RFISAgUGxlYXNlIGRpcmVjdCBhbGwgY29tbWVudHMKK2FuZC9vciBzdWdnZXN0aW9ucyB0byBQcmVzdG9uIEJyb3duIDxwYnJvd25Aa2RlLm9yZz4gYW5kIE1hdHRoaWFzCitFdHRyaWNoIDxldHRyaWNoQGtkZS5vcmc+LgorCisKK0ludGVyLXVzZXIgY29tbXVuaWNhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byB1c2UgRENPUCBiZXR3ZWVuIHByb2Nlc3NlcworYmVsb25naW5nIHRvIGRpZmZlcmVudCB1c2VycywgZS5nLiBhIGZyb250ZW5kIHByb2Nlc3MgcnVubmluZword2l0aCB0aGUgdXNlcidzIGlkLCBhbmQgYSBiYWNrZW5kIHByb2Nlc3MgcnVubmluZyBhcyByb290LgorCitUbyBkbyB0aGlzLCB0d28gc3RlcHMgaGF2ZSB0byBiZSB0YWtlbjoKKworYSkgYm90aCBwcm9jZXNzZXMgbmVlZCB0byB0YWxrIHRvIHRoZSBzYW1lIERDT1Agc2VydmVyCitiKSB0aGUgYXV0aGVudGljYXRpb24gbXVzdCBiZSBlbnN1cmVkCisKK0ZvciB0aGUgZmlyc3Qgc3RlcCwgeW91IHNpbXBseSBwYXNzIHRoZSBzZXJ2ZXIgYWRkcmVzcyAoYXMKK2ZvdW5kIGluIC5EQ09Qc2VydmVyKSB0byB0aGUgc2Vjb25kIHByb2Nlc3MuIEZvciB0aGUgYXV0aGVudGljYXRpb24sCit5b3UgY2FuIHVzZSB0aGUgSUNFQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlbGwgdGhlCitzZWNvbmQgcHJvY2VzcyB3aGVyZSB0byBmaW5kIHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4KKyhOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHNlY29uZCBwcm9jZXNzIGlzIGFibGUgdG8KK3JlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIGZpbGUsIHNvIGl0IHdpbGwgcHJvYmFibHkgb25seSB3b3JrCitpZiB0aGUgc2Vjb25kIHByb2Nlc3MgcnVucyBhcyByb290LiBJZiBpdCBzaG91bGQgcnVuIGFzIGFub3RoZXIKK3VzZXIsIGEgc2ltaWxhciBhcHByb2FjaCB0byB3aGF0IGtkZXN1IGRvZXMgd2l0aCB4YXV0aCBtdXN0CitiZSB0YWtlbi4gSW4gZmFjdCwgaXQgd291bGQgYmUgYSB2ZXJ5IGdvb2QgaWRlYSB0byBhZGQgRENPUAorc3VwcG9ydCB0byBrZGVzdSEpCisKK0ZvciBleGFtcGxlCisKK0lDRUFVVEhPUklUWT1+dXNlci8uSUNFYXV0aG9yaXR5IGtkZXN1IHJvb3QgLWMga2Ntcm9vdCAtZGNvcHNlcnZlciBgY2F0IH51c2VyLy5EQ09Qc2VydmVyYAorCit3aWxsLCBhZnRlciBrZGVzdSBnb3QgdGhlIHJvb3QgcGFzc3dvcmQsIGV4ZWN1dGUga2Ntcm9vdCBhcyByb290LCB0YWxraW5nCit0byB0aGUgdXNlcidzIGRjb3Agc2VydmVyLgorCisKK05PVEU6IERDT1AgY29tbXVuaWNhdGlvbiBpcyBub3QgZW5jcnlwdGVkLCBzbyBwbGVhc2UgZG8gbm90CitwYXNzIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhcm91bmQgdGhpcyB3YXkuCisKKworUGVyZm9ybWFuY2UgVGVzdHM6CistLS0tLS0tLS0tLS0tLS0tLS0KK0EgZmV3IGJhY2stb2YtdGhlLW5hcGtpbiB0ZXN0cyBmb2xrczoKKworQ29kZToKKworI2luY2x1ZGUgPGthcHBsaWNhdGlvbi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEtBcHBsaWNhdGlvbiAqYXBwOworCisgIGFwcCA9IG5ldyBLQXBwbGljYXRpb24oYXJnYywgYXJndiwgInRlc3RpdCIpOworICByZXR1cm4gYXBwLT5leGVjKCk7Cit9CisKK0NvbXBpbGVkIHdpdGg6CisKK2crKyAtTzIgLW8gdGVzdGl0IHRlc3RpdC5jcHAgLUkkUVRESVIvaW5jbHVkZSAtTCRRVERJUi9saWIgLWxrZGVjb3JlCisKK29uIExpbnV4IHlpZWxkcyB0aGUgZm9sbG93aW5nIG1lbW9yeSB1c2Ugc3RhdGlzdGljczoKKworVm1TaXplOiAgICAgODA3NiBrQgorVm1MY2s6ICAgICAgICAgMCBrQgorVm1SU1M6ICAgICAgNDUzMiBrQgorVm1EYXRhOiAgICAgIDIwOCBrQgorVm1TdGs6ICAgICAgICAyMCBrQgorVm1FeGU6ICAgICAgICAgNCBrQgorVm1MaWI6ICAgICAgNjU4OCBrQgorCitJZiBJIGNyZWF0ZSB0aGUgS0FwcGxpY2F0aW9uJ3MgRENPUENsaWVudCwgYW5kIGNhbGwgYXR0YWNoKCkgYW5kCityZWdpc3RlckFzKCksIGl0IGNoYW5nZXMgdG8gdGhpczoKKworVm1TaXplOiAgICAgODA4MCBrQgorVm1MY2s6ICAgICAgICAgMCBrQgorVm1SU1M6ICAgICAgNDYyNCBrQgorVm1EYXRhOiAgICAgIDIwOCBrQgorVm1TdGs6ICAgICAgICAyMCBrQgorVm1FeGU6ICAgICAgICAgNCBrQgorVm1MaWI6ICAgICAgNjU4OCBrQgorCitCYXNpY2FsbHkgaXQgYXBwZWFycyB0aGF0IHVzaW5nIERDT1AgY2F1c2VzIDEwMGsgbW9yZSBtZW1vcnkgdG8gYmUKK3Jlc2lkZW50LCBidXQgbm8gbW9yZSBkYXRhIG9yIHN0YWNrLiAgU28gdGhpcyB3aWxsIGJlIHNoYXJlZCBiZXR3ZWVuIGFsbAorcHJvY2Vzc2VzLCByaWdodD8gIDEwMGsgdG8gZW5hYmxlIERDT1AgaW4gYWxsIGFwcHMgZG9lc24ndCBzZWVtIGJhZCBhdAorYWxsLiA6KQorCitPSyBub3cgZm9yIHNvbWUgdGltaW5ncy4gIEp1c3QgY3JlYXRpbmcgYSBLQXBwbGljYXRpb24gYW5kIHRoZW4gZXhpdGluZworKGkuZS4gcmVtb3ZpbmcgdGhlIGNhbGwgdG8gS0FwcGxpY2F0aW9uOjpleGVjKSB0YWtlcyB0aGlzIG11Y2ggdGltZToKKworMC4yOHVzZXIgMC4wMnN5c3RlbSAwOjAwLjMyZWxhcHNlZCA5MiVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCiswaW5wdXRzKzBvdXRwdXRzICgxMDg0bWFqb3IrNjJtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworCitJLmUuIGFib3V0IDEvMyBvZiBhIHNlY29uZCBvbiBteSBQSUktMjMzLiAgTm93LCBpZiB3ZSBjcmVhdGUgb3VyIERDT1AKK29iamVjdCBhbmQgYXR0YWNoIHRvIHRoZSBzZXJ2ZXIsIGl0IHRha2VzIHRoaXMgbG9uZzoKKworMC4yN3VzZXIgMC4wM3N5c3RlbSAwOjAwLjM0ZWxhcHNlZCA4NyVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCiswaW5wdXRzKzBvdXRwdXRzICgxMTA3bWFqb3IrNjVtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworCitJLmUuIGFib3V0IDEvMyBvZiBhIHNlY29uZC4gIEJhc2ljYWxseSBEQ09QQ2xpZW50IGNyZWF0aW9uIGFuZCBhdHRhY2hpbmcKK2dldHMgbG9zdCBpbiB0aGUgc3RhdGlzdGljYWwgdmFyaWF0aW9uICgibm9pc2UiKS4gIEkgd2FzIGdldHRpbmcgdGltZXMKK2JldHdlZW4gLjMyIGFuZCAuNDggb3ZlciBzZXZlcmFsIHJ1bnMgZm9yIGJvdGggb2YgdGhlIGV4YW1wbGUgcHJvZ3JhbXMsIHNvCitvYnZpb3VzbHkgc3lzdGVtIGxvYWQgaXMgbW9yZSByZWxldmFudCB0aGFuIHRoZSBleHRyYSB0d28gY2FsbHMgdG8KK0RDT1BDbGllbnQ6OmF0dGFjaCBhbmQgRENPUENsaWVudDo6cmVnaXN0ZXJBcywgYXMgd2VsbCBhcyB0aGUgYWN0dWFsCitEQ09QQ2xpZW50IGNvbnN0cnVjdG9yIHRpbWUuCisKZGlmZiAtLWdpdCBhL2RvYy9kaWFncmFtLnBuZyBiL2RvYy9kaWFncmFtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I4NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RpYWdyYW0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kaWFncmFtLnN2ZyBiL2RvYy9kaWFncmFtLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNjNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RpYWdyYW0uc3ZnCkBAIC0wLDAgKzEsNTkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+Cis8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KKzxzdmcKKyAgIGlkPSJzdmcxIgorICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuMzkiCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKKyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKyAgIHdpZHRoPSI4NDEuODg5NzVwdCIKKyAgIGhlaWdodD0iNTk1LjI3NTU5cHQiCisgICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9ocC9kYnVzLWN2cy9kYnVzL2RvYyIKKyAgIHNvZGlwb2RpOmRvY25hbWU9ImRpYWdyYW0uc3ZnIj4KKyAgPGRlZnMKKyAgICAgaWQ9ImRlZnMzIj4KKyAgICA8bWFya2VyCisgICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGU7IgorICAgICAgIGlkPSJBcnJvdzFNIgorICAgICAgIHJlZlg9IjAuMCIKKyAgICAgICByZWZZPSIwLjAiCisgICAgICAgb3JpZW50PSJhdXRvIgorICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IkFycm93MU0iPgorICAgICAgPHBhdGgKKyAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC40KSIKKyAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wcHQ7bWFya2VyLXN0YXJ0Om5vbmU7IgorICAgICAgICAgZD0iTSAwLjAsMC4wIEwgNS4wLC01LjAgTCAtMTIuNSwwLjAgTCA1LjAsNS4wIEwgMC4wLDAuMCB6ICIKKyAgICAgICAgIGlkPSJwYXRoMzUxOSIKKyAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CisgICAgPC9tYXJrZXI+CisgICAgPG1hcmtlcgorICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIKKyAgICAgICBpZD0iQXJyb3cyTCIKKyAgICAgICByZWZYPSIwLjAiCisgICAgICAgcmVmWT0iMC4wIgorICAgICAgIG9yaWVudD0iYXV0byIKKyAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJBcnJvdzJMIj4KKyAgICAgIDxwYXRoCisgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEuMSkgdHJhbnNsYXRlKC01LDApIgorICAgICAgICAgZD0iTSA4LjcxODU4NzgsNC4wMzM3MzUyIEwgLTIuMjA3Mjg5NSwwLjAxNjAxMzI1NiBMIDguNzE4NTg4NCwtNC4wMDE3MDc4IEMgNi45NzMwOTAwLC0xLjYyOTY0NjkgNi45ODMxNDc2LDEuNjE1NzQ0MSA4LjcxODU4NzgsNC4wMzM3MzUyIHogIgorICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDowLjYyNTAwMDAwO3N0cm9rZS1saW5lam9pbjpyb3VuZDsiCisgICAgICAgICBpZD0icGF0aDM1MTUiCisgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CisgICAgPC9tYXJrZXI+CisgIDwvZGVmcz4KKyAgPHNvZGlwb2RpOm5hbWVkdmlldworICAgICBpZD0iYmFzZSIKKyAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgorICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKKyAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgorICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgorICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgorICAgICBpbmtzY2FwZTp6b29tPSIwLjkwMjEwMzE4IgorICAgICBpbmtzY2FwZTpjeD0iNDIwLjk0NDg3IgorICAgICBpbmtzY2FwZTpjeT0iMjk3LjYzNzc5IgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwMjQiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcwMSIKKyAgICAgc2hvd2dyaWQ9ImZhbHNlIgorICAgICBpbmtzY2FwZTpncmlkLWJib3g9ImZhbHNlIgorICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKKyAgICAgZ3JpZHNwYWNpbmd5PSIyLjUwMDAwMDBtbSIKKyAgICAgZ3JpZHNwYWNpbmd4PSIyLjUwMDAwMDBtbSIKKyAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6Z3VpZGUtYmJveD0idHJ1ZSI+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgcG9zaXRpb249IjI2OC44NTc5NyIKKyAgICAgICBpZD0iZ3VpZGUzNTY2IiAvPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgIHBvc2l0aW9uPSIyOTQuMzEyMjMiCisgICAgICAgaWQ9Imd1aWRlNDIzNSIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBwb3NpdGlvbj0iMzAwLjQwOTA5IgorICAgICAgIGlkPSJndWlkZTQ4ODIiIC8+CisgIDwvc29kaXBvZGk6bmFtZWR2aWV3PgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhNCI+CisgICAgPHJkZjpSREYKKyAgICAgICBpZD0iUkRGNSI+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiCisgICAgICAgICBpZD0iV29yazYiPgorICAgICAgICA8ZGM6Zm9ybWF0CisgICAgICAgICAgIGlkPSJmb3JtYXQ3Ij5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CisgICAgICAgIDxkYzp0eXBlCisgICAgICAgICAgIGlkPSJ0eXBlOSIKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgIDwvY2M6V29yaz4KKyAgICA8L3JkZjpSREY+CisgIDwvbWV0YWRhdGE+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjMuNzUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q5MDgiCisgICAgIHdpZHRoPSIzMjUuMjMyMDMiCisgICAgIGhlaWdodD0iMzU0LjMzMDcyIgorICAgICB4PSIxNy43MTY1MzYiCisgICAgIHk9IjM3Mi4wNDcyNCIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxOC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjcwLjc3ODI1MiIKKyAgICAgeT0iNzEyLjczOTIwIgorICAgICBpZD0idGV4dDE1MzIiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW4xNTMzIj5BcHBsaWNhdGlvbiBQcm9jZXNzIDE8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDE1MzUiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSIxMDYuMjk5MjEiCisgICAgIHk9IjM3OC41NDAwMSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjE4MC42MTM4OSIKKyAgICAgeT0iNDAwLjQwMDQ4IgorICAgICBpZD0idGV4dDIxNTgiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW4yMTU5Ij5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4yMTYxIgorICAgICAgIHg9IjE4MC42MTM4OSIKKyAgICAgICB5PSI0MTQuNDAwNDgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuOTk1MDkyOTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjk5NTA5MjggMi45OTUwOTI4IDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3QyMTcwIgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjY2Ljk2NjI0MCIKKyAgICAgeD0iMjguNzAyNzY4IgorICAgICB5PSI1NDkuMjEyNTkiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIxMDMuMDE3NDUiCisgICAgIHk9IjU3Ny41NjU4NiIKKyAgICAgaWQ9InRleHQyMTcxIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMTAzLjAxNzQ1IgorICAgICAgIHk9IjU3Ny41NjU4NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjIxNzYiPkMvQysrL1B5dGhvbi9ldGMuPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIxMDMuMDE3NDUiCisgICAgICAgeT0iNTkxLjU2NTg2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMjE3OCI+T2JqZWN0IEluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTM1IgorICAgICBkPSJNIDk4LjkzODk1Miw0MDguNjE0NzkgQyA5OC43NDQ3NTMsNDA5LjIwMzAzIDk3LjkxNzg4Niw0MDkuNjcyOTUgOTcuNDQwOTQ1LDQxMC4xMTQzNSBDIDk1LjUzNDk0Nyw0MTEuOTQ3NjMgOTQuMjY2OTM0LDQxNC4xMTU1NSA5My4xNzI2MTQsNDE2LjMzODU4IEMgOTEuOTAyMDU2LDQxOS4wMjcyNSA5MC45NjkyODEsNDIxLjc5OTQ0IDkwLjEwNzI1Miw0MjQuNTkyMjkgQyA4OS41ODkxMDUsNDI2LjI3Mzc0IDg4Ljk4MzUzNCw0MjcuOTA2MzQgODguMjY2OTA3LDQyOS41MzcwMCBDIDg3LjkxOTY2Nyw0MzAuMzM0MzggODcuNjIyNTkzLDQzMS4xNzU5OCA4Ny4xMjA0NjQsNDMxLjkxOTcwIEMgODYuODMyMjIyLDQzMi4zMDY2NSA4Ni40Njk0MjIsNDMyLjY1MTQ1IDg2LjE2Nzk4NSw0MzMuMDMxODQgQyA4Ni4wMTU5MzEsNDMzLjIyMjU0IDg1Ljg2ODk5Nyw0MzMuNDE1NjMgODUuNzIyMTMxLDQzMy42MDg5OCBMIDgyLjkxNDMzNiw0MzMuMTE3NDMgQyA4My4wNjM0MDIsNDMyLjkxODc5IDgzLjIxMzQyOCw0MzIuNzIwNjkgODMuMzY4MTIxLDQzMi41MjQ5OCBDIDgzLjY1NDY4MSw0MzIuMTUzMDggODMuOTgwNzM3LDQzMS44MDgzNCA4NC4yODUzODksNDMxLjQ0NzMxIEMgODQuODExOTU3LDQzMC43NzE3NSA4NS4xMjI1MjMsNDI5Ljk3OTE0IDg1LjQ4MjQwMCw0MjkuMjM4NzIgQyA4Ni4yNTMwNTYsNDI3LjY0OTI5IDg2LjkwMzA4NCw0MjYuMDM4NjEgODcuNDc0NTc4LDQyNC4zOTMyMSBDIDg4LjQzOTU0OCw0MjEuNTg1NTIgODkuNDQyODQzLDQxOC43ODc5MiA5MC43MDM5MzgsNDE2LjA1ODk4IEMgOTEuODEwOTY2LDQxMy43NzUyNSA5Mi45OTkxOTEsNDExLjQ1OTYxIDk0Ljg0OTQ2NCw0MDkuNTA3NDggQyA5NS4wOTQ3MDQsNDA5LjI0ODc2IDk2LjA5MTc4OSw0MDcuOTAxNDkgOTUuODY1NzM3LDQwOC42MTQ3OSBMIDk4LjkzODk1Miw0MDguNjE0NzkgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7IgorICAgICB4PSIzNC4xMDk0OTciCisgICAgIHk9IjQ0Ni4xMzM4MiIKKyAgICAgaWQ9InRleHQzNTM2Ij48dHNwYW4KKyAgICAgICBpZD0idHNwYW4zNTM3Ij5Mb2NhdGUgT2JqZWN0PC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1MzkiCisgICAgICAgeD0iMzQuMTA5NDk3IgorICAgICAgIHk9IjQ1OC4xMzM4MiI+dmlhIE9iamVjdCBQYXRoPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTQxIgorICAgICBkPSJNIDYwLjUwOTg2Nyw0NjIuNzg3NjcgQyA2MC43MDQwNjYsNDYzLjM3NTkxIDYxLjUzMDkzMyw0NjMuODQ1ODMgNjIuMDA3ODc0LDQ2NC4yODcyMyBDIDYzLjkxMzg3Miw0NjYuMTIwNTEgNjUuMTgxODg1LDQ2OC4yODg0MyA2Ni4yNzYyMDUsNDcwLjUxMTQ2IEMgNjcuNTQ2NzYzLDQ3My4yMDAxMyA2OC40Nzk1MzgsNDc1Ljk3MjMyIDY5LjM0MTU2Nyw0NzguNzY1MTcgQyA2OS44NTk3MTQsNDgwLjQ0NjYyIDcwLjQ2NTI4NSw0ODIuMDc5MjIgNzEuMTgxOTEyLDQ4My43MDk4OCBDIDcxLjUyOTE1Miw0ODQuNTA3MjYgNzEuODI2MjI2LDQ4NS4zNDg4NiA3Mi4zMjgzNTUsNDg2LjA5MjU4IEMgNzIuNjE2NTk3LDQ4Ni40Nzk1MyA3Mi45NzkzOTcsNDg2LjgyNDMzIDczLjI4MDgzNCw0ODcuMjA0NzIgQyA3My40MzI4ODgsNDg3LjM5NTQyIDczLjU3OTgyMiw0ODcuNTg4NTEgNzMuNzI2Njg4LDQ4Ny43ODE4NiBMIDc2LjUzNDQ4Myw0ODcuMjkwMzEgQyA3Ni4zODU0MTcsNDg3LjA5MTY3IDc2LjIzNTM5MSw0ODYuODkzNTcgNzYuMDgwNjk4LDQ4Ni42OTc4NiBDIDc1Ljc5NDEzOCw0ODYuMzI1OTYgNzUuNDY4MDgyLDQ4NS45ODEyMiA3NS4xNjM0MzAsNDg1LjYyMDE5IEMgNzQuNjM2ODYyLDQ4NC45NDQ2MyA3NC4zMjYyOTYsNDg0LjE1MjAyIDczLjk2NjQxOSw0ODMuNDExNjAgQyA3My4xOTU3NjMsNDgxLjgyMjE3IDcyLjU0NTczNSw0ODAuMjExNDkgNzEuOTc0MjQxLDQ3OC41NjYwOSBDIDcxLjAwOTI3MSw0NzUuNzU4NDAgNzAuMDA1OTc2LDQ3Mi45NjA4MCA2OC43NDQ4ODEsNDcwLjIzMTg2IEMgNjcuNjM3ODUzLDQ2Ny45NDgxMyA2Ni40NDk2MjgsNDY1LjYzMjQ5IDY0LjU5OTM1NSw0NjMuNjgwMzYgQyA2NC4zNTQxMTUsNDYzLjQyMTY0IDYzLjM1NzAzMCw0NjIuMDc0MzcgNjMuNTgzMDgyLDQ2Mi43ODc2NyBMIDYwLjUwOTg2Nyw0NjIuNzg3NjcgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjQ5LjEwMDMxNSIKKyAgICAgeT0iNTAxLjYwOTU5IgorICAgICBpZD0idGV4dDM1NDIiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI0OS4xMDAzMTUiCisgICAgICAgeT0iNTAxLjYwOTU5IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU0NyI+QmluZGluZ3MgTWFyc2hhbDwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDkuMTAwMzE1IgorICAgICAgIHk9IjUxMy42MDk1OSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NDkiPnRvIE1ldGhvZCBDYWxsPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTUxIgorICAgICBkPSJNIDk1LjI5NTIzOSw1MTkuNDMyMTEgQyA5NS4xMDEwMzksNTIwLjAyMDM1IDk0LjI3NDE2OSw1MjAuNDkwMjcgOTMuNzk3MjI5LDUyMC45MzE2NyBDIDkxLjg5MTIzOSw1MjIuNzY0OTUgOTAuNjIzMjE5LDUyNC45MzI4NyA4OS41Mjg4OTksNTI3LjE1NTkwIEMgODguMjU4MzM5LDUyOS44NDQ1NyA4Ny4zMjU1NjksNTMyLjYxNjc2IDg2LjQ2MzUzOSw1MzUuNDA5NjEgQyA4NS45NDUzODksNTM3LjA5MTA2IDg1LjMzOTgxOSw1MzguNzIzNjYgODQuNjIzMTk5LDU0MC4zNTQzMiBDIDg0LjI3NTk1OSw1NDEuMTUxNzAgODMuOTc4ODc5LDU0MS45OTMzMCA4My40NzY3NDksNTQyLjczNzAyIEMgODMuMTg4NTA5LDU0My4xMjM5NyA4Mi44MjU3MDksNTQzLjQ2ODc3IDgyLjUyNDI2OSw1NDMuODQ5MTYgQyA4Mi4zNzIyMTksNTQ0LjAzOTg2IDgyLjIyNTI4OSw1NDQuMjMyOTUgODIuMDc4NDE5LDU0NC40MjYzMCBMIDc5LjI3MDYxOSw1NDMuOTM0NzUgQyA3OS40MTk2ODksNTQzLjczNjExIDc5LjU2OTcxOSw1NDMuNTM4MDEgNzkuNzI0NDA5LDU0My4zNDIzMCBDIDgwLjAxMDk2OSw1NDIuOTcwNDAgODAuMzM3MDI5LDU0Mi42MjU2NiA4MC42NDE2NzksNTQyLjI2NDYzIEMgODEuMTY4MjQ5LDU0MS41ODkwNyA4MS40Nzg4MDksNTQwLjc5NjQ2IDgxLjgzODY4OSw1NDAuMDU2MDQgQyA4Mi42MDkzMzksNTM4LjQ2NjYxIDgzLjI1OTM2OSw1MzYuODU1OTMgODMuODMwODY5LDUzNS4yMTA1MyBDIDg0Ljc5NTgzOSw1MzIuNDAyODQgODUuNzk5MTI5LDUyOS42MDUyNCA4Ny4wNjAyMjksNTI2Ljg3NjMwIEMgODguMTY3MjQ5LDUyNC41OTI1NyA4OS4zNTU0NzksNTIyLjI3NjkzIDkxLjIwNTc0OSw1MjAuMzI0ODAgQyA5MS40NTA5ODksNTIwLjA2NjA4IDkyLjQ0ODA3OSw1MTguNzE4ODEgOTIuMjIyMDI5LDUxOS40MzIxMSBMIDk1LjI5NTIzOSw1MTkuNDMyMTEgeiAiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTUyIgorICAgICBkPSJNIDI2MS44MzUzMyw0MDguNjE0NzkgQyAyNjIuMDI5NTMsNDA5LjIwMzAzIDI2Mi44NTY0MCw0MDkuNjcyOTUgMjYzLjMzMzM0LDQxMC4xMTQzNSBDIDI2NS4yMzkzNCw0MTEuOTQ3NjMgMjY2LjUwNzM1LDQxNC4xMTU1NSAyNjcuNjAxNjcsNDE2LjMzODU4IEMgMjY4Ljg3MjIzLDQxOS4wMjcyNSAyNjkuODA1MDEsNDIxLjc5OTQ0IDI3MC42NjcwMyw0MjQuNTkyMjkgQyAyNzEuMTg1MTgsNDI2LjI3Mzc0IDI3MS43OTA3NSw0MjcuOTA2MzQgMjcyLjUwNzM4LDQyOS41MzcwMCBDIDI3Mi44NTQ2Miw0MzAuMzM0MzggMjczLjE1MTY5LDQzMS4xNzU5OCAyNzMuNjUzODIsNDMxLjkxOTcwIEMgMjczLjk0MjA2LDQzMi4zMDY2NSAyNzQuMzA0ODYsNDMyLjY1MTQ1IDI3NC42MDYzMCw0MzMuMDMxODQgQyAyNzQuNzU4MzYsNDMzLjIyMjU0IDI3NC45MDUyOSw0MzMuNDE1NjMgMjc1LjA1MjE2LDQzMy42MDg5OCBMIDI3Ny44NTk5NSw0MzMuMTE3NDMgQyAyNzcuNzEwODgsNDMyLjkxODc5IDI3Ny41NjA4Niw0MzIuNzIwNjkgMjc3LjQwNjE3LDQzMi41MjQ5OCBDIDI3Ny4xMTk2MSw0MzIuMTUzMDggMjc2Ljc5MzU1LDQzMS44MDgzNCAyNzYuNDg4OTAsNDMxLjQ0NzMxIEMgMjc1Ljk2MjMzLDQzMC43NzE3NSAyNzUuNjUxNzYsNDI5Ljk3OTE0IDI3NS4yOTE4OSw0MjkuMjM4NzIgQyAyNzQuNTIxMjMsNDI3LjY0OTI5IDI3My44NzEyMCw0MjYuMDM4NjEgMjczLjI5OTcxLDQyNC4zOTMyMSBDIDI3Mi4zMzQ3NCw0MjEuNTg1NTIgMjcxLjMzMTQ0LDQxOC43ODc5MiAyNzAuMDcwMzUsNDE2LjA1ODk4IEMgMjY4Ljk2MzMyLDQxMy43NzUyNSAyNjcuNzc1MTAsNDExLjQ1OTYxIDI2NS45MjQ4Miw0MDkuNTA3NDggQyAyNjUuNjc5NTgsNDA5LjI0ODc2IDI2NC42ODI1MCw0MDcuOTAxNDkgMjY0LjkwODU1LDQwOC42MTQ3OSBMIDI2MS44MzUzMyw0MDguNjE0NzkgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjIyMy45ODc0OSIKKyAgICAgeT0iNDQ2LjEzMzgyIgorICAgICBpZD0idGV4dDM1NTMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIyMjMuOTg3NDkiCisgICAgICAgeT0iNDQ2LjEzMzgyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU2MiI+TWFyc2hhbCBNZXRob2Q8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjIyMy45ODc0OSIKKyAgICAgICB5PSI0NTguMTMzODIiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTY0Ij5DYWxsIHRvIE1lc3NhZ2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NjciCisgICAgIGQ9Ik0gMjc4Ljk2NDg1LDQ2My4yOTQ1MyBDIDI3OC43NzA2NSw0NjMuODgyNzcgMjc3Ljk0Mzc4LDQ2NC4zNTI2OSAyNzcuNDY2ODQsNDY0Ljc5NDA5IEMgMjc1LjU2MDg1LDQ2Ni42MjczNyAyNzQuMjkyODMsNDY4Ljc5NTI5IDI3My4xOTg1MSw0NzEuMDE4MzIgQyAyNzEuOTI3OTUsNDczLjcwNjk5IDI3MC45OTUxOCw0NzYuNDc5MTggMjcwLjEzMzE1LDQ3OS4yNzIwMyBDIDI2OS42MTUwMCw0ODAuOTUzNDggMjY5LjAwOTQzLDQ4Mi41ODYwOCAyNjguMjkyODEsNDg0LjIxNjc0IEMgMjY3Ljk0NTU3LDQ4NS4wMTQxMiAyNjcuNjQ4NDksNDg1Ljg1NTcyIDI2Ny4xNDYzNiw0ODYuNTk5NDQgQyAyNjYuODU4MTIsNDg2Ljk4NjM5IDI2Ni40OTUzMiw0ODcuMzMxMTkgMjY2LjE5Mzg4LDQ4Ny43MTE1OCBDIDI2Ni4wNDE4Myw0ODcuOTAyMjggMjY1Ljg5NDkwLDQ4OC4wOTUzNyAyNjUuNzQ4MDMsNDg4LjI4ODcyIEwgMjYyLjk0MDIzLDQ4Ny43OTcxNyBDIDI2My4wODkzMCw0ODcuNTk4NTMgMjYzLjIzOTMzLDQ4Ny40MDA0MyAyNjMuMzk0MDIsNDg3LjIwNDcyIEMgMjYzLjY4MDU4LDQ4Ni44MzI4MiAyNjQuMDA2NjQsNDg2LjQ4ODA4IDI2NC4zMTEyOSw0ODYuMTI3MDUgQyAyNjQuODM3ODYsNDg1LjQ1MTQ5IDI2NS4xNDg0Miw0ODQuNjU4ODggMjY1LjUwODMwLDQ4My45MTg0NiBDIDI2Ni4yNzg5NSw0ODIuMzI5MDMgMjY2LjkyODk4LDQ4MC43MTgzNSAyNjcuNTAwNDgsNDc5LjA3Mjk1IEMgMjY4LjQ2NTQ1LDQ3Ni4yNjUyNiAyNjkuNDY4NzQsNDczLjQ2NzY2IDI3MC43Mjk4NCw0NzAuNzM4NzIgQyAyNzEuODM2ODYsNDY4LjQ1NDk5IDI3My4wMjUwOSw0NjYuMTM5MzUgMjc0Ljg3NTM2LDQ2NC4xODcyMiBDIDI3NS4xMjA2MCw0NjMuOTI4NTAgMjc2LjExNzY5LDQ2Mi41ODEyMyAyNzUuODkxNjQsNDYzLjI5NDUzIEwgMjc4Ljk2NDg1LDQ2My4yOTQ1MyB6ICIgLz4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi43Mzc3MDg2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNzM3NzA4NCAyLjczNzcwODQgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDM1NjgiCisgICAgIHdpZHRoPSIxMjQuMDE3NDYiCisgICAgIGhlaWdodD0iNjYuOTc5ODEzIgorICAgICB4PSIxODkuNzkyNjUiCisgICAgIHk9IjQ5NS4wODkwMiIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjI0OC45NDA0OSIKKyAgICAgeT0iNTIzLjQ0MjIwIgorICAgICBpZD0idGV4dDM1NjkiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIyNDguOTQwNDkiCisgICAgICAgeT0iNTIzLjQ0MjIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU3NCI+QmluZGluZ3MgUHJveHk8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjI0OC45NDA0OSIKKyAgICAgICB5PSI1MzcuNDQyMjAiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTc2Ij5PYmplY3QgSW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NzgiCisgICAgIGQ9Ik0gMjU5LjAzNTQ3LDU2Ni45MjkxMyBDIDI1OS4yMjk2Nyw1NjcuNTE3MzcgMjYwLjA1NjUzLDU2Ny45ODcyOSAyNjAuNTMzNDgsNTY4LjQyODY5IEMgMjYyLjQzOTQ3LDU3MC4yNjE5NyAyNjMuNzA3NDksNTcyLjQyOTg5IDI2NC44MDE4MSw1NzQuNjUyOTIgQyAyNjYuMDcyMzYsNTc3LjM0MTU5IDI2Ny4wMDUxNCw1ODAuMTEzNzggMjY3Ljg2NzE3LDU4Mi45MDY2MyBDIDI2OC4zODUzMiw1ODQuNTg4MDggMjY4Ljk5MDg5LDU4Ni4yMjA2OCAyNjkuNzA3NTEsNTg3Ljg1MTM0IEMgMjcwLjA1NDc1LDU4OC42NDg3MiAyNzAuMzUxODMsNTg5LjQ5MDMyIDI3MC44NTM5Niw1OTAuMjM0MDQgQyAyNzEuMTQyMjAsNTkwLjYyMDk5IDI3MS41MDUwMCw1OTAuOTY1NzkgMjcxLjgwNjQ0LDU5MS4zNDYxOCBDIDI3MS45NTg0OSw1OTEuNTM2ODggMjcyLjEwNTQyLDU5MS43Mjk5NyAyNzIuMjUyMjksNTkxLjkyMzMyIEwgMjc1LjA2MDA4LDU5MS40MzE3NyBDIDI3NC45MTEwMiw1OTEuMjMzMTMgMjc0Ljc2MDk5LDU5MS4wMzUwMyAyNzQuNjA2MzAsNTkwLjgzOTMyIEMgMjc0LjMxOTc0LDU5MC40Njc0MiAyNzMuOTkzNjgsNTkwLjEyMjY4IDI3My42ODkwMyw1ODkuNzYxNjUgQyAyNzMuMTYyNDYsNTg5LjA4NjA5IDI3Mi44NTE5MCw1ODguMjkzNDggMjcyLjQ5MjAyLDU4Ny41NTMwNiBDIDI3MS43MjEzNiw1ODUuOTYzNjMgMjcxLjA3MTM0LDU4NC4zNTI5NSAyNzAuNDk5ODQsNTgyLjcwNzU1IEMgMjY5LjUzNDg3LDU3OS44OTk4NiAyNjguNTMxNTgsNTc3LjEwMjI2IDI2Ny4yNzA0OCw1NzQuMzczMzIgQyAyNjYuMTYzNDUsNTcyLjA4OTU5IDI2NC45NzUyMyw1NjkuNzczOTUgMjYzLjEyNDk2LDU2Ny44MjE4MiBDIDI2Mi44Nzk3Miw1NjcuNTYzMTAgMjYxLjg4MjYzLDU2Ni4yMTU4MyAyNjIuMTA4NjgsNTY2LjkyOTEzIEwgMjU5LjAzNTQ3LDU2Ni45MjkxMyB6ICIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMjE3LjQwNzQxIgorICAgICB5PSI2MDcuOTA4ODEiCisgICAgIGlkPSJ0ZXh0MzU3OSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjIxNy40MDc0MSIKKyAgICAgICB5PSI2MDcuOTA4ODEiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTg0Ij5BcHBsaWNhdGlvbiBDb2RlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTYxNzIwMjhwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSAyNi41NzQ4MDMsNDA4LjYwMDA5IEMgMjYuNTc0ODAzLDUzOS42ODkxMiAyNi41NzQ4MDMsNTM5LjY4OTExIDI2LjU3NDgwMyw1MzEuNDk2MDYiCisgICAgIGlkPSJwYXRoMzU4NiIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjI1Ljk3NzE0NiIKKyAgICAgeT0iMzg2LjQ1MjEyIgorICAgICBpZD0idGV4dDQyMjAiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW40MjIxIj5JbmNvbWluZzwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40MjIzIgorICAgICAgIHg9IjI1Ljk3NzE0NiIKKyAgICAgICB5PSIzOTguNDUyMTIiPkNhbGw8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOmVuZDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIzMzUuNjE0MTEiCisgICAgIHk9IjM4Ni40NTIxMiIKKyAgICAgaWQ9InRleHQ0MjI2IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMzM1LjYxNDExIgorICAgICAgIHk9IjM4Ni40NTIxMiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQyMzEiPk91dGdvaW5nPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzMzUuNjE0MTEiCisgICAgICAgeT0iMzk4LjQ1MjEyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDIzMyI+Q2FsbDwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk2MTcyMDI4cHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6bm9uZTsiCisgICAgIGQ9Ik0gMzI3Ljc1NTkxLDQxNi4zMzg1OCBDIDMyNy43NTU5MSw1NDcuNDI3NjEgMzI3Ljc1NTkxLDU0Ny40Mjc2MCAzMjcuNzU1OTEsNTM5LjIzNDU1IgorICAgICBpZD0icGF0aDQyMzYiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjUuNzkxNDMxMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q0ODcwIgorICAgICB3aWR0aD0iODg1Ljg2NTkxIgorICAgICBoZWlnaHQ9IjMxMC4yNzI1MiIKKyAgICAgeD0iODguNTgyNjgwIgorICAgICB5PSI4Ljg1ODI2MjEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTguMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNTE1LjQyNzM3IgorICAgICB5PSIzMDUuNDQ0ODkiCisgICAgIGlkPSJ0ZXh0NDg3MSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjUxNS40MjczNyIKKyAgICAgICB5PSIzMDUuNDQ0ODkiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40ODc0Ij5CdXMgRGFlbW9uIFByb2Nlc3M8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NTAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDQ4NzYiCisgICAgIHdpZHRoPSIzMjUuMjMyMDMiCisgICAgIGhlaWdodD0iMzU0LjMzMDcyIgorICAgICB4PSI3MDguNjYxNDQiCisgICAgIHk9IjM3My4wODM1OSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxOC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9Ijc2MS43MjMxNCIKKyAgICAgeT0iNzEzLjc3NTUxIgorICAgICBpZD0idGV4dDQ4NzciCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI3NjEuNzIzMTQiCisgICAgICAgeT0iNzEzLjc3NTUxIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg4MCI+QXBwbGljYXRpb24gUHJvY2VzcyAyPC90c3Bhbj48L3RleHQ+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjgyMy40OTY2NCIKKyAgICAgeT0iNTA1LjE4MDE4IgorICAgICBpZD0idGV4dDQ4ODMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI4MjMuNDk2NjQiCisgICAgICAgeT0iNTA1LjE4MDE4IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg4OCI+U2FtZSBTdHVmZiBhcyBpbjwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iODIzLjQ5NjY0IgorICAgICAgIHk9IjUxNy4xODAxOCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ4OTAiPlByb2Nlc3MgMTwvdHNwYW4+PC90ZXh0PgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0Ny44OTEwNzEiCisgICAgIHk9IjYzOC4wNTQyMCIKKyAgICAgaWQ9InRleHQ0ODkyIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNDcuODkxMDcxIgorICAgICAgIHk9IjYzOC4wNTQyMCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ5MDEiPihPYmplY3QgSW5zdGFuY2UgSGFzPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0Ny44OTEwNzEiCisgICAgICAgeT0iNjUwLjA1NDIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDkwMyI+MSBvciBNb3JlIEludGVyZmFjZXMpPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMjUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTtzdHJva2UtZGFzaGFycmF5Om5vbmU7IgorICAgICBkPSJNIDE2Mi41NzI2MCwzNTguMDIwNDEgQyAxNjUuMjUyMTMsMzU0LjYwNTE2IDE4Ni4wMTg1OCwzMjguMTM2ODggMTg0LjAwODkzLDMzMC42OTgzMiIKKyAgICAgaWQ9InBhdGg0OTA1IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOyIKKyAgICAgeD0iMTkwLjU3MTcwIgorICAgICB5PSIzNDIuNjIwMTgiCisgICAgIGlkPSJ0ZXh0NTUzOSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU0MCI+U29ja2V0PC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NDQiCisgICAgICAgeD0iMTkwLjU3MTcwIgorICAgICAgIHk9IjM1NC42MjAxOCI+KEJpZGlyZWN0aW9uYWwgTWVzc2FnZSBTdHJlYW0pPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMjUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gODI3LjUzODc2LDM2My4xODg5NyBDIDgyNC44NTkxNiwzNTkuNzczNzIgODA0LjA5Mjc2LDMzMy4zMDU0NCA4MDYuMTAyMzYsMzM1Ljg2Njg4IgorICAgICBpZD0icGF0aDU1NDYiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7IgorICAgICB4PSI4NDAuNzkxNTAiCisgICAgIHk9IjM0NS43MzEzNSIKKyAgICAgaWQ9InRleHQ1NTQ3Ij48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTQ4Ij5Tb2NrZXQ8L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU1MCIKKyAgICAgICB4PSI4NDAuNzkxNTAiCisgICAgICAgeT0iMzU3LjczMTM1Ij4oQmlkaXJlY3Rpb25hbCBNZXNzYWdlIFN0cmVhbSk8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDU1NTIiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSIxMjQuMDE1NzUiCisgICAgIHk9IjI2My4zODI1MSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjE5OC4zMzA0MyIKKyAgICAgeT0iMjg1LjI0Mjk4IgorICAgICBpZD0idGV4dDU1NTMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTU0Ij5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTU2IgorICAgICAgIHg9IjE5OC4zMzA0MyIKKyAgICAgICB5PSIyOTkuMjQyOTgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjUwMDAwMDAgMi41MDAwMDAwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q1NTU4IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjQ2LjY1Njg0OSIKKyAgICAgeD0iNzE5LjY0NzY0IgorICAgICB5PSIyNjMuMzgyNTEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI3OTMuOTYyMzQiCisgICAgIHk9IjI4NS4yNDI5OCIKKyAgICAgaWQ9InRleHQ1NTU5IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU2MCI+REJ1c0Nvbm5lY3Rpb248L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU2MiIKKyAgICAgICB4PSI3OTMuOTYyMzQiCisgICAgICAgeT0iMjk5LjI0Mjk4Ij5JbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi41MDAwMDAwIDIuNTAwMDAwMCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NTU2NCIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI0Ni42NTY4NDkiCisgICAgIHg9Ijc2My43NzIyMiIKKyAgICAgeT0iMzc4LjU0MDAxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iODM4LjA4NjkxIgorICAgICB5PSI0MDAuNDAwNDgiCisgICAgIGlkPSJ0ZXh0NTU2NSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NjYiPkRCdXNDb25uZWN0aW9uPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NjgiCisgICAgICAgeD0iODM4LjA4NjkxIgorICAgICAgIHk9IjQxNC40MDA0OCI+SW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gMTg2LjAyMzYyLDI0OC4wMzE0OSBDIDEwNi4yOTkyMSwyNi41NzQ3OTcgMzcyLjA0NzI0LDI2LjU3NDc5NyAzNzIuMDQ3MjQsMjYuNTc0Nzk3IgorICAgICBpZD0icGF0aDU1NzEiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMTg1NDk2MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjE4NTQ5NjAgMi4xODU0OTYwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q2MjA1IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjM1LjY1NjIyNyIKKyAgICAgeD0iMzkxLjg5MTc1IgorICAgICB5PSIxNy40OTMzNzQiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0NjYuMjA2NDIiCisgICAgIHk9IjM5LjU3NzAwMyIKKyAgICAgaWQ9InRleHQ2MjA2IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNDY2LjIwNjQyIgorICAgICAgIHk9IjM5LjU3NzAwMyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjYyMTEiPk1lc3NhZ2UgRGlzcGF0Y2hlcjwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA4MDYuMTAyMzYsMjQ4LjAzMTQ5IEMgODE0Ljk2MDYzLDE3LjcxNjUzMCA1NDkuMjEyNjAsMjYuNTc0Nzk3IDU1OC4wNzA4NywyNi41NzQ3OTciCisgICAgIGlkPSJwYXRoNjIxMyIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMzgwLjI0MzQxIgorICAgICB5PSI3MS4xMjUwNTMiCisgICAgIGlkPSJ0ZXh0NjIxNCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSI3MS4xMjUwNTMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODYwIj5pZiAobWVzc2FnZSBpcyBzaWduYWwpPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iODMuMTI1MDUzIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2MiI+ICBicm9hZGNhc3Q8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSI5NS4xMjUwNTMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODY0Ij5lbHNlPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iMTA3LjEyNTA1IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2NiI+ICBmaW5kIGRlc3RpbmF0aW9uIG5hbWVkIGJ5IG1lc3NhZ2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gMzgwLjkwNTUxLDc5LjcyNDQwNCBDIDE3Ny4xNjUzNiw1My4xNDk2MDEgMjAzLjc0MDE2LDI1Ni44ODk3NiAyMDMuNzQwMTYsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDY4NjgiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDQ1MS43NzE2NSw3OS43MjQ0MDQgQyA3ODguMzg1ODMsNDQuMjkxMzMzIDc3OS41Mjc1NiwyNTYuODg5NzYgNzc5LjUyNzU2LDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg2ODY5IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNmE2YTZhO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjEuMjUwMDAwMCwxLjI1MDAwMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q3NTAzIgorICAgICB3aWR0aD0iMzE4Ljg5NzY0IgorICAgICBoZWlnaHQ9IjE2OC4zMDcwOCIKKyAgICAgeD0iMzQ1LjQ3MjQ0IgorICAgICB5PSIxMTUuMTU3NDgiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI1MDcuMTAwMTYiCisgICAgIHk9IjEzMi43MDQwOSIKKyAgICAgaWQ9InRleHQ4MTM3IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuODEzOCI+RGVzdGluYXRpb24gVGFibGU8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fucztmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNDIyLjcxMTI0IgorICAgICB5PSIxNTguMzkzNjYiCisgICAgIGlkPSJ0ZXh0ODE0MCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEyMCUiPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxNTguMzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODE4Ij5Db25uZWN0aW9uIDE8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxNzIuNzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODIwIj5Db25uZWN0aW9uIDI8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxODcuMTkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODIyIj4mcXVvdDtUaGUgU2Vzc2lvbiBNYW5hZ2VyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjAxLjU5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyNCI+JnF1b3Q7VGhlIFdpbmRvdyBNYW5hZ2VyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjE1Ljk5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyNiI+JnF1b3Q7VGhlIFNjcmVlbnNhdmVyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjMwLjM5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyOCI+JnF1b3Q7VGhlIFRleHQgRWRpdG9yJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjQ0Ljc5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgzMCI+JnF1b3Q7VGhlIEhhcmR3YXJlIERpcmVjdG9yeSZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjI1OS4xOTM2NyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MzIiPiZxdW90O1RoZSBBZGRyZXNzIEJvb2smcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyNzMuNTkzNjciCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODM0Ij4mcXVvdDtUaGUgRGljdGlvbmFyeSZxdW90OzwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA0MTYuMzM4NTgsMTUwLjU5MDU1IEMgMjM5LjE3MzIzLDk3LjQ0MDkzNSAyMjEuNDU2NjksMjU2Ljg4OTc2IDIyMS40NTY2OSwyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoODE3OSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNTA0LjkyMTI2LDE2OC4zMDcwOCBDIDcyNi4zNzc5NSwxMDYuMjk5MjEgNzcwLjY2OTI5LDI2NS43NDgwMiA3NjEuODExMDIsMjM5LjE3MzIyIgorICAgICBpZD0icGF0aDgxODAiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGQ9IiIKKyAgICAgaWQ9InBhdGg4MTgxIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9IiIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNTg0LjY0NTY3LDIzOS4xNzMyMiBDIDcxNy41MTk2OSwxOTQuODgxODggNzYxLjgxMTAyLDI1Ni44ODk3NiA3NTIuOTUyNzYsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDgxODIiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDQxNi4zMzg1OCwxNzcuMTY1MzUgQyAzMDEuMTgxMTEsMTI0LjAxNTc0IDIzMC4zMTQ5NiwyNjUuNzQ4MDMgMjM5LjE3MzIzLDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg4MTg0IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9kb2MvZG94eWdlbl90b19kZXZoZWxwLnhzbCBiL2RvYy9kb3h5Z2VuX3RvX2RldmhlbHAueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDk4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG94eWdlbl90b19kZXZoZWxwLnhzbApAQCAtMCwwICsxLDQwIEBACis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IgorICAgIHZlcnNpb249IjEuMCI+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiB2ZXJzaW9uPSIxLjAiIGluZGVudD0ieWVzIi8+CisKKzx4c2w6cGFyYW0gbmFtZT0icHJlZml4Ij48L3hzbDpwYXJhbT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxib29rIHRpdGxlPSJELUJ1czogQSBzeXN0ZW0gZm9yIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIgorICAgICAgICBuYW1lPSJkYnVzIgorICAgICAgICBsaW5rPSJkYnVzLXR1dG9yaWFsLmh0bWwiPgorICA8Y2hhcHRlcnM+CisgICAgIDxzdWIgbmFtZT0iVHV0b3JpYWwiIGxpbms9InskcHJlZml4fWRidXMtdHV0b3JpYWwuaHRtbCIvPgorICAgICA8c3ViIG5hbWU9IkZBUSIgbGluaz0ieyRwcmVmaXh9ZGJ1cy1mYXEuaHRtbCIvPgorICAgICA8c3ViIG5hbWU9IlNwZWNpZmljYXRpb24iIGxpbms9InskcHJlZml4fWRidXMtc3BlY2lmaWNhdGlvbi5odG1sIi8+CisgICAgIDxzdWIgbmFtZT0iQVBJIFJlZmVyZW5jZSIgbGluaz0ieyRwcmVmaXh9YXBpL2luZGV4Lmh0bWwiLz4KKyAgPC9jaGFwdGVycz4KKworICA8ZnVuY3Rpb25zPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdncm91cCddL21lbWJlcltAa2luZD0nZnVuY3Rpb24nXSIvPgorICA8L2Z1bmN0aW9ucz4KKyAgPC9ib29rPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbWJlciI+CisgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJyZWZpZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZWZpZCIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImJlZm9yZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHJlZmlkLCdfMScpIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0iYWZ0ZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHJlZmlkLCdfMScpIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0ibGluayI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiZWZvcmUiLz4uaHRtbCM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFmdGVyIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoJG5hbWUsJ2RidXMnKSBvciBzdGFydHMtd2l0aCgkbmFtZSwgJ0RCdXMnKSI+CisgICAgPHhzbDppZiB0ZXN0PSJzdGFydHMtd2l0aCgkcmVmaWQsJ2dyb3VwX18nKSBhbmQgY29udGFpbnMoJHJlZmlkLCAnXzEnKSI+CisgICAgICAgPGZ1bmN0aW9uIG5hbWU9InskbmFtZX0iIGxpbms9InskcHJlZml4fWFwaS97JGxpbmt9Ii8+CisgICAgPC94c2w6aWY+CisgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2MvZmlsZS1ib2lsZXJwbGF0ZS5jIGIvZG9jL2ZpbGUtYm9pbGVycGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM2NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ZpbGUtYm9pbGVycGxhdGUuYwpAQCAtMCwwICsxLDI3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIEZJTEVOQU1FICBCUklFRiBGSUxFIERFU0NSSVBUSU9OCisgKgorICogQ29weXJpZ2h0IChDKSBZRUFSICBDT1BZUklHSFQgSE9MREVSCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19GT09fSAorI2RlZmluZSBEQlVTX0ZPT19ICisKKyNlbmRpZiAvKiBEQlVTX0ZPT19IICovCmRpZmYgLS1naXQgYS9kb2MvaW50cm9zcGVjdC5kdGQgYi9kb2MvaW50cm9zcGVjdC5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyNjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnRyb3NwZWN0LmR0ZApAQCAtMCwwICsxLDM3IEBACis8IS0tIERURCBmb3IgRC1CdXMgSW50cm9zcGVjdGlvbiBkYXRhIC0tPgorPCEtLSAoQykgMjAwNS0wMi0wMiBEYXZpZCBBLiBXaGVlbGVyOyByZWxlYXNlZCB1bmRlciB0aGUgRC1CdXMgbGljZW5zZXMsCisgICAgICAgICBHTlUgR1BMIHZlcnNpb24gMiAob3IgZ3JlYXRlcikgYW5kIEFGTCAxLjEgKG9yIGdyZWF0ZXIpIC0tPgorCis8IS0tIHNlZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGZvciBkb2N1bWVudGF0aW9uIC0tPgorCis8IUVMRU1FTlQgbm9kZSAobm9kZXxpbnRlcmZhY2UpKj4KKzwhQVRUTElTVCBub2RlIG5hbWUgQ0RBVEEgI0lNUExJRUQ+CisKKzwhRUxFTUVOVCBpbnRlcmZhY2UgKG1ldGhvZHxzaWduYWx8cHJvcGVydHl8YW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIGludGVyZmFjZSBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIG1ldGhvZCAoYXJnfGFubm90YXRpb24pKj4KKzwhQVRUTElTVCBtZXRob2QgbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBzaWduYWwgKGFyZ3xhbm5vdGF0aW9uKSo+Cis8IUFUVExJU1Qgc2lnbmFsIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgYXJnIEVNUFRZPgorPCFBVFRMSVNUIGFyZyBuYW1lIENEQVRBICNJTVBMSUVEPgorPCFBVFRMSVNUIGFyZyB0eXBlIENEQVRBICNSRVFVSVJFRD4KKzwhLS0gTWV0aG9kIGFyZ3VtZW50cyBTSE9VTEQgaW5jbHVkZSAiZGlyZWN0aW9uIiwKKyAgICAgd2hpbGUgc2lnbmFsIGFuZCBlcnJvciBhcmd1bWVudHMgU0hPVUxEIG5vdCAoc2luY2UgdGhlcmUncyBubyBwb2ludCkuCisgICAgIFRoZSBEVEQgZm9ybWF0IGNhbid0IGV4cHJlc3MgdGhhdCBzdWJ0bGV0eS4gLS0+Cis8IUFUVExJU1QgYXJnIGRpcmVjdGlvbiAoaW58b3V0KSAiaW4iPgorCis8IS0tIEFLQSAiYXR0cmlidXRlIiAtLT4KKzwhRUxFTUVOVCBwcm9wZXJ0eSAoYW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIHByb3BlcnR5IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorPCFBVFRMSVNUIHByb3BlcnR5IHR5cGUgQ0RBVEEgI1JFUVVJUkVEPiAKKzwhQVRUTElTVCBwcm9wZXJ0eSBhY2Nlc3MgKHJlYWR8d3JpdGV8cmVhZHdyaXRlKSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBhbm5vdGF0aW9uIEVNUFRZPiAgPCEtLSBHZW5lcmljIG1ldGFkYXRhIC0tPgorPCFBVFRMSVNUIGFubm90YXRpb24gbmFtZSBDREFUQSAjUkVRVUlSRUQ+Cis8IUFUVExJU1QgYW5ub3RhdGlvbiB2YWx1ZSBDREFUQSAjUkVRVUlSRUQ+CisKKwpkaWZmIC0tZ2l0IGEvZG9jL2ludHJvc3BlY3QueHNsIGIvZG9jL2ludHJvc3BlY3QueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzQ0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW50cm9zcGVjdC54c2wKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTE1Ij8+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorCis8IS0tIAorIENvcHlyaWdodCAoQykgMjAwNSBMZW5uYXJ0IFBvZXR0ZXJpbmcuCisKKyBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKy0tPgorCis8IS0tICRJZCQgLS0+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xNSIgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiBkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCIgaW5kZW50PSJ5ZXMiLz4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxodG1sPgorICAgIDxoZWFkPgorICAgICAgPHRpdGxlPkRCVVMgSW50cm9zcGVjdGlvbiBkYXRhPC90aXRsZT4KKyAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIGJvZHkgeyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlIH0gCisgICAgICAgIGgxIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQorICAgICAgICB1bCB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTBweCB9CisgICAgICAgIGxpIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQorICAgICAgICAua2V5d29yZCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9CisgICAgICAgIC50eXBlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorICAgICAgICAuc3ltYm9sIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9CisgICAgICAgIC5pbnRlcmZhY2UgeyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHggfQorICAgICAgPC9zdHlsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibm9kZS9pbnRlcmZhY2UiPgorICAgICAgICA8ZGl2IGNsYXNzPSJpbnRlcmZhY2UiPgorICAgICAgICAgIDxoMT4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnRlcmZhY2U8L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN5bWJvbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zcGFuPgorICAgICAgICAgIDwvaDE+ICAgCisgICAgICAgICAgCisgICAgICAgICAgPHVsPgorCisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImFubm90YXRpb24iLz4gCisKKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2R8c2lnbmFsfHByb3BlcnR5Ij4KKyAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+PC9zcGFuPgorICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ltYm9sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3NwYW4+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhbm5vdGF0aW9uIi8+IAorICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFyZyI+CisgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkaXJlY3Rpb24gIT0gJnF1b3Q7JnF1b3Q7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRpcmVjdGlvbiIvPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5hbWUoLi4pID0gJnF1b3Q7c2lnbmFsJnF1b3Q7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC9zcGFuPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ltYm9sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgPC91bD4KKworICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisKKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYW5ub3RhdGlvbiI+IAorICA8bGk+CisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmFubm90YXRpb248L3NwYW4+CisgICAgPGNvZGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9jb2RlPjx4c2w6dGV4dD4gPSA8L3hzbDp0ZXh0PgorICAgIDxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz48L2NvZGU+CisgIDwvbGk+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQgYi9kb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTk1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0CkBAIC0wLDAgKzEsODAgQEAKK0QtQlVTIFN5c3RlbSBBY3RpdmF0aW9uCisKK0ludHJvZHVjdGlvbjoKKworVGhlIGRidXMtZGFlbW9uIHJ1bnMgYXMgdGhlIGRidXMgdXNlciwgYW5kIGlzIHRoZXJlZm9yZSB1bnByaXZpbGVnZWQuCitFYXJsaWVyIGF0dGVtcHRzIFsxXSBieSBEYXZpZCBaZXV0aGVuIGF0IGxhdW5jaGluZyBzeXN0ZW0gc2NyaXB0cyB1c2luZyBhCitjdXN0b20gREJVUyBwcm90b2NvbCB3ZXJlIHJldmlld2VkLCBidXQgZGVlbWVkIHRvbyBkaWZmaWN1bHQgdG8gYXVkaXQsIGFuZAorYWxzbyBkdWUgdG8gYSBtdWx0aS10aHJlYWRlZCBkZXNpZ24sIHRvbyBkaWZmaWN1bHQgdG8gdGVzdC4KK0luIHRoZSBuZXh0IGZldyBwYXJhZ3JhcGhzIEkgd2lsbCBvdXRsaW5lIGEgc2ltcGxlciBzZXR1aWQgYXBwcm9hY2ggZm9yCitsYXVuY2hpbmcgZGFlbW9ucyBhcyBhIGNvbmZpZ3VyZWQgdXNlci4KKworU2NvcGU6CisKK0xhdW5jaGluZyBwcm9ncmFtcyB1c2luZyBkYnVzIGhhcyBiZWVuIGEgdG9waWMgb2YgaW50ZXJlc3QgZm9yIG1hbnkgbW9udGhzLgorVGhpcyB3b3VsZCBhbGxvdyBzaW1wbGUgc3lzdGVtcyB0byBvbmx5IHN0YXJ0IHNlcnZpY2VzIHRoYXQgYXJlIG5lZWRlZCwKK2FuZCB0aGF0IGFyZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgb25seSB3aGVuIGZpcnN0IHJlcXVlc3RlZC4KK1RoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgYW4gaW5pdCBzeXN0ZW0sIGFuZCBtZWFucyB0aGF0IHdlIGNhbiB0cml2aWFsbHkKK3N0YXJ0dXAgc2VydmljZXMgaW4gcGFyYWxsZWwuCitUaGlzIGhhcyBpbW1lZGlhdGUgcHJlc3NpbmcgbmVlZCBmb3IgT0xQQywgd2l0aCBhIGxvbmdlciB0ZXJtIGV2YWx1YXRpb24gZm9yCitwZXJoYXBzIEZlZG9yYSBhbmQgUkhFTC4KKworRGV0YWlsczoKKworU2V0dWlkIGFwcGxpY2F0aW9ucyBoYXZlIHRvIHVzZWQgb25seSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgorSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBJIGhhdmUgYW4gc2luZ2xlIGV4ZWN1dGFibGUsCitkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLCB3aXRoIHRoZSBvd25lcnNoaXAgcm9vdDpkYnVzLgorVGhpcyBoYXMgdGhlIHBlcm1pc3Npb25zIDQ3NTAsIGkuZS4gdStyd3ggZytyeCArc2V0dWlkLgorSXQgaXMgbG9jYXRlZCBpbiAvdXNyL2xpYmV4ZWMvIGFuZCB0aHVzIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBpbnZva2VkIGJ5IGEKK3VzZXIgZGlyZWN0bHkuCisKK1RoZSBoZWxwZXIgbXVzdCBub3QgYmUgcGFzc2VkIGlucHV0IHRoYXQgY2FuIGJlIGNoYW5nZWQgbWFsaWNpb3VzbHksIGFuZAordGhlcmVmb3JlIHBhc3NpbmcgYSByYW5kb20gcGF0aCB3aXRoIHVzZXIgaWQgaXMgdG90YWxseSBvdXQgb2YgdGhlIHF1ZXN0aW9uLgorSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBhIHNpbWlsYXIgaWRlYSBhcyBkaXNjdXNzZWQgd2l0aCBEYXZpZHMnIHBhdGNoIHdhcwordGFrZW4sIHRoYXQgdG8gcGFzcyBhIHNpbmdsZSBuYW1lIGFyZ3VtZW50IHRvIHRoZSBoZWxwZXIuCitUaGUgc2VydmljZSBmaWxlbmFtZSBvZiAib3JnLm1lLnRlc3Quc2VydmljZSIgaXMgdGhlbiBzZWFyY2hlZCBmb3IgaW4KKy91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyBvciBvdGhlciBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuCisKK0lmIGFwcGxpY2F0aW9ucyB3YW50IHRvIGJlIGFjdGl2YXRlZCBvbiB0aGUgc3lzdGVtIF9hbmRfIHNlc3Npb24gYnVzc2VzLCB0aGVuCitzZXJ2aWNlIGZpbGVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gYm90aCBkaXJlY3Rvcmllcy4KKworQSB0eXBpY2FsIHNlcnZpY2UgZmlsZSB3b3VsZCBsb29rIGxpa2U6CisKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcubWUudGVzdAorRXhlYz0vdXNyL3NiaW4vZGJ1cy10ZXN0LXNlcnZlci5weQorVXNlcj1mdHAKKworVGhpcyBnaXZlcyB0aGUgdXNlciB0byBzd2l0Y2ggdG8sIGFuZCBhbHNvIHRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlLgorVGhlIHNlcnZpY2UgbmFtZSBtdXN0IG1hdGNoIHRoYXQgc3BlY2lmaWVkIGluIHRoZSAvZXRjL2RidXMtMS9zeXN0ZW0uZCBjb25mIGZpbGUuCisKK1ByZWNhdXRpb25zIHRha2VuOgorCisqIE9ubHkgdGhlIGJ1cyBuYW1lIGlzIHBhc3NlZCB0byB0aGUgaGVscGVyLCBhbmQgdGhpcyBpcyB2YWxpZGF0ZWQKKyogV2UgYXJlIHN1cGVyIHBhcmFub2lkIGFib3V0IHRoZSB1c2VyIHRoYXQgY2FsbGVkIHVzLCBhbmQgd2hhdCBwZXJtaXNzaW9ucyB3ZSBoYXZlLgorKiBXZSBjbGVhciBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VwdCBmb3IgREJVU19WRVJCT1NFIHdoaWNoIGlzIHVzZWQgZm9yIGRlYnVnZ2luZworKiBBbnl0aGluZyBvdXQgb2YgdGhlIG9yZGluYXJ5IGNhdXNlcyB0aGUgaGVscGVyIHRvIGFib3J0LgorCitMYXVuY2hpbmcgc2VydmljZXM6CisKK1RyaXZpYWwgbWV0aG9kcyBvbiBzZXJ2aWNlcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFuZCB0aGUgbGF1bmNoIGhlbHBlciB3aWxsCitzdGFydCB0aGUgc2VydmljZSBhbmQgZXhlY3V0ZSB0aGUgbWV0aG9kIG9uIHRoZSBzZXJ2aWNlLiBUaGUgbGF1Y2hpbmcgb2YgdGhlCitzZXJ2aWNlIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlciwgZS5nLjoKKworZGJ1cy1zZW5kIC0tc3lzdGVtIC0tcHJpbnQtcmVwbHkJCQlcCisJLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5IYWwJCQlcCisJL29yZy9mcmVlZGVza3RvcC9IYWwvTWFuYWdlcgkJCVwKKwlvcmcuZnJlZWRlc2t0b3AuSGFsLk1hbmFnZXIuRGV2aWNlRXhpc3RzCVwKKwlzdHJpbmc6L29yZy9mcmVlZGVza3RvcC9IYWwvZGV2aWNlcy9jb21wdXRlcgorCitJZiB5b3Ugd2lzaCB0byBhY3RpdmF0ZSB0aGUgc2VydmljZSB3aXRob3V0IGNhbGxpbmcgYSB3ZWxsIGtub3duIG1ldGhvZCwKK3RoZSBzdGFuZGFyZCBkYnVzIG1ldGhvZCBTdGFydFNlcnZpY2VCeU5hbWUgY2FuIGJlIHVzZWQ6CisKK2RidXMtc2VuZCAtLXN5c3RlbSAtLXByaW50LXJlcGx5CQkJXAorCS0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cwkJCVwKKwkvb3JnL2ZyZWVkZXNrdG9wL0RCdXMJCQkJXAorCW9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZQkJXAorCXN0cmluZzpvcmcuZnJlZWRlc2t0b3AuSGFsIHVpbnQzMjowCisKK1sxXSBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNi1PY3RvYmVyLzAwNjA5Ni5odG1sCisKZGlmZiAtLWdpdCBhL200L2FzLWFjLWV4cGFuZC5tNCBiL200L2FzLWFjLWV4cGFuZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViZDJiCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXMtYWMtZXhwYW5kLm00CkBAIC0wLDAgKzEsNDkgQEAKK2RubCBhcy1hYy1leHBhbmQubTQgMC4yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBhdXRvY29uZiAtKi0KK2RubCBhdXRvc3RhcnMgbTQgbWFjcm8gZm9yIGV4cGFuZGluZyBkaXJlY3RvcmllcyB1c2luZyBjb25maWd1cmUncyBwcmVmaXgKKworZG5sIChDKSAyMDAzLCAyMDA0LCAyMDA1IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCitkbmwgQVNfQUNfRVhQQU5EKFZBUiwgQ09ORklHVVJFX1ZBUikKKworZG5sIGV4YW1wbGU6CitkbmwgQVNfQUNfRVhQQU5EKFNZU0NPTkZESVIsICRzeXNjb25mZGlyKQorZG5sIHdpbGwgc2V0IFNZU0NPTkZESVIgdG8gL3Vzci9sb2NhbC9ldGMgaWYgcHJlZml4PS91c3IvbG9jYWwKKworQUNfREVGVU4oW0FTX0FDX0VYUEFORF0sCitbCisgIEVYUF9WQVI9WyQxXQorICBGUk9NX1ZBUj1bJDJdCisKKyAgZG5sIGZpcnN0IGV4cGFuZCBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGlmIG5lY2Vzc2FyeQorICBwcmVmaXhfc2F2ZT0kcHJlZml4CisgIGV4ZWNfcHJlZml4X3NhdmU9JGV4ZWNfcHJlZml4CisKKyAgZG5sIGlmIG5vIHByZWZpeCBnaXZlbiwgdGhlbiB1c2UgL3Vzci9sb2NhbCwgdGhlIGRlZmF1bHQgcHJlZml4CisgIGlmIHRlc3QgIngkcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBwcmVmaXg9IiRhY19kZWZhdWx0X3ByZWZpeCIKKyAgZmkKKyAgZG5sIGlmIG5vIGV4ZWNfcHJlZml4IGdpdmVuLCB0aGVuIHVzZSBwcmVmaXgKKyAgaWYgdGVzdCAieCRleGVjX3ByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgZXhlY19wcmVmaXg9JHByZWZpeAorICBmaQorCisgIGZ1bGxfdmFyPSIkRlJPTV9WQVIiCisgIGRubCBsb29wIHVudGlsIGl0IGRvZXNuJ3QgY2hhbmdlIGFueW1vcmUKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBuZXdfZnVsbF92YXI9ImBldmFsIGVjaG8gJGZ1bGxfdmFyYCIKKyAgICBpZiB0ZXN0ICJ4JG5ld19mdWxsX3ZhciIgPSAieCRmdWxsX3ZhciI7IHRoZW4gYnJlYWs7IGZpCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBkb25lCisKKyAgZG5sIGNsZWFuIHVwCisgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgQUNfU1VCU1QoWyQxXSwgIiRmdWxsX3ZhciIpCisKKyAgZG5sIHJlc3RvcmUgcHJlZml4IGFuZCBleGVjX3ByZWZpeAorICBwcmVmaXg9JHByZWZpeF9zYXZlCisgIGV4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF9zYXZlCitdKQpkaWZmIC0tZ2l0IGEvbTQvY29tcGlsZXIubTQgYi9tNC9jb21waWxlci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE5N2FkCi0tLSAvZGV2L251bGwKKysrIGIvbTQvY29tcGlsZXIubTQKQEAgLTAsMCArMSw2NyBAQAorIyBjb21waWxlci5tNCAtIGF1dG9jb25mIG1hY3JvcyBmb3IgY29tcGlsZXIgc2V0dGluZ3MKKyMKKyMgQ29weXJpZ2h0IMKpIDIwMDUgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisjIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisjIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisjIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjIAorIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMgCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisjIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCisjIENPTVBJTEVSX1dBUk5JTkdTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFkZGl0aW9uYWwgY29tcGlsZXIgd2FybmluZ3MgYW5kIHRyZWF0CisjIHRoZW0gYXMgZXJyb3JzLgorQUNfREVGVU4oW0NPTVBJTEVSX1dBUk5JTkdTXSwKK1tBQ19BUkdfRU5BQkxFKGNvbXBpbGVyLXdhcm5pbmdzLAorCUFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb21waWxlci13YXJuaW5nc10sCisJICAgICAgICAgICAgICAgW0VuYWJsZSBhZGRpdGlvbmFsIGNvbXBpbGVyIHdhcm5pbmdzXSksCitbaWYgdGVzdCAieCRlbmFibGVfY29tcGlsZXJfd2FybmluZ3MiID0gInh5ZXMiOyB0aGVuCisJaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgQ0ZMQUdTPSItV2FsbCAtV2Vycm9yICRDRkxBR1MiCisgICAgICAgIGZpCisJaWYgdGVzdCAieCRHWFgiID0gInh5ZXMiOyB0aGVuCisJCUNYWEZMQUdTPSItV2FsbCAtV2Vycm9yICRDWFhGTEFHUyIKKwlmaQorZmldKWRubAorXSkjIENPTVBJTEVSX1dBUk5JTkdTCisKKyMgQ09NUElMRVJfT1BUSU1JU0FUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gdG8gZGlzYWJsZSBvcHRpbWlzYXRpb25zLgorQUNfREVGVU4oW0NPTVBJTEVSX09QVElNSVNBVElPTlNdLAorW0FDX0FSR19FTkFCTEUoY29tcGlsZXItb3B0aW1pc2F0aW9ucywKKwlBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWNvbXBpbGVyLW9wdGltaXNhdGlvbnNdLAorCQkgICAgICAgW0Rpc2FibGUgY29tcGlsZXIgb3B0aW1pc2F0aW9uc10pLAorW2lmIHRlc3QgIngkZW5hYmxlX2NvbXBpbGVyX29wdGltaXNhdGlvbnMiID0gInhubyI7IHRoZW4KKwlbQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAicy8gLU9bMS05XSpcYi8gLU8wL2ciYF0KK2ZpXSlkbmwKK10pIyBDT01QSUxFUl9PUFRJTUlTQVRJT05TCisKKyMgQ09NUElMRVJfQ09WRVJBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgY292ZXJhZ2UgZGF0YS4KK0FDX0RFRlVOKFtDT01QSUxFUl9DT1ZFUkFHRV0sCitbQUNfQVJHX0VOQUJMRShjb21waWxlci1jb3ZlcmFnZSwKKwlBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY29tcGlsZXItY292ZXJhZ2VdLAorCQkgICAgICAgW0VuYWJsZSBnZW5lcmF0aW9uIG9mIGNvdmVyYWdlIGRhdGFdKSwKK1tpZiB0ZXN0ICJ4JGVuYWJsZV9jb21waWxlcl9jb3ZlcmFnZSIgPSAieHllcyI7IHRoZW4KKwlpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKwkJQ0ZMQUdTPSIkQ0ZMQUdTIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKwlmaQorZmldLFtlbmFibGVfY29tcGlsZXJfY292ZXJhZ2U9bm9dKWRubAorXSkjIENPTVBJTEVSX0NPVkVSQUdFCmRpZmYgLS1naXQgYS9tNC9sZC12ZXJzaW9uLXNjcmlwdC5tNCBiL200L2xkLXZlcnNpb24tc2NyaXB0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOGY1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9sZC12ZXJzaW9uLXNjcmlwdC5tNApAQCAtMCwwICsxLDQzIEBACisjIGxkLXZlcnNpb24tc2NyaXB0Lm00IHNlcmlhbCAxCitkbmwgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitkbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKK2RubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK2RubCBGcm9tIFNpbW9uIEpvc2Vmc3NvbgorCisjIEZJWE1FOiBUaGUgdGVzdCBiZWxvdyByZXR1cm5zIGEgZmFsc2UgcG9zaXRpdmUgZm9yIG1pbmd3CisjIGNyb3NzLWNvbXBpbGVzLCAnbG9jYWw6JyBzdGF0ZW1lbnRzIGRvZXMgbm90IHJlZHVjZSBudW1iZXIgb2YKKyMgZXhwb3J0ZWQgc3ltYm9scyBpbiBhIERMTC4gIFVzZSAtLWRpc2FibGUtbGQtdmVyc2lvbi1zY3JpcHQgdG8gd29yaworIyBhcm91bmQgdGhlIHByb2JsZW0uCisKKyMgZ2xfTERfVkVSU0lPTl9TQ1JJUFQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaWYgTEQgc3VwcG9ydHMgbGlua2VyIHNjcmlwdHMsIGFuZCBkZWZpbmUgYXV0b21ha2UgY29uZGl0aW9uYWwKKyMgSEFWRV9MRF9WRVJTSU9OX1NDUklQVCBpZiBzby4KK0FDX0RFRlVOKFtnbF9MRF9WRVJTSU9OX1NDUklQVF0sCitbCisgIEFDX0FSR19FTkFCTEUoW2xkLXZlcnNpb24tc2NyaXB0XSwKKyAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGQtdmVyc2lvbi1zY3JpcHRdLAorICAgICAgW2VuYWJsZSBsaW5rZXIgdmVyc2lvbiBzY3JpcHQgKGRlZmF1bHQgaXMgZW5hYmxlZCB3aGVuIHBvc3NpYmxlKV0pLAorICAgICAgW2hhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9JGVuYWJsZXZhbF0sIFtdKQorICBpZiB0ZXN0IC16ICIkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExEIC1XbCwtLXZlcnNpb24tc2NyaXB0IHdvcmtzXSkKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIExERkxBR1M9IiRMREZMQUdTIC1XbCwtLXZlcnNpb24tc2NyaXB0PWNvbmZ0ZXN0Lm1hcCIKKyAgICBjYXQgPiBjb25mdGVzdC5tYXAgPDxFT0YKK1ZFUlNfMSB7CisJZ2xvYmFsOiBzeW07Cit9OworCitWRVJTXzIgeworICAgICAgICBnbG9iYWw6IHN5bTsKK30gVkVSU18xOworRU9GCisgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbW11dKV0sCisgICAgICAgICAgICAgICAgICAgW2hhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9eWVzXSwgW2hhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9bm9dKQorICAgIHJtIC1mIGNvbmZ0ZXN0Lm1hcAorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgQUNfTVNHX1JFU1VMVCgkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCkKKyAgZmkKK10pCmRpZmYgLS1naXQgYS9tNC9wa2cubTQgYi9tNC9wa2cubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiZTc0NwotLS0gL2Rldi9udWxsCisrKyBiL200L3BrZy5tNApAQCAtMCwwICsxLDE1NSBAQAorIyBwa2cubTQgLSBNYWNyb3MgdG8gbG9jYXRlIGFuZCB1dGlsaXNlIHBrZy1jb25maWcuICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIworIyBDb3B5cmlnaHQgwqkgMjAwNCBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgUEtHX1BST0dfUEtHX0NPTkZJRyhbTUlOLVZFUlNJT05dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbUEtHX1BST0dfUEtHX0NPTkZJR10sCitbbTRfcGF0dGVybl9mb3JiaWQoW15fP1BLR19bQS1aX10rJF0pCittNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJRyhfUEFUSCk/JF0pCitBQ19BUkdfVkFSKFtQS0dfQ09ORklHXSwgW3BhdGggdG8gcGtnLWNvbmZpZyB1dGlsaXR5XSlkbmwKK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KKwlBQ19QQVRIX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCitmaQoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisJX3BrZ19taW5fdmVyc2lvbj1tNF9kZWZhdWx0KFskMV0sIFswLjkuMF0pCisJQUNfTVNHX0NIRUNLSU5HKFtwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb25dKQorCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCWVsc2UKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlQS0dfQ09ORklHPSIiCisJZmkKKworZmlbXWRubAorXSkjIFBLR19QUk9HX1BLR19DT05GSUcKKworIyBQS0dfQ0hFQ0tfRVhJU1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisjIENoZWNrIHRvIHNlZSB3aGV0aGVyIGEgcGFydGljdWxhciBzZXQgb2YgbW9kdWxlcyBleGlzdHMuICBTaW1pbGFyCisjIHRvIFBLR19DSEVDS19NT0RVTEVTKCksIGJ1dCBkb2VzIG5vdCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9ycy4KKyMKKyMKKyMgU2ltaWxhciB0byBQS0dfQ0hFQ0tfTU9EVUxFUywgbWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mCisjIHRoaXMgb3IgUEtHX0NIRUNLX01PRFVMRVMgaXMgY2FsbGVkLCBvciBtYWtlIHN1cmUgdG8gY2FsbAorIyBQS0dfQ0hFQ0tfRVhJU1RTIG1hbnVhbGx5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbUEtHX0NIRUNLX0VYSVNUU10sCitbQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pZG5sCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIEFDX1JVTl9MT0coWyRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICIkMSJdKTsgdGhlbgorICBtNF9pZnZhbChbJDJdLCBbJDJdLCBbOl0pCittNF9pZnZhbG4oWyQzXSwgW2Vsc2UKKyAgJDNdKWRubAorZmldKQorCisKKyMgX1BLR19DT05GSUcoW1ZBUklBQkxFXSwgW0NPTU1BTkRdLCBbTU9EVUxFU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfUEtHX0NPTkZJR10sCitbaWYgdGVzdCAtbiAiJCQxIjsgdGhlbgorICAgIHBrZ19jdl9bXSQxPSIkJDEiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBQS0dfQ0hFQ0tfRVhJU1RTKFskM10sCisgICAgICAgICAgICAgICAgICAgICBbcGtnX2N2X1tdJDE9YCRQS0dfQ09ORklHIC0tW10kMiAiJDMiIDI+L2Rldi9udWxsYF0sCisJCSAgICAgW3BrZ19mYWlsZWQ9eWVzXSkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaVtdZG5sCitdKSMgX1BLR19DT05GSUcKKworIyBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURURdLAorW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKQoraWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpW11kbmwKK10pIyBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKKworCisjIFBLR19DSEVDS19NT0RVTEVTKFZBUklBQkxFLVBSRUZJWCwgTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sCisjIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMKKyMKKyMgTm90ZSB0aGF0IGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhlIGZpcnN0IGNhbGwgdG8KKyMgUEtHX0NIRUNLX01PRFVMRVMgbWlnaHQgbm90IGhhcHBlbiwgeW91IHNob3VsZCBiZSBzdXJlIHRvIGluY2x1ZGUgYW4KKyMgZXhwbGljaXQgY2FsbCB0byBQS0dfUFJPR19QS0dfQ09ORklHIGluIHlvdXIgY29uZmlndXJlLmFjCisjCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbUEtHX0NIRUNLX01PRFVMRVNdLAorW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKWRubAorQUNfQVJHX1ZBUihbJDFdW19DRkxBR1NdLCBbQyBjb21waWxlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCitBQ19BUkdfVkFSKFskMV1bX0xJQlNdLCBbbGlua2VyIGZsYWdzIGZvciAkMSwgb3ZlcnJpZGluZyBwa2ctY29uZmlnXSlkbmwKKworcGtnX2ZhaWxlZD1ubworQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKQorCitfUEtHX0NPTkZJRyhbJDFdW19DRkxBR1NdLCBbY2ZsYWdzXSwgWyQyXSkKK19QS0dfQ09ORklHKFskMV1bX0xJQlNdLCBbbGlic10sIFskMl0pCisKK200X2RlZmluZShbX1BLR19URVhUXSwgW0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgJDFbXV9DRkxBR1MKK2FuZCAkMVtdX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgorU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuXSkKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgICAgICBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICAkMVtdX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzICIkMiIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgJDFbXV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAiJDIiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJCQxW11fUEtHX0VSUk9SUyIgPiZBU19NRVNTQUdFX0xPR19GRAorCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19FUlJPUihkbmwKK1tQYWNrYWdlIHJlcXVpcmVtZW50cyAoJDIpIHdlcmUgbm90IG1ldDoKKworJCQxX1BLR19FUlJPUlMKKworQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91CitpbnN0YWxsZWQgc29mdHdhcmUgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4LgorCitfUEtHX1RFWFQKK10pXSwKKwkJW0FDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAkNF0pCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19GQUlMVVJFKGRubAorW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgorCitfUEtHX1RFWFQKKworVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSldLAorCQlbJDRdKQorZWxzZQorCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUworCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCisgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJaWZlbHNlKFskM10sICwgOiwgWyQzXSkKK2ZpW11kbmwKK10pIyBQS0dfQ0hFQ0tfTU9EVUxFUwpkaWZmIC0tZ2l0IGEvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBiL200L3RwLWNvbXBpbGVyLWZsYWcubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZWFiYQotLS0gL2Rldi9udWxsCisrKyBiL200L3RwLWNvbXBpbGVyLWZsYWcubTQKQEAgLTAsMCArMSw0MyBAQAorZG5sIEEgdmVyc2lvbiBvZiBBU19DT01QSUxFUl9GTEFHIHRoYXQgc3VwcG9ydHMgYm90aCBDIGFuZCBDKysuCitkbmwgQmFzZWQgb246CisKK2RubCBhcy1jb21waWxlci1mbGFnLm00IDAuMS4wCitkbmwgYXV0b3N0YXJzIG00IG1hY3JvIGZvciBkZXRlY3Rpb24gb2YgY29tcGlsZXIgZmxhZ3MKK2RubCBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KK2RubCAkSWQ6IGFzLWNvbXBpbGVyLWZsYWcubTQsdiAxLjEgMjAwNS8wNi8xOCAxODowMjo0NiBidXJnZXJtYW4gRXhwICQKKworZG5sIFRQX0NPTVBJTEVSX0ZMQUcoQ0ZMQUdTLCBBQ1RJT04tSUYtQUNDRVBURUQsIFtBQ1RJT04tSUYtTk9ULUFDQ0VQVEVEXSkKK2RubCBUcmllcyB0byBjb21waWxlIHdpdGggdGhlIGdpdmVuIENGTEFHUyBhbmQgQ1hYRkxBR1MuCitkbmwKK2RubCBSdW5zIEFDVElPTi1JRi1BQ0NFUFRFRCBpZiB0aGUgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKK2RubCBBQ19MQU5HIGNhbiBjb21waWxlIHdpdGggdGhlIGZsYWdzLCBhbmQgQUNUSU9OLUlGLU5PVC1BQ0NFUFRFRCBvdGhlcndpc2UuCisKK0FDX0RFRlVOKFtUUF9DT01QSUxFUl9GTEFHXSwKK1sKKyAgQUNfTVNHX0NIRUNLSU5HKFt0byBzZWUgaWYgY29tcGlsZXIgdW5kZXJzdGFuZHMgJDFdKQorCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBzYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAkMSIKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkMSIKKworICBBQ19UUllfQ09NUElMRShbIF0sIFtdLCBbZmxhZ19vaz15ZXNdLCBbZmxhZ19vaz1ub10pCisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICBDWFhGTEFHUz0iJHNhdmVfQ1hYRkxBR1MiCisKKyAgaWYgdGVzdCAiWCRmbGFnX29rIiA9IFh5ZXMgOyB0aGVuCisgICAgJDIKKyAgICB0cnVlCisgIGVsc2UKKyAgICAkMworICAgIHRydWUKKyAgZmkKKyAgQUNfTVNHX1JFU1VMVChbJGZsYWdfb2tdKQorXSkKKworZG5sIFRQX0FERF9DT01QSUxFUl9GTEFHKFZBUklBQkxFLCBDRkxBR1MpCitkbmwgQXBwZW5kIENGTEFHUyB0byBWQVJJQUJMRSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlbS4KK0FDX0RFRlVOKFtUUF9BRERfQ09NUElMRVJfRkxBR10sCitbCisgIFRQX0NPTVBJTEVSX0ZMQUcoWyQyXSwgWyQxPSJbJF0kMSAkMiJdKQorXSkKZGlmZiAtLWdpdCBhL200L3RwLWNvbXBpbGVyLXdhcm5pbmdzLm00IGIvbTQvdHAtY29tcGlsZXItd2FybmluZ3MubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0YWYzMQotLS0gL2Rldi9udWxsCisrKyBiL200L3RwLWNvbXBpbGVyLXdhcm5pbmdzLm00CkBAIC0wLDAgKzEsNDkgQEAKK2RubCBUUF9DT01QSUxFUl9XQVJOSU5HUyhWQVJJQUJMRSwgV0VSUk9SX0JZX0RFRkFVTFQsIERFU0lSQUJMRSwgVU5ERVNJUkFCTEUpCitkbmwgJDEgKFZBUklBQkxFKTogdGhlIHZhcmlhYmxlIHRvIHB1dCBmbGFncyBpbnRvCitkbmwgJDIgKFdFUlJPUl9CWV9ERUZBVUxUKTogYSBjb21tYW5kIHJldHVybmluZyB0cnVlIGlmIC1XZXJyb3Igc2hvdWxkIGJlIHRoZQorZG5sICAgICBkZWZhdWx0CitkbmwgJDMgKERFU0lSQUJMRSk6IHdhcm5pbmcgZmxhZ3Mgd2Ugd2FudCAoZS5nLiBhbGwgZXh0cmEgc2hhZG93KQorZG5sICQ0IChVTkRFU0lSQUJMRSk6IHdhcm5pbmcgZmxhZ3Mgd2UgZG9uJ3Qgd2FudCAoZS5nLgorZG5sICAgbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgdW51c2VkLXBhcmFtZXRlcikKK0FDX0RFRlVOKFtUUF9DT01QSUxFUl9XQVJOSU5HU10sCitbCisgIEFDX1JFUVVJUkUoW0FDX0FSR19FTkFCTEVdKWRubAorICBBQ19SRVFVSVJFKFtBQ19IRUxQX1NUUklOR10pZG5sCisgIEFDX1JFUVVJUkUoW1RQX0NPTVBJTEVSX0ZMQUddKWRubAorCisgIHRwX3dhcm5pbmdzPSIiCisgIGZvciB0cF9mbGFnIGluICQzOyBkbworICAgIFRQX0NPTVBJTEVSX0ZMQUcoWy1XJHRwX2ZsYWddLCBbdHBfd2FybmluZ3M9IiR0cF93YXJuaW5ncyAtVyR0cF9mbGFnIl0pCisgIGRvbmUKKworICB0cF9lcnJvcl9mbGFncz0iLVdlcnJvciIKKyAgVFBfQ09NUElMRVJfRkxBRyhbLVdlcnJvcl0sIFt0cF93ZXJyb3I9eWVzXSwgW3RwX3dlcnJvcj1ub10pCisKKyAgZm9yIHRwX2ZsYWcgaW4gJDQ7IGRvCisgICAgVFBfQ09NUElMRVJfRkxBRyhbLVduby0kdHBfZmxhZ10sCisgICAgICBbdHBfd2FybmluZ3M9IiR0cF93YXJuaW5ncyAtV25vLSR0cF9mbGFnIl0pCitkbmwgWWVzLCB3ZSBkbyBuZWVkIHRvIHVzZSBib3RoIC1Xbm8tZm9vIGFuZCAtV25vLWVycm9yPWZvby4gU2ltb24gc2F5czoKK2RubCAgICAgc29tZSB3YXJuaW5ncyB3ZSBleHBsaWNpdGx5IGRvbid0IHdhbnQsIGxpa2UgdW51c2VkLXBhcmFtZXRlciwgYnV0CitkbmwgICAgIHRoZXkncmUgaW4gLVdhbGwuIHdoZW4gYSBkaXN0cm8gdXNpbmcgY2RicyBjb21waWxlcyB1cywgd2UgaGF2ZToKK2RubCAgICAgICAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAgICAgIC1XYWxsCitkbmwgICAgICAgICBeIGZyb20gdXMgICAgICAgICAgICAgICAgICAgICAgICAgXiBmcm9tIGNkYnMKK2RubCAgICAgd2hpY2ggdHVybnMgLVd1bnVzZWQtcGFyYW1ldGVyIGJhY2sgb24sIGluIGVmZmVjdAorICAgIFRQX0NPTVBJTEVSX0ZMQUcoWy1Xbm8tZXJyb3I9JHRwX2ZsYWddLAorICAgICAgW3RwX2Vycm9yX2ZsYWdzPSIkdHBfZXJyb3JfZmxhZ3MgLVduby1lcnJvcj0kdHBfZmxhZyJdLCBbdHBfd2Vycm9yPW5vXSkKKyAgZG9uZQorCisgIEFDX0FSR19FTkFCTEUoW1dlcnJvcl0sCisgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1XZXJyb3JdLAorICAgICAgW2NvbXBpbGUgd2l0aG91dCAtV2Vycm9yIChub3JtYWxseSBlbmFibGVkIGluIGRldmVsb3BtZW50IGJ1aWxkcyldKSwKKyAgICB0cF93ZXJyb3I9JGVuYWJsZXZhbCwgOikKKworICBpZiB0ZXN0ICJ4JHRwX3dlcnJvciIgPSB4eWVzICYmICQyOyB0aGVuCitkbmwgV2UgcHV0IC1Xbm8tZXJyb3I9Zm9vIGJlZm9yZSAtV25vLWZvbyBiZWNhdXNlIGNsYW5nIGludGVycHJldHMgLVdhbGwKK2RubCAtV2Vycm9yIC1Xbm8tZm9vIC1Xbm8tZXJyb3I9Zm9vIGFzIOKAnG1ha2UgZm9vIGEgbm9uLWZhdGFsIHdhcm5pbmfigJ0sIGJ1dCBkb2VzCitkbmwgd2hhdCB3ZSB3YW50IGlmIHlvdSByZXZlcnNlIHRoZW0uCisgICAgJDE9IiR0cF9lcnJvcl9mbGFncyAkdHBfd2FybmluZ3MiCisgIGVsc2UKKyAgICAkMT0iJHRwX3dhcm5pbmdzIgorICBmaQorCitdKQpkaWZmIC0tZ2l0IGEvbTQvdmlzaWJpbGl0eS5tNCBiL200L3Zpc2liaWxpdHkubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyZTM5NwotLS0gL2Rldi9udWxsCisrKyBiL200L3Zpc2liaWxpdHkubTQKQEAgLTAsMCArMSw3NyBAQAorIyB2aXNpYmlsaXR5Lm00IHNlcmlhbCA1IChnZXR0ZXh0LTAuMTguMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDgsIDIwMTAtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK2RubCBUZXN0cyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgorZG5sIC1mdmlzaWJpbGl0eT1oaWRkZW4gYW5kIHRoZSBmdW5jdGlvbiBhbmQgdmFyaWFibGUgYXR0cmlidXRlcworZG5sIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJoaWRkZW4iKSkpIGFuZAorZG5sIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKS4KK2RubCBEb2VzICpub3QqIHRlc3QgZm9yIF9fdmlzaWJpbGl0eV9fKCJwcm90ZWN0ZWQiKSAtIHdoaWNoIGhhcyB0cmlja3kKK2RubCBzZW1hbnRpY3MgKHNlZSB0aGUgJ3Zpc21haW4nIHRlc3QgaW4gZ2xpYmMpIGFuZCBkb2VzIG5vdCBleGlzdCBlLmcuIG9uCitkbmwgTWFjIE9TIFguCitkbmwgRG9lcyAqbm90KiB0ZXN0IGZvciBfX3Zpc2liaWxpdHlfXygiaW50ZXJuYWwiKSAtIHdoaWNoIGhhcyBwcm9jZXNzb3IKK2RubCBkZXBlbmRlbnQgc2VtYW50aWNzLgorZG5sIERvZXMgKm5vdCogdGVzdCBmb3IgI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGhpZGRlbikgLSB3aGljaCBpcworZG5sICJyZWFsbHkgb25seSByZWNvbW1lbmRlZCBmb3IgbGVnYWN5IGNvZGUiLgorZG5sIFNldCB0aGUgdmFyaWFibGUgQ0ZMQUdfVklTSUJJTElUWS4KK2RubCBEZWZpbmVzIGFuZCBzZXRzIHRoZSB2YXJpYWJsZSBIQVZFX1ZJU0lCSUxJVFkuCisKK0FDX0RFRlVOKFtnbF9WSVNJQklMSVRZXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgIENGTEFHX1ZJU0lCSUxJVFk9CisgIEhBVkVfVklTSUJJTElUWT0wCisgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgZG5sIEZpcnN0LCBjaGVjayB3aGV0aGVyIC1XZXJyb3IgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUsIG9yCisgICAgZG5sIHdoZXRoZXIgaXQgbGVhZHMgdG8gYW4gZXJyb3IgYmVjYXVzZSBvZiBzb21lIG90aGVyIG9wdGlvbiB0aGF0IHRoZQorICAgIGRubCB1c2VyIGhhcyBwdXQgaW50byAkQ0MgJENGTEFHUyAkQ1BQRkxBR1MuCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAtV2Vycm9yIG9wdGlvbiBpcyB1c2FibGVdKQorICAgIEFDX0NBQ0hFX1ZBTChbZ2xfY3ZfY2NfdmlzX3dlcnJvcl0sIFsKKyAgICAgIGdsX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCisgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKKyAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbW11dKV0sCisgICAgICAgIFtnbF9jdl9jY192aXNfd2Vycm9yPXllc10sCisgICAgICAgIFtnbF9jdl9jY192aXNfd2Vycm9yPW5vXSkKKyAgICAgIENGTEFHUz0iJGdsX3NhdmVfQ0ZMQUdTIl0pCisgICAgQUNfTVNHX1JFU1VMVChbJGdsX2N2X2NjX3Zpc193ZXJyb3JdKQorICAgIGRubCBOb3cgY2hlY2sgd2hldGhlciB2aXNpYmlsaXR5IGRlY2xhcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHNpbXBsZSB2aXNpYmlsaXR5IGRlY2xhcmF0aW9uc10pCisgICAgQUNfQ0FDSEVfVkFMKFtnbF9jdl9jY192aXNpYmlsaXR5XSwgWworICAgICAgZ2xfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKyAgICAgIGRubCBXZSB1c2UgdGhlIG9wdGlvbiAtV2Vycm9yIGFuZCBhIGZ1bmN0aW9uIGR1bW15ZnVuYywgYmVjYXVzZSBvbiBzb21lCisgICAgICBkbmwgcGxhdGZvcm1zIChDeWd3aW4gMS43KSB0aGUgdXNlIG9mIC1mdmlzaWJpbGl0eSB0cmlnZ2VycyBhIHdhcm5pbmcKKyAgICAgIGRubCAidmlzaWJpbGl0eSBhdHRyaWJ1dGUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb247IGlnbm9yZWQiCisgICAgICBkbmwgYXQgdGhlIGZpcnN0IGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gZXZlcnkgY29tcGlsYXRpb24gdW5pdCwgYW5kIHdlCisgICAgICBkbmwgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG9wdGlvbiBpbiB0aGlzIGNhc2UuCisgICAgICBpZiB0ZXN0ICRnbF9jdl9jY192aXNfd2Vycm9yID0geWVzOyB0aGVuCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgorICAgICAgZmkKKyAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAorICAgICAgICBbQUNfTEFOR19QUk9HUkFNKAorICAgICAgICAgICBbW2V4dGVybiBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiaGlkZGVuIikpKSBpbnQgaGlkZGVudmFyOworICAgICAgICAgICAgIGV4dGVybiBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkgaW50IGV4cG9ydGVkdmFyOworICAgICAgICAgICAgIGV4dGVybiBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiaGlkZGVuIikpKSBpbnQgaGlkZGVuZnVuYyAodm9pZCk7CisgICAgICAgICAgICAgZXh0ZXJuIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKSBpbnQgZXhwb3J0ZWRmdW5jICh2b2lkKTsKKyAgICAgICAgICAgICB2b2lkIGR1bW15ZnVuYyAodm9pZCkge30KKyAgICAgICAgICAgXV0sCisgICAgICAgICAgIFtbXV0pXSwKKyAgICAgICAgW2dsX2N2X2NjX3Zpc2liaWxpdHk9eWVzXSwKKyAgICAgICAgW2dsX2N2X2NjX3Zpc2liaWxpdHk9bm9dKQorICAgICAgQ0ZMQUdTPSIkZ2xfc2F2ZV9DRkxBR1MiXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskZ2xfY3ZfY2NfdmlzaWJpbGl0eV0pCisgICAgaWYgdGVzdCAkZ2xfY3ZfY2NfdmlzaWJpbGl0eSA9IHllczsgdGhlbgorICAgICAgQ0ZMQUdfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKyAgICAgIEhBVkVfVklTSUJJTElUWT0xCisgICAgZmkKKyAgZmkKKyAgQUNfU1VCU1QoW0NGTEFHX1ZJU0lCSUxJVFldKQorICBBQ19TVUJTVChbSEFWRV9WSVNJQklMSVRZXSkKKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtIQVZFX1ZJU0lCSUxJVFldLCBbJEhBVkVfVklTSUJJTElUWV0sCisgICAgW0RlZmluZSB0byAxIG9yIDAsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBzaW1wbGUgdmlzaWJpbGl0eSBkZWNsYXJhdGlvbnMuXSkKK10pCmRpZmYgLS1naXQgYS90ZXN0Ly5naXRpZ25vcmUgYi90ZXN0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzN2RlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMwIEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5sbworKi5sYQorKi5vCitlY2hvLXNlcnZlcgorZWNoby1jbGllbnQKK2J1cy10ZXN0Cit1bmJhc2U2NAorKi5iYgorKi5iYmcKKyouZGEKKyouZ2NvdgorYnJlYWstbG9hZGVyCitzcGF3bi10ZXN0Cit0ZXN0LWNvcnJ1cHQKK3Rlc3QtZXhpdAordGVzdC1zZWdmYXVsdAordGVzdC1zZXJ2aWNlCit0ZXN0LXNsZWVwLWZvcmV2ZXIKK2RlY29kZS1nY292CitzaGVsbC10ZXN0Cit0ZXN0LXNoZWxsLXNlcnZpY2UKK3Rlc3QtbmFtZXMKK3Rlc3QtbG9vcGJhY2sKK3Rlc3QtcmVsYXkKK3Rlc3QtZGJ1cy1kYWVtb24KK3Rlc3QtbWFyc2hhbApkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0Y2RkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NTMgQEAKKyMjIHRoZSAibmFtZS10ZXN0IiBzdWJkaXIgaW4gZmFjdCBjb250YWlucyBhIGJ1bmNoIG9mIHRlc3RzIG5vdyB0aGF0IG5lZWQgYSB0ZW1wb3JhcnkgYnVzIAorIyMgdG8gYmUgcnVubmluZyB0byBkbyBzdHVmZiB3aXRoLiBUaGUgZGlyZWN0b3J5IHNob3VsZCBiZSByZW5hbWVkLgorIyMgV2Ugd2FudCB0byBidWlsZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3QgdG8gcGljayB1cCB0aGUgdGVzdHV0aWxzIGxpYgorU1VCRElSUz0gLiBuYW1lLXRlc3QgCitESVNUX1NVQkRJUlM9bmFtZS10ZXN0CisKK0NMRUFORklMRVMgPQorRVhUUkFfRElTVCA9CisKK0FNX0NQUEZMQUdTID0gXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHUykgXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJJChHTElCX0NGTEFHUykgXAorCSQoTlVMTCkKKworIyBpbXByb3ZlIGJhY2t0cmFjZXMgZnJvbSB0ZXN0IHN0dWZmCitBTV9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCisKK2xpYmRidXNfdGVzdHV0aWxzX2xhX1NPVVJDRVMgPSBcCisJdGVzdC11dGlscy5jIFwKKwl0ZXN0LXV0aWxzLmggXAorCSQoTlVMTCkKKworaWYgREJVU19XSVRIX0dMSUIKK2xpYmRidXNfdGVzdHV0aWxzX2xhX1NPVVJDRVMgKz0gXAorCXRlc3QtdXRpbHMtZ2xpYi5jIFwKKwl0ZXN0LXV0aWxzLWdsaWIuaCBcCisJJChOVUxMKQorZW5kaWYKKworbGliZGJ1c190ZXN0dXRpbHNfbGFfTElCQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisJJChOVUxMKQorCitURVNUX0VYVEVOU0lPTlMgPSAuc2gKKworTE9HX0RSSVZFUiA9IGVudiBBTV9UQVBfQVdLPSckKEFXSyknICQoU0hFTEwpICQodG9wX3NyY2RpcikvYnVpbGQtYXV4L3RhcC1kcml2ZXIuc2gKK0xPR19DT01QSUxFUiA9ICQoc3JjZGlyKS9nbGliLXRhcC10ZXN0LnNoCitTSF9MT0dfRFJJVkVSID0gJChMT0dfRFJJVkVSKQorU0hfTE9HX0NPTVBJTEVSID0gJChTSEVMTCkKK0VYVFJBX0RJU1QgKz0gZ2xpYi10YXAtdGVzdC5zaAorRVhUUkFfRElTVCArPSB0YXAtdGVzdC5zaC5pbgorCitURVNUUyA9CisKK2lmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjIyBicmVhay1sb2FkZXIgcmVtb3ZlZCBmb3Igbm93CisjIyB0aGVzZSBiaW5hcmllcyBhcmUgdXNlZCBpbiB0ZXN0cyBidXQgYXJlIG5vdCB0aGVtc2VsdmVzIHRlc3RzCitURVNUX0JJTkFSSUVTID0gXAorCXRlc3Qtc3Bhd24gXAorCXRlc3QtZXhpdCBcCisJdGVzdC1uYW1lcyBcCisJdGVzdC1zZWdmYXVsdCBcCisJdGVzdC1zZXJ2aWNlIFwKKwl0ZXN0LXNoZWxsLXNlcnZpY2UgXAorCXRlc3Qtc2xlZXAtZm9yZXZlciBcCisJJChOVUxMKQorCisjIyBUaGVzZSBhcmUgY29uY2VwdHVhbGx5IHBhcnQgb2YgZGlyZWN0b3JpZXMgdGhhdCBjb21lIGVhcmxpZXIgaW4gU1VCRElSUworIyMgb3JkZXIsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJ1biB0aGVtIHRpbCB3ZSBhcnJpdmUgaW4gdGhpcyBkaXJlY3RvcnksCisjIyBzaW5jZSB0aGV5IGRlcGVuZCBvbiBzdHVmZiBmcm9tIHRoaXMgZGlyZWN0b3J5LiBXZSB3cmFwIHRoZW0gaW4gYQorIyMgc2ltcGxlIHNoZWxsIHNjcmlwdCB0byBnZXQgVEFQIG91dHB1dC4KKword3JhcF9idXNfdGVzdHMgPSB0ZXN0LWJ1cy5zaAord3JhcF9kYnVzX3Rlc3RzID0gdGVzdC1kYnVzLnNoCisKK2lmIERCVVNfVU5JWAord3JhcF9idXNfdGVzdHMgKz0gdGVzdC1idXMtbGF1bmNoLWhlbHBlci5zaAord3JhcF9idXNfdGVzdHMgKz0gdGVzdC1idXMtc3lzdGVtLnNoCitlbmRpZgorCitURVNUUyArPSAkKHdyYXBfYnVzX3Rlc3RzKSAkKHdyYXBfZGJ1c190ZXN0cykKK0NMRUFORklMRVMgKz0gJCh3cmFwX2J1c190ZXN0cykgJCh3cmFwX2RidXNfdGVzdHMpCisKKyQod3JhcF9idXNfdGVzdHMpOiB0ZXN0LWJ1cyUuc2g6IC4uL2J1cy90ZXN0LWJ1cyUkKEVYRUVYVCkgdGFwLXRlc3Quc2guaW4gTWFrZWZpbGUKKwlzZWQgLWUgJ3MhW0BdUlVOW0BdISQ8IScgXAorCQk8ICQoc3JjZGlyKS90YXAtdGVzdC5zaC5pbiA+ICRACisKKyQod3JhcF9kYnVzX3Rlc3RzKTogdGVzdC1kYnVzJS5zaDogLi4vZGJ1cy90ZXN0LWRidXMlJChFWEVFWFQpIHRhcC10ZXN0LnNoLmluIE1ha2VmaWxlCisJc2VkIC1lICdzIVtAXVJVTltAXSEkPCEnIFwKKwkJPCAkKHNyY2RpcikvdGFwLXRlc3Quc2guaW4gPiAkQAorCitlbHNlICFEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitURVNUX0JJTkFSSUVTPQorCitlbmRpZiAhREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworbm9pbnN0X1BST0dSQU1TPSAkKFRFU1RfQklOQVJJRVMpCisKK3Rlc3Rfc2VydmljZV9MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCit0ZXN0X25hbWVzX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKKyMjIGJyZWFrX2xvYWRlcl9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKK3Rlc3Rfc2hlbGxfc2VydmljZV9MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCit0ZXN0X3NoZWxsX1NPVVJDRVMgPSBzaGVsbC10ZXN0LmMKK3Rlc3Rfc2hlbGxfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYQordGVzdF9zcGF3bl9TT1VSQ0VTID0gc3Bhd24tdGVzdC5jCit0ZXN0X3NwYXduX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQorCit0ZXN0X3ByaW50Zl9TT1VSQ0VTID0gaW50ZXJuYWxzL3ByaW50Zi5jCit0ZXN0X3ByaW50Zl9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKKwordGVzdF9yZWZzX1NPVVJDRVMgPSBpbnRlcm5hbHMvcmVmcy5jCit0ZXN0X3JlZnNfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKEdMSUJfTElCUykKKwordGVzdF9zeXNsb2dfU09VUkNFUyA9IGludGVybmFscy9zeXNsb2cuYwordGVzdF9zeXNsb2dfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKEdMSUJfTElCUykKKworbWFudWFsX2Rpcl9pdGVyX1NPVVJDRVMgPSBtYW51YWwtZGlyLWl0ZXIuYworbWFudWFsX2Rpcl9pdGVyX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQorCittYW51YWxfcGF0aHNfU09VUkNFUyA9IG1hbnVhbC1wYXRocy5jCittYW51YWxfcGF0aHNfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCisKK21hbnVhbF90Y3BfU09VUkNFUyA9IG1hbnVhbC10Y3AuYworbWFudWFsX3RjcF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKKworRVhUUkFfRElTVCArPSBkYnVzLXRlc3QtcnVubmVyCisKK3Rlc3RleGVjZGlyID0gJChsaWJleGVjZGlyKS9pbnN0YWxsZWQtdGVzdHMvZGJ1cwordGVzdG1ldGFkaXIgPSAkKGRhdGFkaXIpL2luc3RhbGxlZC10ZXN0cy9kYnVzCisKK2Rpc3RfdGVzdGV4ZWNfU0NSSVBUUyA9Cit0ZXN0ZXhlY19QUk9HUkFNUyA9Cit0ZXN0bWV0YV9EQVRBID0KKworaW5zdGFsbGFibGVfdGVzdHMgPSBcCisJdGVzdC1zaGVsbCBcCisJdGVzdC1wcmludGYgXAorCSQoTlVMTCkKK2luc3RhbGxhYmxlX21hbnVhbF90ZXN0cyA9IFwKKwltYW51YWwtZGlyLWl0ZXIgXAorCW1hbnVhbC10Y3AgXAorCSQoTlVMTCkKK2Rpc3RfaW5zdGFsbGFibGVfdGVzdF9zY3JpcHRzID0gXAorCSQoTlVMTCkKKworaWYgREJVU19XSU4KK2luc3RhbGxhYmxlX21hbnVhbF90ZXN0cyArPSBtYW51YWwtcGF0aHMKK2VuZGlmCisKK2lmIERCVVNfV0lUSF9HTElCCitpbnN0YWxsYWJsZV90ZXN0cyArPSBcCisJdGVzdC1jb3JydXB0IFwKKwl0ZXN0LWRidXMtZGFlbW9uIFwKKwl0ZXN0LWRidXMtZGFlbW9uLWVhdmVzZHJvcCBcCisJdGVzdC1mZHBhc3MgXAorCXRlc3QtbW9uaXRvciBcCisJdGVzdC1sb29wYmFjayBcCisJdGVzdC1tYXJzaGFsIFwKKwl0ZXN0LXJlZnMgXAorCXRlc3QtcmVsYXkgXAorCXRlc3Qtc3ludGF4IFwKKwl0ZXN0LXN5c2xvZyBcCisJdGVzdC11aWQtcGVybWlzc2lvbnMgXAorCSQoTlVMTCkKKworaWYgREJVU19VTklYCitpbnN0YWxsYWJsZV90ZXN0cyArPSBcCisJdGVzdC1zZC1hY3RpdmF0aW9uIFwKKwkkKE5VTEwpCisKK2Rpc3RfaW5zdGFsbGFibGVfdGVzdF9zY3JpcHRzICs9IFwKKwl0ZXN0LWRidXMtZGFlbW9uLWZvcmsuc2ggXAorCSQoTlVMTCkKKworIyBUZXN0aW5nIGRidXMtbGF1bmNoIHJlbGllcyBvbiBzcGVjaWFsIGNvZGUgaW4gdGhhdCBiaW5hcnkuCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHMgKz0gXAorCXRlc3QtZGJ1cy1sYXVuY2gtZXZhbC5zaCBcCisJdGVzdC1kYnVzLWxhdW5jaC14MTEuc2ggXAorCSQoTlVMTCkKK2VuZGlmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKK2VuZGlmIERCVVNfVU5JWAorCitpbnN0YWxsYWJsZV9tYW51YWxfdGVzdHMgKz0gXAorCW1hbnVhbC1hdXRoeiBcCisJJChOVUxMKQorZW5kaWYgREJVU19XSVRIX0dMSUIKKworaW5zdGFsbGFibGVfdGVzdF9tZXRhID0gXAorCSQoZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHM6PS50ZXN0KSBcCisJJChpbnN0YWxsYWJsZV90ZXN0czo9LnRlc3QpIFwKKwkkKE5VTEwpCitpbnN0YWxsYWJsZV90ZXN0X21ldGFfd2l0aF9jb25maWcgPSBcCisJJChkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0czo9X3dpdGhfY29uZmlnLnRlc3QpIFwKKwkkKGluc3RhbGxhYmxlX3Rlc3RzOj1fd2l0aF9jb25maWcudGVzdCkgXAorCSQoTlVMTCkKKworaW5zdGFsbGNoZWNrX3Rlc3RzID0KK2luc3RhbGxjaGVja19lbnZpcm9ubWVudCA9IFwKKwlleHBvcnQgWERHX1JVTlRJTUVfRElSPUBhYnNfdG9wX2J1aWxkZGlyQC90ZXN0L1hER19SVU5USU1FX0RJUjsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREFFTU9OPSQoREVTVERJUikkKERCVVNfREFFTU9ORElSKS9kYnVzLWRhZW1vbiQoRVhFRVhUKTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREJVU19MQVVOQ0g9JChERVNURElSKSQoYmluZGlyKS9kYnVzLWxhdW5jaCQoRVhFRVhUKTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREJVU19NT05JVE9SPSQoREVTVERJUikkKGJpbmRpcikvZGJ1cy1tb25pdG9yJChFWEVFWFQpOyBcCisJZXhwb3J0IERCVVNfVEVTVF9EQlVTX1NFTkQ9JChERVNURElSKSQoYmluZGlyKS9kYnVzLXNlbmQkKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0hPTUVESVI9QGFic190b3BfYnVpbGRkaXJAL2RidXM7IFwKKwlleHBvcnQgREJVU19URVNUX0RBVEFESVI9JChERVNURElSKSQoZGF0YWRpcik7IFwKKwkke05VTEx9CisKK0FNX1RFU1RTX0VOVklST05NRU5UID0gXAorCWV4cG9ydCBYREdfUlVOVElNRV9ESVI9QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvWERHX1JVTlRJTUVfRElSOyBcCisJZXhwb3J0IERCVVNfRkFUQUxfV0FSTklOR1M9MTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREFFTU9OPUBhYnNfdG9wX2J1aWxkZGlyQC9idXMvZGJ1cy1kYWVtb24kKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RCVVNfTEFVTkNIPUBhYnNfdG9wX2J1aWxkZGlyQC90b29scy9kYnVzLWxhdW5jaCQoRVhFRVhUKTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREJVU19NT05JVE9SPUBhYnNfdG9wX2J1aWxkZGlyQC90b29scy9kYnVzLW1vbml0b3IkKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RCVVNfU0VORD1AYWJzX3RvcF9idWlsZGRpckAvdG9vbHMvZGJ1cy1zZW5kJChFWEVFWFQpOyBcCisJZXhwb3J0IERCVVNfVEVTVF9EQVRBPUBhYnNfdG9wX2J1aWxkZGlyQC90ZXN0L2RhdGE7IFwKKwlleHBvcnQgREJVU19URVNUX0hPTUVESVI9QGFic190b3BfYnVpbGRkaXJAL2RidXM7IFwKKwkkKE5VTEwpCisKK21hbnVhbF9hdXRoel9TT1VSQ0VTID0gbWFudWFsLWF1dGh6LmMKK21hbnVhbF9hdXRoel9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfY29ycnVwdF9TT1VSQ0VTID0gY29ycnVwdC5jCit0ZXN0X2NvcnJ1cHRfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X2xvb3BiYWNrX1NPVVJDRVMgPSBsb29wYmFjay5jCit0ZXN0X2xvb3BiYWNrX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF9yZWxheV9TT1VSQ0VTID0gcmVsYXkuYwordGVzdF9yZWxheV9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfZGJ1c19kYWVtb25fU09VUkNFUyA9IGRidXMtZGFlbW9uLmMKK3Rlc3RfZGJ1c19kYWVtb25fTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X2RidXNfZGFlbW9uX2VhdmVzZHJvcF9TT1VSQ0VTID0gZGJ1cy1kYWVtb24tZWF2ZXNkcm9wLmMKK3Rlc3RfZGJ1c19kYWVtb25fZWF2ZXNkcm9wX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKworaWYgREJVU19VTklYCit0ZXN0X3NkX2FjdGl2YXRpb25fU09VUkNFUyA9IFwKKyAgICBzZC1hY3RpdmF0aW9uLmMgXAorICAgICQoTlVMTCkKK3Rlc3Rfc2RfYWN0aXZhdGlvbl9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCitlbmRpZgorCit0ZXN0X21hcnNoYWxfU09VUkNFUyA9IG1hcnNoYWwuYwordGVzdF9tYXJzaGFsX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF9tb25pdG9yX1NPVVJDRVMgPSBcCisgICAgbW9uaXRvci5jIFwKKyAgICAkKE5VTEwpCit0ZXN0X21vbml0b3JfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X3N5bnRheF9TT1VSQ0VTID0gc3ludGF4LmMKK3Rlc3Rfc3ludGF4X0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF91aWRfcGVybWlzc2lvbnNfU09VUkNFUyA9IFwKKyAgICB1aWQtcGVybWlzc2lvbnMuYyBcCisgICAgJChOVUxMKQordGVzdF91aWRfcGVybWlzc2lvbnNfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X2ZkcGFzc19TT1VSQ0VTID0gXAorICAgIGZkcGFzcy5jIFwKKyAgICAkKE5VTEwpCit0ZXN0X2ZkcGFzc19MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK1RFU1RTICs9ICQoZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHMpCitpbnN0YWxsY2hlY2tfdGVzdHMgKz0gJChkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0cykKKworaWYgREJVU19FTkFCTEVfTU9EVUxBUl9URVNUUworVEVTVFMgKz0gJChpbnN0YWxsYWJsZV90ZXN0cykKK2luc3RhbGxjaGVja190ZXN0cyArPSAkKGluc3RhbGxhYmxlX3Rlc3RzKQorCitpZiBEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKyAgdGVzdGV4ZWNfUFJPR1JBTVMgKz0gJChpbnN0YWxsYWJsZV90ZXN0cykgJChpbnN0YWxsYWJsZV9tYW51YWxfdGVzdHMpCisgIGRpc3RfdGVzdGV4ZWNfU0NSSVBUUyArPSAkKGRpc3RfaW5zdGFsbGFibGVfdGVzdF9zY3JpcHRzKQorCisgIHRlc3RtZXRhX0RBVEEgKz0gJChpbnN0YWxsYWJsZV90ZXN0X21ldGEpCisgIHRlc3RtZXRhX0RBVEEgKz0gJChpbnN0YWxsYWJsZV90ZXN0X21ldGFfd2l0aF9jb25maWcpCitlbHNlICFEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKyAgbm9pbnN0X1BST0dSQU1TICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpICQoaW5zdGFsbGFibGVfbWFudWFsX3Rlc3RzKQorZW5kaWYgIURCVVNfRU5BQkxFX0lOU1RBTExFRF9URVNUUworCitlbmRpZiBEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTCisKKyMgSWYgd2UncmUgaW5zdGFsbGluZyB0aGUgdGVzdHMgaW50byBhIERFU1RESVIgd2UgY2FuJ3QgcnVuIHRoZW0KKyMgYWdhaW4gdXNpbmcgdGhlIGluc3RhbGxlZCBjb3B5LCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvCisjIGRvIGEgcG9ydGFibGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIExEX0xJQlJBUllfUEFUSC4KK2luc3RhbGxjaGVjay1sb2NhbDoKKwkkKE1BS0UpIGNoZWNrLVRFU1RTIFRFU1RTPSckJChpbnN0YWxsY2hlY2tfdGVzdHMpJyBcCisJCUFNX1RFU1RTX0VOVklST05NRU5UPSckJChpbnN0YWxsY2hlY2tfZW52aXJvbm1lbnQpJworaWYgREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisJdGVzdCAtbiAiJChERVNURElSKSIgfHwgeyBcCisJJChpbnN0YWxsY2hlY2tfZW52aXJvbm1lbnQpIFwKKwkJJChzcmNkaXIpL2RidXMtdGVzdC1ydW5uZXIgXAorCQkkKHRlc3RleGVjZGlyKSBcCisJCSQoaW5zdGFsbGFibGVfdGVzdHMpOyB9CitlbmRpZiBEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKworaW5fZGF0YSA9IFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9mb3JiaWRkaW5nLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2luY29taW5nLWxpbWl0LmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL211bHRpLXVzZXIuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtZC1hY3RpdmF0aW9uLmNvbmYuaW4gXAorCWRhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZS5pbiBcCisJZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluIFwKKwlkYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbiBcCisJJChOVUxMKQorCitFWFRSQV9ESVNUICs9ICQoaW5fZGF0YSkKKworc3RhdGljX2RhdGEgPSBcCisJbmFtZS10ZXN0L3RtcC1zZXNzaW9uLWxpa2Utc3lzdGVtLmNvbmYgXAorCWRhdGEvYXV0aC9hbm9ueW1vdXMtY2xpZW50LXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9hbm9ueW1vdXMtc2VydmVyLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9jYW5jZWwuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9jbGllbnQtb3V0LW9mLW1lY2hhbmlzbXMuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9leHRlcm5hbC1mYWlsZWQuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9leHRlcm5hbC1yb290LmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZXh0ZXJuYWwtc2lsbHkuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9leHRlcm5hbC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9mYWlsLWFmdGVyLW4tYXR0ZW1wdHMuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC1jbGllbnQuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL21lY2hhbmlzbXMuYXV0aC1zY3JpcHQgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTEuY29uZiBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMi5jb25mIFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQvYmFzaWMuY29uZiBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMS5jb25mIFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0yLmNvbmYgXAorCWRhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTEuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy90cnVuY2F0ZWQtZmlsZS5jb25mIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdyBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvbm8tZG90LWluLW5hbWUubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLWJ5LWZhci5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UgXAorCWRhdGEvc2hhLTEvUmVhZG1lLnR4dCBcCisJZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEgXAorCWRhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEgXAorCWRhdGEvc2hhLTEvYnl0ZS1oYXNoZXMuc2hhMSBcCisJZGF0YS9zaGEtMS9ieXRlLW1lc3NhZ2VzLnNoYTEgXAorCWRhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEuc2VydmljZSBcCisJZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMi5zZXJ2aWNlIFwKKwlkYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzLnNlcnZpY2UgXAorCWRhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL29yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5zZXJ2aWNlIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2xpc3Rlbi11bml4LXJ1bnRpbWUuY29uZiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vc3lzdGVtLmQvdGVzdC5jb25mIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtYWNxdWlyZS1zZXJ2aWNlLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlIFwKKwkkKE5VTEwpCisKK0VYVFJBX0RJU1QgKz0gJChzdGF0aWNfZGF0YSkKKworIyMgY29weSB0ZXN0cyB0byBidWlsZGRpciBzbyB0aGF0IGdlbmVyYXRlZCB0ZXN0cyBhbmQgc3RhdGljIHRlc3RzCisjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KK2FsbC1sb2NhbDogY29weS1jb25maWctbG9jYWwgdW5pbnN0YWxsZWQtY29uZmlnLWxvY2FsCisJQDoKKworY29weS1jb25maWctbG9jYWw6CisJJChBTV9WX2F0KSQoTUtESVJfUCkgZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5kCisJJChBTV9WX0dFTilzZXQgLWU7IFwKKwlpZiB0ZXN0ICQoc3JjZGlyKSA9IC4gfHwgdGVzdCAkKHNyY2RpcikgLWVmIC47IHRoZW4gXAorCQllY2hvICctLSBObyBuZWVkIHRvIGNvcHkgdGVzdCBkYXRhIGFzIHNyY2RpciA9IGJ1aWxkZGlyJzsgXAorCWVsc2UgXAorCQlmb3IgRiBpbiAkKHN0YXRpY19kYXRhKTsgZG8gXAorCQkJJChNS0RJUl9QKSAiJCR7RiUvKn0iOyBcCisJCQlybSAtZiAiJCRGIjsgXAorCQkJY3AgJChzcmNkaXIpLyIkJEYiICIkJEYiOyBcCisJCWRvbmU7IFwKKwlmaQorCit1bmluc3RhbGxlZC1jb25maWctbG9jYWw6CisJJChBTV9WX0dFTilzZXQgLWU7IFwKKwlmb3IgRiBpbiAkKGluX2RhdGEpOyBkbyBcCisJCSQoTUtESVJfUCkgIiQke0YlLyp9IjsgXAorCQlzZWQgXAorCQkJLWUgJ3MsW0BdREJVU19URVNUX0RBVEFbQF0sQGFic19idWlsZGRpckAvZGF0YSwnIFwKKwkJCS1lICdzLFtAXURCVVNfVEVTVF9FWEVDW0BdLEBhYnNfYnVpbGRkaXJALCcgXAorCQkJLWUgJ3MsW0BdRVhFRVhUW0BdLCQoRVhFRVhUKSwnIFwKKwkJCS1lICdzLFtAXVRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllbQF0sQGFic190b3BfYnVpbGRkaXJAL2J1cy9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QkKEVYRUVYVCksJyBcCisJCQktZSAncyxbQF1URVNUX0xJU1RFTltAXSwkKFRFU1RfTElTVEVOKSwnIFwKKwkJCTwgJChzcmNkaXIpLyIkJEYiID4gIiQke0YlLmlufSI7IFwKKwlkb25lCisKK2luc3RhbGxhYmxlLWNvbmZpZy1sb2NhbDoKK2lmIERCVVNfRU5BQkxFX0lOU1RBTExFRF9URVNUUworCSQoQU1fVl9HRU4pc2V0IC1lOyBcCisJZm9yIEYgaW4gJChpbl9kYXRhKTsgZG8gXAorCQkkKE1LRElSX1ApICJpbnN0YWxsYWJsZS8kJHtGJS8qfSI7IFwKKwkJc2VkIFwKKwkJCS1lICdzLFtAXURCVVNfVEVTVF9EQVRBW0BdLCQodGVzdGV4ZWNkaXIpL2RhdGEsJyBcCisJCQktZSAncyxbQF1EQlVTX1RFU1RfRVhFQ1tAXSwkKHRlc3RleGVjZGlyKSwnIFwKKwkJCS1lICdzLFtAXUVYRUVYVFtAXSwkKEVYRUVYVCksJyBcCisJCQktZSAncyxbQF1URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZW0BdLC9iaW4vZmFsc2UsJyBcCisJCQktZSAncyxbQF1URVNUX0xJU1RFTltAXSwkKFRFU1RfTElTVEVOKSwnIFwKKwkJCTwgJChzcmNkaXIpLyIkJEYiID4gImluc3RhbGxhYmxlLyQke0YlLmlufSI7IFwKKwlkb25lCitlbHNlCisJQDoKK2VuZGlmCisKKworaW5zdGFsbC1kYXRhLWxvY2FsOiBpbnN0YWxsLWNvbmZpZy1sb2NhbAorCUA6CisKK2luc3RhbGwtY29uZmlnLWxvY2FsOiBpbnN0YWxsYWJsZS1jb25maWctbG9jYWwKK2lmIERCVVNfRU5BQkxFX0lOU1RBTExFRF9URVNUUworCSQoQU1fVl9HRU4pc2V0IC1lOyBcCisJZm9yIEYgaW4gJChzdGF0aWNfZGF0YSk7IGRvIFwKKwkJaW5zdGFsbCAtZCAiJChERVNURElSKSQodGVzdGV4ZWNkaXIpLyQke0YlLyp9IjsgXAorCQlpbnN0YWxsIC1tNjQ0ICIkKHNyY2RpcikvJCRGIiAiJChERVNURElSKSQodGVzdGV4ZWNkaXIpLyQkRiI7IFwKKwlkb25lOyBcCisJZm9yIEYgaW4gJChpbl9kYXRhKTsgZG8gXAorCQlpbnN0YWxsIC1kICIkKERFU1RESVIpJCh0ZXN0ZXhlY2RpcikvJCR7RiUvKn0iOyBcCisJCWluc3RhbGwgLW02NDQgImluc3RhbGxhYmxlLyQke0YlLmlufSIgIiQoREVTVERJUikkKHRlc3RleGVjZGlyKS8kJHtGJS5pbn0iOyBcCisJZG9uZQorCWxuIC1uZnMgJChkYXRhZGlyKS9kYnVzLTEvc2Vzc2lvbi5jb25mICQoREVTVERJUikkKHRlc3RleGVjZGlyKS9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYKKwlsbiAtbmZzICQoZGF0YWRpcikvZGJ1cy0xL3N5c3RlbS5jb25mICQoREVTVERJUikkKHRlc3RleGVjZGlyKS9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vc3lzdGVtLmNvbmYKK2Vsc2UKKwlAOgorZW5kaWYKKworIyMgdGhpcyBkb2Vzbid0IGNsZWFuIG1vc3QgY29waWVkIHRlc3QgZGF0YSBmaWxlcyB3aGVuIHNyY2Rpcj1idWlsZGRpcgorY2xlYW4tbG9jYWw6CisJJChBTV9WX2F0KWlmIHRlc3QgJChzcmNkaXIpID0gLiB8fCB0ZXN0ICQoc3JjZGlyKSAtZWYgLjsgdGhlbiBcCisJCWVjaG8gJy0tIE5vIG5lZWQgdG8gY2xlYW4gdGVzdCBkYXRhIGFzIHNyY2RpciA9IGJ1aWxkZGlyJzsgXAorCWVsc2UgXAorCQlybSAtZiAkKHN0YXRpY19kYXRhKTsgXAorCQlmb3IgRiBpbiAkKGluX2RhdGEpOyBkbyBcCisJCQlybSAtZiAiJCR7RiUuaW59IjsgXAorCQlkb25lOyBcCisJZmkKKworaW1wb3J0ZWRfZGF0YSA9IFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9zeXN0ZW0uY29uZiBcCisJJChOVUxMKQorCitub2luc3RfREFUQSA9ICQoaW1wb3J0ZWRfZGF0YSkKK0NMRUFORklMRVMgKz0gXAorCSQobm9pbnN0X0RBVEEpIFwKKwlYREdfUlVOVElNRV9ESVIgXAorCWluc3RhbGxhYmxlIFwKKwkkKE5VTEwpCisKK2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uY29uZjogJCh0b3BfYnVpbGRkaXIpL2J1cy9zZXNzaW9uLmNvbmYKKwkkKEFNX1ZfYXQpJChNS0RJUl9QKSBkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcworCSQoQU1fVl9HRU4pY3AgJDwgJEAKKworZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL3N5c3RlbS5jb25mOiAkKHRvcF9idWlsZGRpcikvYnVzL3N5c3RlbS5jb25mCisJJChBTV9WX2F0KSQoTUtESVJfUCkgZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtCisJJChBTV9WX0dFTiljcCAkPCAkQAorCiskKGluc3RhbGxhYmxlX3Rlc3RfbWV0YSk6ICUudGVzdDogJSQoRVhFRVhUKSBNYWtlZmlsZQorCSQoQU1fVl9HRU4pICggXAorCQllY2hvICdbVGVzdF0nOyBcCisJCWVjaG8gJ1R5cGU9c2Vzc2lvbic7IFwKKwkJZWNobyAnT3V0cHV0PVRBUCc7IFwKKwkJZWNobyAnRXhlYz1lbnYgJCh0ZXN0ZXhlY2RpcikvJCogLS10YXAnOyBcCisJKSA+ICRALnRtcCAmJiBtdiAkQC50bXAgJEAKKworJChpbnN0YWxsYWJsZV90ZXN0X21ldGFfd2l0aF9jb25maWcpOiAlX3dpdGhfY29uZmlnLnRlc3Q6ICUkKEVYRUVYVCkgTWFrZWZpbGUKKwkkKEFNX1ZfR0VOKSAoIFwKKwkJZWNobyAnW1Rlc3RdJzsgXAorCQllY2hvICdUeXBlPXNlc3Npb24nOyBcCisJCWVjaG8gJ091dHB1dD1UQVAnOyBcCisJCWVjaG8gJ0V4ZWM9ZW52IERCVVNfVEVTVF9EQVRBPSQodGVzdGV4ZWNkaXIpL2RhdGEgJCh0ZXN0ZXhlY2RpcikvJCogLS10YXAnOyBcCisJKSA+ICRALnRtcCAmJiBtdiAkQC50bXAgJEAKZGlmZiAtLWdpdCBhL3Rlc3QvY29ycnVwdC5jIGIvdGVzdC9jb3JydXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNmZjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29ycnVwdC5jCkBAIC0wLDAgKzEsMzk2IEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJlaW5nIGRpc2Nvbm5lY3RlZCBieSBhIGNvcnJ1cHQgbWVzc2FnZSAoZmQubyAjMTU1NzgpCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c0Vycm9yIGU7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlICovCisgICAgR1F1ZXVlIGNsaWVudF9tZXNzYWdlczsKKworICAgIERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubjsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitjbGllbnRfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChjbGllbnRfY29ubiA9PSBmLT5jbGllbnRfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+Y2xpZW50X21lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZi0+c2VydmVyX2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fcmVmIChzZXJ2ZXJfY29ubik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBzZXJ2ZXJfY29ubik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisgIGdfcXVldWVfaW5pdCAoJmYtPmNsaWVudF9tZXNzYWdlcyk7CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChhZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5zZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCk7CisKKyAgZi0+Y2xpZW50X2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlICgKKyAgICAgIGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCk7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBmLT5jbGllbnRfY29ubik7CisKKyAgd2hpbGUgKGYtPnNlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPmNsaWVudF9jb25uLAorICAgICAgY2xpZW50X21lc3NhZ2VfY2IsIGYsIE5VTEwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tZXNzYWdlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmcsICppbmNvbWluZzsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIGFkZHIpOworCisgIG91dGdvaW5nID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvY29tL2V4YW1wbGUvSGVsbG8iLAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0IChvdXRnb2luZyAhPSBOVUxMKTsKKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZXJ2ZXJfY29ubiwgb3V0Z29pbmcsICZzZXJpYWwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworICBnX2Fzc2VydCAoc2VyaWFsICE9IDApOworCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+Y2xpZW50X21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+Y2xpZW50X21lc3NhZ2VzKSwgPT0sIDEpOworCisgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPmNsaWVudF9tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKCFkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGluY29taW5nKSwgPT0sICIiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sICIvY29tL2V4YW1wbGUvSGVsbG8iKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKGluY29taW5nKSwgPT0sIHNlcmlhbCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX25fYnl0ZXMgKEdTb2NrZXQgKnNvY2tldCwKKyAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmJsb2IsCisgICAgICAgICAgICAgIGdzc2l6ZSBibG9iX2xlbikKK3sKKyAgZ3NzaXplIGxlbiwgdG90YWxfc2VudDsKKyAgR0Vycm9yICpnZXJyb3IgPSBOVUxMOworCisgIHRvdGFsX3NlbnQgPSAwOworCisgIHdoaWxlICh0b3RhbF9zZW50IDwgYmxvYl9sZW4pCisgICAgeworICAgICAgbGVuID0gZ19zb2NrZXRfc2VuZCAoc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYiArIHRvdGFsX3NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9iX2xlbiAtIHRvdGFsX3NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmZ2Vycm9yKTsKKworICAgICAgLyogdGhpcyBpcyBOVUxMLXNhZmU6IGEgTlVMTCBlcnJvciBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgaWYgKGdfZXJyb3JfbWF0Y2hlcyAoZ2Vycm9yLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX1dPVUxEX0JMT0NLKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdlIGNvdWxkIHdhaXQgZm9yIEdfSU9fT1VULCBidXQgbGlmZSdzIHRvbyBzaG9ydDsganVzdCBzbGVlcCAqLworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZnZXJyb3IpOworICAgICAgICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDEwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBnX2Fzc2VydF9ub19lcnJvciAoZ2Vycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChsZW4gPj0gMCk7CisgICAgICB0b3RhbF9zZW50ICs9IGxlbjsKKyAgICB9Cit9CisKKy8qIEVub3VnaCBieXRlcyBmb3IgaXQgdG8gYmUgb2J2aW91cyB0aGF0IHRoaXMgY29ubmVjdGlvbiBpcyBicm9rZW4gKi8KKyNkZWZpbmUgQ09SUlVQVF9MRU4gMTAyNAorCisvKiBBbGwtemVybyBpcyBub3QgYSB2YWxpZCBELUJ1cyBtZXNzYWdlIGhlYWRlciAtIGZvciBhIHN0YXJ0LCB0aGlzIGlzCisgKiBwcm90b2NvbCB2ZXJzaW9uIDEsIG5vdCAwICovCitzdGF0aWMgY29uc3QgZ2NoYXIgbm90X2FfZGJ1c19tZXNzYWdlW0NPUlJVUFRfTEVOXSA9IHsgMCB9OworCitzdGF0aWMgdm9pZAordGVzdF9jb3JydXB0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgR1NvY2tldCAqc29ja2V0OworICBHRXJyb3IgKmdlcnJvciA9IE5VTEw7CisgIGludCBmZDsKKyAgREJ1c01lc3NhZ2UgKmluY29taW5nOworCisgIHRlc3RfbWVzc2FnZSAoZiwgYWRkcik7CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoIChmLT5zZXJ2ZXJfY29ubik7CisKKyAgLyogT0ssIG5vdyB0aGUgY29ubmVjdGlvbiBpcyB3b3JraW5nLCBsZXQncyBicmVhayBpdCEgRG9uJ3QgdHJ5IHRoaXMKKyAgICogYXQgaG9tZTsgc3BsaWNpbmcgYXJiaXRyYXJ5IGJ5dGVzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgc3RyZWFtIGlzCisgICAqIHNwZWNpZmljYWxseSBkb2N1bWVudGVkIGFzIG5vdCBhIHZhbGlkIHRoaW5nIHRvIGRvLiBXaG8nZCBoYXZlIHRob3VnaHQ/ICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQgKGYtPnNlcnZlcl9jb25uLCAmZmQpKQorICAgIGdfZXJyb3IgKCJmYWlsZWQgdG8gc3RlYWwgZmQgZnJvbSBzZXJ2ZXIgY29ubmVjdGlvbiIpOworCisgIHNvY2tldCA9IGdfc29ja2V0X25ld19mcm9tX2ZkIChmZCwgJmdlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChnZXJyb3IpOworICBnX2Fzc2VydCAoc29ja2V0ICE9IE5VTEwpOworCisgIHNlbmRfbl9ieXRlcyAoc29ja2V0LCBub3RfYV9kYnVzX21lc3NhZ2UsIENPUlJVUFRfTEVOKTsKKworICAvKiBOb3cgc3BpbiBvbiB0aGUgY2xpZW50IGNvbm5lY3Rpb246IHRoZSBzZXJ2ZXIganVzdCBzZW50IGl0IGNvbXBsZXRlCisgICAqIHJ1YmJpc2gsIHNvIGl0IHNob3VsZCBkaXNjb25uZWN0ICovCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+Y2xpZW50X21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJEaXNjb25uZWN0ZWQiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGluY29taW5nKSwgPT0sICIiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sCisgICAgICAiL29yZy9mcmVlZGVza3RvcC9EQnVzL0xvY2FsIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgLyogRnJlZSB0aGUgREJ1c0Nvbm5lY3Rpb24gYmVmb3JlIHRoZSBHU29ja2V0LCBiZWNhdXNlIEdTb2NrZXQgaXMKKyAgICogZ29pbmcgdG8gY2xvc2Ugb3VyIGZkLiBHU29ja2V0IHRvbGVyYXRlcyBjbG9zaW5nIGFuIGFscmVhZHktY2xvc2VkCisgICAqIGZkLCB3aGVyZWFzIERCdXNMb29wICsgREJ1c1NvY2tldFNldEVwb2xsIGRvZXNuJ3QuIE9uIFVuaXgKKyAgICogd2UgY291bGQgdXNlIGR1cCgpIGJ1dCB0aGF0IGlzbid0IHBvcnRhYmxlIHRvIFdpbmRvd3MgOi0oCisgICAqLworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubik7CisgIGYtPnNlcnZlcl9jb25uID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYnl0ZV9vcmRlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICpnZXJyb3IgPSBOVUxMOworICBpbnQgZmQ7CisgIGNoYXIgKmJsb2I7CisgIGNvbnN0IGdjaGFyICphcmcgPSBub3RfYV9kYnVzX21lc3NhZ2U7CisgIGNvbnN0IGdjaGFyICogY29uc3QgKmFyZ3MgPSAmYXJnOworICBpbnQgYmxvYl9sZW47CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCBtZW07CisKKyAgdGVzdF9tZXNzYWdlIChmLCBhZGRyKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvIiwgImEuYiIsICJjIik7CisgIGdfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICAvKiBBcHBlbmQgMHhGRiBieXRlcywgc28gdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IHdoZW4gYnl0ZS1zd2FwcGVkCisgICAqIGlzIDB4RkYwMDAwMDAsIHdoaWNoIGlzIGludmFsaWQgKi8KKyAgbWVtID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQllURSwgJmFyZ3MsIDB4RkYsCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGdfYXNzZXJ0IChtZW0pOworICBtZW0gPSBkYnVzX21lc3NhZ2VfbWFyc2hhbCAobWVzc2FnZSwgJmJsb2IsICZibG9iX2xlbik7CisgIGdfYXNzZXJ0IChtZW0pOworICBnX2Fzc2VydF9jbXB1aW50IChibG9iX2xlbiwgPiwgMHhGRik7CisgIGdfYXNzZXJ0IChibG9iICE9IE5VTEwpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogQnJlYWsgdGhlIG1lc3NhZ2UgYnkgY2hhbmdpbmcgaXRzIGNsYWltZWQgYnl0ZSBvcmRlciwgd2l0aG91dCBhY3R1YWxseQorICAgKiBieXRlc3dhcHBpbmcgYW55dGhpbmcuIFdlIGhhcHBlbiB0byBrbm93IHRoYXQgYnl0ZSBvcmRlciBpcyB0aGUgZmlyc3QKKyAgICogYnl0ZS4gKi8KKyAgaWYgKGJsb2JbMF0gPT0gJ0InKQorICAgIGJsb2JbMF0gPSAnbCc7CisgIGVsc2UKKyAgICBibG9iWzBdID0gJ0InOworCisgIC8qIE9LLCBub3cgdGhlIGNvbm5lY3Rpb24gaXMgd29ya2luZywgbGV0J3MgYnJlYWsgaXQgKi8KKworICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGYtPnNlcnZlcl9jb25uKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChmLT5zZXJ2ZXJfY29ubiwgJmZkKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHN0ZWFsIGZkIGZyb20gc2VydmVyIGNvbm5lY3Rpb24iKTsKKworICBzb2NrZXQgPSBnX3NvY2tldF9uZXdfZnJvbV9mZCAoZmQsICZnZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZ2Vycm9yKTsKKyAgZ19hc3NlcnQgKHNvY2tldCAhPSBOVUxMKTsKKworICBzZW5kX25fYnl0ZXMgKHNvY2tldCwgYmxvYiwgYmxvYl9sZW4pOworCisgIGRidXNfZnJlZSAoYmxvYik7CisKKyAgLyogTm93IHNwaW4gb24gdGhlIGNsaWVudCBjb25uZWN0aW9uOiB0aGUgc2VydmVyIGp1c3Qgc2VudCBpdCBhIGZhdWx0eQorICAgKiBtZXNzYWdlLCBzbyBpdCBzaG91bGQgZGlzY29ubmVjdCAqLworICB3aGlsZSAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPmNsaWVudF9tZXNzYWdlcykpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIG1lc3NhZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAobWVzc2FnZSkpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgPT0sCisgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWwiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksID09LCAiRGlzY29ubmVjdGVkIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksID09LAorICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbCIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogRnJlZSB0aGUgREJ1c0Nvbm5lY3Rpb24gYmVmb3JlIHRoZSBHU29ja2V0LCBhcyBhYm92ZS4gKi8KKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZXJ2ZXJfY29ubik7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+c2VydmVyX2Nvbm4pOworICBmLT5zZXJ2ZXJfY29ubiA9IE5VTEw7CisKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIgR19HTlVDX1VOVVNFRCkKK3sKKyAgaWYgKGYtPmNsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmNsaWVudF9jb25uKTsKKyAgICAgIGYtPmNsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlcnZlcl9jb25uKTsKKyAgICAgIGYtPnNlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgICAgIGYtPnNlcnZlciA9IE5VTEw7CisgICAgfQorCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgZ190ZXN0X2FkZCAoIi9jb3JydXB0L3RjcCIsIEZpeHR1cmUsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfY29ycnVwdCwgdGVhcmRvd24pOworCisjaWZkZWYgREJVU19VTklYCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC91bml4IiwgRml4dHVyZSwgInVuaXg6dG1wZGlyPS90bXAiLCBzZXR1cCwKKyAgICAgIHRlc3RfY29ycnVwdCwgdGVhcmRvd24pOworI2VuZGlmCisKKyAgZ190ZXN0X2FkZCAoIi9jb3JydXB0L2J5dGUtb3JkZXIvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9ieXRlX29yZGVyLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtY2xpZW50LXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtY2xpZW50LXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNjIwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDE2IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgYSBjbGllbnQgY2FuIGxvZ2luIGFub255bW91c2x5CisKK0NMSUVOVAorCisjIyBSZWplY3Qgd2hhdGV2ZXIgbWVjaGFuaXNtIHRoZSBjbGllbnQgcGlja3MgZmlyc3QKK0VYUEVDVF9DT01NQU5EIEFVVEgKK1NFTkQgJ1JFSkVDVEVEIERCVVNfVEVTVF9OT05FWElTVEVOVF9NRUNIMSBBTk9OWU1PVVMgREJVU19URVNUX05PTkVYSVNURU5UX01FQ0gyJworCisjIyBBbmQgdGhpcyB0aW1lIHdlIGdldCBBTk9OWU1PVVMKKworRVhQRUNUX0NPTU1BTkQgQVVUSAorIyMgb2YgY291cnNlIHJlYWwgREJVU19DT09LSUVfU0hBMSB3b3VsZCBub3Qgc2VuZCB0aGlzIGhlcmUuLi4KK1NFTkQgJ09LIDEyMzRkZWFkYmVlZicKKworRVhQRUNUX0NPTU1BTkQgQkVHSU4KK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtc2VydmVyLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9hbm9ueW1vdXMtc2VydmVyLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDEzIEBACisjIyB0aGlzIHRlc3RzIHRoZSBzZXJ2ZXIgc2lkZSBpbiBhIHN1Y2Nlc3NmdWwgYXV0aCBvZiB0eXBlIEFOT05ZTU9VUyAKKworU0VSVkVSCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBBTk9OWU1PVVMgNDQyZDQyNzU3MzIwMzEyZTMxMmUzMScKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKyMjIHZlcmlmeSB0aGF0IHdlIGFyZSBzdGlsbCBhbm9ueW1vdXMKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2NhbmNlbC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2NhbmNlbC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM1MTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTkgQEAKKyMjIHRoaXMgdGVzdHMgY2FuY2VsaW5nIEVYVEVSTkFMCisKK1NFUlZFUgorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQ0FOQ0VMJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIyBub3cgc3RhcnQgb3ZlciBhbmQgc2VlIGlmIGl0IHdvcmtzCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisKKworCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9jbGllbnQtb3V0LW9mLW1lY2hhbmlzbXMuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9jbGllbnQtb3V0LW9mLW1lY2hhbmlzbXMuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZDNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDcgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCB0ZXN0cyB0aGF0IHRoZSBjbGllbnQgZGlzY29ubmVjdHMgd2hlbiBpdCdzIG91dCBvZgorIyMga25vd24gbWVjaGFuaXNtcworCitDTElFTlQKK0VYUEVDVF9DT01NQU5EIEFVVEgKK1NFTkQgJ1JFSkVDVEVEIEJPTkdPX01ENScKK0VYUEVDVF9TVEFURSBORUVEX0RJU0NPTk5FQ1QKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLWZhaWxlZC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLWZhaWxlZC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRlOTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTEgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCBhdXRoIG9mIHR5cGUgRVhURVJOQUwgd2l0aG91dCBjcmVkZW50aWFscyB3aWxsIGZhaWwKKworU0VSVkVSCitOT19DUkVERU5USUFMUworIyMgdmVyaWZ5IHRoYXQgcHJpb3IgdG8gZG9pbmcgYW55dGhpbmcsIHdlIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKyMjIHZlcmlmeSB0aGF0IHdlIHN0aWxsIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1yb290LmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YzRiNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1yb290LmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTEgQEAKKyMjIHRoaXMgdGVzdHMgd2UgY2FuIGF1dGggRVhURVJOQUwgYXMgb3Vyc2VsdmVzLCB3aXRoIHJvb3QgY3JlZGVudGlhbHMKK1VOSVhfT05MWQorU0VSVkVSCitST09UX0NSRURFTlRJQUxTCisjIyAzMCBpcyBBU0NJSSAnMCcgaW4gaGV4CitTRU5EICdBVVRIIEVYVEVSTkFMIDMwJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zaWxseS5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMThlZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zaWxseS5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDEyIEBACisjIyB0aGlzIHRlc3RzIHdlIGNhbid0IGF1dGggaWYgc29ja2V0IHJlcG9ydHMgc2lsbHkgY3JlZGVudGlhbHMgYnV0IHdlIGFzayBmb3Igb3VyIG93biB1aWQKKworU0VSVkVSCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0lMTFlfQ1JFREVOVElBTFMKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKyMjIHZlcmlmeSB0aGF0IHdlIHN0aWxsIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyOTM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMiBAQAorIyMgdGhpcyB0ZXN0cyBhIHN1Y2Nlc3NmdWwgYXV0aCBvZiB0eXBlIEVYVEVSTkFMCisKK1NFUlZFUgorIyMgdmVyaWZ5IHRoYXQgcHJpb3IgdG8gZG9pbmcgYW55dGhpbmcsIHdlIGhhdmVuJ3QgYXV0aGVkIGFzIGFueW9uZQorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKyMjIHZlcmlmeSB0aGF0IHdlIG5vdyBoYXZlIHNvbWUgY3JlZGVudGlhbHMKK0VYUEVDVF9IQVZFX1NPTUVfQ1JFREVOVElBTFMKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2V4dHJhLWJ5dGVzLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZTAxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2V4dHJhLWJ5dGVzLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTAgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCB3ZSBoYXZlIHRoZSBleHBlY3RlZCBleHRyYSBieXRlcyBhdCB0aGUgZW5kCisKK1NFUlZFUgorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU5cclxuSGVsbG8nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRF9XSVRIX1VOVVNFRF9CWVRFUworRVhQRUNUX1VOVVNFRCAnSGVsbG9cclxuJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VkMzg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMzQgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCBhZnRlciByZXRyeWluZyB0b28gb2Z0ZW4gd2UgZmFpbAorCitTRVJWRVIKK05PX0NSRURFTlRJQUxTCisKKyMgMQorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDIKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyAzCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgNAorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDUKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyA2CitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIE5FRURfRElTQ09OTkVDVApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg4MGMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvZmFsbGJhY2suYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxNyBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGEgY2xpZW50IGNhbiBmYWxsYmFjayB0byBhIHNlY29uZGFyeSBhdXRoIG1lY2ggCisKK0NMSUVOVAorCisjIyBXaWxsIHRyeSBFWFRFUk5BTCBieSBkZWZhdWx0IGZpcnN0IHdpdGhvdXQgZmlyc3QgY2FsbGluZyBBVVRIIGFsb25lLgorCitFWFBFQ1RfQ09NTUFORCBBVVRICitTRU5EICdSRUpFQ1RFRCBFWFRFUk5BTCBEQlVTX0NPT0tJRV9TSEExIERCVVNfVEVTVF9OT05FWElTVEVOVF9NRUNIJworCisjIyBBbmQgdGhpcyB0aW1lIHdlIGdldCBEQlVTX0NPT0tJRV9TSEExCisKK0VYUEVDVF9DT01NQU5EIEFVVEgKKyMjIG9mIGNvdXJzZSByZWFsIERCVVNfQ09PS0lFX1NIQTEgd291bGQgbm90IHNlbmQgdGhpcyBoZXJlLi4uCitTRU5EICdPSyAxMjM0ZGVhZGJlZWYnCisKK0VYUEVDVF9DT01NQU5EIEJFR0lOCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC1jbGllbnQuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxN2U3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC1jbGllbnQuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSw4IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgcmVjZWl2aW5nIGEgbm9uZXhpc3RlbnQgY29tbWFuZCBpcyBoYW5kbGVkIHByb3Blcmx5CisjIyBieSBhIGNsaWVudAorCitDTElFTlQKK0VYUEVDVF9DT01NQU5EIEFVVEgKK1NFTkQgJ05PTkVYSVNURU5UX0NPTU1BTkQgZm9vIGJhciBiYXogYmxhaCBibGFoJworRVhQRUNUX0NPTU1BTkQgRVJST1IKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWNiOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSw3IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgcmVjZWl2aW5nIGEgbm9uZXhpc3RlbnQgY29tbWFuZCBpcyBoYW5kbGVkIHByb3Blcmx5CisjIyBieSBhIHNlcnZlcgorCitTRVJWRVIKK1NFTkQgJ05PTkVYSVNURU5UX0NPTU1BTkQgZm9vIGJhciBiYXogYmxhaCBibGFoJworRVhQRUNUX0NPTU1BTkQgRVJST1IKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1oZXgtZW5jb2RpbmcuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjE1YzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1oZXgtZW5jb2RpbmcuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSw2IEBACisjIyB0aGlzIHRlc3RzIGFuIGludmFsaWQgaGV4IGVuY29kaW5nIGZvbGxvd2VkIGJ5IHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24KKworU0VSVkVSCitTRU5EICdBVVRIIEVYVEVSTkFMIHdpbGx5JworRVhQRUNUX0NPTU1BTkQgRVJST1IKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL21lY2hhbmlzbXMuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NDc5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL21lY2hhbmlzbXMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSw4IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgdGhlIHNlcnZlciBzZW5kcyBhIGxpc3Qgb2YgbWVjaGFuaXNtcworIyMgaW4gcmVzcG9uc2UgdG8gYmxhbmsgQVVUSAorCitTRVJWRVIKK1NFTkQgQVVUSAorRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTEuY29uZiBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjQxZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTEuY29uZgpAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj41MDAwPC9saW1pdD4gICAKKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4zMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NjAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj44MDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjI1NjwvbGltaXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTIuY29uZiBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTcwN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTIuY29uZgpAQCAtMCwwICsxLDUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5iYXNpYy0xLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQvYmFzaWMuY29uZiBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZC9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQvYmFzaWMuY29uZgpAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kL2Jhc2ljLmNvbmYgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQvYmFzaWMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA5ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMS5jb25mIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzY2VhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMS5jb25mCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gVGhpcyBjb25maWcgZmlsZSBjb250YWlucyBYTUwgZW50aXRpZXMgLS0+Cis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vJmx0O2JhciZndDs8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLiYjMTAwOzwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci8mYW1wO3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllJiMxMTU7Ij5ub25leGlzdGVudC5jb25mJiMxMTA7PC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9IiYjMTAwO2VmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMi5jb25mIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0yLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmYWJlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMi5jb25mCkBAIC0wLDAgKzEsNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmVudGl0aWVzLTEuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlIGIvdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZTllYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlCkBAIC0wLDAgKzEsMTkgQEAKKyMjIG1lc3NhZ2UgdGhhdCdzIG1pc3NpbmcgYW4gZXhwZWN0ZWQgYm9keQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCisjIyBjcmVhdGUgdGhlIGJvZHksIHRoZW4gY2hvcCBpdCBvZmYKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIElOVDMyCitJTlQzMiAzNworRU5EX0xFTkdUSCBCb2R5CisKK0NIT1AgOApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTJkZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0iam9tb21hIj5ibGFoPC9pbmNsdWRlPgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYjk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZgpAQCAtMCwwICsxLDEwIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJtb28iPmJsYWg8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTg5NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMS5jb25mCkBAIC0wLDAgKzEsNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5jaXJjdWxhci0xLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE3ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTIuY29uZgpAQCAtMCwwICsxLDQgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+Y2lyY3VsYXItMy5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZiBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0zLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlMzU0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0zLmNvbmYKQEAgLTAsMCArMSw0IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIiAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmNpcmN1bGFyLTIuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZiBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU5Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mCkBAIC0wLDAgKzEsNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC9mb28+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy90cnVuY2F0ZWQtZmlsZS5jb25mIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNjA4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy90cnVuY2F0ZWQtZmlsZS5jb25mCkBAIC0wLDAgKzEsOSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1uaWwubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1uaWwubWVzc2FnZQpAQCAtMCwwICsxLDMxIEBACisjIE1lc3NhZ2Ugd2l0aCBhbiBhcnJheSBvZiBOSUwgKG5vdCBhbGxvd2VkKQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRIIAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIEFSUkFZCitUWVBFIE5JTAorVUlOVDMyIDUKKworIyMgd2Ugd2FudCBpdCB0byBmYWlsIGJlY2F1c2Ugb2YgdHlwZSBuaWwsIG5vdCBiZWNhdXNlIHRoZSBsZW5ndGggaXMgbm8gZ29vZAorIyMgc28gcGFkIG91dCB0aGUgbWVzc2FnZSB3aXRoIDUgYnl0ZXMKK0JZVEUgMQorQllURSAyCitCWVRFIDMKK0JZVEUgNAorQllURSA1CisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktd2l0aC1taXhlZC10eXBlcy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTJkMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UKQEAgLTAsMCArMSw1MiBAQAorIyBNZXNzYWdlIHdpdGggYW4gYXJyYXkgb2YgYXJyYXkgd2hlcmUgdGhlIGNoaWxkIGFycmF5cyBhcmUgb2YKKyMgZGlmZmVyZW50IHR5cGVzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorCitUWVBFIEFSUkFZCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorCitMRU5HVEggQXJyYXkKK1NUQVJUX0xFTkdUSCBBcnJheQorCisjIyBhcnJheSBvZiB1aW50MzIKK0xFTkdUSCBTdWJBcnJheTEKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTEKK1VJTlQzMiAxCitVSU5UMzIgMgorVUlOVDMyIDMKK0VORF9MRU5HVEggU3ViQXJyYXkxCisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MgorU1RBUlRfTEVOR1RIIFN1YkFycmF5MgorVUlOVDMyIDQKK1VJTlQzMiA1CitFTkRfTEVOR1RIIFN1YkFycmF5MgorCisjIyBhcnJheSBvZiBib29sZWFuCitMRU5HVEggU3ViQXJyYXkzCitTVEFSVF9MRU5HVEggU3ViQXJyYXkzCitCT09MRUFOIGZhbHNlCitCT09MRUFOIHRydWUKK0VORF9MRU5HVEggU3ViQXJyYXkzCisKK0VORF9MRU5HVEggQXJyYXkKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODAwMGFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZQpAQCAtMCwwICsxLDI3IEBACisjIyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGJvb2xlYW4gYXJyYXkKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitBTElHTiA0CitJTlQzMiAzCitCWVRFIDAKK0JZVEUgMQorQllURSAzCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDI2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi5tZXNzYWdlCkBAIC0wLDAgKzEsMjIgQEAKKyMjIGEgbWVzc2FnZSB3aXRoIGFuIGludmFsaWQgYm9vbGVhbiB2YWx1ZQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIEJPT0xFQU4KK0JZVEUgMworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtZW5kaWFuLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtZW5kaWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3OWJhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZQpAQCAtMCwwICsxLDI1IEBACisjIyBtZXNzYWdlIHdpdGggaW52YWxpZCBlbmRpYW5uZXNzIHRhZworCitCWVRFICdpJworQllURSAxCitCWVRFIDAKK0JZVEUgMAorCitMRU5HVEggSGVhZGVyCitMRU5HVEggQm9keQorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWhlYWRlci1maWVsZC1hbGlnbm1lbnQubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmMwZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWhlYWRlci1maWVsZC1hbGlnbm1lbnQubWVzc2FnZQpAQCAtMCwwICsxLDM4IEBACisjIyBsYXN0IGZpZWxkIGluY29ycmVjdGx5IGFsaWduZWQgdG8gNCBieXRlcworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCisKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKKworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBTVFJJTkcKK1NUUklORyAnYScKKworQUxJR04gNAorCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBBUlJBWQorVFlQRSBCWVRFCitBTElHTiA0CitMRU5HVEggVGhpc0J5dGVBcnJheQorU1RBUlRfTEVOR1RIIFRoaXNCeXRlQXJyYXkKK0JZVEUgMQorQllURSAyCitFTkRfTEVOR1RIIFRoaXNCeXRlQXJyYXkKKworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXcgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIxNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYm9vbGVhbi1oYXMtbm8tdmFsdWUubWVzc2FnZS1yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbG9jYWwtbmFtZXNwYWNlLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTcyMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbG9jYWwtbmFtZXNwYWNlLm1lc3NhZ2UKQEAgLTAsMCArMSwyMSBAQAorIyMgYSBtZXNzYWdlIHRoYXQgaXMgaW4gdGhlIG9yZy5mcmVlZGVza3RvcC5Mb2NhbC4gbmFtZXNwYWNlIGFuZCB0aHVzCisjIyBpbnZhbGlkCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuTG9jYWwnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdEaXNjb25uZWN0ZWQnCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9uby1kb3QtaW4tbmFtZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9uby1kb3QtaW4tbmFtZS5tZXNzYWdlCkBAIC0wLDAgKzEsMTkgQEAKKyMjIGEgbWVzc2FnZSB3aXRoIGRvdGxlc3MgaW50ZXJmYWNlCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnTm9Eb3RJbkhlcmUnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ub3QtbnVsLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ub3QtbnVsLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4NDZkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpAQCAtMCwwICsxLDI1IEBACisjIyBoYXMgb25lIG5vbi1udWwgYnl0ZSBpbiBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorIyMga2lsbCBhIHBhZGRpbmcgYnl0ZSBhbmQgcmVwbGFjZSBpdAorQ0hPUCAxCitCWVRFICdxJworRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY5MDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlCkBAIC0wLDAgKzEsMjAgQEAKKyMjIGEgbWVzc2FnZSB3aXRoIHRvby1sb25nIG5hbWUgZmllbGQKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZvby5iYXIudGhpcy5pcy5yZWFsbHkubG9uZyAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA3OCA3OSA4MCA4MSA4MiA4MyA4NCA4NSA4NiA4NyA4OCA4OSA5MCA5MSA5MiA5MyA5NCA5NSA5NiA5NyA5OCA5OSAxMDAgMTAxIDEwMiAxMDMgMTA0IDEwNSAxMDYgMTA3IDEwOCAxMDkgMTEwIDExMSAxMTIgMTEzIDExNCAxMTUgMTE2IDExNyAxMTggMTE5IDEyMCAxMjEgMTIyIDEyMyAxMjQgMTI1IDEyNiAxMjcgMTI4IDEyOSAxMzAgMTMxIDEzMiAxMzMgMTM0IDEzNSAxMzYgMTM3IDEzOCAxMzkgMTQwIDE0MSAxNDIgMTQzIDE0NCAxNDUgMTQ2IDE0NyAxNDggMTQ5IDE1MCAxNTEgMTUyIDE1MyAxNTQgMTU1IDE1NiAxNTcgMTU4IDE1OSAxNjAgMTYxIDE2MiAxNjMgMTY0IDE2NSAxNjYgMTY3IDE2OCAxNjkgMTcwIDE3MSAxNzIgMTczIDE3NCAxNzUgMTc2IDE3NyAxNzggMTc5IDE4MCAxODEgMTgyIDE4MyAxODQgMTg1IDE4NiAxODcgMTg4IDE4OSAxOTAgMTkxIDE5MiAxOTMgMTk0IDE5NSAxOTYgMTk3IDE5OCAxOTkgMjAwJworCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCisKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg4MTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjQgQEAKKyMjIGhhcyBvbmUgYnl0ZSBtaXNzaW5nIGZyb20gaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBTVFJJTkcKK1NUUklORyAnYScKK0FMSUdOIDgKKyMjIGtpbGwgYSBwYWRkaW5nIGJ5dGUKK0NIT1AgMQorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLWJ5LWZhci5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmctYnktZmFyLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYmUzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLWJ5LWZhci5tZXNzYWdlCkBAIC0wLDAgKzEsMjYgQEAKKyMjIGhhcyBvbmUgYnl0ZSBleHRyYSBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorQllURSAwCitBTElHTiA4CitCWVRFIDAKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjFjMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpAQCAtMCwwICsxLDIzIEBACisjIyBoYXMgb25lIGJ5dGUgZXh0cmEgaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBTVFJJTkcKK1NUUklORyAnYScKK0FMSUdOIDgKK0JZVEUgMAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlCkBAIC0wLDAgKzEsMjggQEAKKyMgTWVzc2FnZSB3aXRoIGxvdHMgb2YgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CisKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICd1aW50MzInCitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ODc2NTQzMgorU1RSSU5HICd1aW50MzInCitFTkRfTEVOR1RIIERpY3QKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzYWQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5zZXJ2aWNlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTIxNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VydmljZUBFWEVFWFRACitVc2VyPWFueXJhbmRvbXVzZXIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTFlMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zaGEtMS9SZWFkbWUudHh0IGIvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjYTNmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zaGEtMS9SZWFkbWUudHh0CkBAIC0wLDAgKzEsODMgQEAKK1Rlc3Qgc3VpdGUgZnJvbSBodHRwOi8vY3NyYy5uaXN0Lmdvdi9jcnlwdHZhbC9zaHMuaHRtbAorCisJCQkJU2FtcGxlIFZlY3RvcnMgZm9yIFNIQS0xIFRlc3RpbmcKKworCVRoaXMgZmlsZSBkZXNjcmliZXMgdGVzdHMgYW5kIHZlY3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiB2ZXJpZnlpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIAorYW4gU0hBLTEgaW1wbGVtZW50YXRpb24uICBIb3dldmVyLCB1c2Ugb2YgdGhlc2UgdmVjdG9ycyBkb2VzIG5vdCB0YWtlIHRoZSBwbGFjZSBvZiB2YWxpZGF0aW9uIAorb2J0YWluZWQgdGhyb3VnaCB0aGUgQ3J5cHRvZ3JhcGhpYyBNb2R1bGUgVmFsaWRhdGlvbiBQcm9ncmFtLgorCisJVGhlcmUgYXJlIHRocmVlIGFyZWFzIG9mIHRoZSBTZWN1cmUgSGFzaCBTdGFuZGFyZCBmb3Igd2hpY2ggdGVzdCB2ZWN0b3JzIGFyZSBzdXBwbGllZDoKK3Nob3J0IG1lc3NhZ2VzIG9mIHZhcnlpbmcgbGVuZ3RoLCBzZWxlY3RlZCBsb25nIG1lc3NhZ2VzLCBhbmQgcHNldWRvcmFuZG9tbHkgZ2VuZXJhdGVkIG1lc3NhZ2VzLgorU2luY2UgaXQgaXMgcG9zc2libGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIGhhc2hpbmcgb2YgYnl0ZS1vcmllbnRlZAorbWVzc2FnZXMgKGFuZCBub3QgbWVzc2FnZXMgb2YgYSBub24tYnl0ZSBsZW5ndGgpLCB0aGUgU0hTIHRlc3RzIGVhY2ggY29tZSBpbiB0d28gZmxhdm9ycy4gIEZvcgorYm90aCBieXRlIG9yaWVudGVkIGFuZCBiaXQgb3JpZW50ZWQgbWVzc2FnZXMsIHRoZSBtZXNzYWdlIGxlbmd0aHMgYXJlIGdpdmVuIGluIGJpdHMuCisKK1R5cGUgSSBUZXN0OiBNZXNzYWdlcyBvZiBWYXJ5aW5nIExlbmd0aAorCisJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNIUyBtdXN0IGJlIGFibGUgdG8gY29ycmVjdGx5IGdlbmVyYXRlIG1lc3NhZ2UgZGlnZXN0cyBmb3IKK21lc3NhZ2VzIG9mIGFyYml0cmFyeSBsZW5ndGguICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHRlc3RlZCBieSBzdXBwbHlpbmcgdGhlIGltcGxlbWVudGF0aW9uCit3aXRoIDEwMjUgcHNldWRvcmFuZG9tbHkgZ2VuZXJhdGVkIG1lc3NhZ2VzIHdpdGggbGVuZ3RocyBmcm9tIDAgdG8gMTAyNCBiaXRzIChmb3IgYW4gaW1wbGVtZW50YXRpb24KK3RoYXQgb25seSBoYXNoZXMgYnl0ZS1vcmllbnRlZCBkYXRhIGNvcnJlY3RseSwgMTI5IG1lc3NhZ2VzIG9mIGxlbmd0aCAwLCA4LCAxNiwgMjQsLi4uLDEwMjQgYml0cword2lsbCBiZSBzdXBwbGllZCkuCisKK1R5cGUgSUkgVGVzdDogU2VsZWN0ZWQgTG9uZyBNZXNzYWdlcworCisJQWRkaXRpb25hbCB0ZXN0aW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGVzdGluZyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbgorY2FuIGNvcnJlY3RseSBnZW5lcmF0ZSBkaWdlc3RzIGZvciBsb25nZXIgbWVzc2FnZXMuICBBIGxpc3Qgb2YgMTAwIG1lc3NhZ2VzLCBlYWNoIG9mIGxlbmd0aCA+IDEwMjQsCitpcyBzdXBwbGllZC4gIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaGFzaGluZyBvZiBsb25nZXIgbWVzc2FnZSBsZW5ndGhzLiAgRm9yIGJpdCBvcmllbnRlZAordGVzdGluZyB0aGUgbWVzc2FnZXMgYXJlIGZyb20gMTAyNSB0byAxMDM0MjUgYml0cyBsb25nIChsZW5ndGg9MTAyNStpKjEwMjQsIHdoZXJlIDA8PWk8MTAwKS4gIEZvcgorYnl0ZSBvcmllbnRlZCB0ZXN0aW5nIHRoZSBtZXNzYWdlcyBhcmUgZnJvbSAxMDMyIHRvIDEwMzQzMiAobGVuZ3RoPTEwMzIraSoxMDI0LCB3aGVyZSAwPD1pPDEwMCkuCisKK1R5cGUgSUlJIFRlc3Q6IFBzZXVkb3JhbmRvbWx5IEdlbmVyYXRlZCBNZXNzYWdlcworCisJVGhpcyB0ZXN0IGRldGVybWluZXMgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gY2FuIGNvbXB1dGUgbWVzc2FnZSBkaWdlc3RzIGZvciBtZXNzYWdlcwordGhhdCBhcmUgZ2VuZXJhdGVkIHVzaW5nIGEgZ2l2ZW4gc2VlZC4gIEEgc2VxdWVuY2Ugb2YgMTAwIG1lc3NhZ2UgZGlnZXN0cyBpcyBnZW5lcmF0ZWQgdXNpbmcgdGhpcworc2VlZC4gIFRoZSBkaWdlc3RzIGFyZSBnZW5lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcHNldWRvY29kZToKKworcHJvY2VkdXJlIE1vbnRlQ2FybG8oc3RyaW5nIFNFRUQpCit7CisJaW50ZWdlciBpLCBqLCBhOworCXN0cmluZwlNOworCisJTSA6PSBTRUVEOworCWZvciBqID0gMCB0byA5OSBkbyB7CisJCWZvciBpID0gMSB0byA1MDAwMCBkbyB7CisJCQlmb3IgYSA9IDEgdG8gKGovNCo4ICsgMjQpIGRvIE0gOj0gTSB8fCCSMJI7CS8qkTAnIGlzIHRoZSBiaW5hcnkgemVybyBiaXQuICovCisJCQlNIDo9IE0gfHwgaTsgCS8qIEhlcmUsIHRoZSB2YWx1ZSBmb3IgkWmSIGlzIGV4cHJlc3NlZCBhcyBhIDMyLWJpdCB3b3JkCisJCQkJCSAgIGFuZCBjb25jYXRlbmF0ZWQgd2l0aCCRTZIuIFRoZSBmaXJzdCBiaXQKKwkJCQkJICAgY29uY2F0ZW5hdGVkIHdpdGggkU2SIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZgorCQkJCQkgICB0aGlzIDMyLWJpdCB3b3JkLiAqLworCQkJTSA6PSBTSEEoTSk7CisJCQl9CisJCXByaW50KE0pOworCQl9CisJfQorCitOT1RFOiBJbiB0aGUgYWJvdmUgcHJvY2VkdXJlLCB8fCBkZW5vdGVzIGNvbmNhdGVuYXRpb24uIEFsc28sIE0gfHwgaSBkZW5vdGVzIGFwcGVuZGluZyB0aGUgMzItYml0Cit3b3JkIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgkWmSLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gMiBvZiB0aGUgU0hTLiAgV2l0aGluIHRoZSBwcm9jZWR1cmUsIE0gaXMgYSBzdHJpbmcKK29mIHZhcmlhYmxlIGxlbmd0aC4gVGhlIGluaXRpYWwgbGVuZ3RoIG9mIDQxNiBiaXRzIGVuc3VyZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIE0gbmV2ZXIgZXhjZWVkcyA1MTIgYml0cworZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgYWJvdmUgcHJvY2VkdXJlLCBhbmQgaXQgZW5zdXJlcyB0aGF0IG1lc3NhZ2VzIHdpbGwgYmUgb2YgYSBieXRlIGxlbmd0aC4gIEVhY2gKK2VsZW1lbnQgcHJpbnRlZCBzaG91bGQgYmUgMTYwIGJpdHMgaW4gbGVuZ3RoLgorCisKK0ZpbGUgZm9ybWF0czoKKworVGhlcmUgYXJlIHR3byBmaWxlcyBpbmNsdWRlZCBmb3IgZWFjaCB0ZXN0IHR5cGUgKGJpdC1vcmllbnRlZCBhbmQgYnl0ZS1vcmllbnRlZCkuICBPbmUgZmlsZSBjb250YWlucwordGhlIG1lc3NhZ2VzIGFuZCB0aGUgb3RoZXIgZmlsZSBjb250YWlucyB0aGUgaGFzaGVzLgorCitUaGUgbWVzc2FnZSBmaWxlcyBwcm92aWRlZCB1c2UgImNvbXBhY3Qgc3RyaW5ncyIgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgdmFsdWVzLiAgQ29tcGFjdCBzdHJpbmdzIGFyZSAKK3VzZWQgdG8gcmVwcmVzZW50ZWQgdGhlIG1lc3NhZ2VzIGluIGEgY29tcGFjdCBmb3JtLiAgQSBjb21wYWN0IHN0cmluZyBoYXMgdGhlIGZvcm0KKwl6IHx8IGIgfHwgbigxKSB8fCBuKDIpIHx8IC4uLiB8fCBuKHopCit3aGVyZSB6Pj0wIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG4sIGIgaXMgZWl0aGVyIDAgb3IgMSwgYW5kIGVhY2ggbihpKSBpcyBhIGRlY2ltYWwgaW50ZWdlcgorcmVwcmVzZW50aW5nIGEgcG9zaXRpdmUgbnVtYmVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgY29tcGFjdCBzdHJpbmcgaXMgZ2l2ZW4gYnkgdGhlIHN1bW1hdGlvbiBvZiB0aGUgbihpKS4KKworVGhlIGNvbXBhY3Qgc3RyaW5nIGlzIGludGVycHJldGVkIGFzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYml0IHN0cmluZyBjb25zaXN0aW5nIG9mIGIgcmVwZWF0ZWQgbigxKSB0aW1lcywKK2ZvbGxvd2VkIGJ5IDEtYiByZXBlYXRlZCBuKDIpIHRpbWVzLCBmb2xsb3dlZCBieSBiIHJlcGVhdGVkIG4oMykgdGltZXMsIGFuZCBzbyBvbi4KKworRXhhbXBsZToKKwlNID0gNSAxIDcgMTMgNSAxIDIKKwl3aGVyZSB6ID0gNSBhbmQgYiA9IDEuICBUaGVuIHRoZSBjb21wYWN0IHN0cmluZyBNIHJlcHJlc2VudHMgdGhlIGJpdCBzdHJpbmcKKwkxMTExMTExMDAwMDAwMDAwMDAwMDExMTExMDExCisJd2hlcmUgMSBpcyByZXBlYXRlZCA3IHRpbWVzLCAwIGlzIHJlcGVhdGVkIDEzIHRpbWVzLCAxIGlzIHJlcGVhdGVkIDUgdGltZXMsCisJMCBpcyByZXBlYXRlZCAxIHRpbWUsIGFuZCAxIGlzIHJlcGVhdGVkIDIgdGltZXMuCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEgYi90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExCkBAIC0wLDAgKzEsMTIzOSBAQAorIyAgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgIlNIQS0xIFRlc3QiCisjICBTSEEgdGVzdHMgYXJlIGNvbmZpZ3VyZWQgZm9yIEJJVCBvcmllbnRlZCBpbXBsZW1lbnRhdGlvbnMKK0g+U0hTIFR5cGUgMSBIYXNoZXM8SAorRD4KK0RBMzlBM0VFNUU2QjRCMEQzMjU1QkZFRjk1NjAxODkwQUZEODA3MDkgXgorNTlDNDUyNkFBMkNDNTlGOUE1RjU2QjU1NzlCQTcxMDhFN0NDQjYxQSBeCis2RTQyRkI4NDA2N0NGRjA1NkM0M0E0OUU0ODQ5OTdBRjIzMTkwODc5IF4KK0M2M0ZCQjlBODcxNzFBMTc2RTZFMDU0ODkwRTI5QThDNUYxMjVGNkMgXgorMzEwOUUzM0MxQzRCOUEwMTY5RDE1OTkxNjlEMEU1QTUyMEExRTcxQyBeCis5MTk1RTFFNzNDQzY4RDcxNzBGNDRCRDFEODNDQjYyNEJDODdGQTBCIF4KKzY0RjdDMzc0NTI3Mjc4QzA0MzZEQkM4REU1QUFCRUMyQkJGNjM0QkMgXgorMTU0QjYyMkVBNDI2RkIxNTFCMUZGMUJFMUNFODcxNzUyQjlFREVCNCBeCisxMkJERDAwRkQ0MDM4NzU2Q0JDRjhFQ0RBRDFCMENEODYyNjAzQ0Q4IF4KKzY3MDBGOTNFMTY5MUU4MzczNTI3OUUxNjdGNjdBRjYxRkVFOTgxM0IgXgorODRBRjIwQTA2Nzk5RjM2NjQzNUJBMjBGOTlCOUExMDk1NUI2RDI3NiBeCitDNjIyRkUwMDNGRDE2MjIwMzU3Rjg4RkM2QjlERTQ3ODlFNzdDMzIxIF4KK0M4REVBNUE5OERBREExRjk2NjJENUMxNTA2MTgxNDBBMTUwRUNBNDYgXgorRkJCNzEyN0U3N0EzOUQ4NTZFQzg0OUQ3NTVDODY4Q0E3QjlGMTFFOSBeCitCN0Q4QTdBMzlBQjMzRUQ4QzNBRkQ4Rjc2MjAxQkYwOTA0MTQ5NDM3IF4KKzE1NDUzNTQ2MEExMkI5RTEwMEUyNTFCQjNBNEQ0REJDRDgwQTMwOUEgXgorODJGQzYwMjBDN0E5QjYyRjMzNEY3MTU2QURBNjA4NTMyRENBNkEzQiBeCis5REQ5ODBCODA3M0IzMkQyMUU5QjIzMjRGOTgyMDI0Mzc1QzI5NTFGIF4KKzQxOUY5N0E5ODk5NDg2REM1M0M1OEM3NjFDRUI1NjQzMTRGRDQ3QkQgXgorQTIxMkU0M0VCRkIzMTM4OEY2NEMwQzBCMEIxQ0M3MDE5NzA0Qjc0NCBeCitEOEYxNjIzQzE4NkE1NjE1RjU4RTg0NkM5RDE2NEYzNUE4OTU2RTQ0IF4KK0FBMzI4NDhERTE0OTkzNjU3MzBBMzY1MEEzQTc3MDNGRDQwNDI1OUEgXgorNzlCREIwMUU1NUI2MUE4QzFBRkJGNjNEM0NFMkRDQ0FCOENGM0RGQiBeCisyM0JGMzE2NEE0NDhBNzI3QkE3MTQ1N0VCQTlGQ0ZBQkZCQUM0RjcwIF4KK0JBMjZFODQ2RUJFRjc0MzRCNjNGNTg2MkZEQTAwNUExQ0VCNTY1NkUgXgorOTg2MjI4NjlBNDc0RUE4NUZFNTc1Q0Q5NzkzNTQyNDgxNDFBMTRBNyBeCis1QzlFN0U2OTUxRDM4NjIwNTU0MkRBMDY4MEUwN0U2MEVDNjFENjRFIF4KKzhFRjA3QTAyQTcwMjNBQTBFNkVFNEJFMTUxODYyN0E1MjFEMUY5RDUgXgorQ0RFQTM4MkE1REZEQTFDNjMzRjhCQkM3N0YyOTFGNDBFODgwMUNFMyBeCiszQzBBNzA5RkVGODVEREJDQzFCMzYyQUExNjIwMTA0NjFGMzFBRUNEIF4KKzEwQUJENkI4RDk3RTY4OEFGNUNEQTc5NTVDRDNDQzA4NTBBNEE3NUYgXgorMEVDNTMxMzNGN0ZGOTU1Q0EzN0QyNTQ5MUI1OTJERkMwMjU2QkYyMyBeCisxQTQ2QTY3RkVFRDE2MDQ1MjNDMDYyQUFDQzI0NTUyMjNCMzY2RDA1IF4KK0ZBM0RENzQ5RThGM0Q5MDI5RDkyNjFGMjUxNTdCM0MwRTJERjY4MzQgXgorNDNEQ0FDMkNGMjBFN0NDQjFERUQ2RTM3OUNDMzAyRjMwMjY1NUYzQiBeCis4QkEyNUJERjMzMTY3MUNDQjRCNjA5NjFFNEFGMzU2MjI0MDI3ODYyIF4KK0FDM0EzRUEwRkI4NzI3MzM0QTQ0NzhFRDE2NTEyODU4MUJCQzVCRUEgXgorQ0E0NDA2QTIzMUVBMkNBMDZDRDFEOEYzQzc3RkVGOTExOEIxNTAxQSBeCis1QjgzNDY1QjhFRUQxNDg3MUZCNTFEOUU2Q0U0OTlGQjJFNEI0MjA5IF4KKzk0NDVGNTIxODYxOTQ2RDQwNjNFMENBM0Y0MUY1ODA4NTVBNzQ1NEUgXgorQzI0MTAxNDA4MTg5NjJGOTU1MDZCNDA3QUU4NTE0RjExRjg5MkFFQyBeCitGOEY4MjZGRTBEOTNGNDE1NDI2QURCNjk1NjI0MjExNkNCQUIyNDI2IF4KK0M4MDNGNzUzOUFBMDM2Q0JCMzFCNzM1MjM4MTIwRkI4NTE4MEQ4QzggXgorMTYyRUI1MTYzNjkyRDlCQzdCNDUyOUQyMTRCQkI5MzIxNTczNjFCNiBeCitENEIwRDg3NkExOTUyQURCNUQyN0ExQTZCRjcxQkNGMjI3MzFBNEM1IF4KK0NCNUNEMjZBQTM5RTQ1RjI0ODcwNjYwNEVEQjlBMkRCOEVEQzFCRjYgXgorRjFBQzk4N0YzMEZGMDM3NUY2MTE1QzBDQ0Q2RTIyRERGRDBGQUZFNyBeCis2OTJFMjA5RDNBNkEwMjI4RUI5ODIzRENCNzM4QjE2QkRGOTdBNEU5IF4KK0ZCOUUxRTcxRjc2NDVFRUVFQjNEREU2NjcxNkRDNDQ0NDRDRDY1N0MgXgorRDUxRjA3MUUzNjBEOTYxMjREQTQ5QUQzN0UzN0RFMTdCNTY0OTIwRCBeCiswNjY3QUZDREJCODJCNDIxMzQ0N0QwQjIyMDA2REM0QTEzMjBDRDIxIF4KKzhGQkZDNjVGRUIyNTY1RjJGQjhBOTk2NkI3NDcwMjM1MEM4N0NGNDAgXgorOEE4QkJDRDZBRjc2RTcxMDY3RUIwQUY1NEY5MEVFNUFDMkI1ODgyRiBeCis4RDgzMUVGMjM0NEUzMzZDQzI3MjgxMjI3MTg1QTM0MzU2Qjg1NkE2IF4KK0RFN0FBNzQyNEY5MkNCQzUwOTY2RkM0RTZBNTc3Rjk4OTA1OTk4RkMgXgorMTA2NEVFNkJFRjcwNEYzQTYxOENCOUM1OEYyOTlCMjJBNEQzNDI5MyBeCis5NUY4Q0Y3RTg2NEZFQkJGNzdFNDYwNjcwNjNEMDhENTE3NUZDNTA4IF4KKzc5MzgxRjIzMDk3MEYxMjBEMTlCMTE1QkY4NjRDNzk0ODc4RTc3OTcgXgorRDgyQTMwRjQ5NTM4NTYxRDVBN0QxMzI0RUNBRDMyMUREMDVFMTIwMiBeCis1OTI2Q0VFQUU0M0QyOUE3QkU0QzBFRENBNjI2QzQzQUJFMDA0MTZBIF4KKzU2MzQ1OEM5RjJDMTZDNUFGOTY5MTVGQ0Q5MzA2RjFEOUJBNTc5QzkgXgorQzkyQjBCRDYwNEU0NUQ3NDc5QUUxOUY2NDFCMkRCMDY3RTRDQTc3NCBeCitENjlEMDEzRUU1Qzg3MUQzQUUzRTM4ODA5MEJDMUFBRjk4NTJBODNDIF4KKzdDMzQxRUNERUU3Mjk4NjA1OTMzNDY1RUE5QURCRTdFMDQ0QzhBNzkgXgorODNFQzY4N0QyMkExM0VERENENDcwQzUyQzQ1Mjc2QTZFMTU1NDk4MiBeCis2RDI3OTI4RjAxNDI2OUNFQzRFODc0NUVCNzNGQTcxNEJFMkRDNjJFIF4KKzc1QzBCRjMxMkMwNTIzMURBRjdFOUNENENBMzNBQ0E3OEJDQUE1OUEgXgorMDE1RDc5OUM2MDJERDRFMzBEMkMwMTA0QTU3QjFFMjE0QTQyM0Q2NiBeCitEMkY0M0VDQUQyMEYwQjRDNTdERDA3RDNDRUNFNTYyQjZCNzJDN0ZCIF4KKzI3OTQ4Q0U1QTU2RDU3MjQ4RDRERjY4M0RDM0ZFMDIzRDJCOUI0M0EgXgorMkQ1QTk4NEJGMzJERTI4MjQyNzQ0NDA2NDY5RTE4QjdBNTE3OEE5NyBeCitGRkM1QzRFQ0YwQ0MwNTEzMjBFMDcxRDE0QzdEQ0E0QTREREEzMDVBIF4KK0NFRDhBNTQ4N0FEMTNBRjAwMDMxMjk2NTlERTI1NTYxODM4MzZDNTQgXgorNTk5QkI1MDk4NjNDQzVEMjc1NDE2RjZEQjZDNUQyQkQ4MjdEQzM0NyBeCiszOTgxREFDODk1RERCOTI5NEQ5MzNDMUNFNzg4MjhFM0E1NThCMTUyIF4KKzkxRUI3MTU5MDQxMjNEMzI2QjIzQUNENjg0REZCRDcyMDNDQUJFQ0IgXgorNUE5QUM4QzM3MDVBRjE0RERFNTBFNkNGMkZFNUIwQzE1QzRCRDI4MiBeCitFMjYyMERGQjQyQjVFQ0FGODVGNTkwQTcxREY2OTY5MDZBQzQxQzREIF4KK0NCQUFEREE3QjVEQjM4OUJGMTc3NUFFNTAwNDAwODFBMDVBMEVFNDggXgorQUFGODBEMDc5RjNGOTgwQkY5RDUzNjZDNUIxOTkxQTNFM0Q5RkRDRSBeCisyQTg2MUY2MTY2MDRDNTI2QUNCMTU3NzMyREM0MzFFODFCQzlBMUY2IF4KK0ZCREIyMkFBMEI4NzcxOEY0NjRDMEQxQUEzOTY5NUExQkRDRTA1M0YgXgorNDMzMUJBMzMxNTIyRDRGOUNENjEzNzg1OERCOUFBMTZBQzk1MzE2RSBeCiszM0Y2QkZFMjNBNEMwRTA0QjhCRjY0MkNEOTY0MzdFRjAwNTVBQUY3IF4KKzIwNDYxMzhGNzg5OUZEQjIwNjNDRDg0Qjg0RTgyMTUyNTE3MkMwM0IgXgorRTRGREM4MTJDNUY3QTM3RkM3QTgxMDA1RjFFNzhCRkY1OTY2Njg4NyBeCis2NDc3RjkzMUFDMjBCMkZDRTFDOTIxNzFGQTREQ0YyRDI2NkIzREM1IF4KK0VEMERENTE2RkE3RkUyREI3QUZDQzNEQkVFRDA4NzlBMEMxMEYxQzIgXgorRkNFREEwMzExQzA4NTM2OEE1NzUxQkNBRDhFQUVEMjA2M0MyRDQwQSBeCisyM0VCMDhCNTEwMEM4RkJBRjdCMzA0OTg4N0ExMUNDNTMxQjZDRDc4IF4KK0E2QzQyQjc1N0RGMDc4QTY5RkZGNjgxOUE4QUJDNDZFMUIwOUY0MzUgXgorMDYxNUVFNDg0MEIxRjFDRDYyODYzNkQxQjRGNDQ5NTYzOURFREVCQyBeCitFMjI4ODExMDAwN0FFNkRCQ0NGQzc0Qjc3MzVGNEQ5NEIwQUExMEExIF4KKzE1OUUwMURDMzQ4RUIwNjdFOTBBNjNCQzZGRUZCRjRDNDVBMDFGOUEgXgorQTE2Mjg2NDU5Q0M5ODlBRTY2MkM3MzFGM0Q3RDBDRDQ4N0RDQ0IzQiBeCis4RkRBRkUyREUzNzIxNUUxNDJFMjdBNjVBODgxRjgwRTA0MzBCRjQ5IF4KKzFCRjk3OEI1OEQ5OEZDMTU3MzFGNDExMUU3QzdBNDlGOUNGRDdDNjUgXgorQzFGNjFDRDRCNERCMTRBQTYwQzY0NDhDMDM5OEVFQzcyMTA3ODI2QyBeCis1Q0YwQTdGNkY0NkE3MzBDRDkxMDNBNTRGMUVDOEE3NTQ5RkE1Nzg4IF4KK0ZEQzEwNDIxNzk0MEJFNUE3QUQxQzAyRDEyOEIzMTc0N0M5NzJBNUMgXgorREZGNThCRUY0RkY0MThEMjZBMzVCNTUyMTVDRTQxOUQzNTc5QTE5NCBeCiszQTJFRkQ0NDRGNEFBN0EzREI5NzY1RTAyN0NFNUQ4MkI1MUY2NzM3IF4KK0VCNjE2QjZGOTdDNUJGRDAyQzFCOUU0QUZCQThBNTE1MURENDE2N0YgXgorNjJGMzFGOUEyOEQwNTg3QkQ4MjUzNjAxQTdFRkI2OThCMDMyMDVGQSBeCitFODc2NDVCMkNCN0RGNjZEQTI3NzFBQkUwQ0VEQTBGNjI1RkM4QUZBIF4KK0U4MDFDMzA3MUNBNkFFRTI3OEIyMjI3NDdCRkE4MTlDMTE4QTJEREQgXgorRUM3MDIyM0JEOTYzQzEyMkU0RkNFMjkyODkzNERERDJENzY2MUNCQyBeCis4MjI2MUQyNjM3N0E1QTVEQzY5RTBGMzlEMEJCRjU5QTFCMkIyMjQ4IF4KKzJFNERFNzgxRTQ0MDdBRTUzNkY3MERDNUE1REJFQjE3OERCQTJGQzMgXgorQUQzRDk1OEI4ODRDQUEyOEQ1ODU4REExMDM0NjNDMzAwODYyREVFNiBeCisyQTZBNTYzQzdGRTMzMTI5NjM3RkFCQjRENDBGNUYwRUU4QjVDNTAwIF4KKzdFQTYwMDNBOEJFRjRENUJGQTZCRkVGQkNCNkE1QjNCMUEzQjc5OTEgXgorNkREQzYyMERCMTQ4ODI1NzVENUJBMTIxOTI4NENGMUMzMDY4MDk0RiBeCis5MUFEN0U1ODhFQzgyOTczOUMzNjMyNjU2REUxOTE1QUMyM0M4Q0Y1IF4KKzMxMUE0OTFDMUI1RDhBMjZFQTJBNzdBMzZCNUQ1M0ZEQUJBMUZCMkEgXgorOUQ0Qjc1MkFBOEZEQUY5Mjg5N0IwM0M0RDY1QjY1RUFCQkRGMDYyQyBeCitDNTY5RkY2RjA1OTI2NjRGNjkwQjAwOEVFN0ExMkVEQTU3NDBGMEM3IF4KKzFBRTM1RTlDRDNEMEE4QTE2NUIyNzU4RTFEQzRGOUQxQ0QzMEZCRjkgXgorODE5QTgzMzE4NzAwRUE4NjFDQjY5RjZDRDhFRDRFQ0Q3OENDM0NCNyBeCis5ODA5OUI1NTBBODJDRTIyRUZBRTQ4QjU5MzVGNjM2RDU4MTRGREI0IF4KK0NGQURCOTk4MTY3REIyODlBN0MxN0JBOTRERjdFREEwMEIyOTA4NUUgXgorM0Y1QTkwQThGNzU3OTM2OTg3OTM4REZCOTVGMTAyMzlGOTFBQzI2NCBeCis3NDAyMjY1OTA4RUVBNURBMTgzNDkwRkVGMkVBMkU1NUM5RkMyODYyIF4KK0VBNkVGMEY3MDUwRURBNkI3OEYzNTU5N0U4NUI3QTg1QUUwMDk3RTQgXgorNzNGMjc4MDU0OEY3Qzc5RTE1OTQ1RDdFRTJBM0UwM0IzMERGMzVDQSBeCis4RUMzQzkzQzczMDdFMTRFOUM2NUYyNkREODQ3Q0VCMTk1REUyNzdBIF4KK0NGQkM1NzFBMzVCODJGQjBCN0NCNTk3NTNDNEU4REUzNkE3NTExOTUgXgorM0M0ODAyQTk1NkNGOTNBMTQ4QjkwMzRGQjhGMDQxRUNEOERENDUzMiBeCis1REEyNjlDMUQ1Q0NFRTNDN0E2NkUzMUJEOUY1RTBCODNCQTA2Q0UxIF4KKzcwNkQ5MEMwMDgwMERCOTc5MEFGNjY3ODhEMUIzREM4MUUzRkY3QTEgXgorNTlBQzg1NjQ0N0ZERDI3NDIxQzUyRUE2NkU0NjVDNjRDNTAzMzcyMiBeCitFQUNBOUU4MkQwNDNGMkI2RTEyRTY0Q0YwM0Q4MkVEOTJGRDZBNjREIF4KKzgxNjA3NTVCQTA5Qzc0Rjc5REU4Rjk0OTZCRjBDOTI0OERCN0Q0NUUgXgorOENFNDM5MEMxODVCREZDOEJDOUM0RDNCRUIxQUI3NTdDNDRGNjQzNCBeCisxQTFBREI2MjhFQjdCOUNBQTgyMUFFOURFNDE3RTA5QTQyQTk3MTEzIF4KKzk3QzRGOTJBNDZFRjNGOTE2OUE5NzdFMTY0M0MxMDc0NUVDREFBNEUgXgorNDA4RTUzQzAzRDEwRTJCMzIyMjJGMkI1NEQxMThBQzRENjVBOTM4NiBeCis3MTA2MjhFODExQzIwNzc4NEUzMjU1REE4NDMyQ0U2RTE0QjYxRkU3IF4KKzRGNkRCNjIyNzc4RjRCMUI2MjAzQkQyMzkzMTJEODY1ODlGMUIyNjEgXgorODg4QUQ4RkMxQ0E1Qjg5MzI5NEZEQjhGQzk0QUI3NzYyMDE4QzFGOCBeCitBRTM2QzJGNTQyMjNCQzA4MkREQTBENTI4QjcwQjJBRUExOTA3NzlDIF4KKzRCRDJCRjkxNDIyM0RDRDBDQkJDQzQ0NDMyM0ZCRjBFNDg3RjI3QjYgXgorNzUyNkQ1REY3QjJFQ0ZBQzdCRkY2MkREN0E0QjVGMzg0NjMzMDVGOCBeCiswRUQ3Qzg3QjY4RjUwODEzQUFENUU1MDE1OUNCRTBCQkY5QkYwNUQyIF4KKzRENUNENEU0MEE2NjY4ODkzRUVBMTVGMDI1RUNCODE4NzQ3NURGNEYgXgorRDM4NDQ2RTg0MkMwQTk0RjE3NUI3NzJCREM3MDdDRDJFRTc5RDA5OCBeCitEREE4NjhCQzI5MDNDNTVDRjI3M0Y0OEU5QjkyQzA5RDkwQ0QwMTc5IF4KKzA4NDEyNjhCOTVFQ0ZBQUI5RkUzNzg3QkE3MjYxMjI3QTFGMjMyOTQgXgorRDNEREYyMEI0QzBEQjY2ODQyMURFMUYyNDJCNjVBOEM4M0ZBODY3QiBeCisxMTJGM0NGN0RBQ0E3NTI3ODE5RDE2NzA0RUI0MTMwMkE0RUU1MkFBIF4KKzk2MDcyQTNFQTQ0NjNBMTU2QjNCRDlFQUVDMTZBREIwOTA1MTYwQzkgXgorNzE1RjE5NUYwOUUzRUFEM0Q3MEFFNTFERUYxQzk3MDk1MDBDMEE2QSBeCis4QTExMkNBODJDRkVCNUYzMDAxQjdBMDA1OTE0NjJGNDEyMEREQzAyIF4KKzUwRkM5MUU5MTUyNzBEMTIwMkY2RkM4NzkyQkUxNkVDQjczQ0U0MDUgXgorOTA3NzM2RUM0NUJFN0JFREExQjE1NEVBMjgyQzUxQjU3OTU5OTFGOCBeCiswNUQ0OTQ2Mjk5MTI3ODcyMEVCNDRCRUE2NTZBQjQ0NDJDODg0NUMzIF4KKzZGRDU2RDA4QTJENDYzMEY3MkFDOTdFM0M5NEE5NTc1RjMwNDY3MjkgXgorREQxODgzMzc2Q0Y3MTNDOEQ3QUVCRkVDNjBENTFGRjhFMkE4MDZFOCBeCitFMDQ1N0ZFMDBGOURFRUU5NThERDZBRDk0OEVERjlDRDk0MTJGNzNBIF4KK0JBNjUzOEU5MUIyNzY1MDRDODRFMjEzQjMyNUI0QTc3MDNFOTI0QjQgXgorQzIwQTlCODQ4NTAzNjUwREU5NDYzQjk5OTJFQjk3NzQyMkJCNTNERiBeCitCQTRBNTY1RTVDMEY5RkFDODlENTVBMkI3ODRGMjkxQzdCQUQ0MjU1IF4KKzY1MTBFMDlBQUQ4Mjg4QUI4MUNBNTRERDU2NTZERjU3RDBFQUJCRTYgXgorMzM5OTZDOUM1QUQwNDg4M0JDRUI5NzcxQTVDNEEyNzJGODg1NTBCMSBeCis3Qjk2RjNDMTI3MkFENzY1REJEQzM1QTU5MjQzRjZBOEY3NUZBMzUxIF4KKzVBQTc2QjE2RUE0REZCMjY3RDg4RkY3REJFNEYwNTUxODRBNTZFNTYgXgorMzNCOUNDRUIxQTZFREM4QzkxRjYwMzQyNDVCMkUzQUFDODk4QzY3OCBeCis3MDFBMzJGQzBCMTE2M0JDNTVEQjc2RkE0NkY2OUI1NzRCMzgwM0EwIF4KKzVENkY0NEE0QjUxNzVCQTg3M0JGQTMzNjlEQzhCRkIwQUQxQUMyNkMgXgorMDcyN0YxMkQ4RTU1NEVEQ0I0MzVBRTNCRDY0MjVCMTk3REY2RUUyRSBeCis2RTFGNDZEQzRGQUQ2NzE3NTlBQzk2OTk5ODY5NEJENzkzMjYyNDZFIF4KKzg1MjMzRjlDRkQwNzgwQkQ2MDI0MEEyMkUwMzdDMTRFQjgyODZDMzMgXgorQjY2Q0M3MzMyMzQxRkE5MjYxRDk2MzYyRjBCQkQ3QjY3NkY5NUUwMiBeCis3ODJBNzhGMkZDMzJFMEI2Mjc3MDJDNTQxMzQxRUQyOEIwMDlCQjZGIF4KKzZCNzkzNTI2NUM1Mjk4ODBEQTVCMTY2RURENjYwQkFFMTRBNzcwQTkgXgorNDlDMjk4QjFDMTBEMzgwQkFDRTI2RTkwN0MyMTNDOTAwNTJENzUyMyBeCis0OUNFNEQ0RkY5RkZGNjcyNERBMDMyRkYzM0Y4QzVBNzc5MkQyNEUyIF4KK0NEMkM0RjE5QzEyQjA4NkMwNzFCQjZCMjBFOEU4MjEwQUZERDJENTAgXgorMzk3MTBGNzdCRTU2NEM0MTdDODBDQjZFNEI4N0JFNzJGQTgwNUE0MCBeCitGNzRBNkE0NUY1QjI5NzlCNUU3NzMwMDdCOTA4MDRGMzIyRjEzQUQ4IF4KKzZGRDZBMzQzMzkwNDdDRjEzRjc3N0M0QjdEOUUyODdGNDk5RkIxOUMgXgorRkRCMDRGMDREM0IzNjRBNjk1M0MzNDFFMzQzRTMxMEYyMzgzQTY1NSBeCis5ODFFODcxNzUzOENFOTg5OThFOTUwRUFEMjg1OTZCNTI3NzM2ODQxIF4KK0UwOTk5ODdEQjBDQzYxQ0Y2MDdDOTg1MjMzNkNEQUY0NzhERUUzM0YgXgorRTlDNDJGMjVBM0UzNTQyRDE1MTBERDA5QkY1MTZBRDgwOUQ0MjcwMiBeCitGN0U1ODBGQjIxQzcyNUNCRUE1NjNCMTkzODk2ODYyQjlCRUY3RjI0IF4KK0Q3NzhBMzI4N0Y2OEY0N0IwQUE0MjE0MTAyOTJENDc4MDU5OTdBOTQgXgorNTM0REZFNzU5NzM1NzIzNjQ5RURDODlCQ0IwNjNDMENDRkVFQzM0RiBeCis5MzgxRkI1QkQyNjY3N0E3NzYwRkMwMjg4NTMyNzU1MDYyOTg2REYxIF4KKzI3RTk3RUU4Mjk4MjAzOTk1OTVEQTBBMDA0N0I3NEQzQzRFMERCRjEgXgorRDM4NDUwMDcxRDFCMDc5QTlGRDUxOEQyRjMxN0M4M0MzMzA5NEY0MyBeCiswMjIxQjhFNEQyRkE2NkQyRUJFMUIwNEU2Nzk2NjJDRTQxNDA1RTQ4IF4KK0I5QkM0RkRDNEE1Q0UwMEVGQjkxMUMzMDYyRDZGMzMzMDQ3MDFDMjggXgorNDYxQjQyMDY2MThCNzY2Qzg5RTZEOUFCMkY4REIwNzkwMzg2MDIzNCBeCisxMjJBOTMwNkIxMDJGMkM1MEI3MzY0RTFEMjRGRUNCMDY2MkUyOTU4IF4KKzYxRTkxRjVEMTY3MDY2RUM5MDQxMzRBQjFDNEY5RDExNkM5RDNFODAgXgorNkI3NTU4QkQ4RjREM0M1OTE0QTlBQjVENzQxOEY3REI3NzU4M0I1NSBeCitDRTQ4RUE5NDg0Mzg1NDU1NURDNDhEMjREMzI0MDVEQUI5REJBNjEyIF4KKzVBNzIyQUFDNTc2RjQwNzhDMDAxRDA2REE5MUMyODEzMUE0RjkyQzUgXgorOUI4RkUwRjFFNjU3M0NDNjgzMkJBNjlERUM5RjZFNjQ2MjI4QTM3NCBeCitGOTg0MjlDQTI3OTlFNUNBQUVEREZCMTY4Qjc4MkE1NDM4NEVGMEE4IF4KKzE0Mjg3Nzc1NEFCOTVGNTdBQTU0MUNCOTc4QkE0MDBFODEyQUVDQzkgXgorNkQ4NEQwNTNDQ0Q5RTY4Q0FDNTc4MDg5MjQwOUY2MUIzOURERkQ0OCBeCitCNThDQzlDRTBBRTNEQUFBMDJFM0MwNDAxMDBENEI1NjhEMjlFMEZBIF4KKzE3RkIxOEZBMzJBODIzN0QzMkNGODNBOTY2NEIxQjJFNDBEQzVCMTEgXgorQzdGNjVFNTRFNjA4Q0VGMUM3QTEyMEJFOEEyOUZBNkM5NEI2ODBEMiBeCis5QzQ2MzI5QkEzNDA3NzM5NEI0MzlDNTQ3NkI5MUQ5REYwMTlCQTc2IF4KKzM2MTJCMzgxQjgwQTFERjZEQTc1QUIyNjU2QkQ1QkE4REU2OTk2QjUgXgorRUREOUJDQTFDNDMxMjAwRDMyMzRDMDk5NzkxQzgxRDg2MDUwOTFBQiBeCitDMTk1MURERUNCOTc5NkMwRDM5RUQ5QUZDQ0JCNjUyMDBBRUFCMENCIF4KKzU1RTRGNzg0NkQ5QjkwRDhCMzFFQUE1QjkzNzFEMzk1NTkwQjY1MjggXgorNUQ0MEI0MzJBREJERjNBMDEzNTVGRkZEREJBNDc1ODZCM0RDN0M1MiBeCitBRjVDNjc1RDIyNDlGNENEMjBFNzBEQzlFMThCODhEM0FDRkJENkJGIF4KK0IwRUI2Nzk2QTIxODc2RkFBRjUwRkNEQkEyRUIxMjFDNEI3NDIxNjYgXgorM0M1NzdDNzBCNzY4MTBEREY5QUQ1Nzk5MTAzNDczMTJCODgxQzMwRiBeCiswQzE2ODk3RDIwQzVGMzUyRkE2MTEwQzcwRjlBOEMzM0NBMzVDQTIxIF4KK0RCRTBCNDM0MTUyNjA2MEM1QjM3NTc2RjZCOTcyQTFFQjg5NTQwNTkgXgorMTU2N0IxMEUzM0ZCQkUyMDAzM0Y1QTUyRUI4MTAzNDhFRDE1NEYxOSBeCitDMUU0NzI4OTQxMkQzQUNDMjA4NjIwQTFFQTY3NkNFMjgxNURENEZCIF4KK0FCQzIyN0VGRkRDRTM3NTgwNjFDNzc5NzE4NjAyNDdFODUwMzgyQUQgXgorQjI5RUFDRUM5MDNCQjhBRjdDQzFBNjM1MTYxNjM2NDBGRkU2MjgyMiBeCis1Qzg5NzZBMUE0RkNDNkI2RkFCNUVFNjMxRTNDREM1NjFFRDVGQjEwIF4KKzFBMUVBNTEwN0NDNDZCRTkwOURGODE2NUMzRUZFRTg2NzYxNjE5OTEgXgorMjY4RTg2QkEzQTgxRkFEREIyMEY3NERENDRDNUJDNzFBOThDM0QwOCBeCiswNTA1N0U1RTc5MzRBQzlBOTE0MUQzOUI4RDRGNUVBNkFBMTRGNzRGIF4KK0MwM0VBNzJDNEQ2ODk0NTcyNkRGNjM4MDM1NjRFNDM0NDI2MzAyQkEgXgorNTRBRjIwQkZCRkVBRDZCQjJERDY4RTY1RDM5RDQyN0RGN0UxN0ZEOSBeCitGREU5MzhEQjA4NDNBODQ0REMwRjY2MDE0OTdBMzlBQ0YxNjdENkREIF4KK0VEMDI5MkQwQkQ4NjlCNjZFODAwMTQ4MjRBM0Q3ODg2Q0Q2RDM1OTAgXgorNzQ5QjY5OTY0RjVDMEQ5RDAyQkY1Q0Y5MDNCMkU1NkQwOUNGMUI5QyBeCis2QjE0M0QzMDM2NkM0NUYxNTlCODNBOEQxQUU4QUFFQzg4RTQ0MTM2IF4KKzAxMTY5RDY1RTcxMDE0OTQ2RDBCRjY0QkY0MzkwNjg5NzhBQTVCM0EgXgorNEMzNkUwQThDMTlDMEFBNkM4MERGMDYxMUJBMzQwNEMxMDI1RTlDQyBeCitBNERBOUVFQzJGNjgyQUY1QjJFRTdDQzg1MjVFQjA3REY2NkU1OTQ1IF4KK0YxMzQ5QUQwMTI0RDExNjEzQ0ZBNDZENDk4NjcxNDg0RTVGMzc3OTAgXgorNkE4RTgyRDJEMjdEM0VERDZFOEIxMTlGNzQ2NzYxQjhGRTgzMTgyQSBeCis1MkU3QzdDNEFFMDI2NTk5NTMwNzlEQUUyMEY0NDIzNTNFRTJCQjI5IF4KKzQ5QzhEODIyNzI0Mjc0Qjg1REU2MkQ5REY1ODZGRTg4MEFGMzk2RTYgXgorNTc4NjZDMEJCOTc2QjRGOEFBQTdBQ0YzQzlBMEY3MDBFNzMyMTZEQSBeCis1NDFBNjc1REQzN0M1RDZGMkNGMjQyMTYzQTVDRjZCNzI4REY5OTk1IF4KKzU1QjI2RDkzNDRENEQ2NDRDQkI2OUM0Nzg5NDczNTQzMjYyRThCOTEgXgorM0E4RjNGMEE5NjI5NzAyMEVFQTU4M0U5QTI4MEQ1M0UwMjQ4REUyNiBeCitEMUZGN0EwQ0QwQjY5QTc2QjVCODBEMkJCNTczNkI4NDQwREE3RjdCIF4KKzUzRTcxNUZBMzlEMzczMkYzOEZCNDc0OEQ0NjQwOUQ5OThENjc5NzMgXgorMzc3NzgxQUJCNEFCNEU5NzRCOUMxNjcwODY3RTc0Rjg3QUI0OTUwQSBeCis4RTdEQTk2OTcxMjY1QUNDMEZGN0MzODExMjdDOTY2REY5RjlGMTNBIF4KKzI4MDM4NzEzQTMzQUNBQUM3MzBGQjREREMzQTcwNzg4NkU1OThERDUgXgorNUY2QkQ0NEQwN0ExQzgxMUQ1Qjc1NjYxQTYxQkI2OUE4MTQ0NEVFMiBeCitENDY1RTZDNzY3QkQwMkQ0NTdENjAxNzY1REQwRkU1NTIxQkEyQUM3IF4KKzQ4N0Q5RTAyOTEyMDA0RTk2MTk2OEYzODdDMjFBNjVBMEU2NTNBRTcgXgorMUY1NERGMDAwNTJCMzc0MDMwMUM0MzQyMENDMkNCODVCMjc3MDA5NSBeCis3QzVCQjY3ODA4Mzg2OEVCODE3RTYxNkJEMDk0MjFCOTEwMDIxNjQ5IF4KKzREMzE1MjZFNEUyRkUzQkQ2REQ0QjNGNTlEQzJFRTJBNTJBOUZCNDIgXgorNjY5RjlGQTlENzFGQjkyRDUxQURFMTVDNzA3NDJGQjMxQjAxMzkwMSBeCiszOEQxRTc0RkUyNkFBNDNENDVEQUJDMTYwREVGRjExM0I3NzQwMjExIF4KKzM3MjRFRjUwQ0RFQUVCODU2MTIzQkVCQjE5MEYzODgzNDQ2MTY2NEQgXgorRTI2MzQxMTJEMjk3N0ExNzlENEM5QUYzNUYyMjBEM0E2MjZBQTA0QyBeCitGMTRDRjgxMzNGRjY2QTNFMjBEMjVFNURDRkY3MDYwNUY2QjhBMEJDIF4KKzgwOUUwNEEzODM0MEQwMTBCNzhCNTI4N0M4RkREMjBDMzkxRkI2MUIgXgorRTUzNDlENEQ2RUMzMUUyQ0Y0MTAwMURGQzQ0MEFERkY2RDI1QjRGNyBeCisxMzlGMjVGREMzNDRFQzI0NTZGNkU0REQ5OTM4RjY1NjkzRjBDQjJEIF4KKzdDNjI4QjA5NTRENDM0MEIwODUxQzg5RjExMDY1ODlDNUM2NDY1QzYgXgorRTY1RTY1RDcwNTAyNThCNkI2QjVCMzU4NjY4NDBCNUFDRTBEQkYwRCBeCis3N0QzM0I4N0UwQzEzNTI5RDNBQUM0RDY2MDYyMTNFRkU4MUZGMzk4IF4KKzVCQTQ1NkJBNDlBQkU1MEJCQ0I3NzJGQUFDQjcxRDRGM0FFQ0JENDUgXgorODAxQTIxRjdBQjczNTg1QUUzNTMxMDU4REI5NTEyQkQ2OUJBNUNCMSBeCisxOTJBQzRENTIxMEVDODYzNjA0RkMxQkEzODhBRUE4NDU1RDQxNzVEIF4KK0ZEOUYxMDNFREZDNENDOUY5QzQyNDI2NkVFNTRBNzlDMUM5ODdGOUUgXgorMzYxQUM0NkQ5NkE2OURENkU0MTZENDU2M0Q3QzY5RDNCNDg3RUZDMSBeCiszQTc2MjkwNDVDMDE5M0ZFMDg5MjhGN0Q0MUI4MDE4Mjc1OTMxMTZCIF4KKzU0NUIyRjVGRDAxNUY4MUJERTFEQUZBRkNBMTg0RDI1NTkwNTYwQzkgXgorRkVGMkM1MERBMzM2MjEyMDY0NTBFMjFEOTI5NTFCMjUzODU5OTFBMyBeCis5MTNBNDE3QUMxRUNFMDg5NTJBNjBFMDAzNUY3MDk5M0YxNjFFRjA1IF4KKzRGRkM5NTQ4MUY2RjYyNUIxQjhFNjdCMTMzRjExNjE5Q0U1QzE0NjAgXgorNUQ2RDA3NjVCMTU2RkUwMjg3ODAzMzFCNkE1M0Y4NERGQjEzMEYwQSBeCisyQzVFQzg5RjEwMThEMzRBQjExRTBDQjZGREM4MTJGODI0NzBCMTY4IF4KKzM0RDYyQ0RGRjk1NTIzM0ZFN0E1MzA4OTI1QzI0Q0JDREMwNTc5QjggXgorMTE0ODk5NEQzMEY4MEM1Njg5RDdCQjE5Q0ZCRTMzNTQ2ODcyQjRGQyBeCiswNzRGQ0EyMkE4QTYzRjQ0NkM4RDE5NjYxMkY3QzgxMkMyMkNDRDhCIF4KKzIyOEZFMjlGRDEzOTI4RDhGRjBCODUwRTUwREI0MURCNDA2RUZDQkIgXgorRUZGN0JCRjhGMkY3REYzNkFENTFFRjNENzQ4QUFCOEQ4REFCN0I3RCBeCitDM0FFQTZBQTE3OTcxQzBBMTQzQUNFNTRBOENGNTE1RjlFRUIwQkQ2IF4KKzRDM0E5ODBFNDA2MDJENDYyMUMyQUYxQkVCMUNBRTI3REYxOUFEMzIgXgorRTVDRTJBNDFDNzIyMjlENTg0RTQwRkJBNjdDNjk3RUZBMDhGNDUxRCBeCis2NEE1MzY4MjY0OTU5QzczRkIwQTEyRjg1RDRGQTE2RjhFMjVGRjA4IF4KKzhGQjc3MEFFQzE2NUE5M0E2RDk5QTBEQzUyRjM4NDQ0RTAzMTMwNzMgXgorQkNGRjNDNUU1QzU2ODc2QTNERDhDNEM5MEQ0RTgxOUI2N0Q3MTM5NCBeCiswRUYyMDUyMzc1N0UyNTYxMUM0OUMxRjI1OUQ5NDM4MUIwOEZCOTBBIF4KKzVEOUYwNURBQjkxQzQ2QUREQ0U0QjE2M0M2RkNERkI1MjMwQkRGRkEgXgorMTFCM0JEQzVGM0JFMDkxNDhEQTA3Q0Q0MkVDOUMyOEM3MThENkE1QiBeCisxRUFENzZFRjE4ODQwQjMxNzYyOTZGQTU3NzkxRDgzMkI3RTQwMzVDIF4KK0FGOEVCQ0JCREY1QjhDRkMyMDNGQkQ4NjQ0QjE1NDQ0NTY5MEIwMkUgXgorMEExNTZEQUQzNUExMEFBN0U0MUM1Q0IzQjMwNDNBMDUxQjcxODBCNiBeCis5QjNFNUY3OTdCQTI0NkU1REU2NjBCOUEzNkU1MkMyMDRCQUNFODIyIF4KKzc4NzgwMzU5Q0QyNEEyQjcxNTdGRDZENTVDREZBNkY5REUxNDlGRjUgXgorRjJEQURBQjQyNzU2MzNGN0VDREZBOTcxRDgyNEEzMUIxQzhENjY0MyBeCitFQTY4QkE4RjE2RDgzNjhFNjY3M0E1QzVBRUU4NkJBNUMzNkYyRDk3IF4KKzc4OEFBOTQ1MTE5NkUyQkREMDMxRTc0N0IwOThENzNCRTExM0MwOTMgXgorMThGRTI1OUIzNTczRjUyRjIzREFEMzNGMDVEOUM5MTk0MkI1MTZERCBeCiswRTQ3ODdGNDZBRThENUQ3Q0M5NTg5Qjc2RDAwRDYwOTgzMDc5RDc1IF4KKzE0OEU0RkRGMDMxQ0FGQjcyNjA5OURDRDFFQjU5MUJDMkYyNEQxNzkgXgorMzk4MURGODY1OEFDMkZBNUMzMTUxQTQyNDI2MjMyNEQ0MTk0MERCQSBeCiszQzUwQTM4MDA2MzZFRjg3N0Q4OTA1OUY2NkNENjk3QTlERjQ0QkQxIF4KK0Q5QkFCMDQ3MUUyREI5N0ZENUYzQTQyODg0REZDNzA4NzY4RjYyRjkgXgorNTJERDEwNjMzMjZFMjU1MEI2RUY0MEQ1RUU0RTFBRDY3QzdCQjZCQSBeCisxM0NBMjc4MjcxMjdDNjk4ODEwQUVDQTE1OERDQUE3ODk0RjBDOTEyIF4KKzA4NkJEQjE3RUMxQjhDQUM2ODAzMEE1NkZCRDRDNzQxRDRGOTVEQkEgXgorRjdGMzg5QkM1RUQyMjVCRDYzOTlDQzQzRUYyMkFGRDc3RTg5NUQwNiBeCis2N0YxNzNBRDNBMjRDMjZFOTVFMkVBOEIzN0ZDMDI1OUIxREU5NTVDIF4KK0E3RjM0OEEzQjZGNjdDQ0Y3QzdDNjlFRDA2NUIzRkJGQTgzMkE4QTIgXgorRUNFQ0JCMjUzNTQ0NjhGQjYyQUM4N0Q1Q0VCNjg4RTRBNjcxREM0MiBeCis2MjMzMEJDNDAwMTA4REZBRkYyOThFRkI3NkJEQzI4Q0RDMTUzQUMxIF4KK0JCMEVDRjlDQjNDRTQ0OEI0RUE5QzU3Q0Y1RjFGOTk3RjgxMDgyQjQgXgorMTJDOTc0MTY3MkNFOERCQTE0Q0M2NkFGMzMzOEI2MUUyMzRGOUU2OCBeCitEQjRDQjU5NjFBMkZGNjk2NENFREVDQUVEM0RBMDNEMTQwMTEyRUE0IF4KKzQ1RTREMkJFM0Q5NzI5QkU5RjY5QURCMjQ1QTVBOUNDNzUwNjQ1MzQgXgorRTM1MjUzNTUwQzg0QkVGQzI2QzJFOTdGMEMyMzZDRkYxRDg1QzM2RiBeCis3RDZEOTUwQTE2ODEwNzcwMkNFM0I2QkNFRjkyOThGOUM4RkM4RjNDIF4KKzgxMkY0NTlBQjU4ODczNjREMUYyQTlBMDBDQkVFNUZDMzUyQzM5QTIgXgorN0VFMjdGMzNDNTlCNjhDMzQ2MDQ0MTZEMzg2MDZCRDNGNUNCNkIwNiBeCitENTdFMkE0RjE1REY1QzUwRjI0ODU5MDlFRTMxNDk3MzVDNkRGQjg0IF4KKzNEMTJEODhCNjFFRjA5NzI4MDhEOENBRDQxRDhBMTZBQTdFQ0NDODcgXgorQ0Y5QTdDRUE5QjEwNUFEQUI2QkJBM0NGQjZEMDkwQjc2NjAzRjdDRSBeCisxRDQzQ0ExNjRDQUQwQjYxNkJFNTc2M0Q3RjVFQTg4MzU1OTUzRjRCIF4KKzM2MDBGMDg1QTUzRkIwMTE1QzI2REE5MEQxMTgwRkQzNEVFQjYzMDEgXgorRTlGOUMwODhDMzBBMzdFNkNERjA2N0Y3MjRCRTZDNDc4NkYyN0M5RSBeCisyQkI4NkI0N0VBMzQ0MDBENDM0RjhGNEY5NDgzMENCREE5RDRFNTczIF4KKzMyNTVBN0Q5QTdBMEI1NkQwRDlDNjY1RUMxM0Y3QThDOEYwNURBN0IgXgorNDUzNTk3NTAwQTdENUJFQzhDRkI5NTA5MjZBMkJGQzBGOTJFMTQ5QiBeCitBMTVFQzQ1MjQ3Njg3MEFDNDU5Qjk0MkY2QTZCNzM4MjJBMDc4OTlDIF4KKzVCMTgyMUJGQUY5MTdCQUIzREIxMjg0QTFEMUZENDBFQTAxMUJDQkMgXgorOEREQzI1QzdDQTMzMEExOENGMzk4MjdCN0NCRUMwMEI4NzRBRjE5MyBeCisyODM4MzJGNDVCQjVFNjk2NDlGQzEwREQ2MDdCQUY4QkFENjE3ODNFIF4KK0YzOTQyNkY5QzA0NzQ1OTZCMDI1MUYwQ0JCNUY5MjM4NUQ4NjJEMjQgXgorNzE0RTMyREQ1QkI4RkNDNzVCMTAxM0U2RjFGNTZGOTZEOTdCMzZGMiBeCis5ODhBQzQ1OTJENTAxMTNCMTNGNkVEQjVDMTEzQTIyRTREMEY1MThFIF4KKzkzQkYxNDYzNzg4QjdGNEE0QTA2QUQ0QzE3NDgyREMyNjA3OTdBM0YgXgorNTUzMjUzNUFDQzhBQzU2Njg5NzdCMkEyRjMyMkIyM0FFQjQ0M0RCMiBeCis4NUNDN0FGMDkyOUYyMDZGQTQ0RkNBQUNEQzI0QzRFNzgzNDVCRDgwIF4KKzM5MjE5NkUzRjJGNDA3NEQxRDQ4NUE1MjExOTAxMkQ4QzA1NzQwQjYgXgorM0JBODhCOTFGMUVBMThFNzEyMjkyMzAxRkJCQzM3NUU5QjQ4QkZDNiBeCiszREFBRDFEQUIxNzk1RjJDMUM4QzVDRjUzMDVCNTQ5QUJGQjg1Mzk4IF4KKzZFQzkzQUZBM0FCNjE3NzA4Mjc2RTk5MDY2RkRDMzMxQzg0RjAyOEQgXgorQ0RBMjE5MzAzQjkxQUYzQzNGQkQwQjkyNjc1ODkxNDk4NEFEN0M4RCBeCis1OTlDRTI0NzQ1RUI1NDA4NTU0MDc3MzU0QkQxMEE2NUY2QkMzMDM3IF4KKzA3OThDMUI1M0Y5NDlENjQzRjdCRDY2QzE5NDcxNUU3Q0FGQzZFMTkgXgorQTE3MjMwRjE2NEU5OEFCODNBQzExNDE3MzBCMjMzODlGMEVCNDczRCBeCisyQzJCOTUxNzNGMUIwNjE2NUUxN0VBRTM2QTUzQzdBQjY0MTI2N0MzIF4KK0E3RjQwOEVGNDQ5REM5Mjk2MTYxN0Q0QzUxQjU1QUU0RTQ1MzZFOTcgXgorMjI2NkM1MTMzQjZENkIwOEEwOTg5N0FFRkEzNTVDNzY4RjcxOEM2QyBeCiszNDNGMTBFRTZFQjM0REYwMDVFNzQ5RDFDNEE5OEY2NDUzNzI3MkIxIF4KKzkwRUVCNzZCMTI2RTYzMjMwOEY4NjU1RkQ0OUM1MjAwMDAyN0FBNDggXgorQzdFQTNDN0Q0QUE4RENCRTk1ODBDNDQzNDA3NTAxNzkzNDI2ODQxOSBeCis0NTVENEU3Qzk4ODM1NkE1NjU4OEM0MDMxM0QyOEU0MjVBRTIxOUY5IF4KKzVDMEYzMDkwOTkyMTM4RDM0QjRFMzMwMjlDRjgzQTY0RUQ4QUIwM0QgXgorQ0IzQzUyODg4MzlENkZFNzlFQjJFNTBEM0FDMzRCQkM0QTk0MkU0NiBeCitFNjA1ODQyMjA1MDc5RDgzQkRENDg5RENGNkY4QTJEMUVFMDc0QzYwIF4KK0FCQ0JFQzU2RUEyMEI2QjM2OUM4NUE5MzFCMjIwMUZFQ0I4MjZGNEEgXgorNDgwQzFDQjk3QzM0MTlEQTYxMEQ5NzgzRTYwNDdFNkM5QTYxMDFBNCBeCis4NzQ4MTg0NjREQTE3NTNEM0FFRERCN0QzQjQ2RTJEMDQ2MTREN0U2IF4KK0M5NUI2NUUzQTM3RUQ0QTJGRTJCMjdBMkQ1MkJGMUJGRDMwN0VEMjAgXgorNUUxODhBNEY2MjVDMDU0ODJCRjE2MUM0NUY1MDk0ODQ0Q0U3MDQ2MSBeCis2QjJFQkNGRTc0RTBCRjMyNDgwRDRCQ0Y5QTU2OThBNTI3QUVCRUFEIF4KK0FCRDNFMjhBMkE1MjhCNzk2M0VBOEQ4ODk2NjUxQTE3MzM3MzA0RDkgXgorQjg3M0ZERTJDMzEyQzIyNzlFQzg5NTBFQzJDMkU5REY5OTBGMDA2RiBeCis0RjFBMTg3MTQ2ODlCREI3NjZBRjY4NjYyM0JFRjA4REFGREZFMUY1IF4KK0JBODg2NzkzQTg5RTdFQzYyNjkyQTg2OTAxNjRCRjA3MkVBRjdBQTQgXgorQTE1QzhEREFBMDQ0OERFN0IzNjE1NTJGQzUxQUYwRDcyQzA3MzdGQSBeCis2RkI1MTZDQkI0Q0NFOTY4MUM0NEVGQUJBQkM3QTI2Qzc5Qzc5Q0I1IF4KK0M2REE4OUQzRjdFQzREMkZDREIzNjQzMjA0MkE3OEVBQzlGMDREQzYgXgorMkE5NEE5MDIzRjdENTREQjI2QzhDMkE2QTRDOTUxMTI2NzEyQzJFNSBeCitCMEYxMTVCOEJGMEExNDY0QTM3ODQyMEExRjFGNTc0QUExODY5RkM4IF4KK0EzQzE3OTRGNThGRkRDMzYxQkNBRDQ3NzlCNURFRjQ4RTAyQUJEMUEgXgorMkRCQTVEODBDNEIxNzE2N0U3MTVBODAxMjg3NjA5NTU3NzAzMEQ1QyBeCiswNjJDM0NCN0EwNTk3NjYxMjVCMzY4QUQ2QzE5QkU4RkFBOTgxOTUwIF4KK0VDRUE5NkVCNjIzOTE5REY0RTIyRkIxMDY2MTZFRjFGQjJBQ0Y1QUYgXgorQzBDRDVFNTU1ODYxRkZCQ0IyRkY0MDQ1QTQ2Q0UzMEFFNkNBMTc1OCBeCitBMDE1MEQ5MzE5ODBFMUQ4MkEyMTkyODgzN0Y3RTlFMTk4RTVEMUI5IF4KK0JGODc3QjIwMjgxMjE4NENBNzRERTYxRkUzNERCOTVCQTJBQzVEMEIgXgorQzg2M0EwRDIyMzJFOTAxOTIwNzUyRjJBRjkyQzIwMUZDNzM2MDlCNSBeCitDNTRFNjc2MjA5RDgxQ0ZFRDJFN0VDRUE2RjdFMzVBNTQ1OUE1OEFFIF4KK0NCRjM3NkU4NTcxRjgxNzkyQUFDNDlCQTdFMUQ3RjQxNzEzQUNEQ0UgXgorOUNEMjQ4QzA3RUVGNjMwM0M3MTkwMUFDNDg0RjMwNzg4RDkyNjlGOSBeCitBRUE0MUM1QjIyNjBFMERDNTcwOTRDNUUxRjgwQTcwQjg1RTc5RTc3IF4KK0IxMDE2RjI2RTMyNjI0QzUzMjg1NjZCMjQzMzI5QTJGNzVBMzZEMDYgXgorM0VERTExOEY3RTI3NjRDQzQ5RkJDMzg3MzUwOEQzOEEyQzZBNDU5MiBeCiswM0RGMEM4ODJGRUVENzJGODFCMzAzNDE0MTc4OTc2QUJEMDg5RUVGIF4KKzJBOEUzNkI2QTU0NUQxQUJFN0IwMkQ2RERENzgyQUUwMzJGN0VENDEgXgorRDkwNTg4RTYwNkZCREYzQ0M2MDMwNzU2REY5MkZCMzcyOTQ0MUU2RiBeCitCQ0M0MTMxMzNCNkQ4NDYyMUI0ODJBN0QyMTYzRUE5NTVBQzczM0JGIF4KK0JFMUYzNkQzNERFQzU0MzA2RUYyMEQ4MzI2RkY2MDNBNzE2RjQzMzEgXgorQTJCQUU0MUVBMDFFOEFFOUQ1OUY1RThFNjYzRDIyQzlGNDE0QjBGNiBeCitEMjI5NUZFMjYyMDZERTlFRDE2OUZFQTQ4N0IxOThFN0NBMERFNzhCIF4KKzA2QjEzMTMwREQxMEM5NEEyNENCNTBERTZBNjEyODY3Rjg1RTE3RkEgXgorMkNGNEM0RjJGMjcwQUY2M0Q3MDM1OTAzMjMxQ0Y3RTcxODBFNjZFNSBeCiswQTlFRTMyOTNBMkM5QjJBQ0MyRjlCOTlCRjE3QUFDNjE4MzQ3ODU3IF4KK0MzMzhGMTRDMTU2RDg3NzdFQ0ZDMzZBREYxODUwQjY0RUU5RTYxNzkgXgorRTlCQzZEQTM1QUVCMUNDMzk5NzMzQ0QwQUQzQjIyRTRFMkM4M0U5MiBeCis3QTQyRjgyMDIxMDE1OEFEMzM5MzVDQjc3RDc4QzI4RjlGRTdBOTQwIF4KK0VDREVGQTc4MTdBNDM2RTQzQzNERkEzNTA2OUY4Nzk0ODE4MUE1OEEgXgorNzYxRUJGMzM2RjEyMjlCRjgwNzAyQzlDNzc5OERBQzM3QUNGMzA4NiBeCisxOTc1QjcxNjg4MEI0OUJBMDg2MzEzNjczNjk0MkU2ODhDOUVFQzdDIF4KK0E0MjMyQzMyMjdEQkI5MTU4MUI4NkZBQkIxQzVBQjBBMjk4MDFERkMgXgorNDk5NDdBRjFEOTQ4OEYxNDZCRTRDNzc3ODJDQjJGQ0Y2RUIxM0ZDOSBeCitBMzQwMkFFMTdEQjlFNkVDODk5QjBFMTU5NzMwNzNDRjk0MDRBMkRGIF4KK0RDQUZDMkRDNUJBQjM4NjI5REZBMERFMTQ1NEMzMDBFNUI5QTJENjYgXgorQTdGOTE1Rjc0NUUzMEU0Q0Y2QUZGQUJGMjE0QUI2RDk1MEM2NkZBRSBeCis3NjQ1MTUyNzdENEFGNzNBMTRGQUUyRDlDRkE0RjlCQUYzMDZDQ0I1IF4KK0IwMjFFQjA4QTQzNkIwMjY1OEVBQTdCQTNDODhENDlGMTIxOUMwMzUgXgorQjk3RkU5RTFDNTkxOEZFRkJFREQ5ODZCNzU3Q0NGNEVDNEFGQTc1RCBeCis2OTE3MzUzNTk2QkZBRjFBNUEwNjExOUVDREFCQjM3Q0IwMTdENzFFIF4KK0ZDQjRCQ0VCRUJCQUI2NjE0MkFEMkE1QjM1QUI1REJGNzhDNkE0NjMgXgorQkNBNDU0QjY5RjQ0ODY5NjBDNjMzRDJDNDQ1M0ZEMDFENjc1OEJDRSBeCis1Q0QyNUU2MkFEOTdBQTVEQjNBOUNFRTk5QzU4NDM5REZCRjYwNzNCIF4KK0U4NDA1RTU4M0QzMUIzQjhFOEIzNjUwODdGMkFCMzkxNzUzMzI0QTQgXgorMzlFMzJBRTQwNTQyMERFQjA3Mjc1MjI0ODE3QjU3MTg3MDc5ODg2RiBeCis2M0FDMjBBRkFFREFGQkZDMDE4NzU1RjRDRUIxM0EwNDJCREVGREZFIF4KKzI3MjQ1Qzc0QjYxRDE5RUEyOEZFRDgxRTU5QUE0OEVGQzIyOTQ2QzkgXgorNzI1NEM4RjVBMkRGMEU3NDc3NjBFMkVCMzUzQzRBQjI0RTI1MzYwMiBeCiszMkRENDlCNzk2QUJDQTc2MzU2QUE5QUIwN0Q2NjlDQjdCQzdGODk5IF4KK0I4M0YzRkJFNkRCMzgyMjMyNTMzNDRFNjlDMzk5QzQ3NEU0QzY0QTUgXgorQjNFMEVCNDg0QUU1QjEwQjAxN0Y1MDk3MzBGMzUwNDgxQTYwRjYzNCBeCitBOTlGQzI0N0MxNzdENjZDQkM2QzIxQzEwQzIxRTEwRkIyRjMzRUY5IF4KK0E3RDAzM0E5NDZBQTAzMTVDRDJFNEI3MDI1MTY0Qjc3RTU5NzlDQkUgXgorRjJERTVDRDkxMkQ1Q0ZFNzI3QjM1M0FERUNCNkI3RkQxMUU4MDE4OSBeCisxMTFCQTkwNTgyRTE3Q0I1RTFCQjcwQUI3MkM5OUZDRjY0Nzg3NkEwIF4KKzlBRjdGMUE3NDIyMzVDMEUzOTZGNkQxMzE5QkQxMTA0NTE4Rjg0NzUgXgorOTIzQjNFNTI0NkZCNTBGQjU0NDg3NDJCOEVBOENGNDkyMEU3MDcwMiBeCitDQkZDNDU2MzMzNEQxMDRFNERGMjQ0NDNBMjk1RjRFOUE3RDdENEFBIF4KKzQ4RjRCRURFNzZDNkRERTlCNzJBOUZFRDUwRDBCREJEMERGN0U3QUUgXgorMkEyMUU3ODI4QzA2NERCMEQ2ODQ1NjE2MjI4MDJDODZBNTA0REQzNyBeCisyRDU5OTU3MkQ2RTU3QTQzN0EyQTg0NTU0NkZCRUY5RjJGQTExQUQ4IF4KK0NCNENGRDkyRkZFRkZEREZEODdBNDc4NkQ2MEUyOEM3NjIyQzcxREYgXgorRkE2REI5RDFFQjkyNDYxNDU0RTdEQURDMzZDOUNFN0ExRjMwQzYzRSBeCis5OEMyNjRCN0NERjc3NEM3RDgyRjREQTVFMTE2MEFFNDM3MDY2NUNCIF4KK0Q1MDNEM0M1Q0FGN0EyRDEyNEE3RjlGMEU3RDhEMEY1RTI5QjZGMTkgXgorQUVGRjVBRjAwMjM4NjhFRjZFM0FENDlGMkMzMEQ2NUU5NjNCNjMwOCBeCis3M0IxNDY0QjlEMDU1MDlCRTcyRTgzQzgxOUY5RDYxOEIzMTIxMzM2IF4KKzc5MTc3NDY2NkQyNjI5RDQzMDRCQzgxMTM4QjREOEE3NTk5RTc3RDYgXgorMzYyQTJENDE5QkFGMjYzRjFFNzdDNTY4OUY2MTFBRTMwMUMwNDRGMiBeCitCNEQ0Nzk2RDFCQzE4NTFEREI3NUY1RDNCQTMwODlEMUQwRTBBMTVEIF4KK0I3QzRGRDQwNEE3M0MwQUU0M0ZBQkFFQjQ3MUZEQjZGOUIyNEEyN0MgXgorQjlEQzExODM0OUREQUIzN0REODJCNjVFMDkyMjc3QzFFMkYyMEM1RiBeCisxNDQ3ODI5MTNERjJGQThGNzZEMjEwQTdBMzIxRjM2MkZBNURBNzc5IF4KKzI5RDY0MzUxQTE3OEU1MkVEREE5QTRCMkY1Mjc5QjcwRjNGRUYzOUMgXgorMzEwOThBNzBGQjk1MTI4QkVDQzJDNzI5Q0U1QTJBNEJDQTEyMTg0NSBeCis5QzA1RDZCMTcxQzYwQzM3ODIyQ0RCRDdFOEMxQzU3Mjg2RTI3NDYxIF4KKzZGRjdDNDk2MEUzNTQ2M0E4RkRCNzc4NDRBMjlEREFEMUZGMDRGNTMgXgorMkUwOEI5MDg4NjQ2NzM3NjIwRjFCNDQ4RTgxRUE1RTQyQzQwQzU5NSBeCitBRjIzNDJEOEY0QkYxMkY5RTUyNEU0NEJDRDQyMDY2Rjg0NjIwNzI3IF4KKzU0M0ExQTk5QjQ5N0RCQjc3NzY0MDNGMzI1MkE5QjJFMTFBMDYxMEEgXgorQTJBNDZCRUYwOUQyMUE5QkEzMkFBRTRGQ0Y3QTg0NkQxMjhGMDM1OCBeCis4MTk2MEEyMEE3NTVGODRCMzYyM0QxRTJBMzk1RURCMTJERkRFNzNGIF4KK0IwMTZDOTBCMzUwQTVBOUFENEMxRjNBRkU0OUUzRUIyMUFBRThCN0EgXgorNDFEMDNBOEQ3OUU4QkFBRTExNkMyRjU1NzNEODY5RDk3RDdGNkUwQiBeCis4MzEyMzdGNUJEQUMzN0M1OEJBMzFGNjEzMTk4MkFGRTY4MEJBQzFGIF4KKzJFOEFDRjVGREUxODU0MkJEQzJEMEI5NUQzQUVEN0ZDNDhCNTk5M0IgXgorMTcxNzYzRDg4MEQ0NTg4NUVBNjFGNUVEMDRCQjUxQjc5QzZBMjcyNCBeCis0MDVBRDI4MkEyMTQxQzM4RDNENzMxRjlERjYzMDY2NzA2NEI5RUQwIF4KKzA3RjJFQ0I5NDREMDFEREY5QzY4QUE2ODc2MkJGMDdGMzg1RTdFNkQgXgorRUI1RkVCQjgxM0U0REQ3QkY4NTJGQjMyNDY2MDI1RjdENEU3OUREOSBeCis1MkRFMDkwREIwMjczODVGMTdDOUZENDFGNjEyNzI1MjVGRTEwOEIxIF4KKzEwM0UzNTJBMjYxMTM0RTExNTRFRDNDMzEyRDg5MDY0NkZFRDM4QUUgXgorNjVDNzM5NjlFMzVFOEYzMDdCNTE4QUJCREU4NTY1NENBRDEzRDBDNyBeCitGQjM4MEMwMDk5RUFERUQ5RUQ4REQ0OEQ3MEUxNUM3QTI2RTJGNDE3IF4KK0VGOUUxMjJFMEI4Rjk2OEVGMjYyRTFBOThCQkZFRDdCNDYxODQ2QjkgXgorNzcxQTE2MkJERTNDQzRDMDdCRTdBMUREMjU0NzAyODZGMTMzMDIwRSBeCis1Rjg5MjM1M0RDNUM2NUExRDhDOTUxMEFDRUM0M0REOTZGNDMyNzQyIF4KKzRFNjU4Qjg3NDNENTEwMjIxQjk2OEYyQzc4QzcyQTU4OEE1REY2RDYgXgorNUQ1Mjk1QUNFQzI0RjhBNTJFQ0M1QjE3NEU0ODg0NzMyQkQyMTZFMiBeCis3NzkxQkQwRTFDNDEzNkQ5N0M0NkNDRDY2RDM2RTk4NDQzQzQxODJBIF4KKzUxNTQxOUFFNTlCRTRFODI0RTU3NUU0OTdGMzYxQzMzODJDMjE3ODMgXgorNzY2OUQwRDA4M0IzQTBBN0I2MzFFRTQ4NzFBRDJBMkFGOEM1MTJGOSBeCis5MEExQTlCRDkzNTAxRDlBRkU1MDQwRERFRTM5NUY5NEU1NTk0RUU0IF4KK0I4RTQ4Rjc5NjE4Q0RFOTUxMjk2RjFEMjhCODc2NTNDM0NEQTZGREIgXgorRkU5NEQ1MzczRUYwMDlFRDJDMDZGNjMyQzczOTcxNzc5MUVCNkJCNiBeCitCNUMzODcxREEyNDY2RTQ2MzVERDNCQ0QwODVBMkI4RTIyMkNFOEY0IF4KKzQzMDMyRDAyMkQyNEI2NTM5NEY3QTcwN0M4NDQxQzJBN0YzQ0Q5ODAgXgorODdDMTM0NDgwMTdEQjNCNkM1NTMyNTBDNTlERjREM0Q1NzY3Njc4OCBeCitGMzhGQ0E0NTg5NTQzMDUxOTM1RDRGMTUyNTcxMEFCMzY2MTYxRjIyIF4KKzkyMUUzQzNERTc3M0Y5ODc0NTJDQUUyOEQzQzEwREY5ODA0NjMyREIgXgorMzIzMDhENUJDQTMzRTY5NDA3MUI4QzE3NDcwQzY0NjlFREMxRENDRSBeCitBQzUyNTgyOTdCQTIyRkU2MEI0NjRERUUyMjM0OUM3MEZERkFCMjE5IF4KKzU5OTMyMkJDMjE0RDcyNDgyMTZGMEM2RUNGMDBDQzM0Qzc5MkM1RkIgXgorOTlFQkE5MUZBRkMyNzI4OEIzRkYzMkRFNTVCRjE3QkM2RDc2QjE2QyBeCis4OTlERjdDMjE3NzlDQzBGNTRFRENENDQxMDUxQ0FDQkQyQjA2OTQxIF4KK0U1RTBCQTE4QkYzQzk5MDYyQkE0NDQ4NDc4NzZDNUNBMkRCOEY5QzQgXgorOTRCOEI5MDU2NkIyRTNCRERBOEZGOEQzN0JERDlGOTVDRjlCRTBCMiBeCis4NjQyMkJBRDY1QzVFMEIyMkYwMkI5RDE1MTBCOUQyNEY0MjI3QUM5IF4KKzQyNzY5NEI3NzJBMDg0MDAzODFENDcyODU0RkE1RkQ0RDRDQzFENjIgXgorMzczMkRBOEVCQTg0Q0I0NTkxREQ0QTg3QkFFOTU4NjM1Qzg1REQ3MSBeCitENDFDMjhDMDI4RTQyQUQxREY1MDU3Qzk3QkI5NTNCMDNBRThGNkFFIF4KKzRDNDQyODZGNTk3OUQ0NEFCNENBNUUzNzc2RjMwQ0EwNENFNTM5RUMgXgorRTY5NUQ5QjA0OUExNDk3QTg2NzY1MTk1QkE3ODg0RTg4NjkxNDJERSBeCisyQTVERTlDNTQ4OTM3NUI4RUZEQjA5Q0EyOUQzMkZEQURBQTA3NDAyIF4KKzAxMjM1NkVCNDZBNTg3NzYzRUNEMUVDOUYzMTE0QjhCOEI3OTg3QjcgXgorNkI4MDNERjA3RTVBNDdGQkJFNDEyMTQ5RDgyNThCNTI2RDJCRTk2QiBeCisxNEExMDkwQzNCMzgyNDgyQUFENUVGNDlCMzBEODQyMzE3NzkyNzQ1IF4KK0MyQTU3NkRFMzg1MDE3RkE4NDg1NTM4OEVFNkNCMUY1MUY0M0E2QzQgXgorNTc0NkI4Qzg4Q0U1NDAzMTNBMDQyOUU2NDg0MUVDRDBBRDU2OTI5OSBeCisyOThFRkI4N0U5QzA5Mjk5REVDMTcxNzE5MDI2ODJEOTE5ODk5QzlEIF4KKzU1QUVCNzkzMENENjIwMkNENTJFNjUxM0VENEMzNTgyNEI1NzQxOTggXgorRUNEQUE4NDA0Rjg4MzM0RTlDMkM2RkNDOTIwOTc5NTU4MTY1NEMyNSBeCiswNjFGRkZDRThGNjlCRTBEMEM5QjYzRTMwQkIwNjVDNkNDNzNERjMzIF4KKzIyOUYzQThCRDJGNkZGQjVDRTJEQjMzMEFDRkJDNEM0RDc3OTZEN0YgXgorMEJBQkU2MDgwMzI0ODA1OUYzQjA1RTA2RTI3M0I1RjQxQTYxOUM5QSBeCis1RjQ5NkE1QUFBMUZDMzhCNzYwNjlCRjlGMDhDNjM3NzdFRTc1MzBDIF4KKzkxRkM4OTk0RkFBMDNFOUEyRDlENTY1RjA0NDc4QzZERjAzNUFGRTMgXgorQTY4NTUyQjkwNDlFMTkyQkJGOThFODJFMkE2OUU0MDVGRkMyRDkzRiBeCis3OTEwMzkzRDFEOUQ4Qjg3NkVDODlGRTkxMDAzMjBEMzcxNzg5QzIzIF4KKzlCOTIzRjk3RjJEMkIwNTc5NTBEQzNDMEU4OTk4MUYyMkY5NkVDMkYgXgorMUVBRDlDMjM3Q0YzQjFDQjk1RTdFRDc5RUYyRTU4NDJFOTI2MzQ0NyBeCitGNTFFNUMyMDJENjk4Qzc1RjhGMEMyOTI2MDgxRDRDMjhGNjQxODEyIF4KKzg4NDJEOUNEOTc4NjgxOTZCMzFGMzRDMDJCQTYzQ0UzNDQ5M0RDQTIgXgorMjZDODk3N0JDMzZDMzI5ODU4MkNFNjcwM0Y2MkRGRTQ0ODhFMERERSBeCis5NTVCRUYzNThBQ0E0RDQ0RTMzRjMxMDUxQTNCOTJEOTZCQTY2OUUzIF4KKzY4RDg0MUIyOURBMjg1REE1M0EzMUU4MjM0NjJFNzk0QjMxMjY5MTQgXgorQkI1MkMxODA2NjA1REQzNzExMzAzNTM5MEQ5NzAzNkVGQjNGRTJCRiBeCitCQzU1NzcyQkM5QjYwNjYxMTI1MTJFMUE4QjYzMzQxMUI5NTA4RkEyIF4KK0JERDJDQTRCNDMxNTdDMDRDRTcwNDNGNTdCN0UyNjEwRDNFMTc1RDkgXgorOEU0OTNGMjVFMTEwRjYyNDRGQkQ3NTg1Q0YxOEYyODU5MzM5NTBFQyBeCis2NTAyNDJERjk5RTk4NURFMjNBNUNGQzI1QzhDQTcyQzgwRDdGMjNFIF4KKzU2QTA2MUZFNDlCNDI4Nzk4QzMyOTMzNkQ0QjE4NEJGRTY5QzQxMDIgXgorNTlGRjgxN0NFRTk0NkNCOTQ4MDU2MjI3NjA3QTExOUY0QzdEREE4OSBeCitCRDRGMDNGMTg3OENFQTg2RTJBRDk4MUM2QTgwNzAxRTBBRDMwQjRBIF4KK0E2MzVGNTI4Q0M0MDI4ODc3MTg0RTg5MThDRjczRTFBRUU2Rjc3N0YgXgorMTVEQ0FFODdGN0U0MENBNTc3QzYxQzJBQTVCNkQ5MEYwQ0JFNkRDRSBeCitENjdCRDg1QTM1M0NFQkI5OUFERTRDRDg2QjU0NjczREQ2RDY0MzYwIF4KKzE2MTlERTcyMjkwMzI4MDBDREYwNzE4MzBDQkNDMzIwOEIxRURCMDkgXgorMDlEQzE4QkVFMEMyREQ5QTJDNzE4OUFBNkQzREVCOEI3Q0M0MUNFNSBeCis0MTY1RUQ0NzBEODVGRUREOTU5MzU3N0E5MTAxMzA2QzMxODI1RTAwIF4KK0M1Mjk0MkRBQkY0RjlENzJCMzFCMkIzMjkxNzA1RUY1MjAxQjMzNDMgXgorODgyOTYwMzVCRTc5RjUyODFCOTFDMEYxMDA2RTU3QzI4NjcxQ0JGMyBeCis4MjU5MzgwNDg4MEYxNjhCOUZGNTBEODlDRDE0OUU5RjI2M0VCNTU3IF4KKzUyRTRGNDJGQzJFQzJFQjdDMEE3MjhEMjI1MUExNEE2QzVFQTVBMDAgXgorQzkxQjI0M0NCQTIwMzFCMjlGMzY1QkE0NDUxRkVGRDZBOTAyMjk4QSBeCis5MEY2RjVBNjVFNkJDOTQzMEEzNEMwNjYzMTIwOEFBRThCNzU1NUY1IF4KKzc1MzVENzdDODgwOUI0RUEyMTY3OEJGOTY4Njc5MTQxOEZDNzE5MzEgXgorMDI3MDcwQUM2QjVENzdCRkEwMzk4QjhBRDU1NkEyM0FCOEU5OUVCRiBeCitCNDgzMzVGNkZCNkVBMjdDRTIxNTZBMUQzRTAwRTQyRDNFM0E4NDg5IF4KK0I2NzMwM0Q3MUJGMTI1RjI0NDFCRkM1OTkxMDYxNzdBMzJFNDNCQUEgXgorNDZFOThENDlCREM1QTQ2MDRGNjJBQUY3NkU5NjQ4MzgyOTFCRkFGNCBeCitGMUFDQzU2MkQ5Njk5OTQ5M0VFQkQyNTMxQTI4OTI2NEMzRTFCRUY2IF4KKzBCMjYxNzEyQzNGNEQwRDc0RUJEREQwNTJFMUEwNThCQ0ZGNDEyRDAgXgorNTA0NDZBQTdBMUE4MUE5N0IxREQ1MjRBRDBEQjREMDk5NzFEMzgzQyBeCitFM0E1MUI2QUE1QUE1ODY4MDNFRjIxODNERUNBMENCNUNBODY5QjExIF4KK0M4MUI1MkZENjBBQkVBOENENUUzMTg0RTIwNkY2OTMyMTFGMDA4RTQgXgorMTk3MjcwQzBERjY5MzYyMkRGRTg3MTg1N0E3Qzg3QjdCRTJFNDM5RiBeCis0MzQ1M0RGNzYyMEQ3MUNBRDU2REVGOUNFRTYxNkFEOUU3QzczRUJBIF4KKzNFM0M2RUUxMTQxQUIzRDdFQTUyMTVBQ0VGNEU4NzZFRkE4OUQwM0IgXgorNTc3M0MyODI2MEMyQjJEMzI1ODgzQUU3M0IwNEQyOEJGRDJFODg4NCBeCitFQjZGMjZBMEU3NzQwMjI3NzNDRDg2RTFDOERGRUE0NjFDRTZGOEY4IF4KKzZDMjY0MTBCMTFBMENGQzk3ODQ5RjZFNDNFNzdCOEU0OEQ1QzUzNjMgXgorRjAyMzZDRUYyMjk4RUQzRDg2QTk1RTlGNTI0N0MxNzQ5OUE3NzJERCBeCis3MDRCNTQ5NkNFMEFGRjQyODlGM0Q5MTUyMzBGNjlBREM3QTFFRDdCIF4KK0IwRDRGRjZCNTBGMDlGQkJBMTlGNzY2OTNBQzlDQTg3NzY4RTI3NTggXgorMTBERTRGNjg3NTc3Q0NBRDlFMTZBRURDOTk1ODAyMUQ5MERFODcyNiBeCis3ODU3NDE5NDkwNTlFODUwOERCOEQxMzJBOUIwNTNFQjQyNzcxMTlBIF4KK0NCMDQxQkFGMTNBRDIyNzc4QTFDNzNBOEFBQUI3NDU4QjY2NEIxQzUgXgorQjRCMEFEREJFRkEwNzhBQTQ5NzA0NTYyOTg0MEZEOTY1QkVFQzMzRCBeCis2OEYwRTQzQjdERjg5RjQ4NEYzQ0JENjk4NEM5NTE2ODE0MkU0QTgyIF4KK0QwNDJCRTE0QTIzRDBDQTFBMDQ2NjE3OUMxMTlGMkE5NTlFMUUxMTggXgorREQyM0NDMjgyNEE4ODFGREI2NTY2QUU2QTU3QjFBMkQxNjI0RTg5NSBeCisxNUI3NUU3RTEzQjM3NDAzOUI4QzlGQjRBMTEyMkJCOEEyMkZBRDZGIF4KKzg0OUYwRDM3OUEyNzc1Q0NCNUVCQjBBODg4Mzk1MTZGMzBBNjY1RkIgXgorOEI0MTI1RkYyRUJGQTk0NTkwNzU0NTlDMUVFMTQ5RDY4QzRGOThGNiBeCisxRDYzMkQzRUVDNjNEMTgyNDNGRjQ4NzAyQUI4OTRFQTA1QTFBRUQzIF4KK0YyQzJFMTA4MjAwNEVEQ0JFM0RGOTZDMjVEODg2MEMwRjVCNDMyQkQgXgorNEI5NkMzQzI4NEU5RTEyQzNEMkYxOEFCOEM4RkM2Nzc2RjMwQzZEQiBeCitGNDBEQzhCOTREOUZFOTkxMDExN0JDRDY2RjNGRkIyMkY2OTc3NDQ3IF4KK0Q2NUQxMjZERjYwNERFMzA2QUVCNDFBNjQxREUwQjIxNDQ0OUQ2OUMgXgorOTBGQkVGRjA1OEU4MjVFQjk0MDEyMkI2RDhCNzQ5MkZDNTc0QjMyQSBeCitBRTQ0MTRBRDQ3MjE2REEwQUZEOUFEMUUyMkM4ODJGNjY1NDI5QzU0IF4KKzVGOUQ5N0U5MUI3RTQ4MTBBRTc2NUEwOTgwM0FCRkE1MEI2RjY0RTQgXgorQTJENEU2QUY3QUZEODdFMzAzRTg2N0QwRTAzRTE5NDVBMEYwQjcyQyBeCisxNEFCRjcxMzk4MkQ0REM3QzFDQ0ZDRTdBNDg2ODA1NzYwODJEQ0FDIF4KK0JFQjhGNzdBN0QyMTFEOTQ1MUI2OThENjVGQkMwQjVFMzhEMjYwODYgXgorQjM1RjY2MDYyOTk2MkQ1RjFGODUyOTIwMzk5OUZDQTAxNjlGMjY3NSBeCiswN0FDNUIwNDE2NkU3MzlBOUZCODdGQ0NBNzQxMTJBRDkzQTA4MTI4IF4KKzJEODI3MkM5RDYyMEE3MzA1NjFFREZEQUYyQTEyOTY2NkNFQkI1QzkgXgorQzI1QzE5NzFFQUIyNjRGNDRDRUUxRjQ0NjE0NTc5RUU2RDhDNzg1OCBeCis3NkY4MjM0RTJGMEE1MzNFODEwNTQ1Rjc5QUUyOEE3QzQ2MDU2QUYzIF4KKzM1MDI1RUEwOUVBMTExRTI5OTgxNEZCQzk1ODk3N0REQkMzQTIzODcgXgorMEEyRUY1NDhBMzhEODRGNkExQ0JCMkFFMDFENDhEMjk2RDZDRDhGRCBeCis2RjU0NkREMTYyM0U5MkREQTE4NUJEQTAxNjE4REY3RTdFN0I4MkY2IF4KK0EwQzFDMkFFRDhDM0Y0MzZERTIwMEUyQTNGNEMyQTlEMkRBOEREN0QgXgorOERDMTAxOTVCOTY3RkM3RkU1N0IzMzg0OTRDMkM0MkZCNDM1OTlENSBeCiswRDkxOTJCMjc4NTFDQUE3NjZEOTBBNTM3NkNFMjU1QjJGREU5MDZBIF4KKzc3OTk0NTBEMDAzODI0MzU2RURGRUUxQjQwOEFBNTlFODMwMTc1QTggXgorMkVBNkYzMTg4RDMwMTBFREY0RUJCNTVFMDA5Q0M0RDk5Mjk2RjU3OCBeCisyQTczQUNCODNGQjhFMjVENjVGQkMxQjgwODVCRTY3MzQyRjU4NThFIF4KKzY3Rjk5MjhBMjcxMThFQ0MzOEVFMjMxRTA1OTc3QTY5NEFEMEY3QUEgXgorMjdFMjA3OENDOUZEREY1QzVERDZDRTYyOUYzRUYwNzFCMjEwNzkzNiBeCitGNTA1NDBCNERFRTA3MUM2NEQ4NjE4NzJGMUUwQkM0QzdERTc1QjUyIF4KKzg3REM5QUY3NzFGMkVFNTQzRjk2REIwQzkyNEFFNjUwQTA2M0Y4NTQgXgorNzZEQjg4NURENzk3MjQ5QTRFMkY3OTQxNzFERDU1OUZGMDU2QTlGQiBeCis5QUMyRTlDRDM4ODFCRjE0RDc1OEE3RkVCREE4MUJDOURERDMxNjUyIF4KK0QzRDg1OTVENzVBRjREMUVFRUJFQTgxNjZDQUZCMTU2RTgyN0RFOTAgXgorNUY3RDlEOUJEMEREQzVBMkFENDc3MjYxMEZFMkE0OTIzQTgyNjQ4NiBeCitGNDM3QkI2Q0ZBQTkxMzlBMTIwMUZFQjU4ODQxQjE4QzM4MDlGMDBFIF4KKzhDM0VCNDAyRDkyRTY1NDNEODg1QTlGREUyRkM4MEI5RDQzNDBFOEUgXgorMTM0MzA3QzUwQzI0QkJENzgyMkRCQTMwRjY0NEI4NzRFQkI1NEYwQSBeCisyNDc3NERBNDY2OUMyMDM3RjdCMkE0M0JDRDFDOEQ1NzQ3MTVGMDcxIF4KKzY5RkVGOEZCQzkwMzREMDVGM0M5QkQ5QzY2M0QyMTk4QUI0OEZBMzAgXgorMDM5MEYxQzQ5NDIxODA2QjE5REYxRjg4NjkwMkYzNzA4OERGNzdERiBeCitERDUzNUIxMjlGNDgyMjU2NTAzQUQyNzQ0QjcxMkJGRUI4QkYyMTZCIF4KK0FCRUM1NTJFNDEwMjAxNDRFRkUwNjg1NDE0OUJFMDNGMUJEN0Y2RjYgXgorM0ZDOEM4QTE0RDE0NTI3MTNFNzZFREQ1RUY5NUMyMzlGM0Y4QTRFNCBeCis4ODYxQTg0NDI5RTIzOEQ5NEU3NUQzQ0MxOTFGQjREMTI4MjE1RjdEIF4KK0RCQTYzNzdDMzc2QUVENEQxRTc5QzE5OEVBODY0QjZFNkQ5MEM0OTQgXgorNEU1REJGODIzREM1QkZGNTZDOTk5QTFGRDBBQkJDNTExNTUwMTdEMyBeCis2Njk5NDIwQzZGRjUxMkJFNUNBQkZFMUVCQUVGQjBBRTQwQ0REOTAyIF4KKzc3Q0FFMEQ3RURGRDJEMTM1MDZEMDk2RDY2QTMyQjk5MDdBQjlCMjMgXgorRjYwMjJGMkExNTQ1ODQyOTE1MDI5QjM0NEIxOUY0QzY5NzU3OTI1RCBeCis2RUNEMDg1RkYzNDAzMjYzNkU3QkU3MjY5RDI5REE2MkJDNEJGQjVCIF4KKzYwQ0M1MTJCRTUwNkJFMUE1ODBDRUVBRDJBMDA5REI4RDdBMUJCQzYgXgorMEYzNERGRDdFREZBNkE1REQxMzJCMkVFNzdCNTJFRUFEOThEQzcwMSBeCisxQkQ1NDI1ODVBQjMzQTBBMzY5NEJFNDVENkM3RUVCQzI2NkQ0ODA2IF4KKzE1MjRGMjAzODlFQkMyRDdERTc3N0Y5NjE1NkRGOUIyQTg2NTIzNzMgXgorNDUxMjgyRTZEQTcwNzY2ODg4NkFGN0U3N0RCNEM1OEY3M0NBNkVDMiBeCitCQjdENTk4OTBCQzM5RjdGODdENEREN0UyNTgzQzczN0IyQjQwQjg2IF4KKzI1NUQ2N0UzQUY2NTM3NkExRDcxRkZDQ0Y1MDU4MTI0ODFBRjE4MkIgXgorNEQ1NTlCQzE3MTUxNkY3OUUyMjkzOERFOTk5Njg1RjlGRjA1MzgzRCBeCisyRjdFQjE2MDgxQjIzMzhENjMxMTUzRDVCNzBERTY3RjA1MEUzNDhGIF4KKzU5MDJDRTZDRjc3MDBEMkUyM0NFREVFNzQyRTI3M0Y0QTZBMzlGNkQgXgorN0QzN0E3NTE1RDFFMDRENDRDQTBGMzE0MzA2OTE5QzAzMDdGRjRBRCBeCisxOEMyMTVBNUI4QUE5Q0E1QzU1REY4QkNGQzc5NjgzRTk5ODJCMTU5IF4KKzYzNTIwQzlERDJDRjMyMTM4OERDODlDQzY5RDBEOUY2NzcyQTM1NTMgXgorNUZBMTNFNjY5NzE5NkVCRDBFNDBGRUFFRDRCOTQ1Q0M5MzM3NURBRCBeCitCRjhDQTYwRDA3RDFCNjk3NjcwNTZCMkY4MEE5QUM0QjFGOUZBOTlEIF4KKzZDREQxMzQzMUVCNzBEOUUzNDYxMDJCNzA4RTlGOEFCMjMzQ0Y5NTkgXgorNENCNDQ4QjQxMzFERUI4RjFBQzMwODU3NjUzMDNDRjIxNDQzNkEyNiBeCisxRkRDOUNDNThBNzQ4QTk0NzhBOUU1NUM2NkM2NDQ2Nzc1MzgyRUNEIF4KKzBFREM1Q0M3Q0Y4QzZDQjMxODYxNkQ2MkNDMDhDRDE0NDk5NjAzMTUgXgorRDVEMEQ1NDAyODdEMjFBQTUxOUNFOTBCNkUzRDgxOTU4QTJFMzA3RCBeCitCQTVDQ0QzMjNCOTg3RjU0RTA2QUUwNEEwOTk1N0JDNDE3QURBNjExIF4KKzI2ODQ2RkQ2OEJBOTU2Q0VCMjg5OUREQzE4MzI0ODQzREMyMTE0ODUgXgorMTJCRDcwNTY1RjcwMUJCMzVCODczNjRCNDdGNzNDOTMyODdFNzY3MiBeCitDNTdBMEY5Njk1OUM3REVERDM1MzQ2MjA5OUVGRTM4MENCMjczRTkwIF4KKzk5MDBENTI2OEI5OTE2NUJFMUFBMkE2QjQxQjlGQjY2NDU1Qjg2NUMgXgorRDVBQzJDMkJGMzZCMDRFQUVGOTVFOEI5Mzk1OEJFMjhCNUE0QzgzNiBeCis4Mjc4OERBQTdGOTUyOTJCMjY2Q0ExN0U4NjYzMUQ4NjZENjhGRDQ3IF4KKzM3QjlFNjM4NjEwNDE4QzRDRTRDRjlBQUMwRDNFNjRGMDMzRDNENzQgXgorOTg0NUExNTYyNDBDRTg0NzUwOEExRDM3NjIzNjJGQTkwMjE2RTU5RCBeCis5RTU5REM3NkVBMDE1NjcxODNBNEI0QUQ2NUNEMzFGMTY5NzA2Q0E5IF4KK0IyQjRBMTUwMEExNzZDODgzMjY4NDQ3QTA5REU5MjBGMENGNzdGNzYgXgorRTE0RkExMUI2MEI5Mzg5RDNCOUIyQzFFN0M0NTkzMTk5MkY2NjZBRSBeCis5MjJEMTY5QzYyNEU3OURBQkRCNzlCNzZFNzc3RjY5OTRDMzM5RUY5IF4KK0FFOTlDMkY0NkEzOTM5Q0M1RUUzRjhDRjY4RDZFQTQ4NjM5MkMyM0QgXgorMTU0RjkxNUY5MDM0MENCQjAzQjk1MTQ4MTBGRDM5OUVFRDA2Q0UzQiBeCitDNDQwRTFFNzRDNzUyNjY4MjI5MTkwODA5NjZBQjc0RDk2RkY0M0UyIF4KKzQwNTE1NUZBOTlFRjVFNEEwRjRFOTNEMTA3Q0FFQzg5QTgwQjk0QTIgXgorMEFBOTYyNTQ1NUEwQ0NERjM3RDQ4NkI0NTM4RTc5MEJFNDA3QTU5QyBeCis0NkQ2MzNGN0YyRUM1NjQ5NkQ1MzEzOEE1NkQxMUQ5QUJEQjcwMUUxIF4KKzc1QzFCRDU3MzhFQjUzODBFMjVFQzRGQ0ZDQzdCQjNGRDgxNjQ0NjAgXgorQjYxOEM5RTUyMzAzOTE5QkY3NjJENDUyRjU2ODFEMjNBQkZGMjNCNiBeCitEMDhCRTFGNTQ4NTkzOTY3N0QyOTRDNDE5OEZBMTVCMTE4OTM4QjNGIF4KK0Y5MzE0NDEyNTlCNzkzREFCQUYwODJEMUIwMDI0QUNBRDNDQjQ4QTYgXgorMDk2RTIwNkUzNzUzQkJFRUM4RjBGMEQzRjk3RUJGMkVCMzA2M0IxRCBeCisxM0FBMzk3RDAzQzYwQUE0NDE0MjcxRDMzQ0FDMjM2MUMxMzg0MjJCIF4KKzc3N0UyOTc5ODM0RThDNkU4OUQyMTlFOTEwOUYwQTI4NTI5NjFFRkEgXgorMTM5NjBBNjQ4REI4QjdDRjU0MUE1NkI5MDA5QTVGN0ZCQ0MxQUJBQiBeCitCMzQ0N0EzQzQ2MkI1Mzk0NUY4Mjk1MDMyRkM5QTA1N0JDMzAxRkI3IF4KKzhDNDIzODZBMjQzNkRFODNFMTk1OUU5MkI0NEVCRjYxRTZDOEQwOTMgXgorRDlFRjkxQjA0REQ0MzcxOTY4RTE5NzhDQkZFREI1MEMyQkFCQkU2NyBeCitFODQwNDI0NzlEMUQ2NjlBQjU4NzFCNzFEMTM0MkFENkQxNTEwNUMyIF4KKzRBQ0QxMTJDRDhDQUM3MkRGMkQ0REE3NjkxMEMyQ0QzQkUxRUMyNUQgXgorQUEyMDk4MkUyQjEzOEZCMjQwN0VGOTk1MDkwNzVDRTgzNjZGMTBCQyBeCis1RTNCQzUzNUJCRkY0NzE2ODY4ODUzMzFDRDk4MzFDODBGRUIxOENEIF4KKzUzQzU1QzgwRDY0NDExMjIxQzczMTE2NTQ5MjE1MjNEMkJEMEUyMjcgXgorM0ZCOEM4NTBCOUJDN0E5MjM3NjdEMDM2OTkyQUQ3OUVEN0YwRTFBRCBeCitBRjBCQ0E0RDQ0MEQ2NTk5QkI5MTM5NkEwODIzREU2NDc2NEMyMTEyIF4KKzMwQjEzNzAzQTcwMjU3MjI1N0Q1NERDMDk0NjM3NjhGNUFBRUY3NTkgXgorNTlDNDRCOTlFREMyOTdCNDc2NDAyMzEwMDQ0NTU0QjNGMjlGOUNDRiBeCitGRUQwNzg1OTZDNTg0ODEwRTUzMzY1NDVGNkY2QjkzMDI3RDlDQkQ2IF4KKzY0OTlFNzBFNTQ1NUY5QzhGRkQyRDVGNjAwMDA5QTQzRkFFNzEwRUQgXgorRDI2QzA3MThBOUM4MjIyRjMwRDAyMUU4RkE2NTA4OTM1RTgwQkM4NSBeCisxRjQxNTI0NDdFQ0I4RDdDRDcyNUI1N0I2NUUzMEY3OUI0NjZCQkRFIF4KKzZDNDk1ODY2NUREREZDODI4QzE0MjdFNTdEMjMzNTlFOUM1RDExOTAgXgorQjg4RUFEODQzQzQ4OTdCMkE2OTE2MTJCODM3RTVBNUQ5RjU4MTcyQyBeCitBNTEwOTdEQzE4ODNCMTYwQUI3OTlEMkQxMDNDNDQzMzM2RUFDMkNBIF4KKzVEQTFCODVCQkY0RjM5MTJDNUU5NjQyNDJBNjFFQkU4M0EzREE1QjggXgorNEU5QTQ1QzA0MTBGMDIxMURENEQ5MTIzQkZCOEMyOUM1M0E1RTAzQSBeCitDMkI3Qzg5RjdERUE2RTVBNkNGOTA5Mzg4NDcxREVDNENBMzYyMjU1IF4KKzRFRjNCN0U3ODQ2MTE1MjEyQjNFNzdDMjlBQUNBNjE5ODQyMkJFRjIgXgorNzhDNzQ1NjNCQjJDRjgxOUY4M0U3M0NDMDAwNzIzNzhDMTE0NjM5RiBeCitGQUY5NkU4MzZDMzgxRUM4MEZFMUVBOEFGNzZFOUQ4RDhBRDk1RkJEIF4KKzNCMzBBMkJCRjg0QUI3MEU4MjIwMzQ5Q0JBMjQ5REI4N0ZGRENCRkYgXgorNkNFMENDMjk4RDEyNTk3RjgwMUUwRjFCREU2NkNBOURERjZBRTY2QSBeCis4Mjc0QjFEQjhDMEM3MzkwQzM4M0M4MzdGREFCREVCQkVERDFBOEMxIF4KK0QwRjkwRDYzQUNEMDEyNkM4NEQ3MTRBRDdDOUVCNjczREZCNDU5QjIgXgorRDFFNjNFQjVDMzczQzc4RURGOTY4RTA2NTFEQzExNzE5MDcyNThGNyBeCisxNTMwREM5OTU2NUJFMkI1QUU5MUQxRDcwQjAyN0VERkQ0RUM2RTkzIF4KK0ZFQzA5NDZGQjlDQzA0NzEzQzY3QkEzNkZBMzZFQTkyMTExMzEyODEgXgorQkQyQkE2ODBEMjIwMEFGQzVDQUZCMzYyQTU1MTdCRTlEQUI3RTU5MyBeCis1RkI1N0UxQUFENUJEOUMxRDE3NkUxQ0EwM0MxQTVBOEUzM0RERTJEIF4KK0Y2RDVFN0IxQjI4QzkwNzAxMTVEQjY2NjUzMDlCOERERjVGODEyODEgXgorQkZFODhGN0EwRkQ1RjZBMUIyNkE1RTE1RDBBMTA5QTFEQTdDMUZDMSBeCitFNTY2OEFBNDAzNzVDOENBMzVGQjMwNDZFREQ4QUQ5RURCQTgyRkUzIF4KK0M4NTRENUM1QTBBMTAwNDExRkNDOTE4OUQ2MzA3QzQ3QjU3MjI4Q0YgXgorMUVFMzg0MDc2MzA4QUM2QjgwRkI2Njg1NkQ1RkExOTk1MkIzRDZENSBeCitDQUE0RENGRUUwNThEMjJENzI2MjkyQjJDNzIyRDMxNDdGMURDRDYzIF4KKzE4ODdDNzYwOTJDOTI3NUIyREUzMzMwMTRDOTlGRDEzRTVFNTMzQkEgXgorQUVBQzZBQ0I0NTYxOTg1RENGRjZDOTY5NkJFODM2RkJGNzVFMjRFOSBeCitDQTQ2RjIzNzczQjMwQkYwQUJGNUMzOEVCOUQwRUUwMjFENzEzRjhDIF4KKzJFRjAwNzk4OEIyMTYxRkVEMDdFNTE4MUMzNDJFNzI0RDNGNjQwQTMgXgorRjBGMTQyMkRGRDM0RURFMDBBOEIwNzQxRjRGMzk1MjM0NDgwRkRCOCBeCisyQzQ3MUJGODY3RjVBMDJDQzI0MUUzNUQ5NUM5N0I0M0Q2NTM2RTdEIF4KK0Q0OTA2Qzg4MDRCMjQxRTI4RjNGMkU2MzgwMDE5RkI3MzlFQzg1MDMgXgorNjMyMTgzRUVGOEM2RUM4RUFBMzAxNkE0M0U1NjhEQzM4RTI5Mzc5QyBeCisxODA4MTIwRDQ2MUE4NjdDOTAyMjI0Njk5ODU3NjlBRjE3NTZFRTVCIF4KKzA4QzJGOTdCNkZBNkUxNDMzREFGNTY0MDNDREZFOENFRUNGNkJDRkUgXgorMjc2N0UxMTE5NzdBMjBEMzE4RUFFMTlENTlFMUU1NTFBNEFBN0YxRSBeCitCMUE3MTU4Q0U1NjY2NkJDRDFGREU3REM4N0I0MEM5MjcwNUJGREU1IF4KKzdDRTkwNTE0QUQ3MzQzOTBGNkZFNThCQUU4RkZDRDY2MzkxRTk1OTUgXgorQzU3RjRDMkQ4Qjc4REI4NDY0RUYxRjcxOUI4QjFEQTI3MDg2NzQ4MCBeCitDOTc5MzhGMzRDNkRGMjZCRkQ1MDk2NTg4MzhGN0MzNUZEQjBDNThCIF4KK0E1Q0FBNjk0NjMwMEIxQzRCNUY1M0E2OUFBQUQ2Nzk2MUM0QzY4MjEgXgorRERGNjg0OTQ3QjE2NjdBNzdBMjJDN0RGRThCNkEwQTg0ODRFMjUwOSBeCis4RkIxMzEwRjFGMjE1RTRFRjYyQzQxNTY2QzUyMzI3NUJDOTI5NjcwIF4KKzE1NzNDQzQ0N0IzOTg1MzJCRkI5QTJFNUFCMzg4MEYyM0NBN0MyN0QgXgorRDZFMEI2NzRCOUU0RDI4M0MwQUFDMzU1OTg5Q0MwRThCQkYwOTY3OCBeCis3RDA4M0JCOUMzRTAwNUI0MUZFMzI2MjlGODRCOUUyOTJEODBGQzY3IF4KK0QzRTI1OTFCN0Q3Q0QyOUU5QUNFNjFERjYwMTlEODc4N0FDOTNCRTYgXgorNzE1OUIxMEFBQ0E5RTc2MTBDNzQwNERFOTYxQUJGREIxN0I4OTE1NiBeCitCNEEwMjQ4MDg4RTg1MEZGQzVDQ0E5OUVBMkYyOEVDQUNCRkYxOTYwIF4KK0NBNjNGNTRGREI2QzQ2RTg3Nzc2MEVGNEU1MEU1NkYzMTY0QTQxN0YgXgorQzQxREY1MkVCMjUyOTYxNjE5QkQ0ODYxQzRBQUNDRjFBQjM5MkI2OSBeCitGRTNFRkU0NTNDODcwNUUxQ0VERDA2RjE1REY1QjM1QTczMTFEQjMyIF4KKzVFMkU4QkIwNEIzMjdFOTE1NzI5OTJBOEE2MTA2M0Y3QTc2QTkzRkYgXgorOEVBMDE5MUU4NDkxNDAwMDM4Q0M1QjE0MTZFNUE1NjYyMkVGMUU4RiBeCis0NzcyN0Q0RDdFOEQ5NzM4NjA4QUVFREVCMEUxMkM5RjI0MjdFQkNCIF4KKzczNDBGNDA1QkM0MjhEQTUxNEU3QjJGMzk3MjhDRDc3RkEyMTc3RjkgXgorNUU0NTFDN0E1MUFFQkFCQ0VGOUZERkJGMzUzOEFGRUNCOTY4ODcyQiBeCis1MjgwMzgyNzQ4MDNENkRCNDE5RjY5MjM5OTNBNDVDOTk5NDMzMzM2IF4KKzI4MUQzMEZEM0M3MjVBNDY0NkE2Mjg3MzI5MTQwQkVBNEFDN0E1QjggXgorOTIyQTU3REJGNjJDMDFEQTE5Qjg5RjkwRjM2QzQzMzgxN0YwODlCMCBeCitDNzlBQjIyNUJCRDAzMTQ1QTk4MURCRTdCRjZGREQxNkE1RTk1RDhBIF4KKzMwMUI0RDBFMjcwRjJBRUM2RTEzNzI1NjAzODVEMzc4NzVFQjY4MkMgXgorMUVGMkVDNkEzNjQyQzdGRDYxQzRGMUMzREZDNTUzMDI1MzUyNTRCNyBeCisxRDk0RUNGMjlEMjMxMEIxQTVBMjA0MkNGQTYxNkJBMEQxOUU3QzQxIF4KKzUyRERBOUJFRUZBQUFFNjY3QTZEMTJCRTQxNEZBRDg2MTk3NTAwNDAgXgorQjE0NDg2RDE2RDE1MjFEMTI4MzY5OEU2NTFBMTBGQzE0QUZGODk5NiBeCis0QkJGQkQwMjQ0QkZFRTQ0MERCRURDODM2MTgwNkNBREZGNjczMjUzIF4KKzY2MkUwRTQ2NkM5RDcwMEM1MEM1Rjk4Q0Q3N0NGRUNGODI3OEQ3MDggXgorMUFDNUI4MTk3QjA2ODk2ODFCMEY0NzQ4MzJGMzE2Q0QyNTE0N0FGMyBeCis4NzIwRTAxMkYxNjU4OEEzQzM2ODY4OTExMzkwMjExOUM5NzkxRkYyIF4KK0Q4OTJDMUUyNTdBOTk3QThERjk1QjIyOUM5RDI0Qzk5RjYwRUYyMDUgXgorNTdGNUM0NTI4NkVDM0QyOUNFQzE5OTM5QzA0MDQ1RDlDMzhFNzYxRSBeCiswNzE1MUQyRUM4ODlEMjQ3MzBBQUE1MjgyRkE0REZDNDlBNjZFNDM5IF4KKzZBQzk0NjkwRUE2REI0QThEQzk4MjI3MTQ5MEVFMTgyODJBM0IzM0QgXgorMzJERDE5RjEyQUMwODU0OTk4QzdCMTREMUQ5NkMxNUZBODk5NURCRCBeCis3ODE3QTI1QzZDRjFFQkZBQThERUQ3QTgwMDYzRDFBMjk5QUY4QjE4IF4KKzAxQzVFQUMxODMwRDFGNUE3RjE4NkUwMzk2NjNDRTkyNUZDQkFDREYgXgorQjlGMzJGNjdGRjQ5MzdGNDQwOTRDQjRBNjJCRTEyNDc0QUMzRTFBQSBeCiswNUJFMkNENjg4MjQ0NzQ3MkFEMkUwMkIwODU5MEVERUQ2MkM3NjM4IF4KK0NFRjE0OUY2RDZGQzg5ODdDMzY5M0Q1RjVDQ0FDMENEREQzRDA3ODcgXgorNkE3Q0M5OURBRDg2REE5Nzk3QjFGODMzNjM1NkM5ODY0RjI3OUQzNSBeCiszQTcyRjhFRkU2NENGNjBENDk1ODlBQjkyRDQ4MzAxNjIwQ0VDMEVEIF4KK0YxRjU5Mzk0MTlFMzc1MTgyQTJBQTkyOERBRTNDRjZDMzc4RTQ1ODkgXgorM0VDMUMxQjc0Qjg4ODFGODZDMUQzRURFNDJGNjY4OUM2MTEzMjcxMCBeCis3MTY0QTVCNEE2OUEwMDRGRDc2RUE0QzZDREZFMDI3M0QzNUNGRjcxIF4KKzIyNDMyNUEzMDlGREYyMzc4QzU3NzZCMTc1MUJCMDY5NEVEMzBDMjggXgorNjRFMEZFQ0JGNUY5NDUxN0VBOUUwRjRFMUUxNkZDNzAwRUUyNzVCOCBeCis2OUNERjMzMjE4NTBCQjY0MEQ1MjMxRDNCMzQ1OEY4MzczOENDRTZDIF4KKzA2ODQzNDlBMkFCRUMwNkNFMDUxMDBFQjY5RDAxQ0Q0RkI3QUIxOTMgXgorMURGQTQ5MjI1QzBGRDcyNTA0NkFGQ0FGRUQxN0IxQUJBNjg3MUZCNyBeCitFQ0Y0QjFCOUM3OEE4MDJGNzQ4RDU4QkY2RTI3RkFGMUIyNzRFRUMzIF4KK0E0NEI2N0VGOTFGMkFBQTlFQjJEQThCMTY2QTFBMzE2ODg2RTg5MDkgXgorQ0YzOEIwRjdEREQyRjcyQTg5MUI0MUFEMDI2RkNDMzI4MjIxODc0NyBeCitGOTE3MDMzRDQ0OTRBMUNDQzg1ODBDMURCRUQ2RjI4RkVCM0UyRTU3IF4KKzNDMzI2RjU1MDAzOUY4MTVFQ0Y1RTIzNkY2RERFNURCMEUyRTlGNjUgXgorNzMzMjAwMTAwMkExMUZEQUY1MDE5MTRBODY3Mzk4NjI1Mzk4RDVDRCBeCitERUExODlEQzQxQUY2OTUxMDlBRENEOTM5MDZFQjUzNzJCNTEyQTU3IF4KK0UwRjE0QkNBOTI0MEIyN0U0NDY0N0VDRUI0QTQwNDA4RTI4ODBEQjkgXgorNzc1NDVFRjg0MTQ2Rjk1MjIxMkQ5RTFGREJBRjYyMjQzQ0RBNjMwQSBeCitEMTYyRjY1NERFQjVCQjBENTQxNzkzMTlEOERGOUYxQkI2RDhBMTNCIF4KKzNCRjc5MDA3MjUyNTM3Q0MyRUIxMUUxNDg4NDJFN0FDNDQzQ0E5MUEgXgorNkNCMkYyOTFDNzE5OEM5RTQxMTJCOTkxRkQ0RDgyOURCQUQ3RUZCMSBeCitDODUwMjU4MDM2NzgxQzBBRThBMDgzRDZBNzkxRDNGQUVDOTQ2Qzk5IF4KK0RDNjRDNTAzN0JEQzkzQTNEMzg2MTNEMjAzRkIzRDdDODJBMThBMjQgXgorNjIwQjc3MTQyODlGRDgyQUJCOUZDNzc2QjY0NDU3MUY3MkE5NTU3RiBeCis0QkVCQzFFRjQ0QzMwQjBCMDMzMTUzRjg4M0Q1QzU4RTRBRTY4NzZEIF4KK0UzODE1QTRFNkJGM0I1MEVFMzEyRTVBNzk1QjNFOUFBMkQ3ODMyQUQgXgorOUNCMTNEMTlDNjQ3NTIyMDlENUQ0RDcwMzNGQUY5REU4OTYwQzE0NyBeCiszMTgyQjlGMDNEMEFCQTNCRDkxQTFFQjhDREQwRjQ2NUZEOUNDQjUxIF4KKzczRDhFOEI5RTZBMDRFODhFMjk3OTdDQzVFMkY0ODkzNTBEOTc4QTcgXgorNzMyNzM0Q0NFQzE4OTQ0QkNBNzg0Qjk1M0RDQzBFNTgyMjI1QUI4OSBeCitBMjE1MkRCMDMwNDhBRTI3QjQ3QzI1RERGOTlEMjQ5NTA0QThBREYxIF4KK0FCNzBCMzJBMjhEOUJGQUFFMUNBODY4QzRBMTYxQjZENEIzQTkyRTUgXgorQUI4QjkwMDg1QjQ3MDUwQjg3RjRCREFGREY5NzE3OTBCNzk1MDkwMCBeCitCMzE1QThDODcwMTFCQUNBOTY5QTFCNzlFQkFDODBBNzM0Mzc0MkU2IF4KK0I3OEEwNDQ5MDhDREE5NjQwNjMzREM4QkU4MjhFMjJGOTBFNkQ3RjMgXgorQUMyQkM1MjQ2QzFCRDk5MjMxQ0RDQ0YzQ0VDREVGNTY4OEU1OEQ3MSBeCiswNjc5Rjg4OEY4QzM1M0I4MDdGNTQ0QzIzNzlCQjVBNEFFOEVCOUE0IF4KKzQ2NEI1NzU0RTNENDI4NjRDQzBBOThCNEU2OTZDODI3RTMyNTQzMTcgXgorN0U1Mzg1QzhBMUJGRjBGRjQ3NjkwNUJCNkI3NTE1QjZENDM4Q0MwRCBeCiswRjVDOTY4Q0EyRkNCNEExN0UwQUYwQjk0NjgyQjNBQzM0N0MyRDEyIF4KKzRGNUUzNTM1MDBENjNDOTlGNThBMjhGNTg3MDA2NEZBMjc4RkM3QkEgXgorRTdBMTA0NjUxQzRENkRGRDA3NzhFQzhBQzhFNEYwMDFCQzdCOUREMyBeCisyM0RDRjlBODU0RDFENUI1NTk5QjE0QTBFOUExOUFCNEYyRTNCQjc3IF4KKzU4OEU0MjlGQTFDMzA1NUM0RENDOTlFRTU0MDdBNjQxMTVCNTQzNDUgXgorMzkyMTVBQ0UwMTY2OUNBREZCODFFOUZCMDg1NzEwRUI1Qjk3NDYxQiBeCisyMzU2NjQ0OUREMjlBMzE1RDQxMzYwNEEyREJDRkFFMEQ0MDU3OUEyIF4KKzFFQTg3QzEzREEzOEZFNEM1OTY5MUQ5NkFGNTkwRUFGMzkwOEMwRjEgXgorNUE2MTcwRkM2QkQ3RThDMDExNDBFMTZGMjQ4QzU2ODkwQjUxMzIzQSBeCitGRjMyOERGQjUwNkI3MkZEQjhERjU3MTZFMjkxQTE4MzBCQzUzOUQ0IF4KKzdCNERBODQ2RjkwNzQyNTRDNjc2RjAwOTQ4QkQ0Qzk2OTgxNDhDNEQgXgorMkFDMzEwMzkzRUUxRUNDNTg0NEE0QkVDMTVBOUNGQzFCNTAyMjI5NCBeCiszQUUzNjMxNkZBOTRCMzY5RDczMjBBOEI3MTMwNENFNjQ5MEZFQ0NEIF4KKzcwNzhDNzA0MTI3NUJDQkU4NDAzREUyNEQxNkE2NDZCNDQ2Mjg4MkIgXgorODMyNUE4NzE2QTJDODc5ODg4QkE5RjY3NEM4NjlCMUZGMzFCRjM2MyBeCis1ODYyMDBCNTVCNUQ1MzdCNTlCNUUwQkM2RkQ5QkFDRTFFNzJDNkVFIF4KKzBCNjc1RTdGNDM0NzU2RjVFMzEwQjgwQjU4Rjg2MUU3ODk0OTVGNUQgXgorNzQ5QzRDMDg1NkNDNDYyOURDMzk3Njc4QzBFOEJEQ0JENjQ5QTZFMiBeCisyNTMyN0M2NkZGNDZDNDQ2NkY4MUVFNjM1RThFQzAyQzVDQTYwRjJBIF4KK0JEOURGQjU5RUI1RTUzQkE2OTg4NzM0RkJFMDg5NDE5NEExMTlEMzMgXgorMzA4NDA0MEU1RUNBNUU3NzQwNkI0REYzQ0I3RjMyNEFDQzk2QjUwNiBeCisxRTE0QTA5RkVEQjYxQ0VCRTI1NUI5NEY1MzNDNDAxOEU1QUY0QkFFIF4KK0M4ODQwQzA1MUEyMDRGOEExMzQyMENGMTdGRTc3RUVFMkZENzk0NUQgXgorNDc5MDI2NUI1MjMxRjlBMTczOENCOUY4NDIzQkVFRjIxOURGMTEwRCBeCiszNTQ5NDdDMEYyRjI1RUI0OTFEMjFCRDBCRDFEODA5RkREMTQwQTY2IF4KKzIzNzYyQkYzQ0RGM0Y0ODRDNzBEMjAwM0I1NUU2RjQ0N0JBRjQ2RkEgXgorRTVCRkM5OTU1NUNFRDVDMTc0M0IxNTJBNjRBRTA4QzlFRDEzNjVENiBeCis0Q0I0NERDNTA3RjcxNkJFRDRCNENBQzc0MkU3OUUxQTJERkEzMDhGIF4KKzYyNzkwRUMxNEU4Q0ZEMUEwRDZGQUY5M0Q3OTg0QTFFOTQxNkZENUMgXgorNUMyRDNFRDk4OEY1QkQ5NTc5RDJGNzEwRDVERDY4QjExNTg0Mjk1QyBeCitDRjg0MTRFRDg1RkEwMTM1RTQ0QjM3QThGOEI0MDc1NkJBRUQyM0RGIF4KKzAzNDMyMDY0QzFDMDVEMjgzOTNDOUFDNTg3OEM5QTlCQUE2RTVDN0UgXgorQzM3QTZENjRDRjgxQ0RGN0RCQjFCODE1MDlBNjdBMEExQkI1RjI3OCBeCitGMzQxRDg5Qjc1RTU5OTA0OEE5MTFEMEFFNzU2RTAwNjU2NjlCNEZCIF4KKzI2OUUxNTI5Mjg1NDE0QTc0Qjc2NTg2RUE0RkNFQ0E4OTVDN0QxRUMgXgorRkY5QkIzOUY5RkVBMUVBNjNEOTQ0QkYxMkFEQzk4RDFENDI1NTA5NiBeCitERDExNEYyREYzRDkyOTc3RjlEQjk4QUVDMDRGMzY3Q0ZGOUZCQTJEIF4KKzY5QjUzQkIxMzM3NUY5RTEyM0ZDMzAwOThDRDlFREIzQzFBMUZERjggXgorMkE2MDk4NERDNzk2ODJFOTZDMjlDQzcwNTBFMUFDRjk4OEQ5RTRENiBeCiswOUFDNENBMUE0MEE3RDgzQTQ2M0FGMDgwNEM0RURBMjA4RTA5RDM2IF4KK0EyRUUyNDczQzI3MEEwNjM3RkFBRjE3REE1NDIzN0QzN0UwQzY5NjAgXgorQjNBNzgxN0FERTk2MkRDRUVBN0ZCNkY5NjBFQkUyQkMxRjlCQ0JBNyBeCis4NUE0NkNDRTAxQTc5NjgxMDQ0OTYyMjU0ODNFQ0UyQzE5OEYyQTI3IF4KK0JDMDI4RjVFQ0Q4NzczQUU0NzU2M0YxMjE2RTBCQzM2QTlFMzdFNEUgXgorQzY1QzQwQ0NDM0REODAwNDVENkE0RUZGM0U5QzdENkU0RTBFNTU4MyBeCitCRDlDMTg5QTYzOUZEM0Q3MDE2NzM2N0RGNjFGMTQ4NjhDRTdFMzEzIF4KK0M2ODk5QTg0QjhFNjY1NDhCRkI1MDc4MTYzMkNDM0QyRDFCRThCOUUgXgorOTJGM0M4RTQzNjIyNzk3NkYzMkYwMDU0NjlERTkxQjIzNjMxNTBEQyBeCis3RDJBODBBNUM1Q0M4ODk4OEYzODMzNEFGRkUzMUMwNEFBMUFGQzlDIF4KK0Q2MEZBQ0ZBNTdGNjYzQzRBMzk5QjFGRERENzU5NzM5MTBGMjcyOTQgXgorQ0VFQjk2NjFCRUQyRTg5RERCMDdBMjFFRUJGNTkwQkIxQUQ2NDRBMCBeCiswNDY1QzlERjJFMDg4NkFDNzlGNDZCQkJFQjBBMjQzREY3RDZCQUFBIF4KKzk4MDczMDEzNTk3QjdBRTg0Q0I4ODRCRDkzMkUyMEU2Q0I0NzcwOUMgXgorM0NCNEY3NkI2MDJCRjZCNThCMzE2QTJEOEQxNjlENDMyRjAyQ0UyMyBeCis1Q0Q0RUIwNUU4NjEyOTc0QkQ5QzNCMTlFNDhEMTkyQkU4Qjk2QTA5IF4KK0JCMTg4RDVGREU4MDZCRDMwNjQ4QjYwNTgxNDNGMTgwMkYxNUZBMTAgXgorODRFRjFEM0RFNUMxMTQ0QzJDOTI4Q0Q0RDkwNzBBNkU3OTU0MzQxNyBeCis3M0JFMkFBNjZGNUZENkJGNjMyNzNFQTEzNjM1MEQyOTQ5MUEzMzA1IF4KKzUzQ0YzQkIwNzc2MTkxMEJCQjQ4NkMzQzBDNjQzOTQzRDVCRjE3QzMgXgorOUE3NzRCREJEMjdDMzcwNDg3MUI1MkNENUY3RjkyNEM4RUU0QTY3RCBeCitCMTA2QjY1ODJGMEY2QzlFMkVGQkM0ODYwQ0ZDNzAyOEYyQzQ3Rjc0IF4KK0ZFQUZGNDQyOThDQkI3NTE3QjE0QjgxQTZBQUQ1MDE4MjhDNzczQTAgXgorQjVCQjQ4QkVEOTY5RjE1RDE2MjMwMTk2NkM1MzdBODFDNDBDRjRCMyBeCiszNDk1RDdFMzY3NDdCODI0RDMzNDY1QjVEQjcyRDZDNjIzRURBNzJGIF4KK0Q3RjQ5MTc4QjQzODQ3RDk5ODRCOTIzREVBQTZERTk1NzE2OTBCOTIgXgorM0FCN0UyNkJEQjA0MDlFNTUwNjNBRkZGNDU2QjdBMjlDRjA5OEFGMCBeCis3OTg0RTE1NjVCQURDRDIyNDlFRENBMEEzQUFEQjQzNDYxMDRBNTU2IF4KKzQyREQ5OUI0MTgwMUIwQzM0NzU4MERGMUZERkIyMzk3RDU1RDJBODUgXgorOEQ1OUMwMDQwMUVGQjMxNEEwREZBNEQ4MkUxRDg1NzExQzc3RTI0NiBeCis1MENGNzQ4OTRGN0NGNUE5RjM3QzM3QjQ3MzI3MDQ3RTkxMEQ4OEExIF4KKzFGQzQwRTI4NDBDNEI2OEY0MEMyMDVCNkJCMDZDM0UxMDZCNkI4RDggXgorQTQ5RjU2REZDMjkzNDExNzM2RjI3QzE5RkEyQTM2MkE1NDVDNzYxRSBeCisyMjFFNDg4NDVGRThCM0QyQzc5QUZFRDM3NDE0QzBENzMyQTY5RjRGIF4KK0FGQzEyRTdCREY5RjQ4RkFCMUI1OTVGRDY1Njc3NkEzOUYwRjZDQTggXgorNUVBQTExNDQ5MUU4ODkzODI3NkZDM0FDQ0RFNjU5NjIzQzAyNEJENyBeCis1MDgxNDQ0QzNGODFFMTgxMTRCMjg5MDIwRDlBRUM3NUZCMjA1NTk3IF4KK0Q0RjY5MTU2REU4NUM2MUU5QjQxNTBBQzlGNkY2QTU0RjhFMTkzQTYgXgorM0Q3QzdFRjREMzYyREUxMzdBRjA2MjU5MjVCMzY4MzdDMUZDNzU3MiBeCis1NzVENzcyRjlDMUNCQ0E4RkYzODI0MzM0OEUwREZFMDI2NDNDMjhDIF4KKzBDODIxRjI3RkQ4MkM1NUNCNEQ3NkQzODZGNDFEREM5MkY3OTQ5M0UgXgorQzNEMDEwMURERjU1MkExMUM4RTFFRTZCRkFEQjcyQTk4M0YzODU3MSBeCitGNEQ2NTA0NDAxMjczOTBGM0EzQzJFRTk5MUMxODVDRTc2NTBGQUVCIF4KKzU0NDYwRkRBRkVGMzAyMkJDMkM3RDFENDk3Q0JFNUNFRDczNjI0QzIgXgorOUIzRjdCOUQ1OTRBQUY2QTI2RjVDMjFCRDZFNDcxN0Y0NjI2NzQxOCBeCisxNEUyQjM0RjBCMkM4OURBRTE3MzI0MDBDMDJFMkNBMTlBNzY3RjhFIF4KKzEwNzJBQkM0REZEMkZEQzZDMTE0MzE0RDNDMDg0NTc3NzI0MjE3MTMgXgorQzlFQTRCMDIwQzExREVCNzk0RDFEMDU5NTc0NzNBNDZBOTA2QjQ3MiBeCis5MEJBNDI3MjQ2NEEwMjA2MTJGMDA4NUI3REI5MzY3QjdCQThFMTVFIF4KKzg3MTNBMzk5N0EzQ0Q1REE4N0U5N0FCOTQ4NTFCNjhFNzQ4MjY4Q0YgXgorMzcwMzU4RDU0QzgxOTcwM0UyMEVGNjNBMjQ5OEM4NTg2QjQ4RDQ0RSBeCiswREU0MDI0OUE4QjIxNUU5OEU4NDkwMDhGQjdDQUU4MEVDMjNGNEE2IF4KK0JCREI5NjMwNjU5NEQxMzU5OEJCMDEwOTI1OEU0ODhENDg2RDk4RTQgXgorREY3REI5Q0IyRkQ4QTg2ODU0QzVERUZDRTU5QzRFMkYwMjQ1RjU4MiBeCis4NERFMzJFRDg4QjNEMkJENUY0RTMzQkEzMzk4Q0QyRUMxRTlCREYzIF4KK0QyMDk2Nzg0NEZFRDExQ0E3MUQyOEQ3MkIyOEFDRkRCMTRBN0RCQjIgXgorQjEzQTBBNkE3NzIzQkNEOTA5OEUyQjA0RkEwNDMyMEM0QTBFNjA1RCBeCitCRTY2QkUzOEY5N0U3RERCMDJFREM4RTBBQ0U5N0NERjgzRjAzNEZFIF4KKzI4RUNDMjVGRkIzOTRBQThERTE4RjhBREU4QjM1Nzc5NTUzNDZGQkIgXgorNDUwNjhCNkEwRjYxRDBBRUY3MDhBRjdEODQ4NjgzREFCRTgxN0MyQyBeCitFQUFEODI5QzMyQzNBRDRFQUVBOEI3RTYwOTBBNUNGNkIyRkNBQTgyIF4KK0Y0NDVGRUIyMkRGNUE5RTQ5RTJDRjdBQUQ3Q0MxRjVGNzJGMThCNzcgXgorNzNDNDI0RkEwQjc4NjNGMUYxNzBBODUwRjZBMEY4NUM4NzgyMDg0MSBeCis3MUYwMTU1RDQwQ0M1NUYzRDY0QkVBNjQ1NjA4RkQxODRFMjU0M0YyIF4KKzQ1NDJGRkNGNTAyNjdCNzc1MDJEMUEwRUQwQzJBNTA1MENBRDUyMDAgXgorRkI0OEYyNkYzMjBEN0E0QjgwM0VENDU5QkRGOTJCQzFGODcwMzYzMSBeCitDOUY5QTM3RTM0QkVBNjIyMEJFQkMxNjdFMzRCMEJBQzZCNTVBNkI2IF4KK0IwQzgzNkNDMjgzMUZCOEJGRTU5ODgzNjBDQzM5RkFBNkE5MDRBODkgXgorQjBDRjc4M0Q4NEJGNTM4M0VGMzBFRjIwNzFFMEZCQTlBQkI1NTNFQSBeCis4NDExQzhEMUE0RkMzRjEzMDE0M0RFQzUyMzJCNTlCQkRERjExQjdDIF4KK0FDQjZEOUVCMjJENDc0Q0ZENTgzNkM4Q0UyMkYzODdFMTJEQzIwQjcgXgorRDU4MkZBM0RFMURDNDI1QUU2QTM5NEZFNUFDMzIxREZFOTZCOTMwNSBeCisxNUNBMzJEMEUyNDZGMzk1REUyMkZBRjhGMEZEOTAwMzZDNDAxNkM4IF4KK0YxODMyRkVFQ0JGRkYxMzMwQzdBNkFDNDdENkZDMTg4MEU3OTU1MEQgXgorQzQ4NDZCRUExNTlEMUQ0MzQyN0NCNTgwMkM0NkU0NzlGOTE1NzM5MiBeCitDODRGRjA5QkE2QTJFRTlCRDE5NzJCOEMwQkYyNTI0MEY1QTdFRTcyIF4KKzRFNkI0RjM2M0Q3RkRCNDA4M0FBNkY1RTc5Nzk5NjZGQjhGRjZDNUEgXgorN0E1NDNCODFDQjREQzkzMDgxRDhDQjZBRUQ0MzZBMzFDNDAxOEE4NCBeCis4NTk5MEExQzM1Qjg2QkEyNDRGNjBCQTBFQkQ2RjZFODAxNTUyRkQ0IF4KK0QzRTA3RjVEMTRBRTIxOUQzQ0I1OUIwMzQ3NjRDNDAwNTZCQTk1RjQgXgorRjRDNERDQ0M2M0U4RkM1NDAyRTkzQ0Y1MDUzM0U1MUQxQkVDRUQ0MyBeCiszODA2QUZGOUFEMzg1OUIxNTBGMUUyQTQwRkJDMDQ3RkI2MjRDQjE0IF4KK0I1MUE0RTRGQTIxM0QyMjU0OENGRjI4MzIzQzY2NzlEMjY5MzExMEEgXgorQTdDNzBDMTlCQUMxMDQwNjk4QzdBRTZBMjNCMDY4OEI1ODQwNTE1MyBeCitFNzRGRDhDNDU3NTgxQ0QwOUY3NUVFM0Q0MzQ4NTEzMDYwOUZBOUI3IF4KKzg2RUQxRTQ5RDRDQTg2ODkzNEQ3QzI1NEQzQUUwRDVCRjczMjNDRDcgXgorQTE2NTA3REFCQzNBMENGNzEzNzE1MEM0RTZGODhENUFDOUEwQUEzQyBeCitEREM3NkQ3QkE1NDM1NDExMkMyRDdEMzFFMUE4MEYwMDQ4NTUxRTVFIF4KK0Q5NDNGNjAyODE0NkVFQjAzODZCQjMwODRGRDM1NENFODZBQkNGMDAgXgorNEFCQ0FCNjVDN0RBQTUyQkRCRDEzQkNDOTA5ODY0M0Y1QTE2NTMyOSBeCitENzVGRTIyMTYyQzUzOEJBMUUyNjg3RDY2RTI5MjNDRUM3Mzc1RTAxIF4KKzFBMTFBMkIxMkQ5M0ZCMDMwQjBDMzQ0MUQ3QUFDMDZEQUQ2RkI1MjcgXgorRjhGM0Q0MTRDMjZEMDlDNkNBMUI4OEJFNDRCRTY5QUM4NzlEM0M1QyBeCitEMkQwQkM5ODc5NTc0MDAwMkIyRUI2RUE2QUVDQTU1NTkzNDBCNTRCIF4KK0E4QTM4MzhCQTQ1QUI2QjA1RDFENDY0RTg2ODFBRDYxQjEzNkI2QTUgXgorNUIxNjI5MjMyMDA0MzlEODcwRjU3QUVDNTg0QTY3Q0EyRTg5MzlCOSBeCitBOEZFMEI1NUNGQjE1RDk3N0U4NzExNTI5MDVEOEZEQjE4QUE2QjU5IF4KKzAyRDVENDkyODk2OUM3QTg1MkI1QThBQzc3MkEzRDFFQjQyNEM5QTMgXgorNEVDRTA4REZGMUZERTEyNThCMUJGMDQyM0UxRTMxRDgzQzU3NTU3RiBeCitGNzAxNDMwRUY2Q0I1NEJGMEQxMzhCNTRGQjEzQTFCNTg2QTFDRENDIF4KK0UzMjQyQTcxMTA2Q0I3N0QyNUE2MEQxNjRCRDE3RkUwN0VBQzQ5NTEgXgorRDhCMThERTg2MTMyNjcyRURCMzMwMTkwQkU4OTVFMzEwNkY5MkQyQyBeCis4Q0YwNUZGMTM4N0M2MUE4Q0MzNzI0QkIxMjgzQUFEM0UyRjg1RUVGIF4KKzc5N0IzMTFEQzJCNUQxNEI1Mjc3RTQ5QTM4QTc4N0QzRDZBNThDMkQgXgorNjQ3MkJDNTg4MUE2MkJBOTU2NTFEQkIzREZGOUIzODg1OTQ5QzlCNiBeCis4NkFFRDRCNTNEODYxN0ZDMTM1RDBFMUZDQjc2MjI3MUIyNTQ1QTQ1IF4KK0UzQzg4OEExQzAwMzAxQUE3Q0UyMDNBNTU5MEQ4MkMxQ0U3N0M2RDQgXgorOEEwODFBN0E2NzJGOTE0OTNBQzA5RDk1QjI5RkFCRDA0M0RBODNERCBeCitENDdGODcwMjJEQjRGQUU1NTFGRjNGQTA5RkZGMDJEOTJEMTEyNTI3IF4KK0IyMjcxRTM3N0U5QjE1OEFDQkNBMUVEQUUwRUQ2QkE0QzU5Q0I3MjIgXgorNzFFREUwQzk0ODhBMjFFNjI0NTZEMDZFRTM5M0YzOTA0NzhDM0YzMSBeCis0MzdBMUI3MDkxNzY1OTgwMjBFQkExRTkyMzg2QzM5NzlBMTg5MTVEIF4KK0UzRjRBQzQzODQ4NDgwNzFDOEE5Rjk4NjgzNzZEOTQxREVDMkE5RkIgXgorMDA0NDRDQUY2QTNGNDIxMEZEOTdEQ0I4RjEwRjQzQjI4RDg5MDYwMCBeCis5QjZCQjM1MEUzMENFRTIwOUM3N0EzRTIwQkI2QUNFODY3NTQ2MzEzIF4KKzkzNUQyNjg4QUUyQjE2Qjc5QjUxN0JGQjc5RDQ4Q0U3RTRGMEY0RTkgXgorMTZCMjFGMTlBREU3QjZERUU2NjVENDVBODQ3NDkxQjdGMDU1QzQ2RCBeCis4NTMzOTdDMzU2NUM4MDdBRTcyRURGQTM3RjQxOThFODAxMTAzRkQ0IF4KKzEwOTkyQzJGRkU1MTI3MDA2QkFGQjIxNzIzNTk3MDFBQjEwRkE0QkUgXgorQzgyRDZCQTRCQTYyMUUzNjg3MkFDRUU0QUUzQkRGMzNDMjM4MUIwNyBeCitENzg1MkRCQzhGRjU5MkUwOEExRjFFRTU3QTcwQkVGRjMyN0Q4RUJEIF4KK0NGNjczMDg0MjJGMDcyNDE1RUZCNzVCNDNENUI2N0M3RjUzNjJCMEQgXgorMzBEREYzNUUxRTk5MjQzRjg1MzExQTA5OTREOTFCOEFBNTQzRjcyOSBeCitEQjJGRTM0MEY2MkE4OTQwMEFFNEExNkI2MTQzNTIwNDQwNTM1MEQzIF4KKzc0NDk4MEZBMjZERTUwMzc0M0VFRDI5OEI5NjZFRDVGQTg0NzFERjYgXgorRDJDOEI4MDNEM0REQjU0Q0RFNjQ2NEQxMjZDRTMwMDlBOUYwRkI3MyBeCis4ODU3MDBFQ0MwNEVCOTc5NDNBOUMxMDBFQjZFQzRBQ0ZFNTlERjgxIF4KKzc3MEY5Q0FDNUQ0RTlDODc4QTY2MzZFQjAzMDZFRThEREYwQ0Y5MTUgXgorMDNDM0YwNTUzRDdDRjE2Q0ZFM0QzRjAxQzBBNENFMjZBOTE0NTEyQyBeCis5M0IzMDRCREIxMzhEQjY3OTBERkY4QTg0RkZGM0QzNTA2NzcwQ0RDIF4KK0Q1QzVGQTA0ODhDNUE2RTE0NzcwRjIxNkI1NzU5OTc5NTBBOTQxODQgXgorMkY2OTVCOEVCMThDMjgyNTBEN0M4QjM1QkEwMDAwNDJFQUJEQjI0NSBeCiswMzUzRkZBN0Y3MDg1RDNCNzg4OEY5NkI4NDk4NDg2RUU3REUxNkNEIF4KKzIzOUZFM0FBQzBEMzczOUY1RUVFQzgyQjJCRjZGNUY0N0QwNTg1NDggXgorMTZERTg2ODQzOTVDQ0E4QTVEQkFDNzJFQ0ZBRkE0QkMzREJGQzVENiBeCitBRUIyQkE3NDI3MDhEQkMwNDhCMDFGRDc3QjE1NjBDRDNBMjNFNzA3IF4KK0ZBQUUxNzhCOTcxNzVBN0E2OEU1MUJEN0VFQzA2MjM0NzIzQjY3MEEgXgorQjNGMTMxMTI0N0Q5MjAxMTA5NzI3NzJDM0RDMzBGNzg5RDNGREJBQiBeCis0NjZGNjgyODQyQzA3RDJDNzcwQjQxQjY2QTY2QkU5RjY2NTFDMDQ2IF4KKzM5NzI0QkQyOTEzOEY3NzZFRDIwNjMzQjY2QTNBMjQxRkFDRDgxN0UgXgorNTkzMUYxOUExOTg1Q0Q1RjcxNzFBNUQyQjgxQ0UxQ0IzQkE4RUJCQiBeCisyN0RFNUMzM0ExOERGMUE3MzEwNTFENjY0NERFODkwMEUzMEUyNDJFIF4KK0E0RTFDNEYyMEEzNEMwMzM1ODlFRDA5ODVFODAxNjhBMjhDMjM3N0EgXgorOUJFODIwQjEzNDQ3NUNBMzE1MTNFRTFDNzlEMDZFMjk5RDcwRTAxNyBeCis5OEYzOTZEMTQ3RURGM0QzMDc5QTZCMkRDRERFOTJENDhDOUNDNTJCIF4KK0Q2MTA4OTAxOTA5NDE4Q0Y3RTdBRUNEOUU0RDFDQTEyMUU5OTJFOTAgXgorRjJFOEYwRkYxQzY1MjM1NkU2MDU2NjQ0QjgxRkY4MjcwQTA3RjU2QSBeCitFQTE2NjlFRDUwOTEyMEYyQjQyQ0ZBNTQ3QTNGRDYwMDJGRkI4NjJEIF4KKzIxOUJBQjU1NjUzQjAzQTNDQTc4ODYyMTJERjI3QjIzQzA4MkIyRTAgXgorQkJFOTVGOEJCRUVCNkY5QTAwNjJEMTUxQTcxNTU2MzBGMjAxMEI4OCBeCitGRjZCRkM5MEZFM0VBQjI5OTg5MkE1RDlDQTREMTdERjJDNkM2MDRFIF4KKzhEMEUxREJGQ0M0MTlBRUIxQzc4MjdDNzY0OTMzM0UzNEFDN0UzMEMgXgorRUYzODQ3RjdGRUEwNTRGMEUwODA4MzZEMEYyQkZCNjc2RTM1NzNFRSBeCitGNjBBMTVFNkEyOEE1Q0NDOUM0RUZCMUIzMTA3QTU0QzlBQUVDMjZDIF4KKzc2MzI4Q0RFNUVGRTY5NjFCMkNFRDRFMzQ1N0QyMTkyMjlFMTYxRjcgXgorRkZBRjAzRkI2MzJBMDQyQjgzN0Y4NjYwNDEyQjcyQjEwOTkzOTRCMSBeCisyMTFCQTY2NzVDNTJDQkQ5RTdGNUY1QjM2NkE2NEEyNDY2NTMyQUE3IF4KKzUxRTA1Qjc0ODEzODEzNTg3ODJGREY3M0NCOTU4RTE0MzRDRjMzMzAgXgorQkI1Q0VBRDFGM0I2ODIyN0NCMDMyQjJCOEU1QjYyNzQ2MTA3MTYzNyBeCiszRUJDRjFENzg5OThENEQxMUMwOTRCRjI4RkQ1MjJFQTlGNUExRTM3IF4KKzNFNzE4NkNCMUQzOUM2NENFRkQyOEJEQTJDQ0FBMDczRTcxQTUzMjcgXgorNDE1QjZBMDA4MzM4NjA1NEQzQjc3MDI2QTM4NjU0RDQ1RDNCQTEwNiBeCisyMjk3MzcyMjU2NDc5RTMxRTEzOUFBMTZFNjNDMjdDMjA3NTE5QzBDIF4KKzY1QTc5RkM0QjMyMkY2NTVBRENGNjM0MzJEMjk1MzQ5RkRDQTlFN0IgXgorMkQxMTMwRUU2RTQxNTYxNTFDNjM3QjQ2NTI3RkFDNTREOUU3OURGNyBeCis4MEUxOERFN0M3OThGMDQwQzAwOEIzQkZFMzA1NDI2MTc0MEUxNDQ0IF4KKzA3MTBBM0EzMDAyOTBDQzFDM0JBQjU2Q0YwMEE2ODJDMUI3MTFCQjcgXgorQzZCRTVFMzM3QTFBOTc2QzI1M0NCRjM1NjY4N0YzNTk1NDhCNkEzRSBeCiszRDZFNEU1MTQyNzcyMjNCQURFNkEzMTdDNDc4RjE3RUE2RUJDOURDIF4KKzI1QzY2QzkwNEMzNUVCQUQyNjEzQTMwQjczMjgzRTBGQzIzQ0NDMTAgXgorMTI1NzA5RkRGRDUxMTE4MEIwOERCNzczNjZEQzdFNUEyQjQ2RjBDQiBeCitBRkI1QzUzQkIyNzI4MjZEQjdBMUMwMzBCODlDN0YzQUU5NTZGNjVBIF4KK0QxNjZFNzFEODE0MkUyNkU1OEUwRjdBNjlDNTBDRjE5Q0ZFMjI1RkMgXgorNDI2MDA3MjM1RDhGMDZGRENGRjIwQ0U3RkQwMEU5OTRGMkZDNDIyQyBeCis4Q0EyNzMwMTYzRUE4MTZCRjlCNjNDQzY1M0I0NDNBOEU4QkQ3NjU2IF4KK0JCMkRBNjIzQjVGRDEwMDMyQkFGQTFBMkY5RkIxRTEzRjc0QUM0RUIgXgorODIyMzhFQzNDOTBCQUYzMjI3ODg1QkU3ODUzNEExQjA4MjEzNjYwQyBeCis2NEJBMjc1RUU5NDIyMzU2RUFDMTlBNDZBNEM1QzlCREI0RDYzQzA1IF4KKzQ5OTUzMjNCODVGRDM4Nzk2MzFCNDM5QkY0RjhEN0QzOTYzOUE3RkEgXgorNDFGOTVCNTEyOTkxQTRFMDVCMjE5NDc5ODQyMjg1OTAwREY4NDI1RSBeCiszQ0VCRTkyOUFDNzYzRjJGRDg1RjIxMzU0QzkxNThFNTE2OUE4NDRFIF4KK0JBRDVENTNENjdDQkNENzc2N0I2MDA5NTQ2QTkxRDU5MTg4REU5OUQgXgorRTlDMjkwOUY2RjBBMzA3OTg5MDE5M0M4NzcyRTc0NUEzMTdDNDhCMCBeCitCQjk3RTMxRTlCOEVBQThDRTc1OERENzc1RDgzMjZGOTQ3MjBFMTk4IF4KKzEwOTQ3MUExQzNBNDI3QzY1QzRCQkFGOEM3ODVEQjk5Qzc0OEU1RkEgXgorNzUxRDlDQzY0RjAwMTc2RTQyNEExRjMzMUM2M0VBRjI5MTBBNzVDQiBeCisyN0VDMzk1QjA3RkM3NDA1Njk2MTI3NDFFNUNGMTNBOUE2MDQ4MDEwIF4KK0Y2NzRCRDg3NTU2RkQwRjcxRDlCRjIzQTBFQ0NFOUYzOUFDODIwOTkgXgorOTNCMkY5MTA5QTI1QzUxMTg2NUQxNUUxNjgzQzA2ODM1NTVGRkMwMSBeCis8RAorCitIPlNIUyBUeXBlIDIgSGFzaGVzPEgKK0Q+CitFRkEzRUM4OTc5N0VFM0YxQTVCRTRCOEQzNDc0NzEzNkNBN0RGQjk5IF4KK0QxNDZENDY3RTMyMUU0RUE0QzczRTg0MjQwMjlCRUE0NjFGM0Q5MEIgXgorMjVBQ0QzMkRFRDMzNEFEMjBERENDRjAxMDU5QjZCOEI4NjRFOEQ3QSBeCisyNTQxNkQ2OTY2NTAwN0MzRUREMjQxNjFGM0RGMEY2QUNCRDBFODU5IF4KKzU0MkEyOUU1QzA0QTVCNzlBRDA5ODZGQUQ0OUJFNzQxRjA5OTQyQjkgXgorNUIxOTdFMTAxMTI4NkU1QzEzMEY5Mzc5ODQzREU4OTc3NkMzN0M1OSBeCis0NjcyNzdFQjg4ODdFREUwRjIzNjlDNkU3RDEyMjgxRUUzQjUxODU3IF4KK0JDMTYxMDIwNEUxNUEzN0Q1MzNCNzQ0MTI2ODM3Njc4OThCMzVERkYgXgorM0RDN0M0NzI2QjNFRjc1QUI4OTE5MzcwMUM5OTBGODZBQTZERTgwRiBeCis0QUQ0MzQ4RTUwMjI2ODVDNzBBMkI5ODA2Njk4NjY0QzI4MUU3MTIzIF4KK0EzM0U0OTk2QkQ5OTgwRUQ1MDVGOEFBQUYwRjZENjRFOTdEN0U2MTkgXgorMDYyODBBQ0MyRDBEQTE1RUFEN0M5NjMyNTMzNDlDODZBNkMzQzZDNCBeCiszM0JFMjk3NzlGNDJFRTUwNEEzQ0RBRTA0MjJGN0I5QzVDQzk5NERFIF4KKzQxMjk0MTI3MkM1Q0UzNDRBQzE0NEI2OUQ0QkE1RjYxRjE0NzRGNEUgXgorQzMzRUNBQzFGQTc0RDU0Njg1NjY5RjhCOUY4NTkxODQ3MUE4OEQ2MCBeCitDNDgyNzJFNDJGOTIxQTI3NDlENjA0MTg5NjVEOEE3Q0IxQzdCRjBEIF4KKzQ0QUJFRUFEMkMyNzgwOTgwNjJEOTM0NDYwRTU2NUVEM0M2NDY4ODAgXgorMDhERjE4NTAwNzgxNkUzRUYwMUQ2MjI2QzcyQjAzMjU2NDc4RjIzRiBeCisyODlFODlGOEYxNURENzA5NzAxQUEyMkIxMkM2OUU4RjkwQzkzRjFEIF4KKzVCOTNDQUIzNjlDOTlCODVFRUUzMTMwRjgzM0I3QkIwNkQ0RkMwNDEgXgorN0IyODcyQzU4RkIzNDBDOUExRDA2OEI2MThFNDk4MEIwNEZERkYyRCBeCis2Mjc4MzQyMUNGNThFQTY2MzY2QUREQ0JGQTk2OTY4RkIxMzY5OTE4IF4KK0M4QkQ3MzJEMDE4MTA1MTY5ODE2MEIyRkJDMjAyNTQ3NjI5N0M5NkIgXgorMDM4RDU4N0NDMDY5QzlCODlEQkMyRkU5RDg2QTk4QzAzMUQzNDBCOSBeCiszMDU5MDMxQTY4NTg1REE4RjA5Qjg3QjBCRTM0MTM5ODdFQjM5MEJGIF4KKzFCNzRBNEE5NTcxMzA4MzYwOUIyN0U2NzE0MDcwOEVEQTE1RjgwQjEgXgorNkVBQ0VBNjk5MjJDN0FDRTM4RTA1NjBBOTFEQTQ1OUMwQ0M4OUI1NSBeCis2MEUyMUY1Mjk5RUM3MTlEMjgzMkE4MjI2OEIyNEFGNkIyODE1REVCIF4KKzNEN0Q1MTc4MkE1MzJGNEY0MTBBQTJBQjNEQzkxNzhDMjFBNTVGMEEgXgorQjI0MjNEOTYwMDhGQjgwMEU1RTM1RTE5REE2QkVBMjc0ODc1ODVFMCBeCis1MDM4RkU5QUVBQzgyOTY2QTRFRTVDQzY5QUNDOEFDQ0Y1NUU2M0RDIF4KKzkwQkYwQTkwRjg4RjVGMURBNTFFNDQ5NEUyRDVENEM2MjUwRDJENEIgXgorRjg1ODQzNEUwQTVGRDYxQTIyMENDNzkyMzgwODAxRDE5RTBEOUY3NyBeCitDMzFFMEJCNDVGRjFEQzBERTQ0Qzc3QzUzQzU5QjE1QzNCREU5RUI0IF4KK0RGNTYyOENGNjQ0NUM0MDlCNTFGNDZBODY0ODhBOTVERDM0QTNEQTUgXgorNzQ0Q0RDQzlBNTFCMUFEMTRGQUZENjczRDQxMDQ0MzNCN0EyNDczOSBeCitDRUE1RTdCOTE3NzNERkUxMzY0OUFDQTc4OTA3NzY5QjVCRUJDQTFGIF4KK0RDMjNFQzFBMDRGNzQxN0Q5NzA0Qjg0NEU5RjM5RjM5RUFBQkU2RDggXgorRDM5RERFOTcyOTdCN0QxQzlGRkQ2QjY3MzMzNDlEMEI4RTgwMjY4OCBeCis2NTIxOUU3OUY1QTNDNjFGQzA3NTY2MDI1OEE5QzVGMTNBMTU5MjcxIF4KK0QyQTg2MTY0RDEzNjZCNjBGMTQ2NjUxNDY0NzYxQjAxMzUzRjkwMjggXgorOEUzRDFFNEUwNDM4RUFCQzU4QUI5NjdCMUNERERBRTNDREQ5QjA3OCBeCitFRTlCRUVDNzNEMEU3NjBDRkQwNUNGNjIzODJBNDYxQzdERTNDRTJBIF4KKzVDNEZERDYwNDc1MTU5NkJFNTQxOUQ0QUMyNTZDM0Q5ODIwMTIxNDkgXgorNDNFQ0QwREU4M0YwODc4MTVDRjI1Nzk4MjkxNDYxMUU0QkZGNjk4QyBeCisxQTFCQ0E0MUJBMTI3REY0MjY0RDM3OTVFMkVCQ0VEQ0QxQkQ4RUM3IF4KK0ZGODJCQzY5MDQ1MjBFMTg2ODAzRkZFODYxRENFN0U1NjZENzVGMDMgXgorNzY0NTQ2RkZBMDE0REY4Mjc4OTc0QkU2NkQwMTQ4NTI1MUI4QjBDRiBeCitBMDZCQzk3REFDQjA3RUYyMDc4MDg2ODQ5Nzg4NDFDNDI1QUUxMjM4IF4KKzZDN0U2RTBFODlGMkEwNzBFREYzQzQzMzMzNTM4Njk5NDJGM0Q4ODMgXgorNTcyNDM3QjJCMzVDNUJBMDBFQkM3NDUyMUIxMkQyMEU2RjE0QUNCQyBeCiswODcwMzE4NkU3NEE5Mzk3Q0VCQjFCMjAzNEE2NzcwOTk1QUYzRDBGIF4KK0U0RjkwNTUzNTZBQUJBOTMzRUVGMEMwQjA3QjZGQ0U5MDM2MUQyMDggXgorMjAyMDIwM0VGRDRDNUZGQTAyRTU5M0I3QTY1ODAyNEIzM0ZCMzY4RSBeCisyQkIyRjMyRDY0QURBNTZBM0U1M0E2RDc1MEEwNUY4RDJCNUQ3QTdEIF4KK0M3MTlBRUU0NzA4RTdBMjQyNDQwQzk0MjlCNzIzNkRGREVDMDJCNEIgXgorOTI0QTI2QjQ2NjQ5Mjg3MTk3RTE0MkNCNDI1MDZDOTZFMzA5RUIyNiBeCiswNDYzRjk0QjU0NTJBMkQ4QkEzQTBEQkZFOUM0OTBBMzcxQzE5OTc1IF4KKzlGQjJGRTUzOTMyMzhFQUFGNTgwMzRCQzkzNEIxOTA3ODRBMTBERDMgXgorQUQ0QTY5NjJBNkE1OUNBMzI3ODlBQzNCQkEzNjg1ODNCOTEyMkFGNCBeCisyQTg5NDU5NjU3RjlFMjY4NUQ3OTRFN0FFQUYzMEEwNUIwNkFBNTczIF4KKzlCNjVDQjkxRDBBMjQ3NzNBQzg2NzVGRTk4NjJFMjhBN0I4NDk1NEYgXgorOUNCN0NBREVERDM5MUEzNjg5QjA0NDI3QjQ2MUM0MTEzNzE3QjZDOCBeCitGMUI5MjJEN0VDMjQwRkM5OTY5MkVDMjhDMUE2Q0M3RDkwN0IxMDE4IF4KK0RFMzAxQTE0MTNDMzZBNUNCODkxRkJDRDlDRjkyNThERjRFRjE0QTQgXgorQjMzMDczOEQyQUQ1MzQ0OEMyODdCRUVGRTVDNTU4M0YyQjgxN0EwMyBeCitCODBFQkUwMTA0QTI1ODQwQ0FFRjZBRDc0QzQ2NzZENTI0NTcxQTI5IF4KKzNCNUNEMDE2NjFBMjc5QkE3MkRGQzEyNzJFNjgzNTczQjRGMTZEQ0QgXgorMTQxMkQ2QTJEQkJDOUQwMDY0MUE3MTE2NEE2OTBDNjQwODUyQjU2RSBeCiswRUY1MTQ0MjlDQUM5NUNEQ0JFOEEyRTYwQzJBQThCODkyQUM1QjMzIF4KKzVGMzJDRkYzQjA3RDQ3RUMxM0VCNTRFN0MzOUU0RjUyMTZGREJEQzUgXgorQjkzMTk2NjE2OUQxNzFERThGOTQ4OEU4QjVFMDk2MDEyNEJDNzQ1MSBeCitFNTAzNEQzQTVBNTczNDQyNzgxRUYwQzZFRUE3QkQzOUZBRDBCOTRBIF4KK0Y5N0NBQzUwMTMxMzU5NDRGREY4QkRDRjAyQjRDQzYxMjQxQkVBNkEgXgorRkY3NEM5M0NGMzI1MDZCNEUxN0EwQjU5NkFCNTY0OTg5RjIwRjFENCBeCis1Q0E0MkUzM0JDRTQzMDFCOEZCQ0U1NkJGQkRCNDNFRjc5RTk1NkQ4IF4KKzg3RjVEOTgxRURGQTAxQTJFOTg4NUJENTJDQzRFNjQ5QTIzMzA2MjEgXgorNjNGNDM4NDRFQ0RERjMzODIwM0RGQjExNkZBNzlDQkFGNEU1QzkyQiBeCis5MkM1RTJBNUQzODBEMkJCNUUxOUU5RTY1REM5QTc3RjRCOEIyNUY0IF4KK0UzRDc4NTAxOTY5QUNERDc4QTcxMDQyRTdCMEJEMEMxNDg4MkU0MDIgXgorNEUxRkQ2RjVDRkUyOUEwRTMzMjQ4RjJFMkVGQjc0RTdFMEE5OTc2NSBeCis1RkY1REFEQzkzQjJFNDUyQTYwNjc3QzhDRDBDQkFGN0JENDg5NUU0IF4KK0NBNDkwRkFBMkQ2NzIzRjlGNjgyRDVDOTY1ODY0NjBEMEM4QjIwMTAgXgorOTRGMDk5QzJGRjdEQjY5NEZEMkRDRjVBOUE2QjA2ODU1QjJBOTk0OCBeCitDRjNCMUUwREE3QkU4NzE4MEJGMTg0N0RFQkVDNzA2Nzg4QzUzQjhCIF4KK0Y4NTMwNUM0QkYxNDlCOTIwNjhEMzYzRUYxOUI5MTREQjkwNjE4REEgXgorQjRCQUZDQTMxNzZCODBFOTgwMEUzMTlGQjNCQjc0RTVENjVCRUI2NCBeCiszOENDRjUxOTE1QTM4NTU5QTk2RTZGMzI1ODE0OEQ1RTYzMjMwOTg0IF4KKzZGRjQzQjBEMjVDNzE3MUZGMTc4REVBQjEzRDdGNDg4RDIxQzQyMTYgXgorM0U0QTAzNDE1MkQ4NkU0NTY4QTIxOTdBNTMyOEU4RTk3MzYzMjg3RSBeCitGMjMxRDRDM0FCQkUwRkRGNzdDNzFFQjJDMjhFNTBBQ0Q5NTg0NTM3IF4KKzIzRTFBNEY3M0YyODgyMzM4NDdFNjQ3Q0Y4NjIzMjg5RjFGODlFNTUgXgorNzI2REFFQUU3MjRFNzkyMzI2MTFDQkIyMTZCNzcyMjU5NEU4MTRGQiBeCiswRTVGRTUxMkIwQUY1MkI0MTgzMTE5NTA4Q0IwMUFGNTMzOEM2M0UzIF4KKzRBNUQzRTEyRUIyOUIyMjQyMDJDMEIzMTlCMDg2NTM1RTk5RjVFMzIgXgorMzYzNTc0QTkxMDgzMEVEQ0ZEQUVEMTA1NTk3NUYwNjEzRDFCNUM5NSBeCis0ODIwQkU2Qzc0QUQzNEQ4QTQzQTVERDAxMzBDQkRFM0Y4OTBDNTNCIF4KK0ZFQjZFNUJGN0E2NkVEOUI4MzhBMTAzMDVGODUwMDUyRERGOTIwN0UgXgorRDUwQjMzMUFENjkyNTU0NTI2NEI2NjE0QzNCNEMzOTM3NUFCMUY2NSBeCiszNkIxQkYzOUJGNEFFRjA1RkIwNTRCRDAyRkFEOTA2MkQyMzM3MjM5IF4KKzxECisKK0g+U0hTIFR5cGUgMyBIYXNoZXM8SAorRD4KKzlCMzBDQUZERDdGNUU1MjUyMjFFQzAzNkQ1NUE5QzhENzgyOTREQkQgXgorOUJDQTMzQjNEQUQyMjAxRDBGMTk4MUNDRDBBRjQ4NzRFMTYyQTZEQiBeCis4QjA2Njk3RTRBNzVEQTVGMDIwQ0VCODYwQTI5MDQwQjNERjZFRjIxIF4KK0YwRDQ4NDAxQUUyMjQ5OEUyODFDREFBRjA0NUZGRUJBQTg3QTk3NzYgXgorNjI0N0RGNjJERjVENDg1N0E3OTU5OTYwMzlCNUE2MjcxRjdBMjAzMSBeCitEOTg0MzNDMzM3MkYxNDA1RkNDMjQ3NTk1OUI5RjM1REYyN0QzMkU5IF4KK0M0RDE0QjI4NzNCMEJERjAxQ0E3QzE2MjhFRTAxRDYxNjgyQ0YxQzggXgorQzAyN0E5QzAxMEY4RUJFODlGQzg4QzFDOUZCNjhEQUIwOUEwQ0ZDRCBeCis0RDhEMTlGMzVGQUVDREVCMDE1RTExNjEzMEEwQTRDODM2QTQyQTZBIF4KKzkyOEUyRTk1RDNGMDlEOEVFNjNDQjhGMTAyOTZFRTZFRjc0NTVGRkYgXgorNTVGM0U3NzBEQ0EyOENGQjcxMUQwNTkxNzRDQzdBOUVDMkIyREQ3QiBeCis0NTAwOTg3MDg2RkQ4QzI3NTMzMEUwRjI3RThBM0VEODU5NkQwMUFBIF4KKzYwQkM1N0QxNkY1MEUyQUREMTcyNEUwQzdEREQ1RTQ3RERGOEUzMDAgXgorNTlEMTc0MjcyQUU2MDJBQzA5MkVFN0VGMzkzQUMxOUI4N0I4RTg2NSBeCis4QzI1NjE0RTZFNEQ4MjVENkFFREQ5M0E2MkQxQTA0NTg1ODNFRTg0IF4KKzY5NTM5MEQxRTU3QkNDNENERDQ0Mjg3OUYwOTc4QkQ4MjMzMjJFNUMgXgorNkYzNTNFRTZCNUY0QjgyNzJFNEEwRDNENEJCQ0M4M0IxQjk0MjUxNiBeCis0QjNGNjcxODc0MjIwRENDRjQ5QjU4MDE4OUU2QjEzRkZGMEY1MzFEIF4KK0JDNkM0NzNCNDgyNEQ4RTJGQTA0RERBODZBNTg2NUQ0QTM2RThFOTEgXgorMUJGRUMyNjlGRDE4RDI1REM1QzU2QUNEODM4MTAwMjI3NzVGM0VDOCBeCiszRTk5MjFFMkY2ODU0MTNDMEFFQTY0ODAxOTQ1QjQ4Q0I3NkUxOTVFIF4KK0VFQzcyMjFGQkFDNUYyN0I1NkNGNjhDMzk2QjdFQkJDQUEzQzBCMDUgXgorRjg2REREMkE4MjI5NTMyQzNGMTgzRUE5OTAzQUQyMjhBMjUyMTU5MyBeCitGQTE3QjVERjMzRTQzMjZCQ0RDQjI3RjFDRThCODNCRThCOEVGODkwIF4KK0E0QUZDMEI0MUQzMENFNzk2QzJCNEIwNkUzNjhBNUQzOTA3MzU4ODkgXgorNzQ1QUYxMkI0RUY5ODVFNEQyRjg0OEQ3QzdBREI2QjMyNDA0QjZFNiBeCis1Q0U0QjY1NzQwOTAzM0JGNjdEQjdCMENBNDgwRUMyQUNDQTgwMUVDIF4KKzBCNUFBQkM5RDNBOEU4NjExMDNENkI1QjlCOTk0RjlDNzQzQkYwNTggXgorODZBMTE5ODk4M0E3MzI5OEJGNEVCNDFBNjFFQUFDM0U0QjA2QjQwOCBeCis0NjBBMTA3QTZBRjMyOUIzMzBERTk0MjVCMzA3Nzc1NTU1M0FEMzcwIF4KKzYyQzgxRDA2QUZFOEM4RjNFNjQyQUQ0MjM3NEZGRTQ4NkRFODZGMkYgXgorRkMxRUVDQTMyRjdFNDM0QkJDNzRGNDM2MDgwOEVEQjE0MTA4N0JEQyBeCitCRjQ5NEI0RThEMzMxMUYxNjdCMUVBQUU1OEEzMzQzNjgzRjMzN0VFIF4KKzk2MTI0N0QwMUUxQzRDQzBENzEzMDc2MzdDRDU1OUQ1MzA1MjFGRDUgXgorQjM0Rjg0NjQxMUJFNjFFMTUzNjE5MjJFMEUyQUY4M0YzRjAzQjI5MSBeCitDRDg0NUIyNDBGQzI1NTFEQ0IyQ0U0ODc2NDY2NDhDRjI0OUFFOEYwIF4KKzVDMTI0QjYxNUZBQzU0OERBQTM1QUQwMjg3RTAzMkVDNzdEMjIwQkQgXgorM0M3NDc3MUQ4MzhDQ0Y3RkFFMkRBQjEwMENFQTdCNDZCRTJGRkYzRiBeCis2Mjg2MERCOEMwQzg5N0M3MzY5QTFBQjYxNzQ3QjA0QzBBRTlGOEE2IF4KK0M5ODQwMENERDdGRTcxQzdCMzU0ODhDMTZEMzM5NUMwNDMwMEVERkEgXgorOTUxNjdFMkJCRkMwMzQ5QzBEQjdDQjdCRDIwMzBCQzMwRjlGMjg2QSBeCis5RjgzNURCQjI3MDc2QjVGMEQ4ODgwNjAzRjQxN0NFODNBMEQyMjQyIF4KKzA4NDQyQjcxNUM4NEI3QThCMkM3RkZCNDYwMTBBRTU2QTBDOEMwNUQgXgorQjcxMzJEQkE1MjJDNTRGNDI5MDNDQUVCNzA1MTY3NDg1QUFEMzBCMCBeCis5RTk5RjAzRUQwODM3NEVGQTRGOUEyNjU1MUE5MDlGNDBCRUU1MDNDIF4KKzk5OTk3N0U2QUZGQUUwNDUxRTkzRTdGNzdDN0QxNzdERTEyMTQwMkMgXgorMzBFMEJCN0YyMTQzM0EzNDhFM0I0NDZGMDhEODBDRUFBRTA2REI3MSBeCitCM0E0MUVFREYwMTdEQTdCMjBGQkQ5MTExQkE2RTJFNTk4NDJDRUQyIF4KKzVCOUNBMzMxQkQwM0Q5N0U4RDA1N0RGRDM1QzlFNjAwRjkwQzU3REMgXgorNTMzOEEyNUIzMUNDOUM2NDU1MkI2RjY3NDJGOUZFQkRDMTNEOTczMyBeCisxQjNBNTVCRjZGRDc0OEIzQjY1MEVBNUJFODM5QjYxNTMwQzg3MUMwIF4KKzE1MDNGMjE1MjNDRThCQzVBMTlFNkE3RjVDQjBFQzM0QTdFOUY3NUMgXgorN0Y2QTE2QjMwMzc3RDNEMDAxNEIwQjBCNEM4NjM5MTYwQzcyMUREQiBeCis4RjYyMUY4Q0ZCNkFGMjE2NzQ2RDhCOTlDOTEzMjY3REIxNEFEQjA4IF4KKzQyRTkxNzdDNDg3QjRCNzExQTQ0NTFDMzYwQkQ3RTJDNkRBNzM0NDYgXgorNUIyNDk3Q0E2RUMyNDI2QjEyNjUzRDcxMUU2QkZEQkVFRkQ0QTM4OSBeCiszMEY0NjkwRkQ0RjA5QUM4RTI5QjkyNkY2NEM2NzM1MzlEN0ZCNjVEIF4KK0NFMTJEMUFBNDk2MTI0NUU2MDYwOTdCNjcyRUMzRTE2MTAzRDBEMTYgXgorOUJFNUQ2OTNCQzBDQzU2QjM0QjhEREI5MkZBQ0VDMkY4RjRCNjM4QSBeCitEMjA0MDAwNUFFMjMwRUZEQUU5NTk0MjM3MjYwNzU3N0VGQTVEQkMyIF4KKzhBOTIwRjk0MDdDNzRGQTM3RDlDOTNDMzYwNkI5OTZEQjk0NTg0MUQgXgorRjI2OTE1QzA4REMxRDNEMzFEOUNBNzNGMThGMDREQkI1N0U4QTY3MiBeCitFNDQ5MzgxQzgxNDg4MzdCOUU0NDI1MUIxNzgyNTUzMEQ4NzU0Qzk0IF4KK0JEODQwMkIyMTUyMEU0MEUzMUQxRUFGRDlDOTlBOUU0MDlDM0E3N0QgXgorNjI0Q0NFNTM4QTc4Q0YwRkY3ODhCOUJFNDMzQTAwOEZBNzc3OTI4MCBeCitCNzk2QjUyMUI5MEQ1NTM5NkU4RUMwMkFEOUI2OUI3RTkxMDkzRTRDIF4KKzVDNEQ1ODRGOTdDMUQ4RkFGODEwQ0VGM0E0Q0EwOTE1RkIwQjYzMEEgXgorQTE3OUZFQUYzNDFCQTk3QjFEMDI3ODgyMkFDQ0FFNUZDRjhGNEFERSBeCis2OTNEQ0Y4NTkxOUUwNkE1NDIzRjkyNzgwRTc5QzJDMEM0NTI4RDY3IF4KK0RCOTRCRUFERkVBMzY4MjA1MUQ2MjI1MTlBRjlGODdCQUIyOEM1RjkgXgorMkUyMEQxOTI1RkJENDYwRTdBNUU2QjQ4QTkyOTY0QTdERENCODc0RiBeCis4NjY1MUZENzE4NjJDRjcyRjAxRjA5OUY2OENDMTY0REVGMEU5NjI1IF4KK0Q1OTQ4QkRDQTkxRDY3MDcwMTVDNzlCQkMyQkM3NEMxQjYwNTczRjUgXgorODg3MEI4QTY4ODRGRjU0RTBFNDAwNDQxRkIyRUM3NEYyNDUyRjM5QyBeCis3REYxQzNDMDUyRTgzOTZEMjUxRTlENTIyQzQyMjczNDRERjkyQzExIF4KKzU5QTI5MEEwQkQ0MUI5NzNERUUzNTk0N0NCMjQwMDA2REJDRUM1ODIgXgorREQwRURCM0FBNjBDREVCQjg1REMwMTI1OEI5RjQ5RjNBNUU4MzU4OSBeCitGQzY3OTRFNEI0RjI3MzU3NzNBMTk1RjlCQjIwMjJDNzBBQTRDNzU0IF4KKzhCQkM0MEEwMkQ4N0E4Q0YxNEQ2Q0JBMEEyQzk4NTdEOTNFRkRFRkEgXgorRDI4RkY2RTIzNjYwOTcxMzVFRTU2NUYxMDI2M0U4Nzk4MTQwQzVEQyBeCisyRTQyODlFQkUwMkU3NUU1M0I1MkQ2NzI0Q0RDMTZCODlFQ0YzREM2IF4KK0YyRTcxNjgzMUNDMENCNUNCMkE2MjMxOTdEMTRDMkM5RkMyNUE5MTQgXgorNDdCOTI2QTEzRDY1Mzc3QThFMkFGMjdBODRFMTc1QkU5MzczOUUzOCBeCitEMzY4QjhBQ0M1MDM1M0VDODA3MDkzNkM3MzI0MkEyQkY2Q0VDM0FBIF4KKzg1NTYwMjVCRUQ2OTVCOTc1Q0I5MjREREZCMzcyRjY4OTlBN0IwOUQgXgorOUI0RUQ4OUU2M0QxN0I3MjEwQTNGQzFCQkYwRkRBNjA3Njk0RjVEOSBeCiswRDIyMjFGNUNEQTE4NEVDN0Y2Q0NBMjlBNzVGNTAyRkNBMjU2NzNBIF4KKzNDMTUyQ0NCODExREQ5QkMxNjUyOUIyM0RGQTE3NTdENzQ0RkU2NzYgXgorNDhEMTgwOENENjJGODY4RkI2RjQ1NTYwMTM3Q0ZCMURGRDg1NjI2NiBeCis4QTNGQTQyQTk4NEM5NUNBNzVENkFFNTEzOTFBQUFDMDY4OEMyQUJEIF4KK0FCNTcwRDkxRTlCNkYzRjExODhEQzg2MzlBM0IxNDQ4MzdFRjFFRDggXgorNjczRjYyQTdEMjA1RDVDOTBCNzQ1NEU4MUE1RURBOUE2MDY1MEQ5MSBeCitEMDA1NzVFNDVGQTMyNEZBMDUxNDIzNTlCQzNBMDdDODAzODM2RUU0IF4KK0I5MDhCRTQ0QTJBNjZGNzM3MERDQzAyMjM3OEE5QzJGOUJBNzBCMzggXgorMUVGNzkwMjlGODhFN0EwOTFENkYyRkEyRjQ0QTk2ODI5QzEyMEM2MiBeCis0OTFDQjJFRTA5OTRFRTZBNEZBQzU5QzRCOUZCQzlDRjgxODNERThDIF4KK0NFQUFDNEUyMTFFN0RERENFMzkzMUM0N0FDQTNENjI2QjYyRTUwNTQgXgorQkUyMDQxQ0I1NUE0ODgyQTgzMzVBNDZCNzQ0RUNCODYxMTMzNkY1RCBeCitFNEMwQkM2ODU3QUZGRTBDMkI3N0IzOEZDMDE4MjlCNDQyNDdCNkNDIF4KKzEyMkE2QUYxMURFQjZDM0I5N0U2QURGNUUwNzdCNUQ2MzYzODg3RTMgXgorPEQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExIGIvdGVzdC9kYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzZiZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEKQEAgLTAsMCArMSw0MDA5IEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQklUIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIFN0cmluZ3M8SAorRD4KKzAgMSBeCisxIDEgMSBeCisyIDEgMSAxIF4KKzMgMCAxIDEgMSBeCisyIDAgMiAyIF4KKzQgMSAxIDEgMiAxIF4KKzMgMCAyIDIgMiBeCis0IDEgMSAyIDIgMiBeCis1IDEgMiAyIDEgMSAyIF4KKzUgMCAyIDIgMSAxIDMgXgorNCAwIDMgMyAzIDEgXgorNSAwIDIgMiAzIDIgMiBeCis1IDEgMiAzIDMgMSAzIF4KKzUgMCAzIDMgMyAyIDIgXgorNiAwIDIgMyAxIDIgMyAzIF4KKzcgMSAzIDMgMyAxIDEgMSAzIF4KKzcgMCAyIDMgMSAyIDMgMiAzIF4KKzYgMSAyIDQgMyAzIDMgMiBeCis3IDAgMiA0IDMgMyAxIDEgNCBeCis4IDAgMiAzIDEgMSAyIDIgNCA0IF4KKzcgMCAyIDQgMiAzIDEgNCA0IF4KKzkgMCA0IDEgMiAxIDEgMiA0IDQgMiBeCis4IDEgNCA0IDEgMSA0IDIgMiA0IF4KKzcgMCAzIDMgNCAzIDQgNCAyIF4KKzExIDAgMSAzIDEgMSAyIDEgMiA0IDQgNCAxIF4KKzYgMCA0IDMgNCA1IDUgNCBeCis3IDEgMiA1IDIgNCA1IDQgNCBeCisxMiAxIDEgMiAzIDMgMSAxIDEgNCAyIDEgNSAzIF4KKzExIDAgMiAzIDMgMyAxIDIgMiA0IDEgNSAyIF4KKzggMSAzIDMgNSA1IDIgNSAyIDQgXgorOSAxIDUgNCA1IDEgMiAxIDUgMyA0IF4KKzkgMSA1IDEgNSAyIDMgNCA0IDQgMyBeCisxMiAxIDEgMiA1IDEgMSA1IDUgMSA0IDEgNSAxIF4KKzEyIDEgNSAzIDIgMSAzIDIgMiAyIDEgNCA1IDMgXgorMTAgMCA1IDEgNCA1IDUgNCAxIDEgMyA1IF4KKzEyIDEgMSA1IDIgMyAxIDUgMSAzIDMgNSAxIDUgXgorMTIgMCAxIDEgMiAzIDIgNSAxIDMgMyA2IDQgNSBeCisxMSAxIDMgMSA1IDEgMyA0IDMgMSA1IDUgNiBeCis4IDEgNCA2IDQgNSA0IDQgNSA2IF4KKzEwIDEgNiA1IDQgMyAzIDMgMiA2IDIgNSBeCisxMCAxIDIgMyA0IDQgNSA1IDIgNSA2IDQgXgorMTMgMSAzIDEgMyAxIDQgMSA2IDYgNSAxIDIgNiAyIF4KKzEwIDEgNCAzIDMgNiA2IDYgMyAyIDYgMyBeCisxMyAwIDMgNSAzIDEgNCAxIDQgMyA1IDMgNCAxIDYgXgorMTAgMCAyIDUgNSAyIDYgNiA1IDIgNiA1IF4KKzEyIDEgMiAyIDUgMyA2IDYgNCAzIDIgNCAzIDUgXgorMTMgMSAyIDYgMyA2IDUgMiAzIDIgMSAyIDMgNSA2IF4KKzEzIDEgMyA1IDYgMiAxIDEgNiAyIDQgNSA0IDUgMyBeCisxNiAxIDIgMSA0IDMgMiAzIDIgNSAzIDQgMSA0IDEgNSAzIDUgXgorMTEgMSAzIDEgMyA2IDcgNyA0IDEgNiA1IDYgXgorMTIgMCAyIDUgMiA3IDUgNSA0IDIgMiA2IDcgMyBeCisxMyAxIDYgNCA0IDEgNCAyIDUgMiA0IDIgNyA0IDYgXgorMTIgMSAzIDQgNyA2IDcgMSA0IDQgMyAyIDUgNiBeCisxNiAwIDMgMiA0IDUgNiAxIDEgMSA1IDMgNCAxIDQgNCA1IDQgXgorMTQgMSA1IDEgMyA3IDYgMyAxIDMgNyAzIDEgNSA3IDIgXgorMTQgMCAxIDUgMyAyIDcgMSA1IDUgNCA2IDUgMyA2IDIgXgorMTQgMCA0IDcgNiA2IDIgMyA1IDEgMSAzIDYgMiAzIDcgXgorMTMgMSA2IDQgNiAzIDcgNSAxIDQgNSAxIDcgNCA0IF4KKzEzIDAgNyA1IDMgMSA0IDcgNCAyIDIgNyA1IDQgNyBeCisxNSAxIDcgMyA2IDEgMSAyIDcgNSAxIDUgNCA2IDEgNiA0IF4KKzE2IDAgMiA1IDMgMiA3IDIgMyA1IDIgMSAzIDMgMyA3IDUgNyBeCisxOCAxIDMgNyAyIDQgMSA3IDMgNCAxIDUgMSA1IDEgMSA2IDEgMiA3IF4KKzE3IDAgMiAxIDcgMyA3IDEgMiAxIDQgMyA2IDYgNiAyIDIgNSA0IF4KKzIyIDEgMiAyIDEgMSAyIDYgMiA0IDEgMSAzIDUgMiAzIDQgNSA2IDEgMSAyIDYgMyBeCisxMiAxIDcgOCA3IDIgMSAzIDUgNyA4IDcgNCA1IF4KKzE1IDEgMyA1IDUgMiAyIDIgNyA0IDIgOCA3IDQgNSA1IDQgXgorMTYgMCAxIDQgNCA2IDEgMiA3IDEgNiA0IDEgOCA0IDcgNCA2IF4KKzE2IDAgOCA3IDcgMiA1IDIgMSA1IDYgMSAxIDUgMSA1IDYgNSBeCisxNCAwIDcgMyAyIDMgOCAzIDMgOCAyIDggMyA3IDcgNCBeCisxNCAwIDQgMiA2IDUgNCA1IDMgOCA4IDQgOCAyIDYgNCBeCisxNCAwIDggNyAxIDMgNSA4IDIgOCAxIDQgNSAyIDggOCBeCisxNiAwIDUgNSAyIDIgNCAyIDQgNyA2IDEgNSA4IDMgOCA3IDIgXgorMTYgMCAxIDYgNiA2IDYgNCAyIDIgNiA0IDIgNCA0IDYgNyA2IF4KKzE2IDEgMiAzIDcgNCAxIDcgNyA1IDcgMiA0IDcgMiA2IDYgMyBeCisxMyAwIDcgNCA4IDYgNSA3IDYgMyA1IDcgNSA4IDMgXgorMTYgMSA0IDEgMSA1IDQgMyA2IDUgNSA4IDUgNCA4IDUgMyA4IF4KKzEzIDAgNyA0IDQgNSA4IDMgOCAzIDggNiA2IDYgOCBeCisxNCAxIDUgNCA3IDUgOCA0IDYgMSA2IDIgNyA4IDYgOCBeCisxOCAxIDMgNCA0IDUgMyA0IDEgNiAzIDcgNiA3IDMgMyAyIDggNCA1IF4KKzE5IDAgNSA4IDEgMiAxIDMgNSAzIDEgNiA2IDMgNyA0IDUgNyAxIDQgNyBeCisxNyAwIDUgNyA3IDIgMiA2IDQgNyAxIDcgOCAxIDUgMyAyIDcgNiBeCisxNCAwIDkgMyA2IDkgMyA0IDcgNiA5IDEgNyAyIDkgNiBeCisyMSAxIDggNiA1IDIgMiA0IDMgMSAxIDYgMiA4IDQgMiA1IDQgNSAxIDIgNSA2IF4KKzE2IDEgMiA2IDUgNCA5IDggMSA4IDEgNyA2IDcgNyAxIDIgOSBeCisxNSAwIDYgOSA1IDQgNyAxIDcgMyA5IDQgNyA3IDUgMiA4IF4KKzE2IDAgMSA3IDggMiA3IDIgOSA4IDggMyA0IDUgMiA0IDggNyBeCisxNiAxIDEgNiA4IDIgOCAxIDYgNyA3IDUgOSAyIDkgMiA4IDUgXgorMTYgMCA0IDIgOSA2IDIgNiA2IDcgOSA5IDEgOSA0IDEgNSA3IF4KKzE4IDEgNiA5IDIgNyAyIDggNSA4IDQgMyA0IDQgNiA2IDMgMSA2IDQgXgorMTkgMCAxIDcgNCA0IDQgNiAxIDYgMyA5IDUgNiA0IDcgMiAyIDUgNSA4IF4KKzE3IDEgOCA1IDMgNyAzIDUgNiA0IDEgOSAyIDYgNSA3IDkgMSA5IF4KKzE4IDAgOCA4IDYgMyA1IDMgMyA1IDUgMyA4IDMgMiA1IDUgNCA3IDggXgorMTYgMSA0IDcgNyAyIDcgMyA4IDUgNyA1IDYgOCA1IDIgOCA4IF4KKzE5IDAgMyA3IDIgMyA5IDUgOSA3IDcgNiA1IDMgMSAxIDUgMiAzIDkgNiBeCisxOCAwIDIgNCA2IDcgOCAxIDIgOSA3IDIgMyA1IDggOSAxIDcgOSA0IF4KKzIxIDEgNCAxIDggMyAzIDEgNyAzIDUgNyA0IDEgOCAzIDYgMyA1IDcgNiA4IDIgXgorMTcgMCA0IDggMyA3IDkgOCA2IDggNCAyIDggNyAyIDQgNCA1IDcgXgorMTggMSAzIDkgNyAxIDQgNSA2IDkgMiA5IDEgMyA4IDQgNyA4IDcgNCBeCisyNSAxIDIgNCA4IDEgNyAyIDcgNSA1IDMgMiAzIDIgMSAyIDEgMSAyIDQgMiA4IDcgOCA3IDQgXgorMjUgMCA5IDQgNiA1IDggMSAxIDEgMyAyIDEgMyAxIDEgMSA1IDMgMyA2IDUgNyA0IDUgNiA4IF4KKzE5IDEgNyA1IDYgNiA4IDIgNCAxIDggNyAxIDYgMyA0IDggNSA4IDUgNiBeCisxOSAwIDYgMSAyIDEgNyAxIDEwIDcgNCA1IDEgNiA0IDYgOCA3IDEwIDkgNiBeCisxNiAwIDEwIDEwIDUgNSA5IDcgMiA1IDQgMyA2IDMgMTAgMTAgNSA4IF4KKzE4IDEgMiAzIDUgOSA4IDUgMTAgNiA4IDQgMiAyIDQgNyA5IDYgOSA0IF4KKzE4IDAgNSAxMCAzIDEgNCA1IDQgNiA4IDMgNyA3IDcgNSA5IDIgOSA5IF4KKzE4IDEgNCA5IDcgNSA0IDQgMTAgNiA5IDMgNiA2IDggNiAyIDQgNiA2IF4KKzE3IDAgNSA3IDQgOCA1IDkgMTAgNCA5IDEgNCA4IDYgNiA1IDkgNiBeCisxNyAxIDMgNCA4IDkgMSA1IDggMTAgNSAxMCAzIDggMSA2IDggOSA5IF4KKzE4IDAgOCAzIDYgMSAzIDEwIDMgNyA2IDUgOSAzIDEwIDkgNCA2IDEwIDUgXgorMTYgMSA5IDEgOSA2IDUgNyA3IDEwIDkgNiAxIDUgNyAxMCA4IDkgXgorMjAgMCA2IDQgMTAgMTAgNCAzIDkgOCAxMCAzIDMgNSAyIDEgOCAxIDMgMiA5IDkgXgorMTcgMSAxMCA2IDEwIDYgOCAzIDYgNyAzIDEwIDggNiA2IDQgNCA5IDUgXgorMTkgMSA5IDQgMyA0IDcgMyA4IDEwIDIgNCAxMCA3IDYgMTAgMSAzIDUgNyA5IF4KKzIxIDEgMiAyIDIgMyA5IDIgOCAzIDkgMyA3IDcgNCA5IDkgNSA0IDIgNiAxMCA3IF4KKzE3IDEgNSA5IDggOCA5IDEwIDkgMSA4IDMgMTAgMiA3IDIgMTAgNCA5IF4KKzIzIDAgNSA0IDEwIDQgMTAgNyA4IDMgMSAxIDMgNCAyIDEgMSAxMCAyIDEgNCAxMCAxMCAxMCA0IF4KKzE5IDAgOSAyIDUgNyA5IDYgNyAxIDggOSAxIDIgMSAxMCA4IDEwIDQgNyAxMCBeCisyMiAxIDIgNiA4IDggOSA3IDIgMSAzIDMgMTAgNiAyIDYgMiA2IDUgMiA1IDEwIDUgOSBeCisyMiAxIDggNyA4IDEwIDEgNiAzIDcgNCA1IDUgNSAxIDkgMiAyIDUgNSAyIDEwIDkgNCBeCisyMSAwIDEgMTAgMiA2IDEwIDkgNCAzIDMgNyAxMCAyIDkgNiAxMCAyIDEgNSA2IDMgMTAgXgorMjEgMSA4IDUgNyAxMCA1IDYgNyAzIDMgMSAyIDkgNCA4IDYgMyA5IDEgNyA3IDkgXgorMjIgMCA1IDUgNiA1IDIgMyA1IDMgMTEgNCA1IDEgMTAgNiA0IDExIDggMyA2IDUgNiA3IF4KKzIwIDAgMiAxIDkgOSAzIDYgMSA4IDExIDYgNyAxMSA2IDEgMTAgNiA3IDUgNSA4IF4KKzE5IDAgNCAxIDcgMTAgNCA4IDEwIDggMTAgNCAxMSA5IDYgMSA0IDUgNiAxMSA0IF4KKzE5IDEgOSAyIDQgMTEgMTEgMTEgNyAxIDEgNiA4IDEgOSA4IDUgMTEgNSA0IDEwIF4KKzIwIDAgOCAzIDEwIDEgNyA2IDEwIDggMiA5IDMgOCA2IDggOSAzIDcgNSAxIDExIF4KKzIyIDAgNCA1IDggNCAxMCA2IDUgNCA1IDMgMyA0IDEgNSA5IDQgMTAgOSA2IDcgMyAxMSBeCisyMSAwIDYgNSA4IDcgOCAxMSAyIDEgMTEgMTAgMyAzIDIgOSAxIDMgNiA5IDEwIDEwIDIgXgorMjQgMSAzIDEgMSA5IDQgMiA1IDcgMyAxMCAxMSA1IDYgNyAxIDcgNyA4IDcgMiAyIDcgNCA5IF4KKzIzIDEgOSA0IDYgMyA3IDUgMTAgOSA4IDkgMyAyIDEgNyAyIDIgNyA2IDIgOCAzIDYgMTAgXgorMjIgMSA3IDEwIDIgMTAgNSAxIDggNyA3IDMgOCA2IDYgOCAzIDIgMTEgNiAzIDQgNyA2IF4KKzIwIDEgMTEgMyA3IDIgMTAgMTAgNyA1IDIgNCAzIDUgMTEgMyAxMSA4IDkgNSA1IDEwIF4KKzE5IDAgNiAyIDYgOCA1IDkgNCA5IDEwIDkgOCAzIDIgMTAgMTEgMiA2IDExIDExIF4KKzIwIDEgOCAyIDQgMiA3IDMgOSA5IDExIDggMiAxMSA0IDggNCA4IDEwIDYgOSA4IF4KKzIxIDAgNiAxMCAxMCA3IDkgMiA1IDExIDkgMTAgNyAzIDEgNCA1IDQgMTAgMSAyIDggMTAgXgorMTggMSA4IDExIDYgMTAgOCA5IDExIDYgNyA3IDIgNiAyIDYgMTAgNiA5IDExIF4KKzIxIDAgNSAxMSAxIDYgOCAxMSA4IDEwIDUgMTAgMyA3IDggOSA5IDEgMSAxIDEwIDIgMTAgXgorMjUgMSA1IDEwIDIgOSA5IDkgNyAyIDIgNCA2IDEgMTEgNyAzIDMgNSA1IDIgMTEgMiA1IDUgMTAgMiBeCisyMSAxIDEgOCAxIDExIDYgOSAzIDYgMTEgNyAxMSA4IDYgOSA0IDQgMTAgNyAxIDggNyBeCisyMyAxIDcgNyA1IDExIDEgNCA3IDExIDExIDExIDkgMiAxIDMgOCAyIDggNyA0IDUgMiA1IDggXgorMjQgMSA0IDExIDUgMTAgNyA3IDkgNSAxIDUgNiAyIDkgMSA1IDcgOSA5IDExIDEgMSAzIDEgMTEgXgorMjcgMSAxMCA0IDYgOCA1IDcgMTEgNCAxMCA4IDYgNCAzIDQgNCAyIDEgMSAzIDMgMSAxMSAyIDMgNCAxMCA2IF4KKzIxIDEgNyAxMSAyIDcgMTAgMTAgOSAxMCAxIDMgMTAgNCAzIDExIDEwIDIgNSAzIDkgMTEgNCBeCisyMiAwIDcgOSAxMCA5IDUgMiA2IDYgOSAyIDcgNCA5IDggNCA5IDIgNSA5IDggMTAgMyBeCisyMSAwIDEyIDIgNiAxMiA3IDkgMyA1IDExIDYgMTEgMyA1IDQgNCAxMSAxMCAyIDEgMTAgMTAgXgorMjcgMSAxIDQgMTIgMiAxMCAxIDYgNSA1IDQgMSAxMCAzIDEgMTIgMyAyIDExIDUgMSA0IDYgNCA2IDExIDExIDQgXgorMjIgMSA4IDkgNCA4IDEyIDUgNSA5IDMgNSAyIDMgNCAxMiAxMiA4IDUgMyAxIDkgMTAgOSBeCisyNCAwIDUgMTIgOCA2IDIgNCAxMSAxMSAyIDcgMTEgOSA0IDUgMiAxIDggMyAxMCAyIDUgMiA4IDkgXgorMjEgMCAzIDcgNyA3IDUgOSAxMSA1IDkgMTEgMiA5IDcgNSA2IDExIDIgMTIgNCA5IDcgXgorMjYgMCA0IDQgNiA0IDcgMiA0IDIgNSA3IDIgNiAxMSA1IDkgOCAyIDUgMTAgMiAxMCA4IDggNSAyIDExIF4KKzIzIDEgMyAzIDIgNiA5IDEwIDUgNiA4IDUgOCAxMSAzIDYgMTAgNCA2IDkgMiAxMSAxMCAzIDEwIF4KKzI1IDEgMSAzIDEyIDMgNyA0IDUgNSAzIDggOSAyIDQgOCA3IDcgOSAxIDkgMTEgNCA1IDcgNyAxMCBeCisyMCAxIDExIDkgOCAxMCAxMSAxIDcgMTIgNiA3IDQgMiAxMiAxMiAyIDMgOSAxMCA4IDggXgorMjAgMCAxMiAxMSAxIDQgMTAgNiAxMCAzIDkgNyAxMiA0IDExIDggNCA2IDEyIDQgNyAxMiBeCisyNCAwIDggNiA0IDggMiAyIDkgMiA5IDYgMyA2IDMgMyAxMCAxMiAyIDcgOCA3IDggMTIgMTAgNyBeCisyNiAwIDUgMTEgMTEgNyAzIDMgOSAxMCAzIDkgMyAzIDcgMiA5IDkgMSAyIDQgMTIgMiA1IDUgNiAxMCA0IF4KKzIyIDEgMTIgOSAxMCAxMCAxMiAxMiA3IDggMiA3IDEgNiA4IDIgOCA3IDYgMyAxIDEgMTIgMTIgXgorMjIgMSAxMSAxMCAyIDExIDEwIDggMSAyIDggMTIgOCAzIDkgNSA3IDkgOCA3IDExIDEgMTAgNCBeCisyMiAwIDEwIDEgOCA2IDEyIDIgMTEgNyAxMCA0IDEwIDYgNSA3IDEwIDExIDMgMyA4IDggNCAxMiBeCisyNiAwIDggNSA1IDEyIDEgOCA2IDcgNiAxMSA4IDEwIDQgMyA3IDYgMSA1IDEgMSA5IDEgNSA4IDkgMTIgXgorMjEgMCAxIDEyIDQgMTEgMTIgOSAyIDEyIDEyIDMgMTIgNSA0IDEyIDQgMSA1IDggMTIgOSAxMCBeCisyNiAxIDUgMyA4IDEgMTEgNCA3IDMgMyAxMCA0IDkgNiA2IDQgMyA5IDExIDEgMyA3IDEwIDcgOSA2IDExIF4KKzIzIDAgNyAxMiAzIDUgOCA5IDcgMTAgOCAxMSAxMCAxMSA2IDEgOCAxIDEgNiAzIDkgOCAxMiA2IF4KKzI1IDAgMSA1IDUgNiA1IDEyIDEgMSAxIDExIDkgOSAzIDExIDkgNiAxIDExIDMgMSAxMiA4IDExIDExIDEwIF4KKzIyIDEgMTAgOSA3IDMgMTAgMiA2IDQgMTEgMyAxMSA2IDQgNSA1IDExIDEyIDkgNyA4IDEyIDkgXgorMjIgMCA4IDUgMTAgNyAxMiA4IDMgNCA0IDUgOCA5IDEyIDYgOCAxMCA2IDcgMTEgNCA4IDEwIF4KKzI2IDAgMyA1IDMgMTEgMTEgMiAxIDkgMSAxMCA0IDQgNiA5IDQgNyA2IDUgMTAgMTAgMSA4IDkgOSA2IDEyIF4KKzI0IDAgMTIgMTEgNCAxMCAxIDMgNyA1IDExIDkgMTEgNyAyIDExIDUgNCA3IDggMSA2IDEyIDcgNCA5IF4KKzI4IDAgMSAxMiAxMCAyIDIgMiA0IDkgMTEgNCAxMSA3IDIgNCAzIDExIDcgMTAgNSAxMCA1IDUgMyA1IDIgNyA1IDkgXgorMjYgMSA0IDEgNCAyIDEzIDYgMTEgNSA2IDggNSAxIDUgNiAzIDggMSA1IDggOSA5IDEwIDEyIDEzIDEyIDIgXgorMjYgMCAxMiAzIDEgMTEgMiAxMiA2IDggNiA4IDExIDQgMTEgMTAgOSA2IDMgMyAyIDIgMiAxMyAyIDEgMTMgOSBeCisyMiAwIDMgMyAxMiAxMyAxMyA3IDEyIDIgOCAxMSA5IDEwIDEwIDEgMSAxMyAxMSAxMyA0IDEgMTEgMyBeCisyNiAxIDIgNiAyIDggMTIgMyA3IDEyIDggOSA4IDMgMTIgNyA0IDkgMiA2IDQgOSA5IDQgOCAyIDQgMTIgXgorMjQgMSA4IDExIDExIDMgMTMgMiAxMCAzIDEwIDggNiA2IDQgNCAxMyA0IDIgNCA4IDEgMTEgMTIgOSAxMCBeCisyOSAxIDEgMiA1IDEgMSAxMCAzIDIgNCA5IDExIDggMiA1IDIgOCAxMCAyIDEwIDExIDcgOCAxMiA2IDEgOSA4IDQgMTIgXgorMjMgMCA2IDEyIDcgMTAgNyA3IDEzIDIgMiA3IDEwIDIgOCAxMyAxMCA3IDExIDIgNSA5IDExIDEzIDEgXgorMjUgMSAzIDExIDIgMTAgNSAxMSA1IDcgMTAgOCAxMCAxIDEwIDMgMTEgNyA5IDUgMyAzIDQgNSAxMyAxMiA4IF4KKzI2IDEgNSAxMyA5IDQgMyAzIDQgMyAxMyAxIDYgMTEgMTAgOCAxMyAzIDQgMTEgOSAxIDkgMSA3IDggNyAxMSBeCisyMiAxIDEgMyAxMyA4IDExIDMgNCAxMCAxMCAxMiA3IDIgMTEgNCA3IDcgNiAxMyAxMyA5IDEzIDExIF4KKzI2IDEgNyA5IDcgOCA5IDkgNSAxIDEzIDMgMyA0IDkgMiAxIDggOSAzIDkgMTIgOCAxMCAxMCA2IDExIDMgXgorMjMgMSAzIDggMTIgOCAxMCA0IDMgOCA1IDUgNyAxMSAxMyAxMSAxMiAxMSA0IDEyIDMgNiA1IDExIDggXgorMjcgMCAzIDEwIDkgNiA5IDcgMiAxMCA0IDQgNSA1IDIgMTIgMTMgNSAzIDEgMTAgMSA0IDcgOCAxMyAxMyAxMiAzIF4KKzMwIDAgMiA2IDUgNCA3IDMgMTAgNiAxMyA2IDMgOSA2IDIgMTAgNSAzIDggNCAxIDExIDMgNSAzIDcgMTEgMSAxMiA5IDcgXgorMjkgMCA1IDIgMTMgNiA1IDIgNiAzIDIgOSA1IDMgNiA2IDQgMTAgMiA0IDcgNyAxMCAxMyA5IDYgMTAgNiA1IDkgOCBeCiszMSAxIDkgOCAyIDcgMyA1IDExIDMgNyA3IDUgNiAyIDEgMSA2IDIgMTEgNSA0IDUgNyA5IDEgMTEgMTAgMiAzIDkgMTIgMTAgXgorMjggMCAxMSAxIDQgMSAxMiAxMCA1IDUgMSA3IDIgMyAxMCA3IDEyIDkgMiA4IDIgNiAxMCA1IDEyIDEyIDQgOSAyIDEzIF4KKzI2IDEgMTEgOSA4IDEyIDQgMTIgNyAzIDQgNCA2IDEgMiA3IDEyIDQgNiA4IDEwIDExIDExIDEgMTAgMiA5IDEyIF4KKzI4IDAgMTAgOSA3IDEwIDEgMTAgOSAxMiA3IDEwIDcgNiA2IDUgMyAyIDMgMSAzIDEyIDEgNCAxMyAzIDkgNyA5IDggXgorMjcgMSA0IDExIDEgNSA2IDkgMTIgMTIgMTMgMTMgMTMgMSAyIDEzIDEgMiAxIDEyIDEyIDMgMiAyIDggMyAxMyA3IDcgXgorMjkgMCA2IDUgNSAyIDQgMiAxMSA0IDQgMTMgOSAxMyA3IDMgMTIgOCAzIDcgNiA0IDEyIDMgMSA4IDExIDEgNiAxMyA2IF4KKzIzIDEgMTEgNiA2IDExIDcgMTMgMTEgNiA3IDQgNCAxMiAyIDEzIDUgMTIgNSA3IDkgNiAxMSAxMSAxMSBeCisyMyAwIDExIDEzIDExIDcgNCAzIDYgMTIgMTMgMTAgMTEgNSAxMiAxMyAxMSA2IDEgMSA0IDcgMTMgMTAgNyBeCisyNyAxIDcgNSAxMyA1IDQgOCA3IDMgOSA2IDcgMTEgNyAxIDkgMyA4IDUgOCA4IDIgMTMgMTMgOCA1IDEzIDQgXgorMzAgMSAyIDUgOCA0IDEzIDEwIDYgNCAyIDYgMSAxIDEyIDQgMTMgNSAxMCA0IDEwIDggNSA3IDEgNSA1IDEyIDQgOCA2IDEyIF4KKzI4IDEgMTIgMSAxMiAxMSAxMCAyIDMgMTAgMSAyIDYgMTEgMTIgOSAxMSAxMiAyIDEgOSA0IDEgNSA3IDIgMTIgMTEgNCAxMSBeCisyOSAwIDYgOCA3IDggOCAxMiAyIDcgNCAxMiAxMSA1IDUgMyA1IDEzIDQgMTEgOCA4IDkgMiAyIDEgNiAyIDggNiAxMiBeCisyOCAxIDcgMTMgNSA3IDExIDMgMSA5IDIgNSAxMiA4IDYgMiA1IDkgMTAgMTAgMTEgNCA1IDEyIDUgNCA2IDUgNiAxMyBeCisyNSAxIDE0IDQgOCAyIDkgMTEgNyA0IDMgMiA4IDE0IDYgMTQgNyAxMyA1IDUgMTQgNiA1IDExIDYgNiAxMyBeCisyNiAxIDMgNSAxMiAxIDExIDEzIDEgMyAzIDEwIDExIDUgNiAxMiAxMSAxMiA3IDE0IDQgMyA2IDYgMTAgMTEgMTQgNCBeCisyNyAwIDQgMiAzIDEwIDcgMTIgMTMgOCA4IDEyIDEwIDEzIDEgNyAxMCAyIDcgMiAxMyAxMCAyIDMgMyA2IDQgMTMgMTQgXgorMjQgMSAxMSAxIDkgMTQgNCAxNCAxNCA4IDEwIDEzIDQgMyAyIDcgNiA2IDggMTQgNSAxMSA3IDE0IDE0IDEgXgorMjIgMSAxMyAxMyAxMCA5IDEzIDggMTQgOSAzIDE0IDMgMTEgOSA5IDEyIDEzIDIgMTAgMSA1IDggMTIgXgorMjUgMCA5IDEwIDkgOCA0IDE0IDYgOSAzIDEzIDEwIDExIDMgMSA0IDYgMTAgMyA0IDMgMTIgMTIgMTQgMTEgMTMgXgorMjYgMSAxMSA4IDExIDcgOCAxMCA5IDEyIDExIDYgMTAgNiAzIDkgOSAxIDcgNSA2IDcgNyAxMiA0IDUgOCAxMSBeCisyNiAxIDEyIDEwIDggMTQgNyA0IDEzIDEzIDggNCA1IDMgMiA0IDcgMTQgMyAxMCA2IDkgMTMgOSAyIDEgOSAxNCBeCisyOCAwIDYgMTIgMiA0IDcgOCAxMSAxMCAxMiAyIDE0IDMgMSAxIDEgMTIgNSAxMyA5IDEyIDUgOSAxMCA1IDEgMTIgMTAgOCBeCisyOSAxIDIgNiA1IDE0IDE0IDMgNiAxMyAxIDIgNiAyIDEyIDEgMiAxMCAxIDQgNSAxNCAxMCAxMiAxMSAyIDMgMTQgMTQgMTIgNSBeCiszMCAxIDUgMiAzIDUgMTEgMTIgMyA3IDEyIDcgOSA4IDMgMyAxNCAxMCA1IDIgOSAzIDggNiAxMSA4IDcgOCAxIDYgMTIgNyBeCisyOCAxIDE0IDUgMiAxNCA3IDggMSA1IDQgMTIgOSA2IDEyIDEgMSA3IDkgNSAxNCAxMSA5IDQgMSAxMCAxIDE0IDEwIDEyIF4KKzI3IDAgNyAyIDggNSAzIDE0IDggOSA0IDYgMTEgMyAxMSA2IDEyIDEgNyAxNCA5IDE0IDYgMTAgNiAxIDggMTQgMTAgXgorMjYgMSA2IDE0IDIgMiAxMiAxMCA1IDEwIDEwIDggMyA3IDEzIDEwIDEgMTQgMSAxNCA3IDExIDEyIDkgMSA4IDggMTIgXgorMzAgMCA2IDEzIDUgMTMgMyA1IDggOCA4IDIgNSA1IDQgMiAxMyAxNCA3IDIgMTIgMTIgMyAzIDUgNyA1IDExIDMgNyAxMyA3IF4KKzI2IDAgMTMgNyAyIDggNCAxMCAxNCAyIDcgMSAxMCA4IDExIDExIDIgMTMgOSAxMSAyIDkgMTEgNyAxMyAxMSAyIDE0IF4KKzMxIDEgNyA3IDggNSAxMyA0IDEgMTIgMTQgMSA5IDExIDMgNSAzIDEzIDExIDcgMyAyIDkgMSAzIDEzIDYgMyAxMCAxMiAxIDEzIDMgXgorMjMgMCA5IDggOCA3IDE0IDEzIDYgMTMgMTQgMTIgMTMgMTIgNyA0IDE0IDEwIDEgMyA5IDcgMTEgMTQgNSBeCisyNyAxIDEgMTAgNCAxMiA0IDExIDUgMTMgMTMgNCAxMiAxMyA3IDEyIDEyIDQgMTMgNiAyIDcgNSAyIDggNyAxMyAxMiAzIF4KKzI2IDEgNyA2IDExIDEyIDE0IDEyIDMgMTIgOCA3IDQgOSAxNCAxIDggMTEgNiA1IDEwIDEwIDYgOCA1IDIgMTEgMTQgXgorMzMgMSAxIDExIDEgNSAzIDggMSAxMiAxNCA1IDEgMyA3IDIgMyA5IDMgNCAxNCA0IDQgMTAgOCA1IDE0IDEgMTEgMTIgMTIgMTAgNCAxMyAKKzIgXgorMzIgMCAxMSA0IDQgOSA1IDUgOCA5IDUgMTAgNCAyIDQgNyA5IDkgNiAzIDUgMSA4IDMgMiAxMyAzIDE0IDkgOCA5IDEwIDE0IDUgXgorMjggMCAxMiA5IDUgOCA3IDIgMTQgMTIgMyA4IDE0IDYgNiA0IDcgNSA3IDEwIDcgMTEgMTAgMSA5IDYgNyAxMiA4IDkgXgorMjUgMCA5IDkgMiAxMSAxMyAxMiAxMSAxMSA2IDE0IDEzIDEwIDUgNiA4IDEwIDQgMyAxMSAxMSAxNCA1IDUgMTAgNyBeCiszMCAwIDEzIDkgMTQgMTEgNCA4IDEyIDkgNSA5IDEgMiA5IDEzIDEyIDYgMSAxNCAxMSAxMCA3IDggNiAxIDQgMyAyIDIgMiAxMyBeCiszMyAxIDEzIDUgOSA2IDEzIDkgMSAxMyAyIDYgOCA5IDEgMyAxMiAxMyAzIDQgNCAxMiA1IDIgMSAxMiAxIDYgMiAxIDggMiAxNCAxMyA5IAorXgorMzIgMSA4IDYgNyAxIDQgNCA2IDEgMTMgMyAzIDEgMTMgNyA2IDExIDYgNCA5IDEwIDQgOCAxMyAxIDkgMTAgMTIgNyAxMCAxMSAxMCA1IF4KKzMwIDAgMTIgNiA2IDMgNCAxMyAxIDQgMTEgMTAgMiA2IDE0IDYgOSAxMiA2IDIgMiAxMSA5IDEzIDQgNyA5IDE0IDIgMTEgOCA3IF4KKzI2IDEgMiAxMSAxMyAyIDkgMTEgOCAxMSAxMSAxNSAxMyAxMyAzIDE1IDIgMTIgMSAxNSAzIDggNCA5IDEzIDEgMTMgNyBeCiszMiAxIDkgNiAxIDIgMiAxIDE1IDMgMTUgMSAxMCAxIDQgMTEgMTQgMTQgNiAxMCAyIDUgOSAxMCAxMCA5IDEgMiAxNCAxMCAxMiAxIDEgCisxNSBeCisyOSAxIDEzIDIgMyA4IDEyIDUgMTQgOSA4IDkgMiAxNCAxIDQgNiAxNSAxMCA5IDIgNyA5IDQgOCA3IDkgMTAgMTEgMTEgNSBeCiszNCAxIDEyIDIgNyAyIDEyIDggMiA4IDYgMyAxMiA0IDQgMTAgMSAxNCAxMiAxMSA1IDE1IDMgMyAzIDE0IDEzIDIgMiAzIDggMiAxIDggCis4IDggXgorMzEgMCA2IDIgNyAxMCAxIDEzIDEwIDYgNiA2IDIgOCA3IDYgNyAxNCAzIDEyIDYgOCA5IDMgMTEgMSAzIDEwIDEyIDExIDExIDkgOSBeCisyNCAxIDEzIDE1IDQgNyAxMSAxMyAxMCAxNCAxNCAxMyA0IDExIDUgNiAxMSA4IDEyIDEzIDkgMSAxMCA5IDEwIDcgXgorMzMgMCAzIDEgMyAzIDQgMTMgMSA2IDE0IDggMyA0IDMgMiAxIDE0IDE0IDE0IDUgMTMgMTMgMTEgMTAgMTMgNCAzIDEwIDExIDMgNiAxIAorMTAgNyBeCisyOCAwIDcgOSAxMyA5IDE1IDIgNCAxMiAxMCAxMCA0IDEyIDMgOCA1IDYgMTMgMSA2IDE1IDEgOCA5IDYgMTIgMTEgNyAxNCBeCiszMiAxIDMgMSAxMyA2IDQgMSA5IDQgNSA3IDEgOCA4IDExIDEwIDUgMTUgMTQgMiA4IDE0IDkgNyAxMiAyIDQgMTMgNyA0IDMgOSAxNCBeCiszMSAxIDE0IDEyIDEzIDggNCAxMiAyIDYgNSAxMiA5IDMgMTEgOCA1IDEzIDUgMTAgNSAyIDMgNyAxMiAxNCA0IDEgNyAzIDYgOSA5IF4KKzMyIDEgMTAgMTUgNyAyIDEzIDUgNyAyIDUgMiAxMCA3IDExIDUgNSA5IDggMiA5IDMgMyA2IDMgMTMgMTAgMyA1IDcgMTUgMTEgMTAgMTIgCiteCiszOCAwIDIgMyA3IDEgNiAzIDMgMTIgNSAyIDkgNCA1IDExIDIgMSA3IDYgMTQgNyAxNCAxMCA0IDExIDYgMyAxMSAyIDEwIDYgNCA4IDEgCis0IDkgNCAxNSA0IF4KKzI3IDAgNyA3IDQgMTQgMiAzIDE0IDE1IDEwIDcgMTIgNyA1IDggNyAxNSAxNSAxNCAxMCAyIDMgMSAxMCAxMiAxNSA5IDkgXgorMzEgMSAxNSAzIDkgOSA1IDQgMiA2IDE0IDQgOSA1IDEyIDggMSA2IDEgNCA4IDcgMTAgMTQgMyAxMCAxNCA4IDExIDkgOCAxMCA5IF4KKzI4IDAgMTQgMTEgOCAzIDUgNSA3IDIgMTEgNCA0IDQgNiAxNCAxMyAxMCAxNCAxMCAzIDkgNiA5IDcgNSAxMCAxNSAxNSAxNSBeCiszMCAxIDggMTMgNCAyIDEzIDYgNCA3IDQgNCAxNSAyIDIgMTIgMTMgMyAxNCAxMiA3IDExIDYgMiAxNCAyIDYgNiA5IDE0IDEzIDEyIF4KKzI3IDEgMTMgMTQgMTUgMTIgMTQgNSAxNCAxNSAxMSA0IDEgMSA5IDUgMTMgMTAgNiA1IDUgNiAxNCAxMyAxIDUgMyAxNCAxMyBeCisyOSAwIDQgMiAxMyAxMiAxNSA3IDMgMTUgNSAxIDYgNyA2IDEzIDEgMTQgMTEgOSA1IDE1IDYgMTMgMyA2IDExIDcgMTUgOCA5IF4KKzMxIDAgNSA0IDQgMTQgMyAxMyA4IDEzIDMgNyAxMyA3IDkgMTIgMyAxMSAxNSAxMSA1IDE0IDEgMyA0IDEwIDEyIDcgMTIgMSAyIDEzIDQgCiteCisyOCAxIDEyIDcgMTMgMTQgNyA3IDEgOSAxMyA4IDUgMTQgMiA1IDkgOSAxNSA5IDEzIDcgOCA5IDggMSAxMiAzIDkgMTUgXgorMzQgMSA2IDEyIDQgMTQgMTIgNSAzIDE1IDQgNCA2IDggMiAxMSA4IDQgMiA1IDEgMTUgMTUgMSAxNSAyIDExIDQgMTAgOSA0IDcgMyAyIAorMTUgNiBeCisyNiAwIDE0IDUgNiA1IDExIDEyIDE0IDEyIDEyIDExIDE1IDIgMTQgOSAxNSAxIDcgMTIgMTEgMTIgMTMgMTQgMSAxIDEyIDUgXgorMzIgMCAyIDIgNCA1IDIgMTEgMTIgNSA0IDEyIDkgMTQgNSA1IDggNiAyIDE1IDE1IDYgMTMgMTEgMyA1IDE1IDUgMTEgMyAxMiA3IDEwIAorOCBeCisyNiAxIDIgMTUgMTQgOSAxNCA3IDYgMTUgOSAzIDQgOCA4IDEyIDE0IDIgOSAxMSAxNCA2IDExIDE1IDEwIDggMTQgOCBeCiszNCAxIDE1IDcgNCA1IDEwIDEgMTMgNyAxIDEgOCAzIDEzIDExIDIgOCAxNSAxMSAxMiA2IDYgMSAzIDIgMiAxMSAzIDEzIDkgMTAgMyA2IAorMTIgMTUgXgorMjUgMCAxNSA3IDEwIDIgMTAgMTUgNSAxMCAxMyAxMiA4IDE1IDMgMSAxMSAxNCAxNSA4IDE1IDEyIDkgNiA4IDEzIDEzIF4KKzI3IDAgMTAgOCAxMyAxMCAxNSAxMyA1IDggNCAxMCAxMCA2IDcgMTMgNiAxMiAxMiA5IDEyIDIgNSAxMCAxMiAxMCA4IDE1IDYgXgorMjggMCA1IDMgOCAxMiAxNSA4IDE0IDE1IDkgMTIgMTIgMyAxMCAxMyA2IDExIDEwIDQgMTMgMTQgOCA5IDEgOCAxIDUgMTEgMTIgXgorMjkgMCA5IDEyIDQgMTMgMTUgNSA5IDExIDcgMTQgMTEgMSAxMSA3IDggOCAxMSAxIDEzIDE1IDEyIDEgNSA4IDMgOCAxMCA3IDE0IF4KKzMwIDAgMSA1IDEzIDEyIDE0IDUgMyA2IDQgMTIgMTUgNiA2IDEwIDExIDEzIDkgMSAxMSA2IDEwIDMgNyAxNCA0IDE0IDExIDcgOCAxMyBeCiszNCAxIDEgMTIgNSAxIDcgNCA2IDcgNSAxMSAxIDQgNyAxMiAxMCAxMCA4IDE1IDEzIDQgMTEgMTUgMTEgNiA5IDEgMiAxNSA1IDEgNSAKKzEyIDYgMTMgXgorMzUgMSAxMiAxNSA0IDExIDEzIDMgNiA1IDEwIDggMSAzIDkgMyAxMSAxIDIgMTYgMTIgMTAgNiAxIDkgMSAxNiA1IDYgMTUgMSAxMiA0IAorNCAyIDE1IDQgXgorMjcgMCAxNSAxMSAxNSA1IDExIDkgNyAxNSAxNiA2IDE2IDEyIDMgMiAxMCAxNiA1IDUgNyAxIDcgMTEgMTMgNyA5IDExIDEyIF4KKzMxIDEgNSA1IDUgNCAxMyAxMyAxNCA0IDcgMTIgNiA0IDggMiA5IDkgMTMgMTMgMyAzIDYgNyAxNiA3IDYgMTUgNSA4IDE1IDYgMTUgXgorMzAgMSA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAyIDcgOCAxNiAyIDEyIDE2IDEwIDE0IDcgXgorMzYgMSAyIDMgNyAxNCA2IDkgNCA0IDUgOSA3IDEyIDMgOSAyIDUgMSAzIDEwIDExIDExIDYgMTIgNyAxIDcgMTIgMiAxIDIgOCAxMiAxNSAKKzE2IDkgMTMgXgorMzQgMSA2IDMgMTIgMTEgMTYgMTUgOCA4IDggMTQgMTMgNyA3IDggMiA3IDYgMiAyIDE0IDcgMSA0IDIgNCAxMSAxMSA1IDcgMiAxMiAxIAorMTQgMTEgXgorMjkgMCAxMiAxMSAyIDkgOCA1IDYgMTQgMTAgMTIgNSAxMSA1IDMgMSAxMyAxNSA5IDEyIDExIDEzIDQgMTQgNSAxNiAzIDUgMTMgMTUgXgorMzAgMSA1IDE2IDExIDIgNiAxMyAxNiAzIDYgNCA5IDEwIDkgOCA2IDE0IDggOSA1IDEzIDYgNSAxNCAyIDggMTUgOCA3IDE0IDExIF4KKzI4IDEgMTQgMTAgMTMgMTMgMTEgMTAgMTMgOSA4IDQgMTEgMTQgMTEgNiAxMCAxMCAxIDkgMTMgMTYgNSAzIDQgNyA5IDEyIDEwIDggXgorMzYgMSAxMCAxNSAxMiA4IDggMTAgMTMgNSA2IDExIDQgNiAyIDMgNSA2IDExIDEgMSA4IDYgMTMgMTUgNiAzIDE1IDUgMTAgMSA2IDIgNSAKKzIgMTEgMTAgMTAgXgorMzEgMSA0IDE0IDcgMiAxNCAzIDEgMTIgNyAxNSAxMyAxIDUgOSA4IDMgMyAxNCAxMiAxMyAyIDE1IDEyIDcgMTYgMTIgMyA4IDExIDUgCisxNSBeCiszNCAwIDEwIDIgMTAgMTYgNCAxNiA3IDggMSAxNiA2IDE0IDkgNSAxMiAxNiA4IDkgNCA0IDQgMSA3IDEzIDEwIDEgNyAxMCA1IDcgNCAxIAorNSAxNSBeCiszMCAwIDE2IDMgOCA3IDMgOCA4IDExIDggMTMgNCAxNiA4IDE2IDEgNCAxNiAxMSA0IDEyIDEgMTQgNSAxIDE2IDExIDggMTQgMTIgOSBeCiszMyAwIDcgOSA5IDE2IDExIDcgNiAxIDExIDE0IDEyIDE0IDEwIDkgMTEgOCAxMSA3IDUgMTAgMTUgMiA2IDkgMyA5IDQgMiAxIDEgOSAKKzE0IDYgXgorMzIgMCA1IDggMTQgMTUgNCAxIDYgMSAxMCA4IDEgMTUgMTUgMyAxMCA3IDggMTAgMTIgNCAzIDExIDE1IDggNSAzIDMgMTYgMTUgNyAxNCAKKzEzIF4KKzM2IDAgMyAxMCAxMiAyIDExIDkgMiAxIDQgMyA4IDEwIDE0IDIgMTEgMyAyIDQgMTUgMTQgNSAyIDggMTYgMTYgMSA1IDcgNSA5IDUgMTUgCis5IDExIDMgMTQgXgorMzEgMSA1IDQgMTQgNCA4IDMgMyAxIDEwIDQgMTUgMTUgMTMgMiAxMyA5IDcgMTMgMTEgOSAxIDE1IDE1IDE1IDE2IDcgNyA2IDUgMTMgOSAKK14KKzMwIDAgMTQgMTYgMTIgMSAxMSAxMSA3IDMgNyAzIDMgMTMgNCAxMyAxNCA1IDE1IDEyIDUgMTQgMTYgMTQgNCA1IDkgNiA2IDMgMTYgMTEgCiteCisyOCAxIDEwIDE2IDEwIDE0IDEzIDYgMTYgMTQgMyAxNCAxNSA3IDEzIDEyIDQgMSA4IDQgMTAgNiAxIDEzIDYgMTQgMTEgMyAxNiAxNCBeCiszMyAwIDE1IDExIDEzIDggMTEgMSAxNSAyIDEwIDkgOSAxNCA4IDEzIDIgMTMgOCAxIDIgMSAzIDEyIDggNSA0IDExIDEwIDE0IDggOSA0IAorNSAxNiBeCiszNCAxIDEyIDEyIDYgNyAxMyAxMyAxMiAxIDEzIDE0IDEgMSA2IDMgMTMgMiAxNiAzIDEgMTYgOSA5IDE1IDMgMTMgMSA4IDMgMiA2IDEyIAorOCA5IDEzIF4KKzI3IDAgMTEgMTIgMTUgMTQgMTIgMTAgOCAxNSA5IDE1IDIgNyA1IDExIDggOSA3IDE2IDYgMTUgNCAxNSA3IDExIDE1IDQgMTQgXgorMjkgMSA5IDEgMTQgNyA0IDE0IDE2IDExIDEwIDExIDEyIDE0IDYgMTIgMTEgMTUgNyAxNCAzIDE1IDYgMSAxMiA1IDEyIDEzIDMgNiAxNCAKK14KKzI4IDAgNiAxMCA3IDcgOSAxMCA3IDExIDEyIDE2IDkgNiA5IDE0IDEwIDEwIDIgNyA0IDE1IDE2IDEzIDExIDggMTAgMTUgMTAgMTUgXgorMzIgMSA4IDEyIDEgMTAgMyA3IDE1IDE0IDkgMTYgMTQgMSAxNSAzIDE0IDkgMiAyIDEyIDE0IDcgMyA1IDE0IDUgMTUgMTAgMiAxNCAxIAorMTUgOCBeCiszMyAwIDkgMTYgMTAgMTYgNiAxMyAxIDYgMiA4IDEzIDUgNyAyIDE1IDExIDEyIDYgOCA3IDEgNSA4IDEzIDkgNCA4IDEyIDkgMTUgMSAKKzEwIDEzIF4KKzMwIDAgMTAgNCAxNiA0IDEzIDEyIDIgNCAxNCA2IDExIDMgMTUgOCA0IDEyIDMgMTEgMTYgMTYgMTYgMiAxMyA3IDEwIDIgMTMgMTAgMTUgCisxMCBeCiszMyAxIDE2IDIgMTUgMTAgNCAxIDEzIDEyIDEyIDkgMTIgNyAxNiA0IDEyIDQgMiAxNiA0IDkgMTYgOCAyIDYgMTUgMiAzIDQgOSAxMiA2IAorOCAxMiBeCiszNCAxIDEzIDExIDExIDQgOSAxMyAxNCAyIDkgNiA4IDYgMTAgMTEgOSAzIDEyIDkgMTMgNCAxMCAzIDUgMSAxNCAxMSAxMSAxNiAxIDIgCisyIDExIDYgMTQgXgorMzMgMSAxNSAxMiA2IDUgMTYgMiAxNCAyIDEwIDEyIDIgNSA1IDYgMTAgMTMgMTIgMyAxMCA4IDE2IDkgNSAxMiAxNSA0IDExIDEzIDMgNiAKKzUgMTAgOCBeCiszNSAxIDEgMyA5IDMgMTEgMSAyIDE2IDEyIDEwIDYgMSA5IDEgMTYgNSA2IDE1IDEgMTIgNCA0IDIgMTUgMTMgMTUgMTEgMTUgNSAxMSA5IAorNyAxNSAxNiA0IF4KKzM2IDAgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxMyA3IDkgMTEgMiA1IDUgNSA0IDEzIDEzIDE0IDQgNyAxMiA2IDQgOCAyIDkgCis5IDEzIDEzIDQgXgorMzUgMCAzIDYgNyAxNiA3IDYgMTUgNSA4IDE1IDYgNCA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAKKzIgNyAxNiBeCiszMSAwIDcgNCA4IDE3IDE2IDE2IDExIDE0IDIgMTAgMTQgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAxNiAzIDIgMyA4IDMgMTIgOCAxMSAKKzE3IDIgXgorMzAgMSA5IDcgMTYgMTQgNCAxMSAxNSA1IDEzIDkgNSAxMiAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIDkgOCAxMCAxMyA2IF4KKzI3IDAgMTEgMTcgMTIgNSAxNCA5IDExIDkgMTEgNCAxMSAxMyAxNiA2IDEwIDUgOCAzIDE3IDE2IDE0IDEgMTUgMTUgMTUgNiAxNyBeCisyOSAxIDIgMTEgNiAxMyAxMSAxMyA0IDYgNyAxMSAxMSAxMiAxNiAxMyAxIDE2IDE2IDE0IDE2IDIgNCAxNiAxMSA2IDE1IDcgNCAxNyAKKzExIF4KKzMyIDAgNSA3IDYgMyAxNCAxNiA1IDE3IDExIDEzIDEgMSAxNCAxMyAzIDYgMTQgNSAxNyA1IDQgOCAxNCAzIDE2IDcgMTMgNCAxNCA4IDkgCisxNyBeCiszMSAxIDggMTIgOCAxNSA5IDYgNiAxIDUgMTMgMTYgNSA4IDQgNiAxMCA2IDExIDE2IDE3IDE1IDE1IDEyIDQgMTMgNSAzIDQgMTAgMTUgCisxNiBeCiszMyAwIDcgMTUgMTYgMTIgMTIgMTEgOCAxMyAxNCA1IDggMSAxMSAxMCA5IDMgMTQgMyAxIDkgNiAxNSAxMiAxNiA0IDUgOSA3IDEgOSA0IAorOCAxNyBeCiszNiAxIDcgOSAxNiAxMSAxMSA2IDEzIDcgMSA3IDggMSAxNCAxMiAyIDcgNCA1IDE1IDE2IDEyIDMgMSA2IDExIDQgMTUgOCA5IDkgMiAxIAorMTMgMiAxNCAxNCBeCisyOSAxIDYgOCA4IDE1IDEzIDEzIDEwIDIgMTYgMTIgMTcgNiA3IDE0IDEzIDEyIDEzIDMgMTQgMTIgMTIgMiAxNSAyIDUgMTUgMTAgNyAKKzE1IF4KKzM4IDEgNSAxNSA3IDggMTAgMTAgMSAxMSAyIDQgMyAxMSAxMSAzIDUgMiAzIDExIDUgMTIgMTIgOCA2IDIgMTcgMTUgNiAxNiAxNSA0IDMgCisxNCA2IDMgMiAxMCA1IDE1IF4KKzMwIDAgMTIgMTEgMTUgMTQgMiAxNiAxNCA3IDYgMTUgOSAzIDExIDggOCA1IDE2IDIgMTYgMiAxNiA2IDkgNiAxMiAxMCAxNiA3IDE1IAorMTAgXgorMzYgMCAxMSA1IDMgMTYgMSAxNSA3IDEwIDE3IDEwIDEwIDEzIDIgMiAxNyA2IDIgNSA2IDYgMTAgMTIgMiA5IDExIDEyIDYgMSAxIDggCisxMiAyIDYgMTYgMTIgMTYgXgorMzAgMSAxMCAxNyA1IDEgNiAxNCAxNyA4IDEyIDEwIDExIDE2IDE1IDEgOCAzIDkgMTMgNyA3IDE2IDggMTMgMTEgMTAgOCAxNSAzIDE1IAorMTIgXgorMzEgMSAxNCA4IDQgMTIgMSA2IDUgMTMgMTUgMyA1IDExIDE0IDExIDE0IDE3IDUgMTAgMTcgNyA4IDEzIDUgMTIgMTUgMyA2IDE3IDcgCisxNyA3IF4KKzMxIDAgMTIgMyAxMCAxMCA0IDEzIDEzIDggMTEgMTMgNyAxNyAxMSAxIDEwIDEgNSAxMSAxMSA5IDE0IDEzIDE1IDggMTQgMiA3IDE2IAorMTEgOCAxNSBeCiszMiAxIDcgMTYgMTcgMTcgNCAxIDEzIDE1IDUgMSA1IDYgMTQgMTUgMSA1IDEgOSA5IDE3IDEyIDEzIDEyIDcgMTIgMyA3IDE1IDQgMTYgCisxMiAxMyBeCiszNiAwIDggMTcgMSAxMSA0IDEwIDIgNiAxMCAzIDE2IDE2IDIgNyAxMyA5IDE1IDcgMTcgMTQgMyAxMCAxNiAxMyA2IDcgNSAyIDEgNCAKKzE2IDMgMTAgMSAxNSA1IF4KKzMyIDAgNCA2IDQgMTUgMTEgNCAyIDE3IDkgMTUgNSAxMCA3IDEyIDE1IDE2IDE1IDE3IDEyIDE0IDkgMiAxMyA0IDkgMiA0IDE1IDIgMTEgCis5IDE2IF4KKzI5IDAgNCA0IDMgMTcgMiAxNCAxNyAxNyAxIDE3IDEzIDExIDE1IDE3IDQgOSAxNSA4IDExIDE2IDkgMTAgOCA5IDEyIDE1IDEgMTcgMTEgCiteCiszNSAwIDE2IDQgMiAxNCAxNCAxNSAxIDIgMTIgOSAxIDEwIDE2IDEwIDExIDcgMSAxMiAxNyA4IDIgMTUgMTEgMSA3IDE3IDEyIDcgMyA3IAorNiA5IDkgMTQgNiBeCiszNiAwIDIgMTUgMTcgMTAgMTEgOSA1IDkgNCAxNyAxNiAzIDExIDIgMTAgMTIgMTEgNSAzIDggMTcgMTUgMyAzIDQgNyAyIDEgMTAgNyAKKzE0IDQgMTYgNiAxMiA4IF4KKzM2IDEgMTIgMTQgNiA5IDMgMTcgMTEgMTAgNiA4IDE0IDYgMTEgNyAxMCA4IDYgMTcgNCA0IDkgOCAyIDggMTQgOCA3IDE0IDEgMyA2IDggCisxMSAxMCAxNyAxIF4KKzM5IDEgMTIgMTQgOSA0IDExIDcgNiA2IDEzIDE0IDIgMTMgMSAxNCA5IDcgNyAxNSAyIDIgNSAxNSAxMyAxNyAzIDE1IDE2IDkgMSAxIDIgCiszIDIgMTIgMSAzIDMgMTMgOSBeCiszNCAwIDEzIDEwIDE1IDUgOCAxMCAxNSAxMCA4IDcgNSA1IDE0IDQgMTMgMTEgMTIgNCA0IDEyIDEwIDEzIDEyIDQgMTAgMyAzIDcgOSAKKzEzIDE2IDkgMTcgMSBeCiszNiAwIDQgMTIgMSA5IDEyIDEzIDUgMTAgMSAzIDE1IDQgMSAxMyAxNyAxIDggOSA2IDEyIDQgNyA3IDEwIDE3IDEzIDE3IDYgMTcgOSA2IAorOSAzIDUgMTcgMTAgXgorMzQgMCAxIDQgMTAgMTIgMTcgMTQgMTEgOCA1IDE2IDUgNSAyIDEzIDEzIDE2IDkgMTMgMTAgOSA5IDUgMyAxMyA2IDQgMyA5IDE1IDE0IAorMTQgNyAzIDE2IF4KKzM4IDEgOSAxNyAzIDYgNSAxNiAxMCAxNCA5IDEgMTYgNyAzIDUgNCAxNyAxNCA3IDEyIDYgMiA4IDggMTcgNyAyIDQgNSA3IDEyIDIgMSAKKzcgMTEgMyAxNCA5IDE1IF4KKzQxIDAgMiAxMiAzIDQgMSA0IDEgMTYgMTAgNSAxNiA4IDcgMiAxMCAzIDUgOSAxNiA4IDE2IDEzIDMgMTIgNSA1IDExIDIgMiA3IDQgMiAKKzggMTYgNCAxNCA1IDE0IDEwIDQgMTcgXgorMzYgMCA2IDEgMiA3IDEgMTUgMTMgMSAxNyA0IDcgNCA4IDE3IDE2IDE2IDExIDE0IDIgMTAgMTQgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAKKzE2IDMgMiAzIDggMTQgXgorMzIgMSAxMiA4IDExIDE3IDMgOSA3IDE2IDE0IDQgMTEgMTUgNSAxMyA5IDUgMTIgMTcgMTcgMTMgOCAyIDYgOCAxNiAxIDEyIDUgMTcgMiAKKzkgMTQgXgorMjkgMCAxMCAxMyAxNCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIDEzIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSAKKzE0IF4KKzMyIDAgMTMgMiAxMSA2IDEzIDExIDEzIDQgNiA3IDExIDExIDEyIDE2IDEzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IAorMTcgNiA1IDE1IF4KKzM1IDEgNiAzIDE0IDE2IDUgMTcgMTEgMTMgMSAxIDE0IDEzIDMgNiAxNCA1IDE3IDUgNCA4IDE0IDMgMTYgNyAxMyA0IDE0IDggOSAzIDggCisxMiA4IDE1IDExIF4KKzMzIDEgNiA2IDEgNSAxMyAxNiA1IDggNCA2IDEwIDYgMTEgMTYgMTcgMTUgMTUgMTIgNCAxMyA1IDMgNCAxMCAxNSAxMiA3IDE1IDE2IAorMTIgMTIgMTEgMTEgXgorNDAgMCAxMyAxNCA1IDggMSAxMSAxMCA5IDMgMTQgMyAxIDkgNiAxNSAxMiAxNiA0IDUgOSA3IDEgOSA0IDggNSA3IDkgMTYgMTEgMTEgNiAKKzEzIDcgMSA3IDggMSAxNCAxMCBeCiszNCAwIDIgMTAgMTUgMTAgMTQgOCAxOCA5IDkgMTIgMTIgMyAxMyAxMiA2IDQgOSAxNyAxMyAxMyA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IAorMTMgMSAxMyAxMyBeCiszNSAxIDYgMTAgMSAzIDE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxIDkgMTYgNSAxNSAxMCAxNyAzIDggMTUgMTcgOCAxNSAxMSAzIDE1IDE3IAorMTEgMSAxIDQgMTUgXgorMzYgMSAxNCAxOCA0IDIgMTggOCAxNSA2IDQgNiAzIDE1IDExIDE2IDEwIDE3IDE3IDkgNiAzIDIgNiAxNiA0IDkgMTIgNiA4IDEgMTEgMyAKKzIgMTIgMiAxNCAxNiBeCiszNyAwIDQgMSA1IDExIDE2IDE4IDE2IDggMTEgMTUgMiAxOCA3IDUgMTQgNSAxNSAxMyAzIDMgNSA0IDMgMTEgNCA0IDUgMTAgMyAxMiAKKzE3IDEgNCAxNyAxMCAxMCAxNyBeCiszNSAwIDEgMyA0IDIgMSAxMiA1IDE0IDExIDEwIDQgNiAxNCA5IDEgNSA4IDIgOSAxNSAxMiAxMyA3IDE2IDIgMTMgMTcgMTUgOSAxOCAKKzE1IDkgMTMgMTYgMTcgXgorMzQgMSAxOCAxMCA0IDExIDEzIDkgNiAxIDE3IDYgOCA2IDUgMTEgNSAxNCAxNiA5IDEzIDExIDEwIDkgMTUgNCAxNCA3IDE0IDMgMSAxNSAKKzUgNSAxOCAxNiBeCiszNCAwIDEzIDggMTMgMTYgNSAxNyA1IDEwIDEgOCA4IDEyIDYgMTMgMTggOSA2IDE3IDMgMTYgMiA4IDkgOCA3IDIgMTQgMTQgOCAxMCAKKzEzIDkgMTEgMTEgXgorNDAgMCA3IDExIDQgNiA5IDEwIDExIDEyIDIgMTQgMSAxMyAxIDcgMSAxNSA3IDkgOCAyIDEgNCA5IDE0IDE3IDggMTcgMTUgMyA0IDE1IAorMTUgMiAyIDMgMTYgMTMgMiA5IDEyIF4KKzMzIDAgMTQgNiA2IDUgMiAxMyA0IDE2IDExIDMgMTAgMTggMiAxNSA1IDkgNCA4IDQgMTggMTggMTcgMTggMyAxNCAxMiA5IDExIDE1IAorMTYgMSA5IDE2IF4KKzMyIDEgMTggNSAxMCA2IDcgMTcgNyAxMiAzIDEzIDggMTIgMyA4IDkgMyAxNyAxMiA4IDE4IDYgMTQgMyA2IDE0IDE0IDEwIDE0IDEzIAorMTcgMTggOCBeCiszNiAxIDE4IDEyIDE3IDkgMTcgMiAxMiA1IDkgMTIgMSAxOCAxMCA1IDUgMiAxOCAzIDYgMTYgMTggMyAxIDIgMTAgMTUgMiA1IDggMTYgCisxMCAxNCAzIDkgOCAxMyBeCiszMyAxIDE2IDE0IDEgMTYgMTUgMTYgMTcgNCAxMiAxMiAxNiA1IDMgOSAxNCA1IDcgMTcgMTIgMTEgMTIgMTggMTQgMiA3IDcgMTUgOCAzIAorNSAxIDggMTMgXgorMzQgMSA3IDYgNyAxNCA5IDE1IDE1IDE4IDE2IDMgMTAgNSAxNiA2IDggMTEgNCAxIDEwIDEgMTYgNCAxMiAxNyAxNSAxNCA4IDUgNCA2IAorNCAxNyAxNiAxNiBeCiszOCAwIDQgNSAxOCAxOCAxMiA5IDMgOSA2IDkgNyA2IDEwIDE1IDQgOSAxNyA1IDE3IDUgNiAxIDYgMiA4IDE3IDcgNyA0IDQgMTMgMTYgCiszIDQgMTAgMTYgMTIgMTMgXgorMzMgMCAxNiA3IDE4IDMgMyAxMSA5IDEzIDE0IDE1IDE4IDIgMTIgMTAgMyAxNSAzIDEgMTAgNiAxNSAxMyAxNyAxMyA1IDkgNyAxMSA5IAorNSAxOCAxNSAxMiBeCiszMyAxIDE2IDExIDEgNiAxOCAxMyA4IDEgMTggOCAxIDUgMTMgMSAxOCA1IDE1IDE1IDE2IDEyIDEzIDIgMTcgMTIgMTQgMTcgOCAxIDEwIAorMTIgMTAgNCAxOCBeCiszNCAwIDUgNiAxOCAxOCA3IDEwIDEzIDE0IDEwIDEyIDcgNCAxMCA4IDE2IDE2IDE1IDUgMTMgMTQgNCAxNCAyIDQgMTIgNiAxMSA1IDE3IAorOCA1IDEgMTQgMTYgXgorMzEgMSAxNyA5IDExIDIgMTEgMTEgMyAxMyAxMyAxMSAxMiAxMyA1IDEyIDEyIDExIDYgMTMgNCAxOCAxNSAxMiAxOCA2IDYgNyAxNSAxMyAKKzEyIDE0IDE2IF4KKzM4IDEgNCAxMSAyIDUgNiAxMiAxMCAyIDcgMTUgMTEgOCAxNCA3IDE2IDE2IDEgNCAzIDkgMTQgMTYgMyAxOCAxIDcgMTcgMSA3IDMgMTYgCisxNyA2IDE2IDEyIDUgMyAxNyBeCis0MCAxIDEwIDE1IDE4IDEwIDggMTAgMiA1IDExIDIgNyAzIDUgNiA3IDEgMTIgMiA5IDIgNCAxNSAxIDExIDExIDE3IDMgMyAxNiA4IDMgCisxMSAxOCAxNiAxMSA2IDE1IDggOCAxMyBeCis0MCAxIDEwIDMgMTcgNyAxMCAxOCAxMyAxNCA4IDcgOCAxNCAyIDIgOCA2IDMgNyA1IDYgOSA1IDEyIDEwIDcgNiA1IDE2IDQgMTQgMiAKKzE1IDMgMTUgOSAxNSAxIDkgNyAxMiBeCiszNSAwIDE0IDE1IDEyIDcgMiAxNiAxOCA4IDE4IDEgMTMgMTIgMSAxIDE0IDE0IDEzIDMgMTQgNyAyIDEwIDEwIDExIDE0IDMgMTIgNSAKKzEzIDYgMTcgMTQgMSAxMSAxMyBeCiszNCAwIDcgMTIgOCAxMiAxNyAxNyAxOCAxNyAxMyAyIDQgNyA1IDEgMTUgNyAxNCAxNyAxMSA2IDEwIDkgMTggOSAxNCAxMyAzIDggNCAKKzEzIDggNyAxMyA3IF4KKzM1IDAgNCAxNiA4IDE3IDEwIDIgMTMgMTAgMiAyIDYgMiAzIDE4IDE3IDIgMTcgNCAxOCA3IDE2IDE4IDE0IDQgMTEgNyA0IDE1IDE3IDYgCisxMSAxMSAxNCAxNyA0IF4KKzM3IDAgMTAgMTcgMTYgMTMgMTUgMTQgNiAxIDE0IDExIDggMTYgNiAyIDE2IDEzIDcgOCA2IDIgMTUgMSA5IDEyIDQgNCAxMSAxMyA3IDIgCisxMSA5IDE4IDQgNSA0IDE4IF4KKzM5IDAgMiAxNCA5IDkgMSA4IDEzIDExIDE1IDggNSA5IDEwIDE2IDkgMiA3IDEgMSAxNyAxMyA2IDExIDEwIDggNSAxMiAxNSA2IDE1IAorMTAgMTIgNCAxOCAxIDIgOCAxMSAxNSBeCiszMiAxIDE2IDEwIDEyIDE4IDExIDE2IDEyIDExIDE3IDE3IDQgNyAxMyA3IDEwIDcgMTAgNiAxIDEyIDcgMTggMTEgMTggMiAxMCAxNSAKKzEwIDE0IDggMTggMiBeCis0MCAxIDkgMTIgMTIgMyAxMyAxMiA2IDQgOSAxNyAxMyAxMyA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IDEzIDEgMTMgNiA2IDEwIDEgMyAKKzE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxMiBeCiszNiAxIDkgMTYgNSAxNSAxMCAxNyAzIDggMTUgMTcgOCAxNSAxMSAzIDE1IDE3IDExIDEgMSA0IDMgMTQgMTggNCAyIDE4IDggMTUgNiA0IAorNiAzIDE1IDExIDE2IDggXgorMzkgMSAxNyAxNyA5IDYgMyAyIDYgMTYgNCA5IDEyIDYgOCAxIDExIDMgMiAxMiAyIDE0IDEyIDQgMSA1IDExIDE2IDE4IDE2IDggMTEgCisxNSAyIDE4IDcgNSAxNCA1IDE1IDEwIF4KKzQ3IDEgMyAzIDUgNCAzIDExIDQgNCA1IDEwIDMgMTIgMTcgMSA0IDE3IDEwIDEwIDkgMSAzIDQgMiAxIDEyIDUgMTQgMTEgMTAgNCA2IAorMTQgOSAxIDUgOCAyIDkgMTUgMTIgMTMgNyAxNiAyIDEzIDE3IDMgXgorMzQgMSA5IDE4IDE1IDkgMTMgMTYgMTggMTAgNCAxMSAxMyA5IDYgMSAxNyA2IDggNiA1IDExIDUgMTQgMTYgOSAxMyAxMSAxMCA5IDE1IAorNCAxNCA3IDE0IDkgXgorMzcgMSAxIDE1IDUgNSAxOCAxMyAxMyA4IDEzIDE2IDUgMTcgNSAxMCAxIDggOCAxMiA2IDEzIDE4IDkgNiAxNyAzIDE2IDIgOCA5IDggNyAKKzIgMTQgMTQgOCAxMCAxMyBeCis0MiAwIDkgMTEgMTAgNyAxMSA0IDYgOSAxMCAxMSAxMiAyIDE0IDEgMTMgMSA3IDEgMTUgNyA5IDggMiAxIDQgOSAxNCAxNyA4IDE3IDE1IAorMyA0IDE1IDE1IDIgMiAzIDE2IDEzIDIgMTcgXgorMzYgMCAxNiAxNCA2IDYgNSAyIDEzIDQgMTYgMTEgMyAxMCAxOCAyIDE1IDUgOSA0IDggNCAxOCAxOCAxNyAxOCAzIDE0IDEyIDkgMTEgCisxNSAxNiAxIDkgMiAxOCA2IF4KKzMzIDEgMTAgNiA3IDE3IDcgMTIgMyAxMyA4IDEyIDMgOCA5IDMgMTcgMTIgOCAxOCA2IDE0IDMgNiAxNCAxNCAxMCAxNCAxMyAxNyAxOCAKKzE0IDE4IDEyIDEzIF4KKzM5IDEgOSAxNyAyIDEyIDUgOSAxMiAxIDE4IDEwIDUgNSAyIDE4IDMgNiAxNiAxOCAzIDEgMiAxMCAxNSAyIDUgOCAxNiAxMCAxNCAzIDkgCis4IDEwIDE2IDE0IDEgMTYgMTUgMTQgXgorMzAgMSAxNyAxOSA1IDcgMTQgNCAxMSAzIDYgMTggMTMgNyAxOCAxOCAxOSAxOSAxMyA5IDEwIDE5IDE0IDEyIDQgMTUgMTUgMTggMiAxMCAKKzcgMTUgXgorMzQgMSAyIDEzIDggMTkgMTUgMSAxMSAxNCA3IDcgMTcgNiAxNiA0IDE2IDE3IDIgMTggMTIgNSAxNCAxOSAxNyAxIDggMTIgNiA2IDYgCisxOSAxMyAxMCAxNiA1IF4KKzM2IDEgMTQgMTMgNiAxNiAxNCAxNSA0IDEzIDE1IDQgNCAxMSA0IDEwIDMgMTcgNCAxOSA2IDE3IDE0IDMgMiAxNiAxIDE0IDE2IDUgMTcgCis4IDEgMSAxOSAxMyAxMiAxMiBeCiszNCAwIDE3IDExIDEzIDUgMTkgMTEgMTggMTkgMSAzIDEyIDExIDggNCAxMSAxMyAxNyAzIDggOSA0IDUgMTIgMTUgMTIgNiA3IDE2IDE2IAorMTIgMSAxMyAxNyAxNSBeCis0MCAwIDE4IDkgMyAxNiAyIDE2IDQgMTkgNiA2IDE4IDMgMTMgMSA1IDMgMiA2IDE1IDExIDYgNCAxNCAxNSAxNSA5IDEzIDggMSA5IDE1IAorMiA3IDUgMTEgNSAxMiA3IDE2IDE1IF4KKzM3IDAgMTggNCAzIDEgNCAxMSAxNSA3IDYgOSAxIDE0IDcgMSAxNyAxNyAxNiAxNCAxMyAxNCAxMiAxNCA5IDEyIDExIDE4IDcgMTQgMyAKKzEgNiAxIDE1IDggMTUgMTkgOSBeCiszMiAwIDMgOSA5IDcgNyAxMCAxMiAxMyA3IDExIDEyIDE2IDkgOSA5IDE3IDEzIDEzIDIgMTcgMTAgNCAxOCAxNyAxOSAxNiAxMSAxMSAKKzEzIDE4IDEzIDEyIF4KKzM1IDAgOCAxNSAxOCAxMCA2IDEwIDE4IDE3IDkgMiAxNCAxIDE3IDE4IDYgMTQgMTIgNSA1IDE1IDE3IDEwIDMgOCA4IDEgMTAgNSAxIAorMTggMTggOSAxNiAxMCAxNCBeCiszOCAxIDYgMTYgMSA2IDMgNSA4IDE2IDggNyA1IDE4IDExIDE1IDE3IDYgMTEgMTAgNCA4IDE0IDE2IDYgNyA4IDEyIDEyIDE4IDEgMTAgCis0IDcgMSAxOSA3IDE5IDE1IDEyIF4KKzM0IDAgMSAxNCA2IDExIDE4IDUgNCAxMiA2IDE0IDIgMTkgMiA1IDEzIDEwIDEwIDIgMTYgMTAgMTggMTYgMTkgMiAxNSAxMCA3IDE4IAorMTYgMTcgMTUgMTUgOSAxMyBeCiszOCAxIDEwIDE2IDQgMTUgNyA1IDE5IDEgMTUgMTYgMTEgMTkgOSAxOCAyIDQgNiAxMiA5IDggNyAxMyAxNCAxMSA0IDEyIDEzIDUgOSA2IAorNSA2IDE2IDExIDkgMyAxNSA2IF4KKzQwIDAgMTYgMSAxMyA2IDggMTggMTEgMTEgMiAxIDIgMiAxNCA5IDEzIDEgMTUgNiA1IDE2IDE5IDE0IDE5IDcgMTggNSAyIDIgMyAxMyAKKzEzIDEyIDEzIDExIDIgMTIgMiAxMiAxOCA1IF4KKzM1IDAgNyA4IDEzIDYgOSA4IDE3IDEwIDExIDEgOSAxNCA0IDE5IDE5IDMgMTUgMTMgOSAxOCAxMiAxNyAxIDE2IDggOSAxNSAxIDEyIDQgCis0IDE5IDE4IDEzIDExIF4KKzM2IDEgMTQgMTggOCAxNCA5IDMgNCAxOCAxNiA5IDE5IDEyIDMgMTcgNSAxMCAxNiA1IDggNCA0IDEwIDE0IDEzIDQgOSAxMSAxOSA4IDggCis1IDEgMTMgMTYgMTQgMTMgXgorNDEgMSAxMCAxNSAzIDQgOCAyIDEyIDkgMTYgMyAxNiAzIDYgMTcgMyAxMCAxOSA3IDYgMSA1IDExIDE4IDkgNCA2IDIgMTUgMTEgMTcgCisxNyAxNyA0IDEwIDEzIDMgNyAxMCAzIDkgMTQgXgorNDIgMCA3IDkgMyAzIDggMTkgMTAgOCAyIDE5IDEyIDE5IDEzIDYgMTkgMyA0IDE3IDYgOSAxIDcgMiA5IDcgMTggNiAxNSAyIDIgNCAzIAorMTAgMTEgMTEgNiAxMiAxMCAxOCA0IDEyIDEwIF4KKzM1IDEgNCA1IDExIDEyIDE1IDE5IDEyIDEwIDYgMTUgMTQgMTkgMTggMTEgOCAxMSAxNyAxNiA3IDcgMTEgMiAxMCA2IDE5IDUgMTQgNyAKKzEgNyAzIDE5IDQgMTcgMTUgXgorMzYgMSA1IDEwIDIgMTggMSAxNyA4IDEyIDE3IDIgOSA4IDggMyAxNCAxMCAxNSAyIDE0IDggMyAxIDE2IDE4IDEyIDE4IDExIDE2IDcgCisxNyA1IDE5IDIgMTkgMTIgMTkgXgorMzcgMCAxNiAxNCAyIDkgMTYgMiA2IDYgNyA5IDEwIDkgMTEgOSAxNCAxMSAxNSA1IDE2IDkgMiAxNyAyIDggMTUgOCA0IDMgMTQgMTQgCisxNiAxNiAxMyAxMSAxMCAxNiAxNCBeCis0MCAwIDExIDcgMTQgMTQgMTQgNiAxMCAxMCAxIDYgMTMgMTkgNSA2IDQgNyAxMiAxMiAxMCA1IDEwIDE1IDE1IDggNSAxMyAxNyAxMyA1IAorNiAxNCAxIDkgMiA2IDUgMTcgOSAxMSAxMyBeCiszOCAwIDE4IDggNiAxMyAxNSAzIDMgMTUgNSAxMyAxOCAzIDIgNSA1IDE0IDcgMTMgNCAxNyA3IDIgMTcgMyAxOCAxNSA3IDE1IDE2IDE4IAorNSAxMiA4IDYgMyAxNyAxMiAxMyBeCiszOCAxIDE5IDE1IDkgNyAxNyAxNiAxNSAzIDExIDExIDUgMiAxMyAxOSAxNiAyIDQgMTYgNyA4IDEgMiA5IDE3IDEyIDMgNSAxOCAxOSAKKzExIDE3IDkgMSA0IDEgMTggMTAgMTAgXgorNDEgMSAxMyAxIDcgMTMgNSA3IDQgMSA4IDEzIDE2IDMgNSA3IDYgOCA4IDE0IDggMTMgNyAxOSA4IDE2IDE4IDQgMiA4IDcgMTIgNCAxNCAKKzUgMSAzIDE5IDE3IDExIDE0IDE1IDE5IF4KKzM5IDAgMTAgOSAxMiAxOSAxMSAxMCAzIDE4IDE0IDE3IDE4IDE3IDcgMTIgMTQgOCAxMSA3IDIgMTAgMTcgMTUgNSAzIDEyIDMgMTIgMSAKKzIgMSAxIDEyIDE0IDEwIDIgOCAxNyAxOCAyIF4KKzQ1IDEgNCA5IDQgMTYgNSAxOCAxIDEgMTAgMTAgMTEgMyAxMCAxMiAxIDMgMTEgMSAxMSA1IDMgMyAxNiAxNSAxMCAxNyAxNCAxNSA2IAorMTMgMTIgMiAzIDE0IDMgOSAxOSA0IDQgOCAxMCAxNCA1IDExIDkgXgorMzUgMCAyIDcgMTUgMTQgOCAyIDExIDE5IDE5IDQgNSAxMCA4IDkgNSAxNSA5IDE3IDE5IDUgNyAxNCA0IDExIDMgNiAxOCAxMyA3IDE4IAorMTggMTkgMTkgMTMgMTMgXgorMzUgMSAxMCAxOSAxNCAxMiA0IDE1IDE1IDE4IDIgMTAgNyA5IDIgMTMgOCAxOSAxNSAxIDExIDE0IDcgNyAxNyA2IDE2IDQgMTYgMTcgMiAKKzE4IDEyIDUgMTQgMTkgOSBeCiszOCAxIDEgOCAxMiA2IDYgNiAxOSAxMyAxMCAxNiAxMyAxNCAxMyA2IDE2IDE0IDE1IDQgMTMgMTUgNCA0IDExIDQgMTAgMyAxNyA0IDE5IAorNiAxNyAxNCAzIDIgMTYgMSAxNCAxOSBeCiszOCAwIDUgMTcgOCAxIDEgMTkgMTMgMTIgMTIgMTcgMTEgMTMgNSAxOSAxMSAxOCAxOSAxIDMgMTIgMTEgOCA0IDExIDEzIDE3IDMgOCA5IAorNCA1IDEyIDE1IDEyIDYgNyAxNiAxMSBeCis0MyAwIDEyIDEgMTMgMTcgNCAxOCA5IDMgMTYgMiAxNiA0IDE5IDYgNiAxOCAzIDEzIDEgNSAzIDIgNiAxNSAxMSA2IDQgMTQgMTUgMTUgCis5IDEzIDggMSA5IDE1IDIgNyA1IDExIDUgMTIgMTYgXgorMzkgMSAxNiA2IDE4IDQgMyAxIDQgMTEgMTUgNyA2IDkgMSAxNCA3IDEgMTcgMTcgMTYgMTQgMTMgMTQgMTIgMTQgOSAxMiAxMSAxOCA3IAorMTQgMyAxIDYgMSAxNSA4IDE1IDE5IDEyIF4KKzM1IDAgMyA5IDkgNyA3IDEwIDEyIDEzIDcgMTEgMTIgMTYgOSA5IDkgMTcgMTMgMTMgMiAxNyAxMCA0IDE4IDE3IDE5IDE2IDExIDExIAorMTMgMTggMTMgOCA4IDE1IDYgXgorNDAgMCAxMCA2IDEwIDE4IDE3IDkgMiAxNCAxIDE3IDE4IDYgMTQgMTIgNSA1IDE1IDE3IDEwIDMgOCA4IDEgMTAgNSAxIDE4IDE4IDkgCisxNiAxMCAxOSA2IDE2IDEgNiAzIDUgOCAxNiBeCis0MCAwIDggNyA1IDE4IDExIDE1IDE3IDYgMTEgMTAgNCA4IDE0IDE2IDYgNyA4IDEyIDEyIDE4IDEgMTAgNCA3IDEgMTkgNyAxOSAxNSAyIAorMSAxNCA2IDExIDE4IDUgNCAxMiA2IDE5IF4KKzM1IDAgMiAxOSAyIDUgMTMgMTAgMTAgMiAxNiAxMCAxOCAxNiAxOSAyIDE1IDEwIDcgMTggMTYgMTcgMTUgMTUgOSAxNSAxMCAxNiA0IAorMTUgNyA1IDE5IDEgMTUgMTYgNiBeCis0MyAxIDE5IDkgMTggMiA0IDYgMTIgOSA4IDcgMTMgMTQgMTEgNCAxMiAxMyA1IDkgNiA1IDYgMTYgMTEgOSAzIDE1IDEyIDE2IDEgMTMgCis2IDggMTggMTEgMTEgMiAxIDIgMiAxNCA5IDEzIDExIF4KKzM5IDEgMTUgNiA1IDE2IDE5IDE0IDE5IDcgMTggNSAyIDIgMyAxMyAxMyAxMiAxMyAxMSAyIDEyIDIgMTIgMTggNyA4IDEzIDYgOSA4IAorMTcgMTAgMTEgMSA5IDE0IDQgMTkgMTkgMyBeCiszNCAxIDE1IDEzIDkgMTggMTIgMTcgMSAxNiA4IDkgMTUgMSAxMiA0IDQgMTkgMTggMTMgMTUgMTQgMTggOCAxNCA5IDMgNCAxOCAxNiA5IAorMTkgMTIgMyAxNyAxNSBeCis0NSAxIDEwIDE2IDUgOCA0IDQgMTAgMTQgMTMgNCA5IDExIDE5IDggOCA1IDEgMTMgMTYgMTQgMSAxMCAxNSAzIDQgOCAyIDEyIDkgMTYgCiszIDE2IDMgNiAxNyAzIDEwIDE5IDcgNiAxIDUgMTEgMTggMiBeCis0MyAxIDE1IDQgMTMgMTQgMyA0IDEgMyAxIDUgMTEgNCA5IDcgMjAgOCAxNSA0IDE2IDcgMTkgMTEgMSAxMSAyIDEzIDEzIDExIDEyIDEzIAorMTUgMTIgMSA1IDEzIDMgOCAxNSAxMiA4IDE2IDE2IDYgXgorNDQgMCA1IDEzIDEyIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IDYgNyAKKzEwIDE3IDEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDkgXgorMzggMCAxNSA4IDIwIDE4IDIwIDExIDE1IDExIDExIDkgNiAyIDE1IDUgMTcgMTIgMSA5IDEgMyA1IDExIDcgMiAyIDYgMTggMiA5IDExIAorOCAxNiAxMSAxNiAxNSAxOCAxOCAxOCBeCiszNSAxIDIwIDIgMTcgMTcgMTAgOCAxMyAyMCA0IDE4IDYgMTggOSA0IDEgMSAxOCA1IDIgMTcgMTUgMTYgMTkgMTUgMSAxMCAxNyAxNiA0IAorMTYgMTQgMTQgMTEgMTUgMTAgXgorMzggMCA1IDkgMTUgMTAgOSAxNyAxOCAxNCAxNSAxMiA2IDEgMTYgOCAxOCA4IDEzIDEyIDEwIDE0IDE0IDEzIDkgMiAxNCAxNyA5IDEgCisyMCAxMCA0IDIgMTIgOSA0IDEzIDE2IDUgXgorMzYgMCAxNCAxMCAxMSAxNiAxNyAxMiAxOCAxMiA3IDE3IDggNyAzIDEgMyAxNyA0IDkgNSAxNyAxNCAxNyAxMSA1IDIwIDE5IDggMTkgCisxNCAxMyAyIDE4IDMgMyAxOCAxMyBeCis0MSAxIDEzIDggMTQgNiAxOCA3IDEwIDEgMTMgMTAgMTEgMTEgMTYgMSAyIDggNyAxIDcgMTQgOCAxNyA2IDggNCAzIDExIDE3IDMgNSA3IAorMTYgMTEgMTEgMTQgNyAxMyAyMCAyMCA3IDIwIF4KKzQwIDEgMTMgMTUgMTQgMTYgMTQgOCA5IDE2IDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAKKzEgMTkgOCAzIDQgMyA3IDEgMTQgMTkgMTcgXgorMzcgMSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSAxMSAxNyAxMCAxMCA3IDkgMTMgMTYgOSAxMCAxOCA0IDEyIDUgMTYgNSAyMCAxMiAKKzMgOCAxMCAxIDE4IDEgNiAyMCAxNCBeCiszNiAwIDggOSA2IDEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAyMCAxNiAxMCAxMiAxNyA4IDExIDggMTEgMTAgNSAxMCAxNCAxOCA4IAorMTkgOSAxMiAxMiAyIDIwIDEyIF4KKzM4IDAgMTIgMTYgMjAgMyA5IDkgMTkgMTcgMTMgMTMgNCAxNyAyIDExIDcgMTQgMyA2IDE2IDEzIDEwIDEzIDUgMTYgMTAgMiA4IDIgMTcgCisxOSA0IDE3IDcgMTkgNiA5IDE1IDcgXgorNDEgMSAyMCA3IDIgMTggNSA3IDE4IDUgMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgOCAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAKKzE3IDcgMTkgMTYgMiAxIDE2IDYgMyAxOSAxMCBeCis0NiAwIDUgMTggOSA5IDExIDIgMSAxMiAxMSAxNCAxMiAxNCAxMCA0IDExIDYgOCAxNiA3IDUgMTEgMjAgOCAxNyA0IDE0IDQgMTUgMyAyIAorMiA0IDMgMiAzIDE0IDE1IDEwIDIgMTIgNyAzIDcgMjAgMjAgNSBeCis0MSAxIDEwIDIgMyAxIDEwIDEyIDE1IDE0IDExIDIwIDMgMTYgMTQgOSA0IDE4IDEgMTkgMjAgOSA1IDEyIDEzIDYgNiAxIDkgMTMgNyAKKzE1IDkgOCA1IDE5IDMgMTYgOSA4IDEwIDIwIDggXgorMzkgMSAxMSAxMyAxOSA1IDcgMTYgMTggMTYgNCA0IDQgNiA5IDEzIDEwIDE5IDE1IDMgMTQgNiA0IDEyIDEwIDE1IDE1IDQgOCAxMyAxMyAKKzkgMTggMTMgNiA0IDcgMjAgNCAyMCA3IF4KKzMxIDEgMTggMTggMTIgMTYgMTMgMTkgMTkgNSA3IDIgNiAxMSAxOCA5IDE4IDYgMTEgMTQgMTQgMTggMTAgMTMgMTkgMjAgMTcgMTEgMTQgCis1IDE5IDIwIDEzIF4KKzQ2IDEgMjAgMSAxIDQgMTMgMTAgNiA1IDYgMTkgMTggMSAzIDkgMTQgMjAgNyAxOCA3IDE1IDIgMyAxNSA1IDEgMSAyIDYgMTMgMSAxOSAKKzYgMTQgMTYgNSAxNSAxMSAxMyAzIDYgMTEgMiAyMCA4IDEgMjAgXgorMzcgMCA0IDIwIDE5IDMgMTggMyA4IDE5IDcgOCAxMiAxNCAxMiAxOSAxMSAxNSA2IDE5IDEgMTkgNCAxMCAxNiAxNyA3IDE3IDEgMiAxMyAKKzE4IDEyIDIgMTggMTkgMiA3IDE1IF4KKzQyIDEgOSAxOCA4IDUgMTQgMiA1IDQgNCAyMCAxNCAxMyA3IDggMTQgOCAxIDcgMTkgOSA3IDExIDEyIDQgMTkgMTIgMTAgMTkgMjAgNCAKKzQgMSA4IDIgMTYgMTYgOCAyMCAyIDEgMjAgMTMgXgorMzcgMSAxIDE1IDcgNiAyMCAxMCAxNCA5IDEyIDE5IDE4IDIwIDYgMTQgNiA1IDYgMTcgMTQgMTIgMTIgMTYgNCAyIDE5IDE0IDE1IDE3IAorNyAxMiAxMSAxMiA4IDE0IDEgMTcgNyBeCiszOSAwIDE1IDE4IDIgNCAxMCAxOCAxMSAxNyA1IDkgMTcgNCAxOSA1IDUgOCA2IDIgMjAgMTUgNiA1IDE4IDExIDMgMTAgMjAgMTAgMTYgCiszIDEyIDcgNSAxNCAxOCAxNSAxNCA5IDE0IF4KKzQ0IDAgMTQgNyA2IDE1IDkgMyA0IDggOCAxMiAxOSAyIDkgMTYgMTkgNiAxNiAyMCA1IDMgMTkgNyA0IDcgNCA1IDEwIDUgMSAxOCA3IAorMTcgNiAzIDMgMTMgMTYgMiAzIDIwIDE2IDEyIDYgMTYgXgorMzggMCAxNyAxOSAyIDIgMTEgMTkgMTMgNCAxNSA4IDEgMTIgOSAyMCAyIDUgMiAxMCAyMCA1IDE1IDEzIDcgMTMgMTUgMTkgMTcgMTEgOSAKKzE1IDggMTUgMTcgOSA2IDE2IDggMTMgXgorMzggMSAxOCAxMCA4IDggMTAgMTUgMTMgOCA0IDUgMTUgNiAxMiAxMyAxIDE3IDEyIDQgNyAxOCAxMCAxMiAxMCAzIDE1IDIwIDUgMTkgOCAKKzE3IDIwIDEzIDE0IDEwIDkgMTIgMTcgNSBeCis0NiAxIDEwIDE4IDYgNiAxNSA0IDEzIDE0IDMgNCAxIDMgMSA1IDExIDQgOSA3IDIwIDggMTUgNCAxNiA3IDE5IDExIDEgMTEgMiAxMyAKKzEzIDExIDEyIDEzIDE1IDEyIDEgNSAxMyAzIDggMTUgMTIgOCAxNiA2IF4KKzQ1IDEgMTcgNSAxMyAxMiAxNCA1IDMgMSA0IDE2IDEyIDIwIDEgNiAxNSAxMSAxOCA0IDE3IDE2IDYgMTAgMyAyIDkgOSAxNCA2IDIgOCAKKzYgNyAxMCAxNyAxMiAyMCA2IDcgNSAxNiAxIDQgMiAxNyAxNiBeCis0MCAwIDE1IDggMjAgMTggMjAgMTEgMTUgMTEgMTEgOSA2IDIgMTUgNSAxNyAxMiAxIDkgMSAzIDUgMTEgNyAyIDIgNiAxOCAyIDkgMTEgCis4IDE2IDExIDE2IDE1IDE4IDE4IDMgMjAgMTkgXgorMzggMCAxNyAxNyAxMCA4IDEzIDIwIDQgMTggNiAxOCA5IDQgMSAxIDE4IDUgMiAxNyAxNSAxNiAxOSAxNSAxIDEwIDE3IDE2IDQgMTYgCisxNCAxNCAxMSAxNSAyIDUgOSAxNSAxMCAxNSBeCiszOCAwIDE3IDE4IDE0IDE1IDEyIDYgMSAxNiA4IDE4IDggMTMgMTIgMTAgMTQgMTQgMTMgOSAyIDE0IDE3IDkgMSAyMCAxMCA0IDIgMTIgCis5IDQgMTMgMTYgNyAxNCAxMCAxMSAxNiAxOSBeCiszOSAwIDEyIDE4IDEyIDcgMTcgOCA3IDMgMSAzIDE3IDQgOSA1IDE3IDE0IDE3IDExIDUgMjAgMTkgOCAxOSAxNCAxMyAyIDE4IDMgMyAKKzE4IDE3IDEzIDggMTQgNiAxOCA3IDEwIDEyIF4KKzQxIDAgMTMgMTAgMTEgMTEgMTYgMSAyIDggNyAxIDcgMTQgOCAxNyA2IDggNCAzIDExIDE3IDMgNSA3IDE2IDExIDExIDE0IDcgMTMgMjAgCisyMCA3IDE2IDEzIDE1IDE0IDE2IDE0IDggOSAxNiBeCis0MyAxIDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAxIDE5IDggMyA0IDMgNyAxIDE0IDE5IAorMTkgMTggMTMgMTEgNSAxOCA0IDE5IDEwIDYgMTkgNCBeCis0MSAxIDE3IDEwIDEwIDcgOSAxMyAxNiA5IDEwIDE4IDQgMTIgNSAxNiA1IDIwIDEyIDMgOCAxMCAxIDE4IDEgNiAyMCAxMiA4IDkgNiAKKzEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAxNSBeCiszNyAwIDE2IDEwIDEyIDE3IDggMTEgOCAxMSAxMCA1IDEwIDE0IDE4IDggMTkgOSAxMiAxMiAyIDIwIDEzIDEyIDE2IDIwIDMgOSA5IDE5IAorMTcgMTMgMTMgNCAxNyAyIDExIDcgMTYgXgorNDMgMCAzIDYgMTYgMTMgMTAgMTMgNSAxNiAxMCAyIDggMiAxNyAxOSA0IDE3IDcgMTkgNiA5IDE1IDE1IDIwIDcgMiAxOCA1IDcgMTggNSAKKzIgMTUgNyAxMSAxMCA5IDMgMiAxNCAxOSAzIDExIDE0IF4KKzQzIDEgMTggMTUgNSAzIDUgMTIgMTUgMTYgMTAgMTcgNyAxOSAxNiAyIDEgMTYgNiAzIDE5IDEyIDUgMTggOSA5IDExIDIgMSAxMiAxMSAKKzE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCAyIF4KKzQ1IDAgMTcgNCAxNCA0IDE1IDMgMiAyIDQgMyAyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCAxOSAxMCAyIDMgMSAxMCAxMiAxNSAKKzE0IDExIDIwIDMgMTYgMTQgOSA0IDE4IDEgMTkgMjAgOSA1IDE4IF4KKzQyIDAgMTMgNiA2IDEgOSAxMyA3IDE1IDkgOCA1IDE5IDMgMTYgOSA4IDEwIDIwIDE0IDExIDEzIDE5IDUgNyAxNiAxOCAxNiA0IDQgNCAKKzYgOSAxMyAxMCAxOSAxNSAzIDE0IDYgNCAxMiAxOCBeCiszNiAxIDE1IDE1IDQgOCAxMyAxMyA5IDE4IDEzIDYgNCA3IDIwIDQgMjAgMTggMTggMTIgMTYgMTMgMTkgMTkgNSA3IDIgNiAxMSAxOCA5IAorMTggNiAxMSAxNCAxNCAxOCAxNSBeCis0MyAxIDEzIDE5IDIwIDE3IDExIDE0IDUgMTkgMjAgMTEgMjAgMSAxIDQgMTMgMTAgNiA1IDYgMTkgMTggMSAzIDkgMTQgMjAgNyAxOCA3IAorMTUgMiAzIDE1IDUgMSAxIDIgNiAxMyAxIDE5IDYgMTkgXgorNDAgMSAxNiA1IDE1IDExIDEzIDMgNiAxMSAyIDIwIDggMSA1IDQgMjAgMTkgMyAxOCAzIDggMTkgNyA4IDEyIDE0IDEyIDE5IDExIDE1IAorNiAxOSAxIDE5IDQgMTAgMTYgMTcgNyAxNyAxNiBeCiszOSAxIDEyIDE5IDIwIDEgMTMgMTIgMTAgOCAyMSAxNSA3IDE5IDEzIDYgOCAxOSAyMCAxOCAyIDEyIDE0IDMgMTAgNiAyIDYgMiAxNyAKKzE2IDIgNSAyMSA1IDE3IDE5IDcgOCAxMSAxNSBeCiszMyAwIDEyIDE3IDE0IDE4IDE1IDE2IDE2IDE2IDEyIDIwIDEzIDIgNSA1IDIgMTAgMjAgMTYgMTIgMTAgMiAxNyAyMSAyMCAxNSAxNCAKKzE0IDE4IDIxIDEzIDkgMTcgMTAgXgorNDAgMSAyIDEyIDE2IDE3IDMgOSAxOSA1IDcgMTAgNSAxMSAxNyAxOCAxNCAxNCAxMiAyIDIwIDE1IDggMTcgMyAyMCAxMSAxMiAxOCA3IAorMTIgNyA5IDggMyAxOCAxNCAzIDUgMTcgOSAxNCBeCis0MyAwIDggMjEgMTEgOCA4IDE2IDIxIDEyIDUgOCA3IDIwIDEwIDE0IDcgMSA5IDUgNCA1IDIgMjEgMTIgMSAxIDkgMjAgMTQgMTEgOSAKKzE5IDE2IDMgMSAxNCAxMCAyIDggMjAgMTggNyA4IDE4IF4KKzQwIDEgMiAxOSA2IDExIDE4IDExIDE1IDYgNSAxNiAxNCA5IDcgMjEgMyAxNSAyMSAxNiA4IDcgMyA2IDE0IDE3IDE3IDUgMTAgMjAgMTAgCisxNSAxMCAxIDE1IDE4IDYgMTAgOSA3IDE2IDYgXgorMzkgMCAxMSAxNSAxMiAyIDkgMSAxIDYgNiAxMyA4IDIwIDYgMTggOCA1IDggMSAxIDE3IDIwIDIwIDE5IDE3IDEzIDE0IDE3IDEyIDUgMyAKKzE4IDIwIDIwIDExIDE4IDE1IDEzIDE2IDcgXgorNDggMSA3IDEwIDEgMTkgMTAgNyAxNyA3IDE2IDMgOCA0IDQgMTUgMTcgMTMgOSAxMSAyIDIgMTEgNyAxMyA0IDE3IDcgMSA1IDEzIDE5IAorMTYgNSAxNCAxNiAyIDExIDE4IDUgMTEgNiA0IDcgMyAxNyAyIDEgMTggMTIgXgorNDEgMSAyMSAxOCAzIDUgMTYgNiAxMSAyIDggOCA3IDE0IDEzIDIxIDYgMTQgMTIgNiAxMiAxOSAxNCAzIDE2IDMgMiA3IDExIDE0IDggCisxNiAxMCAxOSAxMiAxOSA0IDUgNiAxMyAxOSAxMiAxMyBeCis0NCAxIDcgNSAxMiA0IDEzIDIxIDIgNSAxNyAxNSAxNSAxIDEzIDUgMjEgNiA0IDEyIDE0IDE1IDUgMTggMTIgMSAxOSAyIDE0IDEgOCA4IAorMTEgNiAyMCAxMCAzIDIxIDggMjAgMiA0IDEgMTYgMTEgMjEgXgorNDIgMSA1IDMgOCAxNiAxNSA4IDEyIDE0IDIwIDE2IDE4IDcgMiAxOCAyIDE4IDE5IDcgNCAxOSAzIDEgMjAgNyAxNSAxIDQgNSAxMiAxMCAKKzE5IDYgMTEgNCA0IDkgMjAgMjAgOCAyIDIwIDE4IF4KKzQyIDEgMTkgMiA4IDQgMTUgNyAyIDIgNiAxOCAyMCAxNiAxIDE4IDE3IDEzIDMgMTQgMiAxIDIgMTAgMTQgMTkgMTIgOSAxNSAyMCAxIDcgCisxNSAxNyA3IDEyIDE4IDEgMTUgMTQgOCAyMSAyMSA1IF4KKzQzIDEgNyAyMCAxMCAxMSAxMCAxIDkgMjEgNyA1IDEgMTIgMTUgMiA5IDE3IDQgMTMgNSA0IDExIDIxIDE0IDEzIDMgMjAgMjEgMSAzIAorMTIgMTggMTEgNCAxNCAyMCA1IDMgMTQgMTMgMTUgOSAyMSAzIF4KKzQwIDEgMTkgOCAxIDUgOSA1IDkgMTYgMTcgOSA2IDEyIDYgMTYgNyA0IDMgMSAyMSAxNiAxOSAxNSAxOCAxNyAxNyAxNyAyMSAxMyAyMCAKKzkgNiA2IDkgMSAxMyAxNyAyMSAxIDkgMTQgXgorMzYgMCAxMSAxMiAxMyAxOCAxOSAxOSAxNSAxMiAyMCAyIDE2IDEyIDkgMjEgMTcgMTYgOCAyIDE0IDYgNCAxIDYgMTYgMTUgMTkgMTkgCisyMSA5IDEzIDE4IDMgMTYgOCAxMyAxMSBeCis0NyAwIDIxIDE1IDQgMjEgNCAyIDMgOCAxNSAxOSA4IDYgMTYgMiAxNSAzIDEyIDMgMTEgMyAxNyAxMiAyMSA2IDMgNCAxMyAxIDEyIDQgCisxMCAyIDYgNyA2IDkgMTIgMjEgMTAgMTAgMTEgMiAxMyAxOSAyIDE0IDE3IF4KKzQ0IDEgMTEgOCAxMCAxOSAxIDExIDExIDkgMyAxMyAxNSA0IDMgMTggOSAxNCA1IDE1IDE4IDUgNiAxNyAxMSAxOSAyIDQgMTIgOCAxOCAKKzEyIDE3IDMgNCA4IDUgMTkgMTYgMTYgNiAxIDEzIDEgMTggMTggXgorMzkgMSAxMCAxOCAxNSAxMSA1IDEgMTcgNCAxNyAxOSAxMSAxOCAyMSA5IDIgMTAgMTAgNSA1IDIwIDE4IDEzIDUgMTUgMyA2IDMgMTAgCisxMCAxNiAxMyAxMyAxNCAxNiAyMCAxOSAxMSAxNiA4IF4KKzQyIDEgNiA4IDE1IDEzIDExIDEzIDE1IDE4IDExIDIwIDE3IDIwIDQgMTYgMTAgMTQgMSA0IDE2IDQgMTcgOCAzIDcgNyAxOCAxNiAyMCAKKzIgOSA5IDQgMjAgNyAxNiA0IDExIDQgMTAgNiAyMCA0IF4KKzQxIDAgMTcgNiAxOSAxNyAyIDE1IDYgNSA3IDQgOCAxMSAxNiA5IDEwIDE1IDIwIDEyIDE1IDggNiAxNyA1IDkgMyAzIDQgMTkgMjAgMTIgCis1IDE5IDIxIDUgMjEgMTEgMTQgMTkgMSAxNyA2IF4KKzM5IDAgOSA0IDE5IDMgMTcgMSAxNCAyMSAxNCA3IDYgNSAyMCAxNCAyMSAyMCA0IDYgMjEgNyAxMSAyMCAxMiA5IDExIDYgMTYgMTggMTggCisxMCAxMSAyMCA2IDEyIDExIDUgNyAyMSAzIF4KKzQzIDEgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAzIDUgMTMgMSA4IDEyIDMgMTMgOSA3IDEwIDE3IDEwIDYgOCAzIDE3IDE4IDMgCisyMSAxOSA2IDE3IDE1IDQgOSAxNSA5IDE1IDE0IDQgMTggXgorNDUgMSAxNCA4IDEwIDEzIDQgMTEgMTAgNyA2IDIxIDEgMTQgNSAxMSA3IDcgMiAxMyAxMyAzIDkgMTMgOCAxNCA5IDMgNyAxOCA0IDkgOSAKKzUgMTUgMTMgMTcgMTAgMTUgMTYgMjAgOCAxOSA5IDEwIDkgMTMgXgorNDAgMSAxOSAxNCAyMSAyIDE4IDEzIDEwIDQgMTggMTYgNCAyMSAxNSAxMCAxOCAxOSAzIDEyIDEyIDE0IDQgMTMgMTEgMSAxMSAxIDEwIAorMiAxMiA0IDIxIDEwIDIxIDE4IDkgMiAxNiA3IDIwIDcgXgorNDEgMCA3IDEyIDE5IDIwIDEgMTMgMTIgMTAgOCAyMSAxNSA3IDE5IDEzIDYgOCAxOSAyMCAxOCAyIDEyIDE0IDMgMTAgNiAyIDYgMiAxNyAKKzE2IDIgNSAyMSA1IDE3IDE5IDcgOCAxMSAxMCAyMSBeCiszNSAwIDE3IDE0IDE4IDE1IDE2IDE2IDE2IDEyIDIwIDEzIDIgNSA1IDIgMTAgMjAgMTYgMTIgMTAgMiAxNyAyMSAyMCAxNSAxNCAxNCAKKzE4IDIxIDEzIDkgMTcgMjEgMiAxMiAxMCBeCis0MCAwIDE3IDMgOSAxOSA1IDcgMTAgNSAxMSAxNyAxOCAxNCAxNCAxMiAyIDIwIDE1IDggMTcgMyAyMCAxMSAxMiAxOCA3IDEyIDcgOSA4IAorMyAxOCAxNCAzIDUgMTcgOSAxOCA4IDIxIDIwIF4KKzQ2IDEgOCA4IDE2IDIxIDEyIDUgOCA3IDIwIDEwIDE0IDcgMSA5IDUgNCA1IDIgMjEgMTIgMSAxIDkgMjAgMTQgMTEgOSAxOSAxNiAzIDEgCisxNCAxMCAyIDggMjAgMTggNyA4IDE1IDIgMTkgNiAxMSAxOCAxMCBeCis0NCAxIDE1IDYgNSAxNiAxNCA5IDcgMjEgMyAxNSAyMSAxNiA4IDcgMyA2IDE0IDE3IDE3IDUgMTAgMjAgMTAgMTUgMTAgMSAxNSAxOCA2IAorMTAgOSA3IDE2IDE0IDExIDE1IDEyIDIgOSAxIDEgNiA2IDE5IF4KKzM4IDEgOCAyMCA2IDE4IDggNSA4IDEgMSAxNyAyMCAyMCAxOSAxNyAxMyAxNCAxNyAxMiA1IDMgMTggMjAgMjAgMTEgMTggMTUgMTMgMTYgCisxMyA3IDEwIDEgMTkgMTAgNyAxNyA3IDE1IF4KKzUwIDAgMyA4IDQgNCAxNSAxNyAxMyA5IDExIDIgMiAxMSA3IDEzIDQgMTcgNyAxIDUgMTMgMTkgMTYgNSAxNCAxNiAyIDExIDE4IDUgMTEgCis2IDQgNyAzIDE3IDIgMSAxOCAxMyAyMSAxOCAzIDUgMTYgNiAxMSAyIDggOCAxOCBeCis0MiAxIDE0IDEzIDIxIDYgMTQgMTIgNiAxMiAxOSAxNCAzIDE2IDMgMiA3IDExIDE0IDggMTYgMTAgMTkgMTIgMTkgNCA1IDYgMTMgMTkgCisxMiAxMyA3IDUgMTIgNCAxMyAyMSAyIDUgMTcgMTUgMTUgMTIgXgorNDUgMSAxMyA1IDIxIDYgNCAxMiAxNCAxNSA1IDE4IDEyIDEgMTkgMiAxNCAxIDggOCAxMSA2IDIwIDEwIDMgMjEgOCAyMCAyIDQgMSAxNiAKKzExIDEgNSAzIDggMTYgMTUgOCAxMiAxNCAyMCAxNiAxOCA3IDE4IF4KKzQ2IDAgMTggMiAxOCAxOSA3IDQgMTkgMyAxIDIwIDcgMTUgMSA0IDUgMTIgMTAgMTkgNiAxMSA0IDQgOSAyMCAyMCA4IDIgMjAgMyAxOSAKKzIgOCA0IDE1IDcgMiAyIDYgMTggMjAgMTYgMSAxOCAxNyAxMyAxNCBeCis0MyAxIDE0IDIgMSAyIDEwIDE0IDE5IDEyIDkgMTUgMjAgMSA3IDE1IDE3IDcgMTIgMTggMSAxNSAxNCA4IDIxIDIxIDE5IDcgMjAgMTAgCisxMSAxMCAxIDkgMjEgNyA1IDEgMTIgMTUgMiA5IDE3IDQgMTkgXgorNDUgMSA1IDQgMTEgMjEgMTQgMTMgMyAyMCAyMSAxIDMgMTIgMTggMTEgNCAxNCAyMCA1IDMgMTQgMTMgMTUgOSAyMSAxMSAxOSA4IDEgNSAKKzkgNSA5IDE2IDE3IDkgNiAxMiA2IDE2IDcgNCAzIDEgMjEgMTUgXgorMzUgMCAxOSAxNSAxOCAxNyAxNyAxNyAyMSAxMyAyMCA5IDYgNiA5IDEgMTMgMTcgMjEgMSA5IDE2IDExIDEyIDEzIDE4IDE5IDE5IDE1IAorMTIgMjAgMiAxNiAxMiA5IDIxIDEyIF4KKzQ0IDEgMTYgOCAyIDE0IDYgNCAxIDYgMTYgMTUgMTkgMTkgMjEgOSAxMyAxOCAzIDE2IDggMTMgMjEgMTUgNCAyMSA0IDIgMyA4IDE1IAorMTkgOCA2IDE2IDIgMTUgMyAxMiAzIDExIDMgMTcgMTIgMjEgOSBeCis0OCAwIDMgNCAxMyAxIDEyIDQgMTAgMiA2IDcgNiA5IDEyIDIxIDEwIDEwIDExIDIgMTMgMTkgMiAxNCAxNyAxMSA4IDEwIDE5IDEgMTEgCisxMSA5IDMgMTMgMTUgNCAzIDE4IDkgMTQgNSAxNSAxOCA1IDYgMTcgMTEgMTkgMTUgXgorNDQgMCA0IDEyIDggMTggMTIgMTcgMyA0IDggNSAxOSAxNiAxNiA2IDEgMTMgMSAxOCAxIDEwIDE4IDE1IDExIDUgMSAxNyA0IDE3IDE5IAorMTEgMTggMjEgOSAyIDEwIDEwIDUgNSAyMCAxOCAxMyA1IDE1IDE4IF4KKzM5IDEgNiAzIDEwIDEwIDE2IDEzIDEzIDE0IDE2IDIwIDE5IDExIDE2IDIxIDYgOCAxNSAxMyAxMSAxMyAxNSAxOCAxMSAyMCAxNyAyMCAKKzQgMTYgMTAgMTQgMSA0IDE2IDQgMTcgOCAzIDcgMjEgXgorNDYgMSAxOCAxNiAyMCAyIDkgOSA0IDIwIDcgMTYgNCAxMSA0IDEwIDYgMjAgMTQgMTcgNiAxOSAxNyAyIDE1IDYgNSA3IDQgOCAxMSAxNiAKKzkgMTAgMTUgMjAgMTIgMTUgOCA2IDE3IDUgOSAzIDMgNCAxOSAzIF4KKzQwIDAgMTIgNSAxOSAyMSA1IDIxIDExIDE0IDE5IDEgMTcgOCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IDIxIDIwIDQgCis2IDIxIDcgMTEgMjAgMTIgOSAxMSA2IDE2IDExIF4KKzQ0IDAgMTggMTAgMTEgMjAgNiAxMiAxMSA1IDcgMjEgMTkgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAzIDUgMTMgMSA4IDEyIDMgCisxMyA5IDcgMTAgMTcgMTAgNiA4IDMgMTcgMTggMyAyMSAxOSA4IF4KKzQ3IDAgNCAxMiAyMiA1IDExIDIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggMyAxNCA4IDEzIDIgMTkgMTYgMSAxOSAxIDUgCiszIDE2IDkgOCAyMCA3IDUgMSAxMSAxNSAyIDMgMTcgMyAxMiA3IDQgMTkgXgorNDIgMCAxOCAxNiAxMyA3IDEgMTkgNSAxMiAxOCAxMiA2IDE1IDE5IDQgNCA5IDEzIDEzIDggMTcgMTMgMTggMTIgMiA4IDQgNyAxNyAxNyAKKzE0IDExIDEzIDEgMTYgMTEgMiAyMSAzIDIyIDE3IDE2IDExIF4KKzM5IDAgMTggMjIgMTIgMjAgMTcgMTMgMSA3IDEwIDcgMjAgMTEgMSA3IDggMTQgMTQgMTIgMTUgMTMgMTUgMTggMTUgMTEgMTggMSAxNyAKKzE0IDE1IDIwIDE2IDIwIDggMiAxNyAxMCA0IDIxIDIgXgorNDQgMSAxOSAxOSAxNCAyMiAyMSAxOCAxMyAxNCAxIDMgMTIgMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgOSAyMiAxOSAxMiA4IDE2IDUgCisxNyA1IDkgMSAyIDkgNiAxMiA2IDEgNyA0IDMgMTUgMSAxNCAxNiBeCis0MiAxIDEyIDMgMTAgMiAxMCAxNCAyMSAxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgMjEgMTEgMTIgMTIgOCAyMCAKKzEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiA2IDQgMTYgMTggXgorNTEgMCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIDE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgMTUgMyAxOSAKKzMgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNCAxMyBeCis0MCAxIDEwIDE5IDE3IDIxIDEyIDE1IDE3IDcgMTAgMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgMTUgOCAKKzE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIF4KKzQ1IDAgMiAxOCA0IDE2IDIwIDEyIDkgOSA2IDE2IDIxIDE2IDMgMTYgMTggMyAxOSA1IDE2IDIgNCAyIDEyIDExIDE1IDExIDE0IDE3IDIgCisxMCAxOCA1IDUgMTMgMyAyMSA1IDMgNiAxOCAxOCAxMCAxIDIxIDE1IF4KKzQ1IDEgNyAxIDEzIDEyIDE5IDEgMTQgNiA4IDIxIDE5IDIxIDExIDE5IDEzIDIgMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAKKzE1IDExIDkgMTMgMTcgMTUgOSA5IDE1IDQgMTMgMTUgOSA0IDE5IDkgXgorNDYgMCAxOCA2IDEzIDIyIDEwIDYgMTIgMiAxNyAxNSA2IDUgNyA0IDggMTEgMSA5IDEwIDggNSAyMCAxNiA2IDEwIDUgMTcgMyAzIDE5IAorMTIgMTMgMjAgNSAxMiAxNCA1IDE0IDExIDIyIDEyIDE2IDEwIDggOSAxNiBeCiszOSAwIDE1IDEyIDMgMiAxNiAyMiAxNCAyMiA3IDYgNSAxMyAyMiAxNCAxMyA0IDYgMTQgNyAxMSAxMyAyMCA5IDE5IDYgOSAxMSAxMSAKKzE4IDE5IDEzIDYgMjAgMTkgMjAgNyAyMiAxMiAxMiBeCis0MSAwIDYgMTQgMTggMTkgNyAxNyAxMiAxMCAzIDE4IDE1IDUgMjEgMTYgOCAyMCAzIDIxIDkgMTUgMTggMTAgMTUgMTAgNiA4IDE4IDIgCisxMSAzIDE0IDQgNiAxMCAxOSA5IDggMTcgOCAyMiAyMCBeCiszNiAxIDcgMjIgMTYgMTggMjEgNCAxMSAxMCAxNSA2IDIyIDE2IDIyIDUgMTkgMTUgNyA3IDIgMjEgMjEgMyAxNyAyMSAxNiAyMiA5IDMgCis3IDExIDQgMTcgMTcgMjAgMjEgMjEgXgorMzcgMSAxOCA5IDUgOCAxMiAxNyAxOCAxNyAxNiAxMiAyMiAxNCAxNyAxMSAyMSAxMCA0IDMgMSA0IDE0IDEwIDExIDQgMyAyMCAyMCAyMiAKKzE5IDIxIDE5IDE2IDE5IDE2IDEwIDE3IDE3IF4KKzQwIDEgMTkgMTQgMTggMTQgMyA5IDE3IDEgNyAxMyA2IDcgMTUgMjAgMTIgMTMgMTYgMjEgMjAgMTAgOCAyMiA3IDEyIDIxIDYgMTYgNCAKKzEzIDExIDIgMTIgMTUgMjIgMyAxOCA2IDE3IDYgMjIgXgorNDIgMCAxMCA5IDIgNSAyMiA1IDEwIDQgNyA4IDE5IDEwIDIwIDEwIDIyIDExIDggMSA5IDEgMjAgMTMgMjEgMTcgNSA1IDE3IDEwIDEzIAorOSAyMCAxOCAxNyAyIDE0IDEzIDIyIDIyIDMgMTQgMjEgMTAgXgorNDYgMCAyIDE0IDIgMjAgMSAxMCAxOCA5IDEyIDUgNyAxOCAyMCAxOSAxMCAxMSAyMiA3IDEyIDIgMTMgOCA4IDIgMyAxMyAxOSAyMCAzIAorNyAyMCA3IDkgOCAzIDExIDIyIDMgNSAxMCA5IDExIDE2IDE0IDE5IDE2IF4KKzQ2IDEgMTUgOCAxIDE0IDIwIDUgOCA3IDEzIDEwIDIyIDcgMTYgOSA1IDQgNSAyIDE0IDIwIDEgMSAxNSAxNyAxMyAyMiAxOSAxNyA0IDEgCiszIDEgMjIgMTAgMTUgMTUgMiAxNiAxMyAxMSA3IDE2IDE3IDEyIDYgMjAgXgorNDAgMSAzIDE5IDggNiA1IDkgMTUgMjIgMTcgNyAxNCAxOCAxNCA5IDE2IDcgMTggMTQgMjIgMiAyIDUgMTggMTMgMTggOCAxOCAxNiA4IAorMTEgMTUgNiAxOCA5IDcgOSAyMiAxOSAyMCAxNSBeCis0NCAwIDkgMTYgMTYgNiA2IDIxIDggMTMgNiAxMSA4IDUgMTYgMTYgMSAxMCAxMyAxMyA0IDEwIDIxIDIyIDE1IDEwIDIwIDUgMyAzIDEzIAorMTUgMTMgMTEgMTEgMTUgMjEgMSAyMSA3IDEwIDEgMTIgMTggNyAyMCBeCis1MSAwIDcgMSAxOCA4IDQgMTkgMiAyMSAxNyAxOSAyIDIgMTkgNyAyMSAxOSAyIDcgMTUgMTUgMTYgNSAyMSAxMiAxIDUgMjIgMSAxNyAKKzE5IDExIDUgMTEgNiA0IDcgMyAxMCAyIDEgMyA2IDE0IDExIDE4IDUgMSA2IDExIDE3IDggXgorMzkgMSA4IDE1IDIyIDIxIDE0IDYgMjIgMjAgNiAyMCAxMiAyMiAxOCAxIDMgMiA3IDE5IDIyIDggOSAxOCA0IDIwIDEyIDQgNSA2IDIxIAorMTIgMjAgMjEgNyA1IDIwIDQgMjEgMTQgMTQgXgorNDUgMCAxNSA1IDIgMTYgMTUgMjEgNSAxNCAxNSA2IDQgMTIgMjIgNSAxMSAyMCAxNiAxNSA0IDE3IDIyIDEgOCAxNiAxMSA2IDEzIDE4IAorMyAxNCA4IDEzIDIgMTkgMTYgMSAxOSAxIDUgMyAxNiA5IDggMjAgMTQgXgorNDggMSA1IDEgMTEgMTUgMiAzIDE3IDMgMTIgNyA0IDEyIDE4IDE2IDEzIDcgMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgCisxMyA4IDE3IDEzIDE4IDEyIDIgOCA0IDcgMTcgMTcgMTQgMTEgMTMgMSAxNiAxMSAyMiBeCiszOCAwIDIxIDMgMjIgMTcgMTYgMTcgMTggMjIgMTIgMjAgMTcgMTMgMSA3IDEwIDcgMjAgMTEgMSA3IDggMTQgMTQgMTIgMTUgMTMgMTUgCisxOCAxNSAxMSAxOCAxIDE3IDE0IDE1IDIwIDE2IDEwIF4KKzQzIDAgOCAyIDE3IDEwIDQgMjEgNSAxOSAxOSAxNCAyMiAyMSAxOCAxMyAxNCAxIDMgMTIgMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgOSAKKzIyIDE5IDEyIDggMTYgNSAxNyA1IDkgMSAyIDkgNiAxMiAyMiBeCis0NyAxIDEgNyA0IDMgMTUgMSAxNCAxIDEyIDMgMTAgMiAxMCAxNCAyMSAxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgCisyMSAxMSAxMiAxMiA4IDIwIDEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiAyMCBeCis1MyAwIDQgMTYgMTQgMTUgMSAxMiA0IDE0IDkgMjEgMyAzIDkgOCAyMSAxNSAxNCA4IDQgMTQgNCAyIDMgOCAxMiA4IDYgMSAyIDE4IDIwIAorMTUgMyAxOSAzIDEwIDIwIDE0IDYgMyA0IDIxIDEgMTIgNCAxOCAyIDYgNyA2IDkgMjAgMTUgXgorNDIgMSAxMCAxMCAxOSAxNyAyMSAxMiAxNSAxNyA3IDEwIDExIDggMTAgMTIgMSAxOSAxOSA5IDE4IDIxIDQgMTggMTEgOSAyMiA1IDE1IAorOCAxNSAzIDUgNiAyIDE5IDEyIDE3IDQgMjAgOCAxMSAyMCAxMiBeCis0NSAwIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAxOCAzIDE5IDUgMTYgMiA0IDIgMTIgMTEgMTUgMTEgMTQgMTcgMiAKKzEwIDE4IDUgNSAxMyAzIDIxIDUgMyA2IDE4IDE4IDEwIDEgMjEgMjEgMTggXgorNDUgMCAxIDEzIDEyIDE5IDEgMTQgNiA4IDIxIDE5IDIxIDExIDE5IDEzIDIgMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAxNSAKKzExIDkgMTMgMTcgMTUgOSA5IDE1IDQgMTMgMTUgOSA0IDE5IDE5IDE5IF4KKzQ5IDAgNiAxMyAyMiAxMCA2IDEyIDIgMTcgMTUgNiA1IDcgNCA4IDExIDEgOSAxMCA4IDUgMjAgMTYgNiAxMCA1IDE3IDMgMyAxOSAxMiAKKzEzIDIwIDUgMTIgMTQgNSAxNCAxMSAyMiAxMiAxNiAxMCA4IDkgNCAxNSAxMiAzIDIyIF4KKzM5IDAgMTYgMjIgMTQgMjIgNyA2IDUgMTMgMjIgMTQgMTMgNCA2IDE0IDcgMTEgMTMgMjAgOSAxOSA2IDkgMTEgMTEgMTggMTkgMTMgNiAKKzIwIDE5IDIwIDcgMjIgMTIgMTEgNiAxNCAxOCAxNyBeCis0MyAxIDcgMTcgMTIgMTAgMyAxOCAxNSA1IDIxIDE2IDggMjAgMyAyMSA5IDE1IDE4IDEwIDE1IDEwIDYgOCAxOCAyIDExIDMgMTQgNCA2IAorMTAgMTkgOSA4IDE3IDggMjIgNCA3IDIyIDE2IDE4IDIxIDExIF4KKzM5IDAgMTEgMTAgMTUgNiAyMiAxNiAyMiA1IDE5IDE1IDcgNyAyIDIxIDIxIDMgMTcgMjEgMTYgMjIgOSAzIDcgMTEgNCAxNyAxNyAyMCAKKzIxIDEwIDE4IDkgNSA4IDEyIDE3IDE4IDE3IDE3IF4KKzQwIDEgMTIgMjIgMTQgMTcgMTEgMjEgMTAgNCAzIDEgNCAxNCAxMCAxMSA0IDMgMjAgMjAgMjIgMTkgMjEgMTkgMTYgMTkgMTYgMTAgMTcgCisyMCAxOSAxNCAxOCAxNCAzIDkgMTcgMSA3IDEzIDYgMTggXgorNDQgMSAxNSAyMCAxMiAxMyAxNiAyMSAyMCAxMCA4IDIyIDcgMTIgMjEgNiAxNiA0IDEzIDExIDIgMTIgMTUgMjIgMyAxOCA2IDE3IDYgMiAKKzEwIDkgMiA1IDIyIDUgMTAgNCA3IDggMTkgMTAgMjAgMTAgMjIgNyBeCis0MyAwIDggMSA5IDEgMjAgMTMgMjEgMTcgNSA1IDE3IDEwIDEzIDkgMjAgMTggMTcgMiAxNCAxMyAyMiAyMiAzIDE0IDIxIDkgMiAxNCAyIAorMjAgMSAxMCAxOCA5IDEyIDUgNyAxOCAyMCAxOSAxMCAxMSAxOSBeCis1MyAxIDcgMTIgMiAxMyA4IDggMiAzIDEzIDE5IDIwIDMgNyAyMCA3IDkgOCAzIDExIDIyIDMgNSAxMCA5IDExIDE2IDE0IDE5IDggMTUgCis4IDEgMTQgMjAgNSA4IDcgMTMgMTAgMjIgNyAxNiA5IDUgNCA1IDIgMTQgMjAgMSAxIDE1IDggXgorNDIgMCAxMyAyMiAxOSAxNyA0IDEgMyAxIDIyIDEwIDE1IDE1IDIgMTYgMTMgMTEgNyAxNiAxNyAxMiA2IDE5IDMgMTkgOCA2IDUgOSAxNSAKKzIyIDE3IDcgMTQgMTggMTQgOSAxNiA3IDE4IDE0IDIyIDE5IF4KKzQzIDAgMiA1IDE4IDEzIDE4IDggMTggMTYgOCAxMSAxNSA2IDE4IDkgNyA5IDIyIDE5IDIwIDE3IDkgMTYgMTYgNiA2IDIxIDggMTMgNiAKKzExIDggNSAxNiAxNiAxIDEwIDEzIDEzIDQgMTAgMjEgMjIgMTQgXgorNDggMCAxMCAyMCA1IDMgMyAxMyAxNSAxMyAxMSAxMSAxNSAyMSAxIDIxIDcgMTAgMSAxMiAxOCA3IDIgNyAxIDE4IDggNCAxOSAyIDIxIAorMTcgMTkgMiAyIDE5IDcgMjEgMTkgMiA3IDE1IDE1IDE2IDUgMjEgMTIgMSA1IDIxIF4KKzQ5IDEgMSAxNyAxOSAxMSA1IDExIDYgNCA3IDMgMTAgMiAxIDMgNiAxNCAxMSAxOCA1IDEgNiAxMSAxNyA4IDggMTUgMjIgMjEgMTQgNiAKKzIyIDIwIDYgMjAgMTIgMjIgMTggMSAzIDIgNyAxOSAyMiA4IDkgMTggNCAyMCAxMCBeCis0NSAxIDQgNSA2IDIxIDEyIDIwIDIxIDcgNSAyMCA0IDIxIDE0IDIgMTUgNSAyIDE2IDE1IDIxIDUgMTQgMTUgNiA0IDEyIDIyIDUgMTEgCisyMCAxNiAxNSA0IDE3IDIyIDEgOCAxNiAxMSA2IDEzIDE4IDMgMTQgMTMgXgorNTIgMCAxMyAyIDE5IDE2IDEgMTkgMSA1IDMgMTYgOSA4IDIwIDcgNSAxIDExIDE1IDIgMyAxNyAzIDEyIDcgNCAxMiAxOCAxNiAxMyA3IAorMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgMTMgOCAxNyAxMyAxOCAxMiAyIDggMTUgXgorNDYgMCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTIgMjEgMjIgMSAxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggCisxNiA3IDkgMTggMTEgMTEgMTcgMjAgMiA3IDEwIDIwIDggMTAgMTYgMTQgMTQgXgorNDEgMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxNSAxOSAxOSAxMSAyMiAxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgCisxNSAxMCA5IDEzIDE4IDE0IDIyIDggNiAxOCAxNiAxNSAxNCAyMCBeCis0MyAxIDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMTcgNyAyMSAyMyAxMiAyMyAxMSAxMyAyIDE0IDE0IDE2IDEzIAorMTIgMTEgNSAxNCAzIDggNCAxMyA4IDE3IDE3IDE4IDE3IDIgMTIgMjIgXgorNDMgMSAxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAxMyAyMSAyMSAzIDE4IDEzIDIwIDExIDE4IAorMTkgMTEgNiAxIDEwIDE4IDcgMTcgNSAxNiAxIDcgMTAgNCAyMCAyMiBeCis0NiAwIDggMTAgMTIgNCAxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAxMyA2IDIwIDEgOSAxMiA4IDUgCisyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCA5IDE1IDIwIDIwIF4KKzQ2IDAgMjAgMjEgMTUgMTIgMTkgMTcgMSA2IDQgNSA4IDQgMTIgMTAgNiA1IDQgMTcgMyAzIDE2IDEzIDUgMjEgMTYgMTAgMjEgMTggMTkgCisxNSAxNiAxMiA2IDEyIDE3IDggNyA4IDExIDE0IDEgMjMgMTAgMTUgMTUgMTMgXgorNDMgMCAyMSAxMyAxNSAxOCAyMSAxMCAxMCAyMyAzIDEzIDEzIDkgMTYgMiAxNyAxOSAzIDIyIDExIDUgMTggMTkgMTMgNyA3IDggMTkgMiAKKzEyIDIgMTkgMTYgMjMgOSAxNiA2IDMgMTkgMTIgNSAxMCA5IDE3IF4KKzQ3IDAgMjEgMyAyIDEgNyAxNCAxNCA3IDYgMiAyMCAzIDYgMTkgMTkgMTAgMiAyMiAxMiAxNyAxMiAxIDIwIDcgNyAxNSAyMCA2IDE4IDggCiszIDE0IDIzIDE4IDE1IDQgNyA1IDIzIDE1IDcgMTQgMTAgMTAgMTkgMTcgMTEgXgorNDQgMCA0IDE1IDE3IDExIDE1IDExIDggOSAxNyA1IDEyIDE4IDE0IDYgMjAgMTcgMjEgMTIgMTYgOSAyMiA5IDIwIDE1IDIgMjIgMTEgMiAKKzYgMTEgOSA4IDIgNCAxNCAxOSAzIDIxIDIxIDIzIDggMiAxMSAxNSBeCiszNyAwIDggNCAyMCAyMiA2IDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgCisxMiAyMCAyMyAxOCAxMCAxMiA4IDIxIDExIDE5IF4KKzM5IDAgMTIgNyAxOSAxNCAxOCAxNCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAKKzEzIDEwIDE0IDEzIDUgMjIgMTQgMjEgOSAyMSAzIF4KKzQ1IDEgMTQgMTQgNCAxOCAxMyAxMiAyMyA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSAKKzcgMjMgOCA2IDIxIDQgNCAyMiAxOSAxMyA4IDUgMTkgNyA1IDIzIDMgXgorNTAgMSA0IDE5IDExIDIzIDExIDIxIDE0IDEgMyAyMCAyIDIwIDcgNCAxNyAyIDUgMTMgNCAyMyA1IDIyIDcgNyA5IDE3IDEzIDUgNiAyIAorMjEgMSAxNyA3IDkgMjEgMjMgMSAxIDEyIDMgMSAxNSAyMiA0IDEyIDYgMjAgNSAyMyBeCis0NiAxIDIzIDQgMTIgMjIgOCAxOCAxNiAzIDE2IDQgMiAxMyAxIDE1IDE1IDEgMjMgMiAzIDQgMTAgMSAxMiA3IDExIDIgNyAyMiAyMiAKKzIxIDIyIDEzIDMgMTIgMjIgMTIgNCAzIDIzIDEwIDE0IDE3IDE1IDkgMjMgMjAgXgorNDQgMCAxOSAxMiAyMSAyMiA5IDE3IDEyIDIgMTggMTggMTIgMjEgMiAxOSA0IDIxIDIwIDQgOSAxNCA1IDIxIDggMjIgMTAgMTUgMjMgCisxNCA4IDUgMTEgMTkgNSA3IDUgMyAxMSA0IDE1IDE4IDkgMiAyMyA0IF4KKzQ2IDAgOSAxNiAxNCAxNSA2IDE1IDEgMTEgNCAxNiAxNiAyMCAxNCAyIDkgMTkgMTQgNiAzIDcgMTAgMTYgMjIgMjMgNyA3IDEyIDUgMiAKKzggOSA1IDcgMSAxNyAxOSAyMSAxOSAxOCAxNSAzIDIwIDIyIDE0IDkgMTYgXgorNDQgMSAxMCAxOCAxMSAzIDUgOSAxMCAxMSAyMiAxMiAxMiAxNSAyMyAyIDEwIDE4IDIzIDUgMTggMjEgMjAgMjMgMyA5IDMgMjIgNyA4IAorNyA0IDEgMTQgMTYgMTYgMTMgMTggMiAyMSAxOCAxNSA1IDUgMTYgMjEgXgorNDYgMCAyIDIgNiAyMyAxMyAyMiAyMCAxMiAxNyA0IDEwIDIxIDIgMjAgMiA4IDggNyAyMCAxMyAzIDIwIDIzIDE2IDYgMjMgOSAxMiAyMCAKKzMgMTAgNSA2IDE5IDE4IDEyIDEzIDE0IDggMSAxIDggOSAxMyAxOSAyMyBeCis0NyAwIDkgMjAgMjAgNSAxNSAxMyAxNyAzIDE1IDIyIDMgMSAxOSA4IDE1IDggMTkgOSAyMSA3IDEyIDEgMTYgMjEgMTEgOCAxMCAxNSAKKzE2IDggMSA1IDUgMjAgMjIgMTMgMTEgMjIgNCA0IDcgNiAyMiAxMCAzIDIxIDQgXgorNDUgMSA5IDE5IDIyIDE4IDMgMjMgNiA0IDYgMTkgMTUgMTMgMTcgNCAxMyA5IDE1IDQgNiA3IDEzIDExIDEgMjAgMTUgMTIgMTggMTggCisxNiA3IDEzIDQgMTEgNyAxMSA2IDE3IDkgMTggMTUgMjEgMTcgNSAyMCAxMSBeCis0OSAwIDEgMjIgMTYgMTggNSA4IDExIDIgMjMgMTAgMTEgNSAyIDEgMTkgMTYgMyAxOSAxNiAxNSAyMSA1IDMgNyAxOCA0IDkgMTUgMyA4IAorMjAgMSAyMSAxIDIxIDE3IDkgNiAxNyAxMCAxNiAyIDkgNyAxNiAxOSAxNSAxNyA5IF4KKzUxIDAgMTcgMjAgMTkgNiA2IDE0IDIgMiA1IDEgMiAxMCAxNyAxIDE4IDYgMTggMjAgMSAxIDExIDIxIDIgMyAxNiA4IDEyIDIxIDIyIDEgCisxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggMTYgNyA5IDE4IDE3IF4KKzQ1IDEgMTEgMTcgMjAgMiA3IDEwIDIwIDggMTAgMTYgMTQgMTEgMjAgNCAxNiA0IDE4IDEgMTQgMTIgMTkgMTMgMTUgMTkgMTkgMTEgMjIgCisxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgMTUgMTAgOSAxMyAxOCA4IF4KKzQ0IDAgMjIgOCA2IDE4IDE2IDE1IDE0IDE1IDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMTcgNyAyMSAyMyAxMiAKKzIzIDExIDEzIDIgMTQgMTQgMTYgMTMgMTIgMTEgNSAxNCAzIDggNCAxMyAyMCBeCis0MyAwIDE3IDE3IDE4IDE3IDIgMTIgMyAxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAxMyAyMSAKKzIxIDMgMTggMTMgMjAgMTEgMTggMTkgMTEgNiAxIDEwIDE4IDcgMTcgMjAgXgorNTAgMSAxNiAxIDcgMTAgNCAyMCAxMCA4IDEwIDEyIDQgMTEgMjEgNiAxMyAxNiAxNyA2IDIzIDEgOSAxNCA0IDExIDIzIDIzIDE5IDEgCisxMyA2IDIwIDEgOSAxMiA4IDUgMjMgMTcgMTYgOCA4IDMgMTAgMTMgNyA2IDEwIDggMTQgMTcgXgorNDYgMSAxNSAyMCAxOCAyMCAyMSAxNSAxMiAxOSAxNyAxIDYgNCA1IDggNCAxMiAxMCA2IDUgNCAxNyAzIDMgMTYgMTMgNSAyMSAxNiAxMCAKKzIxIDE4IDE5IDE1IDE2IDEyIDYgMTIgMTcgOCA3IDggMTEgMTQgMSAyMyAyMSBeCis0NSAwIDE1IDE1IDIgMjEgMTMgMTUgMTggMjEgMTAgMTAgMjMgMyAxMyAxMyA5IDE2IDIgMTcgMTkgMyAyMiAxMSA1IDE4IDE5IDEzIDcgCis3IDggMTkgMiAxMiAyIDE5IDE2IDIzIDkgMTYgNiAzIDE5IDEyIDUgMTAgMTUgXgorNDggMSAyMCAyMSAzIDIgMSA3IDE0IDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgCisxOCA4IDMgMTQgMjMgMTggMTUgNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAxMiBeCis0NyAwIDQgMTUgMTcgMTEgMTUgMTEgOCA5IDE3IDUgMTIgMTggMTQgNiAyMCAxNyAyMSAxMiAxNiA5IDIyIDkgMjAgMTUgMiAyMiAxMSAyIAorNiAxMSA5IDggMiA0IDE0IDE5IDMgMjEgMjEgMjMgOCAyIDExIDQgOCA0IDIwIF4KKzM5IDAgMjIgNiAyMSAxOCAyMiAxMCAxOSA5IDE0IDE3IDIzIDIxIDEwIDcgMTUgMTMgMTYgNSA0IDEwIDEzIDE0IDIwIDIzIDEyIDIwIAorMjMgMTggMTAgMTIgOCAyMSAxMSA2IDEyIDcgMTkgMTQgMTQgXgorNDAgMCAxNCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAxMyAxMCAxNCAxMyA1IAorMjIgMTQgMjEgOSAyMSAxOSAxNCAxNCA0IDE4IDEzIDEyIF4KKzQ2IDAgMjMgNyAzIDE1IDUgMTcgMTQgMjMgMTQgNSAxNyAyMiAxMSAxIDggMTMgMjMgNiAyMSAzIDYgMTEgNyAyMyA4IDYgMjEgNCA0IAorMjIgMTkgMTMgOCA1IDE5IDcgNSAyMyAxIDQgMTkgMTEgMjMgMTEgMjEgOSBeCis1MiAwIDEgMyAyMCAyIDIwIDcgNCAxNyAyIDUgMTMgNCAyMyA1IDIyIDcgNyA5IDE3IDEzIDUgNiAyIDIxIDEgMTcgNyA5IDIxIDIzIDEgCisxIDEyIDMgMSAxNSAyMiA0IDEyIDYgMjAgNSAxOSAyMyA0IDEyIDIyIDggMTggMTYgMyAyMiBeCis0OCAwIDQgMiAxMyAxIDE1IDE1IDEgMjMgMiAzIDQgMTAgMSAxMiA3IDExIDIgNyAyMiAyMiAyMSAyMiAxMyAzIDEyIDIyIDEyIDQgMyAKKzIzIDEwIDE0IDE3IDE1IDkgMjMgNCAxOSAxMiAyMSAyMiA5IDE3IDEyIDIgMTggMTggOSBeCis0NiAwIDIxIDIgMTkgNCAyMSAyMCA0IDkgMTQgNSAyMSA4IDIyIDEwIDE1IDIzIDE0IDggNSAxMSAxOSA1IDcgNSAzIDExIDQgMTUgMTggCis5IDIgMjMgMjIgOSAxNiAxNCAxNSA2IDE1IDEgMTEgNCAxNiAxNiAyMCAyMiBeCis0NyAwIDIgOSAxOSAxNCA2IDMgNyAxMCAxNiAyMiAyMyA3IDcgMTIgNSAyIDggOSA1IDcgMSAxNyAxOSAyMSAxOSAxOCAxNSAzIDIwIDIyIAorMTQgOSAxMSAxMCAxOCAxMSAzIDUgOSAxMCAxMSAyMiAxMiAxMiAxNSAyMyAyMiBeCis0NSAwIDEwIDE4IDIzIDUgMTggMjEgMjAgMjMgMyA5IDMgMjIgNyA4IDcgNCAxIDE0IDE2IDE2IDEzIDE4IDIgMjEgMTggMTUgNSA1IDE2IAorMTIgMiAyIDYgMjMgMTMgMjIgMjAgMTIgMTcgNCAxMCAyMSAyIDIwIDE5IF4KKzQ3IDAgOCA4IDcgMjAgMTMgMyAyMCAyMyAxNiA2IDIzIDkgMTIgMjAgMyAxMCA1IDYgMTkgMTggMTIgMTMgMTQgOCAxIDEgOCA5IDEzIAorMTkgMTIgOSAyMCAyMCA1IDE1IDEzIDE3IDMgMTUgMjIgMyAxIDE5IDggMTUgMjMgXgorNDggMCAxOSA5IDIxIDcgMTIgMSAxNiAyMSAxMSA4IDEwIDE1IDE2IDggMSA1IDUgMjAgMjIgMTMgMTEgMjIgNCA0IDcgNiAyMiAxMCAzIAorMjEgMSA5IDE5IDIyIDE4IDMgMjMgNiA0IDYgMTkgMTUgMTMgMTcgNCAxMyA5IDE3IF4KKzQ5IDEgNCA2IDcgMTMgMTEgMSAyMCAxNSAxMiAxOCAxOCAxNiA3IDEzIDQgMTEgNyAxMSA2IDE3IDkgMTggMTUgMjEgMTcgNSAyMCA2IDEgCisyMiAxNiAxOCA1IDggMTEgMiAyMyAxMCAxMSA1IDIgMSAxOSAxNiAzIDE5IDE2IDE1IDE4IF4KKzU1IDEgNSAzIDcgMTggNCA5IDE1IDMgOCAyMCAxIDIxIDEgMjEgMTcgOSA2IDE3IDEwIDE2IDIgOSA3IDE2IDE5IDE1IDE3IDEwIDE3IAorMjAgMTkgNiA2IDE0IDIgMiA1IDEgMiAxMCAxNyAxIDE4IDYgMTggMjAgMSAxIDExIDIxIDIgMyAxNiA4IDE3IF4KKzQ3IDAgMjEgMjIgMSAxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggMTYgNyA5IDE4IDExIDExIDE3IDIwIDIgNyAKKzEwIDIwIDggMTAgMTYgMTQgMTEgMjAgNCAxNiA0IDE4IDEgMTQgMTIgMTkgMTMgMTkgXgorNDUgMSAxOSAxOSAxMSAyMiAxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgMTUgMTAgOSAxMyAxOCAxNCAyMiA4IDYgMTggMTYgCisxNSAxNCAxNSAxNCAzIDEyIDE0IDE3IDExIDMgOSAxOSAxMCAyMCAxNiAxMSAzIDIxIF4KKzQ3IDEgNyAyMSAyMyAxMiAyMyAxMSAxMyAyIDE0IDE0IDE2IDEzIDEyIDExIDUgMTQgMyA4IDQgMTMgOCAxNyAxNyAxOCAxNyAyIDEyIDMgCisxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAyMCBeCis0NyAxIDIxIDIxIDMgMTggMTMgMjAgMTEgMTggMTkgMTEgNiAxIDEwIDE4IDcgMTcgNSAxNiAxIDcgMTAgNCAyMCAxMCA4IDEwIDEyIDQgCisxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAxMyAyMiBeCis1MSAwIDIwIDEgOSAxMiA4IDUgMjMgMTcgMTYgOCA4IDMgMTAgMTMgNyA2IDEwIDggMTQgOSAxNSAyMCAxOCAyMCAyMSAxNSAxMiAxOSAKKzE3IDEgNiA0IDUgOCA0IDEyIDEwIDYgNSA0IDE3IDMgMyAxNiAxMyA1IDIxIDE2IDEwIDIxIDIxIF4KKzUyIDAgMTUgMTMgNCA4IDEyIDIyIDkgNiAzIDEgMTMgMTYgMTIgMjMgMTAgMTQgMiAxIDYgMTEgOCAxOSAyNCAxNiAyIDUgMjEgMiA3IAorMjIgNCA1IDIzIDMgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDIxIF4KKzUxIDEgMTAgMjEgNCA4IDI0IDIgNiAxOSAxMCA2IDIyIDIyIDE0IDIyIDEzIDIxIDUgMjIgMiA0IDE4IDUgMTEgMjEgMSA3IDggNCAxNyAKKzUgMTQgMSAyIDEwIDkgMTIgNSAxMSAxMCAyMCA0IDE0IDMgMSAzIDIxIDEyIDExIDE3IDIyIDIxIF4KKzQzIDEgNyA1IDIxIDE0IDE1IDE5IDIwIDEyIDYgMTIgMTggMTkgNCA3IDEyIDEwIDUgMjIgMyAxNSAyMSA3IDIzIDcgMiAyMiA0IDE4IAorMTggMyAyNCAxMCAxNyAyNCAyMyAxOCA2IDExIDE4IDIyIDggNiAyMCBeCis0NSAwIDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIDE0IDE3IDkgMTYgNyAyMSA2IDIyIDI0IDE5IDExIDkgMTkgMjEgMTUgMTEgMTkgCisyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIxIDIxIDIyIDEzIF4KKzUwIDEgMTcgOSA0IDI0IDIxIDE1IDE1IDE2IDE2IDEzIDkgMTAgMTYgMTQgMTIgNyAxMiAxNSAxNSA1IDEwIDEwIDIzIDUgMTMgMjIgMyAKKzUgMSA0IDExIDE0IDcgNiAxMCAxNyAxNCA2IDMgMTMgMTggMTYgMyA1IDE1IDIzIDggNSAzIDIyIF4KKzQ3IDAgOCAxMiAyMCAyMCA5IDIgMTMgMjQgMTcgMiAyIDE3IDMgMTMgMjAgMiA2IDMgMTUgNyAxMyAxIDE4IDcgMjIgMTggMjQgMjAgMTQgCis3IDE3IDE2IDIwIDMgMTEgNiA1IDIgMTggMTQgMTYgMjIgMTQgMTEgNyAxOCAyMiBeCis0OCAxIDE3IDI0IDEyIDEyIDMgMTMgMTkgMTYgMjIgNCAxNiA0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAyMSA4IDIzIDEgMjMgMjAgCis3IDE2IDEzIDIzIDQgMTMgMyA3IDQgMjMgNiAxMyAxOSAyIDMgNyAyIDkgOSAxOSBeCis0NSAxIDYgMTMgNCAyMiA2IDE5IDIwIDEgOSA3IDE0IDEgMTUgMyAyMyAyNCAyMiAxOCAxMiAxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIAorMiAyMCAxNSAxOCAxNyAxOCA3IDExIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDE4IF4KKzQ0IDAgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTUgMTAgNiAxOCAyMCA3IDEgOCAxIDE2IDYgMjAgMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgCisxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAxOSAxNCAxMCAxOCAxNSAxNCAxMiBeCis1MCAxIDE2IDExIDIyIDIgMTUgMjQgOCAyMiAxIDQgMjQgOSAxMCAxNSAzIDkgNSA0IDE3IDE1IDkgMTIgMTkgMTkgMSAzIDEwIDYgOCAzIAorMTcgOCAxOCAyNCAxOSAzIDQgMTUgNCA5IDIgMjQgNSAyMCAxMyA3IDIwIDE3IDE5IDExIF4KKzQzIDAgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAyMiAxNyAyMyAxMiAxNSA0IDI0IDcgMjEgMTggCisyIDIxIDE2IDEgMTkgMTggMjAgMTEgMyAxNSAxOSAxOCAxIDYgMTQgMTUgXgorNDUgMCA1IDUgMTkgMTMgMTAgMjQgMTkgMTYgMjQgMTUgMTMgMiAxOSAxNSAyNCAyMSAxNyA0IDEzIDE3IDEgMSA5IDEgMTAgMiAxOCAxIAorMjEgMTkgNSAxOCAxMiAyIDIyIDE2IDIzIDE1IDE5IDYgMTggOSAxIDIzIDIwIF4KKzQ5IDAgMjEgMTMgMTQgMTEgMTggMTIgMTMgMyAxOSA5IDIwIDIyIDIwIDIgMTEgMTIgNiAxIDEyIDE2IDE4IDIgOSA4IDQgMyAxMSAxNyAKKzExIDUgNCAxOSAxNiAxMSAyMyAxMyAxOCAxIDIwIDggMiAxNiAxNiAyMSA0IDE5IDUgNSAyNCBeCis0NiAwIDI0IDEzIDIzIDYgMjQgNSAxNyAxMiA1IDEgMTUgMTcgMTcgMjEgMTEgMTMgOSAyMyAxMSAxNCAyMSA3IDYgOSA2IDE0IDcgMTYgCisyIDE3IDEgMjQgMjMgNCAxMiAxNCA0IDIgMTEgMjMgMTIgNCAyMyAyMSAyMSA0IF4KKzQ5IDEgMTUgMTMgMTUgMTQgMTUgOCAxNCA5IDE3IDcgMTUgMiAyMyAyIDEgMTcgNiAxNCAxOSAyNCAyIDggOCA3IDcgMTAgMTQgMTMgNyAKKzkgMTEgMTYgMTEgOCA4IDE4IDEzIDEzIDE4IDEwIDEgMjAgMTggMjIgMTkgMTIgOSAxNiAxMiBeCis0MyAxIDEzIDYgOSAxNyAyMCAxMCA1IDcgMjAgMTggOCAxNSAyMyAyMSAyMCA1IDE1IDExIDMgMyAxNCAyMSAxMCAyNCA2IDIxIDIxIDYgCisyMyAxMCAzIDIxIDIzIDE3IDIwIDggMTYgMTAgMjIgNSAxNiAxIDI0IF4KKzUwIDAgMjQgMyA5IDE2IDYgNyAzIDIwIDEyIDE3IDE4IDIxIDUgOSA3IDEgOSAxMiAxOSA1IDcgNiAyNCAxMSAxMSAyMCAyMyAxMCA0IDcgCisxIDE5IDcgMTkgMTcgMjMgMTUgNSAxMiAyMSAyMCAzIDEgMTQgMiAxNSAyMiAzIDE2IDExIF4KKzQ1IDEgMTAgMTkgMTAgMjAgMTYgMTkgMTcgMTAgNCAyMSAyMCAxNiAyMSAxNCAxNCA4IDE3IDEwIDE5IDEgMTcgNCAzIDIyIDIzIDE0IAorMTYgOSAyMiA4IDIwIDI0IDEgNSAxMSAxMSA2IDQgMTMgMTUgMTIgMSAxMSAxMyAyMiBeCis0NSAwIDMgOCA1IDYgNSAxNiAxMiAxMSAyIDE3IDE0IDE5IDIzIDE2IDUgNiAyMCAyMSA5IDI0IDkgMjIgMjMgMjIgMTIgOCAxMyAyMyAKKzE3IDUgMyAxNiAyMiAxNSAyMiA3IDE3IDMgMiAxMyAxMyAxMSAyNCAxMyAxNyBeCis0MiAxIDIxIDExIDE0IDIwIDI0IDI0IDQgOSAxMyA1IDggOSAxOCA3IDEyIDEgMjEgOCAyNCAxNSAxIDIyIDE5IDI0IDE0IDEzIDggMjAgCisxNCAxOCAyMyAxOSA5IDggMTQgMjMgMTEgNCA0IDIyIDIwIDE3IF4KKzQ5IDEgMTcgMTUgMjAgNiAxNSA4IDI0IDQgMjAgMTkgOCAxOSAxNCAyMSAyNCAxOCAzIDEwIDE2IDMgNiA0IDEgMTAgMTUgMTMgNCA4IAorMTIgMjIgOSA2IDMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIzIF4KKzUwIDAgNSAyMSAyIDcgMjIgNCA1IDIzIDMgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDggMTAgMjEgNCAKKzggMjQgMiA2IDE5IDEwIDYgMjIgMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAyNCBeCis1MyAxIDIxIDEgNyA4IDQgMTcgNSAxNCAxIDIgMTAgOSAxMiA1IDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMTEgNyA1IAorMjEgMTQgMTUgMTkgMjAgMTIgNiAxMiAxOCAxOSA0IDcgMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAxOCBeCis0MyAxIDIyIDQgMTggMTggMyAyNCAxMCAxNyAyNCAyMyAxOCA2IDExIDE4IDIyIDggNiA2IDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIAorMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgMTEgOSAxOSAyMSA2IF4KKzQ5IDEgMTEgMTkgMiAyIDcgOCAxMCA4IDkgOCAxNSA5IDE0IDYgMTYgOCAyMSAyMSAyMiA2IDE3IDkgNCAyNCAyMSAxNSAxNSAxNiAxNiAKKzEzIDkgMTAgMTYgMTQgMTIgNyAxMiAxNSAxNSA1IDEwIDEwIDIzIDUgMTMgMjIgMyA1IDIyIF4KKzUyIDAgNCAxMSAxNCA3IDYgMTAgMTcgMTQgNiAzIDEzIDE4IDE2IDMgNSAxNSAyMyA4IDUgMyAxOCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAKKzE3IDIgMiAxNyAzIDEzIDIwIDIgNiAzIDE1IDcgMTMgMSAxOCA3IDIyIDE4IDI0IDIwIDE0IDcgMjMgXgorNDUgMSAxNiAyMCAzIDExIDYgNSAyIDE4IDE0IDE2IDIyIDE0IDExIDcgMTggMTYgMTcgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IAorNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgMjEgOCAyMyAxIDIzIDIwIDIzIF4KKzUxIDEgMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE1IDYgMTMgNCAyMiA2IDE5IDIwIDEgOSA3IDE0IDEgCisxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgMiAyMCAxNSAxNSBeCis0OCAxIDE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMyAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNSAxMCA2IDE4IDIwIDcgMSA4IAorMSAxNiA2IDIwIDIzIDIzIDIxIDEwIDEwIDEyIDI0IDEwIDExIDIzIDIgMTIgMjMgOSAyMCBeCis0OSAxIDI0IDI0IDE5IDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgCisxNSA5IDEyIDE5IDE5IDEgMyAxMCA2IDggMyAxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDI0IF4KKzQzIDAgMiAyNCA1IDIwIDEzIDcgMjAgMTcgMTkgMjIgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAKKzIyIDE3IDIzIDEyIDE1IDQgMjQgNyAyMSAxOCAyIDIxIDE2IDEgMTkgMTEgXgorNDggMSAyMCAxMSAzIDE1IDE5IDE4IDEgNiAxNCA1IDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IAorNCAxMyAxNyAxIDEgOSAxIDEwIDIgMTggMSAyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTkgXgorNTAgMSAxOSA2IDE4IDkgMSAyMyAyMiAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgCisxOCAyIDkgOCA0IDMgMTEgMTcgMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IF4KKzQ4IDEgMTYgMjEgNCAxOSA1IDUgMjAgMjQgMTMgMjMgNiAyNCA1IDE3IDEyIDUgMSAxNSAxNyAxNyAyMSAxMSAxMyA5IDIzIDExIDE0IAorMjEgNyA2IDkgNiAxNCA3IDE2IDIgMTcgMSAyNCAyMyA0IDEyIDE0IDQgMiAxMSAyMyAxNSBeCis1MCAxIDQgMjMgMjEgMjEgMTYgMTUgMTMgMTUgMTQgMTUgOCAxNCA5IDE3IDcgMTUgMiAyMyAyIDEgMTcgNiAxNCAxOSAyNCAyIDggOCA3IAorNyAxMCAxNCAxMyA3IDkgMTEgMTYgMTEgOCA4IDE4IDEzIDEzIDE4IDEwIDEgMjAgMTggMjIgMyBeCis0NCAxIDEyIDkgMTYgMTcgMTMgNiA5IDE3IDIwIDEwIDUgNyAyMCAxOCA4IDE1IDIzIDIxIDIwIDUgMTUgMTEgMyAzIDE0IDIxIDEwIDI0IAorNiAyMSAyMSA2IDIzIDEwIDMgMjEgMjMgMTcgMjAgOCAxNiAxMCAyMiAxMiBeCis1MyAwIDE2IDEgNSAyNCAzIDkgMTYgNiA3IDMgMjAgMTIgMTcgMTggMjEgNSA5IDcgMSA5IDEyIDE5IDUgNyA2IDI0IDExIDExIDIwIDIzIAorMTAgNCA3IDEgMTkgNyAxOSAxNyAyMyAxNSA1IDEyIDIxIDIwIDMgMSAxNCAyIDE1IDIyIDMgMTYgOSBeCis0NiAxIDEwIDE5IDEwIDIwIDE2IDE5IDE3IDEwIDQgMjEgMjAgMTYgMjEgMTQgMTQgOCAxNyAxMCAxOSAxIDE3IDQgMyAyMiAyMyAxNCAKKzE2IDkgMjIgOCAyMCAyNCAxIDUgMTEgMTEgNiA0IDEzIDE1IDEyIDEgMTEgMTMgMjEgMjEgXgorNDYgMCA4IDUgNiA1IDE2IDEyIDExIDIgMTcgMTQgMTkgMjMgMTYgNSA2IDIwIDIxIDkgMjQgOSAyMiAyMyAyMiAxMiA4IDEzIDIzIDE3IAorNSAzIDE2IDIyIDE1IDIyIDcgMTcgMyAyIDEzIDEzIDExIDI0IDEzIDEyIDIxIDcgXgorNDMgMSAxNCAyMCAyNCAyNCA0IDkgMTMgNSA4IDkgMTggNyAxMiAxIDIxIDggMjQgMTUgMSAyMiAxOSAyNCAxNCAxMyA4IDIwIDE0IDE4IAorMjMgMTkgOSA4IDE0IDIzIDExIDQgNCAyMiAyMCAxMyAxNyAxNSAyNCBeCis1NSAwIDYgMTUgOCAyNCA0IDIwIDE5IDggMTkgMTQgMjEgMjQgMTggMyAxMCAxNiAzIDYgNCAxIDEwIDE1IDEzIDQgOCAxMiAyMiA5IDYgCiszIDEgMTMgMTYgMTIgMjMgMTAgMTQgMiAxIDYgMTEgOCAxOSAyNCAxNiAyIDUgMjEgMiA3IDIyIDQgNSAyMyA0IF4KKzU1IDEgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDggMTAgMjEgNCA4IDI0IDIgNiAxOSAxMCA2IDIyIAorMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAxMSAyMSAxIDcgOCA0IDE3IDUgMTQgMSAyIDEwIDkgMTIgMTQgXgorNDkgMCAxMSAxMCAyMCA0IDE0IDMgMSAzIDIxIDEyIDExIDE3IDIyIDExIDcgNSAyMSAxNCAxNSAxOSAyMCAxMiA2IDEyIDE4IDE5IDQgNyAKKzEyIDEwIDUgMjIgMyAxNSAyMSA3IDIzIDcgMiAyMiA0IDE4IDE4IDMgMjQgMTAgMTcgMjQgMTIgXgorNTAgMCAxOCA2IDExIDE4IDIyIDggNiA2IDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIDE0IDE3IDkgMTYgNyAyMSA2IDIyIDI0IDE5IAorMTEgOSAxOSAyMSAxNSAxMSAxOSAyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIyIF4KKzUxIDEgMjEgMjIgNiAxNyA5IDQgMjQgMjEgMTUgMTUgMTYgMTYgMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAKKzEzIDIyIDMgNSAxIDQgMTEgMTQgNyA2IDEwIDE3IDE0IDYgMyAxMyAxOCAxNiAzIDUgMTUgMjMgOCAyMSBeCis1MSAxIDUgMyAxOCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAxNyAyIDIgMTcgMyAxMyAyMCAyIDYgMyAxNSA3IDEzIDEgMTggNyAyMiAxOCAKKzI0IDIwIDE0IDcgMTcgMTYgMjAgMyAxMSA2IDUgMiAxOCAxNCAxNiAyMiAxNCAxMSA3IDE4IDE2IDIwIF4KKzUyIDAgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IDQgNiAyMyA4IDE4IDExIDIgMyAyMCAyMiA5IDIxIDggMjMgMSAyMyAyMCA3IAorMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE1IDYgMTMgNCAyMiAxNiBeCis0OSAxIDE5IDIwIDEgOSA3IDE0IDEgMTUgMyAyMyAyNCAyMiAxOCAxMiAxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIDIgMjAgMTUgMTggCisxNyAxOCA3IDExIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDMgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTYgXgorNDcgMCAxMCA2IDE4IDIwIDcgMSA4IDEgMTYgNiAyMCAyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAKKzE5IDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCAzIF4KKzQ1IDAgMTcgNiAyNCAxMSA3IDIxIDkgMTcgOCAyNSA1IDUgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgCisyNCAxOCAxMiAyMSAxOSAyIDQgMjQgMTMgMTEgMiA3IDI0IDIyIDE3IDIxIF4KKzQ2IDEgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA3IDE4IDIyIDExIDE4IDkgMTEgMTUgMjIgMjAgMTggNiAyNCAxNSAKKzI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgMTkgMjQgMTggMTUgXgorNTIgMSA4IDIgNSAyMyAyIDEwIDIxIDggNSAyIDkgMTYgMTYgMTUgNiAyMiAyMyA1IDYgMjEgNSAyMSAyNCAzIDYgMTAgMTcgMTkgOSAxNSAKKzExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAyMSAyMCA3IDIyIDE4IF4KKzQzIDAgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCAyMCAxMiA2IDcgNCAyIDEyIDI1IDE1IDMgOSAyMyA4IDE2IDI1IAorMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIDggMTkgXgorNTUgMCAxOSAyNSAxNyA3IDE2IDIxIDYgNCA4IDIgMTUgOSAyIDkgMTkgMyA2IDMgMyAxMCAyNSAxMyAxNSA3IDggMjAgMjEgMTIgMTAgCisxMiA1IDI0IDExIDIwIDMgMTMgMTMgMTYgOSAxMyAxMCAzIDkgMTYgMyA3IDE1IDkgOSAxNCAyIDEzIDE3IDI1IDMgXgorNDYgMCAxOCA1IDE5IDIzIDkgMjUgOSAxMCAyMyAxMiAxMiA3IDEzIDggMTUgNyAxIDYgMjEgMiA4IDcgNiAxNiAxNCAxNCAxMiAxNSAxMyAKKzI0IDEwIDE1IDExIDEwIDggMTQgMTUgMjEgMjUgMjEgMTYgOSAxOCAyMCAyMiAyMSBeCis1MCAxIDIwIDExIDE0IDIzIDIyIDEwIDEzIDE0IDggMTkgMTIgMiAxMSAyMCAyMyAxMyA0IDEwIDYgNSA3IDIzIDExIDMgMTYgOCAyMSA0IAorOCAxOCA1IDEyIDE0IDggNiAyMCAxOSAyNCA4IDIzIDE3IDMgNyAxOSAxIDE4IDEgMTQgMjIgMTEgXgorNDQgMSAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAxNyAxMiAxNyAxNCAxOCA4IDI1IDkgCisyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAxOSBeCis1MSAwIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgMjEgMTQgMTQgMTkgCiszIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIDExIDIwIF4KKzQ3IDAgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSAyNSAyIAorMjEgMTggMTAgMjAgMjUgMjEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDI1IF4KKzU1IDEgNCA4IDE4IDMgMTggMyAxMSAyNCAyIDE0IDkgMSAxMCA0IDQgMTMgMTkgMjIgNCA3IDE5IDUgMTAgMTAgMSA4IDIyIDIyIDYgOCAKKzEzIDEyIDExIDE3IDIzIDE0IDE2IDcgNSAxMSAyMiAyNCA3IDIgMTEgMTMgMTggNCAyMCA4IDEgNiAyNSAyMCAxNiBeCis1MSAxIDIwIDEgMjUgMTAgMTUgMTUgMiAxNyAxMyA5IDI0IDE3IDI0IDIwIDEzIDE1IDE3IDMgMTEgMjAgMTAgNSAxMyAyMyAxOCA1IDMgCisxOCAxNSA3IDUgNyA0IDE1IDIwIDE2IDIgMTcgMSA3IDQgMTIgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMiBeCis1MiAwIDMgMTMgMTIgNCAzIDE0IDQgMTQgMTEgNiAzIDI1IDE4IDE2IDIwIDI0IDEyIDE5IDE4IDI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IAorMTMgMjAgNSAxNCAxNSAyIDEzIDIxIDExIDUgMTcgMiAyIDEwIDExIDEzIDE0IDEyIDExIDIxIDE1IDIzIDIwIF4KKzUwIDEgMiA1IDcgMjMgMTAgMjAgNiAxMiAxIDE5IDEwIDI0IDIxIDIyIDI1IDE2IDEyIDE5IDIyIDE1IDEwIDE4IDI0IDEgNSAxNiAxMCAKKzE4IDIgMTkgMTQgMyA1IDEgNyAyMCA3IDE2IDYgMjAgNiA2IDI1IDEwIDIyIDIwIDIgMSAxNSAxOCBeCis0OCAwIDIzIDI1IDIzIDQgMTEgMTUgMTUgNiA5IDIyIDIyIDE5IDIyIDI1IDYgMTkgNiAyIDIwIDIxIDcgMjIgMTggMTAgNyAxNyA0IDE2IAorMTIgMTAgMjUgMTIgMjMgMjMgOSAyIDIyIDEgMjAgMiA4IDMgMTQgNyAxIDIgMyAyNCBeCiszOCAxIDIxIDIxIDIzIDIwIDIyIDExIDI1IDIwIDI0IDI1IDEgOSAyMSAyMCAxNCAxMCAxNCAxOSA5IDE3IDE1IDEzIDUgMTUgMjQgMjEgCisxMiAxMyAyNSAyMiAyMSAxIDE2IDIzIDcgMjQgMTUgMjIgXgorNTQgMSAyMiA1IDI1IDMgNCAyIDkgMTIgMjQgNiAxOSAxIDE0IDkgNSA5IDEgMTcgOSA0IDIzIDIxIDEgMyAxNSAxNiAxMSAxIDEyIDE4IAorNiAyIDcgOCAxNyA4IDIxIDEzIDIyIDkgMjEgNCA5IDEgMTMgMTcgMjEgMTAgOSAxOCAyNCAyMyAxMyAyNCBeCis0MyAxIDIzIDIzIDE5IDIzIDIyIDE3IDE4IDIzIDE4IDIxIDE3IDEgMTAgMTIgNCA2IDEgMjEgMTEgMTggMiA2IDYgMTIgMTggMTMgMTYgCisxNiAxOCAxOSAxMyAxMSAyMSAxOSAxNSAxMiAxNSAxNiAxOSAyIDIzIDE5IDIzIF4KKzQ4IDAgMSAyIDI1IDE0IDExIDI1IDI0IDE2IDggMTQgMjEgMjEgMTYgNiAxMyAxIDIzIDE1IDggMTcgNCAzIDQgOSAyMyAxMiA4IDggMjQgCisxMyA2IDExIDMgOCAyNCAxOSA4IDIzIDEgMjQgMjQgMTggMjUgMTMgMiA2IDI1IDE0IF4KKzUxIDEgOSAzIDUgMTEgMTkgMTEgMTYgNSA0IDE3IDI0IDIzIDE1IDE0IDEwIDcgMTQgMTcgMjUgMTUgMTAgMTQgNiAxOCAxOCA0IDEgMTMgCisxMCAxNiAxIDI1IDE2IDIgMjQgNSAxIDE3IDYgMTcgNiAyNCAxMSA3IDIxIDkgMTcgOCAyNSA1IDIzIF4KKzQ4IDEgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgMjQgMTggMTIgMjEgMTkgMiA0IDI0IDEzIDExIDIgCis3IDI0IDIyIDE3IDUgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA3IDI1IF4KKzQ5IDAgMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IDI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgMTkgCisyNCAxOCA5IDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDE3IF4KKzQ3IDEgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IDExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAKKzIxIDIwIDcgMjIgMTQgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCBeCis1MyAwIDIwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIAorOCA0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IF4KKzU0IDEgNyA4IDIwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgCisxNyAyNSAyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggMjUgXgorNDQgMSA2IDE2IDE0IDE0IDEyIDE1IDEzIDI0IDEwIDE1IDExIDEwIDggMTQgMTUgMjEgMjUgMjEgMTYgOSAxOCAyMCAyMiAyMSAyMCAxMSAKKzE0IDIzIDIyIDEwIDEzIDE0IDggMTkgMTIgMiAxMSAyMCAyMyAxMyA0IDEwIDYgMjUgXgorNDkgMSA3IDIzIDExIDMgMTYgOCAyMSA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAzIDcgMTkgMSAxOCAxIDE0IDIyIAorMTMgMTQgNSA4IDIyIDE4IDE0IDI1IDE3IDExIDEyIDIyIDIgMTIgMTIgMTYgMTIgMTMgMTggMjUgXgorNDUgMSAxMiAxNyAxNCAxOCA4IDI1IDkgMjMgNSAzIDggMTQgMjQgMTcgNyAzIDMgMjMgMTcgMjIgMTkgMTkgMTcgMTYgMjIgMjQgMTQgCisxNiAyMCAyMyAyMCA5IDE5IDE2IDcgMTIgMTYgNSA4IDkgNyAxMCAyMSAyNCA3IF4KKzU4IDAgMTEgMTkgMSAyMSAxNCAxNCAxOSAzIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIAorMTEgMTYgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSA3IF4KKzU0IDEgMiAyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgNCA4IDE4IDMgMTggMyAxMSAyNCAKKzIgMTQgOSAxIDEwIDQgNCAxMyAxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IDEzIDEyIDExIDIxIF4KKzQ3IDEgMjMgMTQgMTYgNyA1IDExIDIyIDI0IDcgMiAxMSAxMyAxOCA0IDIwIDggMSA2IDI1IDIwIDE3IDIwIDEgMjUgMTAgMTUgMTUgMiAKKzE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgMTUgMTcgMyAxMSAyMCAxMCA1IDEzIDIzIDE4IDIxIF4KKzU3IDEgMyAxOCAxNSA3IDUgNyA0IDE1IDIwIDE2IDIgMTcgMSA3IDQgMTIgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMCAzIDEzIDEyIDQgMyAKKzE0IDQgMTQgMTEgNiAzIDI1IDE4IDE2IDIwIDI0IDEyIDE5IDE4IDI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IDEzIDIwIDcgXgorNTEgMSAxNCAxNSAyIDEzIDIxIDExIDUgMTcgMiAyIDEwIDExIDEzIDE0IDEyIDExIDIxIDE1IDIzIDMgMiA1IDcgMjMgMTAgMjAgNiAxMiAKKzEgMTkgMTAgMjQgMjEgMjIgMjUgMTYgMTIgMTkgMjIgMTUgMTAgMTggMjQgMSA1IDE2IDEwIDE4IDIgMTkgOCBeCis0OSAwIDMgNSAxIDcgMjAgNyAxNiA2IDIwIDYgNiAyNSAxMCAyMiAyMCAyIDEgMTUgMTQgMjMgMjUgMjMgNCAxMSAxNSAxNSA2IDkgMjIgCisyMiAxOSAyMiAyNSA2IDE5IDYgMiAyMCAyMSA3IDIyIDE4IDEwIDcgMTcgNCAxNiAxMiAyNCBeCis0NiAwIDEwIDI1IDEyIDIzIDIzIDkgMiAyMiAxIDIwIDIgOCAzIDE0IDcgMSAyIDMgMTkgMjEgMjEgMjMgMjAgMjIgMTEgMjUgMjAgMjQgCisyNSAxIDkgMjEgMjAgMTQgMTAgMTQgMTkgOSAxNyAxNSAxMyA1IDE1IDI0IDIxIDE0IF4KKzU1IDAgMTMgMjUgMjIgMjEgMSAxNiAyMyA3IDI0IDE1IDMgMjIgNSAyNSAzIDQgMiA5IDEyIDI0IDYgMTkgMSAxNCA5IDUgOSAxIDE3IDkgCis0IDIzIDIxIDEgMyAxNSAxNiAxMSAxIDEyIDE4IDYgMiA3IDggMTcgOCAyMSAxMyAyMiA5IDIxIDQgOSAyMiBeCis0NSAxIDEzIDE3IDIxIDEwIDkgMTggMjQgMjMgMTMgNyAyMyAyMyAxOSAyMyAyMiAxNyAxOCAyMyAxOCAyMSAxNyAxIDEwIDEyIDQgNiAxIAorMjEgMTEgMTggMiA2IDYgMTIgMTggMTMgMTYgMTYgMTggMTkgMTMgMTEgMjEgMTkgOCBeCis1MCAxIDEyIDE1IDE2IDE5IDIgMjMgMTkgNCAxIDIgMjUgMTQgMTEgMjUgMjQgMTYgOCAxNCAyMSAyMSAxNiA2IDEzIDEgMjMgMTUgOCAKKzE3IDQgMyA0IDkgMjMgMTIgOCA4IDI0IDEzIDYgMTEgMyA4IDI0IDE5IDggMjMgMSAyNCAyNCAxMiBeCis1MyAwIDI1IDEzIDIgNiAyNSA3IDkgMyA1IDExIDE5IDExIDE2IDUgNCAxNyAyNCAyMyAxNSAxNCAxMCA3IDE0IDE3IDI1IDE1IDEwIDE0IAorNiAxOCAxOCA0IDEgMTMgMTAgMTYgMSAyNSAxNiAyIDI0IDUgMSAxNyA2IDE3IDYgMjQgMTEgNyAyMSA5IDE5IF4KKzUxIDEgOCAyNSA1IDUgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgMjQgMTggMTIgMjEgMTkgMiA0IAorMjQgMTMgMTEgMiA3IDI0IDIyIDE3IDUgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA4IF4KKzUwIDEgMTggMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IDI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgCisxOSAyNCAxOCA5IDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDE4IF4KKzQ4IDEgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IDExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAKKzIxIDIwIDcgMjIgMTQgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCAxOSBeCis1NSAwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIDggCis0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgOCAyNCBeCis1NiAwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgMTcgMjUgCisyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyA2IDE2IDE0IDE0IDIyIF4KKzQ3IDAgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIDIwIDExIDE0IDIzIDIyIDEwIAorMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgMTEgMyAxNiA4IDIxIDEyIF4KKzQ5IDAgNCA4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMyA3IDE5IDEgMTggMSAxNCAyMiAxMyAxNCA1IDggMjIgMTggMTQgCisyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IDEyIDE3IDE0IDE4IDggMjUgMjIgXgorNDYgMSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAyMiAyNCAxNCAxNiAyMCAyMyAyMCA5IDE5IDE2IAorNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgMjEgMTQgMTQgMTkgMjAgXgorNTcgMSAyMiA4IDEyIDIwIDEgMTggNSA2IDUgMTIgMTQgMSAxIDExIDkgMjIgMyAyNCA5IDYgMSAxMSAxNiAxIDEyIDggMTEgMTEgMTcgCisxMCAyMiA3IDMgMTAgMiA2IDQgMjQgMTYgMjQgMTkgNCA1IDE4IDExIDEyIDkgMjAgMjEgMjUgMiAyMSAxOCAxMCAyMCAyNSA3IF4KKzU2IDEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDExIDQgOCAxOCAzIDE4IDMgMTEgMjQgMiAxNCA5IDEgMTAgNCA0IDEzIAorMTkgMjIgNCA3IDE5IDUgMTAgMTAgMSA4IDIyIDIyIDYgOCAxMyAxMiAxMSAxNyAyMyAxNCAxNiA3IDUgMTEgMjIgMjQgMTggXgorNTQgMSAyIDExIDEzIDE4IDQgMjAgOCAxIDYgMjUgMjAgMTcgMjAgMSAyNSAxMCAxNSAxNSAyIDE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgCisxNSAxNyAzIDExIDIwIDEwIDUgMTMgMjMgMTggNSAzIDE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAyMyBeCis1NiAwIDcgMjUgMTQgMSA0IDcgMTkgMTkgMjAgMyAxMyAxMiA0IDMgMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggCisyNSA2IDIzIDYgMTUgNSA0IDQgNiAxNCAxMyAyMCA1IDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMjQgXgorNDkgMCAxMiAxMSAyMCAzIDE0IDIgMyAyIDIzIDEyIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IDEyIDIwIDE5IDUgNSAKKzEyIDExIDYgMjMgMiAxNiAyMyA3IDI0IDYgMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI1IDE5IF4KKzU0IDAgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAyNCAKKzEgMjEgMTEgOSAyMCAyMSAxNSAxMCAxOSAyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjEgNyBeCis1NiAwIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IDE2IDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IDEzIAorMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIzIF4KKzUxIDEgMjIgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgNSA0IDE1IDggMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IAorMjIgMSAxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCA1IDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMTggXgorNTEgMSAxNiAyNCA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSAKKzcgNCAyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgNiAxMyA2IDIyIDYgMjAgMjIgMiAyNiAyNiBeCis0NyAxIDYgMTQgMSAxNiAzIDI0IDI1IDI0IDE3IDEyIDE0IDE4IDE4IDkgOSAxMSAyMiAxMyA5IDIgMjIgMTUgMjAgMjAgMTggOCAxMyAKKzEzIDIxIDggMTEgNSAyNiA4IDE5IDE3IDQgMiAxNSAyNiAxMyAyNCAyNiAxMSAxNiA5IDI0IF4KKzUyIDAgOCAxOCAyMSA2IDEgOCAxIDE2IDQgMjAgMjMgMjMgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAxMCAzIDI2IDI2IDIwIAorMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IDIzIDEgMiAyNCA4IDEwIDE4IDIgOSA1IDQgMTcgMTYgMTIgXgorNTAgMCAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMSAzIDQgMTYgMiAxMCAxIDI1IDUgMjIgMTYgNiAyMSAxOSAyMSAyMyAKKzE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgMTAgMjYgMTUgOCAyMiAyMiAxOCAxNiBeCis0OCAwIDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgMTggMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIDEwIAorMjMgMTggMTYgMjUgMTggMTUgMiAyMCAxNCAyNCAyMiAxNyAzIDE1IDE2IDEgMTAgMiAxMiAxNiBeCis0NyAwIDIxIDEgMjEgMjEgNCAxOCAxMyAxIDI0IDE4IDIzIDE3IDE5IDYgMTkgOSAyNiAyNSAyMyAyMyAxNCAxMyAxMyAyMCAxMiAxMyA0IAorMjEgMTAgMjIgMjEgMjIgMSAxMiAxMiA3IDEzIDE2IDE4IDggOSA0IDMgMTAgMTggMTIgMjUgXgorNDcgMSA1IDE5IDE5IDEyIDI0IDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgNyA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IAorMjYgMTcgMTggMTkgMjIgMTAgMTIgOCAyMyAxMSAxNyAyMyAyNSA1IDUgMTEgNCAxMyAyMCBeCis1MiAwIDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAyNCAxNCA1IDI1IDIxIDIyIDE4IDE3IDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAKKzE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgOCA4IDggNyAxMSAxMyAxNCA3IDkgMTIgMTggMTEgMTAgMjAgXgorNDcgMSAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAxMyAxMCAxNiAxOSAxNCA3IDggMTYgMjAgMTAgMyA5IDIzIDE4IDcgMjYgMTYgCisyMiAyMSAyMSA1IDE0IDExIDIgMiAxNiAyMiAxMSAyNiA3IDIyIDIzIDUgMjMgMTAgNCAyMiA1IF4KKzUwIDAgMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgNCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IDIzIDYgMTAgOSAxIDkgMTQgMTkgCis1IDYgNiAyNSAxMiAxMSAyMSAyNiAxMiAzIDggMjAgOCAyMSAxOCAyNSAyNSAxNCA0IDExIDI1IF4KKzQ1IDEgMjMgNCAxNCAzIDE3IDI2IDIyIDI2IDIgMTUgOSA4IDI1IDE5IDEyIDIzIDE3IDIwIDE3IDEwIDQgMjMgMjAgMTcgMjEgMTQgMTQgCis5IDE4IDExIDE4IDIgMTggNCAyIDIyIDI1IDE1IDE4IDEwIDIzIDggMjEgMjYgMTUgXgorNTQgMCA3IDE0IDEwIDYgNiAxNSAxNSAxMyAyIDExIDE1IDIyIDIgOSA0IDQgNiAxNiAxMSAxMSAzIDE2IDEzIDE5IDI1IDE2IDUgNyAyMCAKKzIyIDkgMjUgMTEgMjQgMjQgMjUgMTMgOCAxNSAyMyAxNiA2IDMgMTggMjMgMTYgMjMgOCAyMCA0IDEgMSAxNCAxNiBeCis0MyAxIDEyIDI0IDE0IDE0IDI2IDIzIDEzIDI2IDE0IDIxIDI1IDI1IDQgOSAxMyA1IDggOSAyMSA4IDEyIDI2IDI0IDkgMjQgMTUgMSAKKzIzIDIyIDE2IDE0IDggMjIgMTUgMTkgMjQgMjAgNyA4IDE1IDI0IDEyIDE4IF4KKzU3IDAgNCAyMyAyMSAxMyAxOSAxNSAyMSA3IDE1IDcgMyAyMSAyMCA4IDIyIDE0IDIzIDI2IDE5IDIgMTAgMTggMyA1IDMgMSA5IDE1IAorMTUgMyA3IDEzIDIzIDkgNyAxIDEzIDE3IDE0IDI1IDkgMTYgMiAyIDYgMTMgNyAxOSAyNSAxNyAxIDUgMjEgMiA3IDIyIDUgXgorNTUgMSA2IDI1IDMgMTIgMTkgNiAyIDQgMjQgMTcgOSAxOCAyMCAxOSA0IDExIDE0IDEgNiA4IDI2IDYgOSAyMiA0IDEwIDIgNyAyMSA5IAorOCAyNCAyNSAxNCAyMiAxMiAyMiAzIDIzIDMgMyAyMCA2IDExIDIzIDYgMSA3IDUgMTggNSAxNSAyNSAyNiAyMyBeCis1MyAwIDEgMTAgMTEgMTEgNCAxMiAxMSAyMCAzIDE0IDIgMyAyIDIzIDEyIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IAorMTIgMjAgMTkgNSA1IDEyIDExIDYgMjMgMiAxNiAyMyA3IDI0IDYgMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI2IF4KKzU0IDAgMjQgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAKKzI0IDEgMjEgMTEgOSAyMCAyMSAxNSAxMCAxOSAyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjMgXgorNTggMCAxIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IDE2IDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IAorMTMgMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIyIDE5IF4KKzUyIDEgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgNSA0IDE1IDggMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IDIyIDEgCisxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCA1IDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjIgXgorNTYgMSA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSA3IDQgCisyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgNiAxMyA2IDIyIDYgMjAgMjIgMiAyNiA5IDYgMTQgMSAxNiAzIDI0IDEyIF4KKzUyIDAgMjQgMTcgMTIgMTQgMTggMTggOSA5IDExIDIyIDEzIDkgMiAyMiAxNSAyMCAyMCAxOCA4IDEzIDEzIDIxIDggMTEgNSAyNiA4IAorMTkgMTcgNCAyIDE1IDI2IDEzIDI0IDI2IDExIDE2IDkgMSA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyA1IF4KKzU0IDAgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAxMCAzIDI2IDI2IDIwIDE1IDExIDE5IDE2IDE3IDMgMTYgMTIgMjUgMTUgOSAKKzIzIDEgMiAyNCA4IDEwIDE4IDIgOSA1IDQgMTcgMTYgOSAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMCBeCis0OSAxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiA2IDIxIDE5IDIxIDIzIDE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgCisxMCAyNiAxNSA4IDIyIDIyIDE4IDI2IDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgOCBeCis0OSAwIDI2IDIxIDEyIDUgMTggMjIgMjAgNyAxNSA2IDQgNSAyMCAxMyAxMCAyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IAorMyAxNSAxNiAxIDEwIDIgMTIgMiAyMSAxIDIxIDIxIDQgMTggMTMgMSAyNCAxOCAyMyAxNyAxOSAyMyBeCis1MCAxIDE5IDkgMjYgMjUgMjMgMjMgMTQgMTMgMTMgMjAgMTIgMTMgNCAyMSAxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IAorNCAzIDEwIDE4IDEyIDQgNSAxOSAxOSAxMiAyNCAxMyAxOCAxIDIyIDggMSAxNyAxOCAyNCAzIDIyIDIxIF4KKzQ4IDEgNyAxOSAyNiAxMyAyNiA2IDI2IDYgMTggMTIgNSAyNiAxNyAxOCAxOSAyMiAxMCAxMiA4IDIzIDExIDE3IDIzIDI1IDUgNSAxMSAKKzQgMTMgNyAxOCA0IDE5IDIzIDMgMTMgMTUgNCAzIDkgMjQgMTQgNSAyNSAyMSAyMiAxOCAyNSBeCis1MyAxIDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAxNiAzIDIzIDQgMjYgMTggNSAxNiAyMSAyNCAyIDggOCA4IDcgMTEgMTMgMTQgNyA5IAorMTIgMTggMTEgMTAgNyAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAxMyAxMCAxNiAxOSAxNCA3IDggMTYgMjAgNyBeCis0OSAwIDMgOSAyMyAxOCA3IDI2IDE2IDIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIDI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDI0IAorMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgNCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IF4KKzQ5IDAgMjMgNiAxMCA5IDEgOSAxNCAxOSA1IDYgNiAyNSAxMiAxMSAyMSAyNiAxMiAzIDggMjAgOCAyMSAxOCAyNSAyNSAxNCA0IDExIAorMjQgMjMgNCAxNCAzIDE3IDI2IDIyIDI2IDIgMTUgOSA4IDI1IDE5IDEyIDIzIDE3IDIwIDE3IDEwIF4KKzU0IDAgNCAyMyAyMCAxNyAyMSAxNCAxNCA5IDE4IDExIDE4IDIgMTggNCAyIDIyIDI1IDE1IDE4IDEwIDIzIDggMjEgMjYgNyAxNCAxMCAKKzYgNiAxNSAxNSAxMyAyIDExIDE1IDIyIDIgOSA0IDQgNiAxNiAxMSAxMSAzIDE2IDEzIDE5IDI1IDE2IDUgNyAyMCAyMyBeCis0NyAwIDkgMjUgMTEgMjQgMjQgMjUgMTMgOCAxNSAyMyAxNiA2IDMgMTggMjMgMTYgMjMgOCAyMCA0IDEgMSAxNCAxMyAxMiAyNCAxNCAKKzE0IDI2IDIzIDEzIDI2IDE0IDIxIDI1IDI1IDQgOSAxMyA1IDggOSAyMSA4IDEyIDI2IDE1IF4KKzUxIDEgOSAyNCAxNSAxIDIzIDIyIDE2IDE0IDggMjIgMTUgMTkgMjQgMjAgNyA4IDE1IDI0IDEyIDQgNCAyMyAyMSAxMyAxOSAxNSAyMSAKKzcgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgMTUgMyAyNCBeCis2MCAwIDEzIDIzIDkgNyAxIDEzIDE3IDE0IDI1IDkgMTYgMiAyIDYgMTMgNyAxOSAyNSAxNyAxIDUgMjEgMiA3IDIyIDUgNiAyNSAzIDEyIAorMTkgNiAyIDQgMjQgMTcgOSAxOCAyMCAxOSA0IDExIDE0IDEgNiA4IDI2IDYgOSAyMiA0IDEwIDIgNyAyMSA5IDggMjQgMjUgMTAgXgorNTkgMCAyMiAxMiAyMiAzIDIzIDMgMyAyMCA2IDExIDIzIDYgMSA3IDUgMTggNSAxNSAyNSAyNiAxIDEgMTAgMTEgMTEgNCAxMiAxMSAyMCAKKzMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgMTIgMjAgMTkgNSA1IDEyIDExIDYgMjMgOCBeCis1MCAwIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjUgMjQgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IAorMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IDI0IDEgMjEgMTEgOSAyMCAxNCBeCis2MCAwIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMSAxIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IAorMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgMTMgMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgCisxNiAxMyBeCis1NyAwIDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjIgMjIgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgCis1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgMjIgMSAxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCAyMSBeCis1MiAxIDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjQgNCAxNiAzIDYgMjYgMjYgMTAgMjAgMTMgMSAyMCAyNCAxMCAyMSA3IAorMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSA3IDQgMjQgNyAxNCAyMCAxIDQgNyAzIDEwIDEwIDE1IDE5IF4KKzUxIDAgMTMgNiAyMiA2IDIwIDIyIDIgMjYgOSA2IDE0IDEgMTYgMyAyNCAyNSAyNCAxNyAxMiAxNCAxOCAxOCA5IDkgMTEgMjIgMTMgOSAKKzIgMjIgMTUgMjAgMjAgMTggOCAxMyAxMyAyMSA4IDExIDUgMjYgOCAxOSAxNyA0IDIgMTUgMjYgMTMgMjEgXgorNTIgMSAyNCAyNiAxMSAxNiA5IDEgOCAxOCAyMSA2IDEgOCAxIDE2IDQgMjAgMjMgMjMgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAKKzEwIDMgMjYgMjYgMjAgMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IDIzIDEgMiAyNCA4IDEwIDE4IDE1IF4KKzU1IDEgOSA1IDQgMTcgMTYgOSAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMSAzIDQgMTYgMiAxMCAxIDI1IDUgMjIgMTYgCis2IDIxIDE5IDIxIDIzIDE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgMTAgMjYgMTUgOCAyMiAyMiAxMSBeCis1MCAxIDI2IDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgMTggMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIAorMTAgMjMgMTggMTYgMjUgMTggMTUgMiAyMCAxNCAyNCAyMiAxNyAzIDE1IDE2IDEgMTAgMiAxMiAyIDI1IF4KKzUxIDAgMSAyMSAyMSA0IDE4IDEzIDEgMjQgMTggMjMgMTcgMTkgNiAxOSA5IDI2IDI1IDIzIDIzIDE0IDEzIDEzIDIwIDEyIDEzIDQgMjEgCisxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IDQgMyAxMCAxOCAxMiA0IDUgMTkgMTkgMTIgMjQgXgorNTMgMSAxMyAxOCAxIDIyIDggMSAxNyAxOCAyNCAzIDIyIDcgNyAxOSAyNiAxMyAyNiA2IDI2IDYgMTggMTIgNSAyNiAxNyAxOCAxOSAyMiAKKzEwIDEyIDggMjMgMTEgMTcgMjMgMjUgNSA1IDExIDQgMTMgNyAxOCA0IDE5IDIzIDMgMTMgMTUgNCAzIDkgMTggXgorNTEgMSAxNCA1IDI1IDIxIDIyIDE4IDE3IDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAxNiAzIDIzIDQgMjYgMTggNSAxNiAyMSAyNCAyIAorOCA4IDggNyAxMSAxMyAxNCA3IDkgMTIgMTggMTEgMTAgNyAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAyNiBeCis0OSAwIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCAxMCAzIDkgMjMgMTggNyAyNiAxNiAyMiAyMSAyMSA1IDE0IDExIDIgMiAxNiAyMiAxMSAKKzI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDI0IDE5IDIwIDkgMTYgMTAgMjQgNCAxOSAyNiA0IDI1IDE0IF4KKzUyIDAgOCAxNyA3IDcgMiAyMyAxMSAxOCAxOSAyMyA2IDEwIDkgMSA5IDE0IDE5IDUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCAKKzggMjEgMTggMjUgMjUgMTQgNCAxMSAyNCAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMjQgXgorNTUgMSAxMiAyMyAxNyAyMCAxNyAxMCA0IDIzIDIwIDE3IDIxIDE0IDE0IDkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgCisyMyA4IDIxIDI2IDcgMTQgMTAgNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMTUgXgorNDkgMCAxNiA1IDcgMjAgMjIgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IAorMTMgMTIgMjQgMTQgMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDkgXgorNTUgMCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgNCAxNCAyNSAxNCAKKzMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCAxOCBeCis1MSAwIDcgMyAyNSAxIDE3IDggMjYgMjUgMTEgMjMgMTQgMjcgMSAyMiAxMSA5IDcgMTkgNCAxNSAxOCAyIDI3IDIwIDExIDUgMjAgMjIgCisxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIDkgMjMgMTAgMjYgMjcgMjYgMTQgMTIgMyAxNCAxNSAxMSAyIDI2IF4KKzUwIDAgNiAyMiAyMCA4IDI1IDQgMjUgMjQgMjMgMjAgMyAzIDE2IDIgMiAyNyAyIDE1IDE0IDI3IDMgMTcgMTIgMjcgMjcgNyAyNiAyIAorMjIgMTEgOSAxMCAyNCAxNSAxIDI3IDExIDI3IDQgMSAyNSAyNSAxNiA2IDIgMjIgMTIgMTcgMjEgMTQgXgorNTIgMCA4IDkgMjIgMTcgMTIgNyAxOCAxNCAyMyAyIDYgNCAyMyA5IDQgMjIgMTYgMTggMjMgOCAxMSAyNSAxNyAyNyAxNiAxMCAzIDI0IAorOCAyMCAyMCAxOCAxOCAxMyA0IDIgMTggMjIgMTUgMjUgMjYgOSAzIDEgMiAxOSAxNSAxIDI0IDE3IDE2IDE4IF4KKzQ5IDAgOSAxNCAxMSA4IDE2IDE5IDE2IDIyIDEwIDE2IDI0IDI1IDcgMjIgMTIgMjAgMTUgMjMgMjIgMTggMjIgMTQgNiAyNiAyMSAxMCAKKzIxIDcgMTMgMiAxNiA3IDI0IDE2IDIyIDEzIDEwIDcgMTEgMTYgNSA5IDI1IDEzIDkgMTQgMTQgMTcgMTQgXgorNTQgMSAyIDEwIDUgMjUgNSA3IDEwIDIyIDEwIDEgMjQgMyAxMSA3IDIzIDUgMTcgMTQgMyAxOCA1IDEzIDI2IDE1IDUgMTMgMjMgMTggCisxNyAzIDE4IDMgMjcgMTUgNiAyNSAyNCAyMiAyNyAxNyA0IDI1IDIzIDE1IDkgMTUgMjEgOCA3IDcgMTUgMyAxMyAyNSBeCis0NyAwIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDE4IDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IDEgMjEgOSAyMSAxNCAyMiA5IDkgNSAKKzE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAyMyAyNiA4IDI0IDEwIDIwIDI1IDI3IDI1IF4KKzU4IDEgOCAyNiA4IDEwIDQgMyA4IDE0IDUgNSA3IDExIDEzIDExIDI2IDExIDQgMjYgMTcgMjAgMTkgMTEgMTAgMyAxMCAxNCA5IDYgOSAKKzcgMTYgMTAgNCA0IDE5IDE5IDIgMjYgMTMgMTkgMTcgMTUgMjQgMTUgNCAyMSAyMiAxMyAxMyAxMiAyMiAyIDE0IDIwIDUgMTggNyAyNSBeCis1OCAwIDE3IDI0IDIwIDEzIDYgMTcgOSAyMCAyIDEwIDE5IDMgMjIgNCAxIDExIDMgNSAzIDIxIDExIDE1IDEyIDIzIDI2IDUgMiAyNyA2IAorNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IDE5IDIzIDMgOSAyMiAxNSBeCis1NCAwIDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDE0IDE4IDE5IDcgOSAxIDE0IDExIDEwIDE2IAorMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IDEyIDkgMiA4IDE2IDIwIDI0IDI1IF4KKzQ5IDEgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgNCA2IDggMjQgMTEgMjUgCisxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDE5IF4KKzU2IDEgMTcgMTYgMTcgMSAzIDEyIDEgNCAxMyAzIDkgMjEgMjMgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IAorMTMgMSAxNiAxNSAxMiAyNiAzIDE2IDE2IDggMTcgMTMgMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIyIF4KKzUxIDEgMyAyNiAyMiAzIDcgNiA0IDI2IDMgMTUgOCAyNSAxIDIwIDEzIDkgMTEgMjAgNiAxMSAyMSAyNyAyNSAyMCA3IDQgMTggMjYgMTYgCisyNyA1IDEyIDE5IDcgMjMgNiAyNSAyNSAyIDExIDEzIDI1IDIxIDE4IDE3IDYgMTIgMTQgMTMgMjQgMTMgXgorNDggMSAxNCAxOSAyNiAyNyAyNSA2IDEgMTUgNCA3IDI3IDI0IDI3IDIxIDUgMjcgMTkgMTggOCAyMSAzIDIzIDIwIDIxIDI1IDIxIDEgOSAKKzE3IDIyIDUgMjIgOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDI1IF4KKzUyIDAgMiA2IDEgMSAyNiAxOCAxMyA1IDEwIDE4IDEwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgCisxNyAxMCAxNSAyIDIwIDI1IDI2IDIzIDI1IDEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgMjYgXgorNTMgMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgNSAxOSAzIDE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiAKKzYgMTUgMjIgMSAyMSA2IDYgMTAgMiAyNiAxMiAxMSA2IDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE0IF4KKzYxIDAgMTYgMTIgNyAxNSAxNyA3IDUgMTEgMTIgMTUgNyAxIDEwIDEwIDggNCAyIDQgMTcgNCAxMSAxNyAyNiAyMyAyNCA0IDUgMTIgNSAKKzEgNiA5IDYgOCAyNyA1IDExIDExIDI0IDI0IDEzIDE3IDIgMjQgMjYgMTkgMTEgMjIgMjEgMiAyIDE0IDIxIDEzIDEgMjMgMTAgMjUgOCAKKzE1IDEzIF4KKzUyIDAgMTkgMjMgMiA5IDI2IDYgMjMgMTMgNSAyNCAxMiAyMSAxMSAxNCA0IDEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IAorMTAgMjcgOSAxMiAxMyAyMCAxMCAxMiAyMyAyMyAxMSAxOSAxMyAyNSAyMiA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjYgXgorNTEgMCAxMiAxNSA2IDIxIDI3IDIyIDI2IDI0IDE4IDkgMTUgOCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIAorNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSA0IDE0IDI1IDE0IDMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSAyMiBeCis1NiAwIDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCA2IDcgMyAyNSAxIDE3IDggMjYgMjUgMTEgMjMgMTQgMjcgCisxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIDkgMjMgMTcgXgorNTAgMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMTIgNiAyMiAyMCA4IDI1IDQgMjUgMjQgMjMgMjAgMyAzIDE2IDIgMiAyNyAyIAorMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgMjIgMTEgOSAxMCAyNCAxNSAxIDI3IDExIDI3IDIxIF4KKzUyIDAgMSAyNSAyNSAxNiA2IDIgMjIgMTIgMTcgMjEgMTIgOCA5IDIyIDE3IDEyIDcgMTggMTQgMjMgMiA2IDQgMjMgOSA0IDIyIDE2IAorMTggMjMgOCAxMSAyNSAxNyAyNyAxNiAxMCAzIDI0IDggMjAgMjAgMTggMTggMTMgNCAyIDE4IDIyIDE1IDI1IDEwIF4KKzUyIDAgOSAzIDEgMiAxOSAxNSAxIDI0IDE3IDE2IDE4IDkgMTQgMTEgOCAxNiAxOSAxNiAyMiAxMCAxNiAyNCAyNSA3IDIyIDEyIDIwIAorMTUgMjMgMjIgMTggMjIgMTQgNiAyNiAyMSAxMCAyMSA3IDEzIDIgMTYgNyAyNCAxNiAyMiAxMyAxMCA3IDExIDE2IDEzIF4KKzUzIDEgOSAyNSAxMyA5IDE0IDE0IDE3IDI1IDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgCisxMyAyNiAxNSA1IDEzIDIzIDE4IDE3IDMgMTggMyAyNyAxNSA2IDI1IDI0IDIyIDI3IDE3IDQgMjUgMjMgMTUgMTUgXgorNTIgMSAxNSAyMSA4IDcgNyAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDE4IDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IAorMSAyMSA5IDIxIDE0IDIyIDkgOSA1IDE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAyMyAyNiA4IDI0IDE0IF4KKzU4IDAgMjAgMjUgMjcgMyA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIAorMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgCisxOCBeCis2MCAwIDUgMTggNyAxNyAyNCAyMCAxMyA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAxMSAxNSAxMiAyMyAyNiA1IAorMiAyNyA2IDUgMTYgNiAzIDIgMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAxOSAyMyAzIDkgMjUgXgorNTUgMCAxNiAyMSAxNyAxOSAyNSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAxNCAxOCAxOSA3IDkgMSAxNCAxMSAxMCAKKzE2IDMgMjMgMTQgMjYgMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAxMiA5IDIgOCAxNiAyMCAyNCAyNyBeCis1MSAxIDI2IDI2IDQgOSAyIDcgMjUgOSA4IDEyIDE4IDE0IDI2IDcgMTcgMTggNCAyMCAxIDE2IDE0IDIxIDI2IDQgNiA4IDI0IDExIDI1IAorMTUgMjQgMTYgMjMgNCAxMCAyMyAyMSAyNCAxNSAxMCA5IDI2IDcgMTQgMjQgMjEgNiAyMCA1IDE3IDE1IF4KKzU3IDAgMTcgMSAzIDEyIDEgNCAxMyAzIDkgMjEgMjMgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IDEzIDEgMTYgCisxNSAxMiAyNiAzIDE2IDE2IDggMTcgMTMgMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIxIDMgMjYgMjMgXgorNTIgMCAzIDcgNiA0IDI2IDMgMTUgOCAyNSAxIDIwIDEzIDkgMTEgMjAgNiAxMSAyMSAyNyAyNSAyMCA3IDQgMTggMjYgMTYgMjcgNSAxMiAKKzE5IDcgMjMgNiAyNSAyNSAyIDExIDEzIDI1IDIxIDE4IDE3IDYgMTIgMTQgMTMgMjQgMTEgMTQgMTkgMjYgMTIgXgorNTUgMSAyNSA2IDEgMTUgNCA3IDI3IDI0IDI3IDIxIDUgMjcgMTkgMTggOCAyMSAzIDIzIDIwIDIxIDI1IDIxIDEgOSAxNyAyMiA1IDIyIAorOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDE4IDIgNiAxIDEgMjYgMTggMTMgNSAxMCAxOCAxMSBeCis1MiAwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgMTcgMTAgMTUgMiAyMCAyNSAyNiAyMyAyNSAKKzEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgNiAyMiA3IDggOCAxMiAyIDIxIDE4IDEyIDExIDI3IF4KKzUzIDEgMTkgMyAxOSAyNyAxOCAyNSAyMiAyMiAyMyAxNiAyIDEgMjAgMTYgMTQgMjIgNiAxNSAyMiAxIDIxIDYgNiAxMCAyIDI2IDEyIAorMTEgNiAyNyAxNCA3IDIwIDI2IDIwIDE3IDcgMTkgNSAyMyAxOCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDIyIF4KKzU3IDEgMTAgMTAgOCA0IDIgNCAxNyA0IDExIDE3IDI2IDIzIDI0IDQgNSAxMiA1IDEgNiA5IDYgOCAyNyA1IDExIDExIDI0IDI0IDEzIAorMTcgMiAyNCAyNiAxOSAxMSAyMiAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IDE1IDI2IDE5IDIzIDIgOSAyNiA2IDIzIDIyIF4KKzUyIDEgNSAyNCAxMiAyMSAxMSAxNCA0IDEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IDEwIDI3IDkgMTIgMTMgMjAgMTAgMTIgCisyMyAyMyAxMSAxOSAxMyAyNSAyMiA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjAgMTIgMTUgNiAyMSAyNyAyMiAyNiAxNiBeCis1OCAwIDE4IDkgMTUgOCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgCis0IDE0IDI1IDE0IDMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAyMiBeCis1NSAwIDYgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAKKzIyIDE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMTIgNiAyMiAxNiBeCis1MyAwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgMjIgMTEgOSAKKzEwIDI0IDE1IDEgMjcgMTEgMjcgNCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxMiA4IDkgMjIgMTcgMTIgMTggXgorNTQgMCA3IDE4IDE0IDIzIDIgNiA0IDIzIDkgNCAyMiAxNiAxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgOCAyMCAyMCAxOCAxOCAKKzEzIDQgMiAxOCAyMiAxNSAyNSAyNiA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggOSAxNCAxMSA4IDE2IDE5IDI3IF4KKzUyIDAgMjIgMTAgMTYgMjQgMjUgNyAyMiAxMiAyMCAxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIDIxIDcgMTMgMiAxNiA3IDI0IAorMTYgMjIgMTMgMTAgNyAxMSAxNiA1IDkgMjUgMTMgOSAxNCAxNCAxNyAyNSAyIDEwIDUgMjUgNSA3IDEwIDIyIDEwIDIyIF4KKzU0IDEgMjQgMyAxMSA3IDIzIDUgMTcgMTQgMyAxOCA1IDEzIDI2IDE1IDUgMTMgMjMgMTggMTcgMyAxOCAzIDI3IDE1IDYgMjUgMjQgMjIgCisyNyAxNyA0IDI1IDIzIDE1IDkgMTUgMjEgOCA3IDcgMTUgMyAxMyAyMiAyNSAzIDQgMTAgMjQgMTIgNyAxNiAyNSAxMCBeCis1NiAwIDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IDEgMjEgOSAyMSAxNCAyMiA5IDkgNSAxNSAxMyAxNyAzIDQgOSAxNiAxIDggMjMgMTcgCisyMyAyNiA4IDI0IDEwIDIwIDI1IDI3IDMgOCAyNiA4IDEwIDQgMyA4IDE0IDUgNSA3IDExIDEzIDExIDI2IDExIDQgMjYgMiBeCis2MSAxIDIwIDE5IDExIDEwIDMgMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIAorMTMgMTMgMTIgMjIgMiAxNCAyMCA1IDE4IDcgMTcgMjQgMjAgMTMgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgCisxMSAxNSAyMiBeCis1MyAwIDIzIDI2IDUgMiAyNyA2IDUgMTYgNiAzIDIgMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAKKzE5IDIzIDMgOSAyMiAxNiAyMSAxNyAxOSAyNSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAyNSBeCis2MCAwIDE4IDE5IDcgOSAxIDE0IDExIDEwIDE2IDMgMjMgMTQgMjYgMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAKKzEyIDkgMiA4IDE2IDIwIDI0IDUgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgCisxOCBeCis1NCAwIDYgOCAyNCAxMSAyNSAxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDUgMTcgMTYgCisxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgMTMgMjQgXgorNTcgMCAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgCisyMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxMCBeCis0OCAwIDI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAyNyAKKzI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgOCBeCis2MCAxIDEgOSAxNyAyMiA1IDIyIDggMiAxMyAyNyA4IDE5IDI3IDIxIDIgNSA4IDQgMjcgMTAgNiAxOCAyIDYgMSAxIDI2IDE4IDEzIDUgCisxMCAxOCAxMCA4IDUgMjEgMTUgNSAxNCAxOSAxMiA0IDggMjAgMjEgMjYgMSAxMiAyNSAxMCAyIDE3IDEwIDE1IDIgMjAgMjUgMjYgMjMgCisyMSBeCis1NCAxIDEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgNiAyMiA3IDggOCAxMiAyIDIxIDE4IDEyIDExIDUgMTkgMyAKKzE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiA2IDE1IDIyIDEgMjEgNiA2IDEwIDIgMjYgMTIgMTEgMjQgXgorNjAgMCAyNyAxNCA3IDIwIDI2IDIwIDE3IDcgMTkgNSAyMyAxOCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDEgMTAgMTAgOCA0IAorMiA0IDE3IDQgMTEgMTcgMjYgMjMgMjQgNCA1IDEyIDUgMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgMTcgMiAyNCAyNiAxOSAxMSAKKzIyIF4KKzU1IDAgMjEgMiAyIDE0IDIxIDEzIDEgMjMgMTAgMjUgOCAxNSAyNiAxOSAyMyAyIDkgMjYgNiAyMyAxMyA1IDI0IDEyIDIxIDExIDE0IDQgCisxMiAxMCAxMiAyMiA0IDMgMjAgMTcgMTAgMTMgMTYgOSAxMCAyNyA5IDEyIDEzIDIwIDEwIDEyIDIzIDIzIDExIDE5IDEzIDI1IDEzIF4KKzU1IDAgOCAxIDUgMTYgMjAgOSAxOSA5IDI0IDIwIDEyIDE1IDYgMjEgMjcgMjIgMjYgMjQgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAKKzEzIDE4IDI0IDEgOCAyNCA4IDYgMTQgMSA0IDUgMTUgMjcgMTIgMjAgMSAxNyA1IDQgMTQgMjUgMTQgMyAxOSAyNCAxNiBeCis2MCAwIDE0IDggMTMgMTIgMTkgOCAzIDYgMTMgNyAxMCAyMyAxOSAxMCAxNyAxNyAxMSA2IDEzIDggMTggNiA3IDMgMjUgMSAxNyA4IDI2IAorMjUgMTEgMjMgMTQgMjcgMSAyMiAxMSA5IDcgMTkgNCAxNSAxOCAyIDI3IDIwIDExIDUgMjAgMjIgMTkgMTUgNSA2IDE3IDggMSAxOSAyMiAKKzEwIF4KKzU1IDEgMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAyNSA3IDI2IDEgMTMgNSA5IDEgMyAKKzkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAxNyAyMCAyMCA3IDIxIDEzIDggMjIgXgorNTIgMSAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAxNCAxNSAxOCAxMyAxMiAyMSAKKzE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgMTcgXgorNTcgMCAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDIyIDE4IDYgCisxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAyMyAxMiAyNSA1IAorXgorNTcgMCAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjMgMjEgMjQgNSAxNSAyMSAKKzMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAxOSAyMCA5IF4KKzU1IDAgNiAyMyA0IDcgNyAzIDEwIDI0IDI4IDYgMTAgOSA2IDIwIDE0IDI3IDEwIDE5IDExIDEgMTUgMjEgNSAxMCA3IDExIDggMTYgOSAKKzI3IDUgMiA2IDYgMjcgMjAgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMjggXgorNTkgMSAxNyA1IDkgMTAgMjUgMjAgMTIgOSAxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIAorMSAxOCAyMiAxNCA3IDIwIDIxIDIgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IAorMjUgXgorNTUgMCAzIDUgMTYgMTYgMjIgMiAxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgCisxNSAxOCA0IDE5IDEwIDI3IDkgNCAyNSAxMyAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMTggXgorNTMgMSAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IDE1IDQgMjYgNSA2IDIwIDUgMjMgMjggMTAgMjQgMTkgMTMgMjggMSA5IDEyIDIzIDE2IAorMTAgMTMgMiAxOSAyMSA2IDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSAxMCBeCis0NyAwIDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IDI2IDI4IDI0IDEzIDIyIDE3IDYgNCAyNCAxNSAxNyAxOCA0IDIyIDIzIDkgMjQgMTIgCisyNyAyNyAyNSA5IDEzIDE1IDExIDkgMjIgMjggMjYgMTEgMTggMTUgMTAgNiAxNiAxNyAxNCAyNCBeCis1NSAxIDI1IDI3IDE2IDI4IDIyIDI0IDEgMSAxMSA3IDI0IDMgMjggNyA1IDI4IDE2IDE1IDEgNyAxNCA5IDcgNiAxNSAyNSAxOSA5IDMgCisxOSAyMyAxIDI2IDIwIDE3IDE3IDEgMTYgMjQgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI2IF4KKzQ3IDEgMTQgNCAyMSAyNiAyMyA3IDggMjcgMjMgMjMgMjIgMTkgMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAKKzIzIDI3IDQgMTYgMjAgMTggMTIgMjAgMTUgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMTYgXgorNTAgMCAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgCisxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjUgXgorNjAgMCAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgCisxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgCisxOSAyMiBeCis1NCAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAKKzEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgMTcgOSAyMyAyMCAzIDI4IDIxIF4KKzU2IDAgMTIgMTcgMjUgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAxNCA4IDYgNyAxOSAxNSAKKzIzIDEgMTcgMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyA4IDMgMTcgMjggMTggMTMgXgorNTggMCAyIDUgMyAyMSAyMSAxNSA2IDI0IDEgNCAyNCAxOCAxMCAyMiAxIDIxIDEyIDUgNCA0IDIwIDI1IDI0IDI2IDggMjUgMTEgMiA3IAorMjcgMjIgMTkgNCAxOCAyNyAxMCAyOCA0IDEyIDI0IDggMTYgMTIgMTEgMTYgMTcgMjUgOCAxMiAxNiAxIDkgOSAxMCA1IDI0IDIzIDExIF4KKzYyIDEgNSAxNCAxOCA4IDQgOSA1IDE3IDggMjggMSAyMiA0IDExIDMgMiAxNyAzIDE0IDkgMjcgMTMgMTggMjQgOSA4IDcgMjggMjUgMTQgCisyMSAyNyAyNCA2IDE4IDE2IDIgMTIgMTUgOSAxNCAxMCAxIDggMTcgNCA2IDE1IDI2IDExIDE1IDIgMjggMjAgMjYgMTYgMyA3IDUgOCA5IAorMjQgXgorNTAgMSAxMCAxMiAyNSAxMSA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAxMCAxMiAyOCAyNCAKKzIyIDI2IDI4IDE1IDkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMTUgMTMgMTcgXgorNjAgMSA3IDI2IDEgMTMgNSA5IDEgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgMTcgMjAgCisyMCA3IDIxIDEzIDggMjggMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgMTQgMTUgCisxOCAxNyBeCis1MiAwIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgCisxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDE5IF4KKzU3IDEgMTggNiAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAKKzIzIDEyIDI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDIzIDIxIDEyIF4KKzY3IDEgNSAxNSAyMSAzIDMgMTggMiAyNCAyNyAxMSAyMCAxMCAxMSA0IDUgMTIgMiAyMyA2IDUgMyAxIDE0IDI2IDE1IDEyIDYgMjggMTIgCisxOSAyMCA2IDIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IAorMjcgNSAyIDYgNiAyNyAyIF4KKzU2IDEgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMTQgMTcgNSA5IDEwIDI1IDIwIDEyIDkgCisxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIDEgMTggMjIgMTQgNyAyMCAyMSAyNCBeCis2MCAxIDExIDEyIDMgMTUgMTIgNCAxIDI3IDIxIDE2IDI3IDE5IDE4IDEzIDIxIDE0IDUgMjAgOSAxOSAyNyA2IDMgNSAxNiAxNiAyMiAyIAorMTMgNyA0IDEzIDE5IDI3IDE1IDcgMTYgMjUgMyA0IDQgMTcgMTIgMTMgMTEgMTIgMjYgNiAxIDEwIDE1IDE4IDQgMTkgMTAgMjcgOSA0IAorMjUgMjcgXgorNTEgMCAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMyAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IDE1IAorNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgMTAgMTMgMiAxOSAyMSAyMyBeCis0OSAxIDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSA1IDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IAorMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAyNyAyNyA5IF4KKzU2IDAgOSAxMyAxNSAxMSA5IDIyIDI4IDI2IDExIDE4IDE1IDEwIDYgMTYgMTcgMTQgMTEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgCisyNCAzIDI4IDcgNSAyOCAxNiAxNSAxIDcgMTQgOSA3IDYgMTUgMjUgMTkgOSAzIDE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAxNiBeCis1MSAwIDkgMTYgOCAxNSA2IDIxIDE3IDIyIDkgMjggOCA4IDUgNCAyNCAyNyAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAKKzI0IDI1IDE2IDE5IDEyIDIyIDEwIDIwIDMgNyAxNCAxIDIwIDYgMjYgMjMgMjcgNCAxNiAyMCAxOCAxMiAyMiBeCis1MSAwIDE1IDE5IDE2IDE4IDIwIDI3IDExIDExIDE3IDI0IDE4IDEgMTkgMSAyNSAyMyAyIDE1IDE2IDI2IDI3IDIzIDE0IDEyIDI4IDIyIAorMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAyMSAxMyAyNyA1IDExIDI4IDE2IF4KKzU5IDAgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTEgNSAyNiAxOCAxOSAyMSAzIDEyIDExIDEzIDQgMTQgCisyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAyNyAyNiA0IDMgMjUgNiAxNCAyIDMgNSA3IDIzIDExIDIyIAorMTAgXgorNTkgMCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDkgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgCisxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiA2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIAorNyBeCis1NiAxIDE3IDkgMjMgMjAgMyAyOCAyNyAxMiAxNyAyNSAyOCAxOSA1IDIxIDQgMjcgOCAxIDE5IDE0IDIwIDYgNyA5IDEgNiAyMiAzIDE5IAorMjYgMTQgOCA2IDcgMTkgMTUgMjMgMSAxNyAxNiA2IDI2IDE0IDUgMjIgMjUgNCA3IDEwIDE2IDIxIDEwIDE4IDE5IDI0IDE2IF4KKzU3IDEgMjMgOCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgCisyNCAyNiA4IDI1IDExIDIgNyAyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE4IF4KKzYzIDAgMSA5IDkgMTAgNSAyNCAyMyAxOCA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAKKzE4IDI0IDkgOCA3IDI4IDI1IDE0IDIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAKKzI4IDIwIDE2IF4KKzUyIDEgMTYgMyA3IDUgOCA5IDI2IDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIAorMjUgMTAgMTAgMTIgMjggMjQgMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMjggXgorNjAgMCAyMSA5IDE1IDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggCisxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgCisxMCAyMCBeCis1NCAxIDE0IDE0IDE1IDE4IDEzIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgCisxNyAyMiAxOCAyMSAxOSAxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAxMSBeCis1OCAwIDkgMTUgMjIgMTggNiAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgCisyIDE0IDEzIDIzIDEyIDI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDI3IAorXgorNjQgMSAyMSAyNCA1IDE1IDIxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAKKzI4IDEyIDE5IDIwIDYgMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSAKKzggMTYgOSAyNyAyMCBeCis1OCAxIDIgNiA2IDI3IDIwIDI0IDIxIDIgMjAgMTYgMTQgMjQgMTcgMTUgMyAyIDI2IDI1IDI1IDE0IDI0IDIwIDI4IDE0IDE3IDUgOSAKKzEwIDI1IDIwIDEyIDkgMTggMyAxNiA0IDEwIDcgMTggMjMgMTcgMiA4IDEgMjggNyAyIDE1IDUgMTggMTEgMjMgMiAxIDE4IDIyIDE0IAorMjggXgorNjIgMCAyMCAyMSAyIDExIDEyIDMgMTUgMTIgNCAxIDI3IDIxIDE2IDI3IDE5IDE4IDEzIDIxIDE0IDUgMjAgOSAxOSAyNyA2IDMgNSAxNiAKKzE2IDIyIDIgMTMgNyA0IDEzIDE5IDI3IDE1IDcgMTYgMjUgMyA0IDQgMTcgMTIgMTMgMTEgMTIgMjYgNiAxIDEwIDE1IDE4IDQgMTkgMTAgCisyNyA5IDQgMjYgXgorNTIgMCAxMyAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMyAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IAorMTUgNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgMTAgMTMgMiAxOSAyMSAyNyBeCis0OSAxIDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSA1IDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IAorMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAyNyAyNyAyNiBeCis1NyAwIDkgMTMgMTUgMTEgOSAyMiAyOCAyNiAxMSAxOCAxNSAxMCA2IDE2IDE3IDE0IDExIDI1IDI3IDE2IDI4IDIyIDI0IDEgMSAxMSA3IAorMjQgMyAyOCA3IDUgMjggMTYgMTUgMSA3IDE0IDkgNyA2IDE1IDI1IDE5IDkgMyAxOSAyMyAxIDI2IDIwIDE3IDE3IDEgMTYgMjQgOSBeCis1MiAxIDkgMTYgOCAxNSA2IDIxIDE3IDIyIDkgMjggOCA4IDUgNCAyNCAyNyAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAKKzI0IDI1IDE2IDE5IDEyIDIyIDEwIDIwIDMgNyAxNCAxIDIwIDYgMjYgMjMgMjcgNCAxNiAyMCAxOCAxMiAyMCAxOSBeCis1MiAxIDE5IDE2IDE4IDIwIDI3IDExIDExIDE3IDI0IDE4IDEgMTkgMSAyNSAyMyAyIDE1IDE2IDI2IDI3IDIzIDE0IDEyIDI4IDIyIDE1IAorOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAyMSAxMyAyNyA1IDExIDI4IDE3IDcgMjQgXgorNTkgMCA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTEgNSAyNiAxOCAxOSAyMSAzIDEyIDExIDEzIDQgMTQgMjIgCisyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAyNyAyNiA0IDMgMjUgNiAxNCAyIDMgNSA3IDIzIDExIDIyIDggCisyNSAyNiBeCis1OSAwIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDkgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgMTYgMyAKKzI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiA2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIDEzIAorMTcgMjEgXgorNTYgMSAyMyAyMCAzIDI4IDI3IDEyIDE3IDI1IDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgMjYgCisxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IDE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgMjMgMjAgXgorNjAgMCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgCisyNiA4IDI1IDExIDIgNyAyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IAorMTAgMjEgXgorNjAgMCAyNCAyMyAxOCA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAKKzI4IDI1IDE0IDIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAKKzI1IF4KKzUzIDEgNyA1IDggOSAyNiAxMCAxMiAyNSAxMSA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAKKzEwIDEyIDI4IDI0IDIyIDI2IDI4IDE1IDkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMjQgXgorNjIgMSAxMyAyNSA3IDI2IDEgMTMgNSA5IDEgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgCisxNyAyMCAyMCA3IDIxIDEzIDggMjggMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgCisxNCAxNSAxOCAxMyBeCis1NCAwIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgCisxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDIyIDE4IDEzIF4KKzU4IDAgMTcgMjQgNyAxMyA2IDEyIDcgMiAxOCAxOCAyNiAxMyAxMyAxNiA4IDI0IDEwIDMgMjYgOSAyMCAxIDEyIDIgMTQgMTMgMjMgMTIgCisyNSAzIDI0IDExIDYgMyA4IDI3IDggMjEgMjYgMyAxMSAxOSAxOCA1IDUgMjUgMjYgMjQgNCAyMyAxNSAxNSAyMyAyMSAyNCA1IDE1IDI2IAorXgorNjcgMSAzIDMgMTggMiAyNCAyNyAxMSAyMCAxMCAxMSA0IDUgMTIgMiAyMyA2IDUgMyAxIDE0IDI2IDE1IDEyIDYgMjggMTIgMTkgMjAgNiAKKzIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IDI3IDUgMiAKKzYgNiAyNyAyMCAyNCAyMSAxMiBeCis2MiAwIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAxNCAxNyA1IDkgMTAgMjUgMjAgMTIgOSAxOCAzIDE2IAorNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgMSAxOCAyMiAxNCA3IDIwIDIxIDIgMTEgMTIgMyAxNSAxMiAKKzQgMSAyNyAxOCBeCis2MSAxIDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAyNyAxNCA1IAorMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgMjQgNSAyMCAKKzggOSAyNiBeCis1NSAxIDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgMTUgCis1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMjggXgorNTIgMSAyNCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgCisxNSAyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDI3IF4KKzY1IDAgMyAyIDIgMTcgMjEgMTMgNSA5IDIxIDI4IDkgMSAxMyAyIDIxIDggMjQgMSAzIDI3IDEzIDE4IDE5IDQgMTUgMTIgNSAyIDE2IAorMjcgMTYgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgCisyNCAyNSAxNSAxOSAyMyAxMiBeCis1NSAwIDEgOSAxNSAxMCAxMiA3IDI1IDExIDI1IDIgMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI1IDE3IDYgMjkgMjEgMjQgMjcgMjEgMTcgCisxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDI0IF4KKzUzIDEgMjIgMyAyNyAyMSAyIDI2IDE5IDkgMTkgMjcgMjMgMyAxMiAxNyAxMCA0IDggMjcgMTkgMTYgMSAyMSAyMyAyOCAyMyAxOCA4IAorMjUgMTggMjYgMjAgOCAxNyAxOSAyIDQgMTEgNyAxOCA2IDI0IDIgMjUgMjUgNSAyNyAyMCAzIDI4IDIwIDE4IDIxIDExIF4KKzU1IDAgMjUgMTAgMSAyOCAyOCAyOSAxNiAyMCAxOSAyNiAxNiAyMSA2IDIzIDE1IDI4IDI2IDI4IDcgMTUgMTggMTEgNSAxNyAyMCAyNiAKKzEgMTAgMTQgOCA0IDE2IDI2IDE3IDggMTAgMjIgMjIgMTggMSAyMCAyNCA3IDEgOSA3IDE5IDUgMjIgMSA0IDI2IDExIDEwIDIwIF4KKzU4IDAgNSAxNCAyIDYgNCAyIDkgMjIgMTUgMTMgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgCis0IDUgMjcgNSAxOSAyMSA1IDYgMTEgMjkgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgMTIgXgorNTQgMCA1IDI2IDYgMjEgMjkgMyA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgCisxNSA2IDI1IDI2IDI5IDI0IDE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDI4IAorXgorNTYgMCAzIDYgMTkgMjggMTcgMTEgMSA5IDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IAorOSAyOCAxMyAyNSAyNCAyOCA4IDE0IDkgMyAxNCAxOCAyNiA5IDkgMTIgMTMgMTcgMjUgMTYgNSA4IDQgMjQgMTAgMjQgMjMgMjUgXgorNDkgMCAyOSAyMSA5IDE4IDI4IDI1IDExIDMgMTYgNCAyMSAyNSAzIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IAorMjcgMjYgMjEgMjUgMjEgMTggOSAyNCAxNiAyMiA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDI3IF4KKzU4IDEgMjkgNyAxOSAxMyAxMyA4IDE5IDIwIDE4IDIgMTkgMjIgMjkgMyAxMCA2IDkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgCis4IDI2IDI1IDEyIDIgMTQgMyAxIDEgMTYgMTIgMjAgMjggMjQgMTIgNSAyNCAyNSAyMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDIwIAorXgorNTYgMCAyMSAyOCAxIDE3IDYgMTcgMjcgMSAyIDEwIDE2IDE5IDUgMTQgMTAgMjcgMTEgMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgCisxMSAyNyAxOCAyMiAyNyAyMiA5IDggMTggMyAxNCAxMCA1IDIgMjQgMTggMjMgMjEgMjYgOCAyMiA4IDEgNiAyNyAyNyAxNSAyOSAxOCBeCis2NCAwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAxNiA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgMjIgNyAyIAorOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAxNyAyIDEyIAorMTAgNSAxMCAxNSAyNSBeCis2MiAxIDggMTUgMyA3IDEzIDI1IDE2IDE0IDEgMjkgMjIgMjYgMTUgMjcgOSAxIDggOCAyOCA2IDEzIDUgMTMgMyAxNSA1IDIzIDggMjMgCisyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IDcgNSAyNiAxOCAxNSAyMiAyOCAxNiAxMyA3IDIgMjMgMTkgMjUgMjkgMTcgCis3IDE2IDIyIF4KKzU1IDEgMjMgMTEgMTEgMTUgMiAxMyA5IDI2IDIgMjQgMjYgNyAyOCAxMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IDI5IDEgMjQgMTEgCisxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgMjggMTUgXgorNTIgMCAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMTQgMTUgMTYgMTAgMTkgMTIgMTkgMTEgMjAgMTMgMjggNCAyNyAKKzI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAyMiAxMyAxMiAyMSAyMiAyMSAxMSAxMiAxNCAxMiAyOCBeCis2MiAwIDI3IDggNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMCAyIDExIDIzIDEgMTEgMSA1IDMgMjMgMTYgMTUgCisyNyAxNCA1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgMTUgMSAyNiAxMiAyNyAyNSA0IDI4IDIyIDExIDE5IDE5IAorMjQgNSAyMCAxOCBeCis1OCAwIDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IAorMTUgNSA4IDIyIDE3IDI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDE2IF4KKzU2IDAgOSAxNyAxMSAyOCAxMiAyNiAyNiA2IDI5IDEzIDEwIDIwIDYgMjMgMTAgNCAzIDI2IDI2IDE0IDIwIDIwIDI1IDE0IDEzIDE1IAorMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSA3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAyMyAKK14KKzY0IDEgNSA5IDIxIDI4IDkgMSAxMyAyIDIxIDggMjQgMSAzIDI3IDEzIDE4IDE5IDQgMTUgMTIgNSAyIDE2IDI3IDE2IDYgMiAxIDIzIAorMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgMjQgMjUgMTUgMTkgMjMgCisyOCAxIDkgMTUgMTAgMjQgXgorNTQgMCA3IDI1IDExIDI1IDIgMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI1IDE3IDYgMjkgMjEgMjQgMjcgMjEgMTcgMTcgMjYgMjQgMTMgNCAKKzIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDcgMjIgMyAyNyAyOSBeCis1NCAxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDggMjUgMTggMjYgMjAgCis4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIDMgMjggMjAgMTggMjEgMTAgMjUgMTAgMSAyOCAyNyBeCis2MCAwIDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMjggNyAxNSAxOCAxMSA1IDE3IDIwIDI2IDEgMTAgMTQgOCA0IDE2IAorMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgMTkgNSAyMiAxIDQgMjYgMTEgMTAgMjggNSAxNCAyIDYgNCAyIDkgMjIgCisxNSAyMiBeCis1NCAxIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgMTcgNSAxNSA5IDI1IDEwIDI2IDQgNSAyNyA1IDE5IDIxIDUgNiAxMSAKKzI5IDE5IDggMiAyNCAyNiAyMiAxOSAxOCAxNyAyMyAxNCAyMSAxNCAyMiAxMyAyMCA1IDI5IDYgNSAyNiA2IDIxIDI5IDI4IF4KKzU3IDEgNSAxMiAxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgMjUgMjYgMjkgMjQgCisxOSAxNyAxOCAyNSAyMiAxMiAxMyAyMyAyMyAxMiAxMCAxMyAxIDIyIDEwIDIgMjIgMiAyOCAxMCAxNyAxOCAzIDYgMTkgMjggMTcgMTEgCisxIDkgMjMgXgorNTQgMCAxNCA0IDI5IDI5IDIzIDI1IDEzIDE5IDE4IDIgNyAyMSA2IDggMjkgNSAxMSAyMiAxNCAxNCA5IDI4IDEzIDI1IDI0IDI4IDggCisxNCA5IDMgMTQgMTggMjYgOSA5IDEyIDEzIDE3IDI1IDE2IDUgOCA0IDI0IDEwIDI0IDIzIDQgMjkgMjEgOSAxOCAyOCAyNyBeCis1MiAxIDExIDMgMTYgNCAyMSAyNSAzIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IDI3IDI2IDIxIDI1IDIxIDE4IAorOSAyNCAxNiAyMiA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDIzIDI5IDcgMTkgMTMgMTMgOCAxOSAyMCAyMyBeCis2MSAwIDIgMTkgMjIgMjkgMyAxMCA2IDkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgOCAyNiAyNSAxMiAyIDE0IDMgMSAxIDE2IAorMTIgMjAgMjggMjQgMTIgNSAyNCAyNSAyMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDE4IDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgCisxMCAxNiAxOSBeCis1NyAxIDUgMTQgMTAgMjcgMTEgMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgMTEgMjcgMTggMjIgMjcgMjIgOSA4IDE4IDMgMTQgMTAgCis1IDIgMjQgMTggMjMgMjEgMjYgOCAyMiA4IDEgNiAyNyAyNyAxNSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMjQgXgorNjQgMCA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIAorMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAxNyAyIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgCisxNCAxIDI5IDIyIDI2IDEwIF4KKzYzIDEgMjcgOSAxIDggOCAyOCA2IDEzIDUgMTMgMyAxNSA1IDIzIDggMjMgMiA1IDUgNCAxNyAxMyAxNCA3IDE3IDEyIDI3IDMgMTggNSAKKzcgNSAyNiAxOCAxNSAyMiAyOCAxNiAxMyA3IDIgMjMgMTkgMjUgMjkgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAKKzI2IDcgMjggMTEgXgorNTYgMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IDI5IDEgMjQgMTEgMTggMjAgMyAxMyAxMSA3IDMgMTUgMTcgMjQgMSAxOCAxMyA2IAorMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgMjggNiAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMjkgXgorNTQgMCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAyOCA0IDI3IDI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAKKzIyIDEzIDEyIDIxIDIyIDIxIDExIDEyIDE0IDEyIDE4IDI3IDggNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMiBeCis2MyAwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAyNyAxNCA1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgCisxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgMjQgNSAyMCA4IDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgCisxNiA4IDMgMTcgMTkgXgorNTkgMCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAxMiAyNCAxNSA1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIAorNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAxNSAyNCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgCisyNiAxMCBeCis2MiAwIDE0IDIwIDIwIDI1IDE0IDEzIDE1IDI0IDE0IDExIDQgMjMgMjcgMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgCis3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAxMyA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IAorMiAxNiAyNyAyOSBeCis2MiAwIDYgMiAxIDIzIDE3IDE0IDI4IDE5IDIzIDYgMjIgMTYgNCAxOSA2IDE2IDI4IDMgMyAxIDE1IDEzIDIyIDYgMTUgMTEgNiA0IDI0IAorMjUgMTUgMTkgMjMgMjggMSA5IDE1IDEwIDEyIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAKKzI3IDIxIDE4IF4KKzU0IDEgMTcgMjYgMjQgMTMgNCAyMiAyNCAyOSAyIDExIDggMTcgNCAyMyAxMSAyNiAxIDI1IDI4IDE1IDE5IDEwIDMgOSAyOSAyNyA3IAorMjIgMyAyNyAyMSAyIDI2IDE5IDkgMTkgMjcgMjMgMyAxMiAxNyAxMCA0IDggMjcgMTkgMTYgMSAyMSAyMyAyOCAyMyAxOCAxNyBeCis1MiAwIDI1IDE4IDI2IDIwIDggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgMyAyOCAyMCAxOCAyMSAxMCAyNSAKKzEwIDEgMjggMjggMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAyOCA3IDE1IDE4IDExIDUgMTcgMjAgMTMgXgorNjggMCAxIDEwIDE0IDggNCAxNiAyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCAKKzUgMTQgMiA2IDQgMiA5IDIyIDE1IDEzIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgMTcgNSAxNSA5IDI1IDEwIDI2IDQgNSAKKzI3IDUgMTkgMjEgNSA2IDExIDE5IF4KKzU0IDEgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgNiA1IDI2IDYgMjEgMjkgMyA1IDEyIAorMTYgMTEgMTMgMTYgMTggMTggMTAgMTEgMjAgMjEgMTIgMTEgMTIgMjIgMTQgMTkgMyAyMSAxNSA2IDI1IDI2IDI5IDI0IDE5IDE3IDI0IF4KKzU5IDAgMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMTggMyA2IDE5IDI4IDE3IDExIDEgOSAKKzE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgMjUgMjQgMjggOCAxNCA5IDMgCisxNCAxNiBeCis1MyAwIDI2IDkgOSAxMiAxMyAxNyAyNSAxNiA1IDggNCAyNCAxMCAyNCAyMyA0IDI5IDIxIDkgMTggMjggMjUgMTEgMyAxNiA0IDIxIDI1IAorMyA0IDE4IDEyIDEyIDI5IDI2IDEzIDI2IDIzIDI2IDcgMjMgMTAgOSAyNyAyNiAyMSAyNSAyMSAxOCA5IDI0IDE2IDE3IF4KKzU5IDAgNSAyMSA3IDcgMjcgNCAyMCAyMyAxMyAyNyAxMCAyMyAyOSA3IDE5IDEzIDEzIDggMTkgMjAgMTggMiAxOSAyMiAyOSAzIDEwIDYgCis5IDEzIDI0IDE3IDE2IDkgMjAgMjEgMjcgMiAxOSA3IDggMjYgMjUgMTIgMiAxNCAzIDEgMSAxNiAxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IAorMTkgXgorNjAgMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDE4IDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgMTAgMTYgMTkgNSAxNCAxMCAyNyAxMSAKKzE3IDMgMjkgMTQgMjcgMTcgNSAyIDE4IDIwIDExIDI3IDE4IDIyIDI3IDIyIDkgOCAxOCAzIDE0IDEwIDUgMiAyNCAxOCAyMyAyMSAyNiAKKzggMjIgMTMgXgorNjIgMCAxIDYgMjcgMjcgMTUgMjkgMjAgMiAyOSAyMiA4IDE2IDIwIDQgMTIgOSA2IDEyIDE2IDE2IDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAKKzI1IDE2IDI5IDEwIDIyIDcgMiA4IDUgMTggMTQgMjMgMjQgNCA2IDI2IDMgMTEgNiAxMiAxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAKKzI5IDI1IDI0IF4KKzY3IDAgMTQgMTcgMiAxMiAxMCA1IDEwIDE1IDI1IDggMTUgMyA3IDEzIDI1IDE2IDE0IDEgMjkgMjIgMjYgMTUgMjcgOSAxIDggOCAyOCAKKzYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IDcgNSAyNiAxOCAxNSAyMiAyOCAKKzE2IDEzIDcgMiAyMyAxOSAyNSAxNCBeCis1OCAxIDE3IDcgMTYgMjUgMjMgMTEgMTEgMTUgMiAxMyA5IDI2IDIgMjQgMjYgNyAyOCAxMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IAorMjkgMSAyNCAxMSAxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgCisxMSBeCis1NSAwIDYgMjggMTQgMTIgMjggMjcgMjIgNCAxNCAyNSAxIDMgOSA3IDExIDE0IDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIDI4IDQgCisyNyAyOCA3IDI3IDEyIDQgMjggMjEgMTcgMjIgMjAgMTcgMTUgMTUgMjMgMjIgMTMgMTIgMjEgMjIgMjEgMTEgMTIgMTQgMTIgMTggMjcgCisxMCBeCis2NSAwIDcgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IAorNSAxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IAorMjAgOCA5IDUgMjUgMTkgMjAgXgorNTkgMSAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IDE1IDUgOCAyMiAxNyAKKzI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDI0IDkgMTcgMTEgMjggMTIgCisyMyBeCis2MSAwIDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgMjQgMTQgMTEgNCAyMyAyNyAKKzI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIDUgOSAyMSAyOCA5IDEgMTMgCisyIDIxIDggMjkgXgorNjggMCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgMjcgMTYgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IAorNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAyNCAyNSAxNSAxOSAyMyAyOCAxIDkgMTUgMTAgMTIgNyAyNSAxMSAyNSAyIAorMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI2IF4KKzU0IDEgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggCisxNSAxOSAxMCAzIDkgMjkgMjcgNyAyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAyMCBeCis1MiAxIDE2IDEgMjEgMjMgMjggMjMgMTggOCAyNSAxOCAyNiAyMCA4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIAorMyAyOCAyMCAxOCAyMSAxMCAyNSAxMCAxIDI4IDI4IDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMTIgXgorNjcgMCA3IDE1IDE4IDExIDUgMTcgMjAgMjYgMSAxMCAxNCA4IDQgMTYgMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgCisxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCA1IDE0IDIgNiA0IDIgOSAyMiAxNSAxMyAyMCAyMiAyNiAxOCAxNiA5IDIgMTUgMjAgMjcgOCA2IAorMTcgNSAxNSA5IDI1IDEwIDI2IDE5IF4KKzU4IDAgNSAyNyA1IDE5IDIxIDUgNiAxMSAyOSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSAKKzYgNSAyNiA2IDIxIDI5IDMgNSAxMiAxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgCisyNSAyNyBeCis1NyAwIDI5IDI0IDE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDE4IDMgNiAKKzE5IDI4IDE3IDExIDEgOSAxNCA0IDI5IDI5IDIzIDI1IDEzIDE5IDE4IDIgNyAyMSA2IDggMjkgNSAxMSAyMiAxNCAxNCA5IDI4IDEzIAorMjUgMjUgXgorNTIgMCAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAxNyAyMiAyOSAyNCA4IDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAKKzE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgMTggXgorNjIgMCA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAyNyAyIDEzIDI3IDcgNyAzMCAKKzIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgMTAgMjUgMTMgOSAKKzI5IDMwIDcgXgorNjIgMCAyOSAxNyAyNiA2IDI1IDQgNyAyNSA4IDE1IDI2IDMwIDExIDIgOSA2IDIyIDYgMjEgMjggMyAzIDYgMTIgMTMgMTUgNyAxNyAxNiAKKzI2IDMgMTkgMyA1IDIgMjkgMTYgMTYgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIDExIAorMjcgNSAxOSAxNSBeCis1NyAwIDkgMzAgOSAxIDI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgMTAgMyAxNSAxMyAyMCAxIDIwIAorMTEgMSAzMCAyMiAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgMyAxMSAyNSAKK14KKzYxIDEgMTYgMTAgMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IAorMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IAorMjEgMyA3IDIxIDkgMjIgXgorNTggMSAzIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgCisyMyAyOSAyNyAxOSA3IDIwIDIxIDI1IDUgMTcgOSA3IDEgMjEgMjAgMTkgMjkgMTkgMTQgOCAyMyAyMyAxOSAzIDE4IDE3IDMgMjkgMTQgCisxNyBeCis2MiAxIDIzIDI4IDUgMjIgOCAxMCAxIDEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgCisxMSA0IDI4IDggMjAgMjUgMiA2IDggNSAxNCAxMSAyMSA5IDE2IDggMjUgNiAyNiAyNyAxIDI5IDEyIDggMTYgNCAxNyA1IDMwIDMwIDI0IAorMTIgMTkgMjEgXgorNTcgMSAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIAorMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSA3IDUgMTEgMjAgNyAyNCAyOSAyNyAxMyAxNiAxNyAxIDE1IDEyIDI5IDQgMTYgMjcgCisxMiAyMSBeCis2NSAwIDIgMiAyNCAxNyAxMyAyMiAyMCAyMiA0IDIwIDE2IDIgMTcgMyAxMSAyOSAxIDUgMTAgMTQgMjMgMyAxNCA5IDIgNyAxOCAyMCAKKzEzIDIgMTYgMjUgMjQgNCA0IDE0IDcgMTMgOCAyMCAxMiAyMyAxIDI2IDcgOSAxOSA2IDE2IDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAKKzE2IDEyIDE0IDI1IDIyIDE2IDE1IF4KKzUzIDAgMjEgMjQgMjcgMzAgMTUgMTAgMTUgMiAxOCAxMyAyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAKKzEgMjQgMTMgNSAyMSAyOSAyNiAyIDEwIDE2IDYgNSA3IDIzIDE5IDExIDI4IDIyIDIxIDEgMjQgMTkgNyAyNiAxOCAzMCAyNiBeCis1OCAwIDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IDI0IDYgMjMgMTYgNSAxIDIwIDI5IDIyIDI1IDkgMjUgMTAgMyAyOCAKKzI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggMjYgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IAorMTYgMjIgXgorNTkgMCA0IDI2IDI1IDE4IDI3IDE5IDIwIDQgMjYgMTIgMyAyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgCisxNCA2IDMgMTkgMjEgMjEgMjggMTYgMTggMTEgMzAgMTEgMjAgMzAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIAorOCAyNSBeCis1NSAxIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgCisyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAxNCAyMSAxNCAxMCAxMSAyNSAxNyAxNyAzMCAyMSAxMyAyNyAyNiAyNiAyMiAxNCAKKzIxIF4KKzU3IDAgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgMjcgOCAxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IAorMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMiA4IDIgNCAxMiAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIAorMiBeCis1NiAxIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IDIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IAorMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgMzAgMjAgMjcgMyAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIzIF4KKzYxIDEgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAKKzE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIDMwIDE0IDMgMSAxOCAxMCAyMCAyNyAyMSAKKzggNiAyNCAzMCBeCis1NCAwIDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAKKzExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDcgXgorNjMgMSAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAyMSA1IDggNyAzIDEwIDE5IDE3IDYgOSAxNSAKKzI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAyNyAyIDEzIDI3IDcgNyAzMCAyIDE4IDI2IAorMTAgMiA1IDI5IDEyIF4KKzYzIDEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IAorMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IDEyIDEzIDE1IDcgMTcgMTYgMjYgMyAxOSAzIAorNSAyIDI5IDE2IDE3IF4KKzYwIDEgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIDExIDI3IDUgMTkgMjggOSAzMCA5IDEgCisyOCAzIDIxIDIyIDcgMTcgMiAyNSAxIDI4IDIxIDExIDE3IDIwIDI4IDEyIDEwIDEwIDMgMTUgMTMgMjAgMSAyMCAxMSAxIDMwIDIyIDIzIAorMTUgMjYgNiBeCis1NiAwIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDExIDE2IDEwIDEzIDEzIDE5IDE1IAorMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IDE2IDE5IDIwIDE3IDEwIDE3IDIxIDIwIAorMTEgXgorNjQgMSAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IDIxIDMgNyAyMSA5IDQgMyA0IDIzIAorMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgMjMgMjkgMjcgMTkgNyAKKzIwIDIxIDI1IDUgMzAgXgorNjMgMSA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAyMyAyOCA1IDIyIDggMTAgMSAxIAorMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAyOCA4IDIwIDI1IDIgNiA4IDUgCisxNCAxMSAyMSA5IDI5IF4KKzU3IDAgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgMTIgMTkgMjQgMjUgMTEgMTMgMTIgMjcgMTYgMTQgMyAKKzI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIDE3IDI4IDMwIDEzIDIxIDExIDQgMTAgMjMgMjUgCis2IF4KKzY4IDAgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAxMiA2IDIgMiAyNCAxNyAxMyAyMiAyMCAyMiAKKzQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIDEzIDIgMTYgMjUgMjQgNCA0IDE0IDcgMTMgOCAKKzIwIDEyIDIzIDEgMjYgNyA5IDE5IDYgMzAgXgorNTQgMSAzIDggMjYgMjEgMTAgMjYgMjMgMjQgMjggMTYgMTIgMTQgMjUgMjIgMTYgMiAyMSAyNCAyNyAzMCAxNSAxMCAxNSAyIDE4IDEzIAorMjYgMjggMjMgMTYgMjMgMTAgMiAxMSAyNiAyNiA0IDI5IDE4IDQgMjQgMjQgMSAyNCAxMyA1IDIxIDI5IDI2IDIgMTAgMTYgNiAyNyBeCis1NiAwIDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IAorMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggOSBeCis1OCAwIDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIAorMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAKKzI5IF4KKzY1IDAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgMTUgMjEgCisxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgMTQgMjEgCisxNCAxMCAxMSAyNSAxNyAxNyAyMCBeCis1NSAwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IDEzIDE3IDIxIDE5IDkgOSAyMCAyMyAxMyA3IDEwIDI4IDI0IDEwIDIyIDI3IDIzIDI3IDggCisxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IDI5IDI3IDYgMjggMTUgMyAyNyAyNSAyNSAxNCAxOSAxMyAyOSA4IDI0IDIgOCAyIDQgMzAgXgorNTcgMSAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIDEwIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IDIgMTcgNCA4IAorMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgMzAgMjAgMjcgCiszMCBeCis1OSAwIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgCis3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIAorMzAgMTggXgorNTYgMCAzIDEgMTggMTAgMjAgMjcgMjEgOCA2IDI0IDI2IDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAKKzI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IDExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDcgXgorNjIgMCAxMSAxOCAyOSAxNSA2IDcgMjcgMjcgMTcgMjQgMTggMjMgMTEgMTkgOCAzMCA1IDI0IDIyIDEyIDI1IDE1IDI4IDIzIDUgMTAgCisyMSA1IDggNyAzIDEwIDE5IDE3IDYgOSAxNSAyOSAxMCA3IDQgMSAxNiAyMSAxNiAyOSAxMyAxOCA1IDMgOCAxNSA4IDIxIDI5IDIwIDUgCisyNyAyIDEzIDI3IDcgXgorNjIgMSA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgCisxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAKKzEyIDEzIDE1IDI2IF4KKzYyIDAgMTcgMTYgMjYgMyAxOSAzIDUgMiAyOSAxNiAxNiAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IAorMTMgNCAxMiAxMSAyNyA1IDE5IDI4IDkgMzAgOSAxIDI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgCisxMCAzIDE1IDEzIDIwIDE5IF4KKzU2IDEgMjAgMTEgMSAzMCAyMiAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgCiszIDExIDExIDE2IDEwIDEzIDEzIDE5IDE1IDE4IDcgMjIgMTAgMjkgMyAyNSAzMCA4IDIyIDEzIDQgNCAyNyAyMiAxOCAyMSAyMyAxNyAKKzIyIF4KKzY2IDEgMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IAorMTggMjQgMjEgMyA3IDIxIDkgNCAzIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAKKzE4IDIgMjMgNyAyOSAyMyAyOSAyNCBeCis2MiAwIDE5IDcgMjAgMjEgMjUgNSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAKKzIzIDI4IDUgMjIgOCAxMCAxIDEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAKKzI4IDggMjAgMjUgNyBeCis1OSAwIDYgOCA1IDE0IDExIDIxIDkgMTYgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgMTIgMTkgMjQgMjUgCisxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIDE3IDI4IDMwIAorMTMgMjYgXgorNzAgMCAxMSA0IDEwIDIzIDI1IDcgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAxMiA2IDIgMiAyNCAKKzE3IDEzIDIyIDIwIDIyIDQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIDEzIDIgMTYgMjUgMjQgCis0IDQgMTQgNyAxMyA4IDIwIDEyIDIzIDEgMjYgNyBeCis1NCAxIDkgMTkgNiAxNiAzIDggMjYgMjEgMTAgMjYgMjMgMjQgMjggMTYgMTIgMTQgMjUgMjIgMTYgMiAyMSAyNCAyNyAzMCAxNSAxMCAKKzE1IDIgMTggMTMgMjYgMjggMjMgMTYgMjMgMTAgMiAxMSAyNiAyNiA0IDI5IDE4IDQgMjQgMjQgMSAyNCAxMyA1IDIxIDI5IDI2IDI3IF4KKzU4IDEgMTAgMTYgNiA1IDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgCis1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggCisyOCBeCis1OCAxIDI4IDI2IDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAKKzI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAKKzMwIDIyIF4KKzY1IDEgMjAgMzAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgCisxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgCisxNCAyMSAxNCAxMCAxMSAyNSAyMCBeCis1MyAwIDE3IDMwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IDEzIDE3IDIxIDE5IDkgOSAyMCAyMyAxMyA3IDEwIDI4IDI0IDEwIDIyIDI3IDIzIAorMjcgOCAxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IDI5IDI3IDYgMjggMTUgMyAyNyAyNSAyNSAxNCAxOSAxMyAyOSA4IDI0IDE1IF4KKzYxIDAgOCAyIDQgMTIgMTkgMTEgMTAgNiAyNiAxNCAyMiAyNCAzMCAxMCAxMSAxMiAyIDEyIDE3IDIzIDggOCAxMiAyOCAxMyAxNCAyOCAKKzIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IDI5IDkgMyAxNyA3IDE5IDMwIDI4IDEgMiAyMCA5IDEyIDI0IDE1IAorMzAgMjAgMjcgMjAgXgorNjAgMCAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIwIDEwIDIyIDE1IDIzIDYgMjUgNSA0IDMwIDIgMTkgMjMgMTUgMjcgMTQgMjYgMSAxIAorNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAxNyAyOCA3IDExIDcgOCA5IDIyIDE3IDEyIDUgMjMgMTggMjUgMTggNiAxMiAyNiAzMCAxMiAKKzMwIDE0IDIwIF4KKzU2IDAgMyAxIDE4IDEwIDIwIDI3IDIxIDggNiAyNCAyNiAyMCAxMSAyNCA3IDIgNCAxOCAxNSAxNCAzMCAxNiAxOSAyIDI3IDE1IDQgMTkgCisyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAxMSAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAxNyAyMiAyOSAyNCAyMyBeCis2MiAwIDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAKKzIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAKKzI3IDIgMTMgMjcgMjMgXgorNjQgMSA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgCisxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAKKzEyIDEzIDE1IDcgMTcgMTggXgorNjUgMCAyNiAzIDE5IDMgNSAyIDI5IDE2IDE2IDIyIDI2IDEzIDEyIDkgMTkgMTYgMjcgMjUgMTYgNyAxNSAyMiAyMiA1IDYgMTMgNCAxMiAKKzExIDI3IDUgMTkgMjggOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAxMCAzIDE1IAorMTMgMjAgMSAyMCAxMSAxIDMwIDUgXgorNTcgMCAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgMyAxMSAxMSAxNiAxMCAKKzEzIDEzIDE5IDE1IDE4IDcgMjIgMTAgMjkgMyAyNSAzMCA4IDIyIDEzIDQgNCAyNyAyMiAxOCAyMSAyMyAxNyAxNSAxNiAxOSAyMCAxNyAKKzEwIDI1IF4KKzY2IDEgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IDIxIDMgNyAyMSA5IDQgCiszIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgMjMgMjkgCisyNyAxOSA3IDIwIDIxIDI1IDIwIF4KKzY1IDEgMTcgOSA3IDEgMjEgMjAgMTkgMjkgMTkgMTQgOCAyMyAyMyAxOSAzIDE4IDE3IDMgMjkgMTQgMjcgMjMgMjggNSAyMiA4IDEwIDEgCisxIDExIDI3IDE4IDMgMiAyMiAyOCAxNCAyNCAxMiAxIDMgMzAgMjkgMTEgMjIgMTkgNyAxNiAxIDExIDQgMjggOCAyMCAyNSAyIDYgOCA1IAorMTQgMTEgMjEgOSAxNiAyOCBeCis1OSAxIDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IAorMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSA3IAorNSAxMSAyMyBeCis3MCAwIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIDQgMjAgCisxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IDIwIDEyIAorMjMgMSAyNiA3IDkgMTkgNiAxNiAzIDggMjYgMjUgXgorNTYgMCAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIDE1IDIgMTggMTMgMjYgMjggMjMgCisxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMiAxMCAxNiA2IDUgNyAyMyAxOSAxMSAKKzI4IDI0IF4KKzU5IDEgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IDI0IDYgMjMgMTYgNSAxIAorMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggMjYgMjkgMiAxNSAxNSA5IDUgCisxOCAxOSAxMyBeCis2MyAxIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IAorMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IAorNCAyMiA0IDIgMjYgMjAgXgorNTkgMSAxNSAyMCA4IDMgMTMgMzAgMTggOCAxIDI1IDI4IDIwIDIwIDE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgCisyMyA5IDE4IDI3IDI3IDQgOSAxMyAxMCA4IDE0IDE2IDE1IDEyIDExIDE0IDIxIDE0IDEwIDExIDI1IDE3IDE3IDMwIDIxIDEzIDI3IDI2IAorMjYgMjIgMTQgMjMgXgorNjEgMCAxNiAyMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IAorMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgCisxNyA4IDI0IDI4IF4KKzY5IDAgMjIgMiA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgMjQgMjUgMyAxMSAxNyAzIDEwIDEyIDExIAorMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IAorMSAzIDMgNCAxNiAxMyAxNyA2IDE2IDE0IDI4IF4KKzYyIDAgMyAyMCAzIDIgMSAzMCAxNCAxNCAyMSAyOSAxMyAxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDE3IDI2IDI2IDcgOSAxMyAxNiAKKzkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAyMiAyOCAxMSA3IDcgMyAxNyAxMyAKKzIyIDQgMTcgOSAyNyBeCis2MCAwIDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAxNCAxMiAKKzEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiA3IDE2IAorMTkgMjIgOSAxNSAyNSBeCis2NCAwIDMxIDcgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IAorMTYgMjcgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgCisxOSAyNyAyIDE2IDEwIDMxIF4KKzYwIDAgNCAyNCAxNyAyMCAyNSAyMCAxNSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgCisyNiAxOCAzIDEgMjYgMjggMTUgMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgCisxOSAxOSBeCis2MiAwIDE0IDggMjcgOSAyNCAyNiA0IDMwIDExIDggMTkgNSAyMSA3IDIgMjcgMjAgMTYgMjAgMjAgMjIgMTQgMTMgMTYgMjYgMTQgMTAgCiszIDI1IDIyIDI1IDIzIDIxIDEwIDE1IDE1IDI5IDggMTMgNCAyIDEzIDIyIDIwIDcgNCAyMCAzMSAxNiAyIDIgMjggMTMgMTkgMTQgMTIgCisyMyAyNyA2IDIgMTQgMjQgXgorNjIgMCAyMiA2IDI1IDMwIDI5IDMxIDEzIDE0IDE2IDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAKKzIyIDE0IDI5IDEgMjEgMyAxNCAzMCA0IDIgMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAKKzMgMjIgMTEgMjMgMjEgXgorNTYgMSAyNCA2IDUgMjAgNCAxNCAzIDI5IDggMjkgMTkgNyAyOSAyMyAyNSAyOCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIAorNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIDcgMSA5IDI5IDI0IDUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDExIF4KKzU0IDAgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IDQgMTggMjEgMSAzMSAxNSAxIAorMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIDMwIDI4IDI4IDI3IDE1IDE4IDE0IDI1IDIzIF4KKzU5IDEgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IDQgMTIgMjUgMTQgNSA1IDI0IDIyIAorMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgOSAzIDIwIDI0IDI0IAorMjggMTQgMjUgXgorNTggMCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCA4IDMxIDI3IAorMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgMTIgOCAxNSAKKzE5IDI0IF4KKzU2IDEgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIAorMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggMTYgMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAzIDI2IAorMjkgOCBeCis2NSAwIDI3IDEwIDIwIDEzIDMwIDggMjUgMSA4IDEgNSAxMSAyMCA5IDEyIDQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIAorOCA4IDExIDEgMTMgMTUgMjggMSAxNiA1IDggMyAyNCAxMCAyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgCisxMCAxMSAyOSAyNSAxNyAyNyAyMyBeCis2MCAwIDI2IDMgMjMgMTQgNCAzMCAyNyAyMyAyNCAyMSAxNyAxMiAyMSAxNyAyMyA0IDIyIDcgNSAyNyAxIDIwIDIzIDEyIDI2IDEwIDI0IAorMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAKKzExIDI0IDI0IF4KKzU4IDEgMTEgMTUgMjkgMjkgMyAzMSAxOCAxMiAxNyAzMSAxOSA4IDQgMjUgMjkgMTcgMjkgOSAyNSA2IDEgMiAxOCAxNyAxNSAxOSAxNSAKKzEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IAorMTYgMjggXgorNjEgMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IDIgMjMgMiAKKzEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAKKzMwIDIyIDI5IF4KKzcwIDAgNyAyNiAxIDEzIDI2IDYgNiA2IDE4IDI0IDcgNiA3IDMwIDE5IDEyIDIyIDI0IDI1IDMgMTEgMTcgMyAxMCAxMiAxMSAxMSAyNSAKKzcgMTMgMzEgNCA3IDI3IDEzIDEwIDMwIDE2IDMwIDE2IDI5IDQgMjcgNSA2IDI3IDggMTIgMjkgOSAxIDEwIDkgMjYgNCAxOSAxIDMgMyAKKzQgMTYgMTMgMTcgNiAxNiAxNCAyNCAzIDIwIDIxIF4KKzYyIDEgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgMjYgNyA5IDEzIDE2IDkgMzEgMiAKKzIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIDcgNyAzIDE3IDEzIDIyIDQgMTcgCis5IDQgMjEgMjMgMjEgXgorNjIgMSAyNCAxNiAyNCAxMSAyNiA1IDMxIDMwIDIgMjQgMTQgOSAyMyAyOCAxOCA0IDEzIDIzIDQgMyA5IDkgMTQgMTIgMTMgOCAyMCAxMiAKKzE4IDYgMjEgMTIgMjUgMyAyNyA4IDIxIDEzIDUgMjYgMjEgMTggMTkgMjMgMTYgMTIgMTQgMjAgMTcgMTYgNyAxNiAxOSAyMiA5IDE1IAorMTAgMzEgNyAxOCAyOSA3IF4KKzY2IDEgNyAyIDUgMTYgMTggMTAgNyAxMSAyMSAyMSA5IDggMTggMjUgMTkgMyA2IDE5IDI5IDEwIDMgNSAyMyAxNSAxNiAyNyAyNiAxMiAKKzIgMTkgMjMgMSAyMiAzIDE5IDI4IDUgMiA5IDQgMjEgMTEgMTggMSAyMyA2IDMwIDIzIDMwIDI2IDIwIDExIDIyIDE5IDI3IDIgMTYgMTAgCis2IDQgMjQgMTcgMjAgMjUgMjAgMjEgXgorNjIgMSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgMjYgMTggMyAxIDI2IDI4IDE1IAorMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IAorMjYgNCAzMCA4IF4KKzYyIDEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IAorMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAyMyAyNyA2IDIgMTQgMiAyMiA2IDI1IAorMzAgMjkgMzEgMTMgMTQgMjEgXgorNjUgMCAzMSAxMiAxNiAzMCA1IDE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAKKzI5IDEyIDE1IDIzIDMgMTUgNSAxIDYgMjMgMjIgMTMgMSAxNCAyNyAyNSA1IDE1IDYgMTMgMyAyMiAxMSAyMyAzMSAyNCA2IDUgMjAgNCAKKzE0IDMgMjkgOCAyOSAxOSAzMSBeCis1NSAxIDI5IDIzIDI1IDI4IDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIAorNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyNyBeCis1MyAxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAKKzIyIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDIxIF4KKzYxIDAgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAKKzI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSA5IDMgMjAgMjQgMjQgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCAKKzggMTQgNyAxNSAxOSBeCis1OSAxIDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCA4IDMxIDI3IDI4IDIyIDIyIDE3IDE5IDE4IDE4IDExIDE5IDEzIDI1IAorMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgMTIgOCAxNSAxOSAxNyAxMSAxNCAxNSAyNCAxNSAxMiA5IDIyIDE2IAorMTYgMjQgMTMgMjMgXgorNTcgMCAyNiAyNCAyOSAyNiAxNSAxMyAyMSAyNCAyMCAxMCAxMCAyMiAyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAKKzE1IDQgNSAxOSAyNCAxMiAzMSA4IDMwIDMxIDkgMjggMTIgMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgCisxNiBeCis2MSAxIDEyIDQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIDggOCAxMSAxIDEzIDE1IDI4IDEgMTYgNSA4IDMgMjQgMTAgCisyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIAorMjcgMjMgMjQgMzEgXgorNjEgMSAxNyAxMiAyMSAxNyAyMyA0IDIyIDcgNSAyNyAxIDIwIDIzIDEyIDI2IDEwIDI0IDMxIDI5IDQgMTEgMTUgMTEgNiA5IDE3IDE4IAorMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIAorMTggMTIgMTcgMzEgMTIgXgorNjAgMSA4IDQgMjUgMjkgMTcgMjkgOSAyNSA2IDEgMiAxOCAxNyAxNSAxOSAxNSAxIDI2IDE3IDIwIDI3IDMwIDMwIDYgMTAgMTggNSA5IAorMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgCisyNiAxNiAxOCBeCis2NyAxIDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IDIgMjMgMiAxMiAyNCAyIDggNiAzIDEyIDIwIDE2IDQgMTAgMTcgMzAgCisxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAzMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IAorNiA3IDMwIDE5IDEyIDIyIDI0IDI4IF4KKzY5IDEgMyAxMSAxNyAzIDEwIDEyIDExIDExIDI1IDcgMTMgMzEgNCA3IDI3IDEzIDEwIDMwIDE2IDMwIDE2IDI5IDQgMjcgNSA2IDI3IDggCisxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IDEgMyAzIDQgMTYgMTMgMTcgNiAxNiAxNCAyNCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIAorMTEgMTAgMjkgMjAgMTkgMjYgMjcgMTkgNiAyOCBeCis2MiAxIDI2IDI2IDcgOSAxMyAxNiA5IDMxIDIgMjAgMjggMTAgMTAgNCAyOCAzIDI0IDIxIDYgMjkgMTYgMSAyMiAzMSAxIDI0IDkgMTYgCisyMiAyOCAxMSA3IDcgMyAxNyAxMyAyMiA0IDE3IDkgNCAyMSAyMyAxNyAyNCAxNiAyNCAxMSAyNiA1IDMxIDMwIDIgMjQgMTQgOSAyMyAKKzI4IDE4IDQgMTMgMjYgXgorNzAgMSA0IDMgOSA5IDE0IDEyIDEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAKKzE0IDIwIDE3IDE2IDcgMTYgMTkgMjIgOSAxNSAxMCAzMSA3IDE4IDI5IDUgNyAyIDUgMTYgMTggMTAgNyAxMSAyMSAyMSA5IDggMTggMjUgCisxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IDE3IF4KKzYwIDEgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgCisyNyAyIDE2IDEwIDYgNCAyNCAxNyAyMCAyNSAyMCAxNSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgCiszMSAzMSA3IF4KKzY2IDAgMjYgMTggMyAxIDI2IDI4IDE1IDI1IDExIDMxIDMgMjUgOSAyMSAyMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IAorMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAKKzE0IDEwIDMgMjUgMjIgMjUgMjMgMTcgXgorNjQgMSAxMCAxNSAxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAKKzIgMjIgNiAyNSAzMCAyOSAzMSAxMyAxNCAxNiAzMSAxMiAxNiAzMCA1IDE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgCisxNCAyOSAxIDIxIDMgMTQgMjcgXgorNjQgMCA0IDIgMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IAorNiA1IDIwIDQgMTQgMyAyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjggMTkgMTEgMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgCisxOCAxMyAyOSAyOCAyMyAyOSAxMyBeCis1OCAwIDIzIDcgMSA5IDI5IDI0IDUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgCisyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IDQgMTggMjEgMSAzMSAxNSAxIDE1IDIgMjcgNCAyNiAyNSA0IDIzIDE5IDIgMzEgCisyOCBeCis1NyAwIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIAorMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IAorNyAyNiBeCis1OSAwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIDE1IDkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAKKzE1IDcgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgCisxMCAxOSAxOSBeCis1OSAwIDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgMTYgCisyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIDIzIDEzIDYgMTIgMjggMjUgMTIgMiAyMSAyNiAyOCAyNiA4IAorMTYgMTUgNCA1IDMxIF4KKzY2IDEgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIDMgMjYgMjkgMjIgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgCis0IDI5IDE1IDIxIDI1IDI3IDcgMTQgMTEgMSAxMSAxNiAyMyA4IDggMTEgMSAxMyAxNSAyOCAxIDE2IDUgOCAzIDI0IDEwIDIzIDI0IDE3IAorNSAxMyAyOCAzMCA1IDMgMTYgMjEgXgorNTkgMCAyMCAyOCAzMSA2IDIyIDEwIDExIDI5IDI1IDE3IDI3IDIyIDI2IDMgMjMgMTQgNCAzMCAyNyAyMyAyNCAyMSAxNyAxMiAyMSAxNyAKKzIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgCis2IDggMjYgXgorNTkgMCAyMSAxNiAxMSAyIDIzIDE4IDI3IDI5IDE4IDkgMTEgMjQgMjcgMTEgMTUgMjkgMjkgMyAzMSAxOCAxMiAxNyAzMSAxOSA4IDQgCisyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IDEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAKKzE3IDIgMzAgMjQgXgorNjEgMCAyOCAxNyAxIDI3IDI5IDIgMTkgMTYgOCAyOCAxNiAyMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIAorOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIAorMTkgMTkgMTkgMjUgXgorNzQgMCAxMyAxOCAyIDMgOCAyIDE3IDggMjQgMzAgMjIgMiA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgCisyNCAyNSAzIDExIDE3IDMgMTAgMTIgMTEgMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgCis4IDEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgMSAzIDMgNCAxNiAxNiBeCis2NCAxIDE3IDYgMTYgMTQgMjQgMyAyMCAzIDIgMSAzMCAxNCAxNCAyMSAyOSAxMyAxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDE3IDI2IAorMjYgNyA5IDEzIDE2IDkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAyMiAyOCAxMSAKKzcgNyAzIDE3IDEzIDIyIDI3IF4KKzY1IDAgMTcgOSA0IDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAKKzE0IDEyIDEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiAKKzcgMTYgMTkgMjIgOSAxNSAxMCAzMSAxIF4KKzY4IDEgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IAorMjcgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgCisyNyAyIDE2IDEwIDYgNCAyNCAxNyAyMCAyNSAyMCBeCis2MyAwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAyNiAxOCAzIDEgMjYgMjggCisxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAxOSAxMCAxNCA4IDI3IDkgCisyNCAyNiA0IDMwIDI0IF4KKzY0IDEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IAorMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAyMyAyNyA2IDIgMTQgMiAyMiA2IDI1IAorMzAgMjkgMzEgMTMgMTQgMTYgMzEgNSBeCis2NyAwIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIDI5IDEyIAorMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IDE0IDMgCisyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjEgXgorNTggMCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAxOCAxMyAyOSAyOCAyMyAyOSAxNCAyMyA3IDEgOSAyOSAyNCAKKzUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgMjggMjEgMTkgMzEgMjAgMjAgNiAKKzI0IDIyIF4KKzYwIDAgMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIAorMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IAorNCAxMiAyNSAxNCAyMiBeCis2MCAxIDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgCis5IDMgMjAgMjQgMjQgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCA4IDE0IDcgMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgCisxMyAyNyAzMSBeCis1OCAwIDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgCisxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgMTYgMjQgMTMgMiAyNiAyNCAyOSAyNiAxNSAxMyAyMSAKKzI0IDIwIDEwIDEwIDI1IF4KKzY1IDAgMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggMTYgMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAKKzMgMjYgMjkgMjIgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgCisxNiAyMyA4IDggMTEgMSAxMyAyMSBeCis2MCAxIDI4IDEgMTYgNSA4IDMgMjQgMTAgMjMgMjQgMTcgNSAxMyAyOCAzMCA1IDMgMTYgNiAyMCAyOCAzMSA2IDIyIDEwIDExIDI5IDI1IAorMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgCisxMCAyNCAzMSAxMSBeCis2NCAxIDQgMTEgMTUgMTEgNiA5IDE3IDE4IDE1IDUgMTcgMjEgMjggNiA5IDYgOCAxMCAyMSAxNiAxMSAyIDIzIDE4IDI3IDI5IDE4IDkgCisxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IAorMTUgMSAyNiAxNyAyMCAyNyAyNSBeCis2NCAwIDMwIDYgMTAgMTggNSA5IDEwIDI2IDkgMTcgMiAzMCAxMCAyOCAxNyAxIDI3IDI5IDIgMTkgMTYgOCAyOCAxNiAyMSAzMCAyNSA4IAorOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IAorMyAxMiAyMCAxNiA0IDMxIF4KKzYwIDAgMjggNSAyNCAxNiAxMCAyNyAyOCAxOSAyOSAxOSAyMiAxMCAyMyAxNyAyNSA3IDI2IDUgNSAyNyAxIDIwIDI0IDEzIDI3IDE2IAorMjQgMzIgMzEgNSAxMiAyMSAxMyA2IDExIDIxIDIwIDE1IDMgMTQgMTggMzIgMiA5IDYgMTAgMTMgMjMgMTYgMTcgMyAyMCAxOSAyNyAyOSAKKzIxIDUgMTEgMjggMTQgXgorPEQKKworSD5TSFMgVHlwZSAyIFN0cmluZ3M8SAorRD4KKzYwIDEgMTYgMTMgMTkgNSAxNiAxNCAyNyAyIDIyIDcgNSAyOCAxNSAxOCAyNSAxNyAxMyAxMiAyOSAyNCAyMSAyOSAyNSAxNiA1IDE3IAorMjIgMjQgOCA4IDE4IDMgMTMgMTAgMjggMyAyMyAyOCAxMiA4IDMgMjUgNSAyNSAyNCA3IDE0IDMwIDI3IDMyIDMwIDIzIDggMTUgMjcgCisyOCAxMyA4IDEyIDIxIF4KKzg2IDEgMzMgNSA0MCAyNiAzIDE5IDEyIDM2IDQzIDUgMzUgMzcgNSAxNCAxMSA0NSAzNSAxNiAxMCA4IDMyIDQgMTUgMzUgMjYgMiAzOSAKKzIyIDM3IDIyIDMwIDI5IDI4IDM2IDQ1IDE0IDM2IDQgMjkgMzcgMzAgMzQgMzYgMjAgOSA0MiAyOSA5IDExIDExIDE4IDQyIDEzIDYgMjAgCis0MiAyMCAzMCAyMiAzNSAzNCA2IDE0IDQxIDE5IDMwIDE3IDM1IDMzIDI2IDQxIDE1IDUgNDQgMzkgOCAyMCAzIDQ0IDMyIDE1IDE4IDEwIAorMTUgMTAgMzYgXgorMTEyIDAgMTAgNDQgMjQgNTMgMzUgMjIgNDAgMjAgMTUgNTEgMjIgMTggMjIgNDIgNiA1NCA0OSAzOCAyMSA3IDEzIDMwIDE2IDcgNTIgCisxNiAyMiAxMyAzOCA3IDExIDQ0IDMzIDkgMjUgMTMgMzcgNDIgMTQgNDUgNTMgMzAgMzggNSAyNSA1IDM1IDM4IDIyIDI4IDEwIDI5IDUyIAorMzEgMzkgMzUgMjMgNSAxNyAxNCAzMSA0NiA1IDQxIDU0IDQzIDMzIDEzIDIzIDQ2IDQ1IDMgNDYgMyA1NSAxNSA2IDUzIDI4IDUyIDIyIAorMjcgNDUgMzIgNTMgNTEgMTUgMzcgMTUgNDkgMzYgMzUgMzUgMTUgMyAxMyAyMiAyNSAzIDQgMTAgMjQgMTIgNyA0NCAyNSAxOCAyMSAyMSAKKzIwIDU1IDI0IF4KKzEyMyAxIDQzIDkgMSA1MiA0IDIxIDQ5IDYxIDE4IDUwIDIzIDEzIDQ2IDYyIDIzIDQ1IDYyIDkgNTYgMTggMjMgMzEgOCAzMCAyNyAzNiAKKzEzIDM4IDQgNTggNTMgNDcgMjQgMTggNDEgNTggMTkgMTIgMTggNTIgNDIgMjkgNDQgNDUgMjYgNjMgMzQgMzIgNDEgNjQgMTUgMjYgNTUgCisxOSAyIDQ5IDYgMzAgNTMgMTMgNTQgMTIgNTMgMzcgMTIgMzcgMjkgNjAgNTMgMjEgNDcgNDIgNDUgNTIgNDAgMTAgMjggNDcgNDMgMTcgCisxNiAxNyA2MSAzNiAxMiAzNCA2MCAzNyAxMyA1MiA1OCAzNyAzOSAyOSAzNCAxMSA0NSA4IDM2IDEgNTAgNTAgNSA1MSAxMyAxNSAzMiAKKzUxIDMzIDYxIDE2IDMxIDUwIDU4IDYzIDE2IDUgMzAgMTcgMjQgMTAgMjYgNTIgXgorMTQ0IDEgNjQgNjIgNjMgMzAgMTUgMSAzNSAyOCAxNiA0MCAyMCAxNCA1MCAzMyAxOSAzOCAzMCAyNyA1NSAxMCAxNiA0NiA0NyA3IDU1IAorMTIgNTMgMjYgNTYgMzMgMjkgNTUgMjUgMTcgNDggNDMgMjEgNDMgMTggMjQgNjMgMjcgNjggNDYgMzggMzMgMzUgMTAgMTggMTEgMjcgNSAKKzkgNTggMzUgNzAgMzYgMzYgMzkgNDcgMiAxMCA2NiA0NyA1IDE4IDIxIDQ0IDcxIDUxIDU3IDMgMjIgNyA1NiA1NSAyOCAyNSAxNCA0MCAKKzE2IDI0IDQ4IDM3IDY2IDUwIDI0IDQ1IDE4IDM5IDUzIDI5IDY0IDYwIDI2IDUwIDYgNDcgNjEgNDYgNDQgNjAgMTcgNCA1OCA0NSAyNiAKKzIwIDI2IDMyIDggNyA2OCAzNyAzIDI0IDQ0IDQ3IDY0IDU0IDcxIDU3IDEyIDY4IDI3IDU4IDI5IDU0IDQzIDQyIDYwIDEzIDE0IDU2IAorNDkgMSAzMiA5IDYxIDQzIDM2IDMzIDIwIDU5IF4KKzE2NiAwIDcgMzggNTcgMzMgNjEgNzMgNyA2NCAxIDQ5IDM1IDc2IDE0IDI3IDIxIDQ1IDY4IDM4IDU4IDczIDEzIDcyIDQ3IDczIDMzIDggCis2NiAyMyAzOCA0IDU2IDc3IDQ3IDEwIDcxIDEzIDIwIDMxIDQxIDYgNTEgMyAxOCAxNyA2MSA0NyAxNCA0OCA3NiA0NiAyOCAzNCA0MyAxIAorNTYgNCAyNSA3IDY1IDQxIDEgMzQgMzcgMjMgNTkgNTkgMjcgMjYgMTMgMTUgMTQgNzUgNjAgMTQgMSAyOCA1OSAyNiA2NSA2MSAxNiAyMyAKKzE3IDI4IDYgMTkgMiAzNSA0OSAzMCAyOSA0OCAyIDYzIDczIDU5IDEgMyA3NiA0MSAxMSAxOSAxOCA0MyA1NCA2MyA2NyA1MSA0IDkgNzggCis2MCA4IDcyIDMxIDM1IDc3IDU0IDU4IDIwIDM2IDU4IDUxIDc2IDQwIDIwIDM3IDQ5IDMgNzUgMSAyOSAyMCA1NyA2NCAyMiAyNSA2IDI1IAorNTkgMzIgNDMgNTggNDAgNTEgNzcgMSAyIDM2IDEwIDEyIDI4IDM5IDExIDQ2IDIgNDEgMjcgMjcgNTMgNzYgMTMgNjYgNjkgNzYgMjggXgorMTg2IDEgNSA3MyAzOCAzMCAzMCA0OCAyMSA3NSA4MCA0MCAyMSA4IDUzIDkgMjYgMzAgMzQgODEgNzEgNzEgNTEgMjMgNzUgMzMgNDEgCisyMyAzMiA1IDggNjYgNDAgNzIgNDAgMTYgNjYgNDUgMTQgNDggMzQgMjEgNDEgMjcgMyA1NSAyNyAzNyAyMyA0MSA2NSA0IDU3IDUxIDc0IAorMjIgMTkgNzUgNDIgMTYgMTkgNDYgMTYgMTAgNDggMjAgMTkgMzcgNDEgMTQgNTcgOSAxNyA1NSAzOCA1IDYwIDcgNDYgMjAgNDMgMzYgCiszOSA1MiAyMCAxMCA2MiA0NSAyMyA0NiA3IDM1IDc1IDI5IDcwIDM1IDM2IDM0IDI1IDEyIDE1IDg0IDI2IDEwIDYgNzEgMjkgNzkgMzMgCiszMiAyNSA1OSA3NiA4MiA2NCA1OCA3IDggMTkgNDEgNzQgMiA1MyA2NSAyNCAxIDU1IDUxIDM2IDIxIDc5IDI4IDUgMTcgNDEgMzYgNjMgCis1MSAxOCA0OCAyNSA0NiA0NSAzNiA3NyA3NiAyMiA1NyAxNCA0NCA2MyA1NiA0NSA1NiAyMCAxIDY0IDQ5IDkgMTIgMjggMzAgNzIgODIgCis3MyAzMyAzIDIyIDMwIDQzIDU2IDY3IDYyIDIgNTcgMTMgNTAgMjAgNTcgMzggNDMgNjEgOSA4IDU3IDY1IDc2IDkgXgorMTgzIDEgNTQgMzQgODMgMTAgMzMgNTEgODYgODEgODIgNjkgMTggOCAyMiA2NCAxOSA4NiA2MiA1OCAzMyAzNyAxNyAzNCA1IDI5IDgzIAorNDIgNzYgNTAgNTQgNjYgMzkgOSAxIDM2IDQzIDE3IDY1IDYgMzUgNTYgNzIgNzEgODMgODggMTAgMSA4IDg3IDIyIDYgMjEgNzggMjUgCis4OSA0MyA2MiA0MCA1NSA4NSAzMSA4OSA3NCA2MyA0NiAyOCAyNCAyNiAzMSAxNyA3IDggMjcgMTkgMTIgODUgMTcgMjAgMjcgNzcgMTAgCisyIDU0IDgwIDE3IDUyIDc0IDc2IDY5IDc4IDExIDIwIDgwIDQgMjkgMjQgODUgNzUgMTggMzkgMjMgNzAgODMgMjkgNTcgNjcgNzIgNzAgCiszMyA0IDE1IDQ2IDQyIDIgNjkgMTMgNTMgMzMgNjkgNjQgMzMgNjQgMTQgNDAgNjkgNTkgNzggNzEgMTkgODUgMTYgNjUgMzggODIgNTUgCis0MCA1NiA0MCAyNCA4NCAyOSAyNSA0NCA2OCAxMyA4NSA3NiA2NCAzMiAxOCAyNSA0NSAyMyA2IDgwIDMxIDMwIDMwIDU4IDE0IDEzIDcyIAorNTcgMTQgNDEgMjggNTIgNzMgMjYgNzYgODMgNTYgNTQgMiAzNiAxMSA2NSA2NiAzOCA1MCA4IDQxIDg4IDc3IF4KKzIwMCAxIDI1IDU3IDQwIDQ2IDc4IDU3IDM0IDc4IDYxIDM2IDY2IDU3IDM4IDgwIDIyIDMyIDY4IDcxIDMwIDc0IDM3IDgxIDY2IDc3IAorNjYgNTUgMiA1MSAyNCA5MyA2MSA0MCA2OCA0NSA2MSAxMiA2MyAyNCA4OSA1OSA1MiA3MiA0MyAyMCAyMCA2OSAzNiA0MCA4OCA0NiA5IAorNjIgNTUgNzcgODQgMjAgMTggNiA3NyAxNSA1MiAzOSA3NSAzIDI2IDQgODUgMTcgNjIgMjkgMTEgOTIgNDYgNTggMjkgNTkgMjggNDIgCis4MCA3MSA5NiAyIDQ5IDg1IDM3IDYzIDQgNjEgMTQgMiA1MyA4NyAyNSA4NiA2IDc1IDc2IDkzIDQxIDM5IDkzIDkyIDQyIDU2IDQxIDYzIAorMjYgMjggMTggNzcgMTEgNTAgNzggNzkgMSAxMiAxMiA5MSAyOSAxMyA1OCA1IDU2IDkyIDY2IDU5IDQgMzkgNDcgOTUgNSA1IDYyIDMzIAorMTMgODAgNjkgNjAgNDMgNTEgMjIgMzAgMzIgNDIgNSAzOCAzIDUwIDcgNDggOTAgNTYgOTYgNjggNDcgNDEgNjEgNjAgOTYgMjAgMTQgNCAKKzE5IDE5IDIzIDI1IDEzIDkgMzggNTIgMTcgMTEgOTYgNDggMTkgMjUgODggNDIgNyA3NCA1OSA0OCA3MCA1NSAyNCAxOCAyOCA0NCA0NiAKKzMgMjQgMzggNTYgMTkgOTYgMjIgNTAgNjAgMTcgOTYgXgorMTk1IDEgMjUgNTEgNDUgMzUgNjYgMTkgNjEgNjAgOSAzMSA5MyA2NCA3MCAzMCA0MiA4NiA1MyAxIDcxIDQ2IDQyIDIyIDM4IDk2IDEwIAorOTkgMzQgNzYgMjYgNTUgNzMgNjMgNjMgOTcgMjMgOTIgODEgNjQgNDYgMSAzMCAzMSAzNSA4NiA5MSA4OCA2NCA4NyAxNiAzNyA2OSA4NCAKKzk0IDYwIDEwMCAzIDQ3IDUyIDggNzEgODcgNTcgMjkgNzYgNDMgMTggNDUgNDYgMTUgNjUgMTIgNDQgNDIgNjYgNjAgMTUgNjggMTkgNTggCiszOSA2MiA3NiA5IDkyIDEwMSA1NyAzMiA0IDM0IDE1IDQxIDYyIDMyIDg5IDcxIDQzIDM1IDMxIDQxIDIxIDE3IDgyIDMzIDk2IDI3IDYyIAorMjkgODIgNTcgNDYgNjIgMTUgMjQgOTkgMzcgODMgNDAgNTIgNDYgNTYgODAgOTggMyA5MSA3NCA2IDI3IDcgNTggOTQgMTAgNDEgNzkgCis5NyA4NCA3NyA3NCAyNiA5OSA5NSA2MSAxOSAxNyAyNCA1NSAxNSA4NSA4NCAzMCA0NSA5MyA0NCAxMDAgNDQgMzkgNTkgNDYgMTggOTUgCiszIDQxIDE1IDgyIDc3IDE2IDQ4IDE4IDUxIDgzIDIwIDgyIDYwIDUzIDUzIDEyIDk5IDkyIDU0IDUgOTkgNTEgMzkgMTAwIDYxIDIgMzEgCis1MiA0OSA4NiA5NCAxNiA3OCA4NCA5MSA0MiBeCisyMTIgMCA1NiA5OCAxNiA5OCA3OCAyMiA3MiAzMyAxMDMgMTA0IDUyIDg0IDEyIDY1IDE1IDg1IDEwMSA5NyA4NCAzMSA1MSAyNiAxMDAgCisxMDAgMzggODAgMTMgMiA3OCA3IDI0IDQ0IDg0IDEwMyAyNyA3IDI4IDE2IDMzIDk5IDI1IDEwMyA1NCAxNCA0MiA2MiA4NyA5MiAyNyAKKzIyIDQyIDUgNTIgMTAwIDg0IDczIDcyIDYzIDI0IDQ4IDU2IDUyIDIzIDUgMTcgNzYgMzEgMSA5NSA1OCA0MyA2MCA1MCA2MiAzMCAyMyAKKzM1IDc5IDIwIDM1IDMgNzIgMzIgNDUgNTEgODcgNDEgODQgMjcgNzkgNzcgNzAgMTAyIDE1IDU0IDE1IDEwMCA4IDUyIDY5IDEwNSAzIAorMzAgODQgNDIgOTMgNjYgODkgNjkgNzQgMjQgMzMgNDIgOTcgNCAzOCA5OSAxMDYgMTMgOTMgNiAxMDYgNzQgMTAwIDU0IDQ1IDIxIDU5IAorNTYgMzcgOSA1MCAzMiA3NSA3OSAzMSA3NyA5IDYxIDEgOCA2OCA2IDYwIDgxIDcgMTAwIDk5IDE0IDYxIDQ4IDI1IDczIDI2IDcwIDcyIAorOTQgMyAxMSA5OCAzMSA1IDY3IDcgMzkgOTIgNzMgODggMTAxIDMyIDEwNSAzNCA4MiA4MSAxMSA3MiA0OCAxMCA1OSA3MSA1MSA3MSAzNSAKKzMzIDI3IDQ5IDQ5IDE5IDk4IDQ3IDQzIDc1IDY0IDE3IDE1IDI0IDk0IDQ5IDQgODQgNTggNTggNzQgMzkgNDcgMTA0IDgyIDUgNjMgNjkgCis5MCAxOSBeCisyMzYgMSAyOSA3OSA0MSA0MCA3MiA1MSAxMiA5MiAzNCA1MiA0NCA2OSAxMDQgMjEgOTcgODkgOTYgNDggMjEgNCA2MSA0MCAyOCA2NyAKKzM0IDIzIDg1IDQ0IDIyIDYyIDUyIDMzIDg0IDIzIDMwIDczIDc0IDQgNzkgMTIgODEgNDcgODAgNTMgNDcgODkgNDAgMTkgODAgNjIgMzQgCis2MSAyOSA0MSA5NSA0MyAxIDcwIDYzIDU1IDUzIDE4IDE5IDEzIDQ4IDEwIDE5IDg5IDQ5IDQgNTIgNTMgNTYgNzYgMTAgOCAxMDQgNzcgCisxNSAyOCAzOCA3NSAxMDkgMyA4NSA5MCA4IDQwIDggOTMgOTAgNDMgMzkgMTQgNjAgMTcgMzYgNzggNTYgMTA1IDgwIDM1IDc1IDM2IDU4IAorODIgNTAgMTAwIDk4IDQ1IDc0IDEzIDY2IDk1IDcyIDcxIDk1IDM0IDE0IDk4IDcyIDMzIDM4IDM3IDUyIDYgMTQgMTA3IDU5IDMgMjkgCis2MSA2NyA5OCA5MiA1IDkzIDE3IDk4IDM2IDg3IDQxIDc1IDcxIDU3IDg4IDE3IDI1IDkxIDg0IDMgNTggMjAgOTIgNjkgNTEgNTAgMzYgCiszMSAxNCAyNSAxOCAzMCAxOCAxIDQxIDEwNCAzMCA4MiA1OSA4NyA3MCAzNCA5NiAyOCA0NyA2MiA4MSAxMDMgMTA5IDEwMyAxMDAgNyAKKzE3IDE2IDEwNCAxIDEyIDM0IDUgMTAyIDQyIDE2IDIyIDcxIDM5IDUgNzMgNDUgNDUgNTQgNDEgMTMgMiAyNiA0MSAyMiAxMDAgMTA5IAorMzAgNDQgNCA5MCAxMDggNTMgMzggMTA0IDY4IDI4IDU2IDQ3IDUxIDk0IDIyIDcgODEgODUgMjYgNTAgOSA3MiA5OCA1NCA1OSA5NiA1MiAKK14KKzIzMiAxIDkyIDcyIDQ3IDM3IDMzIDM4IDkyIDE3IDggMjggODggMjIgNjIgNjkgMzIgODkgNzUgMyA3MiA5NiA4NSAxMyAxMDUgMjQgMzggCiszNyA5NCAxMTUgODMgNzIgMTA4IDExNCAyNCA5MyA3NiAxMDMgNjAgOTkgMTAyIDkgNDMgMTAgNTkgOTUgNDYgMzMgOTMgMTUgMjYgNjkgCis0NCAyIDg2IDEwNyA1NSA0NSA2MSA2NSA5MiA2NiA5IDU1IDM5IDcwIDgzIDI5IDk4IDY3IDEzIDExMSAxNSAyMCAzMSA2MiA4IDIgNTEgCisyMCAxOSAzMyA0NCAxNCAxMTUgNzEgMTEyIDk3IDEwIDQxIDI4IDUzIDUxIDI2IDU3IDE1IDM4IDk4IDU1IDEwNiAyMiA1NiAzMSA1MCAKKzk1IDEwNyAxMTAgODQgNzAgMTAgMTA4IDk2IDczIDEwMCAyNSAzNiA1NSA4OCA3MSA2MyA5NiAzMCA5MCA5NiA3OSAyMiA3IDMwIDIzIAorMjggNTkgODkgOCA1MSA5OSA0NyA4NiAzNCAxOCA0MyA2NSA5OCAxMDQgMTA3IDQ5IDcgNzkgNzEgOCA1NyAyMSAyOSA4MCAyIDc0IDc4IAorNDQgNTcgOSA2MSAyMiAxMyA2OCA1MiA5MSA3NCA5OCA0MyAzMCA1OCA2OCA5NSAxMDEgNzIgMTAyIDc2IDQyIDk5IDEwOCA0NyAyNSA3MyAKKzI3IDEwNCAzNCA1OSA1MiAzNiAxMDQgMjAgOTggMTQgOTcgNCA1MCA0NiAxMDYgODMgMTcgMjIgMTA1IDc5IDc3IDQ2IDM5IDE1IDExMyAKKzIwIDM3IDEwMCAxMDYgNjUgNjYgNzYgNyAxMiA3MiAzNSA4IDIyIDUwIDQwIDY4IDEwMSAyMyA1NCA5NiA0NCA1MSA4NyAxOCA2IDQ2IAorMTEwIF4KKzI0NSAwIDcwIDMwIDgxIDQ2IDUzIDExOSA4NSA2IDEwNCA0NyA5MiA3MiA3MCA1IDcwIDE1IDExNSA2OCAxMDUgMzMgOTcgMTMgODUgCisxMDYgMTQgNjEgMjkgMjIgODYgNDUgNTcgNjkgOTEgMzggMzggMjggNjYgMTMgNjAgOTUgMTAzIDMgMTUgNSAxMTMgMzggMjMgNjIgNSAKKzY1IDk0IDEwNyA3MyAxMDQgMzcgNDcgMTAyIDExNyAzIDc4IDM1IDcgOTUgNTYgNzggNDUgNTIgMjggNDYgNDMgMzcgMzIgNTMgMTkgNTUgCisyOSA0NyA5NyA3NiAxMTUgODMgNzEgMTEgNDUgNjIgNzMgOTkgMTE2IDIgMjQgMTE2IDcgMjggNDEgMiAyOSAzNyA1MiAyMyA1IDExOCAKKzc5IDMxIDU3IDg5IDYxIDI0IDEwMSA3OCA1MCA5MyA3MyA0MSA3IDMzIDQ1IDQ3IDI0IDEgNDggNzMgMzYgMyAyNSA4NyA0NiAyOCAxMDggCis1NCA2OCA1MyA2NyAxMTkgMjggMzYgMTE4IDEwNCA0MiA4OCAyNyAxMTIgNCA3NCA4NSAxIDYzIDM5IDk3IDcxIDc0IDc1IDc2IDEwIDQ5IAorMTIgNzkgMTEgNTAgMTAzIDExOCA5NCAxMTcgMTE4IDM3IDI3IDEyIDk0IDYwIDI4IDUxIDQ3IDgyIDExMCAxNyAxNSAxMDUgMjMgNTIgCis0MyAxMiAyMSAyMiA4MSA0MSAxMiA3NCA5MCA0MiAxMDggMTE3IDk4IDY3IDQgNjkgNDQgNzYgMTA1IDM4IDEwMSAyMSA4MCA3MCAxMCAKKzExMSAyMyAxMTAgMzIgMTAxIDgzIDkxIDEwMSAzMSA1IDMgODMgNzYgMTUgOTAgNTcgNzQgOTUgNDYgMzMgMTEyIDYyIDYzIDU0IDYzIAorNDkgNTkgNCA2NCA0MCA2OCAxMTAgNzQgMTA1IDkxIDg2IDEwMiAyNyA1NSAzNCA4OCA1NSBeCisyNDAgMCA1NSA3OSA3NSA4NCAxMTMgMjIgNCAxMTMgMTA5IDMxIDMzIDE3IDk2IDExIDI5IDYzIDk4IDEwMyAxMDcgMTE2IDM0IDE0IDkgCis5NSAzOCAxOCA1MSA3NSAzMyAxMDkgMTE4IDU1IDY2IDQgNzYgNyA3NSA3MCA4MiA3NCAyMyAxIDI2IDY5IDQwIDExMiA5OSA0NyA2NSAKKzMxIDcwIDExOSA1MiAxMDMgODggODUgODYgMjggMTYgMTIgNzYgMjUgMjIgNzggNjQgMjEgODYgMjcgNjEgNzcgNzIgMTA4IDIgMTggCisxMDYgMTE5IDEyMSA1NCAxNiA4NSA3MiAyIDczIDI2IDg4IDY2IDYwIDgwIDM1IDI0IDExNyA2MyAyNCA0NCA2NyA1MiAxMjIgMTE5IDMzIAorNzIgMTYgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMTE0IDMyIDExNyA4MSAxMDAgNTcgNDkgMTIzIDU2IDIxIDY4IDgwIDUzIDk1IDEgCis0NSA5NSAxMDcgOTggODcgMSAyNyAyNCA5OSAxMTYgMTYgNjcgMSAxMTMgOTEgODQgMjUgNDAgMjUgNzIgMyAyOCA5MCA4NyAxMTIgODAgCisxNiAxMTcgNDUgNzcgMzYgOTAgMTA1IDU5IDg4IDEyMiA2NCAxMDggMTA4IDcxIDk4IDE4IDUwIDExNSA5MyAxMDUgNzcgMzUgNiA0NiAKKzU1IDQ3IDEwMiA0IDI2IDg3IDExMSAxMjAgODEgMTEzIDQgNTcgMTA1IDMgODQgOTQgMTE1IDYxIDMgMTIxIDcyIDcxIDI0IDYyIDE0IAorNjAgOTkgNjEgOTYgMTAzIDUxIDEwNyA2IDY1IDgxIDExNCA4MyAxMjEgMTA5IDQ5IDEwNCAzMCA3MyA4MiA5MiA5NCA5IDggMTEgOTggCisxOSAxMCA1NSA5NyAyMiA5NyA5NSA4OCA2NyAxNSAyMCAzOSA2NSAxMyAxMjMgNzcgXgorMjUzIDEgNDUgNyAxNSAyNCA1MSA1IDk4IDExNSAyNCA0OSA5MCAxMDQgMTE3IDY2IDEyOCA5NCA2NCA4MCAxMiA0MyA5MSA0NiAxMTEgCis1OSA1OCA3NyAzMCAxNCA4OCA2MCAxMjMgNjggNDEgNDQgNjggNDAgMTA0IDExOCA0MSA0MyA5MyA5MCAxMDUgOTIgMTYgMTI3IDI2IDU0IAorMTI1IDExNCA3OSA3MSAyNCA0OCAyMSAyNSAxMTggNDAgMTAzIDQ5IDkxIDQ0IDY3IDY1IDI1IDExOSAxMDkgMTggNDggMjMgNjkgMTEyIAorMzggNjEgNjQgODcgODQgMTA0IDExOSAxMTAgMTIyIDkyIDIyIDEgOCA4MyAzNCAxMDAgMzIgNjIgNDEgNDYgMTEyIDM0IDEwMiA3NiA1NiAKKzM5IDQgMTI3IDMwIDEzIDE5IDExMCAxMjQgNyAxNiAxMjggOTUgNCAxMjQgMTEgMTA0IDExNiAxMjYgNDkgOTUgMyA1NSA5NiA3MCA5MCAKKzEwMSA0IDEyMiA5NiA3NSAxMTggMzkgMTI4IDk5IDkyIDE4IDQyIDIwIDg3IDgzIDM1IDc1IDExMSA2MSA2NyA3MSAyOCAxMDEgOSA1NiAKKzM0IDEwNSA5NSA3MSAyMyA3MyA3MSAyNiA1NyAxNSAyMyA3NiA1NSA5OSA4OSAxMjggOTggMTE3IDY4IDQzIDg4IDYyIDM4IDYyIDM5IDIgCis4MyAzNiAxNSAyNiA2MCAxMjggOTYgNzMgNzQgMTAgMSAxMiA0MiAyMiAyIDc3IDMzIDMzIDMyIDU3IDEzIDE0IDgyIDU3IDEyIDM5IDMgCis1OCA4MCAxNCA4NyA4NSA0NCA2OSAxMDkgMTkgMTE3IDY3IDY4IDQ0IDYzIDEwNiAzNyA4OCA2NCA4MiA1NiAzNyA4OSA0IDEyNiA1NSAKKzk4IDExNCA4NCA5OSA5MSA0MyA5MiAyMSAyNiA1OCA4NCAxMDIgNzUgMTE2IDEyNCA1IDEwMSA1IDk3IDQ2IDEwOSAxNSAyOSA3OSA3MiAKKzkzIDkyIDExMCBeCisyODkgMSA4MyA1IDc2IDIwIDMyIDE1IDEwIDEgMTAzIDE4IDIyIDExNiA5OCA5IDUxIDEwNCAxMDIgNDQgMzMgMTUgMTIgMjQgMzEgODkgCisxIDYgMjggMTAxIDggNjQgNzIgMTA2IDMwIDUgNTIgODkgMTExIDM5IDEwOCA2NCA4NSAxNyA1NyAxMjQgMjIgMTA1IDc4IDExNSAzIDQwIAorMTA4IDY2IDEwOCA3NyAxMjggMTAzIDQ0IDM1IDM4IDEzIDk1IDEwIDExMSA2MyA5OCAxMTcgNjEgNTEgMTI2IDY5IDk2IDcwIDcwIDU5IAorMzkgMTMgOTcgMzMgMTEyIDIgNzcgNyAxMjMgNzAgODMgMjkgNjYgNjcgNDkgNzkgMTkgMTA0IDExNSAxNCA2MCAyIDU1IDQwIDcxIDMzIAorMjggMTE0IDUxIDkxIDE3IDQ2IDQ1IDEyOCA1NyA4NyA2MiAyNSAxMTUgMzggNTAgNTUgOTAgNzQgOCA1MSAxMDIgNzkgNDMgOTQgMzYgCisxMjIgOTQgMTIgNDEgMzYgMjUgMTA0IDkxIDI0IDcgOTkgODAgMzAgMTI2IDMyIDYzIDEyMiAxMDcgMTE0IDI3IDI4IDc5IDQxIDEyIDM1IAorNTEgMTE1IDEyMiA3MCAyMiA3OSA2NSAyIDg4IDI3IDE3IDU5IDE1IDIzIDQ0IDU3IDUgNjUgNiAyNiA3OCA4MCAxMjUgOTMgODQgMTAwIAorNDUgMjIgMTI5IDY4IDM2IDExMSA3NCAxMTggMTEgNTAgNDIgMTIwIDQ3IDIxIDggODYgMTEyIDI2IDY3IDYwIDk5IDQ1IDkzIDQ3IDggCiszOCA1OSA1MiA1NiAxMjQgMjAgODIgMTggMTE3IDI0IDE4IDQ2IDEwNiAxOSAxMTcgMjYgNDEgNDcgNDUgMTMwIDcgMTUgMSA0IDUgMTAwIAorMTAgODUgNTAgNDQgMTEgNDggOTIgMTE5IDEwOCA0MiAxMTggMjQgMjAgNjkgMTA3IDkwIDk2IDQ4IDEwMyA3IDIgOTAgNTAgMTggMTMwIAorMTI2IDQ1IDEwNiAxNyAzNSAyNSAxMDIgNjggMjMgNjggMTIwIDU4IDQxIDM0IDc1IDEwMyAyMCA0NSAxMTcgMzcgNjEgNzMgMzQgNjIgMSAKKzEyNSA1OCA3NCAyMSAyMSAxMjkgNyA4NiAxMTAgNzYgNjYgMTI0IF4KKzI2MyAxIDEwMCAxMzUgNyA3NSAyMyA1IDgxIDExMCAzMSAxMTggMjkgMSA2MiAxMSA0MSA4OCAxMDkgMTE5IDEwMiAzNyAzIDMwIDEyMyAKKzQ3IDMxIDU2IDEzNCAyOSAxMjQgMTE2IDExOCA5OSAyMSA1NiA3NyA5MSAyMyAzNyAxMzUgODEgNDQgNTEgNjcgOTUgNTEgMTMzIDMwIAorNTcgNjcgMTE2IDEyMiA0OCAxMDAgNyAxMzIgOTcgMTA2IDY5IDkzIDQgOTUgMTI1IDEwMiAxMDMgMTE5IDgxIDU3IDEzMyA5NiAzNyAKKzExOCA1MCAxMTcgMTEzIDgxIDEyNyAxNyA0NSAxMDMgMzIgMTIxIDEyOSA2MCA0MyA2NSAxMjcgMzAgMzYgMTMyIDExMCA1MiA1MyAzNSAKKzcxIDEyIDc2IDIyIDcyIDEzMCAxMTIgOTkgNzYgMjYgMjEgNzMgNjMgNjMgOTcgMjMgNTggMTE1IDEzMiAxMTQgMSAxMzIgMzEgMzUgMTggCisyMyA1NCAzMCA1MyAxMTggMzcgMzUgODQgOTQgNjAgMTAwIDMgNDcgMTggMTEwIDEwNSA4NyA1NyA2MyA3NiA0MyA1MiA0NSA0NiA0OSAKKzY1IDEyIDEwIDQyIDY2IDYwIDExNyAzNCAxOSA5MiA1IDI4IDc2IDkgMTI2IDEwMSAxMjUgMzIgMzggMzQgMTUgNyA2MiAzMiAyMSAzIAorNDMgNjkgMzEgMTA5IDEyMyA1MSAxMTYgMTM1IDEzMCAxMjkgMTMwIDYzIDE0IDU3IDgwIDYyIDE1IDEyNiAzMSAxMDUgODMgMTA4IDEyMCAKKzgwIDEyNCA0NiA5OCAxMDUgOTEgNiA2IDI3IDcgNTggMTI4IDc4IDcgNzkgNjMgODQgNzcgNzQgMTI4IDY1IDYxIDk1IDEyMSAxNyAyNCAKKzEyMyAxMTcgNTEgNTAgNjQgNzkgNTkgNDQgMTM0IDc4IDczIDU5IDExNCAxOCAyNyAzIDEwOSA0OSA4MiA0MyAxMTggMTE2IDUyIDExOSAKKzE1IDEyMiA4MiAyNiA4NyA1MyAxMTQgMTMzIDkyIDg4IDM5IDk5IDE3IDEwNyAxMzQgOTUgMTA0IDMxIDUyIDQ5IDk0IF4KKzI4NiAwIDEyMCAxNiAxMDQgMTM2IDExNyA4MiAxMzggMzIgNjUgMTE0IDExOSAxMzcgMTIxIDggMTIgNDYgMTI2IDI2IDExOSA3MyAxMzAgCis2MCA3NiAxMTMgMTAwIDE0IDEzMyAyNiAxMTYgMzQgMTIwIDgwIDk1IDg0IDUzIDE1IDI0IDQ0IDUxIDQgMTAgMjMgNzcgMjQgOTkgNjYgCiszNyA1NCA2MyA0MiAxMzYgMjEgMzQgNzYgNSAxNyAxMjggMTAxIDEgNTkgNDAgMTEzIDExMiAzMiA5NyAzMSA5MyAxMDUgNzkgOTEgMTggCiszOSAxIDEwMyAxMzIgNTEgNjggMTI0IDExMSAxMyA5NyA0MyAxMjggNjkgODQgODUgNzIgMTUgMTIgMjYgODcgMTYgMTYgOTIgMTAxIDEzIAorNzcgNCAxMTggODkgMTAzIDU2IDQyIDE2IDYwIDQ0IDM5IDEyNiA0NiAxOCA4MyA5MyA0MSAxMDUgMyA4MiAxMDYgMTE1IDkxIDYgNCA1NCAKKzExNSAxNSAxMjAgMTA5IDExMyA0OCA0MSA5IDk1IDIwIDYyIDY3IDEwNSAxMTEgMjUgMTMyIDcgMTE2IDQ2IDEzOCA0NCA4MyA2MSAxMjQgCisxMzEgMzUgMTA3IDYgMTA5IDgxIDExNCA2NyA0MSAxMzcgNzcgNTYgNzQgNzMgMzQgMTIgMTQgNjkgNTIgMTEgOTggNDcgNTQgODMgODEgCis2IDEgMTUgODggMzUgMTM5IDgwIDgzIDQ5IDg5IDI3IDQ3IDEzMCA5MiAxMzMgODcgNTEgMTEyIDc2IDQ5IDEwOSA0OSA1NyA5MyA3MyAKKzIyIDExNyA1MCA2NCA1OCA5NyAxMzkgMzYgMTMxIDExMSAxMzMgNTggMzMgOCA4OCA1NSAzOCA5MCA0NiAzMCAxMTggNTcgMjkgODIgNzQgCis0MSAxMTcgMzggNDYgOTQgOTIgNSAxMDUgMTUgMTE3IDcwIDEwMyA2OCA2MCAxMjAgNDggMjEgMTEwIDg1IDQwIDgxIDM4IDU4IDEyOSAKKzU2IDEwIDk5IDg2IDc2IDgxIDI2IDIzIDI1IDY4IDE2IDI4IDEyNyA2NSAxOCA3MSA3NSA3NyAxMDAgMjYgMTEgMTMwIDEwNCAyOCAzNCAKKzU2IDEwNiA3IDggMTIwIDExMiAxMiA1OCAyMSAxMzAgMTI0IDY3IDYxIDE5IDg3IDExOSBeCisyODYgMSAzNSA5NCA2MSAxMzAgOTggMzUgODggMzQgNjUgMTA0IDU2IDEyNiAxMTggNTAgODcgMTAgODEgMTA5IDkwIDg2IDExOCAzMiA2IAorMTE0IDg4IDM5IDM4IDM5IDYyIDMgMTIgMTM0IDcyIDEzNyAzNSA3NSA4MSAxMTUgMTA2IDE0MCAxMTIgMTEgMTIzIDQxIDEwMyA0NSA5NSAKKzg0IDcxIDEwNyAxMyAyNiAxMTAgOTYgNjIgMTYgMTA5IDg0IDU5IDUzIDM4IDI3IDggMjggMTMgMzIgMTM3IDE3IDEzOCA0MSAxMjIgMzYgCis5OSA2NSA5OSA4MyAzNiAxMTIgMjkgNDkgNzAgOTYgMTI2IDEzNiAxMzEgMTE2IDMgMTggMTcgMTI2IDE0MiAxNCAzNyAxNDEgMTQxIAorMTIzIDQyIDEzIDIwIDgzIDQyIDEzOSA4MyA1NCA0OSA1OCA0MiA3IDEzNyAyOSA0OCAxNiAxMjEgMTI3IDM0IDUyIDE0MCAxMDYgMTI4IAorNTggMzYgMTI0IDgzIDI0IDY5IDU0IDYxIDExMiAxNyA2IDk1IDk3IDI0IDU3IDg2IDEyNCA1OSA3MSAxMTkgNjcgMSAxMDkgNTQgNjggCis0OSA1NyAxMzIgMzIgNSA3MSAxMTMgNDAgODAgMTA0IDc1IDEwNiAxMzMgMzEgMTI2IDEzMCAxMDQgNjIgOSAzOSA0NCA2NiAxMTYgMTQxIAorMTM1IDk2IDEzMiAxOSA0MSAxMjEgMTI2IDEyNCA3NyA4IDQgNjAgODIgNiAxMDEgMTI0IDg5IDUxIDEyMyA0OCA0MCA4NSA3NyAyMSAKKzExMiAxMCA2OSA2NiAxMTUgODcgMTYgMTA4IDMwIDg0IDY1IDgwIDEwMyAzMiAxMzEgMTM0IDczIDQ3IDEwIDYzIDM5IDUwIDkzIDM3IAorMTM1IDExNCA2OSA0OCAzNCA1OCAyMyAyNyAxMzMgMzcgOSA0MCA5OCA0MSAxMTUgOTkgNzAgODMgMjkgNDIgNjcgMTMzIDU1IDc5IDgwIAorOTEgMTIyIDEyIDIgMTE1IDExMiAyMyAzMyAxNiAxMDIgMyAxOSA2MCAxMDEgMTMwIDEwNSAxMTYgMTE3IDI3IDIgMSAxMDMgMzggMTQgCis1NSA3OCAyNiAxMTYgMTIzIDU0IDY3IDEzOSA4MiA3NCA3MCA4NCA3MiAxNyAxMzIgMjUgNjggMzEgMTIwIDEwMyAxNDAgXgorMjg1IDEgNjUgMzAgNTEgMTE5IDQ4IDEwNyA5MiA4NCA2OSAyOCAxMzYgMTQzIDU0IDIwIDYgNzAgNDcgMTQyIDY0IDQgNjUgNTkgNzMgCis5OSAxMzQgMTQ2IDEwMiAxMjUgMTE2IDU3IDEzNyAxMzcgNzIgNDggMTI4IDc4IDUgODAgNjMgNTQgODUgMzAgMjIgMTI5IDY4IDIxIDIxIAorNzQgMjggMTI4IDEwNyAyNyA2MCAyIDkzIDk1IDcxIDM3IDExIDM3IDE1IDM5IDEwMiAzIDEwNCA2NSA4MCA1OSA1MiAxMTMgMzQgMjAgCis2NyA2MCAyNyA4MSAxMzUgNDYgMTA2IDEwNiAxMDIgNjggMTI4IDE3IDE1IDEwMCAxMjQgMTUgNDMgMTM2IDEyMiAxMDAgNjcgMTQyIDM1IAorMTQgNTMgMTIwIDIgODkgOTMgOTkgNzMgOSAxMjIgMzkgNzcgMTUgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDEwNSA1NSA5NiAzMSAxMTkgCis3NyA5NyA3MiAyMyAxNDAgMzggMzAgNDMgODMgMTM2IDg4IDEwNyAxMTcgNzIgMTA5IDExOCA1OCA5MSAxMTkgNzMgOTUgMTAwIDU5IAorMTM4IDEyMyA1NCA0OSAxNDMgNTAgMTMzIDY2IDEwNiA0NSA4MCA4OCA0MiA5MyA1IDU5IDc3IDEwMSA3NCAxMTAgMTA0IDQwIDkyIDE5IAorNzcgNzYgODYgMTAyIDEyOSAzIDE0NCAxMDEgMTM5IDEzNCA1NiA5MCAxOCA5MSA5NCA4NSA1NSAxMCAxMzcgMTEgNTggMSAxMDcgMTEzIAorNzAgMjIgNyA1NiAyOSAxNDMgMTExIDggNDYgNDUgMTE2IDEyMiAxMjkgODkgNyAxMjEgNTMgOTUgMTQgNDkgMTE4IDYyIDEyNSA5MSAzNyAKKzk3IDE1IDM1IDEwMCA2MyAxNDAgNjMgNTAgNTEgNTggMjYgMTI3IDYgNDUgNTkgMTAyIDEyMSAxMTQgODUgMTQxIDEzNSAxMCA3MiAxOSAKKzEwNiA2NiA2NiA0MSA1MyAxMyAzOCAxIDIxIDEwMyA1MCAxMDggNDYgNjYgNzAgNDMgMTQwIDEyNCA0MCA2MyAxNDQgOTcgMTM3IDQ3IAorNjAgODggMTAzIDExNSAxMzIgMTQ1IDExNiAxNDMgMTE1IDEwIDEzMyA5IDExOCAzNyAxMDUgNTEgOTQgNjAgNjcgMTE3IDExNiBeCiszMDUgMSAxMDkgMTEwIDc1IDQyIDEyIDEzOSAxMzcgNDMgMTI4IDEwNiAxMDcgMTkgMTI2IDEyIDEwMSAxNDggMTI3IDE1IDExNyAxMjUgCisxMjUgNjIgOTYgMTMgNzYgNzAgOTYgMTAxIDExMCAxMzggOCA5NSA3NiAxNDMgMTcgMzIgOTcgNzkgMTQ5IDM5IDMxIDk0IDEyMyAyMSAKKzQxIDEzNSA1NSA4NCA3MCAzMyAxMzUgMTE4IDUwIDYyIDEyMSA4MSAxIDQ1IDE0NCA5MyA2MCA1IDY0IDEzNyA4IDEwNSA5MSA4MiA2NyAKKzI3IDExMyAxMTkgNTMgMTggOTggNzkgNDggODQgMzIgMTM1IDEyOCA1IDEgMjAgNzYgMTcgODUgMTA4IDcyIDM2IDE0MSAxNDAgNDkgCisxNTAgMTA1IDEwNCAzIDE0OSAxNCA1NCAxOCAxNDggNjQgNDkgMTI1IDM3IDI4IDI4IDEwMSAyMiAxMDQgOTEgMzIgODIgMTE3IDEyIAorMTE0IDY5IDU4IDIgNTggMTE1IDkgMTA4IDQ3IDU5IDY1IDE0IDkyIDcgNCA4NiA5OCAxNiA4MiA5MiA5NSAzOCA5NCAxMCAxMCA0OCA5NyAKKzEwNCA2NiAxMTUgOTcgMTQyIDExNSAxMjIgMTE5IDQwIDk3IDE2IDMyIDQ3IDM0IDg4IDg5IDI2IDUwIDEyIDc2IDgwIDUxIDQwIDkgCisxMzMgMjQgNDQgNDAgMTIyIDg0IDEwOCAyMiAxNDIgMTQwIDk5IDQ0IDE1IDU0IDggNDIgMTI1IDE1MCAxMzAgMjEgNzkgMTI0IDYyIDQ2IAorMTE5IDE1IDI5IDkxIDU3IDE1MCA0MiAxMzggNzEgNjEgNjggODAgMTE0IDYgMSA3MCAxMjEgMTggMzUgMTEzIDU2IDg3IDg2IDEwIDczIAorMTQgMjkgNDEgNzIgODkgMSAxMzMgODcgMTAxIDEyMyA1OSA5MCAxNDIgNzcgMTMzIDUyIDc4IDQ4IDM0IDEzOCAxMzQgMjcgMTcgNjAgCisxMzEgMTQ3IDYxIDkzIDE0OCAzOSAxMzIgNDkgNjIgNzEgMzYgOTEgNCAxMzkgNDkgMTAwIDEyMCA0MyAxMTMgMTQ0IDMwIDk0IDczIAorMTI3IDQwIDM0IDUwIDEwMCAxMTAgODggMTE0IDk0IDM1IDEzOCAzMyA3MiA2MSA1OCA2NSAyNCAxMDcgNiA1NCA4MSAxMTQgNTYgMTM3IAorNzEgMTEgMjMgMTkgNzMgMSAxMDggMTEwIDI1IDE0OCAxMSA5OCAxMzIgMTUwIDE3IDcwIDE0NiA1MCBeCiszMTQgMSA5OSA4OCA3IDEzOSAyNCAxMyAzNSA0NyA5NyAxNDUgNzQgMzYgMTE5IDMgNTEgODQgNDggMTE5IDUzIDQ5IDE1IDc5IDE3IAorMTIwIDEwMyAxNDggNjQgMzAgNDEgOTcgMTIwIDc1IDExMSA2MyA1OCAxMzEgMTM0IDE4IDEzIDEwIDQ4IDE4IDE2IDQ4IDQzIDE1IDU0IAorMTggNDEgNDcgMTIyIDE0NCA4MCA5MiAxNDUgNzcgMSAzMyA4OSA1NCA0NiA3OCA0OCAyMSA1NCA0MyA0MCA1MyAyNCAxNiA3MyA0MiA5NCAKKzI5IDQ0IDM0IDE1MSAxNTIgMjMgMTIzIDEyIDE0MiAxNDAgNDMgMzcgODggMjkgMTkgMzUgNzIgOTYgMTUxIDEzMCA2MiAxMTIgMzQgMzYgCis5MSAxMjAgNTAgMTEyIDEzOCAyIDEwNSA2MCA2OCAxMzcgMTMxIDUgMTcgMTkgMTM5IDc0IDExIDEyMCA3OCAxNDkgNTggMTI4IDE1IAorMTA0IDE2IDEyNiA3OCAyMCA1NyAxMzQgNzEgNDkgOTAgNzYgMTA4IDEyNiAxMDAgNTQgNjggMzkgMTMyIDE1MyA0MiAxNDcgMTQ2IDEyNCAKKzYyIDg3IDM1IDc1IDYxIDY1IDQ2IDEwMCA4MiAxMDUgMTEzIDMxIDYzIDUgOTUgNTQgNzEgNzcgMTI3IDE1MCA4MCAzNiAxNDQgMiAxMzAgCis1OSA3NCAzOSAzIDE1MiAxMjEgMTIyIDE4IDExNyAxMiAxMTcgMTQxIDExOCAxMzUgNjIgMzYgNjkgNSAzOSA1MyAxNTAgNTIgMTUzIAorMTQzIDMwIDY2IDk2IDEyNiAxMzEgNTYgMTM3IDggNyA4NiAxNDIgMTQgNyAxMTEgMTQxIDkzIDEzNiAxMzcgMTM0IDQzIDEyIDg5IDIzIAorNDQgOSAxNTIgMTQ2IDEyMSA5NyAxOSAzOCAxMTAgOTEgNjcgMTQgMzIgMTEwIDY2IDY4IDggMTMwIDg0IDczIDExOCA1OSAyNCA0MSA3MiAKKzEyMSAxNTAgNTUgMzcgMTM4IDI3IDEwNCA2NiAxMjQgOSA1MSAxMDkgNDcgMTI1IDEwOSAxNDggOCAyOSA0NyA3MiAxNDYgMTQ5IDYxIAorOTMgMTAgMjAgNTQgMTUgNzYgMTMzIDEyNSAxMDYgMTEwIDk0IDMyIDkgMjkgMTQ4IDM2IDY2IDEyMSAxMjUgNTYgMTEyIDkgMSAxMTEgCisxMTYgOTQgNTcgOCAxMDggNTAgNjIgMTQwIDcxIDc0IDg5IDEgODMgMTUyIDIwIDg1IDE3IDE0NSAxMDIgMzkgNTYgMTE1IDQ3IDE1MCAKKzEwOCA2NCA5OCBeCiszMzUgMSAyOCAxMDMgMTkgOTIgOTUgMTUyIDE1MiAxMCAxMSAxMyAxNTUgNjcgMTEgODMgMTAxIDY5IDE1MyAxNTIgNDUgMTQxIDE0IAorMTIwIDEyOSAxNDAgMTE5IDU5IDIgODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAxMTcgMiAzNyA0NyAxMjggMzMgMyAKKzg5IDEwOCA5OCAxMzkgNDkgNzggMjcgMTAzIDM5IDExOSA5NCAxMzIgOTAgMzggMTMyIDU1IDY1IDEzMSA5MCA1OCAyIDU0IDEwMCA2OSAKKzExOCAyMiA0NCAxOSA3IDE0OCA5MyAyNSAyOSAxMjMgODEgNjQgMTMxIDU1IDMwIDEgODkgMzggOTcgODIgNjQgOSAyOCA4NiAxMjMgCisxNTEgMTAgMTMzIDQwIDE1NCAxMDIgNCAxMTEgNjUgOSA2MyA1OSAxMjQgMTE2IDcyIDEwNSA3NiA1NyAxMzcgOTcgMzIgMTQ1IDEwOCAKKzc4IDExMiA1MCA0MyAzNCA3NSAyMCAyMiAxMjkgNjggMTEgMTE4IDc0IDEyNSAxMTggNTcgMTcgMjAgMTI5IDUzIDY1IDYxIDE0NCAxIAorMTcgMTQyIDE1NiA1MiAxMDAgNTQgMTUgMjAgNTkgNTIgNjMgMTMxIDIwIDU3IDEyNCAzMSAxMjUgNDYgMTA2IDc2IDkyIDggOTggMTU0IAorMTUyIDgwIDExNCAxNSAxNDAgMTM2IDExMiAxMDAgMTcgOTIgMjUgMTUxIDE1MCA4MCA5OSA2OSA4MyA0OSA0MyAxNTYgMTAyIDE5IDU3IAorMTIyIDk2IDMwIDMgMzkgMTM0IDQwIDMyIDc1IDUgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMTMwIDE4IDEyNyAzMyAyMyAxMTYgCisxMDcgNzggNzcgNzcgNDIgNjkgNjggNDggNDEgNjkgMzMgNzUgNDAgNDkgMTI4IDEwMyA0IDE0NiA5MyAxMCA4MyA2NiA5NiAxNTIgMzAgCiszOCAxMiAzMyA1IDM5IDQ3IDQxIDM0IDYwIDc0IDIwIDQyIDE1NiA2NyA0NiA1NiAxMDIgODkgMyAxMjQgODEgOTkgMTA0IDU2IDUwIDggCis2MSA3NCA1NSAxNSA4NyAxMDggMjggMTM4IDQ3IDkzIDYwIDIgMTI0IDQ2IDEyNiAxMDMgOTEgMTQ1IDM2IDI1IDExNiAxMjIgNzkgNzkgCis3IDExMSAxMyA4NSAxMjEgOSA5OCAzMiAxMjUgODEgMTM0IDc3IDExMiAxNSA3MCAzMyAxMTAgMTMgNTAgMTQ4IDggMTMzIDEyNyAxNTMgCis0NSAxOSA0MiAxMjEgOTQgNDUgOTEgOTUgMTE3IDIyIDkgNDYgNiAyNiAzMSA1MyAxNTAgOCAxNDggMTI4IDUzIDE0MSBeCiszMjYgMCA4MCAxMjMgMjQgMTQ3IDEgMTEyIDgyIDE1OSA2MyA3NCA5NyAxMDkgMzMgMTUxIDMyIDg5IDg3IDEzMiAxMTcgNDYgMTI5IDU5IAorMTE1IDkxIDExNCAxMTggMzcgMjEgOSA5NCA2MCAyNSA4OSA0NyA3OSAxMTAgNTUgMTIgMTQzIDk5IDg3IDQzIDg4IDU2IDU3IDE2MCA3NiAKKzEyIDcxIDEyOCA3NyAxNDYgMTE3IDk1IDEwNSA0MiA2NiAzIDc2IDIwIDc2IDEwMSAxMDAgMTE4IDE0OSA0NSAyNiAxNDMgMTQ4IDMyIAorNTcgMzkgMTI5IDE5IDMxIDg0IDEyMyAxIDE1MiAxMzUgNSA1NCAzMCAxMyAxMjUgNjggMzAgNjIgMTAxIDUxIDE0MiA1IDk0IDgzIDIwIAorMTE2IDI0IDEwNyAxMDkgMTA1IDkxIDQyIDE3IDI3IDkzIDY5IDMgMTM5IDY4IDc5IDM4IDg0IDIgODUgMTI4IDEyNiAxMjIgMTMxIDQ2IAorMTcgMzUgOTggNDIgMjYgMTExIDEwMCAyOSAxMjAgNTUgODQgMTE0IDEwOSAxNDUgMTQgMTggMTM4IDE0IDkgODUgNyAxOCAxMjkgOTEgMiAKKzk0IDUxIDEzMyA4MiA4NyAxMjMgNjQgMzkgOCAxMDMgMzggNzUgMTEwIDc4IDcgOSA0NSAxMTUgNDIgMTM4IDEzNSA4NiA3OCAxNiA2MiAKKzUyIDc1IDE1OSA1NCAxNTEgMTIxIDE0OSA3NyA3NCAxNiA4NSA0NyAxMDIgMTA1IDgyIDExOSAxMCA2NyAxMzcgMTUzIDE0OCAxMzUgMjggCis0OSAyNiAxNTEgMTUzIDM2IDgwIDExIDEzMCAxMTMgMjQgNDQgMzAgMTAyIDI0IDU4IDEzMyAxMjIgMTQwIDk5IDI0IDE1NiA1NCAxMTkgCis0MiAxMTUgMTQwIDkwIDEzMiAxOSA5NCAyIDE1NyA5OSAxMzYgMTkgNzEgNyAxMzAgMTUzIDEwOCA1MSAyMSA1OCA3MCA3NCAxMzcgMSAKKzQwIDExMSAxNDkgNSAxMDMgNiAyNyA3NiAxNDEgMjMgMTI1IDE0MCAxIDcyIDI5IDE1MiAxMDMgODcgNTEgOTMgMjkgODAgMTMyIDc3IAorMTIzIDE1MyA2OCAxNTkgMTQgOTggMTE0IDE1OCAxMjEgMTU4IDgxIDEzNyA0MSA5MyAxMTggMTQwIDEyMiAxOSAyMiAzMSAxNDcgNDEgNCAKKzg5IDE1MCA1MCAxMjAgMTQ0IDExMyAxMDQgMjAgNDQgNTMgOTcgMjAgNCA5MCA2MCA0OCA4NCA3NCAyNSAxMzggMjMgNjIgNjEgMTU5IDUgCisxNCAxMDcgNiA0IDgxIDExNCA0NiA5NyAxMSAxMTIgMTU0IDEzMCA3MyAxMzIgNjAgXgorMzI1IDAgNTggMTM3IDk2IDExIDk4IDY3IDk4IDEwMyA1NyAxNDYgMjEgNTkgODggMTUxIDEzOSAxNDggMTI3IDI1IDE3IDQ3IDExNSAzNCAKKzE2MCAxMDkgMTA3IDUxIDY0IDI4IDY5IDEzIDQ5IDE0OSA2OSAxNDEgOTAgOTMgMTE4IDY0IDEwIDEgNjcgODAgMzUgMTExIDEzIDU4IAorMTAxIDEyNCAxMzIgMTQ3IDE1NCAxOCAxNjIgNiAxNjIgMzMgNSAzNCAxNDIgNDEgMTYxIDgyIDExNCA3MCA5MiAxNDUgNTcgMTU1IDEzNyAKKzExNCA3OSA0NCAzNiA0OCA0OCAyMSAxNCAxMyA0MCAzMyAxNCAxNTAgMzMgMzIgNTQgMTQzIDE0IDQgMTAxIDE0MiAyMyA5MyAxMzYgCisxMzIgMTIwIDE0NyAxNyAzOCAxNjMgMTQzIDUgNTIgNDYgMTUxIDEzMCAzMiA3MiAzNCAxMjQgMTUwIDUxIDEwMCAxMTIgMTI4IDEyNiAKKzY1IDEwIDI4IDg3IDgxIDE1OSAxMzEgMTkgOTkgNTQgMTI1IDExMCA1OCAxMTkgMjggNzggMTI5IDEwNCAxNDAgMTI2IDM4IDE1NCAyNyAKKzExNCA2MSAxNTMgOTAgNjYgOTggNzYgNTAgMTU4IDQ4IDM5IDgyIDEyMyAyMiAxNDcgMTM2IDExNCA1MiAzNyAzNSA3NSA0MSAxNSAxNTAgCis2MCA1MiA1NSAxMDMgMjEgMjMgMTI5IDk1IDI0IDcxIDQ3IDk3IDEzMCA1MCAxNDAgMTQ0IDEwNiAxMDAgOSA2NCAxOSAxMTcgMTIyIDcxIAorOTIgOCA3NyAxNTYgOTcgMTIxIDk4IDg1IDIgMzYgMzkgMTA5IDE0MyAyMyAxMjAgMTU2IDEzMyA5MyAxNTQgMzYgNjYgMTE2IDEzMSAKKzE2MCAxMjcgMTYyIDE2MSA0NiAxNDIgMTQgMTQxIDgxIDE0MSA2MyA4NiAxMTcgMTA0IDMgMTQ2IDM5IDEyNyAzNCAxMzMgMTAyIDEwNiAKKzkxIDU3IDkgMjggNjAgNjEgNyAxNTggMTIgODAgMjYgOCAxMjIgODAgNDQgNjMgNjggNDkgMTU4IDIxIDMyIDgxIDE1MCAxNSAxNDEgCisxMDggMTYxIDY0IDQ2IDEyNCAxMjMgMzEgOTkgMjcgMTA1IDEwOSA5OCAxMTIgOSAzNyAxMiAxMTYgMTQ5IDUxIDczIDE0NCAxMjQgNCAKKzExOSA0NiAxMzMgNzUgODYgOTAgODQgMiA5IDE5IDEwOCA2IDE2IDEwMSAxMTUgMTYgOTIgMTYzIDEyNSAxMDEgMTA2IDY0IDM3IDggNjggCis0MCA0MiAxMzAgNDEgMjQgODkgMTE1IDQzIDExMiA4NSAxMjEgMTI1IDkyIDE1NCA5IDQ2IDExNSA3IDE0MCAxMDggMTU4IF4KKzMzNiAwIDM4IDQyIDE1NSAxMDMgOSA2MiA2NSAxMDIgMTIyIDEwIDEzOCAxNjAgMTI1IDQ3IDE1OCA0MyA5MSA2OSAxMjMgMTMyIDM1IAorMTIxIDQgMTEwIDg5IDEzMCA2OSAyOSAxMzkgNjkgNTMgNzAgODMgMjkgMTYzIDY3IDQxIDkgMTA4IDM0IDQ1IDc2IDg3IDIgMTQ0IDE2NCAKKzk4IDMzIDE2MCA3OSA3OCA0OCA4OSA5IDM4IDEzNCA5MyAxNDYgNzkgNTQgMTIyIDgwIDM4IDExMiA1NSA1NSAxMDEgNzAgOCAxMjkgNDQgCis3MCA1OSA5OCAxNDkgMjQgMTM2IDEyNCAxMzggNjMgMjUgMTY2IDgzIDUxIDM0IDkxIDQ1IDMwIDExOCA1OSAyOCA4NyA3MiA0NCAxMTYgCisyOCAzNiAxMDMgMTAxIDExMyAxMCAxMTQgNjIgMTExIDcxIDY1IDEyNiA1MyAxOSAxMTQgODYgNDIgODUgMzYgNTcgMTM3IDU3IDE1OSAKKzk1IDg4IDc4IDcyIDIwIDIzIDE0IDY1IDEwIDIyIDEyOSA2OCAxIDY4IDc0IDc1IDEwOCA3IDcgMTQ3IDEwOSAxMyAzNSA1MSAxMDQgCisxNTggMTY0IDEyMiAxMjYgMiA1MCA0IDEzMiAxMjcgNTkgNTIgMTMgODEgMjAgNDcgMTA3IDc0IDE0OCAxMTUgNDYgMTA2IDQ2IDgyIAorMTE1IDY4IDE0NCAxNDIgNjAgMTA0IDE1IDkwIDEzNiAxMDIgMTAwIDEzNCA0MiAxNSAxNDEgMTAwIDQwIDQ5IDQ5IDczIDE2NiAxMyAKKzE1NiA4MiAxNjYgMzcgODIgOTYgMTM3IDEzMCAxNjYgMTM0IDIwIDEzOSA0NSAxMjIgNTYgMTA3IDk4IDc5IDEyNCAxNyAzMiAxMzAgCisxMjAgMTY1IDc3IDIzIDEzMCA5NiA2NyA2OCA0NyAzNyAxMiAyOSAxOCAzOCAxNTggMTkgMTYwIDU1IDE0NyAzOSAxMTggODMgMTIxIDk2IAorNDMgMTM3IDMzIDY2IDg2IDExMiAxNDcgMTU1IDE0OSAxNDAgNSAxOSAxNyAxNDggMTYxIDEwIDQ0IDE1OSAxNDYgNTcgMTYgMjYgMTAyIAorNDkgMyAxMDQgNjEgNTkgNzQgNTYgMTAgMTY1IDMxIDU0IDI1IDE0MiAxNTcgMzcgNTggMTY1IDEyOCAxNTQgNzMgNTAgMTQ5IDk0IDM2IAorNzYgNjMgNzEgMTM1IDI2IDUgMTE2IDEyMiAyOSA2OSA3IDEwMSAxNDAgNzUgODEgMTM2IDc4IDIgMTI1IDcxIDg0IDU3IDYyIDE2MiA0MCAKKzMgODAgMTMwIDUwIDk4IDEyNSA5MyAxMjcgMTUzIDQ1IDE0NiAxNDkgMTIxIDc0IDUgNDEgNTUgNzcgMTM5IDE2NiAxNTMgMTEzIDE1MyAKKzIxIDUzIDE0MCAxNDUgMTQ4IDg4IDE2MiBeCiszNDEgMCA0IDYyIDc4IDE2NyAxMDIgMTQ0IDk0IDU1IDE0MSA2MyAyOSA5NyA5MSAyNCAxMTUgMTY2IDgwIDY5IDEzMiA5OSAxIDEyMCAKKzIzIDg4IDY0IDg3IDExOCAzNyAxMzcgMTUyIDk0IDYwIDE2OCA3MSA0NyA1MiAxMTAgMzcgMTU1IDEyNSA2MyA0MiA0MyA1MiAxMSAxMiAKKzE1MSAzMSAxMiA0NCAxMTAgMzIgMTI4IDExNyA2OCA4NyAyNCAzOSAxNjQgNzYgMTQ1IDU4IDEwMSA5MSAxMDAgMTQwIDE1MSAxNDMgCisxMzAgMzIgMjEgMyAxMTEgMSAzMSA3NSAxMjMgMTUzIDExNiAxMzUgMTMwIDI3IDE2NCAxNjUgMTE2IDIzIDEyIDYyIDgzIDI0IDEzMyAKKzEzOSA0OSA3NCAxNTQgODAgMTU4IDgwIDY0IDEwNSA5MSA2IDE0MiAyNyA3NSAyNCAxMjggMTEyIDQxIDc5IDI5IDg0IDE0NSA0MCAxMjggCis5OSA5NSA5NSAxOSAxNyAxNjAgODkgMTUgMTcgODQgNjQgMTEgOTMgMTAgNjYgNzggNzMgMTI3IDE0OCAxOCAxMjkgMTM5IDE0MyA0OSAKKzE1MCA5IDg0IDgyIDE1NCA4NSAxNSA4OCA4MiA2MCA4NyAxOSAxMiAxMzMgNTggMjAgMzkgNjUgNTEgMTQxIDEzNCAyNyA3MCAxNjcgCisxMjAgMTE3IDg2IDYwIDE2IDQ0IDE2IDU3IDEzMiAxOCAxNDIgODUgMTA0IDU5IDQ3IDE0MSA1OCAyIDY2IDk2IDQ2IDExOSAxNTMgNDAgCisxMTAgMTI2IDEwMyA5MCAxNDQgMTMgMjYgMTA2IDE0NCA4MCAxNDUgMTM0IDEwMyA5NSAyNCA0NCAyMSA4NCAxNDAgMTMgOTcgMTA0IAorMTQwIDk5IDYgMTQ3IDU0IDgzIDQyIDEwNiAxMzEgNTQgOTYgMTM1IDY3IDExOCAxMjEgODEgMTA5IDEwIDUzIDEzMiAxMTIgMTE3IDgxIAorMzMgMTU1IDQ5IDYxIDM4IDExOSAxIDEzIDEwMiAxMzEgMTQ4IDk0IDEzMSAxNDMgNjcgMTIzIDE0OCA4OSAxMDQgMTM1IDcyIDE0NSAKKzE1MiA3NiA4NyA2IDY2IDIgNzEgMTIzIDc3IDExNCAxMDggNTkgMTIzIDE2NiA2MiA5NiAxNDAgOTQgMTQ5IDExNiAzNiAxMjggMjMgOTMgCis5MSA5NSAxMTMgMTYyIDE1NiAxNjUgMTExIDE2NiA0IDQ0IDEwNSA1IDEyMCA5OSAxMTMgNjggMTEgMTY5IDM1IDcwIDIgMTQ3IDEyNSAKKzgxIDE1IDEyIDU3IDU2IDE2IDEzOCAxNCA1MyA2MSAxMTQgMTIxIDUgMTA3IDYgMTI5IDgxIDExNCAzNyA2MSAxMjcgNjcgMTM2IDk0IAorNzMgMTE0IDMyIDM0IDExOSA3MiAxMSA5OCAzNyA3NCA3MyA1MSAxNDYgMTYxIDM1IDE0NiBeCiszNDkgMCAxNDIgMTM5IDEyMSA5MSAxNiAxNjMgMiA4OCAxNzEgMTMzIDEwMCA2MiA1MSA0NiAxMCAyNCAxNTAgNDkgMTMxIDYwIDExNCAKKzYzIDg0IDkxIDY0IDE2NSAxMzggNDAgNDQgMTcyIDExMSAxNDEgNTggNzQgMTE1IDk2IDEyOSAxNDUgMTY0IDE1MyAxNzAgMTI2IDI0IAorMTY5IDE2IDExNSA0MSAxMjUgNDYgODcgNjEgOTIgMTQ1IDM5IDE1NSA5MiA3OCA3MCAzNSAyNyAyMSA0OCAyMSAxNTEgMTU5IDQwIDE1IAorNSAxMzIgMTcwIDIzIDE4IDEwNyAxNjAgMTUwIDU2IDEzMyAyMyA2NiAxMDkgMTIzIDEwMiAxMDIgMTcyIDE2NiAxNDUgMTE2IDE1MSAzNCAKKzEgMTUxIDEzMCA1IDM2IDM0IDk3IDExNCAxNSA4MiAxMjggMTEyIDExOSA5OSAyOSAxMzggMTY1IDQyIDM2IDE1OSA5NSAxOSA2MyAzNiAKKzg5IDEwMSA0MCA5MiAxIDMzIDkzIDEwNCAxMTMgMTI2IDIgMTM2IDk2IDUyIDEwOCA5MCA1NyA4OSAzMSA1IDExMyAzMCAzOSAzNyA5NiAKKzQgMTQ3IDEyNyAxMDUgNDMgMTY1IDM1IDc1IDIzIDE0MyAxMDUgMjQgMjUgMTAgOTQgMTIgMTYwIDEwMiA5NSAxNzAgNzEgMjAgNzAgCisxMTIgMjMgOTUgMTQ0IDYxIDczIDEzNyA1NSAxIDgxIDk1IDI2IDY1IDE3MiA0MSAxNDcgNzkgMTAzIDgwIDQwIDEyMSAzNiAxMiA2NCAKKzk4IDE2OSA5MyAxMTEgMTE1IDQ4IDEyNyA5IDM5IDEwNyAxMzEgMTE1IDExOCAxNjIgMTYxIDEwIDE0MiAxNCAxMjMgNTQgMTQxIDM2IAorNDEgOTkgNzcgMTQwIDEyOCAxNjcgODIgMjUgMTA2IDU3IDcwIDY0IDIxIDE5IDE1IDM0IDEyNiAxNDkgMTY3IDUzIDE2MyAxMjcgODYgCiszNSA4IDU0IDIzIDQwIDE0MCAzIDE2OSA0NSAxNTAgMTUyIDk2IDgxIDE0MyAyOCAyOCAxMjQgODcgMTMgOTAgOSA4NyAxMDkgNTMgNjcgCisxNjQgMjggMTMxIDg5IDE0OSA0MiA1NSAxMjYgNzkgMTMyIDc0IDE5IDEzMyAzMCA2OCA3MiA3NSAxNDggOSAxMCA3MiAxNTIgMTQ0IDgzIAorMTA2IDE1MyA3NCAxNjMgOTggOTIgOTcgMzcgMTkgOCAzMiAzMSAyNCAxMjEgMTQgMTUyIDg5IDc5IDcgNzYgMTU1IDg1IDc2IDEwNyA4MyAKKzE1NCAxNTUgMzcgMTE1IDE0NCAxMzEgMTA4IDExNiAyNiAzNiAxMzcgMTAzIDMgNDQgNDcgNzIgMTA0IDEwIDEyMCAxNTQgMTA3IDM1IAorMTUyIDE5IDg1IDY5IDEwNSAxMjAgMjkgMTA5IDE3MSAxMDQgNjUgMTI0IDM5IDExIDEyNyA1NyA0MSA3MCA4MyAyOSAxNTcgNjcgMTY0IF4KKzM3MCAxIDE2NyA2MyAxNiAyNyA1OCA2MCAyIDk5IDEyOCA3MSAzMyAxNjAgNzAgNTEgMyA0NCAxNDkgMiA4OSA4NCAxMDEgNDMgMTggCisxMTMgNzEgMzggOTQgNTUgNDYgNzQgNTIgMTM5IDEwMiAzNSA0MyA1MCA4MCAxMjIgNiAxMDAgODggMTI5IDM2IDI1IDE0OCA0NyAyNCA3IAorNTUgMzYgMzAgODIgMzIgMTkgNzggNjMgMjYgNzEgMjggMTY3IDg1IDU2IDE2NyA5NSAxNTkgNzggMjYgNjYgMzUgNjUgOTAgNDQgMTU5IAorMTA1IDU5IDE1IDY3IDU3IDEzNyAyMSAxMzIgNTAgNzAgNzggMzYgMTY5IDUgMTcyIDU2IDEgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCA5OSAKKzEzOCAxNzQgMTIwIDkxIDE1MyA4IDQyIDY4IDE1OCAxNTUgMTA0IDk5IDEzMyA1IDEzNSA5NiA4MiA1OSA1MiAxNDQgMzYgMjAgMzggNjIgCisyOSAxMTIgMTA2IDQ2IDEwNiAxOSA3MyA3MCA0MSAxMzUgMTMzIDQyIDk1IDE1IDQ1IDEzNiA5MyAxMDAgOTggMTczIDYgMTMyIDU1IDQgCis0IDMxIDY0IDEzMCAxNjIgMTU2IDY0IDE1NyAxOSA0NiA5NiA5MiAxMDMgMTM5IDEzNCAyIDk0IDE4IDg2IDM4IDg5IDYyIDYxIDc5IAorMTU3IDE0IDExMiAxMTEgMTU2IDMyIDE0IDg1IDc4IDMxIDU5IDIwIDEgMTYxIDE2OSAxNDkgMjkgMTIyIDE1MCAxMzMgMzcgMTAyIDMwIAorMTA5IDY1IDg1IDUxIDE3NCAxMTAgMTY0IDY2IDc3IDc2IDExMSAxMTkgMTMxIDk1IDUgMSAxNjYgMTAzIDEzNCAxNDEgMTcgMTU4IDEyMyAKKzEzNyA0OCAxNjUgMTc1IDEwMiAxMyAzIDg2IDQzIDIzIDQ3IDU2IDE1MCAxNjUgNCAzNiAxNzQgMTE1IDE1NyAxNjggMTMgMTQ3IDExOSAKKzEwOSA1NSA0MSAxNDAgNjcgMjcgMzEgMjcgNTMgMTI2IDE3IDE2MyAxMTYgMTIyIDE2MCA2MCA3IDkyIDExMyA2NiA0NSAxMDkgNjAgCisxNTEgMTI1IDYyIDM5IDM5IDE3IDE1MyAxMyAxNTIgNTMgOTQgNTAgNTMgODkgNTcgMTI3IDE1MyA0NSAxMTkgMTA0IDEyMSA1NiAxNDUgCisxNzIgMTkgNDEgMTAzIDE2NiAxMDggNjggMTI2IDEyIDUzIDEzMSAxMjcgMTQ4IDUyIDEzNCAxNjggNTAgNDggMTU1IDcyIDEzMiA4MiAKKzM3IDEyOSA2MyAxNzUgOTcgNzkgMTggOTEgMTQ4IDc0IDU3IDEzMiA4NyAxNDcgMTE0IDE3NSA3MCA0NiA2OSAxMTggMzcgMTA3IDE0MCAKKzk0IDYwIDE1NiA1OSA0NyAzNCAxMTAgMjUgMTQzIDExMyAzOSAxMiA0MyAyOCAxNTcgMTU4IDE0NSAxIDEyIDI2IDk4IDIgMTE2IDExNyAKKzUwIDc1IDEyIDIxIDE2NCA3NiAxMjEgNDYgMTAxIDg1IDg4IDEzNCAxNDYgMTI3IDE0MyA3OSBeCiszNjQgMCAzMiAxNjQgMTQ2IDkzIDE2MiAzMSA2NiAxMjMgMTQ0IDgwIDEzNSA5NCAxMzcgMTU2IDEwNyAxNTcgMTczIDYyIDY1IDE3NiAKKzEyNCAxMTIgNCA2NSAxMjcgNDQgMTMxIDUzIDE5IDEwNSA5MSAxNDkgMTA2IDI3IDU3IDE1OCA5MiA4NSAxNCA3OSAyMCA4NCAxMjcgCisxNzQgMTI4IDcyIDY4IDU5IDE3MSAxNyAxMjQgODAgMTY3IDggNTcgMjggMTcyIDY2IDE0NCA0OCA0MiAzNyAxMDkgMTIxIDE4IDEyMCAKKzEwMyAxMTYgMTMgMTMyIDM5IDczIDE0NSA3NiAxNTggNDMgODIgMzMgNTEgMTUzIDE2NCA5NyAxMyAyIDMgMjAgMjQgMTE0IDk4IDkgMjUgCisxMzEgMTAyIDk5IDg2IDQyIDE2IDI2IDE1OSAzOSAxMDUgMTYxIDEzMyA0OSA1OSA0MSAyMCAxMDUgMzEgMTM2IDMwIDg3IDEwIDExOSAKKzEzNSAxMyA4MyA5OSA1OCA0NSA5OSAxNTYgMjYgNjEgMTM1IDE0MyA4MCAxMTggMTA3IDc2IDc3IDI0IDQ0IDEyIDY2IDk1IDE0NyA2MSAKKzg2IDE0MCA5OSAxNjcgMTM4IDU0IDQ3IDQyIDk3IDEyMiAxOCA2MCA5MCA0MCA3MyA4NSA2MyA4MiAxIDM1IDk2IDk0IDgxIDU0IDE1IAorMTI4IDQwIDUyIDIgMTAxIDEgMTY1IDkzIDExMyAxMzAgODUgOTUgOTggNTggMTA1IDExMiA1MyA2OCAxMDggNzIgMTAwIDE1MiA0OSA4NyAKKzE0MCAzOSAxNTQgNjIgMTE0IDc3IDEwNSA2MyA1MCA4NyAxNTcgMjYgNzggMTIyIDY3IDE0MCA3MSAxNzAgMTE5IDUgOTMgNjQgNTAgCisxMDQgMTQ0IDEyOSAxMzggNzUgMTMwIDQgMTc4IDYwIDEzOSAxMjAgNTQgMTEzIDMyIDIgMTMzIDE3IDQzIDE2MyAxMjkgODkgNzIgMTQ5IAorMTU1IDMwIDM4IDcgMTM4IDUgNDQgNjEgNjkgNzYgMTc1IDEwNyA2IDkzIDgxIDExNCAyOCAyNSA4MiAyMiAxMTggNTggNzMgOTYgMTc1IAorMTc3IDkyIDM2IDExIDk4IDE3MSAzOCAyOCA0MiAxNDYgMTI1IDE3OCA4OCAxMzYgMTM5IDEwMyA2NyAxMCAxNTEgMTUxIDcwIDE1MyAKKzExNSA5NCAzMiA1MSAzNCAxNzcgMTczIDEzMiA0OSAxMTkgNTQgOTYgNDUgNzggNzMgNjQgMTU5IDEyMCAyMiAyMCAxNTQgMTExIDExNyAKKzU4IDU2IDEwOSA3MiAxMTcgMTM5IDE1MiAxNDcgMTcwIDEwMiAxOCAxNjkgNCA5NyA0MSAxMDEgMjIgNjkgNTUgOTIgMTQ1IDI3IDE1NSAKKzYyIDU0IDY0IDI5IDIxIDMgNDggMjEgMTMzIDE0NyA0MCAzIDE3OCAxMjAgMTUyIDE3IDE3MyA4MyAxNDggMTM4IDI2IDEyNyAyMyA0OCAKKzkxIDExNyA5MCA3MiAxNjYgMTQyIDEzMyA5OCAxMzkgMjIgMTUwIDE1MSAxMzAgMTQwIF4KKzM3MiAwIDM0IDcwIDc4IDE2MSA2NCA5MiAxMTIgMTEwIDcyIDE3NSAxMDIgMTM4IDE3OSAxNzMgMTU5IDU5IDE5IDI3IDE4IDUzIDkyIAorMjIgNjUgMTU2IDE3MCA1NyAxMDQgODYgMTI2IDE0OCAxMTggMTU1IDc4IDQzIDYzIDkwIDQ4IDgwIDE2OCAxNDIgNjggMTIgMzkgMTc0IAorNjkgMTY4IDE0NyAxMTggOTYgMzQgMTI5IDM1IDc1IDUgMTA3IDYwIDE3MCAxODAgMTQ3IDg1IDMgMTMzIDc1IDk1IDE1MiA3MSAxNzUgCis0MyA5NCAxNzggNTAgMTQ0IDE2IDQ2IDEwMSA0NiAxNjUgNDUgNjggMTYzIDM4IDE3MiA1IDEzOCA2MSA4NSA2MiAxNzcgNzYgMzYgMTY3IAorMTkgNTMgMTUxIDY2IDY2IDk3IDMgMTAwIDE2NCAxMiA5OCAxMzEgNzAgMTA5IDE2MiAxNjEgMTU2IDE0MiAxNCAxMDUgMjcgMTQxIDkgCisxNzggODEgNTAgMTEzIDExMCAxMzEgMzcgMTYgNzkgMTIgMzQgMzcgMTY3IDE3MyAxMCAxNTIgNyA4MSAxNDAgMTU4IDI2IDEzNiA4MiAKKzUwIDE3MiAxNTQgNDUgMTYwIDMxIDEyMiAxNjcgMTQyIDkgMTUwIDEyNSA1MSA1NCAxMjUgMTc0IDEwIDEyNCA1MSAxNzcgODEgMTczIAorNjkgMTA5IDggMjIgMTU1IDE5IDg2IDYyIDE0OSAzMyAzNyAxMDggMzQgOTYgMjkgMTc0IDEzMyAxNjcgNTAgNTQgNjYgMTMwIDkgMSAzNiAKKzEzNCAxMDggNjUgOTcgMTI2IDU2IDE2MyA3MSA4MyA4OCAxMCAxIDggMTc4IDIyIDYgMTEyIDE2OSAxMTYgODkgNDMgMTUzIDQwIDE0NiAKKzg1IDMxIDg5IDc0IDE1NCAxMzcgMjggMTE1IDExNyAxMjIgMTA4IDk4IDggMjcgMTEwIDEwMyAxNzYgMTcgMjAgMjcgNzcgMTAgOTMgCisxNDUgODAgMTcgMTQzIDE2NSA3NiA2OSA3OCAxMDIgMjAgOTEgMTcxIDk1IDI5IDExNSAxNzYgMTY2IDEwOSAzOSAyMyA3MCA4MyAyOSAKKzE0OCA2NyAxNjMgMTYxIDMzIDQgMTUgNDYgNDIgMiA2OSAxMDQgNTMgMzMgMTYwIDY0IDMzIDE1NSAxNCAxMzEgMTYwIDU5IDc4IDcxIAorMTkgMTc2IDEwNyA2NSAzOCA4MiA1NSA0MCA1NiA0MCAxMTUgODQgMjkgMjUgNDQgNjggMTA0IDE3NiA3NiA2NCAxMjMgMTggMjUgMTM2IAorMjMgNiAxNzEgMzEgMzAgMzAgNTggMTQgMTMgNzIgNTcgMTQgNDEgMjggMTQzIDczIDI2IDE2NyA4MyAxNDcgNTQgMiAzNiAxMSA2NSA2NiAKKzM4IDE0MSA5OSA0MSAxNzkgNTUgMTU4IDU3IDEzNyAxNzkgMTE0IDIwIDU4IDc4IDEyIDE1NyAxNzUgMTY2IDUwIDE3NyAyMiAxMjkgNjggCisxNjggMTc1IDc0IDkzIDExNCAxNzQgMTAyIDc5IDEzNSAxNzIgMzYgNDQgMTU4IDE0OSA5MiA4MSAxMDkgMTU3IDExMSA3MiAxMTkgXgorMzcyIDAgNTkgNTIgMTEyIDE4MCAyMCAzMCAyMiAxNzMgODAgOTggNDYgMTA2IDE3OSA2NSAzMCAxNyAxMjcgMTI1IDI2IDg3IDE1IDUgCisxMzYgODUgMTAwIDY2IDE0MSAxODIgMTI0IDE1IDE1NiAxNDggMTUgNTYgOTggMTQ2IDE1NiA0OCAxNDkgMyAxNCA5NiA1MiA3OSAxMTUgCisxMzQgMTcwIDU0IDE3OCA1NCAyMiA3MyAzMCA0NSAzOSAxMzMgMTgyIDk2IDEwMyAxNDggMTc2IDYgNDUgNjIgMTgzIDUxIDE4MCAxNTMgCisxNDUgMTQ1IDExNyAyMSA5MCAxMTggMTA5IDIxIDYyIDIyIDEwMSA0OSA1MyAxMSAxNDIgODYgMTMyIDY2IDY5IDQ0IDc5IDg3IDExNSAKKzU1IDUgMTY5IDE1MCA2MyAxMTAgMTA5IDE3NyAxNTAgOTEgMTI5IDQwIDE0OSAxNTkgMTAyIDE2NSAzIDcwIDI3IDE3NSAyMyA1NiAxMjYgCisxNjUgMTY0IDIwIDE1OCA5MSAxNTcgMTM2IDE1NyAxMzEgMTExIDY5IDM5IDMzIDEzMiA0MyAxOSAxNzUgMTc5IDM3IDExOCA5IDE1NSAKKzExNiAxMjIgMTI4IDUyIDcgODQgODkgNTggMTMgODUgNDQgMTM1IDEyNSA1NCAxODMgMjMgMTYxIDE0NSAxNzMgMTM2IDI5IDYyIDUwIAorMTMgNTcgMjUgMTI3IDE1MyA0NSA5NSA2NCAxMjEgNDAgMTIxIDE0MCAxNzEgOSA3MSAxNjYgNjggMjggMTAyIDQgNTMgMTIzIDExMSAKKzE0OCAyMCAxMDIgMTYwIDM0IDggMTM5IDMyIDExNiA2NiAxMyAxMTMgNjMgMTQzIDk3IDYzIDEwIDU5IDEyNCA2NiA0MSAxMzIgNzEgCisxMTUgMTA2IDE1MSA0NiAyMiA0NSAxMTggMzcgNjcgMTI0IDk0IDYwIDE0MCA0MyA0NyAxMCAxMTAgOSAxMjcgOTcgNyAxNTYgNDMgMTgwIAorMTI1IDEyNiAxMzcgMTQ1IDEyIDIgODIgMTQ2IDEwMCAxMTcgMjYgNTkgMTgwIDE4MSAxNjQgNzYgODkgMzAgMTAxIDc3IDcyIDEyNiAKKzExNCA5NSAxNDMgMTAyIDMyIDE0OSAxMzEgODMgMTU3IDMxIDYxIDEyMyAxMzkgNjAgMTM1IDc0IDE2OSAxMjIgMTUxIDEwMiAxMzcgCisxNjggNjIgNTUgMTY2IDExOSA5NyAxNjMgNjAgMTEyIDI0IDExNiAzOCAxNzggMTA1IDkxIDEzNCA4NiAyNyA0NyAxMzggNzIgNzAgMTgzIAorNzkgMTUgODQgMTE3IDE1NCAxMjggNTcgNTMgMzkgMTYxIDE3IDEwNCA3NSAxNTcgMyA0MiA4IDE2NyA1MSAxMjQgMzggMjIgMTcgOTkgCisxMDYgMTggMTE1IDgzIDEwMSAxNzcgMTIyIDE3OSAxNCA2OCAxNDAgNzEgMTQzIDE4IDgyIDE4IDMxIDEzMyAxNTQgNzcgMTcyIDE3NiAKKzE2NyAxNzkgOSA5OSA3OCAxODMgMTExIDkyIDg5IDg2IDMyIDE2IDE2IDE0NCAyOSA5MCAxNDYgMTI4IDI5IDM0IDMxIDUgODUgMTYgCisxMTYgMTAgODIgMTc0IDExOSAxMjUgNzkgXgorMzkxIDAgNTkgNzUgMTggNSA1OSAxMzIgMjYgMjEgMTI3IDExOSA4MCA5NCA4MyA1MiA2MSAyNCA0NCA0IDUwIDU1IDExNSAyOSA3MCAKKzE0MCA5OSAxNTkgMTMwIDU0IDE1IDQyIDg5IDExNCAxNzMgMjggNTAgMTYgMzMgNTMgNDcgNTggMTgwIDE5IDY0IDc4IDQ5IDMwIDE4NiAKKzEwNCAzMiA0NCAxNTcgODUgMSAxNDkgODUgOTcgMTE0IDc3IDYzIDU4IDUwIDg5IDgwIDIxIDM2IDg0IDcyIDYwIDE1MiAyNSA4NyAxMDggCisxNSAxMzggNTQgMTA2IDc3IDk3IDIzIDQyIDU1IDE0OSAxODEgNjIgMTA2IDQzIDEzMiAzMSAxMzggMTExIDE3NiA5MyA0MCAxMCA5NiAKKzEyOCAxMDUgMTE0IDQzIDk4IDQgMTQ2IDIwIDEwNyAxMjAgMTQgMTEzIDE4MSAxMDEgMSAxOSAxNTUgMTEzIDU3IDY0IDExNyAxMzEgNiAKKzIyIDE4NiAxMzggMTg0IDM2IDYxIDI5IDM2IDE3NSAxMDcgNiA2MSA4MSAxMTQgMjAgMTgwIDQyIDE2OSAxMDIgMjYgNzMgODAgMTUxIAorMTUzIDY4IDQgMTEgOTggMTM5IDYgMTc1IDM0IDE0NiA5MyAxNTQgODggMTI4IDEzOSA3OSAzNSAyIDEzNSAxMTkgNDYgMTI5IDkxIDg2IAorMTc5IDUxIDE4IDE2OSAxNDEgMTA4IDQ5IDEwMyA0NiA3MiAyMSA3MCA0OSA2NCAxNTEgOTYgMTg1IDE3NSAxMzAgMTExIDg1IDU4IDMyIAorMTAxIDQwIDEwMSAxMzEgMTM2IDEzOSAxNzAgNzAgMTAgMTY5IDE3NSA3MyA0MSA2OSAxNzcgNDUgNDcgOTIgMTQ1IDExIDE1NSAyMiAyMiAKKzU2IDIxIDEzIDE2NiA0OCAyMSAxMDkgMTMxIDQwIDE3NCAxNzggMTA0IDEyOCA5IDE0OSA1MSAxMzIgMTIyIDE3MyAxMTkgMjMgMjQgNjcgCisxMDkgNzQgMzIgMTU4IDExMCAxMTcgNzQgMTIzIDYgMTE4IDE1MSAxMzAgMTUwIDE2NyAzNCA1NSA1OCAxNDYgNTQgNzIgMTEyIDEwNSAKKzU3IDE2MCA4MiAxMjMgMTU5IDE1MyAxNTkgMzkgMTkgNyA4IDMzIDg3IDEyIDUwIDE0NiAxNTAgMzcgMTA0IDcxIDEyNiAxMzMgMTA4IAorMTQ1IDY4IDM4IDM4IDkwIDQzIDc1IDE0OCAxMjIgNDMgMiAzOSAxNTQgNTQgMTYzIDE0NyAxMTMgOTEgMjkgMTA5IDM1IDc1IDE4MiA4NyAKKzM1IDE1NSAxNzAgMTI3IDgwIDE4NSAxMTggNjAgOTUgMTQyIDcxIDE2NSAyOCA4NCAxNjggMjUgMTQ0IDE3OCAzMSA4MSA0MSAxNjAgMjUgCis1MyAxNDMgMjMgMTcyIDE3MiAxMzMgNTEgNzUgNTIgMTU3IDUxIDM2IDE1NyAxODEgMjggMTQxIDUxIDQxIDg3IDE2NSA4NSAxNTQgMTg0IAorOTMgMTMxIDQ1IDEwNCAxNjIgMTYxIDE0MSAxNDIgMTQgOTUgMTIgMTQxIDE4MSAxNTggNzEgMzUgOTggMTAwIDExMSAxMiAxMSA2NCAKKzE3NCAxNCAyMiAxNTIgMTczIDUgMTMyIDE3OSA1NiAxMzUgMTUzIDExIDEyMSA1NyAzMCAxNTIgMTM5IDQwIDE0MCA1MyBeCiszODQgMSAxMDYgMTU5IDExOCAxNjcgMTUwIDEwMSAxMSAzMCAxMDkgMTUwIDE4NCAxMjQgMTkgMTY5IDczIDE2NSA1MyAxMDkgMTU4IAorMTcyIDE0NyAxMSA0NiAzOCAxNDkgMjUgMjEgOTIgMTg0IDY0IDE3OSAxNTggMTMzIDEzNSAzNCAzOCA1OCAxMTQgOSAxODMgNCAxMTggCis3NiA0OSA4OSAxMDIgNDAgMTYzIDQ3IDc1IDgwIDE3NiAxNzUgOCAxNTQgMTQgMTgwIDEwNCAxNTMgODQgODkgMTEgMTI5IDggMTM4IDg1IAorMTgxIDczIDY2IDE1NCAxMjEgMjAgMTE1IDkzIDExNCAxMDggODIgMTgyIDE5IDg2IDEwMyAxNzYgMTgzIDE4NiAxNzcgNTMgMTAgNjkgCisxMzcgNTYgMSAxMzUgMTQxIDY4IDY5IDU0IDg2IDEyIDc1IDE3MSA4NyAxODcgMTA3IDE0NCAxNTAgOTMgMjMgNyA3MCA4MyAyOSAxNDAgCis2NyAxMzkgMTUzIDE4MyAxNzggMTg5IDMwIDE4IDIgMjkgNzIgMjkgMzMgMTYwIDU2IDkgMTIzIDE2NCAxMDcgMTM2IDE5IDcwIDMxIAorMTc3IDE1MiA5OSA1NyAzOCA2NiA1NSAzMiAzMiAyNCA4MyA2MCAyMSAxIDM2IDUyIDgwIDE2OCA0NCAzMiAxMTUgMTg0IDI1IDEyMCAKKzE4MSAxNzIgMTU1IDE4OSAyMiAzMCAyNiAxODAgNSA2NCA0OSAxODggMSAyOCAxMTEgNTcgMTc2IDE2NyA2NyAxMzEgMjIgMTYwIDE4NiAKKzE2OSA2NSAzNCAzMCAxMTcgOTEgMTcgMTYzIDM5IDEzNCA1NyAxMzcgMTU1IDkwIDE3MCA0MiA3OCAxNzAgMTQxIDE2NyAxNTggNDIgCisxNzcgMjIgMTI5IDY4IDE2OCAxNDMgNzQgMTUwIDg1IDgyIDE3NCA3OCA2MyAxMTEgMTU2IDI4IDEyIDE1OCAxNDEgNzYgNTcgNzcgMTI1IAorNzkgNDAgMTIgNTkgNTIgODggMTU2IDIwIDI0IDE4MiAxNDkgNTYgOTIgNDYgMTA2IDE2NyA1OSAxODkgMTIxIDExOSAxNCA4MSAxNSAKKzE2NSAxMzYgNzkgMTAwIDQyIDExNyAxODIgMTE4IDE3NSAxMzggMTI0IDMgNTAgNzQgMTM0IDE1NiAzNiAxNDMgMTgxIDE4MCA5NiAyMiAKKzYxIDk3IDEzNCAxNjQgMjQgMTY2IDMwIDEwIDYxIDYgMzMgOSAxMTUgMTc2IDg0IDk3IDE0MiAxNTIgMTUgNTAgMTY1IDQ1IDE2OCAxMzUgCisxMzMgMTI3IDkzIDE1IDY2IDk0IDkxIDkgMzIgMTYgOTUgMzcgMjkgMTcxIDExOCA2OCAxMDggNjYgNjMgMjAgNTUgNjMgMTAzIDI1IDUgCisxNjMgMTM4IDMzIDkyIDg1IDE2NSAxNDQgNjcgMTIzIDM0IDEzNyAxNDcgMTAyIDE0NyAzIDU4IDE1IDE1NyA1IDU2IDEwOCAxNjUgMTUyIAorOCAxNDYgNzMgMTU3IDExMiAxMzMgMTE5IDEwNSAzOSAyNyAyNyAxMjYgMjUgMTMgMTUxIDE2MSAyNSAxMTIgMyAxNDkgMTE2IDEyMiAKKzEwNCA0NiA3IDc4IDcxIDUyIDE3OSA2NyAzMiAxMjMgMTI1IDQ4IDE1OSAxMSAxMzcgMTM5IDE2MSAxMTAgXgorMzk0IDAgMiAyNiA1MCAxNjEgMjEgMTgyIDEyNyAxNTMgNDUgNjggMTkgMTIxIDIyIDk0IDEwNCAxNDQgMTY2IDM1IDE2NiAyMyAxNzYgCis3NSAxODggNTMgMTE0IDkzIDE0OCAxNzcgNjYgMTUxIDE2IDE1NiAxMjEgMTgwIDk4IDQ4IDE3OSA5NSA2MyAxMDcgOTcgNDUgMSAyMyAKKzk3IDU3IDIzIDEzMiA1MyA3OSA5NyAxMjQgMTkgMTg4IDE4IDExOCAzNyAyMiAxMDYgOTQgNjAgMTIyIDI1IDQ3IDE3NiAxMTAgMTg0IAorMTA5IDc5IDE2NCAxMjAgNDMgMTUzIDg5IDkwIDEyOCAxMDkgMTIgMTY4IDY0IDExMCA4MiAxMTcgMTkyIDQxIDE3MSAxNjMgMTY0IDc2IAorNTMgMTIgMTAxIDY4IDU0IDExNyA3OCA1OSAxNDMgODQgMzIgMTIyIDEwNCA2NSAxNDggMzEgNTIgMTIzIDEzMCAyNCAxMzUgMzggMTUxIAorOTUgMTQyIDkzIDEwMSAxNTkgNjIgMzcgMTQ4IDExMCA3MCAxMjcgNTEgODUgMTgxIDg5IDExIDE0MiAxMDUgOTEgMTA3IDUwIDI3IDI5IAorMTAyIDM2IDQzIDE2NSA3OSA2IDg0IDk5IDExOCAxMjggMzAgMjYgMyAxNDMgMTcgNjggNjYgMTM5IDE4NyAxNSAxNjUgMTU4IDI0IDg4IAorMjAgMTc5IDE3NCA4MSA3OSAxOCAxMDYgNDcgNzQgMTUwIDEwNCAxNzkgMTYyIDU5IDEzMSA2MiAxMTYgMTY2IDgyIDE4NCAxODggOTcgCisxMzYgNDEgMTM2IDE2NyAxNDAgMTQzIDE3NSA3MiA0MiAxNzQgMTQ4IDc1IDc0IDcxIDg2IDE0IDE2IDE5MSAxMTcgMTEgNjMgMTE5IAorMTE5IDE4NiAxODIgMTMgMTcxIDQ5IDE4MiA4MCAxNjcgNzMgMTQ3IDExOSAxMDcgMTY0IDQxIDU3IDE4MSAxNjggMjkgMTE0IDI2IDE4NCAKKzEyMSAxMDEgODAgNzYgNjUgMzQgNDkgMjQgNDQgMTkxIDM4IDI1IDkxIDUgNTggMTQwIDk5IDE1MyAxMjQgNTQgMTg0IDQyIDgzIDEwOCAKKzE1NSA0IDIwIDE5MSAzIDI5IDM1IDQwIDE4MCA3IDQwIDY2IDI1IDEyIDE4MCA4NiAyNiAzOCAxMzkgNzMgMSAxMzcgNzkgODUgMTAyIAorNzEgMzkgMjggNDQgNzcgNTYgMTkwIDEyIDY2IDcyIDMwIDE1MiA3IDg3IDg0IDE5MCAxMjYgNDggMTAwIDc3IDkxIDE4NiAzNiAzMSAKKzE0MyAxNjMgNTAgOTQgMjUgMTI2IDEgMTE0IDEwNSAxNzAgOTMgMjIgMTczIDkwIDExNiA4NyA5NiAxOSA3NCA0IDEyMiAxODMgODMgCisxMjAgMTc3IDExMyAxNjkgMTgxIDc3IDE4MiAxIDE0OSAxMDEgMzMgNTggOTMgMTEzIDE4MSAxMCAxODYgMTM4IDE4NCAzMCA2MSAxOTIgCis2IDE3NSAxMDcgNiAzNyA4MSAxMTQgMTQgMTYyIDEyIDE0NSA5MCAyIDczIDY4IDEzMyAxMzUgNTAgMTczIDExIDk4IDExNSAxNzUgMTUxIAorMjggMTQ2IDY5IDEzNiA4OCAxMjIgMTM5IDYxIDExIDE4OSAxMjMgOTUgMjggMTExIDczIDgwIDE1NSA1MSA2IDE2MyAxMTcgOTAgNDkgCis5MSA0MCA1NCAxODkgXgorMzkwIDAgNjIgMjUgNjQgMTQzIDcyIDE2OSAxNTEgMTA2IDExMSA1MyA1OCA4IDkzIDggODUgMTIzIDEyMCAxMzEgMTcwIDM4IDIgMTY5IAorMTY3IDQ5IDQxIDM3IDE1MyAyMSAzOSA5MiAxNDUgMTkwIDE1NSAxNzcgMTg1IDQ4IDEzIDUgMTUwIDQ4IDIxIDg1IDExNSA0MCAxNjYgCisxNzggODggMTA0IDEgMTI1IDE5IDExNiAxMDYgMTQxIDExMSAyMyA0MyAxMDEgNTggMTg3IDE1MCA3OCAxMDEgNTAgMTA3IDE4NSA4NiAKKzE1MSAxMzAgMTM0IDE0MyAzNCAzMSAyNiAxMjIgMzggNDAgMTEyIDk3IDMzIDEzNiA1MCA5OSAxMjcgMTIxIDE1OSA3IDE5IDE3MCAxODcgCisxIDc5IDE5MSAyNiAxMzAgMTE4IDUgMTA0IDQ3IDEyNiAxMDkgOTIgMTI5IDUyIDMwIDE5MyA5MCAzNSA2NyAxMTYgOTAgMyAxODEgMzkgCisxMjIgMzAgMTU1IDE0NyAxMDUgODMgMjEgNzcgMzUgNzUgMTc0IDU1IDE5MCAxMzEgMTU0IDk1IDcyIDE4NSA5NCAzNiA5NSAxMjYgNzEgCisxNDkgNCA2OCAxNTIgMTgwIDE0NCAxNDYgNyA0OSAzMyAxNTIgMTg4IDI5IDExMSAxOTQgMTcyIDE0OCAxMjUgMzUgNTkgMzYgMTI1IDExIAorMzYgMTQxIDE0OSAxODMgMTI1IDI3IDEgNzEgMTMzIDYxIDEzOCAxNjggODUgMTMxIDUgOTYgMTYyIDE2MSAxMTcgMTQyIDE0IDc5IDE4MyAKKzE0MSAxNjUgMTI2IDU1IDExIDc0IDg0IDc5IDE2NyAzIDQwIDE0MiAxNzcgMTkzIDEyOCAxNzMgMTkyIDEwMCAxNjMgMTYgMTI3IDE0NSAKKzE4MiA5NyAxNyAxOTMgMTIwIDExNSAzMiAxMDggMTggOTYgMTU0IDEwMyAxNTIgMTUwIDg2IDE4MSAxNSA5OSAxMzUgMTc5IDEyNCAxOTQgCisxNjQgNjggMTYwIDQzIDEwOSAxMzggMTUyIDE0MiA2IDIxIDIzIDE0OSAyMCAxMSA4MiAxNjQgNDQgMTU5IDE0OCAxMzMgMTE1IDI0IDI4IAorNTMgMTA0IDkgMTgzIDE3OSAxMDggNTYgMzkgODQgODcgMzAgMTYzIDMyIDcwIDc1IDE2NiAxNzAgOCAxMzkgOSAxNzUgOTkgMTQzIDY0IAorODkgMTg2IDExNCAxODMgMTMzIDg1IDE2MSA2MyA2MSAxNTQgMTExIDE1IDExNSA3OCAxMDkgMTA4IDcyIDE3NyAxNCA3MSAxMDMgMTc2IAorMTczIDE3NiAxNTcgMzggMTAgNTQgMTMyIDQxIDE4NiAxMzAgMTI2IDYzIDY5IDM5IDc2IDcgNjUgMTcxIDgyIDE3MiAxMDIgMTI0IDE0MCAKKzgzIDEzIDE5MiA3MCA4MyAyOSAxMzUgNjcgMTI0IDE0OCAxNjMgMTczIDE4NCAyMCAzIDIgNCA1MiAxNCAzMyAxNjAgNTEgMTg5IDEwMyAKKzE0NCA5MiAxMjEgMTg5IDY1IDYgMTYyIDEzNyA5NCA1MiAzOCA1NiA1NSAyNyAxNyAxNCA2MyA0NSAxNiAxODEgMzEgNDIgNjUgMTYzIAorMjQgMTIgMTEwIDE3NCAyNSAxMTAgMTY2IDE2MiAxNDUgMTc0IDE3IDMwIDYgMTcwIDU5IDQ0IDE4MyAxNzEgMjggOTEgNDcgMTU2IDE3MiAKK14KKzQwMCAxIDUxIDExNSAxODggMTM2IDE1NCAxNDUgNjUgMiAyMiA5MyA4MyAxOTEgMTQ3IDIzIDExMCA1NyAxMzcgMTMxIDY2IDEzOCAyNiAKKzc4IDE0NiAxMjUgMTU5IDE1MCAzNCAxNzcgMjIgMTI5IDY4IDE2OCAxMTEgNzQgMTE4IDc3IDUwIDE3NCA1NCA0NyA4NyAxNDAgMjAgCisxNzggMTU4IDEzMyA2MCAzMyA0NSA5MyA0NyA4IDE3MCA1OSA1MiA1NiAxMjQgMjAgMTYgMTUwIDExNyAyNCA4NCA0NiAxMDYgMTUxIDUxIAorMTU4IDE3MyAxMTMgMTExIDE5NiA3MyAxNSAxMzMgMTM2IDcxIDEwMCAxMCA4NSAxODIgMTEwIDE0MyAxMTQgOTIgMTg1IDQyIDQyIDExOCAKKzE1NiAyMCAxMzUgMTczIDE1NiA5NiAxODAgMzcgNzMgMTM0IDE1NiAxODIgMTUwIDE5NiAxOTIgNDUgMTcyIDE3IDE2NyA5MSAxNjggNjggCis4OSAxMzQgMTIwIDE5MCAxNzMgMzQgMTQxIDM3IDE1MiAxMTEgMTE3IDEwMyA2MSA3IDM0IDYyIDY3IDE5MSAxOTAgOCA4NyAyMSAxOTUgCisxMzkgODYgNDQgNzYgNjYgNTUgMTg2IDIzIDMxIDg3IDE4MyA1IDE1NSAxMjIgMTkxIDY4IDUzIDE0OSAxMzYgMzUgMTE1IDI2IDEyMSAKKzEzMSAxMDIgMTIzIDMgNDIgMTk3IDEzMyAxNzkgNTYgODQgMTY1IDEzNiAxOTAgMTMwIDQ5IDE1NyA4MCAxMDEgMTAzIDk3IDE5NyAxMSAKKzE5IDExOCAxIDUgMTE5IDEzNyA5IDEwNCAxOTMgMTQxIDExNiAxMjIgNzIgMzggNyA3MCA0NyA0NCAxNTUgNDMgMTYgMTA3IDEyNSA0MCAKKzEyNyAxOTMgMTA1IDEzMSAxNDUgMTA4IDE4NSA2IDUwIDE0MSAxIDE2NyAxMjcgMTUzIDQ1IDUzIDE5MiAxMjEgMTIgNzkgODQgMTI5IAorMTUxIDE1IDE2NiAxOTYgMTU2IDYwIDE4OCA1MyAxMDkgODMgMTQ4IDE2MiA0NiAxNDYgNiAxMzYgMTExIDE2MCA4OCAzOCAxNjkgODUgCis2MyA4NyA5NyAzNSAxOTQgMyA4MiA1MiAxMyAxMzIgNDMgNTkgOTIgMTA5IDQgMTc4IDMgMTE4IDM3IDE5NSA5NiA5NCA2MCAxMTIgMTUgCis0NyAxNjYgMTEwIDE3OSA5OSA2OSAxNDkgMTAwIDQzIDEzOCA2OSA3MCAxMjMgODkgMTIgMTU4IDU0IDkwIDcyIDExNyAxODIgMzEgMTY2IAorMTUzIDE2NCA3NiAzMyAyIDEwMSA2MyA0NCAxMTIgNTggMzkgMTQzIDc0IDMyIDEwNyA4OSA1NSAxNDMgMzEgNDcgMTIzIDEyNSA0IDEzNSAKKzE4IDE0MSA4MCAxMzcgODggODEgMTU0IDYyIDI3IDEzOCAxMDUgNTUgMTA3IDQ2IDcwIDE2NiA3NCAxOTQgMTIyIDEwNSA5MSA5MiAzMCAKKzI3IDE5IDgyIDE2IDI4IDE1NSA3OSAxIDg0IDg5IDk4IDEyOCAxNSAxMSAxODEgMTMzIDE3IDQ4IDYxIDEyOSAxODcgMTUwIDE1MyA5IAorNjggMTAgMTY0IDE1OSA3MSA2NCAxOCAxMDEgMjcgNTkgMTM1IDk0IDE3OSAxNDIgNTQgMTI2IDU3IDEwMSAxNDYgODIgMTc0IDE3MyA3NyAKKzEyNiAyMSAxMTYgMTYyIDEyNSAxMjMgMTY1IDU3IDIyIDE2OSAxNTMgXgorMzk0IDAgNDcgNjAgNTcgODYgMTYgMTg0IDk2IDE5NyA0MiA5OCAxMTIgMTY1IDE1NCAxOTkgMTU3IDIxIDE2OCA1MiAxNDYgNjYgMTI2IAorMTE5IDkzIDE1MCAyMCAzNiAxNTMgMTQwIDE5NCA5MyAyNiAxNTYgMTE0IDgwIDgwIDU1IDQ0IDEzIDM1IDI0IDQ0IDE5MSAyNCAxOTAgCis2MyAxNzcgNDQgMTQwIDk5IDE0NiAxMTcgNTQgMTYzIDQyIDc2IDEwMSAxMzQgMTc2IDE4NSAxNzcgMTY4IDEgMjEgMTkgMTgwIDE5MyAKKzEyIDUyIDE5NyAxOTEgMTczIDY1IDE5IDMxIDExOCA1OSAxIDEyMyA3MiA3MSA4OCA2NCAxMSAxOTMgMzcgNjMgMjggMTY5IDE4NCA0NSAKKzcyIDE5NSAxNTIgMTg2IDg3IDU2IDE3NiAxMTIgNDEgOTMgNzcgODQgMTU4IDI5IDMgMTM2IDE0MiAzNiA4MCA0IDExOSAxNjYgODYgOTggCisxNjMgOTMgMSAxNDUgODMgMTAyIDY2IDc1IDE5MSA0NiA0IDk0IDE1NSA1NSAxMjAgMTQ5IDExMyAxNDggMTgxIDQ5IDE3NSAxODAgMTQyIAorODcgNSA1MSA2NSA5MiAxNjcgMTk2IDE4NiAxMzggMTg0IDIzIDYxIDE2NCAxNzEgMTc1IDEwNyA2IDkgODEgMTE0IDcgMTQxIDE3NyAKKzExNyA3NiAxNzQgNzMgNTQgMTEyIDExNCAyOSAxNTIgMTEgOTggODcgMTU0IDEyMyAyMSAxNDYgNDEgMTE1IDg4IDExNSAxMzkgNDAgCisxODMgMTg5IDEwOSA2NyA3IDkwIDUyIDczIDEyNyA1MSAxOTIgMTU2IDg5IDY5IDQ5IDc3IDMzIDMzIDE4MiA1NyAxMCA2NCAxMzggNTcgCisxNTkgMTM2IDkxIDExMSAzMyA1OCAxOTMgODggMTg4IDc1IDExOCAxMTAgMTI2IDE3MCAxOCAxOTcgMTY5IDE2MiAzNCA0MSAxNyAxMzggCis2IDM0IDkyIDE0NSAxODUgMTU1IDE1NyAxNzAgNDMgOCAxNDAgNDggMjEgNzAgMTA1IDQwIDE2MSAxNzggNzggODkgMTk2IDExMCAxOTkgCisxMDYgOTYgMTIxIDEwNiAyMyAxODUgMjggOTYgNDggMTY3IDE0NSA1OCA5MSAzNSA5NyAxODAgNjYgMTUxIDEzMCAxMjQgMTI4IDM0IDE2IAorNiAxMDcgMjggMjAgMTEyIDkyIDE4IDEyMSAzMCA4NCAxMDcgMTAxIDE1OSAxODcgMTkgMTU1IDE4MiAxODEgNzQgMTg2IDExIDEyMCA5OCAKKzE4NSAxMDQgMzIgMTI2IDk0IDgyIDExOSA0MiAyNSAxNzMgOTAgMzAgNjIgOTYgNzAgMTc4IDE3NiAzOSAxMDIgMTUgMTUwIDE0NyAxMDAgCis3OCAxNiA1NyAzNSA3NSAxNjkgMzUgMTcwIDExNiAxNDQgNzUgNjcgMTg1IDc5IDIxIDk1IDExNiA3MSAxMzkgMTg5IDU4IDE0MiAxNjAgCisxNDQgMTI2IDE5MiAyOSAyOCAxNDcgMTczIDE0IDkxIDE4NCAxNzIgMTMzIDEyMCAyNSA0OSAyNiAxMDUgMTg2IDM2IDEzMSAxMjkgMTYzIAorMTE1IDEyIDE3NiA2MSAxMTMgNDYgMTI4IDE1OCA4MCAxMzEgMTgwIDkxIDE2MiAxNjEgMTAyIDE0MiAxNCA2OSAxNzMgMTQxIDE1NSAKKzEwNiA0NSAxOTYgNTkgNzQgNTkgMTQ3IDE5NSBeCis0MTIgMCAxNiAxMTAgMTUzIDE3NyAxMDQgMTczIDE5MiA2OCAxNDcgMTc5IDExOSAxMzcgMTY2IDczIDE4MCAxNjkgODggOTEgMjQgNzYgCisxMCA4MCAxNDYgNzkgMTI4IDE1MCA2MiAxNDkgMTk0IDgzIDExMSAxNzEgMTI0IDE3MCAxNTYgNjAgMTUyIDI3IDEwOSAxMDYgMTIwIAorMTM0IDIwMSAxODQgMjAyIDE0OSAxMiAxOTggNjYgMTMyIDEyIDEyNyAxMzIgMTMzIDgzIDggMTIgNDUgODggOSAxODMgMTU1IDkyIDI0IAorMjMgNzYgNjMgMTQgMTYzIDggNjIgNjcgMTUwIDE2MiA4IDExNSAxIDE2NyA5MSAxMjcgMzIgODkgMTYyIDkwIDE1OSAxMjUgODUgMTI5IAorNDcgNTMgMTU0IDk1IDcgMTE1IDU0IDEwMSAxMDggNTYgMTY5IDYgNDcgMTAzIDE3NiAxNTcgMTYwIDEyNSAxNCAxMCAzMCAxMjQgMTcgCisxNzggMTIyIDEwMiA1NSA2OSAxNSA2MCAyMDIgNDkgMTcxIDc0IDE0OCA5NCA5MiAxMjQgNjcgMjAwIDE4NCA3MCA4MyAyOSAxMjcgNjcgCisxMDAgMTQwIDEzMSAxNjUgMTc2IDQgMTgyIDIgMTY3IDIwIDE5MyAzMyAxNjAgNDMgMTczIDcxIDExMiA2OCA5NyAxNTcgNTcgMTY5IAorMTM4IDExMyA4NiA0NCAzOCA0MCA1NSAxOSAxOTYgMjAxIDMxIDIxIDggMTY1IDIzIDI2IDQxIDE1NSAxOTUgMTgzIDEwMiAxNTggMjUgCis5NCAxNDIgMTQ2IDEyOSAxNTAgOSAzMCAxNzcgMTU0IDE5NSA1MSAzNiAxNzUgMTM5IDI4IDU5IDMxIDEyNCAxNjcgNDEgMTA1IDE3MyAKKzEyMSAxMzQgMTMwIDY1IDE4NSAxNyA3OCA3OCAxODEgMTM3IDEzIDk1IDU3IDEzNyAxMTYgNTEgMTE4IDE2IDc4IDEzMSAxMTUgMTU0IAorMTQ1IDI5IDE3NyAyMiAxMjkgNjggMTY4IDkxIDc0IDk4IDcyIDMwIDE3NCAzOSAzNyA3MiAxMzAgMTUgMTYzIDE1OCAxMjggNTAgMTggCisyNSA3MyAyNyAxOTEgMTUwIDU5IDUyIDM2IDEwNCAyMCAxMSAxMzAgOTcgNCA3OSA0NiAxMDYgMTQxIDQ2IDEzOCAxNjMgMTA4IDEwNiAKKzE5MSA2OCAxNSAxMTMgMTM2IDY2IDEwMCAxOTMgNjUgMTgyIDEwNSAxMjMgOTkgNzIgMTgwIDM3IDIyIDEwOCAxNTYgMTAgMTMwIDE2OCAKKzE0MSA5NiAxNjAgMjIgNTggMTM0IDE1MSAxNjIgMTQwIDE4MSAxODcgMzUgMTU3IDcgMTQ3IDc2IDE2MyA1OCA4NCAxMjkgMTAwIDE5MCAKKzE1MyAyNCAxMjYgMzIgMTQyIDk2IDEwNyA4OCA0MSAyIDE0IDQyIDUyIDE4NiAxNzAgMyA4MiAxMSAxODAgMTE5IDY2IDI5IDU2IDY2IAorNTAgMTcxIDMgMTEgNzcgMTYzIDUgMTUwIDExMiAxNzEgNTMgMzMgMTM5IDEzMSAxNSAxMTAgMjEgMTExIDEyMSAxMDIgMTA4IDMgMzIgCisxOTIgMTE4IDE2OSA1NiA2OSAxNjUgMTI2IDE4NSAxMjAgMzQgMTU3IDYwIDgxIDkzIDkyIDE3NyAxIDE0IDExMyAxODkgOTkgMTIyIAorMjAyIDk5IDE5MyAxMzYgMTE2IDEyMiA1MiAzMyA3IDY1IDMyIDM5IDE0MCAyOCA2IDk3IDEyNSAzNSAxMDcgMTg4IDg1IDEyNiAxMzUgCis5OCAxNzUgMTg5IDUwIDEyMSAxODQgMTE2IF4KKzQxMyAxIDEyNyAxNTMgNDUgMzIgMTY0IDEyMSAyMDMgNTggNTYgMTA4IDEzMCAxOTIgMTY2IDE2OCAxMjggMzkgMTg4IDUzIDEwMiA2OSAKKzE0OCAxNDEgMTggMTM5IDE5NyAxMDggOTcgMTMyIDc0IDI0IDE1NSA3MSA2MyA1OSA5NyAyMSAxOTQgMTgwIDYxIDQ1IDIwNCAxMzIgMjkgCiszMSA4NSA4OCAxODggMTY0IDE4NyAxMTggMzcgMTY3IDgyIDk0IDYwIDk4IDEgNDcgMTUyIDExMCAxNzIgODUgNTUgMTI4IDcyIDQzIAorMTE3IDQxIDQyIDExNiA2MSAxMiAxNDQgNDAgNjIgNTggMTE3IDE2OCAxNyAxNTkgMTM5IDE2NCA3NiA1IDE5MyAxMDEgNTYgMzAgMTA1IAorMzAgMTEgMTQzIDYwIDMyIDg2IDY4IDQxIDEzNiAzMSA0MCAxMjMgMTE4IDE4MSAxMzUgMTk1IDEyNyA1OSAxMzAgODEgNTMgMTQ3IDYyIAorMTMgMTI0IDk4IDM0IDc5IDM5IDQ5IDE0NSA1MyAxODAgOTQgMTA1IDkxIDcxIDIgMjcgNSA1NCAxOTMgNyAxNDEgNzkgMTk5IDg0IDc1IAorNzAgMTI4IDE5OSAxOTUgMTYwIDExOSAxNyAyMCA1NCAxMTUgMTg3IDE4NCAxMjkgMTQ2IDE5MyA0MCAyMDEgMTQzIDEzOCA1NyA0MyAxOCAKKzk0IDIwNCAzOCAxMTQgODAgMTc5IDExNCA0NyAxMTkgNTAgODAgMTE4IDgyIDE2MCAxNTIgNDkgMTEyIDE5OCA4OCAxNTUgMTA0IDk1IAorMTUxIDM2IDE5OSAxNjIgMTAwIDI3IDUwIDQ3IDg2IDE5NSAxNiAxNzkgODEgMTkyIDI3IDgzIDEwNyAxNTAgMTM0IDE5NCAxNDcgMSAKKzE1OCAzMiAxMzEgNjEgMTExIDExOSA4MyAxNDAgNSAyMSAxMzMgMTIwIDE3NCA3OCAyNiAxMzYgMTA5IDY1IDgwIDQwIDI5IDIwMyAyNSAKKzI0IDQ0IDE5MSAxNCAxNzAgNDMgMTYyIDM0IDE0MCA5OSAxNDEgMTEyIDU0IDE0OCA0MiA3MSA5NiAxMTkgMTYxIDE2NSAxNjcgMTQ4IAorMTg2IDExIDQgMTgwIDE4OCAxOTcgNDIgMTgyIDE4MSAxNjggNTAgMTQgMjYgMTAzIDQ5IDEgMTEzIDY3IDYxIDc4IDU5IDE5NiAxNzMgCiszMiA1MyA4IDE1NCAxNjkgMzAgNzIgMTc1IDE1MiAxNzYgODcgMzYgMTY2IDEwMiAzNiA4OCA3NyA3OSAxMzggMjQgMTg4IDEzMSAxMjcgCisyNiA3MCAxOTQgMTE0IDE0NiA2NiA5MyAxNTggOTMgMTkxIDEyNSA3OCA5MiA1MSA2MCAxNzYgMjYgNCA3NCAxMzUgMzUgMTIwIDEyOSAKKzExMyAxMzMgMTgxIDI5IDE3MCAxNzAgMTM3IDc3IDE5MCA0NiA0NSA3NyAxNTcgMTkxIDE4NiAxMzggMTg0IDE4IDYxIDE0NCAxNTEgCisxNzUgMTA3IDYgMTk0IDgxIDExNCAyIDEyNiAxNTcgOTcgNjYgMTU5IDczIDQ0IDk3IDk5IDE0IDEzNyAxMSA5OCA2NyAxMzkgMTAzIDE2IAorMTQ2IDIxIDEwMCA4OCAxMTAgMTM5IDI1IDE2OCAxODkgOTkgNDcgMTk3IDc1IDM3IDY4IDEwNyA1MSAxODcgMTUxIDY5IDU0IDQ5IDY3IAorMjggMTggMTcyIDUyIDIwMCA2NCAxMzMgNDIgMTQ5IDEyMSA3NiAxMTEgMTMgNTggMTgzIDgzIDE3MyA2NSAxMTMgMTAwIDEyMSAxNzAgCisyMDMgMTk3IDE2OSAxNTcgMTkgMjAyIF4KKzQzNCAxIDE5MyAxMTQgMTkwIDI2IDkyIDE0NSAxNzcgMTU1IDEyNSAxNDYgMzUgMjAwIDEyNCA0OCAyMSA0NiA4OSA0MCAxNTMgMTc4IAorNjIgNjUgMTk2IDg2IDE3NSA5MCA4MCA4OSA5OCAyMyAxNjkgNCA4OCAzMiAxMzUgMTM3IDI2IDc1IDExIDgxIDE3MiAzNCAxNTEgMTMwIAorMTA4IDEwNCAzNCAyMDAgMTgyIDgzIDEyIDE5NiAxMTIgODQgMjAyIDk3IDIwNiA2MCA3NSA2OSAxNTkgMTYzIDE5IDEzMSAxNzQgMTU3IAorNjYgMTc4IDE5NSAxMDQgNjYgMTYxIDEwNCA4IDEyNiA3MCA2NiAxMDMgMjYgMTcgMTQxIDkwIDIyIDU0IDY0IDM4IDE0NiAxNjggMzkgCis3MCAxOTkgMTQyIDE0NyA5MiA3MCA4IDI1IDM1IDc1IDE2MSAzIDEzOCA5MiAxMjggNDMgNTkgMTg1IDU1IDIwNSA5NSAxMDAgNzEgMTIzIAorMTczIDQyIDEyNiAxMjggMTQ0IDk0IDE3NiAyMDUgMjAgMTM5IDE0OSAxOTggNTkgMTY4IDE3MiAxMDkgMTEyIDkgMzMgMTAgNzMgMTU0IAorMzYgMTE1IDk3IDEzMSA5OSAxOTYgMTQ0IDQ1IDgxIDIyIDExMiAxNDIgNzIgMTMxIDE0OCA4MyAxNjIgMTYxIDc4IDE0MiAxNCA1MyAKKzE1NyAxNDEgMTM5IDc0IDI5IDE4MCAzNSA1OCAyNyAxMTUgMTk4IDEgOTAgMTM4IDE2NyA4OSAxNzMgMTkyIDQ4IDEzNyAxNTkgMTE0IAorMTMyIDE1NiA1OCAxNjAgMTU0IDY4IDc2IDE5IDU2IDUgNzAgMTQxIDY0IDExMyAxNTAgNDcgMTI5IDE4NCA3MyA5NiAxNjYgMTI0IDE1NSAKKzE1MSA1NSAxNDcgMTcgMTA5IDg2IDEwMCAxMjkgMjAxIDE2NCAxOTIgMTQ5IDcgMTkzIDU2IDExMiAyMDAgMTA3IDEyMiAxMzMgNjMgCisyMDYgMiA0MCA3OCA5IDE4MyAxNDAgODIgNCAxMyA3MSA0OCA0IDE2MyAyMDEgNTcgNjIgMTQwIDE1NyA4IDEwMCAyMDQgMTYyIDg2IAorMTE3IDEyIDg5IDE0NyA3NSAxNDQgMTIwIDg1IDEwOSAzNyA0OCAxNTQgODUgMiAxMTUgMzkgOTYgMTA4IDQ2IDE2NCAxIDMyIDEwMyAKKzE3NiAxNDcgMTUwIDEwNSAyMDcgMTAgMTUgMTE5IDIgMTczIDExNyA4NyA1MCA2OSA1MCAyMDIgMzkgMTcxIDY5IDEzMyA4OSA3MiAxMTQgCis1NyAxOTUgMTc5IDcwIDgzIDI5IDEyMiA2NyA4NSAxMzUgMTExIDE2MCAxNzEgMjAyIDE3MiAyIDE0NyAxODMgMzMgMTYwIDM4IDE2MyAKKzUxIDkyIDUzIDgyIDEzNyA1MiAxNDkgMTIzIDk4IDgxIDM5IDM4IDMwIDU1IDE0IDE4NiAxOTYgMTEgNiAzIDE1NSAxOCAxNiAyNiAxNTAgCisxODAgMTY4IDk3IDE0OCAyNSA4NCAxMjcgMTM2IDExOSAxMzUgNCAzMCAxNjIgMTQ0IDE5NSA0NiAzMSAxNzAgMTE5IDI4IDM5IDIxIAorMTA0IDE2NyAzMSA5NSAxNTggMTA2IDExNCAxMTUgNjUgMTcwIDEyIDYzIDczIDE3MSAxMjcgMyA4MCA1NyAxMzcgMTAxIDM2IDk4IDYgCis3OCAxMTYgMTA1IDE0OSAxNDAgMjQgMTc3IDIyIDEyOSA2OCAxNjggNzEgNzQgNzggNjcgMTAgMTc0IDI0IDI3IDU3IDEyMCAxMCAxNDggCisxNTggMTIzIDQwIDMgNSA1MyA3IDE3NiAxMzAgNTkgNTIgMTYgODQgMjAgNiAxMTAgNzcgMTkyIDc0IDQ2IDEwNiAxMzEgNDEgMTE4IAorMTUzIDE0NCBeCis0MzggMSA5OSAxODQgNjEgMTUgODUgMTM2IDU5IDEwMCAxNzIgMzcgMTgyIDk4IDk1IDc4IDQ0IDE3MyAzMCAyMDQgOTQgMTU2IDIwNiAKKzEyMyAxNjEgMTIwIDk2IDEzMiAxIDM3IDEzNCAxNDQgMTM0IDEyNiAxNjAgMTgwIDIxIDEzNiAyMDMgMTE5IDU1IDE1NiA0NCA3NyAxMjIgCis3MiAxOTAgMTI1IDEwIDEwNSAyNSAxMjggNzUgOTMgNjcgMTMgMjA1IDE5NiAxNCAzMSAxNzkgMTQyIDIwNiA3NSAyMDcgMTU5IDkxIDM4IAorOCAyOCA2NiA0MyAxNTAgMTg1IDE5MyA2MyAxMzUgNSAxNDMgOTggMTQzIDMyIDUgMTI1IDEyNCAxOTcgMTAzIDE0IDk3IDEwNyAxMDIgCis4NyAzIDE4IDE4NSA5NyAxNTUgNTYgNDggMTY1IDExMiAxNzggMTA2IDEzIDE1NyAzMiA1MyA3OSA4NSAxNDkgMTk3IDcgMTA2IDE3NSAKKzIwMyA3MSAxMDEgMTk1IDkyIDE5MyAxMjkgMTE2IDEyMiAyNCAyNiA3IDU4IDExIDMyIDExOSA3IDIwMiA4MyAxMjUgMjggNzkgMTgxIAorNTcgMTE5IDEyMSA4NCAxNjEgMTY4IDUwIDkzIDE2MyAxMzEgMTI3IDE1MyA0NSAxNyAxNDQgMTIxIDE5OCA0MyAzNiA5MyAxMTUgMTc3IAorMTY2IDE0OCAxMDggMjQgMTg4IDUzIDk3IDU5IDE0OCAxMjYgMjA4IDEzNCAxOTIgODggODcgMTEyIDY0IDE0IDE0NSA2MSA2MyAzOSA5NyAKKzExIDE5NCAxNjUgNDYgNDAgMTk5IDEzMiAxOSAxMSA4MCA3MyAxNzggMTU0IDE3NyAxMTggMzcgMTQ3IDcyIDk0IDYwIDg4IDIwMSA0NyAKKzE0MiAxMTAgMTY3IDc1IDQ1IDExMyA1MiA0MyAxMDIgMjEgMjIgMTExIDQxIDEyIDEzNCAzMCA0MiA0OCAxMTcgMTU4IDcgMTU0IDEyOSAKKzE2NCA3NiAxOTUgMTg4IDEwMSA1MSAyMCAxMDAgMTAgMjAxIDE0MyA1MCAzMiA3MSA1MyAzMSAxMzEgMzEgMzUgMTIzIDExMyAxNjYgCisxMzUgMTgwIDExNyA0NCAxMjUgNzYgMzMgMTQyIDYyIDMgMTE0IDkzIDE5IDU5IDM0IDM0IDEzMCAzOCAxNzAgNzQgMTA1IDkxIDU2IAorMTkyIDI3IDIwNSAzNCAxNzggMjAyIDEzMSA3OSAxOTkgODQgNjUgNTAgMTI4IDE4OSAxODUgMTQ1IDEwOSAxNyA0OSAxMDUgMTg3IDE3NCAKKzExNCAxNDEgMTgzIDIwIDE5NiAxMjggMTIzIDQ3IDI4IDE4IDg5IDE4OSAyMyA5OSA3MCAxNzkgOTQgNDIgMTE0IDQ1IDY1IDk4IDgyIAorMTUwIDEzNyAyOSAxMDIgMTgzIDY4IDE1MCA4OSA3NSAxNDEgMjEgMTg0IDE1NyA4MCA3IDQwIDM3IDg2IDE5MCAxNiAxNzQgNjYgMTg3IAorMTIgNjggMTAyIDEzNSAxMTQgMTg5IDEzNyAxOTEgMTQ4IDEyIDExNiA1NiA5NiAxMTkgNzMgMTMwIDIwMCA2IDExMyAxMDAgMTU0IDYzIAorMjYgMTE2IDEwNCA1MCA4MCAyNSAxNCAxOTMgMTUgMjQgNDQgMTkxIDQgMTUwIDIzIDE0NyAyNCAxNDAgOTkgMTM2IDEwNyA1NCAxMzMgCis0MiA2NiA5MSAxMDQgMTQ2IDE0NSAxNTcgMTI4IDE3MSAxIDE5OSAxODAgMTgzIDE4MiAzMiAxNjcgMTcxIDE2MyAzNSA5IDIxIDg4IDM5IAorMSAxMDMgNjIgNTEgNjggNTQgMTgxIDE1MyAyNyA0MyAxOTggMTM5IDE1NCAxNSA3MiAxNTUgMTUyIDE2NiA4NyAxNiAxNTYgOTIgMzEgCis4MyA3NyA3NCAxMTggMTkgMTczIDEyNiAyMDIgXgorNDMxIDAgMTAgNTQgMTc4IDEwNiAxMTQgMzQgODUgMTUwIDkzIDE3NSA5MyA3MCA3NiAyNyAzNiAxNTIgMjA3IDQgNDIgMTAzIDMgMTIwIAorOTcgMTEzIDEwOSAxODEgMjEwIDE2MiAxNTQgMTI5IDYxIDE2NiAzOCAxMyA1MyAxNDEgMTgzIDE4NiAxMzggMTg0IDEwIDYxIDExMiAKKzExOSAxNzUgMTA3IDYgMTcwIDgxIDExNCAyMDcgMTAyIDEyNSA2NSA1MCAxMzUgNzMgMjggNzMgNzUgMjAzIDExMyAxMSA5OCAzNSAxMTUgCis3MSA4IDE0NiAyMDIgNzYgODggMTAyIDEzOSAxIDE0NCAxODkgODMgMTUgMTgxIDUxIDEzIDYwIDc1IDUxIDE3OSAxNDMgMzcgMzAgNDkgCis1MSAyMCAyMDcgMTU2IDQ0IDE4NCA2NCAxMjUgMTggMTMzIDk3IDUyIDExMSAxOTQgNTggMTY3IDc1IDE0OSA0OSAxMDUgODQgMTEzIAorMTcwIDE3OSAxOTcgMTY5IDE0OSAyMDggNDEgMTc4IDk5IDE4MCAyMSA5MiAxNDUgMTcyIDE1NSAxMDUgMTMxIDMwIDIwOCAyMDAgMTE0IAorNDggMjEgMzEgNzkgNDAgMTQ4IDE3OCA1MiA1MCAxOTYgNzEgMTYwIDgwIDcwIDY5IDkzIDIzIDE1OSAyMDIgODMgMjIgMTE1IDEzMiA2IAorNjUgMjA5IDcxIDE2NyAxNCAxNTEgMTMwIDk4IDg5IDM0IDE5MCAxNjcgNjggMiAxODEgMTEyIDc5IDE5MiA4MiAxOTEgNDUgNTUgNDkgCisxNTkgMTQ4IDE5IDExNiAxNjkgMTQyIDYxIDE3MyAxODUgOTQgNDYgMTQ2IDEwNCAyMDYgMTI2IDU1IDU2IDkzIDE2IDEyIDEyMSA5MCAKKzE3IDQ5IDQ0IDE4IDEyNiAxNjMgMzkgNTAgMTg5IDEzNyAxNDcgODcgNjUgMyA1IDM1IDc1IDE1NiAxOTYgMTE4IDc3IDExOCAyMyA1NCAKKzE4NSA0MCAxOTUgOTUgOTAgNzEgMTEzIDE2MyAzMiAxMTYgMTA4IDE0NCA3NCAxNjYgMTkwIDE1IDEzNCAxMzQgMTg4IDM5IDE1OCAxNzIgCis5NCAxMDcgMjEyIDIzIDUzIDEzNCAzNiAxMDUgNzcgMTExIDg5IDE4NiAxMjQgMzUgNjEgNyAxMDIgMTMyIDY3IDEzMSAxMjggNzggMTYyIAorMTYxIDYzIDE0MiAxNCA0MyAxNDcgMTQxIDEyOSA1NCAxOSAxNzAgMjAgNDggNyA5NSAxOTggMTk5IDcwIDEyMyAxNTcgNzQgMTczIDE5MiAKKzI4IDEyNyAxMzkgMTA5IDEyNyAxNDYgNDMgMTQwIDEzOSA0OCA2MSAxNCAzNiA2MCAxMzYgNDkgOTggMTUwIDMyIDEwOSAxNzQgNjMgODEgCisxNjEgMTI0IDE0MCAxNDYgNTAgMTQyIDcgMTA5IDY2IDgwIDEyNCAyMDEgMTQ0IDE4MiAxNDkgMiAxODggNDYgOTIgMTg1IDg3IDExMiAKKzEzMyA0MyAyMDEgMjA1IDM1IDY4IDkgMTgzIDEyNSA3MiAxOTcgMyA2NiAzMyAyMDcgMTYzIDE5MSA1MiA1NyAxMzAgMTUyIDggODUgCisyMDQgMTU3IDgxIDEwNyAyMDUgODkgMTMyIDYwIDEyOSAxMTUgODUgODkgMjcgNDMgMTU0IDc1IDIxMCAxMTUgMjQgOTEgMTA4IDM2IAorMTU5IDIwOSAxNyAxMDMgMTc2IDEzNyAxNDAgODUgMTk3IDEwIDExNCAyMDAgMTY4IDExMiA3MiA0NSA2OSAxOTggNDAgMjAyIDI5IDE3MSAKKzY0IDExOCA4NCA1MiAxMDQgNDcgMTkwIDE3NCA3MCA4MyAyOSAxMTcgNjcgNzAgMTMwIDkxIDE1NSAxNjYgMTk3IDE2MiAyIDEyNyAxOTMgCisxNzMgODIgXgorNDY0IDEgMTYwIDMxIDE0OSAyMyA2NCAzMiA2MSAxMDkgNDUgMTIxIDEwMiA3NyA3NCAzMiAzOCAxNiA1NSA3IDE3MiAxODkgMTk4IDIwMCAKKzIxMSAxNDEgMTEgMiA1IDE0MyAxNTkgMTQ3IDkwIDEzNCAyNSA3MCAxMDYgMTIyIDEwNSAxMTQgMjEyIDMwIDE0MSAxMzAgMTk1IDM5IAorMjQgMTYzIDkxIDI4IDExIDcgNzYgMTY3IDE3IDgxIDEzNyA4NSA4NiA5NCA2NSAxNDkgNSA0MiA2NiAxNTcgMTEzIDIwNCA1OSA1NyAKKzEzNyA4MCAxNSA3MCAyMDcgNzggOTUgOTEgMTQyIDEzMyAxNyAxNzcgMjIgMTI5IDY4IDE2OCA0MyA3NCA1MCA2MCAxOTcgMTc0IDMgMTMgCiszNiAxMDYgMyAxMjcgMTU4IDExNiAyNiAxOTcgMTkyIDI1IDE5NCAxNTUgMTAyIDU5IDUyIDIwMyA1NiAyMCAyMTQgODIgNDkgMTcxIDY3IAorNDYgMTA2IDExNyAzNCA5MCAxMzkgOTYgOTQgMTc5IDU2IDE1IDY1IDEzNiA1NCAxMDAgMTU3IDE3IDE4MiA5MyA3NSA2MyAyNCAxNjggCisyNSAxODkgODQgMTU2IDIwMSAxMTggMTU2IDEwNSA5NiAxMTIgMjAxIDIyIDEzNCAxMzkgMTE0IDExNiAxNDUgMTc1IDExIDEyMSAxOTggCis5OSA0MCAxNTEgMzQgNzIgMTE3IDUyIDE5MCAxMDUgOTAgMjAgMTE4IDYwIDgzIDUyIDIwOCAyMDUgMTgxIDIwOSAxNiAxNzQgMTIyIAorMjA2IDcwIDIwMiAxNDQgNzEgMTggMjA4IDggNjYgMzggMTM1IDE3MCAxNzggNTMgMTE1IDUgMTM4IDg4IDEyMyAxNyAyMDAgMTE1IDExOSAKKzE4MiA5OCA5IDg3IDk3IDEwMiA3MiAzIDggMTgwIDgyIDE0NSA1NiAzMyAxNjUgMTAyIDE3MyA5NiAyMTMgMTU3IDEyIDMzIDY5IDgwIAorMTI5IDE5MiAyIDEwMSAxNjUgMjAzIDUxIDg2IDE5MCA4NyAxOTMgMTI0IDExNiAxMjIgNCAyMSA3IDUzIDIxMSAyNyAxMDQgMjA3IDE5NyAKKzczIDEyNSAyMyA1OSAxNzYgMzcgMTE0IDExMSA3NCAxNTEgMTUzIDUwIDczIDE0OCAxMTYgMTI3IDE1MyA0NSAyIDEyNCAxMjEgMTkzIAorMjggMTYgNzggMTAwIDE2MiAxNjYgMTI4IDg4IDkgMTg4IDUzIDkyIDQ5IDE0OCAxMTEgMTkzIDEyOSAxODcgNjggNzcgOTIgNTQgNCAKKzEzNSA1MSA2MyAxOSA5NyAxIDE5NCAxNTAgMzEgMzUgMTk0IDEzMiA5IDIwNiA3NSA1OCAxNjggMTQ0IDE2NyAxMTggMzcgMTI3IDYyIAorOTQgNjAgNzggMTk2IDQ3IDEzMiAxMTAgMTYyIDY1IDM1IDk4IDMyIDQzIDg3IDEgMiAxMDYgMjEgMTIgMTI0IDIwIDIyIDM4IDExNyAKKzE0OCAyMTIgMTQ5IDExOSAxNjQgNzYgMTgwIDE4MyAxMDEgNDYgMTAgOTUgMjA1IDE4NiAxNDMgNDAgMzIgNTYgMzggMjEgMTI2IDMxIAorMzAgMTIzIDEwOCAxNTEgMTM1IDE2NSAxMDcgMjkgMTIwIDcxIDEzIDEzNyA2MiAyMDggMTA0IDg4IDQgMzkgMjkgMTkgMTE1IDIzIDE2MCAKKzU0IDEwNSA5MSA0MSAxNzcgMjcgMjAwIDE0IDE2MyAxOTIgMTIxIDc5IDE5OSA4NCA1NSAzMCAxMjggMTc5IDE3NSAxMzAgOTkgMTcgCisxOTUgNDQgOTUgMTg3IDE2NCA5OSAxMzYgMTczIDE5MSAxMTMgMTA4IDM3IDEzIDE4IDg0IDE3NCA4IDg0IDYwIDE3OSA3NCAzNyAxMDkgCis0MCA1MCA3OCA4MiAxNDAgMTIyIDkgOTIgMTY4IDQ4IDE0NSA3NCA1NSAxMzEgNiAxNjkgMTUyIDYwIDIwMiAzMCAyNyA4NiAxODUgMTYgCisxNjkgNTEgMTgyIDIxMiA1MyA5NyAxODUgXgorNDUyIDEgODIgMTgxIDEyMSAxNjcgMTMyIDE5OCA5MiA0OCA3MiAxMTkgNTcgMTE0IDE4NCAyMDAgODEgNjggMTIyIDM5IDI2IDg0IDk2IAorMjYgODAgMSAyMDggMTc3IDIxNyAyNCA0NCAxOTEgMjA2IDExOCAyMDkgMTIzIDggMTQwIDk5IDEyOCA5OSA1NCAxMDkgNDIgNTggODMgCis4MCAxMjIgMTEzIDE0MSA5NiAxNDcgMjAzIDE4MyAxODAgMTc1IDE1OCAxNiAxNDMgMTU1IDE1NSAxMSAxIDEzIDY0IDIzIDEgODcgNTQgCiszNSA1MiA0NiAxNTcgMTIxIDE5IDI3IDE3NCAxMTUgMTMwIDIwOSA3MiAxMjMgMTUyIDE1MCA4NyAyMDIgMTQwIDc2IDIzIDc1IDc3IDY2IAorODYgMTEgMTQ5IDExOCA4OCA0NCAxNjggMTAxIDk0IDE0IDgwIDE0NSA5MyAxNjUgNzMgNjUgNjYgMTIgMjEgMTM3IDE5MiA0IDIyIDgzIAorMjAxIDEyMCA3NyAxMTMgOTQgMTgxIDE5NSAxNTcgMTQ0IDEyNCA1MSAxNTEgMzMgMjExIDM4IDEzMSAxNzggMTg2IDEzOCAxODQgNSA2MSAKKzkyIDk5IDE3NSAxMDcgNiAxNTUgODEgMTE0IDIwNyA4NyAxMDUgNDUgNDAgMTIwIDczIDE4IDU4IDYwIDE5MyA5OCAxMSA5OCAxNSAxMDAgCis1MSAzIDE0NiAxODcgNjEgODggOTcgMTM5IDIwNCAxMjkgMTg5IDczIDIxMyAxNzEgMzYgMjE2IDU1IDU1IDUxIDE3NCAxMzggMTcgMTUgCis0OSA0MSAxNSAxOTcgMTQ2IDM5IDE3NCA2NCAxMjAgMyAxMjMgODIgMzcgMTExIDE3OSA1OCAxNTcgNzAgMTM0IDM5IDEwMCA3NCAxMDggCisxNzAgMTY0IDE5NyAxNjkgMTQ0IDE5OCA0MSAxNjMgODQgMTcwIDE2IDkyIDE0NSAxNjcgMTU1IDg1IDExNiAyNSAyMDggMjAwIDEwNCAKKzQ4IDIxIDE2IDY5IDQwIDE0MyAxNzggNDIgMzUgMTk2IDU2IDE0NSA3MCA2MCA0OSA4OCAyMyAxNDkgMTkyIDc4IDEyIDk1IDEyNyAyMDQgCis1NSAxOTkgNjEgMTYyIDIxMiAxNTEgMTMwIDg4IDc0IDM0IDE4MCAxNTIgNTMgMjEwIDE2NiAxMTIgNzQgMTgyIDY3IDE3NiAzMCAzNSAKKzI5IDE1OSAxMzMgMTkgMTAxIDE2NCAxMjcgNTYgMTY4IDE3NSA4NCAyNiAxMzEgMTA0IDE5NiAxMjYgNDAgNDYgODMgNiA3IDEwMSA5MCAKKzEyIDQ0IDI0IDIxNiAxMDYgMTU4IDM5IDMwIDE3OSAxMzIgMTQ3IDgyIDYwIDIxNiAyMDMgMzUgNzUgMTUxIDE4MSA5OCA2MiAxMDggMyAKKzQ5IDE4NSAyNSAxODUgOTUgODAgNzEgMTAzIDE1MyAyMiAxMDYgODggMTQ0IDU0IDE1NiAxNzUgMTAgMTI5IDExOSAxNzggMTkgMTQ4IAorMTcyIDc5IDEwMiAyMDcgMTMgMjA4IDMzIDExNCAzNiA5NSA1NyA5MSA3OSAxNzYgMTA0IDI1IDQxIDIxMCA5MiAxMjIgNjIgMTMxIDEwOCAKKzczIDE2MiAxNjEgNDggMTQyIDE0IDMzIDEzNyAxNDEgMTE5IDM0IDkgMTYwIDUgMzggMjA1IDc1IDE5OCAxODkgNTAgMTA4IDE0NyA1OSAKKzE3MyAxOTIgOCAxMTcgMTE5IDEwNCAxMjIgMTM2IDI4IDEyMCAxMjQgMjggNDYgOSAxNiAyMTMgNTAgMTMxIDM0IDgzIDE1MCAxNyA4OSAKKzE2NCA1MyA2NiAxNTYgMTI0IDEyNSAxNDEgNDUgMTM3IDIxNSAxMDkgNDYgNjAgMTE5IDIwMSAxMjQgMTcyIDE0OSAyMTUgMTgzIDM2IAorNzIgMTcwIDY3IDEwMiAxMzMgMjMgMTk2IDIwMCAzMCA1OCA5IDE4MyAxMTAgNjIgMTgyIDIxMSA2MSAxOCAyMDIgMTYzIDk3IF4KKzQ2MyAxIDQ1IDUwIDExNiAxNDUgOCA2NCAyMDQgMTUwIDc0IDkzIDE4NCA4OSAxMTEgMzkgMTA4IDEwOCA4NSA2MSAxMyAzNiAxNTQgNjEgCisyMTAgMTE1IDMgODQgMTA4IDIyIDE1MiAyMDkgMjE2IDEwMyAxNzYgMTIzIDEyNiA1NyAxODMgMTAgMTk5IDEwNyAxODYgMTYxIDEwNSAKKzUxIDM4IDY5IDE4NCAyNiAyMDIgMTUgMTcxIDU3IDk3IDc3IDI0IDkwIDMzIDE4MyAxNjcgNzAgODMgMjkgMTEwIDY3IDQ5IDEyMyA2MyAKKzE0OCAxNTkgMTkwIDE0OCAyIDk5IDE3MiAxNTkgMzMgMTYwIDI2IDEzOSAzIDQ0IDE3IDQ2IDg5IDQwIDEwMSA4NyA2MiA2OSAyNyAzOCAKKzYgNTUgMiAxNjIgMTg0IDE4MyAxOTAgMjExIDEzMSA2IDIxMiAyMTAgMTM4IDE0NCAxMzIgODUgMTI0IDI1IDYwIDkxIDExMiA5NSA5OSAKKzIxMiAzMCAxMjYgMTIwIDE5NSAzNCAxOSAxNTggNzEgMjggMjExIDIxNyA1NiAxNjcgNyA3MSAxMjIgNzAgNjYgNzkgNjUgMTM0IDI3IAorNjEgMTQ3IDEwMyAxOTkgNDQgNTcgMTM3IDY1IDUwIDIwMiA3OCA4MCA4MSAxMzcgMTI4IDEyIDE3NyAyMiAxMjkgNjggMTY4IDIzIDc0IAorMzAgNTUgMTgyIDE3NCAyMDggMyAyMSA5NiAyMTggMTEyIDE1OCAxMTEgMTYgMTg3IDE3NyA1IDE3OSAxNDAgODIgNTkgNTIgMTg4IDM2IAorMjAgMjE0IDYyIDI5IDE1NiA2MiA0NiAxMDYgMTA3IDI5IDcwIDEyOSA5MSA4OSAxNzQgNTEgMTUgNDUgMTM2IDQ5IDEwMCAxNDIgMjE3IAorMTgyIDg4IDU1IDQ4IDQgMTYzIDIwIDE3NCA3NCAxNTYgMTk2IDExMyAxNTEgOTAgOTYgOTIgMTkxIDcgMTM0IDEzNCA5NCAxMDYgMTMwIAorMTcwIDEgMTA2IDE5MyA3OSAyNSAxNDYgMjQgNjcgMTEyIDMyIDE5MCA4NSAyMTAgNzUgMTUgMTA4IDQ1IDczIDM3IDE5MyAyMDUgMTY2IAorMTk0IDEgMTY5IDEwMiAyMDYgNjUgMTk3IDEyOSA1MSAyMTggMTk4IDIwOCA2NiAzMyAxMjAgMTU1IDE2MyA0MyA5NSA1IDEzMyA3OCAKKzEwMyAyIDE4NSAxMDUgMTE0IDE2NyA5MyA0IDc3IDg3IDEwMiA1NyAzIDIxOCAxNzUgNjcgMTM1IDU2IDE4IDE2NSA5MiAxNjggODYgCisyMDMgMTU3IDIxMiAxMyA1OSA3NSAxMDkgMTg3IDIxNyA5NiAxNTUgMjAzIDMxIDcxIDE4NSA4MiAxOTMgMTE5IDExNiAxMjIgMjA0IDE2IAorNyA0OCAyMDEgMjIgODkgMTk3IDE5MiA2MyAxMjUgMTggMzkgMTcxIDE3IDEwOSAxMDEgNjQgMTQxIDEzOCA1MCA1MyAxMzMgMTAxIDEyNyAKKzE1MyA0NSAyMDcgMTA0IDEyMSAxODggMTMgMjE2IDYzIDg1IDE0NyAxNjYgMTA4IDY4IDIxNCAxODggNTMgODcgMzkgMTQ4IDk2IDE3OCAKKzEyNCAxODIgNDggNjcgNzIgNDQgMjE0IDEyNSA0MSA2MyAyMTkgOTcgMjExIDE5NCAxMzUgMTYgMzAgMTg5IDEzMiAyMTkgMTkxIDcwIAorNDMgMTU4IDEzNCAxNTcgMTE4IDM3IDEwNyA1MiA5NCA2MCA2OCAxOTEgNDcgMTIyIDExMCAxNTcgNTUgMjUgODMgMTIgNDMgNzIgMjAxIAorMjAyIDEwMSAxIDEyIDExNCAxMCAyIDI4IDExNyAxMzggMjA3IDE0NCAxMDkgMTY0IDc2IDE2NSAxNzggMTAxIDQxIDkwIDE5MCAxNzEgCisxNDMgMzAgMzIgNDEgMjMgMTEgMTIxIDMxIDI1IDEyMyAxMDMgMTM2IDEzNSAxNTAgOTcgMTQgMTE1IDY2IDIxMyAxMzIgNjIgMjAzIDk0IAorODMgMjA5IDE5IDI0IDQgMTAwIDggMTUwIDE2MCBeCis0NzQgMCAxMDUgOTEgMjAgMTU2IDI3IDE5MyAyMDggMTQyIDE3OCAxMDcgNzkgMTk5IDg0IDQxIDIgMTI4IDE2NSAxNjEgMTA5IDg1IDE3IAorMTc0IDM3IDgxIDE4NyAxNTAgNzggMTI5IDE1OSAxOTQgMTg0IDkyIDg3IDIzIDIxNCAxOCA3NyAxNTMgMjA5IDYzIDQ2IDE3OSA0NiAzMCAKKzEwMiAzMyAyOSA1MCA4MiAxMjYgMTAxIDIwMyA3OCAxNDcgMjAgMTM4IDUzIDI3IDExNyAyMDcgMTQ4IDE0NSAzMiAxODEgMTYgMTMgODYgCisxNzggMTYgMTYyIDMwIDE3NSAxOTggMzIgOTAgOTkgNjYgMTc3IDExMyAxNTUgMTI0IDE4NiA4MCA0NCA2MCAxMTkgNDkgMTA2IDE3NiAKKzE5MiA2NSA1MiAxMDYgMjcgMjYgNjggOTIgMTQgODAgMjExIDIwMCAxNjkgMjEzIDI0IDQ0IDE5MSAyMDIgMTAyIDE5NyAxMTEgMTQwIAorOTkgMTI0IDk1IDU0IDk3IDQyIDU0IDc5IDY4IDExMCA5NyAxMzMgODAgMTM1IDE5OSAxNzUgMTgwIDE3MSAxNDYgOCAxMzEgMTQ3IDE1MSAKKzIyMSAyMTkgOSA1MiAxNSAxIDc5IDUwIDI3IDQ0IDQyIDE0NSAxMDUgMTUgMTkgMTYyIDEwMyAxMTggMjAxIDcyIDEwNyAxNTIgMTQyIAorODcgMTkwIDEzMiA2OCAxOSA3MSA3NyA2MiA3MCA3IDEzNyAxMTQgNzYgMjE0IDM2IDE2MCA5NyA3OCAyMjAgNzYgMTQxIDkzIDE1NyA1NyAKKzYxIDU4IDkgMTI1IDE4MCA0IDYgNjcgMTg5IDEyMCA2MSAxMTMgODIgMTgxIDE4MyAxNTMgMTM2IDEyMCA0MyAxMzkgMjkgMTk5IDI2IAorMTIzIDE3NCAxODYgMTM4IDE4NCAxIDYxIDc2IDgzIDE3NSAxMDcgNiAxNDMgODEgMTE0IDIwNyA3NSA4OSAyOSAzMiAxMDggNzMgMTAgCis0NiA0OCAxODUgODYgMTEgOTggMjIxIDg4IDM1IDIyMSAxNDYgMTc1IDQ5IDg4IDkzIDEzOSAxOTYgMTE3IDE4OSA2NSAyMDEgMTYzIDI0IAorMjA4IDUxIDM5IDUxIDE3MCAxMzQgMSAzIDQ5IDMzIDExIDE4OSAxMzggMzUgMTY2IDY0IDExNiAyMTMgMTE1IDcwIDI1IDExMSAxNjcgCis1OCAxNDkgNjYgMTIyIDMxIDk2IDY2IDEwNCAxNzAgMTUyIDE5NyAxNjkgMTQwIDE5MCA0MSAxNTEgNzIgMTYyIDEyIDkyIDE0NSAxNjMgCisxNTUgNjkgMTA0IDIxIDIwOCAyMDAgOTYgNDggMjEgNCA2MSA0MCAxMzkgMTc4IDM0IDIzIDE5NiA0NCAxMzMgNjIgNTIgMzMgODQgMjMgCisxNDEgMTg0IDc0IDQgNzkgMTIzIDE5MiA0NyAxOTEgNTMgMTU4IDIwMCAxNTEgMTMwIDgwIDYyIDM0IDE3MiAxNDAgNDEgMjA2IDE1NCAKKzExMiA3MCAxNzQgNTUgMTY0IDE4IDE5IDEzIDE1OSAxMjEgMTkgODkgMTYwIDExNSA1MiAxNjQgMTY3IDc2IDEwIDExOSAxMDQgMTg4IAorMTI2IDI4IDM4IDc1IDIyMCAzIDg1IDkwIDggNDAgOCAyMDQgOTAgMTU0IDM5IDE0IDE3MSAxMjggMTQ3IDc4IDU2IDIxNiAxOTEgMzUgCis3NSAxNDcgMTY5IDgyIDUwIDEwMCAyMDkgNDUgMTg1IDEzIDE3NyA5NSA3MiA3MSA5NSAxNDUgMTQgOTggNzIgMTQ0IDM4IDE0OCAxNjMgCis2IDEyNSAxMDcgMTcwIDMgMTQwIDE3MiA2NyA5OCAyMDMgNSAyMDQgMTcgOTggMzYgODcgNDEgNzUgNzEgMTY4IDg4IDE3IDI1IDIwMiAKKzg0IDExNCA1OCAxMzEgOTIgNjkgMTYyIDE2MSAzNiAxNDIgMTQgMjUgMTI5IDE0MSAxMTEgMTggMSAxNTIgMjE1IDMwIDE5MyA1OSAxOTggCisxODEgMzQgOTYgMTM5IDQ3IDE3MyAxOTIgMjE0IDEwOSAxMDMgMTAwIDExOCAxMjggMTYgMTA0IDExMiAxOTggXgorNDY2IDAgMjUgMiAyMTMgMjEzIDM2IDEyNCAxMyA2MiAxNTAgMjIxIDYxIDE1MCAzOSA0NSAxNDkgMTI0IDEwNCAxMzQgMzggMTMwIDIwOCAKKzEwOSAxOCAzMiAxMTIgMjAxIDk2IDE1OCAxNDkgMjE1IDE3NiAyMiA0NCAxNDkgMzkgODggMTMzIDIyMCAxODkgMTkzIDIzIDQ0IDkgCisxODMgODkgNDggMTYxIDIwNCA1NCAyMjIgMTk1IDE2MyAxNjcgNDAgNDUgMTA2IDE0MCA4IDQ5IDIwNCAxNDUgNjkgODMgMTY5IDg5IDk2IAorMjQgOTMgMTAzIDg1IDQxIDMgMzEgMTU0IDUxIDIxMCAxMTUgMjEzIDc5IDEwOCAxMiAxNDcgMjA5IDIwNiAxMDMgMTc2IDExMyAxMTYgCiszNyAxNzMgMTAgMTg5IDEwMiAxNzYgMTU2IDEwMCAzNiAzMyA2OSAxNzQgMTYgMjAyIDUgMTcxIDUyIDgyIDcyIDQgODAgMjMgMTc4IAorMTYyIDcwIDgzIDI5IDEwNSA2NyAzNCAxMTggNDMgMTQzIDE1NCAxODUgMTM4IDIgNzkgMTU3IDE0OSAzMyAxNjAgMjEgMTI5IDIwOCAyNCAKKzIgMzEgNjkgMzUgODEgNzIgNDcgNjQgMjIgMzggMjIxIDU1IDIyMiAxNTIgMTc5IDE2OCAxODAgMjExIDEyMSAxIDIwNyAyMDAgMTMzIAorMTI5IDExNyA4MCAxMTQgMjUgNTAgNzYgMTAyIDg1IDg0IDIxMiAzMCAxMTEgMTEwIDE5NSAyOSAxNCAxNTMgNTEgMjggMTk2IDIxMiAzNiAKKzE2NyAyMjIgNjEgMTA3IDU1IDQ2IDY0IDY1IDExOSAyMjAgMTIgNTYgMTM3IDkzIDE5NCAyOSA1NyAxMzcgNTAgMjEwIDMwIDE5NyA3OCAKKzY1IDcxIDEzMiAxMjMgNyAxNzcgMjIgMTI5IDY4IDE2OCAzIDc0IDEwIDUwIDE2NyAxNzQgMTk4IDIxOCA2IDg2IDIxOCA5NyAxNTggCisxMDYgNiAxNzcgMTYyIDIxMCAxNjQgMTI1IDYyIDU5IDUyIDE3MyAxNiAyMCAyMTQgNDIgOSAxNDEgNTcgNDYgMTA2IDk3IDI0IDUwIAorMTE5IDg2IDg0IDE2OSA0NiAxNSAyNSAxMzYgNDQgMTAwIDEyNyAyMDIgMTgyIDgzIDM1IDMzIDIwOSAxNTggMTUgMTU5IDY0IDE1NiAKKzE5MSAxMDggMTQ2IDc1IDk2IDcyIDE4MSAyMTcgMTM0IDEyOSA3NCA5NiAxMTUgMTY1IDIxNiA5MSAxODggNTkgMTAgMTQxIDE0IDYyIAorMTA3IDEyIDE5MCA2NSAyMDUgNjAgMTAgOTggMzAgNjMgMjIgMTc4IDIwNSAxNTEgMTc5IDIxMSAxNjQgODIgMjA2IDYwIDE5MiAxMTQgCiszMSAyMDMgMTg4IDE5MyA2NiAyOCAxMDUgMTQwIDE0OCAzMyA3NSA1IDEyOCA2OCA4MyAyMTIgMTcwIDk1IDEwOSAxNTIgODggMjI0IDY3IAorNzcgMTAyIDQyIDMgMjEzIDE3MCA1MiAxMjUgNTYgMyAxNjUgODIgMTYzIDc2IDE5MyAxNTcgMTk3IDIxOCA0OSA3MCA4OSAxODIgMjE3IAorOTEgMTQ1IDIwMyAxMSA1NiAxODAgNzcgMTkzIDExNCAxMTYgMTIyIDE4OSAxMSA3IDQzIDE5MSAxNyA3NCAxODcgMTg3IDUzIDEyNSAxMyAKKzE5IDE2NiAyMjIgMTA0IDkxIDU0IDEzMSAxMjMgNTAgMzMgMTE4IDg2IDEyNyAxNTMgNDUgMTk3IDg0IDEyMSAxODMgMjIzIDIwMSA0OCAKKzcwIDEzMiAxNjYgODggNDggMjA0IDE4OCA1MyA4MiAyOSAxNDggODEgMTYzIDExOSAxNzcgMjggNTcgNTIgMzQgMjA5IDExNSAzMSA2MyAKKzIwNCA5NyAyMDYgMTk0IDEyMCAxIDI1IDE4NCAxMzIgMjE0IDE3NiA2NSAyOCAxNDggMTI0IDE0NyAxMTggMzcgODcgNDIgOTQgNjAgNTggCisxODYgNDcgMTEyIDExMCAxNTIgNDUgMTUgNjggMjE3IDQzIDU3IDE4NiAxODcgMjE4IF4KKzQ3NyAxIDIwMCAxMiAxMDAgMjIzIDIwMSAxNCAxMTcgMTI0IDIwMCAxMzcgOTUgMTY0IDc2IDE0NCAxNzEgMTAxIDM0IDIxMyA4MyAxNjkgCisxNTAgMTQzIDE2IDMyIDIwIDIgMjI0IDExNCAzMSAxOCAxMjMgOTYgMTE1IDEzNSAxMjkgODMgMjIwIDEwOCA1OSAxOTIgMTI1IDYyIAorMTk2IDgwIDc2IDE5NSAyMTggMTcgMjEwIDc5IDIxNCAxMzYgNiAxMDUgOTEgNSAxNDEgMjcgMTg4IDE5MyAxMjcgMTY4IDk3IDc5IDE5OSAKKzg0IDMxIDIwOSAxMjggMTU1IDE1MSA5NCA3NSAxNyAxNTkgMzIgNzEgMTg3IDE0MCA2MyAxMjQgMTQ5IDE3OSAxNzkgNzcgNzIgMTMgCisyMDQgMTggNzIgMTM4IDE5OSA0OCAzNiAxNzkgMjYgMjUgOTcgMjggMTQgMzAgODIgMTE2IDg2IDE4OCA2OCAxMzIgMTMzIDM4IDcgMTA3IAorMTk3IDEzMyAxNDAgMTIgMTY2IDYgMyA4NiAxNzMgMTYgMTU3IDE1IDE3MCAxODggMTcgODUgODQgNDYgMTcyIDEwMyAxNDAgMTE0IDE3MSAKKzY1IDM5IDQ1IDExOSAzOSA5NiAxNjYgMTgyIDQ1IDMyIDg2IDEyIDI2IDQ4IDg3IDIyNiA4MCAyMDEgMTkwIDE1OSAyMDggMjQgNDQgCisxOTEgMTk3IDgyIDE4MiA5NiAyMTcgMTQwIDk5IDExOSA5MCA1NCA4MiA0MiA0OSA3NCA1MyA5NSA3NyAxMjMgNjAgMTIwIDE5NCAxNjUgCisxODAgMTY2IDEzMSAyMjUgMTE2IDEzNyAxNDYgMjExIDIxOSA0IDM3IDUgMSA2OSA0NSAxNyAzNCAzNyAxMzAgODUgMTAgOSAxNDcgODggCisxMDMgMTkxIDcyIDg3IDE1MiAxMzIgODcgMTc1IDEyMiA1OCAxNCA2NiA3NyA1NyA1MCAyIDEyMiAxMDkgNjEgMjA5IDI2IDE1MCA5MiAKKzU4IDIwNSA3MSAxMzYgOTMgMTQ3IDM3IDU2IDQ4IDIxMiAyMjEgMTEwIDE2NSA0IDIxMyA0NyAxNzQgMTIwIDQxIDExMyA2NyAxODEgCisxNjggMTQ4IDEyNiAxMTUgMzMgMTI0IDI0IDE4NCAxMSAxMTMgMTY5IDE4NiAxMzggMTg0IDIyMyA2MSA1NiA2MyAxNzUgMTA3IDYgMTI4IAorODEgMTE0IDIwNyA2MCA2OSA5IDIyIDkzIDczIDMxIDMzIDE3NSA3MSAxMSA5OCAyMDYgNzMgMTUgMjIxIDE0NiAxNjAgMzQgODggODggCisxMzkgMTg2IDEwMiAxODkgNTUgMTg2IDE1MyA5IDE5OCA0NiAxOSA1MSAxNjUgMTI5IDIwOCAyMTUgNDkgMjMgNiAxNzkgMTI4IDMwIAorMTU2IDY0IDExMSAyMDMgMTA1IDU1IDEwIDExMSAxNTIgNTggMTM5IDYxIDEwNyAyMSA5MSA1NiA5OSAxNzAgMTM3IDE5NyAxNjkgMTM1IAorMTgwIDQxIDEzNiA1NyAxNTIgNyA5MiAxNDUgMTU4IDE1NSA0OSA4OSAxNiAyMDggMjAwIDg2IDQ4IDIxIDIxNiA1MSA0MCAxMzQgMTc4IAorMjQgOCAxOTYgMjkgMTE4IDUyIDQyIDEzIDc5IDIzIDEzMSAxNzQgNjkgMjIxIDU5IDExOCAxNzcgMzcgMTgxIDQzIDE1MyAxODUgMTUxIAorMTMwIDcwIDQ3IDM0IDE2MiAxMjUgMjYgMjAxIDEzOSAxMTIgNjUgMTY0IDQwIDE0OSAzIDIyNiAyMjAgMTU5IDEwNiAxOSA3NCAxNTUgCisxMDAgNDcgMTU5IDE1NyA2NiAyMTcgMTA0IDEwNCAxNzggMTI2IDEzIDI4IDY1IDIxNSAyMjUgNjUgOTAgMyAzNSAyMTUgMTg5IDcwIAorMTQ5IDM5IDIyMSAxNjEgMTIzIDE0NyA3MyA1MSAyMTYgMTc2IDM1IDc1IDE0MiAxNTQgNjIgMzUgOTAgMTk0IDQwIDE4NSAyMjUgMTY3IAorOTUgNjIgNzEgODUgMTM1IDQgODggNTIgMTQ0IDE4IDEzOCAxNDggMSAxMjAgOTIgMTYwIDIxMCAxMzAgMTcyIDUyIDkzIDE5OCAyMjIgCisxOTkgMjI0IDE5IF4KKzQ3OSAwIDM2IDczIDEzIDQ3IDU3IDE1NCA2MCAzIDIyNiAxODggNzAgMTAwIDUxIDEzMSA2NCA2MiAxNjIgMTYxIDE1IDE0MiAxNCAxMSAKKzExNSAxNDEgOTcgMjE5IDIxNiAxMzggMjAxIDE2IDE3MiAzMSAxOTggMTY3IDYgNzUgMTI1IDI2IDE3MyAxOTIgMTkzIDk1IDc1IDkzIAorMTExIDExNCAyMjQgNzYgOTEgMjEzIDEzIDIyNyAyMDEgMjEzIDI4IDEyMCAxIDUwIDE1MCAyMTMgNDUgMTQyIDMxIDMzIDE0NSAxMjQgCis5MiAxMzAgMzQgMTI2IDIwNCAxMDkgMiAxNiAxMDggMjAxIDgwIDE1MCAxNDkgMjE1IDE3MiAxNCAyOCAxMzcgMjMgODAgMTMzIDIwOCAKKzE4NSAxODkgMTkgMzYgOSAxODMgNzcgNDAgMTQ5IDIwMCA1MCAyMTQgMTkxIDE2MyAxNTkgMzYgNDEgOTggMTM2IDggMzcgMjA0IDE0MSAKKzY1IDc1IDE1NyA4OSA4NCAxMiA4MSA5OSA4NSAyNSAyMjQgMjcgMTU0IDQzIDIxMCAxMTUgMjA1IDc1IDEwOCA0IDE0MyAyMDkgMTk4IAorMTAzIDE3NiAxMDUgMTA4IDIxIDE2NSAxMCAxODEgOTggMTY4IDE1MiA5NiAyNCAyOSA2OSAxNjYgOCAyMDIgMjI2IDE3MSA0OCA3MCA2OCAKKzIxNyA3MiAxNSAxNzQgMTU4IDcwIDgzIDI5IDEwMSA2NyAyMiAxMTQgMjcgMTM5IDE1MCAxODEgMTMwIDIgNjMgMTQ1IDE0MSAzMyAxNjAgCisxNyAxMjEgMTk2IDggMjE5IDE5IDUzIDMxIDY1IDYwIDM1IDYwIDE4IDM4IDIxNyA1NSAyMjIgMTQ0IDE3NSAxNTYgMTcyIDIxMSAxMTMgCisyMjYgMjAzIDE5MiAxMjkgMTE3IDEwNSA3NiAxMDYgMjUgNDIgNjQgOTQgNzcgNzIgMjEyIDMwIDk5IDEwMiAxOTUgMjUgMTAgMTQ5IDM1IAorMjggMTg0IDIwOCAyMCAxNjcgMjE4IDUzIDk1IDQzIDMwIDUyIDY1IDEwNyAyMjAgNTIgMTI5IDg1IDE5MCAxNyA1NyAxMzcgMzggMjAyIAorMTQgMTkzIDc4IDUzIDYzIDEyOCAxMTkgMyAxNzcgMjIgMTI5IDY4IDE2OCAyMTYgNzQgMjIzIDQ2IDE1NSAxNzQgMTkwIDIxNCAyMjMgCis3OCAyMTggODUgMTU4IDEwMiAyMjcgMTY5IDE1MCAxOTggMTUyIDExMyA0NiA1OSA1MiAxNjEgMjAgMjE0IDI2IDIyMiAxMjkgNTMgNDYgCisxMDYgODkgMjAgMzQgMTExIDgyIDgwIDE2NSA0MiAxNSA5IDEzNiA0MCAxMDAgMTE1IDE5MCAxODIgNzkgMTkgMjEgMTk3IDE1NCAxMSAKKzE0NyA1NiAxNTYgMTg3IDEwNCAxNDIgNjMgOTYgNTYgMTczIDIwOSAxMzQgMTI1IDU4IDg4IDEwMyAxNjEgMjEyIDc5IDE4NCA0MyAyMjcgCisxMzcgNiA1OCAxMDMgMjI1IDE5MCA0OSAyMDEgNDggNiA5MCAxOCA1NSAxMCAxNjYgMjA1IDEzOSAxNjcgMjAzIDE2MCA2NiAyMDYgNTYgCisxODggMTAyIDE1IDE5MSAxODAgMTgxIDY2IDI0IDkzIDEyOCAxMzYgMjUgNTkgNSAxMjQgNjAgNjcgMjA0IDE1OCA4NyAxMDUgMTQwIDg0IAorMjI0IDU5IDY5IDEwMiAzMCAzIDIwOSAxNjYgNDAgMTE3IDU2IDIyMCAxNjUgNzQgMTU5IDY4IDE4NSAxNTcgMTg1IDIwNiA0MSA2NiA3MyAKKzE3OCAyMTcgODcgMTM3IDIwMyAyMjQgNDQgMTc2IDczIDE5MyAxMTAgMTE2IDEyMiAxNzcgNyA3IDM5IDE4MyAxMyA2MiAxNzkgMTgzIAorNDUgMTI1IDkgMyAxNjIgMjEwIDEwMCA4MyA0NiAxMjMgMTExIDUwIDE3IDEwNiA3NCAxMjcgMTUzIDQ1IDE4OSA2OCAxMjEgMTc5IDIxNSAKKzE4OSAzNiA1OCAxMjAgMTY2IDcyIDMyIDE5NiAxODggNTMgNzggMjEgMTQ4IDY5IDE1MSAxMTUgMTczIDEyIDQ5IDM2IDI2IDIwNSAxMDcgCisyMyA2MyAxOTIgMTEyIF4KKzQ4NSAxIDIwMCAxOTQgMTAyIDIxNCAxOSAxNzggMTMyIDIwOCAxNTggNTkgMTAgMTM2IDExMiAxMzUgMTE4IDM3IDYzIDMwIDk0IDYwIAorNDYgMTgwIDQ3IDEwMCAxMTAgMTQ2IDMzIDMgNTAgMTk5IDQzIDM5IDE2OCAxNjkgOTAgMTg4IDEyIDkyIDIxOSAxODkgNiAxMTcgMTE2IAorMTk2IDEzMyA4NyAxNjQgNzYgMTMyIDE2NyAxMDEgMzAgMjA5IDc5IDE1NyAxMzggMTQzIDggMzIgOCAyMjEgMjIwIDExMCAzMSAxNCAKKzEyMyA5MiAxMDMgMTM1IDExNyA3NSAyMTIgMTA0IDU1IDE4MCAxMjEgNjIgMTkyIDcyIDcyIDE4NyAyMDYgMTMgMjAyIDY3IDIwNiAxMjggCisyMjEgMTA1IDkxIDIyNCAxMjkgMjcgMTg0IDE4MSAxMTUgMTYwIDg5IDc5IDE5OSA4NCAyMyAxOTcgMTI4IDE0NyAxNDMgODIgNjcgMTcgCisxNDcgMjggNjMgMTg3IDEzMiA1MSAxMjAgMTQxIDE2NyAxNzUgNjUgNjAgNSAxOTYgMTggNjggMTI2IDE5MSAzNiAyOCAxNzkgMTAgMjEgCis5MyAyNCAyIDE0IDgyIDEwOCA3NCAxNzYgNjAgMTIwIDIxNSAxMjkgMjYgMjIyIDk5IDE4OSAxMjEgMTM2IDIyNyAxNTQgMjI5IDIyNiAKKzg2IDE2OSAxNiAxNTMgMyAxNjYgMTgwIDUgODEgNzIgMzAgMTY4IDk1IDEyOCAxMDYgMTU5IDUzIDM1IDMzIDExOSAzMSA4OCAxNTggCisxNzQgMjkgMTYgNzAgMjYgMzIgODMgMjE4IDgwIDE5MyAxODIgMTUxIDIwNCAyNCA0NCAxOTEgMTkzIDY2IDE3MCA4NCAyMTMgMTQwIDk5IAorMTE1IDg2IDU0IDcwIDQyIDQ1IDcwIDQxIDgzIDYxIDExNSA0NCAxMDggMTkwIDE1NyAxODAgMTYyIDExOSAyMjEgMTA0IDEyOSAxNDIgCisyMDMgMjE5IDI1IDIyOCAxIDYxIDQxIDkgMjYgMzMgMTE4IDY5IDYgMSAxMzUgNzYgOTEgMTgzIDcyIDcxIDE1MiAxMjQgODcgMTYzIAorMTE0IDUwIDEwIDYyIDc3IDUzIDM0IDIyOSAxMTAgMTA1IDQ5IDIwNSAxOCAxNDIgODggNDIgMTkzIDY3IDEzMiA5MyAxMzkgMjEgNTIgCis0MCAyMDQgMjEzIDk4IDE1MyA0IDIwMSAzMSAxNjIgMTIwIDI1IDExMyA1NSAxODEgMTU2IDE0NCAxMTggMTExIDI1IDExMiAyMCAxNzIgCisyMzAgMTA1IDE2NSAxODYgMTM4IDE4NCAyMjMgNjEgNDAgNDcgMTc1IDEwNyA2IDExNiA4MSAxMTQgMjA3IDQ4IDUzIDIyNCAxNCA4MSAKKzczIDIyMyAxOSAyMSAxNjcgNTkgMTEgOTggMTk0IDYxIDIzMCAyMjEgMTQ2IDE0OCAyMiA4OCA4NCAxMzkgMTc4IDkwIDE4OSA0NyAxNzQgCisxNDUgMjI4IDE5MCA0MiAzIDUxIDE2MSAxMjUgMTk2IDIwNyA0OSAxNSAyIDE3MSAxMjAgMjYgMTQ4IDY0IDEwNyAxOTUgOTcgNDMgMjI5IAorMTExIDE0MCA1OCAxMzEgNTcgOTUgMTMgODcgNDggOTUgMTcwIDEyNSAxOTcgMTY5IDEzMSAxNzIgNDEgMTI0IDQ1IDE0NCAzIDkyIDE0NSAKKzE1NCAxNTUgMzMgNzcgMTIgMjA4IDIwMCA3OCA0OCAyMSAyMDggNDMgNDAgMTMwIDE3OCAxNiAyMjcgMTk2IDE3IDEwNiA0NCAzNCAyMjggCis3NSAyMyAxMjMgMTY2IDY1IDIxNyA0MyAxMTQgMTY1IDI5IDE3MyAzNSAxNDkgMTczIDE1MSAxMzAgNjIgMzUgMzQgMTU0IDExMyAxNCAKKzE5NyAxMjcgMTEyIDYxIDE1NiAyOCAxMzcgMjIyIDIxNCAyMDggMTU5IDk0IDE5IDYyIDE1MSA4OCA0MyAxNTUgMTQ5IDU4IDIwNSA5MiAKKzEwNCAxNzAgMTI2IDEgMjAgNTcgMjExIDIyNSA0OSA5MCAyMzAgMzEgMjAzIDE3NyA1NCAxNDUgMzkgMjA5IDE1MyAxMTkgMTQ3IDY5IAorNDcgMjE2IDE2NCAzNSA3NSAxMzggMTQyIDQ2IDIzIDgyIDE4MiAzNiAxODUgMTk4IF4KKzQ4MyAxIDE1NSA5NSA1MCA3MSA3MyAxMjMgMjI1IDc2IDI4IDE0NCAyMjcgMTI2IDEzMCAyMjggMTE0IDc0IDE0OCAxOTIgMTE4IDE3MiAKKzM0IDg3IDE5MiAyMTYgMTkzIDIwNiA1NCAzNiA2NSAyMzAgMzEgNDkgMTQ2IDQ0IDIyOCAyMTQgMTgwIDYyIDkyIDQ3IDEzMSA0OCA1OCAKKzE2MiAxNjEgMyAxNDIgMTQgMyAxMDcgMTQxIDg5IDIwNyAyMTIgMTMwIDE5MyA4IDE2MCAxNSAxOTggMTU5IDIyMyA2MyAxMTcgMTQgCisxNzMgMTkyIDE4MSA4NyA1OSA4OSAxMDcgMTA2IDIxNiA2MCA3OSAyMDEgMSAyMjcgMTg5IDIxMyAyMCAxMTYgMjIyIDM4IDE1MCAyMDUgCisyOSAxMzQgMjMgMjEgMTQxIDEyNCA4MCAxMjYgMzAgMTIyIDIwMCAxMDkgMjE5IDEwNCAyMDEgNjQgMTQyIDE0OSAyMTUgMTY4IDYgMTIgCisxMjUgNyA3MiAxMzMgMTk2IDE4MSAxODUgMTUgMjggOSAxODMgNjUgMzIgMTM3IDE5NiA0NiAyMDYgMTg3IDE2MyAxNTEgMzIgMzcgOTAgCisxMzIgOCAyNSAyMDQgMTM3IDYxIDY3IDE0NSA4OSA3MiA2OSA5NSA4NSA5IDIyMCAyMyAxNTQgMzUgMjEwIDExNSAxOTcgNzEgMTA4IAorMjI5IDEzOSAyMDkgMTkwIDEwMyAxNzYgOTcgMTAwIDUgMTU3IDEwIDE3MyA5NCAxNjAgMTQ4IDkyIDEyIDI1IDY5IDE1OCAyMDIgMjIyIAorMTcxIDQ0IDU4IDY0IDIwNSA2NCA3IDE3MCAxNTQgNzAgODMgMjkgOTcgNjcgMTAgMTEwIDExIDEzNSAxNDYgMTc3IDEyMiAyIDQ3IDEzMyAKKzEzMyAzMyAxNjAgMTMgMTEzIDE4NCAyMjUgMjExIDcgMzcgMjcgNDkgNDggMjMgNTYgMTQgMzggMjEzIDU1IDIyMiAxMzYgMTcxIDE0NCAKKzE2NCAyMTEgMTA1IDIyNiAxOTkgMTg0IDEyNSAxMDUgOTMgNzIgOTggMjUgMzQgNTIgODYgNjkgNjAgMjEyIDMwIDg3IDk0IDE5NSAyMSAKKzYgMTQ1IDE5IDI4IDE3MiAyMDQgNCAxNjcgMjE0IDQ1IDgzIDMxIDE0IDQwIDY1IDk1IDIyMCAyMjEgNDggMTIxIDc3IDE4NiA1IDU3IAorMTM3IDI2IDE5NCAyMzEgMTg5IDc4IDQxIDU1IDEyNCAxMTUgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIwNCA3NCAyMTEgNDIgMTQzIDE3NCAKKzE4MiAyMTAgMjE1IDcwIDIxOCA3MyAxNTggOTggMjIzIDE2MSAxMzggMTg2IDE0MCAxMDEgMzAgNTkgNTIgMTQ5IDIxNyAyMCAyMTQgMTAgCisyMTAgMTE3IDQ5IDQ2IDEwNiA4MSAxNiAxOCAxMDMgNzggNzYgMTYxIDM4IDE1IDIyNiAxMzYgMzYgMTAwIDEwMyAxNzggMTgyIDc1IDMgCis5IDE4NSAxNTAgNyAxMzUgNDggMTU2IDE4MyAxMDAgMTM4IDUxIDk2IDQwIDE2NSAyMDEgMTM0IDEyMSA0MiA4MCA5MSAxNTcgMjA4IDY3IAorMTgwIDI3IDIxOSAxMzMgMjMxIDU0IDk5IDIxMyAxOTAgMzMgMTk3IDM2IDIgODIgNiA0NyAyMzEgMTU0IDIwNSAxMjcgMTU1IDE5NSAKKzE1NiA1MCAyMDYgNTIgMTg0IDkwIDIzMiAxNzkgMTcyIDE2OSA2NiAyMCA4MSAxMTYgMTI0IDE3IDQzIDUgMTIwIDUyIDUxIDE5NiAxNDYgCis3OSAxMDEgMTI4IDgwIDIyNCA1MSA2MSAxMDIgMTggMyAyMDUgMTYyIDI4IDEwOSA1NiAyMTIgMTY1IDY2IDE1NSA2MCAxNzcgMTU3IAorMTczIDE5NCAzMyA2MiA1NyAxNzQgMjE3IDgzIDEyOSAyMDMgMjEyIDMyIDE3MiA2OSAxOTMgMTA2IDExNiAxMjIgMTY1IDMgNyAzNSAKKzE3NSA5IDUwIDE3MSAxNzkgMzcgMTI1IDUgMjIwIDE1OCAxOTggOTYgNzUgMzggMTE1IDk5IDUwIDEgOTQgNjIgMTI3IDE1MyA0NSAxODEgCis1MiAxMjEgMTc1IDIwNyAxNzcgMjQgNDYgMTA4IDE2NCBeCis0OTkgMCA0NCA0IDE4MiAxODggNTMgNzEgNyAxNDggNDggMTMwIDEwOCAxNjYgMjIwIDM1IDggMTIgMTk4IDkzIDkgNjMgMTcxIDk3IAorMTk1IDE5NCA4NyAyMDQgMTQgMTczIDEzMiAyMDMgMTQzIDU0IDIzMSAxMjYgMTAyIDEyNSAxMTggMzcgNDMgMjAgOTQgNjAgMzYgMTc1IAorNDcgOTAgMTEwIDE0MSAyMyAyMjkgMzUgMTg0IDQzIDI0IDE1MyAxNTQgODUgMTczIDEyIDgyIDIxNCAxNzQgMjMyIDExNyAxMDYgMTkxIAorMTI4IDc3IDE2NCA3NiAxMTcgMTYyIDEwMSAyNSAyMDQgNzQgMTQyIDEyMyAxNDMgMjM0IDMyIDIyOSAyMTEgMjE1IDEwNSAzMSA5IDEyMyAKKzg3IDg4IDEzNSAxMDIgNjUgMjAyIDk5IDUwIDE2NSAxMTYgNjIgMTg3IDYyIDY3IDE3NyAxOTEgOCAxOTIgNTIgMTk2IDExOCAyMDYgCisxMDUgOTEgMjE0IDExNCAyNyAxNzkgMTY2IDEwMCAxNTAgNzkgNzkgMTk5IDg0IDEzIDE4MiAxMjggMTM3IDEzMyA2NyA1NyAxNyAxMzIgCisyMyA1MyAxODcgMTIyIDM2IDExNSAxMzEgMTUyIDE3MCA1MCA0NSAyMzEgMTg2IDE4IDYzIDExMSAxODEgMjEgMTggMTc5IDIyNiAxNiAKKzg4IDE5IDIyMyAyMzAgODIgOTggNTkgMTYxIDUwIDEwNSAyMDAgMTI0IDExIDIwNyA4OSAxNzkgMTA2IDEzMSAyMTIgMTM5IDIyNCAyMjEgCis4NiAxNjQgMTYgMTQ4IDIyNCAxNjEgMTcwIDIyNiA3NiA1NyAxMCAxNjMgODUgMTEzIDk2IDE0NCAzOCAzMCAxOCAxMTkgMjEgNzggMTQ4IAorMTY0IDkgMjMyIDUwIDIyMSAyNiAxMiA3OCAyMDggODAgMTgzIDE3MiAxNDEgMTk5IDI0IDQ0IDE5MSAxODggNDYgMTU1IDY5IDIwOCAKKzE0MCA5OSAxMTAgODEgNTQgNTUgNDIgNDAgNjUgMjYgNjggNDEgMTA1IDI0IDkzIDE4NSAxNDcgMTgwIDE1NyAxMDQgMjE2IDg5IDExOSAKKzEzNyAxOTMgMjE5IDIzMSAxMCAyMjMgMSA1MSAzNiAyMzUgMTYgMjggMTAzIDQ5IDEgMjI3IDEyMCA2MSA3NiAxNzMgNzIgNTEgMTUyIAorMTE0IDg3IDE0OCAxMDQgNDAgNSA1NyA3NyA0OCAxNCAyMjkgOTUgMTAwIDM0IDIwMCA4IDEzMiA4MyAyMiAxNzggNjIgMTI3IDkzIDEyOSAKKzEgNDcgMzAgMTk0IDIwMyA4MyAxMzggNCAxODYgMTEgMTQ3IDEyMCA1IDExMyA0MCAxODEgMTQxIDEzOSAxMDggMTA2IDE1IDk3IDE1IAorMTU3IDIyMCA5NSAxNjAgMTg2IDEzOCAxODQgMjIzIDYxIDIwIDI3IDE3NSAxMDcgNiAxMDEgODEgMTE0IDIwNyAzMyAzMyAyMDkgNCA2NiAKKzczIDIxOCA0IDYgMTU3IDQ0IDExIDk4IDE3OSA0NiAyMTUgMjIxIDE0NiAxMzMgNyA4OCA3OSAxMzkgMTY4IDc1IDE4OSAzNyAxNTkgCisxMzUgMjE4IDE4MCAzNyAyMTkgNTEgMTU2IDEyMCAxODEgMTk3IDQ5IDUgMjMzIDE2MSAxMTAgMjEgMTM4IDY0IDEwMiAxODUgODcgMjggCisyMTkgMTExIDEyNSA1OCAxMjEgNTIgODAgMyA4MiAzOCA5MCAxNzAgMTEwIDE5NyAxNjkgMTI2IDE2MiA0MSAxMDkgMzAgMTM0IDIzNCAKKzkyIDE0NSAxNDkgMTU1IDEzIDYyIDcgMjA4IDIwMCA2OCA0OCAyMSAxOTggMzMgNDAgMTI1IDE3OCA2IDIxNyAxOTYgMiA5MSAzNCAyNCAKKzIxMyA3MCAyMyAxMTMgMTU2IDYwIDIxMiAyMyAxMDkgMTUwIDE5IDE2MyAyNSAxNDQgMTU4IDE1MSAxMzAgNTIgMjAgMzQgMTQ0IDk4IAorMjM1IDE5MiAxMTIgMTEyIDU2IDE0NiAxMyAxMjIgMjEyIDE5OSAxOTMgMTU5IDc5IDE5IDQ3IDE0NiA3MyAzOCAxNTAgMTM5IDQ4IDE5MCAKKzc3IDEwNCAxNjAgMTI2IDIyMiAxMCA0NyAyMDYgMjI1IDI5IDkwIDIzMCAyNiAxODggMTYyIDM0IDE0MCAzOSAxOTQgMTQzIDExNCAxNDcgCis2NCA0MiAyMTYgMTQ5IDE3NCBeCis0NzMgMSA3NSAxMzEgMTIxIDE4IDIgNjggMTYxIDI5IDE4NSAyMDMgMTQ1IDk1IDQwIDcxIDYzIDExMyAyMjAgNjYgOCAxNDQgMjEyIAorMTE2IDExNSAyMjggMTA5IDU5IDEzOCAxNzcgMTA4IDE3MiAxOSA4MiAxODcgMjExIDE4OCAxOTEgMzQgMzYgNTUgMjE1IDExIDM5IDEzNiAKKzI0IDIyMyAxOTkgMTcwIDUyIDgyIDQyIDEzMSAyOCA1MyAxNjIgMTYxIDIyNiAxNDIgMTQgMjMxIDk3IDE0MSA3OSAxOTIgMjA3IDEyMCAKKzE4MyAyMzYgMTQ1IDIzMyAxOTggMTQ5IDIwOCA0OCAxMDcgMjM3IDE3MyAxOTIgMTY2IDc3IDM5IDg0IDEwMiA5NiAyMDYgNDAgNjQgCisxODYgMjI0IDIyNyAxNzQgMjEzIDEwIDExMSAyMTIgMjMgMTUwIDE5NSA5IDEyNCAxMyA2IDEzNiAxMjQgNjUgMTIxIDI1IDExNyAxOTUgCisxMDkgMjA0IDIxOCA5OSAyMDEgNDQgMTMyIDE0OSAyMTUgMTYzIDIzNCAyMzAgMTEwIDIyNSA2MiAxMzMgMTgxIDE3NiAxODAgMTAgMTggCis5IDE4MyA1MCAyMiAxMjIgMTkxIDQxIDE5NiAxODIgMTYzIDE0MSAyNyAzMiA4MCAxMjcgOCAxMCAyMDQgMTMyIDU2IDU3IDEzMCA4OSAKKzU3IDIyMyA1NCA5MCA4NSAyMjcgMjE1IDE4IDE1NCAyNSAyMTAgMTE1IDE4NyA2NiAxMDggMjI0IDEzNCAyMDkgMTgwIDEwMyAxNzYgODcgCis5MCAyMjMgMTQ3IDEwIDE2MyA4OSAxNTAgMTQzIDg3IDIzNSAyMCA2OSAxNDggMjI4IDIwMiAyMTcgMTcxIDM5IDQzIDU5IDE5MCA1NCAKKzIzNSAxNjUgMTQ5IDcwIDgzIDI5IDkyIDY3IDIzMyAxMDUgMjI5IDEzMCAxNDEgMTcyIDExMiAyIDI3IDExOCAxMjMgMzMgMTYwIDggCisxMDMgMTY5IDIxMCAyMDEgMjMwIDE3IDIyIDI5IDMzIDggNTEgOSAzOCAyMDggNTUgMjIyIDEyNiAxNjYgMTI5IDE1NCAyMTEgOTUgMjI2IAorMTk0IDE3NCAxMjAgOTAgNzggNjcgODggMjUgMjQgMzcgNzYgNTkgNDUgMjEyIDMwIDcyIDg0IDE5NSAxNiAxIDE0MCAyMzcgMjggMTU3IAorMTk5IDIyMiAxNjcgMjA5IDM1IDY4IDE2IDIzMiAyNSA2NSA4MCAyMjAgMjExIDQzIDExMSA2NyAxODEgMjI4IDU3IDEzNyAxMSAxODQgCisyMTYgMTg0IDc4IDI2IDQ1IDExOSAxMTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE4OSA3NCAxOTYgMzcgMTI4IDE3NCAxNzIgMjA1IAorMjA1IDYwIDIxOCA1OCAxNTggOTMgMjE4IDE1MSAxMjMgMTcxIDEyNSA4NiAxMCA1OSA1MiAxMzQgMjAyIDIwIDIxNCAyMjggMTk1IDEwMiAKKzQ0IDQ2IDEwNiA3MSAxMSAyMzYgOTMgNzMgNzEgMTU2IDMzIDE1IDIxMSAxMzYgMzEgMTAwIDg4IDE2MyAxODIgNzAgMjIxIDIzMiAxNzAgCisxNDUgMiAxMjAgMzggMTU2IDE3OCA5NSAxMzMgMzYgOTYgMjAgMTU1IDE5MSAxMzQgMTE2IDIyIDcwIDc2IDE1MiAyMDMgNTIgMTc1IDcgCisyMDkgMTI4IDIyNiA0OSA5NCAxOTggMTkwIDEzIDE5MiAyMSAyMzUgNzIgMjI5IDM3IDIyMSAxMzkgMjA1IDExMiAxNDAgMTg1IDE1MSAKKzMwIDIwNiA0NyAxNzkgNzUgMjE3IDE2NCAxNjIgMTU0IDY2IDE1IDY2IDEwMSAxMDkgNyAyMyA1IDExNSA0MiAzMSAxODYgMTMxIDY5IAorOTYgMTEzIDc1IDIyNCA0MSA1MSAxMDIgMyAzIDIwMCAxNTcgMTMgOTkgNTYgMjAyIDE2NSA1NiAxNTAgNTAgMTY3IDE1NyAxNTggMTc5IAorMjMgNTcgMzcgMTY5IDIxNyA3OCAxMTkgMjAzIDE5NyAxNyAxNjcgNjQgMTkzIDEwMSAxMTYgMTIyIDE1MCAyMzYgNyAzMCAxNjUgNCAzNSAKKzE2MSAxNzQgMjcgMTI1IDIwNSAxNTMgMTQ4IF4KKzUwMiAxIDg5IDYxIDI0IDEwMSA3OCA1MCAyMTMgNzMgNDEgMTI3IDE1MyA0NSAxNjcgMjQgMTIxIDE2OCAxOTMgMTU2IDMgMjUgODcgCisxNjYgMjggMjI4IDE3NCAxODggNTMgNjcgMjM5IDE0OCAzNiAxMTggMTA0IDE2MiAyMDggMjcgMjMyIDQgMTk0IDg1IDEgNjMgMTU5IDk3IAorMTkxIDE5NCA3NSAxOTYgMTAgMTY5IDEzMiAxOTkgMTMxIDUwIDIyMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCAxNzEgCis0NyA4MiAxMTAgMTM3IDE1IDIyNSAyMyAxNzIgNDMgMTIgMTQxIDE0MiA4MSAxNjEgMTIgNzQgMjEwIDE2MiAyMjggMTE3IDk4IDE4NyAKKzEyNCA2OSAxNjQgNzYgMTA1IDE1OCAxMDEgMjEgMjAwIDcwIDEzMCAxMTEgMTQzIDIzMCAzMiAyMjEgMjAzIDIxMSAxMDEgMzEgNSAxMjMgCis4MyA3NiAxMzUgOTAgNTcgMTk0IDk1IDQ2IDE1MyAxMTIgNjIgMTgzIDU0IDYzIDE2OSAxNzkgNCAxODQgNDAgMTg4IDExMCAxOTQgMTA1IAorOTEgMjA2IDEwMiAyNyAxNzUgMTU0IDg4IDE0MiA3MSA3OSAxOTkgODQgNSAxNzAgMTI4IDEyOSAxMjUgNTUgNDkgMTcgMTIwIDE5IDQ1IAorMTg3IDExNCAyNCAxMTEgMTIzIDE0MCAxNjYgMzggMzMgMjI3IDE3OCAxOCA1OSA5OSAxNzMgOSAxMCAxNzkgMjE0IDEyIDg0IDE1IDIxNSAKKzIxOCA4MiA5MCA0NyAxNDkgNDIgOTMgMTg4IDEyMCAyMzkgMTk1IDgxIDE3MSA5NCAxMjcgMjAwIDEyNyAyMjAgMjE3IDg2IDE2MCAxNiAKKzE0NCAyMTYgMTU3IDE2MiAyMTggNzIgNDUgMjM0IDE1OSA3NyAxMDEgODggMTMyIDI2IDI2IDYgMTE5IDEzIDcwIDE0MCAxNTYgMjMzIAorMjIwIDM0IDIxMyAyNiAyMzYgNzQgMjAwIDgwIDE3NSAxNjQgMTMzIDE5NSAyNCA0NCAxOTEgMTg0IDMwIDE0MyA1NyAyMDQgMTQwIDk5IAorMTA2IDc3IDU0IDQzIDQyIDM2IDYxIDE0IDU2IDI1IDk3IDggODEgMTgxIDEzOSAxODAgMTUzIDkyIDIxMiA3NyAxMTEgMTMzIDE4NSAKKzIxOSAyMzEgMjM4IDIxOSAxIDQzIDMyIDIzMSA4IDI0IDkxIDMzIDIzNyAyMjMgMTA4IDQ5IDY0IDE2NSA3MiAzNSAxNTIgMTA2IDg3IAorMTM2IDk2IDMyIDEgNTMgNzcgNDQgMjM4IDIyOSA4MyA5NiAyMiAxOTYgMTI0IDc5IDYgMTY2IDU4IDEyMyA5MyAxMjEgMjI1IDQzIDIyIAorMTg2IDE5NSA3MSAxMjYgNCAxNzQgMjM1IDEzNSAxMjAgMjI5IDExMyAyOCAxODEgMTI5IDEzNSAxMDAgMTAyIDcgODUgMTEgMTQ1IDIxMiAKKzg3IDE1NiAxODYgMTM4IDE4NCAyMjMgNjEgNCAxMSAxNzUgMTA3IDYgODkgODEgMTE0IDIwNyAyMSAxNyAxOTcgMjM2IDU0IDczIDIxNCAKKzIzMiAyMzQgMTQ5IDMyIDExIDk4IDE2NyAzNCAyMDMgMjIxIDE0NiAxMjEgMjM1IDg4IDc1IDEzOSAxNjAgNjMgMTg5IDI5IDE0NyAxMjcgCisyMTAgMTcyIDMzIDIwNyA1MSAxNTIgMTE2IDE2OSAxODkgNDkgMjM3IDIzMyAxNTMgMTAyIDE3IDEzMCA2NCA5OCAxNzcgNzkgMTYgMjExIAorMTExIDExMyA1OCAxMTMgNDggNjggMjM1IDc4IDMwIDg2IDE3MCA5OCAxOTcgMTY5IDEyMiAxNTQgNDEgOTcgMTggMTI2IDIzNCA5MiAKKzE0NSAxNDUgMTU1IDIzNyA1MCAzIDIwOCAyMDAgNjAgNDggMjEgMTkwIDI1IDQwIDEyMSAxNzggMjM4IDIwOSAxOTYgMjMwIDc5IDI2IAorMTYgMjAxIDY2IDIzIDEwNSAxNDggNTYgMjA4IDcgMTA1IDEzOCAxMSAxNTUgMTcgMTQwIDE0NiAxNTEgMTMwIDQ0IDggMzQgMTM2IDg2IAorMjI3IDE4OCAxMDAgMTEyIDUyIDEzOCAxIDExMCAyMDQgMTg3IDE4MSAxNTkgNjcgMTkgMzUgMTQyIDYxIDM0IDE0NiAxMzEgNDAgMTc4IAorNjUgMTA0IDE1MiAxMjYgMjE0IDIgMzkgMjAyIDE3MyBeCis0ODYgMSA1IDkwIDIzMCAyMCAxNzAgMTQ0IDEwIDEzNCAzOSAxNzYgMTMxIDEwOCAxNDcgNTggMzYgMjE2IDEzMSAzNSA3NSAxMjcgMTA5IAorMiAyMzIgNjAgMTQ5IDI1IDE4NSAxOTUgMTM3IDk1IDMyIDcxIDU1IDEwNSAyMTYgNTggMjM0IDE0NCAyMDAgMTA4IDEwMyAyMjggMTA1IAorNDcgMTMwIDE2NSAxMDAgMTcyIDcgNzggMTgzIDIwNyAxODQgMTc5IDE4IDM2IDQ3IDIwMyAyMzcgMzEgMTI4IDggMjE5IDE4NyAxNjIgCis0NCA3NCAzOCAxMzEgMTIgNDkgMTYyIDE2MSAyMTggMTQyIDE0IDIyNyA4OSAxNDEgNzEgMTgwIDIwMyAxMTIgMTc1IDIzMiAxMzMgMjIxIAorMTk4IDE0MSAxOTYgMzYgOTkgMjI5IDE3MyAxOTIgMTU0IDY5IDIzIDgwIDk4IDg4IDE5OCAyNCA1MiAxNzQgMjE2IDIyNyAxNjIgMjEzIAorMiAxMDcgMjA0IDExIDE1MCAxODcgMjM1IDExNiA1IDIzNiAxMzIgMTI0IDUzIDExNyAyMSAxMTMgMTkxIDEwOSAxOTIgMjA2IDk1IDIwMSAKKzI4IDEyNCAxNDkgMjE1IDE1OSAyMzAgMjE4IDk4IDIxMyA1NCAxMzMgMTY5IDE3MiAxNzYgNiAxMCA5IDE4MyAzOCAxNCAxMTAgMTg3IAorMzcgMTg4IDE3OCAxNjMgMTMzIDIzIDI4IDcyIDEyMyA4IDI0MCAyMDQgMTI4IDUyIDQ5IDExOCA4OSA0NSAyMTUgNDIgODYgODUgMjE1IAorMjExIDE0IDE1NCAxNyAyMTAgMTE1IDE3OSA2MiAxMDggMjIwIDEzMCAyMDkgMTcyIDEwMyAxNzYgNzkgODIgMjExIDEzOSAxMCAxNTUgCis4NSAxNDIgMTM5IDgzIDIyNyAxNiA2OSAxNDAgMjI0IDIwMiAyMTMgMTcxIDM1IDMxIDU1IDE3OCA0NiAyMzEgMTYxIDE0NSA3MCA4MyAKKzI5IDg4IDY3IDIyNSAxMDEgMjE3IDEyNiAxMzcgMTY4IDEwNCAyIDExIDEwNiAxMTUgMzMgMTYwIDQgOTUgMTU3IDE5OCAxOTMgMjIyIDEgCisxOCAxMyAyMSAyMzggNDcgNSAzOCAyMDQgNTUgMjIyIDExOCAxNjIgMTE3IDE0NiAyMTEgODcgMjI2IDE5MCAxNjYgMTE2IDc4IDY2IDYzIAorODAgMjUgMTYgMjUgNjggNTEgMzMgMjEyIDMwIDYwIDc2IDE5NSAxMiAyMzkgMTM2IDIyNSAyOCAxNDUgMTk1IDIxMCAxNjcgMjA1IDI3IAorNTYgNCAyMjAgMTMgNjUgNjggMjIwIDIwMyAzOSAxMDMgNTkgMTc3IDIyMCA1NyAxMzcgMjQxIDE3NiAyMDQgMTgwIDc4IDE0IDM3IDExNSAKKzEwNiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTc3IDc0IDE4NCAzMyAxMTYgMTc0IDE2NCAyMDEgMTk3IDUyIDIxOCA0NiAxNTggODkgCisyMTQgMTQzIDExMSAxNTkgMTEzIDc0IDIzNiA1OSA1MiAxMjIgMTkwIDIwIDIxNCAyMTYgMTgzIDkwIDQwIDQ2IDEwNiA2MyA3IDIyNCAKKzg1IDY5IDY3IDE1MiAyOSAxNSAxOTkgMTM2IDI3IDEwMCA3NiAxNTEgMTgyIDY2IDIwOSAyMjQgMTU4IDE0MSAyNDAgMTA4IDMwIDE1NiAKKzE3NCA5MSAxMjkgMjQgOTYgNCAxNDcgMTgzIDEzNCAxMTIgNiA2MiA2NCAxNDggMTk5IDQwIDE3MSAyMzMgMjAxIDEyNCAyMjIgNDUgOTAgCisxODYgMTkwIDIzOSAxODggOSAyMzUgNjQgMjIxIDI5IDIxMyAxMjcgMjA1IDEwMCAxMjggMTc3IDE0NyAxNCAyMDYgNDMgMTc1IDYzIAorMjA1IDE1MiAxNTQgMTQyIDY2IDExIDU0IDg5IDk3IDI0MSA3IDUgMTExIDM0IDE1IDE3OCAxMTkgNjEgOTIgMTAxIDcxIDIyNCAzMyA0MyAKKzEwMiAyMzMgMyAxOTYgMTUzIDEgOTEgNTYgMTk0IDE2NSA0OCAxNDYgNDIgMTU5IDE1NyAxNDYgMTY3IDE1IDUzIDIxIDE2NSAyMTcgNzQgCisxMTEgMjAzIDE4NSA1IDE2MyA2MCAxOTMgOTcgMTE2IDEyMiAxMzggMjM2IDcgMjYgMTU3IDIzIDE1MyAxNzAgMTg0IF4KKzUwNSAxIDEyNSAyMzggMTg3IDE0NyAxNjUgODUgNTMgMTYgOTMgNjYgNTAgMjAxIDYxIDI5IDEyNyAxNTMgNDUgMTU5IDggMTIxIDE2NCAKKzE4NSAxNDQgMjM1IDEzIDc1IDE2NiAxMiAyMTYgMTY2IDE4OCA1MyA2MyAyMzUgMTQ4IDI0IDEwNiAxMDAgMTU4IDE5NiAxOSAyMjAgCisyNDAgMTkwIDc3IDIzNyA2MyAxNDcgOTcgMTg3IDE5NCA2MyAxODggNiAxNjUgMTMyIDE5NSAxMTkgNDYgMjE1IDExMCA4NiAxMDkgMTE4IAorMzcgMTEgNCA5NCA2MCAyMCAxNjcgNDcgNzQgMTEwIDEzMyA3IDIyMSAxMSAxNjAgNDMgMTI5IDEzMCA3NyAxNDkgMTIgNjYgMjA2IDE1MCAKKzIyNCAxMTcgOTAgMTgzIDEyMCA2MSAxNjQgNzYgOTMgMTU0IDEwMSAxNyAxOTYgNjYgMTE4IDk5IDE0MyAyMjYgMzIgMjEzIDE5NSAyMDcgCis5NyAzMSAxIDEyMyA3OSA2NCAxMzUgNzggNDkgMTg2IDkxIDQyIDE0MSAxMDggNjIgMTc5IDQ2IDU5IDE2MSAxNjcgMTc2IDI4IDE4MCAKKzEwMiAxODIgMTA1IDkxIDE5OCA5MCAyNyAxNzEgMTQyIDc2IDEzNCA2MyA3OSAxOTkgODQgMjQxIDE1OCAxMjggMTIxIDExNyA0MyA0MSAKKzE3IDEwOCAxNSAzNyAxODcgMTA2IDEyIDEwNyAxMTUgMTI4IDE2MiAyNiAyMSAyMjMgMTcwIDE4IDU1IDg3IDE2NSAyNDEgMiAxNzkgCisyMDIgOCA4MCAxMSAyMDcgMjA2IDgyIDgyIDM1IDEzNyAzNCA4MSAxNzYgMTE2IDIzMSAxODMgNzMgMTYzIDgyIDEyMyAxODggMTE1IAorMjE2IDIxMyA4NiAxNTYgMTYgMTQwIDIwOCAxNTMgMTU0IDIxMCA2OCAzMyAyMjIgMTU1IDY5IDg5IDgwIDEyMCAxNCAyMiAyMzggMTE5IAorNSA2MiAxMzIgMTQ4IDIyMSAyMDggMTggMjA1IDI2IDIyNCA3MCAxOTIgODAgMTY3IDE1NiAxMjUgMTkxIDI0IDQ0IDE5MSAxODAgMTQgCisxMzEgNDUgMjAwIDE0MCA5OSAxMDIgNzMgNTQgMzEgNDIgMzIgNTcgMiA0NCA5IDg5IDIzNiA2OSAxNzcgMTMxIDE4MCAxNDkgODAgMjA4IAorNjUgMTAzIDEyOSAxNzcgMjE5IDIzMSAyMzAgMjE1IDEgMzUgMjggMjI3IDIwIDc5IDE3IDIzNyAyMTkgOTYgMzcgNTIgMTU3IDcyIDE5IAorMTUyIDk4IDg3IDEyNCA4OCAyNCAyNDEgNDkgNzcgNDAgMjI2IDIyOSA3MSA5MiAxMCAxOTIgMjM2IDExNiA3NSAyMzQgMTU0IDU0IDExOSAKKzkzIDExMyAyMTMgMzkgMTQgMTc4IDE4NyA1OSAxMTQgNCAxNjIgMjIzIDEyMyAxMjAgMjE3IDExMyAxNiAxODEgMTE3IDEzMSA5MiA5OCAKKzI0MyA3MyA3IDEzMyAyMDQgNzkgMTUyIDE4NiAxMzggMTg0IDIyMyA2MSAyMzIgMjM5IDE3NSAxMDcgNiA3NyA4MSAxMTQgMjA3IDkgMSAKKzE4NSAyMzIgNDIgNzMgMjEwIDIyNCAyMjYgMTQxIDIwIDExIDk4IDE1NSAyMiAxOTEgMjIxIDE0NiAxMDkgMjI3IDg4IDcxIDEzOSAxNTIgCis1MSAxODkgMjEgMTM1IDExOSAyMDIgMTY0IDI5IDE5NSA1MSAxNDggMTEyIDE1NyAxODEgNDkgMjMzIDIzMyAxNDUgOTQgMTMgMTIyIDY0IAorOTQgMTY5IDcxIDQgMjAzIDExMSAxMDEgNTggMTA1IDQ0IDU2IDIzMSA3NCAyMiA4MiAxNzAgODYgMTk3IDE2OSAxMTggMTQ2IDQxIDg1IAorNiAxMTggMjM0IDkyIDE0NSAxNDEgMTU1IDIyNSAzOCAyNDMgMjA4IDIwMCA1MiA0OCAyMSAxODIgMTcgNDAgMTE3IDE3OCAyMzQgMjAxIAorMTk2IDIyMiA2NyAxOCA4IDE4OSA2MiAyMyA5NyAxNDAgNTIgMjA0IDIzNSAxMDEgMTI2IDMgMTQ3IDkgMTM2IDEzNCAxNTEgMTMwIDM2IAorMjQwIDM0IDEyOCA3NCAyMTkgMTg0IDg4IDExMiA0OCAxMzAgMjMzIDk4IDE5NiAxNzUgMTY5IDE1OSA1NSAxOSAyMyAxMzggNDkgMzAgCisxNDIgMTIzIDMyIDE2NiA1MyAxMDQgMTQ0IDEyNiAyMDYgMjM4IDMxIDE5OCAyMDMgXgorNDgzIDEgMjM1IDkwIDIzMCAxNiAxNTggMTMyIDI0MCAxMzAgMzkgMTY0IDEyMyAxMDQgMTQ3IDU0IDMyIDIxNiAxMTkgMzUgNzUgMTIzIAorOTcgMjMyIDIyNCA1MiAxMzcgMjEgMTg1IDE4NyAxMjkgOTUgMjQgNzEgNDcgOTcgMjEyIDUwIDIyMiAxNDQgMTg4IDEwMCA5MSAyMjggCisxMDEgMzUgMTIyIDE1MyA5MiAxNzIgMjQxIDc0IDE3OSAyMDMgMTgwIDE2NyAyIDM2IDM5IDE5MSAyMjUgMjMgMTIwIDIzOCAyMTUgMTc1IAorMTU0IDM2IDY2IDM0IDEzMSAyNDIgNDUgMTYyIDE2MSAyMTAgMTQyIDE0IDIyMyA4MSAxNDEgNjMgMTY4IDE5OSAxMDQgMTY3IDIyOCAKKzEyMSAyMDkgMTk4IDEzMyAxODQgMjQgOTEgMjIxIDE3MyAxOTIgMTQyIDYxIDcgNzYgOTQgODAgMTkwIDggNDAgMTYyIDIwOCAyMjcgCisxNTAgMjEzIDI0MCAxMDMgMTk2IDI0NSAxNTAgMTc5IDIyMyAxMDggMjQzIDIyOCAxMjggMTI0IDQxIDExMyAxNyAxMDkgMTg3IDEwOSAKKzE4MCAxOTQgOTEgMjAxIDEyIDExNiAxNDkgMjE1IDE1NSAyMjYgMjA2IDg2IDIwMSA0NiAxMzMgMTU3IDE2OCAxNzIgMiAyIDkgMTgzIAorMjYgNiA5OCAxODMgMzMgMTgwIDE3NCAxNjMgMTI1IDE5IDI0IDY0IDExOSA4IDIzMiAyMDQgMTI0IDQ4IDQxIDEwNiA4OSAzMyAyMDcgCiszMCA4MiA4NSAyMDMgMjA3IDEwIDE1NCA5IDIxMCAxMTUgMTcxIDU4IDEwOCAyMTYgMTI2IDIwOSAxNjQgMTAzIDE3NiA3MSA3NCAxOTkgCisxMzEgMTAgMTQ3IDgxIDEzNCAxMzUgNzkgMjE5IDEyIDY5IDEzMiAyMjAgMjAyIDIwOSAxNzEgMzEgMTkgNTEgMTY2IDM4IDIyNyAxNTcgCisxNDEgNzAgODMgMjkgODQgNjcgMjE3IDk3IDIwNSAxMjIgMTMzIDE2NCA5NiAyIDI0MSA5NCAxMDcgMzMgMTYwIDg3IDE0NSAxODYgMTg1IAorMjE0IDIzMSAxNCAyNDMgOSAyMzAgNDMgMSAzOCAyMDAgNTUgMjIyIDExMCAxNTggMTA1IDEzOCAyMTEgNzkgMjI2IDE4NiAxNTggMTEyIAorNjYgNTQgNTkgNzIgMjUgOCAxMyA2MCA0MyAyMSAyMTIgMzAgNDggNjggMTk1IDggMjM5IDEzMiAyMTMgMjggMTMzIDE5MSAxOTggMTY3IAorMjAxIDE5IDQ0IDIzOCAyMDggMSA2NSA1NiAyMjAgMTk1IDM1IDk1IDUxIDE3MyAyMTIgNTcgMTM3IDIzMyAxNjggMTkyIDE3NiA3OCAyIAorMjkgMTExIDEwMiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTY1IDc0IDE3MiAyOSAxMDQgMTc0IDE1NiAxOTcgMTg5IDQ0IDIxOCAzNCAKKzE1OCA4NSAyMTAgMTM1IDk5IDE0NyAxMDEgNjIgMjI0IDU5IDUyIDExMCAxNzggMjAgMjE0IDIwNCAxNzEgNzggMzYgNDYgMTA2IDU1IDMgCisyMTIgNzcgNjUgNjMgMTQ4IDI1IDE1IDE4NyAxMzYgMjMgMTAwIDY0IDEzOSAxODIgNjIgMTk3IDIxNiAxNDYgMTM3IDI0MCA5NiAyMiAKKzE1NiAxNzAgODcgMTI1IDEyIDk2IDIzNCAxMzkgMTc1IDEzNCAxMDggMjM2IDU0IDUyIDE0NCAxOTUgMjggMTY3IDIyMSAxOTMgMTIwIAorMjE4IDQxIDg2IDE3NCAxOTAgMjI3IDE4NCAyNDMgMjM1IDU2IDIxMyAyMSAyMDUgMTE1IDIwNSA4OCAxMTYgMTY5IDE0MyAyNDQgMjA2IAorMzkgMTcxIDUxIDE5MyAxNDAgMTQ2IDEzMCA2NiA3IDQyIDc3IDg1IDIzNyAyMzcgNSAxMDcgMjYgMjQ1IDE3MCAxMDcgNTMgODggODkgCis2NyAyMjQgMjUgMzUgMTAyIDIyNSAzIDE5MiAxNDkgMjM1IDgzIDU2IDE4NiAxNjUgNDAgMTQyIDM0IDE1MSAxNTcgMTM0IDE1NSA3IDQ5IAorNSAxNjEgMjE3IDcwIDEwMyAyMDMgMTczIDIzOSAxNTkgNTYgMTkzIDkzIDExNiAxMjIgMTI2IDIzNiA3IDIyIDE0OSAyNDIgMTc4IF4KKzUwNyAxIDE0MSAxNjQgNyAxMjUgMjM4IDE3NSAxNDMgMTUzIDgxIDQ1IDggODUgNTQgNTAgMTg5IDQ5IDE3IDEyNyAxNTMgNDUgMTUxIAorMjQwIDEyMSAxNjAgMTc3IDEzMiAyMjcgMSA2MyAxNjYgMjQ0IDIwNCAxNTggMTg4IDUzIDU5IDIzMSAxNDggMTIgOTQgOTYgMTU0IDE4NCAKKzExIDIwOCAyMzYgMTg2IDY5IDIzMyA2MyAxMzUgOTcgMTgzIDE5NCA1MSAxODAgMiAxNjEgMTMyIDE5MSAxMDcgNDIgMjA3IDEwMiA3OCAKKzEwMSAxMTggMzcgMjQzIDI0NCA5NCA2MCAxMiAxNjMgNDcgNjYgMTEwIDEyOSAyNDcgMjE3IDI0NyAxNDggNDMgMjM2IDExNyAxMTggNzMgCisxMzcgMTIgNTggMjAyIDEzOCAyMjAgMTE3IDgyIDE3OSAxMTYgNTMgMTY0IDc2IDgxIDE1MCAxMDEgMTMgMTkyIDYyIDEwNiA4NyAxNDMgCisyMjIgMzIgMjA1IDE4NyAyMDMgOTMgMzEgMjQ1IDEyMyA3NSA1MiAxMzUgNjYgNDEgMTc4IDg3IDM4IDEyOSAxMDQgNjIgMTc1IDM4IDU1IAorMTUzIDE1NSAyNDQgMTY4IDE2IDE3MiA5NCAxNzAgMTA1IDkxIDE5MCA3OCAyNyAxNjcgMTMwIDY0IDEyNiA1NSA3OSAxOTkgODQgMjM3IAorMTQ2IDEyOCAxMTMgMTA5IDMxIDMzIDE3IDk2IDExIDI5IDE4NyA5OCAxMDMgMTA3IDExNiAxNTggMTQgOSAyMTkgMTYyIDE4IDUxIDc1IAorMTU3IDIzMyAyNDIgMTc5IDE5MCA0IDc2IDcgMTk5IDE5NCA4MiA3NCAyMyAxMjUgMjYgNjkgMTY0IDExMiAyMjMgMTcxIDY1IDE1NSA3MCAKKzExOSAxNzYgMTAzIDIxMiAyMDkgODYgMTUyIDE2IDEzNiAyMDAgMTQ5IDE0NiAyMDIgNjQgMjEgMjEwIDE1MSA2MSA3NyA3MiAxMDggMiAKKzE4IDIzMCAxMTkgMjQ1IDU0IDEyNCAxNDAgMjA5IDE5NiAyIDE5NyAyNiAyMTIgNjYgMTg0IDgwIDE1OSAxNDggMTE3IDE4NyAyNCA0NCAKKzE5MSAxNzYgMjQ2IDExOSAzMyAxOTYgMTQwIDk5IDk4IDY5IDU0IDE5IDQyIDI4IDUzIDIzOCAzMiAyNDEgODEgMjI0IDU3IDE3MyAxMjMgCisxODAgMTQ1IDY4IDIwNCA1MyA5NSAxMjUgMTY5IDIxOSAyMzEgMjIyIDIxMSAxIDI3IDI0IDIyMyAyNDAgMTYgNjcgMSAyMzcgMjE1IDg0IAorMjUgNDAgMTQ5IDcyIDMgMTUyIDkwIDg3IDExMiA4MCAxNiAyNDEgNDUgNzcgMzYgMjE0IDIyOSA1OSA4OCAyNDYgMTg4IDIzMiAxMDggCis3MSAyMjIgMTQyIDUwIDExNSA5MyAxMDUgMjAxIDM1IDYgMTcwIDE3OSA0NyAxMDIgNCAxNTAgMjExIDExMSAxMjAgMjA1IDExMyA0IAorMTgxIDEwNSAxMjcgODQgOTQgMjM5IDYxIDMgMTIxIDE5NiA3MSAxNDggMTg2IDEzOCAxODQgMjIzIDYxIDIyMCAyMjcgMTc1IDEwNyA2IAorNjUgODEgMTE0IDIwNyAyNDUgMjMzIDE3MyAyMjggMzAgNzMgMjA2IDIxNiAyMTggMTMzIDggMTEgOTggMTQzIDEwIDE3OSAyMjEgMTQ2IAorOTcgMjE5IDg4IDY3IDEzOSAxNDQgMzkgMTg5IDEzIDEyMyAxMTEgMTk0IDE1NiAyNSAxODMgNTEgMTQ0IDEwOCAxNDUgMTczIDQ5IDIyOSAKKzIzMyAxMzcgODYgOSAxMTQgNjQgOTAgMTYxIDYzIDI0MCAxOTUgMTExIDg5IDU4IDk3IDQwIDQ0IDIyNyA3MCAxNCA3OCAxNzAgNzQgCisxOTcgMTY5IDExNCAxMzggNDEgNzMgMjQyIDExMCAyMzQgOTIgMTQ1IDEzNyAxNTUgMjEzIDI2IDI0MyAyMDggMjAwIDQ0IDQ4IDIxIAorMTc0IDkgNDAgMTEzIDE3OCAyMzAgMTkzIDE5NiAyMTQgNTUgMTAgMTc3IDU4IDIzIDg5IDEzMiA0OCAyMDAgMjIzIDk3IDExNCAyNDMgCisxMzkgMSAxMzIgMTIyIDE1MSAxMzAgMjggMjMyIDM0IDEyMCA2MiAyMTEgMTgwIDc2IDExMiA0NCAxMjIgMjI1IDg2IDE4OCAxNjMgMTU3IAorMTU5IDQzIDE5IDExIDEzNCAzNyAyNiAxMzggMTE1IDI0IDE1NCA0MSAxMDQgMTM2IDEyNiAxOTggMjM0IDE0MCBeCis0OTAgMSAxOTIgMjI1IDIyMyA5MCAyMzAgMTIgMTQ2IDEyMCAyMjggMTI2IDM5IDE1MiAxMTUgMTAwIDE0NyA1MCAyOCAyMTYgMTA3IDM1IAorNzUgMTE5IDg1IDIyMCAyMTYgNDQgMTI1IDE3IDE4NSAxNzkgMTIxIDk1IDE2IDcxIDM5IDg5IDIwOCA0MiAyMTAgMTQ0IDE3NiA5MiA3OSAKKzIyOCA5NyAyMyAxMTQgMTQxIDg0IDE3MiAyMzMgNzAgMTc1IDE5OSAxNzYgMTU1IDIzNiAzNiAzMSAxNzkgMjEzIDE1IDExMiAyMjYgCisyMTEgMTYzIDE0NiAyOCA1OCAzMCAxMzEgMjMwIDQxIDE2MiAxNjEgMjAyIDE0MiAxNCAyMTkgNzMgMTQxIDU1IDE1NiAxOTUgOTYgMTU5IAorMjI0IDEwOSAxOTcgMTk4IDEyNSAxNzIgMTIgODMgMjEzIDE3MyAxOTIgMTMwIDUzIDI0MSA3MiA5MCA3MiAxODIgMjQyIDI4IDE1MCAKKzIwMCAyMjcgMTM4IDIxMyAyMzYgOTkgMTg4IDIzNyAxNTAgMTcxIDIxMSAxMDAgMjM5IDIyMCAxMjQgMTI0IDI5IDEwOSAxMyAxMDUgCisxODMgMTA5IDE2OCAxODIgODcgMjAxIDI0NiAxMDggMTQ5IDIxNSAxNTEgMjIyIDE5NCA3NCAxODkgMzggMTMzIDE0NSAxNjQgMTY4IAorMjQ4IDI0NCA5IDE4MyAxNCAyNDggODYgMTc5IDI5IDE3MiAxNzAgMTYzIDExNyAxNSAyMCA1NiAxMTUgOCAyMjQgMjA0IDEyMCA0NCAzMyAKKzk0IDg5IDIxIDE5OSAxOCA3OCA4NSAxOTEgMjAzIDYgMTU0IDEgMjEwIDExNSAxNjMgNTQgMTA4IDIxMiAxMjIgMjA5IDE1NiAxMDMgCisxNzYgNjMgNjYgMTg3IDEyMyAxMCAxMzkgNzcgMTI2IDEzMSA3NSAyMTEgOCA2OSAxMjQgMjE2IDIwMiAyMDUgMTcxIDI3IDcgNDcgMTU0IAorMzAgMjIzIDE1MyAxMzcgNzAgODMgMjkgODAgNjcgMjA5IDkzIDE5MyAxMTggMTI5IDE2MCA4OCAyIDIyOSA4MiA5OSAzMyAxNjAgMjQ2IAorNzkgMTMzIDE3NCAxNzcgMjA2IDIxOSAxMCAyMzEgMjQ3IDIyMiAzOSAyNDcgMzggMTk2IDU1IDIyMiAxMDIgMTU0IDkzIDEzMCAyMTEgCis3MSAyMjYgMTgyIDE1MCAxMDggNTQgNDIgNTUgNjQgMjUgMSA1MiAzNSA5IDIxMiAzMCAzNiA2MCAxOTUgNCAyMzkgMTI4IDIwMSAyOCAKKzEyMSAxODcgMTg2IDE2NyAxOTcgMTEgMzIgMjMwIDE5NiAyMzkgNjUgNDQgMjIwIDE4NyAzMSA4NyA0MyAxNjkgMjA0IDU3IDEzNyAyMjUgCisxNjAgMTgwIDE3MiA3OCAyNDAgMjEgMTA3IDk4IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNTMgNzQgMTYwIDI1IDkyIDE3NCAxNDggMTkzIAorMTgxIDM2IDIxOCAyMiAxNTggODEgMjA2IDEyNyA4NyAxMzUgODkgNTAgMjEyIDU5IDUyIDk4IDE2NiAyMCAyMTQgMTkyIDE1OSA2NiAzMiAKKzQ2IDEwNiA0NyAyNDkgMjAwIDY5IDYxIDU5IDE0NCAyMSAxNSAxNzUgMTM2IDE5IDEwMCA1MiAxMjcgMTgyIDU4IDE4NSAyMDggMTM0IAorMTMzIDI0MCA4NCAxNCAxNTYgMTY2IDgzIDEyMSA5NiAyMjIgMTMxIDE2NyAxMzQgMTA0IDIyNCA0NiA0MCAxNDAgMTkxIDE2IDE2MyAKKzIwOSAxODUgMTE2IDIxNCAzNyA4MiAxNjIgMTkwIDIxNSAxODAgMjM1IDIzNSA0OCAyMDUgMTMgMTk3IDEwMyAyMDUgNzYgMTA0IDE2MSAKKzEzOSAyMzIgMjA2IDM1IDE2NyAzOSAxODEgMTI4IDEzOCAxMTggNjYgMyAzMCA2NSA3MyAyMzMgMjI1IDUgMTAzIDE4IDIzMyAxNjIgOTUgCis0NSA4NCA3NyA2MyAyMjQgMTcgMjcgMTAyIDIxNyAzIDE4OCAxNDUgMjI3IDc1IDU2IDE3OCAxNjUgMzIgMTM4IDI2IDE0MyAxNTcgMTIyIAorMTQzIDI0OSA0NSAyMzkgMTU3IDIxNyA2NiA5NSAyMDMgMTYxIDIzMSAxNTUgNTIgMTkzIDg5IDExNiAxMjIgMTE0IDIzNiA3IDE4IDE0MSAKKzI0MiAyNDkgMTM3IDE2MiAzIDEyNSAyMzggNjkgXgorNTE0IDEgMTM5IDE0MSA3NyAzNyA3NyA0MiA1MCAxNzcgMzcgNSAxMjcgMTUzIDQ1IDE0MyAyMjggMTIxIDE1NiAxNjkgMTIwIDIxOSAKKzI0MSA1MSAxNjYgMjMyIDE5MiAxNTAgMTg4IDUzIDU1IDIyNyAxNDggODIgOTIgMTUwIDE3MiAzIDE5NiAyMzIgMTgyIDYxIDIyOSA2MyAKKzEyMyA5NyAxNzkgMTk0IDM5IDE3MiAyNTAgMTU3IDEzMiAxODcgOTUgMzggMTk5IDk0IDcwIDkzIDExOCAzNyAyMzEgMjQwIDk0IDYwIDQgCisxNTkgNDcgNTggMTEwIDEyNSAyNDMgMjEzIDIzOSAxMzYgNDMgMjI4IDEwNSAxMDYgNjkgMTI1IDEyIDUwIDE5OCAxMjYgMjE2IDExNyAKKzc0IDE3NSAxMTIgNDUgMTY0IDc2IDY5IDE0NiAxMDEgOSAxODggNTggOTQgNzUgMTQzIDIxOCAzMiAxOTcgMTc5IDE5OSA4OSAzMSAyNDUgCisxMjMgNzEgNDAgMTM1IDU0IDMzIDE3MCA4MyAzNCAxMTcgMTAwIDYyIDE3MSAzMCA1MSAxNDUgMTQzIDI0NCAxNjAgNCAxNjQgODYgMTU4IAorMTA1IDkxIDE4MiA2NiAyNyAxNjMgMTE4IDUyIDExOCA0NyA3OSAxOTkgODQgMjMzIDEzNCAxMjggMTA1IDEwMSAxOSAyNSAxNyA4NCA3IAorMjEgMTg3IDkwIDI0MCA5OSA5OSAxMDQgMTU0IDIgMjQ5IDIxNSAxNTQgMTggNDcgNjMgMTQ5IDIyNSAyMzggMTc5IDE3OCA3MiAzIDE5MSAKKzE4MiA4MiA2NiAxMSAxMTMgMTggNTcgMTUyIDEwOCAyMTUgMTU5IDU3IDE0NyA1OCAxMTUgMTY0IDkxIDIwOCAyMDUgODYgMTQ4IDE2IAorMTMyIDE5MiAxNDUgMTM4IDE5NCA2MCA5IDE5OCAxNDcgNTMgNjUgNjQgOTYgMjQyIDE0IDIyMiAxMTkgMjQxIDQ2IDExNiAxMzIgMTk3IAorMTg0IDIzOCAxODkgMjYgMjAwIDYyIDE3NiA4MCAxNTEgMTQwIDEwOSAxODMgMjQgNDQgMTkxIDE3MiAyMzQgMTA3IDIxIDE5MiAxNDAgCis5OSA5NCA2NSA1NCA3IDQyIDI0IDQ5IDIzMCAyMCAyMjkgNzMgMjEyIDQ1IDE2OSAxMTUgMTgwIDE0MSA1NiAyMDAgNDEgODcgMTIxIAorMTYxIDIxOSAyMzEgMjE0IDIwNyAxIDE5IDIwIDIxOSAyMzYgMTIgNTUgMjM3IDIzNyAyMTEgNzIgMTMgMjggMTQxIDcyIDIzOSAxNTIgCis4MiA4NyAxMDAgNzIgOCAyNDEgNDEgNzcgMzIgMjAyIDIyOSA0NyA4NCAyMzggMTg0IDIyOCAxMDAgNjcgMjEwIDEzMCA0NiAxMTEgOTMgCis5NyAxODkgMzEgMjUwIDE2MiAxNzEgMzUgOTAgNCAxMzggMTk5IDk5IDEyMCAxOTMgMTEzIDI0NCAxODEgOTMgMTIzIDc2IDkwIDIzNSAKKzQ5IDI1MSAxMDkgMTg4IDYzIDE0NCAxODYgMTM4IDE4NCAyMjMgNjEgMjA4IDIxNSAxNzUgMTA3IDYgNTMgODEgMTE0IDIwNyAyMzcgCisyMjEgMTYxIDIyNCAxOCA3MyAyMDIgMjA4IDIxMCAxMjUgMjQ4IDExIDk4IDEzMSAyNTAgMTY3IDIyMSAxNDYgODUgMjExIDg4IDYzIAorMTM5IDEzNiAyNyAxODkgNSAxMTEgMTAzIDE4NiAxNDggMjEgMTcxIDUxIDE0MCAxMDQgMTMzIDE2NSA0OSAyMjUgMjMzIDEyOSA3OCA1IAorMTA2IDY0IDg2IDE1MyA1NSAyMzIgMTg3IDExMSA3NyA1OCA4OSAzNiAzMiAyMjMgNjYgNiA3NCAxNzAgNjIgMTk3IDE2OSAxMTAgMTMwIAorNDEgNjEgMjM0IDEwMiAyMzQgOTIgMTQ1IDEzMyAxNTUgMjAxIDE0IDI0MyAyMDggMjAwIDM2IDQ4IDIxIDE2NiAxIDQwIDEwOSAxNzggCisyMjYgMTg1IDE5NiAyMDYgNDMgMiAyNDQgMTY1IDU0IDIzIDgxIDEyNCA0NCAxOTYgMjExIDkzIDEwMiAyMzkgMTMxIDI0NSAxMjggMTEwIAorMTUxIDEzMCAyMCAyMjQgMzQgMTEyIDUwIDIwMyAxNzYgNjQgMTEyIDQwIDExNCAyMTcgNzQgMTgwIDE1MSAxNDUgMTU5IDMxIDE5IDI1MSAKKzEzMCAyNSAyMiAxMzQgMTA3IDE2IDE0MiAyOSAxMDQgMTI4IDEyNiAxOTAgMjMwIDE1IDE5MCAyMjUgMjE3IDkwIDIzMCAxMCAxNDAgCisxMTQgMjIyIDEyNCAzOSAxNDYgMTExIDIxNyBeCis1MTAgMCAxNDcgNDYgMjQgMjE2IDk1IDM1IDc1IDExNSA3MyAyMDggMjA4IDM2IDExMyAxMyAxODUgMTcxIDExMyA5NSA4IDcxIDMxIDgxIAorMjA0IDM0IDE5OCAxNDQgMTY0IDg0IDY3IDIyOCA5MyAxMSAxMDYgMTI5IDc2IDE3MiAyMjUgNjYgMTcxIDE5NSAxNzIgMTQzIDIyNCAzNiAKKzIzIDE2NyAyMDEgNyAxMDQgMjE0IDIwNyAxNTEgMTM4IDIwIDUwIDI2IDEzMSAyMTggMzcgMTYyIDE2MSAxOTQgMTQyIDE0IDIxNSA2NSAKKzE0MSA0NyAxNDQgMTkxIDg4IDE1MSAyMjAgOTcgMTg1IDE5OCAxMTcgMTYwIDc1IDIwNSAxNzMgMTkyIDExOCA0NSAyMjkgNjggODYgNjQgCisxNzQgMjMwIDE2IDEzOCAxOTIgMjI3IDEyNiAyMTMgMjMyIDk1IDE4MCAyMjkgMTUwIDE2MyAxOTkgOTIgMjM1IDIxMiAxMjAgMTI0IDE3IAorMTA1IDkgMTAxIDE3OSAxMDkgMTU2IDE3MCA4MyAyMDEgMjM0IDEwMCAxNDkgMjE1IDE0NyAyMTggMTgyIDYyIDE3NyAzMCAxMzMgMTMzIAorMTYwIDE2NCAyNDggMjQwIDkgMTgzIDIgMjQ0IDc0IDE3NSAyNSAxNjQgMTY2IDE2MyAxMDkgMTEgMTYgNDggMTExIDggMjE2IDIwNCAKKzExNiA0MCAyNSA4MiA4OSA5IDE5MSA2IDc0IDg1IDE3OSAxOTkgMiAxNTQgMjQ3IDIxMCAxMTUgMTU1IDUwIDEwOCAyMDggMTE4IDIwOSAKKzE0OCAxMDMgMTc2IDU1IDU4IDE3NSAxMTUgMTAgMTMxIDczIDExOCAxMjcgNzEgMjAzIDQgNjkgMTE2IDIxMiAyMDIgMjAxIDE3MSAyMyAKKzI0OSA0MyAxNDIgMjIgMjE5IDE0OSAxMzMgNzAgODMgMjkgNzYgNjcgMjAxIDg5IDE4MSAxMTQgMTI1IDE1NiA4MCAyIDIxNyA3MCA5MSAKKzMzIDE2MCAyNDYgNzEgMTIxIDE2MiAxNjkgMTk4IDIwNyA2IDIxOSAyMzkgMjE0IDM1IDI0NyAzOCAxOTIgNTUgMjIyIDk0IDE1MCA4MSAKKzEyMiAyMTEgNjMgMjI2IDE3OCAxNDIgMTA0IDQyIDMwIDUxIDU2IDI1IDI0NiAyNDMgNDQgMjcgMjUxIDIxMiAzMCAyNCA1MiAxOTUgCisyMzkgMTI0IDE4OSAyOCAxMDkgMTgzIDE3NCAxNjcgMTkzIDMgMjAgMjIyIDE4NCAyMzEgNjUgMzIgMjIwIDE3OSAyNyA3OSAzNSAxNjUgCisxOTYgNTcgMTM3IDIxNyAxNTIgMTY4IDE2OCA3OCAyMzIgMTMgMTAzIDk0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNDEgNzQgMTQ4IDIxIAorODAgMTc0IDE0MCAxODkgMTczIDI4IDIxOCAxMCAxNTggNzcgMjAyIDExOSA3NSAxMjMgNzcgMzggMjAwIDU5IDUyIDg2IDE1NCAyMCAKKzIxNCAxODAgMTQ3IDU0IDI4IDQ2IDEwNiAzOSAyNDkgMTg4IDYxIDU3IDU1IDE0MCAxNyAxNSAxNjMgMTM2IDE1IDEwMCA0MCAxMTUgCisxODIgNTQgMTczIDIwMCAxMjIgMTI5IDI0MCA3MiA2IDE1NiAxNjIgNzkgMTE3IDI0MiA5NiAyMTAgMTIzIDE1OSAxMzQgMTAwIDIxMiAKKzM4IDI4IDEzNiAxODcgNCAxNTkgMTk3IDE3NyAxMTIgMjEwIDMzIDc4IDE1MCAxOTAgMjAzIDE3NiAyMjcgMjM1IDQwIDE5NyA1IDE4OSAKKzkxIDIwNSA2NCA5MiAxNTMgMTM1IDIyMCAyMDYgMzEgMTYzIDI3IDE2OSAxMTYgMTMwIDEwNiA2NiAyNTMgMTggNTMgNjEgMjI5IDIxMyAKKzUgOTkgMTAgMjIxIDE1NCA4MyAzNyA4MCA2NSA1OSAyMjQgOSAxOSAxMDIgMjA5IDMgMTg0IDE0MSAyMTkgNjcgNTYgMTcwIDE2NSAyNCAKKzEzNCAxOCAxMzUgMTU3IDExMCAxMzEgMjQ1IDQxIDIyNyAxNTMgMjE3IDYyIDg3IDIwMyAxNDkgMjIzIDE1MSA0OCAxOTMgODUgMTE2IAorMTIyIDEwMiAyMzYgNyAxNCAxMzMgMjQyIDI0MSAxMjkgMTU4IDI0OSAxMjUgMjM4IDE1NyAxMzcgMTM1IDc1IDMzIDI1MCA3MyAzNiA1MCAKKzE3MSAzMSAyNTMgMTI3IDE1MyA0NSAxMzkgMjIyIDEyMSAxNTQgMTY1IDExNCAyMTUgMjM3IDQ1IDE2NiAyMjYgMTg2IDE0NiAxODggNTMgCis1MyAyMjUgMTQ4IDI0OCAxMTggXgorNTMzIDAgODcgMTQ1IDE1NyAyNTAgMTgxIDIyNyAxNzcgNTEgMjI0IDYzIDEwOCA5NyAxNzQgMTk0IDI0IDE2MiAyNTAgMTUyIDEzMiAKKzE4MiA4MCAzMyAxODkgODQgNjAgODMgMTE4IDM3IDIxNiAyMzUgOTQgNjAgMjUxIDE1NCA0NyA0OCAxMTAgMTIwIDIzOCAyMDggMjI5IAorMTIxIDQzIDIxOCA5MCA5MSA2NCAxMTAgMTIgNDAgMTkzIDExMSAyMTEgMTE3IDY0IDE3MCAxMDcgMzUgMTY0IDc2IDU0IDE0MSAxMDEgNCAKKzE4MyA1MyA3OSA2MCAxNDMgMjEzIDMyIDE4NyAxNjkgMTk0IDg0IDMxIDI0NSAxMjMgNjYgMjUgMTM1IDM5IDIzIDE2MCA3OCAyOSAxMDIgCis5NSA2MiAxNjYgMjAgNDYgMTM1IDEyOCAyNDQgMTUwIDI0NiAxNTQgNzYgMTQzIDEwNSA5MSAxNzIgNTEgMjcgMTU4IDEwMyAzNyAxMDggCiszNyA3OSAxOTkgODQgMjI4IDExOSAxMjggOTUgOTEgNCAxNSAxNyA2OSAyIDExIDE4NyA4MCAyMzAgOTQgODkgODkgMTQ5IDI0NCAyMzkgCisyMTAgMTQ0IDE4IDQyIDQ4IDEzOSAyMTUgMjMzIDE3OSAxNjMgMjUyIDY3IDI1NSAxODEgMTY3IDgyIDU2IDI1MyA5OCA4IDQyIDEzNyAKKzEwMyAyMDUgMTQ0IDQ3IDEzNyA0MyAxMTAgMTQ5IDc2IDIwMyAyMDAgODYgMTQzIDE2IDEyNyAxODIgMTQwIDEyOCAxODQgNTUgMjUxIAorMTgzIDE0MiA0MyA1MCA1NCA4MSAyMzIgOSAyMTIgMTE5IDIzNiAzNiAxMDYgMTIyIDE4MiAxNjkgMjIzIDE3OSAyNiAxODUgNTcgMTY2IAorODAgMTQxIDEzMCA5OSAxNzggMjQgNDQgMTkxIDE2NyAyMTkgOTIgNiAxODcgMTQwIDk5IDg5IDYwIDU0IDI0OSA0MiAxOSA0NCAyMjAgNSAKKzIxNCA2MyAxOTcgMzAgMTY0IDEwNSAxODAgMTM2IDQxIDE5NSAyNiA3NyAxMTYgMTUxIDIxOSAyMzEgMjA0IDIwMiAxIDkgMTUgMjE0IAorMjMxIDcgNDAgMjIyIDIzNyAyMDYgNTcgMjU1IDEzIDEzMSA3MiAyMjQgMTUyIDcyIDg3IDg1IDYyIDI1NSAyNDEgMzYgNzcgMjcgMTg3IAorMjI5IDMyIDc5IDIyOCAxNzkgMjIzIDkwIDYyIDE5NSAxMTUgNDEgMTA2IDkzIDg3IDE3NCAyNiAyNDUgMTUyIDE2MSAyMCA3NSA0IDEyMyAKKzE4NCA4NCAxMjAgMTc4IDExMyAyMzQgMTgxIDc4IDExOCA2NiA4NSAyMzAgMzQgMjUxIDk0IDE3OCA1MyAxMzkgMTg2IDEzOCAxODQgCisyMjMgNjEgMTkzIDIwMCAxNzUgMTA3IDYgMzggODEgMTE0IDIwNyAyMjcgMjA2IDE0NiAyMTkgMyA3MyAxOTcgMTk4IDIwMCAxMTUgMjM4IAorMTEgOTggMTE2IDI0MCAxNTIgMjIxIDE0NiA3MCAyMDEgODggNTggMTM5IDEyNiAxMiAxODkgMjUyIDk2IDkzIDE3NiAxMzggMTYgMTU2IAorNTEgMTM1IDk5IDExOCAxNTUgNDkgMjIwIDIzMyAxMTkgNjggOTYgNjQgODEgMTQzIDQ1IDIyMiAxNzcgMTExIDYyIDU4IDc5IDMxIDE3IAorMjE4IDYxIDI1MyA2OSAxNzAgNDcgMTk3IDE2OSAxMDUgMTIwIDQxIDQ2IDIyNCA5MiAyMzQgOTIgMTQ1IDEyOCAxNTUgMTg2IDI1NiAKKzI0MyAyMDggMjAwIDI2IDQ4IDIxIDE1NiAyNDggNDAgMTA0IDE3OCAyMjEgMTc1IDE5NiAxOTYgMjggMjQ5IDIzOSAxNTAgNDkgMjMgNzEgCisxMTQgMzkgMTkxIDE5NiA4OCA4NyAyMzQgMTIxIDI0MCAxMjMgOTUgMTUxIDEzMCAxMCAyMTQgMzQgMTAyIDM1IDE5MyAxNzEgNDkgMTEyIAorMzUgMTA0IDIwNyA1OSAxNzAgMTM2IDEzMCAxNTkgMTYgMTkgMjQxIDEyNSAxMCAxNyAxMjkgOTcgNiAxMjcgMTQgMTA0IDExOCAxMjYgCisxODAgMjI1IDUgMTg1IDIyNSAyMDIgOTAgMjMwIDUgMTI1IDk5IDIwNyAxMTkgMzkgMTMxIDEwMSA5MyAxNDcgNDMgMjEgMjE2IDg2IDM1IAorNzUgMTEyIDY0IDE5OSAyMDIgMzAgMTA0IDEwIDE4NSAxNjUgMTA3IDk1IDIgNzEgMjUgNzUgMjAxIDI4IDE4OSAxNDQgMTU1IDc4IDU4IAorMjI4IDkwIDIgMTAwIDEyMCA3MCAxNzIgMjE5IDYzIDE2OCAxOTIgMTY5IDEzNCAyMTUgMzYgMTcgMTU4IDE5MiAxIDk4IDIwNSAxMzcgXgorNTIyIDEgMTM5IDEzMCAxMiA0MiAyMiAxMzEgMjA2IDMzIDE2MiAxNjEgMTg2IDE0MiAxNCAyMTEgNTcgMTQxIDM5IDEzMiAxODcgODAgCisxNDMgMjE2IDg1IDE3MyAxOTggMTA5IDE0OCAyNDYgNjcgMTk3IDE3MyAxOTIgMTA2IDM3IDIxNyA2NCA4MiA1NiAxNjYgMjE4IDQgMTI2IAorMTg0IDIyNyAxMTQgMjEzIDIyOCA5MSAxNzIgMjIxIDE1MCAxNTUgMTg3IDg0IDIzMSAyMDQgMTE2IDEyNCA1IDEwMSA1IDk3IDE3NSAKKzEwOSAxNDQgMTU4IDc5IDIwMSAyMjIgOTIgMTQ5IDIxNSAxNDMgMjE0IDE3MCA1MCAxNjUgMjIgMTMzIDEyMSAxNTYgMTYwIDI0OCAyMzYgCis5IDE4MyAyNDggMjQwIDYyIDE3MSAyMSAxNTYgMTYyIDE2MyAxMDEgNyAxMiA0MCAxMDcgOCAyMDggMjA0IDExMiAzNiAxNyA3MCA4OSAKKzI1NSAxODMgMjUyIDcwIDg1IDE2NyAxOTUgMjU2IDE1NCAyNDMgMjEwIDExNSAxNDcgNDYgMTA4IDIwNCAxMTQgMjA5IDE0MCAxMDMgCisxNzYgNDcgNTAgMTYzIDEwNyAxMCAxMjMgNjkgMTEwIDEyMyA2NyAxOTUgNjkgMTA4IDIwOCAyMDIgMTk3IDE3MSAxOSAyNDEgMzkgMTMwIAorMTQgMjE1IDE0NSAxMjkgNzAgODMgMjkgNzIgNjcgMTkzIDg1IDE2OSAxMTAgMTIxIDE1MiA3MiAyIDIwNSA1OCA4MyAzMyAxNjAgMjQ2IAorNjMgMTA5IDE1MCAxNjEgMTkwIDE5NSAyIDIwNyAyMzEgMjA2IDMxIDI0NyAzOCAxODggNTUgMjIyIDg2IDE0NiA2OSAxMTQgMjExIDU1IAorMjI2IDE3NCAxMzQgMTAwIDMwIDE4IDQ3IDQ4IDI1IDI0MiAyMzUgMzYgMTkgMjQzIDIxMiAzMCAxMiA0NCAxOTUgMjU0IDIzOSAxMjAgCisxNzcgMjggOTcgMTc5IDE2MiAxNjcgMTg5IDI1MyA4IDIxNCAxNzIgMjIzIDY1IDIwIDIyMCAxNzEgMjMgNzEgMjcgMTYxIDE4OCA1NyAKKzEzNyAyMDkgMTQ0IDE1NiAxNjQgNzggMjI0IDUgOTkgOTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEyOSA3NCAxMzYgMTcgNjggMTc0IAorMTMyIDE4NSAxNjUgMjAgMjE4IDI1NiAxNTggNzMgMTk4IDExMSA2MyAxMTEgNjUgMjYgMTg4IDU5IDUyIDc0IDE0MiAyMCAyMTQgMTY4IAorMTM1IDQyIDI0IDQ2IDEwNiAzMSAyNDkgMTc2IDUzIDUzIDUxIDEzNiAxMyAxNSAxNTEgMTM2IDExIDEwMCAyOCAxMDMgMTgyIDUwIDE2MSAKKzE5MiAxMTAgMTI1IDI0MCA2MCAyNTYgMTU2IDE1OCA3NSAxMTMgMjM0IDk2IDE5OCAxMTUgMTUxIDEzNCA5NiAyMDAgMzAgMTYgMTMyIAorMTgzIDI1MCAxNTUgMTg1IDE2OSAxMDggMjA2IDI5IDc0IDEzOCAxOTAgMTkxIDE3MiAyMTkgMjM1IDMyIDE4OSAyNTUgMTgxIDc5IDIwNSAKKzUyIDgwIDE0NSAxMzEgMjA4IDIwNiAyNyAxNTkgMTUgMTU3IDEwNCAxMjIgOTQgNjYgMjUzIDYgNDEgNDkgMjI1IDIwMSA1IDk1IDIgCisyMDkgMTQ2IDcxIDI5IDc2IDUzIDU1IDIyNCAxIDExIDEwMiAyMDEgMyAxODAgMTM3IDIxMSA1OSA1NiAxNjIgMTY1IDE2IDEzMCAxMCAKKzEyNyAxNTcgOTggMTE5IDI0MSAzNyAyMTUgMTQ5IDIxNyA1OCA3OSAyMDMgMTM3IDIxNSAxNDcgNDQgMTkzIDgxIDExNiAxMjIgOTAgCisyMzYgNyAxMCAxMjUgMjQyIDIzMyAxMjEgMTU0IDI0NSAxMjUgMjM4IDE0NSAxMzMgMTIzIDcxIDI1IDI0NiA2NSAyNCA1MCAxNTkgMTkgCisyNDUgMTI3IDE1MyA0NSAxMzEgMjEwIDEyMSAxNTAgMTU3IDEwMiAyMDcgMjI5IDMzIDE2NiAyMTQgMTc0IDEzOCAxODggNTMgNDkgMjIxIAorMTQ4IDI0MCA2NCA4NiAxNDQgMTU0IDI0OSAxNzggMjI2IDE3NiA0OSAyMjMgNjMgMTA1IDk3IDE3MyAxOTQgMjEgMTYwIDI1MCAxNTEgCisxMzIgMTgxIDc3IDMyIDE4NyA4MiA1OCA4MSAxMTggMzcgMjEzIDIzNCA5NCA2MCAyNTAgMTUzIDQ3IDQ2IDExMCAxMTkgMjM3IDIwNyAKKzIyNyAxMTggNDMgMjE2IDg3IDg4IDYzIDEwNyAxMiAzOCAxOTIgMTA4IDIxMCAxMTcgNjIgMTY5IDEwNiAzMyAxNjQgNzYgNTEgMjExIF4KKzU0MCAwIDEwMSAxIDE4MCA1MCA3MCA1MSAxNDMgMjEwIDMyIDE4MSAxNjMgMTkxIDgxIDMxIDI0NSAxMjMgNjMgMTYgMTM1IDMwIDE3IAorMTU0IDc1IDI2IDkzIDkyIDYyIDE2MyAxNCA0MyAxMjkgMTE5IDI0NCAxNDQgMjQwIDE0OCA3MCAxMzQgMTA1IDkxIDE2NiA0MiAyNyAKKzE1NSA5NCAyOCAxMDIgMzEgNzkgMTk5IDg0IDIyNSAxMTAgMTI4IDg5IDg1IDI1NSA5IDE3IDYwIDI1OSA1IDE4NyA3NCAyMjQgOTEgODMgCis4MCAxNDYgMjM4IDIzMyAyMDcgMTM4IDE4IDM5IDM5IDEzMyAyMDkgMjMwIDE3OSAxNTQgMjUyIDY0IDI1NSAxNzUgMTU4IDgyIDUwIAorMjQ3IDg5IDIgMzMgMTI4IDEwMCAxOTkgMTM1IDQxIDEzMSAzNCAxMDcgMTQwIDY3IDIwMCAxOTcgODYgMTQwIDE2IDEyNCAxNzYgMTM3IAorMTIyIDE3OCA1MiAyNDUgMTc0IDEzOSAzNyA0MSA0OCA3MiAyMjYgNiAyMDYgMTE5IDIzMyAzMCAxMDAgMTE2IDE3MyAxNjAgMjE0IDE3MyAKKzI2IDE3NiA1NCAxNjAgODAgMTM1IDEyNCA5MyAxNzUgMjQgNDQgMTkxIDE2NCAyMTAgODMgMjU3IDE4NCAxNDAgOTkgODYgNTcgNTQgCisyNDMgNDIgMTYgNDEgMjE0IDI1NiAyMDUgNTcgMTg4IDIxIDE2MSA5OSAxODAgMTMzIDMyIDE5MiAxNyA3MSAxMTMgMTQ1IDIxOSAyMzEgCisxOTggMTk5IDEgMyAxMiAyMTEgMjI4IDQgMzEgMjEzIDIzNyAyMDMgNDggMjQ5IDQgMTI1IDcyIDIxNSAxNTIgNjYgODcgNzYgNTYgMjUyIAorMjQxIDMzIDc3IDI0IDE3OCAyMjkgMjMgNzYgMjIyIDE3NiAyMjAgODQgNTkgMTg2IDEwNiAzOCAxMDMgOTMgODEgMTY1IDIzIDI0MiAKKzE0NiAxNTUgMTEgNjYgNCAxMTQgMTc1IDc1IDEyMCAxNjkgMTEzIDIyOCAxODEgNjkgMTE1IDYwIDgyIDIyNyAyNSAyNTEgODUgMTcyIAorNDcgMTM2IDE4NiAxMzggMTg0IDIyMyA2MSAxODQgMTkxIDE3NSAxMDcgNiAyOSA4MSAxMTQgMjA3IDIyMSAxOTcgMTM3IDIxNiAyNTQgCis3MyAxOTQgMTkyIDE5NCAxMDkgMjMyIDExIDk4IDEwNyAyMzQgMTQzIDIyMSAxNDYgNjEgMTk1IDg4IDU1IDEzOSAxMjAgMyAxODkgMjQ5IAorODcgODcgMTcwIDEzMiAxMyAxNDcgNTEgMTMyIDk2IDEwOSAxNDkgNDkgMjE3IDIzMyAxMTMgNjIgMjU3IDkwIDY0IDc4IDEzNyAzOSAKKzIxNiAxNzEgMTExIDUzIDU4IDczIDI4IDggMjE1IDU4IDI1MCA2NiAxNzAgMzggMTk3IDE2OSAxMDIgMTE0IDQxIDM3IDIxOCA4NiAyMzQgCis5MiAxNDUgMTI1IDE1NSAxNzcgMjUwIDI0MyAyMDggMjAwIDIwIDQ4IDIxIDE1MCAyNDUgNDAgMTAxIDE3OCAyMTggMTY5IDE5NiAxOTAgCisxOSAyNDYgMjM2IDE0MSA0NiAyMyA2NSAxMDggMzYgMTg4IDE4NyA4NSA3OCAyMzEgMTE1IDIzNyAxMjAgODYgMTUxIDEzMCA0IDIwOCAKKzM0IDk2IDI2IDE4NyAxNjggNDAgMTEyIDMyIDk4IDIwMSA1MCAxNjQgMTI3IDEyMSAxNTkgNyAxOSAyMzUgMTIyIDEgMTQgMTI2IDkxIAorMTE4IDUgMTA0IDExMiAxMjYgMTc0IDIyMiAyNTkgMTgyIDIyNSAxOTMgOTAgMjMwIDIgMTE2IDkwIDE5OCAxMTYgMzkgMTIyIDk1IDkwIAorMTQ3IDQwIDE4IDIxNiA3NyAzNSA3NSAxMDkgNTUgMTkwIDE5NiAyNCA5NSA3IDE4NSAxNTkgMTAxIDk1IDI1NiA3MSAxOSA2OSAxOTggCisyMiAxODAgMTQ0IDE0NiA3MiA0OSAyMjggODcgMjUzIDk0IDExMSA2NCAxNzIgMjEzIDYwIDE2NSAxODkgMTY2IDEyNSAyMDYgMzYgMTEgCisxNDkgMTgzIDI1NSA5MiAxOTYgMjAxIDEzMyAxMjYgOCAzOCAyMCAxMzEgMjAwIDMxIDE2MiAxNjEgMTgyIDE0MiAxNCAyMDkgNTMgMTQxIAorMzUgMTI2IDE4NSA3NiAxMzkgMjE0IDc5IDE2NyAxOTggMTA1IDE0MiAyNDIgNjMgMTkzIDE3MyAxOTIgMTAwIDMzIDIxMSA2MiA4MCA1MiAKKzE2MiAyMTIgMjU4IDEyMCAxODAgMjI3IDEwOCAyMTMgMjI2IDg5IDE2OCAyMTcgMTUwIDE1MSAxODEgODAgMjI5IDIwMCAxMTQgMTI0IAorMjU5IDk5IDMgOTUgMTczIDEwOSAxMzggMTUyIDc3IDIwMSAxMjkgXgorNTU1IDAgODQgMTQ5IDIxNSAxMzkgMjEwIDE1OCAzOCAxNTMgMTQgMTMzIDEwOSAxNTIgMTU2IDI0OCAyMzIgOSAxODMgMjQwIDIzNiA1MCAKKzE2NyAxNyAxNDggMTU4IDE2MyA5MyAzIDggMzIgMTAzIDggMjAwIDIwNCAxMDggMzIgOSA1OCA4OSAyNDcgMTc1IDI0NCA2NiA4NSAxNTUgCisxOTEgMjU2IDE1NCAyMzkgMjEwIDExNSAxMzkgNDIgMTA4IDIwMCAxMTAgMjA5IDEzMiAxMDMgMTc2IDM5IDQyIDE1MSA5OSAxMCAxMTUgCis2NSAxMDIgMTE5IDYzIDE4NyAyNTggNjkgMTAwIDIwNCAyMDIgMTkzIDE3MSAxNSAyMzMgMzUgMTE4IDYgMjExIDE0MSAxMjUgNzAgODMgCisyOSA2OCA2NyAxODUgODEgMTU3IDEwNiAxMTcgMTQ4IDY0IDIgMTkzIDQ2IDc1IDMzIDE2MCAyNDYgNTUgOTcgMTM4IDE1MyAxODIgMTgzIAorMjYwIDE5NSAyMjMgMTk4IDI3IDI0NyAzOCAxODQgNTUgMjIyIDc4IDE0MiA1NyAxMDYgMjExIDQ3IDIyNiAxNzAgMTI2IDk2IDE4IDYgCis0MyA0MCAyNSAyMzggMjI3IDI4IDExIDIzNSAyMTIgMzAgMzYgMTk1IDI1NCAyMzkgMTE2IDE2NSAyOCA4NSAxNzUgMTUwIDE2NyAxODUgCisyNDkgMjU4IDIwNiAxNjAgMjE1IDY1IDggMjIwIDE2MyAxOSA2MyAxOSAxNTcgMTgwIDU3IDEzNyAyMDEgMTM2IDE0NCAxNjAgNzggMjE2IAorMjU5IDk1IDg2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxMTcgNzQgMTI0IDEzIDU2IDE3NCAxMjQgMTgxIDE1NyAxMiAyMTggMjQ4IDE1OCAKKzY5IDE5NCAxMDMgNTEgOTkgNTMgMTQgMTc2IDU5IDUyIDYyIDEzMCAyMCAyMTQgMTU2IDEyMyAzMCAyMCA0NiAxMDYgMjMgMjQ5IDE2NCAKKzQ1IDQ5IDQ3IDEzMiA5IDE1IDEzOSAxMzYgNyAxMDAgMTYgOTEgMTgyIDQ2IDE0OSAxODQgOTggMTIxIDI0MCA0OCAyNTIgMTU2IDE1NCAKKzcxIDEwOSAyMjYgOTYgMTg2IDEwNyAxNDMgMTM0IDkyIDE4OCAyMiA0IDEyOCAxNzkgMjQyIDE1MSAxNzMgMTYxIDEwNCAyMDIgMjUgNzAgCisxMjYgMTkwIDE3OSAxNjggMjExIDIzNSAyNCAxODEgMjUxIDE3MyA2NyAyMDUgNDAgNjggMTM3IDEyNyAxOTYgMjA2IDIzIDE1NSAzIAorMTQ1IDkyIDExNCA4MiA2NiAyNTMgMjU2IDI5IDM3IDIyMSAxODkgNSA5MSAyNTYgMTk3IDEzOCA1OSAyMSA3MiA0MSA1MSAyMjQgMjU1IAorMyAxMDIgMTkzIDMgMTc2IDEzMyAyMDMgNTEgNTYgMTU0IDE2NSA4IDEyNiAyIDExOSAxNTcgODYgMTA3IDIzNyAzMyAyMDMgMTQ1IDIxNyAKKzU0IDcxIDIwMyAxMjUgMjA3IDE0MyA0MCAxOTMgNzcgMTE2IDEyMiA3OCAyMzYgNyA2IDExNyAyNDIgMjI1IDExMyAxNTAgMjQxIDEyNSAKKzIzOCAxMzMgMTI5IDExMSA2NyAxNyAyNDIgNTcgMTIgNTAgMTQ3IDcgMjM3IDEyNyAxNTMgNDUgMTIzIDE5OCAxMjEgMTQ2IDE0OSA5MCAKKzE5OSAyMjEgMjEgMTY2IDIwMiAxNjIgMTMwIDE4OCA1MyA0NSAyMTcgMTQ4IDIzMiA1MiA4MiAxNDAgMTQyIDI0NSAxNjYgMjIyIDE3MiAKKzQxIDIxOSA2MyA5MyA5NyAxNjkgMTk0IDkgMTUyIDI1MCAxNDcgMTMyIDE3NyA2NSAyOCAxNzkgNzQgNTAgNzMgMTE4IDM3IDIwMSAyMzAgCis5NCA2MCAyNDYgMTQ5IDQ3IDM4IDExMCAxMTUgMjMzIDIwMyAyMTkgMTA2IDQzIDIwOCA3NSA3NiA1OSA5NSAxMiAzMCAxODggOTYgMjA2IAorMTE3IDU0IDE2NSAxMDIgMjUgMTY0IDc2IDM5IDEzNiAxMDEgMjYxIDE3OCA0OCA2NCA0NSAxNDMgMjA4IDMyIDE3NyAxNTkgMTg5IDc5IAorMzEgMjQ1IDEyMyA2MSAxMCAxMzUgMjQgMTMgMTUwIDczIDI0IDg3IDkwIDYyIDE2MSAxMCA0MSAxMjUgMTEzIDI0NCAxNDAgMjM2IDE0NCAKKzY2IDEyOCAxMDUgOTEgMTYyIDM2IDI3IDE1MyA4OCAyMiA5OCAyNyA3OSAxOTkgODQgMjIzIDEwNCAxMjggODUgODEgMjUxIDUgMTcgNTQgCisyNTkgMSAxODcgNzAgMjIwIDg5IDc5IDc0IDE0NCAyMzQgMjI5IDIwNSAxMzQgMTggMzcgMzMgMTI5IDIwNSAyMjggMTc5IDE0OCAyNTIgCis2MiAyNTUgMTcxIDE1MiA4MiA0NiAyNDMgODMgMjYwIDI3IDEyMiA5OCAxOTUgMTI5IDM3IDEyNyAyOCAxMDUgMTM0IDIwNyBeCis1NDUgMSAxOTYgMTkzIDg2IDEzNiAxNiAxMjAgMTY4IDEzMyAxMTQgMTcwIDQ4IDIzNyAxNjIgMTM1IDI5IDI5IDQwIDYwIDIxOCAyIAorMTk4IDExOSAyMjkgMjIgOTIgMTA4IDE2MSAxNDggMjAyIDE2NSAyNiAxNjQgNTAgMTUyIDgwIDEyNyAxMTYgODUgMTcxIDI0IDQ0IDE5MSAKKzE2MCAxOTggNzEgMjQ5IDE4MCAxNDAgOTkgODIgNTMgNTQgMjM1IDQyIDEyIDM3IDIwNiAyNDggMTkzIDQ5IDE3NiA5IDE1NyA5MSAxODAgCisxMjkgMjAgMTg4IDUgNjMgMTA5IDEzNyAyMTkgMjMxIDE5MCAxOTUgMSAyNTkgOCAyMDcgMjI0IDE5IDIwMSAyMzcgMTk5IDM2IDI0MSAKKzI1NiAxMTcgNzIgMjAzIDE1MiA1OCA4NyA2NCA0OCAyNDggMjQxIDI5IDc3IDIwIDE2NiAyMjkgMTEgNzIgMjE0IDE3MiAyMTYgNzYgNTUgCisxNzQgOTQgMzQgOTkgOTMgNzMgMTUzIDE5IDIzOCAxMzggMTQ3IDI2MyA1NCA0IDEwMiAxNjMgNjMgMTIwIDE1NyAxMTMgMjIwIDE4MSAKKzU3IDExMSA1MiA3OCAyMjMgMTMgMjUxIDczIDE2NCAzOSAxMzIgMTg2IDEzOCAxODQgMjIzIDYxIDE3MiAxNzkgMTc1IDEwNyA2IDE3IAorODEgMTE0IDIwNyAyMTMgMTg1IDEyNSAyMTIgMjQ2IDczIDE5MCAxODQgMTg2IDEwMSAyMjQgMTEgOTggOTUgMjI2IDEzMSAyMjEgMTQ2IAorNDkgMTg3IDg4IDUxIDEzOSAxMTIgMjU1IDE4OSAyNDUgNzUgNzkgMTYyIDEyNCA5IDEzNSA1MSAxMjggOTIgOTcgMTQxIDQ5IDIxMyAKKzIzMyAxMDUgNTQgMjU3IDgyIDY0IDc0IDEyOSAzMSAyMDggMTYzIDExMSA0MSA1OCA2NSAyNCAyNjAgMjExIDU0IDI0NiA2MiAxNzAgMjYgCisxOTcgMTY5IDk4IDEwNiA0MSAyNSAyMTAgNzggMjM0IDkyIDE0NSAxMjEgMTU1IDE2NSAyNDIgMjQzIDIwOCAyMDAgMTIgNDggMjEgMTQyIAorMjQxIDQwIDk3IDE3OCAyMTQgMTYxIDE5NiAxODIgNyAyNDIgMjMyIDEyOSA0MiAyMyA1NyAxMDAgMzIgMTg0IDE3NSA4MSA2NiAyMjcgCisxMDcgMjMzIDExNiA3NCAxNTEgMTMwIDI2MCAyMDAgMzQgODggMTQgMTc5IDE2NCAyOCAxMTIgMjggOTAgMTkzIDM4IDE1NiAxMTUgMTA5IAorMTU5IDI1OSAxOSAyMjcgMTE4IDI1MyAxMCAxMjIgODMgMjU2IDEwNiAyNTcgMTA0IDEwNCAxMjYgMTY2IDIxOCAyNTUgMTc4IDIyNSAKKzE4MSA5MCAyMzAgMjYyIDEwNCA3OCAxODYgMTEyIDM5IDExMCA4NyA4NiAxNDcgMzYgMTQgMjE2IDY1IDM1IDc1IDEwNSA0MyAxNzggCisxODggMTYgODMgMyAxODUgMTUxIDkzIDk1IDI1MiA3MSAxMSA2MSAxOTQgMTQgMTY4IDE0NCAxMzQgNjQgMzcgMjI4IDgzIDI0NSA4NiAKKzk5IDU2IDE3MiAyMDUgNTYgMTYxIDE4NSAxNjIgMTEzIDE5NCAzNiAzIDEzNyAxNzEgMjUxIDg0IDE4NCAxOTcgMTIxIDExOCAzMCAxNiAKKzEzMSAxODggMjcgMTYyIDE2MSAxNzQgMTQyIDE0IDIwNSA0NSAxNDEgMjcgMTE0IDE4MSA2OCAxMzEgMjEwIDY3IDE1NSAxOTggOTcgCisxMzAgMjM0IDU1IDE4NSAxNzMgMTkyIDg4IDI1IDE5OSA1OCA3NiA0NCAxNTQgMjAwIDI1MCAxMDggMTcyIDIyNyA5NiAyMTMgMjIyIDg1IAorMTYwIDIwOSAxNTAgMTQzIDE2OSA3MiAyMjUgMTkyIDExMCAxMjQgMjUxIDk1IDI2MyA5MSAxNjkgMTA5IDEyNiAxNDAgNzMgMjAxIDIwNCAKKzgwIDE0OSAyMTUgMTM3IDIwOCAxNTIgMzIgMTQ3IDEwIDEzMyAxMDMgMTUwIDE1NCAyNDggMjMwIDkgMTgzIDIzNiAyMzQgNDQgMTY1IAorMTUgMTQ0IDE1NiAxNjMgODkgMSA2IDI4IDEwMSA4IDE5NiAyMDQgMTA2IDMwIDUgNTIgODkgMjQzIDE3MSAyNDAgNjQgODUgMTQ5IDE4OSAKKzI1NiAxNTQgMjM3IDIxMCAxMTUgMTM1IDQwIDEwOCAxOTggMTA4IDIwOSAxMjggMTAzIDE3NiAzNSAzOCAxNDUgOTUgMTAgMTExIDYzIAorOTggMTE3IDYxIDE4MyAyNTggNjkgOTYgMjAyIDIwMiAxOTEgMTcxIDEzIDIyOSAzMyAxMTIgMiAyMDkgMTM5IDEyMyA3MCA4MyAyOSA2NiAKKzY3IDE4MSA3OSAxNTEgMTA0IDExNSAxNDYgNjAgMiAxODcgNDAgNzEgMzMgMTYwIDI0NiA1MSA5MSAxMzIgMTc4IF4KKzU2MyAxIDE3NCAxNzEgMjYwIDE4MyAyMTUgMTkwIDIzIDI0NyAzOCAxODAgNTUgMjIyIDcwIDEzOCA0NSA5OCAyMTEgMzkgMjI2IDE2NiAKKzExOCA5MiA2IDI2MCAzOSAzMiAyNSAyMzQgMjE5IDIwIDMgMjI3IDIxMiAzMCAyNTQgMjggMTk1IDI1NCAyMzkgMTEyIDE1MyAyOCA3MyAKKzE3MSAxMzggMTY3IDE4MSAyNDUgMjUwIDE5OCAxNDggMjA3IDY1IDI2MiAyMjAgMTU1IDE1IDU1IDExIDE1MyAxNzIgNTcgMTM3IDE5MyAKKzEyOCAxMzIgMTU2IDc4IDIwOCAyNTUgOTEgODIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEwNSA3NCAxMTIgOSA0NCAxNzQgMTE2IDE3NyAKKzE0OSA0IDIxOCAyNDAgMTU4IDY1IDE5MCA5NSAzOSA4NyA0MSAyIDE2NCA1OSA1MiA1MCAxMTggMjAgMjE0IDE0NCAxMTEgMTggMTYgNDYgCisxMDYgMTUgMjQ5IDE1MiAzNyA0NSA0MyAxMjggNSAxNSAxMjcgMTM2IDMgMTAwIDQgNzkgMTgyIDQyIDEzNyAxNzYgODYgMTE3IDI0MCAKKzM2IDI0OCAxNTYgMTUwIDY3IDEwNSAyMTggOTYgMTc0IDk5IDEzNSAxMzQgODggMTc2IDE0IDI1OCAxMjQgMTc1IDIzNCAxNDcgMTYxIAorMTUzIDEwMCAxOTggMjEgNjYgMTE0IDE5MCAxNjcgMTY0IDIwMyAyMzUgMTYgMTczIDI0NyAxNjUgNTUgMjA1IDI4IDU2IDEyOSAxMjMgCisxODQgMjA2IDE5IDE1MSAyNTcgMTMzIDgwIDEwNiA3MCA2NiAyNTMgMjQ4IDE3IDI1IDIxNyAxNzcgNSA4NyAyNTIgMTg1IDEzMCA0NyAKKzEzIDY4IDI5IDQ3IDIyNCAyNTEgMjYxIDEwMiAxODUgMyAxNzIgMTI5IDE5NSA0MyA1NiAxNDYgMTY1IDEyMiAyNjAgMTExIDE1NyA3NCAKKzk1IDIzMyAyOSAxOTEgMTQxIDIxNyA1MCA2MyAyMDMgMTEzIDE5OSAxMzkgMzYgMTkzIDczIDExNiAxMjIgNjYgMjM2IDcgMiAxMDkgCisyNDIgMjE3IDEwNSAxNDYgMjM3IDEyNSAyMzggMTIxIDEyNSA5OSA2MyA5IDIzOCA0OSA1MCAxMzUgMjYxIDIyOSAxMjcgMTUzIDQ1IAorMTE1IDE4NiAxMjEgMTQyIDE0MSA3OCAxOTEgMjEzIDkgMTY2IDE5MCAxNTAgMTIyIDE4OCA1MyA0MSAyMTMgMTQ4IDIyNCA0MCA3OCAKKzEzNiAxMzAgMjQxIDE1NCAyMTggMTY4IDMzIDIxNSA2MyA4MSA5NyAxNjUgMTk0IDI2MyAxNDQgMjUwIDE0MyAxMzIgMTczIDUzIDI0IAorMTcxIDY2IDQyIDY1IDExOCAzNyAxODkgMjI2IDk0IDYwIDI0MiAxNDUgNDcgMzAgMTEwIDExMSAyMjkgMTk5IDIxMSA5NCA0MyAyMDAgCis2MyA2NCA1NSA4MyAxMiAyMiAxODQgODQgMjAyIDExNyA0NiAxNjEgOTggMTcgMTY0IDc2IDI3IDEzMiAxMDEgMjYxIDE3NCA0NCA1MiAKKzMzIDE0MyAyMDQgMzIgMTY5IDE1MSAxODUgNzUgMzEgMjQ1IDEyMyA1NyAyNjQgMTM1IDEyIDUgMTQyIDY5IDIwIDc1IDg2IDYyIDE1NyAKKzIgMzcgMTE3IDEwMSAyNDQgMTMyIDIyOCAxMzYgNTggMTE2IDEwNSA5MSAxNTQgMjQgMjcgMTQ5IDc2IDEwIDkwIDE5IDc5IDE5OSA4NCAKKzIxOSA5MiAxMjggNzcgNzMgMjQzIDI2MyAxNyA0MiAyNTkgMjU5IDE4NyA2MiAyMTIgODUgNzEgNjIgMTQwIDIyNiAyMjEgMjAxIDEyNiAKKzE4IDMzIDIxIDEyMSAxOTcgMjI0IDE3OSAxMzYgMjUyIDU4IDI1NSAxNjMgMTQwIDgyIDM4IDIzNSA3MSAyNTYgMTUgMTEwIDk0IDE4NyAKKzExNyAyOSAxMTkgMTYgMTAxIDEyMiA0OSAxOTQgMTkxIDg2IDEzNCAxNiAxMTggMTY0IDEzMSAxMTAgMTY2IDQ2IDIzMyAxNTYgMTMzIAorMjUgMjMgMzYgNTQgMjE0IDE5NCAxMTkgMjI3IDE4IDg4IDEwNCAxNTUgMTQyIDE5NiAxNjEgMjYgMTU4IDQ4IDE0OCA4MCAxMjMgMTEyIAorODEgMTY5IDI0IDQ0IDE5MSAxNTggMTkyIDY1IDI0NSAxNzggMTQwIDk5IDgwIDUxIDU0IDIzMSA0MiAxMCAzNSAyMDIgMjQ0IDE4NyA0NSAKKzE3MCAzIDE1NSA4NyAxODAgMTI3IDE0IDE4NiAyNjUgNTkgMTA3IDEzMyAyMTkgMjMxIDE4NiAxOTMgMSAyNTcgNiAyMDUgMjIyIDI2NCAKKzEzIDE5NSAyMzcgMTk3IDMwIDIzNyAyNTIgMTEzIDcyIDE5NyAxNTIgNTQgODcgNTggNDQgMjQ2IDI0MSAyNyA3NyAxOCAxNjAgMjI5IDUgCis3MCAyMTAgMTcwIDIxNCA3MiA1MyAxNjggODggMzIgOTcgOTMgNjkgMjYxIF4KKzU2MyAxIDE1IDIzNCAxMzAgMTM5IDI1NSA0MiA0IDkwIDE1MSA1MSAxMjAgMTQ1IDExMyAyMTIgMTgxIDQ1IDEwNyA0NCA3NCAyMTkgMSAKKzI1MSA2MSAxNTYgMzEgMTI4IDE4NiAxMzggMTg0IDIyMyA2MSAxNjAgMTY3IDE3NSAxMDcgNiA1IDgxIDExNCAyMDcgMjA1IDE3MyAxMTMgCisyMDggMjM4IDczIDE4NiAxNzYgMTc4IDkzIDIxNiAxMSA5OCA4MyAyMTggMTE5IDIyMSAxNDYgMzcgMTc5IDg4IDQ3IDEzOSAxMDQgMjQ3IAorMTg5IDI0MSA2MyA3MSAxNTQgMTE2IDUgMTIzIDUxIDEyNCA4OCA4NSAxMzMgNDkgMjA5IDIzMyA5NyA0NiAyNTcgNzQgNjQgNzAgMTIxIAorMjMgMjAwIDE1NSAxMTEgMjkgNTggNTcgMjAgMjUyIDIwNyA1MCAyNDIgNTggMTcwIDE0IDE5NyAxNjkgOTQgOTggNDEgMTMgMjAyIDcwIAorMjM0IDkyIDE0NSAxMTcgMTU1IDE1MyAyMzQgMjQzIDIwOCAyMDAgNCA0OCAyMSAxMzQgMjM3IDQwIDkzIDE3OCAyMTAgMTUzIDE5NiAKKzE3NCAyNjMgMjM4IDIyOCAxMTcgMzggMjMgNDkgOTIgMjggMTgwIDE2MyA3NyA1NCAyMjMgOTkgMjI5IDExMiA2MiAxNTEgMTMwIDI1NiAKKzE5MiAzNCA4MCAyIDE3MSAxNjAgMTYgMTEyIDI0IDgyIDE4NSAyNiAxNDggMTAzIDk3IDE1OSAyNTEgMTkgMjE5IDExNCAyNDUgNiAxMTggCis3NSAyNTIgOTQgMjQ5IDEwNCA5NiAxMjYgMTU4IDIxNCAyNTEgMTc0IDIyNSAxNjkgOTAgMjMwIDI2MiA5MiA2NiAxNzQgMTA4IDM5IDk4IAorNzkgODIgMTQ3IDMyIDEwIDIxNiA1MyAzNSA3NSAxMDEgMzEgMTY2IDE4MCA4IDcxIDI2NyAxODUgMTQzIDg1IDk1IDI0OCA3MSAzIDUzIAorMTkwIDYgMTU2IDE0NCAxMjIgNTYgMjUgMjI4IDc5IDIzNyA3OCA4NyA0OCAxNzIgMTk3IDUyIDE1NyAxODEgMTU4IDEwMSAxODIgMzYgCisyNjMgMTI1IDE1OSAyNDcgNzYgMTcyIDE5MyAxMDkgMTEwIDI2MCAyMiAxMiAxMzEgMTc2IDIzIDE2MiAxNjEgMTY2IDE0MiAxNCAyMDEgCiszNyAxNDEgMTkgMTAyIDE3NyA2MCAxMjMgMjA2IDU1IDE0MyAxOTggODkgMTE4IDIyNiA0NyAxNzcgMTczIDE5MiA3NiAxNyAxODcgNTQgCis3MiAzNiAxNDYgMTg4IDI0MiA5NiAxNjQgMjI3IDg0IDIxMyAyMTggODEgMTUyIDIwMSAxNTAgMTM1IDE1NyA2NCAyMjEgMTg0IDEwNiAKKzEyNCAyNDMgOTEgMjYzIDg3IDE2NSAxMDkgMTE0IDEyOCA2OSAyMDEgMTkyIDcyIDE0OSAyMTUgMTMzIDIwNCAxNDAgMjAgMTM1IDIgCisxMzMgOTEgMTQ2IDE1MCAyNDggMjI2IDkgMTgzIDIyOCAyMzAgMzIgMTYxIDExIDEzNiAxNTIgMTYzIDgxIDI2NSAyIDIwIDk3IDggMTg4IAorMjA0IDEwMiAyNiAyNjUgNDAgODkgMjM1IDE2MyAyMzIgNjAgODUgMTM3IDE4NSAyNTYgMTU0IDIzMyAyMTAgMTE1IDEyNyAzNiAxMDggCisxOTQgMTA0IDIwOSAxMjAgMTAzIDE3NiAyNyAzMCAxMzMgODcgMTAgMTAzIDU5IDkwIDExMyA1NyAxNzUgMjU4IDY5IDg4IDE5OCAyMDIgCisxODcgMTcxIDkgMjIxIDI5IDEwMCAyNjIgMjA1IDEzNSAxMTkgNzAgODMgMjkgNjIgNjcgMTczIDc1IDEzOSAxMDAgMTExIDE0MiA1MiAyIAorMTc1IDI4IDYzIDMzIDE2MCAyNDYgNDMgNzkgMTIwIDE0MSAxNzAgMTY1IDI2MCAxNzcgMjExIDE4NiAyMSAyNDcgMzggMTc4IDU1IDIyMiAKKzY2IDEzNiAzOSA5NCAyMTEgMzUgMjI2IDE2NCAxMTQgOTAgMjU2IDM3IDI4IDI1IDIzMiAyMTUgMTYgMjY3IDIyMyAyMTIgMzAgMjUwIAorMjQgMTk1IDI1NCAyMzkgMTEwIDE0NyAyOCA2NyAxNjkgMTMyIDE2NyAxNzkgMjQzIDI0NiAxOTQgMTQyIDIwMyA2NSAyNTggMjIwIDE1MSAKKzEzIDUxIDcgMTUxIDE2OCA1NyAxMzcgMTg5IDEyNCAxMjYgMTU0IDc4IDIwNCAyNTMgODkgODAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IAorOTkgNzQgMTA2IDcgMzggMTc0IDExMiAxNzUgMTQ1IDIxOCAyMzYgMTU4IDYzIDE4OCA5MSAzMyA4MSAzNSAyNjQgMTU4IDU5IDUyIDQ0IAorMTEyIDIwIDIxNCAxMzggMTA1IDEyIDE0IDQ2IDEwNiAxMSAyNDkgMTQ2IDMzIDQzIDQxIDEyNiAzIDE1IDEyMSAxMzYgMSAxMDAgMjY2IAorNzMgMTgyIDQwIDEzMSAxNzIgODAgMTE1IDI0MCAzMCAyNDYgMTg2IF4KKzU3MyAwIDE0NiA2MyAxMDEgMjEwIDk2IDE2MiA5MSAxMjcgMTM0IDg0IDE2NCA2IDI1MCAxMjAgMTcxIDIyNiAxNDMgMTQ5IDE0NSA5NiAKKzE5NCAxNyA2MiAxMDIgMTkwIDE1NSAxNjAgMTk1IDIzNSA4IDE2NSAyNDMgMTU3IDQzIDIwNSAxNiA0NCAxMjEgMTE5IDE3MiAyMDYgMTUgCisxNDcgMjQ5IDEyMSA2OCA5OCA1OCA2NiAyNTMgMjQwIDUgMTMgMjEzIDE2NSA1IDgzIDI0OCAxNzMgMTIyIDM1IDUgNjQgMTcgNDMgMjI0IAorMjQ3IDI1NyAxMDIgMTc3IDMgMTY4IDEyNSAxODcgMzUgNTYgMTM4IDE2NSAyNjIgMTE4IDI1NiAxMDMgMTU3IDYyIDgzIDIyOSAyNSAKKzE3OSAxMzcgMjE3IDQ2IDU1IDIwMyAxMDEgMTkxIDEzNSAzMiAxOTMgNjkgMTE2IDEyMiA1NCAyMzYgNyAyNjggMTAxIDI0MiAyMDkgOTcgCisxNDIgMjMzIDEyNSAyMzggMTA5IDEyMSA4NyA1OSAxIDIzNCA0MSAyNTggNTAgMTIzIDI1MyAyMjEgMTI3IDE1MyA0NSAxMDcgMTc0IAorMTIxIDEzOCAxMzMgNjYgMTgzIDIwNSAyNjcgMTY2IDE3OCAxMzggMTE0IDE4OCA1MyAzNyAyMDkgMTQ4IDIxNiAyOCA3NCAxMzIgMTE4IAorMjM3IDE0MiAyMTQgMTY0IDI1IDIxMSA2MyA2OSA5NyAxNjEgMTk0IDI1NSAxMzYgMjUwIDEzOSAxMzIgMTY5IDQxIDIwIDE2MyA1OCAzNCAKKzU3IDExOCAzNyAxNzcgMjIyIDk0IDYwIDIzOCAxNDEgNDcgMjIgMTEwIDEwNyAyMjUgMTk1IDIwMyA4MiA0MyAxOTIgNTEgNTIgNTEgNzEgCisxMiAxNCAxODAgNzIgMTk4IDExNyAzOCAxNTcgOTQgOSAxNjQgNzYgMTUgMTI4IDEwMSAyNjEgMTcwIDQwIDQwIDIxIDE0MyAyMDAgMzIgCisxNjEgMTQzIDE4MSA3MSAzMSAyNDUgMTIzIDUzIDI1NiAxMzUgMjY3IDEzNCA2NSAxNiA2MyA4MiA2MiAxNTMgMjY0IDMzIDEwOSA4OSAKKzI0NCAxMjQgMjIwIDEyOCA1MCAxMDQgMTA1IDkxIDE0NiAxMiAyNyAxNDUgNjQgMjY4IDgyIDExIDc5IDE5OSA4NCAyMTUgODAgMTI4IAorNjkgNjUgMjM1IDI1OSAxNyAzMCAyNTkgMjU1IDE4NyA1NCAyMDQgODEgNjMgNTAgMTM2IDIxOCAyMTMgMTk3IDExOCAxOCAyOSA5IDExMyAKKzE4OSAyMjAgMTc5IDEyNCAyNTIgNTQgMjU1IDE1NSAxMjggODIgMzAgMjI3IDU5IDI1MiAzIDk4IDkwIDE3OSAxMDUgMjEgMTExIDQgOTcgCisxMTAgMzcgMTkwIDE4NyA4NiAxMzAgMTYgMTE0IDE1NiAxMjcgMTAyIDE1OCA0MiAyMjUgMTQ0IDEyOSAxNyAxMSAyOCA0MiAyMDYgMjY2IAorMTg2IDExOSAyMjMgMTAgODAgOTYgMTQzIDEzMCAxODQgMTUzIDI2IDE0NiA0NCAxNDAgODAgMTE1IDEwNCA3MyAxNjUgMjQgNDQgMTkxIAorMTU0IDE4MCA1MyAyMzcgMTc0IDE0MCA5OSA3NiA0NyA1NCAyMjMgNDIgNiAzMSAxOTQgMjM2IDE3NSAzNyAxNTggMjYxIDE1MSA3OSAKKzE4MCAxMjMgMiAxODIgMjU3IDUxIDEwMyAxMjUgMjE5IDIzMSAxNzggMTg5IDEgMjUzIDIgMjAxIDIxOCAyNjQgMSAxODMgMjM3IDE5MyAKKzE4IDIyOSAyNDQgMTA1IDcyIDE4NSAxNTIgNDYgODcgNDYgMzYgMjQyIDI0MSAyMyA3NyAxNCAxNDggMjI5IDI2MyA2NiAyMDIgMTY2IAorMjEwIDY0IDQ5IDE1NiA3NiAyOCA5MyA5MyA2MSAxMzUgMTMgMjMyIDEyNiAxMzUgMjUxIDM2IDQgODQgMTQ1IDQ1IDEyMCAxMzkgMTEzIAorMjA4IDE4MSAzOSAxMDUgNDAgNzIgMjE3IDI2NSAyNTEgNTUgMTUyIDI3IDEyNiAxODYgMTM4IDE4NCAyMjMgNjEgMTU0IDE2MSAxNzUgCisxMDcgNiAyNjkgODEgMTE0IDIwNyAyMDEgMTY3IDEwNyAyMDYgMjM0IDczIDE4NCAxNzIgMTc0IDg5IDIxMiAxMSA5OCA3NyAyMTQgMTEzIAorMjIxIDE0NiAzMSAxNzUgODggNDUgMTM5IDEwMCAyNDMgMTg5IDIzOSA1NyA2NyAxNTAgMTEyIDMgMTE3IDUxIDEyMiA4NiA3OSAxMjkgCis0OSAyMDcgMjMzIDkzIDQyIDI1NyA3MCA2NCA2OCAxMTcgMTkgMTk2IDE1MSAxMTEgMjMgNTggNTMgMTggMjQ4IDIwNSA0OCAyNDAgNTYgCisxNzAgOCAxOTcgMTY5IDkyIDk0IDQxIDcgMTk4IDY2IDIzNCA5MiAxNDUgMTE1IDE1NSAxNDcgMjMwIDI0MyAyMDggMjAwIDQ4IDIxIAorMTMwIDIzNSA0MCA5MSAxNzggMjA4IDE0OSAxOTYgMTcwIDI1OSAyMzYgMjI2IDExMSAzNiAyMyA0NSA4OCAyNiAxNzggMTU3IDIwNyBeCis1NjYgMSA0MiAyMTkgOTEgMjI1IDEwOCA1MCAxNTEgMTMwIDI1MiAxODQgMzQgNzIgMjYyIDE2MyAxNTYgNCAxMTIgMjAgNzQgMTc3IDE0IAorMTQwIDkxIDg1IDE1OSAyNDMgMTkgMjExIDExMCAyMzcgMiAxMTQgNjcgMjQ4IDgyIDI0MSAxMDQgODggMTI2IDE1MCAyMTAgMjQ3IDE3MCAKKzIyNSAxNTcgOTAgMjMwIDI2MiA4MCA1NCAxNjIgMTA0IDM5IDg2IDcxIDc4IDE0NyAyOCA2IDIxNiA0MSAzNSA3NSA5NyAxOSAxNTQgCisxNzIgNTkgMjY3IDE4NSAxMzUgNzcgOTUgMjQ0IDcxIDI2NyA0NSAxODYgMjcwIDE0NCAxNDQgMTEwIDQ4IDEzIDIyOCA3NSAyMjkgNzAgCis3NSA0MCAxNzIgMTg5IDQ4IDE1MyAxNzcgMTU0IDg5IDE3MCAzNiAyNTkgMTEzIDE0NyAyNDMgNjggMTYwIDE4OSA5NyAxMDIgMjU2IDE0IAorOCAxMzEgMTY0IDE5IDE2MiAxNjEgMTU4IDE0MiAxNCAxOTcgMjkgMTQxIDExIDkwIDE3MyA1MiAxMTUgMjAyIDQzIDEzMSAxOTggODEgCisxMDYgMjE4IDM5IDE2OSAxNzMgMTkyIDY0IDkgMTc1IDUwIDY4IDI4IDEzOCAxNzYgMjM0IDg0IDE1NiAyMjcgNzIgMjEzIDIxNCA3NyAKKzE0NCAxOTMgMTUwIDEyNyAxNDUgNTYgMjE3IDE3NiAxMDIgMTI0IDIzNSA4NyAyNjMgODMgMTYxIDEwOSAxMDIgMTE2IDY1IDIwMSAxODAgCis2NCAxNDkgMjE1IDEyOSAyMDAgMTI4IDggMTIzIDI2NiAxMzMgNzkgMTQyIDE0NiAyNDggMjIyIDkgMTgzIDIyMCAyMjYgMjAgMTU3IDcgCisxMjggMTQ4IDE2MyA3MyAyNjUgMjcwIDEyIDkzIDggMTgwIDIwNCA5OCAyMiAyNjEgMjggODkgMjI3IDE1NSAyMjQgNTYgODUgMTI1IAorMTgxIDI1NiAxNTQgMjI5IDIxMCAxMTUgMTE5IDMyIDEwOCAxOTAgMTAwIDIwOSAxMTIgMTAzIDE3NiAxOSAyMiAxMjEgNzkgMTAgOTUgCis1NSA4MiAxMDkgNTMgMTY3IDI1OCA2OSA4MCAxOTQgMjAyIDE4MyAxNzEgNSAyMTMgMjUgODggMjU4IDIwMSAxMzEgMTE1IDcwIDgzIDI5IAorNTggNjcgMTY1IDcxIDEyNyA5NiAxMDcgMTM4IDQ0IDIgMTYzIDE2IDU1IDMzIDE2MCAyNDYgMzUgNjcgMTA4IDEzMyAxNjIgMTUzIDI2MCAKKzE2NSAyMDMgMTc4IDE3IDI0NyAzOCAxNzQgNTUgMjIyIDU4IDEzMiAyNyA4NiAyMTEgMjcgMjI2IDE2MCAxMDYgODYgMjYwIDI0OCAzMyAKKzIwIDI1IDIyOCAyMDcgOCAyNjMgMjE1IDIxMiAzMCAyNDIgMTYgMTk1IDI1NCAyMzkgMTA2IDEzNSAyOCA1NSAxNjUgMTIwIDE2NyAxNzUgCisyMzkgMjM4IDE4NiAxMzAgMTk1IDY1IDI1MCAyMjAgMTQzIDkgNDMgMjcxIDE0NyAxNjAgNTcgMTM3IDE4MSAxMTYgMTE0IDE1MCA3OCAKKzE5NiAyNDkgODUgNzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDg3IDc0IDk0IDMgMjYgMTc0IDEwNCAxNzEgMTM3IDI2NCAyMTggMjI4IAorMTU4IDU5IDE4NCA4MyAyMSA2OSAyMyAyNTYgMTQ2IDU5IDUyIDMyIDEwMCAyMCAyMTQgMTI2IDkzIDEwIDQ2IDEwNiAzIDI0OSAxMzQgCisyNSAzOSAzNyAxMjIgMjcxIDE1IDEwOSAxMzYgMjY5IDEwMCAyNTggNjEgMTgyIDM2IDExOSAxNjQgNjggMTExIDI0MCAxOCAyNDIgMTU2IAorMTQ0IDYxIDk5IDIwNiA5NiAxNTYgODcgMTIzIDEzNCA4MiAxNTggMiAyNDYgMTE4IDE2OSAyMjIgMTQxIDE0MyAxNDEgOTQgMTkyIDE1IAorNjAgOTYgMTkwIDE0OSAxNTggMTkxIDIzNSA0IDE2MSAyNDEgMTUzIDM3IDIwNSAxMCAzOCAxMTcgMTE3IDE2NiAyMDYgMTMgMTQ1IDI0NSAKKzExNSA2MiA5NCA1MiA2NiAyNTMgMjM2IDI3MSA3IDIxMSAxNTkgNSA4MSAyNDYgMTY3IDExOCAyOSAxIDYyIDExIDQxIDIyNCAyNDUgCisyNTUgMTAyIDE3MyAzIDE2NiAxMjMgMTgzIDMxIDU2IDEzNCAxNjUgMjYwIDExNiAyNTQgOTkgMTU3IDU2IDc3IDIyNyAyMyAxNzMgMTM1IAorMjE3IDQ0IDUxIDIwMyA5NSAxODcgMTMzIDMwIDE5MyA2NyAxMTYgMTIyIDQ4IDIzNiA3IDI2OCA5NyAyNDIgMjA1IDkzIDE0MCAyMzEgCisxMjUgMjM4IDEwMyAxMTkgODEgNTcgMjY5IDIzMiAzNyAyNTQgNTAgMTE3IDI0OSAyMTcgMTI3IDE1MyA0NSAxMDMgMTY4IDEyMSAxMzYgCisxMjkgNjAgMTc5IDIwMSAyNjMgMTY2IDE3MiAxMzIgMTEwIDE4OCA1MyAzNSAyMDcgMTQ4IDIxMiAyNjIgXgorNTg5IDAgNzAgMTI4IDEwNiAyMzMgMTMwIDIxMCAxNjAgMTcgMjA3IDYzIDU3IDk3IDE1NyAxOTQgMjQ3IDEyOCAyNTAgMTM1IDEzMiAKKzE2NSAyOSAxNiAxNTUgNTAgMjYgNDkgMTE4IDM3IDE2NSAyMTggOTQgNjAgMjM0IDEzNyA0NyAxNCAxMTAgMTAzIDIyMSAxOTEgMTk1IAorNzAgNDMgMTg0IDM5IDQwIDQ3IDU5IDEyIDYgMTc2IDYwIDE5NCAxMTcgMzAgMTUzIDkwIDEgMTY0IDc2IDMgMTI0IDEwMSAyNjEgMTY2IAorMzYgMjggOSAxNDMgMTk2IDMyIDE1MyAxMzUgMTc3IDY3IDMxIDI0NSAxMjMgNDkgMjQ4IDEzNSAyNjIgMjYzIDEyNiA2MSAxMiA1MSA3OCAKKzYyIDE0OSAyNjAgMjkgMTAxIDc3IDI0NCAxMTYgMjEyIDEyMCA0MiA5MiAxMDUgOTEgMTM4IDI3IDE0MSA1MiAyNjAgNzQgMyA3OSAxOTkgCis4NCAyMTEgNjggMTI4IDYxIDU3IDIyNyAyNTUgMTcgMTggMjU5IDI1MSAxODcgNDYgMTk2IDc3IDU1IDM4IDEzMiAyMTAgMjA1IDE5MyAKKzExMCAxOCAyNSAyNzEgMTA1IDE4MSAyMTYgMTc5IDExMiAyNTIgNTAgMjU1IDE0NyAxMTYgODIgMjIgMjE5IDQ3IDI0OCAyNjUgODYgODYgCisxNzEgOTMgMTMgMTAzIDI2NiA5MyA5OCAyNSAxODYgMTgzIDg2IDEyNiAxNiAxMTAgMTQ4IDEyMyA5NCAxNTAgMzggMjE3IDEzMiAxMjUgCis5IDI3MyAyMCAzMCAxOTggMjY2IDE3OCAxMTkgMjE5IDIgNzIgODggMTMxIDExOCAxNzIgMTQ1IDI2IDEzNCA0MCAxMzIgODAgMTA3IDk2IAorNjUgMTYxIDI0IDQ0IDE5MSAxNTAgMTY4IDQxIDIyOSAxNzAgMTQwIDk5IDcyIDQzIDU0IDIxNSA0MiAyIDI3IDE4NiAyMjggMTYzIDI5IAorMTQ2IDI1MyAxNDcgNzEgMTgwIDExOSAyNjQgMTc4IDI0OSA0MyA5OSAxMTcgMjE5IDIzMSAxNzAgMTg1IDEgMjQ5IDI3MiAxOTcgMjE0IAorMjY0IDI2MyAxNzEgMjM3IDE4OSA2IDIyMSAyMzYgOTcgNzIgMTczIDE1MiAzOCA4NyAzNCAyOCAyMzggMjQxIDE5IDc3IDEwIDEzNiAKKzIyOSAyNTUgNjIgMTk0IDE2MiAyMDYgNTYgNDUgMTQ0IDY0IDI0IDg5IDkzIDUzIDEyMyA5IDIyOCAxMTggMTI3IDI0MyAyNCA0IDcyIAorMTMzIDMzIDEyMCAxMjcgMTEzIDIwMCAxODEgMjcgMTAxIDMyIDY4IDIxMyAyNTcgMjUxIDQzIDE0NCAxOSAxMjIgMTg2IDEzOCAxODQgCisyMjMgNjEgMTQyIDE0OSAxNzUgMTA3IDYgMjYxIDgxIDExNCAyMDcgMTkzIDE1NSA5NSAyMDIgMjI2IDczIDE4MCAxNjQgMTY2IDgxIAorMjA0IDExIDk4IDY1IDIwNiAxMDEgMjIxIDE0NiAxOSAxNjcgODggNDEgMTM5IDkyIDIzNSAxODkgMjM1IDQ1IDU5IDE0MiAxMDQgMjczIAorMTA1IDUxIDExOCA4MiA2NyAxMjEgNDkgMjAzIDIzMyA4NSAzNCAyNTcgNjIgNjQgNjQgMTA5IDExIDE4OCAxNDMgMTExIDExIDU4IDQ1IAorMTQgMjQwIDIwMSA0NCAyMzYgNTIgMTcwIDI3MCAxOTcgMTY5IDg4IDg2IDQxIDI2OSAxOTAgNTggMjM0IDkyIDE0NSAxMTEgMTU1IDEzNSAKKzIyMiAyNDMgMjA4IDIwMCAyNjYgNDggMjEgMTIyIDIzMSA0MCA4NyAxNzggMjA0IDE0MSAxOTYgMTYyIDI1MSAyMzIgMjIyIDk5IDMyIAorMjMgMzcgODAgMjIgMTc0IDE0NSA3MSAzNiAyMTcgODcgMjIzIDEwNiA0NCAxNTEgMTMwIDI1MCAxODAgMzQgNjggMjU4IDE1OSAxNTQgCisyNzIgMTEyIDE4IDcwIDE3MyA4IDEzNiA4NSA3OSAxNTkgMjM5IDE5IDIwNyAxMDggMjMzIDExMiA2MyAyNDYgNzYgMjM3IDEwNCA4NCAKKzEyNiAxNDYgMjA4IDI0NSAxNjggMjI1IDE1MSA5MCAyMzAgMjYyIDc0IDQ4IDE1NiAxMDIgMzkgODAgNjcgNzYgMTQ3IDI2IDQgMjE2IAorMzUgMzUgNzUgOTUgMTMgMTQ4IDE2OCAyNzAgNTMgMjY3IDE4NSAxMzEgNzMgOTUgMjQyIDcxIDI2NSA0MSAxODQgMjY4IDEzOCAxNDQgCisxMDQgNDQgNyAyMjggNzMgMjI1IDY2IDY5IDM2IDE3MiAxODUgNDYgMTUxIDE3NSAxNTIgODMgMTY0IDM2IDI1NyAxMDcgMTQxIDI0MSAKKzY0IDE1NCAxODcgOTEgOTggMjU0IDEwIDYgMTMxIDE1OCAxNyAxNjIgMTYxIDE1NCAxNDIgMTQgMTk1IDI1IDE0MSA3IDg0IDE3MSA0OCAKKzExMSAyMDAgMzcgMTI1IDE5OCA3NyAxMDAgMjE0IDM1IDE2NSAxNzMgMTkyIDU4IDUgMTY5IDQ4IDY2IDI0IDEzNCAxNzAgMjMwIDc4IAorMTUyIDIyNyA2NiAyMTMgMjEyIDc1IDE0MCAxODkgMTUwIDEyMyAxMzkgNTIgMjE1IDE3MiAxMjQgXgorNTg0IDAgMTI0IDIyNyA4MyAyNjMgNzkgMTU3IDEwOSA5MCAxMDQgNjEgMjAxIDE2OCA1NiAxNDkgMjE1IDEyNSAxOTYgMTE2IDI3MiAKKzExMSAyNjIgMTMzIDY3IDEzOCAxNDIgMjQ4IDIxOCA5IDE4MyAyMTIgMjIyIDggMTUzIDMgMTIwIDE0NCAxNjMgNjUgMjY1IDI3MCA0IAorODkgOCAxNzIgMjA0IDk0IDE4IDI1NyAxNiA4OSAyMTkgMTQ3IDIxNiA1MiA4NSAxMTMgMTc3IDI1NiAxNTQgMjI1IDIxMCAxMTUgMTExIAorMjggMTA4IDE4NiA5NiAyMDkgMTA0IDEwMyAxNzYgMTEgMTQgMTA5IDcxIDEwIDg3IDUxIDc0IDEwNSA0OSAxNTkgMjU4IDY5IDcyIDE5MCAKKzIwMiAxNzkgMTcxIDEgMjA1IDIxIDc2IDI1NCAxOTcgMTI3IDExMSA3MCA4MyAyOSA1NCA2NyAxNTcgNjcgMTE1IDkyIDEwMyAxMzQgMzYgCisyIDE1MSA0IDQ3IDMzIDE2MCAyNDYgMjcgNTUgOTYgMTI1IDE1NCAxNDEgMjYwIDE1MyAxOTUgMTcwIDEzIDI0NyAzOCAxNzAgNTUgMjIyIAorNTAgMTI4IDE1IDc4IDIxMSAxOSAyMjYgMTU2IDk4IDgyIDI1MiAyNDAgMjkgMTIgMjUgMjI0IDE5OSAyNTkgMjA3IDIxMiAzMCAyMzQgOCAKKzE5NSAyNTQgMjM5IDEwMiAxMjMgMjggNDMgMTYxIDEwOCAxNjcgMTcxIDIzNSAyMzAgMTc4IDExOCAxODcgNjUgMjQyIDIyMCAxMzUgNSAKKzM1IDI2NyAxNDMgMTUyIDU3IDEzNyAxNzMgMTA4IDEwMiAxNDYgNzggMTg4IDI0NSA4MSA3MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNzUgCis3NCA4MiAyNzUgMTQgMTc0IDk2IDE2NyAxMjkgMjYwIDIxOCAyMjAgMTU4IDU1IDE4MCA3NSA5IDU3IDExIDI0OCAxMzQgNTkgNTIgMjAgCis4OCAyMCAyMTQgMTE0IDgxIDI2NCA2IDQ2IDEwNiAyNzEgMjQ5IDEyMiAxNyAzNSAzMyAxMTggMjcxIDE1IDk3IDEzNiAyNjkgMTAwIAorMjUwIDQ5IDE4MiAzMiAxMDcgMTU2IDU2IDEwNyAyNDAgNiAyMzggMTU2IDE0MCA1NyA5NSAxOTggOTYgMTQ0IDc5IDExNSAxMzQgNzggCisxNDYgMjcwIDIzOCAxMTQgMTY1IDIxNCAxMzcgMTMxIDEzMyA5MCAxODggMTEgNTYgODQgMTkwIDEzNyAxNTQgMTgzIDIzNSAyNzIgMTUzIAorMjM3IDE0NSAyNSAyMDUgMjc0IDI2IDEwOSAxMTMgMTU0IDIwNiA5IDE0MSAyMzcgMTAzIDUwIDg2IDQwIDY2IDI1MyAyMjggMjYzIDI3MSAKKzIwNyAxNDcgNSA3NyAyNDIgMTU1IDExMCAxNyAyNjkgNTggMjc1IDM3IDIyNCAyNDEgMjUxIDEwMiAxNjUgMyAxNjIgMTE5IDE3NSAyMyAKKzU2IDEyNiAxNjUgMjU2IDExMiAyNTAgOTEgMTU3IDQ0IDY1IDIyMyAxOSAxNjEgMTMxIDIxNyA0MCA0MyAyMDMgODMgMTc5IDEyOSAyNiAKKzE5MyA2MyAxMTYgMTIyIDM2IDIzNiA3IDI2OCA4OSAyNDIgMTk3IDg1IDEzNiAyMjcgMTI1IDIzOCA5MSAxMTUgNjkgNTMgMjY1IDIyOCAKKzI5IDI0NiA1MCAxMDUgMjQxIDIwOSAxMjcgMTUzIDQ1IDk1IDE1NiAxMjEgMTMyIDEyMSA0OCAxNzEgMTkzIDI1NSAxNjYgMTYwIDEyMCAKKzEwMiAxODggNTMgMzEgMjAzIDE0OCAyMDQgMTAgNjggMTI2IDEwMCAyMzEgMTI0IDIwOCAxNTggMTMgMjA1IDYzIDUxIDk3IDE1NSAxOTQgCisyNDMgMTI0IDI1MCAxMzMgMTMyIDE2MyAyMyAxNCAxNTEgNDYgMjIgNDUgMTE4IDM3IDE1OSAyMTYgOTQgNjAgMjMyIDEzNSA0NyAxMCAKKzExMCAxMDEgMjE5IDE4OSAxOTEgNjQgNDMgMTgwIDMzIDM0IDQ1IDUzIDEyIDIgMTc0IDU0IDE5MiAxMTcgMjYgMTUxIDg4IDI3MyAxNjQgCis3NiAyNzMgMTIyIDEwMSAyNjEgMTY0IDM0IDIyIDMgMTQzIDE5NCAzMiAxNDkgMTMxIDE3NSA2NSAzMSAyNDUgMTIzIDQ3IDI0NCAxMzUgCisyNTggMjYxIDEyMiA1OSAxMCA0NSA3NiA2MiAxNDcgMjU4IDI3IDk3IDcxIDI0NCAxMTIgMjA4IDExNiAzOCA4NiAxMDUgOTEgMTM0IAorMjcwIDI3IDEzOSA0NiAyNTYgNzAgMjc1IDc5IDE5OSA4NCAyMDkgNjIgMTI4IDU3IDUzIDIyMyAyNTMgMTcgMTIgMjU5IDI0OSAxODcgCis0MiAxOTIgNzUgNTEgMzIgMTMwIDIwNiAyMDEgMTkxIDEwNiAxOCAyMyAyNjcgMTAxIDE3NyAyMTQgMTc5IDEwNiAyNTIgNDggMjU1IAorMTQzIDExMCA4MiAxOCAyMTUgNDEgMjQ2IDI2MSA4MCA4NCAxNjcgODcgOSA5OSAyNjIgOTEgOTIgMTkgMTg0IDE4MSA4NiAxMjQgMTYgCisxMDggMTQ0IDEyMSA5MCAxNDYgMzYgMjEzIDEyNiAxMjMgNSAyNjkgMjMwIF4KKzU4NyAwIDE4IDE5MCAyNjYgMTcwIDExOSAyMTUgMjcyIDY0IDgwIDExOSAxMDYgMTYwIDEzNyAyNiAxMjIgMzYgMTI0IDgwIDk5IDg4IAorNTcgMTU3IDI0IDQ0IDE5MSAxNDYgMTU2IDI5IDIyMSAxNjYgMTQwIDk5IDY4IDM5IDU0IDIwNyA0MiAyNzYgMjMgMTc4IDIyMCAxNTEgCisyMSAxMzQgMjQ1IDE0MyA2MyAxODAgMTE1IDI1NiAxNzQgMjQxIDM1IDk1IDEwOSAyMTkgMjMxIDE2MiAxODEgMSAyNDUgMjcyIDE5MyAKKzIxMCAyNjQgMjU1IDE1OSAyMzcgMTg1IDI3MiAyMTMgMjI4IDg5IDcyIDE2MSAxNTIgMzAgODcgMjIgMjAgMjM0IDI0MSAxNSA3NyA2IAorMTI0IDIyOSAyNDcgNTggMTg2IDE1OCAyMDIgNDggNDEgMTMyIDUyIDIwIDg1IDkzIDQ1IDExMSA1IDIyNCAxMTAgMTE5IDIzNSAxMiA0IAorNjAgMTIxIDIxIDEyMCAxMTUgMTEzIDE5MiAxODEgMTUgOTcgMjQgNjQgMjA5IDI0OSAyNTEgMzEgMTM2IDExIDExOCAxODYgMTM4IDE4NCAKKzIyMyA2MSAxMzAgMTM3IDE3NSAxMDcgNiAyNTMgODEgMTE0IDIwNyAxODUgMTQzIDgzIDE5OCAyMTggNzMgMTc2IDE1NiAxNTggNzMgCisxOTYgMTEgOTggNTMgMTk4IDg5IDIyMSAxNDYgNyAxNTkgODggMzcgMTM5IDg0IDIyNyAxODkgMjMxIDMzIDUxIDEzNCA5NiAyNzMgOTMgCis1MSAxMTQgNzggNTUgMTEzIDQ5IDE5OSAyMzMgNzcgMjYgMjU3IDU0IDY0IDYwIDEwMSAzIDE4MCAxMzUgMTExIDI3NyA1OCAzNyAxMCAKKzIzMiAxOTcgNDAgMjMyIDQ4IDE3MCAyNjIgMTk3IDE2OSA4NCA3OCA0MSAyNjEgMTgyIDUwIDIzNCA5MiAxNDUgMTA3IDE1NSAxMjMgCisyMTQgMjQzIDIwOCAyMDAgMjYyIDQ4IDIxIDExNCAyMjcgNDAgODMgMTc4IDIwMCAxMzMgMTk2IDE1NCAyNDMgMjI4IDIxOCA4NyAyOCAKKzIzIDI5IDcyIDE4IDE3MCAxMzMgNjcgMjQgMjEzIDc5IDIxOSAxMDIgMzIgMTUxIDEzMCAyNDYgMTcyIDM0IDYwIDI1MCAxNTEgMTUwIAorMjY0IDExMiAxNCA2MiAxNjUgMjc0IDEyOCA3MyA2NyAxNTkgMjMxIDE5IDE5OSAxMDQgMjI1IDI3NCAxMDggNTUgMjQyIDY0IDIyOSAKKzEwNCA3NiAxMjYgMTM4IDIwNCAyNDEgMTY0IDIyNSAxMzkgOTAgMjMwIDI2MiA2MiAzNiAxNDQgOTggMzkgNjggNTkgNzIgMTQ3IDIyIAorMjE2IDIzIDM1IDc1IDkxIDEgMTM2IDE2MCAyNjYgNDEgMjY3IDE4NSAxMjMgNjUgOTUgMjM4IDcxIDI2MSAzMyAxODAgMjY0IDEyNiAKKzE0NCA5MiAzNiAyNzMgMjI4IDY5IDIxNyA1OCA1NyAyOCAxNzIgMTc3IDQyIDE0NyAxNzEgMTQ4IDcxIDE1MiAzNiAyNTMgOTUgMTI5IAorMjM3IDU2IDE0MiAxODMgNzkgOTAgMjUwIDIgMiAxMzEgMTQ2IDEzIDE2MiAxNjEgMTQ2IDE0MiAxNCAxOTEgMTcgMTQxIDI3NyA3MiAKKzE2NyA0MCAxMDMgMTk2IDI1IDExMyAxOTggNjkgODggMjA2IDI3IDE1NyAxNzMgMTkyIDQ2IDI3NSAxNTcgNDQgNjIgMTYgMTI2IDE1OCAKKzIyMiA2NiAxNDQgMjI3IDU0IDIxMyAyMDggNzEgMTMyIDE4MSAxNTAgMTE1IDEyNyA0NCAyMTEgMTY0IDk2IDEyNCAyMjMgODEgMjYzIAorNzcgMTU1IDEwOSA4NCA5OCA1OSAyMDEgMTYyIDUyIDE0OSAyMTUgMTIzIDE5NCAxMTAgMjY4IDEwNSAyNjAgMTMzIDYxIDEzNiAxNDAgCisyNDggMjE2IDkgMTgzIDIwOCAyMjAgMiAxNTEgMSAxMTYgMTQyIDE2MyA2MSAyNjUgMjcwIDg3IDggMTY4IDIwNCA5MiAxNiAyNTUgMTAgCis4OSAyMTUgMTQzIDIxMiA1MCA4NSAxMDcgMTc1IDI1NiAxNTQgMjIzIDIxMCAxMTUgMTA3IDI2IDEwOCAxODQgOTQgMjA5IDEwMCAxMDMgCisxNzYgNyAxMCAxMDMgNjcgMTAgODMgNDkgNzAgMTAzIDQ3IDE1NSAyNTggNjkgNjggMTg4IDIwMiAxNzcgMTcxIDI3NyAyMDEgMTkgNzAgCisyNTIgMTk1IDEyNSAxMDkgNzAgODMgMjkgNTIgNjcgMTUzIDY1IDEwOSA5MCAxMDEgMTMyIDMyIDIgMTQ1IDI3NiA0MyAzMyAxNjAgMjQ2IAorMjMgNDkgOTAgMTIxIDE1MCAxMzUgMjYwIDE0NyAxOTEgMTY2IDExIDI0NyAzOCAxNjggNTUgMjIyIDQ2IDEyNiA5IDc0IDIxMSAxNSAKKzIyNiAxNTQgOTQgODAgMjQ4IDIzNiAyNyA4IDI1IDIyMiAxOTUgMjc0IDI1NyAyMDMgMjEyIDMwIDIzMCA0IDE5NSAyNTQgMjM5IDEwMCAKKzExNyAyOCAzNyAxNTkgMTAyIDE2NyAxNjkgMjMzIDIyNiAxNzQgMTEyIDE4MyA2NSAyMzggMjIwIDEzMSAzIDMxIDI3MCBeCis2MDkgMSAxNDAgMTQ2IDU3IDEzNyAxNjcgMTAyIDkzIDE0MyA3OCAxODIgMjQyIDc4IDY5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA2NiAKKzc0IDczIDI3NSA1IDE3NCA5MCAxNjQgMTIzIDI1NyAyMTggMjE0IDE1OCA1MiAxNzcgNjkgNDggMiAyNDIgMTI1IDU5IDUyIDExIDc5IAorMjAgMjE0IDEwNSA3MiAyNTggMyA0NiAxMDYgMjY4IDI0OSAxMTMgMTEgMzIgMzAgMTE1IDI3MSAxNSA4OCAxMzYgMjY5IDEwMCAyNDQgCis0MCAxODIgMjkgOTggMTUwIDQ3IDEwNCAyNDAgMjc2IDIzNSAxNTYgMTM3IDU0IDkyIDE5MiA5NiAxMzUgNzMgMTA5IDEzNCA3NSAxMzcgCisyNjcgMjMyIDExMSAxNjIgMjA4IDEzNCAxMjIgMTI3IDg3IDE4NSA4IDUzIDc1IDE5MCAxMjggMTUxIDE3NyAyMzUgMjY5IDE0NyAyMzQgCisxMzkgMTYgMjA1IDI2OCAxNyAxMDMgMTEwIDE0NSAyMDYgNiAxMzggMjMxIDk0IDQxIDgwIDMxIDY2IDI1MyAyMjIgMjU3IDI2NSAyMDQgCisxMzggNSA3NCAyMzkgMTQ2IDEwNCA4IDI2NiA1NSAyNjkgMzQgMjI0IDIzOCAyNDggMTAyIDE1OSAzIDE1OSAxMTYgMTY5IDE3IDU2IAorMTIwIDE2NSAyNTMgMTA5IDI0NyA4NSAxNTcgMzUgNTYgMjIwIDE2IDE1MiAxMjggMjE3IDM3IDM3IDIwMyA3NCAxNzMgMTI2IDIzIDE5MyAKKzYwIDExNiAxMjIgMjcgMjM2IDcgMjY4IDgzIDI0MiAxOTEgNzkgMTMzIDIyNCAxMjUgMjM4IDgyIDExMiA2MCA1MCAyNjIgMjI1IDIzIAorMjQwIDUwIDk2IDIzNSAyMDMgMTI3IDE1MyA0NSA4OSAxNDcgMTIxIDEyOSAxMTUgMzkgMTY1IDE4NyAyNDkgMTY2IDE1MSAxMTEgOTYgCisxODggNTMgMjggMjAwIDE0OCAxOTggMSA2NSAxMjMgOTEgMjI4IDExNSAyMDUgMTU1IDcgMjAyIDYzIDQyIDk3IDE1MiAxOTQgMjM3IAorMTE4IDI1MCAxMzAgMTMyIDE2MCAxNCAxMSAxNDUgNDAgMTYgMzkgMTE4IDM3IDE1MCAyMTMgOTQgNjAgMjI5IDEzMiA0NyA0IDExMCA5OCAKKzIxNiAxODYgMTg1IDU1IDQzIDE3NCAyNCAyNSA0MiA0NCAxMiAyNzUgMTcxIDQ1IDE4OSAxMTcgMjAgMTQ4IDg1IDI3MCAxNjQgNzYgCisyNjcgMTE5IDEwMSAyNjEgMTYxIDMxIDEzIDI3MyAxNDMgMTkxIDMyIDE0MyAxMjUgMTcyIDYyIDMxIDI0NSAxMjMgNDQgMjM4IDEzNSAKKzI1MiAyNTggMTE2IDU2IDcgMzYgNzMgNjIgMTQ0IDI1NSAyNCA5MSA2MiAyNDQgMTA2IDIwMiAxMTAgMzIgNzcgMTA1IDkxIDEyOCAyNjQgCisyNyAxMzYgMzcgMjUwIDY0IDI3MiA3OSAxOTkgODQgMjA2IDUzIDEyOCA1MSA0NyAyMTcgMjUwIDE3IDMgMjU5IDI0NiAxODcgMzYgMTg2IAorNzIgNDUgMjMgMTI3IDIwMCAxOTUgMTg4IDEwMCAxOCAyMCAyNjEgOTUgMTcxIDIxMSAxNzkgOTcgMjUyIDQ1IDI1NSAxMzcgMTAxIDgyIAorMTIgMjA5IDMyIDI0MyAyNTUgNzEgODEgMTYxIDc4IDMgOTMgMjU2IDg4IDgzIDEwIDE4MSAxNzggODYgMTIxIDE2IDEwNSAxMzggMTE4IAorODQgMTQwIDMzIDIwNyAxMTcgMTIwIDI3OCAyNjMgMTAgMTUgMTg4IDI2NiAxNjggMTE5IDIxNCAyNzEgNjIgNzggMTE2IDEwMyAxNTcgCisxMzUgMjYgMTE5IDM1IDEyMiA4MCA5NyA4NiA1NSAxNTYgMjQgNDQgMTkxIDE0NSAxNTMgMjYgMjE5IDE2NSAxNDAgOTkgNjcgMzggNTQgCisyMDUgNDIgMjc2IDIyIDE3NiAyMTggMTQ4IDE5IDEzMSAyNDMgMTQyIDYxIDE4MCAxMTQgMjU0IDE3MyAyMzkgMzMgOTQgMTA3IDIxOSAKKzIzMSAxNjAgMTgwIDEgMjQ0IDI3MiAxOTIgMjA5IDI2NCAyNTMgMTU2IDIzNyAxODQgMjcwIDIxMSAyMjYgODcgNzIgMTU4IDE1MiAyOCAKKzg3IDE5IDE4IDIzMyAyNDEgMTQgNzcgNSAxMjEgMjI5IDI0NSA1NyAxODQgMTU3IDIwMSA0NiA0MCAxMjkgNDkgMTkgODQgOTMgNDMgCisxMDggNCAyMjMgMTA4IDExNyAyMzMgOSA0IDU3IDExOCAxOCAxMjAgMTEyIDExMyAxOTAgMTgxIDEyIDk2IDIyIDYzIDIwOCAyNDcgMjUxIAorMjggMTM0IDkgMTE3IDE4NiAxMzggMTg0IDIyMyA2MSAxMjcgMTM0IDE3NSAxMDcgNiAyNTEgODEgMTE0IDIwNyAxODMgMTQwIDgwIDE5NyAKKzIxNiA3MyAxNzUgMTU0IDE1NiA3MSAxOTQgMTEgOTggNTAgMTk2IDg2IDIyMSAxNDYgNCAxNTcgODggMzYgMTM5IDgyIDIyNSAxODkgCisyMzAgMzAgNDkgMTMyIDk0IDI3MyA5MCA1MSAxMTMgNzcgNTIgMTExIDQ5IDE5OCAyMzMgNzUgMjQgMjU3IDUyIDY0IDU5IDk5IDEgMTc4IAorMTMzIDExMSAyNzUgNTggMzUgOSAyMzAgMTk2IDM5IDIzMSA0NyAxNzAgMjE2IF4KKzU4OSAwIDE5NyAxNjkgODEgNzIgNDEgMjU1IDE3NiA0NCAyMzQgOTIgMTQ1IDEwNCAxNTUgMTE0IDIwOCAyNDMgMjA4IDIwMCAyNTkgNDggCisyMSAxMDggMjI0IDQwIDgwIDE3OCAxOTcgMTI3IDE5NiAxNDggMjM3IDIyNSAyMTUgNzggMjUgMjMgMjMgNjYgMTUgMTY3IDEyNCA2NCAKKzE1IDIxMCA3MyAyMTYgOTkgMjMgMTUxIDEzMCAyNDMgMTY2IDM0IDU0IDI0NCAxNDUgMTQ3IDI1OCAxMTIgMTEgNTYgMTU5IDI2OCAxMjIgCis2NCA1OCAxNTkgMjI1IDE5IDE5MyAxMDEgMjE5IDI3NCAxMDUgNDkgMjM5IDU1IDIyMyAxMDQgNzAgMTI2IDEzMiAyMDEgMjM4IDE2MSAKKzIyNSAxMzAgOTAgMjMwIDI2MiA1MyAyNyAxMzUgOTUgMzkgNTkgNTMgNjkgMTQ3IDE5IDI3OCAyMTYgMTQgMzUgNzUgODggMjczIDEyNyAKKzE1NCAyNjMgMzIgMjY3IDE4NSAxMTcgNTkgOTUgMjM1IDcxIDI1OCAyNyAxNzcgMjYxIDExNyAxNDQgODMgMzAgMjY3IDIyOCA2NiAyMTEgCis1MiA0OCAyMiAxNzIgMTcxIDM5IDE0NCAxNjggMTQ1IDYyIDE0MyAzNiAyNTAgODYgMTIwIDIzNCA1MCAxMzMgMTgwIDcwIDg0IDI0NyAKKzI3NyAyODAgMTMxIDEzNyAxMCAxNjIgMTYxIDE0MCAxNDIgMTQgMTg4IDExIDE0MSAyNzQgNjMgMTY0IDM0IDk3IDE5MyAxNiAxMDQgCisxOTggNjMgNzkgMjAwIDIxIDE1MSAxNzMgMTkyIDM3IDI3MiAxNDggNDEgNTkgMTAgMTIwIDE0OSAyMTYgNTcgMTM4IDIyNyA0NSAyMTMgCisyMDUgNjggMTI2IDE3NSAxNTAgMTA5IDExOCAzOCAyMDggMTU4IDkzIDEyNCAyMTcgNzggMjYzIDc0IDE1MiAxMDkgNzUgODkgNTYgMjAxIAorMTUzIDQ2IDE0OSAyMTUgMTIwIDE5MSAxMDEgMjYyIDk2IDI1NyAxMzMgNTIgMTMzIDEzNyAyNDggMjEzIDkgMTgzIDIwMiAyMTcgMjc0IAorMTQ4IDI3OSAxMTAgMTM5IDE2MyA1NSAyNjUgMjcwIDI3NSA4NCA4IDE2MiAyMDQgODkgMTMgMjUyIDEgODkgMjA5IDEzNyAyMDYgNDcgCis4NSA5OCAxNzIgMjU2IDE1NCAyMjAgMjEwIDExNSAxMDEgMjMgMTA4IDE4MSA5MSAyMDkgOTQgMTAzIDE3NiAxIDQgOTQgNjEgMTAgNzcgCis0NiA2NCAxMDAgNDQgMTQ5IDI1OCA2OSA2MiAxODUgMjAyIDE3NCAxNzEgMjc3IDE5NSAxNiA2MSAyNDkgMTkyIDEyMiAxMDYgNzAgODMgCisyOSA0OSA2NyAxNDcgNjIgMTAwIDg3IDk4IDEyOSAyNiAyIDEzNiAyNzAgMzcgMzMgMTYwIDI0NiAxNyA0MCA4MSAxMTUgMTQ0IDEyNiAKKzI2MCAxMzggMTg1IDE2MCA4IDI0NyAzOCAxNjUgNTUgMjIyIDQwIDEyMyA2OCAyMTEgOSAyMjYgMTUxIDg4IDc3IDI0MiAyMzAgMjQgMiAKKzI1IDIxOSAxODkgMjcxIDI1NCAxOTcgMjEyIDMwIDIyNCAyNzkgMTk1IDI1NCAyMzkgOTcgMTA4IDI4IDI4IDE1NiA5MyAxNjcgMTY2IAorMjMwIDIyMCAxNjggMTAzIDE3NyA2NSAyMzIgMjIwIDEyNSAyNSAyNjIgMTM4IDE0MiA1NyAxMzcgMTYzIDk4IDg3IDE0MSA3OCAxNzggCisyNDAgNzYgNjcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDYwIDc0IDY3IDI3NSAyODAgMTc0IDg2IDE2MiAxMTkgMjU1IDIxOCAyMTAgMTU4IAorNTAgMTc1IDY1IDI3NSA0MiAyNzcgMjM4IDExOSA1OSA1MiA1IDczIDIwIDIxNCA5OSA2NiAyNTQgMSA0NiAxMDYgMjY2IDI0OSAxMDcgNyAKKzMwIDI4IDExMyAyNzEgMTUgODIgMTM2IDI2OSAxMDAgMjQwIDM0IDE4MiAyNyA5MiAxNDYgNDEgMTAyIDI0MCAyNzIgMjMzIDE1NiAxMzUgCis1MiA5MCAxODggOTYgMTI5IDY5IDEwNSAxMzQgNzMgMTMxIDI2NSAyMjggMTA5IDE2MCAyMDQgMTMyIDExNiAxMjMgODUgMTgzIDYgNTEgCis2OSAxOTAgMTIyIDE0OSAxNzMgMjM1IDI2NyAxNDMgMjMyIDEzNSAxMCAyMDUgMjY0IDExIDk5IDEwOCAxMzkgMjA2IDQgMTM2IDIyNyAKKzg4IDM1IDc2IDI1IDY2IDI1MyAyMTggMjUzIDI2MSAyMDIgMTMyIDUgNzIgMjM3IDE0MCAxMDAgMiAyNjQgNTMgMjY1IDMyIDIyNCAyMzYgCisyNDYgMTAyIDE1NSAzIDE1NyAxMTQgMTY1IDEzIDU2IDExNiAxNjUgMjUxIDEwNyAyNDUgODEgMTU3IDI5IDUwIDIxOCAxNCAxNDYgMTI2IAorMjE3IDM1IDMzIDIwMyA2OCAxNjkgMTI0IDIxIDE5MyA1OCAxMTYgMTIyIDIxIDIzNiA3IDI2OCA3OSAyNDIgMTg3IDc1IDEzMSAyMjIgCisxMjUgMjM4IDc2IDExMCA1NCA0OCAyNjAgMjIzIDE5IDIzNiA1MCA5MCAyMzEgMTk5IDEyNyAxNTMgNDUgMjcwIF4KKzYyMyAxIDEzNSAxMjEgMTI1IDEwNyAyNyAxNTcgMTc5IDI0MSAxNjYgMTM5IDk5IDg4IDE4OCA1MyAyNCAxOTYgMTQ4IDE5MCAyNzIgNjEgCisxMTkgNzkgMjI0IDEwMyAyMDEgMTUxIDI4MiAxOTggNjMgMzAgOTcgMTQ4IDE5NCAyMjkgMTEwIDI1MCAxMjYgMTMyIDE1NiAyIDcgMTM3IAorMzIgOCAzMSAxMTggMzcgMTM4IDIwOSA5NCA2MCAyMjUgMTI4IDQ3IDI3OSAxMTAgOTQgMjEyIDE4MiAxNzcgNDMgNDMgMTY2IDEyIDEzIAorMzggMzIgMTIgMjcxIDE2NyAzMyAxODUgMTE3IDEyIDE0NCA4MSAyNjYgMTY0IDc2IDI1OSAxMTUgMTAxIDI2MSAxNTcgMjcgMSAyNjUgCisxNDMgMTg3IDMyIDEzNSAxMTcgMTY4IDU4IDMxIDI0NSAxMjMgNDAgMjMwIDEzNSAyNDQgMjU0IDEwOCA1MiAzIDI0IDY5IDYyIDE0MCAKKzI1MSAyMCA4MyA1MCAyNDQgOTggMTk0IDEwMiAyNCA2NSAxMDUgOTEgMTIwIDI1NiAyNyAxMzIgMjUgMjQyIDU2IDI2OCA3OSAxOTkgODQgCisyMDIgNDEgMTI4IDQzIDM5IDIwOSAyNDYgMTcgMjc0IDI1OSAyNDIgMTg3IDI4IDE3OCA2OCAzNyAxMSAxMjMgMTkyIDE4NyAxODQgOTIgCisxOCAxNiAyNTMgODcgMTYzIDIwNyAxNzkgODUgMjUyIDQxIDI1NSAxMjkgODkgODIgNCAyMDEgMjAgMjM5IDI0NyA1OSA3NyAxNTMgNjYgCisyNzggODUgMjQ4IDg0IDcxIDI4MSAxNzcgMTc0IDg2IDExNyAxNiAxMDEgMTMwIDExNCA3NiAxMzIgMjkgMTk5IDEwNSAxMTYgMjc0IAorMjU1IDIgMyAxODAgMjY2IDE2MCAxMTkgMjEwIDI2NyA1NCA3MCAxMDQgOTEgMTQ1IDEyNyAyNiAxMDcgMzEgMTE0IDgwIDg5IDc4IDQ3IAorMTUyIDI0IDQ0IDE5MSAxNDEgMTQxIDE0IDIxMSAxNjEgMTQwIDk5IDYzIDM0IDU0IDE5NyA0MiAyNzYgMTggMTY4IDIxMCAxMzYgMTEgCisxMTkgMjM1IDEzOCA1MyAxODAgMTEwIDI0NiAxNjkgMjMxIDI1IDkwIDk5IDIxOSAyMzEgMTUyIDE3NiAxIDI0MCAyNzIgMTg4IDIwNSAKKzI2NCAyNDUgMTQ0IDIzNyAxODAgMjYyIDIwMyAyMTggNzkgNzIgMTQ2IDE1MiAyMCA4NyA3IDEwIDIyOSAyNDEgMTAgNzcgMSAxMDkgCisyMjkgMjM3IDUzIDE3NiAxNTMgMTk3IDM4IDM2IDExNyAzNyAxNSA4MCA5MyAzNSA5NiAyMTkgMTAwIDEwOSAyMjUgMjgwIDQgNDUgMTA2IAorNiAxMjAgMTAwIDExMyAxODIgMTgxIDkyIDE0IDU5IDIwNCAyMzkgMjUxIDE2IDEyNiAxIDExMyAxODYgMTM4IDE4NCAyMjMgNjEgMTE1IAorMTIyIDE3NSAxMDcgNiAyNDMgODEgMTE0IDIwNyAxNzUgMTI4IDY4IDE5MyAyMDggNzMgMTcxIDE0NiAxNDggNjMgMTg2IDExIDk4IDM4IAorMTg4IDc0IDIyMSAxNDYgMjc1IDE0OSA4OCAzMiAxMzkgNzQgMjE3IDE4OSAyMjYgMTggNDEgMTI0IDg2IDI3MyA3OCA1MSAxMDkgNzMgCis0MCAxMDMgNDkgMTk0IDIzMyA2NyAxNiAyNTcgNDQgNjQgNTUgOTEgMjc2IDE3MCAxMjUgMTExIDI2NyA1OCAyNyA1IDIyMiAxOTIgMzUgCisyMjcgNDMgMTcwIDI1MiAxOTcgMTY5IDc5IDY4IDQxIDI1MSAxNzIgNDAgMjM0IDkyIDE0NSAxMDIgMTU1IDEwOCAyMDQgMjQzIDIwOCAKKzIwMCAyNTcgNDggMjEgMTA0IDIyMiA0MCA3OCAxNzggMTk1IDEyMyAxOTYgMTQ0IDIzMyAyMjMgMjEzIDcyIDIzIDIzIDE5IDYyIDEzIAorMTY1IDExOCA2MiA5IDIwOCA2OSAyMTQgOTcgMTcgMTUxIDEzMCAyNDEgMTYyIDM0IDUwIDI0MCAxNDEgMTQ1IDI1NCAxMTIgOSA1MiAKKzE1NSAyNjQgMTE4IDU4IDUyIDE1OSAyMjEgMTkgMTg5IDk5IDIxNSAyNzQgMTAzIDQ1IDIzNyA0OSAyMTkgMTA0IDY2IDEyNiAxMjggCisxOTkgMjM2IDE1OSAyMjUgMTI0IDkwIDIzMCAyNjIgNDcgMjEgMTI5IDkzIDM5IDUzIDQ5IDY3IDE0NyAxNyAyNzggMjE2IDggMzUgNzUgCis4NiAyNjkgMTIxIDE1MCAyNjEgMjYgMjY3IDE4NSAxMTMgNTUgOTUgMjMzIDcxIDI1NiAyMyAxNzUgMjU5IDExMSAxNDQgNzcgMjYgMjYzIAorMjI4IDY0IDIwNyA0OCA0MiAxOCAxNzIgMTY3IDM3IDE0MiAxNjYgMTQzIDU2IDEzNyAzNiAyNDggODAgMTE0IDIzMiA0NiAxMjcgMTc4IAorNjQgODAgMjQ1IDI3NSAyODAgMTMxIDEzMSA4IDE2MiAxNjEgMTM2IDE0MiAxNCAxODYgNyAxNDEgMjcyIDU3IDE2MiAzMCA5MyAxOTEgCisxMCA5OCAxOTggNTkgNzMgMTk2IDE3IDE0NyAxNzMgMTkyIDMxIDI3MCAxNDIgMzkgNTcgNiAxMTYgMTQzIDIxMiA1MSAxMzQgMjI3IDM5IAorMjEzIDIwMyA2NiAxMjIgMTcxIDE1MCAxMDUgMTEyIDM0IDIwNiAxNTQgOTEgMTI0IDIxMyA3NiAyNjMgNzIgMTUwIDEwOSA2OSA4MyA1NCAKKzIwMSAxNDcgNDIgMTQ5IDIwMiBeCis2MDIgMSAxMTYgMTg3IDg5IDI1NCA4NCAyNTMgMTMzIDQwIDEyOSAxMzMgMjQ4IDIwOSA5IDE4MyAxOTQgMjEzIDI2NiAxNDQgMjc5IAorMTAyIDEzNSAxNjMgNDcgMjY1IDI3MCAyNzEgODAgOCAxNTQgMjA0IDg1IDkgMjQ4IDI3NCA4OSAyMDEgMTI5IDE5OCA0MyA4NSA4NiAKKzE2OCAyNTYgMTU0IDIxNiAyMTAgMTE1IDkzIDE5IDEwOCAxNzcgODcgMjA5IDg2IDEwMyAxNzYgMjc4IDI4MSA4MiA1MyAxMCA2OSA0MiAKKzU2IDk2IDQwIDE0MSAyNTggNjkgNTQgMTgxIDIwMiAxNzAgMTcxIDI3NyAxODcgMTIgNDkgMjQ1IDE4OCAxMTggMTAyIDcwIDgzIDI5IAorNDUgNjcgMTM5IDU4IDg4IDgzIDk0IDEyNSAxOCAyIDEyNCAyNjIgMjkgMzMgMTYwIDI0NiA5IDI4IDY5IDEwNyAxMzYgMTE0IDI2MCAKKzEyNiAxNzcgMTUyIDQgMjQ3IDM4IDE2MSA1NSAyMjIgMzIgMTE5IDI3MyA2MCAyMTEgMSAyMjYgMTQ3IDgwIDczIDIzNCAyMjIgMjAgCisyNzkgMjUgMjE1IDE4MSAyNjcgMjUwIDE4OSAyMTIgMzAgMjE2IDI3NSAxOTUgMjU0IDIzOSA5MyA5NiAyOCAxNiAxNTIgODEgMTY3IAorMTYyIDIyNiAyMTIgMTYwIDkxIDE2OSA2NSAyMjQgMjIwIDExNyAyODEgMTcgMjU4IDEzNCAxMzQgNTcgMTM3IDE1NSA5MCA3NSAxMzcgCis3OCAxNzAgMjM2IDcyIDYzIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA0OCA3NCA1NSAyNzUgMjcyIDE3NCA3OCAxNTggMTExIDI1MSAyMTggCisyMDIgMTU4IDQ2IDE3MSA1NyAyNjcgMzAgMjY5IDIzMCAxMDcgNTkgNTIgMjc4IDYxIDIwIDIxNCA4NyA1NCAyNDYgMjgyIDQ2IDEwNiAKKzI2MiAyNDkgOTUgMjg0IDI2IDI0IDEwOSAyNzEgMTUgNzAgMTM2IDI2OSAxMDAgMjMyIDIyIDE4MiAyMyA4MCAxMzggMjkgOTggMjQwIAorMjY0IDIyOSAxNTYgMTMxIDQ4IDg2IDE4MCA5NiAxMTcgNjEgOTcgMTM0IDY5IDExOSAyNjEgMjIwIDEwNSAxNTYgMTk2IDEyOCAxMDQgCisxMTUgODEgMTc5IDIgNDcgNTcgMTkwIDExMCAxNDUgMTY1IDIzNSAyNjMgMTM1IDIyOCAxMjcgMjgzIDIwNSAyNTYgMjg0IDkxIDEwNCAKKzEyNyAyMDYgMTMyIDIxOSA3NiAyMyA2OCAxMyA2NiAyNTMgMjEwIDI0NSAyNTMgMTk4IDEyMCA1IDY4IDIzMyAxMjggOTIgMjc1IDI2MCAKKzQ5IDI1NyAyOCAyMjQgMjMyIDI0MiAxMDIgMTQ3IDMgMTUzIDExMCAxNTcgNSA1NiAxMDggMTY1IDI0NyAxMDMgMjQxIDczIDE1NyAxNyAKKzM4IDIxNCAxMCAxMzQgMTIyIDIxNyAzMSAyNSAyMDMgNTYgMTYxIDEyMCAxNyAxOTMgNTQgMTE2IDEyMiA5IDIzNiA3IDI2OCA3MSAyNDIgCisxNzkgNjcgMTI3IDIxOCAxMjUgMjM4IDY0IDEwNiA0MiA0NCAyNTYgMjE5IDExIDIyOCA1MCA3OCAyMjMgMTkxIDEyNyAxNTMgNDUgNzcgCisxMjkgMTIxIDEyMyAxMDMgMjEgMTUzIDE3NSAyMzcgMTY2IDEzMyA5MyA4NCAxODggNTMgMjIgMTk0IDE0OCAxODYgMjY4IDU5IDExNyAKKzczIDIyMiA5NyAxOTkgMTQ5IDI4MCAxOTYgNjMgMjQgOTcgMTQ2IDE5NCAyMjUgMTA2IDI1MCAxMjQgMTMyIDE1NCAyODEgNSAxMzMgMjggCis0IDI3IDExOCAzNyAxMzIgMjA3IDk0IDYwIDIyMyAxMjYgNDcgMjc3IDExMCA5MiAyMTAgMTgwIDE3MyAzNyA0MyAxNjIgNiA3IDM2IDI2IAorMTIgMjY5IDE2NSAyNyAxODMgMTE3IDggMTQyIDc5IDI2NCAxNjQgNzYgMjU1IDExMyAxMDEgMjYxIDE1NSAyNSAyODAgMjYxIDE0MyAKKzE4NSAzMiAxMzEgMTEzIDE2NiA1NiAzMSAyNDUgMTIzIDM4IDIyNiAxMzUgMjQwIDI1MiAxMDQgNTAgMSAxOCA2NyA2MiAxMzggMjQ5IAorMTggNzkgNDQgMjQ0IDk0IDE5MCA5OCAyMCA1OSAxMDUgOTEgMTE2IDI1MiAyNyAxMzAgMTkgMjM4IDUyIDI2NiA3OSAxOTkgODQgMjAwIAorMzUgMTI4IDM5IDM1IDIwNSAyNDQgMTcgMjcwIDI1OSAyNDAgMTg3IDI0IDE3NCA2NiAzMyA1IDEyMSAxODggMTgzIDE4MiA4OCAxOCAxNCAKKzI0OSA4MyAxNTkgMjA1IDE3OSA3OSAyNTIgMzkgMjU1IDEyNSA4MyA4MiAxOTcgMTQgMjM3IDI0MyA1MyA3NSAxNDkgNjAgMjc2IDgxIAorMjQ0IDgyIDY1IDI3NyAxNzUgMTcyIDg2IDExNSAxNiA5OSAxMjYgMTEyIDcyIDEyOCAyNyAxOTUgOTkgMTE0IDI3MiAyNTEgMjgzIDI4MiAKKzE3NiAyNjYgMTU2IDExOSAyMDggMjY1IDUwIDY2IDk4IDg1IDEzOSAxMjMgMjYgMTAxIDI5IDExMCA4MCA4NSA3NCA0MyAxNTAgMjQgNDQgCisxOTEgMTM5IDEzNSA4IDIwNyAxNTkgMTQwIDk5IDYxIDI0OCBeCis2MDkgMSA1NCAxODkgNDIgMjc2IDE0IDE2MCAyMDIgMTI0IDMgMTA3IDIyNyAxMzQgNDUgMTgwIDEwNiAyMzggMTY1IDIyMyAxNyA4NiAKKzkxIDIxOSAyMzEgMTQ0IDE3MiAxIDIzNiAyNzIgMTg0IDIwMSAyNjQgMjM3IDEzMiAyMzcgMTc2IDI1NCAxOTUgMjEwIDcxIDcyIDEzNCAKKzE1MiAxMiA4NyAyODIgMiAyMjUgMjQxIDYgNzcgMjg0IDk3IDIyOSAyMjkgNDkgMTY4IDE0OSAxOTMgMzAgMzIgMTA1IDI1IDExIDc2IAorOTMgMjcgODQgMjgzIDIxNSA5MiAxMDEgMjE3IDI3MiA0IDMzIDk0IDI4MSAxMjAgODggMTEzIDE3NCAxODEgMjc1IDg4IDYgNTUgMjAwIAorMjMxIDI1MSA0IDExOCAyODAgMTA5IDE4NiAxMzggMTg0IDIyMyA2MSAxMDMgMTEwIDE3NSAxMDcgNiAyMzUgODEgMTE0IDIwNyAxNjcgCisxMTYgNTYgMTg5IDIwMCA3MyAxNjcgMTM4IDE0MCA1NSAxNzggMTEgOTggMjYgMTgwIDYyIDIyMSAxNDYgMjY3IDE0MSA4OCAyOCAxMzkgCis2NiAyMDkgMTg5IDIyMiA2IDMzIDExNiA3OCAyNzMgNjYgNTEgMTA1IDY5IDI4IDk1IDQ5IDE5MCAyMzMgNTkgOCAyNTcgMzYgNjQgNTEgCis4MyAyNzIgMTYyIDExNyAxMTEgMjU5IDU4IDE5IDEgMjE0IDE4OCAzMSAyMjMgMzkgMTcwIDI0NCAxOTcgMTY5IDc1IDYwIDQxIDI0MyAKKzE2NCAzMiAyMzQgOTIgMTQ1IDk4IDE1NSA5NiAxOTYgMjQzIDIwOCAyMDAgMjUzIDQ4IDIxIDk2IDIxOCA0MCA3NCAxNzggMTkxIDExNSAKKzE5NiAxMzYgMjI1IDIxOSAyMDkgNjAgMTkgMjMgMTEgNTQgOSAxNjEgMTA2IDU4IDI4NCAyMDQgNjEgMjEwIDkzIDUgMTUxIDEzMCAyMzcgCisxNTQgMzQgNDIgMjMyIDEzMyAxNDEgMjQ2IDExMiA1IDQ0IDE0NyAyNTYgMTEwIDQ2IDQwIDE1OSAyMTMgMTkgMTgxIDk1IDIwNyAyNzQgCis5OSAzNyAyMzMgMzcgMjExIDEwNCA1OCAxMjYgMTIwIDE5NSAyMzIgMTU1IDIyNSAxMTIgOTAgMjMwIDI2MiAzNSA5IDExNyA4OSAzOSAKKzQxIDQxIDYzIDE0NyAxMyAyNzggMjE2IDI4MyAzNSA3NSA4MiAyNjEgMTA5IDE0MiAyNTcgMTQgMjY3IDE4NSAxMDUgNDcgOTUgMjI5IAorNzEgMjUyIDE1IDE3MSAyNTUgOTkgMTQ0IDY1IDE4IDI1NSAyMjggNjAgMTk5IDQwIDMwIDEwIDE3MiAxNTkgMzMgMTM4IDE2MiAxMzkgCis0NCAxMjUgMzYgMjQ0IDY4IDEwMiAyMjggMzggMTE1IDE3NCA1MiA3MiAyNDEgMjcxIDI4MCAxMzEgMTE5IDQgMTYyIDE2MSAxMjggMTQyIAorMTQgMTgyIDI4NiAxNDEgMjY4IDQ1IDE1OCAyMiA4NSAxODcgMjg1IDg2IDE5OCA1MSA2MSAxODggOSAxMzkgMTczIDE5MiAxOSAyNjYgCisxMzAgMzUgNTMgMjg1IDEwOCAxMzEgMjA0IDM5IDEyNiAyMjcgMjcgMjEzIDE5OSA2MiAxMTQgMTYzIDE1MCA5NyAxMDAgMjYgMjAyIAorMTQ2IDg3IDEyNCAyMDUgNzIgMjYzIDY4IDE0NiAxMDkgNTcgNzEgNTAgMjAxIDEzNSAzNCAxNDkgMjE1IDExNCAxODUgODMgMjUwIDc4IAorMjUxIDEzMyAzNCAxMjcgMTMxIDI0OCAyMDcgOSAxODMgMTkwIDIxMSAyNjIgMTQyIDI3OSA5OCAxMzMgMTYzIDQzIDI2NSAyNzAgMjY5IAorNzggOCAxNTAgMjA0IDgzIDcgMjQ2IDI3MCA4OSAxOTcgMTI1IDE5NCA0MSA4NSA4MCAxNjYgMjU2IDE1NCAyMTQgMjEwIDExNSA4OSAxNyAKKzEwOCAxNzUgODUgMjA5IDgyIDEwMyAxNzYgMjc2IDI3OSA3NiA0OSAxMCA2NSA0MCA1MiA5NCAzOCAxMzcgMjU4IDY5IDUwIDE3OSAyMDIgCisxNjggMTcxIDI3NyAxODMgMTAgNDMgMjQzIDE4NiAxMTYgMTAwIDcwIDgzIDI5IDQzIDY3IDEzNSA1NiA4MiA4MSA5MiAxMjMgMTQgMiAKKzExOCAyNTggMjUgMzMgMTYwIDI0NiA1IDIyIDYzIDEwMyAxMzIgMTA4IDI2MCAxMjAgMTczIDE0OCAyIDI0NyAzOCAxNTkgNTUgMjIyIAorMjggMTE3IDI2OSA1NiAyMTEgMjg0IDIyNiAxNDUgNzYgNzEgMjMwIDIxOCAxOCAyNzcgMjUgMjEzIDE3NyAyNjUgMjQ4IDE4NSAyMTIgCiszMCAyMTIgMjczIDE5NSAyNTQgMjM5IDkxIDkwIDI4IDEwIDE1MCA3NSAxNjcgMTYwIDIyNCAyMDggMTU2IDg1IDE2NSA2NSAyMjAgMjIwIAorMTEzIDI4MSAxMyAyNTYgMTMyIDEzMCA1NyAxMzcgMTUxIDg2IDY5IDEzNSA3OCAxNjYgMjM0IDcwIDYxIDIzMiAxNzcgMjIgMTI5IDY4IAorMTY4IDQyIDc0IDQ5IDI3NSAyNjggMTc0IDc0IDE1NiAxMDcgMjQ5IDIxOCAxOTggMTU4IDQ0IDE2OSA1MyAyNjMgMjQgMjY1IDIyNiAKKzEwMSA1OSA1MiAyNzQgNTUgMjAgMjE0IDgxIDQ4IDI0MiAyODIgNDYgMTA2IDI2MCAxNDUgXgorNjE0IDEgODMgMjgwIDIyIDIwIDEwNSAyNzEgMTUgNTggMTM2IDI2OSAxMDAgMjI0IDEwIDE4MiAxOSA2OCAxMzAgMTcgOTQgMjQwIDI1NiAKKzIyNSAxNTYgMTI3IDQ0IDgyIDE3MiA5NiAxMDUgNTMgODkgMTM0IDY1IDEwNyAyNTcgMjEyIDEwMSAxNTIgMTg4IDEyNCA5MiAxMDcgNzcgCisxNzUgMjg3IDQzIDQ1IDE5MCA5OCAxNDEgMTU3IDIzNSAyNTkgMTI3IDIyNCAxMTkgMjc1IDIwNSAyNDggMjc2IDgzIDEwMCAxMTUgMjA2IAorMjg1IDEyOCAyMTEgNjQgMTEgNjAgMSA2NiAyNTMgMjAyIDIzNyAyNDUgMTk0IDEwOCA1IDY0IDIyOSAxMTYgODQgMjY3IDI1NiA0NSAKKzI0OSAyNCAyMjQgMjI4IDIzOCAxMDIgMTM5IDMgMTQ5IDEwNiAxNDkgMjg2IDU2IDEwMCAxNjUgMjQzIDk5IDIzNyA2NSAxNTcgNSAyNiAKKzIxMCA2IDEyMiAxMTggMjE3IDI3IDE3IDIwMyA0NCAxNTMgMTE2IDEzIDE5MyA1MCAxMTYgMTIyIDI4NiAyMzYgNyAyNjggNjMgMjQyIAorMTcxIDU5IDEyMyAyMTQgMTI1IDIzOCA1MiAxMDIgMzAgNDAgMjUyIDIxNSAzIDIyMCA1MCA2NiAyMTUgMTgzIDEyNyAxNTMgNDUgNjkgCisxMTcgMTIxIDExOSA5NSA5IDE0NSAxNjcgMjI5IDE2NiAxMjEgODEgNzYgMTg4IDUzIDE4IDE5MCAxNDggMTc4IDI2MCA1NSAxMTMgNjEgCisyMTggODUgMTk1IDE0NSAyNzYgMTkyIDYzIDEyIDk3IDE0MiAxOTQgMjE3IDk4IDI1MCAxMjAgMTMyIDE1MCAyNzMgMSAxMjUgMjAgMjg1IAorMTkgMTE4IDM3IDEyMCAyMDMgOTQgNjAgMjE5IDEyMiA0NyAyNzMgMTEwIDg4IDIwNiAxNzYgMTY1IDI1IDQzIDE1NCAyODMgMjg0IDMyIAorMTQgMTIgMjY1IDE2MSAxNSAxNzkgMTE3IDEzOCA3NSAyNjAgMTY0IDc2IDI0NyAxMDkgMTAxIDI2MSAxNTEgMjEgMjcyIDI1MyAxNDMgCisxODEgMzIgMTIzIDEwNSAxNjIgNTIgMzEgMjQ1IDEyMyAzNCAyMTggMTM1IDIzMiAyNDggOTYgNDYgMjg2IDYgNjMgNjIgMTM0IDI0NSAKKzE0IDcxIDMyIDI0NCA4NiAxODIgOTAgMTIgNDcgMTA1IDkxIDEwOCAyNDQgMjcgMTI2IDcgMjMwIDQ0IDI2MiA3OSAxOTkgODQgMTk2IAorMjMgMTI4IDMxIDI3IDE5NyAyNDAgMTcgMjYyIDI1OSAyMzYgMTg3IDE2IDE2NiA2MiAyNSAyODIgMTE3IDE4MCAxNzUgMTc4IDgwIDE4IAorMTAgMjQxIDc1IDE1MSAyMDEgMTc5IDY3IDI1MiAzNSAyNTUgMTE3IDcxIDgyIDI4MSAxODkgMiAyMzMgMjM1IDQxIDcxIDE0MSA0OCAKKzI3MiA3MyAyMzYgNzggNTMgMjY5IDE3MSAxNjggODYgMTExIDE2IDk1IDExOCAxMDggNjQgMTIwIDIzIDE4NyA4NyAxMTAgMjY4IDI0MyAKKzI3OSAyNzQgMTY4IDI2NiAxNDggMTE5IDIwNCAyNjEgNDIgNTggODYgNzMgMTI3IDExNSAyNiA4OSAyNSAxMDIgODAgNzcgNjYgMzUgCisxNDYgMjQgNDQgMTkxIDEzNSAxMjMgMjg1IDE5OSAxNTUgMTQwIDk5IDU3IDI4IDU0IDE4NSA0MiAyNzYgMTIgMTU2IDE5OCAxMTggMjg4IAorMTAxIDIyMyAxMzIgNDEgMTgwIDEwNCAyMzQgMTYzIDIxOSAxMyA4NCA4NyAyMTkgMjMxIDE0MCAxNzAgMSAyMzQgMjcyIDE4MiAxOTkgCisyNjQgMjMzIDEyNiAyMzcgMTc0IDI1MCAxOTEgMjA2IDY3IDcyIDEyOCAxNTIgOCA4NyAyNzggMjg3IDIyMyAyNDEgNCA3NyAyODQgOTEgCisyMjkgMjI1IDQ3IDE2NCAxNDcgMTkxIDI2IDMwIDk5IDE5IDkgNzQgOTMgMjMgNzggMjgzIDIxMyA4OCA5NyAyMTMgMjY4IDQgMjcgODggCisyNzcgMTIwIDgyIDExMyAxNzAgMTgxIDI3MSA4NiAyIDUzIDE5OCAyMjcgMjUxIDI4NyAxMTQgMjc4IDEwNyAxODYgMTM4IDE4NCAyMjMgCis2MSA5NyAxMDQgMTc1IDEwNyA2IDIzMSA4MSAxMTQgMjA3IDE2MyAxMTAgNTAgMTg3IDE5NiA3MyAxNjUgMTM0IDEzNiA1MSAxNzQgMTEgCis5OCAyMCAxNzYgNTYgMjIxIDE0NiAyNjMgMTM3IDg4IDI2IDEzOSA2MiAyMDUgMTg5IDIyMCAyOSAxMTIgNzQgMjczIDYwIDUxIDEwMyAKKzY3IDIyIDkxIDQ5IDE4OCAyMzMgNTUgNCAyNTcgMzIgNjQgNDkgNzkgMjcwIDE1OCAxMTMgMTExIDI1NSA1OCAxNSAyODggMjEwIDE4NiAKKzI5IDIyMSAzNyAxNzAgMjQwIDE5NyAxNjkgNzMgNTYgNDEgMjM5IDE2MCAyOCAyMzQgOTIgMTQ1IDk2IDE1NSA5MCAxOTIgMjQzIDIwOCAKKzIwMCAyNTEgNDggMjEgOTIgMjE2IDQwIDcyIDE3OCAxODkgMTExIDE5NiAxMzIgMjIxIDIxNyAyMDcgNTQgMTcgMjMgNyA1MCA3IDE1OSAKKzEwMCA1NiAyODAgMjAyIDU3IDIwOCA5MSAyODggMTUxIDEzMCAyMzUgMTUwIDM0IDM4IDIyOCAxMjkgMTM5IDI0MiAxMTIgMjI2IF4KKzYxOSAwIDM4IDE0MSAyNTAgMTA0IDM3IDMxIDE1OSAyMDcgMTkgMTc1IDkyIDIwMSAyNzQgOTYgMzEgMjMwIDI4IDIwNSAxMDQgNTIgCisxMjYgMTE0IDE5MiAyMjkgMTUyIDIyNSAxMDMgOTAgMjMwIDI2MiAyNiAxMDggODYgMzkgMzIgMzUgNjAgMTQ3IDEwIDI3OCAyMTYgMjc3IAorMzUgNzUgNzkgMjU1IDEwMCAxMzYgMjU0IDUgMjY3IDE4NSA5OSA0MSA5NSAyMjYgNzEgMjQ5IDkgMTY4IDI1MiA5MCAxNDQgNTYgMTIgCisyNDkgMjI4IDU3IDE5MyAzNCAyMSA0IDE3MiAxNTMgMzAgMTM1IDE1OSAxMzYgMzUgMTE2IDM2IDI0MSA1OSA5MyAyMjUgMzIgMTA2IAorMTcxIDQzIDY2IDIzOCAyNjggMjgwIDEzMSAxMTAgMSAxNjIgMTYxIDEyMiAxNDIgMTQgMTc5IDI4MyAxNDEgMjY1IDM2IDE1NSAxNiA3OSAKKzE4NCAyNzkgNzcgMTk4IDQ1IDUyIDE4MiAzIDEzMyAxNzMgMTkyIDEwIDI2MyAxMjEgMzIgNTAgMjgyIDEwMiAxMjIgMTk4IDMwIDEyMCAKKzIyNyAxOCAyMTMgMTk2IDU5IDEwOCAxNTcgMTUwIDkxIDkxIDIwIDE5OSAxNDAgODQgMTI0IDE5OSA2OSAyNjMgNjUgMTQzIDEwOSA0OCAKKzYyIDQ3IDIwMSAxMjYgMjggMTQ5IDIxNSAxMTEgMTgyIDc0IDI0NCA2OSAyNDggMTMzIDI1IDEyNCAxMjggMjQ4IDIwNCA5IDE4MyAxODQgCisyMDggMjU2IDEzOSAyNzkgOTIgMTMwIDE2MyAzNyAyNjUgMjcwIDI2NiA3NSA4IDE0NCAyMDQgODAgNCAyNDMgMjY0IDg5IDE5MSAxMTkgCisxODggMzggODUgNzEgMTYzIDI1NiAxNTQgMjExIDIxMCAxMTUgODMgMTQgMTA4IDE3MiA4MiAyMDkgNzYgMTAzIDE3NiAyNzMgMjc2IDY3IAorNDMgMTAgNTkgMzcgNDYgOTEgMzUgMTMxIDI1OCA2OSA0NCAxNzYgMjAyIDE2NSAxNzEgMjc3IDE3NyA3IDM0IDI0MCAxODMgMTEzIDk3IAorNzAgODMgMjkgNDAgNjcgMTI5IDUzIDczIDc4IDg5IDEyMCA4IDIgMTA5IDI1MiAxOSAzMyAxNjAgMjQ2IDI4OSAxMyA1NCA5NyAxMjYgCis5OSAyNjAgMTExIDE2NyAxNDIgMjg5IDI0NyAzOCAxNTYgNTUgMjIyIDIyIDExNCAyNjMgNTAgMjExIDI4MSAyMjYgMTQyIDcwIDY4IAorMjI0IDIxMiAxNSAyNzQgMjUgMjEwIDE3MSAyNjIgMjQ1IDE3OSAyMTIgMzAgMjA2IDI3MCAxOTUgMjU0IDIzOSA4OCA4MSAyOCAxIDE0NyAKKzY2IDE2NyAxNTcgMjIxIDIwMiAxNTAgNzYgMTU5IDY1IDIxNCAyMjAgMTA3IDI4MSA3IDI1MyAxMjkgMTI0IDU3IDEzNyAxNDUgODAgNjAgCisxMzIgNzggMTYwIDIzMSA2NyA1OCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzMgNzQgNDAgMjc1IDI2MiAxNzQgNjggMTUzIDEwMSAyNDYgCisyMTggMTkyIDE1OCA0MSAxNjYgNDcgMjU3IDE1IDI1OSAyMjAgOTIgNTkgNTIgMjY4IDQ2IDIwIDIxNCA3MiAzOSAyMzYgMjgyIDQ2IAorMTA2IDI1NyAyNDkgODAgMjc5IDIxIDE5IDEwNCAyNzEgMTUgNTUgMTM2IDI2OSAxMDAgMjIyIDcgMTgyIDE4IDY1IDEyOCAxNCA5MyAKKzI0MCAyNTQgMjI0IDE1NiAxMjYgNDMgODEgMTcwIDk2IDEwMiA1MSA4NyAxMzQgNjQgMTA0IDI1NiAyMTAgMTAwIDE1MSAxODYgMTIzIAorODkgMTA1IDc2IDE3NCAyODcgNDIgNDIgMTkwIDk1IDE0MCAxNTUgMjM1IDI1OCAxMjUgMjIzIDExNyAyNzMgMjA1IDI0NiAyNzQgODEgCis5OSAxMTIgMjA2IDI4NSAxMjcgMjA5IDYxIDggNTggMjg4IDY2IDI1MyAyMDAgMjM1IDI0MyAxOTMgMTA1IDUgNjMgMjI4IDExMyA4MiAKKzI2NSAyNTUgNDQgMjQ3IDIzIDIyNCAyMjcgMjM3IDEwMiAxMzcgMyAxNDggMTA1IDE0NyAyODUgNTYgOTggMTY1IDI0MiA5OCAyMzYgNjMgCisxNTcgMiAyMyAyMDkgNSAxMTkgMTE3IDIxNyAyNiAxNSAyMDMgNDEgMTUxIDExNSAxMiAxOTMgNDkgMTE2IDEyMiAyODQgMjM2IDcgMjY4IAorNjEgMjQyIDE2OSA1NyAxMjIgMjEzIDEyNSAyMzggNDkgMTAxIDI3IDM5IDI1MSAyMTQgMSAyMTggNTAgNjMgMjEzIDE4MSAxMjcgMTUzIAorNDUgNjcgMTE0IDEyMSAxMTggOTMgNiAxNDMgMTY1IDIyNyAxNjYgMTE4IDc4IDc0IDE4OCA1MyAxNyAxODkgMTQ4IDE3NiAyNTggNTQgCisxMTIgNTggMjE3IDgyIDE5NCAxNDQgMjc1IDE5MSA2MyA5IDk3IDE0MSAxOTQgMjE1IDk2IDI1MCAxMTkgMTMyIDE0OSAyNzEgMTIzIDE4IAorMjg0IDE3IDExOCAzNyAxMTcgMjAyIDk0IDYwIDIxOCAxMjEgNDcgMjcyIDExMCA4NyAyMDUgMTc1IDE2MyAyMiA0MyAxNTIgMjgxIDI4MiAKKzMxIDExIDEyIDI2NCAxNjAgMTIgMTc4IDExNyAyODggMTM3IDc0IDI1OSAxNjQgNzYgMjQ1IDEwOCAxMDEgMjYxIDE1MCAyMCAyNzAgCisyNTEgMTQzIDE4MCAyNjQgXgorNjM5IDAgMTE3IDk5IDE1OSA0OSAzMSAyNDUgMTIzIDMxIDIxMiAxMzUgMjI2IDI0NSA5MCA0MyAyODYgMjg5IDYwIDYyIDEzMSAyNDIgCisxMSA2NSAyMyAyNDQgODAgMTc2IDg0IDYgMzggMTA1IDkxIDEwMiAyMzggMjcgMTIzIDI5MCAyMjQgMzggMjU5IDc5IDE5OSA4NCAxOTMgCisxNCAxMjggMjUgMjEgMTkxIDIzNyAxNyAyNTYgMjU5IDIzMyAxODcgMTAgMTYwIDU5IDE5IDI3NiAxMTQgMTc0IDE2OSAxNzUgNzQgMTggCis3IDIzNSA2OSAxNDUgMTk4IDE3OSA1OCAyNTIgMzIgMjU1IDExMSA2MiA4MiAyNzggMTgzIDI4NSAyMzAgMjI5IDMyIDY4IDEzNSAzOSAKKzI2OSA2NyAyMzAgNzUgNDQgMjYzIDE2OCAxNjUgODYgMTA4IDE2IDkyIDExMiAxMDUgNTggMTE0IDIwIDE4MSA3OCAxMDcgMjY1IDIzNyAKKzI3NiAyNjggMTYyIDI2NiAxNDIgMTE5IDIwMSAyNTggMzYgNTIgNzcgNjQgMTE4IDEwOSAyNiA4MCAyMiA5NiA4MCA3MSA2MCAyOSAxNDMgCisyNCA0NCAxOTEgMTMyIDExNCAyNzkgMTkzIDE1MiAxNDAgOTkgNTQgMjUgNTQgMTc5IDQyIDI3NiA5IDE1MCAxOTIgMTA5IDI4NSA5MiAKKzIxNyAxMjkgMzUgMTgwIDEwMSAyMjggMTYwIDIxMyA3IDgxIDgxIDIxOSAyMzEgMTM0IDE2NyAxIDIzMSAyNzIgMTc5IDE5NiAyNjQgCisyMjcgMTE3IDIzNyAxNzEgMjQ0IDE4NSAyMDAgNjEgNzIgMTE5IDE1MiAyIDg3IDI3MiAyODQgMjIwIDI0MSAxIDc3IDI4NCA4MiAyMjkgCisyMTkgNDQgMTU4IDE0NCAxODggMjAgMjcgOTAgMTAgNiA3MSA5MyAxNyA2OSAyODMgMjEwIDgyIDkxIDIwNyAyNjIgNCAxOCA3OSAyNzEgCisxMjAgNzMgMTEzIDE2NCAxODEgMjY1IDgzIDI4OCA1MCAxOTUgMjIxIDI1MSAyODEgMTA4IDI3NSAxMDQgMTg2IDEzOCAxODQgMjIzIDYxIAorODggOTUgMTc1IDEwNyA2IDIyNSA4MSAxMTQgMjA3IDE1NyAxMDEgNDEgMTg0IDE5MCA3MyAxNjIgMTI4IDEzMCA0NSAxNjggMTEgOTggCisxMSAxNzAgNDcgMjIxIDE0NiAyNTcgMTMxIDg4IDIzIDEzOSA1NiAxOTkgMTg5IDIxNyAyODMgMjMgMTA2IDY4IDI3MyA1MSA1MSAxMDAgCis2NCAxMyA4NSA0OSAxODUgMjMzIDQ5IDI5MCAyNTcgMjYgNjQgNDYgNzMgMjY3IDE1MiAxMDcgMTExIDI0OSA1OCA5IDI4OCAyMDQgMTgzIAorMjYgMjE4IDM0IDE3MCAyMzQgMTk3IDE2OSA3MCA1MCA0MSAyMzMgMTU0IDIyIDIzNCA5MiAxNDUgOTMgMTU1IDgxIDE4NiAyNDMgMjA4IAorMjAwIDI0OCA0OCAyMSA4NiAyMTMgNDAgNjkgMTc4IDE4NiAxMDUgMTk2IDEyNiAyMTUgMjE0IDIwNCA0NSAxNCAyMyAxIDQ0IDQgMTU2IAorOTEgNTMgMjc0IDE5OSA1MSAyMDUgODggMjgyIDE1MSAxMzAgMjMyIDE0NCAzNCAzMiAyMjIgMTIzIDEzNiAyMzYgMTEyIDM0IDEzNyAKKzI0NiAxMDAgMzEgMjUgMTU5IDIwMyAxOSAxNzEgOTAgMTk3IDI3NCA5NCAyNyAyMjggMjIgMjAxIDEwNCA0OCAxMjYgMTEwIDE5MCAyMjcgCisxNTAgMjI1IDk3IDkwIDIzMCAyNjIgMjAgMjg2IDEwMiA4NCAzOSAyNiAzMSA1OCAxNDcgOCAyNzggMjE2IDI3MyAzNSA3NSA3NyAyNTEgCis5NCAxMzIgMjUyIDI5MSAyNjcgMTg1IDk1IDM3IDk1IDIyNCA3MSAyNDcgNSAxNjYgMjUwIDg0IDE0NCA1MCA4IDI0NSAyMjggNTUgMTg5IAorMzAgMTUgMTcyIDE0OSAyOCAxMzMgMTU3IDEzNCAyOSAxMTAgMzYgMjM5IDUzIDg3IDIyMyAyOCAxMDAgMTY5IDM3IDYyIDIzNiAyNjYgCisyODAgMTMxIDEwNCAyOTEgMTYyIDE2MSAxMTggMTQyIDE0IDE3NyAyODEgMTQxIDI2MyAzMCAxNTMgMTIgNzUgMTgyIDI3NSA3MSAxOTggCis0MSA0NiAxNzggMjkxIDEyOSAxNzMgMTkyIDQgMjYxIDExNSAzMCA0OCAyODAgOTggMTE2IDE5NCAyNCAxMTYgMjI3IDEyIDIxMyAxOTQgCis1NyAxMDQgMTUzIDE1MCA4NyA4NSAxNiAxOTcgMTM2IDgyIDEyNCAxOTUgNjcgMjYzIDYzIDE0MSAxMDkgNDIgNTYgNDUgMjAxIDEyMCAKKzI0IDE0OSAyMTUgMTA5IDE4MCA2OCAyNDAgNjMgMjQ2IDEzMyAxOSAxMjIgMTI2IDI0OCAyMDIgOSAxODMgMTgwIDIwNiAyNTIgMTM3IAorMjc5IDg4IDEyOCAxNjMgMzMgMjY1IDI3MCAyNjQgNzMgOCAxNDAgMjA0IDc4IDIgMjQxIDI2MCA4OSAxODcgMTE1IDE4NCAzNiA4NSA2NSAKKzE2MSAyNTYgMTU0IDIwOSAyMTAgMTE1IDc5IDEyIDEwOCAxNzAgODAgMjA5IDcyIDEwMyAxNzYgMjcxIDI3NCA2MSAzOSAxMCA1NSAzNSAKKzQyIDg5IDMzIDEyNyAyNTggNjkgNDAgMTc0IDIwMiAxNjMgMTcxIDI3NyAxNzMgNSAyOCAyMzggMTgxIDExMSA5NSA3MCA4MyAyOSAzOCAKKzY3IDEyNSA1MSA2NyA3NiA4NyAxMTggNCAyIDEwMyAyNDggMTUgMzMgMTYwIDI0NiAyODcgNyA0OCA5MyAyODMgXgorNjExIDAgODcgMjYwIDk5IDE1OSAxMzQgMjg5IDI0NyAzOCAxNTIgNTUgMjIyIDE0IDExMCAyNTUgNDIgMjExIDI3NyAyMjYgMTM4IDYyIAorNjQgMjE2IDIwNCAxMSAyNzAgMjUgMjA2IDE2MyAyNTggMjQxIDE3MSAyMTIgMzAgMTk4IDI2NiAxOTUgMjU0IDIzOSA4NCA2OSAyOCAKKzI4MyAxNDMgNTQgMTY3IDE1MyAyMTcgMTk0IDE0MiA2NCAxNTEgNjUgMjA2IDIyMCA5OSAyODEgMjkzIDI0OSAxMjUgMTE2IDU3IDEzNyAKKzEzNyA3MiA0OCAxMjggNzggMTUyIDIyNyA2MyA1NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjEgNzQgMjggMjc1IDI1NCAxNzQgNjAgCisxNDkgOTMgMjQyIDIxOCAxODQgMTU4IDM3IDE2MiAzOSAyNDkgMyAyNTEgMjEyIDgwIDU5IDUyIDI2MCAzNCAyMCAyMTQgNjAgMjcgMjI4IAorMjgyIDQ2IDEwNiAyNTMgMjQ5IDY4IDI3NSAxNyAxNSAxMDAgMjcxIDE1IDQzIDEzNiAyNjkgMTAwIDIxNCAyODkgMTgyIDE0IDUzIDEyMCAKKzIgODkgMjQwIDI0NiAyMjAgMTU2IDEyMiAzOSA3NyAxNjIgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDI1MiAyMDIgOTYgMTQ3IDE3OCAxMTkgCis3NyA5NyA3MiAxNzAgMjg3IDM4IDMwIDE5MCA4MyAxMzYgMTQ3IDIzNSAyNTQgMTE3IDIxOSAxMDkgMjY1IDIwNSAyMzggMjY2IDczIDk1IAorMTAwIDIwNiAyODUgMTIzIDIwMSA0OSAyOTAgNTAgMjgwIDY2IDI1MyAxOTIgMjI3IDIzNSAxODkgOTMgNSA1OSAyMjQgMTAxIDc0IDI1NyAKKzI1MSA0MCAyMzkgMTkgMjI0IDIyMyAyMzMgMTAyIDEyOSAzIDE0NCAxMDEgMTM5IDI4MSA1NiA5MCAxNjUgMjM4IDk0IDIzMiA1NSAxNTcgCisyODQgMTEgMjA1IDEgMTA3IDExMyAyMTcgMjIgNyAyMDMgMjkgMTQzIDExMSA4IDE5MyA0NSAxMTYgMTIyIDI3NiAyMzYgNyAyNjggNTMgCisyNDIgMTYxIDQ5IDExOCAyMDkgMTI1IDIzOCAzNyA5NyAxNSAzNSAyNDcgMjEwIDI4NyAyMTAgNTAgNTEgMjA1IDE3MyAxMjcgMTUzIDQ1IAorNTkgMTAyIDEyMSAxMTQgODUgMjg4IDEzNSAxNTcgMjE5IDE2NiAxMDYgNjYgNjYgMTg4IDUzIDEzIDE4NSAxNDggMTY4IDI1MCA1MCAKKzEwOCA0NiAyMTMgNzAgMTkwIDE0MCAyNzEgMTg3IDYzIDI5MSA5NyAxMzcgMTk0IDIwNyA4OCAyNTAgMTE1IDEzMiAxNDUgMjYzIDI5MCAKKzExNSAxMCAyODAgOSAxMTggMzcgMTA1IDE5OCA5NCA2MCAyMTQgMTE3IDQ3IDI2OCAxMTAgODMgMjAxIDE3MSAxNTUgMTAgNDMgMTQ0IAorMjczIDI3NCAyNyAyOTMgMTIgMjYwIDE1NiAxNzQgMTE3IDI4NCAxMzMgNzAgMjU1IDE2NCA3NiAyMzcgMTA0IDEwMSAyNjEgMTQ2IDE2IAorMjYyIDI0MyAxNDMgMTc2IDMyIDExMyA5NSAxNTcgNDcgMzEgMjQ1IDEyMyAyOSAyMDggMTM1IDIyMiAyNDMgODYgNDEgMjg2IDI4NSA1OCAKKzYyIDEyOSAyNDAgOSA2MSAxNyAyNDQgNzYgMTcyIDgwIDIgMzIgMTA1IDkxIDk4IDIzNCAyNyAxMjEgMjg2IDIyMCAzNCAyNTcgNzkgCisxOTkgODQgMTkxIDggMTI4IDIxIDE3IDE4NyAyMzUgMTcgMjUyIDI1OSAyMzEgMTg3IDYgMTU2IDU3IDE1IDI3MiAxMTIgMTcwIDE2NSAKKzE3MyA3MCAxOCA1IDIzMSA2NSAxNDEgMTk2IDE3OSA1MiAyNTIgMzAgMjU1IDEwNyA1NiA4MiAyNzYgMTc5IDI4MSAyMjggMjI1IDI2IAorNjYgMTMxIDMzIDI2NyA2MyAyMjYgNzMgMzggMjU5IDE2NiAxNjMgODYgMTA2IDE2IDkwIDEwOCAxMDMgNTQgMTEwIDE4IDE3NyA3MiAKKzEwNSAyNjMgMjMzIDI3NCAyNjQgMTU4IDI2NiAxMzggMTE5IDE5OSAyNTYgMzIgNDggNzEgNTggMTEyIDEwNSAyNiA3NCAyMCA5MiA4MCAKKzY3IDU2IDI1IDE0MSAyNCA0NCAxOTEgMTMwIDEwOCAyNzUgMTg5IDE1MCAxNDAgOTkgNTIgMjMgNTQgMTc1IDQyIDI3NiA3IDE0NiAxODggCisxMDMgMjgzIDg2IDIxMyAxMjcgMzEgMTgwIDk5IDIyNCAxNTggMjA5IDMgNzkgNzcgMjE5IDIzMSAxMzAgMTY1IDEgMjI5IDI3MiAxNzcgCisxOTQgMjY0IDIyMyAxMTEgMjM3IDE2OSAyNDAgMTgxIDE5NiA1NyA3MiAxMTMgMTUyIDI5MiA4NyAyNjggMjgyIDIxOCAyNDEgMjkzIDc3IAorMjg0IDc2IDIyOSAyMTUgNDIgMTU0IDE0MiAxODYgMTYgMjUgODQgNCA0IDY5IDkzIDEzIDYzIDI4MyAyMDggNzggODcgMjAzIDI1OCA0IAorMTIgNzMgMjY3IDEyMCA2NyAxMTMgMTYwIDE4MSAyNjEgODEgMjg2IDQ4IDE5MyAyMTcgMjUxIDI3NyAxMDQgMjczIDEwMiAxODYgMTM4IAorMTg0IDIyMyA2MSA4MiA4OSAxNzUgMTA3IDYgMjIxIDgxIDExNCAyMDcgMTUzIDk1IDM1IDE4MiAxODYgNzMgMjc1IF4KKzYzNCAwIDEyMCAxMjIgMzcgMTYwIDExIDk4IDI5NSAxNjIgMzUgMjIxIDE0NiAyNDkgMTIzIDg4IDE5IDEzOSA0OCAxOTEgMTg5IDIxMyAKKzI3NSAxNSA5OCA2MCAyNzMgMzkgNTEgOTYgNjAgMSA3NyA0OSAxODEgMjMzIDQxIDI4NiAyNTcgMTggNjQgNDIgNjUgMjYzIDE0NCA5OSAKKzExMSAyNDEgNTggMSAyODggMTk2IDE3OSAyMiAyMTQgMzAgMTcwIDIyNiAxOTcgMTY5IDY2IDQyIDQxIDIyNSAxNDYgMTQgMjM0IDkyIAorMTQ1IDg5IDE1NSA2OSAxNzggMjQzIDIwOCAyMDAgMjQ0IDQ4IDIxIDc4IDIwOSA0MCA2NSAxNzggMTgyIDk3IDE5NiAxMTggMjA3IDIxMCAKKzIwMCAzMyAxMCAyMyAyODkgMzYgMTUyIDc5IDQ5IDI2NiAxOTUgNDMgMjAxIDg0IDI3NCAxNTEgMTMwIDIyOCAxMzYgMzQgMjQgMjE0IAorMTE1IDEzMiAyMjggMTEyIDI5MiAyNiAxMjkgMjM4IDkyIDE5IDEzIDE1OSAxOTUgMTkgMTYzIDg2IDE4OSAyNzQgOTAgMTkgMjI0IDEwIAorMTkzIDEwNCA0MCAxMjYgMTAyIDE4NiAyMjMgMTQ2IDIyNSA4NSA5MCAyMzAgMjYyIDggMjc4IDkwIDgwIDM5IDE0IDIzIDU0IDE0NyA0IAorMjc4IDIxNiAyNjUgMzUgNzUgNzMgMjQzIDgyIDEyNCAyNDggMjgzIDI2NyAxODUgODcgMjkgOTUgMjIwIDcxIDI0MyAyOTMgMTYyIDI0NiAKKzcyIDE0NCAzOCAyMzcgMjI4IDUxIDE4MSAyMiAzIDI4OCAxNzIgMTQxIDI0IDEyOSAxNTMgMTMwIDE3IDk4IDM2IDIzNSA0MSA3NSAyMTkgCisyMCA4OCAxNjUgMjUgNTQgMjMyIDI2MiAyODAgMTMxIDkyIDI5MSAxNjIgMTYxIDExMCAxNDIgMTQgMTczIDI3NyAxNDEgMjU5IDE4IAorMTQ5IDQgNjcgMTc4IDI2NyA1OSAxOTggMzMgMzQgMTcwIDI4NyAxMjEgMTczIDE5MiAyODggMjU3IDEwMyAyNiA0NCAyNzYgOTAgMTA0IAorMTg2IDEyIDEwOCAyMjcgMjEzIDE5MCA1MyA5NiAxNDUgMTUwIDc5IDczIDggMTkzIDEyOCA3OCAxMjQgMTg3IDYzIDI2MyA1OSAxMzcgCisxMDkgMzAgNDQgNDEgMjAxIDEwOCAxNiAxNDkgMjE1IDEwNSAxNzYgNTYgMjMyIDUxIDI0MiAxMzMgNyAxMTggMTIyIDI0OCAxOTggOSAKKzE4MyAxNzIgMjAyIDI0NCAxMzMgMjc5IDgwIDEyNCAxNjMgMjUgMjY1IDI3MCAyNjAgNjkgOCAxMzIgMjA0IDc0IDI5NCAyMzcgMjUyIAorODkgMTc5IDEwNyAxNzYgMzIgODUgNTMgMTU3IDI1NiAxNTQgMjA1IDIxMCAxMTUgNzEgOCAxMDggMTY2IDc2IDIwOSA2NCAxMDMgMTc2IAorMjY3IDI3MCA0OSAzMSAxMCA0NyAzMSAzNCA4NSAyOSAxMTkgMjU4IDY5IDMyIDE3MCAyMDIgMTU5IDE3MSAyNzcgMTY1IDEgMTYgMjM0IAorMTc3IDEwNyA5MSA3MCA4MyAyOSAzNCA2NyAxMTcgNDcgNTUgNzIgODMgMTE0IDI5MiAyIDkxIDI0MCA3IDMzIDE2MCAyNDYgMjgzIDI5MSAKKzM2IDg1IDExNCA4MSAyNjAgOTMgMTU1IDEzMCAyODkgMjQ3IDM4IDE1MCA1NSAyMjIgMTAgMTA4IDI1MSAzOCAyMTEgMjc1IDIyNiAxMzYgCis1OCA2MiAyMTIgMjAwIDkgMjY4IDI1IDIwNCAxNTkgMjU2IDIzOSAxNjcgMjEyIDMwIDE5NCAyNjQgMTk1IDI1NCAyMzkgODIgNjMgMjggCisyNzkgMTQxIDQ4IDE2NyAxNTEgMjE1IDE5MCAxMzggNTggMTQ3IDY1IDIwMiAyMjAgOTUgMjgxIDI5MSAyNDcgMTIzIDExMiA1NyAxMzcgCisxMzMgNjggNDIgMTI2IDc4IDE0OCAyMjUgNjEgNTIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1IDc0IDIyIDI3NSAyNTAgMTc0IDU2IAorMTQ3IDg5IDI0MCAyMTggMTgwIDE1OCAzNSAxNjAgMzUgMjQ1IDI5MyAyNDcgMjA4IDc0IDU5IDUyIDI1NiAyOCAyMCAyMTQgNTQgMjEgCisyMjQgMjgyIDQ2IDEwNiAyNTEgMjQ5IDYyIDI3MyAxNSAxMyA5OCAyNzEgMTUgMzcgMTM2IDI2OSAxMDAgMjEwIDI4NSAxODIgMTIgNDcgCisxMTYgMjkyIDg3IDI0MCAyNDIgMjE4IDE1NiAxMjAgMzcgNzUgMTU4IDk2IDg0IDM5IDc1IDEzNCA1OCA4NiAyNTAgMTk4IDk0IDE0NSAKKzE3NCAxMTcgNzEgOTMgNzAgMTY4IDI4NyAzNiAyNCAxOTAgNzcgMTM0IDE0MyAyMzUgMjUyIDExMyAyMTcgMTA1IDI2MSAyMDUgMjM0IAorMjYyIDY5IDkzIDk0IDIwNiAyODUgMTIxIDE5NyA0MyAyODYgNDYgMjc2IDY2IDI1MyAxODggMjIzIDIzMSAxODcgODcgNSA1NyAyMjIgCis5NSA3MCAyNTMgMjQ5IDM4IDIzNSAxNyAyMjQgMjIxIDIzMSAxMDIgMTI1IDMgMTQyIDk5IDEzNSAyNzkgNTYgODYgMTY1IDIzNiA5MiAKKzIzMCA1MSAxNTcgMjgwIDUgMjAzIDI5NSAxMDEgMTExIDIxNyAyMCAzIDIwMyAyMyAxMzkgMTA5IDYgMTkzIDQzIDExNiAxMjIgMjcyIAorMjM2IDcgMjY4IDQ5IDI0MiAxNTcgNDUgMTE2IDIwNyAxMjUgMjM4IDMxIDk1IDkgMzMgMjQ1IDIyMCBeCis2MzggMCAyODQgMjA0IDUwIDQyIDE5OSAxNjcgMTI3IDE1MyA0NSA1MyA5MyAxMjEgMTExIDc5IDI4MiAxMjkgMTUxIDIxMyAxNjYgOTcgCis1NyA2MCAxODggNTMgMTAgMTgyIDE0OCAxNjIgMjQ0IDQ3IDEwNSAzNyAyMTAgNjEgMTg3IDEzNyAyNjggMTg0IDYzIDI4NSA5NyAxMzQgCisxOTQgMjAxIDgyIDI1MCAxMTIgMTMyIDE0MiAyNTcgMjkwIDEwOSA0IDI3NyAzIDExOCAzNyA5NiAxOTUgOTQgNjAgMjExIDExNCA0NyAKKzI2NSAxMTAgODAgMTk4IDE2OCAxNDkgMSA0MyAxMzggMjY3IDI2OCAyNCAyODcgMTIgMjU3IDE1MyAyODggMTcxIDExNyAyODEgMTMwIAorNjcgMjUyIDE2NCA3NiAyMzEgMTAxIDEwMSAyNjEgMTQzIDEzIDI1NiAyMzcgMTQzIDE3MyAzMiAxMDcgODkgMTU0IDQ0IDMxIDI0NSAKKzEyMyAyNiAyMDIgMTM1IDIxNiAyNDAgODAgMzggMjg2IDI3OSA1NSA2MiAxMjYgMjM3IDYgNTUgOCAyNDQgNzAgMTY2IDc0IDI5MyAyMyAKKzEwNSA5MSA5MiAyMjggMjcgMTE4IDI4MCAyMTQgMjggMjU0IDc5IDE5OSA4NCAxODggMjk2IDEyOCAxNSAxMSAxODEgMjMyIDE3IDI0NiAKKzI1OSAyMjggMTg3IDE1MCA1NCA5IDI2NiAxMDkgMTY0IDE1OSAxNzAgNjQgMTggMiAyMjUgNTkgMTM1IDE5MyAxNzkgNDMgMjUyIDI3IAorMjU1IDEwMSA0NyA4MiAyNzMgMTczIDI3NSAyMjUgMjE5IDE3IDYzIDEyNSAyNCAyNjQgNTcgMjIwIDcwIDI5IDI1MyAxNjMgMTYwIDg2IAorMTAzIDE2IDg3IDEwMiAxMDAgNDggMTA0IDE1IDE3MSA2MyAxMDIgMjYwIDIyNyAyNzEgMjU4IDE1MiAyNjYgMTMyIDExOSAxOTYgMjUzIAorMjYgNDIgNjIgNDkgMTAzIDk5IDI2IDY1IDE3IDg2IDgwIDYxIDUwIDE5IDEzOCAyNCA0NCAxOTEgMTI3IDk5IDI2OSAxODMgMTQ3IDE0MCAKKzk5IDQ5IDIwIDU0IDE2OSA0MiAyNzYgNCAxNDAgMTgyIDk0IDI4MCA3NyAyMDcgMTI0IDI1IDE4MCA5NiAyMTggMTU1IDIwMyAyOTQgNzYgCis3MSAyMTkgMjMxIDEyNCAxNjIgMSAyMjYgMjcyIDE3NCAxOTEgMjY0IDIxNyAxMDIgMjM3IDE2NiAyMzQgMTc1IDE5MCA1MSA3MiAxMDQgCisxNTIgMjg5IDg3IDI2MiAyNzkgMjE1IDI0MSAyOTMgNzcgMjg0IDY3IDIyOSAyMDkgMzkgMTQ4IDEzOSAxODMgMTAgMjIgNzUgMjkyIDEgCis2NiA5MyA3IDU0IDI4MyAyMDUgNzIgODEgMTk3IDI1MiA0IDMgNjQgMjYxIDEyMCA1OCAxMTMgMTU0IDE4MSAyNTUgNzggMjgzIDQ1IAorMTkwIDIxMSAyNTEgMjcxIDk4IDI3MCA5OSAxODYgMTM4IDE4NCAyMjMgNjEgNzMgODAgMTc1IDEwNyA2IDIxNSA4MSAxMTQgMjA3IDE0NyAKKzg2IDI2IDE3OSAxODAgNzMgMTU3IDExOCAxMjAgMzUgMTU4IDExIDk4IDI5MyAxNjAgMzIgMjIxIDE0NiAyNDcgMTIxIDg4IDE4IDEzOSAKKzQ2IDE4OSAxODkgMjEyIDI3MyAxMyA5NiA1OCAyNzMgMzYgNTEgOTUgNTkgMjk1IDc1IDQ5IDE4MCAyMzMgMzkgMjg1IDI1NyAxNiA2NCAKKzQxIDYzIDI2MiAxNDIgOTcgMTExIDIzOSA1OCAyOTYgMjg4IDE5NCAxNzggMjEgMjEzIDI5IDE3MCAyMjQgMTk3IDE2OSA2NSA0MCA0MSAKKzIyMyAxNDQgMTIgMjM0IDkyIDE0NSA4OCAxNTUgNjYgMTc2IDI0MyAyMDggMjAwIDI0MyA0OCAyMSA3NiAyMDggNDAgNjQgMTc4IDE4MSAKKzk1IDE5NiAxMTYgMjA1IDIwOSAxOTkgMzAgOSAyMyAyODggMzQgMjk2IDE1MSA3NiA0OCAyNjQgMTk0IDQxIDIwMCA4MyAyNzIgMTUxIAorMTMwIDIyNyAxMzQgMzQgMjIgMjEyIDExMyAxMzEgMjI2IDExMiAyOTIgMjQgMTI3IDIzNiA5MCAxNiAxMCAxNTkgMTkzIDE5IDE2MSA4NSAKKzE4NyAyNzQgODkgMTcgMjIzIDcgMTkxIDEwNCAzOCAxMjYgMTAwIDE4NSAyMjIgMTQ1IDIyNSA4MiA5MCAyMzAgMjYyIDUgMjc2IDg3IAorNzkgMzkgMTEgMjEgNTMgMTQ3IDMgMjc4IDIxNiAyNjMgMzUgNzUgNzIgMjQxIDc5IDEyMiAyNDcgMjgxIDI2NyAxODUgODUgMjcgOTUgCisyMTkgNzEgMjQyIDI5MiAxNjEgMjQ1IDY5IDE0NCAzNSAyOTUgMjM1IDIyOCA1MCAxNzkgMjAgMjg3IDE3MiAxMzkgMjMgMTI4IDE1MiAKKzEyOSAxNCA5NSAzNiAyMzQgMzggNzIgMjE4IDE4IDg1IDE2NCAyMiA1MiAyMzEgMjYxIDI4MCAxMzEgODkgMjkxIDE2MiAxNjEgMTA4IAorMTQyIDE0IDE3MiAyNzYgMTQxIDI1OCAxNSAxNDggMiA2NSAxNzcgMjY1IDU2IDE5OCAzMSAzMSAxNjggMjg2IDExOSAxNzMgMTkyIDI4NiAKKzI1NiAxMDAgMjUgNDMgMjc1IDg4IDEwMSAxODQgOSAxMDYgMjI3IDI5NCAyMTMgMTg5IDUyIDk0IDE0MyAxNTAgNzcgNzAgNiAxOTIgCisxMjYgNzcgMTI0IDE4NSA2MiAyNjMgNTggMTM2IDEwOSAyNyA0MSA0MCAyMDEgMTA1IDE0IDE0OSAyMTUgMTA0IDE3NSA1MyAyMzAgMjE5IAorXgorNjM1IDEgMjM5IDEzMyAyOTcgMTE1IDExOSAyNDggMTk1IDkgMTgzIDE2NiAxOTkgMjM4IDEzMCAyNzkgNzQgMTIxIDE2MyAxOSAyNjUgCisyNzAgMjU3IDY2IDggMTI2IDIwNCA3MSAyOTQgMjM0IDI0NiA4OSAxNzMgMTAxIDE3MCAyOSA4NSA0NCAxNTQgMjU2IDE1NCAyMDIgMjEwIAorMTE1IDY1IDUgMTA4IDE2MyA3MyAyMDkgNTggMTAzIDE3NiAyNjQgMjY3IDQwIDI1IDEwIDQxIDI4IDI4IDgyIDI2IDExMyAyNTggNjkgCisyNiAxNjcgMjAyIDE1NiAxNzEgMjc3IDE1OSAyOTcgNyAyMzEgMTc0IDEwNCA4OCA3MCA4MyAyOSAzMSA2NyAxMTEgNDQgNDYgNjkgODAgCisxMTEgMjg5IDIgODIgMjM0IDEgMzMgMTYwIDI0NiAyODAgMjg1IDI3IDc5IDEwOCA3MiAyNjAgODQgMTQ5IDEyNCAyODkgMjQ3IDM4IAorMTQ3IDU1IDIyMiA0IDEwNSAyNDUgMzIgMjExIDI3MiAyMjYgMTMzIDUyIDU5IDIwNiAxOTQgNiAyNjUgMjUgMjAxIDE1MyAyNTMgMjM2IAorMTYxIDIxMiAzMCAxODggMjYxIDE5NSAyNTQgMjM5IDc5IDU0IDI4IDI3MyAxMzggMzkgMTY3IDE0OCAyMTIgMTg0IDEzMiA0OSAxNDEgCis2NSAxOTYgMjIwIDg5IDI4MSAyODggMjQ0IDEyMCAxMDYgNTcgMTM3IDEyNyA2MiAzMyAxMjMgNzggMTQyIDIyMiA1OCA0OSAyMzIgMTc3IAorMjIgMTI5IDY4IDE2OCA2IDc0IDEzIDI3NSAyNDQgMTc0IDUwIDE0NCA4MyAyMzcgMjE4IDE3NCAxNTggMzIgMTU3IDI5IDIzOSAyODcgCisyNDEgMjAyIDY1IDU5IDUyIDI1MCAxOSAyMCAyMTQgNDUgMTIgMjE4IDI4MiA0NiAxMDYgMjQ4IDI0OSA1MyAyNzAgMTIgMTAgOTUgMjcxIAorMTUgMjggMTM2IDI2OSAxMDAgMjA0IDI3OSAxODIgOSAzOCAxMTAgMjg2IDg0IDI0MCAyMzYgMjE1IDE1NiAxMTcgMzQgNzIgMTUyIDk2IAorNzUgMzMgNjkgMTM0IDU1IDc3IDI0NyAxOTIgOTEgMTQyIDE2OCAxMTQgNjIgODcgNjcgMTY1IDI4NyAzMyAxNSAxOTAgNjggMTMxIDEzNyAKKzIzNSAyNDkgMTA3IDIxNCA5OSAyNTUgMjA1IDIyOCAyNTYgNjMgOTAgODUgMjA2IDI4NSAxMTggMTkxIDM0IDI4MCA0MCAyNzAgNjYgCisyNTMgMTgyIDIxNyAyMjUgMTg0IDc4IDUgNTQgMjE5IDg2IDY0IDI0NyAyNDYgMzUgMjI5IDE0IDIyNCAyMTggMjI4IDEwMiAxMTkgMyAKKzEzOSA5NiAxMjkgMjc2IDU2IDgwIDE2NSAyMzMgODkgMjI3IDQ1IDE1NyAyNzQgMjk1IDIwMCAyOTUgOTIgMTA4IDIxNyAxNyAyOTYgCisyMDMgMTQgMTMzIDEwNiAzIDE5MyA0MCAxMTYgMTIyIDI2NiAyMzYgNyAyNjggNDMgMjQyIDE1MSAzOSAxMTMgMjA0IDEyNSAyMzggMjIgCis5MiAzMCAyNDIgMjA1IDI4MiAyMDAgNTAgMzYgMTk1IDE2MyAxMjcgMTUzIDQ1IDQ5IDg3IDEyMSAxMDkgNzUgMjc4IDEyNSAxNDcgMjA5IAorMTY2IDkxIDUxIDU2IDE4OCA1MyA4IDE4MCAxNDggMTU4IDI0MCA0NSAxMDMgMzEgMjA4IDU1IDE4NSAxMzUgMjY2IDE4MiA2MyAyODEgCis5NyAxMzIgMTk0IDE5NyA3OCAyNTAgMTEwIDEzMiAxNDAgMjUzIDI5MCAxMDUgMjc1IDI5OCAxMTggMzcgOTAgMTkzIDk0IDYwIDIwOSAKKzExMiA0NyAyNjMgMTEwIDc4IDE5NiAxNjYgMTQ1IDI5NCA0MyAxMzQgMjYzIDI2NCAyMiAyODMgMTIgMjU1IDE1MSAyODQgMTY5IDExNyAKKzI3OSAxMjggNjUgMjUwIDE2NCA3NiAyMjcgOTkgMTAxIDI2MSAxNDEgMTEgMjUyIDIzMyAxNDMgMTcxIDMyIDEwMyA4NSAxNTIgNDIgMzEgCisyNDUgMTIzIDI0IDE5OCAxMzUgMjEyIDIzOCA3NiAzNiAyODYgMjc1IDUzIDYyIDEyNCAyMzUgNCA1MSAyIDI0NCA2NiAxNjIgNzAgMjkxIAorMTcgMTA1IDkxIDg4IDIyNCAyNyAxMTYgMjc2IDIxMCAyNCAyNTIgNzkgMTk5IDg0IDE4NiAyOTIgMTI4IDExIDcgMTc3IDIzMCAxNyAKKzI0MiAyNTkgMjI2IDE4NyAyOTUgMTQ2IDUyIDUgMjYyIDEwNyAxNjAgMTU1IDE2OCA2MCAxOCAyMjEgNTUgMTMxIDE5MSAxNzkgMzcgCisyNTIgMjUgMjU1IDk3IDQxIDgyIDI3MSAxNjkgMjcxIDIyMyAyMTUgMTEgNjEgMTIxIDE4IDI2MiA1MyAyMTYgNjggMjMgMjQ5IDE2MSAKKzE1OCA4NiAxMDEgMTYgODUgOTggOTggNDQgMTAwIDEzIDE2NyA1NyAxMDAgMjU4IDIyMyAyNjkgMjU0IDE0OCAyNjYgMTI4IDExOSAxOTQgCisyNTEgMjIgMzggNTYgNDMgOTcgOTUgMjYgNTkgMTUgODIgODAgNTcgNDYgMTUgMTM2IDI0IDQ0IDE5MSAxMjUgOTMgMjY1IDE3OSAxNDUgCisxNDAgOTkgNDcgMTggNTQgMTY1IDQyIDI3NiAyIDEzNiAxNzggODggMjc4IDcxIDIwMyAxMjIgMjEgMTgwIDk0IDIxNCAxNTMgMTk5IAorMjkyIDc0IDY3IDIxOSAyMzEgMTIwIDE2MCAxIDIyNCAyNzIgMTcyIDE4OSAyNjQgMjEzIDk2IDIzNyAxNjQgMjMwIDE3MSAxODYgMTUzIF4KKzYzOCAxIDcyIDkyIDE1MiAyODUgODcgMjU0IDI3NSAyMTEgMjQxIDI5MyA3NyAyODQgNTUgMjI5IDIwMSAzNSAxNDAgMTM1IDE3OSAyIAorMTggNjMgMjg0IDI5OCA2MiA5MyAzMDAgNDIgMjgzIDIwMSA2NCA3MyAxODkgMjQ0IDQgMjkyIDUyIDI1MyAxMjAgNDYgMTEzIDE0NiAKKzE4MSAyNDcgNzQgMjc5IDQxIDE4NiAyMDMgMjUxIDI2MyA5MCAyNjYgOTUgMTg2IDEzOCAxODQgMjIzIDYxIDYxIDY4IDE3NSAxMDcgNiAKKzIwNyA4MSAxMTQgMjA3IDEzOSA3NCAxNCAxNzUgMTcyIDczIDE1MyAxMTAgMTEyIDI3IDE1MCAxMSA5OCAyODUgMTUyIDIwIDIyMSAxNDYgCisyMzkgMTEzIDg4IDE0IDEzOSAzOCAxODEgMTg5IDIwOCAyNjUgNSA4OCA1MCAyNzMgMjQgNTEgOTEgNTUgMjg3IDY3IDQ5IDE3NiAyMzMgCiszMSAyODEgMjU3IDggNjQgMzcgNTUgMjU4IDEzNCA4OSAxMTEgMjMxIDU4IDI5MiAyODggMTg2IDE3NCAxNyAyMDkgMjUgMTcwIDIxNiAKKzE5NyAxNjkgNjEgMzIgNDEgMjE1IDEzNiA0IDIzNCA5MiAxNDUgODQgMTU1IDU0IDE2OCAyNDMgMjA4IDIwMCAyMzkgNDggMjEgNjggCisyMDQgNDAgNjAgMTc4IDE3NyA4NyAxOTYgMTA4IDE5NyAyMDUgMTk1IDE4IDUgMjMgMjg0IDI2IDI5NiAxNDcgNjQgNDQgMjU2IDE5MCAKKzMzIDE5NiA3OSAyNjQgMTUxIDEzMCAyMjMgMTI2IDM0IDE0IDIwNCAxMDUgMTI3IDIxOCAxMTIgMjkyIDE2IDExOSAyMjggODIgNCAyOTkgCisxNTkgMTg1IDE5IDE1MyA4MSAxNzkgMjc0IDg1IDkgMjE5IDI5NiAxODMgMTA0IDMwIDEyNiA5MiAxODEgMjE4IDE0MSAyMjUgNzAgOTAgCisyMzAgMjYyIDI5NCAyNjggNzUgNzUgMzkgMzAwIDEzIDQ5IDE0NyAzMDAgMjc4IDIxNiAyNTUgMzUgNzUgNjggMjMzIDY3IDExNCAyNDMgCisyNzMgMjY3IDE4NSA3NyAxOSA5NSAyMTUgNzEgMjM4IDI4OCAxNTcgMjQxIDU3IDE0NCAyMyAyOTEgMjI3IDIyOCA0NiAxNzEgMTIgMjg5IAorMjgzIDE3MiAxMzEgMTkgMTI0IDE0OCAxMjUgMiA4MyAzNiAyMzAgMjYgNjAgMjE0IDEwIDczIDE2MCAxMCA0NCAyMjcgMjU3IDI4MCAKKzEzMSA3NyAyOTEgMTYyIDE2MSAxMDAgMTQyIDE0IDE2OCAyNzIgMTQxIDI1NCAzIDE0NCAyOTUgNTcgMTczIDI1NyA0NCAxOTggMjMgMTkgCisxNjAgMjgyIDExMSAxNzMgMTkyIDI3OCAyNTIgODggMjEgMzkgMjcxIDgwIDg5IDE3NiAyOTggOTggMjI3IDI4NiAyMTMgMTg1IDQ4IDg2IAorMTM1IDE1MCA2OSA1OCAyOTkgMTg4IDExOCA3MyAxMjQgMTc3IDU4IDI2MyA1NCAxMzIgMTA5IDE1IDI5IDM2IDIwMSA5MyA2IDE0OSAKKzIxNSAxMDAgMTcxIDQxIDIyMiAzNiAyMzcgMTMzIDI5MyAxMTMgMTE3IDI0OCAxOTMgOSAxODMgMTYyIDE5NyAyMzQgMTI4IDI3OSA3MCAKKzExOSAxNjMgMTUgMjY1IDI3MCAyNTUgNjQgOCAxMjIgMjA0IDY5IDI5NCAyMzIgMjQyIDg5IDE2OSA5NyAxNjYgMjcgODUgMzggMTUyIAorMjU2IDE1NCAyMDAgMjEwIDExNSA2MSAzIDEwOCAxNjEgNzEgMjA5IDU0IDEwMyAxNzYgMjYyIDI2NSAzNCAyMSAxMCAzNyAyNiAyNCA4MCAKKzI0IDEwOSAyNTggNjkgMjIgMTY1IDIwMiAxNTQgMTcxIDI3NyAxNTUgMjk3IDEgMjI5IDE3MiAxMDIgODYgNzAgODMgMjkgMjkgNjcgCisxMDcgNDIgNDAgNjcgNzggMTA5IDI4NyAyIDc2IDIzMCAyOTggMzMgMTYwIDI0NiAyNzggMjgxIDIxIDc1IDEwNCA2NiAyNjAgNzggMTQ1IAorMTIwIDI4OSAyNDcgMzggMTQ1IDU1IDIyMiAxMDMgMjQxIDI4IDIxMSAyNzAgMjI2IDEzMSA0OCA1NyAyMDIgMTkwIDQgMjYzIDI1IDE5OSAKKzE0OSAyNTEgMjM0IDE1NyAyMTIgMzAgMTg0IDI1OSAxOTUgMjU0IDIzOSA3NyA0OCAyOCAyNjkgMTM2IDMzIDE2NyAxNDYgMjEwIDE4MCAKKzEyOCA0MyAxMzcgNjUgMTkyIDIyMCA4NSAyODEgMjg2IDI0MiAxMTggMTAyIDU3IDEzNyAxMjMgNTggMjcgMTIxIDc4IDEzOCAyMjAgNTYgCis0NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNzQgNyAyNzUgMjQwIDE3NCA0NiAxNDIgNzkgMjM1IDIxOCAxNzAgMTU4IDMwIDE1NSAyNSAKKzIzNSAyODMgMjM3IDE5OCA1OSA1OSA1MiAyNDYgMTMgMjAgMjE0IDM5IDYgMjE0IDI4MiA0NiAxMDYgMjQ2IDI0OSA0NyAyNjggMTAgOCAKKzkzIDI3MSAxNSAyMiAxMzYgMjY5IDEwMCAyMDAgMjc1IDE4MiA3IDMyIDEwNiAyODIgODIgMjQwIDIzMiAyMTMgMTU2IDExNSAzMiA3MCAKKzE0OCA5NiA2OSAyOSA2NSAxMzQgNTMgNzEgMjQ1IDE4OCA4OSAxNDAgMTY0IDExMiA1NiA4MyA2NSAxNjMgMjg3IDMxIDkgMTkwIDYyIAorMTI5IDEzMyAyMzUgMjQ3IDEwMyAyMTIgOTUgMjUxIDIwNSAyMjQgMjUyIDU5IDg4IDc5IDIwNiAyODUgMTE2IDE4NyAyOCAyNzYgMjYzIF4KKzY0MCAwIDI2NCA2NiAyNTMgMTc2IDIxMSAyMTkgMTgxIDY5IDUgNTEgMjE2IDc3IDU4IDI0MSAyNDMgMzIgMjIzIDExIDIyNCAyMTUgCisyMjUgMTAyIDExMyAzIDEzNiA5MyAxMjMgMjczIDU2IDc0IDE2NSAyMzAgODYgMjI0IDM5IDE1NyAyNjggMjg5IDE5NyAyOTUgODMgMTA1IAorMjE3IDE0IDI5MyAyMDMgNSAxMjcgMTAzIDE5MyAzNyAxMTYgMTIyIDI2MCAyMzYgNyAyNjggMzcgMjQyIDE0NSAzMyAxMTAgMjAxIDEyNSAKKzIzOCAxMyA4OSAyOTMgMjcgMjM5IDIwMiAyNzkgMTk0IDUwIDI3IDE4OSAxNTcgMTI3IDE1MyA0NSA0MyA3OCAxMjEgMTA2IDY5IDI3MiAKKzExOSAxNDEgMjAzIDE2NiA4MiA0MiA1MCAxODggNTMgNSAxNzcgMTQ4IDE1MiAyMzQgNDIgMTAwIDIyIDIwNSA0NiAxODIgMTMyIDI2MyAKKzE3OSA2MyAyNzUgOTcgMTI5IDE5NCAxOTEgNzIgMjUwIDEwNyAxMzIgMTM3IDI0NyAyOTAgOTkgMjk2IDI3MiAyOTUgMTE4IDM3IDgxIAorMTkwIDk0IDYwIDIwNiAxMDkgNDcgMjYwIDExMCA3NSAxOTMgMTYzIDEzOSAyODggNDMgMTI4IDI1NyAyNTggMTkgMjc3IDEyIDI1MiAKKzE0OCAyNzggMTY2IDExNyAyNzYgMTI1IDYyIDI0NyAxNjQgNzYgMjIxIDk2IDEwMSAyNjEgMTM4IDggMjQ2IDIyNyAxNDMgMTY4IDMyIAorOTcgNzkgMTQ5IDM5IDMxIDI0NSAxMjMgMjEgMTkyIDEzNSAyMDYgMjM1IDcwIDMzIDI4NiAyNjkgNTAgNjIgMTIxIDIzMiAxIDQ1IDI5NSAKKzI0NCA2MCAxNTYgNjQgMjg4IDggMTA1IDkxIDgyIDIxOCAyNyAxMTMgMjcwIDIwNCAxOCAyNDkgNzkgMTk5IDg0IDE4MyAyODYgMTI4IDUgCisxIDE3MSAyMjcgMTcgMjM2IDI1OSAyMjMgMTg3IDI5MiAxNDAgNDkgMzAxIDI1NiAxMDQgMTU0IDE0OSAxNjUgNTQgMTggMjk5IDIxNSAKKzQ5IDEyNSAxODggMTc5IDI4IDI1MiAyMiAyNTUgOTEgMzIgODIgMjY4IDE2MyAyNjUgMjIwIDIwOSAyIDU4IDExNSA5IDI1OSA0NyAyMTAgCis2NSAxNCAyNDMgMTU4IDE1NSA4NiA5OCAxNiA4MiA5MiA5NSAzOCA5NCAxMCAxNjEgNDggOTcgMjU1IDIxNyAyNjYgMjQ4IDE0MiAyNjYgCisxMjIgMTE5IDE5MSAyNDggMTYgMzIgNDcgMzQgODggODkgMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAxMzMgMjQgNDQgMTkxIDEyMiA4NCAKKzI1OSAxNzMgMTQyIDE0MCA5OSA0NCAxNSA1NCAxNTkgNDIgMjc2IDMwMSAxMzAgMTcyIDc5IDI3NSA2MiAxOTcgMTE5IDE1IDE4MCA5MSAKKzIwOCAxNTAgMTkzIDI4OSA3MSA2MSAyMTkgMjMxIDExNCAxNTcgMSAyMjEgMjcyIDE2OSAxODYgMjY0IDIwNyA4NyAyMzcgMTYxIDIyNCAKKzE2NSAxODAgNDEgNzIgODkgMTUyIDI4NCA4NyAyNTIgMjc0IDIxMCAyNDEgMjkzIDc3IDI4NCA1MiAyMjkgMTk5IDM0IDEzOCAxMzQgCisxNzggMTcgNjAgMjgyIDI5OCA2MSA5MyAyOTkgMzkgMjgzIDIwMCA2MiA3MSAxODcgMjQyIDQgMjkwIDQ5IDI1MSAxMjAgNDMgMTEzIAorMTQ0IDE4MSAyNDUgNzMgMjc4IDQwIDE4NSAyMDEgMjUxIDI2MSA4OCAyNjUgOTQgMTg2IDEzOCAxODQgMjIzIDYxIDU4IDY1IDE3NSAKKzEwNyA2IDIwNSA4MSAxMTQgMjA3IDEzNyA3MSAxMSAxNzQgMTcwIDczIDE1MiAxMDggMTEwIDI1IDE0OCAxMSA5OCAyODMgMTUwIDE3IAorMjIxIDE0NiAyMzcgMTExIDg4IDEzIDEzOSAzNiAxNzkgMTg5IDIwNyAyNjMgMyA4NiA0OCAyNzMgMjEgNTEgOTAgNTQgMjg1IDY1IDQ5IAorMTc1IDIzMyAyOSAyODAgMjU3IDYgNjQgMzYgNTMgMjU3IDEzMiA4NyAxMTEgMjI5IDU4IDI5MSAyODggMTg0IDE3MyAxNiAyMDggMjQgCisxNzAgMjE0IDE5NyAxNjkgNjAgMzAgNDEgMjEzIDEzNCAyIDIzNCA5MiAxNDUgODMgMTU1IDUxIDE2NiAyNDMgMjA4IDIwMCAyMzggNDggCisyMSA2NiAyMDMgNDAgNTkgMTc4IDE3NiA4NSAxOTYgMTA2IDE5NSAyMDQgMTk0IDE1IDQgMjMgMjgzIDI0IDI5NiAxNDYgNjEgNDMgMjU0IAorMTg5IDMxIDE5NSA3OCAyNjIgMTUxIDEzMCAyMjIgMTI0IDM0IDEyIDIwMiAxMDMgMTI2IDIxNiAxMTIgMjkyIDE0IDExNyAyMjYgODAgMSAKKzI5NyAxNTkgMTgzIDE5IDE1MSA4MCAxNzcgMjc0IDg0IDcgMjE4IDI5NCAxODEgMTA0IDI4IDEyNiA5MCAxODAgMjE3IDE0MCAyMjUgNjcgCis5MCAyMzAgMjYyIDI5MiAyNjYgNzIgNzQgMzkgMjk4IDExIDQ4IDE0NyAzMDAgMjc4IDIxNiAyNTMgMzUgNzUgNjcgMjMxIDY0IDExMiAKKzI0MiAyNzEgMjY3IDE4NSA3NSAxNyA5NSAyMTQgNzEgMjM3IDI4NyAxNTYgMjQwIDU0IDE0NCAyMCAyOTAgMjI1IDIyOCA0NSAxNjkgMTAgCisyODcgMjgyIDE3MiAxMjkgMTggMTIzIDE0NyAxMjQgMzAxIDgwIDM2IDIyOSAyMyA1NyAyMTMgOCA3MCAxNTkgNyA0MiAyMjYgMjU2IAorMjgwIDEzMSAyMTMgXgorNjQwIDAgMjkxIDE2MiAxNjEgOTQgMTQyIDE0IDE2NSAyNjkgMTQxIDI1MSAyOTggMTQxIDI5MiA1MSAxNzAgMjUxIDM1IDE5OCAxNyAxMCAKKzE1NCAyNzkgMTA1IDE3MyAxOTIgMjcyIDI0OSA3OSAxOCAzNiAyNjggNzQgODAgMTcwIDI5MiA5MiAyMjcgMjgwIDIxMyAxODIgNDUgODAgCisxMjkgMTUwIDYzIDQ5IDI5NiAxODUgMTEyIDcwIDEyNCAxNzEgNTUgMjYzIDUxIDEyOSAxMDkgNiAyMCAzMyAyMDEgODQgMTQ5IDIxNSAKKzk3IDE2OCAzMiAyMTYgMjcgMjM0IDEzMyAyODcgMTEwIDExNCAyNDggMTkwIDkgMTgzIDE1NiAxOTQgMjI4IDEyNSAyNzkgNjQgMTE2IAorMTYzIDkgMjY1IDI3MCAyNTIgNjEgOCAxMTYgMjA0IDY2IDI5NCAyMjkgMjM2IDg5IDE2MyA5MSAxNjAgMjQgODUgMjkgMTQ5IDI1NiAKKzE1NCAxOTcgMjEwIDExNSA1NSAxMDggMTU4IDY4IDIwOSA0OCAxMDMgMTc2IDI1OSAyNjIgMjUgMTUgMTAgMzEgMjMgMTggNzcgMjEgCisxMDMgMjU4IDY5IDE2IDE2MiAyMDIgMTUxIDE3MSAyNzcgMTQ5IDI5NyAyOTYgMjI2IDE2OSA5OSA4MyA3MCA4MyAyOSAyNiA2NyAxMDEgCiszOSAzMSA2NCA3NSAxMDYgMjg0IDIgNjcgMjI0IDI5NSAzMyAxNjAgMjQ2IDI3NSAyNzUgMTIgNjkgOTggNTcgMjYwIDY5IDEzOSAxMTQgCisyODkgMjQ3IDM4IDE0MiA1NSAyMjIgMjk4IDEwMCAyMzUgMjIgMjExIDI2NyAyMjYgMTI4IDQyIDU0IDE5NiAxODQgMSAyNjAgMjUgMTk2IAorMTQzIDI0OCAyMzEgMTUxIDIxMiAzMCAxNzggMjU2IDE5NSAyNTQgMjM5IDc0IDM5IDI4IDI2MyAxMzMgMjQgMTY3IDE0MyAyMDcgMTc0IAorMTIyIDM0IDEzMSA2NSAxODYgMjIwIDc5IDI4MSAyODMgMjM5IDExNSA5NiA1NyAxMzcgMTE3IDUyIDE4IDExOCA3OCAxMzIgMjE3IDUzIAorNDQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5NSA3NCAzMDIgMjc1IDIzNCAxNzQgNDAgMTM5IDczIDIzMiAyMTggMTY0IDE1OCAyNyAKKzE1MiAxOSAyMjkgMjc3IDIzMSAxOTIgNTAgNTkgNTIgMjQwIDQgMjAgMjE0IDMwIDMwMSAyMDggMjgyIDQ2IDEwNiAyNDMgMjQ5IDM4IAorMjY1IDcgNSA5MCAyNzEgMTUgMTMgMTM2IDI2OSAxMDAgMTk0IDI2OSAxODIgNCAyMyAxMDAgMjc2IDc5IDI0MCAyMjYgMjEwIDE1NiAKKzExMiAyOSA2NyAxNDIgOTYgNjAgMjMgNTkgMTM0IDUwIDYyIDI0MiAxODIgODYgMTM3IDE1OCAxMDkgNDcgNzcgNjIgMTYwIDI4NyAyOCAKKzE5MCA1MyAxMjYgMTI3IDIzNSAyNDQgOTcgMjA5IDg5IDI0NSAyMDUgMjE4IDI0NiA1MyA4NSA3MCAyMDYgMjg1IDExMyAxODEgMTkgCisyNzAgMzAgMjYwIDY2IDI1MyAxNzIgMjA3IDIxNSAxNzkgNjMgNSA0OSAyMTQgNzEgNTQgMjM3IDI0MSAzMCAyMTkgOSAyMjQgMjEzIAorMjIzIDEwMiAxMDkgMyAxMzQgOTEgMTE5IDI3MSA1NiA3MCAxNjUgMjI4IDg0IDIyMiAzNSAxNTcgMjY0IDI4NSAxOTUgMjk1IDc3IDEwMyAKKzIxNyAxMiAyOTEgMjAzIDMwMyAxMjMgMTAxIDMwMiAxOTMgMzUgMTE2IDEyMiAyNTYgMjM2IDcgMjY4IDMzIDI0MiAxNDEgMjkgMTA4IAorMTk5IDEyNSAyMzggNyA4NyAyODkgMjUgMjM3IDIwMCAyNzcgMTkwIDUwIDIxIDE4NSAxNTMgMTI3IDE1MyA0NSAzOSA3MiAxMjEgMTA0IAorNjUgMjY4IDExNSAxMzcgMTk5IDE2NiA3NiAzNiA0NiAxODggNTMgMyAxNzUgMTQ4IDE0OCAyMzAgNDAgOTggMTYgMjAzIDQwIDE4MCAKKzEzMCAyNjEgMTc3IDYzIDI3MSA5NyAxMjcgMTk0IDE4NyA2OCAyNTAgMTA1IDEzMiAxMzUgMjQzIDI5MCA5NSAyOTQgMjcwIDI5MyAxMTggCiszNyA3NSAxODggOTQgNjAgMjA0IDEwNyA0NyAyNTggMTEwIDczIDE5MSAxNjEgMTM1IDI4NCA0MyAxMjQgMjUzIDI1NCAxNyAyNzMgMTIgCisyNTAgMTQ2IDI3NCAxNjQgMTE3IDI3NCAxMjMgNjAgMjQ1IDE2NCA3NiAyMTcgOTQgMTAxIDI2MSAxMzYgNiAyNDIgMjIzIDE0MyAxNjYgCiszMiA5MyA3NSAxNDcgMzcgMzEgMjQ1IDEyMyAxOSAxODggMTM1IDIwMiAyMzMgNjYgMzEgMjg2IDI2NSA0OCA2MiAxMTkgMjMwIDMwMyAKKzQxIDI5MSAyNDQgNTYgMTUyIDYwIDI4NiAyIDEwNSA5MSA3OCAyMTQgMjcgMTExIDI2NiAyMDAgMTQgMjQ3IDc5IDE5OSA4NCAxODEgCisyODIgMTI4IDEgMzAxIDE2NyAyMjUgMTcgMjMyIDI1OSAyMjEgMTg3IDI5MCAxMzYgNDcgMjk5IDI1MiAxMDIgMTUwIDE0NSAxNjMgNTAgCisxOCAyOTkgMjExIDQ1IDEyMSAxODYgMTc5IDIyIDI1MiAyMCAyNTUgODcgMjYgODIgMjY2IDE1OSAyNjEgMjE4IDIwNSAzMDAgNTYgMTExIAorMyAyNTcgNDMgMjA2IDYzIDggMjM5IDE1NiAxNTMgODYgOTYgMTYgODAgODggOTMgMzQgOTAgOCAxNTcgNDIgOTUgMjUzIDIxMyAyNjQgCisyNDQgMTM4IDI2NiAxMTggMTE5IDE4OSAyNDYgNzkgXgorNjUwIDAgMjQgMzUgMjIgNzYgODEgMjYgMzggOCA2OCA4MCA0MyAzMiAxIDEyOSAyNCA0NCAxOTEgMTE4IDcyIDI1MSAxNjUgMTM4IDE0MCAKKzk5IDQwIDExIDU0IDE1MSA0MiAyNzYgMzAxIDEyMiAxNjQgNjcgMjcxIDUwIDE4OSAxMTUgNyAxODAgODcgMjAwIDE0NiAxODUgMjg1IAorNjcgNTMgMjE5IDIzMSAxMDYgMTUzIDEgMjE3IDI3MiAxNjUgMTgyIDI2NCAxOTkgNzUgMjM3IDE1NyAyMTYgMTU3IDE3MiAzMyA3MiA3NyAKKzE1MiAyODAgODcgMjQ0IDI3MCAyMDYgMjQxIDI5MyA3NyAyODQgNDAgMjI5IDE5MSAzMCAxMzAgMTMwIDE3NCAyOTggMTMgNDggMjc0IAorMjk4IDU3IDkzIDI5NSAyNyAyODMgMTk2IDU0IDYzIDE3OSAyMzQgNCAyODIgMzcgMjQzIDEyMCAzMSAxMTMgMTM2IDE4MSAyMzcgNjkgCisyNzQgMzYgMTgxIDE5MyAyNTEgMjUzIDgwIDI2MSA5MCAxODYgMTM4IDE4NCAyMjMgNjEgNDYgNTMgMTc1IDEwNyA2IDE5NyA4MSAxMTQgCisyMDcgMTI5IDU5IDMwNSAxNzAgMTYyIDczIDE0OCAxMDAgMTAyIDE3IDE0MCAxMSA5OCAyNzUgMTQyIDUgMjIxIDE0NiAyMjkgMTAzIDg4IAorOSAxMzkgMjggMTcxIDE4OSAyMDMgMjU1IDMwMSA3OCA0MCAyNzMgOSA1MSA4NiA1MCAyNzcgNTcgNDkgMTcxIDIzMyAyMSAyNzYgMjU3IAorMzA0IDY0IDMyIDQ1IDI1MyAxMjQgNzkgMTExIDIyMSA1OCAyODcgMjg4IDE3NiAxNjkgMTIgMjA0IDIwIDE3MCAyMDYgMTk3IDE2OSA1NiAKKzIyIDQxIDIwNSAxMjYgMzAwIDIzNCA5MiAxNDUgNzkgMTU1IDM5IDE1OCAyNDMgMjA4IDIwMCAyMzQgNDggMjEgNTggMTk5IDQwIDU1IAorMTc4IDE3MiA3NyAxOTYgOTggMTg3IDIwMCAxOTAgMyAyMyAyNzkgMTYgMjk2IDE0MiA0OSAzOSAyNDYgMTg1IDIzIDE5MSA3NCAyNTQgCisxNTEgMTMwIDIxOCAxMTYgMzQgNCAxOTQgOTUgMTIyIDIwOCAxMTIgMjkyIDYgMTA5IDIxOCA3MiAyOTUgMjg5IDE1OSAxNzUgMTkgMTQzIAorNzYgMTY5IDI3NCA4MCAzMDUgMjE0IDI4NiAxNzMgMTA0IDIwIDEyNiA4MiAxNzYgMjEzIDEzNiAyMjUgNTUgOTAgMjMwIDI2MiAyODQgCisyNTggNjAgNzAgMzkgMjkwIDMgNDQgMTQ3IDMwMCAyNzggMjE2IDI0NSAzNSA3NSA2MyAyMjMgNTIgMTA0IDIzOCAyNjMgMjY3IDE4NSAKKzY3IDkgOTUgMjEwIDcxIDIzMyAyODMgMTUyIDIzNiA0MiAxNDQgOCAyODYgMjE3IDIyOCA0MSAxNjEgMiAyNzkgMjc4IDE3MiAxMjEgMTQgCisxMTkgMTQzIDEyMCAyOTMgNjggMzYgMjI1IDExIDQ1IDIwOSA1OCAxNTUgMzAxIDM0IDIyMiAyNTIgMjgwIDEzMSA2MiAyOTEgMTYyIAorMTYxIDkwIDE0MiAxNCAxNjMgMjY3IDE0MSAyNDkgMjk0IDEzOSAyOTAgNDcgMTY4IDI0NyAyOSAxOTggMTMgNCAxNTAgMjc3IDEwMSAKKzE3MyAxOTIgMjY4IDI0NyA3MyAxNiAzNCAyNjYgNzAgNzQgMTY2IDI4OCA4OCAyMjcgMjc2IDIxMyAxODAgNDMgNzYgMTI1IDE1MCA1OSAKKzQzIDI5NCAxODMgMTA4IDY4IDEyNCAxNjcgNTMgMjYzIDQ5IDEyNyAxMDkgMTQgMzEgMjAxIDc4IDMwMiAxNDkgMjE1IDk1IDE2NiAyNiAKKzIxMiAyMSAyMzIgMTMzIDI4MyAxMDggMTEyIDI0OCAxODggOSAxODMgMTUyIDE5MiAyMjQgMTIzIDI3OSA2MCAxMTQgMTYzIDUgMjY1IAorMjcwIDI1MCA1OSA4IDExMiAyMDQgNjQgMjk0IDIyNyAyMzIgODkgMTU5IDg3IDE1NiAyMiA4NSAyMyAxNDcgMjU2IDE1NCAxOTUgMjEwIAorMTE1IDUxIDMwNCAxMDggMTU2IDY2IDIwOSA0NCAxMDMgMTc2IDI1NyAyNjAgMTkgMTEgMTAgMjcgMjEgMTQgNzUgMTkgOTkgMjU4IDY5IAorMTIgMTYwIDIwMiAxNDkgMTcxIDI3NyAxNDUgMjk3IDI5MiAyMjQgMTY3IDk3IDgxIDcwIDgzIDI5IDI0IDY3IDk3IDM3IDI1IDYyIDczIAorMTA0IDI4MiAyIDYxIDIyMCAyOTMgMzMgMTYwIDI0NiAyNzMgMjcxIDYgNjUgOTQgNTEgMjYwIDYzIDEzNSAxMTAgMjg5IDI0NyAzOCAKKzE0MCA1NSAyMjIgMjk2IDk4IDIzMSAxOCAyMTEgMjY1IDIyNiAxMjYgMzggNTIgMTkyIDE4MCAzMDUgMjU4IDI1IDE5NCAxMzkgMjQ2IAorMjI5IDE0NyAyMTIgMzAgMTc0IDI1NCAxOTUgMjU0IDIzOSA3MiAzMyAyOCAyNTkgMTMxIDE4IDE2NyAxNDEgMjA1IDE3MCAxMTggMjggCisxMjcgNjUgMTgyIDIyMCA3NSAyODEgMjgxIDIzNyAxMTMgOTIgNTcgMTM3IDExMyA0OCAxMiAxMTYgNzggMTI4IDIxNSA1MSA0MiAyMzIgCisxNzcgMjIgMTI5IDY4IDE2OCAyOTEgNzQgMjk4IDI3NSAyMzAgMTc0IDM2IDEzNyA2OSAyMzAgMjE4IDE2MCAxNTggMjUgMTUwIDE1IAorMjI1IDI3MyAyMjcgMTg4IDQ0IDU5IDUyIDIzNiAzMDQgMjAgMjE0IDI0IDI5NyAyMDQgMjgyIDQ2IDEwNiAyNDEgMjQ5IDMyIDI2MyA1IAorMyA4OCAyNzEgMTUgNyAxMzYgMjY5IDEwMCAxOTAgMjY1IDE4MiAyIDE3IDk2IDI4MyBeCis2NDkgMCA3NiAyNDAgMjIwIDIwNyAxNTYgMTA5IDI2IDY0IDEzNiA5NiA1MSAxNyA1MyAxMzQgNDcgNTMgMjM5IDE3NiA4MyAxMzQgMTUyIAorMTA2IDM4IDcxIDU5IDE1NyAyODcgMjUgMjk4IDE5MCA0NCAxMjMgMTIxIDIzNSAyNDEgOTEgMjA2IDgzIDIzOSAyMDUgMjEyIDI0MCA0NyAKKzgyIDYxIDIwNiAyODUgMTEwIDE3NSAxMCAyNjQgMjQgMjU0IDY2IDI1MyAxNjYgMjAxIDIwOSAxNzYgNTQgNSA0NiAyMTEgNjIgNDggCisyMzEgMjM4IDI3IDIxMyA2IDIyNCAyMTAgMjIwIDEwMiAxMDMgMyAxMzEgODggMTEzIDI2OCA1NiA2NCAxNjUgMjI1IDgxIDIxOSAyOSAKKzE1NyAyNTggMjc5IDE5MiAyOTUgNjggMTAwIDIxNyA5IDI4OCAyMDMgMjk3IDExNyA5OCAzMDIgMTkzIDMyIDExNiAxMjIgMjUwIDIzNiAKKzcgMjY4IDI3IDI0MiAxMzUgMjMgMTA1IDE5NiAxMjUgMjM4IDMwNSA4NCAyODMgMjIgMjM0IDE5NyAyNzQgMTg0IDUwIDEyIDE3OSAxNDcgCisxMjcgMTUzIDQ1IDMzIDYzIDEyMSAxMDEgNTkgMjYyIDEwOSAxMzEgMTkzIDE2NiA2NyAyNyA0MCAxODggNTMgMTcyIDE0OCAxNDIgMjI0IAorMzcgOTUgNyAyMDAgMzEgMTc3IDEyNyAyNTggMTc0IDYzIDI2NSA5NyAxMjQgMTk0IDE4MSA2MiAyNTAgMTAyIDEzMiAxMzIgMjM3IDI5MCAKKzg5IDI5MSAyNjcgMjkwIDExOCAzNyA2NiAxODUgOTQgNjAgMjAxIDEwNCA0NyAyNTUgMTEwIDcwIDE4OCAxNTggMTI5IDI3OCA0MyAxMTggCisyNDcgMjQ4IDE0IDI2NyAxMiAyNDcgMTQzIDI2OCAxNjEgMTE3IDI3MSAxMjAgNTcgMjQyIDE2NCA3NiAyMTEgOTEgMTAxIDI2MSAxMzMgCiszIDIzNiAyMTcgMTQzIDE2MyAzMiA4NyA2OSAxNDQgMzQgMzEgMjQ1IDEyMyAxNiAxODIgMTM1IDE5NiAyMzAgNjAgMjggMjg2IDI1OSAKKzQ1IDYyIDExNiAyMjcgMzAzIDM1IDI4NSAyNDQgNTAgMTQ2IDU0IDI4MyAzMDAgMTA1IDkxIDcyIDIwOCAyNyAxMDggMjYwIDE5NCA4IAorMjQ0IDc5IDE5OSA4NCAxNzggMjc2IDEyOCAzMDIgMjk4IDE2MSAyMjIgMTcgMjI2IDI1OSAyMTggMTg3IDI4NyAxMzAgNDQgMjk2IDI0NiAKKzk5IDE0NCAxMzkgMTYwIDQ0IDE4IDI5OSAyMDUgMzkgMTE1IDE4MyAxNzkgMTMgMjUyIDE3IDI1NSA4MSAxNyA4MiAyNjMgMTUzIDI1NSAKKzIxNSAxOTkgMjk0IDUzIDEwNSAzMDEgMjU0IDM3IDIwMCA2MCAzMDYgMjMzIDE1MyAxNTAgODYgOTMgMTYgNzcgODIgOTAgMjggODQgNSAKKzE1MSAzMyA5MiAyNTAgMjA3IDI2MSAyMzggMTMyIDI2NiAxMTIgMTE5IDE4NiAyNDMgNiAyMiAzMiAxOSA3MyA3OSAyNiAzNSA3IDY2IAorODAgNDEgMzAgMzA2IDEyOCAyNCA0NCAxOTEgMTE3IDY5IDI0OSAxNjMgMTM3IDE0MCA5OSAzOSAxMCA1NCAxNDkgNDIgMjc2IDMwMSAKKzEyMCAxNjIgNjQgMjcwIDQ3IDE4NyAxMTQgNSAxODAgODYgMTk4IDE0NSAxODMgMjg0IDY2IDUxIDIxOSAyMzEgMTA0IDE1MiAxIDIxNiAKKzI3MiAxNjQgMTgxIDI2NCAxOTcgNzIgMjM3IDE1NiAyMTQgMTU1IDE3MCAzMSA3MiA3NCAxNTIgMjc5IDg3IDI0MiAyNjkgMjA1IDI0MSAKKzI5MyA3NyAyODQgMzcgMjI5IDE4OSAyOSAxMjggMTI5IDE3MyAyOTcgMTIgNDUgMjcyIDI5OCA1NiA5MyAyOTQgMjQgMjgzIDE5NSA1MiAKKzYxIDE3NyAyMzIgNCAyODAgMzQgMjQxIDEyMCAyOCAxMTMgMTM0IDE4MSAyMzUgNjggMjczIDM1IDE4MCAxOTEgMjUxIDI1MSA3OCAyNjAgCis4OSAxODYgMTM4IDE4NCAyMjMgNjEgNDMgNTAgMTc1IDEwNyA2IDE5NSA4MSAxMTQgMjA3IDEyNyA1NiAzMDMgMTY5IDE2MCA3MyAxNDcgCis5OCAxMDAgMTUgMTM4IDExIDk4IDI3MyAxNDAgMiAyMjEgMTQ2IDIyNyAxMDEgODggOCAxMzkgMjYgMTY5IDE4OSAyMDIgMjUzIDMwMCAKKzc2IDM4IDI3MyA2IDUxIDg1IDQ5IDI3NSA1NSA0OSAxNzAgMjMzIDE5IDI3NSAyNTcgMzAzIDY0IDMxIDQzIDI1MiAxMjIgNzcgMTExIAorMjE5IDU4IDI4NiAyODggMTc0IDE2OCAxMSAyMDMgMTkgMTcwIDIwNCAxOTcgMTY5IDU1IDIwIDQxIDIwMyAxMjQgMjk5IDIzNCA5MiAKKzE0NSA3OCAxNTUgMzYgMTU2IDI0MyAyMDggMjAwIDIzMyA0OCAyMSA1NiAxOTggNDAgNTQgMTc4IDE3MSA3NSAxOTYgOTYgMTg1IDE5OSAKKzE4OSAzMDYgMjMgMjc4IDE0IDI5NiAxNDEgNDYgMzggMjQ0IDE4NCAyMSAxOTAgNzMgMjUyIDE1MSAxMzAgMjE3IDExNCAzNCAyIDE5MiAKKzkzIDEyMSAyMDYgMTEyIDI5MiA0IDEwNyAyMTYgNzAgMjkzIDI4NyAxNTkgMTczIDE5IDE0MSA3NSAxNjcgMjc0IDc5IDMwNCAyMTMgCisyODQgMTcxIDEwNCAxOCAxMjYgODAgMTc1IDIxMiAxMzUgMjI1IDUyIDkwIDIzMCAyNjIgMjgyIDI1NiA1NyA2OSAzOSAyODggMSA0MyAKKzE0NyAzMDAgMjc4IDIxNiAyNDMgMzUgNzUgNjIgMjIxIDQ5IDEwMiAyMzcgMjYxIDI2NyAxNDAgXgorNjQ5IDEgNjEgMyA5NSAyMDcgNzEgMjMwIDI4MCAxNDkgMjMzIDMzIDE0NCAzMDggMjgzIDIxMSAyMjggMzggMTU1IDMwNSAyNzMgMjc1IAorMTcyIDExNSAxMSAxMTYgMTQwIDExNyAyODcgNTkgMzYgMjIyIDIgMzYgMjA2IDMwMyA0OSAxNTIgMjk1IDI4IDIxOSAyNDkgMjgwIDEzMSAKKzUzIDI5MSAxNjIgMTYxIDg0IDE0MiAxNCAxNjAgMjY0IDE0MSAyNDYgMjg4IDEzNiAyODcgNDEgMTY1IDI0MSAyMCAxOTggNyAzMDQgCisxNDQgMjc0IDk1IDE3MyAxOTIgMjYyIDI0NCA2NCAxMyAzMSAyNjMgNjQgNjUgMTYwIDI4MiA4MiAyMjcgMjcwIDIxMyAxNzcgNDAgNzAgCisxMTkgMTUwIDUzIDM0IDI5MSAxODAgMTAyIDY1IDEyNCAxNjEgNTAgMjYzIDQ2IDEyNCAxMDkgMzAwIDUgMjggMjAxIDY5IDI5OSAxNDkgCisyMTUgOTIgMTYzIDE3IDIwNiAxMiAyMjkgMTMzIDI3NyAxMDUgMTA5IDI0OCAxODUgOSAxODMgMTQ2IDE4OSAyMTggMTIwIDI3OSA1NCAKKzExMSAxNjMgMzA4IDI2NSAyNzAgMjQ3IDU2IDggMTA2IDIwNCA2MSAyOTQgMjI0IDIyNiA4OSAxNTMgODEgMTUwIDE5IDg1IDE0IDE0NCAKKzI1NiAxNTQgMTkyIDIxMCAxMTUgNDUgMzA0IDEwOCAxNTMgNjMgMjA5IDM4IDEwMyAxNzYgMjU0IDI1NyAxMCA1IDEwIDIxIDE4IDggNzIgCisxNiA5MyAyNTggNjkgNiAxNTcgMjAyIDE0NiAxNzEgMjc3IDEzOSAyOTcgMjg2IDIyMSAxNjQgOTQgNzggNzAgODMgMjkgMjEgNjcgOTEgCiszNCAxNiA1OSA3MCAxMDEgMjc5IDIgNTIgMjE0IDI5MCAzMyAxNjAgMjQ2IDI3MCAyNjUgMzA2IDU5IDg4IDQyIDI2MCA1NCAxMjkgMTA0IAorMjg5IDI0NyAzOCAxMzcgNTUgMjIyIDI5MyA5NSAyMjUgMTIgMjExIDI2MiAyMjYgMTIzIDMyIDQ5IDE4NiAxNzQgMzA1IDI1NSAyNSAKKzE5MSAxMzMgMjQzIDIyNiAxNDEgMjEyIDMwIDE2OCAyNTEgMTk1IDI1NCAyMzkgNjkgMjQgMjggMjUzIDEyOCA5IDE2NyAxMzggMjAyIAorMTY0IDExMiAxOSAxMjEgNjUgMTc2IDIyMCA2OSAyODEgMjc4IDIzNCAxMTAgODYgNTcgMTM3IDEwNyA0MiAzIDExMyA3OCAxMjIgMjEyIAorNDggMzkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4NSA3NCAyOTIgMjc1IDIyNCAxNzQgMzAgMTM0IDYzIDIyNyAyMTggMTU0IDE1OCAyMiAKKzE0NyA5IDIxOSAyNjcgMjIxIDE4MiAzNSA1OSA1MiAyMzAgMjk4IDIwIDIxNCAxNSAyOTEgMTk4IDI4MiA0NiAxMDYgMjM4IDI0OSAyMyAKKzI2MCAyIDg1IDI3MSAxNSAzMDcgMTM2IDI2OSAxMDAgMTg0IDI1OSAxODIgMzA4IDggOTAgMjY2IDc0IDI0MCAyMTYgMjA1IDE1NiAxMDcgCisyNCA2MiAxMzIgOTYgNDUgMTMgNDkgMTM0IDQ1IDQ3IDIzNyAxNzIgODEgMTMyIDE0OCAxMDQgMzIgNjcgNTcgMTU1IDI4NyAyMyAyOTQgCisxOTAgMzggMTIxIDExNyAyMzUgMjM5IDg3IDIwNCA3OSAyMzUgMjA1IDIwOCAyMzYgNDMgODAgNTUgMjA2IDI4NSAxMDggMTcxIDQgMjYwIAorMjAgMjUwIDY2IDI1MyAxNjIgMTk3IDIwNSAxNzQgNDggNSA0NCAyMDkgNTYgNDQgMjI3IDIzNiAyNSAyMDkgNCAyMjQgMjA4IDIxOCAKKzEwMiA5OSAzIDEyOSA4NiAxMDkgMjY2IDU2IDYwIDE2NSAyMjMgNzkgMjE3IDI1IDE1NyAyNTQgMjc1IDE5MCAyOTUgNjIgOTggMjE3IDcgCisyODYgMjAzIDI5MyAxMTMgOTYgMzAyIDE5MyAzMCAxMTYgMTIyIDI0NiAyMzYgNyAyNjggMjMgMjQyIDEzMSAxOSAxMDMgMTk0IDEyNSAKKzIzOCAzMDEgODIgMjc5IDIwIDIzMiAxOTUgMjcyIDE4MCA1MCA2IDE3NSAxNDMgMTI3IDE1MyA0NSAyOSA1NyAxMjEgOTkgNTUgMjU4IAorMTA1IDEyNyAxODkgMTY2IDYxIDIxIDM2IDE4OCA1MyAzMDcgMTcwIDE0OCAxMzggMjIwIDM1IDkzIDEgMTk4IDI1IDE3NSAxMjUgMjU2IAorMTcyIDYzIDI2MSA5NyAxMjIgMTk0IDE3NyA1OCAyNTAgMTAwIDEzMiAxMzAgMjMzIDI5MCA4NSAyODkgMjY1IDI4OCAxMTggMzcgNjAgCisxODMgOTQgNjAgMTk5IDEwMiA0NyAyNTMgMTEwIDY4IDE4NiAxNTYgMTI1IDI3NCA0MyAxMTQgMjQzIDI0NCAxMiAyNjMgMTIgMjQ1IAorMTQxIDI2NCAxNTkgMTE3IDI2OSAxMTggNTUgMjQwIDE2NCA3NiAyMDcgODkgMTAxIDI2MSAxMzEgMSAyMzIgMjEzIDE0MyAxNjEgMzIgCis4MyA2NSAxNDIgMzIgMzEgMjQ1IDEyMyAxNCAxNzggMTM1IDE5MiAyMjggNTYgMjYgMjg2IDI1NSA0MyA2MiAxMTQgMjI1IDMwMyAzMSAKKzI4MSAyNDQgNDYgMTQyIDUwIDI4MSAyOTYgMTA1IDkxIDY4IDIwNCAyNyAxMDYgMjU2IDE5MCA0IDI0MiA3OSAxOTkgODQgMTc2IDI3MiAKKzEyOCAzMDAgMjk2IDE1NyAyMjAgMTcgMjIyIDI1OSAyMTYgMTg3IDI4NSAxMjYgNDIgMjk0IDI0MiA5NyAxNDAgMTM1IDE1OCA0MCAxOCAKKzI5OSAyMDEgMzUgMTExIDE4MSAxNzkgNyAyNTIgMTUgMjU1IDc3IDExIDgyIDI2MSAxNDkgMjUxIDY5IF4KKzY1NSAwIDE5MSAyODYgNDkgOTcgMjkzIDI1MCAyOSAxOTIgNTYgMjk4IDIyNSAxNDkgMTQ2IDg2IDg5IDE2IDczIDc0IDg2IDIwIDc2IDEgCisxNDMgMjEgODggMjQ2IDE5OSAyNTcgMjMwIDEyNCAyNjYgMTA0IDExOSAxODIgMjM5IDMwOSAxNCAyMCA3IDYxIDcxIDI2IDIzIDMgNTggCis4MCAzMyAyMiAzMDIgMTI0IDI0IDQ0IDE5MSAxMTMgNTcgMjQxIDE1NSAxMzMgMTQwIDk5IDM1IDYgNTQgMTQxIDQyIDI3NiAzMDEgMTEyIAorMTU0IDUyIDI2NiAzNSAxNzkgMTEwIDMwOCAxODAgODIgMTkwIDE0MSAxNzUgMjgwIDYyIDQzIDIxOSAyMzEgOTYgMTQ4IDEgMjEyIDI3MiAKKzE2MCAxNzcgMjY0IDE4OSA2MCAyMzcgMTUyIDIwNiAxNDcgMTYyIDIzIDcyIDYyIDE1MiAyNzUgODcgMjM0IDI2NSAyMDEgMjQxIDI5MyAKKzc3IDI4NCAyNSAyMjkgMTgxIDI1IDEyMCAxMjUgMTY5IDI5MyA4IDMzIDI2NCAyOTggNTIgOTMgMjkwIDEyIDI4MyAxOTEgNDQgNTMgCisxNjkgMjI0IDQgMjcyIDIyIDIzMyAxMjAgMTYgMTEzIDEyNiAxODEgMjI3IDY0IDI2OSAzMSAxNzYgMTgzIDI1MSAyNDMgNzAgMjU2IDg1IAorMTg2IDEzOCAxODQgMjIzIDYxIDMxIDM4IDE3NSAxMDcgNiAxODcgODEgMTE0IDIwNyAxMTkgNDQgMjk1IDE2NSAxNTIgNzMgMTQzIDkwIAorOTIgNyAxMzAgMTEgOTggMjY1IDEzMiAzMDEgMjIxIDE0NiAyMTkgOTMgODggNCAxMzkgMTggMTYxIDE4OSAxOTggMjQ1IDI5NiA2OCAzMCAKKzI3MyAzMDUgNTEgODEgNDUgMjY3IDQ3IDQ5IDE2NiAyMzMgMTEgMjcxIDI1NyAyOTkgNjQgMjcgMzUgMjQ4IDExNCA2OSAxMTEgMjExIAorNTggMjgyIDI4OCAxNjYgMTY0IDcgMTk5IDE1IDE3MCAxOTYgMTk3IDE2OSA1MSAxMiA0MSAxOTUgMTE2IDI5NSAyMzQgOTIgMTQ1IDc0IAorMTU1IDI0IDE0OCAyNDMgMjA4IDIwMCAyMjkgNDggMjEgNDggMTk0IDQwIDUwIDE3OCAxNjcgNjcgMTk2IDg4IDE3NyAxOTUgMTg1IDI5OSAKKzMwNiAyMyAyNzQgNiAyOTYgMTM3IDM0IDM0IDIzNiAxODAgMTMgMTg2IDY5IDI0NCAxNTEgMTMwIDIxMyAxMDYgMzQgMzA1IDE4NCA4NSAKKzExNyAxOTggMTEyIDI5MiAzMDcgOTkgMjA4IDYyIDI4NSAyNzkgMTU5IDE2NSAxOSAxMzMgNzEgMTU5IDI3NCA3NSAzMDAgMjA5IDI3NiAKKzE2MyAxMDQgMTAgMTI2IDcyIDE3MSAyMDggMTMxIDIyNSA0MCA5MCAyMzAgMjYyIDI3NCAyNDggNDUgNjUgMzkgMjgwIDMwNCAzOSAxNDcgCiszMDAgMjc4IDIxNiAyMzUgMzUgNzUgNTggMjEzIDM3IDk0IDIzMyAyNTMgMjY3IDE4NSA1NyAzMTAgOTUgMjA1IDcxIDIyOCAyNzggMTQ3IAorMjMxIDI3IDE0NCAzMDQgMjgxIDIwNyAyMjggMzYgMTUxIDMwMyAyNjkgMjczIDE3MiAxMTEgOSAxMTQgMTM4IDExNSAyODMgNTMgMzYgCisyMjAgMzA3IDMwIDIwNCAzMDEgNDMgMTUwIDI5MSAyNCAyMTcgMjQ3IDI4MCAxMzEgNDcgMjkxIDE2MiAxNjEgODAgMTQyIDE0IDE1OCAKKzI2MiAxNDEgMjQ0IDI4NCAxMzQgMjg1IDM3IDE2MyAyMzcgMTQgMTk4IDMgMzAwIDE0MCAyNzIgOTEgMTczIDE5MiAyNTggMjQyIDU4IAorMTEgMjkgMjYxIDYwIDU5IDE1NiAyNzggNzggMjI3IDI2NiAyMTMgMTc1IDM4IDY2IDExNSAxNTAgNDkgMjggMjg5IDE3OCA5OCA2MyAKKzEyNCAxNTcgNDggMjYzIDQ0IDEyMiAxMDkgMjk2IDMxMCAyNiAyMDEgNjMgMjk3IDE0OSAyMTUgOTAgMTYxIDExIDIwMiA2IDIyNyAxMzMgCisyNzMgMTAzIDEwNyAyNDggMTgzIDkgMTgzIDE0MiAxODcgMjE0IDExOCAyNzkgNTAgMTA5IDE2MyAzMDYgMjY1IDI3MCAyNDUgNTQgOCAKKzEwMiAyMDQgNTkgMjk0IDIyMiAyMjIgODkgMTQ5IDc3IDE0NiAxNyA4NSA4IDE0MiAyNTYgMTU0IDE5MCAyMTAgMTE1IDQxIDMwNCAxMDggCisxNTEgNjEgMjA5IDM0IDEwMyAxNzYgMjUyIDI1NSA0IDEgMTAgMTcgMTYgNCA3MCAxNCA4OSAyNTggNjkgMiAxNTUgMjAyIDE0NCAxNzEgCisyNzcgMTM1IDI5NyAyODIgMjE5IDE2MiA5MiA3NiA3MCA4MyAyOSAxOSA2NyA4NyAzMiAxMCA1NyA2OCA5OSAyNzcgMiA0NiAyMTAgMjg4IAorMzMgMTYwIDI0NiAyNjggMjYxIDMwMiA1NSA4NCAzNiAyNjAgNDggMTI1IDEwMCAyODkgMjQ3IDM4IDEzNSA1NSAyMjIgMjkxIDkzIDIyMSAKKzggMjExIDI2MCAyMjYgMTIxIDI4IDQ3IDE4MiAxNzAgMzA1IDI1MyAyNSAxODkgMTI5IDI0MSAyMjQgMTM3IDIxMiAzMCAxNjQgMjQ5IAorMTk1IDI1NCAyMzkgNjcgMTggMjggMjQ5IDEyNiAzIDE2NyAxMzYgMjAwIDE2MCAxMDggMTMgMTE3IDY1IDE3MiAyMjAgNjUgMjgxIDI3NiAKKzIzMiAxMDggODIgNTcgMTM3IDEwMyAzOCAzMDggMTExIDc4IDExOCAyMTAgNDYgMzcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4MSA3NCAKKzI4OCAyNzUgMjIwIDE3NCAyNiAxMzIgNTkgMjI1IDIxOCAxNTAgMTU4IDIwIDE0NSA1IDIxNSAyNjMgMTAwIF4KKzY2MSAxIDE3NiAyNiA1OSA1MiAyMjQgMjkyIDIwIDIxNCA2IDI4NSAxOTIgMjgyIDQ2IDEwNiAyMzUgMjQ5IDE0IDI1NyAzMTEgMzA5IAorODIgMjcxIDE1IDMwMSAxMzYgMjY5IDEwMCAxNzggMjUzIDE4MiAzMDggMzExIDg0IDI2MCA3MSAyNDAgMjEwIDIwMiAxNTYgMTA0IDIxIAorNTkgMTI2IDk2IDM2IDcgNDMgMTM0IDQyIDM4IDIzNCAxNjYgNzggMTI5IDE0MiAxMDEgMjMgNjEgNTQgMTUyIDI4NyAyMCAyODggMTkwIAorMjkgMTE4IDExMSAyMzUgMjM2IDgxIDIwMSA3MyAyMjkgMjA1IDIwMiAyMzAgMzcgNzcgNDYgMjA2IDI4NSAxMDUgMTY1IDMwNyAyNTQgCisxNCAyNDQgNjYgMjUzIDE1NiAxOTEgMTk5IDE3MSAzOSA1IDQxIDIwNiA0NyAzOCAyMjEgMjMzIDIyIDIwMyAxIDIyNCAyMDUgMjE1IAorMTAyIDkzIDMgMTI2IDgzIDEwMyAyNjMgNTYgNTQgMTY1IDIyMCA3NiAyMTQgMTkgMTU3IDI0OCAyNjkgMTg3IDI5NSA1MyA5NSAyMTcgNCAKKzI4MyAyMDMgMjg3IDEwNyA5MyAzMDIgMTkzIDI3IDExNiAxMjIgMjQwIDIzNiA3IDI2OCAxNyAyNDIgMTI1IDEzIDEwMCAxOTEgMTI1IAorMjM4IDI5NSA3OSAyNzMgMTcgMjI5IDE5MiAyNjkgMTc0IDUwIDMwOSAxNjkgMTM3IDEyNyAxNTMgNDUgMjMgNDggMTIxIDk2IDQ5IDI1MiAKKzk5IDEyMSAxODMgMTY2IDUyIDEyIDMwIDE4OCA1MyAzMDcgMTY3IDE0OCAxMzIgMjE0IDMyIDkwIDMwNCAxOTUgMTYgMTcyIDEyMiAyNTMgCisxNjkgNjMgMjU1IDk3IDExOSAxOTQgMTcxIDUyIDI1MCA5NyAxMzIgMTI3IDIyNyAyOTAgNzkgMjg2IDI2MiAyODUgMTE4IDM3IDUxIAorMTgwIDk0IDYwIDE5NiA5OSA0NyAyNTAgMTEwIDY1IDE4MyAxNTMgMTE5IDI2OCA0MyAxMDggMjM3IDIzOCA5IDI1NyAxMiAyNDIgMTM4IAorMjU4IDE1NiAxMTcgMjY2IDExNSA1MiAyMzcgMTY0IDc2IDIwMSA4NiAxMDEgMjYxIDEyOCAzMTAgMjI2IDIwNyAxNDMgMTU4IDMyIDc3IAorNTkgMTM5IDI5IDMxIDI0NSAxMjMgMTEgMTcyIDEzNSAxODYgMjI1IDUwIDIzIDI4NiAyNDkgNDAgNjIgMTExIDIyMiAzMDMgMjUgMjc1IAorMjQ0IDQwIDEzNiA0NCAyNzggMjkwIDEwNSA5MSA2MiAxOTggMjcgMTAzIDI1MCAxODQgMzEwIDIzOSA3OSAxOTkgODQgMTczIDI2NiAKKzEyOCAyOTcgMjkzIDE1MSAyMTcgMTcgMjE2IDI1OSAyMTMgMTg3IDI4MiAxMjAgMzkgMjkxIDIzNiA5NCAxMzQgMTI5IDE1NSAzNCAxOCAKKzI5OSAxOTUgMjkgMTA1IDE3OCAxNzkgMzEwIDI1MiAxMiAyNTUgNzEgMiA4MiAyNTggMTQzIDI0NSAyMTAgMTg5IDI4NCA0OCA5NSAyOTEgCisyNDkgMjcgMTkwIDU1IDI5NiAyMjMgMTQ4IDE0NSA4NiA4OCAxNiA3MiA3MiA4NSAxOCA3NCAxNDEgMTggODcgMjQ1IDE5NyAyNTYgMjI4IAorMTIyIDI2NiAxMDIgMTE5IDE4MSAyMzggMzA4IDEyIDE3IDQgNTggNjkgMjYgMjAgMiA1NiA4MCAzMSAyMCAzMDEgMTIzIDI0IDQ0IDE5MSAKKzExMiA1NCAyMzkgMTUzIDEzMiAxNDAgOTkgMzQgNSA1NCAxMzkgNDIgMjc2IDMwMSAxMTAgMTUyIDQ5IDI2NSAzMiAxNzcgMTA5IDMwNyAKKzE4MCA4MSAxODggMTQwIDE3MyAyNzkgNjEgNDEgMjE5IDIzMSA5NCAxNDcgMSAyMTEgMjcyIDE1OSAxNzYgMjY0IDE4NyA1NyAyMzcgCisxNTEgMjA0IDE0NSAxNjAgMjEgNzIgNTkgMTUyIDI3NCA4NyAyMzIgMjY0IDIwMCAyNDEgMjkzIDc3IDI4NCAyMiAyMjkgMTc5IDI0IAorMTE4IDEyNCAxNjggMjkyIDcgMzAgMjYyIDI5OCA1MSA5MyAyODkgOSAyODMgMTkwIDQyIDUxIDE2NyAyMjIgNCAyNzAgMTkgMjMxIDEyMCAKKzEzIDExMyAxMjQgMTgxIDIyNSA2MyAyNjggMzAgMTc1IDE4MSAyNTEgMjQxIDY4IDI1NSA4NCAxODYgMTM4IDE4NCAyMjMgNjEgMjggMzUgCisxNzUgMTA3IDYgMTg1IDgxIDExNCAyMDcgMTE3IDQxIDI5MyAxNjQgMTUwIDczIDE0MiA4OCA5MCA1IDEyOCAxMSA5OCAyNjMgMTMwIAorMjk5IDIyMSAxNDYgMjE3IDkxIDg4IDMgMTM5IDE2IDE1OSAxODkgMTk3IDI0MyAyOTUgNjYgMjggMjczIDMwMyA1MSA4MCA0NCAyNjUgCis0NSA0OSAxNjUgMjMzIDkgMjcwIDI1NyAyOTggNjQgMjYgMzMgMjQ3IDExMiA2NyAxMTEgMjA5IDU4IDI4MSAyODggMTY0IDE2MyA2IAorMTk4IDE0IDE3MCAxOTQgMTk3IDE2OSA1MCAxMCA0MSAxOTMgMTE0IDI5NCAyMzQgOTIgMTQ1IDczIDE1NSAyMSAxNDYgMjQzIDIwOCAKKzIwMCAyMjggNDggMjEgNDYgMTkzIDQwIDQ5IDE3OCAxNjYgNjUgMTk2IDg2IDE3NSAxOTQgMTg0IDI5NyAzMDYgMjMgMjczIDQgMjk2IAorMTM2IDMxIDMzIDIzNCAxNzkgMTEgMTg1IDY4IDI0MiAxNTEgMTMwIDIxMiAxMDQgMzQgMzA0IDE4MiA4MyAxMTYgMTk2IDExMiAyOTIgCiszMDYgOTcgMjA2IDYwIDI4MyAyNzcgMTU5IDE2MyAxOSAxMzEgNzAgMTU3IDI3NCA3NCAyOTkgMjA4IDI3NCAxNjEgMTA0IDggMTI2IDcwIAorMTcwIDIwNyAxMzAgMjI1IDM3IDkwIDIzMCAxOTQgXgorNjQzIDAgMjY4IDI0MiAzNiA2MiAzOSAyNzQgMzAxIDM2IDE0NyAzMDAgMjc4IDIxNiAyMjkgMzUgNzUgNTUgMjA3IDI4IDg4IDIzMCAKKzI0NyAyNjcgMTg1IDUxIDMwNyA5NSAyMDIgNzEgMjI1IDI3NSAxNDQgMjI4IDE4IDE0NCAyOTggMjc4IDIwMSAyMjggMzMgMTQ1IDMwMCAKKzI2MyAyNzAgMTcyIDEwNSA2IDExMSAxMzUgMTEyIDI3NyA0NCAzNiAyMTcgMzAxIDIxIDIwMSAyOTggMzQgMTQ3IDI4NSAxOCAyMTQgCisyNDQgMjgwIDEzMSAzOCAyOTEgMTYyIDE2MSA3NCAxNDIgMTQgMTU1IDI1OSAxNDEgMjQxIDI3OCAxMzEgMjgyIDMxIDE2MCAyMzEgNSAKKzE5OCAzMTEgMjk0IDEzNCAyNjkgODUgMTczIDE5MiAyNTIgMjM5IDQ5IDggMjYgMjU4IDU0IDUwIDE1MCAyNzIgNzIgMjI3IDI2MCAyMTMgCisxNzIgMzUgNjAgMTA5IDE1MCA0MyAxOSAyODYgMTc1IDkyIDYwIDEyNCAxNTEgNDUgMjYzIDQxIDExOSAxMDkgMjkwIDMwNCAyMyAyMDEgCis1NCAyOTQgMTQ5IDIxNSA4NyAxNTggMiAxOTYgMzExIDIyNCAxMzMgMjY3IDEwMCAxMDQgMjQ4IDE4MCA5IDE4MyAxMzYgMTg0IDIwOCAKKzExNSAyNzkgNDQgMTA2IDE2MyAzMDMgMjY1IDI3MCAyNDIgNTEgOCA5NiAyMDQgNTYgMjk0IDIxOSAyMTYgODkgMTQzIDcxIDE0MCAxNCAKKzg1IDMxMyAxMzkgMjU2IDE1NCAxODcgMjEwIDExNSAzNSAzMDQgMTA4IDE0OCA1OCAyMDkgMjggMTAzIDE3NiAyNDkgMjUyIDMwOSAzMDkgCisxMCAxMSAxMyAzMTIgNjcgMTEgODMgMjU4IDY5IDMxMCAxNTIgMjAyIDE0MSAxNzEgMjc3IDEyOSAyOTcgMjc2IDIxNiAxNTkgODkgNzMgCis3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDI3NCAyIDM3IDIwNCAyODUgMzMgMTYwIDI0NiAyNjUgMjU1IDI5NiA0OSA3OCAKKzI3IDI2MCAzOSAxMTkgOTQgMjg5IDI0NyAzOCAxMzIgNTUgMjIyIDI4OCA5MCAyMTUgMiAyMTEgMjU3IDIyNiAxMTggMjIgNDQgMTc2IAorMTY0IDMwNSAyNTAgMjUgMTg2IDEyMyAyMzggMjIxIDEzMSAyMTIgMzAgMTU4IDI0NiAxOTUgMjU0IDIzOSA2NCA5IDI4IDI0MyAxMjMgCiszMDggMTY3IDEzMyAxOTcgMTU0IDEwMiA0IDExMSA2NSAxNjYgMjIwIDU5IDI4MSAyNzMgMjI5IDEwNSA3NiA1NyAxMzcgOTcgMzIgMzAyIAorMTA4IDc4IDExMiAyMDcgNDMgMzQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI3NSA3NCAyODIgMjc1IDIxNCAxNzQgMjAgMTI5IDUzIDIyMiAKKzIxOCAxNDQgMTU4IDE3IDE0MiAzMTMgMjA5IDI1NyAyMTEgMTcyIDIwIDU5IDUyIDIyMCAyODggMjAgMjE0IDI4MSAxODggMjgyIDQ2IAorMTA2IDIzMyAyNDkgOCAyNTUgMzExIDMwOSA4MCAyNzEgMTUgMjk3IDEzNiAyNjkgMTAwIDE3NCAyNDkgMTgyIDMwOCAzMDcgODAgMjU2IAorNjkgMjQwIDIwNiAyMDAgMTU2IDEwMiAxOSA1NyAxMjIgOTYgMzAgMyAzOSAxMzQgNDAgMzIgMjMyIDE2MiA3NiAxMjcgMTM4IDk5IDE3IAorNTcgNTIgMTUwIDI4NyAxOCAyODQgMTkwIDIzIDExNiAxMDcgMjM1IDIzNCA3NyAxOTkgNjkgMjI1IDIwNSAxOTggMjI2IDMzIDc1IDQwIAorMjA2IDI4NSAxMDMgMTYxIDMwMyAyNTAgMTAgMjQwIDY2IDI1MyAxNTIgMTg3IDE5NSAxNjkgMzMgNSAzOSAyMDQgNDEgMzQgMjE3IDIzMSAKKzIwIDE5OSAzMTMgMjI0IDIwMyAyMTMgMTAyIDg5IDMgMTI0IDgxIDk5IDI2MSA1NiA1MCAxNjUgMjE4IDc0IDIxMiAxNSAxNTcgMjQ0IAorMjY1IDE4NSAyOTUgNDcgOTMgMjE3IDIgMjgxIDIwMyAyODMgMTAzIDkxIDMwMiAxOTMgMjUgMTE2IDEyMiAyMzYgMjM2IDcgMjY4IDEzIAorMjQyIDEyMSA5IDk4IDE4OSAxMjUgMjM4IDI5MSA3NyAyNjkgMTUgMjI3IDE5MCAyNjcgMTcwIDUwIDMwNSAxNjUgMTMzIDEyNyAxNTMgCis0NSAxOSA0MiAxMjEgOTQgNDUgMjQ4IDk1IDExNyAxNzkgMTY2IDQ2IDYgMjYgMTg4IDUzIDMwNyAxNjUgMTQ4IDEyOCAyMTAgMzAgODggCiszMDAgMTkzIDEwIDE3MCAxMjAgMjUxIDE2NyA2MyAyNTEgOTcgMTE3IDE5NCAxNjcgNDggMjUwIDk1IDEzMiAxMjUgMjIzIDI5MCA3NSAKKzI4NCAyNjAgMjgzIDExOCAzNyA0NSAxNzggOTQgNjAgMTk0IDk3IDQ3IDI0OCAxMTAgNjMgMTgxIDE1MSAxMTUgMjY0IDQzIDEwNCAyMzMgCisyMzQgNyAyNTMgMTIgMjQwIDEzNiAyNTQgMTU0IDExNyAyNjQgMTEzIDUwIDIzNSAxNjQgNzYgMTk3IDg0IDEwMSAyNjEgMTI2IDMxMCAKKzIyMiAyMDMgMTQzIDE1NiAzMiA3MyA1NSAxMzcgMjcgMzEgMjQ1IDEyMyA5IDE2OCAxMzUgMTgyIDIyMyA0NiAyMSAyODYgMjQ1IDM4IAorNjIgMTA5IDIyMCAzMDMgMjEgMjcxIDI0NCAzNiAxMzIgNDAgMjc2IDI4NiAxMDUgOTEgNTggMTk0IDI3IDEwMSAyNDYgMTgwIDMwOCAKKzIzNyA3OSAxOTkgODQgMTcxIDI2MiAxMjggMjk1IDI5MSAxNDcgMjE1IDE3IDIxMiAyNTkgMjE5IF4KKzY1MiAxIDE4NyAyNzggMTEyIDM1IDI4NyAyMjggOTAgMTI2IDEyMSAxNTEgMjYgMTggMjk5IDE4NyAyMSA5NyAxNzQgMTc5IDMwMiAyNTIgCis4IDI1NSA2MyAzMDYgODIgMjU0IDEzNSAyMzcgMjA2IDE4MSAyNzYgNDQgODcgMjgzIDI0NSAxOSAxODIgNTEgMjg4IDIxNSAxNDQgMTQxIAorODYgODQgMTYgNjggNjQgODEgMTAgNjYgMzEyIDEzMyA2IDgzIDI0MSAxODkgMjUyIDIyMCAxMTQgMjY2IDk0IDExOSAxNzcgMjM0IDMwNCAKKzQgNSAzMDggNDYgNjEgMjYgOCAzMTQgNDggODAgMjMgMTIgMjk3IDExOSAyNCA0NCAxOTEgMTA4IDQyIDIzMSAxNDUgMTI4IDE0MCA5OSAKKzMwIDEgNTQgMTMxIDQyIDI3NiAzMDEgMTAyIDE0NCAzNyAyNjEgMjAgMTY5IDEwNSAzMDMgMTgwIDc3IDE4MCAxMzYgMTY1IDI3NSA1NyAKKzMzIDIxOSAyMzEgODYgMTQzIDEgMjA3IDI3MiAxNTUgMTcyIDI2NCAxNzkgNDUgMjM3IDE0NyAxOTYgMTM3IDE1MiAxMyA3MiA0NyAxNTIgCisyNzAgODcgMjI0IDI2MCAxOTYgMjQxIDI5MyA3NyAyODQgMTAgMjI5IDE3MSAyMCAxMTAgMTIwIDE2NCAyODggMyAxOCAyNTQgMjk4IDQ3IAorOTMgMjg1IDMxMyAyODMgMTg2IDM0IDQzIDE1OSAyMTQgNCAyNjIgNyAyMjMgMTIwIDEgMTEzIDExNiAxODEgMjE3IDU5IDI2NCAyNiAKKzE3MSAxNzMgMjUxIDIzMyA2MCAyNTEgODAgMTg2IDEzOCAxODQgMjIzIDYxIDE2IDIzIDE3NSAxMDcgNiAxNzcgODEgMTE0IDIwNyAxMDkgCisyOSAyODUgMTYwIDE0MiA3MyAxMzggODAgODIgMzEzIDEyMCAxMSA5OCAyNTUgMTIyIDI5MSAyMjEgMTQ2IDIwOSA4MyA4OCAzMTUgMTM5IAorOCAxNTEgMTg5IDE5MyAyMzUgMjkxIDU4IDIwIDI3MyAyOTUgNTEgNzYgNDAgMjU3IDM3IDQ5IDE2MSAyMzMgMSAyNjYgMjU3IDI5NCA2NCAKKzIyIDI1IDI0MyAxMDQgNTkgMTExIDIwMSA1OCAyNzcgMjg4IDE1NiAxNTkgMiAxOTQgMTAgMTcwIDE4NiAxOTcgMTY5IDQ2IDIgNDEgCisxODUgMTA2IDI5MCAyMzQgOTIgMTQ1IDY5IDE1NSA5IDEzOCAyNDMgMjA4IDIwMCAyMjQgNDggMjEgMzggMTg5IDQwIDQ1IDE3OCAxNjIgCis1NyAxOTYgNzggMTY3IDE5MCAxODAgMjg5IDMwNiAyMyAyNjkgMzEyIDI5NiAxMzIgMTkgMjkgMjI2IDE3NSAzIDE4MSA2NCAyMzQgMTUxIAorMTMwIDIwOCA5NiAzNCAzMDAgMTc0IDc1IDExMiAxODggMTEyIDI5MiAzMDIgODkgMTk4IDUyIDI3NSAyNjkgMTU5IDE1NSAxOSAxMjMgCis2NiAxNDkgMjc0IDcwIDI5NSAyMDQgMjY2IDE1MyAxMDQgMTI2IDYyIDE2NiAyMDMgMTI2IDIyNSAyNSA5MCAyMzAgMjYyIDI2NCAyMzggCiszMCA2MCAzOSAyNzAgMjk5IDM0IDE0NyAzMDAgMjc4IDIxNiAyMjUgMzUgNzUgNTMgMjAzIDIyIDg0IDIyOCAyNDMgMjY3IDE4NSA0NyAKKzMwNSA5NSAyMDAgNzEgMjIzIDI3MyAxNDIgMjI2IDEyIDE0NCAyOTQgMjc2IDE5NyAyMjggMzEgMTQxIDI5OCAyNTkgMjY4IDE3MiAxMDEgCis0IDEwOSAxMzMgMTEwIDI3MyAzOCAzNiAyMTUgMjk3IDE1IDE5OSAyOTYgMjggMTQ1IDI4MSAxNCAyMTIgMjQyIDI4MCAxMzEgMzIgMjkxIAorMTYyIDE2MSA3MCAxNDIgMTQgMTUzIDI1NyAxNDEgMjM5IDI3NCAxMjkgMjgwIDI3IDE1OCAyMjcgMzE1IDE5OCAzMDkgMjkwIDEzMCAKKzI2NyA4MSAxNzMgMTkyIDI0OCAyMzcgNDMgNiAyNCAyNTYgNTAgNDQgMTQ2IDI2OCA2OCAyMjcgMjU2IDIxMyAxNzAgMzMgNTYgMTA1IAorMTUwIDM5IDEzIDI4NCAxNzMgODggNTggMTI0IDE0NyA0MyAyNjMgMzkgMTE3IDEwOSAyODYgMzAwIDIxIDIwMSA0OCAyOTIgMTQ5IDIxNSAKKzg1IDE1NiAzMTIgMTkyIDMwNyAyMjIgMTMzIDI2MyA5OCAxMDIgMjQ4IDE3OCA5IDE4MyAxMzIgMTgyIDIwNCAxMTMgMjc5IDQwIDEwNCAKKzE2MyAzMDEgMjY1IDI3MCAyNDAgNDkgOCA5MiAyMDQgNTQgMjk0IDIxNyAyMTIgODkgMTM5IDY3IDEzNiAxMiA4NSAzMDkgMTM3IDI1NiAKKzE1NCAxODUgMjEwIDExNSAzMSAzMDQgMTA4IDE0NiA1NiAyMDkgMjQgMTAzIDE3NiAyNDcgMjUwIDMwNSAzMDcgMTAgNyAxMSAzMTAgNjUgCis5IDc5IDI1OCA2OSAzMDggMTUwIDIwMiAxMzkgMTcxIDI3NyAxMjUgMjk3IDI3MiAyMTQgMTU3IDg3IDcxIDcwIDgzIDI5IDE0IDY3IDc3IAorMjcgMzExIDUyIDYzIDk0IDI3MiAyIDMxIDIwMCAyODMgMzMgMTYwIDI0NiAyNjMgMjUxIDI5MiA0NSA3NCAyMSAyNjAgMzMgMTE1IDkwIAorMjg5IDI0NyAzOCAxMzAgNTUgMjIyIDI4NiA4OCAyMTEgMzE0IDIxMSAyNTUgMjI2IDExNiAxOCA0MiAxNzIgMTYwIDMwNSAyNDggMjUgCisxODQgMTE5IDIzNiAyMTkgMTI3IDIxMiAzMCAxNTQgMjQ0IDE5NSAyNTQgMjM5IDYyIDMgMjggMjM5IDEyMSAzMDQgMTY3IDEzMSAxOTUgCisxNTAgOTggMzE0IDEwNyA2NSAxNjIgMjIwIDU1IDI4MSAyNzEgMjI3IDEwMyA3MiA1NyAxMzcgOTMgMjggMzA4IF4KKzY3MCAwIDEwNSA3OCAxMDYgMjA0IDQwIDMxIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjkgNzQgMjc2IDI3NSAyMDggMTc0IDE0IDEyNiAKKzQ3IDIxOSAyMTggMTM4IDE1OCAxNCAxMzkgMzEwIDIwMyAyNTEgMjA1IDE2NiAxMSA1OSA1MiAyMTQgMjgyIDIwIDIxNCAzMDggMjc1IAorMTgyIDI4MiA0NiAxMDYgMjMwIDI0OSAzMTYgMjUyIDMxMSAzMDkgNzcgMjcxIDE1IDI5MSAxMzYgMjY5IDEwMCAxNjggMjQzIDE4MiAKKzMwOCAzMDEgNzQgMjUwIDY2IDI0MCAyMDAgMTk3IDE1NiA5OSAxNiA1NCAxMTYgOTYgMjEgMzE0IDMzIDEzNCAzNyAyMyAyMjkgMTU2IAorNzMgMTI0IDEzMiA5NiA4IDUxIDQ5IDE0NyAyODcgMTUgMjc4IDE5MCAxNCAxMTMgMTAxIDIzNSAyMzEgNzEgMTk2IDYzIDIxOSAyMDUgCisxOTIgMjIwIDI3IDcyIDMxIDIwNiAyODUgMTAwIDE1NSAyOTcgMjQ0IDQgMjM0IDY2IDI1MyAxNDYgMTgxIDE4OSAxNjYgMjQgNSAzNiAKKzIwMSAzMiAyOCAyMTEgMjI4IDE3IDE5MyAzMTMgMjI0IDIwMCAyMTAgMTAyIDgzIDMgMTIxIDc4IDkzIDI1OCA1NiA0NCAxNjUgMjE1IAorNzEgMjA5IDkgMTU3IDIzOCAyNTkgMTgyIDI5NSAzOCA5MCAyMTcgMzE2IDI3OCAyMDMgMjc3IDk3IDg4IDMwMiAxOTMgMjIgMTE2IDEyMiAKKzIzMCAyMzYgNyAyNjggNyAyNDIgMTE1IDMgOTUgMTg2IDEyNSAyMzggMjg1IDc0IDI2MyAxMiAyMjQgMTg3IDI2NCAxNjQgNTAgMjk5IAorMTU5IDEyNyAxMjcgMTUzIDQ1IDEzIDMzIDEyMSA5MSAzOSAyNDIgODkgMTExIDE3MyAxNjYgMzcgMzE0IDIwIDE4OCA1MyAzMDcgMTYyIAorMTQ4IDEyMiAyMDQgMjcgODUgMjk0IDE5MCAxIDE2NyAxMTcgMjQ4IDE2NCA2MyAyNDUgOTcgMTE0IDE5NCAxNjEgNDIgMjUwIDkyIDEzMiAKKzEyMiAyMTcgMjkwIDY5IDI4MSAyNTcgMjgwIDExOCAzNyAzNiAxNzUgOTQgNjAgMTkxIDk0IDQ3IDI0NSAxMTAgNjAgMTc4IDE0OCAxMDkgCisyNTggNDMgOTggMjI3IDIyOCA0IDI0NyAxMiAyMzcgMTMzIDI0OCAxNTEgMTE3IDI2MSAxMTAgNDcgMjMyIDE2NCA3NiAxOTEgODEgMTAxIAorMjYxIDEyMyAzMTAgMjE2IDE5NyAxNDMgMTUzIDMyIDY3IDQ5IDEzNCAyNCAzMSAyNDUgMTIzIDYgMTYyIDEzNSAxNzYgMjIwIDQwIDE4IAorMjg2IDIzOSAzNSA2MiAxMDYgMjE3IDMwMyAxNSAyNjUgMjQ0IDMwIDEyNiAzNCAyNzMgMjgwIDEwNSA5MSA1MiAxODggMjcgOTggMjQwIAorMTc0IDMwNSAyMzQgNzkgMTk5IDg0IDE2OCAyNTYgMTI4IDI5MiAyODggMTQxIDIxMiAxNyAyMDYgMjU5IDIwOCAxODcgMjc3IDExMCAzNCAKKzI4NiAyMjYgODkgMTI0IDExOSAxNTAgMjQgMTggMjk5IDE4NSAxOSA5NSAxNzMgMTc5IDMwMCAyNTIgNyAyNTUgNjEgMzA0IDgyIDI1MyAKKzEzMyAyMzUgMjA1IDE3OSAyNzQgNDMgODUgMjgxIDI0NCAxNyAxODAgNTAgMjg2IDIxMyAxNDMgMTQwIDg2IDgzIDE2IDY3IDYyIDgwIDggCis2NCAzMTIgMTMxIDMgODIgMjQwIDE4NyAyNTEgMjE4IDExMiAyNjYgOTIgMTE5IDE3NiAyMzMgMzAzIDIgMiAzMDYgNDMgNTkgMjYgNSAKKzMxNCA0NiA4MCAyMSAxMCAyOTYgMTE4IDI0IDQ0IDE5MSAxMDcgMzkgMjI5IDE0MyAxMjcgMTQwIDk5IDI5IDU0IDEyOSA0MiAyNzYgCiszMDEgMTAwIDE0MiAzNCAyNjAgMTcgMTY3IDEwNCAzMDIgMTgwIDc2IDE3OCAxMzUgMTYzIDI3NCA1NiAzMSAyMTkgMjMxIDg0IDE0MiAxIAorMjA2IDI3MiAxNTQgMTcxIDI2NCAxNzcgNDIgMjM3IDE0NiAxOTQgMTM1IDE1MCAxMSA3MiA0NCAxNTIgMjY5IDg3IDIyMiAyNTkgMTk1IAorMjQxIDI5MyA3NyAyODQgNyAyMjkgMTY5IDE5IDEwOCAxMTkgMTYzIDI4NyAyIDE1IDI1MiAyOTggNDYgOTMgMjg0IDMxMSAyODMgMTg1IAorMzIgNDEgMTU3IDIxMiA0IDI2MCA0IDIyMSAxMjAgMzE1IDExMyAxMTQgMTgxIDIxNSA1OCAyNjMgMjUgMTcwIDE3MSAyNTEgMjMxIDU4IAorMjUwIDc5IDE4NiAxMzggMTg0IDIyMyA2MSAxMyAyMCAxNzUgMTA3IDYgMTc1IDgxIDExNCAyMDcgMTA3IDI2IDI4MyAxNTkgMTQwIDczIAorMTM3IDc4IDgwIDMxMiAxMTggMTEgOTggMjUzIDEyMCAyODkgMjIxIDE0NiAyMDcgODEgODggMzE1IDEzOSA2IDE0OSAxODkgMTkyIDIzMyAKKzI5MCA1NiAxOCAyNzMgMjkzIDUxIDc1IDM5IDI1NSAzNSA0OSAxNjAgMjMzIDMxNiAyNjUgMjU3IDI5MyA2NCAyMSAyMyAyNDIgMTAyIAorNTcgMTExIDE5OSA1OCAyNzYgMjg4IDE1NCAxNTggMSAxOTMgOSAxNzAgMTg0IDE5NyAxNjkgNDUgNDEgMTgzIDEwNCAyODkgMjM0IDkyIAorMTQ1IDY4IDE1NSA2IDEzNiAyNDMgMjA4IDIwMCAyMjMgNDggMjEgMzYgMTg4IDQwIDQ0IDE3OCAxNjEgNTUgMTk2IDc2IDE2NSAxODkgCisxNzkgMjg3IDMwNiAyMyAyNjggMzExIDI5NiAxMzEgMTYgMjggMjI0IDE3NCAxIDE4MCA2MyAyMzIgMTUxIDEzMCAyMDcgOTQgMzQgMjk5IAorMTcyIDczIDExMSAxODYgMTEyIDI5MiAzMDEgODcgMTk2IDUwIDI3MyAyNjcgMTU5IDE1MyAyMzUgXgorNjU4IDEgMTE3IDYzIDE0MyAyNzQgNjcgMjkyIDIwMSAyNjAgMTQ3IDEwNCAzMTMgMTI2IDU2IDE2MyAyMDAgMTIzIDIyNSAxNiA5MCAKKzIzMCAyNjIgMjU4IDIzMiAyMSA1NyAzOSAyNjQgMjk2IDMxIDE0NyAzMDAgMjc4IDIxNiAyMTkgMzUgNzUgNTAgMTk3IDEzIDc4IDIyNSAKKzIzNyAyNjcgMTg1IDQxIDMwMiA5NSAxOTcgNzEgMjIwIDI3MCAxMzkgMjIzIDMgMTQ0IDI4OCAyNzMgMTkxIDIyOCAyOCAxMzUgMjk1IAorMjUzIDI2NSAxNzIgOTUgMSAxMDYgMTMwIDEwNyAyNjcgMjkgMzYgMjEyIDI5MSA2IDE5NiAyOTMgMTkgMTQyIDI3NSA4IDIwOSAyMzkgCisyODAgMTMxIDIzIDI5MSAxNjIgMTYxIDY0IDE0MiAxNCAxNTAgMjU0IDE0MSAyMzYgMjY4IDEyNiAyNzcgMjEgMTU1IDIyMSAzMDkgMTk4IAorMzA2IDI4NCAxMjQgMjY0IDc1IDE3MyAxOTIgMjQyIDIzNCAzNCAzIDIxIDI1MyA0NCAzNSAxNDAgMjYyIDYyIDIyNyAyNTAgMjEzIDE2NyAKKzMwIDUwIDk5IDE1MCAzMyA0IDI4MSAxNzAgODIgNTUgMTI0IDE0MSA0MCAyNjMgMzYgMTE0IDEwOSAyODAgMjk0IDE4IDIwMSAzOSAyODkgCisxNDkgMjE1IDgyIDE1MyAzMDYgMTg2IDMwMSAyMTkgMTMzIDI1NyA5NSA5OSAyNDggMTc1IDkgMTgzIDEyNiAxNzkgMTk4IDExMCAyNzkgCiszNCAxMDEgMTYzIDI5OCAyNjUgMjcwIDIzNyA0NiA4IDg2IDIwNCA1MSAyOTQgMjE0IDIwNiA4OSAxMzMgNjEgMTMwIDkgODUgMzAzIAorMTM0IDI1NiAxNTQgMTgyIDIxMCAxMTUgMjUgMzA0IDEwOCAxNDMgNTMgMjA5IDE4IDEwMyAxNzYgMjQ0IDI0NyAyOTkgMzA0IDEwIDEgOCAKKzMwNyA2MiA2IDczIDI1OCA2OSAzMDUgMTQ3IDIwMiAxMzYgMTcxIDI3NyAxMTkgMjk3IDI2NiAyMTEgMTU0IDg0IDY4IDcwIDgzIDI5IAorMTEgNjcgNzEgMjQgMzA1IDQ5IDYwIDkxIDI2OSAyIDIyIDE5NCAyODAgMzMgMTYwIDI0NiAyNjAgMjQ1IDI4NiAzOSA2OCAxMiAyNjAgCisyNCAxMDkgODQgMjg5IDI0NyAzOCAxMjcgNTUgMjIyIDI4MyA4NSAyMDUgMzExIDIxMSAyNTIgMjI2IDExMyAxMiAzOSAxNjYgMTU0IAorMzA1IDI0NSAyNSAxODEgMTEzIDIzMyAyMTYgMTIxIDIxMiAzMCAxNDggMjQxIDE5NSAyNTQgMjM5IDU5IDMxMyAyOCAyMzMgMTE4IDI5OCAKKzE2NyAxMjggMTkyIDE0NCA5MiAzMDggMTAxIDY1IDE1NiAyMjAgNDkgMjgxIDI2OCAyMjQgMTAwIDY2IDU3IDEzNyA4NyAyMiAyOTIgCisxMDMgNzggMTAyIDIwMiAzOCAyOSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjY1IDc0IDI3MiAyNzUgMjA0IDE3NCAxMCAxMjQgNDMgMjE3IAorMjE4IDEzNCAxNTggMTIgMTM3IDMwOCAxOTkgMjQ3IDIwMSAxNjIgNSA1OSA1MiAyMTAgMjc4IDIwIDIxNCAzMDQgMjcxIDE3OCAyODIgCis0NiAxMDYgMjI4IDI0OSAzMTIgMjUwIDMxMSAzMDkgNzUgMjcxIDE1IDI4NyAxMzYgMjY5IDEwMCAxNjQgMjM5IDE4MiAzMDggMjk3IDcwIAorMjQ2IDY0IDI0MCAxOTYgMTk1IDE1NiA5NyAxNCA1MiAxMTIgOTYgMTUgMzEyIDI5IDEzNCAzNSAxNyAyMjcgMTUyIDcxIDEyMiAxMjggCis5NCAyIDQ3IDQ3IDE0NSAyODcgMTMgMjc0IDE5MCA4IDExMSA5NyAyMzUgMjI5IDY3IDE5NCA1OSAyMTUgMjA1IDE4OCAyMTYgMjMgNzAgCisyNSAyMDYgMjg1IDk4IDE1MSAyOTMgMjQwIDIzMCA2NiAyNTMgMTQyIDE3NyAxODUgMTY0IDE4IDUgMzQgMTk5IDI2IDI0IDIwNyAyMjYgCisxNSAxODkgMzEzIDIyNCAxOTggMjA4IDEwMiA3OSAzIDExOSA3NiA4OSAyNTYgNTYgNDAgMTY1IDIxMyA2OSAyMDcgNSAxNTcgMjM0IAorMjU1IDE4MCAyOTUgMzIgODggMjE3IDMxNiAyNzYgMjAzIDI3MyA5MyA4NiAzMDIgMTkzIDIwIDExNiAxMjIgMjI2IDIzNiA3IDI2OCAzIAorMjQyIDExMSAzMTggOTMgMTg0IDEyNSAyMzggMjgxIDcyIDI1OSAxMCAyMjIgMTg1IDI2MiAxNjAgNTAgMjk1IDE1NSAxMjMgMTI3IDE1MyAKKzQ1IDkgMjcgMTIxIDg5IDM1IDIzOCA4NSAxMDcgMTY5IDE2NiAzMSAzMTAgMTYgMTg4IDUzIDMwNyAxNjAgMTQ4IDExOCAyMDAgMjUgODMgCisyOTAgMTg4IDMxNCAxNjUgMTE1IDI0NiAxNjIgNjMgMjQxIDk3IDExMiAxOTQgMTU3IDM4IDI1MCA5MCAxMzIgMTIwIDIxMyAyOTAgNjUgCisyNzkgMjU1IDI3OCAxMTggMzcgMzAgMTczIDk0IDYwIDE4OSA5MiA0NyAyNDMgMTEwIDU4IDE3NiAxNDYgMTA1IDI1NCA0MyA5NCAyMjMgCisyMjQgMiAyNDMgMTIgMjM1IDEzMSAyNDQgMTQ5IDExNyAyNTkgMTA4IDQ1IDIzMCAxNjQgNzYgMTg3IDc5IDEwMSAyNjEgMTIxIDMxMCAKKzIxMiAxOTMgMTQzIDE1MSAzMiA2MyA0NSAxMzIgMjIgMzEgMjQ1IDEyMyA0IDE1OCAxMzUgMTcyIDIxOCAzNiAxNiAyODYgMjM1IDMzIAorNjIgMTA0IDIxNSAzMDMgMTEgMjYxIDI0NCAyNiAxMjIgMzAgMjcxIDI3NiAxMDUgOTEgNDggMTg0IDI3IDk2IDIzNiAxNzAgMzAzIDIzMiAKKzc5IDE5OSA4NCAxNjYgMjUyIDEyOCAyOTAgMjgzIF4KKzY0OSAxIDEzMyAyMDggMTcgMTk4IDI1OSAyMDQgMTg3IDI3MyAxMDIgMzAgMjgyIDIxOCA4NSAxMTYgMTExIDE0NiAxNiAxOCAyOTkgCisxNzcgMTEgODcgMTY5IDE3OSAyOTIgMjUyIDMgMjU1IDUzIDI5NiA4MiAyNDkgMTI1IDIyNyAyMDEgMTcxIDI2NiAzOSA3NyAyNzMgMjQwIAorOSAxNzIgNDYgMjc4IDIwNSAxMzkgMTM2IDg2IDc5IDE2IDYzIDU0IDc2IDU2IDMxMiAxMjMgMzEyIDc4IDIzNiAxNzkgMjQ3IDIxMCAKKzEwNCAyNjYgODQgMTE5IDE3MiAyMjkgMjk5IDMxNSAzMTEgMjk4IDMxIDUxIDI2IDMxNCAzMTQgMzggODAgMTMgMiAyOTIgMTE0IDI0IAorNDQgMTkxIDEwMyAyNyAyMjEgMTM1IDEyMyAxNDAgOTkgMjUgMzE3IDU0IDEyMSA0MiAyNzYgMzAxIDkyIDEzNCAyMiAyNTYgNSAxNTkgCisxMDAgMjk4IDE4MCA3MiAxNzAgMTMxIDE1NSAyNzAgNTIgMjMgMjE5IDIzMSA3NiAxMzggMSAyMDIgMjcyIDE1MCAxNjcgMjY0IDE2OSAKKzMwIDIzNyAxNDIgMTg2IDEyNyAxNDIgMyA3MiAzMiAxNTIgMjY1IDg3IDIxNCAyNTUgMTkxIDI0MSAyOTMgNzcgMjg0IDMxNiAyMjkgCisxNjEgMTUgMTAwIDExNSAxNTkgMjgzIDMxOSAzIDI0NCAyOTggNDIgOTMgMjgwIDMwMyAyODMgMTgxIDI0IDMzIDE0OSAyMDQgNCAyNTIgCiszMTMgMjEzIDEyMCAzMDcgMTEzIDEwNiAxODEgMjA3IDU0IDI1OSAyMSAxNjYgMTYzIDI1MSAyMjMgNTAgMjQ2IDc1IDE4NiAxMzggMTg0IAorMjIzIDYxIDEgOCAxNzUgMTA3IDYgMTY3IDgxIDExNCAyMDcgOTkgMTQgMjc1IDE1NSAxMzIgNzMgMTMzIDcwIDcyIDMwOCAxMTAgMTEgCis5OCAyNDUgMTEyIDI4MSAyMjEgMTQ2IDE5OSA3MyA4OCAzMTUgMTM5IDMxOSAxNDEgMTg5IDE4OCAyMjUgMjg2IDQ4IDEwIDI3MyAyODUgCis1MSA3MSAzNSAyNDcgMjcgNDkgMTU2IDIzMyAzMTIgMjYxIDI1NyAyODkgNjQgMTcgMTUgMjM4IDk0IDQ5IDExMSAxOTEgNTggMjcyIAorMjg4IDE0NiAxNTQgMzE4IDE4OSA1IDE3MCAxNzYgMTk3IDE2OSA0MSAzMTMgNDEgMTc1IDk2IDI4NSAyMzQgOTIgMTQ1IDY0IDE1NSAKKzMxNSAxMjggMjQzIDIwOCAyMDAgMjE5IDQ4IDIxIDI4IDE4NCA0MCA0MCAxNzggMTU3IDQ3IDE5NiA2OCAxNTcgMTg1IDE3NSAyNzkgCiszMDYgMjMgMjY0IDMwNyAyOTYgMTI3IDQgMjQgMjE2IDE3MCAzMTQgMTc2IDU5IDIyNCAxNTEgMTMwIDIwMyA4NiAzNCAyOTUgMTY0IDY1IAorMTA3IDE3OCAxMTIgMjkyIDI5NyA3OSAxODggNDIgMjY1IDI1OSAxNTkgMTQ1IDE5IDExMyA2MSAxMzkgMjc0IDY1IDI5MCAxOTkgMjU2IAorMTQzIDEwNCAzMTEgMTI2IDUyIDE2MSAxOTggMTIxIDIyNSAxMCA5MCAyMzAgMjYyIDI1NCAyMjggMTUgNTUgMzkgMjYwIDI5NCAyOSAKKzE0NyAzMDAgMjc4IDIxNiAyMTUgMzUgNzUgNDggMTkzIDcgNzQgMjIzIDIzMyAyNjcgMTg1IDM3IDMwMCA5NSAxOTUgNzEgMjE4IDI2OCAKKzEzNyAyMjEgMzE4IDE0NCAyODQgMjcxIDE4NyAyMjggMjYgMTMxIDI5MyAyNDkgMjYzIDE3MiA5MSAzMjAgMTA0IDEyOCAxMDUgMjYzIAorMjMgMzYgMjEwIDI4NyAxOTQgMjkxIDEzIDE0MCAyNzEgNCAyMDcgMjM3IDI4MCAxMzEgMTcgMjkxIDE2MiAxNjEgNjAgMTQyIDE0IDE0OCAKKzI1MiAxNDEgMjM0IDI2NCAxMjQgMjc1IDE3IDE1MyAyMTcgMzA1IDE5OCAzMDQgMjgwIDEyMCAyNjIgNzEgMTczIDE5MiAyMzggMjMyIAorMjggMSAxOSAyNTEgNDAgMjkgMTM2IDI1OCA1OCAyMjcgMjQ2IDIxMyAxNjUgMjggNDYgOTUgMTUwIDI5IDMxOSAyNzkgMTY4IDc4IDUzIAorMTI0IDEzNyAzOCAyNjMgMzQgMTEyIDEwOSAyNzYgMjkwIDE2IDIwMSAzMyAyODcgMTQ5IDIxNSA4MCAxNTEgMzAyIDE4MiAyOTcgMjE3IAorMTMzIDI1MyA5MyA5NyAyNDggMTczIDkgMTgzIDEyMiAxNzcgMTk0IDEwOCAyNzkgMzAgOTkgMTYzIDI5NiAyNjUgMjcwIDIzNSA0NCA4IAorODIgMjA0IDQ5IDI5NCAyMTIgMjAyIDg5IDEyOSA1NyAxMjYgNyA4NSAyOTkgMTMyIDI1NiAxNTQgMTgwIDIxMCAxMTUgMjEgMzA0IDEwOCAKKzE0MSA1MSAyMDkgMTQgMTAzIDE3NiAyNDIgMjQ1IDI5NSAzMDIgMTAgMzE4IDYgMzA1IDYwIDQgNjkgMjU4IDY5IDMwMyAxNDUgMjAyIAorMTM0IDE3MSAyNzcgMTE1IDI5NyAyNjIgMjA5IDE1MiA4MiA2NiA3MCA4MyAyOSA5IDY3IDY3IDIyIDMwMSA0NyA1OCA4OSAyNjcgMiAxNiAKKzE5MCAyNzggMzMgMTYwIDI0NiAyNTggMjQxIDI4MiAzNSA2NCA2IDI2MCAxOCAxMDUgODAgMjg5IDI0NyAzOCAxMjUgNTUgMjIyIDI4MSAKKzgzIDIwMSAzMDkgMjExIDI1MCAyMjYgMTExIDggMzcgMTYyIDE1MCAzMDUgMjQzIDI1IDE3OSAxMDkgMjMxIDIxNCAxMTcgMjEyIDMwIAorMTQ0IDIzOSAxOTUgMjU0IDIzOSA1NyAzMDkgMjggMjI5IDExNiAyOTQgMTY3IDEyNiAxOTAgMTQwIDg4IDMwNCA5NyA2NSAxNTIgMjIwIAorNDUgMjgxIDE3OCBeCis8RAorCitIPlNIUyBUeXBlIDMgU3RyaW5nczxICitEPgorNDAgMSAxOCAyMCAxMSAxNSAxMSAxMSA5IDYgMiAxNSA1IDE3IDEyIDEgOSAxIDMgNSAxMSA3IDIgMiA2IDE4IDIgOSAxMSA4IDE2IDExIAorMTYgMTUgMTggMTggMyAyMCAyIDE3IDE3IDE2IF4KKzxECisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zaGEtMS9ieXRlLWhhc2hlcy5zaGExIGIvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzM2MyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zaGEtMS9ieXRlLWhhc2hlcy5zaGExCkBAIC0wLDAgKzEsMzQzIEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQllURSBvcmllbnRlZCBpbXBsZW1lbnRhdGlvbnMKK0g+U0hTIFR5cGUgMSBIYXNoZXM8SAorRD4KK0RBMzlBM0VFNUU2QjRCMEQzMjU1QkZFRjk1NjAxODkwQUZEODA3MDkgXgorM0NERjI5MzZEQTJGQzU1NkJGQTUzM0FCMUVCNTlDRTcxMEFDODBFNSBeCisxOUMxRTIwNDhGQTczOTNDRkJGMkQzMTBBRDgyMDlFQzExRDk5NkU1IF4KK0NBNzc1RDhDODBGQUE2Rjg3RkE2MkJFQ0E2Q0E2MDg5RDYzQjU2RTUgXgorNzFBQzk3M0QwRTRCNTBBRTlFNTA0M0ZGNEQ2MTUzODExMjBBMjVBMCBeCitBNkI1QjlGODU0Q0ZCNzY3MDFDM0JEREJGMzc0QjMwOTRFQTQ5Q0JBIF4KK0Q4N0EwRUU3NEU0QjlBRDcyRTY4NDdDODdCREVFQjNEMDc4NDQzODAgXgorMTk3NkI4REQ1MDlGRTY2QkYwOUM5QThEMzM1MzRENEVGNEY2M0JGRCBeCis1QTc4RjQzOUI2REI4NDVCQjhBNTU4RTRDRUIxMDZDRDdCN0ZGNzgzIF4KK0Y4NzFCQ0U2MjQzNkMxRTI4MDM1NzQxNjY5NUVFMkVGOUI4MzY5NUMgXgorNjJCMjQzRDFCNzgwRTFEMzFDRjFCQTJERTNGMDFDNzJBRUVBMEU0NyBeCisxNjk4OTk0QTI3MzQwNDg0OEU1NkU3RkRBNDQ1N0I1OTAwREUxMzQyIF4KKzA1NkY0Q0RDMDI3OTFEQTdFRDFFQjIzMDMzMTRGNzY2NzUxOERFRUYgXgorOUZFMkRBOTY3QkQ4NDQxRUVBMUMzMkRGNjhEREFBOURDMUZDOEU0QiBeCis3M0EzMTc3N0I0QUNFOTM4NEVGQThCQkVBRDQ1QzUxQTcxQUJBNkREIF4KKzNGOUQ3QzRFMjM4NEVEREFCRkY1REQ4QTMxRTIzREUzRDAzRjQyQUMgXgorNDgxNDkwOEY3MkI5M0ZGRDAxMTEzNUJFRTM0N0RFOUEwOERBODM4RiBeCiswOTc4Mzc0QjY3QTQxMkEzMTAyQzVBQTBCMTBFMUE2NTk2RkM2OEVCIF4KKzQ0QUQ2Q0I2MThCRDkzNTQ2MEQ0NkQzRjkyMUQ4N0I5OUFCOTFDMUUgXgorMDJEQzk4OUFGMjY1QjA5Q0Y4NDg1NjQwODQyMTI4RENGOTVFOUYzOSBeCis2NzUwN0I4RDQ5N0IzNUQ2RTk5RkMwMTk3NkQ3M0Y1NEFFQ0E3NUNGIF4KKzFFQUUwMzczQzEzMTdDQjYwQzM2QTQyQTg2N0I3MTYwMzlENDQxRjUgXgorOUMzODM0NTg5RTVCRkZBQzlGNTA5NTBFMDE5OUIzRUMyNjIwQkVDOCBeCisyMDlGN0FCQzdGM0I4NzhFRTQ2Q0RGM0ExRkJCOUMyMUMzNDc0RjMyIF4KKzA1RkMwNTRCMDBEOTc3NTNBOUIzRTJEQThGQkJBM0VFODA4Q0VGMjIgXgorMEM0OTgwRUEzQTQ2Qzc1N0RGQkZDNUJBQTM4QUM2QzhFNzJERENFNyBeCis5NkE0NjBEMjk3MkQyNzY5MjhCNjk4NjQ0NDVCRUEzNTNCRENGRkQyIF4KK0YzRUYwNEQ4RkE4QzZGQTk4NTBGMzk0QTQ1NTRDMDgwOTU2RkE2NEIgXgorRjJBMzFEODc1RDFEN0IzMDg3NEQ0MTZDNEQyRUE2QkFGMEZGQkFGRSBeCitGNDk0MkQzQjlFOTU4OERDRkRDNjMxMkE4NERGNzVEMDVGMTExQzIwIF4KKzMxMDIwN0RGMzVCMDE0RTQ2NzZEMzA4MDZGQTM0NDI0ODEzNzM0REQgXgorNERBMTk1NUIyRkE3QzdFNzRFM0Y0N0Q3MzYwQ0U1MzBCQkY1N0NBMyBeCis3NEM0QkM1QjI2RkI0QTA4NjAyRDQwQ0NFQzZDNjE2MUI2QzExNDc4IF4KKzBCMTAzQ0UyOTczMzhERkM3Mzk1Rjc3MTVFRTQ3NTM5QjU1NkREQjYgXgorRUZDNzJEOTlFM0QyMzExQ0UxNDE5MEMwQjcyNkJEQzY4RjRCMDgyMSBeCis2NjBFREFDMEE4RjRDRTMzREEwRDhEQkFFNTk3NjUwRTk3Njg3MjUwIF4KK0ZFMEE1NUE5ODhCM0I5Mzk0NkE2M0VCMzZCMjM3ODVBNUU2RUZDM0UgXgorMENCREYyQTU3ODFDNTlGOTA3NTEzMTQ3QTBERTNDQzc3NEI1NEJGMyBeCis2NjNFNDBGRUU1QTQ0QkZDQjFDOTlFQTU5MzVBNkI1QkM5RjU4M0IwIF4KKzAwMTYyMTM0MjU2OTUyREQ5QUU2QjUxRUZCMTU5QjM1QzNDMTM4QzcgXgorQ0VCODhFNDczNkUzNTQ0MTZFMjAxMEZDMTA2MUIzQjUzQjgxNjY0QiBeCitBNkEyQzRCNkJDQzQxRERDNjcyNzhGM0RGNEQ4RDBCOURENzc4NEVGIF4KK0MyM0QwODNDRDg4MjBCNTc4MDBBODY5RjVGMjYxRDQ1RTAyREM1NUQgXgorRThBQzMxOTI3Qjc4RERFQzQxQTMxQ0E3QTQ0RUI3MTc3MTY1RTdBQiBeCitFODY0RUM1REJBQjBGOUZGNjk4NEFCNkFENDNBOEM5QjgxQ0M5RjlDIF4KK0NGRUQ2MjY5MDY5NDE3QTg0RDZERTIzNDcyMjBGNEI4NThCQ0Q1MzAgXgorRDkyMTdCRkI0NkM5NjM0ODcyMkMzNzgzRDI5RDRCMUEzRkVEQTM4QyBeCitERUMyNEU1NTU0Rjc5Njk3MjE4RDMxNzMxNUZBOTg2MjI5Q0UzMzUwIF4KKzgzQTA5OURGNzA3MTQzN0JBNTQ5NUE1QjBCRkJGRUZFMUMwRUY3RjMgXgorQUEzMTk4RTMwODkxQTgzRTMzQ0UzQkZBMDU4N0Q4NkExOTdENEY4MCBeCis5QjZBQ0JFQjQ5ODlDQkVFNzAxNUM3RDUxNUE3NTY3MkZGREUzNDQyIF4KK0IwMjFFQjA4QTQzNkIwMjY1OEVBQTdCQTNDODhENDlGMTIxOUMwMzUgXgorQ0FFMzZEQUI4QUVBMjlGNjJFMDg1NUQ5Q0IzQ0Q4RTdEMzkwOTRCMSBeCiswMkRFOEJBNjk5RjNDMUIwQ0I1QUQ4OUEwMUYyMzQ2RTYzMDQ1OUQ3IF4KKzg4MDIxNDU4ODQ3REQzOUI0NDk1MzY4RjcyNTQ5NDE4NTlGQUQ0NEIgXgorOTFBMTY1Mjk1QzY2NkZFODVDMkFEQkM1QTEwMzI5REFGMENCODFBMCBeCis0QjMxMzEyRUFGOEI1MDY4MTExNTFBOURCRDE2Mjk2MUY3NTQ4QzRCIF4KKzNGRTcwOTcxQjIwNTU4RjdFOUJBQzMwM0VEMkJDMTRCREU2NTlBNjIgXgorOTNGQjc2OUQ1QkY0OUQ2QzU2MzY4NTk1NEUyQUVDQzAyNERDMDJENiBeCitCQzg4MjdDM0U2MTRENTE1RTgzREVBNTAzOTg5REVBNEZEQTZFQTEzIF4KK0U4Mzg2OERCRTRBMzg5QUI0OEU2MUNGQzRFRDg5NEYzMkFFMTEyQUMgXgorNTVDOTU0NTlDREU0QjMzNzkxQjRCMkJDQUFGODQwOTMwQUYzRjNCRCBeCiszNkJCMEUyQkE0MzhBM0UwMzIxNEQ5RUQyQjI4QTRENUM1NzhGQ0FBIF4KKzNBQ0JGODc0MTk5NzYzRUJBMjBGMzc4OURGQzU5NTcyQUNBNENGMzMgXgorODZCRTAzN0M0RDUwOUM5MjAyMDIwNzY3RDg2MERBQjAzOUNBREFDRSBeCis1MUI1N0Q3MDgwQTg3Mzk0RUVDM0VCMkUwQjI0MkU1NTNGMjgyN0M5IF4KKzFFRkJGQTc4ODY2MzE1Q0U2QTcxRTQ1N0YzQTc1MEEzOEZBQ0FCNDEgXgorNTdENkNCNDFBRUVDMjAyMzZGMzY1QjNBNDkwQzYxRDBDRkEzOTYxMSBeCitDNTMyQ0I2NEI0QkE4MjYzNzJCQ0NGMkI0QjU3OTNENUI4OEJCNzE1IF4KKzE1ODMzQjU2MzEwMzI2NjNFNzgzNjg2QTIwOUM2QTJCNDdBMTA4MEUgXgorRDA0RjIwNDNDOTZFMTBDRDgzQjU3NEIxRTFDMjE3MDUyQ0Q0QTZCMiBeCitFODg4MjYyN0M2NERCNzQzRjdEQjhCNDQxM0REMDMzRkM2M0JFQjIwIF4KK0NEMkQzMjI4NkI4ODY3QkMxMjRBMEFGMjIzNkZDNzRCRTM2MjIxOTkgXgorMDE5QjcwRDc0NTM3NTA5MUVENUM3QjIxODQ0NUVDOTg2RDBGNUE4MiBeCitFNUZGNUZFQzFEQURCQUVEMDJCRjJEQUQ0MDI2QkU2QTk2QjNGMkFGIF4KKzZGNEUyM0IzRjJFMkMwNjhEMTM5MjFGRTRFNUUwNTNGRkVENEUxNDYgXgorMjVFMTc5NjAyQTU3NUM5MTUwNjc1NjZGQkE2REE5MzBFOTdGODY3OCBeCis2N0RFRDBFNjhFMjM1QzhBNTIzRTA1MUU4NjEwOEVFQjc1N0VGQkZEIF4KK0FGNzg1MzZFQTgzQzgyMjc5Njc0NTU1NkQ2MkEzRUU4MkM3QkUwOTggXgorNjREN0FDNTJFNDc4MzRCRTcyNDU1RjZDNjQzMjVGOUMzNThCNjEwRCBeCis5RDQ4NjZCQUEzNjM5QzEzRTU0MUYyNTBGRkEzRDhCQzE1N0E0OTFGIF4KKzJFMjU4ODExOTYxRDNFQjg3NkYzMEU3MDE5MjQxQTAxRjk1MTdCRUMgXgorOEUwRUJDNDg3MTQ2RjgzQkM5MDc3QTE2MzBFMEZCM0FCM0M4OUU2MyBeCitDRTg5NTM3NDFGRkYzNDI1RDIzMTFGQkJGNEFCNDgxQjY2OURFRjcwIF4KKzc4OUQxRDJEQUI1MjA4NkJEOTBDMEUxMzdFMjUxNUVEOUM2QjU5QjUgXgorQjc2Q0U3NDcyNzAwREQ2OEQ2MzI4QjdBQTg0MzdGQjA1MUQxNTc0NSBeCitGMjE4NjY5QjU5NkM1RkZCMEIxQzE0QkQwM0M0NjdGQzg3MzIzMEEwIF4KKzFGRjNCREJFMEQ1MDRDQjBDREZBQjE3RTZDMzdBQkE2QjNDRkZERUQgXgorMkYzQ0JBQ0JCMTQ0MDVBNDY1MkVENTI3OTNDMTgxNEZEOEM0RkNFMCBeCis5ODJDOEFCNkNFMTY0RjQ4MTkxNUFGNTlBQUVEOUZGRjJBMzkxNzUyIF4KKzVDRDkyMDEyRDQ4OEEwN0VDRTBFNDc5MDFEMEUwODNCNkJEOTNFM0YgXgorNjk2MDNGRUMwMjkyMDg1MUQ0QjNCODc4MkUwN0I5MkJCMjk2MzAwOSBeCiszRTkwRjc2NDM3QjFFQTQ0Q0Y5OEEwOEQ4M0VBMjRDRUNGNkU2MTkxIF4KKzM0QzA5RjEwN0M0MkQ5OTBFQjQ4ODFENEJGMkRERENBQjAxNTYzQUUgXgorNDc0QkUwRTU4OTJFQjIzODIxMDlCRkM1RTNDODI0OUE5MjgzQjAzRCBeCitBMDRCNEY3NTA1MTc4NjY4MjQ4MzI1MjQzOEY2QTc1QkY0NzA1RUM2IF4KK0JFODhBNjcxNjA4M0VCNTBFRDk0MTY3MTlENkEyNDc2NjEyOTkzODMgXgorQzY3RTM4NzE3RkVFMUE1RjY1RUM2QzdDN0M0MkFGQzAwQ0QzN0YwNCBeCis5NTlBQzQwODIzODhFMTlFOUJFNURFNTcxQzA0N0VGMTBDMTc0QThEIF4KK0JBQTdBQTdCNzc1M0ZBMEFCREM0QTU0MTg0MkI1RDIzOEQ5NDlGMEEgXgorMzUxMzk0RENFQkMwODE1NUQxMDBGQ0Q0ODg1NzhFNkFFNzFEMEU5QyBeCitBQjhCRTk0QzVBRjYwRDk0NzdFRjEyNTJENjA0RTU4RTI3QjJBOUVFIF4KKzM0MjlFQzc0QTY5NUZERDMyMjhGMTUyNTY0OTUyMzA4QUZFMDY4MEEgXgorOTA3RkE0NkMwMjlCQzY3RUFBOEU0RjQ2RTNDMkEyMzJGODVCRDEyMiBeCisyNjQ0Qzg3RDFGQkJCQzBGQzhENjVGNjRCQ0EyNDkyREExNUJBQUU0IF4KKzExMEEzRUVCNDA4NzU2RTJFODFBQkFGNEM1RENENEQ0QzZBRkNGNkQgXgorQ0Q0RkRDMzVGQUM3RTFBREI1REU0MEY0N0YyNTZFRjc0RDU4NDk1OSBeCis4RTZFMjczMjA4QUMyNTZGOUVDQ0YyOTZGM0Y1QTM3QkM4QTBGOUY3IF4KK0ZFMDYwNjEwMEJEQkMyNjhEQjM5QjUwM0UwRkRGRTM3NjYxODU4MjggXgorNkM2M0MzRTU4MDQ3QkNEQjM1QTE3Rjc0RUVCQTRFOUIxNDQyMDgwOSBeCitCQ0MyQkQzMDVGMEJDREE4Q0YyRDQ3OEVGOUZFMDgwNDg2Q0IyNjVGIF4KK0NFNTIyM0ZEM0REOTIwQTNCNjY2NDgxRDU2MjVCMTY0NTdEQ0I1RTggXgorOTQ4ODg2Nzc2RTQyRTRGNUZBRTFCMkQwQzkwNkFDMzc1OUUzRjhCMCBeCis0QzEyQTUxRkNGRTI0MkY4MzJFM0Q3MzI5MzA0QjExQjc1MTYxRUZCIF4KK0M1NEJERDIwNTA1MDREOTJGNTUxRDM3OEFENUZDNzJDOUVEMDM5MzIgXgorOEY1M0U4RkE3OUVBMDlGRDFCNjgyQUY1RUQxNTE1RUNBOTY1NjA0QyBeCisyRDdFMTdGNjI5NDUyNENFNzhCMzNFQUI3MkNERDA4RTVGRjZFMzEzIF4KKzY0NTgyQjRCNTdGNzgyQzkzMDJCRkU3RDA3Rjc0QUExNzY2MjdBM0EgXgorNkQ4ODc5NUI3MUQzRTM4NkJCRDFFQjgzMEZCOUYxNjFCQTk4ODY5RiBeCis4NkFEMzRBNjQ2M0YxMkNFRTZERTk1OTZBQkE3MkYwREYxMzk3RkQxIF4KKzdFQjQ2Njg1QTU3QzBENDY2MTUyREMzMzlDODEyMjU0OEM3NTdFRDEgXgorRTdBOThGQjA2OTI2ODQwNTQ0MDdDQzIyMUFCQzYwQzE5OUQ2RjUyQSBeCiszNERGMTMwNjY2MjIwNkZEMEE1RkMyOTY5QTRCRUVDNEVCMDE5N0Y3IF4KKzU2Q0Y3RUJGMDhEMTBGMENCOUZFN0VFM0I2M0E1QzNBMDJCQ0I0NTAgXgorM0JBRTVDQjgyMjY2NDIwODhEQTc2MEE2Rjc4QjBDRjhFRERFQTlGMSBeCis2NDc1REY2ODFFMDYxRkE1MDY2NzJDMjdDQkFCRkE5QUE2RERGRjYyIF4KKzc5RDgxOTkxRkE0RTQ5NTdDODA2Mjc1MzQzOURCRkQ0N0JCQjI3N0QgXgorQkFFMjI0NDc3QjIwMzAyRTg4MUY1MjQ5RjUyRUM2QzM0REE4RUNFRiBeCitFREU0REVCNDI5M0NGRTQxMzhDMkMwNTZCN0M0NkZGODIxQ0MwQUNDIF4KKzxECisKK0g+U0hTIFR5cGUgMiBIYXNoZXM8SAorRD4KK0E3NzFGQTVDODEyQkQwQzk1OTZEODY5RUM5OUU0RjRBQzk4OEIxM0YgXgorRTk5RDU2NjIxMkJCQkNFRUU5MDM5NDZGNjEwMEM5Qzk2MDM5QThGNCBeCitCNDhDRTZCMUQxMzkwM0UzOTI1QUUwQzg4Q0I5MzEzODhDMDEzRjlDIF4KK0U2NDdENUJBRjY3MEQ0QkYzQUZDMEE2QjcyQTI0MjRCMEM2NEYxOTQgXgorNjVDMUNEOTMyQTA2QjA1Q0QwQjQzQUZCM0JDNzg5MUY2QkNFRjQ1QyBeCis3MEZGQUUzNTNBNUNEMEY4QTY1QThCMjc0NkQwRjE2MjgxQjI1RUM3IF4KK0NDODIyMUYyQjgyOUI4Q0YzOTY0NkJGNDY4ODgzMTdDM0VCMzc4RUEgXgorMjZBQ0NDMkQ2RDUxRkY3QkYzRTU4OTU1ODg5MDc3NjUxMTFCQjY5QiBeCiswMTA3MjkxNUI4RTg2OEQ5QjI4RTc1OUNGMkJDMUFFQTRCQjkyMTY1IF4KKzMwMTYxMTU3MTFENzQyMzZBREYwQzM3MUU0Nzk5MkY4N0E0Mjg1OTggXgorQkYzMDQxNzk5OUMxMzY4RjAwOEMxRjE5RkVDQTREMThBNUUxQzNDOSBeCis2MkJBNDkwODcxODVGMjc0MkMyNkUxQzFGNDg0NDExMjE3OEJGNjczIF4KK0UxRjZCOTUzNkYzODRERDMwOTgyODVCQkZENDk1QTQ3NDE0MERDNUEgXgorQjUyMkRBRTFENjc3MjZFQkE3QzQxMzZENEUyRjZENkQ2NDVBQzQzRSBeCitFOUEwMjFDM0VCMEI5RjJDNzEwNTU0RDRCRjIxQjE5Rjc4RTA5NDc4IF4KK0RGMTM1NzMxODhGM0JGNzA1RTY5N0EzRTFGNTgwMTQ1RjIxODMzNzcgXgorMTg4ODM1Q0ZFNTJFQ0ZBMEM0MTM1QzI4MjVGMjQ1REMyOTk3Mzk3MCBeCis0MUI2MTVBMzRFRTJDRUM5RDg0QTkxQjE0MUNGQUIxMTU4MjE5NTBCIF4KK0FCM0RENjIyMUQyQUZFNjYxM0I4MTVEQTFDMzg5RUVDNzRBQTAzMzcgXgorMDcwNkQ0MTRCNEFBN0ZCNEE5MDUxQUE3MEQ2ODU2QTcyNjQwNTRGQiBeCiszQ0JGODE1MUYzQTAwQjFENUE4MDlDQkI4QzRGMzEzNTA1NUE2QkQxIF4KK0RBNUQ2QTAzMTkyNzJCQkNDRUE2M0FDRkE2Nzk5NzU2RkZEQTY4NDAgXgorRkI0NDI5Qzk1RjYyNzdCMzQ2RDNCMzg5NDEzNzU4REZGRkVFREM5OCBeCisyQzZFMzBEOUM4OTVCNDJEQ0NDRkM4NEM5MDZFQzg4QzA5QjIwREUxIF4KKzNERTMxODlBNUUxOUYyMjVDRENFMjU0REZGMjNEQUNEMjJDNjEzNjMgXgorOTM1MzBBOUJDOUE4MTdGNjkyMjUxOEE3M0ExNTA1QzQxMUQwNURBMiBeCitFMzEzNTQzNDVGODMyRDMxRTA1QzFCODQyRDQwNUQ0QkQ0NTg4RUM4IF4KKzNGRjc2OTU3RTgwQjYwQ0Y3NEQwMTVBRDQzMUZDQTE0N0IzQUYyMzIgXgorMzRBRTNCODA2QkUxNDNBODREQ0U4MkU0QjgzMEVCN0QzRDJCQUM2OSBeCitENzQ0N0U1M0Q2NkJCNUU0QzI2RThCNDFGODNFRkQxMDdCRjRBRERBIF4KKzc3REQyQTQ0ODI3MDVCQzJFOURDOTZFQzBBMTMzOTU3NzFBQzg1MEMgXgorRUFBMTQ2NURCMUY1OURFM0YyNUVCODYyOTYwMkI1NjhFNjkzQkI1NyBeCis5MzI5RDVCNDBFMERDNDNBQTI1RkVENjlBMEZBOUMyMTFBOTQ4NDExIF4KK0U5NEMwQjZBQTYyQUEwOEM2MjVGQUY4MTdEREY4RjUxRUM2NDUyNzMgXgorN0ZGMDJCOTA5RDgyQUQ2NjhFMzFFNTQ3RTBGQjY2Q0I4RTIxMzc3MSBeCis1QkIzNTcwODU4RkExNzQ0MTIzQkFDMjg3M0IwQkI5ODEwRjUzRkExIF4KKzkwNUY0Mzk0MEIzNTkxQ0UzOUQxMTQ1QUNCMUVDQTgwQUI1RTQzQ0QgXgorMzM2Qzc5RkJEODJGMzNFNDkwQzU3N0UzRjc5MUMzQ0JGRTg0MkFGRiBeCis1QzZEMDdBNkI0NEY3QTc1QTY0RjZDRTU5MkYzQkFFOTFFMDIyMjEwIF4KKzdFMEQzRTlEMzMxMjdGNEEzMEVCOEQ5QzEzNEE1ODQwOUZBODY5NUIgXgorOUE1RjUwREZDRkIxOTI4NjIwNkMyMjkwMTlGMEFCRjI1MjgzMDI4QyBeCitEQ0E3MzdFMjY5RjlEODYyNkQ0ODg5ODhDOTk2RTA2QjM1MkMwNzA4IF4KK0I4RkZDMUQ0OTcyRkNFNjMyNDFFMEU3Nzg1MEFDNDZEREU3NURCRkEgXgorRTlDOUJGNDFDODU0OTM1NDE1MUI5NzcwMDNDRTFEODMwQkU2NjdEQiBeCiswOTQyOTA4OTYwQjU0Rjk2Q0I0MzQ1MkU1ODNGNEY5Q0I2NkUzOThBIF4KK0ZDRTM0MDUxQzM0RDRCODFCODVEREM0QjU0M0NERTgwMDdFMjg0QjMgXgorNjFFODkxNjUzMjUwMzYyN0Y0MDI0RDEzODg0NjQwQTQ2RjFENjFENCBeCitGMDA4RDVENzg1M0I2QTE3Qjc0NjZDRDlFMThCRDEzNUU1MjBGQUY0IF4KK0JEOEQyRTg3M0NGNjU5QjVDNzdBQUMxNjE2ODI3RUY4QTNCMUEzQjMgXgorQjI1QTA0REQ0MjUzMDJFRDIxMUExQzI0MTJEMjQxMEZBMTBDNjNCNiBeCitBNDA0RTIxNTg4MTIzRTA4OTM3MThCNEI0NEU5MTQxNEE3ODVCOTFGIF4KK0ExRTEzQkM1NUJGNkRBRDgzQ0YzQUFCREEzMjg3QUQ2ODY4MUVBNjQgXgorRDVGRDM1RkZBQkVENjczM0M5MjM2NTkyOURGMEZCNENBRTg2NEQxNSBeCitDMTJFOUMyODBFRTlDMDc5RTA1MDZGRjg5RjlCMjA1MzZFMEE4M0VGIF4KK0UyMjc2OURDMDA3NDhBOUJCRDZDMDVCQkM4RTgxRjJDRDFEQzRFMkQgXgorRjI5ODM1QTkzNDc1NzQwRTg4OEU4QzE0MzE4RjNDQTQ1QTNDODYwNiBeCisxQTFENzdDNkQwRjk3QzRCNjIwRkFBOTBGM0Y4NjQ0NDA4RTRCMTNEIF4KKzRFQzg0ODcwRTlCREQyNUY1MjNDNkRGQjZFREQ2MDUwNTJDQTRFQUEgXgorRDY4OTUxM0ZFRDA4QjgwQzM5QjY3MzcxOTU5QkM0RTNGRUNCMDUzNyBeCitDNEZFRDU4RjIwOUZDM0MzNEFEMTlGODZBNkRBQ0FEQzg2QzA0RDMzIF4KKzA1MTg4OEM2RDAwMDI5QzE3NkRFNzkyQjg0REVDRTJEQzFDNzRCMDAgXgorMUEzNTQwQkVFMDU1MTg1MDU4Mjc5NTRGNThCNzUxQzQ3NUFFRUNFMCBeCitERkExOTE4MDM1OUQ1QTdBMzhFODQyRjE3MjM1OUNBRjQyMDhGQzA1IF4KKzdCMEZBODRFQkJDRkY3RDdGNDUwMEY3M0Q3OTY2MEM0QTM0MzFCNjcgXgorOUU4ODYwODFDOUFDQUFEMEY5N0IxMDgxMEQxREU2RkNEQ0U2QjVGNCBeCitBNEQ0NkU0QkEwQUU0QjAxMkY3NUIxQjUwRDA1MzRENTc4QUU5Q0I2IF4KKzYzNDJCMTk5RUU2NEM3QjJDOUNCQ0Q0RjJEQ0I2NUFDRUY1MTUxNkYgXgorQUFCRkQ2MzY4OEVCNjc4MzU3ODY5MTMwMDgzRTFCNTJGNkVBODYxRCBeCitGNzMyQjczNzJEQUY0NDgwMUY4MUVGRkUzMTA4NzI2MjM5ODM3OTM2IF4KKzVFOTM0N0ZFNDU3NENEQ0I4MDI4MUVEMDkyMTkxMTk5QkFERDdCNDIgXgorRDU3NzZCN0RGRkY3NUMxMzU4QUJEQkJCM0YyN0EyMEJCNkNBN0M1NSBeCiswMjJCN0FEQTQ3MkZCN0E5REE5MjE5NjIxQzlDNUY1NjNEMzc5MkY2IF4KKzdGMURFNEVDQTIwMzYyREE2MjQ2NTNEMjI1QTVCM0Y3OTY0QTlGRjIgXgorQ0EwRjJCMUJGQjQ0NjlDMTFFRDAwNkE5OTQ3MzRGMEYyRjVFRkQxNyBeCis4MzNENjNGNUMyRUEwQ0Q0M0VDMTVGMkI5REQ5N0ZGMTJCMDMwNDc5IF4KKzE0RkQzNTYxOTA0MTZDMDA1OTJCODZGRjdDQTUwQjYyMkY4NTU5M0EgXgorNEFCNkI1N0VEREVGMUNFOTM1NjIyRjkzNUMxNjE5QUU3QzE2NjdENiBeCitCNDU2QTZBOTY4QUNENjZDQUE5NzRGOTZBOUE5MTZFNzAwQUEzQzVEIF4KK0ZEMUMyNTdGRTA0NkIyQTI3RTJGMENENTVFRDJERUNBODQ1RjAxRDcgXgorNjZFMEQwMTc4MEYxMDYzRTI5MjlFQUFENzQ4MjZCQzY0MDYwRTM4QyBeCitBODQ3OERGNDA2RjE3OUZENEVGOTdGNDU3NEQ3Rjk5RUExQ0U5RUI4IF4KKzI0OEU1OENGMDlBMzcyMTE0RkMyRjkzQjA5QzVGQzE0RjNEMDA1OUUgXgorRjE1NzY3REU5MTc5NkE2ODE2OTc3RUZBNEZDRUQ0QjdGRDlCOEE1NyBeCiszNkE2QkM1RTY4MEUxNTY3NUQ5Njk2MzM4Qzg4QjM2MjQ4QkJCQUY0IF4KKzRERUE2MjUxQjJBNkRGMDE3QTgwOTNBQjA2NkVFMzg2M0E0RUMzNjkgXgorRDMwRTcwRTM1N0Q1N0UzRDgyQ0E1NTRCOEEzRDU4REZGNTI4RkE5NCBeCis3MENBODREODI3RjdGRDYxNDQ2MjMzRjg4Q0YyRjk5MEIwRjNFMkFBIF4KKzhENTAwQzlDRkRFMDI4ODUzMEEyMTA2QjcwQkVEMzkzMjZDNTJDM0MgXgorRjNENEQxMzlFREZDMjQ1OTYzNzdCQzk3QTk2RkI3NjIxRjI3RkZDNyBeCis1NTA5QkFGRkFDNkQ1MDc4NjBDRUZDNUFCNTgzMkNCNjNDRDRCNjg3IF4KKzBDMEFFQTBDMkZEN0E2MjBDNzc4NjZCMUExNzc0ODFFMjZCNEY1OTIgXgorMTQ5MTc2MDA3RkVFNThBNTkxRTNGMDBGOERCNjU4QjYwNUY4MzkwQyBeCisxN0MwRDdCMDI1NjE1OUYzNjI2Nzg2RkZEQjIwMjM3QUUxNTRGQTg0IF4KKzc0MUE1ODYxOEFCRUIxRDk4M0Q2N0FGRENCQzQ5QUEzOTdBM0I4RTAgXgorQjczOEQ2QjM0MDlFQjlFRDJGMTcxOUI4NEQxM0Y3QzM2MTY5Q0RFQyBeCiszRDMzREUzMUY2NDA1NUQzQjEyOEFDOUE2QUEzRjkyREZENEY1MzMwIF4KK0I2OTI1RjRERjk0OTQ5Qjg4NDRDODY3NDI4QkEzREVERjRDRjJCNTEgXgorQ0Y1RTcyNTYyOTJBQkVDNDMxRDhFOEI5Q0JFQUYyMkFGMDcyMzc3RSBeCis5NzVEQ0U5NDkwMjkyMzk3N0YxMjlDMEU0QUNGNDBBRDI4RERCOUFBIF4KKzMzM0IwMjU5QjE4Q0U2NEQ2QjUyQ0Y1NjNERDMwNDFFNUY2M0E1MTYgXgorPEQKKworSD5TSFMgVHlwZSAzIEhhc2hlczxICitEPgorODBFMDQ0NzAzQTg4MEMyMEVDNDFGNjQ1MTIwQThBNUI1RDE5NEVDRSBeCitFMTQyODI5Q0EwOEZDOTc4N0YxN0FBMTZDRTcyNzM5NjE2OUIyNzEzIF4KKzZBMkJBRjYyNDY5RDMxMUY5MjU3QTA3MjdGNTJDN0VBQTg3Q0NFQjQgXgorMzYyRTNFNzEzNkNBNjExRDdGQkY2ODdEM0JCREM1NENEQTY0ODQzRiBeCitGNTkwMEFEQzYyMjNBNUQyNEE3NTI2QUJGQzYwRkE4RTJENTlBNUFCIF4KK0FEMENBQzZBMjFENUIxMDgzM0RERTdGQTg1OTI3RDc0RURBMTQyQTkgXgorNDdBRDMzN0VBRkZEQzE3N0FBRjdDQkQwMzVCRTZGMzk4QjlEMDUzNiBeCis5Q0Y1ODU5NURGODA4NzI1MzVCQ0M3QzA1NkUyMjM1NDZGMEJCNEVFIF4KKzcxNTFDRUIxOTE4Mjc4Q0VEMjkwMkIxRDY2M0Q1OTZGOEQxQjk4NkYgXgorQUREQzlGMDlBQTQwMjZFRjZDNEI3RjFBODREM0ExM0I0Q0RDNjVCMyBeCis5MjFGRTc4QTg2M0EzMTdCMUZBMUZCM0NBM0JFMTk0OERFN0VGNzU0IF4KKzY0QkUxMDczMkQ3MUQ1MkNFOEE0ODZEQTIzRTZCNDUzREY3QzZGQkQgXgorNEE0NTA2NTk0NzBERDc1OUFCRkFFMUQ3Mzk3MkE2RDJFNjNBQzE2QyBeCiswRDY2NUU0QkJGMzBCN0VBQjk1NUJERTg0NzU5RTE4NUVFQ0FCNENCIF4KKzBDMUI4RUU5NEQ2MUNERDA4MzdFQUVEOUZFMzNERTRBODMzNEI1OTYgXgorRDkzQkZFMkE2MjI3QTRCRjlCN0M2MUVCQ0U0QThDREUxMzE1OTNGRSBeCitCREE4ODNGODA0QjQ3MEM5MEJENkFDNDkwREZDMzRFQkMyN0Y5NjQ4IF4KKzQ2QTA5NjkzNzM1NTIyMTM2MzI1OTFDNTIwMzBDMzhFNURCREM0OUUgXgorNDc4MTI4OUU0OEI5MTBDNTUwREMyM0NBN0QzQUY1MzI0QzAzNTMyRCBeCis2OTNBMzRDRkNEREVEMEYzQUM3MkU3MTk3RkNFOUJCNjZBOEUzOTgxIF4KK0FFMDg4QUYxRDg4NjUxNDA5NjNCM0FCRkI2M0UzMkUwNENEMTUwNkYgXgorQURGMEY4RjFEODVDQTk3NTg2RjVEQzZEQzVGRDExRkEzOTI3MEY1NSBeCitFNDg0RjVBRDg2QzVGNEQwOUUzNjZBREY2RTBERTczNDQ5Rjk3QjI4IF4KKzgxQzQ5ODQyQkEzRDcwNzJGQjQyMjg4RTAzQ0U3MzdBMjY3MkMwOTEgXgorRjZDQzcxQUQ4OTdDMjNBMTY4MzU0OTBERUQyODlCRkQ0NTUwMEFCMCBeCisyM0U3MUFFRDYyRkU4RTI4RjM0RjU4RTdGRTU1OTRFQzVFQjA0ODZDIF4KKzkyQkE3OTM0QUE1ODY3RUU1Mjk2MEY0RTBFREZCOTBBQTdCNjkzMDUgXgorQzNEMUNDOENCRDFCNkZGRUUwRDkwQ0U5NjJDRDlDMDlBQjE1NDhBQSBeCiszQ0UzN0E1ODNCNzFBNkE3N0JFMzI1MDY2QTBGMDBDNUQxMURGQzNFIF4KKzc2RUY1RDIzNkUxMDQyRDM1NkEzMjM0QTQyMkMwOTJGODYwMDMwNjQgXgorOEMzRjcwMzQzNkM2Qzg4MkU2MDI2MzU0MEE4RTRDM0U1NjQ2REMxNSBeCis2MTM4RjlGM0FCNDNCOTg4REQzODU3NDIyQ0NCMzA0MzUyNDU5RjQwIF4KK0I4MTJERTk4Nzc1QjQ2OTBCNEZDMkVDRkNBQjYxQzczQzcyNzFEQzcgXgorMDY2NjA5ODVDRDgwRDQ4RTdCOUY4ODQ1NUI0MjMzOTI0QzNCNjRCQiBeCis3NkFCNEI2Mzc4RDZGNjM0OTlBOTRFQjY3RUIxQ0IzMUFGRjhENzc1IF4KK0YzMUY2QjBCRTdBQjA1OUExRjU5QTQ2NDgxOTY3RTg4MzkyOTc5RTYgXgorMEMxNjM4NDk4RkJCN0RCOTYwMEI5OEI0QjIyRUY4NUUwRkUyNDVGQiBeCis1NjA3QzZBRjYwMDkzOTczNjc5NUFDNTIzRkE0M0I3MzZGNDFBMTE4IF4KKzhBMDMyNDQ4NjZCREQyMUI5RDhBODJFOTg0MzZDODk0RkFEODZFQ0MgXgorOEE3NUJGRDkxMUFGODczMDNCOUI4RkI3QTFBNDdDQ0E1MkQzRDk4QSBeCisxNkYwRjNCNUQzNzQxMTIzNkExRTNENkIxRURBQjc0Q0RBMjVFRDRCIF4KK0FDNzJCRjQ1NDc3NDgxRjU4QTMwMjYyOERDNTI5OUZGQTMyRTdDOUYgXgorNzRDRkZENTg4MUY3NUFDMjA3MjZFMTQ0N0RDRjdGNDcwMjQzODBFRiBeCis1QkZCRUNFRUNCQzI3REEwNTcyOUM0RDFBQzhDMTI4NkVBNkRDRUM5IF4KKzAxMkFBQ0JDMDU3OUZBNENCNEYxMDdFOUE5QUQxQTg2QUQyRjZBNEQgXgorRjdENTUyQ0JDNUVGOTBGMUE1NzkzODhCNUE4QTlFQzcxRUI2NzY4MSBeCisxMEM3MDExNUM0QzM0NzUzMjc0QkZFRDQ3N0RGMDE0NDBBNjdBMzYxIF4KKzA3OEQyRkFDRDI5M0I2QjYyMTlEODk4OTlDMTZBQTFBQThFM0RFODIgXgorODNDNkJGOUZCMEQzMDkxQURGMzc0RUJGQTBBNjk5MTZGMTdFNkQyNiBeCisyQ0RCMTkyNERBNjJBQjY0QzAwN0M2NTA1RkY2NTdFNEFEREVBOUMxIF4KK0U5NUQyMDlCQ0I5ODY0QjA3NkZGNERGQ0E4RjhCRDc1RDYyRDFCNDggXgorNjMyODI0Q0Y1MDI1RjhGOTBBRDI5MjNCRERGNDQ5NTUwRDY0QzBGNSBeCiswMkIxQzBCNDFGQzI3RUM1QTMyRTU4NkYxQUM0ODBCRjAwNjFFNTZBIF4KKzI4MTU2QkM2NzY5QUUzOTBCRjMyQzY1MTJDNDYxNjkxODFFMTUzNkQgXgorRjczMEU2RTI4N0Q5OTJFN0YzRTAxM0I2RjFFMDg4RjBCOUM0MTU5OCBeCitCMDU2QTZBODMyRkE1RkU5NjRFRjc3RkYzRTBCRTFDMzJFMEQ1OEMwIF4KK0Q1QjNEMTlBRkJCNDhGQjU2QkE2RDQ0QTgyREU2QkQwOERCMjA4REUgXgorMDIxNUFENzlCRDZCODAyM0MwNUZEMkY4OTY2MjExODk3REY2MzM3QSBeCitFQzRDRjM4QzI0NEVCNjUyNkE0NEY3MDU3MDkyNTI0NzE0NURBOENBIF4KK0MwRDkzMTI2MkVDRTkzREE1QTZBQkM4OUNENkFEMzE2MkVBNkIwOUUgXgorNkJCNDhGQUMyNkFBMkI0ODU5QkJERUZDRkI1M0FFNEQxRDlBMDM0MCBeCis1ODYxMUQ0Mzc0MUU2N0E3RjBEQTlDQjMzN0E1OURDRDFFQkU3NThFIF4KKzdDMkFFQzIxNkFGMjMxNTA5RTQ3QjdFRUQwNkJCMTc4NTk4MTJCN0UgXgorRjYwRUU1REJGNEE3QTY3NkVDOThCM0REQjFDREQ2Q0RGM0NEQTMzQiBeCiswNDkyRTU5QjFGNEM5NEU5N0YyOUEyNkMzRUU3RDU3RTFCMEZERDcyIF4KKzRGQ0Y1NDlEOTAyRDlCRTExMDFBNzU2REI5RTQ1NDE1RkI2MUJDRDIgXgorOTVDNzFEMjZBRDZCMzhDQzc3MTM3NkI0QTRGOTYyRjEyRTFFM0Q0RiBeCitGNkEyNDQ5RTc3M0M3MkZCODg2QjNDNDNFMkIzMEVDMkExQjc0NTRBIF4KK0NERTg2Njk1RTAwQUVDOUE1REI2RkREQjVENUE1OTM0NDQ4RDU4RTAgXgorNTAyMzE4QTc1OEZBQkZGNkFDNTM4NDRFOUUyQkNEMTU5QzY3ODUxMCBeCis1ODlEMjk1MTQ4Rjk1Rjc1REFFOTY0REQ3NDNGRTk4MUZBMjM2RDRFIF4KKzc5NzNERDMzQUUzNTk5QTU1NkJBQ0M3N0U4NjU2RTc4MkUwMjlFRkYgXgorOUY1QkU0M0FBREQ0M0M2REIzODgzQzlEQTRCNTJFMUE1MDI1N0FFRSBeCis0NTQyODlEOEZGQjIzN0E1NkQ1MjE0RUFFODhGMEE5RDMyOEZFQTFBIF4KKzdFNjg2QjM2NTk1QkVCNEMwRDQ1MjhGRjk2MEVEQjU1MDg4QTAyOEQgXgorRjk3ODlEMUVGMTlBMDA4NEFDMEU5RjQzQTRCQzBFRTA0Nzg5MzlFRiBeCisyRjMyQjBFN0NDOEJFMTlDMzI1NTQ1QzgxNkU3NzA1NkQ3QkJFNzBGIF4KKzZCMTYxNzc0NkYwNzNDRkNEMkNFQkNBRkJCRTZGRDBFMjhFRDJENTYgXgorQ0Y4RDJFQTM4ODhBRDc2NzYxNzk5MzgzRTVBMTU5NzlGNkRCN0E4OCBeCis1NTdBRjZEOUQ1OTQ3MjAzQzYwRTk4QzlBNzlCOTJCOEJEMDg1RTJCIF4KK0M2MUEyMTc0MjNERTY4RUQ2Q0QzNEM5MTc1NkM4REQzQTY1MEEyQTIgXgorNzNGM0Y3OUMxNTFCNkMxQkQ5MzY5RURCMjZCOTMyQzIzNjJCMDU5MyBeCiszNjQxNDFFNUZCQ0RFODNGMjEwQzVCQkJFQjY4MTBGNjI5OURFMTRCIF4KK0Y4MDZCRUNEMDI1RDI2NEZENTlFOTNEOUUzNjA2QTY3NEM0MEYyMTYgXgorRTBDNzYxQTU3RjAwQ0JGQjA3RDQ5QkNCMDM0QzM2QTcxMjJGNEM1QiBeCis1RDM4MzEwNDRCOUUwMDMyRkJFM0MzNDI1RkZEMTM2OThGNDEzQjMzIF4KKzdFQjFBQjQxRTk5OTc3NTNDNUQ1MzBERjExOEU3MUU3MkQ3Qjg2RkMgXgorQ0MwNTNFQTE1NTYyNjlEN0U4QkNCQTMwQjIwOEZDQkYwRUUyRUU2NCBeCitBNTc3MzlCMURENDFFN0RDMEM0MEQ2QjYxNTlBN0U3M0NFMjc0OEFBIF4KKzkwREE1MjdDOURCOUFDQzJGRDUzMEQ1NjBBMkYxMTkxQTgwRDA1NjcgXgorNkFDMUYyQTBCOENBMEU1QUJDOUZERjFBRENFNTg4RkJERjVDQzUzRSBeCis0M0MxQTBBMEVFNDE2M0VDOTI5NzI2OTg5RjkyQjAzNjM5QjIzM0FCIF4KKzg5MjdGMjk5NDYyNDEzQUMyOUE3NDA4MEU1NEQ4RUUyREI3MTY1RTcgXgorMEM4RDdFMjIyMjZEOTFCNDIzRTc4MUI1MDhGMzE1MTdFQUFCNjA3QiBeCis3Mjg2RTIwRDdGMDhEMThBODkzMjU0RkJEM0NDODMzRjc5NzNEQ0FGIF4KKzBDQjhDMjM1OTI4QjhFOTM2QzQzQjhGMjlFRjM3NThCOUZENTRBN0IgXgorRjY3QzI0Q0MyM0U0NDBDQTNGMjA2Q0VFQjU1MDRFQ0E1NENENUNBMyBeCitENzhBMjVERUFBMUU3QURBRERCM0MxNDVFRDBFNTI2M0JBNEYyOTEwIF4KKzAwQUE2ODE3NEQyOTQ5MkM1NzhBQzg1M0ZGQ0Q1NTkwODI5MkQ0MUEgXgorRDU1NzBFRURCMDlBNjJBNTk0OEY3RjMxMUY3RUQ1RUYyNDdGOUFEOSBeCis8RAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExIGIvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMQpAQCAtMCwwICsxLDIyOTQgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCWVRFIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIFN0cmluZ3M8SAorRD4KKzAgMSBeCis1IDAgMiAxIDIgMSAyIF4KKzUgMCAxIDMgNCA0IDQgXgorNyAwIDQgMyA0IDQgMSA0IDQgXgorMTAgMCA0IDEgNSAzIDQgNCAzIDEgMyA0IF4KKzEwIDAgMyAxIDYgNSA1IDEgMyA2IDYgNCBeCisxMyAxIDMgMiA1IDMgMyAzIDQgNiA2IDEgNCA2IDIgXgorMTYgMSAzIDUgNSAxIDIgMSAzIDMgNiAzIDUgMiAzIDUgNyAyIF4KKzE1IDEgOCAxIDUgMyAyIDcgNCA1IDYgNyAzIDMgMSA2IDMgXgorMTUgMSA0IDYgOCAyIDEgNCAyIDUgMSA2IDggOCA2IDQgNyBeCisxOCAxIDEgMiA3IDMgOCA2IDcgNSA0IDMgNCAzIDUgMyAzIDIgNiA4IF4KKzE2IDAgOSA4IDEgOCAxIDcgNiA3IDcgMSAyIDYgOSA1IDQgNyBeCisxOCAwIDcgMSA3IDMgOSA0IDcgNyA1IDIgOCAxIDcgOCAyIDcgMiA5IF4KKzE5IDEgMiAzIDEgOCA4IDYgOSAxMCAzIDEwIDggOSAyIDQgMSA1IDEgNSA5IF4KKzE5IDEgOCA1IDQgOCAxIDMgOSA1IDcgNyAyIDcgMiA3IDggNyA0IDggMTAgXgorMjAgMSAxIDkgNyA0IDEgNCA1IDEgMTAgOCA2IDQgNCA5IDkgOSA4IDIgOSAxMCBeCisxOSAxIDExIDYgNyA3IDIgNiAyIDYgMTAgNiA5IDEwIDUgMTEgMSA2IDggMTEgNCBeCisyMiAwIDEwIDUgMTAgMyA3IDggOSA5IDEgMSAxIDEwIDIgMSA1IDEwIDIgOSA5IDkgNyA4IF4KKzIxIDAgMSAxMCAxIDYgOSA0IDIgNSAyIDExIDggMTIgMTIgOSA4IDEgMyAxMCA3IDExIDEyIF4KKzI0IDEgMyA5IDUgMTIgMyA0IDIgOSAxMiAxMSA2IDYgMSAxIDkgNSA5IDEgNCA5IDQgMTAgOCA5IF4KKzI1IDEgMyAyIDMgMTEgMSAxMiA1IDYgMiA3IDggNCA4IDggOSA5IDggNCA5IDEgNCA4IDEwIDkgOSBeCisyMyAwIDExIDEwIDcgMTAgMTAgNiAxMCA5IDQgNSAxMCA1IDggNCAxIDEwIDEyIDQgNiAxIDggMTEgNiBeCisyMiAwIDEyIDggMTAgNCAzIDggNSA1IDcgMTEgMTMgMTEgMTIgMTEgNCAxMiAzIDYgNSAxMSAxMCA1IF4KKzI2IDEgMTAgOSA2IDkgNyAyIDEwIDQgNCA1IDUgMiAxMiAxMyA1IDMgMSAxMCAxIDQgNyA4IDEzIDEzIDEyIDkgXgorMzEgMCAyIDYgNSA0IDcgMyAxMCA2IDEzIDYgMyA5IDYgMiAxMCA1IDMgOCA0IDEgMTEgMyA1IDMgNyAxMSAxIDEyIDkgMTIgNSBeCisyNyAxIDE0IDUgMSAzIDcgMiAzIDkgMyA0IDE0IDQgNCAxMCA4IDUgMTQgMSAxMSAxMiAxMiAxMCA0IDEzIDcgMTEgOSBeCiszMCAxIDQgOSA1IDUgOCA5IDUgMTAgNCAyIDQgNyA5IDkgNiAzIDUgMSA4IDMgMiAxMyAzIDE0IDkgOCA5IDEwIDE0IDEwIF4KKzI3IDAgMTIgOSA1IDggNyAyIDE0IDEyIDMgOCAxNCA2IDYgNCA3IDUgNyAxMCA3IDExIDEwIDEgOSA2IDcgMTIgMTQgXgorMjQgMCAxMiA5IDkgMiAxMSAxMyAxMiAxMSAxMSA2IDE0IDEzIDEwIDUgNiA4IDEwIDQgMyAxMSAxMSAxNCA1IDE0IF4KKzI0IDAgMTUgNCA1IDMgOCAxMiAxNSA4IDE0IDE1IDkgMTIgMTIgMyAxMCAxMyA2IDExIDEwIDQgMTMgMTQgOCA4IF4KKzI4IDEgMSA4IDEgNSAxMSA0IDkgMTIgNCAxMyAxNSA1IDkgMTEgNyAxNCAxMSAxIDExIDcgOCA4IDExIDEgMTMgMTUgMTIgMTMgXgorMzIgMSA1IDggMyA4IDEwIDcgOCAxIDUgMTMgMTIgMTQgNSAzIDYgNCAxMiAxNSA2IDYgMTAgMTEgMTMgOSAxIDExIDYgMTAgMyA3IDE0IAorMiBeCiszMSAwIDEwIDMgNSAxIDE0IDExIDExIDE2IDEgMiAyIDExIDYgMTMgMTUgMTIgNiA1IDE2IDIgMTQgMiAxMCAxMiAyIDUgNSA2IDEwIDEzIAorMTUgXgorMzQgMCAzIDEwIDggMTYgOSA1IDEyIDE1IDQgMTEgMTMgMyA2IDUgMTAgOCAxIDMgOSAzIDExIDEgMiAxNiAxMiAxMCA2IDEgOSAxIDE2IAorNSA2IDE0IF4KKzMwIDEgMSAxMiA0IDQgMiAxNSAxMyAxNSAxMSAxNSA1IDExIDkgNyAxNSAxNiA2IDE2IDEyIDMgMiAxMCAxNiA1IDUgNyAxIDcgMTEgMTYgCiteCiszNCAwIDcgOSAxMSAyIDUgNSA1IDQgMTMgMTMgMTQgNCA3IDEyIDYgNCA4IDIgOSA5IDEzIDEzIDMgMyA2IDcgMTYgNyA2IDE1IDUgOCAKKzE1IDE0IF4KKzM2IDEgNCA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAyIDcgOCAxNiAyIDEyIDE2IDEwIDE0IDMgCisyIDMgNyAxNCAzIF4KKzMyIDAgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAxNiAzIDIgMyA4IDMgMTIgOCAxMSAxNyAzIDkgNyAxNiAxNCA0IDExIDE1IDUgMTMgOSAKKzUgMTcgXgorMzAgMCAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIDkgOCAxMCAxMyAxNCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIAorMTIgXgorMzAgMSAxNiA2IDEwIDUgOCAzIDE3IDE2IDE0IDEgMTUgMTUgMTUgNiAxMyAyIDExIDYgMTMgMTEgMTMgNCA2IDcgMTEgMTEgMTIgMTYgCisxMyAxNiBeCiszMyAxIDE2IDE2IDE0IDE2IDIgNCAxNiAxMSA2IDE1IDcgNCAxNyA2IDUgNyA2IDMgMTQgMTYgNSAxNyAxMSAxMyAxIDEgMTQgMTMgMyA2IAorMTQgNSAxNiBeCiszOSAxIDIgMTYgMTMgNyA4IDYgMiAxNSAxIDkgMTIgNCA0IDExIDEzIDcgMiAxMSA5IDE4IDQgNSA0IDggMiAxNCA5IDkgMSA4IDEzIDExIAorMTUgOCA1IDkgMTAgMTYgNyBeCiszNCAwIDIgNyAxIDEgMTcgMTMgNiAxMSAxMCA4IDUgMTIgMTUgNiAxNSAxMCAxMiA0IDE4IDEgMiA4IDExIDEyIDE2IDEwIDEyIDE4IDExIAorMTYgMTIgMTEgMTcgNiBeCiszNCAxIDQgNyAxMyA3IDEwIDcgMTAgNiAxIDEyIDcgMTggMTEgMTggMiAxMCAxNSAxMCAxNCA4IDE4IDkgOSAxMiAxMiAzIDEzIDEyIDYgCis0IDkgMTcgMTMgMTcgXgorNDAgMCA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IDEzIDEgMTMgNiA2IDEwIDEgMyAxOCAzIDExIDcgOSA1IDcgMTEgMTcgMSA5IDE2IDUgCisxNSAxMCAxNyAzIDggMTUgMTcgOCAxMiBeCis0MCAwIDExIDMgMTUgMTcgMTEgMSAxIDQgMyAxNCAxOCA0IDIgMTggOCAxNSA2IDQgNiAzIDE1IDExIDE2IDEwIDE3IDE3IDkgNiAzIDIgCis2IDE2IDQgOSAxMiA2IDggMSAxMSAxNyBeCiszNyAxIDIgMTkgMTIgOCAxNiAxNCAyIDkgMTYgMiA2IDYgNyA5IDEwIDkgMTEgOSAxNCAxMSAxNSA1IDE2IDkgMiAxNyAyIDggMTUgOCA0IAorMyAxNCAxNCAxNiAxNiAxMiBeCiszNyAxIDExIDEwIDE2IDEyIDExIDcgMTQgMTQgMTQgNiAxMCAxMCAxIDYgMTMgMTkgNSA2IDQgNyAxMiAxMiAxMCA1IDEwIDE1IDE1IDggCis1IDEzIDE3IDEzIDUgNiAxNCAxIDE5IF4KKzM4IDEgMiA2IDUgMTcgOSAxMSAxOCAxOCA4IDYgMTMgMTUgMyAzIDE1IDUgMTMgMTggMyAyIDUgNSAxNCA3IDEzIDQgMTcgNyAyIDE3IDMgCisxOCAxNSA3IDE1IDE2IDE4IDExIF4KKzM4IDEgMTIgOCA2IDMgMTcgMTIgMTMgMTkgMTUgOSA3IDE3IDE2IDE1IDMgMTEgMTEgNSAyIDEzIDE5IDE2IDIgNCAxNiA3IDggMSAyIDkgCisxNyAxMiAzIDUgMTggMTkgMTEgOSBeCiszOSAxIDE0IDE2IDE0IDggOSAxNiA1IDEgNiAzIDE3IDE4IDE2IDkgMSAxNSA5IDEwIDkgMTkgMSAzIDMgMjAgMTEgMTMgMTcgMSAxOSA4IAorMyA0IDMgNyAxIDE0IDE5IDE5IDE5IF4KKzM3IDEgMTggMTMgMTEgNSAxOCA0IDE5IDEwIDYgMTkgMTEgMTcgMTAgMTAgNyA5IDEzIDE2IDkgMTAgMTggNCAxMiA1IDE2IDUgMjAgMTIgCiszIDggMTAgMSAxOCAxIDYgMjAgMTQgXgorMzYgMCA4IDkgNiAxMiAxMSA3IDcgMyAxNyAxMyA2IDIwIDE3IDkgMjAgMTYgMTAgMTIgMTcgOCAxMSA4IDExIDEwIDUgMTAgMTQgMTggOCAKKzE5IDkgMTIgMTIgMiAyMCAxOSBeCiszOSAwIDEyIDE2IDIwIDMgOSA5IDE5IDE3IDEzIDEzIDQgMTcgMiAxMSA3IDE0IDMgNiAxNiAxMyAxMCAxMyA1IDE2IDEwIDIgOCAyIDE3IAorMTkgNCAxNyA3IDE5IDYgOSAxNSAxNSA2IF4KKzQzIDAgNyAyIDE4IDUgNyAxOCA1IDIgMTUgNyAxMSAxMCA5IDMgMiAxNCAxOSAzIDExIDggMTggMTUgNSAzIDUgMTIgMTUgMTYgMTAgMTcgCis3IDE5IDE2IDIgMSAxNiA2IDMgMTkgMTIgNSAxOCAxNiBeCis0OSAxIDkgMTEgMiAxIDEyIDExIDE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCA4IDE3IDQgMTQgNCAxNSAzIDIgMiA0IDMgCisyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCAxOSAxMCAyIDMgMSAxMCAyMCBeCiszNiAwIDE5IDIwIDEyIDUgMTkgMjEgNSAyMSAxMSAxNCAxOSAxIDE3IDggOSA0IDE5IDMgMTcgMSAxNCAyMSAxNCA3IDYgNSAyMCAxNCAKKzIxIDIwIDQgNiAyMSA3IDExIDEyIF4KKzQxIDAgMTIgOSAxMSA2IDE2IDE4IDE4IDEwIDExIDIwIDYgMTIgMTEgNSA3IDIxIDE5IDE4IDYgMTUgMjEgMTAgNCAxNCA5IDE5IDEwIDMgCiszIDUgMTMgMSA4IDEyIDMgMTMgOSA3IDEwIDE3IDE0IF4KKzQ1IDAgMTAgNiA4IDMgMTcgMTggMyAyMSAxOSA2IDE3IDE1IDQgOSAxNSA5IDE1IDE0IDQgNyAxNCA4IDEwIDEzIDQgMTEgMTAgNyA2IAorMjEgMSAxNCA1IDExIDcgNyAyIDEzIDEzIDMgOSAxMyA4IDE0IDIwIF4KKzM5IDEgMyA3IDE4IDQgOSA5IDUgMTUgMTMgMTcgMTAgMTUgMTYgMjAgOCAxOSA5IDEwIDkgMSAxOSAxNCAyMSAyIDE4IDEzIDEwIDQgMTggCisxNiA0IDIxIDE1IDEwIDE4IDE5IDMgMTIgMTggXgorNDEgMCAxNCA0IDEzIDExIDEgMTEgMSAxMCAyIDEyIDQgMjEgMTAgMjEgMTggOSAyIDE2IDcgMjAgNiA3IDEyIDE5IDIwIDEgMTMgMTIgCisxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDE5IF4KKzM3IDAgMTEgMTggMSAxNyAxNCAxNSAyMCAxNiAyMCA4IDIgMTcgMTAgNCAyMSA1IDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAKKzExIDExIDQgMjIgMTMgNSAxOCA3IDIxIDIxIF4KKzQ4IDAgOSAyMiAxOSAxMiA4IDE2IDUgMTcgNSA5IDEgMiA5IDYgMTIgNiAxIDcgNCAzIDE1IDEgMTQgMSAxMiAzIDEwIDIgMTAgMTQgMjEgCisxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgMjEgMTEgMTggXgorNTAgMSAxMiA4IDIwIDEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiA2IDQgMTYgMTQgMTUgMSAxMiA0IDE0IDkgMjEgMyAzIDkgOCAyMSAKKzE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgMTUgMyAxOSAxMCBeCis0NCAwIDEwIDIwIDE0IDYgMyA0IDIxIDEgMTIgNCAxOCAyIDYgNyA2IDkgMjAgMTQgMTAgMTAgMTkgMTcgMjEgMTIgMTUgMTcgNyAxMCAKKzExIDggMTAgMTIgMSAxOSAxOSA5IDE4IDIxIDQgMTggMTEgOSAyMiA1IF4KKzQ3IDAgMTUgOCAxNSAzIDUgNiAyIDE5IDEyIDE3IDQgMjAgOCAxMSAyMCAyIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAKKzE4IDMgMTkgNSAxNiAyIDQgMiAxMiAxMSAxNSAxMSAxNCAxNyAyIDEwIDE4IDggXgorNDggMSA1IDEzIDMgMjEgNSAzIDYgMTggMTggMTAgMSAyMSAyMSA3IDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAKKzEzIDQgMSAxMCAyMiAxNiA0IDkgNCAxMCAxNiAzIDcgMTUgMTEgOSAxMyAxNyAxMiBeCis0NSAwIDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgMTggOCAzIDE0IDIzIDE4IDE1IAorNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAyIDQgMTUgMTcgMjEgXgorNDUgMSAxNSAxMSA4IDkgMTcgNSAxMiAxOCAxNCA2IDIwIDE3IDIxIDEyIDE2IDkgMjIgOSAyMCAxNSAyIDIyIDExIDIgNiAxMSA5IDggMiAKKzQgMTQgMTkgMyAyMSAyMSAyMyA4IDIgMTEgNCA4IDQgMjAgMjIgMTEgXgorMzggMCAyMSAxOCAyMiAxMCAxOSA5IDE0IDE3IDIzIDIxIDEwIDcgMTUgMTMgMTYgNSA0IDEwIDEzIDE0IDIwIDIzIDEyIDIwIDIzIDE4IAorMTAgMTIgOCAyMSAxMSA2IDEyIDcgMTkgMTQgMTggMTcgXgorNDAgMCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAxMyAxMCAxNCAxMyA1IDIyIAorMTQgMjEgOSAyMSAxOSAxNCAxNCA0IDE4IDEzIDEyIDE0IF4KKzQ4IDEgNyAzIDE1IDUgMTcgMTQgMjMgMTQgNSAxNyAyMiAxMSAxIDggMTMgMjMgNiAyMSAzIDYgMTEgNyAyMyA4IDYgMjEgNCA0IDIyIAorMTkgMTMgOCA1IDE5IDcgNSAyMyAxIDQgMTkgMTEgMjMgMTEgMjEgMTQgMSAzIDIxIF4KKzQzIDAgMjIgMTQgMTEgNyAxOCAxNiAxNyAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgCisyMSA4IDIzIDEgMjMgMjAgNyAxNiAxMyAyMyA0IDEzIDMgNyAyMiBeCis0NyAxIDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIAorMTIgMTcgMTkgMTAgOCAxMSAyMiAxMiAxMCAyIDIwIDE1IDE4IDE3IDE4IDcgMTkgXgorNDcgMSAxMiAyMSA2IDEyIDQgNyAxOCAxNyAzIDIgMTQgMjQgMTQgMSAyMyAxIDExIDE1IDEwIDYgMTggMjAgNyAxIDggMSAxNiA2IDIwIAorMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgMTEgMjMgMiAxMiAyMyA5IDMgMjQgMjQgMTAgXgorNTIgMCAxNCAxMCAxOCAxNSAxNCA1IDE2IDExIDIyIDIgMTUgMjQgOCAyMiAxIDQgMjQgOSAxMCAxNSAzIDkgNSA0IDE3IDE1IDkgMTIgCisxOSAxOSAxIDMgMTAgNiA4IDMgMTcgOCAxOCAyNCAxOSAzIDQgMTUgNCA5IDIgMjQgNSAyMCAxMyAxMyBeCis0MiAwIDIwIDE3IDE5IDIyIDEzIDggMTAgMTkgMTUgMTEgMSAxNCAxNyAyMCAyMiAxMCA3IDExIDE2IDkgMjEgMjIgMTcgMjMgMTIgMTUgCis0IDI0IDcgMjEgMTggMiAyMSAxNiAxIDE5IDE4IDIwIDExIDMgMTUgMTcgXgorNTAgMCAxOCAxIDYgMTQgNSA1IDUgMTkgMTMgMTAgMjQgMTkgMTYgMjQgMTUgMTMgMiAxOSAxNSAyNCAyMSAxNyA0IDEzIDE3IDEgMSA5IAorMSAxMCAyIDE4IDEgMjEgMTkgNSAxOCAxMiAyIDIyIDE2IDIzIDE1IDE5IDYgMTggOSAxIDIzIDUgXgorNTEgMCAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgMTggMiA5IDggNCAzIDExIDE3IAorMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IDIxIDQgMTkgNSA1IDIwIDI0IDE2IF4KKzUzIDEgMjAgMjUgMTcgMTEgOCA0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgCis4IDIwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMjUgXgorNDkgMSA5IDkgMTQgMiAxMyAxNyAyNSAyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyAKKzYgMTYgMTQgMTQgMTIgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAyNSBeCis0NyAwIDkgMTggMjAgMjIgMjEgMjAgMTEgMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgCisxMSAzIDE2IDggMjEgNCA4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMjMgXgorNDggMSA3IDE5IDEgMTggMSAxNCAyMiAxMyAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAxNyAKKzEyIDE3IDE0IDE4IDggMjUgOSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSBeCis1MSAxIDE5IDE3IDE2IDIyIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgCisyMSAxNCAxNCAxOSAzIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDQgXgorNTIgMSA2IDEgMTEgMTYgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAKKzIxIDI1IDIgMjEgMTggMTAgMjAgMjUgMjEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDExIDE4IF4KKzQ0IDAgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMjQgOSAyNCAxNSAxIDIzIDIyIDE2IDE0IDggMjIgMTUgMTkgCisyNCAyMCA3IDggMTUgMjQgMTIgNCA0IDIzIDIxIDEzIDE5IDE1IDIxIDEyIF4KKzU5IDEgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgMTUgMyA3IDEzIDIzIDkgNyAxIDEzIAorMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSA2IDI1IDMgMTIgMTkgNiAyIDQgMjQgMTcgXgorNjAgMCA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgOCAyNCAyNSAxNCAyMiAxMiAyMiAzIDIzIAorMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDEgMSAxMCAxMSAxMSA0IDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTUgXgorNDkgMCAxMiAxNyAyNCAxMSA4IDYgMjQgMTYgMTUgMjIgMjEgMTQgNiAxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAKKzIxIDIgMTcgMTcgNSAyNSAxMSAyNSAyMCAyNSAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMjUgXgorNTQgMSAxMiAxNiAxIDE1IDcgMSAyNiAxOSAxOSAxMyAyMCAxMSAxNyA2IDIwIDUgMjQgMjQgMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IAorMjYgMyAyIDYgNyAxMiA5IDEwIDggMTQgMTAgMTUgNSAxNyA4IDIxIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMjAgXgorNjMgMCAxNyAxMyAxMSAxMCAxNyAxNSAxMiA2IDEzIDE0IDE3IDQgMTIgMTAgMjQgNSAxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAKKzE2IDggNCAxNCAyMSAxNSAzIDYgMTcgMjUgOCAyIDMgMyAxOSAxMCAxMyAyMiAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiAKKzUgNCAxNSAyNCBeCis0OSAwIDE0IDIwIDcgMjUgMjAgMjYgMjAgMTYgNyAxNyAxNyAyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggCisyNiAxMiAxMyAzIDI1IDEyIDIxIDE2IDI0IDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTUgXgorNTYgMCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIDEwIDE0IDkgNiA5IDcgMTYgMTAgNCA0IAorMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgMjAgNSAxOCA3IDE3IDI0IDIwIDIwIF4KKzU4IDEgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgMTEgMTUgMTIgMjMgMjYgNSAyIDI3IDYgNSAxNiA2IDMgMiAKKzIzIDUgMyAyMCAyMCA0IDI0IDIgMTggMjEgNyAxNCAxMCAyNyAyMyA2IDI0IDYgMTkgMjMgMyA5IDIyIDE2IDIxIDE3IDE5IDIzIF4KKzU4IDEgMTcgNyAyMSAxOSA2IDE2IDE1IDE1IDIwIDE0IDIgMjUgMTkgMTQgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgMyAyMyAxNCAyNiAKKzEwIDExIDEgMTggMSAxMiAyNCAxOSAxOSAxIDcgMiAzIDI0IDcgMTIgOSAyIDggMTYgMjAgMjQgNSAyNiAyNiA0IDkgMiA3IDI1IDE3IF4KKzU0IDEgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiA0IDYgOCAyNCAxMSAyNSAxNSAyNCAxNiAyMyA0IDEwIAorMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgNSAxNyAxNiAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyNiBeCis1NiAxIDcgMTggMTEgMSAxOSAyMCAyMyAxMiAxMiAyNyAxMyAxMyAxNSAxNiAxMyAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAKKzIxIDQgNiA1IDE5IDE0IDE2IDQgMTYgMTEgMTQgMTggMTggMjcgOSAxMyAyMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDIxIF4KKzUwIDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAyNyA1IDEyIDE5IDcgMjMgNiAyNSAyNSAyIDExIAorMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAyNyAyNSA2IDEgMTUgNCA3IDI3IDE1IF4KKzUxIDAgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAKKzIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTcgXgorNTggMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAKKzI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDI0IF4KKzUzIDAgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgMTYgMyAyNyAxIDI2IDIxIDI4IDEwIDMgNiAyIDIgMTAgMTcgMTMgMTYgCis2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIDEzIDE3IDkgMjMgMjAgMyAyOCAyNyAxMiAxNyAyMiBeCis1OSAwIDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgMjYgMTQgOCA2IDcgMTkgMTUgMjMgMSAxNyAKKzE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgMjMgOCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIAorMTUgXgorNTggMCA2IDI0IDEgNCAyNCAxOCAxMCAyMiAxIDIxIDEyIDUgNCA0IDIwIDI1IDI0IDI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggCisyNyAxMCAyOCA0IDEyIDI0IDggMTYgMTIgMTEgMTYgMTcgMjUgOCAxMiAxNiAxIDkgOSAxMCA1IDI0IDIzIDE4IDUgMTQgMTggOCA0IDI4IAorXgorNjEgMCA1IDE3IDggMjggMSAyMiA0IDExIDMgMiAxNyAzIDE0IDkgMjcgMTMgMTggMjQgOSA4IDcgMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAKKzE2IDIgMTIgMTUgOSAxNCAxMCAxIDggMTcgNCA2IDE1IDI2IDExIDE1IDIgMjggMjAgMjYgMTYgMyA3IDUgOCA5IDI2IDEwIDEyIDI1IAorMTEgMjIgXgorNTMgMCA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAxMCAxMiAyOCAyNCAyMiAyNiAyOCAxNSAKKzkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMTUgMTMgMjUgNyAyNiAxIDEzIDUgOSAyMCBeCis1OCAwIDMgOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyOCAKKzIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAxMCA4IDE0IDE0IDE1IDE4IDEzIDEyIDIxIDE4IAorMjUgMjggXgorNjAgMSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMTYgNyA5IDIwIDI5IDExIDkgNCAxIDE1IDI1IDE2IDI5IDEwIAorMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIDEgNyAxNCAyNCAxNCA2IDEwIDIxIDE2IDIzIDI5IDI1IDYgMTQgCisxNyAyNCBeCis2NCAwIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAKKzEzIDMgMTUgNSAyMyA4IDIzIDIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgCisyIDIzIDE5IDI1IDE1IF4KKzU2IDEgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgCisyOSAxIDI0IDExIDE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgMjIgXgorNTEgMSAyOSAyOCA2IDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAxNCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAKKzI4IDQgMjcgMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIDIyIDEzIDEyIDIxIDIyIDIxIDI5IF4KKzY0IDEgMTIgMTQgMTIgMTggMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgCiszIDIzIDE2IDE1IDI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggCisyMiAxMSAxOSAxOSAyNCA5IF4KKzYwIDEgMjAgOCA5IDUgMjUgMTkgMTcgMTkgMTUgNyAyNCAyNCAyMSAzIDIwIDE2IDggMyAxNyAyOCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAKKzEyIDI0IDE1IDUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAKKzE1IDE3IF4KKzYwIDAgOSAxNyAxMSAyOCAxMiAyNiAyNiA2IDI5IDEzIDEwIDIwIDYgMjMgMTAgNCAzIDI2IDI2IDE0IDIwIDIwIDI1IDE0IDEzIDE1IAorMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSA3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAxMyAKKzUgOSAyMSAxMSBeCis1NCAwIDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgCisyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAxOCAxOSAyMiAxMiAxNSA0IDYgMTUgMjQgMTYgOSA0IDI2IDI1IDE4IDI3IDEyIF4KKzYxIDEgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IDE0IDI5IDYgMzAgMyAxMCAyMCAxNCA2IDMgMTkgMjEgMjEgMjggCisxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAKKzI1IDI4IDE5IF4KKzU2IDEgMjAgMTUgMjEgMTggMTggMTIgMTYgMTMgMjQgOSAyMSAyIDI4IDYgMSAyMyA5IDE4IDI3IDI3IDQgOSAxMyAxMCA4IDE0IDE2IAorMTUgMTIgMTEgMTQgMjEgMTQgMTAgMTEgMjUgMTcgMTcgMzAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIAorMTMgMjggXgorNTkgMSAxMCAyOCAyNCAxMCAyMiAyNyAyMyAyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IAorMTQgMTkgMTMgMjkgOCAyNCAyIDggMiA0IDEyIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgMTAgMTEgMTIgMiAxMiAxNyAyMyA4IDggCisxMiAyOCAxMiBeCis1NiAwIDE0IDI4IDIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IDI5IDkgMyAxNyA3IDE5IDMwIDI4IDEgMiAyMCA5IAorMTIgMjQgMTUgMzAgMjAgMjcgMyAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIwIDEwIDIyIDE1IDIzIDYgMjUgNSA0IDMwIDIgMjkgXgorNjMgMSAyMyAxNSAyNyAxNCAyNiAxIDEgNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAxNyAyOCA3IDExIDcgOCA5IDIyIDE3IDEyIDUgCisyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIDMwIDE0IDMgMSAxOCAxMCAyMCAyNyAyMSA4IDYgMjQgMjYgMjAgMTEgMjQgNyAyIDQgMTggCisxNSAxNCAzMCAxNiAxOSAxNCBeCis1MiAwIDI3IDE1IDQgMTkgMjUgMjkgMjkgNyAxNCAxOCA5IDExIDkgMjcgMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggCisxNyAyMiAyOSAyNCA4IDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMjQgXgorNjYgMSAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IAorNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgCisyMCAzIDkgMTAgMzAgNyAxMiAyOSBeCis1MyAxIDMwIDI2IDIwIDExIDIyIDE5IDI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAKKzMwIDE1IDI2IDIzIDI4IDcgMjEgOCA3IDMxIDMxIDE0IDI2IDE4IDMgMSAyNiAyOCAxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMzAgXgorNjcgMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IDEwIDE0IDE5IDEwIDE0IDggMjcgOSAyNCAyNiA0IDMwIDExIDggMTkgNSAKKzIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IDE1IDI5IDggMTMgNCAKKzIgMTMgMjIgMjAgNyA0IDIwIDMxIDIzIF4KKzY1IDAgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgMzAgMjkgMzEgMTMgMTQgMTYgMzEgMTIgMTYgMzAgNSAKKzE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgCisxIDYgMjMgMjIgMTMgMSAxNCAyMyBeCis1OSAxIDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IDE0IDMgMjkgOCAyOSAxOSA3IDI5IDIzIDI1IDI4IDE5IDExIAorMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IAorMjUgMzAgXgorNTUgMSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgMjggMjEgMTkgMzEgMjAgMjAgNiAyNCAxOCAyNyAyNCAKKzQgMTggMjEgMSAzMSAxNSAxIDE1IDIgMjcgNCAyNiAyNSA0IDIzIDE5IDIgMzEgMjIgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAzMSBeCis2MiAwIDI3IDE1IDE4IDE0IDI1IDE1IDE3IDcgMjggMTEgMjggMjkgMzAgMSAxNyAxMiAxMCAyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIAorMjUgMTQgNSA1IDI0IDIyIDE4IDMxIDE1IDIyIDI5IDExIDMgMjEgMzEgMjEgMjcgMyAyOCA3IDEwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIAorMTUgOSAzIDIwIDI0IDE0IF4KKzYwIDAgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCA4IDE0IDcgMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgMTMgMjcgMTggCis4IDMxIDI3IDI4IDIyIDIyIDE3IDE5IDE4IDE4IDExIDE5IDEzIDI1IDEwIDE5IDYgMjggNCAzMSAyMyAxMCAxOCAyNiAzMSA1IDEwIDEzIAorMTIgOCAxNSAyNyBeCis2MCAxIDI0IDIyIDQgMjkgMjIgMzEgMjggMjAgNCAxNiAyMSAzIDEgMTUgNSAxNSA2IDMwIDMgMjkgMjkgNyAyNyAyMCAyIDIwIDMxIDIyIAorMjYgOSAyOSAxNiA0IDI2IDMyIDE3IDIwIDE0IDI4IDE3IDE5IDYgMjQgMTEgMjYgMjggNSAxOCAxNSA4IDE2IDIwIDIxIDQgOSAxMiA0IAorOCAxNyAyOSBeCis8RAorCitIPlNIUyBUeXBlIDIgU3RyaW5nczxICitEPgorNjkgMSA1IDMgMTEgMTUgMTIgMjQgMzEgMjMgMSA2IDI4IDIgOCAzMSA2IDcgMzAgNSAxOSAyMyAxMiA2IDkgMzEgMTkgMTcgMjQgMjUgCisyMiA2IDEyIDE2IDMgNyA5IDkgMTEgMjkgNCAxMSAyIDUgMTMgMjkgMTAgMTIgMzAgMzIgMTggMjggMTggMjcgMyAzMCA0IDQgMjYgNiAKKzEzIDMxIDEzIDIgMTEgNyAyNCA0IDE3IDI5IDEyIF4KKzk1IDAgMjEgMTkgMjEgMjMgMTEgNDIgMzYgMiAxMyA0IDEgMzMgMjIgMTYgMjcgOSA0IDMzIDE2IDMgMzAgMTUgMTEgMzIgMTMgMTcgMzggCiszMiA5IDM4IDQgMzYgMTUgMzIgMjcgMTkgNDIgMTggNiAzNiAyMiAxMCAyOSAxMiAyNSA0MCAxNSAyOSAyMyAyOCAzMCA0IDggMTEgMjQgCis5IDEwIDMxIDI4IDQzIDIzIDE2IDI5IDMzIDUgNDAgMjYgMyAxOSAxMiAzNiA0MyA1IDM1IDM3IDUgMTQgMTEgNDUgMzUgMTYgMTAgOCAKKzMyIDQgMTUgMzUgMjYgMiAzOSAyMiAzNyAyMiAzMCAyOSBeCisxMDYgMSAxOCAxNCA1MSAyIDYgMzIgNTEgOSAzMiA1MCA0NCA0NiA1MSA4IDExIDUzIDQ1IDU1IDE2IDEwIDMgNTIgOCAyMCAyMCA0NiAKKzQ2IDEzIDMyIDIgNDYgNTAgNDMgMjUgNTQgOSAzMSAyOSAyIDQ3IDE1IDI5IDI0IDQ1IDQ0IDE4IDM3IDE0IDI4IDM5IDM2IDQ0IDQ3IAorMTYgNTAgMTAgNDQgMjQgNTMgMzUgMjIgNDAgMjAgMTUgNTEgMjIgMTggMjIgNDIgNiA1NCA0OSAzOCAyMSA3IDEzIDMwIDE2IDcgNTIgCisxNiAyMiAxMyAzOCA3IDExIDQ0IDMzIDkgMjUgMTMgMzcgNDIgMTQgNDUgNTMgMzAgMzggNSAyNSA1IDM1IDM4IDIyIDI4IDUzIF4KKzEyNyAwIDU4IDM1IDQzIDI4IDUgMjggNjMgOCAxMiAyNSA5IDQ3IDUzIDI5IDYyIDcgMzcgMiAzIDQ4IDUgMTIgNTUgNTYgMjggMzUgMTIgCis2MyA2IDU4IDI3IDI3IDQ4IDQ0IDM1IDE0IDE3IDIyIDU2IDEwIDggMSAxNiAxNSA0MiA2MyAxNCA1MSA1NyAxOSA0MSA3IDggNTYgNDcgCiszNCA1MiAyMiA0OCA2MCA0MyA5IDEgNTIgNCAyMSA0OSA2MSAxOCA1MCAyMyAxMyA0NiA2MiAyMyA0NSA2MiA5IDU2IDE4IDIzIDMxIDggCiszMCAyNyAzNiAxMyAzOCA0IDU4IDUzIDQ3IDI0IDE4IDQxIDU4IDE5IDEyIDE4IDUyIDQyIDI5IDQ0IDQ1IDI2IDYzIDM0IDMyIDQxIDY0IAorMTUgMjYgNTUgMTkgMiA0OSA2IDMwIDUzIDEzIDU0IDEyIDUzIDM3IDEyIDM3IDQzIF4KKzE0OCAwIDYwIDQgNTEgNDcgNTggMzggMTcgNjMgMzMgMjMgMjggNDMgMTIgNjkgNzAgMzMgMTcgMTIgNTAgMTggMTggMzYgNDUgMiA2NyAKKzQgNDUgMjAgNCAzMyAzOCAyOSA0NSA4IDIyIDU4IDM5IDcxIDM4IDMyIDUzIDM1IDE5IDUzIDMxIDI5IDUxIDM1IDQgNjMgMTggMzMgMjYgCis0NyA3MCA5IDY0IDYyIDYzIDMwIDE1IDEgMzUgMjggMTYgNDAgMjAgMTQgNTAgMzMgMTkgMzggMzAgMjcgNTUgMTAgMTYgNDYgNDcgNyAKKzU1IDEyIDUzIDI2IDU2IDMzIDI5IDU1IDI1IDE3IDQ4IDQzIDIxIDQzIDE4IDI0IDYzIDI3IDY4IDQ2IDM4IDMzIDM1IDEwIDE4IDExIAorMjcgNSA5IDU4IDM1IDcwIDM2IDM2IDM5IDQ3IDIgMTAgNjYgNDcgNSAxOCAyMSA0NCA3MSA1MSA1NyAzIDIyIDcgNTYgNTUgMjggMjUgCisxNCA0MCAxNiAyNCA0OCAzNyA2NiA1MCAyNCA0NSAxOCAzOSA1MyA1NSBeCisxNjUgMSAxNSA2MiAzNSAyOSAxNSA0MCAxOSA3NiA2NyA0IDUgNzEgNDYgNjEgMjYgOCA3NyA0OCAxIDIzIDEyIDYwIDQwIDI0IDQ0IDMzIAorMjkgNDIgNzMgNjYgNDkgNjEgMjAgMzAgMSA1NCA1MiA0MiAzOSA2NCAyMyA2NSAzNyAyNCAyMCAxMSAyNiA2NiAyMiA3NyAyMiA1NyA3IAorMzggNTcgMzMgNjEgNzMgNyA2NCAxIDQ5IDM1IDc2IDE0IDI3IDIxIDQ1IDY4IDM4IDU4IDczIDEzIDcyIDQ3IDczIDMzIDggNjYgMjMgCiszOCA0IDU2IDc3IDQ3IDEwIDcxIDEzIDIwIDMxIDQxIDYgNTEgMyAxOCAxNyA2MSA0NyAxNCA0OCA3NiA0NiAyOCAzNCA0MyAxIDU2IDQgCisyNSA3IDY1IDQxIDEgMzQgMzcgMjMgNTkgNTkgMjcgMjYgMTMgMTUgMTQgNzUgNjAgMTQgMSAyOCA1OSAyNiA2NSA2MSAxNiAyMyAxNyAKKzI4IDYgMTkgMiAzNSA0OSAzMCAyOSA0OCAyIDYzIDczIDU5IDEgMyA3NiA0MSAxMSAxOSAxOCA0MyA1NCA2MyA2NyA1MSA0IDkgNzggNjAgCis2NiBeCisxODEgMCAxOCAxOSA4NCAxNyAxMiAxMCA1NyAxOCA3NyA1MSA1MiAxNiAzOSA3NCA0OSA1MiA2MyAzOCA3MiAyIDE1IDY0IDgzIDYyIDQ5IAorNTYgMTEgMjYgNjggNTggODMgMzMgMjMgNTAgNjMgNzEgNTMgMjcgODQgMjIgMzkgNDEgNTIgNTggMTEgNjQgNyA2MCA0NSA3MCAyMiA1IAorNzMgMzggMzAgMzAgNDggMjEgNzUgODAgNDAgMjEgOCA1MyA5IDI2IDMwIDM0IDgxIDcxIDcxIDUxIDIzIDc1IDMzIDQxIDIzIDMyIDUgOCAKKzY2IDQwIDcyIDQwIDE2IDY2IDQ1IDE0IDQ4IDM0IDIxIDQxIDI3IDMgNTUgMjcgMzcgMjMgNDEgNjUgNCA1NyA1MSA3NCAyMiAxOSA3NSAKKzQyIDE2IDE5IDQ2IDE2IDEwIDQ4IDIwIDE5IDM3IDQxIDE0IDU3IDkgMTcgNTUgMzggNSA2MCA3IDQ2IDIwIDQzIDM2IDM5IDUyIDIwIAorMTAgNjIgNDUgMjMgNDYgNyAzNSA3NSAyOSA3MCAzNSAzNiAzNCAyNSAxMiAxNSA4NCAyNiAxMCA2IDcxIDI5IDc5IDMzIDMyIDI1IDU5IAorNzYgODIgNjQgNTggNyA4IDE5IDQxIDc0IDIgNTMgNjUgMjQgMSA1NSA1MSAzNiAyMSA3OSA3IF4KKzE4NCAxIDYwIDY2IDY2IDYgMyA5IDczIDEyIDcgNDAgNzAgMTggNzEgNzAgNjUgNTEgMTQgMTQgMjcgNTAgOSA4NyA4MSA1MCAyMiAxOSAKKzQwIDM3IDE2IDc5IDEyIDM0IDM3IDc2IDgyIDEwIDYxIDcgODEgNDkgNjcgMjYgNDUgODIgNTAgODEgNjMgNDUgNjkgMzEgMzEgNzYgNTEgCis5IDU5IDM0IDUxIDU0IDM0IDgzIDEwIDMzIDUxIDg2IDgxIDgyIDY5IDE4IDggMjIgNjQgMTkgODYgNjIgNTggMzMgMzcgMTcgMzQgNSAKKzI5IDgzIDQyIDc2IDUwIDU0IDY2IDM5IDkgMSAzNiA0MyAxNyA2NSA2IDM1IDU2IDcyIDcxIDgzIDg4IDEwIDEgOCA4NyAyMiA2IDIxIAorNzggMjUgODkgNDMgNjIgNDAgNTUgODUgMzEgODkgNzQgNjMgNDYgMjggMjQgMjYgMzEgMTcgNyA4IDI3IDE5IDEyIDg1IDE3IDIwIDI3IAorNzcgMTAgMiA1NCA4MCAxNyA1MiA3NCA3NiA2OSA3OCAxMSAyMCA4MCA0IDI5IDI0IDg1IDc1IDE4IDM5IDIzIDcwIDgzIDI5IDU3IDY3IAorNzIgNzAgMzMgNCAxNSA0NiA0MiAyIDY5IDEzIDUzIDMzIDY5IDY0IDMzIDY0IDE0IDQwIDY5IDU5IDc4IDU0IF4KKzE5MyAxIDY4IDQzIDk1IDUzIDM4IDU4IDU1IDI4IDIwIDE2IDY3IDQ4IDE3IDg2IDMyIDQ0IDY4IDY3IDI4IDE2IDE0IDc5IDI1IDE1IAorNzIgNjcgNTAgODAgMTggMzAgMTAgNzUgMSA2MCA0NSA4NyA3OCAyOCA5NSA0OSA2MyA3MCA1OSAyNiA2IDUxIDczIDYwIDY1IDE4IDI2IAorOCA4NyA1IDU4IDMxIDI1IDU3IDQwIDQ2IDc4IDU3IDM0IDc4IDYxIDM2IDY2IDU3IDM4IDgwIDIyIDMyIDY4IDcxIDMwIDc0IDM3IDgxIAorNjYgNzcgNjYgNTUgMiA1MSAyNCA5MyA2MSA0MCA2OCA0NSA2MSAxMiA2MyAyNCA4OSA1OSA1MiA3MiA0MyAyMCAyMCA2OSAzNiA0MCA4OCAKKzQ2IDkgNjIgNTUgNzcgODQgMjAgMTggNiA3NyAxNSA1MiAzOSA3NSAzIDI2IDQgODUgMTcgNjIgMjkgMTEgOTIgNDYgNTggMjkgNTkgMjggCis0MiA4MCA3MSA5NiAyIDQ5IDg1IDM3IDYzIDQgNjEgMTQgMiA1MyA4NyAyNSA4NiA2IDc1IDc2IDkzIDQxIDM5IDkzIDkyIDQyIDU2IDQxIAorNjMgMjYgMjggMTggNzcgMTEgNTAgNzggNzkgMSAxMiAxMiA5MSAyOSAxMyA1OCA1IDU2IDkyIDY2IDU5IDQgMzkgNDcgOTUgNSA1IDYyIAorMzMgMTMgODAgMjcgXgorMjAzIDEgMzUgMjggMTEgNyAyMCA3IDE3IDMgMyAzMCA4OSAxMyA2NSA1NiA2NiA2MyAyMiA4MiAxNiAzMSA1NSA1NiA3NyA5MSA5MSA3MSAKKzEwMSAxMyAxMCA4NSAxMDEgOTUgMTcgOTkgOTggOTEgMzMgMTQgMjAgNDggMzIgNyA2NCAyOSAzOCAzNSAyNSA0IDk1IDIzIDM0IDEgODUgCis4MSAyMyAzMSA5NiA3MSA4NCA1MCAxNSA3OSA0NyAyNSA1MSA0NSAzNSA2NiAxOSA2MSA2MCA5IDMxIDkzIDY0IDcwIDMwIDQyIDg2IDUzIAorMSA3MSA0NiA0MiAyMiAzOCA5NiAxMCA5OSAzNCA3NiAyNiA1NSA3MyA2MyA2MyA5NyAyMyA5MiA4MSA2NCA0NiAxIDMwIDMxIDM1IDg2IAorOTEgODggNjQgODcgMTYgMzcgNjkgODQgOTQgNjAgMTAwIDMgNDcgNTIgOCA3MSA4NyA1NyAyOSA3NiA0MyAxOCA0NSA0NiAxNSA2NSAxMiAKKzQ0IDQyIDY2IDYwIDE1IDY4IDE5IDU4IDM5IDYyIDc2IDkgOTIgMTAxIDU3IDMyIDQgMzQgMTUgNDEgNjIgMzIgODkgNzEgNDMgMzUgMzEgCis0MSAyMSAxNyA4MiAzMyA5NiAyNyA2MiAyOSA4MiA1NyA0NiA2MiAxNSAyNCA5OSAzNyA4MyA0MCA1MiA0NiA1NiA4MCA5OCAzIDkxIDc0IAorNiAyNyA3IDU4IDk0IDEwIDQxIDc5IDk3IDg0IDc3IDc0IDI2IDk5IDM1IF4KKzIxMiAxIDI2IDEwMSAxNyA5MSA0NSA5NyA4MCA1OSAxMDIgMzAgNjggNCA4NSA5IDQgMzkgMTYgMTggODUgNzAgMTEgODcgNjIgNzIgNzggCiszOCAzIDQxIDUzIDgyIDgyIDM1IDE4IDEzIDk0IDY0IDUyIDM5IDc3IDU5IDI2IDkgNjUgNDYgNjQgOTggMzIgMjkgODYgNzkgMTYgNjMgCis1NCA3NiA1NiA5OCAxNiA5OCA3OCAyMiA3MiAzMyAxMDMgMTA0IDUyIDg0IDEyIDY1IDE1IDg1IDEwMSA5NyA4NCAzMSA1MSAyNiAxMDAgCisxMDAgMzggODAgMTMgMiA3OCA3IDI0IDQ0IDg0IDEwMyAyNyA3IDI4IDE2IDMzIDk5IDI1IDEwMyA1NCAxNCA0MiA2MiA4NyA5MiAyNyAKKzIyIDQyIDUgNTIgMTAwIDg0IDczIDcyIDYzIDI0IDQ4IDU2IDUyIDIzIDUgMTcgNzYgMzEgMSA5NSA1OCA0MyA2MCA1MCA2MiAzMCAyMyAKKzM1IDc5IDIwIDM1IDMgNzIgMzIgNDUgNTEgODcgNDEgODQgMjcgNzkgNzcgNzAgMTAyIDE1IDU0IDE1IDEwMCA4IDUyIDY5IDEwNSAzIAorMzAgODQgNDIgOTMgNjYgODkgNjkgNzQgMjQgMzMgNDIgOTcgNCAzOCA5OSAxMDYgMTMgOTMgNiAxMDYgNzQgMTAwIDU0IDQ1IDIxIDU5IAorNTYgMzcgOSA1MCAzMiA3NSA3OSAzMSA3NyA5IDYxIDEgOCA2OCA2IDYwIDgxIDcgMTAwIDk5IDE0IDYxIDQ4IDI1IDczIDI2IDcwIDcyIAorOTQgMzQgXgorMjMzIDAgMTEgOTggMTEwIDg4IDM1IDExMCAzNSA2NCA0OSA4OCA5MyAyOCA4NSA2IDc4IDY1IDkwIDUyIDI0IDk3IDUxIDM5IDUxIDU5IAorMjMgMSAzIDQ5IDMzIDExIDc4IDI3IDM1IDU1IDY0IDUgMTAyIDQgNzAgMjUgNTYgNTggMzggNjYgMTEgMzEgOTYgNjYgMTA0IDU5IDQxIAorODYgNTggMjkgNzkgNDEgNDAgNzIgNTEgMTIgOTIgMzQgNTIgNDQgNjkgMTA0IDIxIDk3IDg5IDk2IDQ4IDIxIDQgNjEgNDAgMjggNjcgCiszNCAyMyA4NSA0NCAyMiA2MiA1MiAzMyA4NCAyMyAzMCA3MyA3NCA0IDc5IDEyIDgxIDQ3IDgwIDUzIDQ3IDg5IDQwIDE5IDgwIDYyIDM0IAorNjEgMjkgNDEgOTUgNDMgMSA3MCA2MyA1NSA1MyAxOCAxOSAxMyA0OCAxMCAxOSA4OSA0OSA0IDUyIDUzIDU2IDc2IDEwIDggMTA0IDc3IAorMTUgMjggMzggNzUgMTA5IDMgODUgOTAgOCA0MCA4IDkzIDkwIDQzIDM5IDE0IDYwIDE3IDM2IDc4IDU2IDEwNSA4MCAzNSA3NSAzNiA1OCAKKzgyIDUwIDEwMCA5OCA0NSA3NCAxMyA2NiA5NSA3MiA3MSA5NSAzNCAxNCA5OCA3MiAzMyAzOCAzNyA1MiA2IDE0IDEwNyA1OSAzIDI5IAorNjEgNjcgOTggOTIgNSA5MyAxNyA5OCAzNiA4NyA0MSA3NSA3MSA1NyA4OCAxNyAyNSA5MSA4NCAzIDU4IDIwIDkyIDY5IDUxIDUwIDM2IAorMzEgMTQgMjUgMTggMzAgMTggMSA0MSAxMDQgMzAgODIgNTkgODcgNzAgMzQgOTYgMjggNDcgNjIgODEgMTAzIDQ4IF4KKzIzNCAxIDYzIDkwIDEwOCAxMDggMTAyIDY0IDgyIDg4IDQgMTExIDc2IDk3IDIyIDEgMTA4IDQxIDM0IDkxIDMzIDIwIDI1IDI0IDI2IDggCis4MyAxMSAzMSA3IDg1IDEwOSAxMDYgNCAxMDUgODUgNjggMjggMzMgOTkgNTMgOCAxNiAxMiAxMSA3NCAxNyA4MyA2NiA3MCAxNiAzMCA5IAorNjcgNjggMzQgMjQgODEgNDcgOTIgNzIgNDcgMzcgMzMgMzggOTIgMTcgOCAyOCA4OCAyMiA2MiA2OSAzMiA4OSA3NSAzIDcyIDk2IDg1IAorMTMgMTA1IDI0IDM4IDM3IDk0IDExNSA4MyA3MiAxMDggMTE0IDI0IDkzIDc2IDEwMyA2MCA5OSAxMDIgOSA0MyAxMCA1OSA5NSA0NiAzMyAKKzkzIDE1IDI2IDY5IDQ0IDIgODYgMTA3IDU1IDQ1IDYxIDY1IDkyIDY2IDkgNTUgMzkgNzAgODMgMjkgOTggNjcgMTMgMTExIDE1IDIwIAorMzEgNjIgOCAyIDUxIDIwIDE5IDMzIDQ0IDE0IDExNSA3MSAxMTIgOTcgMTAgNDEgMjggNTMgNTEgMjYgNTcgMTUgMzggOTggNTUgMTA2IAorMjIgNTYgMzEgNTAgOTUgMTA3IDExMCA4NCA3MCAxMCAxMDggOTYgNzMgMTAwIDI1IDM2IDU1IDg4IDcxIDYzIDk2IDMwIDkwIDk2IDc5IAorMjIgNyAzMCAyMyAyOCA1OSA4OSA4IDUxIDk5IDQ3IDg2IDM0IDE4IDQzIDY1IDk4IDEwNCAxMDcgNDkgNyA3OSA3MSA4IDU3IDIxIDI5IAorODAgMiA3NCA3OCA0NCA1NyA5IDYxIDIyIDEzIDY4IDUyIDkxIDc0IDk4IDQzIDMwIDU4IDY4IDk1IDEwMSA3MiAxMDIgNzYgNDIgOTkgCis2MSBeCisyNDkgMCAyNyAxMTcgNDUgMTE5IDgwIDIgNTkgNTIgOCA3NiAyMCA5NCAxMDIgNjkgOTYgNDIgNDYgMTA2IDY3IDkgMTEwIDg5IDcxIDY5IAorMzQgMzEgMTUgODUgMTYgMjkgMTAwIDgyIDM3IDYyIDY4IDk1IDEwOCA0NCAyMyAxMTQgMzQgMzYgNTYgOTMgMTEgMzAgOTYgMTIgMzEgCis2NyAxNCAxMTQgMTQgNjYgNzAgMzAgODEgNDYgNTMgMTE5IDg1IDYgMTA0IDQ3IDkyIDcyIDcwIDUgNzAgMTUgMTE1IDY4IDEwNSAzMyAKKzk3IDEzIDg1IDEwNiAxNCA2MSAyOSAyMiA4NiA0NSA1NyA2OSA5MSAzOCAzOCAyOCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAKKzIzIDYyIDUgNjUgOTQgMTA3IDczIDEwNCAzNyA0NyAxMDIgMTE3IDMgNzggMzUgNyA5NSA1NiA3OCA0NSA1MiAyOCA0NiA0MyAzNyAzMiAKKzUzIDE5IDU1IDI5IDQ3IDk3IDc2IDExNSA4MyA3MSAxMSA0NSA2MiA3MyA5OSAxMTYgMiAyNCAxMTYgNyAyOCA0MSAyIDI5IDM3IDUyIAorMjMgNSAxMTggNzkgMzEgNTcgODkgNjEgMjQgMTAxIDc4IDUwIDkzIDczIDQxIDcgMzMgNDUgNDcgMjQgMSA0OCA3MyAzNiAzIDI1IDg3IAorNDYgMjggMTA4IDU0IDY4IDUzIDY3IDExOSAyOCAzNiAxMTggMTA0IDQyIDg4IDI3IDExMiA0IDc0IDg1IDEgNjMgMzkgOTcgNzEgNzQgCis3NSA3NiAxMCA0OSAxMiA3OSAxMSA1MCAxMDMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggNTEgNDcgODIgMTEwIDE3IDE1IAorMTA1IDIzIDUyIDQzIDEyIDIxIDIyIDgxIDQxIDEyIDc0IDkwIDQyIDEwOCAxMTcgOTggNjcgNCA2OSA4NSBeCisyNDMgMCA3NiA4MSAyNiAxMDEgMTMgNjggNjIgMTA2IDg3IDE5IDk4IDMyIDgxIDYzIDc5IDkzIDMxIDEyMSAxMjMgNzUgNTIgMTEgNjYgCis0MSA1NCA4NyAzOCA1IDEwNCA2MiA1MSAzOCA1NSAyOSAzMSAxMjAgNDQgMTYgNDggOTQgNDYgMTA1IDkxIDY2IDc4IDI3IDQzIDYgNjQgCisyIDU1IDc5IDc1IDg0IDExMyAyMiA0IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgNjMgOTggMTAzIDEwNyAxMTYgMzQgMTQgOSA5NSAKKzM4IDE4IDUxIDc1IDMzIDEwOSAxMTggNTUgNjYgNCA3NiA3IDc1IDcwIDgyIDc0IDIzIDEgMjYgNjkgNDAgMTEyIDk5IDQ3IDY1IDMxIAorNzAgMTE5IDUyIDEwMyA4OCA4NSA4NiAyOCAxNiAxMiA3NiAyNSAyMiA3OCA2NCAyMSA4NiAyNyA2MSA3NyA3MiAxMDggMiAxOCAxMDYgCisxMTkgMTIxIDU0IDE2IDg1IDcyIDIgNzMgMjYgODggNjYgNjAgODAgMzUgMjQgMTE3IDYzIDI0IDQ0IDY3IDUyIDEyMiAxMTkgMzMgNzIgCisxNiA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAxMTQgMzIgMTE3IDgxIDEwMCA1NyA0OSAxMjMgNTYgMjEgNjggODAgNTMgOTUgMSA0NSAKKzk1IDEwNyA5OCA4NyAxIDI3IDI0IDk5IDExNiAxNiA2NyAxIDExMyA5MSA4NCAyNSA0MCAyNSA3MiAzIDI4IDkwIDg3IDExMiA4MCAxNiAKKzExNyA0NSA3NyAzNiA5MCAxMDUgNTkgODggMTIyIDY0IDEwOCAxMDggNzEgOTggMTggNTAgMTE1IDkzIDEwNSA3NyAzNSA2IDQ2IDU1IAorNDcgMTAyIDQgMjYgODcgMTExIDEyMCA4MSAxMTMgNCA1NyAxMDUgMyA4NCA5NCAxMTUgNjEgNzMgXgorMjU1IDEgOTEgNDcgNTEgOSA1NyA5IDU1IDk0IDYxIDYxIDY4IDQ2IDEwNyA2IDM1IDgxIDExNCA3OCA5NiA3NCAxNCA4OSA3MyA2NyA2NyAKKzY5IDExMyAxMDcgMTEgOTggMTEzIDEwOSAyMCA5MiAxNyA2NyA3MCA4OCA1NyAxMCAxMjQgOSA2MCAxMjIgOTMgOTEgNDUgNyAxNSAyNCAKKzUxIDUgOTggMTE1IDI0IDQ5IDkwIDEwNCAxMTcgNjYgMTI4IDk0IDY0IDgwIDEyIDQzIDkxIDQ2IDExMSA1OSA1OCA3NyAzMCAxNCA4OCAKKzYwIDEyMyA2OCA0MSA0NCA2OCA0MCAxMDQgMTE4IDQxIDQzIDkzIDkwIDEwNSA5MiAxNiAxMjcgMjYgNTQgMTI1IDExNCA3OSA3MSAyNCAKKzQ4IDIxIDI1IDExOCA0MCAxMDMgNDkgOTEgNDQgNjcgNjUgMjUgMTE5IDEwOSAxOCA0OCAyMyA2OSAxMTIgMzggNjEgNjQgODcgODQgCisxMDQgMTE5IDExMCAxMjIgOTIgMjIgMSA4IDgzIDM0IDEwMCAzMiA2MiA0MSA0NiAxMTIgMzQgMTAyIDc2IDU2IDM5IDQgMTI3IDMwIDEzIAorMTkgMTEwIDEyNCA3IDE2IDEyOCA5NSA0IDEyNCAxMSAxMDQgMTE2IDEyNiA0OSA5NSAzIDU1IDk2IDcwIDkwIDEwMSA0IDEyMiA5NiA3NSAKKzExOCAzOSAxMjggOTkgOTIgMTggNDIgMjAgODcgODMgMzUgNzUgMTExIDYxIDY3IDcxIDI4IDEwMSA5IDU2IDM0IDEwNSA5NSA3MSAyMyAKKzczIDcxIDI2IDU3IDE1IDIzIDc2IDU1IDk5IDg5IDEyOCA5OCAxMTcgNjggNDMgODggNjIgMzggNjIgMzkgMiA4MyAzNiAxNSAyNiA2MCAKKzEyOCA5NiA3MyA3NCAxMCAxIDEyIDQyIDIyIDIgNzcgMzMgMzMgMzIgNTcgMTMgMTQgODIgNTcgMTIgMzkgMyA1OCA4MCAxNCA4NyA4NSAKKzQ0IDY5IDEwOSAxMTkgXgorMjgzIDAgMTAyIDU1IDUzIDQxIDYwIDg4IDI1IDY3IDU4IDc2IDQ0IDIyIDY4IDExOCAxMDggNDAgOTUgOTYgODEgOTAgODUgMjggNzcgCisxOCAxMSAzNyA3MiA5MyA2MCAxMTAgMTI0IDExOSA5NSAxMzEgOTEgMzcgMTA5IDEyNiA4IDczIDY5IDcyIDgwIDE3IDgzIDUgNzYgMjAgCiszMiAxNSAxMCAxIDEwMyAxOCAyMiAxMTYgOTggOSA1MSAxMDQgMTAyIDQ0IDMzIDE1IDEyIDI0IDMxIDg5IDEgNiAyOCAxMDEgOCA2NCAKKzcyIDEwNiAzMCA1IDUyIDg5IDExMSAzOSAxMDggNjQgODUgMTcgNTcgMTI0IDIyIDEwNSA3OCAxMTUgMyA0MCAxMDggNjYgMTA4IDc3IAorMTI4IDEwMyA0NCAzNSAzOCAxMyA5NSAxMCAxMTEgNjMgOTggMTE3IDYxIDUxIDEyNiA2OSA5NiA3MCA3MCA1OSAzOSAxMyA5NyAzMyAKKzExMiAyIDc3IDcgMTIzIDcwIDgzIDI5IDY2IDY3IDQ5IDc5IDE5IDEwNCAxMTUgMTQgNjAgMiA1NSA0MCA3MSAzMyAyOCAxMTQgNTEgOTEgCisxNyA0NiA0NSAxMjggNTcgODcgNjIgMjUgMTE1IDM4IDUwIDU1IDkwIDc0IDggNTEgMTAyIDc5IDQzIDk0IDM2IDEyMiA5NCAxMiA0MSAKKzM2IDI1IDEwNCA5MSAyNCA3IDk5IDgwIDMwIDEyNiAzMiA2MyAxMjIgMTA3IDExNCAyNyAyOCA3OSA0MSAxMiAzNSA1MSAxMTUgMTIyIAorNzAgMjIgNzkgNjUgMiA4OCAyNyAxNyA1OSAxNSAyMyA0NCA1NyA1IDY1IDYgMjYgNzggODAgMTI1IDkzIDg0IDEwMCA0NSAyMiAxMjkgCis2OCAzNiAxMTEgNzQgMTE4IDExIDUwIDQyIDEyMCA0NyAyMSA4IDg2IDExMiAyNiA2NyA2MCA5OSA0NSA5MyA0NyA4IDM4IDU5IDUyIDU2IAorMTI0IDIwIDgyIDE4IDExNyAyNCAxOCA0NiAxMDYgMTkgMTE3IDI2IDQxIDQ3IDQ1IDEzMCA3IDE1IDEgNCA1IDEwMCAxMCA4NSA1MCA0NCAKKzExIDQ4IDkyIDExOSAxMDggNDIgMTE4IDEyNSBeCisyNzIgMCA4IDYxIDk5IDcwIDk2IDIwIDg3IDEyMyAxMzQgODIgMjIgMiAxMTAgMTE4IDMzIDg2IDUgNyA1IDk0IDU2IDE1IDYwIDk2IDU0IAorMTMgMjIgNTUgOTkgNCAyNSAxMDUgMTcgMzcgNjkgMTAgMzggMTE3IDExNyAzMCA3MCAxMyA5IDEwOSAxMTUgNjIgOTQgNTIgNjYgMTE3IAorMTAwIDEzNSA3IDc1IDIzIDUgODEgMTEwIDMxIDExOCAyOSAxIDYyIDExIDQxIDg4IDEwOSAxMTkgMTAyIDM3IDMgMzAgMTIzIDQ3IDMxIAorNTYgMTM0IDI5IDEyNCAxMTYgMTE4IDk5IDIxIDU2IDc3IDkxIDIzIDM3IDEzNSA4MSA0NCA1MSA2NyA5NSA1MSAxMzMgMzAgNTcgNjcgCisxMTYgMTIyIDQ4IDEwMCA3IDEzMiA5NyAxMDYgNjkgOTMgNCA5NSAxMjUgMTAyIDEwMyAxMTkgODEgNTcgMTMzIDk2IDM3IDExOCA1MCAKKzExNyAxMTMgODEgMTI3IDE3IDQ1IDEwMyAzMiAxMjEgMTI5IDYwIDQzIDY1IDEyNyAzMCAzNiAxMzIgMTEwIDUyIDUzIDM1IDcxIDEyIAorNzYgMjIgNzIgMTMwIDExMiA5OSA3NiAyNiAyMSA3MyA2MyA2MyA5NyAyMyA1OCAxMTUgMTMyIDExNCAxIDEzMiAzMSAzNSAxOCAyMyA1NCAKKzMwIDUzIDExOCAzNyAzNSA4NCA5NCA2MCAxMDAgMyA0NyAxOCAxMTAgMTA1IDg3IDU3IDYzIDc2IDQzIDUyIDQ1IDQ2IDQ5IDY1IDEyIAorMTAgNDIgNjYgNjAgMTE3IDM0IDE5IDkyIDUgMjggNzYgOSAxMjYgMTAxIDEyNSAzMiAzOCAzNCAxNSA3IDYyIDMyIDIxIDMgNDMgNjkgCiszMSAxMDkgMTIzIDUxIDExNiAxMzUgMTMwIDEyOSAxMzAgNjMgMTQgNTcgODAgNjIgMTUgMTI2IDMxIDEwNSA4MyAxMDggMTIwIDgwIAorMTI0IDQ2IDk4IDEwNSA5MSA2IDYgMjcgNyA1OCAxMjggNzggNyA3OSA2MyA4NCA3NyA3NCAxMjggNjUgNjEgOTUgMTIxIDE3IDI0IDEyMyAKKzExNyA1MSAxMjIgXgorMjg0IDAgNDQgNzEgNDMgMjAgMTI2IDU4IDUzIDQ3IDk4IDE4IDE5IDExOSA5MyAyOSA3MCAzOSA5NCAxMTIgNDQgMTE1IDEzNSA5OCA4MiAKKzEwIDY3IDI5IDEwMiAxMTMgNjggODAgMTkgNzUgMSA5MSAxMTQgODcgODAgNyA0MCAzNyA4NiAxMjAgMTYgMTA0IDEzNiAxMTcgODIgCisxMzggMzIgNjUgMTE0IDExOSAxMzcgMTIxIDggMTIgNDYgMTI2IDI2IDExOSA3MyAxMzAgNjAgNzYgMTEzIDEwMCAxNCAxMzMgMjYgMTE2IAorMzQgMTIwIDgwIDk1IDg0IDUzIDE1IDI0IDQ0IDUxIDQgMTAgMjMgNzcgMjQgOTkgNjYgMzcgNTQgNjMgNDIgMTM2IDIxIDM0IDc2IDUgCisxNyAxMjggMTAxIDEgNTkgNDAgMTEzIDExMiAzMiA5NyAzMSA5MyAxMDUgNzkgOTEgMTggMzkgMSAxMDMgMTMyIDUxIDY4IDEyNCAxMTEgCisxMyA5NyA0MyAxMjggNjkgODQgODUgNzIgMTUgMTIgMjYgODcgMTYgMTYgOTIgMTAxIDEzIDc3IDQgMTE4IDg5IDEwMyA1NiA0MiAxNiAKKzYwIDQ0IDM5IDEyNiA0NiAxOCA4MyA5MyA0MSAxMDUgMyA4MiAxMDYgMTE1IDkxIDYgNCA1NCAxMTUgMTUgMTIwIDEwOSAxMTMgNDggNDEgCis5IDk1IDIwIDYyIDY3IDEwNSAxMTEgMjUgMTMyIDcgMTE2IDQ2IDEzOCA0NCA4MyA2MSAxMjQgMTMxIDM1IDEwNyA2IDEwOSA4MSAxMTQgCis2NyA0MSAxMzcgNzcgNTYgNzQgNzMgMzQgMTIgMTQgNjkgNTIgMTEgOTggNDcgNTQgODMgODEgNiAxIDE1IDg4IDM1IDEzOSA4MCA4MyAKKzQ5IDg5IDI3IDQ3IDEzMCA5MiAxMzMgODcgNTEgMTEyIDc2IDQ5IDEwOSA0OSA1NyA5MyA3MyAyMiAxMTcgNTAgNjQgNTggOTcgMTM5IAorMzYgMTMxIDExMSAxMzMgNTggMzMgOCA4OCA1NSAzOCA5MCA0NiAzMCAxMTggNTcgMjkgODIgNzQgNDEgMTE3IDM4IDQ2IDk0IDkyIDUgCisxMDUgMTUgMTE3IDcwIDEwMyA2OCA2MCAxMjAgNDggMjEgMTEwIDg1IDQwIDgxIDY2IF4KKzI5MSAwIDQ2IDExMyA1MiAxMzQgNzkgNzQgNjQgNTcgMTggMjMgOSA1MiA4IDE2IDEwMyA1NyAxMzggNTkgNTkgNjUgOTIgMiA3IDEzMCAKKzkyIDggMzQgNDAgODYgMTMxIDE0MCAxMDAgMTEyIDQgNDIgMSAxMTAgMTA4IDQzIDM3IDE1IDY3IDE5IDM1IDk0IDYxIDEzMCA5OCAzNSAKKzg4IDM0IDY1IDEwNCA1NiAxMjYgMTE4IDUwIDg3IDEwIDgxIDEwOSA5MCA4NiAxMTggMzIgNiAxMTQgODggMzkgMzggMzkgNjIgMyAxMiAKKzEzNCA3MiAxMzcgMzUgNzUgODEgMTE1IDEwNiAxNDAgMTEyIDExIDEyMyA0MSAxMDMgNDUgOTUgODQgNzEgMTA3IDEzIDI2IDExMCA5NiAKKzYyIDE2IDEwOSA4NCA1OSA1MyAzOCAyNyA4IDI4IDEzIDMyIDEzNyAxNyAxMzggNDEgMTIyIDM2IDk5IDY1IDk5IDgzIDM2IDExMiAyOSAKKzQ5IDcwIDk2IDEyNiAxMzYgMTMxIDExNiAzIDE4IDE3IDEyNiAxNDIgMTQgMzcgMTQxIDE0MSAxMjMgNDIgMTMgMjAgODMgNDIgMTM5IAorODMgNTQgNDkgNTggNDIgNyAxMzcgMjkgNDggMTYgMTIxIDEyNyAzNCA1MiAxNDAgMTA2IDEyOCA1OCAzNiAxMjQgODMgMjQgNjkgNTQgCis2MSAxMTIgMTcgNiA5NSA5NyAyNCA1NyA4NiAxMjQgNTkgNzEgMTE5IDY3IDEgMTA5IDU0IDY4IDQ5IDU3IDEzMiAzMiA1IDcxIDExMyAKKzQwIDgwIDEwNCA3NSAxMDYgMTMzIDMxIDEyNiAxMzAgMTA0IDYyIDkgMzkgNDQgNjYgMTE2IDE0MSAxMzUgOTYgMTMyIDE5IDQxIDEyMSAKKzEyNiAxMjQgNzcgOCA0IDYwIDgyIDYgMTAxIDEyNCA4OSA1MSAxMjMgNDggNDAgODUgNzcgMjEgMTEyIDEwIDY5IDY2IDExNSA4NyAxNiAKKzEwOCAzMCA4NCA2NSA4MCAxMDMgMzIgMTMxIDEzNCA3MyA0NyAxMCA2MyAzOSA1MCA5MyAzNyAxMzUgMTE0IDY5IDQ4IDM0IDU4IDIzIAorMjcgMTMzIDM3IDkgNDAgOTggNDEgMTE1IDk5IDcwIDgzIDI5IDQyIDY3IDEzMyA1NSA3OSA4MCA5MSAxMjIgMTIgMiAxMTUgMTEyIDQ3IF4KKzI5MyAxIDMzIDEzIDk5IDEzOCAxIDQyIDg5IDExOCA4NyAxMTMgOTkgMTIgMTM0IDE0MiAxMDAgMzggNSA1NSA3NSAxNCAxMTAgMTA4IAorNDIgNjQgMTMwIDc5IDEzOCA2MiA2NCA2OSA1NyAxMSAxMjMgMjUgNTkgMTYgMTExIDk0IDI0IDY1IDMwIDUxIDExOSA0OCAxMDcgOTIgCis4NCA2OSAyOCAxMzYgMTQzIDU0IDIwIDYgNzAgNDcgMTQyIDY0IDQgNjUgNTkgNzMgOTkgMTM0IDE0NiAxMDIgMTI1IDExNiA1NyAxMzcgCisxMzcgNzIgNDggMTI4IDc4IDUgODAgNjMgNTQgODUgMzAgMjIgMTI5IDY4IDIxIDIxIDc0IDI4IDEyOCAxMDcgMjcgNjAgMiA5MyA5NSAKKzcxIDM3IDExIDM3IDE1IDM5IDEwMiAzIDEwNCA2NSA4MCA1OSA1MiAxMTMgMzQgMjAgNjcgNjAgMjcgODEgMTM1IDQ2IDEwNiAxMDYgCisxMDIgNjggMTI4IDE3IDE1IDEwMCAxMjQgMTUgNDMgMTM2IDEyMiAxMDAgNjcgMTQyIDM1IDE0IDUzIDEyMCAyIDg5IDkzIDk5IDczIDkgCisxMjIgMzkgNzcgMTUgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDEwNSA1NSA5NiAzMSAxMTkgNzcgOTcgNzIgMjMgMTQwIDM4IDMwIDQzIDgzIAorMTM2IDg4IDEwNyAxMTcgNzIgMTA5IDExOCA1OCA5MSAxMTkgNzMgOTUgMTAwIDU5IDEzOCAxMjMgNTQgNDkgMTQzIDUwIDEzMyA2NiAKKzEwNiA0NSA4MCA4OCA0MiA5MyA1IDU5IDc3IDEwMSA3NCAxMTAgMTA0IDQwIDkyIDE5IDc3IDc2IDg2IDEwMiAxMjkgMyAxNDQgMTAxIAorMTM5IDEzNCA1NiA5MCAxOCA5MSA5NCA4NSA1NSAxMCAxMzcgMTEgNTggMSAxMDcgMTEzIDcwIDIyIDcgNTYgMjkgMTQzIDExMSA4IDQ2IAorNDUgMTE2IDEyMiAxMjkgODkgNyAxMjEgNTMgOTUgMTQgNDkgMTE4IDYyIDEyNSA5MSAzNyA5NyAxNSAzNSAxMDAgNjMgMTQwIDYzIDUwIAorNTEgNTggMjYgMTI3IDYgNDUgNTkgMTAyIDEyMSAxMTQgODUgMTQxIDEzNSAxMCA3MiAxOSAxMDYgNjYgNjYgNDEgNTMgMTMgMzggMSAyMSAKKzEwMyA1MCAxMDggNDYgMTE5IF4KKzI5NyAxIDQ2IDMxIDEzMiAxMTIgMjggNjMgMTI0IDk3IDEyOSA0MyA0MCA3MiA5OSAxMDcgMTMyIDEzNyA5NiAxMzkgOTkgMTQ1IDEyMSAKKzE0NCAxMTggMzcgODEgMzkgOTQgNjAgNTUgMTA5IDQ3IDEwOSAxMTAgNzUgNDIgMTIgMTM5IDEzNyA0MyAxMjggMTA2IDEwNyAxOSAxMjYgCisxMiAxMDEgMTQ4IDEyNyAxNSAxMTcgMTI1IDEyNSA2MiA5NiAxMyA3NiA3MCA5NiAxMDEgMTEwIDEzOCA4IDk1IDc2IDE0MyAxNyAzMiAKKzk3IDc5IDE0OSAzOSAzMSA5NCAxMjMgMjEgNDEgMTM1IDU1IDg0IDcwIDMzIDEzNSAxMTggNTAgNjIgMTIxIDgxIDEgNDUgMTQ0IDkzIAorNjAgNSA2NCAxMzcgOCAxMDUgOTEgODIgNjcgMjcgMTEzIDExOSA1MyAxOCA5OCA3OSA0OCA4NCAzMiAxMzUgMTI4IDUgMSAyMCA3NiAxNyAKKzg1IDEwOCA3MiAzNiAxNDEgMTQwIDQ5IDE1MCAxMDUgMTA0IDMgMTQ5IDE0IDU0IDE4IDE0OCA2NCA0OSAxMjUgMzcgMjggMjggMTAxIAorMjIgMTA0IDkxIDMyIDgyIDExNyAxMiAxMTQgNjkgNTggMiA1OCAxMTUgOSAxMDggNDcgNTkgNjUgMTQgOTIgNyA0IDg2IDk4IDE2IDgyIAorOTIgOTUgMzggOTQgMTAgMTAgNDggOTcgMTA0IDY2IDExNSA5NyAxNDIgMTE1IDEyMiAxMTkgNDAgOTcgMTYgMzIgNDcgMzQgODggODkgCisyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCA0MCAxMjIgODQgMTA4IDIyIDE0MiAxNDAgOTkgNDQgMTUgNTQgOCA0MiAxMjUgCisxNTAgMTMwIDIxIDc5IDEyNCA2MiA0NiAxMTkgMTUgMjkgOTEgNTcgMTUwIDQyIDEzOCA3MSA2MSA2OCA4MCAxMTQgNiAxIDcwIDEyMSAKKzE4IDM1IDExMyA1NiA4NyA4NiAxMCA3MyAxNCAyOSA0MSA3MiA4OSAxIDEzMyA4NyAxMDEgMTIzIDU5IDkwIDE0MiA3NyAxMzMgNTIgNzggCis0OCAzNCAxMzggMTM0IDI3IDE3IDYwIDEzMSAxNDcgNjEgOTMgMTQ4IDM5IDEzMiA0OSA2MiA3MSAzNiA5MSA0IDEzOSA0OSAxMDAgMTIwIAorNDMgMTEzIDE0NCAzMCA5NCA3MyAxMjcgNDAgMTI1IF4KKzMxMyAxIDM1IDk3IDk1IDc2IDEwNSA4OCAzMiAxMzggMzAgNjkgNjEgNDAgNDcgMjEgMTA3IDYgMzkgODEgMTE0IDUzIDEyNSA1MyAxNDcgCisxNCA0IDczIDE0NiA5NiA5OCAxMyAxMzYgMTEgOTggMTE3IDEzOCAxNTMgNjcgMTQ2IDcxIDk5IDg4IDcgMTM5IDI0IDEzIDM1IDQ3IDk3IAorMTQ1IDc0IDM2IDExOSAzIDUxIDg0IDQ4IDExOSA1MyA0OSAxNSA3OSAxNyAxMjAgMTAzIDE0OCA2NCAzMCA0MSA5NyAxMjAgNzUgMTExIAorNjMgNTggMTMxIDEzNCAxOCAxMyAxMCA0OCAxOCAxNiA0OCA0MyAxNSA1NCAxOCA0MSA0NyAxMjIgMTQ0IDgwIDkyIDE0NSA3NyAxIDMzIAorODkgNTQgNDYgNzggNDggMjEgNTQgNDMgNDAgNTMgMjQgMTYgNzMgNDIgOTQgMjkgNDQgMzQgMTUxIDE1MiAyMyAxMjMgMTIgMTQyIDE0MCAKKzQzIDM3IDg4IDI5IDE5IDM1IDcyIDk2IDE1MSAxMzAgNjIgMTEyIDM0IDM2IDkxIDEyMCA1MCAxMTIgMTM4IDIgMTA1IDYwIDY4IDEzNyAKKzEzMSA1IDE3IDE5IDEzOSA3NCAxMSAxMjAgNzggMTQ5IDU4IDEyOCAxNSAxMDQgMTYgMTI2IDc4IDIwIDU3IDEzNCA3MSA0OSA5MCA3NiAKKzEwOCAxMjYgMTAwIDU0IDY4IDM5IDEzMiAxNTMgNDIgMTQ3IDE0NiAxMjQgNjIgODcgMzUgNzUgNjEgNjUgNDYgMTAwIDgyIDEwNSAxMTMgCiszMSA2MyA1IDk1IDU0IDcxIDc3IDEyNyAxNTAgODAgMzYgMTQ0IDIgMTMwIDU5IDc0IDM5IDMgMTUyIDEyMSAxMjIgMTggMTE3IDEyIAorMTE3IDE0MSAxMTggMTM1IDYyIDM2IDY5IDUgMzkgNTMgMTUwIDUyIDE1MyAxNDMgMzAgNjYgOTYgMTI2IDEzMSA1NiAxMzcgOCA3IDg2IAorMTQyIDE0IDcgMTExIDE0MSA5MyAxMzYgMTM3IDEzNCA0MyAxMiA4OSAyMyA0NCA5IDE1MiAxNDYgMTIxIDk3IDE5IDM4IDExMCA5MSA2NyAKKzE0IDMyIDExMCA2NiA2OCA4IDEzMCA4NCA3MyAxMTggNTkgMjQgNDEgNzIgMTIxIDE1MCA1NSAzNyAxMzggMjcgMTA0IDY2IDEyNCA5IAorNTEgMTA5IDQ3IDEyNSAxMDkgMTQ4IDggMjkgNDcgNzIgMTQ2IDE0OSA2MSA5MyAxMCAyMCA1NCAxNSA3NiAxMzMgMTI1IDEwNiAxMTAgCis2NyBeCiszMzAgMCAyMyA5IDI2IDEzNiAyNyA1MSAxMTUgMTIyIDQ0IDEwNiA2IDE0NiAxMDggMTEzIDg1IDUxIDggOTYgNDcgNTYgMTM3IDYyIDU5IAorODkgMTQzIDcxIDE0MCAxNCA4NSAxNTYgMTM5IDk5IDE1NCAzMCA1MyAxMTUgMzUgMTQ3IDEwOCAxNDggNTggNTIgMjggMTAzIDE5IDkyIAorOTUgMTUyIDE1MiAxMCAxMSAxMyAxNTUgNjcgMTEgODMgMTAxIDY5IDE1MyAxNTIgNDUgMTQxIDE0IDEyMCAxMjkgMTQwIDExOSA1OSAyIAorODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAxMTcgMiAzNyA0NyAxMjggMzMgMyA4OSAxMDggOTggMTM5IDQ5IDc4IAorMjcgMTAzIDM5IDExOSA5NCAxMzIgOTAgMzggMTMyIDU1IDY1IDEzMSA5MCA1OCAyIDU0IDEwMCA2OSAxMTggMjIgNDQgMTkgNyAxNDggCis5MyAyNSAyOSAxMjMgODEgNjQgMTMxIDU1IDMwIDEgODkgMzggOTcgODIgNjQgOSAyOCA4NiAxMjMgMTUxIDEwIDEzMyA0MCAxNTQgMTAyIAorNCAxMTEgNjUgOSA2MyA1OSAxMjQgMTE2IDcyIDEwNSA3NiA1NyAxMzcgOTcgMzIgMTQ1IDEwOCA3OCAxMTIgNTAgNDMgMzQgNzUgMjAgCisyMiAxMjkgNjggMTEgMTE4IDc0IDEyNSAxMTggNTcgMTcgMjAgMTI5IDUzIDY1IDYxIDE0NCAxIDE3IDE0MiAxNTYgNTIgMTAwIDU0IDE1IAorMjAgNTkgNTIgNjMgMTMxIDIwIDU3IDEyNCAzMSAxMjUgNDYgMTA2IDc2IDkyIDggOTggMTU0IDE1MiA4MCAxMTQgMTUgMTQwIDEzNiAKKzExMiAxMDAgMTcgOTIgMjUgMTUxIDE1MCA4MCA5OSA2OSA4MyA0OSA0MyAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCA0MCAKKzMyIDc1IDUgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMTMwIDE4IDEyNyAzMyAyMyAxMTYgMTA3IDc4IDc3IDc3IDQyIDY5IDY4IAorNDggNDEgNjkgMzMgNzUgNDAgNDkgMTI4IDEwMyA0IDE0NiA5MyAxMCA4MyA2NiA5NiAxNTIgMzAgMzggMTIgMzMgNSAzOSA0NyA0MSAzNCAKKzYwIDc0IDIwIDQyIDE1NiA2NyA0NiA1NiAxMDIgODkgMyAxMjQgODEgOTkgMTA0IDU2IDUwIDggNjEgNzQgNTUgMTUgODcgMTA4IDI4IAorMTM4IDQ3IDkzIDYwIDIgMTI0IDQ2IDEyNiAxMDMgOTEgMTQ1IDM2IDI1IDExNiAxMjIgNTEgXgorMzIyIDAgNzUgNyAxMDcgMTU4IDgxIDEwNSAxNTQgOTAgMjAgMTI1IDc3IDExNCA2OSA5MiA3IDU4IDIxIDk4IDE1NCA1MCAxMjggMTQ5IAorMTE3IDEyNyAxNTMgNDUgMyAxOCAxMjEgODYgMjkgNzEgNzkgMTAxIDIgNSAyMiAxNDMgMTAgMjcgNTMgMTQ2IDE1NyAxNDggMTEyIDMzIAorMjIgODAgMTIzIDI0IDE0NyAxIDExMiA4MiAxNTkgNjMgNzQgOTcgMTA5IDMzIDE1MSAzMiA4OSA4NyAxMzIgMTE3IDQ2IDEyOSA1OSAKKzExNSA5MSAxMTQgMTE4IDM3IDIxIDkgOTQgNjAgMjUgODkgNDcgNzkgMTEwIDU1IDEyIDE0MyA5OSA4NyA0MyA4OCA1NiA1NyAxNjAgNzYgCisxMiA3MSAxMjggNzcgMTQ2IDExNyA5NSAxMDUgNDIgNjYgMyA3NiAyMCA3NiAxMDEgMTAwIDExOCAxNDkgNDUgMjYgMTQzIDE0OCAzMiAKKzU3IDM5IDEyOSAxOSAzMSA4NCAxMjMgMSAxNTIgMTM1IDUgNTQgMzAgMTMgMTI1IDY4IDMwIDYyIDEwMSA1MSAxNDIgNSA5NCA4MyAyMCAKKzExNiAyNCAxMDcgMTA5IDEwNSA5MSA0MiAxNyAyNyA5MyA2OSAzIDEzOSA2OCA3OSAzOCA4NCAyIDg1IDEyOCAxMjYgMTIyIDEzMSA0NiAKKzE3IDM1IDk4IDQyIDI2IDExMSAxMDAgMjkgMTIwIDU1IDg0IDExNCAxMDkgMTQ1IDE0IDE4IDEzOCAxNCA5IDg1IDcgMTggMTI5IDkxIDIgCis5NCA1MSAxMzMgODIgODcgMTIzIDY0IDM5IDggMTAzIDM4IDc1IDExMCA3OCA3IDkgNDUgMTE1IDQyIDEzOCAxMzUgODYgNzggMTYgNjIgCis1MiA3NSAxNTkgNTQgMTUxIDEyMSAxNDkgNzcgNzQgMTYgODUgNDcgMTAyIDEwNSA4MiAxMTkgMTAgNjcgMTM3IDE1MyAxNDggMTM1IDI4IAorNDkgMjYgMTUxIDE1MyAzNiA4MCAxMSAxMzAgMTEzIDI0IDQ0IDMwIDEwMiAyNCA1OCAxMzMgMTIyIDE0MCA5OSAyNCAxNTYgNTQgMTE5IAorNDIgMTE1IDE0MCA5MCAxMzIgMTkgOTQgMiAxNTcgOTkgMTM2IDE5IDcxIDcgMTMwIDE1MyAxMDggNTEgMjEgNTggNzAgNzQgMTM3IDEgCis0MCAxMTEgMTQ5IDUgMTAzIDYgMjcgNzYgMTQxIDIzIDEyNSAxNDAgMSA3MiAyOSAxNTIgMTAzIDg3IDUxIDkzIDI5IDgwIDEzMiA3NyAKKzEyMyAxNTMgNjggMTU5IDE0IDk4IDExNCAxNTggMTIxIDE1OCA4MSAxMzEgXgorMzIyIDAgMzUgOTMgMTA5IDEyNSAxMTkgMTAgMTAgMTkgMTM1IDI2IDQgNzQgMTM1IDM1IDEyMCAxMjkgMTEzIDkyIDE3IDI5IDQ3IDg4IAorMTQgMTU5IDE0OSA4NyA0NSAzNiA3NSA2OCAyMiAxMzggMjAgNTkgNjEgMTQ0IDE1MSAxMSAxMDcgNiAxNTMgODEgMTE0IDQzIDg1IDE1NyAKKzk3IDE0OCAxMTggNzMgMTI2IDU2IDU4IDEzNyA5NiAxMSA5OCA2NyA5OCAxMDMgNTcgMTQ2IDIxIDU5IDg4IDE1MSAxMzkgMTQ4IDEyNyAKKzI1IDE3IDQ3IDExNSAzNCAxNjAgMTA5IDEwNyA1MSA2NCAyOCA2OSAxMyA0OSAxNDkgNjkgMTQxIDkwIDkzIDExOCA2NCAxMCAxIDY3IAorODAgMzUgMTExIDEzIDU4IDEwMSAxMjQgMTMyIDE0NyAxNTQgMTggMTYyIDYgMTYyIDMzIDUgMzQgMTQyIDQxIDE2MSA4MiAxMTQgNzAgCis5MiAxNDUgNTcgMTU1IDEzNyAxMTQgNzkgNDQgMzYgNDggNDggMjEgMTQgMTMgNDAgMzMgMTQgMTUwIDMzIDMyIDU0IDE0MyAxNCA0IAorMTAxIDE0MiAyMyA5MyAxMzYgMTMyIDEyMCAxNDcgMTcgMzggMTYzIDE0MyA1IDUyIDQ2IDE1MSAxMzAgMzIgNzIgMzQgMTI0IDE1MCA1MSAKKzEwMCAxMTIgMTI4IDEyNiA2NSAxMCAyOCA4NyA4MSAxNTkgMTMxIDE5IDk5IDU0IDEyNSAxMTAgNTggMTE5IDI4IDc4IDEyOSAxMDQgCisxNDAgMTI2IDM4IDE1NCAyNyAxMTQgNjEgMTUzIDkwIDY2IDk4IDc2IDUwIDE1OCA0OCAzOSA4MiAxMjMgMjIgMTQ3IDEzNiAxMTQgNTIgCiszNyAzNSA3NSA0MSAxNSAxNTAgNjAgNTIgNTUgMTAzIDIxIDIzIDEyOSA5NSAyNCA3MSA0NyA5NyAxMzAgNTAgMTQwIDE0NCAxMDYgMTAwIAorOSA2NCAxOSAxMTcgMTIyIDcxIDkyIDggNzcgMTU2IDk3IDEyMSA5OCA4NSAyIDM2IDM5IDEwOSAxNDMgMjMgMTIwIDE1NiAxMzMgOTMgCisxNTQgMzYgNjYgMTE2IDEzMSAxNjAgMTI3IDE2MiAxNjEgNDYgMTQyIDE0IDE0MSA4MSAxNDEgNjMgODYgMTE3IDEwNCAzIDE0NiAzOSAKKzEyNyAzNCAxMzMgMTAyIDEwNiA5MSA1NyA5IDI4IDYwIDYxIDcgMTU4IDEyIDgwIDI2IDggMTIyIDgwIDQ0IDYzIDY4IDQ5IDE1OCAyMSAKKzMyIDgxIDE1MCAxNSAxNDEgMTA4IDE2MSA2NCA0NiAxMjQgMTIzIDMxIDk5IDI3IDEwNSAxMDkgOTggMTEyIDE0NCBeCiszMzYgMSAzNCAxNjEgMTA3IDE0OSA0OCA2NyAxMzggMTA5IDE1NiAxMDQgMzcgMTMzIDYwIDgwIDg0IDgxIDE2MCA5IDE2IDk2IDE2NCAxIAorOTUgMTEyIDQgODYgMTYzIDExNiA5OCAxMDMgNTUgMzEgOCA1NiAzNyAzNiAxMjcgMzIgOSA4OSAxMDMgMzEgMTAwIDE2MSA4NSAxMDYgCisxMTkgODkgMTU0IDQzIDExNSAxNjIgMTM3IDEwOCAxMjggMzggNDIgMTU1IDEwMyA5IDYyIDY1IDEwMiAxMjIgMTAgMTM4IDE2MCAxMjUgCis0NyAxNTggNDMgOTEgNjkgMTIzIDEzMiAzNSAxMjEgNCAxMTAgODkgMTMwIDY5IDI5IDEzOSA2OSA1MyA3MCA4MyAyOSAxNjMgNjcgNDEgCis5IDEwOCAzNCA0NSA3NiA4NyAyIDE0NCAxNjQgOTggMzMgMTYwIDc5IDc4IDQ4IDg5IDkgMzggMTM0IDkzIDE0NiA3OSA1NCAxMjIgODAgCiszOCAxMTIgNTUgNTUgMTAxIDcwIDggMTI5IDQ0IDcwIDU5IDk4IDE0OSAyNCAxMzYgMTI0IDEzOCA2MyAyNSAxNjYgODMgNTEgMzQgOTEgCis0NSAzMCAxMTggNTkgMjggODcgNzIgNDQgMTE2IDI4IDM2IDEwMyAxMDEgMTEzIDEwIDExNCA2MiAxMTEgNzEgNjUgMTI2IDUzIDE5IAorMTE0IDg2IDQyIDg1IDM2IDU3IDEzNyA1NyAxNTkgOTUgODggNzggNzIgMjAgMjMgMTQgNjUgMTAgMjIgMTI5IDY4IDEgNjggNzQgNzUgCisxMDggNyA3IDE0NyAxMDkgMTMgMzUgNTEgMTA0IDE1OCAxNjQgMTIyIDEyNiAyIDUwIDQgMTMyIDEyNyA1OSA1MiAxMyA4MSAyMCA0NyAKKzEwNyA3NCAxNDggMTE1IDQ2IDEwNiA0NiA4MiAxMTUgNjggMTQ0IDE0MiA2MCAxMDQgMTUgOTAgMTM2IDEwMiAxMDAgMTM0IDQyIDE1IAorMTQxIDEwMCA0MCA0OSA0OSA3MyAxNjYgMTMgMTU2IDgyIDE2NiAzNyA4MiA5NiAxMzcgMTMwIDE2NiAxMzQgMjAgMTM5IDQ1IDEyMiA1NiAKKzEwNyA5OCA3OSAxMjQgMTcgMzIgMTMwIDEyMCAxNjUgNzcgMjMgMTMwIDk2IDY3IDY4IDQ3IDM3IDEyIDI5IDE4IDM4IDE1OCAxOSAxNjAgCis1NSAxNDcgMzkgMTE4IDgzIDEyMSA5NiA0MyAxMzcgMzMgNjYgODYgMTEyIDE0NyAxNTUgMTQ5IDE0MCA1IDE5IDE3IDE0OCAxNjEgMTAgCis0NCAxNTkgMTQ2IDU3IDE2IDI2IDEwMiA0OSAzIDEwNCA2MSA1OSA3NCA1NiAxMCAxNjUgMzEgNTQgMjUgMTQyIDE1NyAzNyA1OCAxNjUgCisxMjggMTU0IDczIDUwIDE0OSA5NCAxMzcgXgorMzMwIDEgNjEgNTEgNjUgMTMyIDIzIDE2OSAxMTYgMTIyIDE0IDY2IDcgOTggMTMxIDcyIDY5IDEyNyA3MiAxNjMgMTI1IDY4IDY5IDUxIAorNDcgMTU5IDMxIDE2NCA3MSAxMTggNTAgODMgMTEzIDgxIDEyNyAxNTMgNDUgMTM3IDEzNCAxMjEgNjggMTYzIDI2IDQzIDY1IDEyNyAKKzE2NiAxMzggOTggMTQ0IDE4IDUzIDEzNyAxMzkgMTQ4IDc2IDE1OCA0IDYyIDc4IDE2NyAxMDIgMTQ0IDk0IDU1IDE0MSA2MyAyOSA5NyAKKzkxIDI0IDExNSAxNjYgODAgNjkgMTMyIDk5IDEgMTIwIDIzIDg4IDY0IDg3IDExOCAzNyAxMzcgMTUyIDk0IDYwIDE2OCA3MSA0NyA1MiAKKzExMCAzNyAxNTUgMTI1IDYzIDQyIDQzIDUyIDExIDEyIDE1MSAzMSAxMiA0NCAxMTAgMzIgMTI4IDExNyA2OCA4NyAyNCAzOSAxNjQgNzYgCisxNDUgNTggMTAxIDkxIDEwMCAxNDAgMTUxIDE0MyAxMzAgMzIgMjEgMyAxMTEgMSAzMSA3NSAxMjMgMTUzIDExNiAxMzUgMTMwIDI3IAorMTY0IDE2NSAxMTYgMjMgMTIgNjIgODMgMjQgMTMzIDEzOSA0OSA3NCAxNTQgODAgMTU4IDgwIDY0IDEwNSA5MSA2IDE0MiAyNyA3NSAyNCAKKzEyOCAxMTIgNDEgNzkgMjkgODQgMTQ1IDQwIDEyOCA5OSA5NSA5NSAxOSAxNyAxNjAgODkgMTUgMTcgODQgNjQgMTEgOTMgMTAgNjYgNzggCis3MyAxMjcgMTQ4IDE4IDEyOSAxMzkgMTQzIDQ5IDE1MCA5IDg0IDgyIDE1NCA4NSAxNSA4OCA4MiA2MCA4NyAxOSAxMiAxMzMgNTggMjAgCiszOSA2NSA1MSAxNDEgMTM0IDI3IDcwIDE2NyAxMjAgMTE3IDg2IDYwIDE2IDQ0IDE2IDU3IDEzMiAxOCAxNDIgODUgMTA0IDU5IDQ3IAorMTQxIDU4IDIgNjYgOTYgNDYgMTE5IDE1MyA0MCAxMTAgMTI2IDEwMyA5MCAxNDQgMTMgMjYgMTA2IDE0NCA4MCAxNDUgMTM0IDEwMyA5NSAKKzI0IDQ0IDIxIDg0IDE0MCAxMyA5NyAxMDQgMTQwIDk5IDYgMTQ3IDU0IDgzIDQyIDEwNiAxMzEgNTQgOTYgMTM1IDY3IDExOCAxMjEgODEgCisxMDkgMTAgNTMgMTMyIDExMiAxMTcgODEgMzMgMTU1IDQ5IDYxIDM4IDExOSAxIDEzIDEwMiAxMzEgMTQ4IDk0IDEzMSAxNDMgNjcgMTIzIAorMTQ4IDg5IDEwNCAxMzUgNzIgMTQ1IDE1MiA3NiA4NyA2IDY2IDIgNzEgMTIzIDc3IDExNCAxMDggNTkgMTIzIDE2NiA2MiA5NiAxNDAgCis5NCAxNDkgMTE2IDE2OSBeCiszNDkgMCAxMjUgMTcgOTMgODIgODAgMTEwIDE1NiAxNDcgMTU2IDk5IDE1NCA0IDI5IDkwIDE2MyAxMjAgODQgMTEzIDU2IDggMTU3IDI5IAorNjEgMTY5IDE0MSAxMTMgNzggNDggNTAgMTMgMTM4IDExIDUwIDYxIDk5IDEwNiAyIDEwNyA2IDExNyA4MSAxMTQgMzQgNDkgMTEyIDUyIAorMTMwIDgyIDczIDEwOCAyMCAyMiAxMTAgNjAgMTEgOTggMjIgNjIgNTggNDggMTQ2IDE0OSAyMyA4OCAxNDIgMTM5IDEyMSA5MSAxNiAKKzE2MyAyIDg4IDE3MSAxMzMgMTAwIDYyIDUxIDQ2IDEwIDI0IDE1MCA0OSAxMzEgNjAgMTE0IDYzIDg0IDkxIDY0IDE2NSAxMzggNDAgNDQgCisxNzIgMTExIDE0MSA1OCA3NCAxMTUgOTYgMTI5IDE0NSAxNjQgMTUzIDE3MCAxMjYgMjQgMTY5IDE2IDExNSA0MSAxMjUgNDYgODcgNjEgCis5MiAxNDUgMzkgMTU1IDkyIDc4IDcwIDM1IDI3IDIxIDQ4IDIxIDE1MSAxNTkgNDAgMTUgNSAxMzIgMTcwIDIzIDE4IDEwNyAxNjAgMTUwIAorNTYgMTMzIDIzIDY2IDEwOSAxMjMgMTAyIDEwMiAxNzIgMTY2IDE0NSAxMTYgMTUxIDM0IDEgMTUxIDEzMCA1IDM2IDM0IDk3IDExNCAxNSAKKzgyIDEyOCAxMTIgMTE5IDk5IDI5IDEzOCAxNjUgNDIgMzYgMTU5IDk1IDE5IDYzIDM2IDg5IDEwMSA0MCA5MiAxIDMzIDkzIDEwNCAxMTMgCisxMjYgMiAxMzYgOTYgNTIgMTA4IDkwIDU3IDg5IDMxIDUgMTEzIDMwIDM5IDM3IDk2IDQgMTQ3IDEyNyAxMDUgNDMgMTY1IDM1IDc1IDIzIAorMTQzIDEwNSAyNCAyNSAxMCA5NCAxMiAxNjAgMTAyIDk1IDE3MCA3MSAyMCA3MCAxMTIgMjMgOTUgMTQ0IDYxIDczIDEzNyA1NSAxIDgxIAorOTUgMjYgNjUgMTcyIDQxIDE0NyA3OSAxMDMgODAgNDAgMTIxIDM2IDEyIDY0IDk4IDE2OSA5MyAxMTEgMTE1IDQ4IDEyNyA5IDM5IDEwNyAKKzEzMSAxMTUgMTE4IDE2MiAxNjEgMTAgMTQyIDE0IDEyMyA1NCAxNDEgMzYgNDEgOTkgNzcgMTQwIDEyOCAxNjcgODIgMjUgMTA2IDU3IAorNzAgNjQgMjEgMTkgMTUgMzQgMTI2IDE0OSAxNjcgNTMgMTYzIDEyNyA4NiAzNSA4IDU0IDIzIDQwIDE0MCAzIDE2OSA0NSAxNTAgMTUyIAorOTYgODEgMTQzIDI4IDI4IDEyNCA4NyAxMyA5MCA5IDg3IDEwOSA1MyA2NyAxNjQgMjggMTMxIDg5IDE0OSA0MiA1NSAxMjYgNzkgMTMyIAorNzQgMTkgMTMzIDMwIDY4IDcyIDc1IDE0OCA5IDEwIDcyIDE1MiAxNDQgODMgMTA2IDE1MyA3NCAxNjMgOTggMTUyIF4KKzM3NSAxIDk0IDI4IDEzIDggMjAgMjggMTggMTE4IDUgMTQwIDg5IDY3IDE3MSA2NCAxNTIgODUgNjEgMTAxIDgwIDE1NCAxNDkgMzQgCisxMTUgMTM1IDEyOCAxMDggMTEwIDIwIDMzIDEyOCAxMDMgMzUgMzggNTcgOTUgMTAgMTExIDE1MSA5OCAyOSAxNDkgNyA4MiA2OSA5NiAKKzExNCAyNiAxMDMgMTcxIDEwMSA1MyAxMjEgMjQgMiAxMjEgNTEgMzUgNzAgODMgMjkgMTU0IDY3IDUgMTY3IDYzIDE2IDI3IDU4IDYwIDIgCis5OSAxMjggNzEgMzMgMTYwIDcwIDUxIDMgNDQgMTQ5IDIgODkgODQgMTAxIDQzIDE4IDExMyA3MSAzOCA5NCA1NSA0NiA3NCA1MiAxMzkgCisxMDIgMzUgNDMgNTAgODAgMTIyIDYgMTAwIDg4IDEyOSAzNiAyNSAxNDggNDcgMjQgNyA1NSAzNiAzMCA4MiAzMiAxOSA3OCA2MyAyNiAKKzcxIDI4IDE2NyA4NSA1NiAxNjcgOTUgMTU5IDc4IDI2IDY2IDM1IDY1IDkwIDQ0IDE1OSAxMDUgNTkgMTUgNjcgNTcgMTM3IDIxIDEzMiAKKzUwIDcwIDc4IDM2IDE2OSA1IDE3MiA1NiAxIDIyIDEyOSA2OCAxNjggMjMgNzQgMzAgOTkgMTM4IDE3NCAxMjAgOTEgMTUzIDggNDIgNjggCisxNTggMTU1IDEwNCA5OSAxMzMgNSAxMzUgOTYgODIgNTkgNTIgMTQ0IDM2IDIwIDM4IDYyIDI5IDExMiAxMDYgNDYgMTA2IDE5IDczIDcwIAorNDEgMTM1IDEzMyA0MiA5NSAxNSA0NSAxMzYgOTMgMTAwIDk4IDE3MyA2IDEzMiA1NSA0IDQgMzEgNjQgMTMwIDE2MiAxNTYgNjQgMTU3IAorMTkgNDYgOTYgOTIgMTAzIDEzOSAxMzQgMiA5NCAxOCA4NiAzOCA4OSA2MiA2MSA3OSAxNTcgMTQgMTEyIDExMSAxNTYgMzIgMTQgODUgCis3OCAzMSA1OSAyMCAxIDE2MSAxNjkgMTQ5IDI5IDEyMiAxNTAgMTMzIDM3IDEwMiAzMCAxMDkgNjUgODUgNTEgMTc0IDExMCAxNjQgNjYgCis3NyA3NiAxMTEgMTE5IDEzMSA5NSA1IDEgMTY2IDEwMyAxMzQgMTQxIDE3IDE1OCAxMjMgMTM3IDQ4IDE2NSAxNzUgMTAyIDEzIDMgODYgCis0MyAyMyA0NyA1NiAxNTAgMTY1IDQgMzYgMTc0IDExNSAxNTcgMTY4IDEzIDE0NyAxMTkgMTA5IDU1IDQxIDE0MCA2NyAyNyAzMSAyNyAKKzUzIDEyNiAxNyAxNjMgMTE2IDEyMiAxNjAgNjAgNyA5MiAxMTMgNjYgNDUgMTA5IDYwIDE1MSAxMjUgNjIgMzkgMzkgMTcgMTUzIDEzIAorMTUyIDUzIDk0IDUwIDUzIDg5IDU3IDEyNyAxNTMgNDUgMTE5IDEwNCAxMjEgNTYgMTQ1IDE3MiAxOSA0MSAxMDMgMTY2IDEwOCA2OCAKKzEyNiAxMiA1MyAxMzEgMTI3IDE0OCA1MiAxMzQgMTY4IDUwIDQ4IDE1NSA3MiAxMzIgODIgMzcgMTI5IDYzIDE3NSAxNjAgXgorMzY2IDEgNzMgMTUgNzkgMTM5IDcxIDUxIDEzMiA4MSAxMzUgMTExIDE2NiA2MSAzNyA2MCAxMTggMzcgOTIgMTM0IDk0IDYwIDE1MCA1MyAKKzQ3IDI1IDExMCAxOSAxMzcgMTA3IDI3IDE3NiA0MyAxNiAxNDUgMTQ2IDE0MiAxNjUgMTIgMTcgOTIgMTY2IDExMCAxMTcgNDEgNjkgNiAKKzEyIDE2NCA3NiAxMDkgNDAgMTAxIDgyIDgyIDEzMSAxMzQgMTE1IDE0MyAxMTIgMzIgMTY0IDE0NiA5MyAxNjIgMzEgNjYgMTIzIDE0NCAKKzgwIDEzNSA5NCAxMzcgMTU2IDEwNyAxNTcgMTczIDYyIDY1IDE3NiAxMjQgMTEyIDQgNjUgMTI3IDQ0IDEzMSA1MyAxOSAxMDUgOTEgCisxNDkgMTA2IDI3IDU3IDE1OCA5MiA4NSAxNCA3OSAyMCA4NCAxMjcgMTc0IDEyOCA3MiA2OCA1OSAxNzEgMTcgMTI0IDgwIDE2NyA4IDU3IAorMjggMTcyIDY2IDE0NCA0OCA0MiAzNyAxMDkgMTIxIDE4IDEyMCAxMDMgMTE2IDEzIDEzMiAzOSA3MyAxNDUgNzYgMTU4IDQzIDgyIDMzIAorNTEgMTUzIDE2NCA5NyAxMyAyIDMgMjAgMjQgMTE0IDk4IDkgMjUgMTMxIDEwMiA5OSA4NiA0MiAxNiAyNiAxNTkgMzkgMTA1IDE2MSAKKzEzMyA0OSA1OSA0MSAyMCAxMDUgMzEgMTM2IDMwIDg3IDEwIDExOSAxMzUgMTMgODMgOTkgNTggNDUgOTkgMTU2IDI2IDYxIDEzNSAxNDMgCis4MCAxMTggMTA3IDc2IDc3IDI0IDQ0IDEyIDY2IDk1IDE0NyA2MSA4NiAxNDAgOTkgMTY3IDEzOCA1NCA0NyA0MiA5NyAxMjIgMTggNjAgCis5MCA0MCA3MyA4NSA2MyA4MiAxIDM1IDk2IDk0IDgxIDU0IDE1IDEyOCA0MCA1MiAyIDEwMSAxIDE2NSA5MyAxMTMgMTMwIDg1IDk1IDk4IAorNTggMTA1IDExMiA1MyA2OCAxMDggNzIgMTAwIDE1MiA0OSA4NyAxNDAgMzkgMTU0IDYyIDExNCA3NyAxMDUgNjMgNTAgODcgMTU3IDI2IAorNzggMTIyIDY3IDE0MCA3MSAxNzAgMTE5IDUgOTMgNjQgNTAgMTA0IDE0NCAxMjkgMTM4IDc1IDEzMCA0IDE3OCA2MCAxMzkgMTIwIDU0IAorMTEzIDMyIDIgMTMzIDE3IDQzIDE2MyAxMjkgODkgNzIgMTQ5IDE1NSAzMCAzOCA3IDEzOCA1IDQ0IDYxIDY5IDc2IDE3NSAxMDcgNiA5MyAKKzgxIDExNCAyOCAyNSA4MiAyMiAxMTggNTggNzMgOTYgMTc1IDE3NyA5MiAzNiAxMSA5OCAxNzEgMzggMjggNDIgMTQ2IDEyNSAxNzggODggCisxMzYgMTM5IDEwMyA2NyAxMCAxNTEgMTUxIDcwIDE1MyAxMTUgOTQgMzIgNTEgMzQgMTc3IDE3MyAxMzIgNDkgMTE5IDU0IDk2IDQ1IDc4IAorNzMgNjQgMTU5IDEyMCAyMiAyMCAxNTQgMTExIDExNyA1OCA1NiAxMDkgNzIgMTQzIF4KKzM3MiAxIDEzNiAxNDYgMTQ0IDE3MCA5MCAxNSAxNjkgMTgwIDg4IDQxIDg5IDEwIDYwIDUyIDkyIDE0NSAyMSAxNTUgNDcgNDIgNjEgMjYgCisxOCAxNzYgNDggMjEgMTI0IDE0MSA0MCAxNzkgMTc4IDExNCAxNDMgMTQgMTY0IDcxIDE0MiAxMzIgMTEgMTI0IDIzIDM5IDgyIDExNCAKKzg0IDU3IDE2MyAxMzAgMTI3IDg5IDEzMyAxNiAxMzggMTUxIDEzMCAxNjAgMzQgNzAgNzggMTYxIDY0IDkyIDExMiAxMTAgNzIgMTc1IAorMTAyIDEzOCAxNzkgMTczIDE1OSA1OSAxOSAyNyAxOCA1MyA5MiAyMiA2NSAxNTYgMTcwIDU3IDEwNCA4NiAxMjYgMTQ4IDExOCAxNTUgCis3OCA0MyA2MyA5MCA0OCA4MCAxNjggMTQyIDY4IDEyIDM5IDE3NCA2OSAxNjggMTQ3IDExOCA5NiAzNCAxMjkgMzUgNzUgNSAxMDcgNjAgCisxNzAgMTgwIDE0NyA4NSAzIDEzMyA3NSA5NSAxNTIgNzEgMTc1IDQzIDk0IDE3OCA1MCAxNDQgMTYgNDYgMTAxIDQ2IDE2NSA0NSA2OCAKKzE2MyAzOCAxNzIgNSAxMzggNjEgODUgNjIgMTc3IDc2IDM2IDE2NyAxOSA1MyAxNTEgNjYgNjYgOTcgMyAxMDAgMTY0IDEyIDk4IDEzMSAKKzcwIDEwOSAxNjIgMTYxIDE1NiAxNDIgMTQgMTA1IDI3IDE0MSA5IDE3OCA4MSA1MCAxMTMgMTEwIDEzMSAzNyAxNiA3OSAxMiAzNCAzNyAKKzE2NyAxNzMgMTAgMTUyIDcgODEgMTQwIDE1OCAyNiAxMzYgODIgNTAgMTcyIDE1NCA0NSAxNjAgMzEgMTIyIDE2NyAxNDIgOSAxNTAgCisxMjUgNTEgNTQgMTI1IDE3NCAxMCAxMjQgNTEgMTc3IDgxIDE3MyA2OSAxMDkgOCAyMiAxNTUgMTkgODYgNjIgMTQ5IDMzIDM3IDEwOCAKKzM0IDk2IDI5IDE3NCAxMzMgMTY3IDUwIDU0IDY2IDEzMCA5IDEgMzYgMTM0IDEwOCA2NSA5NyAxMjYgNTYgMTYzIDcxIDgzIDg4IDEwIDEgCis4IDE3OCAyMiA2IDExMiAxNjkgMTE2IDg5IDQzIDE1MyA0MCAxNDYgODUgMzEgODkgNzQgMTU0IDEzNyAyOCAxMTUgMTE3IDEyMiAxMDggCis5OCA4IDI3IDExMCAxMDMgMTc2IDE3IDIwIDI3IDc3IDEwIDkzIDE0NSA4MCAxNyAxNDMgMTY1IDc2IDY5IDc4IDEwMiAyMCA5MSAxNzEgCis5NSAyOSAxMTUgMTc2IDE2NiAxMDkgMzkgMjMgNzAgODMgMjkgMTQ4IDY3IDE2MyAxNjEgMzMgNCAxNSA0NiA0MiAyIDY5IDEwNCA1MyAKKzMzIDE2MCA2NCAzMyAxNTUgMTQgMTMxIDE2MCA1OSA3OCA3MSAxOSAxNzYgMTA3IDY1IDM4IDgyIDU1IDQwIDU2IDQwIDExNSA4NCAyOSAKKzI1IDQ0IDY4IDEwNCAxNzYgNzYgNjQgMTIzIDE4IDI1IDEzNiAyMyA2IDE3MSAzMSAzMCAzMCA1OCAxNCAxMyA3MiA1NyAxNCA0MSAxNzcgCiteCiszNjMgMCAxMzUgNjkgMTYgMTY3IDc5IDE0MyA0NiAxNzggMjYgMyA2NSA1OCAzNiAxMzUgOTcgMzUgMTc1IDUxIDE1MiA1NyAxMzcgMTczIAorMTA4IDEwIDU0IDc4IDQgMTUzIDE3MyAxNjQgNDggMTc3IDIyIDEyOSA2OCAxNjggMTY3IDc0IDE3NCA5MSAxMDYgMTc0IDk2IDc1IDEyOSAKKzE2OCAzNCAzNiAxNTggMTQ3IDg4IDc1IDEwMSAxNDkgMTAzIDY0IDQyIDU5IDUyIDExMiAxODAgMjAgMzAgMjIgMTczIDgwIDk4IDQ2IAorMTA2IDE3OSA2NSAzMCAxNyAxMjcgMTI1IDI2IDg3IDE1IDUgMTM2IDg1IDEwMCA2NiAxNDEgMTgyIDEyNCAxNSAxNTYgMTQ4IDE1IDU2IAorOTggMTQ2IDE1NiA0OCAxNDkgMyAxNCA5NiA1MiA3OSAxMTUgMTM0IDE3MCA1NCAxNzggNTQgMjIgNzMgMzAgNDUgMzkgMTMzIDE4MiA5NiAKKzEwMyAxNDggMTc2IDYgNDUgNjIgMTgzIDUxIDE4MCAxNTMgMTQ1IDE0NSAxMTcgMjEgOTAgMTE4IDEwOSAyMSA2MiAyMiAxMDEgNDkgNTMgCisxMSAxNDIgODYgMTMyIDY2IDY5IDQ0IDc5IDg3IDExNSA1NSA1IDE2OSAxNTAgNjMgMTEwIDEwOSAxNzcgMTUwIDkxIDEyOSA0MCAxNDkgCisxNTkgMTAyIDE2NSAzIDcwIDI3IDE3NSAyMyA1NiAxMjYgMTY1IDE2NCAyMCAxNTggOTEgMTU3IDEzNiAxNTcgMTMxIDExMSA2OSAzOSAKKzMzIDEzMiA0MyAxOSAxNzUgMTc5IDM3IDExOCA5IDE1NSAxMTYgMTIyIDEyOCA1MiA3IDg0IDg5IDU4IDEzIDg1IDQ0IDEzNSAxMjUgNTQgCisxODMgMjMgMTYxIDE0NSAxNzMgMTM2IDI5IDYyIDUwIDEzIDU3IDI1IDEyNyAxNTMgNDUgOTUgNjQgMTIxIDQwIDEyMSAxNDAgMTcxIDkgCis3MSAxNjYgNjggMjggMTAyIDQgNTMgMTIzIDExMSAxNDggMjAgMTAyIDE2MCAzNCA4IDEzOSAzMiAxMTYgNjYgMTMgMTEzIDYzIDE0MyAKKzk3IDYzIDEwIDU5IDEyNCA2NiA0MSAxMzIgNzEgMTE1IDEwNiAxNTEgNDYgMjIgNDUgMTE4IDM3IDY3IDEyNCA5NCA2MCAxNDAgNDMgNDcgCisxMCAxMTAgOSAxMjcgOTcgNyAxNTYgNDMgMTgwIDEyNSAxMjYgMTM3IDE0NSAxMiAyIDgyIDE0NiAxMDAgMTE3IDI2IDU5IDE4MCAxODEgCisxNjQgNzYgODkgMzAgMTAxIDc3IDcyIDEyNiAxMTQgOTUgMTQzIDEwMiAzMiAxNDkgMTMxIDgzIDE1NyAzMSA2MSAxMjMgMTM5IDYwIAorMTM1IDc0IDE2OSAxMjIgMTUxIDEwMiAxMzcgMTY4IDYyIDU1IDE2NiAxMTkgOTcgMTYzIDYwIDExMiAyNCAxMTYgMzggMTc4IDEwNSA5MSAKKzEzNCA4NiAyNyA0NyAxMzggNzIgNzAgMTgzIDc5IDE1IDg0IDExNyAxNTQgMTI4IDU3IDUzIDM5IDE2MSA4OCBeCiszOTMgMSA5MiA3MiAxNTEgMzMgMTgzIDE2NCA0MiAxMTIgMzIgMTAgNSA5MyA5NyAxOCAxMTIgNzEgOTIgMTY4IDExNiAxNzkgMTg2IDY1IAorMTM3IDY4IDEzNCAzIDgyIDkgMTkgMTIxIDE0OCA2NSAxNjAgMTczIDE1OCAxNjcgOTAgNjYgMTgwIDE3MiA5OSA4NiA4MyA4NiAyNiAxNiAKKzEwIDEzNSAyMyA4MSAxMzcgMTI1IDE3IDE5IDI1IDE4MyA3MyA3IDEwNCAxODUgNzkgMTY1IDExOSAxMTkgMTc2IDU5IDc1IDE4IDUgNTkgCisxMzIgMjYgMjEgMTI3IDExOSA4MCA5NCA4MyA1MiA2MSAyNCA0NCA0IDUwIDU1IDExNSAyOSA3MCAxNDAgOTkgMTU5IDEzMCA1NCAxNSAKKzQyIDg5IDExNCAxNzMgMjggNTAgMTYgMzMgNTMgNDcgNTggMTgwIDE5IDY0IDc4IDQ5IDMwIDE4NiAxMDQgMzIgNDQgMTU3IDg1IDEgCisxNDkgODUgOTcgMTE0IDc3IDYzIDU4IDUwIDg5IDgwIDIxIDM2IDg0IDcyIDYwIDE1MiAyNSA4NyAxMDggMTUgMTM4IDU0IDEwNiA3NyAKKzk3IDIzIDQyIDU1IDE0OSAxODEgNjIgMTA2IDQzIDEzMiAzMSAxMzggMTExIDE3NiA5MyA0MCAxMCA5NiAxMjggMTA1IDExNCA0MyA5OCAKKzQgMTQ2IDIwIDEwNyAxMjAgMTQgMTEzIDE4MSAxMDEgMSAxOSAxNTUgMTEzIDU3IDY0IDExNyAxMzEgNiAyMiAxODYgMTM4IDE4NCAzNiAKKzYxIDI5IDM2IDE3NSAxMDcgNiA2MSA4MSAxMTQgMjAgMTgwIDQyIDE2OSAxMDIgMjYgNzMgODAgMTUxIDE1MyA2OCA0IDExIDk4IDEzOSAKKzYgMTc1IDM0IDE0NiA5MyAxNTQgODggMTI4IDEzOSA3OSAzNSAyIDEzNSAxMTkgNDYgMTI5IDkxIDg2IDE3OSA1MSAxOCAxNjkgMTQxIAorMTA4IDQ5IDEwMyA0NiA3MiAyMSA3MCA0OSA2NCAxNTEgOTYgMTg1IDE3NSAxMzAgMTExIDg1IDU4IDMyIDEwMSA0MCAxMDEgMTMxIDEzNiAKKzEzOSAxNzAgNzAgMTAgMTY5IDE3NSA3MyA0MSA2OSAxNzcgNDUgNDcgOTIgMTQ1IDExIDE1NSAyMiAyMiA1NiAyMSAxMyAxNjYgNDggMjEgCisxMDkgMTMxIDQwIDE3NCAxNzggMTA0IDEyOCA5IDE0OSA1MSAxMzIgMTIyIDE3MyAxMTkgMjMgMjQgNjcgMTA5IDc0IDMyIDE1OCAxMTAgCisxMTcgNzQgMTIzIDYgMTE4IDE1MSAxMzAgMTUwIDE2NyAzNCA1NSA1OCAxNDYgNTQgNzIgMTEyIDEwNSA1NyAxNjAgODIgMTIzIDE1OSAKKzE1MyAxNTkgMzkgMTkgNyA4IDMzIDg3IDEyIDUwIDE0NiAxNTAgMzcgMTA0IDcxIDEyNiAxMzMgMTA4IDE0NSA2OCAzOCAzOCA5MCA0MyAKKzc1IDE0OCAxMjIgNDMgMiAzOSAxNTQgNTQgMTYzIDE0NyAxMTMgOTEgMjkgMTA5IDM1IDc1IDE4MiA4NyAzNSAxNTUgMTcwIDEyNyA4MCAKKzE4NSAxMTggNjAgOTUgMTQyIDcxIDE2NSAyOCA4NCAxNjggMjUgMTQ0IDE3OCAzMSA4MSA0MSAxNjAgMjUgNTMgMTQzIF4KKzM4MSAxIDE0IDE3MiAxNjMgMTMwIDQ1IDY5IDQ2IDE0NSAzNiAzNiAxNTEgMTY5IDEzIDEzNSA0MiAyNiA4MSAxNTMgNzYgMTQ4IDE3OCAKKzkwIDEzMSAzMCAxMDEgMTYyIDE2MSAxMzIgMTQyIDE0IDg5IDMgMTQxIDE3NSAxNDYgNjUgMjYgODkgOTQgOTkgMTg3IDggNTUgMTYyIDIgCisxMyAxNDMgMTczIDIgMTIwIDE3MyA0MSAxMzIgMTUwIDIgMTEyIDQyIDE4IDE0MCAxMzAgMzcgMTI4IDIzIDEwNiAxNTkgMTE4IDE2NyAKKzE1MCAxMDEgMTEgMzAgMTA5IDE1MCAxODQgMTI0IDE5IDE2OSA3MyAxNjUgNTMgMTA5IDE1OCAxNzIgMTQ3IDExIDQ2IDM4IDE0OSAyNSAKKzIxIDkyIDE4NCA2NCAxNzkgMTU4IDEzMyAxMzUgMzQgMzggNTggMTE0IDkgMTgzIDQgMTE4IDc2IDQ5IDg5IDEwMiA0MCAxNjMgNDcgNzUgCis4MCAxNzYgMTc1IDggMTU0IDE0IDE4MCAxMDQgMTUzIDg0IDg5IDExIDEyOSA4IDEzOCA4NSAxODEgNzMgNjYgMTU0IDEyMSAyMCAxMTUgCis5MyAxMTQgMTA4IDgyIDE4MiAxOSA4NiAxMDMgMTc2IDE4MyAxODYgMTc3IDUzIDEwIDY5IDEzNyA1NiAxIDEzNSAxNDEgNjggNjkgNTQgCis4NiAxMiA3NSAxNzEgODcgMTg3IDEwNyAxNDQgMTUwIDkzIDIzIDcgNzAgODMgMjkgMTQwIDY3IDEzOSAxNTMgMTgzIDE3OCAxODkgMzAgCisxOCAyIDI5IDcyIDI5IDMzIDE2MCA1NiA5IDEyMyAxNjQgMTA3IDEzNiAxOSA3MCAzMSAxNzcgMTUyIDk5IDU3IDM4IDY2IDU1IDMyIDMyIAorMjQgODMgNjAgMjEgMSAzNiA1MiA4MCAxNjggNDQgMzIgMTE1IDE4NCAyNSAxMjAgMTgxIDE3MiAxNTUgMTg5IDIyIDMwIDI2IDE4MCA1IAorNjQgNDkgMTg4IDEgMjggMTExIDU3IDE3NiAxNjcgNjcgMTMxIDIyIDE2MCAxODYgMTY5IDY1IDM0IDMwIDExNyA5MSAxNyAxNjMgMzkgCisxMzQgNTcgMTM3IDE1NSA5MCAxNzAgNDIgNzggMTcwIDE0MSAxNjcgMTU4IDQyIDE3NyAyMiAxMjkgNjggMTY4IDE0MyA3NCAxNTAgODUgCis4MiAxNzQgNzggNjMgMTExIDE1NiAyOCAxMiAxNTggMTQxIDc2IDU3IDc3IDEyNSA3OSA0MCAxMiA1OSA1MiA4OCAxNTYgMjAgMjQgMTgyIAorMTQ5IDU2IDkyIDQ2IDEwNiAxNjcgNTkgMTg5IDEyMSAxMTkgMTQgODEgMTUgMTY1IDEzNiA3OSAxMDAgNDIgMTE3IDE4MiAxMTggMTc1IAorMTM4IDEyNCAzIDUwIDc0IDEzNCAxNTYgMzYgMTQzIDE4MSAxODAgOTYgMjIgNjEgOTcgMTM0IDE2NCAyNCAxNjYgMzAgMTAgNjEgNiAzMyAKKzkgMTE1IDE3NiA4NCA5NyAxNDIgMTUyIDE1IDUwIDE2NSA0NSAxNjggMTM1IDEzMyAxMjcgOTMgMTUgNjYgOTQgOTEgOSAzMiAxNiA5NSAKKzM3IDI5IDE3MSAxMTggNjggMTA4IDY2IDYzIDIwIDU1IDE4NiBeCiszOTYgMSA5NyAxMCA1IDE2MCAxMzIgMTggODMgNzMgMTU5IDE0MSA1NSAxMjAgMzEgMTMxIDE0MSAxMDIgMTM4IDMgNTIgOSAxNDggMTg5IAorNTYgOTkgMTY1IDE0NiAyIDE0MCA2NCAxNTcgMTAwIDEyMSAxMTMgMTAyIDI0IDIxIDI0IDEyMyAxNiAxMCAxMzkgMTUyIDE5IDEwOSAKKzE0NiAxMTYgMTIyIDkyIDQzIDcgNzUgNjIgNDkgMTcwIDU4IDI2IDExNyAxMjUgNDUgMTQ3IDUgMTI1IDEzNiAxNTUgMTE4IDIgMjYgNTAgCisxNjEgMjEgMTgyIDEyNyAxNTMgNDUgNjggMTkgMTIxIDIyIDk0IDEwNCAxNDQgMTY2IDM1IDE2NiAyMyAxNzYgNzUgMTg4IDUzIDExNCAKKzkzIDE0OCAxNzcgNjYgMTUxIDE2IDE1NiAxMjEgMTgwIDk4IDQ4IDE3OSA5NSA2MyAxMDcgOTcgNDUgMSAyMyA5NyA1NyAyMyAxMzIgNTMgCis3OSA5NyAxMjQgMTkgMTg4IDE4IDExOCAzNyAyMiAxMDYgOTQgNjAgMTIyIDI1IDQ3IDE3NiAxMTAgMTg0IDEwOSA3OSAxNjQgMTIwIDQzIAorMTUzIDg5IDkwIDEyOCAxMDkgMTIgMTY4IDY0IDExMCA4MiAxMTcgMTkyIDQxIDE3MSAxNjMgMTY0IDc2IDUzIDEyIDEwMSA2OCA1NCAKKzExNyA3OCA1OSAxNDMgODQgMzIgMTIyIDEwNCA2NSAxNDggMzEgNTIgMTIzIDEzMCAyNCAxMzUgMzggMTUxIDk1IDE0MiA5MyAxMDEgCisxNTkgNjIgMzcgMTQ4IDExMCA3MCAxMjcgNTEgODUgMTgxIDg5IDExIDE0MiAxMDUgOTEgMTA3IDUwIDI3IDI5IDEwMiAzNiA0MyAxNjUgCis3OSA2IDg0IDk5IDExOCAxMjggMzAgMjYgMyAxNDMgMTcgNjggNjYgMTM5IDE4NyAxNSAxNjUgMTU4IDI0IDg4IDIwIDE3OSAxNzQgODEgCis3OSAxOCAxMDYgNDcgNzQgMTUwIDEwNCAxNzkgMTYyIDU5IDEzMSA2MiAxMTYgMTY2IDgyIDE4NCAxODggOTcgMTM2IDQxIDEzNiAxNjcgCisxNDAgMTQzIDE3NSA3MiA0MiAxNzQgMTQ4IDc1IDc0IDcxIDg2IDE0IDE2IDE5MSAxMTcgMTEgNjMgMTE5IDExOSAxODYgMTgyIDEzIAorMTcxIDQ5IDE4MiA4MCAxNjcgNzMgMTQ3IDExOSAxMDcgMTY0IDQxIDU3IDE4MSAxNjggMjkgMTE0IDI2IDE4NCAxMjEgMTAxIDgwIDc2IAorNjUgMzQgNDkgMjQgNDQgMTkxIDM4IDI1IDkxIDUgNTggMTQwIDk5IDE1MyAxMjQgNTQgMTg0IDQyIDgzIDEwOCAxNTUgNCAyMCAxOTEgMyAKKzI5IDM1IDQwIDE4MCA3IDQwIDY2IDI1IDEyIDE4MCA4NiAyNiAzOCAxMzkgNzMgMSAxMzcgNzkgODUgMTAyIDcxIDM5IDI4IDQ0IDc3IAorNTYgMTkwIDEyIDY2IDcyIDMwIDE1MiA3IDg3IDg0IDE5MCAxMjYgNDggMTAwIDc3IDkxIDE4NiAzNiAzMSAxNDMgMTYzIDUwIDk0IDI1IAorMTI2IDEgMTE0IDEwNSAxNzAgOTMgMjIgMTczIDkwIDExNiA4NyA5NiAxOSA3NCA0IDEyMiAxODMgODMgMTIwIDE3NyAxMTMgMTY5IDE4MSAKKzc3IDE4MiAxIDE0OSAxODYgXgorMzg0IDEgMjUgNTYgODUgMTA3IDE3NyA2IDE4NiAxMzggMTg0IDI4IDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAxMiAxNTYgMiAKKzEzNyA4NiAxODkgNzMgNjQgMTI3IDEyOSA0NCAxNjcgMTEgOTggMTA3IDE2OSAxNDMgMjYgMTQ2IDYxIDEzMCA4OCAxMjAgMTM5IDU1IDMgCisxODkgMTE5IDg3IDIyIDEwNSA2NyA3OCAxNDcgNTEgMiAxNjEgMTA5IDg0IDQ5IDg3IDM4IDQ4IDE5MiA2MiAyNSA2NCAxNDMgNzIgMTY5IAorMTUxIDEwNiAxMTEgNTMgNTggOCA5MyA4IDg1IDEyMyAxMjAgMTMxIDE3MCAzOCAyIDE2OSAxNjcgNDkgNDEgMzcgMTUzIDIxIDM5IDkyIAorMTQ1IDE5MCAxNTUgMTc3IDE4NSA0OCAxMyA1IDE1MCA0OCAyMSA4NSAxMTUgNDAgMTY2IDE3OCA4OCAxMDQgMSAxMjUgMTkgMTE2IDEwNiAKKzE0MSAxMTEgMjMgNDMgMTAxIDU4IDE4NyAxNTAgNzggMTAxIDUwIDEwNyAxODUgODYgMTUxIDEzMCAxMzQgMTQzIDM0IDMxIDI2IDEyMiAKKzM4IDQwIDExMiA5NyAzMyAxMzYgNTAgOTkgMTI3IDEyMSAxNTkgNyAxOSAxNzAgMTg3IDEgNzkgMTkxIDI2IDEzMCAxMTggNSAxMDQgNDcgCisxMjYgMTA5IDkyIDEyOSA1MiAzMCAxOTMgOTAgMzUgNjcgMTE2IDkwIDMgMTgxIDM5IDEyMiAzMCAxNTUgMTQ3IDEwNSA4MyAyMSA3NyAKKzM1IDc1IDE3NCA1NSAxOTAgMTMxIDE1NCA5NSA3MiAxODUgOTQgMzYgOTUgMTI2IDcxIDE0OSA0IDY4IDE1MiAxODAgMTQ0IDE0NiA3IAorNDkgMzMgMTUyIDE4OCAyOSAxMTEgMTk0IDE3MiAxNDggMTI1IDM1IDU5IDM2IDEyNSAxMSAzNiAxNDEgMTQ5IDE4MyAxMjUgMjcgMSA3MSAKKzEzMyA2MSAxMzggMTY4IDg1IDEzMSA1IDk2IDE2MiAxNjEgMTE3IDE0MiAxNCA3OSAxODMgMTQxIDE2NSAxMjYgNTUgMTEgNzQgODQgNzkgCisxNjcgMyA0MCAxNDIgMTc3IDE5MyAxMjggMTczIDE5MiAxMDAgMTYzIDE2IDEyNyAxNDUgMTgyIDk3IDE3IDE5MyAxMjAgMTE1IDMyIAorMTA4IDE4IDk2IDE1NCAxMDMgMTUyIDE1MCA4NiAxODEgMTUgOTkgMTM1IDE3OSAxMjQgMTk0IDE2NCA2OCAxNjAgNDMgMTA5IDEzOCAKKzE1MiAxNDIgNiAyMSAyMyAxNDkgMjAgMTEgODIgMTY0IDQ0IDE1OSAxNDggMTMzIDExNSAyNCAyOCA1MyAxMDQgOSAxODMgMTc5IDEwOCAKKzU2IDM5IDg0IDg3IDMwIDE2MyAzMiA3MCA3NSAxNjYgMTcwIDggMTM5IDkgMTc1IDk5IDE0MyA2NCA4OSAxODYgMTE0IDE4MyAxMzMgODUgCisxNjEgNjMgNjEgMTU0IDExMSAxNSAxMTUgNzggMTA5IDEwOCA3MiAxNzcgMTQgNzEgMTAzIDE3NiAxNzMgMTc2IDE1NyAzOCAxMCA1NCAKKzEzMiA0MSAxODYgMTMwIDEyNiA2MyA2OSAzOSA3NiA3IDY1IDE3MSA4MiAxNzIgMTAyIDEyNCAxNDAgODMgMTEzIF4KKzM5NiAxIDE4OSA3MCA4MyAyOSAxMzIgNjcgMTE1IDE0NSAxNTEgMTcwIDE4MSAxNCAxOTIgMiAxODcgNDAgNSAzMyAxNjAgNDggMTgzIAorOTEgMTMyIDgzIDExMiAxNzcgNjIgMTg5IDE1MyAxMjggOTEgNDkgMzggNTAgNTUgMjQgOCA4IDUxIDM2IDEzIDE3NSAyOCAzNiA1NiAKKzE2MCAxMiAxMDcgMTY4IDI1IDEwNCAxNTcgMTU2IDEzOSAxNjUgMTQgMzAgMTkyIDE2NCAxOTUgNTYgNDEgMTgwIDE1OSAyOCA3OSA0MSAKKzE0NCAxNjcgNTEgMTE1IDE4OCAxMzYgMTU0IDE0NSA2NSAyIDIyIDkzIDgzIDE5MSAxNDcgMjMgMTEwIDU3IDEzNyAxMzEgNjYgMTM4IAorMjYgNzggMTQ2IDEyNSAxNTkgMTUwIDM0IDE3NyAyMiAxMjkgNjggMTY4IDExMSA3NCAxMTggNzcgNTAgMTc0IDU0IDQ3IDg3IDE0MCAyMCAKKzE3OCAxNTggMTMzIDYwIDMzIDQ1IDkzIDQ3IDggMTcwIDU5IDUyIDU2IDEyNCAyMCAxNiAxNTAgMTE3IDI0IDg0IDQ2IDEwNiAxNTEgNTEgCisxNTggMTczIDExMyAxMTEgMTk2IDczIDE1IDEzMyAxMzYgNzEgMTAwIDEwIDg1IDE4MiAxMTAgMTQzIDExNCA5MiAxODUgNDIgNDIgMTE4IAorMTU2IDIwIDEzNSAxNzMgMTU2IDk2IDE4MCAzNyA3MyAxMzQgMTU2IDE4MiAxNTAgMTk2IDE5MiA0NSAxNzIgMTcgMTY3IDkxIDE2OCA2OCAKKzg5IDEzNCAxMjAgMTkwIDE3MyAzNCAxNDEgMzcgMTUyIDExMSAxMTcgMTAzIDYxIDcgMzQgNjIgNjcgMTkxIDE5MCA4IDg3IDIxIDE5NSAKKzEzOSA4NiA0NCA3NiA2NiA1NSAxODYgMjMgMzEgODcgMTgzIDUgMTU1IDEyMiAxOTEgNjggNTMgMTQ5IDEzNiAzNSAxMTUgMjYgMTIxIAorMTMxIDEwMiAxMjMgMyA0MiAxOTcgMTMzIDE3OSA1NiA4NCAxNjUgMTM2IDE5MCAxMzAgNDkgMTU3IDgwIDEwMSAxMDMgOTcgMTk3IDExIAorMTkgMTE4IDEgNSAxMTkgMTM3IDkgMTA0IDE5MyAxNDEgMTE2IDEyMiA3MiAzOCA3IDcwIDQ3IDQ0IDE1NSA0MyAxNiAxMDcgMTI1IDQwIAorMTI3IDE5MyAxMDUgMTMxIDE0NSAxMDggMTg1IDYgNTAgMTQxIDEgMTY3IDEyNyAxNTMgNDUgNTMgMTkyIDEyMSAxMiA3OSA4NCAxMjkgCisxNTEgMTUgMTY2IDE5NiAxNTYgNjAgMTg4IDUzIDEwOSA4MyAxNDggMTYyIDQ2IDE0NiA2IDEzNiAxMTEgMTYwIDg4IDM4IDE2OSA4NSAKKzYzIDg3IDk3IDM1IDE5NCAzIDgyIDUyIDEzIDEzMiA0MyA1OSA5MiAxMDkgNCAxNzggMyAxMTggMzcgMTk1IDk2IDk0IDYwIDExMiAxNSAKKzQ3IDE2NiAxMTAgMTc5IDk5IDY5IDE0OSAxMDAgNDMgMTM4IDY5IDcwIDEyMyA4OSAxMiAxNTggNTQgOTAgNzIgMTE3IDE4MiAzMSAxNjYgCisxNTMgMTY0IDc2IDMzIDIgMTAxIDYzIDQ0IDExMiA1OCAzOSAxNDMgNzQgMzIgMTA3IDg5IDU1IDE0MyAzMSA0NyAxMjMgMTI1IDQgMTM1IAorMTggMTQxIDgwIDEzNyA4OCA4MSAxNTQgMTg3IF4KKzQwNiAwIDIzIDEzNCAxMDMgNDkgOTkgNDQgNjQgMTYwIDY4IDE5MCAxMTQgMTA1IDkxIDg2IDIyIDI3IDE1IDc0IDggMjIgMTUxIDc5IAorMTk5IDg0IDg1IDkwIDEyOCA5IDUgMTc1IDEyOSAxNyA0MCA1OSAxMjUgMTg3IDE5NCAxNDQgMTUxIDMgNjAgNiAxNTggMTUzIDY3IDU4IAorMTggOTkgMTkgNTMgMTI5IDkwIDE3OSAxMzQgNTIgMTI0IDU1IDk1IDEzOCA4MiAxNzAgMTY3IDY5IDEyMiAxMyAxMDggMTYwIDExOSAKKzExNSAxNjEgNTEgMTQgMTY3IDEyMCA0NyA2MCA1NyA4NiAxNiAxODQgOTYgMTk3IDQyIDk4IDExMiAxNjUgMTU0IDE5OSAxNTcgMjEgCisxNjggNTIgMTQ2IDY2IDEyNiAxMTkgOTMgMTUwIDIwIDM2IDE1MyAxNDAgMTk0IDkzIDI2IDE1NiAxMTQgODAgODAgNTUgNDQgMTMgMzUgCisyNCA0NCAxOTEgMjQgMTkwIDYzIDE3NyA0NCAxNDAgOTkgMTQ2IDExNyA1NCAxNjMgNDIgNzYgMTAxIDEzNCAxNzYgMTg1IDE3NyAxNjggCisxIDIxIDE5IDE4MCAxOTMgMTIgNTIgMTk3IDE5MSAxNzMgNjUgMTkgMzEgMTE4IDU5IDEgMTIzIDcyIDcxIDg4IDY0IDExIDE5MyAzNyAKKzYzIDI4IDE2OSAxODQgNDUgNzIgMTk1IDE1MiAxODYgODcgNTYgMTc2IDExMiA0MSA5MyA3NyA4NCAxNTggMjkgMyAxMzYgMTQyIDM2IAorODAgNCAxMTkgMTY2IDg2IDk4IDE2MyA5MyAxIDE0NSA4MyAxMDIgNjYgNzUgMTkxIDQ2IDQgOTQgMTU1IDU1IDEyMCAxNDkgMTEzIDE0OCAKKzE4MSA0OSAxNzUgMTgwIDE0MiA4NyA1IDUxIDY1IDkyIDE2NyAxOTYgMTg2IDEzOCAxODQgMjMgNjEgMTY0IDE3MSAxNzUgMTA3IDYgOSAKKzgxIDExNCA3IDE0MSAxNzcgMTE3IDc2IDE3NCA3MyA1NCAxMTIgMTE0IDI5IDE1MiAxMSA5OCA4NyAxNTQgMTIzIDIxIDE0NiA0MSAxMTUgCis4OCAxMTUgMTM5IDQwIDE4MyAxODkgMTA5IDY3IDcgOTAgNTIgNzMgMTI3IDUxIDE5MiAxNTYgODkgNjkgNDkgNzcgMzMgMzMgMTgyIDU3IAorMTAgNjQgMTM4IDU3IDE1OSAxMzYgOTEgMTExIDMzIDU4IDE5MyA4OCAxODggNzUgMTE4IDExMCAxMjYgMTcwIDE4IDE5NyAxNjkgMTYyIAorMzQgNDEgMTcgMTM4IDYgMzQgOTIgMTQ1IDE4NSAxNTUgMTU3IDE3MCA0MyA4IDE0MCA0OCAyMSA3MCAxMDUgNDAgMTYxIDE3OCA3OCA4OSAKKzE5NiAxMTAgMTk5IDEwNiA5NiAxMjEgMTA2IDIzIDE4NSAyOCA5NiA0OCAxNjcgMTQ1IDU4IDkxIDM1IDk3IDE4MCA2NiAxNTEgMTMwIAorMTI0IDEyOCAzNCAxNiA2IDEwNyAyOCAyMCAxMTIgOTIgMTggMTIxIDMwIDg0IDEwNyAxMDEgMTU5IDE4NyAxOSAxNTUgMTgyIDE4MSA3NCAKKzE4NiAxMSAxMjAgOTggMTg1IDEwNCAzMiAxMjYgOTQgODIgMTE5IDQyIDI1IDE3MyA5MCAzMCA2MiA5NiA3MCAxNzggMTc2IDM5IDEwMiAKKzE1IDE1MCAxNDcgMTAwIDc4IDE2IDU3IDM1IDc1IDE2OSAzNSAxNzAgMTE2IDE0NCA3NSAxNDYgXgorNDA5IDEgMTg1IDcwIDEyIDk1IDExMCA3MSAxMzMgMTgzIDUyIDEzNiAxNDggMTQ0IDExNCAxODYgMTcgMjUgMTQ0IDE2NCA1IDc5IDE3OCAKKzE3MiAxMjQgMTE3IDE5IDQzIDIwIDkzIDE3NCAzNiAxMjUgMTE3IDE1MSAxMDkgMyAxNjQgNTUgMTAxIDM3IDEyMiAxNTIgNzcgMTMxIAorMTY4IDg4IDE2MiAxNjEgOTMgMTQyIDE0IDYzIDE2NyAxNDEgMTQ5IDk0IDM5IDE5MCA1MCA2OCA0NyAxMzUgMTk4IDE2IDExMCAxNTMgCisxNzcgMTA0IDE3MyAxOTIgNjggMTQ3IDE3OSAxMTkgMTM3IDE2NiA3MyAxODAgMTY5IDg4IDkxIDI0IDc2IDEwIDgwIDE0NiA3OSAxMjggCisxNTAgNjIgMTQ5IDE5NCA4MyAxMTEgMTcxIDEyNCAxNzAgMTU2IDYwIDE1MiAyNyAxMDkgMTA2IDEyMCAxMzQgMjAxIDE4NCAyMDIgMTQ5IAorMTIgMTk4IDY2IDEzMiAxMiAxMjcgMTMyIDEzMyA4MyA4IDEyIDQ1IDg4IDkgMTgzIDE1NSA5MiAyNCAyMyA3NiA2MyAxNCAxNjMgOCA2MiAKKzY3IDE1MCAxNjIgOCAxMTUgMSAxNjcgOTEgMTI3IDMyIDg5IDE2MiA5MCAxNTkgMTI1IDg1IDEyOSA0NyA1MyAxNTQgOTUgNyAxMTUgNTQgCisxMDEgMTA4IDU2IDE2OSA2IDQ3IDEwMyAxNzYgMTU3IDE2MCAxMjUgMTQgMTAgMzAgMTI0IDE3IDE3OCAxMjIgMTAyIDU1IDY5IDE1IDYwIAorMjAyIDQ5IDE3MSA3NCAxNDggOTQgOTIgMTI0IDY3IDIwMCAxODQgNzAgODMgMjkgMTI3IDY3IDEwMCAxNDAgMTMxIDE2NSAxNzYgNCAKKzE4MiAyIDE2NyAyMCAxOTMgMzMgMTYwIDQzIDE3MyA3MSAxMTIgNjggOTcgMTU3IDU3IDE2OSAxMzggMTEzIDg2IDQ0IDM4IDQwIDU1IAorMTkgMTk2IDIwMSAzMSAyMSA4IDE2NSAyMyAyNiA0MSAxNTUgMTk1IDE4MyAxMDIgMTU4IDI1IDk0IDE0MiAxNDYgMTI5IDE1MCA5IDMwIAorMTc3IDE1NCAxOTUgNTEgMzYgMTc1IDEzOSAyOCA1OSAzMSAxMjQgMTY3IDQxIDEwNSAxNzMgMTIxIDEzNCAxMzAgNjUgMTg1IDE3IDc4IAorNzggMTgxIDEzNyAxMyA5NSA1NyAxMzcgMTE2IDUxIDExOCAxNiA3OCAxMzEgMTE1IDE1NCAxNDUgMjkgMTc3IDIyIDEyOSA2OCAxNjggCis5MSA3NCA5OCA3MiAzMCAxNzQgMzkgMzcgNzIgMTMwIDE1IDE2MyAxNTggMTI4IDUwIDE4IDI1IDczIDI3IDE5MSAxNTAgNTkgNTIgMzYgCisxMDQgMjAgMTEgMTMwIDk3IDQgNzkgNDYgMTA2IDE0MSA0NiAxMzggMTYzIDEwOCAxMDYgMTkxIDY4IDE1IDExMyAxMzYgNjYgMTAwIAorMTkzIDY1IDE4MiAxMDUgMTIzIDk5IDcyIDE4MCAzNyAyMiAxMDggMTU2IDEwIDEzMCAxNjggMTQxIDk2IDE2MCAyMiA1OCAxMzQgMTUxIAorMTYyIDE0MCAxODEgMTg3IDM1IDE1NyA3IDE0NyA3NiAxNjMgNTggODQgMTI5IDEwMCAxOTAgMTUzIDI0IDEyNiAzMiAxNDIgOTYgMTA3IAorODggNDEgMiAxNCA0MiA1MiAxODYgMTcwIDMgODIgMTEgMTgwIDExOSA2NiAyOSA1NiA2NiA1MCAxNzEgMyAxMSA3NyAxNjMgNSAxNTAgCisxMTIgMTI4IF4KKzQxMyAxIDQ3IDI1IDEzNSAxMjkgNyAxMDggMTkgMTA3IDExNyAxMDIgMTAyIDMgMjggMTkwIDExMiAxNjUgNTYgNjMgMTY1IDEyMiAxODMgCisxMTYgMjggMTU3IDUyIDczIDg5IDkwIDE2OSAyMDIgMTIgMTExIDE4NSAyMDMgOTEgMTE2IDIwMCA5NyAxOTMgMTM0IDExNiAxMjIgNDQgCiszMSA3IDYzIDI2IDM3IDEzNCAyMiAyIDkzIDEyNSAzMyA5OSAxODYgNzcgMTI0IDEzMSA5NCAxNzEgMTgzIDUwIDExMyAxNzggMTQ2IAorMTI3IDE1MyA0NSAzMiAxNjQgMTIxIDIwMyA1OCA1NiAxMDggMTMwIDE5MiAxNjYgMTY4IDEyOCAzOSAxODggNTMgMTAyIDY5IDE0OCAKKzE0MSAxOCAxMzkgMTk3IDEwOCA5NyAxMzIgNzQgMjQgMTU1IDcxIDYzIDU5IDk3IDIxIDE5NCAxODAgNjEgNDUgMjA0IDEzMiAyOSAzMSAKKzg1IDg4IDE4OCAxNjQgMTg3IDExOCAzNyAxNjcgODIgOTQgNjAgOTggMSA0NyAxNTIgMTEwIDE3MiA4NSA1NSAxMjggNzIgNDMgMTE3IAorNDEgNDIgMTE2IDYxIDEyIDE0NCA0MCA2MiA1OCAxMTcgMTY4IDE3IDE1OSAxMzkgMTY0IDc2IDUgMTkzIDEwMSA1NiAzMCAxMDUgMzAgCisxMSAxNDMgNjAgMzIgODYgNjggNDEgMTM2IDMxIDQwIDEyMyAxMTggMTgxIDEzNSAxOTUgMTI3IDU5IDEzMCA4MSA1MyAxNDcgNjIgMTMgCisxMjQgOTggMzQgNzkgMzkgNDkgMTQ1IDUzIDE4MCA5NCAxMDUgOTEgNzEgMiAyNyA1IDU0IDE5MyA3IDE0MSA3OSAxOTkgODQgNzUgNzAgCisxMjggMTk5IDE5NSAxNjAgMTE5IDE3IDIwIDU0IDExNSAxODcgMTg0IDEyOSAxNDYgMTkzIDQwIDIwMSAxNDMgMTM4IDU3IDQzIDE4IDk0IAorMjA0IDM4IDExNCA4MCAxNzkgMTE0IDQ3IDExOSA1MCA4MCAxMTggODIgMTYwIDE1MiA0OSAxMTIgMTk4IDg4IDE1NSAxMDQgOTUgMTUxIAorMzYgMTk5IDE2MiAxMDAgMjcgNTAgNDcgODYgMTk1IDE2IDE3OSA4MSAxOTIgMjcgODMgMTA3IDE1MCAxMzQgMTk0IDE0NyAxIDE1OCAzMiAKKzEzMSA2MSAxMTEgMTE5IDgzIDE0MCA1IDIxIDEzMyAxMjAgMTc0IDc4IDI2IDEzNiAxMDkgNjUgODAgNDAgMjkgMjAzIDI1IDI0IDQ0IAorMTkxIDE0IDE3MCA0MyAxNjIgMzQgMTQwIDk5IDE0MSAxMTIgNTQgMTQ4IDQyIDcxIDk2IDExOSAxNjEgMTY1IDE2NyAxNDggMTg2IDExIAorNCAxODAgMTg4IDE5NyA0MiAxODIgMTgxIDE2OCA1MCAxNCAyNiAxMDMgNDkgMSAxMTMgNjcgNjEgNzggNTkgMTk2IDE3MyAzMiA1MyA4IAorMTU0IDE2OSAzMCA3MiAxNzUgMTUyIDE3NiA4NyAzNiAxNjYgMTAyIDM2IDg4IDc3IDc5IDEzOCAyNCAxODggMTMxIDEyNyAyNiA3MCAKKzE5NCAxMTQgMTQ2IDY2IDkzIDE1OCA5MyAxOTEgMTI1IDc4IDkyIDUxIDYwIDE3NiAyNiA0IDc0IDEzNSAzNSAxMjAgMTI5IDExMyAxMzMgCisxODEgMjkgMTcwIDE3MCAxMzcgNzcgMTkwIDQ2IDQ1IDc3IDE1NyAxOTEgMTg2IDEzOCAxODQgMTggNjEgMTQ0IDE1MSAxNzUgMTA3IDYgCisxOTQgODEgMTE0IDIgMTI2IDExMCBeCis0MjcgMSA4NSA2MCAxNTAgNzMgMzggODggOTAgNSAxMjggMTEgOTggNTUgMTMwIDkxIDEzIDE0NiA5IDkxIDg4IDEwNyAxMzkgMTYgMTU5IAorMTg5IDkzIDM1IDE5MSA2NiAyOCA2NSA5NSA1MSAxODQgMTQ4IDU3IDQ1IDQ5IDYxIDI1IDkgMTY2IDQ5IDE5NCA2NCAxMzAgMzMgMTQzIAorMTEyIDY3IDExMSAxIDU4IDE3NyA4MCAxNjQgNTkgMTEwIDk0IDExOCAxNzAgMTk0IDE5NyAxNjkgMTU0IDEwIDQxIDE5MyAxMTQgMTkwIAorMjYgOTIgMTQ1IDE3NyAxNTUgMTI1IDE0NiAzNSAyMDAgMTI0IDQ4IDIxIDQ2IDg5IDQwIDE1MyAxNzggNjIgNjUgMTk2IDg2IDE3NSA5MCAKKzgwIDg5IDk4IDIzIDE2OSA0IDg4IDMyIDEzNSAxMzcgMjYgNzUgMTEgODEgMTcyIDM0IDE1MSAxMzAgMTA4IDEwNCAzNCAyMDAgMTgyIAorODMgMTIgMTk2IDExMiA4NCAyMDIgOTcgMjA2IDYwIDc1IDY5IDE1OSAxNjMgMTkgMTMxIDE3NCAxNTcgNjYgMTc4IDE5NSAxMDQgNjYgCisxNjEgMTA0IDggMTI2IDcwIDY2IDEwMyAyNiAxNyAxNDEgOTAgMjIgNTQgNjQgMzggMTQ2IDE2OCAzOSA3MCAxOTkgMTQyIDE0NyA5MiAKKzcwIDggMjUgMzUgNzUgMTYxIDMgMTM4IDkyIDEyOCA0MyA1OSAxODUgNTUgMjA1IDk1IDEwMCA3MSAxMjMgMTczIDQyIDEyNiAxMjggCisxNDQgOTQgMTc2IDIwNSAyMCAxMzkgMTQ5IDE5OCA1OSAxNjggMTcyIDEwOSAxMTIgOSAzMyAxMCA3MyAxNTQgMzYgMTE1IDk3IDEzMSAKKzk5IDE5NiAxNDQgNDUgODEgMjIgMTEyIDE0MiA3MiAxMzEgMTQ4IDgzIDE2MiAxNjEgNzggMTQyIDE0IDUzIDE1NyAxNDEgMTM5IDc0IAorMjkgMTgwIDM1IDU4IDI3IDExNSAxOTggMSA5MCAxMzggMTY3IDg5IDE3MyAxOTIgNDggMTM3IDE1OSAxMTQgMTMyIDE1NiA1OCAxNjAgCisxNTQgNjggNzYgMTkgNTYgNSA3MCAxNDEgNjQgMTEzIDE1MCA0NyAxMjkgMTg0IDczIDk2IDE2NiAxMjQgMTU1IDE1MSA1NSAxNDcgMTcgCisxMDkgODYgMTAwIDEyOSAyMDEgMTY0IDE5MiAxNDkgNyAxOTMgNTYgMTEyIDIwMCAxMDcgMTIyIDEzMyA2MyAyMDYgMiA0MCA3OCA5IAorMTgzIDE0MCA4MiA0IDEzIDcxIDQ4IDQgMTYzIDIwMSA1NyA2MiAxNDAgMTU3IDggMTAwIDIwNCAxNjIgODYgMTE3IDEyIDg5IDE0NyA3NSAKKzE0NCAxMjAgODUgMTA5IDM3IDQ4IDE1NCA4NSAyIDExNSAzOSA5NiAxMDggNDYgMTY0IDEgMzIgMTAzIDE3NiAxNDcgMTUwIDEwNSAyMDcgCisxMCAxNSAxMTkgMiAxNzMgMTE3IDg3IDUwIDY5IDUwIDIwMiAzOSAxNzEgNjkgMTMzIDg5IDcyIDExNCA1NyAxOTUgMTc5IDcwIDgzIDI5IAorMTIyIDY3IDg1IDEzNSAxMTEgMTYwIDE3MSAyMDIgMTcyIDIgMTQ3IDE4MyAzMyAxNjAgMzggMTYzIDUxIDkyIDUzIDgyIDEzNyA1MiAKKzE0OSAxMjMgOTggODEgMzkgMzggMzAgNTUgMTQgMTg2IDE5NiAxMSA2IDMgMTU1IDE4IDE2IDI2IDE1MCAxODAgMTY4IDk3IDE0OCAyNSAKKzg0IDEyNyAxMzYgMTE5IDEzNSA0IDMwIDE2MiAxNDQgMTk1IDQ2IDMxIDE3MCAxMTkgMjggMTkwIF4KKzQ0MyAxIDE3IDk2IDE2NyAyNyA5MSAxNTIgMTAwIDEwNiAxMDkgNjUgMTY0IDEwIDU3IDcxIDE2NyAxMjMgMjA5IDc0IDU3IDEzNyA5NSAKKzMwIDkwIDIgNzggMTEwIDEwMSAxNDcgMTM4IDIyIDE3NyAyMiAxMjkgNjggMTY4IDYzIDc0IDcwIDY1IDIgMTc0IDE4IDIzIDUxIDExNiAKKzggMTQyIDE1OCAxMjEgMzYgMjA3IDIwNyA0NSAyMDkgMTcwIDEyMiA1OSA1MiA4IDc2IDIwIDQgMTAyIDY5IDE4NiA3MiA0NiAxMDYgCisxMjcgMzkgMTEwIDE0OSAxMDEgOTkgMTg0IDYxIDE1IDg1IDEzNiA1OSAxMDAgMTcyIDM3IDE4MiA5OCA5NSA3OCA0NCAxNzMgMzAgMjA0IAorOTQgMTU2IDIwNiAxMjMgMTYxIDEyMCA5NiAxMzIgMSAzNyAxMzQgMTQ0IDEzNCAxMjYgMTYwIDE4MCAyMSAxMzYgMjAzIDExOSA1NSAKKzE1NiA0NCA3NyAxMjIgNzIgMTkwIDEyNSAxMCAxMDUgMjUgMTI4IDc1IDkzIDY3IDEzIDIwNSAxOTYgMTQgMzEgMTc5IDE0MiAyMDYgNzUgCisyMDcgMTU5IDkxIDM4IDggMjggNjYgNDMgMTUwIDE4NSAxOTMgNjMgMTM1IDUgMTQzIDk4IDE0MyAzMiA1IDEyNSAxMjQgMTk3IDEwMyAKKzE0IDk3IDEwNyAxMDIgODcgMyAxOCAxODUgOTcgMTU1IDU2IDQ4IDE2NSAxMTIgMTc4IDEwNiAxMyAxNTcgMzIgNTMgNzkgODUgMTQ5IAorMTk3IDcgMTA2IDE3NSAyMDMgNzEgMTAxIDE5NSA5MiAxOTMgMTI5IDExNiAxMjIgMjQgMjYgNyA1OCAxMSAzMiAxMTkgNyAyMDIgODMgCisxMjUgMjggNzkgMTgxIDU3IDExOSAxMjEgODQgMTYxIDE2OCA1MCA5MyAxNjMgMTMxIDEyNyAxNTMgNDUgMTcgMTQ0IDEyMSAxOTggNDMgCiszNiA5MyAxMTUgMTc3IDE2NiAxNDggMTA4IDI0IDE4OCA1MyA5NyA1OSAxNDggMTI2IDIwOCAxMzQgMTkyIDg4IDg3IDExMiA2NCAxNCAKKzE0NSA2MSA2MyAzOSA5NyAxMSAxOTQgMTY1IDQ2IDQwIDE5OSAxMzIgMTkgMTEgODAgNzMgMTc4IDE1NCAxNzcgMTE4IDM3IDE0NyA3MiAKKzk0IDYwIDg4IDIwMSA0NyAxNDIgMTEwIDE2NyA3NSA0NSAxMTMgNTIgNDMgMTAyIDIxIDIyIDExMSA0MSAxMiAxMzQgMzAgNDIgNDggCisxMTcgMTU4IDcgMTU0IDEyOSAxNjQgNzYgMTk1IDE4OCAxMDEgNTEgMjAgMTAwIDEwIDIwMSAxNDMgNTAgMzIgNzEgNTMgMzEgMTMxIDMxIAorMzUgMTIzIDExMyAxNjYgMTM1IDE4MCAxMTcgNDQgMTI1IDc2IDMzIDE0MiA2MiAzIDExNCA5MyAxOSA1OSAzNCAzNCAxMzAgMzggMTcwIAorNzQgMTA1IDkxIDU2IDE5MiAyNyAyMDUgMzQgMTc4IDIwMiAxMzEgNzkgMTk5IDg0IDY1IDUwIDEyOCAxODkgMTg1IDE0NSAxMDkgMTcgCis0OSAxMDUgMTg3IDE3NCAxMTQgMTQxIDE4MyAyMCAxOTYgMTI4IDEyMyA0NyAyOCAxOCA4OSAxODkgMjMgOTkgNzAgMTc5IDk0IDQyIAorMTE0IDQ1IDY1IDk4IDgyIDE1MCAxMzcgMjkgMTAyIDE4MyA2OCAxNTAgODkgNzUgMTQxIDIxIDE4NCAxNTcgODAgNyA0MCAzNyA4NiAKKzE5MCAxNiAxNzQgNjYgMTg3IDEyIDY4IDEwMiAxMzUgMTE0IDE4OSAxMzcgMTkxIDE0OCAxMiAxMTYgNTYgOTYgMTE5IDczIDEzMCAyMDAgCis2IDExMyAxMDAgMTU0IDYzIDI2IDExNiAxMDQgNTAgODAgMjUgMTQgMTkzIDgzIF4KKzQzNiAxIDI0IDQ0IDE5MSAyMTEgMTM4IDExIDEzOCAxOCAxNDAgOTkgMTMzIDEwNCA1NCAxMjQgNDIgNjMgODggOTUgMTM3IDEzMyAxNTEgCisxMTYgMTYyIDIwOCAxOTMgMTgwIDE4MCAxNzMgMjYgMTU4IDE2NSAxNjAgMjYgNiAxOCA3OSAzMyAxIDk3IDU5IDQ1IDYyIDUxIDE3MiAKKzE0MSAyNCAzNyAxODkgMTMwIDE0NSA2IDcyIDE0MyAxNTIgMTYwIDg3IDQgMTUwIDg2IDI4IDgwIDc3IDcxIDEwNiAxNiAxNjQgMTIzIAorMTAzIDEwIDU0IDE3OCAxMDYgMTE0IDM0IDg1IDE1MCA5MyAxNzUgOTMgNzAgNzYgMjcgMzYgMTUyIDIwNyA0IDQyIDEwMyAzIDEyMCA5NyAKKzExMyAxMDkgMTgxIDIxMCAxNjIgMTU0IDEyOSA2MSAxNjYgMzggMTMgNTMgMTQxIDE4MyAxODYgMTM4IDE4NCAxMCA2MSAxMTIgMTE5IAorMTc1IDEwNyA2IDE3MCA4MSAxMTQgMjA3IDEwMiAxMjUgNjUgNTAgMTM1IDczIDI4IDczIDc1IDIwMyAxMTMgMTEgOTggMzUgMTE1IDcxIAorOCAxNDYgMjAyIDc2IDg4IDEwMiAxMzkgMSAxNDQgMTg5IDgzIDE1IDE4MSA1MSAxMyA2MCA3NSA1MSAxNzkgMTQzIDM3IDMwIDQ5IDUxIAorMjAgMjA3IDE1NiA0NCAxODQgNjQgMTI1IDE4IDEzMyA5NyA1MiAxMTEgMTk0IDU4IDE2NyA3NSAxNDkgNDkgMTA1IDg0IDExMyAxNzAgCisxNzkgMTk3IDE2OSAxNDkgMjA4IDQxIDE3OCA5OSAxODAgMjEgOTIgMTQ1IDE3MiAxNTUgMTA1IDEzMSAzMCAyMDggMjAwIDExNCA0OCAKKzIxIDMxIDc5IDQwIDE0OCAxNzggNTIgNTAgMTk2IDcxIDE2MCA4MCA3MCA2OSA5MyAyMyAxNTkgMjAyIDgzIDIyIDExNSAxMzIgNiA2NSAKKzIwOSA3MSAxNjcgMTQgMTUxIDEzMCA5OCA4OSAzNCAxOTAgMTY3IDY4IDIgMTgxIDExMiA3OSAxOTIgODIgMTkxIDQ1IDU1IDQ5IDE1OSAKKzE0OCAxOSAxMTYgMTY5IDE0MiA2MSAxNzMgMTg1IDk0IDQ2IDE0NiAxMDQgMjA2IDEyNiA1NSA1NiA5MyAxNiAxMiAxMjEgOTAgMTcgNDkgCis0NCAxOCAxMjYgMTYzIDM5IDUwIDE4OSAxMzcgMTQ3IDg3IDY1IDMgNSAzNSA3NSAxNTYgMTk2IDExOCA3NyAxMTggMjMgNTQgMTg1IDQwIAorMTk1IDk1IDkwIDcxIDExMyAxNjMgMzIgMTE2IDEwOCAxNDQgNzQgMTY2IDE5MCAxNSAxMzQgMTM0IDE4OCAzOSAxNTggMTcyIDk0IDEwNyAKKzIxMiAyMyA1MyAxMzQgMzYgMTA1IDc3IDExMSA4OSAxODYgMTI0IDM1IDYxIDcgMTAyIDEzMiA2NyAxMzEgMTI4IDc4IDE2MiAxNjEgNjMgCisxNDIgMTQgNDMgMTQ3IDE0MSAxMjkgNTQgMTkgMTcwIDIwIDQ4IDcgOTUgMTk4IDE5OSA3MCAxMjMgMTU3IDc0IDE3MyAxOTIgMjggMTI3IAorMTM5IDEwOSAxMjcgMTQ2IDQzIDE0MCAxMzkgNDggNjEgMTQgMzYgNjAgMTM2IDQ5IDk4IDE1MCAzMiAxMDkgMTc0IDYzIDgxIDE2MSAKKzEyNCAxNDAgMTQ2IDUwIDE0MiA3IDEwOSA2NiA4MCAxMjQgMjAxIDE0NCAxODIgMTQ5IDIgMTg4IDQ2IDkyIDE4NSA4NyAxMTIgMTMzIAorNDMgMjAxIDIwNSAzNSA2OCA5IDE4MyAxMjUgNzIgMTk3IDMgNjYgMzMgMjA3IDE2MyAxOTEgNTIgNTcgMTMwIDE1MiA4IDg1IDIwNCAKKzE1NyA4MSAxMDcgMjA1IDE4NyBeCis0NjIgMSAxMjYgNTQgMTIzIDExMyA4NSA4MSAyMyA0MSAxNTQgNzEgMjEwIDExNSAxOCA4OSAxMDggMzIgMTU3IDIwOSAxMSAxMDMgMTc2IAorMTMzIDEzNiA3NyAxOTMgMTAgMjA5IDExMiAxOTYgMTY2IDExMCA2NiA0MyA2OSAxOTQgMzYgMjAyIDI1IDE3MSA2MiAxMTIgODIgNDQgCisxMDAgNDMgMTg4IDE3MiA3MCA4MyAyOSAxMTUgNjcgNjQgMTI4IDgzIDE1MyAxNjQgMTk1IDE1OCAyIDExOSAxODcgMTY5IDMzIDE2MCAKKzMxIDE0OSAyMyA2NCAzMiA2MSAxMDkgNDUgMTIxIDEwMiA3NyA3NCAzMiAzOCAxNiA1NSA3IDE3MiAxODkgMTk4IDIwMCAyMTEgMTQxIAorMTEgMiA1IDE0MyAxNTkgMTQ3IDkwIDEzNCAyNSA3MCAxMDYgMTIyIDEwNSAxMTQgMjEyIDMwIDE0MSAxMzAgMTk1IDM5IDI0IDE2MyA5MSAKKzI4IDExIDcgNzYgMTY3IDE3IDgxIDEzNyA4NSA4NiA5NCA2NSAxNDkgNSA0MiA2NiAxNTcgMTEzIDIwNCA1OSA1NyAxMzcgODAgMTUgNzAgCisyMDcgNzggOTUgOTEgMTQyIDEzMyAxNyAxNzcgMjIgMTI5IDY4IDE2OCA0MyA3NCA1MCA2MCAxOTcgMTc0IDMgMTMgMzYgMTA2IDMgMTI3IAorMTU4IDExNiAyNiAxOTcgMTkyIDI1IDE5NCAxNTUgMTAyIDU5IDUyIDIwMyA1NiAyMCAyMTQgODIgNDkgMTcxIDY3IDQ2IDEwNiAxMTcgCiszNCA5MCAxMzkgOTYgOTQgMTc5IDU2IDE1IDY1IDEzNiA1NCAxMDAgMTU3IDE3IDE4MiA5MyA3NSA2MyAyNCAxNjggMjUgMTg5IDg0IAorMTU2IDIwMSAxMTggMTU2IDEwNSA5NiAxMTIgMjAxIDIyIDEzNCAxMzkgMTE0IDExNiAxNDUgMTc1IDExIDEyMSAxOTggOTkgNDAgMTUxIAorMzQgNzIgMTE3IDUyIDE5MCAxMDUgOTAgMjAgMTE4IDYwIDgzIDUyIDIwOCAyMDUgMTgxIDIwOSAxNiAxNzQgMTIyIDIwNiA3MCAyMDIgCisxNDQgNzEgMTggMjA4IDggNjYgMzggMTM1IDE3MCAxNzggNTMgMTE1IDUgMTM4IDg4IDEyMyAxNyAyMDAgMTE1IDExOSAxODIgOTggOSAKKzg3IDk3IDEwMiA3MiAzIDggMTgwIDgyIDE0NSA1NiAzMyAxNjUgMTAyIDE3MyA5NiAyMTMgMTU3IDEyIDMzIDY5IDgwIDEyOSAxOTIgMiAKKzEwMSAxNjUgMjAzIDUxIDg2IDE5MCA4NyAxOTMgMTI0IDExNiAxMjIgNCAyMSA3IDUzIDIxMSAyNyAxMDQgMjA3IDE5NyA3MyAxMjUgMjMgCis1OSAxNzYgMzcgMTE0IDExMSA3NCAxNTEgMTUzIDUwIDczIDE0OCAxMTYgMTI3IDE1MyA0NSAyIDEyNCAxMjEgMTkzIDI4IDE2IDc4IAorMTAwIDE2MiAxNjYgMTI4IDg4IDkgMTg4IDUzIDkyIDQ5IDE0OCAxMTEgMTkzIDEyOSAxODcgNjggNzcgOTIgNTQgNCAxMzUgNTEgNjMgCisxOSA5NyAxIDE5NCAxNTAgMzEgMzUgMTk0IDEzMiA5IDIwNiA3NSA1OCAxNjggMTQ0IDE2NyAxMTggMzcgMTI3IDYyIDk0IDYwIDc4IAorMTk2IDQ3IDEzMiAxMTAgMTYyIDY1IDM1IDk4IDMyIDQzIDg3IDEgMiAxMDYgMjEgMTIgMTI0IDIwIDIyIDM4IDExNyAxNDggMjEyIDE0OSAKKzExOSAxNjQgNzYgMTgwIDE4MyAxMDEgNDYgMTAgOTUgMjA1IDE4NiAxNDMgNDAgMzIgNTYgMzggMjEgMTI2IDMxIDMwIDEyMyAxMDggCisxNTEgMTM1IDE2NSAxMDcgMjkgMTIwIDcxIDEzIDEzNyA2MiAyMDggMTA0IDg4IDQgMzkgMjkgMTkgMTE1IDIzIDE2MCA1NCAxMDUgOTEgCis0MSAxNzcgMjcgMjAwIDE0IDE2MyAxMjQgXgorNDUzIDAgMTE1IDc5IDE5OSA4NCA0OSAxOCAxMjggMTczIDE2OSAxMjEgOTMgMTcgMTg2IDQxIDg5IDE4NyAxNTggOTAgMTMzIDE2NyAKKzIwNiAxODggMTA0IDk5IDMxIDQgMTggODEgMTY1IDIxNyA3NSA1NCAxNzkgNjIgMzQgMTA2IDM3IDQxIDY2IDgyIDEzNCAxMTMgMjE1IAorODYgMTU5IDM2IDE0MiA2NSA0MyAxMjUgMjE1IDE2MCAxNDkgNDggMTkzIDI0IDIxIDg2IDE4MiAxNiAxNjYgNDIgMTc5IDIwNiA0NCA5NCAKKzExMSA4MiAxODEgMTIxIDE2NyAxMzIgMTk4IDkyIDQ4IDcyIDExOSA1NyAxMTQgMTg0IDIwMCA4MSA2OCAxMjIgMzkgMjYgODQgOTYgMjYgCis4MCAxIDIwOCAxNzcgMjE3IDI0IDQ0IDE5MSAyMDYgMTE4IDIwOSAxMjMgOCAxNDAgOTkgMTI4IDk5IDU0IDEwOSA0MiA1OCA4MyA4MCAKKzEyMiAxMTMgMTQxIDk2IDE0NyAyMDMgMTgzIDE4MCAxNzUgMTU4IDE2IDE0MyAxNTUgMTU1IDExIDEgMTMgNjQgMjMgMSA4NyA1NCAzNSAKKzUyIDQ2IDE1NyAxMjEgMTkgMjcgMTc0IDExNSAxMzAgMjA5IDcyIDEyMyAxNTIgMTUwIDg3IDIwMiAxNDAgNzYgMjMgNzUgNzcgNjYgODYgCisxMSAxNDkgMTE4IDg4IDQ0IDE2OCAxMDEgOTQgMTQgODAgMTQ1IDkzIDE2NSA3MyA2NSA2NiAxMiAyMSAxMzcgMTkyIDQgMjIgODMgMjAxIAorMTIwIDc3IDExMyA5NCAxODEgMTk1IDE1NyAxNDQgMTI0IDUxIDE1MSAzMyAyMTEgMzggMTMxIDE3OCAxODYgMTM4IDE4NCA1IDYxIDkyIAorOTkgMTc1IDEwNyA2IDE1NSA4MSAxMTQgMjA3IDg3IDEwNSA0NSA0MCAxMjAgNzMgMTggNTggNjAgMTkzIDk4IDExIDk4IDE1IDEwMCA1MSAKKzMgMTQ2IDE4NyA2MSA4OCA5NyAxMzkgMjA0IDEyOSAxODkgNzMgMjEzIDE3MSAzNiAyMTYgNTUgNTUgNTEgMTc0IDEzOCAxNyAxNSA0OSAKKzQxIDE1IDE5NyAxNDYgMzkgMTc0IDY0IDEyMCAzIDEyMyA4MiAzNyAxMTEgMTc5IDU4IDE1NyA3MCAxMzQgMzkgMTAwIDc0IDEwOCAxNzAgCisxNjQgMTk3IDE2OSAxNDQgMTk4IDQxIDE2MyA4NCAxNzAgMTYgOTIgMTQ1IDE2NyAxNTUgODUgMTE2IDI1IDIwOCAyMDAgMTA0IDQ4IDIxIAorMTYgNjkgNDAgMTQzIDE3OCA0MiAzNSAxOTYgNTYgMTQ1IDcwIDYwIDQ5IDg4IDIzIDE0OSAxOTIgNzggMTIgOTUgMTI3IDIwNCA1NSAKKzE5OSA2MSAxNjIgMjEyIDE1MSAxMzAgODggNzQgMzQgMTgwIDE1MiA1MyAyMTAgMTY2IDExMiA3NCAxODIgNjcgMTc2IDMwIDM1IDI5IAorMTU5IDEzMyAxOSAxMDEgMTY0IDEyNyA1NiAxNjggMTc1IDg0IDI2IDEzMSAxMDQgMTk2IDEyNiA0MCA0NiA4MyA2IDcgMTAxIDkwIDEyIAorNDQgMjQgMjE2IDEwNiAxNTggMzkgMzAgMTc5IDEzMiAxNDcgODIgNjAgMjE2IDIwMyAzNSA3NSAxNTEgMTgxIDk4IDYyIDEwOCAzIDQ5IAorMTg1IDI1IDE4NSA5NSA4MCA3MSAxMDMgMTUzIDIyIDEwNiA4OCAxNDQgNTQgMTU2IDE3NSAxMCAxMjkgMTE5IDE3OCAxOSAxNDggMTcyIAorNzkgMTAyIDIwNyAxMyAyMDggMzMgMTE0IDM2IDk1IDU3IDkxIDc5IDE3NiAxMDQgMjUgNDEgMjEwIDkyIDEyMiA2MiAxMzEgMTA4IDczIAorMTYyIDE2MSA0OCAxNDIgMTQgMzMgMTM3IDE0MSAxMTkgMzQgOSAxNjAgNSAzOCAyMDUgNzUgMTk4IDE4OSA1MCAxMDggMTEyIF4KKzQ1NCAxIDUzIDE3MyAxOTIgMTEzIDExMSAxMDIgMTIwIDEzMiAyMiAxMTIgMTE4IDIwIDQwIDcgOCAyMTMgNDYgMTI5IDI4IDc3IDE1MCAKKzExIDgxIDE2MCA0OSA2MCAxNTQgMTI0IDExOSAxMzkgNDMgMTM1IDIxMyAxMDkgMzggNTIgMTE3IDIwMSAxMTYgMTY4IDE0OSAyMTUgCisxODEgMzIgNjQgMTY0IDU5IDk4IDEzMyAxNSAxOTQgMTk4IDI4IDU0IDkgMTgzIDEwNCA1OCAxNzYgMjA5IDU5IDEyIDIwMCAxNjMgMTc3IAorNDUgNTAgMTE2IDE0NSA4IDY0IDIwNCAxNTAgNzQgOTMgMTg0IDg5IDExMSAzOSAxMDggMTA4IDg1IDYxIDEzIDM2IDE1NCA2MSAyMTAgCisxMTUgMyA4NCAxMDggMjIgMTUyIDIwOSAyMTYgMTAzIDE3NiAxMjMgMTI2IDU3IDE4MyAxMCAxOTkgMTA3IDE4NiAxNjEgMTA1IDUxIDM4IAorNjkgMTg0IDI2IDIwMiAxNSAxNzEgNTcgOTcgNzcgMjQgOTAgMzMgMTgzIDE2NyA3MCA4MyAyOSAxMTAgNjcgNDkgMTIzIDYzIDE0OCAKKzE1OSAxOTAgMTQ4IDIgOTkgMTcyIDE1OSAzMyAxNjAgMjYgMTM5IDMgNDQgMTcgNDYgODkgNDAgMTAxIDg3IDYyIDY5IDI3IDM4IDYgNTUgCisyIDE2MiAxODQgMTgzIDE5MCAyMTEgMTMxIDYgMjEyIDIxMCAxMzggMTQ0IDEzMiA4NSAxMjQgMjUgNjAgOTEgMTEyIDk1IDk5IDIxMiAKKzMwIDEyNiAxMjAgMTk1IDM0IDE5IDE1OCA3MSAyOCAyMTEgMjE3IDU2IDE2NyA3IDcxIDEyMiA3MCA2NiA3OSA2NSAxMzQgMjcgNjEgCisxNDcgMTAzIDE5OSA0NCA1NyAxMzcgNjUgNTAgMjAyIDc4IDgwIDgxIDEzNyAxMjggMTIgMTc3IDIyIDEyOSA2OCAxNjggMjMgNzQgMzAgCis1NSAxODIgMTc0IDIwOCAzIDIxIDk2IDIxOCAxMTIgMTU4IDExMSAxNiAxODcgMTc3IDUgMTc5IDE0MCA4MiA1OSA1MiAxODggMzYgMjAgCisyMTQgNjIgMjkgMTU2IDYyIDQ2IDEwNiAxMDcgMjkgNzAgMTI5IDkxIDg5IDE3NCA1MSAxNSA0NSAxMzYgNDkgMTAwIDE0MiAyMTcgMTgyIAorODggNTUgNDggNCAxNjMgMjAgMTc0IDc0IDE1NiAxOTYgMTEzIDE1MSA5MCA5NiA5MiAxOTEgNyAxMzQgMTM0IDk0IDEwNiAxMzAgMTcwIAorMSAxMDYgMTkzIDc5IDI1IDE0NiAyNCA2NyAxMTIgMzIgMTkwIDg1IDIxMCA3NSAxNSAxMDggNDUgNzMgMzcgMTkzIDIwNSAxNjYgMTk0IAorMSAxNjkgMTAyIDIwNiA2NSAxOTcgMTI5IDUxIDIxOCAxOTggMjA4IDY2IDMzIDEyMCAxNTUgMTYzIDQzIDk1IDUgMTMzIDc4IDEwMyAyIAorMTg1IDEwNSAxMTQgMTY3IDkzIDQgNzcgODcgMTAyIDU3IDMgMjE4IDE3NSA2NyAxMzUgNTYgMTggMTY1IDkyIDE2OCA4NiAyMDMgMTU3IAorMjEyIDEzIDU5IDc1IDEwOSAxODcgMjE3IDk2IDE1NSAyMDMgMzEgNzEgMTg1IDgyIDE5MyAxMTkgMTE2IDEyMiAyMDQgMTYgNyA0OCAKKzIwMSAyMiA4OSAxOTcgMTkyIDYzIDEyNSAxOCAzOSAxNzEgMTcgMTA5IDEwMSA2NCAxNDEgMTM4IDUwIDUzIDEzMyAxMDEgMTI3IDE1MyAKKzQ1IDIwNyAxMDQgMTIxIDE4OCAxMyAyMTYgNjMgODUgMTQ3IDE2NiAxMDggNjggMjE0IDE4OCA1MyA4NyAzOSAxNDggOTYgMTc4IDEyNCAKKzE4MiA0OCA2NyA3MiA0NCAyMTQgMTI1IDQxIDYzIDIxOSA5NyAyMTEgMTk0IDEzNSAxNiAzMCAxODkgMTMyIDIxOSAxOTEgNzAgNDMgCisxNTggMTgxIF4KKzQ3NSAwIDE1MyAxMTggMzcgOTkgNDggOTQgNjAgNjQgMTg5IDQ3IDExOCAxMTAgMTU1IDUxIDIxIDc3IDQgNDMgNjYgMTk1IDE5NiA5OSAKKzIxNSAxMiAxMTAgNiAyMTYgMjQgMTE3IDEzNCAyMDUgMTQyIDEwNSAxNjQgNzYgMTU5IDE3NiAxMDEgMzkgMjE4IDg4IDE4NCAxNjUgCisxNDMgMjYgMzIgMzUgMTcgNyAxMTkgMzEgMjMgMTIzIDEwMSAxMzAgMTM1IDE0NCA5MyA4IDExMyA2NCAyMDcgMTMwIDYyIDIwMSA5MCAKKzgxIDIwNSAxMSAyMiAyMjAgOTQgMiAxNDYgMjYgMTA1IDkxIDIwIDE1NiAyNyAxOTMgMjA4IDE0MiAxNzggMTA3IDc5IDE5OSA4NCA0MSAKKzIgMTI4IDE2NSAxNjEgMTA5IDg1IDE3IDE3NCAzNyA4MSAxODcgMTUwIDc4IDEyOSAxNTkgMTk0IDE4NCA5MiA4NyAyMyAyMTQgMTggNzcgCisxNTMgMjA5IDYzIDQ2IDE3OSA0NiAzMCAxMDIgMzMgMjkgNTAgODIgMTI2IDEwMSAyMDMgNzggMTQ3IDIwIDEzOCA1MyAyNyAxMTcgMjA3IAorMTQ4IDE0NSAzMiAxODEgMTYgMTMgODYgMTc4IDE2IDE2MiAzMCAxNzUgMTk4IDMyIDkwIDk5IDY2IDE3NyAxMTMgMTU1IDEyNCAxODYgCis4MCA0NCA2MCAxMTkgNDkgMTA2IDE3NiAxOTIgNjUgNTIgMTA2IDI3IDI2IDY4IDkyIDE0IDgwIDIxMSAyMDAgMTY5IDIxMyAyNCA0NCAKKzE5MSAyMDIgMTAyIDE5NyAxMTEgMTQwIDk5IDEyNCA5NSA1NCA5NyA0MiA1NCA3OSA2OCAxMTAgOTcgMTMzIDgwIDEzNSAxOTkgMTc1IAorMTgwIDE3MSAxNDYgOCAxMzEgMTQ3IDE1MSAyMjEgMjE5IDkgNTIgMTUgMSA3OSA1MCAyNyA0NCA0MiAxNDUgMTA1IDE1IDE5IDE2MiAKKzEwMyAxMTggMjAxIDcyIDEwNyAxNTIgMTQyIDg3IDE5MCAxMzIgNjggMTkgNzEgNzcgNjIgNzAgNyAxMzcgMTE0IDc2IDIxNCAzNiAxNjAgCis5NyA3OCAyMjAgNzYgMTQxIDkzIDE1NyA1NyA2MSA1OCA5IDEyNSAxODAgNCA2IDY3IDE4OSAxMjAgNjEgMTEzIDgyIDE4MSAxODMgMTUzIAorMTM2IDEyMCA0MyAxMzkgMjkgMTk5IDI2IDEyMyAxNzQgMTg2IDEzOCAxODQgMSA2MSA3NiA4MyAxNzUgMTA3IDYgMTQzIDgxIDExNCAKKzIwNyA3NSA4OSAyOSAzMiAxMDggNzMgMTAgNDYgNDggMTg1IDg2IDExIDk4IDIyMSA4OCAzNSAyMjEgMTQ2IDE3NSA0OSA4OCA5MyAxMzkgCisxOTYgMTE3IDE4OSA2NSAyMDEgMTYzIDI0IDIwOCA1MSAzOSA1MSAxNzAgMTM0IDEgMyA0OSAzMyAxMSAxODkgMTM4IDM1IDE2NiA2NCAKKzExNiAyMTMgMTE1IDcwIDI1IDExMSAxNjcgNTggMTQ5IDY2IDEyMiAzMSA5NiA2NiAxMDQgMTcwIDE1MiAxOTcgMTY5IDE0MCAxOTAgNDEgCisxNTEgNzIgMTYyIDEyIDkyIDE0NSAxNjMgMTU1IDY5IDEwNCAyMSAyMDggMjAwIDk2IDQ4IDIxIDQgNjEgNDAgMTM5IDE3OCAzNCAyMyAKKzE5NiA0NCAxMzMgNjIgNTIgMzMgODQgMjMgMTQxIDE4NCA3NCA0IDc5IDEyMyAxOTIgNDcgMTkxIDUzIDE1OCAyMDAgMTUxIDEzMCA4MCAKKzYyIDM0IDE3MiAxNDAgNDEgMjA2IDE1NCAxMTIgNzAgMTc0IDU1IDE2NCAxOCAxOSAxMyAxNTkgMTIxIDE5IDg5IDE2MCAxMTUgNTIgCisxNjQgMTY3IDc2IDEwIDExOSAxMDQgMTg4IDEyNiAyOCAzOCA3NSAyMjAgMyA4NSA5MCA4IDQwIDggMjA0IDkwIDE1NCAzOSAxNCAxNzEgCisxMjggMTQ3IDc4IDU2IDIxNiAxOTEgMzUgNzUgMTQ3IDE2OSA4MiA1MCAxMDAgMjA5IDQ1IDE4NSAxMyAxNzcgOTUgMTUwIF4KKzQ3MSAwIDcxIDg5IDEzOSA4IDkyIDYwIDE0NCAyNiAxNDIgMTU0IDMgMTIyIDk4IDE2NCAyMTYgMTM0IDE3MiA1OCA5NSAyMDAgMjI0IAorMjAxIDUgODYgMzYgODEgMjkgNjMgNjUgMTYyIDc2IDExIDEzIDE5NiA3OCAxMDggNTUgMTMxIDgwIDY2IDE2MiAxNjEgMjcgMTQyIDE0IAorMTkgMTIzIDE0MSAxMDUgNiAyMjAgMTQ2IDIwOSAyNCAxODQgNDcgMTk4IDE3NSAyMiA4NyAxMzMgMzggMTczIDE5MiAyMDUgMTAzIDkxIAorOTcgMTE1IDEyMiA3IDkyIDEwMyAyNSAyIDIxMyAyMTMgMzYgMTI0IDEzIDYyIDE1MCAyMjEgNjEgMTUwIDM5IDQ1IDE0OSAxMjQgMTA0IAorMTM0IDM4IDEzMCAyMDggMTA5IDE4IDMyIDExMiAyMDEgOTYgMTU4IDE0OSAyMTUgMTc2IDIyIDQ0IDE0OSAzOSA4OCAxMzMgMjIwIDE4OSAKKzE5MyAyMyA0NCA5IDE4MyA4OSA0OCAxNjEgMjA0IDU0IDIyMiAxOTUgMTYzIDE2NyA0MCA0NSAxMDYgMTQwIDggNDkgMjA0IDE0NSA2OSAKKzgzIDE2OSA4OSA5NiAyNCA5MyAxMDMgODUgNDEgMyAzMSAxNTQgNTEgMjEwIDExNSAyMTMgNzkgMTA4IDEyIDE0NyAyMDkgMjA2IDEwMyAKKzE3NiAxMTMgMTE2IDM3IDE3MyAxMCAxODkgMTAyIDE3NiAxNTYgMTAwIDM2IDMzIDY5IDE3NCAxNiAyMDIgNSAxNzEgNTIgODIgNzIgNCAKKzgwIDIzIDE3OCAxNjIgNzAgODMgMjkgMTA1IDY3IDM0IDExOCA0MyAxNDMgMTU0IDE4NSAxMzggMiA3OSAxNTcgMTQ5IDMzIDE2MCAyMSAKKzEyOSAyMDggMjQgMiAzMSA2OSAzNSA4MSA3MiA0NyA2NCAyMiAzOCAyMjEgNTUgMjIyIDE1MiAxNzkgMTY4IDE4MCAyMTEgMTIxIDEgCisyMDcgMjAwIDEzMyAxMjkgMTE3IDgwIDExNCAyNSA1MCA3NiAxMDIgODUgODQgMjEyIDMwIDExMSAxMTAgMTk1IDI5IDE0IDE1MyA1MSAKKzI4IDE5NiAyMTIgMzYgMTY3IDIyMiA2MSAxMDcgNTUgNDYgNjQgNjUgMTE5IDIyMCAxMiA1NiAxMzcgOTMgMTk0IDI5IDU3IDEzNyA1MCAKKzIxMCAzMCAxOTcgNzggNjUgNzEgMTMyIDEyMyA3IDE3NyAyMiAxMjkgNjggMTY4IDMgNzQgMTAgNTAgMTY3IDE3NCAxOTggMjE4IDYgODYgCisyMTggOTcgMTU4IDEwNiA2IDE3NyAxNjIgMjEwIDE2NCAxMjUgNjIgNTkgNTIgMTczIDE2IDIwIDIxNCA0MiA5IDE0MSA1NyA0NiAxMDYgCis5NyAyNCA1MCAxMTkgODYgODQgMTY5IDQ2IDE1IDI1IDEzNiA0NCAxMDAgMTI3IDIwMiAxODIgODMgMzUgMzMgMjA5IDE1OCAxNSAxNTkgCis2NCAxNTYgMTkxIDEwOCAxNDYgNzUgOTYgNzIgMTgxIDIxNyAxMzQgMTI5IDc0IDk2IDExNSAxNjUgMjE2IDkxIDE4OCA1OSAxMCAxNDEgCisxNCA2MiAxMDcgMTIgMTkwIDY1IDIwNSA2MCAxMCA5OCAzMCA2MyAyMiAxNzggMjA1IDE1MSAxNzkgMjExIDE2NCA4MiAyMDYgNjAgMTkyIAorMTE0IDMxIDIwMyAxODggMTkzIDY2IDI4IDEwNSAxNDAgMTQ4IDMzIDc1IDUgMTI4IDY4IDgzIDIxMiAxNzAgOTUgMTA5IDE1MiA4OCAKKzIyNCA2NyA3NyAxMDIgNDIgMyAyMTMgMTcwIDUyIDEyNSA1NiAzIDE2NSA4MiAxNjMgNzYgMTkzIDE1NyAxOTcgMjE4IDQ5IDcwIDg5IAorMTgyIDIxNyA5MSAxNDUgMjAzIDExIDU2IDE4MCA3NyAxOTMgMTE0IDExNiAxMjIgMTg5IDExIDcgNDMgMTkxIDE3IDc0IDE4NyAxODcgCis1MyAxMjUgMTMgMTkgMTY2IDIyMiAxMDQgOTEgNTQgMTMxIDEyMyA1MCAzMyAxMTggODYgMTI3IDE2NyBeCis0ODAgMSA0NSAxOTMgNzYgMTIxIDE4MSAyMTkgMTk1IDQyIDY0IDEyNiAxNjYgODAgNDAgMjAwIDE4OCA1MyA4MCAyNSAxNDggNzUgMTU3IAorMTE3IDE3NSAyMCA1MyA0NCAzMCAyMDcgMTExIDI3IDYzIDE5OCA5NyAyMDQgMTk0IDExNCAyMjIgMjMgMTgyIDEzMiAyMTIgMTcwIDYzIAorMjIgMTQ0IDEyMCAxNDMgMTE4IDM3IDc5IDM4IDk0IDYwIDU0IDE4NCA0NyAxMDggMTEwIDE1MCA0MSAxMSA2MiAyMTEgNDMgNTEgMTgwIAorMTgxIDk0IDIwMCAxMiAxMDAgMjIzIDIwMSAxNCAxMTcgMTI0IDIwMCAxMzcgOTUgMTY0IDc2IDE0NCAxNzEgMTAxIDM0IDIxMyA4MyAKKzE2OSAxNTAgMTQzIDE2IDMyIDIwIDIgMjI0IDExNCAzMSAxOCAxMjMgOTYgMTE1IDEzNSAxMjkgODMgMjIwIDEwOCA1OSAxOTIgMTI1IAorNjIgMTk2IDgwIDc2IDE5NSAyMTggMTcgMjEwIDc5IDIxNCAxMzYgNiAxMDUgOTEgNSAxNDEgMjcgMTg4IDE5MyAxMjcgMTY4IDk3IDc5IAorMTk5IDg0IDMxIDIwOSAxMjggMTU1IDE1MSA5NCA3NSAxNyAxNTkgMzIgNzEgMTg3IDE0MCA2MyAxMjQgMTQ5IDE3OSAxNzkgNzcgNzIgCisxMyAyMDQgMTggNzIgMTM4IDE5OSA0OCAzNiAxNzkgMjYgMjUgOTcgMjggMTQgMzAgODIgMTE2IDg2IDE4OCA2OCAxMzIgMTMzIDM4IDcgCisxMDcgMTk3IDEzMyAxNDAgMTIgMTY2IDYgMyA4NiAxNzMgMTYgMTU3IDE1IDE3MCAxODggMTcgODUgODQgNDYgMTcyIDEwMyAxNDAgMTE0IAorMTcxIDY1IDM5IDQ1IDExOSAzOSA5NiAxNjYgMTgyIDQ1IDMyIDg2IDEyIDI2IDQ4IDg3IDIyNiA4MCAyMDEgMTkwIDE1OSAyMDggMjQgCis0NCAxOTEgMTk3IDgyIDE4MiA5NiAyMTcgMTQwIDk5IDExOSA5MCA1NCA4MiA0MiA0OSA3NCA1MyA5NSA3NyAxMjMgNjAgMTIwIDE5NCAKKzE2NSAxODAgMTY2IDEzMSAyMjUgMTE2IDEzNyAxNDYgMjExIDIxOSA0IDM3IDUgMSA2OSA0NSAxNyAzNCAzNyAxMzAgODUgMTAgOSAxNDcgCis4OCAxMDMgMTkxIDcyIDg3IDE1MiAxMzIgODcgMTc1IDEyMiA1OCAxNCA2NiA3NyA1NyA1MCAyIDEyMiAxMDkgNjEgMjA5IDI2IDE1MCAKKzkyIDU4IDIwNSA3MSAxMzYgOTMgMTQ3IDM3IDU2IDQ4IDIxMiAyMjEgMTEwIDE2NSA0IDIxMyA0NyAxNzQgMTIwIDQxIDExMyA2NyAxODEgCisxNjggMTQ4IDEyNiAxMTUgMzMgMTI0IDI0IDE4NCAxMSAxMTMgMTY5IDE4NiAxMzggMTg0IDIyMyA2MSA1NiA2MyAxNzUgMTA3IDYgMTI4IAorODEgMTE0IDIwNyA2MCA2OSA5IDIyIDkzIDczIDMxIDMzIDE3NSA3MSAxMSA5OCAyMDYgNzMgMTUgMjIxIDE0NiAxNjAgMzQgODggODggCisxMzkgMTg2IDEwMiAxODkgNTUgMTg2IDE1MyA5IDE5OCA0NiAxOSA1MSAxNjUgMTI5IDIwOCAyMTUgNDkgMjMgNiAxNzkgMTI4IDMwIAorMTU2IDY0IDExMSAyMDMgMTA1IDU1IDEwIDExMSAxNTIgNTggMTM5IDYxIDEwNyAyMSA5MSA1NiA5OSAxNzAgMTM3IDE5NyAxNjkgMTM1IAorMTgwIDQxIDEzNiA1NyAxNTIgNyA5MiAxNDUgMTU4IDE1NSA0OSA4OSAxNiAyMDggMjAwIDg2IDQ4IDIxIDIxNiA1MSA0MCAxMzQgMTc4IAorMjQgOCAxOTYgMjkgMTE4IDUyIDQyIDEzIDc5IDIzIDEzMSAxNzQgNjkgMjIxIDU5IDExOCAxNzcgMzcgMTgxIDQzIDE1MyAxODUgMTUxIAorMTMwIDcwIDQ3IDM0IDE2MiAxMjUgMjYgMjAxIDEzOSAxMTIgNjUgMTY0IDQwIDE0OSAzIDIyNiAyMjAgMTU5IDEwNiAxOSA3NCAxNTUgCisxMDAgNDcgMTU5IDE1NyAxOTMgXgorNDcxIDAgMjExIDk4IDEwNCAxNzQgMTI2IDcgMjQgNjEgMjEzIDIyNSA1NyA5MCAxIDMzIDIwOSAxODMgNjIgMTQ3IDM5IDIxNSAxNTcgCisxMjEgMTQ3IDcxIDQ5IDIxNiAxNzAgMzUgNzUgMTQwIDE0OCA1NCAyOSA4NiAxODggMzggMTg1IDIyMSAxNjMgOTUgNTggNzEgODEgMTMxIAorODQgNDQgMTQ0IDEwIDEzNCAxNDIgMjI4IDExOCA4NiAxNTYgMjA0IDEyNiAxNzIgNDYgOTEgMTk2IDIyMCAxOTcgMjE4IDcwIDM2IDczIAorMTMgNDcgNTcgMTU0IDYwIDMgMjI2IDE4OCA3MCAxMDAgNTEgMTMxIDY0IDYyIDE2MiAxNjEgMTUgMTQyIDE0IDExIDExNSAxNDEgOTcgCisyMTkgMjE2IDEzOCAyMDEgMTYgMTcyIDMxIDE5OCAxNjcgNiA3NSAxMjUgMjYgMTczIDE5MiAxOTMgOTUgNzUgOTMgMTExIDExNCAyMjQgCis3NiA5MSAyMTMgMTMgMjI3IDIwMSAyMTMgMjggMTIwIDEgNTAgMTUwIDIxMyA0NSAxNDIgMzEgMzMgMTQ1IDEyNCA5MiAxMzAgMzQgMTI2IAorMjA0IDEwOSAyIDE2IDEwOCAyMDEgODAgMTUwIDE0OSAyMTUgMTcyIDE0IDI4IDEzNyAyMyA4MCAxMzMgMjA4IDE4NSAxODkgMTkgMzYgOSAKKzE4MyA3NyA0MCAxNDkgMjAwIDUwIDIxNCAxOTEgMTYzIDE1OSAzNiA0MSA5OCAxMzYgOCAzNyAyMDQgMTQxIDY1IDc1IDE1NyA4OSA4NCAKKzEyIDgxIDk5IDg1IDI1IDIyNCAyNyAxNTQgNDMgMjEwIDExNSAyMDUgNzUgMTA4IDQgMTQzIDIwOSAxOTggMTAzIDE3NiAxMDUgMTA4IAorMjEgMTY1IDEwIDE4MSA5OCAxNjggMTUyIDk2IDI0IDI5IDY5IDE2NiA4IDIwMiAyMjYgMTcxIDQ4IDcwIDY4IDIxNyA3MiAxNSAxNzQgCisxNTggNzAgODMgMjkgMTAxIDY3IDIyIDExNCAyNyAxMzkgMTUwIDE4MSAxMzAgMiA2MyAxNDUgMTQxIDMzIDE2MCAxNyAxMjEgMTk2IDggCisyMTkgMTkgNTMgMzEgNjUgNjAgMzUgNjAgMTggMzggMjE3IDU1IDIyMiAxNDQgMTc1IDE1NiAxNzIgMjExIDExMyAyMjYgMjAzIDE5MiAKKzEyOSAxMTcgMTA1IDc2IDEwNiAyNSA0MiA2NCA5NCA3NyA3MiAyMTIgMzAgOTkgMTAyIDE5NSAyNSAxMCAxNDkgMzUgMjggMTg0IDIwOCAKKzIwIDE2NyAyMTggNTMgOTUgNDMgMzAgNTIgNjUgMTA3IDIyMCA1MiAxMjkgODUgMTkwIDE3IDU3IDEzNyAzOCAyMDIgMTQgMTkzIDc4IAorNTMgNjMgMTI4IDExOSAzIDE3NyAyMiAxMjkgNjggMTY4IDIxNiA3NCAyMjMgNDYgMTU1IDE3NCAxOTAgMjE0IDIyMyA3OCAyMTggODUgCisxNTggMTAyIDIyNyAxNjkgMTUwIDE5OCAxNTIgMTEzIDQ2IDU5IDUyIDE2MSAyMCAyMTQgMjYgMjIyIDEyOSA1MyA0NiAxMDYgODkgMjAgCiszNCAxMTEgODIgODAgMTY1IDQyIDE1IDkgMTM2IDQwIDEwMCAxMTUgMTkwIDE4MiA3OSAxOSAyMSAxOTcgMTU0IDExIDE0NyA1NiAxNTYgCisxODcgMTA0IDE0MiA2MyA5NiA1NiAxNzMgMjA5IDEzNCAxMjUgNTggODggMTAzIDE2MSAyMTIgNzkgMTg0IDQzIDIyNyAxMzcgNiA1OCAKKzEwMyAyMjUgMTkwIDQ5IDIwMSA0OCA2IDkwIDE4IDU1IDEwIDE2NiAyMDUgMTM5IDE2NyAyMDMgMTYwIDY2IDIwNiA1NiAxODggMTAyIAorMTUgMTkxIDE4MCAxODEgNjYgMjQgOTMgMTI4IDEzNiAyNSA1OSA1IDEyNCA2MCA2NyAyMDQgMTU4IDg3IDEwNSAxNDAgODQgMjI0IDU5IAorNjkgMTAyIDMwIDMgMjA5IDE2NiA0MCAxMTcgNTYgMjIwIDE2NSA3NCAxNTkgNjggMTg1IDE1NyAxODUgMjA2IDQxIDY2IDE2NyBeCis0OTAgMSAxNzYgMjE3IDg1IDEzMyAyMDMgMjE4IDM4IDE3NCA3MSAxOTMgMTA4IDExNiAxMjIgMTcxIDUgNyAzNyAxNzkgMTEgNTYgMTc1IAorMTgxIDQxIDEyNSA3IDIyNiAxNjAgMjA0IDk4IDc5IDQyIDExOSAxMDUgNTAgOSAxMDAgNjggMTI3IDE1MyA0NSAxODUgNjAgMTIxIDE3NyAKKzIxMSAxODMgMzAgNTIgMTE0IDE2NiA2NCAyNCAxOTIgMTg4IDUzIDc2IDE3IDE0OCA2MyAxNDUgMTEzIDE3MSA0IDQ1IDI4IDIyIDIwMyAKKzEwMyAxOSA2MyAxODYgOTcgMjAwIDE5NCAxMDIgMjE0IDE5IDE3OCAxMzIgMjA4IDE1OCA1OSAxMCAxMzYgMTEyIDEzNSAxMTggMzcgNjMgCiszMCA5NCA2MCA0NiAxODAgNDcgMTAwIDExMCAxNDYgMzMgMyA1MCAxOTkgNDMgMzkgMTY4IDE2OSA5MCAxODggMTIgOTIgMjE5IDE4OSA2IAorMTE3IDExNiAxOTYgMTMzIDg3IDE2NCA3NiAxMzIgMTY3IDEwMSAzMCAyMDkgNzkgMTU3IDEzOCAxNDMgOCAzMiA4IDIyMSAyMjAgMTEwIAorMzEgMTQgMTIzIDkyIDEwMyAxMzUgMTE3IDc1IDIxMiAxMDQgNTUgMTgwIDEyMSA2MiAxOTIgNzIgNzIgMTg3IDIwNiAxMyAyMDIgNjcgCisyMDYgMTI4IDIyMSAxMDUgOTEgMjI0IDEyOSAyNyAxODQgMTgxIDExNSAxNjAgODkgNzkgMTk5IDg0IDIzIDE5NyAxMjggMTQ3IDE0MyAKKzgyIDY3IDE3IDE0NyAyOCA2MyAxODcgMTMyIDUxIDEyMCAxNDEgMTY3IDE3NSA2NSA2MCA1IDE5NiAxOCA2OCAxMjYgMTkxIDM2IDI4IAorMTc5IDEwIDIxIDkzIDI0IDIgMTQgODIgMTA4IDc0IDE3NiA2MCAxMjAgMjE1IDEyOSAyNiAyMjIgOTkgMTg5IDEyMSAxMzYgMjI3IDE1NCAKKzIyOSAyMjYgODYgMTY5IDE2IDE1MyAzIDE2NiAxODAgNSA4MSA3MiAzMCAxNjggOTUgMTI4IDEwNiAxNTkgNTMgMzUgMzMgMTE5IDMxIAorODggMTU4IDE3NCAyOSAxNiA3MCAyNiAzMiA4MyAyMTggODAgMTkzIDE4MiAxNTEgMjA0IDI0IDQ0IDE5MSAxOTMgNjYgMTcwIDg0IDIxMyAKKzE0MCA5OSAxMTUgODYgNTQgNzAgNDIgNDUgNzAgNDEgODMgNjEgMTE1IDQ0IDEwOCAxOTAgMTU3IDE4MCAxNjIgMTE5IDIyMSAxMDQgCisxMjkgMTQyIDIwMyAyMTkgMjUgMjI4IDEgNjEgNDEgOSAyNiAzMyAxMTggNjkgNiAxIDEzNSA3NiA5MSAxODMgNzIgNzEgMTUyIDEyNCAKKzg3IDE2MyAxMTQgNTAgMTAgNjIgNzcgNTMgMzQgMjI5IDExMCAxMDUgNDkgMjA1IDE4IDE0MiA4OCA0MiAxOTMgNjcgMTMyIDkzIDEzOSAKKzIxIDUyIDQwIDIwNCAyMTMgOTggMTUzIDQgMjAxIDMxIDE2MiAxMjAgMjUgMTEzIDU1IDE4MSAxNTYgMTQ0IDExOCAxMTEgMjUgMTEyIAorMjAgMTcyIDIzMCAxMDUgMTY1IDE4NiAxMzggMTg0IDIyMyA2MSA0MCA0NyAxNzUgMTA3IDYgMTE2IDgxIDExNCAyMDcgNDggNTMgMjI0IAorMTQgODEgNzMgMjIzIDE5IDIxIDE2NyA1OSAxMSA5OCAxOTQgNjEgMjMwIDIyMSAxNDYgMTQ4IDIyIDg4IDg0IDEzOSAxNzggOTAgMTg5IAorNDcgMTc0IDE0NSAyMjggMTkwIDQyIDMgNTEgMTYxIDEyNSAxOTYgMjA3IDQ5IDE1IDIgMTcxIDEyMCAyNiAxNDggNjQgMTA3IDE5NSA5NyAKKzQzIDIyOSAxMTEgMTQwIDU4IDEzMSA1NyA5NSAxMyA4NyA0OCA5NSAxNzAgMTI1IDE5NyAxNjkgMTMxIDE3MiA0MSAxMjQgNDUgMTQ0IDMgCis5MiAxNDUgMTU0IDE1NSAzMyA3NyAxMiAyMDggMjAwIDc4IDQ4IDIxIDIwOCA0MyA0MCAxMzAgMTc4IDE2IDIyNyAxOTYgMTcgMTA2IDQ0IAorMzQgMjI4IDc1IDIzIDEyMyAxNjYgNjUgMjE3IDQzIDExNCAxNjUgMjkgMTczIDM1IDIwMCBeCis0NzkgMCAxNjcgMTUxIDEzMCA1OCAyOSAzNCAxNTAgMTA3IDggMTk1IDEyMSAxMTIgNTkgMTUyIDIyIDEzMSAyMTggMjA4IDIwMiAxNTkgCis4OCAxOSA1NiAxNDkgODIgNDEgMTUzIDE0NSA1NCAxOTkgODYgMTA0IDE2NiAxMjYgMjI4IDE2IDUzIDIwOSAyMjUgNDEgOTAgMjMwIDI5IAorMTk3IDE3MSA0NiAxNDMgMzkgMjAzIDE0OSAxMTcgMTQ3IDY3IDQ1IDIxNiAxNTggMzUgNzUgMTM2IDEzNiAzOCAxNyA3OCAxNzYgMzQgCisxODUgMjEzIDE1NSA5NSA1MCA3MSA3MyAxMjMgMjI1IDc2IDI4IDE0NCAyMjcgMTI2IDEzMCAyMjggMTE0IDc0IDE0OCAxOTIgMTE4IAorMTcyIDM0IDg3IDE5MiAyMTYgMTkzIDIwNiA1NCAzNiA2NSAyMzAgMzEgNDkgMTQ2IDQ0IDIyOCAyMTQgMTgwIDYyIDkyIDQ3IDEzMSA0OCAKKzU4IDE2MiAxNjEgMyAxNDIgMTQgMyAxMDcgMTQxIDg5IDIwNyAyMTIgMTMwIDE5MyA4IDE2MCAxNSAxOTggMTU5IDIyMyA2MyAxMTcgMTQgCisxNzMgMTkyIDE4MSA4NyA1OSA4OSAxMDcgMTA2IDIxNiA2MCA3OSAyMDEgMSAyMjcgMTg5IDIxMyAyMCAxMTYgMjIyIDM4IDE1MCAyMDUgCisyOSAxMzQgMjMgMjEgMTQxIDEyNCA4MCAxMjYgMzAgMTIyIDIwMCAxMDkgMjE5IDEwNCAyMDEgNjQgMTQyIDE0OSAyMTUgMTY4IDYgMTIgCisxMjUgNyA3MiAxMzMgMTk2IDE4MSAxODUgMTUgMjggOSAxODMgNjUgMzIgMTM3IDE5NiA0NiAyMDYgMTg3IDE2MyAxNTEgMzIgMzcgOTAgCisxMzIgOCAyNSAyMDQgMTM3IDYxIDY3IDE0NSA4OSA3MiA2OSA5NSA4NSA5IDIyMCAyMyAxNTQgMzUgMjEwIDExNSAxOTcgNzEgMTA4IAorMjI5IDEzOSAyMDkgMTkwIDEwMyAxNzYgOTcgMTAwIDUgMTU3IDEwIDE3MyA5NCAxNjAgMTQ4IDkyIDEyIDI1IDY5IDE1OCAyMDIgMjIyIAorMTcxIDQ0IDU4IDY0IDIwNSA2NCA3IDE3MCAxNTQgNzAgODMgMjkgOTcgNjcgMTAgMTEwIDExIDEzNSAxNDYgMTc3IDEyMiAyIDQ3IDEzMyAKKzEzMyAzMyAxNjAgMTMgMTEzIDE4NCAyMjUgMjExIDcgMzcgMjcgNDkgNDggMjMgNTYgMTQgMzggMjEzIDU1IDIyMiAxMzYgMTcxIDE0NCAKKzE2NCAyMTEgMTA1IDIyNiAxOTkgMTg0IDEyNSAxMDUgOTMgNzIgOTggMjUgMzQgNTIgODYgNjkgNjAgMjEyIDMwIDg3IDk0IDE5NSAyMSAKKzYgMTQ1IDE5IDI4IDE3MiAyMDQgNCAxNjcgMjE0IDQ1IDgzIDMxIDE0IDQwIDY1IDk1IDIyMCAyMjEgNDggMTIxIDc3IDE4NiA1IDU3IAorMTM3IDI2IDE5NCAyMzEgMTg5IDc4IDQxIDU1IDEyNCAxMTUgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIwNCA3NCAyMTEgNDIgMTQzIDE3NCAKKzE4MiAyMTAgMjE1IDcwIDIxOCA3MyAxNTggOTggMjIzIDE2MSAxMzggMTg2IDE0MCAxMDEgMzAgNTkgNTIgMTQ5IDIxNyAyMCAyMTQgMTAgCisyMTAgMTE3IDQ5IDQ2IDEwNiA4MSAxNiAxOCAxMDMgNzggNzYgMTYxIDM4IDE1IDIyNiAxMzYgMzYgMTAwIDEwMyAxNzggMTgyIDc1IDMgCis5IDE4NSAxNTAgNyAxMzUgNDggMTU2IDE4MyAxMDAgMTM4IDUxIDk2IDQwIDE2NSAyMDEgMTM0IDEyMSA0MiA4MCA5MSAxNTcgMjA4IDY3IAorMTgwIDI3IDIxOSAxMzMgMjMxIDU0IDk5IDIxMyAxOTAgMzMgMTk3IDM2IDIgODIgNiA0NyAyMzEgMTU0IDIwNSAxMjcgMTU1IDE5NSAKKzE1NiA1MCAyMDYgNTIgMTg0IDkwIDIzMiAxNzkgMTcyIDE2OSA2NiAyMCA4MSAxMTYgMTI0IDE3IDQzIDUgMTIwIDUyIDUxIDE5NiAxNDYgCis3OSAxMDEgMTI4IDgwIDIyNCA2NSBeCis1MDMgMSA1NSAxMDIgOSAzIDIwMiAxNTkgMTkgMTAzIDU2IDIwNiAxNjUgNjAgMTUyIDU0IDE3MSAxNTcgMTY0IDE4NSAyNyA1OSA0NSAKKzE3MSAyMTcgODAgMTIzIDIwMyAyMDMgMjMgMTY5IDY2IDE5MyAxMDMgMTE2IDEyMiAxNTYgNyAzMiAxNjkgNiA0MSAxNjUgMTc2IDMxIAorMTI1IDIgMjExIDE1NSAxODkgOTMgNjkgMzIgMTA5IDkwIDUwIDIyNSA4NSA1MyAxMjcgMTUzIDQ1IDE3NSA0MCAxMjEgMTcyIDIwMSAKKzE2OCAxNSAzNyA5OSAxNjYgNDQgNCAxODIgMTg4IDUzIDcxIDcgMTQ4IDQ4IDEzMCAxMDggMTY2IDIyMCAzNSA4IDEyIDE5OCA5MyA5IAorNjMgMTcxIDk3IDE5NSAxOTQgODcgMjA0IDE0IDE3MyAxMzIgMjAzIDE0MyA1NCAyMzEgMTI2IDEwMiAxMjUgMTE4IDM3IDQzIDIwIDk0IAorNjAgMzYgMTc1IDQ3IDkwIDExMCAxNDEgMjMgMjI5IDM1IDE4NCA0MyAyNCAxNTMgMTU0IDg1IDE3MyAxMiA4MiAyMTQgMTc0IDIzMiAKKzExNyAxMDYgMTkxIDEyOCA3NyAxNjQgNzYgMTE3IDE2MiAxMDEgMjUgMjA0IDc0IDE0MiAxMjMgMTQzIDIzNCAzMiAyMjkgMjExIDIxNSAKKzEwNSAzMSA5IDEyMyA4NyA4OCAxMzUgMTAyIDY1IDIwMiA5OSA1MCAxNjUgMTE2IDYyIDE4NyA2MiA2NyAxNzcgMTkxIDggMTkyIDUyIAorMTk2IDExOCAyMDYgMTA1IDkxIDIxNCAxMTQgMjcgMTc5IDE2NiAxMDAgMTUwIDc5IDc5IDE5OSA4NCAxMyAxODIgMTI4IDEzNyAxMzMgCis2NyA1NyAxNyAxMzIgMjMgNTMgMTg3IDEyMiAzNiAxMTUgMTMxIDE1MiAxNzAgNTAgNDUgMjMxIDE4NiAxOCA2MyAxMTEgMTgxIDIxIDE4IAorMTc5IDIyNiAxNiA4OCAxOSAyMjMgMjMwIDgyIDk4IDU5IDE2MSA1MCAxMDUgMjAwIDEyNCAxMSAyMDcgODkgMTc5IDEwNiAxMzEgMjEyIAorMTM5IDIyNCAyMjEgODYgMTY0IDE2IDE0OCAyMjQgMTYxIDE3MCAyMjYgNzYgNTcgMTAgMTYzIDg1IDExMyA5NiAxNDQgMzggMzAgMTggCisxMTkgMjEgNzggMTQ4IDE2NCA5IDIzMiA1MCAyMjEgMjYgMTIgNzggMjA4IDgwIDE4MyAxNzIgMTQxIDE5OSAyNCA0NCAxOTEgMTg4IDQ2IAorMTU1IDY5IDIwOCAxNDAgOTkgMTEwIDgxIDU0IDU1IDQyIDQwIDY1IDI2IDY4IDQxIDEwNSAyNCA5MyAxODUgMTQ3IDE4MCAxNTcgMTA0IAorMjE2IDg5IDExOSAxMzcgMTkzIDIxOSAyMzEgMTAgMjIzIDEgNTEgMzYgMjM1IDE2IDI4IDEwMyA0OSAxIDIyNyAxMjAgNjEgNzYgMTczIAorNzIgNTEgMTUyIDExNCA4NyAxNDggMTA0IDQwIDUgNTcgNzcgNDggMTQgMjI5IDk1IDEwMCAzNCAyMDAgOCAxMzIgODMgMjIgMTc4IDYyIAorMTI3IDkzIDEyOSAxIDQ3IDMwIDE5NCAyMDMgODMgMTM4IDQgMTg2IDExIDE0NyAxMjAgNSAxMTMgNDAgMTgxIDE0MSAxMzkgMTA4IDEwNiAKKzE1IDk3IDE1IDE1NyAyMjAgOTUgMTYwIDE4NiAxMzggMTg0IDIyMyA2MSAyMCAyNyAxNzUgMTA3IDYgMTAxIDgxIDExNCAyMDcgMzMgMzMgCisyMDkgNCA2NiA3MyAyMTggNCA2IDE1NyA0NCAxMSA5OCAxNzkgNDYgMjE1IDIyMSAxNDYgMTMzIDcgODggNzkgMTM5IDE2OCA3NSAxODkgCiszNyAxNTkgMTM1IDIxOCAxODAgMzcgMjE5IDUxIDE1NiAxMjAgMTgxIDE5NyA0OSA1IDIzMyAxNjEgMTEwIDIxIDEzOCA2NCAxMDIgMTg1IAorODcgMjggMjE5IDExMSAxMjUgNTggMTIxIDUyIDgwIDMgODIgMzggOTAgMTcwIDExMCAxOTcgMTY5IDEyNiAxNjIgNDEgMTA5IDMwIDEzNCAKKzIzNCA5MiAxNDUgMTQ5IDE1NSAxMyA2MiA3IDIwOCAyMDAgNjggNDggMjEgMTk4IDMzIDQwIDEyNSAxNzggNiAyMTcgMTk2IDIgOTEgMzQgCisyNCAyMTMgNzAgMjMgMTEzIDE2MSBeCis0NzAgMCA1OCAyMTAgMTUgMTA3IDE0NCAxNSAxNTkgMjEgMTQyIDE1MiAxNTEgMTMwIDQ4IDE0IDM0IDE0MCA5MiAyMzEgMTkwIDEwNiAKKzExMiA1NCAxNDIgNyAxMTYgMjA4IDE5MyAxODcgMTU5IDczIDE5IDQxIDE0NCA2NyAzNiAxNDggMTM1IDQ0IDE4NCA3MSAxMDQgMTU2IAorMTI2IDIxOCA2IDQzIDIwNCAyMjUgMjEgOTAgMjMwIDI0IDE4MiAxNTYgMjYgMTM4IDM5IDE4OCAxMzkgMTEyIDE0NyA2MiA0MCAyMTYgCisxNDMgMzUgNzUgMTMxIDEyMSAxOCAyIDY4IDE2MSAyOSAxODUgMjAzIDE0NSA5NSA0MCA3MSA2MyAxMTMgMjIwIDY2IDggMTQ0IDIxMiAKKzExNiAxMTUgMjI4IDEwOSA1OSAxMzggMTc3IDEwOCAxNzIgMTkgODIgMTg3IDIxMSAxODggMTkxIDM0IDM2IDU1IDIxNSAxMSAzOSAxMzYgCisyNCAyMjMgMTk5IDE3MCA1MiA4MiA0MiAxMzEgMjggNTMgMTYyIDE2MSAyMjYgMTQyIDE0IDIzMSA5NyAxNDEgNzkgMTkyIDIwNyAxMjAgCisxODMgMjM2IDE0NSAyMzMgMTk4IDE0OSAyMDggNDggMTA3IDIzNyAxNzMgMTkyIDE2NiA3NyAzOSA4NCAxMDIgOTYgMjA2IDQwIDY0IAorMTg2IDIyNCAyMjcgMTc0IDIxMyAxMCAxMTEgMjEyIDIzIDE1MCAxOTUgOSAxMjQgMTMgNiAxMzYgMTI0IDY1IDEyMSAyNSAxMTcgMTk1IAorMTA5IDIwNCAyMTggOTkgMjAxIDQ0IDEzMiAxNDkgMjE1IDE2MyAyMzQgMjMwIDExMCAyMjUgNjIgMTMzIDE4MSAxNzYgMTgwIDEwIDE4IAorOSAxODMgNTAgMjIgMTIyIDE5MSA0MSAxOTYgMTgyIDE2MyAxNDEgMjcgMzIgODAgMTI3IDggMTAgMjA0IDEzMiA1NiA1NyAxMzAgODkgCis1NyAyMjMgNTQgOTAgODUgMjI3IDIxNSAxOCAxNTQgMjUgMjEwIDExNSAxODcgNjYgMTA4IDIyNCAxMzQgMjA5IDE4MCAxMDMgMTc2IDg3IAorOTAgMjIzIDE0NyAxMCAxNjMgODkgMTUwIDE0MyA4NyAyMzUgMjAgNjkgMTQ4IDIyOCAyMDIgMjE3IDE3MSAzOSA0MyA1OSAxOTAgNTQgCisyMzUgMTY1IDE0OSA3MCA4MyAyOSA5MiA2NyAyMzMgMTA1IDIyOSAxMzAgMTQxIDE3MiAxMTIgMiAyNyAxMTggMTIzIDMzIDE2MCA4IAorMTAzIDE2OSAyMTAgMjAxIDIzMCAxNyAyMiAyOSAzMyA4IDUxIDkgMzggMjA4IDU1IDIyMiAxMjYgMTY2IDEyOSAxNTQgMjExIDk1IDIyNiAKKzE5NCAxNzQgMTIwIDkwIDc4IDY3IDg4IDI1IDI0IDM3IDc2IDU5IDQ1IDIxMiAzMCA3MiA4NCAxOTUgMTYgMSAxNDAgMjM3IDI4IDE1NyAKKzE5OSAyMjIgMTY3IDIwOSAzNSA2OCAxNiAyMzIgMjUgNjUgODAgMjIwIDIxMSA0MyAxMTEgNjcgMTgxIDIyOCA1NyAxMzcgMTEgMTg0IAorMjE2IDE4NCA3OCAyNiA0NSAxMTkgMTEwIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxODkgNzQgMTk2IDM3IDEyOCAxNzQgMTcyIDIwNSAKKzIwNSA2MCAyMTggNTggMTU4IDkzIDIxOCAxNTEgMTIzIDE3MSAxMjUgODYgMTAgNTkgNTIgMTM0IDIwMiAyMCAyMTQgMjI4IDE5NSAxMDIgCis0NCA0NiAxMDYgNzEgMTEgMjM2IDkzIDczIDcxIDE1NiAzMyAxNSAyMTEgMTM2IDMxIDEwMCA4OCAxNjMgMTgyIDcwIDIyMSAyMzIgMTcwIAorMTQ1IDIgMTIwIDM4IDE1NiAxNzggOTUgMTMzIDM2IDk2IDIwIDE1NSAxOTEgMTM0IDExNiAyMiA3MCA3NiAxNTIgMjAzIDUyIDE3NSA3IAorMjA5IDEyOCAyMjYgNDkgOTQgMTk4IDE5MCAxMyAxOTIgMjEgMjM1IDcyIDIyOSAzNyAyMjEgMTM5IDIwNSAxMTIgMTQwIDE4NSAxNTEgCiszMCAyMDYgNDcgMTc5IDc1IDIxNyAxMDEgXgorNTAyIDAgMTU4IDE0OCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAyMyAxODIgMTI1IDY1IDk0IDEwNyA3MyAyMjQgMzcgNDcgCisxMDIgMjM3IDMgMTk4IDE1NSA3IDk1IDU2IDE5OCAxNjUgNTIgMTQ4IDQ2IDE2MyAxNTcgMTUyIDE3MyAxOSA1NSAyOSAxNjcgMjE3IDc2IAorMTE1IDIwMyAxOTEgMTEgMTY1IDYyIDE5MyA5OSAxMTYgMTIyIDE0NCAyMzYgNyAyOCAxNjEgMiAyOSAxNTcgMTcyIDIzIDEyNSAyMzggCisxOTkgMTUxIDE3NyA4OSA2MSAyNCAxMDEgNzggNTAgMjEzIDczIDQxIDEyNyAxNTMgNDUgMTY3IDI0IDEyMSAxNjggMTkzIDE1NiAzIDI1IAorODcgMTY2IDI4IDIyOCAxNzQgMTg4IDUzIDY3IDIzOSAxNDggMzYgMTE4IDEwNCAxNjIgMjA4IDI3IDIzMiA0IDE5NCA4NSAxIDYzIDE1OSAKKzk3IDE5MSAxOTQgNzUgMTk2IDEwIDE2OSAxMzIgMTk5IDEzMSA1MCAyMjMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggCisxNzEgNDcgODIgMTEwIDEzNyAxNSAyMjUgMjMgMTcyIDQzIDEyIDE0MSAxNDIgODEgMTYxIDEyIDc0IDIxMCAxNjIgMjI4IDExNyA5OCAKKzE4NyAxMjQgNjkgMTY0IDc2IDEwNSAxNTggMTAxIDIxIDIwMCA3MCAxMzAgMTExIDE0MyAyMzAgMzIgMjIxIDIwMyAyMTEgMTAxIDMxIDUgCisxMjMgODMgNzYgMTM1IDkwIDU3IDE5NCA5NSA0NiAxNTMgMTEyIDYyIDE4MyA1NCA2MyAxNjkgMTc5IDQgMTg0IDQwIDE4OCAxMTAgMTk0IAorMTA1IDkxIDIwNiAxMDIgMjcgMTc1IDE1NCA4OCAxNDIgNzEgNzkgMTk5IDg0IDUgMTcwIDEyOCAxMjkgMTI1IDU1IDQ5IDE3IDEyMCAxOSAKKzQ1IDE4NyAxMTQgMjQgMTExIDEyMyAxNDAgMTY2IDM4IDMzIDIyNyAxNzggMTggNTkgOTkgMTczIDkgMTAgMTc5IDIxNCAxMiA4NCAxNSAKKzIxNSAyMTggODIgOTAgNDcgMTQ5IDQyIDkzIDE4OCAxMjAgMjM5IDE5NSA4MSAxNzEgOTQgMTI3IDIwMCAxMjcgMjIwIDIxNyA4NiAxNjAgCisxNiAxNDQgMjE2IDE1NyAxNjIgMjE4IDcyIDQ1IDIzNCAxNTkgNzcgMTAxIDg4IDEzMiAyNiAyNiA2IDExOSAxMyA3MCAxNDAgMTU2IAorMjMzIDIyMCAzNCAyMTMgMjYgMjM2IDc0IDIwMCA4MCAxNzUgMTY0IDEzMyAxOTUgMjQgNDQgMTkxIDE4NCAzMCAxNDMgNTcgMjA0IDE0MCAKKzk5IDEwNiA3NyA1NCA0MyA0MiAzNiA2MSAxNCA1NiAyNSA5NyA4IDgxIDE4MSAxMzkgMTgwIDE1MyA5MiAyMTIgNzcgMTExIDEzMyAxODUgCisyMTkgMjMxIDIzOCAyMTkgMSA0MyAzMiAyMzEgOCAyNCA5MSAzMyAyMzcgMjIzIDEwOCA0OSA2NCAxNjUgNzIgMzUgMTUyIDEwNiA4NyAKKzEzNiA5NiAzMiAxIDUzIDc3IDQ0IDIzOCAyMjkgODMgOTYgMjIgMTk2IDEyNCA3OSA2IDE2NiA1OCAxMjMgOTMgMTIxIDIyNSA0MyAyMiAKKzE4NiAxOTUgNzEgMTI2IDQgMTc0IDIzNSAxMzUgMTIwIDIyOSAxMTMgMjggMTgxIDEyOSAxMzUgMTAwIDEwMiA3IDg1IDExIDE0NSAyMTIgCis4NyAxNTYgMTg2IDEzOCAxODQgMjIzIDYxIDQgMTEgMTc1IDEwNyA2IDg5IDgxIDExNCAyMDcgMjEgMTcgMTk3IDIzNiA1NCA3MyAyMTQgCisyMzIgMjM0IDE0OSAzMiAxMSA5OCAxNjcgMzQgMjAzIDIyMSAxNDYgMTIxIDIzNSA4OCA3NSAxMzkgMTYwIDYzIDE4OSAyOSAxNDcgMTI3IAorMjEwIDE3MiAzMyAyMDcgNTEgMTUyIDExNiAxNjkgMTg5IDQ5IDIzNyAyMzMgMTUzIDEwMiAxNyAxMzAgNjQgOTggMTc3IDc5IDE2IDIxMSAKKzExMSAxMTMgNTggMTEzIDQ4IDY4IDIzNSA3OCAzMCA4NiAxNzAgOTggMTk3IDE2OSAxMjIgMTU0IDQxIDk3IDE4IDEyNiAyMzQgOTIgCisxNDUgMTQ1IDE1NSAyMzcgNTAgMjA5IF4KKzQ4MSAxIDIwOCAyMDAgNTYgNDggMjEgMTg2IDIxIDQwIDExOSAxNzggMjM2IDIwNSAxOTYgMjI2IDczIDIyIDEyIDE5NSA2NCAyMyAxMDEgCisxNDQgNTQgMjA2IDI0MSAxMDMgMTMyIDcgMTUxIDEzIDEzOCAxNDAgMTUxIDEzMCA0MCAyIDM0IDEzMiA4MCAyMjMgMTg2IDk0IDExMiAKKzUwIDEzNCAyMzcgMTA0IDIwMCAxODEgMTc1IDE1OSA2MSAxOSAyOSAxNDAgNTUgMzIgMTQ0IDEyNyAzNiAxNzIgNTkgMTA0IDE0OCAxMjYgCisyMTAgMjQwIDM1IDIwMCAyMjUgNSA5MCAyMzAgMjAgMTcwIDE0NCAxMCAxMzQgMzkgMTc2IDEzMSAxMDggMTQ3IDU4IDM2IDIxNiAxMzEgCiszNSA3NSAxMjcgMTA5IDIgMjMyIDYwIDE0OSAyNSAxODUgMTk1IDEzNyA5NSAzMiA3MSA1NSAxMDUgMjE2IDU4IDIzNCAxNDQgMjAwIAorMTA4IDEwMyAyMjggMTA1IDQ3IDEzMCAxNjUgMTAwIDE3MiA3IDc4IDE4MyAyMDcgMTg0IDE3OSAxOCAzNiA0NyAyMDMgMjM3IDMxIDEyOCAKKzggMjE5IDE4NyAxNjIgNDQgNzQgMzggMTMxIDEyIDQ5IDE2MiAxNjEgMjE4IDE0MiAxNCAyMjcgODkgMTQxIDcxIDE4MCAyMDMgMTEyIAorMTc1IDIzMiAxMzMgMjIxIDE5OCAxNDEgMTk2IDM2IDk5IDIyOSAxNzMgMTkyIDE1NCA2OSAyMyA4MCA5OCA4OCAxOTggMjQgNTIgMTc0IAorMjE2IDIyNyAxNjIgMjEzIDIgMTA3IDIwNCAxMSAxNTAgMTg3IDIzNSAxMTYgNSAyMzYgMTMyIDEyNCA1MyAxMTcgMjEgMTEzIDE5MSAKKzEwOSAxOTIgMjA2IDk1IDIwMSAyOCAxMjQgMTQ5IDIxNSAxNTkgMjMwIDIxOCA5OCAyMTMgNTQgMTMzIDE2OSAxNzIgMTc2IDYgMTAgOSAKKzE4MyAzOCAxNCAxMTAgMTg3IDM3IDE4OCAxNzggMTYzIDEzMyAyMyAyOCA3MiAxMjMgOCAyNDAgMjA0IDEyOCA1MiA0OSAxMTggODkgNDUgCisyMTUgNDIgODYgODUgMjE1IDIxMSAxNCAxNTQgMTcgMjEwIDExNSAxNzkgNjIgMTA4IDIyMCAxMzAgMjA5IDE3MiAxMDMgMTc2IDc5IDgyIAorMjExIDEzOSAxMCAxNTUgODUgMTQyIDEzOSA4MyAyMjcgMTYgNjkgMTQwIDIyNCAyMDIgMjEzIDE3MSAzNSAzMSA1NSAxNzggNDYgMjMxIAorMTYxIDE0NSA3MCA4MyAyOSA4OCA2NyAyMjUgMTAxIDIxNyAxMjYgMTM3IDE2OCAxMDQgMiAxMSAxMDYgMTE1IDMzIDE2MCA0IDk1IDE1NyAKKzE5OCAxOTMgMjIyIDEgMTggMTMgMjEgMjM4IDQ3IDUgMzggMjA0IDU1IDIyMiAxMTggMTYyIDExNyAxNDYgMjExIDg3IDIyNiAxOTAgCisxNjYgMTE2IDc4IDY2IDYzIDgwIDI1IDE2IDI1IDY4IDUxIDMzIDIxMiAzMCA2MCA3NiAxOTUgMTIgMjM5IDEzNiAyMjUgMjggMTQ1IAorMTk1IDIxMCAxNjcgMjA1IDI3IDU2IDQgMjIwIDEzIDY1IDY4IDIyMCAyMDMgMzkgMTAzIDU5IDE3NyAyMjAgNTcgMTM3IDI0MSAxNzYgCisyMDQgMTgwIDc4IDE0IDM3IDExNSAxMDYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE3NyA3NCAxODQgMzMgMTE2IDE3NCAxNjQgMjAxIAorMTk3IDUyIDIxOCA0NiAxNTggODkgMjE0IDE0MyAxMTEgMTU5IDExMyA3NCAyMzYgNTkgNTIgMTIyIDE5MCAyMCAyMTQgMjE2IDE4MyA5MCAKKzQwIDQ2IDEwNiA2MyA3IDIyNCA4NSA2OSA2NyAxNTIgMjkgMTUgMTk5IDEzNiAyNyAxMDAgNzYgMTUxIDE4MiA2NiAyMDkgMjI0IDE1OCAKKzE0MSAyNDAgMTA4IDMwIDE1NiAxNzQgOTEgMTI5IDI0IDk2IDQgMTQ3IDE4MyAxMzQgMTEyIDYgNjIgNjQgMTQ4IDE5OSA0MCAxNzEgCisyMzMgMjAxIDEyNCAyMjIgNDUgOTAgMTg2IDE5MCAyMzkgMTg4IDkgMjM1IDY0IDIyMSAyOSAyMTMgMTI3IDE3OCBeCis1MDggMSA5NCAxMjIgMTczIDE0NSA2IDIwNiA0MSAxNzMgNTcgMTk5IDE0NiAxNTAgMTM2IDY2IDkgNDggODMgOTEgMjM5IDI0MyA1IAorMTA5IDMwIDcgMTc0IDExMyA1NyA5MCA5NSA2OSAyMjQgMjkgMzkgMTAyIDIyOSAzIDE5NCAxNTEgMjM5IDg3IDU2IDE5MCAxNjUgNDQgCisxNDQgMzggMTU1IDE1NyAxNDAgMTYxIDExIDUxIDEzIDE2MyAyMTcgNzIgMTA3IDIwMyAxNzkgMjQzIDE2MSA1OCAxOTMgOTUgMTE2IAorMTIyIDEzMiAyMzYgNyAyNCAxNTMgMjQyIDE3IDE0OSAxNjggMTUgMTI1IDIzOCAxODcgMTQ3IDE2NSA4NSA1MyAxNiA5MyA2NiA1MCAKKzIwMSA2MSAyOSAxMjcgMTUzIDQ1IDE1OSA4IDEyMSAxNjQgMTg1IDE0NCAyMzUgMTMgNzUgMTY2IDEyIDIxNiAxNjYgMTg4IDUzIDYzIAorMjM1IDE0OCAyNCAxMDYgMTAwIDE1OCAxOTYgMTkgMjIwIDI0MCAxOTAgNzcgMjM3IDYzIDE0NyA5NyAxODcgMTk0IDYzIDE4OCA2IDE2NSAKKzEzMiAxOTUgMTE5IDQ2IDIxNSAxMTAgODYgMTA5IDExOCAzNyAxMSA0IDk0IDYwIDIwIDE2NyA0NyA3NCAxMTAgMTMzIDcgMjIxIDExIAorMTYwIDQzIDEyOSAxMzAgNzcgMTQ5IDEyIDY2IDIwNiAxNTAgMjI0IDExNyA5MCAxODMgMTIwIDYxIDE2NCA3NiA5MyAxNTQgMTAxIDE3IAorMTk2IDY2IDExOCA5OSAxNDMgMjI2IDMyIDIxMyAxOTUgMjA3IDk3IDMxIDEgMTIzIDc5IDY0IDEzNSA3OCA0OSAxODYgOTEgNDIgMTQxIAorMTA4IDYyIDE3OSA0NiA1OSAxNjEgMTY3IDE3NiAyOCAxODAgMTAyIDE4MiAxMDUgOTEgMTk4IDkwIDI3IDE3MSAxNDIgNzYgMTM0IDYzIAorNzkgMTk5IDg0IDI0MSAxNTggMTI4IDEyMSAxMTcgNDMgNDEgMTcgMTA4IDE1IDM3IDE4NyAxMDYgMTIgMTA3IDExNSAxMjggMTYyIDI2IAorMjEgMjIzIDE3MCAxOCA1NSA4NyAxNjUgMjQxIDIgMTc5IDIwMiA4IDgwIDExIDIwNyAyMDYgODIgODIgMzUgMTM3IDM0IDgxIDE3NiAKKzExNiAyMzEgMTgzIDczIDE2MyA4MiAxMjMgMTg4IDExNSAyMTYgMjEzIDg2IDE1NiAxNiAxNDAgMjA4IDE1MyAxNTQgMjEwIDY4IDMzIAorMjIyIDE1NSA2OSA4OSA4MCAxMjAgMTQgMjIgMjM4IDExOSA1IDYyIDEzMiAxNDggMjIxIDIwOCAxOCAyMDUgMjYgMjI0IDcwIDE5MiA4MCAKKzE2NyAxNTYgMTI1IDE5MSAyNCA0NCAxOTEgMTgwIDE0IDEzMSA0NSAyMDAgMTQwIDk5IDEwMiA3MyA1NCAzMSA0MiAzMiA1NyAyIDQ0IDkgCis4OSAyMzYgNjkgMTc3IDEzMSAxODAgMTQ5IDgwIDIwOCA2NSAxMDMgMTI5IDE3NyAyMTkgMjMxIDIzMCAyMTUgMSAzNSAyOCAyMjcgMjAgCis3OSAxNyAyMzcgMjE5IDk2IDM3IDUyIDE1NyA3MiAxOSAxNTIgOTggODcgMTI0IDg4IDI0IDI0MSA0OSA3NyA0MCAyMjYgMjI5IDcxIDkyIAorMTAgMTkyIDIzNiAxMTYgNzUgMjM0IDE1NCA1NCAxMTkgOTMgMTEzIDIxMyAzOSAxNCAxNzggMTg3IDU5IDExNCA0IDE2MiAyMjMgMTIzIAorMTIwIDIxNyAxMTMgMTYgMTgxIDExNyAxMzEgOTIgOTggMjQzIDczIDcgMTMzIDIwNCA3OSAxNTIgMTg2IDEzOCAxODQgMjIzIDYxIDIzMiAKKzIzOSAxNzUgMTA3IDYgNzcgODEgMTE0IDIwNyA5IDEgMTg1IDIzMiA0MiA3MyAyMTAgMjI0IDIyNiAxNDEgMjAgMTEgOTggMTU1IDIyIAorMTkxIDIyMSAxNDYgMTA5IDIyNyA4OCA3MSAxMzkgMTUyIDUxIDE4OSAyMSAxMzUgMTE5IDIwMiAxNjQgMjkgMTk1IDUxIDE0OCAxMTIgCisxNTcgMTgxIDQ5IDIzMyAyMzMgMTQ1IDk0IDEzIDEyMiA2NCA5NCAxNjkgNzEgNCAyMDMgMTExIDEwMSA1OCAxMDUgNDQgNTYgMjMxIDc0IAorMjIgODIgMTcwIDg2IDE5NyAxNjkgMTE4IDE0NiA0MSA4NSA2IDExOCAyMzQgOTIgMTQ1IDE0MSAxNDkgXgorNDg0IDEgMjE5IDMyIDI0MyAyMDggMjAwIDQ4IDQ4IDIxIDE3OCAxMyA0MCAxMTUgMTc4IDIzMiAxOTcgMTk2IDIxOCA2MSAxNCA0IDE4MyAKKzYwIDIzIDkzIDEzNiA1MCAyMDIgMjI5IDk5IDEyMCAyNDUgMTQzIDUgMTM0IDEyOCAxNTEgMTMwIDMyIDIzNiAzNCAxMjQgNjggMjE1IAorMTgyIDgyIDExMiA0NiAxMjYgMjI5IDkyIDE5MiAxNjkgMTYzIDE1OSA0OSAxOSAxNyAxMzYgNDMgMjggMTQwIDExOSAyOCAxNjAgNDcgCisxMDQgMTQwIDEyNiAyMDIgMjM2IDI3IDE5NiAyMjUgMjM1IDkwIDIzMCAxNiAxNTggMTMyIDI0MCAxMzAgMzkgMTY0IDEyMyAxMDQgMTQ3IAorNTQgMzIgMjE2IDExOSAzNSA3NSAxMjMgOTcgMjMyIDIyNCA1MiAxMzcgMjEgMTg1IDE4NyAxMjkgOTUgMjQgNzEgNDcgOTcgMjEyIDUwIAorMjIyIDE0NCAxODggMTAwIDkxIDIyOCAxMDEgMzUgMTIyIDE1MyA5MiAxNzIgMjQxIDc0IDE3OSAyMDMgMTgwIDE2NyAyIDM2IDM5IDE5MSAKKzIyNSAyMyAxMjAgMjM4IDIxNSAxNzUgMTU0IDM2IDY2IDM0IDEzMSAyNDIgNDUgMTYyIDE2MSAyMTAgMTQyIDE0IDIyMyA4MSAxNDEgNjMgCisxNjggMTk5IDEwNCAxNjcgMjI4IDEyMSAyMDkgMTk4IDEzMyAxODQgMjQgOTEgMjIxIDE3MyAxOTIgMTQyIDYxIDcgNzYgOTQgODAgMTkwIAorOCA0MCAxNjIgMjA4IDIyNyAxNTAgMjEzIDI0MCAxMDMgMTk2IDI0NSAxNTAgMTc5IDIyMyAxMDggMjQzIDIyOCAxMjggMTI0IDQxIDExMyAKKzE3IDEwOSAxODcgMTA5IDE4MCAxOTQgOTEgMjAxIDEyIDExNiAxNDkgMjE1IDE1NSAyMjYgMjA2IDg2IDIwMSA0NiAxMzMgMTU3IDE2OCAKKzE3MiAyIDIgOSAxODMgMjYgNiA5OCAxODMgMzMgMTgwIDE3NCAxNjMgMTI1IDE5IDI0IDY0IDExOSA4IDIzMiAyMDQgMTI0IDQ4IDQxIAorMTA2IDg5IDMzIDIwNyAzMCA4MiA4NSAyMDMgMjA3IDEwIDE1NCA5IDIxMCAxMTUgMTcxIDU4IDEwOCAyMTYgMTI2IDIwOSAxNjQgMTAzIAorMTc2IDcxIDc0IDE5OSAxMzEgMTAgMTQ3IDgxIDEzNCAxMzUgNzkgMjE5IDEyIDY5IDEzMiAyMjAgMjAyIDIwOSAxNzEgMzEgMTkgNTEgCisxNjYgMzggMjI3IDE1NyAxNDEgNzAgODMgMjkgODQgNjcgMjE3IDk3IDIwNSAxMjIgMTMzIDE2NCA5NiAyIDI0MSA5NCAxMDcgMzMgMTYwIAorODcgMTQ1IDE4NiAxODUgMjE0IDIzMSAxNCAyNDMgOSAyMzAgNDMgMSAzOCAyMDAgNTUgMjIyIDExMCAxNTggMTA1IDEzOCAyMTEgNzkgCisyMjYgMTg2IDE1OCAxMTIgNjYgNTQgNTkgNzIgMjUgOCAxMyA2MCA0MyAyMSAyMTIgMzAgNDggNjggMTk1IDggMjM5IDEzMiAyMTMgMjggCisxMzMgMTkxIDE5OCAxNjcgMjAxIDE5IDQ0IDIzOCAyMDggMSA2NSA1NiAyMjAgMTk1IDM1IDk1IDUxIDE3MyAyMTIgNTcgMTM3IDIzMyAKKzE2OCAxOTIgMTc2IDc4IDIgMjkgMTExIDEwMiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTY1IDc0IDE3MiAyOSAxMDQgMTc0IDE1NiAxOTcgCisxODkgNDQgMjE4IDM0IDE1OCA4NSAyMTAgMTM1IDk5IDE0NyAxMDEgNjIgMjI0IDU5IDUyIDExMCAxNzggMjAgMjE0IDIwNCAxNzEgNzggCiszNiA0NiAxMDYgNTUgMyAyMTIgNzcgNjUgNjMgMTQ4IDI1IDE1IDE4NyAxMzYgMjMgMTAwIDY0IDEzOSAxODIgNjIgMTk3IDIxNiAxNDYgCisxMzcgMjQwIDk2IDIyIDE1NiAxNzAgODcgMTI1IDEyIDk2IDIzNCAxMzkgMTc1IDEzNCAxMDggMjM2IDU0IDUyIDE0NCAxOTUgMjggMTY3IAorMjIxIDE5MyAxMjAgMjE4IDQxIDg2IDE3NCAxOTAgMjI3IDE4NCAyNDMgMjM1IDU2IDIxMyAyMSAyMDUgMTE1IDIwNSA3MSBeCis1MDYgMCAxMTAgMTY1IDE0MSAyMzggMjA2IDM3IDE2OSA0NSAxODcgMTM0IDE0MiAxMjQgNjYgNSAzNiA3MSA3OSAyMzUgMjMxIDUgMTA1IAorMjIgMjM5IDE2NiAxMDEgNDkgODYgODMgNjUgMjI0IDIxIDMxIDEwMiAyMjEgMyAxOTAgMTQ3IDIzMSA3OSA1NiAxODIgMTY1IDM2IDE0MCAKKzMwIDE0NyAxNTcgMTI4IDE0OSAzIDQ3IDI0NSAxNTkgMjE3IDY4IDk5IDIwMyAxNjcgMjM1IDE1NyA1NCAxOTMgOTEgMTE2IDEyMiAxMjAgCisyMzYgNyAyMCAxNDUgMjQyIDUgMTQxIDE2NCA3IDEyNSAyMzggMTc1IDE0MyAxNTMgODEgNDUgOCA4NSA1NCA1MCAxODkgNDkgMTcgMTI3IAorMTUzIDQ1IDE1MSAyNDAgMTIxIDE2MCAxNzcgMTMyIDIyNyAxIDYzIDE2NiAyNDQgMjA0IDE1OCAxODggNTMgNTkgMjMxIDE0OCAxMiA5NCAKKzk2IDE1NCAxODQgMTEgMjA4IDIzNiAxODYgNjkgMjMzIDYzIDEzNSA5NyAxODMgMTk0IDUxIDE4MCAyIDE2MSAxMzIgMTkxIDEwNyA0MiAKKzIwNyAxMDIgNzggMTAxIDExOCAzNyAyNDMgMjQ0IDk0IDYwIDEyIDE2MyA0NyA2NiAxMTAgMTI5IDI0NyAyMTcgMjQ3IDE0OCA0MyAyMzYgCisxMTcgMTE4IDczIDEzNyAxMiA1OCAyMDIgMTM4IDIyMCAxMTcgODIgMTc5IDExNiA1MyAxNjQgNzYgODEgMTUwIDEwMSAxMyAxOTIgNjIgCisxMDYgODcgMTQzIDIyMiAzMiAyMDUgMTg3IDIwMyA5MyAzMSAyNDUgMTIzIDc1IDUyIDEzNSA2NiA0MSAxNzggODcgMzggMTI5IDEwNCAKKzYyIDE3NSAzOCA1NSAxNTMgMTU1IDI0NCAxNjggMTYgMTcyIDk0IDE3MCAxMDUgOTEgMTkwIDc4IDI3IDE2NyAxMzAgNjQgMTI2IDU1IAorNzkgMTk5IDg0IDIzNyAxNDYgMTI4IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgMTg3IDk4IDEwMyAxMDcgMTE2IDE1OCAxNCA5IDIxOSAKKzE2MiAxOCA1MSA3NSAxNTcgMjMzIDI0MiAxNzkgMTkwIDQgNzYgNyAxOTkgMTk0IDgyIDc0IDIzIDEyNSAyNiA2OSAxNjQgMTEyIDIyMyAKKzE3MSA2NSAxNTUgNzAgMTE5IDE3NiAxMDMgMjEyIDIwOSA4NiAxNTIgMTYgMTM2IDIwMCAxNDkgMTQ2IDIwMiA2NCAyMSAyMTAgMTUxIAorNjEgNzcgNzIgMTA4IDIgMTggMjMwIDExOSAyNDUgNTQgMTI0IDE0MCAyMDkgMTk2IDIgMTk3IDI2IDIxMiA2NiAxODQgODAgMTU5IDE0OCAKKzExNyAxODcgMjQgNDQgMTkxIDE3NiAyNDYgMTE5IDMzIDE5NiAxNDAgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMjM4IDMyIDI0MSA4MSAKKzIyNCA1NyAxNzMgMTIzIDE4MCAxNDUgNjggMjA0IDUzIDk1IDEyNSAxNjkgMjE5IDIzMSAyMjIgMjExIDEgMjcgMjQgMjIzIDI0MCAxNiAKKzY3IDEgMjM3IDIxNSA4NCAyNSA0MCAxNDkgNzIgMyAxNTIgOTAgODcgMTEyIDgwIDE2IDI0MSA0NSA3NyAzNiAyMTQgMjI5IDU5IDg4IAorMjQ2IDE4OCAyMzIgMTA4IDcxIDIyMiAxNDIgNTAgMTE1IDkzIDEwNSAyMDEgMzUgNiAxNzAgMTc5IDQ3IDEwMiA0IDE1MCAyMTEgMTExIAorMTIwIDIwNSAxMTMgNCAxODEgMTA1IDEyNyA4NCA5NCAyMzkgNjEgMyAxMjEgMTk2IDcxIDE0OCAxODYgMTM4IDE4NCAyMjMgNjEgMjIwIAorMjI3IDE3NSAxMDcgNiA2NSA4MSAxMTQgMjA3IDI0NSAyMzMgMTczIDIyOCAzMCA3MyAyMDYgMjE2IDIxOCAxMzMgOCAxMSA5OCAxNDMgCisxMCAxNzkgMjIxIDE0NiA5NyAyMTkgODggNjcgMTM5IDE0NCAzOSAxODkgMTMgMTIzIDExMSAxOTQgMTU2IDI1IDE4MyA1MSAxNDQgMTA4IAorMTQ1IDE3MyA0OSAyMjkgMjMzIDEzNyA4NiA5IDExNCA2NCA5MCAxNjEgNjMgMjQwIDE5NSAxMTEgODkgNTggOTcgNDAgNDQgMjI3IDcwIAorMTQgNzggMTcwIDc0IDE5NyAxNjkgMTE0IDEzOCA0MSA3MyAyNDIgMTEwIDIzNCAxNzcgXgorNDkxIDAgMTQ1IDEzNSAxNTUgMjA3IDIwIDI0MyAyMDggMjAwIDQwIDQ4IDIxIDE3MCA1IDQwIDExMSAxNzggMjI4IDE4OSAxOTYgMjEwIAorNDkgNiAyNDYgMTcxIDU2IDIzIDg1IDEyOCA0NiAxOTggMjE3IDk1IDEwOCAyNDEgMTM1IDI0NyAxMzAgMTE2IDE1MSAxMzAgMjQgMjI4IAorMzQgMTE2IDU2IDIwNyAxNzggNzAgMTEyIDQyIDExOCAyMjEgODAgMTg0IDE1NyAxNTEgMTU5IDM3IDE5IDUgMTMyIDMxIDI0IDEzNiAKKzExMSAyMCAxNDggMzUgMTA0IDEzMiAxMjYgMTk0IDIzMiAxOSAxOTIgMjI1IDIyMyA5MCAyMzAgMTIgMTQ2IDEyMCAyMjggMTI2IDM5IAorMTUyIDExNSAxMDAgMTQ3IDUwIDI4IDIxNiAxMDcgMzUgNzUgMTE5IDg1IDIyMCAyMTYgNDQgMTI1IDE3IDE4NSAxNzkgMTIxIDk1IDE2IAorNzEgMzkgODkgMjA4IDQyIDIxMCAxNDQgMTc2IDkyIDc5IDIyOCA5NyAyMyAxMTQgMTQxIDg0IDE3MiAyMzMgNzAgMTc1IDE5OSAxNzYgCisxNTUgMjM2IDM2IDMxIDE3OSAyMTMgMTUgMTEyIDIyNiAyMTEgMTYzIDE0NiAyOCA1OCAzMCAxMzEgMjMwIDQxIDE2MiAxNjEgMjAyIAorMTQyIDE0IDIxOSA3MyAxNDEgNTUgMTU2IDE5NSA5NiAxNTkgMjI0IDEwOSAxOTcgMTk4IDEyNSAxNzIgMTIgODMgMjEzIDE3MyAxOTIgCisxMzAgNTMgMjQxIDcyIDkwIDcyIDE4MiAyNDIgMjggMTUwIDIwMCAyMjcgMTM4IDIxMyAyMzYgOTkgMTg4IDIzNyAxNTAgMTcxIDIxMSAKKzEwMCAyMzkgMjIwIDEyNCAxMjQgMjkgMTA5IDEzIDEwNSAxODMgMTA5IDE2OCAxODIgODcgMjAxIDI0NiAxMDggMTQ5IDIxNSAxNTEgCisyMjIgMTk0IDc0IDE4OSAzOCAxMzMgMTQ1IDE2NCAxNjggMjQ4IDI0NCA5IDE4MyAxNCAyNDggODYgMTc5IDI5IDE3MiAxNzAgMTYzIAorMTE3IDE1IDIwIDU2IDExNSA4IDIyNCAyMDQgMTIwIDQ0IDMzIDk0IDg5IDIxIDE5OSAxOCA3OCA4NSAxOTEgMjAzIDYgMTU0IDEgMjEwIAorMTE1IDE2MyA1NCAxMDggMjEyIDEyMiAyMDkgMTU2IDEwMyAxNzYgNjMgNjYgMTg3IDEyMyAxMCAxMzkgNzcgMTI2IDEzMSA3NSAyMTEgOCAKKzY5IDEyNCAyMTYgMjAyIDIwNSAxNzEgMjcgNyA0NyAxNTQgMzAgMjIzIDE1MyAxMzcgNzAgODMgMjkgODAgNjcgMjA5IDkzIDE5MyAxMTggCisxMjkgMTYwIDg4IDIgMjI5IDgyIDk5IDMzIDE2MCAyNDYgNzkgMTMzIDE3NCAxNzcgMjA2IDIxOSAxMCAyMzEgMjQ3IDIyMiAzOSAyNDcgCiszOCAxOTYgNTUgMjIyIDEwMiAxNTQgOTMgMTMwIDIxMSA3MSAyMjYgMTgyIDE1MCAxMDggNTQgNDIgNTUgNjQgMjUgMSA1MiAzNSA5IAorMjEyIDMwIDM2IDYwIDE5NSA0IDIzOSAxMjggMjAxIDI4IDEyMSAxODcgMTg2IDE2NyAxOTcgMTEgMzIgMjMwIDE5NiAyMzkgNjUgNDQgCisyMjAgMTg3IDMxIDg3IDQzIDE2OSAyMDQgNTcgMTM3IDIyNSAxNjAgMTgwIDE3MiA3OCAyNDAgMjEgMTA3IDk4IDIzMiAxNzcgMjIgMTI5IAorNjggMTY4IDE1MyA3NCAxNjAgMjUgOTIgMTc0IDE0OCAxOTMgMTgxIDM2IDIxOCAyMiAxNTggODEgMjA2IDEyNyA4NyAxMzUgODkgNTAgCisyMTIgNTkgNTIgOTggMTY2IDIwIDIxNCAxOTIgMTU5IDY2IDMyIDQ2IDEwNiA0NyAyNDkgMjAwIDY5IDYxIDU5IDE0NCAyMSAxNSAxNzUgCisxMzYgMTkgMTAwIDUyIDEyNyAxODIgNTggMTg1IDIwOCAxMzQgMTMzIDI0MCA4NCAxNCAxNTYgMTY2IDgzIDEyMSA5NiAyMjIgMTMxIAorMTY3IDEzNCAxMDQgMjI0IDQ2IDQwIDE0MCAxOTEgMTYgMTYzIDIwOSAxODUgMTE2IDIxNCAzNyA4MiAxNjIgMTkwIDIxNSAxODAgMjM1IAorMjM1IDQ4IDIwNSAxMyAxOTcgMTAzIDIwNSA3NiAxMDQgMTYxIDEzOSAyMzIgMTQ2IF4KKzUxNiAwIDMzIDE2NSAzMyAxNzUgMTIyIDEzNCAxMTIgNjYgMSAyNCA1OSA2NyAyMzEgMjE5IDUgMTAxIDE0IDIyNyAxNTggODkgNDEgODIgCis3MSA2MSAyMjQgMTMgMjMgMTAyIDIxMyAzIDE4NiAxNDMgMjIzIDcxIDU2IDE3NCAxNjUgMjggMTM2IDIyIDEzOSAxNTcgMTE2IDEzNyAKKzI0NyA0MyAyMzMgMTU1IDIxNyA2NCA5MSAyMDMgMTU1IDIyNyAxNTMgNTAgMTkzIDg3IDExNiAxMjIgMTA4IDIzNiA3IDE2IDEzNyAyNDIgCisyNDUgMTMzIDE2MCAyNTEgMTI1IDIzOCAxNjMgMTM5IDE0MSA3NyAzNyA3NyA0MiA1MCAxNzcgMzcgNSAxMjcgMTUzIDQ1IDE0MyAyMjggCisxMjEgMTU2IDE2OSAxMjAgMjE5IDI0MSA1MSAxNjYgMjMyIDE5MiAxNTAgMTg4IDUzIDU1IDIyNyAxNDggODIgOTIgMTUwIDE3MiAzIAorMTk2IDIzMiAxODIgNjEgMjI5IDYzIDEyMyA5NyAxNzkgMTk0IDM5IDE3MiAyNTAgMTU3IDEzMiAxODcgOTUgMzggMTk5IDk0IDcwIDkzIAorMTE4IDM3IDIzMSAyNDAgOTQgNjAgNCAxNTkgNDcgNTggMTEwIDEyNSAyNDMgMjEzIDIzOSAxMzYgNDMgMjI4IDEwNSAxMDYgNjkgMTI1IAorMTIgNTAgMTk4IDEyNiAyMTYgMTE3IDc0IDE3NSAxMTIgNDUgMTY0IDc2IDY5IDE0NiAxMDEgOSAxODggNTggOTQgNzUgMTQzIDIxOCAzMiAKKzE5NyAxNzkgMTk5IDg5IDMxIDI0NSAxMjMgNzEgNDAgMTM1IDU0IDMzIDE3MCA4MyAzNCAxMTcgMTAwIDYyIDE3MSAzMCA1MSAxNDUgCisxNDMgMjQ0IDE2MCA0IDE2NCA4NiAxNTggMTA1IDkxIDE4MiA2NiAyNyAxNjMgMTE4IDUyIDExOCA0NyA3OSAxOTkgODQgMjMzIDEzNCAKKzEyOCAxMDUgMTAxIDE5IDI1IDE3IDg0IDcgMjEgMTg3IDkwIDI0MCA5OSA5OSAxMDQgMTU0IDIgMjQ5IDIxNSAxNTQgMTggNDcgNjMgCisxNDkgMjI1IDIzOCAxNzkgMTc4IDcyIDMgMTkxIDE4MiA4MiA2NiAxMSAxMTMgMTggNTcgMTUyIDEwOCAyMTUgMTU5IDU3IDE0NyA1OCAKKzExNSAxNjQgOTEgMjA4IDIwNSA4NiAxNDggMTYgMTMyIDE5MiAxNDUgMTM4IDE5NCA2MCA5IDE5OCAxNDcgNTMgNjUgNjQgOTYgMjQyIAorMTQgMjIyIDExOSAyNDEgNDYgMTE2IDEzMiAxOTcgMTg0IDIzOCAxODkgMjYgMjAwIDYyIDE3NiA4MCAxNTEgMTQwIDEwOSAxODMgMjQgCis0NCAxOTEgMTcyIDIzNCAxMDcgMjEgMTkyIDE0MCA5OSA5NCA2NSA1NCA3IDQyIDI0IDQ5IDIzMCAyMCAyMjkgNzMgMjEyIDQ1IDE2OSAKKzExNSAxODAgMTQxIDU2IDIwMCA0MSA4NyAxMjEgMTYxIDIxOSAyMzEgMjE0IDIwNyAxIDE5IDIwIDIxOSAyMzYgMTIgNTUgMjM3IDIzNyAKKzIxMSA3MiAxMyAyOCAxNDEgNzIgMjM5IDE1MiA4MiA4NyAxMDAgNzIgOCAyNDEgNDEgNzcgMzIgMjAyIDIyOSA0NyA4NCAyMzggMTg0IAorMjI4IDEwMCA2NyAyMTAgMTMwIDQ2IDExMSA5MyA5NyAxODkgMzEgMjUwIDE2MiAxNzEgMzUgOTAgNCAxMzggMTk5IDk5IDEyMCAxOTMgCisxMTMgMjQ0IDE4MSA5MyAxMjMgNzYgOTAgMjM1IDQ5IDI1MSAxMDkgMTg4IDYzIDE0NCAxODYgMTM4IDE4NCAyMjMgNjEgMjA4IDIxNSAKKzE3NSAxMDcgNiA1MyA4MSAxMTQgMjA3IDIzNyAyMjEgMTYxIDIyNCAxOCA3MyAyMDIgMjA4IDIxMCAxMjUgMjQ4IDExIDk4IDEzMSAyNTAgCisxNjcgMjIxIDE0NiA4NSAyMTEgODggNjMgMTM5IDEzNiAyNyAxODkgNSAxMTEgMTAzIDE4NiAxNDggMjEgMTcxIDUxIDE0MCAxMDQgMTMzIAorMTY1IDQ5IDIyNSAyMzMgMTI5IDc4IDUgMTA2IDY0IDg2IDE1MyA1NSAyMzIgMTg3IDExMSA3NyA1OCA4OSAzNiAzMiAyMjMgNjYgNiA3NCAKKzE3MCA2MiAxOTcgMTY5IDExMCAxMzAgNDEgNjEgMjM0IDEwMiAyMzQgOTIgMTQ1IDEzMyAxNTUgMjAxIDE0IDI0MyAyMDggMjAwIDM2IAorNDggMjEgMTY2IDEgNDAgMTA5IDE3OCAxNDcgXgorNTIyIDAgMTc5IDE5NiAyMDAgMzQgMjUxIDI0MSAxNTYgNTEgMjMgNzUgMTE4IDQxIDE5MyAyMDIgOTAgOTMgMjM2IDEyNSAyNDIgMTI1IAorMTAxIDE1MSAxMzAgMTQgMjE4IDM0IDEwNiA0MSAxOTcgMTczIDU1IDExMiAzNyAxMDggMjExIDY1IDE3NCAxNDIgMTM2IDE1OSAyMiAxOSAKKzI0NSAxMjcgMTYgMTkgMTMxIDEwMSAxMCAxMzMgMjAgMTA0IDEyMiAxMjYgMTg0IDIyNyA5IDE4NyAyMjUgMjA4IDkwIDIzMCA3IDEzMSAKKzEwNSAyMTMgMTIxIDM5IDEzNyAxMDUgOTUgMTQ3IDQ1IDIzIDIxNiA5MiAzNSA3NSAxMTQgNzAgMjA1IDIwNiAzNCAxMTAgMTIgMTg1IAorMTY5IDExMSA5NSA2IDcxIDI5IDc5IDIwMyAzMiAxOTUgMTQ0IDE2MSA4MiA2NCAyMjggOTIgOCAxMDQgMTI2IDc0IDE3MiAyMjMgNjUgCisxNzAgMTk0IDE3MSAxNDAgMjIxIDM2IDIxIDE2NCAxOTggNSAxMDIgMjExIDIwNiAxNDggMTM2IDE4IDQ4IDI1IDEzMSAyMTUgMzYgMTYyIAorMTYxIDE5MiAxNDIgMTQgMjE0IDYzIDE0MSA0NSAxNDEgMTkwIDg2IDE0OSAyMTkgOTQgMTgyIDE5OCAxMTUgMTU3IDI1MiA3MyAyMDMgCisxNzMgMTkyIDExNSA0MyAyMjYgNjcgODUgNjIgMTcyIDIyNyAxMyAxMzUgMTkwIDIyNyAxMjMgMjEzIDIzMSA5NCAxNzggMjI3IDE1MCAKKzE2MSAxOTYgOTAgMjM0IDIxMCAxMTkgMTI0IDE0IDEwNCA4IDEwMCAxNzggMTA5IDE1MyAxNjcgODIgMjAxIDIzMSA5OCAxNDkgMjE1IAorMTQ2IDIxNyAxNzkgNTkgMTc0IDI4IDEzMyAxMzAgMTU5IDE2MyAyNDggMjM5IDkgMTgzIDI1NCAyNDMgNzEgMTc0IDI0IDE2MiAxNjUgCisxNjMgMTA3IDEwIDE1IDQ2IDExMCA4IDIxNCAyMDQgMTE1IDM5IDIzIDc5IDg5IDYgMTg5IDMgNzMgODUgMTc2IDE5OCAxIDE1NCAyNDYgCisyMTAgMTE1IDE1MyA0OSAxMDggMjA3IDExNyAyMDkgMTQ2IDEwMyAxNzYgNTMgNTYgMTcyIDExMyAxMCAxMjkgNzIgMTE2IDEyNiA3MCAKKzIwMSAzIDY5IDExNCAyMTEgMjAyIDIwMCAxNzEgMjIgMjQ3IDQyIDEzOSAyMCAyMTggMTQ4IDEzMiA3MCA4MyAyOSA3NSA2NyAxOTkgODggCisxNzggMTEzIDEyNCAxNTUgNzggMiAyMTQgNjcgODkgMzMgMTYwIDI0NiA2OSAxMTggMTU5IDE2NyAxOTYgMjA0IDUgMjE2IDIzNyAyMTIgCiszNCAyNDcgMzggMTkxIDU1IDIyMiA5MiAxNDkgNzggMTIwIDIxMSA2MSAyMjYgMTc3IDE0MCAxMDMgMzkgMjcgNTAgNTQgMjUgMjQ1IAorMjQxIDQyIDI1IDI0OSAyMTIgMzAgMjEgNTAgMTk1IDI1NCAyMzkgMTIzIDE4NiAyOCAxMDYgMTgyIDE3MSAxNjcgMTkyIDEgMTcgMjIwIAorMTgxIDIyOSA2NSAyOSAyMjAgMTc3IDI2IDc3IDMzIDE2NCAxOTQgNTcgMTM3IDIxNSAxNTAgMTY1IDE2NyA3OCAyMzAgMTEgMTAyIDkzIAorMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEzOCA3NCAxNDUgMjAgNzcgMTc0IDEzOCAxODggMTcxIDI2IDIxOCA3IDE1OCA3NiAyMDEgMTE3IAorNzIgMTIwIDc0IDM1IDE5NyA1OSA1MiA4MyAxNTEgMjAgMjE0IDE3NyAxNDQgNTEgMjcgNDYgMTA2IDM3IDI0OSAxODUgNTkgNTYgNTQgCisxMzkgMTYgMTUgMTYwIDEzNiAxNCAxMDAgMzcgMTEyIDE4MiA1MyAxNzAgMTk4IDExOSAxMjggMjQwIDY5IDQgMTU2IDE2MSA3OCAxMTYgCisyNDAgOTYgMjA3IDEyMSAxNTcgMTM0IDk5IDIwOSAzNiAyNSAxMzUgMTg2IDEgMTU4IDE5NCAxNzUgMTExIDIwOSAzMiA3NyAxNDcgMTkwIAorMjAwIDE3NSAyMjUgMjM1IDM4IDE5NSAzIDE4NyA4OCAyMDUgNjEgODkgMTUxIDEzNCAyMTcgMjA2IDMwIDE2MiAyNCAxNjYgMTEzIDEyOCAKKzEwMyA2NiAyNTMgMTUgNTAgNTggMjI4IDIxMCA1IDk4IDggMjE4IDE1MiA4MCAzNSA3OSA2MiA1OCAyMjQgNyAxNyAxMDIgMjA3IDMgCisxODMgMTQwIDIxNyA2NSA1NiAxNjggMTY1IDIyIDEzMyAxNiAxMzMgMTU3IDEwNyAxMjggMjQ0IDEyIF4KKzUxNyAxIDIxOCAxNTAgMjE3IDU5IDgxIDIwMyAxNDAgMjE3IDE0OCA0NSAxOTMgODIgMTE2IDEyMiA5MyAyMzYgNyAxMSAxMjcgMjQyIAorMjM1IDEyMyAxNTUgMjQ2IDEyNSAyMzggMTQ4IDEzNCAxMjYgNzIgMjcgMjQ3IDY3IDI3IDUwIDE2MiAyMiAyNDcgMTI3IDE1MyA0NSAKKzEzMyAyMTMgMTIxIDE1MSAxNTkgMTA1IDIwOSAyMzEgMzYgMTY2IDIxNyAxNzcgMTQwIDE4OCA1MyA1MCAyMjIgMTQ4IDI0MiA2NyA4NyAKKzE0NSAxNTcgMjUwIDE4MSAyMjcgMTc3IDUxIDIyNCA2MyAxMDggOTcgMTc0IDE5NCAyNCAxNjIgMjUwIDE1MiAxMzIgMTgyIDgwIDMzIAorMTg5IDg0IDYwIDgzIDExOCAzNyAyMTYgMjM1IDk0IDYwIDI1MSAxNTQgNDcgNDggMTEwIDEyMCAyMzggMjA4IDIyOSAxMjEgNDMgMjE4IAorOTAgOTEgNjQgMTEwIDEyIDQwIDE5MyAxMTEgMjExIDExNyA2NCAxNzAgMTA3IDM1IDE2NCA3NiA1NCAxNDEgMTAxIDQgMTgzIDUzIDc5IAorNjAgMTQzIDIxMyAzMiAxODcgMTY5IDE5NCA4NCAzMSAyNDUgMTIzIDY2IDI1IDEzNSAzOSAyMyAxNjAgNzggMjkgMTAyIDk1IDYyIDE2NiAKKzIwIDQ2IDEzNSAxMjggMjQ0IDE1MCAyNDYgMTU0IDc2IDE0MyAxMDUgOTEgMTcyIDUxIDI3IDE1OCAxMDMgMzcgMTA4IDM3IDc5IDE5OSAKKzg0IDIyOCAxMTkgMTI4IDk1IDkxIDQgMTUgMTcgNjkgMiAxMSAxODcgODAgMjMwIDk0IDg5IDg5IDE0OSAyNDQgMjM5IDIxMCAxNDQgMTggCis0MiA0OCAxMzkgMjE1IDIzMyAxNzkgMTYzIDI1MiA2NyAyNTUgMTgxIDE2NyA4MiA1NiAyNTMgOTggOCA0MiAxMzcgMTAzIDIwNSAxNDQgCis0NyAxMzcgNDMgMTEwIDE0OSA3NiAyMDMgMjAwIDg2IDE0MyAxNiAxMjcgMTgyIDE0MCAxMjggMTg0IDU1IDI1MSAxODMgMTQyIDQzIDUwIAorNTQgODEgMjMyIDkgMjEyIDExOSAyMzYgMzYgMTA2IDEyMiAxODIgMTY5IDIyMyAxNzkgMjYgMTg1IDU3IDE2NiA4MCAxNDEgMTMwIDk5IAorMTc4IDI0IDQ0IDE5MSAxNjcgMjE5IDkyIDYgMTg3IDE0MCA5OSA4OSA2MCA1NCAyNDkgNDIgMTkgNDQgMjIwIDUgMjE0IDYzIDE5NyAzMCAKKzE2NCAxMDUgMTgwIDEzNiA0MSAxOTUgMjYgNzcgMTE2IDE1MSAyMTkgMjMxIDIwNCAyMDIgMSA5IDE1IDIxNCAyMzEgNyA0MCAyMjIgCisyMzcgMjA2IDU3IDI1NSAxMyAxMzEgNzIgMjI0IDE1MiA3MiA4NyA4NSA2MiAyNTUgMjQxIDM2IDc3IDI3IDE4NyAyMjkgMzIgNzkgMjI4IAorMTc5IDIyMyA5MCA2MiAxOTUgMTE1IDQxIDEwNiA5MyA4NyAxNzQgMjYgMjQ1IDE1MiAxNjEgMjAgNzUgNCAxMjMgMTg0IDg0IDEyMCAKKzE3OCAxMTMgMjM0IDE4MSA3OCAxMTggNjYgODUgMjMwIDM0IDI1MSA5NCAxNzggNTMgMTM5IDE4NiAxMzggMTg0IDIyMyA2MSAxOTMgCisyMDAgMTc1IDEwNyA2IDM4IDgxIDExNCAyMDcgMjI3IDIwNiAxNDYgMjE5IDMgNzMgMTk3IDE5OCAyMDAgMTE1IDIzOCAxMSA5OCAxMTYgCisyNDAgMTUyIDIyMSAxNDYgNzAgMjAxIDg4IDU4IDEzOSAxMjYgMTIgMTg5IDI1MiA5NiA5MyAxNzYgMTM4IDE2IDE1NiA1MSAxMzUgOTkgCisxMTggMTU1IDQ5IDIyMCAyMzMgMTE5IDY4IDk2IDY0IDgxIDE0MyA0NSAyMjIgMTc3IDExMSA2MiA1OCA3OSAzMSAxNyAyMTggNjEgMjUzIAorNjkgMTcwIDQ3IDE5NyAxNjkgMTA1IDEyMCA0MSA0NiAyMjQgOTIgMjM0IDkyIDE0NSAxMjggMTU1IDE4NiAyNTYgMjQzIDIwOCAyMDAgCisyNiA0OCAyMSAxNTYgMjQ4IDQwIDEwNCAxNzggMjIxIDE3NSAxOTYgMTk2IDI4IDI0OSAyMzkgMTUwIDQ5IDIzIDcxIDExNCAzOSAxOTEgCisxOTYgODggODcgMjM0IDEyMSAyNDAgMTIzIDk1IDE1MSAxMzAgMTAgMjE0IDM0IDEwMiAzNSAxOTMgMTcxIDQ5IDExMiAzNSAxMDQgMjA3IAorNTkgMTcwIDEzNiAxMzAgMTU5IDE2IDE5IDI0MSAxMjUgMjEzIF4KKzUyOSAxIDE1IDEyNyA5MyAyIDEyMSA4IDEwNCAxMTQgMTI2IDE3NiAyMjMgMSAxODMgMjI1IDE5NiA5MCAyMzAgMyAxMTkgOTMgMjAxIAorMTE3IDM5IDEyNSA5NyA5MSAxNDcgNDEgMTkgMjE2IDgwIDM1IDc1IDExMCA1OCAxOTMgMTk4IDI2IDk4IDggMTg1IDE2MSAxMDMgOTUgCisyNTcgNzEgMjEgNzEgMTk5IDI0IDE4MyAxNDQgMTQ5IDc0IDUyIDIyOCA4OCAyNTUgOTYgMTE0IDY2IDE3MiAyMTUgNjEgMTY2IDE5MCAKKzE2NyAxMjggMjA5IDM2IDEzIDE1MiAxODYgMjU2IDk0IDE5OSAyMDIgMTM2IDEyOCAxMCA0MCAyMSAxMzEgMjAzIDMyIDE2MiAxNjEgCisxODQgMTQyIDE0IDIxMCA1NSAxNDEgMzcgMTI5IDE4NiA3OCAxNDEgMjE1IDgyIDE3MCAxOTggMTA3IDE0NSAyNDQgNjUgMTk1IDE3MyAKKzE5MiAxMDMgMzUgMjE0IDYzIDgxIDU0IDE2NCAyMTUgMSAxMjMgMTgyIDIyNyAxMTEgMjEzIDIyNyA5MCAxNzAgMjE5IDE1MCAxNTMgCisxODQgODIgMjMwIDIwMiAxMTUgMTI0IDIgMTAwIDQgOTYgMTc0IDEwOSAxNDEgMTU1IDc4IDIwMSAyMTkgOTAgMTQ5IDIxNSAxNDIgMjEzIAorMTY3IDQ3IDE2MiAyMCAxMzMgMTE4IDE1NSAxNTkgMjQ4IDIzNSA5IDE4MyAyNDYgMjM5IDU5IDE3MCAyMCAxNTQgMTYxIDE2MyA5OSA2IAorMTEgMzggMTA2IDggMjA2IDIwNCAxMTEgMzUgMTUgNjcgODkgMjUzIDE4MSAyNTAgNjkgODUgMTY0IDE5NCAyNTYgMTU0IDI0MiAyMTAgCisxMTUgMTQ1IDQ1IDEwOCAyMDMgMTEzIDIwOSAxMzggMTAzIDE3NiA0NSA0OCAxNjAgMTA1IDEwIDEyMSA2OCAxMDggMTIyIDY2IDE5MyAKKzI1OCA2OSAxMDYgMjA3IDIwMiAxOTYgMTcxIDE4IDIzOSAzOCAxMjcgMTIgMjE0IDE0NCAxMjggNzAgODMgMjkgNzEgNjcgMTkxIDg0IAorMTY2IDEwOSAxMjAgMTUxIDcwIDIgMjAyIDU1IDgxIDMzIDE2MCAyNDYgNjEgMTA2IDE0NyAxNTkgMTg4IDE5MiAxIDIwNCAyMjkgMjA0IAorMzAgMjQ3IDM4IDE4NyA1NSAyMjIgODQgMTQ1IDY2IDExMiAyMTEgNTMgMjI2IDE3MyAxMzIgOTkgMjcgMTUgNDYgNDYgMjUgMjQxIDIzMyAKKzM0IDE3IDI0MSAyMTIgMzAgOSA0MiAxOTUgMjU0IDIzOSAxMTkgMTc0IDI4IDk0IDE3OCAxNTkgMTY3IDE4OCAyNTIgNSAyMTIgMTY5IAorMjIxIDY1IDE3IDIyMCAxNjkgMjIgNjkgMjUgMTYwIDE4NiA1NyAxMzcgMjA3IDE0MiAxNTMgMTYzIDc4IDIyMiAzIDk4IDg5IDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDEyNiA3NCAxMzMgMTYgNjUgMTc0IDEzMCAxODQgMTYzIDE4IDIxOCAyNTQgMTU4IDcyIDE5NyAxMDkgNjAgCisxMDggNjIgMjMgMTg1IDU5IDUyIDcxIDEzOSAyMCAyMTQgMTY1IDEzMiAzOSAyMyA0NiAxMDYgMjkgMjQ5IDE3MyA1MSA1MiA1MCAxMzUgCisxMiAxNSAxNDggMTM2IDEwIDEwMCAyNSAxMDAgMTgyIDQ5IDE1OCAxOTAgMTA3IDEyNCAyNDAgNTcgMjU1IDE1NiAxNTcgNzQgMTEyIAorMjMyIDk2IDE5NSAxMTMgMTQ5IDEzNCA5NSAxOTcgMjggMTMgMTMxIDE4MiAyNDggMTU0IDE4MiAxNjcgMTA3IDIwNSAyOCA3MyAxMzUgCisxOTAgMTg4IDE3MSAyMTcgMjM1IDMwIDE4NyAyNTQgMTc5IDc2IDIwNSA0OSA3NyAxNDMgMTMwIDIwNSAyMDYgMjYgMTU4IDEyIDE1NCAKKzEwMSAxMjAgOTEgNjYgMjUzIDMgMzggNDYgMjI0IDE5OCA1IDk0IDIwNiAxNDQgNjggMjcgNzUgNTAgNTQgMjI0IDI1OCA5IDEwMiAxOTkgCiszIDE3OSAxMzYgMjA5IDU3IDU2IDE2MCAxNjUgMTQgMTI5IDggMTI1IDE1NyA5NSAxMTYgMjQwIDM2IDIxMiAxNDggMjE3IDU3IDc3IAorMjAzIDEzNCAyMTMgMTQ2IDQzIDE5MyA4MCAxMTYgMTIyIDg3IDIzNiA3IDkgMTIzIDI0MiAyMzEgMTE5IDE1MyAyNDQgMTI1IDIzOCAKKzE0MiAxMzIgMTIwIDcwIDIzIDI0NSA2MyAyMSA1MCAxNTYgMTYgMjQzIDEyNyAxNTMgNDUgMTI5IDIwNyAxMjEgMTQ5IDE1NSA5OSAyMDUgCisyMjcgMzAgMTY2IDIxMSA1NyBeCis1NDggMCAxMzQgMTg4IDUzIDQ3IDIxOSAxNDggMjM2IDU4IDg0IDE0MiAxNDggMjQ3IDE3MiAyMjQgMTc0IDQ1IDIyMSA2MyA5OSA5NyAKKzE3MSAxOTQgMTUgMTU2IDI1MCAxNDkgMTMyIDE3OSA3MSAzMCAxODMgNzggNTQgNzcgMTE4IDM3IDIwNyAyMzIgOTQgNjAgMjQ4IDE1MSAKKzQ3IDQyIDExMCAxMTcgMjM1IDIwNSAyMjMgMTEyIDQzIDIxMiA4MSA4MiA2MSAxMDEgMTIgMzQgMTkwIDEwMiAyMDggMTE3IDU4IDE2NyAKKzEwNCAyOSAxNjQgNzYgNDUgMTM4IDEwMSAxIDE4MCA1MCA3MCA1MSAxNDMgMjEwIDMyIDE4MSAxNjMgMTkxIDgxIDMxIDI0NSAxMjMgNjMgCisxNiAxMzUgMzAgMTcgMTU0IDc1IDI2IDkzIDkyIDYyIDE2MyAxNCA0MyAxMjkgMTE5IDI0NCAxNDQgMjQwIDE0OCA3MCAxMzQgMTA1IDkxIAorMTY2IDQyIDI3IDE1NSA5NCAyOCAxMDIgMzEgNzkgMTk5IDg0IDIyNSAxMTAgMTI4IDg5IDg1IDI1NSA5IDE3IDYwIDI1OSA1IDE4NyA3NCAKKzIyNCA5MSA4MyA4MCAxNDYgMjM4IDIzMyAyMDcgMTM4IDE4IDM5IDM5IDEzMyAyMDkgMjMwIDE3OSAxNTQgMjUyIDY0IDI1NSAxNzUgCisxNTggODIgNTAgMjQ3IDg5IDIgMzMgMTI4IDEwMCAxOTkgMTM1IDQxIDEzMSAzNCAxMDcgMTQwIDY3IDIwMCAxOTcgODYgMTQwIDE2IAorMTI0IDE3NiAxMzcgMTIyIDE3OCA1MiAyNDUgMTc0IDEzOSAzNyA0MSA0OCA3MiAyMjYgNiAyMDYgMTE5IDIzMyAzMCAxMDAgMTE2IDE3MyAKKzE2MCAyMTQgMTczIDI2IDE3NiA1NCAxNjAgODAgMTM1IDEyNCA5MyAxNzUgMjQgNDQgMTkxIDE2NCAyMTAgODMgMjU3IDE4NCAxNDAgOTkgCis4NiA1NyA1NCAyNDMgNDIgMTYgNDEgMjE0IDI1NiAyMDUgNTcgMTg4IDIxIDE2MSA5OSAxODAgMTMzIDMyIDE5MiAxNyA3MSAxMTMgMTQ1IAorMjE5IDIzMSAxOTggMTk5IDEgMyAxMiAyMTEgMjI4IDQgMzEgMjEzIDIzNyAyMDMgNDggMjQ5IDQgMTI1IDcyIDIxNSAxNTIgNjYgODcgCis3NiA1NiAyNTIgMjQxIDMzIDc3IDI0IDE3OCAyMjkgMjMgNzYgMjIyIDE3NiAyMjAgODQgNTkgMTg2IDEwNiAzOCAxMDMgOTMgODEgMTY1IAorMjMgMjQyIDE0NiAxNTUgMTEgNjYgNCAxMTQgMTc1IDc1IDEyMCAxNjkgMTEzIDIyOCAxODEgNjkgMTE1IDYwIDgyIDIyNyAyNSAyNTEgCis4NSAxNzIgNDcgMTM2IDE4NiAxMzggMTg0IDIyMyA2MSAxODQgMTkxIDE3NSAxMDcgNiAyOSA4MSAxMTQgMjA3IDIyMSAxOTcgMTM3IAorMjE2IDI1NCA3MyAxOTQgMTkyIDE5NCAxMDkgMjMyIDExIDk4IDEwNyAyMzQgMTQzIDIyMSAxNDYgNjEgMTk1IDg4IDU1IDEzOSAxMjAgMyAKKzE4OSAyNDkgODcgODcgMTcwIDEzMiAxMyAxNDcgNTEgMTMyIDk2IDEwOSAxNDkgNDkgMjE3IDIzMyAxMTMgNjIgMjU3IDkwIDY0IDc4IAorMTM3IDM5IDIxNiAxNzEgMTExIDUzIDU4IDczIDI4IDggMjE1IDU4IDI1MCA2NiAxNzAgMzggMTk3IDE2OSAxMDIgMTE0IDQxIDM3IDIxOCAKKzg2IDIzNCA5MiAxNDUgMTI1IDE1NSAxNzcgMjUwIDI0MyAyMDggMjAwIDIwIDQ4IDIxIDE1MCAyNDUgNDAgMTAxIDE3OCAyMTggMTY5IAorMTk2IDE5MCAxOSAyNDYgMjM2IDE0MSA0NiAyMyA2NSAxMDggMzYgMTg4IDE4NyA4NSA3OCAyMzEgMTE1IDIzNyAxMjAgODYgMTUxIDEzMCAKKzQgMjA4IDM0IDk2IDI2IDE4NyAxNjggNDAgMTEyIDMyIDk4IDIwMSA1MCAxNjQgMTI3IDEyMSAxNTkgNyAxOSAyMzUgMTIyIDEgMTQgCisxMjYgOTEgMTE4IDUgMTA0IDExMiAxMjYgMTc0IDIyMiAyNTkgMTgyIDIyNSAxOTMgOTAgMjMwIDIgMTE2IDkwIDE5OCAxMTYgMzkgMTIyIAorOTUgOTAgMTQ3IDQwIDE4IDIxNiA3NyAzNSA3NSAxMDkgNTUgMTkwIDE5NiAyNCA5NSA3IDE4NSAxNTkgMTAxIDk1IDI1NiA3MSAxOSA2OSAKKzE5OCAyMiAxODAgMTQ0IDE0NiA3MiA0OSAyMjggODcgMjUzIDk0IDExMSA2NCAxNzIgMjEzIDYwIDE2NSAxODkgMTY2IDEyNSAyMDYgMzYgCisxMSAxNDkgMTgzIDI1NSA5MiAxOTYgMjAxIDEzMyAxMjYgOCAzOCAyMCAxMzEgMjEzIF4KKzU0NyAwIDI5IDE2MiAxNjEgMTc4IDE0MiAxNCAyMDcgNDkgMTQxIDMxIDEyMCAxODMgNzIgMTM1IDIxMiA3MyAxNjEgMTk4IDEwMSAxMzYgCisyMzggNTkgMTg5IDE3MyAxOTIgOTQgMjkgMjA1IDYwIDc4IDQ4IDE1OCAyMDYgMjU0IDExNCAxNzYgMjI3IDEwMiAyMTMgMjI0IDg3IAorMTY0IDIxMyAxNTAgMTQ3IDE3NSA3NiAyMjcgMTk2IDExMiAxMjQgMjU1IDk3IDEgOTMgMTcxIDEwOSAxMzIgMTQ2IDc1IDIwMSAyMTAgCis4NCAxNDkgMjE1IDEzOSAyMTAgMTU4IDM4IDE1MyAxNCAxMzMgMTA5IDE1MiAxNTYgMjQ4IDIzMiA5IDE4MyAyNDAgMjM2IDUwIDE2NyAKKzE3IDE0OCAxNTggMTYzIDkzIDMgOCAzMiAxMDMgOCAyMDAgMjA0IDEwOCAzMiA5IDU4IDg5IDI0NyAxNzUgMjQ0IDY2IDg1IDE1NSAxOTEgCisyNTYgMTU0IDIzOSAyMTAgMTE1IDEzOSA0MiAxMDggMjAwIDExMCAyMDkgMTMyIDEwMyAxNzYgMzkgNDIgMTUxIDk5IDEwIDExNSA2NSAKKzEwMiAxMTkgNjMgMTg3IDI1OCA2OSAxMDAgMjA0IDIwMiAxOTMgMTcxIDE1IDIzMyAzNSAxMTggNiAyMTEgMTQxIDEyNSA3MCA4MyAyOSAKKzY4IDY3IDE4NSA4MSAxNTcgMTA2IDExNyAxNDggNjQgMiAxOTMgNDYgNzUgMzMgMTYwIDI0NiA1NSA5NyAxMzggMTUzIDE4MiAxODMgCisyNjAgMTk1IDIyMyAxOTggMjcgMjQ3IDM4IDE4NCA1NSAyMjIgNzggMTQyIDU3IDEwNiAyMTEgNDcgMjI2IDE3MCAxMjYgOTYgMTggNiAKKzQzIDQwIDI1IDIzOCAyMjcgMjggMTEgMjM1IDIxMiAzMCAzNiAxOTUgMjU0IDIzOSAxMTYgMTY1IDI4IDg1IDE3NSAxNTAgMTY3IDE4NSAKKzI0OSAyNTggMjA2IDE2MCAyMTUgNjUgOCAyMjAgMTYzIDE5IDYzIDE5IDE1NyAxODAgNTcgMTM3IDIwMSAxMzYgMTQ0IDE2MCA3OCAyMTYgCisyNTkgOTUgODYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDExNyA3NCAxMjQgMTMgNTYgMTc0IDEyNCAxODEgMTU3IDEyIDIxOCAyNDggMTU4IAorNjkgMTk0IDEwMyA1MSA5OSA1MyAxNCAxNzYgNTkgNTIgNjIgMTMwIDIwIDIxNCAxNTYgMTIzIDMwIDIwIDQ2IDEwNiAyMyAyNDkgMTY0IAorNDUgNDkgNDcgMTMyIDkgMTUgMTM5IDEzNiA3IDEwMCAxNiA5MSAxODIgNDYgMTQ5IDE4NCA5OCAxMjEgMjQwIDQ4IDI1MiAxNTYgMTU0IAorNzEgMTA5IDIyNiA5NiAxODYgMTA3IDE0MyAxMzQgOTIgMTg4IDIyIDQgMTI4IDE3OSAyNDIgMTUxIDE3MyAxNjEgMTA0IDIwMiAyNSA3MCAKKzEyNiAxOTAgMTc5IDE2OCAyMTEgMjM1IDI0IDE4MSAyNTEgMTczIDY3IDIwNSA0MCA2OCAxMzcgMTI3IDE5NiAyMDYgMjMgMTU1IDMgCisxNDUgOTIgMTE0IDgyIDY2IDI1MyAyNTYgMjkgMzcgMjIxIDE4OSA1IDkxIDI1NiAxOTcgMTM4IDU5IDIxIDcyIDQxIDUxIDIyNCAyNTUgCiszIDEwMiAxOTMgMyAxNzYgMTMzIDIwMyA1MSA1NiAxNTQgMTY1IDggMTI2IDIgMTE5IDE1NyA4NiAxMDcgMjM3IDMzIDIwMyAxNDUgMjE3IAorNTQgNzEgMjAzIDEyNSAyMDcgMTQzIDQwIDE5MyA3NyAxMTYgMTIyIDc4IDIzNiA3IDYgMTE3IDI0MiAyMjUgMTEzIDE1MCAyNDEgMTI1IAorMjM4IDEzMyAxMjkgMTExIDY3IDE3IDI0MiA1NyAxMiA1MCAxNDcgNyAyMzcgMTI3IDE1MyA0NSAxMjMgMTk4IDEyMSAxNDYgMTQ5IDkwIAorMTk5IDIyMSAyMSAxNjYgMjAyIDE2MiAxMzAgMTg4IDUzIDQ1IDIxNyAxNDggMjMyIDUyIDgyIDE0MCAxNDIgMjQ1IDE2NiAyMjIgMTcyIAorNDEgMjE5IDYzIDkzIDk3IDE2OSAxOTQgOSAxNTIgMjUwIDE0NyAxMzIgMTc3IDY1IDI4IDE3OSA3NCA1MCA3MyAxMTggMzcgMjAxIDIzMCAKKzk0IDYwIDI0NiAxNDkgNDcgMzggMTEwIDExNSAyMzMgMjAzIDIxOSAxMDYgNDMgMjA4IDc1IDc2IDU5IDk1IDEyIDMwIDE4OCA5NiAyMDYgCisxMTcgNTQgMTY1IDEwMiAyNSAxNjQgNzYgMzkgMTM2IDEwMSAyNjEgMTc4IDQ4IDY0IDQ1IDE0MyAyMDggMzIgMTc3IDE1OSAxODkgNzkgCiszMSAyNDUgMTIzIDYxIDEwIDEzNSAyNCAxMyAxNTAgNzMgMjQgODcgOTAgNjIgMTYxIDEwIDQxIDEyNSAyMDkgXgorNTQyIDEgMjQ0IDEzNiAyMzIgMTQwIDYyIDEyMiAxMDUgOTEgMTU4IDMwIDI3IDE1MSA4MiAxNiA5NCAyMyA3OSAxOTkgODQgMjIxIDk4IAorMTI4IDgxIDc3IDI0NyAxIDE3IDQ4IDI1OSAyNjEgMTg3IDY2IDIxNiA4NyA3NSA2OCAxNDIgMjMwIDIyNSAyMDMgMTMwIDE4IDM1IDI3IAorMTI1IDIwMSAyMjYgMTc5IDE0MiAyNTIgNjAgMjU1IDE2NyAxNDYgODIgNDIgMjM5IDc3IDI1OCAyMSAxMTYgOTYgMTkxIDEyMyAzMyAKKzEyMyAyMiAxMDMgMTI4IDU1IDE5NiAxOTMgODYgMTM2IDE2IDEyMCAxNjggMTMzIDExNCAxNzAgNDggMjM3IDE2MiAxMzUgMjkgMjkgNDAgCis2MCAyMTggMiAxOTggMTE5IDIyOSAyMiA5MiAxMDggMTYxIDE0OCAyMDIgMTY1IDI2IDE2NCA1MCAxNTIgODAgMTI3IDExNiA4NSAxNzEgCisyNCA0NCAxOTEgMTYwIDE5OCA3MSAyNDkgMTgwIDE0MCA5OSA4MiA1MyA1NCAyMzUgNDIgMTIgMzcgMjA2IDI0OCAxOTMgNDkgMTc2IDkgCisxNTcgOTEgMTgwIDEyOSAyMCAxODggNSA2MyAxMDkgMTM3IDIxOSAyMzEgMTkwIDE5NSAxIDI1OSA4IDIwNyAyMjQgMTkgMjAxIDIzNyAKKzE5OSAzNiAyNDEgMjU2IDExNyA3MiAyMDMgMTUyIDU4IDg3IDY0IDQ4IDI0OCAyNDEgMjkgNzcgMjAgMTY2IDIyOSAxMSA3MiAyMTQgCisxNzIgMjE2IDc2IDU1IDE3NCA5NCAzNCA5OSA5MyA3MyAxNTMgMTkgMjM4IDEzOCAxNDcgMjYzIDU0IDQgMTAyIDE2MyA2MyAxMjAgMTU3IAorMTEzIDIyMCAxODEgNTcgMTExIDUyIDc4IDIyMyAxMyAyNTEgNzMgMTY0IDM5IDEzMiAxODYgMTM4IDE4NCAyMjMgNjEgMTcyIDE3OSAKKzE3NSAxMDcgNiAxNyA4MSAxMTQgMjA3IDIxMyAxODUgMTI1IDIxMiAyNDYgNzMgMTkwIDE4NCAxODYgMTAxIDIyNCAxMSA5OCA5NSAyMjYgCisxMzEgMjIxIDE0NiA0OSAxODcgODggNTEgMTM5IDExMiAyNTUgMTg5IDI0NSA3NSA3OSAxNjIgMTI0IDkgMTM1IDUxIDEyOCA5MiA5NyAKKzE0MSA0OSAyMTMgMjMzIDEwNSA1NCAyNTcgODIgNjQgNzQgMTI5IDMxIDIwOCAxNjMgMTExIDQxIDU4IDY1IDI0IDI2MCAyMTEgNTQgCisyNDYgNjIgMTcwIDI2IDE5NyAxNjkgOTggMTA2IDQxIDI1IDIxMCA3OCAyMzQgOTIgMTQ1IDEyMSAxNTUgMTY1IDI0MiAyNDMgMjA4IAorMjAwIDEyIDQ4IDIxIDE0MiAyNDEgNDAgOTcgMTc4IDIxNCAxNjEgMTk2IDE4MiA3IDI0MiAyMzIgMTI5IDQyIDIzIDU3IDEwMCAzMiAKKzE4NCAxNzUgODEgNjYgMjI3IDEwNyAyMzMgMTE2IDc0IDE1MSAxMzAgMjYwIDIwMCAzNCA4OCAxNCAxNzkgMTY0IDI4IDExMiAyOCA5MCAKKzE5MyAzOCAxNTYgMTE1IDEwOSAxNTkgMjU5IDE5IDIyNyAxMTggMjUzIDEwIDEyMiA4MyAyNTYgMTA2IDI1NyAxMDQgMTA0IDEyNiAxNjYgCisyMTggMjU1IDE3OCAyMjUgMTgxIDkwIDIzMCAyNjIgMTA0IDc4IDE4NiAxMTIgMzkgMTEwIDg3IDg2IDE0NyAzNiAxNCAyMTYgNjUgMzUgCis3NSAxMDUgNDMgMTc4IDE4OCAxNiA4MyAzIDE4NSAxNTEgOTMgOTUgMjUyIDcxIDExIDYxIDE5NCAxNCAxNjggMTQ0IDEzNCA2NCAzNyAKKzIyOCA4MyAyNDUgODYgOTkgNTYgMTcyIDIwNSA1NiAxNjEgMTg1IDE2MiAxMTMgMTk0IDM2IDMgMTM3IDE3MSAyNTEgODQgMTg0IDE5NyAKKzEyMSAxMTggMzAgMTYgMTMxIDE4OCAyNyAxNjIgMTYxIDE3NCAxNDIgMTQgMjA1IDQ1IDE0MSAyNyAxMTQgMTgxIDY4IDEzMSAyMTAgNjcgCisxNTUgMTk4IDk3IDEzMCAyMzQgNTUgMTg1IDE3MyAxOTIgODggMjUgMTk5IDU4IDc2IDQ0IDE1NCAyMDAgMjUwIDEwOCAxNzIgMjI3IDk2IAorMjEzIDIyMiA4NSAxNjAgMjA5IDE1MCAxNDMgMTY5IDcyIDIyNSAxOTIgMTEwIDEyNCAyNTEgOTUgMjYzIDkxIDE2OSAxMDkgMTI2IDE0MCAKKzczIDIwMSAyMDQgODAgMTQ5IDIxNSAxMzcgMjA4IDE1MiAzMiAxNDcgMTAgMTMzIDEwMyAxNTAgMTU0IDI0OCAyMzAgOSAxODMgMjM2IAorMjM0IDQ0IDE2NSAxNSAxNDQgMTU2IDE2MyA4OSAxIDYgMjggMTAxIDggMTk2IDIwNCAxMDYgMTY0IF4KKzU2NyAwIDEgNDYgODkgMjM5IDE2NyAyMzYgNjIgODUgMTQzIDE4NyAyNTYgMTU0IDIzNSAyMTAgMTE1IDEzMSAzOCAxMDggMTk2IDEwNiAKKzIwOSAxMjQgMTAzIDE3NiAzMSAzNCAxMzkgOTEgMTAgMTA3IDYxIDk0IDExNSA1OSAxNzkgMjU4IDY5IDkyIDIwMCAyMDIgMTg5IDE3MSAKKzExIDIyNSAzMSAxMDYgMjY0IDIwNyAxMzcgMTIxIDcwIDgzIDI5IDY0IDY3IDE3NyA3NyAxNDUgMTAyIDExMyAxNDQgNTYgMiAxODEgMzQgCis2NyAzMyAxNjAgMjQ2IDQ3IDg1IDEyNiAxNDUgMTc0IDE3MSAyNjAgMTgzIDIxNSAxOTAgMjMgMjQ3IDM4IDE4MCA1NSAyMjIgNzAgMTM4IAorNDUgOTggMjExIDM5IDIyNiAxNjYgMTE4IDkyIDYgMjYwIDM5IDMyIDI1IDIzNCAyMTkgMjAgMyAyMjcgMjEyIDMwIDI1NCAyOCAxOTUgCisyNTQgMjM5IDExMiAxNTMgMjggNzMgMTcxIDEzOCAxNjcgMTgxIDI0NSAyNTAgMTk4IDE0OCAyMDcgNjUgMjYyIDIyMCAxNTUgMTUgNTUgCisxMSAxNTMgMTcyIDU3IDEzNyAxOTMgMTI4IDEzMiAxNTYgNzggMjA4IDI1NSA5MSA4MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTA1IDc0IAorMTEyIDkgNDQgMTc0IDExNiAxNzcgMTQ5IDQgMjE4IDI0MCAxNTggNjUgMTkwIDk1IDM5IDg3IDQxIDIgMTY0IDU5IDUyIDUwIDExOCAyMCAKKzIxNCAxNDQgMTExIDE4IDE2IDQ2IDEwNiAxNSAyNDkgMTUyIDM3IDQ1IDQzIDEyOCA1IDE1IDEyNyAxMzYgMyAxMDAgNCA3OSAxODIgNDIgCisxMzcgMTc2IDg2IDExNyAyNDAgMzYgMjQ4IDE1NiAxNTAgNjcgMTA1IDIxOCA5NiAxNzQgOTkgMTM1IDEzNCA4OCAxNzYgMTQgMjU4IAorMTI0IDE3NSAyMzQgMTQ3IDE2MSAxNTMgMTAwIDE5OCAyMSA2NiAxMTQgMTkwIDE2NyAxNjQgMjAzIDIzNSAxNiAxNzMgMjQ3IDE2NSA1NSAKKzIwNSAyOCA1NiAxMjkgMTIzIDE4NCAyMDYgMTkgMTUxIDI1NyAxMzMgODAgMTA2IDcwIDY2IDI1MyAyNDggMTcgMjUgMjE3IDE3NyA1IAorODcgMjUyIDE4NSAxMzAgNDcgMTMgNjggMjkgNDcgMjI0IDI1MSAyNjEgMTAyIDE4NSAzIDE3MiAxMjkgMTk1IDQzIDU2IDE0NiAxNjUgCisxMjIgMjYwIDExMSAxNTcgNzQgOTUgMjMzIDI5IDE5MSAxNDEgMjE3IDUwIDYzIDIwMyAxMTMgMTk5IDEzOSAzNiAxOTMgNzMgMTE2IAorMTIyIDY2IDIzNiA3IDIgMTA5IDI0MiAyMTcgMTA1IDE0NiAyMzcgMTI1IDIzOCAxMjEgMTI1IDk5IDYzIDkgMjM4IDQ5IDUwIDEzNSAKKzI2MSAyMjkgMTI3IDE1MyA0NSAxMTUgMTg2IDEyMSAxNDIgMTQxIDc4IDE5MSAyMTMgOSAxNjYgMTkwIDE1MCAxMjIgMTg4IDUzIDQxIAorMjEzIDE0OCAyMjQgNDAgNzggMTM2IDEzMCAyNDEgMTU0IDIxOCAxNjggMzMgMjE1IDYzIDgxIDk3IDE2NSAxOTQgMjYzIDE0NCAyNTAgCisxNDMgMTMyIDE3MyA1MyAyNCAxNzEgNjYgNDIgNjUgMTE4IDM3IDE4OSAyMjYgOTQgNjAgMjQyIDE0NSA0NyAzMCAxMTAgMTExIDIyOSAKKzE5OSAyMTEgOTQgNDMgMjAwIDYzIDY0IDU1IDgzIDEyIDIyIDE4NCA4NCAyMDIgMTE3IDQ2IDE2MSA5OCAxNyAxNjQgNzYgMjcgMTMyIAorMTAxIDI2MSAxNzQgNDQgNTIgMzMgMTQzIDIwNCAzMiAxNjkgMTUxIDE4NSA3NSAzMSAyNDUgMTIzIDU3IDI2NCAxMzUgMTIgNSAxNDIgCis2OSAyMCA3NSA4NiA2MiAxNTcgMiAzNyAxMTcgMTAxIDI0NCAxMzIgMjI4IDEzNiA1OCAxMTYgMTA1IDkxIDE1NCAyNCAyNyAxNDkgNzYgCisxMCA5MCAxOSA3OSAxOTkgODQgMjE5IDkyIDEyOCA3NyA3MyAyNDMgMjYzIDE3IDQyIDI1OSAyNTkgMTg3IDYyIDIxMiA4NSA3MSA2MiAKKzE0MCAyMjYgMjIxIDIwMSAxMjYgMTggMzMgMjEgMTIxIDE5NyAyMjQgMTc5IDEzNiAyNTIgNTggMjU1IDE2MyAxNDAgODIgMzggMjM1IAorNzEgMjU2IDE1IDExMCA5NCAxODcgMTE3IDI5IDExOSAxNiAxMDEgMTIyIDQ5IDE5NCAxOTEgODYgMTM0IDE2IDExOCAxNjQgMTMxIDExMCAKKzE2NiA0NiAyMzMgMTU2IDEzMyAyNSAyMyAzNiA1NCAyMTQgMTk0IDExOSAyMjcgMTggODggMTA0IDE1NSAxNDIgMTk2IDE2MSAyNiAxNTggCis0OCAxNDggODAgMTIzIDExMiA4MSAxNjkgMjQgNDQgMTkxIDE1OCAxOTIgNjUgMjQ1IDE3OCAxNDAgMjIzIF4KKzU1MSAxIDc4IDQ5IDU0IDIyNyA0MiA4IDMzIDE5OCAyNDAgMTgxIDQxIDE2NCAyNjUgMTUzIDgzIDE4MCAxMjUgOCAxODQgMjYxIDU1IAorMTA1IDEyOSAyMTkgMjMxIDE4MiAxOTEgMSAyNTUgNCAyMDMgMjIwIDI2NCA3IDE4OSAyMzcgMTk1IDI0IDIzMyAyNDggMTA5IDcyIDE5MSAKKzE1MiA1MCA4NyA1MiA0MCAyNDQgMjQxIDI1IDc3IDE2IDE1NCAyMjkgMjY3IDY4IDIwNiAxNjggMjEyIDY4IDUxIDE2MiA4MiAzMCA5NSAKKzkzIDY1IDE0MSAxNSAyMzQgMTMwIDEzOSAyNTUgNDIgNCA5MCAxNTEgNTEgMTIwIDE0NSAxMTMgMjEyIDE4MSA0NSAxMDcgNDQgNzQgCisyMTkgMSAyNTEgNjEgMTU2IDMxIDEyOCAxODYgMTM4IDE4NCAyMjMgNjEgMTYwIDE2NyAxNzUgMTA3IDYgNSA4MSAxMTQgMjA3IDIwNSAKKzE3MyAxMTMgMjA4IDIzOCA3MyAxODYgMTc2IDE3OCA5MyAyMTYgMTEgOTggODMgMjE4IDExOSAyMjEgMTQ2IDM3IDE3OSA4OCA0NyAxMzkgCisxMDQgMjQ3IDE4OSAyNDEgNjMgNzEgMTU0IDExNiA1IDEyMyA1MSAxMjQgODggODUgMTMzIDQ5IDIwOSAyMzMgOTcgNDYgMjU3IDc0IDY0IAorNzAgMTIxIDIzIDIwMCAxNTUgMTExIDI5IDU4IDU3IDIwIDI1MiAyMDcgNTAgMjQyIDU4IDE3MCAxNCAxOTcgMTY5IDk0IDk4IDQxIDEzIAorMjAyIDcwIDIzNCA5MiAxNDUgMTE3IDE1NSAxNTMgMjM0IDI0MyAyMDggMjAwIDQgNDggMjEgMTM0IDIzNyA0MCA5MyAxNzggMjEwIDE1MyAKKzE5NiAxNzQgMjYzIDIzOCAyMjggMTE3IDM4IDIzIDQ5IDkyIDI4IDE4MCAxNjMgNzcgNTQgMjIzIDk5IDIyOSAxMTIgNjIgMTUxIDEzMCAKKzI1NiAxOTIgMzQgODAgMiAxNzEgMTYwIDE2IDExMiAyNCA4MiAxODUgMjYgMTQ4IDEwMyA5NyAxNTkgMjUxIDE5IDIxOSAxMTQgMjQ1IDYgCisxMTggNzUgMjUyIDk0IDI0OSAxMDQgOTYgMTI2IDE1OCAyMTQgMjUxIDE3NCAyMjUgMTY5IDkwIDIzMCAyNjIgOTIgNjYgMTc0IDEwOCAKKzM5IDk4IDc5IDgyIDE0NyAzMiAxMCAyMTYgNTMgMzUgNzUgMTAxIDMxIDE2NiAxODAgOCA3MSAyNjcgMTg1IDE0MyA4NSA5NSAyNDggNzEgCiszIDUzIDE5MCA2IDE1NiAxNDQgMTIyIDU2IDI1IDIyOCA3OSAyMzcgNzggODcgNDggMTcyIDE5NyA1MiAxNTcgMTgxIDE1OCAxMDEgMTgyIAorMzYgMjYzIDEyNSAxNTkgMjQ3IDc2IDE3MiAxOTMgMTA5IDExMCAyNjAgMjIgMTIgMTMxIDE3NiAyMyAxNjIgMTYxIDE2NiAxNDIgMTQgCisyMDEgMzcgMTQxIDE5IDEwMiAxNzcgNjAgMTIzIDIwNiA1NSAxNDMgMTk4IDg5IDExOCAyMjYgNDcgMTc3IDE3MyAxOTIgNzYgMTcgMTg3IAorNTQgNzIgMzYgMTQ2IDE4OCAyNDIgOTYgMTY0IDIyNyA4NCAyMTMgMjE4IDgxIDE1MiAyMDEgMTUwIDEzNSAxNTcgNjQgMjIxIDE4NCAKKzEwNiAxMjQgMjQzIDkxIDI2MyA4NyAxNjUgMTA5IDExNCAxMjggNjkgMjAxIDE5MiA3MiAxNDkgMjE1IDEzMyAyMDQgMTQwIDIwIDEzNSAKKzIgMTMzIDkxIDE0NiAxNTAgMjQ4IDIyNiA5IDE4MyAyMjggMjMwIDMyIDE2MSAxMSAxMzYgMTUyIDE2MyA4MSAyNjUgMiAyMCA5NyA4IAorMTg4IDIwNCAxMDIgMjYgMjY1IDQwIDg5IDIzNSAxNjMgMjMyIDYwIDg1IDEzNyAxODUgMjU2IDE1NCAyMzMgMjEwIDExNSAxMjcgMzYgCisxMDggMTk0IDEwNCAyMDkgMTIwIDEwMyAxNzYgMjcgMzAgMTMzIDg3IDEwIDEwMyA1OSA5MCAxMTMgNTcgMTc1IDI1OCA2OSA4OCAxOTggCisyMDIgMTg3IDE3MSA5IDIyMSAyOSAxMDAgMjYyIDIwNSAxMzUgMTE5IDcwIDgzIDI5IDYyIDY3IDE3MyA3NSAxMzkgMTAwIDExMSAxNDIgCis1MiAyIDE3NSAyOCA2MyAzMyAxNjAgMjQ2IDQzIDc5IDEyMCAxNDEgMTcwIDE2NSAyNjAgMTc3IDIxMSAxODYgMjEgMjQ3IDM4IDE3OCAKKzU1IDIyMiA2NiAxMzYgMzkgOTQgMjExIDM1IDIyNiAxNjQgMTE0IDkwIDI1NiAzNyAyOCAyNSAyMzIgMjE1IDE2IDI2NyAyMjMgMjEyIAorMzAgMjUwIDI0IDE5NSAyNTQgMjM5IDExMCAxNDcgMjggNjcgMTY5IDEzMiAxNjcgMTc5IDI0MyAyNDYgMTk0IDE0MiAyMDMgNjUgMjYzIF4KKzU3OCAwIDIyMCAxNDcgMTEgNDcgMyAxNDkgMTY0IDU3IDEzNyAxODUgMTIwIDEyMCAxNTIgNzggMjAwIDI1MSA4NyA3OCAyMzIgMTc3IAorMjIgMTI5IDY4IDE2OCA5MyA3NCAxMDAgNSAzMiAxNzQgMTA4IDE3MyAxNDEgMjY2IDIxOCAyMzIgMTU4IDYxIDE4NiA4NyAyNyA3NSAyOSAKKzI2MCAxNTIgNTkgNTIgMzggMTA2IDIwIDIxNCAxMzIgOTkgNiAxMiA0NiAxMDYgNyAyNDkgMTQwIDI5IDQxIDM5IDEyNCAxIDE1IDExNSAKKzEzNiAyNjkgMTAwIDI2MiA2NyAxODIgMzggMTI1IDE2OCA3NCAxMTMgMjQwIDI0IDI0NCAxNTYgMTQ2IDYzIDEwMSAyMTAgOTYgMTYyIAorOTEgMTI3IDEzNCA4NCAxNjQgNiAyNTAgMTIwIDE3MSAyMjYgMTQzIDE0OSAxNDUgOTYgMTk0IDE3IDYyIDEwMiAxOTAgMTU1IDE2MCAKKzE5NSAyMzUgOCAxNjUgMjQzIDE1NyA0MyAyMDUgMTYgNDQgMTIxIDExOSAxNzIgMjA2IDE1IDE0NyAyNDkgMTIxIDY4IDk4IDU4IDY2IAorMjUzIDI0MCA1IDEzIDIxMyAxNjUgNSA4MyAyNDggMTczIDEyMiAzNSA1IDY0IDE3IDQzIDIyNCAyNDcgMjU3IDEwMiAxNzcgMyAxNjggCisxMjUgMTg3IDM1IDU2IDEzOCAxNjUgMjYyIDExOCAyNTYgMTAzIDE1NyA2MiA4MyAyMjkgMjUgMTc5IDEzNyAyMTcgNDYgNTUgMjAzIAorMTAxIDE5MSAxMzUgMzIgMTkzIDY5IDExNiAxMjIgNTQgMjM2IDcgMjY4IDEwMSAyNDIgMjA5IDk3IDE0MiAyMzMgMTI1IDIzOCAxMDkgCisxMjEgODcgNTkgMSAyMzQgNDEgMjU4IDUwIDEyMyAyNTMgMjIxIDEyNyAxNTMgNDUgMTA3IDE3NCAxMjEgMTM4IDEzMyA2NiAxODMgMjA1IAorMjY3IDE2NiAxNzggMTM4IDExNCAxODggNTMgMzcgMjA5IDE0OCAyMTYgMjggNzQgMTMyIDExOCAyMzcgMTQyIDIxNCAxNjQgMjUgMjExIAorNjMgNjkgOTcgMTYxIDE5NCAyNTUgMTM2IDI1MCAxMzkgMTMyIDE2OSA0MSAyMCAxNjMgNTggMzQgNTcgMTE4IDM3IDE3NyAyMjIgOTQgCis2MCAyMzggMTQxIDQ3IDIyIDExMCAxMDcgMjI1IDE5NSAyMDMgODIgNDMgMTkyIDUxIDUyIDUxIDcxIDEyIDE0IDE4MCA3MiAxOTggMTE3IAorMzggMTU3IDk0IDkgMTY0IDc2IDE1IDEyOCAxMDEgMjYxIDE3MCA0MCA0MCAyMSAxNDMgMjAwIDMyIDE2MSAxNDMgMTgxIDcxIDMxIDI0NSAKKzEyMyA1MyAyNTYgMTM1IDI2NyAxMzQgNjUgMTYgNjMgODIgNjIgMTUzIDI2NCAzMyAxMDkgODkgMjQ0IDEyNCAyMjAgMTI4IDUwIDEwNCAKKzEwNSA5MSAxNDYgMTIgMjcgMTQ1IDY0IDI2OCA4MiAxMSA3OSAxOTkgODQgMjE1IDgwIDEyOCA2OSA2NSAyMzUgMjU5IDE3IDMwIDI1OSAKKzI1NSAxODcgNTQgMjA0IDgxIDYzIDUwIDEzNiAyMTggMjEzIDE5NyAxMTggMTggMjkgOSAxMTMgMTg5IDIyMCAxNzkgMTI0IDI1MiA1NCAKKzI1NSAxNTUgMTI4IDgyIDMwIDIyNyA1OSAyNTIgMyA5OCA5MCAxNzkgMTA1IDIxIDExMSA0IDk3IDExMCAzNyAxOTAgMTg3IDg2IDEzMCAKKzE2IDExNCAxNTYgMTI3IDEwMiAxNTggNDIgMjI1IDE0NCAxMjkgMTcgMTEgMjggNDIgMjA2IDI2NiAxODYgMTE5IDIyMyAxMCA4MCA5NiAKKzE0MyAxMzAgMTg0IDE1MyAyNiAxNDYgNDQgMTQwIDgwIDExNSAxMDQgNzMgMTY1IDI0IDQ0IDE5MSAxNTQgMTgwIDUzIDIzNyAxNzQgCisxNDAgOTkgNzYgNDcgNTQgMjIzIDQyIDYgMzEgMTk0IDIzNiAxNzUgMzcgMTU4IDI2MSAxNTEgNzkgMTgwIDEyMyAyIDE4MiAyNTcgNTEgCisxMDMgMTI1IDIxOSAyMzEgMTc4IDE4OSAxIDI1MyAyIDIwMSAyMTggMjY0IDEgMTgzIDIzNyAxOTMgMTggMjI5IDI0NCAxMDUgNzIgMTg1IAorMTUyIDQ2IDg3IDQ2IDM2IDI0MiAyNDEgMjMgNzcgMTQgMTQ4IDIyOSAyNjMgNjYgMjAyIDE2NiAyMTAgNjQgNDkgMTU2IDc2IDI4IDkzIAorOTMgNjEgMTM1IDEzIDIzMiAxMjYgMTM1IDI1MSAzNiA0IDg0IDE0NSA0NSAxMjAgMTM5IDExMyAyMDggMTgxIDM5IDEwNSA0MCA3MiAKKzIxNyAyNjUgMjUxIDU1IDE1MiAyNyAxMjYgMTg2IDEzOCAxODQgMjIzIDYxIDE1NCAxNjEgMTc1IDEwNyA2IDI2OSA4MSAxMTQgMjA3IAorMjAxIDE2NyAxMDcgMjA2IDIzNCA3MyAxODQgMTcyIDE3NCA4OSAyMTIgMTEgOTggNzcgMjE0IDExMyAyMjEgMTQ2IDMxIDE3NSA4OCA0NSAKKzEzOSAxMDAgMjQzIDE4OSAyMTMgXgorNTc4IDEgNTEgNjMgMTQ2IDEwOCAxIDExMSA1MSAxMjAgODQgNzMgMTI1IDQ5IDIwNSAyMzMgODkgMzggMjU3IDY2IDY0IDY2IDExMyAxNSAKKzE5MiAxNDcgMTExIDE3IDU4IDQ5IDE2IDI0NCAyMDMgNDYgMjM4IDU0IDE3MCAyIDE5NyAxNjkgOTAgOTAgNDEgMSAxOTQgNjIgMjM0IAorOTIgMTQ1IDExMyAxNTUgMTQxIDIyNiAyNDMgMjA4IDIwMCAyNjggNDggMjEgMTI2IDIzMyA0MCA4OSAxNzggMjA2IDE0NSAxOTYgMTY2IAorMjU1IDIzNCAyMjQgMTA1IDM0IDIzIDQxIDg0IDI0IDE3NiAxNTEgNzMgNDIgMjE5IDkxIDIyNSAxMDggNTAgMTUxIDEzMCAyNTIgMTg0IAorMzQgNzIgMjYyIDE2MyAxNTYgNCAxMTIgMjAgNzQgMTc3IDE0IDE0MCA5MSA4NSAxNTkgMjQzIDE5IDIxMSAxMTAgMjM3IDIgMTE0IDY3IAorMjQ4IDgyIDI0MSAxMDQgODggMTI2IDE1MCAyMTAgMjQ3IDE3MCAyMjUgMTU3IDkwIDIzMCAyNjIgODAgNTQgMTYyIDEwNCAzOSA4NiA3MSAKKzc4IDE0NyAyOCA2IDIxNiA0MSAzNSA3NSA5NyAxOSAxNTQgMTcyIDU5IDI2NyAxODUgMTM1IDc3IDk1IDI0NCA3MSAyNjcgNDUgMTg2IAorMjcwIDE0NCAxNDQgMTEwIDQ4IDEzIDIyOCA3NSAyMjkgNzAgNzUgNDAgMTcyIDE4OSA0OCAxNTMgMTc3IDE1NCA4OSAxNzAgMzYgMjU5IAorMTEzIDE0NyAyNDMgNjggMTYwIDE4OSA5NyAxMDIgMjU2IDE0IDggMTMxIDE2NCAxOSAxNjIgMTYxIDE1OCAxNDIgMTQgMTk3IDI5IDE0MSAKKzExIDkwIDE3MyA1MiAxMTUgMjAyIDQzIDEzMSAxOTggODEgMTA2IDIxOCAzOSAxNjkgMTczIDE5MiA2NCA5IDE3NSA1MCA2OCAyOCAxMzggCisxNzYgMjM0IDg0IDE1NiAyMjcgNzIgMjEzIDIxNCA3NyAxNDQgMTkzIDE1MCAxMjcgMTQ1IDU2IDIxNyAxNzYgMTAyIDEyNCAyMzUgODcgCisyNjMgODMgMTYxIDEwOSAxMDIgMTE2IDY1IDIwMSAxODAgNjQgMTQ5IDIxNSAxMjkgMjAwIDEyOCA4IDEyMyAyNjYgMTMzIDc5IDE0MiAKKzE0NiAyNDggMjIyIDkgMTgzIDIyMCAyMjYgMjAgMTU3IDcgMTI4IDE0OCAxNjMgNzMgMjY1IDI3MCAxMiA5MyA4IDE4MCAyMDQgOTggMjIgCisyNjEgMjggODkgMjI3IDE1NSAyMjQgNTYgODUgMTI1IDE4MSAyNTYgMTU0IDIyOSAyMTAgMTE1IDExOSAzMiAxMDggMTkwIDEwMCAyMDkgCisxMTIgMTAzIDE3NiAxOSAyMiAxMjEgNzkgMTAgOTUgNTUgODIgMTA5IDUzIDE2NyAyNTggNjkgODAgMTk0IDIwMiAxODMgMTcxIDUgMjEzIAorMjUgODggMjU4IDIwMSAxMzEgMTE1IDcwIDgzIDI5IDU4IDY3IDE2NSA3MSAxMjcgOTYgMTA3IDEzOCA0NCAyIDE2MyAxNiA1NSAzMyAKKzE2MCAyNDYgMzUgNjcgMTA4IDEzMyAxNjIgMTUzIDI2MCAxNjUgMjAzIDE3OCAxNyAyNDcgMzggMTc0IDU1IDIyMiA1OCAxMzIgMjcgODYgCisyMTEgMjcgMjI2IDE2MCAxMDYgODYgMjYwIDI0OCAzMyAyMCAyNSAyMjggMjA3IDggMjYzIDIxNSAyMTIgMzAgMjQyIDE2IDE5NSAyNTQgCisyMzkgMTA2IDEzNSAyOCA1NSAxNjUgMTIwIDE2NyAxNzUgMjM5IDIzOCAxODYgMTMwIDE5NSA2NSAyNTAgMjIwIDE0MyA5IDQzIDI3MSAKKzE0NyAxNjAgNTcgMTM3IDE4MSAxMTYgMTE0IDE1MCA3OCAxOTYgMjQ5IDg1IDc2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA4NyA3NCA5NCAKKzMgMjYgMTc0IDEwNCAxNzEgMTM3IDI2NCAyMTggMjI4IDE1OCA1OSAxODQgODMgMjEgNjkgMjMgMjU2IDE0NiA1OSA1MiAzMiAxMDAgMjAgCisyMTQgMTI2IDkzIDEwIDQ2IDEwNiAzIDI0OSAxMzQgMjUgMzkgMzcgMTIyIDI3MSAxNSAxMDkgMTM2IDI2OSAxMDAgMjU4IDYxIDE4MiAKKzM2IDExOSAxNjQgNjggMTExIDI0MCAxOCAyNDIgMTU2IDE0NCA2MSA5OSAyMDYgOTYgMTU2IDg3IDEyMyAxMzQgODIgMTU4IDIgMjQ2IAorMTE4IDE2OSAyMjIgMTQxIDE0MyAxNDEgOTQgMTkyIDE1IDYwIDk2IDE5MCAxNDkgMTU4IDE5MSAyMzUgNCAxNjEgMjQxIDE1MyAzNyAKKzIwNSAxMCAzOCAxMTcgMTE3IDE2NiAyMDYgMTMgMTQ1IDI0NSAxMTUgNjIgOTQgNTIgNjYgMjUzIDIzNiAyNzEgNyAyMTEgMTU5IDUgODEgCisyNDYgMTY3IDExOCAyOSAxIDYyIDExIDQxIDIyNCAyNDUgMjU1IDEwMiAxNzMgMyAxNjYgMTIzIDE4MyAzMSA1NiAxMzQgMTY1IDI2MCAKKzExNiAyNTQgODEgXgorNTgzIDEgMTU3IDUwIDcxIDIyNSAyMSAxNjcgMTMzIDIxNyA0MiA0NyAyMDMgODkgMTgzIDEzMSAyOCAxOTMgNjUgMTE2IDEyMiA0MiAKKzIzNiA3IDI2OCA5MyAyNDIgMjAxIDg5IDEzOCAyMjkgMTI1IDIzOCA5NyAxMTcgNzUgNTUgMjY3IDIzMCAzMyAyNTAgNTAgMTExIDI0NSAKKzIxMyAxMjcgMTUzIDQ1IDk5IDE2MiAxMjEgMTM0IDEyNSA1NCAxNzUgMTk3IDI1OSAxNjYgMTY2IDEyNiAxMDYgMTg4IDUzIDMzIDIwNSAKKzE0OCAyMDggMTYgNzAgMTI4IDEwNiAyMzMgMTMwIDIxMCAxNjAgMTcgMjA3IDYzIDU3IDk3IDE1NyAxOTQgMjQ3IDEyOCAyNTAgMTM1IAorMTMyIDE2NSAyOSAxNiAxNTUgNTAgMjYgNDkgMTE4IDM3IDE2NSAyMTggOTQgNjAgMjM0IDEzNyA0NyAxNCAxMTAgMTAzIDIyMSAxOTEgCisxOTUgNzAgNDMgMTg0IDM5IDQwIDQ3IDU5IDEyIDYgMTc2IDYwIDE5NCAxMTcgMzAgMTUzIDkwIDEgMTY0IDc2IDMgMTI0IDEwMSAyNjEgCisxNjYgMzYgMjggOSAxNDMgMTk2IDMyIDE1MyAxMzUgMTc3IDY3IDMxIDI0NSAxMjMgNDkgMjQ4IDEzNSAyNjIgMjYzIDEyNiA2MSAxMiAKKzUxIDc4IDYyIDE0OSAyNjAgMjkgMTAxIDc3IDI0NCAxMTYgMjEyIDEyMCA0MiA5MiAxMDUgOTEgMTM4IDI3IDE0MSA1MiAyNjAgNzQgMyAKKzc5IDE5OSA4NCAyMTEgNjggMTI4IDYxIDU3IDIyNyAyNTUgMTcgMTggMjU5IDI1MSAxODcgNDYgMTk2IDc3IDU1IDM4IDEzMiAyMTAgCisyMDUgMTkzIDExMCAxOCAyNSAyNzEgMTA1IDE4MSAyMTYgMTc5IDExMiAyNTIgNTAgMjU1IDE0NyAxMTYgODIgMjIgMjE5IDQ3IDI0OCAKKzI2NSA4NiA4NiAxNzEgOTMgMTMgMTAzIDI2NiA5MyA5OCAyNSAxODYgMTgzIDg2IDEyNiAxNiAxMTAgMTQ4IDEyMyA5NCAxNTAgMzggCisyMTcgMTMyIDEyNSA5IDI3MyAyMCAzMCAxOTggMjY2IDE3OCAxMTkgMjE5IDIgNzIgODggMTMxIDExOCAxNzIgMTQ1IDI2IDEzNCA0MCAKKzEzMiA4MCAxMDcgOTYgNjUgMTYxIDI0IDQ0IDE5MSAxNTAgMTY4IDQxIDIyOSAxNzAgMTQwIDk5IDcyIDQzIDU0IDIxNSA0MiAyIDI3IAorMTg2IDIyOCAxNjMgMjkgMTQ2IDI1MyAxNDcgNzEgMTgwIDExOSAyNjQgMTc4IDI0OSA0MyA5OSAxMTcgMjE5IDIzMSAxNzAgMTg1IDEgCisyNDkgMjcyIDE5NyAyMTQgMjY0IDI2MyAxNzEgMjM3IDE4OSA2IDIyMSAyMzYgOTcgNzIgMTczIDE1MiAzOCA4NyAzNCAyOCAyMzggMjQxIAorMTkgNzcgMTAgMTM2IDIyOSAyNTUgNjIgMTk0IDE2MiAyMDYgNTYgNDUgMTQ0IDY0IDI0IDg5IDkzIDUzIDEyMyA5IDIyOCAxMTggMTI3IAorMjQzIDI0IDQgNzIgMTMzIDMzIDEyMCAxMjcgMTEzIDIwMCAxODEgMjcgMTAxIDMyIDY4IDIxMyAyNTcgMjUxIDQzIDE0NCAxOSAxMjIgCisxODYgMTM4IDE4NCAyMjMgNjEgMTQyIDE0OSAxNzUgMTA3IDYgMjYxIDgxIDExNCAyMDcgMTkzIDE1NSA5NSAyMDIgMjI2IDczIDE4MCAKKzE2NCAxNjYgODEgMjA0IDExIDk4IDY1IDIwNiAxMDEgMjIxIDE0NiAxOSAxNjcgODggNDEgMTM5IDkyIDIzNSAxODkgMjM1IDQ1IDU5IAorMTQyIDEwNCAyNzMgMTA1IDUxIDExOCA4MiA2NyAxMjEgNDkgMjAzIDIzMyA4NSAzNCAyNTcgNjIgNjQgNjQgMTA5IDExIDE4OCAxNDMgCisxMTEgMTEgNTggNDUgMTQgMjQwIDIwMSA0NCAyMzYgNTIgMTcwIDI3MCAxOTcgMTY5IDg4IDg2IDQxIDI2OSAxOTAgNTggMjM0IDkyIAorMTQ1IDExMSAxNTUgMTM1IDIyMiAyNDMgMjA4IDIwMCAyNjYgNDggMjEgMTIyIDIzMSA0MCA4NyAxNzggMjA0IDE0MSAxOTYgMTYyIDI1MSAKKzIzMiAyMjIgOTkgMzIgMjMgMzcgODAgMjIgMTc0IDE0NSA3MSAzNiAyMTcgODcgMjIzIDEwNiA0NCAxNTEgMTMwIDI1MCAxODAgMzQgNjggCisyNTggMTU5IDE1NCAyNzIgMTEyIDE4IDcwIDE3MyA4IDEzNiA4NSA3OSAxNTkgMjM5IDE5IDIwNyAxMDggMjMzIDExMiA2MyAyNDYgNzYgCisyMzcgMTA0IDg0IDEyNiAxNDYgMjA4IDI0NSAxNjggMjI1IDE1MSA5MCAyMzAgMjYyIDc0IDQ4IDE1NiAxMDIgMzkgODAgNjcgNzYgMTQ3IAorMjYgNCAyMTYgMzUgMzUgNzUgOTUgMTMgMTQ4IDE2OCAyNzAgNTMgMjY3IDE4NSAxMzEgNzMgOTUgMjQyIDcxIDI2NSA0MSAxODQgMjY4IAorMTM4IDE0NCAxMDQgNDQgNyAyMjggNzMgMjI1IDY2IDY5IDM2IDI3MiBeCis1ODggMCAxODEgNDQgMTQ5IDE3MyAxNTAgNzcgMTU4IDM2IDI1NSAxMDEgMTM1IDIzOSA2MCAxNDggMTg1IDg1IDk0IDI1MiA2IDQgMTMxIAorMTUyIDE1IDE2MiAxNjEgMTUwIDE0MiAxNCAxOTMgMjEgMTQxIDMgNzggMTY5IDQ0IDEwNyAxOTggMzEgMTE5IDE5OCA3MyA5NCAyMTAgCiszMSAxNjEgMTczIDE5MiA1MiAxIDE2MyA0NiA2NCAyMCAxMzAgMTY0IDIyNiA3MiAxNDggMjI3IDYwIDIxMyAyMTAgNzMgMTM2IDE4NSAKKzE1MCAxMTkgMTMzIDQ4IDIxMyAxNjggOTggMTI0IDIyNyA4MyAyNjMgNzkgMTU3IDEwOSA5MCAxMDQgNjEgMjAxIDE2OCA1NiAxNDkgCisyMTUgMTI1IDE5NiAxMTYgMjcyIDExMSAyNjIgMTMzIDY3IDEzOCAxNDIgMjQ4IDIxOCA5IDE4MyAyMTIgMjIyIDggMTUzIDMgMTIwIAorMTQ0IDE2MyA2NSAyNjUgMjcwIDQgODkgOCAxNzIgMjA0IDk0IDE4IDI1NyAxNiA4OSAyMTkgMTQ3IDIxNiA1MiA4NSAxMTMgMTc3IDI1NiAKKzE1NCAyMjUgMjEwIDExNSAxMTEgMjggMTA4IDE4NiA5NiAyMDkgMTA0IDEwMyAxNzYgMTEgMTQgMTA5IDcxIDEwIDg3IDUxIDc0IDEwNSAKKzQ5IDE1OSAyNTggNjkgNzIgMTkwIDIwMiAxNzkgMTcxIDEgMjA1IDIxIDc2IDI1NCAxOTcgMTI3IDExMSA3MCA4MyAyOSA1NCA2NyAxNTcgCis2NyAxMTUgOTIgMTAzIDEzNCAzNiAyIDE1MSA0IDQ3IDMzIDE2MCAyNDYgMjcgNTUgOTYgMTI1IDE1NCAxNDEgMjYwIDE1MyAxOTUgMTcwIAorMTMgMjQ3IDM4IDE3MCA1NSAyMjIgNTAgMTI4IDE1IDc4IDIxMSAxOSAyMjYgMTU2IDk4IDgyIDI1MiAyNDAgMjkgMTIgMjUgMjI0IDE5OSAKKzI1OSAyMDcgMjEyIDMwIDIzNCA4IDE5NSAyNTQgMjM5IDEwMiAxMjMgMjggNDMgMTYxIDEwOCAxNjcgMTcxIDIzNSAyMzAgMTc4IDExOCAKKzE4NyA2NSAyNDIgMjIwIDEzNSA1IDM1IDI2NyAxNDMgMTUyIDU3IDEzNyAxNzMgMTA4IDEwMiAxNDYgNzggMTg4IDI0NSA4MSA3MiAyMzIgCisxNzcgMjIgMTI5IDY4IDE2OCA3NSA3NCA4MiAyNzUgMTQgMTc0IDk2IDE2NyAxMjkgMjYwIDIxOCAyMjAgMTU4IDU1IDE4MCA3NSA5IDU3IAorMTEgMjQ4IDEzNCA1OSA1MiAyMCA4OCAyMCAyMTQgMTE0IDgxIDI2NCA2IDQ2IDEwNiAyNzEgMjQ5IDEyMiAxNyAzNSAzMyAxMTggMjcxIAorMTUgOTcgMTM2IDI2OSAxMDAgMjUwIDQ5IDE4MiAzMiAxMDcgMTU2IDU2IDEwNyAyNDAgNiAyMzggMTU2IDE0MCA1NyA5NSAxOTggOTYgCisxNDQgNzkgMTE1IDEzNCA3OCAxNDYgMjcwIDIzOCAxMTQgMTY1IDIxNCAxMzcgMTMxIDEzMyA5MCAxODggMTEgNTYgODQgMTkwIDEzNyAKKzE1NCAxODMgMjM1IDI3MiAxNTMgMjM3IDE0NSAyNSAyMDUgMjc0IDI2IDEwOSAxMTMgMTU0IDIwNiA5IDE0MSAyMzcgMTAzIDUwIDg2IAorNDAgNjYgMjUzIDIyOCAyNjMgMjcxIDIwNyAxNDcgNSA3NyAyNDIgMTU1IDExMCAxNyAyNjkgNTggMjc1IDM3IDIyNCAyNDEgMjUxIDEwMiAKKzE2NSAzIDE2MiAxMTkgMTc1IDIzIDU2IDEyNiAxNjUgMjU2IDExMiAyNTAgOTEgMTU3IDQ0IDY1IDIyMyAxOSAxNjEgMTMxIDIxNyA0MCAKKzQzIDIwMyA4MyAxNzkgMTI5IDI2IDE5MyA2MyAxMTYgMTIyIDM2IDIzNiA3IDI2OCA4OSAyNDIgMTk3IDg1IDEzNiAyMjcgMTI1IDIzOCAKKzkxIDExNSA2OSA1MyAyNjUgMjI4IDI5IDI0NiA1MCAxMDUgMjQxIDIwOSAxMjcgMTUzIDQ1IDk1IDE1NiAxMjEgMTMyIDEyMSA0OCAxNzEgCisxOTMgMjU1IDE2NiAxNjAgMTIwIDEwMiAxODggNTMgMzEgMjAzIDE0OCAyMDQgMTAgNjggMTI2IDEwMCAyMzEgMTI0IDIwOCAxNTggMTMgCisyMDUgNjMgNTEgOTcgMTU1IDE5NCAyNDMgMTI0IDI1MCAxMzMgMTMyIDE2MyAyMyAxNCAxNTEgNDYgMjIgNDUgMTE4IDM3IDE1OSAyMTYgCis5NCA2MCAyMzIgMTM1IDQ3IDEwIDExMCAxMDEgMjE5IDE4OSAxOTEgNjQgNDMgMTgwIDMzIDM0IDQ1IDUzIDEyIDIgMTc0IDU0IDE5MiAKKzExNyAyNiAxNTEgODggMjczIDE2NCA3NiAyNzMgMTIyIDEwMSAyNjEgMTY0IDM0IDIyIDMgMTQzIDE5NCAzMiAxNDkgMTMxIDE3NSA2NSAKKzMxIDI0NSAxMjMgNDcgMjQ0IDEzNSAyNTggMjYxIDEyMiA1OSAxMCA0NSA3NiA2MiAxNDcgMjU4IDI3IDk3IDcxIDI0NCAxMTIgMjA4IAorMTE2IDM4IDg2IDEwNSA5MSAxMzQgMjcwIDI3IDEzOSA0NiAyNTYgNzAgMjc1IDc5IDE5OSAxNjAgXgorNTk0IDAgMjA3IDU2IDEyOCA1MyA0OSAyMTkgMjUxIDE3IDYgMjU5IDI0NyAxODcgMzggMTg4IDczIDQ3IDI2IDEyOCAyMDIgMTk3IDE4OSAKKzEwMiAxOCAyMSAyNjMgOTcgMTczIDIxMiAxNzkgMTAwIDI1MiA0NiAyNTUgMTM5IDEwNCA4MiAxNCAyMTEgMzUgMjQ0IDI1NyA3NCA4MiAKKzE2MyA4MSA1IDk1IDI1OCA4OSA4NiAxMyAxODIgMTc5IDg2IDEyMiAxNiAxMDYgMTQwIDExOSA4NiAxNDIgMzQgMjA5IDEyMCAxMjEgMSAKKzI2NSAxMiAxOCAxOTAgMjY2IDE3MCAxMTkgMjE1IDI3MiA2NCA4MCAxMTkgMTA2IDE2MCAxMzcgMjYgMTIyIDM2IDEyNCA4MCA5OSA4OCAKKzU3IDE1NyAyNCA0NCAxOTEgMTQ2IDE1NiAyOSAyMjEgMTY2IDE0MCA5OSA2OCAzOSA1NCAyMDcgNDIgMjc2IDIzIDE3OCAyMjAgMTUxIAorMjEgMTM0IDI0NSAxNDMgNjMgMTgwIDExNSAyNTYgMTc0IDI0MSAzNSA5NSAxMDkgMjE5IDIzMSAxNjIgMTgxIDEgMjQ1IDI3MiAxOTMgCisyMTAgMjY0IDI1NSAxNTkgMjM3IDE4NSAyNzIgMjEzIDIyOCA4OSA3MiAxNjEgMTUyIDMwIDg3IDIyIDIwIDIzNCAyNDEgMTUgNzcgNiAKKzEyNCAyMjkgMjQ3IDU4IDE4NiAxNTggMjAyIDQ4IDQxIDEzMiA1MiAyMCA4NSA5MyA0NSAxMTEgNSAyMjQgMTEwIDExOSAyMzUgMTIgNCAKKzYwIDEyMSAyMSAxMjAgMTE1IDExMyAxOTIgMTgxIDE1IDk3IDI0IDY0IDIwOSAyNDkgMjUxIDMxIDEzNiAxMSAxMTggMTg2IDEzOCAxODQgCisyMjMgNjEgMTMwIDEzNyAxNzUgMTA3IDYgMjUzIDgxIDExNCAyMDcgMTg1IDE0MyA4MyAxOTggMjE4IDczIDE3NiAxNTYgMTU4IDczIAorMTk2IDExIDk4IDUzIDE5OCA4OSAyMjEgMTQ2IDcgMTU5IDg4IDM3IDEzOSA4NCAyMjcgMTg5IDIzMSAzMyA1MSAxMzQgOTYgMjczIDkzIAorNTEgMTE0IDc4IDU1IDExMyA0OSAxOTkgMjMzIDc3IDI2IDI1NyA1NCA2NCA2MCAxMDEgMyAxODAgMTM1IDExMSAyNzcgNTggMzcgMTAgCisyMzIgMTk3IDQwIDIzMiA0OCAxNzAgMjYyIDE5NyAxNjkgODQgNzggNDEgMjYxIDE4MiA1MCAyMzQgOTIgMTQ1IDEwNyAxNTUgMTIzIAorMjE0IDI0MyAyMDggMjAwIDI2MiA0OCAyMSAxMTQgMjI3IDQwIDgzIDE3OCAyMDAgMTMzIDE5NiAxNTQgMjQzIDIyOCAyMTggODcgMjggCisyMyAyOSA3MiAxOCAxNzAgMTMzIDY3IDI0IDIxMyA3OSAyMTkgMTAyIDMyIDE1MSAxMzAgMjQ2IDE3MiAzNCA2MCAyNTAgMTUxIDE1MCAKKzI2NCAxMTIgMTQgNjIgMTY1IDI3NCAxMjggNzMgNjcgMTU5IDIzMSAxOSAxOTkgMTA0IDIyNSAyNzQgMTA4IDU1IDI0MiA2NCAyMjkgCisxMDQgNzYgMTI2IDEzOCAyMDQgMjQxIDE2NCAyMjUgMTM5IDkwIDIzMCAyNjIgNjIgMzYgMTQ0IDk4IDM5IDY4IDU5IDcyIDE0NyAyMiAKKzIxNiAyMyAzNSA3NSA5MSAxIDEzNiAxNjAgMjY2IDQxIDI2NyAxODUgMTIzIDY1IDk1IDIzOCA3MSAyNjEgMzMgMTgwIDI2NCAxMjYgCisxNDQgOTIgMzYgMjczIDIyOCA2OSAyMTcgNTggNTcgMjggMTcyIDE3NyA0MiAxNDcgMTcxIDE0OCA3MSAxNTIgMzYgMjUzIDk1IDEyOSAKKzIzNyA1NiAxNDIgMTgzIDc5IDkwIDI1MCAyIDIgMTMxIDE0NiAxMyAxNjIgMTYxIDE0NiAxNDIgMTQgMTkxIDE3IDE0MSAyNzcgNzIgCisxNjcgNDAgMTAzIDE5NiAyNSAxMTMgMTk4IDY5IDg4IDIwNiAyNyAxNTcgMTczIDE5MiA0NiAyNzUgMTU3IDQ0IDYyIDE2IDEyNiAxNTggCisyMjIgNjYgMTQ0IDIyNyA1NCAyMTMgMjA4IDcxIDEzMiAxODEgMTUwIDExNSAxMjcgNDQgMjExIDE2NCA5NiAxMjQgMjIzIDgxIDI2MyAKKzc3IDE1NSAxMDkgODQgOTggNTkgMjAxIDE2MiA1MiAxNDkgMjE1IDEyMyAxOTQgMTEwIDI2OCAxMDUgMjYwIDEzMyA2MSAxMzYgMTQwIAorMjQ4IDIxNiA5IDE4MyAyMDggMjIwIDIgMTUxIDEgMTE2IDE0MiAxNjMgNjEgMjY1IDI3MCA4NyA4IDE2OCAyMDQgOTIgMTYgMjU1IDEwIAorODkgMjE1IDE0MyAyMTIgNTAgODUgMTA3IDE3NSAyNTYgMTU0IDIyMyAyMTAgMTE1IDEwNyAyNiAxMDggMTg0IDk0IDIwOSAxMDAgMTAzIAorMTc2IDcgMTAgMTAzIDY3IDEwIDgzIDQ5IDcwIDEwMyA0NyAxNTUgMjU4IDY5IDY4IDE4OCAyMDIgMTc3IDE3MSAyNzcgMjAxIDE5IDcwIAorMjUyIDE5NSAxMjUgMTA5IDcwIDgzIDI5IDUyIDY3IDE1MyA2NSAxMDkgOTAgMTAxIDEzMiAzMiAyIDE0NSAyNzYgNDMgMzMgMTYwIDI0NiAKKzIzIDI1OSBeCis2MDAgMSA4NyAxMTkgMTQ4IDEzMiAyNjAgMTQ0IDE4OSAxNjQgMTAgMjQ3IDM4IDE2NyA1NSAyMjIgNDQgMTI1IDYgNzIgMjExIDEzIAorMjI2IDE1MyA5MiA3OSAyNDYgMjM0IDI2IDYgMjUgMjIxIDE5MyAyNzMgMjU2IDIwMSAyMTIgMzAgMjI4IDIgMTk1IDI1NCAyMzkgOTkgCisxMTQgMjggMzQgMTU4IDk5IDE2NyAxNjggMjMyIDIyNCAxNzIgMTA5IDE4MSA2NSAyMzYgMjIwIDEyOSAyIDI5IDI2NCAxNDAgMTQ2IDU3IAorMTM3IDE2NyAxMDIgOTMgMTQzIDc4IDE4MiAyNDIgNzggNjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDY2IDc0IDczIDI3NSA1IDE3NCA5MCAKKzE2NCAxMjMgMjU3IDIxOCAyMTQgMTU4IDUyIDE3NyA2OSA0OCAyIDI0MiAxMjUgNTkgNTIgMTEgNzkgMjAgMjE0IDEwNSA3MiAyNTggMyAKKzQ2IDEwNiAyNjggMjQ5IDExMyAxMSAzMiAzMCAxMTUgMjcxIDE1IDg4IDEzNiAyNjkgMTAwIDI0NCA0MCAxODIgMjkgOTggMTUwIDQ3IAorMTA0IDI0MCAyNzYgMjM1IDE1NiAxMzcgNTQgOTIgMTkyIDk2IDEzNSA3MyAxMDkgMTM0IDc1IDEzNyAyNjcgMjMyIDExMSAxNjIgMjA4IAorMTM0IDEyMiAxMjcgODcgMTg1IDggNTMgNzUgMTkwIDEyOCAxNTEgMTc3IDIzNSAyNjkgMTQ3IDIzNCAxMzkgMTYgMjA1IDI2OCAxNyAKKzEwMyAxMTAgMTQ1IDIwNiA2IDEzOCAyMzEgOTQgNDEgODAgMzEgNjYgMjUzIDIyMiAyNTcgMjY1IDIwNCAxMzggNSA3NCAyMzkgMTQ2IAorMTA0IDggMjY2IDU1IDI2OSAzNCAyMjQgMjM4IDI0OCAxMDIgMTU5IDMgMTU5IDExNiAxNjkgMTcgNTYgMTIwIDE2NSAyNTMgMTA5IDI0NyAKKzg1IDE1NyAzNSA1NiAyMjAgMTYgMTUyIDEyOCAyMTcgMzcgMzcgMjAzIDc0IDE3MyAxMjYgMjMgMTkzIDYwIDExNiAxMjIgMjcgMjM2IDcgCisyNjggODMgMjQyIDE5MSA3OSAxMzMgMjI0IDEyNSAyMzggODIgMTEyIDYwIDUwIDI2MiAyMjUgMjMgMjQwIDUwIDk2IDIzNSAyMDMgMTI3IAorMTUzIDQ1IDg5IDE0NyAxMjEgMTI5IDExNSAzOSAxNjUgMTg3IDI0OSAxNjYgMTUxIDExMSA5NiAxODggNTMgMjggMjAwIDE0OCAxOTggMSAKKzY1IDEyMyA5MSAyMjggMTE1IDIwNSAxNTUgNyAyMDIgNjMgNDIgOTcgMTUyIDE5NCAyMzcgMTE4IDI1MCAxMzAgMTMyIDE2MCAxNCAxMSAKKzE0NSA0MCAxNiAzOSAxMTggMzcgMTUwIDIxMyA5NCA2MCAyMjkgMTMyIDQ3IDQgMTEwIDk4IDIxNiAxODYgMTg1IDU1IDQzIDE3NCAyNCAKKzI1IDQyIDQ0IDEyIDI3NSAxNzEgNDUgMTg5IDExNyAyMCAxNDggODUgMjcwIDE2NCA3NiAyNjcgMTE5IDEwMSAyNjEgMTYxIDMxIDEzIAorMjczIDE0MyAxOTEgMzIgMTQzIDEyNSAxNzIgNjIgMzEgMjQ1IDEyMyA0NCAyMzggMTM1IDI1MiAyNTggMTE2IDU2IDcgMzYgNzMgNjIgCisxNDQgMjU1IDI0IDkxIDYyIDI0NCAxMDYgMjAyIDExMCAzMiA3NyAxMDUgOTEgMTI4IDI2NCAyNyAxMzYgMzcgMjUwIDY0IDI3MiA3OSAKKzE5OSA4NCAyMDYgNTMgMTI4IDUxIDQ3IDIxNyAyNTAgMTcgMyAyNTkgMjQ2IDE4NyAzNiAxODYgNzIgNDUgMjMgMTI3IDIwMCAxOTUgCisxODggMTAwIDE4IDIwIDI2MSA5NSAxNzEgMjExIDE3OSA5NyAyNTIgNDUgMjU1IDEzNyAxMDEgODIgMTIgMjA5IDMyIDI0MyAyNTUgNzEgCis4MSAxNjEgNzggMyA5MyAyNTYgODggODMgMTAgMTgxIDE3OCA4NiAxMjEgMTYgMTA1IDEzOCAxMTggODQgMTQwIDMzIDIwNyAxMTcgMTIwIAorMjc4IDI2MyAxMCAxNSAxODggMjY2IDE2OCAxMTkgMjE0IDI3MSA2MiA3OCAxMTYgMTAzIDE1NyAxMzUgMjYgMTE5IDM1IDEyMiA4MCA5NyAKKzg2IDU1IDE1NiAyNCA0NCAxOTEgMTQ1IDE1MyAyNiAyMTkgMTY1IDE0MCA5OSA2NyAzOCA1NCAyMDUgNDIgMjc2IDIyIDE3NiAyMTggCisxNDggMTkgMTMxIDI0MyAxNDIgNjEgMTgwIDExNCAyNTQgMTczIDIzOSAzMyA5NCAxMDcgMjE5IDIzMSAxNjAgMTgwIDEgMjQ0IDI3MiAKKzE5MiAyMDkgMjY0IDI1MyAxNTYgMjM3IDE4NCAyNzAgMjExIDIyNiA4NyA3MiAxNTggMTUyIDI4IDg3IDE5IDE4IDIzMyAyNDEgMTQgNzcgCis1IDEyMSAyMjkgMjQ1IDU3IDE4NCAxNTcgMjAxIDQ2IDQwIDEyOSA0OSAxOSA4NCA5MyA0MyAxMDggNCAyMjMgMTA4IDExNyAyMzMgOSA0IAorNTcgMTE4IDE4IDEyMCAxMTIgMTEzIDE5MCAxODEgMTIgOTYgMjIgNjMgMjA4IDI0NyAyNTEgMjggMTM0IDkgMTE3IDE4NiAxMzggMTg0IAorMjIzIDYxIDEyNyAyMTYgXgorNTkwIDEgMTc1IDEwNyA2IDI0NyA4MSAxMTQgMjA3IDE3OSAxMzQgNzQgMTk1IDIxMiA3MyAxNzMgMTUwIDE1MiA2NyAxOTAgMTEgOTggCis0NCAxOTIgODAgMjIxIDE0NiAyNzkgMTUzIDg4IDM0IDEzOSA3OCAyMjEgMTg5IDIyOCAyNCA0NSAxMjggOTAgMjczIDg0IDUxIDExMSAKKzc1IDQ2IDEwNyA0OSAxOTYgMjMzIDcxIDIwIDI1NyA0OCA2NCA1NyA5NSAyNzggMTc0IDEyOSAxMTEgMjcxIDU4IDMxIDcgMjI2IDE5NCAKKzM3IDIyOSA0NSAxNzAgMjU2IDE5NyAxNjkgODEgNzIgNDEgMjU1IDE3NiA0NCAyMzQgOTIgMTQ1IDEwNCAxNTUgMTE0IDIwOCAyNDMgCisyMDggMjAwIDI1OSA0OCAyMSAxMDggMjI0IDQwIDgwIDE3OCAxOTcgMTI3IDE5NiAxNDggMjM3IDIyNSAyMTUgNzggMjUgMjMgMjMgNjYgCisxNSAxNjcgMTI0IDY0IDE1IDIxMCA3MyAyMTYgOTkgMjMgMTUxIDEzMCAyNDMgMTY2IDM0IDU0IDI0NCAxNDUgMTQ3IDI1OCAxMTIgMTEgCis1NiAxNTkgMjY4IDEyMiA2NCA1OCAxNTkgMjI1IDE5IDE5MyAxMDEgMjE5IDI3NCAxMDUgNDkgMjM5IDU1IDIyMyAxMDQgNzAgMTI2IAorMTMyIDIwMSAyMzggMTYxIDIyNSAxMzAgOTAgMjMwIDI2MiA1MyAyNyAxMzUgOTUgMzkgNTkgNTMgNjkgMTQ3IDE5IDI3OCAyMTYgMTQgCiszNSA3NSA4OCAyNzMgMTI3IDE1NCAyNjMgMzIgMjY3IDE4NSAxMTcgNTkgOTUgMjM1IDcxIDI1OCAyNyAxNzcgMjYxIDExNyAxNDQgODMgCiszMCAyNjcgMjI4IDY2IDIxMSA1MiA0OCAyMiAxNzIgMTcxIDM5IDE0NCAxNjggMTQ1IDYyIDE0MyAzNiAyNTAgODYgMTIwIDIzNCA1MCAKKzEzMyAxODAgNzAgODQgMjQ3IDI3NyAyODAgMTMxIDEzNyAxMCAxNjIgMTYxIDE0MCAxNDIgMTQgMTg4IDExIDE0MSAyNzQgNjMgMTY0IAorMzQgOTcgMTkzIDE2IDEwNCAxOTggNjMgNzkgMjAwIDIxIDE1MSAxNzMgMTkyIDM3IDI3MiAxNDggNDEgNTkgMTAgMTIwIDE0OSAyMTYgCis1NyAxMzggMjI3IDQ1IDIxMyAyMDUgNjggMTI2IDE3NSAxNTAgMTA5IDExOCAzOCAyMDggMTU4IDkzIDEyNCAyMTcgNzggMjYzIDc0IAorMTUyIDEwOSA3NSA4OSA1NiAyMDEgMTUzIDQ2IDE0OSAyMTUgMTIwIDE5MSAxMDEgMjYyIDk2IDI1NyAxMzMgNTIgMTMzIDEzNyAyNDggCisyMTMgOSAxODMgMjAyIDIxNyAyNzQgMTQ4IDI3OSAxMTAgMTM5IDE2MyA1NSAyNjUgMjcwIDI3NSA4NCA4IDE2MiAyMDQgODkgMTMgMjUyIAorMSA4OSAyMDkgMTM3IDIwNiA0NyA4NSA5OCAxNzIgMjU2IDE1NCAyMjAgMjEwIDExNSAxMDEgMjMgMTA4IDE4MSA5MSAyMDkgOTQgMTAzIAorMTc2IDEgNCA5NCA2MSAxMCA3NyA0NiA2NCAxMDAgNDQgMTQ5IDI1OCA2OSA2MiAxODUgMjAyIDE3NCAxNzEgMjc3IDE5NSAxNiA2MSAKKzI0OSAxOTIgMTIyIDEwNiA3MCA4MyAyOSA0OSA2NyAxNDcgNjIgMTAwIDg3IDk4IDEyOSAyNiAyIDEzNiAyNzAgMzcgMzMgMTYwIDI0NiAKKzE3IDQwIDgxIDExNSAxNDQgMTI2IDI2MCAxMzggMTg1IDE2MCA4IDI0NyAzOCAxNjUgNTUgMjIyIDQwIDEyMyA2OCAyMTEgOSAyMjYgCisxNTEgODggNzcgMjQyIDIzMCAyNCAyIDI1IDIxOSAxODkgMjcxIDI1NCAxOTcgMjEyIDMwIDIyNCAyNzkgMTk1IDI1NCAyMzkgOTcgMTA4IAorMjggMjggMTU2IDkzIDE2NyAxNjYgMjMwIDIyMCAxNjggMTAzIDE3NyA2NSAyMzIgMjIwIDEyNSAyNSAyNjIgMTM4IDE0MiA1NyAxMzcgCisxNjMgOTggODcgMTQxIDc4IDE3OCAyNDAgNzYgNjcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDYwIDc0IDY3IDI3NSAyODAgMTc0IDg2IAorMTYyIDExOSAyNTUgMjE4IDIxMCAxNTggNTAgMTc1IDY1IDI3NSA0MiAyNzcgMjM4IDExOSA1OSA1MiA1IDczIDIwIDIxNCA5OSA2NiAKKzI1NCAxIDQ2IDEwNiAyNjYgMjQ5IDEwNyA3IDMwIDI4IDExMyAyNzEgMTUgODIgMTM2IDI2OSAxMDAgMjQwIDM0IDE4MiAyNyA5MiAxNDYgCis0MSAxMDIgMjQwIDI3MiAyMzMgMTU2IDEzNSA1MiA5MCAxODggOTYgMTI5IDY5IDEwNSAxMzQgNzMgMTMxIDI2NSAyMjggMTA5IDE2MCAKKzIwNCAxMzIgMTE2IDEyMyA4NSAxODMgNiA1MSA2OSAxOTAgMTIyIDE0OSAxNzMgMjM1IDI2NyAxNDMgMjMyIDEzNSAxMCAyMDUgMjY0IAorMTEgOTkgMTA4IDEzOSAyMDYgNCAxMzYgMjI3IDg4IDM1IDc2IDI1IDY2IDI1MyAyMTggMjUzIDI2MSAyMDIgMTMyIDUgNzIgMjM3IDE0MCAKKzIwMyBeCis2MjAgMCAyNzkgMjYyIDUxIDI2MSAzMCAyMjQgMjM0IDI0NCAxMDIgMTUxIDMgMTU1IDExMiAxNjEgOSA1NiAxMTIgMTY1IDI0OSAxMDUgCisyNDMgNzcgMTU3IDIzIDQ0IDIxNiAxMiAxNDAgMTI0IDIxNyAzMyAyOSAyMDMgNjIgMTY1IDEyMiAxOSAxOTMgNTYgMTE2IDEyMiAxNSAKKzIzNiA3IDI2OCA3NSAyNDIgMTgzIDcxIDEyOSAyMjAgMTI1IDIzOCA3MCAxMDggNDggNDYgMjU4IDIyMSAxNSAyMzIgNTAgODQgMjI3IAorMTk1IDEyNyAxNTMgNDUgODEgMTM1IDEyMSAxMjUgMTA3IDI3IDE1NyAxNzkgMjQxIDE2NiAxMzkgOTkgODggMTg4IDUzIDI0IDE5NiAKKzE0OCAxOTAgMjcyIDYxIDExOSA3OSAyMjQgMTAzIDIwMSAxNTEgMjgyIDE5OCA2MyAzMCA5NyAxNDggMTk0IDIyOSAxMTAgMjUwIDEyNiAKKzEzMiAxNTYgMiA3IDEzNyAzMiA4IDMxIDExOCAzNyAxMzggMjA5IDk0IDYwIDIyNSAxMjggNDcgMjc5IDExMCA5NCAyMTIgMTgyIDE3NyAKKzQzIDQzIDE2NiAxMiAxMyAzOCAzMiAxMiAyNzEgMTY3IDMzIDE4NSAxMTcgMTIgMTQ0IDgxIDI2NiAxNjQgNzYgMjU5IDExNSAxMDEgCisyNjEgMTU3IDI3IDEgMjY1IDE0MyAxODcgMzIgMTM1IDExNyAxNjggNTggMzEgMjQ1IDEyMyA0MCAyMzAgMTM1IDI0NCAyNTQgMTA4IDUyIAorMyAyNCA2OSA2MiAxNDAgMjUxIDIwIDgzIDUwIDI0NCA5OCAxOTQgMTAyIDI0IDY1IDEwNSA5MSAxMjAgMjU2IDI3IDEzMiAyNSAyNDIgCis1NiAyNjggNzkgMTk5IDg0IDIwMiA0MSAxMjggNDMgMzkgMjA5IDI0NiAxNyAyNzQgMjU5IDI0MiAxODcgMjggMTc4IDY4IDM3IDExIAorMTIzIDE5MiAxODcgMTg0IDkyIDE4IDE2IDI1MyA4NyAxNjMgMjA3IDE3OSA4NSAyNTIgNDEgMjU1IDEyOSA4OSA4MiA0IDIwMSAyMCAKKzIzOSAyNDcgNTkgNzcgMTUzIDY2IDI3OCA4NSAyNDggODQgNzEgMjgxIDE3NyAxNzQgODYgMTE3IDE2IDEwMSAxMzAgMTE0IDc2IDEzMiAKKzI5IDE5OSAxMDUgMTE2IDI3NCAyNTUgMiAzIDE4MCAyNjYgMTYwIDExOSAyMTAgMjY3IDU0IDcwIDEwNCA5MSAxNDUgMTI3IDI2IDEwNyAKKzMxIDExNCA4MCA4OSA3OCA0NyAxNTIgMjQgNDQgMTkxIDE0MSAxNDEgMTQgMjExIDE2MSAxNDAgOTkgNjMgMzQgNTQgMTk3IDQyIDI3NiAKKzE4IDE2OCAyMTAgMTM2IDExIDExOSAyMzUgMTM4IDUzIDE4MCAxMTAgMjQ2IDE2OSAyMzEgMjUgOTAgOTkgMjE5IDIzMSAxNTIgMTc2IDEgCisyNDAgMjcyIDE4OCAyMDUgMjY0IDI0NSAxNDQgMjM3IDE4MCAyNjIgMjAzIDIxOCA3OSA3MiAxNDYgMTUyIDIwIDg3IDcgMTAgMjI5IAorMjQxIDEwIDc3IDEgMTA5IDIyOSAyMzcgNTMgMTc2IDE1MyAxOTcgMzggMzYgMTE3IDM3IDE1IDgwIDkzIDM1IDk2IDIxOSAxMDAgMTA5IAorMjI1IDI4MCA0IDQ1IDEwNiA2IDEyMCAxMDAgMTEzIDE4MiAxODEgOTIgMTQgNTkgMjA0IDIzOSAyNTEgMTYgMTI2IDEgMTEzIDE4NiAKKzEzOCAxODQgMjIzIDYxIDExNSAxMjIgMTc1IDEwNyA2IDI0MyA4MSAxMTQgMjA3IDE3NSAxMjggNjggMTkzIDIwOCA3MyAxNzEgMTQ2IAorMTQ4IDYzIDE4NiAxMSA5OCAzOCAxODggNzQgMjIxIDE0NiAyNzUgMTQ5IDg4IDMyIDEzOSA3NCAyMTcgMTg5IDIyNiAxOCA0MSAxMjQgCis4NiAyNzMgNzggNTEgMTA5IDczIDQwIDEwMyA0OSAxOTQgMjMzIDY3IDE2IDI1NyA0NCA2NCA1NSA5MSAyNzYgMTcwIDEyNSAxMTEgMjY3IAorNTggMjcgNSAyMjIgMTkyIDM1IDIyNyA0MyAxNzAgMjUyIDE5NyAxNjkgNzkgNjggNDEgMjUxIDE3MiA0MCAyMzQgOTIgMTQ1IDEwMiAKKzE1NSAxMDggMjA0IDI0MyAyMDggMjAwIDI1NyA0OCAyMSAxMDQgMjIyIDQwIDc4IDE3OCAxOTUgMTIzIDE5NiAxNDQgMjMzIDIyMyAyMTMgCis3MiAyMyAyMyAxOSA2MiAxMyAxNjUgMTE4IDYyIDkgMjA4IDY5IDIxNCA5NyAxNyAxNTEgMTMwIDI0MSAxNjIgMzQgNTAgMjQwIDE0MSAKKzE0NSAyNTQgMTEyIDkgNTIgMTU1IDI2NCAxMTggNTggNTIgMTU5IDIyMSAxOSAxODkgOTkgMjE1IDI3NCAxMDMgNDUgMjM3IDQ5IDIxOSAKKzEwNCA2NiAxMjYgMTI4IDE5OSAyMzYgMTU5IDIyNSAxMjQgOTAgMjMwIDI2MiA0NyAyMSAxMjkgOTMgMzkgNTMgNDkgNjcgMTQ3IDE3IAorMjc4IDIxNiA4IDM1IDc1IDg2IDI2OSAxMjEgMTUwIDI2MSAyNiAyNjcgMTg1IDExMyA1NSA5NSAyMzMgNzEgMjU2IDIzIDE3NSAyNTkgCisxMTEgMTQ0IDc3IDI2IDI2MyAyMjggNjQgMjA3IDQ4IDQyIDE4IDE3MiAxNjcgMzcgMTQyIDE2NiAxNDMgNTYgMTM3IDM2IDI0OCA4MCAKKzExNCAyMzIgNDYgMTI3IDI1NyBeCis2MDUgMSA1OCA3NiAyNDMgMjczIDI4MCAxMzEgMTI1IDYgMTYyIDE2MSAxMzIgMTQyIDE0IDE4NCAzIDE0MSAyNzAgNTEgMTYwIDI2IDg5IAorMTg5IDQgOTIgMTk4IDU1IDY3IDE5MiAxMyAxNDMgMTczIDE5MiAyNSAyNjggMTM2IDM3IDU1IDIgMTEyIDEzNyAyMDggNDUgMTMwIDIyNyAKKzMzIDIxMyAyMDEgNjQgMTE4IDE2NyAxNTAgMTAxIDEwNiAzMCAyMDQgMTUwIDg5IDEyNCAyMDkgNzQgMjYzIDcwIDE0OCAxMDkgNjMgNzcgCis1MiAyMDEgMTQxIDM4IDE0OSAyMTUgMTE2IDE4NyA4OSAyNTQgODQgMjUzIDEzMyA0MCAxMjkgMTMzIDI0OCAyMDkgOSAxODMgMTk0IAorMjEzIDI2NiAxNDQgMjc5IDEwMiAxMzUgMTYzIDQ3IDI2NSAyNzAgMjcxIDgwIDggMTU0IDIwNCA4NSA5IDI0OCAyNzQgODkgMjAxIDEyOSAKKzE5OCA0MyA4NSA4NiAxNjggMjU2IDE1NCAyMTYgMjEwIDExNSA5MyAxOSAxMDggMTc3IDg3IDIwOSA4NiAxMDMgMTc2IDI3OCAyODEgODIgCis1MyAxMCA2OSA0MiA1NiA5NiA0MCAxNDEgMjU4IDY5IDU0IDE4MSAyMDIgMTcwIDE3MSAyNzcgMTg3IDEyIDQ5IDI0NSAxODggMTE4IAorMTAyIDcwIDgzIDI5IDQ1IDY3IDEzOSA1OCA4OCA4MyA5NCAxMjUgMTggMiAxMjQgMjYyIDI5IDMzIDE2MCAyNDYgOSAyOCA2OSAxMDcgCisxMzYgMTE0IDI2MCAxMjYgMTc3IDE1MiA0IDI0NyAzOCAxNjEgNTUgMjIyIDMyIDExOSAyNzMgNjAgMjExIDEgMjI2IDE0NyA4MCA3MyAKKzIzNCAyMjIgMjAgMjc5IDI1IDIxNSAxODEgMjY3IDI1MCAxODkgMjEyIDMwIDIxNiAyNzUgMTk1IDI1NCAyMzkgOTMgOTYgMjggMTYgCisxNTIgODEgMTY3IDE2MiAyMjYgMjEyIDE2MCA5MSAxNjkgNjUgMjI0IDIyMCAxMTcgMjgxIDE3IDI1OCAxMzQgMTM0IDU3IDEzNyAxNTUgCis5MCA3NSAxMzcgNzggMTcwIDIzNiA3MiA2MyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNDggNzQgNTUgMjc1IDI3MiAxNzQgNzggMTU4IAorMTExIDI1MSAyMTggMjAyIDE1OCA0NiAxNzEgNTcgMjY3IDMwIDI2OSAyMzAgMTA3IDU5IDUyIDI3OCA2MSAyMCAyMTQgODcgNTQgMjQ2IAorMjgyIDQ2IDEwNiAyNjIgMjQ5IDk1IDI4NCAyNiAyNCAxMDkgMjcxIDE1IDcwIDEzNiAyNjkgMTAwIDIzMiAyMiAxODIgMjMgODAgMTM4IAorMjkgOTggMjQwIDI2NCAyMjkgMTU2IDEzMSA0OCA4NiAxODAgOTYgMTE3IDYxIDk3IDEzNCA2OSAxMTkgMjYxIDIyMCAxMDUgMTU2IDE5NiAKKzEyOCAxMDQgMTE1IDgxIDE3OSAyIDQ3IDU3IDE5MCAxMTAgMTQ1IDE2NSAyMzUgMjYzIDEzNSAyMjggMTI3IDI4MyAyMDUgMjU2IDI4NCAKKzkxIDEwNCAxMjcgMjA2IDEzMiAyMTkgNzYgMjMgNjggMTMgNjYgMjUzIDIxMCAyNDUgMjUzIDE5OCAxMjAgNSA2OCAyMzMgMTI4IDkyIAorMjc1IDI2MCA0OSAyNTcgMjggMjI0IDIzMiAyNDIgMTAyIDE0NyAzIDE1MyAxMTAgMTU3IDUgNTYgMTA4IDE2NSAyNDcgMTAzIDI0MSA3MyAKKzE1NyAxNyAzOCAyMTQgMTAgMTM0IDEyMiAyMTcgMzEgMjUgMjAzIDU2IDE2MSAxMjAgMTcgMTkzIDU0IDExNiAxMjIgOSAyMzYgNyAyNjggCis3MSAyNDIgMTc5IDY3IDEyNyAyMTggMTI1IDIzOCA2NCAxMDYgNDIgNDQgMjU2IDIxOSAxMSAyMjggNTAgNzggMjIzIDE5MSAxMjcgMTUzIAorNDUgNzcgMTI5IDEyMSAxMjMgMTAzIDIxIDE1MyAxNzUgMjM3IDE2NiAxMzMgOTMgODQgMTg4IDUzIDIyIDE5NCAxNDggMTg2IDI2OCA1OSAKKzExNyA3MyAyMjIgOTcgMTk5IDE0OSAyODAgMTk2IDYzIDI0IDk3IDE0NiAxOTQgMjI1IDEwNiAyNTAgMTI0IDEzMiAxNTQgMjgxIDUgCisxMzMgMjggNCAyNyAxMTggMzcgMTMyIDIwNyA5NCA2MCAyMjMgMTI2IDQ3IDI3NyAxMTAgOTIgMjEwIDE4MCAxNzMgMzcgNDMgMTYyIDYgCis3IDM2IDI2IDEyIDI2OSAxNjUgMjcgMTgzIDExNyA4IDE0MiA3OSAyNjQgMTY0IDc2IDI1NSAxMTMgMTAxIDI2MSAxNTUgMjUgMjgwIAorMjYxIDE0MyAxODUgMzIgMTMxIDExMyAxNjYgNTYgMzEgMjQ1IDEyMyAzOCAyMjYgMTM1IDI0MCAyNTIgMTA0IDUwIDEgMTggNjcgNjIgCisxMzggMjQ5IDE4IDc5IDQ0IDI0NCA5NCAxOTAgOTggMjAgNTkgMTA1IDkxIDExNiAyNTIgMjcgMTMwIDE5IDIzOCA1MiAyNjYgNzkgMTk5IAorODQgMjAwIDM1IDEyOCAzOSAzNSAyMDUgMjQ0IDE3IDI3MCAyNTkgMjQwIDE4NyAyNCAxNzQgNjYgMzMgNSAxMjEgMTg4IDE4MyAxODIgCis4OCAxOCAxNCAyNDkgODMgMTU5IDIwNSAxNzkgNzkgMjUyIDE4NiBeCis2MTUgMCAyNTUgMTIxIDc3IDgyIDI4MyAxOTMgOCAyMzUgMjM5IDQ3IDczIDE0NSA1NCAyNzQgNzcgMjQwIDgwIDU5IDI3MyAxNzMgMTcwIAorODYgMTEzIDE2IDk3IDEyMiAxMTAgNjggMTI0IDI1IDE5MSA5MyAxMTIgMjcwIDI0NyAyODEgMjc4IDE3MiAyNjYgMTUyIDExOSAyMDYgCisyNjMgNDYgNjIgOTIgNzkgMTMzIDExOSAyNiA5NSAyNyAxMDYgODAgODEgNzAgMzkgMTQ4IDI0IDQ0IDE5MSAxMzcgMTI5IDIgMjAzIAorMTU3IDE0MCA5OSA1OSAzMCA1NCAxODkgNDIgMjc2IDE0IDE2MCAyMDIgMTI0IDMgMTA3IDIyNyAxMzQgNDUgMTgwIDEwNiAyMzggMTY1IAorMjIzIDE3IDg2IDkxIDIxOSAyMzEgMTQ0IDE3MiAxIDIzNiAyNzIgMTg0IDIwMSAyNjQgMjM3IDEzMiAyMzcgMTc2IDI1NCAxOTUgMjEwIAorNzEgNzIgMTM0IDE1MiAxMiA4NyAyODIgMiAyMjUgMjQxIDYgNzcgMjg0IDk3IDIyOSAyMjkgNDkgMTY4IDE0OSAxOTMgMzAgMzIgMTA1IAorMjUgMTEgNzYgOTMgMjcgODQgMjgzIDIxNSA5MiAxMDEgMjE3IDI3MiA0IDMzIDk0IDI4MSAxMjAgODggMTEzIDE3NCAxODEgMjc1IDg4IAorNiA1NSAyMDAgMjMxIDI1MSA0IDExOCAyODAgMTA5IDE4NiAxMzggMTg0IDIyMyA2MSAxMDMgMTEwIDE3NSAxMDcgNiAyMzUgODEgMTE0IAorMjA3IDE2NyAxMTYgNTYgMTg5IDIwMCA3MyAxNjcgMTM4IDE0MCA1NSAxNzggMTEgOTggMjYgMTgwIDYyIDIyMSAxNDYgMjY3IDE0MSA4OCAKKzI4IDEzOSA2NiAyMDkgMTg5IDIyMiA2IDMzIDExNiA3OCAyNzMgNjYgNTEgMTA1IDY5IDI4IDk1IDQ5IDE5MCAyMzMgNTkgOCAyNTcgMzYgCis2NCA1MSA4MyAyNzIgMTYyIDExNyAxMTEgMjU5IDU4IDE5IDEgMjE0IDE4OCAzMSAyMjMgMzkgMTcwIDI0NCAxOTcgMTY5IDc1IDYwIDQxIAorMjQzIDE2NCAzMiAyMzQgOTIgMTQ1IDk4IDE1NSA5NiAxOTYgMjQzIDIwOCAyMDAgMjUzIDQ4IDIxIDk2IDIxOCA0MCA3NCAxNzggMTkxIAorMTE1IDE5NiAxMzYgMjI1IDIxOSAyMDkgNjAgMTkgMjMgMTEgNTQgOSAxNjEgMTA2IDU4IDI4NCAyMDQgNjEgMjEwIDkzIDUgMTUxIDEzMCAKKzIzNyAxNTQgMzQgNDIgMjMyIDEzMyAxNDEgMjQ2IDExMiA1IDQ0IDE0NyAyNTYgMTEwIDQ2IDQwIDE1OSAyMTMgMTkgMTgxIDk1IDIwNyAKKzI3NCA5OSAzNyAyMzMgMzcgMjExIDEwNCA1OCAxMjYgMTIwIDE5NSAyMzIgMTU1IDIyNSAxMTIgOTAgMjMwIDI2MiAzNSA5IDExNyA4OSAKKzM5IDQxIDQxIDYzIDE0NyAxMyAyNzggMjE2IDI4MyAzNSA3NSA4MiAyNjEgMTA5IDE0MiAyNTcgMTQgMjY3IDE4NSAxMDUgNDcgOTUgCisyMjkgNzEgMjUyIDE1IDE3MSAyNTUgOTkgMTQ0IDY1IDE4IDI1NSAyMjggNjAgMTk5IDQwIDMwIDEwIDE3MiAxNTkgMzMgMTM4IDE2MiAKKzEzOSA0NCAxMjUgMzYgMjQ0IDY4IDEwMiAyMjggMzggMTE1IDE3NCA1MiA3MiAyNDEgMjcxIDI4MCAxMzEgMTE5IDQgMTYyIDE2MSAxMjggCisxNDIgMTQgMTgyIDI4NiAxNDEgMjY4IDQ1IDE1OCAyMiA4NSAxODcgMjg1IDg2IDE5OCA1MSA2MSAxODggOSAxMzkgMTczIDE5MiAxOSAKKzI2NiAxMzAgMzUgNTMgMjg1IDEwOCAxMzEgMjA0IDM5IDEyNiAyMjcgMjcgMjEzIDE5OSA2MiAxMTQgMTYzIDE1MCA5NyAxMDAgMjYgCisyMDIgMTQ2IDg3IDEyNCAyMDUgNzIgMjYzIDY4IDE0NiAxMDkgNTcgNzEgNTAgMjAxIDEzNSAzNCAxNDkgMjE1IDExNCAxODUgODMgMjUwIAorNzggMjUxIDEzMyAzNCAxMjcgMTMxIDI0OCAyMDcgOSAxODMgMTkwIDIxMSAyNjIgMTQyIDI3OSA5OCAxMzMgMTYzIDQzIDI2NSAyNzAgCisyNjkgNzggOCAxNTAgMjA0IDgzIDcgMjQ2IDI3MCA4OSAxOTcgMTI1IDE5NCA0MSA4NSA4MCAxNjYgMjU2IDE1NCAyMTQgMjEwIDExNSAKKzg5IDE3IDEwOCAxNzUgODUgMjA5IDgyIDEwMyAxNzYgMjc2IDI3OSA3NiA0OSAxMCA2NSA0MCA1MiA5NCAzOCAxMzcgMjU4IDY5IDUwIAorMTc5IDIwMiAxNjggMTcxIDI3NyAxODMgMTAgNDMgMjQzIDE4NiAxMTYgMTAwIDcwIDgzIDI5IDQzIDY3IDEzNSA1NiA4MiA4MSA5MiAKKzEyMyAxNCAyIDExOCAyNTggMjUgMzMgMTYwIDI0NiA1IDIyIDYzIDEwMyAxMzIgMTA4IDI2MCAxMjAgMTczIDE0OCAyIDI0NyAzOCAxNTkgCis1NSAyMjIgMjggMTE3IDI2OSA1NiAyMTEgMjg0IDIyNiAxNDUgNzYgNzEgMjMwIDIxOCAxOCAyNzcgMjUgMjEzIDE3NyAyNjUgMjQ4IAorMTg1IDIxMiAzMCAyMTIgMjczIDE5NSAyNTQgMjM5IDkxIDkwIDI4IDEwIDE1MCA3NSAxNjcgMTYwIDIyNCAxNzUgXgorNjEzIDAgMTUyIDc5IDE2MSA2NSAyMTYgMjIwIDEwOSAyODEgOSAyNTQgMTMwIDEyNiA1NyAxMzcgMTQ3IDgyIDYzIDEzMyA3OCAxNjIgCisyMzIgNjggNTkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDM2IDc0IDQzIDI3NSAyNjQgMTc0IDcwIDE1NCAxMDMgMjQ3IDIxOCAxOTQgMTU4IAorNDIgMTY3IDQ5IDI1OSAxOCAyNjEgMjIyIDk1IDU5IDUyIDI3MCA0OSAyMCAyMTQgNzUgNDIgMjM4IDI4MiA0NiAxMDYgMjU4IDI0OSA4MyAKKzI4MCAyMiAyMCAxMDUgMjcxIDE1IDU4IDEzNiAyNjkgMTAwIDIyNCAxMCAxODIgMTkgNjggMTMwIDE3IDk0IDI0MCAyNTYgMjI1IDE1NiAKKzEyNyA0NCA4MiAxNzIgOTYgMTA1IDUzIDg5IDEzNCA2NSAxMDcgMjU3IDIxMiAxMDEgMTUyIDE4OCAxMjQgOTIgMTA3IDc3IDE3NSAyODcgCis0MyA0NSAxOTAgOTggMTQxIDE1NyAyMzUgMjU5IDEyNyAyMjQgMTE5IDI3NSAyMDUgMjQ4IDI3NiA4MyAxMDAgMTE1IDIwNiAyODUgMTI4IAorMjExIDY0IDExIDYwIDEgNjYgMjUzIDIwMiAyMzcgMjQ1IDE5NCAxMDggNSA2NCAyMjkgMTE2IDg0IDI2NyAyNTYgNDUgMjQ5IDI0IDIyNCAKKzIyOCAyMzggMTAyIDEzOSAzIDE0OSAxMDYgMTQ5IDI4NiA1NiAxMDAgMTY1IDI0MyA5OSAyMzcgNjUgMTU3IDUgMjYgMjEwIDYgMTIyIAorMTE4IDIxNyAyNyAxNyAyMDMgNDQgMTUzIDExNiAxMyAxOTMgNTAgMTE2IDEyMiAyODYgMjM2IDcgMjY4IDYzIDI0MiAxNzEgNTkgMTIzIAorMjE0IDEyNSAyMzggNTIgMTAyIDMwIDQwIDI1MiAyMTUgMyAyMjAgNTAgNjYgMjE1IDE4MyAxMjcgMTUzIDQ1IDY5IDExNyAxMjEgMTE5IAorOTUgOSAxNDUgMTY3IDIyOSAxNjYgMTIxIDgxIDc2IDE4OCA1MyAxOCAxOTAgMTQ4IDE3OCAyNjAgNTUgMTEzIDYxIDIxOCA4NSAxOTUgCisxNDUgMjc2IDE5MiA2MyAxMiA5NyAxNDIgMTk0IDIxNyA5OCAyNTAgMTIwIDEzMiAxNTAgMjczIDEgMTI1IDIwIDI4NSAxOSAxMTggMzcgCisxMjAgMjAzIDk0IDYwIDIxOSAxMjIgNDcgMjczIDExMCA4OCAyMDYgMTc2IDE2NSAyNSA0MyAxNTQgMjgzIDI4NCAzMiAxNCAxMiAyNjUgCisxNjEgMTUgMTc5IDExNyAxMzggNzUgMjYwIDE2NCA3NiAyNDcgMTA5IDEwMSAyNjEgMTUxIDIxIDI3MiAyNTMgMTQzIDE4MSAzMiAxMjMgCisxMDUgMTYyIDUyIDMxIDI0NSAxMjMgMzQgMjE4IDEzNSAyMzIgMjQ4IDk2IDQ2IDI4NiA2IDYzIDYyIDEzNCAyNDUgMTQgNzEgMzIgMjQ0IAorODYgMTgyIDkwIDEyIDQ3IDEwNSA5MSAxMDggMjQ0IDI3IDEyNiA3IDIzMCA0NCAyNjIgNzkgMTk5IDg0IDE5NiAyMyAxMjggMzEgMjcgCisxOTcgMjQwIDE3IDI2MiAyNTkgMjM2IDE4NyAxNiAxNjYgNjIgMjUgMjgyIDExNyAxODAgMTc1IDE3OCA4MCAxOCAxMCAyNDEgNzUgMTUxIAorMjAxIDE3OSA2NyAyNTIgMzUgMjU1IDExNyA3MSA4MiAyODEgMTg5IDIgMjMzIDIzNSA0MSA3MSAxNDEgNDggMjcyIDczIDIzNiA3OCA1MyAKKzI2OSAxNzEgMTY4IDg2IDExMSAxNiA5NSAxMTggMTA4IDY0IDEyMCAyMyAxODcgODcgMTEwIDI2OCAyNDMgMjc5IDI3NCAxNjggMjY2IAorMTQ4IDExOSAyMDQgMjYxIDQyIDU4IDg2IDczIDEyNyAxMTUgMjYgODkgMjUgMTAyIDgwIDc3IDY2IDM1IDE0NiAyNCA0NCAxOTEgMTM1IAorMTIzIDI4NSAxOTkgMTU1IDE0MCA5OSA1NyAyOCA1NCAxODUgNDIgMjc2IDEyIDE1NiAxOTggMTE4IDI4OCAxMDEgMjIzIDEzMiA0MSAKKzE4MCAxMDQgMjM0IDE2MyAyMTkgMTMgODQgODcgMjE5IDIzMSAxNDAgMTcwIDEgMjM0IDI3MiAxODIgMTk5IDI2NCAyMzMgMTI2IDIzNyAKKzE3NCAyNTAgMTkxIDIwNiA2NyA3MiAxMjggMTUyIDggODcgMjc4IDI4NyAyMjMgMjQxIDQgNzcgMjg0IDkxIDIyOSAyMjUgNDcgMTY0IAorMTQ3IDE5MSAyNiAzMCA5OSAxOSA5IDc0IDkzIDIzIDc4IDI4MyAyMTMgODggOTcgMjEzIDI2OCA0IDI3IDg4IDI3NyAxMjAgODIgMTEzIAorMTcwIDE4MSAyNzEgODYgMiA1MyAxOTggMjI3IDI1MSAyODcgMTE0IDI3OCAxMDcgMTg2IDEzOCAxODQgMjIzIDYxIDk3IDEwNCAxNzUgCisxMDcgNiAyMzEgODEgMTE0IDIwNyAxNjMgMTEwIDUwIDE4NyAxOTYgNzMgMTY1IDEzNCAxMzYgNTEgMTc0IDExIDk4IDIwIDE3NiA1NiAKKzIyMSAxNDYgMjYzIDEzNyA4OCAyNiAxMzkgNjIgMjA1IDE4OSAyMjAgMjkgMTEyIDc0IDI3MyA2MCA1MSAxMDMgNjcgMjIgOTEgNDkgCisxODggMjMzIDU1IDQgMjU3IDMyIDY0IDQ5IDc5IDI3MCAxNTggMTEzIDExMSAyNTUgNTggMTUgMjg4IDIxMCAyMTMgXgorNjI0IDEgMjggMjIwIDM2IDE3MCAyMzggMTk3IDE2OSA3MiA1NCA0MSAyMzcgMTU4IDI2IDIzNCA5MiAxNDUgOTUgMTU1IDg3IDE5MCAKKzI0MyAyMDggMjAwIDI1MCA0OCAyMSA5MCAyMTUgNDAgNzEgMTc4IDE4OCAxMDkgMTk2IDEzMCAyMTkgMjE2IDIwNiA1MSAxNiAyMyA1IAorNDggNiAxNTggOTcgNTUgMjc4IDIwMSA1NSAyMDcgOTAgMjg2IDE1MSAxMzAgMjM0IDE0OCAzNCAzNiAyMjYgMTI3IDEzOCAyNDAgMTEyIAorMiAzOCAxNDEgMjUwIDEwNCAzNyAzMSAxNTkgMjA3IDE5IDE3NSA5MiAyMDEgMjc0IDk2IDMxIDIzMCAyOCAyMDUgMTA0IDUyIDEyNiAKKzExNCAxOTIgMjI5IDE1MiAyMjUgMTAzIDkwIDIzMCAyNjIgMjYgMTA4IDg2IDM5IDMyIDM1IDYwIDE0NyAxMCAyNzggMjE2IDI3NyAzNSAKKzc1IDc5IDI1NSAxMDAgMTM2IDI1NCA1IDI2NyAxODUgOTkgNDEgOTUgMjI2IDcxIDI0OSA5IDE2OCAyNTIgOTAgMTQ0IDU2IDEyIDI0OSAKKzIyOCA1NyAxOTMgMzQgMjEgNCAxNzIgMTUzIDMwIDEzNSAxNTkgMTM2IDM1IDExNiAzNiAyNDEgNTkgOTMgMjI1IDMyIDEwNiAxNzEgNDMgCis2NiAyMzggMjY4IDI4MCAxMzEgMTEwIDEgMTYyIDE2MSAxMjIgMTQyIDE0IDE3OSAyODMgMTQxIDI2NSAzNiAxNTUgMTYgNzkgMTg0IAorMjc5IDc3IDE5OCA0NSA1MiAxODIgMyAxMzMgMTczIDE5MiAxMCAyNjMgMTIxIDMyIDUwIDI4MiAxMDIgMTIyIDE5OCAzMCAxMjAgMjI3IAorMTggMjEzIDE5NiA1OSAxMDggMTU3IDE1MCA5MSA5MSAyMCAxOTkgMTQwIDg0IDEyNCAxOTkgNjkgMjYzIDY1IDE0MyAxMDkgNDggNjIgCis0NyAyMDEgMTI2IDI4IDE0OSAyMTUgMTExIDE4MiA3NCAyNDQgNjkgMjQ4IDEzMyAyNSAxMjQgMTI4IDI0OCAyMDQgOSAxODMgMTg0IAorMjA4IDI1NiAxMzkgMjc5IDkyIDEzMCAxNjMgMzcgMjY1IDI3MCAyNjYgNzUgOCAxNDQgMjA0IDgwIDQgMjQzIDI2NCA4OSAxOTEgMTE5IAorMTg4IDM4IDg1IDcxIDE2MyAyNTYgMTU0IDIxMSAyMTAgMTE1IDgzIDE0IDEwOCAxNzIgODIgMjA5IDc2IDEwMyAxNzYgMjczIDI3NiA2NyAKKzQzIDEwIDU5IDM3IDQ2IDkxIDM1IDEzMSAyNTggNjkgNDQgMTc2IDIwMiAxNjUgMTcxIDI3NyAxNzcgNyAzNCAyNDAgMTgzIDExMyA5NyAKKzcwIDgzIDI5IDQwIDY3IDEyOSA1MyA3MyA3OCA4OSAxMjAgOCAyIDEwOSAyNTIgMTkgMzMgMTYwIDI0NiAyODkgMTMgNTQgOTcgMTI2IAorOTkgMjYwIDExMSAxNjcgMTQyIDI4OSAyNDcgMzggMTU2IDU1IDIyMiAyMiAxMTQgMjYzIDUwIDIxMSAyODEgMjI2IDE0MiA3MCA2OCAKKzIyNCAyMTIgMTUgMjc0IDI1IDIxMCAxNzEgMjYyIDI0NSAxNzkgMjEyIDMwIDIwNiAyNzAgMTk1IDI1NCAyMzkgODggODEgMjggMSAxNDcgCis2NiAxNjcgMTU3IDIyMSAyMDIgMTUwIDc2IDE1OSA2NSAyMTQgMjIwIDEwNyAyODEgNyAyNTMgMTI5IDEyNCA1NyAxMzcgMTQ1IDgwIDYwIAorMTMyIDc4IDE2MCAyMzEgNjcgNTggMjMyIDE3NyAyMiAxMjkgNjggMTY4IDMzIDc0IDQwIDI3NSAyNjIgMTc0IDY4IDE1MyAxMDEgMjQ2IAorMjE4IDE5MiAxNTggNDEgMTY2IDQ3IDI1NyAxNSAyNTkgMjIwIDkyIDU5IDUyIDI2OCA0NiAyMCAyMTQgNzIgMzkgMjM2IDI4MiA0NiAKKzEwNiAyNTcgMjQ5IDgwIDI3OSAyMSAxOSAxMDQgMjcxIDE1IDU1IDEzNiAyNjkgMTAwIDIyMiA3IDE4MiAxOCA2NSAxMjggMTQgOTMgCisyNDAgMjU0IDIyNCAxNTYgMTI2IDQzIDgxIDE3MCA5NiAxMDIgNTEgODcgMTM0IDY0IDEwNCAyNTYgMjEwIDEwMCAxNTEgMTg2IDEyMyAKKzg5IDEwNSA3NiAxNzQgMjg3IDQyIDQyIDE5MCA5NSAxNDAgMTU1IDIzNSAyNTggMTI1IDIyMyAxMTcgMjczIDIwNSAyNDYgMjc0IDgxIAorOTkgMTEyIDIwNiAyODUgMTI3IDIwOSA2MSA4IDU4IDI4OCA2NiAyNTMgMjAwIDIzNSAyNDMgMTkzIDEwNSA1IDYzIDIyOCAxMTMgODIgCisyNjUgMjU1IDQ0IDI0NyAyMyAyMjQgMjI3IDIzNyAxMDIgMTM3IDMgMTQ4IDEwNSAxNDcgMjg1IDU2IDk4IDE2NSAyNDIgOTggMjM2IDYzIAorMTU3IDIgMjMgMjA5IDUgMTE5IDExNyAyMTcgMjYgMTUgMjAzIDQxIDE1MSAxMTUgMTIgMTkzIDQ5IDExNiAxMjIgMjg0IDIzNiA3IDI2OCAKKzYxIDI0MiAxNjkgNTcgMTIyIDIxMyAxMjUgMjM4IDQ5IDEwMSAyNyAzOSAyNTEgMjE0IDEgMjE4IDUwIDYzIDIxMyAxODEgMTI3IDE1MyAKKzQ1IDY3IDExNCAxMjEgMTE4IDkzIDYgMTQzIDE2NSAyMjcgMTY2IDExOCA3OCA3NCAxODggNTMgMTcgMTg5IDE0OCAxNzYgMjU4IDU0IAorMTEyIDU4IDIxNyA4MiAxOTQgMTQ0IDI3NSAxOTEgMTQxIF4KKzYyOCAxIDMgOTcgMTM5IDE5NCAyMTEgOTIgMjUwIDExNyAxMzIgMTQ3IDI2NyAyOTAgMTE5IDE0IDI4MiAxMyAxMTggMzcgMTExIDIwMCAKKzk0IDYwIDIxNiAxMTkgNDcgMjcwIDExMCA4NSAyMDMgMTczIDE1OSAxNiA0MyAxNDggMjc3IDI3OCAyOSA1IDEyIDI2MiAxNTggNiAxNzYgCisxMTcgMjg2IDEzNSA3MiAyNTcgMTY0IDc2IDI0MSAxMDYgMTAxIDI2MSAxNDggMTggMjY2IDI0NyAxNDMgMTc4IDMyIDExNyA5OSAxNTkgCis0OSAzMSAyNDUgMTIzIDMxIDIxMiAxMzUgMjI2IDI0NSA5MCA0MyAyODYgMjg5IDYwIDYyIDEzMSAyNDIgMTEgNjUgMjMgMjQ0IDgwIAorMTc2IDg0IDYgMzggMTA1IDkxIDEwMiAyMzggMjcgMTIzIDI5MCAyMjQgMzggMjU5IDc5IDE5OSA4NCAxOTMgMTQgMTI4IDI1IDIxIDE5MSAKKzIzNyAxNyAyNTYgMjU5IDIzMyAxODcgMTAgMTYwIDU5IDE5IDI3NiAxMTQgMTc0IDE2OSAxNzUgNzQgMTggNyAyMzUgNjkgMTQ1IDE5OCAKKzE3OSA1OCAyNTIgMzIgMjU1IDExMSA2MiA4MiAyNzggMTgzIDI4NSAyMzAgMjI5IDMyIDY4IDEzNSAzOSAyNjkgNjcgMjMwIDc1IDQ0IAorMjYzIDE2OCAxNjUgODYgMTA4IDE2IDkyIDExMiAxMDUgNTggMTE0IDIwIDE4MSA3OCAxMDcgMjY1IDIzNyAyNzYgMjY4IDE2MiAyNjYgCisxNDIgMTE5IDIwMSAyNTggMzYgNTIgNzcgNjQgMTE4IDEwOSAyNiA4MCAyMiA5NiA4MCA3MSA2MCAyOSAxNDMgMjQgNDQgMTkxIDEzMiAKKzExNCAyNzkgMTkzIDE1MiAxNDAgOTkgNTQgMjUgNTQgMTc5IDQyIDI3NiA5IDE1MCAxOTIgMTA5IDI4NSA5MiAyMTcgMTI5IDM1IDE4MCAKKzEwMSAyMjggMTYwIDIxMyA3IDgxIDgxIDIxOSAyMzEgMTM0IDE2NyAxIDIzMSAyNzIgMTc5IDE5NiAyNjQgMjI3IDExNyAyMzcgMTcxIAorMjQ0IDE4NSAyMDAgNjEgNzIgMTE5IDE1MiAyIDg3IDI3MiAyODQgMjIwIDI0MSAxIDc3IDI4NCA4MiAyMjkgMjE5IDQ0IDE1OCAxNDQgCisxODggMjAgMjcgOTAgMTAgNiA3MSA5MyAxNyA2OSAyODMgMjEwIDgyIDkxIDIwNyAyNjIgNCAxOCA3OSAyNzEgMTIwIDczIDExMyAxNjQgCisxODEgMjY1IDgzIDI4OCA1MCAxOTUgMjIxIDI1MSAyODEgMTA4IDI3NSAxMDQgMTg2IDEzOCAxODQgMjIzIDYxIDg4IDk1IDE3NSAxMDcgCis2IDIyNSA4MSAxMTQgMjA3IDE1NyAxMDEgNDEgMTg0IDE5MCA3MyAxNjIgMTI4IDEzMCA0NSAxNjggMTEgOTggMTEgMTcwIDQ3IDIyMSAKKzE0NiAyNTcgMTMxIDg4IDIzIDEzOSA1NiAxOTkgMTg5IDIxNyAyODMgMjMgMTA2IDY4IDI3MyA1MSA1MSAxMDAgNjQgMTMgODUgNDkgCisxODUgMjMzIDQ5IDI5MCAyNTcgMjYgNjQgNDYgNzMgMjY3IDE1MiAxMDcgMTExIDI0OSA1OCA5IDI4OCAyMDQgMTgzIDI2IDIxOCAzNCAKKzE3MCAyMzQgMTk3IDE2OSA3MCA1MCA0MSAyMzMgMTU0IDIyIDIzNCA5MiAxNDUgOTMgMTU1IDgxIDE4NiAyNDMgMjA4IDIwMCAyNDggNDggCisyMSA4NiAyMTMgNDAgNjkgMTc4IDE4NiAxMDUgMTk2IDEyNiAyMTUgMjE0IDIwNCA0NSAxNCAyMyAxIDQ0IDQgMTU2IDkxIDUzIDI3NCAKKzE5OSA1MSAyMDUgODggMjgyIDE1MSAxMzAgMjMyIDE0NCAzNCAzMiAyMjIgMTIzIDEzNiAyMzYgMTEyIDM0IDEzNyAyNDYgMTAwIDMxIAorMjUgMTU5IDIwMyAxOSAxNzEgOTAgMTk3IDI3NCA5NCAyNyAyMjggMjIgMjAxIDEwNCA0OCAxMjYgMTEwIDE5MCAyMjcgMTUwIDIyNSA5NyAKKzkwIDIzMCAyNjIgMjAgMjg2IDEwMiA4NCAzOSAyNiAzMSA1OCAxNDcgOCAyNzggMjE2IDI3MyAzNSA3NSA3NyAyNTEgOTQgMTMyIDI1MiAKKzI5MSAyNjcgMTg1IDk1IDM3IDk1IDIyNCA3MSAyNDcgNSAxNjYgMjUwIDg0IDE0NCA1MCA4IDI0NSAyMjggNTUgMTg5IDMwIDE1IDE3MiAKKzE0OSAyOCAxMzMgMTU3IDEzNCAyOSAxMTAgMzYgMjM5IDUzIDg3IDIyMyAyOCAxMDAgMTY5IDM3IDYyIDIzNiAyNjYgMjgwIDEzMSAxMDQgCisyOTEgMTYyIDE2MSAxMTggMTQyIDE0IDE3NyAyODEgMTQxIDI2MyAzMCAxNTMgMTIgNzUgMTgyIDI3NSA3MSAxOTggNDEgNDYgMTc4IAorMjkxIDEyOSAxNzMgMTkyIDQgMjYxIDExNSAzMCA0OCAyODAgOTggMTE2IDE5NCAyNCAxMTYgMjI3IDEyIDIxMyAxOTQgNTcgMTA0IDE1MyAKKzE1MCA4NyA4NSAxNiAxOTcgMTM2IDgyIDEyNCAxOTUgNjcgMjYzIDYzIDE0MSAxMDkgNDIgNTYgNDUgMjAxIDEyMCAyNCAxNDkgMjE1IAorMTA5IDE4MCA2OCAyNDAgNjMgMjQ2IDEzMyAxOSAxMjIgMTI2IDI0OCAyMDIgOSAxODMgMTgwIDIwNiAyNTIgMTM3IDI3OSA4OCAxMjggCisxNjMgMzMgMjY1IDI3MCAyNjQgNzMgOCAxNDAgMjA0IDc4IDIgMjQxIDc2IF4KKzYyMiAwIDg5IDE4MyAxMTEgMTgwIDM0IDg1IDU5IDE1OSAyNTYgMTU0IDIwNyAyMTAgMTE1IDc1IDEwIDEwOCAxNjggNzggMjA5IDY4IAorMTAzIDE3NiAyNjkgMjcyIDU1IDM1IDEwIDUxIDMzIDM4IDg3IDMxIDEyMyAyNTggNjkgMzYgMTcyIDIwMiAxNjEgMTcxIDI3NyAxNjkgMyAKKzIyIDIzNiAxNzkgMTA5IDkzIDcwIDgzIDI5IDM2IDY3IDEyMSA0OSA2MSA3NCA4NSAxMTYgMiA5NyAyNDQgMTEgMzMgMTYwIDI0NiAyODUgCisxIDQyIDg5IDExOCA4NyAyNjAgOTkgMTU5IDEzNCAyODkgMjQ3IDM4IDE1MiA1NSAyMjIgMTQgMTEwIDI1NSA0MiAyMTEgMjc3IDIyNiAKKzEzOCA2MiA2NCAyMTYgMjA0IDExIDI3MCAyNSAyMDYgMTYzIDI1OCAyNDEgMTcxIDIxMiAzMCAxOTggMjY2IDE5NSAyNTQgMjM5IDg0IAorNjkgMjggMjgzIDE0MyA1NCAxNjcgMTUzIDIxNyAxOTQgMTQyIDY0IDE1MSA2NSAyMDYgMjIwIDk5IDI4MSAyOTMgMjQ5IDEyNSAxMTYgCis1NyAxMzcgMTM3IDcyIDQ4IDEyOCA3OCAxNTIgMjI3IDYzIDU0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyMSA3NCAyOCAyNzUgMjU0IAorMTc0IDYwIDE0OSA5MyAyNDIgMjE4IDE4NCAxNTggMzcgMTYyIDM5IDI0OSAzIDI1MSAyMTIgODAgNTkgNTIgMjYwIDM0IDIwIDIxNCA2MCAKKzI3IDIyOCAyODIgNDYgMTA2IDI1MyAyNDkgNjggMjc1IDE3IDE1IDEwMCAyNzEgMTUgNDMgMTM2IDI2OSAxMDAgMjE0IDI4OSAxODIgMTQgCis1MyAxMjAgMiA4OSAyNDAgMjQ2IDIyMCAxNTYgMTIyIDM5IDc3IDE2MiA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMjUyIDIwMiA5NiAxNDcgCisxNzggMTE5IDc3IDk3IDcyIDE3MCAyODcgMzggMzAgMTkwIDgzIDEzNiAxNDcgMjM1IDI1NCAxMTcgMjE5IDEwOSAyNjUgMjA1IDIzOCAKKzI2NiA3MyA5NSAxMDAgMjA2IDI4NSAxMjMgMjAxIDQ5IDI5MCA1MCAyODAgNjYgMjUzIDE5MiAyMjcgMjM1IDE4OSA5MyA1IDU5IDIyNCAKKzEwMSA3NCAyNTcgMjUxIDQwIDIzOSAxOSAyMjQgMjIzIDIzMyAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMjgxIDU2IDkwIDE2NSAyMzggOTQgCisyMzIgNTUgMTU3IDI4NCAxMSAyMDUgMSAxMDcgMTEzIDIxNyAyMiA3IDIwMyAyOSAxNDMgMTExIDggMTkzIDQ1IDExNiAxMjIgMjc2IAorMjM2IDcgMjY4IDUzIDI0MiAxNjEgNDkgMTE4IDIwOSAxMjUgMjM4IDM3IDk3IDE1IDM1IDI0NyAyMTAgMjg3IDIxMCA1MCA1MSAyMDUgCisxNzMgMTI3IDE1MyA0NSA1OSAxMDIgMTIxIDExNCA4NSAyODggMTM1IDE1NyAyMTkgMTY2IDEwNiA2NiA2NiAxODggNTMgMTMgMTg1IAorMTQ4IDE2OCAyNTAgNTAgMTA4IDQ2IDIxMyA3MCAxOTAgMTQwIDI3MSAxODcgNjMgMjkxIDk3IDEzNyAxOTQgMjA3IDg4IDI1MCAxMTUgCisxMzIgMTQ1IDI2MyAyOTAgMTE1IDEwIDI4MCA5IDExOCAzNyAxMDUgMTk4IDk0IDYwIDIxNCAxMTcgNDcgMjY4IDExMCA4MyAyMDEgMTcxIAorMTU1IDEwIDQzIDE0NCAyNzMgMjc0IDI3IDI5MyAxMiAyNjAgMTU2IDE3NCAxMTcgMjg0IDEzMyA3MCAyNTUgMTY0IDc2IDIzNyAxMDQgCisxMDEgMjYxIDE0NiAxNiAyNjIgMjQzIDE0MyAxNzYgMzIgMTEzIDk1IDE1NyA0NyAzMSAyNDUgMTIzIDI5IDIwOCAxMzUgMjIyIDI0MyAKKzg2IDQxIDI4NiAyODUgNTggNjIgMTI5IDI0MCA5IDYxIDE3IDI0NCA3NiAxNzIgODAgMiAzMiAxMDUgOTEgOTggMjM0IDI3IDEyMSAyODYgCisyMjAgMzQgMjU3IDc5IDE5OSA4NCAxOTEgOCAxMjggMjEgMTcgMTg3IDIzNSAxNyAyNTIgMjU5IDIzMSAxODcgNiAxNTYgNTcgMTUgMjcyIAorMTEyIDE3MCAxNjUgMTczIDcwIDE4IDUgMjMxIDY1IDE0MSAxOTYgMTc5IDUyIDI1MiAzMCAyNTUgMTA3IDU2IDgyIDI3NiAxNzkgMjgxIAorMjI4IDIyNSAyNiA2NiAxMzEgMzMgMjY3IDYzIDIyNiA3MyAzOCAyNTkgMTY2IDE2MyA4NiAxMDYgMTYgOTAgMTA4IDEwMyA1NCAxMTAgCisxOCAxNzcgNzIgMTA1IDI2MyAyMzMgMjc0IDI2NCAxNTggMjY2IDEzOCAxMTkgMTk5IDI1NiAzMiA0OCA3MSA1OCAxMTIgMTA1IDI2IDc0IAorMjAgOTIgODAgNjcgNTYgMjUgMTQxIDI0IDQ0IDE5MSAxMzAgMTA4IDI3NSAxODkgMTUwIDE0MCA5OSA1MiAyMyA1NCAxNzUgNDIgMjc2IAorNyAxNDYgMTg4IDEwMyAyODMgODYgMjEzIDEyNyAzMSAxODAgOTkgMjI0IDE1OCAyMDkgMyA3OSA3NyAyMTkgMjMxIDEzMCAxNjUgMSAKKzIyOSAyNzIgMTc3IDE5NCAyNjQgMjIzIDExMSAyMzcgMTY5IDI0MCAxODEgMTk2IDU3IDcyIDExMyAxNTIgMjkyIDg3IDI2OCAyODIgCisyMTggMjQxIDI5MyA3NyAyODQgNzYgMjI5IDgwIF4KKzYzNSAxIDQwIDE1MCAxNDAgMTg0IDEyIDIzIDc4IDI5NCAyIDY3IDkzIDkgNTcgMjgzIDIwNiA3NCA4MyAxOTkgMjU0IDQgNiA2NyAyNjMgCisxMjAgNjEgMTEzIDE1NiAxODEgMjU3IDc5IDI4NCA0NiAxOTEgMjEzIDI1MSAyNzMgMTAwIDI3MSAxMDAgMTg2IDEzOCAxODQgMjIzIDYxIAorNzYgODMgMTc1IDEwNyA2IDIxNyA4MSAxMTQgMjA3IDE0OSA4OSAyOSAxODAgMTgyIDczIDE1OCAxMjAgMTIyIDM3IDE2MCAxMSA5OCAKKzI5NSAxNjIgMzUgMjIxIDE0NiAyNDkgMTIzIDg4IDE5IDEzOSA0OCAxOTEgMTg5IDIxMyAyNzUgMTUgOTggNjAgMjczIDM5IDUxIDk2IAorNjAgMSA3NyA0OSAxODEgMjMzIDQxIDI4NiAyNTcgMTggNjQgNDIgNjUgMjYzIDE0NCA5OSAxMTEgMjQxIDU4IDEgMjg4IDE5NiAxNzkgCisyMiAyMTQgMzAgMTcwIDIyNiAxOTcgMTY5IDY2IDQyIDQxIDIyNSAxNDYgMTQgMjM0IDkyIDE0NSA4OSAxNTUgNjkgMTc4IDI0MyAyMDggCisyMDAgMjQ0IDQ4IDIxIDc4IDIwOSA0MCA2NSAxNzggMTgyIDk3IDE5NiAxMTggMjA3IDIxMCAyMDAgMzMgMTAgMjMgMjg5IDM2IDE1MiAKKzc5IDQ5IDI2NiAxOTUgNDMgMjAxIDg0IDI3NCAxNTEgMTMwIDIyOCAxMzYgMzQgMjQgMjE0IDExNSAxMzIgMjI4IDExMiAyOTIgMjYgCisxMjkgMjM4IDkyIDE5IDEzIDE1OSAxOTUgMTkgMTYzIDg2IDE4OSAyNzQgOTAgMTkgMjI0IDEwIDE5MyAxMDQgNDAgMTI2IDEwMiAxODYgCisyMjMgMTQ2IDIyNSA4NSA5MCAyMzAgMjYyIDggMjc4IDkwIDgwIDM5IDE0IDIzIDU0IDE0NyA0IDI3OCAyMTYgMjY1IDM1IDc1IDczIAorMjQzIDgyIDEyNCAyNDggMjgzIDI2NyAxODUgODcgMjkgOTUgMjIwIDcxIDI0MyAyOTMgMTYyIDI0NiA3MiAxNDQgMzggMjM3IDIyOCA1MSAKKzE4MSAyMiAzIDI4OCAxNzIgMTQxIDI0IDEyOSAxNTMgMTMwIDE3IDk4IDM2IDIzNSA0MSA3NSAyMTkgMjAgODggMTY1IDI1IDU0IDIzMiAKKzI2MiAyODAgMTMxIDkyIDI5MSAxNjIgMTYxIDExMCAxNDIgMTQgMTczIDI3NyAxNDEgMjU5IDE4IDE0OSA0IDY3IDE3OCAyNjcgNTkgCisxOTggMzMgMzQgMTcwIDI4NyAxMjEgMTczIDE5MiAyODggMjU3IDEwMyAyNiA0NCAyNzYgOTAgMTA0IDE4NiAxMiAxMDggMjI3IDIxMyAKKzE5MCA1MyA5NiAxNDUgMTUwIDc5IDczIDggMTkzIDEyOCA3OCAxMjQgMTg3IDYzIDI2MyA1OSAxMzcgMTA5IDMwIDQ0IDQxIDIwMSAxMDggCisxNiAxNDkgMjE1IDEwNSAxNzYgNTYgMjMyIDUxIDI0MiAxMzMgNyAxMTggMTIyIDI0OCAxOTggOSAxODMgMTcyIDIwMiAyNDQgMTMzIAorMjc5IDgwIDEyNCAxNjMgMjUgMjY1IDI3MCAyNjAgNjkgOCAxMzIgMjA0IDc0IDI5NCAyMzcgMjUyIDg5IDE3OSAxMDcgMTc2IDMyIDg1IAorNTMgMTU3IDI1NiAxNTQgMjA1IDIxMCAxMTUgNzEgOCAxMDggMTY2IDc2IDIwOSA2NCAxMDMgMTc2IDI2NyAyNzAgNDkgMzEgMTAgNDcgCiszMSAzNCA4NSAyOSAxMTkgMjU4IDY5IDMyIDE3MCAyMDIgMTU5IDE3MSAyNzcgMTY1IDEgMTYgMjM0IDE3NyAxMDcgOTEgNzAgODMgMjkgCiszNCA2NyAxMTcgNDcgNTUgNzIgODMgMTE0IDI5MiAyIDkxIDI0MCA3IDMzIDE2MCAyNDYgMjgzIDI5MSAzNiA4NSAxMTQgODEgMjYwIDkzIAorMTU1IDEzMCAyODkgMjQ3IDM4IDE1MCA1NSAyMjIgMTAgMTA4IDI1MSAzOCAyMTEgMjc1IDIyNiAxMzYgNTggNjIgMjEyIDIwMCA5IDI2OCAKKzI1IDIwNCAxNTkgMjU2IDIzOSAxNjcgMjEyIDMwIDE5NCAyNjQgMTk1IDI1NCAyMzkgODIgNjMgMjggMjc5IDE0MSA0OCAxNjcgMTUxIAorMjE1IDE5MCAxMzggNTggMTQ3IDY1IDIwMiAyMjAgOTUgMjgxIDI5MSAyNDcgMTIzIDExMiA1NyAxMzcgMTMzIDY4IDQyIDEyNiA3OCAKKzE0OCAyMjUgNjEgNTIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1IDc0IDIyIDI3NSAyNTAgMTc0IDU2IDE0NyA4OSAyNDAgMjE4IDE4MCAKKzE1OCAzNSAxNjAgMzUgMjQ1IDI5MyAyNDcgMjA4IDc0IDU5IDUyIDI1NiAyOCAyMCAyMTQgNTQgMjEgMjI0IDI4MiA0NiAxMDYgMjUxIAorMjQ5IDYyIDI3MyAxNSAxMyA5OCAyNzEgMTUgMzcgMTM2IDI2OSAxMDAgMjEwIDI4NSAxODIgMTIgNDcgMTE2IDI5MiA4NyAyNDAgMjQyIAorMjE4IDE1NiAxMjAgMzcgNzUgMTU4IDk2IDg0IDM5IDc1IDEzNCA1OCA4NiAyNTAgMTk4IDk0IDE0NSAxNzQgMTE3IDcxIDkzIDcwIDE2OCAKKzI4NyAzNiAyNCAxOTAgNzcgMTM0IDE0MyAyMzUgMjUyIDExMyAyMTcgMTA1IDI2MSAyMDUgMjM0IDI2MiA2OSA5MyA5NCAyMDYgMjg1IAorMTIxIDE5NyA0MyAyODYgNDYgMjc2IDY2IDI1MyAxODggMjIzIDIzMSAxODcgODcgNSA1NyAyMjIgOTUgMjg1IF4KKzYzNiAwIDI1MSAyNDggMzcgMjMzIDE2IDIyNCAyMjAgMjMwIDEwMiAxMjMgMyAxNDEgOTggMTMzIDI3OCA1NiA4NCAxNjUgMjM1IDkxIAorMjI5IDQ5IDE1NyAyNzggMiAyMDIgMjk1IDk4IDExMCAyMTcgMTkgMSAyMDMgMjAgMTM3IDEwOCA1IDE5MyA0MiAxMTYgMTIyIDI3MCAKKzIzNiA3IDI2OCA0NyAyNDIgMTU1IDQzIDExNSAyMDYgMTI1IDIzOCAyOCA5NCA2IDMyIDI0NCAyMDcgMjg0IDIwNCA1MCA0MiAxOTkgCisxNjcgMTI3IDE1MyA0NSA1MyA5MyAxMjEgMTExIDc5IDI4MiAxMjkgMTUxIDIxMyAxNjYgOTcgNTcgNjAgMTg4IDUzIDEwIDE4MiAxNDggCisxNjIgMjQ0IDQ3IDEwNSAzNyAyMTAgNjEgMTg3IDEzNyAyNjggMTg0IDYzIDI4NSA5NyAxMzQgMTk0IDIwMSA4MiAyNTAgMTEyIDEzMiAKKzE0MiAyNTcgMjkwIDEwOSA0IDI3NyAzIDExOCAzNyA5NiAxOTUgOTQgNjAgMjExIDExNCA0NyAyNjUgMTEwIDgwIDE5OCAxNjggMTQ5IDEgCis0MyAxMzggMjY3IDI2OCAyNCAyODcgMTIgMjU3IDE1MyAyODggMTcxIDExNyAyODEgMTMwIDY3IDI1MiAxNjQgNzYgMjMxIDEwMSAxMDEgCisyNjEgMTQzIDEzIDI1NiAyMzcgMTQzIDE3MyAzMiAxMDcgODkgMTU0IDQ0IDMxIDI0NSAxMjMgMjYgMjAyIDEzNSAyMTYgMjQwIDgwIDM4IAorMjg2IDI3OSA1NSA2MiAxMjYgMjM3IDYgNTUgOCAyNDQgNzAgMTY2IDc0IDI5MyAyMyAxMDUgOTEgOTIgMjI4IDI3IDExOCAyODAgMjE0IAorMjggMjU0IDc5IDE5OSA4NCAxODggMjk2IDEyOCAxNSAxMSAxODEgMjMyIDE3IDI0NiAyNTkgMjI4IDE4NyAxNTAgNTQgOSAyNjYgMTA5IAorMTY0IDE1OSAxNzAgNjQgMTggMiAyMjUgNTkgMTM1IDE5MyAxNzkgNDMgMjUyIDI3IDI1NSAxMDEgNDcgODIgMjczIDE3MyAyNzUgMjI1IAorMjE5IDE3IDYzIDEyNSAyNCAyNjQgNTcgMjIwIDcwIDI5IDI1MyAxNjMgMTYwIDg2IDEwMyAxNiA4NyAxMDIgMTAwIDQ4IDEwNCAxNSAKKzE3MSA2MyAxMDIgMjYwIDIyNyAyNzEgMjU4IDE1MiAyNjYgMTMyIDExOSAxOTYgMjUzIDI2IDQyIDYyIDQ5IDEwMyA5OSAyNiA2NSAxNyAKKzg2IDgwIDYxIDUwIDE5IDEzOCAyNCA0NCAxOTEgMTI3IDk5IDI2OSAxODMgMTQ3IDE0MCA5OSA0OSAyMCA1NCAxNjkgNDIgMjc2IDQgCisxNDAgMTgyIDk0IDI4MCA3NyAyMDcgMTI0IDI1IDE4MCA5NiAyMTggMTU1IDIwMyAyOTQgNzYgNzEgMjE5IDIzMSAxMjQgMTYyIDEgMjI2IAorMjcyIDE3NCAxOTEgMjY0IDIxNyAxMDIgMjM3IDE2NiAyMzQgMTc1IDE5MCA1MSA3MiAxMDQgMTUyIDI4OSA4NyAyNjIgMjc5IDIxNSAKKzI0MSAyOTMgNzcgMjg0IDY3IDIyOSAyMDkgMzkgMTQ4IDEzOSAxODMgMTAgMjIgNzUgMjkyIDEgNjYgOTMgNyA1NCAyODMgMjA1IDcyIAorODEgMTk3IDI1MiA0IDMgNjQgMjYxIDEyMCA1OCAxMTMgMTU0IDE4MSAyNTUgNzggMjgzIDQ1IDE5MCAyMTEgMjUxIDI3MSA5OCAyNzAgCis5OSAxODYgMTM4IDE4NCAyMjMgNjEgNzMgODAgMTc1IDEwNyA2IDIxNSA4MSAxMTQgMjA3IDE0NyA4NiAyNiAxNzkgMTgwIDczIDE1NyAKKzExOCAxMjAgMzUgMTU4IDExIDk4IDI5MyAxNjAgMzIgMjIxIDE0NiAyNDcgMTIxIDg4IDE4IDEzOSA0NiAxODkgMTg5IDIxMiAyNzMgMTMgCis5NiA1OCAyNzMgMzYgNTEgOTUgNTkgMjk1IDc1IDQ5IDE4MCAyMzMgMzkgMjg1IDI1NyAxNiA2NCA0MSA2MyAyNjIgMTQyIDk3IDExMSAKKzIzOSA1OCAyOTYgMjg4IDE5NCAxNzggMjEgMjEzIDI5IDE3MCAyMjQgMTk3IDE2OSA2NSA0MCA0MSAyMjMgMTQ0IDEyIDIzNCA5MiAxNDUgCis4OCAxNTUgNjYgMTc2IDI0MyAyMDggMjAwIDI0MyA0OCAyMSA3NiAyMDggNDAgNjQgMTc4IDE4MSA5NSAxOTYgMTE2IDIwNSAyMDkgMTk5IAorMzAgOSAyMyAyODggMzQgMjk2IDE1MSA3NiA0OCAyNjQgMTk0IDQxIDIwMCA4MyAyNzIgMTUxIDEzMCAyMjcgMTM0IDM0IDIyIDIxMiAKKzExMyAxMzEgMjI2IDExMiAyOTIgMjQgMTI3IDIzNiA5MCAxNiAxMCAxNTkgMTkzIDE5IDE2MSA4NSAxODcgMjc0IDg5IDE3IDIyMyA3IAorMTkxIDEwNCAzOCAxMjYgMTAwIDE4NSAyMjIgMTQ1IDIyNSA4MiA5MCAyMzAgMjYyIDUgMjc2IDg3IDc5IDM5IDExIDIxIDUzIDE0NyAzIAorMjc4IDIxNiAyNjMgMzUgNzUgNzIgMjQxIDc5IDEyMiAyNDcgMjgxIDI2NyAxODUgODUgMjcgOTUgMjE5IDcxIDI0MiAyOTIgMTYxIDI0NSAKKzY5IDE0NCAzNSAyOTUgMjM1IDIyOCA1MCAxNzkgMjAgMjg3IDE3MiAxMzkgMjMgMTI4IDE1MiAxMjkgMTQgOTUgMzYgMjM0IDM4IDcyIAorMjE4IDE4IDg1IDE2NCAyMiA1MiAyMzEgMjYxIDI4MCAxMzEgODkgMjkxIDE2MiAxNjEgMTA4IDE0MiAxNCAxNzIgMjc2IDkxIF4KKzYzNSAxIDI1NiA5IDE0NiAyOTcgNjEgMTc1IDI2MSA1MCAxOTggMjcgMjUgMTY0IDI4NCAxMTUgMTczIDE5MiAyODIgMjU0IDk0IDIzIAorNDEgMjczIDg0IDk1IDE4MCAzIDEwMiAyMjcgMjkwIDIxMyAxODcgNTAgOTAgMTM5IDE1MCA3MyA2NCAyIDE5MCAxMjIgNzUgMTI0IDE4MSAKKzYwIDI2MyA1NiAxMzQgMTA5IDIxIDM1IDM4IDIwMSA5OSAxMCAxNDkgMjE1IDEwMiAxNzMgNDcgMjI2IDQyIDIzOSAxMzMgMjk3IDExNSAKKzExOSAyNDggMTk1IDkgMTgzIDE2NiAxOTkgMjM4IDEzMCAyNzkgNzQgMTIxIDE2MyAxOSAyNjUgMjcwIDI1NyA2NiA4IDEyNiAyMDQgNzEgCisyOTQgMjM0IDI0NiA4OSAxNzMgMTAxIDE3MCAyOSA4NSA0NCAxNTQgMjU2IDE1NCAyMDIgMjEwIDExNSA2NSA1IDEwOCAxNjMgNzMgMjA5IAorNTggMTAzIDE3NiAyNjQgMjY3IDQwIDI1IDEwIDQxIDI4IDI4IDgyIDI2IDExMyAyNTggNjkgMjYgMTY3IDIwMiAxNTYgMTcxIDI3NyAKKzE1OSAyOTcgNyAyMzEgMTc0IDEwNCA4OCA3MCA4MyAyOSAzMSA2NyAxMTEgNDQgNDYgNjkgODAgMTExIDI4OSAyIDgyIDIzNCAxIDMzIAorMTYwIDI0NiAyODAgMjg1IDI3IDc5IDEwOCA3MiAyNjAgODQgMTQ5IDEyNCAyODkgMjQ3IDM4IDE0NyA1NSAyMjIgNCAxMDUgMjQ1IDMyIAorMjExIDI3MiAyMjYgMTMzIDUyIDU5IDIwNiAxOTQgNiAyNjUgMjUgMjAxIDE1MyAyNTMgMjM2IDE2MSAyMTIgMzAgMTg4IDI2MSAxOTUgCisyNTQgMjM5IDc5IDU0IDI4IDI3MyAxMzggMzkgMTY3IDE0OCAyMTIgMTg0IDEzMiA0OSAxNDEgNjUgMTk2IDIyMCA4OSAyODEgMjg4IAorMjQ0IDEyMCAxMDYgNTcgMTM3IDEyNyA2MiAzMyAxMjMgNzggMTQyIDIyMiA1OCA0OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNiA3NCAxMyAKKzI3NSAyNDQgMTc0IDUwIDE0NCA4MyAyMzcgMjE4IDE3NCAxNTggMzIgMTU3IDI5IDIzOSAyODcgMjQxIDIwMiA2NSA1OSA1MiAyNTAgMTkgCisyMCAyMTQgNDUgMTIgMjE4IDI4MiA0NiAxMDYgMjQ4IDI0OSA1MyAyNzAgMTIgMTAgOTUgMjcxIDE1IDI4IDEzNiAyNjkgMTAwIDIwNCAKKzI3OSAxODIgOSAzOCAxMTAgMjg2IDg0IDI0MCAyMzYgMjE1IDE1NiAxMTcgMzQgNzIgMTUyIDk2IDc1IDMzIDY5IDEzNCA1NSA3NyAyNDcgCisxOTIgOTEgMTQyIDE2OCAxMTQgNjIgODcgNjcgMTY1IDI4NyAzMyAxNSAxOTAgNjggMTMxIDEzNyAyMzUgMjQ5IDEwNyAyMTQgOTkgMjU1IAorMjA1IDIyOCAyNTYgNjMgOTAgODUgMjA2IDI4NSAxMTggMTkxIDM0IDI4MCA0MCAyNzAgNjYgMjUzIDE4MiAyMTcgMjI1IDE4NCA3OCA1IAorNTQgMjE5IDg2IDY0IDI0NyAyNDYgMzUgMjI5IDE0IDIyNCAyMTggMjI4IDEwMiAxMTkgMyAxMzkgOTYgMTI5IDI3NiA1NiA4MCAxNjUgCisyMzMgODkgMjI3IDQ1IDE1NyAyNzQgMjk1IDIwMCAyOTUgOTIgMTA4IDIxNyAxNyAyOTYgMjAzIDE0IDEzMyAxMDYgMyAxOTMgNDAgMTE2IAorMTIyIDI2NiAyMzYgNyAyNjggNDMgMjQyIDE1MSAzOSAxMTMgMjA0IDEyNSAyMzggMjIgOTIgMzAgMjQyIDIwNSAyODIgMjAwIDUwIDM2IAorMTk1IDE2MyAxMjcgMTUzIDQ1IDQ5IDg3IDEyMSAxMDkgNzUgMjc4IDEyNSAxNDcgMjA5IDE2NiA5MSA1MSA1NiAxODggNTMgOCAxODAgCisxNDggMTU4IDI0MCA0NSAxMDMgMzEgMjA4IDU1IDE4NSAxMzUgMjY2IDE4MiA2MyAyODEgOTcgMTMyIDE5NCAxOTcgNzggMjUwIDExMCAKKzEzMiAxNDAgMjUzIDI5MCAxMDUgMjc1IDI5OCAxMTggMzcgOTAgMTkzIDk0IDYwIDIwOSAxMTIgNDcgMjYzIDExMCA3OCAxOTYgMTY2IAorMTQ1IDI5NCA0MyAxMzQgMjYzIDI2NCAyMiAyODMgMTIgMjU1IDE1MSAyODQgMTY5IDExNyAyNzkgMTI4IDY1IDI1MCAxNjQgNzYgMjI3IAorOTkgMTAxIDI2MSAxNDEgMTEgMjUyIDIzMyAxNDMgMTcxIDMyIDEwMyA4NSAxNTIgNDIgMzEgMjQ1IDEyMyAyNCAxOTggMTM1IDIxMiAKKzIzOCA3NiAzNiAyODYgMjc1IDUzIDYyIDEyNCAyMzUgNCA1MSAyIDI0NCA2NiAxNjIgNzAgMjkxIDE3IDEwNSA5MSA4OCAyMjQgMjcgCisxMTYgMjc2IDIxMCAyNCAyNTIgNzkgMTk5IDg0IDE4NiAyOTIgMTI4IDExIDcgMTc3IDIzMCAxNyAyNDIgMjU5IDIyNiAxODcgMjk1IAorMTQ2IDUyIDUgMjYyIDEwNyAxNjAgMTU1IDE2OCA2MCAxOCAyMjEgNTUgMTMxIDE5MSAxNzkgMzcgMjUyIDI1IDI1NSA5NyA0MSA4MiAKKzI3MSAxNjkgMjcxIDIyMyAyMTUgMTEgNjEgMTIxIDE4IDI2MiA1MyAyMTYgNjggMjMgMjQ5IDE2MSAxNTggODYgMTAxIDE2IDg1IDk4IAorOTggNDQgMTAwIDEzIDE2NyA1NyAxMDAgMjU4IDIyMyAyNjkgMjU0IDE0OCAyNjYgMTI4IDExOSAxOTQgMjUxIDIyIDM4IDU2IDQzIDI3NSAKK14KKzY0MiAwIDkxIDI2IDUzIDEzIDc4IDgwIDUzIDQyIDExIDEzNCAyNCA0NCAxOTEgMTIzIDg3IDI2MSAxNzUgMTQzIDE0MCA5OSA0NSAxNiAKKzU0IDE2MSA0MiAyNzYgMTMyIDE3NCA4MiAyNzYgNjUgMTk5IDEyMCAxNyAxODAgOTIgMjEwIDE1MSAxOTUgMjkwIDcyIDYzIDIxOSAyMzEgCisxMTYgMTU4IDEgMjIyIDI3MiAxNzAgMTg3IDI2NCAyMDkgOTAgMjM3IDE2MiAyMjYgMTY3IDE4MiA0MyA3MiA5MiAxNTIgMjg1IDg3IAorMjU0IDI3NSAyMTEgMjQxIDI5MyA3NyAyODQgNTUgMjI5IDIwMSAzNSAxNDAgMTM1IDE3OSAyIDE4IDYzIDI4NCAyOTggNjIgOTMgMzAwIAorNDIgMjgzIDIwMSA2NCA3MyAxODkgMjQ0IDQgMjkyIDUyIDI1MyAxMjAgNDYgMTEzIDE0NiAxODEgMjQ3IDc0IDI3OSA0MSAxODYgMjAzIAorMjUxIDI2MyA5MCAyNjYgOTUgMTg2IDEzOCAxODQgMjIzIDYxIDYxIDY4IDE3NSAxMDcgNiAyMDcgODEgMTE0IDIwNyAxMzkgNzQgMTQgCisxNzUgMTcyIDczIDE1MyAxMTAgMTEyIDI3IDE1MCAxMSA5OCAyODUgMTUyIDIwIDIyMSAxNDYgMjM5IDExMyA4OCAxNCAxMzkgMzggMTgxIAorMTg5IDIwOCAyNjUgNSA4OCA1MCAyNzMgMjQgNTEgOTEgNTUgMjg3IDY3IDQ5IDE3NiAyMzMgMzEgMjgxIDI1NyA4IDY0IDM3IDU1IDI1OCAKKzEzNCA4OSAxMTEgMjMxIDU4IDI5MiAyODggMTg2IDE3NCAxNyAyMDkgMjUgMTcwIDIxNiAxOTcgMTY5IDYxIDMyIDQxIDIxNSAxMzYgNCAKKzIzNCA5MiAxNDUgODQgMTU1IDU0IDE2OCAyNDMgMjA4IDIwMCAyMzkgNDggMjEgNjggMjA0IDQwIDYwIDE3OCAxNzcgODcgMTk2IDEwOCAKKzE5NyAyMDUgMTk1IDE4IDUgMjMgMjg0IDI2IDI5NiAxNDcgNjQgNDQgMjU2IDE5MCAzMyAxOTYgNzkgMjY0IDE1MSAxMzAgMjIzIDEyNiAKKzM0IDE0IDIwNCAxMDUgMTI3IDIxOCAxMTIgMjkyIDE2IDExOSAyMjggODIgNCAyOTkgMTU5IDE4NSAxOSAxNTMgODEgMTc5IDI3NCA4NSAKKzkgMjE5IDI5NiAxODMgMTA0IDMwIDEyNiA5MiAxODEgMjE4IDE0MSAyMjUgNzAgOTAgMjMwIDI2MiAyOTQgMjY4IDc1IDc1IDM5IDMwMCAKKzEzIDQ5IDE0NyAzMDAgMjc4IDIxNiAyNTUgMzUgNzUgNjggMjMzIDY3IDExNCAyNDMgMjczIDI2NyAxODUgNzcgMTkgOTUgMjE1IDcxIAorMjM4IDI4OCAxNTcgMjQxIDU3IDE0NCAyMyAyOTEgMjI3IDIyOCA0NiAxNzEgMTIgMjg5IDI4MyAxNzIgMTMxIDE5IDEyNCAxNDggMTI1IAorMiA4MyAzNiAyMzAgMjYgNjAgMjE0IDEwIDczIDE2MCAxMCA0NCAyMjcgMjU3IDI4MCAxMzEgNzcgMjkxIDE2MiAxNjEgMTAwIDE0MiAxNCAKKzE2OCAyNzIgMTQxIDI1NCAzIDE0NCAyOTUgNTcgMTczIDI1NyA0NCAxOTggMjMgMTkgMTYwIDI4MiAxMTEgMTczIDE5MiAyNzggMjUyIAorODggMjEgMzkgMjcxIDgwIDg5IDE3NiAyOTggOTggMjI3IDI4NiAyMTMgMTg1IDQ4IDg2IDEzNSAxNTAgNjkgNTggMjk5IDE4OCAxMTggCis3MyAxMjQgMTc3IDU4IDI2MyA1NCAxMzIgMTA5IDE1IDI5IDM2IDIwMSA5MyA2IDE0OSAyMTUgMTAwIDE3MSA0MSAyMjIgMzYgMjM3IAorMTMzIDI5MyAxMTMgMTE3IDI0OCAxOTMgOSAxODMgMTYyIDE5NyAyMzQgMTI4IDI3OSA3MCAxMTkgMTYzIDE1IDI2NSAyNzAgMjU1IDY0IAorOCAxMjIgMjA0IDY5IDI5NCAyMzIgMjQyIDg5IDE2OSA5NyAxNjYgMjcgODUgMzggMTUyIDI1NiAxNTQgMjAwIDIxMCAxMTUgNjEgMyAKKzEwOCAxNjEgNzEgMjA5IDU0IDEwMyAxNzYgMjYyIDI2NSAzNCAyMSAxMCAzNyAyNiAyNCA4MCAyNCAxMDkgMjU4IDY5IDIyIDE2NSAyMDIgCisxNTQgMTcxIDI3NyAxNTUgMjk3IDEgMjI5IDE3MiAxMDIgODYgNzAgODMgMjkgMjkgNjcgMTA3IDQyIDQwIDY3IDc4IDEwOSAyODcgMiAKKzc2IDIzMCAyOTggMzMgMTYwIDI0NiAyNzggMjgxIDIxIDc1IDEwNCA2NiAyNjAgNzggMTQ1IDEyMCAyODkgMjQ3IDM4IDE0NSA1NSAyMjIgCisxMDMgMjQxIDI4IDIxMSAyNzAgMjI2IDEzMSA0OCA1NyAyMDIgMTkwIDQgMjYzIDI1IDE5OSAxNDkgMjUxIDIzNCAxNTcgMjEyIDMwIAorMTg0IDI1OSAxOTUgMjU0IDIzOSA3NyA0OCAyOCAyNjkgMTM2IDMzIDE2NyAxNDYgMjEwIDE4MCAxMjggNDMgMTM3IDY1IDE5MiAyMjAgCis4NSAyODEgMjg2IDI0MiAxMTggMTAyIDU3IDEzNyAxMjMgNTggMjcgMTIxIDc4IDEzOCAyMjAgNTYgNDcgMjMyIDE3NyAyMiAxMjkgNjggCisxNjggNzQgNyAyNzUgMjQwIDE3NCA0NiAxNDIgNzkgMjM1IDIxOCAxNzAgMTU4IDMwIDE1NSAyNSAyMzUgMjgzIDIzNyAxOTggNTkgNTkgCis1MiAyNDYgMTMgMjAgMjE0IDM5IDYgMjE0IDI4MiA0NiAxMDYgMjQ2IDI0OSA0NyAyNjggMTAgOCA5MyAyNzEgMTUgMjIgMTM2IDI2OSAKKzEwMCAyMDAgMjc1IDQyIF4KKzY0NCAwIDYgMjkgMTA0IDI4MCA4MSAyNDAgMjMwIDIxMiAxNTYgMTE0IDMxIDY5IDE0NiA5NiA2NiAyNyA2MyAxMzQgNTIgNjggMjQ0IAorMTg2IDg4IDEzOSAxNjIgMTExIDUzIDgxIDY0IDE2MiAyODcgMzAgNiAxOTAgNTkgMTI4IDEzMSAyMzUgMjQ2IDEwMSAyMTEgOTMgMjQ5IAorMjA1IDIyMiAyNTAgNTcgODcgNzYgMjA2IDI4NSAxMTUgMTg1IDI1IDI3NCAzNCAyNjQgNjYgMjUzIDE3NiAyMTEgMjE5IDE4MSA2OSA1IAorNTEgMjE2IDc3IDU4IDI0MSAyNDMgMzIgMjIzIDExIDIyNCAyMTUgMjI1IDEwMiAxMTMgMyAxMzYgOTMgMTIzIDI3MyA1NiA3NCAxNjUgCisyMzAgODYgMjI0IDM5IDE1NyAyNjggMjg5IDE5NyAyOTUgODMgMTA1IDIxNyAxNCAyOTMgMjAzIDUgMTI3IDEwMyAxOTMgMzcgMTE2IAorMTIyIDI2MCAyMzYgNyAyNjggMzcgMjQyIDE0NSAzMyAxMTAgMjAxIDEyNSAyMzggMTMgODkgMjkzIDI3IDIzOSAyMDIgMjc5IDE5NCA1MCAKKzI3IDE4OSAxNTcgMTI3IDE1MyA0NSA0MyA3OCAxMjEgMTA2IDY5IDI3MiAxMTkgMTQxIDIwMyAxNjYgODIgNDIgNTAgMTg4IDUzIDUgCisxNzcgMTQ4IDE1MiAyMzQgNDIgMTAwIDIyIDIwNSA0NiAxODIgMTMyIDI2MyAxNzkgNjMgMjc1IDk3IDEyOSAxOTQgMTkxIDcyIDI1MCAKKzEwNyAxMzIgMTM3IDI0NyAyOTAgOTkgMjk2IDI3MiAyOTUgMTE4IDM3IDgxIDE5MCA5NCA2MCAyMDYgMTA5IDQ3IDI2MCAxMTAgNzUgCisxOTMgMTYzIDEzOSAyODggNDMgMTI4IDI1NyAyNTggMTkgMjc3IDEyIDI1MiAxNDggMjc4IDE2NiAxMTcgMjc2IDEyNSA2MiAyNDcgMTY0IAorNzYgMjIxIDk2IDEwMSAyNjEgMTM4IDggMjQ2IDIyNyAxNDMgMTY4IDMyIDk3IDc5IDE0OSAzOSAzMSAyNDUgMTIzIDIxIDE5MiAxMzUgCisyMDYgMjM1IDcwIDMzIDI4NiAyNjkgNTAgNjIgMTIxIDIzMiAxIDQ1IDI5NSAyNDQgNjAgMTU2IDY0IDI4OCA4IDEwNSA5MSA4MiAyMTggCisyNyAxMTMgMjcwIDIwNCAxOCAyNDkgNzkgMTk5IDg0IDE4MyAyODYgMTI4IDUgMSAxNzEgMjI3IDE3IDIzNiAyNTkgMjIzIDE4NyAyOTIgCisxNDAgNDkgMzAxIDI1NiAxMDQgMTU0IDE0OSAxNjUgNTQgMTggMjk5IDIxNSA0OSAxMjUgMTg4IDE3OSAyOCAyNTIgMjIgMjU1IDkxIDMyIAorODIgMjY4IDE2MyAyNjUgMjIwIDIwOSAyIDU4IDExNSA5IDI1OSA0NyAyMTAgNjUgMTQgMjQzIDE1OCAxNTUgODYgOTggMTYgODIgOTIgCis5NSAzOCA5NCAxMCAxNjEgNDggOTcgMjU1IDIxNyAyNjYgMjQ4IDE0MiAyNjYgMTIyIDExOSAxOTEgMjQ4IDE2IDMyIDQ3IDM0IDg4IDg5IAorMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAxMzMgMjQgNDQgMTkxIDEyMiA4NCAyNTkgMTczIDE0MiAxNDAgOTkgNDQgMTUgNTQgMTU5IDQyIAorMjc2IDMwMSAxMzAgMTcyIDc5IDI3NSA2MiAxOTcgMTE5IDE1IDE4MCA5MSAyMDggMTUwIDE5MyAyODkgNzEgNjEgMjE5IDIzMSAxMTQgCisxNTcgMSAyMjEgMjcyIDE2OSAxODYgMjY0IDIwNyA4NyAyMzcgMTYxIDIyNCAxNjUgMTgwIDQxIDcyIDg5IDE1MiAyODQgODcgMjUyIAorMjc0IDIxMCAyNDEgMjkzIDc3IDI4NCA1MiAyMjkgMTk5IDM0IDEzOCAxMzQgMTc4IDE3IDYwIDI4MiAyOTggNjEgOTMgMjk5IDM5IDI4MyAKKzIwMCA2MiA3MSAxODcgMjQyIDQgMjkwIDQ5IDI1MSAxMjAgNDMgMTEzIDE0NCAxODEgMjQ1IDczIDI3OCA0MCAxODUgMjAxIDI1MSAyNjEgCis4OCAyNjUgOTQgMTg2IDEzOCAxODQgMjIzIDYxIDU4IDY1IDE3NSAxMDcgNiAyMDUgODEgMTE0IDIwNyAxMzcgNzEgMTEgMTc0IDE3MCAKKzczIDE1MiAxMDggMTEwIDI1IDE0OCAxMSA5OCAyODMgMTUwIDE3IDIyMSAxNDYgMjM3IDExMSA4OCAxMyAxMzkgMzYgMTc5IDE4OSAyMDcgCisyNjMgMyA4NiA0OCAyNzMgMjEgNTEgOTAgNTQgMjg1IDY1IDQ5IDE3NSAyMzMgMjkgMjgwIDI1NyA2IDY0IDM2IDUzIDI1NyAxMzIgODcgCisxMTEgMjI5IDU4IDI5MSAyODggMTg0IDE3MyAxNiAyMDggMjQgMTcwIDIxNCAxOTcgMTY5IDYwIDMwIDQxIDIxMyAxMzQgMiAyMzQgOTIgCisxNDUgODMgMTU1IDUxIDE2NiAyNDMgMjA4IDIwMCAyMzggNDggMjEgNjYgMjAzIDQwIDU5IDE3OCAxNzYgODUgMTk2IDEwNiAxOTUgMjA0IAorMTk0IDE1IDQgMjMgMjgzIDI0IDI5NiAxNDYgNjEgNDMgMjU0IDE4OSAzMSAxOTUgNzggMjYyIDE1MSAxMzAgMjIyIDEyNCAzNCAxMiAKKzIwMiAxMDMgMTI2IDIxNiAxMTIgMjkyIDE0IDExNyAyMjYgODAgMSAyOTcgMTU5IDE4MyAxOSAxNTEgODAgMTc3IDI3NCA4NCA3IDIxOCAKKzI5NCAxODEgMTA0IDI4IDEyNiA5MCAxODAgMjE3IDE0MCAyMjUgNjcgOTAgMjMwIDI2MiAyOTIgMjY2IDcyIDc0IDM5IDI5OCAxMSA0OCAKKzE0NyAzMDAgMjc4IDIxNiAyNTMgMjY1IF4KKzYzOCAxIDc1IDY1IDIyNyA1OCAxMDggMjQwIDI2NyAyNjcgMTg1IDcxIDEzIDk1IDIxMiA3MSAyMzUgMjg1IDE1NCAyMzggNDggMTQ0IAorMTQgMjg4IDIyMSAyMjggNDMgMTY1IDYgMjgzIDI4MCAxNzIgMTI1IDE2IDEyMSAxNDUgMTIyIDI5NyA3NCAzNiAyMjcgMTcgNTEgMjExIAorNCA2NCAxNTcgMSAzOCAyMjQgMjU0IDI4MCAxMzEgNjggMjkxIDE2MiAxNjEgOTQgMTQyIDE0IDE2NSAyNjkgMTQxIDI1MSAyOTggMTQxIAorMjkyIDUxIDE3MCAyNTEgMzUgMTk4IDE3IDEwIDE1NCAyNzkgMTA1IDE3MyAxOTIgMjcyIDI0OSA3OSAxOCAzNiAyNjggNzQgODAgMTcwIAorMjkyIDkyIDIyNyAyODAgMjEzIDE4MiA0NSA4MCAxMjkgMTUwIDYzIDQ5IDI5NiAxODUgMTEyIDcwIDEyNCAxNzEgNTUgMjYzIDUxIDEyOSAKKzEwOSA2IDIwIDMzIDIwMSA4NCAxNDkgMjE1IDk3IDE2OCAzMiAyMTYgMjcgMjM0IDEzMyAyODcgMTEwIDExNCAyNDggMTkwIDkgMTgzIAorMTU2IDE5NCAyMjggMTI1IDI3OSA2NCAxMTYgMTYzIDkgMjY1IDI3MCAyNTIgNjEgOCAxMTYgMjA0IDY2IDI5NCAyMjkgMjM2IDg5IDE2MyAKKzkxIDE2MCAyNCA4NSAyOSAxNDkgMjU2IDE1NCAxOTcgMjEwIDExNSA1NSAxMDggMTU4IDY4IDIwOSA0OCAxMDMgMTc2IDI1OSAyNjIgMjUgCisxNSAxMCAzMSAyMyAxOCA3NyAyMSAxMDMgMjU4IDY5IDE2IDE2MiAyMDIgMTUxIDE3MSAyNzcgMTQ5IDI5NyAyOTYgMjI2IDE2OSA5OSAKKzgzIDcwIDgzIDI5IDI2IDY3IDEwMSAzOSAzMSA2NCA3NSAxMDYgMjg0IDIgNjcgMjI0IDI5NSAzMyAxNjAgMjQ2IDI3NSAyNzUgMTIgNjkgCis5OCA1NyAyNjAgNjkgMTM5IDExNCAyODkgMjQ3IDM4IDE0MiA1NSAyMjIgMjk4IDEwMCAyMzUgMjIgMjExIDI2NyAyMjYgMTI4IDQyIDU0IAorMTk2IDE4NCAxIDI2MCAyNSAxOTYgMTQzIDI0OCAyMzEgMTUxIDIxMiAzMCAxNzggMjU2IDE5NSAyNTQgMjM5IDc0IDM5IDI4IDI2MyAKKzEzMyAyNCAxNjcgMTQzIDIwNyAxNzQgMTIyIDM0IDEzMSA2NSAxODYgMjIwIDc5IDI4MSAyODMgMjM5IDExNSA5NiA1NyAxMzcgMTE3IAorNTIgMTggMTE4IDc4IDEzMiAyMTcgNTMgNDQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5NSA3NCAzMDIgMjc1IDIzNCAxNzQgNDAgMTM5IAorNzMgMjMyIDIxOCAxNjQgMTU4IDI3IDE1MiAxOSAyMjkgMjc3IDIzMSAxOTIgNTAgNTkgNTIgMjQwIDQgMjAgMjE0IDMwIDMwMSAyMDggCisyODIgNDYgMTA2IDI0MyAyNDkgMzggMjY1IDcgNSA5MCAyNzEgMTUgMTMgMTM2IDI2OSAxMDAgMTk0IDI2OSAxODIgNCAyMyAxMDAgMjc2IAorNzkgMjQwIDIyNiAyMTAgMTU2IDExMiAyOSA2NyAxNDIgOTYgNjAgMjMgNTkgMTM0IDUwIDYyIDI0MiAxODIgODYgMTM3IDE1OCAxMDkgCis0NyA3NyA2MiAxNjAgMjg3IDI4IDE5MCA1MyAxMjYgMTI3IDIzNSAyNDQgOTcgMjA5IDg5IDI0NSAyMDUgMjE4IDI0NiA1MyA4NSA3MCAKKzIwNiAyODUgMTEzIDE4MSAxOSAyNzAgMzAgMjYwIDY2IDI1MyAxNzIgMjA3IDIxNSAxNzkgNjMgNSA0OSAyMTQgNzEgNTQgMjM3IDI0MSAKKzMwIDIxOSA5IDIyNCAyMTMgMjIzIDEwMiAxMDkgMyAxMzQgOTEgMTE5IDI3MSA1NiA3MCAxNjUgMjI4IDg0IDIyMiAzNSAxNTcgMjY0IAorMjg1IDE5NSAyOTUgNzcgMTAzIDIxNyAxMiAyOTEgMjAzIDMwMyAxMjMgMTAxIDMwMiAxOTMgMzUgMTE2IDEyMiAyNTYgMjM2IDcgMjY4IAorMzMgMjQyIDE0MSAyOSAxMDggMTk5IDEyNSAyMzggNyA4NyAyODkgMjUgMjM3IDIwMCAyNzcgMTkwIDUwIDIxIDE4NSAxNTMgMTI3IDE1MyAKKzQ1IDM5IDcyIDEyMSAxMDQgNjUgMjY4IDExNSAxMzcgMTk5IDE2NiA3NiAzNiA0NiAxODggNTMgMyAxNzUgMTQ4IDE0OCAyMzAgNDAgOTggCisxNiAyMDMgNDAgMTgwIDEzMCAyNjEgMTc3IDYzIDI3MSA5NyAxMjcgMTk0IDE4NyA2OCAyNTAgMTA1IDEzMiAxMzUgMjQzIDI5MCA5NSAKKzI5NCAyNzAgMjkzIDExOCAzNyA3NSAxODggOTQgNjAgMjA0IDEwNyA0NyAyNTggMTEwIDczIDE5MSAxNjEgMTM1IDI4NCA0MyAxMjQgCisyNTMgMjU0IDE3IDI3MyAxMiAyNTAgMTQ2IDI3NCAxNjQgMTE3IDI3NCAxMjMgNjAgMjQ1IDE2NCA3NiAyMTcgOTQgMTAxIDI2MSAxMzYgCis2IDI0MiAyMjMgMTQzIDE2NiAzMiA5MyA3NSAxNDcgMzcgMzEgMjQ1IDEyMyAxOSAxODggMTM1IDIwMiAyMzMgNjYgMzEgMjg2IDI2NSAKKzQ4IDYyIDExOSAyMzAgMzAzIDQxIDI5MSAyNDQgNTYgMTUyIDYwIDI4NiAyIDEwNSA5MSA3OCAyMTQgMjcgMTExIDI2NiAyMDAgMTQgCisyNDcgNzkgMTk5IDg0IDE4MSAyODIgMTI4IDEgMzAxIDE2NyAyMjUgMTcgMjMyIDI1OSAyMjEgMTg3IDI5MCAxMzYgNDcgMjk5IDI1MiAKKzEwMiAxNTAgMTQ1IDE2MyAxNTcgXgorNjUzIDAgMTggMjk5IDIwNyA0MSAxMTcgMTg0IDE3OSAxNiAyNTIgMTggMjU1IDgzIDIwIDgyIDI2NCAxNTUgMjU3IDIxNiAyMDEgMjk2IAorNTQgMTA3IDMwMyAyNTUgMzkgMjAyIDYxIDIgMjM1IDE1NCAxNTEgODYgOTQgMTYgNzggODQgOTEgMzAgODYgNiAxNTMgMzYgOTMgMjUxIAorMjA5IDI2MiAyNDAgMTM0IDI2NiAxMTQgMTE5IDE4NyAyNDQgOCAyNCAzNSAyMiA3NiA4MSAyNiAzOCA4IDY4IDgwIDQzIDMyIDEgMTI5IAorMjQgNDQgMTkxIDExOCA3MiAyNTEgMTY1IDEzOCAxNDAgOTkgNDAgMTEgNTQgMTUxIDQyIDI3NiAzMDEgMTIyIDE2NCA2NyAyNzEgNTAgCisxODkgMTE1IDcgMTgwIDg3IDIwMCAxNDYgMTg1IDI4NSA2NyA1MyAyMTkgMjMxIDEwNiAxNTMgMSAyMTcgMjcyIDE2NSAxODIgMjY0IAorMTk5IDc1IDIzNyAxNTcgMjE2IDE1NyAxNzIgMzMgNzIgNzcgMTUyIDI4MCA4NyAyNDQgMjcwIDIwNiAyNDEgMjkzIDc3IDI4NCA0MCAKKzIyOSAxOTEgMzAgMTMwIDEzMCAxNzQgMjk4IDEzIDQ4IDI3NCAyOTggNTcgOTMgMjk1IDI3IDI4MyAxOTYgNTQgNjMgMTc5IDIzNCA0IAorMjgyIDM3IDI0MyAxMjAgMzEgMTEzIDEzNiAxODEgMjM3IDY5IDI3NCAzNiAxODEgMTkzIDI1MSAyNTMgODAgMjYxIDkwIDE4NiAxMzggCisxODQgMjIzIDYxIDQ2IDUzIDE3NSAxMDcgNiAxOTcgODEgMTE0IDIwNyAxMjkgNTkgMzA1IDE3MCAxNjIgNzMgMTQ4IDEwMCAxMDIgMTcgCisxNDAgMTEgOTggMjc1IDE0MiA1IDIyMSAxNDYgMjI5IDEwMyA4OCA5IDEzOSAyOCAxNzEgMTg5IDIwMyAyNTUgMzAxIDc4IDQwIDI3MyA5IAorNTEgODYgNTAgMjc3IDU3IDQ5IDE3MSAyMzMgMjEgMjc2IDI1NyAzMDQgNjQgMzIgNDUgMjUzIDEyNCA3OSAxMTEgMjIxIDU4IDI4NyAKKzI4OCAxNzYgMTY5IDEyIDIwNCAyMCAxNzAgMjA2IDE5NyAxNjkgNTYgMjIgNDEgMjA1IDEyNiAzMDAgMjM0IDkyIDE0NSA3OSAxNTUgMzkgCisxNTggMjQzIDIwOCAyMDAgMjM0IDQ4IDIxIDU4IDE5OSA0MCA1NSAxNzggMTcyIDc3IDE5NiA5OCAxODcgMjAwIDE5MCAzIDIzIDI3OSAKKzE2IDI5NiAxNDIgNDkgMzkgMjQ2IDE4NSAyMyAxOTEgNzQgMjU0IDE1MSAxMzAgMjE4IDExNiAzNCA0IDE5NCA5NSAxMjIgMjA4IDExMiAKKzI5MiA2IDEwOSAyMTggNzIgMjk1IDI4OSAxNTkgMTc1IDE5IDE0MyA3NiAxNjkgMjc0IDgwIDMwNSAyMTQgMjg2IDE3MyAxMDQgMjAgCisxMjYgODIgMTc2IDIxMyAxMzYgMjI1IDU1IDkwIDIzMCAyNjIgMjg0IDI1OCA2MCA3MCAzOSAyOTAgMyA0NCAxNDcgMzAwIDI3OCAyMTYgCisyNDUgMzUgNzUgNjMgMjIzIDUyIDEwNCAyMzggMjYzIDI2NyAxODUgNjcgOSA5NSAyMTAgNzEgMjMzIDI4MyAxNTIgMjM2IDQyIDE0NCA4IAorMjg2IDIxNyAyMjggNDEgMTYxIDIgMjc5IDI3OCAxNzIgMTIxIDE0IDExOSAxNDMgMTIwIDI5MyA2OCAzNiAyMjUgMTEgNDUgMjA5IDU4IAorMTU1IDMwMSAzNCAyMjIgMjUyIDI4MCAxMzEgNjIgMjkxIDE2MiAxNjEgOTAgMTQyIDE0IDE2MyAyNjcgMTQxIDI0OSAyOTQgMTM5IDI5MCAKKzQ3IDE2OCAyNDcgMjkgMTk4IDEzIDQgMTUwIDI3NyAxMDEgMTczIDE5MiAyNjggMjQ3IDczIDE2IDM0IDI2NiA3MCA3NCAxNjYgMjg4IAorODggMjI3IDI3NiAyMTMgMTgwIDQzIDc2IDEyNSAxNTAgNTkgNDMgMjk0IDE4MyAxMDggNjggMTI0IDE2NyA1MyAyNjMgNDkgMTI3IDEwOSAKKzE0IDMxIDIwMSA3OCAzMDIgMTQ5IDIxNSA5NSAxNjYgMjYgMjEyIDIxIDIzMiAxMzMgMjgzIDEwOCAxMTIgMjQ4IDE4OCA5IDE4MyAxNTIgCisxOTIgMjI0IDEyMyAyNzkgNjAgMTE0IDE2MyA1IDI2NSAyNzAgMjUwIDU5IDggMTEyIDIwNCA2NCAyOTQgMjI3IDIzMiA4OSAxNTkgODcgCisxNTYgMjIgODUgMjMgMTQ3IDI1NiAxNTQgMTk1IDIxMCAxMTUgNTEgMzA0IDEwOCAxNTYgNjYgMjA5IDQ0IDEwMyAxNzYgMjU3IDI2MCAKKzE5IDExIDEwIDI3IDIxIDE0IDc1IDE5IDk5IDI1OCA2OSAxMiAxNjAgMjAyIDE0OSAxNzEgMjc3IDE0NSAyOTcgMjkyIDIyNCAxNjcgOTcgCis4MSA3MCA4MyAyOSAyNCA2NyA5NyAzNyAyNSA2MiA3MyAxMDQgMjgyIDIgNjEgMjIwIDI5MyAzMyAxNjAgMjQ2IDI3MyAyNzEgNiA2NSAKKzk0IDUxIDI2MCA2MyAxMzUgMTEwIDI4OSAyNDcgMzggMTQwIDU1IDIyMiAyOTYgOTggMjMxIDE4IDIxMSAyNjUgMjI2IDEyNiAzOCA1MiAKKzE5MiAxODAgMzA1IDI1OCAyNSAxOTQgMTM5IDI0NiAyMjkgMTQ3IDIxMiAzMCAxNzQgMjU0IDE5NSAyNTQgMjM5IDcyIDMzIDI4IDI1OSAKKzEzMSAxOCAxNjcgMTQxIDIwNSAxNzAgMTE4IDI4IDEyNyA2NSAxODIgMjIwIDc1IDI4MSAyODEgMjM3IDExMyA5MiA1NyAxMzcgMTEzIAorNDggMTIgMTE2IDc4IDEyOCAyMTUgNTEgNDIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5MSAxNjEgXgorNjUzIDAgMjk2IDI3NSAyMjggMTc0IDM0IDEzNiA2NyAyMjkgMjE4IDE1OCAxNTggMjQgMTQ5IDEzIDIyMyAyNzEgMjI1IDE4NiA0MSA1OSAKKzUyIDIzNCAzMDIgMjAgMjE0IDIxIDI5NSAyMDIgMjgyIDQ2IDEwNiAyNDAgMjQ5IDI5IDI2MiA0IDIgODcgMjcxIDE1IDQgMTM2IDI2OSAKKzEwMCAxODggMjYzIDE4MiAxIDE0IDk0IDI3MCA3NiAyNDAgMjIwIDIwNyAxNTYgMTA5IDI2IDY0IDEzNiA5NiA1MSAxNyA1MyAxMzQgNDcgCis1MyAyMzkgMTc2IDgzIDEzNCAxNTIgMTA2IDM4IDcxIDU5IDE1NyAyODcgMjUgMjk4IDE5MCA0NCAxMjMgMTIxIDIzNSAyNDEgOTEgMjA2IAorODMgMjM5IDIwNSAyMTIgMjQwIDQ3IDgyIDYxIDIwNiAyODUgMTEwIDE3NSAxMCAyNjQgMjQgMjU0IDY2IDI1MyAxNjYgMjAxIDIwOSAKKzE3NiA1NCA1IDQ2IDIxMSA2MiA0OCAyMzEgMjM4IDI3IDIxMyA2IDIyNCAyMTAgMjIwIDEwMiAxMDMgMyAxMzEgODggMTEzIDI2OCA1NiAKKzY0IDE2NSAyMjUgODEgMjE5IDI5IDE1NyAyNTggMjc5IDE5MiAyOTUgNjggMTAwIDIxNyA5IDI4OCAyMDMgMjk3IDExNyA5OCAzMDIgCisxOTMgMzIgMTE2IDEyMiAyNTAgMjM2IDcgMjY4IDI3IDI0MiAxMzUgMjMgMTA1IDE5NiAxMjUgMjM4IDMwNSA4NCAyODMgMjIgMjM0IAorMTk3IDI3NCAxODQgNTAgMTIgMTc5IDE0NyAxMjcgMTUzIDQ1IDMzIDYzIDEyMSAxMDEgNTkgMjYyIDEwOSAxMzEgMTkzIDE2NiA2NyAyNyAKKzQwIDE4OCA1MyAxNzIgMTQ4IDE0MiAyMjQgMzcgOTUgNyAyMDAgMzEgMTc3IDEyNyAyNTggMTc0IDYzIDI2NSA5NyAxMjQgMTk0IDE4MSAKKzYyIDI1MCAxMDIgMTMyIDEzMiAyMzcgMjkwIDg5IDI5MSAyNjcgMjkwIDExOCAzNyA2NiAxODUgOTQgNjAgMjAxIDEwNCA0NyAyNTUgCisxMTAgNzAgMTg4IDE1OCAxMjkgMjc4IDQzIDExOCAyNDcgMjQ4IDE0IDI2NyAxMiAyNDcgMTQzIDI2OCAxNjEgMTE3IDI3MSAxMjAgNTcgCisyNDIgMTY0IDc2IDIxMSA5MSAxMDEgMjYxIDEzMyAzIDIzNiAyMTcgMTQzIDE2MyAzMiA4NyA2OSAxNDQgMzQgMzEgMjQ1IDEyMyAxNiAKKzE4MiAxMzUgMTk2IDIzMCA2MCAyOCAyODYgMjU5IDQ1IDYyIDExNiAyMjcgMzAzIDM1IDI4NSAyNDQgNTAgMTQ2IDU0IDI4MyAzMDAgCisxMDUgOTEgNzIgMjA4IDI3IDEwOCAyNjAgMTk0IDggMjQ0IDc5IDE5OSA4NCAxNzggMjc2IDEyOCAzMDIgMjk4IDE2MSAyMjIgMTcgMjI2IAorMjU5IDIxOCAxODcgMjg3IDEzMCA0NCAyOTYgMjQ2IDk5IDE0NCAxMzkgMTYwIDQ0IDE4IDI5OSAyMDUgMzkgMTE1IDE4MyAxNzkgMTMgCisyNTIgMTcgMjU1IDgxIDE3IDgyIDI2MyAxNTMgMjU1IDIxNSAxOTkgMjk0IDUzIDEwNSAzMDEgMjU0IDM3IDIwMCA2MCAzMDYgMjMzIAorMTUzIDE1MCA4NiA5MyAxNiA3NyA4MiA5MCAyOCA4NCA1IDE1MSAzMyA5MiAyNTAgMjA3IDI2MSAyMzggMTMyIDI2NiAxMTIgMTE5IDE4NiAKKzI0MyA2IDIyIDMyIDE5IDczIDc5IDI2IDM1IDcgNjYgODAgNDEgMzAgMzA2IDEyOCAyNCA0NCAxOTEgMTE3IDY5IDI0OSAxNjMgMTM3IAorMTQwIDk5IDM5IDEwIDU0IDE0OSA0MiAyNzYgMzAxIDEyMCAxNjIgNjQgMjcwIDQ3IDE4NyAxMTQgNSAxODAgODYgMTk4IDE0NSAxODMgCisyODQgNjYgNTEgMjE5IDIzMSAxMDQgMTUyIDEgMjE2IDI3MiAxNjQgMTgxIDI2NCAxOTcgNzIgMjM3IDE1NiAyMTQgMTU1IDE3MCAzMSAKKzcyIDc0IDE1MiAyNzkgODcgMjQyIDI2OSAyMDUgMjQxIDI5MyA3NyAyODQgMzcgMjI5IDE4OSAyOSAxMjggMTI5IDE3MyAyOTcgMTIgNDUgCisyNzIgMjk4IDU2IDkzIDI5NCAyNCAyODMgMTk1IDUyIDYxIDE3NyAyMzIgNCAyODAgMzQgMjQxIDEyMCAyOCAxMTMgMTM0IDE4MSAyMzUgCis2OCAyNzMgMzUgMTgwIDE5MSAyNTEgMjUxIDc4IDI2MCA4OSAxODYgMTM4IDE4NCAyMjMgNjEgNDMgNTAgMTc1IDEwNyA2IDE5NSA4MSAKKzExNCAyMDcgMTI3IDU2IDMwMyAxNjkgMTYwIDczIDE0NyA5OCAxMDAgMTUgMTM4IDExIDk4IDI3MyAxNDAgMiAyMjEgMTQ2IDIyNyAxMDEgCis4OCA4IDEzOSAyNiAxNjkgMTg5IDIwMiAyNTMgMzAwIDc2IDM4IDI3MyA2IDUxIDg1IDQ5IDI3NSA1NSA0OSAxNzAgMjMzIDE5IDI3NSAKKzI1NyAzMDMgNjQgMzEgNDMgMjUyIDEyMiA3NyAxMTEgMjE5IDU4IDI4NiAyODggMTc0IDE2OCAxMSAyMDMgMTkgMTcwIDIwNCAxOTcgCisxNjkgNTUgMjAgNDEgMjAzIDEyNCAyOTkgMjM0IDkyIDE0NSA3OCAxNTUgMzYgMTU2IDI0MyAyMDggMjAwIDIzMyA0OCAyMSA1NiAxOTggCis0MCA1NCAxNzggMTcxIDc1IDE5NiA5NiAxODUgMTk5IDE4OSAzMDYgMjMgMjc4IDE0IDI5NiAxNDEgNDYgMzggMjQ0IDE4NCAyMSAxOTAgCis3MyAyNTIgMTUxIDEzMCAyMTcgMTE0IDM0IDIgMTkyIDkzIDEyMSAyMDYgMTEyIDI5MiA0IDEwNyAyMTYgNzAgMjkzIDExMiBeCis2NDYgMSAxNTkgMTY5IDE5IDEzNyA3MyAxNjMgMjc0IDc3IDMwMiAyMTEgMjgwIDE2NyAxMDQgMTQgMTI2IDc2IDE3MyAyMTAgMTMzIAorMjI1IDQ2IDkwIDIzMCAyNjIgMjc4IDI1MiA1MSA2NyAzOSAyODQgMzA2IDQxIDE0NyAzMDAgMjc4IDIxNiAyMzkgMzUgNzUgNjAgMjE3IAorNDMgOTggMjM1IDI1NyAyNjcgMTg1IDYxIDMgOTUgMjA3IDcxIDIzMCAyODAgMTQ5IDIzMyAzMyAxNDQgMzA4IDI4MyAyMTEgMjI4IDM4IAorMTU1IDMwNSAyNzMgMjc1IDE3MiAxMTUgMTEgMTE2IDE0MCAxMTcgMjg3IDU5IDM2IDIyMiAyIDM2IDIwNiAzMDMgNDkgMTUyIDI5NSAyOCAKKzIxOSAyNDkgMjgwIDEzMSA1MyAyOTEgMTYyIDE2MSA4NCAxNDIgMTQgMTYwIDI2NCAxNDEgMjQ2IDI4OCAxMzYgMjg3IDQxIDE2NSAyNDEgCisyMCAxOTggNyAzMDQgMTQ0IDI3NCA5NSAxNzMgMTkyIDI2MiAyNDQgNjQgMTMgMzEgMjYzIDY0IDY1IDE2MCAyODIgODIgMjI3IDI3MCAKKzIxMyAxNzcgNDAgNzAgMTE5IDE1MCA1MyAzNCAyOTEgMTgwIDEwMiA2NSAxMjQgMTYxIDUwIDI2MyA0NiAxMjQgMTA5IDMwMCA1IDI4IAorMjAxIDY5IDI5OSAxNDkgMjE1IDkyIDE2MyAxNyAyMDYgMTIgMjI5IDEzMyAyNzcgMTA1IDEwOSAyNDggMTg1IDkgMTgzIDE0NiAxODkgCisyMTggMTIwIDI3OSA1NCAxMTEgMTYzIDMwOCAyNjUgMjcwIDI0NyA1NiA4IDEwNiAyMDQgNjEgMjk0IDIyNCAyMjYgODkgMTUzIDgxIAorMTUwIDE5IDg1IDE0IDE0NCAyNTYgMTU0IDE5MiAyMTAgMTE1IDQ1IDMwNCAxMDggMTUzIDYzIDIwOSAzOCAxMDMgMTc2IDI1NCAyNTcgCisxMCA1IDEwIDIxIDE4IDggNzIgMTYgOTMgMjU4IDY5IDYgMTU3IDIwMiAxNDYgMTcxIDI3NyAxMzkgMjk3IDI4NiAyMjEgMTY0IDk0IDc4IAorNzAgODMgMjkgMjEgNjcgOTEgMzQgMTYgNTkgNzAgMTAxIDI3OSAyIDUyIDIxNCAyOTAgMzMgMTYwIDI0NiAyNzAgMjY1IDMwNiA1OSA4OCAKKzQyIDI2MCA1NCAxMjkgMTA0IDI4OSAyNDcgMzggMTM3IDU1IDIyMiAyOTMgOTUgMjI1IDEyIDIxMSAyNjIgMjI2IDEyMyAzMiA0OSAxODYgCisxNzQgMzA1IDI1NSAyNSAxOTEgMTMzIDI0MyAyMjYgMTQxIDIxMiAzMCAxNjggMjUxIDE5NSAyNTQgMjM5IDY5IDI0IDI4IDI1MyAxMjggCis5IDE2NyAxMzggMjAyIDE2NCAxMTIgMTkgMTIxIDY1IDE3NiAyMjAgNjkgMjgxIDI3OCAyMzQgMTEwIDg2IDU3IDEzNyAxMDcgNDIgMyAKKzExMyA3OCAxMjIgMjEyIDQ4IDM5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyODUgNzQgMjkyIDI3NSAyMjQgMTc0IDMwIDEzNCA2MyAyMjcgCisyMTggMTU0IDE1OCAyMiAxNDcgOSAyMTkgMjY3IDIyMSAxODIgMzUgNTkgNTIgMjMwIDI5OCAyMCAyMTQgMTUgMjkxIDE5OCAyODIgNDYgCisxMDYgMjM4IDI0OSAyMyAyNjAgMiA4NSAyNzEgMTUgMzA3IDEzNiAyNjkgMTAwIDE4NCAyNTkgMTgyIDMwOCA4IDkwIDI2NiA3NCAyNDAgCisyMTYgMjA1IDE1NiAxMDcgMjQgNjIgMTMyIDk2IDQ1IDEzIDQ5IDEzNCA0NSA0NyAyMzcgMTcyIDgxIDEzMiAxNDggMTA0IDMyIDY3IDU3IAorMTU1IDI4NyAyMyAyOTQgMTkwIDM4IDEyMSAxMTcgMjM1IDIzOSA4NyAyMDQgNzkgMjM1IDIwNSAyMDggMjM2IDQzIDgwIDU1IDIwNiAKKzI4NSAxMDggMTcxIDQgMjYwIDIwIDI1MCA2NiAyNTMgMTYyIDE5NyAyMDUgMTc0IDQ4IDUgNDQgMjA5IDU2IDQ0IDIyNyAyMzYgMjUgCisyMDkgNCAyMjQgMjA4IDIxOCAxMDIgOTkgMyAxMjkgODYgMTA5IDI2NiA1NiA2MCAxNjUgMjIzIDc5IDIxNyAyNSAxNTcgMjU0IDI3NSAKKzE5MCAyOTUgNjIgOTggMjE3IDcgMjg2IDIwMyAyOTMgMTEzIDk2IDMwMiAxOTMgMzAgMTE2IDEyMiAyNDYgMjM2IDcgMjY4IDIzIDI0MiAKKzEzMSAxOSAxMDMgMTk0IDEyNSAyMzggMzAxIDgyIDI3OSAyMCAyMzIgMTk1IDI3MiAxODAgNTAgNiAxNzUgMTQzIDEyNyAxNTMgNDUgMjkgCis1NyAxMjEgOTkgNTUgMjU4IDEwNSAxMjcgMTg5IDE2NiA2MSAyMSAzNiAxODggNTMgMzA3IDE3MCAxNDggMTM4IDIyMCAzNSA5MyAxIAorMTk4IDI1IDE3NSAxMjUgMjU2IDE3MiA2MyAyNjEgOTcgMTIyIDE5NCAxNzcgNTggMjUwIDEwMCAxMzIgMTMwIDIzMyAyOTAgODUgMjg5IAorMjY1IDI4OCAxMTggMzcgNjAgMTgzIDk0IDYwIDE5OSAxMDIgNDcgMjUzIDExMCA2OCAxODYgMTU2IDEyNSAyNzQgNDMgMTE0IDI0MyAKKzI0NCAxMiAyNjMgMTIgMjQ1IDE0MSAyNjQgMTU5IDExNyAyNjkgMTE4IDU1IDI0MCAxNjQgNzYgMjA3IDg5IDEwMSAyNjEgMTMxIDEgCisyMzIgMjEzIDE0MyAxNjEgMzIgODMgNjUgMTQyIDMyIDMxIDI0NSAxMjMgMTQgMTc4IDEzNSAxOTIgMjI4IDU2IDI2IDI4NiAyNTUgNDMgCis2MiAxMTQgMjI1IDMwMyAzMSAyODEgMjQ0IDQ2IDE0MiA1MCAyODEgMjk2IDEwNSA5MSAyMzggXgorNjQ3IDAgMjAwIDI3IDEwNCAyNTIgMTg2IDI0MCA3OSAxOTkgODQgMTc0IDI2OCAxMjggMjk4IDI5NCAxNTMgMjE4IDE3IDIxOCAyNTkgCisyMTQgMTg3IDI4MyAxMjIgNDAgMjkyIDIzOCA5NSAxMzYgMTMxIDE1NiAzNiAxOCAyOTkgMTk3IDMxIDEwNyAxNzkgMTc5IDEgMjUyIDEzIAorMjU1IDczIDUgODIgMjU5IDE0NSAyNDcgMjExIDE5MSAyODYgNDkgOTcgMjkzIDI1MCAyOSAxOTIgNTYgMjk4IDIyNSAxNDkgMTQ2IDg2IAorODkgMTYgNzMgNzQgODYgMjAgNzYgMSAxNDMgMjEgODggMjQ2IDE5OSAyNTcgMjMwIDEyNCAyNjYgMTA0IDExOSAxODIgMjM5IDMwOSAxNCAKKzIwIDcgNjEgNzEgMjYgMjMgMyA1OCA4MCAzMyAyMiAzMDIgMTI0IDI0IDQ0IDE5MSAxMTMgNTcgMjQxIDE1NSAxMzMgMTQwIDk5IDM1IDYgCis1NCAxNDEgNDIgMjc2IDMwMSAxMTIgMTU0IDUyIDI2NiAzNSAxNzkgMTEwIDMwOCAxODAgODIgMTkwIDE0MSAxNzUgMjgwIDYyIDQzIAorMjE5IDIzMSA5NiAxNDggMSAyMTIgMjcyIDE2MCAxNzcgMjY0IDE4OSA2MCAyMzcgMTUyIDIwNiAxNDcgMTYyIDIzIDcyIDYyIDE1MiAKKzI3NSA4NyAyMzQgMjY1IDIwMSAyNDEgMjkzIDc3IDI4NCAyNSAyMjkgMTgxIDI1IDEyMCAxMjUgMTY5IDI5MyA4IDMzIDI2NCAyOTggNTIgCis5MyAyOTAgMTIgMjgzIDE5MSA0NCA1MyAxNjkgMjI0IDQgMjcyIDIyIDIzMyAxMjAgMTYgMTEzIDEyNiAxODEgMjI3IDY0IDI2OSAzMSAKKzE3NiAxODMgMjUxIDI0MyA3MCAyNTYgODUgMTg2IDEzOCAxODQgMjIzIDYxIDMxIDM4IDE3NSAxMDcgNiAxODcgODEgMTE0IDIwNyAxMTkgCis0NCAyOTUgMTY1IDE1MiA3MyAxNDMgOTAgOTIgNyAxMzAgMTEgOTggMjY1IDEzMiAzMDEgMjIxIDE0NiAyMTkgOTMgODggNCAxMzkgMTggCisxNjEgMTg5IDE5OCAyNDUgMjk2IDY4IDMwIDI3MyAzMDUgNTEgODEgNDUgMjY3IDQ3IDQ5IDE2NiAyMzMgMTEgMjcxIDI1NyAyOTkgNjQgCisyNyAzNSAyNDggMTE0IDY5IDExMSAyMTEgNTggMjgyIDI4OCAxNjYgMTY0IDcgMTk5IDE1IDE3MCAxOTYgMTk3IDE2OSA1MSAxMiA0MSAKKzE5NSAxMTYgMjk1IDIzNCA5MiAxNDUgNzQgMTU1IDI0IDE0OCAyNDMgMjA4IDIwMCAyMjkgNDggMjEgNDggMTk0IDQwIDUwIDE3OCAxNjcgCis2NyAxOTYgODggMTc3IDE5NSAxODUgMjk5IDMwNiAyMyAyNzQgNiAyOTYgMTM3IDM0IDM0IDIzNiAxODAgMTMgMTg2IDY5IDI0NCAxNTEgCisxMzAgMjEzIDEwNiAzNCAzMDUgMTg0IDg1IDExNyAxOTggMTEyIDI5MiAzMDcgOTkgMjA4IDYyIDI4NSAyNzkgMTU5IDE2NSAxOSAxMzMgCis3MSAxNTkgMjc0IDc1IDMwMCAyMDkgMjc2IDE2MyAxMDQgMTAgMTI2IDcyIDE3MSAyMDggMTMxIDIyNSA0MCA5MCAyMzAgMjYyIDI3NCAKKzI0OCA0NSA2NSAzOSAyODAgMzA0IDM5IDE0NyAzMDAgMjc4IDIxNiAyMzUgMzUgNzUgNTggMjEzIDM3IDk0IDIzMyAyNTMgMjY3IDE4NSAKKzU3IDMxMCA5NSAyMDUgNzEgMjI4IDI3OCAxNDcgMjMxIDI3IDE0NCAzMDQgMjgxIDIwNyAyMjggMzYgMTUxIDMwMyAyNjkgMjczIDE3MiAKKzExMSA5IDExNCAxMzggMTE1IDI4MyA1MyAzNiAyMjAgMzA3IDMwIDIwNCAzMDEgNDMgMTUwIDI5MSAyNCAyMTcgMjQ3IDI4MCAxMzEgNDcgCisyOTEgMTYyIDE2MSA4MCAxNDIgMTQgMTU4IDI2MiAxNDEgMjQ0IDI4NCAxMzQgMjg1IDM3IDE2MyAyMzcgMTQgMTk4IDMgMzAwIDE0MCAKKzI3MiA5MSAxNzMgMTkyIDI1OCAyNDIgNTggMTEgMjkgMjYxIDYwIDU5IDE1NiAyNzggNzggMjI3IDI2NiAyMTMgMTc1IDM4IDY2IDExNSAKKzE1MCA0OSAyOCAyODkgMTc4IDk4IDYzIDEyNCAxNTcgNDggMjYzIDQ0IDEyMiAxMDkgMjk2IDMxMCAyNiAyMDEgNjMgMjk3IDE0OSAyMTUgCis5MCAxNjEgMTEgMjAyIDYgMjI3IDEzMyAyNzMgMTAzIDEwNyAyNDggMTgzIDkgMTgzIDE0MiAxODcgMjE0IDExOCAyNzkgNTAgMTA5IAorMTYzIDMwNiAyNjUgMjcwIDI0NSA1NCA4IDEwMiAyMDQgNTkgMjk0IDIyMiAyMjIgODkgMTQ5IDc3IDE0NiAxNyA4NSA4IDE0MiAyNTYgCisxNTQgMTkwIDIxMCAxMTUgNDEgMzA0IDEwOCAxNTEgNjEgMjA5IDM0IDEwMyAxNzYgMjUyIDI1NSA0IDEgMTAgMTcgMTYgNCA3MCAxNCAKKzg5IDI1OCA2OSAyIDE1NSAyMDIgMTQ0IDE3MSAyNzcgMTM1IDI5NyAyODIgMjE5IDE2MiA5MiA3NiA3MCA4MyAyOSAxOSA2NyA4NyAzMiAKKzEwIDU3IDY4IDk5IDI3NyAyIDQ2IDIxMCAyODggMzMgMTYwIDI0NiAyNjggMjYxIDMwMiA1NSA4NCAzNiAyNjAgNDggMTI1IDEwMCAyODkgCisyNDcgMzggMTM1IDU1IDIyMiAyOTEgOTMgMjIxIDggMjExIDI2MCAyMjYgMTIxIDI4IDQ3IDE4MiAxNzAgMzA1IDI1MyAyNSAxODkgMTI5IAorMjQxIDIyNCAxMzcgMjEyIDMwIDE2NCAyNDkgMTk1IDI1NCAyMzkgODYgXgorNjY1IDAgMTUgMjggMjQ3IDEyNSAxNjcgMTM1IDE5OSAxNTggMTA2IDEwIDExNSA2NSAxNzAgMjIwIDYzIDI4MSAyNzUgMjMxIDEwNyA4MCAKKzU3IDEzNyAxMDEgMzYgMzA2IDExMCA3OCAxMTYgMjA5IDQ1IDM2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNzkgNzQgMjg2IDI3NSAyMTggCisxNzQgMjQgMTMxIDU3IDIyNCAyMTggMTQ4IDE1OCAxOSAxNDQgMyAyMTMgMjYxIDIxNSAxNzYgMjYgNTkgNTIgMjI0IDI5MiAyMCAyMTQgCis2IDI4NSAxOTIgMjgyIDQ2IDEwNiAyMzUgMjQ5IDE0IDI1NyAzMTEgMzA5IDgyIDI3MSAxNSAzMDEgMTM2IDI2OSAxMDAgMTc4IDI1MyAKKzE4MiAzMDggMzExIDg0IDI2MCA3MSAyNDAgMjEwIDIwMiAxNTYgMTA0IDIxIDU5IDEyNiA5NiAzNiA3IDQzIDEzNCA0MiAzOCAyMzQgCisxNjYgNzggMTI5IDE0MiAxMDEgMjMgNjEgNTQgMTUyIDI4NyAyMCAyODggMTkwIDI5IDExOCAxMTEgMjM1IDIzNiA4MSAyMDEgNzMgMjI5IAorMjA1IDIwMiAyMzAgMzcgNzcgNDYgMjA2IDI4NSAxMDUgMTY1IDMwNyAyNTQgMTQgMjQ0IDY2IDI1MyAxNTYgMTkxIDE5OSAxNzEgMzkgNSAKKzQxIDIwNiA0NyAzOCAyMjEgMjMzIDIyIDIwMyAxIDIyNCAyMDUgMjE1IDEwMiA5MyAzIDEyNiA4MyAxMDMgMjYzIDU2IDU0IDE2NSAyMjAgCis3NiAyMTQgMTkgMTU3IDI0OCAyNjkgMTg3IDI5NSA1MyA5NSAyMTcgNCAyODMgMjAzIDI4NyAxMDcgOTMgMzAyIDE5MyAyNyAxMTYgMTIyIAorMjQwIDIzNiA3IDI2OCAxNyAyNDIgMTI1IDEzIDEwMCAxOTEgMTI1IDIzOCAyOTUgNzkgMjczIDE3IDIyOSAxOTIgMjY5IDE3NCA1MCAKKzMwOSAxNjkgMTM3IDEyNyAxNTMgNDUgMjMgNDggMTIxIDk2IDQ5IDI1MiA5OSAxMjEgMTgzIDE2NiA1MiAxMiAzMCAxODggNTMgMzA3IAorMTY3IDE0OCAxMzIgMjE0IDMyIDkwIDMwNCAxOTUgMTYgMTcyIDEyMiAyNTMgMTY5IDYzIDI1NSA5NyAxMTkgMTk0IDE3MSA1MiAyNTAgCis5NyAxMzIgMTI3IDIyNyAyOTAgNzkgMjg2IDI2MiAyODUgMTE4IDM3IDUxIDE4MCA5NCA2MCAxOTYgOTkgNDcgMjUwIDExMCA2NSAxODMgCisxNTMgMTE5IDI2OCA0MyAxMDggMjM3IDIzOCA5IDI1NyAxMiAyNDIgMTM4IDI1OCAxNTYgMTE3IDI2NiAxMTUgNTIgMjM3IDE2NCA3NiAKKzIwMSA4NiAxMDEgMjYxIDEyOCAzMTAgMjI2IDIwNyAxNDMgMTU4IDMyIDc3IDU5IDEzOSAyOSAzMSAyNDUgMTIzIDExIDE3MiAxMzUgCisxODYgMjI1IDUwIDIzIDI4NiAyNDkgNDAgNjIgMTExIDIyMiAzMDMgMjUgMjc1IDI0NCA0MCAxMzYgNDQgMjc4IDI5MCAxMDUgOTEgNjIgCisxOTggMjcgMTAzIDI1MCAxODQgMzEwIDIzOSA3OSAxOTkgODQgMTczIDI2NiAxMjggMjk3IDI5MyAxNTEgMjE3IDE3IDIxNiAyNTkgMjEzIAorMTg3IDI4MiAxMjAgMzkgMjkxIDIzNiA5NCAxMzQgMTI5IDE1NSAzNCAxOCAyOTkgMTk1IDI5IDEwNSAxNzggMTc5IDMxMCAyNTIgMTIgCisyNTUgNzEgMiA4MiAyNTggMTQzIDI0NSAyMTAgMTg5IDI4NCA0OCA5NSAyOTEgMjQ5IDI3IDE5MCA1NSAyOTYgMjIzIDE0OCAxNDUgODYgCis4OCAxNiA3MiA3MiA4NSAxOCA3NCAxNDEgMTggODcgMjQ1IDE5NyAyNTYgMjI4IDEyMiAyNjYgMTAyIDExOSAxODEgMjM4IDMwOCAxMiAKKzE3IDQgNTggNjkgMjYgMjAgMiA1NiA4MCAzMSAyMCAzMDEgMTIzIDI0IDQ0IDE5MSAxMTIgNTQgMjM5IDE1MyAxMzIgMTQwIDk5IDM0IDUgCis1NCAxMzkgNDIgMjc2IDMwMSAxMTAgMTUyIDQ5IDI2NSAzMiAxNzcgMTA5IDMwNyAxODAgODEgMTg4IDE0MCAxNzMgMjc5IDYxIDQxIAorMjE5IDIzMSA5NCAxNDcgMSAyMTEgMjcyIDE1OSAxNzYgMjY0IDE4NyA1NyAyMzcgMTUxIDIwNCAxNDUgMTYwIDIxIDcyIDU5IDE1MiAKKzI3NCA4NyAyMzIgMjY0IDIwMCAyNDEgMjkzIDc3IDI4NCAyMiAyMjkgMTc5IDI0IDExOCAxMjQgMTY4IDI5MiA3IDMwIDI2MiAyOTggNTEgCis5MyAyODkgOSAyODMgMTkwIDQyIDUxIDE2NyAyMjIgNCAyNzAgMTkgMjMxIDEyMCAxMyAxMTMgMTI0IDE4MSAyMjUgNjMgMjY4IDMwIAorMTc1IDE4MSAyNTEgMjQxIDY4IDI1NSA4NCAxODYgMTM4IDE4NCAyMjMgNjEgMjggMzUgMTc1IDEwNyA2IDE4NSA4MSAxMTQgMjA3IDExNyAKKzQxIDI5MyAxNjQgMTUwIDczIDE0MiA4OCA5MCA1IDEyOCAxMSA5OCAyNjMgMTMwIDI5OSAyMjEgMTQ2IDIxNyA5MSA4OCAzIDEzOSAxNiAKKzE1OSAxODkgMTk3IDI0MyAyOTUgNjYgMjggMjczIDMwMyA1MSA4MCA0NCAyNjUgNDUgNDkgMTY1IDIzMyA5IDI3MCAyNTcgMjk4IDY0IAorMjYgMzMgMjQ3IDExMiA2NyAxMTEgMjA5IDU4IDI4MSAyODggMTY0IDE2MyA2IDE5OCAxNCAxNzAgMTk0IDE5NyAxNjkgNTAgMTAgNDEgCisxOTMgMTE0IDI5NCAyMzQgOTIgMTQ1IDczIDE1NSAyMSAxNDYgMjQzIDIwOCAyMDAgMjI4IDQ4IDIxIDQ2IDE5MyA0MCA0OSAxNzggMTY2IAorNjUgMTk2IDg2IDE3NSAxOTQgMTg0IDI5NyAzMDYgMjMgMjczIDIwNiBeCis2NDEgMCAyOTYgMTM0IDI1IDMxIDIzMCAxNzcgNyAxODMgNjYgMjM4IDE1MSAxMzAgMjEwIDEwMCAzNCAzMDIgMTc4IDc5IDExNCAxOTIgCisxMTIgMjkyIDMwNCA5MyAyMDIgNTYgMjc5IDI3MyAxNTkgMTU5IDE5IDEyNyA2OCAxNTMgMjc0IDcyIDI5NyAyMDYgMjcwIDE1NyAxMDQgCis0IDEyNiA2NiAxNjggMjA1IDEyOCAyMjUgMzEgOTAgMjMwIDI2MiAyNjggMjQyIDM2IDYyIDM5IDI3NCAzMDEgMzYgMTQ3IDMwMCAyNzggCisyMTYgMjI5IDM1IDc1IDU1IDIwNyAyOCA4OCAyMzAgMjQ3IDI2NyAxODUgNTEgMzA3IDk1IDIwMiA3MSAyMjUgMjc1IDE0NCAyMjggMTggCisxNDQgMjk4IDI3OCAyMDEgMjI4IDMzIDE0NSAzMDAgMjYzIDI3MCAxNzIgMTA1IDYgMTExIDEzNSAxMTIgMjc3IDQ0IDM2IDIxNyAzMDEgCisyMSAyMDEgMjk4IDM0IDE0NyAyODUgMTggMjE0IDI0NCAyODAgMTMxIDM4IDI5MSAxNjIgMTYxIDc0IDE0MiAxNCAxNTUgMjU5IDE0MSAKKzI0MSAyNzggMTMxIDI4MiAzMSAxNjAgMjMxIDUgMTk4IDMxMSAyOTQgMTM0IDI2OSA4NSAxNzMgMTkyIDI1MiAyMzkgNDkgOCAyNiAyNTggCis1NCA1MCAxNTAgMjcyIDcyIDIyNyAyNjAgMjEzIDE3MiAzNSA2MCAxMDkgMTUwIDQzIDE5IDI4NiAxNzUgOTIgNjAgMTI0IDE1MSA0NSAKKzI2MyA0MSAxMTkgMTA5IDI5MCAzMDQgMjMgMjAxIDU0IDI5NCAxNDkgMjE1IDg3IDE1OCAyIDE5NiAzMTEgMjI0IDEzMyAyNjcgMTAwIAorMTA0IDI0OCAxODAgOSAxODMgMTM2IDE4NCAyMDggMTE1IDI3OSA0NCAxMDYgMTYzIDMwMyAyNjUgMjcwIDI0MiA1MSA4IDk2IDIwNCA1NiAKKzI5NCAyMTkgMjE2IDg5IDE0MyA3MSAxNDAgMTQgODUgMzEzIDEzOSAyNTYgMTU0IDE4NyAyMTAgMTE1IDM1IDMwNCAxMDggMTQ4IDU4IAorMjA5IDI4IDEwMyAxNzYgMjQ5IDI1MiAzMDkgMzA5IDEwIDExIDEzIDMxMiA2NyAxMSA4MyAyNTggNjkgMzEwIDE1MiAyMDIgMTQxIDE3MSAKKzI3NyAxMjkgMjk3IDI3NiAyMTYgMTU5IDg5IDczIDcwIDgzIDI5IDE2IDY3IDgxIDI5IDEgNTQgNjUgOTYgMjc0IDIgMzcgMjA0IDI4NSAKKzMzIDE2MCAyNDYgMjY1IDI1NSAyOTYgNDkgNzggMjcgMjYwIDM5IDExOSA5NCAyODkgMjQ3IDM4IDEzMiA1NSAyMjIgMjg4IDkwIDIxNSAKKzIgMjExIDI1NyAyMjYgMTE4IDIyIDQ0IDE3NiAxNjQgMzA1IDI1MCAyNSAxODYgMTIzIDIzOCAyMjEgMTMxIDIxMiAzMCAxNTggMjQ2IAorMTk1IDI1NCAyMzkgNjQgOSAyOCAyNDMgMTIzIDMwOCAxNjcgMTMzIDE5NyAxNTQgMTAyIDQgMTExIDY1IDE2NiAyMjAgNTkgMjgxIDI3MyAKKzIyOSAxMDUgNzYgNTcgMTM3IDk3IDMyIDMwMiAxMDggNzggMTEyIDIwNyA0MyAzNCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjc1IDc0IAorMjgyIDI3NSAyMTQgMTc0IDIwIDEyOSA1MyAyMjIgMjE4IDE0NCAxNTggMTcgMTQyIDMxMyAyMDkgMjU3IDIxMSAxNzIgMjAgNTkgNTIgCisyMjAgMjg4IDIwIDIxNCAyODEgMTg4IDI4MiA0NiAxMDYgMjMzIDI0OSA4IDI1NSAzMTEgMzA5IDgwIDI3MSAxNSAyOTcgMTM2IDI2OSAKKzEwMCAxNzQgMjQ5IDE4MiAzMDggMzA3IDgwIDI1NiA2OSAyNDAgMjA2IDIwMCAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCAKKzQwIDMyIDIzMiAxNjIgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMjg3IDE4IDI4NCAxOTAgMjMgMTE2IDEwNyAyMzUgMjM0IDc3IAorMTk5IDY5IDIyNSAyMDUgMTk4IDIyNiAzMyA3NSA0MCAyMDYgMjg1IDEwMyAxNjEgMzAzIDI1MCAxMCAyNDAgNjYgMjUzIDE1MiAxODcgCisxOTUgMTY5IDMzIDUgMzkgMjA0IDQxIDM0IDIxNyAyMzEgMjAgMTk5IDMxMyAyMjQgMjAzIDIxMyAxMDIgODkgMyAxMjQgODEgOTkgMjYxIAorNTYgNTAgMTY1IDIxOCA3NCAyMTIgMTUgMTU3IDI0NCAyNjUgMTg1IDI5NSA0NyA5MyAyMTcgMiAyODEgMjAzIDI4MyAxMDMgOTEgMzAyIAorMTkzIDI1IDExNiAxMjIgMjM2IDIzNiA3IDI2OCAxMyAyNDIgMTIxIDkgOTggMTg5IDEyNSAyMzggMjkxIDc3IDI2OSAxNSAyMjcgMTkwIAorMjY3IDE3MCA1MCAzMDUgMTY1IDEzMyAxMjcgMTUzIDQ1IDE5IDQyIDEyMSA5NCA0NSAyNDggOTUgMTE3IDE3OSAxNjYgNDYgNiAyNiAKKzE4OCA1MyAzMDcgMTY1IDE0OCAxMjggMjEwIDMwIDg4IDMwMCAxOTMgMTAgMTcwIDEyMCAyNTEgMTY3IDYzIDI1MSA5NyAxMTcgMTk0IAorMTY3IDQ4IDI1MCA5NSAxMzIgMTI1IDIyMyAyOTAgNzUgMjg0IDI2MCAyODMgMTE4IDM3IDQ1IDE3OCA5NCA2MCAxOTQgOTcgNDcgMjQ4IAorMTEwIDYzIDE4MSAxNTEgMTE1IDI2NCA0MyAxMDQgMjMzIDIzNCA3IDI1MyAxMiAyNDAgMTM2IDI1NCAxNTQgMTE3IDI2NCAxMTMgNTAgCisyMzUgMTY0IDc2IDE5NyA4NCAxMDEgMjYxIDEyNiAzMTAgMjIyIDIwMyAxNDMgMjc2IF4KKzY1NiAwIDMyIDY5IDUxIDEzNSAyNSAzMSAyNDUgMTIzIDcgMTY0IDEzNSAxNzggMjIxIDQyIDE5IDI4NiAyNDEgMzYgNjIgMTA3IDIxOCAKKzMwMyAxNyAyNjcgMjQ0IDMyIDEyOCAzNiAyNzQgMjgyIDEwNSA5MSA1NCAxOTAgMjcgOTkgMjQyIDE3NiAzMDYgMjM1IDc5IDE5OSA4NCAKKzE2OSAyNTggMTI4IDI5MyAyODkgMTQzIDIxMyAxNyAyMDggMjU5IDIwOSAxODcgMjc4IDExMiAzNSAyODcgMjI4IDkwIDEyNiAxMjEgCisxNTEgMjYgMTggMjk5IDE4NyAyMSA5NyAxNzQgMTc5IDMwMiAyNTIgOCAyNTUgNjMgMzA2IDgyIDI1NCAxMzUgMjM3IDIwNiAxODEgMjc2IAorNDQgODcgMjgzIDI0NSAxOSAxODIgNTEgMjg4IDIxNSAxNDQgMTQxIDg2IDg0IDE2IDY4IDY0IDgxIDEwIDY2IDMxMiAxMzMgNiA4MyAKKzI0MSAxODkgMjUyIDIyMCAxMTQgMjY2IDk0IDExOSAxNzcgMjM0IDMwNCA0IDUgMzA4IDQ2IDYxIDI2IDggMzE0IDQ4IDgwIDIzIDEyIAorMjk3IDExOSAyNCA0NCAxOTEgMTA4IDQyIDIzMSAxNDUgMTI4IDE0MCA5OSAzMCAxIDU0IDEzMSA0MiAyNzYgMzAxIDEwMiAxNDQgMzcgCisyNjEgMjAgMTY5IDEwNSAzMDMgMTgwIDc3IDE4MCAxMzYgMTY1IDI3NSA1NyAzMyAyMTkgMjMxIDg2IDE0MyAxIDIwNyAyNzIgMTU1IAorMTcyIDI2NCAxNzkgNDUgMjM3IDE0NyAxOTYgMTM3IDE1MiAxMyA3MiA0NyAxNTIgMjcwIDg3IDIyNCAyNjAgMTk2IDI0MSAyOTMgNzcgCisyODQgMTAgMjI5IDE3MSAyMCAxMTAgMTIwIDE2NCAyODggMyAxOCAyNTQgMjk4IDQ3IDkzIDI4NSAzMTMgMjgzIDE4NiAzNCA0MyAxNTkgCisyMTQgNCAyNjIgNyAyMjMgMTIwIDEgMTEzIDExNiAxODEgMjE3IDU5IDI2NCAyNiAxNzEgMTczIDI1MSAyMzMgNjAgMjUxIDgwIDE4NiAKKzEzOCAxODQgMjIzIDYxIDE2IDIzIDE3NSAxMDcgNiAxNzcgODEgMTE0IDIwNyAxMDkgMjkgMjg1IDE2MCAxNDIgNzMgMTM4IDgwIDgyIAorMzEzIDEyMCAxMSA5OCAyNTUgMTIyIDI5MSAyMjEgMTQ2IDIwOSA4MyA4OCAzMTUgMTM5IDggMTUxIDE4OSAxOTMgMjM1IDI5MSA1OCAyMCAKKzI3MyAyOTUgNTEgNzYgNDAgMjU3IDM3IDQ5IDE2MSAyMzMgMSAyNjYgMjU3IDI5NCA2NCAyMiAyNSAyNDMgMTA0IDU5IDExMSAyMDEgNTggCisyNzcgMjg4IDE1NiAxNTkgMiAxOTQgMTAgMTcwIDE4NiAxOTcgMTY5IDQ2IDIgNDEgMTg1IDEwNiAyOTAgMjM0IDkyIDE0NSA2OSAxNTUgCis5IDEzOCAyNDMgMjA4IDIwMCAyMjQgNDggMjEgMzggMTg5IDQwIDQ1IDE3OCAxNjIgNTcgMTk2IDc4IDE2NyAxOTAgMTgwIDI4OSAzMDYgCisyMyAyNjkgMzEyIDI5NiAxMzIgMTkgMjkgMjI2IDE3NSAzIDE4MSA2NCAyMzQgMTUxIDEzMCAyMDggOTYgMzQgMzAwIDE3NCA3NSAxMTIgCisxODggMTEyIDI5MiAzMDIgODkgMTk4IDUyIDI3NSAyNjkgMTU5IDE1NSAxOSAxMjMgNjYgMTQ5IDI3NCA3MCAyOTUgMjA0IDI2NiAxNTMgCisxMDQgMTI2IDYyIDE2NiAyMDMgMTI2IDIyNSAyNSA5MCAyMzAgMjYyIDI2NCAyMzggMzAgNjAgMzkgMjcwIDI5OSAzNCAxNDcgMzAwIAorMjc4IDIxNiAyMjUgMzUgNzUgNTMgMjAzIDIyIDg0IDIyOCAyNDMgMjY3IDE4NSA0NyAzMDUgOTUgMjAwIDcxIDIyMyAyNzMgMTQyIDIyNiAKKzEyIDE0NCAyOTQgMjc2IDE5NyAyMjggMzEgMTQxIDI5OCAyNTkgMjY4IDE3MiAxMDEgNCAxMDkgMTMzIDExMCAyNzMgMzggMzYgMjE1IAorMjk3IDE1IDE5OSAyOTYgMjggMTQ1IDI4MSAxNCAyMTIgMjQyIDI4MCAxMzEgMzIgMjkxIDE2MiAxNjEgNzAgMTQyIDE0IDE1MyAyNTcgCisxNDEgMjM5IDI3NCAxMjkgMjgwIDI3IDE1OCAyMjcgMzE1IDE5OCAzMDkgMjkwIDEzMCAyNjcgODEgMTczIDE5MiAyNDggMjM3IDQzIDYgCisyNCAyNTYgNTAgNDQgMTQ2IDI2OCA2OCAyMjcgMjU2IDIxMyAxNzAgMzMgNTYgMTA1IDE1MCAzOSAxMyAyODQgMTczIDg4IDU4IDEyNCAKKzE0NyA0MyAyNjMgMzkgMTE3IDEwOSAyODYgMzAwIDIxIDIwMSA0OCAyOTIgMTQ5IDIxNSA4NSAxNTYgMzEyIDE5MiAzMDcgMjIyIDEzMyAKKzI2MyA5OCAxMDIgMjQ4IDE3OCA5IDE4MyAxMzIgMTgyIDIwNCAxMTMgMjc5IDQwIDEwNCAxNjMgMzAxIDI2NSAyNzAgMjQwIDQ5IDggOTIgCisyMDQgNTQgMjk0IDIxNyAyMTIgODkgMTM5IDY3IDEzNiAxMiA4NSAzMDkgMTM3IDI1NiAxNTQgMTg1IDIxMCAxMTUgMzEgMzA0IDEwOCAKKzE0NiA1NiAyMDkgMjQgMTAzIDE3NiAyNDcgMjUwIDMwNSAzMDcgMTAgNyAxMSAzMTAgNjUgOSA3OSAyNTggNjkgMzA4IDE1MCAyMDIgCisxMzkgMTcxIDI3NyAxMjUgMjk3IDI3MiAyMTQgMTU3IDg3IDcxIDcwIDgzIDI5IDE0IDY3IDc3IDI3IDMxMSA1MiA2MyA5NCAyNzIgMiAKKzMxIDIwMCAyODMgMzMgMTYwIDI0NiAyNjMgMjUxIDI5MiA0NSA3NCAyMSAyNjAgMzMgMTE1IDkwIDI4OSAyNDcgMzggMTMwIDU1IDIyMiAKKzI4NiA4OCAyMTEgMjI3IF4KKzY2OCAwIDIxMSAyNTQgMjI2IDExNSAxNiA0MSAxNzAgMTU4IDMwNSAyNDcgMjUgMTgzIDExNyAyMzUgMjE4IDEyNSAyMTIgMzAgMTUyIAorMjQzIDE5NSAyNTQgMjM5IDYxIDI4IDIzNyAxMjAgMzAyIDE2NyAxMzAgMTk0IDE0OCA5NiAzMTIgMTA1IDY1IDE2MCAyMjAgNTMgMjgxIAorMjcwIDIyNiAxMDIgNzAgNTcgMTM3IDkxIDI2IDI5NiAxMDUgNzggMTA2IDIwNCA0MCAzMSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjY5IAorNzQgMjc2IDI3NSAyMDggMTc0IDE0IDEyNiA0NyAyMTkgMjE4IDEzOCAxNTggMTQgMTM5IDMxMCAyMDMgMjUxIDIwNSAxNjYgMTEgNTkgCis1MiAyMTQgMjgyIDIwIDIxNCAzMDggMjc1IDE4MiAyODIgNDYgMTA2IDIzMCAyNDkgMzE2IDI1MiAzMTEgMzA5IDc3IDI3MSAxNSAyOTEgCisxMzYgMjY5IDEwMCAxNjggMjQzIDE4MiAzMDggMzAxIDc0IDI1MCA2NiAyNDAgMjAwIDE5NyAxNTYgOTkgMTYgNTQgMTE2IDk2IDIxIAorMzE0IDMzIDEzNCAzNyAyMyAyMjkgMTU2IDczIDEyNCAxMzIgOTYgOCA1MSA0OSAxNDcgMjg3IDE1IDI3OCAxOTAgMTQgMTEzIDEwMSAKKzIzNSAyMzEgNzEgMTk2IDYzIDIxOSAyMDUgMTkyIDIyMCAyNyA3MiAzMSAyMDYgMjg1IDEwMCAxNTUgMjk3IDI0NCA0IDIzNCA2NiAyNTMgCisxNDYgMTgxIDE4OSAxNjYgMjQgNSAzNiAyMDEgMzIgMjggMjExIDIyOCAxNyAxOTMgMzEzIDIyNCAyMDAgMjEwIDEwMiA4MyAzIDEyMSAKKzc4IDkzIDI1OCA1NiA0NCAxNjUgMjE1IDcxIDIwOSA5IDE1NyAyMzggMjU5IDE4MiAyOTUgMzggOTAgMjE3IDMxNiAyNzggMjAzIDI3NyAKKzk3IDg4IDMwMiAxOTMgMjIgMTE2IDEyMiAyMzAgMjM2IDcgMjY4IDcgMjQyIDExNSAzIDk1IDE4NiAxMjUgMjM4IDI4NSA3NCAyNjMgMTIgCisyMjQgMTg3IDI2NCAxNjQgNTAgMjk5IDE1OSAxMjcgMTI3IDE1MyA0NSAxMyAzMyAxMjEgOTEgMzkgMjQyIDg5IDExMSAxNzMgMTY2IDM3IAorMzE0IDIwIDE4OCA1MyAzMDcgMTYyIDE0OCAxMjIgMjA0IDI3IDg1IDI5NCAxOTAgMSAxNjcgMTE3IDI0OCAxNjQgNjMgMjQ1IDk3IDExNCAKKzE5NCAxNjEgNDIgMjUwIDkyIDEzMiAxMjIgMjE3IDI5MCA2OSAyODEgMjU3IDI4MCAxMTggMzcgMzYgMTc1IDk0IDYwIDE5MSA5NCA0NyAKKzI0NSAxMTAgNjAgMTc4IDE0OCAxMDkgMjU4IDQzIDk4IDIyNyAyMjggNCAyNDcgMTIgMjM3IDEzMyAyNDggMTUxIDExNyAyNjEgMTEwIAorNDcgMjMyIDE2NCA3NiAxOTEgODEgMTAxIDI2MSAxMjMgMzEwIDIxNiAxOTcgMTQzIDE1MyAzMiA2NyA0OSAxMzQgMjQgMzEgMjQ1IDEyMyAKKzYgMTYyIDEzNSAxNzYgMjIwIDQwIDE4IDI4NiAyMzkgMzUgNjIgMTA2IDIxNyAzMDMgMTUgMjY1IDI0NCAzMCAxMjYgMzQgMjczIDI4MCAKKzEwNSA5MSA1MiAxODggMjcgOTggMjQwIDE3NCAzMDUgMjM0IDc5IDE5OSA4NCAxNjggMjU2IDEyOCAyOTIgMjg4IDE0MSAyMTIgMTcgCisyMDYgMjU5IDIwOCAxODcgMjc3IDExMCAzNCAyODYgMjI2IDg5IDEyNCAxMTkgMTUwIDI0IDE4IDI5OSAxODUgMTkgOTUgMTczIDE3OSAKKzMwMCAyNTIgNyAyNTUgNjEgMzA0IDgyIDI1MyAxMzMgMjM1IDIwNSAxNzkgMjc0IDQzIDg1IDI4MSAyNDQgMTcgMTgwIDUwIDI4NiAyMTMgCisxNDMgMTQwIDg2IDgzIDE2IDY3IDYyIDgwIDggNjQgMzEyIDEzMSAzIDgyIDI0MCAxODcgMjUxIDIxOCAxMTIgMjY2IDkyIDExOSAxNzYgCisyMzMgMzAzIDIgMiAzMDYgNDMgNTkgMjYgNSAzMTQgNDYgODAgMjEgMTAgMjk2IDExOCAyNCA0NCAxOTEgMTA3IDM5IDIyOSAxNDMgMTI3IAorMTQwIDk5IDI5IDU0IDEyOSA0MiAyNzYgMzAxIDEwMCAxNDIgMzQgMjYwIDE3IDE2NyAxMDQgMzAyIDE4MCA3NiAxNzggMTM1IDE2MyAKKzI3NCA1NiAzMSAyMTkgMjMxIDg0IDE0MiAxIDIwNiAyNzIgMTU0IDE3MSAyNjQgMTc3IDQyIDIzNyAxNDYgMTk0IDEzNSAxNTAgMTEgNzIgCis0NCAxNTIgMjY5IDg3IDIyMiAyNTkgMTk1IDI0MSAyOTMgNzcgMjg0IDcgMjI5IDE2OSAxOSAxMDggMTE5IDE2MyAyODcgMiAxNSAyNTIgCisyOTggNDYgOTMgMjg0IDMxMSAyODMgMTg1IDMyIDQxIDE1NyAyMTIgNCAyNjAgNCAyMjEgMTIwIDMxNSAxMTMgMTE0IDE4MSAyMTUgNTggCisyNjMgMjUgMTcwIDE3MSAyNTEgMjMxIDU4IDI1MCA3OSAxODYgMTM4IDE4NCAyMjMgNjEgMTMgMjAgMTc1IDEwNyA2IDE3NSA4MSAxMTQgCisyMDcgMTA3IDI2IDI4MyAxNTkgMTQwIDczIDEzNyA3OCA4MCAzMTIgMTE4IDExIDk4IDI1MyAxMjAgMjg5IDIyMSAxNDYgMjA3IDgxIDg4IAorMzE1IDEzOSA2IDE0OSAxODkgMTkyIDIzMyAyOTAgNTYgMTggMjczIDI5MyA1MSA3NSAzOSAyNTUgMzUgNDkgMTYwIDIzMyAzMTYgMjY1IAorMjU3IDI5MyA2NCAyMSAyMyAyNDIgMTAyIDU3IDExMSAxOTkgNTggMjc2IDI4OCAxNTQgMTU4IDEgMTkzIDkgMTcwIDE4NCAxOTcgMTY5IAorNDUgNDEgMTgzIDEwNCAyODkgMjM0IDkyIDE0NSA2OCAxNTUgNiAxMzYgMjQzIDIwOCAyMDMgXgorNjU2IDAgMjIxIDQ4IDIxIDMyIDE4NiA0MCA0MiAxNzggMTU5IDUxIDE5NiA3MiAxNjEgMTg3IDE3NyAyODMgMzA2IDIzIDI2NiAzMDkgCisyOTYgMTI5IDEwIDI2IDIyMCAxNzIgMzE2IDE3OCA2MSAyMjggMTUxIDEzMCAyMDUgOTAgMzQgMjk3IDE2OCA2OSAxMDkgMTgyIDExMiAKKzI5MiAyOTkgODMgMTkyIDQ2IDI2OSAyNjMgMTU5IDE0OSAxOSAxMTcgNjMgMTQzIDI3NCA2NyAyOTIgMjAxIDI2MCAxNDcgMTA0IDMxMyAKKzEyNiA1NiAxNjMgMjAwIDEyMyAyMjUgMTYgOTAgMjMwIDI2MiAyNTggMjMyIDIxIDU3IDM5IDI2NCAyOTYgMzEgMTQ3IDMwMCAyNzggCisyMTYgMjE5IDM1IDc1IDUwIDE5NyAxMyA3OCAyMjUgMjM3IDI2NyAxODUgNDEgMzAyIDk1IDE5NyA3MSAyMjAgMjcwIDEzOSAyMjMgMyAKKzE0NCAyODggMjczIDE5MSAyMjggMjggMTM1IDI5NSAyNTMgMjY1IDE3MiA5NSAxIDEwNiAxMzAgMTA3IDI2NyAyOSAzNiAyMTIgMjkxIDYgCisxOTYgMjkzIDE5IDE0MiAyNzUgOCAyMDkgMjM5IDI4MCAxMzEgMjMgMjkxIDE2MiAxNjEgNjQgMTQyIDE0IDE1MCAyNTQgMTQxIDIzNiAKKzI2OCAxMjYgMjc3IDIxIDE1NSAyMjEgMzA5IDE5OCAzMDYgMjg0IDEyNCAyNjQgNzUgMTczIDE5MiAyNDIgMjM0IDM0IDMgMjEgMjUzIAorNDQgMzUgMTQwIDI2MiA2MiAyMjcgMjUwIDIxMyAxNjcgMzAgNTAgOTkgMTUwIDMzIDQgMjgxIDE3MCA4MiA1NSAxMjQgMTQxIDQwIDI2MyAKKzM2IDExNCAxMDkgMjgwIDI5NCAxOCAyMDEgMzkgMjg5IDE0OSAyMTUgODIgMTUzIDMwNiAxODYgMzAxIDIxOSAxMzMgMjU3IDk1IDk5IAorMjQ4IDE3NSA5IDE4MyAxMjYgMTc5IDE5OCAxMTAgMjc5IDM0IDEwMSAxNjMgMjk4IDI2NSAyNzAgMjM3IDQ2IDggODYgMjA0IDUxIDI5NCAKKzIxNCAyMDYgODkgMTMzIDYxIDEzMCA5IDg1IDMwMyAxMzQgMjU2IDE1NCAxODIgMjEwIDExNSAyNSAzMDQgMTA4IDE0MyA1MyAyMDkgMTggCisxMDMgMTc2IDI0NCAyNDcgMjk5IDMwNCAxMCAxIDggMzA3IDYyIDYgNzMgMjU4IDY5IDMwNSAxNDcgMjAyIDEzNiAxNzEgMjc3IDExOSAKKzI5NyAyNjYgMjExIDE1NCA4NCA2OCA3MCA4MyAyOSAxMSA2NyA3MSAyNCAzMDUgNDkgNjAgOTEgMjY5IDIgMjIgMTk0IDI4MCAzMyAxNjAgCisyNDYgMjYwIDI0NSAyODYgMzkgNjggMTIgMjYwIDI0IDEwOSA4NCAyODkgMjQ3IDM4IDEyNyA1NSAyMjIgMjgzIDg1IDIwNSAzMTEgMjExIAorMjUyIDIyNiAxMTMgMTIgMzkgMTY2IDE1NCAzMDUgMjQ1IDI1IDE4MSAxMTMgMjMzIDIxNiAxMjEgMjEyIDMwIDE0OCAyNDEgMTk1IDI1NCAKKzIzOSA1OSAzMTMgMjggMjMzIDExOCAyOTggMTY3IDEyOCAxOTIgMTQ0IDkyIDMwOCAxMDEgNjUgMTU2IDIyMCA0OSAyODEgMjY4IDIyNCAKKzEwMCA2NiA1NyAxMzcgODcgMjIgMjkyIDEwMyA3OCAxMDIgMjAyIDM4IDI5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjUgNzQgMjcyIAorMjc1IDIwNCAxNzQgMTAgMTI0IDQzIDIxNyAyMTggMTM0IDE1OCAxMiAxMzcgMzA4IDE5OSAyNDcgMjAxIDE2MiA1IDU5IDUyIDIxMCAKKzI3OCAyMCAyMTQgMzA0IDI3MSAxNzggMjgyIDQ2IDEwNiAyMjggMjQ5IDMxMiAyNTAgMzExIDMwOSA3NSAyNzEgMTUgMjg3IDEzNiAyNjkgCisxMDAgMTY0IDIzOSAxODIgMzA4IDI5NyA3MCAyNDYgNjQgMjQwIDE5NiAxOTUgMTU2IDk3IDE0IDUyIDExMiA5NiAxNSAzMTIgMjkgMTM0IAorMzUgMTcgMjI3IDE1MiA3MSAxMjIgMTI4IDk0IDIgNDcgNDcgMTQ1IDI4NyAxMyAyNzQgMTkwIDggMTExIDk3IDIzNSAyMjkgNjcgMTk0IAorNTkgMjE1IDIwNSAxODggMjE2IDIzIDcwIDI1IDIwNiAyODUgOTggMTUxIDI5MyAyNDAgMjMwIDY2IDI1MyAxNDIgMTc3IDE4NSAxNjQgCisxOCA1IDM0IDE5OSAyNiAyNCAyMDcgMjI2IDE1IDE4OSAzMTMgMjI0IDE5OCAyMDggMTAyIDc5IDMgMTE5IDc2IDg5IDI1NiA1NiA0MCAKKzE2NSAyMTMgNjkgMjA3IDUgMTU3IDIzNCAyNTUgMTgwIDI5NSAzMiA4OCAyMTcgMzE2IDI3NiAyMDMgMjczIDkzIDg2IDMwMiAxOTMgMjAgCisxMTYgMTIyIDIyNiAyMzYgNyAyNjggMyAyNDIgMTExIDMxOCA5MyAxODQgMTI1IDIzOCAyODEgNzIgMjU5IDEwIDIyMiAxODUgMjYyIAorMTYwIDUwIDI5NSAxNTUgMTIzIDEyNyAxNTMgNDUgOSAyNyAxMjEgODkgMzUgMjM4IDg1IDEwNyAxNjkgMTY2IDMxIDMxMCAxNiAxODggCis1MyAzMDcgMTYwIDE0OCAxMTggMjAwIDI1IDgzIDI5MCAxODggMzE0IDE2NSAxMTUgMjQ2IDE2MiA2MyAyNDEgOTcgMTEyIDE5NCAxNTcgCiszOCAyNTAgOTAgMTMyIDEyMCAyMTMgMjkwIDY1IDI3OSAyNTUgMjc4IDExOCAzNyAzMCAxNzMgOTQgNjAgMTg5IDkyIDQ3IDI0MyAxMTAgCis1OCAxNzYgMTQ2IDEwNSAyNTQgNDMgOTQgMjIzIDIyNCAyIDI0MyAxMiAyMzUgMTMxIDI0NCAxNDkgMTE3IDI1OSAxMDggNDUgMjMwIAorMTY0IDc2IDE4NyA3OSAxMDEgMjYxIDEwOSBeCis2NTYgMCAzMTAgMjA4IDE4OSAxNDMgMTQ5IDMyIDU5IDQxIDEzMCAyMCAzMSAyNDUgMTIzIDIgMTU0IDEzNSAxNjggMjE2IDMyIDE0IAorMjg2IDIzMSAzMSA2MiAxMDIgMjEzIDMwMyA3IDI1NyAyNDQgMjIgMTE4IDI2IDI2OSAyNzIgMTA1IDkxIDQ0IDE4MCAyNyA5NCAyMzIgCisxNjYgMzAxIDIzMCA3OSAxOTkgODQgMTY0IDI0OCAxMjggMjg4IDI4NCAxMzMgMjA4IDE3IDE5OCAyNTkgMjA0IDE4NyAyNzMgMTAyIDMwIAorMjgyIDIxOCA4NSAxMTYgMTExIDE0NiAxNiAxOCAyOTkgMTc3IDExIDg3IDE2OSAxNzkgMjkyIDI1MiAzIDI1NSA1MyAyOTYgODIgMjQ5IAorMTI1IDIyNyAyMDEgMTcxIDI2NiAzOSA3NyAyNzMgMjQwIDkgMTcyIDQ2IDI3OCAyMDUgMTM5IDEzNiA4NiA3OSAxNiA2MyA1NCA3NiA1NiAKKzMxMiAxMjMgMzEyIDc4IDIzNiAxNzkgMjQ3IDIxMCAxMDQgMjY2IDg0IDExOSAxNzIgMjI5IDI5OSAzMTUgMzExIDI5OCAzMSA1MSAyNiAKKzMxNCAzMTQgMzggODAgMTMgMiAyOTIgMTE0IDI0IDQ0IDE5MSAxMDMgMjcgMjIxIDEzNSAxMjMgMTQwIDk5IDI1IDMxNyA1NCAxMjEgNDIgCisyNzYgMzAxIDkyIDEzNCAyMiAyNTYgNSAxNTkgMTAwIDI5OCAxODAgNzIgMTcwIDEzMSAxNTUgMjcwIDUyIDIzIDIxOSAyMzEgNzYgMTM4IAorMSAyMDIgMjcyIDE1MCAxNjcgMjY0IDE2OSAzMCAyMzcgMTQyIDE4NiAxMjcgMTQyIDMgNzIgMzIgMTUyIDI2NSA4NyAyMTQgMjU1IDE5MSAKKzI0MSAyOTMgNzcgMjg0IDMxNiAyMjkgMTYxIDE1IDEwMCAxMTUgMTU5IDI4MyAzMTkgMyAyNDQgMjk4IDQyIDkzIDI4MCAzMDMgMjgzIAorMTgxIDI0IDMzIDE0OSAyMDQgNCAyNTIgMzEzIDIxMyAxMjAgMzA3IDExMyAxMDYgMTgxIDIwNyA1NCAyNTkgMjEgMTY2IDE2MyAyNTEgCisyMjMgNTAgMjQ2IDc1IDE4NiAxMzggMTg0IDIyMyA2MSAxIDggMTc1IDEwNyA2IDE2NyA4MSAxMTQgMjA3IDk5IDE0IDI3NSAxNTUgMTMyIAorNzMgMTMzIDcwIDcyIDMwOCAxMTAgMTEgOTggMjQ1IDExMiAyODEgMjIxIDE0NiAxOTkgNzMgODggMzE1IDEzOSAzMTkgMTQxIDE4OSAKKzE4OCAyMjUgMjg2IDQ4IDEwIDI3MyAyODUgNTEgNzEgMzUgMjQ3IDI3IDQ5IDE1NiAyMzMgMzEyIDI2MSAyNTcgMjg5IDY0IDE3IDE1IAorMjM4IDk0IDQ5IDExMSAxOTEgNTggMjcyIDI4OCAxNDYgMTU0IDMxOCAxODkgNSAxNzAgMTc2IDE5NyAxNjkgNDEgMzEzIDQxIDE3NSA5NiAKKzI4NSAyMzQgOTIgMTQ1IDY0IDE1NSAzMTUgMTI4IDI0MyAyMDggMjAwIDIxOSA0OCAyMSAyOCAxODQgNDAgNDAgMTc4IDE1NyA0NyAxOTYgCis2OCAxNTcgMTg1IDE3NSAyNzkgMzA2IDIzIDI2NCAzMDcgMjk2IDEyNyA0IDI0IDIxNiAxNzAgMzE0IDE3NiA1OSAyMjQgMTUxIDEzMCAKKzIwMyA4NiAzNCAyOTUgMTY0IDY1IDEwNyAxNzggMTEyIDI5MiAyOTcgNzkgMTg4IDQyIDI2NSAyNTkgMTU5IDE0NSAxOSAxMTMgNjEgCisxMzkgMjc0IDY1IDI5MCAxOTkgMjU2IDE0MyAxMDQgMzExIDEyNiA1MiAxNjEgMTk4IDEyMSAyMjUgMTAgOTAgMjMwIDI2MiAyNTQgMjI4IAorMTUgNTUgMzkgMjYwIDI5NCAyOSAxNDcgMzAwIDI3OCAyMTYgMjE1IDM1IDc1IDQ4IDE5MyA3IDc0IDIyMyAyMzMgMjY3IDE4NSAzNyAKKzMwMCA5NSAxOTUgNzEgMjE4IDI2OCAxMzcgMjIxIDMxOCAxNDQgMjg0IDI3MSAxODcgMjI4IDI2IDEzMSAyOTMgMjQ5IDI2MyAxNzIgOTEgCiszMjAgMTA0IDEyOCAxMDUgMjYzIDIzIDM2IDIxMCAyODcgMTk0IDI5MSAxMyAxNDAgMjcxIDQgMjA3IDIzNyAyODAgMTMxIDE3IDI5MSAKKzE2MiAxNjEgNjAgMTQyIDE0IDE0OCAyNTIgMTQxIDIzNCAyNjQgMTI0IDI3NSAxNyAxNTMgMjE3IDMwNSAxOTggMzA0IDI4MCAxMjAgCisyNjIgNzEgMTczIDE5MiAyMzggMjMyIDI4IDEgMTkgMjUxIDQwIDI5IDEzNiAyNTggNTggMjI3IDI0NiAyMTMgMTY1IDI4IDQ2IDk1IAorMTUwIDI5IDMxOSAyNzkgMTY4IDc4IDUzIDEyNCAxMzcgMzggMjYzIDM0IDExMiAxMDkgMjc2IDI5MCAxNiAyMDEgMzMgMjg3IDE0OSAKKzIxNSA4MCAxNTEgMzAyIDE4MiAyOTcgMjE3IDEzMyAyNTMgOTMgOTcgMjQ4IDE3MyA5IDE4MyAxMjIgMTc3IDE5NCAxMDggMjc5IDMwIAorOTkgMTYzIDI5NiAyNjUgMjcwIDIzNSA0NCA4IDgyIDIwNCA0OSAyOTQgMjEyIDIwMiA4OSAxMjkgNTcgMTI2IDcgODUgMjk5IDEzMiAKKzI1NiAxNTQgMTgwIDIxMCAxMTUgMjEgMzA0IDEwOCAxNDEgNTEgMjA5IDE0IDEwMyAxNzYgMjQyIDI0NSAyOTUgMzAyIDEwIDMxOCA2IAorMzA1IDYwIDQgNjkgMjU4IDY5IDMwMyAxNDUgMjAyIDEzNCAxNzEgMjc3IDExNSAyOTcgMjYyIDIwOSAxNTIgODIgNjYgNzAgODMgMjkgOSAKKzY3IDY3IDIyIDMwMSA0NyA1OCA4OSAyNjcgMiAxNiAxOTAgMjc4IDMzIDE2MCAyNDYgMjU4IDI0MSAyODIgMzUgNjQgNiAyNjAgMTggCisxMDUgODAgMjg5IDI0NyAzOCAxMjUgNTUgMjkyIF4KKzxECisKK0g+U0hTIFR5cGUgMyBTdHJpbmdzPEgKK0Q+Cis0NSAwIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IDYgNyAxMCAxNyAKKzEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDEwIDE1IDggMjAgMSBeCis8RAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEuc2VydmljZSBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMS5zZXJ2aWNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNWYwMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEuc2VydmljZQpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxCitFeGVjPS9iaW4vZmFsc2UgMQorU3lzdGVtZFNlcnZpY2U9ZGJ1cy1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMi5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyLnNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlZGQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMi5zZXJ2aWNlCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIKK0V4ZWM9L2Jpbi9mYWxzZSAyCitTeXN0ZW1kU2VydmljZT1kYnVzLWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIuc2VydmljZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzLnNlcnZpY2UgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmYwNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzLnNlcnZpY2UKQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9Y29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMworRXhlYz0vYmluL2ZhbHNlIDMKK1N5c3RlbWRTZXJ2aWNlPWRidXMtY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMy5zZXJ2aWNlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL29yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE5MzExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuc2VydmljZQpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEKK0V4ZWM9L2Jpbi9mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlOTIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5jb25mCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIxNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpAQCAtMCwwICsxLDE3IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHR5cGU+c3lzdGVtPC90eXBlPgorICA8c2VydmljZWhlbHBlcj5AVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWUA8L3NlcnZpY2VoZWxwZXI+CisgIDxzZXJ2aWNlZGlyPkBEQlVTX1RFU1RfREFUQUAvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbTwvc2VydmljZWRpcj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIGRvZXNuJ3QgY3JlYXRlIGFueSByZXN0cmljdGlvbnMgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisgIDxzZXJ2aWNlaGVscGVyPkBURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZQDwvc2VydmljZWhlbHBlcj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbTwvc2VydmljZWRpcj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzhlOWQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorZGVidWctYWxsb3ctYWxsLmNvbmYKK2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYKK3Nlc3Npb24uY29uZgorc3lzdGVtLmNvbmYKK3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5NzA5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuY29uZgpAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj41MDAwPC9saW1pdD4gICAKKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4zMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NjAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj44MDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjI1NjwvbGltaXQ+CisKKyAgPHNlbGludXg+CisgICAgICAgIDxhc3NvY2lhdGUgb3duPSJvcmcuZnJlZWRlc2t0b3AuRnJvYmF0aW9uYXJ5TWVhc3VyZXMiCisgICAgICAgICBjb250ZXh0PSJteV9zZWxpbnV4X2NvbnRleHRfdCIvPgorICAgICAgICA8YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkJsYWhCbGFoQmxhaCIKKyAgICAgICAgIGNvbnRleHQ9ImZvb190Ii8+CisgIDwvc2VsaW51eD4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuZC9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZgpAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9jaGVjay1vd24tcnVsZXMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvY2hlY2stb3duLXJ1bGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZjQxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvY2hlY2stb3duLXJ1bGVzLmNvbmYKQEAgLTAsMCArMSwxNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8YWxsb3cgb3duX3ByZWZpeD0ib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zIi8+CisgIDwvcG9saWN5PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFlZTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIHJlcXVpcmVzIFNIQTEgYXV0aCwgdXNlZCB0byB0ZXN0IFNIQTEgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorICA8c2VydmljZWRpcj5AREJVU19URVNUX0RBVEFAL3ZhbGlkLXNlcnZpY2UtZmlsZXM8L3NlcnZpY2VkaXI+CisgIDxhdXRoPkRCVVNfQ09PS0lFX1NIQTE8L2F1dGg+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IG93bj0iKiIvPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRmMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbgpAQCAtMCwwICsxLDE1IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC92YWxpZC1zZXJ2aWNlLWZpbGVzPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2NlYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBUaGlzIGNvbmZpZyBmaWxlIGNvbnRhaW5zIFhNTCBlbnRpdGllcyAtLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby8mbHQ7YmFyJmd0OzwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuJiMxMDA7PC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyLyZhbXA7c2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWUmIzExNTsiPm5vbmV4aXN0ZW50LmNvbmYmIzExMDs8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iJiMxMDA7ZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjZkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Zpbml0ZS10aW1lb3V0LmNvbmYuaW4KQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG9uJ3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnNlc3Npb248L3R5cGU+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHNlbnQgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiIGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSByZWNlaXZlZCAtLT4KKyAgICA8YWxsb3cgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBhbnlvbmUgdG8gb3duIGFueXRoaW5nIC0tPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBGb3JjaWJseSB0aW1lIG91dCBtZXRob2QgY2FsbHMgYWZ0ZXIgMTAwbXMgLS0+CisgIDxsaW1pdCBuYW1lPSJyZXBseV90aW1lb3V0Ij4xMDA8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2ZvcmJpZGRpbmcuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZm9yYmlkZGluZy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjc0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2ZvcmJpZGRpbmcuY29uZi5pbgpAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9zZW5kZXI9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisKKyAgICA8IS0tIEV4Y2VwdGlvbjogc29tZSBtZXNzYWdlcyBhcmUgZm9yYmlkZGVuIC0tPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9pbnRlcmZhY2U9ImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZhYjNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPnVuaXg6dG1wZGlyPS90bXA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjE8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2luY29taW5nLWxpbWl0LmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2luY29taW5nLWxpbWl0LmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZjIyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZi5pbgpAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj4xPC9saW1pdD4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9saXN0ZW4tdW5peC1ydW50aW1lLmNvbmYgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2xpc3Rlbi11bml4LXJ1bnRpbWUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkZTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9saXN0ZW4tdW5peC1ydW50aW1lLmNvbmYKQEAgLTAsMCArMSwxMSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj51bml4OnJ1bnRpbWU9eWVzPC9saXN0ZW4+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiIGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOWE5OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZgpAQCAtMCwwICsxLDU3IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiByZWNlaXZlX21lbWJlcj0iUmVib290Ii8+CisgICAgPGRlbnkgc2VuZF9wYXRoPSIvZm9vL2Jhci9TeXN0ZW1PYmplY3RUaGluZyIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSBvd249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSBvd25fcHJlZml4PSJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMiLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJlcnJvciIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9InNpZ25hbCIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5CYXIiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuRm9vIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgPC9wb2xpY3k+CisKKyAgPHBvbGljeSBjb250ZXh0PSJtYW5kYXRvcnkiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgICAgPGRlbnkgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iIHNlbmRfbWVtYmVyPSJSZWJvb3QiLz4gCisgICAgPGRlbnkgcmVjZWl2ZV9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iIHJlY2VpdmVfbWVtYmVyPSJSZWJvb3QiLz4KKyAgICA8ZGVueSBzZW5kX3BhdGg9Ii9mb28vYmFyL1N5c3RlbU9iamVjdFRoaW5nIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IG93bj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxkZW55IG93bl9wcmVmaXg9Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcyIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSByZWNlaXZlX3NlbmRlcj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuQmFyIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkZvbyIgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj41MDAwPC9saW1pdD4gICAKKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4zMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NjAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj44MDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjI1NjwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjUxMjwvbGltaXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL211bHRpLXVzZXIuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTdkYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL211bHRpLXVzZXIuY29uZi5pbgpAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKworICA8IS0tIGF2b2lkIGFsbG93aW5nIHNlcnZpY2UgYWN0aXZhdGlvbiBzaW5jZSB3ZSBhcmUgYWxsb3dpbmcgZXZlcnlvbmUgaW4gLS0+CisgIDxzZXJ2aWNlaGVscGVyPi9iaW4vZmFsc2U8L3NlcnZpY2VoZWxwZXI+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MGExZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtLmQvdGVzdC5jb25mCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gVGhlIGZvbGxvd2luZyBkZW1vbnN0cmF0ZXMgaG93IHRvIHB1bmNoIGhvbGVzIGluIGEgZGVmYXVsdCBkZW55LWFsbCAKKyAgICAgICBwb2xpY3kgc28gdGhhdCBhIHBhcnRpY3VsYXIgdXNlciBjYW4gb3duIGEgc2VydmljZSwgYW5kIG90aGVyIAorICAgICAgIGNvbm5lY3Rpb25zIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdCAtLT4KKworICA8IS0tIE9ubHkgcm9vdCBjYW4gb3duIHRoZSBGb29TZXJ2aWNlIHNlcnZpY2UsIGFuZCAKKyAgICAgICB0aGlzIHVzZXIgY2FuIG9ubHkgc2VuZCB0aGUgb25lIGtpbmQgb2YgbWVzc2FnZSAtLT4KKyAgPHBvbGljeSB1c2VyPSJyb290Ij4KKyAgICA8YWxsb3cgb3duPSJvcmcuZm9vLkZvb1NlcnZpY2UiLz4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9Im9yZy5mb28uRm9vQnJvYWRjYXN0SW50ZXJmYWNlIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gQWxsb3cgYW55IGNvbm5lY3Rpb24gdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZSwgYnV0IAorICAgICAgIG9ubHkgaWYgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSB0aGUgb3duZXIgb2YgRm9vU2VydmljZSAtLT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9Im9yZy5mb28uRm9vQnJvYWRjYXN0SW50ZXJmYWNlIiByZWNlaXZlX3NlbmRlcj0ib3JnLmZvby5Gb29TZXJ2aWNlIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbWQtYWN0aXZhdGlvbi5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW1kLWFjdGl2YXRpb24uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q2NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW1kLWFjdGl2YXRpb24uY29uZi5pbgpAQCAtMCwwICsxLDExIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC9zeXN0ZW1kLWFjdGl2YXRpb248L3NlcnZpY2VkaXI+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9zZW5kZXI9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtaW50cm9zcGVjdGlvbi1maWxlcy9sb3RzLW9mLXR5cGVzLnhtbCBiL3Rlc3QvZGF0YS92YWxpZC1pbnRyb3NwZWN0aW9uLWZpbGVzL2xvdHMtb2YtdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGU2MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtaW50cm9zcGVjdGlvbi1maWxlcy9sb3RzLW9mLXR5cGVzLnhtbApAQCAtMCwwICsxLDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgbm9kZSBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgSW50cm9zcGVjdGlvbiAwLjEvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2ludHJvc3BlY3Rpb24uZHRkIj4KKzxub2RlPgorCisgIDxpbnRlcmZhY2UgbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkxvdHNPZlR5cGVzSW50ZXJmYWNlIj4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0SW50MzJWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZUludDMyIiB0eXBlPSJpbnQzMiIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0SW50MzJWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZUludDMyIiB0eXBlPSJpbnQzMiIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IkludDMyVmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3SW50MzJWYWx1ZSIgdHlwZT0iaW50MzIiLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0VWludDMyVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVVaW50MzIiIHR5cGU9InVpbnQzMiIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0VWludDMyVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVVaW50MzIiIHR5cGU9InVpbnQzMiIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IlVpbnQzMlZhbHVlQ2hhbmdlZCI+CisgICAgICA8YXJnIG5hbWU9Im5ld1VpbnQzMlZhbHVlIiB0eXBlPSJ1aW50MzIiLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0SW50NjRWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZUludDY0IiB0eXBlPSJpbnQ2NCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0SW50NjRWYWx1ZSI+CisgICAgICA8YXJnIG5hbWU9InRoZUludDY0IiB0eXBlPSJpbnQ2NCIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IkludDY0VmFsdWVDaGFuZ2VkIj4KKyAgICAgIDxhcmcgbmFtZT0ibmV3SW50NjRWYWx1ZSIgdHlwZT0iaW50NjQiLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0VWludDY0VmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVVaW50NjQiIHR5cGU9InVpbnQ2NCIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0VWludDY0VmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVVaW50NjQiIHR5cGU9InVpbnQ2NCIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IlVpbnQ2NFZhbHVlQ2hhbmdlZCI+CisgICAgICA8YXJnIG5hbWU9Im5ld1VpbnQ2NFZhbHVlIiB0eXBlPSJ1aW50NjQiLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0Qm9vbGVhblZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlQm9vbGVhbiIgdHlwZT0iYm9vbGVhbiIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0Qm9vbGVhblZhbHVlIj4KKyAgICAgIDxhcmcgbmFtZT0idGhlQm9vbGVhbiIgdHlwZT0iYm9vbGVhbiIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IkJvb2xlYW5WYWx1ZUNoYW5nZWQiPgorICAgICAgPGFyZyBuYW1lPSJuZXdCb29sZWFuVmFsdWUiIHR5cGU9ImJvb2xlYW4iLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0U3RyaW5nVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVTdHJpbmciIHR5cGU9InN0cmluZyIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0U3RyaW5nVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVTdHJpbmciIHR5cGU9InN0cmluZyIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IlN0cmluZ1ZhbHVlQ2hhbmdlZCI+CisgICAgICA8YXJnIG5hbWU9Im5ld1N0cmluZ1ZhbHVlIiB0eXBlPSJzdHJpbmciLz4KKyAgICA8L3NpZ25hbD4KKworICAgIDxtZXRob2QgbmFtZT0iU2V0RG91YmxlVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVEb3VibGUiIHR5cGU9ImRvdWJsZSIvPgorICAgIDwvbWV0aG9kPgorICAgIDxtZXRob2QgbmFtZT0iR2V0RG91YmxlVmFsdWUiPgorICAgICAgPGFyZyBuYW1lPSJ0aGVEb3VibGUiIHR5cGU9ImRvdWJsZSIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICA8L21ldGhvZD4KKyAgICA8c2lnbmFsIG5hbWU9IkRvdWJsZVZhbHVlQ2hhbmdlZCI+CisgICAgICA8YXJnIG5hbWU9Im5ld0RvdWJsZVZhbHVlIiB0eXBlPSJkb3VibGUiLz4KKyAgICA8L3NpZ25hbD4KKworICA8L2ludGVyZmFjZT4KKworICA8aW50ZXJmYWNlIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5BU2Vjb25kSW50ZXJmYWNlIj4KKyAgICA8bWV0aG9kIG5hbWU9IlJhbmRvbUZyb2JhdGUiPgorICAgICAgPGFyZyB0eXBlPSJib29sZWFuIiBkaXJlY3Rpb249ImluIi8+CisgICAgICA8YXJnIHR5cGU9InN0cmluZyIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICAgIDxhcmcgdHlwZT0ic3RyaW5nIiBkaXJlY3Rpb249Im91dCIvPgorICAgICAgPGFyZyB0eXBlPSJpbnQ2NCIvPiA8IS0tIGRpcmVjdGlvbiBkZWZhdWx0cyB0byAiaW4iIC0tPgorICAgICAgPGFyZyB0eXBlPSJzdHJpbmciIGRpcmVjdGlvbj0ib3V0Ii8+CisgICAgICA8YXJnIHR5cGU9InN0cmluZyIgZGlyZWN0aW9uPSJvdXQiLz4KKyAgICAgIDxhcmcgdHlwZT0iaW50MzIiIGRpcmVjdGlvbj0iaW4iLz4KKyAgICA8L21ldGhvZD4KKyAgPC9pbnRlcmZhY2U+CisKKzwvbm9kZT4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjE4NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtYXJyYXktb2YtdWludDMyLm1lc3NhZ2UKQEAgLTAsMCArMSwzMyBAQAorIyBNZXNzYWdlIHdpdGggYW4gYXJyYXkgb2YgYXJyYXkgb2YgdWludDMyCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKKworVFlQRSBBUlJBWQorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKKworTEVOR1RIIEFycmF5CitTVEFSVF9MRU5HVEggQXJyYXkKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkxCitTVEFSVF9MRU5HVEggU3ViQXJyYXkxCitVSU5UMzIgMQorVUlOVDMyIDIKK1VJTlQzMiAzCitFTkRfTEVOR1RIIFN1YkFycmF5MQorCisjIyBhcnJheSBvZiB1aW50MzIKK0xFTkdUSCBTdWJBcnJheTIKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTIKK1VJTlQzMiA0CitVSU5UMzIgNQorRU5EX0xFTkdUSCBTdWJBcnJheTIKKworRU5EX0xFTkdUSCBBcnJheQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3Qtc2ltcGxlLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2OTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlCkBAIC0wLDAgKzEsMTUgQEAKKyMgQSBzaW1wbGUgZGljdAorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdpbnQzMicKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK0VORF9MRU5HVEggRGljdAorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjk5N2IxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZQpAQCAtMCwwICsxLDQ3IEBACisjIERpY3Qgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ2Jvb2xlYW4nCitUWVBFIEJPT0xFQU4KK0JZVEUgMQorU1RSSU5HICdpbnQzMicKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1NUUklORyAndWludDMyJworVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK1NUUklORyAnZG91YmxlJworVFlQRSBET1VCTEUKK0RPVUJMRSAzLjE0MTU5MjY1MzU4OQorU1RSSU5HICdzdHJpbmcnCitUWVBFIFNUUklORworU1RSSU5HICdUaGlzIGlzIGEgc3RyaW5nJworU1RSSU5HICdib29sZWFuX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitCT09MRUFOX0FSUkFZIHsgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSB9CitTVFJJTkcgJ2ludDMyX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBJTlQzMgorSU5UMzJfQVJSQVkgeyAxLCAtMiwgMywgLTQsIDUsIC02LCA3LCAtOCwgOSwgLTEwIH0KK1NUUklORyAndWludDMyX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK1VJTlQzMl9BUlJBWSB7IDExLCAxMiwgMzE0LCAxOTExLCA1NzY5MiwgMTIzNywgMjgzNCB9CitTVFJJTkcgJ2RvdWJsZV9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgRE9VQkxFCitET1VCTEVfQVJSQVkgeyAwLjEsIDAuMiwgMy4xNDE1OTI2LCAyLjcxODMsIDEwLjAsIDkuOTkgfQorU1RSSU5HICdzdHJpbmdfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIFNUUklORworU1RSSU5HX0FSUkFZIHsgJ0hlbGxvJywgJ1RoaXMnLCAnSXMnLCAnQScsICdTdHJpbmcnLCAnQXJyYXkhJyB9CitFTkRfTEVOR1RIIERpY3QKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZW1wdGluZXNzLm1lc3NhZ2UKQEAgLTAsMCArMSw2MyBAQAorIyBFbXB0eSBhcnJheXMgYW5kIHN0cmluZ3MKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBTVFJJTkcKK0lOVDMyIDAKK0JZVEUgMCAjIFN0cmluZ3MgbmVlZCB0byBiZSBOVUxMLXRlcm1pbmF0ZWQKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBJTlQzMgorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgRE9VQkxFCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIEJZVEUKK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitJTlQzMiAwCitUWVBFIERJQ1QKK0lOVDMyIDAKKworIyBBIGRpY3Qgd2l0aCBlbXB0eSBhcnJheXMKK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ2Jvb2xlYW5fYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0lOVDMyIDAKK1NUUklORyAnaW50MzJfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIElOVDMyCitJTlQzMiAwCitTVFJJTkcgJ3VpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitJTlQzMiAwCitTVFJJTkcgJ2RvdWJsZV9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgRE9VQkxFCitJTlQzMiAwCitTVFJJTkcgJ2J5dGVfYXJyYXknCitUWVBFIEFSUkFZIAorVFlQRSBCWVRFCitJTlQzMiAwCitTVFJJTkcgJ3N0cmluZ19hcnJheScgfQorVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK0lOVDMyIDAKK0VORF9MRU5HVEggRGljdAorCitFTkRfTEVOR1RIIEJvZHkKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFhZTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UKQEAgLTAsMCArMSw2NSBAQAorIyBNZXNzYWdlIHdpdGggbG90cyBvZiBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBOSUwKK1RZUEUgQllURQorQllURSA0MgorVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK1RZUEUgRE9VQkxFCitET1VCTEUgMy4xNDE1OTI2NTM1ODkKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ1RoaXMgaXMgYSBzdHJpbmcnCitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0JPT0xFQU5fQVJSQVkgeyB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlIH0KK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyX0FSUkFZIHsgMSwgLTIsIDMsIC00LCA1LCAtNiwgNywgLTgsIDksIC0xMCB9CitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorVUlOVDMyX0FSUkFZIHsgMTEsIDEyLCAzMTQsIDE5MTEsIDU3NjkyLCAxMjM3LCAyODM0IH0KK1RZUEUgQVJSQVkKK1RZUEUgRE9VQkxFCitET1VCTEVfQVJSQVkgeyAwLjEsIDAuMiwgMy4xNDE1OTI2LCAyLjcxODMsIDEwLjAsIDkuOTkgfQorVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK1NUUklOR19BUlJBWSB7ICdIZWxsbycsICdUaGlzJywgJ0lzJywgJ0EnLCAnU3RyaW5nJywgJ0FycmF5IScgfQorVFlQRSBDVVNUT00KK1NUUklORyAnbmFtZWQgdHlwZScKK0JZVEVfQVJSQVkgeyAnYicsICdpJywgJ24nLCAnYScsICdyJywgJ3knLCAnZCcsICdhJywgJ3QnLCAnYScgfQorCitUWVBFIEFSUkFZCitUWVBFIERJQ1QKK0xFTkdUSCBBcnJheQorU1RBUlRfTEVOR1RIIEFycmF5CisKK0xFTkdUSCBEaWN0MQorU1RBUlRfTEVOR1RIIERpY3QxCitTVFJJTkcgJ2tleTEnCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitTVFJJTkcgJ2tleTInCitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ODc2NTQzMgorRU5EX0xFTkdUSCBEaWN0MQorCitMRU5HVEggRGljdDIKK1NUQVJUX0xFTkdUSCBEaWN0MgorU1RSSU5HICdrZXkxJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorU1RSSU5HICdrZXkyJworVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK0VORF9MRU5HVEggRGljdDIKKworRU5EX0xFTkdUSCBBcnJheQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9uby1wYWRkaW5nLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGY0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjIgQEAKKyMjIE1lc3NhZ2Ugd2l0aCBubyBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK1JFUVVJUkVEX0ZJRUxEUworCisjIyB0aGlzIGJ5dGUgYXJyYXkgaXMgZmlsbGVkIHdpdGggemVyb3MgdG8gdGhlIG5hdHVyYWwgbGVuZ3RoIAorIyMgb2YgdGhlIGhlYWRlcgorSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgQVJSQVkKK1RZUEUgQllURQorQUxJR04gNAorTEVOR1RIIFRoaXNCeXRlQXJyYXkKK1NUQVJUX0xFTkdUSCBUaGlzQnl0ZUFycmF5CitCWVRFIDEKK0FMSUdOIDggMQorRU5EX0xFTkdUSCBUaGlzQnl0ZUFycmF5CisKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NDlkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9vcHBvc2l0ZS1lbmRpYW4ubWVzc2FnZQpAQCAtMCwwICsxLDMwIEBACisjIyBNZXNzYWdlIG9mIG9wcG9zaXRlIGVuZGlhbm5lc3MsIHdpdGggbG90cyBvZiByYW5kb20gZmllbGRzIGluIGl0CisKK09QUE9TSVRFX0VORElBTgorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK1JFUVVJUkVEX0ZJRUxEUworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBJTlQzMgorSU5UMzIgMHhmZWViCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CisKK1RZUEUgSU5UMzIKK0lOVDMyIDg5NzY1NDMyCitUWVBFIFVJTlQzMgorVUlOVDMyIDB4ZmZmZmZmZgorVFlQRSBTVFJJTkcKK1NUUklORyAnSGVsbG8gdGhpcyBpcyBhIHN0cmluZycKK1RZUEUgRE9VQkxFCitET1VCTEUgMy4xNDE1OQorCitUWVBFIE5JTAorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA2ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlCkBAIC0wLDAgKzEsOTkgQEAKKyMjIE1lc3NhZ2Ugd2l0aCByZWN1cnNpdmUgdHlwZXMKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitSRVFVSVJFRF9GSUVMRFMKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CisKKyMgRXZlcnl0aGluZyBpcyBpbnNpZGUgYSBkaWN0CitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0MQorU1RBUlRfTEVOR1RIIERpY3QxCisKKyMgZmlyc3QgZGljdCBlbnRyeSBpcyBhbiBhcnJheSBvZiBhcnJheSBvZiB1aW50MzIKK1NUUklORyAnbWVnYS11aW50LWFycmF5JworVFlQRSBBUlJBWQorVFlQRSBBUlJBWQorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK0xFTkdUSCBBcnJheTEKK1NUQVJUX0xFTkdUSCBBcnJheTEKKworTEVOR1RIIEFycmF5MV8xCitTVEFSVF9MRU5HVEggQXJyYXkxXzEKK1VJTlQzMl9BUlJBWSB7IDEsIDIsIDMsIDQsIDV9CitVSU5UMzJfQVJSQVkgeyAyLCAzLCA0LCA1LCAxfQorVUlOVDMyX0FSUkFZIHsgMywgNCwgNSwgMSwgMn0KK0VORF9MRU5HVEggQXJyYXkxXzEKKworTEVOR1RIIEFycmF5MV8yCitTVEFSVF9MRU5HVEggQXJyYXkxXzIKK1VJTlQzMl9BUlJBWSB7IDQsIDUsIDYsIDcsIDh9CitVSU5UMzJfQVJSQVkgeyA1LCA2LCA3LCA4LCA0fQorRU5EX0xFTkdUSCBBcnJheTFfMgorCitFTkRfTEVOR1RIIEFycmF5MQorCisjIHNlY29uZCBkaWN0IGVudHJ5IGlzIGFuIGFycmF5IG9mIHN0cmluZ3MKK1NUUklORyAnc3RyaW5nLWFycmF5JworVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK1NUUklOR19BUlJBWSB7ICdhJywgJ3N0cmluZycsICdhcnJheSd9CisKKyMgdGhpcmQgZGljdCBlbnRyeSBpcyBhbm90aGVyIGRpY3QKK1NUUklORyAnbmVzdGVkLWRpY3QnCitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0MgorU1RBUlRfTEVOR1RIIERpY3QyCisKK1NUUklORyAnc3RyaW5nJworVFlQRSBTVFJJTkcKK1NUUklORyAnYSBkZWVwbHkgbmVzdGVkIHN0cmluZycgICAgIAorCitTVFJJTkcgJ3N1cGVyLW5lc3RlZC1kaWN0JworVFlQRSBESUNUCitMRU5HVEggRGljdDMKK1NUQVJUX0xFTkdUSCBEaWN0MworCitTVFJJTkcgJ2RvdWJsZS1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgRE9VQkxFCitET1VCTEVfQVJSQVkgezEuMCwgMi4wLCAzLjB9CisKK1NUUklORyAnZGljdC1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgRElDVAorTEVOR1RIIEFycmF5MgorU1RBUlRfTEVOR1RIIEFycmF5MgorCitMRU5HVEggRGljdDQKK1NUQVJUX0xFTkdUSCBEaWN0NAorU1RSSU5HICdrZXk0JworVFlQRSBCWVRFCitCWVRFICc0JworRU5EX0xFTkdUSCBEaWN0NAorCitMRU5HVEggRGljdDUKK1NUQVJUX0xFTkdUSCBEaWN0NQorU1RSSU5HICdrZXk1JworVFlQRSBCWVRFCitCWVRFICc1JworRU5EX0xFTkdUSCBEaWN0NQorCitFTkRfTEVOR1RIIEFycmF5MgorCitTVFJJTkcgJ2Jvb2xlYW4nCitUWVBFIEJPT0xFQU4KK0JPT0xFQU4gZmFsc2UKKworRU5EX0xFTkdUSCBEaWN0MworCitFTkRfTEVOR1RIIERpY3QyCisKK0VORF9MRU5HVEggRGljdDEKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhOTYwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zaW1wbGVzdC1tYW51YWwubWVzc2FnZQpAQCAtMCwwICsxLDMwIEBACisjIyBsaWtlIHNpbXBsZXN0Lm1lc3NhZ2UsIGJ1dCBkb2Vzbid0IHVzZSBWQUxJRF9IRUFERVIKKyMjIGNvbnZlbmllbmNlIGNvbW1hbmQuIG1vc3RseSB0byB0ZXN0IHRoZSB0ZXN0IGZyYW1ld29yay4KKworTElUVExFX0VORElBTgorQllURSAnbCcKK0JZVEUgMQorQllURSAwCitCWVRFIDAKK0xFTkdUSCBIZWFkZXIKK0xFTkdUSCBCb2R5CisjIyBjbGllbnQgc2VyaWFsCitJTlQzMiA3CisKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICcnCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zaW1wbGVzdC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGRhZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QubWVzc2FnZQpAQCAtMCwwICsxLDEwIEBACisjIyBzaW1wbGVzdCBwb3NzaWJsZSB2YWxpZCBtZXNzYWdlCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWYzYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtYWNxdWlyZS1zZXJ2aWNlLm1lc3NhZ2UKQEAgLTAsMCArMSwyNiBAQAorIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5BY3F1aXJlU2VydmljZSBtZXNzYWdlCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0FjcXVpcmVTZXJ2aWNlJworSEVBREVSX0ZJRUxEIERFU1RJTkFUSU9OCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBTSUdOQVRVUkUKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ3N1JworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5TYW1wbGUnCitUWVBFIFVJTlQzMgorVUlOVDMyIDAKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWhlbGxvLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtaGVsbG8ubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDg4MzVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWhlbGxvLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbyBtZXNzYWdlCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0hlbGxvJworSEVBREVSX0ZJRUxEIERFU1RJTkFUSU9OCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBTSUdOQVRVUkUKK1RZUEUgU1RSSU5HCitTVFJJTkcgJycKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtbGlzdC1zZXJ2aWNlcy5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTEwYWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZQpAQCAtMCwwICsxLDIyIEBACisjIFN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RTZXJ2aWNlcyBtZXNzYWdlCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0xpc3RTZXJ2aWNlcycKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICcnCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLXNlcnZpY2UtZXhpc3RzLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtc2VydmljZS1leGlzdHMubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU3ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLXNlcnZpY2UtZXhpc3RzLm1lc3NhZ2UKQEAgLTAsMCArMSwyNCBAQAorIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TZXJ2aWNlRXhpc3RzIG1lc3NhZ2UKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9vcmcvZnJlZWRlc2t0b3AvREJ1cycKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnU2VydmljZUV4aXN0cycKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICdzJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5TYW1wbGUnCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3Vua25vd24taGVhZGVyLWZpZWxkLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3ZDYyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlCkBAIC0wLDAgKzEsMTkgQEAKKyMjIG1lc3NhZ2Ugd2l0aCBhICduYW1lJyBoZWFkZXIgZmllbGQgYW5kIHVua25vd24gJ3Vua24nIGZpZWxkCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworCitIRUFERVJfRklFTEQgVU5LTk9XTgorVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAnaW50MzInCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitFTkRfTEVOR1RIIERpY3QKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS8uZ2l0aWdub3JlIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzYWQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouc2VydmljZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc2ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw1IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VnZmF1bHRARVhFRVhUQAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwODM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgInRoaXMgc2hvdWxkICdmYWlsJyBiZWNhdXNlIG9mIGFuIHVudGVybWluYXRlZCBxdW90ZQorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0NzI2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgLXRlc3QgInRoYXQiICd3ZSBnZXQnIGJhY2sgLS13aGF0ICJ3ZSBwdXQgaW4iCitVc2VyPWFueXJhbmRvbXVzZXIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzYWQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5zZXJ2aWNlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRmZWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlcgorRXhlYz1AREJVU19URVNUX0VYRUNAL25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXJARVhFRVhUQAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjJhNzdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VydmljZUBFWEVFWFRACmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzg2MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UgZm9yawpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI1NDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZWdmYXVsdEBFWEVFWFRACisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTk2NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsMyBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgInRoaXMgc2hvdWxkICdmYWlsJyBiZWNhdXNlIG9mIGFuIHVudGVybWluYXRlZCBxdW90ZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyODg3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3MKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNoZWxsLXNlcnZpY2VARVhFRVhUQCAtdGVzdCAidGhhdCIgJ3dlIGdldCcgYmFjayAtLXdoYXQgIndlIHB1dCBpbiIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYnVzLWRhZW1vbi1lYXZlc2Ryb3AuYyBiL3Rlc3QvZGJ1cy1kYWVtb24tZWF2ZXNkcm9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ODU3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGJ1cy1kYWVtb24tZWF2ZXNkcm9wLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIEludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgZWF2ZXNkcm9wPXRydWV8ZmFsc2Uga2V5d29yZCBpbiBEQnVzTWF0Y2hSdWxlCisgKgorICogQXV0aG9yOiBDb3NpbW8gQWxmYXJhbm8gPGNvc2ltby5hbGZhcmFub0Bjb2xsYWJvcmEuY28udWs+CisgKiBCYXNlZCBvbjogdGVzdHMvZGJ1cy1kYWVtb24uYyBieSBTaW1vbiBNY1ZpdHRpZQorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKKyNkZWZpbmUgU0VOREVSX05BTUUgInRlc3QuZWF2ZXNkcm9wLnNlbmRlciIKKyNkZWZpbmUgU0VOREVSX1BBVEggIi90ZXN0L2VhdmVzZHJvcC9zZW5kZXIiCisjZGVmaW5lIFNFTkRFUl9JRkFDRSBTRU5ERVJfTkFNRQorI2RlZmluZSBTRU5ERVJfU0lHTkFMX05BTUUgIlNpZ25hbCIKKyNkZWZpbmUgU0VOREVSX1NUT1BQRVJfTkFNRSAiU3RvcHBlciIKKworLyogVGhpcyBydWxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBhZGRlZCB0byBhIHByb3h5IGNvbm5lY3RpbmcgdG8KKyAqIFNFTkRFUl9OQU1FK1NFTkRFUl9JRkFDRSwgcGx1cyByZXN0cmljdGluZyBvbiBzaWduYWwgbmFtZS4KKyAqIEJlaW5nIG1vcmUgcmVzdHJpY3RpdmUsIGlmIHRoZSBjb25uZWN0aW9uIHJlY2VpdmVzIHdoYXQgd2UgbmVlZCwgZm9yIHN1cmUKKyAqIHRoZSBvcmlnaW5hbCBwcm94eSBydWxlIHdpbGwgbWF0Y2ggaXQgKi8KKyNkZWZpbmUgUkVDRUlWRVJfUlVMRSAic2VuZGVyPSciIFNFTkRFUl9OQU1FICInLCIgXAorICAiaW50ZXJmYWNlPSciIFNFTkRFUl9JRkFDRSAiJywiIFwKKyAgInR5cGU9J3NpZ25hbCcsIiBcCisgICJtZW1iZXI9JyIgU0VOREVSX1NJR05BTF9OQU1FICInIgorI2RlZmluZSBQT0xJVEVMSVNURU5FUl9SVUxFIFJFQ0VJVkVSX1JVTEUKKyNkZWZpbmUgRUFWRVNEUk9QUEVSX1JVTEUgUkVDRUlWRVJfUlVMRSAiLGVhdmVzZHJvcD10cnVlIgorCisjZGVmaW5lIFNUT1BQRVJfUlVMRSAic2VuZGVyPSciIFNFTkRFUl9OQU1FIFwKKyAgIicsaW50ZXJmYWNlPSciIFNFTkRFUl9JRkFDRSAiJyx0eXBlPSdzaWduYWwnLG1lbWJlcj0nIiBTRU5ERVJfU1RPUFBFUl9OQU1FICInIgorCisvKiBhIGNvbm5lY3Rpb24gcmVjZWl2ZWQgYSBzaWduYWwgdG8gd2hvbT8gKi8KK3R5cGVkZWYgZW51bSB7CisgIE5PTkVfWUVUID0gMCwKKyAgVE9fTUUsCisgIFRPX09USEVSLAorICBCUk9BRENBU1QsCit9IFNpZ25hbERzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFRlc3RNYWluQ29udGV4dCAqY3R4OworICAgIERCdXNFcnJvciBlOworICAgIEdFcnJvciAqZ2U7CisKKyAgICBHUGlkIGRhZW1vbl9waWQ7CisKKyAgICAvKiBlYXZlZHJvcCBrZXl3b3JkIHRlc3RzICovCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlcjsKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmVjZWl2ZXI7CisgICAgU2lnbmFsRHN0IHJlY2VpdmVyX2RzdDsKKyAgICBkYnVzX2Jvb2xfdCByZWNlaXZlcl9nb3Rfc3RvcHBlcjsKKyAgICBEQnVzQ29ubmVjdGlvbiAqZWF2ZXNkcm9wcGVyOworICAgIFNpZ25hbERzdCBlYXZlc2Ryb3BwZXJfZHN0OworICAgIGRidXNfYm9vbF90IGVhdmVzZHJvcHBlcl9nb3Rfc3RvcHBlcjsKKyAgICBEQnVzQ29ubmVjdGlvbiAqcG9saXRlbGlzdGVuZXI7CisgICAgU2lnbmFsRHN0IHBvbGl0ZWxpc3RlbmVyX2RzdDsKKyAgICBkYnVzX2Jvb2xfdCBwb2xpdGVsaXN0ZW5lcl9nb3Rfc3RvcHBlcjsKK30gRml4dHVyZTsKKworLyogc2VuZCBhIHVuaWNhc3Qgc2lnbmFsIHRvIDxzZWxmPiB0byBlbnN1cmUgdGhhdCBubyBvdGhlciBjb25uZWN0aW9uCisgKiBsaXN0ZW5pbmcgaXMgdGhlIGFjdHVhbCByZWNpcGllbnQgZm9yIHRoZSBzaWduYWwgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfdW5pY2FzdF90b19zZW5kZXIgKEZpeHR1cmUgKmYpCit7CisgIERCdXNNZXNzYWdlICpzaWduYWw7CisKKyAgc2lnbmFsID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKFNFTkRFUl9QQVRILCBTRU5ERVJfSUZBQ0UsCisgICAgICBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+c2VuZGVyKSk7CisKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoc2lnbmFsKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKiBzZW5kIGEgdW5pY2FzdCBzaWduYWwgdG8gPHJlY2VpdmVyPiwgbWFraW5nIDxwb2xpdGVsaXN0ZW5lcj4gYW5kCisgKiA8ZWF2ZXNkcm9wcGVyPiBub3QgYSBhY3R1YWwgcmVjaXBpZW50IGZvciBpdCAqLworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzZW5kZXJfc2VuZF91bmljYXN0X3RvX3JlY2VpdmVyIChGaXh0dXJlICpmKQoreworICBEQnVzTWVzc2FnZSAqc2lnbmFsOworCisgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChTRU5ERVJfUEFUSCwgU0VOREVSX0lGQUNFLCBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+cmVjZWl2ZXIpKTsKKworICBpZiAoc2lnbmFsID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgc2lnbmFsLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChzaWduYWwpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfYnJvYWRjYXN0IChGaXh0dXJlICpmKQoreworICBEQnVzTWVzc2FnZSAqc2lnbmFsOworCisgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChTRU5ERVJfUEFUSCwgU0VOREVSX0lGQUNFLCBTRU5ERVJfU0lHTkFMX05BTUUpOworICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChzaWduYWwsIE5VTEwpOworCisgIGlmIChzaWduYWwgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBzaWduYWwsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHNpZ25hbCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyogU2VuZCBzcGVjaWFsIGJyb2FkY2FzdCBzaWduYWwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29ubmVjdGlvbnMgY2FuICJzdG9wIgorICogbGlzdGVuaW5nIGFuZCBjaGVjayB0aGVpciByZXN1bHRzLgorICogREJ1cyBkb2VzIG5vdCByZS1vcmRlciBtZXNzYWdlcywgc28gd2hlbiB0aGUgdGhyZWUgY29ubmVjdGlvbnMgaGF2ZSByZWNlaXZlZAorICogdGhpcyBzaWduYWwsIHdlIGFyZSBzdXJlIHRoYXQgYW55IG1lc3NhZ2Ugc2VudCBiZWZvcmUgaXQgaGFzIGFsc28gYmVlbgorICogZGlzcGF0Y2hlZC4gKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfc3RvcHBlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKworICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoU0VOREVSX1BBVEgsIFNFTkRFUl9JRkFDRSwgU0VOREVSX1NUT1BQRVJfTkFNRSk7CisgIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKHNpZ25hbCwgTlVMTCk7CisKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoc2lnbmFsKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKiBJZ25vcmUgTmFtZUFjcXVpcmVkLCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgc2lnbmFsIHJlY2VpdmVkOgorICogLSB1cGRhdGVzIGYtPjxjb25uPl9kc3QgYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBtZXNzYWdlCisgKiAtIGFzc2VydHMgdGhhdCA8Y29ubj4gcmVjZWl2ZWQgdGhlIHN0b3Agc2lnbmFsCisgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2lnbmFsX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworICBTaWduYWxEc3QgKmRzdCA9IE5VTEw7CisgIERCdXNDb25uZWN0aW9uICoqY29ubjsKKyAgZGJ1c19ib29sX3QgKmdvdF9zdG9wcGVyOworCisgIGlmICgwID09IHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCAiTmFtZUFjcXVpcmVkIikpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIGlmIChjb25uZWN0aW9uID09IGYtPnJlY2VpdmVyKQorICAgIHsKKyAgICAgIGRzdCA9ICYoZi0+cmVjZWl2ZXJfZHN0KTsKKyAgICAgIGNvbm4gPSAmKGYtPnJlY2VpdmVyKTsKKyAgICAgIGdvdF9zdG9wcGVyID0gJihmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlcik7CisgICAgfQorICBlbHNlIGlmIChjb25uZWN0aW9uID09IGYtPmVhdmVzZHJvcHBlcikKKyAgICB7CisgICAgICBkc3QgPSAmKGYtPmVhdmVzZHJvcHBlcl9kc3QpOworICAgICAgY29ubiA9ICYoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGdvdF9zdG9wcGVyID0gJihmLT5lYXZlc2Ryb3BwZXJfZ290X3N0b3BwZXIpOworICAgIH0KKyAgZWxzZSBpZiAoY29ubmVjdGlvbiA9PSBmLT5wb2xpdGVsaXN0ZW5lcikKKyAgICB7CisgICAgICBkc3QgPSAmKGYtPnBvbGl0ZWxpc3RlbmVyX2RzdCk7CisgICAgICBjb25uID0gJihmLT5wb2xpdGVsaXN0ZW5lcik7CisgICAgICBnb3Rfc3RvcHBlciA9ICYoZi0+cG9saXRlbGlzdGVuZXJfZ290X3N0b3BwZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJjb25uZWN0aW9uIG5vdCBtYXRjaGluZyIpOworICAgIH0KKworICBpZiAoMCA9PSBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgU0VOREVSX1NJR05BTF9OQU1FKSkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgPT0gTlVMTCkKKyAgICAgICAgKmRzdCA9IEJST0FEQ0FTVDsKKyAgICAgIGVsc2UgaWYgKDAgPT0gc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSwgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lICgqY29ubikpKQorICAgICAgICAqZHN0ID0gVE9fTUU7CisgICAgICBlbHNlIC8qIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSAhPSBOVUxMKSAqLworICAgICAgICAqZHN0ID0gVE9fT1RIRVI7CisgICAgfQorICBlbHNlIGlmICgwID09IHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCBTRU5ERVJfU1RPUFBFUl9OQU1FKSkKKyAgICB7CisgICAgICAqZ290X3N0b3BwZXIgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJnb3QgdW5rbm93biBtZW1iZXIgZnJvbSBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorYWRkX3JlY2VpdmVyX2ZpbHRlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c0Vycm9yIGUgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNlaXZlciwgUkVDRUlWRVJfUlVMRSwgJmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmUpOworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPnJlY2VpdmVyLCBTVE9QUEVSX1JVTEUsICZlKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5yZWNlaXZlciwKKyAgICAgICAgc2lnbmFsX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworfQorCitzdGF0aWMgdm9pZAorYWRkX2VhdmVzZHJvcHBlcl9maWx0ZXIgKEZpeHR1cmUgKmYpCit7CisgIERCdXNFcnJvciBlID0gREJVU19FUlJPUl9JTklUOworCisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+ZWF2ZXNkcm9wcGVyLCBFQVZFU0RST1BQRVJfUlVMRSwgJmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmUpOworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPmVhdmVzZHJvcHBlciwgU1RPUFBFUl9SVUxFLCAmZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+ZWF2ZXNkcm9wcGVyLAorICAgICAgICBzaWduYWxfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcG9saXRlbGlzdGVuZXJfZmlsdGVyIChGaXh0dXJlICpmKQoreworICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPnBvbGl0ZWxpc3RlbmVyLCBQT0xJVEVMSVNURU5FUl9SVUxFLCAmZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZSk7CisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+cG9saXRlbGlzdGVuZXIsIFNUT1BQRVJfUlVMRSwgJmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnBvbGl0ZWxpc3RlbmVyLAorICAgICAgICBzaWduYWxfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworCisgIGYtPmdlID0gTlVMTDsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyAgYWRkcmVzcyA9IHRlc3RfZ2V0X2RidXNfZGFlbW9uIChOVUxMLCBURVNUX1VTRVJfTUUsICZmLT5kYWVtb25fcGlkKTsKKworICBmLT5zZW5kZXIgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGFkZHJlc3MpOworICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPnNlbmRlciwgU0VOREVSX05BTUUsIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwKKyAgICAgICYoZi0+ZSkpOworICBmLT5yZWNlaXZlciA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgYWRkcmVzcyk7CisgIGYtPmVhdmVzZHJvcHBlciA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgYWRkcmVzcyk7CisgIGYtPnBvbGl0ZWxpc3RlbmVyID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBhZGRyZXNzKTsKKyAgYWRkX3JlY2VpdmVyX2ZpbHRlciAoZik7CisgIGFkZF9wb2xpdGVsaXN0ZW5lcl9maWx0ZXIgKGYpOworICBhZGRfZWF2ZXNkcm9wcGVyX2ZpbHRlciAoZik7CisKKyAgZ19mcmVlIChhZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZWF2ZXNkcm9wX2Jyb2FkY2FzdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgc2VuZGVyX3NlbmRfYnJvYWRjYXN0IChmKTsKKyAgc2VuZGVyX3NlbmRfc3RvcHBlciAoZik7CisKKyAgd2hpbGUgKCFmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogYWxsIHRoZSB0aHJlZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlIGEgYnJvYWRjYXN0ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cmVjZWl2ZXJfZHN0LCA9PSwgQlJPQURDQVNUKTsKKyAgZ19hc3NlcnRfY21waW50IChmLT5wb2xpdGVsaXN0ZW5lcl9kc3QsID09LCBCUk9BRENBU1QpOworICBnX2Fzc2VydF9jbXBpbnQgKGYtPmVhdmVzZHJvcHBlcl9kc3QsID09LCBCUk9BRENBU1QpOworfQorCisvKiBhIHdheSB0byBzYXkgdGhhdCBub25lIG9mIHRoZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiBhcmUgZGVzdGluYXRpb24gb2YgdGhlCisgKiBzaWduYWwgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3NlbmRlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgc2VuZGVyX3NlbmRfdW5pY2FzdF90b19zZW5kZXIgKGYpOworICBzZW5kZXJfc2VuZF9zdG9wcGVyIChmKTsKKworICB3aGlsZSAoIWYtPnJlY2VpdmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+cG9saXRlbGlzdGVuZXJfZ290X3N0b3BwZXIgfHwKKyAgICAgICFmLT5lYXZlc2Ryb3BwZXJfZ290X3N0b3BwZXIpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAvKiBub3QgZGlyZWN0ZWQgdG8gaXQgYW5kIG5vdCBicm9hZGNhc3RlZCwgdGhleSBjYW5ub3QgcmVjZWl2ZSBpdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnJlY2VpdmVyX2RzdCwgPT0sIE5PTkVfWUVUKTsKKyAgZ19hc3NlcnRfY21waW50IChmLT5wb2xpdGVsaXN0ZW5lcl9kc3QsID09LCBOT05FX1lFVCk7CisgIC8qIGVhdmVzZHJvcD10cnVlLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHNpZ25hbCBldmVuIHRob3VnaCBpdCdzIG5vdCBkaXJlY3RlZAorICAgKiB0byBpdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPmVhdmVzZHJvcHBlcl9kc3QsID09LCBUT19PVEhFUik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3JlY2VpdmVyIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCBHX0dOVUNfVU5VU0VEKQoreworICBzZW5kZXJfc2VuZF91bmljYXN0X3RvX3JlY2VpdmVyIChmKTsKKyAgc2VuZGVyX3NlbmRfc3RvcHBlciAoZik7CisKKyAgd2hpbGUgKCFmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogZGlyZWN0IHRvIGhpbSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnJlY2VpdmVyX2RzdCwgPT0sIFRPX01FKTsKKyAgLyogbm90IGRpcmVjdGVkIHRvIGl0IGFuZCBub3QgYnJvYWRjYXN0ZWQsIGl0IGNhbm5vdCByZWNlaXZlIGl0ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cG9saXRlbGlzdGVuZXJfZHN0LCA9PSwgTk9ORV9ZRVQpOworICAvKiBlYXZlc2Ryb3A9dHJ1ZSwgaXQgd2lsbCByZWNlaXZlIHRoZSBzaWduYWwgZXZlbiB0aG91Z2ggaXQncyBub3QgZGlyZWN0ZWQKKyAgICogdG8gaXQgKi8KKyAgZ19hc3NlcnRfY21waW50IChmLT5lYXZlc2Ryb3BwZXJfZHN0LCA9PSwgVE9fT1RIRVIpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5zZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlbmRlcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlbmRlcik7CisgICAgICBmLT5zZW5kZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmVjZWl2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmVjZWl2ZXIsCisgICAgICAgICAgc2lnbmFsX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmVjZWl2ZXIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yZWNlaXZlcik7CisgICAgICBmLT5yZWNlaXZlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5wb2xpdGVsaXN0ZW5lciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5wb2xpdGVsaXN0ZW5lciwKKyAgICAgICAgICBzaWduYWxfZmlsdGVyLCBmKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5wb2xpdGVsaXN0ZW5lcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnBvbGl0ZWxpc3RlbmVyKTsKKyAgICAgIGYtPnBvbGl0ZWxpc3RlbmVyID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPmVhdmVzZHJvcHBlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5lYXZlc2Ryb3BwZXIsCisgICAgICAgICAgc2lnbmFsX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+ZWF2ZXNkcm9wcGVyKTsKKyAgICAgIGYtPmVhdmVzZHJvcHBlciA9IE5VTEw7CisgICAgfQorCisgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICBnX3NwYXduX2Nsb3NlX3BpZCAoZi0+ZGFlbW9uX3BpZCk7CisKKyAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKGYtPmN0eCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2VhdmVkcm9wL21hdGNoX2tleXdvcmQvYnJvYWRjYXN0IiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2VhdmVzZHJvcF9icm9hZGNhc3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9lYXZlZHJvcC9tYXRjaF9rZXl3b3JkL3VuaWNhc3RfdG9fcmVjZWl2ZXIiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfZWF2ZXNkcm9wX3VuaWNhc3RfdG9fcmVjZWl2ZXIsCisgICAgICB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZWF2ZWRyb3AvbWF0Y2hfa2V5d29yZC91bmljYXN0X3RvX3NlbmRlciIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9lYXZlc2Ryb3BfdW5pY2FzdF90b19zZW5kZXIsIHRlYXJkb3duKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGJ1cy1kYWVtb24uYyBiL3Rlc3QvZGJ1cy1kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQyYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYnVzLWRhZW1vbi5jCkBAIC0wLDAgKzEsNzQ4IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGRidXMtZGFlbW9uCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1VOSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKy8qIFBsYXRmb3JtcyB3aGVyZSB3ZSBrbm93IHRoYXQgY3JlZGVudGlhbHMtcGFzc2luZyBwYXNzZXMgYm90aCB0aGUKKyAqIHVpZCBhbmQgdGhlIHBpZC4gUGxlYXNlIGtlZXAgdGhlc2UgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICoKKyAqIFRoZXNlIHBsYXRmb3JtcyBzaG91bGQgI2Vycm9yIGluIF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KCkKKyAqIGlmIHdlIGRpZG4ndCBkZXRlY3QgdGhlaXIgZmxhdm91ciBvZiBjcmVkZW50aWFscy1wYXNzaW5nLCBzaW5jZSB0aGF0CisgKiB3b3VsZCBiZSBhIHJlZ3Jlc3Npb24uCisgKi8KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykgfHwgXAorICBkZWZpbmVkKF9fbGludXhfXykgfHwgXAorICBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgZGVmaW5lIFVOSVhfVVNFUl9TSE9VTERfV09SSworIyBkZWZpbmUgUElEX1NIT1VMRF9XT1JLCisjZW5kaWYKKworLyogUGxhdGZvcm1zIHdoZXJlIHdlIGtub3cgdGhhdCBjcmVkZW50aWFscy1wYXNzaW5nIHBhc3NlcyB0aGUKKyAqIHVpZCwgYnV0IG5vdCBuZWNlc3NhcmlseSB0aGUgcGlkLiBBZ2FpbiwgYWxwaGFiZXRpY2FsIG9yZGVyIHBsZWFzZS4KKyAqCisgKiBUaGVzZSBwbGF0Zm9ybXMgc2hvdWxkIGFsc28gI2Vycm9yIGluIF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KCkKKyAqIGlmIHdlIGRpZG4ndCBkZXRlY3QgdGhlaXIgZmxhdm91ciBvZiBjcmVkZW50aWFscy1wYXNzaW5nLgorICovCisjaWYgMCAvKiBkZWZpbmVkKF9feW91cl9wbGF0Zm9ybV9oZXJlX18pICovCisjIGRlZmluZSBVTklYX1VTRVJfU0hPVUxEX1dPUksKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2Jvb2xlYW4gc2tpcDsKKworICAgIFRlc3RNYWluQ29udGV4dCAqY3R4OworCisgICAgREJ1c0Vycm9yIGU7CisgICAgR0Vycm9yICpnZTsKKworICAgIEdQaWQgZGFlbW9uX3BpZDsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2Nvbm47CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmlnaHRfY29ubjsKKyAgICBnYm9vbGVhbiByaWdodF9jb25uX2VjaG87CisgICAgZ2Jvb2xlYW4gd2FpdF9mb3JldmVyX2NhbGxlZDsKKworICAgIGdjaGFyICp0bXBfcnVudGltZV9kaXI7CisgICAgZ2NoYXIgKnNhdmVkX3J1bnRpbWVfZGlyOworfSBGaXh0dXJlOworCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2VjaG9fZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIEZpeHR1cmUgKmYgPSB1c2VyX2RhdGE7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgLyogV2FpdEZvcmV2ZXIoKSBuZXZlciByZXBsaWVzLCBlbXVsYXRpbmcgYSBzZXJ2aWNlIHRoYXQgaGFzIGdvdCBzdHVjayAqLworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLCAiY29tLmV4YW1wbGUiLCAiV2FpdEZvcmV2ZXIiKSkKKyAgICB7CisgICAgICBmLT53YWl0X2ZvcmV2ZXJfY2FsbGVkID0gVFJVRTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqYnVnX3JlZjsKKyAgICBndWludCBtaW5fbWVzc2FnZXM7CisgICAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGU7CisgICAgZW51bSB7IFNQRUNJRllfQUREUkVTUyA9IDAsIFJFTFlfT05fREVGQVVMVCB9IGNvbm5lY3RfbW9kZTsKK30gQ29uZmlnOworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisgIGdjaGFyICphZGRyZXNzOworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZi0+Z2UgPSBOVUxMOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5jb25uZWN0X21vZGUgPT0gUkVMWV9PTl9ERUZBVUxUKQorICAgIHsKKyAgICAgIC8qIHRoaXMgaXMgY2hvc2VuIHRvIGJlIHNvbWV0aGluZyBuZWVkaW5nIGVzY2FwaW5nICovCisgICAgICBmLT50bXBfcnVudGltZV9kaXIgPSBnX2Rpcl9tYWtlX3RtcCAoImRidXM9ZGFlbW9uPXRlc3QuWFhYWFhYIiwgJmYtPmdlKTsKKyAgICAgIGdfYXNzZXJ0X25vX2Vycm9yIChmLT5nZSk7CisKKyAgICAgIC8qIHdlJ3JlIHJlbHlpbmcgb24gYmVpbmcgc2luZ2xlLXRocmVhZGVkIGZvciB0aGlzIHRvIGJlIHNhZmUgKi8KKyAgICAgIGYtPnNhdmVkX3J1bnRpbWVfZGlyID0gZ19zdHJkdXAgKGdfZ2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIikpOworICAgICAgZ19zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiLCBmLT50bXBfcnVudGltZV9kaXIsIFRSVUUpOworICAgIH0KKworICBhZGRyZXNzID0gdGVzdF9nZXRfZGJ1c19kYWVtb24gKGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnX2ZpbGUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfVVNFUl9NRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZi0+ZGFlbW9uX3BpZCk7CisKKyAgaWYgKGFkZHJlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBmLT5za2lwID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZi0+bGVmdF9jb25uID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBhZGRyZXNzKTsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5jb25uZWN0X21vZGUgPT0gUkVMWV9PTl9ERUZBVUxUKQorICAgIHsKKyAgICAgIC8qIHVzZSB0aGUgZGVmYXVsdCBidXMgZm9yIHRoZSBlY2hvIHNlcnZpY2UgKCJyaWdodCIpLCB0byBjaGVjayB0aGF0CisgICAgICAgKiBpdCBlbmRzIHVwIG9uIHRoZSBzYW1lIGJ1cyBhcyB0aGUgY2xpZW50ICgibGVmdCIpICovCisgICAgICBmLT5yaWdodF9jb25uID0gZGJ1c19idXNfZ2V0X3ByaXZhdGUgKERCVVNfQlVTX1NFU1NJT04sICZmLT5lKTsKKyAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisKKyAgICAgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIGYtPnJpZ2h0X2Nvbm4pKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZi0+cmlnaHRfY29ubiA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgYWRkcmVzcyk7CisgICAgfQorCisgIGdfZnJlZSAoYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfZWNob19maWx0ZXIgKEZpeHR1cmUgKmYpCit7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJpZ2h0X2Nvbm4sIGVjaG9fZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZi0+cmlnaHRfY29ubl9lY2hvID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BjX2NvdW50IChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGd1aW50ICpyZWNlaXZlZF9wID0gZGF0YTsKKworICAoKnJlY2VpdmVkX3ApKys7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VjaG8gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisgIGd1aW50IGNvdW50ID0gMjAwMDsKKyAgZ3VpbnQgc2VudDsKKyAgZ3VpbnQgcmVjZWl2ZWQgPSAwOworICBkb3VibGUgZWxhcHNlZDsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgaWYgKGNvbmZpZyAhPSBOVUxMICYmIGNvbmZpZy0+YnVnX3JlZiAhPSBOVUxMKQorICAgIGdfdGVzdF9idWcgKGNvbmZpZy0+YnVnX3JlZik7CisKKyAgaWYgKGdfdGVzdF9wZXJmICgpKQorICAgIGNvdW50ID0gMTAwMDAwOworCisgIGlmIChjb25maWcgIT0gTlVMTCkKKyAgICBjb3VudCA9IE1BWCAoY29uZmlnLT5taW5fbWVzc2FnZXMsIGNvdW50KTsKKworICBhZGRfZWNob19maWx0ZXIgKGYpOworCisgIGdfdGVzdF90aW1lcl9zdGFydCAoKTsKKworICBmb3IgKHNlbnQgPSAwOyBzZW50IDwgY291bnQ7IHNlbnQrKykKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKAorICAgICAgICAgIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+cmlnaHRfY29ubiksICIvIiwKKyAgICAgICAgICAiY29tLmV4YW1wbGUiLCAiU3BhbSIpOworICAgICAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKworICAgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfSU5GSU5JVEUpIHx8CisgICAgICAgICAgcGMgPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgICAgICBwY19jb3VudCAocGMsICZyZWNlaXZlZCk7CisgICAgICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHBjX2NvdW50LCAmcmVjZWl2ZWQsCisgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICB9CisKKyAgd2hpbGUgKHJlY2VpdmVkIDwgY291bnQpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBlbGFwc2VkID0gZ190ZXN0X3RpbWVyX2VsYXBzZWQgKCk7CisKKyAgZ190ZXN0X21heGltaXplZF9yZXN1bHQgKGNvdW50IC8gZWxhcHNlZCwgIiV1IG1lc3NhZ2VzIC8gJWYgc2Vjb25kcyIsCisgICAgICBjb3VudCwgZWxhcHNlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25vX3JlcGx5IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgY29uc3QgQ29uZmlnICpjb25maWcgPSBjb250ZXh0OworICBEQnVzTWVzc2FnZSAqbTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKyAgZW51bSB7IFRJTUVPVVQsIERJU0NPTk5FQ1QgfSBtb2RlOworICBnYm9vbGVhbiBvazsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgZ190ZXN0X2J1ZyAoIjc2MTEyIik7CisKKyAgaWYgKGNvbmZpZyAhPSBOVUxMICYmIGNvbmZpZy0+Y29uZmlnX2ZpbGUgIT0gTlVMTCkKKyAgICBtb2RlID0gVElNRU9VVDsKKyAgZWxzZQorICAgIG1vZGUgPSBESVNDT05ORUNUOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgKKyAgICAgIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+cmlnaHRfY29ubiksICIvIiwKKyAgICAgICJjb20uZXhhbXBsZSIsICJXYWl0Rm9yZXZlciIpOworCisgIGFkZF9lY2hvX2ZpbHRlciAoZik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfSU5GSU5JVEUpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJnJlcGx5KTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgJnJlcGx5LCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBpZiAobW9kZSA9PSBESVNDT05ORUNUKQorICAgIHsKKyAgICAgIHdoaWxlICghZi0+d2FpdF9mb3JldmVyX2NhbGxlZCkKKyAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnJpZ2h0X2Nvbm4sIGVjaG9fZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJpZ2h0X2Nvbm4pOworICAgICAgZi0+cmlnaHRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIHdoaWxlIChyZXBseSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogdXNpbmcgaW5lZmZpY2llbnQgc3RyaW5nIGNvbXBhcmlzb24gZm9yIGJldHRlciBhc3NlcnRpb24gbWVzc2FnZSAqLworICBnX2Fzc2VydF9jbXBzdHIgKAorICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSksID09LAorICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikpOworICBvayA9IGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmYtPmUsIHJlcGx5KTsKKyAgZ19hc3NlcnQgKG9rKTsKKyAgZ19hc3NlcnRfY21wc3RyIChmLT5lLm5hbWUsID09LCBEQlVTX0VSUk9SX05PX1JFUExZKTsKKworICBpZiAobW9kZSA9PSBESVNDT05ORUNUKQorICAgIGdfYXNzZXJ0X2NtcHN0ciAoZi0+ZS5tZXNzYWdlLCA9PSwKKyAgICAgICAgIk1lc3NhZ2UgcmVjaXBpZW50IGRpc2Nvbm5lY3RlZCBmcm9tIG1lc3NhZ2UgYnVzIHdpdGhvdXQgcmVwbHlpbmciKTsKKyAgZWxzZQorICAgIGdfYXNzZXJ0X2NtcHN0ciAoZi0+ZS5tZXNzYWdlLCA9PSwKKyAgICAgICAgIk1lc3NhZ2UgZGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgKHRpbWVvdXQgYnkgbWVzc2FnZSBidXMpIik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWRzIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgY29uc3QgY2hhciAqdW5pcXVlID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5sZWZ0X2Nvbm4pOworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsICJHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFycl9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgcGFpcl9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgdmFyX2l0ZXI7CisgIGVudW0geworICAgICAgU0VFTl9VTklYX1VTRVIgPSAxLAorICAgICAgU0VFTl9QSUQgPSAyLAorICAgICAgU0VFTl9XSU5ET1dTX1NJRCA9IDQsCisgICAgICBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMID0gOAorICB9IHNlZW4gPSAwOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pcXVlLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgImF7c3Z9Iik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0RJQ1RfRU5UUlkpOworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpOworCisgIHdoaWxlIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmFycl9pdGVyLCAmcGFpcl9pdGVyKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnBhaXJfaXRlciksID09LAorICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmcGFpcl9pdGVyLCAmbmFtZSk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmcGFpcl9pdGVyKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnBhaXJfaXRlciksID09LAorICAgICAgICAgIERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZwYWlyX2l0ZXIsICZ2YXJfaXRlcik7CisKKyAgICAgIGlmIChnX3N0cmNtcDAgKG5hbWUsICJVbml4VXNlcklEIikgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgICAgIGd1aW50MzIgdTMyOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fVU5JWF9VU0VSKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmdmFyX2l0ZXIsICZ1MzIpOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICV1IiwgbmFtZSwgdTMyKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50ICh1MzIsID09LCBnZXRldWlkICgpKTsKKyAgICAgICAgICBzZWVuIHw9IFNFRU5fVU5JWF9VU0VSOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICBlbHNlIGlmIChnX3N0cmNtcDAgKG5hbWUsICJXaW5kb3dzU0lEIikgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIEdfT1NfV0lOMzIKKyAgICAgICAgICBnY2hhciAqc2lkOworICAgICAgICAgIGNoYXIgKnNlbGZfc2lkOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fV0lORE9XU19TSUQpKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZ2YXJfaXRlciksID09LAorICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZ2YXJfaXRlciwgJnNpZCk7CisgICAgICAgICAgZ190ZXN0X21lc3NhZ2UgKCIlcyBvZiB0aGlzIHByb2Nlc3MgaXMgJXMiLCBuYW1lLCBzaWQpOworICAgICAgICAgIGlmIChfZGJ1c19nZXRzaWQgKCZzZWxmX3NpZCwgMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoc2VsZl9zaWQsID09LCBzaWQpOworICAgICAgICAgICAgICBMb2NhbEZyZWUoc2VsZl9zaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIHNlZW4gfD0gU0VFTl9XSU5ET1dTX1NJRDsKKyNlbHNlCisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZ19zdHJjbXAwIChuYW1lLCAiUHJvY2Vzc0lEIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGd1aW50MzIgdTMyOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fUElEKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmdmFyX2l0ZXIsICZ1MzIpOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICV1IiwgbmFtZSwgdTMyKTsKKyNpZmRlZiBHX09TX1VOSVgKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50ICh1MzIsID09LCBnZXRwaWQgKCkpOworI2VsaWYgZGVmaW5lZChHX09TX1dJTjMyKQorICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHUzMiwgPT0sIEdldEN1cnJlbnRQcm9jZXNzSWQgKCkpOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICAgIHNlZW4gfD0gU0VFTl9QSUQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGdfc3RyY21wMCAobmFtZSwgIkxpbnV4U2VjdXJpdHlMYWJlbCIpID09IDApCisgICAgICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgICAgICBnY2hhciAqbGFiZWw7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXlfaXRlcjsKKworICAgICAgICAgIGdfYXNzZXJ0ICghKHNlZW4gJiBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmdmFyX2l0ZXIsICZheV9pdGVyKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZheV9pdGVyKSwgPT0sCisgICAgICAgICAgICAgIERCVVNfVFlQRV9CWVRFKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkgKCZheV9pdGVyLCAmbGFiZWwsICZsZW4pOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICVzIiwgbmFtZSwgbGFiZWwpOworICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHN0cmxlbiAobGFiZWwpICsgMSwgPT0sIGxlbik7CisgICAgICAgICAgc2VlbiB8PSBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcik7CisgICAgfQorCisjaWZkZWYgVU5JWF9VU0VSX1NIT1VMRF9XT1JLCisgIGdfYXNzZXJ0IChzZWVuICYgU0VFTl9VTklYX1VTRVIpOworI2VuZGlmCisKKyNpZmRlZiBQSURfU0hPVUxEX1dPUksKKyAgZ19hc3NlcnQgKHNlZW4gJiBTRUVOX1BJRCk7CisjZW5kaWYKKworI2lmZGVmIEdfT1NfV0lOMzIKKyAgZ19hc3NlcnQgKHNlZW4gJiBTRUVOX1dJTkRPV1NfU0lEKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9jZXNzaWQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBjaGFyICp1bmlxdWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPmxlZnRfY29ubik7CisgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfREJVUywgIkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZ3VpbnQzMiBwaWQ7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ1bmlxdWUsCisgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICB7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX1VOSVhfUFJPQ0VTU19JRF9VTktOT1dOKTsKKworI2lmZGVmIFBJRF9TSE9VTERfV09SSworICAgICAgZ19lcnJvciAoIkV4cGVjdGVkIHBpZCB0byBiZSBwYXNzZWQsIGJ1dCBnb3QgJXM6ICVzIiwKKyAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyNlbmRpZgorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZlcnJvciwKKyAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZCwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInUiKTsKKyAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworCisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIHJldHVybmVkICV1IiwgcGlkKTsKKworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgZ19hc3NlcnRfY21wdWludCAocGlkLCA9PSwgZ2V0cGlkICgpKTsKKyNlbGlmIGRlZmluZWQoR19PU19XSU4zMikKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHBpZCwgPT0sIEdldEN1cnJlbnRQcm9jZXNzSWQgKCkpOworI2Vsc2UKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ19lcnJvciAoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzOiAlcyIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY2Fub25pY2FsX3BhdGhfdWFlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLCAiVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKyAgLyogQXBwZW5kIGFuIGVtcHR5IGF7c3N9IChzdHJpbmcgPT4gc3RyaW5nIGRpY3Rpb25hcnkpLiAqLworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICJ7c3N9IiwgJmFycl9pdGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgJmFycl9pdGVyKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogaXQgc3VjY2VlZHMgKi8KKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwKKyAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogTm93IHRyeSB3aXRoIHRoZSB3cm9uZyBvYmplY3QgcGF0aCAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAiL2NvbS9leGFtcGxlL1dyb25nIiwgREJVU19JTlRFUkZBQ0VfREJVUywgIlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICAvKiBBcHBlbmQgYW4gZW1wdHkgYXtzc30gKHN0cmluZyA9PiBzdHJpbmcgZGljdGlvbmFyeSkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgIntzc30iLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAvKiBpdCBmYWlscywgeWllbGRpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9uZSBzdHJpbmcgYXJndW1lbnQgKi8KKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwgREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobSksID09LCAicyIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7CisgIGdfY2xlYXJfZXJyb3IgKCZmLT5nZSk7CisKKyAgaWYgKGYtPmxlZnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9jb25uKTsKKyAgICAgIGYtPmxlZnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5yaWdodF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGYtPnJpZ2h0X2Nvbm5fZWNobykKKyAgICAgICAgeworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5yaWdodF9jb25uLCBlY2hvX2ZpbHRlciwgZik7CisgICAgICAgICAgZi0+cmlnaHRfY29ubl9lY2hvID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5yaWdodF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmlnaHRfY29ubik7CisgICAgICBmLT5yaWdodF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPmRhZW1vbl9waWQgIT0gMCkKKyAgICB7CisgICAgICB0ZXN0X2tpbGxfcGlkIChmLT5kYWVtb25fcGlkKTsKKyAgICAgIGdfc3Bhd25fY2xvc2VfcGlkIChmLT5kYWVtb25fcGlkKTsKKyAgICAgIGYtPmRhZW1vbl9waWQgPSAwOworICAgIH0KKworICBpZiAoZi0+dG1wX3J1bnRpbWVfZGlyICE9IE5VTEwpCisgICAgeworICAgICAgZ2NoYXIgKnBhdGg7CisKKyAgICAgIC8qIHRoZSBzb2NrZXQgbWF5IGV4aXN0ICovCisgICAgICBwYXRoID0gZ19zdHJkdXBfcHJpbnRmICgiJXMvYnVzIiwgZi0+dG1wX3J1bnRpbWVfZGlyKTsKKyAgICAgIGdfYXNzZXJ0IChnX3JlbW92ZSAocGF0aCkgPT0gMCB8fCBlcnJubyA9PSBFTk9FTlQpOworICAgICAgZ19mcmVlIChwYXRoKTsKKyAgICAgIC8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnl0aGluZyBlbHNlIGluIHRoZXJlICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGdfcm1kaXIgKGYtPnRtcF9ydW50aW1lX2RpciksID09LCAwKTsKKworICAgICAgLyogd2UncmUgcmVseWluZyBvbiBiZWluZyBzaW5nbGUtdGhyZWFkZWQgZm9yIHRoaXMgdG8gYmUgc2FmZSAqLworICAgICAgaWYgKGYtPnNhdmVkX3J1bnRpbWVfZGlyICE9IE5VTEwpCisgICAgICAgIGdfc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIiwgZi0+c2F2ZWRfcnVudGltZV9kaXIsIFRSVUUpOworICAgICAgZWxzZQorICAgICAgICBnX3Vuc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIik7CisgICAgICBnX2ZyZWUgKGYtPnNhdmVkX3J1bnRpbWVfZGlyKTsKKyAgICAgIGdfZnJlZSAoZi0+dG1wX3J1bnRpbWVfZGlyKTsKKyAgICB9CisKKyAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKGYtPmN0eCk7Cit9CisKK3N0YXRpYyBDb25maWcgbGltaXRlZF9jb25maWcgPSB7CisgICAgIjM0MzkzIiwgMTAwMDAsICJ2YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZiIsCisgICAgU1BFQ0lGWV9BRERSRVNTCit9OworCitzdGF0aWMgQ29uZmlnIGZpbml0ZV90aW1lb3V0X2NvbmZpZyA9IHsKKyAgICBOVUxMLCAxLCAidmFsaWQtY29uZmlnLWZpbGVzL2Zpbml0ZS10aW1lb3V0LmNvbmYiLAorICAgIFNQRUNJRllfQUREUkVTUworfTsKKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIENvbmZpZyBsaXN0ZW5fdW5peF9ydW50aW1lX2NvbmZpZyA9IHsKKyAgICAiNjEzMDMiLCAxLCAidmFsaWQtY29uZmlnLWZpbGVzL2xpc3Rlbi11bml4LXJ1bnRpbWUuY29uZiIsCisgICAgUkVMWV9PTl9ERUZBVUxUCit9OworI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2VjaG8vc2Vzc2lvbiIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X2VjaG8sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9lY2hvL2xpbWl0ZWQiLCBGaXh0dXJlLCAmbGltaXRlZF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9lY2hvLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbm8tcmVwbHkvZGlzY29ubmVjdCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9ub19yZXBseSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL25vLXJlcGx5L3RpbWVvdXQiLCBGaXh0dXJlLCAmZmluaXRlX3RpbWVvdXRfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3Rfbm9fcmVwbHksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9jcmVkcyIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X2NyZWRzLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvY2Vzc2lkIiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsIHRlc3RfcHJvY2Vzc2lkLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvY2Fub25pY2FsLXBhdGgvdWFlIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2Nhbm9uaWNhbF9wYXRoX3VhZSwgdGVhcmRvd24pOworI2lmZGVmIERCVVNfVU5JWAorICAvKiBXZSBjYW4ndCB0ZXN0IHRoaXMgaW4gbG9vcGJhY2suYyB3aXRoIHRoZSByZXN0IG9mIHVuaXg6cnVudGltZT15ZXMsCisgICAqIGJlY2F1c2UgZGJ1c19idXNfZ2V0W19wcml2YXRlXSBpcyB0aGUgb25seSB3YXkgdG8gdXNlIHRoZSBkZWZhdWx0LAorICAgKiBhbmQgdGhhdCBibG9ja3Mgb24gYSByb3VuZC10cmlwIHRvIHRoZSBkYnVzLWRhZW1vbiAqLworICBnX3Rlc3RfYWRkICgiL3VuaXgtcnVudGltZS1pcy1kZWZhdWx0IiwgRml4dHVyZSwgJmxpc3Rlbl91bml4X3J1bnRpbWVfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfZWNobywgdGVhcmRvd24pOworI2VuZGlmCisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RidXMtdGVzdC1ydW5uZXIgYi90ZXN0L2RidXMtdGVzdC1ydW5uZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYzM5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGJ1cy10ZXN0LXJ1bm5lcgpAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKK2Rpcj0iJDEiCitzaGlmdAorCitpZiAhIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisgIGVjaG8gIlVzYWdlOiBkYnVzLXRlc3QtcnVubmVyIGRpcmVjdG9yeSBbZXhlY3V0YWJsZS4uLl0iCisgIGV4aXQgMAorZmkKKworcGFzc2VkPTAKK2ZhaWxlZD0wCitza2lwcGVkPTAKKworZm9yIHByb2cgaW4gIiRAIjsgZG8KKyAgZT0wCisgICIkZGlyLyRwcm9nIiB8fCBlPSQ/CisgIGNhc2UgJGUgaW4KKyAgICAoMCkKKyAgICAgIGVjaG8gIlBBU1M6ICRwcm9nIgorICAgICAgcGFzc2VkPWBleHByICRwYXNzZWQgKyAxYAorICAgICAgOzsKKyAgICAoNzcpCisgICAgICBlY2hvICJTS0lQOiAkcHJvZyIKKyAgICAgIHNraXBwZWQ9YGV4cHIgJHNraXBwZWQgKyAxYAorICAgICAgOzsKKyAgICAoKikKKyAgICAgIGVjaG8gIkZBSUw6ICRwcm9nIgorICAgICAgZmFpbGVkPWBleHByICRmYWlsZWQgKyAxYAorICAgICAgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICRmYWlsZWQgPSAwOyB0aGVuCisgICMgYXZvaWQgc2F5aW5nICJGQUlMIiwgdG8gbWFrZSBpdCBlYXN5IHRvIGdyZXAgcmVzdWx0cyEKKyAgZWNobyAiUEFTU0VEICRwYXNzZWQgLyBTS0lQUEVEICRza2lwcGVkIgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyAiUEFTU0VEICRwYXNzZWQgLyBGQUlMRUQgJGZhaWxlZCAvIFNLSVBQRUQgJHNraXBwZWQiCisgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL3Rlc3QvZmRwYXNzLmMgYi90ZXN0L2ZkcGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NWI0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZkcGFzcy5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgR19PU19VTklYCisjIGluY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisjICAgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKKy8qIEFyYml0cmFyeTsgaW5jbHVkZWQgaGVyZSB0byBhdm9pZCByZWx5aW5nIG9uIHRoZSBkZWZhdWx0ICovCisjZGVmaW5lIE1BWF9NRVNTQUdFX1VOSVhfRkRTIDIwCisvKiBUaGlzIHRlc3Qgd29uJ3Qgd29yayBvbiBMaW51eCB1bmxlc3MgdGhpcyBpcyB0cnVlLiAqLworX0RCVVNfU1RBVElDX0FTU0VSVCAoTUFYX01FU1NBR0VfVU5JWF9GRFMgPD0gMjUzKTsKKworLyogQXJiaXRyYXJ5OyBpbmNsdWRlZCBoZXJlIHRvIGF2b2lkIHJlbHlpbmcgb24gdGhlIGRlZmF1bHQuICovCisjZGVmaW5lIE1BWF9JTkNPTUlOR19VTklYX0ZEUyAoTUFYX01FU1NBR0VfVU5JWF9GRFMgKiA0KQorCisvKiBBcmJpdHJhcnksIGV4Y2VwdCB0aGF0IE1BWF9NRVNTQUdFX1VOSVhfRkRTICogU09NRV9NRVNTQUdFUyBzaG91bGQgYmUKKyAqIGxlc3MgdGhhbiB0aGUgcHJvY2VzcydzIGZpbGUgZGVzY3JpcHRvciBsaW1pdC4gKi8KKyNkZWZpbmUgU09NRV9NRVNTQUdFUyAyMAorLyogVG8gY292ZXIgc29tZSBzaXR1YXRpb25zIG9uIExpbnV4IHdlIHdhbnQgdGhpcyB0byBiZSB0cnVlLiAqLworX0RCVVNfU1RBVElDX0FTU0VSVCAoTUFYX01FU1NBR0VfVU5JWF9GRFMgKiBTT01FX01FU1NBR0VTID4gMjU2KTsKKworLyogTGludXggd29uJ3QgYWxsb3cgbW9yZSB0aGFuIDI1MyBmZHMgcGVyIHNlbmRtc2coKS4gKi8KKyNkZWZpbmUgVE9PX01BTllfRkRTIDI1NQorX0RCVVNfU1RBVElDX0FTU0VSVCAoTUFYX01FU1NBR0VfVU5JWF9GRFMgPCBUT09fTUFOWV9GRFMpOworCisvKiBBcyBpbiB0ZXN0L3JlbGF5LmMsIHRoaXMgaXMgYSBtaW5pYXR1cmUgZGJ1cy1kYWVtb246IHdlIHJlbGF5IG1lc3NhZ2VzCisgKiBmcm9tIHRoZSBjbGllbnQgb24gdGhlIGxlZnQgdG8gdGhlIGNsaWVudCBvbiB0aGUgcmlnaHQuCisgKgorICogbGVmdCAgICAgIHNvY2tldCAgICAgbGVmdCAgICAgIGRpc3BhdGNoICAgICByaWdodCAgICBzb2NrZXQgICAgIHJpZ2h0CisgKiBjbGllbnQgPT09PT09PT09PT0+ICBzZXJ2ZXIgLS0tLS0tLS0tLS0tLS0+IHNlcnZlciA9PT09PT09PT09PT4gY2xpZW50CisgKiBjb25uICAgICAgICAgICAgICAgICBjb25uICAgICAgICAgICAgICAgICAgIGNvbm4gICAgICAgICAgICAgICAgY29ubgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKworICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2NsaWVudF9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X3NlcnZlcl9jb25uOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKnJpZ2h0X3NlcnZlcl9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpyaWdodF9jbGllbnRfY29ubjsKKyAgICAvKiBxdWV1ZSBvZiBEQnVzTWVzc2FnZSByZWNlaXZlZCBieSByaWdodF9jbGllbnRfY29ubiAqLworICAgIEdRdWV1ZSBtZXNzYWdlczsKKworICAgIGludCBmZF9iZWZvcmU7Cit9IEZpeHR1cmU7CisKK3N0YXRpYyB2b2lkIG9vbSAoY29uc3QgZ2NoYXIgKmRvaW5nKSBHX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitvb20gKGNvbnN0IGdjaGFyICpkb2luZykKK3sKKyAgZ19lcnJvciAoIm91dCBvZiBtZW1vcnkgKCVzKSIsIGRvaW5nKTsKKyAgYWJvcnQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCithc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoImV4cGVjdGVkIHN1Y2Nlc3MgYnV0IGdvdCBlcnJvcjogJXM6ICVzIiwgZS0+bmFtZSwgZS0+bWVzc2FnZSk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorbGVmdF9zZXJ2ZXJfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChzZXJ2ZXJfY29ubiA9PSBmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uICE9IE5VTEwpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5yaWdodF9zZXJ2ZXJfY29ubiwgbWVzc2FnZSwgTlVMTCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CityaWdodF9jbGllbnRfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChjbGllbnRfY29ubiA9PSBmLT5yaWdodF9jbGllbnRfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+bWVzc2FnZXMsIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5fY2IgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoc2VydmVyX2Nvbm4sCisgICAgICBNQVhfTUVTU0FHRV9VTklYX0ZEUyk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChzZXJ2ZXJfY29ubiwKKyAgICAgIE1BWF9JTkNPTUlOR19VTklYX0ZEUyk7CisKKyAgaWYgKGYtPmxlZnRfc2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXJ2ZXJfY29ubiwKKyAgICAgICAgICBsZWZ0X3NlcnZlcl9tZXNzYWdlX2NiLCBmLCBOVUxMKSkKKyAgICAgICAgb29tICgiYWRkaW5nIGZpbHRlciIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfYXNzZXJ0IChmLT5yaWdodF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgICAgIGYtPnJpZ2h0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworICAgIH0KKworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgc2VydmVyX2Nvbm4pOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdib29sZWFuIHNob3VsZF9zdXBwb3J0X2ZkcykKK3sKKyAgY2hhciAqYWRkcmVzczsKKworICBnX2Fzc2VydCAoZi0+bGVmdF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpOworCisgIGFkZHJlc3MgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgZi0+bGVmdF9jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+bGVmdF9jbGllbnRfY29ubik7CisKKyAgLyogVGhlIGxlZnQgY2xpZW50IGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBiZWhhdmUgYWJ1c2l2ZWx5LiAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChmLT5sZWZ0X2NsaWVudF9jb25uLCAxMDAwKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIDEwMDAwMDApOworCisgIHdoaWxlIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGYtPnJpZ2h0X2NsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworCisgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisKKyAgd2hpbGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJpZ2h0X2NsaWVudF9jb25uLAorICAgICAgcmlnaHRfY2xpZW50X21lc3NhZ2VfY2IsIGYsIE5VTEwpKQorICAgIG9vbSAoImFkZGluZyBmaWx0ZXIiKTsKKworICAvKiBUaGUgcmlnaHQgY2xpZW50IGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBxdWV1ZSBhbGwgdGhlIG1lc3NhZ2VzLiAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChmLT5yaWdodF9jbGllbnRfY29ubiwgMTAwMCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChmLT5yaWdodF9jbGllbnRfY29ubiwgMTAwMDAwMCk7CisKKyAgd2hpbGUgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChmLT5yaWdodF9jbGllbnRfY29ubikgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGYtPmxlZnRfc2VydmVyX2Nvbm4pIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJyonKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGlmICghc2hvdWxkX3N1cHBvcnRfZmRzKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X2NsaWVudF9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgY2xpZW50IGNvbm5lY3Rpb24gY2Fubm90IHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgc2VydmVyIGNvbm5lY3Rpb24gY2Fubm90IHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5yaWdodF9jbGllbnRfY29ubiwKKyAgICAgICAgREJVU19UWVBFX1VOSVhfRkQpKQorICAgIGdfZXJyb3IgKCJyaWdodCBjbGllbnQgY29ubmVjdGlvbiBjYW5ub3Qgc2VuZCBVbml4IGZkcyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoInJpZ2h0IHNlcnZlciBjb25uZWN0aW9uIGNhbm5vdCBzZW5kIFVuaXggZmRzIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9jb21tb24gKEZpeHR1cmUgKmYsCisgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKyAgZ19xdWV1ZV9pbml0ICgmZi0+bWVzc2FnZXMpOworCisgIGYtPnNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnNlcnZlciAhPSBOVUxMKTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnNlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+c2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX3Vuc3VwcG9ydGVkIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBzZXR1cF9jb21tb24gKGYsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIC8qIFdlIGFzc3VtZSB0aGF0IGFueXRoaW5nIHdpdGggZmQtcGFzc2luZyBzdXBwb3J0cyB0aGUgdW5peDogdHJhbnNwb3J0ICovCisgIHNldHVwX2NvbW1vbiAoZiwgInVuaXg6dG1wZGlyPS90bXAiKTsKKworICBmLT5mZF9iZWZvcmUgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRE9OTFkpOworCisgIC8qIHRoaXMgc2hvdWxkIHN1Y2NlZWQgb24gYW55IHJlYXNvbmFibGUgVW5peCAqLworICBpZiAoZi0+ZmRfYmVmb3JlIDwgMCkKKyAgICBnX2Vycm9yICgiY2Fubm90IG9wZW4gL2Rldi9udWxsIGZvciByZWFkaW5nOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGYtPmZkX2JlZm9yZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdW5zdXBwb3J0ZWQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICB0ZXN0X2Nvbm5lY3QgKGYsIEZBTFNFKTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPmxlZnRfY2xpZW50X2Nvbm4sCisgICAgICAgIERCVVNfVFlQRV9VTklYX0ZEKSkKKyAgICBnX2Vycm9yICgibGVmdCBjbGllbnQgY29ubmVjdGlvbiBjbGFpbXMgaXQgY2FuIHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPmxlZnRfc2VydmVyX2Nvbm4sCisgICAgICAgIERCVVNfVFlQRV9VTklYX0ZEKSkKKyAgICBnX2Vycm9yICgibGVmdCBzZXJ2ZXIgY29ubmVjdGlvbiBjbGFpbXMgaXQgY2FuIHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPnJpZ2h0X2NsaWVudF9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoInJpZ2h0IGNsaWVudCBjb25uZWN0aW9uIGNsYWltcyBpdCBjYW4gc2VuZCBVbml4IGZkcyIpOworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZSAoZi0+cmlnaHRfc2VydmVyX2Nvbm4sCisgICAgICAgIERCVVNfVFlQRV9VTklYX0ZEKSkKKyAgICBnX2Vycm9yICgicmlnaHQgc2VydmVyIGNvbm5lY3Rpb24gY2xhaW1zIGl0IGNhbiBzZW5kIFVuaXggZmRzIik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlbGF5IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAvKiBXZSBhc3N1bWUgdGhhdCBhbnkgcGxhdGZvcm0gd2l0aCB3b3JraW5nIGZkLXBhc3NpbmcgaXMgUE9TSVgsCisgICAqIGFuZCB0aGVyZWZvcmUgaGFzIG9wZW4oKSBhbmQgZnN0YXQoKSAqLworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nLCAqaW5jb21pbmc7CisgIGludCBmZF9hZnRlcjsKKyAgc3RydWN0IHN0YXQgc3RhdF9iZWZvcmU7CisgIHN0cnVjdCBzdGF0IHN0YXRfYWZ0ZXI7CisKKyAgdGVzdF9jb25uZWN0IChmLCBUUlVFKTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmYtPmZkX2JlZm9yZSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIG91dGdvaW5nLCAmc2VyaWFsKSkKKyAgICBvb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpIDwgMSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bWVzc2FnZXMpOworCisgIGdfYXNzZXJ0IChkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGluY29taW5nKSwgPT0sCisgICAgICBEQlVTX1RZUEVfVU5JWF9GRF9BU19TVFJJTkcpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5jb21pbmcpLCA9PSwgc2VyaWFsKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAoaW5jb21pbmcsCisgICAgICAgICZmLT5lLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmZkX2FmdGVyLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIiVzOiAlcyIsIGYtPmUubmFtZSwgZi0+ZS5tZXNzYWdlKTsKKworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKworICBpZiAoZnN0YXQgKGYtPmZkX2JlZm9yZSwgJnN0YXRfYmVmb3JlKSA8IDApCisgICAgZ19lcnJvciAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBpZiAoZnN0YXQgKGZkX2FmdGVyLCAmc3RhdF9hZnRlcikgPCAwKQorICAgIGdfZXJyb3IgKCIlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgLyogdGhpcyBzZWVtcyBsaWtlIGVub3VnaCB0byBzYXkgIml0J3MgdGhlIHNhbWUgZmlsZSIgKi8KKyAgZ19hc3NlcnRfY21waW50IChzdGF0X2JlZm9yZS5zdF9kZXYsID09LCBzdGF0X2FmdGVyLnN0X2Rldik7CisgIGdfYXNzZXJ0X2NtcGludCAoc3RhdF9iZWZvcmUuc3RfaW5vLCA9PSwgc3RhdF9hZnRlci5zdF9pbm8pOworICBnX2Fzc2VydF9jbXBpbnQgKHN0YXRfYmVmb3JlLnN0X3JkZXYsID09LCBzdGF0X2FmdGVyLnN0X3JkZXYpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworCisgIGlmIChjbG9zZSAoZmRfYWZ0ZXIpIDwgMCkKKyAgICBnX2Vycm9yICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpOworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X3NlcnZlcl9jb25uKSk7CisjZWxzZQorICBnX3Rlc3Rfc2tpcCAoImZkLXBhc3Npbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbGltaXQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmcsICppbmNvbWluZzsKKyAgaW50IGk7CisKKyAgdGVzdF9jb25uZWN0IChmLCBUUlVFKTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9NRVNTQUdFX1VOSVhfRkRTOyBpKyspCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nLAorICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZmLT5mZF9iZWZvcmUsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZywgJnNlcmlhbCkpCisgICAgb29tICgic2VuZGluZyBtZXNzYWdlIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1lc3NhZ2VzKSA8IDEpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1lc3NhZ2VzKSwgPT0sIDEpOworCisgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzIChpbmNvbWluZykpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGluY29taW5nKSwgPT0sCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoaW5jb21pbmcpLCA9PSwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5jb21pbmcpLCA9PSwgc2VyaWFsKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpOworI2Vsc2UKKyAgZ190ZXN0X3NraXAgKCJmZC1wYXNzaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Rvb19tYW55IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmc7CisgIHVuc2lnbmVkIGludCBpOworCisgIHRlc3RfY29ubmVjdCAoZiwgVFJVRSk7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVTU0FHRV9VTklYX0ZEUyArIEdQT0lOVEVSX1RPX1VJTlQgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nLAorICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZmLT5mZF9iZWZvcmUsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZywgTlVMTCkpCisgICAgb29tICgic2VuZGluZyBtZXNzYWdlIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7CisKKyAgLyogVGhlIHNlbmRlciBpcyB1bmNlcmVtb25pb3VzbHkgZGlzY29ubmVjdGVkLiAqLworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pIHx8CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIC8qIFRoZSBtZXNzYWdlIGRpZG4ndCBnZXQgdGhyb3VnaCB3aXRob3V0IGl0cyBmZHMuICovCisgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1lc3NhZ2VzKSwgPT0sIDApOworCisgIC8qIFRoZSBpbnRlbmRlZCB2aWN0aW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgbGVmdCBjb25uZWN0aW9uJ3MKKyAgICogbWlzYmVoYXZpb3VyLiAqLworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pKTsKKyNlbHNlCisgIGdfdGVzdF9za2lwICgiZmQtcGFzc2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGVzdF90b29fbWFueV9zcGxpdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nOworICBpbnQgaTsKKyAgREJ1c1NvY2tldCBsZWZ0X2NsaWVudF9zb2NrZXQ7CisgIGNoYXIgKnBheWxvYWQ7CisgIGludCBwYXlsb2FkX2xlbjsKKyAgREJ1c1N0cmluZyBidWZmZXI7CisgIGludCBmZHNbVE9PX01BTllfRkRTXTsKKyAgaW50IGRvbmU7CisKKyAgLyogVGhpcyB0ZXN0IGRlbGliZXJhdGVseSBwdXNoZXMgdXAgYWdhaW5zdCBPUyBsaW1pdHMsIHNvIHNraXAgaXQKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZmRzLiA0IHRpbWVzIHRoZSBtYXhpbXVtIHBlciBtZXNzYWdlCisgICAqIG91Z2h0IHRvIGJlIGVub3VnaDogdGhhdCB3aWxsIGNvdmVyIHRoZSBtZXNzYWdlLCB0aGUgZHVwJ2QgZmRzCisgICAqIHdlIGFjdHVhbGx5IHNlbmQsIHRoZSBjb3B5IHRoYXQgd2UgcG90ZW50aWFsbHkgcmVjZWl2ZSwgYW5kIHNvbWUKKyAgICogc3BhcmUgY2FwYWNpdHkgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gKi8KKyNpZmRlZiBIQVZFX0dFVFJMSU1JVAorICBzdHJ1Y3QgcmxpbWl0IGxpbTsKKworICBpZiAoZ2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmbGltKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChsaW0ucmxpbV9jdXIgIT0gUkxJTV9JTkZJTklUWSAmJgorICAgICAgICAgIGxpbS5ybGltX2N1ciA8IDQgKiBUT09fTUFOWV9GRFMpCisgICAgICAgIHsKKyAgICAgICAgICBnX3Rlc3Rfc2tpcCAoIm5vdCBlbm91Z2ggUkxJTUlUX05PRklMRSIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgIHRlc3RfY29ubmVjdCAoZiwgVFJVRSk7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIC8qIFRPT19NQU5ZX0ZEUyBmZHMgYXJlIGZhciB0b28gbWFueTogaW4gcGFydGljdWxhciwgTGludXggZG9lc24ndCBhbGxvdworICAgKiBzZW5kaW5nIHRoaXMgbWFueSBpbiBhIHNpbmdsZSBzZW5kbXNnKCkuIGxpYmRidXMgbmV2ZXIgc3BsaXRzCisgICAqIGEgbWVzc2FnZSBiZXR3ZWVuIHR3byBzZW5kbXNnKCkgY2FsbHMgaWYgaXQgY2FuIGhlbHAgaXQsIGFuZAorICAgKiBpbiBwYXJ0aWN1bGFyIGl0IGFsd2F5cyBzZW5kcyBhbGwgdGhlIGZkcyB3aXRoIHRoZSBmaXJzdCBzZW5kbXNnKCksCisgICAqIGJ1dCBtYWxpY2lvdXMgc2VuZGVycyBtaWdodCBub3QgYmUgc28gY29uc2lkZXJhdGUuICovCisgIGZvciAoaSA9IDA7IGkgPCBUT09fTUFOWV9GRFM7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAob3V0Z29pbmcsCisgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmYtPmZkX2JlZm9yZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgb29tICgiYXBwZW5kaW5nIGZkIik7CisgICAgfQorCisgIC8qIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IHdvcmsgZm9yIG1lc3NhZ2VzIHdpdGggZmRzLCBidXQgaXQgZG9lcywKKyAgICogd2hpY2ggaXMgY29udmVuaWVudCBmb3IgdGhpcyBzb3J0IG9mIHRyaWNrZXJ5LiAqLworICBpZiAoIWRidXNfbWVzc2FnZV9tYXJzaGFsIChvdXRnb2luZywgJnBheWxvYWQsICZwYXlsb2FkX2xlbikpCisgICAgb29tICgibWFyc2hhbGxpbmcgbWVzc2FnZSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmJ1ZmZlciwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCisgIGZvciAoaSA9IDA7IGkgPCBUT09fTUFOWV9GRFM7IGkrKykKKyAgICB7CisgICAgICBmZHNbaV0gPSBkdXAgKGYtPmZkX2JlZm9yZSk7CisKKyAgICAgIGlmIChmZHNbaV0gPCAwKQorICAgICAgICBnX2Vycm9yICgiY291bGQgbm90IGR1cCBmZDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKworICAvKiBUaGlzIGlzIGJsYXRhbnQgY2hlYXRpbmcsIGFuZCB0aGUgQVBJIGRvY3VtZW50YXRpb24gc3BlY2lmaWNhbGx5CisgICAqIHRlbGxzIHlvdSBub3QgdXNlIHRoaXMgZnVuY3Rpb24gaW4gdGhpcyB3YXkuIE5ldmVyIGRvIHRoaXMKKyAgICogaW4gYXBwbGljYXRpb24gY29kZS4gKi8KKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldCAoZi0+bGVmdF9jbGllbnRfY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRfY2xpZW50X3NvY2tldC5mZCkpCisgICAgZ19lcnJvciAoIid1bml4OicgREJ1c0Nvbm5lY3Rpb24gc2hvdWxkIGhhdmUgaGFkIGEgc29ja2V0Iik7CisKKyAgLyogSnVzdCB0byBiZSBzdXJlIHRoYXQgd2UncmUgYXQgYSBtZXNzYWdlIGJvdW5kYXJ5LiAqLworICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGYtPmxlZnRfY2xpZW50X2Nvbm4pOworCisgIC8qIFdlIGhhdmUgdG9vIG1hbnkgZmRzIGZvciBvbmUgc2VuZG1zZygpLCBzbyBzZW5kIHRoZSBmaXJzdCBoYWxmCisgICAqIChyb3VuZGluZyBkb3duIGlmIG9kZCkgd2l0aCB0aGUgZmlyc3QgYnl0ZS4uLiAqLworICBkb25lID0gX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMgKGxlZnRfY2xpZW50X3NvY2tldCwgJmJ1ZmZlciwgMCwgMSwKKyAgICAgICAgJmZkc1swXSwgVE9PX01BTllfRkRTIC8gMik7CisKKyAgaWYgKGRvbmUgPCAwKQorICAgIGdfZXJyb3IgKCJjb3VsZCBub3Qgc2VuZCBmaXJzdCBieXRlIGFuZCBmaXJzdCBiYXRjaCBvZiBmZHM6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICAvKiAuLi4gYW5kIHRoZSBzZWNvbmQgaGFsZiAocm91bmRpbmcgdXAgaWYgb2RkKSB3aXRoIHRoZSByZXN0IG9mCisgICAqIHRoZSBtZXNzYWdlICovCisgIGRvbmUgPSBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2ZkcyAobGVmdF9jbGllbnRfc29ja2V0LCAmYnVmZmVyLCAxLAorICAgICAgICBwYXlsb2FkX2xlbiAtIDEsICZmZHNbVE9PX01BTllfRkRTIC8gMl0sCisgICAgICAgIFRPT19NQU5ZX0ZEUyAtIChUT09fTUFOWV9GRFMgLyAyKSk7CisKKyAgaWYgKGRvbmUgPCAwKQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJjb3VsZCBub3Qgc2VuZCByZXN0IG9mIG1lc3NhZ2UgYW5kIHJlc3Qgb2YgZmRzOiAlcyIsCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIGVsc2UgaWYgKGRvbmUgPCBwYXlsb2FkX2xlbiAtIDEpCisgICAgeworICAgICAgLyogRm9yIHNpbXBsaWNpdHksIGFzc3VtZSB0aGUgc29ja2V0IGJ1ZmZlciBpcyBiaWcgZW5vdWdoIGZvciB0aGUKKyAgICAgICAqIHdob2xlIG1lc3NhZ2UsIHdoaWNoIHNob3VsZCBiZSA8IDIgS2lCLiBJZiB0aGlzIGZhaWxzIG9uIHNvbWUKKyAgICAgICAqIE9TLCByZWRvIHRoaXMgdGVzdCBjb2RlIHRvIHVzZSBhIHByb3BlciBsb29wIGxpa2UgdGhlIHJlYWwKKyAgICAgICAqIGxpYmRidXMgZG9lcy4gKi8KKyAgICAgIGdfZXJyb3IgKCJzaG9ydCB3cml0ZSBpbiBzZW5kbXNnKCksIGZpeCB0aGlzIHRlc3Q6ICVkLyVkIiwKKyAgICAgICAgICBkb25lLCBwYXlsb2FkX2xlbiAtIDEpOworICAgIH0KKworICBkYnVzX2ZyZWUgKHBheWxvYWQpOworCisgIGZvciAoaSA9IDA7IGkgPCBUT09fTUFOWV9GRFM7IGkrKykKKyAgICBjbG9zZSAoZmRzW2ldKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKKworICAvKiBUaGUgc2VuZGVyIGlzIHVuY2VyZW1vbmlvdXNseSBkaXNjb25uZWN0ZWQuICovCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9jbGllbnRfY29ubikgfHwKKyAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X3NlcnZlcl9jb25uKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgLyogVGhlIG1lc3NhZ2UgZGlkbid0IGdldCB0aHJvdWdoIHdpdGhvdXQgaXRzIGZkcy4gKi8KKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgMCk7CisKKyAgLyogVGhlIGludGVuZGVkIHZpY3RpbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBsZWZ0IGNvbm5lY3Rpb24ncworICAgKiBtaXNiZWhhdmlvdXIuICovCisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpOworI2Vsc2UKKyAgZ190ZXN0X3NraXAgKCJmZC1wYXNzaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Zsb29kIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nW1NPTUVfTUVTU0FHRVNdOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIFRSVUUpOworCisgIGZvciAoaiA9IDA7IGogPCBTT01FX01FU1NBR0VTOyBqKyspCisgICAgeworICAgICAgb3V0Z29pbmdbal0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgICAgICBnX2Fzc2VydCAob3V0Z29pbmdbal0gIT0gTlVMTCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBHUE9JTlRFUl9UT19VSU5UIChkYXRhKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nW2pdLAorICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmZi0+ZmRfYmVmb3JlLAorICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworICAgICAgICB9CisgICAgfQorCisgIC8qIFRoaXMgaXMgaW4gaXRzIG93biBsb29wIHNvIHdlIGRvIGl0IGFzIGZhc3QgYXMgcG9zc2libGUgKi8KKyAgZm9yIChqID0gMDsgaiA8IFNPTUVfTUVTU0FHRVM7IGorKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZ1tqXSwgJnNlcmlhbCkpCisgICAgICAgIG9vbSAoInNlbmRpbmcgbWVzc2FnZSIpOworICAgIH0KKworICBmb3IgKGogPSAwOyBqIDwgU09NRV9NRVNTQUdFUzsgaisrKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmdbal0pOworICAgIH0KKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpIDwgU09NRV9NRVNTQUdFUykKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgU09NRV9NRVNTQUdFUyk7CisKKyAgZm9yIChqID0gMDsgaiA8IFNPTUVfTUVTU0FHRVM7IGorKykKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqaW5jb21pbmc7CisKKyAgICAgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1lc3NhZ2VzKTsKKworICAgICAgZ19hc3NlcnQgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoaW5jb21pbmcpLCA9PSwgIkdyZWV0aW5nIik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LCAiL2NvbS9leGFtcGxlL0hlbGxvIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworICAgIH0KKworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpOworI2Vsc2UKKyAgZ190ZXN0X3NraXAgKCJmZC1wYXNzaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29kZF9saW1pdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nOworICBpbnQgaTsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIFRSVUUpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChmLT5sZWZ0X3NlcnZlcl9jb25uLCA3KTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoZi0+cmlnaHRfc2VydmVyX2Nvbm4sIDcpOworCisgIG91dGdvaW5nID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvY29tL2V4YW1wbGUvSGVsbG8iLAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0IChvdXRnb2luZyAhPSBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNyArIEdQT0lOVEVSX1RPX0lOVCAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAob3V0Z29pbmcsCisgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmYtPmZkX2JlZm9yZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgb29tICgiYXBwZW5kaW5nIGZkIik7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIG91dGdvaW5nLCBOVUxMKSkKKyAgICBvb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKKworICBpZiAoR1BPSU5URVJfVE9fSU5UIChkYXRhKSA+IDApCisgICAgeworICAgICAgLyogVGhlIHNlbmRlciBpcyB1bmNlcmVtb25pb3VzbHkgZGlzY29ubmVjdGVkLiAqLworICAgICAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSB8fAorICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X3NlcnZlcl9jb25uKSkKKyAgICAgICAgeworICAgICAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICAgICAgfQorCisgICAgICAvKiBUaGUgbWVzc2FnZSBkaWRuJ3QgZ2V0IHRocm91Z2ggd2l0aG91dCBpdHMgZmRzLiAqLworICAgICAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgMCk7CisKKyAgICAgIC8qIFRoZSBpbnRlbmRlZCB2aWN0aW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgbGVmdCBjb25uZWN0aW9uJ3MKKyAgICAgICAqIG1pc2JlaGF2aW91ci4gKi8KKyAgICAgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pKTsKKyAgICAgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqaW5jb21pbmc7CisKKyAgICAgIC8qIFdlJ3JlIGF0IG9yIHVuZGVyIHRoZSBsaW1pdC4gVGhlIG1lc3NhZ2UgZ2V0cyB0aHJvdWdoIGludGFjdC4gKi8KKyAgICAgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcykgPCAxKQorICAgICAgICB7CisgICAgICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgICAgICB9CisKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1lc3NhZ2VzKSwgPT0sIDEpOworCisgICAgICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisKKyAgICAgIGdfYXNzZXJ0IChkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKGluY29taW5nKSwgPT0sIE5VTEwpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwKKyAgICAgICAgICAiL2NvbS9leGFtcGxlL0hlbGxvIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworCisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKSk7CisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pKTsKKyAgICAgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpOworICAgIH0KKyNlbHNlCisgIGdfdGVzdF9za2lwICgiZmQtcGFzc2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhIEdfR05VQ19VTlVTRUQpCit7CisgIGlmIChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5sZWZ0X2NsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9jbGllbnRfY29ubik7CisgICAgICBmLT5sZWZ0X2NsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5yaWdodF9jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJpZ2h0X2NsaWVudF9jb25uKTsKKyAgICAgIGYtPnJpZ2h0X2NsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPmxlZnRfc2VydmVyX2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmxlZnRfc2VydmVyX2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgICAgIGYtPmxlZnRfc2VydmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pOworICAgICAgZi0+cmlnaHRfc2VydmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+c2VydmVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoZi0+c2VydmVyKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChmLT5zZXJ2ZXIpOworICAgICAgZi0+c2VydmVyID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPmN0eCAhPSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaWYgKGYtPmZkX2JlZm9yZSA+PSAwICYmIGNsb3NlIChmLT5mZF9iZWZvcmUpIDwgMCkKKyAgICBnX2Vycm9yICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworI2VuZGlmCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworI2lmZGVmIEhBVkVfR0VUUkxJTUlUCisgICAgeworICAgICAgc3RydWN0IHJsaW1pdCBsaW07CisKKyAgICAgIGlmIChnZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pIDwgMCkKKyAgICAgICAgZ19lcnJvciAoIkZhaWxlZCB0byBnZXQgUkxJTUlUX05PRklMRSBsaW1pdDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBpZiAobGltLnJsaW1fY3VyICE9IFJMSU1fSU5GSU5JVFkgJiYKKyAgICAgICAgICAvKiBvbmx5IHJ1biBpZiB3ZSBoYXZlIGEgZmFpcmx5IGdlbmVyb3VzIG1hcmdpbiBvZiBlcnJvcgorICAgICAgICAgICAqIGZvciBzdGRvdXQsIHN0ZGVyciwgZHVwbGljYXRlcywgdGhlIEQtQnVzIGNvbm5lY3Rpb24sIGV0Yy4gKi8KKyAgICAgICAgICBsaW0ucmxpbV9jdXIgPCAyICogTUFYX01FU1NBR0VfVU5JWF9GRFMgKiBTT01FX01FU1NBR0VTKQorICAgICAgICB7CisgICAgICAgICAgZ19tZXNzYWdlICgibm90IGVub3VnaCBSTElNSVRfTk9GSUxFIHRvIHJ1biB0aGlzIHRlc3QiKTsKKyAgICAgICAgICAvKiBBdXRvdG9vbHMgZXhpdCBjb2RlIGZvciAiYWxsIHNraXBwZWQiICovCisgICAgICAgICAgcmV0dXJuIDc3OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgZ190ZXN0X2FkZCAoIi91bnN1cHBvcnRlZCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwX3Vuc3VwcG9ydGVkLAorICAgICAgdGVzdF91bnN1cHBvcnRlZCwgdGVhcmRvd24pOworCisgIGdfdGVzdF9hZGQgKCIvcmVsYXkiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfcmVsYXksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9saW1pdCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9saW1pdCwgdGVhcmRvd24pOworCisgIGdfdGVzdF9hZGQgKCIvdG9vLW1hbnkvcGx1czEiLCBGaXh0dXJlLCBHVUlOVF9UT19QT0lOVEVSICgxKSwgc2V0dXAsCisgICAgICB0ZXN0X3Rvb19tYW55LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvdG9vLW1hbnkvcGx1czIiLCBGaXh0dXJlLCBHVUlOVF9UT19QT0lOVEVSICgyKSwgc2V0dXAsCisgICAgICB0ZXN0X3Rvb19tYW55LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvdG9vLW1hbnkvcGx1czE3IiwgRml4dHVyZSwgR1VJTlRfVE9fUE9JTlRFUiAoMTcpLCBzZXR1cCwKKyAgICAgIHRlc3RfdG9vX21hbnksIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL3Rvby1tYW55L3NwbGl0IiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X3Rvb19tYW55X3NwbGl0LCB0ZWFyZG93bik7CisKKyAgZ190ZXN0X2FkZCAoIi9mbG9vZC8xIiwgRml4dHVyZSwgR1VJTlRfVE9fUE9JTlRFUiAoMSksCisgICAgICBzZXR1cCwgdGVzdF9mbG9vZCwgdGVhcmRvd24pOworI2lmIE1BWF9NRVNTQUdFX1VOSVhfRkRTID49IDIKKyAgZ190ZXN0X2FkZCAoIi9mbG9vZC9oYWxmLWxpbWl0IiwgRml4dHVyZSwKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKE1BWF9NRVNTQUdFX1VOSVhfRkRTIC8gMiksCisgICAgICBzZXR1cCwgdGVzdF9mbG9vZCwgdGVhcmRvd24pOworI2VuZGlmCisjaWYgTUFYX01FU1NBR0VfVU5JWF9GRFMgPj0gNAorICBnX3Rlc3RfYWRkICgiL2Zsb29kL292ZXItaGFsZi1saW1pdCIsIEZpeHR1cmUsCisgICAgICBHVUlOVF9UT19QT0lOVEVSICgzICogTUFYX01FU1NBR0VfVU5JWF9GRFMgLyA0KSwKKyAgICAgIHNldHVwLCB0ZXN0X2Zsb29kLCB0ZWFyZG93bik7CisjZW5kaWYKKyAgZ190ZXN0X2FkZCAoIi9mbG9vZC9saW1pdCIsIEZpeHR1cmUsCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChNQVhfTUVTU0FHRV9VTklYX0ZEUyksIHNldHVwLCB0ZXN0X2Zsb29kLCB0ZWFyZG93bik7CisKKyAgZ190ZXN0X2FkZCAoIi9vZGQtbGltaXQvbWludXMxIiwgRml4dHVyZSwgR0lOVF9UT19QT0lOVEVSICgtMSksIHNldHVwLAorICAgICAgdGVzdF9vZGRfbGltaXQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9vZGQtbGltaXQvYXQiLCBGaXh0dXJlLCBHSU5UX1RPX1BPSU5URVIgKDApLCBzZXR1cCwKKyAgICAgIHRlc3Rfb2RkX2xpbWl0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvb2RkLWxpbWl0L3BsdXMxIiwgRml4dHVyZSwgR0lOVF9UT19QT0lOVEVSICgrMSksIHNldHVwLAorICAgICAgdGVzdF9vZGRfbGltaXQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9vZGQtbGltaXQvcGx1czIiLCBGaXh0dXJlLCBHSU5UX1RPX1BPSU5URVIgKCsyKSwgc2V0dXAsCisgICAgICB0ZXN0X29kZF9saW1pdCwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9nbGliLXRhcC10ZXN0LnNoIGIvdGVzdC9nbGliLXRhcC10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlNWU2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dsaWItdGFwLXRlc3Quc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisjIFdyYXBwZXIgdG8gbWFrZSBHVGVzdCB0ZXN0cyBvdXRwdXQgVEFQIHN5bnRheCwgYmVjYXVzZSBBdXRvbWFrZSdzIHRlc3QKKyMgZHJpdmVycyBkbyBub3QgY3VycmVudGx5IHN1cHBvcnQgcGFzc2luZyB0aGUgc2FtZSBjb21tYW5kLWxpbmUgYXJndW1lbnQKKyMgdG8gZWFjaCB0ZXN0IGV4ZWN1dGFibGUuIEFsbCBHVGVzdCB0ZXN0cyBwcm9kdWNlIFRBUCBvdXRwdXQgaWYgaW52b2tlZAorIyB3aXRoIHRoZSAtLXRhcCBvcHRpb24uCisjCisjIFVzYWdlOiAiZ2xpYi10YXAtdGVzdC5zaCB0ZXN0LWZvbyAtLXZlcmJvc2UgLi4uIiBpcyBlcXVpdmFsZW50IHRvCisjICJ0ZXN0LWZvbyAtLXRhcCAtLXZlcmJvc2UgLi4uIgorCitzZXQgLWUKK3Q9IiQxIgorc2hpZnQKKworY2FzZSAiJHQiIGluCisgICAgKCouZXhlKQorICAgICAgICAjIFdlJ3JlIHJ1bm5pbmcgYSBXaW5kb3dzIGV4ZWN1dGFibGUsIHBvc3NpYmx5IG9uIGEgVW5peAorICAgICAgICAjIHBsYXRmb3JtLiBBdm9pZCBoYXZpbmcgaW52YWxpZCBUQVAgc3ludGF4IGxpa2UgIm9rIDNcclxuIgorICAgICAgICAjIHdoZXJlICJvayAzXG4iIHdhcyBpbnRlbmRlZC4KKyAgICAgICAgZWNobyAxID4gIiR0Ii5leGl0LXN0YXR1cy50bXAKKyAgICAgICAgKAorICAgICAgICAgICAgc2V0ICtlCisgICAgICAgICAgICAiJHQiIC0tdGFwICIkQCIKKyAgICAgICAgICAgIGVjaG8gIiQ/IiA+ICIkdCIuZXhpdC1zdGF0dXMudG1wCisgICAgICAgICkgfCBzZWQgLWUgJ3MvXHIkLy8nCisgICAgICAgIGU9IiQoY2F0ICIkdCIuZXhpdC1zdGF0dXMudG1wKSIKKyAgICAgICAgcm0gIiR0Ii5leGl0LXN0YXR1cy50bXAKKyAgICAgICAgZXhpdCAiJGUiCisgICAgICAgIDs7CisKKyAgICAoKikKKyAgICAgICAgZXhlYyAiJHQiIC0tdGFwICIkQCIKKyAgICAgICAgOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZXJuYWxzL3ByaW50Zi5jIGIvdGVzdC9pbnRlcm5hbHMvcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNmYzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW50ZXJuYWxzL3ByaW50Zi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQKKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK2RvX3Rlc3QgKGludCBtaW5pbXVtLAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIGludCByZXN1bHQ7CisKKyAgdmFfc3RhcnQgKGFwLCBmb3JtYXQpOworICByZXN1bHQgPSBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIChmb3JtYXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisKKyAgaWYgKHJlc3VsdCA8IG1pbmltdW0pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZXhwZWN0ZWQgYXQgbGVhc3QgJWQsIGdvdCAlZFxuIiwgbWluaW11bSwgcmVzdWx0KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworI2RlZmluZSBYX1RJTUVTXzggIlhYWFhYWFhYIgorI2RlZmluZSBYX1RJTUVTXzE2ICAgWF9USU1FU184ICAgWF9USU1FU184CisjZGVmaW5lIFhfVElNRVNfMzIgICBYX1RJTUVTXzE2ICBYX1RJTUVTXzE2CisjZGVmaW5lIFhfVElNRVNfNjQgICBYX1RJTUVTXzMyICBYX1RJTUVTXzMyCisjZGVmaW5lIFhfVElNRVNfMTI4ICBYX1RJTUVTXzY0ICBYX1RJTUVTXzY0CisjZGVmaW5lIFhfVElNRVNfMjU2ICBYX1RJTUVTXzEyOCBYX1RJTUVTXzEyOAorI2RlZmluZSBYX1RJTUVTXzUxMiAgWF9USU1FU18yNTYgWF9USU1FU18yNTYKKyNkZWZpbmUgWF9USU1FU18xMDI0IFhfVElNRVNfNTEyIFhfVElNRVNfNTEyCisKKy8qIFRoaXMgdGVzdCBvdXRwdXRzIFRBUCBzeW50YXg6IGh0dHA6Ly90ZXN0YW55dGhpbmcub3JnLyAqLworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgY2hhciBidWZbXSA9IFhfVElNRVNfMTAyNCBYX1RJTUVTXzEwMjQgWF9USU1FU18xMDI0IFhfVElNRVNfMTAyNDsKKyAgaW50IGk7CisgIGludCB0ZXN0X251bSA9IDA7CisKKyAgZG9fdGVzdCAoMSwgIiVkIiwgMCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBkb190ZXN0ICg3LCAiJWQiLCAxMjM0NTY3KTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIGRvX3Rlc3QgKDMsICIlZiIsIDMuNSk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBkb190ZXN0ICgwLCAiJXMiLCAiIik7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBkb190ZXN0ICgxMDI0LCAiJXMiLCBYX1RJTUVTXzEwMjQpOworICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisKKyAgZG9fdGVzdCAoMTAyNSwgIiVzIiwgWF9USU1FU18xMDI0ICJZIik7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBmb3IgKGkgPSA0MDk2OyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgIGJ1ZltpXSA9ICdcMCc7CisgICAgICBkb190ZXN0IChpLCAiJXMiLCBidWYpOworICAgICAgZG9fdGVzdCAoaSArIDMsICIlczolZCIsIGJ1ZiwgNDIpOworICAgIH0KKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIC8qIFRlbGwgdGhlIFRBUCBkcml2ZXIgdGhhdCB3ZSBoYXZlIGRvbmUgYWxsIHRoZSB0ZXN0cyB3ZSBwbGFuIHRvIGRvLgorICAgKiBUaGlzIGlzIGhvdyBpdCBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiB1bmV4cGVjdGVkIGV4aXQgYW5kCisgICAqIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4gKi8KKyAgcHJpbnRmICgiMS4uJWRcbiIsIHRlc3RfbnVtKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2ludGVybmFscy9yZWZzLmMgYi90ZXN0L2ludGVybmFscy9yZWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2NTY2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW50ZXJuYWxzL3JlZnMuYwpAQCAtMCwwICsxLDYzNiBAQAorLyogUmVncmVzc2lvbiB0ZXN0IGZvciB0aHJlYWQtc2FmZSByZWZlcmVuY2UtY291bnRpbmcKKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCisjZGVmaW5lIE5fVEhSRUFEUyAyMDAKKyNkZWZpbmUgTl9SRUZTIDEwMDAwCitHX1NUQVRJQ19BU1NFUlQgKCgodW5zaWduZWQpIE5fVEhSRUFEUyAqICh1bnNpZ25lZCkgTl9SRUZTKSA8IEdfTUFYSU5UMzIpOworCitzdGF0aWMgZGJ1c19pbnQzMl90IGNvbm5lY3Rpb25fc2xvdCA9IC0xOworc3RhdGljIGRidXNfaW50MzJfdCBzZXJ2ZXJfc2xvdCA9IC0xOworc3RhdGljIGRidXNfaW50MzJfdCBtZXNzYWdlX3Nsb3QgPSAtMTsKK3N0YXRpYyBkYnVzX2ludDMyX3QgcGVuZGluZ19jYWxsX3Nsb3QgPSAtMTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBEQnVzRXJyb3IgZTsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubmVjdGlvbjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIEdUaHJlYWQgKnRocmVhZHNbTl9USFJFQURTXTsKKyAgZ2Jvb2xlYW4gbGFzdF91bnJlZjsKKyAgdW5zaWduZWQgbl9yZWZzOworICB1bnNpZ25lZCBuX3RocmVhZHM7Cit9IEZpeHR1cmU7CisKK3R5cGVkZWYgdm9pZCAqKCpSZWZGdW5jKSAodm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKlZvaWRGdW5jKSAodm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBGaXh0dXJlICpmOworICB2b2lkICp0aGluZzsKKyAgUmVmRnVuYyByZWY7CisgIFZvaWRGdW5jIHJlZl92b2lkOworICBWb2lkRnVuYyB1bnJlZjsKKyAgdm9pZCAqbXV0ZXg7CisgIFZvaWRGdW5jIGxvY2s7CisgIFZvaWRGdW5jIHVubG9jazsKK30gVGhyZWFkOworCisvKiBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0gd2hlbiBidWlsZGluZyB3aXRoIGEgZ2xpYiA8PSAyLjMwLnggKi8KKyNpZiAhR0xJQl9DSEVDS19WRVJTSU9OKDIsMzEsMCkKKyNkZWZpbmUgZ190aHJlYWRfbmV3KG5hbWUsZnVuYyxkYXRhKSBnX3RocmVhZF9jcmVhdGUoZnVuYyxkYXRhLFRSVUUsTlVMTCkKKyNlbmRpZgorCitzdGF0aWMgZ3BvaW50ZXIKK3JlZl90aHJlYWQgKGdwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCAqdGhyZWFkID0gZGF0YTsKKyAgY29uc3QgRml4dHVyZSAqZiA9IHRocmVhZC0+ZjsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl9yZWZzOyBpKyspCisgICAgeworICAgICAgaWYgKHRocmVhZC0+bG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisKKyAgICAgIGlmICh0aHJlYWQtPnJlZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ3BvaW50ZXIgcmV0ID0gKHRocmVhZC0+cmVmKSAodGhyZWFkLT50aGluZyk7CisKKyAgICAgICAgICBnX2Fzc2VydCAocmV0ID09IHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAodGhyZWFkLT5yZWZfdm9pZCkgKHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisKKyAgICAgIGlmICh0aHJlYWQtPnVubG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT51bmxvY2spICh0aHJlYWQtPm11dGV4KTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBncG9pbnRlcgorY3ljbGVfdGhyZWFkIChncG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgKnRocmVhZCA9IGRhdGE7CisgIGNvbnN0IEZpeHR1cmUgKmYgPSB0aHJlYWQtPmY7CisgIHVuc2lnbmVkIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fcmVmczsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0aHJlYWQtPmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+bG9jaykgKHRocmVhZC0+bXV0ZXgpOworCisgICAgICBpZiAodGhyZWFkLT5yZWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGdwb2ludGVyIHJldCA9ICh0aHJlYWQtPnJlZikgKHRocmVhZC0+dGhpbmcpOworCisgICAgICAgICAgZ19hc3NlcnQgKHJldCA9PSB0aHJlYWQtPnRoaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKHRocmVhZC0+cmVmX3ZvaWQpICh0aHJlYWQtPnRoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAodGhyZWFkLT51bnJlZikgKHRocmVhZC0+dGhpbmcpOworCisgICAgICBpZiAodGhyZWFkLT51bmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+dW5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ3BvaW50ZXIKK3VucmVmX3RocmVhZCAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkICp0aHJlYWQgPSBkYXRhOworICBjb25zdCBGaXh0dXJlICpmID0gdGhyZWFkLT5mOworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3JlZnM7IGkrKykKKyAgICB7CisgICAgICBpZiAodGhyZWFkLT5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPmxvY2spICh0aHJlYWQtPm11dGV4KTsKKworICAgICAgKHRocmVhZC0+dW5yZWYpICh0aHJlYWQtPnRoaW5nKTsKKworICAgICAgaWYgKHRocmVhZC0+dW5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPnVubG9jaykgKHRocmVhZC0+bXV0ZXgpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2xhc3RfdW5yZWYgKHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0ICghZi0+bGFzdF91bnJlZik7CisgIGYtPmxhc3RfdW5yZWYgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAord2FpdF9mb3JfYWxsX3RocmVhZHMgKEZpeHR1cmUgKmYpCit7CisgIHVuc2lnbmVkIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIGdfdGhyZWFkX2pvaW4gKGYtPnRocmVhZHNbaV0pOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5fY2IgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm5lY3Rpb24sCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKGYtPnNlcnZlcl9jb25uZWN0aW9uID09IE5VTEwpOworICBmLT5zZXJ2ZXJfY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uZWN0aW9uKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmxvb3AsIGYtPnNlcnZlcl9jb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKCFkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICgpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmLT5uX3RocmVhZHMgPSBOX1RIUkVBRFM7CisgIGYtPm5fcmVmcyA9IE5fUkVGUzsKKworICAvLyB3aW5lIHNldHMgV0lORVNFUlZFUlNPQ0tFVCBmb3IgaXRzIGNoaWxkIHByb2Nlc3NlcyBhdXRvbWF0aWNhbGx5CisgIGlmIChnX2dldGVudiAoIldJTkVTRVJWRVJTT0NLRVQiKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE91ciByZWZlcmVuY2UtY291bnRpbmcgaXMgcmVhbGx5IHNsb3cgdW5kZXIgV2luZSAoaXQgaW52b2x2ZXMKKyAgICAgICAqIElQQyB0byB3aW5lc2VydmVyKS4gRG8gZmV3ZXIgaXRlcmF0aW9uczogZW5vdWdoIHRvIGRlbW9uc3RyYXRlCisgICAgICAgKiB0aGF0IGl0IHdvcmtzLCByYXRoZXIgdGhhbiBhIHBlcmZvcm1hbmNlIHRlc3QuCisgICAgICAgKi8KKyAgICAgIGYtPm5fdGhyZWFkcyA9IDEwOworICAgICAgZi0+bl9yZWZzID0gMTA7CisgICAgfQorCisgIGYtPmxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgZ19hc3NlcnQgKGYtPmxvb3AgIT0gTlVMTCk7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICgidGNwOmhvc3Q9MTI3LjAuMC4xIiwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnNlcnZlciAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX3Nsb3QpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnNlcnZlcl9zbG90KSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYWxsb2NhdGVfZGF0YV9zbG90ICgmbWVzc2FnZV9zbG90KSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZwZW5kaW5nX2NhbGxfc2xvdCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXBfY29ubmVjdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGNoYXIgKmFkZHJlc3M7CisKKyAgc2V0dXAgKGYsIGRhdGEpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworCisgIGlmICghdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmxvb3AsIGYtPnNlcnZlcikpCisgICAgZ19lcnJvciAoImZhaWxlZCB0byBzZXQgdXAgc2VydmVyIik7CisKKyAgYWRkcmVzcyA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpOworICBnX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKyAgZi0+Y29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5jb25uZWN0aW9uICE9IE5VTEwpOworICBkYnVzX2ZyZWUgKGFkZHJlc3MpOworCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5sb29wLCBmLT5jb25uZWN0aW9uKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgd2hpbGUgKGYtPnNlcnZlcl9jb25uZWN0aW9uID09IE5VTEwpCisgICAgX2RidXNfbG9vcF9pdGVyYXRlIChmLT5sb29wLCBUUlVFKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGYtPmxvb3AsIGYtPmNvbm5lY3Rpb24pOworICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAoZi0+bG9vcCwgZi0+c2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29ubmVjdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCBwdWJsaWNfYXBpID0geworICAgIGYsCisgICAgZi0+Y29ubmVjdGlvbiwKKyAgICAoUmVmRnVuYykgZGJ1c19jb25uZWN0aW9uX3JlZiwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19jb25uZWN0aW9uX3VucmVmLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMIH07CisgIFRocmVhZCBpbnRlcm5hbF9hcGkgPSB7CisgICAgZiwKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChSZWZGdW5jKSBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCwKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl9sb2NrLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgfTsKKyAgdW5zaWduZWQgaTsKKworICAvKiBVc2UgYSBzbG90IGFzIGEgcHNldWRvLXdlYWtyZWYgKi8KKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGYtPmNvbm5lY3Rpb24sIGNvbm5lY3Rpb25fc2xvdCwgZiwKKyAgICAgICAgbGFzdF91bnJlZikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBlbHNlCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBlbHNlCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgLyogRGVzdHJveSB0aGUgY29ubmVjdGlvbi4gVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QtdW5yZWYuICovCisgIGdfYXNzZXJ0ICghZi0+bGFzdF91bnJlZik7CisgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+Y29ubmVjdGlvbik7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+Y29ubmVjdGlvbik7CisgIGYtPmNvbm5lY3Rpb24gPSBOVUxMOworICBnX2Fzc2VydCAoZi0+bGFzdF91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfbG9jayAodm9pZCAqc2VydmVyKQoreworICBTRVJWRVJfTE9DSyAoKChEQnVzU2VydmVyICopIHNlcnZlcikpOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX3VubG9jayAodm9pZCAqc2VydmVyKQoreworICBTRVJWRVJfVU5MT0NLICgoKERCdXNTZXJ2ZXIgKikgc2VydmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NlcnZlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCBwdWJsaWNfYXBpID0geworICAgIGYsCisgICAgZi0+c2VydmVyLAorICAgIChSZWZGdW5jKSBkYnVzX3NlcnZlcl9yZWYsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIGRidXNfc2VydmVyX3VucmVmLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMIH07CisgIFRocmVhZCBpbnRlcm5hbF9hcGkgPSB7CisgICAgZiwKKyAgICBmLT5zZXJ2ZXIsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQsCisgICAgKFZvaWRGdW5jKSBfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQsCisgICAgZi0+c2VydmVyLAorICAgIHNlcnZlcl9sb2NrLAorICAgIHNlcnZlcl91bmxvY2sgfTsKKyAgdW5zaWduZWQgaTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF9kYXRhIChmLT5zZXJ2ZXIsIHNlcnZlcl9zbG90LCBmLCBsYXN0X3VucmVmKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICAvKiBEZXN0cm95IHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0LXVucmVmLiAqLworICBnX2Fzc2VydCAoIWYtPmxhc3RfdW5yZWYpOworICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgZi0+c2VydmVyID0gTlVMTDsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tZXNzYWdlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiZm9vLmJhci5iYXoiLAorICAgICAgIkZvbyIpOworICBUaHJlYWQgcHVibGljX2FwaSA9IHsKKyAgICBmLAorICAgIG1lc3NhZ2UsCisgICAgKFJlZkZ1bmMpIGRidXNfbWVzc2FnZV9yZWYsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIGRidXNfbWVzc2FnZV91bnJlZiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCB9OworICB1bnNpZ25lZCBpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kYXRhIChtZXNzYWdlLCBtZXNzYWdlX3Nsb3QsIGYsIGxhc3RfdW5yZWYpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgLyogRGVzdHJveSB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdC11bnJlZi4gKi8KKyAgZ19hc3NlcnQgKCFmLT5sYXN0X3VucmVmKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ19hc3NlcnQgKGYtPmxhc3RfdW5yZWYpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wZW5kaW5nX2NhbGwgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgcHVibGljX2FwaSA9IHsKKyAgICBmLAorICAgIE5VTEwsCisgICAgKFJlZkZ1bmMpIGRidXNfcGVuZGluZ19jYWxsX3JlZiwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwgfTsKKyAgVGhyZWFkIGludGVybmFsX2FwaSA9IHsKKyAgICBmLAorICAgIE5VTEwsCisgICAgKFJlZkZ1bmMpIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQsCisgICAgTlVMTCwKKyAgICAoVm9pZEZ1bmMpIGRidXNfcGVuZGluZ19jYWxsX3VucmVmLAorICAgIGYtPmNvbm5lY3Rpb24sCisgICAgKFZvaWRGdW5jKSBfZGJ1c19jb25uZWN0aW9uX2xvY2ssCisgICAgKFZvaWRGdW5jKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayB9OworICAvKiBUaGlzIG9uZSBjYW4ndCBiZSB1c2VkIHRvIHJlZiwgb25seSB0byBjeWNsZSBvciB1bnJlZi4gKi8KKyAgVGhyZWFkIHVucmVmX2FuZF91bmxvY2tfYXBpID0geworICAgIGYsCisgICAgTlVMTCwKKyAgICAoUmVmRnVuYykgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfcGVuZGluZ19jYWxsX3VucmVmX2FuZF91bmxvY2ssCisgICAgZi0+Y29ubmVjdGlvbiwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX2Nvbm5lY3Rpb25fbG9jaywKKyAgICBOVUxMIH07CisgIHVuc2lnbmVkIGk7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZ19jYWxsOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAoZi0+Y29ubmVjdGlvbik7CisgIHBlbmRpbmdfY2FsbCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgKGYtPmNvbm5lY3Rpb24sCisgICAgICBEQlVTX1RJTUVPVVRfSU5GSU5JVEUsIE5VTEwpOworICBnX2Fzc2VydCAocGVuZGluZ19jYWxsICE9IE5VTEwpOworICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoZi0+Y29ubmVjdGlvbik7CisKKyAgcHVibGljX2FwaS50aGluZyA9IHBlbmRpbmdfY2FsbDsKKyAgaW50ZXJuYWxfYXBpLnRoaW5nID0gcGVuZGluZ19jYWxsOworICB1bnJlZl9hbmRfdW5sb2NrX2FwaS50aGluZyA9IHBlbmRpbmdfY2FsbDsKKworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhIChwZW5kaW5nX2NhbGwsIHBlbmRpbmdfY2FsbF9zbG90LCBmLAorICAgICAgICBsYXN0X3VucmVmKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoaSAlIDMpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLAorICAgICAgICAgICAgICAgICZ1bnJlZl9hbmRfdW5sb2NrX2FwaSk7CisgICAgICAgIH0KKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChpICUgMykKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsCisgICAgICAgICAgICAgICAgJnVucmVmX2FuZF91bmxvY2tfYXBpKTsKKyAgICAgICAgfQorCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIC8qIERlc3Ryb3kgdGhlIHBlbmRpbmcgY2FsbC4gVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QtdW5yZWYuICovCisgIGdfYXNzZXJ0ICghZi0+bGFzdF91bnJlZik7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nX2NhbGwpOworICBnX2Fzc2VydCAoZi0+bGFzdF91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGlmIChmLT5zZXJ2ZXJfY29ubmVjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+c2VydmVyX2Nvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubmVjdGlvbik7CisgICAgfQorCisgIGlmIChmLT5jb25uZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5jb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+Y29ubmVjdGlvbik7CisgICAgfQorCisgIGlmIChmLT5zZXJ2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGYtPnNlcnZlcik7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmNvbm5lY3Rpb25fc2xvdCk7CisgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX3Nsb3QpOworICBkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgKCZtZXNzYWdlX3Nsb3QpOworICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJnBlbmRpbmdfY2FsbF9zbG90KTsKKworICBfZGJ1c19sb29wX3VucmVmIChmLT5sb29wKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL3JlZnMvY29ubmVjdGlvbiIsIEZpeHR1cmUsIE5VTEwsIHNldHVwX2Nvbm5lY3Rpb24sCisgICAgICB0ZXN0X2Nvbm5lY3Rpb24sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9yZWZzL21lc3NhZ2UiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfbWVzc2FnZSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3JlZnMvcGVuZGluZy1jYWxsIiwgRml4dHVyZSwgTlVMTCwgc2V0dXBfY29ubmVjdGlvbiwKKyAgICAgIHRlc3RfcGVuZGluZ19jYWxsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcmVmcy9zZXJ2ZXIiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3Rfc2VydmVyLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2ludGVybmFscy9zeXNsb2cuYyBiL3Rlc3QvaW50ZXJuYWxzL3N5c2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNWM1NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ludGVybmFscy9zeXNsb2cuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogTWFudWFsIHJlZ3Jlc3Npb24gdGVzdCBmb3Igc3lzbG9nIHN1cHBvcnQKKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGR1bW15OworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworfQorCisvKiBob3BlZnVsbHkgY2xlYXIgZW5vdWdoIHRoYXQgcGVvcGxlIGRvbid0IHRoaW5rIHRoZXNlIG1lc3NhZ2VzIGluIHN5c2xvZworICogYXJlIGEgYnVnICovCisjZGVmaW5lIE1FU1NBR0UgInJlZ3Jlc3Npb24gdGVzdCBmb3IgX2RidXNfc3lzdGVtX2xvZygpOiAiCisKK3N0YXRpYyB2b2lkCit0ZXN0X3N5c2xvZyAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZuZGVmIEdfT1NfV0lOMzIKKyAgaWYgKGdfdGVzdF90cmFwX2ZvcmsgKDAsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoRkFMU0UpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX0ZBVEFMLCBNRVNTQUdFICIlZCIsIDIzKTsKKyAgICAgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZDogZXhpdCAwIHNvIHRoZSBhc3NlcnRpb24gaW4gdGhlIG1haW4gcHJvY2VzcworICAgICAgICogd2lsbCBmYWlsICovCisgICAgICBleGl0ICgwKTsKKyAgICB9CisKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X2ZhaWxlZCAoKTsKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3N0ZGVyciAoIioiIE1FU1NBR0UgIjIzXG4qIik7CisKKyAgaWYgKGdfdGVzdF90cmFwX2ZvcmsgKDAsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoRkFMU0UpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX0lORk8sIE1FU1NBR0UgIiVkIiwgNDIpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX1dBUk5JTkcsIE1FU1NBR0UgIiVkIiwgNDUpOworICAgICAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCBNRVNTQUdFICIlZCIsIDY2Nik7CisgICAgICBleGl0ICgwKTsKKyAgICB9CisKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3Bhc3NlZCAoKTsKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3N0ZGVyciAoIioiIE1FU1NBR0UgIjQyXG4qIiBNRVNTQUdFICI0NVxuKiIgTUVTU0FHRSAiNjY2XG4qIik7CisjZW5kaWYKKyAgLyogbWFudWFsIHRlc3QgKHRoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIG9uIFdpbmRvd3MpICovCisgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoRkFMU0UpOworICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywgTUVTU0FHRSAiJWQiLCA0Mik7CisgIF9kYnVzX3N5c3RlbV9sb2cgKERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLCBNRVNTQUdFICIlZCIsIDQ1KTsKKyAgX2RidXNfc3lzdGVtX2xvZyAoREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCBNRVNTQUdFICIlZCIsIDY2Nik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL3N5c2xvZyIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X3N5c2xvZywgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9sb29wYmFjay5jIGIvdGVzdC9sb29wYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDU0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xvb3BiYWNrLmMKQEAgLTAsMCArMSwzODQgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIGxvb3BiYWNrIHRocm91Z2ggVENQIGFuZCBVbml4IHNvY2tldHMuCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisgICAgREJ1c0Vycm9yIGU7CisKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlICovCisgICAgR1F1ZXVlIHNlcnZlcl9tZXNzYWdlczsKKworICAgIERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubjsKKworICAgIGdjaGFyICp0bXBfcnVudGltZV9kaXI7CisgICAgZ2NoYXIgKnNhdmVkX3J1bnRpbWVfZGlyOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlcnZlcl9tZXNzYWdlX2NiIChEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKHNlcnZlcl9jb25uID09IGYtPnNlcnZlcl9jb25uKTsKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5zZXJ2ZXJfbWVzc2FnZXMsIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5fY2IgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZi0+c2VydmVyX2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fcmVmIChzZXJ2ZXJfY29ubik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBzZXJ2ZXJfY29ubik7CisKKyAgaGF2ZV9tZW0gPSBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoc2VydmVyX2Nvbm4sCisgICAgICBzZXJ2ZXJfbWVzc2FnZV9jYiwgZiwgTlVMTCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisgIGdfcXVldWVfaW5pdCAoJmYtPnNlcnZlcl9tZXNzYWdlcyk7CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChhZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5zZXJ2ZXIpOworfQorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgdm9pZAorc2V0dXBfcnVudGltZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGNoYXIgKmxpc3RlbmluZ19hdDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgLyogdGhpcyBpcyBjaG9zZW4gdG8gYmUgc29tZXRoaW5nIG5lZWRpbmcgZXNjYXBpbmcgKi8KKyAgZi0+dG1wX3J1bnRpbWVfZGlyID0gZ19kaXJfbWFrZV90bXAgKCJkYnVzPWRhZW1vbj10ZXN0LlhYWFhYWCIsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgLyogd2UncmUgcmVseWluZyBvbiBiZWluZyBzaW5nbGUtdGhyZWFkZWQgZm9yIHRoaXMgdG8gYmUgc2FmZSAqLworICBmLT5zYXZlZF9ydW50aW1lX2RpciA9IGdfc3RyZHVwIChnX2dldGVudiAoIlhER19SVU5USU1FX0RJUiIpKTsKKyAgZ19zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiLCBmLT50bXBfcnVudGltZV9kaXIsIFRSVUUpOworCisgIHNldHVwIChmLCBhZGRyKTsKKworICBsaXN0ZW5pbmdfYXQgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJsaXN0ZW5pbmcgYXQgJXMiLCBsaXN0ZW5pbmdfYXQpOworICBnX2Fzc2VydCAoZ19zdHJfaGFzX3ByZWZpeCAobGlzdGVuaW5nX2F0LCAidW5peDpwYXRoPSIpKTsKKyAgZ19hc3NlcnQgKHN0cnN0ciAobGlzdGVuaW5nX2F0LCAiZGJ1cyUzZGRhZW1vbiUzZHRlc3QuIikgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChzdHJzdHIgKGxpc3RlbmluZ19hdCwgIi9idXMsIikgIT0gTlVMTCB8fAorICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAobGlzdGVuaW5nX2F0LCAiL2J1cyIpKTsKKworICBkYnVzX2ZyZWUgKGxpc3RlbmluZ19hdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9ub19ydW50aW1lIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgY2hhciAqbGlzdGVuaW5nX2F0OworCisgIC8qIHdlJ3JlIHJlbHlpbmcgb24gYmVpbmcgc2luZ2xlLXRocmVhZGVkIGZvciB0aGlzIHRvIGJlIHNhZmUgKi8KKyAgZi0+c2F2ZWRfcnVudGltZV9kaXIgPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKSk7CisgIGdfdW5zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKworICBzZXR1cCAoZiwgYWRkcik7CisKKyAgbGlzdGVuaW5nX2F0ID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGdfdGVzdF9tZXNzYWdlICgibGlzdGVuaW5nIGF0ICVzIiwgbGlzdGVuaW5nX2F0KTsKKyAgLyogd2UgaGF2ZSBmYWxsZW4gYmFjayB0byBzb21ldGhpbmcgaW4gL3RtcCwgZWl0aGVyIGFic3RyYWN0IG9yIG5vdCAqLworICBnX2Fzc2VydCAoZ19zdHJfaGFzX3ByZWZpeCAobGlzdGVuaW5nX2F0LCAidW5peDoiKSk7CisgIGdfYXNzZXJ0IChzdHJzdHIgKGxpc3RlbmluZ19hdCwgIj0vdG1wLyIpICE9IE5VTEwpOworCisgIGRidXNfZnJlZSAobGlzdGVuaW5nX2F0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCk7CisKKyAgZi0+Y2xpZW50X2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlICgKKyAgICAgIGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCk7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBmLT5jbGllbnRfY29ubik7CisKKyAgd2hpbGUgKGYtPnNlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9iYWRfZ3VpZCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIgR19HTlVDX1VOVVNFRCkKK3sKKyAgREJ1c01lc3NhZ2UgKmluY29taW5nOworICBnY2hhciAqYWRkcmVzcyA9IGdfc3RyZHVwIChkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKSk7CisgIGdjaGFyICpndWlkOworCisgIGdfdGVzdF9idWcgKCIzOTcyMCIpOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKworICBnX2Fzc2VydCAoc3Ryc3RyIChhZGRyZXNzLCAiZ3VpZD0iKSAhPSBOVUxMKTsKKyAgZ3VpZCA9IHN0cnN0ciAoYWRkcmVzcywgImd1aWQ9Iik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKHN0cmxlbiAoZ3VpZCksID49LCA1ICsgMzIpOworCisgIC8qIENoYW5nZSB0aGUgZmlyc3QgY2hhciBvZiB0aGUgZ3VpZCB0byBzb21ldGhpbmcgZGlmZmVyZW50ICovCisgIGlmIChndWlkWzVdID09ICcwJykKKyAgICBndWlkWzVdID0gJ2YnOworICBlbHNlCisgICAgZ3VpZFs1XSA9ICcwJzsKKworICBmLT5jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5jbGllbnRfY29ubiAhPSBOVUxMKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIGYtPmNsaWVudF9jb25uKTsKKworICB3aGlsZSAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgLyogV2UgZ2V0IGRpc2Nvbm5lY3RlZCAqLworCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+c2VydmVyX21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+c2VydmVyX21lc3NhZ2VzKSwgPT0sIDEpOworCisgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnNlcnZlcl9tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKCFkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoaW5jb21pbmcpLCA9PSwgIkRpc2Nvbm5lY3RlZCIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoaW5jb21pbmcpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgREJVU19QQVRIX0xPQ0FMKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBnX2ZyZWUgKGFkZHJlc3MpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tZXNzYWdlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmcsICppbmNvbWluZzsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIGFkZHIpOworCisgIG91dGdvaW5nID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvY29tL2V4YW1wbGUvSGVsbG8iLAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0IChvdXRnb2luZyAhPSBOVUxMKTsKKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jbGllbnRfY29ubiwgb3V0Z29pbmcsICZzZXJpYWwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworICBnX2Fzc2VydCAoc2VyaWFsICE9IDApOworCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+c2VydmVyX21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+c2VydmVyX21lc3NhZ2VzKSwgPT0sIDEpOworCisgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnNlcnZlcl9tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKCFkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgKGluY29taW5nKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGluY29taW5nKSwgPT0sICIiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sICIvY29tL2V4YW1wbGUvSGVsbG8iKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKGluY29taW5nKSwgPT0sIHNlcmlhbCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIgR19HTlVDX1VOVVNFRCkKK3sKKyAgaWYgKGYtPmNsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmNsaWVudF9jb25uKTsKKyAgICAgIGYtPmNsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlcnZlcl9jb25uKTsKKyAgICAgIGYtPnNlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgICAgIGYtPnNlcnZlciA9IE5VTEw7CisgICAgfQorCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgdm9pZAordGVhcmRvd25fbm9fcnVudGltZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIHRlYXJkb3duIChmLCBhZGRyKTsKKworICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgIGlmIChmLT5zYXZlZF9ydW50aW1lX2RpciAhPSBOVUxMKQorICAgIGdfc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIiwgZi0+c2F2ZWRfcnVudGltZV9kaXIsIFRSVUUpOworICBlbHNlCisgICAgZ191bnNldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworICBnX2ZyZWUgKGYtPnNhdmVkX3J1bnRpbWVfZGlyKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duX3J1bnRpbWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyKQoreworICBnY2hhciAqcGF0aDsKKworICB0ZWFyZG93biAoZiwgYWRkcik7CisKKyAgLyogdGhlIHNvY2tldCBtYXkgZXhpc3QgKi8KKyAgcGF0aCA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzL2J1cyIsIGYtPnRtcF9ydW50aW1lX2Rpcik7CisgIGdfYXNzZXJ0IChnX3JlbW92ZSAocGF0aCkgPT0gMCB8fCBlcnJubyA9PSBFTk9FTlQpOworICBnX2ZyZWUgKHBhdGgpOworICAvKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55dGhpbmcgZWxzZSBpbiB0aGVyZSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGdfcm1kaXIgKGYtPnRtcF9ydW50aW1lX2RpciksID09LCAwKTsKKworICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgIGlmIChmLT5zYXZlZF9ydW50aW1lX2RpciAhPSBOVUxMKQorICAgIGdfc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIiwgZi0+c2F2ZWRfcnVudGltZV9kaXIsIFRSVUUpOworICBlbHNlCisgICAgZ191bnNldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworICBnX2ZyZWUgKGYtPnNhdmVkX3J1bnRpbWVfZGlyKTsKKyAgZ19mcmVlIChmLT50bXBfcnVudGltZV9kaXIpOworfQorI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbWVzc2FnZS90Y3AiLCBGaXh0dXJlLCAidGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3Qvbm9uY2UtdGNwIiwgRml4dHVyZSwgIm5vbmNlLXRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbWVzc2FnZS9ub25jZS10Y3AiLCBGaXh0dXJlLCAibm9uY2UtdGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdW5peCIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL3VuaXgiLCBGaXh0dXJlLCAidW5peDp0bXBkaXI9L3RtcCIsIHNldHVwLAorICAgICAgdGVzdF9tZXNzYWdlLCB0ZWFyZG93bik7CisKKyAgZ190ZXN0X2FkZCAoIi9jb25uZWN0L3VuaXgvcnVudGltZSIsIEZpeHR1cmUsCisgICAgICAidW5peDpydW50aW1lPXllczt1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXBfcnVudGltZSwgdGVzdF9jb25uZWN0LAorICAgICAgdGVhcmRvd25fcnVudGltZSk7CisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdC91bml4L25vLXJ1bnRpbWUiLCBGaXh0dXJlLAorICAgICAgInVuaXg6cnVudGltZT15ZXM7dW5peDp0bXBkaXI9L3RtcCIsIHNldHVwX25vX3J1bnRpbWUsIHRlc3RfY29ubmVjdCwKKyAgICAgIHRlYXJkb3duX25vX3J1bnRpbWUpOworI2VuZGlmCisKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL2JhZC1ndWlkIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9iYWRfZ3VpZCwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtYXV0aHouYyBiL3Rlc3QvbWFudWFsLWF1dGh6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5YmM1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFudWFsLWF1dGh6LmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uLgorICoKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBHX09TX1VOSVgKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c0Vycm9yIGU7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisKKyAgICBEQnVzU2VydmVyICpub3JtYWxfc2VydmVyOworICAgIERCdXNTZXJ2ZXIgKmFub25fYWxsb3dlZF9zZXJ2ZXI7CisgICAgREJ1c1NlcnZlciAqYW5vbl9vbmx5X3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICphbm9uX21lY2hfb25seV9zZXJ2ZXI7CisgICAgREJ1c1NlcnZlciAqYW5vbl9kaXNhbGxvd2VkX3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICpwZXJtaXNzaXZlX3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICp1bmhhcHB5X3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICpzYW1lX3VpZF9zZXJ2ZXI7CisgICAgREJ1c1NlcnZlciAqc2FtZV91aWRfb3JfYW5vbl9zZXJ2ZXI7Cit9IEZpeHR1cmU7CisKK3N0YXRpYyB2b2lkIG9vbSAodm9pZCkgR19HTlVDX05PUkVUVVJOOworc3RhdGljIHZvaWQKK29vbSAodm9pZCkKK3sKKyAgZ19lcnJvciAoIm91dCBvZiBtZW1vcnkiKTsKKyAgYWJvcnQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCithc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoImV4cGVjdGVkIHN1Y2Nlc3MgYnV0IGdvdCBlcnJvcjogJXM6ICVzIiwgZS0+bmFtZSwgZS0+bWVzc2FnZSk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VydmVyX21lc3NhZ2VfY2IgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9MT0NBTCwgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubik7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgIGNvbnN0IGNoYXIgKmhlbGxvID0gIkhlbGxvLCB3b3JsZCEiOworICAgICAgdW5zaWduZWQgbG9uZyB1aWQ7CisgICAgICBjaGFyICpzaWQ7CisKKyAgICAgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubiwgJnVpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBnX21lc3NhZ2UgKCJtZXNzYWdlIGZyb20gdWlkICVsdSIsIHVpZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChjb25uLCAmc2lkKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzaWQgPT0gTlVMTCkKKyAgICAgICAgICAgIG9vbSAoKTsKKworICAgICAgICAgIGdfbWVzc2FnZSAoIm1lc3NhZ2UgZnJvbSBzaWQgXCIlc1wiIiwgc2lkKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHNpZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfYW5vbnltb3VzIChjb25uKSkKKyAgICAgICAgeworICAgICAgICAgIGdfbWVzc2FnZSAoIm1lc3NhZ2UgZnJvbSBBbm9ueW1vdXMiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZ19tZXNzYWdlICgibWVzc2FnZSBmcm9tIC4uLiBzb21lb25lPyIpOworICAgICAgICB9CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBvb20gKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZoZWxsbywKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgb29tICgpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uLCByZXBseSwgTlVMTCkpCisgICAgICAgIG9vbSAoKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwZXJtaXNzaXZlX3VuaXhfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgdW5zaWduZWQgbG9uZyB1aWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19tZXNzYWdlICgiYWNjZXB0aW5nIFVuaXggdXNlciAlbHUiLCB1aWQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwZXJtaXNzaXZlX3dpbl9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubiwKKyAgICBjb25zdCBjaGFyICpzaWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19tZXNzYWdlICgiYWNjZXB0aW5nIFdpbmRvd3MgdXNlciBcIiVzXCIiLCBzaWQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citicm9rZW5fdW5peF9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubiwKKyAgICB1bnNpZ25lZCBsb25nIHVpZCwKKyAgICB2b2lkICpkYXRhKQoreworICBnX2Vycm9yICgibGliZGJ1cyBjYWxsZWQgdGhlIFVuaXggdXNlciBmdW5jdGlvbiBmb3IgYW4gQU5PTllNT1VTLW9ubHkgIgorICAgICAgImNvbm5lY3Rpb24iKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jyb2tlbl93aW5fZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgY29uc3QgY2hhciAqc2lkLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdfZXJyb3IgKCJsaWJkYnVzIGNhbGxlZCB0aGUgV2luZG93cyB1c2VyIGZ1bmN0aW9uIGZvciBhbiBBTk9OWU1PVVMtb25seSAiCisgICAgICAiY29ubmVjdGlvbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5oYXBweV91bml4X2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIHVuc2lnbmVkIGxvbmcgdWlkLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdfbWVzc2FnZSAoInJlamVjdGluZyBVbml4IHVzZXIgJWx1IiwgdWlkKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3VuaGFwcHlfd2luX2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIGNvbnN0IGNoYXIgKnNpZCwKKyAgICB2b2lkICpkYXRhKQoreworICBnX21lc3NhZ2UgKCJyZWplY3RpbmcgV2luZG93cyB1c2VyIFwiJXNcIiIsIHNpZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzYW1lX3VpZF91bml4X2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIHVuc2lnbmVkIGxvbmcgdWlkLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdfbWVzc2FnZSAoImNoZWNraW5nIHdoZXRoZXIgVW5peCB1c2VyICVsdSBvd25zIHRoaXMgcHJvY2VzcyIsIHVpZCk7CisgIC8qIEknZCB1c2UgX2RidXNfdW5peF91c2VyX2lzX3Byb2Nlc3Nfb3duZXIoKSwgYnV0IGl0J3MgcHJpdmF0ZS4uLiAqLworI2lmZGVmIEdfT1NfVU5JWAorICByZXR1cm4gKGdldGV1aWQgKCkgPT0gdWlkKTsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NhbWVfdWlkX3dpbl9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubiwKKyAgICBjb25zdCBjaGFyICpzaWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19tZXNzYWdlICgiY2hlY2tpbmcgd2hldGhlciBXaW5kb3dzIHVzZXIgXCIlc1wiIG93bnMgdGhpcyBwcm9jZXNzIiwgc2lkKTsKKyAgZ19tZXNzYWdlICgiU3R1YiBpbXBsZW1lbnRhdGlvbiBjb25zaXN0ZW50IHdpdGggZGJ1cy1zeXNkZXBzLXV0aWwtd2luOiAiCisgICAgICAiYXNzdW1lIHRoZXkgZG8iKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubl9jYiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm4pOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgY29ubik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubiwgc2VydmVyX21lc3NhZ2VfY2IsIGYsIE5VTEwpKQorICAgIG9vbSAoKTsKKworICBpZiAoc2VydmVyID09IGYtPm5vcm1hbF9zZXJ2ZXIpCisgICAgeworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPmFub25fYWxsb3dlZF9zZXJ2ZXIpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm4sIFRSVUUpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPmFub25fb25seV9zZXJ2ZXIpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm4sIFRSVUUpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubiwgdW5oYXBweV91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgdW5oYXBweV93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZlciA9PSBmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm4sIFRSVUUpOworCisgICAgICAvKiBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCAqLworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm4sIGJyb2tlbl91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgYnJva2VuX3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPmFub25fZGlzYWxsb3dlZF9zZXJ2ZXIpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKGNvbm4sIEZBTFNFKTsKKworICAgICAgLyogc2hvdWxkIG5ldmVyIGdldCBjYWxsZWQgKi8KKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uLCBicm9rZW5fdW5peF9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKGNvbm4sIGJyb2tlbl93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZlciA9PSBmLT5wZXJtaXNzaXZlX3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubiwgcGVybWlzc2l2ZV91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgcGVybWlzc2l2ZV93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZlciA9PSBmLT51bmhhcHB5X3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubiwgdW5oYXBweV91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgdW5oYXBweV93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZlciA9PSBmLT5zYW1lX3VpZF9zZXJ2ZXIpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm4sIHNhbWVfdWlkX3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCBzYW1lX3VpZF93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZlciA9PSBmLT5zYW1lX3VpZF9vcl9hbm9uX3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoY29ubiwgVFJVRSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uLCBzYW1lX3VpZF91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgc2FtZV91aWRfd2luX2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgY29uc3QgZ2NoYXIgKmxpc3Rlbl9hZGRyKQoreworICBjb25zdCBjaGFyICpvbmx5X2Fub25bXSA9IHsgIkFOT05ZTU9VUyIsIE5VTEwgfTsKKyAgY2hhciAqY29ubmVjdF9hZGRyOworCisgIGYtPm5vcm1hbF9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+bm9ybWFsX3NlcnZlciAhPSBOVUxMKTsKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5ub3JtYWxfc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5ub3JtYWxfc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPm5vcm1hbF9zZXJ2ZXIpOworICBnX21lc3NhZ2UgKCJOb3JtYWwgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+YW5vbl9hbGxvd2VkX3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5hbm9uX2FsbG93ZWRfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPmFub25fYWxsb3dlZF9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPmFub25fYWxsb3dlZF9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+YW5vbl9hbGxvd2VkX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIkFub255bW91cy1hbGxvd2VkIHNlcnZlcjpcbiVzIiwgY29ubmVjdF9hZGRyKTsKKyAgZGJ1c19mcmVlIChjb25uZWN0X2FkZHIpOworCisgIGYtPmFub25fb25seV9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+YW5vbl9vbmx5X3NlcnZlciAhPSBOVUxMKTsKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5hbm9uX29ubHlfc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5hbm9uX29ubHlfc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPmFub25fb25seV9zZXJ2ZXIpOworICBnX21lc3NhZ2UgKCJBbm9ueW1vdXMtb25seSBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKKworICBmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+YW5vbl9tZWNoX29ubHlfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIsIG9ubHlfYW5vbik7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+YW5vbl9tZWNoX29ubHlfc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+YW5vbl9tZWNoX29ubHlfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiQW5vbiBtZWNoIG9ubHkgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+YW5vbl9kaXNhbGxvd2VkX3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5hbm9uX2Rpc2FsbG93ZWRfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChmLT5hbm9uX2Rpc2FsbG93ZWRfc2VydmVyLCBvbmx5X2Fub24pOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPmFub25fZGlzYWxsb3dlZF9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPmFub25fZGlzYWxsb3dlZF9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+YW5vbl9kaXNhbGxvd2VkX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIkFub255bW91cy1kaXNhbGxvd2VkIHNlcnZlcjpcbiVzIiwgY29ubmVjdF9hZGRyKTsKKyAgZGJ1c19mcmVlIChjb25uZWN0X2FkZHIpOworCisgIGYtPnBlcm1pc3NpdmVfc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChsaXN0ZW5fYWRkciwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnBlcm1pc3NpdmVfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnBlcm1pc3NpdmVfc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5wZXJtaXNzaXZlX3NlcnZlcik7CisgIGNvbm5lY3RfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5wZXJtaXNzaXZlX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIlBlcm1pc3NpdmUgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+dW5oYXBweV9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+dW5oYXBweV9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+dW5oYXBweV9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPnVuaGFwcHlfc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnVuaGFwcHlfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiVW5oYXBweSBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKKworICBmLT5zYW1lX3VpZF9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2FtZV91aWRfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnNhbWVfdWlkX3NlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+c2FtZV91aWRfc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNhbWVfdWlkX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIlNhbWUtVUlEIHNlcnZlcjpcbiVzIiwgY29ubmVjdF9hZGRyKTsKKyAgZGJ1c19mcmVlIChjb25uZWN0X2FkZHIpOworCisgIGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChsaXN0ZW5fYWRkciwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5zYW1lX3VpZF9vcl9hbm9uX3NlcnZlcik7CisgIGNvbm5lY3RfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zYW1lX3VpZF9vcl9hbm9uX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIlNhbWUtVUlELW9yLWFub24gc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIEZpeHR1cmUgZiA9IHsgREJVU19FUlJPUl9JTklULCB0ZXN0X21haW5fY29udGV4dF9nZXQgKCkgfTsKKworICBpZiAoYXJnYyA+PSAyKQorICAgIHNldHVwICgmZiwgYXJndlsxXSk7CisgIGVsc2UKKyAgICBzZXR1cCAoJmYsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiKTsKKworICBmb3IgKDs7KQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYuY3R4LCBUUlVFKTsKKworICAvKiBuZXZlciByZXR1cm5zICovCit9CmRpZmYgLS1naXQgYS90ZXN0L21hbnVhbC1kaXItaXRlci5jIGIvdGVzdC9tYW51YWwtZGlyLWl0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFjMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYW51YWwtZGlyLWl0ZXIuYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorCisjaW5jbHVkZSAiZGJ1cy9kYnVzLW1hY3Jvcy5oIgorI2luY2x1ZGUgImRidXMvZGJ1cy1zeXNkZXBzLmgiCisKK3N0YXRpYyB2b2lkIG9vbSAoY29uc3QgY2hhciAqZG9pbmcpIF9EQlVTX0dOVUNfTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3ZvaWQKK29vbSAoY29uc3QgY2hhciAqZG9pbmcpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiBtYW51YWwtZGlyLWl0ZXI6IE9PTSB3aGlsZSAlc1xuIiwgZG9pbmcpOworICBleGl0ICgxKTsKK30KKwordm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogbWFudWFsLWRpci1pdGVyOiAlc1xuIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorZGVidWcgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZG91dCwgIisrKyBtYW51YWwtZGlyLWl0ZXI6ICVzXG4iLCBtZXNzYWdlKTsKK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzU3RyaW5nIGRpcm5hbWU7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIERCdXNEaXJJdGVyICpkaXI7CisKKyAgaWYgKGFyZ2MgIT0gMikKKyAgICAgIGRpZSAoInN5bnRheDogbWFudWFsLWRpci1pdGVyIDxwYXRoPiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICAgIG9vbSAoImluaXQgZmlsZW5hbWUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlybmFtZSkpCisgICAgICBvb20gKCJpbml0IGRpcm5hbWUiKTsKKworICBfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGlybmFtZSwgYXJndlsxXSk7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmZGlybmFtZSwgJnRtcF9lcnJvcik7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgdG1wX2Vycm9yLm5hbWUsIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gKCJpbml0IGZ1bGxfcGF0aCIpOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZkaXJuYW1lLCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIG9vbSAoImNvcHlpbmcgZnVsbF9wYXRoIHRvIGRpcm5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gKCJjb25jYXQgZnVsbF9wYXRoIik7CisgICAgICAgIH0KKyAgICAgIGRlYnVnIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgICAgZGllICh0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IGRpciBuYW1lIGV4aXRpbmdcbiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtcGF0aHMuYyBiL3Rlc3QvbWFudWFsLXBhdGhzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5MmM1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFudWFsLXBhdGhzLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIFNpbXBsZSBtYW51YWwgcGF0aHMgY2hlY2sKKyAqCisgKiBzeW50YXg6ICBtYW51YWwtcGF0aHMKKyAqCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLXN5c2RlcHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBwcmludF9pbnN0YWxsX3Jvb3QoKQoreworICBjaGFyIHJ1bnRpbWVfcHJlZml4WzEwMDBdOworCisgIGlmICghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChydW50aW1lX3ByZWZpeCwgc2l6ZW9mKHJ1bnRpbWVfcHJlZml4KSkpCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJkYnVzX2dldF9pbnN0YWxsX3Jvb3QoKSBmYWlsZWRcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZnByaW50ZihzdGRvdXQsICJkYnVzX2dldF9pbnN0YWxsX3Jvb3QoKSByZXR1cm5lZCAnJXMnXG4iLCBydW50aW1lX3ByZWZpeCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QgcHJpbnRfc2VydmljZV9kaXJzKCkKK3sKKyAgREJ1c0xpc3QgKmRpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBkaXJzID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgZ2V0IHN0YW5kYXJkIGRpcnMiKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgIHsKKyAgICAgIHByaW50ZiAoImRlZmF1bHQgc2VydmljZSBkaXI6ICVzXG4iLCAoY2hhciAqKWxpbmstPmRhdGEpOworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICB9CisgIGRidXNfZnJlZSAoZGlycyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QgcHJpbnRfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeChjb25zdCBjaGFyICpzKQoreworICBjb25zdCBjaGFyICpzMiA9IF9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXgocyk7CisgIGlmICghczIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZwcmludGYoc3Rkb3V0LCAicmVwbGFjZWQgJyVzJyBieSAnJXMnXG4iLCBzLCBzMik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaWYgKCFwcmludF9pbnN0YWxsX3Jvb3QoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCFwcmludF9zZXJ2aWNlX2RpcnMoKSkKKyAgICByZXR1cm4gLTI7CisKKyAgaWYgKCFwcmludF9yZXBsYWNlX2luc3RhbGxfcHJlZml4KERCVVNfQklORElSICIvZGJ1cy1kYWVtb24iKSkKKyAgICByZXR1cm4gLTM7CisKKyAgaWYgKCFwcmludF9yZXBsYWNlX2luc3RhbGxfcHJlZml4KCJjOlxcV2luZG93c1xcU3lzdGVtMzJcXHRlc3RmaWxlIikpCisgICAgcmV0dXJuIC00OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtdGNwLmMgYi90ZXN0L21hbnVhbC10Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY5MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYW51YWwtdGNwLmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFNpbXBsZSBtYW51YWwgdGNwIGNoZWNrCisgKgorICogc3VwcG9ydHM6CisgKiAtIHNlcnZlciBsaXN0ZW5pbmcgY2hlY2sKKyAqCisgKiBzeW50YXg6ICBtYW51YWwtdGNwIFs8aXB2ND58PGlwdjY+XQorICoKKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc2VydmVyLXNvY2tldC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgREJ1c1NlcnZlciAgICAgICpzZXJ2ZXI7CisgICAgREJ1c0Vycm9yICAgICAgIGVycm9yOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBpOworCisgICAgY2hhciAqZmFtaWx5ID0gTlVMTDsKKworICAgIGlmIChhcmdjID09IDIpCisgICAgICAgIGZhbWlseSA9IGFyZ3ZbMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAgICAgICBzZXJ2ZXIgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0ICgibG9jYWxob3N0IiwgImxvY2FsaG9zdCIsICIwIiwgZmFtaWx5LCAmZXJyb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiJWQ6ICVzICVzXG4iLGksIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlZDogJXMgXG4iLGksIGRidXNfc2VydmVyX2dldF9hZGRyZXNzKHNlcnZlcikpOworICAgICAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdChzZXJ2ZXIpOworICAgICAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYoc2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJzaGFsLmMgYi90ZXN0L21hcnNoYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzUzZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYXJzaGFsLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIEQtQnVzIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbi4KKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7Cit9CisKKy8qIHRoaXMgaXMgbWVhbnQgdG8gYmUgb2J2aW91c2x5IGNvcnJlY3QsIG5vdCBlZmZpY2llbnQhICovCitzdGF0aWMgZ3VpbnQzMgorZ2V0X3VpbnQzMiAoY29uc3QgZ2NoYXIgKmJsb2IsCisgICAgZ3NpemUgb2Zmc2V0LAorICAgIGNoYXIgZW5kaWFuKQoreworICBpZiAoZW5kaWFuID09ICdsJykKKyAgICB7CisgICAgICByZXR1cm4KKyAgICAgICAgYmxvYltvZmZzZXRdIHwKKyAgICAgICAgKGJsb2Jbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAzXSA8PCAyNCk7CisgICAgfQorICBlbHNlIGlmIChlbmRpYW4gPT0gJ0InKQorICAgIHsKKyAgICAgIHJldHVybgorICAgICAgICAoYmxvYltvZmZzZXRdIDw8IDI0KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDFdIDw8IDE2KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDJdIDw8IDgpIHwKKyAgICAgICAgYmxvYltvZmZzZXQgKyAzXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQkxPQl9MRU5HVEggKHNpemVvZiAobGVfYmxvYikgLSAxKQorI2RlZmluZSBPRkZTRVRfQk9EWV9MRU5HVEggKDQpCisjZGVmaW5lIE9GRlNFVF9TRVJJQUwgKDgpCisKK2NvbnN0IGdjaGFyIGxlX2Jsb2JbXSA9CisgICAgLyogYnl0ZSAwICovCisgICAgLyogeXl5eXV1IGZpeGVkIGhlYWRlcnMgKi8KKyAgICAibCIgICAgICAgICAgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogcmVwbHkgKHdoaWNoIGlzIHRoZSBzaW1wbGVzdCBtZXNzYWdlKSAqLworICAgICJcMiIgICAgICAgICAgICAgICAgICAgIC8qIG5vIGF1dG8tc3RhcnRpbmcgKi8KKyAgICAiXDEiICAgICAgICAgICAgICAgICAgICAvKiBELUJ1cyB2ZXJzaW9uID0gMSAqLworICAgIC8qIGJ5dGUgNCAqLworICAgICJcNFwwXDBcMCIgICAgICAgICAgICAgIC8qIGJ5dGVzIGluIGJvZHkgPSA0ICovCisgICAgLyogYnl0ZSA4ICovCisgICAgIlx4NzhceDU2XHgzNFx4MTIiICAgICAgLyogc2VyaWFsIG51bWJlciA9IDB4MTIzNDU2NzggKi8KKyAgICAvKiBieXRlIDEyICovCisgICAgLyogYSh1dikgdmFyaWFibGUgaGVhZGVycyBzdGFydCBoZXJlICovCisgICAgIlx4MGZcMFwwXDAiICAgICAgICAgICAgLyogYnl0ZXMgaW4gYXJyYXkgb2YgdmFyaWFibGUgaGVhZGVycyA9IDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDE2ICovCisgICAgIlw1IiAgICAgICAgICAgICAgICAgICAgLyogaW4gcmVwbHkgdG86ICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSB1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDQtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAgICAgIlx4MTJceGVmXHhjZFx4YWIiICAvKiAweGFiY2RlZjEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDI0ICovCisgICAgIlx4MDgiICAgICAgICAgICAgICAgICAgLyogc2lnbmF0dXJlOiAqLworICAgICAgICAiXDFnXDAiICAgICAgICAgICAgIC8qIHZhcmlhbnQgc2lnbmF0dXJlID0gZyAqLworICAgICAgICAiXDF1XDAiICAgICAgICAgICAgIC8qIDEgYnl0ZSwgdSwgTlVMIChubyBhbGlnbm1lbnQgbmVlZGVkKSAqLworICAgICAgICAiXDAiICAgICAgICAgICAgICAgIC8qIHBhZCB0byA4LWJ5dGUgYm91bmRhcnkgZm9yIGJvZHkgKi8KKyAgICAvKiBib2R5OyBieXRlIDMyICovCisgICAgIlx4ZWZceGJlXHhhZFx4ZGUiICAgICAgLyogMHhkZWFkYmVlZiAqLworICAgIDsKKworY29uc3QgZ2NoYXIgYmVfYmxvYltdID0KKyAgICAvKiBieXRlIDAgKi8KKyAgICAvKiB5eXl5dXUgZml4ZWQgaGVhZGVycyAqLworICAgICJCIiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAiXDIiICAgICAgICAgICAgICAgICAgICAvKiByZXBseSAod2hpY2ggaXMgdGhlIHNpbXBsZXN0IG1lc3NhZ2UpICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogbm8gYXV0by1zdGFydGluZyAqLworICAgICJcMSIgICAgICAgICAgICAgICAgICAgIC8qIEQtQnVzIHZlcnNpb24gPSAxICovCisgICAgLyogYnl0ZSA0ICovCisgICAgIlwwXDBcMFw0IiAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gYm9keSA9IDQgKi8KKyAgICAvKiBieXRlIDggKi8KKyAgICAiXHgxMlx4MzRceDU2XHg3OCIgICAgICAvKiBzZXJpYWwgbnVtYmVyID0gMHgxMjM0NTY3OCAqLworICAgIC8qIGJ5dGUgMTIgKi8KKyAgICAvKiBhKHV2KSB2YXJpYWJsZSBoZWFkZXJzIHN0YXJ0IGhlcmUgKi8KKyAgICAiXDBcMFwwXHgwZiIgICAgICAgICAgICAvKiBieXRlcyBpbiBhcnJheSBvZiB2YXJpYWJsZSBoZWFkZXJzID0gMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMTYgKi8KKyAgICAiXDUiICAgICAgICAgICAgICAgICAgICAvKiBpbiByZXBseSB0bzogKi8KKyAgICAgICAgIlwxdVwwIiAgICAgICAgICAgICAvKiB2YXJpYW50IHNpZ25hdHVyZSA9IHUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gNC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgICAgICAiXHhhYlx4Y2RceGVmXHgxMiIgIC8qIDB4YWJjZGVmMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMjQgKi8KKyAgICAiXHgwOCIgICAgICAgICAgICAgICAgICAvKiBzaWduYXR1cmU6ICovCisgICAgICAgICJcMWdcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSBnICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogMSBieXRlLCB1LCBOVUwgKG5vIGFsaWdubWVudCBuZWVkZWQpICovCisgICAgICAgICJcMCIgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSBmb3IgYm9keSAqLworICAgIC8qIGJvZHk7IGJ5dGUgMzIgKi8KKyAgICAiXHhkZVx4YWRceGJlXHhlZiIgICAgICAvKiAweGRlYWRiZWVmICovCisgICAgOworCitzdGF0aWMgdm9pZAordGVzdF9lbmRpYW4gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcpCit7CisgIGNvbnN0IGdjaGFyICpibG9iID0gYXJnOworICBjaGFyICpvdXRwdXQ7CisgIERCdXNNZXNzYWdlICptOworICBpbnQgbGVuOworICBkYnVzX3VpbnQzMl90IHU7CisgIGRidXNfYm9vbF90IG9rOworCisgIGdfYXNzZXJ0X2NtcHVpbnQgKChndWludCkgc2l6ZW9mIChsZV9ibG9iKSwgPT0sIChndWludCkgc2l6ZW9mIChiZV9ibG9iKSk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ2V0X3VpbnQzMiAoYmxvYiwgT0ZGU0VUX0JPRFlfTEVOR1RILCBibG9iWzBdKSwgPT0sIDQpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChibG9iLCBPRkZTRVRfU0VSSUFMLCBibG9iWzBdKSwgPT0sCisgICAgICAweDEyMzQ1Njc4dSk7CisKKyAgbGVuID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIHNpemVvZiAobGVfYmxvYikpOworICAvKiBldmVyeXRoaW5nIGluIHRoZSBzdHJpbmcgZXhjZXB0IHRoZSBpbXBsaWNpdCAiXDAiIGF0IHRoZSBlbmQgaXMgcGFydCBvZgorICAgKiB0aGUgbWVzc2FnZSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIKTsKKworICBtID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoYmxvYiwgc2l6ZW9mIChsZV9ibG9iKSwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKG0gIT0gTlVMTCk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCA9PSwgMHgxMjM0NTY3OHUpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksID09LCAweGFiY2RlZjEydSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInUiKTsKKworICAvKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6IGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZSByZXN1bHRzIGluIGl0IGJlaW5nCisgICAqIGJ5dGVzd2FwcGVkIGludG8gY29tcGlsZXIgYnl0ZSBvcmRlciwgd2hpY2ggZXhwb3NlZCBhIGJ1ZyBpbiBsaWJkYnVzLAorICAgKiBmZC5vICMzODEyMC4gKElmIHRoYXQgY2hhbmdlcywgdGhpcyB0ZXN0IG1pZ2h0IG5vdCBleGVyY2lzZSB0aGF0CisgICAqIHBhcnRpY3VsYXIgYnVnIGJ1dCB3aWxsIHN0aWxsIGJlIHZhbGlkLikgKi8KKyAgdSA9IDB4ZGVjYWZiYWR1OworICBvayA9IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1LAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBnX2Fzc2VydCAob2spOworCisgIGRidXNfbWVzc2FnZV9tYXJzaGFsIChtLCAmb3V0cHV0LCAmbGVuKTsKKworICBnX2Fzc2VydCAob3V0cHV0WzBdID09ICdsJyB8fCBvdXRwdXRbMF0gPT0gJ0InKTsKKyAgLyogdGhlIHNpbmdsZS1ieXRlIGZpZWxkcyBhcmUgdW5hZmZlY3RlZCwgZXZlbiBpZiB0aGUgZW5kaWFubmVzcyB3YXMKKyAgICogc3dhcHBlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsxXSwgPT0sIGJsb2JbMV0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsyXSwgPT0sIGJsb2JbMl0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFszXSwgPT0sIGJsb2JbM10pOworICAvKiB0aGUgbGVuZ3RoIGFuZCBzZXJpYWwgYXJlIGluIHRoZSBuZXcgZW5kaWFubmVzcywgdGhlIGxlbmd0aCBoYXMgZXhwYW5kZWQKKyAgICogdG8gOCwgYW5kIHRoZSBzZXJpYWwgaXMgY29ycmVjdCAqLworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9CT0RZX0xFTkdUSCwgb3V0cHV0WzBdKSwgPT0sIDgpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9TRVJJQUwsIG91dHB1dFswXSksID09LAorICAgICAgMHgxMjM0NTY3OHUpOworICAvKiB0aGUgc2Vjb25kICJ1IiBpbiB0aGUgc2lnbmF0dXJlIHJlcGxhY2VkIGEgcGFkZGluZyBieXRlLCBzbyBvbmx5CisgICAqIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkgY2hhbmdlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIICsgNCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25lZWRlZCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZykKK3sKKyAgY29uc3QgZ2NoYXIgKmJsb2IgPSBhcmc7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCAxNiBieXRlcyB0byBrbm93IGhvdyBsb25nIHRoZSBtZXNzYWdlIGlzIC0gdGhhdCdzIGp1c3QKKyAgICogYSBmYWN0IG9mIHRoZSBELUJ1cyBwcm90b2NvbC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAwKSwgPT0sIDApOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDE1KSwgPT0sIDApOworICAvKiBUaGlzIGlzIGVub3VnaCB0aGF0IHdlIHNob3VsZCBiZSBhYmxlIHRvIHRlbGwgaG93IG11Y2ggd2UgbmVlZC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAxNiksID09LCBCTE9CX0xFTkdUSCk7CisgIC8qIFRoZSBoZWFkZXIgaXMgMzIgYnl0ZXMgbG9uZyAoaGVyZSksIHNvIHRoYXQncyBhbm90aGVyIGludGVyZXN0aW5nCisgICAqIGJvdW5kYXJ5LiAqLworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDMxKSwgPT0sIEJMT0JfTEVOR1RIKTsKKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAzMiksID09LCBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgMzMpLCA9PSwgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIIC0gMSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIKSwgPT0sCisgICAgICBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgc2l6ZW9mIChiZV9ibG9iKSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIGludCByZXQ7CisgIGNoYXIgKmFsaWduZWRfbGVfYmxvYjsKKyAgY2hhciAqYWxpZ25lZF9iZV9ibG9iOworCisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBXZSBoYXZlIHRvIHBhc3MgaW4gYSBidWZmZXIgdGhhdCdzIGF0IGxlYXN0ICJkZWZhdWx0IGFsaWduZWQiLAorICAgKiBpLmUuICBvbiBHTlUgc3lzdGVtcyB0byA4IG9yIDE2LiAgVGhlIGxpbmtlciBtYXkgaGF2ZSBvbmx5IGdpdmVuCisgICAqIHVzIGJ5dGUtYWxpZ25tZW50IGZvciB0aGUgY2hhcltdIHN0YXRpYyB2YXJpYWJsZXMuCisgICAqLworICBhbGlnbmVkX2xlX2Jsb2IgPSBnX21hbGxvYyAoc2l6ZW9mIChsZV9ibG9iKSk7CisgIG1lbWNweSAoYWxpZ25lZF9sZV9ibG9iLCBsZV9ibG9iLCBzaXplb2YgKGxlX2Jsb2IpKTsKKyAgYWxpZ25lZF9iZV9ibG9iID0gZ19tYWxsb2MgKHNpemVvZiAoYmVfYmxvYikpOworICBtZW1jcHkgKGFsaWduZWRfYmVfYmxvYiwgYmVfYmxvYiwgc2l6ZW9mIChiZV9ibG9iKSk7ICAKKworICBnX3Rlc3RfYWRkICgiL2RlbWFyc2hhbC9sZSIsIEZpeHR1cmUsIGFsaWduZWRfbGVfYmxvYiwgc2V0dXAsIHRlc3RfZW5kaWFuLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL2JlIiwgRml4dHVyZSwgYWxpZ25lZF9iZV9ibG9iLCBzZXR1cCwgdGVzdF9lbmRpYW4sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9kZW1hcnNoYWwvbmVlZGVkL2xlIiwgRml4dHVyZSwgYWxpZ25lZF9sZV9ibG9iLCBzZXR1cCwgdGVzdF9uZWVkZWQsCisgICAgICB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL25lZWRlZC9iZSIsIEZpeHR1cmUsIGFsaWduZWRfYmVfYmxvYiwgc2V0dXAsIHRlc3RfbmVlZGVkLAorICAgICAgdGVhcmRvd24pOworCisgIHJldCA9IGdfdGVzdF9ydW4gKCk7CisgIGdfZnJlZSAoYWxpZ25lZF9sZV9ibG9iKTsKKyAgZ19mcmVlIChhbGlnbmVkX2JlX2Jsb2IpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb25pdG9yLmMgYi90ZXN0L21vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDRiMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tb25pdG9yLmMKQEAgLTAsMCArMSwxNjg1IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgbW9uaXRvci1tb2RlIEQtQnVzIGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGU7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICptYXRjaF9ydWxlczsKKyAgICBnYm9vbGVhbiBjYXJlX2Fib3V0X291cl9uYW1lczsKK30gQ29uZmlnOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgQ29uZmlnICpjb25maWc7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisgICAgREJ1c0Vycm9yIGU7CisgICAgR0Vycm9yICpnZTsKKworICAgIGdjaGFyICphZGRyZXNzOworICAgIEdQaWQgZGFlbW9uX3BpZDsKKworICAgIERCdXNDb25uZWN0aW9uICptb25pdG9yOworICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnJlY2lwaWVudDsKKworICAgIEdRdWV1ZSBtb25pdG9yZWQ7CisKKyAgICBjb25zdCBjaGFyICptb25pdG9yX25hbWU7CisgICAgY29uc3QgY2hhciAqc2VuZGVyX25hbWU7CisgICAgY29uc3QgY2hhciAqcmVjaXBpZW50X25hbWU7CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqc3lzdGVtZDsKKyAgICBjb25zdCBjaGFyICpzeXN0ZW1kX25hbWU7CisgICAgREJ1c01lc3NhZ2UgKnN5c3RlbWRfbWVzc2FnZTsKKyAgICBEQnVzQ29ubmVjdGlvbiAqYWN0aXZhdGVkOworICAgIGNvbnN0IGNoYXIgKmFjdGl2YXRlZF9uYW1lOworICAgIERCdXNNZXNzYWdlICphY3RpdmF0ZWRfbWVzc2FnZTsKK30gRml4dHVyZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub19tYXRjaF9ydWxlc1tdID0geworICAgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2lsZGNhcmRfbWF0Y2hfcnVsZXNbXSA9IHsKKyAgICAiIiwKKyAgICBOVUxMLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVhdmVzZHJvcF9tYXRjaF9ydWxlc1tdID0geworICAgICJlYXZlc2Ryb3A9dHJ1ZSIsCisgICAgTlVMTCwKKyAgICBGQUxTRQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub19lYXZlc2Ryb3BfbWF0Y2hfcnVsZXNbXSA9IHsKKyAgICAiZWF2ZXNkcm9wPWZhbHNlIiwKKyAgICBOVUxMLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlbGVjdGl2ZV9tYXRjaF9ydWxlc1tdID0geworICAgICJpbnRlcmZhY2U9J2NvbS5leGFtcGxlLkludGVyZXN0aW5nJyIsCisgICAgImludGVyZmFjZT0nY29tLmV4YW1wbGUuRnVuJyIsCisgICAgTlVMTCwKKyAgICBGQUxTRQorfTsKKworc3RhdGljIENvbmZpZyBmb3JiaWRkaW5nX2NvbmZpZyA9IHsKKyAgICAidmFsaWQtY29uZmlnLWZpbGVzL2ZvcmJpZGRpbmcuY29uZiIsCisgICAgTlVMTCwKKyAgICBGQUxTRQorfTsKKworc3RhdGljIENvbmZpZyB3aWxkY2FyZF9jb25maWcgPSB7CisgICAgTlVMTCwKKyAgICB3aWxkY2FyZF9tYXRjaF9ydWxlcywKKyAgICBGQUxTRQorfTsKKworc3RhdGljIENvbmZpZyBzZWxlY3RpdmVfY29uZmlnID0geworICAgIE5VTEwsCisgICAgc2VsZWN0aXZlX21hdGNoX3J1bGVzLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIG5vX3J1bGVzX2NvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIG5vX21hdGNoX3J1bGVzLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIGVhdmVzZHJvcF9jb25maWcgPSB7CisgICAgTlVMTCwKKyAgICBlYXZlc2Ryb3BfbWF0Y2hfcnVsZXMsCisgICAgRkFMU0UKK307CisKK3N0YXRpYyBDb25maWcgbm9fZWF2ZXNkcm9wX2NvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIG5vX2VhdmVzZHJvcF9tYXRjaF9ydWxlcywKKyAgICBGQUxTRQorfTsKKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIENvbmZpZyBmYWtlX3N5c3RlbWRfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvc3lzdGVtZC1hY3RpdmF0aW9uLmNvbmYiLAorICAgIE5VTEwsCisgICAgRkFMU0UKK307CisjZW5kaWYKKworc3RhdGljIENvbmZpZyBzaWRlX2VmZmVjdHNfY29uZmlnID0geworICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBUUlVFCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgorbm90X251bGwyIChjb25zdCBjaGFyICp4LAorICAgIGNvbnN0IGNoYXIgKmZhbGxiYWNrKQoreworICBpZiAoeCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxsYmFjazsKKworICByZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK25vdF9udWxsIChjb25zdCBjaGFyICp4KQoreworICByZXR1cm4gbm90X251bGwyICh4LCAiKG51bGwpIik7Cit9CisKKyNkZWZpbmUgbG9nX21lc3NhZ2UobSkgX2xvZ19tZXNzYWdlIChtLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK0dfR05VQ19VTlVTRUQKK3N0YXRpYyB2b2lkCitfbG9nX21lc3NhZ2UgKERCdXNNZXNzYWdlICptLAorICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgaW50IGxpbmUpCit7CisgIGdfdGVzdF9tZXNzYWdlICgiJXM6JWQ6IG1lc3NhZ2UgdHlwZSAlZCAoJXMpIiwgZmlsZSwgbGluZSwKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdGZyb206ICVzIiwKKyAgICAgIG5vdF9udWxsMiAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCAiKGRidXMtZGFlbW9uKSIpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdHRvOiAlcyIsCisgICAgICBub3RfbnVsbDIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCAiKGJyb2FkY2FzdCkiKSk7CisgIGdfdGVzdF9tZXNzYWdlICgiXHRwYXRoOiAlcyIsCisgICAgICBub3RfbnVsbCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSkpOworICBnX3Rlc3RfbWVzc2FnZSAoIlx0aW50ZXJmYWNlOiAlcyIsCisgICAgICBub3RfbnVsbCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pKSk7CisgIGdfdGVzdF9tZXNzYWdlICgiXHRtZW1iZXI6ICVzIiwKKyAgICAgIG5vdF9udWxsIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSkpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdHNpZ25hdHVyZTogJXMiLAorICAgICAgbm90X251bGwgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSkpOworICBnX3Rlc3RfbWVzc2FnZSAoIlx0ZXJyb3IgbmFtZTogJXMiLAorICAgICAgbm90X251bGwgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSkpKTsKKworICBpZiAoc3RyY21wICgicyIsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSkgPT0gMCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmUsCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZSk7CisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIlx0c3RyaW5nIHBheWxvYWQ6ICVzIiwgcyk7CisgICAgfQorfQorCisvKiB0aGVzZSBhcmUgbWFjcm9zIHNvIHRoZXkgZ2V0IHRoZSByaWdodCBsaW5lIG51bWJlciAqLworCisjZGVmaW5lIGFzc2VydF9oZWxsbyhtKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBEQlVTX1NFUlZJQ0VfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgREJVU19QQVRIX0RCVVMpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgREJVU19JTlRFUkZBQ0VfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCAiSGVsbG8iKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICIiKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X2hlbGxvX3JlcGx5KG0pIFwKK2RvIHsgXAorICBEQnVzRXJyb3IgX2UgPSBEQlVTX0VSUk9SX0lOSVQ7IFwKKyAgY29uc3QgY2hhciAqX3M7IFwKKyAgICBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgREJVU19TRVJWSUNFX0RCVVMpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgICAgXAorICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZfZSwgXAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmX3MsIFwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOyBcCisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmX2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBfcyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X25hbWVfYWNxdWlyZWQobSkgXAorZG8geyBcCisgIERCdXNFcnJvciBfZSA9IERCVVNfRVJST1JfSU5JVDsgXAorICBjb25zdCBjaGFyICpfczsgXAorICAgIFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIERCVVNfU0VSVklDRV9EQlVTKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBEQlVTX1BBVEhfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBEQlVTX0lOVEVSRkFDRV9EQlVTKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSwgPT0sICJOYW1lQWNxdWlyZWQiKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCisgICAgXAorICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZfZSwgXAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmX3MsIFwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOyBcCisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmX2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBfcyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X21ldGhvZF9jYWxsKG0sIHNlbmRlciwgXAorICAgIGRlc3RpbmF0aW9uLCBwYXRoLCBpZmFjZSwgbWV0aG9kLCBzaWduYXR1cmUpIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgcGF0aCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBpZmFjZSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBtZXRob2QpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X3NpZ25hbChtLCBcCisgICAgc2VuZGVyLCBwYXRoLCBpZmFjZSwgbWVtYmVyLCBzaWduYXR1cmUsIFwKKyAgICBkZXN0aW5hdGlvbikgXAorZG8geyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgcGF0aCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBpZmFjZSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBtZW1iZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X21ldGhvZF9yZXBseShtLCBzZW5kZXIsIGRlc3RpbmF0aW9uLCBzaWduYXR1cmUpIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIHNlbmRlcik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtKSwgPT0sIGRlc3RpbmF0aW9uKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobSksID09LCBzaWduYXR1cmUpOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksICE9LCAwKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhc3NlcnRfZXJyb3JfcmVwbHkobSwgc2VuZGVyLCBkZXN0aW5hdGlvbiwgZXJyb3JfbmFtZSkgXAorZG8geyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIHNlbmRlcik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtKSwgPT0sIGRlc3RpbmF0aW9uKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LCBlcnJvcl9uYW1lKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobSksID09LCAicyIpOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksICE9LCAwKTsgXAorfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBwZW5kaW5nIHJlcGxpZXMgdG8gb3VyIG93biBtZXRob2QKKyAqIGNhbGxzLCBidXQgYmVmb3JlIGFueXRoaW5nIGVsc2UuCisgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorbW9uaXRvcl9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgIT0sCisgICAgICAiY29tLmV4YW1wbGUuVGVkaW91cyIpOworCisgIC8qIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgbW9uaXRvciBnZXR0aW5nIE5hbWVBY3F1aXJlZCBvciBOYW1lTG9zdAorICAgKiBmb3IgbW9zdCB0ZXN0cyAqLworICBpZiAoZi0+Y29uZmlnID09IE5VTEwgfHwgIWYtPmNvbmZpZy0+Y2FyZV9hYm91dF9vdXJfbmFtZXMpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIikgfHwKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgIk5hbWVMb3N0IikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgICAgICBjb25zdCBjaGFyICpzOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZSwKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgICAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKworICAgICAgICAgIGlmIChzdHJjbXAgKHMsIGYtPm1vbml0b3JfbmFtZSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5tb25pdG9yZWQsIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3JlY2lwaWVudF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksICE9LAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksICE9LAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc3lzdGVtZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVBY3F1aXJlZCIpIHx8CisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUxvc3QiKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGdfYXNzZXJ0IChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCk7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CithY3RpdmF0ZWRfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIEZpeHR1cmUgKmYgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lQWNxdWlyZWQiKSB8fAorICAgICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVMb3N0IikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICBnX2Fzc2VydCAoZi0+YWN0aXZhdGVkX21lc3NhZ2UgPT0gTlVMTCk7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBmLT5jb25maWcgPSBjb250ZXh0OworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGYtPmFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoZi0+Y29uZmlnID8gZi0+Y29uZmlnLT5jb25maWdfZmlsZSA6IE5VTEwsCisgICAgICBURVNUX1VTRVJfTUUsICZmLT5kYWVtb25fcGlkKTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmLT5tb25pdG9yID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgZi0+bW9uaXRvcl9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5tb25pdG9yKTsKKyAgZi0+c2VuZGVyID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgZi0+c2VuZGVyX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnNlbmRlcik7CisgIGYtPnJlY2lwaWVudCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGYtPnJlY2lwaWVudF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yZWNpcGllbnQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPm1vbml0b3IsIG1vbml0b3JfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+cmVjaXBpZW50LCByZWNpcGllbnRfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitiZWNvbWVfbW9uaXRvciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIGRidXNfYm9vbF90IG9rOworICBEQnVzTWVzc2FnZUl0ZXIgYXBwZW5kZXIsIGFycmF5X2FwcGVuZGVyOworICBjb25zdCBjaGFyICogY29uc3QgKm1hdGNoX3J1bGVzOworICBpbnQgaTsKKyAgZGJ1c191aW50MzJfdCB6ZXJvID0gMDsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKGYtPm1vbml0b3IsIFRSVUUpOworCisgIGlmIChmLT5jb25maWcgIT0gTlVMTCAmJiBmLT5jb25maWctPm1hdGNoX3J1bGVzICE9IE5VTEwpCisgICAgbWF0Y2hfcnVsZXMgPSBmLT5jb25maWctPm1hdGNoX3J1bGVzOworICBlbHNlCisgICAgbWF0Y2hfcnVsZXMgPSB3aWxkY2FyZF9tYXRjaF9ydWxlczsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORywgIkJlY29tZU1vbml0b3IiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFwcGVuZGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXBwZW5kZXIsIERCVVNfVFlQRV9BUlJBWSwgInMiLAorICAgICAgICAmYXJyYXlfYXBwZW5kZXIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBtYXRjaF9ydWxlc1tpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9hcHBlbmRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICZtYXRjaF9ydWxlc1tpXSkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcHBlbmRlciwgJmFycmF5X2FwcGVuZGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFwcGVuZGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmemVybykpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bW9uaXRvciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBvayA9IGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmYtPmUsCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChvayk7CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7Cit9CisKKy8qCisgKiBUZXN0IHdoYXQgaGFwcGVucyBpZiB0aGUgbWV0aG9kIGNhbGwgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgorICovCitzdGF0aWMgdm9pZAordGVzdF9pbnZhbGlkIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIGRidXNfYm9vbF90IG9rOworICBEQnVzTWVzc2FnZUl0ZXIgYXBwZW5kZXIsIGFycmF5X2FwcGVuZGVyOworICBkYnVzX3VpbnQzMl90IHplcm8gPSAwOworICBkYnVzX3VpbnQzMl90IGludmFsaWRfZmxhZ3MgPSBHX01BWFVJTlQzMjsKKyAgY29uc3QgY2hhciAqczsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKGYtPm1vbml0b3IsIFRSVUUpOworCisgIC8qIFRyeSB0byBiZWNvbWUgYSBtb25pdG9yIGJ1dCBzcGVjaWZ5IG5vbnplcm8gZmxhZ3MgLSBub3QgYWxsb3dlZCAqLworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXBwZW5kZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcHBlbmRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICZhcnJheV9hcHBlbmRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXBwZW5kZXIsICZhcnJheV9hcHBlbmRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcHBlbmRlciwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgJmludmFsaWRfZmxhZ3MpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPm1vbml0b3IsIG0sICZwYywKKyAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwgREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgREJVU19FUlJPUl9JTlZBTElEX0FSR1MpOworCisgIC8qIFRyeSB0byBiZWNvbWUgYSBtb25pdG9yIGJ1dCBzcGVjaWZ5IGEgYmFkIG1hdGNoIHJ1bGUgLQorICAgKiBhbHNvIG5vdCBhbGxvd2VkICovCisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORywgIkJlY29tZU1vbml0b3IiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFwcGVuZGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXBwZW5kZXIsIERCVVNfVFlQRV9BUlJBWSwgInMiLAorICAgICAgICAmYXJyYXlfYXBwZW5kZXIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAvKiBTeW50YWN0aWNhbGx5IGluY29ycmVjdCBtYXRjaCBydWxlIHRha2VuIGZyb20gIzkyMjk4IC0gd2FzIHByb2JhYmx5CisgICAqIGludGVuZGVkIHRvIGJlIHBhdGg9Jy9tb2R1bGVzLy4uLicKKyAgICovCisgIHMgPSAiaW50ZXJmYWNlPSdvcmcua2RlLndhbGxldGQnLG1lbWJlcj0nL21vZHVsZXMva3dhbGxldGQvb3JnLmtkZS5LV2FsbGV0L3dhbGxldE9wZW5lZCciOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyYXlfYXBwZW5kZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICZzKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFwcGVuZGVyLCAmYXJyYXlfYXBwZW5kZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXBwZW5kZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ6ZXJvKSB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPm1vbml0b3IsIG0sICZwYywKKyAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwgREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQpOworCisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwYyk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogV2UgZGlkIG5vdCBiZWNvbWUgYSBtb25pdG9yLCBzbyB3ZSBjYW4gc3RpbGwgY2FsbCBtZXRob2RzLiAqLworCisgIHBjID0gTlVMTDsKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsICJHZXRJZCIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bW9uaXRvciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBvayA9IGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmYtPmUsCisgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKG9rKTsKKyAgZ19hc3NlcnRfY21wc3RyIChzLCAhPSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAocywgIT0sICIiKTsKKworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworfQorCisvKgorICogVGVzdCB0aGUgc2lkZS1lZmZlY3RzIG9mIGJlY29taW5nIGEgbW9uaXRvci4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfYmVjb21lX21vbml0b3IgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKyAgaW50IHJldDsKKyAgZGJ1c19ib29sX3QgZ290X3VuaXF1ZSA9IEZBTFNFLCBnb3RfYSA9IEZBTFNFLCBnb3RfYiA9IEZBTFNFLCBnb3RfYyA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBsb3N0X3VuaXF1ZSA9IEZBTFNFLCBsb3N0X2EgPSBGQUxTRSwgbG9zdF9iID0gRkFMU0UsIGxvc3RfYyA9IEZBTFNFOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHJldCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoZi0+bW9uaXRvciwgImNvbS5leGFtcGxlLkEiLAorICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFLCAmZi0+ZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0LCA9PSwgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUik7CisKKyAgcmV0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChmLT5tb25pdG9yLCAiY29tLmV4YW1wbGUuQiIsCisgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPm1vbml0b3IsICJjb20uZXhhbXBsZS5DIiwKKyAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldCwgPT0sIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpOworCisgIHdoaWxlICghZ290X3VuaXF1ZSB8fCAhZ290X2EgfHwgIWdvdF9iIHx8ICFnb3RfYykKKyAgICB7CisgICAgICBpZiAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPm1vbml0b3JlZCkpCisgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgICAgIHdoaWxlICgobSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG0sIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgIk5hbWVBY3F1aXJlZCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBvayA9IGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmYtPmUsCisgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LAorICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMpOworCisgICAgICAgICAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgICAgICAgICAgICAgIGdfYXNzZXJ0IChvayk7CisKKyAgICAgICAgICAgICAgaWYgKGdfc3RyX2VxdWFsIChuYW1lLCBmLT5tb25pdG9yX25hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghZ290X3VuaXF1ZSk7CisgICAgICAgICAgICAgICAgICBnb3RfdW5pcXVlID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChuYW1lLCAiY29tLmV4YW1wbGUuQSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghZ290X2EpOworICAgICAgICAgICAgICAgICAgZ290X2EgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG5hbWUsICJjb20uZXhhbXBsZS5CIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnQgKCFnb3RfYik7CisgICAgICAgICAgICAgICAgICBnb3RfYiA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnRfY21wc3RyIChuYW1lLCA9PSwgImNvbS5leGFtcGxlLkMiKTsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghZ290X2MpOworICAgICAgICAgICAgICAgICAgZ290X2MgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdfZXJyb3IgKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXMuJXMiLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgYmVjb21lX21vbml0b3IgKGYpOworCisgIHdoaWxlICghbG9zdF91bmlxdWUgfHwgIWxvc3RfYSB8fCAhbG9zdF9iIHx8ICFsb3N0X2MpCisgICAgeworICAgICAgaWYgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5tb25pdG9yZWQpKQorICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgICAgICB3aGlsZSAoKG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICJOYW1lTG9zdCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBvayA9IGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmYtPmUsCisgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICAgICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICAgICAgICAgICAgICBnX2Fzc2VydCAob2spOworCisgICAgICAgICAgICAgIGlmIChnX3N0cl9lcXVhbCAobmFtZSwgZi0+bW9uaXRvcl9uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBnX2Fzc2VydCAoIWxvc3RfdW5pcXVlKTsKKyAgICAgICAgICAgICAgICAgIGxvc3RfdW5pcXVlID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChuYW1lLCAiY29tLmV4YW1wbGUuQSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghbG9zdF9hKTsKKyAgICAgICAgICAgICAgICAgIGxvc3RfYSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobmFtZSwgImNvbS5leGFtcGxlLkIiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBnX2Fzc2VydCAoIWxvc3RfYik7CisgICAgICAgICAgICAgICAgICBsb3N0X2IgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0ciAobmFtZSwgPT0sICJjb20uZXhhbXBsZS5DIik7CisgICAgICAgICAgICAgICAgICBnX2Fzc2VydCAoIWxvc3RfYyk7CisgICAgICAgICAgICAgICAgICBsb3N0X2MgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdfZXJyb3IgKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXMuJXMiLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ2FsbGluZyBtZXRob2RzIGlzIGZvcmJpZGRlbjsgd2UgZ2V0IGRpc2Nvbm5lY3RlZC4gKi8KKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5tb25pdG9yLCAiIiwgJmYtPmUpOworICBnX2Fzc2VydF9jbXBzdHIgKGYtPmUubmFtZSwgPT0sIERCVVNfRVJST1JfTk9fUkVQTFkpOworICBnX2Fzc2VydCAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5tb25pdG9yKSk7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgaWYgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5tb25pdG9yZWQpKQorICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgICAgICAvKiBXaGVuIHdlIGl0ZXJhdGUgYWxsIHRoZSBjb25uZWN0aW9uJ3MgbWVzc2FnZXMsIHdlIHNlZSBvdXJzZWx2ZXMKKyAgICAgICAqIGxvc2luZyBhbGwgb3VyIG5hbWVzLCB0aGVuIHdlJ3JlIGRpc2Nvbm5lY3RlZC4gKi8KKyAgICAgIHdoaWxlICgobSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG0sIERCVVNfSU5URVJGQUNFX0xPQ0FMLCAiRGlzY29ubmVjdGVkIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICAgICAgICAgIGdvdG8gZGlzY29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ19lcnJvciAoInVuZXhwZWN0ZWQgbWVzc2FnZSAlcy4lcyIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICAgICAgfQorICAgIH0KKworZGlzY29ubmVjdGVkOgorCisgIGdfYXNzZXJ0IChsb3N0X2EpOworICBnX2Fzc2VydCAobG9zdF9iKTsKKyAgZ19hc3NlcnQgKGxvc3RfYyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Jyb2FkY2FzdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+cmVjaXBpZW50LCAidHlwZT0nc2lnbmFsJyIsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKworICBiZWNvbWVfbW9uaXRvciAoZik7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiQnJvYWRjYXN0U2lnbmFsMSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJCcm9hZGNhc3RTaWduYWwyIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIkJyb2FkY2FzdFNpZ25hbDMiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAzKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwxIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMiIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDMiLCAiIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZm9yYmlkZGVuX2Jyb2FkY2FzdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+cmVjaXBpZW50LCAidHlwZT0nc2lnbmFsJyIsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKworICBiZWNvbWVfbW9uaXRvciAoZik7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwxIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90UmVjZWl2ZSIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMiIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDMiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCA2KQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90U2VuZCIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMSIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RSZWNlaXZlIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwyIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDMiLCAiIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdW5pY2FzdF9zaWduYWwgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBiZWNvbWVfbW9uaXRvciAoZik7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMiIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwzIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAzKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMSIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMiIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMyIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZm9yYmlkZGVuIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgYmVjb21lX21vbml0b3IgKGYpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90U2VuZCIsCisgICAgICAiVW5pY2FzdFNpZ25hbDEiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLAorICAgICAgIlVuaWNhc3RTaWduYWwyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwKKyAgICAgICJVbmljYXN0U2lnbmFsMyIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgNikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwgIlVuaWNhc3RTaWduYWwxIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuQ2Fubm90UmVjZWl2ZSIsICJVbmljYXN0U2lnbmFsMiIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21ldGhvZF9jYWxsIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgYmVjb21lX21vbml0b3IgKGYpOworCisgIC8qIHJlZ3Jlc3Npb24gdGVzdCBmb3IKKyAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTA5NTIgKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGYtPnJlY2lwaWVudF9uYW1lLCAiL2ZvbyIsCisgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLCAiUGluZyIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bW9uaXRvcmVkKSA8IDIpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9tZXRob2RfY2FsbCAobSwgZi0+c2VuZGVyX25hbWUsIGYtPnJlY2lwaWVudF9uYW1lLCAiL2ZvbyIsCisgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLCAiUGluZyIsICIiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9tZXRob2RfcmVwbHkgKG0sIGYtPnJlY2lwaWVudF9uYW1lLCBmLT5zZW5kZXJfbmFtZSwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGYtPnJlY2lwaWVudF9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLAorICAgICAgIkNhbGwxIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBmLT5zZW5kZXJfbmFtZSwgZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiQ2FsbDEiLCAiIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIGYtPnJlY2lwaWVudF9uYW1lLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ZvcmJpZGRlbl9tZXRob2RfY2FsbCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGJlY29tZV9tb25pdG9yIChmKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwgIkNhbGwxIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBmLT5zZW5kZXJfbmFtZSwgZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwgIkNhbGwxIiwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGYtPnJlY2lwaWVudF9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuQ2Fubm90UmVjZWl2ZSIsICJDYWxsMiIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bW9uaXRvcmVkKSA8IDIpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9tZXRob2RfY2FsbCAobSwgZi0+c2VuZGVyX25hbWUsIGYtPnJlY2lwaWVudF9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuQ2Fubm90UmVjZWl2ZSIsICJDYWxsMiIsICIiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9kYnVzX2RhZW1vbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworICBpbnQgcmVzOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGJlY29tZV9tb25pdG9yIChmKTsKKworICByZXMgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPnNlbmRlciwgImNvbS5leGFtcGxlLlNlbmRlciIsCisgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXMsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKKworICByZXMgPSBkYnVzX2J1c19yZWxlYXNlX25hbWUgKGYtPnNlbmRlciwgImNvbS5leGFtcGxlLlNlbmRlciIsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXMsID09LCBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9SRUxFQVNFRCk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCA4KQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIGYtPnNlbmRlcl9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLCAiUmVxdWVzdE5hbWUiLCAic3UiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICJOYW1lT3duZXJDaGFuZ2VkIiwgInNzcyIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIEZJWE1FOiBzaG91bGQgd2UgZ2V0IHRoaXM/ICovCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVBY3F1aXJlZCIsICJzIiwgZi0+c2VuZGVyX25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLCAidSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBmLT5zZW5kZXJfbmFtZSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywgIlJlbGVhc2VOYW1lIiwgInMiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBGSVhNRTogc2hvdWxkIHdlIGdldCB0aGlzPyAqLworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICJOYW1lTG9zdCIsICJzIiwgZi0+c2VuZGVyX25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVPd25lckNoYW5nZWQiLCAic3NzIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsICJ1Iik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2VsZWN0aXZlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogTWF0Y2ggcnVsZXMgYWRkZWQgYmVmb3JlIGJlY29taW5nIGEgbW9uaXRvciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICogaWYgdGhleSB3ZXJlbid0LCB0aGlzIHRlc3Qgd291bGQgZ2V0IEludGVyZXN0aW5nIHR3aWNlLCB0aGVuIFRlZGlvdXMsCisgICAqIGFuZCBvbmx5IHNlZSBGdW4gYWZ0ZXIgdGhhdC4gKi8KKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5tb25pdG9yLAorICAgICAgImVhdmVzZHJvcD0ndHJ1ZScsaW50ZXJmYWNlPSdjb20uZXhhbXBsZS5JbnRlcmVzdGluZyciLCAmZi0+ZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+bW9uaXRvciwKKyAgICAgICJlYXZlc2Ryb3A9J3RydWUnLGludGVyZmFjZT0nY29tLmV4YW1wbGUuVGVkaW91cyciLCAmZi0+ZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisKKyAgYmVjb21lX21vbml0b3IgKGYpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuSW50ZXJlc3RpbmciLAorICAgICAgIlVuaWNhc3RTaWduYWwxIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5UZWRpb3VzIiwKKyAgICAgICJVbmljYXN0U2lnbmFsMiIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuRnVuIiwKKyAgICAgICJVbmljYXN0U2lnbmFsMyIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIC8qIFdlIGdldCB0aGUgaW50ZXJlc3Rpbmcgc2lnbmFsIGFuZCB0aGUgZnVuIHNpZ25hbCwgYnV0IG5vdCB0aGUgdGVkaW91cworICAgKiBzaWduYWwuICovCisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLkludGVyZXN0aW5nIiwgIlVuaWNhc3RTaWduYWwxIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuRnVuIiwgIlVuaWNhc3RTaWduYWwzIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCisjaWZkZWYgREJVU19VTklYCisvKiBjdXJyZW50bHkgb25seSB1c2VkIGZvciB0aGUgc3lzdGVtZCBhY3RpdmF0aW9uIHRlc3QgKi8KK3N0YXRpYyB2b2lkCitleHBlY3RfbmV3X2Nvbm5lY3Rpb24gKEZpeHR1cmUgKmYpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgNCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2hlbGxvIChtKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9oZWxsb19yZXBseSAobSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIsICJzc3MiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9uYW1lX2FjcXVpcmVkIChtKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworLyogY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgdGhlIHN5c3RlbWQgYWN0aXZhdGlvbiB0ZXN0ICovCitzdGF0aWMgdm9pZAordGFrZV93ZWxsX2tub3duX25hbWUgKEZpeHR1cmUgKmYsCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IHJldDsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsCisgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKK30KKworLyogY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgdGhlIHN5c3RlbWQgYWN0aXZhdGlvbiB0ZXN0ICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChGaXh0dXJlICpmLAorICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIERCdXNNZXNzYWdlICptOworICBjb25zdCBjaGFyICpjb25uZWN0aW9uX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgNCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBjb25uZWN0aW9uX25hbWUsIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJSZXF1ZXN0TmFtZSIsICJzdSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVPd25lckNoYW5nZWQiLCAic3NzIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZUFjcXVpcmVkIiwgInMiLCBjb25uZWN0aW9uX25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGNvbm5lY3Rpb25fbmFtZSwgInUiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYWN0aXZhdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGJlY29tZV9tb25pdG9yIChmKTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMSIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIikpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBXZSBvYnNlcnZlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QsIGFuZCB0aGUgbWVzc2FnZSB0aGF0IGNhdXNlZCBpdCwKKyAgICogYmVmb3JlIHN5c3RlbWQgaGFzIGV2ZW4gam9pbmVkIHRoZSBidXMuICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIGZha2Ugc3lzdGVtZCBjb25uZWN0cyB0byB0aGUgYnVzLiAqLworICBmLT5zeXN0ZW1kID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+c3lzdGVtZCwgc3lzdGVtZF9maWx0ZXIsIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+c3lzdGVtZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5zeXN0ZW1kKTsKKworICBleHBlY3RfbmV3X2Nvbm5lY3Rpb24gKGYpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+c3lzdGVtZCwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBleHBlY3RfdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPnN5c3RlbWQsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKworICAvKiBJdCBnZXRzIGl0cyBhY3RpdmF0aW9uIHJlcXVlc3QuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIHN5c3RlbWQgc3RhcnRzIHRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBmLT5hY3RpdmF0ZWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5hY3RpdmF0ZWQsIGFjdGl2YXRlZF9maWx0ZXIsCisgICAgICAgIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+YWN0aXZhdGVkX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPmFjdGl2YXRlZCk7CisKKyAgZXhwZWN0X25ld19jb25uZWN0aW9uIChmKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEiKTsKKyAgZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5hY3RpdmF0ZWQsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMSIpOworCisgIC8qIFRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIHNlbmRlciBzZW5kcyBhIG1lc3NhZ2UgdG8gYSBkaWZmZXJlbnQgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIHN5c3RlbWQgaXMgYWxyZWFkeSByZWFkeSBmb3IgaXQuICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMiB8fAorICAgICAgZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+c3lzdGVtZF9tZXNzYWdlOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBOVUxMOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uUmVxdWVzdCIsICJzIiwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgbW9uaXRvciBzZWVzIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSBzaWduYWwgdGhhdAorICAgKiBwcm9tcHRlZCBpdC4qLworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwyIiwgIiIsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlIHRha2VzIGl0cyBuYW1lLiBIZXJlIEknbSBmYWtpbmcgaXQgYnkgdXNpbmcKKyAgICogYW4gZXhpc3RpbmcgY29ubmVjdGlvbi4gKi8KKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIiKTsKKworICAvKiBUaGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UuCisgICAqIEltcGxlbWVudGF0aW9uIGRldGFpbDogdGhlIG1vbml0b3Igc2VlcyB0aGlzIGhhcHBlbiBiZWZvcmUgaXQgZXZlbgorICAgKiBzZWVzIHRoYXQgdGhlIG5hbWUgcmVxdWVzdCBoYXBwZW5lZCwgd2hpY2ggaXMgcHJldHR5IG9kZC4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5hY3RpdmF0ZWQsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworCisgIC8qIEEgdGhpcmQgYWN0aXZhdGlvbi4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogT25jZSBhZ2Fpbiwgd2Ugc2VlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSByZWFzb24uICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogc3lzdGVtZCBnZXRzIHRoZSByZXF1ZXN0IHRvby4gKi8KKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIGFjdGl2YXRpb24gZmFpbHMgKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uRmFpbHVyZSIpOworCisgIGRvCisgICAgeworICAgICAgY29uc3QgY2hhciAqdW5pdCA9ICJkYnVzLWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZSI7CisgICAgICBjb25zdCBjaGFyICplcnJvcl9uYW1lID0gImNvbS5leGFtcGxlLk5vcGUiOworICAgICAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICJDb21wdXRlciBzYXlzIG5vIjsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pdCwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlcnJvcl9uYW1lLAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVycm9yX21lc3NhZ2UsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgICB9CisgIHdoaWxlICgwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnN5c3RlbWQsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBtb25pdG9yIHNlZXMgYWN0aXZhdGlvbiBmYWlsICovCisKKyAgLyogT25jZSBhZ2Fpbiwgd2Ugc2VlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSByZWFzb24uICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMSkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICAiY29tLmV4YW1wbGUuTm9wZSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworfQorI2VuZGlmIC8qIERCVVNfVU5JWCAqLworCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5tb25pdG9yICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPm1vbml0b3IsIG1vbml0b3JfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bW9uaXRvcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPm1vbml0b3IpOworICAgICAgZi0+bW9uaXRvciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlbmRlcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlbmRlcik7CisgICAgICBmLT5zZW5kZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmVjaXBpZW50ICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnJlY2lwaWVudCwgcmVjaXBpZW50X2ZpbHRlciwgZik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnJlY2lwaWVudCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJlY2lwaWVudCk7CisgICAgICBmLT5yZWNpcGllbnQgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+c3lzdGVtZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5zeXN0ZW1kLCBzeXN0ZW1kX2ZpbHRlciwgZik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnN5c3RlbWQpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zeXN0ZW1kKTsKKyAgICAgIGYtPnN5c3RlbWQgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+YWN0aXZhdGVkICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPmFjdGl2YXRlZCwgYWN0aXZhdGVkX2ZpbHRlciwgZik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmFjdGl2YXRlZCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmFjdGl2YXRlZCk7CisgICAgICBmLT5hY3RpdmF0ZWQgPSBOVUxMOworICAgIH0KKworICB0ZXN0X2tpbGxfcGlkIChmLT5kYWVtb25fcGlkKTsKKyAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworCisgIGdfcXVldWVfZm9yZWFjaCAoJmYtPm1vbml0b3JlZCwgKEdGdW5jKSBkYnVzX21lc3NhZ2VfdW5yZWYsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmZi0+bW9uaXRvcmVkKTsKKworICBnX2ZyZWUgKGYtPmFkZHJlc3MpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL2ludmFsaWQiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfaW52YWxpZCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvYmVjb21lIiwgRml4dHVyZSwgJnNpZGVfZWZmZWN0c19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9iZWNvbWVfbW9uaXRvciwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvYnJvYWRjYXN0IiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2Jyb2FkY2FzdCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvZm9yYmlkZGVuLWJyb2FkY2FzdCIsIEZpeHR1cmUsICZmb3JiaWRkaW5nX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X2ZvcmJpZGRlbl9icm9hZGNhc3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL3VuaWNhc3Qtc2lnbmFsIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X3VuaWNhc3Rfc2lnbmFsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9mb3JiaWRkZW4iLCBGaXh0dXJlLCAmZm9yYmlkZGluZ19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9mb3JiaWRkZW4sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL21ldGhvZC1jYWxsIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X21ldGhvZF9jYWxsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9mb3JiaWRkZW4tbWV0aG9kIiwgRml4dHVyZSwgJmZvcmJpZGRpbmdfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfZm9yYmlkZGVuX21ldGhvZF9jYWxsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9kYnVzLWRhZW1vbiIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9kYnVzX2RhZW1vbiwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3Ivc2VsZWN0aXZlIiwgRml4dHVyZSwgJnNlbGVjdGl2ZV9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9zZWxlY3RpdmUsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL3dpbGRjYXJkIiwgRml4dHVyZSwgJndpbGRjYXJkX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X3VuaWNhc3Rfc2lnbmFsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9uby1ydWxlIiwgRml4dHVyZSwgJm5vX3J1bGVzX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X3VuaWNhc3Rfc2lnbmFsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9lYXZlc2Ryb3AiLCBGaXh0dXJlLCAmZWF2ZXNkcm9wX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X3VuaWNhc3Rfc2lnbmFsLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9uby1lYXZlc2Ryb3AiLCBGaXh0dXJlLCAmbm9fZWF2ZXNkcm9wX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X3VuaWNhc3Rfc2lnbmFsLCB0ZWFyZG93bik7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgLyogdGhpcyByZWxpZXMgb24gdGhlIHN5c3RlbWQgYWN0aXZhdGlvbiBjb2RlIHBhdGggKi8KKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL2FjdGl2YXRpb24iLCBGaXh0dXJlLCAmZmFrZV9zeXN0ZW1kX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X2FjdGl2YXRpb24sIHRlYXJkb3duKTsKKyNlbmRpZgorCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvLmdpdGlnbm9yZSBiL3Rlc3QvbmFtZS10ZXN0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmN2FkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwxNSBAQAorLmRlcHMKKy5saWJzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2VjaG8tZXJyb3Itb3V0cHV0LnRtcAorcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmYKK3Rlc3QtaWRzCit0ZXN0LW5hbWVzCit0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaAordGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dAordGVzdC1wcml2c2VydmVyCit0ZXN0LXByaXZzZXJ2ZXItY2xpZW50Cit0ZXN0LXNodXRkb3duCit0ZXN0LXRocmVhZHMtaW5pdAordGVzdC1hdXRvbGF1bmNoCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiN2ZjYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU2IEBACitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCSQoTlVMTCkKKworIyBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCBpbXByb3ZlIGJhY2t0cmFjZXMKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworVEVTVF9FWFRFTlNJT05TID0gLnNoCisKK1NIX0xPR19EUklWRVIgPSBlbnYgQU1fVEFQX0FXSz0nJChBV0spJyAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2J1aWxkLWF1eC90YXAtZHJpdmVyLnNoCitTSF9MT0dfQ09NUElMRVIgPSAkKFNIRUxMKQorCisjIyBub3RlIHRoYXQgVEVTVFMgaGFzIHNwZWNpYWwgbWVhbmluZyAoc3R1ZmYgdG8gdXNlIGluIG1ha2UgY2hlY2spCisjIyBzbyBpZiBhZGRpbmcgdGVzdHMgbm90IHRvIGJlIHJ1biBpbiBtYWtlIGNoZWNrLCBkb24ndCBhZGQgdGhlbSB0byAKKyMjIFRFU1RTCitURVNUUyA9CisKK2lmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitpZiBEQlVTX1VOSVgKK0FNX1RFU1RTX0VOVklST05NRU5UID0gXAorICAgICAgICBleHBvcnQgREJVU19UT1BfQlVJTERESVI9QGFic190b3BfYnVpbGRkaXJAOyBcCisgICAgICAgIGV4cG9ydCBEQlVTX1RPUF9TUkNESVI9QGFic190b3Bfc3JjZGlyQDsgXAorICAgICAgICBleHBvcnQgUFlUSE9OPUBQWVRIT05AOyBcCisgICAgICAgIGV4cG9ydCBEQlVTX1RFU1RfREFUQT1AYWJzX3RvcF9idWlsZGRpckAvdGVzdC9kYXRhOyBcCisgICAgICAgIGV4cG9ydCBEQlVTX1RFU1RfREFFTU9OPUBhYnNfdG9wX2J1aWxkZGlyQC9idXMvZGJ1cy1kYWVtb24kKEVYRUVYVCk7IFwKKyAgICAgICAgZXhwb3J0IFhER19SVU5USU1FX0RJUj1AYWJzX3RvcF9idWlsZGRpckAvdGVzdC9YREdfUlVOVElNRV9ESVI7IFwKKyAgICAgICAgJChOVUxMKQorCitURVNUUyArPSBcCisJcnVuLXRlc3Quc2ggXAorCXJ1bi10ZXN0LXN5c3RlbXNlcnZlci5zaCBcCisJJChOVUxMKQorZW5kaWYKK2VuZGlmCisKK0VYVFJBX0RJU1Q9cnVuLXRlc3Quc2ggcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoIHRlc3Qtd2FpdC1mb3ItZWNoby5weSB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjIyB3ZSB1c2Ugbm9pbnN0X1BST0dSQU1TIG5vdCBjaGVja19QUk9HUkFNUyBmb3IgVEVTVFMgc28gdGhhdCB3ZQorIyMgYnVpbGQgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKK25vaW5zdF9QUk9HUkFNUz10ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IHRlc3QtdGhyZWFkcy1pbml0IHRlc3QtaWRzIHRlc3Qtc2h1dGRvd24gdGVzdC1wcml2c2VydmVyIHRlc3QtcHJpdnNlcnZlci1jbGllbnQgdGVzdC1hdXRvbGF1bmNoCisKK3Rlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQordGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEKK3Rlc3RfdGhyZWFkc19pbml0X0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQordGVzdF9pZHNfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhCisKK3Rlc3Rfc2h1dGRvd25fTERBREQ9Li4vbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfcHJpdnNlcnZlcl9MREFERD0uLi9saWJkYnVzLXRlc3R1dGlscy5sYQordGVzdF9wcml2c2VydmVyX2NsaWVudF9MREFERD0uLi9saWJkYnVzLXRlc3R1dGlscy5sYQordGVzdF9hdXRvbGF1bmNoX0xEQUREPS4uL2xpYmRidXMtdGVzdHV0aWxzLmxhCisKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2ggYi90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTkyNmNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LXN5c3RlbXNlcnZlci5zaApAQCAtMCwwICsxLDg5IEBACisjISAvYmluL3NoCisKK1NDUklQVE5BTUU9JDAKK01PREU9JDEKKworIyMgc28gdGhlIHRlc3RzIGNhbiBjb21wbGFpbiBpZiB5b3UgZmFpbCB0byB1c2UgdGhlIHNjcmlwdCB0byBsYXVuY2ggdGhlbQorREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUPTEKK2V4cG9ydCBEQlVTX1RFU1RfTkFNRV9SVU5fVEVTVF9TQ1JJUFQKKworU09VUkNFX0NPTkZJR19GSUxFPSREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgorZXhwb3J0IFNPVVJDRV9DT05GSUdfRklMRQorIyBSZXJ1biBvdXJzZWx2ZXMgd2l0aCB0bXAgc2Vzc2lvbiBidXMgaWYgd2UncmUgbm90IGFscmVhZHkKK2lmIHRlc3QgLXogIiREQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1QiOyB0aGVuCisgIERCVVNfVEVTVF9OQU1FX0lOX1NZU19SVU5fVEVTVD0xCisgIGV4cG9ydCBEQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1QKKyAgZXhlYyAkREJVU19UT1BfU1JDRElSL3Rvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaCAkU0NSSVBUTkFNRSAkTU9ERQorZmkgCisKK2lmIHRlc3QgLW4gIiREQlVTX1RFU1RfTU9OSVRPUiI7IHRoZW4KKyAgZGJ1cy1tb25pdG9yIC0tc2Vzc2lvbiA+JjIgJgorZmkKKworWERHX1JVTlRJTUVfRElSPSIkREJVU19UT1BfQlVJTERESVIiL3Rlc3QvWERHX1JVTlRJTUVfRElSCit0ZXN0IC1kICIkWERHX1JVTlRJTUVfRElSIiB8fCBta2RpciAiJFhER19SVU5USU1FX0RJUiIKK2NobW9kIDA3MDAgIiRYREdfUlVOVElNRV9ESVIiCitleHBvcnQgWERHX1JVTlRJTUVfRElSCisKKyMgVHJhbnNsYXRlIGEgY29tbWFuZCBhbmQgZXhpdCBzdGF0dXMgaW50byBUQVAgc3ludGF4LgorIyBVc2FnZTogaW50ZXJwcmV0X3Jlc3VsdCAkPyBkZXNjcmlwdGlvbi1vZi10ZXN0CisjIFVzZXMgZ2xvYmFsIHZhcmlhYmxlICR0ZXN0X251bS4KK2ludGVycHJldF9yZXN1bHQgKCkgeworICBlPSIkMSIKKyAgc2hpZnQKKyAgY2FzZSAiJGUiIGluCisgICAgKDApCisgICAgICBlY2hvICJvayAkdGVzdF9udW0gJCoiCisgICAgICA7OworICAgICg3NykKKyAgICAgIGVjaG8gIm9rICR0ZXN0X251bSAjIFNLSVAgJCoiCisgICAgICA7OworICAgICgqKQorICAgICAgZWNobyAibm90IG9rICR0ZXN0X251bSAkKiIKKyAgICAgIDs7CisgIGVzYWMKKyAgdGVzdF9udW09JCgoICR0ZXN0X251bSArIDEgKSkKK30KKworZGJ1c19zZW5kX3Rlc3QgKCkgeworICB0PSIkMSIKKyAgZXhwZWN0ZWRfZXhpdD0iJDIiCisgIHBocmFzZT0iJDMiCisgIHNoaWZ0IDMKKyAgZT0wCisgIGVjaG8gIiMgcnVubmluZyB0ZXN0ICR0IgorICAiJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCIgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICIkREJVU19UT1BfQlVJTERESVIvdG9vbHMvZGJ1cy1zZW5kIiAiJEAiID4gb3V0cHV0LnRtcCAyPiYxIHx8IGU9JD8KKyAgaWYgWyAkZSAhPSAkZXhwZWN0ZWRfZXhpdCBdOyB0aGVuCisgICAgc2VkIC1lICdzL14vIyAgLycgPCBvdXRwdXQudG1wCisgICAgaW50ZXJwcmV0X3Jlc3VsdCAiMSIgIiR0IiAiJEAiICIoZXhwZWN0ZWQgZXhpdCBzdGF0dXMgJGV4cGVjdGVkX2V4aXQsIGdvdCAkZSkiCisgICAgcmV0dXJuCisgIGZpCisgIGVjaG8gIiMgcGFyc2luZyByZXN1bHRzIG9mIHRlc3QgJHQiCisgIGlmICEgZ3JlcCAtcSAiJHBocmFzZSIgb3V0cHV0LnRtcDsgdGhlbgorICAgIHNlZCAtZSAncy9eLyMgIC8nIDwgb3V0cHV0LnRtcAorICAgIGludGVycHJldF9yZXN1bHQgIjEiICIkdCIgIiRAIiAiKERpZCBub3Qgc2VlIFwiJHBocmFzZVwiIGluIG91dHB1dCkiCisgICAgcmV0dXJuCisgIGZpCisgIGludGVycHJldF9yZXN1bHQgIjAiICIkdCIgIiRAIiAiKFNhdyBcIiRwaHJhc2VcIiBpbiBvdXRwdXQgYXMgZXhwZWN0ZWQpIgorICBybSAtZiBvdXRwdXQudG1wCit9CisKK3B5X3Rlc3QgKCkgeworICB0PSIkMSIKKyAgc2hpZnQKKyAgaWYgdGVzdCAieCRQWVRIT04iID0gIng6IjsgdGhlbgorICAgIGludGVycHJldF9yZXN1bHQgNzcgIiR0IiAiKFB5dGhvbiBpbnRlcnByZXRlciBub3QgZm91bmQpIgorICBlbHNlCisgICAgZT0wCisgICAgZWNobyAiIyBydW5uaW5nIHRlc3QgJHQiCisgICAgJFBZVEhPTiAiJERCVVNfVE9QX1NSQ0RJUi90ZXN0L25hbWUtdGVzdC8kdCIgIiRAIiA+JjIgfHwgZT0kPworICAgIGludGVycHJldF9yZXN1bHQgIiRlIiAiJHQiICIkQCIKKyAgZmkKK30KKwordGVzdF9udW09MQorIyBUQVAgc3ludGF4OiB3ZSBwbGFuIHRvIHJ1biAyIHRlc3RzCitlY2hvICIxLi4yIgorCitkYnVzX3NlbmRfdGVzdCB0ZXN0LWV4cGVjdGVkLWVjaG8tZmFpbCAxIERCdXMuRXJyb3IgLS1wcmludC1yZXBseSAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UgL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUgb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZS5FY2hvIHN0cmluZzpoaQorcHlfdGVzdCB0ZXN0LXdhaXQtZm9yLWVjaG8ucHkKZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoIGIvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZTdhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoCkBAIC0wLDAgKzEsODAgQEAKKyMhIC9iaW4vc2gKKworU0NSSVBUTkFNRT0kMAorTU9ERT0kMQorCisjIyBzbyB0aGUgdGVzdHMgY2FuIGNvbXBsYWluIGlmIHlvdSBmYWlsIHRvIHVzZSB0aGUgc2NyaXB0IHRvIGxhdW5jaCB0aGVtCitEQlVTX1RFU1RfTkFNRV9SVU5fVEVTVF9TQ1JJUFQ9MQorZXhwb3J0IERCVVNfVEVTVF9OQU1FX1JVTl9URVNUX1NDUklQVAorCisjIFJlcnVuIG91cnNlbHZlcyB3aXRoIHRtcCBzZXNzaW9uIGJ1cyBpZiB3ZSdyZSBub3QgYWxyZWFkeQoraWYgdGVzdCAteiAiJERCVVNfVEVTVF9OQU1FX0lOX1JVTl9URVNUIjsgdGhlbgorICBEQlVTX1RFU1RfTkFNRV9JTl9SVU5fVEVTVD0xCisgIGV4cG9ydCBEQlVTX1RFU1RfTkFNRV9JTl9SVU5fVEVTVAorICBleGVjICREQlVTX1RPUF9TUkNESVIvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoICRTQ1JJUFROQU1FICRNT0RFCitmaSAKKworaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9NT05JVE9SIjsgdGhlbgorICBkYnVzLW1vbml0b3IgLS1zZXNzaW9uID4mMiAmCitmaQorCitYREdfUlVOVElNRV9ESVI9IiREQlVTX1RPUF9CVUlMRERJUiIvdGVzdC9YREdfUlVOVElNRV9ESVIKK3Rlc3QgLWQgIiRYREdfUlVOVElNRV9ESVIiIHx8IG1rZGlyICIkWERHX1JVTlRJTUVfRElSIgorY2htb2QgMDcwMCAiJFhER19SVU5USU1FX0RJUiIKK2V4cG9ydCBYREdfUlVOVElNRV9ESVIKKworIyBUcmFuc2xhdGUgYSBjb21tYW5kIGFuZCBleGl0IHN0YXR1cyBpbnRvIFRBUCBzeW50YXguCisjIFVzYWdlOiBpbnRlcnByZXRfcmVzdWx0ICQ/IGRlc2NyaXB0aW9uLW9mLXRlc3QKKyMgVXNlcyBnbG9iYWwgdmFyaWFibGUgJHRlc3RfbnVtLgoraW50ZXJwcmV0X3Jlc3VsdCAoKSB7CisgIGU9IiQxIgorICBzaGlmdAorICBjYXNlICIkZSIgaW4KKyAgICAoMCkKKyAgICAgIGVjaG8gIm9rICR0ZXN0X251bSAkKiIKKyAgICAgIDs7CisgICAgKDc3KQorICAgICAgZWNobyAib2sgJHRlc3RfbnVtICMgU0tJUCAkKiIKKyAgICAgIDs7CisgICAgKCopCisgICAgICBlY2hvICJub3Qgb2sgJHRlc3RfbnVtICQqIgorICAgICAgOzsKKyAgZXNhYworICB0ZXN0X251bT0kKCggJHRlc3RfbnVtICsgMSApKQorfQorCitjX3Rlc3QgKCkgeworICB0PSIkMSIKKyAgc2hpZnQKKyAgZT0wCisgIGVjaG8gIiMgcnVubmluZyB0ZXN0ICR0IgorICAiJHtEQlVTX1RPUF9CVUlMRERJUn0vbGlidG9vbCIgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICIkREJVU19UT1BfQlVJTERESVIvdGVzdC9uYW1lLXRlc3QvJHQiICIkQCIgPiYyIHx8IGU9JD8KKyAgZWNobyAiIyBleGl0IHN0YXR1cyAkZSIKKyAgaW50ZXJwcmV0X3Jlc3VsdCAiJGUiICIkdCIgIiRAIgorfQorCitweV90ZXN0ICgpIHsKKyAgdD0iJDEiCisgIHNoaWZ0CisgIGlmIHRlc3QgIngkUFlUSE9OIiA9ICJ4OiI7IHRoZW4KKyAgICBpbnRlcnByZXRfcmVzdWx0IDc3ICIkdCIgIihQeXRob24gaW50ZXJwcmV0ZXIgbm90IGZvdW5kKSIKKyAgZWxzZQorICAgIGU9MAorICAgIGVjaG8gIiMgcnVubmluZyB0ZXN0ICR0IgorICAgICRQWVRIT04gIiREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvJHQiICIkQCIgPiYyIHx8IGU9JD8KKyAgICBpbnRlcnByZXRfcmVzdWx0ICIkZSIgIiR0IiAiJEAiCisgIGZpCit9CisKK3Rlc3RfbnVtPTEKKyMgVEFQIHRlc3QgcGxhbjogd2Ugd2lsbCBydW4gOCB0ZXN0cworZWNobyAiMS4uOCIKKworY190ZXN0IHRlc3QtaWRzCitjX3Rlc3QgdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2gKK2NfdGVzdCB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0CitjX3Rlc3QgdGVzdC10aHJlYWRzLWluaXQKK2NfdGVzdCB0ZXN0LXByaXZzZXJ2ZXItY2xpZW50CitjX3Rlc3QgdGVzdC1zaHV0ZG93bgorcHlfdGVzdCB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQorY190ZXN0IHRlc3QtYXV0b2xhdW5jaApkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkgYi90ZXN0L25hbWUtdGVzdC90ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg1MzdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKQEAgLTAsMCArMSw2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcyxzeXMKKwordHJ5OgorICAgIGZyb20gZ2kucmVwb3NpdG9yeSBpbXBvcnQgR09iamVjdAorICAgIGltcG9ydCBkYnVzCisgICAgaW1wb3J0IGRidXMubWFpbmxvb3AuZ2xpYgorZXhjZXB0OgorICAgIHByaW50ICJGYWlsZWQgaW1wb3J0LCBhYm9ydGluZyB0ZXN0IgorICAgIHN5cy5leGl0KDApCisKK2RidXMubWFpbmxvb3AuZ2xpYi5EQnVzR01haW5Mb29wKHNldF9hc19kZWZhdWx0PVRydWUpCitsb29wID0gR09iamVjdC5NYWluTG9vcCgpCisKK2V4aXRjb2RlID0gMAorCitidXMgPSBkYnVzLlNlc3Npb25CdXMoKQorYnVzX2lmYWNlID0gZGJ1cy5JbnRlcmZhY2UoYnVzLmdldF9vYmplY3QoJ29yZy5mcmVlZGVza3RvcC5EQnVzJywgJy9vcmcvZnJlZWRlc2t0b3AvREJ1cycpLCAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnKQorCitvID0gYnVzLmdldF9vYmplY3QoJ29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZScsICcvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZScpCitpID0gZGJ1cy5JbnRlcmZhY2UobywgJ29yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUnKQorCisjIFN0YXJ0IGl0IHVwCityZXBseSA9IGkuRWNobygiaGVsbG8gd29ybGQiKQorcHJpbnQgIlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZSBpbml0aWFsIHJlcGx5IE9LIgorCitkZWYgaWdub3JlKCphcmdzLCAqKmt3YXJncyk6CisgICAgcGFzcworCisjIE5vdyBtb25pdG9yIGZvciBleGl0cywgd2hlbiB0aGF0IGhhcHBlbnMsIHN0YXJ0IGl0IHVwIGFnYWluLgorIyBUaGUgZ29hbCBoZXJlIGlzIHRvIHRyeSB0byBoaXQgYW55IHJhY2UgY29uZGl0aW9ucyBpbiBhY3RpdmF0aW9uLgorY291bnRlciA9IDAKK2RlZiBvbl9mb3JraW5nX2VjaG9fb3duZXJfY2hhbmdlZChuYW1lLCBvbGQsIG5ldyk6CisgICAgZ2xvYmFsIGNvdW50ZXIKKyAgICBnbG9iYWwgbworICAgIGdsb2JhbCBpCisgICAgaWYgY291bnRlciA+IDEwOgorICAgICAgICBwcmludCAiQWN0aXZhdGVkIDEwIHRpbWVzIE9LLCBUZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UgcGFzcyIKKyAgICAgICAgbG9vcC5xdWl0KCkKKyAgICAgICAgcmV0dXJuCisgICAgY291bnRlciArPSAxCisgICAgaWYgbmV3ID09ICcnOgorICAgICAgICBvID0gYnVzLmdldF9vYmplY3QoJ29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZScsICcvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZScpCisgICAgICAgIGkgPSBkYnVzLkludGVyZmFjZShvLCAnb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScpCisgICAgICAgIGkuRWNobygiY291bnRlciAlciIgJSBjb3VudGVyKQorICAgICAgICBpLkV4aXQocmVwbHlfaGFuZGxlcj1pZ25vcmUsIGVycm9yX2hhbmRsZXI9aWdub3JlKQorCitidXNfaWZhY2UuY29ubmVjdF90b19zaWduYWwoJ05hbWVPd25lckNoYW5nZWQnLCBvbl9mb3JraW5nX2VjaG9fb3duZXJfY2hhbmdlZCwgYXJnMD0nb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlJykKKworaS5FeGl0KHJlcGx5X2hhbmRsZXI9aWdub3JlLCBlcnJvcl9oYW5kbGVyPWlnbm9yZSkKKworZGVmIGNoZWNrX2NvdW50ZXIoKToKKyAgICBpZiBjb3VudGVyID09IDA6CisgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IE5hbWVPd25lckNoYW5nZWQgZm9yIFRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZSIKKyAgICAgICAgc3lzLmV4aXQoMSkKK0dPYmplY3QudGltZW91dF9hZGQoMTUwMDAsIGNoZWNrX2NvdW50ZXIpCisKK2xvb3AucnVuKCkKK3N5cy5leGl0KDApCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LWF1dG9sYXVuY2guYyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LWF1dG9sYXVuY2guYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiZGJ1cy9kYnVzLXN5c2RlcHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubiA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsIE5VTEwpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgLyogSWYgWDExIGF1dG9sYXVuY2ggd2FzIGVuYWJsZWQsIHdlIGV4cGVjdCBkYnVzLWxhdW5jaCB0byBoYXZlIHdvcmtlZC4gKi8KKyAgaWYgKF9kYnVzX2dldGVudiAoIkRJU1BMQVkiKSAhPSBOVUxMICYmIGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGV4cGVjdCBpdCB0byAqd29yayogd2l0aG91dCBYIChhbHRob3VnaCBpdCBtaWdodCAtCisgICAqIGZvciBpbnN0YW5jZSBvbiBNYWMgT1MgaXQgbWlnaHQgaGF2ZSB1c2VkIGxhdW5jaGQpLiBKdXN0IGNoZWNrIHRoYXQgdGhlCisgICAqIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQuICovCisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpICYmIGNvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogQXV0b2xhdW5jaGVkIHNlc3Npb24gYnVzLCBidXQgYW4gZXJyb3Igd2FzIHNldCFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikgJiYgY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1cyBidXQgbm8gZXJyb3Igd2FzIHNldFxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LWlkcy5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYzZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogdGVzdC1pZHM6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGNoYXIgKmlkOworICBjaGFyICpzZXJ2ZXJfaWQ7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBzZXJ2ZXJfaWQgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAoY29ubmVjdGlvbik7CisgIGlmIChzZXJ2ZXJfaWQgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBidXMgc2VydmVyIElEIHJldHJpZXZlZFxuIik7CisgIC8qIHByaW50ZigiJyVzJ1xuIiwgc2VydmVyX2lkKTsgKi8KKyAgaWYgKHN0cmxlbiAoc2VydmVyX2lkKSAhPSAzMikKKyAgICBkaWUgKCJCdXMgc2VydmVyIGlkIHNob3VsZCBoYXZlIGxlbmd0aCAzMlxuIik7CisgIGRidXNfZnJlZSAoc2VydmVyX2lkKTsKKworICBpZCA9IGRidXNfYnVzX2dldF9pZCAoY29ubmVjdGlvbiwgTlVMTCk7CisgIGlmIChpZCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIGJ1cyBJRCByZXRyaWV2ZWRcbiIpOworICAvKiBwcmludGYoIiclcydcbiIsIGlkKTsgKi8KKyAgaWYgKHN0cmxlbiAoaWQpICE9IDMyKQorICAgIGRpZSAoIkJ1cyBJRCBzaG91bGQgaGF2ZSBsZW5ndGggMzJcbiIpOworICBkYnVzX2ZyZWUgKGlkKTsgIAorICAKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IElEcyBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guYyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiNWE0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgc3R1Y2sgcG9sbGluZyBhIGRidXMgY29ubmVjdGlvbgorKiB3aGljaCBoYXMgbm8gZGF0YSBvbiB0aGUgc29ja2V0LiAgVGhpcyB3YXMgYW4gaXNzdWUgd2hlcmUKKyogb25lIHBlbmRpbmcgY2FsbCB3b3VsZCByZWFkIGFsbCB0aGUgZGF0YSBvZmYgdGhlIGJ1cworKiBhbmQgdGhlIHNlY29uZCBwZW5kaW5nIGNhbGwgd291bGQgbm90IGNoZWNrIHRvIHNlZQorKiBpZiBpdHMgZGF0YSBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYmVmb3JlIHBvbGxpbmcgdGhlIGNvbm5lY3Rpb24KKyogYW5kIGJsb2NraW5nLgorKiovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkCitfcnVuX2l0ZXJhdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4pCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqZWNob19wZW5kaW5nOworICBEQnVzUGVuZGluZ0NhbGwgKmRidXNfcGVuZGluZzsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICplY2hvID0gImVjaG8iOworCisgIC8qIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmVjaG9fcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIAorICAvKiBzZW5kIHRoZSBzZWNvbmQgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmRidXNfcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgLyogYmxvY2sgb24gdGhlIHNlY29uZCBtZXNzYWdlIChzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5KSAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZGJ1c19wZW5kaW5nKTsKKworICAvKiBibG9jayBvbiB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAvKiBpZiBpdCBkb2VzIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgY2hhbmNlcyAKKyAgICAgYXJlIHdlIGhpdCB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGVjaG9fcGVuZGluZyk7CisKKyAgLyogY2hlY2sgdGhlIHJlcGx5IG9ubHkgdG8gbWFrZSBzdXJlIHdlCisgICAgIGFyZSBub3QgZ2V0dGluZyBlcnJvcnMgdW5yZWxhdGVkCisgICAgIHRvIHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChlY2hvX3BlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgTlVMTCAqKipcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChkYnVzX3BlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZWNob19wZW5kaW5nKTsKKyAgCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgbG9uZyBzdGFydF90dl9zZWMsIHN0YXJ0X3R2X3VzZWM7CisgIGxvbmcgZW5kX3R2X3NlYywgZW5kX3R2X3VzZWM7CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIC8qIFRpbWUgZWFjaCBpdGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHRha2UgbW9yZSB0aGFuIDUgc2Vjb25kcworICAgICB0byBjb21wbGV0ZS4gIE91dHNpZGUgaW5mbHVlbmNlcyBtYXkgY2F1c2UgY29ubmVjdGlvbnMgdG8gdGFrZSBsb25nZXIKKyAgICAgYnV0IGlmIGl0IGRvZXMgYW5kIHdlIGFyZSBzdHVjayBpbiBhIHBvbGwgY2FsbCB0aGVuIHdlIGtub3cgdGhlIAorICAgICBzdHVjayBpbiBwb2xsIGJ1ZyBoYXMgY29tZSBiYWNrIHRvIGhhdW50IHVzICovCisKKyAgcHJpbnRmICgiKioqIFRlc3Rpbmcgc3R1Y2sgaW4gcG9sbFxuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgLyogcnVuIDEwMCB0aW1lcyB0byBtYWtlIHN1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIGxvbmcgZGVsdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnN0YXJ0X3R2X3NlYywgJnN0YXJ0X3R2X3VzZWMpOworICAgICAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmZW5kX3R2X3NlYywgJmVuZF90dl91c2VjKTsKKworICAgICAgLyogd2UganVzdCBjYXJlIGFib3V0IHNlY29uZHMgKi8KKyAgICAgIGRlbHRhID0gZW5kX3R2X3NlYyAtIHN0YXJ0X3R2X3NlYzsKKyAgICAgIHByaW50ZiAoIkl0ZXIgJWk6ICVsaXNcbiIsIGksIGRlbHRhKTsKKyAgICAgIGlmIChkZWx0YSA+PSA1KQorICAgICAgICB7CisJICBwcmludGYgKCJGYWlsZWQ6IGxvb2tzIGxpa2Ugd2UgbWlnaHQgaGF2ZSBiZWVuIGJlIHN0dWNrIGluIHBvbGwgKioqXG4iKTsKKwkgIGV4aXQgKDEpOworCX0KKyAgICB9CisgCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uLCBtZXRob2QsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgcHJpbnRmICgiU3VjY2VzcyAqKipcbiIpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQuYyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUxZmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyogVGVzdCB0byBtYWtlIHN1cmUgdGhhdCBwZW5kaW5nIGNhbGxzIHN1Y2NlZWQgd2hlbiBnaXZlbiBhIGRlZmF1bHQsCisqIHNwZWNpZmljIGFuZCBpbmZpbml0ZSB0aW1lb3V0LgorKiovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkCitfbWV0aG9kX2NhbGwgKERCdXNDb25uZWN0aW9uICpjb25uLAorCSAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGNoYXIgKmVjaG8gPSAiZWNobyI7CisKKyAgLyogc2VuZCB0aGUgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWxheUVjaG8iKTsKKworICBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1ldGhvZCwgREJVU19UWVBFX1NUUklORywgJmVjaG8sIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uLCBtZXRob2QsICZwZW5kaW5nLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKyAgCisgIC8qIGJsb2NrIG9uIHRoZSBtZXNzYWdlICovCisgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChwZW5kaW5nKTsKKworICAvKiBjaGVjayB0aGUgcmVwbHkgb25seSB0byBtYWtlIHN1cmUgd2UKKyAgICAgYXJlIG5vdCBnZXR0aW5nIGVycm9ycyB1bnJlbGF0ZWQKKyAgICAgdG8gdGhlIGJsb2NrIGluIHBvbGwgYnVnICovCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgTlVMTCAqKipcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworc3RhdGljIHZvaWQKK19ydW5faXRlcmF0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubikKK3sKKyAgX21ldGhvZF9jYWxsIChjb25uLCAtMSk7CisgIF9tZXRob2RfY2FsbCAoY29ubiwgMTAwMDApOworICBfbWV0aG9kX2NhbGwgKGNvbm4sIElOVF9NQVgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGxvbmcgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjOworICBsb25nIGVuZF90dl9zZWMsIGVuZF90dl91c2VjOworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNFcnJvciBlcnJvcjsKKworICBwcmludGYgKCIqKiogVGVzdGluZyBwZW5kaW5nIGNhbGwgdGltZW91dHNcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIC8qIHJ1biAxMDAgdGltZXMgdG8gbWFrZSBzdXJlICovCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICB7CisgICAgICBsb25nIGRlbHRhOworICAgICAgCisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgICAgIF9ydW5faXRlcmF0aW9uIChjb25uKTsKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmVuZF90dl9zZWMsICZlbmRfdHZfdXNlYyk7CisKKyAgICAgIC8qIHdlIGp1c3QgY2FyZSBhYm91dCBzZWNvbmRzICovCisgICAgICBkZWx0YSA9IGVuZF90dl9zZWMgLSBzdGFydF90dl9zZWM7CisgICAgICBwcmludGYgKCJJdGVyICVpOiAlbGlzXG4iLCBpLCBkZWx0YSk7CisgICAgfQorIAorICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubiwgbWV0aG9kLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIHByaW50ZiAoIlN1Y2Nlc3MgKioqXG4iKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmNDg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIi4uL3Rlc3QtdXRpbHMuaCIKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIGV4aXQgKDEpOworfQorCisjZGVmaW5lIFBSSVZTRVJWRVJfU0VSVklDRSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIiCisjZGVmaW5lIFBSSVZTRVJWRVJfSU5URVJGQUNFIFBSSVZTRVJWRVJfU0VSVklDRQorI2RlZmluZSBQUklWU0VSVkVSX0RJRURfUlVMRSBcCisgICAgICAidHlwZT0nc2lnbmFsJyxzZW5kZXI9JyIgREJVU19TRVJWSUNFX0RCVVMgIicsIiBcCisgICAgICAiaW50ZXJmYWNlPSciIERCVVNfSU5URVJGQUNFX0RCVVMgIicsbWVtYmVyPSdOYW1lT3duZXJDaGFuZ2VkJywiIFwKKyAgICAgICJhcmcwPSciIFBSSVZTRVJWRVJfU0VSVklDRSAiJyxhcmcyPScnIgorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2ZpbHRlcl9zZXNzaW9uX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBkYnVzX2Jvb2xfdCAqc2VydmljZV9kaWVkX3AgPSB1c2VyX2RhdGE7CisgIGNvbnN0IGNoYXIgKm5hbWUsICpvbGRfb3duZXIsICpuZXdfb3duZXI7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSAmJgorICAgICAgZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSAmJgorICAgICAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5ld19vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpICYmCisgICAgICBzdHJjbXAgKG5hbWUsIFBSSVZTRVJWRVJfU0VSVklDRSkgPT0gMCAmJgorICAgICAgb2xkX293bmVyWzBdICE9ICdcMCcgJiYKKyAgICAgIG5ld19vd25lclswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgICpzZXJ2aWNlX2RpZWRfcCA9IFRSVUU7CisgICAgfQorCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0IAorZmlsdGVyX3ByaXZhdGVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90ICpwcml2YXRlX2Nvbm5fbG9zdF9wID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgKnByaXZhdGVfY29ubl9sb3N0X3AgPSBUUlVFOworICAgIH0KKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKGRidXNfYm9vbF90IHVzZV9ndWlkKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNMb29wICpsb29wOworICBEQnVzQ29ubmVjdGlvbiAqc2Vzc2lvbjsKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzQ29ubmVjdGlvbiAqcHJpdmNvbm47CisgIGNoYXIgKmFkZHI7CisgIGRidXNfYm9vbF90IHNlcnZpY2VfZGllZDsKKyAgZGJ1c19ib29sX3QgcHJpdmF0ZV9jb25uX2xvc3Q7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBzZXJ2aWNlX2RpZWQgPSBGQUxTRTsKKyAgcHJpdmF0ZV9jb25uX2xvc3QgPSBGQUxTRTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisKKyAgc2Vzc2lvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKyAgaWYgKCFzZXNzaW9uKQorICAgIGRpZSAoImNvdWxkbid0IGFjY2VzcyBzZXNzaW9uIGJ1c1xuIik7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChzZXNzaW9uLCBGQUxTRSk7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgc2Vzc2lvbik7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChzZXNzaW9uLCBQUklWU0VSVkVSX0RJRURfUlVMRSwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBtYXRjaCBydWxlIFwiJXNcIjogJXM6ICVzIiwgUFJJVlNFUlZFUl9ESUVEX1JVTEUsCisgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXNzaW9uLCBmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9kaWVkLCBOVUxMKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBhZGQgZmlsdGVyIHRvIHNlc3Npb24gYnVzXG4iKTsKKworICBtc2cgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChQUklWU0VSVkVSX1NFUlZJQ0UsICIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJVlNFUlZFUl9JTlRFUkZBQ0UsICJHZXRQcml2YXRlQWRkcmVzcyIpOworICBpZiAoIShyZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChzZXNzaW9uLCBtc2csIC0xLCAmZXJyb3IpKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBzZW5kIG1lc3NhZ2U6ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksICZlcnJvciwgREJVU19UWVBFX1NUUklORywgJmFkZHIsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBwYXJzZSBtZXNzYWdlIHJlcGx5bVxuIik7CisgIHByaW50ZiAoImdvdCBwcml2YXRlIHRlbXAgYWRkcmVzcyAlc1xuIiwgYWRkcik7CisgIGFkZHIgPSBzdHJkdXAgKGFkZHIpOworICBpZiAoIXVzZV9ndWlkKQorICAgIHsKKyAgICAgIGNoYXIgKmNvbW1hID0gc3RycmNociAoYWRkciwgJywnKTsKKyAgICAgIGlmIChjb21tYSkKKyAgICAgICAgKmNvbW1hID0gJ1wwJzsKKyAgICB9CisgIHByaXZjb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHIsICZlcnJvcik7CisgIGZyZWUgKGFkZHIpOworICBpZiAoIXByaXZjb25uKQorICAgIGRpZSAoImNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyIGRpcmVjdCBjb25uZWN0aW9uOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChwcml2Y29ubiwgRkFMU0UpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChwcml2Y29ubiwgZmlsdGVyX3ByaXZhdGVfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaXZhdGVfY29ubl9sb3N0LCBOVUxMKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBhZGQgZmlsdGVyIHRvIHByaXZhdGUgY29ubmVjdGlvblxuIik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgcHJpdmNvbm4pOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFBSSVZTRVJWRVJfU0VSVklDRSwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWU0VSVkVSX0lOVEVSRkFDRSwgIlF1aXQiKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoc2Vzc2lvbiwgbXNnLCBOVUxMKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBzZW5kIFF1aXQgbWVzc2FnZVxuIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICB3aGlsZSAoIXNlcnZpY2VfZGllZCB8fCAhcHJpdmF0ZV9jb25uX2xvc3QpCisgICAgX2RidXNfbG9vcF9pdGVyYXRlIChsb29wLCBUUlVFKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoc2Vzc2lvbiwgZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX2RpZWQpOworICBkYnVzX2J1c19yZW1vdmVfbWF0Y2ggKHNlc3Npb24sIFBSSVZTRVJWRVJfRElFRF9SVUxFLCBOVUxMKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBzZXNzaW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChzZXNzaW9uKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHByaXZjb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKHByaXZjb25uLCBmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaXZhdGVfY29ubl9sb3N0KTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChwcml2Y29ubik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKFRSVUUpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKFRSVUUpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKEZBTFNFKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIG9wZW5fc2h1dGRvd25fcHJpdmF0ZV9jb25uZWN0aW9uIChGQUxTRSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhOThiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci5jCkBAIC0wLDAgKzEsMTIzIEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiLi4vdGVzdC11dGlscy5oIgorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOworICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgZXhpdCAoMSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRlc3RTZXJ2aWNlRGF0YSBUZXN0U2VydmljZURhdGE7CisKK3N0cnVjdCBUZXN0U2VydmljZURhdGEKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIGNoYXIgKnByaXZhdGVfYWRkcjsKK307CisKK3N0YXRpYyB2b2lkCituZXdfY29ubmVjdGlvbl9jYWxsYmFjayAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIFRlc3RTZXJ2aWNlRGF0YSAqdGVzdGRhdGEgPSBkYXRhOworCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwICh0ZXN0ZGF0YS0+bG9vcCwgbmV3X2Nvbm5lY3Rpb24pKQorICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAobmV3X2Nvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQgCitmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YSA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0UHJpdmF0ZUFkZHJlc3MiKSkKKyAgICB7CisgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgICBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LCBEQlVTX1RZUEVfU1RSSU5HLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYodGVzdGRhdGEtPnByaXZhdGVfYWRkciksIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpOworICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWl0IikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2VydmVyIGV4aXRpbmcgbG9vcFxuIik7CisgICAgICBfZGJ1c19sb29wX3F1aXQgKHRlc3RkYXRhLT5sb29wKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNMb29wICpsb29wOworICBEQnVzQ29ubmVjdGlvbiAqc2Vzc2lvbjsKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworCisgIHRlc3RkYXRhID0gZGJ1c19uZXcgKFRlc3RTZXJ2aWNlRGF0YSwgMSk7CisgIHRlc3RkYXRhLT5sb29wID0gbG9vcDsKKworICBzZXNzaW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBpZiAoIXNlc3Npb24pCisgICAgZGllICgiY291bGRuJ3QgYWNjZXNzIHNlc3Npb24gYnVzIik7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKHNlc3Npb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICBkaWUgKCJjb3VsZG4ndCByZXF1ZXN0IG5hbWU6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoc2Vzc2lvbiwgZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSwgdGVzdGRhdGEsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIiKTsKKworI2lmZGVmIERCVVNfQ01BS0UKKyAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChURVNUX0xJU1RFTiwgJmVycm9yKTsKKyNlbHNlCisgIHNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoInVuaXg6dG1wZGlyPS90bXAiLCAmZXJyb3IpOworI2VuZGlmCisgIGlmICghc2VydmVyKQorICAgIGRpZSAoZXJyb3IubWVzc2FnZSk7CisgIHRlc3RkYXRhLT5wcml2YXRlX2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoc2VydmVyKTsKKyAgcHJpbnRmICgidGVzdCBzZXJ2ZXIgbGlzdGVuaW5nIG9uICVzXG4iLCB0ZXN0ZGF0YS0+cHJpdmF0ZV9hZGRyKTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKHNlcnZlciwgbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGRhdGEsIE5VTEwpOworCisgIGlmICghdGVzdF9zZXJ2ZXJfc2V0dXAgKGxvb3AsIHNlcnZlcikpCisgICAgZGllICgic2VydmVyIHNldHVwIGZhaWxlZCIpOworCisgIGZwcmludGYgKHN0ZGVyciwgInNlcnZlciBydW5uaW5nIG1haW5sb29wXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGxvb3ApOworICBmcHJpbnRmIChzdGRlcnIsICJzZXJ2ZXIgbWFpbmxvb3AgcXVpdFxuIik7CisKKyAgdGVzdF9zZXJ2ZXJfc2h1dGRvd24gKGxvb3AsIHNlcnZlcik7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHNlc3Npb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGRidXNfZnJlZSAodGVzdGRhdGEpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1zaHV0ZG93bi5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1zaHV0ZG93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmMxY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXNodXRkb3duLmMKQEAgLTAsMCArMSw2OCBAQAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiLi4vdGVzdC11dGlscy5oIgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LXNodXRkb3duOiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK29wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAodm9pZCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgY2hhciAqc2Vzc2lvbl9hZGRyX25vX2d1aWQ7CisgIGNoYXIgKmNvbW1hOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHNlc3Npb25fYWRkcl9ub19ndWlkID0gc3RyZHVwIChnZXRlbnYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiKSk7CisgIGNvbW1hID0gc3RyY2hyIChzZXNzaW9uX2FkZHJfbm9fZ3VpZCwgJywnKTsKKyAgaWYgKGNvbW1hID09IE5VTEwpCisgICAgZGllICgiQ291bGRuJ3QgZmluZCBHVUlEIGluIHNlc3Npb24gYnVzIGFkZHJlc3MiKTsKKyAgKmNvbW1hID0gJ1wwJzsKKyAgICAKKyAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChzZXNzaW9uX2FkZHJfbm9fZ3VpZCwgJmVycm9yKTsKKyAgZnJlZSAoc2Vzc2lvbl9hZGRyX25vX2d1aWQpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIGRpZSAoIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gdGVtcCBzZXNzaW9uIGJ1c1xuIik7CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAobG9vcCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIXRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIGNvbm5lY3Rpb24pOworIAorICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOyAKK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBvcGVuX2Rlc3Ryb3lfc2hhcmVkX3Nlc3Npb25fYnVzX2Nvbm5lY3Rpb24gKCk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX2Rlc3Ryb3lfc2hhcmVkX3Nlc3Npb25fYnVzX2Nvbm5lY3Rpb24gKCk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX2Rlc3Ryb3lfc2hhcmVkX3Nlc3Npb25fYnVzX2Nvbm5lY3Rpb24gKCk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2h1dGRvd24gZXhpdGluZ1xuIik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTdlMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKioKKyAqIFRlc3QgdG8gbWFrZSBzdXJlIGxhdGUgdGhyZWFkIGluaXRpYWxpemF0aW9uIHdvcmtzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorCitzdGF0aWMgdm9pZAorX3J1bl9pdGVyYXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uKQoreworICBEQnVzUGVuZGluZ0NhbGwgKmVjaG9fcGVuZGluZzsKKyAgREJ1c1BlbmRpbmdDYWxsICpkYnVzX3BlbmRpbmc7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY2hhciAqZWNobyA9ICJlY2hvIjsKKworICAvKiBzZW5kIHRoZSBmaXJzdCBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1ldGhvZCwgREJVU19UWVBFX1NUUklORywgJmVjaG8sIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uLCBtZXRob2QsICZlY2hvX3BlbmRpbmcsIC0xKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworICAKKyAgLyogc2VuZCB0aGUgc2Vjb25kIG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkludHJvc3BlY3RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludHJvc3BlY3QiKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uLCBtZXRob2QsICZkYnVzX3BlbmRpbmcsIC0xKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIC8qIGJsb2NrIG9uIHRoZSBzZWNvbmQgbWVzc2FnZSAoc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSkgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGRidXNfcGVuZGluZyk7CisKKyAgLyogYmxvY2sgb24gdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgLyogaWYgaXQgZG9lcyBub3QgcmV0dXJuIGltbWVkaWF0ZWx5IGNoYW5jZXMgCisgICAgIGFyZSB3ZSBoaXQgdGhlIGJsb2NrIGluIHBvbGwgYnVnICovCisgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChlY2hvX3BlbmRpbmcpOworCisgIC8qIGNoZWNrIHRoZSByZXBseSBvbmx5IHRvIG1ha2Ugc3VyZSB3ZQorICAgICBhcmUgbm90IGdldHRpbmcgZXJyb3JzIHVucmVsYXRlZAorICAgICB0byB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAoZWNob19wZW5kaW5nKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIE5VTEwgKioqXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChyZXBseSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgcHJpbnRmICgiRmFpbGVkOiBSZXBseSBpcyBlcnJvcjogJXMgKioqXG4iLCBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKHJlcGx5KSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9IAorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZGJ1c19wZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKGVjaG9fcGVuZGluZyk7CisgIAorfQorc3RhdGljIHZvaWQKK2NoZWNrX211dGV4X2xvY2sgKERCdXNNdXRleCAqbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqbXV0ZXgyLCAKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX3NhbWUpCit7CisgIF9kYnVzX2Fzc2VydCAobXV0ZXgxICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG11dGV4MiAhPSBOVUxMKTsKKyAgCisgIGlmIChpc19zYW1lKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobXV0ZXgxID09IG11dGV4Mik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtdXRleDEgIT0gbXV0ZXgyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19jb25kdmFyX2xvY2sgKERCdXNDb25kVmFyICpjb25kdmFyMSwgIAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqY29uZHZhcjIsICAgCisgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX3NhbWUpCit7CisgIF9kYnVzX2Fzc2VydCAoY29uZHZhcjEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29uZHZhcjIgIT0gTlVMTCk7CisKKyAgaWYgKGlzX3NhbWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSA9PSBjb25kdmFyMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSAhPSBjb25kdmFyMik7CisgICAgfQorfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c011dGV4ICptdXRleDEsICpkaXNwYXRjaF9tdXRleDEsICppb19wYXRoX211dGV4MTsKKyAgREJ1c0NvbmRWYXIgKmRpc3BhdGNoX2NvbmQxLCAqaW9fcGF0aF9jb25kMTsKKyAgREJ1c011dGV4ICptdXRleDIsICpkaXNwYXRjaF9tdXRleDIsICppb19wYXRoX211dGV4MjsKKyAgREJ1c0NvbmRWYXIgKmRpc3BhdGNoX2NvbmQyLCAqaW9fcGF0aF9jb25kMjsKKworICBwcmludGYgKCIqKiogVGVzdGluZyBsYXRlIHRocmVhZCBpbml0XG4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX211dGV4MSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX211dGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX2NvbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9jb25kMSk7CisgIF9ydW5faXRlcmF0aW9uIChjb25uKTsKKyAgX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAoY29ubiwgJm11dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX211dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQyKTsKKworICBjaGVja19tdXRleF9sb2NrIChtdXRleDEsIG11dGV4MiwgVFJVRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGRpc3BhdGNoX211dGV4MSwgZGlzcGF0Y2hfbXV0ZXgyLCBUUlVFKTsKKyAgY2hlY2tfbXV0ZXhfbG9jayAoaW9fcGF0aF9tdXRleDEsIGlvX3BhdGhfbXV0ZXgyLCBUUlVFKTsKKyAgY2hlY2tfY29uZHZhcl9sb2NrIChkaXNwYXRjaF9jb25kMSwgZGlzcGF0Y2hfY29uZDIsIFRSVUUpOworICBjaGVja19jb25kdmFyX2xvY2sgKGlvX3BhdGhfY29uZDEsIGlvX3BhdGhfY29uZDIsIFRSVUUpOworCisgIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKCk7CisKKyAgX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAoY29ubiwgJm11dGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX211dGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQxKTsKKworICBfcnVuX2l0ZXJhdGlvbiAoY29ubik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX211dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX2NvbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9jb25kMik7CisKKyAgY2hlY2tfbXV0ZXhfbG9jayAobXV0ZXgxLCBtdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChkaXNwYXRjaF9tdXRleDEsIGRpc3BhdGNoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoZGlzcGF0Y2hfY29uZDEsIGRpc3BhdGNoX2NvbmQyLCBUUlVFKTsKKyAgY2hlY2tfY29uZHZhcl9sb2NrIChpb19wYXRoX2NvbmQxLCBpb19wYXRoX2NvbmQyLCBUUlVFKTsKKworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubiwgbWV0aG9kLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIHByaW50ZiAoIlN1Y2Nlc3MgKioqXG4iKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDllY2JiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weQpAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLHN5cworCit0cnk6CisgICAgaW1wb3J0IGRidXMKKyAgICBpbXBvcnQgZGJ1cy5tYWlubG9vcC5nbGliCisgICAgZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHT2JqZWN0CitleGNlcHQ6CisgICAgcHJpbnQgIkZhaWxlZCBpbXBvcnQsIGFib3J0aW5nIHRlc3QiCisgICAgc3lzLmV4aXQoMCkKKworZGJ1cy5tYWlubG9vcC5nbGliLkRCdXNHTWFpbkxvb3Aoc2V0X2FzX2RlZmF1bHQ9VHJ1ZSkKK2xvb3AgPSBHT2JqZWN0Lk1haW5Mb29wKCkKKworZXhpdGNvZGUgPSAwCisKK2RlZiBoYW5kbGVfbm9yZWNlaXB0KCk6CisgICAgcHJpbnQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIgorICAgIGdsb2JhbCBleGl0Y29kZQorICAgIGV4aXRjb2RlID0gMQorICAgIGxvb3AucXVpdCgpCisKK0dPYmplY3QudGltZW91dF9hZGQoNzAwMCwgaGFuZGxlX25vcmVjZWlwdCkKKworYnVzID0gZGJ1cy5TZXNzaW9uQnVzKCkKKworZGVmIHNpZ2hhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBwcmludCAiZ290IHNpZ25hbCIKKyAgICBsb29wLnF1aXQoKSAgIAorCitidXMuYWRkX3NpZ25hbF9yZWNlaXZlcihzaWdoYW5kbGVyLCBkYnVzX2ludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScsIHNpZ25hbF9uYW1lPSdGb28nKQorCitvID0gYnVzLmdldF9vYmplY3QoJ29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlJywgJy9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlJykKK2kgPSBkYnVzLkludGVyZmFjZShvLCAnb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScpCitkZWYgbnVsbGhhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBwYXNzCitpLkVtaXRGb28ocmVwbHlfaGFuZGxlcj1udWxsaGFuZGxlciwgZXJyb3JfaGFuZGxlcj1udWxsaGFuZGxlcikKKworbG9vcC5ydW4oKQorc3lzLmV4aXQoZXhpdGNvZGUpCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mIGIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWFiMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgpAQCAtMCwwICsxLDkxIEBACis8IS0tIFRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRyb2xzIHRoZSBwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzLgorICAgICBBZGQgYSBzZXNzaW9uLWxvY2FsLmNvbmYgYW5kIGVkaXQgdGhhdCByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGlzIAorICAgICBmaWxlIGRpcmVjdGx5LiAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG9uJ3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnNlc3Npb248L3R5cGU+CisKKyAgPCEtLSBJZiB3ZSBmb3JrLCBrZWVwIHRoZSB1c2VyJ3Mgb3JpZ2luYWwgdW1hc2sgdG8gYXZvaWQgYWZmZWN0aW5nCisgICAgICAgdGhlIGJlaGF2aW9yIG9mIGNoaWxkIHByb2Nlc3Nlcy4gLS0+CisgIDxrZWVwX3VtYXNrLz4KKworICA8c3lzbG9nLz4KKworICA8bGlzdGVuPnVuaXg6dG1wZGlyPS90bXA8L2xpc3Rlbj4KKworICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorCisgIDwhLS0gaW50ZW5kZWQgdG8gbWF0Y2ggc3lzdGVtIGJ1cyAtLT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbCB1c2VycyBjYW4gY29ubmVjdCB0byBzeXN0ZW0gYnVzIC0tPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisKKyAgICA8IS0tIEhvbGVzIG11c3QgYmUgcHVuY2hlZCBpbiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yCisgICAgICAgICBuYW1lIG93bmVyc2hpcCBhbmQgc2VuZGluZyBtZXRob2QgY2FsbHMgLS0+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPGRlbnkgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorCisgICAgPCEtLSBTaWduYWxzIGFuZCByZXBseSBtZXNzYWdlcyAobWV0aG9kIHJldHVybnMsIGVycm9ycykgYXJlIGFsbG93ZWQKKyAgICAgICAgIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGFsbG93IHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBzZW5kX3R5cGU9Im1ldGhvZF9yZXR1cm4iLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0iZXJyb3IiLz4KKworICAgIDwhLS0gQWxsIG1lc3NhZ2VzIG1heSBiZSByZWNlaXZlZCBieSBkZWZhdWx0IC0tPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ic2lnbmFsIi8+CisKKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byB0YWxrIHRvIHRoZSBtZXNzYWdlIGJ1cyAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiLz4KKyAgICA8IS0tIEJ1dCBkaXNhbGxvdyBzb21lIHNwZWNpZmljIGJ1cyBzZXJ2aWNlcyAtLT4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9tZW1iZXI9IlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIvPgorCisgICAgPCEtLSBTcGVjaWZpYyB0byB0aGUgdGVzdCBzdWl0ZSAtLT4KKyAgICA8YWxsb3cgb3duPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIvPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi8+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIKKyAgICAgICAgICAgc2VuZF9tZW1iZXI9IkVtaXRGb28iLz4KKyAgPC9wb2xpY3k+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICAgPGFsbG93IG93bj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLz4KKyAgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi8+CisgICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIKKyAgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIgorICAgICAgICAgICAgc2VuZF9tZW1iZXI9IkVtaXRGb28iLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBGb3IgdGhlIHNlc3Npb24gYnVzLCBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWxhdGl2ZWx5LWxvdyBsaW1pdHMgCisgICAgICAgd2l0aCBlc3NlbnRpYWxseSBpbmZpbml0ZSBsaW1pdHMsIHNpbmNlIHRoZSBidXMgaXMganVzdCBydW5uaW5nIAorICAgICAgIGFzIHRoZSB1c2VyIGFueXdheSwgdXNpbmcgdXAgYnVzIHJlc291cmNlcyBpcyBub3Qgc29tZXRoaW5nIHdlIG5lZWQgCisgICAgICAgdG8gd29ycnkgYWJvdXQuIEluIHNvbWUgY2FzZXMsIHdlIGRvIHNldCB0aGUgbGltaXRzIGxvd2VyIHRoYW4gCisgICAgICAgImFsbCBhdmFpbGFibGUgbWVtb3J5IiBpZiBleGNlZWRpbmcgdGhlIGxpbWl0IGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBidWcsIAorICAgICAgIGhhdmluZyB0aGUgYnVzIGVuZm9yY2UgYSBsaW1pdCBpcyBuaWNlciB0aGFuIGEgaHVnZSBtZW1vcnkgbGVhay4gQnV0IHRoZSAKKyAgICAgICBpbnRlbnQgaXMgdGhhdCB0aGVzZSBsaW1pdHMgc2hvdWxkIG5ldmVyIGJlIGhpdC4gLS0+CisKKyAgPCEtLSB0aGUgbWVtb3J5IGxpbWl0cyBhcmUgMUcgaW5zdGVhZCBvZiBzYXkgNEcgYmVjYXVzZSB0aGV5IGNhbid0IGV4Y2VlZCAzMi1iaXQgc2lnbmVkIGludCBtYXggLS0+CisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX2J5dGVzIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij4xMjAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjI0MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj4xMDAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj4xMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiPjEwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0icmVwbHlfdGltZW91dCI+MzAwMDAwPC9saW1pdD4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L3JlbGF5LmMgYi90ZXN0L3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3NWMxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVsYXkuYwpAQCAtMCwwICsxLDMzMCBAQAorLyogUmVncmVzc2lvbiB0ZXN0IGZvciBwYXNzaW5nIHVubW9kaWZpZWQgbWVzc2FnZXMgYmV0d2VlbiBjb25uZWN0aW9ucworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisvKiBUaGlzIGlzIGJhc2ljYWxseSBhIG1pbmlhdHVyZSBkYnVzLWRhZW1vbi4gV2UgcmVsYXkgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50CisgKiBvbiB0aGUgbGVmdCB0byB0aGUgY2xpZW50IG9uIHRoZSByaWdodC4KKyAqCisgKiBsZWZ0ICAgICAgc29ja2V0ICAgICBsZWZ0ICAgICAgZGlzcGF0Y2ggICAgIHJpZ2h0ICAgIHNvY2tldCAgICAgcmlnaHQKKyAqIGNsaWVudCA9PT09PT09PT09PT4gIHNlcnZlciAtLS0tLS0tLS0tLS0tLT4gc2VydmVyID09PT09PT09PT09PiBjbGllbnQKKyAqIGNvbm4gICAgICAgICAgICAgICAgIGNvbm4gICAgICAgICAgICAgICAgICAgY29ubiAgICAgICAgICAgICAgICBjb25uCisgKgorICogSW4gdGhlIHJlYWwgZGJ1cy1kYWVtb24sIHRoZSBjbGllbnQgY29ubmVjdGlvbnMgd291bGQgYmUgb3V0LW9mLXByb2Nlc3MsCisgKiBidXQgaGVyZSB3ZSdyZSBjaGVhdGluZyBhbmQgZG9pbmcgZXZlcnl0aGluZyBpbi1wcm9jZXNzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKworICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2NsaWVudF9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X3NlcnZlcl9jb25uOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKnJpZ2h0X3NlcnZlcl9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpyaWdodF9jbGllbnRfY29ubjsKKyAgICAvKiBxdWV1ZSBvZiBEQnVzTWVzc2FnZSByZWNlaXZlZCBieSByaWdodF9jbGllbnRfY29ubiAqLworICAgIEdRdWV1ZSBtZXNzYWdlczsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzZXJ2ZXJfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChzZXJ2ZXJfY29ubiA9PSBmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uICE9IE5VTEwpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5yaWdodF9zZXJ2ZXJfY29ubiwgbWVzc2FnZSwgTlVMTCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CityaWdodF9jbGllbnRfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChjbGllbnRfY29ubiA9PSBmLT5yaWdodF9jbGllbnRfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+bWVzc2FnZXMsIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5fY2IgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworCisgIGlmIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgZi0+bGVmdF9zZXJ2ZXJfY29ubiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uKTsKKworICAgICAgaGF2ZV9tZW0gPSBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoc2VydmVyX2Nvbm4sCisgICAgICAgICAgc2VydmVyX21lc3NhZ2VfY2IsIGYsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gPT0gTlVMTCk7CisgICAgICBmLT5yaWdodF9zZXJ2ZXJfY29ubiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uKTsKKyAgICB9CisKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIHNlcnZlcl9jb25uKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBmLT5jdHggPSB0ZXN0X21haW5fY29udGV4dF9nZXQgKCk7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworICBnX3F1ZXVlX2luaXQgKCZmLT5tZXNzYWdlcyk7CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICgidGNwOmhvc3Q9MTI3LjAuMC4xIiwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnNlcnZlciAhPSBOVUxMKTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnNlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+c2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29ubmVjdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisgIGNoYXIgKmFkZHJlc3M7CisKKyAgZ19hc3NlcnQgKGYtPmxlZnRfc2VydmVyX2Nvbm4gPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChmLT5yaWdodF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKworICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGdfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworCisgIGYtPmxlZnRfY2xpZW50X2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChhZGRyZXNzLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+bGVmdF9jbGllbnRfY29ubiAhPSBOVUxMKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIGYtPmxlZnRfY2xpZW50X2Nvbm4pOworCisgIHdoaWxlIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGYtPnJpZ2h0X2NsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworCisgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisKKyAgd2hpbGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJpZ2h0X2NsaWVudF9jb25uLAorICAgICAgcmlnaHRfY2xpZW50X21lc3NhZ2VfY2IsIGYsIE5VTEwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworfQorCitzdGF0aWMgZGJ1c191aW50MzJfdAorc2VuZF9vbmUgKEZpeHR1cmUgKmYsCisgICAgY29uc3QgY2hhciAqbWVtYmVyKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIERCdXNNZXNzYWdlICpvdXRnb2luZzsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsIG1lbWJlcik7CisgIGdfYXNzZXJ0IChvdXRnb2luZyAhPSBOVUxMKTsKKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZywgJnNlcmlhbCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7CisgIGdfYXNzZXJ0IChzZXJpYWwgIT0gMCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7CisgIHJldHVybiBzZXJpYWw7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlbGF5IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKmluY29taW5nOworCisgIHRlc3RfY29ubmVjdCAoZiwgZGF0YSk7CisKKyAgc2VuZF9vbmUgKGYsICJGaXJzdCIpOworICBzZW5kX29uZSAoZiwgIlNlY29uZCIpOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcykgPCAyKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAyKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJGaXJzdCIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJTZWNvbmQiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7Cit9CisKKy8qIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFOWSA4MTkyCisKK3N0YXRpYyB2b2lkCit0ZXN0X2xpbWl0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKmluY29taW5nOworICBndWludCBpOworCisgIHRlc3RfY29ubmVjdCAoZiwgZGF0YSk7CisKKyAgLyogVGhpcyB3YXMgYW4gYXR0ZW1wdCB0byByZXByb2R1Y2UgZmQubyAjMzQzOTMuIEl0IGRpZG4ndCB3b3JrLiAqLworICBnX3Rlc3RfYnVnICgiMzQzOTMiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoZi0+bGVmdF9zZXJ2ZXJfY29ubiwgMSk7CisgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BTlk7IGkrKykKKyAgICB7CisgICAgICBnY2hhciAqYnVmID0gZ19zdHJkdXBfcHJpbnRmICgiTWVzc2FnZSV1IiwgaSk7CisKKyAgICAgIHNlbmRfb25lIChmLCBidWYpOworICAgICAgZ19mcmVlIChidWYpOworICAgIH0KKworICBpID0gMDsKKworICB3aGlsZSAoaSA8IE1BTlkpCisgICAgeworICAgICAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5tZXNzYWdlcykpCisgICAgICAgIHsKKyAgICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgICAgICB9CisKKyAgICAgIHdoaWxlICgoaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bWVzc2FnZXMpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhIEdfR05VQ19VTlVTRUQpCit7CisgIGlmIChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duKE5VTEwsIGYtPmxlZnRfY2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5sZWZ0X2NsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9jbGllbnRfY29ubik7CisgICAgICBmLT5sZWZ0X2NsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duKE5VTEwsIGYtPnJpZ2h0X2NsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yaWdodF9jbGllbnRfY29ubik7CisgICAgICBmLT5yaWdodF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5sZWZ0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duKE5VTEwsIGYtPmxlZnRfc2VydmVyX2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9zZXJ2ZXJfY29ubik7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJpZ2h0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duKE5VTEwsIGYtPnJpZ2h0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yaWdodF9zZXJ2ZXJfY29ubik7CisgICAgICBmLT5yaWdodF9zZXJ2ZXJfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZXJ2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGYtPnNlcnZlcik7CisgICAgICBmLT5zZXJ2ZXIgPSBOVUxMOworICAgIH0KKworICB0ZXN0X21haW5fY29udGV4dF91bnJlZiAoZi0+Y3R4KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcmVsYXkiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfcmVsYXksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9saW1pdCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9saW1pdCwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zZC1hY3RpdmF0aW9uLmMgYi90ZXN0L3NkLWFjdGl2YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ1MDEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zZC1hY3RpdmF0aW9uLmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qIFVuaXQgdGVzdHMgZm9yIHN5c3RlbWQgYWN0aXZhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBHRXJyb3IgKmdlOworCisgICAgZ2NoYXIgKmFkZHJlc3M7CisgICAgR1BpZCBkYWVtb25fcGlkOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNhbGxlcjsKKyAgICBjb25zdCBjaGFyICpjYWxsZXJfbmFtZTsKKyAgICBEQnVzQ29ubmVjdGlvbiAqc3lzdGVtZDsKKyAgICBjb25zdCBjaGFyICpzeXN0ZW1kX25hbWU7CisgICAgREJ1c01lc3NhZ2UgKnN5c3RlbWRfbWVzc2FnZTsKKyAgICBEQnVzQ29ubmVjdGlvbiAqYWN0aXZhdGVkOworICAgIGNvbnN0IGNoYXIgKmFjdGl2YXRlZF9uYW1lOworICAgIERCdXNNZXNzYWdlICphY3RpdmF0ZWRfbWVzc2FnZTsKK30gRml4dHVyZTsKKworLyogdGhpcyBpcyBhIG1hY3JvIHNvIGl0IGdldHMgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyICovCisjZGVmaW5lIGFzc2VydF9zaWduYWwobSwgXAorICAgIHNlbmRlciwgcGF0aCwgaWZhY2UsIG1lbWJlciwgc2lnbmF0dXJlLCBcCisgICAgZGVzdGluYXRpb24pIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgc2VuZGVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCA9PSwgZGVzdGluYXRpb24pOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIHBhdGgpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgaWZhY2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgbWVtYmVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sIHNpZ25hdHVyZSk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGFzc2VydF9tZXRob2RfY2FsbChtLCBzZW5kZXIsIFwKKyAgICBkZXN0aW5hdGlvbiwgcGF0aCwgaWZhY2UsIG1ldGhvZCwgc2lnbmF0dXJlKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgc2VuZGVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCA9PSwgZGVzdGluYXRpb24pOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIHBhdGgpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgaWZhY2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgbWV0aG9kKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sIHNpZ25hdHVyZSk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGFzc2VydF9tZXRob2RfcmVwbHkobSwgc2VuZGVyLCBkZXN0aW5hdGlvbiwgc2lnbmF0dXJlKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc3lzdGVtZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVBY3F1aXJlZCIpIHx8CisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUxvc3QiKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGdfdGVzdF9tZXNzYWdlKCJzZW5kZXIgJXMgaWZhY2UgJXMgbWVtYmVyICVzIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisKKworICBnX2Fzc2VydCAoZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLk1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0RW52aXJvbm1lbnQiKSkKKyAgICB7CisgICAgICBnX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkpOworICAgICAgZ190ZXN0X21lc3NhZ2UoImdvdCBjYWxsIik7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYWN0aXZhdGVkX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUFjcXVpcmVkIikgfHwKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lTG9zdCIpKQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgZ19hc3NlcnQgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpOworICBmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCBHX0dOVUNfVU5VU0VEKQoreworICBmLT5jdHggPSB0ZXN0X21haW5fY29udGV4dF9nZXQgKCk7CisKKyAgZi0+Z2UgPSBOVUxMOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworICBmLT5hZGRyZXNzID0gdGVzdF9nZXRfZGJ1c19kYWVtb24gKAorICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW1kLWFjdGl2YXRpb24uY29uZiIsCisgICAgICBURVNUX1VTRVJfTUUsICZmLT5kYWVtb25fcGlkKTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmLT5jYWxsZXIgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBmLT5jYWxsZXJfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+Y2FsbGVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rha2Vfd2VsbF9rbm93bl9uYW1lIChGaXh0dXJlICpmLAorICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGludCByZXQ7CisKKyAgcmV0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCBuYW1lLAorICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFLCAmZi0+ZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0LCA9PSwgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2FjdGl2YXRpb24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMSIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIikpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+Y2FsbGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgZmFrZSBzeXN0ZW1kIGNvbm5lY3RzIHRvIHRoZSBidXMuICovCisgIGYtPnN5c3RlbWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5zeXN0ZW1kLCBzeXN0ZW1kX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBmLT5zeXN0ZW1kX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnN5c3RlbWQpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+c3lzdGVtZCwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworCisgIC8qIEl0IGdldHMgaXRzIGFjdGl2YXRpb24gcmVxdWVzdC4gKi8KKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogc3lzdGVtZCBzdGFydHMgdGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UuICovCisgIGYtPmFjdGl2YXRlZCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPmFjdGl2YXRlZCwgYWN0aXZhdGVkX2ZpbHRlciwKKyAgICAgICAgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBmLT5hY3RpdmF0ZWRfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+YWN0aXZhdGVkKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEiKTsKKworICAvKiBUaGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UuICovCisgIHdoaWxlIChmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPmFjdGl2YXRlZF9tZXNzYWdlOworICBmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPmNhbGxlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwxIiwgIiIsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBzZW5kZXIgc2VuZHMgYSBtZXNzYWdlIHRvIGEgZGlmZmVyZW50IGFjdGl2YXRhYmxlIHNlcnZpY2UuICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIiKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jYWxsZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoaXMgdGltZSBzeXN0ZW1kIGlzIGFscmVhZHkgcmVhZHkgZm9yIGl0LiAqLworICB3aGlsZSAoZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+c3lzdGVtZF9tZXNzYWdlOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBOVUxMOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uUmVxdWVzdCIsICJzIiwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBBIG1hbGljaW91cyBwcm9jZXNzIHRyaWVzIHRvIGRpc3J1cHQgdGhlIGFjdGl2YXRpb24uCisgICAqIEluIGEgbW9yZSByZWFsaXN0aWMgc2NlbmFyaW8gdGhpcyB3b3VsZCBiZSBhbm90aGVyIHBhcmFsbGVsCisgICAqIGNvbm5lY3Rpb24uICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9vcmcvZnJlZWRlc2t0b3Avc3lzdGVtZDEiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvbkZhaWx1cmUiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMiKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZG8KKyAgICB7CisgICAgICBjb25zdCBjaGFyICp1bml0ID0gImRidXMtY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMi5zZXJ2aWNlIjsKKyAgICAgIGNvbnN0IGNoYXIgKmVycm9yX25hbWUgPSAiY29tLmV4YW1wbGUuTWFsaWNlIjsKKyAgICAgIGNvbnN0IGNoYXIgKmVycm9yX21lc3NhZ2UgPSAiSSdtIG9uIHlyIGJ1cywgbWFraW5nIHlyIGFjdGl2YXRpb25zIGZhaWwiOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ1bml0LAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVycm9yX25hbWUsCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZXJyb3JfbWVzc2FnZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworICAgIH0KKyAgd2hpbGUgKDApOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jYWxsZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoaXMgaXMganVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWFsaWNpb3VzIG1lc3NhZ2UgaGFzIGFycml2ZWQgYW5kCisgICAqIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBkYnVzLWRhZW1vbiwgaS5lLiBAY2FsbGVyIHdvbiB0aGUgcmFjZQorICAgKiB3aXRoIEBhY3RpdmF0ZWQuICovCisgIHRha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5jYWxsZXIsICJjb20uZXhhbXBsZS5TeW5jIik7CisKKyAgLyogVGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UgdGFrZXMgaXRzIG5hbWUuIEhlcmUgSSdtIGZha2luZyBpdCBieSB1c2luZworICAgKiBhbiBleGlzdGluZyBjb25uZWN0aW9uOyBpbiByZWFsIGxpZmUgaXQgd291bGQgYmUgeWV0IGFub3RoZXIKKyAgICogY29ubmVjdGlvbi4gKi8KKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIiKTsKKworICAvKiBUaGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UuICovCisgIHdoaWxlIChmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPmFjdGl2YXRlZF9tZXNzYWdlOworICBmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPmNhbGxlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwyIiwgIiIsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIEEgdGhpcmQgYWN0aXZhdGlvbi4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmNhbGxlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIGFjdGl2YXRpb24gZmFpbHMgKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uRmFpbHVyZSIpOworCisgIGRvCisgICAgeworICAgICAgY29uc3QgY2hhciAqdW5pdCA9ICJkYnVzLWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZSI7CisgICAgICBjb25zdCBjaGFyICplcnJvcl9uYW1lID0gImNvbS5leGFtcGxlLk5vcGUiOworICAgICAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICJDb21wdXRlciBzYXlzIG5vIjsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pdCwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlcnJvcl9uYW1lLAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVycm9yX21lc3NhZ2UsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgICB9CisgIHdoaWxlICgwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnN5c3RlbWQsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworfQorCitzdGF0aWMgdm9pZAordGVzdF91YWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlciwgYXJyX2l0ZXIsIGVudHJ5X2l0ZXI7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKyAgLyogQXBwZW5kIGFuIGVtcHR5IGF7c3N9IChzdHJpbmcgPT4gc3RyaW5nIGRpY3Rpb25hcnkpLiAqLworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICJ7c3N9IiwgJmFycl9pdGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgJmFycl9pdGVyKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5jYWxsZXIsIG0sICZwYywKKyAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fCBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBhc3NlcnRfbWV0aG9kX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+Y2FsbGVyX25hbWUsICIiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgZmFrZSBzeXN0ZW1kIGNvbm5lY3RzIHRvIHRoZSBidXMuICovCisgIGYtPnN5c3RlbWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5zeXN0ZW1kLCBzeXN0ZW1kX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBmLT5zeXN0ZW1kX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnN5c3RlbWQpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+c3lzdGVtZCwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworCisgIC8qIEl0IGdldHMgdGhlIFNldEVudmlyb25tZW50ICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisKKyAgLyogV2l0aCBhY3RpdmF0aW9uLCB0aGUgZGVzdGluYXRpb24gaXMgdGhlIHdlbGwta25vd24gbmFtZSAqLworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIiwKKyAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxIiwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5NYW5hZ2VyIiwKKyAgICAgICJTZXRFbnZpcm9ubWVudCIsICJhcyIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG0sICZhcmdzX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9BUlJBWSk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJnc19pdGVyKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmYXJnc19pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKworICB7CisgICAgY29uc3QgY2hhciAqazEgPSAiS2V5MSIsICp2MSA9ICJWYWx1ZTEiLAorICAgICAgICAgICAgICAgKmsyID0gIktleTIiLCAqdjIgPSAiVmFsdWUyIjsKKworICAgIC8qIEFwcGVuZCBhIGZpbGxlZCBhe3NzfSAoc3RyaW5nID0+IHN0cmluZyBkaWN0aW9uYXJ5KS4gKi8KKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgIntzc30iLCAmYXJyX2l0ZXIpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycl9pdGVyLCBEQlVTX1RZUEVfRElDVF9FTlRSWSwKKyAgICAgICAgICBOVUxMLCAmZW50cnlfaXRlcikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmVudHJ5X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgJmsxKSB8fAorICAgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAmdjEpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJfaXRlciwgJmVudHJ5X2l0ZXIpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycl9pdGVyLCBEQlVTX1RZUEVfRElDVF9FTlRSWSwKKyAgICAgICAgICBOVUxMLCAmZW50cnlfaXRlcikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmVudHJ5X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgJmsyKSB8fAorICAgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAmdjIpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJfaXRlciwgJmVudHJ5X2l0ZXIpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcmdzX2l0ZXIsICZhcnJfaXRlcikpCisgICAgICBnX2Vycm9yICgiT09NIik7CisgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmNhbGxlciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8IHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGFzc2VydF9tZXRob2RfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5jYWxsZXJfbmFtZSwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisKKyAgLyogV2l0aG91dCBhY3RpdmF0aW9uLCB0aGUgZGVzdGluYXRpb24gaXMgdGhlIHVuaXF1ZSBuYW1lICovCisgIGFzc2VydF9tZXRob2RfY2FsbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnN5c3RlbWRfbmFtZSwKKyAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxIiwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5NYW5hZ2VyIiwKKyAgICAgICJTZXRFbnZpcm9ubWVudCIsICJhcyIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG0sICZhcmdzX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9BUlJBWSk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgREJVU19UWVBFX1NUUklORyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJmFycl9pdGVyLCAmcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAocywgPT0sICJLZXkxPVZhbHVlMSIpOworICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgREJVU19UWVBFX1NUUklORyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJmFycl9pdGVyLCAmcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAocywgPT0sICJLZXkyPVZhbHVlMiIpOworICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJnc19pdGVyKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmYXJnc19pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7CisgIGdfY2xlYXJfZXJyb3IgKCZmLT5nZSk7CisKKyAgaWYgKGYtPmNhbGxlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+Y2FsbGVyKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+Y2FsbGVyKTsKKyAgICAgIGYtPmNhbGxlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zeXN0ZW1kICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnN5c3RlbWQsIHN5c3RlbWRfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+c3lzdGVtZCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnN5c3RlbWQpOworICAgICAgZi0+c3lzdGVtZCA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5hY3RpdmF0ZWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+YWN0aXZhdGVkLCBhY3RpdmF0ZWRfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+YWN0aXZhdGVkKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+YWN0aXZhdGVkKTsKKyAgICAgIGYtPmFjdGl2YXRlZCA9IE5VTEw7CisgICAgfQorCisgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICBnX3NwYXduX2Nsb3NlX3BpZCAoZi0+ZGFlbW9uX3BpZCk7CisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworICBnX2ZyZWUgKGYtPmFkZHJlc3MpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgZ190ZXN0X2FkZCAoIi9zZC1hY3RpdmF0aW9uL2FjdGl2YXRpb24iLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfYWN0aXZhdGlvbiwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3NkLWFjdGl2YXRpb24vdWFlIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X3VhZSwgdGVhcmRvd24pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC10ZXN0LmMgYi90ZXN0L3NoZWxsLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTI4MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC10ZXN0LmMKQEAgLTAsMCArMSwxNzAgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGVsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitzdGF0aWMgaW50IHRlc3RfbnVtID0gMDsKK3N0YXRpYyBpbnQgbnVtX2ZhaWxlZCA9IDA7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9jb21tYW5kX2xpbmVfaW50ZXJuYWwgKGRidXNfYm9vbF90IHNob3VsZF93b3JrLAorICAgIGNvbnN0IGNoYXIgKmFyZzEsCisgICAgdmFfbGlzdCB2YXJfYXJncykKK3sKKyAgaW50IGksIG9yaWdpbmFsX2FyZ2MsIHNoZWxsX2FyZ2M7CisgIGNoYXIgKipzaGVsbF9hcmd2OworICBjaGFyICoqb3JpZ2luYWxfYXJndjsKKyAgY2hhciAqY29tbWFuZF9saW5lLCAqdG1wOworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c0xpc3QgKmxpc3QgPSBOVUxMLCAqbm9kZTsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdCwgKGNoYXIgKilhcmcxKTsKKyAgZG8KKyAgICB7CisgICAgICB0bXAgPSB2YV9hcmcgKHZhcl9hcmdzLCBjaGFyICopOworICAgICAgaWYgKCF0bXApCisgICAgICAgIGJyZWFrOworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0LCB0bXApOworICAgIH0gd2hpbGUgKHRtcCk7CisKKyAgb3JpZ2luYWxfYXJnYyA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QpOworICBvcmlnaW5hbF9hcmd2ID0gZGJ1c19uZXcgKGNoYXIgKiwgb3JpZ2luYWxfYXJnYyk7CisgIF9kYnVzX3N0cmluZ19pbml0ICgmc3RyKTsKKyAgZm9yIChpID0gMCwgbm9kZSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsgaSA8IG9yaWdpbmFsX2FyZ2MgJiYgbm9kZTsKKyAgICAgICBpKyssIG5vZGUgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LCBub2RlKSkKKyAgICB7CisgICAgICBvcmlnaW5hbF9hcmd2W2ldID0gbm9kZS0+ZGF0YTsKKyAgICAgIGlmIChpID4gMCkKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnICcpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgb3JpZ2luYWxfYXJndltpXSk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QpOworICBjb21tYW5kX2xpbmUgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpOworICBwcmludGYgKCIjIFRlc3RpbmcgY29tbWFuZCBsaW5lICclcydcbiIsIGNvbW1hbmRfbGluZSk7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBpZiAoIV9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGNvbW1hbmRfbGluZSwgJnNoZWxsX2FyZ2MsICZzaGVsbF9hcmd2LCAmZXJyb3IpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiMgRXJyb3IlcyBwYXJzaW5nIGNvbW1hbmQgbGluZTogJXNcbiIsCisgICAgICAgICAgc2hvdWxkX3dvcmsgPyAiIiA6ICIgKGFzIGV4cGVjdGVkKSIsCisgICAgICAgICAgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAiIik7CisgICAgICBkYnVzX2ZyZWUgKG9yaWdpbmFsX2FyZ3YpOworICAgICAgcmV0dXJuICFzaG91bGRfd29yazsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2hlbGxfYXJnYyAhPSBvcmlnaW5hbF9hcmdjKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiIyBOdW1iZXIgb2YgYXJndW1lbnRzIHJldHVybmVkICglZCkgZG9uJ3QgbWF0Y2ggb3JpZ2luYWwgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIHNoZWxsX2FyZ2MsIG9yaWdpbmFsX2FyZ2MpOworICAgICAgICAgIGRidXNfZnJlZSAob3JpZ2luYWxfYXJndik7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2hlbGxfYXJndik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9IAorICAgICAgcHJpbnRmICgiIyBOdW1iZXIgb2YgYXJndW1lbnRzOiAlZFxuIiwgc2hlbGxfYXJnYyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2hlbGxfYXJnYzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqdW5xdW90ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgdW5xdW90ZWQgPSBfZGJ1c19zaGVsbF91bnF1b3RlIChvcmlnaW5hbF9hcmd2W2ldKTsKKyAgICAgICAgICBpZiAoc3RyY21wICh1bnF1b3RlZCA/IHVucXVvdGVkIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgc2hlbGxfYXJndltpXSA/IHNoZWxsX2FyZ3ZbaV0gOiAiIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlBvc2l0aW9uICVkLCByZXR1cm5lZCBhcmd1bWVudCAoJXMpIGRvZXMgbm90IG1hdGNoIG9yaWdpbmFsICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaSwgc2hlbGxfYXJndltpXSwgdW5xdW90ZWQpOworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChvcmlnaW5hbF9hcmd2KTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2hlbGxfYXJndik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgICAgICBpZiAoc2hlbGxfYXJndltpXSkKKyAgICAgICAgICAgIHByaW50ZiAoIkFyZ3VtZW50ICVkID0gJXNcbiIsIGksIHNoZWxsX2FyZ3ZbaV0pOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNoZWxsX2FyZ3YpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIGRidXNfZnJlZSAob3JpZ2luYWxfYXJndik7CisKKyAgaWYgKCFzaG91bGRfd29yaykKKyAgICB7CisgICAgICBwcmludGYgKCIjIEV4cGVjdGVkIGFuIGVycm9yXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqYXJnMSwgLi4uKQoreworICB2YV9saXN0IHZhcl9hcmdzOworCisgIHZhX3N0YXJ0ICh2YXJfYXJncywgYXJnMSk7CisKKyAgaWYgKHRlc3RfY29tbWFuZF9saW5lX2ludGVybmFsIChUUlVFLCBhcmcxLCB2YXJfYXJncykpCisgICAgeworICAgICAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIm5vdCBvayAlZFxuIiwgKyt0ZXN0X251bSk7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorCisgIHZhX2VuZCAodmFyX2FyZ3MpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb21tYW5kX2xpbmVfZmFpbHMgKGNvbnN0IGNoYXIgKmFyZzEsIC4uLikKK3sKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGFyZzEpOworCisgIGlmICh0ZXN0X2NvbW1hbmRfbGluZV9pbnRlcm5hbCAoRkFMU0UsIGFyZzEsIHZhcl9hcmdzKSkKKyAgICB7CisgICAgICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgibm90IG9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisKKyAgdmFfZW5kICh2YXJfYXJncyk7Cit9CisKKy8qIFRoaXMgdGVzdCBvdXRwdXRzIFRBUCBzeW50YXg6IGh0dHA6Ly90ZXN0YW55dGhpbmcub3JnLyAqLworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfY29tbWFuZF9saW5lICgiY29tbWFuZCIsICItcyIsICItLWZvcmNlLXNodXRkb3duIiwgIlwiYSBzdHJpbmdcIiIsICIxMjMiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJjb21tYW5kIiwgIi1zIiwgTlVMTCk7CisgIHRlc3RfY29tbWFuZF9saW5lICgiL29wdC9nbm9tZS9iaW4vc2VydmljZS1zdGFydCIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoImdyZXAiLCAiLWwiLCAiLXIiLCAiLWkiLCAiJ3doYXRldmVyJyIsICJmaWxlcyouYyIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoIi9ob21lL2Jvc3Rvbi9qb2hucC9kZXZlbC1sb2NhbC9kYnVzL3Rlc3QvdGVzdC1zZWdmYXVsdCIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoImxzIiwgIi1sIiwgIi1hIiwgIi0tY29sb3JzIiwgX2RidXNfZ2V0X3RtcGRpcigpLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJyc3luYy10by1zZXJ2ZXIiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJ0ZXN0LXNlZ2ZhdWx0IiwgIi0tbm8tc2VnZmF1bHQiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJldm9sdXRpb24iLCAibWFpbHRvOnBlcGVAY3Vjby5jb20iLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJydW4iLCAiXCJhIFxuIG11bHRpbGluZVwiIiwgTlVMTCk7CisgIHRlc3RfY29tbWFuZF9saW5lX2ZhaWxzICgibHMiLCAiXCJhIHdyb25nIHN0cmluZyciLCBOVUxMKTsKKworICAvKiBUZWxsIHRoZSBUQVAgZHJpdmVyIHRoYXQgd2UgaGF2ZSBkb25lIGFsbCB0aGUgdGVzdHMgd2UgcGxhbiB0byBkby4KKyAgICogVGhpcyBpcyBob3cgaXQgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4gdW5leHBlY3RlZCBleGl0IGFuZAorICAgKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICovCisgIHByaW50ZiAoIjEuLiVkXG4iLCB0ZXN0X251bSk7CisKKyAgcmV0dXJuIChudW1fZmFpbGVkICE9IDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGF3bi10ZXN0LmMgYi90ZXN0L3NwYXduLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQzN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGF3bi10ZXN0LmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3Bhd24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAorc2V0dXBfZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgcHJpbnRmICgiZW50ZXJpbmcgc2V0dXAgZnVuYy5cbiIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY2hhciAqKmFyZ3ZfY29weTsKKyAgaW50IGk7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgCisgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJZb3UgbmVlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0byBsYXVuY2guXG4iKTsKKworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBhcmd2X2NvcHkgPSBkYnVzX25ldyAoY2hhciAqLCBhcmdjKTsKKyAgZm9yIChpID0gMDsgaSA8IGFyZ2MgLSAxOyBpKyspCisgICAgYXJndl9jb3B5IFtpXSA9IGFyZ3ZbaSArIDFdOworICBhcmd2X2NvcHlbYXJnYyAtIDFdID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyIChOVUxMLCBhcmd2X2NvcHlbMF0sIGFyZ3ZfY29weSwgTlVMTCwgc2V0dXBfZnVuYywgTlVMTCwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbGF1bmNoIGFwcGxpY2F0aW9uOiBcIiVzXCJcbiIsCisJICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgIH0KKworICBkYnVzX2ZyZWUoYXJndl9jb3B5KTsKKyAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N5bnRheC5jIGIvdGVzdC9zeW50YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk2MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zeW50YXguYwpAQCAtMCwwICsxLDI5MyBAQAorLyogU2ltcGxlIHNhbml0eS1jaGVjayBmb3IgRC1CdXMgc3ludGF4IHZhbGlkYXRpb24uCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEQnVzRXJyb3IgZTsKK30gRml4dHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRidXNfYm9vbF90ICgqZnVuY3Rpb24pIChjb25zdCBjaGFyICosIERCdXNFcnJvciAqKTsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKiB2YWxpZDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKiBpbnZhbGlkOworfSBUZXN0OworCitUZXN0IHBhdGhzLCBpbnRlcmZhY2VzLCBtZW1iZXJzLCBlcnJvcnMsIGJ1c19uYW1lcywgc2lnbmF0dXJlcywKKyAgICAgc2luZ2xlX3NpZ25hdHVyZXMsIHN0cmluZ3M7CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9wYXRoc1tdID0geworICAgICIvIiwKKyAgICAiL2EiLAorICAgICIvXyIsCisgICAgIi9hL2IvYyIsCisgICAgIi9jb20vZXhhbXBsZS8xMjMiLAorICAgICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMiLAorICAgICIvb3JnL2ZyZWVkZXNrdG9wL1RlbGVwYXRoeS9BY2NvdW50TWFuYWdlciIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfcGF0aHNbXSA9IHsKKyAgICAiIiwKKyAgICAiLiIsCisgICAgIi8vIiwKKyAgICAiL2EvIiwKKyAgICAiLy0iLAorICAgICIvY29tLy9leGFtcGxlL015QXBwIiwKKyAgICAiLyQiLAorICAgICIvXHhhOSIsICAgICAgLyogwqkgaW4gbGF0aW4tMSAqLworICAgICIvXHhjMlx4YTkiLCAgLyogwqkgaW4gVVRGLTggKi8KKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICJjb20uZXhhbXBsZSIsCisgICAgImNvbS5leGFtcGxlLmEwIiwKKyAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX2ludGVyZmFjZXNbXSA9IHsKKyAgICIiLAorICAgICJjb20iLAorICAgICJjb20uZXhhbXBsZS4iLAorICAgICJjb20uZXhhbXBsZS4uYTAiLAorICAgICJjb20uZXhhbXBsZS4wYSIsCisgICAgImNvbS5leGFtcGxlLmEkIiwKKyAgICAiY29tLmV4YW1wbGUuYVx4YTkiLAorICAgICJjb20uZXhhbXBsZS5hXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIl8iLAorICAgICJhIiwKKyAgICAiYTAiLAorICAgICJHZXRBbGwiLAorICAgICJCYWRnZXJNdXNocm9vbVNuYWtlIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIiIsCisgICAgIi0iLAorICAgICJhLSIsCisgICAgIjAiLAorICAgICIwXyIsCisgICAgIkJhZGdlci5NdXNocm9vbSIsCisgICAgImEkIiwKKyAgICAiYVx4YTkiLAorICAgICJhXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9lcnJvcnNbXSA9IHsKKyAgICAiY29tLmV4YW1wbGUiLAorICAgICJjb20uZXhhbXBsZS5hMCIsCisgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVIYXNOb093bmVyIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9lcnJvcnNbXSA9IHsKKyAgICIiLAorICAgICJjb20iLAorICAgICJjb20uZXhhbXBsZS4iLAorICAgICJjb20uZXhhbXBsZS4uYTAiLAorICAgICJjb20uZXhhbXBsZS4wYSIsCisgICAgImNvbS5leGFtcGxlLmEkIiwKKyAgICAiY29tLmV4YW1wbGUuYVx4YTkiLAorICAgICJjb20uZXhhbXBsZS5hXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9idXNfbmFtZXNbXSA9IHsKKyAgICAiY29tLmV4YW1wbGUiLAorICAgICJjb20uZXhhbXBsZS5hMCIsCisgICAgImNvbS5leGFtcGxlLl8iLAorICAgICI6MS40MiIsCisgICAgIjoxLjIuMy40LjUiLAorICAgICI6Y29tLmV4YW1wbGUiLAorICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfYnVzX25hbWVzW10gPSB7CisgICAiIiwKKyAgICAiY29tIiwKKyAgICAiY29tLmV4YW1wbGUuIiwKKyAgICAiY29tLmV4YW1wbGUuLmEwIiwKKyAgICAiY29tLmV4YW1wbGUuMGEiLAorICAgICJjb20uZXhhbXBsZS5hOmIiLAorICAgICJjb20uZXhhbXBsZS5hXHhhOSIsCisgICAgImNvbS5leGFtcGxlLmFceGMyXHhhOSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiIiwKKyAgICAiYXtzdn0iLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiYSIsCisgICAgImF7c199IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfc2luZ2xlX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAicyIsCisgICAgImF7c3Z9IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9zaW5nbGVfc2lnbmF0dXJlc1tdID0geworICAgICIiLAorICAgICJhIiwKKyAgICAic3YiLAorICAgICJhe3N2fWFzIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfc3RyaW5nc1tdID0geworICAgICIiLAorICAgICJceGMyXHhhOSIsICAgICAgIC8qIFVURi04IChjKSBzeW1ib2wgKi8KKyAgICAiXHhlZlx4YmZceGJlIiwgICAvKiBVK0ZGRkUgaXMgcmVzZXJ2ZWQgYnV0IENvcnJpZ2VuZHVtIDkgc2F5cyBpdCdzIE9LICovCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfc3RyaW5nc1tdID0geworICAgICJceGE5IiwgICAgICAgICAgIC8qIExhdGluLTEgKGMpIHN5bWJvbCAqLworICAgICJceGVkXHhhMFx4ODAiLCAgIC8qIFVURi0xNiBzdXJyb2dhdGVzIGFyZSBub3QgdmFsaWQgaW4gVVRGLTggKi8KKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyNkZWZpbmUgRklMTF9URVNUKG5hbWUsIGZ1bmMpIFwKKyAgZG8geyBcCisgICAgKG5hbWUpLmZ1bmN0aW9uID0gKGZ1bmMpOyBcCisgICAgKG5hbWUpLnZhbGlkID0gdmFsaWRfICMjIG5hbWU7IFwKKyAgICAobmFtZSkuaW52YWxpZCA9IGludmFsaWRfICMjIG5hbWU7IFwKKyAgfSB3aGlsZSAoMCkKKworICBGSUxMX1RFU1QgKHBhdGhzLCBkYnVzX3ZhbGlkYXRlX3BhdGgpOworICBGSUxMX1RFU1QgKGludGVyZmFjZXMsIGRidXNfdmFsaWRhdGVfaW50ZXJmYWNlKTsKKyAgRklMTF9URVNUIChtZW1iZXJzLCBkYnVzX3ZhbGlkYXRlX21lbWJlcik7CisgIEZJTExfVEVTVCAoZXJyb3JzLCBkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUpOworICBGSUxMX1RFU1QgKGJ1c19uYW1lcywgZGJ1c192YWxpZGF0ZV9idXNfbmFtZSk7CisgIEZJTExfVEVTVCAoc2lnbmF0dXJlcywgZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUpOworICBGSUxMX1RFU1QgKHNpbmdsZV9zaWduYXR1cmVzLCBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUpOworICBGSUxMX1RFU1QgKHN0cmluZ3MsIGRidXNfdmFsaWRhdGVfdXRmOCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N5bnRheCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZykKK3sKKyAgY29uc3QgVGVzdCAqdGVzdCA9IGFyZzsKKyAgaW50IGk7CisKKyAgZ19hc3NlcnQgKHRlc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0ZXN0LT5mdW5jdGlvbiAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRlc3QtPnZhbGlkICE9IE5VTEwpOworICBnX2Fzc2VydCAodGVzdC0+aW52YWxpZCAhPSBOVUxMKTsKKworICBmb3IgKGkgPSAwOyB0ZXN0LT52YWxpZFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZGJ1c19ib29sX3Qgb2sgPSB0ZXN0LT5mdW5jdGlvbiAodGVzdC0+dmFsaWRbaV0sICZmLT5lKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZi0+ZSkpCisgICAgICAgIGdfZXJyb3IgKCIlcyB3YXMgY29uc2lkZXJlZCBpbnZhbGlkOiAlczogJXMiLCB0ZXN0LT52YWxpZFtpXSwKKyAgICAgICAgICAgIGYtPmUubmFtZSwgZi0+ZS5tZXNzYWdlKTsKKworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ19lcnJvciAoIiVzIHdhcyBjb25zaWRlcmVkIGludmFsaWQgd2l0aG91dCBhbiBlcnJvciIsIHRlc3QtPnZhbGlkW2ldKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgdGVzdC0+aW52YWxpZFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZGJ1c19ib29sX3Qgb2sgPSB0ZXN0LT5mdW5jdGlvbiAodGVzdC0+aW52YWxpZFtpXSwgJmYtPmUpOworCisgICAgICBpZiAob2spCisgICAgICAgIGdfZXJyb3IgKCIlcyBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQgaW52YWxpZCIsIHRlc3QtPmludmFsaWRbaV0pOworCisgICAgICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZi0+ZSkpCisgICAgICAgIGdfZXJyb3IgKCIlcyBzaG91bGQgaGF2ZSBhbiBlcnJvciBzZXQiLCB0ZXN0LT5pbnZhbGlkW2ldKTsKKworICAgICAgaWYgKCFkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKGYtPmUubmFtZSwgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCIlcyBwcm9kdWNlZCBhbiBpbnZhbGlkIGVycm9yIG5hbWU6ICVzIiwKKyAgICAgICAgICAgIHRlc3QtPmludmFsaWRbaV0sIGYtPmUubmFtZSk7CisKKyAgICAgIGlmICghZGJ1c192YWxpZGF0ZV91dGY4IChmLT5lLm1lc3NhZ2UsIE5VTEwpKQorICAgICAgICBnX2Vycm9yICgiJXMgcHJvZHVjZWQgYW4gaW52YWxpZCBlcnJvciBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgICB0ZXN0LT5pbnZhbGlkW2ldLCBmLT5lLm1lc3NhZ2UpOworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZyBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3BhdGgiLCBGaXh0dXJlLCAmcGF0aHMsIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9pbnRlcmZhY2UiLCBGaXh0dXJlLCAmaW50ZXJmYWNlcywKKyAgICAgIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9lcnJvciIsIEZpeHR1cmUsICZlcnJvcnMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvbWVtYmVyIiwgRml4dHVyZSwgJm1lbWJlcnMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvYnVzLW5hbWUiLCBGaXh0dXJlLCAmYnVzX25hbWVzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3NpZ25hdHVyZSIsIEZpeHR1cmUsICZzaWduYXR1cmVzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3NpbmdsZS1zaWduYXR1cmUiLCBGaXh0dXJlLCAmc2luZ2xlX3NpZ25hdHVyZXMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvdXRmOCIsIEZpeHR1cmUsICZzdHJpbmdzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3RhcC10ZXN0LnNoLmluIGIvdGVzdC90YXAtdGVzdC5zaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNjZGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90YXAtdGVzdC5zaC5pbgpAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKworIyBXcmFwcGVyIHRvIG1ha2UgYW4gQXV0b21ha2Utc3R5bGUgdGVzdCBvdXRwdXQgVEFQIHN5bnRheDoKKyMKKyMgLSBhcmJpdHJhcnkgc3Rkb3V0L3N0ZGVyciBpcyBzZW50IHRvIHN0ZGVyciB3aGVyZSBpdCB3aWxsIG5vdCBiZQorIyAgIGludGVycHJldGVkIGFzIFRBUAorIyAtIGl0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdGVzdC1jYXNlCisjIC0gZXhpdCA3NyBpcyBhIHNraXAKKyMgLSBleGl0IDAgaXMgYSBwYXNzCisjIC0gYW55dGhpbmcgZWxzZSBpcyBhIGZhaWx1cmUKKyMKKyMgVXNhZ2U6IHVzZSBzZWQgdG8gcmVwbGFjZSBAUlVOQCB3aXRoIHRoZSBzaGVsbCBjb21tYW5kLWxpbmUgdG8gYmUgcnVuLgorCitzZXQgLWUKKworIyB3ZSBwbGFuIHRvIGRvIDEgdGVzdC1jYXNlCitlY2hvICIxLi4xIgorCitlPTAKK0BSVU5AID4mMiB8fCBlPSQ/CisKK2Nhc2UgIiRlIiBpbgorICAgICgwKQorICAgICAgICBlY2hvICJvayAxIEBSVU5AIgorICAgICAgICA7OworICAgICg3NykKKyAgICAgICAgZWNobyAib2sgMSAjIFNLSVAgQFJVTkAiCisgICAgICAgIDs7CisgICAgKCopCisgICAgICAgIGVjaG8gIm5vdCBvayAxIEBSVU5AIChleGl0IHN0YXR1cyAkZSkiCisgICAgICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtZGJ1cy1kYWVtb24tZm9yay5zaCBiL3Rlc3QvdGVzdC1kYnVzLWRhZW1vbi1mb3JrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MTY0NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtZGJ1cy1kYWVtb24tZm9yay5zaApAQCAtMCwwICsxLDEwNyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IMKpIDIwMTYgQ29sbGFib3JhIEx0ZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyMgU09GVFdBUkUuCisKK3NldCAtZQorCitleHBvcnQgREJVU19ERUJVR19PVVRQVVQ9MQorZXhwb3J0IERCVVNfVVNFX1RFU1RfQklOQVJZPTEKK2VjaG8gIiMgZGJ1cy1kYWVtb24gYmluYXJ5OiAke0RCVVNfVEVTVF9EQUVNT046PWRidXMtZGFlbW9ufSIKK2VjaG8gIiMgZGJ1cy1zZW5kIGJpbmFyeTogJHtEQlVTX1RFU1RfREJVU19TRU5EOj1kYnVzLXNlbmR9IgorCitpZiB0ZXN0IC1uICIkREJVU19URVNUX0RBVEEiOyB0aGVuCisgICAgZWNobyAiIyB0ZXN0IGRhdGE6ICREQlVTX1RFU1RfREFUQSIKKyAgICBjb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYiCitlbGlmIHRlc3QgLW4gIiREQlVTX1RFU1RfREFUQURJUiI7IHRoZW4KKyAgICBlY2hvICIjIGRhdGFkaXI6ICREQlVTX1RFU1RfREFUQURJUiIKKyAgICBjb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBRElSL2RidXMtMS9zZXNzaW9uLmNvbmYiCitlbHNlCisgICAgZWNobyAiIyB1c2luZyBzdGFuZGFyZCBzZXNzaW9uIGJ1cyBjb25maWd1cmF0aW9uIgorICAgIGNvbmZpZz0iLS1zZXNzaW9uIgorZmkKKworaWYgISB3b3JrZGlyPSIkKG1rdGVtcCAtZCkiOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSBta3RlbXAgLWQgZG9lc24ndCB3b3JrIgorICAgIGV4aXQgMAorZmkKKworZWNobyAiMS4uMyIKKwordW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorcm0gLWYgIiR3b3JrZGlyIi9hZGRyZXNzICIkd29ya2RpciIvcGlkCisKKyR7REJVU19URVNUX0RBRU1PTn0gLS1mb3JrIC0tcHJpbnQtYWRkcmVzcz04IC0tcHJpbnQtcGlkPTkgIiRjb25maWciIFwKKyAgICA4PiIkd29ya2Rpci9hZGRyZXNzIiA5PiIkd29ya2Rpci9waWQiCisKK2V4cG9ydCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9IiQoY2F0ICIkd29ya2RpciIvYWRkcmVzcykiCit0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorREJVU19TRVNTSU9OX0JVU19QSUQ9IiQoY2F0ICIkd29ya2RpciIvcGlkKSIKK2tpbGwgLTAgIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKworJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKwora2lsbCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCitlY2hvICJvayAxIC0gbm9ybWFsIGRidXMtZGFlbW9uIgorCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfUElECitybSAtZiAiJHdvcmtkaXIiL2FkZHJlc3MgIiR3b3JrZGlyIi9waWQKKworJHtEQlVTX1RFU1RfREFFTU9OfSAtLWZvcmsgLS1wcmludC1hZGRyZXNzPTggLS1wcmludC1waWQ9OSAiJGNvbmZpZyIgXAorICAgIDg+IiR3b3JrZGlyL2FkZHJlc3MiIDk+IiR3b3JrZGlyL3BpZCIgPCYtCisKK2V4cG9ydCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9IiQoY2F0ICIkd29ya2RpciIvYWRkcmVzcykiCit0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorREJVU19TRVNTSU9OX0JVU19QSUQ9IiQoY2F0ICIkd29ya2RpciIvcGlkKSIKK2tpbGwgLTAgIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKworJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKwora2lsbCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCitlY2hvICJvayAyIC0gZGJ1cy1kYWVtb24gd2l0aCBzdGRpbiBjbG9zZWQiCisKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKK3JtIC1mICIkd29ya2RpciIvYWRkcmVzcyAiJHdvcmtkaXIiL3BpZAorCiske0RCVVNfVEVTVF9EQUVNT059IC0tZm9yayAtLXByaW50LWFkZHJlc3M9OCAtLXByaW50LXBpZD05ICIkY29uZmlnIiBcCisgICAgOD4iJHdvcmtkaXIvYWRkcmVzcyIgOT4iJHdvcmtkaXIvcGlkIiA8Ji0gPiYtIDI+Ji0KKworZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iJChjYXQgIiR3b3JrZGlyIi9hZGRyZXNzKSIKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCitEQlVTX1NFU1NJT05fQlVTX1BJRD0iJChjYXQgIiR3b3JrZGlyIi9waWQpIgora2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCiske0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCitraWxsICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKK2VjaG8gIm9rIDMgLSBkYnVzLWRhZW1vbiB3aXRoIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciBjbG9zZWQiCisKK3JtIC1yICIkd29ya2RpciIKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1kYnVzLWxhdW5jaC1ldmFsLnNoIGIvdGVzdC90ZXN0LWRidXMtbGF1bmNoLWV2YWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjg5YzU0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC1kYnVzLWxhdW5jaC1ldmFsLnNoCkBAIC0wLDAgKzEsMTAzIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgwqkgMjAxNiBDb2xsYWJvcmEgTHRkLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKworc2V0IC1lCisKK2V4cG9ydCBEQlVTX0RFQlVHX09VVFBVVD0xCitleHBvcnQgREJVU19VU0VfVEVTVF9CSU5BUlk9MQorZWNobyAiIyBkYnVzLWRhZW1vbiBiaW5hcnk6ICR7REJVU19URVNUX0RBRU1PTjo9ZGJ1cy1kYWVtb259IgorZWNobyAiIyBkYnVzLWxhdW5jaCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfTEFVTkNIOj1kYnVzLWxhdW5jaH0iCitlY2hvICIjIGRidXMtc2VuZCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfU0VORDo9ZGJ1cy1zZW5kfSIKKworaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBIjsgdGhlbgorICAgIGVjaG8gIiMgdGVzdCBkYXRhOiAkREJVU19URVNUX0RBVEEiCisgICAgY29uZmlnPSItLWNvbmZpZy1maWxlPSREQlVTX1RFU1RfREFUQS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIgorZWxpZiB0ZXN0IC1uICIkREJVU19URVNUX0RBVEFESVIiOyB0aGVuCisgICAgZWNobyAiIyBkYXRhZGlyOiAkREJVU19URVNUX0RBVEFESVIiCisgICAgY29uZmlnPSItLWNvbmZpZy1maWxlPSREQlVTX1RFU1RfREFUQURJUi9kYnVzLTEvc2Vzc2lvbi5jb25mIgorZWxzZQorICAgIGVjaG8gIiMgdXNpbmcgc3RhbmRhcmQgc2Vzc2lvbiBidXMgY29uZmlndXJhdGlvbiIKKyAgICAjIGFkZCBhIGhhcm1sZXNzIGNvbW1hbmQtbGluZSBhcmd1bWVudAorICAgIGNvbmZpZz0iLS1zaC1zeW50YXgiCitmaQorCitlY2hvICIxLi4zIgorCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfUElECisKK2V2YWwgIiQoJHtEQlVTX1RFU1RfREJVU19MQVVOQ0h9IC0tc2gtc3ludGF4ICIkY29uZmlnIikiCisKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCitlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19BRERSRVNTPScKKwordGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgordGVzdCAieCQoZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfUElEPScpIiA9ICJ4Igora2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCiske0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCitraWxsICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKK2VjaG8gIm9rIDEgLSBub3JtYWwgZGJ1cy1sYXVuY2giCisKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKworZXZhbCAiJCgke0RCVVNfVEVTVF9EQlVTX0xBVU5DSH0gLS1zaC1zeW50YXggIiRjb25maWciIDwmLSkiCisKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCitlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19BRERSRVNTPScKKwordGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgordGVzdCAieCQoZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfUElEPScpIiA9ICJ4Igora2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCiske0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCitraWxsICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKK2VjaG8gIm9rIDIgLSBkYnVzLWxhdW5jaCB3aXRoIHN0ZGluIGNsb3NlZCIKKwordW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorCisjIHdlIGNhbid0IGNsb3NlIHN0ZG91dCBiZWNhdXNlIHRoYXQgYnJlYWtzIC0tc2gtc3ludGF4CitldmFsICIkKCR7REJVU19URVNUX0RCVVNfTEFVTkNIfSAtLXNoLXN5bnRheCAiJGNvbmZpZyIgPCYtIDI+Ji0pIgorCit0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nCisKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKK3Rlc3QgIngkKGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX1BJRD0nKSIgPSAieCIKK2tpbGwgLTAgIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKworJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKwora2lsbCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCitlY2hvICJvayAzIC0gZGJ1cy1sYXVuY2ggd2l0aCBzdGRpbiBhbmQgc3RkZXJyIGNsb3NlZCIKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1kYnVzLWxhdW5jaC14MTEuc2ggYi90ZXN0L3Rlc3QtZGJ1cy1sYXVuY2gteDExLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyNzhlODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtZGJ1cy1sYXVuY2gteDExLnNoCkBAIC0wLDAgKzEsMjU1IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgwqkgMjAxNiBDb2xsYWJvcmEgTHRkLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKworc2V0IC1lCitzZXQgLXgKKworZXhwb3J0IERCVVNfREVCVUdfT1VUUFVUPTEKK2V4cG9ydCBEQlVTX1VTRV9URVNUX0JJTkFSWT0xCitlY2hvICIjIGRidXMtZGFlbW9uIGJpbmFyeTogJHtEQlVTX1RFU1RfREFFTU9OOj1kYnVzLWRhZW1vbn0iCitlY2hvICIjIGRidXMtbGF1bmNoIGJpbmFyeTogJHtEQlVTX1RFU1RfREJVU19MQVVOQ0g6PWRidXMtbGF1bmNofSIKK2VjaG8gIiMgZGJ1cy1tb25pdG9yIGJpbmFyeTogJHtEQlVTX1RFU1RfREJVU19MQVVOQ0g6PWRidXMtbW9uaXRvcn0iCitlY2hvICIjIGRidXMtc2VuZCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfU0VORDo9ZGJ1cy1zZW5kfSIKKworaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBIjsgdGhlbgorICAgIGVjaG8gIiMgdGVzdCBkYXRhOiAkREJVU19URVNUX0RBVEEiCisgICAgYnVzX2NvbmZpZz0iLS1jb25maWctZmlsZT0kREJVU19URVNUX0RBVEEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uY29uZiIKKyAgICBsYXVuY2hfY29uZmlnPSIkYnVzX2NvbmZpZyIKK2VsaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBRElSIjsgdGhlbgorICAgIGVjaG8gIiMgZGF0YWRpcjogJERCVVNfVEVTVF9EQVRBRElSIgorICAgIGJ1c19jb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBRElSL2RidXMtMS9zZXNzaW9uLmNvbmYiCisgICAgbGF1bmNoX2NvbmZpZz0iJGJ1c19jb25maWciCitlbHNlCisgICAgZWNobyAiIyB1c2luZyBzdGFuZGFyZCBzZXNzaW9uIGJ1cyBjb25maWd1cmF0aW9uIgorICAgIGJ1c19jb25maWc9Ii0tc2Vzc2lvbiIKKyAgICAjIGRidXMtbGF1bmNoIGRvZXNuJ3QgYWNjZXB0IC0tc2Vzc2lvbiBzbyBhZGQgYSBoYXJtbGVzcyBjb21tYW5kLWxpbmUKKyAgICAjIGFyZ3VtZW50CisgICAgbGF1bmNoX2NvbmZpZz0iLS1zaC1zeW50YXgiCitmaQorCitpZiAhIHdvcmtkaXI9IiQobWt0ZW1wIC1kKSI7IHRoZW4KKyAgICBlY2hvICIxLi4wICMgU0tJUCAtIG1rdGVtcCAtZCBkb2Vzbid0IHdvcmsiCisgICAgZXhpdCAwCitmaQorCitpZiAhIHh2ZmItcnVuIC0tYXV0by1zZXJ2ZXJudW0gdHJ1ZTsgdGhlbgorICAgIGVjaG8gIjEuLjAgIyBTS0lQIC0geHZmYi1ydW4gZG9lc24ndCB3b3JrIgorICAgIGV4aXQgMAorZmkKKwordGVzdF9udW09MAoreF9zZXNzaW9uX3BpZD0KK3Vuc2V0IERJU1BMQVkKK3Vuc2V0IFhBVVRIT1JJVFkKKworc3RhcnRfeHZmYiAoKSB7CisgICAgcm0gLWYgIiR3b3JrZGlyL2Rpc3BsYXkiCisgICAgcm0gLWYgIiR3b3JrZGlyL3JlYWR5IgorICAgIHJtIC1mICIkd29ya2Rpci94LXNlc3Npb24tcGlkIgorICAgIHJtIC1mICIkd29ya2Rpci94YXV0aG9yaXR5IgorICAgIHJtIC1mICIkd29ya2Rpci94dmZiLWRvbmUiCisKKyAgICAjIFJ1biBhbiBYIHNlc3Npb24gaW4gdGhlIGJhY2tncm91bmQgZm9yIHVwIHRvIDUgbWludXRlcy4KKyAgICAoCisgICAgICAgIHNldCArZQorICAgICAgICB4dmZiLXJ1biAtLWF1dG8tc2VydmVybnVtIFwKKyAgICAgICAgICAgIHNoIC1jICdlY2hvICIkJCIgPiAiJDEveC1zZXNzaW9uLXBpZCI7IGVjaG8gIiRYQVVUSE9SSVRZIiA+ICIkMS94YXV0aG9yaXR5IjsgZWNobyAiJERJU1BMQVkiID4gIiQxL2Rpc3BsYXkiOyB0b3VjaCAiJDEvcmVhZHkiOyBleGVjIHNsZWVwIDMwMCcgXAorICAgICAgICAgICAgc2ggIiR3b3JrZGlyIgorICAgICAgICB0b3VjaCAiJHdvcmtkaXIveHZmYi1kb25lIgorICAgICkgJgorCisgICAgdHJpZXM9MAorICAgIHdoaWxlICEgWyAtZSAiJHdvcmtkaXIvcmVhZHkiIF07IGRvCisgICAgICAgIGlmIFsgJHRyaWVzIC1nZSAxMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjIEZhaWxlZCB0byBzdGFydCB4dmZiLXJ1biB3aXRoaW4gJHRyaWVzIHNlY29uZHMiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgdHJpZXM9JCgoJHRyaWVzICsgMSkpCisgICAgICAgIHNsZWVwIDEKKyAgICBkb25lCisKKyAgICB4X3Nlc3Npb25fcGlkPSIkKGNhdCAiJHdvcmtkaXIveC1zZXNzaW9uLXBpZCIpIgorICAgIGV4cG9ydCBESVNQTEFZPSIkKGNhdCAiJHdvcmtkaXIvZGlzcGxheSIpIgorICAgIGV4cG9ydCBYQVVUSE9SSVRZPSIkKGNhdCAiJHdvcmtkaXIveGF1dGhvcml0eSIpIgorICAgIGtpbGwgLTAgIiR4X3Nlc3Npb25fcGlkIgorfQorCit0ZXN0X2Rpc2Nvbm5lY3Rpb24gKCkgeworICAgIHJtIC1mICIkd29ya2Rpci9kaXNjb25uZWN0ZWQiCisgICAgKAorICAgICAgICBzZXQgK2UKKyAgICAgICAgJHtEQlVTX1RFU1RfREJVU19NT05JVE9SfSA+ICIkd29ya2Rpci9kYnVzLW1vbml0b3IubG9nIiAyPiYxCisgICAgICAgIHRvdWNoICIkd29ya2Rpci9kaXNjb25uZWN0ZWQiCisgICAgKSAmCisKKyAgICBraWxsICIkeF9zZXNzaW9uX3BpZCIKKworICAgIHRyaWVzPTAKKyAgICB3aGlsZSAhIFsgLWUgIiR3b3JrZGlyL2Rpc2Nvbm5lY3RlZCIgXTsgZG8KKyAgICAgICAgaWYgWyAkdHJpZXMgLWdlIDEwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiMgZGJ1cy1tb25pdG9yIHdhcyBub3QgZGlzY29ubmVjdGVkIHdpdGhpbiAkdHJpZXMgc2Vjb25kcyIgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgdHJpZXM9JCgoJHRyaWVzICsgMSkpCisgICAgICAgIHNsZWVwIDEKKyAgICBkb25lCisKKyAgICB0cmllcz0wCisgICAgd2hpbGUgISBbIC1lICIkd29ya2Rpci94dmZiLWRvbmUiIF07IGRvCisgICAgICAgIGlmIFsgJHRyaWVzIC1nZSAxMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjIHh2ZmItcnVuIGRpZCBub3QgZXhpdCB3aXRoaW4gJHRyaWVzIHNlY29uZHMiID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIHRyaWVzPSQoKCR0cmllcyArIDEpKQorICAgICAgICBzbGVlcCAxCisgICAgZG9uZQorfQorCit0ZXN0X2V4aXRfd2l0aF94MTEgKCkgeworICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUworICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfUElECisgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRAorCisgICAgc3RhcnRfeHZmYgorICAgIGV2YWwgIiQoJERCVVNfVEVTVF9EQlVTX0xBVU5DSCAtLXNoLXN5bnRheCAtLWV4aXQtd2l0aC1zZXNzaW9uICIkbGF1bmNoX2NvbmZpZyIgPC9kZXYvbnVsbCkiCisKKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorICAgIGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JworCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorICAgIHRlc3QgIngkKGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX1BJRD0nKSIgPSAieCIKKyAgICBraWxsIC0wICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0nKSIgPSAieCIKKworICAgICR7REJVU19URVNUX0RCVVNfU0VORH0gLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyBcCisgICAgICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCisgICAgdGVzdF9kaXNjb25uZWN0aW9uCisKKyAgICB0ZXN0X251bT0kKCgkdGVzdF9udW0gKyAxKSkKKyAgICBlY2hvICJvayAke3Rlc3RfbnVtfSAtIGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb24iCit9CisKK3Rlc3RfYXV0b2xhdW5jaCAoKSB7CisgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCisgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lECisgICAgdW5zZXQgWERHX1JVTlRJTUVfRElSCisgICAgZmFrZV91dWlkPSJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiIKKworICAgIHN0YXJ0X3h2ZmIKKyAgICBldmFsICIkKCREQlVTX1RFU1RfREJVU19MQVVOQ0ggLS1zaC1zeW50YXggLS1hdXRvbGF1bmNoPSR7ZmFrZV91dWlkfSAiJGxhdW5jaF9jb25maWciIDwvZGV2L251bGwpIgorCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKKyAgICBlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19BRERSRVNTPScKKworICAgIHRlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19QSUQ9JykiID0gIngiCisgICAga2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQiCisgICAgdGVzdCAieCQoZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JykiID0gIngiCisKKyAgICAjIEl0IGlzIGlkZW1wb3RlbnQKKyAgICBvbGRfYWRkcmVzcz0iJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKKyAgICBvbGRfcGlkPSIkREJVU19TRVNTSU9OX0JVU19QSUQiCisgICAgb2xkX3dpbmRvdz0iJERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQiCisgICAgZXZhbCAiJCgkREJVU19URVNUX0RCVVNfTEFVTkNIIC0tc2gtc3ludGF4IC0tYXV0b2xhdW5jaD0ke2Zha2VfdXVpZH0gIiRsYXVuY2hfY29uZmlnIiA8L2Rldi9udWxsKSIKKyAgICB0ZXN0ICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiA9ICIkb2xkX2FkZHJlc3MiCisgICAgdGVzdCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIiA9ICIkb2xkX3BpZCIKKyAgICB0ZXN0ICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIgPSAiJG9sZF93aW5kb3ciCisKKyAgICAke0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgICAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKworICAgIHRlc3RfZGlzY29ubmVjdGlvbgorCisgICAgdGVzdF9udW09JCgoJHRlc3RfbnVtICsgMSkpCisgICAgZWNobyAib2sgJHt0ZXN0X251bX0gLSBkYnVzLWxhdW5jaCAtLWF1dG9sYXVuY2giCit9CisKK3Rlc3RfeGRnX3J1bnRpbWVfZGlyICgpIHsKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQKKyAgICBleHBvcnQgWERHX1JVTlRJTUVfRElSPSIkd29ya2RpciIKKyAgICBmYWtlX3V1aWQ9ImZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIgorCisgICAgaWYgZWNobyAiJHdvcmtkaXIiIHwgZ3JlcCAnW14wLTlBLVphLXpfLS8uXSc7IHRoZW4KKyAgICAgICAgdGVzdF9udW09JCgoJHRlc3RfbnVtICsgMSkpCisgICAgICAgIGVjaG8gIm9rICR7dGVzdF9udW19ICMgU0tJUCAtICR3b3JrZGlyIHdvdWxkIG5lZWQgZXNjYXBpbmciCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICAke0RCVVNfVEVTVF9EQUVNT059ICIkYnVzX2NvbmZpZyIgLS1hZGRyZXNzPSJ1bml4OnBhdGg9JFhER19SVU5USU1FX0RJUi9idXMiIC0tcHJpbnQtcGlkPTkgLS1mb3JrIDk+IiR3b3JrZGlyL2J1cy1waWQiCisgICAgYnVzX3BpZD0iJChjYXQgIiR3b3JrZGlyL2J1cy1waWQiKSIKKyAgICBraWxsIC0wICIkYnVzX3BpZCIKKworICAgIHN0YXJ0X3h2ZmIKKyAgICBldmFsICIkKCREQlVTX1RFU1RfREJVU19MQVVOQ0ggLS1zaC1zeW50YXggLS1hdXRvbGF1bmNoPSR7ZmFrZV91dWlkfSAiJGxhdW5jaF9jb25maWciIDwvZGV2L251bGwpIgorCisgICAgZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nCisgICAgdGVzdCAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIgPSAidW5peDpwYXRoPSRYREdfUlVOVElNRV9ESVIvYnVzIgorCisgICAgIyBXaGVuIGRidXMtbGF1bmNoIHBpY2tzIHVwIHRoZSBhZGRyZXNzIGZyb20gWERHX1JVTlRJTUVfRElSL2J1cywgaXQKKyAgICAjIGRvZXNuJ3Qga25vdyB0aGUgcGlkCisgICAgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCisgICAgIyBJdCBzdGlsbCBrbm93cyB3aGljaCB3aW5kb3cgaXQgc3Rhc2hlZCB0aGUgaW5mb3JtYXRpb24gaW4KKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0nKSIgPSAieCIKKworICAgICR7REJVU19URVNUX0RCVVNfU0VORH0gLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyBcCisgICAgICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCisgICAga2lsbCAiJHhfc2Vzc2lvbl9waWQiCisKKyAgICB0cmllcz0wCisgICAgd2hpbGUgISBbIC1lICIkd29ya2Rpci94dmZiLWRvbmUiIF07IGRvCisgICAgICAgIGlmIFsgJHRyaWVzIC1nZSAxMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjIHh2ZmItcnVuIGRpZCBub3QgZXhpdCB3aXRoaW4gJHRyaWVzIHNlY29uZHMiID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIHRyaWVzPSQoKCR0cmllcyArIDEpKQorICAgICAgICBzbGVlcCAxCisgICAgZG9uZQorCisgICAgIyBkYnVzLWxhdW5jaCBoYXMgZ29uZSBidXQgdGhlIGRidXMtZGFlbW9uIGlzIHN0aWxsIGFsaXZlCisgICAgJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAgICAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0TmFtZXMgPiYyCisKKyAgICBraWxsICIkYnVzX3BpZCIKKworICAgIHRlc3RfbnVtPSQoKCR0ZXN0X251bSArIDEpKQorICAgIGVjaG8gIm9rICR7dGVzdF9udW19IC0gZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIHdpdGggWERHX1JVTlRJTUVfRElSIgorfQorCitlY2hvICIxLi4zIgordGVzdF9leGl0X3dpdGhfeDExCit0ZXN0X2F1dG9sYXVuY2gKK3Rlc3RfeGRnX3J1bnRpbWVfZGlyCisKKyMgdmltOnNldCBzdz00IHN0cz00IGV0OgpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LWV4aXQuYyBiL3Rlc3QvdGVzdC1leGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmOTY3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC1leGl0LmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qIFRoaXMgaXMgYSBwcm9jZXNzIHRoYXQganVzdCBleGl0cyB3aXRoIGEgZmFpbHVyZSBjb2RlICovCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1uYW1lcy5jIGIvdGVzdC90ZXN0LW5hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczNjYzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC1uYW1lcy5jCkBAIC0wLDAgKzEsNzggQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3QtbmFtZXM6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorVGVzdE5hbWUoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleHBlY3RlZFN1Y2Nlc3MpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgICh2b2lkKSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBpZiAoZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBhY3F1aXJpbmcgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYgKHN0ZG91dCwgIkV4cGVjdGVkIEVycm9yIGFjcXVpcmluZyBuYW1lICclcyc6ICVzXG4iLCBuYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgaWYgKGV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGlmICghZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmV4cGVjdGVkIFN1Y2Nlc3MgYWNxdWlyaW5nIG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYgKHN0ZG91dCwgIlN1Y2Nlc3NmdWxseSBhY3F1aXJlZCBuYW1lICclcydcbiIsIG5hbWUpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBNYW5hZ2VkIHRvIGFjcXVpcmUgbmFtZSAnJXMnXG4iLCBuYW1lKTsKKyAgICAgIGlmICghZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGxvb3AgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3QiLCBUUlVFKTsKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3QtMiIsIFRSVUUpOworICBUZXN0TmFtZShjb25uZWN0aW9uLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdF8yIiwgVFJVRSk7CisjaWYgMAorICBUZXN0TmFtZShjb25uZWN0aW9uLCAiVGVzdF8yIiwgVFJVRSk7CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBuYW1lIGV4aXRpbmdcbiIpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtc2VnZmF1bHQuYyBiL3Rlc3QvdGVzdC1zZWdmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzBmOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3Qtc2VnZmF1bHQuYwpAQCAtMCwwICsxLDcyIEBACisvKiBUaGlzIGlzIHNpbXBseSBhIHByb2Nlc3MgdGhhdCBzZWdmYXVsdHMgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0VUUkxJTUlUCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1BSQ1RMX0gKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworaW50CitleGNlcHRpb25faGFuZGxlcihMUEVYQ0VQVElPTl9QT0lOVEVSUyBwKTsKKworLyogRXhwbGljaXQgV2luZG93cyBleGNlcHRpb24gaGFuZGxlcnMgbmVlZGVkIHRvIHN1cHJlc3MgT1MgcG9wdXBzICovCitpbnQKK2V4Y2VwdGlvbl9oYW5kbGVyKExQRVhDRVBUSU9OX1BPSU5URVJTIHApCit7CisgIGZwcmludGYoc3RkZXJyLCAidGVzdC1zZWdmYXVsdDogcmFpc2VkIGZhdGFsIGV4Y2VwdGlvbiBhcyBpbnRlbmRlZFxuIik7CisgIEV4aXRQcm9jZXNzKDB4YzAwMDAwMDUpOworfQorI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICpwOyAgCisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBEaXNhYmxlIFdpbmRvd3MgcG9wdXAgZGlhbG9nIHdoZW4gYW4gYXBwIGNyYXNoZXMgc28gdGhhdCBhcHAgcXVpdHMKKyAgICogaW1tZWRpYXRlbHkgd2l0aCBlcnJvciBjb2RlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdXNlciB0byBkaXNtaXNzCisgICAqIHRoZSBkaWFsb2cuICAqLworICBEV09SRCBkd01vZGUgPSBTZXRFcnJvck1vZGUoU0VNX05PR1BGQVVMVEVSUk9SQk9YKTsKKyAgU2V0RXJyb3JNb2RlKGR3TW9kZSB8IFNFTV9OT0dQRkFVTFRFUlJPUkJPWCk7CisgIC8qIERpc2FibGUgImp1c3QgaW4gdGltZSIgZGVidWdnZXIgKi8KKyAgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKChMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSKSZleGNlcHRpb25faGFuZGxlcik7CisjZW5kaWYKKworI2lmIEhBVkVfU0VUUkxJTUlUCisgIC8qIE5vIGNvcmUgZHVtcHMgcGxlYXNlLCB3ZSBrbm93IHdlIGNyYXNoZWQuICovCisgIHN0cnVjdCBybGltaXQgciA9IHsgMCwgfTsKKyAgCisgIGdldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyAgci5ybGltX2N1ciA9IDA7CisgIHNldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1BSQ1RMKSAmJiBkZWZpbmVkKFBSX1NFVF9EVU1QQUJMRSkKKyAgLyogUmVhbGx5LCBubyBjb3JlIGR1bXBzIHBsZWFzZS4gT24gTGludXgsIGlmIGNvcmVfcGF0dGVybiBpcworICAgKiBzZXQgdG8gYSBwaXBlIChmb3IgYWJydC9hcHBvcnQvY29yZWtlZXBlci9ldGMuKSwgUkxJTUlUX0NPUkUgb2YgMAorICAgKiBpcyBpZ25vcmVkIChkZWxpYmVyYXRlbHksIHNvIHBlb3BsZSBjYW4gZGVidWcgaW5pdCg4KSBhbmQgb3RoZXIKKyAgICogZWFybHkgc3R1ZmYpOyBidXQgTGludXggaGFzIFBSX1NFVF9EVU1QQUJMRSwgc28gd2UgY2FuIGF2b2lkIGNvcmUKKyAgICogZHVtcHMgYW55d2F5LiAqLworICBwcmN0bCAoUFJfU0VUX0RVTVBBQkxFLCAwLCAwLCAwLCAwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9SQUlTRQorICByYWlzZSAoU0lHU0VHVik7CisjZW5kaWYKKyAgcCA9IE5VTEw7CisgICpwID0gJ2EnOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtc2VydmljZS5jIGIvdGVzdC90ZXN0LXNlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJkMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXNlcnZpY2UuYwpAQCAtMCwwICsxLDUwMyBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CitzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV9xdWl0ID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgaGVsbG9fZnJvbV9zZWxmX3JlcGx5X3JlY2VpdmVkID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitxdWl0ICh2b2lkKQoreworICBpZiAoIWFscmVhZHlfcXVpdCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3F1aXQgKGxvb3ApOworICAgICAgYWxyZWFkeV9xdWl0ID0gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LXNlcnZpY2U6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfaGVsbG9fZnJvbV9zZWxmX3JlcGx5IChEQnVzUGVuZGluZ0NhbGwgKnBjYWxsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlICplY2hvX21lc3NhZ2UsICplY2hvX3JlcGx5ID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgCisgIGludCB0eXBlOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworIAorICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBkaWUoIm5vIG1lbW9yeSIpOworICAgIH0KKworICAKKyAgZWNob19tZXNzYWdlID0gKERCdXNNZXNzYWdlICopdXNlcl9kYXRhOworICAgIAorICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChwY2FsbCk7CisgICAgCisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KTsKKyAgICAKKyAgaWYgKHR5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgcHJpbnRmICgiUmVwbHkgZnJvbSBIZWxsb0Zyb21TZWxmIHJlY2VpdmVkXG4iKTsKKyAgICAgCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAoZWNob19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVjaG9fcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChlY2hvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICAgIH0gCisgICAgICBlbHNlCisgICAgICAgIHsgIAorICAgICAgICAgIGVjaG9fcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKGVjaG9fbWVzc2FnZSk7CisgICAgICAgICAgaWYgKGVjaG9fcmVwbHkgPT0gTlVMTCkKKyAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChlY2hvX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIGVjaG9fcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAgICAgCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVjaG9fcmVwbHkpOworICAgIH0KKyAgZWxzZSBpZiAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgcmVwbHkpOworICAgICAgcHJpbnRmICgiRXJyb3IgdHlwZSBpbiByZXBseTogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAoc3RyY21wIChlcnJvci5uYW1lLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKGVjaG9fcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBlY2hvX3JlcGx5LCBOVUxMKSkKKyAgICAgICAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChlY2hvX3JlcGx5KTsKKyAgICAgICAgfQorICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOworCisgIGhlbGxvX2Zyb21fc2VsZl9yZXBseV9yZWNlaXZlZCA9IFRSVUU7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChlY2hvX21lc3NhZ2UpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGNhbGwpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9ydW5faGVsbG9fZnJvbV9zZWxmIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHksICpzZWxmX21lc3NhZ2U7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGNhbGw7CisgIGNoYXIgKnM7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKyAgICBwcmludGYgKCJTZW5kaW5nIEhlbGxvRnJvbVNlbGZcbiIpOworCisgX2RidXNfdmVyYm9zZSAoIioqKiBTZW5kaW5nIG1lc3NhZ2UgdG8gc2VsZlxuIik7Cisgc2VsZl9tZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9Gcm9tU2VsZiIpOworICAKKyAgaWYgKHNlbGZfbWVzc2FnZSA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uZWN0aW9uLCBzZWxmX21lc3NhZ2UsICZwY2FsbCwgLTEpKQorICAgIGRpZSgiTm8gbWVtb3J5Iik7CisgIAorICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwY2FsbCwgY2hlY2tfaGVsbG9fZnJvbV9zZWxmX3JlcGx5LCAodm9pZCAqKW1lc3NhZ2UsIE5VTEwpKQorICAgIGRpZSgiTm8gbWVtb3J5Iik7CisgICAgCisgIHByaW50ZiAoIlNlbnQgSGVsbG9Gcm9tU2VsZlxuIik7CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2VjaG8gKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICpzOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kaW5nIHJlcGx5IHRvIEVjaG8gbWV0aG9kXG4iKTsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJFY2hvIHNlcnZpY2UgZWNob2VkIHN0cmluZzogXCIlc1wiXG4iLCBzKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIAorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9kZWxheV9lY2hvIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY2hhciAqczsKKworICBfZGJ1c192ZXJib3NlICgic2xlZXBpbmcgZm9yIGEgc2hvcnQgdGltZVxuIik7CisKKyAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICg1MCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRGVsYXlFY2hvIG1ldGhvZFxuIik7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiRGVsYXlFY2hvIHNlcnZpY2UgZWNob2VkIHN0cmluZzogXCIlc1wiXG4iLCBzKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIAorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkCitwYXRoX3VucmVnaXN0ZXJlZF9mdW5jIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgLyogY29ubmVjdGlvbiB3YXMgZmluYWxpemVkICovCit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcGF0aF9tZXNzYWdlX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKSkKKyAgICByZXR1cm4gaGFuZGxlX2VjaG8gKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWxheUVjaG8iKSkKKyAgICByZXR1cm4gaGFuZGxlX2RlbGF5X2VjaG8gKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0IikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbWl0Rm9vIikpCisgICAgeworICAgICAgLyogRW1pdCB0aGUgRm9vIHNpZ25hbCAqLworICAgICAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKyAgICAgIGRvdWJsZSB2X0RPVUJMRTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImVtaXR0aW5nIHNpZ25hbCBGb29cbiIpOworICAgICAgCisgICAgICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICAgICAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICB2X0RPVUJMRSA9IDQyLjY7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAoc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9ET1VCTEUsICZ2X0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHNpZ25hbCwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICAgIAorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bkhlbGxvRnJvbVNlbGYiKSkKKyAgICB7CisgICAgICByZXR1cm4gaGFuZGxlX3J1bl9oZWxsb19mcm9tX3NlbGYgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG9Gcm9tU2VsZiIpKQorICAgIHsKKyAgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAgICAgICBwcmludGYgKCJSZWNlaXZlZCB0aGUgSGVsbG9Gcm9tU2VsZiBtZXNzYWdlXG4iKTsKKyAgICAgICAgCisgICAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgICAgICAgIAorICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0UGF0aFZUYWJsZQorZWNob192dGFibGUgPSB7CisgIHBhdGhfdW5yZWdpc3RlcmVkX2Z1bmMsCisgIHBhdGhfbWVzc2FnZV9mdW5jLAorICBOVUxMLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciogZWNob19wYXRoID0gIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiA7CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCByZXN1bHQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjb25zdCBjaGFyICpuYW1lOworI2lmbmRlZiBEQlVTX1dJTgorICBkYnVzX2Jvb2xfdCBkb19mb3JrID0gRkFMU0U7CisjZW5kaWYKKyAgaWYgKGFyZ2MgIT0gMykKKyAgICB7CisgICAgICBuYW1lID0gIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuYW1lID0gYXJndlsxXTsKKyNpZm5kZWYgREJVU19XSU4KKyAgICAgIGRvX2ZvcmsgPSBzdHJjbXAgKGFyZ3ZbMl0sICJmb3JrIikgPT0gMDsKKyNlbmRpZgorICAgIH0KKworICAvKiBUaGUgYmFyZSBtaW5pbXVtIGZvciBzaW11bGF0aW5nIGEgcHJvZ3JhbSAiZGFlbW9uaXppbmciOyB0aGUgaW50ZW50CisgICAqIGlzIHRvIHRlc3Qgc2VydmljZXMgd2hpY2ggbW92ZSBmcm9tIGJlaW5nIGxlZ2FjeSBpbml0IHNjcmlwdHMgdG8KKyAgICogYWN0aXZhdGVkIHNlcnZpY2VzLgorICAgKiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTU0NTI2NworICAgKi8KKyNpZm5kZWYgREJVU19XSU4KKyAgIGlmIChkb19mb3JrKQorICAgIHsKKyAgICAgIHBpZF90IHBpZCA9IGZvcmsgKCk7CisgICAgICBpZiAocGlkICE9IDApCisgICAgICAgIGV4aXQgKDApOworICAgICAgc2xlZXAgKDEpOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU1RBUlRFUiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBhY3RpdmF0aW5nIG1lc3NhZ2UgYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGxvb3AgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2Z1bmMsIE5VTEwsIE5VTEwpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNob19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVjaG9fdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSAweGRlYWRiZWVmKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICB7CisgICAgdm9pZCAqZDsKKyAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAoY29ubmVjdGlvbiwgZWNob19wYXRoLCAmZCkpCisgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICBpZiAoZCAhPSAodm9pZCopIDB4ZGVhZGJlZWYpCisgICAgICBkaWUgKCJkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEoKSBkb2Vzbid0IHNlZW0gdG8gd29yayByaWdodFxuIik7CisgIH0KKworICByZXN1bHQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgc2VydmljZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmVzdWx0ICE9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGFjcXVpcmUgc2VydmljZTogY29kZSAlZFxuIiwgcmVzdWx0KTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgc2VydmljZTogJWRcbiIsIHJlc3VsdCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZW50ZXJpbmcgbWFpbiBsb29wXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGxvb3ApOworICAKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoY29ubmVjdGlvbiwgZmlsdGVyX2Z1bmMsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKyAgbG9vcCA9IE5VTEw7CisgIAorICBkYnVzX3NodXRkb3duICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIqKiogVGVzdCBzZXJ2aWNlIGV4aXRpbmdcbiIpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jIGIvdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UuYwpAQCAtMCwwICsxLDIwMyBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CitzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV9xdWl0ID0gRkFMU0U7CitzdGF0aWMgY29uc3QgY2hhciogZWNob19wYXRoID0gIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IGFyZ2M7CisgIGNoYXIgKiphcmd2OworfSBFY2hvRGF0YTsKKworc3RhdGljIHZvaWQKK3F1aXQgKHZvaWQpCit7CisgIGlmICghYWxyZWFkeV9xdWl0KQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBhbHJlYWR5X3F1aXQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3Qtc2VydmljZTogJXMiLCBtZXNzYWdlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2VjaG8gKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgaW50IGk7CisgIEVjaG9EYXRhICpkOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kaW5nIHJlcGx5IHRvIEVjaG8gbWV0aG9kXG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAoY29ubmVjdGlvbiwgZWNob19wYXRoLCAodm9pZCAqKikmZCkpCisgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKyAgZm9yIChpID0gMDsgaSA8IGQtPmFyZ2M7ICsraSkKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICYoZC0+YXJndltpXSkpKQorICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJTaGVsbCBlY2hvIHNlcnZpY2UgZWNob2VkIHRoZSBjb21tYW5kIGxpbmVcbiIpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitwYXRoX3VucmVnaXN0ZXJlZF9mdW5jIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgLyogY29ubmVjdGlvbiB3YXMgZmluYWxpemVkICovCit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcGF0aF9tZXNzYWdlX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKSkKKyAgICByZXR1cm4gaGFuZGxlX2VjaG8gKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0IikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c09iamVjdFBhdGhWVGFibGUKK2VjaG9fdnRhYmxlID0geworICBwYXRoX3VucmVnaXN0ZXJlZF9mdW5jLAorICBwYXRoX21lc3NhZ2VfZnVuYywKKyAgTlVMTCwKK307CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgcXVpdCAoKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KK30KKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBFY2hvRGF0YSBlY2hvX2RhdGE7CisgIGludCByZXN1bHQ7CisgIAorICBlY2hvX2RhdGEuYXJnYyA9IGFyZ2M7CisgIGVjaG9fZGF0YS5hcmd2ID0gYXJndjsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU1RBUlRFUiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBhY3RpdmF0aW5nIG1lc3NhZ2UgYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGxvb3AgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2Z1bmMsIE5VTEwsIE5VTEwpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNob19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVjaG9fdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSAmZWNob19kYXRhKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICB7CisgICAgdm9pZCAqZDsKKyAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAoY29ubmVjdGlvbiwgZWNob19wYXRoLCAmZCkpCisgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICBpZiAoZCAhPSAodm9pZCopICZlY2hvX2RhdGEpCisgICAgICBkaWUgKCJkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEoKSBkb2Vzbid0IHNlZW0gdG8gd29yayByaWdodFxuIik7CisgIH0KKyAgCisgIHJlc3VsdCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXN1bHQgIT0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gYWNxdWlyZSBzZXJ2aWNlOiBjb2RlICVkXG4iLCByZXN1bHQpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBlbnRlcmluZyBtYWluIGxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoY29ubmVjdGlvbiwgZmlsdGVyX2Z1bmMsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKyAgbG9vcCA9IE5VTEw7CisgIAorICBkYnVzX3NodXRkb3duICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIqKiogVGVzdCBzZXJ2aWNlIGV4aXRpbmdcbiIpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlci5jIGIvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ3NjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYwpAQCAtMCwwICsxLDIyIEBACisvKiBUaGlzIGlzIGEgcHJvY2VzcyB0aGF0IGp1c3Qgc2xlZXBzIGluZmluaXRlbHkuICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfV0lOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgZGVmaW5lIHNsZWVwIFNsZWVwCisjZW5kaWYKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgd2hpbGUgKDEpCisgICAgc2xlZXAgKDEwMDAwMDAwKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC11dGlscy1nbGliLmMgYi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODQ5NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5jCkBAIC0wLDAgKzEsNDcyIEBACisvKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGVzdHMgdGhhdCByZWx5IG9uIEdMaWIKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxMy0yMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorIyBpbmNsdWRlIDxpby5oPgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxzaWduYWwuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxwd2QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2lmZGVmIEdfT1NfV0lOCisjIGRlZmluZSBpc2F0dHkoeCkgX2lzYXR0eSh4KQorI2VuZGlmCisKK3ZvaWQKK190ZXN0X2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplLAorICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgaW50IGxpbmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCIlczolZDogZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLAorICAgICAgICBmaWxlLCBsaW5lLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIHZvaWQKK2NoaWxkX3NldHVwIChncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3ZCA9IHVzZXJfZGF0YTsKKyAgdWlkX3QgdWlkID0gZ2V0ZXVpZCAoKTsKKworICBpZiAocHdkID09IE5VTEwgfHwgKHB3ZC0+cHdfdWlkID09IHVpZCAmJiBnZXR1aWQgKCkgPT0gdWlkKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHVpZCAhPSAwKQorICAgIGdfZXJyb3IgKCJub3QgY3VycmVudGx5IGV1aWQgMDogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHVpZCk7CisKKyAgaWYgKHNldHVpZCAocHdkLT5wd191aWQpICE9IDApCisgICAgZ19lcnJvciAoImNvdWxkIG5vdCBzZXR1aWQgKCVsdSk6ICVzIiwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHB3ZC0+cHdfdWlkLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIHVpZCA9IGdldHVpZCAoKTsKKworICBpZiAodWlkICE9IHB3ZC0+cHdfdWlkKQorICAgIGdfZXJyb3IgKCJhZnRlciBzdWNjZXNzZnVsIHNldHVpZCAoJWx1KSBteSB1aWQgaXMgJWxkIiwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHB3ZC0+cHdfdWlkLCAodW5zaWduZWQgbG9uZykgdWlkKTsKKworICB1aWQgPSBnZXRldWlkICgpOworCisgIGlmICh1aWQgIT0gcHdkLT5wd191aWQpCisgICAgZ19lcnJvciAoImFmdGVyIHN1Y2Nlc3NmdWwgc2V0dWlkICglbHUpIG15IGV1aWQgaXMgJWxkIiwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHB3ZC0+cHdfdWlkLCAodW5zaWduZWQgbG9uZykgdWlkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2NoYXIgKgorc3Bhd25fZGJ1c19kYWVtb24gKGNvbnN0IGdjaGFyICpiaW5hcnksCisgICAgY29uc3QgZ2NoYXIgKmNvbmZpZ3VyYXRpb24sCisgICAgY29uc3QgZ2NoYXIgKmxpc3Rlbl9hZGRyZXNzLAorICAgIFRlc3RVc2VyIHVzZXIsCisgICAgR1BpZCAqZGFlbW9uX3BpZCkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdTdHJpbmcgKmFkZHJlc3M7CisgIGdpbnQgYWRkcmVzc19mZDsKKyAgR1B0ckFycmF5ICphcmd2OworI2lmZGVmIERCVVNfVU5JWAorICBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwd2QgPSBOVUxMOworI2VuZGlmCisKKyAgaWYgKHVzZXIgIT0gVEVTVF9VU0VSX01FKQorICAgIHsKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGlmIChnZXR1aWQgKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGdfdGVzdF9za2lwICgiY2Fubm90IHVzZSBhbHRlcm5hdGl2ZSB1aWQgd2hlbiBub3QgdWlkIDAiKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBzd2l0Y2ggKHVzZXIpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFRFU1RfVVNFUl9ST09UOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFRFU1RfVVNFUl9NRVNTQUdFQlVTOgorICAgICAgICAgICAgcHdkID0gZ2V0cHduYW0gKERCVVNfVVNFUik7CisKKyAgICAgICAgICAgIGlmIChwd2QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdjaGFyICptZXNzYWdlID0gZ19zdHJkdXBfcHJpbnRmICgidXNlciAnJXMnIGRvZXMgbm90IGV4aXN0IiwKKyAgICAgICAgICAgICAgICAgICAgREJVU19VU0VSKTsKKworICAgICAgICAgICAgICAgIGdfdGVzdF9za2lwIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBnX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBURVNUX1VTRVJfT1RIRVI6CisgICAgICAgICAgICBwd2QgPSBnZXRwd25hbSAoREJVU19URVNUX1VTRVIpOworCisgICAgICAgICAgICBpZiAocHdkID09IE5VTEwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnY2hhciAqbWVzc2FnZSA9IGdfc3RyZHVwX3ByaW50ZiAoInVzZXIgJyVzJyBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgICAgICAgICAgICAgIERCVVNfVEVTVF9VU0VSKTsKKworICAgICAgICAgICAgICAgIGdfdGVzdF9za2lwIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBnX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICB9CisjZWxzZQorICAgICAgZ190ZXN0X3NraXAgKCJjYW5ub3QgdXNlIGFsdGVybmF0aXZlIHVpZCBvbiBXaW5kb3dzIik7CisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICBhcmd2ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX2ZyZWUpOworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwIChiaW5hcnkpKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChhcmd2LCBnX3N0cmR1cCAoY29uZmlndXJhdGlvbikpOworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwICgiLS1ub2ZvcmsiKSk7CisgIGdfcHRyX2FycmF5X2FkZCAoYXJndiwgZ19zdHJkdXAgKCItLXByaW50LWFkZHJlc3M9MSIpKTsgLyogc3Rkb3V0ICovCisKKyAgaWYgKGxpc3Rlbl9hZGRyZXNzICE9IE5VTEwpCisgICAgZ19wdHJfYXJyYXlfYWRkIChhcmd2LCBnX3N0cmR1cCAobGlzdGVuX2FkZHJlc3MpKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwICgiLS1zeXN0ZW1kLWFjdGl2YXRpb24iKSk7CisjZW5kaWYKKworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIE5VTEwpOworCisgIGdfc3Bhd25fYXN5bmNfd2l0aF9waXBlcyAoTlVMTCwgLyogd29ya2luZyBkaXJlY3RvcnkgKi8KKyAgICAgIChnY2hhciAqKikgYXJndi0+cGRhdGEsCisgICAgICBOVUxMLCAvKiBlbnZwICovCisgICAgICBHX1NQQVdOX0RPX05PVF9SRUFQX0NISUxEIHwgR19TUEFXTl9TRUFSQ0hfUEFUSCwKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGNoaWxkX3NldHVwLCAoZ3BvaW50ZXIpIHB3ZCwKKyNlbHNlCisgICAgICBOVUxMLCBOVUxMLAorI2VuZGlmCisgICAgICBkYWVtb25fcGlkLAorICAgICAgTlVMTCwgLyogY2hpbGQncyBzdGRpbiA9IC9kZXYvbnVsbCAqLworICAgICAgJmFkZHJlc3NfZmQsCisgICAgICBOVUxMLCAvKiBjaGlsZCdzIHN0ZGVyciA9IG91ciBzdGRlcnIgKi8KKyAgICAgICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgZ19wdHJfYXJyYXlfZnJlZSAoYXJndiwgVFJVRSk7CisKKyAgYWRkcmVzcyA9IGdfc3RyaW5nX25ldyAoTlVMTCk7CisKKyAgLyogcG9sbGluZyB1bnRpbCB0aGUgZGJ1cy1kYWVtb24gd3JpdGVzIG91dCBpdHMgYWRkcmVzcyBpcyBhIGJpdCBzdHVwaWQsCisgICAqIGJ1dCBhdCBsZWFzdCBpdCdzIHNpbXBsZSwgdW5saWtlIGRidXMtbGF1bmNoLi4uIGluIHByaW5jaXBsZSB3ZSBjb3VsZAorICAgKiB1c2Ugc2VsZWN0KCkgaGVyZSwgYnV0IGxpZmUncyB0b28gc2hvcnQgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZ3NzaXplIGJ5dGVzOworICAgICAgZ2NoYXIgYnVmWzQwOTZdOworICAgICAgZ2NoYXIgKm5ld2xpbmU7CisKKyAgICAgIGJ5dGVzID0gcmVhZCAoYWRkcmVzc19mZCwgYnVmLCBzaXplb2YgKGJ1ZikpOworCisgICAgICBpZiAoYnl0ZXMgPiAwKQorICAgICAgICBnX3N0cmluZ19hcHBlbmRfbGVuIChhZGRyZXNzLCBidWYsIGJ5dGVzKTsKKworICAgICAgbmV3bGluZSA9IHN0cmNociAoYWRkcmVzcy0+c3RyLCAnXG4nKTsKKworICAgICAgaWYgKG5ld2xpbmUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgobmV3bGluZSA+IGFkZHJlc3MtPnN0cikgJiYgKCdccicgPT0gbmV3bGluZVstMV0pKQorICAgICAgICAgICAgbmV3bGluZSAtPSAxOworICAgICAgICAgIGdfc3RyaW5nX3RydW5jYXRlIChhZGRyZXNzLCBuZXdsaW5lIC0gYWRkcmVzcy0+c3RyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBnX3VzbGVlcCAoR19VU0VDX1BFUl9TRUMgLyAxMCk7CisgICAgfQorCisgIGdfY2xvc2UgKGFkZHJlc3NfZmQsIE5VTEwpOworCisgIHJldHVybiBnX3N0cmluZ19mcmVlIChhZGRyZXNzLCBGQUxTRSk7Cit9CisKK2djaGFyICoKK3Rlc3RfZ2V0X2RidXNfZGFlbW9uIChjb25zdCBnY2hhciAqY29uZmlnX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgVGVzdFVzZXIgICAgIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgR1BpZCAgICAgICAgKmRhZW1vbl9waWQpCit7CisgIGdjaGFyICpkYnVzX2RhZW1vbjsKKyAgZ2NoYXIgKmFyZzsKKyAgY29uc3QgZ2NoYXIgKmxpc3Rlbl9hZGRyZXNzID0gTlVMTDsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgLyogd2Ugb2Z0ZW4gaGF2ZSB0byBvdmVycmlkZSB0aGlzIGJlY2F1c2Ugb24gV2luZG93cywgdGhlIGRlZmF1bHQgbWF5IGJlCisgICAqIGF1dG9sYXVuY2g6LCB3aGljaCBpcyBnbG9iYWxseS1zY29wZWQgYW5kIGhlbmNlIHVuc3VpdGFibGUgZm9yCisgICAqIHJlZ3Jlc3Npb24gdGVzdHMgKi8KKyAgbGlzdGVuX2FkZHJlc3MgPSAiLS1hZGRyZXNzPSIgVEVTVF9MSVNURU47CisKKyAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgeworCisgICAgICBpZiAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBnX3Rlc3RfbWVzc2FnZSAoInNldCBEQlVTX1RFU1RfREFUQSB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nICVzIiwKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUpOworICAgICAgICAgIGdfdGVzdF9za2lwICgiREJVU19URVNUX0RBVEEgbm90IHNldCIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGFyZyA9IGdfc3RyZHVwX3ByaW50ZiAoCisgICAgICAgICAgIi0tY29uZmlnLWZpbGU9JXMvJXMiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSwgY29uZmlnX2ZpbGUpOworCisgICAgICAvKiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGV4cGVjdGVkIHRvIGdpdmUgYSBzdWl0YWJsZSBhZGRyZXNzLAorICAgICAgICogZG8gbm90IG92ZXJyaWRlIGl0ICovCisgICAgICBsaXN0ZW5fYWRkcmVzcyA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBRElSIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKCItLWNvbmZpZy1maWxlPSVzL2RidXMtMS9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEFESVIiKSk7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKAorICAgICAgICAgICItLWNvbmZpZy1maWxlPSVzL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXJnID0gZ19zdHJkdXAgKCItLXNlc3Npb24iKTsKKyAgICB9CisKKyAgZGJ1c19kYWVtb24gPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFFTU9OIikpOworCisgIGlmIChkYnVzX2RhZW1vbiA9PSBOVUxMKQorICAgIGRidXNfZGFlbW9uID0gZ19zdHJkdXAgKCJkYnVzLWRhZW1vbiIpOworCisgIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQUVNT05fQUREUkVTUyIpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwgfHwgdXNlciAhPSBURVNUX1VTRVJfTUUpCisgICAgICAgIHsKKyAgICAgICAgICBnX3Rlc3Rfc2tpcCAoImNhbm5vdCB1c2UgREJVU19URVNUX0RBRU1PTl9BRERSRVNTIGZvciAiCisgICAgICAgICAgICAgICJ1bnVzYWxseS1jb25maWd1cmVkIGRidXMtZGFlbW9uIik7CisgICAgICAgICAgYWRkcmVzcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3MgPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFFTU9OX0FERFJFU1MiKSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhZGRyZXNzID0gc3Bhd25fZGJ1c19kYWVtb24gKGRidXNfZGFlbW9uLCBhcmcsCisgICAgICAgICAgbGlzdGVuX2FkZHJlc3MsIHVzZXIsIGRhZW1vbl9waWQpOworICAgIH0KKworICBnX2ZyZWUgKGRidXNfZGFlbW9uKTsKKyAgZ19mcmVlIChhcmcpOworICByZXR1cm4gYWRkcmVzczsKK30KKworREJ1c0Nvbm5lY3Rpb24gKgordGVzdF9jb25uZWN0X3RvX2J1cyAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgY29uc3QgZ2NoYXIgKmFkZHJlc3MpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGRidXNfYm9vbF90IG9rOworCisgIGNvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChhZGRyZXNzLCAmZXJyb3IpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKyAgZ19hc3NlcnQgKGNvbm4gIT0gTlVMTCk7CisKKyAgb2sgPSBkYnVzX2J1c19yZWdpc3RlciAoY29ubiwgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgIGdfYXNzZXJ0IChvayk7CisgIGdfYXNzZXJ0IChkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm4pICE9IE5VTEwpOworCisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoY3R4LCBjb25uKTsKKyAgcmV0dXJuIGNvbm47Cit9CisKK0RCdXNDb25uZWN0aW9uICoKK3Rlc3RfY29ubmVjdF90b19idXNfYXNfdXNlciAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICBUZXN0VXNlciB1c2VyKQoreworICAvKiBGb3Igbm93IHdlIG9ubHkgZG8gdGVzdHMgbGlrZSB0aGlzIG9uIExpbnV4LCBiZWNhdXNlIEkgZG9uJ3Qga25vdyBob3cKKyAgICogc2FmZSB0aGlzIHVzZSBvZiBzZXRyZXN1aWQoKSBpcyBvbiBvdGhlciBwbGF0Zm9ybXMgKi8KKyNpZiBkZWZpbmVkKEhBVkVfR0VUUkVTVUlEKSAmJiBkZWZpbmVkKEhBVkVfU0VUUkVTVUlEKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKyAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsKKyAgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHdkOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgY29uc3QgY2hhciAqdXNlcm5hbWU7CisKKyAgc3dpdGNoICh1c2VyKQorICAgIHsKKyAgICAgIGNhc2UgVEVTVF9VU0VSX01FOgorICAgICAgICByZXR1cm4gdGVzdF9jb25uZWN0X3RvX2J1cyAoY3R4LCBhZGRyZXNzKTsKKworICAgICAgY2FzZSBURVNUX1VTRVJfUk9PVDoKKyAgICAgICAgdXNlcm5hbWUgPSAicm9vdCI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRFU1RfVVNFUl9NRVNTQUdFQlVTOgorICAgICAgICB1c2VybmFtZSA9IERCVVNfVVNFUjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVEVTVF9VU0VSX09USEVSOgorICAgICAgICB1c2VybmFtZSA9IERCVVNfVEVTVF9VU0VSOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ19yZXR1cm5fdmFsX2lmX3JlYWNoZWQgKE5VTEwpOworICAgIH0KKworICBpZiAoZ2V0cmVzdWlkICgmcnVpZCwgJmV1aWQsICZzdWlkKSAhPSAwKQorICAgIGdfZXJyb3IgKCJnZXRyZXN1aWQ6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBpZiAocnVpZCAhPSAwIHx8IGV1aWQgIT0gMCB8fCBzdWlkICE9IDApCisgICAgeworICAgICAgZ190ZXN0X21lc3NhZ2UgKCJub3QgdWlkIDAgKHJ1aWQ9JWxkIGV1aWQ9JWxkIHN1aWQ9JWxkKSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHJ1aWQsICh1bnNpZ25lZCBsb25nKSBldWlkLCAodW5zaWduZWQgbG9uZykgc3VpZCk7CisgICAgICBnX3Rlc3Rfc2tpcCAoIm5vdCB1aWQgMCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHB3ZCA9IGdldHB3bmFtICh1c2VybmFtZSk7CisKKyAgaWYgKHB3ZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdfdGVzdF9tZXNzYWdlICgiZ2V0cHduYW0oXCIlc1wiKTogJXMiLCB1c2VybmFtZSwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdfdGVzdF9za2lwICgibm90IHVpZCAwIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSW1wZXJzb25hdGUgdGhlIGRlc2lyZWQgdXNlciB3aGlsZSB3ZSBjb25uZWN0IHRvIHRoZSBidXMuCisgICAqIFRoaXMgc2hvdWxkIHdvcmssIGJlY2F1c2Ugd2UncmUgcm9vdC4gKi8KKyAgaWYgKHNldHJlc3VpZCAocHdkLT5wd191aWQsIHB3ZC0+cHdfdWlkLCAwKSAhPSAwKQorICAgIGdfZXJyb3IgKCJzZXRyZXN1aWQoJWxkLCAoc2FtZSksIDApOiAlcyIsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBwd2QtPnB3X3VpZCwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBjb25uID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoY3R4LCBhZGRyZXNzKTsKKworICAvKiBnbyBiYWNrIHRvIG91ciBzYXZlZCB1aWQgKi8KKyAgaWYgKHNldHJlc3VpZCAoMCwgMCwgMCkgIT0gMCkKKyAgICBnX2Vycm9yICgic2V0cmVzdWlkKDAsIDAsIDApOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgcmV0dXJuIGNvbm47CisKKyNlbHNlCisKKyAgc3dpdGNoICh1c2VyKQorICAgIHsKKyAgICAgIGNhc2UgVEVTVF9VU0VSX01FOgorICAgICAgICByZXR1cm4gdGVzdF9jb25uZWN0X3RvX2J1cyAoY3R4LCBhZGRyZXNzKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ190ZXN0X3NraXAgKCJzZXRyZXN1aWQoKSBub3QgYXZhaWxhYmxlLCBvciB1bnN1cmUgYWJvdXQgIgorICAgICAgICAgICAgImNyZWRlbnRpYWxzLXBhc3Npbmcgc2VtYW50aWNzIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjZW5kaWYKK30KKwordm9pZAordGVzdF9raWxsX3BpZCAoR1BpZCBwaWQpCit7CisjaWZkZWYgREJVU19XSU4KKyAgaWYgKHBpZCAhPSBOVUxMKQorICAgIFRlcm1pbmF0ZVByb2Nlc3MgKHBpZCwgMSk7CisjZWxzZQorICBpZiAocGlkID4gMCkKKyAgICBraWxsIChwaWQsIFNJR1RFUk0pOworI2VuZGlmCit9CisKK3N0YXRpYyBnYm9vbGVhbgordGltZV9vdXQgKGdwb2ludGVyIGRhdGEpCit7CisgIGdfZXJyb3IgKCJ0aW1lZCBvdXQiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgR19PU19VTklYCitzdGF0aWMgdm9pZAord3JhcF9hYm9ydCAoaW50IHNpZ25hbCkKK3sKKyAgYWJvcnQgKCk7Cit9CisjZW5kaWYKKwordm9pZAordGVzdF9pbml0IChpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworICBnX3Rlc3RfaW5pdCAoYXJnY3AsIGFyZ3ZwLCBOVUxMKTsKKyAgZ190ZXN0X2J1Z19iYXNlICgiaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Iik7CisKKyAgLyogUHJldmVudCB0ZXN0cyBmcm9tIGhhbmdpbmcgZm9yZXZlci4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBsb25nIGVub3VnaAorICAgKiB0aGF0IGFueSByZWFzb25hYmxlIHJlZ3Jlc3Npb24gdGVzdCBvbiBhbnkgcmVhc29uYWJsZSBoYXJkd2FyZSB3b3VsZAorICAgKiBoYXZlIGZpbmlzaGVkLiAqLworI2RlZmluZSBUSU1FT1VUIDYwCisKKyAgZ190aW1lb3V0X2FkZF9zZWNvbmRzIChUSU1FT1VULCB0aW1lX291dCwgTlVMTCk7CisjaWZkZWYgR19PU19VTklYCisgIC8qIFRoZSBHTGliIG1haW4gbG9vcCBtaWdodCBub3QgYmUgcnVubmluZyAod2UgZG9uJ3QgdXNlIGl0IGluIGV2ZXJ5CisgICAqIHRlc3QpLiBEaWUgd2l0aCBTSUdBTFJNIHNob3J0bHkgYWZ0ZXIgaWYgbmVjZXNzYXJ5LiAqLworICBhbGFybSAoVElNRU9VVCArIDEwKTsKKworICAvKiBHZXQgYSBjb3JlIGR1bXAgZnJvbSB0aGUgU0lHQUxSTS4gKi8KKyAgICB7CisgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCA9IHsgfTsKKworICAgICAgYWN0LnNhX2hhbmRsZXIgPSB3cmFwX2Fib3J0OworCisgICAgICBzaWdhY3Rpb24gKFNJR0FMUk0sICZhY3QsIE5VTEwpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkCit0ZXN0X3Byb2dyZXNzIChjaGFyIHN5bWJvbCkKK3sKKyAgaWYgKGdfdGVzdF92ZXJib3NlICgpICYmIGlzYXR0eSAoMSkpCisgICAgZ19wcmludCAoIiVjIiwgc3ltYm9sKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC11dGlscy1nbGliLmggYi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWNlZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB0ZXN0cyB0aGF0IHJlbHkgb24gR0xpYgorICoKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDEzLTIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFRFU1RfVVRJTFNfR0xJQl9ICisjZGVmaW5lIFRFU1RfVVRJTFNfR0xJQl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKworLyoKKyAqIE11bHRpLXVzZXIgc3VwcG9ydCBmb3IgcmVncmVzc2lvbiB0ZXN0cyBydW4gd2l0aCByb290IHByaXZpbGVnZXMgaW4KKyAqIGEgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0uCisgKgorICogQSBkZXZlbG9wZXIgd291bGQgbm9ybWFsbHkgcnVuIHRoZSB0ZXN0cyBhcyB0aGVpciBvd24gdWlkLiBUZXN0cyBydW4KKyAqIGFzIFRFU1RfVVNFUl9NRSBhcmUgcnVuLCBhbmQgdGhlIG90aGVycyBhcmUgc2tpcHBlZC4KKyAqCisgKiBJbiBhIENJIHN5c3RlbSB0aGF0IGhhcyBhY2Nlc3MgdG8gcm9vdCBwcml2aWxlZ2VzLCBtb3N0IHRlc3RzIHNob3VsZCBzdGlsbAorICogYmUgcnVuIGFzIGFuIGFyYml0cmFyeSBub24tcm9vdCB1c2VyLCBhcyBhYm92ZS4KKyAqCisgKiBDZXJ0YWluIHRlc3RzIGNhbiB1c2VmdWxseSBiZSBydW4gYWdhaW4sIGFzIHJvb3QuIFdoZW4gdGhpcyBpcyBkb25lLAorICogdGVzdHMgdXNpbmcgVEVTVF9VU0VSX1JPT1QsIFRFU1RfVVNFUl9NRVNTQUdFQlVTIGFuZC9vciBURVNUX1VTRVJfT1RIRVIKKyAqIGNhbiBleGVyY2lzZSBzaXR1YXRpb25zIHRoYXQgb25seSBhcmlzZSB3aGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB1aWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogV2hhdGV2ZXIgdXNlciBoYXBwZW5zIHRvIGJlIHJ1bm5pbmcgdGhlIHJlZ3Jlc3Npb24gdGVzdDsKKyAgICAgKiBzdWNoIHRlc3RzIGFsc28gd29yayBvbiBXaW5kb3dzICovCisgICAgVEVTVF9VU0VSX01FLAorICAgIC8qIE11c3QgYmUgdWlkIDAgb24gVW5peDsgdGhlIHRlc3QgaXMgc2tpcHBlZCBvbiBXaW5kb3dzICovCisgICAgVEVTVF9VU0VSX1JPT1QsCisgICAgLyogVGhlIHVzZXIgd2hvIHdvdWxkIG5vcm1hbGx5IHJ1biB0aGUgc3lzdGVtIGJ1cy4gVGhpcyBpcyB0aGUgREJVU19VU0VSCisgICAgICogZnJvbSBjb25maWd1cmUuYWMsIHVzdWFsbHkgJ21lc3NhZ2VidXMnIGJ1dCBwZXJoYXBzICdkYnVzJyBvcgorICAgICAqICdfZGJ1cycuICovCisgICAgVEVTVF9VU0VSX01FU1NBR0VCVVMsCisgICAgLyogQW4gdW5wcml2aWxlZ2VkIHVzZXIgd2hvIGlzIG5laXRoZXIgcm9vdCBub3IgREJVU19VU0VSLgorICAgICAqIFRoaXMgaXMgREJVU19URVNUX1VTRVIgZnJvbSBjb25maWd1cmUuYWMsIHVzdWFsbHkgJ25vYm9keScuICovCisgICAgVEVTVF9VU0VSX09USEVSCit9IFRlc3RVc2VyOworCisjZGVmaW5lIHRlc3RfYXNzZXJ0X25vX2Vycm9yKGUpIF90ZXN0X2Fzc2VydF9ub19lcnJvciAoZSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCBfdGVzdF9hc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSwKKyAgICBjb25zdCBjaGFyICpmaWxlLAorICAgIGludCBsaW5lKTsKKworZ2NoYXIgKnRlc3RfZ2V0X2RidXNfZGFlbW9uIChjb25zdCBnY2hhciAqY29uZmlnX2ZpbGUsCisgICAgVGVzdFVzZXIgdXNlciwKKyAgICBHUGlkICpkYWVtb25fcGlkKTsKKworREJ1c0Nvbm5lY3Rpb24gKnRlc3RfY29ubmVjdF90b19idXMgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgIGNvbnN0IGdjaGFyICphZGRyZXNzKTsKK0RCdXNDb25uZWN0aW9uICp0ZXN0X2Nvbm5lY3RfdG9fYnVzX2FzX3VzZXIgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgVGVzdFVzZXIgdXNlcik7CisKK3ZvaWQgdGVzdF9raWxsX3BpZCAoR1BpZCBwaWQpOworCit2b2lkIHRlc3RfaW5pdCAoaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCk7CisKK3ZvaWQgdGVzdF9wcm9ncmVzcyAoY2hhciBzeW1ib2wpOworCisjaWYgIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzgsIDApCisjZGVmaW5lIGdfdGVzdF9za2lwKHMpIG15X3Rlc3Rfc2tpcCAocykKK3N0YXRpYyBpbmxpbmUgdm9pZCBteV90ZXN0X3NraXAgKGNvbnN0IGdjaGFyICpzKQoreworICBnX3Rlc3RfbWVzc2FnZSAoIlNLSVA6ICVzIiwgcyk7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtdXRpbHMuYyBiL3Rlc3QvdGVzdC11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNmNmMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtdXRpbHMuYwpAQCAtMCwwICsxLDM1NyBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCit9IENEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF93YXRjaCAoREJ1c1dhdGNoICp3YXRjaCwKKwkgICB2b2lkICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjZC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3dhdGNoIChEQnVzV2F0Y2ggKndhdGNoLAorCSAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjZC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICBfZGJ1c19sb29wX3RvZ2dsZV93YXRjaCAoY2QtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisJICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY2QtPmxvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorCQl2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjZC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMb29wICpsb29wID0gZGF0YTsKKyAgCisgIGlmIChuZXdfc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgd2hpbGUgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NkYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjZC0+Y29ubmVjdGlvbik7CisgIF9kYnVzX2xvb3BfdW5yZWYgKGNkLT5sb29wKTsKKyAgCisgIGRidXNfZnJlZSAoY2QpOworfQorCitzdGF0aWMgQ0RhdGEqCitjZGF0YV9uZXcgKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQ0RhdGEgKmNkOworCisgIGNkID0gZGJ1c19uZXcwIChDRGF0YSwgMSk7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNkLT5sb29wID0gbG9vcDsKKyAgY2QtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNkLT5jb25uZWN0aW9uKTsKKyAgX2RidXNfbG9vcF9yZWYgKGNkLT5sb29wKTsKKworICByZXR1cm4gY2Q7Cit9CisKK2RidXNfYm9vbF90Cit0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBjdHg7CisgIENEYXRhICpjZDsKKworICBjZCA9IE5VTEw7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCwgTlVMTCk7CisgIAorICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QsIGNkYXRhX2ZyZWUpKQorICAgIGdvdG8gbm9tZW07CisKKworICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZCwgY2RhdGFfZnJlZSkpCisgICAgZ290byBub21lbTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgbm9tZW06CisgIGlmIChjZCkKKyAgICBjZGF0YV9mcmVlIChjZCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKwordm9pZAordGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIGRpZSAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgZGllICgic2V0dGluZyB0aW1lb3V0IGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKK30gU2VydmVyRGF0YTsKKworc3RhdGljIHZvaWQKK3NlcnZlcmRhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqc2QgPSBkYXRhOworCisgIGRidXNfc2VydmVyX3VucmVmIChzZC0+c2VydmVyKTsKKyAgX2RidXNfbG9vcF91bnJlZiAoc2QtPmxvb3ApOworICAKKyAgZGJ1c19mcmVlIChzZCk7Cit9CisKK3N0YXRpYyBTZXJ2ZXJEYXRhKgorc2VydmVyZGF0YV9uZXcgKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICpzZXJ2ZXIpCit7CisgIFNlcnZlckRhdGEgKnNkOworCisgIHNkID0gZGJ1c19uZXcwIChTZXJ2ZXJEYXRhLCAxKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2QtPmxvb3AgPSBsb29wOworICBzZC0+c2VydmVyID0gc2VydmVyOworCisgIGRidXNfc2VydmVyX3JlZiAoc2QtPnNlcnZlcik7CisgIF9kYnVzX2xvb3BfcmVmIChzZC0+bG9vcCk7CisKKyAgcmV0dXJuIHNkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworCisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNvbnRleHQtPmxvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlcnZlcl90aW1lb3V0IChEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoY29udGV4dC0+bG9vcCwgdGltZW91dCk7Cit9CisKK2RidXNfYm9vbF90Cit0ZXN0X3NlcnZlcl9zZXR1cCAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAqc2VydmVyKQoreworICBEQnVzTG9vcCAqbG9vcCA9IGN0eDsKKyAgU2VydmVyRGF0YSAqc2Q7CisKKyAgc2QgPSBzZXJ2ZXJkYXRhX25ldyAobG9vcCwgc2VydmVyKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJkYXRhX2ZyZWUpKQorICAgIHsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIHNkID0gc2VydmVyZGF0YV9uZXcgKGxvb3AsIHNlcnZlcik7CisgIGlmIChzZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCwgc2VydmVyZGF0YV9mcmVlKSkKKyAgICB7CisgICAgICBnb3RvIG5vbWVtOworICAgIH0gICAKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgaWYgKHNkKQorICAgIHNlcnZlcmRhdGFfZnJlZSAoc2QpOworICAKKyAgdGVzdF9zZXJ2ZXJfc2h1dGRvd24gKGxvb3AsIHNlcnZlcik7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK3Rlc3Rfc2VydmVyX3NodXRkb3duIChUZXN0TWFpbkNvbnRleHQgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqc2VydmVyKQoreworICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChzZXJ2ZXIpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBkaWUgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZGllICgic2V0dGluZyB0aW1lb3V0IGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworfQorCitUZXN0TWFpbkNvbnRleHQgKgordGVzdF9tYWluX2NvbnRleHRfZ2V0ICh2b2lkKQoreworICByZXR1cm4gX2RidXNfbG9vcF9uZXcgKCk7Cit9CisKK1Rlc3RNYWluQ29udGV4dCAqCit0ZXN0X21haW5fY29udGV4dF9yZWYgKFRlc3RNYWluQ29udGV4dCAqY3R4KQoreworICByZXR1cm4gX2RidXNfbG9vcF9yZWYgKGN0eCk7Cit9CisKK3ZvaWQgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKFRlc3RNYWluQ29udGV4dCAqY3R4KQoreworICBfZGJ1c19sb29wX3VucmVmIChjdHgpOworfQorCit2b2lkIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgIG1heV9ibG9jaykKK3sKKyAgX2RidXNfbG9vcF9pdGVyYXRlIChjdHgsIG1heV9ibG9jayk7Cit9CisKK3ZvaWQKK3Rlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgIHZvaWQgKmRhdGEpCit7CisgIERCdXNNZXNzYWdlICoqbWVzc2FnZV9wID0gZGF0YTsKKworICAqbWVzc2FnZV9wID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBjKTsKKyAgX2RidXNfYXNzZXJ0ICgqbWVzc2FnZV9wICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXV0aWxzLmggYi90ZXN0L3Rlc3QtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZhZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXV0aWxzLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBURVNUX1VUSUxTX0gKKyNkZWZpbmUgVEVTVF9VVElMU19ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+Cit0eXBlZGVmIERCdXNMb29wIFRlc3RNYWluQ29udGV4dDsKKworVGVzdE1haW5Db250ZXh0ICp0ZXN0X21haW5fY29udGV4dF9nZXQgICAgICAgICAgICAodm9pZCk7CitUZXN0TWFpbkNvbnRleHQgKnRlc3RfbWFpbl9jb250ZXh0X3JlZiAgICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCk7Cit2b2lkICAgICAgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCk7Cit2b2lkICAgICAgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgbWF5X2Jsb2NrKTsKKworZGJ1c19ib29sX3QgdGVzdF9jb25uZWN0aW9uX3NldHVwICAgICAgICAgICAgICAgICAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gICAgICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworZGJ1c19ib29sX3QgdGVzdF9zZXJ2ZXJfc2V0dXAgICAgICAgICAgICAgICAgICAgICAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICpzZXJ2ZXIpOwordm9pZCAgICAgICAgdGVzdF9zZXJ2ZXJfc2h1dGRvd24gICAgICAgICAgICAgICAgICAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICpzZXJ2ZXIpOwordm9pZCAgICAgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICpwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvdWlkLXBlcm1pc3Npb25zLmMgYi90ZXN0L3VpZC1wZXJtaXNzaW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjdlYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VpZC1wZXJtaXNzaW9ucy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGRidXMtZGFlbW9uJ3MgdWlkLWJhc2VkIGhhcmRlbmluZworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnYm9vbGVhbiBza2lwOworCisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBHRXJyb3IgKmdlOworCisgICAgR1BpZCBkYWVtb25fcGlkOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47Cit9IEZpeHR1cmU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpjb25maWdfZmlsZTsKKyAgICBUZXN0VXNlciB1c2VyOworICAgIGdib29sZWFuIGV4cGVjdF9zdWNjZXNzOworfSBDb25maWc7CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoY29uZmlnID8gY29uZmlnLT5jb25maWdfZmlsZSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9VU0VSX01FU1NBR0VCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmYtPmRhZW1vbl9waWQpOworCisgIGlmIChhZGRyZXNzID09IE5VTEwpCisgICAgeworICAgICAgZi0+c2tpcCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGYtPmNvbm4gPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzX2FzX3VzZXIgKGYtPmN0eCwgYWRkcmVzcywKKyAgICAgIGNvbmZpZyA/IGNvbmZpZy0+dXNlciA6IFRFU1RfVVNFUl9NRSk7CisKKyAgaWYgKGYtPmNvbm4gPT0gTlVMTCkKKyAgICBmLT5za2lwID0gVFJVRTsKKworICBnX2ZyZWUgKGFkZHJlc3MpOworfQorCitzdGF0aWMgdm9pZAordGVzdF91YWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzUGVuZGluZ0NhbGwgKnBjOworICBEQnVzTWVzc2FnZUl0ZXIgYXJnc19pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLCAiVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Iik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG0sICZhcmdzX2l0ZXIpOworCisgIC8qIEFwcGVuZCBhbiBlbXB0eSBhe3NzfSAoc3RyaW5nID0+IHN0cmluZyBkaWN0aW9uYXJ5KS4gKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAie3NzfSIsICZhcnJfaXRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcmdzX2l0ZXIsICZhcnJfaXRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+Y29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBpZiAoY29uZmlnLT5leHBlY3Rfc3VjY2VzcykKKyAgICB7CisgICAgICAvKiBpdCBzdWNjZWVkcyAqLworICAgICAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwKKyAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpdCBmYWlscywgeWllbGRpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9uZSBzdHJpbmcgYXJndW1lbnQgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSwgPT0sIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtKSwgPT0sCisgICAgICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInMiKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbW9uaXRvciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKyAgZGJ1c191aW50MzJfdCBub19mbGFncyA9IDA7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICAvKiBBcHBlbmQgYW4gZW1wdHkgYXMgKHN0cmluZyBhcnJheSkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgInMiLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJnc19pdGVyLAorICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmbm9fZmxhZ3MpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmNvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKGNvbmZpZy0+ZXhwZWN0X3N1Y2Nlc3MpCisgICAgeworICAgICAgLyogaXQgc3VjY2VlZHMgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSwgPT0sCisgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogaXQgZmFpbHMsIHlpZWxkaW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvbmUgc3RyaW5nIGFyZ3VtZW50ICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksID09LCBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7CisgIGdfY2xlYXJfZXJyb3IgKCZmLT5nZSk7CisKKyAgaWYgKGYtPmNvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5jb25uKTsKKyAgICAgIGYtPmNvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+ZGFlbW9uX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZi0+ZGFlbW9uX3BpZCA9IDA7CisgICAgfQorCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCitzdGF0aWMgQ29uZmlnIHJvb3Rfb2tfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfUk9PVCwKKyAgICBUUlVFCit9OworCitzdGF0aWMgQ29uZmlnIG1lc3NhZ2VidXNfb2tfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfTUVTU0FHRUJVUywKKyAgICBUUlVFCit9OworCitzdGF0aWMgQ29uZmlnIG90aGVyX2ZhaWxfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfT1RIRVIsCisgICAgRkFMU0UKK307CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgdXNlZCB0byBiZSBhbGxvd2VkIGJ5IGRidXMtZGFlbW9uIGZvciByb290CisgICAqIGFuZCBtZXNzYWdlYnVzIGJ1dCBub3QgZm9yIG90aGVyIHVzZXJzIChhbHRob3VnaCBzeXN0ZW0uY29uZiBmb3JiaWRzIGl0CisgICAqIGZvciBldmVyeW9uZSwgYW5kIGl0J3MgdXNlbGVzcykuIEl0IGlzIG5vdyBoYXJkLWNvZGVkIHRvIGZhaWwgb24gYQorICAgKiBzeXN0ZW0gYnVzIGZvciBldmVyeW9uZSwgc28gZG9uJ3QgYXNzZXJ0IHRoYXQgcm9vdCBhbmQgbWVzc2FnZWJ1cworICAgKiBtYXkgY2FsbCBpdDsgY29udGludWUgdG8gYXNzZXJ0IHRoYXQgaXQgaXMgZGVuaWVkIGZvciB1bnByaXZpbGVnZWQKKyAgICogdXNlcnMgdGhvdWdoLiAqLworICBnX3Rlc3RfYWRkICgiL3VpZC1wZXJtaXNzaW9ucy91YWUvb3RoZXIiLCBGaXh0dXJlLCAmb3RoZXJfZmFpbF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91YWUsIHRlYXJkb3duKTsKKworICAvKiBCZWNvbWVNb25pdG9yIGhhcyB0aGUgYmVoYXZpb3VyIHRoYXQgVUFFIHVzZWQgdG8gaGF2ZS4gKi8KKyAgZ190ZXN0X2FkZCAoIi91aWQtcGVybWlzc2lvbnMvbW9uaXRvci9yb290IiwgRml4dHVyZSwgJnJvb3Rfb2tfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfbW9uaXRvciwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3VpZC1wZXJtaXNzaW9ucy9tb25pdG9yL21lc3NhZ2VidXMiLCBGaXh0dXJlLCAmbWVzc2FnZWJ1c19va19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tb25pdG9yLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvdWlkLXBlcm1pc3Npb25zL21vbml0b3Ivb3RoZXIiLCBGaXh0dXJlLCAmb3RoZXJfZmFpbF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tb25pdG9yLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VudXNlZC1jb2RlLWdjLnB5IGIvdGVzdC91bnVzZWQtY29kZS1nYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTg1OTdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bnVzZWQtY29kZS1nYy5weQpAQCAtMCwwICsxLDI0MiBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IHJlCisKKyMjIGhhc2ggZnJvbSBzeW1ib2wgbmFtZSB0byBsaXN0IG9mIHN5bWJvbHMgd2l0aCB0aGF0IG5hbWUsCisjIyB3aGVyZSB0aGUgbGlzdCBvZiBzeW1ib2xzIGNvbnRhaW5zIGEgbGlzdCByZXByZXNlbnRpbmcgZWFjaCBzeW1ib2wKK3N5bWJvbHMgPSB7fQorcm9vdHMgPSB7fQorCitkZWYgY3JlYXRlQmFja2xpbmtzKG5hbWUsIHN5bXMpOgorICAgIGZvciBzIGluIHN5bXM6CisgICAgICAgIHJlZnMgPSBzWzJdCisgICAgICAgIGZvciByIGluIHJlZnM6CisgICAgICAgICAgICAjIyBmb3IgZWFjaCByZWYsIGFkZCBvdXJzZWx2ZXMgYXMgYSByZWZlcmVuY2VyCisgICAgICAgICAgICBpZiBzeW1ib2xzLmhhc19rZXkocik6CisgICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHN5bWJvbHNbcl0KKyAgICAgICAgICAgICAgICBmb3IgdCBpbiB0YXJnZXRzOgorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiB0WzVdOgorICAgICAgICAgICAgICAgICAgICAgICAgdFs1XS5hcHBlbmQobmFtZSkKKworZGVmIG1hcmtTeW1ib2woZnJtLCBuYW1lKToKKyAgICBpZiBub3Qgc3ltYm9scy5oYXNfa2V5KG5hbWUpOgorICAgICAgICBwcmludCAiJXMgcmVmZXJlbmNlZCBidXQgd2FzIG5vdCBpbiB0aGUgb2JqZHVtcCIKKyAgICBzeW1zID0gc3ltYm9sc1tuYW1lXQorICAgICMjIHByaW50IGFtYmlndW91cyByZWZlcmVuY2VzIHVubGVzcyB0aGV5IGFyZSBpbnRlcm5hbCBub2lzZSBsaWtlICIuTDEyOSIKKyAgICBpZiBsZW4oc3ltcykgPiAxIGFuZCBuYW1lWzBdICE9ICcuJzoKKyAgICAgICAgcHJpbnQgIlJlZmVyZW5jZSB0byBzeW1ib2wgJyVzJyBmcm9tICclcycgaXMgYW1iaWd1b3VzLCBtYXJraW5nIGFsbCAnJXMnIiAlIChuYW1lLCBmcm0sIG5hbWUpCisgICAgICAgIHByaW50IHN5bXMKKyAgICBmb3IgcyBpbiBzeW1zOgorICAgICAgICBpZiBzWzRdOgorICAgICAgICAgICAgcGFzcyAjIyBhbHJlYWR5IG1hcmtlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc1s0XSA9IDEKKyAgICAgICAgICAgIHJlZnMgPSBzWzJdCisgICAgICAgICAgICBmb3IgciBpbiByZWZzOgorICAgICAgICAgICAgICAgIG1hcmtTeW1ib2woc1swXSwgcikKKworZGVmIGNtcEZpbGVuYW1lKGEsIGIpOgorICAgIHYgPSBjbXAoYVsxXSwgYlsxXSkKKyAgICBpZiB2ID09IDA6CisgICAgICAgIHYgPSBjbXAoYVswXSwgYlswXSkKKyAgICByZXR1cm4gdgorCitkZWYgc2l6ZUFzU3RyaW5nKGJ5dGVzKToKKyAgICBpZiBieXRlcyA8IDEwMjQ6CisgICAgICAgIHJldHVybiAiJWQgYnl0ZXMiICUgYnl0ZXMKKyAgICBlbGlmIGJ5dGVzIDwgMTAyNCoxMDI0OgorICAgICAgICByZXR1cm4gIiUuMmdLIiAlIChieXRlcyAvIDEwMjQuMCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiUuMmdNIiAlIChieXRlcyAvIDEwMjQuMCAvIDEwMjQuMCkKKworZGVmIHByaW50TG9zdCgpOgorICAgIGxpc3QgPSBbXQorICAgIGZpbGVuYW1lID0gTm9uZQorICAgIGZvciAobmFtZSwgc3ltcykgaW4gc3ltYm9scy5pdGVtcygpOgorICAgICAgICBzID0gc3ltc1swXSAjIyB3ZSBhbHdheXMgbWFyayBhbGwgb3Igbm9uZSBmb3Igbm93CisgICAgICAgIGlmIG5vdCBzWzRdIGFuZCBuYW1lWzBdICE9ICcuJzogIyMgc2tpcCAuTDEyOSB0eXBlIHN5bWJvbHMKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc1szXQorICAgICAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gInVua25vd24gZmlsZSIKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kICgobmFtZSwgZmlsZW5hbWUsIHNbNV0sIHNbN10pKQorCisgICAgZmlsZV9zdW1tYXJpZXMgPSBbXQorICAgIHRvdGFsX3VudXNlZCA9IDAKKyAgICB0b3RhbF90aGlzX2ZpbGUgPSAwCisgICAgZmlsZW5hbWUgPSBOb25lCisgICAgbGlzdC5zb3J0KGNtcEZpbGVuYW1lKQorICAgIGZvciBsIGluIGxpc3Q6CisgICAgICAgIG5leHRfZmlsZW5hbWUgPSBsWzFdCisgICAgICAgIGlmIG5leHRfZmlsZW5hbWUgIT0gZmlsZW5hbWU6CisgICAgICAgICAgICBpZiB0b3RhbF90aGlzX2ZpbGUgPiAwOgorICAgICAgICAgICAgICAgIGZpbGVfc3VtbWFyaWVzLmFwcGVuZCAoIiAgJXMgbWF5IGJlIHVudXNlZCBpbiAlcyIgJSAoc2l6ZUFzU3RyaW5nKHRvdGFsX3RoaXNfZmlsZSksIGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHByaW50ICIlcyBoYXMgdGhlc2Ugc3ltYm9scyBub3QgcmVhY2hhYmxlIGZyb20gZXhwb3J0ZWQgc3ltYm9sczoiICUgbmV4dF9maWxlbmFtZQorICAgICAgICAgICAgZmlsZW5hbWUgPSBuZXh0X2ZpbGVuYW1lCisgICAgICAgICAgICB0b3RhbF90aGlzX2ZpbGUgPSAwCisgICAgICAgIHByaW50ICIgICAgJXMgJXMiICUgKGxbMF0sIHNpemVBc1N0cmluZyhsWzNdKSkKKyAgICAgICAgdG90YWxfdW51c2VkID0gdG90YWxfdW51c2VkICsgbFszXQorICAgICAgICB0b3RhbF90aGlzX2ZpbGUgPSB0b3RhbF90aGlzX2ZpbGUgKyBsWzNdCisgICAgICAgIGZvciB0cmFjZSBpbiBsWzJdOgorICAgICAgICAgICAgcHJpbnQgIiAgICAgICByZWZlcmVuY2VkIGZyb20gJXMiICUgdHJhY2UKKworICAgIGZvciBmcyBpbiBmaWxlX3N1bW1hcmllczoKKyAgICAgICAgcHJpbnQgZnMKKyAgICBwcmludCAiJXMgdG90YWwgbWF5IGJlIHVudXNlZCIgJSBzaXplQXNTdHJpbmcodG90YWxfdW51c2VkKQorCitkZWYgbWFpbigpOgorCisgICAgIyMgMDAwMWFhNDQgPF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YT46CisgICAgc3ltX3JlID0gcmUuY29tcGlsZSAoJyhbMC05YS1mXSspIDwoW14+XSspPjonKQorICAgICMjIDFhYTQ5OiAgICAgICBlOCAwMCAwMCAwMCAwMCAgICAgICAgICBjYWxsICAgMWFhNGUgPF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSsweGE+CisgICAgcmVmX3JlID0gcmUuY29tcGlsZSAoJyA8KFtePl0rKT4gKiQnKQorICAgICMjIC9ob21lL2hwL2RidXMtY3ZzL2RidXMvZGJ1cy9kYnVzLW1lc3NhZ2UuYzoxMzkKKyAgICBmaWxlX3JlID0gcmUuY29tcGlsZSAoJ14oXC9bXjpdLiopOlswLTldKyQnKQorICAgICMjIF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSsweGEKKyAgICBmdW5jbmFtZV9yZSA9IHJlLmNvbXBpbGUgKCcoW14rXSspXCtbMC05YS1meF0rJykKKyAgICAjIyAwMDAwNTQxMCBUIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUKKyAgICBkeW5zeW1fcmUgPSByZS5jb21waWxlICgnVCAoW14gXG5dKykkJykKKyAgICAKKyAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCisKKyAgICBjb21tYW5kID0gIiIiCisgICAgb2JqZHVtcCAtRCAtLWRlbWFuZ2xlIC1sICVzCisgICAgIiIiICUgZmlsZW5hbWUKKworICAgIGNvbW1hbmQgPSBzdHJpbmcuc3RyaXAgKGNvbW1hbmQpCisKKyAgICBwcmludCAiUnVubmluZzogJXMiICUgY29tbWFuZAorICAgIAorICAgIGYgPSBvcy5wb3Blbihjb21tYW5kKSAgICAKKworICAgICMjIGZpcnN0IHdlIGZpbmQgd2hpY2ggZnVuY3Rpb25zIHJlZmVyZW5jZSB3aGljaCBvdGhlciBmdW5jdGlvbnMKKyAgICBjdXJyZW50X3N5bSA9IE5vbmUKKyAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICBmb3IgbCBpbiBsaW5lczoKKyAgICAgICAgYWRkciA9IE5vbmUKKyAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgdGFyZ2V0ID0gTm9uZQorICAgICAgICBmaWxlID0gTm9uZQorICAgICAgICAKKyAgICAgICAgbWF0Y2ggPSBzeW1fcmUubWF0Y2gobCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBhZGRyID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWF0Y2ggPSByZWZfcmUuc2VhcmNoKGwpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGZpbGVfcmUubWF0Y2gobCkKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG1hdGNoLmdyb3VwKDEpCisKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgICMjIDAgc3ltbmFtZSwgMSBhZGRyZXNzLCAyIHJlZmVyZW5jZXMsIDMgZmlsZW5hbWUsIDQgcmVhY2hlZCwgNSByZWZlcmVuY2VkLWJ5IDYgYmFja2xpbmtlZCA3IGFwcHJveCBzaXplCisgICAgICAgICAgICBpdGVtID0gW25hbWUsIGFkZHIsIFtdLCBOb25lLCAwLCBbXSwgMCwgMF0KKyAgICAgICAgICAgIGlmIHN5bWJvbHMuaGFzX2tleShuYW1lKToKKyAgICAgICAgICAgICAgICBzeW1ib2xzW25hbWVdLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzeW1ib2xzW25hbWVdID0gW2l0ZW1dCisKKyAgICAgICAgICAgIGlmIGN1cnJlbnRfc3ltOgorICAgICAgICAgICAgICAgIHByZXZfYWRkciA9IGxvbmcoY3VycmVudF9zeW1bMV0sIDE2KQorICAgICAgICAgICAgICAgIG91cl9hZGRyID0gbG9uZyhpdGVtWzFdLCAxNikKKyAgICAgICAgICAgICAgICBpdGVtWzddID0gb3VyX2FkZHIgLSBwcmV2X2FkZHIKKyAgICAgICAgICAgICAgICBpZiBpdGVtWzddIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkNvbXB1dGVkIG5lZ2F0aXZlIHNpemUgJWQgZm9yICVzIiAlIChpdGVtWzddLCBpdGVtWzBdKQorICAgICAgICAgICAgICAgICAgICBpdGVtWzddID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY3VycmVudF9zeW0gPSBpdGVtCisgICAgICAgICAgICAKKyAgICAgICAgZWxpZiB0YXJnZXQgYW5kIGN1cnJlbnRfc3ltOgorICAgICAgICAgICAgbWF0Y2ggPSBmdW5jbmFtZV9yZS5tYXRjaCh0YXJnZXQpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAjIyBkdW1wIHRoZSAiK2FkZHJlc3MiCisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHRhcmdldCA9PSBjdXJyZW50X3N5bVswXToKKyAgICAgICAgICAgICAgICBwYXNzICMjIHNraXAgc2VsZi1yZWZlcmVuY2VzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN1cnJlbnRfc3ltWzJdLmFwcGVuZCAodGFyZ2V0KQorCisgICAgICAgIGVsaWYgZmlsZSBhbmQgY3VycmVudF9zeW06CisgICAgICAgICAgICBpZiBmaWxlLnN0YXJ0c3dpdGgoJy91c3IvaW5jbHVkZScpOgorICAgICAgICAgICAgICAgICMjIGlubGluZWQgbGliYyB0aGluZ3kKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIGN1cnJlbnRfc3ltWzBdLnN0YXJ0c3dpdGgoJy5kZWJ1ZycpOgorICAgICAgICAgICAgICAgICMjIGRlYnVnIGluZm8KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIGN1cnJlbnRfc3ltWzNdIGFuZCBjdXJyZW50X3N5bVszXSAhPSBmaWxlOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiAoIiVzIGluIGJvdGggJXMgYW5kICVzIiAlIChjdXJyZW50X3N5bVswXSwgY3VycmVudF9zeW1bM10sIGZpbGUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdXJyZW50X3N5bVszXSA9IGZpbGUKKworICAgICMjIG5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIHJvb3RzIChleHBvcnRlZCBzeW1ib2xzKQorICAgIGNvbW1hbmQgPSAibm0gLUQgJXMiICUgZmlsZW5hbWUKKyAgICBwcmludCAiUnVubmluZzogJXMiICUgY29tbWFuZAorICAgIGYgPSBvcy5wb3Blbihjb21tYW5kKQorICAgIGxpbmVzID0gZi5yZWFkbGluZXMgKCkKKyAgICBmb3IgbCBpbiBsaW5lczoKKyAgICAgICAgbWF0Y2ggPSBkeW5zeW1fcmUuc2VhcmNoKGwpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICBpZiByb290cy5oYXNfa2V5KG5hbWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic3ltYm9sICVzIGV4cG9ydGVkIHR3aWNlPyIgJSBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByb290c1tuYW1lXSA9IDEKKworICAgIHByaW50ICIlZCBzeW1ib2xzIGV4cG9ydGVkIGZyb20gdGhpcyBvYmplY3QiICUgbGVuKHJvb3RzKQorCisgICAgIyMgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIG9ubHkgaW5kaXJlY3RseSwgc28gd2UgZG9uJ3QKKyAgICAjIyBub3RpY2UgdGhleSBhcmUgdXNlZC4gTWFudWFsbHkgYWRkIHRoZW0gYXMgcm9vdHMuLi4KKyAgICB2dGFibGVfcm9vdHMgPSBbJ3VuaXhfZmluYWxpemUnLAorICAgICAgICAgICAgICAgICAgICAndW5peF9oYW5kbGVfd2F0Y2gnLAorICAgICAgICAgICAgICAgICAgICAndW5peF9kaXNjb25uZWN0JywKKyAgICAgICAgICAgICAgICAgICAgJ3VuaXhfY29ubmVjdGlvbl9zZXQnLAorICAgICAgICAgICAgICAgICAgICAndW5peF9kb19pdGVyYXRpb24nLAorICAgICAgICAgICAgICAgICAgICAndW5peF9saXZlX21lc3NhZ2VzX2NoYW5nZWQnLAorICAgICAgICAgICAgICAgICAgICAndW5peF9nZXRfdW5peF9mZCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X2RhdGFfY29va2llX3NoYTFfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X2RhdGFfZXh0ZXJuYWxfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfc2VydmVyX2RhdGFfY29va2llX3NoYTFfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfY29va2llX3NoYTFfbWVjaCcsICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZXh0ZXJuYWxfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2gnLAorICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX2NsaWVudF9zaHV0ZG93bl9leHRlcm5hbF9tZWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCcsCisgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfc2VydmVyX3NodXRkb3duX2V4dGVybmFsX21lY2gnCisgICAgICAgICAgICAgICAgICAgIF0KKworICAgIGZvciB2ciBpbiB2dGFibGVfcm9vdHM6CisgICAgICAgIGlmIHJvb3RzLmhhc19rZXkodnIpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIlcyBpcyBhbHJlYWR5IGEgcm9vdCIgJSB2cikKKyAgICAgICAgcm9vdHNbdnJdID0gMQorCisgICAgZm9yIGsgaW4gcm9vdHMua2V5cygpOgorICAgICAgICBtYXJrU3ltYm9sKCJyb290IiwgaykKKworICAgIGZvciAoaywgdikgaW4gc3ltYm9scy5pdGVtcygpOgorICAgICAgICBjcmVhdGVCYWNrbGlua3MoaywgdikKKworICAgIHByaW50ICIiIgorCitUaGUgc3ltYm9scyBtZW50aW9uZWQgYmVsb3cgZG9uJ3QgYXBwZWFyIHRvIGJlIHJlYWNoYWJsZSBzdGFydGluZyBmcm9tCit0aGUgZHluYW1pYyBleHBvcnRzIG9mIHRoZSBsaWJyYXJ5LiBIb3dldmVyLCB0aGlzIHByb2dyYW0gaXMgcHJldHR5CitkdW1iOyBhIGxpbWl0YXRpb24gdGhhdCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcyBpcyB0aGF0IGl0IGNhbiBvbmx5Cit0cmFjZSAncmVhY2hhYmxlJyB0aHJvdWdoIGhhcmRjb2RlZCBmdW5jdGlvbiBjYWxscywgaWYgYSBmdW5jdGlvbiBpcworY2FsbGVkIG9ubHkgdGhyb3VnaCBhIHZ0YWJsZSwgaXQgd29uJ3QgYmUgbWFya2VkIHJlYWNoYWJsZSAoYW5kCituZWl0aGVyIHdpbGwgaXRzIGNoaWxkcmVuIGluIHRoZSBjYWxsIGdyYXBoKS4KKworQWxzbywgdGhlIHNpemVzIG1lbnRpb25lZCBhcmUgbW9yZSBvciBsZXNzIGNvbXBsZXRlbHkgYm9ndXMuCisKKyIiIgorICAgIAorICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGFyZSBoYXJkY29kZWQgaW4gYXMgdnRhYmxlIHJvb3RzOiAlcyIgJSB2dGFibGVfcm9vdHMKKyAgICAKKyAgICBwcmludExvc3QoKQorICAgICAgICAKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy8uZ2l0aWdub3JlIGIvdG9vbHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRjZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIwIEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5sbworKi5sYQorZGJ1cy1zZW5kCitkYnVzLW1vbml0b3IKK2RidXMtY2xlYW51cC1zb2NrZXRzCitkYnVzLWxhdW5jaAorZGJ1cy11dWlkZ2VuCisqLmJiCisqLmJiZworKi5nY292CisqLmRhCitkYnVzLXZpZXdlcgorZGJ1cy1nbGliLWJpbmRpbmdzLmgKK3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCitwcmludC1pbnRyb3NwZWN0CitkYnVzLWJ1cy1pbnRyb3NwZWN0LnhtbApkaWZmIC0tZ2l0IGEvdG9vbHMvQW5kcm9pZC5tayBiL3Rvb2xzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MDY2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitkYnVzVG9vbHNDb21tb25DSW5jbHVkZXMgOj0gJChMT0NBTF9QQVRIKS8uLgorZGJ1c1Rvb2xzQ29tbW9uQ0ZsYWdzIDo9IFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIi9ldGMvbWFjaGluZS1pZFwiIFwKKwktV25vLXVudXNlZC1wYXJhbWV0ZXIKK2RidXNUb29sc0NvbW1vblNoYXJlZExpYnJhcmllcyA6PSBsaWJkYnVzCisKKyMgY29tbW9uCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBkYnVzLXByaW50LW1lc3NhZ2UuYyBcCisgICAgICAgIGRidXMtZWNoby5jIFwKKyAgICAgICAgZGJ1cy1zcGFtLmMgXAorICAgICAgICB0b29sLWNvbW1vbi5jCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoZGJ1c1Rvb2xzQ29tbW9uQ0luY2x1ZGVzKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSAkKGRidXNUb29sc0NvbW1vblNoYXJlZExpYnJhcmllcykKK0xPQ0FMX0NGTEFHUyArPSAkKGRidXNUb29sc0NvbW1vbkNGbGFncykKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJkYnVzLXRvb2xzLWNvbW1vbgoraW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIGRidXMtbW9uaXRvcgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGRidXMtbW9uaXRvci5jCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoZGJ1c1Rvb2xzQ29tbW9uQ0luY2x1ZGVzKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSAkKGRidXNUb29sc0NvbW1vblNoYXJlZExpYnJhcmllcykKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZGJ1cy10b29scy1jb21tb24KK0xPQ0FMX0NGTEFHUyArPSAkKGRidXNUb29sc0NvbW1vbkNGbGFncykKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUykKK0xPQ0FMX01PRFVMRSA6PSBkYnVzLW1vbml0b3IKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIGRidXMtc2VuZAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGRidXMtc2VuZC5jCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoZGJ1c1Rvb2xzQ29tbW9uQ0luY2x1ZGVzKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSAkKGRidXNUb29sc0NvbW1vblNoYXJlZExpYnJhcmllcykKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZGJ1cy10b29scy1jb21tb24KK0xPQ0FMX0NGTEFHUyArPSAkKGRidXNUb29sc0NvbW1vbkNGbGFncykKK0xPQ0FMX01PRFVMRSA6PSBkYnVzLXNlbmQKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvdG9vbHMvR2V0QWxsTWF0Y2hSdWxlcy5weSBiL3Rvb2xzL0dldEFsbE1hdGNoUnVsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmE3ZTRjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL0dldEFsbE1hdGNoUnVsZXMucHkKQEAgLTAsMCArMSwxMTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgc3lzCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBkYnVzCitpbXBvcnQgdGltZQorCitkZWYgZ2V0X2NtZGxpbmUocGlkKToKKyAgY21kbGluZSA9ICcnCisgIGlmIHBpZCA+IDA6CisgICAgdHJ5OgorICAgICAgcHJvY3BhdGggPSAnL3Byb2MvJyArIHN0cihwaWQpICsgJy9jbWRsaW5lJworICAgICAgd2l0aCBvcGVuKHByb2NwYXRoLCAncicpIGFzIGY6CisgICAgICAgIGNtZGxpbmUgPSAiICIuam9pbihmLnJlYWRsaW5lKCkuc3BsaXQoJ1wwJykpCisgICAgZXhjZXB0OgorICAgICAgcGFzcworICByZXR1cm4gY21kbGluZQorCisjIFBhcnNpbmcgcGFyYW1ldGVycworCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nVGVzdGluZyBELUJ1cyBtYXRjaCBydWxlcycpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlc3Npb24nLCBoZWxwPSdzZXNzaW9uIGJ1cycsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXN5c3RlbScsIGhlbHA9J3N5c3RlbSBidXMnLCBhY3Rpb249InN0b3JlX3RydWUiKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGwnLCBoZWxwPSdwcmludCBhbGwgbWF0Y2ggcnVsZXMnLCBhY3Rpb249InN0b3JlX3RydWUiKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworaWYgYXJncy5zeXN0ZW0gYW5kIGFyZ3Muc2Vzc2lvbjoKKyAgcGFyc2VyLnByaW50X2hlbHAoKQorICBzeXMuZXhpdCgxKQorCisjIEZldGNoIGRhdGEgZnJvbSB0aGUgYnVzIGRyaXZlcgorCitpZiBhcmdzLnN5c3RlbToKKyAgYnVzID0gZGJ1cy5TeXN0ZW1CdXMoKQorZWxzZToKKyAgYnVzID0gZGJ1cy5TZXNzaW9uQnVzKCkKKworcmVtb3RlX29iamVjdCA9IGJ1cy5nZXRfb2JqZWN0KCJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cyIpCitidXNfaWZhY2UgPSBkYnVzLkludGVyZmFjZShyZW1vdGVfb2JqZWN0LCAib3JnLmZyZWVkZXNrdG9wLkRCdXMiKQorc3RhdHNfaWZhY2UgPSBkYnVzLkludGVyZmFjZShyZW1vdGVfb2JqZWN0LCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVidWcuU3RhdHMiKQorCit0cnk6CisgIG1hdGNoX3J1bGVzID0gc3RhdHNfaWZhY2UuR2V0QWxsTWF0Y2hSdWxlcygpCitleGNlcHQ6CisgIHByaW50KCJHZXRDb25uZWN0aW9uTWF0Y2hSdWxlcyBmYWlsZWQ6IGRpZCB5b3UgZW5hYmxlIHRoZSBTdGF0cyBpbnRlcmZhY2U/IikKKyAgc3lzLmV4aXQoMSkKKworbmFtZXMgPSBidXNfaWZhY2UuTGlzdE5hbWVzKCkKK3VuaXF1ZV9uYW1lcyA9IFsgYSBmb3IgYSBpbiBuYW1lcyBpZiBhLnN0YXJ0c3dpdGgoIjoiKSBdCitwaWRzID0gZGljdCgobmFtZSwgYnVzX2lmYWNlLkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEKG5hbWUpKSBmb3IgbmFtZSBpbiB1bmlxdWVfbmFtZXMpCitjbWRzID0gZGljdCgobmFtZSwgZ2V0X2NtZGxpbmUocGlkc1tuYW1lXSkpIGZvciBuYW1lIGluIHVuaXF1ZV9uYW1lcykKK3dlbGxfa25vd25fbmFtZXMgPSBbIGEgZm9yIGEgaW4gbmFtZXMgaWYgYSBub3QgaW4gdW5pcXVlX25hbWVzIF0KK293bmVycyA9IGRpY3QoKHdrbiwgYnVzX2lmYWNlLkdldE5hbWVPd25lcih3a24pKSBmb3Igd2tuIGluIHdlbGxfa25vd25fbmFtZXMpCisKK3J1bGVzID0gZGljdCgoa19ydWxlcywKKyAgICAgICAgICAgICAgZGljdCh7CisgICAgICAgICAgICAgICAgJ3drbic6IFtrIGZvciBrLCB2IGluIG93bmVycy5pdGVtcygpIGlmIHYgPT0ga19ydWxlc10sCisgICAgICAgICAgICAgICAgJ3BpZCc6IHBpZHNba19ydWxlc10sCisgICAgICAgICAgICAgICAgJ2NtZCc6IGNtZHNba19ydWxlc10gb3IgIiIsCisgICAgICAgICAgICAgICAgJ3J1bGVzJzogdl9ydWxlcywKKyAgICAgICAgICAgICAgICAnd2FybmluZ3MnOiBkaWN0KHsKKyAgICAgICAgICAgICAgICAgICdub3Rfc2lnbmFsJzogW2EgZm9yIGEgaW4gdl9ydWxlcyBpZiAidHlwZT0nc2lnbmFsJyIgbm90IGluIGFdLAorICAgICAgICAgICAgICAgICAgJ25vX3NlbmRlcic6IFthIGZvciBhIGluIHZfcnVsZXMgaWYgInNlbmRlcj0iIG5vdCBpbiBhXSwKKyAgICAgICAgICAgICAgICAgICdsb2NhbCc6IFthIGZvciBhIGluIHZfcnVsZXMgaWYgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIiBpbiBhXSwKKyAgICAgICAgICAgICAgICAgICdOYW1lT3duZXJDaGFuZ2VkX2FyZzAnOiBbYSBmb3IgYSBpbiB2X3J1bGVzIGlmICJtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnIiBpbiBhIGFuZCAiYXJnMCIgbm90IGluIGFdCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICApIGZvciBrX3J1bGVzLCB2X3J1bGVzIGluIG1hdGNoX3J1bGVzLml0ZW1zKCkpCisKK3dhcm5pbmdzID0gZGljdCh7CisgICAgICAgICAgICAgJ25vdF9zaWduYWwnOiAnTWF0Y2ggcnVsZSB3aXRob3V0IHNlbGVjdGluZyBzaWduYWxzJywKKyAgICAgICAgICAgICAnbm9fc2VuZGVyJzogJ01hdGNoIHJ1bGUgd2l0aG91dCBhIHNlbmRlciBjcml0ZXJpYScsCisgICAgICAgICAgICAgJ2xvY2FsJzogJ01hdGNoIHJ1bGUgb24gdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIGludGVyZmFjZScsCisgICAgICAgICAgICAgJ05hbWVPd25lckNoYW5nZWRfYXJnMCc6ICdNYXRjaCBydWxlIG9uIE5hbWVPd25lckNoYW5nZWQgd2l0aG91dCBhIGFyZzAqIGNyaXRlcmlhJworICAgICAgICAgICB9KQorCisjIFByaW50IHRoZSBtYXRjaCBydWxlcworCisjIHByaW50IGFsbCBtYXRjaCBydWxlcyB3aXRob3V0IGFuYWx5c2luZyB0aGVtCitpZiBhcmdzLmFsbDoKKyAgZm9yIG5hbWUgaW4gcnVsZXM6CisgICAgcHJpbnQoIkNvbm5lY3Rpb24gJXMgd2l0aCBwaWQgJWQgJyVzJyAoJXMpOiAlZCBtYXRjaCBydWxlcywgJWQgd2FybmluZ3MiCisgICAgICAgICAgJSAobmFtZSwgcnVsZXNbbmFtZV1bJ3BpZCddLCBydWxlc1tuYW1lXVsnY21kJ10sCisgICAgICAgICAgICAgJyAnLmpvaW4ocnVsZXNbbmFtZV1bJ3drbiddKSwgbGVuKHJ1bGVzW25hbWVdWydydWxlcyddKSwKKyAgICAgICAgICAgICBsZW4oc3VtKHJ1bGVzW25hbWVdWyd3YXJuaW5ncyddLnZhbHVlcygpLCBbXSkpKSkKKyAgICBmb3IgcnVsZSBpbiBydWxlc1tuYW1lXVsncnVsZXMnXToKKyAgICAgIHByaW50KCJcdCVzIiAlIChydWxlKSkKKyAgICBwcmludCgiIikKKyAgc3lzLmV4aXQoMCkKKworIyBhbmFseXNlIG1hdGNoIHJ1bGVzIGFuZCBwcmludCBvbmx5IHRoZSBzdXNwaWNpb3VzIG9uZXMKK2ZvciBjb25uLGRhdGEgaW4gcnVsZXMuaXRlbXMoKToKKyAgd2FybmluZ3NfY291bnQgPSBsZW4oc3VtKGRhdGFbJ3dhcm5pbmdzJ10udmFsdWVzKCksIFtdKSkKKyAgaWYgd2FybmluZ3NfY291bnQgPT0gMDoKKyAgICBjb250aW51ZQorCisgIHByaW50KCJDb25uZWN0aW9uICVzIHdpdGggcGlkICVkICclcycgKCVzKTogJWQgbWF0Y2ggcnVsZXMsICVkIHdhcm5pbmdzIgorICAgICAgICAlIChjb25uLCBkYXRhWydwaWQnXSwgZGF0YVsnY21kJ10sICcgJy5qb2luKGRhdGFbJ3drbiddKSwKKyAgICAgICAgICAgbGVuKGRhdGFbJ3J1bGVzJ10pLCB3YXJuaW5nc19jb3VudCkpCisKKyAgZm9yIHdhcm5fY29kZSxydWxlX2xpc3QgaW4gWyh3YXJuX2NvZGUscnVsZV9saXN0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd2Fybl9jb2RlLCBydWxlX2xpc3QgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGF0YVsnd2FybmluZ3MnXS5pdGVtcygpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihydWxlX2xpc3QpID4gMF06CisgICAgcHJpbnQoIiAgIC0gJXM6IiAlICh3YXJuaW5nc1t3YXJuX2NvZGVdKSkKKyAgICBmb3IgcnVsZSBpbiBydWxlX2xpc3Q6CisgICAgICBwcmludCgiICAgICAgICAgLSAlcyIgJSAocnVsZSkpCisKKyAgcHJpbnQoIiIpCisKK3N5cy5leGl0KDApCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5hbSBiL3Rvb2xzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTBiN2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyMiBAQAorQU1fQ1BQRkxBR1MgPSBcCisJLUkkKHRvcF9zcmNkaXIpIFwKKwkkKERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTKSBcCisJJChEQlVTX1hfQ0ZMQUdTKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiIFwKKwkkKE5VTEwpCisKKyMgaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgaW1wcm92ZSBiYWNrdHJhY2VzCitBTV9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACisKK2Jpbl9QUk9HUkFNUyA9IFwKKwlkYnVzLWxhdW5jaCBcCisJZGJ1cy1tb25pdG9yIFwKKwlkYnVzLXNlbmQgXAorCWRidXMtdGVzdC10b29sIFwKKwlkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IFwKKwkkKE5VTEwpCisKK2lmIERCVVNfVU5JWAorYmluX1BST0dSQU1TICs9IFwKKwlkYnVzLWNsZWFudXAtc29ja2V0cyBcCisJZGJ1cy1ydW4tc2Vzc2lvbiBcCisJZGJ1cy11dWlkZ2VuIFwKKwkkKE5VTEwpCitlbmRpZgorCitkYnVzX3NlbmRfU09VUkNFUz0JCQkJXAorCWRidXMtcHJpbnQtbWVzc2FnZS5jCQkJXAorCWRidXMtcHJpbnQtbWVzc2FnZS5oCQkJXAorCWRidXMtc2VuZC5jIFwKKwl0b29sLWNvbW1vbi5jIFwKKwl0b29sLWNvbW1vbi5oIFwKKwkkKE5VTEwpCisKK2RidXNfbW9uaXRvcl9TT1VSQ0VTID0gXAorCWRidXMtbW9uaXRvci5jIFwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYyBcCisJZGJ1cy1wcmludC1tZXNzYWdlLmggXAorCXRvb2wtY29tbW9uLmMgXAorCXRvb2wtY29tbW9uLmggXAorCSQoTlVMTCkKKworaWYgREJVU19XSU4KK2RidXNfbGF1bmNoX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWxhdW5jaC13aW4uYwkJCVwKKwlkYnVzLWxhdW5jaC5oCitlbHNlCitkYnVzX2xhdW5jaF9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1sYXVuY2guYwkJCQlcCisJZGJ1cy1sYXVuY2gteDExLmMJCQlcCisJZGJ1cy1sYXVuY2guaCBcCisJdG9vbC1jb21tb24uYyBcCisJdG9vbC1jb21tb24uaCBcCisJJChOVUxMKQorZGJ1c19sYXVuY2hfQ1BQRkxBR1MgPSBcCisJJChBTV9DUFBGTEFHUykgXAorCSQoTlVMTCkKK2RidXNfbGF1bmNoX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJChEQlVTX1hfTElCUykgXAorCSQoTlVMTCkKKworZGJ1c19ydW5fc2Vzc2lvbl9TT1VSQ0VTID0JCQlcCisJZGJ1cy1ydW4tc2Vzc2lvbi5jCisKK2RidXNfcnVuX3Nlc3Npb25fTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKE5VTEwpCitlbmRpZgorCitkYnVzX2NsZWFudXBfc29ja2V0c19TT1VSQ0VTPQkJCVwKKwlkYnVzLWNsZWFudXAtc29ja2V0cy5jCisKK2RidXNfdXVpZGdlbl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy11dWlkZ2VuLmMKKworZGJ1c19zZW5kX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJChOVUxMKQorCitkYnVzX21vbml0b3JfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKE5FVFdPUktfbGlicykgXAorCSQoTlVMTCkKKworZGJ1c191dWlkZ2VuX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSBcCisJJChOVUxMKQorCitleGFtcGxlc2RpciA9ICR7ZG9jZGlyfS9leGFtcGxlcworZGlzdF9leGFtcGxlc19TQ1JJUFRTID0gXAorCUdldEFsbE1hdGNoUnVsZXMucHkgXAorCSQoTlVMTCkKKworZGJ1c190ZXN0X3Rvb2xfU09VUkNFUyA9IFwKKwlkYnVzLWVjaG8uYyBcCisJZGJ1cy1zcGFtLmMgXAorCXRvb2wtY29tbW9uLmMgXAorCXRvb2wtY29tbW9uLmggXAorCXRlc3QtdG9vbC5jIFwKKwl0ZXN0LXRvb2wuaCBcCisJJChOVUxMKQorZGJ1c190ZXN0X3Rvb2xfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEKKworZGJ1c191cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudF9TT1VSQ0VTID0gXAorCWRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuYyBcCisJdG9vbC1jb21tb24uYyBcCisJdG9vbC1jb21tb24uaCBcCisJJChOVUxMKQorZGJ1c191cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQorCitFWFRSQV9ESVNUID0gcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIHN0cnRvbGwuYyBzdHJ0b3VsbC5jCitDTEVBTkZJTEVTID0gCQkJCVwKKwlydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZgorCisjIGNyZWF0ZSB0aGUgL3Zhci9saWIvZGJ1cyBkaXJlY3RvcnkgZm9yIGRidXMtdXVpZGdlbgoraW5zdGFsbC1kYXRhLWxvY2FsOgorCSQoTUtESVJfUCkgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKKworaW5zdGFsbGNoZWNrLWxvY2FsOgorCXRlc3QgLWQgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKZGlmZiAtLWdpdCBhL3Rvb2xzL05PVElDRSBiL3Rvb2xzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMgYi90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjcwOWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY2xlYW51cC1zb2NrZXRzLmMgIGRidXMtY2xlYW51cC1zb2NrZXRzIHV0aWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3MKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIE5PVCBsaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlLAorICogYXMgaXQgaXMgYmFzZWQgb24gbGluYy1jbGVhbnVwLXNvY2tldHMgd2hpY2ggaXMgTEdQTC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgKDEpCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKSAwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkKgoreG1hbGxvYyAoc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtID0gbWFsbG9jIChieXRlcyk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFsbG9jYXRpb24gb2YgJWQgYnl0ZXMgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgKGludCkgYnl0ZXMpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkKgoreHJlYWxsb2MgKHZvaWQgKm9sZCwgc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgeworICAgICAgZnJlZSAob2xkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBtZW0gPSByZWFsbG9jIChvbGQsIGJ5dGVzKTsKKworICBpZiAobWVtID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpIGJ5dGVzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gbWVtOworfQorCisjaWZkZWYgQUZfVU5JWAorCit0eXBlZGVmIGVudW0KKyAgeworICAgIFNPQ0tFVF9VTktOT1dOLAorICAgIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFLAorICAgIFNPQ0tFVF9ERUFELAorICAgIFNPQ0tFVF9BTElWRSwKKyAgICBTT0NLRVRfVU5MSU5LRUQKKyAgfSBTb2NrZXRTdGF0dXM7CisKK3N0YXRpYyBpbnQgYWxpdmVfY291bnQgPSAwOworc3RhdGljIGludCBjbGVhbmVkX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdW5oYW5kbGVkX2NvdW50ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50ICAgZmQ7CisgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisgIGludCAgIG5fcmV0cmllczsKK30gU29ja2V0RW50cnk7CisKK3N0YXRpYyBTb2NrZXRFbnRyeSoKK3NvY2tldF9lbnRyeV9uZXcgKGNvbnN0IGNoYXIgKmRpciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICBTb2NrZXRFbnRyeSAqc2U7CisgIGludCBsZW47CisKKyAgc2UgPSB4bWFsbG9jIChzaXplb2YgKFNvY2tldEVudHJ5KSk7CisKKyAgbGVuID0gc3RybGVuIChkaXIpICsgc3RybGVuIChmbmFtZSkgKyAyOyAvKiAyID0gbnVsIGFuZCAnLycgKi8KKyAgc2UtPm5hbWUgPSB4bWFsbG9jIChsZW4pOworCisgIHN0cmNweSAoc2UtPm5hbWUsIGRpcik7CisgIHN0cmNhdCAoc2UtPm5hbWUsICIvIik7CisgIHN0cmNhdCAoc2UtPm5hbWUsIGZuYW1lKTsKKworICBzZS0+ZmQgPSAtMTsKKworICBzZS0+c3RhdHVzID0gU09DS0VUX1VOS05PV047CisKKyAgc2UtPm5fcmV0cmllcyA9IDA7CisKKyAgcmV0dXJuIHNlOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cnkgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaWYgKHNlKQorICAgIHsKKyAgICAgIGZyZWUgKHNlLT5uYW1lKTsKKyAgICAgIGlmIChzZS0+ZmQgPj0gMCkKKyAgICAgICAgY2xvc2UgKHNlLT5mZCk7CisgICAgICBmcmVlIChzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cmllcyAoU29ja2V0RW50cnkqKiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworCisgIGlmIChlbnRyaWVzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VudHJpZXM7ICsraSkKKyAgICAgICAgZnJlZV9zb2NrZXRfZW50cnkgKGVudHJpZXNbaV0pOworICAgICAgZnJlZSAoZW50cmllcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9zb2NrZXRzIChjb25zdCBjaGFyICAgICpkaXIsCisgICAgICAgICAgICAgIFNvY2tldEVudHJ5ICoqKmVudHJpZXNfcCwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqbl9lbnRyaWVzX3ApCit7CisgIERJUiAgICpkaXJoOworICBzdHJ1Y3QgZGlyZW50ICpkZW50OworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisgIGludCBhbGxvY2F0ZWQ7CisKKyAgbl9lbnRyaWVzID0gMDsKKyAgYWxsb2NhdGVkID0gMjsKKyAgZW50cmllcyA9IHhtYWxsb2MgKHNpemVvZiAoU29ja2V0RW50cnkqKSAqIGFsbG9jYXRlZCk7CisKKyAgZGlyaCA9IG9wZW5kaXIgKGRpcik7CisgIGlmIChkaXJoID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGRpciwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgd2hpbGUgKChkZW50ID0gcmVhZGRpciAoZGlyaCkpKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKGRlbnQtPmRfbmFtZSwgImRidXMtIiwgNSkgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNlID0gc29ja2V0X2VudHJ5X25ldyAoZGlyLCBkZW50LT5kX25hbWUpOworCisgICAgICBpZiAobl9lbnRyaWVzID09IGFsbG9jYXRlZCkKKyAgICAgICAgeworICAgICAgICAgIGFsbG9jYXRlZCAqPSAyOworICAgICAgICAgIGVudHJpZXMgPSB4cmVhbGxvYyAoZW50cmllcywgc2l6ZW9mIChTb2NrZXRFbnRyeSopICogYWxsb2NhdGVkKTsKKyAgICAgICAgfQorCisgICAgICBlbnRyaWVzW25fZW50cmllc10gPSBzZTsKKyAgICAgIG5fZW50cmllcyArPSAxOworICAgIH0KKworICBjbG9zZWRpciAoZGlyaCk7CisKKyAgKmVudHJpZXNfcCA9IGVudHJpZXM7CisgICpuX2VudHJpZXNfcCA9IG5fZW50cmllczsKK30KKworc3RhdGljIFNvY2tldFN0YXR1cworb3Blbl9zb2NrZXQgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNhZGRyOworCisgIGlmIChzZS0+bl9yZXRyaWVzID4gNSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBnaXZpbmcgdXAgb24gc29ja2V0ICVzIGFmdGVyIHNldmVyYWwgcmV0cmllczsgdW5hYmxlIHRvIGRldGVybWluZSBzb2NrZXQncyBzdGF0dXNcbiIsCisgICAgICAgICAgICAgICBzZS0+bmFtZSk7CisgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgfQorCisgIHNlLT5uX3JldHJpZXMgKz0gMTsKKworICBzZS0+ZmQgPSBzb2NrZXQgKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNlLT5mZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogZmFpbGVkIHRvIG9wZW4gYSBzb2NrZXQgdG8gdXNlIGZvciBjb25uZWN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIFNPQ0tFVF9VTktOT1dOOworICAgIH0KKworICBpZiAoZmNudGwgKHNlLT5mZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IGZhaWxlZCBzZXQgc29ja2V0ICVzIG5vbmJsb2NraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICB9CisKKworICBtZW1zZXQgKCZzYWRkciwgJ1wwJywgc2l6ZW9mIChzYWRkcikpOyAvKiBudWwtdGVybWluYXRlcyB0aGUgc3VuX3BhdGggKi8KKworICBzYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RybmNweSAoc2FkZHIuc3VuX3BhdGgsIHNlLT5uYW1lLCBzaXplb2YgKHNhZGRyLnN1bl9wYXRoKSAtIDEpOworCisgIGRvCisgICAgeworICAgICAgcmV0ID0gY29ubmVjdCAoc2UtPmZkLCAoc3RydWN0IHNvY2thZGRyKikgJnNhZGRyLCBzaXplb2YgKHNhZGRyKSk7CisgICAgfQorICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJldCA+PSAwKQorICAgIHJldHVybiBTT0NLRVRfQUxJVkU7CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGVycm5vKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6CisgICAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6CisgICAgICAgICAgcmV0dXJuIFNPQ0tFVF9ERUFEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IHVuZXhwZWN0ZWQgZXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9zb2NrZXRzIChTb2NrZXRFbnRyeSAqKmVudHJpZXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworICBpbnQgbl91bmtub3duOworCisgIG5fdW5rbm93biA9IDA7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKyAgICAgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisKKyAgICAgIHNlID0gZW50cmllc1tpXTsKKyAgICAgICsraTsKKworICAgICAgaWYgKHNlLT5mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3IsIHNvY2tldCBoYXMgZmQgIGtlcHQgb3BlbiB3aGlsZSBzdGF0dXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzZS0+c3RhdHVzKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyAhPSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHN0YXR1cyA9IG9wZW5fc29ja2V0IChzZSk7CisKKyAgICAgIHN3aXRjaCAoc3RhdHVzKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU09DS0VUX0RFQUQ6CisgICAgICAgICAgY2xlYW5lZF9jb3VudCArPSAxOworICAgICAgICAgIGlmICh1bmxpbmsgKHNlLT5uYW1lKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IEZhaWxlZCB0byBkZWxldGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZS0+bmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgc2UtPnN0YXR1cyA9IFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlLT5zdGF0dXMgPSBTT0NLRVRfVU5MSU5LRUQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfQUxJVkU6CisgICAgICAgICAgYWxpdmVfY291bnQgKz0gMTsKKyAgICAgICAgICAvKiBGQUxMIFRIUlUgKi8KKworICAgICAgICBjYXNlIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOgorICAgICAgICBjYXNlIFNPQ0tFVF9VTktOT1dOOgorICAgICAgICAgIHNlLT5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfVU5MSU5LRUQ6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN0YXR1cyBmcm9tIG9wZW5fc29ja2V0KCksIHNob3VsZCBub3QgaGFwcGVuXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPmZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZSAoc2UtPmZkKTsKKyAgICAgICAgICBzZS0+ZmQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyA9PSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgbl91bmtub3duICs9IDE7CisgICAgfQorCisgIHJldHVybiBuX3Vua25vd24gPT0gMDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX2RpciAoY29uc3QgY2hhciAqZGlyKQoreworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisKKyAgcmVhZF9zb2NrZXRzIChkaXIsICZlbnRyaWVzLCAmbl9lbnRyaWVzKTsKKworICAvKiBvcGVuX3NvY2tldCgpIHdpbGwgZmFpbCBjb25jbHVzaXZlbHkgYWZ0ZXIKKyAgICogc2V2ZXJhbCByZXRyaWVzLCBzbyB0aGlzIGxvb3AgaXMgZ3VhcmFudGVlZAorICAgKiB0byB0ZXJtaW5hdGUgZXZlbnR1YWxseQorICAgKi8KKyAgd2hpbGUgKCFoYW5kbGVfc29ja2V0cyAoZW50cmllcywgbl9lbnRyaWVzKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXRlIG9mIHNvbWUgc29ja2V0cywgcmV0cnlpbmcgaW4gMiBzZWNvbmRzXG4iKTsKKyAgICAgIHNsZWVwICgyKTsKKyAgICB9CisKKyAgdW5oYW5kbGVkX2NvdW50ICs9IChuX2VudHJpZXMgLSBhbGl2ZV9jb3VudCAtIGNsZWFuZWRfY291bnQpOworCisgIGZyZWVfc29ja2V0X2VudHJpZXMgKGVudHJpZXMsIG5fZW50cmllcyk7Cit9CisKKyNlbmRpZiAvKiBBRl9VTklYICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLWNsZWFudXAtc29ja2V0cyBbLS12ZXJzaW9uXSBbLS1oZWxwXSA8c29ja2V0ZGlyPlxuIik7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIFNvY2tldCBDbGVhbnVwIFV0aWxpdHkgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3NcbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisgIGludCBzYXdfZG91YmxlZGFzaDsKKyAgY29uc3QgY2hhciAqZGlybmFtZTsKKworICBzYXdfZG91YmxlZGFzaCA9IEZBTFNFOworICBkaXJuYW1lID0gTlVMTDsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgdXNhZ2UgKDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB2ZXJzaW9uICgpOworICAgICAgZWxzZSBpZiAoIXNhd19kb3VibGVkYXNoKQorCXsKKyAgICAgICAgICBpZiAoc3RyY21wIChhcmcsICItLSIpID09IDApCisgICAgICAgICAgICBzYXdfZG91YmxlZGFzaCA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoKmFyZyA9PSAnLScpCisgICAgICAgICAgICB1c2FnZSAoMSk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpcm5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1jbGVhbnVwLXNvY2tldHMgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkaXJlY3RvcnkgbmFtZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGlybmFtZSA9IGFyZzsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gc2Vzc2lvbiBzb2NrZXQgZGlyLCB1c3VhbGx5IC90bXAgKi8KKyAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI7CisKKyNpZmRlZiBBRl9VTklYCisgIGNsZWFuX2RpciAoZGlybmFtZSk7CisKKyAgcHJpbnRmICgiQ2xlYW5lZCB1cCAlZCBzb2NrZXRzIGluICVzOyAlZCBzb2NrZXRzIGFyZSBzdGlsbCBpbiB1c2U7ICVkIGluIHVua25vd24gc3RhdGVcbiIsCisgICAgICAgICAgY2xlYW5lZF9jb3VudCwgZGlybmFtZSwgYWxpdmVfY291bnQsIHVuaGFuZGxlZF9jb3VudCk7CisjZWxzZQorICBwcmludGYgKCJUaGlzIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFVOSVggZG9tYWluIHNvY2tldHMsIHNvIGRidXMtY2xlYW51cC1zb2NrZXRzIGRvZXMgbm90aGluZ1xuIik7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtZWNoby5jIGIvdG9vbHMvZGJ1cy1lY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4YjFjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtZWNoby5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZWNoby5jIC0gYSBwbGFpbiBsaWJkYnVzIGVjaG8gc2VydmVyCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgImRidXMvZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAidGVzdC10b29sLmgiCisjaW5jbHVkZSAidG9vbC1jb21tb24uaCIKKworc3RhdGljIGludCBzbGVlcF9tcyA9IC0xOworc3RhdGljIGRidXNfYm9vbF90IG5vcmVwbHkgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBub3JlYWQgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK3VzYWdlX2VjaG8gKGludCBleGl0X3dpdGgpCit7CisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgIlVzYWdlOiBkYnVzLXRlc3QtdG9vbCBlY2hvIFtPUFRJT05TXVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICJSZXNwb25kIHRvIGFsbCBtZXRob2QgY2FsbHMgd2l0aCBhbiBlbXB0eSByZXBseS5cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tbmFtZT1OQU1FICAgY2xhaW0gdGhpcyB3ZWxsLWtub3duIG5hbWUgZmlyc3RcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tc2xlZXAtbXM9TiAgc2xlZXAgTiBtaWxsaXNlY29uZHMgYmVmb3JlIHNlbmRpbmcgZWFjaCByZXBseVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1zZXNzaW9uICAgICB1c2UgdGhlIHNlc3Npb24gYnVzIChkZWZhdWx0KVxuIgorICAgICAgICAgICAiICAgIC0tc3lzdGVtICAgICAgdXNlIHRoZSBzeXN0ZW0gYnVzXG4iCisgICAgICAgICAgICk7CisgIGV4aXQgKGV4aXRfd2l0aCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZV9ibGFja19ob2xlIChpbnQgZXhpdF93aXRoKQoreworICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICJVc2FnZTogZGJ1cy10ZXN0LXRvb2wgYmxhY2staG9sZSBbT1BUSU9OU11cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiUmVjZWl2ZSBtZXRob2QgY2FsbHMgYnV0IGRvIG5vdCByZXBseS5cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tbmFtZT1OQU1FICAgY2xhaW0gdGhpcyB3ZWxsLWtub3duIG5hbWUgZmlyc3RcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tbm8tcmVhZCAgICAgZG9uJ3QgcmVhZCBhbnl0aGluZyBvbiB0aGUgRC1CdXMgc29ja2V0XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLXNlc3Npb24gICAgIHVzZSB0aGUgc2Vzc2lvbiBidXMgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICIgICAgLS1zeXN0ZW0gICAgICB1c2UgdGhlIHN5c3RlbSBidXNcbiIKKyAgICAgICAgICAgKTsKKyAgZXhpdCAoZXhpdF93aXRoKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKworICBpZiAoc2xlZXBfbXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoc2xlZXBfbXMpOworICAgIH0KKworICBpZiAoIW5vcmVwbHkpCisgICAgeworICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgdG9vbF9vb20gKCJhbGxvY2F0aW5nIHJlcGx5Iik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgdG9vbF9vb20gKCJzZW5kaW5nIHJlcGx5Iik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIH0KKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgoraW5pdF9jb25uZWN0aW9uIChEQnVzQnVzVHlwZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byBidXM6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSwgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgIT0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUikKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImZhaWxlZCB0byB0YWtlIGJ1cyBuYW1lICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzXG4iLCBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pKTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwgZmlsdGVyLCBOVUxMLCBOVUxMKSkKKyAgICB0b29sX29vbSAoImFkZGluZyBtZXNzYWdlIGZpbHRlciIpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCitpbnQKK2RidXNfdGVzdF90b29sX2VjaG8gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNCdXNUeXBlIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgLyogYXJndlsxXSBpcyB0aGUgdG9vbCBuYW1lLCBzbyBzdGFydCBmcm9tIDIgKi8KKworICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGUgPSBEQlVTX0JVU19TWVNURU07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tbmFtZT0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBuYW1lID0gYXJnICsgc3RybGVuICgiLS1uYW1lPSIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tc2xlZXAtbXM9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgc2xlZXBfbXMgPSBhdG9pIChhcmcgKyBzdHJsZW4gKCItLXNsZWVwLW1zPSIpKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2VfZWNobyAoMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgY29ubmVjdGlvbiA9IGluaXRfY29ubmVjdGlvbiAodHlwZSwgbmFtZSk7CisKKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChjb25uZWN0aW9uLCAtMSkpCisgICAge30KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICByZXR1cm4gMDsKK30KKworaW50CitkYnVzX3Rlc3RfdG9vbF9ibGFja19ob2xlIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQnVzVHlwZSB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisgIC8qIGFyZ3ZbMV0gaXMgdGhlIHRvb2wgbmFtZSwgc28gc3RhcnQgZnJvbSAyICovCisKKyAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLXN5c3RlbSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc2Vzc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLW5hbWU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgbmFtZSA9IGFyZyArIHN0cmxlbiAoIi0tbmFtZT0iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLW5vLXJlYWQiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgbm9yZWFkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2VfYmxhY2tfaG9sZSAoMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgY29ubmVjdGlvbiA9IGluaXRfY29ubmVjdGlvbiAodHlwZSwgbmFtZSk7CisKKyAgaWYgKG5vcmVhZCkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKyAgICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgzNjAwKTsKKyAgICB9CisKKyAgbm9yZXBseSA9IFRSVUU7CisKKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChjb25uZWN0aW9uLCAtMSkpCisgICAge30KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jIGIvdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZDA5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGF1bmNoLXdpbi5jICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmbmRlZiBVTklDT0RFCisjZGVmaW5lIFVOSUNPREUgMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIFNhdmUgc3RyaW5nIGZ1bmN0aW9ucy4gIEluc3RlYWQgb2YgZmlndXJpbmcgb3V0IHRoZSBleGFjdCBfTVNDX1ZFUgorICAgdGhhdCB3b3JrLCBvdmVycmlkZSBmb3IgZXZlcnlib2R5LiAgKi8KKworI2RlZmluZSBlcnJub190IGludAorI2RlZmluZSB3Y3NjYXRfcyBteV93Y3NjYXRfcworI2RlZmluZSB3Y3NjcHlfcyBteV93Y3NjcHlfcworCitzdGF0aWMgZXJybm9fdAord2NzY2F0X3MgKHdjaGFyX3QgKmRlc3QsIHNpemVfdCBzaXplLCB3Y2hhcl90ICpzcmMpIAoreworICBhc3NlcnQgKHNpemVvZiAod2NoYXJfdCkgKiAod2NzbGVuIChkZXN0KSArIHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjYXQgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBlcnJub190Cit3Y3NjcHlfcyAod2NoYXJfdCAqZGVzdCwgc2l6ZV90IHNpemUsIHdjaGFyX3QgKnNyYykKK3sKKyAgYXNzZXJ0IChzaXplb2YgKHdjaGFyX3QpICogKHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjcHkgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisvKiBUT0RPICh0bCk6IFRoaXMgV2luZG93cyB2ZXJzaW9uIG9mIGRidXMtbGF1bmNoIGlzIGN1cnJldGx5IHJhdGhlcgorICogcG9pbnRsZXNzIGFzIGl0IGRvZXNuJ3QgdGFrZSB0aGUgc2FtZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcyB0aGUKKyAqIFVOSVggZGJ1cy1sYXVuY2ggZG9lcy4gQSBtYWluIHBvaW50IG9mIHRoZSBkYnVzLWxhdW5jaCBjb21tYW5kIGlzCisgKiB0byBwYXNzIGl0IGZvciBpbnN0YW5jZSBhIC0tY29uZmlnLWZpbGUgb3B0aW9uIHRvIG1ha2UgdGhlIHN0YXJ0ZWQKKyAqIGRidXMtZGFlbW9uIHVzZSB0aGF0IGNvbmZpZyBmaWxlLgorICogCisgKiBUaGlzIHZlcnNpb24gYWxzbyBkb2Vzbid0IHByaW50IG91dCBhbnkgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGEKKyAqIG1haW4gcG9pbnQgb2YgdGhlIFVOSVggb25lLiBJdCBzaG91bGQgYXQgbGVhc3Qgc3VwcG9ydCB0aGUKKyAqIC0tc2gtc3ludGF4IG9wdGlvbiwgYW5kIG1heWJlIGFsc28gYSAtLWNtZC1zeW50YXggdG8gcHJpbnQgb3V0IHRoZQorICogdmFyaWFibGUgc2V0dGluZ3MgaW4gY21kLmV4ZSBzeW50YXg/CisgKiAKKyAqIE5PVEUgKHJoKTogVGhlIG1haW4gdGFzayBvZiBkYnVzLWxhdW5jaCBpcyAoZnJvbSB0aGUgbWFuIHBhZ2UpIHRvIHN0YXJ0IAorICogYSBzZXNzaW9uIGJ1cyBhbmQgdGhpcyBpcyBhcmNoaWV2ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50aW9uLiAKKyAqIAorICogQWRkaXRpb25hbCBvbiB3aW5kb3dzIHRoZSBzZXNzaW9uIGJ1cyBzdGFydGluZyBpbiBub3QgaW50ZWdyYXRlZCAKKyAqIGludG8gdGhlIGxvZ29uIHByb2Nlc3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFueSAtLXN5bnRheCBvcHRpb24uIAorICogSW4gZmFjdCAoYXQgbGVhc3QgZm9yIGtkZSBvbiB3aW5kb3dzKSB0aGUgc2Vzc2lvbiBidXMgaXMgYXV0b3N0YXJ0ZWQgCisgKiB3aXRoIHRoZSBmaXJzdCBhcHBsaWNhdGlvbiByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBidXMuIAorICoKKyAqLworCisjZGVmaW5lIEFVVE9fQUNUSVZBVEVfQ09OU09MRV9XSEVOX1ZFUkJPU0VfTU9ERSAxCisKKyNkZWZpbmUgRElNKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisjZGVmaW5lIFdDU1RSSU5HSUZZXyh4KSBMICMjIHgKKyNkZWZpbmUgV0NTVFJJTkdJRlkoeCkgV0NTVFJJTkdJRllfKHgpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB3Y2hhcl90IGRidXNEYWVtb25QYXRoW01BWF9QQVRIICogMiArIDFdOworICB3Y2hhcl90IGNvbW1hbmRbTUFYX1BBVEggKiAyICsgMV07CisgIHdjaGFyX3QgKnA7CisgIHdjaGFyX3QgKmRhZW1vbl9uYW1lOworICBpbnQgcmVzdWx0OworCisjaWZkZWYgREJVU19XSU5DRQorICBjaGFyICpzID0gTlVMTDsKKyNlbHNlCisgIGNoYXIgKnMgPSBnZXRlbnYoIkRCVVNfVkVSQk9TRSIpOworI2VuZGlmCisgIGludCB2ZXJib3NlID0gcyAmJiAqcyAhPSAnXDAnID8gMSA6IDA7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgU1RBUlRVUElORk9XIHNpOworICBCT09MIGluaGVyaXQgPSBUUlVFOworICBEV09SRCBmbGFncyA9IDA7CisKKyAgR2V0TW9kdWxlRmlsZU5hbWVXIChOVUxMLCBkYnVzRGFlbW9uUGF0aCwgRElNIChkYnVzRGFlbW9uUGF0aCkpOworICAKKyAgZGFlbW9uX25hbWUgPSBXQ1NUUklOR0lGWShEQlVTX0RBRU1PTl9OQU1FKSBMIi5leGUiOworICAKKyAgaWYgKChwID0gd2NzcmNociAoZGJ1c0RhZW1vblBhdGgsIEwnXFwnKSkpIAorICAgIHsKKyAgICAgIHBbMV0gPSBMJ1wwJzsKKyAgICAgIHdjc2NhdF9zIChkYnVzRGFlbW9uUGF0aCwgc2l6ZW9mIChkYnVzRGFlbW9uUGF0aCksIGRhZW1vbl9uYW1lKTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCBleHRyYWN0IHBhdGggZnJvbSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb25zIG1vZHVsZSBmaWxlbmFtZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9IAorCisjaWZkZWYgREJVU19XSU5DRQorICAgLyogV2luZG93cyBDRSBoYXMgYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gb2YgY21kbGluZTogU3RhcnQgd2l0aCBhcmd2WzFdLiAgKi8KKyAgIHdjc2NweV9zIChjb21tYW5kLCBzaXplb2YgKGNvbW1hbmQpLCBMIi0tc2Vzc2lvbiIpOworICAgaWYgKHZlcmJvc2UpCisgICAgIGZwcmludGYgKHN0ZGVyciwgIiVscyAlbHNcbiIsIGRidXNEYWVtb25QYXRoLCBjb21tYW5kKTsKKyNlbHNlCisgICBjb21tYW5kWzBdID0gTCdcMCc7CisgICAvKiBXaW5kb3dzIGNtZGxpbmUgc3RhcnRzIHdpdGggcGF0aCwgd2hpY2ggY2FuIGNvbnRhaW4gc3BhY2VzLiAgKi8KKyAgIHdjc2NweV9zIChjb21tYW5kLCBzaXplb2YgKGNvbW1hbmQpLCBMIlwiIik7CisgICB3Y3NjYXRfcyAoY29tbWFuZCwgc2l6ZW9mIChjb21tYW5kKSwgZGJ1c0RhZW1vblBhdGgpOworICAgd2NzY2F0X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiXCIgLS1zZXNzaW9uIik7CisgICBpZiAodmVyYm9zZSkKKyAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWxzXG4iLCBjb21tYW5kKTsKKyNlbmRpZgorICAKKyAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgbWVtc2V0ICgmcGksIDAsIHNpemVvZiAocGkpKTsKKyAgc2kuY2IgPSBzaXplb2YgKHNpKTsKKyAgCisgIGlmICh2ZXJib3NlKQorICAgIGZsYWdzIHw9IENSRUFURV9ORVdfQ09OU09MRTsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgaW5oZXJpdCA9IEZBTFNFOworI2Vsc2UKKyAgZmxhZ3MgfD0gTk9STUFMX1BSSU9SSVRZX0NMQVNTOworICBpZiAoIXZlcmJvc2UpCisgICAgZmxhZ3MgfD0gREVUQUNIRURfUFJPQ0VTUzsKKyNlbmRpZgorCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NXIChkYnVzRGFlbW9uUGF0aCwgY29tbWFuZCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQsIGZsYWdzLCAwLCAwLCAmc2ksICZwaSk7CisKKyAgaWYgKHJlc3VsdCA9PSAwKSAKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGQgbm90IHN0YXJ0ICIgREJVU19EQUVNT05fTkFNRSAiLiBlcnJvcj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKUdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAKKyAgQ2xvc2VIYW5kbGUgKHBpLmhQcm9jZXNzKTsKKyAgQ2xvc2VIYW5kbGUgKHBpLmhUaHJlYWQpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMgYi90b29scy9kYnVzLWxhdW5jaC14MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk0NDRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guaCAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1sYXVuY2guaCIKKworI2lmZGVmIERCVVNfQlVJTERfWDExCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorCitEaXNwbGF5ICp4ZGlzcGxheSA9IE5VTEw7CitzdGF0aWMgQXRvbSBzZWxlY3Rpb25fYXRvbTsKK3N0YXRpYyBBdG9tIGFkZHJlc3NfYXRvbTsKK3N0YXRpYyBBdG9tIHBpZF9hdG9tOworCitzdGF0aWMgaW50Cit4X2lvX2Vycm9yX2hhbmRsZXIgKERpc3BsYXkgKnhkaXNwbGF5KQoreworICB2ZXJib3NlICgiWCBJTyBlcnJvclxuIik7CisgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcHJlZml4IChjaGFyICpzLAorICAgICAgICAgICAgICAgY2hhciAqcHJlZml4KQoreworICBpbnQgcGxlbjsKKworICBwbGVuID0gc3RybGVuIChwcmVmaXgpOworCisgIGlmIChzdHJuY21wIChzLCBwcmVmaXgsIHBsZW4pID09IDApCisgICAgeworICAgICAgbWVtbW92ZSAocywgcyArIHBsZW4sIHN0cmxlbiAocykgLSBwbGVuICsgMSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2dldF9ob21lZGlyICh2b2lkKQoreworICBjb25zdCBjaGFyICpob21lOworICAKKyAgaG9tZSA9IGdldGVudiAoIkhPTUUiKTsKKyAgaWYgKGhvbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB0cnkgZnJvbSB0aGUgdXNlciBkYXRhYmFzZSAqLworICAgICAgc3RydWN0IHBhc3N3ZCAqdXNlciA9IGdldHB3dWlkIChnZXR1aWQoKSk7CisgICAgICBpZiAodXNlciAhPSBOVUxMKQorICAgICAgICBob21lID0gdXNlci0+cHdfZGlyOworICAgIH0KKworICBpZiAoaG9tZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGdldCB1c2VyIGhvbWUgZGlyZWN0b3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gaG9tZTsKK30KKworI2RlZmluZSBEQlVTX0RJUiAiLmRidXMiCisjZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfRElSICJzZXNzaW9uLWJ1cyIKKworc3RhdGljIGNoYXIgKgorZ2V0X3Nlc3Npb25fZmlsZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHJlZml4W10gPSAiLyIgREJVU19ESVIgIi8iIERCVVNfU0VTU0lPTl9CVVNfRElSICIvIjsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY29uc3QgY2hhciAqaG9tZTsKKyAgY2hhciAqZGlzcGxheTsKKyAgY2hhciAqcmVzdWx0OworICBjaGFyICpwOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRpc3BsYXkgPSB4c3RyZHVwIChnZXRlbnYgKCJESVNQTEFZIikpOworICBpZiAoZGlzcGxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJYMTEgaW50ZWdyYXRpb24gZGlzYWJsZWQgYmVjYXVzZSBYMTEgaXMgbm90IHJ1bm5pbmdcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIHJlbW92ZSB0aGUgc2NyZWVuIHBhcnQgb2YgdGhlIGRpc3BsYXkgbmFtZSAqLworICBwID0gc3RycmNociAoZGlzcGxheSwgJzonKTsKKyAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKCA7ICpwOyArK3ApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB3ZSBsZWF2ZSB0aGUgaG9zdG5hbWUgaW4gdGhlIGRpc3BsYXkgbW9zdCBvZiB0aGUKKyAgICogdGltZS4gVGhlIGlkZWEgaXMgdGhhdCB3ZSB3YW50IHRvIGJlIHBlci0obWFjaGluZSxkaXNwbGF5LHVzZXIpCisgICAqIHRyaXBsZXQgdG8gYmUgZXh0cmEtc3VyZSB3ZSBnZXQgYSBidXMgd2UgY2FuIGNvbm5lY3QgdG8uIElkZWFsbHkKKyAgICogd2UnZCByZWNvZ25pemUgd2hlbiB0aGUgaG9zdG5hbWUgbWF0Y2hlcyB0aGUgbWFjaGluZSB3ZSdyZSBvbiBpbgorICAgKiBhbGwgY2FzZXM7IHdlIGRvIHRyeSB0byBkcm9wIGxvY2FsaG9zdCBhbmQgbG9jYWxob3N0LmxvY2FsZG9tYWluCisgICAqIGFzIGEgc3BlY2lhbCBjb21tb24gY2FzZSBzbyB0aGF0IGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2YgRElTUExBWQorICAgKiBkb24ndCByZXN1bHQgaW4gZXh0cmEgYnVzIGluc3RhbmNlcy4KKyAgICoKKyAgICogV2UgYWxzbyBraWxsIHRoZSAiOiIgaWYgdGhlcmUncyBub3RoaW5nIGluIGZyb250IG9mIGl0LiBUaGlzCisgICAqIGF2b2lkcyBhbiB1Z2x5IGRvdWJsZSB1bmRlcnNjb3JlIGluIHRoZSBmaWxlbmFtZS4KKyAgICovCisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3QubG9jYWxkb21haW46Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3Q6Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICI6Iik7CisKKyAgLyogcmVwbGFjZSB0aGUgOiBpbiB0aGUgZGlzcGxheSB3aXRoIF8gaWYgdGhlIDogaXMgc3RpbGwgdGhlcmUuCisgICAqIHVzZSBfIGluc3RlYWQgb2YgLSBzaW5jZSBpdCBjYW4ndCBiZSBpbiBob3N0bmFtZXMuCisgICAqLworICBmb3IgKHAgPSBkaXNwbGF5OyAqcDsgKytwKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnOicpCisgICAgICAgICpwID0gJ18nOworICAgIH0KKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKyAgCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuIChob21lKSArIHN0cmxlbiAocHJlZml4KSArIHN0cmxlbiAobWFjaGluZSkgKworICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoZGlzcGxheSkgKyAyKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICAgIGZyZWUgKGRpc3BsYXkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAocmVzdWx0LCBob21lKTsKKyAgc3RyY2F0IChyZXN1bHQsIHByZWZpeCk7CisgIHN0cmNhdCAocmVzdWx0LCBtYWNoaW5lKTsKKyAgc3RyY2F0IChyZXN1bHQsICItIik7CisgIHN0cmNhdCAocmVzdWx0LCBkaXNwbGF5KTsKKyAgZnJlZSAoZGlzcGxheSk7CisKKyAgdmVyYm9zZSAoInNlc3Npb24gZmlsZTogJXNcbiIsIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitlbnN1cmVfc2Vzc2lvbl9kaXJlY3RvcnkgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKmhvbWU7CisgIGNoYXIgKmRpcjsKKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKworICAvKiBiZSBzdXJlIHdlIGhhdmUgc3BhY2UgZm9yIC8gYW5kIG51bCAqLworICBkaXIgPSBtYWxsb2MgKHN0cmxlbiAoaG9tZSkgKyBzdHJsZW4gKERCVVNfRElSKSArIHN0cmxlbiAoREJVU19TRVNTSU9OX0JVU19ESVIpICsgMyk7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJubyBtZW1vcnlcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgc3RyY3B5IChkaXIsIGhvbWUpOworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfU0VTU0lPTl9CVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKyAgCisgIGZyZWUgKGRpcik7Cit9CisKK3N0YXRpYyBEaXNwbGF5ICoKK29wZW5feDExICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICByZXR1cm4geGRpc3BsYXk7CisKKyAgeGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkgKE5VTEwpOworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiQ29ubmVjdGVkIHRvIFgxMSBkaXNwbGF5ICclcydcbiIsIERpc3BsYXlTdHJpbmcgKHhkaXNwbGF5KSk7CisgICAgICBYU2V0SU9FcnJvckhhbmRsZXIgKHhfaW9fZXJyb3JfaGFuZGxlcik7CisgICAgfQorICByZXR1cm4geGRpc3BsYXk7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfeF9hdG9tcyAoRGlzcGxheSAqZGlzcGxheSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgc2VsZWN0aW9uX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX1NFTEVDVElPTl8iOworICBzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiOworICBzdGF0aWMgY29uc3QgY2hhciBwaWRfcHJlZml4W10gPSAiX0RCVVNfU0VTU0lPTl9CVVNfUElEIjsKKyAgc3RhdGljIGludCBpbml0ID0gRkFMU0U7CisgIGNoYXIgKmF0b21fbmFtZTsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY2hhciAqdXNlcl9uYW1lOworICBzdHJ1Y3QgcGFzc3dkICp1c2VyOworCisgIGlmIChpbml0KQorICAgIHJldHVybiBUUlVFOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICB1c2VyID0gZ2V0cHd1aWQgKGdldHVpZCAoKSk7CisgIGlmICh1c2VyID09IE5VTEwpCisgICAgeworICAgICAgdmVyYm9zZSAoIkNvdWxkIG5vdCBkZXRlcm1pbmUgdXNlciBpbmZvcm1hdGlvbjsgYWJvcnRpbmcgWDExIGludGVncmF0aW9uLlxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB1c2VyX25hbWUgPSB4c3RyZHVwKHVzZXItPnB3X25hbWUpOworCisgIGF0b21fbmFtZSA9IG1hbGxvYyAoc3RybGVuIChtYWNoaW5lKSArIHN0cmxlbiAodXNlcl9uYW1lKSArIDIgKworICAgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RybGVuIChzZWxlY3Rpb25fcHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RybGVuIChhZGRyZXNzX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAocGlkX3ByZWZpeCkpKSk7CisgIGlmIChhdG9tX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiQ291bGQgbm90IGNyZWF0ZSBYMTEgYXRvbXM7IGFib3J0aW5nIFgxMSBpbnRlZ3JhdGlvbi5cbiIpOworICAgICAgZnJlZSAodXNlcl9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY3JlYXRlIHRoZSBzZWxlY3Rpb24gYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgc2VsZWN0aW9uX3ByZWZpeCk7CisgIHN0cmNhdCAoYXRvbV9uYW1lLCB1c2VyX25hbWUpOworICBzdHJjYXQgKGF0b21fbmFtZSwgIl8iKTsKKyAgc3RyY2F0IChhdG9tX25hbWUsIG1hY2hpbmUpOworICBzZWxlY3Rpb25fYXRvbSA9IFhJbnRlcm5BdG9tIChkaXNwbGF5LCBhdG9tX25hbWUsIEZBTFNFKTsKKworICAvKiBjcmVhdGUgdGhlIGFkZHJlc3MgcHJvcGVydHkgYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgYWRkcmVzc19wcmVmaXgpOworICBhZGRyZXNzX2F0b20gPSBYSW50ZXJuQXRvbSAoZGlzcGxheSwgYXRvbV9uYW1lLCBGQUxTRSk7CisKKyAgLyogY3JlYXRlIHRoZSBQSUQgcHJvcGVydHkgYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgcGlkX3ByZWZpeCk7CisgIHBpZF9hdG9tID0gWEludGVybkF0b20gKGRpc3BsYXksIGF0b21fbmFtZSwgRkFMU0UpOworCisgIGZyZWUgKGF0b21fbmFtZSk7CisgIGZyZWUgKHVzZXJfbmFtZSk7CisgIGluaXQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEdldHMgdGhlIGRhZW1vbiBhZGRyZXNzIGZyb20gdGhlIFgxMSBkaXNwbGF5LgorICogUmV0dXJucyBGQUxTRSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuIFJldHVybmluZworICogVFJVRSBkb2VzIG5vdCBtZWFuIHRoZSBhZGRyZXNzIGV4aXN0cy4KKyAqLworaW50Cit4MTFfZ2V0X2FkZHJlc3MgKGNoYXIgKipwYWRkcmVzcywgcGlkX3QgKnBpZCwgbG9uZyAqd2lkKQoreworICBpbnQgcmVzdWx0OworICBBdG9tIHR5cGU7CisgIFdpbmRvdyBvd25lcjsKKyAgaW50IGZvcm1hdDsKKyAgdW5zaWduZWQgbG9uZyBpdGVtczsKKyAgdW5zaWduZWQgbG9uZyBhZnRlcjsKKyAgY2hhciAqZGF0YTsKKworICAqcGFkZHJlc3MgPSBOVUxMOworCisgIC8qIGxvY2F0ZSB0aGUgc2VsZWN0aW9uIG93bmVyICovCisgIG93bmVyID0gWEdldFNlbGVjdGlvbk93bmVyICh4ZGlzcGxheSwgc2VsZWN0aW9uX2F0b20pOworICBpZiAob3duZXIgPT0gTm9uZSkKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogbm8gb3duZXIgKi8KKyAgaWYgKHdpZCAhPSBOVUxMKQorICAgICp3aWQgPSAobG9uZykgb3duZXI7CisKKyAgLyogZ2V0IHRoZSBidXMgYWRkcmVzcyAqLworICByZXN1bHQgPSBYR2V0V2luZG93UHJvcGVydHkgKHhkaXNwbGF5LCBvd25lciwgYWRkcmVzc19hdG9tLCAwLCAxMDI0LCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBX1NUUklORywgJnR5cGUsICZmb3JtYXQsICZpdGVtcywgJmFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiopICZkYXRhKTsKKyAgaWYgKHJlc3VsdCAhPSBTdWNjZXNzIHx8IHR5cGUgPT0gTm9uZSB8fCBhZnRlciAhPSAwIHx8IGRhdGEgPT0gTlVMTCB8fCBmb3JtYXQgIT0gOCkKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgLyogZXJyb3IgKi8KKworICAqcGFkZHJlc3MgPSB4c3RyZHVwIChkYXRhKTsKKyAgWEZyZWUgKGRhdGEpOworCisgIC8qIGdldCB0aGUgUElEICovCisgIGlmIChwaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICAqcGlkID0gMDsKKyAgICAgIHJlc3VsdCA9IFhHZXRXaW5kb3dQcm9wZXJ0eSAoeGRpc3BsYXksIG93bmVyLCBwaWRfYXRvbSwgMCwgc2l6ZW9mIHBpZCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBX0NBUkRJTkFMLCAmdHlwZSwgJmZvcm1hdCwgJml0ZW1zLCAmYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICoqKSAmZGF0YSk7CisgICAgICBpZiAocmVzdWx0ID09IFN1Y2Nlc3MgJiYgdHlwZSAhPSBOb25lICYmIGFmdGVyID09IDAgJiYgZGF0YSAhPSBOVUxMICYmIGZvcm1hdCA9PSAzMikKKyAgICAgICAgKnBpZCA9IChwaWRfdCkgKihsb25nKikgZGF0YTsKKyAgICAgIFhGcmVlIChkYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7ICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworfQorCisvKgorICogU2F2ZXMgdGhlIGFkZHJlc3MgaW4gdGhlIFgxMSBkaXNwbGF5LiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucyAtMS4gSWYgdGhlIHNlbGVjdGlvbiBhbHJlYWR5IGV4aXN0cywKKyAqIHJldHVybnMgMS4gKGkuZS4gYW5vdGhlciBkYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nKQorICovCitzdGF0aWMgV2luZG93CitzZXRfYWRkcmVzc19pbl94MTEoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkKQoreworICBjaGFyICpjdXJyZW50X2FkZHJlc3M7CisgIFdpbmRvdyB3aWQgPSBOb25lOworICB1bnNpZ25lZCBsb25nIHBpZDMyOyAvKiBYbGliIHByb3BlcnR5IGZ1bmN0aW9ucyB3YW50IF9sb25nXyBub3QgMzItYml0IGZvciBmb3JtYXQgIjMyIiAqLworICAKKyAgLyogbG9jayB0aGUgWDExIGRpc3BsYXkgdG8gbWFrZSBzdXJlIHdlJ3JlIGRvaW5nIHRoaXMgYXRvbWljYWxseSAqLworICBYR3JhYlNlcnZlciAoeGRpc3BsYXkpOworCisgIGlmICgheDExX2dldF9hZGRyZXNzICgmY3VycmVudF9hZGRyZXNzLCBOVUxMLCBOVUxMKSkKKyAgICB7CisgICAgICAvKiBlcnJvciEgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoY3VycmVudF9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgLyogc29tZW9uZSBzYXZlZCB0aGUgYWRkcmVzcyBpbiB0aGUgbWVhbnRpbWUgKi8KKyAgICAgIGZyZWUgKGN1cnJlbnRfYWRkcmVzcyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQ3JlYXRlIG91ciB3aW5kb3cgKi8KKyAgd2lkID0gWENyZWF0ZVdpbmRvdyAoeGRpc3BsYXksIFJvb3RXaW5kb3cgKHhkaXNwbGF5LCAwKSwgLTIwLCAtMjAsIDEwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgQ29weUZyb21QYXJlbnQsIElucHV0T25seSwgQ29weUZyb21QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworICB2ZXJib3NlICgiQ3JlYXRlZCB3aW5kb3cgJWRcbiIsIHdpZCk7CisKKyAgLyogU2F2ZSB0aGUgcHJvcGVydHkgaW4gdGhlIHdpbmRvdyAqLworICBYQ2hhbmdlUHJvcGVydHkgKHhkaXNwbGF5LCB3aWQsIGFkZHJlc3NfYXRvbSwgWEFfU1RSSU5HLCA4LCBQcm9wTW9kZVJlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilhZGRyZXNzLCBzdHJsZW4gKGFkZHJlc3MpKTsKKyAgcGlkMzIgPSBwaWQ7CisgIFhDaGFuZ2VQcm9wZXJ0eSAoeGRpc3BsYXksIHdpZCwgcGlkX2F0b20sIFhBX0NBUkRJTkFMLCAzMiwgUHJvcE1vZGVSZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopJnBpZDMyLCAxKTsKKworICAvKiBOb3cgZ3JhYiB0aGUgc2VsZWN0aW9uICovCisgIFhTZXRTZWxlY3Rpb25Pd25lciAoeGRpc3BsYXksIHNlbGVjdGlvbl9hdG9tLCB3aWQsIEN1cnJlbnRUaW1lKTsKKworIG91dDoKKyAgLyogVW5ncmFiIHRoZSBzZXJ2ZXIgdG8gbGV0IG90aGVyIHBlb3BsZSB1c2UgaXQgdG9vICovCisgIFhVbmdyYWJTZXJ2ZXIgKHhkaXNwbGF5KTsKKworICAvKiBBbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHVuZ3JhYiBnZXRzIHNlbnQgdG8gWDExICovCisgIFhGbHVzaCAoeGRpc3BsYXkpOworCisgIHJldHVybiB3aWQ7Cit9CisKKy8qCisgKiBTYXZlcyB0aGUgc2Vzc2lvbiBhZGRyZXNzIGluIHNlc3Npb24gZmlsZS4gUmV0dXJucyBUUlVFIG9uCisgKiBzdWNjZXNzLCBGQUxTRSBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQKK3NldF9hZGRyZXNzX2luX2ZpbGUgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgV2luZG93IHdpZCkKK3sKKyAgY2hhciAqc2Vzc2lvbl9maWxlOworICBGSUxFICpmOworCisgIGVuc3VyZV9zZXNzaW9uX2RpcmVjdG9yeSAoKTsKKyAgc2Vzc2lvbl9maWxlID0gZ2V0X3Nlc3Npb25fZmlsZSgpOworICBpZiAoc2Vzc2lvbl9maWxlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGYgPSBmb3BlbiAoc2Vzc2lvbl9maWxlLCAidyIpOworICBmcmVlIChzZXNzaW9uX2ZpbGUpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAvKiBzb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgZnByaW50ZiAoZiwKKyAgICAgICAgICAgIiMgVGhpcyBmaWxlIGFsbG93cyBwcm9jZXNzZXMgb24gdGhlIG1hY2hpbmUgd2l0aCBpZCAlcyB1c2luZyBcbiIKKyAgICAgICAgICAgIiMgZGlzcGxheSAlcyB0byBmaW5kIHRoZSBELUJ1cyBzZXNzaW9uIGJ1cyB3aXRoIHRoZSBiZWxvdyBhZGRyZXNzLlxuIgorICAgICAgICAgICAiIyBJZiB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXQgd2lsbFxuIgorICAgICAgICAgICAiIyBiZSB1c2VkIHJhdGhlciB0aGFuIHRoaXMgZmlsZS5cbiIKKyAgICAgICAgICAgIiMgU2VlIFwibWFuIGRidXMtbGF1bmNoXCIgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nJXMnXG4iCisgICAgICAgICAgICJEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGRcbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkXG4iLAorICAgICAgICAgICBnZXRfbWFjaGluZV91dWlkICgpLAorICAgICAgICAgICBnZXRlbnYgKCJESVNQTEFZIiksCisgICAgICAgICAgIGFkZHJlc3MsIChsb25nKXBpZCwgKGxvbmcpd2lkKTsKKworICBmY2xvc2UgKGYpOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK3gxMV9zYXZlX2FkZHJlc3MgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgbG9uZyAqd2lkKQoreworICBXaW5kb3cgaWQgPSBzZXRfYWRkcmVzc19pbl94MTEgKGFkZHJlc3MsIHBpZCk7CisgIGlmIChpZCAhPSBOb25lKQorICAgIHsKKyAgICAgIGlmICghc2V0X2FkZHJlc3NfaW5fZmlsZSAoYWRkcmVzcywgcGlkLCBpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHdpZCAhPSBOVUxMKQorICAgICAgICAqd2lkID0gKGxvbmcpIGlkOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAoreDExX2luaXQgKHZvaWQpCit7CisgIHJldHVybiBvcGVuX3gxMSAoKSAhPSBOVUxMICYmIGluaXRfeF9hdG9tcyAoeGRpc3BsYXkpOworfQorCit2b2lkCit4MTFfaGFuZGxlX2V2ZW50ICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICB3aGlsZSAoWFBlbmRpbmcgKHhkaXNwbGF5KSkKKyAgICAgICAgeworICAgICAgICAgIFhFdmVudCBpZ25vcmVkOworICAgICAgICAgIFhOZXh0RXZlbnQgKHhkaXNwbGF5LCAmaWdub3JlZCk7CisgICAgICAgIH0KKyAgICB9Cit9ICAKKworI2Vsc2UKK3ZvaWQgZHVtbXlfZGJ1c19sYXVuY2hfeDExICh2b2lkKTsKKwordm9pZCBkdW1teV9kYnVzX2xhdW5jaF94MTEgKHZvaWQpIHsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9kYnVzLWxhdW5jaC5jIGIvdG9vbHMvZGJ1cy1sYXVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU0YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1sYXVuY2guYwpAQCAtMCwwICsxLDEzODIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guYyAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbGF1bmNoLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitleHRlcm4gRGlzcGxheSAqeGRpc3BsYXk7CisjZW5kaWYKKworI2luY2x1ZGUgImRidXMvZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc3lzZGVwcy11bml4LmgiCisKKyNpbmNsdWRlICJ0b29sLWNvbW1vbi5oIgorCisvKiBQUk9DRVNTRVMKKyAqCisgKiBJZiB5b3UgYXJlIGluIGEgc2hlbGwgYW5kIHJ1biAiZGJ1cy1sYXVuY2ggbXlhcHAiLCBoZXJlIGlzIHdoYXQgaGFwcGVuczoKKyAqCisgKiBzaGVsbCBbKl0KKyAqICAgXC0gbWFpbigpICAgICAgICAgICAgICAgLS1leGVjLS0+IG15YXBwWypdCisgKiAgICAgIFwtICJpbnRlcm1lZGlhdGUgcGFyZW50IgorICogICAgICAgICBcLSBidXMtcnVubmVyICAgICAtLWV4ZWMtLT4gZGJ1cy1kYWVtb24gLS1mb3JrCisgKiAgICAgICAgIFwtIGJhYnlzaXR0ZXJbKl0gICAgICAgICAgICBcLSBmaW5hbCBkYnVzLWRhZW1vblsqXQorICoKKyAqIFByb2Nlc3NlcyBtYXJrZWQgWypdIHN1cnZpdmUgdGhlIGluaXRpYWwgZmx1cnJ5IG9mIGFjdGl2aXR5LgorICoKKyAqIElmIHlvdSBydW4gImRidXMtbGF1bmNoIC0tc2gtc3ludGF4IiB0aGVuIHRoZSBkaWFncmFtIGlzIHRoZSBzYW1lLCBleGNlcHQKKyAqIHRoYXQgbWFpbigpIHByaW50cyB2YXJpYWJsZXMgYW5kIGV4aXRzIDAgaW5zdGVhZCBvZiBleGVjJ2luZyBteWFwcC4KKyAqCisgKiBQSVBFUworICoKKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtcGlkICAgICAtPiBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGUgICAgIC0+IG1haW4KKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtYWRkcmVzcyAtPiBidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlIC0+IG1haW4KKyAqIG1haW4gICAgICAgICAgICAgICAgICAgICAgICAtPiBidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZSAgIC0+IGJhYnlzaXR0ZXIKKyAqCisgKiBUaGUgaW50ZXJtZWRpYXRlIHBhcmVudCBsb29rcyBwcmV0dHkgdXNlbGVzcyBhdCBmaXJzdCBnbGFuY2UuIEl0cyBwdXJwb3NlCisgKiBpcyB0byBhdm9pZCB0aGUgYnVzLXJ1bm5lciBiZWNvbWluZyBhIHpvbWJpZTogd2hlbiB0aGUgaW50ZXJtZWRpYXRlIHBhcmVudAorICogdGVybWluYXRlcywgdGhlIGJ1cy1ydW5uZXIgYW5kIGJhYnlzaXR0ZXIgYXJlIHJlcGFyZW50ZWQgdG8gaW5pdCwgd2hpY2gKKyAqIHJlYXBzIHRoZW0gaWYgdGhleSBoYXZlIGZpbmlzaGVkLiBXZSBjYW4ndCByZWx5IG9uIG1haW4oKSB0byByZWFwIGFyYml0cmFyeQorICogY2hpbGRyZW4gYmVjYXVzZSBpdCBtaWdodCBleGVjIG15YXBwLCBhZnRlciB3aGljaCBpdCBjYW4ndCBiZSByZWxpZWQgb24gdG8KKyAqIHJlYXAgaXRzIGNoaWxkcmVuLiBXZSAqY2FuKiByZWx5IG9uIG1haW4oKSB0byByZWFwIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50LAorICogYmVjYXVzZSB0aGF0IGhhcHBlbnMgYmVmb3JlIGl0IGV4ZWNzIG15YXBwLgorICoKKyAqIEl0J3MgdW5jbGVhciB3aHkgZGJ1cy1kYWVtb24gbmVlZHMgdG8gZm9yaywgYnV0IHdlIGV4cGxpY2l0bHkgdGVsbCBpdCB0bworICogZm9yIHNvbWUgcmVhc29uLCB0aGVuIHdhaXQgZm9yIGl0LiBJZiB3ZSBsZWZ0IGl0IHVuZGVmaW5lZCwgYSBmb3JraW5nCisgKiBkYnVzLWRhZW1vbiB3b3VsZCBnZXQgdGhlIHBhcmVudCBwcm9jZXNzIHJlcGFyZW50ZWQgdG8gaW5pdCBhbmQgcmVhcGVkCisgKiB3aGVuIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50IHRlcm1pbmF0ZWQsIGFuZCBhIG5vbi1mb3JraW5nIGRidXMtZGFlbW9uCisgKiB3b3VsZCBnZXQgcmVwYXJlbnRlZCB0byBpbml0IGFuZCBjYXJyeSBvbiB0aGVyZS4KKyAqCisgKiBteWFwcCBpcyBleGVjJ2QgYnkgdGhlIHByb2Nlc3MgdGhhdCBpbml0aWFsbHkgcmFuIG1haW4oKSBzbyB0aGF0IGl0J3MKKyAqIHRoZSBzaGVsbCdzIGNoaWxkLCBzbyB0aGUgc2hlbGwga25vd3MgaG93IHRvIGRvIGpvYiBjb250cm9sIGFuZCBzdHVmZi4KKyAqIFRoaXMgaXMgZGVzaXJhYmxlIGZvciB0aGUgImRidXMtbGF1bmNoIGFuIGFwcGxpY2F0aW9uIiB1c2UtY2FzZSwgbGVzcyBzbworICogZm9yIHRoZSAiZGJ1cy1sYXVuY2ggYSB0ZXN0IHN1aXRlIGluIGFuIGlzb2xhdGVkIHNlc3Npb24iIHVzZS1jYXNlLgorICovCisKK3N0YXRpYyBjaGFyKiBtYWNoaW5lX3V1aWQgPSBOVUxMOworCitjb25zdCBjaGFyKgorZ2V0X21hY2hpbmVfdXVpZCAodm9pZCkKK3sKKyAgcmV0dXJuIG1hY2hpbmVfdXVpZDsKK30KKworc3RhdGljIHZvaWQKK3NhdmVfbWFjaGluZV91dWlkIChjb25zdCBjaGFyICp1dWlkX2FyZykKK3sKKyAgaWYgKHN0cmxlbiAodXVpZF9hcmcpICE9IDMyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1hY2hpbmUgSUQgJyVzJyBsb29rcyBsaWtlIGl0J3MgdGhlIHdyb25nIGxlbmd0aCwgc2hvdWxkIGJlIDMyIGhleCBkaWdpdHMiLAorICAgICAgICAgICAgICAgdXVpZF9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1hY2hpbmVfdXVpZCA9IF9kYnVzX3N0cmR1cCAodXVpZF9hcmcpOworfQorCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKy8qIFJlYWQgdGhlIG1hY2hpbmUgdXVpZCBmcm9tIGZpbGUgaWYgbmVlZGVkLiBSZXR1cm5zIFRSVUUgaWYgbWFjaGluZV91dWlkIGlzCisgKiBzZXQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludAorcmVhZF9tYWNoaW5lX3V1aWRfaWZfbmVlZGVkICh2b2lkKQoreworICBpZiAobWFjaGluZV91dWlkICE9IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbWFjaGluZV91dWlkID0gZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAoKTsKKworICBpZiAobWFjaGluZV91dWlkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcmJvc2UgKCJVSUQ6ICVzXG4iLCBtYWNoaW5lX3V1aWQpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1gxMSAqLworCit2b2lkCit2ZXJib3NlIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAuLi4pCit7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHZhX2xpc3QgYXJnczsKKyAgc3RhdGljIGludCB2ZXJib3NlID0gVFJVRTsKKyAgc3RhdGljIGludCB2ZXJib3NlX2luaXR0ZWQgPSBGQUxTRTsKKyAgCisgIC8qIHRoaW5ncyBhcmUgd3JpdHRlbiBhIGJpdCBvZGRseSBoZXJlIHNvIHRoYXQKKyAgICogaW4gdGhlIG5vbi12ZXJib3NlIGNhc2Ugd2UganVzdCBoYXZlIHRoZSBvbmUKKyAgICogY29uZGl0aW9uYWwgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICovCisgIGlmICghdmVyYm9zZSkKKyAgICByZXR1cm47CisgIAorICBpZiAoIXZlcmJvc2VfaW5pdHRlZCkKKyAgICB7CisgICAgICB2ZXJib3NlID0gZ2V0ZW52ICgiREJVU19WRVJCT1NFIikgIT0gTlVMTDsKKyAgICAgIHZlcmJvc2VfaW5pdHRlZCA9IFRSVUU7CisgICAgICBpZiAoIXZlcmJvc2UpCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAiLCAodW5zaWduZWQgbG9uZykgZ2V0cGlkICgpKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworfQorCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1sYXVuY2ggWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tc2gtc3ludGF4XSIKKyAgICAgICAgICAgIiBbLS1jc2gtc3ludGF4XSBbLS1hdXRvLXN5bnRheF0gWy0tYmluYXJ5LXN5bnRheF0gWy0tY2xvc2Utc3RkZXJyXSIKKyAgICAgICAgICAgIiBbLS1leGl0LXdpdGgtc2Vzc2lvbl0gWy0tYXV0b2xhdW5jaD1NQUNISU5FSURdIgorICAgICAgICAgICAiIFstLWNvbmZpZy1maWxlPUZJTEVOQU1FXSBbUFJPR1JBTV0gW0FSR1MuLi5dXG4iKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiRC1CdXMgTWVzc2FnZSBCdXMgTGF1bmNoZXIgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitjaGFyICoKK3hzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgaW50IGxlbjsKKyAgY2hhciAqY29weTsKKyAgCisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKworICBjb3B5ID0gbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIHN0ciwgbGVuICsgMSk7CisgIAorICByZXR1cm4gY29weTsKK30KKworc3RhdGljIGNoYXIgKgorY29uY2F0MiAoY29uc3QgY2hhciAqYSwKKyAgICBjb25zdCBjaGFyICpiKQoreworICBzaXplX3QgbGEsIGxiOworICBjaGFyICpyZXQ7CisKKyAgbGEgPSBzdHJsZW4gKGEpOworICBsYiA9IHN0cmxlbiAoYik7CisKKyAgcmV0ID0gbWFsbG9jIChsYSArIGxiICsgMSk7CisKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAocmV0LCBhLCBsYSk7CisgIG1lbWNweSAocmV0ICsgbGEsIGIsIGxiICsgMSk7CisgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2xpbmUgKGludCAgICAgICAgZmQsCisgICAgICAgICAgIGNoYXIgICAgICAqYnVmLAorICAgICAgICAgICBzaXplX3QgICAgIG1heGxlbikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsKKyAgUmVhZFN0YXR1cyByZXR2YWw7CisKKyAgbWVtc2V0IChidWYsICdcMCcsIG1heGxlbik7CisgIG1heGxlbiAtPSAxOyAvKiBlbnN1cmUgbnVsIHRlcm0gKi8KKyAgCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsgICAgCisgICAgICBzaXplX3QgdG9fcmVhZDsKKyAgICAgIAorICAgIGFnYWluOgorICAgICAgdG9fcmVhZCA9IG1heGxlbiAtIGJ5dGVzOworCisgICAgICBpZiAodG9fcmVhZCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgYnVmICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VPRjsKKyAgICAgICAgICBicmVhazsgLyogRU9GICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogY2h1bmsgPiAwICovCisJYnl0ZXMgKz0gY2h1bms7CisgICAgfQorCisgIGlmIChyZXR2YWwgPT0gUkVBRF9TVEFUVVNfRU9GICYmCisgICAgICBieXRlcyA+IDApCisgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICAvKiB3aGFjayBuZXdsaW5lICovCisgIGlmIChyZXR2YWwgIT0gUkVBRF9TVEFUVVNfRVJST1IgJiYKKyAgICAgIGJ5dGVzID4gMCAmJgorICAgICAgYnVmW2J5dGVzLTFdID09ICdcbicpCisgICAgYnVmW2J5dGVzLTFdID0gJ1wwJzsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX3BpZCAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICBwaWRfdCAgICAgKmJ1ZikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsKKyAgUmVhZFN0YXR1cyByZXR2YWw7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOyAgICAKKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIGlmIChjaHVuayA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgICAgCisgICAgICBpZiAoY2h1bmsgPCAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNodW5rID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FT0Y7CisgICAgICAgICAgYnJlYWs7IC8qIEVPRiAqLworICAgICAgICB9CisgICAgICBlbHNlIC8qIGNodW5rID4gMCAqLworCWJ5dGVzICs9IGNodW5rOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorZG9fd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIHNpemVfdCBieXRlc193cml0dGVuOworICBpbnQgcmV0OworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorIGFnYWluOgorICAKKyAgcmV0ID0gd3JpdGUgKGZkLCAoKGNvbnN0IGNoYXIqKWJ1ZikgKyBieXRlc193cml0dGVuLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4pOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIHBpcGUhICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOyAvKiBnaXZlIHVwLCB3ZSBzdWNrICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBieXRlc193cml0dGVuICs9IHJldDsKKyAgCisgIGlmIChieXRlc193cml0dGVuIDwgY291bnQpCisgICAgZ290byBhZ2FpbjsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3BpZCAoaW50ICAgZmQsCisgICAgICAgICAgIHBpZF90IHBpZCkKK3sKKyAgZG9fd3JpdGUgKGZkLCAmcGlkLCBzaXplb2YgKHBpZCkpOworfQorCitzdGF0aWMgaW50Citkb193YWl0cGlkIChwaWRfdCBwaWQpCit7CisgIGludCByZXQ7CisgIAorIGFnYWluOgorICByZXQgPSB3YWl0cGlkIChwaWQsIE5VTEwsIDApOworCisgIGlmIChyZXQgPCAwICYmCisgICAgICBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBwaWRfdCBidXNfcGlkX3RvX2tpbGwgPSAtMTsKKworc3RhdGljIHZvaWQKK2tpbGxfYnVzKHZvaWQpCit7CisgIGlmIChidXNfcGlkX3RvX2tpbGwgPD0gMCkKKyAgICByZXR1cm47CisKKyAgdmVyYm9zZSAoIktpbGxpbmcgbWVzc2FnZSBidXMgYW5kIGV4aXRpbmcgYmFieXNpdHRlclxuIik7CisgIGtpbGwgKGJ1c19waWRfdG9fa2lsbCwgU0lHVEVSTSk7CisgIHNsZWVwICgzKTsKKyAga2lsbCAoYnVzX3BpZF90b19raWxsLCBTSUdLSUxMKTsKK30KKwordm9pZAora2lsbF9idXNfYW5kX2V4aXQgKGludCBleGl0Y29kZSkKK3sKKyAgLyogaW4gY2FzZSB0aGVzZSBwb2ludCB0byBhbnkgTkZTIG1vdW50cywgZ2V0IHJpZCBvZiB0aGVtIGltbWVkaWF0ZWx5ICovCisgIGNsb3NlICgwKTsKKyAgY2xvc2UgKDEpOworICBjbG9zZSAoMik7CisKKyAga2lsbF9idXMoKTsKKworICBleGl0IChleGl0Y29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF92YXJpYWJsZXMgKGNvbnN0IGNoYXIgKmJ1c19hZGRyZXNzLCBwaWRfdCBidXNfcGlkLCBsb25nIGJ1c193aWQsCisJCSBpbnQgY19zaGVsbF9zeW50YXgsIGludCBib3VybmVfc2hlbGxfc3ludGF4LAorCQkgaW50IGJpbmFyeV9zeW50YXgpCit7CisgIGlmIChiaW5hcnlfc3ludGF4KQorICAgIHsKKyAgICAgIGRvX3dyaXRlICgxLCBidXNfYWRkcmVzcywgc3RybGVuIChidXNfYWRkcmVzcykgKyAxKTsKKyAgICAgIGRvX3dyaXRlICgxLCAmYnVzX3BpZCwgc2l6ZW9mIGJ1c19waWQpOworICAgICAgZG9fd3JpdGUgKDEsICZidXNfd2lkLCBzaXplb2YgYnVzX3dpZCk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChjX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBwcmludGYgKCJzZXRlbnYgREJVU19TRVNTSU9OX0JVU19BRERSRVNTICclcyc7XG4iLCBidXNfYWRkcmVzcyk7CQorICAgICAgaWYgKGJ1c19waWQpCisgICAgICAgIHByaW50ZiAoInNldCBEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3BpZCk7CisgICAgICBpZiAoYnVzX3dpZCkKKyAgICAgICAgcHJpbnRmICgic2V0IERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkO1xuIiwgKGxvbmcpIGJ1c193aWQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KKyAgZWxzZSBpZiAoYm91cm5lX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JyVzJztcbiIsIGJ1c19hZGRyZXNzKTsKKyAgICAgIHByaW50ZiAoImV4cG9ydCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M7XG4iKTsKKyAgICAgIGlmIChidXNfcGlkKQorICAgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3BpZCk7CisgICAgICBpZiAoYnVzX3dpZCkKKyAgICAgICAgcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3dpZCk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSVzXG4iLCBidXNfYWRkcmVzcyk7CisgICAgICBpZiAoYnVzX3BpZCkKKyAgICAgICAgcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19QSUQ9JWxkXG4iLCAobG9uZykgYnVzX3BpZCk7CisgICAgICBpZiAoYnVzX3dpZCkKKwlwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lEPSVsZFxuIiwgKGxvbmcpIGJ1c193aWQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KK30KKworc3RhdGljIGludCBnb3Rfc2lnaHVwID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitzaWduYWxfaGFuZGxlciAoaW50IHNpZykKK3sKKyAgc3dpdGNoIChzaWcpCisgICAgeworICAgIGNhc2UgU0lHSFVQOgorICAgIGNhc2UgU0lHSU5UOgorICAgIGNhc2UgU0lHVEVSTToKKyAgICAgIGdvdF9zaWdodXAgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAora2lsbF9idXNfd2hlbl9zZXNzaW9uX2VuZHMgKHZvaWQpCit7CisgIGludCB0dHlfZmQ7CisgIGludCB4X2ZkOworICBmZF9zZXQgcmVhZF9zZXQ7CisgIGZkX3NldCBlcnJfc2V0OworICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKyAgc2lnc2V0X3QgZW1wdHlfbWFzazsKKyAgCisgIC8qIGluc3RhbGwgU0lHSFVQIGhhbmRsZXIgKi8KKyAgZ290X3NpZ2h1cCA9IEZBTFNFOworICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IHNpZ25hbF9oYW5kbGVyOworICBhY3Quc2FfbWFzayAgICA9IGVtcHR5X21hc2s7CisgIGFjdC5zYV9mbGFncyAgID0gMDsKKyAgc2lnYWN0aW9uIChTSUdIVVAsICAmYWN0LCBOVUxMKTsKKyAgc2lnYWN0aW9uIChTSUdURVJNLCAgJmFjdCwgTlVMTCk7CisgIHNpZ2FjdGlvbiAoU0lHSU5ULCAgJmFjdCwgTlVMTCk7CisgIAorI2lmZGVmIERCVVNfQlVJTERfWDExCisgIHgxMV9pbml0KCk7CisgIGlmICh4ZGlzcGxheSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHhfZmQgPSBDb25uZWN0aW9uTnVtYmVyICh4ZGlzcGxheSk7CisgICAgfQorICBlbHNlCisgICAgeF9mZCA9IC0xOworI2Vsc2UKKyAgeF9mZCA9IC0xOworI2VuZGlmCisKKyAgaWYgKGlzYXR0eSAoMCkpCisgICAgdHR5X2ZkID0gMDsKKyAgZWxzZQorICAgIHR0eV9mZCA9IC0xOworCisgIGlmICh4X2ZkID49IDApCisgICAgeworICAgICAgdmVyYm9zZSAoInNlc3Npb24gbGlmZXRpbWUgaXMgZGVmaW5lZCBieSBYLCBub3QgbW9uaXRvcmluZyBzdGRpblxuIik7CisgICAgICB0dHlfZmQgPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKHR0eV9mZCA+PSAwKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJzdGRpbiBpc2F0dHkoKSwgbW9uaXRvcmluZyBpdFxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmVyYm9zZSAoInN0ZGluIHdhcyBub3QgYSBUVFksIG5vdCBtb25pdG9yaW5nIGl0XG4iKTsKKyAgICB9CisKKyAgaWYgKHR0eV9mZCA8IDAgJiYgeF9mZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm8gdGVybWluYWwgb24gc3RhbmRhcmQgaW5wdXQgYW5kIG5vIFggZGlzcGxheTsgY2Fubm90IGF0dGFjaCBtZXNzYWdlIGJ1cyB0byBzZXNzaW9uIGxpZmV0aW1lXG4iKTsKKyAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgxKTsKKyAgICB9CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgICAgIC8qIER1bXAgZXZlbnRzIG9uIHRoZSBmbG9vciwgYW5kIGxldAorICAgICAgICogSU8gZXJyb3IgaGFuZGxlciBydW4gaWYgd2UgbG9zZQorICAgICAgICogdGhlIFggY29ubmVjdGlvbi4gSXQncyBpbXBvcnRhbnQgdG8KKyAgICAgICAqIHJ1biB0aGlzIGJlZm9yZSBnb2luZyBpbnRvIHNlbGVjdCgpIHNpbmNlCisgICAgICAgKiB3ZSBtaWdodCBoYXZlIHF1ZXVlZCBvdXRnb2luZyBtZXNzYWdlcyBvcgorICAgICAgICogZXZlbnRzLgorICAgICAgICovCisgICAgICB4MTFfaGFuZGxlX2V2ZW50ICgpOworI2VuZGlmCisgICAgICAKKyAgICAgIEZEX1pFUk8gKCZyZWFkX3NldCk7CisgICAgICBGRF9aRVJPICgmZXJyX3NldCk7CisKKyAgICAgIGlmICh0dHlfZmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIEZEX1NFVCAodHR5X2ZkLCAmcmVhZF9zZXQpOworICAgICAgICAgIEZEX1NFVCAodHR5X2ZkLCAmZXJyX3NldCk7CisgICAgICAgIH0KKworICAgICAgaWYgKHhfZmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIEZEX1NFVCAoeF9mZCwgJnJlYWRfc2V0KTsKKyAgICAgICAgICBGRF9TRVQgKHhfZmQsICZlcnJfc2V0KTsKKyAgICAgICAgfQorCisgICAgICBzZWxlY3QgKE1BWCAodHR5X2ZkLCB4X2ZkKSArIDEsCisgICAgICAgICAgICAgICZyZWFkX3NldCwgTlVMTCwgJmVycl9zZXQsIE5VTEwpOworCisgICAgICBpZiAoZ290X3NpZ2h1cCkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UgKCJHb3QgU0lHSFVQLCBleGl0aW5nXG4iKTsKKyAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMCk7CisgICAgICAgIH0KKyAgICAgIAorI2lmZGVmIERCVVNfQlVJTERfWDExCisgICAgICAvKiBFdmVudHMgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHdlIHNlbGVjdCBhZ2FpbgorICAgICAgICovCisgICAgICBpZiAoeF9mZCA+PSAwKQorICAgICAgICB2ZXJib3NlICgiWCBmZCBjb25kaXRpb24gcmVhZGluZyA9ICVkIGVycm9yID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIEZEX0lTU0VUICh4X2ZkLCAmcmVhZF9zZXQpLAorICAgICAgICAgICAgICAgICBGRF9JU1NFVCAoeF9mZCwgJmVycl9zZXQpKTsKKyNlbmRpZgorCisgICAgICBpZiAodHR5X2ZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoRkRfSVNTRVQgKHR0eV9mZCwgJnJlYWRfc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgIGNoYXIgZGlzY2FyZFs1MTJdOworCisgICAgICAgICAgICAgIHZlcmJvc2UgKCJUVFkgcmVhZHkgZm9yIHJlYWRpbmdcbiIpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IHJlYWQgKHR0eV9mZCwgZGlzY2FyZCwgc2l6ZW9mIChkaXNjYXJkKSk7CisKKyAgICAgICAgICAgICAgdmVyYm9zZSAoIlJlYWQgJWQgYnl0ZXMgZnJvbSBUVFkgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCwgZXJybm8pOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICAgICAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMCk7IC8qIEVPRiAqLworICAgICAgICAgICAgICBlbHNlIGlmIChieXRlc19yZWFkIDwgMCAmJiBlcnJubyAhPSBFSU5UUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gSSBkb24ndCB0aGluazsgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAqIHNwaW5uaW5nIG9uIHRoZSBmZCBmb3JldmVyIHdlIGV4aXQuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImRidXMtbGF1bmNoOiBlcnJvciByZWFkaW5nIGZyb20gc3RkaW46ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKEZEX0lTU0VUICh0dHlfZmQsICZlcnJfc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdmVyYm9zZSAoIlRUWSBoYXMgZXJyb3IgY29uZGl0aW9uXG4iKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2JhYnlzaXQgKGludCAgIGV4aXRfd2l0aF9zZXNzaW9uLAorICAgICAgICAgcGlkX3QgY2hpbGRfcGlkLAorICAgICAgICAgaW50ICAgcmVhZF9idXNfcGlkX2ZkKSAgLyogcmVhZCBwaWQgZnJvbSBoZXJlICovCit7CisgIGludCByZXQ7CisgIGludCBkZXZfbnVsbF9mZDsKKyAgY29uc3QgY2hhciAqczsKKworICB2ZXJib3NlICgiYmFieXNpdHRpbmcsIGV4aXRfd2l0aF9zZXNzaW9uID0gJWQsIGNoaWxkX3BpZCA9ICVsZCwgcmVhZF9idXNfcGlkX2ZkID0gJWRcbiIsCisgICAgICAgICAgIGV4aXRfd2l0aF9zZXNzaW9uLCAobG9uZykgY2hpbGRfcGlkLCByZWFkX2J1c19waWRfZmQpOworICAKKyAgLyogV2UgY2hkaXIgKCIvIikgc2luY2Ugd2UgYXJlIHBlcnNpc3RlbnQgYW5kIGRhZW1vbi1saWtlLCBhbmQgZm9yaworICAgKiBhZ2FpbiBzbyBkYnVzLWxhdW5jaCBjYW4gcmVhcCB0aGUgcGFyZW50LiAgSG93ZXZlciwgd2UgZG9uJ3QKKyAgICogc2V0c2lkKCkgb3IgY2xvc2UgZmQgMCBiZWNhdXNlIHRoZSBpZGVhIGlzIHRvIHJlbWFpbiBhdHRhY2hlZAorICAgKiB0byB0aGUgdHR5IGFuZCB0aGUgWCBzZXJ2ZXIgaW4gb3JkZXIgdG8ga2lsbCB0aGUgbWVzc2FnZSBidXMKKyAgICogd2hlbiB0aGUgc2Vzc2lvbiBlbmRzLgorICAgKi8KKworICBpZiAoY2hkaXIgKCIvIikgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkIG5vdCBjaGFuZ2UgdG8gcm9vdCBkaXJlY3Rvcnk6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQ2xvc2Ugc3Rkb3V0L3N0ZGVyciBzbyB3ZSBkb24ndCBibG9jayBhbiAiZXZhbCIgb3Igb3RoZXJ3aXNlCisgICAqIGxvY2sgdXAuIHN0ZG91dCBpcyBzdGlsbCBjaGFpbmluZyB0aHJvdWdoIHRvIGRidXMtbGF1bmNoCisgICAqIGFuZCBpbiB0dXJuIHRvIHRoZSBwYXJlbnQgc2hlbGwuCisgICAqLworICBkZXZfbnVsbF9mZCA9IG9wZW4gKCIvZGV2L251bGwiLCBPX1JEV1IpOworICBpZiAoZGV2X251bGxfZmQgPj0gMCkKKyAgICB7CisgICAgICBpZiAoIWV4aXRfd2l0aF9zZXNzaW9uKQorICAgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMCk7CisgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMSk7CisgICAgICBzID0gZ2V0ZW52ICgiREJVU19ERUJVR19PVVRQVVQiKTsKKyAgICAgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKKyAgICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDIpOworICAgICAgY2xvc2UgKGRldl9udWxsX2ZkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAvZGV2L251bGw6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAvKiBjb250aW51ZSwgd2h5IG5vdCAqLworICAgIH0KKyAgCisgIHJldCA9IGZvcmsgKCk7CisKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9yaygpIGZhaWxlZCBpbiBiYWJ5c2l0dGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXQgPiAwKQorICAgIHsKKyAgICAgIC8qIFBhcmVudCByZWFwcyBwcmUtZm9yayBwYXJ0IG9mIGJ1cyBkYWVtb24sIHRoZW4gZXhpdHMgYW5kIGlzCisgICAgICAgKiByZWFwZWQgc28gdGhlIGJhYnlzaXR0ZXIgaXNuJ3QgYSB6b21iaWUKKyAgICAgICAqLworCisgICAgICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50IGNvbnRpbnVlcyBhZ2FpblxuIik7CisgICAgICAKKyAgICAgIGlmIChkb193YWl0cGlkIChjaGlsZF9waWQpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgd2FpdHBpZCgpIHdhaXRpbmcgZm9yIGJ1cyBkYWVtb24ncyBwYXJlbnRcbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBleGl0aW5nXG4iKTsKKyAgICAgIAorICAgICAgZXhpdCAoMCk7CisgICAgfQorCisgIC8qIENoaWxkIGNvbnRpbnVlcyAqLworICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIgcHJvY2VzcyBjcmVhdGVkXG4iKTsKKworICB2ZXJib3NlICgiUmVhZGluZyBQSUQgZnJvbSBidXNcbiIpOworICAgICAgCisgIHN3aXRjaCAocmVhZF9waWQgKHJlYWRfYnVzX3BpZF9mZCwgJmJ1c19waWRfdG9fa2lsbCkpCisgICAgeworICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVPRiBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb25cbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKwkgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICB2ZXJib3NlICgiR290IFBJRCAlbGQgZnJvbSBkYWVtb25cbiIsCisgICAgICAgICAgIChsb25nKSBidXNfcGlkX3RvX2tpbGwpOworICAKKyAgaWYgKGV4aXRfd2l0aF9zZXNzaW9uKQorICAgIHsKKyAgICAgIC8qIEJ1cyBpcyBub3cgc3RhcnRlZCBhbmQgbGF1bmNoZXIgaGFzIG5lZWRlZCBpbmZvOworICAgICAgICogd2UgY29ubmVjdCB0byBYIGRpc3BsYXkgYW5kIHR0eSBhbmQgd2FpdCB0bworICAgICAgICoga2lsbCBidXMgaWYgcmVxdWVzdGVkLgorICAgICAgICovCisgICAgICAKKyAgICAgIGtpbGxfYnVzX3doZW5fc2Vzc2lvbl9lbmRzICgpOworICAgIH0KKworICB2ZXJib3NlICgiQmFieXNpdHRlciBleGl0aW5nXG4iKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZG9fY2xvc2Vfc3RkZXJyICh2b2lkKQoreworICBpbnQgZmQ7CisKKyAgZmZsdXNoIChzdGRlcnIpOworCisgIC8qIGRidXMtbGF1bmNoIGlzIGEgVW5peC1vbmx5IHByb2dyYW0sIHNvIHdlIGNhbiByZWx5IG9uIC9kZXYvbnVsbCBiZWluZyB0aGVyZS4KKyAgICogV2UncmUgaW5jbHVkaW5nIHVuaXN0ZC5oIGFuZCB3ZSdyZSBkZWFsaW5nIHdpdGggc2gvY3NoIGxhdW5jaCBzZXF1ZW5jZXMuLi4KKyAgICovCisgIGZkID0gb3BlbiAoIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnRlcm5hbCBlcnJvcjogY2Fubm90IG9wZW4gL2Rldi9udWxsOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGNsb3NlICgyKTsKKyAgaWYgKGR1cDIgKGZkLCAyKSA9PSAtMSkKKyAgICB7CisgICAgICAvKiBlcnJvcjsgd2UgY2FuJ3QgcmVwb3J0IGFuIGVycm9yIGFueW1vcmUuLi4gKi8KKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgY2xvc2UgKGZkKTsKK30KKworc3RhdGljIHZvaWQKK3Bhc3NfaW5mbyAoY29uc3QgY2hhciAqcnVucHJvZywgY29uc3QgY2hhciAqYnVzX2FkZHJlc3MsIHBpZF90IGJ1c19waWQsCisgICAgICAgICAgIGxvbmcgYnVzX3dpZCwgaW50IGNfc2hlbGxfc3ludGF4LCBpbnQgYm91cm5lX3NoZWxsX3N5bnRheCwKKyAgICAgICAgICAgaW50IGJpbmFyeV9zeW50YXgsCisgICAgICAgICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHJlbWFpbmluZ19hcmdzKQoreworICBjaGFyICplbnZ2YXIgPSBOVUxMOworICBjaGFyICoqYXJncyA9IE5VTEw7CisKKyAgaWYgKHJ1bnByb2cpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGVudnZhciA9IG1hbGxvYyAoc3RybGVuICgiREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSIpICsKKyAgICAgICAgICBzdHJsZW4gKGJ1c19hZGRyZXNzKSArIDEpOworICAgICAgYXJncyA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKChhcmdjLXJlbWFpbmluZ19hcmdzKSsyKSk7CisKKyAgICAgIGlmIChlbnZ2YXIgPT0gTlVMTCB8fCBhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBhcmdzWzBdID0geHN0cmR1cCAocnVucHJvZyk7CisgICAgICBpZiAoIWFyZ3NbMF0pCisgICAgICAgIGdvdG8gb29tOworICAgICAgZm9yIChpID0gMTsgaSA8PSAoYXJnYy1yZW1haW5pbmdfYXJncyk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFyZ3ZbcmVtYWluaW5nX2FyZ3MraS0xXSkrMTsKKyAgICAgICAgICBhcmdzW2ldID0gbWFsbG9jIChsZW4pOworICAgICAgICAgIGlmICghYXJnc1tpXSkKKwkgICAgeworICAgICAgICAgICAgICB3aGlsZSAoaSA+IDEpCisgICAgICAgICAgICAgICAgZnJlZSAoYXJnc1stLWldKTsKKyAgICAgICAgICAgICAgZ290byBvb207CisJICAgIH0KKyAgICAgICAgICBzdHJuY3B5IChhcmdzW2ldLCBhcmd2W3JlbWFpbmluZ19hcmdzK2ktMV0sIGxlbik7CisgICAgICAgIH0KKyAgICAgIGFyZ3NbaV0gPSBOVUxMOworCisgICAgICBzdHJjcHkgKGVudnZhciwgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKTsKKyAgICAgIHN0cmNhdCAoZW52dmFyLCBidXNfYWRkcmVzcyk7CisgICAgICBwdXRlbnYgKGVudnZhcik7CisKKyAgICAgIGV4ZWN2cCAocnVucHJvZywgYXJncyk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBleGVjICVzOiAlc1xuIiwgcnVucHJvZywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgICBlbHNlCisgICAgeworICAgICAgcHJpbnRfdmFyaWFibGVzIChidXNfYWRkcmVzcywgYnVzX3BpZCwgYnVzX3dpZCwgY19zaGVsbF9zeW50YXgsCisgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCk7CisgICAgfQorICB2ZXJib3NlICgiZGJ1cy1sYXVuY2ggZXhpdGluZ1xuIik7CisKKyAgZmZsdXNoIChzdGRvdXQpOworICBmZmx1c2ggKHN0ZGVycik7CisgIGNsb3NlICgxKTsKKyAgY2xvc2UgKDIpOworICBleGl0ICgwKTsKK29vbToKKyAgaWYgKGVudnZhcikKKyAgICBmcmVlIChlbnZ2YXIpOworCisgIGlmIChhcmdzKQorICAgIGZyZWUgKGFyZ3MpOworCisgIGZwcmludGYgKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkhIik7CisgIGV4aXQgKDEpOworfQorCisjZGVmaW5lIFJFQURfRU5EICAwCisjZGVmaW5lIFdSSVRFX0VORCAxCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpwcmV2X2FyZzsKKyAgY29uc3QgY2hhciAqc2huYW1lOworICBjb25zdCBjaGFyICpydW5wcm9nID0gTlVMTDsKKyAgaW50IHJlbWFpbmluZ19hcmdzID0gMDsKKyAgaW50IGV4aXRfd2l0aF9zZXNzaW9uOworICBpbnQgYmluYXJ5X3N5bnRheCA9IEZBTFNFOworICBpbnQgY19zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGJvdXJuZV9zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGF1dG9fc2hlbGxfc3ludGF4ID0gRkFMU0U7CisgIGludCBhdXRvbGF1bmNoID0gRkFMU0U7CisgIGludCByZXF1aXJlc19hcmcgPSBGQUxTRTsKKyAgaW50IGNsb3NlX3N0ZGVyciA9IEZBTFNFOworICBpbnQgaTsKKyAgaW50IHJldDsKKyAgaW50IGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgaW50IGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlWzJdOworICBpbnQgYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIGRidXNfYm9vbF90IHVzZXJfYnVzX3N1cHBvcnRlZCA9IEZBTFNFOworICBEQnVzU3RyaW5nIHVzZXJfYnVzOworICBjb25zdCBjaGFyICplcnJvcl9zdHI7CisKKyAgZXhpdF93aXRoX3Nlc3Npb24gPSBGQUxTRTsKKyAgY29uZmlnX2ZpbGUgPSBOVUxMOworCisgIC8qIEVuc3VyZSB0aGF0IHRoZSBmaXJzdCB0aHJlZSBmZHMgYXJlIG9wZW4sIHRvIGVuc3VyZSB0aGF0IHdoZW4gd2UKKyAgICogY3JlYXRlIG90aGVyIGZpbGUgZGVzY3JpcHRvcnMgKGZvciBleGFtcGxlIGZvciBlcG9sbCwgaW5vdGlmeSBvcgorICAgKiBhIHNvY2tldCksIHRoZXkgbmV2ZXIgZ2V0IGFzc2lnbmVkIGFzIGZkIDAsIDEgb3IgMi4gSWYgdGhleSB3ZXJlLAorICAgKiB3aGljaCBjb3VsZCBoYXBwZW4gaWYgb3VyIGNhbGxlciBoYWQgKGluY29ycmVjdGx5KSBjbG9zZWQgdGhvc2UKKyAgICogc3RhbmRhcmQgZmRzLCB0aGVuIHdlJ2Qgc3RhcnQgZGJ1cy1kYWVtb24gd2l0aCB0aG9zZSBmZHMgY2xvc2VkLAorICAgKiB3aGljaCBpcyB1bmV4cGVjdGVkIGFuZCBjb3VsZCBjYXVzZSBpdCB0byBtaXNiZWhhdmUuICovCisgIGlmICghX2RidXNfZW5zdXJlX3N0YW5kYXJkX2ZkcyAoMCwgJmVycm9yX3N0cikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgImRidXMtbGF1bmNoOiBmYXRhbCBlcnJvciBzZXR0aW5nIHVwIHN0YW5kYXJkIGZkczogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3Jfc3RyLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwcmV2X2FyZyA9IE5VTEw7CisgIGkgPSAxOworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKyAKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB1c2FnZSAoMCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tYXV0by1zeW50YXgiKSA9PSAwKQorICAgICAgICBhdXRvX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi1jIikgPT0gMCB8fAorICAgICAgICAgICAgICAgc3RyY21wIChhcmcsICItLWNzaC1zeW50YXgiKSA9PSAwKQorICAgICAgICBjX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi1zIikgPT0gMCB8fAorICAgICAgICAgICAgICAgc3RyY21wIChhcmcsICItLXNoLXN5bnRheCIpID09IDApCisgICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWJpbmFyeS1zeW50YXgiKSA9PSAwKQorICAgICAgICBiaW5hcnlfc3ludGF4ID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1leGl0LXdpdGgtc2Vzc2lvbiIpID09IDApCisgICAgICAgIGV4aXRfd2l0aF9zZXNzaW9uID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jbG9zZS1zdGRlcnIiKSA9PSAwKQorICAgICAgICBjbG9zZV9zdGRlcnIgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWF1dG9sYXVuY2g9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqczsKKworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHMgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK3M7CisKKyAgICAgICAgICBzYXZlX21hY2hpbmVfdXVpZCAocyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHNhdmVfbWFjaGluZV91dWlkIChhcmcpOworCSAgcmVxdWlyZXNfYXJnID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKwlyZXF1aXJlc19hcmcgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS1jb25maWctZmlsZSBnaXZlbiB0d2ljZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBjb25maWdfZmlsZSA9IHhzdHJkdXAgKGZpbGUpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIi0tY29uZmlnLWZpbGUgZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbmZpZ19maWxlID0geHN0cmR1cCAoYXJnKTsKKwkgIHJlcXVpcmVzX2FyZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorCXJlcXVpcmVzX2FyZyA9IFRSVUU7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS0iKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb24gYCVzJyBpcyB1bmtub3duLlxuIiwgYXJnKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBydW5wcm9nID0gYXJndltpKzFdOworICAgICAgICAgICAgICByZW1haW5pbmdfYXJncyA9IGkrMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICBydW5wcm9nID0gYXJnOworCSAgcmVtYWluaW5nX2FyZ3MgPSBpKzE7CisJICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIHByZXZfYXJnID0gYXJnOworICAgICAgCisgICAgICArK2k7CisgICAgfQorICBpZiAocmVxdWlyZXNfYXJnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50LlxuIiwgcHJldl9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChhdXRvX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBpZiAoKHNobmFtZSA9IGdldGVudiAoIlNIRUxMIikpICE9IE5VTEwpCisgICAgICAgeworICAgICAgICAgaWYgKCFzdHJuY21wIChzaG5hbWUgKyBzdHJsZW4gKHNobmFtZSkgLSAzLCAiY3NoIiwgMykpCisgICAgICAgICAgIGNfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICAgfQorICAgICAgZWxzZQorICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgIH0gIAorCisgIGlmIChleGl0X3dpdGhfc2Vzc2lvbikKKyAgICB2ZXJib3NlICgiLS1leGl0LXdpdGgtc2Vzc2lvbiBlbmFibGVkXG4iKTsKKworICBpZiAoYXV0b2xhdW5jaCkKKyAgICB7ICAgICAgCisjaWZuZGVmIERCVVNfQlVJTERfWDExCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBdXRvbGF1bmNoIHJlcXVlc3RlZCwgYnV0IFgxMSBzdXBwb3J0IG5vdCBjb21waWxlZCBpbi5cbiIKKwkgICAgICAgIkNhbm5vdCBjb250aW51ZS5cbiIpOworICAgICAgZXhpdCAoMSk7CisjZWxzZSAvKiBEQlVTX0JVSUxEX1gxMSAqLworI2lmbmRlZiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSAorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiWDExIGF1dG9sYXVuY2ggc3VwcG9ydCBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuXG4iKTsKKyAgICAgIGV4aXQgKDEpOworI2Vsc2UgLyogREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggKi8KKyAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICBwaWRfdCBwaWQ7CisgICAgICBsb25nIHdpZDsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIAorICAgICAgaWYgKGdldF9tYWNoaW5lX3V1aWQgKCkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk1hY2hpbmUgVVVJRCBub3QgcHJvdmlkZWQgYXMgYXJnIHRvIC0tYXV0b2xhdW5jaFxuIik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVzZXJfYnVzKSkKKyAgICAgICAgdG9vbF9vb20gKCJpbml0aWFsaXppbmciKTsKKworICAgICAgLyogSWYgd2UgaGF2ZSBhbiBYREdfUlVOVElNRV9ESVIgYW5kIGl0IGNvbnRhaW5zIGEgc3VpdGFibGUgc29ja2V0LAorICAgICAgICogZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIGNhbiB1c2UgaXQsIHNpbmNlIC0tYXV0b2xhdW5jaCBpbXBsaWVzCisgICAgICAgKiAiSSdtIE9LIHdpdGggZ2V0dGluZyBhIGJ1cyB0aGF0IGlzIGFscmVhZHkgYWN0aXZlIi4KKyAgICAgICAqCisgICAgICAgKiAoSG93ZXZlciwgcGxhaW4gZGJ1cy1sYXVuY2ggd2l0aG91dCAtLWF1dG9sYXVuY2ggbXVzdCBub3QgZG8gc28sCisgICAgICAgKiBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgbG90cyBvZiByZWdyZXNzaW9uIHRlc3RzLCB3aGljaCBvZnRlbgorICAgICAgICogdXNlIGRidXMtbGF1bmNoIGluc3RlYWQgb2YgdGhlIG1vcmUgYXBwcm9wcmlhdGUgZGJ1cy1ydW4tc2Vzc2lvbi4pCisgICAgICAgKgorICAgICAgICogQXQgdGhpcyBzdGFnZSwgd2UganVzdCBzYXZlIHRoZSB1c2VyIGJ1cydzIGFkZHJlc3M7IGxhdGVyIG9uLCB0aGUKKyAgICAgICAqICJiYWJ5c2l0dGVyIiBwcm9jZXNzIHdpbGwgYmUgYXZhaWxhYmxlIHRvIGFkdmVydGlzZSB0aGUgdXNlci1idXMKKyAgICAgICAqIG9uIHRoZSBYMTEgZGlzcGxheSBhbmQgaW4gfi8uZGJ1cy9zZXNzaW9uLWJ1cywgZm9yIGZ1bGwKKyAgICAgICAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgICAgICovCisgICAgICBpZiAoIV9kYnVzX2xvb2t1cF91c2VyX2J1cyAoJnVzZXJfYnVzX3N1cHBvcnRlZCwgJnVzZXJfYnVzLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh1c2VyX2J1c19zdXBwb3J0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICB2ZXJib3NlICgiPT09IFVzaW5nIGV4aXN0aW5nIHVzZXIgYnVzIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ1c2VyX2J1cykpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJfYnVzKTsKKyAgICAgICAgfQorCisgICAgICB2ZXJib3NlICgiQXV0b2xhdW5jaCBlbmFibGVkICh1c2luZyBYMTEpLlxuIik7CisgICAgICBpZiAoIWV4aXRfd2l0aF9zZXNzaW9uKQorCXsKKwkgIHZlcmJvc2UgKCItLWV4aXQtd2l0aC1zZXNzaW9uIGF1dG9tYXRpY2FsbHkgZW5hYmxlZFxuIik7CisJICBleGl0X3dpdGhfc2Vzc2lvbiA9IFRSVUU7CisJfQorCisgICAgICBpZiAoIXgxMV9pbml0ICgpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkF1dG9sYXVuY2ggZXJyb3I6IFgxMSBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgaWYgKCF4MTFfZ2V0X2FkZHJlc3MgKCZhZGRyZXNzLCAmcGlkLCAmd2lkKSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJBdXRvbGF1bmNoIGVycm9yOiBYMTEgY29tbXVuaWNhdGlvbiBlcnJvci5cbiIpOworCSAgZXhpdCAoMSk7CisJfQorCisgICAgICBpZiAoYWRkcmVzcyAhPSBOVUxMKQorCXsKKwkgIHZlcmJvc2UgKCJkYnVzLWRhZW1vbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIFJldHVybmluZyBleGlzdGluZyBwYXJhbWV0ZXJzLlxuIik7CisJICBwYXNzX2luZm8gKHJ1bnByb2csIGFkZHJlc3MsIHBpZCwgd2lkLCBjX3NoZWxsX3N5bnRheCwKKwkJCSAgIGJvdXJuZV9zaGVsbF9zeW50YXgsIGJpbmFyeV9zeW50YXgsIGFyZ2MsIGFyZ3YsIHJlbWFpbmluZ19hcmdzKTsKKwkgIGV4aXQgKDApOworCX0KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSCAqLworICAgIH0KKyAgZWxzZSBpZiAocmVhZF9tYWNoaW5lX3V1aWRfaWZfbmVlZGVkKCkpCisgICAgeworICAgICAgeDExX2luaXQoKTsKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1gxMSAqLworICAgIH0KKworCisgIGlmIChwaXBlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGUpIDwgMCB8fAorICAgICAgcGlwZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZSkgPCAwIHx8CisgICAgICBwaXBlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBpcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0ID0gZm9yayAoKTsKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIGZvcms6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgIC8qIENoaWxkICovCisjZGVmaW5lIE1BWF9GRF9MRU4gNjQKKyAgICAgIGNoYXIgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZ1tNQVhfRkRfTEVOXTsKKyAgICAgIGNoYXIgd3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmdbTUFYX0ZEX0xFTl07CisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgeGRpc3BsYXkgPSBOVUxMOworI2VuZGlmCisKKyAgICAgIGlmIChjbG9zZV9zdGRlcnIpCisJZG9fY2xvc2Vfc3RkZXJyICgpOworCisgICAgICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50IGNyZWF0ZWRcbiIpOworCisgICAgICAvKiBGb3JrIG9uY2UgbW9yZSB0byBjcmVhdGUgYmFieXNpdHRlciAqLworICAgICAgCisgICAgICByZXQgPSBmb3JrICgpOworICAgICAgaWYgKHJldCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZm9yazogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJldCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbiBiYWJ5c2l0dGVyICovCisgICAgICAgICAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBjb250aW51ZXNcbiIpOworICAgICAgICAgIAorICAgICAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKwkgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgICAgICAvKiBiYWJ5c2l0KCkgd2lsbCBmb3JrICphZ2FpbioKKyAgICAgICAgICAgKiBhbmQgd2lsbCBhbHNvIHJlYXAgdGhlIHByZS1mb3JrZWQgYnVzCisgICAgICAgICAgICogZGFlbW9uCisgICAgICAgICAgICovCisgICAgICAgICAgYmFieXNpdCAoZXhpdF93aXRoX3Nlc3Npb24sIHJldCwKKyAgICAgICAgICAgICAgICAgICBidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgICAgIGV4aXQgKDApOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCI9PT0gQnVzIGV4ZWMgcHJvY2VzcyBjcmVhdGVkXG4iKTsKKyAgICAgIAorICAgICAgLyogTm93IHdlIGFyZSB0aGUgYnVzIHByb2Nlc3MgKHdlbGwsIGFsbW9zdDsKKyAgICAgICAqIGRidXMtZGFlbW9uIGl0c2VsZiBmb3JrcyBhZ2FpbikKKyAgICAgICAqLworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICAvKiBJZiB3ZSBoYXZlIGEgdXNlciBidXMgYW5kIHdhbnQgdG8gdXNlIGl0LCBkbyBzbyBpbnN0ZWFkIG9mCisgICAgICAgKiBleGVjJ2luZyBhIG5ldyBkYnVzLWRhZW1vbi4gKi8KKyAgICAgIGlmIChhdXRvbGF1bmNoICYmIHVzZXJfYnVzX3N1cHBvcnRlZCkKKyAgICAgICAgeworICAgICAgICAgIGRvX3dyaXRlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSwgIjBcbiIsIDIpOworICAgICAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgICAgICBkb193cml0ZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ1c2VyX2J1cyksCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdXNlcl9idXMpKTsKKyAgICAgICAgICBkb193cml0ZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdLCAiXG4iLCAxKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgICAgIGV4aXQgKDApOworICAgICAgICB9CisKKyAgICAgIHNwcmludGYgKHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAiJWQiLCBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgIHNwcmludGYgKHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICAgIiVkIiwgYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIkNhbGxpbmcgZXhlYygpXG4iKTsKKyAKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgeworICAgICAgICBjb25zdCBjaGFyICp0ZXN0X2RhZW1vbjsKKyAgICAgICAgLyogZXhlYyBmcm9tIHRlc3RkaXIgKi8KKyAgICAgICAgaWYgKGdldGVudiAoIkRCVVNfVVNFX1RFU1RfQklOQVJZIikgIT0gTlVMTCAmJgorICAgICAgICAgICAgKHRlc3RfZGFlbW9uID0gZ2V0ZW52ICgiREJVU19URVNUX0RBRU1PTiIpKSAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25maWdfZmlsZSA9PSBOVUxMICYmIGdldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlID0gY29uY2F0MiAoZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSwKKyAgICAgICAgICAgICAgICAgICAgIi92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWNsICh0ZXN0X2RhZW1vbiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2RhZW1vbiwKKyAgICAgICAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAgICAgICAiLS1wcmludC1waWQiLCB3cml0ZV9waWRfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlLCAvKiBoYXMgdG8gYmUgbGFzdCBpbiB0aGlzIHZhcmFyZ3MgbGlzdCAqLworICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgdGVzdCBtZXNzYWdlIGJ1cyBkYWVtb24gJXM6ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRlc3RfZGFlbW9uLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworICAgICAgZXhlY2wgKERCVVNfREFFTU9ORElSIi9kYnVzLWRhZW1vbiIsCisgICAgICAgICAgICAgREJVU19EQUVNT05ESVIiL2RidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAiLS1wcmludC1waWQiLCB3cml0ZV9waWRfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgIGNvbmZpZ19maWxlLCAvKiBoYXMgdG8gYmUgbGFzdCBpbiB0aGlzIHZhcmFyZ3MgbGlzdCAqLworICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgbWVzc2FnZSBidXMgZGFlbW9uICVzOiAlcy4gIFdpbGwgdHJ5IGFnYWluIHdpdGhvdXQgZnVsbCBwYXRoLlxuIiwKKyAgICAgICAgICAgICAgIERCVVNfREFFTU9ORElSIi9kYnVzLWRhZW1vbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICAvKgorICAgICAgICogSWYgaXQgZmFpbGVkLCB0cnkgcnVubmluZyB3aXRob3V0IGZ1bGwgUEFUSC4gIE5vdGUgdGhpcyBpcyBuZWVkZWQKKyAgICAgICAqIGJlY2F1c2UgdGhlIGJ1aWxkIHByb2Nlc3MgYnVpbGRzIHRoZSBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZgorICAgICAgICogZmlsZSBhbmQgdGhlIGRidXMtZGFlbW9uIHdpbGwgbm90IGJlIGluIHRoZSBpbnN0YWxsIGxvY2F0aW9uIGR1cmluZworICAgICAgICogYnVpbGQgdGltZS4KKyAgICAgICAqLworICAgICAgZXhlY2xwICgiZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgICAiZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAgIi0tcHJpbnQtcGlkIiwgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgICBjb25maWdfZmlsZSwgLyogaGFzIHRvIGJlIGxhc3QgaW4gdGhpcyB2YXJhcmdzIGxpc3QgKi8KKyAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBtZXNzYWdlIGJ1cyBkYWVtb246ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQYXJlbnQgKi8KKyNkZWZpbmUgTUFYX1BJRF9MRU4gNjQKKyAgICAgIHBpZF90IGJ1c19waWQ7ICAKKyAgICAgIGNoYXIgYnVzX2FkZHJlc3NbTUFYX0FERFJfTEVOXTsKKyAgICAgIGNoYXIgYnVmW01BWF9QSURfTEVOXTsKKyAgICAgIGNoYXIgKmVuZDsKKyAgICAgIGxvbmcgd2lkID0gMDsKKyAgICAgIGxvbmcgdmFsOworCisgICAgICB2ZXJib3NlICgiPT09IFBhcmVudCBkYnVzLWxhdW5jaCBjb250aW51ZXNcbiIpOworICAgICAgCisgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbUkVBRF9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIldhaXRpbmcgZm9yIGJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50XG4iKTsKKyAgICAgIAorICAgICAgLyogSW1tZWRpYXRlbHkgcmVhcCBwYXJlbnQgb2YgYmFieXNpdHRlcgorICAgICAgICogKHdoaWNoIHdhcyBjcmVhdGVkIGp1c3QgZm9yIHVzIHRvIHJlYXApCisgICAgICAgKi8KKyAgICAgIGlmIChkb193YWl0cGlkIChyZXQpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byB3YWl0cGlkKCkgZm9yIGJhYnlzaXR0ZXIgaW50ZXJtZWRpYXRlIHByb2Nlc3M6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJSZWFkaW5nIGFkZHJlc3MgZnJvbSBidXNcbiIpOworICAgICAgCisgICAgICAvKiBSZWFkIHRoZSBwaXBlIGRhdGEsIHByaW50LCBhbmQgZXhpdCAqLworICAgICAgc3dpdGNoIChyZWFkX2xpbmUgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19hZGRyZXNzLCBNQVhfQUREUl9MRU4pKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVPRiBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIGFkZHJlc3MgZnJvbSBidXMgZGFlbW9uXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIGFkZHJlc3MgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisKKyAgICAgIHZlcmJvc2UgKCJSZWFkaW5nIFBJRCBmcm9tIGRhZW1vblxuIik7CisgICAgICAvKiBOb3cgcmVhZCBkYXRhICovCisgICAgICBzd2l0Y2ggKHJlYWRfbGluZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSwgYnVmLCBNQVhfUElEX0xFTikpCisJeworCWNhc2UgUkVBRF9TVEFUVVNfT0s6CisJICBicmVhazsKKwljYXNlIFJFQURfU1RBVFVTX0VPRjoKKwkgIGZwcmludGYgKHN0ZGVyciwgIkVPRiByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb25cbiIpOworCSAgZXhpdCAoMSk7CisJICBicmVhazsKKwljYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKwkJICAgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgxKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgZW5kID0gTlVMTDsKKyAgICAgIHZhbCA9IHN0cnRvbCAoYnVmLCAmZW5kLCAwKTsKKyAgICAgIGlmIChidWYgPT0gZW5kIHx8IGVuZCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBidXMgUElEIFwiJXNcIjogJXNcbiIsCisJCSAgIGJ1Ziwgc3RyZXJyb3IgKGVycm5vKSk7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGJ1c19waWQgPSB2YWw7CisKKyAgICAgIC8qIEhhdmUgdG8gaW5pdGlhbGl6ZSBidXNfcGlkX3RvX2tpbGwgQVNBUCwgc28gdGhhdCB0aGUKKyAgICAgICAgIFggZXJyb3IgY2FsbGJhY2sgY2FuIGtpbGwgaXQgaWYgYW4gZXJyb3IgaGFwcGVucy4gKi8KKyAgICAgIGJ1c19waWRfdG9fa2lsbCA9IGJ1c19waWQ7CisKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgICAgICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGludCByZXQyOworCisgICAgICAgICAgdmVyYm9zZSgiU2F2aW5nIHgxMSBhZGRyZXNzXG4iKTsKKyAgICAgICAgICByZXQyID0geDExX3NhdmVfYWRkcmVzcyAoYnVzX2FkZHJlc3MsIGJ1c19waWQsICZ3aWQpOworICAgICAgICAgIC8qIE9ubHkgZ2V0IGFuIGV4aXN0aW5nIGRidXMgc2Vzc2lvbiB3aGVuIGF1dG9sYXVuY2hpbmcgKi8KKyAgICAgICAgICBpZiAoYXV0b2xhdW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHJldDIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIC8qIGFub3RoZXIgd2luZG93IGdvdCBhZGRlZC4gUmV0dXJuIGl0cyBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgICBpZiAoeDExX2dldF9hZGRyZXNzICgmYWRkcmVzcywgJmJ1c19waWQsICZ3aWQpCisgICAgICAgICAgICAgICAgICAgICAgICYmIGFkZHJlc3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgKCJkYnVzLWRhZW1vbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIFJldHVybmluZyBleGlzdGluZyBwYXJhbWV0ZXJzLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgLyogS2lsbCB0aGUgb2xkIGJ1cyAqLworICAgICAgICAgICAgICAgICAgICAgIGtpbGxfYnVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgcGFzc19pbmZvIChydW5wcm9nLCBhZGRyZXNzLCBidXNfcGlkLCB3aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY19zaGVsbF9zeW50YXgsIGJvdXJuZV9zaGVsbF9zeW50YXgsIGJpbmFyeV9zeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYywgYXJndiwgcmVtYWluaW5nX2FyZ3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChyZXQyIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBzYXZpbmcgYnVzIGluZm9ybWF0aW9uLlxuIik7CisgICAgICAgICAgICAgICAgICBidXNfcGlkX3RvX2tpbGwgPSBidXNfcGlkOworICAgICAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qIEZvcndhcmQgdGhlIHBpZCB0byB0aGUgYmFieXNpdHRlciAqLworICAgICAgd3JpdGVfcGlkIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtXUklURV9FTkRdLCBidXNfcGlkKTsKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgIHBhc3NfaW5mbyAocnVucHJvZywgYnVzX2FkZHJlc3MsIGJ1c19waWQsIHdpZCwgY19zaGVsbF9zeW50YXgsCisgICAgICAgICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXgsIGJpbmFyeV9zeW50YXgsIGFyZ2MsIGFyZ3YsIHJlbWFpbmluZ19hcmdzKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLWxhdW5jaC5oIGIvdG9vbHMvZGJ1cy1sYXVuY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVkZTZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1sYXVuY2guaApAQCAtMCwwICsxLDU5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGF1bmNoLmggIGRidXMtbGF1bmNoIHV0aWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0xBVU5DSF9ICisjZGVmaW5lIERCVVNfTEFVTkNIX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICgxKQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKDApCisjZW5kaWYKKworI3VuZGVmICBNQVgKKyNkZWZpbmUgTUFYKGEsIGIpICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKKyNkZWZpbmUgTUFYX0FERFJfTEVOIDUxMgorCisvKiBkZWZpbmVkIGluIGRidXMtbGF1bmNoLmMgKi8KK3ZvaWQgdmVyYm9zZSAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQga2lsbF9idXNfYW5kX2V4aXQgKGludCBleGl0Y29kZSk7CisKK2NvbnN0IGNoYXIqIGdldF9tYWNoaW5lX3V1aWQgKHZvaWQpOworCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKy8qIGRlZmluZWQgaW4gZGJ1cy1sYXVuY2gteDExLmMgKi8KK2ludCB4MTFfaW5pdCAodm9pZCk7CitpbnQgeDExX2dldF9hZGRyZXNzIChjaGFyICoqcGFkZHJlc3MsIHBpZF90ICpwaWQsIGxvbmcgKndpZCk7CitpbnQgeDExX3NhdmVfYWRkcmVzcyAoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkLCBsb25nICp3aWQpOwordm9pZCB4MTFfaGFuZGxlX2V2ZW50ICh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtbW9uaXRvci5jIGIvdG9vbHMvZGJ1cy1tb25pdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDQyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtbW9uaXRvci5jCkBAIC0wLDAgKzEsNTkzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbW9uaXRvci5jICBVdGlsaXR5IHByb2dyYW0gdG8gbW9uaXRvciBtZXNzYWdlcyBvbiB0aGUgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy9kYnVzLWludGVybmFscy5oIiAgICAgICAgLyoganVzdCBmb3IgdGhlIG1hY3JvcyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIERCVVNfV0lOCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisjaW5jbHVkZSAidG9vbC1jb21tb24uaCIKKworI2RlZmluZSBFQVZFU0RST1BQSU5HX1JVTEUgImVhdmVzZHJvcD10cnVlIgorCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKworLyogaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbCAqLworI2RlZmluZSBMSU5LVFlQRV9EQlVTIDIzMQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK21vbml0b3JfZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBsb25nIHNlYyA9IDAsIHVzZWMgPSAwOworCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZzZWMsICZ1c2VjKTsKKworICBwcmludF9tZXNzYWdlIChtZXNzYWdlLCBGQUxTRSwgc2VjLCB1c2VjKTsKKyAgCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgZXhpdCAoMCk7CisKKyAgLyogTW9uaXRvcnMgbXVzdCBub3QgYWxsb3cgbGliZGJ1cyB0byByZXBseSB0byBtZXNzYWdlcywgc28gd2UgZWF0CisgICAqIHRoZSBtZXNzYWdlLiBTZWUgYnVnIDE3MTkuCisgICAqLworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisjZGVmaW5lIFRSQVBfTlVMTF9TVFJJTkcoc3RyKSAoKHN0cikgPyAoc3RyKSA6ICI8bm9uZT4iKQorCit0eXBlZGVmIGVudW0KK3sKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgPSAxLAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1JFUExZX1NFUklBTCA9IDIsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSID0gNCwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19ERVNUSU5BVElPTiA9IDgsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUEFUSCA9IDE2LAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0lOVEVSRkFDRSA9IDMyLAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUiA9IDY0LAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0VSUk9SX05BTUUgPSAxMjgKK30gUHJvZmlsZUF0dHJpYnV0ZUZsYWdzOworCitzdGF0aWMgdm9pZAorcHJvZmlsZV9wcmludF9oZWFkZXJzICh2b2lkKQoreworICBwcmludGYgKCIjdHlwZVx0dGltZXN0YW1wXHRzZXJpYWxcdHNlbmRlclx0ZGVzdGluYXRpb25cdHBhdGhcdGludGVyZmFjZVx0bWVtYmVyXG4iKTsKKyAgcHJpbnRmICgiI1x0XHRcdFx0XHRpbl9yZXBseV90b1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKGNvbnN0IGNoYXIgKnR5cGUsIERCdXNNZXNzYWdlICptZXNzYWdlLAorICBsb25nIHNlYywgbG9uZyB1c2VjLCBQcm9maWxlQXR0cmlidXRlRmxhZ3MgYXR0cnMpCit7CisgIHByaW50ZiAoIiVzXHQlbGQuJTA2bGQiLCB0eXBlLCBzZWMsIHVzZWMpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMKQorICAgIHByaW50ZiAoIlx0JXUiLCBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMKQorICAgIHByaW50ZiAoIlx0JXUiLCBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUEFUSCkKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUikKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19FUlJPUl9OQU1FKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpKSk7CisKKyAgcHJpbnRmICgiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X21lc3NhZ2VfcHJvZmlsZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBmaXJzdCA9IFRSVUU7CisgIGxvbmcgc2VjID0gMCwgdXNlYyA9IDA7CisKKyAgaWYgKGZpcnN0KQorICAgIHsKKyAgICAgIHByb2ZpbGVfcHJpbnRfaGVhZGVycyAoKTsKKyAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZzZWMsICZ1c2VjKTsKKworICBzd2l0Y2ggKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpCisgICAgeworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDoKKyAgICAgICAgcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgibWMiLCBtZXNzYWdlLCBzZWMsIHVzZWMsCisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgICBwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKCJtciIsIG1lc3NhZ2UsIHNlYywgdXNlYywKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRU5ERVIgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUkVQTFlfU0VSSUFMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgICBwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKCJlcnIiLCBtZXNzYWdlLCBzZWMsIHVzZWMsCisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1JFUExZX1NFUklBTCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgICAgIHByb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoInNpZyIsIG1lc3NhZ2UsIHNlYywgdXNlYywKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRU5ERVIgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUEFUSCB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfTUVNQkVSKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYgKCIlc1x0JWxkLiUwNmxkIiwgInR1biIsIHNlYywgdXNlYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0Citwcm9maWxlX2ZpbHRlcl9mdW5jIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgcHJpbnRfbWVzc2FnZV9wcm9maWxlIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIGV4aXQgKDApOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3R5cGVkZWYgZW51bSB7CisgICAgQklOQVJZX01PREVfTk9ULAorICAgIEJJTkFSWV9NT0RFX1JBVywKKyAgICBCSU5BUllfTU9ERV9QQ0FQCit9IEJpbmFyeU1vZGU7CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYmluYXJ5X2ZpbHRlcl9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIEJpbmFyeU1vZGUgbW9kZSA9IF9EQlVTX1BPSU5URVJfVE9fSU5UICh1c2VyX2RhdGEpOworICBjaGFyICpibG9iOworICBpbnQgbGVuOworCisgIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZG8gYSB6ZXJvLWNvcHkgInBlZWsiIG9uZSBkYXksIGJ1dCBsaWJkYnVzCisgICAqIGlzIHNvIGNvcHktaGFwcHkgdGhhdCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorICAgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfbWFyc2hhbCAobWVzc2FnZSwgJmJsb2IsICZsZW4pKQorICAgIHRvb2xfb29tICgicmV0cmlldmluZyBtZXNzYWdlIik7CisKKyAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICAgIGNhc2UgQklOQVJZX01PREVfUENBUDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgICAgICAgICAgIC8qIHNlY29uZHMsIG1pY3Jvc2Vjb25kcywgYnl0ZXMgY2FwdHVyZWQgKHBvc3NpYmx5IHRydW5jYXRlZCksCisgICAgICAgICAgICAgKiBvcmlnaW5hbCBsZW5ndGguCisgICAgICAgICAgICAgKiBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0RldmVsb3BtZW50L0xpYnBjYXBGaWxlRm9ybWF0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgaGVhZGVyWzRdID0geyAwLCAwLCBsZW4sIGxlbiB9OworCisgICAgICAgICAgICAvKiBJZiB0aGlzIGdldHMgcGFkZGVkIHRoZW4gd2UnZCBuZWVkIHRvIHdyaXRlIGl0IG91dCBpbiBwaWVjZXMgKi8KKyAgICAgICAgICAgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoaGVhZGVyKSA9PSAxNik7CisKKyAgICAgICAgICAgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKyAgICAgICAgICAgIGhlYWRlclswXSA9IHR2X3NlYzsKKyAgICAgICAgICAgIGhlYWRlclsxXSA9IHR2X3VzZWM7CisKKyAgICAgICAgICAgIGlmICghdG9vbF93cml0ZV9hbGwgKFNURE9VVF9GSUxFTk8sIGhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcnJvciAoImRidXMtbW9uaXRvcjogd3JpdGUiKTsKKyAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQklOQVJZX01PREVfUkFXOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogbm90aGluZyBzcGVjaWFsLCBqdXN0IHRoZSByYXcgbWVzc2FnZSBzdHJlYW0gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmICghdG9vbF93cml0ZV9hbGwgKFNURE9VVF9GSUxFTk8sIGJsb2IsIGxlbikpCisgICAgeworICAgICAgcGVycm9yICgiZGJ1cy1tb25pdG9yOiB3cml0ZSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZnJlZSAoYmxvYik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICBleGl0ICgwKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAordXNhZ2UgKGNoYXIgKm5hbWUsIGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLXN5c3RlbSB8IC0tc2Vzc2lvbiB8IC0tYWRkcmVzcyBBRERSRVNTXSBbLS1tb25pdG9yIHwgLS1wcm9maWxlIHwgLS1wY2FwIHwgLS1iaW5hcnkgXSBbd2F0Y2ggZXhwcmVzc2lvbnNdXG4iLCBuYW1lKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAorb25seV9vbmVfdHlwZSAoZGJ1c19ib29sX3QgKnNlZW5fYnVzX3R5cGUsCisgICAgICAgICAgICAgICBjaGFyICAgICAgICAqbmFtZSkKK3sKKyAgaWYgKCpzZWVuX2J1c190eXBlKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkkgb25seSBzdXBwb3J0IG1vbml0b3Jpbmcgb25lIGJ1cyBhdCBhIHRpbWUhXG4iKTsKKyAgICAgIHVzYWdlIChuYW1lLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqc2Vlbl9idXNfdHlwZSA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2JlY29tZV9tb25pdG9yIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBpbnQgbnVtRmlsdGVycywKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmZpbHRlcnMpCit7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNNZXNzYWdlICpyOworICBpbnQgaTsKKyAgZGJ1c191aW50MzJfdCB6ZXJvID0gMDsKKyAgREJ1c01lc3NhZ2VJdGVyIGFwcGVuZGVyLCBhcnJheV9hcHBlbmRlcjsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORywgIkJlY29tZU1vbml0b3IiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIHRvb2xfb29tICgiYmVjb21pbmcgYSBtb25pdG9yIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG0sICZhcHBlbmRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFwcGVuZGVyLCBEQlVTX1RZUEVfQVJSQVksICJzIiwKKyAgICAgICAgJmFycmF5X2FwcGVuZGVyKSkKKyAgICB0b29sX29vbSAoIm9wZW5pbmcgc3RyaW5nIGFycmF5Iik7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bUZpbHRlcnM7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5X2FwcGVuZGVyLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgJmZpbHRlcnNbaV0pKQorICAgICAgICB0b29sX29vbSAoImFkZGluZyBmaWx0ZXIgdG8gYXJyYXkiKTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcHBlbmRlciwgJmFycmF5X2FwcGVuZGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFwcGVuZGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmemVybykpCisgICAgdG9vbF9vb20gKCJmaW5pc2hpbmcgYXJndW1lbnRzIik7CisKKyAgciA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtLCAtMSwgJmVycm9yKTsKKworICBpZiAociAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocik7CisgICAgfQorICBlbHNlIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfVU5LTk9XTl9JTlRFUkZBQ0UpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImRidXMtbW9uaXRvcjogdW5hYmxlIHRvIGVuYWJsZSBuZXctc3R5bGUgbW9uaXRvcmluZywgIgorICAgICAgICAgICJ5b3VyIGRidXMtZGFlbW9uIGlzIHRvbyBvbGQuIEZhbGxpbmcgYmFjayB0byBlYXZlc2Ryb3BwaW5nLlxuIik7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1tb25pdG9yOiB1bmFibGUgdG8gZW5hYmxlIG5ldy1zdHlsZSBtb25pdG9yaW5nOiAiCisgICAgICAgICAgIiVzOiBcIiVzXCIuIEZhbGxpbmcgYmFjayB0byBlYXZlc2Ryb3BwaW5nLlxuIiwKKyAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICByZXR1cm4gKHIgIT0gTlVMTCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0J1c1R5cGUgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gZmlsdGVyX2Z1bmMgPSBtb25pdG9yX2ZpbHRlcl9mdW5jOworICBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgZGJ1c19ib29sX3Qgc2Vlbl9idXNfdHlwZSA9IEZBTFNFOworICBCaW5hcnlNb2RlIGJpbmFyeV9tb2RlID0gQklOQVJZX01PREVfTk9UOworICBpbnQgaSA9IDAsIGogPSAwLCBudW1GaWx0ZXJzID0gMDsKKyAgY2hhciAqKmZpbHRlcnMgPSBOVUxMOworCisgIC8qIFNldCBzdGRvdXQgdG8gYmUgdW5idWZmZXJlZDsgdGhpcyBpcyBiYXNpY2FsbHkgc28gdGhhdCBpZiBwZW9wbGUKKyAgICogZG8gZGJ1cy1tb25pdG9yID4gZmlsZSwgdGhlbiBzZW5kIFNJR0lOVCB2aWEgQ29udHJvbC1DLCB0aGV5CisgICAqIGRvbid0IGxvc2UgdGhlIGxhc3QgY2h1bmsgb2YgbWVzc2FnZXMuCisgICAqLworCisjaWZkZWYgREJVU19XSU4KKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworI2Vsc2UKKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIDApOworI2VuZGlmCisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLXNlc3Npb24iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1hZGRyZXNzIikpCisgICAgICAgIHsKKyAgICAgICAgICBvbmx5X29uZV90eXBlICgmc2Vlbl9idXNfdHlwZSwgYXJndlswXSk7CisKKyAgICAgICAgICBpZiAoaSsxIDwgYXJnYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWRkcmVzcyA9IGFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVzYWdlIChhcmd2WzBdLCAxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1oZWxwIikpCisgICAgICAgIHVzYWdlIChhcmd2WzBdLCAwKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIi0tbW9uaXRvciIpKQorICAgICAgICB7CisgICAgICAgICAgZmlsdGVyX2Z1bmMgPSBtb25pdG9yX2ZpbHRlcl9mdW5jOworICAgICAgICAgIGJpbmFyeV9tb2RlID0gQklOQVJZX01PREVfTk9UOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLXByb2ZpbGUiKSkKKyAgICAgICAgeworICAgICAgICAgIGZpbHRlcl9mdW5jID0gcHJvZmlsZV9maWx0ZXJfZnVuYzsKKyAgICAgICAgICBiaW5hcnlfbW9kZSA9IEJJTkFSWV9NT0RFX05PVDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1iaW5hcnkiKSkKKyAgICAgICAgeworICAgICAgICAgIGZpbHRlcl9mdW5jID0gYmluYXJ5X2ZpbHRlcl9mdW5jOworICAgICAgICAgIGJpbmFyeV9tb2RlID0gQklOQVJZX01PREVfUkFXOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLXBjYXAiKSkKKyAgICAgICAgeworICAgICAgICAgIGZpbHRlcl9mdW5jID0gYmluYXJ5X2ZpbHRlcl9mdW5jOworICAgICAgICAgIGJpbmFyeV9tb2RlID0gQklOQVJZX01PREVfUENBUDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS0iKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgICB1c2FnZSAoYXJndlswXSwgMSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgZmlsdGVyX2xlbjsKKyAgICAgICAgICBudW1GaWx0ZXJzKys7CisgICAgICAgICAgLyogUHJlcGVuZCBhIHJ1bGUgKGFuZCBhIGNvbW1hKSB0byBlbmFibGUgdGhlIG1vbml0b3IgdG8gZWF2ZXNkcm9wLgorICAgICAgICAgICAqIFByZXBlbmRpbmcgYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBlYXZlc2Ryb3A9ZmFsc2UgYXQgY29tbWFuZCBsaW5lCisgICAgICAgICAgICogaW4gb3JkZXIgdG8gZGlzYWJsZSBlYXZlc2Ryb3BwaW5nIHdoZW4gbmVlZGVkICovCisgICAgICAgICAgZmlsdGVyX2xlbiA9IHN0cmxlbiAoRUFWRVNEUk9QUElOR19SVUxFKSArIDEgKyBzdHJsZW4gKGFyZykgKyAxOworCisgICAgICAgICAgZmlsdGVycyA9IChjaGFyICoqKSByZWFsbG9jIChmaWx0ZXJzLCBudW1GaWx0ZXJzICogc2l6ZW9mIChjaGFyICopKTsKKyAgICAgICAgICBpZiAoZmlsdGVycyA9PSBOVUxMKQorICAgICAgICAgICAgdG9vbF9vb20gKCJhZGRpbmcgYSBuZXcgZmlsdGVyIHNsb3QiKTsKKyAgICAgICAgICBmaWx0ZXJzW2pdID0gKGNoYXIgKikgbWFsbG9jIChmaWx0ZXJfbGVuKTsKKyAgICAgICAgICBpZiAoZmlsdGVyc1tqXSA9PSBOVUxMKQorICAgICAgICAgICAgdG9vbF9vb20gKCJhZGRpbmcgYSBuZXcgZmlsdGVyIik7CisgICAgICAgICAgc25wcmludGYgKGZpbHRlcnNbal0sIGZpbHRlcl9sZW4sICIlcywlcyIsIEVBVkVTRFJPUFBJTkdfUlVMRSwgYXJnKTsKKyAgICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmIChhZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChhZGRyZXNzLCAmZXJyb3IpOworICAgICAgaWYgKGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWRidXNfYnVzX3JlZ2lzdGVyIChjb25uZWN0aW9uLCAmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29ubmVjdGlvbiB0byBidXMgYXQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqd2hlcmU7CisgICAgICBpZiAoYWRkcmVzcyAhPSBOVUxMKQorICAgICAgICB3aGVyZSA9IGFkZHJlc3M7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIERCVVNfQlVTX1NZU1RFTToKKyAgICAgICAgICAgICAgd2hlcmUgPSAic3lzdGVtIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQlVTX0JVU19TRVNTSU9OOgorICAgICAgICAgICAgICB3aGVyZSA9ICJzZXNzaW9uIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgd2hlcmUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byAlczogJXNcbiIsCisgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFJlY2VpdmUgby5mZC5QZWVyIG1lc3NhZ2VzIGFzIG5vcm1hbCBtZXNzYWdlcywgcmF0aGVyIHRoYW4gaGF2aW5nCisgICAqIGxpYmRidXMgaGFuZGxlIHRoZW0gaW50ZXJuYWxseSwgd2hpY2ggaXMgdGhlIHdyb25nIHRoaW5nIGZvcgorICAgKiBhIG1vbml0b3IgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzIChjb25uZWN0aW9uLCBUUlVFKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLCBmaWx0ZXJfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGJpbmFyeV9tb2RlKSwgTlVMTCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGRuJ3QgYWRkIGZpbHRlciFcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChiZWNvbWVfbW9uaXRvciAoY29ubmVjdGlvbiwgbnVtRmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqIGNvbnN0ICopIGZpbHRlcnMpKQorICAgIHsKKyAgICAgIC8qIG5vIG1vcmUgcHJlcGFyYXRpb24gbmVlZGVkICovCisgICAgfQorICBlbHNlIGlmIChudW1GaWx0ZXJzKQorICAgIHsKKyAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaCAoY29ubmVjdGlvbiwgZmlsdGVyc1tpXSArIG9mZnNldCwgJmVycm9yKTsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikgJiYgaSA9PSAwICYmIG9mZnNldCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSBtaWdodCBiZSB0YWxraW5nIHRvIGEgcHJlLTEuNS42IGRidXMtZGFlbW9uCisgICAgICAgICAgICAgICogd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBlYXZlc2Ryb3A9dHJ1ZS4KKyAgICAgICAgICAgICAgKiBJZiB0aGlzIHdvcmtzLCBjYXJyeSBvbiB3aXRoIG9mZnNldCA+IDAKKyAgICAgICAgICAgICAgKiBvbiB0aGUgcmVtYWluaW5nIGl0ZXJhdGlvbnMuICovCisgICAgICAgICAgICAgIG9mZnNldCA9IHN0cmxlbiAoRUFWRVNEUk9QUElOR19SVUxFKSArIDE7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLCBmaWx0ZXJzW2ldICsgb2Zmc2V0LCAmZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gc2V0dXAgbWF0Y2ggXCIlc1wiOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpXSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZnJlZShmaWx0ZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYnVzX2FkZF9tYXRjaCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUFWRVNEUk9QUElOR19SVUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgICAgICBnb3RvIGxvc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgc3dpdGNoIChiaW5hcnlfbW9kZSkKKyAgICB7CisgICAgICBjYXNlIEJJTkFSWV9NT0RFX05PVDoKKyAgICAgIGNhc2UgQklOQVJZX01PREVfUkFXOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCSU5BUllfTU9ERV9QQ0FQOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIG5vdCB1c2luZyBsaWJwY2FwIGJlY2F1c2UgdGhlIGZpbGUgZm9ybWF0IGlzIHNpbXBsZQorICAgICAgICAgICAgICogZW5vdWdoIG5vdCB0byBuZWVkIGl0LgorICAgICAgICAgICAgICogaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9EZXZlbG9wbWVudC9MaWJwY2FwRmlsZUZvcm1hdCAqLworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IG1hZ2ljOworICAgICAgICAgICAgICAgIGRidXNfdWludDE2X3QgbWFqb3JfdmVyc2lvbjsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90IG1pbm9yX3ZlcnNpb247CisgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IHRpbWV6b25lOworICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgcHJlY2lzaW9uOworICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgbWF4X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGxpbmtfdHlwZTsKKyAgICAgICAgICAgIH0gaGVhZGVyID0geworICAgICAgICAgICAgICAgIDB4QTFCMkMzRDRVLCAgLyogbWFnaWMgbnVtYmVyICovCisgICAgICAgICAgICAgICAgMiwgNCwgICAgICAgICAvKiB2Mi40ICovCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAvKiBjYXB0dXJlIGluIEdNVCAqLworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgLyogbm8gb3BpbmlvbiBvbiB0aW1lc3RhbXAgcHJlY2lzaW9uICovCisgICAgICAgICAgICAgICAgKDEgPDwgMjcpLCAgICAvKiBELUJ1cyBzcGVjIHNheXMgc28gKi8KKyAgICAgICAgICAgICAgICBMSU5LVFlQRV9EQlVTCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKiBBc3NlcnQgdGhhdCB0aGVyZSBpcyBubyBwYWRkaW5nICovCisgICAgICAgICAgICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGhlYWRlcikgPT0gMjQpOworCisgICAgICAgICAgICBpZiAoIXRvb2xfd3JpdGVfYWxsIChTVERPVVRfRklMRU5PLCAmaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVycm9yICgiZGJ1cy1tb25pdG9yOiB3cml0ZSIpOworICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKGNvbm5lY3Rpb24sIC0xKSkKKyAgICA7CisgIGV4aXQgKDApOworIGxvc2U6CisgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCmRpZmYgLS1naXQgYS90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyBiL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWNhMTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwpAQCAtMCwwICsxLDg3MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXByaW50LW1lc3NhZ2UuaCAgVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgYSBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXByaW50LW1lc3NhZ2UuaCIKKworI2lmZGVmIERCVVNfVU5JWAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAidG9vbC1jb21tb24uaCIKKworc3RhdGljIGNvbnN0IGNoYXIqCit0eXBlX3RvX25hbWUgKGludCBtZXNzYWdlX3R5cGUpCit7CisgIHN3aXRjaCAobWVzc2FnZV90eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKyAgICAgIHJldHVybiAic2lnbmFsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgICAgcmV0dXJuICJtZXRob2QgY2FsbCI7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgcmV0dXJuICJtZXRob2QgcmV0dXJuIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKHVua25vd24gbWVzc2FnZSB0eXBlKSI7CisgICAgfQorfQorCisjZGVmaW5lIElOREVOVCAzCisKK3N0YXRpYyB2b2lkCitpbmRlbnQgKGludCBkZXB0aCkKK3sKKyAgd2hpbGUgKGRlcHRoLS0gPiAwKQorICAgIHByaW50ZiAoIiAgICIpOyAvKiBJTkRFTlQgc3BhY2VzLiAqLworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGV4IChjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbiwKKyAgICAgICAgICAgaW50IGRlcHRoKQoreworICB1bnNpZ25lZCBpbnQgaSwgY29sdW1uczsKKworICBwcmludGYgKCJhcnJheSBvZiBieXRlcyBbXG4iKTsKKworICBpbmRlbnQgKGRlcHRoICsgMSk7CisKKyAgLyogRWFjaCBieXRlIHRha2VzIDMgY2VsbHMgKHR3byBoZXhpdHMsIGFuZCBhIHNwYWNlKSwgZXhjZXB0IHRoZSBsYXN0IG9uZS4gKi8KKyAgY29sdW1ucyA9ICg4MCAtICgoZGVwdGggKyAxKSAqIElOREVOVCkpIC8gMzsKKworICBpZiAoY29sdW1ucyA8IDgpCisgICAgY29sdW1ucyA9IDg7CisKKyAgaSA9IDA7CisKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgcHJpbnRmICgiJTAyeCIsIGJ5dGVzW2ldKTsKKyAgICAgIGkrKzsKKworICAgICAgaWYgKGkgIT0gbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgJSBjb2x1bW5zID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgICAgIGluZGVudCAoZGVwdGggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBwcmludGYgKCJcbiIpOworICBpbmRlbnQgKGRlcHRoKTsKKyAgcHJpbnRmICgiXVxuIik7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9TSVpFIDEwMAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNkZWZpbmUgREJVU19JTlQ2NF9QUklOVEZfQVJHVU1FTlQgUFJJaTY0CisjZGVmaW5lIERCVVNfVUlOVDY0X1BSSU5URl9BUkdVTUVOVCBQUkl1NjQKKyNkZWZpbmUgTUFYUEZYIDQwOTYKKworc3RhdGljIGludAorcGZfY2FuX3NpbXBsZShEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIHN3aXRjaCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKGl0ZXIpKQorICAgIHsKKyAgICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGZfa2V5KERCdXNNZXNzYWdlSXRlciAqaXRlciwgY29uc3QgY2hhciAqcGZ4LCBjaGFyICpidWYsIHNpemVfdCBzeikKK3sKKyAgY2hhciAqc3Y7CisgIGRidXNfYm9vbF90IGJ2OworICBkYnVzX2ludDE2X3QgaTE2djsKKyAgZGJ1c19pbnQzMl90IGkzMnY7CisgIGRidXNfaW50NjRfdCBpNjR2OworICBkYnVzX3VpbnQxNl90IHUxNnY7CisgIGRidXNfdWludDMyX3QgdTMydjsKKyAgZGJ1c191aW50NjRfdCB1NjR2OworICB1bnNpZ25lZCBjaGFyIHU4djsKKyAgZG91YmxlIGR2OworCisgIHN3aXRjaCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKGl0ZXIpKSB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZzdik7CisgICAgICBzbnByaW50ZihidWYsIHN6LCAiJXMvJXMiLCBwZngsIHN2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJmJ2KTsKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8lcyIsIHBmeCwgKGJ2ID8gInRydWUiIDogImZhbHNlIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJmkxNnYpOworICAgICAgc25wcmludGYoYnVmLCBzeiwgIiVzLyVkIiwgcGZ4LCBpMTZ2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZpMzJ2KTsKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8lZCIsIHBmeCwgaTMydik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyhpdGVyLCAmaTY0dik7CisjaWZkZWYgREJVU19JTlQ2NF9QUklOVEZfQVJHVU1FTlQKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8lIiBEQlVTX0lOVDY0X1BSSU5URl9BUkdVTUVOVCwgcGZ4LCBpNjR2KTsKKyNlbHNlCisgICAgICBzbnByaW50ZihidWYsIHN6LCAiJXMvW2ludDY0XSIsIHBmeCk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyhpdGVyLCAmdTE2dik7CisgICAgICBzbnByaW50ZihidWYsIHN6LCAiJXMvJXUiLCBwZngsIHUxNnYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZ1MzJ2KTsKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8ldSIsIHBmeCwgdTMydik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJnU2NHYpOworI2lmZGVmIERCVVNfVUlOVDY0X1BSSU5URl9BUkdVTUVOVAorICAgICAgc25wcmludGYoYnVmLCBzeiwgIiVzLyUiIERCVVNfVUlOVDY0X1BSSU5URl9BUkdVTUVOVCwgcGZ4LCB1NjR2KTsKKyNlbHNlCisgICAgICBzbnByaW50ZihidWYsIHN6LCAiJXMvW3VpbnQ2NF0iLCBwZngpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZ1OHYpOworICAgICAgc25wcmludGYoYnVmLCBzeiwgIiVzLyUwMngiLCBwZngsICh1bnNpZ25lZCBpbnQpdTh2ICYgMHhGRik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJmR2KTsKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8lZyIsIHBmeCwgZHYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy9bcGYtdW5rbm93bl0iLCBwZngpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfZml4ZWRfaXRlcihEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCwgaW50IGFsbCk7CisKK3N0YXRpYyB2b2lkIHBmX3N0cmluZyhEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKyAgY2hhciAqdmFsOworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJnZhbCk7CisgIHByaW50ZigiJXMlcyVzXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBwZl9ib29sZWFuKERCdXNNZXNzYWdlSXRlciAqaXRlciwgY29uc3QgY2hhciAqcGZ4KQoreworICBkYnVzX2Jvb2xfdCBidjsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZidik7CisgIHByaW50ZigiJXMlcyVzXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCAoYnYgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBmX3VpbnQxNihEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKyAgZGJ1c191aW50MTZfdCB1djsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZ1dik7CisgIHByaW50ZigiJXMlcyV1XG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCB1dik7Cit9CisKK3N0YXRpYyB2b2lkIHBmX2ludDE2KERCdXNNZXNzYWdlSXRlciAqaXRlciwgY29uc3QgY2hhciAqcGZ4KQoreworICBkYnVzX2ludDE2X3QgaXY7CisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyhpdGVyLCAmaXYpOworICBwcmludGYoIiVzJXMlZFxuIiwgcGZ4LCBwZnhbMF0gPyAiICIgOiAiIiwgaXYpOworfQorCitzdGF0aWMgdm9pZCBwZl91aW50MzIoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBjb25zdCBjaGFyICpwZngpCit7CisgIGRidXNfdWludDMyX3QgdXY7CisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyhpdGVyLCAmdXYpOworICBwcmludGYoIiVzJXMldVxuIiwgcGZ4LCBwZnhbMF0gPyAiICIgOiAiIiwgdXYpOworfQorCitzdGF0aWMgdm9pZCBwZl9pbnQzMihEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKyAgZGJ1c19pbnQzMl90IGl2OworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJml2KTsKKyAgcHJpbnRmKCIlcyVzJWRcbiIsIHBmeCwgcGZ4WzBdID8gIiAiIDogIiIsIGl2KTsKK30KKworc3RhdGljIHZvaWQgcGZfdWludDY0KERCdXNNZXNzYWdlSXRlciAqaXRlciwgY29uc3QgY2hhciAqcGZ4KQoreworICBkYnVzX3VpbnQ2NF90IHV2OworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJnV2KTsKKyNpZmRlZiBEQlVTX1VJTlQ2NF9QUklOVEZfQVJHVU1FTlQKKyAgcHJpbnRmKCIlcyVzJSIgREJVU19VSU5UNjRfUFJJTlRGX0FSR1VNRU5UICJcbiIsIHBmeCwgcGZ4WzBdID8gIiAiIDogIiIsIHV2KTsKKyNlbHNlCisgIHByaW50ZigiJXMlc1t1aW50NjRdXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwZl9pbnQ2NChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKyAgZGJ1c19pbnQ2NF90IGl2OworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoaXRlciwgJml2KTsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9BUkdVTUVOVAorICBwcmludGYoIiVzJXMlIiBEQlVTX0lOVDY0X1BSSU5URl9BUkdVTUVOVCAiXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCBpdik7CisjZWxzZQorICBwcmludGYoIiVzJXNbaW50NjRdXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwZl9kb3VibGUoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBjb25zdCBjaGFyICpwZngpCit7CisgIGRvdWJsZSBkdjsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKGl0ZXIsICZkdik7CisgIHByaW50ZigiJXMlcyVnXG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCBkdik7Cit9CisKK3N0YXRpYyB2b2lkIHBmX2J5dGUoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBjb25zdCBjaGFyICpwZngpCit7CisgIHVuc2lnbmVkIGNoYXIgYnY7CisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyhpdGVyLCAmYnYpOworICBwcmludGYoIiVzJXMlMDJ4XG4iLCBwZngsIHBmeFswXSA/ICIgIiA6ICIiLCAodW5zaWduZWQgaW50KWJ2ICYgMHhGRik7Cit9CisKK3N0YXRpYyB2b2lkIHBmX2FycmF5KERCdXNNZXNzYWdlSXRlciAqaXRlciwgY29uc3QgY2hhciAqcGZ4KQoreworICBpbnQgdHlwZTsKKyAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisgIGNoYXIgbnBmeFtNQVhQRlhdOworICBpbnQgaSA9IDA7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZShpdGVyLCAmc3ViaXRlcik7CisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUoJnN1Yml0ZXIpOworCisgIHdoaWxlICh0eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIHNucHJpbnRmKG5wZngsIHNpemVvZihucGZ4KSwgIiVzLyVkIiwgcGZ4LCBpKTsKKyAgICAgIHByaW50X2ZpeGVkX2l0ZXIoJnN1Yml0ZXIsIG5wZngsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCgmc3ViaXRlcik7CisgICAgICB0eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKCZzdWJpdGVyKTsKKyAgICAgIGkrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBmX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBjb25zdCBjaGFyICpwZngpCit7CisgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKGl0ZXIsICZzdWJpdGVyKTsKKyAgcHJpbnRfZml4ZWRfaXRlcigmc3ViaXRlciwgcGZ4LCAwKTsKK30KKworc3RhdGljIHZvaWQgcGZfZGljdChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisgIGNoYXIgbnBmeFtNQVhQRlhdOworCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoaXRlciwgJnN1Yml0ZXIpOworICAvKiBOYXN0eSBoYWNrIHRvIG1ha2Ugc3RyaW5nIC0+IHRoaW5nIGRpY3RzIG1vcmUgcGFyc2VhYmxlLiAqLworICBpZiAocGZfY2FuX3NpbXBsZSgmc3ViaXRlcikpCisgICAgeworICAgICAgcGZfa2V5KCZzdWJpdGVyLCBwZngsIG5wZngsIHNpemVvZihucGZ4KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc25wcmludGYobnBmeCwgTUFYUEZYLCAiJXMvW2NvbXBsZXgta2V5XSIsIHBmeCk7CisgICAgfQorICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0KCZzdWJpdGVyKTsKKyAgcHJpbnRfZml4ZWRfaXRlcigmc3ViaXRlciwgbnBmeCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2ZpeGVkX2l0ZXIoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBjb25zdCBjaGFyICpwZngsIGludCBhbGwpCit7CisgIHN0YXRpYyBzdHJ1Y3QgeworICAgIGludCB0eXBlOworICAgIHZvaWQgKCpmdW5jKShEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGNvbnN0IGNoYXIgKnBmeCk7CisgIH0gcHJpbnRlcnNbXSA9IHsKKyAgICB7IERCVVNfVFlQRV9TVFJJTkcsIHBmX3N0cmluZyB9LAorICAgIHsgREJVU19UWVBFX0FSUkFZLCBwZl9hcnJheSB9LAorICAgIHsgREJVU19UWVBFX1NUUlVDVCwgcGZfYXJyYXkgfSwgLyogeWVzLCByZWFsbHkuIFRoZXkncmUgaWRlbnRpY2FsLiAqLworICAgIHsgREJVU19UWVBFX1ZBUklBTlQsIHBmX3ZhcmlhbnQgfSwKKyAgICB7IERCVVNfVFlQRV9ESUNUX0VOVFJZLCBwZl9kaWN0IH0sCisgICAgeyBEQlVTX1RZUEVfQk9PTEVBTiwgcGZfYm9vbGVhbiB9LAorICAgIHsgREJVU19UWVBFX1VJTlQzMiwgcGZfdWludDMyIH0sCisgICAgeyBEQlVTX1RZUEVfSU5UMzIsIHBmX2ludDMyIH0sCisgICAgeyBEQlVTX1RZUEVfU0lHTkFUVVJFLCBwZl9zdHJpbmcgfSwKKyAgICB7IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgcGZfc3RyaW5nIH0sCisgICAgeyBEQlVTX1RZUEVfSU5UMTYsIHBmX2ludDE2IH0sCisgICAgeyBEQlVTX1RZUEVfVUlOVDE2LCBwZl91aW50MTYgfSwKKyAgICB7IERCVVNfVFlQRV9JTlQ2NCwgcGZfaW50NjQgfSwKKyAgICB7IERCVVNfVFlQRV9VSU5UNjQsIHBmX3VpbnQ2NCB9LAorICAgIHsgREJVU19UWVBFX0RPVUJMRSwgcGZfZG91YmxlIH0sCisgICAgeyBEQlVTX1RZUEVfQllURSwgcGZfYnl0ZSB9LAorICAgIHsgMCwgTlVMTCB9CisgIH07CisgIGludCB0eXBlOworICBpbnQgaTsKKworICBkbworICAgIHsKKyAgICAgIHR5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUoaXRlcik7CisgICAgICBpZiAodHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgcmV0dXJuOworICAgICAgZm9yIChpID0gMDsgcHJpbnRlcnNbaV0uZnVuYzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHByaW50ZXJzW2ldLnR5cGUgPT0gdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRlcnNbaV0uZnVuYyhpdGVyLCBwZngpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgaWYgKCFwcmludGVyc1tpXS5mdW5jKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCJwcmludC1maXhlZC1pdGVyOiBubyBpZGVhIHdoYXQgJWQgaXNcbiIsIHR5cGUpOworICAgICAgICB9CisgICAgfQorICB3aGlsZSAoYWxsICYmIGRidXNfbWVzc2FnZV9pdGVyX25leHQoaXRlcikpOworfQorCit2b2lkIHByaW50X21lc3NhZ2VfZml4ZWQoREJ1c01lc3NhZ2UgKm1zZykKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGludCB0eXBlOworCisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUobXNnKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdChtc2csICZpdGVyKTsKKyAgcHJpbnRfZml4ZWRfaXRlcigmaXRlciwgIiIsIDEpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfYXkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IGRlcHRoKQoreworICAvKiBUcnVlIGlmIGV2ZXJ5IGJ5dGUgaW4gdGhlIGJ5dGVzdHJpbmcgKHNvIGZhcikgaXMgcHJpbnRhYmxlCisgICAqIEFTQ0lJLCB3aXRoIG9uZSBleGNlcHRpb246IHRoZSBsYXN0IGJ5dGUgaXMgYWxzbyBhbGxvd2VkIHRvIGJlIFwwLiAqLworICBkYnVzX2Jvb2xfdCBhbGxfYXNjaWkgPSBUUlVFOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlczsKKyAgaW50IGxlbjsKKyAgaW50IGk7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5IChpdGVyLCAmYnl0ZXMsICZsZW4pOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBpZiAoKGJ5dGVzW2ldIDwgMzIgfHwgYnl0ZXNbaV0gPiAxMjYpICYmCisgICAgICAgICAgKGkgPCBsZW4gLSAxIHx8IGJ5dGVzW2ldICE9ICdcMCcpKQorICAgICAgICB7CisgICAgICAgICAgYWxsX2FzY2lpID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGFsbF9hc2NpaSAmJiBsZW4gPiAwICYmIGJ5dGVzW2xlbiAtIDFdID09ICdcMCcpCisgICAgeworICAgICAgcHJpbnRmICgiYXJyYXkgb2YgYnl0ZXMgXCIlc1wiICsgXFwwXG4iLCBieXRlcyk7CisgICAgfQorICBlbHNlIGlmIChhbGxfYXNjaWkpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqY29weSA9IGRidXNfbWFsbG9jIChsZW4gKyAxKTsKKworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgdG9vbF9vb20gKCJjb3B5aW5nIGJ5dGVzdHJpbmciKTsKKworICAgICAgbWVtY3B5IChjb3B5LCBieXRlcywgbGVuKTsKKyAgICAgIGNvcHlbbGVuXSA9ICdcMCc7CisgICAgICBwcmludGYgKCJhcnJheSBvZiBieXRlcyBcIiVzXCJcbiIsIGNvcHkpOworICAgICAgZGJ1c19mcmVlIChjb3B5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludF9oZXggKGJ5dGVzLCBsZW4sIGRlcHRoKTsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX1VOSVgKK3N0YXRpYyB2b2lkCitwcmludF9mZCAoaW50IGZkLCBpbnQgZGVwdGgpCit7CisgIGludCByZXQ7CisgIHN0cnVjdCBzdGF0IHN0YXRidWYgPSB7MCx9OworICB1bmlvbiB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzdG9yYWdlOworICAgICAgc3RydWN0IHNvY2thZGRyX3VuIHVuOworICAgICAgc3RydWN0IHNvY2thZGRyX2luIGlwdjQ7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGlwdjY7CisgIH0gYWRkciwgcGVlcjsKKyAgY2hhciBob3N0aXBbSU5FVDZfQUREUlNUUkxFTl07CisgIGludCBhZGRybGVuID0gc2l6ZW9mIChhZGRyKTsKKyAgaW50IHBlZXJsZW4gPSBzaXplb2YgKHBlZXIpOworICBpbnQgaGFzX3BlZXI7CisKKyAgLyogRG9uJ3QgcHJpbnQgdGhlIGZkIG51bWJlcjogaXQgaXMgZGlmZmVyZW50IGluIGV2ZXJ5IHByb2Nlc3MgYW5kIHNpbmNlCisgICAqIGRidXMtbW9uaXRvciBjbG9zZXMgdGhlIGZkIGFmdGVyIHJlYWRpbmcgaXQsIHRoZSBzYW1lIG51bWJlciB3b3VsZCBiZQorICAgKiBwcmludGVkIGFnYWluIGFuZCBhZ2Fpbi4KKyAgICovCisgIHByaW50ZiAoImZpbGUgZGVzY3JpcHRvclxuIik7CisgIGlmIChmZCA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgcmV0ID0gZnN0YXQgKGZkLCAmc3RhdGJ1Zik7CisgIGlmIChyZXQgPT0gLTEpCisgICAgcmV0dXJuOworCisgIGluZGVudCAoZGVwdGgrMSk7CisgIHByaW50ZiAoImlub2RlOiAlZFxuIiwgKGludCkgc3RhdGJ1Zi5zdF9pbm8pOworCisgIGluZGVudCAoZGVwdGgrMSk7CisgIHByaW50ZiAoInR5cGU6ICIpOworICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKQorICAgIHByaW50ZiAoImZpbGVcbiIpOworICBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKQorICAgIHByaW50ZiAoImRpcmVjdG9yeVxuIik7CisgIGlmIChTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkpCisgICAgcHJpbnRmICgiY2hhclxuIik7CisgIGlmIChTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCisgICAgcHJpbnRmICgiYmxvY2tcbiIpOworICBpZiAoU19JU0ZJRk8oc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICBwcmludGYgKCJmaWZvXG4iKTsKKyAgaWYgKFNfSVNMTksoc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICBwcmludGYgKCJsaW5rXG4iKTsKKyAgaWYgKFNfSVNTT0NLKHN0YXRidWYuc3RfbW9kZSkpCisgICAgcHJpbnRmICgic29ja2V0XG4iKTsKKworICAvKiBJZiBpdCdzIG5vdCBhIHNvY2tldCwgZ2V0c29ja25hbWUgd2lsbCBqdXN0IHJldHVybiAtMSB3aXRoIGVycm5vCisgICAqIEVOT1RTT0NLLiAqLworCisgIG1lbXNldCAoJmFkZHIsIDAsIHNpemVvZiAoYWRkcikpOworICBtZW1zZXQgKCZwZWVyLCAwLCBzaXplb2YgKHBlZXIpKTsKKworICBpZiAoZ2V0c29ja25hbWUoZmQsICZhZGRyLnNhLCAmYWRkcmxlbikpCisgICAgcmV0dXJuOworCisgIGhhc19wZWVyID0gIWdldHBlZXJuYW1lKGZkLCAmcGVlci5zYSwgJnBlZXJsZW4pOworCisgIGluZGVudCAoZGVwdGgrMSk7CisgIHByaW50ZiAoImFkZHJlc3MgZmFtaWx5OiAiKTsKKyAgc3dpdGNoIChhZGRyLnNhLnNhX2ZhbWlseSkKKyAgICB7CisgICAgICBjYXNlIEFGX1VOSVg6CisgICAgICAgIHByaW50ZigidW5peFxuIik7CisgICAgICAgIGlmIChhZGRyLnVuLnN1bl9wYXRoWzBdID09ICdcMCcpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQWJzdHJhY3Qgc29ja2V0IG1pZ2h0IG5vdCBiZSB6ZXJvLXRlcm1pbmF0ZWQgYW5kIGxlbmd0aCBpcworICAgICAgICAgICAgICogdmFyaWFibGUuIFdobyBkZXNpZ25lZCB0aGlzIGludGVyZmFjZT8KKyAgICAgICAgICAgICAqIFdyaXRlIHRoZSBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyAvcHJvYy9uZXQvdW5peAorICAgICAgICAgICAgICogU2VlIG1hbnVhbCBwYWdlIHVuaXgoNykKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5kZW50IChkZXB0aCsxKTsKKyAgICAgICAgICAgIHByaW50ZiAoIm5hbWUgQCUuKnNcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIChhZGRybGVuIC0gc2l6ZW9mIChzYV9mYW1pbHlfdCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgJihhZGRyLnVuLnN1bl9wYXRoWzFdKSk7CisKKyAgICAgICAgICAgIGlmIChoYXNfcGVlcikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudCAoZGVwdGgrMSk7CisgICAgICAgICAgICAgICAgcHJpbnRmICgicGVlciBAJS4qc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChhZGRybGVuIC0gc2l6ZW9mIChzYV9mYW1pbHlfdCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoYWRkci51bi5zdW5fcGF0aFsxXSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaW5kZW50IChkZXB0aCsxKTsKKyAgICAgICAgICAgIHByaW50ZiAoIm5hbWUgJXNcbiIsIGFkZHIudW4uc3VuX3BhdGgpOworICAgICAgICAgICAgaWYgKGhhc19wZWVyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50IChkZXB0aCsxKTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJwZWVyICVzXG4iLCBwZWVyLnVuLnN1bl9wYXRoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgcHJpbnRmICgiaW5ldFxuIik7CisgICAgICAgIGlmIChpbmV0X250b3AgKEFGX0lORVQsICZhZGRyLmlwdjQuc2luX2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgibmFtZSAlcyBwb3J0ICV1XG4iLCBob3N0aXAsIG50b2hzIChhZGRyLmlwdjQuc2luX3BvcnQpKTsKKyAgICAgICAgICB9CisgICAgICAgIGlmIChoYXNfcGVlciAmJiBpbmV0X250b3AgKEFGX0lORVQsICZwZWVyLmlwdjQuc2luX2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgicGVlciAlcyBwb3J0ICV1XG4iLCBob3N0aXAsIG50b2hzIChwZWVyLmlwdjQuc2luX3BvcnQpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBBRl9JTkVUNgorICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgcHJpbnRmICgiaW5ldDZcbiIpOworICAgICAgICBpZiAoaW5ldF9udG9wIChBRl9JTkVUNiwgJmFkZHIuaXB2Ni5zaW42X2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgibmFtZSAlcyBwb3J0ICV1XG4iLCBob3N0aXAsIG50b2hzIChhZGRyLmlwdjYuc2luNl9wb3J0KSk7CisgICAgICAgICAgfQorICAgICAgICBpZiAoaGFzX3BlZXIgJiYgaW5ldF9udG9wIChBRl9JTkVUNiwgJnBlZXIuaXB2Ni5zaW42X2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgicGVlciAlcyBwb3J0ICV1XG4iLCBob3N0aXAsIG50b2hzIChwZWVyLmlwdjYuc2luNl9wb3J0KSk7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQUZfQkxVRVRPT1RICisgICAgICBjYXNlIEFGX0JMVUVUT09USDoKKyAgICAgICAgcHJpbnRmICgiYmx1ZXRvb3RoXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmICgidW5rbm93biAoJWQpXG4iLCBhZGRyLnNhLnNhX2ZhbWlseSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcHJpbnRfaXRlciAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBkYnVzX2Jvb2xfdCBsaXRlcmFsLCBpbnQgZGVwdGgpCit7CisgIGRvCisgICAgeworICAgICAgaW50IHR5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZXIpOworCisgICAgICBpZiAodHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGluZGVudChkZXB0aCk7CisKKyAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgICAgeworICAgICAgICAgICAgY2hhciAqdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIGlmICghbGl0ZXJhbCkKKyAgICAgICAgICAgICAgcHJpbnRmICgic3RyaW5nIFwiIik7CisgICAgICAgICAgICBwcmludGYgKCIlcyIsIHZhbCk7CisgICAgICAgICAgICBpZiAoIWxpdGVyYWwpCisgICAgICAgICAgICAgIHByaW50ZiAoIlwiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICAgICAgeworICAgICAgICAgICAgY2hhciAqdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIGlmICghbGl0ZXJhbCkKKyAgICAgICAgICAgICAgcHJpbnRmICgic2lnbmF0dXJlIFwiIik7CisgICAgICAgICAgICBwcmludGYgKCIlcyIsIHZhbCk7CisgICAgICAgICAgICBpZiAoIWxpdGVyYWwpCisgICAgICAgICAgICAgIHByaW50ZiAoIlwiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICp2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFsaXRlcmFsKQorICAgICAgICAgICAgICBwcmludGYgKCJvYmplY3QgcGF0aCBcIiIpOworICAgICAgICAgICAgcHJpbnRmICgiJXMiLCB2YWwpOworICAgICAgICAgICAgaWYgKCFsaXRlcmFsKQorICAgICAgICAgICAgICBwcmludGYgKCJcIlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19pbnQxNl90IHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJpbnQxNiAlZFxuIiwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c191aW50MTZfdCB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgidWludDE2ICV1XG4iLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfaW50MzJfdCB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgiaW50MzIgJWRcbiIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIHByaW50ZiAoInVpbnQzMiAldVxuIiwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ludDY0X3QgdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUgorICAgICAgICBwcmludGYgKCJpbnQ2NCAlIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAiZFxuIiwgdmFsKTsKKyNlbHNlCisgICAgICAgIHByaW50ZiAoImludDY0IChvbWl0dGVkKVxuIik7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c191aW50NjRfdCB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworI2lmZGVmIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSCisgICAgICAgIHByaW50ZiAoInVpbnQ2NCAlIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAidVxuIiwgdmFsKTsKKyNlbHNlCisgICAgICAgIHByaW50ZiAoInVpbnQ2NCAob21pdHRlZClcbiIpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgiZG91YmxlICVnXG4iLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgiYnl0ZSAlZFxuIiwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfYm9vbF90IHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJib29sZWFuICVzXG4iLCB2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKyAgICAgICAgICAgIHByaW50ZiAoInZhcmlhbnQgIik7CisgICAgICAgICAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjdXJyZW50X3R5cGU7CisgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoaXRlciwgJnN1Yml0ZXIpOworCisgICAgICAgICAgICBjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZzdWJpdGVyKTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfQllURSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2F5ICgmc3ViaXRlciwgZGVwdGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZigiYXJyYXkgW1xuIik7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfaXRlciAoJnN1Yml0ZXIsIGxpdGVyYWwsIGRlcHRoKzEpOworCisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiwiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50KGRlcHRoKTsKKyAgICAgICAgICAgIHByaW50ZigiXVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKGl0ZXIsICZzdWJpdGVyKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkaWN0IGVudHJ5KFxuIik7CisgICAgICAgICAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgICAgICAgICAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisgICAgICAgICAgICBpbmRlbnQoZGVwdGgpOworICAgICAgICAgICAgcHJpbnRmKCIpXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGN1cnJlbnRfdHlwZTsKKyAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKyAgICAgICAgICAgIHByaW50Zigic3RydWN0IHtcbiIpOworICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZzdWJpdGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICAgICAgICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZzdWJpdGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiwiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50KGRlcHRoKTsKKyAgICAgICAgICAgIHByaW50ZigifVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgZmQ7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZmZCk7CisKKyAgICAgICAgICAgIHByaW50X2ZkIChmZCwgZGVwdGgrMSk7CisKKyAgICAgICAgICAgIC8qIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpIGR1cGxpY2F0ZWQgdGhlIGZkLCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgKiBjbG9zZSBpdCBhZnRlciB1c2UuIFRoZSBvcmlnaW5hbCBmZCB3aWxsIGJlIGNsb3NlZCB3aGVuIHRoZQorICAgICAgICAgICAgICogREJ1c01lc3NhZ2UgaXMgcmVsZWFzZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsb3NlIChmZCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcHJpbnRmICgiIChkYnVzLW1vbml0b3IgdG9vIGR1bWIgdG8gZGVjaXBoZXIgYXJnIHR5cGUgJyVjJylcbiIsIHR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoaXRlcikpOworfQorCit2b2lkCitwcmludF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwgZGJ1c19ib29sX3QgbGl0ZXJhbCwgbG9uZyBzZWMsIGxvbmcgdXNlYykKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKyAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisgIGludCBtZXNzYWdlX3R5cGU7CisKKyAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKTsKKyAgc2VuZGVyID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpOworICBkZXN0aW5hdGlvbiA9IGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpOworICAKKyAgaWYgKCFsaXRlcmFsKQorICAgIHsKKyAgICAgIGlmIChzZWMgIT0gMCB8fCB1c2VjICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlcyB0aW1lPSVsZC4lMDZsZCBzZW5kZXI9JXMgLT4gZGVzdGluYXRpb249JXMiLAorICAgICAgICAgICAgICAgICAgdHlwZV90b19uYW1lIChtZXNzYWdlX3R5cGUpLCBzZWMsIHVzZWMsCisgICAgICAgICAgICAgICAgICBzZW5kZXIgPyBzZW5kZXIgOiAiKG51bGwgc2VuZGVyKSIsCisgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiA/IGRlc3RpbmF0aW9uIDogIihudWxsIGRlc3RpbmF0aW9uKSIpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlcyBzZW5kZXI9JXMgLT4gZGVzdGluYXRpb249JXMiLAorICAgICAgICAgICAgICAgICAgdHlwZV90b19uYW1lIChtZXNzYWdlX3R5cGUpLAorICAgICAgICAgICAgICAgICAgc2VuZGVyID8gc2VuZGVyIDogIihudWxsIHNlbmRlcikiLAorICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPyBkZXN0aW5hdGlvbiA6ICIobnVsbCBkZXN0aW5hdGlvbikiKTsKKyAgICAgICAgfQorCisgICAgICBzd2l0Y2ggKG1lc3NhZ2VfdHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKyAgICAgICAgICBwcmludGYgKCIgc2VyaWFsPSV1IHBhdGg9JXM7IGludGVyZmFjZT0lczsgbWVtYmVyPSVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgICAgIHByaW50ZiAoIiBzZXJpYWw9JXUgcmVwbHlfc2VyaWFsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpLAorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKyAgICAgICAgICBwcmludGYgKCIgZXJyb3JfbmFtZT0lcyByZXBseV9zZXJpYWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwcmludGYgKCJcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgcHJpbnRfaXRlciAoJml0ZXIsIGxpdGVyYWwsIDEpOworICBmZmx1c2ggKHN0ZG91dCk7CisgIAorfQorCmRpZmYgLS1naXQgYS90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaCBiL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODAxMTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaApAQCAtMCwwICsxLDMyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcHJpbnQtbWVzc2FnZS5oICBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IG91dCBhIG1lc3NhZ2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19QUklOVF9NRVNTQUdFX0gKKyNkZWZpbmUgREJVU19QUklOVF9NRVNTQUdFX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3ZvaWQgcHJpbnRfbWVzc2FnZV9maXhlZCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpOwordm9pZCBwcmludF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwgZGJ1c19ib29sX3QgbGl0ZXJhbCwgbG9uZyBzZWMsIGxvbmcgdXNlYyk7CisKKyNlbmRpZiAvKiBEQlVTX1BSSU5UX01FU1NBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1ydW4tc2Vzc2lvbi5jIGIvdG9vbHMvZGJ1cy1ydW4tc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNWFiM2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXJ1bi1zZXNzaW9uLmMKQEAgLTAsMCArMSw0NjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1ydW4tc2Vzc2lvbi5jIC0gcnVuIGEgY2hpbGQgcHJvY2VzcyBpbiBpdHMgb3duIHNlc3Npb24KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMy0yMDA2IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDA2IFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiZGJ1cy9kYnVzLmgiCisKKyNkZWZpbmUgTUFYX0FERFJfTEVOIDUxMgorI2RlZmluZSBQSVBFX1JFQURfRU5EICAwCisjZGVmaW5lIFBJUEVfV1JJVEVfRU5EIDEKKworLyogUFJPQ0VTU0VTCisgKgorICogSWYgeW91IGFyZSBpbiBhIHNoZWxsIGFuZCBydW4gImRidXMtcnVuLXNlc3Npb24gbXlhcHAiLCBoZXJlIGlzIHdoYXQKKyAqIGhhcHBlbnMgKGNvbXBhcmUgYW5kIGNvbnRyYXN0IHdpdGggZGJ1cy1sYXVuY2gpOgorICoKKyAqIHNoZWxsCisgKiAgIFwtIGRidXMtcnVuLXNlc3Npb24gbXlhcHAKKyAqICAgICAgXC0gZGJ1cy1kYWVtb24gLS1ub2ZvcmsgLS1wcmludC1hZGRyZXNzIC0tc2Vzc2lvbgorICogICAgICBcLSBteWFwcAorICoKKyAqIEFsbCBwcm9jZXNzZXMgYXJlIGxvbmctcnVubmluZy4KKyAqCisgKiBXaGVuIG15YXBwIGV4aXRzLCBkYnVzLXJ1bi1zZXNzaW9uIGtpbGxzIGRidXMtZGFlbW9uIGFuZCB0ZXJtaW5hdGVzLgorICoKKyAqIElmIGRidXMtZGFlbW9uIGV4aXRzLCBkYnVzLXJ1bi1zZXNzaW9uIHdhcm5zIGFuZCBjb250aW51ZXMgdG8gcnVuLgorICoKKyAqIFBJUEVTCisgKgorICogZGJ1cy1kYWVtb24gLS1wcmludC1hZGRyZXNzIC0+IGJ1c19hZGRyZXNzX3BpcGUgLT4gZC1yLXMKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBtZVtdID0gImRidXMtcnVuLXNlc3Npb24iOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIiVzIFtPUFRJT05TXSBbLS1dIFBST0dSQU0gW0FSR1VNRU5UU11cbiIKKyAgICAgICIlcyAtLXZlcnNpb25cbiIKKyAgICAgICIlcyAtLWhlbHBcbiIKKyAgICAgICJcbiIKKyAgICAgICJPcHRpb25zOlxuIgorICAgICAgIi0tZGJ1cy1kYWVtb249QklOQVJZICAgICAgIHJ1biBCSU5BUlkgaW5zdGVhZCBvZiBkYnVzLWRhZW1vblxuIgorICAgICAgIi0tY29uZmlnLWZpbGU9RklMRU5BTUUgICAgIHBhc3MgdG8gZGJ1cy1kYWVtb24gaW5zdGVhZCBvZiAtLXNlc3Npb25cbiIKKyAgICAgICJcbiIsCisgICAgICBtZSwgbWUsIG1lKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiJXMgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgUmVkIEhhdCwgSW5jLlxuIgorICAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhXG4iCisgICAgICAgICAgIkNvcHlyaWdodCDCqSAyMDExLTIwMTIgTm9raWEgQ29ycG9yYXRpb25cbiIKKyAgICAgICAgICAiXG4iCisgICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy5cbiIKKyAgICAgICAgICAiVGhlcmUgaXMgTk8gd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iLAorICAgICAgICAgIG1lLCBWRVJTSU9OKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitvb20gKHZvaWQpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBtZSk7CisgIGV4aXQgKDEpOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgUkVBRF9TVEFUVVNfT0ssICAgIC8qKjwgUmVhZCBzdWNjZWVkZWQgKi8KKyAgUkVBRF9TVEFUVVNfRVJST1IsIC8qKjwgU29tZSBraW5kIG9mIGVycm9yICovCisgIFJFQURfU1RBVFVTX0VPRiAgICAvKio8IEVPRiByZXR1cm5lZCAqLworfSBSZWFkU3RhdHVzOworCitzdGF0aWMgUmVhZFN0YXR1cworcmVhZF9saW5lIChpbnQgICAgICAgIGZkLAorICAgICAgICAgICBjaGFyICAgICAgKmJ1ZiwKKyAgICAgICAgICAgc2l6ZV90ICAgICBtYXhsZW4pCit7CisgIHNpemVfdCBieXRlcyA9IDA7CisgIFJlYWRTdGF0dXMgcmV0dmFsOworCisgIG1lbXNldCAoYnVmLCAnXDAnLCBtYXhsZW4pOworICBtYXhsZW4gLT0gMTsgLyogZW5zdXJlIG51bCB0ZXJtICovCisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gbWF4bGVuIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBjaHVuayA9IHJlYWQgKGZkLAorICAgICAgICAgICAgICAgICAgICBidWYgKyBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgdG9fcmVhZCk7CisgICAgICBpZiAoY2h1bmsgPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworCisgICAgICBpZiAoY2h1bmsgPCAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNodW5rID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FT0Y7CisgICAgICAgICAgYnJlYWs7IC8qIEVPRiAqLworICAgICAgICB9CisgICAgICBlbHNlIC8qIGNodW5rID4gMCAqLworICAgICAgICBieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBSRUFEX1NUQVRVU19FT0YgJiYKKyAgICAgIGJ5dGVzID4gMCkKKyAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKworICAvKiB3aGFjayBuZXdsaW5lICovCisgIGlmIChyZXR2YWwgIT0gUkVBRF9TVEFUVVNfRVJST1IgJiYKKyAgICAgIGJ5dGVzID4gMCAmJgorICAgICAgYnVmW2J5dGVzLTFdID09ICdcbicpCisgICAgYnVmW2J5dGVzLTFdID0gJ1wwJzsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorZXhlY19kYnVzX2RhZW1vbiAoY29uc3QgY2hhciAqZGJ1c19kYWVtb24sCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBidXNfYWRkcmVzc19waXBlWzJdLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisgIC8qIENoaWxkIHByb2Nlc3MsIHdoaWNoIGV4ZWNzIGRidXMtZGFlbW9uIG9yIGRpZXMgdHJ5aW5nICovCisjZGVmaW5lIE1BWF9GRF9MRU4gNjQKKyAgY2hhciB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZ1tNQVhfRkRfTEVOXTsKKworICBjbG9zZSAoYnVzX2FkZHJlc3NfcGlwZVtQSVBFX1JFQURfRU5EXSk7CisKKyAgc3ByaW50ZiAod3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsICIlZCIsIGJ1c19hZGRyZXNzX3BpcGVbUElQRV9XUklURV9FTkRdKTsKKworICBleGVjbHAgKGRidXNfZGFlbW9uLAorICAgICAgICAgIGRidXNfZGFlbW9uLAorICAgICAgICAgICItLW5vZm9yayIsCisgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgIGNvbmZpZ19maWxlID8gIi0tY29uZmlnLWZpbGUiIDogIi0tc2Vzc2lvbiIsCisgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgTlVMTCk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBleGVjdXRlIG1lc3NhZ2UgYnVzIGRhZW1vbiAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgbWUsIGRidXNfZGFlbW9uLCBzdHJlcnJvciAoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQKK2V4ZWNfYXBwIChpbnQgcHJvZ19hcmcsIGNoYXIgKiphcmd2KQoreworICBleGVjdnAgKGFyZ3ZbcHJvZ19hcmddLCBhcmd2ICsgcHJvZ19hcmcpOworCisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBmYWlsZWQgdG8gZXhlYyAnJXMnOiAlc1xuIiwgbWUsIGFyZ3ZbcHJvZ19hcmddLAorICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgZXhpdCAoMSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgcHJvZ19hcmcgPSAwOworICBpbnQgYnVzX2FkZHJlc3NfcGlwZVsyXSA9IHsgMCwgMCB9OworICBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmRidXNfZGFlbW9uID0gTlVMTDsKKyAgY2hhciBidXNfYWRkcmVzc1tNQVhfQUREUl9MRU5dID0geyAwIH07CisgIGNvbnN0IGNoYXIgKnByZXZfYXJnID0gTlVMTDsKKyAgaW50IGkgPSAxOworICBpbnQgcmVxdWlyZXNfYXJnID0gMDsKKyAgcGlkX3QgYnVzX3BpZDsKKyAgcGlkX3QgYXBwX3BpZDsKKworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHJlcXVpcmVzX2FyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKiphcmdfZGVzdDsKKworICAgICAgICAgIGFzc2VydCAocHJldl9hcmcgIT0gTlVMTCk7CisKKyAgICAgICAgICBpZiAoc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhcmdfZGVzdCA9ICZjb25maWdfZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHByZXZfYXJnLCAiLS1kYnVzLWRhZW1vbiIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFyZ19kZXN0ID0gJmRidXNfZGFlbW9uOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogc2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogaW50ZXJuYWwgZXJyb3I6ICVzIG5vdCBmdWxseSBpbXBsZW1lbnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWUsIHByZXZfYXJnKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgqYXJnX2Rlc3QgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzIGdpdmVuIHR3aWNlXG4iLCBtZSwgcHJldl9hcmcpOworICAgICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgKmFyZ19kZXN0ID0gYXJnOworICAgICAgICAgIHJlcXVpcmVzX2FyZyA9IDA7CisgICAgICAgICAgcHJldl9hcmcgPSBhcmc7CisgICAgICAgICAgKytpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2UgKDApOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tdmVyc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB2ZXJzaW9uICgpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tY29uZmlnLWZpbGU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZmlsZTsKKworICAgICAgICAgIGlmIChjb25maWdfZmlsZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogLS1jb25maWctZmlsZSBnaXZlbiB0d2ljZVxuIiwgbWUpOworICAgICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgZmlsZSA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZmlsZTsKKworICAgICAgICAgIGNvbmZpZ19maWxlID0gZmlsZTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWRidXMtZGFlbW9uPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBpZiAoZGJ1c19kYWVtb24gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IC0tZGJ1cy1kYWVtb24gZ2l2ZW4gdHdpY2VcbiIsIG1lKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBkYnVzX2RhZW1vbiA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jb25maWctZmlsZSIpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLS1kYnVzLWRhZW1vbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXF1aXJlc19hcmcgPSAxOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS0iKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogb3B0aW9uICclcycgaXMgdW5rbm93blxuIiwgbWUsIGFyZyk7CisgICAgICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcm9nX2FyZyA9IGkgKyAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJvZ19hcmcgPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIHByZXZfYXJnID0gYXJnOworICAgICAgKytpOworICAgIH0KKworICAvKiAiZGJ1cy1ydW4tc2Vzc2lvbiIgYW5kICJkYnVzLXJ1bi1zZXNzaW9uIC4uLiAtLSIgYXJlIG5vdCBhbGxvd2VkOgorICAgKiB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZyB0byBydW4gKi8KKyAgaWYgKHByb2dfYXJnIDwgMSB8fCBwcm9nX2FyZyA+PSBhcmdjKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBhIG5vbi1vcHRpb24gYXJndW1lbnQgaXMgcmVxdWlyZWRcbiIsIG1lKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIGlmIChyZXF1aXJlc19hcmcpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IG9wdGlvbiAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLCBtZSwgcHJldl9hcmcpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisKKyAgaWYgKGRidXNfZGFlbW9uID09IE5VTEwpCisgICAgZGJ1c19kYWVtb24gPSAiZGJ1cy1kYWVtb24iOworCisgIGlmIChwaXBlIChidXNfYWRkcmVzc19waXBlKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgcGlwZTogJXNcbiIsIG1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIGJ1c19waWQgPSBmb3JrICgpOworCisgIGlmIChidXNfcGlkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZmFpbGVkIHRvIGZvcms6ICVzXG4iLCBtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKworICBpZiAoYnVzX3BpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNoaWxkICovCisgICAgICBleGVjX2RidXNfZGFlbW9uIChkYnVzX2RhZW1vbiwgYnVzX2FkZHJlc3NfcGlwZSwgY29uZmlnX2ZpbGUpOworICAgICAgLyogbm90IHJlYWNoZWQgKi8KKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIGNsb3NlIChidXNfYWRkcmVzc19waXBlW1BJUEVfV1JJVEVfRU5EXSk7CisKKyAgc3dpdGNoIChyZWFkX2xpbmUgKGJ1c19hZGRyZXNzX3BpcGVbUElQRV9SRUFEX0VORF0sIGJ1c19hZGRyZXNzLCBNQVhfQUREUl9MRU4pKQorICAgIHsKKyAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBFT0YgcmVhZGluZyBhZGRyZXNzIGZyb20gYnVzIGRhZW1vblxuIiwgbWUpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBlcnJvciByZWFkaW5nIGFkZHJlc3MgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIG1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgY2xvc2UgKGJ1c19hZGRyZXNzX3BpcGVbUElQRV9SRUFEX0VORF0pOworCisgIGlmICghZGJ1c19zZXRlbnYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiLCBidXNfYWRkcmVzcykgfHwKKyAgICAgICFkYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfUElEIiwgTlVMTCkgfHwKKyAgICAgICFkYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQiLCBOVUxMKSB8fAorICAgICAgIWRidXNfc2V0ZW52ICgiREJVU19TVEFSVEVSX0FERFJFU1MiLCBOVUxMKSB8fAorICAgICAgIWRidXNfc2V0ZW52ICgiREJVU19TVEFSVEVSX0JVU19UWVBFIiwgTlVMTCkpCisgICAgb29tICgpOworCisgIGFwcF9waWQgPSBmb3JrICgpOworCisgIGlmIChhcHBfcGlkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZmFpbGVkIHRvIGZvcms6ICVzXG4iLCBtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKworICBpZiAoYXBwX3BpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNoaWxkICovCisgICAgICBleGVjX2FwcCAocHJvZ19hcmcsIGFyZ3YpOworICAgICAgLyogbm90IHJlYWNoZWQgKi8KKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBjaGlsZF9zdGF0dXM7CisgICAgICBwaWRfdCBjaGlsZF9waWQgPSB3YWl0cGlkICgtMSwgJmNoaWxkX3N0YXR1cywgMCk7CisKKyAgICAgIGlmIChjaGlsZF9waWQgPT0gKHBpZF90KSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGludCBlcnJzdiA9IGVycm5vOworCisgICAgICAgICAgaWYgKGVycnN2ID09IEVJTlRSKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAvKiBzaG91bGRuJ3QgaGFwcGVuOiB0aGUgb25seSBvdGhlciBkb2N1bWVudGVkIGVycm9ycyBhcmUgRUNISUxELAorICAgICAgICAgICAqIHdoaWNoIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB3ZSB0ZXJtaW5hdGUgd2hlbiBhbGwgb3VyIGNoaWxkcmVuCisgICAgICAgICAgICogaGF2ZSBkaWVkLCBhbmQgRUlOVkFMLCB3aGljaCB3b3VsZCBpbmRpY2F0ZSBwcm9ncmFtbWluZyBlcnJvciAqLworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YWl0cGlkKCkgZmFpbGVkOiAlc1xuIiwgbWUsIHN0cmVycm9yIChlcnJzdikpOworICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNoaWxkX3BpZCA9PSBidXNfcGlkKQorICAgICAgICB7CisgICAgICAgICAgLyogbm8gbmVlZCB0byBraWxsIGl0LCBub3cgKi8KKyAgICAgICAgICBidXNfcGlkID0gMDsKKworICAgICAgICAgIGlmIChXSUZFWElURUQgKGNoaWxkX3N0YXR1cykpCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZGJ1cy1kYWVtb24gZXhpdGVkIHdpdGggY29kZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBtZSwgV0VYSVRTVEFUVVMgKGNoaWxkX3N0YXR1cykpOworICAgICAgICAgIGVsc2UgaWYgKFdJRlNJR05BTEVEIChjaGlsZF9zdGF0dXMpKQorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGRidXMtZGFlbW9uIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkXG4iLAorICAgICAgICAgICAgICAgIG1lLCBXVEVSTVNJRyAoY2hpbGRfc3RhdHVzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGRidXMtZGFlbW9uIGRpZWQgb3Igc29tZXRoaW5nXG4iLCBtZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNoaWxkX3BpZCA9PSBhcHBfcGlkKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJ1c19waWQgIT0gMCkKKyAgICAgICAgICAgIGtpbGwgKGJ1c19waWQsIFNJR1RFUk0pOworCisgICAgICAgICAgaWYgKFdJRkVYSVRFRCAoY2hpbGRfc3RhdHVzKSkKKyAgICAgICAgICAgIHJldHVybiBXRVhJVFNUQVRVUyAoY2hpbGRfc3RhdHVzKTsKKworICAgICAgICAgIC8qIGlmIGl0IGRpZWQgZnJvbSBhIHNpZ25hbCwgYmVoYXZlIGxpa2Ugc2goMSkgKi8KKyAgICAgICAgICBpZiAoV0lGU0lHTkFMRUQgKGNoaWxkX3N0YXR1cykpCisgICAgICAgICAgICByZXR1cm4gMTI4ICsgV1RFUk1TSUcgKGNoaWxkX3N0YXR1cyk7CisKKyAgICAgICAgICAvKiBJIGdpdmUgdXAgKHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQpICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGNoaWxkIHByb2Nlc3MgZGllZCBvciBzb21ldGhpbmdcbiIsIG1lKTsKKyAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogaWdub3JpbmcgdW5rbm93biBjaGlsZCBwcm9jZXNzICVsZFxuIiwgbWUsCisgICAgICAgICAgICAgIChsb25nKSBjaGlsZF9waWQpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1zZW5kLmMgYi90b29scy9kYnVzLXNlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBkNmZjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1zZW5kLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZW5kLmMgIFV0aWxpdHkgcHJvZ3JhbSB0byBzZW5kIG1lc3NhZ2VzIGZyb20gdGhlIGNvbW1hbmQgbGluZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiZGJ1cy9kYnVzLWludGVybmFscy5oIgorCisjaWZuZGVmIEhBVkVfU1RSVE9MTAorI3VuZGVmIHN0cnRvbGwKKyNkZWZpbmUgc3RydG9sbCBteXN0cnRvbGwKKyNpbmNsdWRlICJzdHJ0b2xsLmMiCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlRPVUxMCisjdW5kZWYgc3RydG91bGwKKyNkZWZpbmUgc3RydG91bGwgbXlzdHJ0b3VsbAorI2luY2x1ZGUgInN0cnRvdWxsLmMiCisjZW5kaWYKKworI2lmZGVmIERCVVNfV0lOQ0UKKyNpZm5kZWYgc3RyZHVwCisjZGVmaW5lIHN0cmR1cCBfc3RyZHVwCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICphcHBuYW1lOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLWhlbHBdIFstLXN5c3RlbSB8IC0tc2Vzc2lvbiB8IC0tYnVzPUFERFJFU1MgfCAtLXBlZXI9QUREUkVTU10gWy0tZGVzdD1OQU1FXSBbLS10eXBlPVRZUEVdIFstLXByaW50LXJlcGx5Wz1saXRlcmFsXV0gWy0tZml4ZWRdIFstLXJlcGx5LXRpbWVvdXQ9TVNFQ10gPGRlc3RpbmF0aW9uIG9iamVjdCBwYXRoPiA8bWVzc2FnZSBuYW1lPiBbY29udGVudHMgLi4uXVxuIiwgYXBwbmFtZSk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9hcmcgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBkYnVzX3VpbnQxNl90IHVpbnQxNjsKKyAgZGJ1c19pbnQxNl90IGludDE2OworICBkYnVzX3VpbnQzMl90IHVpbnQzMjsKKyAgZGJ1c19pbnQzMl90IGludDMyOworICBkYnVzX3VpbnQ2NF90IHVpbnQ2NDsKKyAgZGJ1c19pbnQ2NF90IGludDY0OworICBkb3VibGUgZDsKKyAgdW5zaWduZWQgY2hhciBieXRlOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIAorICAvKiBGSVhNRSAtIHdlIGFyZSBpZ25vcmluZyBPT00gcmV0dXJucyBvbiBhbGwgdGhlc2UgZnVuY3Rpb25zICovCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIGJ5dGUgPSBzdHJ0b3VsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9CWVRFLCAmYnl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIGQgPSBzdHJ0b2QgKHZhbHVlLCBOVUxMKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0RPVUJMRSwgJmQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgIGludDE2ID0gc3RydG9sICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9JTlQxNiwgJmludDE2KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgdWludDE2ID0gc3RydG91bCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfVUlOVDE2LCAmdWludDE2KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICBpbnQzMiA9IHN0cnRvbCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfSU5UMzIsICZpbnQzMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICAgIHVpbnQzMiA9IHN0cnRvdWwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX1VJTlQzMiwgJnVpbnQzMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgaW50NjQgPSBzdHJ0b2xsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9JTlQ2NCwgJmludDY0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgdWludDY0ID0gc3RydG91bGwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX1VJTlQ2NCwgJnVpbnQ2NCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX1NUUklORywgJnZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgJnZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgIGlmIChzdHJjbXAgKHZhbHVlLCAidHJ1ZSIpID09IDApCisJeworCSAgdl9CT09MRUFOID0gVFJVRTsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0JPT0xFQU4pOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAodmFsdWUsICJmYWxzZSIpID09IDApCisJeworCSAgdl9CT09MRUFOID0gRkFMU0U7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9CT09MRUFOLCAmdl9CT09MRUFOKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiBpbnN0ZWFkIG9mIFwiJXNcIlxuIiwgYXBwbmFtZSwgdmFsdWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IFVuc3VwcG9ydGVkIGRhdGEgdHlwZSAlY1xuIiwgYXBwbmFtZSwgKGNoYXIpIHR5cGUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCisvLyBOb3RlOiBidWZmZXIgbXVzdCBiZSBwcmUtYWxsb2NhdGVkIGFuZCBhdCBsZWFzdCBhcyBiaWcgYXMgc3RyLgorc3RhdGljIGludAorZ2V0X25leHRfdG9rZW4gKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxvYywgY2hhciAqYnVmZmVyKQoreworICBpbnQgc3RyX2luZGV4LCBidWZmZXJfaW5kZXggPSAwOworCisgIGVudW0gU3RhdGUge1NUQVJULCBFU0NBUEV9OworICBlbnVtIFN0YXRlIHN0YXRlID0gU1RBUlQ7CisKKyAgZm9yIChzdHJfaW5kZXggPSBsb2M7IHN0cltzdHJfaW5kZXhdICE9ICdcMCc7IHN0cl9pbmRleCsrKQorICAgIHsKKyAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVCkKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoc3RyW3N0cl9pbmRleF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVTQ0FQRTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAvLyBJZiB3ZSBoaXQgYSAsIGluIHRoZSBzdGFydCBzdGF0ZSwgd2Ugc2hvdWxkIHRyZWF0IGl0IGFzCisgICAgICAgICAgICAgIC8vIGFuIGFyZ3VtZW50IHNlcGFyYXRvciBzaW5jZSBpdCdzIG5vdCBlc2NhcGVkLgorICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyX2luZGV4XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9pbmRleCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0YXRlID09IEVTQ0FQRSkKKyAgICAgICAgeworICAgICAgICAgIC8vIElmIHRoZSBcIGRvZXNuJ3QgaW1tZWRpYXRlbHkgcHJlY2VkZSBhICwgb3IgYW5vdGhlciBcLCB0aGVuCisgICAgICAgICAgLy8gaXQncyBub3QgYmVpbmcgdXNlZCBhcyBhbiBlc2NhcGUgY2hhcmFjdGVyLgorICAgICAgICAgIC8vIFNpbWlsYXJseSwgaWYgd2UgaGF2ZSBhIHN0cmluZyBvZiBtdWx0aXBsZSBccyBhcyB0aGUgbGFzdAorICAgICAgICAgIC8vIGNoYXJhY3RlcnMsIHRoZW4gdGhleSdyZSBhbHNvIG5vdCBiZWluZyB1c2VkIGFzIGVzY2FwZSBjaGFyYWN0ZXJzLgorICAgICAgICAgIGlmICgoc3RyW3N0cl9pbmRleF0gIT0gJywnICYmIHN0cltzdHJfaW5kZXhdICE9ICdcXCcpIHx8CisgICAgICAgICAgICAgIChzdHJbc3RyX2luZGV4XSA9PSAnXFwnICYmIHN0cltzdHJfaW5kZXggKyAxXSA9PSAnXDAnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlcl9pbmRleF0gPSAnXFwnOworICAgICAgICAgICAgICBidWZmZXJfaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHN0YXRlID0gU1RBUlQ7CisgICAgICAgIH0KKworICAgICAgYnVmZmVyW2J1ZmZlcl9pbmRleF0gPSBzdHJbc3RyX2luZGV4XTsKKyAgICAgIGJ1ZmZlcl9pbmRleCsrOworICAgIH0KKworICAvLyBJZiB3ZSBlbmQgb24gYSBzaW5nbGUgXCwgdGhlbiBpdCdzIG5vdCBiZWluZyB1c2VkIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIuCisgIC8vIE5vdGUgdGhlIGVhcmxpZXIgY2hlY2sgd2lsbCBvbmx5IGNhdGNoIGlmIHdlIGVuZCBvbiBhIHN0cmluZyBvZiBtdWx0aXBsZQorICAvLyBccy4KKyAgaWYgKHN0YXRlID09IEVTQ0FQRSkKKyAgICB7CisgICAgICBidWZmZXJbYnVmZmVyX2luZGV4XSA9ICdcXCc7CisgICAgICBidWZmZXJfaW5kZXgrKzsKKyAgICB9CisgIGJ1ZmZlcltidWZmZXJfaW5kZXhdID0gJ1wwJzsKKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfYXJyYXkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjaGFyICpidWZmZXIgPSBzdHJkdXAgKHZhbHVlKTsKKworICBpbnQgbG9jID0gMDsKKyAgd2hpbGUgKGxvYyA+PSAwKQorICAgIHsKKyAgICAgIGxvYyA9IGdldF9uZXh0X3Rva2VuICh2YWx1ZSwgbG9jLCBidWZmZXIpOworCisgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgZW1wdHkgc3RyaW5ncywgZXZlbiBpZiB0aGVyZSBhcmUKKyAgICAgIC8vIHNldmVyYWwgY29tbWFzIGRpcmVjdGx5IGJlc2lkZSBlYWNoIG90aGVyLgorICAgICAgaWYgKGJ1ZmZlclswXSAhPSAnXDAnKQorICAgICAgICBhcHBlbmRfYXJnIChpdGVyLCB0eXBlLCBidWZmZXIpOworICAgIH0KKyAgZnJlZSAoYnVmZmVyKTsKK30KKworc3RhdGljIGludCB0eXBlX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworc3RhdGljIHZvaWQKK2FwcGVuZF9kaWN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCBrZXl0eXBlLCBpbnQgdmFsdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGNvbnN0IGNoYXIgKnZhbDsKKyAgY2hhciAqZHVwdmFsID0gc3RyZHVwICh2YWx1ZSk7CisKKyAgdmFsID0gc3RydG9rIChkdXB2YWwsICIsIik7CisgIHdoaWxlICh2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKyAgICAgIAorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKGl0ZXIsCisJCQkJCURCVVNfVFlQRV9ESUNUX0VOVFJZLAorCQkJCQlOVUxMLAorCQkJCQkmc3ViaXRlcik7CisKKyAgICAgIGFwcGVuZF9hcmcgKCZzdWJpdGVyLCBrZXl0eXBlLCB2YWwpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgICAgaWYgKHZhbCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBNYWxmb3JtZWQgZGljdGlvbmFyeVxuIiwgYXBwbmFtZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBpZiAodmFsdHlwZSA9PSBEQlVTX1RZUEVfVkFSSUFOVCkKKyAgICAgICAgeworCSAgY2hhciBzaWdbMl07CisJICBjaGFyICpjID0gc3RyY2hyKHZhbCwgJzonKTsKKwkgIGlmICghYykKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIk1pc3NpbmcgdHlwZSBpbiB2YXJpYW50IGRpY3RcbiIpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICAqKGMrKykgPSAnXDAnOworCSAgc2lnWzBdID0gdHlwZV9mcm9tX25hbWUodmFsKTsKKwkgIHNpZ1sxXSA9ICdcMCc7CisJICBEQnVzTWVzc2FnZUl0ZXIgc3Vic3ViaXRlcjsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmc3ViaXRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVkFSSUFOVCwKKwkJCQkJICAgIHNpZywKKwkJCQkJICAgICZzdWJzdWJpdGVyKTsKKwkgIGFwcGVuZF9hcmcoJnN1YnN1Yml0ZXIsIHNpZ1swXSwgYyk7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBhcHBlbmRfYXJnICgmc3ViaXRlciwgdmFsdHlwZSwgdmFsKTsKKwl9CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoaXRlciwgJnN1Yml0ZXIpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgIH0gCisgIGZyZWUgKGR1cHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGVfZnJvbV9uYW1lIChjb25zdCBjaGFyICphcmcpCit7CisgIGludCB0eXBlOworICBpZiAoIXN0cmNtcCAoYXJnLCAic3RyaW5nIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMTY7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UNjQ7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImRvdWJsZSIpKQorICAgIHR5cGUgPSBEQlVTX1RZUEVfRE9VQkxFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJieXRlIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CWVRFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJib29sZWFuIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CT09MRUFOOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJvYmpwYXRoIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9PQkpFQ1RfUEFUSDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbmtub3duIHR5cGUgXCIlc1wiXG4iLCBhcHBuYW1lLCBhcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gdHlwZTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcHJpbnRfcmVwbHk7CisgIGRidXNfYm9vbF90IHByaW50X3JlcGx5X2xpdGVyYWw7CisgIGludCByZXBseV90aW1lb3V0OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgaW50IGk7CisgIERCdXNCdXNUeXBlIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICBjb25zdCBjaGFyICpkZXN0ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnBhdGggPSBOVUxMOworICBpbnQgbWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOworICBjb25zdCBjaGFyICp0eXBlX3N0ciA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICBjb25zdCBjaGFyICpzZW5kZXIgPSBOVUxMOworICBpbnQgaXNfYnVzID0gRkFMU0U7CisgIGludCBzZXNzaW9uX29yX3N5c3RlbSA9IEZBTFNFOworICBpbnQgZml4ZWQgPSAwOworCisgIGFwcG5hbWUgPSBhcmd2WzBdOworICAKKyAgaWYgKGFyZ2MgPCAzKQorICAgIHVzYWdlICgxKTsKKworICBwcmludF9yZXBseSA9IEZBTFNFOworICBwcmludF9yZXBseV9saXRlcmFsID0gRkFMU0U7CisgIHJlcGx5X3RpbWVvdXQgPSAtMTsKKyAgCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjICYmIG5hbWUgPT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgICBzZXNzaW9uX29yX3N5c3RlbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgICAgc2Vzc2lvbl9vcl9zeXN0ZW0gPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICgoc3Ryc3RyIChhcmcsICItLWJ1cz0iKSA9PSBhcmcpIHx8IChzdHJzdHIgKGFyZywgIi0tcGVlcj0iKSA9PSBhcmcpIHx8IChzdHJzdHIgKGFyZywgIi0tYWRkcmVzcz0iKSA9PSBhcmcpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFyZ1syXSA9PSAnYicpIC8qIGJ1cyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpc19idXMgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGFyZ1syXSA9PSAncCcpIC8qIHBlZXIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXNfYnVzID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAvKiBhZGRyZXNzOyBrZWVwaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlzX2J1cyA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYWRkcmVzcyA9IHN0cmNociAoYXJnLCAnPScpICsgMTsKKworICAgICAgICAgIGlmIChhZGRyZXNzWzBdID09ICdcMCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1wZWVyPVwiIGFuZCBcIi0tYnVzPVwiIHJlcXVpcmUgYW4gQUREUkVTU1xuIik7CisgICAgICAgICAgICAgIHVzYWdlICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXNlbmRlcj0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBzZW5kZXIgPSBzdHJjaHIgKGFyZywgJz0nKSArIDE7CisKKyAgICAgICAgICBpZiAoc2VuZGVyWzBdID09ICdcMCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1zZW5kZXI9XCIgcmVxdWlyZXMgYSBOQU1FXG4iKTsKKyAgICAgICAgICAgICAgdXNhZ2UgKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItLXByaW50LXJlcGx5IiwgMTMpID09IDApCisJeworCSAgcHJpbnRfcmVwbHkgPSBUUlVFOworCSAgbWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw7CisJICBpZiAoc3RyY21wIChhcmcgKyAxMywgIj1saXRlcmFsIikgPT0gMCkKKwkgICAgcHJpbnRfcmVwbHlfbGl0ZXJhbCA9IFRSVUU7CisJICBlbHNlIGlmICgqKGFyZyArIDEzKSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSAoJXMpIG9mIFwiLS1wcmludC1yZXBseVwiXG4iLCBhcmcgKyAxMyk7CisJICAgICAgdXNhZ2UgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXJlcGx5LXRpbWVvdXQ9IikgPT0gYXJnKQorCXsKKwkgIGlmICgqKHN0cmNociAoYXJnLCAnPScpICsgMSkgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1yZXBseS10aW1lb3V0PVwiIHJlcXVpcmVzIGFuIE1TRUNcbiIpOworCSAgICAgIHVzYWdlICgxKTsKKwkgICAgfQorCSAgcmVwbHlfdGltZW91dCA9IHN0cnRvbCAoc3RyY2hyIChhcmcsICc9JykgKyAxLAorCQkJCSAgTlVMTCwgMTApOworCSAgaWYgKHJlcGx5X3RpbWVvdXQgPD0gMCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImludmFsaWQgdmFsdWUgKCVzKSBvZiBcIi0tcmVwbHktdGltZW91dFwiXG4iLAorCSAgICAgICAgICAgICAgIHN0cmNociAoYXJnLCAnPScpICsgMSk7CisJICAgICAgdXNhZ2UgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWRlc3Q9IikgPT0gYXJnKQorCXsKKwkgIGlmICgqKHN0cmNociAoYXJnLCAnPScpICsgMSkgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1kZXN0PVwiIHJlcXVpcmVzIGFuIE5BTUVcbiIpOworCSAgICAgIHVzYWdlICgxKTsKKwkgICAgfQorCSAgZGVzdCA9IHN0cmNociAoYXJnLCAnPScpICsgMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tdHlwZT0iKSA9PSBhcmcpCisJdHlwZV9zdHIgPSBzdHJjaHIgKGFyZywgJz0nKSArIDE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGFyZywgIi0taGVscCIpKQorCXVzYWdlICgwKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1maXhlZCIpKQorICAgICAgICBmaXhlZCA9IDE7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorCXVzYWdlICgxKTsKKyAgICAgIGVsc2UgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgcGF0aCA9IGFyZzsKKyAgICAgIGVsc2UgLyogbmFtZSA9PSBOVUxMIGd1YXJhbnRlZWQgYnkgdGhlICd3aGlsZScgbG9vcCAqLworICAgICAgICBuYW1lID0gYXJnOworICAgIH0KKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHVzYWdlICgxKTsKKworICBpZiAoc2Vzc2lvbl9vcl9zeXN0ZW0gJiYKKyAgICAgIChhZGRyZXNzICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1wZWVyXCIgYW5kIFwiLS1idXNcIiBtYXkgbm90IGJlIHVzZWQgd2l0aCBcIi0tc3lzdGVtXCIgb3IgXCItLXNlc3Npb25cIlxuIik7CisgICAgICB1c2FnZSAoMSk7CisgICAgfQorCisgIGlmICh0eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2VfdHlwZSA9IGRidXNfbWVzc2FnZV90eXBlX2Zyb21fc3RyaW5nICh0eXBlX3N0cik7CisgICAgICBpZiAoIShtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgfHwKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTWVzc2FnZSB0eXBlIFwiJXNcIiBpcyBub3Qgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBpZiAoZGVzdCAmJiAhZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoZGVzdCwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJpbnZhbGlkIHZhbHVlICglcykgb2YgXCItLWRlc3RcIlxuIiwgZGVzdCk7CisgICAgICB1c2FnZSAoMSk7CisgICAgfQorCisgIGlmIChhZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChhZGRyZXNzLCAmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisgICAgfQorCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBcIiVzXCIgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgKGFkZHJlc3MgIT0gTlVMTCkgPyBhZGRyZXNzIDoKKyAgICAgICAgICAgICAgICAgKCh0eXBlID09IERCVVNfQlVTX1NZU1RFTSkgPyAic3lzdGVtIiA6ICJzZXNzaW9uIiksCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSBpZiAoKGFkZHJlc3MgIT0gTlVMTCkgJiYgaXNfYnVzKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19idXNfcmVnaXN0ZXIgKGNvbm5lY3Rpb24sICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcmVnaXN0ZXIgb24gY29ubmVjdGlvbiB0byBcIiVzXCIgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoc2VuZGVyICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoKGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgc2VuZGVyLCBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSOgorICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFM6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVxdWVzdGVkIG5hbWUgXCIlc1wiIGFscmVhZHkgaGFzIG93bmVyXG4iLCBzZW5kZXIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZXF1ZXN0IHNlbmRlciBuYW1lIFwiJXNcIjogJXNcbiIsIHNlbmRlciwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgaWYgdGhlIGJ1cyBpcyBjb21wbGlhbnQgKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJSZXF1ZXN0IG9mIHNlbmRlciBuYW1lIGZhaWxlZCB1bmV4cGVjdGVkbHlcbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgfQorCisgIGlmIChtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9kb3Q7CisKKyAgICAgIGxhc3RfZG90ID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChsYXN0X2RvdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCB1c2Ugb3JnLm15ZG9tYWluLkludGVyZmFjZS5NZXRob2Qgbm90YXRpb24sIG5vIGRvdCBpbiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgICpsYXN0X2RvdCA9ICdcMCc7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2RvdCArIDEpOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBUUlVFKTsKKyAgICB9CisgIGVsc2UgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9kb3Q7CisKKyAgICAgIGxhc3RfZG90ID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChsYXN0X2RvdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCB1c2Ugb3JnLm15ZG9tYWluLkludGVyZmFjZS5TaWduYWwgbm90YXRpb24sIG5vIGRvdCBpbiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgICpsYXN0X2RvdCA9ICdcMCc7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAocGF0aCwgbmFtZSwgbGFzdF9kb3QgKyAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnRlcm5hbCBlcnJvciwgdW5rbm93biBtZXNzYWdlIHR5cGVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGRuJ3QgYWxsb2NhdGUgRC1CdXMgbWVzc2FnZVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRlc3QgJiYgIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UsIGRlc3QpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZzsKKyAgICAgIGNoYXIgKmM7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIGludCBzZWNvbmRhcnlfdHlwZTsKKyAgICAgIGludCBjb250YWluZXJfdHlwZTsKKyAgICAgIERCdXNNZXNzYWdlSXRlciAqdGFyZ2V0X2l0ZXI7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgY29udGFpbmVyX2l0ZXI7CisKKyAgICAgIHR5cGUgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgIGFyZyA9IGFyZ3ZbaSsrXTsKKyAgICAgIGMgPSBzdHJjaHIgKGFyZywgJzonKTsKKworICAgICAgaWYgKGMgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogRGF0YSBpdGVtIFwiJXNcIiBpcyBiYWRseSBmb3JtZWRcbiIsIGFyZ3ZbMF0sIGFyZyk7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgICooYysrKSA9IDA7CisKKyAgICAgIGNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInZhcmlhbnQiKSA9PSAwKQorCWNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX1ZBUklBTlQ7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImFycmF5IikgPT0gMCkKKwljb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiZGljdCIpID09IDApCisJY29udGFpbmVyX3R5cGUgPSBEQlVTX1RZUEVfRElDVF9FTlRSWTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorCXsKKwkgIGFyZyA9IGM7CisJICBjID0gc3RyY2hyIChhcmcsICc6Jyk7CisJICBpZiAoYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IERhdGEgaXRlbSBcIiVzXCIgaXMgYmFkbHkgZm9ybWVkXG4iLCBhcmd2WzBdLCBhcmcpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICAqKGMrKykgPSAwOworCX0KKworICAgICAgaWYgKGFyZ1swXSA9PSAwKQorCXR5cGUgPSBEQlVTX1RZUEVfU1RSSU5HOworICAgICAgZWxzZQorCXR5cGUgPSB0eXBlX2Zyb21fbmFtZSAoYXJnKTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKQorCXsKKwkgIGNoYXIgc2lnWzVdOworCSAgYXJnID0gYzsKKwkgIGMgPSBzdHJjaHIgKGMsICc6Jyk7CisJICBpZiAoYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IERhdGEgaXRlbSBcIiVzXCIgaXMgYmFkbHkgZm9ybWVkXG4iLCBhcmd2WzBdLCBhcmcpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICAqKGMrKykgPSAwOworCSAgaWYgKCFzdHJjbXAoYXJnLCAidmFyaWFudCIpKQorCSAgICAvKiBIYWNrOiBzdXBwb3J0IHZhcmlhbnQgdmFsdWVzIGZvciBkaWN0aW9uYXJpZXMuICovCisJICAgIHNlY29uZGFyeV90eXBlID0gREJVU19UWVBFX1ZBUklBTlQ7CisJICBlbHNlCisJICAgIHNlY29uZGFyeV90eXBlID0gdHlwZV9mcm9tX25hbWUgKGFyZyk7CisJICBzaWdbMF0gPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjsKKwkgIHNpZ1sxXSA9IHR5cGU7CisJICBzaWdbMl0gPSBzZWNvbmRhcnlfdHlwZTsKKwkgIHNpZ1szXSA9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUjsKKwkgIHNpZ1s0XSA9ICdcMCc7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsCisJCQkJCSAgICBEQlVTX1RZUEVfQVJSQVksCisJCQkJCSAgICBzaWcsCisJCQkJCSAgICAmY29udGFpbmVyX2l0ZXIpOworCSAgdGFyZ2V0X2l0ZXIgPSAmY29udGFpbmVyX2l0ZXI7CisJfQorICAgICAgZWxzZSBpZiAoY29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJeworCSAgY2hhciBzaWdbMl07CisJICBzaWdbMF0gPSB0eXBlOworCSAgc2lnWzFdID0gJ1wwJzsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKwkJCQkJICAgIGNvbnRhaW5lcl90eXBlLAorCQkJCQkgICAgc2lnLAorCQkJCQkgICAgJmNvbnRhaW5lcl9pdGVyKTsKKwkgIHRhcmdldF9pdGVyID0gJmNvbnRhaW5lcl9pdGVyOworCX0KKyAgICAgIGVsc2UKKwl0YXJnZXRfaXRlciA9ICZpdGVyOworCisgICAgICBpZiAoY29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorCXsKKwkgIGFwcGVuZF9hcnJheSAodGFyZ2V0X2l0ZXIsIHR5cGUsIGMpOworCX0KKyAgICAgIGVsc2UgaWYgKGNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKQorCXsKKwkgIGFwcGVuZF9kaWN0ICh0YXJnZXRfaXRlciwgdHlwZSwgc2Vjb25kYXJ5X3R5cGUsIGMpOworCX0KKyAgICAgIGVsc2UKKwlhcHBlbmRfYXJnICh0YXJnZXRfaXRlciwgdHlwZSwgYyk7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwl7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLAorCQkJCQkgICAgICZjb250YWluZXJfaXRlcik7CisJfQorICAgIH0KKworICBpZiAocHJpbnRfcmVwbHkpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVwbHlfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlczogJXNcbiIsCisJCSAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlcGx5KQorICAgICAgICB7CisgICAgICAgICAgbG9uZyBzZWMsIHVzZWM7CisKKyAgICAgICAgICBfZGJ1c19nZXRfcmVhbF90aW1lICgmc2VjLCAmdXNlYyk7CisgICAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICAgICAgcHJpbnRfbWVzc2FnZV9maXhlZCAocmVwbHkpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50X21lc3NhZ2UgKHJlcGx5LCBwcmludF9yZXBseV9saXRlcmFsLCBzZWMsIHVzZWMpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIE5VTEwpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1zcGFtLmMgYi90b29scy9kYnVzLXNwYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzhkOGVhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1zcGFtLmMKQEAgLTAsMCArMSw1MjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGFtLmMgLSBhIHBsYWluIGxpYmRidXMgbWVzc2FnZS1zZW5kZXIsIGxvb3NlbHkgYmFzZWQgb24gZGJ1cy1zZW5kCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXRvb2wuaCIKKyNpbmNsdWRlICJ0b29sLWNvbW1vbi5oIgorCitzdGF0aWMgZGJ1c19ib29sX3QgaWdub3JlX2Vycm9ycyA9IEZBTFNFOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAiVXNhZ2U6IGRidXMtdGVzdC10b29sIHNwYW0gW09QVElPTlNdXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIlJlcGVhdGVkbHkgY2FsbCBjb20uZXhhbXBsZS5TcGFtKCkgb24gdGhlIGdpdmVuIEQtQnVzIHNlcnZpY2UuXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLXNlc3Npb24gICAgIHVzZSB0aGUgc2Vzc2lvbiBidXMgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICIgICAgLS1zeXN0ZW0gICAgICB1c2UgdGhlIHN5c3RlbSBidXNcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0taWdub3JlLWVycm9ycyAgICBpZ25vcmUgZXJyb3JzXG4iCisgICAgICAgICAgICIgICAgLS1kZXN0PU5BTUUgICBjYWxsIG1ldGhvZHMgb24gTkFNRSAoZGVmYXVsdCAiIERCVVNfU0VSVklDRV9EQlVTICIpXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLWNvdW50PU4gICAgIHNlbmQgTiBtZXNzYWdlcyAoZGVmYXVsdCAxKVxuIgorICAgICAgICAgICAiICAgIC0tcXVldWU9TiAgICAgcXVldWUgdXAgTiBtZXNzYWdlcyBhdCBhIHRpbWUgKGRlZmF1bHQgMSlcbiIKKyAgICAgICAgICAgIiAgICAtLWZsb29kICAgICAgIHNlbmQgYWxsIG1lc3NhZ2VzIGltbWVkaWF0ZWx5XG4iCisgICAgICAgICAgICIgICAgLS1uby1yZXBseSAgICBzZXQgdGhlIE5PX1JFUExZIGZsYWcgKGltcGxpZXMgLS1mbG9vZClcbiIKKyAgICAgICAgICAgIiAgICAtLW1lc3NhZ2VzLXBlci1jb25uPU4gICBhZnRlciBzZW5kaW5nIG1lc3NhZ2VzLXBlci1jb25uLCB3YWl0XG4iCisgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBmb3IgdGhlIHBlbmRpbmcgcmVwbGllcyBpZiBhbnksIHRoZW4gcmVjb25uZWN0XG4iCisgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogZG9uJ3QgcmVjb25uZWN0KVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1zdHJpbmcgICAgICBzZW5kIHBheWxvYWQgYXMgYSBzdHJpbmcgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICIgICAgLS1ieXRlcyAgICAgICBzZW5kIHBheWxvYWQgYXMgYSBieXRlLWFycmF5XG4iCisgICAgICAgICAgICIgICAgLS1lbXB0eSAgICAgICBzZW5kIGFuIGVtcHR5IHBheWxvYWRcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tcGF5bG9hZD1TICAgdXNlIFMgYXMgcGF5bG9hZCAoZGVmYXVsdCBcImhlbGxvLCB3b3JsZCFcIilcbiIKKyAgICAgICAgICAgIiAgICAtLXN0ZGluICAgICAgIHJlYWQgcGF5bG9hZCBmcm9tIHN0ZGluLCB1bnRpbCBFT0ZcbiIKKyAgICAgICAgICAgIiAgICAtLW1lc3NhZ2Utc3RkaW4gICByZWFkIGEgY29tcGxldGUgRC1CdXMgbWVzc2FnZSBmcm9tIHN0ZGluXG4iCisgICAgICAgICAgICIgICAgLS1yYW5kb20tc2l6ZSByZWFkIHdoaXRlc3BhY2Utc2VwYXJhdGVkIEFTQ0lJIGRlY2ltYWxcbiIKKyAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHBheWxvYWQgc2l6ZXMgZnJvbSBzdGRpbiBhbmQgcGljayBvbmUgcmFuZG9tbHlcbiIKKyAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGZvciBlYWNoIG1lc3NhZ2VcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tc2VlZD1TRUVEICAgc2VlZCBmb3Igc3JhbmQgKGRlZmF1bHQgaXMgdGltZSgpKVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3BjX25vdGlmeSAoREJ1c1BlbmRpbmdDYWxsICpwYywKKyAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50ICpyZWNlaXZlZF9wID0gZGF0YTsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBtZXNzYWdlID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBjKTsKKworICBpZiAoIWlnbm9yZV9lcnJvcnMgJiYgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbWVzc2FnZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcmVjZWl2ZSByZXBseSAjJWQ6ICVzOiAlc1xuIiwgKnJlY2VpdmVkX3AsCisgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBWRVJCT1NFIChzdGRlcnIsICJyZWNlaXZlZCBtZXNzYWdlICMlZFxuIiwgKnJlY2VpdmVkX3ApOworICAgIH0KKworICAoKnJlY2VpdmVkX3ApKys7Cit9CisKK3N0YXRpYyB2b2lkCitjb25zdW1lX3N0ZGluIChjaGFyICAgKipwYXlsb2FkX3AsCisgICAgICAgICAgICAgICBzaXplX3QgICpsZW5fcCkKK3sKKyAgY29uc3Qgc2l6ZV90IEJMT0NLX1NJWkUgPSA0MDk2OworICBzaXplX3QgbGVuID0gQkxPQ0tfU0laRTsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIHNpemVfdCBuOworICBjaGFyICpidWY7CisKKyAgYnVmID0gZGJ1c19tYWxsb2MgKGxlbik7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIHRvb2xfb29tICgicmVhZGluZyBwYXlsb2FkIGZyb20gc3RkaW4iKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAobGVuIC0gcG9zIDwgQkxPQ0tfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKnRtcCA9IGRidXNfcmVhbGxvYyAoYnVmLCBsZW4gKyBCTE9DS19TSVpFKTsKKworICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHRvb2xfb29tICgicmVhZGluZyBwYXlsb2FkIGZyb20gc3RkaW4iKTsKKworICAgICAgICAgIGJ1ZiA9IHRtcDsKKyAgICAgICAgICBsZW4gKz0gQkxPQ0tfU0laRTsKKyAgICAgICAgfQorCisgICAgICBuID0gZnJlYWQgKGJ1ZiArIHBvcywgMSwgbGVuIC0gcG9zLCBzdGRpbik7CisKKyAgICAgIGlmIChuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFT0Ygb3IgZXJyb3IgLSB0cmVhdCBhcyBFT0YgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBwb3MgKz0gbjsKKyAgICB9CisKKyAgKmxlbl9wID0gcG9zOworICAqcGF5bG9hZF9wID0gYnVmOworfQorCitpbnQKK2RidXNfdGVzdF90b29sX3NwYW0gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNCdXNUeXBlIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICBjb25zdCBjaGFyICpkZXN0aW5hdGlvbiA9IERCVVNfU0VSVklDRV9EQlVTOworICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMTsKKyAgaW50IHNlbnQgPSAwOworICB1bnNpZ25lZCBpbnQgc2VudF9pbl90aGlzX2Nvbm4gPSAwOworICBpbnQgcmVjZWl2ZWQgPSAwOworICB1bnNpZ25lZCBpbnQgcmVjZWl2ZWRfYmVmb3JlX3RoaXNfY29ubiA9IDA7CisgIGludCBxdWV1ZV9sZW4gPSAxOworICBjb25zdCBjaGFyICpwYXlsb2FkID0gTlVMTDsKKyAgY2hhciAqcGF5bG9hZF9idWYgPSBOVUxMOworICBzaXplX3QgcGF5bG9hZF9sZW47CisgIGludCBwYXlsb2FkX3R5cGUgPSBEQlVTX1RZUEVfU1RSSU5HOworICBEQnVzTWVzc2FnZSAqdGVtcGxhdGUgPSBOVUxMOworICBkYnVzX2Jvb2xfdCBmbG9vZCA9IEZBTFNFOworICBkYnVzX2Jvb2xfdCBub19yZXBseSA9IEZBTFNFOworICB1bnNpZ25lZCBpbnQgbWVzc2FnZXNfcGVyX2Nvbm4gPSAwOworICB1bnNpZ25lZCBpbnQgc2VlZCA9IHRpbWUgKE5VTEwpOworICBpbnQgbl9yYW5kb21fc2l6ZXMgPSAwOworICB1bnNpZ25lZCBpbnQgKnJhbmRvbV9zaXplcyA9IE5VTEw7CisKKyAgLyogYXJndlsxXSBpcyB0aGUgdG9vbCBuYW1lLCBzbyBzdGFydCBmcm9tIDIgKi8KKworICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGUgPSBEQlVTX0JVU19TWVNURU07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tY291bnQ9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY291bnQgPSBhdG9pIChhcmcgKyBzdHJsZW4gKCItLWNvdW50PSIpKTsKKworICAgICAgICAgIGlmIChjb3VudCA8IDEpCisgICAgICAgICAgICB1c2FnZSAoMik7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1pZ25vcmUtZXJyb3JzIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlnbm9yZV9lcnJvcnMgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tZGVzdD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBkZXN0aW5hdGlvbiA9IGFyZyArIHN0cmxlbiAoIi0tZGVzdD0iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXBheWxvYWQ9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgcGF5bG9hZCA9IGFyZyArIHN0cmxlbiAoIi0tcGF5bG9hZD0iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXN0ZGluIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN1bWVfc3RkaW4gKCZwYXlsb2FkX2J1ZiwgJnBheWxvYWRfbGVuKTsKKyAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZF9idWY7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1tZXNzYWdlLXN0ZGluIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN1bWVfc3RkaW4gKCZwYXlsb2FkX2J1ZiwgJnBheWxvYWRfbGVuKTsKKyAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZF9idWY7CisgICAgICAgICAgdGVtcGxhdGUgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsIChwYXlsb2FkLCBwYXlsb2FkX2xlbiwgJmVycm9yKTsKKworICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gZGVtYXJzaGFsIHRlbXBsYXRlIG1lc3NhZ2U6ICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHRlbXBsYXRlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVGVtcGxhdGUgbWVzc2FnZSBtdXN0IGJlIGEgbWV0aG9kIGNhbGxcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXJhbmRvbS1zaXplIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4sIG1heCA9IDA7CisgICAgICAgICAgaW50IGosIGNvbnN1bWVkID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpwOworCisgICAgICAgICAgY29uc3VtZV9zdGRpbiAoJnBheWxvYWRfYnVmLCAmcGF5bG9hZF9sZW4pOworCisgICAgICAgICAgZm9yIChwID0gcGF5bG9hZF9idWY7IHAgPCBwYXlsb2FkX2J1ZiArIHBheWxvYWRfbGVuOyBwICs9IGNvbnN1bWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiB0aGUgc3BhY2UgY2hhcmFjdGVyIG1hdGNoZXMgYW55IChvciBubykgd2hpdGVzcGFjZSAqLworICAgICAgICAgICAgICBpZiAoc3NjYW5mIChwLCAiICV1ICVuIiwgJmxlbiwgJmNvbnN1bWVkKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIG5fcmFuZG9tX3NpemVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByYW5kb21fc2l6ZXMgPSBkYnVzX25ldzAgKGludCwgbl9yYW5kb21fc2l6ZXMpOworCisgICAgICAgICAgaWYgKHJhbmRvbV9zaXplcyA9PSBOVUxMKQorICAgICAgICAgICAgdG9vbF9vb20gKCJhbGxvY2F0aW5nIGFycmF5IG9mIG1lc3NhZ2UgbGVuZ3RocyIpOworCisgICAgICAgICAgZm9yIChwID0gcGF5bG9hZF9idWYsIGogPSAwOworICAgICAgICAgICAgICBwIDwgcGF5bG9hZF9idWYgKyBwYXlsb2FkX2xlbiAmJiBqIDwgbl9yYW5kb21fc2l6ZXM7CisgICAgICAgICAgICAgIHAgKz0gY29uc3VtZWQsIGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3NjYW5mIChwLCAiICV1ICVuIiwgJmxlbiwgJmNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgcmFuZG9tX3NpemVzW2pdID0gbGVuOworCisgICAgICAgICAgICAgIGlmIChsZW4gPiBtYXgpCisgICAgICAgICAgICAgICAgbWF4ID0gbGVuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19mcmVlIChwYXlsb2FkX2J1Zik7CisgICAgICAgICAgcGF5bG9hZF9sZW4gPSBtYXggKyAxOworICAgICAgICAgIHBheWxvYWRfYnVmID0gZGJ1c19uZXcgKGNoYXIsIHBheWxvYWRfbGVuKTsKKyAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZF9idWY7CisKKyAgICAgICAgICBpZiAocGF5bG9hZF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHRvb2xfb29tICgiYWxsb2NhdGluZyBtYXhpbXVtLXNpemVkIHBheWxvYWQiKTsKKworICAgICAgICAgIG1lbXNldCAocGF5bG9hZF9idWYsICdYJywgcGF5bG9hZF9sZW4pOworICAgICAgICAgIHBheWxvYWRfYnVmW3BheWxvYWRfbGVuIC0gMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tZW1wdHkiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcGF5bG9hZF90eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zdHJpbmciKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcGF5bG9hZF90eXBlID0gREJVU19UWVBFX1NUUklORzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWJ5dGVzIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHBheWxvYWRfdHlwZSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWZsb29kIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChxdWV1ZV9sZW4gPiAxKQorICAgICAgICAgICAgdXNhZ2UgKDIpOworCisgICAgICAgICAgaWYgKG1lc3NhZ2VzX3Blcl9jb25uID4gMCkKKyAgICAgICAgICAgIHVzYWdlICgyKTsKKworICAgICAgICAgIGZsb29kID0gVFJVRTsKKyAgICAgICAgICBxdWV1ZV9sZW4gPSAtMTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLW5vLXJlcGx5IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChxdWV1ZV9sZW4gPiAxKQorICAgICAgICAgICAgdXNhZ2UgKDIpOworCisgICAgICAgICAgcXVldWVfbGVuID0gLTE7CisgICAgICAgICAgbm9fcmVwbHkgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tcXVldWU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZsb29kIHx8IG5vX3JlcGx5KQorICAgICAgICAgICAgdXNhZ2UgKDIpOworCisgICAgICAgICAgcXVldWVfbGVuID0gYXRvaSAoYXJnICsgc3RybGVuICgiLS1xdWV1ZT0iKSk7CisKKyAgICAgICAgICBpZiAocXVldWVfbGVuIDwgMSkKKyAgICAgICAgICAgIHVzYWdlICgyKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXNlZWQ9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgc2VlZCA9IHN0cnRvdWwgKGFyZyArIHN0cmxlbiAoIi0tc2VlZD0iKSwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tbWVzc2FnZXMtcGVyLWNvbm49IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZXNfcGVyX2Nvbm4gPSBhdG9pIChhcmcgKyBzdHJsZW4gKCItLW1lc3NhZ2VzLXBlci1jb25uPSIpKTsKKworICAgICAgICAgIGlmIChtZXNzYWdlc19wZXJfY29ubiA+IDAgJiYgZmxvb2QpCisgICAgICAgICAgICB1c2FnZSAoMik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlICgyKTsKKyAgICAgICAgfQorICAgIH0KKworICBzcmFuZCAoc2VlZCk7CisKKyAgaWYgKHBheWxvYWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXlsb2FkID0gImhlbGxvLCB3b3JsZCEiOworICAgICAgcGF5bG9hZF9sZW4gPSBzdHJsZW4gKHBheWxvYWQpOworICAgIH0KKworICBWRVJCT1NFIChzdGRlcnIsICJXaWxsIHNlbmQgdXAgdG8gJWQgbWVzc2FnZXMsIHdpdGggdXAgdG8gJWQgcXVldWVkLCBtYXggJWQgcGVyIGNvbm5lY3Rpb25cbiIsCisgICAgICAgICAgIGNvdW50LCBxdWV1ZV9sZW4sIG1lc3NhZ2VzX3Blcl9jb25uKTsKKworICB3aGlsZSAobm9fcmVwbHkgPyBzZW50IDwgY291bnQgOiByZWNlaXZlZCA8IGNvdW50KQorICAgIHsKKyAgICAgIC8qIENvbm5lY3Q/CisgICAgICAgKiAtIEluIHRoZSBmaXJzdCBpdGVyYXRpb24KKyAgICAgICAqICBvcgorICAgICAgICogLSBXaGVuIG1lc3NhZ2VzX3Blcl9jb25uIG1lc3NhZ2VzIGhhdmUgYmVlbiBzZW50IGFuZCBubyByZXBsaWVzIGFyZSBiZWluZyB3YWl0ZWQgZm9yCisgICAgICAgKi8KKyAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwgfHwKKyAgICAgICAgICAobWVzc2FnZXNfcGVyX2Nvbm4gPiAwICAmJiBzZW50X2luX3RoaXNfY29ubiA9PSBtZXNzYWdlc19wZXJfY29ubiAmJgorICAgICAgICAgICAobm9fcmVwbHkgfHwgcmVjZWl2ZWQgLSByZWNlaXZlZF9iZWZvcmVfdGhpc19jb25uID09IG1lc3NhZ2VzX3Blcl9jb25uKSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgVkVSQk9TRSAoc3RkZXJyLCAiTmV3IGNvbm5lY3Rpb24uXG4iKTsKKyAgICAgICAgICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0X3ByaXZhdGUgKHR5cGUsICZlcnJvcik7CisKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byBidXM6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChyYW5kb21fc2l6ZXMpOworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHBheWxvYWRfYnVmKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzZW50X2luX3RoaXNfY29ubiA9IDA7CisgICAgICAgICAgcmVjZWl2ZWRfYmVmb3JlX3RoaXNfY29ubiA9IHJlY2VpdmVkOworICAgICAgICB9CisKKyAgICAgIC8qIFNlbmQgYW5vdGhlciBtZXNzYWdlPyBPbmx5IGlmIHdlIGRvbid0IGV4Y2VlZCB0aGUgMyBsaW1pdHM6CisgICAgICAgKiAtIHRvdGFsIGFtb3VudCBvZiBtZXNzYWdlcworICAgICAgICogLSBtZXNzYWdlcyBzZW50IG9uIHRoaXMgY29ubmVjdGlvbgorICAgICAgICogLSBxdWV1ZQorICAgICAgICovCisgICAgICB3aGlsZSAoc2VudCA8IGNvdW50ICYmCisgICAgICAgICAgICAgKG1lc3NhZ2VzX3Blcl9jb25uID09IDAgfHwgc2VudF9pbl90aGlzX2Nvbm4gPCBtZXNzYWdlc19wZXJfY29ubikgJiYKKyAgICAgICAgICAgICAocXVldWVfbGVuID09IC0xIHx8IHNlbnRfaW5fdGhpc19jb25uIDwgcXVldWVfbGVuICsgcmVjZWl2ZWQgLSByZWNlaXZlZF9iZWZvcmVfdGhpc19jb25uKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgICAgICAgICAgaWYgKHRlbXBsYXRlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfY29weSAodGVtcGxhdGUpOworCisgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJjb3B5aW5nIG1lc3NhZ2UiKTsKKworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBub19yZXBseSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBtZW07CisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOworCisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uZXhhbXBsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BhbSIpOworCisgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJhbGxvY2F0aW5nIG1lc3NhZ2UiKTsKKworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBub19yZXBseSk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChwYXlsb2FkX3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAocmFuZG9tX3NpemVzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpc24ndCBmYWlyLCBzdHJpY3RseSBzcGVha2luZyAtIHRoZSBmaXJzdCBmZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFyZSBhIGJpdCBtb3JlIGxpa2VseSB0byBiZSBjaG9zZW4sIHVubGVzcworICAgICAgICAgICAgICAgICAgICAgICAgICogUkFORF9NQVggaXMgZGl2aXNpYmxlIGJ5IG5fcmFuZG9tX3NpemVzIC0gYnV0IGl0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGdvb2QgZW5vdWdoIGZvciB0cmFmZmljLWdlbmVyYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJhbmRvbV9zaXplc1tyYW5kICgpICUgbl9yYW5kb21fc2l6ZXNdOworICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9idWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1lbSA9IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbV9zaXplcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZG8gdGhlIHRydW5jYXRpb24gYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfYnVmW2xlbl0gPSAnWCc7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gcGF5bG9hZF9sZW47CisKKyAgICAgICAgICAgICAgICAgICAgLyogYXMgYWJvdmUsIG5vdCBzdHJpY3RseSBmYWlyLCBidXQgY2xvc2UgZW5vdWdoICovCisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5kb21fc2l6ZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSByYW5kb21fc2l6ZXNbcmFuZCAoKSAlIG5fcmFuZG9tX3NpemVzXTsKKworICAgICAgICAgICAgICAgICAgICBtZW0gPSBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX3VpbnQzMl90KSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbWVtID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFtZW0pCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJidWlsZGluZyBtZXNzYWdlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobm9fcmVwbHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIE5VTEwpKQorICAgICAgICAgICAgICAgIHRvb2xfb29tICgic2VuZGluZyBtZXNzYWdlIik7CisKKyAgICAgICAgICAgICAgVkVSQk9TRSAoc3RkZXJyLCAic2VudCBtZXNzYWdlICMlZFxuIiwgc2VudCk7CisgICAgICAgICAgICAgIHNlbnQrKzsKKyAgICAgICAgICAgICAgc2VudF9pbl90aGlzX2Nvbm4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9JTkZJTklURSkpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICAgICAgICAgICAgICBWRVJCT1NFIChzdGRlcnIsICJzZW50IG1lc3NhZ2UgIyVkXG4iLCBzZW50KTsKKyAgICAgICAgICAgICAgc2VudCsrOworICAgICAgICAgICAgICBzZW50X2luX3RoaXNfY29ubisrOworCisgICAgICAgICAgICAgIGlmIChwYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHRvb2xfb29tICgic2VuZGluZyBtZXNzYWdlIik7CisKKyAgICAgICAgICAgICAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICAgICAgICAgICAgICBwY19ub3RpZnkgKHBjLCAmcmVjZWl2ZWQpOworICAgICAgICAgICAgICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHBjX25vdGlmeSwgJnJlY2VpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJzZXR0aW5nIHBlbmRpbmcgY2FsbCBub3RpZmllciIpOworCisgICAgICAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24sIC0xKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRpc2Nvbm5lY3RlZCBmcm9tIGJ1c1xuIik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgfQorCisgIFZFUkJPU0UgKHN0ZGVyciwgIkRvbmVcbiIpOworCisgIGRidXNfZnJlZSAocGF5bG9hZF9idWYpOworICBkYnVzX2ZyZWUgKHJhbmRvbV9zaXplcyk7CisKKyAgaWYgKHRlbXBsYXRlICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmICh0ZW1wbGF0ZSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LmMgYi90b29scy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwYWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIGRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgLSB1cGRhdGUgRC1CdXMsIGFuZCBvcHRpb25hbGx5CisgKiBzeXN0ZW1kLCBhY3RpdmF0aW9uIGVudmlyb25tZW50CisgKgorICogQ29weXJpZ2h0IMKpIDIwMTQtMjAxNSBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NZU0VYSVRTX0gKKyMgaW5jbHVkZSA8c3lzZXhpdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpZmRlZiBEQlVTX1VOSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0b29sLWNvbW1vbi5oIgorCisjZGVmaW5lIFBST0dOQU1FICJkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IgorCisjaWZuZGVmIEVYX1VTQUdFCisjIGRlZmluZSBFWF9VU0FHRSA2NAorI2VuZGlmCisKKyNpZm5kZWYgRVhfVU5BVkFJTEFCTEUKKyMgZGVmaW5lIEVYX1VOQVZBSUxBQkxFIDY5CisjZW5kaWYKKworI2lmbmRlZiBFWF9PU0VSUgorIyBkZWZpbmUgRVhfT1NFUlIgNzEKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKy8qIFRoZSBXaW5kb3dzIEMgcnVudGltZSB1c2VzIGEgZGlmZmVyZW50IG5hbWUgKi8KKyNkZWZpbmUgZW52aXJvbiBfZW52aXJvbgorI2Vsc2UKKy8qIGFwcGFyZW50bHkgdGhpcyBpcyB0aGUgcG9ydGFibGUgd2F5IHRvIGdldCB0aGUgZW50aXJlIGVudmlyb25tZW50Li4uCisgKiBHTlUgcGxhdGZvcm1zIGFsc28gcHV0IGl0IGluIHVuaXN0ZC5oIGJ1dCB0aGF0J3Mgbm90IHBvcnRhYmxlICovCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworLyogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55dGhpbmcgdXNlZnVsIHRvIHNheSBhYm91dCB0aGUgc3RhZ2UgYXQgd2hpY2ggd2UKKyAqIGZhaWxlZCAqLworI2RlZmluZSBvb20oKSB0b29sX29vbSAoInVwZGF0aW5nIGVudmlyb25tZW50IikKKworc3RhdGljIGRidXNfYm9vbF90IHZlcmJvc2UgPSBGQUxTRTsKKworc3RhdGljIHZvaWQgc2F5IChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworCitzdGF0aWMgdm9pZAorc2F5IChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgLi4uKQoreworICB2YV9saXN0IGFwOworCisgIGlmICghdmVyYm9zZSkKKyAgICByZXR1cm47CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIFBST0dOQU1FKTsKKyAgdmFfc3RhcnQgKGFwLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFwKTsKKyAgZnB1dGMgKCdcbicsIHN0ZGVycik7CisgIHZhX2VuZCAoYXApOworfQorCisjaWZkZWYgX19saW51eF9fCitzdGF0aWMgZGJ1c19ib29sX3QKK3N5c3RlbWRfdXNlcl9ydW5uaW5nICh2b2lkKQoreworICBjaGFyICp4ZGdfcnVudGltZV9kaXIgPSBnZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKyAgY2hhciAqcGF0aDsKKyAgc3RydWN0IHN0YXQgYnVmOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBpZiAoeGRnX3J1bnRpbWVfZGlyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEFzc3VtZSB0aGF0IFhER19SVU5USU1FX0RJUi9zeXN0ZW1kIGV4aXN0cyBpZiBhbmQgb25seSBpZgorICAgKiAic3lzdGVtZCAtLXVzZXIiIGlzIHJ1bm5pbmcuIEl0J3MgT0sgdG8gdXNlIGFzcHJpbnRmKCkgaGVyZQorICAgKiBiZWNhdXNlIHdlIGtub3cgd2UncmUgb24gTGludXguICovCisgIGlmIChhc3ByaW50ZiAoJnBhdGgsICIlcy9zeXN0ZW1kIiwgeGRnX3J1bnRpbWVfZGlyKSA8IDApCisgICAgb29tICgpOworCisgIGlmIChzdGF0IChwYXRoLCAmYnVmKSA9PSAwKQorICAgIHJldCA9IFRSVUU7CisKKyAgZnJlZSAocGF0aCk7CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c01lc3NhZ2VJdGVyIG1zZ19pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXlfaXRlcjsKKyAgaW50IGk7CisgIGludCBmaXJzdF9ub25fb3B0aW9uID0gYXJnYzsKKyAgZGJ1c19ib29sX3QgYWxsID0gRkFMU0U7CisjaWZkZWYgX19saW51eF9fCisgIERCdXNNZXNzYWdlICpzZF9tc2cgPSBOVUxMOworICBEQnVzTWVzc2FnZUl0ZXIgc2RfbXNnX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzZF9hcnJheV9pdGVyOworICBkYnVzX2Jvb2xfdCBzeXN0ZW1kID0gRkFMU0U7CisjZW5kaWYKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykKKyAgICAgICAgeworICAgICAgICAgIGZpcnN0X25vbl9vcHRpb24gPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItLSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmaXJzdF9ub25fb3B0aW9uID0gaSArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi0tYWxsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGFsbCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi0tc3lzdGVtZCIpID09IDApCisgICAgICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgICAgICBzeXN0ZW1kID0gVFJVRTsKKyNlbHNlCisgICAgICAgICAgc2F5ICgibm90IG9uIExpbnV4LCBpZ25vcmluZyAtLXN5c3RlbWQgYXJndW1lbnQiKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgIiUxJHM6IHVwZGF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHNldCBmb3IgRC1CdXNcbiIKKyAgICAgICAgICAgICAgIiAgICBzZXNzaW9uIHNlcnZpY2VzXG4iCisgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgIiUxJHMgW29wdGlvbnNdIFZBUls9VkFMXSBbVkFSMls9VkFMMl0gLi4uXVxuIgorICAgICAgICAgICAgICAiICAgIEFkZCBzcGVjaWZpZWQgdmFyaWFibGVzIHRvIEQtQnVzIGFjdGl2YXRpb24gZW52aXJvbm1lbnQuXG4iCisgICAgICAgICAgICAgICIgICAgSWYgb21pdHRlZCwgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIGN1cnJlbnQgZW52aXJvbm1lbnQ7XG4iCisgICAgICAgICAgICAgICIgICAgdmFyaWFibGVzIG5vdCBmb3VuZCBpbiB0aGUgZW52aXJvbm1lbnQgYXJlIGlnbm9yZWQuXG4iCisgICAgICAgICAgICAgICIlMSRzIC0tYWxsXG4iCisgICAgICAgICAgICAgICIgICAgQWRkIGVudGlyZSBjdXJyZW50IGVudmlyb25tZW50IHRvIEQtQnVzIGFjdGl2YXRpb25cbiIKKyAgICAgICAgICAgICAgIiAgICBlbnZpcm9ubWVudC5cbiIKKyAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAiLS1hbGxcbiIKKyAgICAgICAgICAgICAgIiAgICBVcGxvYWQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiIKKyAgICAgICAgICAgICAgIi0tc3lzdGVtZFxuIgorICAgICAgICAgICAgICAiICAgIEFsc28gdXBkYXRlIHRoZSAnc3lzdGVtZCAtLXVzZXInIGVudmlyb25tZW50XG4iCisgICAgICAgICAgICAgICIgICAgaWYgcG9zc2libGUuXG4iCisgICAgICAgICAgICAgICItLXZlcmJvc2VcbiIKKyAgICAgICAgICAgICAgIiAgICBUYWxrIGFib3V0IGl0LlxuIgorICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgIFBST0dOQU1FKTsKKyAgICAgICAgICBleGl0IChFWF9VU0FHRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGFsbCAmJiBmaXJzdF9ub25fb3B0aW9uIDwgYXJnYykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3I6IC0tYWxsIGNhbm5vdCBiZSB1c2VkIHdpdGggVkFSIG9yICIKKyAgICAgICAgICAgICAgICJWQVI9VkFMIGFyZ3VtZW50c1xuIiwgUFJPR05BTUUpOworICAgICAgZXhpdCAoRVhfVVNBR0UpOworICAgIH0KKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIGlmIChjb25uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICIlczogZXJyb3I6IHVuYWJsZSB0byBjb25uZWN0IHRvIEQtQnVzOiAlc1xuIiwgUFJPR05BTUUsCisgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBleGl0IChFWF9PU0VSUik7CisgICAgfQorCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgb29tICgpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtc2csICZtc2dfaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJm1zZ19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAie3NzfSIsICZhcnJheV9pdGVyKSkKKyAgICBvb20gKCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgaWYgKHN5c3RlbWQpCisgICAgeworICAgICAgaWYgKCFzeXN0ZW1kX3VzZXJfcnVubmluZyAoKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRoaXMgaXMgb25seSBiZXN0LWVmZm9ydC4gKi8KKyAgICAgICAgICBzYXkgKCJzeXN0ZW1kIC0tdXNlciBub3QgZm91bmQsIGlnbm9yaW5nIC0tc3lzdGVtZCBhcmd1bWVudCIpOworICAgICAgICAgIHN5c3RlbWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoc3lzdGVtZCkKKyAgICB7CisgICAgICBzZF9tc2cgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIiwKKyAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuTWFuYWdlciIsCisgICAgICAgICAgIlNldEVudmlyb25tZW50Iik7CisKKyAgICAgIGlmIChzZF9tc2cgPT0gTlVMTCkKKyAgICAgICAgb29tICgpOworCisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAoc2RfbXNnLCAmc2RfbXNnX2l0ZXIpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmc2RfbXNnX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAicyIsICZzZF9hcnJheV9pdGVyKSkKKyAgICAgICAgb29tICgpOworICAgIH0KKyNlbmRpZgorCisgIGZvciAoaSA9IGFsbCA/IDAgOiBmaXJzdF9ub25fb3B0aW9uOworICAgICAgYWxsID8gZW52aXJvbltpXSAhPSBOVUxMIDogaSA8IGFyZ2M7CisgICAgICBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqdmFyOworICAgICAgY2hhciAqY29weTsKKyAgICAgIGNoYXIgKmVxOworICAgICAgY29uc3QgY2hhciAqdmFsOworICAgICAgREJ1c01lc3NhZ2VJdGVyIHBhaXJfaXRlcjsKKworICAgICAgaWYgKGFsbCkKKyAgICAgICAgdmFyID0gZW52aXJvbltpXTsKKyAgICAgIGVsc2UKKyAgICAgICAgdmFyID0gYXJndltpXTsKKworICAgICAgY29weSA9IHN0cmR1cCAodmFyKTsKKworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgb29tICgpOworCisgICAgICBpZiAoIWRidXNfdmFsaWRhdGVfdXRmOCAodmFyLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHZhciBpcyBlaXRoZXIgb2YgdGhlIGZvcm0gVkFSIG9yIFZBUj1WQUwgKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICIlczogd2FybmluZzogZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IFVURi04OiAlc1xuIiwKKyAgICAgICAgICAgICAgUFJPR05BTUUsIHZhcik7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIGVxID0gc3RyY2hyIChjb3B5LCAnPScpOworCisgICAgICBpZiAoZXEgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhbGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGl0ZW1zIGluIHRoZSBlbnZpcm9ubWVudCBibG9jayBzaG91bGQgYmUgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICogVkFSPVZBTCAqLworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGhvdXQgJz0nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIFBST0dOQU1FLCB2YXIpOworICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpdGVtcyBvbiB0aGUgY29tbWFuZC1saW5lIG1heSBiZSBvZiB0aGUgZm9ybSBWQVIKKyAgICAgICAgICAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSBpbmZlciB0aGUgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KKyAgICAgICAgICAgICAgdmFsID0gZ2V0ZW52ICh2YXIpOworCisgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZSAqLworICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWRidXNfdmFsaWRhdGVfdXRmOCAodmFsLCBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3QgVVRGLTg6ICVzPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIFBST0dOQU1FLCB2YXIsIHZhbCk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzcGxpdCBWQVI9VkFMIGludG8gVkFSIGFuZCBWQUwgKi8KKyAgICAgICAgICAqZXEgPSAnXDAnOworICAgICAgICAgIHZhbCA9IGVxICsgMTsKKyAgICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICBpZiAoc3lzdGVtZCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmNvbWJpbmVkOworCisgICAgICAgICAgLyogcmVjb21iaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgIGlmIChhc3ByaW50ZiAoJmNvbWJpbmVkLCAiJXM9JXMiLCBjb3B5LCB2YWwpIDwgMCkKKyAgICAgICAgICAgIG9vbSAoKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc2RfYXJyYXlfaXRlciwKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY29tYmluZWQpKQorICAgICAgICAgICAgb29tICgpOworCisgICAgICAgICAgZnJlZSAoY29tYmluZWQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsCisgICAgICAgICAgICAgIERCVVNfVFlQRV9ESUNUX0VOVFJZLCBOVUxMLCAmcGFpcl9pdGVyKSkKKyAgICAgICAgb29tICgpOworCisgICAgICBzYXkgKCJzZXR0aW5nICVzPSVzIiwgY29weSwgdmFsKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZwYWlyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICZjb3B5KSkKKyAgICAgICAgb29tICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnBhaXJfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgJnZhbCkpCisgICAgICAgIG9vbSAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmcGFpcl9pdGVyKSkKKyAgICAgICAgb29tICgpOworCituZXh0OgorICAgICAgZnJlZSAoY29weSk7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmbXNnX2l0ZXIsICZhcnJheV9pdGVyKSkKKyAgICBvb20gKCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgaWYgKHN5c3RlbWQgJiYKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZzZF9tc2dfaXRlciwgJnNkX2FycmF5X2l0ZXIpKQorICAgIG9vbSAoKTsKKyNlbmRpZgorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm4sIG1zZywgLTEsICZlcnJvcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICIlczogZXJyb3Igc2VuZGluZyB0byBkYnVzLWRhZW1vbjogJXM6ICVzXG4iLAorICAgICAgICAgIFBST0dOQU1FLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGV4aXQgKEVYX1VOQVZBSUxBQkxFKTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtc2cpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtc2csICZlcnJvciwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAiJXM6IGVycm9yIGZyb20gZGJ1cy1kYWVtb246ICVzOiAlc1xuIiwKKyAgICAgICAgICBQUk9HTkFNRSwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBleGl0IChFWF9VTkFWQUlMQUJMRSk7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisjaWZkZWYgX19saW51eF9fCisgIGlmIChzeXN0ZW1kKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm4sIHNkX21zZywgLTEsCisgICAgICAgICAgJmVycm9yKTsKKworICAgICAgLyogbm9uLWZhdGFsLCB0aGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gY29tbXVuaWNhdGUKKyAgICAgICAqIHdpdGggZGJ1cy1kYWVtb24gKi8KKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGVycm9yIHNlbmRpbmcgdG8gc3lzdGVtZDogJXM6ICVzXG4iLAorICAgICAgICAgICAgICBQUk9HTkFNRSwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtc2cpIHx8CisgICAgICAgICAgIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobXNnLCAmZXJyb3IsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBlcnJvciBmcm9tIHN5c3RlbWQ6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgUFJPR05BTUUsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgIGlmIChyZXBseSAhPSBOVUxMKQorICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChzZF9tc2cpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLXV1aWRnZW4uYyBiL3Rvb2xzL2RidXMtdXVpZGdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2U1NTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXV1aWRnZW4uYwpAQCAtMCwwICsxLDE1OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXV1aWRnZW4uYyAgVXRpbGl0eSBwcm9ncmFtIHRvIGNyZWF0ZSBVVUlEcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXV1aWRnZW4uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworc3RhdGljIHZvaWQKK3VzYWdlIChjaGFyICpuYW1lLCBpbnQgZWNvZGUpCit7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgbmFtZSA9ICJkYnVzLXV1aWRnZW4iOworICAKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFstLWVuc3VyZVs9RklMRU5BTUVdXSBbLS1nZXRbPUZJTEVOQU1FXV1cbiIsIG5hbWUpOworICBleGl0IChlY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJzaW9uICh2b2lkKQoreworICBwcmludGYgKCJELUJ1cyBVVUlEIEdlbmVyYXRvciAlc1xuIgorICAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLlxuIgorICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuXG4iCisgICAgICAgICAgIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIiwKKyAgICAgICAgICBWRVJTSU9OKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X2FyZyAoY29uc3QgY2hhciAgKmFyZywKKyAgICAgICAgIGNvbnN0IGNoYXIgICpvcHRpb24sCisgICAgICAgICBjb25zdCBjaGFyICoqdmFsdWVfcCkKK3sKKyAgY29uc3QgY2hhciAqZm47CisKKyAgaWYgKHN0cmxlbihhcmcpIDwgc3RybGVuKG9wdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZm4gPSBhcmcgKyBzdHJsZW4ob3B0aW9uKTsKKworICBpZiAoISgqZm4gPT0gJz0nIHx8ICpmbiA9PSAnICcgfHwgKmZuID09ICdcMCcpKQorICAgIHsKKyAgICAgIHVzYWdlIChOVUxMLCAxKTsKKyAgICB9CisgIAorICBpZiAoKmZuID09ICc9JykKKyAgICArK2ZuOworICAKKyAgd2hpbGUgKCpmbiA9PSAnICcgJiYgKmZuICE9ICdcMCcpCisgICAgKytmbjsKKyAgCisgIGlmICgqZm4gIT0gJ1wwJykKKyAgICB7CisgICAgICAqdmFsdWVfcCA9IGZuOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGRidXNfYm9vbF90IGVuc3VyZV91dWlkOworICBkYnVzX2Jvb2xfdCBnZXRfdXVpZDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGVuc3VyZV91dWlkID0gRkFMU0U7CisgIGdldF91dWlkID0gRkFMU0U7CisgIAorICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RybmNtcCAoYXJnLCAiLS1lbnN1cmUiLCBzdHJsZW4oIi0tZW5zdXJlIikpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBnZXRfYXJnIChhcmcsICItLWVuc3VyZSIsICZmaWxlbmFtZSk7CisgICAgICAgICAgZW5zdXJlX3V1aWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItLWdldCIsIHN0cmxlbigiLS1nZXQiKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGdldF9hcmcgKGFyZywgIi0tZ2V0IiwgJmZpbGVuYW1lKTsKKyAgICAgICAgICBnZXRfdXVpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1oZWxwIikgPT0gMCkKKwl1c2FnZSAoYXJndlswXSwgMCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tdmVyc2lvbiIpID09IDApCisgICAgICAgIHZlcnNpb24gKCk7CisgICAgICBlbHNlCisgICAgICAgIHVzYWdlIChhcmd2WzBdLCAxKTsKKyAgICB9CisKKyAgaWYgKGdldF91dWlkICYmIGVuc3VyZV91dWlkKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IHNwZWNpZnkgYm90aCAtLWdldCBhbmQgLS1lbnN1cmVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmIChnZXRfdXVpZCB8fCBlbnN1cmVfdXVpZCkKKyAgICB7CisgICAgICBjaGFyICp1dWlkOworICAgICAgaWYgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAoZmlsZW5hbWUsICZ1dWlkLCBlbnN1cmVfdXVpZCwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChnZXRfdXVpZCkgLyogcHJpbnQgbm90aGluZyBvbiAtLWVuc3VyZSAqLworICAgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHV1aWQpOworICAgICAgICAgIGRidXNfZnJlZSAodXVpZCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICp1dWlkOworCisgICAgICBpZiAoX2RidXNfY3JlYXRlX3V1aWQgKCZ1dWlkLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHV1aWQpOworICAgICAgICAgIGRidXNfZnJlZSAodXVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4aXQgKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xjb3YuYW0gYi90b29scy9sY292LmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzQ4NjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sY292LmFtCkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IMKpIDIwMDgtMjAxMSBDb2xsYWJvcmEgTHRkLgorIyBDb3B5cmlnaHQgwqkgMjAwOC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisjIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisjIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisjIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisjIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitsY292LXJlc2V0OgorCWxjb3YgLS1kaXJlY3RvcnkgQGFic190b3BfYnVpbGRkaXJAIC0temVyb2NvdW50ZXJzCisKK2xjb3YtcmVwb3J0OgorCWxjb3YgLS1kaXJlY3RvcnkgQGFic190b3BfYnVpbGRkaXJAIC0tY2FwdHVyZSBcCisJCS0tb3V0cHV0LWZpbGUgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaW5mbworCSQobWtkaXJfcCkgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbAorCWdpdF9jb21taXQ9YEdJVF9ESVI9QGFic190b3Bfc3JjZGlyQC8uZ2l0IGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVoIDI+L2Rldi9udWxsYDtcCisJZ2VuaHRtbCAtLXRpdGxlICJAUEFDS0FHRV9TVFJJTkdAICQkZ2l0X2NvbW1pdCIgXAorCQktLW91dHB1dC1kaXJlY3RvcnkgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbCBsY292LmluZm8KKwlAZWNobworCUBlY2hvICdsY292IHJlcG9ydCBjYW4gYmUgZm91bmQgaW46JworCUBlY2hvICdmaWxlOi8vQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbC9pbmRleC5odG1sJworCUBlY2hvCisKK2xjb3YtY2hlY2s6CisJJChNQUtFKSBsY292LXJlc2V0CisJJChNQUtFKSBjaGVjayAkKExDT1ZfQ0hFQ0tfQVJHUykKKwkkKE1BS0UpIGxjb3YtcmVwb3J0CisKKyMjIHZpbTpzZXQgZnQ9YXV0b21ha2U6CmRpZmYgLS1naXQgYS90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggYi90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhZThmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaApAQCAtMCwwICsxLDYyIEBACisjISAvYmluL3NoCisKK1NDUklQVE5BTUU9IiQwIgorV1JBUFBFRF9TQ1JJUFQ9IiQxIgorc2hpZnQKKworQ09ORklHX0ZJTEU9Li90bXAtc2Vzc2lvbi1idXMuJCQuY29uZgorCitkaWUgKCkKK3sKKyAgICBlY2hvICIkU0NSSVBUTkFNRTogJCoiID4mMgorICAgIHJtIC1mICIkQ09ORklHX0ZJTEUiCisgICAgZXhpdCAxCit9CisKK2lmIHRlc3QgLXogIiREQlVTX1RPUF9CVUlMRERJUiIgOyB0aGVuCisgICAgZGllICJNdXN0IHNldCBEQlVTX1RPUF9CVUlMRERJUiIKK2ZpCisKK1NFUlZJQ0VfRElSPSIkREJVU19UT1BfQlVJTERESVIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMiCitFU0NBUEVEX1NFUlZJQ0VfRElSPWBlY2hvICRTRVJWSUNFX0RJUiB8IHNlZCAtZSAncy9cLy9cXFxcXFwvL2cnYAorZWNobyAiZXNjYXBlZCBzZXJ2aWNlIGRpciBpczogJEVTQ0FQRURfU0VSVklDRV9ESVIiID4mMgorCitpZiB0ZXN0IC16ICIkU09VUkNFX0NPTkZJR19GSUxFIjsgdGhlbgorICAgIFNPVVJDRV9DT05GSUdfRklMRT0iJERCVVNfVE9QX0JVSUxERElSL2J1cy9zZXNzaW9uLmNvbmYiOworZmkKKyMjIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgc2Vzc2lvbi5jb25mCitjYXQgJFNPVVJDRV9DT05GSUdfRklMRSB8ICBcCisgICAgc2VkIC1lICdzLzxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLiokLzxzZXJ2aWNlZGlyPickRVNDQVBFRF9TRVJWSUNFX0RJUic8XC9zZXJ2aWNlZGlyPi9nJyB8ICBcCisgICAgc2VkIC1lICdzLzxpbmNsdWRlLiokLy9nJyAgICAgICAgICAgICAgICBcCisgID4gJENPTkZJR19GSUxFCisKK2VjaG8gIkNyZWF0ZWQgY29uZmlndXJhdGlvbiBmaWxlICRDT05GSUdfRklMRSIgPiYyCisKK2lmICEgdGVzdCAtZSAiJERCVVNfVE9QX0JVSUxERElSIi9idXMvZGJ1cy1kYWVtb24gOyB0aGVuCisgICAgZGllICIkREJVU19UT1BfQlVJTERESVIvYnVzL2RidXMtZGFlbW9uIGRvZXMgbm90IGV4aXN0IgorZmkKKworUEFUSD0iJERCVVNfVE9QX0JVSUxERElSIi9idXM6JFBBVEgKK2V4cG9ydCBQQVRICisKKyMjIHRoZSBsaWJ0b29sIHNjcmlwdCBmb3VuZCBieSB0aGUgcGF0aCBzZWFyY2ggc2hvdWxkIGFscmVhZHkgZG8gdGhpcywgYnV0CitMRF9MSUJSQVJZX1BBVEg9JERCVVNfVE9QX0JVSUxERElSL2RidXMvLmxpYnM6JExEX0xJQlJBUllfUEFUSAorZXhwb3J0IExEX0xJQlJBUllfUEFUSAordW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorCisjIHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgYWZmZWN0IGRidXMtcnVuLXNlc3Npb24gYW55IG1vcmUsIGJ1dCBjb3VsZCBiZQorIyBzaWduaWZpY2FudCBmb3IgZGJ1cy1sYXVuY2ggYXMgdXNlZCBieSB0aGUgYXV0b2xhdW5jaCB0ZXN0CitEQlVTX1VTRV9URVNUX0JJTkFSWT0xCitleHBvcnQgREJVU19VU0VfVEVTVF9CSU5BUlkKKworJERCVVNfVE9QX0JVSUxERElSL3Rvb2xzL2RidXMtcnVuLXNlc3Npb24gXAorICAgIC0tY29uZmlnLWZpbGU9IiRDT05GSUdfRklMRSIgXAorICAgIC0tZGJ1cy1kYWVtb249IiREQlVTX1RPUF9CVUlMRERJUi9idXMvZGJ1cy1kYWVtb24iIFwKKyAgICAtLSBcCisgICAgIiRXUkFQUEVEX1NDUklQVCIgIiRAIgorZXJyb3I9JD8KKworIyBjbGVhbiB1cAorcm0gLWYgIiRDT05GSUdfRklMRSIKK2V4aXQgJGVycm9yCmRpZmYgLS1naXQgYS90b29scy9zdHJ0b2xsLmMgYi90b29scy9zdHJ0b2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MGM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cnRvbGwuYwpAQCAtMCwwICsxLDE2NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIGlzc3BhY2UKKyNkZWZpbmUgaXNzcGFjZShjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1xyJyB8fCAoYykgPT0gJ1xuJykKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworI2lmbmRlZiBMTE9OR19NQVgKKyMgICBkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2VuZGlmCisKKyNpZm5kZWYgTExPTkdfTUlOCisjICAgZGVmaW5lIExMT05HX01JTgkoLUxMT05HX01BWCAtIDFMTCkKKyNlbmRpZgorLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjaWZuZGVmIFVMTE9OR19NQVgKKyMgICBkZWZpbmUgVUxMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTAorI2VuZGlmCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgbG9uZyBpbnRlZ2VyLgorICoKKyAqIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKKyAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCisgKi8KK2xvbmcgbG9uZyBzdHJ0b2xsIChjb25zdCBjaGFyKiwgY2hhciAqKiwgaW50KTsKKworbG9uZyBsb25nCitzdHJ0b2xsKGNvbnN0IGNoYXIgKiBucHRyLCBjaGFyICoqIGVuZHB0ciwgaW50IGJhc2UpCit7CisJY29uc3QgY2hhciAqczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWNjOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3V0b2ZmOworCWludCBuZWcsIGFueSwgY3V0bGltOworCisJLyoKKwkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgorCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKKwkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KKwkgKi8KKwlzID0gbnB0cjsKKwlkbyB7CisJCWMgPSAqcysrOworCX0gd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpYykpOworCWlmIChjID09ICctJykgeworCQluZWcgPSAxOworCQljID0gKnMrKzsKKwl9IGVsc2UgeworCQluZWcgPSAwOworCQlpZiAoYyA9PSAnKycpCisJCQljID0gKnMrKzsKKwl9CisJaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKKwkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpICYmCisJICAgICgoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpIHx8CisJICAgIChzWzFdID49ICdBJyAmJiBzWzFdIDw9ICdGJykgfHwKKwkgICAgKHNbMV0gPj0gJ2EnICYmIHNbMV0gPD0gJ2YnKSkpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisJYWNjID0gYW55ID0gMDsKKwlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQorCQlnb3RvIG5vY29udjsKKworCS8qCisJICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAorCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQorCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKKwkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0CisJICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKKwkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAorCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIHF1YWRzIGlzCisJICogWy05MjIzMzcyMDM2ODU0Nzc1ODA4Li45MjIzMzcyMDM2ODU0Nzc1ODA3XSBhbmQgdGhlIGlucHV0IGJhc2UKKwkgKiBpcyAxMCwgY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDkyMjMzNzIwMzY4NTQ3NzU4MCBhbmQgY3V0bGltIHRvCisJICogZWl0aGVyIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUKKwkgKiBhY2N1bXVsYXRlZCBhIHZhbHVlID4gOTIyMzM3MjAzNjg1NDc3NTgwLCBvciBlcXVhbCBidXQgdGhlCisJICogbmV4dCBkaWdpdCBpcyA+IDcgKG9yIDgpLCB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsCisJICogcmV0dXJuIGEgcmFuZ2UgZXJyb3IuCisJICoKKwkgKiBTZXQgJ2FueScgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCisJICogb3ZlcmZsb3cuCisJICovCisJY3V0b2ZmID0gbmVnID8gKHVuc2lnbmVkIGxvbmcgbG9uZyktKExMT05HX01JTiArIExMT05HX01BWCkgKyBMTE9OR19NQVgKKwkgICAgOiBMTE9OR19NQVg7CisJY3V0bGltID0gY3V0b2ZmICUgYmFzZTsKKwljdXRvZmYgLz0gYmFzZTsKKwlmb3IgKCA7IDsgYyA9ICpzKyspIHsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyAtPSAnQScgLSAxMDsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCQljIC09ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgKGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkpCisJCQlhbnkgPSAtMTsKKwkJZWxzZSB7CisJCQlhbnkgPSAxOworCQkJYWNjICo9IGJhc2U7CisJCQlhY2MgKz0gYzsKKwkJfQorCX0KKwlpZiAoYW55IDwgMCkgeworCQlhY2MgPSBuZWcgPyBMTE9OR19NSU4gOiBMTE9OR19NQVg7CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0FSSVRITUVUSUNfT1ZFUkZMT1cpOworI2Vsc2UKKwkJZXJybm8gPSBFUkFOR0U7CisjZW5kaWYKKwl9IGVsc2UgaWYgKCFhbnkpIHsKK25vY29udjoKKyNpZmRlZiBEQlVTX1dJTkNFCisJCVNldExhc3RFcnJvciAoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworI2Vsc2UKKwkJZXJybm8gPSBFSU5WQUw7CisjZW5kaWYKKwl9IGVsc2UgaWYgKG5lZykKKwkJYWNjID0gLWFjYzsKKwlpZiAoZW5kcHRyICE9IE5VTEwpCisJCSplbmRwdHIgPSAoY2hhciAqKShhbnkgPyBzIC0gMSA6IG5wdHIpOworCXJldHVybiAoYWNjKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RydG91bGwuYyBiL3Rvb2xzL3N0cnRvdWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1OTU1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cnRvdWxsLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBpc3NwYWNlCisjZGVmaW5lIGlzc3BhY2UoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcgfHwgKGMpID09ICdccicgfHwgKGMpID09ICdcbicpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyNpZm5kZWYgTExPTkdfTUFYCisjICAgZGVmaW5lIExMT05HX01BWAk5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01JTgorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisjZW5kaWYKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworI2lmbmRlZiBVTExPTkdfTUFYCisjICAgZGVmaW5lIFVMTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKyNlbmRpZgorCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nIGxvbmcgaW50ZWdlci4KKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc3RydG91bGwgKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKwordW5zaWduZWQgbG9uZyBsb25nCitzdHJ0b3VsbChjb25zdCBjaGFyICogbnB0ciwgY2hhciAqKiBlbmRwdHIsIGludCBiYXNlKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1dG9mZjsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2VlIHN0cnRvcSBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKnMrKzsKKwl9IHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWMpKTsKKwlpZiAoYyA9PSAnLScpIHsKKwkJbmVnID0gMTsKKwkJYyA9ICpzKys7CisJfSBlbHNlIHsKKwkJbmVnID0gMDsKKwkJaWYgKGMgPT0gJysnKQorCQkJYyA9ICpzKys7CisJfQorCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCisJICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSAmJgorCSAgICAoKHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKSB8fAorCSAgICAoc1sxXSA+PSAnQScgJiYgc1sxXSA8PSAnRicpIHx8CisJICAgIChzWzFdID49ICdhJyAmJiBzWzFdIDw9ICdmJykpKSB7CisJCWMgPSBzWzFdOworCQlzICs9IDI7CisJCWJhc2UgPSAxNjsKKwl9CisJaWYgKGJhc2UgPT0gMCkKKwkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOworCWFjYyA9IGFueSA9IDA7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJZ290byBub2NvbnY7CisKKwljdXRvZmYgPSBVTExPTkdfTUFYIC8gYmFzZTsKKwljdXRsaW0gPSBVTExPTkdfTUFYICUgYmFzZTsKKwlmb3IgKCA7IDsgYyA9ICpzKyspIHsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyAtPSAnQScgLSAxMDsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCQljIC09ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgKGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkpCisJCQlhbnkgPSAtMTsKKwkJZWxzZSB7CisJCQlhbnkgPSAxOworCQkJYWNjICo9IGJhc2U7CisJCQlhY2MgKz0gYzsKKwkJfQorCX0KKwlpZiAoYW55IDwgMCkgeworCQlhY2MgPSBVTExPTkdfTUFYOworI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XKTsKKyNlbHNlCisJCWVycm5vID0gRVJBTkdFOworI2VuZGlmCisJfSBlbHNlIGlmICghYW55KSB7Citub2NvbnY6CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyNlbHNlCisJCWVycm5vID0gRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIGlmIChuZWcpCisJCWFjYyA9IC1hY2M7CisJaWYgKGVuZHB0ciAhPSBOVUxMKQorCQkqZW5kcHRyID0gKGNoYXIgKikoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0LXRvb2wuYyBiL3Rvb2xzL3Rlc3QtdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWMxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0LXRvb2wuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC10b29sIC0gRC1CdXMgc3dpc3MgYXJteSBrbmlmZQorICoKKyAqIENvcHlyaWdodCDCqSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC10b29sLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50ICgqY2FsbGJhY2spIChpbnQsIGNoYXIgKiopOworfSBzdWJjb21tYW5kc1tdID0geworICAgICAgeyAiYmxhY2staG9sZSIsIGRidXNfdGVzdF90b29sX2JsYWNrX2hvbGUgfSwKKyAgICAgIHsgImVjaG8iLCAgICAgICBkYnVzX3Rlc3RfdG9vbF9lY2hvIH0sCisgICAgICB7ICJzcGFtIiwgICAgICAgZGJ1c190ZXN0X3Rvb2xfc3BhbSB9LAorICAgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIHVzYWdlIChpbnQgZXhpdF93aXRoKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBleGl0X3dpdGgpCit7CisgIGludCBpOworCisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgIlVzYWdlOiBkYnVzLXRlc3QtdG9vbCBTVUJDT01NQU5EIFtPUFRJT05TXVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICJLbm93biBTVUJDT01NQU5EcyBhcmU6XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgKTsKKworICBmb3IgKGkgPSAwOyBzdWJjb21tYW5kc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItICVzXG4iLCBzdWJjb21tYW5kc1tpXS5uYW1lKTsKKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICJGb3IgbW9yZSBpbmZvcm1hdGlvbjogZGJ1cy10ZXN0LXRvb2wgU1VCQ09NTUFORCAtLWhlbHBcbiIKKyAgICAgICAgICAgKTsKKworICBleGl0IChleGl0X3dpdGgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgIHVzYWdlICgyKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgc3ViY29tbWFuZHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKCFzdHJjbXAgKGFyZ3ZbMV0sIHN1YmNvbW1hbmRzW2ldLm5hbWUpKQorICAgICAgICByZXR1cm4gc3ViY29tbWFuZHNbaV0uY2FsbGJhY2sgKGFyZ2MsIGFyZ3YpOworICAgIH0KKworICB1c2FnZSAoMik7CisgIHJldHVybiAyOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdC10b29sLmggYi90b29scy90ZXN0LXRvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQzY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdC10b29sLmgKQEAgLTAsMCArMSwzMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QtdG9vbCAtIEQtQnVzIHN3aXNzIGFybXkga25pZmUKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1RFU1RfVE9PTF9ICisjZGVmaW5lIERCVVNfVEVTVF9UT09MX0gKKworaW50IGRidXNfdGVzdF90b29sX2JsYWNrX2hvbGUgKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZGJ1c190ZXN0X3Rvb2xfZWNobyAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkYnVzX3Rlc3RfdG9vbF9zcGFtIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2wtY29tbW9uLmMgYi90b29scy90b29sLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDIwMzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sLWNvbW1vbi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdG9vbC1jb21tb24gLSBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgZGJ1cy10ZXN0LXRvb2wgbW9kdWxlcworICoKKyAqIENvcHlyaWdodCDCqSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidG9vbC1jb21tb24uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCit2b2lkCit0b29sX29vbSAoY29uc3QgY2hhciAqZG9pbmcpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIk9PTSB3aGlsZSAlc1xuIiwgZG9pbmcpOworICBleGl0ICgxKTsKK30KKworI2lmZGVmIERCVVNfV0lOCit0eXBlZGVmIGludCBXcml0ZVJlc3VsdDsKKyNkZWZpbmUgd3JpdGUoZmQsIGJ1ZiwgbGVuKSBfd3JpdGUoZmQsIGJ1ZiwgbGVuKQorI2Vsc2UKK3R5cGVkZWYgc3NpemVfdCBXcml0ZVJlc3VsdDsKKyNlbmRpZgorCitkYnVzX2Jvb2xfdAordG9vbF93cml0ZV9hbGwgKGludCBmZCwKKyAgICBjb25zdCB2b2lkICpidWYsCisgICAgc2l6ZV90IHNpemUpCit7CisgIGNvbnN0IGNoYXIgKnAgPSBidWY7CisgIHNpemVfdCBieXRlc193cml0dGVuID0gMDsKKworICB3aGlsZSAoc2l6ZSA+IGJ5dGVzX3dyaXR0ZW4pCisgICAgeworICAgICAgV3JpdGVSZXN1bHQgcmVzID0gd3JpdGUgKGZkLCBwLCBzaXplIC0gYnl0ZXNfd3JpdHRlbik7CisKKyAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3QgdGhpc190aW1lID0gKHNpemVfdCkgcmVzOworICAgICAgICAgIHAgKz0gdGhpc190aW1lOworICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gdGhpc190aW1lOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdG9vbC1jb21tb24uaCBiL3Rvb2xzL3Rvb2wtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzOTdmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2wtY29tbW9uLmgKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0b29sLWNvbW1vbiAtIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBkYnVzLXRlc3QtdG9vbCBtb2R1bGVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19UT09MX0NPTU1PTl9ICisjZGVmaW5lIERCVVNfVE9PTF9DT01NT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpZiAwCisjZGVmaW5lIFZFUkJPU0UgZnByaW50ZgorI2Vsc2UKKyNkZWZpbmUgVkVSQk9TRSguLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKK3ZvaWQgdG9vbF9vb20gKGNvbnN0IGNoYXIgKmRvaW5nKSBfREJVU19HTlVDX05PUkVUVVJOOworZGJ1c19ib29sX3QgdG9vbF93cml0ZV9hbGwgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKKyNlbmRpZgo=