ZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjczY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gYXBwLWxpbnV4LmMgZGVtby5jLmFybQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJHTEVTX0NNIGxpYnVpCitMT0NBTF9NT0RVTEU6PSBhbmdlbGVzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVM6PSBncHVzdGF0ZS5jCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkdMRVNfQ00KK0xPQ0FMX01PRFVMRTo9IGdwdXN0YXRlCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiOGE0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSw3NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorU2VlIGZpbGUgbGljZW5zZS50eHQgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi4NCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGlzIGlzIGFuIE9wZW5HTCBFUyBwb3J0IG9mIHRoZSBzbWFsbCBzZWxmLXJ1bm5pbmcgZGVtb25zdHJhdGlvbg0KK2NhbGxlZCAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iLCB3aGljaCB3YXMgZmlyc3QgcHJlc2VudGVkIGluIHRoZQ0KK0Fzc2VtYmx5JzIwMDQgZXZlbnQuIEl0IHdvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIDQgS0IgaW50cm8NCitjb21wZXRpdGlvbiBjYXRlZ29yeS4NCisNCitUaGUgZGVtb25zdHJhdGlvbiBmZWF0dXJlcyBhIHNpZ2h0c2VlaW5nIG9mIGEgZnV0dXJpc3RpYyBjaXR5DQoraGF2aW5nIG1hbnkgZGlmZmVyZW50IGtpbmQgb2YgYnVpbGRpbmdzIGFuZCBpdGVtcy4gRXZlcnl0aGluZyBpcw0KK2ZsYXQgc2hhZGVkIHdpdGggdGhyZWUgZGlmZmVyZW50IGxpZ2h0cy4NCisNCitUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgbWFkZSBmb3IgZGVza3RvcCB3aXRoIE9wZW5HTC4gSXQgd2FzDQorbmF0dXJhbGx5IGhlYXZpbHkgc2l6ZSBvcHRpbWl6ZWQgaW4gb3JkZXIgdG8gZml0IGl0IGluIHRoZSBzaXplDQorbGltaXQuIEZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgbXVjaCBvZiB0aGUgY29kZSBpcw0KK2NsZWFuZWQgdXAgYW5kIHRoZSBzb3VuZCBpcyByZW1vdmVkLiBBbHNvIGRldGFpbCBsZXZlbCBpcyBsb3dlcmVkLA0KK2FsdGhvdWdoIGl0IHN0aWxsIGNvbnRhaW5zIG92ZXIgNjAwMDAgZmFjZXMuDQorDQorVGhlIFdpbjMyICgyMDAwL1hQKSBiaW5hcnkgcGFja2FnZSBvZiBvcmlnaW5hbCB2ZXJzaW9uIGlzDQorYXZhaWxhYmxlIGZyb20gdGhpcyBhZGRyZXNzOiBodHRwOi8vamV0LnJvL2ZpbGVzL2FuZ2VsZXMuemlwDQorDQorRmlyc3QgdmVyc2lvbiBvZiB0aGlzIE9wZW5HTCBFUyBwb3J0IHdhcyBzdWJtaXR0ZWQgdG8gdGhlIEtocm9ub3MNCitPcGVuR0wgRVMgQ29kaW5nIENoYWxsZW5nZSBoZWxkIGluIDIwMDQtMjAwNS4NCisNCitBcyBhIGNvZGUgZXhhbXBsZSwgdGhpcyBzb3VyY2Ugc2hvd3MgdGhlIGZvbGxvd2luZzoNCisgICogSG93IHRvIGNyZWF0ZSBhIG1pbmltYWwgYW5kIHBvcnRhYmxlIGFkIGhvYyBmcmFtZXdvcmsNCisgICAgZm9yIHNtYWxsIHRlc3RpbmcvZGVtb25zdHJhdGlvbiBwcm9ncmFtcy4gVGhpcyBmcmFtZXdvcmsNCisgICAgY29tcGlsZXMgZm9yIGJvdGggZGVza3RvcCBhbmQgUG9ja2V0UEMgV2luMzIgZW52aXJvbm1lbnQsDQorICAgIGFuZCBhIHNlcGFyYXRlIHNvdXJjZSBpcyBpbmNsdWRlZCBmb3IgTGludXggd2l0aCBYMTEuDQorICAqIEhvdyB0byBkeW5hbWljYWxseSBmaW5kIGFuZCB1c2UgdGhlIE9wZW5HTCBFUyBETEwgb3INCisgICAgc2hhcmVkIG9iamVjdCwgc28gdGhhdCB0aGUgbGlicmFyeSBpcyBub3QgbmVlZGVkIGF0DQorICAgIHRoZSBjb21waWxlL2xpbmsgc3RhZ2UuDQorICAqIEhvdyB0byB1c2UgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIE9wZW5HTCBFUyAxLjAvMS4xDQorICAgIENvbW1vbiBMaXRlLCBzdWNoIGFzIHZlcnRleCBhcnJheXMsIGNvbG9yIGFycmF5cyBhbmQNCisgICAgbGlnaHRpbmcuDQorICAqIEhvdyB0byBjcmVhdGUgYSBzZWxmIGNvbnRhaW5lZCBzbWFsbCBkZW1vbnN0cmF0aW9uDQorICAgIGFwcGxpY2F0aW9uIHdpdGggb2JqZWN0cyBnZW5lcmF0ZWQgdXNpbmcgcHJvY2VkdXJhbA0KKyAgICBhbGdvcml0aG1zLg0KKw0KK0FzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBvcHRpbWl6ZWQgZm9yIHNpemUgaW5zdGVhZCBvZg0KK3BlcmZvcm1hbmNlLCB0aGF0IGhvbGRzIHRydWUgZm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gYXMNCit3ZWxsLiBUaHVzIHRoZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBzaWduaWZpY2FudGx5IGluY3JlYXNlZCwNCitmb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgY29kZSB0byB1c2UgZ2xEcmF3RWxlbWVudHMNCitpbnN0ZWFkIG9mIGdsRHJhd0FycmF5cy4gVGhlIGNvZGUgdXNlcyBvbmx5IE9wZW5HTCBFUyAxLjANCitDb21tb24gTGl0ZSAtbGV2ZWwgZnVuY3Rpb24gY2FsbHMgd2l0aG91dCBhbnkgZXh0ZW5zaW9ucy4NCisNCitUaGUgcmVmZXJlbmNlIE9wZW5HTCBFUyBpbXBsZW1lbnRhdGlvbnMgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbjoNCisgICogSHlicmlkJ3MgT3BlbkdMIEVTIEFQSSBJbXBsZW1lbnRhdGlvbiAoR2VyYmVyYSkgdmVyc2lvbiAyLjAuNA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1HZXJiZXJhLmV4ZQ0KKyAgKiBQb3dlclZSIE1CWCBTREssIE9wZW5HTCBFUyBXaW5kb3dzIFBDIEVtdWxhdGlvbiB2ZXJzaW9uIDEuMDQuMTQuMDE3MA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1QVlJTREsuZXhlDQorDQorTm90ZSB0aGF0IERJU0FCTEVfSU1QT1JUR0wgcHJlcHJvY2Vzc29yIG1hY3JvIGNhbiBiZSB1c2VkDQordG8gc3BlY2lmeSBub3QgdG8gdXNlIGR5bmFtaWMgcnVudGltZSBiaW5kaW5nIG9mIHRoZSBsaWJyYXJ5Lg0KK1lvdSBhbHNvIG5lZWQgdG8gZGVmaW5lIHByZXByb2Nlc3NvciBtYWNybyBQVlJTREsgdG8gY29tcGlsZQ0KK3RoZSBzb3VyY2Ugd2l0aCBQb3dlclZSIE9wZW5HTCBFUyBTREsuDQorDQorVGhlIGRlbW8gYXBwbGljYXRpb24gaXMgYnJpZWZseSB0ZXN0ZWQgd2l0aCBhIGZldyBvdGhlciBPcGVuR0wgRVMNCitpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCAoZS5nLiBWaW5jZW50LCBHTEVTb25HTCBvbiBMaW51eCwgRGVsbA0KK0F4aW0gWDUwdikuIE1vc3Qgb2YgdGhlc2Ugb3RoZXIgaW1wbGVtZW50YXRpb25zIHJlbmRlcmVkIHRoZSBkZW1vDQorZXJyb25lb3VzbHkgaW4gc29tZSBhc3BlY3QuIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGRlbW8gc291cmNlDQorY291bGQgc3RpbGwgaGF2ZSBzb21lIHdvcmsgdG8gZG8gd2l0aCBjb21wYXRpYmlsaXR5IGFuZCBjb3JyZWN0DQorQVBJIHVzYWdlLCBhbHRob3VnaCB0aGUgbm9uLWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIGFyZSBtb3N0DQorcHJvYmFibHkgdW5maW5pc2hlZCBhcyB3ZWxsLg0KKw0KK1RoYW5rcyBhbmQgQWNrbm93bGVkZ2VtZW50czoNCisNCisqIFRvbmkgTPZubmJlcmcgKCFDdWJlKSBjcmVhdGVkIHRoZSBtdXNpYyBmb3Igb3JpZ2luYWwgdmVyc2lvbiwgd2hpY2gNCisgIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGlzIE9wZW5HTCBFUyBwb3J0Lg0KKyogU2FyYSBLYXBsaSAoc3QgUmFuYSkgZm9yIGFkZGl0aW9uYWwgY2FtZXJhIHdvcmsuDQorKiBQYXVsIEJvdXJrZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cGVyc2hhcGVzLg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOWViMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAtbGludXguYyx2IDEuNCAyMDA1LzAyLzA4IDE4OjQyOjQ4IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKgorICogUGFydHMgb2YgdGhpcyBzb3VyY2UgZmlsZSBpcyBiYXNlZCBvbiB0ZXN0L2V4YW1wbGUgY29kZSBmcm9tCisgKiBHTEVTb25HTCBpbXBsZW1lbnRhdGlvbiBieSBEYXZpZCBCbHl0aGUuIEhlcmUgaXMgY29weSBvZiB0aGUKKyAqIGxpY2Vuc2Ugbm90aWNlIGZyb20gdGhhdCBzb3VyY2U6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZCBCbHl0aGUgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogREFWSUQgQkxZVEhFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKworCitpbnQgZ0FwcEFsaXZlID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgc0FwcE5hbWVbXSA9CisgICAgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgKExpbnV4KSI7CisKK3N0YXRpYyBpbnQgc1dpbmRvd1dpZHRoID0gV0lORE9XX0RFRkFVTFRfV0lEVEg7CitzdGF0aWMgaW50IHNXaW5kb3dIZWlnaHQgPSBXSU5ET1dfREVGQVVMVF9IRUlHSFQ7CitzdGF0aWMgRUdMRGlzcGxheSBzRWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOworc3RhdGljIEVHTENvbnRleHQgc0VnbENvbnRleHQgPSBFR0xfTk9fQ09OVEVYVDsKK3N0YXRpYyBFR0xTdXJmYWNlIHNFZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisKK2NvbnN0IGNoYXIgKmVnbF9zdHJlcnJvcih1bnNpZ25lZCBlcnIpCit7CisgICAgc3dpdGNoKGVycil7CisgICAgY2FzZSBFR0xfU1VDQ0VTUzogcmV0dXJuICJTVUNDRVNTIjsKKyAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6IHJldHVybiAiTk9UIElOSVRJQUxJWkVEIjsKKyAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiByZXR1cm4gIkJBRCBBQ0NFU1MiOworICAgIGNhc2UgRUdMX0JBRF9BTExPQzogcmV0dXJuICJCQUQgQUxMT0MiOworICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6IHJldHVybiAiQkFEX0FUVFJJQlVURSI7CisgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogcmV0dXJuICJCQUQgQ09ORklHIjsKKyAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogcmV0dXJuICJCQUQgQ09OVEVYVCI7CisgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJCQUQgQ1VSUkVOVCBTVVJGQUNFIjsKKyAgICBjYXNlIEVHTF9CQURfRElTUExBWTogcmV0dXJuICJCQUQgRElTUExBWSI7CisgICAgY2FzZSBFR0xfQkFEX01BVENIOiByZXR1cm4gIkJBRCBNQVRDSCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6IHJldHVybiAiQkFEIE5BVElWRSBQSVhNQVAiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkJBRCBOQVRJVkUgV0lORE9XIjsKKyAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiByZXR1cm4gIkJBRCBQQVJBTUVURVIiOworICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiByZXR1cm4gIkJBRF9TVVJGQUNFIjsKKy8vICAgIGNhc2UgRUdMX0NPTlRFWFRfTE9TVDogcmV0dXJuICJDT05URVhUIExPU1QiOworICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorfQorCit2b2lkIGVnbF9lcnJvcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVuc2lnbmVkIGVyciA9IGVnbEdldEVycm9yKCk7CisgICAgaWYoZXJyICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlcygpOiBlZ2wgZXJyb3IgMHgleCAoJXMpXG4iLCAKKyAgICAgICAgICAgICAgICBuYW1lLCBlcnIsIGVnbF9zdHJlcnJvcihlcnIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQoreworICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tFR0xFcnJvcnMoKQoreworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgLy8gR0xFU29uR0wgc2VlbXMgdG8gYmUgcmV0dXJuaW5nIDAgd2hlbiB0aGVyZSBpcyBubyBlcnJvcnM/CisgICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworc3RhdGljIGludCBpbml0R3JhcGhpY3MoKQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAjaWYgMQorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgMCwKKyAjZWxzZQorICAgICAgICAgRUdMX0FMUEhBX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICBFR0xfRE9OVF9DQVJFLAorICNlbmRpZgorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgIGZwcmludGYoc3RkZXJyLCJkcHkgPSAweCUwOHhcbiIsICh1bnNpZ25lZCkgZHB5KTsKKyAgICAgCisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xJbml0aWFsaXplIik7CisKKyAgICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXRDb25maWdzIik7CisgICAgIGZwcmludGYoc3RkZXJyLCJudW0gY29uZmlncyAlZFxuIiwgbnVtQ29uZmlncyk7CisgICAgIAorICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xDaG9vc2VDb25maWciKTsKKworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbE1hcFdpbmRvd1N1cmZhY2UiKTsKKworICAgICBmcHJpbnRmKHN0ZGVyciwic3VyZmFjZSA9ICVwXG4iLCBzdXJmYWNlKTsKKworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbF9lcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiY29udGV4dCA9ICVwXG4iLCBjb250ZXh0KTsKKyAgICAgCisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbF9lcnJvcigiZWdsTWFrZUN1cnJlbnQiKTsKKworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZzV2luZG93V2lkdGgpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmc1dpbmRvd0hlaWdodCk7CisKKyAgICBzRWdsRGlzcGxheSA9IGRweTsKKyAgICBzRWdsU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgc0VnbENvbnRleHQgPSBjb250ZXh0OworCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCisKK3N0YXRpYyB2b2lkIGRlaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBlZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZWdsRGVzdHJveUNvbnRleHQoc0VnbERpc3BsYXksIHNFZ2xDb250ZXh0KTsKKyAgICBlZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgIGVnbFRlcm1pbmF0ZShzRWdsRGlzcGxheSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAvLyBub3QgcmVmZXJlbmNlZDoKKyAgICBhcmdjID0gYXJnYzsKKyAgICBhcmd2ID0gYXJndjsKKworICAgIGlmICghaW5pdEdyYXBoaWNzKCkpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdyYXBoaWNzIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGFwcEluaXQoKTsKKyAgICAKKyAgICB3aGlsZSAoZ0FwcEFsaXZlKQorICAgIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZU5vdzsKKworICAgICAgICBpZiAoZ0FwcEFsaXZlKQorICAgICAgICB7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWVOb3csIE5VTEwpOworICAgICAgICAgICAgYXBwUmVuZGVyKHRpbWVOb3cudHZfc2VjICogMTAwMCArIHRpbWVOb3cudHZfdXNlYyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrR0xFcnJvcnMoKTsKKyAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgICAgICAgICBjaGVja0VHTEVycm9ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgYXBwRGVpbml0KCk7CisgICAgZGVpbml0R3JhcGhpY3MoKTsKKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWJkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApAQCAtMCwwICsxLDU2IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAuaCx2IDEuMTQgMjAwNS8wMi8wNiAyMToxMzo1NCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjE0ICQKKyAqLworCisjaWZuZGVmIEFQUF9IX0lOQ0xVREVECisjZGVmaW5lIEFQUF9IX0lOQ0xVREVECisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfV0lEVEggICAgNjQwCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX0hFSUdIVCAgIDQ4MAorCisjZGVmaW5lIFdJTkRPV19CUFAgICAgICAgICAgICAgIDE2CisKKworLy8gVGhlIHNpbXBsZSBmcmFtZXdvcmsgZXhwZWN0cyB0aGUgYXBwbGljYXRpb24gY29kZSB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zLgorZXh0ZXJuIHZvaWQgYXBwSW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwRGVpbml0KCk7CitleHRlcm4gdm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKiBWYWx1ZSBpcyBub24temVybyB3aGVuIGFwcGxpY2F0aW9uIGlzIGFsaXZlLCBhbmQgMCB3aGVuIGl0IGlzIGNsb3NpbmcuCisgKiBEZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsuCisgKi8KK2V4dGVybiBpbnQgZ0FwcEFsaXZlOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8vICFBUFBfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWFjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogY2Ftcy5oLHYgMS43IDIwMDUvMDEvMzEgMjI6MTU6MTUgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqLworCisjaWZuZGVmIENBTVNfSF9JTkNMVURFRAorI2RlZmluZSBDQU1TX0hfSU5DTFVERUQKKworCisvKiBMZW5ndGggaW4gbWlsbGlzZWNvbmRzIG9mIG9uZSBjYW1lcmEgdHJhY2sgYmFzZSB1bml0LgorICogVGhlIHZhbHVlIG9yaWdpbmF0ZXMgZnJvbSB0aGUgbXVzaWMgc3luY2hyb25pemF0aW9uLgorICovCisjZGVmaW5lIENBTVRSQUNLX0xFTiAgICA1NDQyCisKKworLy8gQ2FtZXJhIHRyYWNrIGRlZmluaXRpb24gZm9yIG9uZSBjYW1lcmEgdHJ1Y2tpbmcgc2hvdC4KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogRml2ZSBwYXJhbWV0ZXJzIG9mIHNyY1s1XSBhbmQgZGVzdFs1XToKKyAgICAgKiBleWVYLCBleWVZLCBleWVaLCB2aWV3QW5nbGUsIHZpZXdIZWlnaHRPZmZzCisgICAgICovCisgICAgc2hvcnQgc3JjWzVdLCBkZXN0WzVdOworICAgIHVuc2lnbmVkIGNoYXIgZGlzdDsgICAgIC8vIGlmID4wLCBjYW0gcm90YXRlcyBhcm91bmQgZXllIHh5IG9uIGRpc3QgKiAwLjEKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsgICAgICAvLyBsZW5ndGggbXVsdGlwbGllcgorfSBDQU1UUkFDSzsKKworc3RhdGljIENBTVRSQUNLIHNDYW1UcmFja3NbXSA9Cit7CisgICAgeyB7IDQ1MDAsIDI3MDAsIDEwMCwgNzAsIC0zMCB9LCB7IDUwLCA1MCwgLTkwLCAtMTAwLCAwIH0sIDIwLCAxIH0sCisgICAgeyB7IC0xNDQ4LCA0Mjk0LCAyNSwgMzYzLCAwIH0sIHsgLTEzNiwgMjAyLCAxMjUsIC05OCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTQzNywgNDkzMCwgMjAwLCAtMjc1LCAtMjAgfSwgeyAxNjg0LCAwLCAwLCA5LCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTgwMCwgMzYwOSwgMjAwLCAwLCA2NzUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgMCwgMSB9LAorICAgIHsgeyA5MjMsIDk5NiwgNTAsIDIzMzYsIC04MCB9LCB7IDAsIC0yMCwgLTUwLCAwLCAxNzAgfSwgMCwgMSB9LAorICAgIHsgeyAtMTY2MywgLTQzLCA2MDAsIDIxNzAsIDAgfSwgeyAyMCwgMCwgLTYwMCwgMCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTA0OSwgLTE0MjAsIDE3NSwgMjExMSwgLTE3IH0sIHsgMCwgMCwgMCwgLTMzNCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDAsIDAsIDUwLCAzMDAsIDI1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDcwLCAyIH0sCisgICAgeyB7IC00NzMsIC05NTMsIDM1MDAsIC0zNTMsIC0zNTAgfSwgeyAwLCAwLCAtMjgwMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDE5MSwgMTkzOCwgMzUsIDExMzksIC0xNyB9LCB7IDEyMDUsIC0yOTA5LCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgLTE0NDksIC0yNzAwLCAxNTAsIDAsIDAgfSwgeyAwLCAyMDAwLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgNTI3MywgNDk5MiwgNjUwLCAzNzMsIC01MCB9LCB7IC00NTk4LCAtMzA3MiwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDMyMjMsIC0zMjgyLCAxMDc1LCAtMzkzLCAtMjUgfSwgeyAxNjQ5LCAtMTY0OSwgMCwgMCwgMCB9LCAwLCAyIH0KK307CisjZGVmaW5lIENBTVRSQUNLX0NPVU5UIChzaXplb2YoY2FtVHJhY2tzKSAvIHNpemVvZihjYW1UcmFja3NbMF0pKQorCisKKyNlbmRpZiAvLyAhQ0FNU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyZjM5OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpAQCAtMCwwICsxLDc5MiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogZGVtby5jLHYgMS4xMCAyMDA1LzAyLzA4IDIwOjU0OjM5IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTAgJAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgImFwcC5oIgorI2luY2x1ZGUgInNoYXBlcy5oIgorI2luY2x1ZGUgImNhbXMuaCIKKworCisvLyBUb3RhbCBydW4gbGVuZ3RoIGlzIDIwICogY2FtZXJhIHRyYWNrIGJhc2UgdW5pdCBsZW5ndGggKHNlZSBjYW1zLmgpLgorI2RlZmluZSBSVU5fTEVOR1RIICAoMjAgKiBDQU1UUkFDS19MRU4pCisjdW5kZWYgUEkKKyNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyZgorI2RlZmluZSBSQU5ET01fVUlOVF9NQVggNjU1MzUKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzUmFuZG9tU2VlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHNlZWRSYW5kb20odW5zaWduZWQgbG9uZyBzZWVkKQoreworICAgIHNSYW5kb21TZWVkID0gc2VlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9tVUludCgpCit7CisgICAgc1JhbmRvbVNlZWQgPSBzUmFuZG9tU2VlZCAqIDB4MzQzZmQgKyAweDI2OWVjMzsKKyAgICByZXR1cm4gc1JhbmRvbVNlZWQgPj4gMTY7Cit9CisKKworLy8gQ2FwcGVkIGNvbnZlcnNpb24gZnJvbSBmbG9hdCB0byBmaXhlZC4KK3N0YXRpYyBsb25nIGZsb2F0VG9GaXhlZChmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPCAtMzI3NjgpIHZhbHVlID0gLTMyNzY4OworICAgIGlmICh2YWx1ZSA+IDMyNzY3KSB2YWx1ZSA9IDMyNzY3OworICAgIHJldHVybiAobG9uZykodmFsdWUgKiA2NTUzNik7Cit9CisKKyNkZWZpbmUgRklYRUQodmFsdWUpIGZsb2F0VG9GaXhlZCh2YWx1ZSkKKworCisvLyBEZWZpbml0aW9uIG9mIG9uZSBHTCBvYmplY3QgaW4gdGhpcyBkZW1vLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIFZlcnRleCBhcnJheSBhbmQgY29sb3IgYXJyYXkgYXJlIGVuYWJsZWQgZm9yIGFsbCBvYmplY3RzLCBzbyB0aGVpcgorICAgICAqIHBvaW50ZXJzIG11c3QgYWx3YXlzIGJlIHZhbGlkIGFuZCBub24tTlVMTC4gTm9ybWFsIGFycmF5IGlzIG5vdAorICAgICAqIHVzZWQgYnkgdGhlIGdyb3VuZCBwbGFuZSwgc28gd2hlbiBpdHMgcG9pbnRlciBpcyBOVUxMIHRoZW4gbm9ybWFsCisgICAgICogYXJyYXkgdXNhZ2UgaXMgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBWZXJ0ZXggYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMAorICAgICAqIChpLmUuIHRpZ2h0bHkgcGFja2VkIGFycmF5KS4gQ29sb3IgYXJyYXkgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0CisgICAgICogY29tcG9uZW50cyBwZXIgY29sb3Igd2l0aCBHTF9VTlNJR05FRF9CWVRFIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKiBOb3JtYWwgYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKi8KKyAgICBHTGZpeGVkICp2ZXJ0ZXhBcnJheTsKKyAgICBHTHVieXRlICpjb2xvckFycmF5OworICAgIEdMZml4ZWQgKm5vcm1hbEFycmF5OworICAgIEdMaW50IHZlcnRleENvbXBvbmVudHM7CisgICAgR0xzaXplaSBjb3VudDsKK30gR0xPQkpFQ1Q7CisKKworc3RhdGljIGxvbmcgc1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzVGljayA9IDA7CisKK3N0YXRpYyBpbnQgc0N1cnJlbnRDYW1UcmFjayA9IDA7CitzdGF0aWMgbG9uZyBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gMDsKK3N0YXRpYyBsb25nIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSAweDdmZmZmZmZmOworCitzdGF0aWMgR0xPQkpFQ1QgKnNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UXSA9IHsgTlVMTCB9Oworc3RhdGljIEdMT0JKRUNUICpzR3JvdW5kUGxhbmUgPSBOVUxMOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCB4LCB5LCB6OworfSBWRUNUT1IzOworCisKK3N0YXRpYyB2b2lkIGZyZWVHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQoreworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGZyZWUob2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgZnJlZShvYmplY3QtPmNvbG9yQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT52ZXJ0ZXhBcnJheSk7CisgICAgZnJlZShvYmplY3QpOworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIG5ld0dMT2JqZWN0KGxvbmcgdmVydGljZXMsIGludCB2ZXJ0ZXhDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZU5vcm1hbEFycmF5KQoreworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgcmVzdWx0ID0gKEdMT0JKRUNUICopbWFsbG9jKHNpemVvZihHTE9CSkVDVCkpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0LT5jb3VudCA9IHZlcnRpY2VzOworICAgIHJlc3VsdC0+dmVydGV4Q29tcG9uZW50cyA9IHZlcnRleENvbXBvbmVudHM7CisgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogdmVydGV4Q29tcG9uZW50cyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgcmVzdWx0LT5jb2xvckFycmF5ID0gKEdMdWJ5dGUgKiltYWxsb2ModmVydGljZXMgKiA0ICogc2l6ZW9mKEdMdWJ5dGUpKTsKKyAgICBpZiAodXNlTm9ybWFsQXJyYXkpCisgICAgeworICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiAzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IE5VTEw7CisgICAgaWYgKHJlc3VsdC0+dmVydGV4QXJyYXkgPT0gTlVMTCB8fAorICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXkgPT0gTlVMTCB8fAorICAgICAgICAodXNlTm9ybWFsQXJyYXkgJiYgcmVzdWx0LT5ub3JtYWxBcnJheSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGZyZWVHTE9iamVjdChyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBhc3NlcnQob2JqZWN0ICE9IE5VTEwpOworCisgICAgZ2xWZXJ0ZXhQb2ludGVyKG9iamVjdC0+dmVydGV4Q29tcG9uZW50cywgR0xfRklYRUQsCisgICAgICAgICAgICAgICAgICAgIDAsIG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsIDAsIG9iamVjdC0+Y29sb3JBcnJheSk7CisKKyAgICAvLyBBbHJlYWR5IGRvbmUgaW4gaW5pdGlhbGl6YXRpb246CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIGlmIChvYmplY3QtPm5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZJWEVELCAwLCBvYmplY3QtPm5vcm1hbEFycmF5KTsKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgb2JqZWN0LT5jb3VudCk7Cit9CisKKworc3RhdGljIHZvaWQgdmVjdG9yM1N1YihWRUNUT1IzICpkZXN0LCBWRUNUT1IzICp2MSwgVkVDVE9SMyAqdjIpCit7CisgICAgZGVzdC0+eCA9IHYxLT54IC0gdjItPng7CisgICAgZGVzdC0+eSA9IHYxLT55IC0gdjItPnk7CisgICAgZGVzdC0+eiA9IHYxLT56IC0gdjItPno7Cit9CisKKworc3RhdGljIHZvaWQgc3VwZXJTaGFwZU1hcChWRUNUT1IzICpwb2ludCwgZmxvYXQgcjEsIGZsb2F0IHIyLCBmbG9hdCB0LCBmbG9hdCBwKQoreworICAgIC8vIHNwaGVyZS1tYXBwaW5nIG9mIHN1cGVyc2hhcGUgcGFyYW1ldGVycworICAgIHBvaW50LT54ID0gKGZsb2F0KShjb3ModCkgKiBjb3MocCkgLyByMSAvIHIyKTsKKyAgICBwb2ludC0+eSA9IChmbG9hdCkoc2luKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnogPSAoZmxvYXQpKHNpbihwKSAvIHIyKTsKK30KKworCitzdGF0aWMgZmxvYXQgc3NGdW5jKGNvbnN0IGZsb2F0IHQsIGNvbnN0IGZsb2F0ICpwKQoreworICAgIHJldHVybiAoZmxvYXQpKHBvdyhwb3coZmFicyhjb3MocFswXSAqIHQgLyA0KSkgLyBwWzFdLCBwWzRdKSArCisgICAgICAgICAgICAgICAgICAgICAgIHBvdyhmYWJzKHNpbihwWzBdICogdCAvIDQpKSAvIHBbMl0sIHBbNV0pLCAxIC8gcFszXSkpOworfQorCisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdXBlcnNoYXBlIG9iamVjdC4KKy8vIEJhc2VkIG9uIFBhdWwgQm91cmtlJ3MgUE9WLVJheSBpbXBsZW1lbnRhdGlvbi4KKy8vIGh0dHA6Ly9hc3Ryb25vbXkuc3dpbi5lZHUuYXUvfnBib3Vya2UvcG92cmF5L3N1cGVyc2hhcGUvCitzdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVTdXBlclNoYXBlKGNvbnN0IGZsb2F0ICpwYXJhbXMpCit7CisgICAgY29uc3QgaW50IHJlc29sMSA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gM107CisgICAgY29uc3QgaW50IHJlc29sMiA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gMl07CisgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yIGZvciBubyBtaXJyb3JlZCBib3R0b20KKyAgICAvLyAobGF0aXR1ZGVCZWdpbj09MCBmb3IgLXBpLzIgdG8gcGkvMiBvcmlnaW5hbGx5KQorICAgIGNvbnN0IGludCBsYXRpdHVkZUJlZ2luID0gcmVzb2wyIC8gNDsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVFbmQgPSByZXNvbDIgLyAyOyAgICAvLyBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IGxvbmdpdHVkZUNvdW50ID0gcmVzb2wxOworICAgIGNvbnN0IGludCBsYXRpdHVkZUNvdW50ID0gbGF0aXR1ZGVFbmQgLSBsYXRpdHVkZUJlZ2luOworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9IGxvbmdpdHVkZUNvdW50ICogbGF0aXR1ZGVDb3VudCAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgZmxvYXQgYmFzZUNvbG9yWzNdOworICAgIGludCBhLCBsb25naXR1ZGUsIGxhdGl0dWRlOworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMywgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgIGJhc2VDb2xvclthXSA9ICgocmFuZG9tVUludCgpICUgMTU1KSArIDEwMCkgLyAyNTUuZjsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIC8vIGxvbmdpdHVkZSAtcGkgdG8gcGkKKyAgICBmb3IgKGxvbmdpdHVkZSA9IDA7IGxvbmdpdHVkZSA8IGxvbmdpdHVkZUNvdW50OyArK2xvbmdpdHVkZSkKKyAgICB7CisKKyAgICAgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yCisgICAgICAgIGZvciAobGF0aXR1ZGUgPSBsYXRpdHVkZUJlZ2luOyBsYXRpdHVkZSA8IGxhdGl0dWRlRW5kOyArK2xhdGl0dWRlKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB0MSA9IC1QSSArIGxvbmdpdHVkZSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHQyID0gLVBJICsgKGxvbmdpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wxOworICAgICAgICAgICAgZmxvYXQgcDEgPSAtUEkgLyAyICsgbGF0aXR1ZGUgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCBwMiA9IC1QSSAvIDIgKyAobGF0aXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMjsKKyAgICAgICAgICAgIGZsb2F0IHIwLCByMSwgcjIsIHIzOworCisgICAgICAgICAgICByMCA9IHNzRnVuYyh0MSwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIxID0gc3NGdW5jKHAxLCAmcGFyYW1zWzZdKTsKKyAgICAgICAgICAgIHIyID0gc3NGdW5jKHQyLCBwYXJhbXMpOworICAgICAgICAgICAgcjMgPSBzc0Z1bmMocDIsICZwYXJhbXNbNl0pOworCisgICAgICAgICAgICBpZiAocjAgIT0gMCAmJiByMSAhPSAwICYmIHIyICE9IDAgJiYgcjMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHBhLCBwYiwgcGMsIHBkOworICAgICAgICAgICAgICAgIFZFQ1RPUjMgdjEsIHYyLCBuOworICAgICAgICAgICAgICAgIGZsb2F0IGNhOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIC8vZmxvYXQgbGVuU3EsIGludkxlblNxOworCisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGEsIHIwLCByMSwgdDEsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYiwgcjIsIHIxLCB0MiwgcDEpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBjLCByMiwgcjMsIHQyLCBwMik7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGQsIHIwLCByMywgdDEsIHAyKTsKKworICAgICAgICAgICAgICAgIC8vIGtsdWRnZSB0byBzZXQgbG93ZXIgZWRnZSBvZiB0aGUgb2JqZWN0IHRvIGZpeGVkIGxldmVsCisgICAgICAgICAgICAgICAgaWYgKGxhdGl0dWRlID09IGxhdGl0dWRlQmVnaW4gKyAxKQorICAgICAgICAgICAgICAgICAgICBwYS56ID0gcGIueiA9IDA7CisKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MSwgJnBiLCAmcGEpOworICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYyLCAmcGQsICZwYSk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbm9ybWFsIHdpdGggY3Jvc3MgcHJvZHVjdC4KKyAgICAgICAgICAgICAgICAvKiAgIGkgICAgaiAgICBrICAgICAgaSAgICBqCisgICAgICAgICAgICAgICAgICogdjEueCB2MS55IHYxLnogfCB2MS54IHYxLnkKKyAgICAgICAgICAgICAgICAgKiB2Mi54IHYyLnkgdjIueiB8IHYyLnggdjIueQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgbi54ID0gdjEueSAqIHYyLnogLSB2MS56ICogdjIueTsKKyAgICAgICAgICAgICAgICBuLnkgPSB2MS56ICogdjIueCAtIHYxLnggKiB2Mi56OworICAgICAgICAgICAgICAgIG4ueiA9IHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7CisKKyAgICAgICAgICAgICAgICAvKiBQcmUtbm9ybWFsaXphdGlvbiBvZiB0aGUgbm9ybWFscyBpcyBkaXNhYmxlZCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB0aGV5IHdpbGwgYmUgbm9ybWFsaXplZCBhbnl3YXkgbGF0ZXIgZHVlIHRvIGF1dG9tYXRpYworICAgICAgICAgICAgICAgICAqIG5vcm1hbGl6YXRpb24gKEdMX05PUk1BTElaRSkuIEl0IGlzIGVuYWJsZWQgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBvYmplY3RzIGFyZSBzY2FsZWQgd2l0aCBnbFNjYWxlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgbGVuU3EgPSBuLnggKiBuLnggKyBuLnkgKiBuLnkgKyBuLnogKiBuLno7CisgICAgICAgICAgICAgICAgaW52TGVuU3EgPSAoZmxvYXQpKDEgLyBzcXJ0KGxlblNxKSk7CisgICAgICAgICAgICAgICAgbi54ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgIG4ueSAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnogKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGNhID0gcGEueiArIDAuNWY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgKz0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaV0gPSBGSVhFRChuLngpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAxXSA9IEZJWEVEKG4ueSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDJdID0gRklYRUQobi56KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSwgY29sb3JbM107CisgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yW2FdID0gKGludCkoY2EgKiBiYXNlQ29sb3JbYV0gKiAyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yW2FdID4gMjU1KSBjb2xvclthXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSAoR0x1Ynl0ZSljb2xvclswXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IChHTHVieXRlKWNvbG9yWzFdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gKEdMdWJ5dGUpY29sb3JbMl07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBhLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBhLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBhLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBjLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBjLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBjLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0gLy8gcjAgJiYgcjEgJiYgcjIgJiYgcjMKKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0gLy8gbGF0aXR1ZGUKKyAgICB9IC8vIGxvbmdpdHVkZQorCisgICAgLy8gU2V0IG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBvYmplY3QgdG8gdGhlIGFjdHVhbCBhbW91bnQgY3JlYXRlZC4KKyAgICByZXN1bHQtPmNvdW50ID0gY3VycmVudFZlcnRleDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlR3JvdW5kUGxhbmUoKQoreworICAgIGNvbnN0IGludCBzY2FsZSA9IDQ7CisgICAgY29uc3QgaW50IHlCZWdpbiA9IC0xNSwgeUVuZCA9IDE1OyAgICAvLyBlbmRzIGFyZSBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IHhCZWdpbiA9IC0xNSwgeEVuZCA9IDE1OworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9ICh5RW5kIC0geUJlZ2luKSAqICh4RW5kIC0geEJlZ2luKSAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgaW50IHgsIHk7CisgICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKKworICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAyLCAwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY3VycmVudFF1YWQgPSAwOworICAgIGN1cnJlbnRWZXJ0ZXggPSAwOworCisgICAgZm9yICh5ID0geUJlZ2luOyB5IDwgeUVuZDsgKyt5KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0geEJlZ2luOyB4IDwgeEVuZDsgKyt4KQorICAgICAgICB7CisgICAgICAgICAgICBHTHVieXRlIGNvbG9yOworICAgICAgICAgICAgaW50IGksIGE7CisgICAgICAgICAgICBjb2xvciA9IChHTHVieXRlKSgocmFuZG9tVUludCgpICYgMHg1ZikgKyA4MSk7ICAvLyAxMDEgMTExMQorICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7IGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsgaSArPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEF4aXMgYml0cyBmb3IgcXVhZCB0cmlhbmdsZXM6CisgICAgICAgICAgICAvLyB4OiAwMTExMDAgKDB4MWMpLCB5OiAxMTAwMDEgKDB4MzEpICAoY2xvY2t3aXNlKQorICAgICAgICAgICAgLy8geDogMDAxMTEwICgweDBlKSwgeTogMTAwMDExICgweDIzKSAgKGNvdW50ZXItY2xvY2t3aXNlKQorICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDY7ICsrYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeG0gPSB4ICsgKCgweDFjID4+IGEpICYgMSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHltID0geSArICgoMHgzMSA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG0gPSAoZmxvYXQpKGNvcyh4bSAqIDIpICogc2luKHltICogNCkgKiAwLjc1Zik7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMl0gPQorICAgICAgICAgICAgICAgICAgICBGSVhFRCh4bSAqIHNjYWxlICsgbSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeW0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R3JvdW5kUGxhbmUoKQoreworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKKyAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgZHJhd0dMT2JqZWN0KHNHcm91bmRQbGFuZSk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3RmFkZVF1YWQoKQoreworICAgIHN0YXRpYyBjb25zdCBHTGZpeGVkIHF1YWRWZXJ0aWNlc1tdID0geworICAgICAgICAtMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwCisgICAgfTsKKworICAgIGNvbnN0IGludCBiZWdpbkZhZGUgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgY29uc3QgaW50IGVuZEZhZGUgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrIC0gc1RpY2s7CisgICAgY29uc3QgaW50IG1pbkZhZGUgPSBiZWdpbkZhZGUgPCBlbmRGYWRlID8gYmVnaW5GYWRlIDogZW5kRmFkZTsKKworICAgIGlmIChtaW5GYWRlIDwgMTAyNCkKKyAgICB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFkZUNvbG9yID0gbWluRmFkZSA8PCA2OworICAgICAgICBnbENvbG9yNHgoZmFkZUNvbG9yLCBmYWRlQ29sb3IsIGZhZGVDb2xvciwgMCk7CisKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCBxdWFkVmVydGljZXMpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCA2KTsKKworICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KK3ZvaWQgYXBwSW5pdCgpCit7CisgICAgaW50IGE7CisKKyAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKKworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDApOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMSk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQyKTsKKworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIHNlZWRSYW5kb20oMTUpOworCisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICB7CisgICAgICAgIHNTdXBlclNoYXBlT2JqZWN0c1thXSA9IGNyZWF0ZVN1cGVyU2hhcGUoc1N1cGVyU2hhcGVQYXJhbXNbYV0pOworICAgICAgICBhc3NlcnQoc1N1cGVyU2hhcGVPYmplY3RzW2FdICE9IE5VTEwpOworICAgIH0KKyAgICBzR3JvdW5kUGxhbmUgPSBjcmVhdGVHcm91bmRQbGFuZSgpOworICAgIGFzc2VydChzR3JvdW5kUGxhbmUgIT0gTlVMTCk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcERlaW5pdCgpCit7CisgICAgaW50IGE7CisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICAgICAgZnJlZUdMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1thXSk7CisgICAgZnJlZUdMT2JqZWN0KHNHcm91bmRQbGFuZSk7Cit9CisKKworc3RhdGljIHZvaWQgZ2x1UGVyc3BlY3RpdmUoR0xmbG9hdCBmb3Z5LCBHTGZsb2F0IGFzcGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK3sKKyAgICBHTGZsb2F0IHhtaW4sIHhtYXgsIHltaW4sIHltYXg7CisKKyAgICB5bWF4ID0gek5lYXIgKiAoR0xmbG9hdCl0YW4oZm92eSAqIFBJIC8gMzYwKTsKKyAgICB5bWluID0gLXltYXg7CisgICAgeG1pbiA9IHltaW4gKiBhc3BlY3Q7CisgICAgeG1heCA9IHltYXggKiBhc3BlY3Q7CisKKyAgICBnbEZydXN0dW14KChHTGZpeGVkKSh4bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeG1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh5bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeW1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh6TmVhciAqIDY1NTM2KSwgKEdMZml4ZWQpKHpGYXIgKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIHByZXBhcmVGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGdsQ2xlYXJDb2xvcngoKEdMZml4ZWQpKDAuMWYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4yZiAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjNmICogNjU1MzYpLCAweDEwMDAwKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdVBlcnNwZWN0aXZlKDQ1LCAoZmxvYXQpd2lkdGggLyBoZWlnaHQsIDAuNWYsIDE1MCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgIGdsTG9hZElkZW50aXR5KCk7Cit9CisKKworc3RhdGljIHZvaWQgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpCit7CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwUG9zaXRpb25bXSA9IHsgLTB4NDAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBEaWZmdXNlW10gPSB7IDB4MTAwMDAsIDB4NjY2NiwgMCwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MVBvc2l0aW9uW10gPSB7IDB4MTAwMDAsIC0weDIwMDAwLCAtMHgxMDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MURpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDIzZDcsIDB4NTk5OSwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MlBvc2l0aW9uW10gPSB7IC0weDEwMDAwLCAwLCAtMHg0MDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MkRpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDJiODUsIDB4MjNkNywgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIG1hdGVyaWFsU3BlY3VsYXJbXSA9IHsgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCB9OworCisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIGxpZ2h0MFBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBsaWdodDBEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9QT1NJVElPTiwgbGlnaHQxUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX0RJRkZVU0UsIGxpZ2h0MURpZmZ1c2UpOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX1BPU0lUSU9OLCBsaWdodDJQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfRElGRlVTRSwgbGlnaHQyRGlmZnVzZSk7CisgICAgZ2xNYXRlcmlhbHh2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgbWF0ZXJpYWxTcGVjdWxhcik7CisKKyAgICBnbE1hdGVyaWFseChHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCA2MCA8PCAxNik7CisgICAgZ2xFbmFibGUoR0xfQ09MT1JfTUFURVJJQUwpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdNb2RlbHMoZmxvYXQgelNjYWxlKQoreworICAgIGNvbnN0IGludCB0cmFuc2xhdGlvblNjYWxlID0gOTsKKyAgICBpbnQgeCwgeTsKKworICAgIHNlZWRSYW5kb20oOSk7CisKKyAgICBnbFNjYWxleCgxIDw8IDE2LCAxIDw8IDE2LCAoR0xmaXhlZCkoelNjYWxlICogNjU1MzYpKTsKKworICAgIGZvciAoeSA9IC01OyB5IDw9IDU7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IC01OyB4IDw9IDU7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgYnVpbGRpbmdTY2FsZTsKKyAgICAgICAgICAgIEdMZml4ZWQgZml4ZWRTY2FsZTsKKworICAgICAgICAgICAgaW50IGN1clNoYXBlID0gcmFuZG9tVUludCgpICUgU1VQRVJTSEFQRV9DT1VOVDsKKyAgICAgICAgICAgIGJ1aWxkaW5nU2NhbGUgPSBzU3VwZXJTaGFwZVBhcmFtc1tjdXJTaGFwZV1bU1VQRVJTSEFQRV9QQVJBTVMgLSAxXTsKKyAgICAgICAgICAgIGZpeGVkU2NhbGUgPSAoR0xmaXhlZCkoYnVpbGRpbmdTY2FsZSAqIDY1NTM2KTsKKworICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgICAgICBnbFRyYW5zbGF0ZXgoKHggKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICh5ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGdsUm90YXRleCgoR0xmaXhlZCkoKHJhbmRvbVVJbnQoKSAlIDM2MCkgPDwgMTYpLCAwLCAwLCAxIDw8IDE2KTsKKyAgICAgICAgICAgIGdsU2NhbGV4KGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUpOworCisgICAgICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2N1clNoYXBlXSk7CisgICAgICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh4ID0gLTI7IHggPD0gMjsgKyt4KQorICAgIHsKKyAgICAgICAgY29uc3QgaW50IHNoaXBTY2FsZTEwMCA9IHRyYW5zbGF0aW9uU2NhbGUgKiA1MDA7CisgICAgICAgIGNvbnN0IGludCBvZmZzMTAwID0geCAqIHNoaXBTY2FsZTEwMCArIChzVGljayAlIHNoaXBTY2FsZTEwMCk7CisgICAgICAgIGZsb2F0IG9mZnMgPSBvZmZzMTAwICogMC4wMWY7CisgICAgICAgIEdMZml4ZWQgZml4ZWRPZmZzID0gKEdMZml4ZWQpKG9mZnMgKiA2NTUzNik7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBnbFRyYW5zbGF0ZXgoZml4ZWRPZmZzLCAtNCAqIDY1NTM2LCAyIDw8IDE2KTsKKyAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOworICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KC00ICogNjU1MzYsIGZpeGVkT2ZmcywgNCA8PCAxNik7CisgICAgICAgIGdsUm90YXRleCg5MCA8PCAxNiwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICB9Cit9CisKKworLyogRm9sbG93aW5nIGdsdUxvb2tBdCBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gdGhlCisgKiBNZXNhIDNEIEdyYXBoaWNzIGxpYnJhcnkuIGh0dHA6Ly93d3cubWVzYTNkLm9yZworICovCitzdGF0aWMgdm9pZCBnbHVMb29rQXQoR0xmbG9hdCBleWV4LCBHTGZsb2F0IGV5ZXksIEdMZmxvYXQgZXlleiwKKwkgICAgICAgICAgICAgIEdMZmxvYXQgY2VudGVyeCwgR0xmbG9hdCBjZW50ZXJ5LCBHTGZsb2F0IGNlbnRlcnosCisJICAgICAgICAgICAgICBHTGZsb2F0IHVweCwgR0xmbG9hdCB1cHksIEdMZmxvYXQgdXB6KQoreworICAgIEdMZmxvYXQgbVsxNl07CisgICAgR0xmbG9hdCB4WzNdLCB5WzNdLCB6WzNdOworICAgIEdMZmxvYXQgbWFnOworCisgICAgLyogTWFrZSByb3RhdGlvbiBtYXRyaXggKi8KKworICAgIC8qIFogdmVjdG9yICovCisgICAgelswXSA9IGV5ZXggLSBjZW50ZXJ4OworICAgIHpbMV0gPSBleWV5IC0gY2VudGVyeTsKKyAgICB6WzJdID0gZXlleiAtIGNlbnRlcno7CisgICAgbWFnID0gKGZsb2F0KXNxcnQoelswXSAqIHpbMF0gKyB6WzFdICogelsxXSArIHpbMl0gKiB6WzJdKTsKKyAgICBpZiAobWFnKSB7CQkJLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgICAgIHpbMF0gLz0gbWFnOworICAgICAgICB6WzFdIC89IG1hZzsKKyAgICAgICAgelsyXSAvPSBtYWc7CisgICAgfQorCisgICAgLyogWSB2ZWN0b3IgKi8KKyAgICB5WzBdID0gdXB4OworICAgIHlbMV0gPSB1cHk7CisgICAgeVsyXSA9IHVwejsKKworICAgIC8qIFggdmVjdG9yID0gWSBjcm9zcyBaICovCisgICAgeFswXSA9IHlbMV0gKiB6WzJdIC0geVsyXSAqIHpbMV07CisgICAgeFsxXSA9IC15WzBdICogelsyXSArIHlbMl0gKiB6WzBdOworICAgIHhbMl0gPSB5WzBdICogelsxXSAtIHlbMV0gKiB6WzBdOworCisgICAgLyogUmVjb21wdXRlIFkgPSBaIGNyb3NzIFggKi8KKyAgICB5WzBdID0gelsxXSAqIHhbMl0gLSB6WzJdICogeFsxXTsKKyAgICB5WzFdID0gLXpbMF0gKiB4WzJdICsgelsyXSAqIHhbMF07CisgICAgeVsyXSA9IHpbMF0gKiB4WzFdIC0gelsxXSAqIHhbMF07CisKKyAgICAvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KKyAgICAvKiBjcm9zcyBwcm9kdWN0IGdpdmVzIGFyZWEgb2YgcGFyYWxsZWxvZ3JhbSwgd2hpY2ggaXMgPCAxLjAgZm9yCisgICAgICogbm9uLXBlcnBlbmRpY3VsYXIgdW5pdC1sZW5ndGggdmVjdG9yczsgc28gbm9ybWFsaXplIHgsIHkgaGVyZQorICAgICAqLworCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeFswXSAqIHhbMF0gKyB4WzFdICogeFsxXSArIHhbMl0gKiB4WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHhbMF0gLz0gbWFnOworICAgICAgICB4WzFdIC89IG1hZzsKKyAgICAgICAgeFsyXSAvPSBtYWc7CisgICAgfQorCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeVswXSAqIHlbMF0gKyB5WzFdICogeVsxXSArIHlbMl0gKiB5WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHlbMF0gLz0gbWFnOworICAgICAgICB5WzFdIC89IG1hZzsKKyAgICAgICAgeVsyXSAvPSBtYWc7CisgICAgfQorCisjZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQorICAgIE0oMCwgMCkgPSB4WzBdOworICAgIE0oMCwgMSkgPSB4WzFdOworICAgIE0oMCwgMikgPSB4WzJdOworICAgIE0oMCwgMykgPSAwLjA7CisgICAgTSgxLCAwKSA9IHlbMF07CisgICAgTSgxLCAxKSA9IHlbMV07CisgICAgTSgxLCAyKSA9IHlbMl07CisgICAgTSgxLCAzKSA9IDAuMDsKKyAgICBNKDIsIDApID0gelswXTsKKyAgICBNKDIsIDEpID0gelsxXTsKKyAgICBNKDIsIDIpID0gelsyXTsKKyAgICBNKDIsIDMpID0gMC4wOworICAgIE0oMywgMCkgPSAwLjA7CisgICAgTSgzLCAxKSA9IDAuMDsKKyAgICBNKDMsIDIpID0gMC4wOworICAgIE0oMywgMykgPSAxLjA7CisjdW5kZWYgTQorICAgIHsKKyAgICAgICAgaW50IGE7CisgICAgICAgIEdMZml4ZWQgZml4ZWRNWzE2XTsKKyAgICAgICAgZm9yIChhID0gMDsgYSA8IDE2OyArK2EpCisgICAgICAgICAgICBmaXhlZE1bYV0gPSAoR0xmaXhlZCkobVthXSAqIDY1NTM2KTsKKyAgICAgICAgZ2xNdWx0TWF0cml4eChmaXhlZE0pOworICAgIH0KKworICAgIC8qIFRyYW5zbGF0ZSBFeWUgdG8gT3JpZ2luICovCisgICAgZ2xUcmFuc2xhdGV4KChHTGZpeGVkKSgtZXlleCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV5ICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXogKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIGNhbVRyYWNrKCkKK3sKKyAgICBmbG9hdCBsZXJwWzVdOworICAgIGZsb2F0IGVYLCBlWSwgZVosIGNYLCBjWSwgY1o7CisgICAgZmxvYXQgdHJhY2tQb3M7CisgICAgQ0FNVFJBQ0sgKmNhbTsKKyAgICBsb25nIGN1cnJlbnRDYW1UaWNrOworICAgIGludCBhOworCisgICAgaWYgKHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPD0gc1RpY2spCisgICAgeworICAgICAgICArK3NDdXJyZW50Q2FtVHJhY2s7CisgICAgICAgIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrOworICAgIH0KKyAgICBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja10ubGVuICogQ0FNVFJBQ0tfTEVOOworCisgICAgY2FtID0gJnNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja107CisgICAgY3VycmVudENhbVRpY2sgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgdHJhY2tQb3MgPSAoZmxvYXQpY3VycmVudENhbVRpY2sgLyAoQ0FNVFJBQ0tfTEVOICogY2FtLT5sZW4pOworCisgICAgZm9yIChhID0gMDsgYSA8IDU7ICsrYSkKKyAgICAgICAgbGVycFthXSA9IChjYW0tPnNyY1thXSArIGNhbS0+ZGVzdFthXSAqIHRyYWNrUG9zKSAqIDAuMDFmOworCisgICAgaWYgKGNhbS0+ZGlzdCkKKyAgICB7CisgICAgICAgIGZsb2F0IGRpc3QgPSBjYW0tPmRpc3QgKiAwLjFmOworICAgICAgICBjWCA9IGxlcnBbMF07CisgICAgICAgIGNZID0gbGVycFsxXTsKKyAgICAgICAgY1ogPSBsZXJwWzJdOworICAgICAgICBlWCA9IGNYIC0gKGZsb2F0KWNvcyhsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVZID0gY1kgLSAoZmxvYXQpc2luKGxlcnBbM10pICogZGlzdDsKKyAgICAgICAgZVogPSBjWiAtIGxlcnBbNF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVYID0gbGVycFswXTsKKyAgICAgICAgZVkgPSBsZXJwWzFdOworICAgICAgICBlWiA9IGxlcnBbMl07CisgICAgICAgIGNYID0gZVggKyAoZmxvYXQpY29zKGxlcnBbM10pOworICAgICAgICBjWSA9IGVZICsgKGZsb2F0KXNpbihsZXJwWzNdKTsKKyAgICAgICAgY1ogPSBlWiArIGxlcnBbNF07CisgICAgfQorICAgIGdsdUxvb2tBdChlWCwgZVksIGVaLCBjWCwgY1ksIGNaLCAwLCAwLCAxKTsKK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KKy8qIFRoZSB0aWNrIGlzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMsIHdpZHRoIGFuZCBoZWlnaHQKKyAqIGFyZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyB0byBiZSByZW5kZXJlZC4KKyAqLwordm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaWYgKHNTdGFydFRpY2sgPT0gMCkKKyAgICAgICAgc1N0YXJ0VGljayA9IHRpY2s7CisgICAgaWYgKCFnQXBwQWxpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFjdHVhbCB0aWNrIHZhbHVlIGlzICJibHVycmVkIiBhIGxpdHRsZSBiaXQuCisgICAgc1RpY2sgPSAoc1RpY2sgKyB0aWNrIC0gc1N0YXJ0VGljaykgPj4gMTsKKworICAgIC8vIFRlcm1pbmF0ZSBhcHBsaWNhdGlvbiBhZnRlciBydW5uaW5nIHRocm91Z2ggdGhlIGRlbW9uc3RyYXRpb24gb25jZS4KKyAgICBpZiAoc1RpY2sgPj0gUlVOX0xFTkdUSCkKKyAgICB7CisgICAgICAgIGdBcHBBbGl2ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIE9wZW5HTCBFUyBmb3IgcmVuZGVyaW5nIG9mIHRoZSBmcmFtZS4KKyAgICBwcmVwYXJlRnJhbWUod2lkdGgsIGhlaWdodCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgc2V0IHRoZSBsb29rYXQuCisgICAgY2FtVHJhY2soKTsKKworICAgIC8vIENvbmZpZ3VyZSBlbnZpcm9ubWVudC4KKyAgICBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCk7CisKKyAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uIGJ5IGRyYXdpbmcgbW9kZWxzIHdpdGggbmVnYXRlZCBaLWF4aXMuCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgZHJhd01vZGVscygtMSk7CisgICAgZ2xQb3BNYXRyaXgoKTsKKworICAgIC8vIEJsZW5kIHRoZSBncm91bmQgcGxhbmUgdG8gdGhlIHdpbmRvdy4KKyAgICBkcmF3R3JvdW5kUGxhbmUoKTsKKworICAgIC8vIERyYXcgYWxsIHRoZSBtb2RlbHMgbm9ybWFsbHkuCisgICAgZHJhd01vZGVscygxKTsKKworICAgIC8vIERyYXcgZmFkZSBxdWFkIG92ZXIgd2hvbGUgd2luZG93ICh3aGVuIGNoYW5naW5nIGNhbWVyYXMpLgorICAgIGRyYXdGYWRlUXVhZCgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NDBjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK3N0YXRpYyB2b2lkICptYXBfbWVtb3J5KGNvbnN0IGNoYXIgKmZuLCB1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBzaXplKQoreworICAgIGludCBmZDsKKyAgICB2b2lkICpwdHI7CisgICAgCisgICAgZmQgPSBvcGVuKGZuLCBPX1JEV1IgfCBPX1NZTkMpOworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoImNhbm5vdCBvcGVuICVzIGZvciBtYXBwaW5nIik7CisgICAgICAgIHJldHVybiBNQVBfRkFJTEVEOworICAgIH0KKworICAgIHB0ciA9IG1tYXAoMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLCBiYXNlKTsKKyAgICBjbG9zZShmZCk7CisgICAgCisgICAgaWYocHRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImNhbm5vdCBtYXAgJXMgKEAlMDh4LCUwOHgpXG4iLCBmbiwgYmFzZSwgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBwdHI7ICAgIAorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICB2b2lkICpncnBfcmVncyA9IG1hcF9tZW1vcnkoIi9kZXYvaHczZCIsIDAsIDEwMjQgKiAxMDI0KTsKKyAgICBwcmludGYoIkdQVSBiYXNlIG1hcHBlZCBhdCAlcFxuIiwgZ3JwX3JlZ3MpOworICAgIGludCBzdGF0ZV9vZmZzZXQgPSAweDEwMTQwOworICAgIHByaW50ZigiR1BVIHN0YXRlID0gJTA4bHhcbiIsCisgICAgICAgICAgICAqKChsb25nKikoKGNoYXIqKWdycF9yZWdzICsgc3RhdGVfb2Zmc2V0KSkgICk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY4NDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCkBAIC0wLDAgKzEsMjI5IEBACisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKgorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKgorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKioKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZWdsdHlwZXMuaD4KKworLyoKKyoqIGVnbHR5cGVzLmggaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBJdCBkZWZpbmVzOgorKioKKyoqICAgICAtIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzCisqKiAgICAgLSBOYXRpdmUgdHlwZXMKKyoqICAgICAtIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyoqCisqKiBFR0wgdHlwZXMgYW5kIHJlc291cmNlcyBhcmUgdG8gYmUgdHlwZWRlZidlZCB3aXRoIGFwcHJvcHJpYXRlIHBsYXRmb3JtCisqKiBkZXBlbmRlbnQgcmVzb3VyY2UgaGFuZGxlIHR5cGVzLiBFR0xpbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG9mIGF0IGxlYXN0CisqKiAzMi1iaXQuCisqKgorKiogTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUgYW5kIE5hdGl2ZVBpeG1hcFR5cGUgYXJlIHRvIGJlCisqKiByZXBsYWNlZCB3aXRoIGNvcnJlc3BvbmRpbmcgdHlwZXMgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgc3lzdGVtIGluIGVnbC5oLgorKioKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMgbXVzdCBtYXRjaCB0aGVpciB0eXBlcy4KKyoqCisqKiBFeGFtcGxlIGVnbHR5cGVzLmg6CisqLworCisjaWYgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmF0aXZlX3dpbmRvd19zeXN0ZW0uaD4KKworLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBpbnQzMl90IEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCisKKyNlbmRpZgorCisvKgorKiogVmVyc2lvbmluZyBhbmQgZXh0ZW5zaW9ucworKi8KKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8wCQkgICAgICAgMQorCisvKgorKiogQm9vbGVhbgorKi8KKyNkZWZpbmUgRUdMX0ZBTFNFCQkgICAgICAgMAorI2RlZmluZSBFR0xfVFJVRQkJICAgICAgIDEKKworLyoKKyoqIEVycm9ycworKi8KKyNkZWZpbmUgRUdMX1NVQ0NFU1MJCSAgICAgICAweDMwMDAKKyNkZWZpbmUgRUdMX05PVF9JTklUSUFMSVpFRAkgICAgICAgMHgzMDAxCisjZGVmaW5lIEVHTF9CQURfQUNDRVNTCQkgICAgICAgMHgzMDAyCisjZGVmaW5lIEVHTF9CQURfQUxMT0MJCSAgICAgICAweDMwMDMKKyNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUJICAgICAgIDB4MzAwNAorI2RlZmluZSBFR0xfQkFEX0NPTkZJRwkJICAgICAgIDB4MzAwNQorI2RlZmluZSBFR0xfQkFEX0NPTlRFWFQJCSAgICAgICAweDMwMDYKKyNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UgICAgICAgIDB4MzAwNworI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkJCSAgICAgICAweDMwMDgKKyNkZWZpbmUgRUdMX0JBRF9NQVRDSAkJICAgICAgIDB4MzAwOQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9QSVhNQVAJICAgICAgIDB4MzAwQQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cJICAgICAgIDB4MzAwQgorI2RlZmluZSBFR0xfQkFEX1BBUkFNRVRFUgkgICAgICAgMHgzMDBDCisjZGVmaW5lIEVHTF9CQURfU1VSRkFDRQkJICAgICAgIDB4MzAwRAorLyogMHgzMDBFIC0gMHgzMDFGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGVycm9ycy4gKi8KKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGVzCisqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCSAgICAgICAweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCSAgICAgICAweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJICAgICAgIDB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJICAgICAgIDB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCSAgICAgICAweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCSAgICAgICAweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkgICAgICAgMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCSAgICAgICAweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJICAgICAgIDB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCSAgICAgICAweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkgICAgICAgMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJICAgICAgIDB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJICAgICAgIDB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJICAgICAgIDB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkgICAgICAgMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJICAgICAgIDB4MzAyRgorLyojZGVmaW5lIEVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTCSAweDMwMzAqLworI2RlZmluZSBFR0xfU0FNUExFUwkJICAgICAgIDB4MzAzMQorI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJICAgICAgIDB4MzAzMgorI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCSAgICAgICAweDMwMzMKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJICAgICAgIDB4MzAzNAorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgMHgzMDM1CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSAgICAweDMwMzYKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSAgICAgIDB4MzAzNworCisvKgorKiogQ29uZmlnIGF0dHJpYnV0ZSBhbmQgdmFsdWUKKyovCisjZGVmaW5lIEVHTF9OT05FCQkgICAgICAgMHgzMDM4CisvKiAweDMwMzkgLSAweDMwNEYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGF0dHJpYnV0ZXMuICovCisKKy8qCisqKiBDb25maWcgdmFsdWVzCisqLworI2RlZmluZSBFR0xfRE9OVF9DQVJFCQkgICAgICAgKChFR0xpbnQpIC0xKQorI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCSAgICAgICAweDAxCisjZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkgICAgICAgMHgwMgorI2RlZmluZSBFR0xfV0lORE9XX0JJVAkJICAgICAgIDB4MDQKKyNkZWZpbmUgRUdMX1NMT1dfQ09ORklHCQkgICAgICAgMHgzMDUwCisjZGVmaW5lIEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcgICAgICAweDMwNTEKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkgICAgICAgMHgzMDUyCisKKy8qCisqKiBTdHJpbmcgbmFtZXMKKyovCisjZGVmaW5lIEVHTF9WRU5ET1IJCSAgICAgICAweDMwNTMKKyNkZWZpbmUgRUdMX1ZFUlNJT04JCSAgICAgICAweDMwNTQKKyNkZWZpbmUgRUdMX0VYVEVOU0lPTlMJCSAgICAgICAweDMwNTUKKworLyoKKyoqIFN1cmZhY2UgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0hFSUdIVAkJICAgICAgIDB4MzA1NgorI2RlZmluZSBFR0xfV0lEVEgJCSAgICAgICAweDMwNTcKKyNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkgICAgICAgMHgzMDU4CisKKy8qCisqKiBDdXJyZW50IHN1cmZhY2VzCisqLworI2RlZmluZSBFR0xfRFJBVwkJICAgICAgIDB4MzA1OQorI2RlZmluZSBFR0xfUkVBRAkJICAgICAgIDB4MzA1QQorCisvKgorKiogRW5naW5lcworKi8KKyNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkgICAgICAgMHgzMDVCCisKKy8qIDB4MzA1Qy0weDNGRkZGIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKy8qCisqKiBGdW5jdGlvbnMKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0dMQVBJIEVHTGludCBBUElFTlRSWSBlZ2xHZXRFcnJvciAodm9pZCk7CisKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0RGlzcGxheSAoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEluaXRpYWxpemUgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsVGVybWluYXRlIChFR0xEaXNwbGF5IGRweSk7CitHTEFQSSBjb25zdCBjaGFyICogQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSk7CitHTEFQSSB2b2lkICgqIEFQSUVOVFJZIGVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlncyAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDaG9vc2VDb25maWcgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsTWFrZUN1cnJlbnQgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCAodm9pZCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlIChFR0xpbnQgcmVhZGRyYXcpOworR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSAodm9pZCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0R0wgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0TmF0aXZlIChFR0xpbnQgZW5naW5lKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDb3B5QnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjM2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorKiogVHlwZXMgYW5kIHJlc291cmNlcworKi8KK3R5cGVkZWYgaW50IEVHTEJvb2xlYW47Cit0eXBlZGVmIGxvbmcgRUdMaW50OwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVXaW5kb3dUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVQaXhtYXBUeXBlOworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApAQCAtMCwwICsxLDU4NCBAQAorI2lmbmRlZiBfX2dsX2hfCisjZGVmaW5lIF9fZ2xfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKiogCisqKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKKyoqIAorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKiogCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKiAKKyoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCisqKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCisqKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAorKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCisqKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKKyoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQorKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgorKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCisqKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgR0xzaG9ydDsKK3R5cGVkZWYgaW50IEdMaW50OwordHlwZWRlZiBpbnQgR0xzaXplaTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKK3R5cGVkZWYgZmxvYXQgR0xmbG9hdDsKK3R5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Cit0eXBlZGVmIHZvaWQgR0x2b2lkOwordHlwZWRlZiBpbnQgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIGludCBHTHNpemVpcHRyQVJCOwordHlwZWRlZiBpbnQgR0xmaXhlZDsKK3R5cGVkZWYgaW50IEdMY2xhbXB4OworLyogSW50ZXJuYWwgY29udmVuaWVuY2UgdHlwZWRlZnMgKi8KK3R5cGVkZWYgdm9pZCAoKl9HTGZ1bmNwdHIpKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFeHRlbnNpb25zICovCisjZGVmaW5lIEdMX09FU19WRVJTSU9OXzFfMCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQorCisvKiBDbGVhckJ1ZmZlck1hc2sgKi8KKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworLyogQm9vbGVhbiAqLworI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCZWdpbk1vZGUgKi8KKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvKiBBbHBoYUZ1bmN0aW9uICovCisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworCisvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKworLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KKy8qICAgICAgR0xfWkVSTyAqLworLyogICAgICBHTF9PTkUgKi8KKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKy8qICAgICAgR0xfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfRFNUX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKworLyogQ29sb3JNYXRlcmlhbEZhY2UgKi8KKy8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKworLyogQ29sb3JNYXRlcmlhbFBhcmFtZXRlciAqLworLyogICAgICBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICovCisKKy8qIENvbG9yUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworCisvKiBDdWxsRmFjZU1vZGUgKi8KKyNkZWZpbmUgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNAorI2RlZmluZSBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA1CisjZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAweDA0MDgKKworLyogRGVwdGhGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogRW5hYmxlQ2FwICovCisjZGVmaW5lIEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjAKKyNkZWZpbmUgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4MEI1MAorI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCisjZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEJDMAorI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCisjZGVmaW5lIEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAweDBCRjIKKyNkZWZpbmUgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJEMAorI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQjkwCisjZGVmaW5lIEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCNzEKKy8qICAgICAgR0xfTElHSFQwICovCisvKiAgICAgIEdMX0xJR0hUMSAqLworLyogICAgICBHTF9MSUdIVDIgKi8KKy8qICAgICAgR0xfTElHSFQzICovCisvKiAgICAgIEdMX0xJR0hUNCAqLworLyogICAgICBHTF9MSUdIVDUgKi8KKy8qICAgICAgR0xfTElHSFQ2ICovCisvKiAgICAgIEdMX0xJR0hUNyAqLworI2RlZmluZSBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgMHgwQjEwCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAweDBCMjAKKyNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQorI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgMHgwQjU3CisjZGVmaW5lIEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAweDBCQTEKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgIDB4ODAzQQorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgMHg4MDM3CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzQKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgMHg4MDc2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAorCisvKiBFcnJvckNvZGUgKi8KKyNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKKyNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgIDB4MDUwMworI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgMHgwNTA0CisjZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKKworLyogRm9nTW9kZSAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCisKKy8qIEZvZ1BhcmFtZXRlciAqLworI2RlZmluZSBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgMHgwQjYyCisjZGVmaW5lIEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAweDBCNjMKKyNkZWZpbmUgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NAorI2RlZmluZSBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY1CisjZGVmaW5lIEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDBCNjYKKworLyogRnJvbnRGYWNlRGlyZWN0aW9uICovCisjZGVmaW5lIEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKKyNkZWZpbmUgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMQorCisvKiBHZXRQTmFtZSAqLworI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAweDBCMjIKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgMHg4QjlBCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAweDhCOUIKKyNkZWZpbmUgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQzMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCisjZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKKyNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5CisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKKyNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKKyNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQorI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2CisjZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKKworLyogSGludE1vZGUgKi8KKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKworLyogSGludFRhcmdldCAqLworI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKKyNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgorI2RlZmluZSBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgMHgwQzUzCisjZGVmaW5lIEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAweDBDNTQKKworLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKKworLyogTGlnaHRQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCisjZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKKyNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMworI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0CisjZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKKyNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgorI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3CisjZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKKyNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQorCisvKiBEYXRhVHlwZSAqLworI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKKyNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworCisvKiBMb2dpY09wICovCisjZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKKyNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQorI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCisjZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKKyNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAorI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1CisjZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKKyNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNworI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4CisjZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCisjZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKKyNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAorI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCisjZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKKworLyogTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIE1hdGVyaWFsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKKyNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQorI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCisvKiAgICAgIEdMX0FNQklFTlQgKi8KKy8qICAgICAgR0xfRElGRlVTRSAqLworLyogICAgICBHTF9TUEVDVUxBUiAqLworCisvKiBNYXRyaXhNb2RlICovCisjZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQorI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCisKKy8qIE5vcm1hbFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX0JZVEUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogUGl4ZWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgorI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCisKKy8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisKKy8qIFBpeGVsVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisKKy8qIFNoYWRpbmdNb2RlbCAqLworI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCisjZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKKworLyogU3RlbmNpbEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBTdGVuY2lsT3AgKi8KKy8qICAgICAgR0xfWkVSTyAqLworI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKKyNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgorI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCisvKiAgICAgIEdMX0lOVkVSVCAqLworCisvKiBTdHJpbmdOYW1lICovCisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKworLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIFRleHR1cmVFbnZNb2RlICovCisjZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKKyNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQorLyogICAgICBHTF9CTEVORCAqLworI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisvKiAgICAgIEdMX1JFUExBQ0UgKi8KKworLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKKworLyogVGV4dHVyZUVudlRhcmdldCAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCisKKy8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAorI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCisKKy8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KKy8qICAgICAgR0xfTkVBUkVTVCAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworCisvKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisKKy8qIFRleHR1cmVUYXJnZXQgKi8KKy8qICAgICAgR0xfVEVYVFVSRV8yRCAqLworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKworLyogVGV4dHVyZVdyYXBNb2RlICovCisjZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorCisvKiBQaXhlbEludGVybmFsRm9ybWF0ICovCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTAKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5MQorI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4QjkyCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTMKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5NAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4Qjk1CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTYKKyNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5NworI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4Qjk4CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTkKKworLyogVmVydGV4UG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBMaWdodE5hbWUgKi8KKyNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmN4IChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvcnggKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJTdGVuY2lsIChHTGludCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0ZiAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JNYXNrIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2Z2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW1mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSBjb25zdCBHTHVieXRlICogQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9naWNPcCAoR0xlbnVtIG9wY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQdXNoTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGVmIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0CkBAIC0wLDAgKzEsMzQgQEAKK1RoaXMgaXMgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvciB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIg0KK09wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgc291cmNlIGNvZGUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCithcmUgbWV0Og0KKw0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQorICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAgICAgIGRpc3RyaWJ1dGlvbi4NCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBzb2Z0d2FyZSBwcm9kdWN0J3MgY29weXJpZ2h0IG93bmVyIG5vcg0KKyAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQ0KKyAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbg0KKyAgICAgIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCitUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQorTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKQEAgLTAsMCArMSw1MDQgQEAKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwODQxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorDQorVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6DQorICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCisgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdA0KKyAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXINCisgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlDQorICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0Lg0KKyAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4NCisgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuDQorDQorVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcw0KK0xJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZmFlOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IHNoYXBlcy5oLHYgMS42IDIwMDUvMDEvMzEgMjI6MTU6MzAgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqLworCisjaWZuZGVmIFNIQVBFU19IX0lOQ0xVREVECisjZGVmaW5lIFNIQVBFU19IX0lOQ0xVREVECisKKworI2RlZmluZSBTVVBFUlNIQVBFX1BBUkFNUyAxNQorCitzdGF0aWMgY29uc3QgZmxvYXQgc1N1cGVyU2hhcGVQYXJhbXNbXVtTVVBFUlNIQVBFX1BBUkFNU10gPQoreworICAgIC8vIG0gIGEgICAgIGIgICAgIG4xICAgICAgbjIgICAgIG4zICAgICBtICAgICBhICAgICBiICAgICBuMSAgICAgbjIgICAgICBuMyAgIHJlczEgcmVzMiBzY2FsZSAgKG9yZy5yZXMxLHJlczIpCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDgsICAgIDEsICAgIDEsICAgIC0xLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMzAsIDIgfSwgLy8gNDAsIDYwCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCisgICAgeyAxMCwgMSwgICAgMiwgICAgNjAsICAgICAgMSwgICAtMTAsICAgIDQsICAgIDEsICAgIDEsICAgIC0xLCAgICAtMiwgIC0wLjRmLCAgIDQxLCAgNDEsIDEgfSwgLy8gODIsIDgyCisgICAgeyAgNiwgMSwgICAgMSwgICAgNjAsICAgICAgMSwgICAtNzAsICAgIDgsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDIwLCAgMjAsIDEgfSwgLy8gNDAsIDQwCisgICAgeyAgNCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgMjAsICAgMTIsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDEwLCAgMzAsIDEgfSwgLy8gMjAsIDYwCisgICAgeyAgOCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgIDgsICAgIDIsICAgIDEsICAgIC0xLCAgICAgNSwgICAwLjVmLCAgIDI1LCAgMjYsIDEgfSwgLy8gNjAsIDYwCisgICAgeyAxMywgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgMTMsICAgIDEsICAgIDEsICAgICAxLCAgICAgNSwgICAgICAxLCAgIDMwLCAgMzAsIDYgfSwgLy8gNjAsIDYwCisgICAgeyAxMCwgMSwgMS4xZiwgLTAuNWYsICAgMC4xZiwgICAgNzAsICAgNjAsICAgIDEsICAgIDEsICAgLTkwLCAgICAgMCwgLTAuMjVmLCAgIDIwLCAgNjAsIDggfSwgLy8gNjAsIDE4MAorICAgIHsgIDcsIDEsICAgIDEsICAgIDIwLCAgLTAuM2YsIC0zLjVmLCAgICA2LCAgICAxLCAgICAxLCAgICAtMSwgIDQuNWYsICAgMC41ZiwgICAxMCwgIDIwLCA0IH0sIC8vIDYwLCA4MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDEwLCAgICAgMTAsICAgIDEwLCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIwLCAxIH0sIC8vIDIwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAxMCwgIDEwLCAyIH0sIC8vIDEwLCAxMAorICAgIHsgIDEsIDEsICAgIDEsICAgIDM4LCAtMC4yNWYsICAgIDE5LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDE1LCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAwLjdmLCAgIDAuM2YsICAwLjJmLCAgICAzLCAgICAxLCAgICAxLCAgIDEwMCwgICAxMDAsICAgIDEwMCwgICAxMCwgIDI1LCAyIH0sIC8vIDIwLCA1MAorICAgIHsgIDYsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAzMCwgIDMwLCAyIH0sIC8vIDYwLCA2MAorICAgIHsgIDMsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA2LCAgICAxLCAgICAxLCAgICAgMiwgICAgIDEsICAgICAgMSwgICAxMCwgIDIwLCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAyNSwgICAgMTAsICAgICAxMCwgICAzMCwgIDIwLCAyIH0sIC8vIDYwLCA0MAorICAgIHsgIDMsIDEsICAgIDEsICAwLjVmLCAgIDEuN2YsICAxLjdmLCAgICAyLCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAyMCwgIDIwLCAyIH0sIC8vIDQwLCA0MAorICAgIHsgIDUsIDEsICAgIDEsICAwLjFmLCAgIDEuN2YsICAxLjdmLCAgICAxLCAgICAxLCAgICAxLCAgMC4zZiwgIDAuNWYsICAgMC41ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAgNCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIyLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgNzAsICAwLjFmLCAgICA5LCAgICAxLCAwLjVmLCAgIC05OCwgMC4wNWYsICAgIC00NSwgICAyMCwgIDMwLCA0IH0sIC8vIDYwLCA5MQorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgOTAsIC0wLjFmLCAgICA3LCAgICAxLCAgICAxLCAgICA5MCwgIDEuM2YsICAgICAzNCwgICAxMywgIDE2LCAxIH0sIC8vIDMyLCA2MAorfTsKKyNkZWZpbmUgU1VQRVJTSEFQRV9DT1VOVCAoc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zKSAvIHNpemVvZihzU3VwZXJTaGFwZVBhcmFtc1swXSkpCisKKworI2VuZGlmIC8vICFTSEFQRVNfSF9JTkNMVURFRAo=