[Python-Dev] continuationmodule.c preview

Christian Tismer tismer@appliedbiometrics.com
Mon, 12 Jul 1999 21:39:40 +0200


This is a multi-part message in MIME format.
--------------EDD81E724667AA03453E0C67
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Howdy,

please find attached my latest running version of 
continuationmodule.c which is really able to do continuations.
You need stackless Python 0.3 for it, which I just submitted.

This module is by no means ready.
The central functions are getpcc() and putcc.

Call/cc is at the moment to be done like:

def callcc(fun, *args, **kw):
    cont = getpcc()
    return apply(fun, (cont,)+args, kw)

getpcc(level=1) gets a parent's current continuation.
putcc(cont, val) throws a continuation.

At the moment, these are still frames (albeit special ones)
which I will change. They should be turned into objects which
have a link to the actual frame, which can be unlinked after
a shot or by hand. This makes it easier to clean up circular
references.

I have a rough implementation of this in Python, also a couple of
generators and coroutines, but all not pleasing me yet.

Due to the fact that my son is ill, my energy has dropped
a little for the moment, so I thought I'd better release
something now. I will make the module public when things
have been settled a little more.

ciao - chris

-- 
Christian Tismer             :^)   <mailto:tismer@appliedbiometrics.com>
Applied Biometrics GmbH      :     Have a break! Take a ride on Python's
Kaiserin-Augusta-Allee 101   :    *Starship* http://starship.python.net
10553 Berlin                 :     PGP key -> http://wwwkeys.pgp.net
PGP Fingerprint       E182 71C7 1A9D 66E9 9D15  D3CC D4D7 93E2 1FAE F6DF
     we're tired of banana software - shipped green, ripens at home
--------------EDD81E724667AA03453E0C67
Content-Type: application/x-unknown-content-type-cfile;
 name="continuationmodule.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="continuationmodule.c"

