From octave-maintainers-request at bevo dot che dot wisc dot edu Sat Apr 21 15:20:52 2001 Subject: [patch] Use fftw if available From: Mumit Khan To: octave-maintainers at bevo dot che dot wisc dot edu cc: Mumit Khan Date: Sat, 21 Apr 2001 15:20:50 -0500 (CDT) This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime at docserver dot cac dot washington dot edu for more info. --2006041544-959030623-987884450=:25502 Content-Type: TEXT/PLAIN; charset=US-ASCII [ I'm not subscribed to the list, so please copy me if appropriate ] The attached patch is a first cut at enabling fftw support in Octave. I did some quick tests, and even while the fftw interface here is suboptimal at best, there is still significant performance boost. Must re-run autogen, and use --with-fftw to use fftw (default is off). The configure script will check for dfftw first and then fftw, and should do the right thing for either case. I'm not using wisdom in this implementation, but something we should consider for the future. Perhaps by adding a "fftw" interface that will allow tweaking the planner. For 1d fft of a matrix, there may be a small speedup by switching to the specific interface (specifying howmany and stride) instead of calling fftw many times for each column/row vector. Regards, Mumit --2006041544-959030623-987884450=:25502 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="octave-fftw.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Octave fftw interface dG9wbGV2ZWwvQ2hhbmdlTG9nOg0KDQoyMDAxLTA0LTIxICBNdW1pdCBLaGFu ICA8a2hhbkBuYW5vdGVjaC53aXNjLmVkdT4NCg0KCSogY29uZmlndXJlLmlu OiBTdXBwb3J0IGZvciAtLXdpdGgtZmZ0dy4NCgkoRkZUX0RJUiwgRkZUV19M SUJTKTogTmV3IHN1YnN0aXR1dGlvbnMuDQoJKiBNYWtlY29uZi5pbiAoRkZU V19MSUJTKTogTmV3IHZhcmlhYmxlLg0KCSogYWNjb25maWcuaCAoSEFWRV9G RlRXKTogTmV3IG1hY3JvLg0KDQpsaWJjcnVmdC9DaGFuZ2VMb2c6DQoNCjIw MDEtMDQtMjEgIE11bWl0IEtoYW4gIDxraGFuQG5hbm90ZWNoLndpc2MuZWR1 Pg0KDQoJKiBNYWtlZmlsZS5pbiAoQ1JVRlRfRElSUyk6IFN1YnN0aXR1dGUg QEZGVF9ESVJALiANCg0KbGlib2N0YXZlL0NoYW5nZUxvZzoNCg0KMjAwMS0w NC0yMSAgTXVtaXQgS2hhbiAgPGtoYW5AbmFub3RlY2gud2lzYy5lZHU+DQoN CgkqIG9jdC1mZnR3LmgsIG9jdC1mZnR3LmNjOiBOZXcgZmlsZXMuDQoJKiBN YWtlZmlsZS5pbiAoSU5DTFVERVMsIFNPVVJDRVMpOiBBZGQgbmV3IGZpbGVz Lg0KCSogQ01hdHJpeC5jYyAoQ29tcGxleE1hdHJpeDo6e2ZvdXJpZXIsIGlm b3VyaWVyLCBmb3VyaWVyMmQsIA0KCWlmb3VyaWVyMmR9KTogVXNlIGZmdHcg aWYgYXZhaWxhYmxlLg0KCSogZE1hdHJpeC5jYyAoTWF0cml4Ojp7Zm91cmll ciwgaWZvdXJpZXIsIGZvdXJpZXIyZCwgaWZvdXJpZXIyZH0pOiANCglMaWtl d2lzZS4NCg0Kc3JjL0NoYW5nZUxvZzoNCg0KMjAwMS0wNC0yMSAgTXVtaXQg S2hhbiAgPGtoYW5AbmFub3RlY2gud2lzYy5lZHU+DQoNCgkqIE1ha2VmaWxl LmluIChvY3RhdmUpOiBBZGQgJChGRlRXX0xJQlMpLg0KDQpJbmRleDogTWFr ZWNvbmYuaW4NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAv Y3ZzL29jdGF2ZS9NYWtlY29uZi5pbix2DQpyZXRyaWV2aW5nIHJldmlzaW9u IDEuMTExDQpkaWZmIC11IC0zIC1wIC1yMS4xMTEgTWFrZWNvbmYuaW4NCi0t LSBNYWtlY29uZi5pbgkyMDAxLzA0LzE5IDE5OjUwOjUzCTEuMTExDQorKysg TWFrZWNvbmYuaW4JMjAwMS8wNC8yMSAxOTo1ODo0Mw0KQEAgLTE1NSw2ICsx NTUsNyBAQCBMSUJPQ1RBVkUgPSBATElCT0NUQVZFQA0KIExJQkNSVUZUID0g QExJQkNSVUZUQA0KIA0KIEJMQVNfTElCUyA9IEBCTEFTX0xJQlNADQorRkZU V19MSUJTID0gQEZGVFdfTElCU0ANCiBMSUJTID0gQExJQlNADQogDQogIyBU aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuDQpJbmRleDogYWNj b25maWcuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9j dnMvb2N0YXZlL2FjY29uZmlnLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAx LjQ2DQpkaWZmIC11IC0zIC1wIC1yMS40NiBhY2NvbmZpZy5oDQotLS0gYWNj b25maWcuaAkyMDAxLzAyLzA3IDE4OjQ2OjM1CTEuNDYNCisrKyBhY2NvbmZp Zy5oCTIwMDEvMDQvMjEgMTk6NTg6NDMNCkBAIC01OCw2ICs1OCw5IEBADQog LyogRGVmaW5lIGlmIHlvdSBoYXZlIEJTRCBzdHlsZSBzaWduYWxzLiAqLw0K ICN1bmRlZiBIQVZFX0JTRF9TSUdOQUxTDQogDQorLyogRGVmaW5lIGlmIHlv dSBoYXZlIEZGVFcgaW5zdGFsbGVkLiAqLw0KKyN1bmRlZiBIQVZFX0ZGVFcN CisNCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggc3R5bGUgc2lnbmFs cy4gKi8NCiAjdW5kZWYgSEFWRV9QT1NJWF9TSUdOQUxTDQogDQpJbmRleDog Y29uZmlndXJlLmluDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmls ZTogL2N2cy9vY3RhdmUvY29uZmlndXJlLmluLHYNCnJldHJpZXZpbmcgcmV2 aXNpb24gMS4zNDINCmRpZmYgLXUgLTMgLXAgLXIxLjM0MiBjb25maWd1cmUu aW4NCi0tLSBjb25maWd1cmUuaW4JMjAwMS8wMy8wMSAxNjo1NDozMQkxLjM0 Mg0KKysrIGNvbmZpZ3VyZS5pbgkyMDAxLzA0LzIxIDE5OjU4OjQzDQpAQCAt MzU0LDYgKzM1NCwzOCBAQCBmaQ0KIA0KICMgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KIA0KKyMgQ2hlY2tzIGZvciBGRlRXIGhlYWRlciBhbmQgbGli cmFyeS4NCisNCisjIHN1YmRpcmVjdG9yaWVzIG9mIGxpYmNydWZ0IHRvIGJ1 aWxkIGlmIHRoZXkgYXJlbid0IGZvdW5kIG9uIHRoZSBzeXN0ZW06DQorRkZU X0RJUj0iZmZ0cGFjayINCitBQ19TVUJTVChGRlRfRElSKQ0KKw0KKyMgSW5z dGFsbGVkIGZmdHcgbGlicmFyeSwgaWYgYW55Lg0KK0ZGVFdfTElCUz0nJw0K K0FDX1NVQlNUKEZGVFdfTElCUykNCisNCitBQ19BUkdfV0lUSChmZnR3LCAN CisgIFsgIC0td2l0aC1mZnR3ICAgICAgICAgICAgIHVzZSBpbnN0YWxsZWQg ZmZ0dyBpbnN0ZWFkIG9mIGluY2x1ZGVkIGZmdHBhY2tdLA0KKyAgd2l0aF9m ZnR3PXllcywgd2l0aF9mZnR3PW5vKQ0KKw0KK2lmIHRlc3QgIiR3aXRoX2Zm dHciID0gInllcyI7IHRoZW4NCisgIEFDX0NIRUNLX0hFQURFUlMoZGZmdHcu aCBmZnR3LmgpDQorICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX2RmZnR3X2gi ID0geWVzIFwNCisgICAgICB8fCB0ZXN0ICIkYWNfY3ZfaGVhZGVyX2ZmdHdf aCIgPSB5ZXM7IHRoZW4NCisgICAgQUNfQ0hFQ0tfTElCKGRmZnR3LCBmZnR3 X2NyZWF0ZV9wbGFuLCBGRlRXX0xJQlM9Ii1sZGZmdHciLA0KKyAgICAgIFtB Q19DSEVDS19MSUIoZmZ0dywgZmZ0d19jcmVhdGVfcGxhbiwgRkZUV19MSUJT PSItbGZmdHciLCB3aXRoX2ZmdHc9bm8pXSkNCisgIGVsc2UNCisgICAgd2l0 aF9mZnR3PW5vDQorICBmaQ0KK2ZpDQorDQoraWYgdGVzdCAiJHdpdGhfZmZ0 dyIgPSB5ZXM7IHRoZW4NCisgIEZGVF9ESVI9JycNCisgIEFDX0RFRklORShI QVZFX0ZGVFcpDQorZmkNCisNCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0NCisNCiAjIyMgV2UgbmVlZCB0aGVzZSBiZWZvcmUgdHJ5aW5nIHRvIGZp bmQgbGliZjJjLg0KIA0KIE9DVEFWRV9QUk9HX0FSDQpJbmRleDogbGliY3J1 ZnQvTWFrZWZpbGUuaW4NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm aWxlOiAvY3ZzL29jdGF2ZS9saWJjcnVmdC9NYWtlZmlsZS5pbix2DQpyZXRy aWV2aW5nIHJldmlzaW9uIDEuNjkNCmRpZmYgLXUgLTMgLXAgLXIxLjY5IE1h a2VmaWxlLmluDQotLS0gbGliY3J1ZnQvTWFrZWZpbGUuaW4JMjAwMS8wMy8y NyAxOToxMjo1OAkxLjY5DQorKysgbGliY3J1ZnQvTWFrZWZpbGUuaW4JMjAw MS8wNC8yMSAxOTo1ODo0Mw0KQEAgLTI4LDcgKzI4LDcgQEAgSU5TVEFMTF9E QVRBID0gQElOU1RBTExfREFUQUANCiAjIGUuZy4gaWYgdGhleSBhcmUgYWxy ZWFkeSBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uICBGb3IgdGhlc2UsIHRoZWly DQogIyBkaXJuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IGNvbmZpZ3VyZSBhbmQg bWF5IGJlIHRoZSBlbXB0eSBzdHJpbmcuDQogDQotQ1JVRlRfRElSUyA9IGFt b3MgQEJMQVNfRElSQCBibGFzLXh0cmEgZGFzc2wgZmZ0cGFjayBATEFQQUNL X0RJUkAgXA0KK0NSVUZUX0RJUlMgPSBhbW9zIEBCTEFTX0RJUkAgYmxhcy14 dHJhIGRhc3NsIEBGRlRfRElSQCBATEFQQUNLX0RJUkAgXA0KIAlsYXBhY2st eHRyYSBsaW5wYWNrIG1pbnBhY2sgbWlzYyBvZGVwYWNrIG9yZGVyZWQtcXog cXVhZHBhY2sgXA0KIAlyYW5saWIgc2xhdGVjLWVyciBzbGF0ZWMtZm4gdmls bGFkDQogDQpJbmRleDogbGlib2N0YXZlL0NNYXRyaXguY2MNCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL29jdGF2ZS9saWJvY3Rh dmUvQ01hdHJpeC5jYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNzcNCmRp ZmYgLXUgLTMgLXAgLXIxLjc3IENNYXRyaXguY2MNCi0tLSBsaWJvY3RhdmUv Q01hdHJpeC5jYwkyMDAxLzAxLzMxIDIyOjE1OjUyCTEuNzcNCisrKyBsaWJv Y3RhdmUvQ01hdHJpeC5jYwkyMDAxLzA0LzIxIDE5OjU4OjQzDQpAQCAtNTUs NiArNTUsMTAgQEAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBs YWNlIC0gUw0KICNpbmNsdWRlICJteC1pbmxpbmVzLmNjIg0KICNpbmNsdWRl ICJvY3QtY21wbHguaCINCiANCisjaWZkZWYgSEFWRV9GRlRXDQorIyBpbmNs dWRlICJvY3QtZmZ0dy5oIg0KKyNlbmRpZg0KKw0KIC8vIEZvcnRyYW4gZnVu Y3Rpb25zIHdlIGNhbGwuDQogDQogZXh0ZXJuICJDIg0KQEAgLTk1NCw2ICs5 NTgsOCBAQCBDb21wbGV4TWF0cml4Ojpwc2V1ZG9faW52ZXJzZSAoZG91Ymxl IHRvDQogICByZXR1cm4gcmV0dmFsOw0KIH0NCiANCisjaWZuZGVmIEhBVkVf RkZUVw0KKw0KIENvbXBsZXhNYXRyaXgNCiBDb21wbGV4TWF0cml4Ojpmb3Vy aWVyICh2b2lkKSBjb25zdA0KIHsNCkBAIC0xMTUzLDYgKzExNTksMTAyIEBA IENvbXBsZXhNYXRyaXg6Omlmb3VyaWVyMmQgKHZvaWQpIGNvbnN0DQogDQog ICByZXR1cm4gcmV0dmFsOw0KIH0NCisNCisjZWxzZSAvKiAhIEhBVkVfRkZU VyAqLw0KKw0KK0NvbXBsZXhNYXRyaXgNCitDb21wbGV4TWF0cml4Ojpmb3Vy aWVyICh2b2lkKSBjb25zdA0KK3sNCisgIHNpemVfdCBuciA9IHJvd3MgKCk7 DQorICBzaXplX3QgbmMgPSBjb2xzICgpOw0KKw0KKyAgQ29tcGxleE1hdHJp eCByZXR2YWwgKG5yLCBuYyk7DQorDQorICBzaXplX3QgbnB0cywgbnNhbXBs ZXM7DQorDQorICBpZiAobnIgPT0gMSB8fCBuYyA9PSAxKQ0KKyAgICB7DQor ICAgICAgbnB0cyA9IG5yID4gbmMgPyBuciA6IG5jOw0KKyAgICAgIG5zYW1w bGVzID0gMTsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgbnB0 cyA9IG5yOw0KKyAgICAgIG5zYW1wbGVzID0gbmM7DQorICAgIH0NCisNCisg IGNvbnN0IENvbXBsZXggKmluIChkYXRhICgpKTsNCisgIENvbXBsZXggKm91 dCAocmV0dmFsLmZvcnRyYW5fdmVjICgpKTsNCisNCisgIGZvciAoc2l6ZV90 IGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKykNCisgICAgew0KKyAgICAgIG9j dGF2ZV9mZnR3OjpmZnQgKCZpbltucHRzICogaV0sICZvdXRbbnB0cyAqIGld LCBucHRzKTsNCisgICAgfQ0KKw0KKyAgcmV0dXJuIHJldHZhbDsNCit9DQor DQorQ29tcGxleE1hdHJpeA0KK0NvbXBsZXhNYXRyaXg6Omlmb3VyaWVyICh2 b2lkKSBjb25zdA0KK3sNCisgIHNpemVfdCBuciA9IHJvd3MgKCk7DQorICBz aXplX3QgbmMgPSBjb2xzICgpOw0KKw0KKyAgQ29tcGxleE1hdHJpeCByZXR2 YWwgKG5yLCBuYyk7DQorDQorICBzaXplX3QgbnB0cywgbnNhbXBsZXM7DQor DQorICBpZiAobnIgPT0gMSB8fCBuYyA9PSAxKQ0KKyAgICB7DQorICAgICAg bnB0cyA9IG5yID4gbmMgPyBuciA6IG5jOw0KKyAgICAgIG5zYW1wbGVzID0g MTsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgbnB0cyA9IG5y Ow0KKyAgICAgIG5zYW1wbGVzID0gbmM7DQorICAgIH0NCisNCisgIGNvbnN0 IENvbXBsZXggKmluIChkYXRhICgpKTsNCisgIENvbXBsZXggKm91dCAocmV0 dmFsLmZvcnRyYW5fdmVjICgpKTsNCisNCisgIGZvciAoc2l6ZV90IGkgPSAw OyBpIDwgbnNhbXBsZXM7IGkrKykNCisgICAgew0KKyAgICAgIG9jdGF2ZV9m ZnR3OjppZmZ0ICgmaW5bbnB0cyAqIGldLCAmb3V0W25wdHMgKiBpXSwgbnB0 cyk7DQorICAgIH0NCisNCisgIHJldHVybiByZXR2YWw7DQorfQ0KKw0KK0Nv bXBsZXhNYXRyaXgNCitDb21wbGV4TWF0cml4Ojpmb3VyaWVyMmQgKHZvaWQp IGNvbnN0DQorew0KKyAgaW50IG5yID0gcm93cyAoKTsNCisgIGludCBuYyA9 IGNvbHMgKCk7DQorDQorICBDb21wbGV4TWF0cml4IHJldHZhbCAoKnRoaXMp Ow0KKyAgLy8gTm90ZSB0aGUgb3JkZXIgb2YgcGFzc2luZyB0aGUgcm93cyBh bmQgY29sdW1ucyB0byBhY2NvdW50IGZvcg0KKyAgLy8gY29sdW1uLW1ham9y IHN0b3JhZ2UuDQorICBvY3RhdmVfZmZ0dzo6ZmZ0MmQgKHJldHZhbC5mb3J0 cmFuX3ZlYyAoKSwgbmMsIG5yKTsNCisNCisgIHJldHVybiByZXR2YWw7DQor fQ0KKw0KK0NvbXBsZXhNYXRyaXgNCitDb21wbGV4TWF0cml4OjppZm91cmll cjJkICh2b2lkKSBjb25zdA0KK3sNCisgIGludCBuciA9IHJvd3MgKCk7DQor ICBpbnQgbmMgPSBjb2xzICgpOw0KKw0KKyAgQ29tcGxleE1hdHJpeCByZXR2 YWwgKCp0aGlzKTsNCisgIC8vIE5vdGUgdGhlIG9yZGVyIG9mIHBhc3Npbmcg dGhlIHJvd3MgYW5kIGNvbHVtbnMgdG8gYWNjb3VudCBmb3INCisgIC8vIGNv bHVtbi1tYWpvciBzdG9yYWdlLg0KKyAgb2N0YXZlX2ZmdHc6OmlmZnQyZCAo cmV0dmFsLmZvcnRyYW5fdmVjICgpLCBuYywgbnIpOw0KKw0KKyAgcmV0dXJu IHJldHZhbDsNCit9DQorDQorI2VuZGlmIC8qICEgSEFWRV9GRlRXICovDQog DQogQ29tcGxleERFVA0KIENvbXBsZXhNYXRyaXg6OmRldGVybWluYW50ICh2 b2lkKSBjb25zdA0KSW5kZXg6IGxpYm9jdGF2ZS9NYWtlZmlsZS5pbg0KPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0YXZlL2xp Ym9jdGF2ZS9NYWtlZmlsZS5pbix2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEu MTM2DQpkaWZmIC11IC0zIC1wIC1yMS4xMzYgTWFrZWZpbGUuaW4NCi0tLSBs aWJvY3RhdmUvTWFrZWZpbGUuaW4JMjAwMS8wMi8wNiAwMTo1NzowMQkxLjEz Ng0KKysrIGxpYm9jdGF2ZS9NYWtlZmlsZS5pbgkyMDAxLzA0LzIxIDE5OjU4 OjQzDQpAQCAtNTEsOSArNTEsOSBAQCBJTkNMVURFUyA6PSBCb3VuZHMuaCBD b2xsb2NXdC5oIERBRS5oIERBDQogCWRpci1vcHMuaCBmaWxlLW9wcy5oIGZp bGUtc3RhdC5oIGdldG9wdC5oIGdsb2ItbWF0Y2guaCBcDQogCWlkeC12ZWN0 b3IuaCBsby1pZWVlLmggbG8tbWFwcGVycy5oIGxvLXNwZWNmdW4uaCBsby1z eXNkZXAuaCBcDQogCWxvLXV0aWxzLmggbWFjaC1pbmZvLmggb2N0LWFsbG9j Lmggb2N0LWNtcGx4Lmggb2N0LWVudi5oIFwNCi0Jb2N0LWdldG9wdC5oIG9j dC1ncm91cC5oIG9jdC1rcHNlLmggb2N0LXBhc3N3ZC5oIG9jdC1ybC1lZGl0 LmggXA0KLQlvY3QtcmwtaGlzdC5oIG9jdC1zaGxpYi5oIG9jdC1zeXNjYWxs cy5oIG9jdC10aW1lLmggcGF0aGxlbi5oIFwNCi0JcGF0aHNlYXJjaC5oIHBy b2ctYXJncy5oIHN0YXRkZWZzLmggc3RyLXZlYy5oIHN1bi11dGlscy5oIFwN CisJb2N0LWZmdHcuaCBvY3QtZ2V0b3B0Lmggb2N0LWdyb3VwLmggb2N0LWtw c2UuaCBvY3QtcGFzc3dkLmggXA0KKwlvY3QtcmwtZWRpdC5oIG9jdC1ybC1o aXN0Lmggb2N0LXNobGliLmggb2N0LXN5c2NhbGxzLmggb2N0LXRpbWUuaCBc DQorCXBhdGhsZW4uaCBwYXRoc2VhcmNoLmggcHJvZy1hcmdzLmggc3RhdGRl ZnMuaCBzdHItdmVjLmggc3VuLXV0aWxzLmggXA0KIAlzeXNkaXIuaCBzeXN0 aW1lLmggc3lzd2FpdC5oIFwNCiAJJChNQVRSSVhfSU5DKSBcDQogCSQoTVhf T1BfSU5DKSBcDQpAQCAtOTAsMTAgKzkwLDEwIEBAIFNPVVJDRVMgOj0gQm91 bmRzLmNjIENvbGxvY1d0LmNjIERBRS5jYyANCiAJZmlsZS1zdGF0LmNjIGZp bGVtb2RlLmMgZ2V0b3B0LmMgZ2V0b3B0MS5jIGdsb2ItbWF0Y2guY2MgXA0K IAlpZHgtdmVjdG9yLmNjIGxvLWN1dGlscy5jIGxvLWllZWUuY2MgbG8tbWFw cGVycy5jYyBsby1zcGVjZnVuLmNjIFwNCiAJbG8tc3lzZGVwLmNjIGxvLXV0 aWxzLmNjIG1hY2gtaW5mby5jYyBta2Rpci5jIG9jdC1hbGxvYy5jYyBcDQot CW9jdC1lbnYuY2Mgb2N0LWdldG9wdC5jIG9jdC1ncm91cC5jYyBvY3Qta3Bz ZS5jIG9jdC1wYXNzd2QuY2MgXA0KLQlvY3QtcmwtZWRpdC5jIG9jdC1ybC1o aXN0LmMgb2N0LXNobGliLmNjIG9jdC1zeXNjYWxscy5jYyBcDQotCW9jdC10 aW1lLmNjIHBhdGhzZWFyY2guY2MgcHJvZy1hcmdzLmNjIHJlbmFtZS5jIHJt ZGlyLmMgXA0KLQlzdHJmdGltZS5jIHN0cnB0aW1lLmMgc3RyLXZlYy5jYyB0 ZW1wbmFtZS5jIHRlbXBuYW0uYyBcDQorCW9jdC1lbnYuY2Mgb2N0LWZmdHcu Y2Mgb2N0LWdldG9wdC5jIG9jdC1ncm91cC5jYyBvY3Qta3BzZS5jIFwNCisJ b2N0LXBhc3N3ZC5jYyBvY3QtcmwtZWRpdC5jIG9jdC1ybC1oaXN0LmMgb2N0 LXNobGliLmNjIFwNCisJb2N0LXN5c2NhbGxzLmNjIG9jdC10aW1lLmNjIHBh dGhzZWFyY2guY2MgcHJvZy1hcmdzLmNjIHJlbmFtZS5jIFwNCisJcm1kaXIu YyBzdHJmdGltZS5jIHN0cnB0aW1lLmMgc3RyLXZlYy5jYyB0ZW1wbmFtZS5j IHRlbXBuYW0uYyBcDQogCSQoVEVNUExBVEVfU1JDKSBcDQogCSQoVElfU1JD KSBcDQogCSQoTUFUUklYX1NSQykgXA0KSW5kZXg6IGxpYm9jdGF2ZS9kTWF0 cml4LmNjDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2 cy9vY3RhdmUvbGlib2N0YXZlL2RNYXRyaXguY2Msdg0KcmV0cmlldmluZyBy ZXZpc2lvbiAxLjgxDQpkaWZmIC11IC0zIC1wIC1yMS44MSBkTWF0cml4LmNj DQotLS0gbGlib2N0YXZlL2RNYXRyaXguY2MJMjAwMS8wMS8zMSAyMjoxNTo1 MwkxLjgxDQorKysgbGlib2N0YXZlL2RNYXRyaXguY2MJMjAwMS8wNC8yMSAx OTo1ODo0Mw0KQEAgLTUwLDYgKzUwLDEwIEBAIFNvZnR3YXJlIEZvdW5kYXRp b24sIDU5IFRlbXBsZSBQbGFjZSAtIFMNCiAjaW5jbHVkZSAibXgtaW5saW5l cy5jYyINCiAjaW5jbHVkZSAib2N0LWNtcGx4LmgiDQogDQorI2lmZGVmIEhB VkVfRkZUVw0KKyMgaW5jbHVkZSAib2N0LWZmdHcuaCINCisjZW5kaWYNCisN CiAvLyBGb3J0cmFuIGZ1bmN0aW9ucyB3ZSBjYWxsLg0KIA0KIGV4dGVybiAi QyINCkBAIC02NDgsNiArNjUyLDggQEAgTWF0cml4Ojpwc2V1ZG9faW52ZXJz ZSAoZG91YmxlIHRvbCkNCiAgICAgfQ0KIH0NCiANCisjaWZuZGVmIEhBVkVf RkZUVw0KKw0KIENvbXBsZXhNYXRyaXgNCiBNYXRyaXg6OmZvdXJpZXIgKHZv aWQpIGNvbnN0DQogew0KQEAgLTg0OCw2ICs4NTQsMTAzIEBAIE1hdHJpeDo6 aWZvdXJpZXIyZCAodm9pZCkgY29uc3QNCiAgIHJldHVybiByZXR2YWw7DQog fQ0KIA0KKyNlbHNlIC8qICEgSEFWRV9GRlRXICovDQorDQorQ29tcGxleE1h dHJpeA0KK01hdHJpeDo6Zm91cmllciAodm9pZCkgY29uc3QNCit7DQorICBz aXplX3QgbnIgPSByb3dzICgpOw0KKyAgc2l6ZV90IG5jID0gY29scyAoKTsN CisNCisgIENvbXBsZXhNYXRyaXggcmV0dmFsIChuciwgbmMpOw0KKw0KKyAg c2l6ZV90IG5wdHMsIG5zYW1wbGVzOw0KKw0KKyAgaWYgKG5yID09IDEgfHwg bmMgPT0gMSkNCisgICAgew0KKyAgICAgIG5wdHMgPSBuciA+IG5jID8gbnIg OiBuYzsNCisgICAgICBuc2FtcGxlcyA9IDE7DQorICAgIH0NCisgIGVsc2UN CisgICAgew0KKyAgICAgIG5wdHMgPSBucjsNCisgICAgICBuc2FtcGxlcyA9 IG5jOw0KKyAgICB9DQorDQorICBDb21wbGV4TWF0cml4IHRtcCAoKnRoaXMp Ow0KKyAgQ29tcGxleCAqaW4gKHRtcC5mb3J0cmFuX3ZlYyAoKSk7DQorICBD b21wbGV4ICpvdXQgKHJldHZhbC5mb3J0cmFuX3ZlYyAoKSk7DQorDQorICBm b3IgKHNpemVfdCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyspDQorICAgIHsN CisgICAgICBvY3RhdmVfZmZ0dzo6ZmZ0ICgmaW5bbnB0cyAqIGldLCAmb3V0 W25wdHMgKiBpXSwgbnB0cyk7DQorICAgIH0NCisNCisgIHJldHVybiByZXR2 YWw7DQorfQ0KKw0KK0NvbXBsZXhNYXRyaXgNCitNYXRyaXg6Omlmb3VyaWVy ICh2b2lkKSBjb25zdA0KK3sNCisgIHNpemVfdCBuciA9IHJvd3MgKCk7DQor ICBzaXplX3QgbmMgPSBjb2xzICgpOw0KKw0KKyAgQ29tcGxleE1hdHJpeCBy ZXR2YWwgKG5yLCBuYyk7DQorDQorICBzaXplX3QgbnB0cywgbnNhbXBsZXM7 DQorDQorICBpZiAobnIgPT0gMSB8fCBuYyA9PSAxKQ0KKyAgICB7DQorICAg ICAgbnB0cyA9IG5yID4gbmMgPyBuciA6IG5jOw0KKyAgICAgIG5zYW1wbGVz ID0gMTsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgbnB0cyA9 IG5yOw0KKyAgICAgIG5zYW1wbGVzID0gbmM7DQorICAgIH0NCisNCisgIENv bXBsZXhNYXRyaXggdG1wICgqdGhpcyk7DQorICBDb21wbGV4ICppbiAodG1w LmZvcnRyYW5fdmVjICgpKTsNCisgIENvbXBsZXggKm91dCAocmV0dmFsLmZv cnRyYW5fdmVjICgpKTsNCisNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg bnNhbXBsZXM7IGkrKykNCisgICAgew0KKyAgICAgIG9jdGF2ZV9mZnR3Ojpp ZmZ0ICgmaW5bbnB0cyAqIGldLCAmb3V0W25wdHMgKiBpXSwgbnB0cyk7DQor ICAgIH0NCisNCisgIHJldHVybiByZXR2YWw7DQorfQ0KKw0KK0NvbXBsZXhN YXRyaXgNCitNYXRyaXg6OmZvdXJpZXIyZCAodm9pZCkgY29uc3QNCit7DQor ICBpbnQgbnIgPSByb3dzICgpOw0KKyAgaW50IG5jID0gY29scyAoKTsNCisN CisgIENvbXBsZXhNYXRyaXggcmV0dmFsICgqdGhpcyk7DQorICAvLyBOb3Rl IHRoZSBvcmRlciBvZiBwYXNzaW5nIHRoZSByb3dzIGFuZCBjb2x1bW5zIHRv IGFjY291bnQgZm9yDQorICAvLyBjb2x1bW4tbWFqb3Igc3RvcmFnZS4NCisg IG9jdGF2ZV9mZnR3OjpmZnQyZCAocmV0dmFsLmZvcnRyYW5fdmVjICgpLCBu YywgbnIpOw0KKw0KKyAgcmV0dXJuIHJldHZhbDsNCit9DQorDQorQ29tcGxl eE1hdHJpeA0KK01hdHJpeDo6aWZvdXJpZXIyZCAodm9pZCkgY29uc3QNCit7 DQorICBpbnQgbnIgPSByb3dzICgpOw0KKyAgaW50IG5jID0gY29scyAoKTsN CisNCisgIENvbXBsZXhNYXRyaXggcmV0dmFsICgqdGhpcyk7DQorICAvLyBO b3RlIHRoZSBvcmRlciBvZiBwYXNzaW5nIHRoZSByb3dzIGFuZCBjb2x1bW5z IHRvIGFjY291bnQgZm9yDQorICAvLyBjb2x1bW4tbWFqb3Igc3RvcmFnZS4N CisgIG9jdGF2ZV9mZnR3OjppZmZ0MmQgKHJldHZhbC5mb3J0cmFuX3ZlYyAo KSwgbmMsIG5yKTsNCisNCisgIHJldHVybiByZXR2YWw7DQorfQ0KKw0KKyNl bmRpZiAvKiAhIEhBVkVfRkZUVyAqLw0KIERFVA0KIE1hdHJpeDo6ZGV0ZXJt aW5hbnQgKHZvaWQpIGNvbnN0DQogew0KSW5kZXg6IHNyYy9NYWtlZmlsZS5p bg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0 YXZlL3NyYy9NYWtlZmlsZS5pbix2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEu MjYwDQpkaWZmIC11IC0zIC1wIC1yMS4yNjAgTWFrZWZpbGUuaW4NCi0tLSBz cmMvTWFrZWZpbGUuaW4JMjAwMS8wMy8wMSAxNjo1NDozMgkxLjI2MA0KKysr IHNyYy9NYWtlZmlsZS5pbgkyMDAxLzA0LzIxIDE5OjU4OjQ0DQpAQCAtMjU5 LDcgKzI1OSw3IEBAIG9jdGF2ZTogc3RhbXAtcHJlcmVxICQoTElCUkFSSUVT KSBzdGFtcC0NCiAJb2N0YXZlLm8gYnVpbHRpbnMubyBvcHMubyAkKFhFUkJM QSkgJChETERfU1RBVElDX09CSikgXA0KIAkkKE9DVEFWRV9MRkxBR1MpIFwN CiAJJChPQ1RBVkVfTElCUykgXA0KLQkkKExFWExJQikgJChURVJNTElCUykg JChCTEFTX0xJQlMpICQoTElCUykgJChGTElCUykNCisJJChMRVhMSUIpICQo VEVSTUxJQlMpICQoQkxBU19MSUJTKSAkKEZGVFdfTElCUykgJChMSUJTKSAk KEZMSUJTKQ0KIA0KIHN0bXAtcGljOiBwaWMNCiAJQGlmIFsgLWYgc3RtcC1w aWMgXTsgdGhlbiBcDQoNCi0tLSBsaWJvY3RhdmUvb2N0LWZmdHcuaC5vcmln CVNhdCBBcHIgMjEgMTQ6NTg6MzEgMjAwMQ0KKysrIGxpYm9jdGF2ZS9vY3Qt ZmZ0dy5oCVNhdCBBcHIgMjEgMTE6Mzk6MDcgMjAwMQ0KQEAgLTAsMCArMSw1 NiBAQA0KKy8qDQorDQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgT2N0YXZlLg0K Kw0KK09jdGF2ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0DQordW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlDQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQ0KK2xhdGVyIHZlcnNp b24uDQorDQorT2N0YXZlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUDQorQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVS Q0hBTlRBQklMSVRZIG9yDQorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQor Zm9yIG1vcmUgZGV0YWlscy4NCisNCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0K K2Fsb25nIHdpdGggT2N0YXZlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElm IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUNCitTb2Z0d2FyZSBGb3VuZGF0aW9u LCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAy MTExLTEzMDcsIFVTQS4NCisNCisqLw0KKw0KKyNpZiAhZGVmaW5lZCAob2N0 YXZlX29jdF9mZnR3X2gpDQorI2RlZmluZSBvY3RhdmVfb2N0X2ZmdHdfaCAx DQorDQorI2luY2x1ZGUgPGNzdGRkZWY+DQorI2lmZGVmIEhBVkVfREZGVFdf SA0KKyMgaW5jbHVkZSA8ZGZmdHcuaD4NCisjZWxzZQ0KKyMgaW5jbHVkZSA8 ZmZ0dy5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJvY3QtY21wbHguaCIN CisNCitjbGFzcw0KK29jdGF2ZV9mZnR3DQorew0KK3B1YmxpYzoNCisgIHN0 YXRpYyBpbnQgZmZ0IChjb25zdCBDb21wbGV4KiwgQ29tcGxleCAqLCBzaXpl X3QpOw0KKyAgc3RhdGljIGludCBpZmZ0IChjb25zdCBDb21wbGV4KiwgQ29t cGxleCAqLCBzaXplX3QpOw0KKw0KKyAgc3RhdGljIGludCBmZnQyZCAoQ29t cGxleCosIHNpemVfdCwgc2l6ZV90KTsNCisgIHN0YXRpYyBpbnQgaWZmdDJk IChDb21wbGV4Kiwgc2l6ZV90LCBzaXplX3QpOw0KKw0KK3ByaXZhdGU6DQor ICBvY3RhdmVfZmZ0dyAoKTsNCisgIG9jdGF2ZV9mZnR3IChjb25zdCBvY3Rh dmVfZmZ0dyYpOw0KKyAgb2N0YXZlX2ZmdHcmIG9wZXJhdG9yID0gKGNvbnN0 IG9jdGF2ZV9mZnR3Jik7DQorfTsNCisNCisjZW5kaWYvKm9jdGF2ZV9vY3Rf ZmZ0d19oKi8NCisNCisvKg0KKzs7OyBMb2NhbCBWYXJpYWJsZXM6ICoqKg0K Kzs7OyBtb2RlOiBDKysgKioqDQorOzs7IEVuZDogKioqDQorKi8NCisNCi0t LSBsaWJvY3RhdmUvb2N0LWZmdHcuY2Mub3JpZwlTYXQgQXByIDIxIDE0OjU4 OjMzIDIwMDENCisrKyBsaWJvY3RhdmUvb2N0LWZmdHcuY2MJU2F0IEFwciAy MSAxMjo0MDozMSAyMDAxDQpAQCAtMCwwICsxLDE4MyBAQA0KKy8qDQorDQor VGhpcyBmaWxlIGlzIHBhcnQgb2YgT2N0YXZlLg0KKw0KK09jdGF2ZSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5IGl0DQordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlDQorRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQg eW91ciBvcHRpb24pIGFueQ0KK2xhdGVyIHZlcnNpb24uDQorDQorT2N0YXZl IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsIGJ1dCBXSVRIT1VUDQorQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9y DQorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorZm9yIG1vcmUgZGV0YWls cy4NCisNCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KK2Fsb25nIHdpdGggT2N0 YXZlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8g dGhlIEZyZWUNCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxh Y2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4N CisNCisqLw0KKw0KKyNpZmRlZiBIQVZFX0NPTkZJR19IDQorIyBpbmNsdWRl IDxjb25maWcuaD4NCisjZW5kaWYNCisNCisjaWZkZWYgSEFWRV9GRlRXDQor DQorI2luY2x1ZGUgIm9jdC1mZnR3LmgiDQorI2luY2x1ZGUgImxvLWVycm9y LmgiDQorDQorLy8NCisvLyBIZWxwZXIgY2xhc3MgdG8gY3JlYXRlIGFuZCBj YWNoZSBmZnR3IHBsYW5zIGZvciBib3RoIDFkIGFuZCAyZC4gVGhpcw0KKy8v IGltcGxlbWVudGF0aW9uIHVzZXMgRkZUV19FU1RJTUFURSB0byBjcmVhdGUg dGhlIHBsYW5zLCB3aGljaCBpbiB0aGVvcnkNCisvLyBpcyBzdWJvcHRpbWFs LCBidXQgcHJvdmlkZXMgcXVpdGUgcmVhc29uYWJsZSBwZXJmb3JtYW5jZS4g RnV0dXJlDQorLy8gZW5oYW5jZW1lbnQgd2lsbCBiZSB0byBhZGQgYSBkeW5h bWljYWxseSBsb2FkYWJsZSBpbnRlcmZhY2UgKCJmZnR3IikNCisvLyB0byBt YW5pcHVsYXRlIGZmdHcgd2lzZG9tIHNvIHRoYXQgdXNlcnMgbWF5IGNob29z ZSB0aGUgYXBwcm9wcmlhdGUNCisvLyBwbGFubmVyLg0KKy8vDQorY2xhc3MN CitvY3RhdmVfZmZ0d19wbGFubmVyDQorew0KK3B1YmxpYzoNCisgIG9jdGF2 ZV9mZnR3X3BsYW5uZXIgKCk7DQorDQorICBmZnR3X3BsYW4gY3JlYXRlX3Bs YW4gKGZmdHdfZGlyZWN0aW9uLCBzaXplX3QpOw0KKyAgZmZ0d25kX3BsYW4g Y3JlYXRlX3BsYW4yZCAoZmZ0d19kaXJlY3Rpb24sIHNpemVfdCwgc2l6ZV90 KTsNCisNCitwcml2YXRlOg0KKyAgaW50IHBsYW5fZmxhZ3M7DQorDQorICBm ZnR3X3BsYW4gcGxhblsyXTsNCisgIGZmdHduZF9wbGFuIHBsYW4yZFsyXTsN CisNCisgIHNpemVfdCBuWzJdOw0KKyAgc2l6ZV90IG4yZFsyXVsyXTsNCit9 Ow0KKw0KK29jdGF2ZV9mZnR3X3BsYW5uZXI6Om9jdGF2ZV9mZnR3X3BsYW5u ZXIgKCkNCit7DQorICBwbGFuX2ZsYWdzID0gRkZUV19FU1RJTUFURTsNCisN CisgIHBsYW5bMF0gPSBwbGFuWzFdID0gMDsNCisgIHBsYW4yZFswXSA9IHBs YW4yZFsxXSA9IDA7DQorICANCisgIG5bMF0gPSBuWzFdID0gMDsNCisgIG4y ZFswXVswXSA9IG4yZFswXVsxXSA9IG4yZFsxXVswXSA9IG4yZFsxXVsxXSA9 IDA7DQorfQ0KKw0KK2ZmdHdfcGxhbg0KK29jdGF2ZV9mZnR3X3BsYW5uZXI6 OmNyZWF0ZV9wbGFuIChmZnR3X2RpcmVjdGlvbiBkaXIsIHNpemVfdCBucHRz KQ0KK3sNCisgIHNpemVfdCB3aGljaCA9IChkaXIgPT0gRkZUV19GT1JXQVJE KSA/IDAgOiAxOw0KKyAgZmZ0d19wbGFuICpjdXJfcGxhbl9wID0gJnBsYW5b d2hpY2hdOw0KKyAgYm9vbCBjcmVhdGVfbmV3X3BsYW4gPSBmYWxzZTsNCisN CisgIGlmIChwbGFuW3doaWNoXSA9PSAwIHx8IG5bd2hpY2hdICE9IG5wdHMp DQorICAgIHsNCisgICAgICBjcmVhdGVfbmV3X3BsYW4gPSB0cnVlOw0KKyAg ICAgIG5bd2hpY2hdID0gbnB0czsNCisgICAgfQ0KKw0KKyAgaWYgKGNyZWF0 ZV9uZXdfcGxhbikNCisgICAgew0KKyAgICAgIGlmICgqY3VyX3BsYW5fcCkN CisJZmZ0d19kZXN0cm95X3BsYW4gKCpjdXJfcGxhbl9wKTsNCisgICAgICAq Y3VyX3BsYW5fcCA9IGZmdHdfY3JlYXRlX3BsYW4gKG5wdHMsIGRpciwgcGxh bl9mbGFncyk7DQorICAgICAgaWYgKCpjdXJfcGxhbl9wID09IDApDQorCSgq Y3VycmVudF9saWJvY3RhdmVfZXJyb3JfaGFuZGxlcikgKCJFcnJvciBjcmVh dGluZyBmZnR3IHBsYW4iKTsNCisgICAgfQ0KKw0KKyAgcmV0dXJuICpjdXJf cGxhbl9wOw0KK30NCisgDQorZmZ0d25kX3BsYW4NCitvY3RhdmVfZmZ0d19w bGFubmVyOjpjcmVhdGVfcGxhbjJkIChmZnR3X2RpcmVjdGlvbiBkaXIsIA0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5y b3dzLCBzaXplX3QgbmNvbHMpDQorew0KKyAgc2l6ZV90IHdoaWNoID0gKGRp ciA9PSBGRlRXX0ZPUldBUkQpID8gMCA6IDE7DQorICBmZnR3bmRfcGxhbiAq Y3VyX3BsYW5fcCA9ICZwbGFuMmRbd2hpY2hdOw0KKyAgYm9vbCBjcmVhdGVf bmV3X3BsYW4gPSBmYWxzZTsNCisNCisgIGlmIChwbGFuMmRbd2hpY2hdID09 IDAgfHwgbjJkW3doaWNoXVswXSAhPSBucm93cyB8fCBuMmRbd2hpY2hdWzFd ICE9IG5jb2xzKQ0KKyAgICB7DQorICAgICAgY3JlYXRlX25ld19wbGFuID0g dHJ1ZTsNCisgICAgICBuMmRbd2hpY2hdWzBdID0gbnJvd3M7DQorICAgICAg bjJkW3doaWNoXVsxXSA9IG5jb2xzOw0KKyAgICB9DQorDQorICBpZiAoY3Jl YXRlX25ld19wbGFuKQ0KKyAgICB7DQorICAgICAgaWYgKCpjdXJfcGxhbl9w KQ0KKwlmZnR3bmRfZGVzdHJveV9wbGFuICgqY3VyX3BsYW5fcCk7DQorICAg ICAgKmN1cl9wbGFuX3AgPSBmZnR3MmRfY3JlYXRlX3BsYW4gKG5yb3dzLCBu Y29scywgZGlyLCANCisJCQkJCXBsYW5fZmxhZ3MgfCBGRlRXX0lOX1BMQUNF KTsNCisgICAgICBpZiAoKmN1cl9wbGFuX3AgPT0gMCkNCisJKCpjdXJyZW50 X2xpYm9jdGF2ZV9lcnJvcl9oYW5kbGVyKSAoIkVycm9yIGNyZWF0aW5nIDJk IGZmdHcgcGxhbiIpOw0KKyAgICB9DQorDQorICByZXR1cm4gKmN1cl9wbGFu X3A7DQorfQ0KKw0KK3N0YXRpYyBvY3RhdmVfZmZ0d19wbGFubmVyIGZmdHdf cGxhbm5lcjsNCisNCitpbnQNCitvY3RhdmVfZmZ0dzo6ZmZ0IChjb25zdCBD b21wbGV4ICppbiwgQ29tcGxleCAqb3V0LCBzaXplX3QgbnB0cykNCit7DQor ICBmZnR3X29uZSAoZmZ0d19wbGFubmVyLmNyZWF0ZV9wbGFuIChGRlRXX0ZP UldBUkQsIG5wdHMpLA0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8 ZmZ0d19jb21wbGV4ICo+IChjb25zdF9jYXN0PENvbXBsZXggKj4gKGluKSks DQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmZnR3X2NvbXBsZXgg Kj4gKG91dCkpOw0KKw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludA0KK29j dGF2ZV9mZnR3OjppZmZ0IChjb25zdCBDb21wbGV4ICppbiwgQ29tcGxleCAq b3V0LCBzaXplX3QgbnB0cykNCit7DQorICBmZnR3X29uZSAoZmZ0d19wbGFu bmVyLmNyZWF0ZV9wbGFuIChGRlRXX0JBQ0tXQVJELCBucHRzKSwNCisgICAg ICAgICAgICByZWludGVycHJldF9jYXN0PGZmdHdfY29tcGxleCAqPiAoY29u c3RfY2FzdDxDb21wbGV4ICo+IChpbikpLA0KKyAgICAgICAgICAgIHJlaW50 ZXJwcmV0X2Nhc3Q8ZmZ0d19jb21wbGV4ICo+IChvdXQpKTsNCisNCisgIGNv bnN0IENvbXBsZXggc2NhbGUgPSBucHRzOw0KKyAgZm9yIChzaXplX3QgaSA9 IDA7IGkgPCBucHRzOyBpKyspDQorICAgIG91dFtpXSAvPSBzY2FsZTsNCisN CisgIHJldHVybiAwOw0KK30NCisNCitpbnQNCitvY3RhdmVfZmZ0dzo6ZmZ0 MmQgKENvbXBsZXggKmlub3V0LCBzaXplX3QgbnIsIHNpemVfdCBuYykNCit7 DQorICBmZnR3bmRfb25lIChmZnR3X3BsYW5uZXIuY3JlYXRlX3BsYW4yZCAo RkZUV19GT1JXQVJELCBuciwgbmMpLA0KKyAgICAgICAgICAgICAgcmVpbnRl cnByZXRfY2FzdDxmZnR3X2NvbXBsZXggKj4gKGlub3V0KSwNCisgICAgICAg ICAgICAgIE5VTEwpOw0KKw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludA0K K29jdGF2ZV9mZnR3OjppZmZ0MmQgKENvbXBsZXggKmlub3V0LCBzaXplX3Qg bnIsIHNpemVfdCBuYykNCit7DQorICBmZnR3bmRfb25lIChmZnR3X3BsYW5u ZXIuY3JlYXRlX3BsYW4yZCAoRkZUV19CQUNLV0FSRCwgbnIsIG5jKSwNCisg ICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmZ0d19jb21wbGV4ICo+ IChpbm91dCksDQorICAgICAgICAgICAgICBOVUxMKTsNCisNCisgIGNvbnN0 IHNpemVfdCBucHRzID0gbnIgKiBuYzsNCisgIGNvbnN0IENvbXBsZXggc2Nh bGUgPSBucHRzOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBucHRzOyBp KyspDQorICAgIGlub3V0W2ldIC89IHNjYWxlOw0KKw0KKyAgcmV0dXJuIDA7 DQorfQ0KKw0KKyNlbHNlIC8qIEhBVkVfRkZUVyAqLw0KKw0KK2V4dGVybiBp bnQgb2N0X2VtcHR5X3RyYW5zbGF0aW9uX3VuaXQ7DQorDQorI2VuZGlmIC8q IEhBVkVfRkZUVyAqLw0KKw0KKy8qDQorOzs7IExvY2FsIFZhcmlhYmxlczog KioqDQorOzs7IG1vZGU6IEMrKyAqKioNCis7OzsgRW5kOiAqKioNCisqLw0K Kw0K --2006041544-959030623-987884450=:25502--