[Gtk-sharp-list] TextBuffer .....

Patrik Olterman patrik@olterman.se
20 May 2003 09:39:33 +0200


--=-eKDvjsEC4eboTJwUiSPQ
Content-Type: multipart/mixed; boundary="=-mu8mG12NZoQtFU9RpDe4"


--=-mu8mG12NZoQtFU9RpDe4
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

First I'd like to thank all of you that have allready given advice on
this little project !!=20

Now I have a working text editor and need to move on to actual
functionality. Is there any easy ways to get line numbers and cursor
position in a textbuffer. I have tried to read the gtk+ documentation
but far to much of it seems to be different in gtk# also is there anyone
that have any examples of TextTag and how it works ( I would love to
start of with getting my comments in the code colored )

I have looked a little on the gsirc code, but frankly cant make any
sense out of it.

A few nudges in the rikt direction would be apreciated.

Regards=20
Olterman

--=-mu8mG12NZoQtFU9RpDe4
Content-Disposition: attachment; filename=ezsharp.cs
Content-Type: x-directory/normal; name=ezsharp.cs
Content-Transfer-Encoding: base64

LyoKICogIEVaIFNoYXJwIHdhcyBjcmVhdGVkIGJ5IFBhdHJpayBPbHRlcm1hbiAyMDAzIHRvIGxl
YXJuIEMjIGFuZCBHVEsjCiAqICBJdCBpcyBhIHNpbXBsZSBjb2RlIGVkaXRvciB0aGF0IGxldHMg
eW91IGNvZGUgYW5kIGNvbXBpbGUgaW4gb25lIGdvCiAqIAogKiAgVGhpcyBwcm9ncmFtIGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KICogICAKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxv
bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
ICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9u
LCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqICBQcm9kdWNlZCBieSBQYXRyaWsgT2x0ZXJtYW4g
CiAqICBwYXRyaWtAb2x0ZXJtYW4uc2UKICoKICogSWYgeW91IG1ha2UgYW55IGNoYW5nZXMgb3Ig
aW1wcm92ZW1lbnRzIHRvIHRoaXMgY29kZSBJIHdvdWxkIGFwcHJlY2lhdGUgaWYgCiAqIHlvdSBl
bWFpbCBtZSB0aGUgY2hhbmdlcyBzbyBJIGNhbiBpbXBsZW1lbnQgdGhlbS4gCiAqCiAqIGNvbXBp
bGVzIHdpdGggbWNzIC1yIGd0ay1zaGFycCAtciBTeXN0ZW0uRHJhd2luZyBlenNoYXJwLmNzCiAq
LwoKdXNpbmcgU3lzdGVtOwkJCS8vIGFib3V0IGFsbCBvZiBpdCA6KSAKdXNpbmcgU3lzdGVtLkRp
YWdub3N0aWNzOwkvLyBmb3Igc3RhcnRpbmcgcHJvY2Vzcwp1c2luZyBTeXN0ZW0uWG1sOwkJLy8g
Zm9yIHhtbCBzZXR0aW5ncwp1c2luZyBTeXN0ZW0uSU87CQkJLy8gZm9yIGZpbGUgb3BlcmF0aW9u
cyAKdXNpbmcgU3lzdGVtLkRyYXdpbmc7ICAgIAkvLyBmb3Igc2l6ZSAKdXNpbmcgR3RrOwkJCQkv
LyBmb3IgdGhlIGd1aQp1c2luZyBHdGtTaGFycDsJCQkvLyBkaXR0bwoKY2xhc3MgZXpzaGFycCB7
CiAgc3RhdGljIHZvaWQgTWFpbigpCiAgewogICAgLy9Jbml0aWFsaXppbmcgdGhlIGFwcGxpY2F0
aW9uCiAgICBBcHBsaWNhdGlvbi5Jbml0KCk7CiAgICAvL2NyZWF0aW5nIHRoZSB3aW5kb3cgb2Jq
ZWN0CiAgICBuZXcgZWRpdG9yKCk7CiAgICAvL3N0YXJ0aW5nIHRoZSBhcHBsaWNhdGlvbgogICAg
QXBwbGljYXRpb24uUnVuKCk7CiAgfQoKICAKCn0KY2xhc3MgZWRpdG9yIHsKICAvLyBkZWNsYXJp
bmcgdGhvc2UgZGlhbG9ncyB0aGF0IG5lZWQgdG8gYmUgZ2xvYmFsCiAgcHVibGljIFN0cmluZyBh
cmdOYW1lLCBkaXJOYW1lLCBvdXROYW1lLCBmaWxlTmFtZSwgZXJyb3JfbWVzc2FnZSwgc3lzRGly
OwogIFN0YXR1c2JhciBzdGF0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgRW50cnkgdGV4dDEsIHRleHQyLHRleHQzLHRleHQ0OwogIE1lc3Nh
Z2VEaWFsb2cgZGlhbG9nLCBvdXRwdXRfZGlhbG9nOwogIFdpbmRvdyB3aW4xLCBzZXR0aW5nc193
aW5kb3csIGFib3V0X3dpbmRvdywgb3V0cHV0X3dpbmRvdzsKICBMYWJlbCBsYWJlbDEsIGxhYmVs
MiwgbGFiZWwzLCBsYWJlbDQsIHJvd251bTsKICBWQm94IGJveDEsIGJveDI7CiAgQnV0dG9uIGhp
ZGVfYnV0dG9uOwogIE1lbnVCYXIgbWI7CiAgTWVudSBmaWxlX21lbnUsIGJ1aWxkX21lbnUsIHNl
dHRpbmdzX21lbnUsIGhlbHBfbWVudTsKICBNZW51SXRlbSBmaWxlX2l0ZW0sIGJ1aWxkX2l0ZW0s
IHNldHRpbmdzX2l0ZW0sIGhlbHBfaXRlbTsKICBNZW51SXRlbSBleGl0X2l0ZW0sIGxvYWRfaXRl
bSwgc2F2ZV9pdGVtLCBjb21waWxlX2l0ZW0sIHJ1bl9pdGVtLCBraWxsX2l0ZW0sIGFib3V0X2l0
ZW0sIGVkaXRfaXRlbSwgbG9hZF9zZXR0aW5nc19pdGVtLCBzYXZlX3NldHRpbmdzX2l0ZW07CiAg
U2Nyb2xsZWRXaW5kb3cgbWFpbl93aW47CiAgVGV4dFZpZXcgbWFpbl90ZXh0OwogIFRleHRCdWZm
ZXIgYnVmOwogIFRleHRUYWdUYWJsZSB0dDsKICBpbnQgdW5zYXZlZCwgY291bnQsIG9sZGNvdW50
OwoKICBwdWJsaWMgZWRpdG9yKCl7CiAgICAvLyBncmVhdGluZyB0aGUgd2lkZ2V0cwogICAgd2lu
MSA9IG5ldyBXaW5kb3cgKCJFWiBTaGFycCIpOwogICAgc2V0dGluZ3Nfd2luZG93ID0gbmV3IFdp
bmRvdyAoIkVaIFNldHRpbmdzIik7CiAgICAKICAKICAgIGxhYmVsMSA9IG5ldyBMYWJlbCAoIndo
YXQgZGlyZWN0b3J5IGlzIHlvdXIgY29kZSBpbj8iKTsKICAgIGxhYmVsMiA9IG5ldyBMYWJlbCAo
IndoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlPyIpOwogICAgbGFiZWwzID0gbmV3
IExhYmVsICgid2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgYmluYXJ5IGZpbGU/Iik7CiAgICBsYWJl
bDQgPSBuZXcgTGFiZWwgKCJjb21waWxhdGlvbiBhcmd1bWVudHMiKTsKICAgIHJvd251bSA9IG5l
dyBMYWJlbCgiMS5cbiIpOwogICAgYm94MSA9IG5ldyBWQm94IChmYWxzZSwgMCk7CiAgICBib3gy
ID0gbmV3IFZCb3ggKGZhbHNlLCAwKTsKICAgIAogICAgaGlkZV9idXR0b24gPSBuZXcgQnV0dG9u
ICgiSGlkZSBzZXR0aW5ncyIpOwoKICAgIG1iID0gbmV3IE1lbnVCYXIoKTsKICAgIAogICAgCiAg
ICBmaWxlX21lbnUgPSBuZXcgTWVudSgpOwogICAgYnVpbGRfbWVudSA9IG5ldyBNZW51KCk7CiAg
ICBzZXR0aW5nc19tZW51ID0gbmV3IE1lbnUoKTsKICAgIGhlbHBfbWVudSA9IG5ldyBNZW51KCk7
CiAgICAKICAgIGZpbGVfaXRlbSA9IG5ldyBNZW51SXRlbSgiRmlsZSIpOwogICAgYnVpbGRfaXRl
bSA9IG5ldyBNZW51SXRlbSgiQnVpbGQiKTsKICAgIHNldHRpbmdzX2l0ZW0gPSBuZXcgTWVudUl0
ZW0oIlNldHRpbmdzIik7CiAgICAKICAgIGNvbXBpbGVfaXRlbSA9IG5ldyBNZW51SXRlbSgiQ29t
cGlsZSIpOwogICAgcnVuX2l0ZW0gPSBuZXcgTWVudUl0ZW0oIlJ1biIpOwogICAga2lsbF9pdGVt
ID0gbmV3IE1lbnVJdGVtKCJLaWxsYWxsIG1vbm8iKTsKICAgIGV4aXRfaXRlbSA9IG5ldyBNZW51
SXRlbSgiUXVpdCIpOwogICAgbG9hZF9pdGVtID0gbmV3IE1lbnVJdGVtKCJMb2FkIGNvZGUiKTsK
ICAgIHNhdmVfaXRlbSA9IG5ldyBNZW51SXRlbSgiU2F2ZSBjb2RlIik7CiAgICBoZWxwX2l0ZW0g
PSBuZXcgTWVudUl0ZW0oIkhlbHAiKTsKICAgIGFib3V0X2l0ZW0gPSBuZXcgTWVudUl0ZW0oIkFi
b3V0Iik7CiAgICBlZGl0X2l0ZW0gPSBuZXcgTWVudUl0ZW0oIkVkaXQgU2V0dGluZ3MiKTsKICAg
IHNhdmVfc2V0dGluZ3NfaXRlbSA9IG5ldyBNZW51SXRlbSgiU2F2ZSBTZXR0aW5ncyIpOwogICAg
bG9hZF9zZXR0aW5nc19pdGVtID0gbmV3IE1lbnVJdGVtKCJMb2FkIFNldHRpbmdzIik7CgkKICAg
IC8vcHV0dGluZyB0aGUgdXNlcnMgaG9tZWRpcmVjdG9yeSBpbiBzeXNEaXIKICAgIHN5c0Rpcj1F
bnZpcm9ubWVudC5HZXRGb2xkZXJQYXRoKEVudmlyb25tZW50LlNwZWNpYWxGb2xkZXIuU3lzdGVt
KTsKCiAgICB0ZXh0MSA9IG5ldyBFbnRyeSAoKTsKCWRpck5hbWUgPSBzeXNEaXI7ICAgLy9pbml0
aWF0aW5nIGl0IHRvIHRoZSB1c2VycyBob21lRGlyIAoJdGV4dDEuVGV4dD1zeXNEaXI7ICAvL2lu
aXRpYXRpbmcgaXQgdG8gdGhlIHVzZXJzIGhvbWVEaXIgCgogICAgdGV4dDIgPSBuZXcgRW50cnkg
KCk7CglmaWxlTmFtZSA9ICIiOyAgICAgICAgLy8gaW5pdGlhdGluZyBpdCBlbXB0eSBzbyB3ZSBk
b250IGhhdmUgaXQgdW5zZXQgICAgCiAgICB0ZXh0MyA9IG5ldyBFbnRyeSAoKTsKCW91dE5hbWUg
PSAiIjsgICAgICAvLyBpbml0aWF0aW5nIGl0IGVtcHR5IHNvIHdlIGRvbnQgaGF2ZSBpdCB1bnNl
dCAKICAgIHRleHQ0ID0gbmV3IEVudHJ5ICgpOwoJYXJnTmFtZSA9ICIiOyAgICAgLy8gaW5pdGlh
dGluZyBpdCBlbXB0eSBzbyB3ZSBkb250IGhhdmUgaXQgdW5zZXQgCgogICAgLy8gbXVjaCBhZG8g
YWJvdXQgbm90aGluZyAKICAgIC8vICB0YWcgdGFibGUgZ29lcyBpbiB0ZXh0IGJ1ZmZlciwgdGV4
dCBidWZmZXIgZ29lcyBpbiB0ZXh0dmlldyB0ZXh0dmlldyBnb2VzIGluIHNjcm9sbGVkIHdpbiAJ
CiAgICBtYWluX3dpbiA9IG5ldyBTY3JvbGxlZFdpbmRvdyAoKTsKICAgIHR0ID0gbmV3IFRleHRU
YWdUYWJsZSgpOwogICAgYnVmID0gbmV3IFRleHRCdWZmZXIgKHR0KTsKICAgIG1haW5fdGV4dCA9
IG5ldyBUZXh0VmlldyAoYnVmKTsKCiAgICBzdGF0MSA9IG5ldyBTdGF0dXNiYXIoKTsgCiAgICAv
L2NoZWNrX2d0a3NoYXJwID0gbmV3IENoZWNrQnV0dG9uKCJndGstc2hhcnAiKTsKCiAgICBhYm91
dF93aW5kb3cgPSBuZXcgV2luZG93ICgiQWJvdXQgRVogY29tcGlsZSIpOwogICAgZGlhbG9nID0g
bmV3IE1lc3NhZ2VEaWFsb2cgKGFib3V0X3dpbmRvdywgRGlhbG9nRmxhZ3MuRGVzdHJveVdpdGhQ
YXJlbnQsIE1lc3NhZ2VUeXBlLkluZm8sIEJ1dHRvbnNUeXBlLk9rLCAiRVogU2hhcnAgd2FzIHdy
aXR0ZW4gYnkgUGF0cmlrIE9sdGVybWFuIik7CgoKICAgIC8vIGZpeGluZyBldmVudGhhbmRsZXJz
CiAgICAKICAgIC8vIE1lbnUgZXZlbnRzIAogICAgY29tcGlsZV9pdGVtLkFjdGl2YXRlZCArPSBu
ZXcgRXZlbnRIYW5kbGVyIChjb21wKTsKICAgIHJ1bl9pdGVtLkFjdGl2YXRlZCArPSBuZXcgRXZl
bnRIYW5kbGVyIChydW4pOwogICAga2lsbF9pdGVtLkFjdGl2YXRlZCArPSBuZXcgRXZlbnRIYW5k
bGVyIChraWxsKTsKICAgIGV4aXRfaXRlbS5BY3RpdmF0ZWQgKz0gbmV3IEV2ZW50SGFuZGxlciAo
ZGVsZXRlKTsgICAgCiAgICBhYm91dF9pdGVtLkFjdGl2YXRlZCArPSBuZXcgRXZlbnRIYW5kbGVy
IChhYm91dF9ldmVudCk7CiAgICBlZGl0X2l0ZW0uQWN0aXZhdGVkICs9IG5ldyBFdmVudEhhbmRs
ZXIgKGVkaXRfZXZlbnQpOwogICAgbG9hZF9pdGVtLkFjdGl2YXRlZCArPSBuZXcgRXZlbnRIYW5k
bGVyIChsb2FkX2V2ZW50KTsKICAgIHNhdmVfaXRlbS5BY3RpdmF0ZWQgKz0gbmV3IEV2ZW50SGFu
ZGxlciAoc2F2ZV9ldmVudCk7CiAgICBzYXZlX3NldHRpbmdzX2l0ZW0uQWN0aXZhdGVkICs9IG5l
dyBFdmVudEhhbmRsZXIgKHNhdmVfc2V0dGluZ3MpOwogICAgbG9hZF9zZXR0aW5nc19pdGVtLkFj
dGl2YXRlZCArPSBuZXcgRXZlbnRIYW5kbGVyIChsb2FkX3NldHRpbmdzKTsKCiAgICAgLy8gZXZl
bnRzIHRvIGhhbmRsZSB3aW5kb3dzIAogICAgIHdpbjEuRGVsZXRlRXZlbnQgKz0gbmV3IERlbGV0
ZUV2ZW50SGFuZGxlciAoZGVsZXRlKTsKICAgIHNldHRpbmdzX3dpbmRvdy5EZWxldGVFdmVudCAr
PSBuZXcgRGVsZXRlRXZlbnRIYW5kbGVyIChoaWRlX3NldHRpbmdzKTsgCiAgICBkaWFsb2cuUmVz
cG9uc2UgKz0gbmV3IFJlc3BvbnNlSGFuZGxlciAoZGlhbG9nX3Jlc3BvbnNlKTsKICAgIGhpZGVf
YnV0dG9uLkNsaWNrZWQgKz0gbmV3IEV2ZW50SGFuZGxlciAoaGlkZV9zZXR0aW5ncyk7CgogICAg
Ly8gZXZlbnRzIHdoZW4gbmV3IHNldHRpbmdzIGFyZSBlbnRlcmVkCiAgICB0ZXh0MS5DaGFuZ2Vk
ICs9IG5ldyBFdmVudEhhbmRsZXIgKGNoYW5nZWNtZCk7CiAgICB0ZXh0Mi5DaGFuZ2VkICs9IG5l
dyBFdmVudEhhbmRsZXIgKGNoYW5nZWNtZCk7CiAgICB0ZXh0My5DaGFuZ2VkICs9IG5ldyBFdmVu
dEhhbmRsZXIgKGNoYW5nZWNtZCk7CiAgICB0ZXh0NC5DaGFuZ2VkICs9IG5ldyBFdmVudEhhbmRs
ZXIgKGNoYW5nZWNtZCk7CgogICAgLy8gZXZlbnRzIGluIHRleHRidWZmZXIgCiAgICBidWYuQ2hh
bmdlZCArPSBuZXcgRXZlbnRIYW5kbGVyKG1hcmtfdW5zYXZlZCk7CgogICAgLy8KICAgIC8vIHBh
Y2tpbmcgdGhlIHdpbmRvdwogICAgLy8KICAgIC8vIGZpcnN0IGJ1aWxkIHRoZSBtZW51IAogICAg
c2V0dGluZ3NfbWVudS5BcHBlbmQgKGVkaXRfaXRlbSk7CiAgICBzZXR0aW5nc19tZW51LkFwcGVu
ZCAobG9hZF9zZXR0aW5nc19pdGVtKTsKICAgIHNldHRpbmdzX21lbnUuQXBwZW5kIChzYXZlX3Nl
dHRpbmdzX2l0ZW0pOwogICAgYnVpbGRfbWVudS5BcHBlbmQgKGNvbXBpbGVfaXRlbSk7CiAgICBi
dWlsZF9tZW51LkFwcGVuZCAocnVuX2l0ZW0pOwogICAgYnVpbGRfbWVudS5BcHBlbmQgKGtpbGxf
aXRlbSk7CiAgICBmaWxlX21lbnUuQXBwZW5kIChsb2FkX2l0ZW0pOwogICAgZmlsZV9tZW51LkFw
cGVuZCAoc2F2ZV9pdGVtKTsKICAgIGZpbGVfbWVudS5BcHBlbmQgKGV4aXRfaXRlbSk7CiAgICBo
ZWxwX21lbnUuQXBwZW5kIChhYm91dF9pdGVtKTsKICAgIGZpbGVfaXRlbS5TdWJtZW51ID0gZmls
ZV9tZW51OwogICAgYnVpbGRfaXRlbS5TdWJtZW51ID0gYnVpbGRfbWVudTsKICAgIHNldHRpbmdz
X2l0ZW0uU3VibWVudSA9IHNldHRpbmdzX21lbnU7CiAgICBoZWxwX2l0ZW0uU3VibWVudSA9IGhl
bHBfbWVudTsKICAgIG1iLkFwcGVuZCAoZmlsZV9pdGVtKTsKICAgIG1iLkFwcGVuZCAoYnVpbGRf
aXRlbSk7CiAgICBtYi5BcHBlbmQgKHNldHRpbmdzX2l0ZW0pOwogICAgbWIuQXBwZW5kIChoZWxw
X2l0ZW0pOwogICAgCgkKICAgIC8vbWFpbiB3aW5kb3cgCiAgICB3aW4xLkRlZmF1bHRTaXplID0g
bmV3IFNpemUgKDYwMCwgNDUwKTsKICAgIG1haW5fd2luLkFkZCAobWFpbl90ZXh0KTsKICAgIAog
ICAgYm94Mi5QYWNrU3RhcnQobWIsIGZhbHNlLCBmYWxzZSwgMCk7CiAgICBib3gyLlBhY2tTdGFy
dChtYWluX3dpbiwgdHJ1ZSwgdHJ1ZSwgMCk7CiAgICBib3gyLlBhY2tFbmQoc3RhdDEsIGZhbHNl
LCBmYWxzZSwgMCk7CiAgICB3aW4xLkFkZChib3gyKTsKICAgIHdpbjEuU2hvd0FsbCAoKTsKCiAg
ICAvLyBzZXR0aW5ncyB3aW5kb3cgKHdpbGwgYmUgc2hvd24gaW4gZWRpdCBzZXR0aW5nIGV2ZW50
KQogICAgLy9zZXR0aW5nc193aW5kb3cuRGVjb3JhdGVkID0gZmFsc2U7CiAgICAvL3NldHRpbmdz
X3dpbmRvdy5UeXBlOwogICAgYm94MS5QYWNrU3RhcnQobGFiZWwxLCBmYWxzZSwgZmFsc2UsIDAp
OwogICAgYm94MS5QYWNrU3RhcnQodGV4dDEsIGZhbHNlLCBmYWxzZSwgMCk7CiAgICBib3gxLlBh
Y2tTdGFydChsYWJlbDIsIGZhbHNlLCBmYWxzZSwgMCk7CiAgICBib3gxLlBhY2tTdGFydCh0ZXh0
MiwgZmFsc2UsIGZhbHNlLCAwKTsgCiAgICBib3gxLlBhY2tTdGFydChsYWJlbDQsIGZhbHNlLCBm
YWxzZSwgMCk7CiAgICBib3gxLlBhY2tTdGFydCh0ZXh0NCwgZmFsc2UsIGZhbHNlLCAwKTsKICAg
IGJveDEuUGFja1N0YXJ0KGxhYmVsMywgZmFsc2UsIGZhbHNlLCAwKTsKICAgIGJveDEuUGFja1N0
YXJ0KHRleHQzLCBmYWxzZSwgZmFsc2UsIDApOwogICAgYm94MS5QYWNrU3RhcnQoaGlkZV9idXR0
b24sIGZhbHNlLCBmYWxzZSwgMCk7CiAgICBzZXR0aW5nc193aW5kb3cuQWRkKGJveDEpOwoKICB9
CgoKcHVibGljIHZvaWQgY29tcChvYmplY3Qgb2JqLCBFdmVudEFyZ3MgYXJncykgCiAgewogICAg
UHJvY2VzcyBjb207CiAgICAvL2NyZWF0aW5nIHRoZSBwcm9jZXNzIG9iamVjdAogICAgY29tID0g
bmV3IFByb2Nlc3MoKTsKICAgIGNvbS5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7
CiAgICBjb20uU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSB0cnVlOwogICAgLy93
aGF0IHByb2dyYW0gZG8geW91IHdhbnQgdG8gc3RhcnQKICAgIGNvbS5TdGFydEluZm8uRmlsZU5h
bWUgPSAibWNzICIgKyBhcmdOYW1lICsgIiAtbyAiICsgZGlyTmFtZSArICIvIiArIG91dE5hbWUg
KyAiICIgKyBkaXJOYW1lICsgIi8iICsgZmlsZU5hbWU7CiAgICAvL2FueSBjb21tYW5kbGluZSBh
cmd1bWVudHMgZ28gaGVyZQogICAgLy9jb20uU3RhcnRJbmZvLkFyZ3VtZW50cyA9ICIiOwogICAg
Ly9ydW4gdGhlIHByb2Nlc3MKICAgIGNvbS5TdGFydCgpOwogICAgLy93YWl0IGZvciBpdCB0byBm
aW5uaXNoCiAgICBlcnJvcl9tZXNzYWdlID0gY29tLlN0YW5kYXJkT3V0cHV0LlJlYWRUb0VuZCgp
OwogICAgY29tLldhaXRGb3JFeGl0KCk7CiAgICAvL3ByaW50IGV4aXRjb2RlCiAgICBpZihjb20u
RXhpdENvZGU9PTApCiAgICB7CiAgICAgIAogICAgIAogICAgICB1cGRhdGVfc3RhdHVzYmFyKCJD
b21waWxlZCBzdWNjZXNzZnVsbHkiKTsKICAgICAKICAgIH0KICAgIGVsc2UKICAgIHsKCiAgICAg
IHVwZGF0ZV9zdGF0dXNiYXIoIkNvbXBpbGF0aW9uIGZhaWxlZCIpOwogICAgICAKICAgICAgZGlz
cGxheV9vdXRwdXQoZXJyb3JfbWVzc2FnZSk7CiAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIi0t
LT4iICsgZXJyb3JfbWVzc2FnZSArICI8LS0tLSIpOwogICAgfQoKICB9CiAgcHVibGljIHZvaWQg
cnVuKG9iamVjdCBvYmosIEV2ZW50QXJncyBhcmdzKSAKICB7CiAgICAKICAgIC8vY3JlYXRpbmcg
dGhlIHByb2Nlc3Mgb2JqZWN0CiAgICBQcm9jZXNzIGNtZCA9IG5ldyBQcm9jZXNzKCk7CiAgICAv
L3doYXQgcHJvZ3JhbSBkbyB5b3Ugd2FudCB0byBzdGFydAogICAgY21kLlN0YXJ0SW5mby5GaWxl
TmFtZSA9ICJtb25vIjsKICAgIC8vYW55IGNvbW1hbmRsaW5lIGFyZ3VtZW50cyBnbyBoZXJlCiAg
ICBjbWQuU3RhcnRJbmZvLkFyZ3VtZW50cyA9IGRpck5hbWUgKyAiLyIgKyBvdXROYW1lOwogICAg
Ly9ydW4gdGhlIHByb2Nlc3MKICAgIGNtZC5TdGFydCgpOwogICAgdXBkYXRlX3N0YXR1c2Jhcigi
RXhlY3V0aW5nIDoiICsgb3V0TmFtZSk7CgogICAgCiAgfQpwdWJsaWMgdm9pZCBraWxsKG9iamVj
dCBvYmosIEV2ZW50QXJncyBhcmdzKSAKICB7CiAgICAKICAgIC8vY3JlYXRpbmcgdGhlIHByb2Nl
c3Mgb2JqZWN0CiAgICBQcm9jZXNzIGNtZCA9IG5ldyBQcm9jZXNzKCk7CiAgICAvL3doYXQgcHJv
Z3JhbSBkbyB5b3Ugd2FudCB0byBzdGFydAogICAgY21kLlN0YXJ0SW5mby5GaWxlTmFtZSA9ICJr
aWxsYWxsIjsKICAgIC8vYW55IGNvbW1hbmRsaW5lIGFyZ3VtZW50cyBnbyBoZXJlCiAgICBjbWQu
U3RhcnRJbmZvLkFyZ3VtZW50cyA9ICJtb25vIjsKICAgIC8vcnVuIHRoZSBwcm9jZXNzCiAgICBj
bWQuU3RhcnQoKTsKICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGluZyA6IiArIG91dE5h
bWUpOwogICAgLy93YWl0IGZvciBpdCB0byBmaW5uaXNoCiAgICAvL2NtZC5XYWl0Rm9yRXhpdCgp
OwogICAgdXBkYXRlX3N0YXR1c2JhcigiS2lsbGluZyBtb25vIik7CiAgfQoKCiAgICBwdWJsaWMg
dm9pZCBjaGFuZ2VjbWQob2JqZWN0IG9iaiwgRXZlbnRBcmdzIGFyZ3MpCiAgICAvL2NhbGxlZCB3
aGVuIGJ1dHRvbiB0ZXh0IGlzIGNoYW5nZWQKICAgIHsKICAgICAgZGlyTmFtZT10ZXh0MS5UZXh0
OwogICAgICBmaWxlTmFtZT10ZXh0Mi5UZXh0OwogICAgICBvdXROYW1lPXRleHQzLlRleHQ7CiAg
ICAgIGFyZ05hbWU9dGV4dDQuVGV4dDsKCiAgICB9CgogIHB1YmxpYyB2b2lkIGFib3V0X2V2ZW50
KG9iamVjdCBvYmosIEV2ZW50QXJncyBhcmdzKQogICAgLy9jYWxsZWQgd2hlbiBhYm91dCBpcyBj
aG9zZW4gaW4gdGhlIGhlbHAgbWVudQogICAgewogICAgICBkaWFsb2cuU2hvdygpOwogICAgfQoK
ICBwdWJsaWMgdm9pZCBkaXNwbGF5X291dHB1dChzdHJpbmcgb3V0cHV0KQogIHsKICAgIG91dHB1
dF93aW5kb3cgPSBuZXcgV2luZG93ICgiT3V0cHV0Iik7CiAgICBvdXRwdXRfZGlhbG9nID0gbmV3
IE1lc3NhZ2VEaWFsb2cgKG91dHB1dF93aW5kb3csIERpYWxvZ0ZsYWdzLkRlc3Ryb3lXaXRoUGFy
ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlLldhcm5pbmcs
IEJ1dHRvbnNUeXBlLk9rLCBvdXRwdXQpOwogICAgb3V0cHV0X2RpYWxvZy5SZXNwb25zZSArPSBu
ZXcgUmVzcG9uc2VIYW5kbGVyIChvdXRwdXRfcmVzcG9uc2UpOwogICAgb3V0cHV0X2RpYWxvZy5T
aG93KCk7CiAgfQogIHB1YmxpYyB2b2lkIG91dHB1dF9yZXNwb25zZShvYmplY3Qgc2VuZGVyLCBS
ZXNwb25zZUFyZ3MgYXJncykKICAgIC8vY2FsbGVkIGJ1dHRvbiBpcyBwcmVzc2VkIGluIHRoZSBl
cnJvciB3aW5kb3cKICB7CiAgICBvdXRwdXRfZGlhbG9nLkhpZGUoKTsKICB9CiAgcHVibGljIHZv
aWQgZGlhbG9nX3Jlc3BvbnNlKG9iamVjdCBzZW5kZXIsIFJlc3BvbnNlQXJncyBhcmdzKQogICAg
Ly9jYWxsZWQgYnV0dG9uIGlzIHByZXNzZWQgaW4gdGhlIGFib3V0IHdpbmRvdwogIHsKICAgIGRp
YWxvZy5IaWRlKCk7CiAgfQogIHB1YmxpYyB2b2lkIG1hcmtfdW5zYXZlZChvYmplY3Qgb2JqLCBF
dmVudEFyZ3MgYXJncykKICB7CglpZiAodW5zYXZlZCAhPSAxKQoJewoJdW5zYXZlZCA9IDE7Cgl1
cGRhdGVfc3RhdHVzYmFyKCJCdWZmZXIgYWx0ZXJlZCwgdW5zYXZlZCBjaGFuZ2VzIik7Cgl9CiAg
fQogIHB1YmxpYyB2b2lkIHNhdmVfc2V0dGluZ3Mob2JqZWN0IG9iaiwgRXZlbnRBcmdzIGFyZ3Mp
CiAgewogICAgaWYoIShEaXJlY3RvcnkuRXhpc3RzKCIuZXpjIikpKQogICAgewogICAgICAvL2lm
IHRoZSBkaXJlY3RvcnkgZHVuIGV4aXN0IHdlIGNyZWF0ZSBpdCAKICAgICAgRGlyZWN0b3J5LkNy
ZWF0ZURpcmVjdG9yeShzeXNEaXIgKyAiLy5lemMiKTsKICAgIH0KICAgIAogICAgWG1sVGV4dFdy
aXRlciB3ID0gbmV3IFhtbFRleHRXcml0ZXIgKHN5c0RpciArICIvLmV6Yy9lemMueG1sIiwgbnVs
bCk7CiAgICAKICAgIHcuV3JpdGVTdGFydERvY3VtZW50KCk7CiAgICB3LldyaXRlU3RhcnRFbGVt
ZW50KCJlemNfc2V0dGluZ3MiKTsgCiAgICAKICAgIHcuV3JpdGVFbGVtZW50U3RyaW5nKCJjb2Rl
X3BhdGgiLCBkaXJOYW1lKTsgICAKICAgIHcuV3JpdGVFbGVtZW50U3RyaW5nKCJjb2RlX2ZpbGUi
LCBmaWxlTmFtZSk7CiAgICB3LldyaXRlRWxlbWVudFN0cmluZygiY29tcF9hcmdzIiwgYXJnTmFt
ZSk7CiAgICB3LldyaXRlRWxlbWVudFN0cmluZygiZXhlX2ZpbGUiLCBvdXROYW1lKTsKICAgIAog
ICAgdy5Xcml0ZUVuZEVsZW1lbnQoKTsKICAgIHcuV3JpdGVFbmREb2N1bWVudCgpOwogICAgdy5D
bG9zZSgpOwogICAgCiAgICBzdHJpbmcgc3RhdHVzID0gIlNldHRpbmdzIHNhdmVkIjsKICAgIHVp
bnQgY29udGV4dF9pZCA9IHN0YXQxLkdldENvbnRleHRJZCAoImZvbyIpOwogICAgc3RhdDEuUHVz
aCAoY29udGV4dF9pZCwgc3RhdHVzKTsKICB9CiAgCiAgcHVibGljIHZvaWQgbG9hZF9zZXR0aW5n
cyhvYmplY3Qgb2JqLCBFdmVudEFyZ3MgYXJncykKICB7CiAgICBpZihGaWxlLkV4aXN0cyhzeXNE
aXIgKyAiLy5lemMvZXpjLnhtbCIpKQogICAgewogICAgICAvLyBjcmVhdGUgYSByZXByZXNlbnRh
dGlvbiBvZiB4bWwgaW4gbWVtb3J5IAogICAgICBYbWxEb2N1bWVudCBkb2MgPSBuZXcgWG1sRG9j
dW1lbnQoKTsKICAgICAgZG9jLkxvYWQoc3lzRGlyICsgIi8uZXpjL2V6Yy54bWwiKTsKICAgICAg
CiAgICAgIC8vbm9kZWxpc3QgZm9yIHBhdGggCiAgICAgIFhtbE5vZGVMaXN0IGVMaXN0OyAKICAg
ICAgZUxpc3QgPSBkb2MuR2V0RWxlbWVudHNCeVRhZ05hbWUoImNvZGVfcGF0aCIpOwogICAgICB0
ZXh0MS5UZXh0ID0gZUxpc3RbMF0uSW5uZXJYbWw7CiAgICAgIAogICAgICBlTGlzdCA9IGRvYy5H
ZXRFbGVtZW50c0J5VGFnTmFtZSgiY29kZV9maWxlIik7CiAgICAgIHRleHQyLlRleHQgPSBlTGlz
dFswXS5Jbm5lclhtbDsKCiAgICAgIGVMaXN0ID0gZG9jLkdldEVsZW1lbnRzQnlUYWdOYW1lKCJj
b21wX2FyZ3MiKTsKICAgICAgdGV4dDQuVGV4dCA9IGVMaXN0WzBdLklubmVyWG1sOwogICAgICAK
ICAgICAgZUxpc3QgPSBkb2MuR2V0RWxlbWVudHNCeVRhZ05hbWUoImV4ZV9maWxlIik7CiAgICAg
IHRleHQzLlRleHQgPSBlTGlzdFswXS5Jbm5lclhtbDsKICAgICAgCiAgICAgIHN0cmluZyBzdGF0
dXMgPSAiQ3VzdG9tIHNldHRpbmdzIGxvYWRlZCI7CiAgICAgIHVpbnQgY29udGV4dF9pZCA9IHN0
YXQxLkdldENvbnRleHRJZCAoImZvbyIpOwogICAgICBzdGF0MS5QdXNoIChjb250ZXh0X2lkLCBz
dGF0dXMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBzdHJpbmcgc3RhdHVzID0gIk5vIGN1
c3RvbSBzZXR0aW5ncyBmb3VuZCI7CiAgICAgIHVpbnQgY29udGV4dF9pZCA9IHN0YXQxLkdldENv
bnRleHRJZCAoImZvbyIpOwogICAgICBzdGF0MS5QdXNoIChjb250ZXh0X2lkLCBzdGF0dXMpOwoK
ICAgIH0KICB9CiAgcHVibGljIHZvaWQgZWRpdF9ldmVudChvYmplY3Qgb2JqLCBFdmVudEFyZ3Mg
YXJncykKICB7CiAgICBzZXR0aW5nc193aW5kb3cuU2hvd0FsbCgpOwogIH0KICBwdWJsaWMgdm9p
ZCBoaWRlX3NldHRpbmdzKG9iamVjdCBvYmosIEV2ZW50QXJncyBhcmdzKQogIHsKICAgIHNldHRp
bmdzX3dpbmRvdy5IaWRlKCk7CiAgfQogIHB1YmxpYyB2b2lkIGhpZGVfc2V0dGluZ3Mob2JqZWN0
IG9iaiwgRGVsZXRlRXZlbnRBcmdzIGFyZ3MpCiAgewogICAgc2V0dGluZ3Nfd2luZG93LkhpZGUo
KTsKICB9CiAgcHVibGljIHZvaWQgbG9hZF9ldmVudChvYmplY3Qgb2JqLCBFdmVudEFyZ3MgYXJn
cykKICB7CglpZihmaWxlTmFtZT09IiIpCgl7CglkaXNwbGF5X291dHB1dCgiWW91IG11c3Qgc3Bl
Y2lmeSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgaW4gc2V0dGluZ3MiKTsKCX0KCWVsc2UK
CXsKICAgIAkJU3RyaW5nIHBhdGggPSBkaXJOYW1lICsgIi8iICsgZmlsZU5hbWU7CiAgICAJCWlm
KEZpbGUuRXhpc3RzKHBhdGgpKQogICAgCQl7CiAgICAgIAkJU3RyZWFtUmVhZGVyIGZpbGU7CiAg
ICAgIAkJaW50IGkgPSAxOwogICAgICAKICAgICAJCWZpbGUgPSBGaWxlLk9wZW5UZXh0KHBhdGgp
OwogICAgICAKICAgICAgCQkvLyBjbGVhciB0aGUgb2xkIHRleHQgYnVmZmVyIAogICAgICAJCWJ1
Zi5UZXh0PSIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiAgICAgIAkJU3RyaW5nIGxpbmU7CiAgICAgIAkJLy8gUmVhZCBhbmQgZGlzcGxh
eSBsaW5lcyBmcm9tIHRoZSBmaWxlIHVudGlsIHRoZSBlbmQgb2YgCiAgICAgIAkJLy8gdGhlIGZp
bGUgaXMgcmVhY2hlZC4KICAgICAgCQl3aGlsZSAoKGxpbmUgPSBmaWxlLlJlYWRMaW5lKCkpICE9
IG51bGwpIAogICAgICAJCXsKCQlidWYuSW5zZXJ0QXRDdXJzb3IobGluZSArICJcbiIpOwoJCS8v
Q29uc29sZS5Xcml0ZUxpbmUoaSArICIgIiArIGxpbmUpOwogICAgICAJCWkrKzsKICAgICAgCQl9
CiAgICAgIAkJdXBkYXRlX3N0YXR1c2JhcigiTG9hZGVkIEZpbGUgIiArIHBhdGggKyAiICgiICsg
aSArICIgbGluZXMpIik7CiAgICAJCX0KICAgIAkJZWxzZQogICAgCQl7CiAgICAgIAkJZGlzcGxh
eV9vdXRwdXQoIlRoZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZCIpOwogICAgCQl9Cgl9CiAgfQog
IHB1YmxpYyB2b2lkIHNhdmVfZXZlbnQob2JqZWN0IG9iaiwgRXZlbnRBcmdzIGFyZ3MpCiAgewog
ICAgU3RyaW5nIHBhdGggPSBkaXJOYW1lICsgIi8iICsgZmlsZU5hbWU7CiAgICBTdHJpbmcgcGF0
aDIgPSBkaXJOYW1lICsgIi8jIiArIGZpbGVOYW1lICsgIiMiOwogICAgICBpZiAoZmlsZU5hbWUg
PT0gIiIpCgl7CgkgIAlkaXNwbGF5X291dHB1dCgiWW91IG11c3Qgc3BlY2lmeSBhIGZpbGUgbmFt
ZSBpbiBzZXR0aW5ncyBiZWZvcmUgeW91IGNhbiBzYXZlIGl0Iik7Cgl9CgllbHNlCgl7CiAgICAg
IAkJaWYgKCEoRmlsZS5FeGlzdHMocGF0aCkpKSAKICAgICAgCQl7CgkJLy8gVGhpcyBzdGF0ZW1l
bnQgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGlzIGNyZWF0ZWQsCgkJLy8gYnV0IHRoZSBoYW5kbGUg
aXMgbm90IGtlcHQuCgkJdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLkNyZWF0ZShwYXRoKSkg
e30KICAgICAgCQl9CiAgICAKICAgIAkJLy8gRW5zdXJlIHRoYXQgdGhlIHRhcmdldCBkb2VzIG5v
dCBleGlzdC4KICAgIAkJaWYgKEZpbGUuRXhpc3RzKHBhdGgyKSkgICAgCgkJICAgICAgRmlsZS5E
ZWxldGUocGF0aDIpOwogICAJIAkvLyBNb3ZlIHRoZSBmaWxlLgogICAgCQlGaWxlLk1vdmUocGF0
aCwgcGF0aDIpOwoKICAgIAkJLy8gdGltZSB0byBhY3R1YWxseSBzYXZlIHRoZSBmaWxlIAogICAg
CQlUZXh0V3JpdGVyIGZpbGU7CiAgICAJCWZpbGUgPSBuZXcgU3RyZWFtV3JpdGVyKHBhdGgpOwog
ICAgCQlmaWxlLldyaXRlKGJ1Zi5UZXh0KTsKICAgIAkJZmlsZS5GbHVzaCgpOwogICAgCQlmaWxl
LkNsb3NlKCk7CiAgICAJCUZpbGVJbmZvIGZpID0gbmV3IEZpbGVJbmZvKHBhdGgpOwogICAgICAJ
CXVwZGF0ZV9zdGF0dXNiYXIoIlNhdmVkIGZpbGU6ICIgKyBwYXRoICsgIiAoIiArIGZpLkxlbmd0
aCArICIpIik7CiAgICAgICAgICAgICAgICB1bnNhdmVkPTA7Cgl9CiAgfQoJcHVibGljIHZvaWQg
dXBkYXRlX3N0YXR1c2JhcihzdHJpbmcgc3RhdHVzKQoJewoJCiAgICAgIAkJdWludCBjb250ZXh0
X2lkID0gc3RhdDEuR2V0Q29udGV4dElkICgiZm9vIik7CiAgICAgIAkJc3RhdDEuUHVzaCAoY29u
dGV4dF9pZCwgc3RhdHVzKTsKCX0KCiAgcHVibGljIHZvaWQgZGVsZXRlKG9iamVjdCBvYmosIEV2
ZW50QXJncyBhcmdzKQogICAgLy9jYWxsZWQgd2hlbiB3aW5kb3cgaXMgY2xvc2VkCiAgewogICAg
QXBwbGljYXRpb24uUXVpdCgpOwogIH0KICAKICBwdWJsaWMgdm9pZCBkZWxldGUob2JqZWN0IG9i
aiwgRGVsZXRlRXZlbnRBcmdzIGFyZ3MpCiAgICAvL2NhbGxlZCB3aGVuIHdpbmRvdyBpcyBjbG9z
ZWQKICB7CiAgICBBcHBsaWNhdGlvbi5RdWl0KCk7CiAgfQp9Ci8qIHRoaXMgaXMgdGhlIGVuZCBv
ZiB0aGUgY29kZSBpZiB0aGlzIGJpdCBpc24ndCBoZXJlIHNvbWV0aGluZyB0ZXJyaWJsZSBoYXMg
aGFwcGVuZWQKICoKICogICJBbGwgcmVxdWlyZWQgZm9yIHRoZSB0cml1bXBoIG9mIGV2aWwgaXMg
Zm9yIHRoZSBnb29kIHBlb3BsZSB0byByZW1haW4gc2lsZW50Li4uIgogKi8K

--=-mu8mG12NZoQtFU9RpDe4--

--=-eKDvjsEC4eboTJwUiSPQ
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD8DBQA+ydu1HeA7AF1UGKMRAgG8AJ0TZKHX7MYsBWHYBvs7OX+csSijaQCfXDrV
65Fgm0OTJXWG+vywIOVwRik=
=+mQO
-----END PGP SIGNATURE-----

--=-eKDvjsEC4eboTJwUiSPQ--