Re: XDP CPU maps & shared umem

Yuval El-Hanany <[email protected]> Mon, 27 May 2024 07:34:30 +0000
Newsgroups org.kernel.vger.xdp-newbies
Message-ID <[email protected]>
WWVhaCwNCiAgICAgICAgYXMgZmFyIGRvd24gYXMgSSBkdWcgaW4gdGhlIGNvZGUsIGl0IHNlZW1z
IGl04oCZcyB0aGUgb25seSBvbmUgdGhhdOKAmXMgdXNlZC4gVGhlIG90aGVyIG1lbWJlcnMgYXJl
IHJlZ19zdGF0ZSAmIG5hcGlfaWQuIEnigJltIHVuZmFtaWxpYXIgd2l0aCB0aGVpciBleGFjdCBw
dXJwb3NlcywgYnV0IGRvZXNu4oCZdCBzb3VuZCBsaWtlIHRoZXnigJlyZSBuZWNlc3NhcnkgZG93
biB0aGUgbGluZS4gT25lIG90aGVyIGNvbmNlcm4gaXMgdHhxIElNTy4gSXQgaXMgbm90IGluaXRp
YWxpc2VkIHRvIGFueSB2YWx1ZSBpbiB4ZHBfYnVmZi4gV2hpbGUgaXQgbWF5IG5vdCBiZSByZWxl
dmFudCBjb25zaWRlcmluZyBpdOKAmXMgYSByZWNlaXZlZCBwYWNrZXQsIGl0IHNlZW1zIHdyb25n
IHRvIGtlZXAgYSBkYW5nbGluZyBwb2ludGVyIGJvdGggaW4gdGVybXMgb2Ygc2VjdXJpdHkgKGxl
YWtpbmcgcHJldmlvdXMgdmFsdWVzKSBhbmQgcm9idXN0bmVzcy4gTWF5YmUganVzdCBzZXQgaXQg
dG8gTlVMTD8NCg0KICAgICAgICBJ4oCZdmUgYmVlbiByYWNraW5nIG15IGJyYWluIGFzIHRvIHdo
YXQgaXMgdGhlIGFjY2VwdGVkIG1ldGhvZCB0byBwYXNzIHRoZSByZWNlaXZlIHF1ZXVlLiBQYXNz
aW5nIGl0IG9uIHRoZSBwYWNrZXQgaGVhZHJvb20gc2VlbWVkIGxpa2UgYSByZWFzb25hYmxlIHNv
bHV0aW9uLCBidXQgaXQgd291bGQgbWVhbiBtZW1vcnkgYWNjZXNzIHRvIHRoZSBwYWNrZXQgbWVt
b3J5IG9uIHBhY2tldCBhcnJpdmFsIG9uIHRoZSBzZWNvbmQgQ1BVIHdoaWNoIG1heSBiZSBoYXJt
ZnVsIHRvIHBlcmZvcm1hbmNlLiBUaGUgcXVldWUgaXRzZWxmIGlzIGp1c3QgYSBwb2ludGVyIHF1
ZXVlIHNvIGNhbuKAmXQgcGlnZ3liYWNrIG9uIGl0IHVubGVzcyB1c2luZyBhIGRpZmZlcmVudCBr
aW5kIG9mIHF1ZXVlLiBXb3VsZCBiZSBncmVhdCB0byBoZWFyIGhvdyBpdCBzaG91bGQgYmUgZG9u
ZS4NCg0KICAgICAgICBUaGFua3MsDQogICAgICAgICAgICAgICAgWXV2YWwuDQoNCj4gT24gMjcg
TWF5IDIwMjQsIGF0IDg6NDgsIE1hZ251cyBLYXJsc3NvbiA8bWFnbnVzLmthcmxzc29uQGdtYWls
LmNvbT4gd3JvdGU6DQo+DQo+IENBVVRJT046RXh0ZXJuYWwgRW1haWwsIERvIG5vdCBjbGljayBv
biBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3UgcmVjb2duaXplIHRoZSBzZW5k
ZXIgYW5kIGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZS4NCj4NCj4gT24gU3VuLCAyNiBNYXkgMjAy
NCBhdCAxNDo0OCwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0K
Pj4NCj4+IENvcnJlY3Rpb24sDQo+PiAgICAgICAgdGhlIHJ4cSBwb2ludGVyIGlzIGluaXTigJlk
IGdsb2JhbGx5IGZvciBhbGwgZnJhbWVzIGJlZm9yZSB0aGUgZnJhbWUgbG9vcHMsIGJ1dCBvbmx5
IHRoZSBkZXZpY2UgYW5kIHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXJlIHNldCBmcm9tIHRoZSBY
RFAgZnJhbWUuIFNvIHN0aWxsIGFuIGlzc3VlIHdpdGggdGhlIHF1ZXVlX2luZGV4LCBidXQgdGhl
IHRlc3RzIG9uIHRoZSBkZXZpY2UgYW5kIG1lbW9yeSBpbmZvIGluIHhza19yY3Ygc2hvdWxkIGJl
IGZpbmUuDQo+Pg0KPj4gICAgICAgIENoZWVycywNCj4+ICAgICAgICAgICAgICAgIFl1dmFsLg0K
Pg0KPiBIaSBZdXZhbCwNCj4NCj4gTm93IEkgYW0gYmFjay4gWWVzLCB0aGlzIHNlZW1zIHRvIGJl
IGEgYnVnIHNvIHRoYW5rIHlvdSBmb3Igc3BvdHRpbmcNCj4gaXQuIFRoaXMgaXMgbm90aGluZyBJ
IGhhdmUgZXZlciB0ZXN0ZWQgc2luY2UgSSB0aG91Z2h0IHlvdSB3b3VsZCBkbyBhbg0KPiBYU0tN
QVAgcmVkaXJlY3QgdG8gdGhlICJyaWdodCIgY29yZSBmaXJzdC4gQnV0IHRoZXJlIGlzIG5vdGhp
bmcNCj4gaGluZGVyaW5nIHRoYXQgc29tZW9uZSB3b3VsZCBkbyBhIENQVU1BUCByZWRpcmVjdCBm
aXJzdCB0aGVuIGFuIFhTS01BUA0KPiByZWRpcmVjdCwgc28gc2hvdWxkIGJlIHN1cHBvcnRlZC4g
U28gaW4geW91ciBhbmFseXNpcywgaXMgaXQgb25seQ0KPiBxdWV1ZV9pbmRleCB0aGF0IG5lZWRz
IHRvIGJlIHBvcHVsYXRlZCBhdCBDUFVNQVAgcmVkaXJlY3QgdGltZSBmb3INCj4gdGhpcyB0byB3
b3JrPw0KPg0KPiBUaGFua3M6IE1hZ251cw0KPg0KPj4+IE9uIDI2IE1heSAyMDI0LCBhdCAxMjow
MiwgWXV2YWwgRWwtSGFuYW55IDx5dXZhbGVAcmFkd2FyZS5jb20+IHdyb3RlOg0KPj4+DQo+Pj4g
SGksDQo+Pj4gc28gSeKAmXZlIGR1ZyBhIGJpdCBkZWVwZXIuIEl0IHNlZW1zIHRoZSByZWNlaXZl
IHF1ZXVlIGlzIG5vdCBtYWludGFpbmVkIGFjcm9zcyBDUFVzIGFuZCB0aGlzIG1heSBtYWtlIHRo
ZSB3aG9sZSBwcmFjdGljZSBvZiByZWRpcmVjdGluZyB0byBYU0sgdW5zYWZlIGlmIEkgcmVhZCB0
aGUgY29kZSBjb3JyZWN0bHkuIEl0IGFsc28gc2VlbXMgdGhpcyBwZXJzaXN0cyB0byBrZXJuZWwg
Ni42LjguIEFtIEkgbWlzc2luZyBzb21ldGhpbmc/DQo+Pj4NCj4+PiBUaGUgY29kZSBpbiBjcHVt
YXAgcnVucyBYRFAgcHJvZ3JhbXMgQlVUIGRvZXNu4oCZdCBmaWxsIHRoZSByeHEgKHNlZSBhbHNv
IHRoZSBUT0RPIGNvbW1lbnQgaW4gdGhlIGNvZGUpLiBUaGUgWERQIGZyYW1lIGlzIGNvbnZlcnRl
ZCB0byBYRFAgYnVmZmVyIGJ1dCB0aGUgcnhxIGFuZCB0eHEgYXJlIG5vdCBmaWxsZWQuIEl0IHNl
ZW1zIHRoZXkgcmVtYWluIGFzIGRhbmdsaW5nIHBvaW50ZXJzLiBXaGVuIF9feHNrX21hcF9yZWRp
cmVjdCBpcyBjYWxsZWQgYW5kIGluIHR1cm4geHNrX3JjdiB0aGUgcnhxIGlzIGNvbnN1bHRlZCBi
b3RoIHRvIGNoZWNrIGlmIHRoZSB1bWVtIGlzIHNoYXJlZCAoaW4gdGhlIG5ldyBwYXRjaCkgYXMg
d2VsbCBhcyBkZWNpZGUgd2hldGhlciB6ZXJvIGNvcHkgaXMgdXNlZCBvciBub3QuIFNpbmNlIHJ4
cSBpcyBub3QgdmFsaWQsIEnigJltIG5vdCBjZXJ0YWluIHdoYXQgdGhlIG91dGNvbWUgaXMuIE9u
Y2UgSSBieXBhc3NlZCB1bWVtIGNoZWNrLCBJIG5vIGxvbmdlciBjcmFzaCB0aGUga2VybmVsIGJ1
dCBJJ20gZGVmaW5pdGVseSBub3Qgc2VlaW5nIHRyYWZmaWMgcnVubmluZy4NCj4+Pg0KPj4+IFRo
YW5rcywNCj4+PiBZdXZhbC4NCj4+Pg0KPj4+IEhlcmUgYXJlIHRoZSBleGNlcnB0cyBmcm9tIHRo
ZSBjb2RlICg1LjE1LjExNyk6DQo+Pj4NCj4+PiBjcHVtYXAuYzoyMTIgPGNwdV9tYXBfYnBmX3By
b2dfcnVuX3hkcD4gPT09PT0gTm90ZSB0aGUgY29tbWVudCBpbiB0aGUgY29kZS4gPT09PT0NCj4+
PiAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCj4+PiAgICAgICBzdHJ1Y3QgeGRwX2ZyYW1l
ICp4ZHBmID0gZnJhbWVzW2ldOw0KPj4+ICAgICAgIHUzMiBhY3Q7DQo+Pj4gICAgICAgaW50IGVy
cjsNCj4+Pg0KPj4+IHJ4cS5kZXYgPSB4ZHBmLT5kZXZfcng7DQo+Pj4gICAgICAgcnhxLm1lbSA9
IHhkcGYtPm1lbTsNCj4+PiAgICAgICAvKiBUT0RPOiByZXBvcnQgcXVldWVfaW5kZXggdG8geGRw
X3J4cV9pbmZvICovDQo+Pj4NCj4+PiAgICAgICB4ZHBfY29udmVydF9mcmFtZV90b19idWZmKHhk
cGYsICZ4ZHApOw0KPj4+DQo+Pj4gICAgICAgYWN0ID0gYnBmX3Byb2dfcnVuX3hkcChyY3B1LT5w
cm9nLCAmeGRwKTsNCj4+Pg0KPj4+IHhkcC5oOjE3NSA9PT09PSByeHEgJiB0eHEgaW4gdGhlIHhk
cF9idWZmIGFyZSBub3QgZmlsbGVkIG9yIGV2ZW4gcmVzZXQuID09PT09DQo+Pj4gc3RhdGljIGlu
bGluZQ0KPj4+IHZvaWQgeGRwX2NvbnZlcnRfZnJhbWVfdG9fYnVmZihzdHJ1Y3QgeGRwX2ZyYW1l
ICpmcmFtZSwgc3RydWN0IHhkcF9idWZmICp4ZHApDQo+Pj4gew0KPj4+ICAgeGRwLT5kYXRhX2hh
cmRfc3RhcnQgPSBmcmFtZS0+ZGF0YSAtIGZyYW1lLT5oZWFkcm9vbSAtIHNpemVvZigqZnJhbWUp
Ow0KPj4+ICAgeGRwLT5kYXRhID0gZnJhbWUtPmRhdGE7DQo+Pj4gICB4ZHAtPmRhdGFfZW5kID0g
ZnJhbWUtPmRhdGEgKyBmcmFtZS0+bGVuOw0KPj4+ICAgeGRwLT5kYXRhX21ldGEgPSBmcmFtZS0+
ZGF0YSAtIGZyYW1lLT5tZXRhc2l6ZTsNCj4+PiAgIHhkcC0+ZnJhbWVfc3ogPSBmcmFtZS0+ZnJh
bWVfc3o7DQo+Pj4gfQ0KPj4+DQo+Pj4geHNrLmM6MjY5ID09PT09IHhza19yY3YgY29uc3VsdHMg
cnhxIGluIHhkcF9idWZmIHdoaWNoIGlzIG5vdCBmaWxsZWQhID09PT09DQo+Pj4gc3RhdGljIGlu
dCB4c2tfcmN2KHN0cnVjdCB4ZHBfc29jayAqeHMsIHN0cnVjdCB4ZHBfYnVmZiAqeGRwKQ0KPj4+
IHsNCj4+PiAgIGludCBlcnI7DQo+Pj4gICB1MzIgbGVuOw0KPj4+DQo+Pj4gICBlcnIgPSB4c2tf
cmN2X2NoZWNrKHhzLCB4ZHApOw0KPj4+ICAgaWYgKGVycikNCj4+PiAgICAgICByZXR1cm4gZXJy
Ow0KPj4+DQo+Pj4gICBpZiAoeGRwLT5yeHEtPm1lbS50eXBlID09IE1FTV9UWVBFX1hTS19CVUZG
X1BPT0wpIHsNCj4+PiBsZW4gPSB4ZHAtPmRhdGFfZW5kIC0geGRwLT5kYXRhOw0KPj4+ICAgICAg
IHJldHVybiBfX3hza19yY3ZfemMoeHMsIHhkcCwgbGVuKTsNCj4+PiAgIH0NCj4+Pg0KPj4+ICAg
ZXJyID0gX194c2tfcmN2KHhzLCB4ZHApOw0KPj4+ICAgaWYgKCFlcnIpDQo+Pj4geGRwX3JldHVy
bl9idWZmKHhkcCk7DQo+Pj4gICByZXR1cm4gZXJyOw0KPj4+IH0NCj4+Pg0KPj4+IGludCBfX3hz
a19tYXBfcmVkaXJlY3Qoc3RydWN0IHhkcF9zb2NrICp4cywgc3RydWN0IHhkcF9idWZmICp4ZHAp
DQo+Pj4gew0KPj4+ICAgc3RydWN0IGxpc3RfaGVhZCAqZmx1c2hfbGlzdCA9IHRoaXNfY3B1X3B0
cigmeHNrbWFwX2ZsdXNoX2xpc3QpOw0KPj4+ICAgaW50IGVycjsNCj4+Pg0KPj4+ICAgZXJyID0g
eHNrX3Jjdih4cywgeGRwKTsNCj4+PiAgIGlmIChlcnIpDQo+Pj4gcmV0dXJuIGVycjsNCj4+Pg0K
Pj4+ICAgaWYgKCF4cy0+Zmx1c2hfbm9kZS5wcmV2KQ0KPj4+ICAgICAgIGxpc3RfYWRkKCZ4cy0+
Zmx1c2hfbm9kZSwgZmx1c2hfbGlzdCk7DQo+Pj4NCj4+PiAgIHJldHVybiAwOw0KPj4+IH0NCj4+
Pg0KPj4+PiBPbiAyNCBNYXkgMjAyNCwgYXQgMTg6NDksIFl1dmFsIEVsLUhhbmFueSA8WXV2YWxF
QFJhZHdhcmUuY29tPiB3cm90ZToNCj4+Pj4NCj4+Pj4gQ0FVVElPTjpFeHRlcm5hbCBFbWFpbCwg
RG8gbm90IGNsaWNrIG9uIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSByZWNv
Z25pemUgdGhlIHNlbmRlciBhbmQga25vdyB0aGUgY29udGVudCBpcyBzYWZlLg0KPj4+Pg0KPj4+
PiBIaSBBbGwsDQo+Pj4+ICAgICAgSSB3b3VsZCByZWFsbHkgYXBwcmVjaWF0ZSBzb21lIGd1aWRh
bmNlIGhlcmUuIEFzIHRoaXMgaXNzdWUgc3BhbnMgYm90aCBuZXR3b3JrIFhEUCBhbmQgQ1BVIG1h
cCwgaXTigJlzIGEgYml0IG1vcmUgZGlmZmljdWx0IGZvciBtZSB0byBmb2xsb3cgaW4gdGhlIGtl
cm5lbCBjb2RlLiBJIGF0dGVtcHRlZCB0byB0cmFjZSB0aGUgaXNzdWUgaW4gdGhlIHNvdXJjZSwg
YnV0IGl04oCZcyBhIGJpdCBjb21wbGV4IHRvIGVudGVyIGV4aXN0aW5nIGNvZGUgYmFzZS4NCj4+
Pj4NCj4+Pj4gICAgICBJdCB3aWxsIGJlIGVhc2llciBpZiB5b3UgY2FuIHRlbGwgbWUgdGhlIGZv
bGxvd2luZzoNCj4+Pj4gMS4gSXMgdGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWFpbnRhaW5l
ZCBjb3JyZWN0bHkgdGhyb3VnaCB0aGUgQ1BVIHN3aXRjaCBpbiBDUFUgbWFwPyBJbiB0aGUgZGVz
Y3JpcHRpb24gb2YgQ1BVIG1hcCBpbiBYRFAgKGh0dHBzOi8vZGV2ZWxvcGVycy5yZWRoYXQuY29t
L2Jsb2cvMjAyMS8wNS8xMy9yZWNlaXZlLXNpZGUtc2NhbGluZy1yc3Mtd2l0aC1lYnBmLWFuZC1j
cHVtYXApLCBpdCBpcyBtZW50aW9uZWQgdGhhdCBzb21lIG1ldGFkYXRhIGlzIG5vdCBtYWludGFp
bmVkIGFjcm9zcyB0aGUgQ1BVIHN3aXRjaCwgYnV0IHRoYXQgd291bGQgbWFrZSB0aGUgdW1lbSB0
ZXN0IHByb2JsZW1hdGljLiBTaG91bGQgSSBhc3N1bWUgdGhlIHJlY2VpdmUgcXVldWUgaXMgbWFp
bnRhaW5lZD8NCj4+Pj4gMi4gRG9lcyBYU0sgdW1lbSB1c2VyIGNvZGUgaGF2ZSBhY2Nlc3MgdG8g
dGhlIHJlY2VpdmUgcXVldWUgbWV0YWRhdGEgbWVtb3J5PyBJdCBzZWVtcyB0byBiZSBpbiBhIGRp
ZmZlcmVudCBwb2ludGVyLCBidXQgaXQgY291bGQgYmUgdGhhdCBpdCBwb2ludHMgdG8gdGhlIHBh
Y2tldCBoZWFkcm9vbSBpbiB0aGUgdW1lbSBhY2Nlc3NpYmxlIG1lbW9yeS4NCj4+Pj4NCj4+Pj4g
ICAgICBJZiB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgbWFpbnRhaW5lZCBhY3Jvc3MgQ1BVIHN3
aXRjaCB0aGVuIEkgdGhpbmsgdGhlIHNoYXJlZCB1bWVtIHRlc3Qgc2hvdWxkIHJ1biBhbG9uZyB0
aGUgbGluZXMgb2YgdXNpbmcgc29tZSBkZWZhdWx0IHJlY2VpdmUgcXVldWUgYWZ0ZXIgc3dpdGNo
aW5nIENQVXMuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHByb2JhYmx5IGRyb3AgcGFja2V0cyB3aXRo
IGludmFsaWQgcmVjZWl2ZSBxdWV1ZXMuDQo+Pj4+DQo+Pj4+ICAgICAgVGhhbmtzLA0KPj4+PiAg
ICAgICAgICAgICAgWXV2YWwuDQo+Pj4+DQo+Pj4+PiBPbiAyMCBNYXkgMjAyNCwgYXQgMTg6MjQs
IFl1dmFsIEVsLUhhbmFueSA8WXV2YWxFQFJhZHdhcmUuY29tPiB3cm90ZToNCj4+Pj4+DQo+Pj4+
PiBIaSwNCj4+Pj4+DQo+Pj4+PiBTaG9ydCBWZXJzaW9uDQo+Pj4+PiBJ4oCZdmUgZW5jb3VudGVy
ZWQgYW4gaXNzdWUgcmVkaXJlY3RpbmcgdHJhZmZpYyB0byBhbm90aGVyIENQVSB3aGlsZSB1c2lu
ZyBzaGFyZWQgVU1FTS4gVGhlIGZyYW1lIGFycml2ZWQgYXQgdGhlIHJlZGlyZWN0ZWQgQ1BVIHdp
dGggaW52YWxpZCByZWNlaXZlIHF1ZXVlLiBUaGlzIGNhdXNlZCBhIGtlcm5lbCBjcmFzaCBvbiB0
aGUgcGF0Y2ggdGhhdCBzdXBwb3J0cyByZWRpcmVjdGluZyB0byBwYWNrZXRzIHRvIGFueSBxdWV1
ZSB3aXRoIHRoZSBzYW1lIHVtZW0gZHVlIHRvIGEgdGVzdCBiYXNlZCBvbiB0aGUgcmVjZWl2ZSBx
dWV1ZS4NCj4+Pj4+DQo+Pj4+PiBMb25nIFZlcnNpb24NCj4+Pj4+IEnigJl2ZSBjcmVhdGVkIGEg
dGVzdCBwcm9ncmFtIHRoYXQgcmVkaXJlY3RzIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNl
cyAocmVwbGFjaW5nIHRoZSBNQUMgYWRkcmVzcykuIFNlZSB0aGUgY29kZSBiZWxvdy4gSXQgc3Rh
cnRzIHR3byBzZXBhcmF0ZSBwcm9jZXNzZXMgb24gdHdvIGRpZmZlcmVudCBjb3Jlcy4gV2hlbiBk
aXJlY3RpbmcgdHJhZmZpYyBkaXJlY3RseSB0byBhbiBYU0sgc29ja2V0IGFsbCB3b3JrcyB3ZWxs
LiBJ4oCZbSBydW5uaW5nIG9uIGtlcm5lbCA1LjE1LjExNyB3aXRoIE1hZ251cyBwYXRjaCBmb3Ig
c2hhcmVkIHVtZW0uDQo+Pj4+Pg0KPj4+Pj4gVGhlIG5leHQgc3RlcCB3YXMgYW4gWERQIHByb2dy
YW0gdGhhdCByZWRpcmVjdHMgZWFjaCBwYWNrZXQgdG8gdGhlIG90aGVyIENQVSwgYW5kIHRoZSB4
ZHAgQ1BVIHByb2dyYW0gcmVkaXJlY3QgdGhlIHBhY2tldHMgdG8gYW4gWERQIHNvY2tldC4gSW5p
dGlhbGx5IHRoaXMgcmVzdWx0ZWQgaW4gYSBrZXJuZWwgY3Jhc2guIFRoZSByZWFzb24gaXMgdGhh
dCB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyBub3QgcmVjZWl2ZWQgY29ycmVjdGx5IG9uY2UgdGhlIHBh
Y2tldCBzd2l0Y2hlcyBDUFUuDQo+Pj4+Pg0KPj4+Pj4gSeKAmXZlIHBhdGNoZWQgdGhlIGtlcm5l
bCBzbyBpdCBkb2VzIHNhbml0eSBjaGVjayBhbmQgZG9lcyBub3QgY3Jhc2ggYnV0IGRlZmF1bHRz
IHRvIHF1ZXVlIDAganVzdCBmb3IgdGhlIHVtZW0gdGVzdC4NCj4+Pj4+DQo+Pj4+PiBUaGUga2Vy
bmVsIG5vIGxvbmdlciBjcmFzaGVzIGJ1dCBJIGRvbuKAmXQgZ2V0IHRoZSB0cmFmZmljIHRvIHRo
ZSBYU0sgc29ja2V0cywgYW5kIEkgbG9nIHRoZSByZWNlaXZlIHF1ZXVlcyBhbmQgdGhleSBkbyBu
b3Qgc2VlbSByYW5kb206DQo+Pj4+PiBPbiBmaXJzdCBpbnRlcmZhY2U6DQo+Pj4+PiAweEMxMzIz
RDUwDQo+Pj4+PiAweEMxMzQzRDE5DQo+Pj4+PiAweEMxMzQzRDUwDQo+Pj4+Pg0KPj4+Pj4gT24g
c2Vjb25kIGludGVyZmFjZToNCj4+Pj4+IDB4QzEzNEJENTANCj4+Pj4+IDB4QzEzNUJENTANCj4+
Pj4+DQo+Pj4+PiBWZXJ5IGZldyBiaXRzIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCBvZiB0aGUg
4oCccmVjZWl2ZSBxdWV1ZXPigJ0uIEkgY291bGRu4oCZdCByZWFsbHkgZmluZCBzb21ldGhpbmcg
aW4gbXkgcHJvZ3JhbSB3aXRoIHRob3NlIG9yIHNpbWlsYXIgdmFsdWVzLCBvciBpbiB0aGUgcGFj
a2V0cyBzbyBpdCBtYWtlcyBpdCBsZXNzIGxpa2VseSBpdCBjb21lcyBmcm9tIHNvbWV0aGluZyBJ
IGRvIGluIHVzZXJzcGFjZS4gU2VlbXMgdG8gc3VnZ2VzdCBzb21lIGZsYWdzIGZpZWxkPyBUaGUg
dmFsdWVzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1lIGFjcm9zcyByZWJvb3RzIGJ1dCBwcmV0dHkg
Y2xvc2UuDQo+Pj4+Pg0KPj4+Pj4gQW0gSSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/IEl0IHNlZW1z
IHByZXR0eSBiYXNpYy4gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgWERQIHByb2dyYW0gd2FzIGp1
c3QgYWRkZWQgZm9yIGRlYnVnZ2luZy4gVGhlIG9ubHkgb2RkaXR5IHBlcmhhcHMgaXMgdXNpbmcg
dGhlIHNoYXJlZCB1bWVtLg0KPj4+Pj4NCj4+Pj4+IFRoYW5rcywNCj4+Pj4+IFl1dmFsLg0KPj4+
Pj4NCj4+Pj4+IEnigJltIGF0dGFjaGluZyB0aGUgcHJvZ3JhbSBhbmQgdmFsdWVzIGZyb20gbXkg
ImRlYnVnIG1hcOKAnS4gSW4gdGhlIGRlYnVnIG1hcDoNCj4+Pj4+IDAuIFZhbHVlcyAwLzEgLSBX
aGljaCB0eXBlIG9mIHByb2dyYW0gcmFuICh3aXRoL3dpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uKS4N
Cj4+Pj4+IDEuIFZhbHVlcyAyWFkgLSBwYWNrZXQgcmVkaXJlY3RlZCBmcm9tIGNvcmUgWCB0byBj
b3JlIFkgKDFzdCBzdGFnZSkuDQo+Pj4+PiAyLiBWYWx1ZXMgNFhZIC0gcGFja2V0IG9uIGNvcmUg
WCByZXR1cm5zIGFjdGlvbiBZICgxc3Qgc3RhZ2UpLg0KPj4+Pj4gKFRoZXNlIHN1Z2dlc3QgdGhh
dCAxc3Qgc3RhZ2Ugd29ya2VkIGNvcnJlY3RseSkuDQo+Pj4+PiAzLiBWYWx1ZXMgMVhYWVkgLSBw
YWNrZXQgcmVjZWl2ZSBxdWV1ZSBYWCBvbiBjb3JlIFlZIChYWCA9IDEwIGlzIGludmFsaWQgcmVj
ZWl2ZSBxdWV1ZSBvdXRzaWRlIDIuLjUpLg0KPj4+Pj4gNC4gMlhYWFggLSBwYWNrZXQgcmVjZWl2
ZSBxdWV1ZSBvbiBhbnkgY29yZSAoWFhYWCAtIDQ5OTkgaW1lYW5zIHF1ZXVlIGdyZWF0ZXIgdGhh
biA1MDAwKS4NCj4+Pj4+IDUuIFJhbmRvbSBlbnRyeSAtIGEgcmVjZWl2ZSBxdWV1ZS4NCj4+Pj4+
DQo+Pj4+PiBEZWJ1ZyBtYXAgdmFsdWVzIHdpdGhvdXQgQ1BVIHJlZGlyZWN0aW9uOg0KPj4+Pj4g
Ky0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rDQo+Pj4+PiB8IFBvcnQgfCBLZXkgIHwgICAg
IFJlY2VpdmVkIHwNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4g
fCAgICAwIHwgMTAzMiB8ICAgICAgICAgIDUwNCB8DQo+Pj4+PiB8ICAgIDAgfCAxMDI0IHwgICAg
IDM3MDA1OTkyIHwNCj4+Pj4+IHwgICAgMCB8IDEwMzQgfCAgICAgMzc1NDQwNTIgfA0KPj4+Pj4g
fCAgICAwIHwgICAgMCB8ICAgICA3NDU0Njg3NSB8DQo+Pj4+PiB8ICAgIDEgfCAxMDM0IHwgICAg
IDM1NzY1OTYxIHwNCj4+Pj4+IHwgICAgMSB8ICAgIDAgfCAgICAgNzE0OTI3NzMgfA0KPj4+Pj4g
fCAgICAxIHwgMTAyNCB8ICAgICAzNTcyOTEwNyB8DQo+Pj4+PiB8ICAgIDEgfCAxMDMyIHwgICAg
ICAgICAgMjc3IHwNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4N
Cj4+Pj4+IERlYnVnIG1hcCB2YWx1ZSB3aXRoIENQVSByZWRpcmVjdGlvbiAobm8gb3RoZXIgY2hh
bmdlKToNCj4+Pj4+ICstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4gfCBQb3J0
IHwgS2V5ICB8ICAgICBSZWNlaXZlZCB8DQo+Pj4+PiArLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0t
LS0tLSsNCj4+Pj4+IHwgICAgMCB8ICAgIDEgfCAgICAgICAgIDM0MDAgfA0KPj4+Pj4gfCAgICAw
IHwgIDIyMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAgIDAgfCAgMjMyIHwgICAgICAgICAg
NDU0IHwNCj4+Pj4+IHwgICAgMCB8ICA0MjQgfCAgICAgICAgICA0NTQgfA0KPj4+Pj4gfCAgICAw
IHwgIDQzNCB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAgIDAgfCAxMTAwMiB8ICAgICAgICAg
IDQ1NCB8DQo+Pj4+PiB8ICAgIDAgfCAxMTAwMyB8ICAgICAgICAgMjk0NyB8DQo+Pj4+PiB8ICAg
IDAgfCAyMDAwMCB8ICAgICAgICAgIDEwNiB8DQo+Pj4+PiB8ICAgIDAgfCAyMDAxNiB8ICAgICAg
ICAgICAgNyB8DQo+Pj4+PiB8ICAgIDAgfCAyMDAyNCB8ICAgICAgICAgMTA1OCB8DQo+Pj4+PiB8
ICAgIDAgfCAyMDU4MiB8ICAgICAgICAgICAgMiB8DQo+Pj4+PiB8ICAgIDAgfCAyNDk5OSB8ICAg
ICAgICAgMjIzMSB8DQo+Pj4+PiB8ICAgIDAgfCAzMjQxMjk1MTg0IHwgICAgICAgICAgMzM5IHwN
Cj4+Pj4+IHwgICAgMCB8IDMyNDE0MjYyMDEgfCAgICAgICAgICAgIDMgfA0KPj4+Pj4gfCAgICAw
IHwgMzI0MTQyNjI1NiB8ICAgICAgICAgMTg5MSB8DQo+Pj4+PiB8ICAgIDEgfCAgICAxIHwgICAg
ICAgICAxMDEzIHwNCj4+Pj4+IHwgICAgMSB8ICAyMjMgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4g
fCAgICAxIHwgIDIzMiB8ICAgICAgICAgIDQwNCB8DQo+Pj4+PiB8ICAgIDEgfCAgNDI0IHwgICAg
ICAgICAgNDA0IHwNCj4+Pj4+IHwgICAgMSB8ICA0MzQgfCAgICAgICAgICA2MTAgfA0KPj4+Pj4g
fCAgICAxIHwgMTEwMDIgfCAgICAgICAgICA0MDQgfA0KPj4+Pj4gfCAgICAxIHwgMTEwMDMgfCAg
ICAgICAgICA2MTAgfA0KPj4+Pj4gfCAgICAxIHwgMjAwMDAgfCAgICAgICAgICAgMTcgfA0KPj4+
Pj4gfCAgICAxIHwgMjAwMjQgfCAgICAgICAgICAzMDkgfA0KPj4+Pj4gfCAgICAxIHwgMjQ5OTkg
fCAgICAgICAgICA2ODkgfA0KPj4+Pj4gfCAgICAxIHwgMzI0MTQ1OTAyNCB8ICAgICAgICAgIDMw
OSB8DQo+Pj4+PiB8ICAgIDEgfCAzMjQxNTI0NTYwIHwgICAgICAgICAgMzgxIHwNCj4+Pj4+ICst
LS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKw0KPj4+Pj4NCj4+Pj4+IFRoZSBYRFAgY29kZSAo
I2lmIDAgaXMgZm9yIHRoZSBubyBDUFUgcmVkaXJlY3Rpb24pOg0KPj4+Pj4gLyogU1BEWC1MaWNl
bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8NCj4+Pj4+DQo+Pj4+PiAjaW5jbHVkZSA8bGludXgv
aWZfZXRoZXIuaD4NCj4+Pj4+ICNpbmNsdWRlIDxsaW51eC9icGYuaD4NCj4+Pj4+ICNpbmNsdWRl
IDxsaW51eC9pbi5oPg0KPj4+Pj4NCj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2hlbHBlcnMuaD4N
Cj4+Pj4+ICNpbmNsdWRlIDxicGYvYnBmX2VuZGlhbi5oPg0KPj4+Pj4NCj4+Pj4+ICNpbmNsdWRl
ICJ4ZHAvcGFyc2luZ19oZWxwZXJzLmgiDQo+Pj4+Pg0KPj4+Pj4gLyogUmVkaXJlY3QgdG8gU1Ag
cXVldWVzIG1hcC4gKi8NCj4+Pj4+IHN0cnVjdA0KPj4+Pj4gew0KPj4+Pj4gIF9fdWludCAodHlw
ZSwgQlBGX01BUF9UWVBFX1hTS01BUCk7DQo+Pj4+PiAgX190eXBlIChrZXksIF9fdTMyKTsNCj4+
Pj4+ICBfX3R5cGUgKHZhbHVlLCBfX3UzMik7DQo+Pj4+PiAgX191aW50IChtYXhfZW50cmllcywg
MTI4KTsNCj4+Pj4+IH0geHNrc19tYXAgU0VDKCIubWFwcyIpOw0KPj4+Pj4NCj4+Pj4+IC8qIFJl
ZGlyZWN0IHRvIENQVXMgbWFwLiAqLw0KPj4+Pj4gc3RydWN0DQo+Pj4+PiB7DQo+Pj4+PiAgX191
aW50ICh0eXBlLCBCUEZfTUFQX1RZUEVfQ1BVTUFQKTsNCj4+Pj4+ICBfX3VpbnQgKGtleV9zaXpl
LCBzaXplb2YgKF9fdTMyKSk7DQo+Pj4+PiAgX191aW50ICh2YWx1ZV9zaXplLCBzaXplb2YgKHN0
cnVjdCBicGZfY3B1bWFwX3ZhbCkpOw0KPj4+Pj4gIF9fdWludCAobWF4X2VudHJpZXMsIDMyKTsN
Cj4+Pj4+IH0gY3B1X21hcCBTRUMoIi5tYXBzIik7DQo+Pj4+Pg0KPj4+Pj4gLyogU3RhdGlzdGlj
cyBhbmQgZGVidWcgbWFwcy4gKi8NCj4+Pj4+IHN0cnVjdA0KPj4+Pj4gew0KPj4+Pj4gIF9fdWlu
dCAodHlwZSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSk7DQo+Pj4+PiAgX190eXBlIChrZXks
IF9fdTMyKTsNCj4+Pj4+ICBfX3R5cGUgKHZhbHVlLCBfX3UzMik7DQo+Pj4+PiAgX191aW50ICht
YXhfZW50cmllcywgNjQpOw0KPj4+Pj4gfSB4ZHBfc3RhdHNfbWFwIFNFQygiLm1hcHMiKTsNCj4+
Pj4+DQo+Pj4+PiBzdHJ1Y3QNCj4+Pj4+IHsNCj4+Pj4+ICBfX3VpbnQgKHR5cGUsIEJQRl9NQVBf
VFlQRV9IQVNIKTsNCj4+Pj4+ICBfX3R5cGUgKGtleSwgX191MzIpOw0KPj4+Pj4gIF9fdHlwZSAo
dmFsdWUsIF9fdTMyKTsNCj4+Pj4+ICBfX3VpbnQgKG1heF9lbnRyaWVzLCA2NCk7DQo+Pj4+PiB9
IHhkcF9kZWJ1Z19wcm90byBTRUMoIi5tYXBzIik7DQo+Pj4+Pg0KPj4+Pj4gc3RhdGljIF9fdTMy
IG9uZXZhbCA9IDE7DQo+Pj4+Pg0KPj4+Pj4gaW50IG15X3BhcnNlX2V0aGhkciAoc3RydWN0IGhk
cl9jdXJzb3IqIG5oLCB2b2lkKiBkYXRhZW5kLCBzdHJ1Y3QgZXRoaGRyKiogZXRoKQ0KPj4+Pj4g
ew0KPj4+Pj4gIF9fdTE2IGV0aHR5cGU7DQo+Pj4+PiAgKmV0aCA9IG5oLT5wb3M7DQo+Pj4+PiAg
aWYgKCh2b2lkKikgJigqZXRoKSBbMV0gPiBkYXRhZW5kKQ0KPj4+Pj4gIHsNCj4+Pj4+ICAgcmV0
dXJuICgtMSk7DQo+Pj4+PiAgfQ0KPj4+Pj4NCj4+Pj4+ICBldGh0eXBlID0gKCpldGgpLT5oX3By
b3RvOw0KPj4+Pj4gIG5oLT5wb3MgPSAmKCpldGgpIFsxXTsNCj4+Pj4+ICBpZiAoZXRodHlwZSA9
PSBicGZfbnRvaHMgKEVUSF9QXzgwMjFRKSkNCj4+Pj4+ICB7DQo+Pj4+PiAgIHN0cnVjdCB2bGFu
X2hkciogdmxhbiA9IChzdHJ1Y3Qgdmxhbl9oZHIqKSAmKCpldGgpIFsxXTsNCj4+Pj4+IGlmICgo
dm9pZCopICZ2bGFuIFsxXSA+IGRhdGFlbmQpDQo+Pj4+PiB7DQo+Pj4+PiAgICAgICAgICByZXR1
cm4gKC0xKTsNCj4+Pj4+IH0NCj4+Pj4+ICAgICAgZXRodHlwZSA9IHZsYW4tPmhfdmxhbl9lbmNh
cHN1bGF0ZWRfcHJvdG87DQo+Pj4+PiAvKiBpbmNfZGVidWdfbWFwICgxMDAwMCsoYnBmX250b2hz
ICh2bGFuLT5oX3ZsYW5fVENJKSAmIDB4MEZGRikpOyAqLw0KPj4+Pj4gLyogaW5jX2RlYnVnX21h
cCAodmxhbi0+aF92bGFuX1RDSSk7ICovDQo+Pj4+PiBuaC0+cG9zID0gJnZsYW4gWzFdOw0KPj4+
Pj4gIH0NCj4+Pj4+DQo+Pj4+PiAgcmV0dXJuIChldGh0eXBlKTsNCj4+Pj4+IH0NCj4+Pj4+DQo+
Pj4+PiBzdGF0aWMgdm9pZCBpbmNfZGVidWdfbWFwIChfX3UzMiBrZXkpDQo+Pj4+PiB7DQo+Pj4+
PiAjaWZkZWYgV0lUSF9TVEFUUw0KPj4+Pj4gIGJwZl9tYXBfdXBkYXRlX2VsZW0gKCZ4ZHBfZGVi
dWdfcHJvdG8sDQo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgKF9fdTMyKikgJm9u
ZXZhbCwgQlBGX05PRVhJU1QpOw0KPj4+Pj4gIF9fdTMyKiByZWMgPSBicGZfbWFwX2xvb2t1cF9l
bGVtICgmeGRwX2RlYnVnX3Byb3RvLCAoX191MzIqKSAma2V5KTsNCj4+Pj4+ICBpZiAocmVjICE9
IE5VTEwpDQo+Pj4+PiAgew0KPj4+Pj4gICArKygqcmVjKTsNCj4+Pj4+ICB9DQo+Pj4+PiAjZW5k
aWYNCj4+Pj4+IH0NCj4+Pj4+DQo+Pj4+Pg0KPj4+Pj4NCj4+Pj4+IFNFQyAoInhkcCIpDQo+Pj4+
PiBpbnQgcmR3cl94c2tfcHJvZyAoc3RydWN0IHhkcF9tZCAqY3R4KQ0KPj4+Pj4gew0KPj4+Pj4g
IGVudW0geGRwX2FjdGlvbiBhY3Rpb247DQo+Pj4+PiAgaW50IGluZGV4ID0gY3R4LT5yeF9xdWV1
ZV9pbmRleDsNCj4+Pj4+ICB2b2lkKiBkYXRhZW5kID0gKHZvaWQgKikobG9uZyljdHgtPmRhdGFf
ZW5kOw0KPj4+Pj4gIHZvaWQqIGRhdGEgPSAodm9pZCAqKShsb25nKWN0eC0+ZGF0YTsNCj4+Pj4+
ICBpbnQgc3RhZ2UgPSAwOw0KPj4+Pj4NCj4+Pj4+ICBzdHJ1Y3QgaGRyX2N1cnNvciBuaDsNCj4+
Pj4+DQo+Pj4+PiAgX191MzIgKnBrdF9jb3VudDsNCj4+Pj4+ICBzdHJ1Y3QgZXRoaGRyKiBldGg7
DQo+Pj4+Pg0KPj4+Pj4gI2lmZGVmIFdJVEhfU1RBVFMNCj4+Pj4+ICBwa3RfY291bnQgPSBicGZf
bWFwX2xvb2t1cF9lbGVtKCZ4ZHBfc3RhdHNfbWFwLCAmaW5kZXgpOw0KPj4+Pj4gIGlmIChwa3Rf
Y291bnQgIT0gTlVMTCkNCj4+Pj4+ICB7DQo+Pj4+PiAgICsrKnBrdF9jb3VudDsNCj4+Pj4+ICB9
DQo+Pj4+PiAjZW5kaWYNCj4+Pj4+DQo+Pj4+PiAgLyogUGFyc2UgRXRoZXJuZXQgJiBWTEFOICov
DQo+Pj4+PiAgbmgucG9zID0gZGF0YTsNCj4+Pj4+ICBpbnQgZXRodHlwZSA9IG15X3BhcnNlX2V0
aGhkciAoJm5oLCBkYXRhZW5kLCAmZXRoKTsNCj4+Pj4+ICBpZiAoZXRodHlwZSAhPSBicGZfbnRv
aHMgKDB4MDgwMCkpDQo+Pj4+PiAgew0KPj4+Pj4gICByZXR1cm4gKFhEUF9QQVNTKTsNCj4+Pj4+
ICB9DQo+Pj4+Pg0KPj4+Pj4gIC8qIERpcmVjdCBYU0sgcmVkaXJlY3QuICovDQo+Pj4+PiAjaWYg
MA0KPj4+Pj4gIGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+ICBhY3Rpb24gPSAgYnBmX3Jl
ZGlyZWN0X21hcCAoJnhza3NfbWFwLCBpbmRleCwgWERQX1BBU1MpOw0KPj4+Pj4gIGluY19kZWJ1
Z19tYXAgKDEwMDAgKyBpbmRleCoxMCArIGFjdGlvbik7DQo+Pj4+PiAjZW5kaWYNCj4+Pj4+ICAv
KiBDUFUgbWFwIHJlZGlyZWN0LiAqLw0KPj4+Pj4gIF9fdTMyIGNwdWlkID0gYnBmX2dldF9zbXBf
cHJvY2Vzc29yX2lkICgpOw0KPj4+Pj4gIF9fdTMyIHRhcmdldGNwdSA9IGNwdWlkIF4gMHgwMTsN
Cj4+Pj4+ICArK3N0YWdlOw0KPj4+Pj4gIGluY19kZWJ1Z19tYXAgKHN0YWdlKTsNCj4+Pj4+ICBp
bmNfZGVidWdfbWFwICgyMDAgKyBjcHVpZCAqIDEwICsgdGFyZ2V0Y3B1KTsNCj4+Pj4+ICBhY3Rp
b24gPSAgYnBmX3JlZGlyZWN0X21hcCAoJmNwdV9tYXAsIHRhcmdldGNwdSwgWERQX1BBU1MpOw0K
Pj4+Pj4gIGluY19kZWJ1Z19tYXAgKDQwMCArIHRhcmdldGNwdSAqIDEwICsgYWN0aW9uKTsNCj4+
Pj4+ICByZXR1cm4gKGFjdGlvbik7DQo+Pj4+PiB9DQo+Pj4+Pg0KPj4+Pj4gU0VDICgieGRwL2Nw
dW1hcCIpDQo+Pj4+PiBpbnQgcmR3cl9jcHVfcHJvZyhzdHJ1Y3QgeGRwX21kICpjdHgpDQo+Pj4+
PiB7DQo+Pj4+PiAgX191NjQqIGRhdGFlbmQ2NCA9IChfX3U2NCopIChsb25nKSBjdHgtPmRhdGFf
ZW5kOw0KPj4+Pj4gIF9fdTY0KiBkYXRhNjQgPSAoX191NjQqKSAobG9uZykgY3R4LT5kYXRhOw0K
Pj4+Pj4gIF9fdTMyIHJ4cXVldWUgPSBjdHgtPnJ4X3F1ZXVlX2luZGV4Ow0KPj4+Pj4gIGlmIChy
eHF1ZXVlIDwgNTAwMCkNCj4+Pj4+ICB7DQo+Pj4+PiAgIGluY19kZWJ1Z19tYXAgKDIwMDAwICsg
cnhxdWV1ZSk7DQo+Pj4+PiAgfQ0KPj4+Pj4gIGVsc2UNCj4+Pj4+ICB7DQo+Pj4+PiAgIGluY19k
ZWJ1Z19tYXAgKHJ4cXVldWUpOw0KPj4+Pj4gaW5jX2RlYnVnX21hcCAoMjQ5OTkpOw0KPj4+Pj4g
IH0NCj4+Pj4+DQo+Pj4+PiAgcnhxdWV1ZSA9IChyeHF1ZXVlID49IDIgJiYgcnhxdWV1ZSA8IDYp
ID8gcnhxdWV1ZSA6IDEwOw0KPj4+Pj4gIF9fdTMyIGNwdWlkID0gYnBmX2dldF9zbXBfcHJvY2Vz
c29yX2lkICgpOw0KPj4+Pj4gIGNwdWlkID0gKGNwdWlkIDwgMTIpID8gY3B1aWQgOiAyMDsNCj4+
Pj4+ICBpbmNfZGVidWdfbWFwICgxMDAwMCArIDEwMCpyeHF1ZXVlICsgY3B1aWQpOw0KPj4+Pj4N
Cj4+Pj4+ICByZXR1cm4gYnBmX3JlZGlyZWN0X21hcCAoJnhza3NfbWFwLCBicGZfZ2V0X3NtcF9w
cm9jZXNzb3JfaWQgKCksIDApOw0KPj4+Pj4gfQ0KPj4+Pj4NCj4+Pj4NCj4+Pg0KPj4NCg0K