Understanding Transaction Deadlocks with Innodb

Understanding Transaction Deadlocks with Innodb

am 25.05.2009 20:18:34 von Michael.Caplan

Hi there,

I am trying to sort through an occasional problem I am having with
deadlocks I am facing with a series of inoodb tables:

cases (PK id)
|___ cases_workcodes (PK id, case_id / FK case_id)
|___ cases_invoices (PK id, case_id / FK case_id)
|___ cases_additional (PK id, case_id / FK case_id)
|___ cases_alloys (PK id, case_id / FK case_id)
|___ cases_enclosures (PK id, case_id / FK case_id)


The cases table has a one-to-many relationship with the noted "child"
tables, maintained by fully cascading foreign keys.

When inserting or changing data in the "cases" and related tables I have
code that does something like this:

1. Create transaction
2. REPLACE data in a single case as identified by a primary key
* The choice of using a REPLACE statement is that I want
it to INSERT or DELETE and INSERT the case data. With
the cascades on DELETE, case sub table data gets cleaned
up for me automatically.
3. Loop through each case sub types and INSERT each
4. Close transaction


My problem is that once in a while (almost daily) I get the following
error:


SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction


The interesting thing is that I never get the deadlock on the initial
REPLACE statement on the case. The deadlock is always reported on the
INSERT statements on the sub tables.

I know I have no other processes that are locking data in the sub tables
for INSERT or UPDATE beyond the scope of that single identified case
record. However, I am not sure the scope of the transaction lock.

I also know that I need to recode to catch the deadlock and try again,
however I'm not sure why this would be happening in the first place.
Part of me believes if I understood the circumstances of the deadlock, I
might be able to solve this issue (in part or in whole) at the DB level.

Any tips? I've included below data from the Innodb status output.

Thanks,

Mike



------------------------
LATEST DETECTED DEADLOCK
------------------------
090522 19:51:54
*** (1) TRANSACTION:
TRANSACTION 0 3102355, ACTIVE 0 sec, process no 10134, OS thread id 1191344448 inserting
mysql tables in use 1, locked 1
LOCK WAIT 33 lock struct(s), heap size 6752, 22 row lock(s), undo log entries 9
MySQL thread id 141330, query id 3658119 x.x.x.x ddx update
INSERT INTO
ddx800020.cases_invoices
(id, case_id, statement_date, practice_id, invoice_date, taxes, total, line_items, note, payment, payment_id)
VALUES
('263012', '310372', NULL, '221', '2009-05-22', '0.00', '183.75', 'WORKCODES', NULL, '0', NULL)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 6587 page no 54 n bits 1256 index `IDX_cases_invoices_1` of table `ddx800020`.`cases_invoices` trx id 0 3102355 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 983 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 0004bcbe; asc ;; 1: len 4; hex 000401ee; asc ;;

*** (2) TRANSACTION:
TRANSACTION 0 3102341, ACTIVE 0 sec, process no 10134, OS thread id 1192675648 inserting, thread declared inside InnoDB 1
mysql tables in use 1, locked 1
41 lock struct(s), heap size 6752, 38 row lock(s), undo log entries 18
MySQL thread id 141328, query id 3658088 x.x.x.x ddx update
INSERT INTO
ddx800020.cases_macros
(case_id, macro_id, dental_code, units, description, teeth)
VALUES
('310332', 'P', '', '1', 'PFZ - PORCELAIN FUSED TO ZIRCONIA', '26')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 6587 page no 54 n bits 1256 index `IDX_cases_invoices_1` of table `ddx800020`.`cases_invoices` trx id 0 3102341 lock mode S locks gap before rec
Record lock, heap no 983 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 0004bcbe; asc ;; 1: len 4; hex 000401ee; asc ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2056 page no 11 n bits 720 index `IDX_cases_macros_1` of table `ddx800020`.`cases_macros` trx id 0 3102341 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 436 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 0004bc6e; asc n;; 1: len 6; hex 0000000cc8cf; asc ;;

*** WE ROLL BACK TRANSACTION (1)
------------



Please consider the environment before printing this email.


E-mail messages may contain viruses, worms, or other malicious code. By reading the message and opening any attachments, the recipient accepts full responsibility for taking protective action against such code. Henry Schein is not liable for any loss or damage arising from this message.

