From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Delio Brignoli" Subject: Re: [PATCH] asihpi driver, adds tuner controls, AESEBU controls, bus master support where available Date: Wed, 27 Jul 2005 22:17:54 -0700 Message-ID: <4445e67baeea4cd2b7d11780e13053b6@audioscience.com> Reply-To: dbrignoli@audioscience.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=----_SmarterMail_NextPart_5355760445588004 Return-path: Sender: alsa-devel-admin@lists.sourceforge.net Errors-To: alsa-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: tiwai@suse.de Cc: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org This is a multi-part message in MIME format. ------_SmarterMail_NextPart_5355760445588004 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable =0D=0AHello,=0D=0A=0D=0A> RETURN_IF_NEG() is a bit ugly. In your code, it'= s not clear whether=0D=0A> this is for a debug purpose or for checking a cr= itical error.=0D=0A> =0D=0A> If it's just a check, you can use snd_assert()= . Otherwise, a plain=0D=0A> if() would be easier to read.=0D=0A> =0D=0A> C= ould you rewrite that stuff?=0D=0A=0D=0AI've used snd_runtime_check ( thank= s for pointing me at it )=0D=0A=0D=0AI'm attaching a new patch with some ex= tra features:=0D=0A=0D=0AThu Jul 28 17:03:28 NZST 2005 dbrignoli@audioscie= nce.com=0D=0A * added_enable_bbm_module_param=0D=0AThu Jul 28 16:50:46 NZS= T 2005 dbrignoli@audioscience.com=0D=0A * use_alsa_debug_assertions_and_p= rintd=0D=0ATue Jul 26 18:15:11 NZST 2005 dbrignoli@audioscience.com=0D=0A = * fixed_bus_master_buffer_size_calculation=0D=0ATue Jul 26 18:13:50 NZST 2= 005 dbrignoli@audioscience.com=0D=0A * fixed_HPI_error_handling_macro_to_= include_filename=0D=0AFri Jul 22 16:37:16 NZST 2005 dbrignoli@audioscience= .com=0D=0A * add AESEBU controls to alsa mixer=0D=0AFri Jul 22 12:33:22 NZ= ST 2005 dbrignoli@audioscience.com=0D=0A * enable_HPI_stream_host_buffers= _if_supported=0D=0AThu Jul 21 16:03:58 NZST 2005 dbrignoli@audioscience.co= m=0D=0A * add_tuner_controls=0D=0A=0D=0A--=0D=0ADelio Brignoli=0D=0Adbrign= oli@audioscience.com ------_SmarterMail_NextPart_5355760445588004 Content-Type: application/octet-stream; name=patch.txt Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 VGh1IEp1bCAyOCAxNzowMzoyOCBOWlNUIDIwMDUgIGRicmlnbm9saUBhdWRpb3NjaWVuY2UuY29t CiAgKiBhZGRlZF9lbmFibGVfYmJtX21vZHVsZV9wYXJhbQpUaHUgSnVsIDI4IDE2OjUwOjQ2IE5a U1QgMjAwNSAgZGJyaWdub2xpQGF1ZGlvc2NpZW5jZS5jb20KICAqIHVzZV9hbHNhX2RlYnVnX2Fz c2VydGlvbnNfYW5kX3ByaW50ZApUdWUgSnVsIDI2IDE4OjE1OjExIE5aU1QgMjAwNSAgZGJyaWdu b2xpQGF1ZGlvc2NpZW5jZS5jb20KICAqIGZpeGVkX2J1c19tYXN0ZXJfYnVmZmVyX3NpemVfY2Fs Y3VsYXRpb24KVHVlIEp1bCAyNiAxODoxMzo1MCBOWlNUIDIwMDUgIGRicmlnbm9saUBhdWRpb3Nj aWVuY2UuY29tCiAgKiBmaXhlZF9IUElfZXJyb3JfaGFuZGxpbmdfbWFjcm9fdG9faW5jbHVkZV9m aWxlbmFtZQpGcmkgSnVsIDIyIDE2OjM3OjE2IE5aU1QgMjAwNSAgZGJyaWdub2xpQGF1ZGlvc2Np ZW5jZS5jb20KICAqIGFkZCBBRVNFQlUgY29udHJvbHMgdG8gYWxzYSBtaXhlcgpGcmkgSnVsIDIy IDEyOjMzOjIyIE5aU1QgMjAwNSAgZGJyaWdub2xpQGF1ZGlvc2NpZW5jZS5jb20KICAqIGVuYWJs ZV9IUElfc3RyZWFtX2hvc3RfYnVmZmVyc19pZl9zdXBwb3J0ZWQKVGh1IEp1bCAyMSAxNjowMzo1 OCBOWlNUIDIwMDUgIGRicmlnbm9saUBhdWRpb3NjaWVuY2UuY29tCiAgKiBhZGRfdHVuZXJfY29u dHJvbHMKZGlmZiAtck4gLXUgb2xkLWFsc2EtZHJpdmVyLTEuMC45Yi1yZXAvcGNpL2FzaWhwaS5j IG5ldy1hbHNhLWRyaXZlci0xLjAuOWItcmVwL3BjaS9hc2locGkuYwotLS0gb2xkLWFsc2EtZHJp dmVyLTEuMC45Yi1yZXAvcGNpL2FzaWhwaS5jCTIwMDUtMDctMjggMTc6MDk6MDUuMDAwMDAwMDAw ICsxMjAwCisrKyBuZXctYWxzYS1kcml2ZXItMS4wLjliLXJlcC9wY2kvYXNpaHBpLmMJMjAwNS0w Ny0yOCAxNjo1NzoxOC4wMDAwMDAwMDAgKzEyMDAKQEAgLTU3LDYgKzU3LDkgQEAKIG1vZHVsZV9w YXJhbShhZGFwdGVyX2ZzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhZGFwdGVyX2Zz LCAiQWRhcHRlciBIVyBzYW1wbGVyYXRlIChpZiBzdXBwb3J0ZWQpIik7CiAKK3N0YXRpYyBpbnQg ZW5hYmxlX2JibSA9IDE7Cittb2R1bGVfcGFyYW0oZW5hYmxlX2JibSwgaW50LCAwNDQ0KTsKK01P RFVMRV9QQVJNX0RFU0MoZW5hYmxlX2JibSwgIkVuYWJsZSBiYWNrZ3JvdW5kIGJ1cyBtYXN0ZXIs IGlmIGF2YWlsYWJsZSIpOwogCiBNT0RVTEVfQVVUSE9SKCJFbGlvdCBCbGVubmVyaGFzc2V0dCA8 RUJsZW5uZXJoYXNzZXR0QGF1ZGlvc2NpZW5jZS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04o IkF1ZGlvU2NpZW5jZSBzb3VuZGNhcmQgKEhQSSkiKTsKQEAgLTkyLDYgKzk1LDggQEAKIAlzbmRf Y2FyZF9hc2locGlfdCAqYXNpaHBpOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgdGltZXJf bGlzdCB0aW1lcjsKKwl1bnNpZ25lZCBpbnQgaHBpX2luX2J1ZmZlcl9hbGxvY2F0ZWQ7CisJdW5z aWduZWQgaW50IGhwaV9vdXRfYnVmZmVyX2FsbG9jYXRlZDsKIAl1bnNpZ25lZCBpbnQgcGNtX3Np emU7CiAJdW5zaWduZWQgaW50IHBjbV9jb3VudDsKIAl1bnNpZ25lZCBpbnQgcGNtX2ppZmZpZV9w ZXJfcGVyaW9kOwpAQCAtMTA3LDE3ICsxMTIsMTcgQEAKIHN0YXRpYyBIUElfSFNVQlNZUyAqcGhT dWJTeXM7CS8qIGhhbmRsZSB0byBIUEkgYXVkaW8gc3Vic3lzdGVtICovCiBzdGF0aWMgc25kX2Nh cmRfdCAqc25kX2FzaWhwaV9jYXJkc1tTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1BUUjsK IAotc3RhdGljIHZvaWQgX0hhbmRsZUVycm9yKEhXMTYgZXJyLCBpbnQgbGluZSkKK3N0YXRpYyB2 b2lkIF9IYW5kbGVFcnJvcihIVzE2IGVyciwgaW50IGxpbmUsIGNoYXIgKmZpbGVuYW1lKQogewog CWNoYXIgRXJyb3JUZXh0WzgwXTsKIAogCWlmIChlcnIpIHsKIAkJSFBJX0dldEVycm9yVGV4dChl cnIsIEVycm9yVGV4dCk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxpbmUgJWQ6ICVzXG4iLCBs aW5lLCBFcnJvclRleHQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbiBmaWxlICVzLCBsaW5l ICVkOiAlc1xuIiwgZmlsZW5hbWUsIGxpbmUsIEVycm9yVGV4dCk7CiAJfQogfQogCi0jZGVmaW5l IEhQSV9IYW5kbGVFcnJvcih4KSAgX0hhbmRsZUVycm9yKHgsX19MSU5FX18pCisjZGVmaW5lIEhQ SV9IYW5kbGVFcnJvcih4KSAgX0hhbmRsZUVycm9yKHgsX19MSU5FX18sX19GSUxFX18pCiAvKioq KioqKioqKioqKioqKioqKioqKioqKioqKiogR0VORVJBTCBQQ00gKioqKioqKioqKioqKioqKi8K IHN0YXRpYyBpbnQgc25kX2NhcmRfYXNpaHBpX3BjbV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJl YW1fdCAqIHN1YnN0cmVhbSwKIAkJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMpCkBA IC0zMDUsNiArMzEwLDcgQEAKIAlzbmRfY2FyZF9hc2locGlfcGNtX3QgKmRwY20gPSBydW50aW1l LT5wcml2YXRlX2RhdGE7CiAJaW50IGVycjsKIAlIVzE2IHdGb3JtYXQ7CisJSFczMiBtaW5CdWZT aXplOwogCiAJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBw YXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpKSA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0zMjMs NiArMzI5LDMxIEBACiAJZHBjbS0+RGF0YS5kd3BiRGF0YSA9IChIVzMyKSBydW50aW1lLT5kbWFf YXJlYTsKIAlkcGNtLT5EYXRhLmR3RGF0YVNpemUgPSBNQVhfQlVGRkVSX1NJWkU7CiAKKwlpZiAo ZW5hYmxlX2JibSkgeworCQlkcGNtLT5ocGlfb3V0X2J1ZmZlcl9hbGxvY2F0ZWQgPSAwOworCQlt aW5CdWZTaXplID0gMDsKKworCQllcnIgPSBIUElfU3RyZWFtRXN0aW1hdGVCdWZmZXJTaXplKCAm ZHBjbS0+RGF0YS5Gb3JtYXQsIChIVzMyKSggMTAwMCAvIEhaICksICZtaW5CdWZTaXplICk7CisJ CXNuZF9wcmludGQoS0VSTl9JTkZPICJPdXRTdHJlYW1Ib3N0QnVmZmVyIGVzdGltYXRlZCBzaXpl OiAlZCBieXRlc1xuIiwgKGludCltaW5CdWZTaXplKTsKKworCQlpZiAoIG1pbkJ1ZlNpemUgPCBN QVhfQlVGRkVSX1NJWkUgKQorCQkJbWluQnVmU2l6ZSA9IE1BWF9CVUZGRVJfU0laRTsKKworCQlp ZiAoIGVyciA9PSAwICkgeworCQkJZXJyID0gSFBJX091dFN0cmVhbUhvc3RCdWZmZXJBbGxvY2F0 ZSggcGhTdWJTeXMsIGRwY20tPmhTdHJlYW0sIG1pbkJ1ZlNpemUgKTsKKwkJCWlmICggZXJyID09 IDAgKSB7CisJCQkJZHBjbS0+aHBpX291dF9idWZmZXJfYWxsb2NhdGVkID0gbWluQnVmU2l6ZTsK KwkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiT3V0U3RyZWFtSG9zdEJ1ZmZlckFsbG9jYXRlIHN1 Y2NlZGVkXG4iKTsKKwkJCX0gZWxzZSBpZiAoIGVyciAhPSAwICYmIGVyciAhPSBIUElfRVJST1Jf SU5WQUxJRF9GVU5DICkgeworCQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJPdXRTdHJlYW1Ib3N0 QnVmZmVyQWxsb2NhdGUgZXJyb3IoJWQpXG4iLCBlcnIpOworCQkJCXJldHVybiBlcnI7CisJCQl9 CisJCX0gZWxzZSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiQ2Fubm90IGVzdGltYXRlIG1p bmltdW0gYnVzIG1hc3RlciBidWZmZXIgc2l6ZVxuIik7CisJCX0KKwkJc25kX3ByaW50ZChLRVJO X0lORk8gIk91dFN0cmVhbUhvc3RCdWZmZXJBbGxvY2F0ZSBzdGF0dXMoJWQpXG4iLCBkcGNtLT5o cGlfb3V0X2J1ZmZlcl9hbGxvY2F0ZWQpOworCX0KKwogCXNuZF9wcmludGQoS0VSTl9JTkZPICJw bGF5YmFjayBod3BhcmFtc1xuIik7CiAKIAlyZXR1cm4gc25kX2NhcmRfYXNpaHBpX3BjbV9od19w YXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOwpAQCAtMzMxLDYgKzM2MiwxMiBAQAogc3RhdGljIGlu dAogc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAq IHN1YnN0cmVhbSkKIHsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+ cnVudGltZTsKKwlzbmRfY2FyZF9hc2locGlfcGNtX3QgKmRwY20gPSBydW50aW1lLT5wcml2YXRl X2RhdGE7CisJaWYgKCBkcGNtLT5ocGlfb3V0X2J1ZmZlcl9hbGxvY2F0ZWQgKSB7CisJCUhQSV9P dXRTdHJlYW1Ib3N0QnVmZmVyRnJlZSggcGhTdWJTeXMsIGRwY20tPmhTdHJlYW0gKTsKKwl9CisK IAlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01 NjUsNiArNjAyLDcgQEAKIAlzbmRfY2FyZF9hc2locGlfcGNtX3QgKmRwY20gPSBydW50aW1lLT5w cml2YXRlX2RhdGE7CiAJaW50IGVycjsKIAlIVzE2IHdGb3JtYXQ7CisJSFczMiBtaW5CdWZTaXpl OwogCiAJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJh bXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpKSA8IDApCiAJCXJldHVybiBlcnI7CkBAIC01ODgsNiAr NjI2LDMxIEBACiAJZHBjbS0+RGF0YS5kd3BiRGF0YSA9IChIVzMyKSBydW50aW1lLT5kbWFfYXJl YTsKIAlkcGNtLT5EYXRhLmR3RGF0YVNpemUgPSBNQVhfQlVGRkVSX1NJWkU7CiAKKwlpZiAoZW5h YmxlX2JibSkgeworCQlkcGNtLT5ocGlfaW5fYnVmZmVyX2FsbG9jYXRlZCA9IDA7CisJCW1pbkJ1 ZlNpemUgPSAwOworCisJCWVyciA9IEhQSV9TdHJlYW1Fc3RpbWF0ZUJ1ZmZlclNpemUoICZkcGNt LT5EYXRhLkZvcm1hdCwgKEhXMzIpKCAxMDAwIC8gSFogKSwgJm1pbkJ1ZlNpemUgKTsKKwkJc25k X3ByaW50ZChLRVJOX0lORk8gIk91dFN0cmVhbUhvc3RCdWZmZXIgZXN0aW1hdGVkIHNpemU6ICVk IGJ5dGVzXG4iLCAoaW50KW1pbkJ1ZlNpemUpOworCisJCWlmICggbWluQnVmU2l6ZSA8IE1BWF9C VUZGRVJfU0laRSApIC8qIHBhcmFub2lhIGNoZWNrICovCisJCQltaW5CdWZTaXplID0gTUFYX0JV RkZFUl9TSVpFOworCisJCWlmICggZXJyID09IDAgKSB7CisJCQllcnIgPSBIUElfSW5TdHJlYW1I b3N0QnVmZmVyQWxsb2NhdGUoIHBoU3ViU3lzLCBkcGNtLT5oU3RyZWFtLCBtaW5CdWZTaXplICk7 CisJCQlpZiAoIGVyciA9PSAwICkgeworCQkJCWRwY20tPmhwaV9pbl9idWZmZXJfYWxsb2NhdGVk ID0gbWluQnVmU2l6ZTsKKwkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSW5TdHJlYW1Ib3N0QnVm ZmVyQWxsb2NhdGUgc3VjY2VkZWQiKTsKKwkJCX0gZWxzZSBpZiAoIGVyciAhPSAwICYmIGVyciAh PSBIUElfRVJST1JfSU5WQUxJRF9GVU5DICkgeworCQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJJ blN0cmVhbUhvc3RCdWZmZXJBbGxvY2F0ZSBlcnJvciglZCkiLCBlcnIpOworCQkJCXJldHVybiBl cnI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiQ2Fubm90IGVz dGltYXRlIG1pbmltdW0gYnVzIG1hc3RlciBidWZmZXIgc2l6ZVxuIik7CisJCX0KKwkJc25kX3By aW50ZChLRVJOX0lORk8gIkluU3RyZWFtSG9zdEJ1ZmZlckFsbG9jYXRlIHN0YXR1cyglZCkiLCBk cGNtLT5ocGlfaW5fYnVmZmVyX2FsbG9jYXRlZCk7CisJfQorCiAJc25kX3ByaW50ZChLRVJOX0lO Rk8gIkNhcHR1cmUgaHdwYXJhbXNcbiIpOwogCiAJcmV0dXJuIHNuZF9jYXJkX2FzaWhwaV9wY21f aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zKTsKQEAgLTU5NSw2ICs2NTgsMTIgQEAKIAogc3Rh dGljIGludCBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFt X3QgKiBzdWJzdHJlYW0pCiB7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJl YW0tPnJ1bnRpbWU7CisJc25kX2NhcmRfYXNpaHBpX3BjbV90ICpkcGNtID0gcnVudGltZS0+cHJp dmF0ZV9kYXRhOworCWlmICggZHBjbS0+aHBpX2luX2J1ZmZlcl9hbGxvY2F0ZWQgKSB7CisJCUhQ SV9JblN0cmVhbUhvc3RCdWZmZXJGcmVlKCBwaFN1YlN5cywgZHBjbS0+aFN0cmVhbSApOworCX0K KwogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIAlyZXR1cm4gMDsKIH0KQEAg LTc4NCwxMCArODUzLDIxIEBACiAJSFcxNiB3U3JjTm9kZUluZGV4OwogCUhXMTYgd0RzdE5vZGVU eXBlOwogCUhXMTYgd0RzdE5vZGVJbmRleDsKKwlIVzE2IHdCYW5kOwogfSBocGlfY29udHJvbF90 OwogCiAjZGVmaW5lIFRFWFQoYSkgYQogCisjZGVmaW5lIEFTSUhQSV9UVU5FUl9CQU5EX1NUUklO R1MgXAoreyBcCisJVEVYVCgiaW52YWxpZCIpLCBcCisJVEVYVCgiQU0iKSwgXAorCVRFWFQoIkZN IChtb25vKSIpLCBcCisJVEVYVCgiVFYiKSwgXAorCVRFWFQoIkZNIChzdGVyZW8pIiksIFwKKwlU RVhUKCJBVVgiKSBcCit9CisKICNpZmRlZiBBU0lfU1RZTEVfTkFNRVMKICNkZWZpbmUgQVNJSFBJ X1NPVVJDRU5PREVfU1RSSU5HUyBcCiB7IFwKQEAgLTg0NSwxNyArOTI1LDQxIEBACiAjZW5kaWYK ICNkZWZpbmUgTlVNX0RFU1ROT0RFX1NUUklOR1MgNwogCi0jaWYgKCAoTlVNX1NPVVJDRU5PREVf U1RSSU5HUyA8IChIUElfU09VUkNFTk9ERV9MQVNUX0lOREVYLUhQSV9TT1VSQ0VOT0RFX0JBU0Ur MSkpIHx8Ci0oTlVNX0RFU1ROT0RFX1NUUklOR1MgPCAoSFBJX0RFU1ROT0RFX0xBU1RfSU5ERVgt SFBJX0RFU1ROT0RFX0JBU0UrMSkpKQorI2lmICggKE5VTV9TT1VSQ0VOT0RFX1NUUklOR1MgPCAo SFBJX1NPVVJDRU5PREVfTEFTVF9JTkRFWC1IUElfU09VUkNFTk9ERV9CQVNFKzEpKSB8fCAoTlVN X0RFU1ROT0RFX1NUUklOR1MgPCAoSFBJX0RFU1ROT0RFX0xBU1RfSU5ERVgtSFBJX0RFU1ROT0RF X0JBU0UrMSkpKQogI2Vycm9yICJGZXdlciBub2RlIHN0cmluZ3MgdGhhbiAjZGVmaW5lcyAtIG5l dyBIUEk/IgogI2VuZGlmCi0jaWYgKCAoTlVNX1NPVVJDRU5PREVfU1RSSU5HUyA+IChIUElfU09V UkNFTk9ERV9MQVNUX0lOREVYLUhQSV9TT1VSQ0VOT0RFX0JBU0UrMSkpIHx8Ci0oTlVNX0RFU1RO T0RFX1NUUklOR1MgPCAoSFBJX0RFU1ROT0RFX0xBU1RfSU5ERVgtSFBJX0RFU1ROT0RFX0JBU0Ur MSkpKQorI2lmICggKE5VTV9TT1VSQ0VOT0RFX1NUUklOR1MgPiAoSFBJX1NPVVJDRU5PREVfTEFT VF9JTkRFWC1IUElfU09VUkNFTk9ERV9CQVNFKzEpKSB8fCAoTlVNX0RFU1ROT0RFX1NUUklOR1Mg PCAoSFBJX0RFU1ROT0RFX0xBU1RfSU5ERVgtSFBJX0RFU1ROT0RFX0JBU0UrMSkpKQogI3dhcm5p bmcgIk1vcmUgTm9kZSBzdHJpbmdzIHRoYW4gSFBJIGRlZmluZXMgLSBvbGQgSFBJPyIKICNlbmRp ZgogCiBzdGF0aWMgY2hhciAqYXNpaHBpX3NyY19uYW1lc1tdID0gQVNJSFBJX1NPVVJDRU5PREVf U1RSSU5HUzsKIHN0YXRpYyBjaGFyICphc2locGlfZHN0X25hbWVzW10gPSBBU0lIUElfREVTVE5P REVfU1RSSU5HUzsKK3N0YXRpYyBjaGFyICphc2locGlfdHVuZXJfYmFuZF9uYW1lc1tdID0gQVNJ SFBJX1RVTkVSX0JBTkRfU1RSSU5HUzsKKworaW5saW5lIGludCBjdGxfYWRkKCBzbmRfY2FyZF90 ICogY2FyZCwgc25kX2tjb250cm9sX25ld190ICogY3RsLCBzbmRfY2FyZF9hc2locGlfdCAqIGFz aWhwaSApIHsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRf Y3RsX25ldzEoY3RsLCBhc2locGkpKSkgPCAwKSB7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIGlm IChtaXhlcl9kdW1wKQorCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQWRkZWQgJXMoJWQpXG4iLCBj dGwtPm5hbWUsIGN0bC0+aW5kZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXNpaHBpX2N0 bF9uYW1lX3ByZWZpeCggc25kX2tjb250cm9sX25ld190ICogc25kX2NvbnRyb2wsIGhwaV9jb250 cm9sX3QgKiBhc2locGlfY29udHJvbCkgeworCisJaWYgKGFzaWhwaV9jb250cm9sLT53RHN0Tm9k ZVR5cGUpCisJCXNwcmludGYoc25kX2NvbnRyb2wtPm5hbWUsICIlcyAlcyVkIiwKKwkJCWFzaWhw aV9zcmNfbmFtZXNbYXNpaHBpX2NvbnRyb2wtPndTcmNOb2RlVHlwZV0sCisJCQlhc2locGlfZHN0 X25hbWVzW2FzaWhwaV9jb250cm9sLT53RHN0Tm9kZVR5cGVdLAorCQkJYXNpaHBpX2NvbnRyb2wt PndEc3ROb2RlSW5kZXggKyAxKTsKKwllbHNlIHsKKwkJc3RyY3B5KHNuZF9jb250cm9sLT5uYW1l LAorCQkgICAgICAgYXNpaHBpX3NyY19uYW1lc1thc2locGlfY29udHJvbC0+d1NyY05vZGVUeXBl XSk7CisJfQorCit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBWb2x1bWUgY29udHJvbHMKQEAgLTEwMzAsNiArMTEz NCw0ODAgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFFU0VCVSBjb250cm9scworIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFF U0VCVSBmb3JtYXQgKi8KKworI2RlZmluZSBBU0lIUElfQUVTRUJVX0ZPUk1BVF9TVFJJTkdTIFwK K3sgXAorCVRFWFQoIk5vIHNpZ25hbCIpLCBcCisJVEVYVCgiUy9QRElGIiksIFwKKwlURVhUKCJB RVMvRUJVIiksIFwKK30KKworc3RhdGljIGNoYXIgKmFzaWhwaV9hZXNlYnVfZm9ybWF0X25hbWVz W10gPSBBU0lIUElfQUVTRUJVX0ZPUk1BVF9TVFJJTkdTOworCitzdGF0aWMgaW50IHNuZF9hc2lo cGlfYWVzZWJ1X2Zvcm1hdF9pbmZvKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICBz bmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExf RUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUu ZW51bWVyYXRlZC5pdGVtcyA9IDM7CisKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRl bSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1l cmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKworCXN0cmNw eSggdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgCisJCWFzaWhwaV9hZXNlYnVfZm9ybWF0 X25hbWVzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IHNuZF9hc2locGlfYWVzZWJ1X2Zvcm1hdF9nZXQoc25kX2tjb250cm9sX3Qg KiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCwKKwkJCQkg SFcxNiAoKmZ1bmMpKCBIUElfSFNVQlNZUyosIEhQSV9IQ09OVFJPTCwgSFcxNiogKSApCit7CisJ SFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJSFcxNiBz b3VyY2U7CisKKwlzbmRfcnVudGltZV9jaGVjayggZnVuYyhwaFN1YlN5cywgaENvbnRyb2wsICZz b3VyY2UpICE9IDAgLCByZXR1cm4gLUVJTlZBTCApOworCisJLyogZGVmYXVsdCB0byBTL1BESUYg Ki8KKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMDsKKwlpZiAoIHNvdXJj ZSA9PSBIUElfQUVTRUJVX1NPVVJDRV9TUERJRiApCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJh dGVkLml0ZW1bMF0gPSAxOworCWlmICggc291cmNlID09IEhQSV9BRVNFQlVfU09VUkNFX0FFU0VC VSApCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAyOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FzaWhwaV9hZXNlYnVfZm9ybWF0X3B1dChzbmRfa2Nv bnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9s LAorCQkJCSBIVzE2ICgqZnVuYykoIEhQSV9IU1VCU1lTKiwgSFBJX0hDT05UUk9MLCBIVzE2ICkg KQoreworCUhQSV9IQ09OVFJPTCBoQ29udHJvbCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwor CS8qIGRlZmF1bHQgdG8gUy9QRElGICovCisJSFcxNiBzb3VyY2UgPSBIUElfQUVTRUJVX1NPVVJD RV9TUERJRjsKKworCWlmICggdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSAx ICkKKwkJc291cmNlID0gSFBJX0FFU0VCVV9TT1VSQ0VfU1BESUY7CisJaWYgKCB1Y29udHJvbC0+ dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IDIgKQorCQlzb3VyY2UgPSBIUElfQUVTRUJVX1NP VVJDRV9BRVNFQlU7CisKKwlzbmRfcnVudGltZV9jaGVjayggZnVuYyhwaFN1YlN5cywgaENvbnRy b2wsIHNvdXJjZSkgIT0gMCwgcmV0dXJuIC1FSU5WQUwgKTsKKworCXJldHVybiAxOworfQorCitz dGF0aWMgaW50IHNuZF9hc2locGlfYWVzZWJ1X3J4X3NvdXJjZV9nZXQoc25kX2tjb250cm9sX3Qg KiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkgeworCXJl dHVybiBzbmRfYXNpaHBpX2Flc2VidV9mb3JtYXRfZ2V0KCBrY29udHJvbCwgdWNvbnRyb2wsIEhQ SV9BRVNFQlVfUmVjZWl2ZXJfR2V0U291cmNlICk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FzaWhw aV9hZXNlYnVfcnhfc291cmNlX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSBz bmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKSB7CisJcmV0dXJuIHNuZF9hc2locGlfYWVz ZWJ1X2Zvcm1hdF9wdXQoIGtjb250cm9sLCB1Y29udHJvbCwgSFBJX0FFU0VCVV9SZWNlaXZlcl9T ZXRTb3VyY2UgKTsKK30KKworc3RhdGljIGludCBzbmRfYXNpaHBpX2Flc2VidV90eF9mb3JtYXRf Z2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90 ICogdWNvbnRyb2wpIHsKKwlyZXR1cm4gc25kX2FzaWhwaV9hZXNlYnVfZm9ybWF0X2dldCgga2Nv bnRyb2wsIHVjb250cm9sLCBIUElfQUVTRUJVX1RyYW5zbWl0dGVyX0dldEZvcm1hdCApOworfQor CitzdGF0aWMgaW50IHNuZF9hc2locGlfYWVzZWJ1X3R4X2Zvcm1hdF9wdXQoc25kX2tjb250cm9s X3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkgewor CXJldHVybiBzbmRfYXNpaHBpX2Flc2VidV9mb3JtYXRfcHV0KCBrY29udHJvbCwgdWNvbnRyb2ws IEhQSV9BRVNFQlVfVHJhbnNtaXR0ZXJfU2V0Rm9ybWF0ICk7Cit9CisKKy8qIFRYIGNsb2NrIHNv dXJjZSAqLworCisjZGVmaW5lIEFTSUhQSV9BRVNFQlVfQ0xPQ0tTT1VSQ0VfU1RSSU5HUyBcCit7 IFwKKwlURVhUKCJBZGFwdGVyIiksIFwKKwlURVhUKCJBRVMvRUJVIHN5bmMiKSwgXAorfQorCitz dGF0aWMgY2hhciAqYXNpaHBpX2Flc2VidV9jbG9ja3NvdXJjZV9uYW1lc1tdID0gQVNJSFBJX0FF U0VCVV9DTE9DS1NPVVJDRV9TVFJJTkdTOworCitzdGF0aWMgaW50IHNuZF9hc2locGlfYWVzZWJ1 X3R4X2Nsb2Nrc291cmNlX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgIHNu ZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9F TEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5l bnVtZXJhdGVkLml0ZW1zID0gMjsKKworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVt ID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVy YXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCisJc3RyY3B5 KCB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCAKKwkJYXNpaHBpX2Flc2VidV9jbG9ja3Nv dXJjZV9uYW1lc1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBzbmRfYXNpaHBpX2Flc2VidV90eF9jbG9ja3NvdXJjZV9nZXQoc25k X2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29u dHJvbCApCit7CisJSFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFs dWU7CisJSFcxNiBzeW5jOworCisJc25kX3J1bnRpbWVfY2hlY2soIEhQSV9BRVNFQlVfVHJhbnNt aXR0ZXJfR2V0Q2xvY2tTb3VyY2UocGhTdWJTeXMsIGhDb250cm9sLCAmc3luYykgKTsKKworCS8q IGRlZmF1bHQgdG8gSFBJX0FFU0VCVV9DTE9DS1NPVVJDRV9BREFQVEVSICovCisJdWNvbnRyb2wt PnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDA7CisJaWYgKCBzeW5jID09IEhQSV9BRVNFQlVf Q0xPQ0tTT1VSQ0VfQURBUFRFUiApCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1b MF0gPSAwOworCWlmICggc3luYyA9PSBIUElfQUVTRUJVX0NMT0NLU09VUkNFX0FFU0VCVV9TWU5D ICkKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDE7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBzbmRfYXNpaHBpX2Flc2VidV90eF9jbG9ja3NvdXJjZV9wdXQo c25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1 Y29udHJvbCApCit7CisJSFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVf dmFsdWU7CisJLyogZGVmYXVsdCB0byBBRVMvRUJVIHN5bmMgKi8KKwlIVzE2IHN5bmMgPSBIUElf QUVTRUJVX0NMT0NLU09VUkNFX0FFU0VCVV9TWU5DOworCisJaWYgKCB1Y29udHJvbC0+dmFsdWUu ZW51bWVyYXRlZC5pdGVtWzBdID09IDAgKQorCQlzeW5jID0gSFBJX0FFU0VCVV9DTE9DS1NPVVJD RV9BREFQVEVSOworCWlmICggdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSAx ICkKKwkJc3luYyA9IEhQSV9BRVNFQlVfQ0xPQ0tTT1VSQ0VfQUVTRUJVX1NZTkM7CisKKwlzbmRf cnVudGltZV9jaGVjayggSFBJX0FFU0VCVV9UcmFuc21pdHRlcl9TZXRDbG9ja1NvdXJjZShwaFN1 YlN5cywgaENvbnRyb2wsIHN5bmMpICE9IDAsIHJldHVybiAtRUlOVkFMICk7CisKKwlyZXR1cm4g MTsKK30KKworCisvKiBBRVNFQlUgY29udHJvbCBncm91cCBpbml0aWFsaXplcnMgICovCisKK3N0 YXRpYyBpbnQgX19pbml0IHNuZF9hc2locGlfYWVzZWJ1X3J4X25ldyhzbmRfY2FyZF9hc2locGlf dCAqIGFzaWhwaSwgaHBpX2NvbnRyb2xfdCAqIGFzaWhwaV9jb250cm9sLAorCQkJCQlzbmRfa2Nv bnRyb2xfbmV3X3QgKiBzbmRfY29udHJvbCkKK3sKKworCXNuZF9jYXJkX3QgKmNhcmQgPSBhc2lo cGktPmNhcmQ7CisKKy8qIFJYIHNvdXJjZSAqLworCisJc25kX2NvbnRyb2wtPmluZm8gPSBzbmRf YXNpaHBpX2Flc2VidV9mb3JtYXRfaW5mbzsKKwlzbmRfY29udHJvbC0+Z2V0ID0gc25kX2FzaWhw aV9hZXNlYnVfcnhfc291cmNlX2dldDsKKwlzbmRfY29udHJvbC0+cHV0ID0gc25kX2FzaWhwaV9h ZXNlYnVfcnhfc291cmNlX3B1dDsKKwlzbmRfY29udHJvbC0+aW5kZXggPSBhc2locGlfY29udHJv bC0+d1NyY05vZGVJbmRleCArIDE7CisKKwlhc2locGlfY3RsX25hbWVfcHJlZml4KCBzbmRfY29u dHJvbCwgYXNpaHBpX2NvbnRyb2wgKTsKKwlzdHJjYXQoc25kX2NvbnRyb2wtPm5hbWUsICIgU291 cmNlIik7CisKKwlzbmRfcnVudGltZV9jaGVjayggY3RsX2FkZCggY2FyZCwgc25kX2NvbnRyb2ws IGFzaWhwaSApID49IDAsIHJldHVybiAtRUlOVkFMICk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBfX2luaXQgc25kX2FzaWhwaV9hZXNlYnVfdHhfbmV3KHNuZF9jYXJkX2FzaWhwaV90 ICogYXNpaHBpLCBocGlfY29udHJvbF90ICogYXNpaHBpX2NvbnRyb2wsCisJCQkJCXNuZF9rY29u dHJvbF9uZXdfdCAqIHNuZF9jb250cm9sKQoreworCisJc25kX2NhcmRfdCAqY2FyZCA9IGFzaWhw aS0+Y2FyZDsKKworLyogVFggRm9ybWF0ICovCisKKwlzbmRfY29udHJvbC0+aW5mbyA9IHNuZF9h c2locGlfYWVzZWJ1X2Zvcm1hdF9pbmZvOworCXNuZF9jb250cm9sLT5nZXQgPSBzbmRfYXNpaHBp X2Flc2VidV90eF9mb3JtYXRfZ2V0OworCXNuZF9jb250cm9sLT5wdXQgPSBzbmRfYXNpaHBpX2Fl c2VidV90eF9mb3JtYXRfcHV0OworCXNuZF9jb250cm9sLT5pbmRleCA9IGFzaWhwaV9jb250cm9s LT53U3JjTm9kZUluZGV4ICsgMTsKKworCWFzaWhwaV9jdGxfbmFtZV9wcmVmaXgoIHNuZF9jb250 cm9sLCBhc2locGlfY29udHJvbCApOworCXN0cmNhdChzbmRfY29udHJvbC0+bmFtZSwgIiBGb3Jt YXQiKTsKKworCXNuZF9ydW50aW1lX2NoZWNrKCBjdGxfYWRkKCBjYXJkLCBzbmRfY29udHJvbCwg YXNpaHBpICkgPj0gMCwgcmV0dXJuIC1FSU5WQUwgKTsKKworLyogVFggU2FtcGxlIHJhdGUgc291 cmNlKi8KKworCXNuZF9jb250cm9sLT5pbmZvID0gc25kX2FzaWhwaV9hZXNlYnVfdHhfY2xvY2tz b3VyY2VfaW5mbzsKKwlzbmRfY29udHJvbC0+Z2V0ID0gc25kX2FzaWhwaV9hZXNlYnVfdHhfY2xv Y2tzb3VyY2VfZ2V0OworCXNuZF9jb250cm9sLT5wdXQgPSBzbmRfYXNpaHBpX2Flc2VidV90eF9j bG9ja3NvdXJjZV9wdXQ7CisJc25kX2NvbnRyb2wtPmluZGV4ID0gYXNpaHBpX2NvbnRyb2wtPndT cmNOb2RlSW5kZXggKyAxOworCisJYXNpaHBpX2N0bF9uYW1lX3ByZWZpeCggc25kX2NvbnRyb2ws IGFzaWhwaV9jb250cm9sICk7CisJc3RyY2F0KHNuZF9jb250cm9sLT5uYW1lLCAiIENsb2NrIFNv dXJjZSIpOworCisJc25kX3J1bnRpbWVfY2hlY2soIGN0bF9hZGQoIGNhcmQsIHNuZF9jb250cm9s LCBhc2locGkgKSA+PSAwLCByZXR1cm4gLUVJTlZBTCApOworCisJcmV0dXJuIDA7Cit9CisKKy8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgICBUdW5lciBjb250cm9scworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdhaW4gKi8KKworc3RhdGljIGlu dCBzbmRfYXNpaHBpX3R1bmVyX2dhaW5faW5mbyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAor CQkJCSAgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCUhQSV9IQ09OVFJPTCBoQ29u dHJvbCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCUhXMTYgZXJyOworCXNob3J0IGlkeDsK KyAgICAgICAgSFczMiBnYWluUmFuZ2VbM107CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDM7IGlk eCsrKSB7CisgICAgICAgIAllcnIgPSBIUElfQ29udHJvbFF1ZXJ5KCBwaFN1YlN5cywgaENvbnRy b2wsIEhQSV9UVU5FUl9HQUlOLCBpZHgsIDAsICZnYWluUmFuZ2VbaWR4XSApOworCQlpZiAoZXJy ICE9IDApIHJldHVybiBlcnI7CisJfQorCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9U WVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5t aW4gPSAoIChpbnQpZ2FpblJhbmdlWzBdICkgLyBIUElfVU5JVFNfUEVSX2RCOworCXVpbmZvLT52 YWx1ZS5pbnRlZ2VyLm1heCA9ICggKGludClnYWluUmFuZ2VbMV0gKSAvIEhQSV9VTklUU19QRVJf ZEI7CisJdWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9ICggKGludCkgZ2FpblJhbmdlWzJdICkg LyBIUElfVU5JVFNfUEVSX2RCOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hc2lo cGlfdHVuZXJfZ2Fpbl9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0 bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwkvKgorCXNuZF9jYXJkX2FzaWhwaV90ICph c2locGkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwkqLworCUhQSV9IQ09OVFJPTCBoQ29udHJvbCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVl OworCXNob3J0IGdhaW47CisKKwlIUElfVHVuZXJfR2V0R2FpbihwaFN1YlN5cywgaENvbnRyb2ws ICZnYWluKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGdhaW4gLyBIUElf VU5JVFNfUEVSX2RCOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FzaWhwaV90 dW5lcl9nYWluX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSBzbmRfY3RsX2Vs ZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCS8qCisJc25kX2NhcmRfYXNpaHBpX3QgKmFzaWhw aSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CSovCisJSFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJ c2hvcnQgZ2FpbjsKKworCWdhaW4gPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0p ICogSFBJX1VOSVRTX1BFUl9kQjsKKwlIUElfVHVuZXJfU2V0R2FpbihwaFN1YlN5cywgaENvbnRy b2wsIGdhaW4pOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEJhbmQgICovCisKK3N0YXRpYyBpbnQg YXNpaHBpX3R1bmVyX2JhbmRfcXVlcnkoIHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIEhXMzIg KiBiYW5kTGlzdCwgSFczMiBsZW4gKSB7CisJSFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRy b2wtPnByaXZhdGVfdmFsdWU7CisJSFcxNiBlcnI7CisJSFczMiBpZHg7CisKKwlmb3IgKGlkeD0w OyBpZHggPCBsZW47IGlkeCsrKSB7CisJCWVyciA9IEhQSV9Db250cm9sUXVlcnkoIHBoU3ViU3lz LCBoQ29udHJvbCAsIEhQSV9UVU5FUl9CQU5ELCBpZHgsIDAgLCAmYmFuZExpc3RbaWR4XSk7CisJ CWlmIChlcnIgIT0wKSBicmVhazsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50 IHNuZF9hc2locGlfdHVuZXJfYmFuZF9pbmZvKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJ CQkJICBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisgICAgICAgIEhXMzIgdHVuZXJC YW5kc1tIUElfVFVORVJfQkFORF9MQVNUXTsKKwlIVzMyIG51bUJhbmRzID0gMDsKKworICAgICAg ICBudW1CYW5kcyA9IGFzaWhwaV90dW5lcl9iYW5kX3F1ZXJ5KCBrY29udHJvbCwgdHVuZXJCYW5k cywgSFBJX1RVTkVSX0JBTkRfTEFTVCApOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxF TV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51 bWVyYXRlZC5pdGVtcyA9IG51bUJhbmRzOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVk Lml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5l bnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisKKwlz dHJjcHkoIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIAorCQlhc2locGlfdHVuZXJfYmFu ZF9uYW1lc1t0dW5lckJhbmRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dXSk7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXNpaHBpX3R1bmVyX2JhbmRfZ2V0KHNuZF9r Y29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRy b2wpCit7CisJSFBJX0hDT05UUk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7 CisJLyoKKwlzbmRfY2FyZF9hc2locGlfdCAqYXNpaHBpID0gc25kX2tjb250cm9sX2NoaXAoa2Nv bnRyb2wpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJKi8KKwlIVzE2IGJhbmQsIGlkeDsKKyAg ICAgICAgSFczMiB0dW5lckJhbmRzW0hQSV9UVU5FUl9CQU5EX0xBU1RdOworCUhXMzIgbnVtQmFu ZHMgPSAwOworCisgICAgICAgIG51bUJhbmRzID0gYXNpaHBpX3R1bmVyX2JhbmRfcXVlcnkoIGtj b250cm9sLCB0dW5lckJhbmRzLCBIUElfVFVORVJfQkFORF9MQVNUICk7CisKKwlIUElfVHVuZXJf R2V0QmFuZChwaFN1YlN5cywgaENvbnRyb2wsICZiYW5kKTsKKworCXVjb250cm9sLT52YWx1ZS5l bnVtZXJhdGVkLml0ZW1bMF0gPSAtMTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEhQSV9UVU5FUl9C QU5EX0xBU1Q7IGlkeCsrKQorCQlpZiAoIHR1bmVyQmFuZHNbIGlkeCBdID09IGJhbmQgKSB7CisJ CQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaWR4OworCQkJYnJlYWs7CisJ CX0KKworCXNuZF9ydW50aW1lX2NoZWNrKCB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVt WzBdID49IDAsIHJldHVybiAtRUlOVkFMICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBzbmRfYXNpaHBpX3R1bmVyX2JhbmRfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJ CQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJLyoKKwlzbmRfY2FyZF9h c2locGlfdCAqYXNpaHBpID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJKi8KKwlIUElfSENPTlRST0wgaENvbnRyb2wgPSBrY29udHJvbC0+cHJp dmF0ZV92YWx1ZTsKKwlIVzE2IGJhbmQ7CisgICAgICAgIEhXMzIgdHVuZXJCYW5kc1tIUElfVFVO RVJfQkFORF9MQVNUXTsKKwlIVzMyIG51bUJhbmRzID0gMDsKKworICAgICAgICBudW1CYW5kcyA9 IGFzaWhwaV90dW5lcl9iYW5kX3F1ZXJ5KCBrY29udHJvbCwgdHVuZXJCYW5kcywgSFBJX1RVTkVS X0JBTkRfTEFTVCApOworCisJYmFuZCA9IHR1bmVyQmFuZHNbdWNvbnRyb2wtPnZhbHVlLmVudW1l cmF0ZWQuaXRlbVswXV07CisJSFBJX1R1bmVyX1NldEJhbmQocGhTdWJTeXMsIGhDb250cm9sLCBi YW5kKTsKKworCXJldHVybiAxOworfQorCisvKiBGcmVxICovCisKK3N0YXRpYyBpbnQgc25kX2Fz aWhwaV90dW5lcl9mcmVxX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgIHNu ZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlIUElfSENPTlRST0wgaENvbnRyb2wgPSBr Y29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlIVzE2IGVycjsKKyAgICAgICAgSFczMiB0dW5lckJh bmRzW0hQSV9UVU5FUl9CQU5EX0xBU1RdOworCUhXMzIgbnVtQmFuZHMgPSAwLCBiYW5kX2l0ZXIs IGlkeDsKKwlIVzMyIGZyZXFSYW5nZVszXSwgdGVtcEZyZXFSYW5nZVszXTsKKworICAgICAgICBu dW1CYW5kcyA9IGFzaWhwaV90dW5lcl9iYW5kX3F1ZXJ5KCBrY29udHJvbCwgdHVuZXJCYW5kcywg SFBJX1RVTkVSX0JBTkRfTEFTVCApOworCisJZnJlcVJhbmdlWzBdID0gSU5UX01BWDsKKwlmcmVx UmFuZ2VbMV0gPSAwOworCWZyZXFSYW5nZVsyXSA9IElOVF9NQVg7CisKKwlmb3IgKCBiYW5kX2l0 ZXIgPSAwOyBiYW5kX2l0ZXIgPCBudW1CYW5kczsgYmFuZF9pdGVyKysgKSB7CisJCWZvciAoaWR4 ID0gMDsgaWR4IDwgMzsgaWR4KyspIHsKKyAgICAgICAgCQllcnIgPSBIUElfQ29udHJvbFF1ZXJ5 KCBwaFN1YlN5cywgaENvbnRyb2wsIEhQSV9UVU5FUl9GUkVRLCBpZHgsIHR1bmVyQmFuZHNbYmFu ZF9pdGVyXSwgJnRlbXBGcmVxUmFuZ2VbaWR4XSApOworCQkJaWYgKGVyciAhPSAwKSByZXR1cm4g ZXJyOworCQl9CisKKwkJLyogc2tpcCBiYW5kIHdpdGggYm9ndXMgc3RlcHBpbmcgKi8KKwkJaWYg KCB0ZW1wRnJlcVJhbmdlWzJdIDw9IDAgKQorCQkJY29udGludWU7CisKKwkJaWYgKCB0ZW1wRnJl cVJhbmdlWzBdIDwgZnJlcVJhbmdlWzBdICkKKwkJCWZyZXFSYW5nZVswXSA9IHRlbXBGcmVxUmFu Z2VbMF07CisJCWlmICggdGVtcEZyZXFSYW5nZVsxXSA+IGZyZXFSYW5nZVsxXSApCisJCQlmcmVx UmFuZ2VbMV0gPSB0ZW1wRnJlcVJhbmdlWzFdOworCQlpZiAoIHRlbXBGcmVxUmFuZ2VbMl0gPCBm cmVxUmFuZ2VbMl0gKQorCQkJZnJlcVJhbmdlWzJdID0gdGVtcEZyZXFSYW5nZVsyXTsKKwl9CisK Kwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291 bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9ICggKGludClmcmVxUmFuZ2VbMF0g KTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAoIChpbnQpZnJlcVJhbmdlWzFdICk7CisJ dWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9ICggKGludClmcmVxUmFuZ2VbMl0gKTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXNpaHBpX3R1bmVyX2ZyZXFfZ2V0KHNuZF9rY29u dHJvbF90ICoga2NvbnRyb2wsCisJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wp Cit7CisJc25kX2NhcmRfYXNpaHBpX3QgKmFzaWhwaSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250 cm9sKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUhQSV9IQ09OVFJPTCBoQ29udHJvbCA9IGtj b250cm9sLT5wcml2YXRlX3ZhbHVlOworCUhXMzIgZnJlcTsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZhc2locGktPm1peGVyX2xvY2ssIGZsYWdzKTsKKwlIUElfVHVuZXJfR2V0RnJlcXVlbmN5KHBo U3ViU3lzLCBoQ29udHJvbCwgJmZyZXEpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVl WzBdID0gZnJlcTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2locGktPm1peGVyX2xvY2ss IGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hc2locGlfdHVuZXJf ZnJlcV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX3Zh bHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzbmRfY2FyZF9hc2locGlfdCAqYXNpaHBpID0gc25kX2tj b250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJSFBJX0hDT05U Uk9MIGhDb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJSFczMiBmcmVxOworCisJ ZnJlcSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXNwaW5fbG9ja19pcnFz YXZlKCZhc2locGktPm1peGVyX2xvY2ssIGZsYWdzKTsKKwlIUElfVHVuZXJfU2V0RnJlcXVlbmN5 KHBoU3ViU3lzLCBoQ29udHJvbCwgZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNp aHBpLT5taXhlcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogVHVuZXIgY29u dHJvbCBncm91cCBpbml0aWFsaXplciAgKi8KKworc3RhdGljIGludCBfX2luaXQgc25kX2FzaWhw aV90dW5lcl9uZXcoc25kX2NhcmRfYXNpaHBpX3QgKiBhc2locGksIGhwaV9jb250cm9sX3QgKiBh c2locGlfY29udHJvbCwKKwkJCQkJc25kX2tjb250cm9sX25ld190ICogc25kX2NvbnRyb2wpCit7 CisKKwlzbmRfY2FyZF90ICpjYXJkID0gYXNpaHBpLT5jYXJkOworCisvKiBHYWluIGN0bCAqLwor CisJc25kX2NvbnRyb2wtPmluZm8gPSBzbmRfYXNpaHBpX3R1bmVyX2dhaW5faW5mbzsKKwlzbmRf Y29udHJvbC0+Z2V0ID0gc25kX2FzaWhwaV90dW5lcl9nYWluX2dldDsKKwlzbmRfY29udHJvbC0+ cHV0ID0gc25kX2FzaWhwaV90dW5lcl9nYWluX3B1dDsKKwlzbmRfY29udHJvbC0+aW5kZXggPSBh c2locGlfY29udHJvbC0+d1NyY05vZGVJbmRleCArIDE7CisKKwlhc2locGlfY3RsX25hbWVfcHJl Zml4KCBzbmRfY29udHJvbCwgYXNpaHBpX2NvbnRyb2wgKTsKKwlzdHJjYXQoc25kX2NvbnRyb2wt Pm5hbWUsICIgR2FpbiIpOworCisJc25kX3J1bnRpbWVfY2hlY2soIGN0bF9hZGQoIGNhcmQsIHNu ZF9jb250cm9sLCBhc2locGkgKSAhPSAwLCByZXR1cm4gLUVJTlZBTCApOworCisvKiBCYW5kIGN0 bCAqLworCisJc25kX2NvbnRyb2wtPmluZm8gPSBzbmRfYXNpaHBpX3R1bmVyX2JhbmRfaW5mbzsK KwlzbmRfY29udHJvbC0+Z2V0ID0gc25kX2FzaWhwaV90dW5lcl9iYW5kX2dldDsKKwlzbmRfY29u dHJvbC0+cHV0ID0gc25kX2FzaWhwaV90dW5lcl9iYW5kX3B1dDsKKwlzbmRfY29udHJvbC0+aW5k ZXggPSBhc2locGlfY29udHJvbC0+d1NyY05vZGVJbmRleCArIDE7CisKKwlhc2locGlfY3RsX25h bWVfcHJlZml4KCBzbmRfY29udHJvbCwgYXNpaHBpX2NvbnRyb2wgKTsKKwlzdHJjYXQoc25kX2Nv bnRyb2wtPm5hbWUsICIgQmFuZCIpOworCisJc25kX3J1bnRpbWVfY2hlY2soIGN0bF9hZGQoIGNh cmQsIHNuZF9jb250cm9sLCBhc2locGkgKSAhPSAwLCByZXR1cm4gLUVJTlZBTCApOworCisvKiBG cmVxIGN0bCAqLworCisJc25kX2NvbnRyb2wtPmluZm8gPSBzbmRfYXNpaHBpX3R1bmVyX2ZyZXFf aW5mbzsKKwlzbmRfY29udHJvbC0+Z2V0ID0gc25kX2FzaWhwaV90dW5lcl9mcmVxX2dldDsKKwlz bmRfY29udHJvbC0+cHV0ID0gc25kX2FzaWhwaV90dW5lcl9mcmVxX3B1dDsKKwlzbmRfY29udHJv bC0+aW5kZXggPSBhc2locGlfY29udHJvbC0+d1NyY05vZGVJbmRleCArIDE7CisKKwlhc2locGlf Y3RsX25hbWVfcHJlZml4KCBzbmRfY29udHJvbCwgYXNpaHBpX2NvbnRyb2wgKTsKKwlzdHJjYXQo c25kX2NvbnRyb2wtPm5hbWUsICIgRnJlcSIpOworCisJc25kX3J1bnRpbWVfY2hlY2soIGN0bF9h ZGQoIGNhcmQsIHNuZF9jb250cm9sLCBhc2locGkgKSAhPSAwLCByZXR1cm4gLUVJTlZBTCApOwor CisvKiBMZXZlbCBtZXRlciAqLworCisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1ldGVy IGNvbnRyb2xzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgc25kX2FzaWhwaV9tZXRlcl9pbmZvKHNuZF9r Y29udHJvbF90ICoga2NvbnRyb2wsCkBAIC0xNDM3LDYgKzIwMTUsNyBAQAogLyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1p eGVyCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKi8KKwogc3RhdGljIGludCBfX2luaXQgc25kX2NhcmRfYXNpaHBpX25ld19taXhl cihzbmRfY2FyZF9hc2locGlfdCAqIGFzaWhwaSkKIHsKIAlzbmRfY2FyZF90ICpjYXJkID0gYXNp aHBpLT5jYXJkOwpAQCAtMTUyNSwxMCArMjEwNCwxOSBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSFBJ X0NPTlRST0xfQ09OTkVDVElPTjoJLy8gaWdub3JlIHRoZXNlCiAJCQljb250aW51ZTsKLQkJY2Fz ZSBIUElfQ09OVFJPTF9NVVRFOgorCQljYXNlIEhQSV9DT05UUk9MX1RVTkVSOgorCQkJc25kX3J1 bnRpbWVfY2hlY2soIHNuZF9hc2locGlfdHVuZXJfbmV3KGFzaWhwaSwgJmFzaWhwaV9jb250cm9s LAorCQkJCQkgICAgICZzbmRfY29udHJvbCkgPj0gMCwgcmV0dXJuIC1FSU5WQUwgKTsKKwkJCWNv bnRpbnVlOwogCQljYXNlIEhQSV9DT05UUk9MX0FFU0VCVV9UUkFOU01JVFRFUjoKKwkJCXNuZF9y dW50aW1lX2NoZWNrKCBzbmRfYXNpaHBpX2Flc2VidV90eF9uZXcoYXNpaHBpLCAmYXNpaHBpX2Nv bnRyb2wsCisJCQkJCSAgICAgJnNuZF9jb250cm9sKSA+PSAwLCByZXR1cm4gLUVJTlZBTCApOwor CQkJY29udGludWU7CiAJCWNhc2UgSFBJX0NPTlRST0xfQUVTRUJVX1JFQ0VJVkVSOgotCQljYXNl IEhQSV9DT05UUk9MX1RVTkVSOgorCQkJc25kX3J1bnRpbWVfY2hlY2soIHNuZF9hc2locGlfYWVz ZWJ1X3J4X25ldyhhc2locGksICZhc2locGlfY29udHJvbCwKKwkJCQkJICAgICAmc25kX2NvbnRy b2wpID49IDAsIHJldHVybiAtRUlOVkFMICk7CisJCQljb250aW51ZTsKKwkJY2FzZSBIUElfQ09O VFJPTF9NVVRFOgogCQljYXNlIEhQSV9DT05UUk9MX09OT0ZGU1dJVENIOgogCQljYXNlIEhQSV9D T05UUk9MX1ZPWDoKIAkJY2FzZSBIUElfQ09OVFJPTF9CSVRTVFJFQU06Cgo= ------_SmarterMail_NextPart_5355760445588004-- ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf