From kde-multimedia Sun Oct 21 19:29:56 2001 From: Matthias Kretz Date: Sun, 21 Oct 2001 19:29:56 +0000 To: kde-multimedia Subject: recording stream X-MARC-Message: https://marc.info/?l=kde-multimedia&m=100370840802188 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------Boundary-00=_W5MK8FLQNN7K9MERMTP2" --------------Boundary-00=_W5MK8FLQNN7K9MERMTP2 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I finally got recording from aRts working. I did a lot of stuff so let me= sum=20 up: - A play stream works using the ByteSoundProducer interface. Therefor I=20 created a ByteSoundReceiver. - Now the ByteSoundProducer was attached to the soundserver using=20 SimpleSoundServer->attach(ByteSoundProducer). To make it usable for me I=20 created another interface ByteSoundStream that is used for both the=20 ByteSoundProducer and ByteSoundReceiver. So I changed the method to=20 SimpleSoundServer->attach(ByteSoundStream). This is, of course, not binar= y=20 compatible. I don't know about wire compatibility (I only know that noatu= n=20 1.2.0 (KDE 2.2) still works). Uhmm, while testing for WC I found out that artscat and artsdsp (from KDE= =20 2.2) won't work with my changes. But it works if I don't use the=20 ByteSoundStream interface but simply SynthModule. So the method would be=20 SimpleSoundServer->attach(SynthModule). I guess this is the better way, a= nd=20 probably the more flexible, too. If I'm right WC will be preserved this w= ay. - RecordStreamJob: The same as the PlaySreamJob, only using an=20 AudioToByteStream instead of ByteToAudioStream. - artsdump: The same as artscat for dumping a ByteStream from aRts to a f= ile=20 or stdout. - The AudioToByteStream interface was another hurdle on the way. If I rea= d=20 the code correctly the Resampler isn't able to convert from an aRts input= to=20 a bytestream, and also can't be fitted to do that easily. So I wrote my o= wn=20 resampler in this class. I'm not sure whether this is the right way to go= and=20 I'm open for better ideas. - Finally I worked on the artsc interface to support the new recording=20 capabilities. In artscbackend.cc there was one class Sender that would create the=20 bytestream. I copied this to a new class Stream that holds everything a=20 Receiver needs as well. Receiver and Sender inherit from Stream. Now the = only=20 problem were the ArtsCApi methods that would have to be able to call meth= ods=20 of Sender as well as of Receiver while they only receive a void*. I tried= to=20 cast like this: int stream_set(arts_stream_t stream, arts_parameter_t param, int value) { SynthModule *_stream =3D (SynthModule *)stream; if( _stream->_interfaceName() =3D=3D "Arts::ByteStreamProducer" ) But the program would just crash in _stream->_interfaceName() because=20 somewhere a dangling pointer, that should be pointing to the base class, = was=20 being used. So I tried something else: int stream_set(arts_stream_t stream, arts_parameter_t param, int value) { Stream *_stream =3D (Stream *)stream; if( _stream->direction() =3D=3D Stream::RECORDSTREAM ) But now _stream would somehow (I have no clue, but gdb said so) be 0x0 wh= en=20 _stream->direction() gets called. I finally got it working by doing the=20 following: int stream_set(arts_stream_t stream, arts_parameter_t param, int value) { Sender *_stream =3D (Sender *)stream; _stream->stream_set(param,value); } That works even if stream is a Receiver. I have a bad feeling about this,= but=20 this is the only way I found to get it working. I'll commit next Friday if nobody objects. --=20 C'ya Matthias ________________________________________________________ Matthias Kretz (Germany) http://Kretz.dyndns.org/ MatthiasKretz@gmx.net, kretz@kde.org --------------Boundary-00=_W5MK8FLQNN7K9MERMTP2 Content-Type: text/x-diff; charset="iso-8859-1"; name="artsrecording.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="artsrecording.patch" SW5kZXg6IGFydHNjL2FydHNjYmFja2VuZC5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9r ZGUva2RlbGlicy9hcnRzL2FydHNjL2FydHNjYmFja2VuZC5jYyx2CnJldHJpZXZpbmcgcmV2aXNp b24gMS4xNQpkaWZmIC11IC0zIC1wIC1yMS4xNSBhcnRzY2JhY2tlbmQuY2MKLS0tIGFydHNjL2Fy dHNjYmFja2VuZC5jYwkyMDAxLzAxLzE3IDE1OjIxOjI2CTEuMTUKKysrIGFydHNjL2FydHNjYmFj a2VuZC5jYwkyMDAxLzEwLzIxIDE5OjE0OjU3CkBAIC00MCwzNCArNDAsMjcgQEAgdXNpbmcgbmFt ZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBBcnRzOwogCiAKLWNsYXNzIFNlbmRlciA6CXB1 YmxpYyBCeXRlU291bmRQcm9kdWNlcl9za2VsLAotCQkJCXB1YmxpYyBTdGRTeW50aE1vZHVsZQor Y2xhc3MgU3RyZWFtCiB7Ci0JU291bmRTZXJ2ZXIgc2VydmVyOwotCWZsb2F0IHNlcnZlckJ1ZmZl clRpbWU7Ci0KLQkvKgotCSAqIEZJWE1FOiBic1dyYXBwZXIgaXMgYSBtb3JlIG9yIGxlc3MgdWds eSB0cmljayB0byBiZSBhYmxlIHRvIHVzZQotCSAqIHRoaXMgb2JqZWN0IGFsdGhvdWdoIG5vdCB1 c2luZyBzbWFydHdyYXBwZXJzIHRvIGFjY2VzcyBpdAotCSAqLwotCUJ5dGVTb3VuZFByb2R1Y2Vy IGJzV3JhcHBlcjsKK3Byb3RlY3RlZDoKKwlTb3VuZFNlcnZlciBtX3NlcnZlcjsKKwlmbG9hdCBt X3NlcnZlckJ1ZmZlclRpbWU7CiAKLQlib29sIF9maW5pc2hlZCwgaXNBdHRhY2hlZDsKLQlpbnQg X3NhbXBsaW5nUmF0ZSwgX2JpdHMsIF9jaGFubmVscywgcG9zOwotCXN0cmluZyBfbmFtZTsKLQlx dWV1ZTwgRGF0YVBhY2tldDxtY29wYnl0ZT4qID4gb3V0cXVldWU7CisJYm9vbCBtX2ZpbmlzaGVk LCBtX2lzQXR0YWNoZWQ7CisJaW50IG1fc2FtcGxpbmdSYXRlLCBtX2JpdHMsIG1fY2hhbm5lbHMs IG1fcG9zOworCXN0cmluZyBtX25hbWU7CisJcXVldWU8IERhdGFQYWNrZXQ8bWNvcGJ5dGU+KiA+ IG1fcXVldWU7CiAKLQlpbnQgcGFja2V0Q291bnQsIHBhY2tldENhcGFjaXR5OwotCWludCBibG9j a2luZ0lPOworCWludCBtX3BhY2tldENvdW50LCBtX3BhY2tldENhcGFjaXR5OworCWludCBtX2Js b2NraW5nSU87CiAKLXByb3RlY3RlZDoKIAkvKioKIAkgKiByZXR1cm5zIHRoZSBhbW91bnQgb2Yg Ynl0ZXMgdGhhdCB3aWxsIGJlIHBsYXllZCBpbiBhIGdpdmVuIGFtb3VudCBvZgogCSAqIHRpbWUg aW4gbWlsbGlzZWNvbmRzCiAJICovCiAJaW50IHRpbWVUb0J5dGVzKGZsb2F0IHRpbWUpCiAJewot ICAgIAlmbG9hdCBwbGF5U3BlZWQgPSBjaGFubmVscygpICogc2FtcGxpbmdSYXRlKCkgKiBiaXRz KCkgLyA4OworICAgIAlmbG9hdCBwbGF5U3BlZWQgPSBtX2NoYW5uZWxzICogbV9zYW1wbGluZ1Jh dGUgKiBtX2JpdHMgLyA4OwogCQlyZXR1cm4gKGludCkocGxheVNwZWVkICogKHRpbWUgLyAxMDAw LjApKTsKIAl9CiAKQEAgLTc3LDEyICs3MCwxMiBAQCBwcm90ZWN0ZWQ6CiAJICovCiAJZmxvYXQg Ynl0ZXNUb1RpbWUoaW50IHNpemUpCiAJewotICAgIAlmbG9hdCBwbGF5U3BlZWQgPSBjaGFubmVs cygpICogc2FtcGxpbmdSYXRlKCkgKiBiaXRzKCkgLyA4OworICAgIAlmbG9hdCBwbGF5U3BlZWQg PSBtX2NoYW5uZWxzICogbV9zYW1wbGluZ1JhdGUgKiBtX2JpdHMgLyA4OwogCQlyZXR1cm4gKDEw MDAuMCAqICgoZmxvYXQpc2l6ZSkgLyBwbGF5U3BlZWQpOwogCX0KIAogCWludCBidWZmZXJTaXpl KCkgewotCQlyZXR1cm4gcGFja2V0Q291bnQgKiBwYWNrZXRDYXBhY2l0eTsKKwkJcmV0dXJuIG1f cGFja2V0Q291bnQgKiBtX3BhY2tldENhcGFjaXR5OwogCX0KIAogCWZsb2F0IGJ1ZmZlclRpbWUo KSB7CkBAIC05NywxMiArOTAsMTIgQEAgcHJvdGVjdGVkOgogCQkvKiBtYWtlIHN1cmUgdGhhdCBv dXIgaW5mb3JtYXRpb24gaXMgdXAtdG8tZGF0ZSAqLwogCQlEaXNwYXRjaGVyOjp0aGUoKS0+aW9N YW5hZ2VyKCktPnByb2Nlc3NPbmVFdmVudChmYWxzZSk7CiAKLQkJaWYoIW91dHF1ZXVlLmVtcHR5 KCkpCisJCWlmKCFtX3F1ZXVlLmVtcHR5KCkpCiAJCXsKLQkJCXNwYWNlICs9IHBhY2tldENhcGFj aXR5IC0gcG9zOyAgLyogdGhlIGZpcnN0LCBoYWxmIGZpbGxlZCBwYWNrZXQgKi8KKwkJCXNwYWNl ICs9IG1fcGFja2V0Q2FwYWNpdHkgLSBtX3BvczsgIC8qIHRoZSBmaXJzdCwgaGFsZiBmaWxsZWQg cGFja2V0ICovCiAKLQkJCWlmKG91dHF1ZXVlLnNpemUoKSA+IDEpCQkJLyogYW5kIHRoZSBvdGhl ciwgZW1wdHkgcGFja2V0cyAqLwotCQkJCXNwYWNlICs9IChvdXRxdWV1ZS5zaXplKCktMSkqcGFj a2V0Q2FwYWNpdHk7CisJCQlpZihtX3F1ZXVlLnNpemUoKSA+IDEpCQkJLyogYW5kIHRoZSBvdGhl ciwgZW1wdHkgcGFja2V0cyAqLworCQkJCXNwYWNlICs9IChtX3F1ZXVlLnNpemUoKS0xKSptX3Bh Y2tldENhcGFjaXR5OwogCQl9CiAJCXJldHVybiBzcGFjZTsKIAl9CkBAIC0xMTAsNyArMTAzLDcg QEAgcHJvdGVjdGVkOgogCWludCBzZXRCdWZmZXJTaXplKGludCBzaXplKQogCXsKIAkJLyogZG9u J3QgY2hhbmdlIHNpemVzIHdoZW4gYWxyZWFkeSBzdHJlYW1pbmcgKi8KLQkJaWYoaXNBdHRhY2hl ZCkKKwkJaWYobV9pc0F0dGFjaGVkKQogCQkJcmV0dXJuIEFSVFNfRV9OT0lNUEw7CiAKIAkJLyoK QEAgLTExOSw4ICsxMTIsOCBAQCBwcm90ZWN0ZWQ6CiAJCSAqIHRoaXMgaXMgcG9zc2libGUgLSBm b3Igbm93LCBkb24ndCByZXF1ZXN0IHRoZSBpbXBvc3NpYmxlIG9yIGRvbid0CiAJCSAqIGNvbXBs YWluIGlmIGl0IGRvZXNuJ3Qgd29yawogCQkgKi8KLQkJcGFja2V0Q291bnQgPSAzOwotCQlwYWNr ZXRDYXBhY2l0eSA9IDEyODsKKwkJbV9wYWNrZXRDb3VudCA9IDM7CisJCW1fcGFja2V0Q2FwYWNp dHkgPSAxMjg7CiAKIAkJLyoKIAkJICogLSBkbyBub3QgY29uZmlndXJlIHN0cmVhbSBidWZmZXJz IHNtYWxsZXIgdGhhbiB0aGUgc2VydmVyCkBAIC0xMjgsMTUgKzEyMSwxNSBAQCBwcm90ZWN0ZWQ6 CiAJCSAqIC0gdHJ5IHRvIGdldCBtb3JlIG9yIGxlc3MgY2xvc2UgdG8gdGhlIHZhbHVlIHRoZSBh cHBsaWNhdGlvbgogCQkgKiAgIHdhbnRzCiAJCSAqLwotCQlpbnQgbmVlZFNpemUgPSBtYXgoc2l6 ZSwgdGltZVRvQnl0ZXMoc2VydmVyLm1pblN0cmVhbUJ1ZmZlclRpbWUoKSkpOworCQlpbnQgbmVl ZFNpemUgPSBtYXgoc2l6ZSwgdGltZVRvQnl0ZXMobV9zZXJ2ZXIubWluU3RyZWFtQnVmZmVyVGlt ZSgpKSk7CiAKIAkJd2hpbGUoYnVmZmVyU2l6ZSgpIDwgbmVlZFNpemUpCiAJCXsKLQkJCXBhY2tl dENvdW50Kys7Ci0JCQlpZihwYWNrZXRDb3VudCA9PSA4KQorCQkJbV9wYWNrZXRDb3VudCsrOwor CQkJaWYobV9wYWNrZXRDb3VudCA9PSA4KQogCQkJewotCQkJCXBhY2tldENvdW50IC89IDI7Ci0J CQkJcGFja2V0Q2FwYWNpdHkgKj0gMjsKKwkJCQltX3BhY2tldENvdW50IC89IDI7CisJCQkJbV9w YWNrZXRDYXBhY2l0eSAqPSAyOwogCQkJfQogCQl9CiAKQEAgLTE0NywyOSArMTQwLDI5IEBAIHBy b3RlY3RlZDoKIAl7CiAJCWludCBzZXR0aW5ncyA9IDA7CiAKLQkJaW50IGNhcCA9IHBhY2tldENh cGFjaXR5OworCQlpbnQgY2FwID0gbV9wYWNrZXRDYXBhY2l0eTsKIAkJd2hpbGUoY2FwID4gMSkK IAkJewogCQkJc2V0dGluZ3MrKzsKIAkJCWNhcCAvPSAyOwogCQl9CiAKLQkJc2V0dGluZ3MgfD0g cGFja2V0Q291bnQgPDwgMTY7CisJCXNldHRpbmdzIHw9IG1fcGFja2V0Q291bnQgPDwgMTY7CiAJ CXJldHVybiBzZXR0aW5nczsKIAl9CiAKIAlpbnQgc2V0UGFja2V0U2V0dGluZ3MoaW50IHNldHRp bmdzKQogCXsKIAkJLyogZG9uJ3QgY2hhbmdlIHNpemVzIHdoZW4gYWxyZWFkeSBzdHJlYW1pbmcg Ki8KLQkJaWYoaXNBdHRhY2hlZCkKKwkJaWYobV9pc0F0dGFjaGVkKQogCQkJcmV0dXJuIEFSVFNf RV9OT0lNUEw7CiAKLQkJcGFja2V0Q291bnQgPSBzZXR0aW5ncyA+PiAxNjsKKwkJbV9wYWNrZXRD b3VudCA9IHNldHRpbmdzID4+IDE2OwogCQkKLQkJcGFja2V0Q2FwYWNpdHkgPSAxOworCQltX3Bh Y2tldENhcGFjaXR5ID0gMTsKIAkJaW50IGMgPSBzZXR0aW5ncyAmIDB4ZmZmZjsKIAkJd2hpbGUo YyA+IDApIHsKLQkJCXBhY2tldENhcGFjaXR5ICo9IDI7CisJCQltX3BhY2tldENhcGFjaXR5ICo9 IDI7CiAJCQljLS07CiAJCX0KIApAQCAtMTc4LDU5ICsxNzEsMzYgQEAgcHJvdGVjdGVkOgogCQkg KiAgIHJlY29tbWVuZGVkIHZhbHVlCiAJCSAqIC0ga2VlcCB0aGUgcGFja2V0U2l6ZSB0aGUgYXBw bGljYXRpb25zIHNwZWNpZmllZAogCQkgKi8KLQkJaW50IG5lZWRTaXplID0gdGltZVRvQnl0ZXMo c2VydmVyLm1pblN0cmVhbUJ1ZmZlclRpbWUoKSk7CisJCWludCBuZWVkU2l6ZSA9IHRpbWVUb0J5 dGVzKG1fc2VydmVyLm1pblN0cmVhbUJ1ZmZlclRpbWUoKSk7CiAKIAkJd2hpbGUoYnVmZmVyU2l6 ZSgpIDwgbmVlZFNpemUpCi0JCQlwYWNrZXRDb3VudCsrOworCQkJbV9wYWNrZXRDb3VudCsrOwog CiAJCXJldHVybiBwYWNrZXRTZXR0aW5ncygpOwogCX0KIAotCi0Jdm9pZCBhdHRhY2goKQotCXsK LQkJaWYoIWlzQXR0YWNoZWQpCi0JCXsKLQkJCWlzQXR0YWNoZWQgPSB0cnVlOwogCi0JCQlzZXJ2 ZXIuYXR0YWNoKGJzV3JhcHBlcik7Ci0JCQlzdGFydCgpOwotCi0gICAgICAgICAgICAvKgotICAg ICAgICAgICAgICogVE9ETzogdGhpcyBwcm9jZXNzT25lRXZlbnQgbG9va3MgYSBiaXQgc3RyYW5n ZSBoZXJlLi4uIGl0IGlzCi0gICAgICAgICAgICAgKiB0aGVyZSBzaW5jZSBTdGRJT01hbmFnZXIg ZG9lcyBibG9jayA1IHNlY29uZHMgb24gdGhlIGZpcnN0Ci0gICAgICAgICAgICAgKiBhcnRzX3dy aXRlIGlmIGl0IGlzbid0IC0gYWx0aG91Z2ggbm90aWZpY2F0aW9ucyBhcmUgcGVuZGluZwotICAg ICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFByb2JhYmx5IHRoZSByZWFsIHNvbHV0aW9uIGlz IHRvIHJld3JpdGUgdGhlCi0gICAgICAgICAgICAgKiBTdGRJT01hbmFnZXI6OnByb2Nlc3NPbmVF dmVudCBmdW5jdGlvbi4gKEFuZCBtYXliZSBkcm9wIHRoZQotICAgICAgICAgICAgICogYXNzdW1w dGlvbiB0aGF0IGFSdHMgd2lsbCBub3QgYmxvY2sgd2hlbiBhbiBpbmZpbml0ZSBhbW91bnQKLSAg ICAgICAgICAgICAqIG9mIG5vdGlmaWNhdGlvbnMgaXMgcGVuZGluZyAtIEkgbWVhbjogd2lsbCBp dCBldmVyIGhhcHBlbj8pCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIERpc3BhdGNoZXI6 OnRoZSgpLT5pb01hbmFnZXIoKS0+cHJvY2Vzc09uZUV2ZW50KGZhbHNlKTsKLQkJfQotCX0KKwl2 aXJ0dWFsIHZvaWQgYXR0YWNoKCkgPSAwOwogCiBwdWJsaWM6Ci0JU2VuZGVyKFNvdW5kU2VydmVy IHNlcnZlciwgaW50IHJhdGUsIGludCBiaXRzLCBpbnQgY2hhbm5lbHMsCi0JCXN0cmluZyBuYW1l KSA6IHNlcnZlcihzZXJ2ZXIpLCBfZmluaXNoZWQoZmFsc2UpLCBpc0F0dGFjaGVkKGZhbHNlKSwK LQkJX3NhbXBsaW5nUmF0ZShyYXRlKSwgX2JpdHMoYml0cyksIF9jaGFubmVscyhjaGFubmVscyks IHBvcygwKSwKLQkJX25hbWUobmFtZSkKKwlTdHJlYW0oU291bmRTZXJ2ZXIgc2VydmVyLCBpbnQg cmF0ZSwgaW50IGJpdHMsIGludCBjaGFubmVscywKKwkJc3RyaW5nIG5hbWUpIDogbV9zZXJ2ZXIo c2VydmVyKSwgbV9maW5pc2hlZChmYWxzZSksIG1faXNBdHRhY2hlZChmYWxzZSksCisJCW1fc2Ft cGxpbmdSYXRlKHJhdGUpLCBtX2JpdHMoYml0cyksIG1fY2hhbm5lbHMoY2hhbm5lbHMpLCBtX3Bv cygwKSwKKwkJbV9uYW1lKG5hbWUpCiAJewotCQlzZXJ2ZXJCdWZmZXJUaW1lID0gc2VydmVyLnNl cnZlckJ1ZmZlclRpbWUoKTsKKwkJbV9zZXJ2ZXJCdWZmZXJUaW1lID0gbV9zZXJ2ZXIuc2VydmVy QnVmZmVyVGltZSgpOwogCQlzdHJlYW1fc2V0KEFSVFNfUF9CVUZGRVJfU0laRSw2NCoxMDI0KTsK IAkJc3RyZWFtX3NldChBUlRTX1BfQkxPQ0tJTkcsMSk7Ci0JCWJzV3JhcHBlciA9IEJ5dGVTb3Vu ZFByb2R1Y2VyOjpfZnJvbV9iYXNlKHRoaXMpOworCQkvL2JzV3JhcHBlciA9IEJ5dGVTb3VuZFBy b2R1Y2VyOjpfZnJvbV9iYXNlKHRoaXMpOwogCX0KLQl+U2VuZGVyKCkKKwl2aXJ0dWFsIH5TdHJl YW0oKQogCXsKIAkJLy8KIAl9Ci0JbG9uZyBzYW1wbGluZ1JhdGUoKSB7IHJldHVybiBfc2FtcGxp bmdSYXRlOyB9Ci0JbG9uZyBjaGFubmVscygpICAgICB7IHJldHVybiBfY2hhbm5lbHM7IH0KLQls b25nIGJpdHMoKSAgICAgICAgIHsgcmV0dXJuIF9iaXRzOyB9Ci0JYm9vbCBmaW5pc2hlZCgpICAg ICB7IHJldHVybiBfZmluaXNoZWQ7IH0KKworCWVudW0gU3RyZWFtRGlyZWN0aW9uIHsgUExBWVNU UkVBTSwgUkVDT1JEU1RSRUFNIH07CiAKLQlpbnQgc3RyZWFtX3NldChhcnRzX3BhcmFtZXRlcl90 IHBhcmFtLCBpbnQgdmFsdWUpCisJdmlydHVhbCBpbnQgc3RyZWFtX3NldChhcnRzX3BhcmFtZXRl cl90IHBhcmFtLCBpbnQgdmFsdWUpCiAJewogCQlpbnQgcmVzdWx0OwogCkBAIC0yNDksOCArMjE5 LDggQEAgcHVibGljOgogCQkJY2FzZSBBUlRTX1BfQkxPQ0tJTkc6CiAJCQkJaWYodmFsdWUgIT0g MCAmJiB2YWx1ZSAhPSAxKSByZXR1cm4gQVJUU19FX05PSU1QTDsKIAotCQkJCWJsb2NraW5nSU8g PSB2YWx1ZTsKLQkJCQlyZXR1cm4gYmxvY2tpbmdJTzsKKwkJCQltX2Jsb2NraW5nSU8gPSB2YWx1 ZTsKKwkJCQlyZXR1cm4gbV9ibG9ja2luZ0lPOwogCQkJLyoKIAkJCSAqIG1heWJlIEFSVFNfUF9U T1RBTF9MQVRFTkNZIF9jb3VsZF8gYmUgbWFkZSB3cml0ZWFibGUsIHRoZQogCQkJICogb3RoZXJz IGFyZSBvZiBjb3Vyc2UgdXNlbGVzcwpAQCAtMjY1LDcgKzIzNSw3IEBAIHB1YmxpYzoKIAkJcmV0 dXJuIEFSVFNfRV9OT0lNUEw7CiAJfQogCi0JaW50IHN0cmVhbV9nZXQoYXJ0c19wYXJhbWV0ZXJf dCBwYXJhbSkKKwl2aXJ0dWFsIGludCBzdHJlYW1fZ2V0KGFydHNfcGFyYW1ldGVyX3QgcGFyYW0p CiAJewogCQlzd2l0Y2gocGFyYW0pIHsKIAkJCWNhc2UgQVJUU19QX0JVRkZFUl9TSVpFOgpAQCAt MjgxLDc1ICsyNTEsMjQ3IEBAIHB1YmxpYzoKIAkJCQlyZXR1cm4gcGFja2V0U2V0dGluZ3MoKTsK IAogCQkJY2FzZSBBUlRTX1BfU0VSVkVSX0xBVEVOQ1k6Ci0JCQkJcmV0dXJuIChpbnQpc2VydmVy QnVmZmVyVGltZTsKKwkJCQlyZXR1cm4gKGludCltX3NlcnZlckJ1ZmZlclRpbWU7CiAKIAkJCWNh c2UgQVJUU19QX1RPVEFMX0xBVEVOQ1k6CiAJCQkJcmV0dXJuIHN0cmVhbV9nZXQoQVJUU19QX1NF UlZFUl9MQVRFTkNZKQogCQkJCSAgICAgKyBzdHJlYW1fZ2V0KEFSVFNfUF9CVUZGRVJfVElNRSk7 CiAKIAkJCWNhc2UgQVJUU19QX0JMT0NLSU5HOgotCQkJCXJldHVybiBibG9ja2luZ0lPOworCQkJ CXJldHVybiBtX2Jsb2NraW5nSU87CiAKIAkJCWNhc2UgQVJUU19QX1BBQ0tFVF9TSVpFOgotCQkJ CXJldHVybiBwYWNrZXRDYXBhY2l0eTsKKwkJCQlyZXR1cm4gbV9wYWNrZXRDYXBhY2l0eTsKIAog CQkJY2FzZSBBUlRTX1BfUEFDS0VUX0NPVU5UOgotCQkJCXJldHVybiBwYWNrZXRDb3VudDsKKwkJ CQlyZXR1cm4gbV9wYWNrZXRDb3VudDsKIAkJfQogCQlyZXR1cm4gQVJUU19FX05PSU1QTDsKIAl9 CiAKKwlpbnQgc3VzcGVuZCgpCisJeworCQlpZihtX2lzQXR0YWNoZWQpCisJCXsKKwkJCXJldHVy biBtX3NlcnZlci5zdXNwZW5kKCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorfTsKKworY2xhc3Mg UmVjZWl2ZXIgOglwdWJsaWMgQnl0ZVNvdW5kUmVjZWl2ZXJfc2tlbCwKKwkJCQkJcHVibGljIFN0 ZFN5bnRoTW9kdWxlLAorCQkJCQlwdWJsaWMgU3RyZWFtCit7CisJLyoKKwkgKiBGSVhNRTogYnNX cmFwcGVyIGlzIGEgbW9yZSBvciBsZXNzIHVnbHkgdHJpY2sgdG8gYmUgYWJsZSB0byB1c2UKKwkg KiB0aGlzIG9iamVjdCBhbHRob3VnaCBub3QgdXNpbmcgc21hcnR3cmFwcGVycyB0byBhY2Nlc3Mg aXQKKwkgKi8KKwlCeXRlU291bmRSZWNlaXZlciBtX2JzV3JhcHBlcjsKKworcHJvdGVjdGVkOgor CXZpcnR1YWwgdm9pZCBhdHRhY2goKQorCXsKKwkJaWYoIW1faXNBdHRhY2hlZCkKKwkJeworCQkJ bV9pc0F0dGFjaGVkID0gdHJ1ZTsKKworCQkJbV9zZXJ2ZXIuYXR0YWNoKG1fYnNXcmFwcGVyKTsK KwkJCXN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUT0RPOiB0aGlz IHByb2Nlc3NPbmVFdmVudCBsb29rcyBhIGJpdCBzdHJhbmdlIGhlcmUuLi4gaXQgaXMKKyAgICAg ICAgICAgICAqIHRoZXJlIHNpbmNlIFN0ZElPTWFuYWdlciBkb2VzIGJsb2NrIDUgc2Vjb25kcyBv biB0aGUgZmlyc3QKKyAgICAgICAgICAgICAqIGFydHNfd3JpdGUgaWYgaXQgaXNuJ3QgLSBhbHRo b3VnaCBub3RpZmljYXRpb25zIGFyZSBwZW5kaW5nCisgICAgICAgICAgICAgKgorICAgICAgICAg ICAgICogUHJvYmFibHkgdGhlIHJlYWwgc29sdXRpb24gaXMgdG8gcmV3cml0ZSB0aGUKKyAgICAg ICAgICAgICAqIFN0ZElPTWFuYWdlcjo6cHJvY2Vzc09uZUV2ZW50IGZ1bmN0aW9uLiAoQW5kIG1h eWJlIGRyb3AgdGhlCisgICAgICAgICAgICAgKiBhc3N1bXB0aW9uIHRoYXQgYVJ0cyB3aWxsIG5v dCBibG9jayB3aGVuIGFuIGluZmluaXRlIGFtb3VudAorICAgICAgICAgICAgICogb2Ygbm90aWZp Y2F0aW9ucyBpcyBwZW5kaW5nIC0gSSBtZWFuOiB3aWxsIGl0IGV2ZXIgaGFwcGVuPykKKyAgICAg ICAgICAgICAqLworICAgICAgICAgICAgRGlzcGF0Y2hlcjo6dGhlKCktPmlvTWFuYWdlcigpLT5w cm9jZXNzT25lRXZlbnQoZmFsc2UpOworCQl9CisJfQorCitwdWJsaWM6CisJUmVjZWl2ZXIoU291 bmRTZXJ2ZXIgc2VydmVyLCBpbnQgcmF0ZSwgaW50IGJpdHMsIGludCBjaGFubmVscywKKwkJc3Ry aW5nIG5hbWUpIDogU3RyZWFtKCBzZXJ2ZXIsIHJhdGUsIGJpdHMsIGNoYW5uZWxzLCBuYW1lKQor CXsKKwkJbV9ic1dyYXBwZXIgPSBCeXRlU291bmRSZWNlaXZlcjo6X2Zyb21fYmFzZSh0aGlzKTsK Kwl9CisKKwl2aXJ0dWFsIH5SZWNlaXZlcigpIHsKKwkJLy8KKwl9CisKKwlsb25nIHNhbXBsaW5n UmF0ZSgpIHsgcmV0dXJuIG1fc2FtcGxpbmdSYXRlOyB9CisJbG9uZyBjaGFubmVscygpICAgICB7 IHJldHVybiBtX2NoYW5uZWxzOyB9CisJbG9uZyBiaXRzKCkgICAgICAgICB7IHJldHVybiBtX2Jp dHM7IH0KKwlib29sIGZpbmlzaGVkKCkgICAgIHsgcmV0dXJuIG1fZmluaXNoZWQ7IH0KKworCXZv aWQgcHJvY2Vzc19pbmRhdGEoRGF0YVBhY2tldDxtY29wYnl0ZT4gKnBhY2tldCkKKwl7CisJCW1f cXVldWUucHVzaChwYWNrZXQpOworCX0KKworCXZvaWQgY2xvc2UoKQorCXsKKwkJaWYobV9pc0F0 dGFjaGVkKQorCQl7CisJCQkvKiByZW1vdmUgYWxsIHBhY2tldHMgZnJvbSB0aGUgbV9xdWV1ZSAq LworCQkJd2hpbGUoIW1fcXVldWUuZW1wdHkoKSkKKwkJCXsKKwkJCQlEYXRhUGFja2V0PG1jb3Bi eXRlPiAqcGFja2V0ID0gbV9xdWV1ZS5mcm9udCgpOworCQkJCXBhY2tldC0+cHJvY2Vzc2VkKCk7 CisJCQkJbV9xdWV1ZS5wb3AoKTsKKwkJCX0KKworCQkJbV9zZXJ2ZXIuZGV0YWNoKG1fYnNXcmFw cGVyKTsKKwkJfQorCQkvLyBzaW1pbGFyIGVmZmVjdCBsaWtlICJkZWxldGUgdGhpczsiCQkKKwkJ bV9ic1dyYXBwZXIgPSBCeXRlU291bmRSZWNlaXZlcjo6bnVsbCgpOworCX0KKworCWludCByZWFk KG1jb3BieXRlICpkYXRhLCBpbnQgc2l6ZSkKKwl7CisJCWF0dGFjaCgpOworCisJCWludCByZW1h aW5pbmcgPSBzaXplOworCQl3aGlsZShyZW1haW5pbmcpCisJCXsKKwkJCWlmKG1fYmxvY2tpbmdJ TykKKwkJCXsKKwkJCQkvKiBDIEFQSSBibG9ja2luZyBzdHlsZSB3cml0ZSAqLworCQkJCXdoaWxl KG1fcXVldWUuZW1wdHkoKSkKKwkJCQkJRGlzcGF0Y2hlcjo6dGhlKCktPmlvTWFuYWdlcigpLT5w cm9jZXNzT25lRXZlbnQodHJ1ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogbm9uIGJs b2NraW5nIEkvTyAqLworCQkJCWlmKG1fcXVldWUuZW1wdHkoKSkKKwkJCQkJRGlzcGF0Y2hlcjo6 dGhlKCktPmlvTWFuYWdlcigpLT5wcm9jZXNzT25lRXZlbnQoZmFsc2UpOworCisJCQkJLyogc3Rp bGwgbm8gbW9yZSBzcGFjZSB0byB3cml0ZT8gKi8KKwkJCQlpZihtX3F1ZXVlLmVtcHR5KCkpCisJ CQkJCXJldHVybiBzaXplIC0gcmVtYWluaW5nOworCQkJfQorCisJCQkvKiBnZXQgYSBwYWNrZXQg Ki8KKwkJCURhdGFQYWNrZXQ8bWNvcGJ5dGU+ICpwYWNrZXQgPSBtX3F1ZXVlLmZyb250KCk7CisK KwkJCS8qIGNvcHkgc29tZSBkYXRhIHRoZXJlICovCisJCQlpbnQgdG9jb3B5ID0gbWluKHJlbWFp bmluZyxwYWNrZXQtPnNpemUtbV9wb3MpOworCQkJbWVtY3B5KGRhdGEsJnBhY2tldC0+Y29udGVu dHNbbV9wb3NdLHRvY29weSk7CisJCQltX3BvcyArPSB0b2NvcHk7CisJCQlkYXRhICs9IHRvY29w eTsKKwkJCXJlbWFpbmluZyAtPSB0b2NvcHk7CisKKwkJCS8qIGhhdmUgd2UgZmlsbGVkIHVwIHRo ZSBwYWNrZXQ/IHRoZW4gc2VuZCBpdCAqLworCQkJaWYobV9wb3MgPT0gcGFja2V0LT5zaXplKQor CQkJeworCQkJCXBhY2tldC0+cHJvY2Vzc2VkKCk7CisJCQkJbV9xdWV1ZS5wb3AoKTsKKwkJCQlt X3BvcyA9IDA7CisJCQl9CisJCX0KKworCQkvKiBubyBwb3NzaWJsZSBlcnJvciBjb25kaXRpb25z ICovCisJCXJldHVybiBzaXplOworCX0KK307CisKK2NsYXNzIFNlbmRlciA6CXB1YmxpYyBCeXRl U291bmRQcm9kdWNlcl9za2VsLAorCQkJCXB1YmxpYyBTdGRTeW50aE1vZHVsZSwKKwkJCQlwdWJs aWMgU3RyZWFtCit7CisJLyoKKwkgKiBGSVhNRTogYnNXcmFwcGVyIGlzIGEgbW9yZSBvciBsZXNz IHVnbHkgdHJpY2sgdG8gYmUgYWJsZSB0byB1c2UKKwkgKiB0aGlzIG9iamVjdCBhbHRob3VnaCBu b3QgdXNpbmcgc21hcnR3cmFwcGVycyB0byBhY2Nlc3MgaXQKKwkgKi8KKwlCeXRlU291bmRQcm9k dWNlciBtX2JzV3JhcHBlcjsKKworcHJvdGVjdGVkOgorCXZpcnR1YWwgdm9pZCBhdHRhY2goKQor CXsKKwkJaWYoIW1faXNBdHRhY2hlZCkKKwkJeworCQkJbV9pc0F0dGFjaGVkID0gdHJ1ZTsKKwor CQkJbV9zZXJ2ZXIuYXR0YWNoKG1fYnNXcmFwcGVyKTsKKwkJCXN0YXJ0KCk7CisKKyAgICAgICAg ICAgIC8qCisgICAgICAgICAgICAgKiBUT0RPOiB0aGlzIHByb2Nlc3NPbmVFdmVudCBsb29rcyBh IGJpdCBzdHJhbmdlIGhlcmUuLi4gaXQgaXMKKyAgICAgICAgICAgICAqIHRoZXJlIHNpbmNlIFN0 ZElPTWFuYWdlciBkb2VzIGJsb2NrIDUgc2Vjb25kcyBvbiB0aGUgZmlyc3QKKyAgICAgICAgICAg ICAqIGFydHNfd3JpdGUgaWYgaXQgaXNuJ3QgLSBhbHRob3VnaCBub3RpZmljYXRpb25zIGFyZSBw ZW5kaW5nCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogUHJvYmFibHkgdGhlIHJlYWwg c29sdXRpb24gaXMgdG8gcmV3cml0ZSB0aGUKKyAgICAgICAgICAgICAqIFN0ZElPTWFuYWdlcjo6 cHJvY2Vzc09uZUV2ZW50IGZ1bmN0aW9uLiAoQW5kIG1heWJlIGRyb3AgdGhlCisgICAgICAgICAg ICAgKiBhc3N1bXB0aW9uIHRoYXQgYVJ0cyB3aWxsIG5vdCBibG9jayB3aGVuIGFuIGluZmluaXRl IGFtb3VudAorICAgICAgICAgICAgICogb2Ygbm90aWZpY2F0aW9ucyBpcyBwZW5kaW5nIC0gSSBt ZWFuOiB3aWxsIGl0IGV2ZXIgaGFwcGVuPykKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAg RGlzcGF0Y2hlcjo6dGhlKCktPmlvTWFuYWdlcigpLT5wcm9jZXNzT25lRXZlbnQoZmFsc2UpOwor CQl9CisJfQorCitwdWJsaWM6CisJU2VuZGVyKFNvdW5kU2VydmVyIHNlcnZlciwgaW50IHJhdGUs IGludCBiaXRzLCBpbnQgY2hhbm5lbHMsCisJCXN0cmluZyBuYW1lKSA6IFN0cmVhbSggc2VydmVy LCByYXRlLCBiaXRzLCBjaGFubmVscywgbmFtZSkKKwl7CisJCW1fYnNXcmFwcGVyID0gQnl0ZVNv dW5kUHJvZHVjZXI6Ol9mcm9tX2Jhc2UodGhpcyk7CisJfQorCisJdmlydHVhbCB+U2VuZGVyKCkg eworCQkvLworCX0KKworCWxvbmcgc2FtcGxpbmdSYXRlKCkgeyByZXR1cm4gbV9zYW1wbGluZ1Jh dGU7IH0KKwlsb25nIGNoYW5uZWxzKCkgICAgIHsgcmV0dXJuIG1fY2hhbm5lbHM7IH0KKwlsb25n IGJpdHMoKSAgICAgICAgIHsgcmV0dXJuIG1fYml0czsgfQorCWJvb2wgZmluaXNoZWQoKSAgICAg eyByZXR1cm4gbV9maW5pc2hlZDsgfQorCiAJdm9pZCBzdHJlYW1TdGFydCgpCiAJewogCQkvKgog CQkgKiBzdGFydCBzdHJlYW1pbmcKIAkJICovCi0JCW91dGRhdGEuc2V0UHVsbChwYWNrZXRDb3Vu dCwgcGFja2V0Q2FwYWNpdHkpOworCQlvdXRkYXRhLnNldFB1bGwobV9wYWNrZXRDb3VudCwgbV9w YWNrZXRDYXBhY2l0eSk7CiAJfQogCiAJdm9pZCByZXF1ZXN0X291dGRhdGEoRGF0YVBhY2tldDxt Y29wYnl0ZT4gKnBhY2tldCkKIAl7Ci0JCW91dHF1ZXVlLnB1c2gocGFja2V0KTsKKwkJbV9xdWV1 ZS5wdXNoKHBhY2tldCk7CiAJfQogCiAJdm9pZCBjbG9zZSgpCiAJewotCQlpZihpc0F0dGFjaGVk KQorCQlpZihtX2lzQXR0YWNoZWQpCiAJCXsKLQkJCWlmKHBvcyAhPSAwKQorCQkJaWYobV9wb3Mg IT0gMCkKIAkJCXsKIAkJCQkvKiBzZW5kIHRoZSBsYXN0IGhhbGYtZmlsbGVkIHBhY2tldCAqLwot CQkJCURhdGFQYWNrZXQ8bWNvcGJ5dGU+ICpwYWNrZXQgPSBvdXRxdWV1ZS5mcm9udCgpOwotCQkJ CXBhY2tldC0+c2l6ZSA9IHBvczsKKwkJCQlEYXRhUGFja2V0PG1jb3BieXRlPiAqcGFja2V0ID0g bV9xdWV1ZS5mcm9udCgpOworCQkJCXBhY2tldC0+c2l6ZSA9IG1fcG9zOwogCQkJCXBhY2tldC0+ c2VuZCgpOwotCQkJCW91dHF1ZXVlLnBvcCgpOworCQkJCW1fcXVldWUucG9wKCk7CiAJCQl9CiAJ CQlvdXRkYXRhLmVuZFB1bGwoKTsKIAotCQkJLyogcmVtb3ZlIGFsbCBwYWNrZXRzIGZyb20gdGhl IG91dHF1ZXVlICovCi0JCQl3aGlsZSghb3V0cXVldWUuZW1wdHkoKSkKKwkJCS8qIHJlbW92ZSBh bGwgcGFja2V0cyBmcm9tIHRoZSBtX3F1ZXVlICovCisJCQl3aGlsZSghbV9xdWV1ZS5lbXB0eSgp KQogCQkJewotCQkJCURhdGFQYWNrZXQ8bWNvcGJ5dGU+ICpwYWNrZXQgPSBvdXRxdWV1ZS5mcm9u dCgpOworCQkJCURhdGFQYWNrZXQ8bWNvcGJ5dGU+ICpwYWNrZXQgPSBtX3F1ZXVlLmZyb250KCk7 CiAJCQkJcGFja2V0LT5zaXplID0gMDsKIAkJCQlwYWNrZXQtPnNlbmQoKTsKLQkJCQlvdXRxdWV1 ZS5wb3AoKTsKKwkJCQltX3F1ZXVlLnBvcCgpOwogCQkJfQogCi0JCQlzZXJ2ZXIuZGV0YWNoKGJz V3JhcHBlcik7CisJCQltX3NlcnZlci5kZXRhY2gobV9ic1dyYXBwZXIpOwogCQl9CiAJCS8vIHNp bWlsYXIgZWZmZWN0IGxpa2UgImRlbGV0ZSB0aGlzOyIJCQotCQlic1dyYXBwZXIgPSBCeXRlU291 bmRQcm9kdWNlcjo6bnVsbCgpOworCQltX2JzV3JhcHBlciA9IEJ5dGVTb3VuZFByb2R1Y2VyOjpu dWxsKCk7CiAJfQogCi0JaW50IHN1c3BlbmQoKQotCXsKLQkJaWYoaXNBdHRhY2hlZCkKLQkJewot CQkJcmV0dXJuIHNlcnZlci5zdXNwZW5kKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCiAJaW50 IHdyaXRlKGNvbnN0IG1jb3BieXRlICpkYXRhLCBpbnQgc2l6ZSkKIAl7CiAJCWF0dGFjaCgpOwpA QCAtMzU3LDQwICs0OTksNDAgQEAgcHVibGljOgogCQlpbnQgcmVtYWluaW5nID0gc2l6ZTsKIAkJ d2hpbGUocmVtYWluaW5nKQogCQl7Ci0JCQlpZihibG9ja2luZ0lPKQorCQkJaWYobV9ibG9ja2lu Z0lPKQogCQkJewogCQkJCS8qIEMgQVBJIGJsb2NraW5nIHN0eWxlIHdyaXRlICovCi0JCQkJd2hp bGUob3V0cXVldWUuZW1wdHkoKSkKKwkJCQl3aGlsZShtX3F1ZXVlLmVtcHR5KCkpCiAJCQkJCURp c3BhdGNoZXI6OnRoZSgpLT5pb01hbmFnZXIoKS0+cHJvY2Vzc09uZUV2ZW50KHRydWUpOwogCQkJ fQogCQkJZWxzZQogCQkJewogCQkJCS8qIG5vbiBibG9ja2luZyBJL08gKi8KLQkJCQlpZihvdXRx dWV1ZS5lbXB0eSgpKQorCQkJCWlmKG1fcXVldWUuZW1wdHkoKSkKIAkJCQkJRGlzcGF0Y2hlcjo6 dGhlKCktPmlvTWFuYWdlcigpLT5wcm9jZXNzT25lRXZlbnQoZmFsc2UpOwogCiAJCQkJLyogc3Rp bGwgbm8gbW9yZSBzcGFjZSB0byB3cml0ZT8gKi8KLQkJCQlpZihvdXRxdWV1ZS5lbXB0eSgpKQor CQkJCWlmKG1fcXVldWUuZW1wdHkoKSkKIAkJCQkJcmV0dXJuIHNpemUgLSByZW1haW5pbmc7CiAJ CQl9CiAKIAkJCS8qIGdldCBhIHBhY2tldCAqLwotCQkJRGF0YVBhY2tldDxtY29wYnl0ZT4gKnBh Y2tldCA9IG91dHF1ZXVlLmZyb250KCk7CisJCQlEYXRhUGFja2V0PG1jb3BieXRlPiAqcGFja2V0 ID0gbV9xdWV1ZS5mcm9udCgpOwogCiAJCQkvKiBjb3B5IHNvbWUgZGF0YSB0aGVyZSAqLwotCQkJ aW50IHRvY29weSA9IG1pbihyZW1haW5pbmcscGFja2V0Q2FwYWNpdHktcG9zKTsKLQkJCW1lbWNw eSgmcGFja2V0LT5jb250ZW50c1twb3NdLGRhdGEsdG9jb3B5KTsKLQkJCXBvcyArPSB0b2NvcHk7 CisJCQlpbnQgdG9jb3B5ID0gbWluKHJlbWFpbmluZyxtX3BhY2tldENhcGFjaXR5LW1fcG9zKTsK KwkJCW1lbWNweSgmcGFja2V0LT5jb250ZW50c1ttX3Bvc10sZGF0YSx0b2NvcHkpOworCQkJbV9w b3MgKz0gdG9jb3B5OwogCQkJZGF0YSArPSB0b2NvcHk7CiAJCQlyZW1haW5pbmcgLT0gdG9jb3B5 OwogCiAJCQkvKiBoYXZlIHdlIGZpbGxlZCB1cCB0aGUgcGFja2V0PyB0aGVuIHNlbmQgaXQgKi8K LQkJCWlmKHBvcyA9PSBwYWNrZXRDYXBhY2l0eSkKKwkJCWlmKG1fcG9zID09IG1fcGFja2V0Q2Fw YWNpdHkpCiAJCQl7Ci0JCQkJcGFja2V0LT5zaXplID0gcGFja2V0Q2FwYWNpdHk7CisJCQkJcGFj a2V0LT5zaXplID0gbV9wYWNrZXRDYXBhY2l0eTsKIAkJCQlwYWNrZXQtPnNlbmQoKTsKLQkJCQlv dXRxdWV1ZS5wb3AoKTsKLQkJCQlwb3MgPSAwOworCQkJCW1fcXVldWUucG9wKCk7CisJCQkJbV9w b3MgPSAwOwogCQkJfQogCQl9CiAKQEAgLTQzOSwxNSArNTgxLDI0IEBAIHB1YmxpYzoKIAkJcmV0 dXJuIChhcnRzX3N0cmVhbV90KW5ldyBTZW5kZXIoc2VydmVyLHJhdGUsYml0cyxjaGFubmVscyxu YW1lKTsKIAl9CiAKKwlhcnRzX3N0cmVhbV90IHJlY29yZF9zdHJlYW0oaW50IHJhdGUsIGludCBi aXRzLCBpbnQgY2hhbm5lbHMsIGNvbnN0IGNoYXIgKm5hbWUpCisJeworCQlpZihzZXJ2ZXIuaXNO dWxsKCkpCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gKGFydHNfc3RyZWFtX3QpbmV3IFJlY2Vp dmVyKHNlcnZlcixyYXRlLGJpdHMsY2hhbm5lbHMsbmFtZSk7CisJfQorCiAJdm9pZCBjbG9zZV9z dHJlYW0oYXJ0c19zdHJlYW1fdCBzdHJlYW0pCiAJewogCQlpZihzZXJ2ZXIuaXNOdWxsKCkpCiAJ CQlyZXR1cm47CiAKLQkJU2VuZGVyICpzZW5kZXIgPSAoU2VuZGVyICopc3RyZWFtOwotCQlpZigh c2VuZGVyKSByZXR1cm47CisJCWlmKCFzdHJlYW0pCisJCQlyZXR1cm47CiAKLQkJc2VuZGVyLT5j bG9zZSgpOworCQlTZW5kZXIgKiBfc3RyZWFtID0gKFNlbmRlciAqKXN0cmVhbTsKKwkJX3N0cmVh bS0+Y2xvc2UoKTsKIAl9CiAKIAlpbnQgd3JpdGUoYXJ0c19zdHJlYW1fdCBzdHJlYW0sIGNvbnN0 IHZvaWQgKmRhdGEsIGludCBzaXplKQpAQCAtNDYyLDYgKzYxMywxOCBAQCBwdWJsaWM6CiAJCXJl dHVybiBzZW5kZXItPndyaXRlKChjb25zdCBtY29wYnl0ZSAqKWRhdGEsc2l6ZSk7CiAJfQogCisJ aW50IHJlYWQoYXJ0c19zdHJlYW1fdCBzdHJlYW0sIHZvaWQgKmRhdGEsIGludCBzaXplKQorCXsK KwkJaWYoc2VydmVyLmlzTnVsbCgpKQorCQkJcmV0dXJuIEFSVFNfRV9OT1NFUlZFUjsKKworCQlp Zighc3RyZWFtKQorCQkJcmV0dXJuIEFSVFNfRV9OT1NUUkVBTTsKKworCQlSZWNlaXZlciAqcmVj ZWl2ZXIgPSAoUmVjZWl2ZXIgKilzdHJlYW07CisJCXJldHVybiByZWNlaXZlci0+cmVhZCgobWNv cGJ5dGUgKilkYXRhLHNpemUpOworCX0KKwogCWludCBzdHJlYW1fc2V0KGFydHNfc3RyZWFtX3Qg c3RyZWFtLCBhcnRzX3BhcmFtZXRlcl90IHBhcmFtLCBpbnQgdmFsdWUpCiAJewogCQlpZihzZXJ2 ZXIuaXNOdWxsKCkpCkBAIC00NzAsOCArNjMzLDggQEAgcHVibGljOgogCQlpZighc3RyZWFtKQog CQkJcmV0dXJuIEFSVFNfRV9OT1NUUkVBTTsKIAotCQlTZW5kZXIgKnNlbmRlciA9IChTZW5kZXIg KilzdHJlYW07Ci0JCXJldHVybiBzZW5kZXItPnN0cmVhbV9zZXQocGFyYW0sdmFsdWUpOworCQlS ZWNlaXZlciAqX3N0cmVhbSA9IChSZWNlaXZlciAqKXN0cmVhbTsKKwkJcmV0dXJuIF9zdHJlYW0t PnN0cmVhbV9zZXQocGFyYW0sdmFsdWUpOwogCX0KIAogCWludCBzdHJlYW1fZ2V0KGFydHNfc3Ry ZWFtX3Qgc3RyZWFtLCBhcnRzX3BhcmFtZXRlcl90IHBhcmFtKQpAQCAtNDgyLDggKzY0NSw4IEBA IHB1YmxpYzoKIAkJaWYoIXN0cmVhbSkKIAkJCXJldHVybiBBUlRTX0VfTk9TVFJFQU07CiAKLQkJ U2VuZGVyICpzZW5kZXIgPSAoU2VuZGVyICopc3RyZWFtOwotCQlyZXR1cm4gc2VuZGVyLT5zdHJl YW1fZ2V0KHBhcmFtKTsKKwkJUmVjZWl2ZXIgKl9zdHJlYW0gPSAoUmVjZWl2ZXIgKilzdHJlYW07 CisJCXJldHVybiBfc3RyZWFtLT5zdHJlYW1fZ2V0KHBhcmFtKTsKIAl9CiAKIC8vIGFsbG9jYXRp b24gYW5kIGZyZWVpbmcgb2YgdGhlIGNsYXNzCkBAIC01NTAsMTIgKzcxMywxMiBAQCBleHRlcm4g IkMiIGFydHNfc3RyZWFtX3QgYXJ0c19iYWNrZW5kX3BsCiAJcmV0dXJuIEFydHNDQXBpOjp0aGUo KS0+cGxheV9zdHJlYW0ocmF0ZSxiaXRzLGNoYW5uZWxzLG5hbWUpOwogfQogCi1leHRlcm4gIkMi YXJ0c19zdHJlYW1fdCBhcnRzX2JhY2tlbmRfcmVjb3JkX3N0cmVhbShpbnQsIGludCwgaW50LCBj b25zdCBjaGFyICopCitleHRlcm4gIkMiIGFydHNfc3RyZWFtX3QgYXJ0c19iYWNrZW5kX3JlY29y ZF9zdHJlYW0oaW50IHJhdGUsIGludCBiaXRzLCBpbnQgY2hhbm5lbHMsIGNvbnN0IGNoYXIgKm5h bWUpCiB7CiAJaWYoIUFydHNDQXBpOjp0aGUoKSkgcmV0dXJuIDA7CiAKIAlhcnRzX2JhY2tlbmRf ZGVidWcoImFydHNfYmFja2VuZF9yZWNvcmRfc3RyZWFtIik7Ci0JcmV0dXJuIDA7CisJcmV0dXJu IEFydHNDQXBpOjp0aGUoKS0+cmVjb3JkX3N0cmVhbShyYXRlLGJpdHMsY2hhbm5lbHMsbmFtZSk7 CiB9CiAKIGV4dGVybiAiQyIgdm9pZCBhcnRzX2JhY2tlbmRfY2xvc2Vfc3RyZWFtKGFydHNfc3Ry ZWFtX3Qgc3RyZWFtKQpAQCAtNTY2LDEyICs3MjksMTIgQEAgZXh0ZXJuICJDIiB2b2lkIGFydHNf YmFja2VuZF9jbG9zZV9zdHJlYQogCUFydHNDQXBpOjp0aGUoKS0+Y2xvc2Vfc3RyZWFtKHN0cmVh bSk7CiB9CiAKLWV4dGVybiAiQyJpbnQgYXJ0c19iYWNrZW5kX3JlYWQoYXJ0c19zdHJlYW1fdCwg dm9pZCAqLCBpbnQpCitleHRlcm4gIkMiIGludCBhcnRzX2JhY2tlbmRfcmVhZChhcnRzX3N0cmVh bV90IHN0cmVhbSwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCiB7CiAJaWYoIUFydHNDQXBpOjp0 aGUoKSkgcmV0dXJuIEFSVFNfRV9OT0lOSVQ7CiAKIAlhcnRzX2JhY2tlbmRfZGVidWcoImFydHNf YmFja2VuZF9yZWFkIik7Ci0JcmV0dXJuIEFSVFNfRV9OT0lNUEw7CisJcmV0dXJuIEFydHNDQXBp Ojp0aGUoKS0+cmVhZChzdHJlYW0sYnVmZmVyLGNvdW50KTsKIH0KIAogZXh0ZXJuICJDIiBpbnQg YXJ0c19iYWNrZW5kX3dyaXRlKGFydHNfc3RyZWFtX3Qgc3RyZWFtLCBjb25zdCB2b2lkICpidWZm ZXIsCkluZGV4OiBleGFtcGxlcy8uY3ZzaWdub3JlCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21l L2tkZS9rZGVsaWJzL2FydHMvZXhhbXBsZXMvLmN2c2lnbm9yZSx2CnJldHJpZXZpbmcgcmV2aXNp b24gMS42CmRpZmYgLXUgLTMgLXAgLXIxLjYgLmN2c2lnbm9yZQotLS0gZXhhbXBsZXMvLmN2c2ln bm9yZQkyMDAwLzA1LzE0IDE3OjEyOjMzCTEuNgorKysgZXhhbXBsZXMvLmN2c2lnbm9yZQkyMDAx LzEwLzIxIDE5OjE0OjU3CkBAIC0xMiw2ICsxMiw4IEBAIHgxMWNvbW10ZXN0CiB0ZXN0d3JhcHBl cgogc3RyZWFtc291bmQKIGFydHNjdGVzdAorYXJ0c2NjYXQKK2FydHNjZHVtcAogZmxvdwogaGVs bG9tYWluCiB3cmFwcGVyLmgKSW5kZXg6IGV4YW1wbGVzL01ha2VmaWxlLmFtCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K UkNTIGZpbGU6IC9ob21lL2tkZS9rZGVsaWJzL2FydHMvZXhhbXBsZXMvTWFrZWZpbGUuYW0sdgpy ZXRyaWV2aW5nIHJldmlzaW9uIDEuMzQKZGlmZiAtdSAtMyAtcCAtcjEuMzQgTWFrZWZpbGUuYW0K LS0tIGV4YW1wbGVzL01ha2VmaWxlLmFtCTIwMDEvMDUvMTkgMDE6MTc6MDEJMS4zNAorKysgZXhh bXBsZXMvTWFrZWZpbGUuYW0JMjAwMS8xMC8yMSAxOToxNDo1NwpAQCAtMTAsNiArMTAsNyBAQCBG TE9XTElCUyA9ICQoTERGTEFHUykgJCh0b3BfYnVpbGRkaXIpL2FyCiAKIGNoZWNrX1BST0dSQU1T ID0gaGVsbG9zZXJ2ZXIgaGVsbG9jbGllbnQgcmVmZXJlbmNlaW5mbyBcCiAgIGlyZGVtbyB4MTFj b21tdGVzdCBzdHJlYW1zb3VuZCBoZWxsb21haW4gZmxvdyBhcnRzY3Rlc3QgXAorICBhcnRzY2R1 bXAgYXJ0c2NjYXQgXAogICBkY2FzdHRlc3QgaGVsbG9keW5hbWljIGhlbGxvZHluYW1pYzIgdGVz dGFzdWJzeXMgdGVzdGFnZ3JlZ2F0aW9uIFwKICAgcGxheXRvZmlsZSB0cmFkZXJjaGVjayB0ZXN0 dGhyZWFkcyB0ZXN0bm90aHJlYWRzIGNhdGZpbGUKIGhlbGxvc2VydmVyX1NPVVJDRVMgPSBoZWxs by5jYyBoZWxsb3NlcnZlci5jYyBoZWxsb19pbXBsLmNjCkBAIC00Nyw2ICs0OCwxMiBAQCBkY2Fz dHRlc3RfU09VUkNFUyA9IGRjYXN0dGVzdC5jYwogCiBhcnRzY3Rlc3RfTERGTEFHUyA9ICQodG9w X2J1aWxkZGlyKS9hcnRzL2FydHNjL2xpYmFydHNjLmxhCiBhcnRzY3Rlc3RfU09VUkNFUyA9IGFy dHNjdGVzdC5jCisKK2FydHNjY2F0X0xERkxBR1MgPSAkKHRvcF9idWlsZGRpcikvYXJ0cy9hcnRz Yy9saWJhcnRzYy5sYQorYXJ0c2NjYXRfU09VUkNFUyA9IGFydHNjY2F0LmMKKworYXJ0c2NkdW1w X0xERkxBR1MgPSAkKHRvcF9idWlsZGRpcikvYXJ0cy9hcnRzYy9saWJhcnRzYy5sYQorYXJ0c2Nk dW1wX1NPVVJDRVMgPSBhcnRzY2R1bXAuYwogCiBwbGF5dG9maWxlX1NPVVJDRVMgPSBwbGF5dG9m aWxlLmNjIHBsYXl0b2ZpbGVfaW1wbC5jYyBwbGF5dG9maWxlX21haW4uY2MKIApJbmRleDogZXhh bXBsZXMvYXJ0c2NjYXQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBhcnRzY2NhdC5jCmRpZmYgLU4g YXJ0c2NjYXQuYwotLS0gL2Rldi9udWxsCVR1ZSBNYXkgIDUgMjA6MzI6MjcgMTk5OAorKysgYXJ0 c2NjYXQuYwlTdW4gT2N0IDIxIDE5OjE0OjU3IDIwMDEKQEAgLTAsMCArMSwxMTUgQEAKKyAgICAv KgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hdHRoaWFzIEtyZXR6CisgICAgICAgICAgICAg ICAgICAgICAgIGtyZXR6QGtkZS5vcmcKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAg IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAgCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExp YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICAg WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3Rv biwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICAgKi8KKworLyoKKyAqIFRoaXMgaXMgYW5vdGhl ciBhcnRzY2F0IHdyaXR0ZW4gd2l0aCBhUnRzIEMgQVBJLiBJdCByZWFkcyBkYXRhIGZyb20KKyAq IHN0ZGluLCBhbmQgcGxheXMgaXQgdmlhIHRoZSBhUnRzIHNvdW5kc2VydmVyLgorICogCisgKiBD b21waWxlIHByb2dyYW1zIHVzaW5nIHRoZSBhUnRzIEMgQVBJIHdpdGgKKyAqIAorICogICAgY2Mg LW8gYXJ0c2NkdW1wIGFydHNjZHVtcC5jIGBhcnRzYy1jb25maWcgLS1jZmxhZ3NgIGBhcnRzYy1j b25maWcgLS1saWJzYAorICoKKyAqIElmIHlvdSBhcmUgdXNpbmcgYSBtYWtlZmlsZSwgaXQgY291 bGQgbG9vayBsaWtlIHRoaXM6CisgKgorICogICAgQ0ZMQUdTPWBhcnRzYy1jb25maWcgLS1jZmxh Z3NgCisgKiAgICBMREZMQUdTPWBhcnRzYy1jb25maWcgLS1saWJzYAorICoKKyAqICAgIGFydHNj ZHVtcDogYXJ0c2NkdW1wLmMKKyAqLworI2luY2x1ZGUgPGFydHNjLmg+CisKKyNpbmNsdWRlIDxz dGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0 aWMgdm9pZCBleGl0VXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRl cnIsInVzYWdlOiAlcyBbIG9wdGlvbnMgXSBbIDxmaWxlbmFtZT4gXVxuIixwcm9nbmFtZSk7CisJ ZnByaW50ZihzdGRlcnIsIi1yIDxzYW1wbGluZ3JhdGU+ICAgc2V0IHNhbXBsaW5ncmF0ZSB0byB1 c2VcbiIpOworCWZwcmludGYoc3RkZXJyLCItYiA8Yml0cz4gICAgICAgICAgIHNldCBudW1iZXIg b2YgYml0cyAoOCBvciAxNilcbiIpOworCWZwcmludGYoc3RkZXJyLCItYyA8Y2hhbm5lbHM+ICAg ICAgIHNldCBudW1iZXIgb2YgY2hhbm5lbHMgKDEgb3IgMilcbiIpOworCWZwcmludGYoc3RkZXJy LCItaCAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0XG4iKTsKKwll eGl0KDEpOwkKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKwlpbnQg Y2ZnU2FtcGxpbmdSYXRlID0gNDQxMDA7CisJaW50IGNmZ0JpdHMgPSAxNjsKKwlpbnQgY2ZnQ2hh bm5lbHMgPSAyOworCUZJTEUgKmluZmlsZSA9IHN0ZGluOworCWludCBwZmQ7CisJaW50IHBhY2tl dHNpemU7CisJY2hhciAqYnVmZmVyOworCWludCBzaXplID0gMTAyNDsKKwlhcnRzX3N0cmVhbV90 IHN0cmVhbTsKKwlpbnQgb3B0Y2g7CisJd2hpbGUoKG9wdGNoID0gZ2V0b3B0KGFyZ2MsYXJndiwi cjpiOmM6aCIpKSA+IDApCisJeworCQlzd2l0Y2gob3B0Y2gpCisJCXsKKwkJCWNhc2UgJ3InOiBj ZmdTYW1wbGluZ1JhdGUgPSBhdG9pKG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzog Y2ZnQml0cyA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2MnOiBjZmdDaGFu bmVscyA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2gnOgorCQkJZGVmYXVs dDogCisJCQkJCWV4aXRVc2FnZShhcmdjP2FyZ3ZbMF06ImFydHNjY2F0Iik7CisJCQkJYnJlYWs7 CisJCX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisJCWlmKGFyZ3Zbb3B0aW5k XSAhPSAiLSIpCisJCXsKKwkJCWluZmlsZSA9IGZvcGVuKGFyZ3Zbb3B0aW5kXSwidyIpOworCQkJ aWYoIWluZmlsZSkKKwkJCXsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJDYW4ndCBvcGVuIGZpbGUg JyVzJy5cbiIsIGFyZ3Zbb3B0aW5kXSApOworCQkJCWV4aXQoMSk7CisJCQl9CisJCX0KKwl9CisK KwlwZmQgPSBmaWxlbm8oIGluZmlsZSApOworCisJYXJ0c19pbml0KCk7CisJc3RyZWFtID0gYXJ0 c19wbGF5X3N0cmVhbSggY2ZnU2FtcGxpbmdSYXRlLCBjZmdCaXRzLCBjZmdDaGFubmVscywgImFy dHNjY2F0IiApOworCXBhY2tldHNpemUgPSBhcnRzX3N0cmVhbV9nZXQoIHN0cmVhbSwgQVJUU19Q X1BBQ0tFVF9TSVpFICk7CisJYnVmZmVyID0gbWFsbG9jKHBhY2tldHNpemUpOworCisJZG8gewor CQlzaXplID0gcmVhZCggcGZkLCBidWZmZXIsIHBhY2tldHNpemUgKTsKKwkJc2l6ZSA9IGFydHNf d3JpdGUoIHN0cmVhbSwgYnVmZmVyLCBzaXplICk7CisJfSB3aGlsZSggc2l6ZSA+IDAgKTsKKwor CWFydHNfY2xvc2Vfc3RyZWFtKCBzdHJlYW0gKTsKKwlhcnRzX2ZyZWUoKTsKKworCXBjbG9zZSgg aW5maWxlICk7CisJZnJlZShidWZmZXIpOworCisJcmV0dXJuIDA7Cit9CkluZGV4OiBleGFtcGxl cy9hcnRzY2R1bXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBhcnRzY2R1bXAuYwpkaWZmIC1OIGFy dHNjZHVtcC5jCi0tLSAvZGV2L251bGwJVHVlIE1heSAgNSAyMDozMjoyNyAxOTk4CisrKyBhcnRz Y2R1bXAuYwlTdW4gT2N0IDIxIDE5OjE0OjU3IDIwMDEKQEAgLTAsMCArMSwxMTUgQEAKKyAgICAv KgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hdHRoaWFzIEtyZXR6CisgICAgICAgICAgICAg ICAgICAgICAgIGtyZXR6QGtkZS5vcmcKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAg IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAgCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExp YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICAg WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3Rv biwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICAgKi8KKworLyoKKyAqIFRoaXMgaXMgYW5vdGhl ciBhcnRzZHVtcCB3cml0dGVuIHdpdGggYVJ0cyBDIEFQSS4gSXQgcmVhZHMgZGF0YSBmcm9tCisg KiB0aGUgYVJ0cyBzb3VuZHNlcnZlciBhbmQgcGxheXMgaXQgdmlhIHN0ZG91dC4KKyAqIAorICog Q29tcGlsZSBwcm9ncmFtcyB1c2luZyB0aGUgYVJ0cyBDIEFQSSB3aXRoCisgKiAKKyAqICAgIGNj IC1vIGFydHNjZHVtcCBhcnRzY2R1bXAuYyBgYXJ0c2MtY29uZmlnIC0tY2ZsYWdzYCBgYXJ0c2Mt Y29uZmlnIC0tbGlic2AKKyAqCisgKiBJZiB5b3UgYXJlIHVzaW5nIGEgbWFrZWZpbGUsIGl0IGNv dWxkIGxvb2sgbGlrZSB0aGlzOgorICoKKyAqICAgIENGTEFHUz1gYXJ0c2MtY29uZmlnIC0tY2Zs YWdzYAorICogICAgTERGTEFHUz1gYXJ0c2MtY29uZmlnIC0tbGlic2AKKyAqCisgKiAgICBhcnRz Y2R1bXA6IGFydHNjZHVtcC5jCisgKi8KKyNpbmNsdWRlIDxhcnRzYy5oPgorCisjaW5jbHVkZSA8 c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3Rh dGljIHZvaWQgZXhpdFVzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCWZwcmludGYoc3Rk ZXJyLCJ1c2FnZTogJXMgWyBvcHRpb25zIF0gWyA8ZmlsZW5hbWU+IF1cbiIscHJvZ25hbWUpOwor CWZwcmludGYoc3RkZXJyLCItciA8c2FtcGxpbmdyYXRlPiAgIHNldCBzYW1wbGluZ3JhdGUgdG8g dXNlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiLWIgPGJpdHM+ICAgICAgICAgICBzZXQgbnVtYmVy IG9mIGJpdHMgKDggb3IgMTYpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiLWMgPGNoYW5uZWxzPiAg ICAgICBzZXQgbnVtYmVyIG9mIGNoYW5uZWxzICgxIG9yIDIpXG4iKTsKKwlmcHJpbnRmKHN0ZGVy ciwiLWggICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIik7CisJ ZXhpdCgxKTsJCit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisJaW50 IGNmZ1NhbXBsaW5nUmF0ZSA9IDQ0MTAwOworCWludCBjZmdCaXRzID0gMTY7CisJaW50IGNmZ0No YW5uZWxzID0gMjsKKwlGSUxFICpvdXRmaWxlID0gc3Rkb3V0OworCWludCBwZmQ7CisJaW50IHBh Y2tldHNpemU7CisJY2hhciAqYnVmZmVyOworCWludCBzaXplOworCWFydHNfc3RyZWFtX3Qgc3Ry ZWFtOworCWludCBvcHRjaDsKKwl3aGlsZSgob3B0Y2ggPSBnZXRvcHQoYXJnYyxhcmd2LCJyOmI6 YzpoIikpID4gMCkKKwl7CisJCXN3aXRjaChvcHRjaCkKKwkJeworCQkJY2FzZSAncic6IGNmZ1Nh bXBsaW5nUmF0ZSA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOiBjZmdC aXRzID0gYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6IGNmZ0NoYW5uZWxz ID0gYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnaCc6CisJCQlkZWZhdWx0OiAK KwkJCQkJZXhpdFVzYWdlKGFyZ2M/YXJndlswXToiYXJ0c2NkdW1wIik7CisJCQkJYnJlYWs7CisJ CX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisJCWlmKGFyZ3Zbb3B0aW5kXSAh PSAiLSIpCisJCXsKKwkJCW91dGZpbGUgPSBmb3Blbihhcmd2W29wdGluZF0sInciKTsKKwkJCWlm KCFvdXRmaWxlKQorCQkJeworCQkJCWZwcmludGYoIHN0ZGVyciwgIkNhbid0IG9wZW4gZmlsZSAn JXMnLlxuIiwgYXJndltvcHRpbmRdICk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCX0KKwor CXBmZCA9IGZpbGVubyggb3V0ZmlsZSApOworCQorCWFydHNfaW5pdCgpOworCXN0cmVhbSA9IGFy dHNfcmVjb3JkX3N0cmVhbSggY2ZnU2FtcGxpbmdSYXRlLCBjZmdCaXRzLCBjZmdDaGFubmVscywg ImFydHNjZHVtcCIgKTsKKwlwYWNrZXRzaXplID0gYXJ0c19zdHJlYW1fZ2V0KCBzdHJlYW0sIEFS VFNfUF9QQUNLRVRfU0laRSApOworCWJ1ZmZlciA9IG1hbGxvYyhwYWNrZXRzaXplKTsKKworCWRv IHsKKwkJc2l6ZSA9IGFydHNfcmVhZCggc3RyZWFtLCBidWZmZXIsIHBhY2tldHNpemUgKTsKKwkJ c2l6ZSA9IHdyaXRlKCBwZmQsIGJ1ZmZlciwgc2l6ZSApOworCX0gd2hpbGUoIHNpemUgPiAwICk7 CisKKwlhcnRzX2Nsb3NlX3N0cmVhbSggc3RyZWFtICk7CisJYXJ0c19mcmVlKCk7CisKKwlwY2xv c2UoIG91dGZpbGUgKTsKKwlmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gMDsKK30KSW5kZXg6IGZs b3cvTWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZWxpYnMvYXJ0 cy9mbG93L01ha2VmaWxlLmFtLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQ1CmRpZmYgLXUgLTMg LXAgLXIxLjQ1IE1ha2VmaWxlLmFtCi0tLSBmbG93L01ha2VmaWxlLmFtCTIwMDEvMTAvMTIgMjE6 Mzg6MDgJMS40NQorKysgZmxvdy9NYWtlZmlsZS5hbQkyMDAxLzEwLzIxIDE5OjE0OjU3CkBAIC0y Niw3ICsyNiw3IEBAIGxpYmFydHNmbG93X2xhX1NPVVJDRVMgPSAgc3ludGhfcGxheV9pbXAKICAg YnVzLmNjIGF1ZGlvbWFuYWdlcl9pbXBsLmNjIHN5bnRoX3JlY29yZF9pbXBsLmNjIHJlc2FtcGxl LmNjIFwKICAgYXVkaW9pby5jYyBhdWRpb2lvb3NzLmNjIGF1ZGlvaW9hbHNhLmNjIGF1ZGlvaW9u dWxsLmNjIGF1ZGlvaW9saWJhdWRpb2lvLmNjIFwKICAgYXVkaW9pb3N1bi5jYyBhdWRpb2lvYWl4 LmNjIGF1ZGlvaW9uYXMuY2MgY3B1aW5mby5jYyBcCi0gIGF1ZGlvaW9vc3N0aHJlYWRlZC5jYwor ICBhdWRpb2lvb3NzdGhyZWFkZWQuY2MgYXVkaW90b2J5dGVzdHJlYW1faW1wbC5jYwogCiBhcnRz aW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvYXJ0cwogYXJ0c2luY2x1ZGVfSEVBREVSUyA9IGFy dHNmbG93LmggYXVkaW9zdWJzeXMuaCBjYWNoZS5oIFwKSW5kZXg6IGZsb3cvYXJ0c2Zsb3cuaWRs Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rZGVsaWJzL2FydHMvZmxvdy9hcnRzZmxv dy5pZGwsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjEKZGlmZiAtdSAtMyAtcCAtcjEuMjEgYXJ0 c2Zsb3cuaWRsCi0tLSBmbG93L2FydHNmbG93LmlkbAkyMDAwLzEyLzA3IDIyOjIxOjE1CTEuMjEK KysrIGZsb3cvYXJ0c2Zsb3cuaWRsCTIwMDEvMTAvMjEgMTk6MTQ6NTcKQEAgLTI1MSw2ICsyNTEs MjMgQEAgaW50ZXJmYWNlIEJ5dGVTdHJlYW1Ub0F1ZGlvIDogU3ludGhNb2R1bAogfTsKIAogLyoq CisgKiBBdWRpbyB0byBCeXRlIHN0cmVhbSBjb252ZXJzaW9uIG9iamVjdAorICoKKyAqIENvbnZl cnRzIGEgc3luY2hyb25vdXMgYXVkaW8gc3RyZWFtIHRvIGFuIGFzeW5jaHJvbm91cyBieXRlIHN0 cmVhbQorICovCitpbnRlcmZhY2UgQXVkaW9Ub0J5dGVTdHJlYW0gOiBTeW50aE1vZHVsZSB7CisJ YXR0cmlidXRlIGxvbmcgc2FtcGxpbmdSYXRlOworCWF0dHJpYnV0ZSBsb25nIGNoYW5uZWxzOwor CWF0dHJpYnV0ZSBsb25nIGJpdHM7CisKKwlhc3luYyBvdXQgYnl0ZSBzdHJlYW0gb3V0ZGF0YTsK KworCWluIGF1ZGlvIHN0cmVhbSBsZWZ0LHJpZ2h0OworCWRlZmF1bHQgbGVmdDsKKwlkZWZhdWx0 IHJpZ2h0OworfTsKKworLyoqCiAgKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIHN0ZXJlbyBlZmZl Y3RzCiAgKi8KIGludGVyZmFjZSBTdGVyZW9FZmZlY3QgOiBTeW50aE1vZHVsZSB7CkluZGV4OiBm bG93L2F1ZGlvdG9ieXRlc3RyZWFtX2ltcGwuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogYXVkaW90 b2J5dGVzdHJlYW1faW1wbC5jYwpkaWZmIC1OIGF1ZGlvdG9ieXRlc3RyZWFtX2ltcGwuY2MKLS0t IC9kZXYvbnVsbAlUdWUgTWF5ICA1IDIwOjMyOjI3IDE5OTgKKysrIGF1ZGlvdG9ieXRlc3RyZWFt X2ltcGwuY2MJU3VuIE9jdCAyMSAxOToxNDo1NyAyMDAxCkBAIC0wLDAgKzEsMjA5IEBACisgICAg LyoKKworICAgIENvcHlyaWdodCAoQykgMjAwMCBTdGVmYW4gV2VzdGVyZmVsZAorICAgICAgICAg ICAgICAgICAgICAgICBzdGVmYW5Ac3BhY2UudHdjLmRlCisJCQkJICAyMDAxIE1hdHRoaWFzIEty ZXR6CisJCQkJICAgICAgIGtyZXR6QGtkZS5vcmcKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KKyAgCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor ICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAg CisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAg IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICAgKi8KKworI2luY2x1ZGUgImFydHNm bG93LmgiCisjaW5jbHVkZSAic3Rkc3ludGhtb2R1bGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgor CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1hdGgu aD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBBcnRzOworCituYW1l c3BhY2UgQXJ0cyB7CisKK2NsYXNzIEF1ZGlvVG9CeXRlU3RyZWFtX2ltcGwgOiBwdWJsaWMgQXVk aW9Ub0J5dGVTdHJlYW1fc2tlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJs aWMgU3RkU3ludGhNb2R1bGUKK3sKKwlsb25nIG1fc2FtcGxpbmdSYXRlLCBtX2NoYW5uZWxzLCBt X2JpdHM7CisJbG9uZyBtX3NhbXBsZVNpemU7CisJZG91YmxlIG1fc3RlcDsKKwlib29sIG1faW50 ZXJwb2xhdGU7CisJdmVjdG9yPGZsb2F0PiBtX2xlZnQ7CisJdmVjdG9yPGZsb2F0PiBtX3JpZ2h0 OworCWludCBtX3JhbmdlOworCWRvdWJsZSBtX3BvczsKK3Byb3RlY3RlZDoKKwl2b2lkIHVwZGF0 ZVNhbXBsZVNpemUoKQorCXsKKwkJbV9zYW1wbGVTaXplID0gbV9jaGFubmVscyAqIG1fYml0cyAv IDg7CisJfQorCitwdWJsaWM6CisJQXVkaW9Ub0J5dGVTdHJlYW1faW1wbCgpIDoKKwkJbV9wb3Mo MCkKKwl7CisJCXNhbXBsaW5nUmF0ZSg0NDEwMCk7CisJCWNoYW5uZWxzKDIpOworCQliaXRzKDE2 KTsKKwl9CisKKwlsb25nIHNhbXBsaW5nUmF0ZSgpIHsgcmV0dXJuIG1fc2FtcGxpbmdSYXRlOyB9 CisJdm9pZCBzYW1wbGluZ1JhdGUobG9uZyBuZXdSYXRlKSB7CisJCWRvdWJsZSBuZXdTdGVwID0g c2FtcGxpbmdSYXRlRmxvYXQgLyAoZmxvYXQpbmV3UmF0ZTsKKwkJYXJ0c19yZXR1cm5faWZfZmFp bChuZXdTdGVwID4gMCk7CisJCW1fc2FtcGxpbmdSYXRlID0gbmV3UmF0ZTsKKwkJbV9zdGVwID0g bmV3U3RlcDsKKworCQlkb3VibGUgZGVsdGEgPSBtX3N0ZXAgLSBmbG9vcihtX3N0ZXApOworCQlt X2ludGVycG9sYXRlID0gZmFicyhkZWx0YSkgPiAwLjAwMTsKKwl9CisKKwlsb25nIGNoYW5uZWxz KCkgeyByZXR1cm4gbV9jaGFubmVsczsgfQorCXZvaWQgY2hhbm5lbHMobG9uZyBuZXdDaGFubmVs cykgeworCQlhcnRzX3JldHVybl9pZl9mYWlsKG5ld0NoYW5uZWxzID09IDEgfHwgbmV3Q2hhbm5l bHMgPT0gMik7CisJCW1fY2hhbm5lbHMgPSBuZXdDaGFubmVsczsKKwkJdXBkYXRlU2FtcGxlU2l6 ZSgpOworCX0KKworCWxvbmcgYml0cygpIHsgcmV0dXJuIG1fYml0czsgfQorCXZvaWQgYml0cyhs b25nIG5ld0JpdHMpIHsKKwkJYXJ0c19yZXR1cm5faWZfZmFpbChuZXdCaXRzID09IDggfHwgbmV3 Qml0cyA9PSAxNik7CisJCW1fYml0cyA9IG5ld0JpdHM7CisJCW1fcmFuZ2UgPSAobmV3Qml0cyA9 PSA4ICkgPyAxMjggOiAzMjc2ODsKKwkJdXBkYXRlU2FtcGxlU2l6ZSgpOworCX0KKworCXZvaWQg Y2FsY3VsYXRlQmxvY2sodW5zaWduZWQgbG9uZyBzYW1wbGVzKQorCXsKKwkJbV9sZWZ0LnJlc2l6 ZSggMSArIHNhbXBsZXMgKTsKKwkJbV9yaWdodC5yZXNpemUoIDEgKyBzYW1wbGVzICk7CisJCWZv ciggdW5zaWduZWQgbG9uZyBpID0gMDsgaSA8IHNhbXBsZXM7ICsraSApIHsKKwkJCW1fbGVmdFsx ICsgaV0gPSAobGVmdFtpXSA+IDEpID8gMSA6IChsZWZ0W2ldIDwgLTEpID8gLTEgOiBsZWZ0W2ld OworCQkJbV9yaWdodFsxICsgaV0gPSAocmlnaHRbaV0gPiAxKSA/IDEgOiAocmlnaHRbaV0gPCAt MSkgPyAtMSA6IHJpZ2h0W2ldOworCQl9CisKKwkJaW50IHBhY2tldHN0b3NlbmQgPSAoaW50KWNl aWwobV9sZWZ0LnNpemUoKSAvIG1fc3RlcCk7CisJCURhdGFQYWNrZXQ8bWNvcGJ5dGU+ICpwYWNr ZXQgPSBvdXRkYXRhLmFsbG9jUGFja2V0KCBwYWNrZXRzdG9zZW5kICogbV9zYW1wbGVTaXplICk7 CisKKwkJaW50IHByb2Nlc3NlZCA9IDA7CisJCWlmKCBtX2ludGVycG9sYXRlICkgeworCQkJZG91 YmxlIHBvcyA9IDA7CisJCQlpZiggbV9jaGFubmVscyA9PSAyICkgeworCQkJCWlmKCBtX2JpdHMg PT0gMTYgKSB7CisJCQkJCXdoaWxlKCBtX3BvcyA8IChkb3VibGUpbV9sZWZ0LnNpemUoKSAtIDEg KSB7CisJCQkJCQlkb3VibGUgZXJyb3IgPSBtb2RmKG1fcG9zLCAmcG9zKTsKKwkJCQkJCWludCBp bnRwb3MgPSAoaW50KXBvczsKKwkJCQkJCWxvbmcgbGVmdGNoYW5uZWwgPSBsb25nKChtX2xlZnRb aW50cG9zXSAqIGVycm9yICsgbV9sZWZ0W2ludHBvcyArIDFdICogKDEgLSBlcnJvcikpICogMzI3 NjgpICsgMzI3Njg7CisJCQkJCQlsb25nIHJpZ2h0Y2hhbm5lbCA9IGxvbmcoKG1fcmlnaHRbaW50 cG9zXSAqIGVycm9yICsgbV9yaWdodFtpbnRwb3MgKyAxXSAqICgxIC0gZXJyb3IpKSAqIDMyNzY4 KSArIDMyNzY4OworCQkJCQkJcGFja2V0LT5jb250ZW50c1twcm9jZXNzZWQgKiA0ICAgIF0gPSBs ZWZ0Y2hhbm5lbDsKKwkJCQkJCXBhY2tldC0+Y29udGVudHNbcHJvY2Vzc2VkICogNCArIDFdID0g KGxlZnRjaGFubmVsID4+IDgpIC0gMTI4OworCQkJCQkJcGFja2V0LT5jb250ZW50c1twcm9jZXNz ZWQgKiA0ICsgMl0gPSByaWdodGNoYW5uZWw7CisJCQkJCQlwYWNrZXQtPmNvbnRlbnRzW3Byb2Nl c3NlZCAqIDQgKyAzXSA9IChyaWdodGNoYW5uZWwgPj4gOCkgLSAxMjg7CisJCQkJCQltX3BvcyAr PSBtX3N0ZXA7CisJCQkJCQkrK3Byb2Nlc3NlZDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiggbV9i aXRzID09IDggKSB7CisJCQkJCXdoaWxlKCBtX3BvcyA8IChkb3VibGUpbV9sZWZ0LnNpemUoKSAt IDEgKSB7CisJCQkJCQlkb3VibGUgZXJyb3IgPSBtb2RmKG1fcG9zLCAmcG9zKTsKKwkJCQkJCWlu dCBpbnRwb3MgPSAoaW50KXBvczsKKwkJCQkJCWxvbmcgbGVmdGNoYW5uZWwgPSBsb25nKChtX2xl ZnRbaW50cG9zXSAqIGVycm9yICsgbV9sZWZ0W2ludHBvcyArIDFdICogKDEgLSBlcnJvcikpICog MTI4KSArIDEyODsKKwkJCQkJCWxvbmcgcmlnaHRjaGFubmVsID0gbG9uZygobV9yaWdodFtpbnRw b3NdICogZXJyb3IgKyBtX3JpZ2h0W2ludHBvcyArIDFdICogKDEgLSBlcnJvcikpICogMTI4KSAr IDEyODsKKwkJCQkJCXBhY2tldC0+Y29udGVudHNbcHJvY2Vzc2VkICogMiAgICBdID0gbGVmdGNo YW5uZWw7CisJCQkJCQlwYWNrZXQtPmNvbnRlbnRzW3Byb2Nlc3NlZCAqIDIgKyAxXSA9IHJpZ2h0 Y2hhbm5lbDsKKwkJCQkJCW1fcG9zICs9IG1fc3RlcDsKKwkJCQkJCSsrcHJvY2Vzc2VkOworCQkJ CQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiggbV9iaXRzID09IDE2ICkgeworCQkJCQl3 aGlsZSggbV9wb3MgPCAoZG91YmxlKW1fbGVmdC5zaXplKCkgLSAxICkgeworCQkJCQkJZG91Ymxl IGVycm9yID0gbW9kZihtX3BvcywgJnBvcyk7CisJCQkJCQlpbnQgaW50cG9zID0gKGludClwb3M7 CisJCQkJCQlsb25nIGxlZnRjaGFubmVsID0gbG9uZygoKG1fbGVmdFtpbnRwb3NdICsgbV9yaWdo dFtpbnRwb3NdKSAqIGVycm9yICsgKG1fbGVmdFtpbnRwb3MgKyAxXSArIG1fcmlnaHRbaW50cG9z ICsgMV0pICogKDEgLSBlcnJvcikpICogMTYzODQpICsgMzI3Njg7CisJCQkJCQlwYWNrZXQtPmNv bnRlbnRzW3Byb2Nlc3NlZCAqIDIgICAgXSA9IGxlZnRjaGFubmVsOworCQkJCQkJcGFja2V0LT5j b250ZW50c1twcm9jZXNzZWQgKiAyICsgMV0gPSAobGVmdGNoYW5uZWwgPj4gOCkgLSAxMjg7CisJ CQkJCQltX3BvcyArPSBtX3N0ZXA7CisJCQkJCQkrK3Byb2Nlc3NlZDsKKwkJCQkJfQorCQkJCX0g ZWxzZSBpZiggbV9iaXRzID09IDggKSB7CisJCQkJCXdoaWxlKCBtX3BvcyA8IChkb3VibGUpbV9s ZWZ0LnNpemUoKSAtIDEgKSB7CisJCQkJCQlkb3VibGUgZXJyb3IgPSBtb2RmKG1fcG9zLCAmcG9z KTsKKwkJCQkJCWludCBpbnRwb3MgPSAoaW50KXBvczsKKwkJCQkJCWxvbmcgbGVmdGNoYW5uZWwg PSBsb25nKCgobV9sZWZ0W2ludHBvc10gKyBtX3JpZ2h0W2ludHBvc10pICogZXJyb3IgKyAobV9s ZWZ0W2ludHBvcyArIDFdICsgbV9yaWdodFtpbnRwb3MgKyAxXSkgKiAoMSAtIGVycm9yKSkgKiA2 NCkgKyAxMjg7CisJCQkJCQlwYWNrZXQtPmNvbnRlbnRzW3Byb2Nlc3NlZF0gPSBsZWZ0Y2hhbm5l bDsKKwkJCQkJCW1fcG9zICs9IG1fc3RlcDsKKwkJCQkJCSsrcHJvY2Vzc2VkOworCQkJCQl9CisJ CQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYoIG1fY2hhbm5lbHMgPT0gMiApIHsKKwkJCQlp ZiggbV9iaXRzID09IDE2ICkgeworCQkJCQl3aGlsZSggbV9wb3MgPCAoZG91YmxlKW1fbGVmdC5z aXplKCkgLSAxICkgeworCQkJCQkJaW50IGludHBvcyA9IChpbnQpbV9wb3M7CisJCQkJCQlsb25n IGxlZnRjaGFubmVsID0gbG9uZyhtX2xlZnRbaW50cG9zXSAqIDMyNzY4KSArIDMyNzY4OworCQkJ CQkJbG9uZyByaWdodGNoYW5uZWwgPSBsb25nKG1fcmlnaHRbaW50cG9zXSAqIDMyNzY4KSArIDMy NzY4OworCQkJCQkJcGFja2V0LT5jb250ZW50c1twcm9jZXNzZWQgKiA0ICAgIF0gPSBsZWZ0Y2hh bm5lbDsKKwkJCQkJCXBhY2tldC0+Y29udGVudHNbcHJvY2Vzc2VkICogNCArIDFdID0gKGxlZnRj aGFubmVsID4+IDgpIC0gMTI4OworCQkJCQkJcGFja2V0LT5jb250ZW50c1twcm9jZXNzZWQgKiA0 ICsgMl0gPSByaWdodGNoYW5uZWw7CisJCQkJCQlwYWNrZXQtPmNvbnRlbnRzW3Byb2Nlc3NlZCAq IDQgKyAzXSA9IChyaWdodGNoYW5uZWwgPj4gOCkgLSAxMjg7CisJCQkJCQltX3BvcyArPSBtX3N0 ZXA7CisJCQkJCQkrK3Byb2Nlc3NlZDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiggbV9iaXRzID09 IDggKSB7CisJCQkJCXdoaWxlKCBtX3BvcyA8IChkb3VibGUpbV9sZWZ0LnNpemUoKSAtIDEgKSB7 CisJCQkJCQlpbnQgaW50cG9zID0gKGludCltX3BvczsKKwkJCQkJCWxvbmcgbGVmdGNoYW5uZWwg PSBsb25nKG1fbGVmdFtpbnRwb3NdICogMTI4KSArIDEyODsKKwkJCQkJCWxvbmcgcmlnaHRjaGFu bmVsID0gbG9uZyhtX3JpZ2h0W2ludHBvc10gKiAxMjgpICsgMTI4OworCQkJCQkJcGFja2V0LT5j b250ZW50c1twcm9jZXNzZWQgKiAyICAgIF0gPSBsZWZ0Y2hhbm5lbDsKKwkJCQkJCXBhY2tldC0+ Y29udGVudHNbcHJvY2Vzc2VkICogMiArIDFdID0gcmlnaHRjaGFubmVsOworCQkJCQkJbV9wb3Mg Kz0gbV9zdGVwOworCQkJCQkJKytwcm9jZXNzZWQ7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2Ug eworCQkJCWlmKCBtX2JpdHMgPT0gMTYgKSB7CisJCQkJCXdoaWxlKCBtX3BvcyA8IChkb3VibGUp bV9sZWZ0LnNpemUoKSAtIDEgKSB7CisJCQkJCQlpbnQgaW50cG9zID0gKGludCltX3BvczsKKwkJ CQkJCWxvbmcgbGVmdGNoYW5uZWwgPSBsb25nKChtX2xlZnRbaW50cG9zXSArIG1fcmlnaHRbaW50 cG9zXSkgKiAxNjM4NCkgKyAzMjc2ODsKKwkJCQkJCXBhY2tldC0+Y29udGVudHNbcHJvY2Vzc2Vk ICogMiAgICBdID0gbGVmdGNoYW5uZWw7CisJCQkJCQlwYWNrZXQtPmNvbnRlbnRzW3Byb2Nlc3Nl ZCAqIDIgKyAxXSA9IChsZWZ0Y2hhbm5lbCA+PiA4KSAtIDEyODsKKwkJCQkJCW1fcG9zICs9IG1f c3RlcDsKKwkJCQkJCSsrcHJvY2Vzc2VkOworCQkJCQl9CisJCQkJfSBlbHNlIGlmKCBtX2JpdHMg PT0gOCApIHsKKwkJCQkJd2hpbGUoIG1fcG9zIDwgKGRvdWJsZSltX2xlZnQuc2l6ZSgpIC0gMSAp IHsKKwkJCQkJCWludCBpbnRwb3MgPSAoaW50KW1fcG9zOworCQkJCQkJbG9uZyBsZWZ0Y2hhbm5l bCA9IGxvbmcoKG1fbGVmdFtpbnRwb3NdICsgbV9yaWdodFtpbnRwb3NdKSAqIDY0KSArIDEyODsK KwkJCQkJCXBhY2tldC0+Y29udGVudHNbcHJvY2Vzc2VkXSA9IGxlZnRjaGFubmVsOworCQkJCQkJ bV9wb3MgKz0gbV9zdGVwOworCQkJCQkJKytwcm9jZXNzZWQ7CisJCQkJCX0KKwkJCQl9CisJCQl9 CisJCX0KKwkJbV9sZWZ0WzBdID0gbV9sZWZ0LmJhY2soKTsKKwkJbV9yaWdodFswXSA9IG1fcmln aHQuYmFjaygpOworCQltX3BvcyA9IG1fcG9zIC0gZmxvb3IobV9wb3MpOworCQlwYWNrZXQtPnNp emUgPSBwcm9jZXNzZWQgKiBtX3NhbXBsZVNpemU7CisJCXBhY2tldC0+c2VuZCgpOworCX0KK307 CisKK1JFR0lTVEVSX0lNUExFTUVOVEFUSU9OKEF1ZGlvVG9CeXRlU3RyZWFtX2ltcGwpOworCit9 OwpJbmRleDogc291bmRzZXJ2ZXIvLmN2c2lnbm9yZQo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9t ZS9rZGUva2RlbGlicy9hcnRzL3NvdW5kc2VydmVyLy5jdnNpZ25vcmUsdgpyZXRyaWV2aW5nIHJl dmlzaW9uIDEuOApkaWZmIC11IC0zIC1wIC1yMS44IC5jdnNpZ25vcmUKLS0tIHNvdW5kc2VydmVy Ly5jdnNpZ25vcmUJMjAwMS8wNC8yMCAxOToyMjoyNwkxLjgKKysrIHNvdW5kc2VydmVyLy5jdnNp Z25vcmUJMjAwMS8xMC8yMSAxOToxNDo1OApAQCAtMiw2ICsyLDcgQEAgTWFrZWZpbGUKIE1ha2Vm aWxlLmluCiBhcnRzZAogYXJ0c2NhdAorYXJ0c2R1bXAKIGFydHNwbGF5CiBhcnRzc2hlbGwKIGFy dHN3cmFwcGVyCkluZGV4OiBzb3VuZHNlcnZlci9NYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvaG9tZS9rZGUva2RlbGlicy9hcnRzL3NvdW5kc2VydmVyL01ha2VmaWxlLmFtLHYKcmV0 cmlldmluZyByZXZpc2lvbiAxLjQyCmRpZmYgLXUgLTMgLXAgLXIxLjQyIE1ha2VmaWxlLmFtCi0t LSBzb3VuZHNlcnZlci9NYWtlZmlsZS5hbQkyMDAxLzEwLzA2IDE5OjIyOjE0CTEuNDIKKysrIHNv dW5kc2VydmVyL01ha2VmaWxlLmFtCTIwMDEvMTAvMjEgMTk6MTQ6NTgKQEAgLTQwLDcgKzQwLDcg QEAgbGliYXJ0c3dhdnBsYXlvYmplY3RfbGFfTERGTEFHUyA9IC1uby11bgogCiAjIyMjIyMgInJl YWwiIHByb2dyYW1zCiAKLWJpbl9QUk9HUkFNUyA9IGFydHNkIGFydHNwbGF5IGFydHNjYXQgYXJ0 c3dyYXBwZXIgYXJ0c3NoZWxsCitiaW5fUFJPR1JBTVMgPSBhcnRzZCBhcnRzcGxheSBhcnRzY2F0 IGFydHN3cmFwcGVyIGFydHNzaGVsbCBhcnRzZHVtcAogCiBhcnRzZF9MREFERCA9IGxpYnNvdW5k c2VydmVyX2lkbC5sYSAkKEZMT1dMSUJTKSBcCiAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGly KS9hcnRzL21jb3BfbXQvbGlibWNvcF9tdC5sYSAkKFVTRV9USFJFQURTKSAkKExJQlBUSFJFQUQp CkBAIC00OSw2ICs0OSw5IEBAIGFydHNkX1NPVVJDRVMgPSBzb3VuZHNlcnZlcnYyX2ltcGwuY2Mg c28KIGFydHNjYXRfTERBREQgPSBsaWJzb3VuZHNlcnZlcl9pZGwubGEgJChGTE9XTElCUykKIGFy dHNjYXRfU09VUkNFUyA9IGFydHNjYXQuY2MKIAorYXJ0c2R1bXBfTERBREQgPSBsaWJzb3VuZHNl cnZlcl9pZGwubGEgJChGTE9XTElCUykKK2FydHNkdW1wX1NPVVJDRVMgPSBhcnRzZHVtcC5jYwor CiBhcnRzcGxheV9MREFERCA9IGxpYnNvdW5kc2VydmVyX2lkbC5sYSAKIGFydHNwbGF5X1NPVVJD RVMgPSBhcnRzcGxheS5jYwogCkBAIC04Myw2ICs4Niw3IEBAIGFydHN2ZXJzaW9uLmg6IGFydHN2 ZXJzaW9uLW5ldy5oCiAJICB8fCBjcCBhcnRzdmVyc2lvbi1uZXcuaCBhcnRzdmVyc2lvbi5oKSAK IAogYXJ0c2NhdC5jYzogc291bmRzZXJ2ZXIuaCBhcnRzdmVyc2lvbi5oCithcnRzZHVtcC5jYzog c291bmRzZXJ2ZXIuaCBhcnRzdmVyc2lvbi5oCiBhcnRzZC5jYzogc291bmRzZXJ2ZXIuaCBhcnRz dmVyc2lvbi5oCiBhcnRzcGxheS5jYzogc291bmRzZXJ2ZXIuaCBhcnRzdmVyc2lvbi5oCiBhcnRz c2hlbGwuY2M6IHNvdW5kc2VydmVyLmggYXJ0c3ZlcnNpb24uaApJbmRleDogc291bmRzZXJ2ZXIv YXJ0c2R1bXAuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogYXJ0c2R1bXAuY2MKZGlmZiAtTiBhcnRz ZHVtcC5jYwotLS0gL2Rldi9udWxsCVR1ZSBNYXkgIDUgMjA6MzI6MjcgMTk5OAorKysgYXJ0c2R1 bXAuY2MJU3VuIE9jdCAyMSAxOToxNDo1OCAyMDAxCkBAIC0wLDAgKzEsMTkyIEBACisgICAgLyoK KworICAgIENvcHlyaWdodCAoQykgMjAwMCBTdGVmYW4gV2VzdGVyZmVsZAorICAgICAgICAgICAg ICAgICAgICAgICBzdGVmYW5Ac3BhY2UudHdjLmRlCisJCQkJICAyMDAxIE1hdHRoaWFzIEtyZXR6 CisJCQkJICAgICAgIGtyZXR6QGtkZS5vcmcKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u ZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor ICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwg VVNBLgorCisgICAgUGVybWlzc2lvbiBpcyBhbHNvIGdyYW50ZWQgdG8gbGluayB0aGlzIHByb2dy YW0gd2l0aCB0aGUgUXQKKyAgICBsaWJyYXJ5LCB0cmVhdGluZyBRdCBsaWtlIGEgbGlicmFyeSB0 aGF0IG5vcm1hbGx5IGFjY29tcGFuaWVzIHRoZQorICAgIG9wZXJhdGluZyBzeXN0ZW0ga2VybmVs LCB3aGV0aGVyIG9yIG5vdCB0aGF0IGlzIGluIGZhY3QgdGhlIGNhc2UuCisKKyAgICAqLworCisj aW5jbHVkZSAic291bmRzZXJ2ZXIuaCIKKyNpbmNsdWRlICJzdGRzeW50aG1vZHVsZS5oIgorI2lu Y2x1ZGUgImFydHN2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2luY2x1ZGUgPHN0 ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRl IDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBBcnRz OworCitpbnQgY2ZnU2FtcGxpbmdSYXRlID0gNDQxMDA7CitpbnQgY2ZnQml0cyA9IDE2OworaW50 IGNmZ0NoYW5uZWxzID0gMjsKKworY2xhc3MgUmVjZWl2ZXIgOglwdWJsaWMgQnl0ZVNvdW5kUmVj ZWl2ZXJfc2tlbCwKKwkJCQlwdWJsaWMgU3RkU3ludGhNb2R1bGUsCisJCQkJcHVibGljIElPTm90 aWZ5Cit7Citwcm90ZWN0ZWQ6CisJRklMRSAqcGZpbGU7CisJaW50IHBmZDsKKwlpbnQgcGFja2V0 czsKKwlib29sIHdhaXRpbmc7CisJcXVldWU8IERhdGFQYWNrZXQ8bWNvcGJ5dGU+KiA+IHdxdWV1 ZTsKK3B1YmxpYzoKKwlSZWNlaXZlcihGSUxFICppbnB1dCxmbG9hdCBtaW5TdHJlYW1CdWZmZXJU aW1lKSA6IHBmaWxlKGlucHV0KSwgd2FpdGluZyhmYWxzZSkKKwl7CisJCXBmZCA9IGZpbGVubyhw ZmlsZSk7CisKKwkJaW50IHJjID0gZmNudGwocGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKwkJ YXNzZXJ0KHJjICE9IC0xKTsKKworCQkvKgorCQkgKiBjYWxjdWxhdGUgc3RyZWFtIGJ1ZmZlciBw YXJhbXRlcnMKKwkJICovCisJCWZsb2F0IHN0cmVhbUJ1ZmZlclRpbWU7CisJCXBhY2tldHMgPSA3 OworCQlkbyB7CisJCQlwYWNrZXRzKys7CisJCQlzdHJlYW1CdWZmZXJUaW1lID0gKGZsb2F0KShw YWNrZXRzICogcGFja2V0Q2FwYWNpdHkgKiAxMDAwKQorCQkJICAgICAgICAgICAgICAgICAvIChm bG9hdCkoc2FtcGxpbmdSYXRlKCkgKiBjaGFubmVscygpICogMik7CisJCX0gd2hpbGUoc3RyZWFt QnVmZmVyVGltZSA8IG1pblN0cmVhbUJ1ZmZlclRpbWUpOworCX0KKworCX5SZWNlaXZlcigpCisJ eworCQlpZih3YWl0aW5nKSBEaXNwYXRjaGVyOjp0aGUoKS0+aW9NYW5hZ2VyKCktPnJlbW92ZSh0 aGlzLElPVHlwZTo6d3JpdGUpOworCX0KKworCWxvbmcgc2FtcGxpbmdSYXRlKCkgeyByZXR1cm4g Y2ZnU2FtcGxpbmdSYXRlOyB9CisJbG9uZyBjaGFubmVscygpICAgICB7IHJldHVybiBjZmdDaGFu bmVsczsgfQorCWxvbmcgYml0cygpICAgICAgICAgeyByZXR1cm4gY2ZnQml0czsgfQorCWJvb2wg ZmluaXNoZWQoKSAgICAgeyByZXR1cm4gKHBmaWxlID09IDApOyB9CisKKwllbnVtIHsgcGFja2V0 Q2FwYWNpdHkgPSA0MDk2IH07CisJdm9pZCBwcm9jZXNzX2luZGF0YShEYXRhUGFja2V0PG1jb3Bi eXRlPiAqcGFja2V0KQorCXsKKwkJaWYoIXdhaXRpbmcpCisJCXsKKwkJCWludCBzaXplID0gd3Jp dGUoIHBmZCwgcGFja2V0LT5jb250ZW50cywgcGFja2V0LT5zaXplICk7CisJCQlpZiggc2l6ZSAh PSBwYWNrZXQtPnNpemUgKSB7CisJCQkJYXJ0c19kZWJ1ZyggIk5vdCB3cml0dGVuIGVub3VnaCIg KTsKKwkJCQkvL0Rpc3BhdGNoZXI6OnRoZSgpLT5pb01hbmFnZXIoKS0+d2F0Y2hGRChwZmQsSU9U eXBlOjp3cml0ZSx0aGlzKTsKKwkJCQkvL3dhaXRpbmcgPSB0cnVlOworCQkJfQorCQkJcGFja2V0 LT5wcm9jZXNzZWQoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXdxdWV1ZS5wdXNoKHBhY2tldCk7 CisJfQorCisJdm9pZCBub3RpZnlJTyhpbnQsaW50KQorCXsKKyNpZiAwCisJCWFzc2VydCh3YWl0 aW5nKTsKKworCQlEYXRhUGFja2V0PG1jb3BieXRlPiAqcGFja2V0ID0gd3F1ZXVlLmZyb250KCk7 CisJCXBhY2tldC0+c2l6ZSA9IHJlYWQocGZkLCBwYWNrZXQtPmNvbnRlbnRzLCBwYWNrZXRDYXBh Y2l0eSk7CisJCWFzc2VydChwYWNrZXQtPnNpemUgPj0gMCk7CisJCWlmKHBhY2tldC0+c2l6ZSA9 PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJcGFja2V0LT5zZW5kKCk7CisKKwkJd3F1ZXVlLnBv cCgpOworCisJCWlmKHdxdWV1ZS5lbXB0eSgpKQorCQl7CisJCQlEaXNwYXRjaGVyOjp0aGUoKS0+ aW9NYW5hZ2VyKCktPnJlbW92ZSh0aGlzLElPVHlwZTo6d3JpdGUpOworCQkJd2FpdGluZyA9IGZh bHNlOworCQl9CisjZW5kaWYKKwl9Cit9OworCitzdGF0aWMgdm9pZCBleGl0VXNhZ2UoY29uc3Qg Y2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRlcnIsInVzYWdlOiAlcyBbIG9wdGlvbnMg XSBbIDxmaWxlbmFtZT4gXVxuIixwcm9nbmFtZSk7CisJZnByaW50ZihzdGRlcnIsIi1yIDxzYW1w bGluZ3JhdGU+ICAgc2V0IHNhbXBsaW5ncmF0ZSB0byB1c2VcbiIpOworCWZwcmludGYoc3RkZXJy LCItYiA8Yml0cz4gICAgICAgICAgIHNldCBudW1iZXIgb2YgYml0cyAoOCBvciAxNilcbiIpOwor CWZwcmludGYoc3RkZXJyLCItYyA8Y2hhbm5lbHM+ICAgICAgIHNldCBudW1iZXIgb2YgY2hhbm5l bHMgKDEgb3IgMilcbiIpOworCWZwcmludGYoc3RkZXJyLCItdiAgICAgICAgICAgICAgICAgIHNo b3cgdmVyc2lvblxuIik7CisJZnByaW50ZihzdGRlcnIsIi1oICAgICAgICAgICAgICAgICAgZGlz cGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOworCWV4aXQoMSk7CQorfQorCitpbnQgbWFpbihp bnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdGNoOworCXdoaWxlKChvcHRjaCA9IGdl dG9wdChhcmdjLGFyZ3YsInI6YjpjOmh2IikpID4gMCkKKwl7CisJCXN3aXRjaChvcHRjaCkKKwkJ eworCQkJY2FzZSAncic6IGNmZ1NhbXBsaW5nUmF0ZSA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVh azsKKwkJCWNhc2UgJ2InOiBjZmdCaXRzID0gYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJ Y2FzZSAnYyc6IGNmZ0NoYW5uZWxzID0gYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2Fz ZSAndic6IAorCQkJCXByaW50ZigiYXJ0c2R1bXAgJXNcbiIsQVJUU19WRVJTSU9OKTsKKwkJCQll eGl0KDApOworCQkJCWJyZWFrOworCQkJY2FzZSAnaCc6CisJCQlkZWZhdWx0OiAKKwkJCQkJZXhp dFVzYWdlKGFyZ2M/YXJndlswXToiYXJ0c2R1bXAiKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwor CUZJTEUgKm91dGZpbGUgPSBzdGRvdXQ7CisKKwlpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisJ CXN0cmluZyBmaWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwkJaWYoZmlsZW5hbWUgIT0gIi0iKQor CQl7CisJCQlvdXRmaWxlID0gZm9wZW4oZmlsZW5hbWUuY19zdHIoKSwidyIpOworCQkJaWYoIW91 dGZpbGUpCisJCQl7CisJCQkJY2VyciA8PCAiQ2FuJ3Qgb3BlbiBmaWxlICciIDw8IGFyZ3Zbb3B0 aW5kXSA8PCAiJy4iIDw8IGVuZGw7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCX0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorCURpc3BhdGNoZXIgZGlzcGF0Y2hlcjsKKwlTaW1wbGVTb3VuZFNlcnZlciBzZXJ2ZXIo UmVmZXJlbmNlKCJnbG9iYWw6QXJ0c19TaW1wbGVTb3VuZFNlcnZlciIpKTsKKworCWlmKHNlcnZl ci5pc051bGwoKSkKKwl7CisJCWNlcnIgPDwgIkNhbid0IGNvbm5lY3QgdG8gc291bmQgc2VydmVy IiA8PCBlbmRsOworCQlyZXR1cm4gMTsKKwl9CisKKwlCeXRlU291bmRSZWNlaXZlciByZWNlaXZl ciA9IEJ5dGVTb3VuZFJlY2VpdmVyOjpfZnJvbV9iYXNlKG5ldyBSZWNlaXZlcihvdXRmaWxlLHNl cnZlci5taW5TdHJlYW1CdWZmZXJUaW1lKCkpKTsKKwlzZXJ2ZXIuYXR0YWNoKHJlY2VpdmVyKTsK KwlyZWNlaXZlci5zdGFydCgpOworCWRpc3BhdGNoZXIucnVuKCk7CisJcmVjZWl2ZXIuc3RvcCgp OworCXNlcnZlci5kZXRhY2gocmVjZWl2ZXIpOworfQpJbmRleDogc291bmRzZXJ2ZXIvc2ltcGxl c291bmRzZXJ2ZXJfaW1wbC5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9rZGUva2RlbGli cy9hcnRzL3NvdW5kc2VydmVyL3NpbXBsZXNvdW5kc2VydmVyX2ltcGwuY2MsdgpyZXRyaWV2aW5n IHJldmlzaW9uIDEuMzYKZGlmZiAtdSAtMyAtcCAtcjEuMzYgc2ltcGxlc291bmRzZXJ2ZXJfaW1w bC5jYwotLS0gc291bmRzZXJ2ZXIvc2ltcGxlc291bmRzZXJ2ZXJfaW1wbC5jYwkyMDAxLzA3LzA0 IDE2OjMxOjA2CTEuMzYKKysrIHNvdW5kc2VydmVyL3NpbXBsZXNvdW5kc2VydmVyX2ltcGwuY2MJ MjAwMS8xMC8yMSAxOToxNDo1OApAQCAtMiw2ICsyLDggQEAKIAogICAgIENvcHlyaWdodCAoQykg MTk5OS0yMDAxIFN0ZWZhbiBXZXN0ZXJmZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RlZmFuQHNwYWNlLnR3Yy5kZQorCQkJCQkgICAyMDAxIE1hdHRoaWFzIEtyZXR6CisJCQkJCSAg ICAgICAga3JldHpAa2RlLm9yZwogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpA QCAtMjksNiArMzEsOCBAQAogI2luY2x1ZGUgImF1ZGlvc3Vic3lzLmgiCiAjaW5jbHVkZSAiY29u bmVjdC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicmVmZXJlbmNlLmgiCisKICNp bmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCkBAIC0xMDMsNiArMTA3LDgg QEAgdm9pZCBQbGF5U3RyZWFtSm9iOjpkZXRhY2goY29uc3QgT2JqZWN0Jgogdm9pZCBQbGF5U3Ry ZWFtSm9iOjp0ZXJtaW5hdGUoKQogewogCXNlbmRlciA9IEJ5dGVTb3VuZFByb2R1Y2VyOjpudWxs KCk7CisJY29udmVydC5zdG9wKCk7CisJb3V0LnN0b3AoKTsKIH0KIAogYm9vbCBQbGF5U3RyZWFt Sm9iOjpkb25lKCkKQEAgLTExNCw2ICsxMjAsNTcgQEAgYm9vbCBQbGF5U3RyZWFtSm9iOjpkb25l KCkKIAlyZXR1cm4gc2VuZGVyLmlzTnVsbCgpICYmICFjb252ZXJ0LnJ1bm5pbmcoKTsKIH0KIAor UmVjb3JkU3RyZWFtSm9iOjpSZWNvcmRTdHJlYW1Kb2IoQnl0ZVNvdW5kUmVjZWl2ZXIgYnNyKSA6 IHJlY2VpdmVyKGJzcikKK3sKKwlpbnQgc2FtcGxpbmdSYXRlID0gYnNyLnNhbXBsaW5nUmF0ZSgp OworCWludCBjaGFubmVscyA9IGJzci5jaGFubmVscygpOworCWludCBiaXRzID0gYnNyLmJpdHMo KTsKKworCWFydHNfZGVidWcoIm91dGdvaW5nIHN0cmVhbSwgcGFyYW1ldGVyczogcmF0ZT0lZCwg JWQgYml0LCAlZCBjaGFubmVscyIsCisJCXNhbXBsaW5nUmF0ZSwgYml0cywgY2hhbm5lbHMpOwor CisJaWYoKHNhbXBsaW5nUmF0ZSA8IDUwMCB8fCBzYW1wbGluZ1JhdGUgPiAyMDAwMDAwKQorCXx8 IChjaGFubmVscyAhPSAxICYmIGNoYW5uZWxzICE9IDIpIHx8IChiaXRzICE9IDggJiYgYml0cyAh PSAxNikpCisJeworCQlhcnRzX3dhcm5pbmcoImludmFsaWQgc3RyZWFtIHBhcmFtZXRlcnM6IHJh dGU9JWQsICVkIGJpdCwgJWQgY2hhbm5lbHMiLAorCQkJCQkJc2FtcGxpbmdSYXRlLCBiaXRzLCBj aGFubmVscyk7CisJCXRlcm1pbmF0ZSgpOworCQlyZXR1cm47CisJfQorCisJY29udmVydC5zYW1w bGluZ1JhdGUoc2FtcGxpbmdSYXRlKTsKKwljb252ZXJ0LmNoYW5uZWxzKGNoYW5uZWxzKTsKKwlj b252ZXJ0LmJpdHMoYml0cyk7CisKKwljb25uZWN0KGluLGNvbnZlcnQpOworCWNvbm5lY3QoY29u dmVydCwib3V0ZGF0YSIscmVjZWl2ZXIsImluZGF0YSIpOworCisJaW4uc3RhcnQoKTsKKwljb252 ZXJ0LnN0YXJ0KCk7Cit9CisKK3ZvaWQgUmVjb3JkU3RyZWFtSm9iOjpkZXRhY2goY29uc3QgT2Jq ZWN0JiBvYmplY3QpCit7CisJaWYob2JqZWN0Ll9pc0VxdWFsKHJlY2VpdmVyKSkKKwkJdGVybWlu YXRlKCk7Cit9CisKK3ZvaWQgUmVjb3JkU3RyZWFtSm9iOjp0ZXJtaW5hdGUoKQoreworCXJlY2Vp dmVyID0gQnl0ZVNvdW5kUmVjZWl2ZXI6Om51bGwoKTsKKwljb252ZXJ0LnN0b3AoKTsKKwlpbi5z dG9wKCk7Cit9CisKK2Jvb2wgUmVjb3JkU3RyZWFtSm9iOjpkb25lKCkKK3sKKwkvLyB3aGVuIHRo ZSBzZW5kZXIgaXMgbm90IGFsaXZlIGFueSBsb25nZXIsIGFzc2lnbiBhIG51bGwgb2JqZWN0CisJ aWYoIXJlY2VpdmVyLmlzTnVsbCgpICYmIHJlY2VpdmVyLmVycm9yKCkpCisJCXJlY2VpdmVyID0g Qnl0ZVNvdW5kUmVjZWl2ZXI6Om51bGwoKTsKKworCXJldHVybiByZWNlaXZlci5pc051bGwoKTsK K30KKwogLyoKICAqICAgICggVGhpcyBwbGFjZSB3aGVyZSBvdGhlciBvYmplY3RzIGZvciBwbGF5 aW5nIHdhdmUgZmlsZXMgYW5kIHN1Y2ggd2lsbAogICogICAgICBiZSBjb25uZWN0ZWQsIHRvIGdl dCB0aGVpciBvdXRwdXQgbWl4ZWQgd2l0aCB0aGUgb3RoZXIgY2xpZW50cyApLgpAQCAtMjA1LDIy ICsyNjIsMzAgQEAgZmxvYXQgU2ltcGxlU291bmRTZXJ2ZXJfaW1wbDo6bWluU3RyZWFtQgogCXJl dHVybiBidWZmZXJNdWx0aXBsaWVyICogc2VydmVyQnVmZmVyVGltZSgpOwogfQogCi12b2lkIFNp bXBsZVNvdW5kU2VydmVyX2ltcGw6OmF0dGFjaChCeXRlU291bmRQcm9kdWNlciBic3ApCit2b2lk IFNpbXBsZVNvdW5kU2VydmVyX2ltcGw6OmF0dGFjaChTeW50aE1vZHVsZSBzbSkKIHsKLQlhcnRz X3JldHVybl9pZl9mYWlsKCFic3AuaXNOdWxsKCkpOworCWFydHNfcmV0dXJuX2lmX2ZhaWwoIXNt LmlzTnVsbCgpKTsKIAotCWpvYnMucHVzaF9iYWNrKG5ldyBQbGF5U3RyZWFtSm9iKGJzcCkpOwor CWlmKCBzbS5faW50ZXJmYWNlTmFtZSgpID09ICJBcnRzOjpCeXRlU291bmRQcm9kdWNlciIgKSB7 CisJCUJ5dGVTb3VuZFByb2R1Y2VyIGJzcCA9IER5bmFtaWNDYXN0KCBzbSApOworCQlqb2JzLnB1 c2hfYmFjayhuZXcgUGxheVN0cmVhbUpvYihic3ApKTsKKwl9IGVsc2UgaWYoIHNtLl9pbnRlcmZh Y2VOYW1lKCkgPT0gIkFydHM6OkJ5dGVTb3VuZFJlY2VpdmVyIiApIHsKKwkJQnl0ZVNvdW5kUmVj ZWl2ZXIgYnNyID0gRHluYW1pY0Nhc3QoIHNtICk7CisJCWpvYnMucHVzaF9iYWNrKG5ldyBSZWNv cmRTdHJlYW1Kb2IoYnNyKSk7CisJfSBlbHNlIHsKKwkJYXJ0c19kZWJ1ZyggImNhbid0IGF0dGFj aCB1bmtub3duIHN0cmVhbSIgKTsKKwl9CiB9CiAKLXZvaWQgU2ltcGxlU291bmRTZXJ2ZXJfaW1w bDo6ZGV0YWNoKEJ5dGVTb3VuZFByb2R1Y2VyIGJzcCkKK3ZvaWQgU2ltcGxlU291bmRTZXJ2ZXJf aW1wbDo6ZGV0YWNoKFN5bnRoTW9kdWxlIHNtKQogewotCWFydHNfcmV0dXJuX2lmX2ZhaWwoIWJz cC5pc051bGwoKSk7Ci0JYXJ0c19kZWJ1ZygiZGV0YWNoIGluY29taW5nIHN0cmVhbSIpOworCWFy dHNfcmV0dXJuX2lmX2ZhaWwoIXNtLmlzTnVsbCgpKTsKKwlhcnRzX2RlYnVnKCJkZXRhY2ggJXMg c3RyZWFtIiwgc20uX2ludGVyZmFjZU5hbWUoKS5jX3N0cigpKTsKIAogCWxpc3Q8U291bmRTZXJ2 ZXJKb2IgKj46Oml0ZXJhdG9yIGo7CiAKIAlmb3IoaiA9IGpvYnMuYmVnaW4oKTtqICE9IGpvYnMu ZW5kKCk7aisrKQotCQkoKmopLT5kZXRhY2goYnNwKTsKKwkJKCpqKS0+ZGV0YWNoKHNtKTsKIH0K IAogU3RlcmVvRWZmZWN0U3RhY2sgU2ltcGxlU291bmRTZXJ2ZXJfaW1wbDo6b3V0c3RhY2soKQpJ bmRleDogc291bmRzZXJ2ZXIvc2ltcGxlc291bmRzZXJ2ZXJfaW1wbC5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT IGZpbGU6IC9ob21lL2tkZS9rZGVsaWJzL2FydHMvc291bmRzZXJ2ZXIvc2ltcGxlc291bmRzZXJ2 ZXJfaW1wbC5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjIxCmRpZmYgLXUgLTMgLXAgLXIxLjIx IHNpbXBsZXNvdW5kc2VydmVyX2ltcGwuaAotLS0gc291bmRzZXJ2ZXIvc2ltcGxlc291bmRzZXJ2 ZXJfaW1wbC5oCTIwMDEvMDQvMDQgMTc6MDM6MjgJMS4yMQorKysgc291bmRzZXJ2ZXIvc2ltcGxl c291bmRzZXJ2ZXJfaW1wbC5oCTIwMDEvMTAvMjEgMTk6MTQ6NTgKQEAgLTIsNiArMiw4IEBACiAK ICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBTdGVmYW4gV2VzdGVyZmVsZAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0ZWZhbkBzcGFjZS50d2MuZGUKKwkJCQkJICAgMjAwMSBNYXR0 aGlhcyBLcmV0egorCQkJCQkgICAgICAgIGtyZXR6QGtkZS5vcmcKIAogICAgIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CiAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTcyLDYgKzc0LDIxIEBAIHB1YmxpYzoKIAlib29sIGRvbmUo KTsKIH07CiAKK2NsYXNzIFJlY29yZFN0cmVhbUpvYiA6IHB1YmxpYyBTb3VuZFNlcnZlckpvYgor eworcHJvdGVjdGVkOgorCUJ5dGVTb3VuZFJlY2VpdmVyIHJlY2VpdmVyOworCUF1ZGlvVG9CeXRl U3RyZWFtIGNvbnZlcnQ7CisJU3ludGhfQU1BTl9SRUNPUkQgaW47CisKK3B1YmxpYzoKKwlSZWNv cmRTdHJlYW1Kb2IoQnl0ZVNvdW5kUmVjZWl2ZXIgYnNyKTsKKworCXZvaWQgZGV0YWNoKGNvbnN0 IE9iamVjdCYgb2JqZWN0KTsKKwl2b2lkIHRlcm1pbmF0ZSgpOworCWJvb2wgZG9uZSgpOworfTsK KwogY2xhc3MgU2ltcGxlU291bmRTZXJ2ZXJfaW1wbCA6IHZpcnR1YWwgcHVibGljIFNpbXBsZVNv dW5kU2VydmVyX3NrZWwsCiAJCQkJCQkJCQkJcHVibGljIFRpbWVOb3RpZnkKIHsKQEAgLTk2LDgg KzExMyw4IEBAIHB1YmxpYzoKIAkvLyBzdHJlYW1pbmcgYXVkaW8KIAlmbG9hdCBtaW5TdHJlYW1C dWZmZXJUaW1lKCk7CiAJZmxvYXQgc2VydmVyQnVmZmVyVGltZSgpOwotCXZvaWQgYXR0YWNoKEJ5 dGVTb3VuZFByb2R1Y2VyIGJzcCk7Ci0Jdm9pZCBkZXRhY2goQnl0ZVNvdW5kUHJvZHVjZXIgYnNw KTsKKwl2b2lkIGF0dGFjaChTeW50aE1vZHVsZSBzbSk7CisJdm9pZCBkZXRhY2goU3ludGhNb2R1 bGUgc20pOwogCiAJLy8gc2ltcGxlIHNvdW5kc2VydmVyIGludGVyZmFjZQogCWxvbmcgcGxheShj b25zdCBzdGQ6OnN0cmluZyYgcyk7CkluZGV4OiBzb3VuZHNlcnZlci9zb3VuZHNlcnZlci5pZGwK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZWxpYnMvYXJ0cy9zb3VuZHNlcnZlci9z b3VuZHNlcnZlci5pZGwsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTgKZGlmZiAtdSAtMyAtcCAt cjEuMTggc291bmRzZXJ2ZXIuaWRsCi0tLSBzb3VuZHNlcnZlci9zb3VuZHNlcnZlci5pZGwJMjAw MS8wNC8yOCAxODoxNToxMAkxLjE4CisrKyBzb3VuZHNlcnZlci9zb3VuZHNlcnZlci5pZGwJMjAw MS8xMC8yMSAxOToxNDo1OApAQCAtNjksNiArNjksMTggQEAgaW50ZXJmYWNlIEJ5dGVTb3VuZFBy b2R1Y2VyIDogU3ludGhNb2R1bAogfTsKIAogLyoqCisgKiBSZWNlaXZlciBvZiBieXRlIHNvdW5k CisgKi8KK2ludGVyZmFjZSBCeXRlU291bmRSZWNlaXZlciA6IFN5bnRoTW9kdWxlCit7CisJcmVh ZG9ubHkgYXR0cmlidXRlIGxvbmcgc2FtcGxpbmdSYXRlOworCXJlYWRvbmx5IGF0dHJpYnV0ZSBs b25nIGNoYW5uZWxzOworCXJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGJpdHM7CisKKwlhc3luYyBp biBieXRlIHN0cmVhbSBpbmRhdGE7Cit9OworCisvKioKICAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBs ZSBzb3VuZCBzZXJ2ZXIgaW50ZXJmYWNlCiAgKgogICogV0FSTklORzogVGhpcyBjdXJyZW50bHkg aW5oZXJpdHMgYSBLTWVkaWEyIFBsYXlPYmplY3RGYWN0b3J5IGZvciB0ZXN0CkBAIC0xMTksMTIg KzEzMSwxMiBAQCBpbnRlcmZhY2UgU2ltcGxlU291bmRTZXJ2ZXIgOiBQbGF5T2JqZWN0CiAJICog YXR0YWNoZXMgYSBieXRlIHNvdW5kIHByb2R1Y2VyIChyZWFkOiBhIGNsaWVudCB3aGljaCBwcm9k dWNlcy9taXhlcwogCSAqIGFuIGF1ZGlvIHN0cmVhbSBpdHNlbGYgYW5kIGp1c3Qgd2FudHMgcGxh eWJhY2sgdmlhIHRoZSBzb3VuZHNlcnZlcikKIAkgKi8KLQl2b2lkIGF0dGFjaChCeXRlU291bmRQ cm9kdWNlciBwcm9kdWNlcik7CisJdm9pZCBhdHRhY2goU3ludGhNb2R1bGUgc20pOwogCiAJLyoq CiAJICogZGV0YWNoZXMgYSBwcmV2aW91cyBhdHRhY2hlZCBieXRlIHNvdW5kIHByb2R1Y2VyCiAJ ICovCi0Jdm9pZCBkZXRhY2goQnl0ZVNvdW5kUHJvZHVjZXIgcHJvZHVjZXIpOworCXZvaWQgZGV0 YWNoKFN5bnRoTW9kdWxlIHNtKTsKIAogCW9iamVjdCBjcmVhdGVPYmplY3Qoc3RyaW5nIG5hbWUp OwogfTsK --------------Boundary-00=_W5MK8FLQNN7K9MERMTP2-- _______________________________________________ kde-multimedia mailing list kde-multimedia@mail.kde.org http://mail.kde.org/mailman/listinfo/kde-multimedia