The information in this email is confidential and may be legally privileged. It is intended solely for the addressee(s). Access to this e-mail by anyone else is unauthorized.


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/mysql?unsub=gcdmg-mysql-2@m.gmane.org

RE: Understanding Transaction Deadlocks with Innodb

am 26.05.2009 13:30:03 von Michael.Caplan

SGkgTWFydGluLAoKU29ycnkgbXkgZXhhbXBsZSB3YXNuJ3QgY2xlYXJlci4g IEkgYW0gZG9pbmcg
YSBjb21taXQgb3Igcm9sbGJhY2sKZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNz IG9mIHRoZSBvdmVy
YWxsIHRyYW5zYWN0aW9uLiAgV2hhdCBJIGRvbid0IGRvIGlzCnJldHJ5IHBh cnRzIG9mIHRoZSB0
cmFuc2FjdGlvbiB1cG9uIGRlYWRsb2NrLgoKVGhhbmtzIGZvciBwb2ludGlu ZyB0aGF0IG91dCwg
dGhvdWdoIQoKQmVzdCwKCk1pa2UKCgoKT24gTW9uLCAyMDA5LTA1LTI1IGF0 IDE2OjQ2IC0wNDAw
LCBNYXJ0aW4gR2FpbnR5IHdyb3RlOgo+IE1pa2UtCj4gCj4gTXlTUUwgc2hv dWxkIEFMV0FZUyBw
ZXJmb3JtIGEgY29tbWl0IG9yIHJvbGxiYWNrIGUuZy4KPiBleGVjKCkKPiBj b21taXQoKSBvciBy
b2xsYmFjaygpCj4gCj4gPiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGZyb20g UGFnZSA0MTkgb2Yg
dGhlCj4gPiBNeVNRTCA1LjAgQ2VydGlmaWNhdGlvbiBTdHVkeSBHdWlkZSBi dWxsZXQgcG9pbnQg
IzM6Cj4gPiBEdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHRyYW5zYWN0aW9uLCBJ bm5vREIgbWF5IGFj
cXVpcmUgcm93IGxvY2tzCj4gPiBBUyBJVCBESVNDT1ZFUlMgVEhFTSBUTyBC RSBORUNFU1NBUlku
Cj4gCj4gYW5kIHllcyBEZWFkbG9ja3MgY2FuIGJlIHZlcnkgdHJpY2t5IHRv IHJlc29sdmUKPiBN
YXJ0aW4gR2FpbnR5IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19f
X19fX18gCj4gVmVyemljaHQgdW5kIFZlcnRyYXVsaWNoa2VpdGFubWVya3Vu Zy9Ob3RlIGRlIGTD
qW5pIGV0IGRlCj4gY29uZmlkZW50aWFsaXTDqQo+ICAKPiBEaWVzZSBOYWNo cmljaHQgaXN0IHZl
cnRyYXVsaWNoLiBTb2xsdGVuIFNpZSBuaWNodCBkZXIgdm9yZ2VzZWhlbmUK PiBFbXBmYWVuZ2Vy
IHNlaW4sIHNvIGJpdHRlbiB3aXIgaG9lZmxpY2ggdW0gZWluZSBNaXR0ZWls dW5nLiBKZWRlCj4g
dW5iZWZ1Z3RlIFdlaXRlcmxlaXR1bmcgb2RlciBGZXJ0aWd1bmcgZWluZXIg S29waWUgaXN0IHVu
enVsYWVzc2lnLgo+IERpZXNlIE5hY2hyaWNodCBkaWVudCBsZWRpZ2xpY2gg ZGVtIEF1c3RhdXNj
aCB2b24gSW5mb3JtYXRpb25lbiB1bmQKPiBlbnRmYWx0ZXQga2VpbmUgcmVj aHRsaWNoZSBCaW5k
dW5nc3dpcmt1bmcuIEF1ZmdydW5kIGRlciBsZWljaHRlbgo+IE1hbmlwdWxp ZXJiYXJrZWl0IHZv
biBFLU1haWxzIGtvZW5uZW4gd2lyIGtlaW5lIEhhZnR1bmcgZnVlciBkZW4K PiBJbmhhbHQgdWVi
ZXJuZWhtZW4uCj4gCj4gQ2UgbWVzc2FnZSBlc3QgY29uZmlkZW50aWVsIGV0 IHBldXQgw6p0cmUg
cHJpdmlsw6lnacOpLiBTaSB2b3VzIG4nw6p0ZXMgcGFzIGxlIGRlc3RpbmF0 YWlyZSBwcsOpdnUs
IG5vdXMgdGUgZGVtYW5kb25zIGF2ZWMgYm9udMOpIHF1ZSBwb3VyIHNhdGlz ZmFpcmUgaW5mb3Jt
ZXogbCdleHDDqWRpdGV1ci4gTidpbXBvcnRlIHF1ZWxsZSBkaWZmdXNpb24g bm9uIGF1dG9yaXPD
qWUgb3UgbGEgY29waWUgZGUgY2VjaSBlc3QgaW50ZXJkaXRlLiBDZSBtZXNz YWdlIHNlcnQgw6Ag
bCdpbmZvcm1hdGlvbiBzZXVsZW1lbnQgZXQgbidhdXJhIHBhcyBuJ2ltcG9y dGUgcXVlbCBlZmZl
dCBsw6lnYWxlbWVudCBvYmxpZ2F0b2lyZS4gw4l0YW50IGRvbm7DqSBxdWUg bGVzIGVtYWlsIHBl
dXZlbnQgZmFjaWxlbWVudCDDqnRyZSBzdWpldHMgw6AgbGEgbWFuaXB1bGF0 aW9uLCBub3VzIG5l
IHBvdXZvbnMgYWNjZXB0ZXIgYXVjdW5lIHJlc3BvbnNhYmlsaXTDqSBwb3Vy IGxlIGNvbnRlbnUg
Zm91cm5pLgo+IAo+IAo+IAo+IAo+IAo+ID4gU3ViamVjdDogVW5kZXJzdGFu ZGluZyBUcmFuc2Fj
dGlvbiBEZWFkbG9ja3Mgd2l0aCBJbm5vZGIKPiA+IEZyb206IG1pY2hhZWwu Y2FwbGFuQGhlbnJ5
c2NoZWluLmNvbQo+ID4gVG86IG15c3FsQGxpc3RzLm15c3FsLmNvbQo+ID4g RGF0ZTogTW9uLCAy
NSBNYXkgMjAwOSAxNToxODozNCAtMDMwMAo+ID4gCj4gPiBIaSB0aGVyZSwK PiA+IAo+ID4gSSBh
bSB0cnlpbmcgdG8gc29ydCB0aHJvdWdoIGFuIG9jY2FzaW9uYWwgcHJvYmxl bSBJIGFtIGhhdmlu
ZyB3aXRoCj4gPiBkZWFkbG9ja3MgSSBhbSBmYWNpbmcgd2l0aCBhIHNlcmll cyBvZiBpbm9vZGIg
dGFibGVzOgo+ID4gCj4gPiBjYXNlcyAoUEsgaWQpCj4gPiB8X19fIGNhc2Vz X3dvcmtjb2RlcyAo
UEsgaWQsIGNhc2VfaWQgLyBGSyBjYXNlX2lkKQo+ID4gfF9fXyBjYXNlc19p bnZvaWNlcyAoUEsg
aWQsIGNhc2VfaWQgLyBGSyBjYXNlX2lkKQo+ID4gfF9fXyBjYXNlc19hZGRp dGlvbmFsIChQSyBp
ZCwgY2FzZV9pZCAvIEZLIGNhc2VfaWQpCj4gPiB8X19fIGNhc2VzX2FsbG95 cyAoUEsgaWQsIGNh
c2VfaWQgLyBGSyBjYXNlX2lkKQo+ID4gfF9fXyBjYXNlc19lbmNsb3N1cmVz IChQSyBpZCwgY2Fz
ZV9pZCAvIEZLIGNhc2VfaWQpCj4gPiAKPiA+IAo+ID4gVGhlIGNhc2VzIHRh YmxlIGhhcyBhIG9u
ZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBub3RlZAo+ICJjaGls ZCIKPiA+IHRhYmxl
cywgbWFpbnRhaW5lZCBieSBmdWxseSBjYXNjYWRpbmcgZm9yZWlnbiBrZXlz Lgo+ID4gCj4gPiBX
aGVuIGluc2VydGluZyBvciBjaGFuZ2luZyBkYXRhIGluIHRoZSAiY2FzZXMi IGFuZCByZWxhdGVk
IHRhYmxlcyBJCj4gaGF2ZQo+ID4gY29kZSB0aGF0IGRvZXMgc29tZXRoaW5n IGxpa2UgdGhpczoK
PiA+IAo+ID4gMS4gQ3JlYXRlIHRyYW5zYWN0aW9uCj4gPiAyLiBSRVBMQUNF IGRhdGEgaW4gYSBz
aW5nbGUgY2FzZSBhcyBpZGVudGlmaWVkIGJ5IGEgcHJpbWFyeSBrZXkgCj4g PiAqIFRoZSBjaG9p
Y2Ugb2YgdXNpbmcgYSBSRVBMQUNFIHN0YXRlbWVudCBpcyB0aGF0IEkgd2Fu dAo+ID4gaXQgdG8g
SU5TRVJUIG9yIERFTEVURSBhbmQgSU5TRVJUIHRoZSBjYXNlIGRhdGEuIFdp dGgKPiA+IHRoZSBj
YXNjYWRlcyBvbiBERUxFVEUsIGNhc2Ugc3ViIHRhYmxlIGRhdGEgZ2V0cyBj bGVhbmVkCj4gPiB1
cCBmb3IgbWUgYXV0b21hdGljYWxseS4KPiA+IDMuIExvb3AgdGhyb3VnaCBl YWNoIGNhc2Ugc3Vi
IHR5cGVzIGFuZCBJTlNFUlQgZWFjaAo+ID4gNC4gQ2xvc2UgdHJhbnNhY3Rp b24KPiA+IAo+ID4g
Cj4gPiBNeSBwcm9ibGVtIGlzIHRoYXQgb25jZSBpbiBhIHdoaWxlIChhbG1v c3QgZGFpbHkpIEkg
Z2V0IHRoZQo+IGZvbGxvd2luZwo+ID4gZXJyb3I6Cj4gPiAKPiA+IAo+ID4g U1FMU1RBVEVbNDAw
MDFdOiBTZXJpYWxpemF0aW9uIGZhaWx1cmU6IDEyMTMgRGVhZGxvY2sgZm91 bmQgd2hlbgo+IHRy
eWluZyB0byBnZXQgbG9jazsgdHJ5IHJlc3RhcnRpbmcgdHJhbnNhY3Rpb24K PiA+IAo+ID4gCj4g
PiBUaGUgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCBJIG5ldmVyIGdldCB0 aGUgZGVhZGxvY2sg
b24gdGhlCj4gaW5pdGlhbAo+ID4gUkVQTEFDRSBzdGF0ZW1lbnQgb24gdGhl IGNhc2UuIFRoZSBk
ZWFkbG9jayBpcyBhbHdheXMgcmVwb3J0ZWQgb24KPiB0aGUKPiA+IElOU0VS VCBzdGF0ZW1lbnRz
IG9uIHRoZSBzdWIgdGFibGVzLiAKPiA+IAo+ID4gSSBrbm93IEkgaGF2ZSBu byBvdGhlciBwcm9j
ZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBkYXRhIGluIHRoZSBzdWIKPiB0YWJs ZXMKPiA+IGZvciBJ
TlNFUlQgb3IgVVBEQVRFIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhhdCBzaW5n bGUgaWRlbnRpZmll
ZCBjYXNlCj4gPiByZWNvcmQuIEhvd2V2ZXIsIEkgYW0gbm90IHN1cmUgdGhl IHNjb3BlIG9mIHRo
ZSB0cmFuc2FjdGlvbiBsb2NrLgo+ID4gCj4gPiBJIGFsc28ga25vdyB0aGF0 IEkgbmVlZCB0byBy
ZWNvZGUgdG8gY2F0Y2ggdGhlIGRlYWRsb2NrIGFuZCB0cnkKPiBhZ2FpbiwK PiA+IGhvd2V2ZXIg
SSdtIG5vdCBzdXJlIHdoeSB0aGlzIHdvdWxkIGJlIGhhcHBlbmluZyBpbiB0 aGUgZmlyc3QgcGxh
Y2UuCj4gPiBQYXJ0IG9mIG1lIGJlbGlldmVzIGlmIEkgdW5kZXJzdG9vZCB0 aGUgY2lyY3Vtc3Rh
bmNlcyBvZiB0aGUKPiBkZWFkbG9jaywgSQo+ID4gbWlnaHQgYmUgYWJsZSB0 byBzb2x2ZSB0aGlz
IGlzc3VlIChpbiBwYXJ0IG9yIGluIHdob2xlKSBhdCB0aGUgREIKPiBsZXZl bC4KPiA+IAo+ID4g
QW55IHRpcHM/IEkndmUgaW5jbHVkZWQgYmVsb3cgZGF0YSBmcm9tIHRoZSBJ bm5vZGIgc3RhdHVz
IG91dHB1dC4KPiA+IAo+ID4gVGhhbmtzLAo+ID4gCj4gPiBNaWtlCj4gPiAK PiA+IAo+ID4gCj4g
PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+IExBVEVTVCBERVRFQ1RF RCBERUFETE9DSwo+
ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiAwOTA1MjIgMTk6NTE6 NTQKPiA+ICoqKiAo
MSkgVFJBTlNBQ1RJT046Cj4gPiBUUkFOU0FDVElPTiAwIDMxMDIzNTUsIEFD VElWRSAwIHNlYywg
cHJvY2VzcyBubyAxMDEzNCwgT1MgdGhyZWFkIGlkCj4gMTE5MTM0NDQ0OCBp bnNlcnRpbmcKPiA+
IG15c3FsIHRhYmxlcyBpbiB1c2UgMSwgbG9ja2VkIDEKPiA+IExPQ0sgV0FJ VCAzMyBsb2NrIHN0
cnVjdChzKSwgaGVhcCBzaXplIDY3NTIsIDIyIHJvdyBsb2NrKHMpLCB1bmRv Cj4gbG9nIGVudHJp
ZXMgOQo+ID4gTXlTUUwgdGhyZWFkIGlkIDE0MTMzMCwgcXVlcnkgaWQgMzY1 ODExOSB4LngueC54
IGRkeCB1cGRhdGUKPiA+IElOU0VSVCBJTlRPCj4gPiBkZHg4MDAwMjAuY2Fz ZXNfaW52b2ljZXMK
PiA+IChpZCwgY2FzZV9pZCwgc3RhdGVtZW50X2RhdGUsIHByYWN0aWNlX2lk LCBpbnZvaWNlX2Rh
dGUsIHRheGVzLAo+IHRvdGFsLCBsaW5lX2l0ZW1zLCBub3RlLCBwYXltZW50 LCBwYXltZW50X2lk
KQo+ID4gVkFMVUVTCj4gPiAoJzI2MzAxMicsICczMTAzNzInLCBOVUxMLCAn MjIxJywgJzIwMDkt
MDUtMjInLCAnMC4wMCcsICcxODMuNzUnLAo+ICdXT1JLQ09ERVMnLCBOVUxM LCAnMCcsIE5VTEwp
Cj4gPiAqKiogKDEpIFdBSVRJTkcgRk9SIFRISVMgTE9DSyBUTyBCRSBHUkFO VEVEOgo+ID4gUkVD
T1JEIExPQ0tTIHNwYWNlIGlkIDY1ODcgcGFnZSBubyA1NCBuIGJpdHMgMTI1 NiBpbmRleAo+IGBJ
RFhfY2FzZXNfaW52b2ljZXNfMWAgb2YgdGFibGUgYGRkeDgwMDAyMGAuYGNh c2VzX2ludm9pY2Vz
YCB0cnggaWQgMAo+IDMxMDIzNTUgbG9ja19tb2RlIFggbG9ja3MgZ2FwIGJl Zm9yZSByZWMgaW5z
ZXJ0IGludGVudGlvbiB3YWl0aW5nCj4gPiBSZWNvcmQgbG9jaywgaGVhcCBu byA5ODMgUEhZU0lD
QUwgUkVDT1JEOiBuX2ZpZWxkcyAyOyBjb21wYWN0Cj4gZm9ybWF0OyBpbmZv IGJpdHMgMAo+ID4g
MDogbGVuIDQ7IGhleCAwMDA0YmNiZTsgYXNjIDs7IDE6IGxlbiA0OyBoZXgg MDAwNDAxZWU7IGFz
YyA7Owo+ID4gCj4gPiAqKiogKDIpIFRSQU5TQUNUSU9OOgo+ID4gVFJBTlNB Q1RJT04gMCAzMTAy
MzQxLCBBQ1RJVkUgMCBzZWMsIHByb2Nlc3Mgbm8gMTAxMzQsIE9TIHRocmVh ZCBpZAo+IDExOTI2
NzU2NDggaW5zZXJ0aW5nLCB0aHJlYWQgZGVjbGFyZWQgaW5zaWRlIElubm9E QiAxCj4gPiBteXNx
bCB0YWJsZXMgaW4gdXNlIDEsIGxvY2tlZCAxCj4gPiA0MSBsb2NrIHN0cnVj dChzKSwgaGVhcCBz
aXplIDY3NTIsIDM4IHJvdyBsb2NrKHMpLCB1bmRvIGxvZyBlbnRyaWVzCj4g MTgKPiA+IE15U1FM
IHRocmVhZCBpZCAxNDEzMjgsIHF1ZXJ5IGlkIDM2NTgwODggeC54LngueCBk ZHggdXBkYXRlCj4g
PiBJTlNFUlQgSU5UTwo+ID4gZGR4ODAwMDIwLmNhc2VzX21hY3Jvcwo+ID4g KGNhc2VfaWQsIG1h
Y3JvX2lkLCBkZW50YWxfY29kZSwgdW5pdHMsIGRlc2NyaXB0aW9uLCB0ZWV0 aCkKPiA+IFZBTFVF
Uwo+ID4gKCczMTAzMzInLCAnUCcsICcnLCAnMScsICdQRlogLSBQT1JDRUxB SU4gRlVTRUQgVE8g
WklSQ09OSUEnLCAnMjYnKQo+ID4gKioqICgyKSBIT0xEUyBUSEUgTE9DSyhT KToKPiA+IFJFQ09S
RCBMT0NLUyBzcGFjZSBpZCA2NTg3IHBhZ2Ugbm8gNTQgbiBiaXRzIDEyNTYg aW5kZXgKPiBgSURY
X2Nhc2VzX2ludm9pY2VzXzFgIG9mIHRhYmxlIGBkZHg4MDAwMjBgLmBjYXNl c19pbnZvaWNlc2Ag
dHJ4IGlkIDAKPiAzMTAyMzQxIGxvY2sgbW9kZSBTIGxvY2tzIGdhcCBiZWZv cmUgcmVjCj4gPiBS
ZWNvcmQgbG9jaywgaGVhcCBubyA5ODMgUEhZU0lDQUwgUkVDT1JEOiBuX2Zp ZWxkcyAyOyBjb21w
YWN0Cj4gZm9ybWF0OyBpbmZvIGJpdHMgMAo+ID4gMDogbGVuIDQ7IGhleCAw MDA0YmNiZTsgYXNj
IDs7IDE6IGxlbiA0OyBoZXggMDAwNDAxZWU7IGFzYyA7Owo+ID4gCj4gPiAq KiogKDIpIFdBSVRJ
TkcgRk9SIFRISVMgTE9DSyBUTyBCRSBHUkFOVEVEOgo+ID4gUkVDT1JEIExP Q0tTIHNwYWNlIGlk
IDIwNTYgcGFnZSBubyAxMSBuIGJpdHMgNzIwIGluZGV4Cj4gYElEWF9jYXNl c19tYWNyb3NfMWAg
b2YgdGFibGUgYGRkeDgwMDAyMGAuYGNhc2VzX21hY3Jvc2AgdHJ4IGlkIDAK PiAzMTAyMzQxIGxv
Y2tfbW9kZSBYIGxvY2tzIGdhcCBiZWZvcmUgcmVjIGluc2VydCBpbnRlbnRp b24gd2FpdGluZwo+
ID4gUmVjb3JkIGxvY2ssIGhlYXAgbm8gNDM2IFBIWVNJQ0FMIFJFQ09SRDog bl9maWVsZHMgMjsg
Y29tcGFjdAo+IGZvcm1hdDsgaW5mbyBiaXRzIDAKPiA+IDA6IGxlbiA0OyBo ZXggMDAwNGJjNmU7
IGFzYyBuOzsgMTogbGVuIDY7IGhleCAwMDAwMDAwY2M4Y2Y7IGFzYyA7Owo+ ID4gCj4gPiAqKiog
V0UgUk9MTCBCQUNLIFRSQU5TQUNUSU9OICgxKQo+ID4gLS0tLS0tLS0tLS0t Cj4gPiAKPiA+IAo+
ID4gCj4gPiBQbGVhc2UgY29uc2lkZXIgdGhlIGVudmlyb25tZW50IGJlZm9y ZSBwcmludGluZyB0
aGlzIGVtYWlsLgo+ID4gCj4gPiAKPiA+IEUtbWFpbCBtZXNzYWdlcyBtYXkg Y29udGFpbiB2aXJ1
c2VzLCB3b3Jtcywgb3Igb3RoZXIgbWFsaWNpb3VzIGNvZGUuCj4gQnkgcmVh ZGluZyB0aGUgbWVz
c2FnZSBhbmQgb3BlbmluZyBhbnkgYXR0YWNobWVudHMsIHRoZSByZWNpcGll bnQKPiBhY2NlcHRz
IGZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIHRha2luZyBwcm90ZWN0aXZlIGFj dGlvbiBhZ2FpbnN0
IHN1Y2gKPiBjb2RlLiBIZW5yeSBTY2hlaW4gaXMgbm90IGxpYWJsZSBmb3Ig YW55IGxvc3Mgb3Ig
ZGFtYWdlIGFyaXNpbmcgZnJvbQo+IHRoaXMgbWVzc2FnZS4KPiA+IAo+ID4g VGhlIGluZm9ybWF0
aW9uIGluIHRoaXMgZW1haWwgaXMgY29uZmlkZW50aWFsIGFuZCBtYXkgYmUg bGVnYWxseQo+IHBy
aXZpbGVnZWQuIEl0IGlzIGludGVuZGVkIHNvbGVseSBmb3IgdGhlIGFkZHJl c3NlZShzKS4gQWNj
ZXNzIHRvIHRoaXMKPiBlLW1haWwgYnkgYW55b25lIGVsc2UgaXMgdW5hdXRo b3JpemVkLgo+ID4g
Cj4gPiAKPiA+IC0tIAo+ID4gTXlTUUwgR2VuZXJhbCBNYWlsaW5nIExpc3QK PiA+IEZvciBsaXN0
IGFyY2hpdmVzOiBodHRwOi8vbGlzdHMubXlzcWwuY29tL215c3FsCj4gPiBU byB1bnN1YnNjcmli
ZToKPiBodHRwOi8vbGlzdHMubXlzcWwuY29tL215c3FsP3Vuc3ViPW1nYWlu dHlAaG90bWFpbC5j
b20KPiA+IAo+IAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBXaW5kb3dzIExpdmXi hKI6IEtlZXAgeW91
ciBsaWZlIGluIHN5bmMuIENoZWNrIGl0IG91dC4KCgoKUGxlYXNlIGNvbnNp ZGVyIHRoZSBlbnZp
cm9ubWVudCBiZWZvcmUgcHJpbnRpbmcgdGhpcyBlbWFpbC4KCgpFLW1haWwg bWVzc2FnZXMgbWF5
IGNvbnRhaW4gdmlydXNlcywgd29ybXMsIG9yIG90aGVyIG1hbGljaW91cyBj b2RlLiBCeSByZWFk
aW5nIHRoZSBtZXNzYWdlIGFuZCBvcGVuaW5nIGFueSBhdHRhY2htZW50cywg dGhlIHJlY2lwaWVu
dCBhY2NlcHRzIGZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIHRha2luZyBwcm90 ZWN0aXZlIGFjdGlv
biBhZ2FpbnN0IHN1Y2ggY29kZS4gSGVucnkgU2NoZWluIGlzIG5vdCBsaWFi bGUgZm9yIGFueSBs
b3NzIG9yIGRhbWFnZSBhcmlzaW5nIGZyb20gdGhpcyBtZXNzYWdlLgoKVGhl IGluZm9ybWF0aW9u
IGluIHRoaXMgZW1haWwgaXMgY29uZmlkZW50aWFsIGFuZCBtYXkgYmUgbGVn YWxseSBwcml2aWxl
Z2VkLiBJdCBpcyBpbnRlbmRlZCBzb2xlbHkgZm9yIHRoZSBhZGRyZXNzZWUo cykuIEFjY2VzcyB0
byB0aGlzIGUtbWFpbCBieSBhbnlvbmUgZWxzZSBpcyB1bmF1dGhvcml6ZWQu Cg==