[omniORB] interim patch for persistent object keys (omniORB 2.8.0 pre1)

Wil_Evers@doosys.com Wil_Evers@doosys.com
Thu, 22 Jul 1999 11:00:20 GMT


--0__=cgcAktZQNa2KvTl2PERStSfdtGPZcA56RFb5GAiBYf8fGjNWp5UhZzkp
Content-type: text/plain; charset=us-ascii

Hi,

For those interested, attached to this message is a patch implementing
persistent, user-specified object keys for omniORB 2.8.0 pre-release 1.

Please beware that this patch is only meant as an interim solution until
omniORB supports the POA spec, which is expected to happen soon. For this
reason, the omniORB maintainers indicated it will probably not be
integrated in any official omniORB distribution.

The interface to the mechanism is declared in a new class called
omniORB::persistentLoader (header file omniORB.h), which has an interface
similar to omniORB::loader.  omniORB::persistentLoader contains two static
member functions:

- a function (createPersistentObjectReference) to create a persistent
object reference for a CORBA object identified by interface repo id, TCP
host name (or stringified IP number), TCP port number, virtual server name,
and a user-specified, variable length object id.  Note that this function
does NOT create an implementation object, only an object reference.

- a function (called 'set') to install a user-defined persistent loader
function that is called when a persistent object reference is detected by
the incoming message handler (GIOP driver). The job of the persistent
loader function is to examine  the supplied virtual server name and object
id, and return a reference to another object, to which any requests will be
redirected.  As for omniORB::loader::set(), the replacement object does not
have to live in the server's address space - it may even be another
persistent object reference.   Returning a nil object reference causes a
CORBA::OBJECT_NOT_EXIST exception to be raised on the client side.  Any
CORBA system exception (CORBA::TRANSIENT comes to mind) thrown from the
loader function is simply passed on to the client. The persistent loader
function is not thread safe: it may be called concurrently from multiple
threads.

The patch makes no attempt to retain the association between  the incoming
persistent object keys and the user-supplied replacement objects.

So far, it has only been tested on RedHat Linux 5.2 with egcs 1.1.2.

Enjoy,

- Wil
Wil Evers, DOOSYS IT Consultants, Maarssen, Holland


(See attached file: pk280pr1.pat)


--0__=cgcAktZQNa2KvTl2PERStSfdtGPZcA56RFb5GAiBYf8fGjNWp5UhZzkp
Content-type: application/octet-stream; 
	name="pk280pr1.pat"
Content-Disposition: attachment; filename="pk280pr1.pat"
Content-transfer-encoding: base64

