[Mono-list] [Patch] Mono.Data.SqliteClient named input parameters

Chris Turchin chris@turchin.net
Mon, 10 May 2004 11:11:12 +0200


--=-l0GdX8flvxT2ZyQLnsAL
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Hi,

I have written a patch for Mono.Data.SqliteClient to allow working with
named input parameters that I would like to have committed. Basically
you can do something like:

dbcmd.CommandText = "SELECT * FROM MONO_TEST where NID =  @nid AND 
NDESC LIKE @ndesc and (EMAIL LIKE '%@test' or EMAIL = @email)";

dbcmd.Parameters.Add(new SqliteParameter("@nid" , 1) );
dbcmd.Parameters.Add(new SqliteParameter("@ndesc", "_ono%") );
dbcmd.Parameters.Insert(1,new
SqliteParameter("@email","chris@turchin.net"));

ShowData( dbcmd.ExecuteReader());

I parse the parameters using regular expressions to replace them with
the values when ExecuteReader() is called. Its pretty simple because the
current implementation of SqliteClient only uses String data types
(otherwise, the replace statement would likely have been more complex).

It is not truly passing the parameters to the C-API since sqlite does
not support named parameters (yet, it is on the TODO list for a future
release) just modifying the sql text before executing, but it is still a
big help making sqlite db code a lot cleaner (mphoto and f-stop come to
mind...) and could be easily modified as soon as named parameters are
truly supported in sqlite.

I am attaching it here. Can someone take a look at it and tell me if it
is okay to commit? 

Thanks!

Regards,
--chris


--=-l0GdX8flvxT2ZyQLnsAL
Content-Disposition: attachment; filename=Mono.Data.SqliteClient.diff
Content-Type: text/x-patch; name=Mono.Data.SqliteClient.diff; charset=UTF-8
Content-Transfer-Encoding: base64