Ci8qIENvbnRpbnVhdGlvbiBvYmplY3RzICovCgovKgoKICBDVCA5OTA2MTkKCiAgQWZ0ZXIg
bG90cyBvZiB0aG91Z2h0LCBJIGNhbWUgdXAgd2l0aCB0aGlzOgogIEZyYW1lcyBjYW4gYmUg
c3dpdGNoZWQgYW5kIHRyZWF0ZWQgbGlrZQogIGNvbnRpbnVhdGlvbnMgaW4gbWFueSBjYXNl
cy4KICBUaGlzIHdvcmtzIGZpbmUsIHVudGlsIGEgZnJhbWUgbmVlZHMgdG8KICBiZSByZXR1
cm5lZCB0byBtb3JlIHRoYW4gb25jZS4KICBUaGlzIGlzIHRoZSByZWFsIHNpdHVhdGlvbiwg
d2hlcmUgd2UgbmVlZAogIHRvIHVzZSAicmVhbCIgY29udGludWF0aW9ucywgdGhhdCBtZWFu
czoKICBUaGUgZnJhbWUncyBleGVjdXRpb24gc3RhdGUgbXVzdCBiZSBzZXQgYnkgdGhlCiAg
cmV0dXJuaW5nIGNhbGxlZS4KCiAgSXQgd291bGQgYmUgYSBtYWpvciBkcmF3YmFjayB0byBh
bHdheXMgaGF2ZSBjYWxsZWVzCiAgdG8gY2FycnkgdGhlaXIgY3VycmVudCBiYWNrIGNvbnRp
bnVhdGlvbiBhcm91bmQuCiAgVGhpcyB3b3VsZCBiZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBv
dmVyaGVhZCBhbmQgd291bGQKICBzbG93IGRvd24gbW9zdCBvZiB0aGUgZnVuY3Rpb24gY2Fs
bHMgd2l0aG91dCBhbnkgYmVuZWZpdC4KCiAgU29sdXRpb24gdG8gdGhpcyBwcm9ibGVtOgog
IFdoZW5ldmVyIHRoZSBjdXJyZW50IGNvbnRpbnVhdGlvbiBpcyByZXF1ZXN0ZWQgZnJvbSBQ
eXRob24gY29kZSwKICB3ZSB0YWtlIHRoZSBjdXJyZW50IGZyYW1lIGFuZCBkdXBsaWNhdGUg
aXQuIER1cGxpY2F0aW9uCiAgb2Njb3VycyBhdCB0aGUgZl9iYWNrIHBvaW50ZXI6IEEgY29w
eSBvZiB0aGUgZnJhbWUgaXMgc3BsaWNlZAogIGluIHRoZXJlLiBUaGlzIGtlZXBzIGFsbCBy
ZWZlcmVuY2VzIGNvcnJlY3QuCiAgVGhlIGZvcm1lciBjdXJyZW50IGZyYW1lIGlzIG5vdyB0
cmFuc2Zvcm1lZCBpbnRvIGEgY29udGludWF0aW9uCiAgZnJhbWUuCiAgQ29udGludWF0aW9u
IGZyYW1lcyBoYXZlIGEgc3BlY2lhbCBmX2V4ZWN1dGUgZW50cnkuCiAgVGhlaXIgb25seSBw
dXJwb3NlIGlzIHRvIHBhcmFtZXRlcml6ZSB0aGUgdHJ1ZSBmcmFtZQogIGFuZCBydW4gaXQu
CiAgVGhlIGNvcHktaW50by10aGUtYmVoaW5kIHRyaWNrIGlzIGFsd2F5cyBwZXJmb3JtZWQs
IHdoZW4KICBhIGNvbnRpbnVhdGlvbiBmcmFtZSBpcyBydW4uIEF0IHRoZSBzYW1lIHRpbWUs
IGl0IGlzIGVuc3VyZWQKICB0aGF0IGFueSB0cnVlIGZyYW1lIHdoaWNoIGlzIGludm9rZWQg
YnkgYSBjb250aW51YXRpb24gaXMKICBpdHNlbGYgcG9pbnRpbmcgYmFjayB0byBhIGNvbnRp
bnVhdGlvbi4KICBCeSBtZWFucyBvZiB0aGlzLCBpdCBhcHBlYXJzIGFzIGlmIHRoZSB3aG9s
ZSBleGVjdXRpb24gdHJlZQogIHdlcmUgYnVpbHQgd2l0aCBjb250aW51YXRpb25zIHNsaWNl
ZCBiZXR3ZWVuIG5vcm1hbCBmcmFtZXMuCiAgQnV0IHRoaXMgaGFwcGVucyBvbmx5IG9uIGRl
bWFuZCwgaW4gYSBsYXp5IG1hbm5lci4KCiAgSSdtIHN1cmUgSSBoYXZlIHJlYWNoZWQgdGhl
IG5leHQgbGV2ZWwgb2YgbWFkbmVzcyBieSB0aGF0LgoKICBDaHJpc3RpYW4gVGlzbWVyCiAg
SnVuZSAxOSwgMTk5OQoKICBBZGRlbmR1bSA5OTA2MjA6IEl0IHdhcyBjcnVjaWFsIHRvIGNo
YW5nZSB0aGUgZnJhbWUgcmVmY291bnRpbmcKICBwb2xpY3ksIGluIG9yZGVyIHRvIGdldCB0
aGlzIHRvIHdvcmsgcGFpbmxlc3NseS4KICBGcmFtZXMgbm93IGhhdmUgdXN1YWxseSBhbHdh
eXMgYSByZWZjb3VudCBvZiAxLgogIE9uIHJldHVybiwgZl9iYWNrIGlzIGluY3JlZidkLCB0
aGVuIHRoZSBjdXJyZW50IGZyYW1lIGRlY3JlZidkLgoKICA5OTA2MjQgc3RpbGwgaHVudGlu
ZyB0aGUgbGFzdCByZWZjb3VudCBmYXVsdHMgc2luY2UgNSBkYXlzKysuCgogIDk5MDYyNSBy
ZWZjb3VudCBmYXVsdHMgc29sdmVkLiBJIGRpZCBub3QgdW5kZXJzdGFuZCB0aGF0CiAgYSBm
cmFtZSdzIHN0YWNrc2l6ZSBmaWVsZCBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbi4KICBTZWUg
ZnJhbWVvYmplY3QuYyBmb3IgR3VpZG8ncyBjb21tZW50cy4KCiAgQWRkZWQgcHJvcGVyIGhh
bmRsaW5nIG9mIHJlY3Vyc2lvbiBkZXB0aC4gSXQgaXMgc2ltcGxlCiAgYW5kIGNoZWFwOiBT
YXZlIGFuZCByZXN0b3JlIHRoZSByZWN1cnNpb24gbGV2ZWwgaW4gdGhlCiAgY29udGludWF0
aW9uIGZyYW1lcy4KCiAgOTkwNjI2IGl0IHNlZW1zIHRvIGJlIHZlcnkgc3RhYmxlIG5vdy4g
QnV0OgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCiAgVmVyc2lvbiAwLjIKCiAgQWxsIHRoZSBwcm9ibGVtcyBoYXZl
IGJlZW4gc29sdmVkIHNvIGZhci4KICBBZnRlciBzb21lIHRlc3RpbmcgYW5kIG1vcmUgcmVh
ZGluZyBhYm91dCBTY2hlbWUsIEkKICByZWFsaXplZCB0aGF0IHRoZSBldmFsdWF0aW9uIHN0
YWNrIGlzIGEgcmVhbGx5IGJhZCB0aGluZyEKICBCeSBjb3B5aW5nIHN0YWNrcyBiYWNrLCB3
ZSBhcmUgcmVzdG9yaW5nIG9sZCBpbmZvcm1hdGlvbgogIHdoaWNoIGlzIHdyb25nLiBXZSBo
YXZlIHRvIHVzZSB0aGUgY3VycmVudCBpbmZvcm1hdGlvbi4KICBFeGFtcGxlOiBMb29wcyBj
YXJyeSB0aGVpciBzdGF0ZSBvbiB0aGUgc3RhY2suIEl0IGlzCiAgYSBiYWQgaWRlYSB0byBy
ZXN0b3JlIHRoYXQgdXNpbmcgb2xkIHZhbHVlcy4KCiAgQWxzbywgY3JlYXRpbmcgbmV3IHB1
c2ggYmFjayBmcmFtZXMgYWxsIHRoZSB0aW1lIGlzIG5vdAogIHRoZSBiZXN0IGlkZWEsIHNp
bmNlIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBjb250aW51YXRpb24KICBmcmFtZSBmb3Ig
ZXZlcnkgY29udGludWF0aW9uIGVudHJ5IHBvaW50LgoKICBJbiBhbiBpZGVhbCB3b3JsZCwg
ZXZlcnkgZW50cnkgcG9pbnQgd291bGQgbm90IGhhdmUgYQogIHN0YWNrLCBidXQgYSBudW1i
ZXIgb2YgcmVnaXN0ZXJzIHdoaWNoIGFyZSBhc3NvY2lhdGVkCiAgd2l0aCB0aGUgcHJvZ3Jh
bSBsb2NhdGlvbi4gVGhlc2UgcmVnaXN0ZXJzIHNob3VsZCBhbHdheXMKICBjYXJyeSBjdXJy
ZW50IHZhbHVlcy4gSG93IGNhbiB3ZSBkbyB0aGlzPwoKICBBIGNvbXBsZXRlIHNvbHV0aW9u
IHNlZW1zIHRvIGJlIGltcG9zc2libGUgd2l0aG91dAogIHJld3JpdGluZyBoYWxmIG9mIHRo
ZSBQeXRob24ga2VybmVsLiBBbGwgd2UgY2FuIGRvCiAgaXMgdHJ5aW5nIHRvIG1ha2Ugc3Vy
ZSB0aGF0IGV2ZXJ5IHByb2dyYW0gbG9jYXRpb24KICB3aGljaCBjYW4gYmUgcmVhY2hlZCBi
eSBpdHMgY29udGludWF0aW9uIHVzZXMgdGhlCiAgc2FtZSwgZnJlc2hlc3QgdmVyc2lvbiBv
ZiBkYXRhLgoKICA5OTA2MjcgTm8sIGl0ICppcyogcG9zc2libGUuIFdlIG5lZWQgYSBzbWFs
bCBjaGFuZ2UKICBvZiBldmFsX2NvZGUgdG8gYWxsb3cgZm9yIHNvbWV0aGluZyBiZWluZyBj
YWxsZWQKICBiZWZvcmUgYSBuZXcgZnJhbWUgaXMgcnVuLiBUaGlzIG1lYW5zIHRvIGFkZAog
IG9uZSBuZXcgZmllbGQgdG8gZnJhbWVzOiBmX2NhbGxndWFyZC4KCiAgRGlkIGl0LiBJdCB3
b3Jrcy4gSXQgaXMgbm8gY29tcGxldGUgc29sdXRpb24sIGJ1dCBhdCBsZWFzdAogICJmb3Ii
IGxvb3BzIGJlaGF2ZSBjb3JyZWN0bHkgaW4gc2ltcGxlIGNhc2VzLgogIFRoZSB0cnVlIHNv
bHV0aW9uIGlzOiBFaXRoZXIgdHVybiB0aGUgZXZhbCBpbnRlcnByZXRlcgogIGludG8gYSBy
ZWdpc3RlciBtYWNoaW5lLCBvciBkbyB0aGUgZm9sbG93aW5nOgogIE9uIGRlbWFuZCwgYSBk
YXRhIGZsb3cgYW5hbHlzaXMgbXVzdCBiZSBkb25lIGZvciB0aGUKICBzdGFjayBpbiBvcmRl
ciB0byBmaW5kIHRoZSBsaWZldGltZSBvZiBzdGFjayB2YXJpYWJsZXMuCiAgVGhpcyBpcyBu
b3QgdG9vIGhhcmQuIEkgd2lsbCBub3QgZG8gdGhpcyB1bnRpbCBJIGNoYW5nZWQKICB0aGUg
b3ZlcmFsbCBjb25jZXB0IGFnYWluOiBGcmFtZSBpbnRlcnByZXRlcnMgbXVzdCBiZWNvbWUK
ICBvYmplY3QgYnkgdGhlbXNlbHZlcy4gTmVjZXNzYXJ5IGFjdGlvbnMgZm9yIGNvbnRpbnVh
dGlvbnMKICB3aWxsIHRoZW4gYmVjb21lIG1ldGhvZHMgb2YgdGhlc2Ugb2JqZWN0cy4KICBU
aGlzIGlzIHRoZSB3YXkgdG8gZ28sIGZvciBWZXJzaW9uIDAuMy4KCiAgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICA5
OTA3MTAgZHJvcHBlZCB0aGUgZXh0cmEgaGlkZGVuIHJlZ2lzdGVyIGRldGVjdGlvbiBtZXNz
LgogIExldCdzIGZvcmdldCBhYm91dCB0aGUgYWJvdmUgY29uc2lkZXJhdGlvbnMuCgogIFN0
YWNrbGVzcyBQeXRob24gZ290IGEgbmV3IG11dGFibGUgY291bnRlciBvYmplY3QgZm9yIHRo
ZQogIGZvci1sb29wcywgYW5kIHdlJ3JlIGRvbmUuIEFsc28gcmV3b3JrZWQgdGhlIGRldGVj
dGlvbgogIG9mIGRpZmZlcmVudCBkaXNwYXRjaGVyIGluc3RhbmNlcyBxdWl0ZSBtdWNoLgog
IEdvaW5nIHRvIHJlbGVhc2Ugc29tZSBzdHVmZiBzb29uLgoKICA5OTA3MTEgTm93IEkgKnRo
b3VnaHQqIGl0IHNob3VsZCBhbHNvIHdvcmsgdG8gc2F2ZQogIGNvbnRpbnVhdGlvbnMgaW5z
aWRlIG9mIG5lc3RlZCBkaXNwYXRjaGVycy4gQWN0dWFsbHksCiAgaXQgZG9lc24ndC4gTXkg
cHJldmVudGl2ZSBjb250aW51YXRpb24gZnJhbWUgY3JlYXRpb24KICB3aGljaCBJIGRvIGZv
ciBjYWxsZXJzIGlzIGJyb2tlbiwgaWYgYW4gZXZhbF9jb2RlIGluc3RhbmNlCiAgY2FsbHMg
YSBmdW5jdGlvbiB3aGljaCBkb2Vzbid0IGdlbmVyYXRlIHVud2luZCB0b2tlbnMuCiAgVGhh
dCBtZWFucywgZXZhbF9jb2RlIGNvbnRpbnVlcyB0byBydW4gdGhpcyBmcmFtZSwgYWx0aG91
Z2gKICBpdCBoYWQgYmVlbiB0dXJuZWQgaW50byBhIGNvbnRpbnVhdGlvbiBmcmFtZS4gVGhp
cyBsZWFkcyB0bwogIGZ1bm55IGVmZmVjdHMgYW5kIGlzIGJhZC4KCiAgQnV0IG5vdyBJIHJl
YWxpemVkIHdoYXQgdGhlICpyZWFsKiB3YXkgaXMsIGFuZCB0aGF0IGl0IGlzCiAgc28gbXVj
aCBlYXNpZXIgdGhhbiBldmVyeXRoaW5nLiBXZSB1c2UgdGhlIGZfY2FsbGd1YXJkLAogIHdo
aWNoIG5vdyBtYWtlcyB2ZXJ5IG11Y2ggc2Vuc2UuIFRoZSBjYWxsZ3VhcmQgYmVjb21lcwog
IGEgaGFuZGxlciB3aGljaCBjaGVja3Mgd2V0aGVyIHRoZSBjdXJyZW50IGZyYW1lIGhhcyBh
CiAgcmVmY291bnQgb2YgbW9yZSB0aGFuIG9uZS4gSWYgc28sIHRoZW4gaXQgaXMgdHVybmVk
IGludG8KICBhIGNvbnRpbnVhdGlvbiBmcmFtZSwgYW5kIHdlIHVud2luZCB3aXRoIHRoZSBw
dXNoZWQgYmFjawogIGZyYW1lLgoKICA5OTA3MTIgVGhpcyBpcyBkb25lIG5vdy4gVGhlIGNh
bGxndWFyZCBpcyBub3cgYWxzbyB1c2VkIHRvCiAgY2hlY2sgZm9yIGZ1bmN0aW9uIGNhbGxz
IHdoaWNoIGRpZCBub3QgdW53aW5kIHRoZSBzdGFjay4KICBJbiBvdGhlciB3b3JkczogV2Ug
Y2FuIGNhcHR1cmUgdGhlIGNvbnRpbnVhdGlvbnMgY29ycmVjdGx5LAogIGFsc28gaWYgd2Ug
YXJlIGNhbGxlZCByZWN1cnNpdmVseSBieSBhbiBfX2luaXRfXyBjb250ZXh0LgoKICAqLwoK
I2luY2x1ZGUgIlB5dGhvbi5oIgoKI2luY2x1ZGUgImNvbXBpbGUuaCIKI2luY2x1ZGUgImZy
YW1lb2JqZWN0LmgiCgpzdGF0aWMgUHlPYmplY3QgKkVycm9yT2JqZWN0OwoJCgovKiBmb3J3
YXJkICovClB5T2JqZWN0ICogdGhyb3dfY29udGludWF0aW9uKFB5RnJhbWVPYmplY3QgKiwg
UHlPYmplY3QgKik7CgpQeU9iamVjdCAqIHN0YWNrX3RvX3R1cGxlKGYpCglQeUZyYW1lT2Jq
ZWN0ICpmOwp7CglQeU9iamVjdCAqKnAgPSBmLT5mX3N0YWNrcG9pbnRlcjsKCWludCBzaXpl
ID0gcCAtIGYtPmZfdmFsdWVzdGFjazsKCVB5T2JqZWN0ICpyZXQgPSBQeVR1cGxlX05ldyhz
aXplKTsKCWlmIChyZXQ9PU5VTEwpCgkJcmV0dXJuIE5VTEw7Cglmb3IgKCA7IHNpemU+MCA7
KSB7CgkJUHlPYmplY3QgKml0ZW0gPSAqLS1wOwoJCVB5X0lOQ1JFRihpdGVtKTsKCQlQeVR1
cGxlX1NFVF9JVEVNKHJldCwgLS1zaXplLCBpdGVtKTsKCX0KCXJldHVybiByZXQ7Cn0KCgoJ
ClB5RnJhbWVPYmplY3QgKiBzZXRfZXhlY3V0aW9uX3N0YXRlKGYsIGZiKQoJUHlGcmFtZU9i
amVjdCAqIGY7CglQeUZyYW1lT2JqZWN0ICogZmI7CnsKCVB5T2JqZWN0ICoqIGZzcDsKCVB5
T2JqZWN0ICogaXRlbTsKCglpZiAoZi0+Zl9leGVjdXRlICE9IHRocm93X2NvbnRpbnVhdGlv
bikgewoJCVB5RXJyX1NldFN0cmluZyAoUHlFeGNfU3lzdGVtRXJyb3IsICJ3cm9uZyBleGVj
dXRpb24gc291cmNlIGZyYW1lIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKGZiLT5mX2V4
ZWN1dGUgPT0gdGhyb3dfY29udGludWF0aW9uKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4
Y19TeXN0ZW1FcnJvciwgIndyb25nIGV4ZWN1dGlvbiB0YXJnZXQgZnJhbWUiKTsKCQlyZXR1
cm4gTlVMTDsKCX0KCgkvKiBjb3B5IGV4Y2VwdGlvbiBibG9ja3MgKi8KCWlmIChmLT5mX2li
bG9jayA+IDApIHsKCQlmYi0+Zl9pYmxvY2sgPSBmLT5mX2libG9jazsKCQltZW1jcHkoJihm
Yi0+Zl9ibG9ja3N0YWNrKSwgJihmLT5mX2Jsb2Nrc3RhY2spLCBmLT5mX2libG9jaypzaXpl
b2YoUHlUcnlCbG9jaykpOwoJfQoKCS8qIGNsZWFyIHRoZSB0YXJnZXQgc3RhY2sgKi8KCXdo
aWxlIChmYi0+Zl9zdGFja3BvaW50ZXIgPiBmYi0+Zl92YWx1ZXN0YWNrKSB7CgkJaXRlbSA9
ICotLShmYi0+Zl9zdGFja3BvaW50ZXIpOwoJCVB5X1hERUNSRUYoaXRlbSk7Cgl9CgkvKiBj
b3B5IHRoZSBzdGFjayAqLwoJZnNwID0gZi0+Zl92YWx1ZXN0YWNrOwoJd2hpbGUgKGZzcCA8
IGYtPmZfc3RhY2twb2ludGVyKSB7CgkJaXRlbSA9ICooZnNwKyspOwoJCVB5X0lOQ1JFRihp
dGVtKTsKCQkqKGZiLT5mX3N0YWNrcG9pbnRlcisrKSA9IGl0ZW07Cgl9CgkvKiBjb3B5IGFk
ZGl0aW9uYWwgaW5mbyAqLwoJZmItPmZfbGFzdGkgPSBmLT5mX2xhc3RpOwoJZmItPmZfbGlu
ZW5vID0gZi0+Zl9saW5lbm87CgkvKiBpbnN0cnVjdGlvbiBwb2ludGVyICovCglmYi0+Zl9u
ZXh0X2luc3RyID0gZi0+Zl9uZXh0X2luc3RyOwoJLyogY29weSBhdXhpbGlhcnkgcmVnaXN0
ZXJzICovCglmYi0+Zl9zdGF0dXNmbGFncyA9IGYtPmZfc3RhdHVzZmxhZ3M7CgkvKiBidXQg
bm90IHRoZSByZWdpc3RlcnMgKi8KCXJldHVybiBmYjsgLyogc3VjY2VzcyBmbGFnICovCn0K
CgovKgpUaGUgaWRlYSBvZiBidWlsZF9jb250aW51YXRpb25fZnJhbWUgaXMKdG8gdGFrZSBh
IGZyYW1lIGFuZCBkdXBsaWNhdGUgaXQgYXQgaXRzIGZfYmFjayBwb2ludGVyLgpUaGUgZXhl
Y3V0aW9uIHBvaW50ZXIgaXMgY2hhbmdlZCB0byB0aHJvd19jb250aW51YXRpb24uClNpbmNl
IHRoZSBmcmFtZSAqYmVjb21lcyogdGhlIGNvbnRpbnVhdGlvbiwgd2hpY2ggbGF0ZXIKZmFs
bHMgYmFjayB0byB0aGUgdHJ1ZSBhY3Rpb24sIGFsbCByZWZlcmVuY2VzIHRvIHRoZQpmcmFt
ZSBzdGF5IGludGFjdC4gClRoaXMgaXMgYSAiY3JlYXRlIGNvbnRpbnVhdGlvbiBvbiBkZW1h
bmQiIGNvbmNlcHQgOi0pCiovCgppbnQgZmluZF9yZWN1cnNpb25fZGVwdGgoZikKCVB5RnJh
bWVPYmplY3QgKiBmOwp7CgkvKiAKCSAgd2UgZWl0aGVyIGNvdW50IHVudGlsIHRoZSB0b3Ag
b2YgdGhlIGNoYWluLCAKCSAgb3IgdW50aWwgd2UgZmluZCBhbm90aGVyIGNvbnRpbnVhdGlv
biBmcmFtZSAKCSAgd2hpY2ggdGVsbHMgdXMgYnkgaXRzIGZfcmVnMSBmaWVsZC4gCgkqLwoJ
aW50IGRlcHRoID0gMDsKCXdoaWxlIChmICE9IE5VTEwpIHsKCQlpZiAoZi0+Zl9leGVjdXRl
ID09IHRocm93X2NvbnRpbnVhdGlvbikgewoJCQlkZXB0aCArPSBmLT5mX3JlZzE7CgkJCWJy
ZWFrOwoJCX0KCQlmID0gZi0+Zl9iYWNrOwoJCWRlcHRoKys7Cgl9CglyZXR1cm4gZGVwdGg7
Cn0KClB5RnJhbWVPYmplY3QgKiBidWlsZF9jb250aW51YXRpb25fZnJhbWUoZikKCVB5RnJh
bWVPYmplY3QgKiBmOwp7CglQeUZyYW1lT2JqZWN0ICogZmI7IC8qIGZyYW1lIGluIHRoZSBi
YWNrICovCglpbnQgaTsKCglpZiAoZj09TlVMTCkKCQlyZXR1cm4gTlVMTDsKCWlmIChmLT5m
X2V4ZWN1dGUgPT0gdGhyb3dfY29udGludWF0aW9uKQoJCXJldHVybiBmOyAvKiBhbHJlYWR5
IGEgY29udGludWF0aW9uICovCgoJZmIgPSBQeUZyYW1lX05ldyhmLT5mX3RzdGF0ZSwgZi0+
Zl9jb2RlLCBmLT5mX2dsb2JhbHMsIGYtPmZfbG9jYWxzKSA7CglpZiAoZmIgPT0gTlVMTCkK
CQlyZXR1cm4gTlVMTCA7CgoJLyogbGluayB0aGUgbmV3IGZyYW1lIGJldHdlZW4gdGhpcyBh
bmQgYmFjayAqLwoJZmItPmZfYmFjayA9IGYtPmZfYmFjazsKCWYtPmZfYmFjayA9IGZiOwoK
CS8qIHRyYWNlYmFja3M6IG5vdCBjb3BpZWQsIHRoZXkgc3RheSBpbiB0aGUgY29udGludWF0
aW9uICovCgoJLyogCgkgIGZfYnVpbHRpbnMsIGZfZ2xvYmFscywgZl9sb2NhbHMsIGZfdHN0
YXRlLCBmX3Jlc3RyaWN0ZWQsIGZfbmxvY2FscyAKCSAgYW5kIGZfZmlyc3RfaW5zdHIgaGF2
ZSBiZWVuIHNldCBieSBQeUZyYW1lX05ldy4KCSAKCSAgbmV2ZXIgdG91Y2ggZl9zdGFja3Np
emUhIEl0IG1heSBoYXZlIGJlZW4gc2V0IGxhcmdlciB0aGFuCgkgIG5lZWRlZC4gVGhpcyBj
YXVzZWQgbWUgaG91cnMgYW5kIGhvdXJzIG9mIGRlYnVnZ2luZy4KCSovCgoJZm9yIChpPTA7
IGk8Zi0+Zl9ubG9jYWxzOyBpKyspIHsKCQlQeU9iamVjdCAqIGl0ZW0gPSBmLT5mX2xvY2Fs
c3BsdXNbaV07CgkJUHlfWElOQ1JFRihpdGVtKTsKCQlmYi0+Zl9sb2NhbHNwbHVzW2ldID0g
aXRlbTsKCX0KCgoJUHlfSU5DUkVGKGYtPmZfZGlzcGF0Y2hlcik7CglmYi0+Zl9kaXNwYXRj
aGVyID0gZi0+Zl9kaXNwYXRjaGVyOwoJZmItPmZfaG9sZF9yZWYgPSBmLT5mX2hvbGRfcmVm
OyBmLT5mX2hvbGRfcmVmID0gTlVMTDsKCWZiLT5mX21lbW9yeSA9IGYtPmZfbWVtb3J5OyBm
LT5mX21lbW9yeSA9IE5VTEw7CglmYi0+Zl9jYWxsZ3VhcmQgPSBmLT5mX2NhbGxndWFyZDsg
Zi0+Zl9jYWxsZ3VhcmQgPSBOVUxMOwoKCS8qIHJlZ2lzdGVycywgb25seSBvbmNlICovCglm
Yi0+Zl9yZWcxID0gZi0+Zl9yZWcxOwoJZmItPmZfcmVnMiA9IGYtPmZfcmVnMjsKCWZiLT5m
X3JlZzMgPSBmLT5mX3JlZzM7CgoJLyogY29weSBleGVjdXRvciBhbmQgcHV0IG91cnMgKi8K
CWZiLT5mX2V4ZWN1dGUgPSBmLT5mX2V4ZWN1dGU7CglmLT5mX2V4ZWN1dGUgPSB0aHJvd19j
b250aW51YXRpb247CgoJLyogcHV0IHJlY3Vyc2lvbl9kZXB0aCBpbnRvIGZfcmVnMSAqLwoJ
Zi0+Zl9yZWcxID0gZmluZF9yZWN1cnNpb25fZGVwdGgoZmIpOwoKCWlmICghc2V0X2V4ZWN1
dGlvbl9zdGF0ZShmLCBmYikpCgkJcmV0dXJuIE5VTEw7CglyZXR1cm4gZjsKfQoKClB5RnJh
bWVPYmplY3QgKiBmaW5kX2NvZGVfZnJhbWUoZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCWlm
IChmPT1OVUxMKQoJCXJldHVybiBOVUxMOwoJd2hpbGUgKGYtPmZfZXhlY3V0ZSA9PSB0aHJv
d19jb250aW51YXRpb24pIHsKCQlmID0gZi0+Zl9iYWNrOwoJCWlmIChmPT1OVUxMKQoJCQly
ZXR1cm4gTlVMTDsKCX0KCXJldHVybiBmOwp9CgoKUHlGcmFtZU9iamVjdCAqIG5vcm1hbGl6
ZV9jb250aW51YXRpb24oZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCS8qIHdhbGsgYmFjayB0
aHJvdWdoIGEgcG9zc2libGUgcGlsZSBvZiBjb250aW51YXRpb25zIGFuZCByZWxpbmsgdG8g
dGhlIHJlYWwgY29kZSAqLwoJUHlGcmFtZU9iamVjdCAqZmIgPSBmLT5mX2JhY2s7CglpZiAo
ZmI9PU5VTEwpCgkJcmV0dXJuIE5VTEw7CglpZiAoZmItPmZfZXhlY3V0ZSA9PSB0aHJvd19j
b250aW51YXRpb24pIHsKCQlmYiA9IG5vcm1hbGl6ZV9jb250aW51YXRpb24oZmIpOwoJCWlm
IChmYj09TlVMTCkKCQkJcmV0dXJuIE5VTEw7Cgl9CglQeV9JTkNSRUYoZmIpOwoJUHlfREVD
UkVGKGYtPmZfYmFjayk7CglmLT5mX2JhY2sgPSBmYjsKCS8qIHJldHVybiB0aGUgcmVhbCBj
b2RlIGZyYW1lICovCglyZXR1cm4gZmI7Cn0KCgpQeUZyYW1lT2JqZWN0ICogZmluZF9jYWxs
ZXJfZW50cnkoZikKCVB5RnJhbWVPYmplY3QgKmY7CnsKCS8qIHRoZSBvcHBvc2l0ZSBvZiBm
aW5kX2NvZGVfZnJhbWUuIGZpbmQgdGhlIHRydWUgcmV0dXJuLiAqLwoJZiA9IGZpbmRfY29k
ZV9mcmFtZShmKTsKCWlmIChmICE9IE5VTEwpCgkJZiAgPSBmLT5mX2JhY2s7CglyZXR1cm4g
ZjsKfQoKCmludCBwcm90ZWN0X3RoaXNfZnJhbWVfbmV4dF90aW1lKGYsIHBoYXNlKTsgLyog
Zm9yd2FyZCAqLwoKLyoKCUEgZnJhbWUgd2lsbCBjaGVjayB3ZXRoZXIgaXQgY2FuIGJlIHJl
YWNoZWQgdHdpY2UgYmVmb3JlIGl0CglpcyBydW4uIElmIHNvLCBpdCBjcmVhdGVzIGEgY29u
dGludWF0aW9uIGZyYW1lIGZyb20gaXRzZWxmLAoJcHV0cyB0aGUgcHVzaGVkIGJhY2sgYmVy
c2lvbiBvbiB0aGUgZnJhbWUgc3RhY2sgYW5kIGp1bXBzIG9mZi4KCglwaGFzZSAwOiBmcmFt
ZSBpcyBhYm91dCB0byBsZWF2ZSB3aXRoIHRoZSB1bndpbmQgdG9rZW4KCXBoYXNlIDE6IGZy
YW1lIGlzIGFib3V0IHRvIHN0YXJ0IHRoZSBpbnRlcnByZXRlciBsb29wCglwaGFzZSAyOiBm
cmFtZSBoYXMganVzdCBkb25lIGEgdHJ1ZSBmdW5jdGlvbiBjYWxsCiovCgppbnQgcHJvdGVj
dF90aGlzX2ZyYW1lKGYsIHBoYXNlKQoJUHlGcmFtZU9iamVjdCAqZjsKCWludCBwaGFzZTsK
ewoJUHlGcmFtZU9iamVjdCAqYmFjazsKCglpZiAoZi0+b2JfcmVmY250ID09IDEpIHsgLyog
Y2Fubm90IGJlIHJlYWNoZWQgdHdpY2UgKi8KCQlpZiAocGhhc2UgIT0gMCkgLyogd2UgYXJl
IG5vdCBvbiBleGl0ICovCgkJCWYtPmZfdGVtcF92YWwgPSBOVUxMOwoJCXJldHVybiAwOwoJ
fQoKCWYgPSBidWlsZF9jb250aW51YXRpb25fZnJhbWUoZik7CglpZiAoZj09TlVMTCkKCQly
ZXR1cm4gLTE7CgoJLyogb24gZXhpdCwgd2UganVzdCBwcm90ZWN0ICovCglpZiAocGhhc2Ug
PT0gMCkKCQlyZXR1cm4gMDsKCgkvKiBvbiBlbnRyeSwgd2UgY2F1c2UgYSByZXN0YXJ0ICov
CgkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggCgkgICBwaGFzZSA9PSAxIHdoaWNoIGlzICJiZWZv
cmUgZnJhbWUgc3RhcnQiCgkgICBwaGFzZSA9PSAyIHdoaWNoIGlzICJhZnRlciBmdW5jdGlv
biBjYWxsIgoJICAgYnV0IHRoZSBhY3Rpb24gYXBwZWFycyB0byBiZSBpZGVudGljYWwuCgkq
LwoJYmFjayA9IGZpbmRfY29kZV9mcmFtZShmKTsKCWJhY2stPmZfdGVtcF92YWwgPSBmLT5m
X3RlbXBfdmFsOyBmLT5mX3RlbXBfdmFsID0gTlVMTDsKCWJhY2stPmZfY2FsbGd1YXJkID0g
cHJvdGVjdF90aGlzX2ZyYW1lX25leHRfdGltZTsKCVB5X0lOQ1JFRihiYWNrKTsKCWYtPmZf
dHN0YXRlLT5mcmFtZSA9IGJhY2s7CglQeV9ERUNSRUYoZik7CglyZXR1cm4gLTQyOyAvKiBk
aXNwYXRjaCB0aGUgbmV3IGZyYW1lICovCn0KCgovKiAKCUEgZnJhbWUgaXMgYWN0aXZhdGVk
IGJ5IGEgY29udGludWF0aW9uIGZyYW1lIG9yCglyZXN0YXJ0ZWQgZm9yIHNvbWUgb3RoZXIg
cmVhc29uLiBUaGVyZWZvcmUKCWl0IHNob3VsZCBydW4gd2l0aG91dCBidWlsZGluZyBhIG5l
dyBjb250aW51YXRpb24KCWZyYW1lIGltbWVkaWF0ZWx5LCBidXQgYmUgYXJtZWQgdG8gZG8g
c28gbmV4dCB0aW1lLgoqLwoKaW50IHByb3RlY3RfdGhpc19mcmFtZV9uZXh0X3RpbWUoZiwg
cGhhc2UpCglQeUZyYW1lT2JqZWN0ICpmOwoJaW50IHBoYXNlOwp7CglpZiAocGhhc2UgIT0g
MSkgLyoganVzdCBvbiBlbnRyeSAqLwoJCXJldHVybiAwOwoJZi0+Zl9jYWxsZ3VhcmQgPSBw
cm90ZWN0X3RoaXNfZnJhbWU7CglmLT5mX3RlbXBfdmFsID0gTlVMTDsKCXJldHVybiAwOwp9
CgoKUHlPYmplY3QgKiB0aHJvd19jb250aW51YXRpb24oZiwgcGFzc2VkX3JldHZhbCkKCVB5
RnJhbWVPYmplY3QgKmY7CglQeU9iamVjdCAqcGFzc2VkX3JldHZhbDsJLyogcGFzc2luZyBh
IGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBiYWNrIGluICovCnsKCS8qIAoJICB3ZSBhcmUgdGhl
IGV4ZWN1dG9yIG9mIGEgY29udGludWF0aW9uIGZyYW1lLgoJICBPdXIgdGFzayBpcyB0byBl
bnN1cmUgdGhhdCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKCSAgdGFyZ2V0IGZyYW1lIGlz
IGFnYWluIHNhdmVkIGFzIGEgY29udGludWF0aW9uLgoJICBUaGUgY2FsbGVyIG9mIHRoZSBy
ZWFsIGZyYW1lIHdpbGwgYmUgdHVybmVkIGludG8KCSAgYSBjb250aW51YXRpb24gYXMgd2Vs
bC4KCSovCglQeUZyYW1lT2JqZWN0ICpiYWNrOwoKCWJhY2sgPSBub3JtYWxpemVfY29udGlu
dWF0aW9uKGYpOwoKCS8qIGVuc3VyZSB0aGF0IGJhY2sgaXMgc2F2ZWQgYW5kIHByb3RlY3Rl
ZCAqLwoJaWYgKGJhY2sgIT0gTlVMTCkgewoJCWlmIChwcm90ZWN0X3RoaXNfZnJhbWUoYmFj
aywgMCkpIHsKCQkJYmFjayA9IE5VTEw7CgkJfQoJCWVsc2UgewoJCQliYWNrID0gbm9ybWFs
aXplX2NvbnRpbnVhdGlvbihmKTsKCQkJLyogZW5zdXJlIHRoYXQgYmFjaydzIGNhbGxlciBp
cyBwcm90ZWN0ZWQgKi8KCQkJaWYgKGJhY2stPmZfYmFjayAhPSBOVUxMKSB7CgkJCQlQeUZy
YW1lT2JqZWN0ICogb3RoZXIgPSBmaW5kX2NvZGVfZnJhbWUoYmFjay0+Zl9iYWNrKTsKCQkJ
CW90aGVyLT5mX2NhbGxndWFyZCA9IHByb3RlY3RfdGhpc19mcmFtZTsKCQkJfQoJCQliYWNr
ID0gc2V0X2V4ZWN1dGlvbl9zdGF0ZShmLCBiYWNrKTsKCQl9Cgl9CgkKICAgIGlmIChiYWNr
PT1OVUxMKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19TeXN0ZW1FcnJvciwgImJyb2tl
biBjb250aW51YXRpb24iKTsKCQkvKiB0cnkgdG8gcmVwYWlyICovCgkJYmFjayA9IGZpbmRf
Y29kZV9mcmFtZShmKTsKCQlQeV9YSU5DUkVGKGJhY2spOwoJCWYtPmZfdHN0YXRlLT5mcmFt
ZSA9IGJhY2s7CgkJUHlfREVDUkVGKGYpOwoJCVB5X1hERUNSRUYocGFzc2VkX3JldHZhbCk7
CgkJcmV0dXJuIE5VTEw7Cgl9IGVsc2UgewoJCVB5X0lOQ1JFRihiYWNrKTsKCQlmLT5mX3Rz
dGF0ZS0+ZnJhbWUgPSBiYWNrOwoJCWYtPmZfdHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPSBm
LT5mX3JlZzE7CgkJUHlfREVDUkVGKGYpOwoJCXJldHVybiBwYXNzZWRfcmV0dmFsOwoJfQp9
CgoKLyogTm93IFNhbSdzIGNvbnRpbnVhdGlvbiBtZXRob2RzICovCgovKiAKICA5OTA3MDEg
QWZ0ZXIgbXkgZnJhbWUgZGVhbGxvY2F0aW9uIHdhcyBjb3JyZWN0ZWQgdG8KICBhbHNvIGNs
ZWFuIHVwIHN0YWNrcywgSSByZWFsaXplZCB0aGF0IGFsc28gcHV0Y2MKICBpcyBub3Qgc28g
dHJpdmlhbCwgc2luY2UgaXQgaXMgcnVuIGluIGEgY29udGV4dCB3aGVyZQogIHRoZSBleGVj
dXRvciB3YW50cyB0byBmaW5pc2ggaXRzIGZyYW1lLCBidXQgcHV0Y2MKICBtaWdodCBkZWFs
bG9jYXRlIGl0IHRvbyBlYXJseS4KCiAgT25lIGNvdWxkIG9mIGNvdXJzZSB3YWxrIGFyb3Vu
ZCB0aGlzIGJ5IGNyZWF0aW5nCiAgYW4gZXh0cmEgZnJhbWUgd2hpY2ggaGFzIGEgY2FsbGJh
Y2sgd2hpY2guLi4KCiAgQnV0IHdlIGhhdmUgdGhpcyBjYWxsZ3VhcmQgcG9pbnRlciBpbiBm
cmFtZXMgYWxyZWFkeS4KICBUaGlzIGlzIHRoZSB3YXkgdG8gZ28hCiAgV2hlbmV2ZXIgYSBm
cmFtZSBpcyBhYm91dCB0byBiZSBsZWZ0IGZpbmFsbHkgd2l0aAogIGFuIHVud2luZCB0b2tl
biwgd2UgbGV0IGl0IGdlbmVyYXRlIGEgY2FsbGJhY2sKICB3aGljaCBkZXN0cm95cyBpdCBp
bW1lZGlhdGVseSBiZWZvcmUgcmV0dXJuaW5nIHRvCiAgdGhlIGRpc3BhdGNoZXIuIFBoZXcg
Oi0pCiovCgppbnQgZGVzdHJveV90aGlzX2ZyYW1lKGYsIHBoYXNlKQoJUHlGcmFtZU9iamVj
dCAqZjsKCWludCBwaGFzZTsKewoJaWYgKGYtPm9iX3JlZmNudCAhPSAxIHx8IHBoYXNlICE9
IDApIHsKCQlQeUVycl9TZXRTdHJpbmcgKFB5RXhjX1N5c3RlbUVycm9yLCAid3JvbmcgYXR0
ZW1wdCB0byBkZXN0cm95IHRoaXMgZnJhbWUiKTsKCQlyZXR1cm4gLTE7Cgl9CglQeV9ERUNS
RUYoZik7CglyZXR1cm4gMDsKfQoKCmludCBhY3F1aXJlX2RlYWRfZGlzcGF0Y2hlcnNfZnJh
bWVzKGssIGYpCglQeUZyYW1lT2JqZWN0ICprOwoJUHlGcmFtZU9iamVjdCAqZjsKewoJUHlE
aXNwYXRjaGVyT2JqZWN0ICpkaywgKmRmOwoJZGsgPSBrLT5mX2Rpc3BhdGNoZXI7CglpZiAo
ZGstPmRfYWxpdmUpCgkJcmV0dXJuIC0xOwoJZGYgPSBmLT5mX2Rpc3BhdGNoZXI7CglkbyB7
CgkJUHlfREVDUkVGKGRrKTsKCQlQeV9JTkNSRUYoZGYpOwoJCWstPmZfZGlzcGF0Y2hlciA9
IGRmOwoJCWsgPSBrLT5mX2JhY2s7Cgl9IHdoaWxlIChrICE9IE5VTEwgJiYgay0+Zl9kaXNw
YXRjaGVyPT1kayk7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBQeU9iamVjdCAqCmJ1aWx0aW5f
cHV0Y2MgKHNlbGYsIGFyZ3MpCglQeU9iamVjdCAqc2VsZjsKCVB5T2JqZWN0ICphcmdzOwp7
CglQeUZyYW1lT2JqZWN0ICogaywgKiBmOwoJUHlPYmplY3QgKiB2OwoJaWYgKCFQeUFyZ19Q
YXJzZVR1cGxlIChhcmdzLCAiT08iLCAmaywgJnYpKSB7CgkJcmV0dXJuIE5VTEw7Cgl9IGVs
c2UgaWYgKCFQeUZyYW1lX0NoZWNrIChrKSB8fCBrLT5mX2V4ZWN1dGUgIT0gdGhyb3dfY29u
dGludWF0aW9uKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19UeXBlRXJyb3IsICJhcmd1
bWVudCBtdXN0IGJlIGEgY29udGludWF0aW9uIGZyYW1lIik7CgkJcmV0dXJuIE5VTEw7Cgl9
IGVsc2UgewoJCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7
CgkJZiA9IHRzdGF0ZS0+ZnJhbWU7CgkJaWYgKGstPmZfZGlzcGF0Y2hlciAhPSBmLT5mX2Rp
c3BhdGNoZXIpIHsKCQkJaWYgKGFjcXVpcmVfZGVhZF9kaXNwYXRjaGVyc19mcmFtZXMoaywg
ZikpIHsKCQkJCVB5RXJyX1NldFN0cmluZyAoUHlFeGNfVHlwZUVycm9yLCAiZnJhbWUgb2Jq
ZWN0cyBhcmUgaW5jb21wYXRpYmxlIik7CgkJCQlyZXR1cm4gTlVMTDsKCQkJfQoJCX0KCQlQ
eV9JTkNSRUYodik7CgkJay0+Zl90ZW1wX3ZhbCA9IHY7CgkJay0+Zl9jYWxsZ3VhcmQgPSBw
cm90ZWN0X3RoaXNfZnJhbWU7CgkJUHlfSU5DUkVGKGspOwoJCXRzdGF0ZS0+ZnJhbWUgPSBr
OwoJCWlmIChmLT5vYl9yZWZjbnQgPiAxKSB7CgkJCVB5X0RFQ1JFRiAoZik7CgkJfSBlbHNl
IHsKCQkJZi0+Zl9jYWxsZ3VhcmQgPSBkZXN0cm95X3RoaXNfZnJhbWU7IC8qIHJlYXNvbjog
aXQgaXMgc3RpbGwgcnVubmluZyAqLwoJCX0KCQlQeV9ERUNSRUYoZi0+Zl9kaXNwYXRjaGVy
KTsKCQlyZXR1cm4gUHlfVW53aW5kVG9rZW47Cgl9Cn0KCgovKiBmb3J3YXJkICovClB5T2Jq
ZWN0ICogZ2V0Y2NfY2F0Y2hfZnJhbWUoUHlGcmFtZU9iamVjdCAqLCBQeU9iamVjdCAqKTsK
Ci8qCmdldGNjIGlzIGEgbGl0dGxlIHRyaWNreS4gU2FtIHRyaWVkIHRvIGZldGNoIHRoZSBj
dXJyZW50IGZyYW1lCmRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbi4gVGhlIHByb2JsZW0gaXMs
IHRoYXQgaW4gdGhpcyBjb250ZXh0LAp0aGUgcnVubmluZyBleGVjdXRvciBpcyBub3QgZG9u
ZSB3aXRoIHRoZSBmcmFtZS4gV2hpbGUgd2UgYXJlCmluIHRoZSBleGVjdXRvcidzIGNvbnRl
eHQsIHRoZXJlIGlzIHN0aWxsIHNvbWUgc3RhdGUgaW4gdGhlIEMgc3RhY2ssCnNpbmNlIHRo
ZSBleGVjdXRvciB3YW50cyB0byBwdXNoIGEgcmVzdWx0IHRvIHRoZSBvYmplY3Qgc3RhY2su
CgpUbyBnZXQgdGhpcyBjb3JyZWN0LCB3ZSBoYXZlIGluc3RlYWQgdG8gYmFpbCBvdXQgb2Yg
dGhlCmV4ZWN1dG9yLiBUaGUgZnJhbWUgaXMgdGhlbiBpbiBhIGNvbnNpc3RlbnQgc3RhdGUs
IGV4YWN0bHkKdGhlIG9uZSB3ZSBuZWVkOgpJdCB3YW50cyB0byBiZSByZS1lbnRlcmVkIHdp
dGggYSB2YWx1ZS4KKi8KCnN0YXRpYyBQeU9iamVjdCAqCmJ1aWx0aW5fZ2V0Y2MgKHNlbGYs
IGFyZ3MpCglQeU9iamVjdCAqc2VsZjsKCVB5T2JqZWN0ICphcmdzOwp7CglpZiAoIVB5QXJn
X1BhcnNlVHVwbGUgKGFyZ3MsICIiKSkgewoJCXJldHVybiBOVUxMOwoJfSBlbHNlIHsKCQlQ
eUZyYW1lT2JqZWN0ICpmLCAqYmFjazsKCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRo
cmVhZFN0YXRlX0dFVCgpOwoJCWYgPSBidWlsZF9jb250aW51YXRpb25fZnJhbWUodHN0YXRl
LT5mcmFtZSk7CgkJaWYgKGY9PU5VTEwpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBlbnN1cmUg
dGhhdCBiYWNrJ3MgY2FsbGVyIGlzIGEgY29udGludWF0aW9uIGFzIHdlbGwgKi8KCQliYWNr
ID0gZi0+Zl9iYWNrOwoJCWlmIChiYWNrICE9IE5VTEwgJiYgYmFjay0+Zl9iYWNrICE9IE5V
TEwpIHsKCQkJaWYgKGJ1aWxkX2NvbnRpbnVhdGlvbl9mcmFtZShiYWNrLT5mX2JhY2spID09
IE5VTEwpCgkJCQlyZXR1cm4gTlVMTDsKCQl9CgkKCQlQeV9JTkNSRUYgKGYpOwoJCS8qIGdv
b2Qgc28gZmFyLCBqdXN0IHRoYXQgd2UgbmVlZCB0byBsZXQgdGhlIGV4ZWN1dGlvbiBmaW5p
c2guICovCgkJLyogdGhlcmVmb3JlLCB3ZSBjaGFuZ2UgdGhlIGV4ZWN1dG9yIGFnYWluLCB0
byBnZXQgYSBjYWxsYmFjayAqLwoJCWYtPmZfZXhlY3V0ZSA9IGdldGNjX2NhdGNoX2ZyYW1l
IDsKCQlmLT5mX3RlbXBfdmFsID0gKFB5T2JqZWN0ICopIGY7CgkJUHlfREVDUkVGKGYtPmZf
ZGlzcGF0Y2hlcik7CgkJcmV0dXJuIFB5X1Vud2luZFRva2VuOwoJfQp9CgpQeU9iamVjdCAq
IGdldGNjX2NhdGNoX2ZyYW1lKGYsIHBhc3NlZF9yZXR2YWwpCglQeUZyYW1lT2JqZWN0ICog
ZjsKCVB5T2JqZWN0ICogcGFzc2VkX3JldHZhbDsKewoJUHlGcmFtZU9iamVjdCAqZmI7Cgkv
KgoJICBIZXJlIHdlIGFyZSBhZ2FpbiwgYWZ0ZXIgdGhlIGN1cnJlbnQgZXhlY3V0b3IgaGFz
IGZpbmlzaGVkCgkgIHRoZSBsYXN0IGZ1bmN0aW9uIGNhbGwgdG8gZ2V0Y2MuIFdlIGZpbmFs
aXplIG91ciBmcmFtZXMKCSAgbm93IGFuZCByZXR1cm4gb3VyIGNvbnRpbnVhdGlvbiBmcmFt
ZS4KCSovCgoJLyogYmUgc3VyZSB0aGF0IGYgYW5kIHBhc3NlZF9yZXR2YWwgYXJlIGlkZW50
aWNhbCAqLwoJaWYoZiE9KFB5RnJhbWVPYmplY3QqKXBhc3NlZF9yZXR2YWwpIHsKCQlQeUVy
cl9TZXRTdHJpbmcgKFB5RXhjX1N5c3RlbUVycm9yLCAid3JvbmcgdmFsdWUgaW4gZ2V0Y2Mh
Iik7CgkJcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4sIGJ1dCBiZSBzYWZlICovCgl9
CgkvKiBub3cgZmluYWxpemUgdGhpcyBjb250aW51YXRpb24gKi8KCWYtPmZfZXhlY3V0ZSA9
IHRocm93X2NvbnRpbnVhdGlvbjsKCWZiID0gZi0+Zl9iYWNrOwoJUHlfSU5DUkVGKGZiKTsg
Lyogc2luY2UgZXZhbF9jb2RlIHdpbGwgZWF0IG9uZSAqLwoJaWYgKHNldF9leGVjdXRpb25f
c3RhdGUoZiwgZmIpID09IE5VTEwpCgkJcmV0dXJuIDA7CgkvKiBnaXZlIHRoZSBmcmFtZSBi
YWNrIG5vdywgYnV0IHJ1biB0aGUgY29weSAqLwoJZi0+Zl90c3RhdGUtPmZyYW1lID0gZmI7
CglmYi0+Zl90ZW1wX3ZhbCA9IHBhc3NlZF9yZXR2YWw7CglQeV9ERUNSRUYoZi0+Zl9kaXNw
YXRjaGVyKTsgLyogd2lsbCBiZSBhc3NpZ25lZCBhbmQgaW5jcmVmJ2Qgb24gdW53aW5kICov
CglyZXR1cm4gUHlfVW53aW5kVG9rZW47Cn0KCgovKiAKdmVyeSBtdWNoIHNpbXBsZXIgYW5k
IGVhc2llciB0byB1c2UgaXMgdGhpcwpnZXRwY2MsIGdldCBhIHBhcmVudCdzIGN1cnJlbnQg
Y29udGludWF0aW9uCiovCgpzdGF0aWMgUHlPYmplY3QgKgpidWlsdGluX2dldHBjYyAoc2Vs
ZiwgYXJncykKCVB5T2JqZWN0ICpzZWxmOwoJUHlPYmplY3QgKmFyZ3M7CnsKCWludCBsZXZl
bCA9IDE7CglpZiAoIVB5QXJnX1BhcnNlVHVwbGUgKGFyZ3MsICJ8aSIsICZsZXZlbCkpIHsK
CQlyZXR1cm4gTlVMTDsKCX0gZWxzZSBpZiAobGV2ZWwgPD0gMCkgewoJCS8qIHVzZSB0aGUg
dHJpY2t5IGdldGNjIHZlcnNpb24uICovCgkJUHlPYmplY3QgKnJldDsKCQlhcmdzID0gUHlU
dXBsZV9OZXcoMCk7IC8qIG5ldmVyIGZhaWxzICovCgkJcmV0ID0gYnVpbHRpbl9nZXRjYyhz
ZWxmLCBhcmdzKTsKCQlQeV9ERUNSRUYoYXJncyk7CgkJcmV0dXJuIHJldDsKCX0gZWxzZSB7
CgkJUHlGcmFtZU9iamVjdCAqZjsKCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVh
ZFN0YXRlX0dFVCgpOwoJCS8qIG1ha2UgYSBjb250aW51YXRpb24gZnJvbSB0aGUgdHJ1ZSBj
YWxsZXIgKi8KCQlmID0gdHN0YXRlLT5mcmFtZTsKCQl3aGlsZSAoZiAhPSBOVUxMICYmIGxl
dmVsLS0pIAoJCQlmID0gZmluZF9jYWxsZXJfZW50cnkoZik7CgkJaWYgKGY9PU5VTEwpIHsK
CQkJUHlFcnJfU2V0U3RyaW5nIChQeUV4Y19WYWx1ZUVycm9yLCAicGFyYW1ldGVyIGV4Y2Vl
ZHMgY3VycmVudCBuZXN0aW5nIGxldmVsIik7CgkJCXJldHVybiBOVUxMOwoJCX0KCQkvKiBt
YWtlIHN1cmUgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiAqLwoJCWYgPSBidWlsZF9jb250aW51
YXRpb25fZnJhbWUoZik7CgkJUHlfWElOQ1JFRiAoZik7CgkJewoJCQkvKiBhY3RpdmF0ZSB0
aGUgY2FsbGd1YXJkIHNlY3VyaXR5IGZvciB0aGUgd2hvbGUgY2hhaW4gKi8KCQkJUHlGcmFt
ZU9iamVjdCAqeCA9IGY7CgkJCXdoaWxlICh4ICE9IE5VTEwgJiYgeC0+Zl9jYWxsZ3VhcmQ9
PU5VTEwpIHsKCQkJCXgtPmZfY2FsbGd1YXJkID0gcHJvdGVjdF90aGlzX2ZyYW1lOwoJCQkJ
eD14LT5mX2JhY2s7CgkJCX0KCQl9CgkJcmV0dXJuIChQeU9iamVjdCAqKSBmOwoJfQp9Cgov
KiB2aWV3aW5nIHRoZSBzdGFjayBvZiBhIGZyYW1lICovCgpzdGF0aWMgUHlPYmplY3QgKgpi
dWlsdGluX2dldHN0YWNrIChzZWxmLCBhcmdzKQoJUHlPYmplY3QgKnNlbGY7CglQeU9iamVj
dCAqYXJnczsKewoJUHlGcmFtZU9iamVjdCAqZjsKCWlmICghUHlBcmdfUGFyc2VUdXBsZSAo
YXJncywgIk8hIiwgJlB5RnJhbWVfVHlwZSwgJmYpKSB7CgkJcmV0dXJuIE5VTEw7Cgl9IGVs
c2UgewoJCXJldHVybiBzdGFja190b190dXBsZShmKTsKCX0gCn0KCgoKc3RhdGljIFB5TWV0
aG9kRGVmIGNvbnRpbnVhdGlvbl9tZXRob2RzW10gPSB7CiAgeyJwdXRjYyIsCShQeUNGdW5j
dGlvbilidWlsdGluX3B1dGNjLCAxfSwKICB7ImdldGNjIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0
aW5fZ2V0Y2MsIDF9LAogIHsiZ2V0cGNjIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2V0cGNj
LCAxfSwKICB7ImdldHN0YWNrIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2V0c3RhY2ssIDF9
LAogIHtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCn07CgoKLyogSW5pdGlhbGl6YXRp
b24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdGNvbnRp
bnVhdGlvbikgKi8KCi8qIHZlcnNpb24gY2hlY2sgKi8KCmludCBjaGVja192ZXJzaW9uKCkK
ewoJY29uc3QgY2hhciAqc3lzOwoJc3lzID0gUHlfR2V0VmVyc2lvbigpOwoJaWYgKHN0cm5j
bXAoc3lzLCBQWV9WRVJTSU9OLCBzdHJsZW4oUFlfVkVSU0lPTikpICE9IDApIHsKCQlyZXR1
cm4gMDsKCX0KCXJldHVybiAxOwp9CgoKI2lmZGVmIF9NU0NfVkVSCl9kZWNsc3BlYyhkbGxl
eHBvcnQpCiNlbmRpZgp2b2lkCmluaXRjb250aW51YXRpb24oKQp7CglQeU9iamVjdCAqbSwg
KmQ7CgoKCWlmICghY2hlY2tfdmVyc2lvbigpKSB7CgkJUHlFcnJfU2V0U3RyaW5nIChQeUV4
Y19JbXBvcnRFcnJvciwgImFyZ3VtZW50IG11c3QgYmUgYSBmcmFtZSBvYmplY3QiKTsKCQly
ZXR1cm47Cgl9CgoJLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25z
ICovCgltID0gUHlfSW5pdE1vZHVsZSgiY29udGludWF0aW9uIiwgY29udGludWF0aW9uX21l
dGhvZHMpOwoKCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxl
ICovCglkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKCUVycm9yT2JqZWN0ID0gUHlFcnJfTmV3
RXhjZXB0aW9uKCJjb250aW51YXRpb24uZXJyb3IiLCBOVUxMLCBOVUxMKTsKCVB5RGljdF9T
ZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKfQo=
--------------EDD81E724667AA03453E0C67--