From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Chavent Subject: Re: Single socket with TX_RING and RX_RING Date: Mon, 20 May 2013 22:50:29 +0200 Message-ID: <519A8C95.6090609@fnac.net> References: <51938BAD.5050502@redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010101080108060701030802" Cc: netdev@vger.kernel.org To: =?UTF-8?B?UmljYXJkbyBUdWLDrW8=?= Return-path: Received: from smtpfb1-g21.free.fr ([212.27.42.9]:53936 "EHLO smtpfb1-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756298Ab3ETUtH (ORCPT ); Mon, 20 May 2013 16:49:07 -0400 Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by smtpfb1-g21.free.fr (Postfix) with ESMTP id 9199A2D28F for ; Mon, 20 May 2013 22:49:02 +0200 (CEST) In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: This is a multi-part message in MIME format. --------------010101080108060701030802 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 05/15/2013 03:32 PM, Ricardo Tubío wrote: > Daniel Borkmann redhat.com> writes: > >> >> On 05/15/2013 02:53 PM, Ricardo Tubío wrote: >>> Once I tell kernel to export the TX_RING through setsockopt() (see code >>> below) I always get an error (EBUSY) if i try to tell kernel to export the >>> RX_RING with the same socket descriptor. Therefore, I have to open an >>> additional socket for the RX_RING and I require of two sockets when I though >>> that I would only require of one socket for both TX and RX using mmap()ed >>> memory. >>> >>> Do I need both sockets or am I doing something wrong? >> >> The second time you call init_ring() in your code e.g. with TX_RING, where >> you have previously set it up for the RX_RING. The kernel will give you >> -EBUSY because the packet socket is already mmap(2)'ed. >> > > Ok, so if I make the following system calls: > > void *ring=NULL; > setsockopt(socket_fd, SOL_PACKET, PACKET_RX_RING, p, LEN__TPACKET_REQ); > ring = mmap(NULL, ring_len, ring_access_flags, MAP_SHARED, socket_fd, 0); > > Would I be permitted to use the ring map obtained both for RX and for TX? If > so, for me it is confusing to use PACKET_RX_RING if I can also TX data > through that ring... > Hello Ricardo. I managed to use the same socket and a single mmaped area for both RX_RING and TX_RING. Here is some sample code : /* open socket */ sock_fd = socket(PF_PACKET, socket_type, htons(socket_protocol)); /* socket tuning and init */ [...] /* rings geometry */ rx_packet_req.tp_block_size = pagesize << order; rx_packet_req.tp_block_nr = 1; rx_packet_req.tp_frame_size = frame_size; rx_packet_req.tp_frame_nr = (rx_packet_req.tp_block_size / rx_packet_req.tp_frame_size) * rx_packet_req.tp_block_nr; tx_packet_req = rx_packet_req; /* set packet version */ setsockopt(sock_fd, SOL_PACKET, PACKET_VERSION, &version, sizeof(version)) /* set RX ring option */ setsockopt(sock_fd, SOL_PACKET, PACKET_RX_RING, &rx_packet_req, sizeof(rx_packet_req)) /* set TX ring option*/ setsockopt(sock_fd, SOL_PACKET, PACKET_TX_RING, &tx_packet_req, sizeof(tx_packet_req)) /* map rx + tx buffer to userspace : they are in this order */ mmap_size = rx_packet_req.tp_block_size * rx_packet_req.tp_block_nr + tx_packet_req.tp_block_size * tx_packet_req.tp_block_nr ; mmap_base = mmap(0, mmap_size, PROT_READ|PROT_WRITE, MAP_SHARED, sock_fd, 0); /* get rx and tx buffer description */ rx_buffer_size = rx_packet_req.tp_block_size * rx_packet_req.tp_block_nr; rx_buffer_addr = mmap_base; rx_buffer_idx = 0; rx_buffer_cnt = rx_packet_req.tp_block_size * rx_packet_req.tp_block_nr / rx_packet_req.tp_frame_size; tx_buffer_size = tx_packet_req.tp_block_size * tx_packet_req.tp_block_nr; tx_buffer_addr = mmap_base + rx_buffer_size; tx_buffer_idx = 0; tx_buffer_cnt = tx_packet_req.tp_block_size * tx_packet_req.tp_block_nr / tx_packet_req.tp_frame_size; I join to this mail a complete (but certainly outdated) sample code. I've also begun to write a kind of howto (in french) on the packet mmap at this page : http://paul.chavent.free.fr/packet_mmap.html (this is a work in progress, i will add information on timestamping) Regards. Paul. > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > --------------010101080108060701030802 Content-Type: text/plain; charset=ISO-8859-1; name="ethernet.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ethernet.c" LyoKICogVGhpcyBtb2R1bGUgYWxsb3cgdG8gc2VuZC9yZWNlaXZlIGV0aGVybmV0IGZyYW1l cy4KICogVGhlIHR5cGUgb2YgZXRoZXJuZXQgZnJhbWVzIG11c3QgYmUgc3BlY2lmaWVkIGF0 IGNvbXBpbGUgdGltZSA6CiAqICAtIHVzZSA4MDIxUSBvciBub3QKICogICAgLSB0cGlkIGFu ZCB0Y2kKICogIC0gZXRoZXJ0eXBlCiAqICAtIGZpbHRlcmluZyBvciBub3QKICoKICogU2Vl IC91c3Ivc3JjL2xpbnV4L0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50 eHQgIGZvciBpbXByb3ZlbWVudAogKgogKgogKiBOb3RlcyBvbiBwYWNrZXQgbW1hcAogKgog KiBGb3IgdHggZXhhbXBsZSBzZWUgOgogKiAgIGh0dHA6Ly93aWtpLmlweHdhcnpvbmUuY29t L2luZGV4LnBocDU/dGl0bGU9TGludXhfcGFja2V0X21tYXAjRXhhbXBsZQogKiBGb3Igcngg ZXhhbXBsZSBzZWUgOgogKiAgIGh0dHA6Ly93d3cuc2NhcmFtYW5nYS5jby51ay9jb2RlLWZ1 L2xpbmNhcC5jCiAqCiAqICgxKSBJZiB3ZSBvcGVuIHRoZSBzb2NrZXQgd2l0aCBTT0NLX0RH UkFNLCB0aGUgdHBfbWFjIGFuZCB0aGUKICogICAgIHRwX25ldCBhcmUgdGhlIHNhbWUgKHRo ZSBtYWMgaGVhZGVyIGlzbid0IHByb3ZpZGVkIGJ5IHRoZQogKiAgICAgdXNlcikuIEVnIHRw X21hYz04MCBhbmQgdHBfbmV0PTgwLiBJZiB3ZSBvcGVuIHRoZSBzb2NrZXQgd2l0aAogKiAg ICAgU09DS19SQVcsIHRoZSB0cF9uZXQgPSB0cF9tYWMgKyAxNC4gRWcgdHBfbWFjPTY2IGFu ZCB0cF9uZXQ9ODAuCiAqICAgICAoc2VlICg2KSBmb3IgYWxpZ25tZW50KQogKgogKiAoMikg VGhlIHR4IGFuZCByeCBhcmUgYXN5bWV0cmljcy4gT24gdHggd2UgZmlsbCBkYXRhIGF0IAog KiAgICAgICBUUEFDS0VUMl9IRFJMRU4gLSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKQog KiAgICAgb24gcnggd2UgZ2V0IGRhdGEgYXQgKHNlZSAoMSkpIAogKiAgICAgICB0cF9tYWMg CiAqICAgICBvciAKICogICAgICAgdHBfbmV0IAogKgogKiAoMykgVGhlIG1tYXBpbmcgaXMg bWFkZSBvbmx5IG9uY2UgZm9yIHRoZSB0d28gc2lkZXMuIFRoZSBtYXAgZ2l2ZXMKICogICAg IHJ4IGJlZm9yZSB0eC4KICogCiAqICg0KSBUaGUgdHBfbGVuIGlzIHRoZSByZWFsIGxlbiBv ZiB0aGUgZnJhbWUsIHRoZSB0cF9zbmFwbGVuIGlzIHRoZQogKiAgICAgbGVuIG9mIHRoZSBk YXRhIGluIHRoZSByaW5nIGJ1ZmZlci4gSWYgeW91IGdpdmUgYSB0b28gc21hbGwKICogICAg IHNpemUgZm9yIHRoZSBzdHJ1Y3QgdHBhY2tldF9yZXEgLT4gdHBfZnJhbWVfc2l6ZSBpcyB0 aGUgcmVhbAogKiAgICAgbGVuZ3RoIGFuZCBpZiB0aGUgUEFDS0VUX0NPUFlfVFJFU0ggc29j a29wdCBpcyBzZXQsCiAqICAgICBUUF9TVEFUVVNfQ09QWSBpcyBzZXQgaW4gdHBfc3RhdHVz LgogKgogKiAoNSkgVGhlIG1pbmltdW0gdHBfZnJhbWVfc2l6ZSBmb3IgdHggaXMgdGhlIG1p bmltdW0gc2l6ZSBvZiB0aGUKICogICAgIHBheWxvYWQgKGluY2x1ZGluZyB0aGUgbWFjIGhl YWRlciBpZiBTT0NLX1JBVyBpcyBzZWxlY3RlZCkgcGx1cyA6CiAqICAgICAgIFRQQUNLRVQy X0hEUkxFTiAtIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpICAgICAgICAgICA9IDMyIAog KiAgICAgVGhlIFRQQUNLRVQyX0hEUkxFTiAtIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwp IGlzIGFsd2F5cyBhbGlnbmVkCiAqICAgICB0byAxNiBieXRlcwogKgogKgogKiAoNikgVGhl IG1pbmltdW0gdHBfZnJhbWVfc2l6ZSBmb3IgcnggaXMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0 aGUKICogICAgIHBheWxvYWQgKGluY2x1ZGluZyB0aGUgbWFjIGhlYWRlciBpZiBTT0NLX1JB VyBpcyBzZWxlY3RlZCkgcGx1cyA6CiAqICAgICAgIEFMSUdOXzE2KFRQQUNLRVQyX0hEUkxF TikgKyAxNiArIHRwX3Jlc2VydmUgKD0wKSAgICAgICA9IDgwID0gdHBfbmV0IAogKiAgICAg VGhlIHRwX25ldCB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkIHRvIDE2IGJ5dGVzIGJvdW5kYXJp ZXMKICoKICoKICogUlggRlJBTUUgU1RSVUNUVVJFIDoKICoKICogU3RhcnQgKGFsaWduZWQg dG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYpICAgVFBBQ0tFVF9BTElHTk1FTlQ9MTYgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAqIHYg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2CiAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgdHBfbWFjICAgICAgICAgICAgICAgICB8dHBfbmV0CiAqIHwgIHN0cnVj dCB0cGFja2V0X2hkciAgLi4uIHBhZCAgICAgICAgICAgIHwgc3RydWN0IHNvY2thZGRyX2xs IC4uLiBnYXAgIHwgbWluKDE2LCBtYWNsZW4pID0gMTYgICB8CiAqIHw8LS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tPnw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58PC0tLS0uLi4gCiAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB0cF9oZHJsZW4gPSBUUEFDS0VUMl9IRFJMRU4gICAgICAg ICAgICAgICAgICAgaWYgU09DS19SQVcgICAgICAgICAgICAgdXNlciBkYXRhCiAqCiAqCiAq IFRYIEZSQU1FIFNUUlVDVFVSRSA6CiAqCiAqIFN0YXJ0IChhbGlnbmVkIHRvIFRQQUNLRVRf QUxJR05NRU5UPTE2KSAgIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAqIHYgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfAogKiB8ICBzdHJ1Y3QgdHBhY2tldF9oZHIgIC4uLiBw YWQgICAgICAgICAgICB8IHN0cnVjdCBzb2NrYWRkcl9sbCAuLi4gZ2FwCiAqIHw8LS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tPnwgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cF9oZHJs ZW4gPSBUUEFDS0VUMl9IRFJMRU4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfDwtLS0tIC4uLiAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVzZXIgZGF0YQogKgogKgogKiBUT0RPIC8gSU1QUk9WRU1F TlRTCiAqICB2bGFuIDgwMlEKICogIHRpbWVzdGFtcAogKiAgZmlsdGVyaW5nCiAqICBzZXQg dGhlIG10dSBhY2NvcmRpbmcgdG8gdGhlIHRwX2ZyYW1lX3NpemUgb3Igc2V0IHRwX2ZyYW1l X3NpemUgYWNjb3JkaW5nCiAqICB0byB0aGUgbXR1ID8KICovCgojdW5kZWYgIFVTRV9GSUxU RVIKI2RlZmluZSBDT09LRURfUEFDS0VUCiN1bmRlZiAgUF84MDIxUQojZGVmaW5lIFBBVENI RURfUEFDS0VUCgojZGVmaW5lIF9HTlVfU09VUkNFIAoKI2luY2x1ZGUgPGFzc2VydC5oPiAg ICAgICAgICAgLyogYXNzZXJ0ICovCiNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgICAgIC8q IHByaW50ZiAqLwojaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgICAvKiBjYWxsb2MsIGZy ZWUgKi8KI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAgLyogbWVtY3B5ICovCiNpbmNs dWRlIDxlcnJuby5oPiAgICAgICAgICAgIC8qIGVycm5vLCBwZXJyb3IsIGV0YyAqLwojaW5j bHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAvKiBjbG9zZSAqLwojaW5jbHVkZSA8c3lzL2lv Y3RsLmg+ICAgICAgICAvKiBpb2N0bCAqLwojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAgICAg ICAvKiBodG9ucywgbnRvaHMgKi8KI2luY2x1ZGUgPHBvbGwuaD4gICAgICAgICAgICAgLyog cG9sbCAqLwojaW5jbHVkZSA8dGltZS5oPiAgICAgICAgICAgICAvKiBzdHJ1Y3QgdGltZXNw ZWMgKi8KI2luY2x1ZGUgPHN5cy90aW1lcmZkLmg+ICAgICAgLyogdGltZXJmZF9jcmVhdGUg ZXRjLiAqLwojaW5jbHVkZSA8c3lzL21tYW4uaD4gICAgICAgICAvKiBtbWFwICovCiNpbmNs dWRlIDxzeXMvc29ja2V0Lmg+ICAgICAgIC8qIHNvY2tldCAqLwojaW5jbHVkZSA8bmV0L2lm Lmg+ICAgICAgICAgICAvKiBpZnJlcSwgaWZjb25mICovCiNpbmNsdWRlIDxuZXQvZXRoZXJu ZXQuaD4gICAgIC8qIHN0cnVjdCBldGhlcl9oZWFkZXIsIEVUSF9BTEVOLCAuLi4gKi8KI2lu Y2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPiAgLyogcGFja2V0IG1tYXAqLwojaWYgZGVmaW5l ZChVU0VfRklMVEVSKQojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gICAgICAvKiBhdHRhY2gg ZmlsdGVyICovCiNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4gICAgIC8qIGF0dGFjaCBmaWx0 ZXIgKi8KI2VuZGlmCgojaW5jbHVkZSAiZXRoZXJuZXQuaCIKI2lmICFkZWZpbmVkKE5ERUJV RykKI2luY2x1ZGUgImRlYnVnLmgiCiNlbmRpZgoKI2RlZmluZSBNSU4oeCx5KSAoKHgpPCh5 KT8oeCk6KHkpKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLwogCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbmV4dF9wb3dlcl9vZl90d28odW5z aWduZWQgbikKewogIG4tLTsKICBuIHw9IG4gPj4gMTsKICBuIHw9IG4gPj4gMjsKICBuIHw9 IG4gPj4gNDsKICBuIHw9IG4gPj4gODsKICBuIHw9IG4gPj4gMTY7CiAgbisrOwogIHJldHVy biBuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCiAKc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnJvYWRjYXN0X2FkZHJbNl0gPSB7MHhmZiwg MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CgovKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBldGhlcm5ldF9zCnsKI2lmICFk ZWZpbmVkKE5ERUJVRykKICBpbnQgICAgICAgICAgICAgICAgZGVidWc7CiNlbmRpZgoKICBp bnQgICAgICAgICAgICAgICAgdGltZXJfZmQ7CgogIGludCAgICAgICAgICAgICAgICBzb2Nr X2ZkOwoKICBzdHJ1Y3Qgc29ja2FkZHJfbGwgbG9jYWxfYWRkcjsKICBzdHJ1Y3Qgc29ja2Fk ZHJfbGwgcmVtb3RlX2FkZHI7CgogIHVuc2lnbmVkICAgICAgICAgICBtdHU7CgogIHN0cnVj dCB0cGFja2V0X3JlcSByeF9wYWNrZXRfcmVxOwogIHN0cnVjdCB0cGFja2V0X3JlcSB0eF9w YWNrZXRfcmVxOwoKICB2b2lkICogICAgICAgICAgICAgbW1hcF9iYXNlOwogIHVuc2lnbmVk ICAgICAgICAgICBtbWFwX3NpemU7CgogIHVuc2lnbmVkICAgICAgICAgICByeF9idWZmZXJf c2l6ZTsKICB2b2lkICogICAgICAgICAgICAgcnhfYnVmZmVyX2FkZHI7CiAgdW5zaWduZWQg ICAgICAgICAgIHJ4X2J1ZmZlcl9jbnQ7CiAgdW5zaWduZWQgICAgICAgICAgIHJ4X2J1ZmZl cl9pZHg7CiAgdW5zaWduZWQgICAgICAgICAgIHJ4X2J1ZmZlcl9wYXlsb2FkX29mZnNldDsK ICB1bnNpZ25lZCAgICAgICAgICAgcnhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemU7CgogIHVu c2lnbmVkICAgICAgICAgICB0eF9idWZmZXJfc2l6ZTsKICB2b2lkICogICAgICAgICAgICAg dHhfYnVmZmVyX2FkZHI7CiAgdW5zaWduZWQgICAgICAgICAgIHR4X2J1ZmZlcl9jbnQ7IAog IHVuc2lnbmVkICAgICAgICAgICB0eF9idWZmZXJfaWR4OwogIHVuc2lnbmVkICAgICAgICAg ICB0eF9idWZmZXJfcGF5bG9hZF9vZmZzZXQ7CiAgdW5zaWduZWQgICAgICAgICAgIHR4X2J1 ZmZlcl9wYXlsb2FkX21heF9zaXplOwoKICBzdHJ1Y3QgcG9sbGZkICAgICAgcG9sbGZkWzJd Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LwoKLyogaHR0cDovL3N0YW5kYXJkcy5pZWVlLm9yZy9kZXZlbG9wL3JlZ2F1dGgvZXRoZXJ0 eXBlL2V0aC50eHQgKi8KI2RlZmluZSBFVEhfVFlQRSAweDg4YjUKCi8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAhZGVmaW5lZChDT09L RURfUEFDS0VUKQoKc3RhdGljIGNvbnN0IGludCBzb2NrZXRfdHlwZSAgICAgPSBTT0NLX0RH UkFNOwpzdGF0aWMgY29uc3QgaW50IHNvY2tldF9wcm90b2NvbCA9IEVUSF9QXzgwMl8zOwpz dGF0aWMgY29uc3QgaW50IGJpbmRfcHJvdG9jb2wgICA9IEVUSF9QXzgwMl8yOyAvLyBtYW4g cGFja2V0IHNlY3Rpb24gTm90ZXMKc3RhdGljIGNvbnN0IGludCBzZW5kX3Byb3RvY29sICAg PSBFVEhfVFlQRTsKCiNlbmRpZiAvKiAhZGVmaW5lZChDT09LRURfUEFDS0VUKSAqLwoKLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIGRl ZmluZWQoQ09PS0VEX1BBQ0tFVCkgJiYgIWRlZmluZWQoUF84MDIxUSkKCnN0YXRpYyBjb25z dCBpbnQgc29ja2V0X3R5cGUgICAgID0gU09DS19SQVc7CnN0YXRpYyBjb25zdCBpbnQgc29j a2V0X3Byb3RvY29sID0gRVRIX1BfODAyXzM7CnN0YXRpYyBjb25zdCBpbnQgYmluZF9wcm90 b2NvbCAgID0gRVRIX1BfODAyXzI7IC8vIG1hbiBwYWNrZXQgc2VjdGlvbiBOb3RlcwpzdGF0 aWMgY29uc3QgaW50IHNlbmRfcHJvdG9jb2wgICA9IEVUSF9UWVBFOwoKc3RydWN0IGV0aGVy X2hlYWRlcl9zCnsKICB1aW50OF90ICBkaG9zdFtFVEhfQUxFTl07CiAgdWludDhfdCAgc2hv c3RbRVRIX0FMRU5dOwogIHVpbnQxNl90IHR5cGU7Cn0gX19hdHRyaWJ1dGVfXyAoKF9fcGFj a2VkX18pKTsKCnR5cGVkZWYgc3RydWN0IGV0aGVyX2hlYWRlcl9zIGV0aGVyX2hlYWRlcl90 OwoKI2VuZGlmIC8qIGRlZmluZWQoQ09PS0VEX1BBQ0tFVCkgJiYgIWRlZmluZWQoUF84MDIx USkgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8KCiNpZiBkZWZpbmVkKENPT0tFRF9QQUNLRVQpICYmIGRlZmluZWQoUF84MDIxUSkKCnN0 YXRpYyBjb25zdCBpbnQgc29ja2V0X3R5cGUgICAgID0gU09DS19SQVc7CnN0YXRpYyBjb25z dCBpbnQgc29ja2V0X3Byb3RvY29sID0gRVRIX1BfQUxMOwpzdGF0aWMgY29uc3QgaW50IGJp bmRfcHJvdG9jb2wgICA9IEVUSF9QX0FMTDsKc3RhdGljIGNvbnN0IGludCBzZW5kX3Byb3Rv Y29sICAgPSBFVEhfVFlQRTsKCnN0cnVjdCBldGhlcl9oZWFkZXJfcwp7CiAgdWludDhfdCAg IGRob3N0W0VUSF9BTEVOXTsKICB1aW50OF90ICAgc2hvc3RbRVRIX0FMRU5dOwogIHVpbnQx Nl90ICB0cGlkOwogIHVpbnQxNl90ICB0Y2k7CiAgdWludDE2X3QgIHR5cGU7Cn0gX19hdHRy aWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKCnR5cGVkZWYgc3RydWN0IGV0aGVyX2hlYWRlcl9z IGV0aGVyX2hlYWRlcl90OwoKI2RlZmluZSBFXzgwMjFRX1RQSUQgMHg4MTAwCiNkZWZpbmUg RV84MDIxUV9UQ0kgIDB4RUZGRQoKI2RlZmluZSBFXzgwMjFRX1BDUCAweDcgICAgIC8qIHBy aW9yaXR5IDogaGlnaGVzdCAtPiBiZXR0ZXIsIGZyb20gMCB0byA3ICovCiNkZWZpbmUgRV84 MDIxUV9DRkkgMAojZGVmaW5lIEVfODAyMVFfVklEIDB4RkZFICAgLyogdmxhbiBpZCwgZnJv bSAwIChyZXNlcnZlZCkgdG8gMHhGRkYgKHJlc2VydmVkKSAqLwoKI2VuZGlmIC8qIGRlZmlu ZWQoQ09PS0VEX1BBQ0tFVCkgJiYgZGVmaW5lZChQXzgwMjFRKSAqLwoKLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIGRlZmluZWQoVVNF X0ZJTFRFUikKCnN0YXRpYyBzdHJ1Y3Qgc29ja19maWx0ZXIgZmlsdF9wcm9nX2NvZGVbXSA9 CnsKI2lmIGRlZmluZWQoUF84MDIxUSkKICAvKiBsb2FkIGFuZCBjaGVjayB0cGlkICovCiAg QlBGX1NUTVQoQlBGX0xEICB8IEJQRl9IICAgfCBCUEZfQUJTLCAxMiksICAgICAgICAgICAg ICAgIC8qIExvYWQgdHBpZCAqLwogIEJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBG X0ssICAgRV84MDIxUV9UUElELCAxLCAwKSwvKiBlcXVhbCA4MDIxUV9UUElEICovCiAgQlBG X1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAgICAgICAgICAgICAwKSwgICAgICAgICAgICAgICAg IC8qIHJlamVjdCAqLwogIC8qIGxvYWQgYW5kIGNoZWNrIHRjaSAqLwogIEJQRl9TVE1UKEJQ Rl9MRCAgfCBCUEZfSCAgIHwgQlBGX0FCUywgMTQpLCAgICAgICAgICAgICAgIC8qIExvYWQg dGNpICovCiAgQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgICBFXzgwMjFR X1RDSSwgMSwgMCksLyogZXF1YWwgODAyMVFfVENJICovCiAgQlBGX1NUTVQoQlBGX1JFVCB8 IEJQRl9LLCAgICAgICAgICAgICAwKSwgICAgICAgICAgICAgICAgLyogcmVqZWN0ICovCiNl bmRpZiAvKiBkZWZpbmVkKFVTRV84MDIxUSkgKi8KICBCUEZfU1RNVChCUEZfTEQgIHwgQlBG X0ggICB8IEJQRl9BQlMsIEVUSF9IRFJfTEVOIC0gMiksICAvKiBMb2FkIGV0aGVyIHR5cGUg Ki8KICBCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAgIEVUSF9UWVBFLCAx LCAwKSwgICAvKiBlcXVhbCBFVEhFUl9UWVBFICovCiAgQlBGX1NUTVQoQlBGX1JFVCB8IEJQ Rl9LLCAgICAgICAgICAgICAwKSwgICAgICAgICAgICAgICAgLyogcmVqZWN0ICovCiAgQlBG X1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAgICAgICAgICAgICA2NTUzNSksICAgICAgICAgICAg LyogYWNjZXB0ICovCn07CgpzdGF0aWMgc3RydWN0IHNvY2tfZnByb2cgZmlsdF9wcm9nID0K ewogIHNpemVvZihmaWx0X3Byb2dfY29kZSkgLyBzaXplb2YoZmlsdF9wcm9nX2NvZGVbMF0p LAogIGZpbHRfcHJvZ19jb2RlCn07CgojZW5kaWYgLyogZGVmaW5lZChVU0VfRklMVEVSKSAq LwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoj aWYgIWRlZmluZWQoTkRFQlVHKQpzdGF0aWMgdm9pZCBldGhlcm5ldF9kZWJ1Z19mcmFtZShj b25zdCB2b2lkICogYmFzZSk7CnN0YXRpYyB2b2lkIGV0aGVybmV0X2RlYnVnX3BhY2tldF9y ZXEoY29uc3Qgc3RydWN0IHRwYWNrZXRfcmVxICogcnhfcGFja2V0X3JlcSwgY29uc3Qgc3Ry dWN0IHRwYWNrZXRfcmVxICogdHhfcGFja2V0X3JlcSk7CiNlbmRpZgoKLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpldGhlcm5ldF90ICogZXRo ZXJuZXRfYWxsb2MoKQp7CiAgZXRoZXJuZXRfdCAqIGl0ZiA9IGNhbGxvYygxLCBzaXplb2Yo Kml0ZikpOwogIGlmKGl0ZikKICAgIHsKICAgICAgaXRmLT50aW1lcl9mZCA9IC0xOwogICAg ICBpdGYtPnNvY2tfZmQgPSAtMTsKICAgICAgaXRmLT5tbWFwX2Jhc2UgPSAodm9pZCAqKS0x OwogICAgfQogIHJldHVybiBpdGY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8Kdm9pZCBldGhlcm5ldF9mcmVlKGV0aGVybmV0X3QgKml0 ZikKewogLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYpOwoKICBldGhlcm5l dF9jbG9zZShpdGYpOwoKICBmcmVlKGl0Zik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGV0aGVybmV0X29wZW4oZXRoZXJuZXRf dCAqaXRmLCBjb25zdCBjaGFyICppdGZfbmFtZSkKewogIHN0cnVjdCBpZnJlcSBpZnI7CiAg aW50IGVyciA9IDA7CiAgc29ja2xlbl90IGVycmxlbiA9IHNpemVvZihlcnIpOwoKICAvKiBm aWxsIGlmciBuYW1lIGZpZWxkICovCiAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsK ICBzdHJuY3B5KGlmci5pZnJfbmFtZSwgaXRmX25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUp KTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYpOwoKICAvKiBjbGVh bnVwICovCiAgZXRoZXJuZXRfY2xvc2UoaXRmKTsKCiAgLyogc2V0dXAgdGltZXIgZmQgKi8K ICBpdGYtPnRpbWVyX2ZkID0gdGltZXJmZF9jcmVhdGUoQ0xPQ0tfUkVBTFRJTUUsIDApOwog IGlmKGl0Zi0+dGltZXJfZmQgPCAwKQogICAgewogICAgICBwZXJyb3IoInRpbWVyZmRfY3Jl YXRlIGZhaWxlZCIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogIC8qIG9wZW4gc29ja2V0 ICovCiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRmLT5kZWJ1ZykKICAgIHsKICAgICAg ZnByaW50ZihzdGRvdXQsICJzb2NrZXRcbiIpOwogICAgfQojZW5kaWYKICBpdGYtPnNvY2tf ZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBzb2NrZXRfdHlwZSwgaHRvbnMoc29ja2V0X3Byb3Rv Y29sKSk7CiAgaWYoaXRmLT5zb2NrX2ZkIDwgMCkKICAgIHsKICAgICAgcGVycm9yKCJzb2Nr ZXQgZmFpbGVkIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAKI2lmIGRlZmluZWQoVVNF X0ZJTFRFUikKICAvKiBhdHRhY2ggZmlsdGVyICovCiNpZiAhZGVmaW5lZChOREVCVUcpCiAg aWYoaXRmLT5kZWJ1ZykKICAgIHsKICAgICAgZnByaW50ZihzdGRvdXQsICJzZXRzb2Nrb3B0 IFNPX0FUVEFDSF9GSUxURVJcbiIpOwogICAgfQojZW5kaWYKICBpZihzZXRzb2Nrb3B0KGl0 Zi0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRfcHJvZywg c2l6ZW9mKGZpbHRfcHJvZykpKQogICAgewogICAgICBwZXJyb3IoImdldHNvY2tvcHQgU09f RVJST1IgZmFpbGVkIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KI2VuZGlmIC8qIGRlZmlu ZWQoVVNFX0ZJTFRFUikgKi8KCiAgLyogc2V0IGxvY2FsIGFkZHIgKi8KICBtZW1zZXQoJml0 Zi0+bG9jYWxfYWRkciwgMCwgc2l6ZW9mKGl0Zi0+bG9jYWxfYWRkcikpOwogIGl0Zi0+bG9j YWxfYWRkci5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwogIGl0Zi0+bG9jYWxfYWRkci5zbGxf cHJvdG9jb2wgPSBodG9ucyhiaW5kX3Byb3RvY29sKTsKCiAgLyogZ2V0IGl0ZiBpbmRleCAq LwojaWYgIWRlZmluZWQoTkRFQlVHKQogIGlmKGl0Zi0+ZGVidWcpCiAgICB7CiAgICAgIGZw cmludGYoc3Rkb3V0LCAiaW9jdGwgU0lPQ0dJRklOREVYXG4iKTsKICAgIH0KI2VuZGlmCiAg aWYoaW9jdGwoaXRmLT5zb2NrX2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIpID09IC0xKQogICAg ewogICAgICBwZXJyb3IoImlvY3RsIFNJT0NHSUZJTkRFWCBmYWlsZWQiKTsKICAgICAgcmV0 dXJuIC0xOwogICAgfQogIGl0Zi0+bG9jYWxfYWRkci5zbGxfaWZpbmRleCA9IGlmci5pZnJf aWZpbmRleDsKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVnKQogICAgewog ICAgICBmcHJpbnRmKHN0ZG91dCwgImlmIGluZGV4ICVkXG4iLCBpZnIuaWZyX2lmaW5kZXgp OwogICAgfQojZW5kaWYKCiAgLyogZ2V0IG93biBNQUMgYWRkcmVzcyAqLwojaWYgIWRlZmlu ZWQoTkRFQlVHKQogIGlmKGl0Zi0+ZGVidWcpCiAgICB7CiAgICAgIGZwcmludGYoc3Rkb3V0 LCAiaW9jdGwgU0lPQ0dJRkhXQUREUlxuIik7CiAgICB9CiNlbmRpZgogIGlmKGlvY3RsKGl0 Zi0+c29ja19mZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKQogICAgewogICAgICBwZXJy b3IoImlvY3RsIFNJT0NHSUZIV0FERFIgZmFpbGVkIik7CiAgICAgIHJldHVybiAtMTsKICAg IH0KICBpdGYtPmxvY2FsX2FkZHIuc2xsX2hhbGVuID0gRVRIX0FMRU47CiAgbWVtY3B5KCZp dGYtPmxvY2FsX2FkZHIuc2xsX2FkZHIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIEVUSF9B TEVOKTsKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVnKQogICAgewogICAg ICBmcHJpbnRmKHN0ZG91dCwgImlmIG1hYyBhZGRyICUwMng6JTAyeDolMDJ4OiUwMng6JTAy eDolMDJ4OlxuIiwgCiAgICAgICAgICAgICAgaXRmLT5sb2NhbF9hZGRyLnNsbF9hZGRyWzBd LCBpdGYtPmxvY2FsX2FkZHIuc2xsX2FkZHJbMV0sIAogICAgICAgICAgICAgIGl0Zi0+bG9j YWxfYWRkci5zbGxfYWRkclsyXSwgaXRmLT5sb2NhbF9hZGRyLnNsbF9hZGRyWzNdLAogICAg ICAgICAgICAgIGl0Zi0+bG9jYWxfYWRkci5zbGxfYWRkcls0XSwgaXRmLT5sb2NhbF9hZGRy LnNsbF9hZGRyWzVdKTsKICAgIH0KI2VuZGlmCgogIC8qIGJpbmQgdG8gZXRoICovCiNpZiAh ZGVmaW5lZChOREVCVUcpCiAgaWYoaXRmLT5kZWJ1ZykKICAgIHsKICAgICAgZnByaW50Zihz dGRvdXQsICJiaW5kXG4iKTsKICAgIH0KI2VuZGlmCiAgaWYoYmluZChpdGYtPnNvY2tfZmQs IChjb25zdCB2b2lkICopJml0Zi0+bG9jYWxfYWRkciwgc2l6ZW9mKGl0Zi0+bG9jYWxfYWRk cikpID09IC0xKQogICAgewogICAgICBwZXJyb3IoImJpbmQgZmFpbGVkIik7CiAgICAgIHJl dHVybiAtMTsKICAgIH0KCiAgLyogYW55IHBlbmRpbmcgZXJyb3JzLCBlLmcuLCBuZXR3b3Jr IGlzIGRvd24/ICovCiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRmLT5kZWJ1ZykKICAg IHsKICAgICAgZnByaW50ZihzdGRvdXQsICJnZXRzb2Nrb3B0IFNPX0VSUk9SXG4iKTsKICAg IH0KI2VuZGlmCiAgaWYoZ2V0c29ja29wdChpdGYtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNP X0VSUk9SLCAmZXJyLCAmZXJybGVuKSA9PSAtMSkKICAgIHsKICAgICAgcGVycm9yKCJnZXRz b2Nrb3B0IFNPX0VSUk9SIGZhaWxlZCIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgaWYo ZXJyID4gMCkKICAgIHsKICAgICAgZnByaW50ZihzdGRlcnIsICJuZXR3b3JrIGlzIGRvd24g P1xuIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgLyogc2V0IHJlbW90ZSBhZGRyICov CiAgaXRmLT5yZW1vdGVfYWRkciA9IGl0Zi0+bG9jYWxfYWRkcjsKICBpdGYtPnJlbW90ZV9h ZGRyLnNsbF9wcm90b2NvbCA9IGh0b25zKHNlbmRfcHJvdG9jb2wpOwogIG1lbWNweSgmaXRm LT5yZW1vdGVfYWRkci5zbGxfYWRkciwgYnJvYWRjYXN0X2FkZHIsIEVUSF9BTEVOKTsKCiAg LyogZ2V0IG93biBNVFUgKi8KI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVn KQogICAgewogICAgICBmcHJpbnRmKHN0ZG91dCwgImlvY3RsIFNJT0NHSUZNVFVcbiIpOwog ICAgfQojZW5kaWYKICBpZiAoaW9jdGwoaXRmLT5zb2NrX2ZkLCBTSU9DR0lGTVRVLCAmaWZy KSA8IDApCiAgICB7CiAgICAgIHBlcnJvcigiaW9jdGwgU0lPQ0dJRk1UVSBmYWlsZWQiKTsK ICAgICAgcmV0dXJuIC0xOwogICAgfQogIGl0Zi0+bXR1ID0gaWZyLmlmcl9tdHU7CiNpZiAh ZGVmaW5lZChOREVCVUcpCiAgaWYoaXRmLT5kZWJ1ZykKICAgIHsKICAgICAgZnByaW50Zihz dGRvdXQsICJNdHUgJWRcbiIsIGl0Zi0+bXR1KTsKICAgIH0KI2VuZGlmCgogIC8qIHByZXBh cmUgcGFja2V0IG1tYXBpbmcgKi8KICBjb25zdCBsb25nIHBhZ2VzaXplID0gc3lzY29uZihf U0NfUEFHRVNJWkUpOyAvKiBhc3N1bWUgNDA5NiAqLwogIGNvbnN0IHVuc2lnbmVkIG9yZGVy ID0gMTsKICBjb25zdCB1bnNpZ25lZCBmcmFtZV9zaXplID0gbmV4dF9wb3dlcl9vZl90d28o aXRmLT5tdHUgKyAxMjgpOyAvKiAxMjggaXMgYW4gYXJiaXRyYXJ5IHZhbHVlICovIAoKICAv KiB0cF9ibG9ja19zaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28gb2YgUEFHRV9TSVpFICov CiAgaXRmLT5yeF9wYWNrZXRfcmVxLnRwX2Jsb2NrX3NpemUgPSBwYWdlc2l6ZSA8PCBvcmRl cjsgCiAgLyogdHBfYmxvY2tfbnIgKi8KICBpdGYtPnJ4X3BhY2tldF9yZXEudHBfYmxvY2tf bnIgPSAxOwogIC8qIHRwX2ZyYW1lX3NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gVFBBQ0tF VDJfSERSTEVOIGFuZCBhIG11bHRpcGxlIAogICAqIG9mIFRQQUNLRVRfQUxJR05NRU5ULiBJ dCBzaG91bGQgYWxzbyBiZSBhIGRpdmlzb3Igb2YgdHBfYmxvY2tfc2l6ZSAqLwogIGl0Zi0+ cnhfcGFja2V0X3JlcS50cF9mcmFtZV9zaXplID0gZnJhbWVfc2l6ZTsKICAvKiB0cF9mcmFt ZV9uciAqLwogIGl0Zi0+cnhfcGFja2V0X3JlcS50cF9mcmFtZV9uciA9IChpdGYtPnJ4X3Bh Y2tldF9yZXEudHBfYmxvY2tfc2l6ZSAvIGl0Zi0+cnhfcGFja2V0X3JlcS50cF9mcmFtZV9z aXplKSAqIGl0Zi0+cnhfcGFja2V0X3JlcS50cF9ibG9ja19ucjsKCiAgLyogc2FuaXR5IGNo ZWNrcyAqLwogIGlmKGZyYW1lX3NpemUgPD0gVFBBQ0tFVDJfSERSTEVOKQogICAgewogICAg ICBmcHJpbnRmKHN0ZGVyciwgImZyYW1lX3NpemUgKCV1KSBtdXN0IGJlIGdyZWF0ZXIgdGhh biBUUEFDS0VUMl9IRFJMRU4gKCV1KVxuIiwgZnJhbWVfc2l6ZSwgVFBBQ0tFVDJfSERSTEVO KTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIGlmKChmcmFtZV9zaXplICUgVFBBQ0tFVF9B TElHTk1FTlQpICE9IDApCiAgICB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiZnJhbWVfc2l6 ZSAoJXUpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBUUEFDS0VUX0FMSUdOTUVOVCAoJXUpXG4i LCBmcmFtZV9zaXplLCBUUEFDS0VUX0FMSUdOTUVOVCk7CiAgICAgIHJldHVybiAtMTsKICAg IH0KICBpZigoaXRmLT5yeF9wYWNrZXRfcmVxLnRwX2Jsb2NrX3NpemUgJSBmcmFtZV9zaXpl KSAhPSAwKQogICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgImZyYW1lX3NpemUgKCV1KSBt dXN0IGJlIGEgZGl2aXNvciBvZiB0cF9ibG9ja19zaXplICgldSlcbiIsIGZyYW1lX3NpemUs IGl0Zi0+cnhfcGFja2V0X3JlcS50cF9ibG9ja19zaXplKTsKICAgICAgcmV0dXJuIC0xOwog ICAgfQoKICAvKiBzYW1lIHNldHRpbmdzIGZvciB0eCAqLwogIGl0Zi0+dHhfcGFja2V0X3Jl cSA9IGl0Zi0+cnhfcGFja2V0X3JlcTsKCiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRm LT5kZWJ1ZykKICAgIHsKICAgICAgZXRoZXJuZXRfZGVidWdfcGFja2V0X3JlcSgmaXRmLT5y eF9wYWNrZXRfcmVxLCAmaXRmLT50eF9wYWNrZXRfcmVxKTsKICAgIH0KI2VuZGlmCiAgCiAg Lyogc2V0IHBhcXVldCB2ZXJzaW9uIG9wdGlvbiAqLwogIGludCB2ZXJzaW9uID0gVFBBQ0tF VF9WMjsKICBpZihzZXRzb2Nrb3B0KGl0Zi0+c29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VU X1ZFUlNJT04sICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDwgMCkKICAgIHsKICAgICAg cGVycm9yKCJzZXRzb2Nrb3B0OiBQQUNLRVRfVkVSU0lPTiIpOwogICAgICByZXR1cm4gLTE7 CiAgICB9CgogIC8qIHNldCBSWCByaW5nIG9wdGlvbiAqLwogIGlmIChzZXRzb2Nrb3B0KGl0 Zi0+c29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX1JYX1JJTkcsICZpdGYtPnJ4X3BhY2tl dF9yZXEsIHNpemVvZihpdGYtPnJ4X3BhY2tldF9yZXEpKSA8IDApCiAgICB7CiAgICAgIHBl cnJvcigic2V0c29ja29wdDogUEFDS0VUX1JYX1JJTkciKTsKICAgICAgcmV0dXJuIC0xOwog ICAgfQogCiAgLyogc2V0IFRYIHJpbmcgb3B0aW9uKi8KICBpZiAoc2V0c29ja29wdChpdGYt PnNvY2tfZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9UWF9SSU5HLCAmaXRmLT50eF9wYWNrZXRf cmVxLCBzaXplb2YoaXRmLT50eF9wYWNrZXRfcmVxKSkgPCAwKQogICAgewogICAgICBwZXJy b3IoInNldHNvY2tvcHQ6IFBBQ0tFVF9UWF9SSU5HIik7CiAgICAgIHJldHVybiAtMTsKICAg IH0KCiAgLyogbWFwIHJ4ICsgdHggYnVmZmVyIHRvIHVzZXJzcGFjZSA6IHRoZXkgYXJlIGlu IHRoaXMgb3JkZXIgKi8KICBpdGYtPm1tYXBfc2l6ZSA9IAogICAgaXRmLT5yeF9wYWNrZXRf cmVxLnRwX2Jsb2NrX3NpemUgKiBpdGYtPnJ4X3BhY2tldF9yZXEudHBfYmxvY2tfbnIgKwog ICAgaXRmLT50eF9wYWNrZXRfcmVxLnRwX2Jsb2NrX3NpemUgKiBpdGYtPnR4X3BhY2tldF9y ZXEudHBfYmxvY2tfbnIgOwogIGl0Zi0+bW1hcF9iYXNlID0gbW1hcCgwLCBpdGYtPm1tYXBf c2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGl0Zi0+c29ja19mZCwg MCk7CiAgaWYgKGl0Zi0+bW1hcF9iYXNlID09ICh2b2lkKiktMSkKICAgIHsKICAgICAgcGVy cm9yKCJtbWFwIHJ4IGJ1ZmZlciBmYWlsZWQiKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoK ICAvKiBnZXQgcnggYW5kIHR4IGJ1ZmZlciBkZXNjcmlwdGlvbiAqLwogIGl0Zi0+cnhfYnVm ZmVyX3NpemUgPSBpdGYtPnJ4X3BhY2tldF9yZXEudHBfYmxvY2tfc2l6ZSAqIGl0Zi0+cnhf cGFja2V0X3JlcS50cF9ibG9ja19ucjsKICBpdGYtPnJ4X2J1ZmZlcl9hZGRyID0gaXRmLT5t bWFwX2Jhc2U7CiAgaXRmLT5yeF9idWZmZXJfaWR4ICA9IDA7CiAgaXRmLT5yeF9idWZmZXJf Y250ICA9IGl0Zi0+cnhfcGFja2V0X3JlcS50cF9ibG9ja19zaXplICogaXRmLT5yeF9wYWNr ZXRfcmVxLnRwX2Jsb2NrX25yIC8gaXRmLT5yeF9wYWNrZXRfcmVxLnRwX2ZyYW1lX3NpemU7 CgogIGl0Zi0+dHhfYnVmZmVyX3NpemUgPSBpdGYtPnR4X3BhY2tldF9yZXEudHBfYmxvY2tf c2l6ZSAqIGl0Zi0+dHhfcGFja2V0X3JlcS50cF9ibG9ja19ucjsKICBpdGYtPnR4X2J1ZmZl cl9hZGRyID0gaXRmLT5tbWFwX2Jhc2UgKyBpdGYtPnJ4X2J1ZmZlcl9zaXplOwogIGl0Zi0+ dHhfYnVmZmVyX2lkeCAgPSAwOwogIGl0Zi0+dHhfYnVmZmVyX2NudCAgPSBpdGYtPnR4X3Bh Y2tldF9yZXEudHBfYmxvY2tfc2l6ZSAqIGl0Zi0+dHhfcGFja2V0X3JlcS50cF9ibG9ja19u ciAvIGl0Zi0+dHhfcGFja2V0X3JlcS50cF9mcmFtZV9zaXplOwoKICAvKiAKICAgKiBQcmVj b21wdXRlIHBheWxvYWQgb2Zmc2V0IGFuZCBtYXggc2l6ZSAKICAgKiBXYXJuaW5nIDogdHgg YW5kIHJ4IGFyZSBhc3ltZXRyaWNzIAogICAqLwoKICAvKgogICAqIC0gb24gcnggd2UgZ2V0 IGRhdGEgYXQgdHBfbmV0IChTT0NLX0RHUkFNKSBhbmQgdHBfbWFjIGlmIHdlIG5lZWQgbWFj IAogICAqICAgaGVhZGVyIChTT0NLX1JBVykgCiAgICogICB0aGUgcnhfYnVmZmVyX3BheWxv YWRfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgdHBfbmV0IG9mIHRoZSBmcmFtZSAh CiAgICogICBGb3IgY29tcHV0aW5nIG1heCBzaXplIHdlIGNvbnNpZGVyIHRoZSB0cF9uZXQg dG8gYmUgOgogICAqICAgICBUUEFDS0VUMl9IRFJMRU4gKyAxNiArIHJlc2VydmUgICAoPTgw KQogICAqICAgb3IKICAgKiAgICAgVFBBQ0tFVDJfSERSTEVOICsgbWluKDE2LCBtYWNsZW4p ICsgcmVzZXJ2ZQogICAqICAgc2VlIHNyYy9saW51eC9uZXQvcGFja2V0L2FmX3BhY2tldC5j IHRwYWNrZXRfcmN2ICAKICAgKi8KICBpdGYtPnJ4X2J1ZmZlcl9wYXlsb2FkX29mZnNldCA9 IFRQQUNLRVRfQUxJR04oVFBBQ0tFVDJfSERSTEVOICsgTUlOKHNpemVvZihldGhlcl9oZWFk ZXJfdCksIDE2KSk7IC8vIG9ubHkgdXNlZCBoZXJlLCB1c2UgdHBfbmV0IGVsc2V3aGVyZQog IGl0Zi0+cnhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUgPSBpdGYtPnJ4X3BhY2tldF9yZXEu dHBfZnJhbWVfc2l6ZSAtIGl0Zi0+cnhfYnVmZmVyX3BheWxvYWRfb2Zmc2V0OwoKICAvKgog ICAqIC0gb24gdHggd2UgZmlsbCBkYXRhIGF0IAogICAqICAgICBUUEFDS0VUMl9IRFJMRU4g LSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKQogICAqICAgb3IKICAgKiAgICAgVFBBQ0tF VDJfSERSTEVOICsgbWluKDE2LCBtYWNsZW4pCiAgICogICBzZWUgc3JjL2xpbnV4L25ldC9w YWNrZXQvYWZfcGFja2V0LmMgdHBhY2tldF9maWxsX3NrYiAgCiAgICovCiNpZiBkZWZpbmVk KFBBVENIRURfUEFDS0VUKQogIGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfb2Zmc2V0ID0gVFBB Q0tFVF9BTElHTihUUEFDS0VUMl9IRFJMRU4gKyBNSU4oc2l6ZW9mKGV0aGVyX2hlYWRlcl90 KSwgMTYpKTsKI2Vsc2UgLyogZGVmaW5lZChQQVRDSEVEX1BBQ0tFVCkgKi8KICBpdGYtPnR4 X2J1ZmZlcl9wYXlsb2FkX29mZnNldCA9IChUUEFDS0VUMl9IRFJMRU4gLSBzaXplb2Yoc3Ry dWN0IHNvY2thZGRyX2xsKSk7CiNlbmRpZiAvKiBkZWZpbmVkKFBBVENIRURfUEFDS0VUKSAq LwogIGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUgPSBpdGYtPnR4X3BhY2tldF9y ZXEudHBfZnJhbWVfc2l6ZSAtIGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfb2Zmc2V0OwoKI2lm ICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVnKQogICAgewogICAgICBmcHJpbnRm KHN0ZG91dCwgInJ4X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplICV1XG4iLCAKICAgICAgICAg ICAgICBpdGYtPnJ4X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplKTsKICAgICAgZnByaW50Zihz dGRvdXQsICJ0eF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSAldVxuIiwgCiAgICAgICAgICAg ICAgaXRmLT50eF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSk7CiAgICB9CiNlbmRpZgoKI2lm IGRlZmluZWQoQ09PS0VEX1BBQ0tFVCkKICAvKiBmb3IgZWFjaCBwYWNrZXQgd2UgaW5pdGlh bGl6ZSB0aGUgZXRoZXJuZXQgaGVhZGVyICovCiAgZXRoZXJfaGVhZGVyX3QgZXRoZXJfaGVh ZGVyOwogIG1lbWNweShldGhlcl9oZWFkZXIuZGhvc3QsICZpdGYtPnJlbW90ZV9hZGRyLnNs bF9hZGRyLCBzaXplb2YoZXRoZXJfaGVhZGVyLmRob3N0KSk7CiAgbWVtY3B5KGV0aGVyX2hl YWRlci5zaG9zdCwgJml0Zi0+bG9jYWxfYWRkci5zbGxfYWRkciwgc2l6ZW9mKGV0aGVyX2hl YWRlci5zaG9zdCkpOwojaWYgZGVmaW5lZChQXzgwMjFRKQogIGV0aGVyX2hlYWRlci50cGlk ID0gaHRvbnMoRV84MDIxUV9UUElEKTsKICBldGhlcl9oZWFkZXIudGNpICA9IGh0b25zKEVf ODAyMVFfVENJKTsKI2VuZGlmIC8qIGRlZmluZWQoUF84MDIxUSkgKi8KICBldGhlcl9oZWFk ZXIudHlwZSA9IGh0b25zKHNlbmRfcHJvdG9jb2wpOwogIGZvcih1bnNpZ25lZCBpID0gMDsg aSA8IGl0Zi0+dHhfYnVmZmVyX2NudDsgaSsrKQogICAgewogICAgICB2b2lkICogYmFzZSA9 IGl0Zi0+dHhfYnVmZmVyX2FkZHIgKyBpICogaXRmLT50eF9wYWNrZXRfcmVxLnRwX2ZyYW1l X3NpemU7CiAgICAgIG1lbWNweShiYXNlICsgaXRmLT50eF9idWZmZXJfcGF5bG9hZF9vZmZz ZXQgLSBzaXplb2YoZXRoZXJfaGVhZGVyX3QpLCAmZXRoZXJfaGVhZGVyLCBzaXplb2YoZXRo ZXJfaGVhZGVyX3QpKTsKICAgIH0KICAKICAvKiBvdmVycmlkZSB0aGUgc2V0dGluZyBvZiB0 aGUgdHggZGF0YSBvZmZzZXQgYW5kIHNpemUgKi8KCiAgLyogYXBwbHkgdGhlIGRpZmZzICov CiAgaXRmLT5yeF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSAtPSBzaXplb2YoZXRoZXJfaGVh ZGVyKTsKICBpdGYtPnR4X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplIC09IHNpemVvZihldGhl cl9oZWFkZXIpOwoKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVnKQogICAg ewogICAgICBmcHJpbnRmKHN0ZG91dCwgInJ4X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplICV1 XG4iLCAKICAgICAgICAgICAgICBpdGYtPnJ4X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplKTsK ICAgICAgZnByaW50ZihzdGRvdXQsICJ0eF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSAldVxu IiwgCiAgICAgICAgICAgICAgaXRmLT50eF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSk7CiAg ICB9CiNlbmRpZgoKI2VuZGlmIC8qIGRlZmluZWQoQ09PS0VEX1BBQ0tFVCkgKi8KCiAgLyog dGhyZXNob2xkIHBheWxvYWQgbWF4IHNpemUgYWNjb3JkaW5nIHRvIHRoZSBtdHUgKi8KICBp ZihpdGYtPm10dSA8IGl0Zi0+cnhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUpCiAgICB7CiAg ICAgIGl0Zi0+cnhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUgPSBpdGYtPm10dTsKICAgIH0K ICBpZihpdGYtPm10dSA8IGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUpCiAgICB7 CiAgICAgIGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUgPSBpdGYtPm10dTsKICAg IH0KCiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRmLT5kZWJ1ZykKICAgIHsKICAgICAg ZnByaW50ZihzdGRvdXQsICJyeF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSAldVxuIiwgaXRm LT5yeF9idWZmZXJfcGF5bG9hZF9tYXhfc2l6ZSk7CiAgICAgIGZwcmludGYoc3Rkb3V0LCAi dHhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUgJXVcbiIsIGl0Zi0+dHhfYnVmZmVyX3BheWxv YWRfbWF4X3NpemUpOwogICAgfQojZW5kaWYKCiAgLyogc2V0dXAgcG9sbCBmZCAqLwoKICBp dGYtPnBvbGxmZFswXS5mZCAgICAgID0gaXRmLT50aW1lcl9mZDsKICBpdGYtPnBvbGxmZFsw XS5ldmVudHMgID0gUE9MTElOOwogIGl0Zi0+cG9sbGZkWzBdLnJldmVudHMgPSAwOwoKICBp dGYtPnBvbGxmZFsxXS5mZCAgICAgID0gaXRmLT5zb2NrX2ZkOwogIGl0Zi0+cG9sbGZkWzFd LmV2ZW50cyAgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMRVJSOwogIGl0Zi0+cG9sbGZkWzFd LnJldmVudHMgPSAwOwoKICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBldGhlcm5ldF9jbG9zZShldGhlcm5l dF90ICogaXRmKQp7CiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYpOwoK ICAvKiAqLwogIGlmKGl0Zi0+bW1hcF9iYXNlICE9ICh2b2lkICopLTEpCiAgICB7CiAgICAg IG11bm1hcChpdGYtPm1tYXBfYmFzZSwgaXRmLT5tbWFwX3NpemUpOwogICAgICBpdGYtPm1t YXBfYmFzZSA9ICh2b2lkICopLTE7CiAgICAgIGl0Zi0+bW1hcF9zaXplID0gMDsKICAgIH0K CiAgLyogY2xvc2Ugc29ja2V0ICovCiAgaWYoMCA8PSBpdGYtPnNvY2tfZmQpCiAgICB7CiNp ZiAhZGVmaW5lZChOREVCVUcpCiAgICAgIGlmKGl0Zi0+ZGVidWcpCiAgICAgICAgewogICAg ICAgICAgZnByaW50ZihzdGRvdXQsICJjbG9zZVxuIik7CiAgICAgICAgfQojZW5kaWYKICAg ICAgY2xvc2UoaXRmLT5zb2NrX2ZkKTsKICAgICAgaXRmLT5zb2NrX2ZkID0gLTE7CiAgICB9 CgogIC8qIGNsb3NlIHRpbWVyICovCiAgaWYoMCA8PSBpdGYtPnRpbWVyX2ZkKQogICAgewog ICAgICBjbG9zZShpdGYtPnRpbWVyX2ZkKTsKICAgICAgaXRmLT50aW1lcl9mZCA9IC0xOwog ICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBldGhlcm5ldF9wdXJnZShldGhl cm5ldF90ICogaXRmKQp7CiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYp OwoKICAvKiBnZXQgYmFzZSBhZHJlc3Mgb2YgdGhlIGN1cnJlbnQgcnggZnJhbWUgKi8KICB2 b2lkICogYmFzZSA9IGl0Zi0+cnhfYnVmZmVyX2FkZHIgKyBpdGYtPnJ4X2J1ZmZlcl9pZHgg KiBpdGYtPnJ4X3BhY2tldF9yZXEudHBfZnJhbWVfc2l6ZTsKICB2b2xhdGlsZSBzdHJ1Y3Qg dHBhY2tldDJfaGRyICogaGVhZGVyID0gKHN0cnVjdCB0cGFja2V0Ml9oZHIgKiliYXNlOwog IHdoaWxlKGhlYWRlci0+dHBfc3RhdHVzICE9IFRQX1NUQVRVU19LRVJORUwpCiAgICB7CiAg ICAgIC8qIGxvYWQgdGhlIG5leHQgcnggZnJhbWUgaW5kZXggKi8KICAgICAgaWYoaXRmLT5y eF9idWZmZXJfaWR4IDwgKGl0Zi0+cnhfYnVmZmVyX2NudCAtIDEpKQogICAgICAgIHsKICAg ICAgICAgIGl0Zi0+cnhfYnVmZmVyX2lkeCArKzsKICAgICAgICB9CiAgICAgIGVsc2UKICAg ICAgICB7CiAgICAgICAgICBpdGYtPnJ4X2J1ZmZlcl9pZHggPSAwOwogICAgICAgIH0KCiAg ICAgIC8qIGNsZWFyIHRoZSBzdGF0dXMgKi8KICAgICAgaGVhZGVyLT50cF9zdGF0dXMgPSBU UF9TVEFUVVNfS0VSTkVMOwoKICAgICAgLyogZ2V0IGJhc2UgYWRyZXNzIG9mIHRoZSBjdXJy ZW50IHJ4IGZyYW1lICovCiAgICAgIGJhc2UgPSBpdGYtPnJ4X2J1ZmZlcl9hZGRyICsgaXRm LT5yeF9idWZmZXJfaWR4ICogaXRmLT5yeF9wYWNrZXRfcmVxLnRwX2ZyYW1lX3NpemU7CiAg ICAgIGhlYWRlciA9IChzdHJ1Y3QgdHBhY2tldDJfaGRyICopYmFzZTsKICAgIH0KfQoKLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCmludCBldGhlcm5ldF9yeF9yZXF1ZXN0KGV0aGVybmV0X3Qg KiBpdGYsIGV0aGVybmV0X21zZ190ICogbXNnKQp7CiAgLyogY2hlY2sgcGFyYW1ldGVycyAq LwogIGFzc2VydChpdGYgJiYgbXNnKTsKCiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRm LT5kZWJ1ZykKICAgIHsKICAgICAgZnByaW50ZihzdGRvdXQsICJldGhlcm5ldF9yeF9yZXF1 ZXN0XG4iKTsKICAgIH0KI2VuZGlmCgogIGlmKG1zZy0+ZGF0YSB8fCBtc2ctPmRhdGFfbGVu KQogICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIlJ4IHJlcXVlc3QgaGF2ZSB0byBiZSBy ZWxlYXNlZCBiZWZvcmUgcmVxdWVzdGVkLlxuIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0K IAogIC8qIGdldCBiYXNlIGFkcmVzcyBvZiB0aGUgY3VycmVudCByeCBmcmFtZSAqLwogIHZv aWQgKiBiYXNlID0gaXRmLT5yeF9idWZmZXJfYWRkciArIGl0Zi0+cnhfYnVmZmVyX2lkeCAq IGl0Zi0+cnhfcGFja2V0X3JlcS50cF9mcmFtZV9zaXplOwogIHZvbGF0aWxlIHN0cnVjdCB0 cGFja2V0Ml9oZHIgKiBoZWFkZXIgPSAoc3RydWN0IHRwYWNrZXQyX2hkciAqKWJhc2U7Cgog IC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gcG9sbCAqLwogIGlmKGhlYWRlci0+dHBfc3RhdHVz ID09IFRQX1NUQVRVU19LRVJORUwpCiAgICB7CiAgICAgIGludCBlcnI7CgogICAgICAvKiBz ZXR1cCByZWFkIHRpbWVvdXQgKi8KICAgICAgc3RydWN0IGl0aW1lcnNwZWMgdG8gPSB7ezAs MH0sIG1zZy0+dG99OwogICAgICBpbnQgZmxhZ3MgPSAobXNnLT50b19pc19yZWxhdGl2ZSk/ MDpURkRfVElNRVJfQUJTVElNRTsKICAgICAgZXJyID0gdGltZXJmZF9zZXR0aW1lKGl0Zi0+ dGltZXJfZmQsIGZsYWdzLCAmdG8sIE5VTEwpOwogICAgICBpZihlcnIgPCAwKQogICAgICAg IHsKICAgICAgICAgIHBlcnJvcigidGltZXJmZF9zZXR0aW1lIGZhaWxlZCIpOwogICAgICAg ICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAKICAgICAgLyogcG9sbCBpbnB1dCAqLwog ICAgICBpdGYtPnBvbGxmZFswXS5yZXZlbnRzID0gMDsKICAgICAgaXRmLT5wb2xsZmRbMV0u cmV2ZW50cyA9IDA7CiAgICAgIGVyciA9IHBwb2xsKGl0Zi0+cG9sbGZkLCAyLCBOVUxMLCBO VUxMKTsKICAgICAgaWYoZXJyIDwgMCkKICAgICAgICB7CiAgICAgICAgICBwZXJyb3IoInBw b2xsIGZhaWxlZCIpOwogICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXZlbnRzID0gJWhk ICVoZFxuIiwgaXRmLT5wb2xsZmRbMF0ucmV2ZW50cywgaXRmLT5wb2xsZmRbMV0ucmV2ZW50 cyk7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQojaWYgIWRlZmluZWQoTkRFQlVH KQogICAgICBlbHNlIGlmKGVyciA9PSAwKQogICAgICAgIHsKICAgICAgICAgIGZwcmludGYo c3RkZXJyLCAicHBvbGwgdGltZW91dCB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgIHJldHVy biAtMTsKICAgICAgICB9CiNlbmRpZgogICAgICBlbHNlIGlmKGl0Zi0+cG9sbGZkWzBdLnJl dmVudHMgPT0gUE9MTElOKQogICAgICAgIHsKI2lmICFkZWZpbmVkKE5ERUJVRykKICAgICAg ICAgIGlmKGl0Zi0+ZGVidWcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmcHJpbnRm KHN0ZG91dCwgInRpbWVyZmQgdGltZW91dFxuIik7CiAgICAgICAgICAgIH0KI2VuZGlmCiAg ICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZiAhZGVmaW5lZChOREVCVUcpCiAgICAg IGVsc2UgaWYoIWl0Zi0+cG9sbGZkWzFdLnJldmVudHMpCiAgICAgICAgewogICAgICAgICAg ZnByaW50ZihzdGRlcnIsICJldmVudCBvbiBzb2NrZXQgYXhwZWN0ZWRcbiIpOwogICAgICAg ICAgcmV0dXJuIC0xOwogICAgICAgIH0KI2VuZGlmCiAgICAgIGVsc2UgaWYoaXRmLT5wb2xs ZmRbMV0ucmV2ZW50cyAmIFBPTExFUlIpCiAgICAgICAgewogICAgICAgICAgZnByaW50Zihz dGRlcnIsICJlcnJvciBvbiBzb2NrZXQgcG9sbFxuIik7CiAgICAgICAgICByZXR1cm4gLTE7 CiAgICAgICAgfQogICAgfQoKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVn KQogICAgewogICAgICBldGhlcm5ldF9kZWJ1Z19mcmFtZShiYXNlKTsKICAgIH0KI2VuZGlm CgogIC8qIHNvLCBoZXJlIHdlIGhhdmUgYSBmcmFtZSByZWFkeSB0byBwcm9jZXNzICovCgog IC8qIGxvYWQgdGhlIG5leHQgcnggZnJhbWUgaW5kZXggKi8KICBpZihpdGYtPnJ4X2J1ZmZl cl9pZHggPCAoaXRmLT5yeF9idWZmZXJfY250IC0gMSkpCiAgICB7CiAgICAgIGl0Zi0+cnhf YnVmZmVyX2lkeCArKzsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGl0Zi0+cnhfYnVmZmVy X2lkeCA9IDA7CiAgICB9CgogIC8qIGlmIHRoZSBmcmFtZSBpcyBnb29kIGZvciByZWFkaW5n ICovCiAgaWYoKGhlYWRlci0+dHBfc3RhdHVzID09IFRQX1NUQVRVU19VU0VSKSAmJiBoZWFk ZXItPnRwX3NuYXBsZW4pCiAgICB7CiAgICAgIC8qIGdpdmUgdG8gdGhlIGNhbGxlciB0aGUg cGF5bG9hZCBhZHJlc3MgYW5kIHNpemUgKi8KICAgICAgbXNnLT5kYXRhID0gYmFzZSArIGhl YWRlci0+dHBfbmV0OwogICAgICBtc2ctPmRhdGFfbGVuID0gaGVhZGVyLT50cF9zbmFwbGVu OyAKI2lmIGRlZmluZWQoQ09PS0VEX1BBQ0tFVCkgLy8gaG9wZSB0aGF0IGhlYWRlci0+dHBf bmV0IC0gc2l6ZW9mKGV0aGVyX2hlYWRlcl90KSA9PSBoZWFkZXItPnRwX21hYwogICAgICBh c3NlcnQoKGhlYWRlci0+dHBfbmV0IC0gc2l6ZW9mKGV0aGVyX2hlYWRlcl90KSkgPT0gaGVh ZGVyLT50cF9tYWMpOwogICAgICBtc2ctPmRhdGFfbGVuIC09IHNpemVvZihldGhlcl9oZWFk ZXJfdCk7CiNlbmRpZgogICAgICByZXR1cm4gMDsKICAgIH0KICBlbHNlCiAgICB7CiAgICAg IGZwcmludGYoc3RkZXJyLCAiY2FwdHVyZSBmYWlsZWQgOiByZXZlbnRzICV4LCBzdGF0dXMg JWQsIHNuYXBfbGVuICVkXG4iLCBpdGYtPnBvbGxmZFsxXS5yZXZlbnRzLCBoZWFkZXItPnRw X3N0YXR1cywgaGVhZGVyLT50cF9zbmFwbGVuKTsKICAgICAgaGVhZGVyLT50cF9zdGF0dXMg PSBUUF9TVEFUVVNfS0VSTkVMOwogICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLwppbnQgZXRoZXJuZXRfcnhfcmVsZWFzZShldGhlcm5ldF90ICogaXRm LCBldGhlcm5ldF9tc2dfdCAqIG1zZykKewogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBh c3NlcnQoaXRmICYmIG1zZyk7CgojaWYgIWRlZmluZWQoTkRFQlVHKQogIGlmKGl0Zi0+ZGVi dWcpCiAgICB7CiAgICAgIGZwcmludGYoc3Rkb3V0LCAiZXRoZXJuZXRfcnhfcmVsZWFzZVxu Iik7CiAgICB9CiNlbmRpZgoKICBpZighbXNnLT5kYXRhIHx8ICFtc2ctPmRhdGFfbGVuKQog ICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIlJ4IHJlcXVlc3QgaGF2ZSB0byBiZSByZXF1 ZXN0ZWQgYmVmb3JlIHJlbGVhc2UuXG4iKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAv KiBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZnJhbWUgYXNzb2NpYXRlZCB0byB0aGlzIGRhdGEg cG9pbnRlciAqLwogIGludCBpID0gKG1zZy0+ZGF0YSAtIGl0Zi0+cnhfYnVmZmVyX2FkZHIp IC8gaXRmLT5yeF9wYWNrZXRfcmVxLnRwX2ZyYW1lX3NpemU7CiAgaWYoKDAgPD0gaSkgJiYg ICgodW5zaWduZWQpaSA8IGl0Zi0+cnhfYnVmZmVyX2NudCkpCiAgICB7CiAgICAgIHZvaWQg KiBiYXNlID0gaXRmLT5yeF9idWZmZXJfYWRkciArIGkgKiBpdGYtPnJ4X3BhY2tldF9yZXEu dHBfZnJhbWVfc2l6ZTsKICAgICAgdm9sYXRpbGUgc3RydWN0IHRwYWNrZXQyX2hkciAqIGhl YWRlciA9IChzdHJ1Y3QgdHBhY2tldDJfaGRyICopYmFzZTsKICAgICAgaGVhZGVyLT50cF9z dGF0dXMgPSBUUF9TVEFUVVNfS0VSTkVMOwogICAgICBtc2ctPmRhdGEgPSAwOwogICAgICBt c2ctPmRhdGFfbGVuID0gMDsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgZWxzZQogICAgewog ICAgICBmcHJpbnRmKHN0ZGVyciwgIlJ4IHJlbGVhc2UgYWRkciBvdXQgb2YgcmFuZ2UgKCVw KS5cbiIsIG1zZy0+ZGF0YSk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCmludCBldGhlcm5ldF90eF9yZXF1ZXN0KGV0aGVybmV0X3QgKiBpdGYs IGV0aGVybmV0X21zZ190ICogbXNnKQp7CiNpZiAhZGVmaW5lZChOREVCVUcpCiAgaWYoaXRm LT5kZWJ1ZykKICAgIHsKICAgICAgZnByaW50ZihzdGRvdXQsICJldGhlcm5ldF90eF9yZXF1 ZXN0XG4iKTsKICAgIH0KI2VuZGlmCgogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBhc3Nl cnQoaXRmICYmIG1zZyk7CgogIGlmKG1zZy0+ZGF0YSB8fCBtc2ctPmRhdGFfbGVuKQogICAg ewogICAgICBmcHJpbnRmKHN0ZGVyciwgIlR4IHJlcXVlc3QgaGF2ZSB0byBiZSByZWxlYXNl ZCBiZWZvcmUgcmVxdWVzdGVkLlxuIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KIAogIC8q IGdldCBiYXNlIGFkcmVzcyBvZiB0aGUgY3VycmVudCB0eCBmcmFtZSAqLwogIHZvaWQgKiBi YXNlOwogIHZvbGF0aWxlIHN0cnVjdCB0cGFja2V0Ml9oZHIgKiBoZWFkZXI7CiAgZG8KICAg IHsKICAgICAgLyogZ2V0IGJhc2UgYWRyZXNzIG9mIHRoZSBjdXJyZW50IHR4IGZyYW1lICov CiAgICAgIGJhc2UgPSBpdGYtPnR4X2J1ZmZlcl9hZGRyICsgaXRmLT50eF9idWZmZXJfaWR4 ICogaXRmLT50eF9wYWNrZXRfcmVxLnRwX2ZyYW1lX3NpemU7CiAgICAgIGhlYWRlciA9IChz dHJ1Y3QgdHBhY2tldDJfaGRyICopYmFzZTsKCiAgICAgIC8qIGxvYWQgdGhlIG5leHQgdHgg ZnJhbWUgaW5kZXggKi8KICAgICAgaWYoaXRmLT50eF9idWZmZXJfaWR4IDwgKGl0Zi0+dHhf YnVmZmVyX2NudCAtIDEpKQogICAgICAgIHsKICAgICAgICAgIGl0Zi0+dHhfYnVmZmVyX2lk eCArKzsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBpdGYtPnR4 X2J1ZmZlcl9pZHggPSAwOwogICAgICAgIH0KCiAgICB9IHdoaWxlKGhlYWRlci0+dHBfc3Rh dHVzICE9IFRQX1NUQVRVU19BVkFJTEFCTEUpOwoKICAvKiBnaXZlIHRvIHRoZSBjYWxsZXIg dGhlIHBheWxvYWQgYWRyZXNzIGFuZCBzaXplICovCiAgbXNnLT5kYXRhID0gYmFzZSArIGl0 Zi0+dHhfYnVmZmVyX3BheWxvYWRfb2Zmc2V0OwogIG1zZy0+ZGF0YV9sZW4gPSBpdGYtPnR4 X2J1ZmZlcl9wYXlsb2FkX21heF9zaXplOwoKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihp dGYtPmRlYnVnKQogICAgewogICAgICBldGhlcm5ldF9kZWJ1Z19mcmFtZShiYXNlKTsKICAg IH0KI2VuZGlmCgogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGV0 aGVybmV0X3R4X3JlbGVhc2UoZXRoZXJuZXRfdCAqIGl0ZiwgZXRoZXJuZXRfbXNnX3QgKiBt c2cpCnsKI2lmICFkZWZpbmVkKE5ERUJVRykKICBpZihpdGYtPmRlYnVnKQogICAgewogICAg ICBmcHJpbnRmKHN0ZG91dCwgImV0aGVybmV0X3R4X3JlbGVhc2VcbiIpOwogICAgfQojZW5k aWYKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYgJiYgbXNnKTsKCiAg aWYoIW1zZy0+ZGF0YSB8fCAhbXNnLT5kYXRhX2xlbikKICAgIHsKICAgICAgZnByaW50Zihz dGRlcnIsICJUeCByZXF1ZXN0IGhhdmUgdG8gYmUgcmVxdWVzdGVkIGJlZm9yZSByZWxlYXNl ZC5cbiIpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogIGlmKGl0Zi0+dHhfYnVmZmVyX3Bh eWxvYWRfbWF4X3NpemUgPCBtc2ctPmRhdGFfbGVuKQogICAgewogICAgICBmcHJpbnRmKHN0 ZGVyciwgIlR4IHJlcXVlc3QgY2FuIGJlIGdyZWF0ZXIgdGhhbiAlZCBieXRlcyAocmVxdWVz dGVkICVkKS5cbiIsIGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfbWF4X3NpemUsIG1zZy0+ZGF0 YV9sZW4pOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAKICAvKiBldGhlcm5ldCBwYXlsb2Fk IGFyZSBhdCBsZWFzdCA0NiBieXRlcyAqLwogIGlmKG1zZy0+ZGF0YV9sZW4gPCA0NikKICAg IHsKICAgICAgbWVtc2V0KG1zZy0+ZGF0YSArIG1zZy0+ZGF0YV9sZW4sIDAsIDQ2IC0gbXNn LT5kYXRhX2xlbik7CiAgICAgIG1zZy0+ZGF0YV9sZW4gPSA0NjsKICAgIH0KCiAgLyogZmlu ZCB0aGUgaW5kZXggb2YgdGhlIGZyYW1lIGFzc29jaWF0ZWQgdG8gdGhpcyBkYXRhIHBvaW50 ZXIgKi8KICBpbnQgaSA9IChtc2ctPmRhdGEgLSBpdGYtPnR4X2J1ZmZlcl9hZGRyKSAvIGl0 Zi0+dHhfcGFja2V0X3JlcS50cF9mcmFtZV9zaXplOwogIGlmKChpIDwgMCkgfHwgKGl0Zi0+ dHhfYnVmZmVyX2NudCA8PSAodW5zaWduZWQpaSkpCiAgICB7CiAgICAgIGZwcmludGYoc3Rk ZXJyLCAiVHggcmVsZWFzZSBhZGRyIG91dCBvZiByYW5nZSAoJXApLlxuIiwgbXNnLT5kYXRh KTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAvKiBnZXQgYmFzZSBhZHJlc3Mgb2YgdGhp cyB0eCBmcmFtZSAqLwogIHZvaWQgKiBiYXNlID0gaXRmLT50eF9idWZmZXJfYWRkciArIGkg KiBpdGYtPnR4X3BhY2tldF9yZXEudHBfZnJhbWVfc2l6ZTsKICB2b2xhdGlsZSBzdHJ1Y3Qg dHBhY2tldDJfaGRyICogaGVhZGVyID0gKHN0cnVjdCB0cGFja2V0Ml9oZHIgKiliYXNlOwoK I2lmIGRlZmluZWQoUEFUQ0hFRF9QQUNLRVQpCiAgLyogdXBkYXRlIHBhY2tldCBvZmZzZXQg Ki8KICBoZWFkZXItPnRwX25ldCA9IGl0Zi0+dHhfYnVmZmVyX3BheWxvYWRfb2Zmc2V0Owoj ZW5kaWYgLyogZGVmaW5lZChQQVRDSEVEX1BBQ0tFVCkgKi8KICAvKiB1cGRhdGUgcGFja2V0 IGxlbiAqLwogIGhlYWRlci0+dHBfbGVuID0gbXNnLT5kYXRhX2xlbjsKI2lmIGRlZmluZWQo Q09PS0VEX1BBQ0tFVCkKICBoZWFkZXItPnRwX2xlbiArPSBzaXplb2YoZXRoZXJfaGVhZGVy X3QpOwojZW5kaWYKICAvKiBzZXQgaGVhZGVyIGZsYWcgdG8gVVNFUiAodHJpZ3MgeG1pdCkq LwogIGhlYWRlci0+dHBfc3RhdHVzID0gVFBfU1RBVFVTX1NFTkRfUkVRVUVTVDsKCiAgLyog YXNrIHRoZSBrZXJuZWwgdG8gc2VuZCBkYXRhICovCiAgc3NpemVfdCBlcnI7CiAgZXJyID0g c2VuZHRvKGl0Zi0+c29ja19mZCwgTlVMTCwgMCwgMCwgKGNvbnN0IHN0cnVjdCBzb2NrYWRk ciAqKSZpdGYtPnJlbW90ZV9hZGRyLCBzaXplb2YoaXRmLT5yZW1vdGVfYWRkcikpOwogIGlm KGVyciA8IDApIAogICAgewogICAgICBwZXJyb3IoInNlbmR0byBmYWlsZWQiKTsKICAgICAg ZnByaW50ZihzdGRlcnIsICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CiAgICAgIHJldHVybiAt MTsKICAgIH0KICBlbHNlIGlmKGVyciA9PSAwICkgCiAgICB7CiAgICAgIC8qIG5vdGhpbmcg dG8gZG8gKi8KICAgICAgZnByaW50ZihzdGRlcnIsICJLZXJuZWwgaGF2ZSBub3RoaW5nIHRv IHNlbmQuXG4iKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAvKiByZXNldCB0aGUgdHBf bGVuIDogb3B0aW9uYWwgKi8KICBoZWFkZXItPnRwX2xlbiA9IDA7CgogIC8qIHJlbGVhc2Ug dGhlIGJ1ZmZlciAqLwogIG1zZy0+ZGF0YSA9IDA7CiAgbXNnLT5kYXRhX2xlbiA9IDA7Cgog IHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBlcm1ldCBkZSBm aXhlciBsZSBtb2RlIGRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgZXRoZXJuZXRfc2V0 X2RlYnVnKGV0aGVybmV0X3QgKiBpdGYsIGludCBkZWJ1ZykKewojaWYgIWRlZmluZWQoTkRF QlVHKQogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBhc3NlcnQoaXRmKTsKIAogIGludCBv bGRfZGVidWcgPSBpdGYtPmRlYnVnOwoKICBpdGYtPmRlYnVnID0gZGVidWc7CiAKICByZXR1 cm4gb2xkX2RlYnVnOwojZWxzZQogIHJldHVybiAwOwojZW5kaWYKfQoKLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogKiBQZXJtZXQgZGUgcmVjdXBlcmVyIGwnYWRyZXNzZSBtYWMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8Kdm9pZCBldGhlcm5ldF9maWxsX3dpdGhfbWFjX2FkZHIoZXRoZXJuZXRf dCAqIGl0ZiwgdWludDhfdCAqIGFkZHIsIHVuc2lnbmVkIGFkZHJfbGVuKQp7CiAgLyogY2hl Y2sgcGFyYW1ldGVycyAqLwogIGFzc2VydChpdGYgJiYgYWRkcik7CiAKICB1bnNpZ25lZCBp OwogIGZvcihpID0gMDsgKGkgPCBpdGYtPmxvY2FsX2FkZHIuc2xsX2hhbGVuKSAgJiYgKGkg PCBhZGRyX2xlbik7IGkrKykKICAgIHsKICAgICAgYWRkcltpXSA9IGl0Zi0+bG9jYWxfYWRk ci5zbGxfYWRkcltpXTsKICAgIH0KICBmb3IoOyBpIDwgYWRkcl9sZW47IGkrKykKICAgIHsK ICAgICAgYWRkcltpXSA9IDA7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KI2lmICFkZWZpbmVkKE5ERUJVRykKc3RhdGljIHZv aWQgZXRoZXJuZXRfZGVidWdfZnJhbWUoY29uc3Qgdm9pZCAqIGJhc2UpCnsKICBmcHJpbnRm KHN0ZG91dCwgImJ1ZmZlciBiYXNlIGFkZHIgJXBcbiIsIGJhc2UpOwoKICBjb25zdCBzdHJ1 Y3QgdHBhY2tldDJfaGRyICogaGVhZGVyID0gKGNvbnN0IHN0cnVjdCB0cGFja2V0Ml9oZHIg KiliYXNlOwogIGZwcmludGYoc3Rkb3V0LCAidHBhY2tldDJfaGVhZGVyIDpcbiIpOwogIGZw cmludGYoc3Rkb3V0LCAiIHRwX3N0YXR1cyAgIDogMHglMDJ4XG4iLCBoZWFkZXItPnRwX3N0 YXR1cyk7CiAgZnByaW50ZihzdGRvdXQsICIgdHBfbGVuICAgICAgOiAlZFxuIiwgaGVhZGVy LT50cF9sZW4pOwogIGZwcmludGYoc3Rkb3V0LCAiIHRwX3NuYXBsZW4gIDogJWRcbiIsIGhl YWRlci0+dHBfc25hcGxlbik7CiAgZnByaW50ZihzdGRvdXQsICIgdHBfbWFjICAgICAgOiAl ZFxuIiwgaGVhZGVyLT50cF9tYWMpOwogIGZwcmludGYoc3Rkb3V0LCAiIHRwX25ldCAgICAg IDogJWRcbiIsIGhlYWRlci0+dHBfbmV0KTsKICBmcHJpbnRmKHN0ZG91dCwgIiB0cF9zZWMg ICAgICA6ICVkXG4iLCBoZWFkZXItPnRwX3NlYyk7CiAgZnByaW50ZihzdGRvdXQsICIgdHBf bnNlYyAgICAgOiAlZFxuIiwgaGVhZGVyLT50cF9uc2VjKTsKICBmcHJpbnRmKHN0ZG91dCwg IiB0cF92bGFuX3RjaSA6IDB4JTA0eFxuIiwgaGVhZGVyLT50cF92bGFuX3RjaSk7CgogIGNv bnN0IHN0cnVjdCBzb2NrYWRkcl9sbCAqIHNsbCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJf bGwgKikoYmFzZSArIFRQQUNLRVRfQUxJR04oc2l6ZW9mKHN0cnVjdCB0cGFja2V0Ml9oZHIp KSk7CiAgZnByaW50ZihzdGRvdXQsICJzb2NrYWRkcl9sbCA6XG4iKTsKICBmcHJpbnRmKHN0 ZG91dCwgIiBzbGxfZmFtaWx5ICAgOiAweCUwMnhcbiIsIHNsbC0+c2xsX2ZhbWlseSk7CiAg ZnByaW50ZihzdGRvdXQsICIgc2xsX3Byb3RvY29sIDogMHglMDR4XG4iLCBzbGwtPnNsbF9w cm90b2NvbCk7CiAgZnByaW50ZihzdGRvdXQsICIgc2xsX2lmaW5kZXggIDogJWRcbiIsIHNs bC0+c2xsX2lmaW5kZXgpOwogIGZwcmludGYoc3Rkb3V0LCAiIHNsbF9oYXR5cGUgICA6ICVk XG4iLCBzbGwtPnNsbF9oYXR5cGUpOwogIGZwcmludGYoc3Rkb3V0LCAiIHNsbF9wa3R0eXBl ICA6ICVkXG4iLCBzbGwtPnNsbF9wa3R0eXBlKTsKICBmcHJpbnRmKHN0ZG91dCwgIiBzbGxf aGFsZW4gICAgOiAlZFxuIiwgc2xsLT5zbGxfaGFsZW4pOwogIGZwcmludGYoc3Rkb3V0LCAi IHNsbF9hZGRyWzhdICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OlxuIiwgCiAg ICAgICAgICBzbGwtPnNsbF9hZGRyWzBdLCBzbGwtPnNsbF9hZGRyWzFdLCBzbGwtPnNsbF9h ZGRyWzJdLAogICAgICAgICAgc2xsLT5zbGxfYWRkclszXSwgc2xsLT5zbGxfYWRkcls0XSwg c2xsLT5zbGxfYWRkcls1XSk7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgog KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCiNpZiAhZGVmaW5lZChOREVCVUcpCnN0YXRpYyB2 b2lkIGV0aGVybmV0X2RlYnVnX3BhY2tldF9yZXEoY29uc3Qgc3RydWN0IHRwYWNrZXRfcmVx ICogcnhfcGFja2V0X3JlcSwgY29uc3Qgc3RydWN0IHRwYWNrZXRfcmVxICogdHhfcGFja2V0 X3JlcSkKewogIGZwcmludGYoc3Rkb3V0LCAiUGFnZXNpemUgPSAlbGRcbiIsIHN5c2NvbmYo X1NDX1BBR0VTSVpFKSk7CiAgZnByaW50ZihzdGRvdXQsICJUUEFDS0VUX0FMSUdOTUVOVCA9 ICVkXG4iLCBUUEFDS0VUX0FMSUdOTUVOVCk7CiAgZnByaW50ZihzdGRvdXQsICJUUEFDS0VU Ml9IRFJMRU4gPSAlZFxuIiwgVFBBQ0tFVDJfSERSTEVOKTsKICBmcHJpbnRmKHN0ZG91dCwg InNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpID0gJWRcbiIsIHNpemVvZihzdHJ1Y3Qgc29j a2FkZHJfbGwpKTsKICBmcHJpbnRmKHN0ZG91dCwgIlJ4IHBhY2tldCByZXEgOlxuIik7CiAg ZnByaW50ZihzdGRvdXQsICIgdHBfYmxvY2tfc2l6ZSA9ICVkXG4iLCByeF9wYWNrZXRfcmVx LT50cF9ibG9ja19zaXplKTsKICBmcHJpbnRmKHN0ZG91dCwgIiB0cF9ibG9ja19uciAgID0g JWRcbiIsIHJ4X3BhY2tldF9yZXEtPnRwX2Jsb2NrX25yKTsKICBmcHJpbnRmKHN0ZG91dCwg IiB0cF9mcmFtZV9zaXplID0gJWRcbiIsIHJ4X3BhY2tldF9yZXEtPnRwX2ZyYW1lX3NpemUp OwogIGZwcmludGYoc3Rkb3V0LCAiIHRwX2ZyYW1lX25yICAgPSAlZFxuIiwgcnhfcGFja2V0 X3JlcS0+dHBfZnJhbWVfbnIpOwogIGZwcmludGYoc3Rkb3V0LCAiVHggcGFja2V0IHJlcSA6 XG4iKTsKICBmcHJpbnRmKHN0ZG91dCwgIiB0cF9ibG9ja19zaXplID0gJWRcbiIsIHR4X3Bh Y2tldF9yZXEtPnRwX2Jsb2NrX3NpemUpOwogIGZwcmludGYoc3Rkb3V0LCAiIHRwX2Jsb2Nr X25yICAgPSAlZFxuIiwgdHhfcGFja2V0X3JlcS0+dHBfYmxvY2tfbnIpOwogIGZwcmludGYo c3Rkb3V0LCAiIHRwX2ZyYW1lX3NpemUgPSAlZFxuIiwgdHhfcGFja2V0X3JlcS0+dHBfZnJh bWVfc2l6ZSk7CiAgZnByaW50ZihzdGRvdXQsICIgdHBfZnJhbWVfbnIgICA9ICVkXG4iLCB0 eF9wYWNrZXRfcmVxLT50cF9mcmFtZV9ucik7Cn0KI2VuZGlmCgo= --------------010101080108060701030802--