Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 03 Nov 1996 13:11:20 -0800
From:      Amancio Hasty <hasty@rah.star-gate.com>
To:        hackers@freebsd.org
Subject:   Geomview, Mbone and FreeBSD...
Message-ID:  <199611032111.NAA10511@rah.star-gate.com>

next in thread | raw e-mail | index | archive | help
This is a multipart MIME message.

--===_0_Sun_Nov__3_13:11:14_PST_1996
Content-Type: text/plain; charset=us-ascii

Are there any stdio experts which can lend a hand in porting Geomview?

Bill and a couple of people have develop a cool interface to track
mbone traffic using a 3d map of the world showing off the tunnels
as ballistic trajectories.

At any rate, the file giving us a problem is futil.c . It likes to 
manipulate the stdio data structures and does seeks on stdio.

Here is the file and if requested I can give out a pointer to  the 
Geomview tar file:



--===_0_Sun_Nov__3_13:11:14_PST_1996
Content-Type: application/octet-stream
Content-Description: futil.c
Content-Transfer-Encoding: base64

LyogQ29weXJpZ2h0IChjKSAxOTkyIFRoZSBHZW9tZXRyeSBDZW50ZXI7IFVuaXZlcnNpdHkg
b2YgTWlubmVzb3RhCiAgIDEzMDAgU291dGggU2Vjb25kIFN0cmVldDsgIE1pbm5lYXBvbGlz
LCBNTiAgNTU0NTQsIFVTQTsKICAgClRoaXMgZmlsZSBpcyBwYXJ0IG9mIGdlb212aWV3L09P
R0wuIGdlb212aWV3L09PR0wgaXMgZnJlZSBzb2Z0d2FyZTsKeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yIG1vZGlmeSBpdCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBnaXZlbiBpbgp0
aGUgZmlsZSBDT1BZSU5HLCB3aGljaCB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYWxvbmcg
d2l0aCB0aGlzIGZpbGUuClRoaXMgYW5kIG90aGVyIHJlbGF0ZWQgc29mdHdhcmUgbWF5IGJl
IG9idGFpbmVkIHZpYSBhbm9ueW1vdXMgZnRwIGZyb20KZ2VvbS51bW4uZWR1OyBlbWFpbDog
c29mdHdhcmVAZ2VvbS51bW4uZWR1LiAqLwpzdGF0aWMgY2hhciAqY29weXJpZ2h0ID0gIkNv
cHlyaWdodCAoQykgMTk5MiBUaGUgR2VvbWV0cnkgQ2VudGVyIjsKCi8qIEF1dGhvcnM6IENo
YXJsaWUgR3VubiwgU3R1YXJ0IExldnksIFRhbWFyYSBNdW56bmVyLCBNYXJrIFBoaWxsaXBz
ICovCgovKiAkSGVhZGVyOiAvdS9nY2cvbmdyYXAvc3JjL2xpYi9vb2dsL3V0aWwvUkNTL2Z1
dGlsLmMsdiAxLjMyIDE5OTQvMDgvMjYgMDQ6MTE6Mjcgc2xldnkgRXhwICQgKi8KCi8qCiAq
IEdlb21ldHJ5IG9iamVjdCByb3V0aW5lcwogKgogKiBVdGlsaXR5IHJvdXRpbmVzLCB1c2Vm
dWwgZm9yIG1hbnkgb2JqZWN0cwogKgogKiBpbnQKICogZmdldG5mKGZpbGUsIG5mbG9hdHMs
IGZsb2F0cCwgYmluYXJ5KQogKglSZWFkIGFuIGFycmF5IG9mIGZsb2F0cyBmcm9tIGEgZmls
ZSBpbiAiYXNjaWkiIG9yICJiaW5hcnkiIGZvcm1hdC4KICoJUmV0dXJucyBudW1iZXIgb2Yg
ZmxvYXRzIHN1Y2Nlc3NmdWxseSByZWFkLCBzaG91bGQgPSBuZmxvYXRzLgogKgkiQmluYXJ5
IiBtZWFucyAiSUVFRSAzMi1iaXQgZmxvYXRpbmctcG9pbnQiIGZvcm1hdC4KICoKICogaW50
CiAqIGZnZXRuaShGSUxFICpmaWxlLCBpbnQgbmludHMsIGludCAqaW50c3AsIGludCBiaW5h
cnkpCiAqCVJlYWQgYW4gYXJyYXkgb2YgaW50cyBmcm9tIGEgZmlsZSBpbiAiYXNjaWkiIG9y
ICJiaW5hcnkiIGZvcm1hdC4KICoJUmV0dXJucyBudW1iZXIgb2YgaW50cyBzdWNjZXNzZnVs
bHkgcmVhZCwgc2hvdWxkID0gbmludHMuCiAqCSJCaW5hcnkiIG1lYW5zICIzMi1iaXQgYmln
LWVuZGlhbiIgaW50ZWdlciBmb3JtYXQuCiAqCiAqIGludAogKiBmZ2V0bnMoRklMRSAqZmls
ZSwgaW50IG5zaG9ydHMsIHNob3J0ICppbnRzcCwgaW50IGJpbmFyeSkKICoJUmVhZCBhbiBh
cnJheSBvZiBzaG9ydHMgZnJvbSBhIGZpbGUgaW4gImFzY2lpIiBvciAiYmluYXJ5IiBmb3Jt
YXQuCiAqCVJldHVybnMgbnVtYmVyIG9mIHNob3J0cyBzdWNjZXNzZnVsbHkgcmVhZCwgc2hv
dWxkID0gbmludHMuCiAqCSJCaW5hcnkiIG1lYW5zICIxNi1iaXQgYmlnLWVuZGlhbiIgaW50
ZWdlciBmb3JtYXQuCiAqCiAqIGludAogKiBmZXhwZWN0c3RyKEZJTEUgKmZpbGUsIGNoYXIg
KnN0cmluZykKICoJRXhwZWN0IHRoZSBnaXZlbiBzdHJpbmcgdG8gYXBwZWFyIGltbWVkaWF0
ZWx5IG9uIGZpbGUuCiAqCVJldHVybiAwIGlmIHRoZSBjb21wbGV0ZSBzdHJpbmcgaXMgZm91
bmQsCiAqCWVsc2UgdGhlIG9mZnNldCsxIG9mIHRoZSBsYXN0IG1hdGNoZWQgY2hhciB3aXRo
aW4gc3RyaW5nLgogKglUaGUgZmlyc3QgdW5tYXRjaGVkIGNoYXIgaXMgdW5nZXRjJ2QuCiAq
CiAqIGludAogKiBmZXhwZWN0dG9rZW4oRklMRSAqZmlsZSwgY2hhciAqc3RyaW5nKQogKglF
eHBlY3QgdGhlIGdpdmVuIHN0cmluZyB0byBhcHBlYXIgb24gdGhlIGZpbGUsIHBvc3NpYmx5
IGFmdGVyCiAqCXNraXBwaW5nIHNvbWUgd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzLgogKglS
ZXR1cm4gMCBpZiBmb3VuZCwgZWxzZSB0aGUgb2Zmc2V0KzEgb2YgbGFzdCBtYXRjaGVkIGNo
YXIgaW4gc3RyaW5nLgogKglUaGUgZmlyc3QgdW5tYXRjaGVkIGNoYXIgaXMgdW5nZXRjJ2Qu
CiAqCiAqIGludCBmbmV4dGMoRklMRSAqZiwgaW50IGZsYWdzKQogKglBZHZhbmNlcyBmIHRv
IHRoZSBuZXh0ICJpbnRlcmVzdGluZyIgY2hhcmFjdGVyIGFuZAogKglyZXR1cm5zIGl0LiAg
VGhlIHJldHVybmVkIGNoYXIgaXMgdW5nZXRjJ2VkIHNvIHRoZSBuZXh0IGdldGMoKQogKgl3
aWxsIHlpZWxkIHRoZSBzYW1lIHZhbHVlLgogKglJbnRlcmVzdGluZyBkZXBlbmRzIG9uIGZs
YWdzOgogKgkgIDAgOiBTa2lwIGJsYW5rcywgdGFicywgbmV3bGluZXMsIGFuZCBjb21tZW50
cyAoIy4uLlxuKS4KICoJICAxIDogU2tpcCBibGFua3MsIHRhYnMsIGFuZCBjb21tZW50cywg
YnV0IG5ld2xpbmVzIGFyZSBpbnRlcmVzdGluZwogKgkJKGluY2x1ZGluZyB0aGUgXG4gdGhh
dCB0ZXJtaW5hdGVzIGEgY29tbWVudCkuCiAqCSAgMiA6IFNraXAgYmxhbmtzLCB0YWJzLCBh
bmQgbmV3bGluZXMsIGJ1dCBzdG9wIGF0ICMuCiAqCSAgMyA6IFNraXAgYmxhbmtzIGFuZCB0
YWJzIGJ1dCBzdG9wIGF0ICMgb3IgXG4uCiAqCiAqIGludCBhc3luY19mbmV4dGMoRklMRSAq
ZiwgaW50IGZsYWdzKQogKglMaWtlIGZuZXh0YygpIGFib3ZlLCBidXQgZ3VhcmFudGVlcyBu
b3QgdG8gYmxvY2sgaWYgbm8gZGF0YSBpcwogKglpbW1lZGlhdGVseSBhdmFpbGFibGUuICBJ
dCByZXR1cm5zIGVpdGhlciBhbiBpbnRlcmVzdGluZyBjaGFyYWN0ZXIsCiAqCUVPRiwgb3Ig
dGhlIHNwZWNpYWwgY29kZSBOT0RBVEEgKD09IC0yKS4KICoKICogaW50IGFzeW5jX2dldGMo
RklMRSAqZikKICoJTGlrZSBnZXRjKCksIGJ1dCBndWFyYW50ZWVzIG5vdCB0byBibG9jay4g
IFJldHVybnMgTk9EQVRBIGlmCiAqCW5vdGhpbmcgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxl
LgogKgogKiBjaGFyICpmdG9rZW4oRklMRSAqZiwgaW50IGZsYWdzKQogKglTa2lwcyB1bmlu
dGVyZXN0aW5nIGNoYXJhY3RlcnMgd2l0aCBmbmV4dGMoZiwgZmxhZ3MpLAogKgl0aGVuIHJl
dHVybnMgYSAidG9rZW4iIC0gc3RyaW5nIG9mIGNvbnNlY3V0aXZlIGludGVyZXN0aW5nIGNo
YXJhY3RlcnMuCiAqCVJldHVybnMgTlVMTCBpZiBFT0YgaXMgcmVhY2hlZCB3aXRoIG5vIHRv
a2VuLCBvciBpZgogKglmbGFncyBzcGVjaWZpZXMgc3RvcHBpbmcgYXQgZW5kLW9mLWxpbmUg
YW5kIHRoaXMgaXMgZW5jb3VudGVyZWQgd2l0aAogKglubyB0b2tlbiBmb3VuZC4KICoJVGhl
IHRva2VuIGlzIGVmZmVjdGl2ZWx5IHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCB3aWxsIGJl
CiAqCW92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IGZ0b2tlbigpIGNhbGwuCiAqCiAqIGNoYXIg
KmZkZWxpbXRvayhjaGFyICpkZWxpbXMsIEZJTEUgKmYsIGludCBmbGFncykKICoJTGlrZSBm
dG9rZW4oKSwgYnV0IHNwZWNpYWxseSBoYW5kbGVzIHRoZSBjaGFyYWN0ZXJzIGluIGRlbGlt
c1tdLgogKglJZiBvbmUgYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b2tlbiwg
aXQncyByZXR1cm5lZCBhcyAKICoJYSBzaW5nbGUtY2hhcmFjdGVyIHRva2VuLgogKglJZiBh
IG1lbWJlciBvZiBkZWxpbXNbXSBhcHBlYXJzIGFmdGVyIG90aGVyIGNoYXJhY3RlcnMgaGF2
ZSBiZWVuCiAqCWFjY3VtdWxhdGVkLCBpdCdzIGNvbnNpZGVyZWQgdG8gdGVybWluYXRlIHRo
ZSB0b2tlbi4KICoJU28gc3VjY2Vzc2l2ZSBjYWxscyB0byBmZGVsaW10b2soIigpIiwgZiwg
MCkKICoJb24gYSBmaWxlIGNvbnRhaW5pbmcgIChmcmVkIHNtaXRoKQogKgl3b3VsZCByZXR1
cm4gIigiLCAiZnJlZCIsICJzbWl0aCIsIGFuZCAiKSIuCiAqCUJlaGF2aW9yIGlzIHVuZGVm
aW5lZCBpZiBvbmUgb2YgdGhlIHByZWRlZmluZWQgZGVsaW1pdGVycwogKgkod2hpdGUgc3Bh
Y2Ugb3IgIykgYXBwZWFycyBpbiBkZWxpbXNbXS4gIEV4cGxpY2l0IHF1b3RpbmcKICoJKHdp
dGggIiwgJyBvciBcKSBvdmVycmlkZXMgZGV0ZWN0aW9uIG9mIGRlbGltaXRlcnMuCiAqCiAq
IGludCBmZ2V0dHJhbnNmb3JtKEZJTEUgKmYsIGludCBudHJhbnNmb3JtcywgZmxvYXQgKnRy
YW5zZm9ybXMsIGludCBiaW5hcnkpCiAqCVJlYWRzIDR4NCBtYXRyaWNlcyBmcm9tIEZJTEUu
ICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0cmljZXMgZm91bmQsCiAqCXVwIHRvIG50cmFu
c2Zvcm1zLiAgUmV0dXJucyAwIGlmIG5vIG51bWJlcnMgYXJlIGZvdW5kLgogKglPbiBmaW5k
aW5nIGluY29tcGxldGUgbWF0cmljZXMgKG5vdCBhIG11bHRpcGxlIG9mIDE2IGZsb2F0cykK
ICoJcmV0dXJucyAtMSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSB3aG9sZSBtYXRyaWNl
cyB3ZXJlIGZvdW5kLgogKglNYXRyaWNlcyBhcmUgZXhwZWN0ZWQgaW4gdGhlIGZvcm0gdXNl
ZCB0byB0cmFuc2Zvcm0gYSByb3cgdmVjdG9yCiAqCW11bHRpcGxpZWQgb24gdGhlIGxlZnQs
IGkuZS4gIHAgKiBUIC0+IHAnOyB0aHVzIEV1Y2xpZGVhbiB0cmFuc2xhdGlvbnMKICoJYXBw
ZWFyIGluIHRoZSBsYXN0IHJvdy4KICoKICogaW50IGZwdXR0cmFuc2Zvcm0oRklMRSAqZiwg
aW50IG50cmFuc2Zvcm1zLCBmbG9hdCAqdHJhbnNmb3JtcywgaW50IGJpbmFyeSkKICoJV3Jp
dGVzIDR4NCBtYXRyaWNlcyB0byBGSUxFLiAgUmV0dXJucyB0aGUgbnVtYmVyIHdyaXR0ZW4s
IGkuZS4KICoJbnRyYW5zZm9ybXMgdW5sZXNzIGFuIGVycm9yIG9jY3Vycy4KICoKICogaW50
IGZwdXRuZihGSUxFICpmLCBpbnQgbmZsb2F0cywgZmxvYXQgKmZ2LCBpbnQgYmluYXJ5KQog
KglXcml0ZXMgJ25mbG9hdHMnIGZsb2F0cyB0byB0aGUgZ2l2ZW4gZmlsZS4gIEFTQ0lJIGlz
IGluICVnIGZvcm1hdCwKICoJc2VwYXJhdGVkIGJ5IGJsYW5rcy4KICoKICogRklMRSAqZnN0
cm9wZW4oc3RyLCBsZW4sIG1vZGUpCiAqCU9wZW5zIGEgc3RyaW5nIChidWZmZXIpIGFzIGEg
ImZpbGUiLgogKglNb2RlIGlzICJyIiBvciAidyIgYXMgdXN1YWwuCiAqCVJlYWRzIHNob3Vs
ZCByZXR1cm4gRU9GIG9uIGVuY291bnRlcmluZyBlbmQtb2Ytc3RyaW5nLAogKgl3cml0ZXMg
cGFzdCBlbmQtb2Ytc3RyaW5nIHNob3VsZCBhbHNvIHlpZWxkIGFuIGVycm9yIHJldHVybi4K
ICoJZmNsb3NlKCkgc2hvdWxkIGJlIHVzZWQgdG8gZnJlZSB0aGUgRklMRSBhZnRlciB1c2Uu
CiAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNs
dWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcu
aD4KI2lmbmRlZiBOZVhUCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZmRlZiBBSVgK
I2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5j
bHVkZSAib29nbHV0aWwuaCIKCiAgIC8qIFNwZWVkeSBiaW5hcnkgSS9PIGlmIHRoZSBtYWNo
aW5lIGlzIGtub3duIHRvIGJlIGJpZy1lbmRpYW4gKi8KI2lmIG02OGsgfHwgbWM2ODAwMCB8
fCBtaXBzIHx8IHNwYXJjIHx8IGhwdXggfHwgQUlYCiMgZGVmaW5lIEJJR19FTkRJQU4gMQoj
ZW5kaWYKCiNpZm5kZWYgQklHX0VORElBTgojIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4JLyog
Zm9yIG50b2hsKCksIGV0Yy4gKi8KI2VuZGlmCgojaWZkZWYgaHB1eAkvKiBIYWNrIG5hbWVz
IG9mIHN0ZGlvIGJ1ZmZlciBmaWVsZHMgKi8KI2RlZmluZSBfY250IF9fY250CiNkZWZpbmUg
X2Jhc2UgX19iYXNlCiNkZWZpbmUgX3B0ciBfX3B0cgojZW5kaWYgCgojaWZkZWYgX19GcmVl
QlNEX18JLyogWFhYIHdjZiBhY3R1YWxseSA0LjQgQlNELCB0aGlzIGlzIGp1c3QgYSBndWVz
cyAqLwojZGVmaW5lIF9jbnQJX2JmLl9zaXplCiNkZWZpbmUgX2Jhc2UJX2JmLl9iYXNlCiNk
ZWZpbmUJX3B0cglfcAojZGVmaW5lIF9mbGFnCV9mbGFncwojZGVmaW5lIF9JT01ZQlVGCTAK
I2RlZmluZSBfSU9FT0YJX19TRU9GCiNkZWZpbmUgX0lPRVJSCV9fU0VSUgojZW5kaWYKCiNp
ZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoX0lPX1NURElPX0gpCgkvKiBIYW5k
bGUgb2xkZXIgKHByZS0xLjApIExpbnV4IHN0ZGlvIGZpZWxkcywKCSAqIG1ha2luZyB0aGVt
IGxvb2sgbGlrZSBsYXRlciBvbmVzLgoJICovCiNkZWZpbmUJIF9JT19yZWFkX2Jhc2UJX2Jh
c2UKI2RlZmluZSAgX0lPX3JlYWRfcHRyCV9ncHRyCiNkZWZpbmUJIF9JT19yZWFkX2VuZAlf
ZWdwdHIKI2VuZGlmCgoJLyogUGVlciBpbnRvIGEgc3RkaW8gYnVmZmVyLCBjaGVjayB3aGV0
aGVyIGl0IGhhcyBkYXRhIGF2YWlsYWJsZQoJICogZm9yIHJlYWRpbmcuICBBbG1vc3QgcG9y
dGFibGUgZ2l2ZW4gdGhlIGNvbW1vbiBzdGRpbyBhbmNlc3RyeS4KCSAqLwojaWZkZWYgX19s
aW51eF9fCiNkZWZpbmUgRl9IQVNEQVRBKGYpICAoKGYpLT5fSU9fcmVhZF9wdHIgPCAoZikt
Pl9JT19yZWFkX2VuZCkKI2Vsc2UKI2RlZmluZSBGX0hBU0RBVEEoZikgICgoZiktPl9jbnQg
PiAwKQojZW5kaWYKCgppbnQKZm5leHRjKEZJTEUgKmYsIGludCBmbGFncykKewoJcmVnaXN0
ZXIgaW50IGM7CgoJYyA9IGdldGMoZik7Cglmb3IoOzspIHsKCSAgICBzd2l0Y2goYykgewoJ
ICAgIGNhc2UgRU9GOgoJCXJldHVybihFT0YpOwoKCSAgICBjYXNlICcgJzoKCSAgICBjYXNl
ICdcdCc6CgkJYnJlYWs7CQkJLyogQWx3YXlzIHNraXAgYmxhbmtzIGFuZCB0YWJzICovCgoJ
ICAgIGNhc2UgJyMnOgoJCWlmKGZsYWdzICYgMikJCS8qIDI6IHN0b3Agb24gY29tbWVudHMs
IGVsc2Ugc2tpcCAqLwoJCSAgICBnb3RvIGZpbTsKCgkJd2hpbGUoKGMgPSBnZXRjKGYpKSAh
PSAnXG4nICYmIGMgIT0gRU9GKQoJCSAgICA7CgkJY29udGludWU7CQkvKiBSZXNjYW4gdGhp
cyBjICovCgoJICAgIGNhc2UgJ1xuJzoKCQlpZighKGZsYWdzICYgMSkpCS8qIDE6IHN0b3Ag
b24gXG4ncywgZWxzZSBza2lwIHRoZW0gKi8KCQkgICAgYnJlYWs7CgkJCQkJLyogZmxhZ3Mm
MSA9PiBmYWxsIGludG8gZGVmYXVsdCAqLwoKCSAgICBkZWZhdWx0OgoJICAgICBmaW06CgkJ
dW5nZXRjKGMsIGYpOwoJCXJldHVybihjKTsKCSAgICB9CgoJICAgIGMgPSBnZXRjKGYpOwoJ
fQp9CgoKZmxvYXQgZl9wb3cxMFsxMV0gPSB7IDFlMCwgMWUxLCAxZTIsIDFlMywgMWU0LCAx
ZTUsIDFlNiwgMWU3LCAxZTgsIDFlOSwgMWUxMCB9OwoKI2RlZmluZSBmUG93MTAobikgICgo
dW5zaWduZWQpKG4pID4gMTAgPyBmcG93MTAobikgOiBmX3BvdzEwW25dKQoKZmxvYXQKZnBv
dzEwKGludCBuKQp7CglyZWdpc3RlciBpbnQgazsKCXJlZ2lzdGVyIGZsb2F0IHY7CgoJaWYo
KGsgPSBuKSA8IDApCgkJayA9IC1rOwoJdiA9IGZfcG93MTBbayAmIDddOwoJaWYoayA+PSA4
KSB7CgkJZmxvYXQgdW5pdCA9IDFlODsKCgkJayA+Pj0gMzsKCQlmb3IoOzspIHsKCQkJaWYo
ayAmIDEpCgkJCQl2ICo9IHVuaXQ7CgkJCWlmKChrID4+PSAxKSA9PSAwKQoJCQkJYnJlYWs7
CgkJCXVuaXQgKj0gdW5pdDsKCQl9Cgl9CglyZXR1cm4obiA8IDAgPyAxLjAvdiA6IHYpOwp9
CgovKgogKiBSZWFkIGFuIGFycmF5IG9mIHdoaXRlLXNwYWNlLXNlcGFyYXRlZCBmbG9hdHMg
ZnJvbSBmaWxlICdmJyBpbiBBU0NJSSwgZmFzdC4KICogUmV0dXJucyB0aGUgbnVtYmVyIHN1
Y2Nlc3NmdWxseSByZWFkLgogKi8KaW50CmZnZXRuZihyZWdpc3RlciBGSUxFICpmLCBpbnQg
bWF4ZiwgZmxvYXQgKmZ2LCBpbnQgYmluYXJ5KQp7CglpbnQgbmdvdDsKCWZsb2F0IHY7Cgly
ZWdpc3RlciBpbnQgYyA9IEVPRjsKCXJlZ2lzdGVyIGxvbmcgbjsKCWxvbmcgdzsKCWludCBz
LCBlcywgbmQsIGFueTsKCglpZihiaW5hcnkpIHsKI2lmIEJJR19FTkRJQU4KCQkvKiBFYXN5
IC0tIG91ciBuYXRpdmUgZmxvYXRpbmcgcG9pbnQgPT0gYmlnLWVuZGlhbiBJRUVFICovCgkJ
cmV0dXJuIGZyZWFkKChjaGFyICopZnYsIHNpemVvZihmbG9hdCksIG1heGYsIGYpOwojZWxz
ZSAvKiBub3QgbmF0aXZlIGJpZy1lbmRpYW4gSUVFRSAqLwoJCWZvcihuPTA7IG48bWF4ZiAm
JiBmcmVhZCgoY2hhciAqKSZ3LHNpemVvZihsb25nKSwxLGYpID4gMDsgbisrKQoJCSAgICAq
KGxvbmcgKikmZnZbbl0gPSBudG9obCh3KTsKCQlyZXR1cm4gbjsKI2VuZGlmIC8qIG5vdCBu
YXRpdmUgYmlnLWVuZGlhbiBJRUVFICovCgl9CgoJLyogUmVhZCBBU0NJSSBmb3JtYXQgZmxv
YXRzICovCglmb3IobmdvdCA9IDA7IG5nb3QgPCBtYXhmOyBuZ290KyspIHsKCQlpZihmbmV4
dGMoZiwgMCkgPT0gRU9GKQoJCQlyZXR1cm4obmdvdCk7CgkJbiA9IDA7CgkJcyA9IDA7CgkJ
bmQgPSAwOwoJCWFueSA9IDA7CgkJaWYoKGMgPSBnZXRjKGYpKSA9PSAnLScpIHsKCQkJcyA9
IDE7CgkJCWMgPSBnZXRjKGYpOwoJCX0KCQl3aGlsZShjID49ICcwJyAmJiBjIDw9ICc5Jykg
ewoJCQluID0gbioxMCArIGMgLSAnMCc7CgkJCW5kKys7CgkJCWlmKG4gPj0gMjE0NzQ4MzY0
KSB7CS8qIDJeMzEgLyAxMCAqLwoJCQkJdiA9IGFueSA/IHYqZlBvdzEwKG5kKSArIChmbG9h
dCluIDogKGZsb2F0KW47CgkJCQluZCA9IG4gPSAwOwoJCQkJYW55ID0gMTsKCQkJfQoJCQlj
ID0gZ2V0YyhmKTsKCQl9CgkJdiA9IGFueSA/IHYqZlBvdzEwKG5kKSArIChmbG9hdCluIDog
KGZsb2F0KW47CgkJYW55ICs9IG5kOwoJCWlmKGMgPT0gJy4nKSB7CgkJCW5kID0gbiA9IDA7
CgkJCXdoaWxlKChjID0gZ2V0YyhmKSkgPj0gJzAnICYmIGMgPD0gJzknKSB7CgkJCQluID0g
bioxMCArIGMgLSAnMCc7CgkJCQluZCsrOwoJCQkJaWYobiA+PSAyMTQ3NDgzNjQpIHsKCQkJ
CQl2ICs9IChmbG9hdCluIC8gZlBvdzEwKG5kKTsKCQkJCQluID0gMDsKCQkJCX0KCQkJfQoJ
CQl2ICs9IChmbG9hdCluIC8gZlBvdzEwKG5kKTsKCQl9CgkJaWYoYW55ID09IDAgJiYgbmQg
PT0gMCkKCQkJYnJlYWs7CgkJaWYoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKCQkJZXMgPSBu
ZCA9IDA7CgkJCXN3aXRjaChjID0gZ2V0YyhmKSkgewoJCQljYXNlICctJzoKCQkJCWVzID0g
MTsJLyogQW5kIGZhbGwgdGhyb3VnaCAqLwoJCQljYXNlICcrJzoKCQkJCWMgPSBnZXRjKGYp
OwoJCQl9CgkJCW4gPSAwOwoJCQl3aGlsZShjID49ICcwJyAmJiBjIDw9ICc5JykgewoJCQkJ
biA9IG4qMTAgKyBjIC0gJzAnOwoJCQkJbmQrKzsKCQkJCWMgPSBnZXRjKGYpOwoJCQl9CgkJ
CWlmKG5kID09IDApCgkJCQlicmVhazsKCQkJaWYoZXMpIHYgLz0gZlBvdzEwKG4pOwoJCQll
bHNlIHYgKj0gZlBvdzEwKG4pOwoJCX0KCQlmdltuZ290XSA9IHMgPyAtdiA6IHY7Cgl9Cglp
ZihjIT1FT0YpIHVuZ2V0YyhjLCBmKTsKCXJldHVybihuZ290KTsKfQoKCmludApmZ2V0bmko
cmVnaXN0ZXIgRklMRSAqZiwgaW50IG1heGksIGludCAqaXYsIGludCBiaW5hcnkpCnsKCWlu
dCBuZ290OwoJcmVnaXN0ZXIgaW50IGMgPSBFT0Y7CglyZWdpc3RlciBsb25nIG47Cglsb25n
IHc7CglpbnQgcywgYW55OwoKCWlmKGJpbmFyeSkgewojaWYgQklHX0VORElBTgoJCS8qIEVh
c3kgLS0gb3VyIG5hdGl2ZSBmbG9hdGluZyBwb2ludCA9PSBiaWctZW5kaWFuIElFRUUgKi8K
CQlyZXR1cm4gZnJlYWQoKGNoYXIgKilpdiwgc2l6ZW9mKGludCksIG1heGksIGYpOwojZWxz
ZSAvKiBub3QgbmF0aXZlIGJpZy1lbmRpYW4gaW50J3MgKi8KCQlmb3IobiA9IDA7IG4gPCBt
YXhpICYmIGZyZWFkKCZ3LDQsMSxmKSA+IDA7IG4rKykKCQkgICAgaXZbbl0gPSBudG9obCh3
KTsKCQlyZXR1cm4gbjsKI2VuZGlmIC8qIG5vdCBuYXRpdmUgYmlnLWVuZGlhbiBpbnQncyAq
LwoJfQoKCS8qIFJlYWQgQVNDSUkgZm9ybWF0IGZsb2F0cyAqLwoJZm9yKG5nb3QgPSAwOyBu
Z290IDwgbWF4aTsgbmdvdCsrKSB7CgkJaWYoZm5leHRjKGYsIDApID09IEVPRikKCQkJcmV0
dXJuKG5nb3QpOwoJCW4gPSAwOwoJCXMgPSAwOwoJCWFueSA9IDA7CgkJaWYoKGMgPSBnZXRj
KGYpKSA9PSAnLScpIHsKCQkJcyA9IDE7CgkJCWMgPSBnZXRjKGYpOwoJCX0KCQl3aGlsZShj
ID49ICcwJyAmJiBjIDw9ICc5JykgewoJCQluID0gbioxMCArIGMgLSAnMCc7CgkJCWFueSA9
IDE7CgkJCWMgPSBnZXRjKGYpOwoJCX0KCQlpZighYW55KQoJCQlicmVhazsKCQlpdltuZ290
XSA9IHMgPyAtbiA6IG47Cgl9CglpZihjIT1FT0YpIHVuZ2V0YyhjLCBmKTsKCXJldHVybihu
Z290KTsKfQoKaW50CmZnZXRucyhyZWdpc3RlciBGSUxFICpmLCBpbnQgbWF4cywgc2hvcnQg
KnN2LCBpbnQgYmluYXJ5KQp7CglpbnQgbmdvdDsKCXJlZ2lzdGVyIGludCBjID0gRU9GOwoJ
cmVnaXN0ZXIgbG9uZyBuOwoJc2hvcnQgdzsKCWludCBzLCBhbnk7CgoJaWYoYmluYXJ5KSB7
CiNpZiBCSUdfRU5ESUFOCgkJLyogRWFzeSAtLSBvdXIgbmF0aXZlIGZsb2F0aW5nIHBvaW50
ID09IGJpZy1lbmRpYW4gSUVFRSAqLwoJCXJldHVybiBmcmVhZCgoY2hhciAqKXN2LCBzaXpl
b2Yoc2hvcnQpLCBtYXhzLCBmKTsKI2Vsc2UgLyogbm90IG5hdGl2ZSBiaWctZW5kaWFuIGlu
dCdzICovCgkJZm9yKG4gPSAwOyBuIDwgbWF4cyAmJiBmcmVhZCgmdywyLDEsZikgPiAwOyBu
KyspCgkJICAgIHN2W25dID0gbnRvaHModyk7CgkJcmV0dXJuIG47CiNlbmRpZiAvKiBub3Qg
bmF0aXZlIGJpZy1lbmRpYW4gaW50J3MgKi8KCX0KCgkvKiBSZWFkIEFTQ0lJIGZvcm1hdCBm
bG9hdHMgKi8KCWZvcihuZ290ID0gMDsgbmdvdCA8IG1heHM7IG5nb3QrKykgewoJCWlmKGZu
ZXh0YyhmLCAwKSA9PSBFT0YpCgkJCXJldHVybihuZ290KTsKCQluID0gcyA9IGFueSA9IDA7
CgkJaWYoKGMgPSBnZXRjKGYpKSA9PSAnLScpIHsKCQkJcyA9IDE7CgkJCWMgPSBnZXRjKGYp
OwoJCX0KCQl3aGlsZShjID49ICcwJyAmJiBjIDw9ICc5JykgewoJCQluID0gbioxMCArIGMg
LSAnMCc7CgkJCWFueSA9IDE7CgkJCWMgPSBnZXRjKGYpOwoJCX0KCQlpZighYW55KQoJCQli
cmVhazsKCQlzdltuZ290XSA9IHMgPyAtbiA6IG47Cgl9CglpZihjIT1FT0YpIHVuZ2V0Yyhj
LCBmKTsKCXJldHVybihuZ290KTsKfQoKLyoKICogQ2hlY2sgZm9yIGEgc3RyaW5nIG9uIGEg
ZmlsZS4KICogSWYgZm91bmQsIHJldHVybiAwLgogKiBJZiBub3QsIHJldHVybiB0aGUgb2Zm
c2V0IG9mIHRoZSBsYXN0IG1hdGNoZWQgY2hhciArMQogKiBhbmQgdW5nZXRjIHRoZSBmYWls
ZWQgY2hhciBzbyB0aGUgY2FsbGVyIGNhbiBzZWUgaXQuCiAqLwppbnQKZmV4cGVjdHN0cihy
ZWdpc3RlciBGSUxFICpmaWxlLCBjaGFyICpzdHIpCnsKCXJlZ2lzdGVyIGNoYXIgKnAgPSBz
dHI7CglyZWdpc3RlciBpbnQgYzsKCgl3aGlsZSgqcCAhPSAnXDAnKSB7CgkgICAgaWYoKGMg
PSBnZXRjKGZpbGUpKSAhPSAqcCsrKSB7CgkJaWYoYyAhPSBFT0YpCgkJICAgIHVuZ2V0Yyhj
LCBmaWxlKTsKCQlyZXR1cm4ocCAtIHN0cik7CgkgICAgfQoJfQoJcmV0dXJuIDA7Cn0KCi8q
CiAqIENoZWNrIGZvciBhIHN0cmluZyBvbiBhIGZpbGUsIHNraXBwaW5nIGxlYWRpbmcgYmxh
bmtzLgogKi8KaW50CmZleHBlY3R0b2tlbihyZWdpc3RlciBGSUxFICpmaWxlLCBjaGFyICpz
dHIpCnsKCSh2b2lkKSBmbmV4dGMoZmlsZSwgMCk7CglyZXR1cm4gZmV4cGVjdHN0cihmaWxl
LCBzdHIpOwp9CgppbnQgZmVzY2FwZShGSUxFICpmKQp7CiAgICBpbnQgbiwgaywgYyA9IGZn
ZXRjKGYpOwoKICAgIHN3aXRjaChjKSB7CgljYXNlICduJzogcmV0dXJuICdcbic7CgljYXNl
ICdiJzogcmV0dXJuICdcYic7CgljYXNlICd0JzogcmV0dXJuICdcdCc7CgljYXNlICdyJzog
cmV0dXJuICdccic7CiAgICB9CiAgICBpZihjIDwgJzAnIHx8IGMgPiAnNycpCglyZXR1cm4g
YzsKICAgIAogICAgbiA9IGMtJzAnOyAgayA9IDI7CiAgICB3aGlsZSgoYyA9IGZnZXRjKGYp
KSA+PSAnMCcgJiYgYyA8PSAnNycpIHsKCW4gPSBuKjggfCBjLScwJzsKCWlmKC0tayA8PSAw
KQoJICAgIHJldHVybiBuOwogICAgfQogICAgaWYoYyAhPSBFT0YpIHVuZ2V0YyhjLCBmKTsK
ICAgIHJldHVybiBuOwp9CgovKgogKiBHZXQgYSB0b2tlbiwgcmV0dXJuIGEgc3RyaW5nIG9y
IE5VTEwuCiAqIFRva2VucyBtYXkgYmUgInF1b3RlZCIgb3IgJ3F1b3RlZCc7IGJhY2tzbGFz
aGVzIGFjY2VwdGVkLgogKiBUaGUgc3RyaW5nIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFu
ZCBzaG91bGQgYmUgY29waWVkIGlmCiAqIG5lZWRlZCBiZWZvcmUgdGhlIG5leHQgY2FsbCB0
byBmdG9rZW4oKS4KICovCmNoYXIgKgpmdG9rZW4oRklMRSAqZmlsZSwgaW50IGZsYWdzKQp7
CglzdGF0aWMgY2hhciAqdG9rZW4gPSBOVUxMOwoJc3RhdGljIGludCB0cm9vbSA9IDA7Cgly
ZWdpc3RlciBpbnQgYzsKCXJlZ2lzdGVyIGNoYXIgKnA7CglyZWdpc3RlciBpbnQgdGVybTsK
CglpZigodGVybSA9IGZuZXh0YyhmaWxlLCBmbGFncykpID09IEVPRikKCSAgICByZXR1cm4g
TlVMTDsKCglpZih0b2tlbiA9PSBOVUxMKSB7CgkgICAgdHJvb20gPSA1MDsKCSAgICB0b2tl
biA9IG1hbGxvYyh0cm9vbSAqIHNpemVvZihjaGFyKSk7CgkgICAgaWYodG9rZW4gPT0gTlVM
TCkKCQlyZXR1cm4gTlVMTDsKCX0KCglwID0gdG9rZW47Cglzd2l0Y2godGVybSkgewoJY2Fz
ZSAnIic6CgljYXNlICdcJyc6CgkgICAgKHZvaWQpIGZnZXRjKGZpbGUpOwoJICAgIGZvcig7
OykgeyAKCQlpZigoYyA9IGdldGMoZmlsZSkpID09IEVPRiB8fCBjID09IHRlcm0pCgkJICAg
IGJyZWFrOwoJCWVsc2UgaWYoYyA9PSAnXFwnKQoJCSAgICBjID0gZmVzY2FwZShmaWxlKTsK
CQkqcCsrID0gYzsKCQlpZihwID09ICZ0b2tlblt0cm9vbV0pIHsKCQkgICAgdG9rZW4gPSBy
ZWFsbG9jKHRva2VuLCB0cm9vbSAqIDIpOwoJCSAgICBpZih0b2tlbiA9PSBOVUxMKQoJCQly
ZXR1cm4gTlVMTDsKCQkgICAgcCA9ICZ0b2tlblt0cm9vbV07CgkJICAgIHRyb29tICo9IDI7
CgkJfQoJICAgIH0KCSAgICBicmVhazsKCglkZWZhdWx0OgoJICAgIGlmKGlzc3BhY2UodGVy
bSkpCgkJcmV0dXJuIE5VTEw7CgkgICAgd2hpbGUoKGMgPSBnZXRjKGZpbGUpKSAhPSBFT0Yg
JiYgIWlzc3BhY2UoYykpIHsKCQlpZihjID09ICdcXCcpCgkJICAgIGMgPSBmZXNjYXBlKGZp
bGUpOwoJCSpwKysgPSBjOwoJCWlmKHAgPT0gJnRva2VuW3Ryb29tXSkgewoJCSAgICB0b2tl
biA9IHJlYWxsb2ModG9rZW4sIHRyb29tICogMik7CgkJICAgIGlmKHRva2VuID09IE5VTEwp
CgkJCXJldHVybiBOVUxMOwoJCSAgICBwID0gJnRva2VuW3Ryb29tXTsKCQkgICAgdHJvb20g
Kj0gMjsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoJKnAgPSAnXDAnOwoJcmV0dXJuIHRv
a2VuOwp9CgoKLyoKICogR2V0IGEgdG9rZW4sIHJldHVybiBhIHN0cmluZyBvciBOVUxMLgog
KiBUb2tlbnMgbWF5IGJlICJxdW90ZWQiIG9yICdxdW90ZWQnOyBiYWNrc2xhc2hlcyBhY2Nl
cHRlZC4KICogVGhlIHN0cmluZyBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhbmQgc2hvdWxk
IGJlIGNvcGllZCBpZgogKiBuZWVkZWQgYmVmb3JlIHRoZSBuZXh0IGNhbGwgdG8gZnRva2Vu
KCkuCiAqLwpjaGFyICoKZmRlbGltdG9rKGNoYXIgKmRlbGltcywgRklMRSAqZmlsZSwgaW50
IGZsYWdzKQp7CglzdGF0aWMgY2hhciAqdG9rZW4gPSBOVUxMOwoJc3RhdGljIGludCB0cm9v
bSA9IDA7CglyZWdpc3RlciBpbnQgYzsKCXJlZ2lzdGVyIGNoYXIgKnA7CglyZWdpc3RlciBj
aGFyICpxOwoJcmVnaXN0ZXIgaW50IHRlcm07CgoJaWYoKHRlcm0gPSBmbmV4dGMoZmlsZSwg
ZmxhZ3MpKSA9PSBFT0YpCgkgICAgcmV0dXJuIE5VTEw7CgoJaWYodG9rZW4gPT0gTlVMTCkg
ewoJICAgIHRyb29tID0gNTA7CgkgICAgdG9rZW4gPSBtYWxsb2ModHJvb20gKiBzaXplb2Yo
Y2hhcikpOwoJICAgIGlmKHRva2VuID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7Cgl9CgoJcCA9
IHRva2VuOwoJc3dpdGNoKHRlcm0pIHsKCWNhc2UgJyInOgoJY2FzZSAnXCcnOgoJICAgICh2
b2lkKSBmZ2V0YyhmaWxlKTsKCSAgICBmb3IoOzspIHsgCgkJaWYoKGMgPSBnZXRjKGZpbGUp
KSA9PSBFT0YgfHwgYyA9PSB0ZXJtKQoJCSAgICBicmVhazsKCQllbHNlIGlmKGMgPT0gJ1xc
JykKCQkgICAgYyA9IGZlc2NhcGUoZmlsZSk7CgkJKnArKyA9IGM7CgkJaWYocCA9PSAmdG9r
ZW5bdHJvb21dKSB7CgkJICAgIHRva2VuID0gcmVhbGxvYyh0b2tlbiwgdHJvb20gKiAyKTsK
CQkgICAgaWYodG9rZW4gPT0gTlVMTCkKCQkJcmV0dXJuIE5VTEw7CgkJICAgIHAgPSAmdG9r
ZW5bdHJvb21dOwoJCSAgICB0cm9vbSAqPSAyOwoJCX0KCSAgICB9CgkgICAgYnJlYWs7CgoJ
ZGVmYXVsdDoKCSAgICBpZihpc3NwYWNlKHRlcm0pKQoJCXJldHVybiBOVUxMOwoJICAgIHdo
aWxlKChjID0gZ2V0YyhmaWxlKSkgIT0gRU9GICYmICFpc3NwYWNlKGMpKSB7CgkJaWYoYyA9
PSAnXFwnKQoJCSAgICBjID0gZmVzY2FwZShmaWxlKTsKCQkqcCA9IGM7CgkJaWYoKytwID09
ICZ0b2tlblt0cm9vbV0pIHsKCQkgICAgdG9rZW4gPSByZWFsbG9jKHRva2VuLCB0cm9vbSAq
IDIpOwoJCSAgICBpZih0b2tlbiA9PSBOVUxMKQoJCQlyZXR1cm4gTlVMTDsKCQkgICAgcCA9
ICZ0b2tlblt0cm9vbV07CgkJICAgIHRyb29tICo9IDI7CgkJfQoJCWZvcihxID0gZGVsaW1z
OyAqcSAmJiBjICE9ICpxOyBxKyspCgkJICAgIDsKCQlpZigqcSkgewoJCSAgICBpZihwID4g
dG9rZW4rMSkgewoJCQlwLS07CgkJCXVuZ2V0YyhjLCBmaWxlKTsKCQkgICAgfQoJCSAgICBi
cmVhazsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoJKnAgPSAnXDAnOwoJcmV0dXJuIHRv
a2VuOwp9CgoKLyoKICogTG9hZCBvbmUgb3IgbW9yZSBUcmFuc2Zvcm1zIGZyb20gYSBmaWxl
LgogKiBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCiAqLwppbnQKZmdldHRy
YW5zZm9ybShGSUxFICpmaWxlLCBpbnQgbnRyYW5zLCBmbG9hdCAqdHJhbnMgLyogZmxvYXQg
dHJhbnNbbnRyYW5zXVs0XVs0XSAqLywgaW50IGJpbmFyeSkKewoJcmVnaXN0ZXIgZmxvYXQg
KlQ7CglpbnQgbnQ7CgoJZm9yKG50ID0gMDsgbnQgPCBudHJhbnM7IG50KyspIHsKCSAgICBU
ID0gdHJhbnMgKyAxNipudDsKCSAgICBzd2l0Y2goZmdldG5mKGZpbGUsIDE2LCBULCBiaW5h
cnkpKSB7CgkgICAgY2FzZSAxNjoKCQlicmVhazsKCgkgICAgY2FzZSAwOgoJCXJldHVybiBu
dDsKCgkgICAgZGVmYXVsdDoKCQlyZXR1cm4gLTE7CgkgICAgfQoJfQoJcmV0dXJuIG50cmFu
czsKfQoKaW50CmZwdXRuZihGSUxFICpmaWxlLCBpbnQgY291bnQsIGZsb2F0ICp2LCBpbnQg
YmluYXJ5KQp7CglyZWdpc3RlciBpbnQgaTsKCWxvbmcgdzsKCWlmKGJpbmFyeSkgewojaWYg
QklHX0VORElBTgoJICByZXR1cm4gZndyaXRlKHYsIHNpemVvZihmbG9hdCksIGNvdW50LCBm
aWxlKTsKI2Vsc2UKCSAgZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJICAgIHcgPSBo
dG9ubCgqKGxvbmcgKikmdltpXSk7CgkgICAgZndyaXRlKCZ3LCBzaXplb2YoZmxvYXQpLCAx
LCBmaWxlKTsKCSAgfQoJICByZXR1cm4gY291bnQ7CiNlbmRpZgoJfQoKCWZwcmludGYoZmls
ZSwgIiVnIiwgdlswXSk7Cglmb3IoaSA9IDE7IGkgPCBjb3VudDsgaSsrKQoJICAgIGZwcmlu
dGYoZmlsZSwgIiAlZyIsIHZbaV0pOwoJcmV0dXJuIGNvdW50Owp9CgppbnQKZnB1dHRyYW5z
Zm9ybShGSUxFICpmaWxlLCBpbnQgbnRyYW5zLCBmbG9hdCAqdHJhbnMsIGludCBiaW5hcnkp
CnsKCXJlZ2lzdGVyIGludCBpLCBuOwoJcmVnaXN0ZXIgZmxvYXQgKnA7CgoJaWYoYmluYXJ5
KSB7CiNpZiBCSUdfRU5ESUFOCgkgICAgcmV0dXJuIGZ3cml0ZSh0cmFucywgNCo0KnNpemVv
ZihmbG9hdCksIG50cmFucywgZmlsZSk7CiNlbHNlCglPT0dMRXJyb3IoMSwgImZwdXR0cmFu
c2Zvcm06IG5lZWQgY29kZSB0byBoYW5kbGUgYmluYXJ5IHdyaXRlcyBmb3IgdGhpcyBhcmNo
aXRlY3R1cmUuIik7CglyZXR1cm4gMDsKI2VuZGlmCgl9CgoJLyogQVNDSUkuICovCgoJZm9y
KG4gPSAwOyBuIDwgbnRyYW5zOyBuKyspIHsKCSAgICBwID0gdHJhbnMgKyBuKjE2OwoJICAg
IGZvcihpID0gMDsgaSA8IDQ7IGkrKywgcCArPSA0KSB7CgkJZnByaW50ZihmaWxlLCAiICAl
MTIuOGcgICUxMi44ZyAgJTEyLjhnICAlMTIuOGdcbiIsCgkJICAgIHBbMF0sIHBbMV0sIHBb
Ml0sIHBbM10pOwoJICAgIH0KCSAgICBpZihmZXJyb3IoZmlsZSkpCgkJcmV0dXJuIG47Cgkg
ICAgZnByaW50ZihmaWxlLCAiXG4iKTsKCX0KCXJldHVybiBudHJhbnM7Cn0KCi8qCiAqIEdp
dmVuIGEgZmlsZSBwb2ludGVyLCByZXR1cm4gYSBzdHJpbmcgYXR0ZW1wdGluZyB0byBzaG93
IHRoZSBjb250ZXh0CiAqIG9mIGl0cyBjdXJyZW50IHBvc2l0aW9uLiAgSWYgbm8gZGF0YSBp
cyBhdmFpbGFibGUsIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KICovCmNoYXIgKgpmY29u
dGV4dChyZWdpc3RlciBGSUxFICpmKQp7CiAgICBzdGF0aWMgY2hhciAqY29udCA9IE5VTEw7
CiAgICBzdGF0aWMgY2hhciBkZmx0W10gPSAiIjsKICAgIGNoYXIgYnVmWzEwMjRdOwogICAg
aW50IG5wcmUsIG5wb3N0LCBubHByZSwgbmxwb3N0LCB0YWIsIGxlbjsKICAgIGludCBwcmVk
b3RzID0gNCwgcG9zdGRvdHMgPSA0OwogICAgcmVnaXN0ZXIgY2hhciAqcCwgKnE7CiAgICBj
aGFyICpsYXN0bGluZSwgKmxhc3Rub25ibGFuazsKICAgIGNoYXIgKmJhc2UsICpwdHI7CiAg
ICBpbnQgY250OwoKICAgIGlmKGYgPT0gTlVMTCkKCXJldHVybiBkZmx0OwogICAgaWYoZmVv
ZihmKSkKCXJldHVybiAiPiBFTkQgT0YgRklMRVxuIjsKI2lmIDAJLyogWFhYIHdjZiAqLwoj
aWZkZWYgX19saW51eF9fCiAgICBiYXNlID0gKGNoYXIgKilmLT5fSU9fcmVhZF9iYXNlOwog
ICAgcHRyID0gKGNoYXIgKilmLT5fSU9fcmVhZF9wdHI7CiAgICBjbnQgPSBwdHIgLSBiYXNl
OwojZWxzZQogICAgYmFzZSA9IChjaGFyICopZi0+X2Jhc2U7CiAgICBwdHIgPSAoY2hhciAq
KWYtPl9wdHI7CiAgICBjbnQgPSBmLT5fY250OwojZW5kaWYKICAgIGlmKGNudCA8PSAwIHx8
IGJhc2UgPT0gTlVMTCB8fCBwdHIgPT0gTlVMTCkKCXJldHVybiBkZmx0OwoKICAgIHAgPSBw
dHI7CiAgICBmb3IobnByZSA9IG5scHJlID0gMDsgLS1wID49IGJhc2UgJiYgbnByZSA8IDEy
ODsgbnByZSsrKSB7CglpZigqcCA9PSAnXG4nKSB7CgkgICAgaWYoKytubHByZSA+IDIgfHwg
bnByZSA+IDYwKSB7CgkJcHJlZG90cyA9IDA7CgkJYnJlYWs7CgkgICAgfQoJfSBlbHNlIGlm
KCpwICYgMHg4MCB8fCAqcCA9PSAwKQkJLyogYmluYXJ5IGRhdGE/ICovCgkgICAgYnJlYWs7
CiAgICB9CiAgICBzdHJjcHkoYnVmLCAiPiAuLi4gIik7CiAgICBxID0gYnVmICsgMiArIHBy
ZWRvdHM7CiAgICB0YWIgPSAyICsgcHJlZG90czsKICAgIGZvcihwID0gcHRyIC0gbnByZTsg
cCA8IHB0cjsgKSB7Cglzd2l0Y2goKnErKyA9ICpwKyspIHsKCWNhc2UgJ1xuJzogY2FzZSAn
XHInOgkqcSsrID0gJz4nOyAqcSsrID0gJyAnOyB0YWIgPSAyOyBicmVhazsKCWNhc2UgJ1x0
JzoJCXRhYiArPSA4LSh0YWImNyk7IGJyZWFrOwoJZGVmYXVsdDoJCXRhYisrOwoJfQogICAg
fQogICAgbGVuID0gbnByZTsKICAgIG5wb3N0ID0gbmxwb3N0ID0gMDsKICAgIGxhc3RsaW5l
ID0gbGFzdG5vbmJsYW5rID0gcTsKICAgIGZvcihwID0gcHRyOyAgcCA8IHB0ciArIGNudCAm
JiBsZW4gPCAxMjg7ICBsZW4rKywgcSsrKSB7CgkqcSA9ICpwKys7CglpZigqcSA9PSAnXG4n
KSB7CgkgICAgaWYobmxwb3N0ID09IDApIHsKCQl3aGlsZSgtLXRhYiA+IDApICorK3EgPSAn
LSc7CS8qIFBvaW50IC0tLV4gdG8gZXJyb3IgKi8KCQkqKytxID0gJ14nOyAqKytxID0gJ1xu
JzsKCSAgICB9CgkgICAgaWYoKCsrbmxwb3N0ID49IDIgfHwgbGVuID4gODApICYmIGxlbiA+
IDMyKSB7CgkJcG9zdGRvdHMgPSAwOwoJCWJyZWFrOwoJICAgIH0KCSAgICBsYXN0bGluZSA9
IHE7CgkgICAgKisrcSA9ICc+JzsgKisrcSA9ICcgJzsKCX0gZWxzZSBpZigqcSAmIDB4ODAg
fHwgKnEgPT0gMCkJCS8qIEJpbmFyeSBkYXRhICovCgkgICAgYnJlYWs7CgllbHNlIGlmKGlz
cHJpbnQoKnEpKQoJICAgIGxhc3Rub25ibGFuayA9IHE7CiAgICB9CiAgICBpZihwb3N0ZG90
cyAmJiBsYXN0bm9uYmxhbmsgPCBsYXN0bGluZSkgewoJcSA9IGxhc3RsaW5lOwkJLyogU3Vw
cHJlc3MgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KCXBvc3Rkb3RzID0gMDsJCS8qIHRvIGF2
b2lkIGZpbmFsIGBgPiAuLi4nJyAqLwogICAgfQogICAgc3RyY3B5KHEsICIgLi4uXG4iICsg
NC1wb3N0ZG90cyk7CiAgICBpZihubHBvc3QgPT0gMCkgewoJcSArPSBzdHJsZW4ocSk7Cgl3
aGlsZSgtLXRhYiA+IDApICpxKysgPSAnLSc7CglzdHJjcHkocSwgIl5cbiIpOwogICAgfQog
ICAgaWYoY29udCkgZnJlZShjb250KTsKICAgIHJldHVybiAoY29udCA9IHN0cmR1cChidWYp
KTsKI2Vsc2UKICAgIHJldHVybiBkZmx0OwojZW5kaWYKfQoKCiNpZmRlZiBfX2xpbnV4X18K
CmV4dGVybiBGSUxFCQkgKkNDX2ZtZW1vcGVuX19GUGNpKGNoYXIgKm1lbSwgaW50IGxlbik7
CmV4dGVybiBzdHJ1Y3Qgc3RkaW9fbWFyayAqQ0Nfc3RkaW9fc2V0bWFya19fRlAxMHN0ZGlv
X21hcmtQOHN0ZGlvYnVmKHN0cnVjdCBzdGRpb19tYXJrICptLCBGSUxFICpmKTsKZXh0ZXJu
IGludAkJICBDQ19zdGRpb19zZWVrbWFya19fRlAxMHN0ZGlvX21hcmsoc3RydWN0IHN0ZGlv
X21hcmsgKm1hcmspOwpleHRlcm4gdm9pZCAgCQkgIENDX3N0ZGlvX2ZyZWVtYXJrX19GUDEw
c3RkaW9fbWFyayhzdHJ1Y3Qgc3RkaW9fbWFyayAqbWFyayk7IAoKRklMRSAqZnN0cm9wZW4o
Y2hhciAqbWVtLCBpbnQgbGVuLCBjaGFyICptb2RlKQp7IHJldHVybiBDQ19mbWVtb3Blbl9f
RlBjaShtZW0sIGxlbik7IH0KCnN0cnVjdCBzdGRpb19tYXJrICpzdGRpb19zZXRtYXJrKHN0
cnVjdCBzdGRpb19tYXJrICptLCBGSUxFICpmKQp7IHJldHVybiBDQ19zdGRpb19zZXRtYXJr
X19GUDEwc3RkaW9fbWFya1A4c3RkaW9idWYobSwgZik7IH0KCmludCBzdGRpb19zZWVrbWFy
ayhzdHJ1Y3Qgc3RkaW9fbWFyayAqbWFyaykKeyByZXR1cm4gQ0Nfc3RkaW9fc2Vla21hcmtf
X0ZQMTBzdGRpb19tYXJrKG1hcmspICE9IEVPRjsgfQoKdm9pZCBzdGRpb19mcmVlbWFyayhz
dHJ1Y3Qgc3RkaW9fbWFyayAqbWFyaykKeyBDQ19zdGRpb19mcmVlbWFya19fRlAxMHN0ZGlv
X21hcmsobWFyayk7IH0KCgoJLyogRW5kIExpbnV4IChHTlUgbGliYywgbW9yZSBvciBsZXNz
KSAqLwoKI2Vsc2UgICAvKiBSb3VnaGx5IHZhbmlsbGEgc3RkaW8gKi8KCiNpZiBkZWZpbmVk
KEFJWCkgfHwgZGVmaW5lZChfX29zZl9fKSB8fCAxIC8qIFhYWCB3Y2YgKi8KCi8qIFRoZSBz
dGRpby1idWYtaGFja2luZyBjb2RlIGJlbG93IGRvZXNuJ3Qgd29yayBvbiBzb21lIHN5c3Rl
bXMsIHNvCiAqIGp1c3Qgc2hpcCB0aGUgZGF0YSB0aHJvdWdoIGEgcGlwZS4gIFNtYWxsICg4
Sz8pIHNpemUgbGltaXQuCiAqLwpGSUxFICpmc3Ryb3BlbihjaGFyICpzdHIsIGludCBsZW4s
IGNoYXIgKm1vZGUpCnsKICAgaW50IHBmZFsyXTsKICAgaWYocGlwZShwZmQpIDwgMCkKICAg
IHJldHVybiBOVUxMOwogICB3cml0ZShwZmRbMV0sIHN0ciwgbGVuKTsKICAgY2xvc2UocGZk
WzFdKTsKICAgcmV0dXJuIGZkb3BlbihwZmRbMF0sICJyIik7Cn0KCiNlbHNlIC8qIEV2ZW4g
bW9yZSBuZWFybHkgdmFuaWxsYSBzdGRpbyAqLwoKLyoKICogVGhpcyBvbmUgaXMgc3RkaW8g
ZGVwZW5kZW50LCBidXQgc2VlbXMgdG8gd29yayBvbiBhIGZhaXIgdmFyaWV0eSBvZgogKiBp
bXBsZW1lbnRhdGlvbnMuCiAqLwpGSUxFICoKZnN0cm9wZW4oY2hhciAqc3RyLCBpbnQgbGVu
LCBjaGFyICptb2RlKQp7CglGSUxFICpmOwoKCWYgPSBmb3BlbigiL2Rldi9udWxsIiwgbW9k
ZSk7CS8qIEhvdyBlbHNlIGRvIEkgZ2V0IGEgRklMRSAqPyAqLwoJaWYoZiA9PSBOVUxMKQoJ
ICAgIHJldHVybiBOVUxMOwoJc2V0YnVmKGYsIE5VTEwpOwoJY2xvc2UoZmlsZW5vKGYpKTsK
CiNpZmRlZiBocHV4CglmLT5fX2ZpbGVMID0gZi0+X19maWxlSCA9IC0xOwojZWxzZQoJZi0+
X2ZpbGUgPSAtMTsKI2VuZGlmCglmLT5fY250ID0gbGVuOwoJZi0+X3B0ciA9IGYtPl9iYXNl
ID0gKHVuc2lnbmVkIGNoYXIgKikgc3RyOwoJZi0+X2ZsYWcgJj0gfihfSU9OQkZ8X0lPTVlC
VUZ8X0lPRU9GfF9JT0VSUik7CglyZXR1cm4gZjsKfQojZW5kaWYgLyogbm9uLUFJWCwgbm9u
LU9TRiBzdGRpbyAqLwoKCgoJLyogTW9yZSB3aXRoIHZhbmlsbGEgc3RkaW86CgkgKiBhdHRl
bXB0IHRvIHNlZWsgYmFja3dhcmRzIChiYWNrdHJhY2spIG9uIGEgc3RyZWFtLgoJICogVXNl
IHRydWUgc2Vla2luZyB3aGVyZSBwb3NzaWJsZSwgb3RoZXJ3aXNlIGF0dGVtcHQgdG8KCSAq
IGZpZGRsZSB3aXRoIHRoZSBidWZmZXIgcG9pbnRlcnMgYW5kIHByYXkgaXQncyBzdGlsbCBp
biB0aGUgYnVmZmVyCgkgKiAoc2lnaCkuICAgW0dOVSBsaWJjIGhhcyByZWFsIGZhY2lsaXRp
ZXMgZm9yIGRvaW5nIHRoaXMhXQoJICovCnN0cnVjdCBzdGRpb19tYXJrIHsKCUZJTEUgKmY7
Cglsb25nIGZwb3M7CglGSUxFIGZjb3B5OwoJY2hhciBmY2hhcnNbOF07Cn07CgpzdHJ1Y3Qg
c3RkaW9fbWFyayAqCnN0ZGlvX3NldG1hcmsocmVnaXN0ZXIgc3RydWN0IHN0ZGlvX21hcmsg
Km1hcmssIHJlZ2lzdGVyIEZJTEUgKnN0cmVhbSkKewogICAgaWYobWFyayA9PSBOVUxMKQoJ
bWFyayA9IE9PR0xOZXdFKHN0cnVjdCBzdGRpb19tYXJrLCAic3RkaW9fc2V0bWFyayBtYXJr
Iik7CiAgICBtYXJrLT5mID0gc3RyZWFtOwoKICAgIG1hcmstPmZwb3MgPSBpc2F0dHkoZmls
ZW5vKHN0cmVhbSkpID8gLTEgOiBmdGVsbChzdHJlYW0pOwogICAgbWFyay0+ZmNvcHkgPSAq
c3RyZWFtOwojaWYgMAkvKiBYWFggd2NmICovCiAgICBtZW1jcHkobWFyay0+ZmNoYXJzLCBt
YXJrLT5mLT5fYmFzZSwgc2l6ZW9mKG1hcmstPmZjaGFycykpOwojZW5kaWYKICAgIHJldHVy
biBtYXJrOwp9CgppbnQKc3RkaW9fc2Vla21hcmsocmVnaXN0ZXIgc3RydWN0IHN0ZGlvX21h
cmsgKm1hcmspCnsKICAgIGlmKG1hcmstPmZwb3MgPT0gLTEgfHwgZnNlZWsobWFyay0+Ziwg
bWFyay0+ZnBvcywgMCkgPT0gLTEpIHsKI2lmIDAJLyogWFhYIHdjZiAqLwoJLyogTWF5YmUg
aXQncyBhIHBpcGUgb3Igc29ja2V0LCBzbyBzZWVrcyBmYWlsLgoJICogVHJ5IHJlcG9zaXRp
b25pbmcgaW5zaWRlIHRoZSBzdGRpbyBidWZmZXIuCgkgKiBUaGlzIGlzIGEgc3RkaW8tZGVw
ZW5kZW50IGtsdWRnZSwgYnV0IG1pZ2h0IHdvcmsuCgkgKi8KCWlmKG1hcmstPmYtPl9iYXNl
ID09IG1hcmstPmZjb3B5Ll9iYXNlICYmCgkgICBtZW1jbXAobWFyay0+ZmNoYXJzLCBtYXJr
LT5mLT5fYmFzZSwgc2l6ZW9mKG1hcmstPmZjaGFycykpID09IDApIHsKCQkgICAgLyogQnVm
ZmVyIGxvb2tzIHVuY2hhbmdlZC4gIFJlc2V0IHBvaW50ZXJzLiAqLwoJICAgICoobWFyay0+
ZikgPSBtYXJrLT5mY29weTsKCX0gZWxzZSB7CgkgICAgcmV0dXJuIDA7CS8qIEZhaWxlZCAq
LwoJfQojZWxzZQoJcmV0dXJuIDA7CiNlbmRpZgogICAgfQogICAgcmV0dXJuIDE7CQkvKiBT
dWNjZWVkZWQgKi8KfQoKdm9pZApzdGRpb19mcmVlbWFyayhzdHJ1Y3Qgc3RkaW9fbWFyayAq
bWFyaykKewogICAgT09HTEZyZWUobWFyayk7Cn0KCiNlbmRpZiAgLyogdmFuaWxsYSBzdGRp
byAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludApmaGFzZGF0YShGSUxFICpmKQp7
CiAgICByZXR1cm4gRl9IQVNEQVRBKGYpOwp9CgppbnQKYXN5bmNfZ2V0YyhyZWdpc3RlciBG
SUxFICpmKQp7CgogICAgZmRfc2V0IGZkczsKICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBu
b3RpbWUgPSB7IDAsIDAgfTsKCiAgICBpZihGX0hBU0RBVEEoZikpCglyZXR1cm4gZ2V0Yyhm
KTsKICAgIEZEX1pFUk8oJmZkcyk7CiAgICBGRF9TRVQoZmlsZW5vKGYpLCAmZmRzKTsKICAg
IGlmKHNlbGVjdChmaWxlbm8oZikrMSwgJmZkcywgTlVMTCwgTlVMTCwgJm5vdGltZSkgPT0g
MSkKCXJldHVybiBmZ2V0YyhmKTsKICAgIHJldHVybiBOT0RBVEE7Cn0KCmludAphc3luY19m
bmV4dGMocmVnaXN0ZXIgRklMRSAqZiwgcmVnaXN0ZXIgaW50IGZsYWdzKQp7CiAgICByZWdp
c3RlciBpbnQgYzsKCiAgICBjID0gYXN5bmNfZ2V0YyhmKTsKICAgIGZvcig7OykgewoJc3dp
dGNoKGMpIHsKCWNhc2UgRU9GOgoJY2FzZSBOT0RBVEE6CgkgICAgcmV0dXJuKGMpOwoKCWNh
c2UgJyAnOgoJY2FzZSAnXHQnOgoJICAgIGJyZWFrOwkJCS8qIEFsd2F5cyBza2lwIGJsYW5r
cyBhbmQgdGFicyAqLwoKCWNhc2UgJyMnOgoJICAgIGlmKGZsYWdzICYgMikJCS8qIDI6IHN0
b3Agb24gY29tbWVudHMsIGVsc2Ugc2tpcCAqLwoJCWdvdG8gZmltOwoKCSAgICB3aGlsZSgo
YyA9IGdldGMoZikpICE9ICdcbicgJiYgYyAhPSBFT0YpCgkJOwoJICAgIGNvbnRpbnVlOwkJ
CS8qIFJlc2NhbiB0aGlzIGMgKi8KCgljYXNlICdcbic6CgkgICAgaWYoIShmbGFncyAmIDEp
KQkJLyogMTogc3RvcCBvbiBcbidzLCBlbHNlIHNraXAgdGhlbSAqLwoJCWJyZWFrOwoJCQkJ
ICAgIAkvKiBmbGFncyYxID0+IGZhbGwgaW50byBkZWZhdWx0ICovCgoJZGVmYXVsdDoKCSBm
aW06CgkgICAgdW5nZXRjKGMsIGYpOwoJICAgIHJldHVybihjKTsKCX0KCgljID0gYXN5bmNf
Z2V0YyhmKTsKICAgIH0KfQo=

--===_0_Sun_Nov__3_13:11:14_PST_1996--





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199611032111.NAA10511>