ZGlmZiAtYyAtTiAtciBvbW5pT1JCXzI4MHByZTEub3JpZy9pbmNsdWRlL29tbmlPUkIyL2dpb3BE
cml2ZXIuaCBvbW5pT1JCXzI4MHByZTEvaW5jbHVkZS9vbW5pT1JCMi9naW9wRHJpdmVyLmgKKioq
IG9tbmlPUkJfMjgwcHJlMS5vcmlnL2luY2x1ZGUvb21uaU9SQjIvZ2lvcERyaXZlci5oCVNhdCBK
dW4gMjYgMTk6NTU6MzIgMTk5OQotLS0gb21uaU9SQl8yODBwcmUxL2luY2x1ZGUvb21uaU9SQjIv
Z2lvcERyaXZlci5oCVRodSBKdWwgMTUgMDk6MzE6NDMgMTk5OQoqKioqKioqKioqKioqKioKKioq
IDM5OCw0MDQgKioqKgogICAgX0NPUkJBX09jdGV0ICAqcGRfcHJpbmNpcGFsOwogICAgX0NPUkJB
X09jdGV0ICAgcGRfcHJfYnVmZmVyW09NTklPUkJfR0lPUERSSVZFUl9HSU9QX1NfSU5MSU5FX0JV
Rl9TSVpFXTsKICAKISAgIG9tbmlPYmplY3RLZXkgcGRfb2Jqa2V5OwogIAogICAgdm9pZCBIYW5k
bGVSZXF1ZXN0KF9DT1JCQV9Cb29sZWFuIGJ5dGVvcmRlcik7CiAgICB2b2lkIEhhbmRsZUxvY2F0
ZVJlcXVlc3QoX0NPUkJBX0Jvb2xlYW4gYnl0ZW9yZGVyKTsKLS0tIDM5OCw0MDkgLS0tLQogICAg
X0NPUkJBX09jdGV0ICAqcGRfcHJpbmNpcGFsOwogICAgX0NPUkJBX09jdGV0ICAgcGRfcHJfYnVm
ZmVyW09NTklPUkJfR0lPUERSSVZFUl9HSU9QX1NfSU5MSU5FX0JVRl9TSVpFXTsKICAKISAjZGVm
aW5lIE9NTklPUkJfR0lPUERSSVZFUl9HSU9QX1NfSU5MSU5FX1BFUlNJU1RLRVlfQlVGX1NJWkUg
NjQKISAKISAgIF9DT1JCQV9PY3RldCAgKnBkX3BlcnNpc3RrZXk7CiEgICBfQ09SQkFfT2N0ZXQg
ICBwZF9wa19idWZmZXJbT01OSU9SQl9HSU9QRFJJVkVSX0dJT1BfU19JTkxJTkVfUEVSU0lTVEtF
WV9CVUZfU0laRV07CiEgCiEgICBvbW5pT2JqZWN0S2V5IHBkX29tbmlrZXk7CiAgCiAgICB2b2lk
IEhhbmRsZVJlcXVlc3QoX0NPUkJBX0Jvb2xlYW4gYnl0ZW9yZGVyKTsKICAgIHZvaWQgSGFuZGxl
TG9jYXRlUmVxdWVzdChfQ09SQkFfQm9vbGVhbiBieXRlb3JkZXIpOwpkaWZmIC1jIC1OIC1yIG9t
bmlPUkJfMjgwcHJlMS5vcmlnL2luY2x1ZGUvb21uaU9SQjIvb21uaUludGVybmFsLmggb21uaU9S
Ql8yODBwcmUxL2luY2x1ZGUvb21uaU9SQjIvb21uaUludGVybmFsLmgKKioqIG9tbmlPUkJfMjgw
cHJlMS5vcmlnL2luY2x1ZGUvb21uaU9SQjIvb21uaUludGVybmFsLmgJU2F0IEp1biAyNiAxOTo1
NTo1MyAxOTk5Ci0tLSBvbW5pT1JCXzI4MHByZTEvaW5jbHVkZS9vbW5pT1JCMi9vbW5pSW50ZXJu
YWwuaAlUaHUgSnVsIDE1IDE1OjE0OjAzIDE5OTkKKioqKioqKioqKioqKioqCioqKiAxODgsMTk0
ICoqKioKLS0tIDE4OCwxOTggLS0tLQogICAgLy8gICAgICAgICAgZWxzZSBkZWZlciBjYWxsaW5n
IHRoZSBkZWxldGUgb3BlcmF0b3IgdW50aWwgYSBzdWJzZXF1ZW50CiAgICAvLyAgICAgICAgICBj
YWxsIHRvIEJPQTo6ZGlzcG9zZSgpLgogIAorICAgc3RhdGljIG9tbmlPYmplY3QgKnRyeUxvY2F0
ZU9iamVjdChvbW5pT2JqZWN0TWFuYWdlciosb21uaU9iamVjdEtleSYpOworICAgICAvLyByZXR1
cm5zIDAgaWYgbm90IGZvdW5kCiAgICBzdGF0aWMgb21uaU9iamVjdCAqbG9jYXRlT2JqZWN0KG9t
bmlPYmplY3RNYW5hZ2VyKixvbW5pT2JqZWN0S2V5ICZrKTsKKyAgICAgLy8gdGhyb3dzIE9CSkVD
VF9OT1RfRVhJU1QgaWYgbm90IGZvdW5kCisgCiAgICBzdGF0aWMgdm9pZCBkaXNwb3NlT2JqZWN0
KG9tbmlPYmplY3QgKm9iaik7CiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBv
YmplY3QgaXMgMCwgY2FsbCB0aGUgZGVsZXRlIG9wZXJhdG9yCiAgICAvLyB0byByZW1vdmUgdGhl
IG9iamVjdC4KKioqKioqKioqKioqKioqCioqKiAyMjQsMjI5ICoqKioKLS0tIDIyOCwyNDIgLS0t
LQogICAgLy8gSWYgPHRhcmdldFJlcG9JZD4gPT0gMCwgdGhlbiB0aGUgZGVzaXJlZCBpbnRlcmZh
Y2UgaXMgdGhlIHBzZXVkbyBvYmplY3QKICAgIC8vIENPUkJBOjpPYmplY3QgZnJvbSB3aGljaCBh
bGwgaW50ZXJmYWNlcyBkZXJpdmVkLgogIAorICAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIHZhbGlk
YXRlUGVyc2lzdGVudEtleSgKKyAgICAgY29uc3QgY2hhciAqJiB2aXJ0dWFsU2VydmVyTmFtZSwK
KyAgICAgY29uc3QgX0NPUkJBX09jdGV0IComb2JqZWN0SWQsIF9DT1JCQV9VTG9uZyYgb2JqZWN0
SWRMZW5ndGgsCisgICAgIGNvbnN0IF9DT1JCQV9PY3RldCAqb2JqZWN0S2V5XywgX0NPUkJBX1VM
b25nIG9iamVjdEtleUxlbmd0aCk7CisgCisgICBzdGF0aWMgb21uaU9iamVjdCAqY3JlYXRlUGVy
c2lzdGVudE9ialJlZihjb25zdCBjaGFyICpyZXBvaWQsCisgICAgIGNvbnN0IGNoYXIgKmhvc3RO
YW1lLCBfQ09SQkFfVVNob3J0IHBvcnROdW1iZXIsCisgICAgIGNvbnN0IGNoYXIgKnZpcnR1YWxT
ZXJ2ZXJOYW1lLAorICAgICBjb25zdCBfQ09SQkFfT2N0ZXQgKm9iamVjdElkLCBfQ09SQkFfVUxv
bmcgb2JqZWN0SWRMZW5ndGgpOwogIH07CiAgCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoqKioqKioqKioqKioq
KioKKioqIDU0Niw1NTIgKioqKgogIAogICAgZnJpZW5kIHZvaWQgb21uaTo6b2JqZWN0SXNSZWFk
eShvbW5pT2JqZWN0KiBvYmopOwogICAgZnJpZW5kIHZvaWQgb21uaTo6b2JqZWN0RHVwbGljYXRl
KG9tbmlPYmplY3QqIG9iaik7CiEgICBmcmllbmQgb21uaU9iamVjdCogb21uaTo6bG9jYXRlT2Jq
ZWN0KG9tbmlPYmplY3RNYW5hZ2VyKixvbW5pT2JqZWN0S2V5ICZrKTsKICAgIGZyaWVuZCB2b2lk
IG9tbmk6OmRpc3Bvc2VPYmplY3Qob21uaU9iamVjdCogb2JqKTsKICAgIGZyaWVuZCB2b2lkIG9t
bmk6Om9iamVjdFJlbGVhc2Uob21uaU9iamVjdCogb2JqKTsKICAgIGZyaWVuZCBjaGFyKiBvbW5p
OjpvYmplY3RUb1N0cmluZyhjb25zdCBvbW5pT2JqZWN0KiBvYmopOwotLS0gNTU5LDU2NSAtLS0t
CiAgCiAgICBmcmllbmQgdm9pZCBvbW5pOjpvYmplY3RJc1JlYWR5KG9tbmlPYmplY3QqIG9iaik7
CiAgICBmcmllbmQgdm9pZCBvbW5pOjpvYmplY3REdXBsaWNhdGUob21uaU9iamVjdCogb2JqKTsK
ISAgIGZyaWVuZCBvbW5pT2JqZWN0KiBvbW5pOjp0cnlMb2NhdGVPYmplY3Qob21uaU9iamVjdE1h
bmFnZXIqLG9tbmlPYmplY3RLZXkgJmspOwogICAgZnJpZW5kIHZvaWQgb21uaTo6ZGlzcG9zZU9i
amVjdChvbW5pT2JqZWN0KiBvYmopOwogICAgZnJpZW5kIHZvaWQgb21uaTo6b2JqZWN0UmVsZWFz
ZShvbW5pT2JqZWN0KiBvYmopOwogICAgZnJpZW5kIGNoYXIqIG9tbmk6Om9iamVjdFRvU3RyaW5n
KGNvbnN0IG9tbmlPYmplY3QqIG9iaik7CmRpZmYgLWMgLU4gLXIgb21uaU9SQl8yODBwcmUxLm9y
aWcvaW5jbHVkZS9vbW5pT1JCMi9vbW5pT1JCLmggb21uaU9SQl8yODBwcmUxL2luY2x1ZGUvb21u
aU9SQjIvb21uaU9SQi5oCioqKiBvbW5pT1JCXzI4MHByZTEub3JpZy9pbmNsdWRlL29tbmlPUkIy
L29tbmlPUkIuaAlTYXQgSnVuIDI2IDE5OjU3OjA1IDE5OTkKLS0tIG9tbmlPUkJfMjgwcHJlMS9p
bmNsdWRlL29tbmlPUkIyL29tbmlPUkIuaAlUdWUgSnVsIDIwIDE0OjE2OjA3IDE5OTkKKioqKioq
KioqKioqKioqCioqKiA0MTEsNDE2ICoqKioKLS0tIDQxMSw0MzAgLS0tLQogICAgfTsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAKKyAgIGNsYXNzIHBlcnNpc3RlbnRMb2FkZXIg
eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBwdWJs
aWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCisgICAgIHR5cGVkZWYgQ09SQkE6Ok9iamVjdF9wdHIgKCptYXBQZXJzaXN0ZW50
S2V5VG9PYmplY3RfdCkgKCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIGNvbnN0IGNoYXIg
KnZpcnR1YWxTZXJ2ZXJOYW1lLCAKKyAgICAgICBjb25zdCBDT1JCQTo6T2N0ZXQgKm9iamVjdElk
LCBDT1JCQTo6VUxvbmcgb2JqZWN0SWRMZW5ndGgpOyAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCisgICAgIHN0YXRpYyB2b2lkIHNldChtYXBQZXJzaXN0ZW50S2V5VG9PYmplY3RfdCBOZXdL
ZXlUb09iamVjdCk7CisgCisgICAgIHN0YXRpYyBDT1JCQTo6T2JqZWN0X3B0ciBjcmVhdGVQZXJz
aXN0ZW50T2JqZWN0UmVmZXJlbmNlKAorICAgICAgIGNvbnN0IGNoYXIgKnJlcG9pZCwKKyAgICAg
ICBjb25zdCBjaGFyICpob3N0TmFtZSwgQ09SQkE6OlVTaG9ydCBwb3J0TnVtYmVyLAorICAgICAg
IGNvbnN0IGNoYXIgKnZpcnR1YWxTZXJ2ZXJOYW1lLCAKKyAgICAgICBjb25zdCBDT1JCQTo6T2N0
ZXQgKm9iamVjdElkLCBDT1JCQTo6VUxvbmcgb2JqZWN0SWRMZW5ndGgpOworICAgfTsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAogIAogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyBjbGFzcyBnaW9wU2VydmVyVGhyZWFk
V3JhcHBlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KZGlmZiAtYyAt
TiAtciBvbW5pT1JCXzI4MHByZTEub3JpZy9zcmMvbGliL29tbmlPUkIyL29yYmNvcmUvZ2lvcFNl
cnZlci5jYyBvbW5pT1JCXzI4MHByZTEvc3JjL2xpYi9vbW5pT1JCMi9vcmJjb3JlL2dpb3BTZXJ2
ZXIuY2MKKioqIG9tbmlPUkJfMjgwcHJlMS5vcmlnL3NyYy9saWIvb21uaU9SQjIvb3JiY29yZS9n
aW9wU2VydmVyLmNjCVNhdCBKdW4gMjYgMjA6MDg6MDYgMTk5OQotLS0gb21uaU9SQl8yODBwcmUx
L3NyYy9saWIvb21uaU9SQjIvb3JiY29yZS9naW9wU2VydmVyLmNjCVdlZCBKdWwgMjEgMTU6MjA6
NTMgMTk5OQoqKioqKioqKioqKioqKioKKioqIDg3LDExMyAqKioqCiAgCiAgLy8gRHluYW1pYyBP
YmplY3QgTG9hZGluZwogIC8vIAohIHN0YXRpYyBvbW5pT1JCOjpsb2FkZXI6Om1hcEtleVRvT2Jq
ZWN0X3QgTWFwS2V5VG9PYmplY3RGdW5jdGlvbj0gMDsKICAKICB2b2lkIAogIG9tbmlPUkI6Omxv
YWRlcjo6c2V0KG9tbmlPUkI6OmxvYWRlcjo6bWFwS2V5VG9PYmplY3RfdCBOZXdNYXBLZXlUb09i
amVjdCkgCiAgewohICAgTWFwS2V5VG9PYmplY3RGdW5jdGlvbj0gTmV3TWFwS2V5VG9PYmplY3Q7
CiAgfQogIAogIAogIHN0YXRpYyB2b2lkIAogIE1hcnNoYWxsU3lzdGVtRXhjZXB0aW9uKEdJT1Bf
UyAqcywKICAJCQljb25zdCBHSU9QX0Jhc2V0eXBlczo6X1N5c0V4Y2VwdFJlcG9JRCAmaWQsCiAg
CQkJY29uc3QgQ09SQkE6OlN5c3RlbUV4Y2VwdGlvbiAmZXgpOwogIAotIAogIEdJT1BfUzo6R0lP
UF9TKFN0cmFuZCAqcykKICAgIDogTmV0QnVmZmVyZWRTdHJlYW0ocywxLDAsMCkKICB7CiAgICBw
ZF9zdGF0ZSA9IEdJT1BfUzo6SWRsZTsKICAgIHBkX29wZXJhdGlvbiA9ICZwZF9vcF9idWZmZXJb
MF07CiAgICBwZF9wcmluY2lwYWwgPSAmcGRfcHJfYnVmZmVyWzBdOwogICAgcGRfbWF4X21lc3Nh
Z2Vfc2l6ZSA9IE5ldEJ1ZmZlcmVkU3RyZWFtOjpNYXhNZXNzYWdlU2l6ZSgpIC0gCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE1lc3NhZ2VIZWFkZXI6OkhlYWRlclR5cGUpIC0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ09SQkE6OlVMb25nKTsKLS0tIDg3
LDEzMyAtLS0tCiAgCiAgLy8gRHluYW1pYyBPYmplY3QgTG9hZGluZwogIC8vIAohIHN0YXRpYyBv
bW5pT1JCOjpsb2FkZXI6Om1hcEtleVRvT2JqZWN0X3QgTWFwS2V5VG9PYmplY3RGdW5jdGlvbiA9
IDA7CiEgc3RhdGljIG9tbmlPUkI6OnBlcnNpc3RlbnRMb2FkZXI6Om1hcFBlcnNpc3RlbnRLZXlU
b09iamVjdF90IAohICAgTWFwUGVyc2lzdGVudEtleVRvT2JqZWN0RnVuY3Rpb24gPSAwOwogIAog
IHZvaWQgCiAgb21uaU9SQjo6bG9hZGVyOjpzZXQob21uaU9SQjo6bG9hZGVyOjptYXBLZXlUb09i
amVjdF90IE5ld01hcEtleVRvT2JqZWN0KSAKICB7CiEgICBNYXBLZXlUb09iamVjdEZ1bmN0aW9u
ID0gTmV3TWFwS2V5VG9PYmplY3Q7CiAgfQogIAorIHZvaWQgCisgb21uaU9SQjo6cGVyc2lzdGVu
dExvYWRlcjo6c2V0KAorICAgb21uaU9SQjo6cGVyc2lzdGVudExvYWRlcjo6bWFwUGVyc2lzdGVu
dEtleVRvT2JqZWN0X3QgTmV3TWFwS2V5VG9PYmplY3QpIAorIHsKKyAgIE1hcFBlcnNpc3RlbnRL
ZXlUb09iamVjdEZ1bmN0aW9uID0gTmV3TWFwS2V5VG9PYmplY3Q7CisgfQorIAorIENPUkJBOjpP
YmplY3RfcHRyCisgb21uaU9SQjo6cGVyc2lzdGVudExvYWRlcjo6Y3JlYXRlUGVyc2lzdGVudE9i
amVjdFJlZmVyZW5jZSgKKyAgIGNvbnN0IGNoYXIgKnJlcG9pZCwKKyAgIGNvbnN0IGNoYXIgKmhv
c3ROYW1lLCBDT1JCQTo6VVNob3J0IHBvcnROdW1iZXIsCisgICBjb25zdCBjaGFyICp2aXJ0dWFs
U2VydmVyTmFtZSwgCisgICBjb25zdCBDT1JCQTo6T2N0ZXQgKm9iamVjdElkLCBDT1JCQTo6VUxv
bmcgb2JqZWN0SWRMZW5ndGgpIAorIHsKKyAgIG9tbmlPYmplY3QgKm9ianB0ciA9IG9tbmk6OmNy
ZWF0ZVBlcnNpc3RlbnRPYmpSZWYocmVwb2lkLCBob3N0TmFtZSwgcG9ydE51bWJlciwKKyAgICAg
dmlydHVhbFNlcnZlck5hbWUsIG9iamVjdElkLCBvYmplY3RJZExlbmd0aCk7CisgICByZXR1cm4g
KENPUkJBOjpPYmplY3RfcHRyKShvYmpwdHItPl93aWRlbkZyb21UaGVNb3N0RGVyaXZlZEludGYo
MCkpOworIH0gIAogIAogIHN0YXRpYyB2b2lkIAogIE1hcnNoYWxsU3lzdGVtRXhjZXB0aW9uKEdJ
T1BfUyAqcywKICAJCQljb25zdCBHSU9QX0Jhc2V0eXBlczo6X1N5c0V4Y2VwdFJlcG9JRCAmaWQs
CiAgCQkJY29uc3QgQ09SQkE6OlN5c3RlbUV4Y2VwdGlvbiAmZXgpOwogIAogIEdJT1BfUzo6R0lP
UF9TKFN0cmFuZCAqcykKICAgIDogTmV0QnVmZmVyZWRTdHJlYW0ocywxLDAsMCkKICB7CiAgICBw
ZF9zdGF0ZSA9IEdJT1BfUzo6SWRsZTsKICAgIHBkX29wZXJhdGlvbiA9ICZwZF9vcF9idWZmZXJb
MF07CiAgICBwZF9wcmluY2lwYWwgPSAmcGRfcHJfYnVmZmVyWzBdOworICAgcGRfcGVyc2lzdGtl
eSA9ICZwZF9wa19idWZmZXJbMF07CiAgICBwZF9tYXhfbWVzc2FnZV9zaXplID0gTmV0QnVmZmVy
ZWRTdHJlYW06Ok1heE1lc3NhZ2VTaXplKCkgLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzaXplb2YoTWVzc2FnZUhlYWRlcjo6SGVhZGVyVHlwZSkgLQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNpemVvZihDT1JCQTo6VUxvbmcpOwoqKioqKioqKioqKioqKioKKioqIDEzMSwx
MzYgKioqKgotLS0gMTUxLDE2MCAtLS0tCiAgICAgIGRlbGV0ZSBbXSBwZF9wcmluY2lwYWw7CiAg
ICAgIHBkX3ByaW5jaXBhbCA9ICZwZF9wcl9idWZmZXJbMF07CiAgICB9CisgICBpZiAocGRfcGVy
c2lzdGtleSAhPSAmcGRfcGtfYnVmZmVyWzBdKSB7CisgICAgIGRlbGV0ZSBbXSBwZF9wZXJzaXN0
a2V5OworICAgICBwZF9wZXJzaXN0a2V5ID0gJnBkX3BrX2J1ZmZlclswXTsKKyAgIH0KICAKICAg
IGlmIChwZF9zdGF0ZSAhPSBHSU9QX1M6OklkbGUpIHsKICAgICAgc2V0U3RyYW5kSXNEeWluZygp
OwoqKioqKioqKioqKioqKioKKioqIDQ0OCw0NTQgKioqKgogIEdJT1BfUzo6SGFuZGxlUmVxdWVz
dChDT1JCQTo6Qm9vbGVhbiBieXRlb3JkZXIpCiAgewogICAgQ09SQkE6OlVMb25nIG1zZ3NpemU7
CiEgICBvbW5pT2JqZWN0ICpvYmogPSAwOyAgICAKICAKICAgIHRyeSB7CiAgICAgIC8vIFRoaXMg
dHJ5IGJsb2NrIGNhdGNoZXMgYW55IGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IHJhaXNlIGR1cmluZwot
LS0gNDcyLDQ4MSAtLS0tCiAgR0lPUF9TOjpIYW5kbGVSZXF1ZXN0KENPUkJBOjpCb29sZWFuIGJ5
dGVvcmRlcikKICB7CiAgICBDT1JCQTo6VUxvbmcgbXNnc2l6ZTsKISAgIG9tbmlPYmplY3QgKm9i
aiA9IDA7CiEgICBjb25zdCBjaGFyICp2aXJ0dWFsU2VydmVyTmFtZSA9IDA7CiEgICBjb25zdCBD
T1JCQTo6T2N0ZXQgKm9iamVjdElkOwohICAgQ09SQkE6OlVMb25nIG9iamVjdElkTGVuZ3RoOyAg
ICAKICAKICAgIHRyeSB7CiAgICAgIC8vIFRoaXMgdHJ5IGJsb2NrIGNhdGNoZXMgYW55IGV4Y2Vw
dGlvbiB0aGF0IG1pZ2h0IHJhaXNlIGR1cmluZwoqKioqKioqKioqKioqKioKKioqIDQ4MCw0OTMg
KioqKgogIAogICAgICBDT1JCQTo6VUxvbmcga2V5c2l6ZTsKICAgICAga2V5c2l6ZSA8PD0gKnRo
aXM7CiAgICAgIGlmIChrZXlzaXplID09IHNpemVvZihvbW5pT2JqZWN0S2V5KSkgewohICAgICAg
IGdldF9jaGFyX2FycmF5KChDT1JCQTo6Q2hhciopICZwZF9vYmprZXksIGtleXNpemUpOwogICAg
ICB9CiAgICAgIGVsc2UgewohICAgICAgIC8vIFRoaXMga2V5IGRpZCBub3QgY29tZSBmcm9tIHRo
aXMgb3JiLgohICAgICAgIC8vIHNpbGVudGx5IHNraXAgdGhlIGtleS4gSW5pdGlhbGlzZSBwZF9v
YmprZXkgdG8gYWxsIHplcm9zIGFuZAohICAgICAgIC8vIGxldCB0aGUgY2FsbCB0byBsb2NhdGVP
YmplY3QoKSBiZWxvdyB0byByYWlzZSB0aGUgcHJvcGVyIGV4Y2VwdGlvbgohICAgICAgIHBkX29i
amtleSA9IG9tbmlPUkI6Om51bGxrZXkoKTsKICAgICAgICAKICAgICAgICAvLyBIb3dldmVyLCB3
ZSBtYWtlIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgYm9vdHN0cmFwcGluZyBhZ2VudC4KICAgICAg
ICAvLyBUaGUgb2JqZWN0IGtleSBpcyAiSU5JVCIuIElmIHRoZSBrZXkgbWF0Y2ggYW5kIHdlIGRv
IGhhdmUKLS0tIDUwNyw1MjIgLS0tLQogIAogICAgICBDT1JCQTo6VUxvbmcga2V5c2l6ZTsKICAg
ICAga2V5c2l6ZSA8PD0gKnRoaXM7CisgCiAgICAgIGlmIChrZXlzaXplID09IHNpemVvZihvbW5p
T2JqZWN0S2V5KSkgewohICAgICAgIGdldF9jaGFyX2FycmF5KChDT1JCQTo6Q2hhciopICZwZF9v
bW5pa2V5LCBrZXlzaXplKTsKICAgICAgfQogICAgICBlbHNlIHsKISAKISAgICAgICAvLyBGb3Ig
bm93LCBhc3N1bWUgdGhlIGtleSBkaWQgbm90IGNvbWUgZnJvbSB0aGlzIE9SQi4KISAgICAgICAv
LyBJbml0aWFsaXNlIHBkX29tbmlrZXkgdG8gYWxsIHplcm9zIGFuZAohICAgICAgIC8vIGxldCB0
aGUgY2FsbCB0byB0cnlMb2NhdGVPYmplY3QoKSBiZWxvdyBoYW5kbGUgaXQKISAgICAgICBwZF9v
bW5pa2V5ID0gb21uaU9SQjo6bnVsbGtleSgpOwogICAgICAgIAogICAgICAgIC8vIEhvd2V2ZXIs
IHdlIG1ha2UgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBib290c3RyYXBwaW5nIGFnZW50LgogICAg
ICAgIC8vIFRoZSBvYmplY3Qga2V5IGlzICJJTklUIi4gSWYgdGhlIGtleSBtYXRjaCBhbmQgd2Ug
ZG8gaGF2ZQoqKioqKioqKioqKioqKioKKioqIDQ5OSw1MDUgKioqKgotLS0gNTI4LDU1OCAtLS0t
CiAgCSAgb2JqID0gb21uaUluaXRpYWxSZWZlcmVuY2VzOjpzaW5nbGV0b24oKS0+aGFzX2Jvb3Rz
dHJhcF9hZ2VudEltcGwoKTsKICAJfQogICAgICAgIH0KKyAKKyAgICAgICAvLyBDaGVjayBmb3Ig
YSBwZXJzaXN0ZW50IG9iamVjdCBrZXkKKyAgICAgICBlbHNlIGlmIChrZXlzaXplID4gc2l6ZW9m
KG9tbmlPYmplY3RLZXkpKSB7CisgCisgICAgICAgICBpZiAoa2V5c2l6ZSA+IE9NTklPUkJfR0lP
UERSSVZFUl9HSU9QX1NfSU5MSU5FX1BFUlNJU1RLRVlfQlVGX1NJWkUpIHsgICAgICAgIAorIAkg
IC8vIERvIG5vdCBibGluZGx5IGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgcGVyc2lzdGVudCBr
ZXkKKyAJICAvLyBhIHBvaXNvbiBwYWNrZXQgbWlnaHQgc2V0IHRoaXMgdG8gYSBodWdlIHZhbHVl
CisgCSAgaWYgKGtleXNpemUgPiBSZE1lc3NhZ2VVblJlYWQoKSkgeworIAkgICAgdGhyb3cgQ09S
QkE6Ok1BUlNIQUwoMCxDT1JCQTo6Q09NUExFVEVEX05PKTsKKyAJICB9CisgCSAgQ09SQkE6Ok9j
dGV0ICpwID0gbmV3IENPUkJBOjpPY3RldFtrZXlzaXplXTsKKyAJICBpZiAoIXApCisgCSAgICB0
aHJvdyBDT1JCQTo6Tk9fTUVNT1JZKDAsQ09SQkE6OkNPTVBMRVRFRF9OTyk7CisgCSAgcGRfcGVy
c2lzdGtleSA9IHA7CisgICAgICAgICB9CisgICAgICAgICBnZXRfY2hhcl9hcnJheSgoQ09SQkE6
Ok9jdGV0KikgcGRfcGVyc2lzdGtleSwga2V5c2l6ZSk7CisgCisgICAgICAgICBpZiAoIW9tbmk6
OnZhbGlkYXRlUGVyc2lzdGVudEtleSh2aXJ0dWFsU2VydmVyTmFtZSwKKyAgICAgICAgICAgb2Jq
ZWN0SWQsIG9iamVjdElkTGVuZ3RoLCBwZF9wZXJzaXN0a2V5LCBrZXlzaXplKSkgeworICAgICAg
ICAgICB2aXJ0dWFsU2VydmVyTmFtZSA9IDA7CisgICAgICAgICB9ICAKKyAgICAgICB9CisgCiAg
ICAgICAgZWxzZSB7CisgCS8vIHNpbGVudGx5IHNraXAgdGhlIGtleQogIAlza2lwKGtleXNpemUp
OwogICAgICAgIH0KICAgICAgfQoqKioqKioqKioqKioqKioKKioqIDU0Nyw1OTcgKioqKgogICAg
ICByZXR1cm47CiAgICB9CiAgCi0gICAgIC8vIE5vdGU6IElmIHRoaXMgaXMgYSBvbmUgd2F5IGlu
dm9jYXRpb24sIHdlIGNob29zZSB0byByZXR1cm4gYSAKLSAgICAgLy8gTWVzc2FnZUVycm9yIE1l
c3NhZ2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBSZXBseSB3aXRoIFN5c3RlbSBFeGNlcHRpb24K
LSAgICAgLy8gbWVzc2FnZSBiZWNhdXNlIHRoZSBvdGhlci1lbmQgc2F5cyBkbyBub3Qgc2VuZCBt
ZSBhIHJlcGx5IQotIAogICAgdHJ5IHsKISAgICAgLy8gSW4gZnV0dXJlLCB3ZSBoYXZlIHRvIHBh
cnRpYWxseSBkZWNvZGUgdGhlIG9iamVjdCBrZXkgdG8KISAgICAgLy8gZGV0ZXJtaW5lIHdoaWNo
IG9iamVjdCBtYW5hZ2VyIGl0IGJlbG9uZ3MgdG8uCiEgICAgIC8vIEZvciB0aGUgbW9tZW50LCB0
aGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgbWFuYWdlci0gdGhlIHJvb3RPYmplY3RNYW5hZ2VyLgog
ICAgICBpZiAoIW9iaikgewohICAgICAgIG9iaiA9IG9tbmk6OmxvY2F0ZU9iamVjdChvbW5pT2Jq
ZWN0TWFuYWdlcjo6cm9vdCgpLHBkX29iamtleSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAg
ICAgb21uaTo6b2JqZWN0RHVwbGljYXRlKG9iaik7CiAgICAgIH0KICAKISAgICAgaWYgKCFvYmot
PmRpc3BhdGNoKCp0aGlzLChjb25zdCBjaGFyICopcGRfb3BlcmF0aW9uLHBkX3Jlc3BvbnNlX2V4
cGVjdGVkKSkKISAJewohIAkgIGlmICghb2JqLT5vbW5pT2JqZWN0OjpkaXNwYXRjaCgqdGhpcywo
Y29uc3QgY2hhciopcGRfb3BlcmF0aW9uLAohIAkJCQkJcGRfcmVzcG9uc2VfZXhwZWN0ZWQpKQoh
IAkgICAgewohIAkgICAgICBSZXF1ZXN0UmVjZWl2ZWQoMSk7CiEgCSAgICAgIHRocm93IENPUkJB
OjpCQURfT1BFUkFUSU9OKDAsQ09SQkE6OkNPTVBMRVRFRF9OTyk7CiEgCSAgICB9CiAgCX0KISAg
ICAgCiEgICB9CiEgICBjYXRjaCAoY29uc3QgQ09SQkE6Ok9CSkVDVF9OT1RfRVhJU1QgJmV4KSB7
CiAgCi0gICAgIGlmICghb2JqICYmIHBkX3Jlc3BvbnNlX2V4cGVjdGVkICYmIE1hcEtleVRvT2Jq
ZWN0RnVuY3Rpb24pIHsKLSAgICAgICAvLyBDYW5ub3QgZmluZCB0aGUgb2JqZWN0IGluIHRoZSBv
YmplY3QgdGFibGUuIElmIHRoZSBhcHBsaWNhdGlvbgotICAgICAgIC8vIGhhcyByZWdpc3RlcmVk
IGEgbG9hZGVyLCBkbyBhbiB1cGNhbGwgdG8gbG9jYXRlIHRoZSBvYmplY3QuCi0gICAgICAgLy8g
SWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIG5vdCBhIG5pbCBvYmplY3QgcmVmZXJlbmNlLCBzZW5k
IGEKLSAgICAgICAvLyBMT0NBVElPTl9GT1JXQVJEIG1lc3NhZ2UgdG8gdGhlIGNsaWVudCB0byBp
bnN0cnVjdCBpdCB0byByZXRyeQotICAgICAgIC8vIHdpdGggdGhlIG5ldyBvYmplY3QgcmVmZXJl
bmNlLgotICAgICAgIC8vCi0gICAgICAgLy8gTGltaXRhdGlvbjogaWYgdGhpcyBpbnZvY2F0aW9u
IGlzIG9uZXdheSwgb25lIGNhbm5vdCByZXBseSB3aXRoCi0gICAgICAgLy8gICAgICAgICAgICAg
YSBMT0NBVElPTl9GT1JXQVJEIG1lc3NhZ2UsIGluIHRoYXQgY2FzZSwganVzdAotICAgICAgIC8v
ICAgICAgICAgICAgIHRyZWF0IHRoaXMgYXMgYSBub3JtYWwgT0JKRUNUX05PVF9FWElTVCBhbmQg
bGV0Ci0gICAgICAgLy8gICAgICAgICAgICAgdGhlIGNvZGUgYmVsb3cgdG8gZGVhbCB3aXRoIGl0
LgotICAgICAgIC8vCi0gICAgICAgQ09SQkE6Ok9iamVjdF92YXIgbmV3RGVzdGluYXRpb249IE1h
cEtleVRvT2JqZWN0RnVuY3Rpb24ocGRfb2Jqa2V5KTsKICAgICAgICBpZiAoIUNPUkJBOjppc19u
aWwobmV3RGVzdGluYXRpb24pKSB7CiEgCS8vIE5vdGUgdGhhdCB3ZSBoYXZlIGNvbXBsZXRlZCB0
aGUgb2JqZWN0IHJlcXVlc3QKISAJUmVxdWVzdFJlY2VpdmVkKDEpOyAKISAJCiAgCS8vIEJ1aWxk
IGFuZCBzZW5kIHRoZSBsb2NhdGlvbiBmb3J3YXJkIG1lc3NhZ2UuLi4KICAJc2l6ZV90IG1zZ3Np
emUgPSAoc2l6ZV90KSBHSU9QX1M6OlJlcGx5SGVhZGVyU2l6ZSgpOwogIAltc2dzaXplID0gQ09S
QkE6Ok9iamVjdDo6TlBfYWxpZ25lZFNpemUobmV3RGVzdGluYXRpb24sIG1zZ3NpemUpOwotLS0g
NjAwLDY0OSAtLS0tCiAgICAgIHJldHVybjsKICAgIH0KICAKICAgIHRyeSB7CiEgIAogICAgICBp
ZiAoIW9iaikgewohICAgICAgIGlmICghdmlydHVhbFNlcnZlck5hbWUpIHsKISAgICAgICAgIG9i
aiA9IG9tbmk6OnRyeUxvY2F0ZU9iamVjdChvbW5pT2JqZWN0TWFuYWdlcjo6cm9vdCgpLCBwZF9v
bW5pa2V5KTsKISAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgb21uaTo6b2Jq
ZWN0RHVwbGljYXRlKG9iaik7CiAgICAgIH0KICAKISAgICAgaWYgKG9iaikgewohICAgICAgIGlm
ICghb2JqLT5kaXNwYXRjaCgqdGhpcywgKGNvbnN0IGNoYXIgKikgcGRfb3BlcmF0aW9uLAohICAg
ICAgICAgcGRfcmVzcG9uc2VfZXhwZWN0ZWQpKSB7CiEgICAgICAgICBpZiAoIW9iai0+b21uaU9i
amVjdDo6ZGlzcGF0Y2goKnRoaXMsIChjb25zdCBjaGFyKilwZF9vcGVyYXRpb24sCiEgCSAgcGRf
cmVzcG9uc2VfZXhwZWN0ZWQpKSB7CiEgCSAgUmVxdWVzdFJlY2VpdmVkKDEpOwohIAkgIHRocm93
IENPUkJBOjpCQURfT1BFUkFUSU9OKDAsQ09SQkE6OkNPTVBMRVRFRF9OTyk7CiAgCX0KISAgICAg
ICB9CiEgICAgIH0KISAgICAgICAgCiEgICAgIGVsc2UgewohIAohICAgICAgIENPUkJBOjpPYmpl
Y3RfdmFyIG5ld0Rlc3RpbmF0aW9uID0gQ09SQkE6Ok9iamVjdDo6X25pbCgpOwohICAgICAgIAoh
ICAgICAgIFJlcXVlc3RSZWNlaXZlZCgxKTsKISAKISAgICAgICBpZiAocGRfcmVzcG9uc2VfZXhw
ZWN0ZWQpIHsKISAgICAgICAgIGlmICh2aXJ0dWFsU2VydmVyTmFtZSkgewohICAgICAgICAgICBp
ZiAoTWFwUGVyc2lzdGVudEtleVRvT2JqZWN0RnVuY3Rpb24pIHsKISAgICAgICAgICAgICBuZXdE
ZXN0aW5hdGlvbiA9IE1hcFBlcnNpc3RlbnRLZXlUb09iamVjdEZ1bmN0aW9uKAohICAgICAgICAg
ICAgICAgdmlydHVhbFNlcnZlck5hbWUsIG9iamVjdElkLCBvYmplY3RJZExlbmd0aCk7CiEgICAg
ICAgICAgIH0KISAgICAgICAgIH0gCiEgICAgICAgICBlbHNlIHsKISAgICAgICAgICAgaWYgKE1h
cEtleVRvT2JqZWN0RnVuY3Rpb24pIHsKISAgICAgICAgICAgICBuZXdEZXN0aW5hdGlvbiA9IE1h
cEtleVRvT2JqZWN0RnVuY3Rpb24ocGRfb21uaWtleSk7CiEgICAgICAgICAgIH0KISAgICAgICAg
IH0KISAgICAgICB9CiAgCiAgICAgICAgaWYgKCFDT1JCQTo6aXNfbmlsKG5ld0Rlc3RpbmF0aW9u
KSkgewohIAogIAkvLyBCdWlsZCBhbmQgc2VuZCB0aGUgbG9jYXRpb24gZm9yd2FyZCBtZXNzYWdl
Li4uCiAgCXNpemVfdCBtc2dzaXplID0gKHNpemVfdCkgR0lPUF9TOjpSZXBseUhlYWRlclNpemUo
KTsKICAJbXNnc2l6ZSA9IENPUkJBOjpPYmplY3Q6Ok5QX2FsaWduZWRTaXplKG5ld0Rlc3RpbmF0
aW9uLCBtc2dzaXplKTsKKioqKioqKioqKioqKioqCioqKiA1OTksNjI1ICoqKioKICAJQ09SQkE6
Ok9iamVjdDo6bWFyc2hhbE9ialJlZihuZXdEZXN0aW5hdGlvbiwgKnRoaXMpOwogIAkKICAJLy8g
QWxsIGRvbmUuLi4KISAJUmVwbHlDb21wbGV0ZWQoKTsgcmV0dXJuOwohICAgICAgIH0KISAgICAg
fQohIAohICAgICBpZiAoIW9iaikgewohICAgICAgIFJlcXVlc3RSZWNlaXZlZCgxKTsKISAgICAg
ICBpZiAoIXBkX3Jlc3BvbnNlX2V4cGVjdGVkKSB7CiEgCS8vIFRoaXMgaXMgYSBvbmUgd2F5IGlu
dm9jYXRpb24sIHdlIGNob29zZSB0byByZXR1cm4gYSBNZXNzYWdlRXJyb3IKISAJLy8gTWVzc2Fn
ZSBpbnN0ZWFkIG9mIHJldHVybmluZyBhIFJlcGx5IHdpdGggU3lzdGVtIEV4Y2VwdGlvbgohIAkv
LyBtZXNzYWdlIGJlY2F1c2UgdGhlIG90aGVyLWVuZCBzYXlzIGRvIG5vdCBzZW5kIG1lIGEgcmVw
bHkhCiEgCVNlbmRNc2dFcnJvck1lc3NhZ2UoKTsKISAJUmVwbHlDb21wbGV0ZWQoKTsKISAgICAg
ICB9CiAgICAgICAgZWxzZSB7CiEgCU1hcnNoYWxsU3lzdGVtRXhjZXB0aW9uKHRoaXMsU3lzRXhj
ZXB0UmVwb0lEOjpPQkpFQ1RfTk9UX0VYSVNULGV4KTsKICAgICAgICB9CiAgICAgIH0KISAgICAg
ZWxzZSB7CiEgICAgICAgb21uaTo6b2JqZWN0UmVsZWFzZShvYmopOyBvYmogPSAwOwohICAgICAg
IENIRUNLX0FORF9NQVlCRV9NQVJTSEFMTF9TWVNURU1fRVhDRVBUSU9OIChPQkpFQ1RfTk9UX0VY
SVNULGV4KTsKISAgICAgfSAgICAgIAogICAgfQogICAgY2F0Y2ggKGNvbnN0IENPUkJBOjpVTktO
T1dOICZleCkgewogICAgICBpZiAob2JqKSBvbW5pOjpvYmplY3RSZWxlYXNlKG9iaik7IG9iaiA9
IDA7Ci0tLSA2NTEsNjc0IC0tLS0KICAJQ09SQkE6Ok9iamVjdDo6bWFyc2hhbE9ialJlZihuZXdE
ZXN0aW5hdGlvbiwgKnRoaXMpOwogIAkKICAJLy8gQWxsIGRvbmUuLi4KISAJUmVwbHlDb21wbGV0
ZWQoKTsgCiEgICAgICAgICByZXR1cm47CiEgICAgICAgfSAKISAgICAgICAKICAgICAgICBlbHNl
IHsKISAgICAgICAgIHRocm93IENPUkJBOjpPQkpFQ1RfTk9UX0VYSVNUKDAsIENPUkJBOjpDT01Q
TEVURURfTk8pOwogICAgICAgIH0KICAgICAgfQohIAohICAgfQohIAohICAgLy8gTm90ZTogSWYg
dGhpcyBpcyBhIG9uZSB3YXkgaW52b2NhdGlvbiwgd2UgY2hvb3NlIHRvIHJldHVybiBhIAohICAg
Ly8gTWVzc2FnZUVycm9yIE1lc3NhZ2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBSZXBseSB3aXRo
IFN5c3RlbSBFeGNlcHRpb24KISAgIC8vIG1lc3NhZ2UgYmVjYXVzZSB0aGUgb3RoZXItZW5kIHNh
eXMgZG8gbm90IHNlbmQgbWUgYSByZXBseSEKISAKISAgIGNhdGNoIChjb25zdCBDT1JCQTo6T0JK
RUNUX05PVF9FWElTVCAmZXgpIHsKISAgICAgaWYgKG9iaikgb21uaTo6b2JqZWN0UmVsZWFzZShv
YmopOyBvYmogPSAwOwohICAgICBDSEVDS19BTkRfTUFZQkVfTUFSU0hBTExfU1lTVEVNX0VYQ0VQ
VElPTiAoT0JKRUNUX05PVF9FWElTVCxleCk7CiAgICB9CiAgICBjYXRjaCAoY29uc3QgQ09SQkE6
OlVOS05PV04gJmV4KSB7CiAgICAgIGlmIChvYmopIG9tbmk6Om9iamVjdFJlbGVhc2Uob2JqKTsg
b2JqID0gMDsKKioqKioqKioqKioqKioqCioqKiA3NTYsNzYxICoqKioKLS0tIDgwNSw4MTQgLS0t
LQogIEdJT1BfUzo6SGFuZGxlTG9jYXRlUmVxdWVzdChDT1JCQTo6Qm9vbGVhbiBieXRlb3JkZXIp
CiAgewogICAgQ09SQkE6OlVMb25nIG1zZ3NpemU7CisgICBjb25zdCBjaGFyICp2aXJ0dWFsU2Vy
dmVyTmFtZSA9IDA7CisgICBjb25zdCBDT1JCQTo6T2N0ZXQgKm9iamVjdElkID0gMDsKKyAgIENP
UkJBOjpVTG9uZyBvYmplY3RJZExlbmd0aDsKKyAgIAogIAogICAgdHJ5IHsKICAgICAgLy8gVGhp
cyB0cnkgYmxvY2sgY2F0Y2hlcyBhbnkgZXhjZXB0aW9uIHRoYXQgbWlnaHQgcmFpc2UgZHVyaW5n
CioqKioqKioqKioqKioqKgoqKiogNzczLDc5MCAqKioqCiAgCiAgICAgIENPUkJBOjpVTG9uZyBr
ZXlzaXplOwogICAgICBrZXlzaXplIDw8PSAqdGhpczsKISAgICAgaWYgKGtleXNpemUgIT0gc2l6
ZW9mKG9tbmlPYmplY3RLZXkpKSB7CiEgICAgICAgLy8gVGhpcyBrZXkgZGlkIG5vdCBjb21lIGZy
b20gdGhpcyBvcmIuCiEgICAgICAgLy8gc2lsZW50bHkgc2tpcCB0aGUga2V5LiBJbml0aWFsaXNl
IHBkX29iamtleSB0byBhbGwgemVyb3MgYW5kCiEgICAgICAgLy8gbGV0IHRoZSBjYWxsIHRvIGxv
Y2F0ZU9iamVjdCgpIGJlbG93IHRvIHJhaXNlIHRoZSBwcm9wZXIgZXhjZXB0aW9uCiEgICAgICAg
cGRfb2Jqa2V5ID0gb21uaU9SQjo6bnVsbGtleSgpOwohICAgICAgIHNraXAoa2V5c2l6ZSk7CiAg
ICAgIH0KICAgICAgZWxzZSB7CiEgICAgICAgZ2V0X2NoYXJfYXJyYXkoKENPUkJBOjpDaGFyKikg
JnBkX29iamtleSwga2V5c2l6ZSk7CiAgICAgIH0KICAgICAgUmVxdWVzdFJlY2VpdmVkKCk7CiAg
ICB9CiAgICBjYXRjaCAoY29uc3QgQ09SQkE6Ok1BUlNIQUwgJmV4KSB7CiAgICAgIFJlcXVlc3RS
ZWNlaXZlZCgxKTsKICAgICAgU2VuZE1zZ0Vycm9yTWVzc2FnZSgpOwotLS0gODI2LDg3MyAtLS0t
CiAgCiAgICAgIENPUkJBOjpVTG9uZyBrZXlzaXplOwogICAgICBrZXlzaXplIDw8PSAqdGhpczsK
ISAKISAgICAgaWYgKGtleXNpemUgPT0gc2l6ZW9mKG9tbmlPYmplY3RLZXkpKSB7CiEgICAgICAg
Z2V0X2NoYXJfYXJyYXkoKENPUkJBOjpDaGFyKikgJnBkX29tbmlrZXksIGtleXNpemUpOwogICAg
ICB9CiAgICAgIGVsc2UgewohICAKISAgICAgIC8vIEZvciBub3csIGFzc3VtZSB0aGUga2V5IGRp
ZCBub3QgY29tZSBmcm9tIHRoaXMgT1JCLgohICAgICAgIC8vIEluaXRpYWxpc2UgcGRfb21uaWtl
eSB0byBhbGwgemVyb3MgYW5kCiEgICAgICAgLy8gbGV0IHRoZSBjYWxsIHRvIHRyeUxvY2F0ZU9i
amVjdCgpIGJlbG93IGhhbmRsZSBpdAohICAgICAgIHBkX29tbmlrZXkgPSBvbW5pT1JCOjpudWxs
a2V5KCk7CiEgICAgICAgCiEgICAgICAgLy8gQ2hlY2sgZm9yIGEgcGVyc2lzdGVudCBvYmplY3Qg
a2V5CiEgICAgICAgaWYgKGtleXNpemUgPiBzaXplb2Yob21uaU9iamVjdEtleSkpIHsKISAKISAg
ICAgICAgIGlmIChrZXlzaXplID4gT01OSU9SQl9HSU9QRFJJVkVSX0dJT1BfU19JTkxJTkVfUEVS
U0lTVEtFWV9CVUZfU0laRSkgeyAgICAgICAgCiEgCSAgLy8gRG8gbm90IGJsaW5kbHkgYWxsb2Nh
dGUgYSBidWZmZXIgZm9yIHRoZSBwZXJzaXN0ZW50IGtleQohIAkgIC8vIGEgcG9pc29uIHBhY2tl
dCBtaWdodCBzZXQgdGhpcyB0byBhIGh1Z2UgdmFsdWUKISAJICBpZiAoa2V5c2l6ZSA+IFJkTWVz
c2FnZVVuUmVhZCgpKSB7CiEgCSAgICB0aHJvdyBDT1JCQTo6TUFSU0hBTCgwLENPUkJBOjpDT01Q
TEVURURfTk8pOwohIAkgIH0KISAJICBDT1JCQTo6T2N0ZXQgKnAgPSBuZXcgQ09SQkE6Ok9jdGV0
W2tleXNpemVdOwohIAkgIGlmICghcCkKISAJICAgIHRocm93IENPUkJBOjpOT19NRU1PUlkoMCxD
T1JCQTo6Q09NUExFVEVEX05PKTsKISAJICBwZF9wZXJzaXN0a2V5ID0gcDsKISAgICAgICAgIH0K
ISAgICAgICAgIGdldF9jaGFyX2FycmF5KChDT1JCQTo6T2N0ZXQqKSBwZF9wZXJzaXN0a2V5LCBr
ZXlzaXplKTsKISAKISAgICAgICAgIGlmICghb21uaTo6dmFsaWRhdGVQZXJzaXN0ZW50S2V5KHZp
cnR1YWxTZXJ2ZXJOYW1lLAohICAgICAgICAgICBvYmplY3RJZCwgb2JqZWN0SWRMZW5ndGgsIHBk
X3BlcnNpc3RrZXksIGtleXNpemUpKSB7CiEgICAgICAgICAgIHZpcnR1YWxTZXJ2ZXJOYW1lID0g
MDsKISAgICAgICAgIH0gIAohICAgICAgIH0KISAKISAgICAgICBlbHNlIHsKISAJLy8gc2lsZW50
bHkgc2tpcCB0aGUga2V5CiEgCXNraXAoa2V5c2l6ZSk7CiEgICAgICAgfQogICAgICB9CisgCiAg
ICAgIFJlcXVlc3RSZWNlaXZlZCgpOwogICAgfQorIAogICAgY2F0Y2ggKGNvbnN0IENPUkJBOjpN
QVJTSEFMICZleCkgewogICAgICBSZXF1ZXN0UmVjZWl2ZWQoMSk7CiAgICAgIFNlbmRNc2dFcnJv
ck1lc3NhZ2UoKTsKKioqKioqKioqKioqKioqCioqKiA4MDAsODQ4ICoqKioKICAgIG9tbmlPYmpl
Y3QgKm9iaiA9IDA7CiAgICBHSU9QOjpMb2NhdGVTdGF0dXNUeXBlIHN0YXR1czsKICAKISAgIHRy
eSB7CiEgICAgIC8vIEluIGZ1dHVyZSwgd2UgaGF2ZSB0byBwYXJ0aWFsbHkgZGVjb2RlIHRoZSBv
YmplY3Qga2V5IHRvCiEgICAgIC8vIGRldGVybWluZSB3aGljaCBvYmplY3QgbWFuYWdlciBpdCBi
ZWxvbmdzIHRvLgohICAgICAvLyBGb3IgdGhlIG1vbWVudCwgdGhlcmUgaXMgb25seSBvbmUgb2Jq
ZWN0IG1hbmFnZXItIHJvb3RPYmplY3RNYW5hZ2VyLgohICAgICBvYmogPSBvbW5pOjpsb2NhdGVP
YmplY3Qob21uaU9iamVjdE1hbmFnZXI6OnJvb3QoKSxwZF9vYmprZXkpOwogICAgICBvbW5pOjpv
YmplY3RSZWxlYXNlKG9iaik7CiAgICAgIHN0YXR1cyA9IEdJT1A6Ok9CSkVDVF9IRVJFOwohICAg
fQohICAgY2F0Y2ggKGNvbnN0IENPUkJBOjpPQkpFQ1RfTk9UX0VYSVNUJikgewohICAgICBpZiAo
TWFwS2V5VG9PYmplY3RGdW5jdGlvbikgewohICAgICAgIC8vIENhbm5vdCBmaW5kIHRoZSBvYmpl
Y3QgaW4gdGhlIG9iamVjdCB0YWJsZS4gSWYgdGhlIGFwcGxpY2F0aW9uCiEgICAgICAgLy8gaGFz
IHJlZ2lzdGVyZWQgYSBsb2FkZXIsIGRvIGFuIHVwY2FsbCB0byBsb2NhdGUgdGhlIG9iamVjdC4K
ISAgICAgICAvLyBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBhIG5pbCBvYmplY3QgcmVmZXJl
bmNlLCByZXBseSB3aXRoCiEgICAgICAgLy8gT0JKRUNUX0ZPUldBUkQgYW5kIHRoZSBuZXcgb2Jq
ZWN0IHJlZmVyZW5jZS4KISAgICAgICBzdGF0dXMgPSBHSU9QOjpVTktOT1dOX09CSkVDVDsKISAg
ICAgICBDT1JCQTo6T2JqZWN0X3ZhciBuZXdEZXN0aW5hdGlvbiA9IE1hcEtleVRvT2JqZWN0RnVu
Y3Rpb24ocGRfb2Jqa2V5KTsKISAgICAgICBpZiAoIUNPUkJBOjppc19uaWwobmV3RGVzdGluYXRp
b24pKSB7CiEgCXN0YXR1cyA9IEdJT1A6Ok9CSkVDVF9GT1JXQVJEOwohIAlXckxvY2soKTsKISAJ
cGRfc3RhdGUgPSBHSU9QX1M6OlJlcGx5SXNCZWluZ0NvbXBvc2VkOwohIAohIAlzaXplX3QgbXNn
c2l6ZSA9IHNpemVvZihNZXNzYWdlSGVhZGVyOjpMb2NhdGVSZXBseSkgKyA0ICsgODsKISAJbXNn
c2l6ZSA9IENPUkJBOjpPYmplY3Q6Ok5QX2FsaWduZWRTaXplKG5ld0Rlc3RpbmF0aW9uLG1zZ3Np
emUpOwohIAltc2dzaXplID0gbXNnc2l6ZSAtIHNpemVvZihNZXNzYWdlSGVhZGVyOjpMb2NhdGVS
ZXBseSkgLSA0OwohIAlXck1lc3NhZ2VTaXplKDApOwohIAlwdXRfY2hhcl9hcnJheSgoQ09SQkE6
OkNoYXIqKSBNZXNzYWdlSGVhZGVyOjpMb2NhdGVSZXBseSwKICAJCSAgICAgICBzaXplb2YoTWVz
c2FnZUhlYWRlcjo6TG9jYXRlUmVwbHkpLAogIAkJICAgICAgIG9tbmk6OkFMSUdOXzEsIDEsIDEp
OwohIAlvcGVyYXRvcj4+PSAoKENPUkJBOjpVTG9uZyltc2dzaXplLCp0aGlzKTsKISAJb3BlcmF0
b3I+Pj0gKHBkX3JlcXVlc3RfaWQsKnRoaXMpOwohIAlvcGVyYXRvcj4+PSAoKENPUkJBOjpVTG9u
ZylzdGF0dXMsKnRoaXMpOwohIAlDT1JCQTo6T2JqZWN0OjptYXJzaGFsT2JqUmVmKG5ld0Rlc3Rp
bmF0aW9uLCp0aGlzKTsKISAJZmx1c2goMSk7CiEgCXBkX3N0YXRlID0gR0lPUF9TOjpJZGxlOwoh
IAlXclVubG9jaygpOwohICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdGF0
dXMgPSBHSU9QOjpVTktOT1dOX09CSkVDVDsKICAgICAgfQotICAgfQotICAgY2F0Y2goLi4uKSB7
Ci0gICAgIHN0YXR1cyA9IEdJT1A6OlVOS05PV05fT0JKRUNUOwogICAgfQogIAogICAgaWYgKHN0
YXR1cyAhPSBHSU9QOjpPQkpFQ1RfRk9SV0FSRCkgewotLS0gODgzLDkzOCAtLS0tCiAgICBvbW5p
T2JqZWN0ICpvYmogPSAwOwogICAgR0lPUDo6TG9jYXRlU3RhdHVzVHlwZSBzdGF0dXM7CiAgCiEg
ICBpZiAoIXZpcnR1YWxTZXJ2ZXJOYW1lKSB7CiEgICAgICBvYmogPSBvbW5pOjp0cnlMb2NhdGVP
YmplY3Qob21uaU9iamVjdE1hbmFnZXI6OnJvb3QoKSwgcGRfb21uaWtleSk7CiEgICB9CiEgCiEg
ICBpZiAob2JqKSB7CiAgICAgIG9tbmk6Om9iamVjdFJlbGVhc2Uob2JqKTsKICAgICAgc3RhdHVz
ID0gR0lPUDo6T0JKRUNUX0hFUkU7CiEgICB9IAohICAKISAgIGVsc2UgewohIAohICAgICBDT1JC
QTo6T2JqZWN0X3ZhciBuZXdEZXN0aW5hdGlvbiA9IENPUkJBOjpPYmplY3Q6Ol9uaWwoKTsKISAK
ISAgICAgdHJ5IHsKISAgICAgICBpZiAodmlydHVhbFNlcnZlck5hbWUpIHsKISAgICAgICAgIGlm
IChNYXBQZXJzaXN0ZW50S2V5VG9PYmplY3RGdW5jdGlvbikgewohICAgICAgICAgICAgbmV3RGVz
dGluYXRpb24gPSBNYXBQZXJzaXN0ZW50S2V5VG9PYmplY3RGdW5jdGlvbigKISAgICAgICAgICAg
ICAgIHZpcnR1YWxTZXJ2ZXJOYW1lLCBvYmplY3RJZCwgb2JqZWN0SWRMZW5ndGgpOwohICAgICAg
ICAgfQohICAgICAgIH0gCiEgICAgICAgZWxzZSBpZiAoTWFwS2V5VG9PYmplY3RGdW5jdGlvbikg
ewohICAgICAgICAgbmV3RGVzdGluYXRpb24gPSBNYXBLZXlUb09iamVjdEZ1bmN0aW9uKHBkX29t
bmlrZXkpOwohICAgICAgIH0KISAgICAgfSBjYXRjaCAoLi4uKSB7CiEgICAgICAgLy8gbmV3RGVz
dGluYXRpb24gcmVtYWlucyBuaWwgcmVmZXJlbmNlCiEgICAgIH0KISAgCiEgICAgIGlmICghQ09S
QkE6OmlzX25pbChuZXdEZXN0aW5hdGlvbikpIHsKISAgICAgICBzdGF0dXMgPSBHSU9QOjpPQkpF
Q1RfRk9SV0FSRDsKISAgICAgICBXckxvY2soKTsKISAgICAgICBwZF9zdGF0ZSA9IEdJT1BfUzo6
UmVwbHlJc0JlaW5nQ29tcG9zZWQ7CiEgCiEgICAgICAgc2l6ZV90IG1zZ3NpemUgPSBzaXplb2Yo
TWVzc2FnZUhlYWRlcjo6TG9jYXRlUmVwbHkpICsgNCArIDg7CiEgICAgICAgbXNnc2l6ZSA9IENP
UkJBOjpPYmplY3Q6Ok5QX2FsaWduZWRTaXplKG5ld0Rlc3RpbmF0aW9uLG1zZ3NpemUpOwohICAg
ICAgIG1zZ3NpemUgPSBtc2dzaXplIC0gc2l6ZW9mKE1lc3NhZ2VIZWFkZXI6OkxvY2F0ZVJlcGx5
KSAtIDQ7CiEgICAgICAgV3JNZXNzYWdlU2l6ZSgwKTsKISAgICAgICBwdXRfY2hhcl9hcnJheSgo
Q09SQkE6OkNoYXIqKSBNZXNzYWdlSGVhZGVyOjpMb2NhdGVSZXBseSwKICAJCSAgICAgICBzaXpl
b2YoTWVzc2FnZUhlYWRlcjo6TG9jYXRlUmVwbHkpLAogIAkJICAgICAgIG9tbmk6OkFMSUdOXzEs
IDEsIDEpOwohICAgICAgIG9wZXJhdG9yPj49ICgoQ09SQkE6OlVMb25nKW1zZ3NpemUsKnRoaXMp
OwohICAgICAgIG9wZXJhdG9yPj49IChwZF9yZXF1ZXN0X2lkLCp0aGlzKTsKISAgICAgICBvcGVy
YXRvcj4+PSAoKENPUkJBOjpVTG9uZylzdGF0dXMsKnRoaXMpOwohICAgICAgIENPUkJBOjpPYmpl
Y3Q6Om1hcnNoYWxPYmpSZWYobmV3RGVzdGluYXRpb24sKnRoaXMpOwohICAgICAgIGZsdXNoKDEp
OwohICAgICAgIHBkX3N0YXRlID0gR0lPUF9TOjpJZGxlOwohICAgICAgIFdyVW5sb2NrKCk7CiAg
ICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc3RhdHVzID0gR0lPUDo6VU5LTk9XTl9PQkpFQ1Q7
CiAgICAgIH0KICAgIH0KICAKICAgIGlmIChzdGF0dXMgIT0gR0lPUDo6T0JKRUNUX0ZPUldBUkQp
IHsKZGlmZiAtYyAtTiAtciBvbW5pT1JCXzI4MHByZTEub3JpZy9zcmMvbGliL29tbmlPUkIyL29y
YmNvcmUvb2JqZWN0UmVmLmNjIG9tbmlPUkJfMjgwcHJlMS9zcmMvbGliL29tbmlPUkIyL29yYmNv
cmUvb2JqZWN0UmVmLmNjCioqKiBvbW5pT1JCXzI4MHByZTEub3JpZy9zcmMvbGliL29tbmlPUkIy
L29yYmNvcmUvb2JqZWN0UmVmLmNjCVdlZCBKdW4gIDIgMTg6NTc6MDggMTk5OQotLS0gb21uaU9S
Ql8yODBwcmUxL3NyYy9saWIvb21uaU9SQjIvb3JiY29yZS9vYmplY3RSZWYuY2MJV2VkIEp1bCAy
MSAxNzoyNjo1NyAxOTk5CioqKioqKioqKioqKioqKgoqKiogMTA3LDExMiAqKioqCi0tLSAxMDcs
MTE2IC0tLS0KICAjZW5kaWYKICAKICAjaW5jbHVkZSA8cm9wZUZhY3RvcnkuaD4KKyAjaW5jbHVk
ZSAidGNwU29ja2V0LmgiCisgCisgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBPTU5JT1JCX1BF
UlNJU1RLRVlfUFJFRklYID0gInBlcnNpc3RlbnRrZXkiOworICAgLy8gTk9URTogbGVuZ3RoIG11
c3QgYmUgPj0gc2l6ZW9mKG9tbmlPYmplY3RLZXkpLiAKICAKICAjaWYgZGVmaW5lZChIQVNfQ3Bs
dXNwbHVzX05hbWVzcGFjZSkKICB1c2luZyBvbW5pT1JCOjpvcGVyYXRvcj09OwoqKioqKioqKioq
KioqKioKKioqIDM4MiwzODggKioqKgogIH0KICAKICBvbW5pT2JqZWN0ICoKISBvbW5pOjpsb2Nh
dGVPYmplY3Qob21uaU9iamVjdE1hbmFnZXIqLG9tbmlPYmplY3RLZXkgJmspCiAgewogICAgb21u
aU9iamVjdDo6b2JqZWN0VGFibGVMb2NrLmxvY2soKTsKICAgIG9tbmlPYmplY3QgKipwID0gJm9t
bmlPYmplY3Q6OmxvY2FsT2JqZWN0VGFibGVbb21uaU9SQjo6aGFzaChrKV07Ci0tLSAzODYsMzky
IC0tLS0KICB9CiAgCiAgb21uaU9iamVjdCAqCiEgb21uaTo6dHJ5TG9jYXRlT2JqZWN0KG9tbmlP
YmplY3RNYW5hZ2VyKixvbW5pT2JqZWN0S2V5ICZrKQogIHsKICAgIG9tbmlPYmplY3Q6Om9iamVj
dFRhYmxlTG9jay5sb2NrKCk7CiAgICBvbW5pT2JqZWN0ICoqcCA9ICZvbW5pT2JqZWN0Ojpsb2Nh
bE9iamVjdFRhYmxlW29tbmlPUkI6Omhhc2goayldOwoqKioqKioqKioqKioqKioKKioqIDM5NSw0
MDQgKioqKgogICAgICBwID0gJigoKnApLT5wZF9uZXh0KTsKICAgIH0KICAgIG9tbmlPYmplY3Q6
Om9iamVjdFRhYmxlTG9jay51bmxvY2soKTsKISAgIHRocm93IENPUkJBOjpPQkpFQ1RfTk9UX0VY
SVNUKDAsQ09SQkE6OkNPTVBMRVRFRF9OTyk7CiEgI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCiEg
ICByZXR1cm4gMDsgIC8vIE1TIFZDKysgNC4wIG5lZWRzIHRoaXMuCiEgI2VuZGlmCiAgfQogIAog
IAotLS0gMzk5LDQxNSAtLS0tCiAgICAgIHAgPSAmKCgqcCktPnBkX25leHQpOwogICAgfQogICAg
b21uaU9iamVjdDo6b2JqZWN0VGFibGVMb2NrLnVubG9jaygpOwohICAgcmV0dXJuIDA7CiEgfQoh
IAohIG9tbmlPYmplY3QgKgohIG9tbmk6OmxvY2F0ZU9iamVjdChvbW5pT2JqZWN0TWFuYWdlcipt
LG9tbmlPYmplY3RLZXkgJmspCiEgewohICAgb21uaU9iamVjdCAqcmVzdWx0ID0gdHJ5TG9jYXRl
T2JqZWN0KG0sIGspOwohICAgaWYgKCFyZXN1bHQpIHsKISAgICAgdGhyb3cgQ09SQkE6Ok9CSkVD
VF9OT1RfRVhJU1QoMCxDT1JCQTo6Q09NUExFVEVEX05PKTsKISAgIH0KISAgIHJldHVybiByZXN1
bHQ7CiAgfQogIAogIAoqKioqKioqKioqKioqKioKKioqIDYzNyw2NDIgKioqKgotLS0gNjQ4LDcy
NiAtLS0tCiAgICB9CiAgfQogIAorIF9DT1JCQV9Cb29sZWFuICAKKyBvbW5pOjp2YWxpZGF0ZVBl
cnNpc3RlbnRLZXkoY29uc3QgY2hhciAqJiB2aXJ0dWFsU2VydmVyTmFtZSwgCisgICBjb25zdCBf
Q09SQkFfT2N0ZXQgKiYgb2JqZWN0SWQsIF9DT1JCQV9VTG9uZyYgb2JqZWN0SWRMZW5ndGgsCisg
ICBjb25zdCBfQ09SQkFfT2N0ZXQgKm9iamVjdEtleSwgX0NPUkJBX1VMb25nIG9iamVjdEtleUxl
bmd0aCkKKyB7CisgICBzaXplX3QgcHJlZml4TGVuZ3RoID0gc3RybGVuKE9NTklPUkJfUEVSU0lT
VEtFWV9QUkVGSVgpOworIAorICAgaWYgKG9iamVjdEtleUxlbmd0aCA8PSBwcmVmaXhMZW5ndGgp
CisgICAgIHJldHVybiAwOworICAKKyAgIGlmIChtZW1jbXAob2JqZWN0S2V5LCBPTU5JT1JCX1BF
UlNJU1RLRVlfUFJFRklYLCBwcmVmaXhMZW5ndGgpICE9IDApCisgICAgIHJldHVybiAwOworIAor
ICAgY29uc3QgY2hhciAqZmlyc3ROdWxsID0gKGNvbnN0IGNoYXIgKikgCisgICAgIG1lbWNocihv
YmplY3RLZXkgKyBwcmVmaXhMZW5ndGgsICdcMCcsIG9iamVjdEtleUxlbmd0aCAtIHByZWZpeExl
bmd0aCk7CisgICBpZiAoIWZpcnN0TnVsbCkKKyAgICAgcmV0dXJuIDA7CisgCisgICB2aXJ0dWFs
U2VydmVyTmFtZSA9IChjb25zdCBjaGFyICopIChvYmplY3RLZXkgKyBwcmVmaXhMZW5ndGgpOwor
ICAgb2JqZWN0SWQgPSAoY29uc3QgX0NPUkJBX09jdGV0ICopIChmaXJzdE51bGwgKyAxKTsKKyAg
IG9iamVjdElkTGVuZ3RoID0gKF9DT1JCQV9VTG9uZykgKG9iamVjdEtleSArIG9iamVjdEtleUxl
bmd0aCAtIG9iamVjdElkKTsKKyAgICAKKyAgIHJldHVybiAxOworIH0KKyAKKyBvbW5pT2JqZWN0
ICpvbW5pOjpjcmVhdGVQZXJzaXN0ZW50T2JqUmVmKGNvbnN0IGNoYXIgKnJlcG9pZCwKKyAgIGNv
bnN0IGNoYXIgKmhvc3ROYW1lLCBfQ09SQkFfVVNob3J0IHBvcnROdW1iZXIsCisgICBjb25zdCBj
aGFyICp2aXJ0dWFsU2VydmVyTmFtZSwKKyAgIGNvbnN0IF9DT1JCQV9PY3RldCAqb2JqZWN0SWQs
IF9DT1JCQV9VTG9uZyBvYmplY3RJZExlbmd0aCkKKyB7CisgICBJT1A6OlRhZ2dlZFByb2ZpbGVM
aXN0ICpwcm9maWxlcyA9IDA7CisgICBfQ09SQkFfT2N0ZXQgKm9iamVjdEtleSA9IDA7CisgCisg
ICB0cnkgeworIAorICAgICBwcm9maWxlcyA9IG5ldyBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KDEp
OworICAgICBpZiAoIXByb2ZpbGVzKSB7CisgICAgICAgdGhyb3cgQ09SQkE6Ok5PX01FTU9SWSgw
LCBDT1JCQTo6Q09NUExFVEVEX05PKTsKKyAgICAgfSAKKyAKKyAgICAgcHJvZmlsZXMtPmxlbmd0
aCgxKTsKKyAgIAorICAgICBJT1A6OlRhZ2dlZFByb2ZpbGUmIHByb2ZpbGUgPSAoKnByb2ZpbGVz
KVswXTsKKyAKKyAgICAgY29uc3QgdGNwU29ja2V0RmFjdG9yeVR5cGUgKnRoZUZhY3RvcnkgPSB0
Y3BTb2NrZXRGYWN0b3J5VHlwZTo6c2luZ2xldG9uOworICAgICBhc3NlcnQodGhlRmFjdG9yeSk7
CisgCisgICAgIHRjcFNvY2tldEVuZHBvaW50IGVuZHBvaW50KChDT1JCQTo6Q2hhciAqKSBob3N0
TmFtZSwgcG9ydE51bWJlcik7CisgICAgCisgICAgIHNpemVfdCBwcmVmaXhMZW5ndGggPSBzdHJs
ZW4oT01OSU9SQl9QRVJTSVNUS0VZX1BSRUZJWCk7CisgICAgIHNpemVfdCB2aXJ0dWFsU2VydmVy
TGVuZ3RoID0gc3RybGVuKHZpcnR1YWxTZXJ2ZXJOYW1lKTsKKyAgICAgc2l6ZV90IG9iamVjdEtl
eUxlbmd0aCA9IHByZWZpeExlbmd0aCArIHZpcnR1YWxTZXJ2ZXJMZW5ndGggKyAxICsgb2JqZWN0
SWRMZW5ndGg7CisgICAgIG9iamVjdEtleSA9IG5ldyBfQ09SQkFfT2N0ZXRbb2JqZWN0S2V5TGVu
Z3RoXTsKKyAgICAgaWYgKCFvYmplY3RLZXkpIHsKKyAgICAgICB0aHJvdyBDT1JCQTo6Tk9fTUVN
T1JZKDAsIENPUkJBOjpDT01QTEVURURfTk8pOworICAgICB9CisgICAgIG1lbWNweShvYmplY3RL
ZXksIE9NTklPUkJfUEVSU0lTVEtFWV9QUkVGSVgsIHByZWZpeExlbmd0aCk7CisgICAgIG1lbWNw
eShvYmplY3RLZXkgKyBwcmVmaXhMZW5ndGgsIHZpcnR1YWxTZXJ2ZXJOYW1lLCB2aXJ0dWFsU2Vy
dmVyTGVuZ3RoICsgMSk7CisgICAgIG1lbWNweShvYmplY3RLZXkgKyBwcmVmaXhMZW5ndGggKyB2
aXJ0dWFsU2VydmVyTGVuZ3RoICsgMSwgb2JqZWN0SWQsIG9iamVjdElkTGVuZ3RoKTsKKyAgCisg
ICAgIHRoZUZhY3RvcnktPmVuY29kZUlPUHByb2ZpbGUoJmVuZHBvaW50LCBvYmplY3RLZXksIG9i
amVjdEtleUxlbmd0aCwgcHJvZmlsZSk7CisgICAgIGRlbGV0ZSBbXSBvYmplY3RLZXk7CisgICAg
IG9iamVjdEtleSA9IDA7IAorICAKKyAgICAgcmV0dXJuIG9tbmk6OmNyZWF0ZU9ialJlZihyZXBv
aWQsMCxwcm9maWxlcywxKTsKKyAgIH0KKyAKKyAgIGNhdGNoICguLi4pIHsKKyAgICAgZGVsZXRl
W10gb2JqZWN0S2V5OworICAgICBkZWxldGUgcHJvZmlsZXM7CisgICAgIHRocm93OworICAgfQor
IH0KICAKICB2b2lkKgogIG9tbmlPYmplY3Q6Ol93aWRlbkZyb21UaGVNb3N0RGVyaXZlZEludGYo
Y29uc3QgY2hhciosIENPUkJBOjpCb29sZWFuKQpkaWZmIC1jIC1OIC1yIG9tbmlPUkJfMjgwcHJl
MS5vcmlnL3NyYy9saWIvb21uaU9SQjIvb3JiY29yZS9yb3BlRmFjdG9yeS5jYyBvbW5pT1JCXzI4
MHByZTEvc3JjL2xpYi9vbW5pT1JCMi9vcmJjb3JlL3JvcGVGYWN0b3J5LmNjCioqKiBvbW5pT1JC
XzI4MHByZTEub3JpZy9zcmMvbGliL29tbmlPUkIyL29yYmNvcmUvcm9wZUZhY3RvcnkuY2MJRnJp
IEp1bCAgMiAyMToyNzoyMiAxOTk5Ci0tLSBvbW5pT1JCXzI4MHByZTEvc3JjL2xpYi9vbW5pT1JC
Mi9vcmJjb3JlL3JvcGVGYWN0b3J5LmNjCVRodSBKdWwgMTUgMTY6MDg6MzMgMTk5OQoqKioqKioq
KioqKioqKioKKioqIDkwLDk2ICoqKioKICAJLy8gRm9yIHRoZSBtb21lbnQsIHRoZXJlIGlzIG9u
bHkgb25lIG9iamVjdCBtYW5hZ2VyLSByb290T2JqZWN0TWFuYWdlci4KICAKICAJICBvbW5pT2Jq
ZWN0TWFuYWdlciogbWFuYWdlciA9IG9tbmlPYmplY3RNYW5hZ2VyOjpyb290KDEpOwohIAkgIGlm
IChtYW5hZ2VyKSB7CiAgCiAgCSAgICByb3BlRmFjdG9yeV9pdGVyYXRvciBpdGVyKCoobWFuYWdl
ci0+aW5jb21pbmdSb3BlRmFjdG9yaWVzKCkpKTsKICAJICAgIGluY29taW5nUm9wZUZhY3Rvcnkq
IGZhY3Rvcnk7Ci0tLSA5MCw5NiAtLS0tCiAgCS8vIEZvciB0aGUgbW9tZW50LCB0aGVyZSBpcyBv
bmx5IG9uZSBvYmplY3QgbWFuYWdlci0gcm9vdE9iamVjdE1hbmFnZXIuCiAgCiAgCSAgb21uaU9i
amVjdE1hbmFnZXIqIG1hbmFnZXIgPSBvbW5pT2JqZWN0TWFuYWdlcjo6cm9vdCgxKTsKISAJICBp
ZiAoa2V5c2l6ZSA9PSBzaXplb2Yob21uaU9iamVjdEtleSkgJiYgbWFuYWdlcikgewogIAogIAkg
ICAgcm9wZUZhY3RvcnlfaXRlcmF0b3IgaXRlcigqKG1hbmFnZXItPmluY29taW5nUm9wZUZhY3Rv
cmllcygpKSk7CiAgCSAgICBpbmNvbWluZ1JvcGVGYWN0b3J5KiBmYWN0b3J5OwoqKioqKioqKioq
KioqKioKKioqIDk5LDEyMCAqKioqCiAgCQkvLyBUaGUgZW5kcG9pbnQgaXMgYWN0dWFsbHkgb25l
IG9mIHRob3NlIGV4cG9ydGVkIGJ5IHRoaXMgCiAgCQkvLyBhZGRyZXNzIHNwYWNlLgogIAkJcm9w
ZSA9IDA7CiEgCQl0cnkgewohIAkJICBvbW5pT2JqZWN0KiByZXN1bHQgPSBvbW5pOjpsb2NhdGVP
YmplY3QobWFuYWdlciwKISAJCQkgICAJCQkgKigob21uaU9iamVjdEtleSopb2Jqa2V5KSk7CiEg
CQkgIC8vIEdvdCBpdAohIAkJICByZXR1cm4gcmVzdWx0OwohIAkJfQohIAkJY2F0Y2ggKGNvbnN0
IENPUkJBOjpPQkpFQ1RfTk9UX0VYSVNUJikgewohIAkJICAvLyB0aGUgb2JqZWN0IGNhbm5vdCBi
ZSBmb3VuZCBieSBsb2NhdGVPYmplY3QoKS4KISAJCSAgLy8gSW5zdGVhZCBvZiBsZXR0aW5nIHRo
ZSBleGNlcHRpb24gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IAohIAkJICAvLyB1cHdhcmRzLCB0cmVh
dCB0aGlzIGFzIGEgZm9yZWlnbiBvYmplY3QgYW5kIGNyZWF0ZXMgYSAKISAJCSAgLy8gcHJveHkg
b2JqZWN0LgohIAkJICBicmVhazsKISAJCX0KISAJICAgICAgfQohIAkgICAgfQohIAkgIH0KICAJ
ICBlbHNlIHsKICAJICAgIC8vIHJvb3Qgb2JqZWN0IG1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRp
YWxpc2VkLCB0aGlzIG9iamVjdAogIAkgICAgLy8gY2Fubm90IGJlIGEgbG9jYWwgb2JqZWN0LiBU
cmVhdCB0aGlzIGFzIGEgZm9yZWlnbiBvYmplY3QKLS0tIDk5LDExMyAtLS0tCiAgCQkvLyBUaGUg
ZW5kcG9pbnQgaXMgYWN0dWFsbHkgb25lIG9mIHRob3NlIGV4cG9ydGVkIGJ5IHRoaXMgCiAgCQkv
LyBhZGRyZXNzIHNwYWNlLgogIAkJcm9wZSA9IDA7CiEgICAgICAgICAgICAgICAgIG9tbmlPYmpl
Y3QqIHJlc3VsdCA9IG9tbmk6OnRyeUxvY2F0ZU9iamVjdChtYW5hZ2VyLAohIAkgICAgICAgICAg
Kigob21uaU9iamVjdEtleSopb2Jqa2V5KSk7CiEgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQp
IC8vIEdvdCBpdAohICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiEgICAgICAgICAg
ICAgICAgIGVsc2UKISAgICAgICAgICAgICAgICAgICBicmVhazsKISAgICAgICAgICAgICAgIH0K
ISAgICAgICAgICAgICB9IAohICAgCSAgfQogIAkgIGVsc2UgewogIAkgICAgLy8gcm9vdCBvYmpl
Y3QgbWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQsIHRoaXMgb2JqZWN0CiAgCSAgICAv
LyBjYW5ub3QgYmUgYSBsb2NhbCBvYmplY3QuIFRyZWF0IHRoaXMgYXMgYSBmb3JlaWduIG9iamVj
dAo=

--0__=cgcAktZQNa2KvTl2PERStSfdtGPZcA56RFb5GAiBYf8fGjNWp5UhZzkp--