SW5kZXg6IENoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9tb25vL21jcy9jbGFzcy9N
b25vLkRhdGEuU3FsaXRlQ2xpZW50L0NoYW5nZUxvZyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEu
MTANCmRpZmYgLXUgLWIgLXIxLjEwIENoYW5nZUxvZw0KLS0tIENoYW5nZUxvZwkyOSBBcHIgMjAw
NCAxMzo1NDozMiAtMDAwMAkxLjEwDQorKysgQ2hhbmdlTG9nCTkgTWF5IDIwMDQgMjM6MTk6NDIg
LTAwMDANCkBAIC0xLDMgKzEsMjIgQEANCisyMDA0LTA1LTA5ICBDaHJpcyBUdXJjaGluICA8Y2hy
aXNAdHVyY2hpbi5uZXQ+DQorDQorCSogTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVDb21t
YW5kLmNzOiANCisJCS0gaW1wbGVtZW50ZWQgbmFtZWQgaW5wdXQgcGFyYW1ldGVycyB1c2luZyBB
RE8uTkVUIFN5bnRheDogQC1wcmVmaXggKGUuZy4gQHBhcmFtMSwgQG15cGFyYW0sIGV0YykNCisJ
CS0gUHJvY2Vzc1BhcmFtZXRlcnMoKSBtZXRob2QgZXh0cmFjdHMgdGhlIG5hbWVkIHBhcmFtZXRl
cnMgaW4gdGhlIFBhcmFtZXRlcnNDb2xsZWN0aW9uIGZyb20gdGhlIHJhdyBzcWwgYW5kDQorCQkg
IHJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgcmVzcGVjdGl2ZSBwYXJhbWV0ZXIgdmFsdWVzIGJlZm9y
ZSBleGVjdXRpbmcgdGhlIHF1ZXJ5DQorCSogTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVE
YXRhUmVhZGVyLmNzOg0KKwkJLSBhZGRlZCBub3RlIHJlZ2FyZGluZyBkYXRhdHlwZXMNCisJKiBN
b25vLkRhdGEuU3FsaXRlQ2xpZW50L1NxbGl0ZVBhcmFtZXRlckNvbGxlY3Rpb24uY3M6DQorCQkt
IGltcGxlbWVudGVkIHZhcmlvdXMgTm90WWV0SW1wbGVtZW50ZWQgaW50ZXJmYWNlIGltcGxlbWVu
dGF0aW9ucyAtIElMaXN0LCBJQ29sbGVjdGlvbiBpbnRlcmZhY2UgbWV0aG9kcyANCisJCSAgYW5k
IHByb3BlcnRpZXMgbm93IHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXN1bHRzIGZyb20gdGhl
IG51bWVyaWNfcGFyYW1faGFzaCBpbiB0aGUgYmFja2dyb3VuZC4NCisJCS0gZml4ZWQgYnVnIGlu
IEluZGV4T2YgKHN0cmluZyBwYXJhbWV0ZXJOYW1lKSB3aGVyZSBwYXJhbWV0ZXJOYW1lIGlzIG5v
dCBwcmVzZW50DQorCQktIGFkZGVkIHJhbmdlIGNoZWNrcyBmb3IgdGhpc1tpbmRleF0gYW5kIHRo
aXNbcHJvcGVydHlOYW1lXSBwcm9wZXJ0aWVzIHdpdGggSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9u
KCkNCisJCS0gZml4ZWQgYnVnIGluICBBZGQgKG9iamVjdCB2YWx1ZSkgcmVsYXRlZCB0byB0aGUg
d3Jvbmcga2V5IGJlaW5nIHN0b3JlZCBpbiBuYW1lZF9wYXJhbV9oYXNoW10NCisJCS0gR2VuZXJh
dGVQYXJhbWV0ZXJOYW1lKCkgbGlrZSBmaXJlYmlyZCBwcm92aWRlciBmb3IgY2FzZSBTcWxQYXJh
bWV0ZXIuUGFyYW1ldGVyTmFtZS5MZW5ndGggPT0gMA0KKwkJICBnZW5lcmF0ZXMgbmFtZSB1c2lu
ZyBmb3JtYXQ6IEAgKyBudW1lcmljX3BhcmFtX2hhc2guQ291bnQgKyAxDQorCSogVGVzdC9TcWxp
dGVUZXN0LmNzOg0KKwkJLSBhZGRlZCB0ZXN0cyByZWxhdGVkIHRvIG5hbWVkIHBhcmFtZXRlcnMu
IHJlc3RydWN0dXJlZCB0aGUgY29kZSB0byBiZSBtb3JlIG1vZHVsYXIuIA0KKwkJDQogMjAwNC0w
NC0yOSAgR29uemFsbyBQYW5pYWd1YSBKYXZpZXIgPGdvbnphbG9AeGltaWFuLmNvbT4NCiANCiAJ
KiBNb25vLkRhdGEuU3FsaXRlQ2xpZW50L1NxbGl0ZUNvbW1hbmQuY3M6IGltcGxlbWVudCBMYXN0
SW5zZXJ0Um93SWQuDQpJbmRleDogTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVDb21tYW5k
LmNzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL21vbm8vbWNzL2NsYXNzL01vbm8uRGF0YS5TcWxp
dGVDbGllbnQvTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVDb21tYW5kLmNzLHYNCnJldHJp
ZXZpbmcgcmV2aXNpb24gMS40DQpkaWZmIC11IC1iIC1yMS40IFNxbGl0ZUNvbW1hbmQuY3MNCi0t
LSBNb25vLkRhdGEuU3FsaXRlQ2xpZW50L1NxbGl0ZUNvbW1hbmQuY3MJMjkgQXByIDIwMDQgMTM6
NTQ6MzIgLTAwMDAJMS40DQorKysgTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVDb21tYW5k
LmNzCTkgTWF5IDIwMDQgMjM6MTk6NDIgLTAwMDANCkBAIC0zLDEyICszLDEzIEBADQogLy8gIFNx
bGl0ZUNvbW1hbmQuY3MNCiAvLw0KIC8vICBBdXRob3Iocyk6IFZsYWRpbWlyIFZ1a2ljZXZpYyAg
PHZsYWRpbWlyQHBvYm94LmNvbT4NCi0vLw0KKy8vCQkJQ2hyaXMgVHVyY2hpbiA8Y2hyaXNAdHVy
Y2hpbi5uZXQ+DQogLy8gIENvcHlyaWdodCAoQykgMjAwMiAgVmxhZGltaXIgVnVraWNldmljDQog
Ly8NCiANCiB1c2luZyBTeXN0ZW07DQogdXNpbmcgU3lzdGVtLlRleHQ7DQordXNpbmcgU3lzdGVt
LlRleHQuUmVndWxhckV4cHJlc3Npb25zOw0KIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BT
ZXJ2aWNlczsNCiB1c2luZyBTeXN0ZW0uRGF0YTsNCiANCkBAIC0xOTksMTcgKzIwMCwyNiBAQA0K
IAkJCQlieXRlICptc2dfcmVzdWx0Ow0KIA0KIAkJCQl0cnkgew0KKwkJCQkJDQorCQkJCQlzdHJp
bmcgc3FsRGF0YSA9IHNxbDsNCisJCQkJCQ0KKwkJCQkJaWYgKFBhcmFtZXRlcnMuQ291bnQgPiAw
KQ0KKwkJCQkJew0KKwkJCQkJCS8vaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBzcWxpdGUsIG5hbWVk
IHBhcmFtZXRlcnMgd2lsbCBiZSBzdXBwb3J0ZWQNCisJCQkJCQkvL3RoZW4gb25lIGNvdWxkIGR1
ZSBhIGJldHRlciAgaW1wbGVtZW50YXRpb24gKHBpbnZva2luZyBhZGRfcGFyYW1ldGVyKCkgb3Ig
d2hhdGV2ZXIpDQorCQkJCQkJc3FsRGF0YSA9IFByb2Nlc3NQYXJhbWV0ZXJzKCk7DQorCQkJCQl9
DQorCQkJCQkNCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FudF9yZXN1
bHRzKSB7DQogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIg
PSBuZXcgU3FsaXRlRGF0YVJlYWRlciAodGhpcyk7DQotCQkJCQkJDQotCQkJCQkJZXJyID0gc3Fs
aXRlX2V4ZWMgKHBhcmVudF9jb25uLkhhbmRsZSwNCi0JCQkJCQkJCSAgIHNxbCwNCisJCQkJCQll
cnIgPSBzcWxpdGVfZXhlYyAoIHBhcmVudF9jb25uLkhhbmRsZSwNCisJCQkJCQkJCQkJCXNxbERh
dGEsDQogCQkJCQkJCQkgICBuZXcgU3FsaXRlQ2FsbGJhY2tGdW5jdGlvbiAocmVhZGVyLlNxbGl0
ZUNhbGxiYWNrKSwNCiAJCQkJCQkJCSAgIEludFB0ci5aZXJvLCAmbXNnX3Jlc3VsdCk7DQogCQkJ
CQkJcmVhZGVyLlJlYWRpbmdEb25lICgpOw0KIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSB7DQogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
cnIgPSBzcWxpdGVfZXhlYyAocGFyZW50X2Nvbm4uSGFuZGxlLA0KLQkgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbCwNCisJCQkJCQkJ
CQkJCXNxbERhdGEsDQogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbnVsbCwNCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRQdHIuWmVybywgJm1zZ19yZXN1bHQpOw0K
IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCkBAIC0yMzUsNiArMjQ1LDQwIEBA
DQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsNCiAgICAgICAgICAgICAg
ICAgfQ0KIA0KKwkJCQlwcml2YXRlIHN0cmluZyBQcm9jZXNzUGFyYW1ldGVycygpDQorCQkJCXsN
CisJCQkJCXN0cmluZyBwcm9jZXNzZWRUZXh0ID0gc3FsOw0KKwkJCQkJLy9SZWdleCBsb29rcyBv
ZGQgcGVyaGFwcywgYnV0IGl0IHdvcmtzIC0gc2FtZSBpbXBsLiBhcyBpbiB0aGUgZmlyZWJpcmQg
ZGIgcHJvdmlkZXINCisJCQkJCS8vdGhlIG5hbWVkIHBhcmFtZXRlcnMgYXJlIHVzaW5nIHRoZSBB
RE8uTkVUIHN0YW5kYXJkIEAtcHJlZml4IGJ1dCBzcWxpdGUgaXMgY29uc2lkZXJpbmcgIjoiIGFz
IGEgcHJlZml4IGZvciB2LjMuLi4NCisJCQkJCS8vcmVmOiBodHRwOi8vd3d3Lm1haWwtYXJjaGl2
ZS5jb20vc3FsaXRlLXVzZXJzQHNxbGl0ZS5vcmcvbXNnMDE4NTEuaHRtbA0KKwkJCQkJUmVnZXgg
ciA9IG5ldyBSZWdleChAIigoJ1teJ10qP1xAW14nXSonKSpbXidAXSo/KSooPzxwYXJhbT5AXHcr
KSsoW14nQF0qPygnW14nXSo/XEBbXiddKicpKSoiLFJlZ2V4T3B0aW9ucy5FeHBsaWNpdENhcHR1
cmUpOw0KKwkJCQkJTWF0Y2hFdmFsdWF0b3IgbWUgPSBuZXcgTWF0Y2hFdmFsdWF0b3IoUmVwbGFj
ZVBhcmFtcyk7DQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUZXh0ID0gci5SZXBsYWNl
KHNxbCwgbWUpOw0KKwkJCQkJcmV0dXJuIHByb2Nlc3NlZFRleHQ7DQorICAgICAgICAgICAgICAg
IH0NCisJCQkJDQorICAgICAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgUmVwbGFjZVBhcmFtcyhN
YXRjaCBtKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3Ry
aW5nIGlucHV0ID0gbS5WYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKG0uR3JvdXBzWyJwYXJhbSJdLlN1Y2Nlc3MpDQorICAgICAgICAgICAgICAgICAgICAg
ICAgew0KKwkJCQkJCQlHcm91cCBnID0gbS5Hcm91cHNbInBhcmFtIl07DQorCQkJCQkJCXN0cmlu
ZyBmaW5kID0gZy5WYWx1ZTsNCisJCQkJCQkJLy9GSVhNRTogc3FsaXRlIHdvcmtzIGludGVybmFs
bHkgb25seSB3aXRoIHN0cmluZ3MsIHNvIHRoaXMgYXNzdW10aW9uIGlzIG1vc3RseSBsZWdpdCwg
YnV0IHdoYXQgYWJvdXQgZGF0ZSBmb3JtYXR0aW5nLCBldGM/DQorCQkJCQkJCS8vTmVlZCB0byBm
aXggU3FsTGl0ZURhdGFSZWFkZXIgZmlyc3QgdG8gYWN1cmF0ZWx5IGRlc2NyaWJlIHRoZSB0YWJs
ZXMNCisJCQkJCQkJU3FsaXRlUGFyYW1ldGVyIHNxbHAgPSBQYXJhbWV0ZXJzW2ZpbmRdOw0KKwkJ
CQkJCQlzdHJpbmcgcmVwbGFjZSA9IENvbnZlcnQuVG9TdHJpbmcoc3FscC5WYWx1ZSk7DQorCQkJ
CQkJCQ0KKwkJCQkJCQlpZihzcWxwLkRiVHlwZSA9PSBEYlR5cGUuU3RyaW5nKQ0KKwkJCQkJCQkJ
cmVwbGFjZSA9ICAiXCIiICsgcmVwbGFjZSArICJcIiI7DQorCQkJCQkJCQ0KKwkJCQkJCQlpbnB1
dCA9IFJlZ2V4LlJlcGxhY2UoaW5wdXQsZmluZCxyZXBsYWNlKTsNCisJCQkJCQkJcmV0dXJuIGlu
cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAg
ICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLlZhbHVlOw0KKyAg
ICAgICAgICAgICAgICB9DQogDQogICAgICAgICAgICAgICAgIGludGVybmFsIGludCBOdW1DaGFu
Z2VzICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3FsaXRlX2NoYW5nZXMg
KHBhcmVudF9jb25uLkhhbmRsZSk7DQpJbmRleDogTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxp
dGVEYXRhUmVhZGVyLmNzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL21vbm8vbWNzL2NsYXNzL01v
bm8uRGF0YS5TcWxpdGVDbGllbnQvTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVEYXRhUmVh
ZGVyLmNzLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS41DQpkaWZmIC11IC1iIC1yMS41IFNxbGl0
ZURhdGFSZWFkZXIuY3MNCi0tLSBNb25vLkRhdGEuU3FsaXRlQ2xpZW50L1NxbGl0ZURhdGFSZWFk
ZXIuY3MJMjkgQXByIDIwMDQgMTM6NTQ6MzIgLTAwMDAJMS41DQorKysgTW9uby5EYXRhLlNxbGl0
ZUNsaWVudC9TcWxpdGVEYXRhUmVhZGVyLmNzCTkgTWF5IDIwMDQgMjM6MTk6NDMgLTAwMDANCkBA
IC02NCw2ICs2NCw5IEBADQogCQkJLy8gd2UgLWNvdWxkLSBwYXJzZSB0aGUgdGFibGUgZGVmaW5p
dGlvbiAoc2luY2UgdGhhdCdzIHRoZSBvbmx5IGluZm8NCiAJCQkvLyB0aGF0IHdlIGNhbiBnZXQg
b3V0IG9mIHNxbGl0ZSBhYm91dCB0aGUgdGFibGUpLCBidXQgaXQncyBwcm9iYWJseQ0KIAkJCS8v
IG5vdCB3b3J0aCBpdC4NCisJCQkvLyBodHRwOi8vc3FsaXRlLm9yZy9kYXRhdHlwZXMuaHRtbCBp
cyBhbiBpbXBvcmFudCByZWFkIGZvciBhbnlvbmUNCisJCQkvLyBkb2luZyBhbnl0aGluZyB3aXRo
IHNxbGl0ZSBkYXRhdHlwZXMuIGltcG9ydGFudCBpczoNCisJCQkvLyBPbmUgZXhjZXB0aW9uIHRv
IHRoZSB0eXBlbGVzc25lc3Mgb2YgU1FMaXRlIGlzIGEgY29sdW1uIHdob3NlIHR5cGUgaXMgSU5U
RUdFUiBQUklNQVJZIEtFWS4oYXV0b2luY3JlbWVudCkNCiANCiAJCQlEYXRhVGFibGUgZGF0YVRh
YmxlU2NoZW1hICA9IG51bGw7DQogDQpJbmRleDogTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxp
dGVQYXJhbWV0ZXJDb2xsZWN0aW9uLmNzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL21vbm8vbWNz
L2NsYXNzL01vbm8uRGF0YS5TcWxpdGVDbGllbnQvTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxp
dGVQYXJhbWV0ZXJDb2xsZWN0aW9uLmNzLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4yDQpkaWZm
IC11IC1iIC1yMS4yIFNxbGl0ZVBhcmFtZXRlckNvbGxlY3Rpb24uY3MNCi0tLSBNb25vLkRhdGEu
U3FsaXRlQ2xpZW50L1NxbGl0ZVBhcmFtZXRlckNvbGxlY3Rpb24uY3MJMTIgTm92IDIwMDMgMDE6
MTk6MTkgLTAwMDAJMS4yDQorKysgTW9uby5EYXRhLlNxbGl0ZUNsaWVudC9TcWxpdGVQYXJhbWV0
ZXJDb2xsZWN0aW9uLmNzCTkgTWF5IDIwMDQgMjM6MTk6NDQgLTAwMDANCkBAIC0zLDcgKzMsNyBA
QA0KIC8vICBTcWxpdGVQYXJhbWV0ZXJDb2xsZWN0aW9uLmNzDQogLy8NCiAvLyAgQXV0aG9yKHMp
OiBWbGFkaW1pciBWdWtpY2V2aWMgIDx2bGFkaW1pckBwb2JveC5jb20+DQotLy8NCisvLwkJCUNo
cmlzIFR1cmNoaW4gPGNocmlzQHR1cmNoaW4ubmV0Pg0KIC8vICBDb3B5cmlnaHQgKEMpIDIwMDIg
IFZsYWRpbWlyIFZ1a2ljZXZpYw0KIC8vDQogDQpAQCAtMjEsNyArMjEsNyBAQA0KIA0KICAgICAg
ICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvciAoKQ0KICAgICAgICAg
ICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVu
dGVkRXhjZXB0aW9uICgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm51
bWVyaWNfcGFyYW1fbGlzdC5HZXRFbnVtZXJhdG9yKCk7DQogICAgICAgICAgICAgICAgIH0NCiAN
CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlQXQgKHN0cmluZyBwYXJhbWV0ZXJO
YW1lKQ0KQEAgLTUyLDcgKzUyLDEwIEBADQogDQogICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQg
SW5kZXhPZiAoc3RyaW5nIHBhcmFtZXRlck5hbWUpDQogICAgICAgICAgICAgICAgIHsNCisJCQkJ
CWlmIChuYW1lZF9wYXJhbV9oYXNoLkNvbnRhaW5zKHBhcmFtZXRlck5hbWUpKQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSBuYW1lZF9wYXJhbV9oYXNoW3BhcmFtZXRlck5h
bWVdOw0KKwkJCQkJZWxzZQ0KKwkJCQkJCXJldHVybiAtMTsNCiAgICAgICAgICAgICAgICAgfQ0K
IA0KICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IEluZGV4T2YgKFNxbGl0ZVBhcmFtZXRlciBw
YXJhbSkNCkBAIC05NywzNyArMTAwLDQ3IEBADQogDQogICAgICAgICAgICAgICAgIHB1YmxpYyBT
cWxpdGVQYXJhbWV0ZXIgdGhpc1tzdHJpbmcgcGFyYW1ldGVyTmFtZV0gew0KICAgICAgICAgICAg
ICAgICAgICAgICAgIGdldCB7DQorCQkJCQkJCWlmICh0aGlzLkNvbnRhaW5zKHBhcmFtZXRlck5h
bWUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbKGludCkg
bmFtZWRfcGFyYW1faGFzaFtwYXJhbWV0ZXJOYW1lXV07DQorCQkJCQkJCWVsc2UNCisJCQkJCQkJ
CXRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgbmFtZSBk
b2VzIG5vdCBleGlzdDogIiArIHBhcmFtZXRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgew0KLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29udGFpbnMgKHBhcmFtZXRlck5hbWUpKQ0KKwkJCQkJ
CQlpZiAodGhpcy5Db250YWlucyhwYXJhbWV0ZXJOYW1lKSkNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19wYXJhbV9saXN0WyhpbnQpIG5hbWVkX3BhcmFt
X2hhc2hbcGFyYW1ldGVyTmFtZV1dID0gdmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlbHNlICAgICAgICAgIC8vIHVobSwgZG8gd2UgYWRkIGl0IGlmIGl0IGRvZXNuJ3Qg
ZXhpc3Q/IHdoYXQgZG9lcyBtcyBkbz8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQWRkICh2YWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ug
ICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5k
ZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIG5hbWUgZG9lcyBub3QgZXhpc3Q6
ICIgKyBwYXJhbWV0ZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg
ICAgICAgICAgIH0NCiANCiAgICAgICAgICAgICAgICAgcHVibGljIFNxbGl0ZVBhcmFtZXRlciB0
aGlzW2ludCBwYXJhbWV0ZXJJbmRleF0gew0KICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB7
DQorCQkJCQkJCWlmICh0aGlzLkNvdW50ID49IHBhcmFtZXRlckluZGV4KzEpDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNxbGl0ZVBhcmFtZXRlcikgbnVtZXJpY19w
YXJhbV9saXN0W3BhcmFtZXRlckluZGV4XTsNCisJCQkJCQkJZWxzZSAgICAgICAgICANCisJCQkJ
CQkJCXRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgcGFy
YW1ldGVyIGluZGV4IGRvZXMgbm90IGV4aXN0OiAiICsgcGFyYW1ldGVySW5kZXguVG9TdHJpbmco
KSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAg
IHNldCB7DQorCQkJCQkJCWlmICh0aGlzLkNvdW50ID49IHBhcmFtZXRlckluZGV4KzEpDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljX3BhcmFtX2xpc3RbcGFyYW1ldGVy
SW5kZXhdID0gdmFsdWU7DQorCQkJCQkJCWVsc2UgICAgICAgICAgDQorCQkJCQkJCQl0aHJvdyBu
ZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpbmRl
eCBkb2VzIG5vdCBleGlzdDogIiArIHBhcmFtZXRlckluZGV4LlRvU3RyaW5nKCkpOw0KICAgICAg
ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfQ0KIA0KICAgICAgICAgICAg
ICAgICBwdWJsaWMgaW50IEFkZCAob2JqZWN0IHZhbHVlKQ0KICAgICAgICAgICAgICAgICB7DQog
ICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tTcWxpdGVQYXJhbSAodmFsdWUpOw0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIFNxbGl0ZVBhcmFtZXRlciBzcWxwID0gKFNxbGl0ZVBhcmFtZXRl
cikgdmFsdWU7DQorCQkJCQkJDQorCQkJCQkJU3FsaXRlUGFyYW1ldGVyIHNxbHAgPSB2YWx1ZSBh
cyBTcWxpdGVQYXJhbWV0ZXI7DQorCQkJCQkNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
bmFtZWRfcGFyYW1faGFzaC5Db250YWlucyAoc3FscC5QYXJhbWV0ZXJOYW1lKSkNCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVOYW1lRXhjZXB0aW9u
ICgiUGFyYW1ldGVyIGNvbGxlY3Rpb24gYWxyZWFkeSBjb250YWlucyBnaXZlbiB2YWx1ZS4iKTsN
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVOYW1l
RXhjZXB0aW9uICgiUGFyYW1ldGVyIGNvbGxlY3Rpb24gYWxyZWFkeSBjb250YWlucyB0aGUgYSBT
cWxpdGVQYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gUGFyYW1ldGVyTmFtZS4iKTsNCiANCi0gICAg
ICAgICAgICAgICAgICAgICAgICBuYW1lZF9wYXJhbV9oYXNoW3ZhbHVlXSA9IG51bWVyaWNfcGFy
YW1fbGlzdC5BZGQgKHZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZF9wYXJh
bV9oYXNoW3NxbHAuUGFyYW1ldGVyTmFtZV0gPSBudW1lcmljX3BhcmFtX2xpc3QuQWRkKHZhbHVl
KTsNCiANCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgbmFtZWRfcGFyYW1f
aGFzaFt2YWx1ZV07DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIG5hbWVk
X3BhcmFtX2hhc2hbc3FscC5QYXJhbWV0ZXJOYW1lXTsNCiAgICAgICAgICAgICAgICAgfQ0KLQ0K
ICAgICAgICAgICAgICAgICAvLyBJTGlzdA0KIA0KICAgICAgICAgICAgICAgICBwdWJsaWMgU3Fs
aXRlUGFyYW1ldGVyIEFkZCAoU3FsaXRlUGFyYW1ldGVyIHBhcmFtKQ0KQEAgLTE0NiwxNiArMTU5
LDE0IEBADQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFkZCAobmV3IFNxbGl0ZVBh
cmFtZXRlciAobmFtZSwgdHlwZSkpOw0KICAgICAgICAgICAgICAgICB9DQogDQotICAgICAgICAg
ICAgICAgIHB1YmxpYyBib29sIElzRml4ZWRTaXplIHsNCi0gICAgICAgICAgICAgICAgICAgICAg
ICBnZXQgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0K
LSAgICAgICAgICAgICAgICAgICAgICAgIH0NCisJCQkJYm9vbCBJTGlzdC5Jc0ZpeGVkU2l6ZQ0K
KwkJCQl7DQorCQkJCQlnZXQgeyByZXR1cm4gdGhpcy5udW1lcmljX3BhcmFtX2xpc3QuSXNGaXhl
ZFNpemU7IH0NCiAgICAgICAgICAgICAgICAgfQ0KIA0KLSAgICAgICAgICAgICAgICBwdWJsaWMg
Ym9vbCBJc1JlYWRPbmx5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXQgew0KLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0NCisJCQkJYm9vbCBJTGlzdC5Jc1JlYWRPbmx5DQorCQkJCXsNCisJCQkJCWdl
dCB7IHJldHVybiB0aGlzLm51bWVyaWNfcGFyYW1fbGlzdC5Jc1JlYWRPbmx5OyB9DQogICAgICAg
ICAgICAgICAgIH0NCiANCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIgKCkNCkBA
IC0xODQsMzMgKzE5NSwzNSBAQA0KIA0KICAgICAgICAgICAgICAgICAvLyBJQ29sbGVjdGlvbg0K
IA0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IENvdW50IHsNCi0gICAgICAgICAgICAgICAg
ICAgICAgICBnZXQgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51
bWVyaWNfcGFyYW1fbGlzdC5Db3VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQorCQkJ
CXB1YmxpYyBpbnQgQ291bnQgDQorCQkJCXsNCisJCQkJCWdldCB7IHJldHVybiB0aGlzLm51bWVy
aWNfcGFyYW1fbGlzdC5Db3VudDsgfQ0KICAgICAgICAgICAgICAgICB9DQogDQotICAgICAgICAg
ICAgICAgIHB1YmxpYyBib29sIElzU3luY2hyb25pemVkIHsNCi0gICAgICAgICAgICAgICAgICAg
ICAgICBnZXQgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCisJCQkJYm9vbCBJQ29sbGVjdGlvbi5Jc1N5
bmNocm9uaXplZCANCisJCQkJew0KKwkJCQkJZ2V0IHsgcmV0dXJuIHRoaXMubnVtZXJpY19wYXJh
bV9saXN0LklzU3luY2hyb25pemVkOyB9DQogICAgICAgICAgICAgICAgIH0NCiANCi0gICAgICAg
ICAgICAgICAgcHVibGljIG9iamVjdCBTeW5jUm9vdCB7DQotICAgICAgICAgICAgICAgICAgICAg
ICAgZ2V0IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0K
LSAgICAgICAgICAgICAgICAgICAgICAgIH0NCisJCQkJb2JqZWN0IElDb2xsZWN0aW9uLlN5bmNS
b290IA0KKwkJCQl7DQorCQkJCQlnZXQgeyByZXR1cm4gdGhpcy5udW1lcmljX3BhcmFtX2xpc3Qu
U3luY1Jvb3Q7IH0NCiAgICAgICAgICAgICAgICAgfQ0KIA0KICAgICAgICAgICAgICAgICBwdWJs
aWMgdm9pZCBDb3B5VG8gKEFycmF5IGFycmF5LCBpbnQgaW5kZXgpDQogICAgICAgICAgICAgICAg
IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNl
cHRpb24gKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1lcmljX3BhcmFtX2xp
c3QuQ29weVRvKGFycmF5LCBpbmRleCk7DQogICAgICAgICAgICAgICAgIH0NCiANCiAgICAgICAg
ICAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrU3FsaXRlUGFyYW0gKG9iamVjdCB2YWx1ZSkNCiAg
ICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGlz
IFNxbGl0ZVBhcmFtZXRlcikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJv
dyBuZXcgSW52YWxpZENhc3RFeGNlcHRpb24gKCJDYW4gb25seSB1c2UgU3FsaXRlUGFyYW1ldGVy
IG9iamVjdHMiKTsNCisJCQkJCQ0KKwkJCQkJU3FsaXRlUGFyYW1ldGVyIHNxbHAgPSB2YWx1ZSBh
cyBTcWxpdGVQYXJhbWV0ZXI7DQorCQkJCQkNCisJCQkJCWlmIChzcWxwLlBhcmFtZXRlck5hbWUg
PT0gbnVsbCB8fCBzcWxwLlBhcmFtZXRlck5hbWUuTGVuZ3RoID09IDApDQorCQkJCQkJc3FscC5Q
YXJhbWV0ZXJOYW1lID0gdGhpcy5HZW5lcmF0ZVBhcmFtZXRlck5hbWUoKTsNCiAgICAgICAgICAg
ICAgICAgfQ0KIA0KICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgUmVjcmVhdGVOYW1lZEhh
c2ggKCkNCkBAIC0yMTksNSArMjMyLDI1IEBADQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuYW1lZF9wYXJhbV9oYXNoWygoU3FsaXRlUGFyYW1ldGVyKSBudW1lcmljX3BhcmFtX2xp
c3RbaV0pLlBhcmFtZXRlck5hbWVdID0gaTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgIH0NCisJCQkJDQorCQkJCS8vRklYTUU6IGlmIHRoZSB1c2VyIGlzIGNh
bGxpbmcgSW5zZXJ0IGF0IHZhcmlvdXMgbG9jYXRpb25zIHdpdGggdW5uYW1lZCBwYXJhbWV0ZXJz
LCB0aGlzIGlzIG5vdCBnb2luZyB0byB3b3JrLi4uLg0KKwkJCQlwcml2YXRlIHN0cmluZyBHZW5l
cmF0ZVBhcmFtZXRlck5hbWUoKQ0KKwkJCQl7DQorCQkJCQlpbnQJCWluZGV4CT0gdGhpcy5Db3Vu
dCArIDE7DQorCQkJCQlzdHJpbmcJbmFtZQk9IFN0cmluZy5FbXB0eTsNCisJCQ0KKwkJCQkJd2hp
bGUgKGluZGV4ID4gMCkNCisJCQkJCXsNCisJCQkJCQluYW1lID0gIkAiICsgaW5kZXguVG9TdHJp
bmcoKTsNCisNCisJCQkJCQlpZiAodGhpcy5JbmRleE9mKG5hbWUpID09IC0xKQ0KKwkJCQkJCQlp
bmRleCA9IC0xOw0KKwkJCQkJCWVsc2UNCisJCQkJCQkJaW5kZXgrKzsNCisJCQkJCX0NCisJCQ0K
KwkJCQkJcmV0dXJuIG5hbWU7DQorCQkJCX0NCisNCiAgICAgICAgIH0NCiB9DQpJbmRleDogVGVz
dC9TcWxpdGVUZXN0LmNzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL21vbm8vbWNzL2NsYXNzL01v
bm8uRGF0YS5TcWxpdGVDbGllbnQvVGVzdC9TcWxpdGVUZXN0LmNzLHYNCnJldHJpZXZpbmcgcmV2
aXNpb24gMS4xDQpkaWZmIC11IC1iIC1yMS4xIFNxbGl0ZVRlc3QuY3MNCi0tLSBUZXN0L1NxbGl0
ZVRlc3QuY3MJMTMgT2N0IDIwMDIgMTA6NTM6NDMgLTAwMDAJMS4xDQorKysgVGVzdC9TcWxpdGVU
ZXN0LmNzCTkgTWF5IDIwMDQgMjM6MTk6NDQgLTAwMDANCkBAIC0xMSwxMSArMTEsMTEgQEANCiAv
LyBUaGVyZSBhcmUgYmluYXJpZXMgZm9yIFdpbmRvd3MgYW5kIExpbnV4Lg0KIC8vDQogLy8gVG8g
Y29tcGlsZToNCi0vLyAgbWNzIFNxbGl0ZVRlc3QuY3MgLXIgU3lzdGVtLkRhdGEuZGxsIC1yIE1v
bm8uRGF0YS5TcWxpdGVDbGllbnQuZGxsDQorLy8gICAgICAgIG1jcyAtcjpTeXN0ZW0uRGF0YSAt
cjpNb25vLkRhdGEuU3FsaXRlQ2xpZW50IFNxbGl0ZVRlc3QuY3MNCiAvLw0KIC8vIEF1dGhvcjoN
CiAvLyAgICAgRGFuaWVsIE1vcmdhbiA8ZGFubW9yZ0BzYy5yci5jb20+DQotLy8NCisvLwlDaHJp
cyBUdXJjaGluIDxjaHJpc0B0dXJjaGluLm5ldD4NCiANCiB1c2luZyBTeXN0ZW07DQogdXNpbmcg
U3lzdGVtLkRhdGE7DQpAQCAtMjUsMTIgKzI1LDEwIEBADQogew0KIAljbGFzcyBTcWxpdGVUZXN0
DQogCXsNCisJCS8vVE9ETzogd3JpdGUgdW5pdCB0ZXN0cyBmb3IgYWxsIG9mIHRoaXMgdXNpbmcg
bnVuaXQNCiAJCVtTVEFUaHJlYWRdDQogCQlzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3Mp
DQogCQl7DQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIklmIHRoaXMgdGVzdCB3b3JrcywgeW91IHNo
b3VsZCBnZXQ6Iik7DQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIkRhdGEgMTogNSIpOw0KLQkJCUNv
bnNvbGUuV3JpdGVMaW5lKCJEYXRhIDI6IE1vbm8iKTsNCiANCiAJCQlDb25zb2xlLldyaXRlTGlu
ZSgiY3JlYXRlIFNxbGl0ZUNvbm5lY3Rpb24uLi4iKTsNCiAJCQlTcWxpdGVDb25uZWN0aW9uIGRi
Y29uID0gbmV3IFNxbGl0ZUNvbm5lY3Rpb24oKTsNCkBAIC00MCw1MSArMzgsMTM1IEBADQogCQkJ
Ly8gZmlsZSBpcyBjcmVhdGVkLg0KIA0KIAkJCS8vICJVUkk9ZmlsZTpzb21lL3BhdGgiDQotCQkJ
c3RyaW5nIGNvbm5lY3Rpb25TdHJpbmcgPQ0KLQkJCQkiVVJJPWZpbGU6U3FsaXRlVGVzdC5kYiI7
DQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoInNldHRpbmcgQ29ubmVjdGlvblN0cmluZyB1c2luZzog
IiArIA0KLQkJCQljb25uZWN0aW9uU3RyaW5nKTsNCisJCQlzdHJpbmcgY29ubmVjdGlvblN0cmlu
ZyA9ICJVUkk9ZmlsZTpTcWxpdGVUZXN0LmRiIjsNCisJCQlDb25zb2xlLldyaXRlTGluZSgic2V0
dGluZyBDb25uZWN0aW9uU3RyaW5nIHVzaW5nOiAiICsgY29ubmVjdGlvblN0cmluZyk7DQogCQkJ
ZGJjb24uQ29ubmVjdGlvblN0cmluZyA9IGNvbm5lY3Rpb25TdHJpbmc7DQogCQkJCQ0KIAkJCUNv
bnNvbGUuV3JpdGVMaW5lKCJvcGVuIHRoZSBjb25uZWN0aW9uLi4uIik7DQogCQkJZGJjb24uT3Bl
bigpOw0KIA0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJjcmVhdGUgU3FsaXRlQ29tbWFuZCB0byBD
UkVBVEUgVEFCTEUgTU9OT19URVNUIik7DQogCQkJU3FsaXRlQ29tbWFuZCBkYmNtZCA9IG5ldyBT
cWxpdGVDb21tYW5kKCk7DQogCQkJZGJjbWQuQ29ubmVjdGlvbiA9IGRiY29uOw0KIAkJCQ0KLQkJ
CWRiY21kLkNvbW1hbmRUZXh0ID0gDQotCQkJCSJDUkVBVEUgVEFCTEUgTU9OT19URVNUICggIiAr
DQotCQkJCSJOSUQgSU5ULCAiICsNCi0JCQkJIk5ERVNDIFRFWFQgKSI7CQkNCi0JCQlDb25zb2xl
LldyaXRlTGluZSgiZXhlY3V0ZSBjb21tYW5kLi4uIik7DQotCQkJZGJjbWQuRXhlY3V0ZU5vblF1
ZXJ5KCk7DQotDQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoInNldCBhbmQgZXhlY3V0ZSBjb21tYW5k
IHRvIElOU0VSVCBJTlRPIE1PTk9fVEVTVCIpOw0KLQkJCWRiY21kLkNvbW1hbmRUZXh0ID0NCi0J
CQkJIklOU0VSVCBJTlRPIE1PTk9fVEVTVCAgIiArDQotCQkJCSIoTklELCBOREVTQyApIisNCi0J
CQkJIlZBTFVFUyg1LCdNb25vJykiOw0KLQkJCWRiY21kLkV4ZWN1dGVOb25RdWVyeSgpOw0KLQ0K
LQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJzZXQgY29tbWFuZCB0byBTRUxFQ1QgRlJPTSBNT05PX1RF
U1QiKTsNCi0JCQlkYmNtZC5Db21tYW5kVGV4dCA9DQotCQkJCSJTRUxFQ1QgKiBGUk9NIE1PTk9f
VEVTVCI7DQotCQkJU3FsaXRlRGF0YVJlYWRlciByZWFkZXI7DQotCQkJQ29uc29sZS5Xcml0ZUxp
bmUoImV4ZWN1dGUgcmVhZGVyLi4uIik7DQotCQkJcmVhZGVyID0gZGJjbWQuRXhlY3V0ZVJlYWRl
cigpOw0KKwkJCVNldHVwREIoZGJjbWQpOw0KKwkJCQ0KKwkJCUNvbnNvbGUuV3JpdGVMaW5lKCJT
RUxFQ1RJTkcgREFUQSBGUk9NIE1PTk9fVEVTVCIpOw0KKwkJCQ0KKwkJCVRlc3RXaXRob3V0UGFy
YW1ldGVycyhkYmNtZCk7DQorCQkJVGVzdFNpbmdsZVBhcmFtZXRlcihkYmNtZCk7DQorCQkJLy9U
ZXN0VW5uYW1lZFBhcmFtZXRlcnMoZGJjbWQpOw0KKwkJCVRlc3RNdWx0aXBsZVBhcmFtZXRlcnMo
ZGJjbWQpOw0KIA0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJyZWFkIGFuZCBkaXNwbGF5IGRhdGEu
Li4iKTsNCi0JCQl3aGlsZShyZWFkZXIuUmVhZCgpKSB7DQotCQkJCUNvbnNvbGUuV3JpdGVMaW5l
KCJEYXRhIDE6ICIgKyByZWFkZXJbMF0uVG9TdHJpbmcoKSk7DQotCQkJCUNvbnNvbGUuV3JpdGVM
aW5lKCJEYXRhIDI6ICIgKyByZWFkZXJbMV0uVG9TdHJpbmcoKSk7DQotCQkJfQ0KLQkJCUNvbnNv
bGUuV3JpdGVMaW5lKCJjbGVhbiB1cC4uLiIpOw0KLQkJCXJlYWRlci5DbG9zZSgpOw0KIAkJCWRi
Y21kLkRpc3Bvc2UoKTsNCiAJCQlkYmNvbi5DbG9zZSgpOw0KIA0KIAkJCUNvbnNvbGUuV3JpdGVM
aW5lKCJEb25lLiIpOw0KKwkJfQ0KKwkJDQorCQlzdGF0aWMgdm9pZCBTZXR1cERCKFNxbGl0ZUNv
bW1hbmQgZGJjbWQpDQorCQl7DQorCQkJZGJjbWQuQ29tbWFuZFRleHQgPSAiQ1JFQVRFIFRBQkxF
IE1PTk9fVEVTVCAoIE5JRCBJTlQsIE5ERVNDIFRFWFQsIEVNQUlMIFRFWFQpIjsJCQ0KKwkJCUNv
bnNvbGUuV3JpdGVMaW5lKCJleGVjdXRlIFNxbGl0ZUNvbW1hbmQgdG8gQ1JFQVRFIFRBQkxFIE1P
Tk9fVEVTVDogIiArIGRiY21kLkNvbW1hbmRUZXh0ICk7DQorCQkJZGJjbWQuRXhlY3V0ZU5vblF1
ZXJ5KCk7DQorCQkJDQorCQkJQ29uc29sZS5Xcml0ZUxpbmUoImluc2VydGluZyBkYXRhIGludG8g
TU9OT19URVNULi4uIik7DQorCQkJZGJjbWQuQ29tbWFuZFRleHQgPQkiSU5TRVJUIElOVE8gTU9O
T19URVNUICAoTklELCBOREVTQywgRU1BSUwgKSBWQUxVRVMoMSwnTW9ubyAxJywnY2hyaXNAdHVy
Y2hpbi5uZXQnKSI7DQorCQkJZGJjbWQuRXhlY3V0ZU5vblF1ZXJ5KCk7DQorCQkJDQorCQkJZGJj
bWQuQ29tbWFuZFRleHQgPSJJTlNFUlQgSU5UTyBNT05PX1RFU1QgIChOSUQsIE5ERVNDLCBFTUFJ
TCApIFZBTFVFUygyLCdNb25vIDInLCd0ZXN0QHRlc3QnKSI7DQorCQkJZGJjbWQuRXhlY3V0ZU5v
blF1ZXJ5KCk7DQorDQorCQkJZGJjbWQuQ29tbWFuZFRleHQgPSAiSU5TRVJUIElOVE8gTU9OT19U
RVNUICAoTklELCBOREVTQyApIFZBTFVFUygzLCdNb25vIDMnKSI7DQorCQkJZGJjbWQuRXhlY3V0
ZU5vblF1ZXJ5KCk7DQorDQorCQkJZGJjbWQuQ29tbWFuZFRleHQgPSJJTlNFUlQgSU5UTyBNT05P
X1RFU1QgKE5JRCwgTkRFU0MgKSBWQUxVRVMoNCwnTW9ubyA0JykiOw0KKwkJCWRiY21kLkV4ZWN1
dGVOb25RdWVyeSgpOw0KKw0KKwkJCWRiY21kLkNvbW1hbmRUZXh0ID0gIklOU0VSVCBJTlRPIE1P
Tk9fVEVTVCAoTklELCBOREVTQywgRU1BSUwgKSBWQUxVRVMoNSwnTW9ubyA1JywndGVzdEB0ZXN0
JykiOw0KKwkJCWRiY21kLkV4ZWN1dGVOb25RdWVyeSgpOw0KKwkJfQ0KKwkJDQorCQlzdGF0aWMg
dm9pZCBUZXN0V2l0aG91dFBhcmFtZXRlcnMoU3FsaXRlQ29tbWFuZCBkYmNtZCkNCisJCXsNCisJ
CQlkYmNtZC5Db21tYW5kVGV4dCA9CSJTRUxFQ1QgKiBGUk9NIE1PTk9fVEVTVCB3aGVyZSBOSUQg
PiAgMiI7DQorCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3RXaXRob3V0UGFyYW1ldGVyczogIiAr
IGRiY21kLkNvbW1hbmRUZXh0ICsgIlxuXG5leGVjdXRlIHJlYWRlci4uLiIpOwkJCQ0KKwkJCVNo
b3dEYXRhKCBkYmNtZC5FeGVjdXRlUmVhZGVyKCkpOw0KKwkJCQ0KKwkJCUNvbnNvbGUuV3JpdGVM
aW5lKCJuZXh0IHRlc3QuLi4iKTsNCisJCX0NCisJCQ0KKwkJc3RhdGljIHZvaWQgVGVzdFNpbmds
ZVBhcmFtZXRlciggU3FsaXRlQ29tbWFuZCBkYmNtZCApDQorCQl7DQorCQkJZGJjbWQuQ29tbWFu
ZFRleHQgPQkiU0VMRUNUICogRlJPTSBNT05PX1RFU1Qgd2hlcmUgTklEID4gIEAxIjsNCisNCisJ
CQlTcWxpdGVQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgU3FsaXRlUGFyYW1ldGVyKCk7DQorCQkJDQor
CQkJcGFyYW0uUGFyYW1ldGVyTmFtZSA9ICJAMSI7DQorCQkJcGFyYW0uVmFsdWUgPSAxOw0KKwkJ
CXBhcmFtLkRiVHlwZSA9IERiVHlwZS5JbnQzMjsNCisJCQkNCisJCQlkYmNtZC5QYXJhbWV0ZXJz
LkFkZChwYXJhbSk7DQorCQkJDQorCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3RTaW5nbGVQYXJh
bWV0ZXI6ICIgKyBkYmNtZC5Db21tYW5kVGV4dCArICJcblxuZXhlY3V0ZSByZWFkZXIuLi4iKTsN
CisJCQkNCisJCQlTaG93RGF0YSggZGJjbWQuRXhlY3V0ZVJlYWRlcigpKTsNCisJCQlkYmNtZC5Q
YXJhbWV0ZXJzLkNsZWFyKCk7DQorCQkJQ29uc29sZS5Xcml0ZUxpbmUoIm5leHQgdGVzdC4uLiIp
Ow0KKwkJCQ0KKwkJfQ0KKwkJDQorCQlzdGF0aWMgdm9pZCBUZXN0TXVsdGlwbGVQYXJhbWV0ZXJz
KCBTcWxpdGVDb21tYW5kIGRiY21kICkNCisJCXsNCisJCQ0KKwkJCWRiY21kLkNvbW1hbmRUZXh0
ID0JIlNFTEVDVCAqIEZST00gTU9OT19URVNUIHdoZXJlIE5JRCA+PSAgQG5pZCBBTkQgTkRFU0Mg
TElLRSBAbmRlc2MgYW5kIChFTUFJTCBMSUtFICclQHRlc3QnIG9yIEVNQUlMID0gQGVtYWlsKSI7
DQorCQkJDQorCQkJZGJjbWQuUGFyYW1ldGVycy5BZGQobmV3IFNxbGl0ZVBhcmFtZXRlcigiQG5p
ZCIgLCAxKSApOw0KKwkJCWRiY21kLlBhcmFtZXRlcnMuQWRkKG5ldyBTcWxpdGVQYXJhbWV0ZXIo
IkBuZGVzYyIsICJfb25vJSIpICk7DQorCQkJZGJjbWQuUGFyYW1ldGVycy5JbnNlcnQoMSxuZXcg
U3FsaXRlUGFyYW1ldGVyKCJAZW1haWwiLCJjaHJpc0B0dXJjaGluLm5ldCIpKTsNCisJCQkNCisJ
CQlDb25zb2xlLldyaXRlTGluZSgiVGVzdE11bHRpcGxlUGFyYW1ldGVyczogIiArIGRiY21kLkNv
bW1hbmRUZXh0ICsgIlxuXG5leGVjdXRlIHJlYWRlci4uLiIpOw0KKwkJCVNob3dEYXRhKCBkYmNt
ZC5FeGVjdXRlUmVhZGVyKCkpOw0KKwkJCWRiY21kLlBhcmFtZXRlcnMuQ2xlYXIoKTsNCisJCQlD
b25zb2xlLldyaXRlTGluZSgibmV4dCB0ZXN0Li4uIik7DQorCQl9DQorCQkNCisJCXN0YXRpYyB2
b2lkIFRlc3RVbm5hbWVkUGFyYW1ldGVycyggU3FsaXRlQ29tbWFuZCBkYmNtZCApDQorCQl7DQor
CQkJZGJjbWQuQ29tbWFuZFRleHQgPQkiU0VMRUNUICogRlJPTSBNT05PX1RFU1Qgd2hlcmUgTklE
ID4gIEAxIEFORCBOREVTQyBMSUtFIEAyIGFuZCAoRU1BSUwgTElLRSAnJUB0ZXN0JyBvciBFTUFJ
TCA9IEAzKSI7DQorDQorCQkJU3FsaXRlUGFyYW1ldGVyIHBhcmFtID0gbmV3IFNxbGl0ZVBhcmFt
ZXRlcigpOw0KKwkJCVNxbGl0ZVBhcmFtZXRlciBwYXJhbTIgPSBuZXcgU3FsaXRlUGFyYW1ldGVy
KCk7DQorCQkNCisJCQlwYXJhbS5WYWx1ZSA9IDE7DQorCQkJcGFyYW0uRGJUeXBlID0gRGJUeXBl
LkludDMyOw0KKwkJCXBhcmFtMi5WYWx1ZSA9ICJfb25vIDUiOw0KKwkJCQ0KKwkJCWRiY21kLlBh
cmFtZXRlcnMuQWRkKHBhcmFtKTsNCisJCQlkYmNtZC5QYXJhbWV0ZXJzLkFkZChwYXJhbTIpOw0K
KwkJCWRiY21kLlBhcmFtZXRlcnMuSW5zZXJ0KDEsbmV3IFNxbGl0ZVBhcmFtZXRlcigiQDMiLCJj
aHJpc0B0dXJjaGluLm5ldCIpKTsNCisJCQkNCisJCQlDb25zb2xlLldyaXRlTGluZSgiVGVzdFVu
bmFtZWRQYXJhbWV0ZXJzOiAiICsgZGJjbWQuQ29tbWFuZFRleHQgKyAiXG5cbmV4ZWN1dGUgcmVh
ZGVyLi4uIik7DQorDQorCQkJU2hvd0RhdGEoIGRiY21kLkV4ZWN1dGVSZWFkZXIoKSk7DQorCQkJ
ZGJjbWQuUGFyYW1ldGVycy5DbGVhcigpOw0KKwkJCUNvbnNvbGUuV3JpdGVMaW5lKCJuZXh0IHRl
c3QuLi4iKTsNCisJCQkNCisJCX0NCisJCQ0KKwkJc3RhdGljIHZvaWQgU2hvd0RhdGEoU3FsaXRl
RGF0YVJlYWRlciByZWFkZXIpDQorCQl7DQorCQkJQ29uc29sZS5Xcml0ZUxpbmUoInJlYWQgYW5k
IGRpc3BsYXkgZGF0YS4uLiIpOw0KKwkJCXdoaWxlKHJlYWRlci5SZWFkKCkpIHsNCisJCQkJQ29u
c29sZS5Xcml0ZSgiZGF0YXJvdzpcdCIgKyByZWFkZXJbMF0uVG9TdHJpbmcoKSk7DQorCQkJCUNv
bnNvbGUuV3JpdGUoInxcdCIgKyByZWFkZXJbMV0uVG9TdHJpbmcoKSk7DQorCQkJCXN0cmluZyBl
bWFpbDsNCisJCQkJaWYgKHJlYWRlclsyXT09bnVsbCkNCisJCQkJCWVtYWlsID0gIihudWxsKSI7
DQorCQkJCWVsc2UNCisJCQkJCWVtYWlsID0gcmVhZGVyWzJdLlRvU3RyaW5nKCk7DQorCQkJCUNv
bnNvbGUuV3JpdGUoInxcdCIgKyBlbWFpbCArICJcbiIpOw0KKwkJCX0NCisJCQlyZWFkZXIuQ2xv
c2UoKTsNCiAJCX0NCiAJfQ0KIH0NCm==

--=-l0GdX8flvxT2ZyQLnsAL--